From f5f44ec9b7cccbad07740356f527b959adfe9df4 Mon Sep 17 00:00:00 2001 From: Adam Weston Date: Sat, 6 Apr 2024 13:06:35 -0400 Subject: [PATCH 1/2] wip --- resources/dist/filament-tiptap-editor.css | 1000 +- resources/dist/filament-tiptap-editor.js | 48927 +++++++++++++++++++- resources/js/plugin.js | 14 +- 3 files changed, 49831 insertions(+), 110 deletions(-) diff --git a/resources/dist/filament-tiptap-editor.css b/resources/dist/filament-tiptap-editor.css index 222a559..436bad3 100644 --- a/resources/dist/filament-tiptap-editor.css +++ b/resources/dist/filament-tiptap-editor.css @@ -1 +1,999 @@ -.tiptap-editor .ProseMirror .hljs{background:rgba(var(--gray-800),1);color:#d6deeb;padding:.5rem 1rem;border-radius:.5rem;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace,monospace}.tiptap-editor .ProseMirror .hljs-keyword{color:#c792ea}.tiptap-editor .ProseMirror .hljs-built_in{color:#addb67}.tiptap-editor .ProseMirror .hljs-type{color:#82aaff}.tiptap-editor .ProseMirror .hljs-literal{color:#ff5874}.tiptap-editor .ProseMirror .hljs-number{color:#f78c6c}.tiptap-editor .ProseMirror .hljs-regexp{color:#5ca7e4}.tiptap-editor .ProseMirror .hljs-string{color:#ecc48d}.tiptap-editor .ProseMirror .hljs-subst{color:#d3423e}.tiptap-editor .ProseMirror .hljs-symbol{color:#82aaff}.tiptap-editor .ProseMirror .hljs-class{color:#ffcb8b}.tiptap-editor .ProseMirror .hljs-function{color:#82aaff}.tiptap-editor .ProseMirror .hljs-title{color:#dcdcaa}.tiptap-editor .ProseMirror .hljs-params{color:#7fdbca}.tiptap-editor .ProseMirror .hljs-comment{color:#637777}.tiptap-editor .ProseMirror .hljs-doctag{color:#7fdbca}.tiptap-editor .ProseMirror .hljs-meta,.tiptap-editor .ProseMirror .hljs-meta .hljs-keyword{color:#82aaff}.tiptap-editor .ProseMirror .hljs-meta .hljs-string{color:#ecc48d}.tiptap-editor .ProseMirror .hljs-section{color:#82b1ff}.tiptap-editor .ProseMirror .hljs-attr,.tiptap-editor .ProseMirror .hljs-name,.tiptap-editor .ProseMirror .hljs-tag{color:#7fdbca}.tiptap-editor .ProseMirror .hljs-attribute{color:#80cbc4}.tiptap-editor .ProseMirror .hljs-variable{color:#addb67}.tiptap-editor .ProseMirror .hljs-bullet{color:#d9f5dd}.tiptap-editor .ProseMirror .hljs-code{color:#80cbc4}.tiptap-editor .ProseMirror .hljs-emphasis{color:#c792ea;font-style:italic}.tiptap-editor .ProseMirror .hljs-strong{color:#addb67;font-weight:700}.tiptap-editor .ProseMirror .hljs-formula{color:#c792ea}.tiptap-editor .ProseMirror .hljs-link{color:#ff869a}.tiptap-editor .ProseMirror .hljs-quote{color:#697098}.tiptap-editor .ProseMirror .hljs-selector-tag{color:#ff6363}.tiptap-editor .ProseMirror .hljs-selector-id{color:#fad430}.tiptap-editor .ProseMirror .hljs-selector-class{color:#addb67}.tiptap-editor .ProseMirror .hljs-selector-attr,.tiptap-editor .ProseMirror .hljs-selector-pseudo,.tiptap-editor .ProseMirror .hljs-template-tag{color:#c792ea}.tiptap-editor .ProseMirror .hljs-template-variable{color:#addb67}.tiptap-editor .ProseMirror .hljs-addition{color:#addb67;font-style:italic}.tiptap-editor .ProseMirror .hljs-deletion{color:#ef535090;font-style:italic}[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn,[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div,[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div .fi-fo-field-wrp{height:100%}[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div .fi-fo-field-wrp>div{height:100%;grid-template-rows:auto 1fr}[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div .fi-fo-field-wrp>div textarea{height:100%!important}.tiptap-wrapper.tiptap-fullscreen{position:fixed;top:0;left:0;bottom:0;right:0;z-index:40;display:flex;flex-direction:column;height:100%}.tiptap-wrapper.tiptap-fullscreen .tiptap-toolbar{border-radius:0}.tiptap-wrapper.tiptap-fullscreen .tiptap-prosemirror-wrapper{max-height:100%;padding-block-end:3rem}.tiptap-editor .tiptap-content{display:flex;flex-direction:column}.tiptap-prosemirror-wrapper.prosemirror-w-sm{padding:0 max(1rem,calc(50% - 12rem))}.tiptap-prosemirror-wrapper.prosemirror-w-md{padding:0 max(1rem,calc(50% - 14rem))}.tiptap-prosemirror-wrapper.prosemirror-w-lg{padding:0 max(1rem,calc(50% - 16rem))}.tiptap-prosemirror-wrapper.prosemirror-w-xl{padding:0 max(1rem,calc(50% - 18rem))}.tiptap-prosemirror-wrapper.prosemirror-w-2xl{padding:0 max(1rem,calc(50% - 21rem))}.tiptap-prosemirror-wrapper.prosemirror-w-3xl{padding:0 max(1rem,calc(50% - 24rem))}.tiptap-prosemirror-wrapper.prosemirror-w-4xl{padding:0 max(1rem,calc(50% - 28rem))}.tiptap-prosemirror-wrapper.prosemirror-w-5xl{padding:0 max(1rem,calc(50% - 32rem))}.tiptap-prosemirror-wrapper.prosemirror-w-6xl{padding:0 max(1rem,calc(50% - 36rem))}.tiptap-prosemirror-wrapper.prosemirror-w-7xl{padding:0 max(1rem,calc(50% - 40rem))}.tiptap-prosemirror-wrapper.prosemirror-w-none{padding:0 1rem}.tiptap-editor .ProseMirror{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;flex:1 1 0;padding-block:1rem;margin-inline:auto;position:relative;width:100%;color:#000}.tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode{outline-style:dashed;outline-width:2px;outline-offset:2px;outline-color:rgba(var(--gray-700),1)}:is(.dark .tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode){outline-color:rgba(var(--gray-300),1)}.tiptap-editor .ProseMirror .tiptap-block-wrapper{overflow:hidden;border-radius:.375rem;--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}:is(.dark .tiptap-editor .ProseMirror .tiptap-block-wrapper){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading{display:flex;align-items:center;justify-content:space-between;--tw-bg-opacity:1;background-color:rgba(var(--gray-200),var(--tw-bg-opacity));padding:.25rem .75rem;line-height:1;--tw-text-opacity:1;color:rgba(var(--gray-900),var(--tw-text-opacity))}:is(.dark .tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading){--tw-bg-opacity:1;background-color:rgba(var(--gray-950),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading .tiptap-block-title{font-size:.875rem;line-height:1.25rem;font-weight:700;text-transform:uppercase;opacity:.8}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions{display:flex;align-items:center;gap:.5rem}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button{opacity:.75}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:focus,.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:hover{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity));opacity:1}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .preview{padding:1rem}.tiptap-editor .ProseMirror .filament-tiptap-hurdle{width:100%;max-width:100vw;padding-block:1rem;background-color:rgba(var(--gray-800),1);position:relative}.tiptap-editor .ProseMirror .filament-tiptap-hurdle:after,.tiptap-editor .ProseMirror .filament-tiptap-hurdle:before{content:"";position:absolute;display:block;width:100%;top:0;bottom:0;background-color:inherit}.tiptap-editor .ProseMirror .filament-tiptap-hurdle:before{left:-100%}.tiptap-editor .ProseMirror .filament-tiptap-hurdle:after{right:-100%}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=gray_light]{color:rgba(var(--gray-900),1);background-color:rgba(var(--gray-300),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=gray]{color:#fff;background-color:rgba(var(--gray-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=gray_dark]{color:#fff;background-color:rgba(var(--gray-800),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=primary]{color:rgba(var(--gray-900),1);background-color:rgba(var(--primary-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=secondary]{color:rgba(var(--gray-900),1);background-color:rgba(var(--warning-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=tertiary]{color:#fff;background-color:rgba(var(--success-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=accent]{color:#fff;background-color:rgba(var(--danger-500),1)}.tiptap-editor .ProseMirror.ProseMirror-focused{outline:none}.tiptap-editor .ProseMirror>*+*{margin-block-start:1rem}.tiptap-editor .ProseMirror>*+h1,.tiptap-editor .ProseMirror>*+h2,.tiptap-editor .ProseMirror>*+h3,.tiptap-editor .ProseMirror>*+h4,.tiptap-editor .ProseMirror>*+h5,.tiptap-editor .ProseMirror>*+h6{margin-block-start:2rem}.tiptap-editor .ProseMirror img{display:inline-block}.tiptap-editor .ProseMirror h1,.tiptap-editor .ProseMirror h2,.tiptap-editor .ProseMirror h3,.tiptap-editor .ProseMirror h4,.tiptap-editor .ProseMirror h5,.tiptap-editor .ProseMirror h6{font-weight:700}.tiptap-editor .ProseMirror h1{font-size:1.75rem;line-height:1.1}.tiptap-editor .ProseMirror h2{font-size:1.5rem;line-height:1.1}.tiptap-editor .ProseMirror h3{font-size:1.25rem;line-height:1.25}.tiptap-editor .ProseMirror h4{font-size:1.125rem}.tiptap-editor .ProseMirror .lead{font-size:1.375rem;line-height:1.3}.tiptap-editor .ProseMirror small{font-size:.75rem}.tiptap-editor .ProseMirror ol>:not([hidden])~:not([hidden]),.tiptap-editor .ProseMirror ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.tiptap-editor .ProseMirror ol,.tiptap-editor .ProseMirror ul{padding-inline-start:1rem;margin-inline-start:1rem}.tiptap-editor .ProseMirror ul{list-style:disc}.tiptap-editor .ProseMirror ol{list-style:decimal}.tiptap-editor .ProseMirror ul.checked-list{list-style-type:none;margin-inline-start:0}.tiptap-editor .ProseMirror ul.checked-list li{display:flex;align-items:baseline;gap:.375em}.tiptap-editor .ProseMirror ul.checked-list li:before{content:"✓";width:1.25rem;height:1.25rem;flex-shrink:0}.tiptap-editor .ProseMirror blockquote{border-left:.25rem solid rgba(var(--gray-400),1);padding-inline-start:.5rem;margin-inline-start:1rem;font-size:1.25rem}.tiptap-editor .ProseMirror hr{border-color:rgba(var(--gray-400),1)}.tiptap-editor .ProseMirror a{color:#2563eb;text-decoration:underline}.tiptap-editor .ProseMirror a[id]{color:#000;text-decoration:none}.tiptap-editor .ProseMirror a[id]:before{content:"# ";color:rgba(var(--gray-500),1);opacity:1}.tiptap-editor .ProseMirror a[data-as-button=true]{background-color:rgba(var(--gray-900),1);color:#fff!important;text-decoration:none;display:inline-block;border-radius:.375rem;padding:.5rem 1.25rem}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=primary]{background-color:rgba(var(--primary-600),1)}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=secondary]{background-color:rgba(var(--warning-600),1)}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=tertiary]{background-color:rgba(var(--success-600),1)}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=accent]{background-color:rgba(var(--danger-600),1)}.tiptap-editor .ProseMirror sup{font-size:65%}.tiptap-editor .ProseMirror img{border:2px dashed #0000}.tiptap-editor .ProseMirror img.ProseMirror-selectednode{border-radius:.25rem;outline-offset:2px;outline:rgba(var(--gray-900),1) dashed 2px}.tiptap-editor .ProseMirror table{border-collapse:collapse;margin:0;overflow:hidden;table-layout:fixed;width:100%;position:relative}.tiptap-editor .ProseMirror table td,.tiptap-editor .ProseMirror table th{border:1px solid rgba(var(--gray-400),1);min-width:1em;padding:3px 5px;vertical-align:top;background-clip:padding-box}.tiptap-editor .ProseMirror table td>*,.tiptap-editor .ProseMirror table th>*{margin-bottom:0}.tiptap-editor .ProseMirror table th{background-color:rgba(var(--gray-200),1);color:rgba(var(--gray-700),1);font-weight:700;text-align:left}.tiptap-editor .ProseMirror table .selectedCell{position:relative}.tiptap-editor .ProseMirror table .selectedCell:after{background:#c8c8ff66;content:"";left:0;right:0;top:0;bottom:0;pointer-events:none;position:absolute;z-index:2}.tiptap-editor .ProseMirror table .column-resize-handle{background-color:#adf;bottom:-2px;position:absolute;right:-2px;pointer-events:none;top:0;width:4px}.tiptap-editor .ProseMirror table p{margin:0}.tiptap-editor .ProseMirror .tableWrapper{padding:1rem 0;overflow-x:auto}.tiptap-editor .ProseMirror .resize-cursor{cursor:col-resize}.tiptap-editor .ProseMirror pre{padding:.75rem 1rem;border-radius:.25rem;font-size:.875rem}.tiptap-editor .ProseMirror code{background-color:rgba(var(--gray-300),1);border-radius:.25rem;padding-inline:.25rem}.tiptap-editor .ProseMirror pre.hljs code{background-color:initial}.tiptap-editor .ProseMirror .filament-tiptap-grid,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder{display:grid;gap:1rem;box-sizing:border-box}.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column,.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column{box-sizing:border-box;border-style:dashed;border-width:1px;border-color:rgba(var(--gray-400),1);padding:.5rem;border-radius:.25rem}.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column>*+*,.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column>*+*,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column>*+*,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column>*+*{margin-block-start:1rem}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder.ProseMirror-selectednode,.tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode{border-radius:.25rem;outline-offset:2px;outline:rgba(var(--gray-900),1) dashed 2px}.tiptap-editor .ProseMirror .filament-tiptap-grid[type^=asymetric]{grid-template-columns:1fr;grid-template-rows:auto}@media (max-width:640px){.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=sm]{grid-template-columns:1fr!important}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=sm] .filament-tiptap-grid-builder__column{grid-column:span 1!important}}@media (max-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=md]{grid-template-columns:1fr!important}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=md] .filament-tiptap-grid-builder__column{grid-column:span 1!important}}@media (max-width:1024px){.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=lg]{grid-template-columns:1fr!important}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=lg] .filament-tiptap-grid-builder__column{grid-column:span 1!important}}@media (min-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-right-thirds]{grid-template-columns:1fr 2fr}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-left-thirds]{grid-template-columns:2fr 1fr}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-right-fourths]{grid-template-columns:1fr 3fr}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-left-fourths]{grid-template-columns:3fr 1fr}}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive]{grid-template-columns:1fr;grid-template-rows:auto}@media (min-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="2"]{grid-template-columns:repeat(2,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="3"]{grid-template-columns:repeat(3,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="4"]{grid-template-columns:repeat(2,1fr)}}@media (min-width:1024px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="4"]{grid-template-columns:repeat(4,1fr)}}@media (min-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="5"]{grid-template-columns:repeat(5,1fr)}}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="2"]{grid-template-columns:repeat(2,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="3"]{grid-template-columns:repeat(3,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="4"]{grid-template-columns:repeat(4,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="5"]{grid-template-columns:repeat(5,1fr)}.tiptap-editor .ProseMirror [data-native-video],.tiptap-editor .ProseMirror [data-vimeo-video],.tiptap-editor .ProseMirror [data-youtube-video]{border:1px dashed #0000}.tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode,.tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode,.tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode{border-radius:.25rem;outline-offset:2px;outline:rgba(var(--gray-900),1) dashed 2px}.tiptap-editor .ProseMirror [data-native-video] iframe,.tiptap-editor .ProseMirror [data-native-video] video,.tiptap-editor .ProseMirror [data-vimeo-video] iframe,.tiptap-editor .ProseMirror [data-vimeo-video] video,.tiptap-editor .ProseMirror [data-youtube-video] iframe,.tiptap-editor .ProseMirror [data-youtube-video] video{pointer-events:none}.tiptap-editor .ProseMirror div[data-type=details]{box-sizing:border-box;border-style:dashed;border-width:1px;border-color:rgba(var(--gray-400),1);border-radius:.25rem;position:relative}.tiptap-editor .ProseMirror div[data-type=details] button{position:absolute;z-index:1;top:.125rem;right:.25rem;color:rgba(var(--gray-400),1)}.tiptap-editor .ProseMirror div[data-type=details] summary{padding:.375rem .5rem;font-weight:700;border-bottom:1px solid rgba(var(--gray-200),1)}.tiptap-editor .ProseMirror div[data-type=details] summary::marker{content:"";display:none}.tiptap-editor .ProseMirror div[data-type=details] div[data-type=details-content]{padding:.5rem;height:auto}.tiptap-editor .ProseMirror div[data-type=details] div[data-type=details-content]>*+*{margin-block-start:1rem}.dark .tiptap-editor .ProseMirror{color:rgba(var(--gray-200),1)}.dark .tiptap-editor .ProseMirror blockquote{border-left-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror hr{border-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror a{color:#60a5fa}.dark .tiptap-editor .ProseMirror a[id]{color:rgba(var(--gray-200),1)}.dark .tiptap-editor .ProseMirror code{background-color:rgba(var(--gray-800),1)}.dark .tiptap-editor .ProseMirror table td,.dark .tiptap-editor .ProseMirror table th{border-color:rgba(var(--gray-600),1)}.dark .tiptap-editor .ProseMirror table th{background-color:rgba(var(--gray-800),1);color:rgba(var(--gray-100),1)}.dark .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column{border-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror img.ProseMirror-selectednode{outline-color:rgba(var(--gray-400),1)}.dark .tiptap-editor .ProseMirror div[data-type=details]{box-sizing:border-box;border-color:rgba(var(--gray-500),1);border-radius:.25rem;position:relative}.dark .tiptap-editor .ProseMirror div[data-type=details] summary{border-bottom-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror-focused .ProseMirror-gapcursor:after{border-top:1px solid #fff}.filament-tiptap-editor-source-modal textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace monospace}.tiptap-editor p.is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;height:0;pointer-events:none;--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}:is(.dark .tiptap-editor p.is-editor-empty:first-child):before{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.tippy-content-p-0{margin:-.25rem -.5rem}span[data-type=mergeTag]{margin-left:.25rem;margin-right:.25rem;border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity));padding:.25rem .5rem}:is(.dark span[data-type=mergeTag]){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))} \ No newline at end of file +/* + +Night Owl for highlight.js (c) Carl Baxter + +An adaptation of Sarah Drasner's Night Owl VS Code Theme +https://github.com/sdras/night-owl-vscode-theme + +Copyright (c) 2018 Sarah Drasner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +.tiptap-editor .ProseMirror .hljs { + background: rgba(var(--gray-800), 1); + color: #d6deeb; + padding: 0.5rem 1rem; + border-radius: 0.5rem; + font-size: 0.875rem; + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace, monospace; +} + +/* General Purpose */ + +.tiptap-editor .ProseMirror .hljs-keyword { + color: #c792ea; +} + +.tiptap-editor .ProseMirror .hljs-built_in { + color: #addb67; +} + +.tiptap-editor .ProseMirror .hljs-type { + color: #82aaff; +} + +.tiptap-editor .ProseMirror .hljs-literal { + color: #ff5874; +} + +.tiptap-editor .ProseMirror .hljs-number { + color: #F78C6C; +} + +.tiptap-editor .ProseMirror .hljs-regexp { + color: #5ca7e4; +} + +.tiptap-editor .ProseMirror .hljs-string { + color: #ecc48d; +} + +.tiptap-editor .ProseMirror .hljs-subst { + color: #d3423e; +} + +.tiptap-editor .ProseMirror .hljs-symbol { + color: #82aaff; +} + +.tiptap-editor .ProseMirror .hljs-class { + color: #ffcb8b; +} + +.tiptap-editor .ProseMirror .hljs-function { + color: #82AAFF; +} + +.tiptap-editor .ProseMirror .hljs-title { + color: #DCDCAA; +} + +.tiptap-editor .ProseMirror .hljs-params { + color: #7fdbca; +} + +/* Meta */ + +.tiptap-editor .ProseMirror .hljs-comment { + color: #637777; +} + +.tiptap-editor .ProseMirror .hljs-doctag { + color: #7fdbca; +} + +.tiptap-editor .ProseMirror .hljs-meta { + color: #82aaff; +} + +.tiptap-editor .ProseMirror .hljs-meta .hljs-keyword { + color: #82aaff; +} + +.tiptap-editor .ProseMirror .hljs-meta .hljs-string { + color: #ecc48d; +} + +/* Tags, attributes, config */ + +.tiptap-editor .ProseMirror .hljs-section { + color: #82b1ff; +} + +.tiptap-editor .ProseMirror .hljs-tag, + .tiptap-editor .ProseMirror .hljs-name { + color: #7fdbca; +} + +.tiptap-editor .ProseMirror .hljs-attr { + color: #7fdbca; +} + +.tiptap-editor .ProseMirror .hljs-attribute { + color: #80cbc4; +} + +.tiptap-editor .ProseMirror .hljs-variable { + color: #addb67; +} + +/* Markup */ + +.tiptap-editor .ProseMirror .hljs-bullet { + color: #d9f5dd; +} + +.tiptap-editor .ProseMirror .hljs-code { + color: #80CBC4; +} + +.tiptap-editor .ProseMirror .hljs-emphasis { + color: #c792ea; + font-style: italic; +} + +.tiptap-editor .ProseMirror .hljs-strong { + color: #addb67; + font-weight: bold; +} + +.tiptap-editor .ProseMirror .hljs-formula { + color: #c792ea; +} + +.tiptap-editor .ProseMirror .hljs-link { + color: #ff869a; +} + +.tiptap-editor .ProseMirror .hljs-quote { + color: #697098; +} + +/* CSS */ + +.tiptap-editor .ProseMirror .hljs-selector-tag { + color: #ff6363; +} + +.tiptap-editor .ProseMirror .hljs-selector-id { + color: #fad430; +} + +.tiptap-editor .ProseMirror .hljs-selector-class { + color: #addb67; +} + +.tiptap-editor .ProseMirror .hljs-selector-attr, + .tiptap-editor .ProseMirror .hljs-selector-pseudo { + color: #c792ea; +} + +/* Templates */ + +.tiptap-editor .ProseMirror .hljs-template-tag { + color: #c792ea; +} + +.tiptap-editor .ProseMirror .hljs-template-variable { + color: #addb67; +} + +/* diff */ + +.tiptap-editor .ProseMirror .hljs-addition { + color: #addb67ff; + font-style: italic; +} + +.tiptap-editor .ProseMirror .hljs-deletion { + color: #EF535090; + font-style: italic; +} + +[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn { + height: 100%; +} + +[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div { + height: 100%; +} + +[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div .fi-fo-field-wrp { + height: 100%; +} + +[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div .fi-fo-field-wrp > div { + height: 100%; + grid-template-rows: auto 1fr; +} + +[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div .fi-fo-field-wrp > div textarea { + height: 100% !important; +} + +.tiptap-wrapper.tiptap-fullscreen { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 40; + display: flex; + flex-direction: column; + height: 100%; +} + +.tiptap-wrapper.tiptap-fullscreen .tiptap-toolbar { + border-radius: 0; +} + +.tiptap-wrapper.tiptap-fullscreen .tiptap-prosemirror-wrapper { + max-height: 100%; + padding-block-end: 3rem; +} + +.tiptap-editor .tiptap-content { + display: flex; + flex-direction: column; +} + +.tiptap-prosemirror-wrapper.prosemirror-w-sm { + padding: 0 max(1rem, calc((100% - 24rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-md { + padding: 0 max(1rem, calc((100% - 28rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-lg { + padding: 0 max(1rem, calc((100% - 32rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-xl { + padding: 0 max(1rem, calc((100% - 36rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-2xl { + padding: 0 max(1rem, calc((100% - 42rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-3xl { + padding: 0 max(1rem, calc((100% - 48rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-4xl { + padding: 0 max(1rem, calc((100% - 56rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-5xl { + padding: 0 max(1rem, calc((100% - 64rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-6xl { + padding: 0 max(1rem, calc((100% - 72rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-7xl { + padding: 0 max(1rem, calc((100% - 80rem) / 2)); +} + +.tiptap-prosemirror-wrapper.prosemirror-w-none { + padding: 0 1rem; +} + +.tiptap-editor .ProseMirror { + border-bottom-left-radius: 0.375rem; + border-bottom-right-radius: 0.375rem; + flex: 1 1 0; + padding-block: 1rem; + margin-inline: auto; + position: relative; + width: 100%; + color: #000; +} + +.tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode { + outline-style: dashed; + outline-width: 2px; + outline-offset: 2px; + outline-color: rgba(var(--gray-700), 1); +} + +:is(.dark .tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode) { + outline-color: rgba(var(--gray-300), 1); +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper { + overflow: hidden; + border-radius: 0.375rem; + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-100), var(--tw-bg-opacity)); +} + +:is(.dark .tiptap-editor .ProseMirror .tiptap-block-wrapper) { + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-800), var(--tw-bg-opacity)); +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading { + display: flex; + align-items: center; + justify-content: space-between; + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-200), var(--tw-bg-opacity)); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.75rem; + padding-right: 0.75rem; + line-height: 1; + --tw-text-opacity: 1; + color: rgba(var(--gray-900), var(--tw-text-opacity)); +} + +:is(.dark .tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading) { + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-950), var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading .tiptap-block-title { + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + text-transform: uppercase; + opacity: 0.8; +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button { + opacity: 0.75; +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:hover { + --tw-text-opacity: 1; + color: rgba(var(--primary-500), var(--tw-text-opacity)); + opacity: 1; +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:focus { + --tw-text-opacity: 1; + color: rgba(var(--primary-500), var(--tw-text-opacity)); + opacity: 1; +} + +.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .preview { + padding: 1rem; +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle { + width: 100%; + max-width: 100vw; + padding-block: 1rem; + background-color: rgba(var(--gray-800), 1); + position: relative; +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle::before, + .tiptap-editor .ProseMirror .filament-tiptap-hurdle::after { + content: ''; + position: absolute; + display: block; + width: 100%; + top: 0; + bottom: 0; + background-color: inherit; +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle::before { + left: -100%; +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle::after { + right: -100%; +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="gray_light"] { + color: rgba(var(--gray-900), 1); + background-color: rgba(var(--gray-300), 1); +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="gray"] { + color: white; + background-color: rgba(var(--gray-500), 1); +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="gray_dark"] { + color: white; + background-color: rgba(var(--gray-800), 1); +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="primary"] { + color: rgba(var(--gray-900), 1); + background-color: rgba(var(--primary-500), 1); +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="secondary"] { + color: rgba(var(--gray-900), 1); + background-color: rgba(var(--warning-500), 1); +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="tertiary"] { + color: white; + background-color: rgba(var(--success-500), 1); +} + +.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="accent"] { + color: white; + background-color: rgba(var(--danger-500), 1); +} + +.tiptap-editor .ProseMirror.ProseMirror-focused { + outline: none; +} + +.tiptap-editor .ProseMirror > * + * { + margin-block-start: 1rem; +} + +.tiptap-editor .ProseMirror > * + h1, + .tiptap-editor .ProseMirror > * + h2, + .tiptap-editor .ProseMirror > * + h3, + .tiptap-editor .ProseMirror > * + h4, + .tiptap-editor .ProseMirror > * + h5, + .tiptap-editor .ProseMirror > * + h6 { + margin-block-start: 2rem; +} + +.tiptap-editor .ProseMirror img { + display: inline-block; +} + +.tiptap-editor .ProseMirror h1, + .tiptap-editor .ProseMirror h2, + .tiptap-editor .ProseMirror h3, + .tiptap-editor .ProseMirror h4, + .tiptap-editor .ProseMirror h5, + .tiptap-editor .ProseMirror h6 { + font-weight: bold; +} + +.tiptap-editor .ProseMirror h1 { + font-size: 1.75rem; + line-height: 1.1; +} + +.tiptap-editor .ProseMirror h2 { + font-size: 1.5rem; + line-height: 1.1; +} + +.tiptap-editor .ProseMirror h3 { + font-size: 1.25rem; + line-height: 1.25; +} + +.tiptap-editor .ProseMirror h4 { + font-size: 1.125rem; +} + +.tiptap-editor .ProseMirror .lead { + font-size: 1.375rem; + line-height: 1.3; +} + +.tiptap-editor .ProseMirror small { + font-size: 0.75rem; +} + +.tiptap-editor .ProseMirror ul > :not([hidden]) ~ :not([hidden]), + .tiptap-editor .ProseMirror ol > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.tiptap-editor .ProseMirror ul, + .tiptap-editor .ProseMirror ol { + padding-inline-start: 1rem; + margin-inline-start: 1rem; +} + +.tiptap-editor .ProseMirror ul { + list-style: disc; +} + +.tiptap-editor .ProseMirror ol { + list-style: decimal; +} + +.tiptap-editor .ProseMirror ul.checked-list { + list-style-type: none; + margin-inline-start: 0; +} + +.tiptap-editor .ProseMirror ul.checked-list li { + display: flex; + align-items: baseline; + gap: 0.375em; +} + +.tiptap-editor .ProseMirror ul.checked-list li::before { + content: '✓'; + width: 1.25rem; + height: 1.25rem; + flex-shrink: 0; +} + +.tiptap-editor .ProseMirror blockquote { + border-left: 0.25rem solid rgba(var(--gray-400), 1); + padding-inline-start: 0.5rem; + margin-inline-start: 1rem; + font-size: 1.25rem; +} + +.tiptap-editor .ProseMirror hr { + border-color: rgba(var(--gray-400), 1); +} + +.tiptap-editor .ProseMirror a { + color: #2563eb; + text-decoration: underline; +} + +.tiptap-editor .ProseMirror a[id] { + color: #000; + text-decoration: none; +} + +.tiptap-editor .ProseMirror a[id]::before { + content: '# '; + color: rgba(var(--gray-500), 1); + opacity: 50; +} + +.tiptap-editor .ProseMirror a[data-as-button="true"] { + background-color: rgba(var(--gray-900), 1); + color: white !important; + text-decoration: none; + display: inline-block; + border-radius: 0.375rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="primary"] { + background-color: rgba(var(--primary-600), 1); +} + +.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="secondary"] { + background-color: rgba(var(--warning-600), 1); +} + +.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="tertiary"] { + background-color: rgba(var(--success-600), 1); +} + +.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="accent"] { + background-color: rgba(var(--danger-600), 1); +} + +.tiptap-editor .ProseMirror sup { + font-size: 65%; +} + +.tiptap-editor .ProseMirror img { + border: dashed 2px transparent; +} + +.tiptap-editor .ProseMirror img.ProseMirror-selectednode { + border-radius: 0.25rem; + outline-offset: 2px; + outline: rgba(var(--gray-900), 1) dashed 2px; +} + +.tiptap-editor .ProseMirror table { + border-collapse: collapse; + margin: 0; + overflow: hidden; + table-layout: fixed; + width: 100%; + position: relative; +} + +.tiptap-editor .ProseMirror table td, + .tiptap-editor .ProseMirror table th { + border: 1px solid rgba(var(--gray-400), 1); + min-width: 1em; + padding: 3px 5px; + vertical-align: top; + background-clip: padding-box +} + +.tiptap-editor .ProseMirror table td > *, + .tiptap-editor .ProseMirror table th > * { + margin-bottom: 0; +} + +.tiptap-editor .ProseMirror table th { + background-color: rgba(var(--gray-200), 1); + color: rgba(var(--gray-700), 1); + font-weight: 700; + text-align: left; +} + +.tiptap-editor .ProseMirror table .selectedCell { + position: relative; +} + +.tiptap-editor .ProseMirror table .selectedCell:after { + background: rgba(200, 200, 255, 0.4); + content: ""; + left: 0; + right: 0; + top: 0; + bottom: 0; + pointer-events: none; + position: absolute; + z-index: 2; +} + +.tiptap-editor .ProseMirror table .column-resize-handle { + background-color: #adf; + bottom: -2px; + position: absolute; + right: -2px; + pointer-events: none; + top: 0; + width: 4px; +} + +.tiptap-editor .ProseMirror table p { + margin: 0; +} + +.tiptap-editor .ProseMirror .tableWrapper { + padding: 1rem 0; + overflow-x: auto; +} + +.tiptap-editor .ProseMirror .resize-cursor { + cursor: col-resize; +} + +.tiptap-editor .ProseMirror pre { + padding: .75rem 1rem; + border-radius: .25rem; + font-size: .875rem; +} + +.tiptap-editor .ProseMirror code { + background-color: rgba(var(--gray-300), 1); + border-radius: 0.25rem; + padding-inline: 0.25rem; +} + +.tiptap-editor .ProseMirror pre.hljs code { + background-color: transparent; +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid, + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder { + display: grid; + gap: 1rem; + box-sizing: border-box; +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column, + .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column, + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column, + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column { + box-sizing: border-box; + border-style: dashed; + border-width: 1px; + border-color: rgba(var(--gray-400), 1); + padding: 0.5rem; + border-radius: 0.25rem; +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column > * + *, .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column > * + *, .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column > * + *, .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column > * + * { + margin-block-start: 1rem; +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode, .tiptap-editor .ProseMirror .filament-tiptap-grid-builder.ProseMirror-selectednode { + border-radius: 0.25rem; + outline-offset: 2px; + outline: rgba(var(--gray-900), 1) dashed 2px; +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid[type^="asymetric"] { + grid-template-columns: 1fr; + grid-template-rows: auto; +} + +@media (max-width: 640px) { + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="sm"] { + grid-template-columns: 1fr !important; + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="sm"] .filament-tiptap-grid-builder__column { + grid-column: span 1 !important; + } +} + +@media (max-width: 768px) { + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="md"] { + grid-template-columns: 1fr !important; + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="md"] .filament-tiptap-grid-builder__column { + grid-column: span 1 !important; + } +} + +@media (max-width: 1024px) { + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="lg"] { + grid-template-columns: 1fr !important; + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="lg"] .filament-tiptap-grid-builder__column { + grid-column: span 1 !important; + } +} + +@media (min-width: 768px) { + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-right-thirds"] { + grid-template-columns: 1fr 2fr + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-left-thirds"] { + grid-template-columns: 2fr 1fr + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-right-fourths"] { + grid-template-columns: 1fr 3fr + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-left-fourths"] { + grid-template-columns: 3fr 1fr + } +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"] { + grid-template-columns: 1fr; + grid-template-rows: auto; +} + +@media (min-width: 768px) { + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="2"] { + grid-template-columns: repeat(2, 1fr) + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="3"] { + grid-template-columns: repeat(3, 1fr) + } + + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="4"] { + grid-template-columns: repeat(2, 1fr) + } +} + +@media (min-width: 1024px) { + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="4"] { + grid-template-columns: repeat(4, 1fr) + } +} + +@media (min-width: 768px) { + .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="5"] { + grid-template-columns: repeat(5, 1fr) + } +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="2"] { + grid-template-columns: repeat(2, 1fr); +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="3"] { + grid-template-columns: repeat(3, 1fr); +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="4"] { + grid-template-columns: repeat(4, 1fr); +} + +.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="5"] { + grid-template-columns: repeat(5, 1fr); +} + +.tiptap-editor .ProseMirror [data-youtube-video], + .tiptap-editor .ProseMirror [data-vimeo-video], + .tiptap-editor .ProseMirror [data-native-video] { + border: dashed 1px transparent; +} + +.tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode, .tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode, .tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode { + border-radius: 0.25rem; + outline-offset: 2px; + outline: rgba(var(--gray-900), 1) dashed 2px; +} + +.tiptap-editor .ProseMirror [data-youtube-video] iframe, + .tiptap-editor .ProseMirror [data-youtube-video] video, + .tiptap-editor .ProseMirror [data-vimeo-video] iframe, + .tiptap-editor .ProseMirror [data-vimeo-video] video, + .tiptap-editor .ProseMirror [data-native-video] iframe, + .tiptap-editor .ProseMirror [data-native-video] video { + pointer-events: none; +} + +.tiptap-editor .ProseMirror div[data-type="details"] { + box-sizing: border-box; + border-style: dashed; + border-width: 1px; + border-color: rgba(var(--gray-400), 1); + border-radius: 0.25rem; + position: relative; +} + +.tiptap-editor .ProseMirror div[data-type="details"] button { + position: absolute; + z-index: 1; + top: 0.125rem; + right: 0.25rem; + color: rgba(var(--gray-400), 1); +} + +.tiptap-editor .ProseMirror div[data-type="details"] summary { + padding: 0.375rem 0.5rem; + font-weight: 700; + border-bottom-style: solid; + border-bottom-width: 1px; + border-bottom-color: rgba(var(--gray-200), 1); +} + +.tiptap-editor .ProseMirror div[data-type="details"] summary::marker { + content: ""; + display: none; +} + +.tiptap-editor .ProseMirror div[data-type="details"] div[data-type="details-content"] { + padding: 0.5rem; + height: auto; +} + +.tiptap-editor .ProseMirror div[data-type="details"] div[data-type="details-content"] > * + * { + margin-block-start: 1rem; +} + +.dark .tiptap-editor .ProseMirror { + color: rgba(var(--gray-200), 1); +} + +.dark .tiptap-editor .ProseMirror blockquote { + border-left-color: rgba(var(--gray-500), 1); +} + +.dark .tiptap-editor .ProseMirror hr { + border-color: rgba(var(--gray-500), 1); +} + +.dark .tiptap-editor .ProseMirror a { + color: #60a5fa; +} + +.dark .tiptap-editor .ProseMirror a[id] { + color: rgba(var(--gray-200), 1); +} + +.dark .tiptap-editor .ProseMirror code { + background-color: rgba(var(--gray-800), 1); +} + +.dark .tiptap-editor .ProseMirror table td, + .dark .tiptap-editor .ProseMirror table th { + border-color: rgba(var(--gray-600), 1); +} + +.dark .tiptap-editor .ProseMirror table th { + background-color: rgba(var(--gray-800), 1); + color: rgba(var(--gray-100), 1); +} + +.dark .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column { + border-color: rgba(var(--gray-500), 1); +} + +.dark .tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode { + outline-color: rgba(var(--gray-400), 1); +} + +.dark .tiptap-editor .ProseMirror img.ProseMirror-selectednode { + outline-color: rgba(var(--gray-400), 1); +} + +.dark .tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode, .dark .tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode, .dark .tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode { + outline-color: rgba(var(--gray-400), 1); +} + +.dark .tiptap-editor .ProseMirror div[data-type="details"] { + box-sizing: border-box; + border-color: rgba(var(--gray-500), 1); + border-radius: 0.25rem; + position: relative; +} + +.dark .tiptap-editor .ProseMirror div[data-type="details"] summary { + border-bottom-color: rgba(var(--gray-500), 1); +} + +.dark .tiptap-editor .ProseMirror-focused .ProseMirror-gapcursor:after { + border-top: 1px solid white; +} + +.filament-tiptap-editor-source-modal textarea { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace monospace; +} + +.tiptap-editor p.is-editor-empty:first-child::before { + content: attr(data-placeholder); + float: left; + height: 0; + pointer-events: none; + --tw-text-opacity: 1; + color: rgba(var(--gray-400), var(--tw-text-opacity)); +} + +:is(.dark .tiptap-editor p.is-editor-empty:first-child)::before { + --tw-text-opacity: 1; + color: rgba(var(--gray-500), var(--tw-text-opacity)); +} + +.tippy-content-p-0 { + margin-left: -0.5rem; + margin-right: -0.5rem; + margin-top: -0.25rem; + margin-bottom: -0.25rem; +} + +span[data-type="mergeTag"] { + margin-left: 0.25rem; + margin-right: 0.25rem; + border-radius: 0.25rem; + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-100), var(--tw-bg-opacity)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +:is(.dark span[data-type="mergeTag"]) { + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-800), var(--tw-bg-opacity)); +} diff --git a/resources/dist/filament-tiptap-editor.js b/resources/dist/filament-tiptap-editor.js index 810498a..3c27913 100644 --- a/resources/dist/filament-tiptap-editor.js +++ b/resources/dist/filament-tiptap-editor.js @@ -1,128 +1,34962 @@ -var DN=Object.create;var Vd=Object.defineProperty;var PN=Object.getOwnPropertyDescriptor;var BN=Object.getOwnPropertyNames;var FN=Object.getPrototypeOf,HN=Object.prototype.hasOwnProperty;var zN=(t,e,n)=>e in t?Vd(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var Gd=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var UN=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of BN(e))!HN.call(t,i)&&i!==n&&Vd(t,i,{get:()=>e[i],enumerable:!(r=PN(e,i))||r.enumerable});return t};var qd=(t,e,n)=>(n=t!=null?DN(FN(t)):{},UN(e||!t||!t.__esModule?Vd(n,"default",{value:t,enumerable:!0}):n,t));var un=(t,e,n)=>(zN(t,typeof e!="symbol"?e+"":e,n),n);var V_=Gd((F4,K_)=>{function R_(t){return t instanceof Map?t.clear=t.delete=t.set=function(){throw new Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=function(){throw new Error("set is read-only")}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach(e=>{let n=t[e],r=typeof n;(r==="object"||r==="function")&&!Object.isFrozen(n)&&R_(n)}),t}var wu=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function I_(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function Mi(t,...e){let n=Object.create(null);for(let r in t)n[r]=t[r];return e.forEach(function(r){for(let i in r)n[i]=r[i]}),n}var gF="",M_=t=>!!t.scope,bF=(t,{prefix:e})=>{if(t.startsWith("language:"))return t.replace("language:","language-");if(t.includes(".")){let n=t.split(".");return[`${e}${n.shift()}`,...n.map((r,i)=>`${r}${"_".repeat(i+1)}`)].join(" ")}return`${e}${t}`},ym=class{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=I_(e)}openNode(e){if(!M_(e))return;let n=bF(e.scope,{prefix:this.classPrefix});this.span(n)}closeNode(e){M_(e)&&(this.buffer+=gF)}value(){return this.buffer}span(e){this.buffer+=``}},C_=(t={})=>{let e={children:[]};return Object.assign(e,t),e},Em=class t{constructor(){this.rootNode=C_(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let n=C_({scope:e});this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return typeof n=="string"?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(r=>this._walk(e,r)),e.closeNode(n)),e}static _collapse(e){typeof e!="string"&&e.children&&(e.children.every(n=>typeof n=="string")?e.children=[e.children.join("")]:e.children.forEach(n=>{t._collapse(n)}))}},vm=class extends Em{constructor(e){super(),this.options=e}addText(e){e!==""&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,n){let r=e.root;n&&(r.scope=`language:${n}`),this.add(r)}toHTML(){return new ym(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function Ea(t){return t?typeof t=="string"?t:t.source:null}function L_(t){return Eo("(?=",t,")")}function yF(t){return Eo("(?:",t,")*")}function EF(t){return Eo("(?:",t,")?")}function Eo(...t){return t.map(n=>Ea(n)).join("")}function vF(t){let e=t[t.length-1];return typeof e=="object"&&e.constructor===Object?(t.splice(t.length-1,1),e):{}}function xm(...t){return"("+(vF(t).capture?"":"?:")+t.map(r=>Ea(r)).join("|")+")"}function D_(t){return new RegExp(t.toString()+"|").exec("").length-1}function wF(t,e){let n=t&&t.exec(e);return n&&n.index===0}var xF=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function _m(t,{joinWith:e}){let n=0;return t.map(r=>{n+=1;let i=n,o=Ea(r),s="";for(;o.length>0;){let l=xF.exec(o);if(!l){s+=o;break}s+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),l[0][0]==="\\"&&l[1]?s+="\\"+String(Number(l[1])+i):(s+=l[0],l[0]==="("&&n++)}return s}).map(r=>`(${r})`).join(e)}var _F=/\b\B/,P_="[a-zA-Z]\\w*",Sm="[a-zA-Z_]\\w*",B_="\\b\\d+(\\.\\d+)?",F_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",H_="\\b(0b[01]+)",SF="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",TF=(t={})=>{let e=/^#![ ]*\//;return t.binary&&(t.begin=Eo(e,/.*\b/,t.binary,/\b.*/)),Mi({scope:"meta",begin:e,end:/$/,relevance:0,"on:begin":(n,r)=>{n.index!==0&&r.ignoreMatch()}},t)},va={begin:"\\\\[\\s\\S]",relevance:0},MF={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[va]},CF={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[va]},kF={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},_u=function(t,e,n={}){let r=Mi({scope:"comment",begin:t,end:e,contains:[]},n);r.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=xm("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:Eo(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),r},AF=_u("//","$"),NF=_u("/\\*","\\*/"),OF=_u("#","$"),RF={scope:"number",begin:B_,relevance:0},IF={scope:"number",begin:F_,relevance:0},LF={scope:"number",begin:H_,relevance:0},DF={begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[va,{begin:/\[/,end:/\]/,relevance:0,contains:[va]}]}]},PF={scope:"title",begin:P_,relevance:0},BF={scope:"title",begin:Sm,relevance:0},FF={begin:"\\.\\s*"+Sm,relevance:0},HF=function(t){return Object.assign(t,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})},vu=Object.freeze({__proto__:null,MATCH_NOTHING_RE:_F,IDENT_RE:P_,UNDERSCORE_IDENT_RE:Sm,NUMBER_RE:B_,C_NUMBER_RE:F_,BINARY_NUMBER_RE:H_,RE_STARTERS_RE:SF,SHEBANG:TF,BACKSLASH_ESCAPE:va,APOS_STRING_MODE:MF,QUOTE_STRING_MODE:CF,PHRASAL_WORDS_MODE:kF,COMMENT:_u,C_LINE_COMMENT_MODE:AF,C_BLOCK_COMMENT_MODE:NF,HASH_COMMENT_MODE:OF,NUMBER_MODE:RF,C_NUMBER_MODE:IF,BINARY_NUMBER_MODE:LF,REGEXP_MODE:DF,TITLE_MODE:PF,UNDERSCORE_TITLE_MODE:BF,METHOD_GUARD:FF,END_SAME_AS_BEGIN:HF});function zF(t,e){t.input[t.index-1]==="."&&e.ignoreMatch()}function UF(t,e){t.className!==void 0&&(t.scope=t.className,delete t.className)}function $F(t,e){e&&t.beginKeywords&&(t.begin="\\b("+t.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",t.__beforeBegin=zF,t.keywords=t.keywords||t.beginKeywords,delete t.beginKeywords,t.relevance===void 0&&(t.relevance=0))}function WF(t,e){Array.isArray(t.illegal)&&(t.illegal=xm(...t.illegal))}function KF(t,e){if(t.match){if(t.begin||t.end)throw new Error("begin & end are not supported with match");t.begin=t.match,delete t.match}}function VF(t,e){t.relevance===void 0&&(t.relevance=1)}var GF=(t,e)=>{if(!t.beforeMatch)return;if(t.starts)throw new Error("beforeMatch cannot be used with starts");let n=Object.assign({},t);Object.keys(t).forEach(r=>{delete t[r]}),t.keywords=n.keywords,t.begin=Eo(n.beforeMatch,L_(n.begin)),t.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},t.relevance=0,delete n.beforeMatch},qF=["of","and","for","in","not","or","if","then","parent","list","value"],YF="keyword";function z_(t,e,n=YF){let r=Object.create(null);return typeof t=="string"?i(n,t.split(" ")):Array.isArray(t)?i(n,t):Object.keys(t).forEach(function(o){Object.assign(r,z_(t[o],e,o))}),r;function i(o,s){e&&(s=s.map(l=>l.toLowerCase())),s.forEach(function(l){let u=l.split("|");r[u[0]]=[o,JF(u[0],u[1])]})}}function JF(t,e){return e?Number(e):XF(t)?0:1}function XF(t){return qF.includes(t.toLowerCase())}var k_={},yo=t=>{console.error(t)},A_=(t,...e)=>{console.log(`WARN: ${t}`,...e)},us=(t,e)=>{k_[`${t}/${e}`]||(console.log(`Deprecated as of ${t}. ${e}`),k_[`${t}/${e}`]=!0)},xu=new Error;function U_(t,e,{key:n}){let r=0,i=t[n],o={},s={};for(let l=1;l<=e.length;l++)s[l+r]=i[l],o[l+r]=!0,r+=D_(e[l-1]);t[n]=s,t[n]._emit=o,t[n]._multi=!0}function ZF(t){if(Array.isArray(t.begin)){if(t.skip||t.excludeBegin||t.returnBegin)throw yo("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),xu;if(typeof t.beginScope!="object"||t.beginScope===null)throw yo("beginScope must be object"),xu;U_(t,t.begin,{key:"beginScope"}),t.begin=_m(t.begin,{joinWith:""})}}function jF(t){if(Array.isArray(t.end)){if(t.skip||t.excludeEnd||t.returnEnd)throw yo("skip, excludeEnd, returnEnd not compatible with endScope: {}"),xu;if(typeof t.endScope!="object"||t.endScope===null)throw yo("endScope must be object"),xu;U_(t,t.end,{key:"endScope"}),t.end=_m(t.end,{joinWith:""})}}function QF(t){t.scope&&typeof t.scope=="object"&&t.scope!==null&&(t.beginScope=t.scope,delete t.scope)}function eH(t){QF(t),typeof t.beginScope=="string"&&(t.beginScope={_wrap:t.beginScope}),typeof t.endScope=="string"&&(t.endScope={_wrap:t.endScope}),ZF(t),jF(t)}function tH(t){function e(s,l){return new RegExp(Ea(s),"m"+(t.case_insensitive?"i":"")+(t.unicodeRegex?"u":"")+(l?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(l,u){u.position=this.position++,this.matchIndexes[this.matchAt]=u,this.regexes.push([u,l]),this.matchAt+=D_(l)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let l=this.regexes.map(u=>u[1]);this.matcherRe=e(_m(l,{joinWith:"|"}),!0),this.lastIndex=0}exec(l){this.matcherRe.lastIndex=this.lastIndex;let u=this.matcherRe.exec(l);if(!u)return null;let d=u.findIndex((h,m)=>m>0&&h!==void 0),f=this.matchIndexes[d];return u.splice(0,d),Object.assign(u,f)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(l){if(this.multiRegexes[l])return this.multiRegexes[l];let u=new n;return this.rules.slice(l).forEach(([d,f])=>u.addRule(d,f)),u.compile(),this.multiRegexes[l]=u,u}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(l,u){this.rules.push([l,u]),u.type==="begin"&&this.count++}exec(l){let u=this.getMatcher(this.regexIndex);u.lastIndex=this.lastIndex;let d=u.exec(l);if(this.resumingScanAtSamePosition()&&!(d&&d.index===this.lastIndex)){let f=this.getMatcher(0);f.lastIndex=this.lastIndex+1,d=f.exec(l)}return d&&(this.regexIndex+=d.position+1,this.regexIndex===this.count&&this.considerAll()),d}}function i(s){let l=new r;return s.contains.forEach(u=>l.addRule(u.begin,{rule:u,type:"begin"})),s.terminatorEnd&&l.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&l.addRule(s.illegal,{type:"illegal"}),l}function o(s,l){let u=s;if(s.isCompiled)return u;[UF,KF,eH,GF].forEach(f=>f(s,l)),t.compilerExtensions.forEach(f=>f(s,l)),s.__beforeBegin=null,[$F,WF,VF].forEach(f=>f(s,l)),s.isCompiled=!0;let d=null;return typeof s.keywords=="object"&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords),d=s.keywords.$pattern,delete s.keywords.$pattern),d=d||/\w+/,s.keywords&&(s.keywords=z_(s.keywords,t.case_insensitive)),u.keywordPatternRe=e(d,!0),l&&(s.begin||(s.begin=/\B|\b/),u.beginRe=e(u.begin),!s.end&&!s.endsWithParent&&(s.end=/\B|\b/),s.end&&(u.endRe=e(u.end)),u.terminatorEnd=Ea(u.end)||"",s.endsWithParent&&l.terminatorEnd&&(u.terminatorEnd+=(s.end?"|":"")+l.terminatorEnd)),s.illegal&&(u.illegalRe=e(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map(function(f){return nH(f==="self"?s:f)})),s.contains.forEach(function(f){o(f,u)}),s.starts&&o(s.starts,l),u.matcher=i(u),u}if(t.compilerExtensions||(t.compilerExtensions=[]),t.contains&&t.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return t.classNameAliases=Mi(t.classNameAliases||{}),o(t)}function $_(t){return t?t.endsWithParent||$_(t.starts):!1}function nH(t){return t.variants&&!t.cachedVariants&&(t.cachedVariants=t.variants.map(function(e){return Mi(t,{variants:null},e)})),t.cachedVariants?t.cachedVariants:$_(t)?Mi(t,{starts:t.starts?Mi(t.starts):null}):Object.isFrozen(t)?Mi(t):t}var rH="11.8.0",wm=class extends Error{constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}},bm=I_,N_=Mi,O_=Symbol("nomatch"),iH=7,W_=function(t){let e=Object.create(null),n=Object.create(null),r=[],i=!0,o="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:vm};function u(N){return l.noHighlightRe.test(N)}function d(N){let R=N.className+" ";R+=N.parentNode?N.parentNode.className:"";let K=l.languageDetectRe.exec(R);if(K){let te=W(K[1]);return te||(A_(o.replace("{}",K[1])),A_("Falling back to no-highlight mode for this block.",N)),te?K[1]:"no-highlight"}return R.split(/\s+/).find(te=>u(te)||W(te))}function f(N,R,K){let te="",pe="";typeof R=="object"?(te=N,K=R.ignoreIllegals,pe=R.language):(us("10.7.0","highlight(lang, code, ...args) has been deprecated."),us("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),pe=N,te=R),K===void 0&&(K=!0);let Ce={code:te,language:pe};xe("before:highlight",Ce);let Ue=Ce.result?Ce.result:h(Ce.language,Ce.code,K);return Ue.code=Ce.code,xe("after:highlight",Ue),Ue}function h(N,R,K,te){let pe=Object.create(null);function Ce(H,Y){return H.keywords[Y]}function Ue(){if(!ee.keywords){We.addText(Oe);return}let H=0;ee.keywordPatternRe.lastIndex=0;let Y=ee.keywordPatternRe.exec(Oe),le="";for(;Y;){le+=Oe.substring(H,Y.index);let Me=ft.case_insensitive?Y[0].toLowerCase():Y[0],ct=Ce(ee,Me);if(ct){let[Vt,ki]=ct;if(We.addText(le),le="",pe[Me]=(pe[Me]||0)+1,pe[Me]<=iH&&(mt+=ki),Vt.startsWith("_"))le+=Y[0];else{let B=ft.classNameAliases[Vt]||Vt;Xe(Y[0],B)}}else le+=Y[0];H=ee.keywordPatternRe.lastIndex,Y=ee.keywordPatternRe.exec(Oe)}le+=Oe.substring(H),We.addText(le)}function $e(){if(Oe==="")return;let H=null;if(typeof ee.subLanguage=="string"){if(!e[ee.subLanguage]){We.addText(Oe);return}H=h(ee.subLanguage,Oe,!0,ke[ee.subLanguage]),ke[ee.subLanguage]=H._top}else H=b(Oe,ee.subLanguage.length?ee.subLanguage:null);ee.relevance>0&&(mt+=H.relevance),We.__addSublanguage(H._emitter,H.language)}function He(){ee.subLanguage!=null?$e():Ue(),Oe=""}function Xe(H,Y){H!==""&&(We.startScope(Y),We.addText(H),We.endScope())}function xt(H,Y){let le=1,Me=Y.length-1;for(;le<=Me;){if(!H._emit[le]){le++;continue}let ct=ft.classNameAliases[H[le]]||H[le],Vt=Y[le];ct?Xe(Vt,ct):(Oe=Vt,Ue(),Oe=""),le++}}function Pt(H,Y){return H.scope&&typeof H.scope=="string"&&We.openNode(ft.classNameAliases[H.scope]||H.scope),H.beginScope&&(H.beginScope._wrap?(Xe(Oe,ft.classNameAliases[H.beginScope._wrap]||H.beginScope._wrap),Oe=""):H.beginScope._multi&&(xt(H.beginScope,Y),Oe="")),ee=Object.create(H,{parent:{value:ee}}),ee}function Le(H,Y,le){let Me=wF(H.endRe,le);if(Me){if(H["on:end"]){let ct=new wu(H);H["on:end"](Y,ct),ct.isMatchIgnored&&(Me=!1)}if(Me){for(;H.endsParent&&H.parent;)H=H.parent;return H}}if(H.endsWithParent)return Le(H.parent,Y,le)}function _t(H){return ee.matcher.regexIndex===0?(Oe+=H[0],1):(re=!0,0)}function Xt(H){let Y=H[0],le=H.rule,Me=new wu(le),ct=[le.__beforeBegin,le["on:begin"]];for(let Vt of ct)if(Vt&&(Vt(H,Me),Me.isMatchIgnored))return _t(Y);return le.skip?Oe+=Y:(le.excludeBegin&&(Oe+=Y),He(),!le.returnBegin&&!le.excludeBegin&&(Oe=Y)),Pt(le,H),le.returnBegin?0:Y.length}function st(H){let Y=H[0],le=R.substring(H.index),Me=Le(ee,H,le);if(!Me)return O_;let ct=ee;ee.endScope&&ee.endScope._wrap?(He(),Xe(Y,ee.endScope._wrap)):ee.endScope&&ee.endScope._multi?(He(),xt(ee.endScope,H)):ct.skip?Oe+=Y:(ct.returnEnd||ct.excludeEnd||(Oe+=Y),He(),ct.excludeEnd&&(Oe=Y));do ee.scope&&We.closeNode(),!ee.skip&&!ee.subLanguage&&(mt+=ee.relevance),ee=ee.parent;while(ee!==Me.parent);return Me.starts&&Pt(Me.starts,H),ct.returnEnd?0:Y.length}function Zt(){let H=[];for(let Y=ee;Y!==ft;Y=Y.parent)Y.scope&&H.unshift(Y.scope);H.forEach(Y=>We.openNode(Y))}let St={};function Nt(H,Y){let le=Y&&Y[0];if(Oe+=H,le==null)return He(),0;if(St.type==="begin"&&Y.type==="end"&&St.index===Y.index&&le===""){if(Oe+=R.slice(Y.index,Y.index+1),!i){let Me=new Error(`0 width match regex (${N})`);throw Me.languageName=N,Me.badRule=St.rule,Me}return 1}if(St=Y,Y.type==="begin")return Xt(Y);if(Y.type==="illegal"&&!K){let Me=new Error('Illegal lexeme "'+le+'" for mode "'+(ee.scope||"")+'"');throw Me.mode=ee,Me}else if(Y.type==="end"){let Me=st(Y);if(Me!==O_)return Me}if(Y.type==="illegal"&&le==="")return 1;if(X>1e5&&X>Y.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Oe+=le,le.length}let ft=W(N);if(!ft)throw yo(o.replace("{}",N)),new Error('Unknown language: "'+N+'"');let me=tH(ft),Kt="",ee=te||me,ke={},We=new l.__emitter(l);Zt();let Oe="",mt=0,Ot=0,X=0,re=!1;try{if(ft.__emitTokens)ft.__emitTokens(R,We);else{for(ee.matcher.considerAll();;){X++,re?re=!1:ee.matcher.considerAll(),ee.matcher.lastIndex=Ot;let H=ee.matcher.exec(R);if(!H)break;let Y=R.substring(Ot,H.index),le=Nt(Y,H);Ot=H.index+le}Nt(R.substring(Ot))}return We.finalize(),Kt=We.toHTML(),{language:N,value:Kt,relevance:mt,illegal:!1,_emitter:We,_top:ee}}catch(H){if(H.message&&H.message.includes("Illegal"))return{language:N,value:bm(R),illegal:!0,relevance:0,_illegalBy:{message:H.message,index:Ot,context:R.slice(Ot-100,Ot+100),mode:H.mode,resultSoFar:Kt},_emitter:We};if(i)return{language:N,value:bm(R),illegal:!1,relevance:0,errorRaised:H,_emitter:We,_top:ee};throw H}}function m(N){let R={value:bm(N),illegal:!1,relevance:0,_top:s,_emitter:new l.__emitter(l)};return R._emitter.addText(N),R}function b(N,R){R=R||l.languages||Object.keys(e);let K=m(N),te=R.filter(W).filter(ye).map(He=>h(He,N,!1));te.unshift(K);let pe=te.sort((He,Xe)=>{if(He.relevance!==Xe.relevance)return Xe.relevance-He.relevance;if(He.language&&Xe.language){if(W(He.language).supersetOf===Xe.language)return 1;if(W(Xe.language).supersetOf===He.language)return-1}return 0}),[Ce,Ue]=pe,$e=Ce;return $e.secondBest=Ue,$e}function y(N,R,K){let te=R&&n[R]||K;N.classList.add("hljs"),N.classList.add(`language-${te}`)}function v(N){let R=null,K=d(N);if(u(K))return;if(xe("before:highlightElement",{el:N,language:K}),N.children.length>0&&(l.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(N)),l.throwUnescapedHTML))throw new wm("One of your code blocks includes unescaped HTML.",N.innerHTML);R=N;let te=R.textContent,pe=K?f(te,{language:K,ignoreIllegals:!0}):b(te);N.innerHTML=pe.value,y(N,K,pe.language),N.result={language:pe.language,re:pe.relevance,relevance:pe.relevance},pe.secondBest&&(N.secondBest={language:pe.secondBest.language,relevance:pe.secondBest.relevance}),xe("after:highlightElement",{el:N,result:pe,text:te})}function x(N){l=N_(l,N)}let M=()=>{S(),us("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function D(){S(),us("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let L=!1;function S(){if(document.readyState==="loading"){L=!0;return}document.querySelectorAll(l.cssSelector).forEach(v)}function z(){L&&S()}typeof window<"u"&&window.addEventListener&&window.addEventListener("DOMContentLoaded",z,!1);function O(N,R){let K=null;try{K=R(t)}catch(te){if(yo("Language definition for '{}' could not be registered.".replace("{}",N)),i)yo(te);else throw te;K=s}K.name||(K.name=N),e[N]=K,K.rawDefinition=R.bind(null,t),K.aliases&&ue(K.aliases,{languageName:N})}function q(N){delete e[N];for(let R of Object.keys(n))n[R]===N&&delete n[R]}function J(){return Object.keys(e)}function W(N){return N=(N||"").toLowerCase(),e[N]||e[n[N]]}function ue(N,{languageName:R}){typeof N=="string"&&(N=[N]),N.forEach(K=>{n[K.toLowerCase()]=R})}function ye(N){let R=W(N);return R&&!R.disableAutodetect}function Te(N){N["before:highlightBlock"]&&!N["before:highlightElement"]&&(N["before:highlightElement"]=R=>{N["before:highlightBlock"](Object.assign({block:R.el},R))}),N["after:highlightBlock"]&&!N["after:highlightElement"]&&(N["after:highlightElement"]=R=>{N["after:highlightBlock"](Object.assign({block:R.el},R))})}function ge(N){Te(N),r.push(N)}function we(N){let R=r.indexOf(N);R!==-1&&r.splice(R,1)}function xe(N,R){let K=N;r.forEach(function(te){te[K]&&te[K](R)})}function P(N){return us("10.7.0","highlightBlock will be removed entirely in v12.0"),us("10.7.0","Please use highlightElement now."),v(N)}Object.assign(t,{highlight:f,highlightAuto:b,highlightAll:S,highlightElement:v,highlightBlock:P,configure:x,initHighlighting:M,initHighlightingOnLoad:D,registerLanguage:O,unregisterLanguage:q,listLanguages:J,getLanguage:W,registerAliases:ue,autoDetection:ye,inherit:N_,addPlugin:ge,removePlugin:we}),t.debugMode=function(){i=!1},t.safeMode=function(){i=!0},t.versionString=rH,t.regex={concat:Eo,lookahead:L_,either:xm,optional:EF,anyNumberOfTimes:yF};for(let N in vu)typeof vu[N]=="object"&&R_(vu[N]);return Object.assign(t,vu),t},ds=W_({});ds.newInstance=()=>W_({});K_.exports=ds;ds.HighlightJS=ds;ds.default=ds});var q_=Gd((z4,Tm)=>{(function(){var t;typeof Tm<"u"?t=Tm.exports=r:t=function(){return this||(0,eval)("this")}(),t.format=r,t.vsprintf=n,typeof console<"u"&&typeof console.log=="function"&&(t.printf=e);function e(){console.log(r.apply(null,arguments))}function n(i,o){return r.apply(null,[i].concat(o))}function r(i){for(var o=1,s=[].slice.call(arguments),l=0,u=i.length,d="",f,h=!1,m,b,y=!1,v,x=function(){return s[o++]},M=function(){for(var D="";/\d/.test(i[l]);)D+=i[l++],f=i[l];return D.length>0?parseInt(D):null};l{(function(){var t,e="4.17.21",n=200,r="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",i="Expected a function",o="Invalid `variable` option passed into `_.template`",s="__lodash_hash_undefined__",l=500,u="__lodash_placeholder__",d=1,f=2,h=4,m=1,b=2,y=1,v=2,x=4,M=8,D=16,L=32,S=64,z=128,O=256,q=512,J=30,W="...",ue=800,ye=16,Te=1,ge=2,we=3,xe=1/0,P=9007199254740991,N=17976931348623157e292,R=NaN,K=4294967295,te=K-1,pe=K>>>1,Ce=[["ary",z],["bind",y],["bindKey",v],["curry",M],["curryRight",D],["flip",q],["partial",L],["partialRight",S],["rearg",O]],Ue="[object Arguments]",$e="[object Array]",He="[object AsyncFunction]",Xe="[object Boolean]",xt="[object Date]",Pt="[object DOMException]",Le="[object Error]",_t="[object Function]",Xt="[object GeneratorFunction]",st="[object Map]",Zt="[object Number]",St="[object Null]",Nt="[object Object]",ft="[object Promise]",me="[object Proxy]",Kt="[object RegExp]",ee="[object Set]",ke="[object String]",We="[object Symbol]",Oe="[object Undefined]",mt="[object WeakMap]",Ot="[object WeakSet]",X="[object ArrayBuffer]",re="[object DataView]",H="[object Float32Array]",Y="[object Float64Array]",le="[object Int8Array]",Me="[object Int16Array]",ct="[object Int32Array]",Vt="[object Uint8Array]",ki="[object Uint8ClampedArray]",B="[object Uint16Array]",ae="[object Uint32Array]",_e=/\b__p \+= '';/g,Ze=/\b(__p \+=) '' \+/g,Ve=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Bt=/&(?:amp|lt|gt|quot|#39);/g,sn=/[&<>"']/g,Yr=RegExp(Bt.source),Ta=RegExp(sn.source),Sr=/<%-([\s\S]+?)%>/g,ms=/<%([\s\S]+?)%>/g,Ai=/<%=([\s\S]+?)%>/g,Jr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Iu=/^\w*$/,gs=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Xr=/[\\^$.*+?()[\]{}|]/g,fS=RegExp(Xr.source),Lu=/^\s+/,pS=/\s/,hS=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,mS=/\{\n\/\* \[wrapped with (.+)\] \*/,gS=/,? & /,bS=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,yS=/[()=,{}\[\]\/\s]/,ES=/\\(\\)?/g,vS=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Om=/\w*$/,wS=/^[-+]0x[0-9a-f]+$/i,xS=/^0b[01]+$/i,_S=/^\[object .+?Constructor\]$/,SS=/^0o[0-7]+$/i,TS=/^(?:0|[1-9]\d*)$/,MS=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ma=/($^)/,CS=/['\n\r\u2028\u2029\\]/g,Ca="\\ud800-\\udfff",kS="\\u0300-\\u036f",AS="\\ufe20-\\ufe2f",NS="\\u20d0-\\u20ff",Rm=kS+AS+NS,Im="\\u2700-\\u27bf",Lm="a-z\\xdf-\\xf6\\xf8-\\xff",OS="\\xac\\xb1\\xd7\\xf7",RS="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",IS="\\u2000-\\u206f",LS=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Dm="A-Z\\xc0-\\xd6\\xd8-\\xde",Pm="\\ufe0e\\ufe0f",Bm=OS+RS+IS+LS,Du="['\u2019]",DS="["+Ca+"]",Fm="["+Bm+"]",ka="["+Rm+"]",Hm="\\d+",PS="["+Im+"]",zm="["+Lm+"]",Um="[^"+Ca+Bm+Hm+Im+Lm+Dm+"]",Pu="\\ud83c[\\udffb-\\udfff]",BS="(?:"+ka+"|"+Pu+")",$m="[^"+Ca+"]",Bu="(?:\\ud83c[\\udde6-\\uddff]){2}",Fu="[\\ud800-\\udbff][\\udc00-\\udfff]",wo="["+Dm+"]",Wm="\\u200d",Km="(?:"+zm+"|"+Um+")",FS="(?:"+wo+"|"+Um+")",Vm="(?:"+Du+"(?:d|ll|m|re|s|t|ve))?",Gm="(?:"+Du+"(?:D|LL|M|RE|S|T|VE))?",qm=BS+"?",Ym="["+Pm+"]?",HS="(?:"+Wm+"(?:"+[$m,Bu,Fu].join("|")+")"+Ym+qm+")*",zS="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",US="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Jm=Ym+qm+HS,$S="(?:"+[PS,Bu,Fu].join("|")+")"+Jm,WS="(?:"+[$m+ka+"?",ka,Bu,Fu,DS].join("|")+")",KS=RegExp(Du,"g"),VS=RegExp(ka,"g"),Hu=RegExp(Pu+"(?="+Pu+")|"+WS+Jm,"g"),GS=RegExp([wo+"?"+zm+"+"+Vm+"(?="+[Fm,wo,"$"].join("|")+")",FS+"+"+Gm+"(?="+[Fm,wo+Km,"$"].join("|")+")",wo+"?"+Km+"+"+Vm,wo+"+"+Gm,US,zS,Hm,$S].join("|"),"g"),qS=RegExp("["+Wm+Ca+Rm+Pm+"]"),YS=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,JS=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],XS=-1,at={};at[H]=at[Y]=at[le]=at[Me]=at[ct]=at[Vt]=at[ki]=at[B]=at[ae]=!0,at[Ue]=at[$e]=at[X]=at[Xe]=at[re]=at[xt]=at[Le]=at[_t]=at[st]=at[Zt]=at[Nt]=at[Kt]=at[ee]=at[ke]=at[mt]=!1;var it={};it[Ue]=it[$e]=it[X]=it[re]=it[Xe]=it[xt]=it[H]=it[Y]=it[le]=it[Me]=it[ct]=it[st]=it[Zt]=it[Nt]=it[Kt]=it[ee]=it[ke]=it[We]=it[Vt]=it[ki]=it[B]=it[ae]=!0,it[Le]=it[_t]=it[mt]=!1;var ZS={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},jS={"&":"&","<":"<",">":">",'"':""","'":"'"},QS={"&":"&","<":"<",">":">",""":'"',"'":"'"},eT={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},tT=parseFloat,nT=parseInt,Xm=typeof global=="object"&&global&&global.Object===Object&&global,rT=typeof self=="object"&&self&&self.Object===Object&&self,Ft=Xm||rT||Function("return this")(),zu=typeof hs=="object"&&hs&&!hs.nodeType&&hs,Ni=zu&&typeof Sa=="object"&&Sa&&!Sa.nodeType&&Sa,Zm=Ni&&Ni.exports===zu,Uu=Zm&&Xm.process,Rn=function(){try{var k=Ni&&Ni.require&&Ni.require("util").types;return k||Uu&&Uu.binding&&Uu.binding("util")}catch{}}(),jm=Rn&&Rn.isArrayBuffer,Qm=Rn&&Rn.isDate,eg=Rn&&Rn.isMap,tg=Rn&&Rn.isRegExp,ng=Rn&&Rn.isSet,rg=Rn&&Rn.isTypedArray;function Tn(k,F,I){switch(I.length){case 0:return k.call(F);case 1:return k.call(F,I[0]);case 2:return k.call(F,I[0],I[1]);case 3:return k.call(F,I[0],I[1],I[2])}return k.apply(F,I)}function iT(k,F,I,oe){for(var Ae=-1,je=k==null?0:k.length;++Ae-1}function $u(k,F,I){for(var oe=-1,Ae=k==null?0:k.length;++oe-1;);return I}function dg(k,F){for(var I=k.length;I--&&xo(F,k[I],0)>-1;);return I}function pT(k,F){for(var I=k.length,oe=0;I--;)k[I]===F&&++oe;return oe}var hT=Gu(ZS),mT=Gu(jS);function gT(k){return"\\"+eT[k]}function bT(k,F){return k==null?t:k[F]}function _o(k){return qS.test(k)}function yT(k){return YS.test(k)}function ET(k){for(var F,I=[];!(F=k.next()).done;)I.push(F.value);return I}function Xu(k){var F=-1,I=Array(k.size);return k.forEach(function(oe,Ae){I[++F]=[Ae,oe]}),I}function fg(k,F){return function(I){return k(F(I))}}function Qr(k,F){for(var I=-1,oe=k.length,Ae=0,je=[];++I-1}function s1(a,c){var p=this.__data__,g=Ga(p,a);return g<0?(++this.size,p.push([a,c])):p[g][1]=c,this}Tr.prototype.clear=n1,Tr.prototype.delete=r1,Tr.prototype.get=i1,Tr.prototype.has=o1,Tr.prototype.set=s1;function Mr(a){var c=-1,p=a==null?0:a.length;for(this.clear();++c=c?a:c)),a}function Pn(a,c,p,g,E,_){var T,C=c&d,A=c&f,U=c&h;if(p&&(T=E?p(a,g,E,_):p(a)),T!==t)return T;if(!pt(a))return a;var $=Ne(a);if($){if(T=uM(a),!C)return bn(a,T)}else{var G=Qt(a),ne=G==_t||G==Xt;if(si(a))return Yg(a,C);if(G==Nt||G==Ue||ne&&!E){if(T=A||ne?{}:pb(a),!C)return A?Q1(a,x1(T,a)):j1(a,Sg(T,a))}else{if(!it[G])return E?a:{};T=dM(a,G,C)}}_||(_=new Qn);var de=_.get(a);if(de)return de;_.set(a,T),$b(a)?a.forEach(function(ve){T.add(Pn(ve,c,p,ve,a,_))}):zb(a)&&a.forEach(function(ve,ze){T.set(ze,Pn(ve,c,p,ze,a,_))});var Ee=U?A?xd:wd:A?En:Ht,De=$?t:Ee(a);return In(De||a,function(ve,ze){De&&(ze=ve,ve=a[ze]),_s(T,ze,Pn(ve,c,p,ze,a,_))}),T}function _1(a){var c=Ht(a);return function(p){return Tg(p,a,c)}}function Tg(a,c,p){var g=p.length;if(a==null)return!g;for(a=nt(a);g--;){var E=p[g],_=c[E],T=a[E];if(T===t&&!(E in a)||!_(T))return!1}return!0}function Mg(a,c,p){if(typeof a!="function")throw new Ln(i);return Ns(function(){a.apply(t,p)},c)}function Ss(a,c,p,g){var E=-1,_=Aa,T=!0,C=a.length,A=[],U=c.length;if(!C)return A;p&&(c=ut(c,Mn(p))),g?(_=$u,T=!1):c.length>=n&&(_=bs,T=!1,c=new Ii(c));e:for(;++EE?0:E+p),g=g===t||g>E?E:Re(g),g<0&&(g+=E),g=p>g?0:Kb(g);p0&&p(C)?c>1?Gt(C,c-1,p,g,E):jr(E,C):g||(E[E.length]=C)}return E}var rd=eb(),Ag=eb(!0);function dr(a,c){return a&&rd(a,c,Ht)}function id(a,c){return a&&Ag(a,c,Ht)}function Ya(a,c){return Zr(c,function(p){return Or(a[p])})}function Di(a,c){c=ii(c,a);for(var p=0,g=c.length;a!=null&&pc}function M1(a,c){return a!=null&&et.call(a,c)}function C1(a,c){return a!=null&&c in nt(a)}function k1(a,c,p){return a>=jt(c,p)&&a=120&&$.length>=120)?new Ii(T&&$):t}$=a[0];var G=-1,ne=C[0];e:for(;++G-1;)C!==a&&Ha.call(C,A,1),Ha.call(a,A,1);return a}function zg(a,c){for(var p=a?c.length:0,g=p-1;p--;){var E=c[p];if(p==g||E!==_){var _=E;Nr(E)?Ha.call(a,E,1):hd(a,E)}}return a}function dd(a,c){return a+$a(vg()*(c-a+1))}function U1(a,c,p,g){for(var E=-1,_=It(Ua((c-a)/(p||1)),0),T=I(_);_--;)T[g?_:++E]=a,a+=p;return T}function fd(a,c){var p="";if(!a||c<1||c>P)return p;do c%2&&(p+=a),c=$a(c/2),c&&(a+=a);while(c);return p}function Fe(a,c){return Ad(gb(a,c,vn),a+"")}function $1(a){return _g(Io(a))}function W1(a,c){var p=Io(a);return ol(p,Li(c,0,p.length))}function Cs(a,c,p,g){if(!pt(a))return a;c=ii(c,a);for(var E=-1,_=c.length,T=_-1,C=a;C!=null&&++E<_;){var A=pr(c[E]),U=p;if(A==="__proto__"||A==="constructor"||A==="prototype")return a;if(E!=T){var $=C[A];U=g?g($,A,C):t,U===t&&(U=pt($)?$:Nr(c[E+1])?[]:{})}_s(C,A,U),C=C[A]}return a}var Ug=Wa?function(a,c){return Wa.set(a,c),a}:vn,K1=za?function(a,c){return za(a,"toString",{configurable:!0,enumerable:!1,value:Hd(c),writable:!0})}:vn;function V1(a){return ol(Io(a))}function Bn(a,c,p){var g=-1,E=a.length;c<0&&(c=-c>E?0:E+c),p=p>E?E:p,p<0&&(p+=E),E=c>p?0:p-c>>>0,c>>>=0;for(var _=I(E);++g>>1,T=a[_];T!==null&&!kn(T)&&(p?T<=c:T=n){var U=c?null:rM(a);if(U)return Oa(U);T=!1,E=bs,A=new Ii}else A=c?[]:C;e:for(;++g<_;){var $=a[g],G=c?c($):$;if($=p||$!==0?$:0,T&&G===G){for(var ne=A.length;ne--;)if(A[ne]===G)continue e;c&&A.push(G),C.push($)}else E(A,G,p)||(A!==C&&A.push(G),C.push($))}return C}function hd(a,c){return c=ii(c,a),a=bb(a,c),a==null||delete a[pr(Fn(c))]}function Kg(a,c,p,g){return Cs(a,c,p(Di(a,c)),g)}function Za(a,c,p,g){for(var E=a.length,_=g?E:-1;(g?_--:++_=g?a:Bn(a,c,p)}var qg=LT||function(a){return Ft.clearTimeout(a)};function Yg(a,c){if(c)return a.slice();var p=a.length,g=mg?mg(p):new a.constructor(p);return a.copy(g),g}function yd(a){var c=new a.constructor(a.byteLength);return new Ba(c).set(new Ba(a)),c}function Y1(a,c){var p=c?yd(a.buffer):a.buffer;return new a.constructor(p,a.byteOffset,a.byteLength)}function J1(a){var c=new a.constructor(a.source,Om.exec(a));return c.lastIndex=a.lastIndex,c}function X1(a){return xs?nt(xs.call(a)):{}}function Jg(a,c){var p=c?yd(a.buffer):a.buffer;return new a.constructor(p,a.byteOffset,a.length)}function Xg(a,c){if(a!==c){var p=a!==t,g=a===null,E=a===a,_=kn(a),T=c!==t,C=c===null,A=c===c,U=kn(c);if(!C&&!U&&!_&&a>c||_&&T&&A&&!C&&!U||g&&T&&A||!p&&A||!E)return 1;if(!g&&!_&&!U&&a=C)return A;var U=p[g];return A*(U=="desc"?-1:1)}}return a.index-c.index}function Zg(a,c,p,g){for(var E=-1,_=a.length,T=p.length,C=-1,A=c.length,U=It(_-T,0),$=I(A+U),G=!g;++C1?p[E-1]:t,T=E>2?p[2]:t;for(_=a.length>3&&typeof _=="function"?(E--,_):t,T&&ln(p[0],p[1],T)&&(_=E<3?t:_,E=1),c=nt(c);++g-1?E[_?c[T]:T]:t}}function rb(a){return Ar(function(c){var p=c.length,g=p,E=Dn.prototype.thru;for(a&&c.reverse();g--;){var _=c[g];if(typeof _!="function")throw new Ln(i);if(E&&!T&&rl(_)=="wrapper")var T=new Dn([],!0)}for(g=T?g:p;++g1&&Ge.reverse(),$&&AC))return!1;var U=_.get(a),$=_.get(c);if(U&&$)return U==c&&$==a;var G=-1,ne=!0,de=p&b?new Ii:t;for(_.set(a,c),_.set(c,a);++G1?"& ":"")+c[g],c=c.join(p>2?", ":" "),a.replace(hS,`{ -/* [wrapped with `+c+`] */ -`)}function pM(a){return Ne(a)||Fi(a)||!!(yg&&a&&a[yg])}function Nr(a,c){var p=typeof a;return c=c??P,!!c&&(p=="number"||p!="symbol"&&TS.test(a))&&a>-1&&a%1==0&&a0){if(++c>=ue)return arguments[0]}else c=0;return a.apply(t,arguments)}}function ol(a,c){var p=-1,g=a.length,E=g-1;for(c=c===t?g:c;++p1?a[c-1]:t;return p=typeof p=="function"?(a.pop(),p):t,kb(a,p)});function Ab(a){var c=w(a);return c.__chain__=!0,c}function SC(a,c){return c(a),a}function sl(a,c){return c(a)}var TC=Ar(function(a){var c=a.length,p=c?a[0]:0,g=this.__wrapped__,E=function(_){return nd(_,a)};return c>1||this.__actions__.length||!(g instanceof Ke)||!Nr(p)?this.thru(E):(g=g.slice(p,+p+(c?1:0)),g.__actions__.push({func:sl,args:[E],thisArg:t}),new Dn(g,this.__chain__).thru(function(_){return c&&!_.length&&_.push(t),_}))});function MC(){return Ab(this)}function CC(){return new Dn(this.value(),this.__chain__)}function kC(){this.__values__===t&&(this.__values__=Wb(this.value()));var a=this.__index__>=this.__values__.length,c=a?t:this.__values__[this.__index__++];return{done:a,value:c}}function AC(){return this}function NC(a){for(var c,p=this;p instanceof Va;){var g=xb(p);g.__index__=0,g.__values__=t,c?E.__wrapped__=g:c=g;var E=g;p=p.__wrapped__}return E.__wrapped__=a,c}function OC(){var a=this.__wrapped__;if(a instanceof Ke){var c=a;return this.__actions__.length&&(c=new Ke(this)),c=c.reverse(),c.__actions__.push({func:sl,args:[Nd],thisArg:t}),new Dn(c,this.__chain__)}return this.thru(Nd)}function RC(){return Vg(this.__wrapped__,this.__actions__)}var IC=ja(function(a,c,p){et.call(a,p)?++a[p]:Cr(a,p,1)});function LC(a,c,p){var g=Ne(a)?ig:S1;return p&&ln(a,c,p)&&(c=t),g(a,be(c,3))}function DC(a,c){var p=Ne(a)?Zr:kg;return p(a,be(c,3))}var PC=nb(_b),BC=nb(Sb);function FC(a,c){return Gt(al(a,c),1)}function HC(a,c){return Gt(al(a,c),xe)}function zC(a,c,p){return p=p===t?1:Re(p),Gt(al(a,c),p)}function Nb(a,c){var p=Ne(a)?In:ni;return p(a,be(c,3))}function Ob(a,c){var p=Ne(a)?oT:Cg;return p(a,be(c,3))}var UC=ja(function(a,c,p){et.call(a,p)?a[p].push(c):Cr(a,p,[c])});function $C(a,c,p,g){a=yn(a)?a:Io(a),p=p&&!g?Re(p):0;var E=a.length;return p<0&&(p=It(E+p,0)),fl(a)?p<=E&&a.indexOf(c,p)>-1:!!E&&xo(a,c,p)>-1}var WC=Fe(function(a,c,p){var g=-1,E=typeof c=="function",_=yn(a)?I(a.length):[];return ni(a,function(T){_[++g]=E?Tn(c,T,p):Ts(T,c,p)}),_}),KC=ja(function(a,c,p){Cr(a,p,c)});function al(a,c){var p=Ne(a)?ut:Lg;return p(a,be(c,3))}function VC(a,c,p,g){return a==null?[]:(Ne(c)||(c=c==null?[]:[c]),p=g?t:p,Ne(p)||(p=p==null?[]:[p]),Fg(a,c,p))}var GC=ja(function(a,c,p){a[p?0:1].push(c)},function(){return[[],[]]});function qC(a,c,p){var g=Ne(a)?Wu:lg,E=arguments.length<3;return g(a,be(c,4),p,E,ni)}function YC(a,c,p){var g=Ne(a)?sT:lg,E=arguments.length<3;return g(a,be(c,4),p,E,Cg)}function JC(a,c){var p=Ne(a)?Zr:kg;return p(a,ul(be(c,3)))}function XC(a){var c=Ne(a)?_g:$1;return c(a)}function ZC(a,c,p){(p?ln(a,c,p):c===t)?c=1:c=Re(c);var g=Ne(a)?E1:W1;return g(a,c)}function jC(a){var c=Ne(a)?v1:V1;return c(a)}function QC(a){if(a==null)return 0;if(yn(a))return fl(a)?So(a):a.length;var c=Qt(a);return c==st||c==ee?a.size:ld(a).length}function ek(a,c,p){var g=Ne(a)?Ku:G1;return p&&ln(a,c,p)&&(c=t),g(a,be(c,3))}var tk=Fe(function(a,c){if(a==null)return[];var p=c.length;return p>1&&ln(a,c[0],c[1])?c=[]:p>2&&ln(c[0],c[1],c[2])&&(c=[c[0]]),Fg(a,Gt(c,1),[])}),ll=DT||function(){return Ft.Date.now()};function nk(a,c){if(typeof c!="function")throw new Ln(i);return a=Re(a),function(){if(--a<1)return c.apply(this,arguments)}}function Rb(a,c,p){return c=p?t:c,c=a&&c==null?a.length:c,kr(a,z,t,t,t,t,c)}function Ib(a,c){var p;if(typeof c!="function")throw new Ln(i);return a=Re(a),function(){return--a>0&&(p=c.apply(this,arguments)),a<=1&&(c=t),p}}var Rd=Fe(function(a,c,p){var g=y;if(p.length){var E=Qr(p,Oo(Rd));g|=L}return kr(a,g,c,p,E)}),Lb=Fe(function(a,c,p){var g=y|v;if(p.length){var E=Qr(p,Oo(Lb));g|=L}return kr(c,g,a,p,E)});function Db(a,c,p){c=p?t:c;var g=kr(a,M,t,t,t,t,t,c);return g.placeholder=Db.placeholder,g}function Pb(a,c,p){c=p?t:c;var g=kr(a,D,t,t,t,t,t,c);return g.placeholder=Pb.placeholder,g}function Bb(a,c,p){var g,E,_,T,C,A,U=0,$=!1,G=!1,ne=!0;if(typeof a!="function")throw new Ln(i);c=Hn(c)||0,pt(p)&&($=!!p.leading,G="maxWait"in p,_=G?It(Hn(p.maxWait)||0,c):_,ne="trailing"in p?!!p.trailing:ne);function de(vt){var tr=g,Ir=E;return g=E=t,U=vt,T=a.apply(Ir,tr),T}function Ee(vt){return U=vt,C=Ns(ze,c),$?de(vt):T}function De(vt){var tr=vt-A,Ir=vt-U,ny=c-tr;return G?jt(ny,_-Ir):ny}function ve(vt){var tr=vt-A,Ir=vt-U;return A===t||tr>=c||tr<0||G&&Ir>=_}function ze(){var vt=ll();if(ve(vt))return Ge(vt);C=Ns(ze,De(vt))}function Ge(vt){return C=t,ne&&g?de(vt):(g=E=t,T)}function An(){C!==t&&qg(C),U=0,g=A=E=C=t}function cn(){return C===t?T:Ge(ll())}function Nn(){var vt=ll(),tr=ve(vt);if(g=arguments,E=this,A=vt,tr){if(C===t)return Ee(A);if(G)return qg(C),C=Ns(ze,c),de(A)}return C===t&&(C=Ns(ze,c)),T}return Nn.cancel=An,Nn.flush=cn,Nn}var rk=Fe(function(a,c){return Mg(a,1,c)}),ik=Fe(function(a,c,p){return Mg(a,Hn(c)||0,p)});function ok(a){return kr(a,q)}function cl(a,c){if(typeof a!="function"||c!=null&&typeof c!="function")throw new Ln(i);var p=function(){var g=arguments,E=c?c.apply(this,g):g[0],_=p.cache;if(_.has(E))return _.get(E);var T=a.apply(this,g);return p.cache=_.set(E,T)||_,T};return p.cache=new(cl.Cache||Mr),p}cl.Cache=Mr;function ul(a){if(typeof a!="function")throw new Ln(i);return function(){var c=arguments;switch(c.length){case 0:return!a.call(this);case 1:return!a.call(this,c[0]);case 2:return!a.call(this,c[0],c[1]);case 3:return!a.call(this,c[0],c[1],c[2])}return!a.apply(this,c)}}function sk(a){return Ib(2,a)}var ak=q1(function(a,c){c=c.length==1&&Ne(c[0])?ut(c[0],Mn(be())):ut(Gt(c,1),Mn(be()));var p=c.length;return Fe(function(g){for(var E=-1,_=jt(g.length,p);++E<_;)g[E]=c[E].call(this,g[E]);return Tn(a,this,g)})}),Id=Fe(function(a,c){var p=Qr(c,Oo(Id));return kr(a,L,t,c,p)}),Fb=Fe(function(a,c){var p=Qr(c,Oo(Fb));return kr(a,S,t,c,p)}),lk=Ar(function(a,c){return kr(a,O,t,t,t,c)});function ck(a,c){if(typeof a!="function")throw new Ln(i);return c=c===t?c:Re(c),Fe(a,c)}function uk(a,c){if(typeof a!="function")throw new Ln(i);return c=c==null?0:It(Re(c),0),Fe(function(p){var g=p[c],E=oi(p,0,c);return g&&jr(E,g),Tn(a,this,E)})}function dk(a,c,p){var g=!0,E=!0;if(typeof a!="function")throw new Ln(i);return pt(p)&&(g="leading"in p?!!p.leading:g,E="trailing"in p?!!p.trailing:E),Bb(a,c,{leading:g,maxWait:c,trailing:E})}function fk(a){return Rb(a,1)}function pk(a,c){return Id(bd(c),a)}function hk(){if(!arguments.length)return[];var a=arguments[0];return Ne(a)?a:[a]}function mk(a){return Pn(a,h)}function gk(a,c){return c=typeof c=="function"?c:t,Pn(a,h,c)}function bk(a){return Pn(a,d|h)}function yk(a,c){return c=typeof c=="function"?c:t,Pn(a,d|h,c)}function Ek(a,c){return c==null||Tg(a,c,Ht(c))}function er(a,c){return a===c||a!==a&&c!==c}var vk=nl(od),wk=nl(function(a,c){return a>=c}),Fi=Og(function(){return arguments}())?Og:function(a){return gt(a)&&et.call(a,"callee")&&!bg.call(a,"callee")},Ne=I.isArray,xk=jm?Mn(jm):N1;function yn(a){return a!=null&&dl(a.length)&&!Or(a)}function Et(a){return gt(a)&&yn(a)}function _k(a){return a===!0||a===!1||gt(a)&&an(a)==Xe}var si=BT||Kd,Sk=Qm?Mn(Qm):O1;function Tk(a){return gt(a)&&a.nodeType===1&&!Os(a)}function Mk(a){if(a==null)return!0;if(yn(a)&&(Ne(a)||typeof a=="string"||typeof a.splice=="function"||si(a)||Ro(a)||Fi(a)))return!a.length;var c=Qt(a);if(c==st||c==ee)return!a.size;if(As(a))return!ld(a).length;for(var p in a)if(et.call(a,p))return!1;return!0}function Ck(a,c){return Ms(a,c)}function kk(a,c,p){p=typeof p=="function"?p:t;var g=p?p(a,c):t;return g===t?Ms(a,c,t,p):!!g}function Ld(a){if(!gt(a))return!1;var c=an(a);return c==Le||c==Pt||typeof a.message=="string"&&typeof a.name=="string"&&!Os(a)}function Ak(a){return typeof a=="number"&&Eg(a)}function Or(a){if(!pt(a))return!1;var c=an(a);return c==_t||c==Xt||c==He||c==me}function Hb(a){return typeof a=="number"&&a==Re(a)}function dl(a){return typeof a=="number"&&a>-1&&a%1==0&&a<=P}function pt(a){var c=typeof a;return a!=null&&(c=="object"||c=="function")}function gt(a){return a!=null&&typeof a=="object"}var zb=eg?Mn(eg):I1;function Nk(a,c){return a===c||ad(a,c,Sd(c))}function Ok(a,c,p){return p=typeof p=="function"?p:t,ad(a,c,Sd(c),p)}function Rk(a){return Ub(a)&&a!=+a}function Ik(a){if(gM(a))throw new Ae(r);return Rg(a)}function Lk(a){return a===null}function Dk(a){return a==null}function Ub(a){return typeof a=="number"||gt(a)&&an(a)==Zt}function Os(a){if(!gt(a)||an(a)!=Nt)return!1;var c=Fa(a);if(c===null)return!0;var p=et.call(c,"constructor")&&c.constructor;return typeof p=="function"&&p instanceof p&&La.call(p)==OT}var Dd=tg?Mn(tg):L1;function Pk(a){return Hb(a)&&a>=-P&&a<=P}var $b=ng?Mn(ng):D1;function fl(a){return typeof a=="string"||!Ne(a)&>(a)&&an(a)==ke}function kn(a){return typeof a=="symbol"||gt(a)&&an(a)==We}var Ro=rg?Mn(rg):P1;function Bk(a){return a===t}function Fk(a){return gt(a)&&Qt(a)==mt}function Hk(a){return gt(a)&&an(a)==Ot}var zk=nl(cd),Uk=nl(function(a,c){return a<=c});function Wb(a){if(!a)return[];if(yn(a))return fl(a)?jn(a):bn(a);if(ys&&a[ys])return ET(a[ys]());var c=Qt(a),p=c==st?Xu:c==ee?Oa:Io;return p(a)}function Rr(a){if(!a)return a===0?a:0;if(a=Hn(a),a===xe||a===-xe){var c=a<0?-1:1;return c*N}return a===a?a:0}function Re(a){var c=Rr(a),p=c%1;return c===c?p?c-p:c:0}function Kb(a){return a?Li(Re(a),0,K):0}function Hn(a){if(typeof a=="number")return a;if(kn(a))return R;if(pt(a)){var c=typeof a.valueOf=="function"?a.valueOf():a;a=pt(c)?c+"":c}if(typeof a!="string")return a===0?a:+a;a=cg(a);var p=xS.test(a);return p||SS.test(a)?nT(a.slice(2),p?2:8):wS.test(a)?R:+a}function Vb(a){return fr(a,En(a))}function $k(a){return a?Li(Re(a),-P,P):a===0?a:0}function Qe(a){return a==null?"":Cn(a)}var Wk=Ao(function(a,c){if(As(c)||yn(c)){fr(c,Ht(c),a);return}for(var p in c)et.call(c,p)&&_s(a,p,c[p])}),Gb=Ao(function(a,c){fr(c,En(c),a)}),pl=Ao(function(a,c,p,g){fr(c,En(c),a,g)}),Kk=Ao(function(a,c,p,g){fr(c,Ht(c),a,g)}),Vk=Ar(nd);function Gk(a,c){var p=ko(a);return c==null?p:Sg(p,c)}var qk=Fe(function(a,c){a=nt(a);var p=-1,g=c.length,E=g>2?c[2]:t;for(E&&ln(c[0],c[1],E)&&(g=1);++p1),_}),fr(a,xd(a),p),g&&(p=Pn(p,d|f|h,iM));for(var E=c.length;E--;)hd(p,c[E]);return p});function dA(a,c){return Yb(a,ul(be(c)))}var fA=Ar(function(a,c){return a==null?{}:H1(a,c)});function Yb(a,c){if(a==null)return{};var p=ut(xd(a),function(g){return[g]});return c=be(c),Hg(a,p,function(g,E){return c(g,E[0])})}function pA(a,c,p){c=ii(c,a);var g=-1,E=c.length;for(E||(E=1,a=t);++gc){var g=a;a=c,c=g}if(p||a%1||c%1){var E=vg();return jt(a+E*(c-a+tT("1e-"+((E+"").length-1))),c)}return dd(a,c)}var SA=No(function(a,c,p){return c=c.toLowerCase(),a+(p?Zb(c):c)});function Zb(a){return Fd(Qe(a).toLowerCase())}function jb(a){return a=Qe(a),a&&a.replace(MS,hT).replace(VS,"")}function TA(a,c,p){a=Qe(a),c=Cn(c);var g=a.length;p=p===t?g:Li(Re(p),0,g);var E=p;return p-=c.length,p>=0&&a.slice(p,E)==c}function MA(a){return a=Qe(a),a&&Ta.test(a)?a.replace(sn,mT):a}function CA(a){return a=Qe(a),a&&fS.test(a)?a.replace(Xr,"\\$&"):a}var kA=No(function(a,c,p){return a+(p?"-":"")+c.toLowerCase()}),AA=No(function(a,c,p){return a+(p?" ":"")+c.toLowerCase()}),NA=tb("toLowerCase");function OA(a,c,p){a=Qe(a),c=Re(c);var g=c?So(a):0;if(!c||g>=c)return a;var E=(c-g)/2;return tl($a(E),p)+a+tl(Ua(E),p)}function RA(a,c,p){a=Qe(a),c=Re(c);var g=c?So(a):0;return c&&g>>0,p?(a=Qe(a),a&&(typeof c=="string"||c!=null&&!Dd(c))&&(c=Cn(c),!c&&_o(a))?oi(jn(a),0,p):a.split(c,p)):[]}var HA=No(function(a,c,p){return a+(p?" ":"")+Fd(c)});function zA(a,c,p){return a=Qe(a),p=p==null?0:Li(Re(p),0,a.length),c=Cn(c),a.slice(p,p+c.length)==c}function UA(a,c,p){var g=w.templateSettings;p&&ln(a,c,p)&&(c=t),a=Qe(a),c=pl({},c,g,lb);var E=pl({},c.imports,g.imports,lb),_=Ht(E),T=Ju(E,_),C,A,U=0,$=c.interpolate||Ma,G="__p += '",ne=Zu((c.escape||Ma).source+"|"+$.source+"|"+($===Ai?vS:Ma).source+"|"+(c.evaluate||Ma).source+"|$","g"),de="//# sourceURL="+(et.call(c,"sourceURL")?(c.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++XS+"]")+` -`;a.replace(ne,function(ve,ze,Ge,An,cn,Nn){return Ge||(Ge=An),G+=a.slice(U,Nn).replace(CS,gT),ze&&(C=!0,G+=`' + -__e(`+ze+`) + -'`),cn&&(A=!0,G+=`'; -`+cn+`; -__p += '`),Ge&&(G+=`' + -((__t = (`+Ge+`)) == null ? '' : __t) + -'`),U=Nn+ve.length,ve}),G+=`'; -`;var Ee=et.call(c,"variable")&&c.variable;if(!Ee)G=`with (obj) { -`+G+` -} -`;else if(yS.test(Ee))throw new Ae(o);G=(A?G.replace(_e,""):G).replace(Ze,"$1").replace(Ve,"$1;"),G="function("+(Ee||"obj")+`) { -`+(Ee?"":`obj || (obj = {}); -`)+"var __t, __p = ''"+(C?", __e = _.escape":"")+(A?`, __j = Array.prototype.join; -function print() { __p += __j.call(arguments, '') } -`:`; -`)+G+`return __p -}`;var De=ey(function(){return je(_,de+"return "+G).apply(t,T)});if(De.source=G,Ld(De))throw De;return De}function $A(a){return Qe(a).toLowerCase()}function WA(a){return Qe(a).toUpperCase()}function KA(a,c,p){if(a=Qe(a),a&&(p||c===t))return cg(a);if(!a||!(c=Cn(c)))return a;var g=jn(a),E=jn(c),_=ug(g,E),T=dg(g,E)+1;return oi(g,_,T).join("")}function VA(a,c,p){if(a=Qe(a),a&&(p||c===t))return a.slice(0,pg(a)+1);if(!a||!(c=Cn(c)))return a;var g=jn(a),E=dg(g,jn(c))+1;return oi(g,0,E).join("")}function GA(a,c,p){if(a=Qe(a),a&&(p||c===t))return a.replace(Lu,"");if(!a||!(c=Cn(c)))return a;var g=jn(a),E=ug(g,jn(c));return oi(g,E).join("")}function qA(a,c){var p=J,g=W;if(pt(c)){var E="separator"in c?c.separator:E;p="length"in c?Re(c.length):p,g="omission"in c?Cn(c.omission):g}a=Qe(a);var _=a.length;if(_o(a)){var T=jn(a);_=T.length}if(p>=_)return a;var C=p-So(g);if(C<1)return g;var A=T?oi(T,0,C).join(""):a.slice(0,C);if(E===t)return A+g;if(T&&(C+=A.length-C),Dd(E)){if(a.slice(C).search(E)){var U,$=A;for(E.global||(E=Zu(E.source,Qe(Om.exec(E))+"g")),E.lastIndex=0;U=E.exec($);)var G=U.index;A=A.slice(0,G===t?C:G)}}else if(a.indexOf(Cn(E),C)!=C){var ne=A.lastIndexOf(E);ne>-1&&(A=A.slice(0,ne))}return A+g}function YA(a){return a=Qe(a),a&&Yr.test(a)?a.replace(Bt,_T):a}var JA=No(function(a,c,p){return a+(p?" ":"")+c.toUpperCase()}),Fd=tb("toUpperCase");function Qb(a,c,p){return a=Qe(a),c=p?t:c,c===t?yT(a)?MT(a):cT(a):a.match(c)||[]}var ey=Fe(function(a,c){try{return Tn(a,t,c)}catch(p){return Ld(p)?p:new Ae(p)}}),XA=Ar(function(a,c){return In(c,function(p){p=pr(p),Cr(a,p,Rd(a[p],a))}),a});function ZA(a){var c=a==null?0:a.length,p=be();return a=c?ut(a,function(g){if(typeof g[1]!="function")throw new Ln(i);return[p(g[0]),g[1]]}):[],Fe(function(g){for(var E=-1;++EP)return[];var p=K,g=jt(a,K);c=be(c),a-=K;for(var E=Yu(g,c);++p0||c<0)?new Ke(p):(a<0?p=p.takeRight(-a):a&&(p=p.drop(a)),c!==t&&(c=Re(c),p=c<0?p.dropRight(-c):p.take(c-a)),p)},Ke.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},Ke.prototype.toArray=function(){return this.take(K)},dr(Ke.prototype,function(a,c){var p=/^(?:filter|find|map|reject)|While$/.test(c),g=/^(?:head|last)$/.test(c),E=w[g?"take"+(c=="last"?"Right":""):c],_=g||/^find/.test(c);E&&(w.prototype[c]=function(){var T=this.__wrapped__,C=g?[1]:arguments,A=T instanceof Ke,U=C[0],$=A||Ne(T),G=function(ze){var Ge=E.apply(w,jr([ze],C));return g&&ne?Ge[0]:Ge};$&&p&&typeof U=="function"&&U.length!=1&&(A=$=!1);var ne=this.__chain__,de=!!this.__actions__.length,Ee=_&&!ne,De=A&&!de;if(!_&&$){T=De?T:new Ke(this);var ve=a.apply(T,C);return ve.__actions__.push({func:sl,args:[G],thisArg:t}),new Dn(ve,ne)}return Ee&&De?a.apply(this,C):(ve=this.thru(G),Ee?g?ve.value()[0]:ve.value():ve)})}),In(["pop","push","shift","sort","splice","unshift"],function(a){var c=Ra[a],p=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",g=/^(?:pop|shift)$/.test(a);w.prototype[a]=function(){var E=arguments;if(g&&!this.__chain__){var _=this.value();return c.apply(Ne(_)?_:[],E)}return this[p](function(T){return c.apply(Ne(T)?T:[],E)})}}),dr(Ke.prototype,function(a,c){var p=w[c];if(p){var g=p.name+"";et.call(Co,g)||(Co[g]=[]),Co[g].push({name:c,func:p})}}),Co[Qa(t,v).name]=[{name:"wrapper",func:t}],Ke.prototype.clone=YT,Ke.prototype.reverse=JT,Ke.prototype.value=XT,w.prototype.at=TC,w.prototype.chain=MC,w.prototype.commit=CC,w.prototype.next=kC,w.prototype.plant=NC,w.prototype.reverse=OC,w.prototype.toJSON=w.prototype.valueOf=w.prototype.value=RC,w.prototype.first=w.prototype.head,ys&&(w.prototype[ys]=AC),w},ei=CT();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Ft._=ei,define(function(){return ei})):Ni?((Ni.exports=ei)._=ei,zu._=ei):Ft._=ei}).call(hs)});function en(t){this.content=t}en.prototype={constructor:en,find:function(t){for(var e=0;e>1}};en.from=function(t){if(t instanceof en)return t;var e=[];if(t)for(var n in t)e.push(n,t[n]);return new en(e)};var Yd=en;function cy(t,e,n){for(let r=0;;r++){if(r==t.childCount||r==e.childCount)return t.childCount==e.childCount?null:n;let i=t.child(r),o=e.child(r);if(i==o){n+=i.nodeSize;continue}if(!i.sameMarkup(o))return n;if(i.isText&&i.text!=o.text){for(let s=0;i.text[s]==o.text[s];s++)n++;return n}if(i.content.size||o.content.size){let s=cy(i.content,o.content,n+1);if(s!=null)return s}n+=i.nodeSize}}function uy(t,e,n,r){for(let i=t.childCount,o=e.childCount;;){if(i==0||o==0)return i==o?null:{a:n,b:r};let s=t.child(--i),l=e.child(--o),u=s.nodeSize;if(s==l){n-=u,r-=u;continue}if(!s.sameMarkup(l))return{a:n,b:r};if(s.isText&&s.text!=l.text){let d=0,f=Math.min(s.text.length,l.text.length);for(;de&&r(u,i+l,o||null,s)!==!1&&u.content.size){let f=l+1;u.nodesBetween(Math.max(0,e-f),Math.min(u.content.size,n-f),r,i+f)}l=d}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,n,r,i){let o="",s=!0;return this.nodesBetween(e,n,(l,u)=>{l.isText?(o+=l.text.slice(Math.max(e,u)-u,n-u),s=!r):l.isLeaf?(i?o+=typeof i=="function"?i(l):i:l.type.spec.leafText&&(o+=l.type.spec.leafText(l)),s=!r):!s&&l.isBlock&&(o+=r,s=!0)},0),o}append(e){if(!e.size)return this;if(!this.size)return e;let n=this.lastChild,r=e.firstChild,i=this.content.slice(),o=0;for(n.isText&&n.sameMarkup(r)&&(i[i.length-1]=n.withText(n.text+r.text),o=1);oe)for(let o=0,s=0;se&&((sn)&&(l.isText?l=l.cut(Math.max(0,e-s),Math.min(l.text.length,n-s)):l=l.cut(Math.max(0,e-s-1),Math.min(l.content.size,n-s-1))),r.push(l),i+=l.nodeSize),s=u}return new t(r,i)}cutByIndex(e,n){return e==n?t.empty:e==0&&n==this.content.length?this:new t(this.content.slice(e,n))}replaceChild(e,n){let r=this.content[e];if(r==n)return this;let i=this.content.slice(),o=this.size+n.nodeSize-r.nodeSize;return i[e]=n,new t(i,o)}addToStart(e){return new t([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new t(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let n=0;nthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let r=0,i=0;;r++){let o=this.child(r),s=i+o.nodeSize;if(s>=e)return s==e||n>0?hl(r+1,s):hl(r,i);i=s}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,n){if(!n)return t.empty;if(!Array.isArray(n))throw new RangeError("Invalid input for Fragment.fromJSON");return new t(n.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return t.empty;let n,r=0;for(let i=0;ithis.type.rank&&(n||(n=e.slice(0,i)),n.push(this),r=!0),n&&n.push(o)}}return n||(n=e.slice()),r||n.push(this),n}removeFromSet(e){for(let n=0;nr.type.rank-i.type.rank),n}};Ye.none=[];var Ui=class extends Error{},Z=class t{constructor(e,n,r){this.content=e,this.openStart=n,this.openEnd=r}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,n){let r=fy(this.content,e+this.openStart,n);return r&&new t(r,this.openStart,this.openEnd)}removeBetween(e,n){return new t(dy(this.content,e+this.openStart,n+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,n){if(!n)return t.empty;let r=n.openStart||0,i=n.openEnd||0;if(typeof r!="number"||typeof i!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new t(V.fromJSON(e,n.content),r,i)}static maxOpen(e,n=!0){let r=0,i=0;for(let o=e.firstChild;o&&!o.isLeaf&&(n||!o.type.spec.isolating);o=o.firstChild)r++;for(let o=e.lastChild;o&&!o.isLeaf&&(n||!o.type.spec.isolating);o=o.lastChild)i++;return new t(e,r,i)}};Z.empty=new Z(V.empty,0,0);function dy(t,e,n){let{index:r,offset:i}=t.findIndex(e),o=t.maybeChild(r),{index:s,offset:l}=t.findIndex(n);if(i==e||o.isText){if(l!=n&&!t.child(s).isText)throw new RangeError("Removing non-flat range");return t.cut(0,e).append(t.cut(n))}if(r!=s)throw new RangeError("Removing non-flat range");return t.replaceChild(r,o.copy(dy(o.content,e-i-1,n-i-1)))}function fy(t,e,n,r){let{index:i,offset:o}=t.findIndex(e),s=t.maybeChild(i);if(o==e||s.isText)return r&&!r.canReplace(i,i,n)?null:t.cut(0,e).append(n).append(t.cut(e));let l=fy(s.content,e-o-1,n);return l&&t.replaceChild(i,s.copy(l))}function $N(t,e,n){if(n.openStart>t.depth)throw new Ui("Inserted content deeper than insertion position");if(t.depth-n.openStart!=e.depth-n.openEnd)throw new Ui("Inconsistent open depths");return py(t,e,n,0)}function py(t,e,n,r){let i=t.index(r),o=t.node(r);if(i==e.index(r)&&r=0&&t.isText&&t.sameMarkup(e[n])?e[n]=t.withText(e[n].text+t.text):e.push(t)}function Rs(t,e,n,r){let i=(e||t).node(n),o=0,s=e?e.index(n):i.childCount;t&&(o=t.index(n),t.depth>n?o++:t.textOffset&&(Hi(t.nodeAfter,r),o++));for(let l=o;li&&Qd(t,e,i+1),s=r.depth>i&&Qd(n,r,i+1),l=[];return Rs(null,t,i,l),o&&s&&e.index(i)==n.index(i)?(hy(o,s),Hi(zi(o,my(t,e,n,r,i+1)),l)):(o&&Hi(zi(o,gl(t,e,i+1)),l),Rs(e,n,i,l),s&&Hi(zi(s,gl(n,r,i+1)),l)),Rs(r,null,i,l),new V(l)}function gl(t,e,n){let r=[];if(Rs(null,t,n,r),t.depth>n){let i=Qd(t,e,n+1);Hi(zi(i,gl(t,e,n+1)),r)}return Rs(e,null,n,r),new V(r)}function WN(t,e){let n=e.depth-t.openStart,i=e.node(n).copy(t.content);for(let o=n-1;o>=0;o--)i=e.node(o).copy(V.from(i));return{start:i.resolveNoCache(t.openStart+n),end:i.resolveNoCache(i.content.size-t.openEnd-n)}}var bl=class t{constructor(e,n,r){this.pos=e,this.path=n,this.parentOffset=r,this.depth=n.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,n=this.index(this.depth);if(n==e.childCount)return null;let r=this.pos-this.path[this.path.length-1],i=e.child(n);return r?e.child(n).cut(r):i}get nodeBefore(){let e=this.index(this.depth),n=this.pos-this.path[this.path.length-1];return n?this.parent.child(e).cut(0,n):e==0?null:this.parent.child(e-1)}posAtIndex(e,n){n=this.resolveDepth(n);let r=this.path[n*3],i=n==0?0:this.path[n*3-1]+1;for(let o=0;o0;n--)if(this.start(n)<=e&&this.end(n)>=e)return n;return 0}blockRange(e=this,n){if(e.pos=0;r--)if(e.pos<=this.end(r)&&(!n||n(this.node(r))))return new $i(this,e,r);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&n<=e.content.size))throw new RangeError("Position "+n+" out of range");let r=[],i=0,o=n;for(let s=e;;){let{index:l,offset:u}=s.content.findIndex(o),d=o-u;if(r.push(s,l,i+u),!d||(s=s.child(l),s.isText))break;o=d-1,i+=u+1}return new t(n,r,o)}static resolveCached(e,n){for(let i=0;ie&&this.nodesBetween(e,n,o=>(r.isInSet(o.marks)&&(i=!0),!i)),i}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),gy(this.marks,e)}contentMatchAt(e){let n=this.type.contentMatch.matchFragment(this.content,0,e);if(!n)throw new Error("Called contentMatchAt on a node with invalid content");return n}canReplace(e,n,r=V.empty,i=0,o=r.childCount){let s=this.contentMatchAt(e).matchFragment(r,i,o),l=s&&s.matchFragment(this.content,n);if(!l||!l.validEnd)return!1;for(let u=i;un.type.name)}`);this.content.forEach(n=>n.check())}toJSON(){let e={type:this.type.name};for(let n in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(n=>n.toJSON())),e}static fromJSON(e,n){if(!n)throw new RangeError("Invalid input for Node.fromJSON");let r=null;if(n.marks){if(!Array.isArray(n.marks))throw new RangeError("Invalid mark data for Node.fromJSON");r=n.marks.map(e.markFromJSON)}if(n.type=="text"){if(typeof n.text!="string")throw new RangeError("Invalid text node in JSON");return e.text(n.text,r)}let i=V.fromJSON(e,n.content);return e.nodeType(n.type).create(n.attrs,i,r)}};nr.prototype.text=void 0;var ef=class t extends nr{constructor(e,n,r,i){if(super(e,n,null,i),!r)throw new RangeError("Empty text nodes are not allowed");this.text=r}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):gy(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,n){return this.text.slice(e,n)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new t(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new t(this.type,this.attrs,e,this.marks)}cut(e=0,n=this.text.length){return e==0&&n==this.text.length?this:this.withText(this.text.slice(e,n))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}};function gy(t,e){for(let n=t.length-1;n>=0;n--)e=t[n].type.name+"("+e+")";return e}var Wi=class t{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,n){let r=new tf(e,n);if(r.next==null)return t.empty;let i=by(r);r.next&&r.err("Unexpected trailing text");let o=jN(ZN(i));return QN(o,r),o}matchType(e){for(let n=0;nd.createAndFill()));for(let d=0;d=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function n(r){e.push(r);for(let i=0;i{let o=i+(r.validEnd?"*":" ")+" ";for(let s=0;s"+e.indexOf(r.next[s].next);return o}).join(` -`)}};Wi.empty=new Wi(!0);var tf=class{constructor(e,n){this.string=e,this.nodeTypes=n,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==""&&this.tokens.pop(),this.tokens[0]==""&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}};function by(t){let e=[];do e.push(GN(t));while(t.eat("|"));return e.length==1?e[0]:{type:"choice",exprs:e}}function GN(t){let e=[];do e.push(qN(t));while(t.next&&t.next!=")"&&t.next!="|");return e.length==1?e[0]:{type:"seq",exprs:e}}function qN(t){let e=XN(t);for(;;)if(t.eat("+"))e={type:"plus",expr:e};else if(t.eat("*"))e={type:"star",expr:e};else if(t.eat("?"))e={type:"opt",expr:e};else if(t.eat("{"))e=YN(t,e);else break;return e}function ry(t){/\D/.test(t.next)&&t.err("Expected number, got '"+t.next+"'");let e=Number(t.next);return t.pos++,e}function YN(t,e){let n=ry(t),r=n;return t.eat(",")&&(t.next!="}"?r=ry(t):r=-1),t.eat("}")||t.err("Unclosed braced range"),{type:"range",min:n,max:r,expr:e}}function JN(t,e){let n=t.nodeTypes,r=n[e];if(r)return[r];let i=[];for(let o in n){let s=n[o];s.groups.indexOf(e)>-1&&i.push(s)}return i.length==0&&t.err("No node type or group '"+e+"' found"),i}function XN(t){if(t.eat("(")){let e=by(t);return t.eat(")")||t.err("Missing closing paren"),e}else if(/\W/.test(t.next))t.err("Unexpected token '"+t.next+"'");else{let e=JN(t,t.next).map(n=>(t.inline==null?t.inline=n.isInline:t.inline!=n.isInline&&t.err("Mixing inline and block content"),{type:"name",value:n}));return t.pos++,e.length==1?e[0]:{type:"choice",exprs:e}}}function ZN(t){let e=[[]];return i(o(t,0),n()),e;function n(){return e.push([])-1}function r(s,l,u){let d={term:u,to:l};return e[s].push(d),d}function i(s,l){s.forEach(u=>u.to=l)}function o(s,l){if(s.type=="choice")return s.exprs.reduce((u,d)=>u.concat(o(d,l)),[]);if(s.type=="seq")for(let u=0;;u++){let d=o(s.exprs[u],l);if(u==s.exprs.length-1)return d;i(d,l=n())}else if(s.type=="star"){let u=n();return r(l,u),i(o(s.expr,u),u),[r(u)]}else if(s.type=="plus"){let u=n();return i(o(s.expr,l),u),i(o(s.expr,u),u),[r(u)]}else{if(s.type=="opt")return[r(l)].concat(o(s.expr,l));if(s.type=="range"){let u=l;for(let d=0;d{t[s].forEach(({term:l,to:u})=>{if(!l)return;let d;for(let f=0;f{d||i.push([l,d=[]]),d.indexOf(f)==-1&&d.push(f)})})});let o=e[r.join(",")]=new Wi(r.indexOf(t.length-1)>-1);for(let s=0;s-1}allowsMarks(e){if(this.markSet==null)return!0;for(let n=0;nr[o]=new t(o,n,s));let i=n.spec.topNode||"doc";if(!r[i])throw new RangeError("Schema is missing its top node type ('"+i+"')");if(!r.text)throw new RangeError("Every schema needs a 'text' type");for(let o in r.text.attrs)throw new RangeError("The text node type should not have attributes");return r}},nf=class{constructor(e){this.hasDefault=Object.prototype.hasOwnProperty.call(e,"default"),this.default=e.default}get isRequired(){return!this.hasDefault}},Ls=class t{constructor(e,n,r,i){this.name=e,this.rank=n,this.schema=r,this.spec=i,this.attrs=wy(i.attrs),this.excluded=null;let o=Ey(this.attrs);this.instance=o?new Ye(this,o):null}create(e=null){return!e&&this.instance?this.instance:new Ye(this,vy(this.attrs,e))}static compile(e,n){let r=Object.create(null),i=0;return e.forEach((o,s)=>r[o]=new t(o,i++,n,s)),r}removeFromSet(e){for(var n=0;n-1}},El=class{constructor(e){this.cached=Object.create(null);let n=this.spec={};for(let i in e)n[i]=e[i];n.nodes=Yd.from(e.nodes),n.marks=Yd.from(e.marks||{}),this.nodes=yl.compile(this.spec.nodes,this),this.marks=Ls.compile(this.spec.marks,this);let r=Object.create(null);for(let i in this.nodes){if(i in this.marks)throw new RangeError(i+" can not be both a node and a mark");let o=this.nodes[i],s=o.spec.content||"",l=o.spec.marks;o.contentMatch=r[s]||(r[s]=Wi.parse(s,this.nodes)),o.inlineContent=o.contentMatch.inlineContent,o.markSet=l=="_"?null:l?oy(this,l.split(" ")):l==""||!o.inlineContent?[]:null}for(let i in this.marks){let o=this.marks[i],s=o.spec.excludes;o.excluded=s==null?[o]:s==""?[]:oy(this,s.split(" "))}this.nodeFromJSON=this.nodeFromJSON.bind(this),this.markFromJSON=this.markFromJSON.bind(this),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,n=null,r,i){if(typeof e=="string")e=this.nodeType(e);else if(e instanceof yl){if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}else throw new RangeError("Invalid node type: "+e);return e.createChecked(n,r,i)}text(e,n){let r=this.nodes.text;return new ef(r,r.defaultAttrs,e,Ye.setFrom(n))}mark(e,n){return typeof e=="string"&&(e=this.marks[e]),e.create(n)}nodeFromJSON(e){return nr.fromJSON(this,e)}markFromJSON(e){return Ye.fromJSON(this,e)}nodeType(e){let n=this.nodes[e];if(!n)throw new RangeError("Unknown node type: "+e);return n}};function oy(t,e){let n=[];for(let r=0;r-1)&&n.push(s=u)}if(!s)throw new SyntaxError("Unknown mark type: '"+e[r]+"'")}return n}var Ki=class t{constructor(e,n){this.schema=e,this.rules=n,this.tags=[],this.styles=[],n.forEach(r=>{r.tag?this.tags.push(r):r.style&&this.styles.push(r)}),this.normalizeLists=!this.tags.some(r=>{if(!/^(ul|ol)\b/.test(r.tag)||!r.node)return!1;let i=e.nodes[r.node];return i.contentMatch.matchType(i)})}parse(e,n={}){let r=new xl(this,n,!1);return r.addAll(e,n.from,n.to),r.finish()}parseSlice(e,n={}){let r=new xl(this,n,!0);return r.addAll(e,n.from,n.to),Z.maxOpen(r.finish())}matchTag(e,n,r){for(let i=r?this.tags.indexOf(r)+1:0;ie.length&&(l.charCodeAt(e.length)!=61||l.slice(e.length+1)!=n))){if(s.getAttrs){let u=s.getAttrs(n);if(u===!1)continue;s.attrs=u||void 0}return s}}}static schemaRules(e){let n=[];function r(i){let o=i.priority==null?50:i.priority,s=0;for(;s{r(s=ay(s)),s.mark||s.ignore||s.clearMark||(s.mark=i)})}for(let i in e.nodes){let o=e.nodes[i].spec.parseDOM;o&&o.forEach(s=>{r(s=ay(s)),s.node||s.ignore||s.mark||(s.node=i)})}return n}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new t(e,t.schemaRules(e)))}},xy={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},eO={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},_y={ol:!0,ul:!0},vl=1,wl=2,Is=4;function sy(t,e,n){return e!=null?(e?vl:0)|(e==="full"?wl:0):t&&t.whitespace=="pre"?vl|wl:n&~Is}var Lo=class{constructor(e,n,r,i,o,s,l){this.type=e,this.attrs=n,this.marks=r,this.pendingMarks=i,this.solid=o,this.options=l,this.content=[],this.activeMarks=Ye.none,this.stashMarks=[],this.match=s||(l&Is?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let n=this.type.contentMatch.fillBefore(V.from(e));if(n)this.match=this.type.contentMatch.matchFragment(n);else{let r=this.type.contentMatch,i;return(i=r.findWrapping(e.type))?(this.match=r,i):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&vl)){let r=this.content[this.content.length-1],i;if(r&&r.isText&&(i=/[ \t\r\n\u000c]+$/.exec(r.text))){let o=r;r.text.length==i[0].length?this.content.pop():this.content[this.content.length-1]=o.withText(o.text.slice(0,o.text.length-i[0].length))}}let n=V.from(this.content);return!e&&this.match&&(n=n.append(this.match.fillBefore(V.empty,!0))),this.type?this.type.create(this.attrs,n,this.marks):n}popFromStashMark(e){for(let n=this.stashMarks.length-1;n>=0;n--)if(e.eq(this.stashMarks[n]))return this.stashMarks.splice(n,1)[0]}applyPending(e){for(let n=0,r=this.pendingMarks;nthis.addAll(e)),s&&this.sync(l),this.needsBlock=u}else this.withStyleRules(e,()=>{this.addElementByRule(e,o,o.consuming===!1?i:void 0)})}leafFallback(e){e.nodeName=="BR"&&this.top.type&&this.top.type.inlineContent&&this.addTextNode(e.ownerDocument.createTextNode(` -`))}ignoreFallback(e){e.nodeName=="BR"&&(!this.top.type||!this.top.type.inlineContent)&&this.findPlace(this.parser.schema.text("-"))}readStyles(e){let n=Ye.none,r=Ye.none;for(let i=0;i{s.clearMark(l)&&(r=l.addToSet(r))}):n=this.parser.schema.marks[s.mark].create(s.attrs).addToSet(n),s.consuming===!1)o=s;else break}return[n,r]}addElementByRule(e,n,r){let i,o,s;n.node?(o=this.parser.schema.nodes[n.node],o.isLeaf?this.insertNode(o.create(n.attrs))||this.leafFallback(e):i=this.enter(o,n.attrs||null,n.preserveWhitespace)):(s=this.parser.schema.marks[n.mark].create(n.attrs),this.addPendingMark(s));let l=this.top;if(o&&o.isLeaf)this.findInside(e);else if(r)this.addElement(e,r);else if(n.getContent)this.findInside(e),n.getContent(e,this.parser.schema).forEach(u=>this.insertNode(u));else{let u=e;typeof n.contentElement=="string"?u=e.querySelector(n.contentElement):typeof n.contentElement=="function"?u=n.contentElement(e):n.contentElement&&(u=n.contentElement),this.findAround(e,u,!0),this.addAll(u)}i&&this.sync(l)&&this.open--,s&&this.removePendingMark(s,l)}addAll(e,n,r){let i=n||0;for(let o=n?e.childNodes[n]:e.firstChild,s=r==null?null:e.childNodes[r];o!=s;o=o.nextSibling,++i)this.findAtPoint(e,i),this.addDOM(o);this.findAtPoint(e,i)}findPlace(e){let n,r;for(let i=this.open;i>=0;i--){let o=this.nodes[i],s=o.findWrapping(e);if(s&&(!n||n.length>s.length)&&(n=s,r=o,!s.length)||o.solid)break}if(!n)return!1;this.sync(r);for(let i=0;ithis.open){for(;n>this.open;n--)this.nodes[n-1].content.push(this.nodes[n].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(this.isOpen||this.options.topOpen)}sync(e){for(let n=this.open;n>=0;n--)if(this.nodes[n]==e)return this.open=n,!0;return!1}get currentPos(){this.closeExtra();let e=0;for(let n=this.open;n>=0;n--){let r=this.nodes[n].content;for(let i=r.length-1;i>=0;i--)e+=r[i].nodeSize;n&&e++}return e}findAtPoint(e,n){if(this.find)for(let r=0;r-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let n=e.split("/"),r=this.options.context,i=!this.isOpen&&(!r||r.parent.type==this.nodes[0].type),o=-(r?r.depth+1:0)+(i?0:1),s=(l,u)=>{for(;l>=0;l--){let d=n[l];if(d==""){if(l==n.length-1||l==0)continue;for(;u>=o;u--)if(s(l-1,u))return!0;return!1}else{let f=u>0||u==0&&i?this.nodes[u].type:r&&u>=o?r.node(u-o).type:null;if(!f||f.name!=d&&f.groups.indexOf(d)==-1)return!1;u--}}return!0};return s(n.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let n=e.depth;n>=0;n--){let r=e.node(n).contentMatchAt(e.indexAfter(n)).defaultType;if(r&&r.isTextblock&&r.defaultAttrs)return r}for(let n in this.parser.schema.nodes){let r=this.parser.schema.nodes[n];if(r.isTextblock&&r.defaultAttrs)return r}}addPendingMark(e){let n=oO(e,this.top.pendingMarks);n&&this.top.stashMarks.push(n),this.top.pendingMarks=e.addToSet(this.top.pendingMarks)}removePendingMark(e,n){for(let r=this.open;r>=0;r--){let i=this.nodes[r];if(i.pendingMarks.lastIndexOf(e)>-1)i.pendingMarks=e.removeFromSet(i.pendingMarks);else{i.activeMarks=e.removeFromSet(i.activeMarks);let s=i.popFromStashMark(e);s&&i.type&&i.type.allowsMarkType(s.type)&&(i.activeMarks=s.addToSet(i.activeMarks))}if(i==n)break}}};function tO(t){for(let e=t.firstChild,n=null;e;e=e.nextSibling){let r=e.nodeType==1?e.nodeName.toLowerCase():null;r&&_y.hasOwnProperty(r)&&n?(n.appendChild(e),e=n):r=="li"?n=e:r&&(n=null)}}function nO(t,e){return(t.matches||t.msMatchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector).call(t,e)}function rO(t){let e=/\s*([\w-]+)\s*:\s*([^;]+)/g,n,r=[];for(;n=e.exec(t);)r.push(n[1],n[2].trim());return r}function ay(t){let e={};for(let n in t)e[n]=t[n];return e}function iO(t,e){let n=e.schema.nodes;for(let r in n){let i=n[r];if(!i.allowsMarkType(t))continue;let o=[],s=l=>{o.push(l);for(let u=0;u{if(o.length||s.marks.length){let l=0,u=0;for(;l=0;i--){let o=this.serializeMark(e.marks[i],e.isInline,n);o&&((o.contentDOM||o.dom).appendChild(r),r=o.dom)}return r}serializeMark(e,n,r={}){let i=this.marks[e.type.name];return i&&t.renderSpec(jd(r),i(e,n))}static renderSpec(e,n,r=null){if(typeof n=="string")return{dom:e.createTextNode(n)};if(n.nodeType!=null)return{dom:n};if(n.dom&&n.dom.nodeType!=null)return n;let i=n[0],o=i.indexOf(" ");o>0&&(r=i.slice(0,o),i=i.slice(o+1));let s,l=r?e.createElementNS(r,i):e.createElement(i),u=n[1],d=1;if(u&&typeof u=="object"&&u.nodeType==null&&!Array.isArray(u)){d=2;for(let f in u)if(u[f]!=null){let h=f.indexOf(" ");h>0?l.setAttributeNS(f.slice(0,h),f.slice(h+1),u[f]):l.setAttribute(f,u[f])}}for(let f=d;fd)throw new RangeError("Content hole must be the only child of its parent node");return{dom:l,contentDOM:l}}else{let{dom:m,contentDOM:b}=t.renderSpec(e,h,r);if(l.appendChild(m),b){if(s)throw new RangeError("Multiple content holes");s=b}}}return{dom:l,contentDOM:s}}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new t(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let n=ly(e.nodes);return n.text||(n.text=r=>r.text),n}static marksFromSchema(e){return ly(e.marks)}};function ly(t){let e={};for(let n in t){let r=t[n].spec.toDOM;r&&(e[n]=r)}return e}function jd(t){return t.document||window.document}var My=65535,Cy=Math.pow(2,16);function sO(t,e){return t+e*Cy}function Sy(t){return t&My}function aO(t){return(t-(t&My))/Cy}var ky=1,Ay=2,_l=4,Ny=8,Bs=class{constructor(e,n,r){this.pos=e,this.delInfo=n,this.recover=r}get deleted(){return(this.delInfo&Ny)>0}get deletedBefore(){return(this.delInfo&(ky|_l))>0}get deletedAfter(){return(this.delInfo&(Ay|_l))>0}get deletedAcross(){return(this.delInfo&_l)>0}},Dr=class t{constructor(e,n=!1){if(this.ranges=e,this.inverted=n,!e.length&&t.empty)return t.empty}recover(e){let n=0,r=Sy(e);if(!this.inverted)for(let i=0;ie)break;let d=this.ranges[l+o],f=this.ranges[l+s],h=u+d;if(e<=h){let m=d?e==u?-1:e==h?1:n:n,b=u+i+(m<0?0:f);if(r)return b;let y=e==(n<0?u:h)?null:sO(l/3,e-u),v=e==u?Ay:e==h?ky:_l;return(n<0?e!=u:e!=h)&&(v|=Ny),new Bs(b,v,y)}i+=f-d}return r?e+i:new Bs(e+i,0,null)}touches(e,n){let r=0,i=Sy(n),o=this.inverted?2:1,s=this.inverted?1:2;for(let l=0;le)break;let d=this.ranges[l+o],f=u+d;if(e<=f&&l==i*3)return!0;r+=this.ranges[l+s]-d}return!1}forEach(e){let n=this.inverted?2:1,r=this.inverted?1:2;for(let i=0,o=0;i=0;n--){let i=e.getMirror(n);this.appendMap(e.maps[n].invert(),i!=null&&i>n?r-i-1:void 0)}}invert(){let e=new t;return e.appendMappingInverted(this),e}map(e,n=1){if(this.mirror)return this._map(e,n,!0);for(let r=this.from;ro&&u!s.isAtom||!l.type.allowsMarkType(this.mark.type)?s:s.mark(this.mark.addToSet(s.marks)),i),n.openStart,n.openEnd);return qt.fromReplace(e,this.from,this.to,o)}invert(){return new Vi(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};zt.jsonID("addMark",Hs);var Vi=class t extends zt{constructor(e,n,r){super(),this.from=e,this.to=n,this.mark=r}apply(e){let n=e.slice(this.from,this.to),r=new Z(cf(n.content,i=>i.mark(this.mark.removeFromSet(i.marks)),e),n.openStart,n.openEnd);return qt.fromReplace(e,this.from,this.to,r)}invert(){return new Hs(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};zt.jsonID("removeMark",Vi);var zs=class t extends zt{constructor(e,n){super(),this.pos=e,this.mark=n}apply(e){let n=e.nodeAt(this.pos);if(!n)return qt.fail("No node at mark step's position");let r=n.type.create(n.attrs,null,this.mark.addToSet(n.marks));return qt.fromReplace(e,this.pos,this.pos+1,new Z(V.from(r),0,n.isLeaf?0:1))}invert(e){let n=e.nodeAt(this.pos);if(n){let r=this.mark.addToSet(n.marks);if(r.length==n.marks.length){for(let i=0;ir.pos?null:new t(n.pos,r.pos,i,o,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number"||typeof n.gapFrom!="number"||typeof n.gapTo!="number"||typeof n.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new t(n.from,n.to,n.gapFrom,n.gapTo,Z.fromJSON(e,n.slice),n.insert,!!n.structure)}};zt.jsonID("replaceAround",Tt);function af(t,e,n){let r=t.resolve(e),i=n-e,o=r.depth;for(;i>0&&o>0&&r.indexAfter(o)==r.node(o).childCount;)o--,i--;if(i>0){let s=r.node(o).maybeChild(r.indexAfter(o));for(;i>0;){if(!s||s.isLeaf)return!0;s=s.firstChild,i--}}return!1}function lO(t,e,n,r){let i=[],o=[],s,l;t.doc.nodesBetween(e,n,(u,d,f)=>{if(!u.isInline)return;let h=u.marks;if(!r.isInSet(h)&&f.type.allowsMarkType(r.type)){let m=Math.max(d,e),b=Math.min(d+u.nodeSize,n),y=r.addToSet(h);for(let v=0;vt.step(u)),o.forEach(u=>t.step(u))}function cO(t,e,n,r){let i=[],o=0;t.doc.nodesBetween(e,n,(s,l)=>{if(!s.isInline)return;o++;let u=null;if(r instanceof Ls){let d=s.marks,f;for(;f=r.isInSet(d);)(u||(u=[])).push(f),d=f.removeFromSet(d)}else r?r.isInSet(s.marks)&&(u=[r]):u=s.marks;if(u&&u.length){let d=Math.min(l+s.nodeSize,n);for(let f=0;ft.step(new Vi(s.from,s.to,s.style)))}function uO(t,e,n,r=n.contentMatch){let i=t.doc.nodeAt(e),o=[],s=e+1;for(let l=0;l=0;l--)t.step(o[l])}function dO(t,e,n){return(e==0||t.canReplace(e,t.childCount))&&(n==t.childCount||t.canReplace(0,n))}function Pr(t){let n=t.parent.content.cutByIndex(t.startIndex,t.endIndex);for(let r=t.depth;;--r){let i=t.$from.node(r),o=t.$from.index(r),s=t.$to.indexAfter(r);if(rn;y--)v||r.index(y)>0?(v=!0,f=V.from(r.node(y).copy(f)),h++):u--;let m=V.empty,b=0;for(let y=o,v=!1;y>n;y--)v||i.after(y+1)=0;s--){if(r.size){let l=n[s].type.contentMatch.matchFragment(r);if(!l||!l.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}r=V.from(n[s].type.create(n[s].attrs,r))}let i=e.start,o=e.end;t.step(new Tt(i,o,i,o,new Z(r,0,0),n.length,!0))}function gO(t,e,n,r,i){if(!r.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let o=t.steps.length;t.doc.nodesBetween(e,n,(s,l)=>{if(s.isTextblock&&!s.hasMarkup(r,i)&&bO(t.doc,t.mapping.slice(o).map(l),r)){t.clearIncompatible(t.mapping.slice(o).map(l,1),r);let u=t.mapping.slice(o),d=u.map(l,1),f=u.map(l+s.nodeSize,1);return t.step(new Tt(d,f,d+1,f-1,new Z(V.from(r.create(i,null,s.marks)),0,0),1,!0)),!1}})}function bO(t,e,n){let r=t.resolve(e),i=r.index();return r.parent.canReplaceWith(i,i+1,n)}function yO(t,e,n,r,i){let o=t.doc.nodeAt(e);if(!o)throw new RangeError("No node at given position");n||(n=o.type);let s=n.create(r,null,i||o.marks);if(o.isLeaf)return t.replaceWith(e,e+o.nodeSize,s);if(!n.validContent(o.content))throw new RangeError("Invalid content for node type "+n.name);t.step(new Tt(e,e+o.nodeSize,e+1,e+o.nodeSize-1,new Z(V.from(s),0,0),1,!0))}function zn(t,e,n=1,r){let i=t.resolve(e),o=i.depth-n,s=r&&r[r.length-1]||i.parent;if(o<0||i.parent.type.spec.isolating||!i.parent.canReplace(i.index(),i.parent.childCount)||!s.type.validContent(i.parent.content.cutByIndex(i.index(),i.parent.childCount)))return!1;for(let d=i.depth-1,f=n-2;d>o;d--,f--){let h=i.node(d),m=i.index(d);if(h.type.spec.isolating)return!1;let b=h.content.cutByIndex(m,h.childCount),y=r&&r[f+1];y&&(b=b.replaceChild(0,y.type.create(y.attrs)));let v=r&&r[f]||h;if(!h.canReplace(m+1,h.childCount)||!v.type.validContent(b))return!1}let l=i.indexAfter(o),u=r&&r[0];return i.node(o).canReplaceWith(l,l,u?u.type:i.node(o+1).type)}function EO(t,e,n=1,r){let i=t.doc.resolve(e),o=V.empty,s=V.empty;for(let l=i.depth,u=i.depth-n,d=n-1;l>u;l--,d--){o=V.from(i.node(l).copy(o));let f=r&&r[d];s=V.from(f?f.type.create(f.attrs,s):i.node(l).copy(s))}t.step(new dn(e,e,new Z(o.append(s),n,n),!0))}function rr(t,e){let n=t.resolve(e),r=n.index();return Oy(n.nodeBefore,n.nodeAfter)&&n.parent.canReplace(r,r+1)}function Oy(t,e){return!!(t&&e&&!t.isLeaf&&t.canAppend(e))}function Bo(t,e,n=-1){let r=t.resolve(e);for(let i=r.depth;;i--){let o,s,l=r.index(i);if(i==r.depth?(o=r.nodeBefore,s=r.nodeAfter):n>0?(o=r.node(i+1),l++,s=r.node(i).maybeChild(l)):(o=r.node(i).maybeChild(l-1),s=r.node(i+1)),o&&!o.isTextblock&&Oy(o,s)&&r.node(i).canReplace(l,l+1))return e;if(i==0)break;e=n<0?r.before(i):r.after(i)}}function vO(t,e,n){let r=new dn(e-n,e+n,Z.empty,!0);t.step(r)}function wO(t,e,n){let r=t.resolve(e);if(r.parent.canReplaceWith(r.index(),r.index(),n))return e;if(r.parentOffset==0)for(let i=r.depth-1;i>=0;i--){let o=r.index(i);if(r.node(i).canReplaceWith(o,o,n))return r.before(i+1);if(o>0)return null}if(r.parentOffset==r.parent.content.size)for(let i=r.depth-1;i>=0;i--){let o=r.indexAfter(i);if(r.node(i).canReplaceWith(o,o,n))return r.after(i+1);if(o=0;s--){let l=s==r.depth?0:r.pos<=(r.start(s+1)+r.end(s+1))/2?-1:1,u=r.index(s)+(l>0?1:0),d=r.node(s),f=!1;if(o==1)f=d.canReplace(u,u,i);else{let h=d.contentMatchAt(u).findWrapping(i.firstChild.type);f=h&&d.canReplaceWith(u,u,h[0])}if(f)return l==0?r.pos:l<0?r.before(s+1):r.after(s+1)}return null}function Cl(t,e,n=e,r=Z.empty){if(e==n&&!r.size)return null;let i=t.resolve(e),o=t.resolve(n);return Ry(i,o,r)?new dn(e,n,r):new lf(i,o,r).fit()}function Ry(t,e,n){return!n.openStart&&!n.openEnd&&t.start()==e.start()&&t.parent.canReplace(t.index(),e.index(),n.content)}var lf=class{constructor(e,n,r){this.$from=e,this.$to=n,this.unplaced=r,this.frontier=[],this.placed=V.empty;for(let i=0;i<=e.depth;i++){let o=e.node(i);this.frontier.push({type:o.type,match:o.contentMatchAt(e.indexAfter(i))})}for(let i=e.depth;i>0;i--)this.placed=V.from(e.node(i).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let d=this.findFittable();d?this.placeNodes(d):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),n=this.placed.size-this.depth-this.$from.depth,r=this.$from,i=this.close(e<0?this.$to:r.doc.resolve(e));if(!i)return null;let o=this.placed,s=r.depth,l=i.depth;for(;s&&l&&o.childCount==1;)o=o.firstChild.content,s--,l--;let u=new Z(o,s,l);return e>-1?new Tt(r.pos,e,this.$to.pos,this.$to.end(),u,n):u.size||r.pos!=this.$to.pos?new dn(r.pos,i.pos,u):null}findFittable(){let e=this.unplaced.openStart;for(let n=this.unplaced.content,r=0,i=this.unplaced.openEnd;r1&&(i=0),o.type.spec.isolating&&i<=r){e=r;break}n=o.content}for(let n=1;n<=2;n++)for(let r=n==1?e:this.unplaced.openStart;r>=0;r--){let i,o=null;r?(o=of(this.unplaced.content,r-1).firstChild,i=o.content):i=this.unplaced.content;let s=i.firstChild;for(let l=this.depth;l>=0;l--){let{type:u,match:d}=this.frontier[l],f,h=null;if(n==1&&(s?d.matchType(s.type)||(h=d.fillBefore(V.from(s),!1)):o&&u.compatibleContent(o.type)))return{sliceDepth:r,frontierDepth:l,parent:o,inject:h};if(n==2&&s&&(f=d.findWrapping(s.type)))return{sliceDepth:r,frontierDepth:l,parent:o,wrap:f};if(o&&d.matchType(o.type))break}}}openMore(){let{content:e,openStart:n,openEnd:r}=this.unplaced,i=of(e,n);return!i.childCount||i.firstChild.isLeaf?!1:(this.unplaced=new Z(e,n+1,Math.max(r,i.size+n>=e.size-r?n+1:0)),!0)}dropNode(){let{content:e,openStart:n,openEnd:r}=this.unplaced,i=of(e,n);if(i.childCount<=1&&n>0){let o=e.size-n<=n+i.size;this.unplaced=new Z(Ds(e,n-1,1),n-1,o?n-1:r)}else this.unplaced=new Z(Ds(e,n,1),n,r)}placeNodes({sliceDepth:e,frontierDepth:n,parent:r,inject:i,wrap:o}){for(;this.depth>n;)this.closeFrontierNode();if(o)for(let v=0;v1||u==0||v.content.size)&&(h=x,f.push(Iy(v.mark(m.allowedMarks(v.marks)),d==1?u:0,d==l.childCount?b:-1)))}let y=d==l.childCount;y||(b=-1),this.placed=Ps(this.placed,n,V.from(f)),this.frontier[n].match=h,y&&b<0&&r&&r.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let v=0,x=l;v1&&i==this.$to.end(--r);)++i;return i}findCloseLevel(e){e:for(let n=Math.min(this.depth,e.depth);n>=0;n--){let{match:r,type:i}=this.frontier[n],o=n=0;l--){let{match:u,type:d}=this.frontier[l],f=sf(e,l,d,u,!0);if(!f||f.childCount)continue e}return{depth:n,fit:s,move:o?e.doc.resolve(e.after(n+1)):e}}}}close(e){let n=this.findCloseLevel(e);if(!n)return null;for(;this.depth>n.depth;)this.closeFrontierNode();n.fit.childCount&&(this.placed=Ps(this.placed,n.depth,n.fit)),e=n.move;for(let r=n.depth+1;r<=e.depth;r++){let i=e.node(r),o=i.type.contentMatch.fillBefore(i.content,!0,e.index(r));this.openFrontierNode(i.type,i.attrs,o)}return e}openFrontierNode(e,n=null,r){let i=this.frontier[this.depth];i.match=i.match.matchType(e),this.placed=Ps(this.placed,this.depth,V.from(e.create(n,r))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let n=this.frontier.pop().match.fillBefore(V.empty,!0);n.childCount&&(this.placed=Ps(this.placed,this.frontier.length,n))}};function Ds(t,e,n){return e==0?t.cutByIndex(n,t.childCount):t.replaceChild(0,t.firstChild.copy(Ds(t.firstChild.content,e-1,n)))}function Ps(t,e,n){return e==0?t.append(n):t.replaceChild(t.childCount-1,t.lastChild.copy(Ps(t.lastChild.content,e-1,n)))}function of(t,e){for(let n=0;n1&&(r=r.replaceChild(0,Iy(r.firstChild,e-1,r.childCount==1?n-1:0))),e>0&&(r=t.type.contentMatch.fillBefore(r).append(r),n<=0&&(r=r.append(t.type.contentMatch.matchFragment(r).fillBefore(V.empty,!0)))),t.copy(r)}function sf(t,e,n,r,i){let o=t.node(e),s=i?t.indexAfter(e):t.index(e);if(s==o.childCount&&!n.compatibleContent(o.type))return null;let l=r.fillBefore(o.content,!0,s);return l&&!xO(n,o.content,s)?l:null}function xO(t,e,n){for(let r=n;r0;m--,b--){let y=i.node(m).type.spec;if(y.defining||y.definingAsContext||y.isolating)break;s.indexOf(m)>-1?l=m:i.before(m)==b&&s.splice(1,0,-m)}let u=s.indexOf(l),d=[],f=r.openStart;for(let m=r.content,b=0;;b++){let y=m.firstChild;if(d.push(y),b==r.openStart)break;m=y.content}for(let m=f-1;m>=0;m--){let b=d[m],y=_O(b.type);if(y&&!b.sameMarkup(i.node(Math.abs(l)-1)))f=m;else if(y||!b.type.isTextblock)break}for(let m=r.openStart;m>=0;m--){let b=(m+f+1)%(r.openStart+1),y=d[b];if(y)for(let v=0;v=0&&(t.replace(e,n,r),!(t.steps.length>h));m--){let b=s[m];b<0||(e=i.before(b),n=o.after(b))}}function Ly(t,e,n,r,i){if(er){let o=i.contentMatchAt(0),s=o.fillBefore(t).append(t);t=s.append(o.matchFragment(s).fillBefore(V.empty,!0))}return t}function TO(t,e,n,r){if(!r.isInline&&e==n&&t.doc.resolve(e).parent.content.size){let i=wO(t.doc,e,r.type);i!=null&&(e=n=i)}t.replaceRange(e,n,new Z(V.from(r),0,0))}function MO(t,e,n){let r=t.doc.resolve(e),i=t.doc.resolve(n),o=Dy(r,i);for(let s=0;s0&&(u||r.node(l-1).canReplace(r.index(l-1),i.indexAfter(l-1))))return t.delete(r.before(l),i.after(l))}for(let s=1;s<=r.depth&&s<=i.depth;s++)if(e-r.start(s)==r.depth-s&&n>r.end(s)&&i.end(s)-n!=i.depth-s)return t.delete(r.before(s),n);t.delete(e,n)}function Dy(t,e){let n=[],r=Math.min(t.depth,e.depth);for(let i=r;i>=0;i--){let o=t.start(i);if(oe.pos+(e.depth-i)||t.node(i).type.spec.isolating||e.node(i).type.spec.isolating)break;(o==e.start(i)||i==t.depth&&i==e.depth&&t.parent.inlineContent&&e.parent.inlineContent&&i&&e.start(i-1)==o-1)&&n.push(i)}return n}var Sl=class t extends zt{constructor(e,n,r){super(),this.pos=e,this.attr=n,this.value=r}apply(e){let n=e.nodeAt(this.pos);if(!n)return qt.fail("No node at attribute step's position");let r=Object.create(null);for(let o in n.attrs)r[o]=n.attrs[o];r[this.attr]=this.value;let i=n.type.create(r,null,n.marks);return qt.fromReplace(e,this.pos,this.pos+1,new Z(V.from(i),0,n.isLeaf?0:1))}getMap(){return Dr.empty}invert(e){return new t(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let n=e.mapResult(this.pos,1);return n.deletedAfter?null:new t(n.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.pos!="number"||typeof n.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new t(n.pos,n.attr,n.value)}};zt.jsonID("attr",Sl);var Tl=class t extends zt{constructor(e,n){super(),this.attr=e,this.value=n}apply(e){let n=Object.create(null);for(let i in e.attrs)n[i]=e.attrs[i];n[this.attr]=this.value;let r=e.type.create(n,e.content,e.marks);return qt.ok(r)}getMap(){return Dr.empty}invert(e){return new t(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new t(n.attr,n.value)}};zt.jsonID("docAttr",Tl);var Do=class extends Error{};Do=function t(e){let n=Error.call(this,e);return n.__proto__=t.prototype,n};Do.prototype=Object.create(Error.prototype);Do.prototype.constructor=Do;Do.prototype.name="TransformError";var ai=class{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new Fs}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let n=this.maybeStep(e);if(n.failed)throw new Do(n.failed);return this}maybeStep(e){let n=e.apply(this.doc);return n.failed||this.addStep(e,n.doc),n}get docChanged(){return this.steps.length>0}addStep(e,n){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=n}replace(e,n=e,r=Z.empty){let i=Cl(this.doc,e,n,r);return i&&this.step(i),this}replaceWith(e,n,r){return this.replace(e,n,new Z(V.from(r),0,0))}delete(e,n){return this.replace(e,n,Z.empty)}insert(e,n){return this.replaceWith(e,e,n)}replaceRange(e,n,r){return SO(this,e,n,r),this}replaceRangeWith(e,n,r){return TO(this,e,n,r),this}deleteRange(e,n){return MO(this,e,n),this}lift(e,n){return fO(this,e,n),this}join(e,n=1){return vO(this,e,n),this}wrap(e,n){return mO(this,e,n),this}setBlockType(e,n=e,r,i=null){return gO(this,e,n,r,i),this}setNodeMarkup(e,n,r=null,i){return yO(this,e,n,r,i),this}setNodeAttribute(e,n,r){return this.step(new Sl(e,n,r)),this}setDocAttribute(e,n){return this.step(new Tl(e,n)),this}addNodeMark(e,n){return this.step(new zs(e,n)),this}removeNodeMark(e,n){if(!(n instanceof Ye)){let r=this.doc.nodeAt(e);if(!r)throw new RangeError("No node at position "+e);if(n=n.isInSet(r.marks),!n)return this}return this.step(new Us(e,n)),this}split(e,n=1,r){return EO(this,e,n,r),this}addMark(e,n,r){return lO(this,e,n,r),this}removeMark(e,n,r){return cO(this,e,n,r),this}clearIncompatible(e,n,r){return uO(this,e,n,r),this}};var uf=Object.create(null),fe=class{constructor(e,n,r){this.$anchor=e,this.$head=n,this.ranges=r||[new Ws(e.min(n),e.max(n))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let n=0;n=0;o--){let s=n<0?Fo(e.node(0),e.node(o),e.before(o+1),e.index(o),n,r):Fo(e.node(0),e.node(o),e.after(o+1),e.index(o)+1,n,r);if(s)return s}return null}static near(e,n=1){return this.findFrom(e,n)||this.findFrom(e,-n)||new On(e.node(0))}static atStart(e){return Fo(e,e,0,0,1)||new On(e)}static atEnd(e){return Fo(e,e,e.content.size,e.childCount,-1)||new On(e)}static fromJSON(e,n){if(!n||!n.type)throw new RangeError("Invalid input for Selection.fromJSON");let r=uf[n.type];if(!r)throw new RangeError(`No selection type ${n.type} defined`);return r.fromJSON(e,n)}static jsonID(e,n){if(e in uf)throw new RangeError("Duplicate use of selection JSON ID "+e);return uf[e]=n,n.prototype.jsonID=e,n}getBookmark(){return ce.between(this.$anchor,this.$head).getBookmark()}};fe.prototype.visible=!0;var Ws=class{constructor(e,n){this.$from=e,this.$to=n}},Py=!1;function By(t){!Py&&!t.parent.inlineContent&&(Py=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+t.parent.type.name+")"))}var ce=class t extends fe{constructor(e,n=e){By(e),By(n),super(e,n)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,n){let r=e.resolve(n.map(this.head));if(!r.parent.inlineContent)return fe.near(r);let i=e.resolve(n.map(this.anchor));return new t(i.parent.inlineContent?i:r,r)}replace(e,n=Z.empty){if(super.replace(e,n),n==Z.empty){let r=this.$from.marksAcross(this.$to);r&&e.ensureMarks(r)}}eq(e){return e instanceof t&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new Al(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,n){if(typeof n.anchor!="number"||typeof n.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new t(e.resolve(n.anchor),e.resolve(n.head))}static create(e,n,r=n){let i=e.resolve(n);return new this(i,r==n?i:e.resolve(r))}static between(e,n,r){let i=e.pos-n.pos;if((!r||i)&&(r=i>=0?1:-1),!n.parent.inlineContent){let o=fe.findFrom(n,r,!0)||fe.findFrom(n,-r,!0);if(o)n=o.$head;else return fe.near(n,r)}return e.parent.inlineContent||(i==0?e=n:(e=(fe.findFrom(e,-r,!0)||fe.findFrom(e,r,!0)).$anchor,e.pos0?0:1);i>0?s=0;s+=i){let l=e.child(s);if(l.isAtom){if(!o&&he.isSelectable(l))return he.create(t,n-(i<0?l.nodeSize:0))}else{let u=Fo(t,l,n+i,i<0?l.childCount:0,i,o);if(u)return u}n+=l.nodeSize*i}return null}function Fy(t,e,n){let r=t.steps.length-1;if(r{s==null&&(s=f)}),t.setSelection(fe.near(t.doc.resolve(s),n))}var Hy=1,kl=2,zy=4,pf=class extends ai{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=kl,this}ensureMarks(e){return Ye.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(this.updated&kl)>0}addStep(e,n){super.addStep(e,n),this.updated=this.updated&~kl,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,n=!0){let r=this.selection;return n&&(e=e.mark(this.storedMarks||(r.empty?r.$from.marks():r.$from.marksAcross(r.$to)||Ye.none))),r.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,n,r){let i=this.doc.type.schema;if(n==null)return e?this.replaceSelectionWith(i.text(e),!0):this.deleteSelection();{if(r==null&&(r=n),r=r??n,!e)return this.deleteRange(n,r);let o=this.storedMarks;if(!o){let s=this.doc.resolve(n);o=r==n?s.marks():s.marksAcross(this.doc.resolve(r))}return this.replaceRangeWith(n,r,i.text(e,o)),this.selection.empty||this.setSelection(fe.near(this.selection.$to)),this}}setMeta(e,n){return this.meta[typeof e=="string"?e:e.key]=n,this}getMeta(e){return this.meta[typeof e=="string"?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=zy,this}get scrolledIntoView(){return(this.updated&zy)>0}};function Uy(t,e){return!e||!t?t:t.bind(e)}var Gi=class{constructor(e,n,r){this.name=e,this.init=Uy(n.init,r),this.apply=Uy(n.apply,r)}},kO=[new Gi("doc",{init(t){return t.doc||t.schema.topNodeType.createAndFill()},apply(t){return t.doc}}),new Gi("selection",{init(t,e){return t.selection||fe.atStart(e.doc)},apply(t){return t.selection}}),new Gi("storedMarks",{init(t){return t.storedMarks||null},apply(t,e,n,r){return r.selection.$cursor?t.storedMarks:null}}),new Gi("scrollToSelection",{init(){return 0},apply(t,e){return t.scrolledIntoView?e+1:e}})],$s=class{constructor(e,n){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=kO.slice(),n&&n.forEach(r=>{if(this.pluginsByKey[r.key])throw new RangeError("Adding different instances of a keyed plugin ("+r.key+")");this.plugins.push(r),this.pluginsByKey[r.key]=r,r.spec.state&&this.fields.push(new Gi(r.key,r.spec.state,r))})}},Nl=class t{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,n=-1){for(let r=0;rr.toJSON())),e&&typeof e=="object")for(let r in e){if(r=="doc"||r=="selection")throw new RangeError("The JSON fields `doc` and `selection` are reserved");let i=e[r],o=i.spec.state;o&&o.toJSON&&(n[r]=o.toJSON.call(i,this[i.key]))}return n}static fromJSON(e,n,r){if(!n)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let i=new $s(e.schema,e.plugins),o=new t(i);return i.fields.forEach(s=>{if(s.name=="doc")o.doc=nr.fromJSON(e.schema,n.doc);else if(s.name=="selection")o.selection=fe.fromJSON(o.doc,n.selection);else if(s.name=="storedMarks")n.storedMarks&&(o.storedMarks=n.storedMarks.map(e.schema.markFromJSON));else{if(r)for(let l in r){let u=r[l],d=u.spec.state;if(u.key==s.name&&d&&d.fromJSON&&Object.prototype.hasOwnProperty.call(n,l)){o[s.name]=d.fromJSON.call(u,e,n[l],o);return}}o[s.name]=s.init(e,o)}}),o}};function $y(t,e,n){for(let r in t){let i=t[r];i instanceof Function?i=i.bind(e):r=="handleDOMEvents"&&(i=$y(i,e,{})),n[r]=i}return n}var Pe=class{constructor(e){this.spec=e,this.props={},e.props&&$y(e.props,this,this.props),this.key=e.key?e.key.key:Wy("plugin")}getState(e){return e[this.key]}},df=Object.create(null);function Wy(t){return t in df?t+"$"+ ++df[t]:(df[t]=0,t+"$")}var qe=class{constructor(e="key"){this.key=Wy(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}};var fn=function(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e},qs=function(t){let e=t.assignedSlot||t.parentNode;return e&&e.nodeType==11?e.host:e},Ky=null,Fr=function(t,e,n){let r=Ky||(Ky=document.createRange());return r.setEnd(t,n??t.nodeValue.length),r.setStart(t,e||0),r},Qi=function(t,e,n,r){return n&&(Vy(t,e,n,r,-1)||Vy(t,e,n,r,1))},AO=/^(img|br|input|textarea|hr)$/i;function Vy(t,e,n,r,i){for(;;){if(t==n&&e==r)return!0;if(e==(i<0?0:hr(t))){let o=t.parentNode;if(!o||o.nodeType!=1||Pf(t)||AO.test(t.nodeName)||t.contentEditable=="false")return!1;e=fn(t)+(i<0?0:1),t=o}else if(t.nodeType==1){if(t=t.childNodes[e+(i<0?-1:0)],t.contentEditable=="false")return!1;e=i<0?hr(t):0}else return!1}}function hr(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function NO(t,e,n){for(let r=e==0,i=e==hr(t);r||i;){if(t==n)return!0;let o=fn(t);if(t=t.parentNode,!t)return!1;r=r&&o==0,i=i&&o==hr(t)}}function Pf(t){let e;for(let n=t;n&&!(e=n.pmViewDesc);n=n.parentNode);return e&&e.node&&e.node.isBlock&&(e.dom==t||e.contentDOM==t)}var Ul=function(t){return t.focusNode&&Qi(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)};function qi(t,e){let n=document.createEvent("Event");return n.initEvent("keydown",!0,!0),n.keyCode=t,n.key=n.code=e,n}function OO(t){let e=t.activeElement;for(;e&&e.shadowRoot;)e=e.shadowRoot.activeElement;return e}function RO(t,e,n){if(t.caretPositionFromPoint)try{let r=t.caretPositionFromPoint(e,n);if(r)return{node:r.offsetNode,offset:r.offset}}catch{}if(t.caretRangeFromPoint){let r=t.caretRangeFromPoint(e,n);if(r)return{node:r.startContainer,offset:r.startOffset}}}var mr=typeof navigator<"u"?navigator:null,Gy=typeof document<"u"?document:null,pi=mr&&mr.userAgent||"",yf=/Edge\/(\d+)/.exec(pi),_0=/MSIE \d/.exec(pi),Ef=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(pi),wn=!!(_0||Ef||yf),di=_0?document.documentMode:Ef?+Ef[1]:yf?+yf[1]:0,or=!wn&&/gecko\/(\d+)/i.test(pi);or&&+(/Firefox\/(\d+)/.exec(pi)||[0,0])[1];var vf=!wn&&/Chrome\/(\d+)/.exec(pi),nn=!!vf,IO=vf?+vf[1]:0,pn=!wn&&!!mr&&/Apple Computer/.test(mr.vendor),Wo=pn&&(/Mobile\/\w+/.test(pi)||!!mr&&mr.maxTouchPoints>2),Un=Wo||(mr?/Mac/.test(mr.platform):!1),LO=mr?/Win/.test(mr.platform):!1,ir=/Android \d/.test(pi),Zs=!!Gy&&"webkitFontSmoothing"in Gy.documentElement.style,DO=Zs?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function PO(t){return{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function Br(t,e){return typeof t=="number"?t:t[e]}function BO(t){let e=t.getBoundingClientRect(),n=e.width/t.offsetWidth||1,r=e.height/t.offsetHeight||1;return{left:e.left,right:e.left+t.clientWidth*n,top:e.top,bottom:e.top+t.clientHeight*r}}function qy(t,e,n){let r=t.someProp("scrollThreshold")||0,i=t.someProp("scrollMargin")||5,o=t.dom.ownerDocument;for(let s=n||t.dom;s;s=qs(s)){if(s.nodeType!=1)continue;let l=s,u=l==o.body,d=u?PO(o):BO(l),f=0,h=0;if(e.topd.bottom-Br(r,"bottom")&&(h=e.bottom-e.top>d.bottom-d.top?e.top+Br(i,"top")-d.top:e.bottom-d.bottom+Br(i,"bottom")),e.leftd.right-Br(r,"right")&&(f=e.right-d.right+Br(i,"right")),f||h)if(u)o.defaultView.scrollBy(f,h);else{let m=l.scrollLeft,b=l.scrollTop;h&&(l.scrollTop+=h),f&&(l.scrollLeft+=f);let y=l.scrollLeft-m,v=l.scrollTop-b;e={left:e.left-y,top:e.top-v,right:e.right-y,bottom:e.bottom-v}}if(u||/^(fixed|sticky)$/.test(getComputedStyle(s).position))break}}function FO(t){let e=t.dom.getBoundingClientRect(),n=Math.max(0,e.top),r,i;for(let o=(e.left+e.right)/2,s=n+1;s=n-20){r=l,i=u.top;break}}return{refDOM:r,refTop:i,stack:S0(t.dom)}}function S0(t){let e=[],n=t.ownerDocument;for(let r=t;r&&(e.push({dom:r,top:r.scrollTop,left:r.scrollLeft}),t!=n);r=qs(r));return e}function HO({refDOM:t,refTop:e,stack:n}){let r=t?t.getBoundingClientRect().top:0;T0(n,r==0?0:r-e)}function T0(t,e){for(let n=0;n=l){s=Math.max(y.bottom,s),l=Math.min(y.top,l);let v=y.left>e.left?y.left-e.left:y.right=(y.left+y.right)/2?1:0));continue}}else y.top>e.top&&!u&&y.left<=e.left&&y.right>=e.left&&(u=f,d={left:Math.max(y.left,Math.min(y.right,e.left)),top:y.top});!n&&(e.left>=y.right&&e.top>=y.top||e.left>=y.left&&e.top>=y.bottom)&&(o=h+1)}}return!n&&u&&(n=u,i=d,r=0),n&&n.nodeType==3?UO(n,i):!n||r&&n.nodeType==1?{node:t,offset:o}:M0(n,i)}function UO(t,e){let n=t.nodeValue.length,r=document.createRange();for(let i=0;i=(o.left+o.right)/2?1:0)}}return{node:t,offset:0}}function Bf(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function $O(t,e){let n=t.parentNode;return n&&/^li$/i.test(n.nodeName)&&e.left(s.left+s.right)/2?1:-1}return t.docView.posFromDOM(r,i,o)}function KO(t,e,n,r){let i=-1;for(let o=e,s=!1;o!=t.dom;){let l=t.docView.nearestDesc(o,!0);if(!l)return null;if(l.dom.nodeType==1&&(l.node.isBlock&&l.parent&&!s||!l.contentDOM)){let u=l.dom.getBoundingClientRect();if(l.node.isBlock&&l.parent&&!s&&(s=!0,u.left>r.left||u.top>r.top?i=l.posBefore:(u.right-1?i:t.docView.posFromDOM(e,n,-1)}function C0(t,e,n){let r=t.childNodes.length;if(r&&n.tope.top&&i++}let d;Zs&&i&&r.nodeType==1&&(d=r.childNodes[i-1]).nodeType==1&&d.contentEditable=="false"&&d.getBoundingClientRect().top>=e.top&&i--,r==t.dom&&i==r.childNodes.length-1&&r.lastChild.nodeType==1&&e.top>r.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:(i==0||r.nodeType!=1||r.childNodes[i-1].nodeName!="BR")&&(l=KO(t,r,i,e))}l==null&&(l=WO(t,s,e));let u=t.docView.nearestDesc(s,!0);return{pos:l,inside:u?u.posAtStart-u.border:-1}}function Yy(t){return t.top=0&&i==r.nodeValue.length?(u--,f=1):n<0?u--:d++,Ks(li(Fr(r,u,d),f),f<0)}if(!t.state.doc.resolve(e-(o||0)).parent.inlineContent){if(o==null&&i&&(n<0||i==hr(r))){let u=r.childNodes[i-1];if(u.nodeType==1)return hf(u.getBoundingClientRect(),!1)}if(o==null&&i=0)}if(o==null&&i&&(n<0||i==hr(r))){let u=r.childNodes[i-1],d=u.nodeType==3?Fr(u,hr(u)-(s?0:1)):u.nodeType==1&&(u.nodeName!="BR"||!u.nextSibling)?u:null;if(d)return Ks(li(d,1),!1)}if(o==null&&i=0)}function Ks(t,e){if(t.width==0)return t;let n=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:n,right:n}}function hf(t,e){if(t.height==0)return t;let n=e?t.top:t.bottom;return{top:n,bottom:n,left:t.left,right:t.right}}function A0(t,e,n){let r=t.state,i=t.root.activeElement;r!=e&&t.updateState(e),i!=t.dom&&t.focus();try{return n()}finally{r!=e&&t.updateState(r),i!=t.dom&&i&&i.focus()}}function qO(t,e,n){let r=e.selection,i=n=="up"?r.$from:r.$to;return A0(t,e,()=>{let{node:o}=t.docView.domFromPos(i.pos,n=="up"?-1:1);for(;;){let l=t.docView.nearestDesc(o,!0);if(!l)break;if(l.node.isBlock){o=l.contentDOM||l.dom;break}o=l.dom.parentNode}let s=k0(t,i.pos,1);for(let l=o.firstChild;l;l=l.nextSibling){let u;if(l.nodeType==1)u=l.getClientRects();else if(l.nodeType==3)u=Fr(l,0,l.nodeValue.length).getClientRects();else continue;for(let d=0;df.top+1&&(n=="up"?s.top-f.top>(f.bottom-s.top)*2:f.bottom-s.bottom>(s.bottom-f.top)*2))return!1}}return!0})}var YO=/[\u0590-\u08ac]/;function JO(t,e,n){let{$head:r}=e.selection;if(!r.parent.isTextblock)return!1;let i=r.parentOffset,o=!i,s=i==r.parent.content.size,l=t.domSelection();return!YO.test(r.parent.textContent)||!l.modify?n=="left"||n=="backward"?o:s:A0(t,e,()=>{let{focusNode:u,focusOffset:d,anchorNode:f,anchorOffset:h}=t.domSelectionRange(),m=l.caretBidiLevel;l.modify("move",n,"character");let b=r.depth?t.docView.domAfterPos(r.before()):t.dom,{focusNode:y,focusOffset:v}=t.domSelectionRange(),x=y&&!b.contains(y.nodeType==1?y:y.parentNode)||u==y&&d==v;try{l.collapse(f,h),u&&(u!=f||d!=h)&&l.extend&&l.extend(u,d)}catch{}return m!=null&&(l.caretBidiLevel=m),x})}var Jy=null,Xy=null,Zy=!1;function XO(t,e,n){return Jy==e&&Xy==n?Zy:(Jy=e,Xy=n,Zy=n=="up"||n=="down"?qO(t,e,n):JO(t,e,n))}var $n=0,jy=1,Yi=2,gr=3,eo=class{constructor(e,n,r,i){this.parent=e,this.children=n,this.dom=r,this.contentDOM=i,this.dirty=$n,r.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,n,r){return!1}matchesHack(e){return!1}parseRule(){return null}stopEvent(e){return!1}get size(){let e=0;for(let n=0;nfn(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))i=e.compareDocumentPosition(this.contentDOM)&2;else if(this.dom.firstChild){if(n==0)for(let o=e;;o=o.parentNode){if(o==this.dom){i=!1;break}if(o.previousSibling)break}if(i==null&&n==e.childNodes.length)for(let o=e;;o=o.parentNode){if(o==this.dom){i=!0;break}if(o.nextSibling)break}}return i??r>0?this.posAtEnd:this.posAtStart}nearestDesc(e,n=!1){for(let r=!0,i=e;i;i=i.parentNode){let o=this.getDesc(i),s;if(o&&(!n||o.node))if(r&&(s=o.nodeDOM)&&!(s.nodeType==1?s.contains(e.nodeType==1?e:e.parentNode):s==e))r=!1;else return o}}getDesc(e){let n=e.pmViewDesc;for(let r=n;r;r=r.parent)if(r==this)return n}posFromDOM(e,n,r){for(let i=e;i;i=i.parentNode){let o=this.getDesc(i);if(o)return o.localPosFromDOM(e,n,r)}return-1}descAt(e){for(let n=0,r=0;ne||s instanceof Il){i=e-o;break}o=l}if(i)return this.children[r].domFromPos(i-this.children[r].border,n);for(let o;r&&!(o=this.children[r-1]).size&&o instanceof Ol&&o.side>=0;r--);if(n<=0){let o,s=!0;for(;o=r?this.children[r-1]:null,!(!o||o.dom.parentNode==this.contentDOM);r--,s=!1);return o&&n&&s&&!o.border&&!o.domAtom?o.domFromPos(o.size,n):{node:this.contentDOM,offset:o?fn(o.dom)+1:0}}else{let o,s=!0;for(;o=r=f&&n<=d-u.border&&u.node&&u.contentDOM&&this.contentDOM.contains(u.contentDOM))return u.parseRange(e,n,f);e=s;for(let h=l;h>0;h--){let m=this.children[h-1];if(m.size&&m.dom.parentNode==this.contentDOM&&!m.emptyChildAt(1)){i=fn(m.dom)+1;break}e-=m.size}i==-1&&(i=0)}if(i>-1&&(d>n||l==this.children.length-1)){n=d;for(let f=l+1;fb&&sn){let b=l;l=u,u=b}let m=document.createRange();m.setEnd(u.node,u.offset),m.setStart(l.node,l.offset),d.removeAllRanges(),d.addRange(m)}}ignoreMutation(e){return!this.contentDOM&&e.type!="selection"}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,n){for(let r=0,i=0;i=r:er){let l=r+o.border,u=s-o.border;if(e>=l&&n<=u){this.dirty=e==r||n==s?Yi:jy,e==l&&n==u&&(o.contentLost||o.dom.parentNode!=this.contentDOM)?o.dirty=gr:o.markDirty(e-l,n-l);return}else o.dirty=o.dom==o.contentDOM&&o.dom.parentNode==this.contentDOM&&!o.children.length?Yi:gr}r=s}this.dirty=Yi}markParentsDirty(){let e=1;for(let n=this.parent;n;n=n.parent,e++){let r=e==1?Yi:jy;n.dirty{if(!o)return i;if(o.parent)return o.parent.posBeforeChild(o)})),!n.type.spec.raw){if(s.nodeType!=1){let l=document.createElement("span");l.appendChild(s),s=l}s.contentEditable="false",s.classList.add("ProseMirror-widget")}super(e,[],s,null),this.widget=n,this.widget=n,o=this}matchesWidget(e){return this.dirty==$n&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let n=this.widget.spec.stopEvent;return n?n(e):!1}ignoreMutation(e){return e.type!="selection"||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get side(){return this.widget.type.side}},wf=class extends eo{constructor(e,n,r,i){super(e,[],n,null),this.textDOM=r,this.text=i}get size(){return this.text.length}localPosFromDOM(e,n){return e!=this.textDOM?this.posAtStart+(n?this.size:0):this.posAtStart+n}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return e.type==="characterData"&&e.target.nodeValue==e.oldValue}},Ko=class t extends eo{constructor(e,n,r,i){super(e,[],r,i),this.mark=n}static create(e,n,r,i){let o=i.nodeViews[n.type.name],s=o&&o(n,i,r);return(!s||!s.dom)&&(s=Lr.renderSpec(document,n.type.spec.toDOM(n,r))),new t(e,n,s.dom,s.contentDOM||s.dom)}parseRule(){return this.dirty&gr||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return this.dirty!=gr&&this.mark.eq(e)}markDirty(e,n){if(super.markDirty(e,n),this.dirty!=$n){let r=this.parent;for(;!r.node;)r=r.parent;r.dirty0&&(o=Mf(o,0,e,r));for(let l=0;l{if(!u)return s;if(u.parent)return u.parent.posBeforeChild(u)},r,i),f=d&&d.dom,h=d&&d.contentDOM;if(n.isText){if(!f)f=document.createTextNode(n.text);else if(f.nodeType!=3)throw new RangeError("Text must be rendered as a DOM text node")}else f||({dom:f,contentDOM:h}=Lr.renderSpec(document,n.type.spec.toDOM(n)));!h&&!n.isText&&f.nodeName!="BR"&&(f.hasAttribute("contenteditable")||(f.contentEditable="false"),n.type.spec.draggable&&(f.draggable=!0));let m=f;return f=R0(f,r,n),d?u=new xf(e,n,r,i,f,h||null,m,d,o,s+1):n.isText?new Rl(e,n,r,i,f,m,o):new t(e,n,r,i,f,h||null,m,o,s+1)}parseRule(){if(this.node.type.spec.reparseInView)return null;let e={node:this.node.type.name,attrs:this.node.attrs};if(this.node.type.whitespace=="pre"&&(e.preserveWhitespace="full"),!this.contentDOM)e.getContent=()=>this.node.content;else if(!this.contentLost)e.contentElement=this.contentDOM;else{for(let n=this.children.length-1;n>=0;n--){let r=this.children[n];if(this.dom.contains(r.dom.parentNode)){e.contentElement=r.dom.parentNode;break}}e.contentElement||(e.getContent=()=>V.empty)}return e}matchesNode(e,n,r){return this.dirty==$n&&e.eq(this.node)&&Sf(n,this.outerDeco)&&r.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,n){let r=this.node.inlineContent,i=n,o=e.composing?this.localCompositionInfo(e,n):null,s=o&&o.pos>-1?o:null,l=o&&o.pos<0,u=new Tf(this,s&&s.node,e);eR(this.node,this.innerDeco,(d,f,h)=>{d.spec.marks?u.syncToMarks(d.spec.marks,r,e):d.type.side>=0&&!h&&u.syncToMarks(f==this.node.childCount?Ye.none:this.node.child(f).marks,r,e),u.placeWidget(d,e,i)},(d,f,h,m)=>{u.syncToMarks(d.marks,r,e);let b;u.findNodeMatch(d,f,h,m)||l&&e.state.selection.from>i&&e.state.selection.to-1&&u.updateNodeAt(d,f,h,b,e)||u.updateNextNode(d,f,h,e,m,i)||u.addNode(d,f,h,e,i),i+=d.nodeSize}),u.syncToMarks([],r,e),this.node.isTextblock&&u.addTextblockHacks(),u.destroyRest(),(u.changed||this.dirty==Yi)&&(s&&this.protectLocalComposition(e,s),N0(this.contentDOM,this.children,e),Wo&&tR(this.dom))}localCompositionInfo(e,n){let{from:r,to:i}=e.state.selection;if(!(e.state.selection instanceof ce)||rn+this.node.content.size)return null;let o=e.domSelectionRange(),s=nR(o.focusNode,o.focusOffset);if(!s||!this.dom.contains(s.parentNode))return null;if(this.node.inlineContent){let l=s.nodeValue,u=rR(this.node.content,l,r-n,i-n);return u<0?null:{node:s,pos:u,text:l}}else return{node:s,pos:-1,text:""}}protectLocalComposition(e,{node:n,pos:r,text:i}){if(this.getDesc(n))return;let o=n;for(;o.parentNode!=this.contentDOM;o=o.parentNode){for(;o.previousSibling;)o.parentNode.removeChild(o.previousSibling);for(;o.nextSibling;)o.parentNode.removeChild(o.nextSibling);o.pmViewDesc&&(o.pmViewDesc=void 0)}let s=new wf(this,o,n,i);e.input.compositionNodes.push(s),this.children=Mf(this.children,r,r+i.length,e,s)}update(e,n,r,i){return this.dirty==gr||!e.sameMarkup(this.node)?!1:(this.updateInner(e,n,r,i),!0)}updateInner(e,n,r,i){this.updateOuterDeco(n),this.node=e,this.innerDeco=r,this.contentDOM&&this.updateChildren(i,this.posAtStart),this.dirty=$n}updateOuterDeco(e){if(Sf(e,this.outerDeco))return;let n=this.nodeDOM.nodeType!=1,r=this.dom;this.dom=O0(this.dom,this.nodeDOM,_f(this.outerDeco,this.node,n),_f(e,this.node,n)),this.dom!=r&&(r.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){this.nodeDOM.nodeType==1&&this.nodeDOM.classList.add("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&(this.dom.draggable=!0)}deselectNode(){this.nodeDOM.nodeType==1&&this.nodeDOM.classList.remove("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&this.dom.removeAttribute("draggable")}get domAtom(){return this.node.isAtom}};function Qy(t,e,n,r,i){R0(r,e,t);let o=new fi(void 0,t,e,n,r,r,r,i,0);return o.contentDOM&&o.updateChildren(i,0),o}var Rl=class t extends fi{constructor(e,n,r,i,o,s,l){super(e,n,r,i,o,null,s,l,0)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,n,r,i){return this.dirty==gr||this.dirty!=$n&&!this.inParent()||!e.sameMarkup(this.node)?!1:(this.updateOuterDeco(n),(this.dirty!=$n||e.text!=this.node.text)&&e.text!=this.nodeDOM.nodeValue&&(this.nodeDOM.nodeValue=e.text,i.trackWrites==this.nodeDOM&&(i.trackWrites=null)),this.node=e,this.dirty=$n,!0)}inParent(){let e=this.parent.contentDOM;for(let n=this.nodeDOM;n;n=n.parentNode)if(n==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,n,r){return e==this.nodeDOM?this.posAtStart+Math.min(n,this.node.text.length):super.localPosFromDOM(e,n,r)}ignoreMutation(e){return e.type!="characterData"&&e.type!="selection"}slice(e,n,r){let i=this.node.cut(e,n),o=document.createTextNode(i.text);return new t(this.parent,i,this.outerDeco,this.innerDeco,o,o,r)}markDirty(e,n){super.markDirty(e,n),this.dom!=this.nodeDOM&&(e==0||n==this.nodeDOM.nodeValue.length)&&(this.dirty=gr)}get domAtom(){return!1}},Il=class extends eo{parseRule(){return{ignore:!0}}matchesHack(e){return this.dirty==$n&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return this.dom.nodeName=="IMG"}},xf=class extends fi{constructor(e,n,r,i,o,s,l,u,d,f){super(e,n,r,i,o,s,l,d,f),this.spec=u}update(e,n,r,i){if(this.dirty==gr)return!1;if(this.spec.update){let o=this.spec.update(e,n,r);return o&&this.updateInner(e,n,r,i),o}else return!this.contentDOM&&!e.isLeaf?!1:super.update(e,n,r,i)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,n,r,i){this.spec.setSelection?this.spec.setSelection(e,n,r):super.setSelection(e,n,r,i)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return this.spec.stopEvent?this.spec.stopEvent(e):!1}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}};function N0(t,e,n){let r=t.firstChild,i=!1;for(let o=0;o>1,s=Math.min(o,e.length);for(;i-1)l>this.index&&(this.changed=!0,this.destroyBetween(this.index,l)),this.top=this.top.children[this.index];else{let u=Ko.create(this.top,e[o],n,r);this.top.children.splice(this.index,0,u),this.top=u,this.changed=!0}this.index=0,o++}}findNodeMatch(e,n,r,i){let o=-1,s;if(i>=this.preMatch.index&&(s=this.preMatch.matches[i-this.preMatch.index]).parent==this.top&&s.matchesNode(e,n,r))o=this.top.children.indexOf(s,this.index);else for(let l=this.index,u=Math.min(this.top.children.length,l+5);l0;){let l;for(;;)if(r){let d=n.children[r-1];if(d instanceof Ko)n=d,r=d.children.length;else{l=d,r--;break}}else{if(n==e)break e;r=n.parent.children.indexOf(n),n=n.parent}let u=l.node;if(u){if(u!=t.child(i-1))break;--i,o.set(l,i),s.push(l)}}return{index:i,matched:o,matches:s.reverse()}}function QO(t,e){return t.type.side-e.type.side}function eR(t,e,n,r){let i=e.locals(t),o=0;if(i.length==0){for(let d=0;do;)l.push(i[s++]);let y=o+m.nodeSize;if(m.isText){let x=y;s!x.inline):l.slice();r(m,v,e.forChild(o,m),b),o=y}}function tR(t){if(t.nodeName=="UL"||t.nodeName=="OL"){let e=t.style.cssText;t.style.cssText=e+"; list-style: square !important",window.getComputedStyle(t).listStyle,t.style.cssText=e}}function nR(t,e){for(;;){if(t.nodeType==3)return t;if(t.nodeType==1&&e>0){if(t.childNodes.length>e&&t.childNodes[e].nodeType==3)return t.childNodes[e];t=t.childNodes[e-1],e=hr(t)}else if(t.nodeType==1&&e=n){if(o>=r&&u.slice(r-e.length-l,r-l)==e)return r-e.length;let d=l=0&&d+e.length+l>=n)return l+d;if(n==r&&u.length>=r+e.length-l&&u.slice(r-l,r-l+e.length)==e)return r}}return-1}function Mf(t,e,n,r,i){let o=[];for(let s=0,l=0;s=n||f<=e?o.push(u):(dn&&o.push(u.slice(n-d,u.size,r)))}return o}function Ff(t,e=null){let n=t.domSelectionRange(),r=t.state.doc;if(!n.focusNode)return null;let i=t.docView.nearestDesc(n.focusNode),o=i&&i.size==0,s=t.docView.posFromDOM(n.focusNode,n.focusOffset,1);if(s<0)return null;let l=r.resolve(s),u,d;if(Ul(n)){for(u=l;i&&!i.node;)i=i.parent;let f=i.node;if(i&&f.isAtom&&he.isSelectable(f)&&i.parent&&!(f.isInline&&NO(n.focusNode,n.focusOffset,i.dom))){let h=i.posBefore;d=new he(s==h?l:r.resolve(h))}}else{let f=t.docView.posFromDOM(n.anchorNode,n.anchorOffset,1);if(f<0)return null;u=r.resolve(f)}if(!d){let f=e=="pointer"||t.state.selection.head{(n.anchorNode!=r||n.anchorOffset!=i)&&(e.removeEventListener("selectionchange",t.input.hideSelectionGuard),setTimeout(()=>{(!I0(t)||t.state.selection.visible)&&t.dom.classList.remove("ProseMirror-hideselection")},20))})}function oR(t){let e=t.domSelection(),n=document.createRange(),r=t.cursorWrapper.dom,i=r.nodeName=="IMG";i?n.setEnd(r.parentNode,fn(r)+1):n.setEnd(r,0),n.collapse(!1),e.removeAllRanges(),e.addRange(n),!i&&!t.state.selection.visible&&wn&&di<=11&&(r.disabled=!0,r.disabled=!1)}function L0(t,e){if(e instanceof he){let n=t.docView.descAt(e.from);n!=t.lastSelectedViewDesc&&(i0(t),n&&n.selectNode(),t.lastSelectedViewDesc=n)}else i0(t)}function i0(t){t.lastSelectedViewDesc&&(t.lastSelectedViewDesc.parent&&t.lastSelectedViewDesc.deselectNode(),t.lastSelectedViewDesc=void 0)}function Hf(t,e,n,r){return t.someProp("createSelectionBetween",i=>i(t,e,n))||ce.between(e,n,r)}function o0(t){return t.editable&&!t.hasFocus()?!1:D0(t)}function D0(t){let e=t.domSelectionRange();if(!e.anchorNode)return!1;try{return t.dom.contains(e.anchorNode.nodeType==3?e.anchorNode.parentNode:e.anchorNode)&&(t.editable||t.dom.contains(e.focusNode.nodeType==3?e.focusNode.parentNode:e.focusNode))}catch{return!1}}function sR(t){let e=t.docView.domFromPos(t.state.selection.anchor,0),n=t.domSelectionRange();return Qi(e.node,e.offset,n.anchorNode,n.anchorOffset)}function Cf(t,e){let{$anchor:n,$head:r}=t.selection,i=e>0?n.max(r):n.min(r),o=i.parent.inlineContent?i.depth?t.doc.resolve(e>0?i.after():i.before()):null:i;return o&&fe.findFrom(o,e)}function ci(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function s0(t,e,n){let r=t.state.selection;if(r instanceof ce)if(n.indexOf("s")>-1){let{$head:i}=r,o=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter;if(!o||o.isText||!o.isLeaf)return!1;let s=t.state.doc.resolve(i.pos+o.nodeSize*(e<0?-1:1));return ci(t,new ce(r.$anchor,s))}else if(r.empty){if(t.endOfTextblock(e>0?"forward":"backward")){let i=Cf(t.state,e);return i&&i instanceof he?ci(t,i):!1}else if(!(Un&&n.indexOf("m")>-1)){let i=r.$head,o=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter,s;if(!o||o.isText)return!1;let l=e<0?i.pos-o.nodeSize:i.pos;return o.isAtom||(s=t.docView.descAt(l))&&!s.contentDOM?he.isSelectable(o)?ci(t,new he(e<0?t.state.doc.resolve(i.pos-o.nodeSize):i)):Zs?ci(t,new ce(t.state.doc.resolve(e<0?l:l+o.nodeSize))):!1:!1}}else return!1;else{if(r instanceof he&&r.node.isInline)return ci(t,new ce(e>0?r.$to:r.$from));{let i=Cf(t.state,e);return i?ci(t,i):!1}}}function Ll(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function Gs(t,e){let n=t.pmViewDesc;return n&&n.size==0&&(e<0||t.nextSibling||t.nodeName!="BR")}function zo(t,e){return e<0?aR(t):lR(t)}function aR(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let i,o,s=!1;for(or&&n.nodeType==1&&r0){if(n.nodeType!=1)break;{let l=n.childNodes[r-1];if(Gs(l,-1))i=n,o=--r;else if(l.nodeType==3)n=l,r=n.nodeValue.length;else break}}else{if(P0(n))break;{let l=n.previousSibling;for(;l&&Gs(l,-1);)i=n.parentNode,o=fn(l),l=l.previousSibling;if(l)n=l,r=Ll(n);else{if(n=n.parentNode,n==t.dom)break;r=0}}}s?kf(t,n,r):i&&kf(t,i,o)}function lR(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let i=Ll(n),o,s;for(;;)if(r{t.state==i&&Hr(t)},50)}function a0(t,e){let n=t.state.doc.resolve(e);if(!(nn||LO)&&n.parent.inlineContent){let i=t.coordsAtPos(e);if(e>n.start()){let o=t.coordsAtPos(e-1),s=(o.top+o.bottom)/2;if(s>i.top&&s1)return o.lefti.top&&s1)return o.left>i.left?"ltr":"rtl"}}return getComputedStyle(t.dom).direction=="rtl"?"rtl":"ltr"}function l0(t,e,n){let r=t.state.selection;if(r instanceof ce&&!r.empty||n.indexOf("s")>-1||Un&&n.indexOf("m")>-1)return!1;let{$from:i,$to:o}=r;if(!i.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){let s=Cf(t.state,e);if(s&&s instanceof he)return ci(t,s)}if(!i.parent.inlineContent){let s=e<0?i:o,l=r instanceof On?fe.near(s,e):fe.findFrom(s,e);return l?ci(t,l):!1}return!1}function c0(t,e){if(!(t.state.selection instanceof ce))return!0;let{$head:n,$anchor:r,empty:i}=t.state.selection;if(!n.sameParent(r))return!0;if(!i)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;let o=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(o&&!o.isText){let s=t.state.tr;return e<0?s.delete(n.pos-o.nodeSize,n.pos):s.delete(n.pos,n.pos+o.nodeSize),t.dispatch(s),!0}return!1}function u0(t,e,n){t.domObserver.stop(),e.contentEditable=n,t.domObserver.start()}function dR(t){if(!pn||t.state.selection.$head.parentOffset>0)return!1;let{focusNode:e,focusOffset:n}=t.domSelectionRange();if(e&&e.nodeType==1&&n==0&&e.firstChild&&e.firstChild.contentEditable=="false"){let r=e.firstChild;u0(t,r,"true"),setTimeout(()=>u0(t,r,"false"),20)}return!1}function fR(t){let e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}function pR(t,e){let n=e.keyCode,r=fR(e);if(n==8||Un&&n==72&&r=="c")return c0(t,-1)||zo(t,-1);if(n==46&&!e.shiftKey||Un&&n==68&&r=="c")return c0(t,1)||zo(t,1);if(n==13||n==27)return!0;if(n==37||Un&&n==66&&r=="c"){let i=n==37?a0(t,t.state.selection.from)=="ltr"?-1:1:-1;return s0(t,i,r)||zo(t,i)}else if(n==39||Un&&n==70&&r=="c"){let i=n==39?a0(t,t.state.selection.from)=="ltr"?1:-1:1;return s0(t,i,r)||zo(t,i)}else{if(n==38||Un&&n==80&&r=="c")return l0(t,-1,r)||zo(t,-1);if(n==40||Un&&n==78&&r=="c")return dR(t)||l0(t,1,r)||zo(t,1);if(r==(Un?"m":"c")&&(n==66||n==73||n==89||n==90))return!0}return!1}function B0(t,e){t.someProp("transformCopied",b=>{e=b(e,t)});let n=[],{content:r,openStart:i,openEnd:o}=e;for(;i>1&&o>1&&r.childCount==1&&r.firstChild.childCount==1;){i--,o--;let b=r.firstChild;n.push(b.type.name,b.attrs!=b.type.defaultAttrs?b.attrs:null),r=b.content}let s=t.someProp("clipboardSerializer")||Lr.fromSchema(t.state.schema),l=W0(),u=l.createElement("div");u.appendChild(s.serializeFragment(r,{document:l}));let d=u.firstChild,f,h=0;for(;d&&d.nodeType==1&&(f=$0[d.nodeName.toLowerCase()]);){for(let b=f.length-1;b>=0;b--){let y=l.createElement(f[b]);for(;u.firstChild;)y.appendChild(u.firstChild);u.appendChild(y),h++}d=u.firstChild}d&&d.nodeType==1&&d.setAttribute("data-pm-slice",`${i} ${o}${h?` -${h}`:""} ${JSON.stringify(n)}`);let m=t.someProp("clipboardTextSerializer",b=>b(e,t))||e.content.textBetween(0,e.content.size,` - -`);return{dom:u,text:m}}function F0(t,e,n,r,i){let o=i.parent.type.spec.code,s,l;if(!n&&!e)return null;let u=e&&(r||o||!n);if(u){if(t.someProp("transformPastedText",m=>{e=m(e,o||r,t)}),o)return e?new Z(V.from(t.state.schema.text(e.replace(/\r\n?/g,` -`))),0,0):Z.empty;let h=t.someProp("clipboardTextParser",m=>m(e,i,r,t));if(h)l=h;else{let m=i.marks(),{schema:b}=t.state,y=Lr.fromSchema(b);s=document.createElement("div"),e.split(/(?:\r\n?|\n)+/).forEach(v=>{let x=s.appendChild(document.createElement("p"));v&&x.appendChild(y.serializeNode(b.text(v,m)))})}}else t.someProp("transformPastedHTML",h=>{n=h(n,t)}),s=gR(n),Zs&&bR(s);let d=s&&s.querySelector("[data-pm-slice]"),f=d&&/^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(d.getAttribute("data-pm-slice")||"");if(f&&f[3])for(let h=+f[3];h>0;h--){let m=s.firstChild;for(;m&&m.nodeType!=1;)m=m.nextSibling;if(!m)break;s=m}if(l||(l=(t.someProp("clipboardParser")||t.someProp("domParser")||Ki.fromSchema(t.state.schema)).parseSlice(s,{preserveWhitespace:!!(u||f),context:i,ruleFromNode(m){return m.nodeName=="BR"&&!m.nextSibling&&m.parentNode&&!hR.test(m.parentNode.nodeName)?{ignore:!0}:null}})),f)l=yR(d0(l,+f[1],+f[2]),f[4]);else if(l=Z.maxOpen(mR(l.content,i),!0),l.openStart||l.openEnd){let h=0,m=0;for(let b=l.content.firstChild;h{l=h(l,t)}),l}var hR=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function mR(t,e){if(t.childCount<2)return t;for(let n=e.depth;n>=0;n--){let i=e.node(n).contentMatchAt(e.index(n)),o,s=[];if(t.forEach(l=>{if(!s)return;let u=i.findWrapping(l.type),d;if(!u)return s=null;if(d=s.length&&o.length&&z0(u,o,l,s[s.length-1],0))s[s.length-1]=d;else{s.length&&(s[s.length-1]=U0(s[s.length-1],o.length));let f=H0(l,u);s.push(f),i=i.matchType(f.type),o=u}}),s)return V.from(s)}return t}function H0(t,e,n=0){for(let r=e.length-1;r>=n;r--)t=e[r].create(null,V.from(t));return t}function z0(t,e,n,r,i){if(i1&&(o=0),i=n&&(l=e<0?s.contentMatchAt(0).fillBefore(l,o<=i).append(l):l.append(s.contentMatchAt(s.childCount).fillBefore(V.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(l))}function d0(t,e,n){return e]*>)*/.exec(t);e&&(t=t.slice(e[0].length));let n=W0().createElement("div"),r=/<([a-z][^>\s]+)/i.exec(t),i;if((i=r&&$0[r[1].toLowerCase()])&&(t=i.map(o=>"<"+o+">").join("")+t+i.map(o=>"").reverse().join("")),n.innerHTML=t,i)for(let o=0;o=0;l-=2){let u=n.nodes[r[l]];if(!u||u.hasRequiredAttrs())break;i=V.from(u.create(r[l+1],i)),o++,s++}return new Z(i,o,s)}var hn={},mn={},ER={touchstart:!0,touchmove:!0},Nf=class{constructor(){this.shiftKey=!1,this.mouseDown=null,this.lastKeyCode=null,this.lastKeyCodeTime=0,this.lastClick={time:0,x:0,y:0,type:""},this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastIOSEnter=0,this.lastIOSEnterFallbackTimeout=-1,this.lastFocus=0,this.lastTouch=0,this.lastAndroidDelete=0,this.composing=!1,this.composingTimeout=-1,this.compositionNodes=[],this.compositionEndedAt=-2e8,this.compositionID=1,this.compositionPendingChanges=0,this.domChangeCount=0,this.eventHandlers=Object.create(null),this.hideSelectionGuard=null}};function vR(t){for(let e in hn){let n=hn[e];t.dom.addEventListener(e,t.input.eventHandlers[e]=r=>{xR(t,r)&&!zf(t,r)&&(t.editable||!(r.type in mn))&&n(t,r)},ER[e]?{passive:!0}:void 0)}pn&&t.dom.addEventListener("input",()=>null),Of(t)}function ui(t,e){t.input.lastSelectionOrigin=e,t.input.lastSelectionTime=Date.now()}function wR(t){t.domObserver.stop();for(let e in t.input.eventHandlers)t.dom.removeEventListener(e,t.input.eventHandlers[e]);clearTimeout(t.input.composingTimeout),clearTimeout(t.input.lastIOSEnterFallbackTimeout)}function Of(t){t.someProp("handleDOMEvents",e=>{for(let n in e)t.input.eventHandlers[n]||t.dom.addEventListener(n,t.input.eventHandlers[n]=r=>zf(t,r))})}function zf(t,e){return t.someProp("handleDOMEvents",n=>{let r=n[e.type];return r?r(t,e)||e.defaultPrevented:!1})}function xR(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let n=e.target;n!=t.dom;n=n.parentNode)if(!n||n.nodeType==11||n.pmViewDesc&&n.pmViewDesc.stopEvent(e))return!1;return!0}function _R(t,e){!zf(t,e)&&hn[e.type]&&(t.editable||!(e.type in mn))&&hn[e.type](t,e)}mn.keydown=(t,e)=>{let n=e;if(t.input.shiftKey=n.keyCode==16||n.shiftKey,!V0(t,n)&&(t.input.lastKeyCode=n.keyCode,t.input.lastKeyCodeTime=Date.now(),!(ir&&nn&&n.keyCode==13)))if(n.keyCode!=229&&t.domObserver.forceFlush(),Wo&&n.keyCode==13&&!n.ctrlKey&&!n.altKey&&!n.metaKey){let r=Date.now();t.input.lastIOSEnter=r,t.input.lastIOSEnterFallbackTimeout=setTimeout(()=>{t.input.lastIOSEnter==r&&(t.someProp("handleKeyDown",i=>i(t,qi(13,"Enter"))),t.input.lastIOSEnter=0)},200)}else t.someProp("handleKeyDown",r=>r(t,n))||pR(t,n)?n.preventDefault():ui(t,"key")};mn.keyup=(t,e)=>{e.keyCode==16&&(t.input.shiftKey=!1)};mn.keypress=(t,e)=>{let n=e;if(V0(t,n)||!n.charCode||n.ctrlKey&&!n.altKey||Un&&n.metaKey)return;if(t.someProp("handleKeyPress",i=>i(t,n))){n.preventDefault();return}let r=t.state.selection;if(!(r instanceof ce)||!r.$from.sameParent(r.$to)){let i=String.fromCharCode(n.charCode);!/[\r\n]/.test(i)&&!t.someProp("handleTextInput",o=>o(t,r.$from.pos,r.$to.pos,i))&&t.dispatch(t.state.tr.insertText(i).scrollIntoView()),n.preventDefault()}};function $l(t){return{left:t.clientX,top:t.clientY}}function SR(t,e){let n=e.x-t.clientX,r=e.y-t.clientY;return n*n+r*r<100}function Uf(t,e,n,r,i){if(r==-1)return!1;let o=t.state.doc.resolve(r);for(let s=o.depth+1;s>0;s--)if(t.someProp(e,l=>s>o.depth?l(t,n,o.nodeAfter,o.before(s),i,!0):l(t,n,o.node(s),o.before(s),i,!1)))return!0;return!1}function $o(t,e,n){t.focused||t.focus();let r=t.state.tr.setSelection(e);n=="pointer"&&r.setMeta("pointer",!0),t.dispatch(r)}function TR(t,e){if(e==-1)return!1;let n=t.state.doc.resolve(e),r=n.nodeAfter;return r&&r.isAtom&&he.isSelectable(r)?($o(t,new he(n),"pointer"),!0):!1}function MR(t,e){if(e==-1)return!1;let n=t.state.selection,r,i;n instanceof he&&(r=n.node);let o=t.state.doc.resolve(e);for(let s=o.depth+1;s>0;s--){let l=s>o.depth?o.nodeAfter:o.node(s);if(he.isSelectable(l)){r&&n.$from.depth>0&&s>=n.$from.depth&&o.before(n.$from.depth+1)==n.$from.pos?i=o.before(n.$from.depth):i=o.before(s);break}}return i!=null?($o(t,he.create(t.state.doc,i),"pointer"),!0):!1}function CR(t,e,n,r,i){return Uf(t,"handleClickOn",e,n,r)||t.someProp("handleClick",o=>o(t,e,r))||(i?MR(t,n):TR(t,n))}function kR(t,e,n,r){return Uf(t,"handleDoubleClickOn",e,n,r)||t.someProp("handleDoubleClick",i=>i(t,e,r))}function AR(t,e,n,r){return Uf(t,"handleTripleClickOn",e,n,r)||t.someProp("handleTripleClick",i=>i(t,e,r))||NR(t,n,r)}function NR(t,e,n){if(n.button!=0)return!1;let r=t.state.doc;if(e==-1)return r.inlineContent?($o(t,ce.create(r,0,r.content.size),"pointer"),!0):!1;let i=r.resolve(e);for(let o=i.depth+1;o>0;o--){let s=o>i.depth?i.nodeAfter:i.node(o),l=i.before(o);if(s.inlineContent)$o(t,ce.create(r,l+1,l+1+s.content.size),"pointer");else if(he.isSelectable(s))$o(t,he.create(r,l),"pointer");else continue;return!0}}function $f(t){return Dl(t)}var K0=Un?"metaKey":"ctrlKey";hn.mousedown=(t,e)=>{let n=e;t.input.shiftKey=n.shiftKey;let r=$f(t),i=Date.now(),o="singleClick";i-t.input.lastClick.time<500&&SR(n,t.input.lastClick)&&!n[K0]&&(t.input.lastClick.type=="singleClick"?o="doubleClick":t.input.lastClick.type=="doubleClick"&&(o="tripleClick")),t.input.lastClick={time:i,x:n.clientX,y:n.clientY,type:o};let s=t.posAtCoords($l(n));s&&(o=="singleClick"?(t.input.mouseDown&&t.input.mouseDown.done(),t.input.mouseDown=new Rf(t,s,n,!!r)):(o=="doubleClick"?kR:AR)(t,s.pos,s.inside,n)?n.preventDefault():ui(t,"pointer"))};var Rf=class{constructor(e,n,r,i){this.view=e,this.pos=n,this.event=r,this.flushed=i,this.delayedSelectionSync=!1,this.mightDrag=null,this.startDoc=e.state.doc,this.selectNode=!!r[K0],this.allowDefault=r.shiftKey;let o,s;if(n.inside>-1)o=e.state.doc.nodeAt(n.inside),s=n.inside;else{let f=e.state.doc.resolve(n.pos);o=f.parent,s=f.depth?f.before():0}let l=i?null:r.target,u=l?e.docView.nearestDesc(l,!0):null;this.target=u?u.dom:null;let{selection:d}=e.state;(r.button==0&&o.type.spec.draggable&&o.type.spec.selectable!==!1||d instanceof he&&d.from<=s&&d.to>s)&&(this.mightDrag={node:o,pos:s,addAttr:!!(this.target&&!this.target.draggable),setUneditable:!!(this.target&&or&&!this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout(()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")},20),this.view.domObserver.start()),e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this)),ui(e,"pointer")}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout(()=>Hr(this.view)),this.view.input.mouseDown=null}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let n=this.pos;this.view.state.doc!=this.startDoc&&(n=this.view.posAtCoords($l(e))),this.updateAllowDefault(e),this.allowDefault||!n?ui(this.view,"pointer"):CR(this.view,n.pos,n.inside,e,this.selectNode)?e.preventDefault():e.button==0&&(this.flushed||pn&&this.mightDrag&&!this.mightDrag.node.isAtom||nn&&!this.view.state.selection.visible&&Math.min(Math.abs(n.pos-this.view.state.selection.from),Math.abs(n.pos-this.view.state.selection.to))<=2)?($o(this.view,fe.near(this.view.state.doc.resolve(n.pos)),"pointer"),e.preventDefault()):ui(this.view,"pointer")}move(e){this.updateAllowDefault(e),ui(this.view,"pointer"),e.buttons==0&&this.done()}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}};hn.touchstart=t=>{t.input.lastTouch=Date.now(),$f(t),ui(t,"pointer")};hn.touchmove=t=>{t.input.lastTouch=Date.now(),ui(t,"pointer")};hn.contextmenu=t=>$f(t);function V0(t,e){return t.composing?!0:pn&&Math.abs(e.timeStamp-t.input.compositionEndedAt)<500?(t.input.compositionEndedAt=-2e8,!0):!1}var OR=ir?5e3:-1;mn.compositionstart=mn.compositionupdate=t=>{if(!t.composing){t.domObserver.flush();let{state:e}=t,n=e.selection.$from;if(e.selection.empty&&(e.storedMarks||!n.textOffset&&n.parentOffset&&n.nodeBefore.marks.some(r=>r.type.spec.inclusive===!1)))t.markCursor=t.state.storedMarks||n.marks(),Dl(t,!0),t.markCursor=null;else if(Dl(t),or&&e.selection.empty&&n.parentOffset&&!n.textOffset&&n.nodeBefore.marks.length){let r=t.domSelectionRange();for(let i=r.focusNode,o=r.focusOffset;i&&i.nodeType==1&&o!=0;){let s=o<0?i.lastChild:i.childNodes[o-1];if(!s)break;if(s.nodeType==3){t.domSelection().collapse(s,s.nodeValue.length);break}else i=s,o=-1}}t.input.composing=!0}G0(t,OR)};mn.compositionend=(t,e)=>{t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=e.timeStamp,t.input.compositionPendingChanges=t.domObserver.pendingRecords().length?t.input.compositionID:0,t.input.compositionPendingChanges&&Promise.resolve().then(()=>t.domObserver.flush()),t.input.compositionID++,G0(t,20))};function G0(t,e){clearTimeout(t.input.composingTimeout),e>-1&&(t.input.composingTimeout=setTimeout(()=>Dl(t),e))}function q0(t){for(t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=RR());t.input.compositionNodes.length>0;)t.input.compositionNodes.pop().markParentsDirty()}function RR(){let t=document.createEvent("Event");return t.initEvent("event",!0,!0),t.timeStamp}function Dl(t,e=!1){if(!(ir&&t.domObserver.flushingSoon>=0)){if(t.domObserver.forceFlush(),q0(t),e||t.docView&&t.docView.dirty){let n=Ff(t);return n&&!n.eq(t.state.selection)?t.dispatch(t.state.tr.setSelection(n)):t.updateState(t.state),!0}return!1}}function IR(t,e){if(!t.dom.parentNode)return;let n=t.dom.parentNode.appendChild(document.createElement("div"));n.appendChild(e),n.style.cssText="position: fixed; left: -10000px; top: 10px";let r=getSelection(),i=document.createRange();i.selectNodeContents(e),t.dom.blur(),r.removeAllRanges(),r.addRange(i),setTimeout(()=>{n.parentNode&&n.parentNode.removeChild(n),t.focus()},50)}var Ys=wn&&di<15||Wo&&DO<604;hn.copy=mn.cut=(t,e)=>{let n=e,r=t.state.selection,i=n.type=="cut";if(r.empty)return;let o=Ys?null:n.clipboardData,s=r.content(),{dom:l,text:u}=B0(t,s);o?(n.preventDefault(),o.clearData(),o.setData("text/html",l.innerHTML),o.setData("text/plain",u)):IR(t,l),i&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))};function LR(t){return t.openStart==0&&t.openEnd==0&&t.content.childCount==1?t.content.firstChild:null}function DR(t,e){if(!t.dom.parentNode)return;let n=t.input.shiftKey||t.state.selection.$from.parent.type.spec.code,r=t.dom.parentNode.appendChild(document.createElement(n?"textarea":"div"));n||(r.contentEditable="true"),r.style.cssText="position: fixed; left: -10000px; top: 10px",r.focus();let i=t.input.shiftKey&&t.input.lastKeyCode!=45;setTimeout(()=>{t.focus(),r.parentNode&&r.parentNode.removeChild(r),n?Js(t,r.value,null,i,e):Js(t,r.textContent,r.innerHTML,i,e)},50)}function Js(t,e,n,r,i){let o=F0(t,e,n,r,t.state.selection.$from);if(t.someProp("handlePaste",u=>u(t,i,o||Z.empty)))return!0;if(!o)return!1;let s=LR(o),l=s?t.state.tr.replaceSelectionWith(s,r):t.state.tr.replaceSelection(o);return t.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function Y0(t){let e=t.getData("text/plain")||t.getData("Text");if(e)return e;let n=t.getData("text/uri-list");return n?n.replace(/\r?\n/g," "):""}mn.paste=(t,e)=>{let n=e;if(t.composing&&!ir)return;let r=Ys?null:n.clipboardData,i=t.input.shiftKey&&t.input.lastKeyCode!=45;r&&Js(t,Y0(r),r.getData("text/html"),i,n)?n.preventDefault():DR(t,n)};var Pl=class{constructor(e,n,r){this.slice=e,this.move=n,this.node=r}},J0=Un?"altKey":"ctrlKey";hn.dragstart=(t,e)=>{let n=e,r=t.input.mouseDown;if(r&&r.done(),!n.dataTransfer)return;let i=t.state.selection,o=i.empty?null:t.posAtCoords($l(n)),s;if(!(o&&o.pos>=i.from&&o.pos<=(i instanceof he?i.to-1:i.to))){if(r&&r.mightDrag)s=he.create(t.state.doc,r.mightDrag.pos);else if(n.target&&n.target.nodeType==1){let f=t.docView.nearestDesc(n.target,!0);f&&f.node.type.spec.draggable&&f!=t.docView&&(s=he.create(t.state.doc,f.posBefore))}}let l=(s||t.state.selection).content(),{dom:u,text:d}=B0(t,l);n.dataTransfer.clearData(),n.dataTransfer.setData(Ys?"Text":"text/html",u.innerHTML),n.dataTransfer.effectAllowed="copyMove",Ys||n.dataTransfer.setData("text/plain",d),t.dragging=new Pl(l,!n[J0],s)};hn.dragend=t=>{let e=t.dragging;window.setTimeout(()=>{t.dragging==e&&(t.dragging=null)},50)};mn.dragover=mn.dragenter=(t,e)=>e.preventDefault();mn.drop=(t,e)=>{let n=e,r=t.dragging;if(t.dragging=null,!n.dataTransfer)return;let i=t.posAtCoords($l(n));if(!i)return;let o=t.state.doc.resolve(i.pos),s=r&&r.slice;s?t.someProp("transformPasted",y=>{s=y(s,t)}):s=F0(t,Y0(n.dataTransfer),Ys?null:n.dataTransfer.getData("text/html"),!1,o);let l=!!(r&&!n[J0]);if(t.someProp("handleDrop",y=>y(t,n,s||Z.empty,l))){n.preventDefault();return}if(!s)return;n.preventDefault();let u=s?Ml(t.state.doc,o.pos,s):o.pos;u==null&&(u=o.pos);let d=t.state.tr;if(l){let{node:y}=r;y?y.replace(d):d.deleteSelection()}let f=d.mapping.map(u),h=s.openStart==0&&s.openEnd==0&&s.content.childCount==1,m=d.doc;if(h?d.replaceRangeWith(f,f,s.content.firstChild):d.replaceRange(f,f,s),d.doc.eq(m))return;let b=d.doc.resolve(f);if(h&&he.isSelectable(s.content.firstChild)&&b.nodeAfter&&b.nodeAfter.sameMarkup(s.content.firstChild))d.setSelection(new he(b));else{let y=d.mapping.map(u);d.mapping.maps[d.mapping.maps.length-1].forEach((v,x,M,D)=>y=D),d.setSelection(Hf(t,b,d.doc.resolve(y)))}t.focus(),t.dispatch(d.setMeta("uiEvent","drop"))};hn.focus=t=>{t.input.lastFocus=Date.now(),t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout(()=>{t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.domSelectionRange())&&Hr(t)},20))};hn.blur=(t,e)=>{let n=e;t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),n.relatedTarget&&t.dom.contains(n.relatedTarget)&&t.domObserver.currentSelection.clear(),t.focused=!1)};hn.beforeinput=(t,e)=>{if(nn&&ir&&e.inputType=="deleteContentBackward"){t.domObserver.flushSoon();let{domChangeCount:r}=t.input;setTimeout(()=>{if(t.input.domChangeCount!=r||(t.dom.blur(),t.focus(),t.someProp("handleKeyDown",o=>o(t,qi(8,"Backspace")))))return;let{$cursor:i}=t.state.selection;i&&i.pos>0&&t.dispatch(t.state.tr.delete(i.pos-1,i.pos).scrollIntoView())},50)}};for(let t in mn)hn[t]=mn[t];function Xs(t,e){if(t==e)return!0;for(let n in t)if(t[n]!==e[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}var Bl=class t{constructor(e,n){this.toDOM=e,this.spec=n||Zi,this.side=this.spec.side||0}map(e,n,r,i){let{pos:o,deleted:s}=e.mapResult(n.from+i,this.side<0?-1:1);return s?null:new Mt(o-r,o-r,this)}valid(){return!0}eq(e){return this==e||e instanceof t&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&Xs(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}},Xi=class t{constructor(e,n){this.attrs=e,this.spec=n||Zi}map(e,n,r,i){let o=e.map(n.from+i,this.spec.inclusiveStart?-1:1)-r,s=e.map(n.to+i,this.spec.inclusiveEnd?1:-1)-r;return o>=s?null:new Mt(o,s,this)}valid(e,n){return n.from=e&&(!o||o(l.spec))&&r.push(l.copy(l.from+i,l.to+i))}for(let s=0;se){let l=this.children[s]+1;this.children[s+2].findInner(e-l,n-l,r,i+l,o)}}map(e,n,r){return this==tn||e.maps.length==0?this:this.mapInner(e,n,0,0,r||Zi)}mapInner(e,n,r,i,o){let s;for(let l=0;l{let d=u+r,f;if(f=Z0(n,l,d)){for(i||(i=this.children.slice());ol&&h.to=e){this.children[l]==e&&(r=this.children[l+2]);break}let o=e+1,s=o+n.content.size;for(let l=0;lo&&u.type instanceof Xi){let d=Math.max(o,u.from)-o,f=Math.min(s,u.to)-o;di.map(e,n,Zi));return t.from(r)}forChild(e,n){if(n.isLeaf)return lt.empty;let r=[];for(let i=0;in instanceof lt)?e:e.reduce((n,r)=>n.concat(r instanceof lt?r:r.members),[]))}}};function PR(t,e,n,r,i,o,s){let l=t.slice();for(let d=0,f=o;d{let x=v-y-(b-m);for(let M=0;MD+f-h)continue;let L=l[M]+f-h;b>=L?l[M+1]=m<=L?-2:-1:m>=f&&x&&(l[M]+=x,l[M+1]+=x)}h+=x}),f=n.maps[d].map(f,-1)}let u=!1;for(let d=0;d=r.content.size){u=!0;continue}let m=n.map(t[d+1]+o,-1),b=m-i,{index:y,offset:v}=r.content.findIndex(h),x=r.maybeChild(y);if(x&&v==h&&v+x.nodeSize==b){let M=l[d+2].mapInner(n,x,f+1,t[d]+o+1,s);M!=tn?(l[d]=h,l[d+1]=b,l[d+2]=M):(l[d+1]=-2,u=!0)}else u=!0}if(u){let d=BR(l,t,e,n,i,o,s),f=Hl(d,r,0,s);e=f.local;for(let h=0;hn&&s.to{let d=Z0(t,l,u+n);if(d){o=!0;let f=Hl(d,l,n+u+1,r);f!=tn&&i.push(u,u+l.nodeSize,f)}});let s=X0(o?j0(t):t,-n).sort(ji);for(let l=0;l0;)e++;t.splice(e,0,n)}function gf(t){let e=[];return t.someProp("decorations",n=>{let r=n(t.state);r&&r!=tn&&e.push(r)}),t.cursorWrapper&&e.push(lt.create(t.state.doc,[t.cursorWrapper.deco])),Fl.from(e)}var FR={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},HR=wn&&di<=11,Lf=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}},Df=class{constructor(e,n){this.view=e,this.handleDOMChange=n,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new Lf,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.observer=window.MutationObserver&&new window.MutationObserver(r=>{for(let i=0;ii.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),HR&&(this.onCharData=r=>{this.queue.push({target:r.target,type:"characterData",oldValue:r.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout(()=>{this.flushingSoon=-1,this.flush()},20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,FR)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let n=0;nthis.flush(),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout(()=>this.suppressingSelectionUpdates=!1,50)}onSelectionChange(){if(o0(this.view)){if(this.suppressingSelectionUpdates)return Hr(this.view);if(wn&&di<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&Qi(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let n=new Set,r;for(let o=e.focusNode;o;o=qs(o))n.add(o);for(let o=e.anchorNode;o;o=qs(o))if(n.has(o)){r=o;break}let i=r&&this.view.docView.nearestDesc(r);if(i&&i.ignoreMutation({type:"selection",target:r.nodeType==3?r.parentNode:r}))return this.setCurSelection(),!0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let n=this.pendingRecords();n.length&&(this.queue=[]);let r=e.domSelectionRange(),i=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(r)&&o0(e)&&!this.ignoreSelectionChange(r),o=-1,s=-1,l=!1,u=[];if(e.editable)for(let f=0;f1){let f=u.filter(h=>h.nodeName=="BR");if(f.length==2){let h=f[0],m=f[1];h.parentNode&&h.parentNode.parentNode==m.parentNode?m.remove():h.remove()}}let d=null;o<0&&i&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||i)&&(o>-1&&(e.docView.markDirty(o,s),zR(e)),this.handleDOMChange(o,s,l,u),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(r)||Hr(e),this.currentSelection.set(r))}registerMutation(e,n){if(n.indexOf(e.target)>-1)return null;let r=this.view.docView.nearestDesc(e.target);if(e.type=="attributes"&&(r==this.view.docView||e.attributeName=="contenteditable"||e.attributeName=="style"&&!e.oldValue&&!e.target.getAttribute("style"))||!r||r.ignoreMutation(e))return null;if(e.type=="childList"){for(let f=0;fi;x--){let M=r.childNodes[x-1],D=M.pmViewDesc;if(M.nodeName=="BR"&&!D){o=x;break}if(!D||D.size)break}let h=t.state.doc,m=t.someProp("domParser")||Ki.fromSchema(t.state.schema),b=h.resolve(s),y=null,v=m.parse(r,{topNode:b.parent,topMatch:b.parent.contentMatchAt(b.index()),topOpen:!0,from:i,to:o,preserveWhitespace:b.parent.type.whitespace=="pre"?"full":!0,findPositions:d,ruleFromNode:WR,context:b});if(d&&d[0].pos!=null){let x=d[0].pos,M=d[1]&&d[1].pos;M==null&&(M=x),y={anchor:x+s,head:M+s}}return{doc:v,sel:y,from:s,to:l}}function WR(t){let e=t.pmViewDesc;if(e)return e.parseRule();if(t.nodeName=="BR"&&t.parentNode){if(pn&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){let n=document.createElement("div");return n.appendChild(document.createElement("li")),{skip:n}}else if(t.parentNode.lastChild==t||pn&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if(t.nodeName=="IMG"&&t.getAttribute("mark-placeholder"))return{ignore:!0};return null}var KR=/^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;function VR(t,e,n,r,i){let o=t.input.compositionPendingChanges||(t.composing?t.input.compositionID:0);if(t.input.compositionPendingChanges=0,e<0){let W=t.input.lastSelectionTime>Date.now()-50?t.input.lastSelectionOrigin:null,ue=Ff(t,W);if(ue&&!t.state.selection.eq(ue)){if(nn&&ir&&t.input.lastKeyCode===13&&Date.now()-100Te(t,qi(13,"Enter"))))return;let ye=t.state.tr.setSelection(ue);W=="pointer"?ye.setMeta("pointer",!0):W=="key"&&ye.scrollIntoView(),o&&ye.setMeta("composition",o),t.dispatch(ye)}return}let s=t.state.doc.resolve(e),l=s.sharedDepth(n);e=s.before(l+1),n=t.state.doc.resolve(n).after(l+1);let u=t.state.selection,d=$R(t,e,n),f=t.state.doc,h=f.slice(d.from,d.to),m,b;t.input.lastKeyCode===8&&Date.now()-100Date.now()-225||ir)&&i.some(W=>W.nodeType==1&&!KR.test(W.nodeName))&&(!y||y.endA>=y.endB)&&t.someProp("handleKeyDown",W=>W(t,qi(13,"Enter")))){t.input.lastIOSEnter=0;return}if(!y)if(r&&u instanceof ce&&!u.empty&&u.$head.sameParent(u.$anchor)&&!t.composing&&!(d.sel&&d.sel.anchor!=d.sel.head))y={start:u.from,endA:u.to,endB:u.to};else{if(d.sel){let W=g0(t,t.state.doc,d.sel);if(W&&!W.eq(t.state.selection)){let ue=t.state.tr.setSelection(W);o&&ue.setMeta("composition",o),t.dispatch(ue)}}return}if(nn&&t.cursorWrapper&&d.sel&&d.sel.anchor==t.cursorWrapper.deco.from&&d.sel.head==d.sel.anchor){let W=y.endB-y.start;d.sel={anchor:d.sel.anchor+W,head:d.sel.anchor+W}}t.input.domChangeCount++,t.state.selection.fromt.state.selection.from&&y.start<=t.state.selection.from+2&&t.state.selection.from>=d.from?y.start=t.state.selection.from:y.endA=t.state.selection.to-2&&t.state.selection.to<=d.to&&(y.endB+=t.state.selection.to-y.endA,y.endA=t.state.selection.to)),wn&&di<=11&&y.endB==y.start+1&&y.endA==y.start&&y.start>d.from&&d.doc.textBetween(y.start-d.from-1,y.start-d.from+1)==" \xA0"&&(y.start--,y.endA--,y.endB--);let v=d.doc.resolveNoCache(y.start-d.from),x=d.doc.resolveNoCache(y.endB-d.from),M=f.resolve(y.start),D=v.sameParent(x)&&v.parent.inlineContent&&M.end()>=y.endA,L;if((Wo&&t.input.lastIOSEnter>Date.now()-225&&(!D||i.some(W=>W.nodeName=="DIV"||W.nodeName=="P"))||!D&&v.posW(t,qi(13,"Enter")))){t.input.lastIOSEnter=0;return}if(t.state.selection.anchor>y.start&&qR(f,y.start,y.endA,v,x)&&t.someProp("handleKeyDown",W=>W(t,qi(8,"Backspace")))){ir&&nn&&t.domObserver.suppressSelectionUpdates();return}nn&&ir&&y.endB==y.start&&(t.input.lastAndroidDelete=Date.now()),ir&&!D&&v.start()!=x.start()&&x.parentOffset==0&&v.depth==x.depth&&d.sel&&d.sel.anchor==d.sel.head&&d.sel.head==y.endA&&(y.endB-=2,x=d.doc.resolveNoCache(y.endB-d.from),setTimeout(()=>{t.someProp("handleKeyDown",function(W){return W(t,qi(13,"Enter"))})},20));let S=y.start,z=y.endA,O,q,J;if(D){if(v.pos==x.pos)wn&&di<=11&&v.parentOffset==0&&(t.domObserver.suppressSelectionUpdates(),setTimeout(()=>Hr(t),20)),O=t.state.tr.delete(S,z),q=f.resolve(y.start).marksAcross(f.resolve(y.endA));else if(y.endA==y.endB&&(J=GR(v.parent.content.cut(v.parentOffset,x.parentOffset),M.parent.content.cut(M.parentOffset,y.endA-M.start()))))O=t.state.tr,J.type=="add"?O.addMark(S,z,J.mark):O.removeMark(S,z,J.mark);else if(v.parent.child(v.index()).isText&&v.index()==x.index()-(x.textOffset?0:1)){let W=v.parent.textBetween(v.parentOffset,x.parentOffset);if(t.someProp("handleTextInput",ue=>ue(t,S,z,W)))return;O=t.state.tr.insertText(W,S,z)}}if(O||(O=t.state.tr.replace(S,z,d.doc.slice(y.start-d.from,y.endB-d.from))),d.sel){let W=g0(t,O.doc,d.sel);W&&!(nn&&ir&&t.composing&&W.empty&&(y.start!=y.endB||t.input.lastAndroidDeletee.content.size?null:Hf(t,e.resolve(n.anchor),e.resolve(n.head))}function GR(t,e){let n=t.firstChild.marks,r=e.firstChild.marks,i=n,o=r,s,l,u;for(let f=0;ff.mark(l.addToSet(f.marks));else if(i.length==0&&o.length==1)l=o[0],s="remove",u=f=>f.mark(l.removeFromSet(f.marks));else return null;let d=[];for(let f=0;fn||bf(s,!0,!1)0&&(e||t.indexAfter(r)==t.node(r).childCount);)r--,i++,e=!1;if(n){let o=t.node(r).maybeChild(t.indexAfter(r));for(;o&&!o.isLeaf;)o=o.firstChild,i++}return i}function YR(t,e,n,r,i){let o=t.findDiffStart(e,n);if(o==null)return null;let{a:s,b:l}=t.findDiffEnd(e,n+t.size,n+e.size);if(i=="end"){let u=Math.max(0,o-Math.min(s,l));r-=s+u-o}if(s=s?o-r:0;o-=u,o&&o=l?o-r:0;o-=u,o&&o=56320&&e<=57343&&n>=55296&&n<=56319}var zl=class{constructor(e,n){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new Nf,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=n,this.state=n.state,this.directPlugins=n.plugins||[],this.directPlugins.forEach(x0),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):typeof e=="function"?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=v0(this),E0(this),this.nodeViews=w0(this),this.docView=Qy(this.state.doc,y0(this),gf(this),this.dom,this),this.domObserver=new Df(this,(r,i,o,s)=>VR(this,r,i,o,s)),this.domObserver.start(),vR(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let n in e)this._props[n]=e[n];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&Of(this);let n=this._props;this._props=e,e.plugins&&(e.plugins.forEach(x0),this.directPlugins=e.plugins),this.updateStateInner(e.state,n)}setProps(e){let n={};for(let r in this._props)n[r]=this._props[r];n.state=this.state;for(let r in e)n[r]=e[r];this.update(n)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,n){var r;let i=this.state,o=!1,s=!1;e.storedMarks&&this.composing&&(q0(this),s=!0),this.state=e;let l=i.plugins!=e.plugins||this._props.plugins!=n.plugins;if(l||this._props.plugins!=n.plugins||this._props.nodeViews!=n.nodeViews){let b=w0(this);XR(b,this.nodeViews)&&(this.nodeViews=b,o=!0)}(l||n.handleDOMEvents!=this._props.handleDOMEvents)&&Of(this),this.editable=v0(this),E0(this);let u=gf(this),d=y0(this),f=i.plugins!=e.plugins&&!i.doc.eq(e.doc)?"reset":e.scrollToSelection>i.scrollToSelection?"to selection":"preserve",h=o||!this.docView.matchesNode(e.doc,d,u);(h||!e.selection.eq(i.selection))&&(s=!0);let m=f=="preserve"&&s&&this.dom.style.overflowAnchor==null&&FO(this);if(s){this.domObserver.stop();let b=h&&(wn||nn)&&!this.composing&&!i.selection.empty&&!e.selection.empty&&JR(i.selection,e.selection);if(h){let y=nn?this.trackWrites=this.domSelectionRange().focusNode:null;(o||!this.docView.update(e.doc,d,u,this))&&(this.docView.updateOuterDeco([]),this.docView.destroy(),this.docView=Qy(e.doc,d,u,this.dom,this)),y&&!this.trackWrites&&(b=!0)}b||!(this.input.mouseDown&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&sR(this))?Hr(this,b):(L0(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(i),!((r=this.dragging)===null||r===void 0)&&r.node&&!i.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,i),f=="reset"?this.dom.scrollTop=0:f=="to selection"?this.scrollToSelection():m&&HO(m)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(!this.someProp("handleScrollToSelection",n=>n(this)))if(this.state.selection instanceof he){let n=this.docView.domAfterPos(this.state.selection.from);n.nodeType==1&&qy(this,n.getBoundingClientRect(),e)}else qy(this,this.coordsAtPos(this.state.selection.head,1),e)}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(!e||e.plugins!=this.state.plugins||this.directPlugins!=this.prevDirectPlugins){this.prevDirectPlugins=this.directPlugins,this.destroyPluginViews();for(let n=0;n0&&this.state.doc.nodeAt(o))==r.node&&(i=o)}this.dragging=new Pl(e.slice,e.move,i<0?void 0:he.create(this.state.doc,i))}someProp(e,n){let r=this._props&&this._props[e],i;if(r!=null&&(i=n?n(r):r))return i;for(let s=0;sn.ownerDocument.getSelection()),this._root=n}return e||document}updateRoot(){this._root=null}posAtCoords(e){return VO(this,e)}coordsAtPos(e,n=1){return k0(this,e,n)}domAtPos(e,n=0){return this.docView.domFromPos(e,n)}nodeDOM(e){let n=this.docView.descAt(e);return n?n.nodeDOM:null}posAtDOM(e,n,r=-1){let i=this.docView.posFromDOM(e,n,r);if(i==null)throw new RangeError("DOM position not inside the editor");return i}endOfTextblock(e,n){return XO(this,n||this.state,e)}pasteHTML(e,n){return Js(this,"",e,!1,n||new ClipboardEvent("paste"))}pasteText(e,n){return Js(this,e,null,!0,n||new ClipboardEvent("paste"))}destroy(){this.docView&&(wR(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],gf(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null)}get isDestroyed(){return this.docView==null}dispatchEvent(e){return _R(this,e)}dispatch(e){let n=this._props.dispatchTransaction;n?n.call(this,e):this.updateState(this.state.apply(e))}domSelectionRange(){return pn&&this.root.nodeType===11&&OO(this.dom.ownerDocument)==this.dom?UR(this):this.domSelection()}domSelection(){return this.root.getSelection()}};function y0(t){let e=Object.create(null);return e.class="ProseMirror",e.contenteditable=String(t.editable),t.someProp("attributes",n=>{if(typeof n=="function"&&(n=n(t.state)),n)for(let r in n)r=="class"?e.class+=" "+n[r]:r=="style"?e.style=(e.style?e.style+";":"")+n[r]:!e[r]&&r!="contenteditable"&&r!="nodeName"&&(e[r]=String(n[r]))}),e.translate||(e.translate="no"),[Mt.node(0,t.state.doc.content.size,e)]}function E0(t){if(t.markCursor){let e=document.createElement("img");e.className="ProseMirror-separator",e.setAttribute("mark-placeholder","true"),e.setAttribute("alt",""),t.cursorWrapper={dom:e,deco:Mt.widget(t.state.selection.head,e,{raw:!0,marks:t.markCursor})}}else t.cursorWrapper=null}function v0(t){return!t.someProp("editable",e=>e(t.state)===!1)}function JR(t,e){let n=Math.min(t.$anchor.sharedDepth(t.head),e.$anchor.sharedDepth(e.head));return t.$anchor.start(n)!=e.$anchor.start(n)}function w0(t){let e=Object.create(null);function n(r){for(let i in r)Object.prototype.hasOwnProperty.call(e,i)||(e[i]=r[i])}return t.someProp("nodeViews",n),t.someProp("markViews",n),e}function XR(t,e){let n=0,r=0;for(let i in t){if(t[i]!=e[i])return!0;n++}for(let i in e)r++;return n!=r}function x0(t){if(t.spec.state||t.spec.filterTransaction||t.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var zr={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},Kl={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},ZR=typeof navigator<"u"&&/Mac/.test(navigator.platform),jR=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(Ct=0;Ct<10;Ct++)zr[48+Ct]=zr[96+Ct]=String(Ct);var Ct;for(Ct=1;Ct<=24;Ct++)zr[Ct+111]="F"+Ct;var Ct;for(Ct=65;Ct<=90;Ct++)zr[Ct]=String.fromCharCode(Ct+32),Kl[Ct]=String.fromCharCode(Ct);var Ct;for(Wl in zr)Kl.hasOwnProperty(Wl)||(Kl[Wl]=zr[Wl]);var Wl;function Q0(t){var e=ZR&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||jR&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",n=!e&&t.key||(t.shiftKey?Kl:zr)[t.keyCode]||t.key||"Unidentified";return n=="Esc"&&(n="Escape"),n=="Del"&&(n="Delete"),n=="Left"&&(n="ArrowLeft"),n=="Up"&&(n="ArrowUp"),n=="Right"&&(n="ArrowRight"),n=="Down"&&(n="ArrowDown"),n}var QR=typeof navigator<"u"?/Mac|iP(hone|[oa]d)/.test(navigator.platform):!1;function eI(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n=="Space"&&(n=" ");let r,i,o,s;for(let l=0;l127)&&(o=zr[r.keyCode])&&o!=i){let l=e[Kf(o,r)];if(l&&l(n.state,n.dispatch,n))return!0}}return!1}}var Vl=(t,e)=>t.selection.empty?!1:(e&&e(t.tr.deleteSelection().scrollIntoView()),!0);function nI(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("backward",t):n.parentOffset>0)?null:n}var Gf=(t,e,n)=>{let r=nI(t,n);if(!r)return!1;let i=nE(r);if(!i){let s=r.blockRange(),l=s&&Pr(s);return l==null?!1:(e&&e(t.tr.lift(s,l).scrollIntoView()),!0)}let o=i.nodeBefore;if(!o.type.spec.isolating&&lE(t,i,e))return!0;if(r.parent.content.size==0&&(Vo(o,"end")||he.isSelectable(o))){let s=Cl(t.doc,r.before(),r.after(),Z.empty);if(s&&s.slice.size{let{$head:r,empty:i}=t.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("backward",t):r.parentOffset>0)return!1;o=nE(r)}let s=o&&o.nodeBefore;return!s||!he.isSelectable(s)?!1:(e&&e(t.tr.setSelection(he.create(t.doc,o.pos-s.nodeSize)).scrollIntoView()),!0)};function nE(t){if(!t.parent.type.spec.isolating)for(let e=t.depth-1;e>=0;e--){if(t.index(e)>0)return t.doc.resolve(t.before(e+1));if(t.node(e).type.spec.isolating)break}return null}function rI(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("forward",t):n.parentOffset{let r=rI(t,n);if(!r)return!1;let i=rE(r);if(!i)return!1;let o=i.nodeAfter;if(lE(t,i,e))return!0;if(r.parent.content.size==0&&(Vo(o,"start")||he.isSelectable(o))){let s=Cl(t.doc,r.before(),r.after(),Z.empty);if(s&&s.slice.size{let{$head:r,empty:i}=t.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("forward",t):r.parentOffset=0;e--){let n=t.node(e);if(t.index(e)+1{let n=t.selection,r=n instanceof he,i;if(r){if(n.node.isTextblock||!rr(t.doc,n.from))return!1;i=n.from}else if(i=Bo(t.doc,n.from,-1),i==null)return!1;if(e){let o=t.tr.join(i);r&&o.setSelection(he.create(o.doc,i-t.doc.resolve(i).nodeBefore.nodeSize)),e(o.scrollIntoView())}return!0},oE=(t,e)=>{let n=t.selection,r;if(n instanceof he){if(n.node.isTextblock||!rr(t.doc,n.to))return!1;r=n.to}else if(r=Bo(t.doc,n.to,1),r==null)return!1;return e&&e(t.tr.join(r).scrollIntoView()),!0},sE=(t,e)=>{let{$from:n,$to:r}=t.selection,i=n.blockRange(r),o=i&&Pr(i);return o==null?!1:(e&&e(t.tr.lift(i,o).scrollIntoView()),!0)},Xf=(t,e)=>{let{$head:n,$anchor:r}=t.selection;return!n.parent.type.spec.code||!n.sameParent(r)?!1:(e&&e(t.tr.insertText(` -`).scrollIntoView()),!0)};function Zf(t){for(let e=0;e{let{$head:n,$anchor:r}=t.selection;if(!n.parent.type.spec.code||!n.sameParent(r))return!1;let i=n.node(-1),o=n.indexAfter(-1),s=Zf(i.contentMatchAt(o));if(!s||!i.canReplaceWith(o,o,s))return!1;if(e){let l=n.after(),u=t.tr.replaceWith(l,l,s.createAndFill());u.setSelection(fe.near(u.doc.resolve(l),1)),e(u.scrollIntoView())}return!0},Qf=(t,e)=>{let n=t.selection,{$from:r,$to:i}=n;if(n instanceof On||r.parent.inlineContent||i.parent.inlineContent)return!1;let o=Zf(i.parent.contentMatchAt(i.indexAfter()));if(!o||!o.isTextblock)return!1;if(e){let s=(!r.parentOffset&&i.index(){let{$cursor:n}=t.selection;if(!n||n.parent.content.size)return!1;if(n.depth>1&&n.after()!=n.end(-1)){let o=n.before();if(zn(t.doc,o))return e&&e(t.tr.split(o).scrollIntoView()),!0}let r=n.blockRange(),i=r&&Pr(r);return i==null?!1:(e&&e(t.tr.lift(r,i).scrollIntoView()),!0)};function iI(t){return(e,n)=>{let{$from:r,$to:i}=e.selection;if(e.selection instanceof he&&e.selection.node.isBlock)return!r.parentOffset||!zn(e.doc,r.pos)?!1:(n&&n(e.tr.split(r.pos).scrollIntoView()),!0);if(!r.parent.isBlock)return!1;if(n){let o=i.parentOffset==i.parent.content.size,s=e.tr;(e.selection instanceof ce||e.selection instanceof On)&&s.deleteSelection();let l=r.depth==0?null:Zf(r.node(-1).contentMatchAt(r.indexAfter(-1))),u=t&&t(i.parent,o),d=u?[u]:o&&l?[{type:l}]:void 0,f=zn(s.doc,s.mapping.map(r.pos),1,d);if(!d&&!f&&zn(s.doc,s.mapping.map(r.pos),1,l?[{type:l}]:void 0)&&(l&&(d=[{type:l}]),f=!0),f&&(s.split(s.mapping.map(r.pos),1,d),!o&&!r.parentOffset&&r.parent.type!=l)){let h=s.mapping.map(r.before()),m=s.doc.resolve(h);l&&r.node(-1).canReplaceWith(m.index(),m.index()+1,l)&&s.setNodeMarkup(s.mapping.map(r.before()),l)}n(s.scrollIntoView())}return!0}}var oI=iI();var aE=(t,e)=>{let{$from:n,to:r}=t.selection,i,o=n.sharedDepth(r);return o==0?!1:(i=n.before(o),e&&e(t.tr.setSelection(he.create(t.doc,i))),!0)},sI=(t,e)=>(e&&e(t.tr.setSelection(new On(t.doc))),!0);function aI(t,e,n){let r=e.nodeBefore,i=e.nodeAfter,o=e.index();return!r||!i||!r.type.compatibleContent(i.type)?!1:!r.content.size&&e.parent.canReplace(o-1,o)?(n&&n(t.tr.delete(e.pos-r.nodeSize,e.pos).scrollIntoView()),!0):!e.parent.canReplace(o,o+1)||!(i.isTextblock||rr(t.doc,e.pos))?!1:(n&&n(t.tr.clearIncompatible(e.pos,r.type,r.contentMatchAt(r.childCount)).join(e.pos).scrollIntoView()),!0)}function lE(t,e,n){let r=e.nodeBefore,i=e.nodeAfter,o,s;if(r.type.spec.isolating||i.type.spec.isolating)return!1;if(aI(t,e,n))return!0;let l=e.parent.canReplace(e.index(),e.index()+1);if(l&&(o=(s=r.contentMatchAt(r.childCount)).findWrapping(i.type))&&s.matchType(o[0]||i.type).validEnd){if(n){let h=e.pos+i.nodeSize,m=V.empty;for(let v=o.length-1;v>=0;v--)m=V.from(o[v].create(null,m));m=V.from(r.copy(m));let b=t.tr.step(new Tt(e.pos-1,h,e.pos,h,new Z(m,1,0),o.length,!0)),y=h+2*o.length;rr(b.doc,y)&&b.join(y),n(b.scrollIntoView())}return!0}let u=fe.findFrom(e,1),d=u&&u.$from.blockRange(u.$to),f=d&&Pr(d);if(f!=null&&f>=e.depth)return n&&n(t.tr.lift(d,f).scrollIntoView()),!0;if(l&&Vo(i,"start",!0)&&Vo(r,"end")){let h=r,m=[];for(;m.push(h),!h.isTextblock;)h=h.lastChild;let b=i,y=1;for(;!b.isTextblock;b=b.firstChild)y++;if(h.canReplace(h.childCount,h.childCount,b.content)){if(n){let v=V.empty;for(let M=m.length-1;M>=0;M--)v=V.from(m[M].copy(v));let x=t.tr.step(new Tt(e.pos-m.length,e.pos+i.nodeSize,e.pos+y,e.pos+i.nodeSize-y,new Z(v,m.length,0),0,!0));n(x.scrollIntoView())}return!0}}return!1}function cE(t){return function(e,n){let r=e.selection,i=t<0?r.$from:r.$to,o=i.depth;for(;i.node(o).isInline;){if(!o)return!1;o--}return i.node(o).isTextblock?(n&&n(e.tr.setSelection(ce.create(e.doc,t<0?i.start(o):i.end(o)))),!0):!1}}var tp=cE(-1),np=cE(1);function uE(t,e=null){return function(n,r){let{$from:i,$to:o}=n.selection,s=i.blockRange(o),l=s&&Po(s,t,e);return l?(r&&r(n.tr.wrap(s,l).scrollIntoView()),!0):!1}}function rp(t,e=null){return function(n,r){let i=!1;for(let o=0;o{if(i)return!1;if(!(!u.isTextblock||u.hasMarkup(t,e)))if(u.type==t)i=!0;else{let f=n.doc.resolve(d),h=f.index();i=f.parent.canReplaceWith(h,h+1,t)}})}if(!i)return!1;if(r){let o=n.tr;for(let s=0;s=2&&i.node(s.depth-1).type.compatibleContent(t)&&s.startIndex==0){if(i.index(s.depth-1)==0)return!1;let f=n.doc.resolve(s.start-2);u=new $i(f,f,s.depth),s.endIndex=0;f--)o=V.from(n[f].type.create(n[f].attrs,o));t.step(new Tt(e.start-(r?2:0),e.end,e.start,e.end,new Z(o,0,0),n.length,!0));let s=0;for(let f=0;fs.childCount>0&&s.firstChild.type==t);return o?n?r.node(o.depth-1).type==t?uI(e,n,t,o):dI(e,n,o):!0:!1}}function uI(t,e,n,r){let i=t.tr,o=r.end,s=r.$to.end(r.depth);ov;y--)b-=i.child(y).nodeSize,r.delete(b-1,b+1);let o=r.doc.resolve(n.start),s=o.nodeAfter;if(r.mapping.map(n.end)!=n.start+o.nodeAfter.nodeSize)return!1;let l=n.startIndex==0,u=n.endIndex==i.childCount,d=o.node(-1),f=o.index(-1);if(!d.canReplace(f+(l?0:1),f+1,s.content.append(u?V.empty:V.from(i))))return!1;let h=o.pos,m=h+s.nodeSize;return r.step(new Tt(h-(l?1:0),m+(u?1:0),h+1,m-1,new Z((l?V.empty:V.from(i.copy(V.empty))).append(u?V.empty:V.from(i.copy(V.empty))),l?0:1,u?0:1),l?0:1)),e(r.scrollIntoView()),!0}function pE(t){return function(e,n){let{$from:r,$to:i}=e.selection,o=r.blockRange(i,d=>d.childCount>0&&d.firstChild.type==t);if(!o)return!1;let s=o.startIndex;if(s==0)return!1;let l=o.parent,u=l.child(s-1);if(u.type!=t)return!1;if(n){let d=u.lastChild&&u.lastChild.type==l.type,f=V.from(d?t.create():null),h=new Z(V.from(t.create(null,V.from(l.type.create(null,f)))),d?3:1,0),m=o.start,b=o.end;n(e.tr.step(new Tt(m-(d?3:1),b,m,b,h,1,!0)).scrollIntoView())}return!0}}function Xl(t){let{state:e,transaction:n}=t,{selection:r}=n,{doc:i}=n,{storedMarks:o}=n;return{...e,apply:e.apply.bind(e),applyTransaction:e.applyTransaction.bind(e),filterTransaction:e.filterTransaction,plugins:e.plugins,schema:e.schema,reconfigure:e.reconfigure.bind(e),toJSON:e.toJSON.bind(e),get storedMarks(){return o},get selection(){return r},get doc(){return i},get tr(){return r=n.selection,i=n.doc,o=n.storedMarks,n}}}var Go=class{constructor(e){this.editor=e.editor,this.rawCommands=this.editor.extensionManager.commands,this.customState=e.state}get hasCustomState(){return!!this.customState}get state(){return this.customState||this.editor.state}get commands(){let{rawCommands:e,editor:n,state:r}=this,{view:i}=n,{tr:o}=r,s=this.buildProps(o);return Object.fromEntries(Object.entries(e).map(([l,u])=>[l,(...f)=>{let h=u(...f)(s);return!o.getMeta("preventDispatch")&&!this.hasCustomState&&i.dispatch(o),h}]))}get chain(){return()=>this.createChain()}get can(){return()=>this.createCan()}createChain(e,n=!0){let{rawCommands:r,editor:i,state:o}=this,{view:s}=i,l=[],u=!!e,d=e||o.tr,f=()=>(!u&&n&&!d.getMeta("preventDispatch")&&!this.hasCustomState&&s.dispatch(d),l.every(m=>m===!0)),h={...Object.fromEntries(Object.entries(r).map(([m,b])=>[m,(...v)=>{let x=this.buildProps(d,n),M=b(...v)(x);return l.push(M),h}])),run:f};return h}createCan(e){let{rawCommands:n,state:r}=this,i=!1,o=e||r.tr,s=this.buildProps(o,i);return{...Object.fromEntries(Object.entries(n).map(([u,d])=>[u,(...f)=>d(...f)({...s,dispatch:void 0})])),chain:()=>this.createChain(o,i)}}buildProps(e,n=!0){let{rawCommands:r,editor:i,state:o}=this,{view:s}=i,l={tr:e,editor:i,view:s,state:Xl({state:o,transaction:e}),dispatch:n?()=>{}:void 0,chain:()=>this.createChain(e,n),can:()=>this.createCan(e),get commands(){return Object.fromEntries(Object.entries(r).map(([u,d])=>[u,(...f)=>d(...f)(l)]))}};return l}},up=class{constructor(){this.callbacks={}}on(e,n){return this.callbacks[e]||(this.callbacks[e]=[]),this.callbacks[e].push(n),this}emit(e,...n){let r=this.callbacks[e];return r&&r.forEach(i=>i.apply(this,n)),this}off(e,n){let r=this.callbacks[e];return r&&(n?this.callbacks[e]=r.filter(i=>i!==n):delete this.callbacks[e]),this}removeAllListeners(){this.callbacks={}}};function ie(t,e,n){return t.config[e]===void 0&&t.parent?ie(t.parent,e,n):typeof t.config[e]=="function"?t.config[e].bind({...n,parent:t.parent?ie(t.parent,e,n):null}):t.config[e]}function Zl(t){let e=t.filter(i=>i.type==="extension"),n=t.filter(i=>i.type==="node"),r=t.filter(i=>i.type==="mark");return{baseExtensions:e,nodeExtensions:n,markExtensions:r}}function wE(t){let e=[],{nodeExtensions:n,markExtensions:r}=Zl(t),i=[...n,...r],o={default:null,rendered:!0,renderHTML:null,parseHTML:null,keepOnSplit:!0,isRequired:!1};return t.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage},u=ie(s,"addGlobalAttributes",l);if(!u)return;u().forEach(f=>{f.types.forEach(h=>{Object.entries(f.attributes).forEach(([m,b])=>{e.push({type:h,name:m,attribute:{...o,...b}})})})})}),i.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage},u=ie(s,"addAttributes",l);if(!u)return;let d=u();Object.entries(d).forEach(([f,h])=>{let m={...o,...h};typeof m?.default=="function"&&(m.default=m.default()),m?.isRequired&&m?.default===void 0&&delete m.default,e.push({type:s.name,name:f,attribute:m})})}),e}function Ut(t,e){if(typeof t=="string"){if(!e.nodes[t])throw Error(`There is no node type named '${t}'. Maybe you forgot to add the extension?`);return e.nodes[t]}return t}function j(...t){return t.filter(e=>!!e).reduce((e,n)=>{let r={...e};return Object.entries(n).forEach(([i,o])=>{if(!r[i]){r[i]=o;return}if(i==="class"){let l=o?o.split(" "):[],u=r[i]?r[i].split(" "):[],d=l.filter(f=>!u.includes(f));r[i]=[...u,...d].join(" ")}else i==="style"?r[i]=[r[i],o].join("; "):r[i]=o}),r},{})}function dp(t,e){return e.filter(n=>n.attribute.rendered).map(n=>n.attribute.renderHTML?n.attribute.renderHTML(t.attrs)||{}:{[n.name]:t.attrs[n.name]}).reduce((n,r)=>j(n,r),{})}function xE(t){return typeof t=="function"}function Se(t,e=void 0,...n){return xE(t)?e?t.bind(e)(...n):t(...n):t}function fI(t={}){return Object.keys(t).length===0&&t.constructor===Object}function pI(t){return typeof t!="string"?t:t.match(/^[+-]?(?:\d*\.)?\d+$/)?Number(t):t==="true"?!0:t==="false"?!1:t}function hE(t,e){return t.style?t:{...t,getAttrs:n=>{let r=t.getAttrs?t.getAttrs(n):t.attrs;if(r===!1)return!1;let i=e.reduce((o,s)=>{let l=s.attribute.parseHTML?s.attribute.parseHTML(n):pI(n.getAttribute(s.name));return l==null?o:{...o,[s.name]:l}},{});return{...r,...i}}}}function mE(t){return Object.fromEntries(Object.entries(t).filter(([e,n])=>e==="attrs"&&fI(n)?!1:n!=null))}function hI(t,e){var n;let r=wE(t),{nodeExtensions:i,markExtensions:o}=Zl(t),s=(n=i.find(d=>ie(d,"topNode")))===null||n===void 0?void 0:n.name,l=Object.fromEntries(i.map(d=>{let f=r.filter(M=>M.type===d.name),h={name:d.name,options:d.options,storage:d.storage,editor:e},m=t.reduce((M,D)=>{let L=ie(D,"extendNodeSchema",h);return{...M,...L?L(d):{}}},{}),b=mE({...m,content:Se(ie(d,"content",h)),marks:Se(ie(d,"marks",h)),group:Se(ie(d,"group",h)),inline:Se(ie(d,"inline",h)),atom:Se(ie(d,"atom",h)),selectable:Se(ie(d,"selectable",h)),draggable:Se(ie(d,"draggable",h)),code:Se(ie(d,"code",h)),defining:Se(ie(d,"defining",h)),isolating:Se(ie(d,"isolating",h)),attrs:Object.fromEntries(f.map(M=>{var D;return[M.name,{default:(D=M?.attribute)===null||D===void 0?void 0:D.default}]}))}),y=Se(ie(d,"parseHTML",h));y&&(b.parseDOM=y.map(M=>hE(M,f)));let v=ie(d,"renderHTML",h);v&&(b.toDOM=M=>v({node:M,HTMLAttributes:dp(M,f)}));let x=ie(d,"renderText",h);return x&&(b.toText=x),[d.name,b]})),u=Object.fromEntries(o.map(d=>{let f=r.filter(x=>x.type===d.name),h={name:d.name,options:d.options,storage:d.storage,editor:e},m=t.reduce((x,M)=>{let D=ie(M,"extendMarkSchema",h);return{...x,...D?D(d):{}}},{}),b=mE({...m,inclusive:Se(ie(d,"inclusive",h)),excludes:Se(ie(d,"excludes",h)),group:Se(ie(d,"group",h)),spanning:Se(ie(d,"spanning",h)),code:Se(ie(d,"code",h)),attrs:Object.fromEntries(f.map(x=>{var M;return[x.name,{default:(M=x?.attribute)===null||M===void 0?void 0:M.default}]}))}),y=Se(ie(d,"parseHTML",h));y&&(b.parseDOM=y.map(x=>hE(x,f)));let v=ie(d,"renderHTML",h);return v&&(b.toDOM=x=>v({mark:x,HTMLAttributes:dp(x,f)})),[d.name,b]}));return new El({topNode:s,nodes:l,marks:u})}function op(t,e){return e.nodes[t]||e.marks[t]||null}function gE(t,e){return Array.isArray(e)?e.some(n=>(typeof n=="string"?n:n.name)===t.name):e}var mI=(t,e=500)=>{let n="",r=t.parentOffset;return t.parent.nodesBetween(Math.max(0,r-e),r,(i,o,s,l)=>{var u,d;let f=((d=(u=i.type.spec).toText)===null||d===void 0?void 0:d.call(u,{node:i,pos:o,parent:s,index:l}))||i.textContent||"%leaf%";n+=f.slice(0,Math.max(0,r-o))}),n};function gp(t){return Object.prototype.toString.call(t)==="[object RegExp]"}var qo=class{constructor(e){this.find=e.find,this.handler=e.handler}},gI=(t,e)=>{if(gp(e))return e.exec(t);let n=e(t);if(!n)return null;let r=[n.text];return r.index=n.index,r.input=t,r.data=n.data,n.replaceWith&&(n.text.includes(n.replaceWith)||console.warn('[tiptap warn]: "inputRuleMatch.replaceWith" must be part of "inputRuleMatch.text".'),r.push(n.replaceWith)),r};function sp(t){var e;let{editor:n,from:r,to:i,text:o,rules:s,plugin:l}=t,{view:u}=n;if(u.composing)return!1;let d=u.state.doc.resolve(r);if(d.parent.type.spec.code||!((e=d.nodeBefore||d.nodeAfter)===null||e===void 0)&&e.marks.find(m=>m.type.spec.code))return!1;let f=!1,h=mI(d)+o;return s.forEach(m=>{if(f)return;let b=gI(h,m.find);if(!b)return;let y=u.state.tr,v=Xl({state:u.state,transaction:y}),x={from:r-(b[0].length-o.length),to:i},{commands:M,chain:D,can:L}=new Go({editor:n,state:v});m.handler({state:v,range:x,match:b,commands:M,chain:D,can:L})===null||!y.steps.length||(y.setMeta(l,{transform:y,from:r,to:i,text:o}),u.dispatch(y),f=!0)}),f}function bI(t){let{editor:e,rules:n}=t,r=new Pe({state:{init(){return null},apply(i,o){let s=i.getMeta(r);return s||(i.selectionSet||i.docChanged?null:o)}},props:{handleTextInput(i,o,s,l){return sp({editor:e,from:o,to:s,text:l,rules:n,plugin:r})},handleDOMEvents:{compositionend:i=>(setTimeout(()=>{let{$cursor:o}=i.state.selection;o&&sp({editor:e,from:o.pos,to:o.pos,text:"",rules:n,plugin:r})}),!1)},handleKeyDown(i,o){if(o.key!=="Enter")return!1;let{$cursor:s}=i.state.selection;return s?sp({editor:e,from:s.pos,to:s.pos,text:` -`,rules:n,plugin:r}):!1}},isInputRules:!0});return r}function yI(t){return typeof t=="number"}var fp=class{constructor(e){this.find=e.find,this.handler=e.handler}},EI=(t,e)=>{if(gp(e))return[...t.matchAll(e)];let n=e(t);return n?n.map(r=>{let i=[r.text];return i.index=r.index,i.input=t,i.data=r.data,r.replaceWith&&(r.text.includes(r.replaceWith)||console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".'),i.push(r.replaceWith)),i}):[]};function vI(t){let{editor:e,state:n,from:r,to:i,rule:o,pasteEvent:s,dropEvent:l}=t,{commands:u,chain:d,can:f}=new Go({editor:e,state:n}),h=[];return n.doc.nodesBetween(r,i,(b,y)=>{if(!b.isTextblock||b.type.spec.code)return;let v=Math.max(r,y),x=Math.min(i,y+b.content.size),M=b.textBetween(v-y,x-y,void 0,"\uFFFC");EI(M,o.find).forEach(L=>{if(L.index===void 0)return;let S=v+L.index+1,z=S+L[0].length,O={from:n.tr.mapping.map(S),to:n.tr.mapping.map(z)},q=o.handler({state:n,range:O,match:L,commands:u,chain:d,can:f,pasteEvent:s,dropEvent:l});h.push(q)})}),h.every(b=>b!==null)}function wI(t){let{editor:e,rules:n}=t,r=null,i=!1,o=!1,s=new ClipboardEvent("paste"),l=new DragEvent("drop");return n.map(d=>new Pe({view(f){let h=m=>{var b;r=!((b=f.dom.parentElement)===null||b===void 0)&&b.contains(m.target)?f.dom.parentElement:null};return window.addEventListener("dragstart",h),{destroy(){window.removeEventListener("dragstart",h)}}},props:{handleDOMEvents:{drop:(f,h)=>(o=r===f.dom.parentElement,l=h,!1),paste:(f,h)=>{var m;let b=(m=h.clipboardData)===null||m===void 0?void 0:m.getData("text/html");return s=h,i=!!b?.includes("data-pm-slice"),!1}}},appendTransaction:(f,h,m)=>{let b=f[0],y=b.getMeta("uiEvent")==="paste"&&!i,v=b.getMeta("uiEvent")==="drop"&&!o;if(!y&&!v)return;let x=h.doc.content.findDiffStart(m.doc.content),M=h.doc.content.findDiffEnd(m.doc.content);if(!yI(x)||!M||x===M.b)return;let D=m.tr,L=Xl({state:m,transaction:D});if(!(!vI({editor:e,state:L,from:Math.max(x-1,0),to:M.b-1,rule:d,pasteEvent:s,dropEvent:l})||!D.steps.length))return l=new DragEvent("drop"),s=new ClipboardEvent("paste"),D}}))}function xI(t){let e=t.filter((n,r)=>t.indexOf(n)!==r);return[...new Set(e)]}var pp=class t{constructor(e,n){this.splittableMarks=[],this.editor=n,this.extensions=t.resolve(e),this.schema=hI(this.extensions,n),this.extensions.forEach(r=>{var i;this.editor.extensionStorage[r.name]=r.storage;let o={name:r.name,options:r.options,storage:r.storage,editor:this.editor,type:op(r.name,this.schema)};r.type==="mark"&&(!((i=Se(ie(r,"keepOnSplit",o)))!==null&&i!==void 0)||i)&&this.splittableMarks.push(r.name);let s=ie(r,"onBeforeCreate",o);s&&this.editor.on("beforeCreate",s);let l=ie(r,"onCreate",o);l&&this.editor.on("create",l);let u=ie(r,"onUpdate",o);u&&this.editor.on("update",u);let d=ie(r,"onSelectionUpdate",o);d&&this.editor.on("selectionUpdate",d);let f=ie(r,"onTransaction",o);f&&this.editor.on("transaction",f);let h=ie(r,"onFocus",o);h&&this.editor.on("focus",h);let m=ie(r,"onBlur",o);m&&this.editor.on("blur",m);let b=ie(r,"onDestroy",o);b&&this.editor.on("destroy",b)})}static resolve(e){let n=t.sort(t.flatten(e)),r=xI(n.map(i=>i.name));return r.length&&console.warn(`[tiptap warn]: Duplicate extension names found: [${r.map(i=>`'${i}'`).join(", ")}]. This can lead to issues.`),n}static flatten(e){return e.map(n=>{let r={name:n.name,options:n.options,storage:n.storage},i=ie(n,"addExtensions",r);return i?[n,...this.flatten(i())]:n}).flat(10)}static sort(e){return e.sort((r,i)=>{let o=ie(r,"priority")||100,s=ie(i,"priority")||100;return o>s?-1:o{let r={name:n.name,options:n.options,storage:n.storage,editor:this.editor,type:op(n.name,this.schema)},i=ie(n,"addCommands",r);return i?{...e,...i()}:e},{})}get plugins(){let{editor:e}=this,n=t.sort([...this.extensions].reverse()),r=[],i=[],o=n.map(s=>{let l={name:s.name,options:s.options,storage:s.storage,editor:e,type:op(s.name,this.schema)},u=[],d=ie(s,"addKeyboardShortcuts",l),f={};if(s.type==="mark"&&s.config.exitable&&(f.ArrowRight=()=>tt.handleExit({editor:e,mark:s})),d){let v=Object.fromEntries(Object.entries(d()).map(([x,M])=>[x,()=>M({editor:e})]));f={...f,...v}}let h=eE(f);u.push(h);let m=ie(s,"addInputRules",l);gE(s,e.options.enableInputRules)&&m&&r.push(...m());let b=ie(s,"addPasteRules",l);gE(s,e.options.enablePasteRules)&&b&&i.push(...b());let y=ie(s,"addProseMirrorPlugins",l);if(y){let v=y();u.push(...v)}return u}).flat();return[bI({editor:e,rules:r}),...wI({editor:e,rules:i}),...o]}get attributes(){return wE(this.extensions)}get nodeViews(){let{editor:e}=this,{nodeExtensions:n}=Zl(this.extensions);return Object.fromEntries(n.filter(r=>!!ie(r,"addNodeView")).map(r=>{let i=this.attributes.filter(u=>u.type===r.name),o={name:r.name,options:r.options,storage:r.storage,editor:e,type:Ut(r.name,this.schema)},s=ie(r,"addNodeView",o);if(!s)return[];let l=(u,d,f,h)=>{let m=dp(u,i);return s()({editor:e,node:u,getPos:f,decorations:h,HTMLAttributes:m,extension:r})};return[r.name,l]}))}};function _I(t){return Object.prototype.toString.call(t).slice(8,-1)}function ap(t){return _I(t)!=="Object"?!1:t.constructor===Object&&Object.getPrototypeOf(t)===Object.prototype}function jl(t,e){let n={...t};return ap(t)&&ap(e)&&Object.keys(e).forEach(r=>{ap(e[r])?r in t?n[r]=jl(t[r],e[r]):Object.assign(n,{[r]:e[r]}):Object.assign(n,{[r]:e[r]})}),n}var Je=class t{constructor(e={}){this.type="extension",this.name="extension",this.parent=null,this.child=null,this.config={name:this.name,defaultOptions:{}},this.config={...this.config,...e},this.name=this.config.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`),this.options=this.config.defaultOptions,this.config.addOptions&&(this.options=Se(ie(this,"addOptions",{name:this.name}))),this.storage=Se(ie(this,"addStorage",{name:this.name,options:this.options}))||{}}static create(e={}){return new t(e)}configure(e={}){let n=this.extend();return n.options=jl(this.options,e),n.storage=Se(ie(n,"addStorage",{name:n.name,options:n.options})),n}extend(e={}){let n=new t(e);return n.parent=this,this.child=n,n.name=e.name?e.name:n.parent.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`),n.options=Se(ie(n,"addOptions",{name:n.name})),n.storage=Se(ie(n,"addStorage",{name:n.name,options:n.options})),n}};function _E(t,e,n){let{from:r,to:i}=e,{blockSeparator:o=` - -`,textSerializers:s={}}=n||{},l="",u=!0;return t.nodesBetween(r,i,(d,f,h,m)=>{var b;let y=s?.[d.type.name];y?(d.isBlock&&!u&&(l+=o,u=!0),h&&(l+=y({node:d,pos:f,parent:h,index:m,range:e}))):d.isText?(l+=(b=d?.text)===null||b===void 0?void 0:b.slice(Math.max(r,f)-f,i-f),u=!1):d.isBlock&&!u&&(l+=o,u=!0)}),l}function SE(t){return Object.fromEntries(Object.entries(t.nodes).filter(([,e])=>e.spec.toText).map(([e,n])=>[e,n.spec.toText]))}var SI=Je.create({name:"clipboardTextSerializer",addProseMirrorPlugins(){return[new Pe({key:new qe("clipboardTextSerializer"),props:{clipboardTextSerializer:()=>{let{editor:t}=this,{state:e,schema:n}=t,{doc:r,selection:i}=e,{ranges:o}=i,s=Math.min(...o.map(f=>f.$from.pos)),l=Math.max(...o.map(f=>f.$to.pos)),u=SE(n);return _E(r,{from:s,to:l},{textSerializers:u})}}})]}}),TI=()=>({editor:t,view:e})=>(requestAnimationFrame(()=>{var n;t.isDestroyed||(e.dom.blur(),(n=window?.getSelection())===null||n===void 0||n.removeAllRanges())}),!0),MI=(t=!1)=>({commands:e})=>e.setContent("",t),CI=()=>({state:t,tr:e,dispatch:n})=>{let{selection:r}=e,{ranges:i}=r;return n&&i.forEach(({$from:o,$to:s})=>{t.doc.nodesBetween(o.pos,s.pos,(l,u)=>{if(l.type.isText)return;let{doc:d,mapping:f}=e,h=d.resolve(f.map(u)),m=d.resolve(f.map(u+l.nodeSize)),b=h.blockRange(m);if(!b)return;let y=Pr(b);if(l.type.isTextblock){let{defaultType:v}=h.parent.contentMatchAt(h.index());e.setNodeMarkup(b.start,v)}(y||y===0)&&e.lift(b,y)})}),!0},kI=t=>e=>t(e),AI=()=>({state:t,dispatch:e})=>Qf(t,e),NI=(t,e)=>({editor:n,tr:r})=>{let{state:i}=n,o=i.doc.slice(t.from,t.to);r.deleteRange(t.from,t.to);let s=r.mapping.map(e);return r.insert(s,o.content),r.setSelection(new ce(r.doc.resolve(s-1))),!0},OI=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,r=n.$anchor.node();if(r.content.size>0)return!1;let i=t.selection.$anchor;for(let o=i.depth;o>0;o-=1)if(i.node(o).type===r.type){if(e){let l=i.before(o),u=i.after(o);t.delete(l,u).scrollIntoView()}return!0}return!1},RI=t=>({tr:e,state:n,dispatch:r})=>{let i=Ut(t,n.schema),o=e.selection.$anchor;for(let s=o.depth;s>0;s-=1)if(o.node(s).type===i){if(r){let u=o.before(s),d=o.after(s);e.delete(u,d).scrollIntoView()}return!0}return!1},II=t=>({tr:e,dispatch:n})=>{let{from:r,to:i}=t;return n&&e.delete(r,i),!0},LI=()=>({state:t,dispatch:e})=>Vl(t,e),DI=()=>({commands:t})=>t.keyboardShortcut("Enter"),PI=()=>({state:t,dispatch:e})=>jf(t,e);function ql(t,e,n={strict:!0}){let r=Object.keys(e);return r.length?r.every(i=>n.strict?e[i]===t[i]:gp(e[i])?e[i].test(t[i]):e[i]===t[i]):!0}function hp(t,e,n={}){return t.find(r=>r.type===e&&ql(r.attrs,n))}function BI(t,e,n={}){return!!hp(t,e,n)}function bp(t,e,n={}){if(!t||!e)return;let r=t.parent.childAfter(t.parentOffset);if(t.parentOffset===r.offset&&r.offset!==0&&(r=t.parent.childBefore(t.parentOffset)),!r.node)return;let i=hp([...r.node.marks],e,n);if(!i)return;let o=r.index,s=t.start()+r.offset,l=o+1,u=s+r.node.nodeSize;for(hp([...r.node.marks],e,n);o>0&&i.isInSet(t.parent.child(o-1).marks);)o-=1,s-=t.parent.child(o).nodeSize;for(;l({tr:n,state:r,dispatch:i})=>{let o=mi(t,r.schema),{doc:s,selection:l}=n,{$from:u,from:d,to:f}=l;if(i){let h=bp(u,o,e);if(h&&h.from<=d&&h.to>=f){let m=ce.create(s,h.from,h.to);n.setSelection(m)}}return!0},HI=t=>e=>{let n=typeof t=="function"?t(e):t;for(let r=0;r({editor:n,view:r,tr:i,dispatch:o})=>{e={scrollIntoView:!0,...e};let s=()=>{yp()&&r.dom.focus(),requestAnimationFrame(()=>{n.isDestroyed||(r.focus(),e?.scrollIntoView&&n.commands.scrollIntoView())})};if(r.hasFocus()&&t===null||t===!1)return!0;if(o&&t===null&&!Ql(n.state.selection))return s(),!0;let l=TE(i.doc,t)||n.state.selection,u=n.state.selection.eq(l);return o&&(u||i.setSelection(l),u&&i.storedMarks&&i.setStoredMarks(i.storedMarks),s()),!0},UI=(t,e)=>n=>t.every((r,i)=>e(r,{...n,index:i})),$I=(t,e)=>({tr:n,commands:r})=>r.insertContentAt({from:n.selection.from,to:n.selection.to},t,e);function bE(t){let e=`${t}`;return new window.DOMParser().parseFromString(e,"text/html").body}function Yl(t,e,n){if(n={slice:!0,parseOptions:{},...n},typeof t=="object"&&t!==null)try{return Array.isArray(t)&&t.length>0?V.fromArray(t.map(r=>e.nodeFromJSON(r))):e.nodeFromJSON(t)}catch(r){return console.warn("[tiptap warn]: Invalid content.","Passed value:",t,"Error:",r),Yl("",e,n)}if(typeof t=="string"){let r=Ki.fromSchema(e);return n.slice?r.parseSlice(bE(t),n.parseOptions).content:r.parse(bE(t),n.parseOptions)}return Yl("",e,n)}function WI(t,e,n){let r=t.steps.length-1;if(r{s===0&&(s=f)}),t.setSelection(fe.near(t.doc.resolve(s),n))}var KI=t=>t.toString().startsWith("<"),VI=(t,e,n)=>({tr:r,dispatch:i,editor:o})=>{if(i){n={parseOptions:{},updateSelection:!0,...n};let s=Yl(e,o.schema,{parseOptions:{preserveWhitespace:"full",...n.parseOptions}});if(s.toString()==="<>")return!0;let{from:l,to:u}=typeof t=="number"?{from:t,to:t}:{from:t.from,to:t.to},d=!0,f=!0;if((KI(s)?s:[s]).forEach(m=>{m.check(),d=d?m.isText&&m.marks.length===0:!1,f=f?m.isBlock:!1}),l===u&&f){let{parent:m}=r.doc.resolve(l);m.isTextblock&&!m.type.spec.code&&!m.childCount&&(l-=1,u+=1)}d?Array.isArray(e)?r.insertText(e.map(m=>m.text||"").join(""),l,u):typeof e=="object"&&e&&e.text?r.insertText(e.text,l,u):r.insertText(e,l,u):r.replaceWith(l,u,s),n.updateSelection&&WI(r,r.steps.length-1,-1)}return!0},GI=()=>({state:t,dispatch:e})=>iE(t,e),qI=()=>({state:t,dispatch:e})=>oE(t,e),YI=()=>({state:t,dispatch:e})=>Gf(t,e),JI=()=>({state:t,dispatch:e})=>Yf(t,e),XI=()=>({tr:t,state:e,dispatch:n})=>{try{let r=Bo(e.doc,e.selection.$from.pos,-1);return r==null?!1:(t.join(r,2),n&&n(t),!0)}catch{return!1}},ZI=()=>({state:t,dispatch:e,tr:n})=>{try{let r=Bo(t.doc,t.selection.$from.pos,1);return r==null?!1:(n.join(r,2),e&&e(n),!0)}catch{return!1}};function ec(){return typeof navigator<"u"?/Mac/.test(navigator.platform):!1}function jI(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n==="Space"&&(n=" ");let r,i,o,s;for(let l=0;l({editor:e,view:n,tr:r,dispatch:i})=>{let o=jI(t).split(/-(?!$)/),s=o.find(d=>!["Alt","Ctrl","Meta","Shift"].includes(d)),l=new KeyboardEvent("keydown",{key:s==="Space"?" ":s,altKey:o.includes("Alt"),ctrlKey:o.includes("Ctrl"),metaKey:o.includes("Meta"),shiftKey:o.includes("Shift"),bubbles:!0,cancelable:!0}),u=e.captureTransaction(()=>{n.someProp("handleKeyDown",d=>d(n,l))});return u?.steps.forEach(d=>{let f=d.map(r.mapping);f&&i&&r.maybeStep(f)}),!0};function Qs(t,e,n={}){let{from:r,to:i,empty:o}=t.selection,s=e?Ut(e,t.schema):null,l=[];t.doc.nodesBetween(r,i,(h,m)=>{if(h.isText)return;let b=Math.max(r,m),y=Math.min(i,m+h.nodeSize);l.push({node:h,from:b,to:y})});let u=i-r,d=l.filter(h=>s?s.name===h.node.type.name:!0).filter(h=>ql(h.node.attrs,n,{strict:!1}));return o?!!d.length:d.reduce((h,m)=>h+m.to-m.from,0)>=u}var eL=(t,e={})=>({state:n,dispatch:r})=>{let i=Ut(t,n.schema);return Qs(n,i,e)?sE(n,r):!1},tL=()=>({state:t,dispatch:e})=>ep(t,e),nL=t=>({state:e,dispatch:n})=>{let r=Ut(t,e.schema);return fE(r)(e,n)},rL=()=>({state:t,dispatch:e})=>Xf(t,e);function tc(t,e){return e.nodes[t]?"node":e.marks[t]?"mark":null}function yE(t,e){let n=typeof e=="string"?[e]:e;return Object.keys(t).reduce((r,i)=>(n.includes(i)||(r[i]=t[i]),r),{})}var iL=(t,e)=>({tr:n,state:r,dispatch:i})=>{let o=null,s=null,l=tc(typeof t=="string"?t:t.name,r.schema);return l?(l==="node"&&(o=Ut(t,r.schema)),l==="mark"&&(s=mi(t,r.schema)),i&&n.selection.ranges.forEach(u=>{r.doc.nodesBetween(u.$from.pos,u.$to.pos,(d,f)=>{o&&o===d.type&&n.setNodeMarkup(f,void 0,yE(d.attrs,e)),s&&d.marks.length&&d.marks.forEach(h=>{s===h.type&&n.addMark(f,f+d.nodeSize,s.create(yE(h.attrs,e)))})})}),!0):!1},oL=()=>({tr:t,dispatch:e})=>(e&&t.scrollIntoView(),!0),sL=()=>({tr:t,commands:e})=>e.setTextSelection({from:0,to:t.doc.content.size}),aL=()=>({state:t,dispatch:e})=>qf(t,e),lL=()=>({state:t,dispatch:e})=>Jf(t,e),cL=()=>({state:t,dispatch:e})=>aE(t,e),uL=()=>({state:t,dispatch:e})=>np(t,e),dL=()=>({state:t,dispatch:e})=>tp(t,e);function ME(t,e,n={}){return Yl(t,e,{slice:!1,parseOptions:n})}var fL=(t,e=!1,n={})=>({tr:r,editor:i,dispatch:o})=>{let{doc:s}=r,l=ME(t,i.schema,n);return o&&r.replaceWith(0,s.content.size,l).setMeta("preventUpdate",!e),!0};function gi(t,e){let n=mi(e,t.schema),{from:r,to:i,empty:o}=t.selection,s=[];o?(t.storedMarks&&s.push(...t.storedMarks),s.push(...t.selection.$head.marks())):t.doc.nodesBetween(r,i,u=>{s.push(...u.marks)});let l=s.find(u=>u.type.name===n.name);return l?{...l.attrs}:{}}function CE(t,e){let n=new ai(t);return e.forEach(r=>{r.steps.forEach(i=>{n.step(i)})}),n}function Ep(t){for(let e=0;e{e(r)&&n.push({node:r,pos:i})}),n}function kE(t,e,n){let r=[];return t.nodesBetween(e.from,e.to,(i,o)=>{n(i)&&r.push({node:i,pos:o})}),r}function vp(t,e){for(let n=t.depth;n>0;n-=1){let r=t.node(n);if(e(r))return{pos:n>0?t.before(n):0,start:t.start(n),depth:n,node:r}}}function no(t){return e=>vp(e.$from,t)}function pL(t,e){let n=Lr.fromSchema(e).serializeFragment(t),i=document.implementation.createHTMLDocument().createElement("div");return i.appendChild(n),i.innerHTML}function hL(t,e){let n={from:0,to:t.content.size};return _E(t,n,e)}function mL(t,e){let n=Ut(e,t.schema),{from:r,to:i}=t.selection,o=[];t.doc.nodesBetween(r,i,l=>{o.push(l)});let s=o.reverse().find(l=>l.type.name===n.name);return s?{...s.attrs}:{}}function wp(t,e){let n=tc(typeof e=="string"?e:e.name,t.schema);return n==="node"?mL(t,e):n==="mark"?gi(t,e):{}}function gL(t,e=JSON.stringify){let n={};return t.filter(r=>{let i=e(r);return Object.prototype.hasOwnProperty.call(n,i)?!1:n[i]=!0})}function bL(t){let e=gL(t);return e.length===1?e:e.filter((n,r)=>!e.filter((o,s)=>s!==r).some(o=>n.oldRange.from>=o.oldRange.from&&n.oldRange.to<=o.oldRange.to&&n.newRange.from>=o.newRange.from&&n.newRange.to<=o.newRange.to))}function AE(t){let{mapping:e,steps:n}=t,r=[];return e.maps.forEach((i,o)=>{let s=[];if(i.ranges.length)i.forEach((l,u)=>{s.push({from:l,to:u})});else{let{from:l,to:u}=n[o];if(l===void 0||u===void 0)return;s.push({from:l,to:u})}s.forEach(({from:l,to:u})=>{let d=e.slice(o).map(l,-1),f=e.slice(o).map(u),h=e.invert().map(d,-1),m=e.invert().map(f);r.push({oldRange:{from:h,to:m},newRange:{from:d,to:f}})})}),bL(r)}function nc(t,e,n){let r=[];return t===e?n.resolve(t).marks().forEach(i=>{let o=n.resolve(t-1),s=bp(o,i.type);s&&r.push({mark:i,...s})}):n.nodesBetween(t,e,(i,o)=>{r.push(...i.marks.map(s=>({from:o,to:o+i.nodeSize,mark:s})))}),r}function Gl(t,e,n){return Object.fromEntries(Object.entries(n).filter(([r])=>{let i=t.find(o=>o.type===e&&o.name===r);return i?i.attribute.keepOnSplit:!1}))}function mp(t,e,n={}){let{empty:r,ranges:i}=t.selection,o=e?mi(e,t.schema):null;if(r)return!!(t.storedMarks||t.selection.$from.marks()).filter(h=>o?o.name===h.type.name:!0).find(h=>ql(h.attrs,n,{strict:!1}));let s=0,l=[];if(i.forEach(({$from:h,$to:m})=>{let b=h.pos,y=m.pos;t.doc.nodesBetween(b,y,(v,x)=>{if(!v.isText&&!v.marks.length)return;let M=Math.max(b,x),D=Math.min(y,x+v.nodeSize),L=D-M;s+=L,l.push(...v.marks.map(S=>({mark:S,from:M,to:D})))})}),s===0)return!1;let u=l.filter(h=>o?o.name===h.mark.type.name:!0).filter(h=>ql(h.mark.attrs,n,{strict:!1})).reduce((h,m)=>h+m.to-m.from,0),d=l.filter(h=>o?h.mark.type!==o&&h.mark.type.excludes(o):!0).reduce((h,m)=>h+m.to-m.from,0);return(u>0?u+d:u)>=s}function Wn(t,e,n={}){if(!e)return Qs(t,null,n)||mp(t,null,n);let r=tc(e,t.schema);return r==="node"?Qs(t,e,n):r==="mark"?mp(t,e,n):!1}function EE(t,e){let{nodeExtensions:n}=Zl(e),r=n.find(s=>s.name===t);if(!r)return!1;let i={name:r.name,options:r.options,storage:r.storage},o=Se(ie(r,"group",i));return typeof o!="string"?!1:o.split(" ").includes("list")}function yL(t){var e;let n=(e=t.type.createAndFill())===null||e===void 0?void 0:e.toJSON(),r=t.toJSON();return JSON.stringify(n)===JSON.stringify(r)}function NE(t){return t instanceof he}function rc(t,e,n){let i=t.state.doc.content.size,o=Ur(e,0,i),s=Ur(n,0,i),l=t.coordsAtPos(o),u=t.coordsAtPos(s,-1),d=Math.min(l.top,u.top),f=Math.max(l.bottom,u.bottom),h=Math.min(l.left,u.left),m=Math.max(l.right,u.right),b=m-h,y=f-d,M={top:d,bottom:f,left:h,right:m,width:b,height:y,x:h,y:d};return{...M,toJSON:()=>M}}function EL(t,e,n){var r;let{selection:i}=e,o=null;if(Ql(i)&&(o=i.$cursor),o){let l=(r=t.storedMarks)!==null&&r!==void 0?r:o.marks();return!!n.isInSet(l)||!l.some(u=>u.type.excludes(n))}let{ranges:s}=i;return s.some(({$from:l,$to:u})=>{let d=l.depth===0?t.doc.inlineContent&&t.doc.type.allowsMarkType(n):!1;return t.doc.nodesBetween(l.pos,u.pos,(f,h,m)=>{if(d)return!1;if(f.isInline){let b=!m||m.type.allowsMarkType(n),y=!!n.isInSet(f.marks)||!f.marks.some(v=>v.type.excludes(n));d=b&&y}return!d}),d})}var vL=(t,e={})=>({tr:n,state:r,dispatch:i})=>{let{selection:o}=n,{empty:s,ranges:l}=o,u=mi(t,r.schema);if(i)if(s){let d=gi(r,u);n.addStoredMark(u.create({...d,...e}))}else l.forEach(d=>{let f=d.$from.pos,h=d.$to.pos;r.doc.nodesBetween(f,h,(m,b)=>{let y=Math.max(b,f),v=Math.min(b+m.nodeSize,h);m.marks.find(M=>M.type===u)?m.marks.forEach(M=>{u===M.type&&n.addMark(y,v,u.create({...M.attrs,...e}))}):n.addMark(y,v,u.create(e))})});return EL(r,n,u)},wL=(t,e)=>({tr:n})=>(n.setMeta(t,e),!0),xL=(t,e={})=>({state:n,dispatch:r,chain:i})=>{let o=Ut(t,n.schema);return o.isTextblock?i().command(({commands:s})=>rp(o,e)(n)?!0:s.clearNodes()).command(({state:s})=>rp(o,e)(s,r)).run():(console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'),!1)},_L=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,i=Ur(t,0,r.content.size),o=he.create(r,i);e.setSelection(o)}return!0},SL=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,{from:i,to:o}=typeof t=="number"?{from:t,to:t}:t,s=ce.atStart(r).from,l=ce.atEnd(r).to,u=Ur(i,s,l),d=Ur(o,s,l),f=ce.create(r,u,d);e.setSelection(f)}return!0},TL=t=>({state:e,dispatch:n})=>{let r=Ut(t,e.schema);return pE(r)(e,n)};function vE(t,e){let n=t.storedMarks||t.selection.$to.parentOffset&&t.selection.$from.marks();if(n){let r=n.filter(i=>e?.includes(i.type.name));t.tr.ensureMarks(r)}}var ML=({keepMarks:t=!0}={})=>({tr:e,state:n,dispatch:r,editor:i})=>{let{selection:o,doc:s}=e,{$from:l,$to:u}=o,d=i.extensionManager.attributes,f=Gl(d,l.node().type.name,l.node().attrs);if(o instanceof he&&o.node.isBlock)return!l.parentOffset||!zn(s,l.pos)?!1:(r&&(t&&vE(n,i.extensionManager.splittableMarks),e.split(l.pos).scrollIntoView()),!0);if(!l.parent.isBlock)return!1;if(r){let h=u.parentOffset===u.parent.content.size;o instanceof ce&&e.deleteSelection();let m=l.depth===0?void 0:Ep(l.node(-1).contentMatchAt(l.indexAfter(-1))),b=h&&m?[{type:m,attrs:f}]:void 0,y=zn(e.doc,e.mapping.map(l.pos),1,b);if(!b&&!y&&zn(e.doc,e.mapping.map(l.pos),1,m?[{type:m}]:void 0)&&(y=!0,b=m?[{type:m,attrs:f}]:void 0),y&&(e.split(e.mapping.map(l.pos),1,b),m&&!h&&!l.parentOffset&&l.parent.type!==m)){let v=e.mapping.map(l.before()),x=e.doc.resolve(v);l.node(-1).canReplaceWith(x.index(),x.index()+1,m)&&e.setNodeMarkup(e.mapping.map(l.before()),m)}t&&vE(n,i.extensionManager.splittableMarks),e.scrollIntoView()}return!0},CL=t=>({tr:e,state:n,dispatch:r,editor:i})=>{var o;let s=Ut(t,n.schema),{$from:l,$to:u}=n.selection,d=n.selection.node;if(d&&d.isBlock||l.depth<2||!l.sameParent(u))return!1;let f=l.node(-1);if(f.type!==s)return!1;let h=i.extensionManager.attributes;if(l.parent.content.size===0&&l.node(-1).childCount===l.indexAfter(-1)){if(l.depth===2||l.node(-3).type!==s||l.index(-2)!==l.node(-2).childCount-1)return!1;if(r){let x=V.empty,M=l.index(-1)?1:l.index(-2)?2:3;for(let q=l.depth-M;q>=l.depth-3;q-=1)x=V.from(l.node(q).copy(x));let D=l.indexAfter(-1){if(O>-1)return!1;q.isTextblock&&q.content.size===0&&(O=J+1)}),O>-1&&e.setSelection(ce.near(e.doc.resolve(O))),e.scrollIntoView()}return!0}let m=u.pos===l.end()?f.contentMatchAt(0).defaultType:null,b=Gl(h,f.type.name,f.attrs),y=Gl(h,l.node().type.name,l.node().attrs);e.delete(l.pos,u.pos);let v=m?[{type:s,attrs:b},{type:m,attrs:y}]:[{type:s,attrs:b}];if(!zn(e.doc,l.pos,2))return!1;if(r){let{selection:x,storedMarks:M}=n,{splittableMarks:D}=i.extensionManager,L=M||x.$to.parentOffset&&x.$from.marks();if(e.split(l.pos,2,v).scrollIntoView(),!L||!r)return!0;let S=L.filter(z=>D.includes(z.type.name));e.ensureMarks(S)}return!0},lp=(t,e)=>{let n=no(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(Math.max(0,n.pos-1)).before(n.depth);if(r===void 0)return!0;let i=t.doc.nodeAt(r);return n.node.type===i?.type&&rr(t.doc,n.pos)&&t.join(n.pos),!0},cp=(t,e)=>{let n=no(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(n.start).after(n.depth);if(r===void 0)return!0;let i=t.doc.nodeAt(r);return n.node.type===i?.type&&rr(t.doc,r)&&t.join(r),!0},kL=(t,e,n,r={})=>({editor:i,tr:o,state:s,dispatch:l,chain:u,commands:d,can:f})=>{let{extensions:h,splittableMarks:m}=i.extensionManager,b=Ut(t,s.schema),y=Ut(e,s.schema),{selection:v,storedMarks:x}=s,{$from:M,$to:D}=v,L=M.blockRange(D),S=x||v.$to.parentOffset&&v.$from.marks();if(!L)return!1;let z=no(O=>EE(O.type.name,h))(v);if(L.depth>=1&&z&&L.depth-z.depth<=1){if(z.node.type===b)return d.liftListItem(y);if(EE(z.node.type.name,h)&&b.validContent(z.node.content)&&l)return u().command(()=>(o.setNodeMarkup(z.pos,b),!0)).command(()=>lp(o,b)).command(()=>cp(o,b)).run()}return!n||!S||!l?u().command(()=>f().wrapInList(b,r)?!0:d.clearNodes()).wrapInList(b,r).command(()=>lp(o,b)).command(()=>cp(o,b)).run():u().command(()=>{let O=f().wrapInList(b,r),q=S.filter(J=>m.includes(J.type.name));return o.ensureMarks(q),O?!0:d.clearNodes()}).wrapInList(b,r).command(()=>lp(o,b)).command(()=>cp(o,b)).run()},AL=(t,e={},n={})=>({state:r,commands:i})=>{let{extendEmptyMarkRange:o=!1}=n,s=mi(t,r.schema);return mp(r,s,e)?i.unsetMark(s,{extendEmptyMarkRange:o}):i.setMark(s,e)},NL=(t,e,n={})=>({state:r,commands:i})=>{let o=Ut(t,r.schema),s=Ut(e,r.schema);return Qs(r,o,n)?i.setNode(s):i.setNode(o,n)},OL=(t,e={})=>({state:n,commands:r})=>{let i=Ut(t,n.schema);return Qs(n,i,e)?r.lift(i):r.wrapIn(i,e)},RL=()=>({state:t,dispatch:e})=>{let n=t.plugins;for(let r=0;r=0;u-=1)s.step(l.steps[u].invert(l.docs[u]));if(o.text){let u=s.doc.resolve(o.from).marks();s.replaceWith(o.from,o.to,t.schema.text(o.text,u))}else s.delete(o.from,o.to)}return!0}}return!1},IL=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,{empty:r,ranges:i}=n;return r||e&&i.forEach(o=>{t.removeMark(o.$from.pos,o.$to.pos)}),!0},LL=(t,e={})=>({tr:n,state:r,dispatch:i})=>{var o;let{extendEmptyMarkRange:s=!1}=e,{selection:l}=n,u=mi(t,r.schema),{$from:d,empty:f,ranges:h}=l;if(!i)return!0;if(f&&s){let{from:m,to:b}=l,y=(o=d.marks().find(x=>x.type===u))===null||o===void 0?void 0:o.attrs,v=bp(d,u,y);v&&(m=v.from,b=v.to),n.removeMark(m,b,u)}else h.forEach(m=>{n.removeMark(m.$from.pos,m.$to.pos,u)});return n.removeStoredMark(u),!0},DL=(t,e={})=>({tr:n,state:r,dispatch:i})=>{let o=null,s=null,l=tc(typeof t=="string"?t:t.name,r.schema);return l?(l==="node"&&(o=Ut(t,r.schema)),l==="mark"&&(s=mi(t,r.schema)),i&&n.selection.ranges.forEach(u=>{let d=u.$from.pos,f=u.$to.pos;r.doc.nodesBetween(d,f,(h,m)=>{o&&o===h.type&&n.setNodeMarkup(m,void 0,{...h.attrs,...e}),s&&h.marks.length&&h.marks.forEach(b=>{if(s===b.type){let y=Math.max(m,d),v=Math.min(m+h.nodeSize,f);n.addMark(y,v,s.create({...b.attrs,...e}))}})})}),!0):!1},PL=(t,e={})=>({state:n,dispatch:r})=>{let i=Ut(t,n.schema);return uE(i,e)(n,r)},BL=(t,e={})=>({state:n,dispatch:r})=>{let i=Ut(t,n.schema);return dE(i,e)(n,r)},FL=Object.freeze({__proto__:null,blur:TI,clearContent:MI,clearNodes:CI,command:kI,createParagraphNear:AI,cut:NI,deleteCurrentNode:OI,deleteNode:RI,deleteRange:II,deleteSelection:LI,enter:DI,exitCode:PI,extendMarkRange:FI,first:HI,focus:zI,forEach:UI,insertContent:$I,insertContentAt:VI,joinUp:GI,joinDown:qI,joinBackward:YI,joinForward:JI,joinItemBackward:XI,joinItemForward:ZI,keyboardShortcut:QI,lift:eL,liftEmptyBlock:tL,liftListItem:nL,newlineInCode:rL,resetAttributes:iL,scrollIntoView:oL,selectAll:sL,selectNodeBackward:aL,selectNodeForward:lL,selectParentNode:cL,selectTextblockEnd:uL,selectTextblockStart:dL,setContent:fL,setMark:vL,setMeta:wL,setNode:xL,setNodeSelection:_L,setTextSelection:SL,sinkListItem:TL,splitBlock:ML,splitListItem:CL,toggleList:kL,toggleMark:AL,toggleNode:NL,toggleWrap:OL,undoInputRule:RL,unsetAllMarks:IL,unsetMark:LL,updateAttributes:DL,wrapIn:PL,wrapInList:BL}),HL=Je.create({name:"commands",addCommands(){return{...FL}}}),zL=Je.create({name:"editable",addProseMirrorPlugins(){return[new Pe({key:new qe("editable"),props:{editable:()=>this.editor.options.editable}})]}}),UL=Je.create({name:"focusEvents",addProseMirrorPlugins(){let{editor:t}=this;return[new Pe({key:new qe("focusEvents"),props:{handleDOMEvents:{focus:(e,n)=>{t.isFocused=!0;let r=t.state.tr.setMeta("focus",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1},blur:(e,n)=>{t.isFocused=!1;let r=t.state.tr.setMeta("blur",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1}}}})]}}),$L=Je.create({name:"keymap",addKeyboardShortcuts(){let t=()=>this.editor.commands.first(({commands:s})=>[()=>s.undoInputRule(),()=>s.command(({tr:l})=>{let{selection:u,doc:d}=l,{empty:f,$anchor:h}=u,{pos:m,parent:b}=h,y=h.parent.isTextblock?l.doc.resolve(m-1):h,v=y.parent.type.spec.isolating,x=h.pos-h.parentOffset,M=v&&y.parent.childCount===1?x===h.pos:fe.atStart(d).from===m;return!f||!M||!b.type.isTextblock||b.textContent.length?!1:s.clearNodes()}),()=>s.deleteSelection(),()=>s.joinBackward(),()=>s.selectNodeBackward()]),e=()=>this.editor.commands.first(({commands:s})=>[()=>s.deleteSelection(),()=>s.deleteCurrentNode(),()=>s.joinForward(),()=>s.selectNodeForward()]),r={Enter:()=>this.editor.commands.first(({commands:s})=>[()=>s.newlineInCode(),()=>s.createParagraphNear(),()=>s.liftEmptyBlock(),()=>s.splitBlock()]),"Mod-Enter":()=>this.editor.commands.exitCode(),Backspace:t,"Mod-Backspace":t,"Shift-Backspace":t,Delete:e,"Mod-Delete":e,"Mod-a":()=>this.editor.commands.selectAll()},i={...r},o={...r,"Ctrl-h":t,"Alt-Backspace":t,"Ctrl-d":e,"Ctrl-Alt-Backspace":e,"Alt-Delete":e,"Alt-d":e,"Ctrl-a":()=>this.editor.commands.selectTextblockStart(),"Ctrl-e":()=>this.editor.commands.selectTextblockEnd()};return yp()||ec()?o:i},addProseMirrorPlugins(){return[new Pe({key:new qe("clearDocument"),appendTransaction:(t,e,n)=>{if(!(t.some(y=>y.docChanged)&&!e.doc.eq(n.doc)))return;let{empty:i,from:o,to:s}=e.selection,l=fe.atStart(e.doc).from,u=fe.atEnd(e.doc).to;if(i||!(o===l&&s===u)||!(n.doc.textBetween(0,n.doc.content.size," "," ").length===0))return;let h=n.tr,m=Xl({state:n,transaction:h}),{commands:b}=new Go({editor:this.editor,state:m});if(b.clearNodes(),!!h.steps.length)return h}})]}}),WL=Je.create({name:"tabindex",addProseMirrorPlugins(){return[new Pe({key:new qe("tabindex"),props:{attributes:this.editor.isEditable?{tabindex:"0"}:{}}})]}}),KL=Object.freeze({__proto__:null,ClipboardTextSerializer:SI,Commands:HL,Editable:zL,FocusEvents:UL,Keymap:$L,Tabindex:WL}),VL=`.ProseMirror { +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from2, except, desc) => { + if (from2 && typeof from2 === "object" || typeof from2 === "function") { + for (let key of __getOwnPropNames(from2)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; + +// node_modules/lowlight/node_modules/highlight.js/lib/core.js +var require_core = __commonJS({ + "node_modules/lowlight/node_modules/highlight.js/lib/core.js"(exports, module) { + function deepFreeze2(obj) { + if (obj instanceof Map) { + obj.clear = obj.delete = obj.set = function() { + throw new Error("map is read-only"); + }; + } else if (obj instanceof Set) { + obj.add = obj.clear = obj.delete = function() { + throw new Error("set is read-only"); + }; + } + Object.freeze(obj); + Object.getOwnPropertyNames(obj).forEach((name) => { + const prop = obj[name]; + const type = typeof prop; + if ((type === "object" || type === "function") && !Object.isFrozen(prop)) { + deepFreeze2(prop); + } + }); + return obj; + } + var Response2 = class { + /** + * @param {CompiledMode} mode + */ + constructor(mode) { + if (mode.data === void 0) + mode.data = {}; + this.data = mode.data; + this.isMatchIgnored = false; + } + ignoreMatch() { + this.isMatchIgnored = true; + } + }; + function escapeHTML2(value) { + return value.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); + } + function inherit$12(original, ...objects) { + const result = /* @__PURE__ */ Object.create(null); + for (const key in original) { + result[key] = original[key]; + } + objects.forEach(function(obj) { + for (const key in obj) { + result[key] = obj[key]; + } + }); + return ( + /** @type {T} */ + result + ); + } + var SPAN_CLOSE2 = ""; + var emitsWrappingTags2 = (node) => { + return !!node.scope; + }; + var scopeToCSSClass2 = (name, { prefix }) => { + if (name.startsWith("language:")) { + return name.replace("language:", "language-"); + } + if (name.includes(".")) { + const pieces = name.split("."); + return [ + `${prefix}${pieces.shift()}`, + ...pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`) + ].join(" "); + } + return `${prefix}${name}`; + }; + var HTMLRenderer2 = class { + /** + * Creates a new HTMLRenderer + * + * @param {Tree} parseTree - the parse tree (must support `walk` API) + * @param {{classPrefix: string}} options + */ + constructor(parseTree, options) { + this.buffer = ""; + this.classPrefix = options.classPrefix; + parseTree.walk(this); + } + /** + * Adds texts to the output stream + * + * @param {string} text */ + addText(text) { + this.buffer += escapeHTML2(text); + } + /** + * Adds a node open to the output stream (if needed) + * + * @param {Node} node */ + openNode(node) { + if (!emitsWrappingTags2(node)) + return; + const className = scopeToCSSClass2( + node.scope, + { prefix: this.classPrefix } + ); + this.span(className); + } + /** + * Adds a node close to the output stream (if needed) + * + * @param {Node} node */ + closeNode(node) { + if (!emitsWrappingTags2(node)) + return; + this.buffer += SPAN_CLOSE2; + } + /** + * returns the accumulated buffer + */ + value() { + return this.buffer; + } + // helpers + /** + * Builds a span element + * + * @param {string} className */ + span(className) { + this.buffer += ``; + } + }; + var newNode2 = (opts = {}) => { + const result = { children: [] }; + Object.assign(result, opts); + return result; + }; + var TokenTree2 = class _TokenTree { + constructor() { + this.rootNode = newNode2(); + this.stack = [this.rootNode]; + } + get top() { + return this.stack[this.stack.length - 1]; + } + get root() { + return this.rootNode; + } + /** @param {Node} node */ + add(node) { + this.top.children.push(node); + } + /** @param {string} scope */ + openNode(scope) { + const node = newNode2({ scope }); + this.add(node); + this.stack.push(node); + } + closeNode() { + if (this.stack.length > 1) { + return this.stack.pop(); + } + return void 0; + } + closeAllNodes() { + while (this.closeNode()) + ; + } + toJSON() { + return JSON.stringify(this.rootNode, null, 4); + } + /** + * @typedef { import("./html_renderer").Renderer } Renderer + * @param {Renderer} builder + */ + walk(builder) { + return this.constructor._walk(builder, this.rootNode); + } + /** + * @param {Renderer} builder + * @param {Node} node + */ + static _walk(builder, node) { + if (typeof node === "string") { + builder.addText(node); + } else if (node.children) { + builder.openNode(node); + node.children.forEach((child) => this._walk(builder, child)); + builder.closeNode(node); + } + return builder; + } + /** + * @param {Node} node + */ + static _collapse(node) { + if (typeof node === "string") + return; + if (!node.children) + return; + if (node.children.every((el) => typeof el === "string")) { + node.children = [node.children.join("")]; + } else { + node.children.forEach((child) => { + _TokenTree._collapse(child); + }); + } + } + }; + var TokenTreeEmitter2 = class extends TokenTree2 { + /** + * @param {*} options + */ + constructor(options) { + super(); + this.options = options; + } + /** + * @param {string} text + */ + addText(text) { + if (text === "") { + return; + } + this.add(text); + } + /** @param {string} scope */ + startScope(scope) { + this.openNode(scope); + } + endScope() { + this.closeNode(); + } + /** + * @param {Emitter & {root: DataNode}} emitter + * @param {string} name + */ + __addSublanguage(emitter, name) { + const node = emitter.root; + if (name) + node.scope = `language:${name}`; + this.add(node); + } + toHTML() { + const renderer = new HTMLRenderer2(this, this.options); + return renderer.value(); + } + finalize() { + this.closeAllNodes(); + return true; + } + }; + function source3(re) { + if (!re) + return null; + if (typeof re === "string") + return re; + return re.source; + } + function lookahead3(re) { + return concat3("(?=", re, ")"); + } + function anyNumberOfTimes2(re) { + return concat3("(?:", re, ")*"); + } + function optional2(re) { + return concat3("(?:", re, ")?"); + } + function concat3(...args) { + const joined = args.map((x) => source3(x)).join(""); + return joined; + } + function stripOptionsFromArgs3(args) { + const opts = args[args.length - 1]; + if (typeof opts === "object" && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } + } + function either3(...args) { + const opts = stripOptionsFromArgs3(args); + const joined = "(" + (opts.capture ? "" : "?:") + args.map((x) => source3(x)).join("|") + ")"; + return joined; + } + function countMatchGroups2(re) { + return new RegExp(re.toString() + "|").exec("").length - 1; + } + function startsWith2(re, lexeme) { + const match = re && re.exec(lexeme); + return match && match.index === 0; + } + var BACKREF_RE2 = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; + function _rewriteBackreferences2(regexps, { joinWith }) { + let numCaptures = 0; + return regexps.map((regex) => { + numCaptures += 1; + const offset2 = numCaptures; + let re = source3(regex); + let out = ""; + while (re.length > 0) { + const match = BACKREF_RE2.exec(re); + if (!match) { + out += re; + break; + } + out += re.substring(0, match.index); + re = re.substring(match.index + match[0].length); + if (match[0][0] === "\\" && match[1]) { + out += "\\" + String(Number(match[1]) + offset2); + } else { + out += match[0]; + if (match[0] === "(") { + numCaptures++; + } + } + } + return out; + }).map((re) => `(${re})`).join(joinWith); + } + var MATCH_NOTHING_RE2 = /\b\B/; + var IDENT_RE4 = "[a-zA-Z]\\w*"; + var UNDERSCORE_IDENT_RE2 = "[a-zA-Z_]\\w*"; + var NUMBER_RE2 = "\\b\\d+(\\.\\d+)?"; + var C_NUMBER_RE2 = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)"; + var BINARY_NUMBER_RE2 = "\\b(0b[01]+)"; + var RE_STARTERS_RE2 = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~"; + var SHEBANG2 = (opts = {}) => { + const beginShebang = /^#![ ]*\//; + if (opts.binary) { + opts.begin = concat3( + beginShebang, + /.*\b/, + opts.binary, + /\b.*/ + ); + } + return inherit$12({ + scope: "meta", + begin: beginShebang, + end: /$/, + relevance: 0, + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + if (m.index !== 0) + resp.ignoreMatch(); + } + }, opts); + }; + var BACKSLASH_ESCAPE2 = { + begin: "\\\\[\\s\\S]", + relevance: 0 + }; + var APOS_STRING_MODE2 = { + scope: "string", + begin: "'", + end: "'", + illegal: "\\n", + contains: [BACKSLASH_ESCAPE2] + }; + var QUOTE_STRING_MODE2 = { + scope: "string", + begin: '"', + end: '"', + illegal: "\\n", + contains: [BACKSLASH_ESCAPE2] + }; + var PHRASAL_WORDS_MODE2 = { + begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ + }; + var COMMENT2 = function(begin, end2, modeOptions = {}) { + const mode = inherit$12( + { + scope: "comment", + begin, + end: end2, + contains: [] + }, + modeOptions + ); + mode.contains.push({ + scope: "doctag", + // hack to avoid the space from being included. the space is necessary to + // match here to prevent the plain text rule below from gobbling up doctags + begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", + end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, + excludeBegin: true, + relevance: 0 + }); + const ENGLISH_WORD = either3( + // list of common 1 and 2 letter words in English + "I", + "a", + "is", + "so", + "us", + "to", + "at", + "if", + "in", + "it", + "on", + // note: this is not an exhaustive list of contractions, just popular ones + /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, + // contractions - can't we'd they're let's, etc + /[A-Za-z]+[-][a-z]+/, + // `no-way`, etc. + /[A-Za-z][a-z]{2,}/ + // allow capitalized words at beginning of sentences + ); + mode.contains.push( + { + // TODO: how to include ", (, ) without breaking grammars that use these for + // comment delimiters? + // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ + // --- + // this tries to find sequences of 3 english words in a row (without any + // "programming" type syntax) this gives us a strong signal that we've + // TRULY found a comment - vs perhaps scanning with the wrong language. + // It's possible to find something that LOOKS like the start of the + // comment - but then if there is no readable text - good chance it is a + // false match and not a comment. + // + // for a visual example please see: + // https://github.com/highlightjs/highlight.js/issues/2827 + begin: concat3( + /[ ]+/, + // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ + "(", + ENGLISH_WORD, + /[.]?[:]?([.][ ]|[ ])/, + "){3}" + ) + // look for 3 words in a row + } + ); + return mode; + }; + var C_LINE_COMMENT_MODE2 = COMMENT2("//", "$"); + var C_BLOCK_COMMENT_MODE2 = COMMENT2("/\\*", "\\*/"); + var HASH_COMMENT_MODE2 = COMMENT2("#", "$"); + var NUMBER_MODE2 = { + scope: "number", + begin: NUMBER_RE2, + relevance: 0 + }; + var C_NUMBER_MODE2 = { + scope: "number", + begin: C_NUMBER_RE2, + relevance: 0 + }; + var BINARY_NUMBER_MODE2 = { + scope: "number", + begin: BINARY_NUMBER_RE2, + relevance: 0 + }; + var REGEXP_MODE2 = { + // this outer rule makes sure we actually have a WHOLE regex and not simply + // an expression such as: + // + // 3 / something + // + // (which will then blow up when regex's `illegal` sees the newline) + begin: /(?=\/[^/\n]*\/)/, + contains: [{ + scope: "regexp", + begin: /\//, + end: /\/[gimuy]*/, + illegal: /\n/, + contains: [ + BACKSLASH_ESCAPE2, + { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [BACKSLASH_ESCAPE2] + } + ] + }] + }; + var TITLE_MODE2 = { + scope: "title", + begin: IDENT_RE4, + relevance: 0 + }; + var UNDERSCORE_TITLE_MODE2 = { + scope: "title", + begin: UNDERSCORE_IDENT_RE2, + relevance: 0 + }; + var METHOD_GUARD2 = { + // excludes method names from keyword processing + begin: "\\.\\s*" + UNDERSCORE_IDENT_RE2, + relevance: 0 + }; + var END_SAME_AS_BEGIN2 = function(mode) { + return Object.assign( + mode, + { + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + resp.data._beginMatch = m[1]; + }, + /** @type {ModeCallback} */ + "on:end": (m, resp) => { + if (resp.data._beginMatch !== m[1]) + resp.ignoreMatch(); + } + } + ); + }; + var MODES5 = /* @__PURE__ */ Object.freeze({ + __proto__: null, + MATCH_NOTHING_RE: MATCH_NOTHING_RE2, + IDENT_RE: IDENT_RE4, + UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE2, + NUMBER_RE: NUMBER_RE2, + C_NUMBER_RE: C_NUMBER_RE2, + BINARY_NUMBER_RE: BINARY_NUMBER_RE2, + RE_STARTERS_RE: RE_STARTERS_RE2, + SHEBANG: SHEBANG2, + BACKSLASH_ESCAPE: BACKSLASH_ESCAPE2, + APOS_STRING_MODE: APOS_STRING_MODE2, + QUOTE_STRING_MODE: QUOTE_STRING_MODE2, + PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE2, + COMMENT: COMMENT2, + C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE2, + C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE2, + HASH_COMMENT_MODE: HASH_COMMENT_MODE2, + NUMBER_MODE: NUMBER_MODE2, + C_NUMBER_MODE: C_NUMBER_MODE2, + BINARY_NUMBER_MODE: BINARY_NUMBER_MODE2, + REGEXP_MODE: REGEXP_MODE2, + TITLE_MODE: TITLE_MODE2, + UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE2, + METHOD_GUARD: METHOD_GUARD2, + END_SAME_AS_BEGIN: END_SAME_AS_BEGIN2 + }); + function skipIfHasPrecedingDot2(match, response) { + const before = match.input[match.index - 1]; + if (before === ".") { + response.ignoreMatch(); + } + } + function scopeClassName2(mode, _parent) { + if (mode.className !== void 0) { + mode.scope = mode.className; + delete mode.className; + } + } + function beginKeywords2(mode, parent) { + if (!parent) + return; + if (!mode.beginKeywords) + return; + mode.begin = "\\b(" + mode.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)"; + mode.__beforeBegin = skipIfHasPrecedingDot2; + mode.keywords = mode.keywords || mode.beginKeywords; + delete mode.beginKeywords; + if (mode.relevance === void 0) + mode.relevance = 0; + } + function compileIllegal2(mode, _parent) { + if (!Array.isArray(mode.illegal)) + return; + mode.illegal = either3(...mode.illegal); + } + function compileMatch2(mode, _parent) { + if (!mode.match) + return; + if (mode.begin || mode.end) + throw new Error("begin & end are not supported with match"); + mode.begin = mode.match; + delete mode.match; + } + function compileRelevance2(mode, _parent) { + if (mode.relevance === void 0) + mode.relevance = 1; + } + var beforeMatchExt2 = (mode, parent) => { + if (!mode.beforeMatch) + return; + if (mode.starts) + throw new Error("beforeMatch cannot be used with starts"); + const originalMode = Object.assign({}, mode); + Object.keys(mode).forEach((key) => { + delete mode[key]; + }); + mode.keywords = originalMode.keywords; + mode.begin = concat3(originalMode.beforeMatch, lookahead3(originalMode.begin)); + mode.starts = { + relevance: 0, + contains: [ + Object.assign(originalMode, { endsParent: true }) + ] + }; + mode.relevance = 0; + delete originalMode.beforeMatch; + }; + var COMMON_KEYWORDS2 = [ + "of", + "and", + "for", + "in", + "not", + "or", + "if", + "then", + "parent", + // common variable name + "list", + // common variable name + "value" + // common variable name + ]; + var DEFAULT_KEYWORD_SCOPE2 = "keyword"; + function compileKeywords2(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE2) { + const compiledKeywords = /* @__PURE__ */ Object.create(null); + if (typeof rawKeywords === "string") { + compileList(scopeName, rawKeywords.split(" ")); + } else if (Array.isArray(rawKeywords)) { + compileList(scopeName, rawKeywords); + } else { + Object.keys(rawKeywords).forEach(function(scopeName2) { + Object.assign( + compiledKeywords, + compileKeywords2(rawKeywords[scopeName2], caseInsensitive, scopeName2) + ); + }); + } + return compiledKeywords; + function compileList(scopeName2, keywordList) { + if (caseInsensitive) { + keywordList = keywordList.map((x) => x.toLowerCase()); + } + keywordList.forEach(function(keyword) { + const pair = keyword.split("|"); + compiledKeywords[pair[0]] = [scopeName2, scoreForKeyword2(pair[0], pair[1])]; + }); + } + } + function scoreForKeyword2(keyword, providedScore) { + if (providedScore) { + return Number(providedScore); + } + return commonKeyword2(keyword) ? 0 : 1; + } + function commonKeyword2(keyword) { + return COMMON_KEYWORDS2.includes(keyword.toLowerCase()); + } + var seenDeprecations2 = {}; + var error2 = (message) => { + console.error(message); + }; + var warn3 = (message, ...args) => { + console.log(`WARN: ${message}`, ...args); + }; + var deprecated2 = (version3, message) => { + if (seenDeprecations2[`${version3}/${message}`]) + return; + console.log(`Deprecated as of ${version3}. ${message}`); + seenDeprecations2[`${version3}/${message}`] = true; + }; + var MultiClassError2 = new Error(); + function remapScopeNames2(mode, regexes, { key }) { + let offset2 = 0; + const scopeNames = mode[key]; + const emit = {}; + const positions = {}; + for (let i = 1; i <= regexes.length; i++) { + positions[i + offset2] = scopeNames[i]; + emit[i + offset2] = true; + offset2 += countMatchGroups2(regexes[i - 1]); + } + mode[key] = positions; + mode[key]._emit = emit; + mode[key]._multi = true; + } + function beginMultiClass2(mode) { + if (!Array.isArray(mode.begin)) + return; + if (mode.skip || mode.excludeBegin || mode.returnBegin) { + error2("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); + throw MultiClassError2; + } + if (typeof mode.beginScope !== "object" || mode.beginScope === null) { + error2("beginScope must be object"); + throw MultiClassError2; + } + remapScopeNames2(mode, mode.begin, { key: "beginScope" }); + mode.begin = _rewriteBackreferences2(mode.begin, { joinWith: "" }); + } + function endMultiClass2(mode) { + if (!Array.isArray(mode.end)) + return; + if (mode.skip || mode.excludeEnd || mode.returnEnd) { + error2("skip, excludeEnd, returnEnd not compatible with endScope: {}"); + throw MultiClassError2; + } + if (typeof mode.endScope !== "object" || mode.endScope === null) { + error2("endScope must be object"); + throw MultiClassError2; + } + remapScopeNames2(mode, mode.end, { key: "endScope" }); + mode.end = _rewriteBackreferences2(mode.end, { joinWith: "" }); + } + function scopeSugar2(mode) { + if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { + mode.beginScope = mode.scope; + delete mode.scope; + } + } + function MultiClass2(mode) { + scopeSugar2(mode); + if (typeof mode.beginScope === "string") { + mode.beginScope = { _wrap: mode.beginScope }; + } + if (typeof mode.endScope === "string") { + mode.endScope = { _wrap: mode.endScope }; + } + beginMultiClass2(mode); + endMultiClass2(mode); + } + function compileLanguage2(language) { + function langRe(value, global2) { + return new RegExp( + source3(value), + "m" + (language.case_insensitive ? "i" : "") + (language.unicodeRegex ? "u" : "") + (global2 ? "g" : "") + ); + } + class MultiRegex { + constructor() { + this.matchIndexes = {}; + this.regexes = []; + this.matchAt = 1; + this.position = 0; + } + // @ts-ignore + addRule(re, opts) { + opts.position = this.position++; + this.matchIndexes[this.matchAt] = opts; + this.regexes.push([opts, re]); + this.matchAt += countMatchGroups2(re) + 1; + } + compile() { + if (this.regexes.length === 0) { + this.exec = () => null; + } + const terminators = this.regexes.map((el) => el[1]); + this.matcherRe = langRe(_rewriteBackreferences2(terminators, { joinWith: "|" }), true); + this.lastIndex = 0; + } + /** @param {string} s */ + exec(s) { + this.matcherRe.lastIndex = this.lastIndex; + const match = this.matcherRe.exec(s); + if (!match) { + return null; + } + const i = match.findIndex((el, i2) => i2 > 0 && el !== void 0); + const matchData = this.matchIndexes[i]; + match.splice(0, i); + return Object.assign(match, matchData); + } + } + class ResumableMultiRegex { + constructor() { + this.rules = []; + this.multiRegexes = []; + this.count = 0; + this.lastIndex = 0; + this.regexIndex = 0; + } + // @ts-ignore + getMatcher(index) { + if (this.multiRegexes[index]) + return this.multiRegexes[index]; + const matcher = new MultiRegex(); + this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); + matcher.compile(); + this.multiRegexes[index] = matcher; + return matcher; + } + resumingScanAtSamePosition() { + return this.regexIndex !== 0; + } + considerAll() { + this.regexIndex = 0; + } + // @ts-ignore + addRule(re, opts) { + this.rules.push([re, opts]); + if (opts.type === "begin") + this.count++; + } + /** @param {string} s */ + exec(s) { + const m = this.getMatcher(this.regexIndex); + m.lastIndex = this.lastIndex; + let result = m.exec(s); + if (this.resumingScanAtSamePosition()) { + if (result && result.index === this.lastIndex) + ; + else { + const m2 = this.getMatcher(0); + m2.lastIndex = this.lastIndex + 1; + result = m2.exec(s); + } + } + if (result) { + this.regexIndex += result.position + 1; + if (this.regexIndex === this.count) { + this.considerAll(); + } + } + return result; + } + } + function buildModeRegex(mode) { + const mm = new ResumableMultiRegex(); + mode.contains.forEach((term) => mm.addRule(term.begin, { rule: term, type: "begin" })); + if (mode.terminatorEnd) { + mm.addRule(mode.terminatorEnd, { type: "end" }); + } + if (mode.illegal) { + mm.addRule(mode.illegal, { type: "illegal" }); + } + return mm; + } + function compileMode(mode, parent) { + const cmode = ( + /** @type CompiledMode */ + mode + ); + if (mode.isCompiled) + return cmode; + [ + scopeClassName2, + // do this early so compiler extensions generally don't have to worry about + // the distinction between match/begin + compileMatch2, + MultiClass2, + beforeMatchExt2 + ].forEach((ext) => ext(mode, parent)); + language.compilerExtensions.forEach((ext) => ext(mode, parent)); + mode.__beforeBegin = null; + [ + beginKeywords2, + // do this later so compiler extensions that come earlier have access to the + // raw array if they wanted to perhaps manipulate it, etc. + compileIllegal2, + // default to 1 relevance if not specified + compileRelevance2 + ].forEach((ext) => ext(mode, parent)); + mode.isCompiled = true; + let keywordPattern = null; + if (typeof mode.keywords === "object" && mode.keywords.$pattern) { + mode.keywords = Object.assign({}, mode.keywords); + keywordPattern = mode.keywords.$pattern; + delete mode.keywords.$pattern; + } + keywordPattern = keywordPattern || /\w+/; + if (mode.keywords) { + mode.keywords = compileKeywords2(mode.keywords, language.case_insensitive); + } + cmode.keywordPatternRe = langRe(keywordPattern, true); + if (parent) { + if (!mode.begin) + mode.begin = /\B|\b/; + cmode.beginRe = langRe(cmode.begin); + if (!mode.end && !mode.endsWithParent) + mode.end = /\B|\b/; + if (mode.end) + cmode.endRe = langRe(cmode.end); + cmode.terminatorEnd = source3(cmode.end) || ""; + if (mode.endsWithParent && parent.terminatorEnd) { + cmode.terminatorEnd += (mode.end ? "|" : "") + parent.terminatorEnd; + } + } + if (mode.illegal) + cmode.illegalRe = langRe( + /** @type {RegExp | string} */ + mode.illegal + ); + if (!mode.contains) + mode.contains = []; + mode.contains = [].concat(...mode.contains.map(function(c2) { + return expandOrCloneMode2(c2 === "self" ? mode : c2); + })); + mode.contains.forEach(function(c2) { + compileMode( + /** @type Mode */ + c2, + cmode + ); + }); + if (mode.starts) { + compileMode(mode.starts, parent); + } + cmode.matcher = buildModeRegex(cmode); + return cmode; + } + if (!language.compilerExtensions) + language.compilerExtensions = []; + if (language.contains && language.contains.includes("self")) { + throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); + } + language.classNameAliases = inherit$12(language.classNameAliases || {}); + return compileMode( + /** @type Mode */ + language + ); + } + function dependencyOnParent2(mode) { + if (!mode) + return false; + return mode.endsWithParent || dependencyOnParent2(mode.starts); + } + function expandOrCloneMode2(mode) { + if (mode.variants && !mode.cachedVariants) { + mode.cachedVariants = mode.variants.map(function(variant) { + return inherit$12(mode, { variants: null }, variant); + }); + } + if (mode.cachedVariants) { + return mode.cachedVariants; + } + if (dependencyOnParent2(mode)) { + return inherit$12(mode, { starts: mode.starts ? inherit$12(mode.starts) : null }); + } + if (Object.isFrozen(mode)) { + return inherit$12(mode); + } + return mode; + } + var version2 = "11.8.0"; + var HTMLInjectionError2 = class extends Error { + constructor(reason, html) { + super(reason); + this.name = "HTMLInjectionError"; + this.html = html; + } + }; + var escape2 = escapeHTML2; + var inherit2 = inherit$12; + var NO_MATCH2 = Symbol("nomatch"); + var MAX_KEYWORD_HITS2 = 7; + var HLJS2 = function(hljs) { + const languages = /* @__PURE__ */ Object.create(null); + const aliases = /* @__PURE__ */ Object.create(null); + const plugins = []; + let SAFE_MODE = true; + const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; + const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: "Plain text", contains: [] }; + let options = { + ignoreUnescapedHTML: false, + throwUnescapedHTML: false, + noHighlightRe: /^(no-?highlight)$/i, + languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, + classPrefix: "hljs-", + cssSelector: "pre code", + languages: null, + // beta configuration options, subject to change, welcome to discuss + // https://github.com/highlightjs/highlight.js/issues/1086 + __emitter: TokenTreeEmitter2 + }; + function shouldNotHighlight(languageName) { + return options.noHighlightRe.test(languageName); + } + function blockLanguage(block) { + let classes = block.className + " "; + classes += block.parentNode ? block.parentNode.className : ""; + const match = options.languageDetectRe.exec(classes); + if (match) { + const language = getLanguage(match[1]); + if (!language) { + warn3(LANGUAGE_NOT_FOUND.replace("{}", match[1])); + warn3("Falling back to no-highlight mode for this block.", block); + } + return language ? match[1] : "no-highlight"; + } + return classes.split(/\s+/).find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); + } + function highlight4(codeOrLanguageName, optionsOrCode, ignoreIllegals) { + let code = ""; + let languageName = ""; + if (typeof optionsOrCode === "object") { + code = codeOrLanguageName; + ignoreIllegals = optionsOrCode.ignoreIllegals; + languageName = optionsOrCode.language; + } else { + deprecated2("10.7.0", "highlight(lang, code, ...args) has been deprecated."); + deprecated2("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); + languageName = codeOrLanguageName; + code = optionsOrCode; + } + if (ignoreIllegals === void 0) { + ignoreIllegals = true; + } + const context = { + code, + language: languageName + }; + fire2("before:highlight", context); + const result = context.result ? context.result : _highlight(context.language, context.code, ignoreIllegals); + result.code = context.code; + fire2("after:highlight", result); + return result; + } + function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { + const keywordHits = /* @__PURE__ */ Object.create(null); + function keywordData(mode, matchText) { + return mode.keywords[matchText]; + } + function processKeywords() { + if (!top2.keywords) { + emitter.addText(modeBuffer); + return; + } + let lastIndex = 0; + top2.keywordPatternRe.lastIndex = 0; + let match = top2.keywordPatternRe.exec(modeBuffer); + let buf = ""; + while (match) { + buf += modeBuffer.substring(lastIndex, match.index); + const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; + const data = keywordData(top2, word); + if (data) { + const [kind, keywordRelevance] = data; + emitter.addText(buf); + buf = ""; + keywordHits[word] = (keywordHits[word] || 0) + 1; + if (keywordHits[word] <= MAX_KEYWORD_HITS2) + relevance += keywordRelevance; + if (kind.startsWith("_")) { + buf += match[0]; + } else { + const cssClass = language.classNameAliases[kind] || kind; + emitKeyword(match[0], cssClass); + } + } else { + buf += match[0]; + } + lastIndex = top2.keywordPatternRe.lastIndex; + match = top2.keywordPatternRe.exec(modeBuffer); + } + buf += modeBuffer.substring(lastIndex); + emitter.addText(buf); + } + function processSubLanguage() { + if (modeBuffer === "") + return; + let result2 = null; + if (typeof top2.subLanguage === "string") { + if (!languages[top2.subLanguage]) { + emitter.addText(modeBuffer); + return; + } + result2 = _highlight(top2.subLanguage, modeBuffer, true, continuations[top2.subLanguage]); + continuations[top2.subLanguage] = /** @type {CompiledMode} */ + result2._top; + } else { + result2 = highlightAuto2(modeBuffer, top2.subLanguage.length ? top2.subLanguage : null); + } + if (top2.relevance > 0) { + relevance += result2.relevance; + } + emitter.__addSublanguage(result2._emitter, result2.language); + } + function processBuffer() { + if (top2.subLanguage != null) { + processSubLanguage(); + } else { + processKeywords(); + } + modeBuffer = ""; + } + function emitKeyword(keyword, scope) { + if (keyword === "") + return; + emitter.startScope(scope); + emitter.addText(keyword); + emitter.endScope(); + } + function emitMultiClass(scope, match) { + let i = 1; + const max2 = match.length - 1; + while (i <= max2) { + if (!scope._emit[i]) { + i++; + continue; + } + const klass = language.classNameAliases[scope[i]] || scope[i]; + const text = match[i]; + if (klass) { + emitKeyword(text, klass); + } else { + modeBuffer = text; + processKeywords(); + modeBuffer = ""; + } + i++; + } + } + function startNewMode(mode, match) { + if (mode.scope && typeof mode.scope === "string") { + emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); + } + if (mode.beginScope) { + if (mode.beginScope._wrap) { + emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); + modeBuffer = ""; + } else if (mode.beginScope._multi) { + emitMultiClass(mode.beginScope, match); + modeBuffer = ""; + } + } + top2 = Object.create(mode, { parent: { value: top2 } }); + return top2; + } + function endOfMode(mode, match, matchPlusRemainder) { + let matched = startsWith2(mode.endRe, matchPlusRemainder); + if (matched) { + if (mode["on:end"]) { + const resp = new Response2(mode); + mode["on:end"](match, resp); + if (resp.isMatchIgnored) + matched = false; + } + if (matched) { + while (mode.endsParent && mode.parent) { + mode = mode.parent; + } + return mode; + } + } + if (mode.endsWithParent) { + return endOfMode(mode.parent, match, matchPlusRemainder); + } + } + function doIgnore(lexeme) { + if (top2.matcher.regexIndex === 0) { + modeBuffer += lexeme[0]; + return 1; + } else { + resumeScanAtSamePosition = true; + return 0; + } + } + function doBeginMatch(match) { + const lexeme = match[0]; + const newMode = match.rule; + const resp = new Response2(newMode); + const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; + for (const cb of beforeCallbacks) { + if (!cb) + continue; + cb(match, resp); + if (resp.isMatchIgnored) + return doIgnore(lexeme); + } + if (newMode.skip) { + modeBuffer += lexeme; + } else { + if (newMode.excludeBegin) { + modeBuffer += lexeme; + } + processBuffer(); + if (!newMode.returnBegin && !newMode.excludeBegin) { + modeBuffer = lexeme; + } + } + startNewMode(newMode, match); + return newMode.returnBegin ? 0 : lexeme.length; + } + function doEndMatch(match) { + const lexeme = match[0]; + const matchPlusRemainder = codeToHighlight.substring(match.index); + const endMode = endOfMode(top2, match, matchPlusRemainder); + if (!endMode) { + return NO_MATCH2; + } + const origin = top2; + if (top2.endScope && top2.endScope._wrap) { + processBuffer(); + emitKeyword(lexeme, top2.endScope._wrap); + } else if (top2.endScope && top2.endScope._multi) { + processBuffer(); + emitMultiClass(top2.endScope, match); + } else if (origin.skip) { + modeBuffer += lexeme; + } else { + if (!(origin.returnEnd || origin.excludeEnd)) { + modeBuffer += lexeme; + } + processBuffer(); + if (origin.excludeEnd) { + modeBuffer = lexeme; + } + } + do { + if (top2.scope) { + emitter.closeNode(); + } + if (!top2.skip && !top2.subLanguage) { + relevance += top2.relevance; + } + top2 = top2.parent; + } while (top2 !== endMode.parent); + if (endMode.starts) { + startNewMode(endMode.starts, match); + } + return origin.returnEnd ? 0 : lexeme.length; + } + function processContinuations() { + const list = []; + for (let current = top2; current !== language; current = current.parent) { + if (current.scope) { + list.unshift(current.scope); + } + } + list.forEach((item) => emitter.openNode(item)); + } + let lastMatch = {}; + function processLexeme(textBeforeMatch, match) { + const lexeme = match && match[0]; + modeBuffer += textBeforeMatch; + if (lexeme == null) { + processBuffer(); + return 0; + } + if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { + modeBuffer += codeToHighlight.slice(match.index, match.index + 1); + if (!SAFE_MODE) { + const err = new Error(`0 width match regex (${languageName})`); + err.languageName = languageName; + err.badRule = lastMatch.rule; + throw err; + } + return 1; + } + lastMatch = match; + if (match.type === "begin") { + return doBeginMatch(match); + } else if (match.type === "illegal" && !ignoreIllegals) { + const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top2.scope || "") + '"'); + err.mode = top2; + throw err; + } else if (match.type === "end") { + const processed = doEndMatch(match); + if (processed !== NO_MATCH2) { + return processed; + } + } + if (match.type === "illegal" && lexeme === "") { + return 1; + } + if (iterations > 1e5 && iterations > match.index * 3) { + const err = new Error("potential infinite loop, way more iterations than matches"); + throw err; + } + modeBuffer += lexeme; + return lexeme.length; + } + const language = getLanguage(languageName); + if (!language) { + error2(LANGUAGE_NOT_FOUND.replace("{}", languageName)); + throw new Error('Unknown language: "' + languageName + '"'); + } + const md = compileLanguage2(language); + let result = ""; + let top2 = continuation || md; + const continuations = {}; + const emitter = new options.__emitter(options); + processContinuations(); + let modeBuffer = ""; + let relevance = 0; + let index = 0; + let iterations = 0; + let resumeScanAtSamePosition = false; + try { + if (!language.__emitTokens) { + top2.matcher.considerAll(); + for (; ; ) { + iterations++; + if (resumeScanAtSamePosition) { + resumeScanAtSamePosition = false; + } else { + top2.matcher.considerAll(); + } + top2.matcher.lastIndex = index; + const match = top2.matcher.exec(codeToHighlight); + if (!match) + break; + const beforeMatch = codeToHighlight.substring(index, match.index); + const processedCount = processLexeme(beforeMatch, match); + index = match.index + processedCount; + } + processLexeme(codeToHighlight.substring(index)); + } else { + language.__emitTokens(codeToHighlight, emitter); + } + emitter.finalize(); + result = emitter.toHTML(); + return { + language: languageName, + value: result, + relevance, + illegal: false, + _emitter: emitter, + _top: top2 + }; + } catch (err) { + if (err.message && err.message.includes("Illegal")) { + return { + language: languageName, + value: escape2(codeToHighlight), + illegal: true, + relevance: 0, + _illegalBy: { + message: err.message, + index, + context: codeToHighlight.slice(index - 100, index + 100), + mode: err.mode, + resultSoFar: result + }, + _emitter: emitter + }; + } else if (SAFE_MODE) { + return { + language: languageName, + value: escape2(codeToHighlight), + illegal: false, + relevance: 0, + errorRaised: err, + _emitter: emitter, + _top: top2 + }; + } else { + throw err; + } + } + } + function justTextHighlightResult(code) { + const result = { + value: escape2(code), + illegal: false, + relevance: 0, + _top: PLAINTEXT_LANGUAGE, + _emitter: new options.__emitter(options) + }; + result._emitter.addText(code); + return result; + } + function highlightAuto2(code, languageSubset) { + languageSubset = languageSubset || options.languages || Object.keys(languages); + const plaintext2 = justTextHighlightResult(code); + const results = languageSubset.filter(getLanguage).filter(autoDetection).map( + (name) => _highlight(name, code, false) + ); + results.unshift(plaintext2); + const sorted = results.sort((a, b) => { + if (a.relevance !== b.relevance) + return b.relevance - a.relevance; + if (a.language && b.language) { + if (getLanguage(a.language).supersetOf === b.language) { + return 1; + } else if (getLanguage(b.language).supersetOf === a.language) { + return -1; + } + } + return 0; + }); + const [best, secondBest] = sorted; + const result = best; + result.secondBest = secondBest; + return result; + } + function updateClassName(element, currentLang, resultLang) { + const language = currentLang && aliases[currentLang] || resultLang; + element.classList.add("hljs"); + element.classList.add(`language-${language}`); + } + function highlightElement(element) { + let node = null; + const language = blockLanguage(element); + if (shouldNotHighlight(language)) + return; + fire2( + "before:highlightElement", + { el: element, language } + ); + if (element.children.length > 0) { + if (!options.ignoreUnescapedHTML) { + console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); + console.warn("https://github.com/highlightjs/highlight.js/wiki/security"); + console.warn("The element with unescaped HTML:"); + console.warn(element); + } + if (options.throwUnescapedHTML) { + const err = new HTMLInjectionError2( + "One of your code blocks includes unescaped HTML.", + element.innerHTML + ); + throw err; + } + } + node = element; + const text = node.textContent; + const result = language ? highlight4(text, { language, ignoreIllegals: true }) : highlightAuto2(text); + element.innerHTML = result.value; + updateClassName(element, language, result.language); + element.result = { + language: result.language, + // TODO: remove with version 11.0 + re: result.relevance, + relevance: result.relevance + }; + if (result.secondBest) { + element.secondBest = { + language: result.secondBest.language, + relevance: result.secondBest.relevance + }; + } + fire2("after:highlightElement", { el: element, result, text }); + } + function configure(userOptions) { + options = inherit2(options, userOptions); + } + const initHighlighting = () => { + highlightAll(); + deprecated2("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); + }; + function initHighlightingOnLoad() { + highlightAll(); + deprecated2("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); + } + let wantsHighlight = false; + function highlightAll() { + if (document.readyState === "loading") { + wantsHighlight = true; + return; + } + const blocks = document.querySelectorAll(options.cssSelector); + blocks.forEach(highlightElement); + } + function boot() { + if (wantsHighlight) + highlightAll(); + } + if (typeof window !== "undefined" && window.addEventListener) { + window.addEventListener("DOMContentLoaded", boot, false); + } + function registerLanguage2(languageName, languageDefinition) { + let lang = null; + try { + lang = languageDefinition(hljs); + } catch (error$1) { + error2("Language definition for '{}' could not be registered.".replace("{}", languageName)); + if (!SAFE_MODE) { + throw error$1; + } else { + error2(error$1); + } + lang = PLAINTEXT_LANGUAGE; + } + if (!lang.name) + lang.name = languageName; + languages[languageName] = lang; + lang.rawDefinition = languageDefinition.bind(null, hljs); + if (lang.aliases) { + registerAliases(lang.aliases, { languageName }); + } + } + function unregisterLanguage(languageName) { + delete languages[languageName]; + for (const alias of Object.keys(aliases)) { + if (aliases[alias] === languageName) { + delete aliases[alias]; + } + } + } + function listLanguages2() { + return Object.keys(languages); + } + function getLanguage(name) { + name = (name || "").toLowerCase(); + return languages[name] || languages[aliases[name]]; + } + function registerAliases(aliasList, { languageName }) { + if (typeof aliasList === "string") { + aliasList = [aliasList]; + } + aliasList.forEach((alias) => { + aliases[alias.toLowerCase()] = languageName; + }); + } + function autoDetection(name) { + const lang = getLanguage(name); + return lang && !lang.disableAutodetect; + } + function upgradePluginAPI(plugin) { + if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { + plugin["before:highlightElement"] = (data) => { + plugin["before:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { + plugin["after:highlightElement"] = (data) => { + plugin["after:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + } + function addPlugin(plugin) { + upgradePluginAPI(plugin); + plugins.push(plugin); + } + function removePlugin(plugin) { + const index = plugins.indexOf(plugin); + if (index !== -1) { + plugins.splice(index, 1); + } + } + function fire2(event, args) { + const cb = event; + plugins.forEach(function(plugin) { + if (plugin[cb]) { + plugin[cb](args); + } + }); + } + function deprecateHighlightBlock(el) { + deprecated2("10.7.0", "highlightBlock will be removed entirely in v12.0"); + deprecated2("10.7.0", "Please use highlightElement now."); + return highlightElement(el); + } + Object.assign(hljs, { + highlight: highlight4, + highlightAuto: highlightAuto2, + highlightAll, + highlightElement, + // TODO: Remove with v12 API + highlightBlock: deprecateHighlightBlock, + configure, + initHighlighting, + initHighlightingOnLoad, + registerLanguage: registerLanguage2, + unregisterLanguage, + listLanguages: listLanguages2, + getLanguage, + registerAliases, + autoDetection, + inherit: inherit2, + addPlugin, + removePlugin + }); + hljs.debugMode = function() { + SAFE_MODE = false; + }; + hljs.safeMode = function() { + SAFE_MODE = true; + }; + hljs.versionString = version2; + hljs.regex = { + concat: concat3, + lookahead: lookahead3, + either: either3, + optional: optional2, + anyNumberOfTimes: anyNumberOfTimes2 + }; + for (const key in MODES5) { + if (typeof MODES5[key] === "object") { + deepFreeze2(MODES5[key]); + } + } + Object.assign(hljs, MODES5); + return hljs; + }; + var highlight3 = HLJS2({}); + highlight3.newInstance = () => HLJS2({}); + module.exports = highlight3; + highlight3.HighlightJS = highlight3; + highlight3.default = highlight3; + } +}); + +// node_modules/format/format.js +var require_format = __commonJS({ + "node_modules/format/format.js"(exports, module) { + (function() { + var namespace; + if (typeof module !== "undefined") { + namespace = module.exports = format2; + } else { + namespace = function() { + return this || (1, eval)("this"); + }(); + } + namespace.format = format2; + namespace.vsprintf = vsprintf; + if (typeof console !== "undefined" && typeof console.log === "function") { + namespace.printf = printf; + } + function printf() { + console.log(format2.apply(null, arguments)); + } + function vsprintf(fmt, replacements) { + return format2.apply(null, [fmt].concat(replacements)); + } + function format2(fmt) { + var argIndex = 1, args = [].slice.call(arguments), i = 0, n = fmt.length, result = "", c2, escaped = false, arg, tmp, leadingZero = false, precision, nextArg = function() { + return args[argIndex++]; + }, slurpNumber = function() { + var digits = ""; + while (/\d/.test(fmt[i])) { + digits += fmt[i++]; + c2 = fmt[i]; + } + return digits.length > 0 ? parseInt(digits) : null; + }; + for (; i < n; ++i) { + c2 = fmt[i]; + if (escaped) { + escaped = false; + if (c2 == ".") { + leadingZero = false; + c2 = fmt[++i]; + } else if (c2 == "0" && fmt[i + 1] == ".") { + leadingZero = true; + i += 2; + c2 = fmt[i]; + } else { + leadingZero = true; + } + precision = slurpNumber(); + switch (c2) { + case "b": + result += parseInt(nextArg(), 10).toString(2); + break; + case "c": + arg = nextArg(); + if (typeof arg === "string" || arg instanceof String) + result += arg; + else + result += String.fromCharCode(parseInt(arg, 10)); + break; + case "d": + result += parseInt(nextArg(), 10); + break; + case "f": + tmp = String(parseFloat(nextArg()).toFixed(precision || 6)); + result += leadingZero ? tmp : tmp.replace(/^0/, ""); + break; + case "j": + result += JSON.stringify(nextArg()); + break; + case "o": + result += "0" + parseInt(nextArg(), 10).toString(8); + break; + case "s": + result += nextArg(); + break; + case "x": + result += "0x" + parseInt(nextArg(), 10).toString(16); + break; + case "X": + result += "0x" + parseInt(nextArg(), 10).toString(16).toUpperCase(); + break; + default: + result += c2; + break; + } + } else if (c2 === "%") { + escaped = true; + } else { + result += c2; + } + } + return result; + } + })(); + } +}); + +// node_modules/lodash/lodash.js +var require_lodash = __commonJS({ + "node_modules/lodash/lodash.js"(exports, module) { + (function() { + var undefined2; + var VERSION = "4.17.21"; + var LARGE_ARRAY_SIZE = 200; + var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`"; + var HASH_UNDEFINED = "__lodash_hash_undefined__"; + var MAX_MEMOIZE_SIZE = 500; + var PLACEHOLDER = "__lodash_placeholder__"; + var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; + var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; + var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512; + var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "..."; + var HOT_COUNT = 800, HOT_SPAN = 16; + var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3; + var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN = 0 / 0; + var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + var wrapFlags = [ + ["ary", WRAP_ARY_FLAG], + ["bind", WRAP_BIND_FLAG], + ["bindKey", WRAP_BIND_KEY_FLAG], + ["curry", WRAP_CURRY_FLAG], + ["curryRight", WRAP_CURRY_RIGHT_FLAG], + ["flip", WRAP_FLIP_FLAG], + ["partial", WRAP_PARTIAL_FLAG], + ["partialRight", WRAP_PARTIAL_RIGHT_FLAG], + ["rearg", WRAP_REARG_FLAG] + ]; + var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", undefinedTag = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]"; + var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]"; + var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml = /[&<>"']/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); + var reTrimStart = /^\s+/; + var reWhitespace = /\s/; + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /; + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; + var reEscapeChar = /\\(\\)?/g; + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + var reFlags = /\w*$/; + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + var reIsBinary = /^0b[01]+$/i; + var reIsHostCtor = /^\[object .+?Constructor\]$/; + var reIsOctal = /^0o[0-7]+$/i; + var reIsUint = /^(?:0|[1-9]\d*)$/; + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + var reNoMatch = /($^)/; + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d"; + var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")"; + var reApos = RegExp(rsApos, "g"); + var reComboMark = RegExp(rsCombo, "g"); + var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g"); + var reUnicodeWord = RegExp([ + rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")", + rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")", + rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower, + rsUpper + "+" + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join("|"), "g"); + var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]"); + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + var contextProps = [ + "Array", + "Buffer", + "DataView", + "Date", + "Error", + "Float32Array", + "Float64Array", + "Function", + "Int8Array", + "Int16Array", + "Int32Array", + "Map", + "Math", + "Object", + "Promise", + "RegExp", + "Set", + "String", + "Symbol", + "TypeError", + "Uint8Array", + "Uint8ClampedArray", + "Uint16Array", + "Uint32Array", + "WeakMap", + "_", + "clearTimeout", + "isFinite", + "parseInt", + "setTimeout" + ]; + var templateCounter = -1; + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; + var deburredLetters = { + // Latin-1 Supplement block. + "\xC0": "A", + "\xC1": "A", + "\xC2": "A", + "\xC3": "A", + "\xC4": "A", + "\xC5": "A", + "\xE0": "a", + "\xE1": "a", + "\xE2": "a", + "\xE3": "a", + "\xE4": "a", + "\xE5": "a", + "\xC7": "C", + "\xE7": "c", + "\xD0": "D", + "\xF0": "d", + "\xC8": "E", + "\xC9": "E", + "\xCA": "E", + "\xCB": "E", + "\xE8": "e", + "\xE9": "e", + "\xEA": "e", + "\xEB": "e", + "\xCC": "I", + "\xCD": "I", + "\xCE": "I", + "\xCF": "I", + "\xEC": "i", + "\xED": "i", + "\xEE": "i", + "\xEF": "i", + "\xD1": "N", + "\xF1": "n", + "\xD2": "O", + "\xD3": "O", + "\xD4": "O", + "\xD5": "O", + "\xD6": "O", + "\xD8": "O", + "\xF2": "o", + "\xF3": "o", + "\xF4": "o", + "\xF5": "o", + "\xF6": "o", + "\xF8": "o", + "\xD9": "U", + "\xDA": "U", + "\xDB": "U", + "\xDC": "U", + "\xF9": "u", + "\xFA": "u", + "\xFB": "u", + "\xFC": "u", + "\xDD": "Y", + "\xFD": "y", + "\xFF": "y", + "\xC6": "Ae", + "\xE6": "ae", + "\xDE": "Th", + "\xFE": "th", + "\xDF": "ss", + // Latin Extended-A block. + "\u0100": "A", + "\u0102": "A", + "\u0104": "A", + "\u0101": "a", + "\u0103": "a", + "\u0105": "a", + "\u0106": "C", + "\u0108": "C", + "\u010A": "C", + "\u010C": "C", + "\u0107": "c", + "\u0109": "c", + "\u010B": "c", + "\u010D": "c", + "\u010E": "D", + "\u0110": "D", + "\u010F": "d", + "\u0111": "d", + "\u0112": "E", + "\u0114": "E", + "\u0116": "E", + "\u0118": "E", + "\u011A": "E", + "\u0113": "e", + "\u0115": "e", + "\u0117": "e", + "\u0119": "e", + "\u011B": "e", + "\u011C": "G", + "\u011E": "G", + "\u0120": "G", + "\u0122": "G", + "\u011D": "g", + "\u011F": "g", + "\u0121": "g", + "\u0123": "g", + "\u0124": "H", + "\u0126": "H", + "\u0125": "h", + "\u0127": "h", + "\u0128": "I", + "\u012A": "I", + "\u012C": "I", + "\u012E": "I", + "\u0130": "I", + "\u0129": "i", + "\u012B": "i", + "\u012D": "i", + "\u012F": "i", + "\u0131": "i", + "\u0134": "J", + "\u0135": "j", + "\u0136": "K", + "\u0137": "k", + "\u0138": "k", + "\u0139": "L", + "\u013B": "L", + "\u013D": "L", + "\u013F": "L", + "\u0141": "L", + "\u013A": "l", + "\u013C": "l", + "\u013E": "l", + "\u0140": "l", + "\u0142": "l", + "\u0143": "N", + "\u0145": "N", + "\u0147": "N", + "\u014A": "N", + "\u0144": "n", + "\u0146": "n", + "\u0148": "n", + "\u014B": "n", + "\u014C": "O", + "\u014E": "O", + "\u0150": "O", + "\u014D": "o", + "\u014F": "o", + "\u0151": "o", + "\u0154": "R", + "\u0156": "R", + "\u0158": "R", + "\u0155": "r", + "\u0157": "r", + "\u0159": "r", + "\u015A": "S", + "\u015C": "S", + "\u015E": "S", + "\u0160": "S", + "\u015B": "s", + "\u015D": "s", + "\u015F": "s", + "\u0161": "s", + "\u0162": "T", + "\u0164": "T", + "\u0166": "T", + "\u0163": "t", + "\u0165": "t", + "\u0167": "t", + "\u0168": "U", + "\u016A": "U", + "\u016C": "U", + "\u016E": "U", + "\u0170": "U", + "\u0172": "U", + "\u0169": "u", + "\u016B": "u", + "\u016D": "u", + "\u016F": "u", + "\u0171": "u", + "\u0173": "u", + "\u0174": "W", + "\u0175": "w", + "\u0176": "Y", + "\u0177": "y", + "\u0178": "Y", + "\u0179": "Z", + "\u017B": "Z", + "\u017D": "Z", + "\u017A": "z", + "\u017C": "z", + "\u017E": "z", + "\u0132": "IJ", + "\u0133": "ij", + "\u0152": "Oe", + "\u0153": "oe", + "\u0149": "'n", + "\u017F": "s" + }; + var htmlEscapes = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'" + }; + var htmlUnescapes = { + "&": "&", + "<": "<", + ">": ">", + """: '"', + "'": "'" + }; + var stringEscapes = { + "\\": "\\", + "'": "'", + "\n": "n", + "\r": "r", + "\u2028": "u2028", + "\u2029": "u2029" + }; + var freeParseFloat = parseFloat, freeParseInt = parseInt; + var freeGlobal = typeof global == "object" && global && global.Object === Object && global; + var freeSelf = typeof self == "object" && self && self.Object === Object && self; + var root = freeGlobal || freeSelf || Function("return this")(); + var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports; + var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module; + var moduleExports = freeModule && freeModule.exports === freeExports; + var freeProcess = moduleExports && freeGlobal.process; + var nodeUtil = function() { + try { + var types = freeModule && freeModule.require && freeModule.require("util").types; + if (types) { + return types; + } + return freeProcess && freeProcess.binding && freeProcess.binding("util"); + } catch (e) { + } + }(); + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + function apply2(func, thisArg, args) { + switch (args.length) { + case 0: + return func.call(thisArg); + case 1: + return func.call(thisArg, args[0]); + case 2: + return func.call(thisArg, args[0], args[1]); + case 3: + return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + function arrayEach(array, iteratee) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + function arrayEvery(array, predicate) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + function arrayFilter(array, predicate) { + var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + function arrayIncludesWith(array, value, comparator) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + function arrayMap(array, iteratee) { + var index = -1, length = array == null ? 0 : array.length, result = Array(length); + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + function arrayPush(array, values) { + var index = -1, length = values.length, offset2 = array.length; + while (++index < length) { + array[offset2 + index] = values[index]; + } + return array; + } + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + function arraySome(array, predicate) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + var asciiSize = baseProperty("length"); + function asciiToArray(string) { + return string.split(""); + } + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection2) { + if (predicate(value, key, collection2)) { + result = key; + return false; + } + }); + return result; + } + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, index = fromIndex + (fromRight ? 1 : -1); + while (fromRight ? index-- : ++index < length) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + function baseIndexOf(array, value, fromIndex) { + return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); + } + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, length = array.length; + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + function baseIsNaN(value) { + return value !== value; + } + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? baseSum(array, iteratee) / length : NAN; + } + function baseProperty(key) { + return function(object) { + return object == null ? undefined2 : object[key]; + }; + } + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined2 : object[key]; + }; + } + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection2) { + accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection2); + }); + return accumulator; + } + function baseSortBy(array, comparer) { + var length = array.length; + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + function baseSum(array, iteratee) { + var result, index = -1, length = array.length; + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined2) { + result = result === undefined2 ? current : result + current; + } + } + return result; + } + function baseTimes(n, iteratee) { + var index = -1, result = Array(n); + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + function baseTrim(string) { + return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string; + } + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + function cacheHas(cache2, key) { + return cache2.has(key); + } + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, length = strSymbols.length; + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) { + } + return index; + } + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) { + } + return index; + } + function countHolders(array, placeholder) { + var length = array.length, result = 0; + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + var deburrLetter = basePropertyOf(deburredLetters); + var escapeHtmlChar = basePropertyOf(htmlEscapes); + function escapeStringChar(chr) { + return "\\" + stringEscapes[chr]; + } + function getValue(object, key) { + return object == null ? undefined2 : object[key]; + } + function hasUnicode(string) { + return reHasUnicode.test(string); + } + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + function iteratorToArray(iterator) { + var data, result = []; + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + function mapToArray(map2) { + var index = -1, result = Array(map2.size); + map2.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + function replaceHolders(array, placeholder) { + var index = -1, length = array.length, resIndex = 0, result = []; + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + function setToArray(set) { + var index = -1, result = Array(set.size); + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + function setToPairs(set) { + var index = -1, result = Array(set.size); + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, length = array.length; + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + function stringSize(string) { + return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); + } + function stringToArray2(string) { + return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); + } + function trimmedEndIndex(string) { + var index = string.length; + while (index-- && reWhitespace.test(string.charAt(index))) { + } + return index; + } + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + var runInContext = function runInContext2(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError; + var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto = Object2.prototype; + var coreJsData = context["__core-js_shared__"]; + var funcToString = funcProto.toString; + var hasOwnProperty2 = objectProto.hasOwnProperty; + var idCounter2 = 0; + var maskSrcKey = function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); + return uid ? "Symbol(src)_1." + uid : ""; + }(); + var nativeObjectToString = objectProto.toString; + var objectCtorString = funcToString.call(Object2); + var oldDash = root._; + var reIsNative = RegExp2( + "^" + funcToString.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" + ); + var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2; + var defineProperty = function() { + try { + var func = getNative(Object2, "defineProperty"); + func({}, "", {}); + return func; + } catch (e) { + } + }(); + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse; + var DataView = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap2 = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create"); + var metaMap = WeakMap2 && new WeakMap2(); + var realNames = {}; + var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap2); + var symbolProto = Symbol2 ? Symbol2.prototype : undefined2, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined2, symbolToString = symbolProto ? symbolProto.toString : undefined2; + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty2.call(value, "__wrapped__")) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + var baseCreate = /* @__PURE__ */ function() { + function object() { + } + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result2 = new object(); + object.prototype = undefined2; + return result2; + }; + }(); + function baseLodash() { + } + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined2; + } + lodash.templateSettings = { + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + "escape": reEscape, + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + "evaluate": reEvaluate, + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + "interpolate": reInterpolate, + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + "variable": "", + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + "imports": { + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + "_": lodash + } + }; + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + function lazyClone() { + var result2 = new LazyWrapper(this.__wrapped__); + result2.__actions__ = copyArray(this.__actions__); + result2.__dir__ = this.__dir__; + result2.__filtered__ = this.__filtered__; + result2.__iteratees__ = copyArray(this.__iteratees__); + result2.__takeCount__ = this.__takeCount__; + result2.__views__ = copyArray(this.__views__); + return result2; + } + function lazyReverse() { + if (this.__filtered__) { + var result2 = new LazyWrapper(this); + result2.__dir__ = -1; + result2.__filtered__ = true; + } else { + result2 = this.clone(); + result2.__dir__ *= -1; + } + return result2; + } + function lazyValue() { + var array = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray(array), isRight = dir < 0, arrLength = isArr ? array.length : 0, view = getView(0, arrLength, this.__views__), start2 = view.start, end2 = view.end, length = end2 - start2, index = isRight ? end2 : start2 - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin(length, this.__takeCount__); + if (!isArr || !isRight && arrLength == length && takeCount == length) { + return baseWrapperValue(array, this.__actions__); + } + var result2 = []; + outer: + while (length-- && resIndex < takeCount) { + index += dir; + var iterIndex = -1, value = array[index]; + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], iteratee2 = data.iteratee, type = data.type, computed = iteratee2(value); + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result2[resIndex++] = value; + } + return result2; + } + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + function Hash(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + function hashDelete(key) { + var result2 = this.has(key) && delete this.__data__[key]; + this.size -= result2 ? 1 : 0; + return result2; + } + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result2 = data[key]; + return result2 === HASH_UNDEFINED ? undefined2 : result2; + } + return hasOwnProperty2.call(data, key) ? data[key] : undefined2; + } + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined2 : hasOwnProperty2.call(data, key); + } + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value; + return this; + } + Hash.prototype.clear = hashClear; + Hash.prototype["delete"] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + function ListCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + function listCacheDelete(key) { + var data = this.__data__, index = assocIndexOf(data, key); + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + function listCacheGet(key) { + var data = this.__data__, index = assocIndexOf(data, key); + return index < 0 ? undefined2 : data[index][1]; + } + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + function listCacheSet(key, value) { + var data = this.__data__, index = assocIndexOf(data, key); + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + ListCache.prototype.clear = listCacheClear; + ListCache.prototype["delete"] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + function MapCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + function mapCacheClear() { + this.size = 0; + this.__data__ = { + "hash": new Hash(), + "map": new (Map2 || ListCache)(), + "string": new Hash() + }; + } + function mapCacheDelete(key) { + var result2 = getMapData(this, key)["delete"](key); + this.size -= result2 ? 1 : 0; + return result2; + } + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + function mapCacheSet(key, value) { + var data = getMapData(this, key), size2 = data.size; + data.set(key, value); + this.size += data.size == size2 ? 0 : 1; + return this; + } + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype["delete"] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + function SetCache(values2) { + var index = -1, length = values2 == null ? 0 : values2.length; + this.__data__ = new MapCache(); + while (++index < length) { + this.add(values2[index]); + } + } + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + function setCacheHas(value) { + return this.__data__.has(value); + } + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + function stackClear() { + this.__data__ = new ListCache(); + this.size = 0; + } + function stackDelete(key) { + var data = this.__data__, result2 = data["delete"](key); + this.size = data.size; + return result2; + } + function stackGet(key) { + return this.__data__.get(key); + } + function stackHas(key) { + return this.__data__.has(key); + } + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + Stack.prototype.clear = stackClear; + Stack.prototype["delete"] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType2 = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType2, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length; + for (var key in value) { + if ((inherited || hasOwnProperty2.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode. + (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers. + isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays. + isType2 && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties. + isIndex(key, length)))) { + result2.push(key); + } + } + return result2; + } + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined2; + } + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + function assignMergeValue(object, key, value) { + if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) { + baseAssignValue(object, key, value); + } + } + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty2.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) { + baseAssignValue(object, key, value); + } + } + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + function baseAggregator(collection, setter, iteratee2, accumulator) { + baseEach(collection, function(value, key, collection2) { + setter(accumulator, value, iteratee2(value), collection2); + }); + return accumulator; + } + function baseAssign(object, source3) { + return object && copyObject(source3, keys2(source3), object); + } + function baseAssignIn(object, source3) { + return object && copyObject(source3, keysIn(source3), object); + } + function baseAssignValue(object, key, value) { + if (key == "__proto__" && defineProperty) { + defineProperty(object, key, { + "configurable": true, + "enumerable": true, + "value": value, + "writable": true + }); + } else { + object[key] = value; + } + } + function baseAt(object, paths) { + var index = -1, length = paths.length, result2 = Array2(length), skip = object == null; + while (++index < length) { + result2[index] = skip ? undefined2 : get2(object, paths[index]); + } + return result2; + } + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined2) { + number = number <= upper ? number : upper; + } + if (lower !== undefined2) { + number = number >= lower ? number : lower; + } + } + return number; + } + function baseClone(value, bitmask, customizer, key, object, stack) { + var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG; + if (customizer) { + result2 = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result2 !== undefined2) { + return result2; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result2 = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result2); + } + } else { + var tag = getTag(value), isFunc = tag == funcTag || tag == genTag; + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || isFunc && !object) { + result2 = isFlat || isFunc ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result2 = initCloneByTag(value, tag, isDeep); + } + } + stack || (stack = new Stack()); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result2); + if (isSet(value)) { + value.forEach(function(subValue) { + result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key2) { + result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); + }); + } + var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys2; + var props = isArr ? undefined2 : keysFunc(value); + arrayEach(props || value, function(subValue, key2) { + if (props) { + key2 = subValue; + subValue = value[key2]; + } + assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); + }); + return result2; + } + function baseConforms(source3) { + var props = keys2(source3); + return function(object) { + return baseConformsTo(object, source3, props); + }; + } + function baseConformsTo(object, source3, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object2(object); + while (length--) { + var key = props[length], predicate = source3[key], value = object[key]; + if (value === undefined2 && !(key in object) || !predicate(value)) { + return false; + } + } + return true; + } + function baseDelay(func, wait, args) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return setTimeout2(function() { + func.apply(undefined2, args); + }, wait); + } + function baseDifference(array, values2, iteratee2, comparator) { + var index = -1, includes2 = arrayIncludes, isCommon = true, length = array.length, result2 = [], valuesLength = values2.length; + if (!length) { + return result2; + } + if (iteratee2) { + values2 = arrayMap(values2, baseUnary(iteratee2)); + } + if (comparator) { + includes2 = arrayIncludesWith; + isCommon = false; + } else if (values2.length >= LARGE_ARRAY_SIZE) { + includes2 = cacheHas; + isCommon = false; + values2 = new SetCache(values2); + } + outer: + while (++index < length) { + var value = array[index], computed = iteratee2 == null ? value : iteratee2(value); + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values2[valuesIndex] === computed) { + continue outer; + } + } + result2.push(value); + } else if (!includes2(values2, computed, comparator)) { + result2.push(value); + } + } + return result2; + } + var baseEach = createBaseEach(baseForOwn); + var baseEachRight = createBaseEach(baseForOwnRight, true); + function baseEvery(collection, predicate) { + var result2 = true; + baseEach(collection, function(value, index, collection2) { + result2 = !!predicate(value, index, collection2); + return result2; + }); + return result2; + } + function baseExtremum(array, iteratee2, comparator) { + var index = -1, length = array.length; + while (++index < length) { + var value = array[index], current = iteratee2(value); + if (current != null && (computed === undefined2 ? current === current && !isSymbol(current) : comparator(current, computed))) { + var computed = current, result2 = value; + } + } + return result2; + } + function baseFill(array, value, start2, end2) { + var length = array.length; + start2 = toInteger(start2); + if (start2 < 0) { + start2 = -start2 > length ? 0 : length + start2; + } + end2 = end2 === undefined2 || end2 > length ? length : toInteger(end2); + if (end2 < 0) { + end2 += length; + } + end2 = start2 > end2 ? 0 : toLength(end2); + while (start2 < end2) { + array[start2++] = value; + } + return array; + } + function baseFilter(collection, predicate) { + var result2 = []; + baseEach(collection, function(value, index, collection2) { + if (predicate(value, index, collection2)) { + result2.push(value); + } + }); + return result2; + } + function baseFlatten(array, depth, predicate, isStrict, result2) { + var index = -1, length = array.length; + predicate || (predicate = isFlattenable); + result2 || (result2 = []); + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + baseFlatten(value, depth - 1, predicate, isStrict, result2); + } else { + arrayPush(result2, value); + } + } else if (!isStrict) { + result2[result2.length] = value; + } + } + return result2; + } + var baseFor = createBaseFor(); + var baseForRight = createBaseFor(true); + function baseForOwn(object, iteratee2) { + return object && baseFor(object, iteratee2, keys2); + } + function baseForOwnRight(object, iteratee2) { + return object && baseForRight(object, iteratee2, keys2); + } + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction3(object[key]); + }); + } + function baseGet(object, path) { + path = castPath(path, object); + var index = 0, length = path.length; + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return index && index == length ? object : undefined2; + } + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result2 = keysFunc(object); + return isArray(object) ? result2 : arrayPush(result2, symbolsFunc(object)); + } + function baseGetTag(value) { + if (value == null) { + return value === undefined2 ? undefinedTag : nullTag; + } + return symToStringTag && symToStringTag in Object2(value) ? getRawTag(value) : objectToString(value); + } + function baseGt(value, other) { + return value > other; + } + function baseHas(object, key) { + return object != null && hasOwnProperty2.call(object, key); + } + function baseHasIn(object, key) { + return object != null && key in Object2(object); + } + function baseInRange(number, start2, end2) { + return number >= nativeMin(start2, end2) && number < nativeMax(start2, end2); + } + function baseIntersection(arrays, iteratee2, comparator) { + var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = []; + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee2) { + array = arrayMap(array, baseUnary(iteratee2)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined2; + } + array = arrays[0]; + var index = -1, seen = caches[0]; + outer: + while (++index < length && result2.length < maxLength) { + var value = array[index], computed = iteratee2 ? iteratee2(value) : value; + value = comparator || value !== 0 ? value : 0; + if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) { + othIndex = othLength; + while (--othIndex) { + var cache2 = caches[othIndex]; + if (!(cache2 ? cacheHas(cache2, computed) : includes2(arrays[othIndex], computed, comparator))) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result2.push(value); + } + } + return result2; + } + function baseInverter(object, setter, iteratee2, accumulator) { + baseForOwn(object, function(value, key, object2) { + setter(accumulator, iteratee2(value), key, object2); + }); + return accumulator; + } + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined2 : apply2(func, object, args); + } + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack()); + return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty2.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty2.call(other, "__wrapped__"); + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; + stack || (stack = new Stack()); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack()); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + function baseIsMatch(object, source3, matchData, customizer) { + var index = matchData.length, length = index, noCustomizer = !customizer; + if (object == null) { + return !length; + } + object = Object2(object); + while (index--) { + var data = matchData[index]; + if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], objValue = object[key], srcValue = data[1]; + if (noCustomizer && data[2]) { + if (objValue === undefined2 && !(key in object)) { + return false; + } + } else { + var stack = new Stack(); + if (customizer) { + var result2 = customizer(objValue, srcValue, key, object, source3, stack); + } + if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) { + return false; + } + } + } + return true; + } + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction3(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + function baseIsTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + function baseIteratee(value) { + if (typeof value == "function") { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == "object") { + return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); + } + return property(value); + } + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result2 = []; + for (var key in Object2(object)) { + if (hasOwnProperty2.call(object, key) && key != "constructor") { + result2.push(key); + } + } + return result2; + } + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), result2 = []; + for (var key in object) { + if (!(key == "constructor" && (isProto || !hasOwnProperty2.call(object, key)))) { + result2.push(key); + } + } + return result2; + } + function baseLt(value, other) { + return value < other; + } + function baseMap(collection, iteratee2) { + var index = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : []; + baseEach(collection, function(value, key, collection2) { + result2[++index] = iteratee2(value, key, collection2); + }); + return result2; + } + function baseMatches(source3) { + var matchData = getMatchData(source3); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source3 || baseIsMatch(object, source3, matchData); + }; + } + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get2(object, path); + return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + function baseMerge(object, source3, srcIndex, customizer, stack) { + if (object === source3) { + return; + } + baseFor(source3, function(srcValue, key) { + stack || (stack = new Stack()); + if (isObject(srcValue)) { + baseMergeDeep(object, source3, key, srcIndex, baseMerge, customizer, stack); + } else { + var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source3, stack) : undefined2; + if (newValue === undefined2) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + function baseMergeDeep(object, source3, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), srcValue = safeGet(source3, key), stacked = stack.get(srcValue); + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source3, stack) : undefined2; + var isCommon = newValue === undefined2; + if (isCommon) { + var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } else { + newValue = []; + } + } else if (isPlainObject2(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } else if (!isObject(objValue) || isFunction3(objValue)) { + newValue = initCloneObject(srcValue); + } + } else { + isCommon = false; + } + } + if (isCommon) { + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack["delete"](srcValue); + } + assignMergeValue(object, key, newValue); + } + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined2; + } + function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee2) { + if (isArray(iteratee2)) { + return function(value) { + return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2); + }; + } + return iteratee2; + }); + } else { + iteratees = [identity]; + } + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + var result2 = baseMap(collection, function(value, key, collection2) { + var criteria = arrayMap(iteratees, function(iteratee2) { + return iteratee2(value); + }); + return { "criteria": criteria, "index": ++index, "value": value }; + }); + return baseSortBy(result2, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + function basePickBy(object, paths, predicate) { + var index = -1, length = paths.length, result2 = {}; + while (++index < length) { + var path = paths[index], value = baseGet(object, path); + if (predicate(value, path)) { + baseSet(result2, castPath(path, object), value); + } + } + return result2; + } + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + function basePullAll(array, values2, iteratee2, comparator) { + var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values2.length, seen = array; + if (array === values2) { + values2 = copyArray(values2); + } + if (iteratee2) { + seen = arrayMap(array, baseUnary(iteratee2)); + } + while (++index < length) { + var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value; + while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, lastIndex = length - 1; + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + function baseRange(start2, end2, step, fromRight) { + var index = -1, length = nativeMax(nativeCeil((end2 - start2) / (step || 1)), 0), result2 = Array2(length); + while (length--) { + result2[fromRight ? length : ++index] = start2; + start2 += step; + } + return result2; + } + function baseRepeat(string, n) { + var result2 = ""; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result2; + } + do { + if (n % 2) { + result2 += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + return result2; + } + function baseRest(func, start2) { + return setToString(overRest(func, start2, identity), func + ""); + } + function baseSample(collection) { + return arraySample(values(collection)); + } + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + var index = -1, length = path.length, lastIndex = length - 1, nested = object; + while (nested != null && ++index < length) { + var key = toKey(path[index]), newValue = value; + if (key === "__proto__" || key === "constructor" || key === "prototype") { + return object; + } + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined2; + if (newValue === undefined2) { + newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}; + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, "toString", { + "configurable": true, + "enumerable": false, + "value": constant(string), + "writable": true + }); + }; + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + function baseSlice(array, start2, end2) { + var index = -1, length = array.length; + if (start2 < 0) { + start2 = -start2 > length ? 0 : length + start2; + } + end2 = end2 > length ? length : end2; + if (end2 < 0) { + end2 += length; + } + length = start2 > end2 ? 0 : end2 - start2 >>> 0; + start2 >>>= 0; + var result2 = Array2(length); + while (++index < length) { + result2[index] = array[index + start2]; + } + return result2; + } + function baseSome(collection, predicate) { + var result2; + baseEach(collection, function(value, index, collection2) { + result2 = predicate(value, index, collection2); + return !result2; + }); + return !!result2; + } + function baseSortedIndex(array, value, retHighest) { + var low = 0, high = array == null ? low : array.length; + if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = low + high >>> 1, computed = array[mid]; + if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + function baseSortedIndexBy(array, value, iteratee2, retHighest) { + var low = 0, high = array == null ? 0 : array.length; + if (high === 0) { + return 0; + } + value = iteratee2(value); + var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol(value), valIsUndefined = value === undefined2; + while (low < high) { + var mid = nativeFloor((low + high) / 2), computed = iteratee2(array[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol(computed); + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? computed <= value : computed < value; + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + function baseSortedUniq(array, iteratee2) { + var index = -1, length = array.length, resIndex = 0, result2 = []; + while (++index < length) { + var value = array[index], computed = iteratee2 ? iteratee2(value) : value; + if (!index || !eq(computed, seen)) { + var seen = computed; + result2[resIndex++] = value === 0 ? 0 : value; + } + } + return result2; + } + function baseToNumber(value) { + if (typeof value == "number") { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + function baseToString(value) { + if (typeof value == "string") { + return value; + } + if (isArray(value)) { + return arrayMap(value, baseToString) + ""; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ""; + } + var result2 = value + ""; + return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; + } + function baseUniq(array, iteratee2, comparator) { + var index = -1, includes2 = arrayIncludes, length = array.length, isCommon = true, result2 = [], seen = result2; + if (comparator) { + isCommon = false; + includes2 = arrayIncludesWith; + } else if (length >= LARGE_ARRAY_SIZE) { + var set2 = iteratee2 ? null : createSet(array); + if (set2) { + return setToArray(set2); + } + isCommon = false; + includes2 = cacheHas; + seen = new SetCache(); + } else { + seen = iteratee2 ? [] : result2; + } + outer: + while (++index < length) { + var value = array[index], computed = iteratee2 ? iteratee2(value) : value; + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee2) { + seen.push(computed); + } + result2.push(value); + } else if (!includes2(seen, computed, comparator)) { + if (seen !== result2) { + seen.push(computed); + } + result2.push(value); + } + } + return result2; + } + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, index = fromRight ? length : -1; + while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) { + } + return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index); + } + function baseWrapperValue(value, actions) { + var result2 = value; + if (result2 instanceof LazyWrapper) { + result2 = result2.value(); + } + return arrayReduce(actions, function(result3, action) { + return action.func.apply(action.thisArg, arrayPush([result3], action.args)); + }, result2); + } + function baseXor(arrays, iteratee2, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, result2 = Array2(length); + while (++index < length) { + var array = arrays[index], othIndex = -1; + while (++othIndex < length) { + if (othIndex != index) { + result2[index] = baseDifference(result2[index] || array, arrays[othIndex], iteratee2, comparator); + } + } + } + return baseUniq(baseFlatten(result2, 1), iteratee2, comparator); + } + function baseZipObject(props, values2, assignFunc) { + var index = -1, length = props.length, valsLength = values2.length, result2 = {}; + while (++index < length) { + var value = index < valsLength ? values2[index] : undefined2; + assignFunc(result2, props[index], value); + } + return result2; + } + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + function castFunction(value) { + return typeof value == "function" ? value : identity; + } + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + var castRest = baseRest; + function castSlice(array, start2, end2) { + var length = array.length; + end2 = end2 === undefined2 ? length : end2; + return !start2 && end2 >= length ? array : baseSlice(array, start2, end2); + } + var clearTimeout2 = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + buffer.copy(result2); + return result2; + } + function cloneArrayBuffer(arrayBuffer) { + var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer)); + return result2; + } + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + function cloneRegExp(regexp) { + var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result2.lastIndex = regexp.lastIndex; + return result2; + } + function cloneSymbol(symbol) { + return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {}; + } + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value); + var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other); + if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) { + return 1; + } + if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) { + return -1; + } + } + return 0; + } + function compareMultiple(object, other, orders) { + var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length; + while (++index < length) { + var result2 = compareAscending(objCriteria[index], othCriteria[index]); + if (result2) { + if (index >= ordersLength) { + return result2; + } + var order2 = orders[index]; + return result2 * (order2 == "desc" ? -1 : 1); + } + } + return object.index - other.index; + } + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried; + while (++leftIndex < leftLength) { + result2[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result2[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result2[leftIndex++] = args[argsIndex++]; + } + return result2; + } + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried; + while (++argsIndex < rangeLength) { + result2[argsIndex] = args[argsIndex]; + } + var offset2 = argsIndex; + while (++rightIndex < rightLength) { + result2[offset2 + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result2[offset2 + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result2; + } + function copyArray(source3, array) { + var index = -1, length = source3.length; + array || (array = Array2(length)); + while (++index < length) { + array[index] = source3[index]; + } + return array; + } + function copyObject(source3, props, object, customizer) { + var isNew = !object; + object || (object = {}); + var index = -1, length = props.length; + while (++index < length) { + var key = props[index]; + var newValue = customizer ? customizer(object[key], source3[key], key, object, source3) : undefined2; + if (newValue === undefined2) { + newValue = source3[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + function copySymbols(source3, object) { + return copyObject(source3, getSymbols(source3), object); + } + function copySymbolsIn(source3, object) { + return copyObject(source3, getSymbolsIn(source3), object); + } + function createAggregator(setter, initializer) { + return function(collection, iteratee2) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {}; + return func(collection, setter, getIteratee(iteratee2, 2), accumulator); + }; + } + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2; + customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined2 : customizer; + length = 1; + } + object = Object2(object); + while (++index < length) { + var source3 = sources[index]; + if (source3) { + assigner(object, source3, index, customizer); + } + } + return object; + }); + } + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee2) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee2); + } + var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection); + while (fromRight ? index-- : ++index < length) { + if (iteratee2(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + function createBaseFor(fromRight) { + return function(object, iteratee2, keysFunc) { + var index = -1, iterable = Object2(object), props = keysFunc(object), length = props.length; + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee2(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); + function wrapper() { + var fn2 = this && this !== root && this instanceof wrapper ? Ctor : func; + return fn2.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + var strSymbols = hasUnicode(string) ? stringToArray2(string) : undefined2; + var chr = strSymbols ? strSymbols[0] : string.charAt(0); + var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1); + return chr[methodName]() + trailing; + }; + } + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, "")), callback, ""); + }; + } + function createCtor(Ctor) { + return function() { + var args = arguments; + switch (args.length) { + case 0: + return new Ctor(); + case 1: + return new Ctor(args[0]); + case 2: + return new Ctor(args[0], args[1]); + case 3: + return new Ctor(args[0], args[1], args[2]); + case 4: + return new Ctor(args[0], args[1], args[2], args[3]); + case 5: + return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: + return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args); + return isObject(result2) ? result2 : thisBinding; + }; + } + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + function wrapper() { + var length = arguments.length, args = Array2(length), index = length, placeholder = getHolder(wrapper); + while (index--) { + args[index] = arguments[index]; + } + var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder); + length -= holders.length; + if (length < arity) { + return createRecurry( + func, + bitmask, + createHybrid, + wrapper.placeholder, + undefined2, + args, + holders, + undefined2, + undefined2, + arity - length + ); + } + var fn2 = this && this !== root && this instanceof wrapper ? Ctor : func; + return apply2(fn2, this, args); + } + return wrapper; + } + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object2(collection); + if (!isArrayLike(collection)) { + var iteratee2 = getIteratee(predicate, 3); + collection = keys2(collection); + predicate = function(key) { + return iteratee2(iterable[key], key, iterable); + }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee2 ? collection[index] : index] : undefined2; + }; + } + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru; + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == "wrapper") { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2; + if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func); + } + } + return function() { + var args = arguments, value = args[0]; + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index2 = 0, result2 = length ? funcs[index2].apply(this, args) : value; + while (++index2 < length) { + result2 = funcs[index2].call(this, result2); + } + return result2; + }; + }); + } + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func); + function wrapper() { + var length = arguments.length, args = Array2(length), index = length; + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, + bitmask, + createHybrid, + wrapper.placeholder, + thisArg, + args, + newHolders, + argPos, + ary2, + arity - length + ); + } + var thisBinding = isBind ? thisArg : this, fn2 = isBindKey ? thisBinding[func] : func; + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary2 < length) { + args.length = ary2; + } + if (this && this !== root && this instanceof wrapper) { + fn2 = Ctor || createCtor(fn2); + } + return fn2.apply(thisBinding, args); + } + return wrapper; + } + function createInverter(setter, toIteratee) { + return function(object, iteratee2) { + return baseInverter(object, setter, toIteratee(iteratee2), {}); + }; + } + function createMathOperation(operator2, defaultValue) { + return function(value, other) { + var result2; + if (value === undefined2 && other === undefined2) { + return defaultValue; + } + if (value !== undefined2) { + result2 = value; + } + if (other !== undefined2) { + if (result2 === undefined2) { + return other; + } + if (typeof value == "string" || typeof other == "string") { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result2 = operator2(value, other); + } + return result2; + }; + } + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee2) { + return apply2(iteratee2, thisArg, args); + }); + }); + }); + } + function createPadding(length, chars) { + chars = chars === undefined2 ? " " : baseToString(chars); + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) ? castSlice(stringToArray2(result2), 0, length).join("") : result2.slice(0, length); + } + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); + function wrapper() { + var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn2 = this && this !== root && this instanceof wrapper ? Ctor : func; + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply2(fn2, isBind ? thisArg : this, args); + } + return wrapper; + } + function createRange(fromRight) { + return function(start2, end2, step) { + if (step && typeof step != "number" && isIterateeCall(start2, end2, step)) { + end2 = step = undefined2; + } + start2 = toFinite(start2); + if (end2 === undefined2) { + end2 = start2; + start2 = 0; + } else { + end2 = toFinite(end2); + } + step = step === undefined2 ? start2 < end2 ? 1 : -1 : toFinite(step); + return baseRange(start2, end2, step, fromRight); + }; + } + function createRelationalOperation(operator2) { + return function(value, other) { + if (!(typeof value == "string" && typeof other == "string")) { + value = toNumber(value); + other = toNumber(other); + } + return operator2(value, other); + }; + } + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials; + bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG; + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, + bitmask, + thisArg, + newPartials, + newHolders, + newPartialsRight, + newHoldersRight, + argPos, + ary2, + arity + ]; + var result2 = wrapFunc.apply(undefined2, newData); + if (isLaziable(func)) { + setData(result2, newData); + } + result2.placeholder = placeholder; + return setWrapToString(result2, func, bitmask); + } + function createRound(methodName) { + var func = Math2[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision && nativeIsFinite(number)) { + var pair = (toString(number) + "e").split("e"), value = func(pair[0] + "e" + (+pair[1] + precision)); + pair = (toString(value) + "e").split("e"); + return +(pair[0] + "e" + (+pair[1] - precision)); + } + return func(number); + }; + } + var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY) ? noop2 : function(values2) { + return new Set2(values2); + }; + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined2; + } + ary2 = ary2 === undefined2 ? ary2 : nativeMax(toInteger(ary2), 0); + arity = arity === undefined2 ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, holdersRight = holders; + partials = holders = undefined2; + } + var data = isBindKey ? undefined2 : getData(func); + var newData = [ + func, + bitmask, + thisArg, + partials, + holders, + partialsRight, + holdersRight, + argPos, + ary2, + arity + ]; + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0); + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result2 = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result2 = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result2 = createPartial(func, bitmask, thisArg, partials); + } else { + result2 = createHybrid.apply(undefined2, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result2, newData), func, bitmask); + } + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined2 || eq(objValue, objectProto[key]) && !hasOwnProperty2.call(object, key)) { + return srcValue; + } + return objValue; + } + function customDefaultsMerge(objValue, srcValue, key, object, source3, stack) { + if (isObject(objValue) && isObject(srcValue)) { + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack); + stack["delete"](srcValue); + } + return objValue; + } + function customOmitClone(value) { + return isPlainObject2(value) ? undefined2 : value; + } + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2; + stack.set(array, other); + stack.set(other, array); + while (++index < arrLength) { + var arrValue = array[index], othValue = other[index]; + if (customizer) { + var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined2) { + if (compared) { + continue; + } + result2 = false; + break; + } + if (seen) { + if (!arraySome(other, function(othValue2, othIndex) { + if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result2 = false; + break; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + result2 = false; + break; + } + } + stack["delete"](array); + stack["delete"](other); + return result2; + } + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { + return false; + } + object = object.buffer; + other = other.buffer; + case arrayBufferTag: + if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) { + return false; + } + return true; + case boolTag: + case dateTag: + case numberTag: + return eq(+object, +other); + case errorTag: + return object.name == other.name && object.message == other.message; + case regexpTag: + case stringTag: + return object == other + ""; + case mapTag: + var convert = mapToArray; + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + if (object.size != other.size && !isPartial) { + return false; + } + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + stack.set(object, other); + var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack["delete"](object); + return result2; + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty2.call(other, key))) { + return false; + } + } + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result2 = true; + stack.set(object, other); + stack.set(other, object); + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], othValue = other[key]; + if (customizer) { + var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); + } + if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) { + result2 = false; + break; + } + skipCtor || (skipCtor = key == "constructor"); + } + if (result2 && !skipCtor) { + var objCtor = object.constructor, othCtor = other.constructor; + if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) { + result2 = false; + } + } + stack["delete"](object); + stack["delete"](other); + return result2; + } + function flatRest(func) { + return setToString(overRest(func, undefined2, flatten), func + ""); + } + function getAllKeys(object) { + return baseGetAllKeys(object, keys2, getSymbols); + } + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + var getData = !metaMap ? noop2 : function(func) { + return metaMap.get(func); + }; + function getFuncName(func) { + var result2 = func.name + "", array = realNames[result2], length = hasOwnProperty2.call(realNames, result2) ? array.length : 0; + while (length--) { + var data = array[length], otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result2; + } + function getHolder(func) { + var object = hasOwnProperty2.call(lodash, "placeholder") ? lodash : func; + return object.placeholder; + } + function getIteratee() { + var result2 = lodash.iteratee || iteratee; + result2 = result2 === iteratee ? baseIteratee : result2; + return arguments.length ? result2(arguments[0], arguments[1]) : result2; + } + function getMapData(map3, key) { + var data = map3.__data__; + return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; + } + function getMatchData(object) { + var result2 = keys2(object), length = result2.length; + while (length--) { + var key = result2[length], value = object[key]; + result2[length] = [key, value, isStrictComparable(value)]; + } + return result2; + } + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined2; + } + function getRawTag(value) { + var isOwn = hasOwnProperty2.call(value, symToStringTag), tag = value[symToStringTag]; + try { + value[symToStringTag] = undefined2; + var unmasked = true; + } catch (e) { + } + var result2 = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result2; + } + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object2(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result2 = []; + while (object) { + arrayPush(result2, getSymbols(object)); + object = getPrototype(object); + } + return result2; + }; + var getTag = baseGetTag; + if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap2 && getTag(new WeakMap2()) != weakMapTag) { + getTag = function(value) { + var result2 = baseGetTag(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : ""; + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: + return dataViewTag; + case mapCtorString: + return mapTag; + case promiseCtorString: + return promiseTag; + case setCtorString: + return setTag; + case weakMapCtorString: + return weakMapTag; + } + } + return result2; + }; + } + function getView(start2, end2, transforms) { + var index = -1, length = transforms.length; + while (++index < length) { + var data = transforms[index], size2 = data.size; + switch (data.type) { + case "drop": + start2 += size2; + break; + case "dropRight": + end2 -= size2; + break; + case "take": + end2 = nativeMin(end2, start2 + size2); + break; + case "takeRight": + start2 = nativeMax(start2, end2 - size2); + break; + } + } + return { "start": start2, "end": end2 }; + } + function getWrapDetails(source3) { + var match = source3.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + var index = -1, length = path.length, result2 = false; + while (++index < length) { + var key = toKey(path[index]); + if (!(result2 = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result2 || ++index != length) { + return result2; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); + } + function initCloneArray(array) { + var length = array.length, result2 = new array.constructor(length); + if (length && typeof array[0] == "string" && hasOwnProperty2.call(array, "index")) { + result2.index = array.index; + result2.input = array.input; + } + return result2; + } + function initCloneObject(object) { + return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; + } + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + case boolTag: + case dateTag: + return new Ctor(+object); + case dataViewTag: + return cloneDataView(object, isDeep); + case float32Tag: + case float64Tag: + case int8Tag: + case int16Tag: + case int32Tag: + case uint8Tag: + case uint8ClampedTag: + case uint16Tag: + case uint32Tag: + return cloneTypedArray(object, isDeep); + case mapTag: + return new Ctor(); + case numberTag: + case stringTag: + return new Ctor(object); + case regexpTag: + return cloneRegExp(object); + case setTag: + return new Ctor(); + case symbolTag: + return cloneSymbol(object); + } + } + function insertWrapDetails(source3, details) { + var length = details.length; + if (!length) { + return source3; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? "& " : "") + details[lastIndex]; + details = details.join(length > 2 ? ", " : " "); + return source3.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n"); + } + function isFlattenable(value) { + return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); + } + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); + } + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && index in object) { + return eq(object[index], value); + } + return false; + } + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object); + } + function isKeyable(value) { + var type = typeof value; + return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null; + } + function isLaziable(func) { + var funcName = getFuncName(func), other = lodash[funcName]; + if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + function isMasked(func) { + return !!maskSrcKey && maskSrcKey in func; + } + var isMaskable = coreJsData ? isFunction3 : stubFalse; + function isPrototype(value) { + var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto; + return value === proto; + } + function isStrictComparable(value) { + return value === value && !isObject(value); + } + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object)); + }; + } + function memoizeCapped(func) { + var result2 = memoize(func, function(key) { + if (cache2.size === MAX_MEMOIZE_SIZE) { + cache2.clear(); + } + return key; + }); + var cache2 = result2.cache; + return result2; + } + function mergeData(data, source3) { + var bitmask = data[1], srcBitmask = source3[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source3[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source3[7].length <= source3[8] && bitmask == WRAP_CURRY_FLAG; + if (!(isCommon || isCombo)) { + return data; + } + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source3[2]; + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + var value = source3[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source3[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source3[4]; + } + value = source3[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source3[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source3[6]; + } + value = source3[7]; + if (value) { + data[7] = value; + } + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source3[8] : nativeMin(data[8], source3[8]); + } + if (data[9] == null) { + data[9] = source3[9]; + } + data[0] = source3[0]; + data[1] = newBitmask; + return data; + } + function nativeKeysIn(object) { + var result2 = []; + if (object != null) { + for (var key in Object2(object)) { + result2.push(key); + } + } + return result2; + } + function objectToString(value) { + return nativeObjectToString.call(value); + } + function overRest(func, start2, transform2) { + start2 = nativeMax(start2 === undefined2 ? func.length - 1 : start2, 0); + return function() { + var args = arguments, index = -1, length = nativeMax(args.length - start2, 0), array = Array2(length); + while (++index < length) { + array[index] = args[start2 + index]; + } + index = -1; + var otherArgs = Array2(start2 + 1); + while (++index < start2) { + otherArgs[index] = args[index]; + } + otherArgs[start2] = transform2(array); + return apply2(func, this, otherArgs); + }; + } + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + function reorder(array, indexes) { + var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array); + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined2; + } + return array; + } + function safeGet(object, key) { + if (key === "constructor" && typeof object[key] === "function") { + return; + } + if (key == "__proto__") { + return; + } + return object[key]; + } + var setData = shortOut(baseSetData); + var setTimeout2 = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + var setToString = shortOut(baseSetToString); + function setWrapToString(wrapper, reference2, bitmask) { + var source3 = reference2 + ""; + return setToString(wrapper, insertWrapDetails(source3, updateWrapDetails(getWrapDetails(source3), bitmask))); + } + function shortOut(func) { + var count = 0, lastCalled = 0; + return function() { + var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined2, arguments); + }; + } + function shuffleSelf(array, size2) { + var index = -1, length = array.length, lastIndex = length - 1; + size2 = size2 === undefined2 ? length : size2; + while (++index < size2) { + var rand = baseRandom(index, lastIndex), value = array[rand]; + array[rand] = array[index]; + array[index] = value; + } + array.length = size2; + return array; + } + var stringToPath = memoizeCapped(function(string) { + var result2 = []; + if (string.charCodeAt(0) === 46) { + result2.push(""); + } + string.replace(rePropName, function(match, number, quote, subString) { + result2.push(quote ? subString.replace(reEscapeChar, "$1") : number || match); + }); + return result2; + }); + function toKey(value) { + if (typeof value == "string" || isSymbol(value)) { + return value; + } + var result2 = value + ""; + return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; + } + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) { + } + try { + return func + ""; + } catch (e) { + } + } + return ""; + } + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = "_." + pair[0]; + if (bitmask & pair[1] && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result2.__actions__ = copyArray(wrapper.__actions__); + result2.__index__ = wrapper.__index__; + result2.__values__ = wrapper.__values__; + return result2; + } + function chunk(array, size2, guard) { + if (guard ? isIterateeCall(array, size2, guard) : size2 === undefined2) { + size2 = 1; + } else { + size2 = nativeMax(toInteger(size2), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size2 < 1) { + return []; + } + var index = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2)); + while (index < length) { + result2[resIndex++] = baseSlice(array, index, index += size2); + } + return result2; + } + function compact(array) { + var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result2 = []; + while (++index < length) { + var value = array[index]; + if (value) { + result2[resIndex++] = value; + } + } + return result2; + } + function concat3() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array2(length - 1), array = arguments[0], index = length; + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + var difference = baseRest(function(array, values2) { + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true)) : []; + }); + var differenceBy = baseRest(function(array, values2) { + var iteratee2 = last(values2); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : []; + }); + var differenceWith = baseRest(function(array, values2) { + var comparator = last(values2); + if (isArrayLikeObject(comparator)) { + comparator = undefined2; + } + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : []; + }); + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + function dropRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : []; + } + function dropWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : []; + } + function fill(array, value, start2, end2) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start2 && typeof start2 != "number" && isIterateeCall(array, value, start2)) { + start2 = 0; + end2 = length; + } + return baseFill(array, value, start2, end2); + } + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined2) { + index = toInteger(fromIndex); + index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined2 ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + function fromPairs(pairs) { + var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {}; + while (++index < length) { + var pair = pairs[index]; + result2[pair[0]] = pair[1]; + } + return result2; + } + function head(array) { + return array && array.length ? array[0] : undefined2; + } + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : []; + }); + var intersectionBy = baseRest(function(arrays) { + var iteratee2 = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); + if (iteratee2 === last(mapped)) { + iteratee2 = undefined2; + } else { + mapped.pop(); + } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : []; + }); + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); + comparator = typeof comparator == "function" ? comparator : undefined2; + if (comparator) { + mapped.pop(); + } + return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : []; + }); + function join2(array, separator) { + return array == null ? "" : nativeJoin.call(array, separator); + } + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined2; + } + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined2) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true); + } + function nth(array, n) { + return array && array.length ? baseNth(array, toInteger(n)) : undefined2; + } + var pull = baseRest(pullAll); + function pullAll(array, values2) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2) : array; + } + function pullAllBy(array, values2, iteratee2) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2, getIteratee(iteratee2, 2)) : array; + } + function pullAllWith(array, values2, comparator) { + return array && array.length && values2 && values2.length ? basePullAll(array, values2, undefined2, comparator) : array; + } + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, result2 = baseAt(array, indexes); + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + return result2; + }); + function remove(array, predicate) { + var result2 = []; + if (!(array && array.length)) { + return result2; + } + var index = -1, indexes = [], length = array.length; + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result2.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result2; + } + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + function slice2(array, start2, end2) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end2 && typeof end2 != "number" && isIterateeCall(array, start2, end2)) { + start2 = 0; + end2 = length; + } else { + start2 = start2 == null ? 0 : toInteger(start2); + end2 = end2 === undefined2 ? length : toInteger(end2); + } + return baseSlice(array, start2, end2); + } + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + function sortedIndexBy(array, value, iteratee2) { + return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2)); + } + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + function sortedLastIndexBy(array, value, iteratee2) { + return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2), true); + } + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + function sortedUniq(array) { + return array && array.length ? baseSortedUniq(array) : []; + } + function sortedUniqBy(array, iteratee2) { + return array && array.length ? baseSortedUniq(array, getIteratee(iteratee2, 2)) : []; + } + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = guard || n === undefined2 ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + function takeRightWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : []; + } + function takeWhile(array, predicate) { + return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : []; + } + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + var unionBy = baseRest(function(arrays) { + var iteratee2 = last(arrays); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)); + }); + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == "function" ? comparator : undefined2; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator); + }); + function uniq(array) { + return array && array.length ? baseUniq(array) : []; + } + function uniqBy(array, iteratee2) { + return array && array.length ? baseUniq(array, getIteratee(iteratee2, 2)) : []; + } + function uniqWith(array, comparator) { + comparator = typeof comparator == "function" ? comparator : undefined2; + return array && array.length ? baseUniq(array, undefined2, comparator) : []; + } + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + function unzipWith(array, iteratee2) { + if (!(array && array.length)) { + return []; + } + var result2 = unzip(array); + if (iteratee2 == null) { + return result2; + } + return arrayMap(result2, function(group) { + return apply2(iteratee2, undefined2, group); + }); + } + var without = baseRest(function(array, values2) { + return isArrayLikeObject(array) ? baseDifference(array, values2) : []; + }); + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + var xorBy = baseRest(function(arrays) { + var iteratee2 = last(arrays); + if (isArrayLikeObject(iteratee2)) { + iteratee2 = undefined2; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2)); + }); + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == "function" ? comparator : undefined2; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator); + }); + var zip = baseRest(unzip); + function zipObject(props, values2) { + return baseZipObject(props || [], values2 || [], assignValue); + } + function zipObjectDeep(props, values2) { + return baseZipObject(props || [], values2 || [], baseSet); + } + var zipWith = baseRest(function(arrays) { + var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2; + iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2; + return unzipWith(arrays, iteratee2); + }); + function chain(value) { + var result2 = lodash(value); + result2.__chain__ = true; + return result2; + } + function tap(value, interceptor) { + interceptor(value); + return value; + } + function thru(value, interceptor) { + return interceptor(value); + } + var wrapperAt = flatRest(function(paths) { + var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) { + return baseAt(object, paths); + }; + if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start2)) { + return this.thru(interceptor); + } + value = value.slice(start2, +start2 + (length ? 1 : 0)); + value.__actions__.push({ + "func": thru, + "args": [interceptor], + "thisArg": undefined2 + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined2); + } + return array; + }); + }); + function wrapperChain() { + return chain(this); + } + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + function wrapperNext() { + if (this.__values__ === undefined2) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++]; + return { "done": done, "value": value }; + } + function wrapperToIterator() { + return this; + } + function wrapperPlant(value) { + var result2, parent2 = this; + while (parent2 instanceof baseLodash) { + var clone2 = wrapperClone(parent2); + clone2.__index__ = 0; + clone2.__values__ = undefined2; + if (result2) { + previous.__wrapped__ = clone2; + } else { + result2 = clone2; + } + var previous = clone2; + parent2 = parent2.__wrapped__; + } + previous.__wrapped__ = value; + return result2; + } + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + "func": thru, + "args": [reverse], + "thisArg": undefined2 + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + var countBy = createAggregator(function(result2, value, key) { + if (hasOwnProperty2.call(result2, key)) { + ++result2[key]; + } else { + baseAssignValue(result2, key, 1); + } + }); + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined2; + } + return func(collection, getIteratee(predicate, 3)); + } + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + var find2 = createFind(findIndex); + var findLast = createFind(findLastIndex); + function flatMap(collection, iteratee2) { + return baseFlatten(map2(collection, iteratee2), 1); + } + function flatMapDeep(collection, iteratee2) { + return baseFlatten(map2(collection, iteratee2), INFINITY); + } + function flatMapDepth(collection, iteratee2, depth) { + depth = depth === undefined2 ? 1 : toInteger(depth); + return baseFlatten(map2(collection, iteratee2), depth); + } + function forEach3(collection, iteratee2) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee2, 3)); + } + function forEachRight(collection, iteratee2) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee2, 3)); + } + var groupBy = createAggregator(function(result2, value, key) { + if (hasOwnProperty2.call(result2, key)) { + result2[key].push(value); + } else { + baseAssignValue(result2, key, [value]); + } + }); + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1; + } + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, isFunc = typeof path == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : []; + baseEach(collection, function(value) { + result2[++index] = isFunc ? apply2(path, value, args) : baseInvoke(value, path, args); + }); + return result2; + }); + var keyBy = createAggregator(function(result2, value, key) { + baseAssignValue(result2, key, value); + }); + function map2(collection, iteratee2) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee2, 3)); + } + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined2 : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + var partition = createAggregator(function(result2, value, key) { + result2[key ? 0 : 1].push(value); + }, function() { + return [[], []]; + }); + function reduce(collection, iteratee2, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach); + } + function reduceRight(collection, iteratee2, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3; + return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight); + } + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + function sampleSize(collection, n, guard) { + if (guard ? isIterateeCall(collection, n, guard) : n === undefined2) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined2; + } + return func(collection, getIteratee(predicate, 3)); + } + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + var now = ctxNow || function() { + return root.Date.now(); + }; + function after(n, func) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + function ary(func, n, guard) { + n = guard ? undefined2 : n; + n = func && n == null ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n); + } + function before(n, func) { + var result2; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result2 = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined2; + } + return result2; + }; + } + var bind2 = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind2)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + function curry(func, arity, guard) { + arity = guard ? undefined2 : arity; + var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); + result2.placeholder = curry.placeholder; + return result2; + } + function curryRight(func, arity, guard) { + arity = guard ? undefined2 : arity; + var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); + result2.placeholder = curryRight.placeholder; + return result2; + } + function debounce3(func, wait, options) { + var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = "maxWait" in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = "trailing" in options ? !!options.trailing : trailing; + } + function invokeFunc(time) { + var args = lastArgs, thisArg = lastThis; + lastArgs = lastThis = undefined2; + lastInvokeTime = time; + result2 = func.apply(thisArg, args); + return result2; + } + function leadingEdge(time) { + lastInvokeTime = time; + timerId = setTimeout2(timerExpired, wait); + return leading ? invokeFunc(time) : result2; + } + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall; + return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; + } + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; + return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; + } + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + timerId = setTimeout2(timerExpired, remainingWait(time)); + } + function trailingEdge(time) { + timerId = undefined2; + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined2; + return result2; + } + function cancel() { + if (timerId !== undefined2) { + clearTimeout2(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined2; + } + function flush() { + return timerId === undefined2 ? result2 : trailingEdge(now()); + } + function debounced() { + var time = now(), isInvoking = shouldInvoke(time); + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + if (isInvoking) { + if (timerId === undefined2) { + return leadingEdge(lastCallTime); + } + if (maxing) { + clearTimeout2(timerId); + timerId = setTimeout2(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined2) { + timerId = setTimeout2(timerExpired, wait); + } + return result2; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + function flip2(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + function memoize(func, resolver) { + if (typeof func != "function" || resolver != null && typeof resolver != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache2 = memoized.cache; + if (cache2.has(key)) { + return cache2.get(key); + } + var result2 = func.apply(this, args); + memoized.cache = cache2.set(key, result2) || cache2; + return result2; + }; + memoized.cache = new (memoize.Cache || MapCache)(); + return memoized; + } + memoize.Cache = MapCache; + function negate(predicate) { + if (typeof predicate != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: + return !predicate.call(this); + case 1: + return !predicate.call(this, args[0]); + case 2: + return !predicate.call(this, args[0], args[1]); + case 3: + return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + function once(func) { + return before(2, func); + } + var overArgs = castRest(function(func, transforms) { + transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, length = nativeMin(args.length, funcsLength); + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply2(func, this, args); + }); + }); + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders); + }); + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders); + }); + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes); + }); + function rest(func, start2) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + start2 = start2 === undefined2 ? start2 : toInteger(start2); + return baseRest(func, start2); + } + function spread(func, start2) { + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + start2 = start2 == null ? 0 : nativeMax(toInteger(start2), 0); + return baseRest(function(args) { + var array = args[start2], otherArgs = castSlice(args, 0, start2); + if (array) { + arrayPush(otherArgs, array); + } + return apply2(func, this, otherArgs); + }); + } + function throttle(func, wait, options) { + var leading = true, trailing = true; + if (typeof func != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = "leading" in options ? !!options.leading : leading; + trailing = "trailing" in options ? !!options.trailing : trailing; + } + return debounce3(func, wait, { + "leading": leading, + "maxWait": wait, + "trailing": trailing + }); + } + function unary(func) { + return ary(func, 1); + } + function wrap2(value, wrapper) { + return partial(castFunction(wrapper), value); + } + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + function cloneWith(value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + function conformsTo(object, source3) { + return source3 == null || baseConformsTo(object, source3, keys2(source3)); + } + function eq(value, other) { + return value === other || value !== value && other !== other; + } + var gt = createRelationalOperation(baseGt); + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + var isArguments = baseIsArguments(/* @__PURE__ */ function() { + return arguments; + }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty2.call(value, "callee") && !propertyIsEnumerable.call(value, "callee"); + }; + var isArray = Array2.isArray; + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction3(value); + } + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + function isBoolean(value) { + return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag; + } + var isBuffer = nativeIsBuffer || stubFalse; + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + function isElement3(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject2(value); + } + function isEmpty2(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && (isArray(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty2.call(value, key)) { + return false; + } + } + return true; + } + function isEqual2(value, other) { + return baseIsEqual(value, other); + } + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + var result2 = customizer ? customizer(value, other) : undefined2; + return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2; + } + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject2(value); + } + function isFinite(value) { + return typeof value == "number" && nativeIsFinite(value); + } + function isFunction3(value) { + if (!isObject(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + function isInteger(value) { + return typeof value == "number" && value == toInteger(value); + } + function isLength(value) { + return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + function isObject(value) { + var type = typeof value; + return value != null && (type == "object" || type == "function"); + } + function isObjectLike(value) { + return value != null && typeof value == "object"; + } + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + function isMatch(object, source3) { + return object === source3 || baseIsMatch(object, source3, getMatchData(source3)); + } + function isMatchWith(object, source3, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return baseIsMatch(object, source3, getMatchData(source3), customizer); + } + function isNaN(value) { + return isNumber2(value) && value != +value; + } + function isNative(value) { + if (isMaskable(value)) { + throw new Error2(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + function isNull(value) { + return value === null; + } + function isNil(value) { + return value == null; + } + function isNumber2(value) { + return typeof value == "number" || isObjectLike(value) && baseGetTag(value) == numberTag; + } + function isPlainObject2(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty2.call(proto, "constructor") && proto.constructor; + return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; + } + var isRegExp2 = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + function isString(value) { + return typeof value == "string" || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag; + } + function isSymbol(value) { + return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag; + } + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + function isUndefined(value) { + return value === undefined2; + } + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + var lt = createRelationalOperation(baseLt); + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray2(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values; + return func(value); + } + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = value < 0 ? -1 : 1; + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + function toInteger(value) { + var result2 = toFinite(value), remainder = result2 % 1; + return result2 === result2 ? remainder ? result2 - remainder : result2 : 0; + } + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + function toNumber(value) { + if (typeof value == "number") { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == "function" ? value.valueOf() : value; + value = isObject(other) ? other + "" : other; + } + if (typeof value != "string") { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; + } + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + function toSafeInteger(value) { + return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0; + } + function toString(value) { + return value == null ? "" : baseToString(value); + } + var assign2 = createAssigner(function(object, source3) { + if (isPrototype(source3) || isArrayLike(source3)) { + copyObject(source3, keys2(source3), object); + return; + } + for (var key in source3) { + if (hasOwnProperty2.call(source3, key)) { + assignValue(object, key, source3[key]); + } + } + }); + var assignIn = createAssigner(function(object, source3) { + copyObject(source3, keysIn(source3), object); + }); + var assignInWith = createAssigner(function(object, source3, srcIndex, customizer) { + copyObject(source3, keysIn(source3), object, customizer); + }); + var assignWith = createAssigner(function(object, source3, srcIndex, customizer) { + copyObject(source3, keys2(source3), object, customizer); + }); + var at = flatRest(baseAt); + function create2(prototype, properties) { + var result2 = baseCreate(prototype); + return properties == null ? result2 : baseAssign(result2, properties); + } + var defaults2 = baseRest(function(object, sources) { + object = Object2(object); + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined2; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + while (++index < length) { + var source3 = sources[index]; + var props = keysIn(source3); + var propsIndex = -1; + var propsLength = props.length; + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + if (value === undefined2 || eq(value, objectProto[key]) && !hasOwnProperty2.call(object, key)) { + object[key] = source3[key]; + } + } + } + return object; + }); + var defaultsDeep = baseRest(function(args) { + args.push(undefined2, customDefaultsMerge); + return apply2(mergeWith, undefined2, args); + }); + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + function forIn(object, iteratee2) { + return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn); + } + function forInRight(object, iteratee2) { + return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn); + } + function forOwn(object, iteratee2) { + return object && baseForOwn(object, getIteratee(iteratee2, 3)); + } + function forOwnRight(object, iteratee2) { + return object && baseForOwnRight(object, getIteratee(iteratee2, 3)); + } + function functions(object) { + return object == null ? [] : baseFunctions(object, keys2(object)); + } + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + function get2(object, path, defaultValue) { + var result2 = object == null ? undefined2 : baseGet(object, path); + return result2 === undefined2 ? defaultValue : result2; + } + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + var invert = createInverter(function(result2, value, key) { + if (value != null && typeof value.toString != "function") { + value = nativeObjectToString.call(value); + } + result2[value] = key; + }, constant(identity)); + var invertBy = createInverter(function(result2, value, key) { + if (value != null && typeof value.toString != "function") { + value = nativeObjectToString.call(value); + } + if (hasOwnProperty2.call(result2, value)) { + result2[value].push(key); + } else { + result2[value] = [key]; + } + }, getIteratee); + var invoke = baseRest(baseInvoke); + function keys2(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + function mapKeys(object, iteratee2) { + var result2 = {}; + iteratee2 = getIteratee(iteratee2, 3); + baseForOwn(object, function(value, key, object2) { + baseAssignValue(result2, iteratee2(value, key, object2), value); + }); + return result2; + } + function mapValues(object, iteratee2) { + var result2 = {}; + iteratee2 = getIteratee(iteratee2, 3); + baseForOwn(object, function(value, key, object2) { + baseAssignValue(result2, key, iteratee2(value, key, object2)); + }); + return result2; + } + var merge = createAssigner(function(object, source3, srcIndex) { + baseMerge(object, source3, srcIndex); + }); + var mergeWith = createAssigner(function(object, source3, srcIndex, customizer) { + baseMerge(object, source3, srcIndex, customizer); + }); + var omit = flatRest(function(object, paths) { + var result2 = {}; + if (object == null) { + return result2; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result2); + if (isDeep) { + result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result2, paths[length]); + } + return result2; + }); + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + function result(object, path, defaultValue) { + path = castPath(path, object); + var index = -1, length = path.length; + if (!length) { + length = 1; + object = undefined2; + } + while (++index < length) { + var value = object == null ? undefined2 : object[toKey(path[index])]; + if (value === undefined2) { + index = length; + value = defaultValue; + } + object = isFunction3(value) ? value.call(object) : value; + } + return object; + } + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + function setWith(object, path, value, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return object == null ? object : baseSet(object, path, value, customizer); + } + var toPairs = createToPairs(keys2); + var toPairsIn = createToPairs(keysIn); + function transform(object, iteratee2, accumulator) { + var isArr = isArray(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object); + iteratee2 = getIteratee(iteratee2, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor() : []; + } else if (isObject(object)) { + accumulator = isFunction3(Ctor) ? baseCreate(getPrototype(object)) : {}; + } else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object2) { + return iteratee2(accumulator, value, index, object2); + }); + return accumulator; + } + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == "function" ? customizer : undefined2; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + function values(object) { + return object == null ? [] : baseValues(object, keys2(object)); + } + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + function clamp2(number, lower, upper) { + if (upper === undefined2) { + upper = lower; + lower = undefined2; + } + if (upper !== undefined2) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined2) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + function inRange(number, start2, end2) { + start2 = toFinite(start2); + if (end2 === undefined2) { + end2 = start2; + start2 = 0; + } else { + end2 = toFinite(end2); + } + number = toNumber(number); + return baseInRange(number, start2, end2); + } + function random(lower, upper, floating) { + if (floating && typeof floating != "boolean" && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined2; + } + if (floating === undefined2) { + if (typeof upper == "boolean") { + floating = upper; + upper = undefined2; + } else if (typeof lower == "boolean") { + floating = lower; + lower = undefined2; + } + } + if (lower === undefined2 && upper === undefined2) { + lower = 0; + upper = 1; + } else { + lower = toFinite(lower); + if (upper === undefined2) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + rand * (upper - lower + freeParseFloat("1e-" + ((rand + "").length - 1))), upper); + } + return baseRandom(lower, upper); + } + var camelCase = createCompounder(function(result2, word, index) { + word = word.toLowerCase(); + return result2 + (index ? capitalize(word) : word); + }); + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ""); + } + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + var length = string.length; + position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length); + var end2 = position; + position -= target.length; + return position >= 0 && string.slice(position, end2) == target; + } + function escape2(string) { + string = toString(string); + return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; + } + function escapeRegExp(string) { + string = toString(string); + return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string; + } + var kebabCase = createCompounder(function(result2, word, index) { + return result2 + (index ? "-" : "") + word.toLowerCase(); + }); + var lowerCase = createCompounder(function(result2, word, index) { + return result2 + (index ? " " : "") + word.toLowerCase(); + }); + var lowerFirst = createCaseFirst("toLowerCase"); + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars); + } + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? string + createPadding(length - strLength, chars) : string; + } + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + var strLength = length ? stringSize(string) : 0; + return length && strLength < length ? createPadding(length - strLength, chars) + string : string; + } + function parseInt2(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ""), radix || 0); + } + function repeat(string, n, guard) { + if (guard ? isIterateeCall(string, n, guard) : n === undefined2) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + function replace2() { + var args = arguments, string = toString(args[0]); + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + var snakeCase = createCompounder(function(result2, word, index) { + return result2 + (index ? "_" : "") + word.toLowerCase(); + }); + function split2(string, separator, limit) { + if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) { + separator = limit = undefined2; + } + limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && (typeof separator == "string" || separator != null && !isRegExp2(separator))) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray2(string), 0, limit); + } + } + return string.split(separator, limit); + } + var startCase = createCompounder(function(result2, word, index) { + return result2 + (index ? " " : "") + upperFirst(word); + }); + function startsWith2(string, target, position) { + string = toString(string); + position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length); + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + function template(string, options, guard) { + var settings = lodash.templateSettings; + if (guard && isIterateeCall(string, options, guard)) { + options = undefined2; + } + string = toString(string); + options = assignInWith({}, options, settings, customDefaultsAssignIn); + var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys2(imports), importsValues = baseValues(imports, importsKeys); + var isEscaping, isEvaluating, index = 0, interpolate = options.interpolate || reNoMatch, source3 = "__p += '"; + var reDelimiters = RegExp2( + (options.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options.evaluate || reNoMatch).source + "|$", + "g" + ); + var sourceURL = "//# sourceURL=" + (hasOwnProperty2.call(options, "sourceURL") ? (options.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n"; + string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset2) { + interpolateValue || (interpolateValue = esTemplateValue); + source3 += string.slice(index, offset2).replace(reUnescapedString, escapeStringChar); + if (escapeValue) { + isEscaping = true; + source3 += "' +\n__e(" + escapeValue + ") +\n'"; + } + if (evaluateValue) { + isEvaluating = true; + source3 += "';\n" + evaluateValue + ";\n__p += '"; + } + if (interpolateValue) { + source3 += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'"; + } + index = offset2 + match.length; + return match; + }); + source3 += "';\n"; + var variable = hasOwnProperty2.call(options, "variable") && options.variable; + if (!variable) { + source3 = "with (obj) {\n" + source3 + "\n}\n"; + } else if (reForbiddenIdentifierChars.test(variable)) { + throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT); + } + source3 = (isEvaluating ? source3.replace(reEmptyStringLeading, "") : source3).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;"); + source3 = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source3 + "return __p\n}"; + var result2 = attempt(function() { + return Function2(importsKeys, sourceURL + "return " + source3).apply(undefined2, importsValues); + }); + result2.source = source3; + if (isError(result2)) { + throw result2; + } + return result2; + } + function toLower(value) { + return toString(value).toLowerCase(); + } + function toUpper(value) { + return toString(value).toUpperCase(); + } + function trim(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return baseTrim(string); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray2(string), chrSymbols = stringToArray2(chars), start2 = charsStartIndex(strSymbols, chrSymbols), end2 = charsEndIndex(strSymbols, chrSymbols) + 1; + return castSlice(strSymbols, start2, end2).join(""); + } + function trimEnd(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return string.slice(0, trimmedEndIndex(string) + 1); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray2(string), end2 = charsEndIndex(strSymbols, stringToArray2(chars)) + 1; + return castSlice(strSymbols, 0, end2).join(""); + } + function trimStart(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined2)) { + return string.replace(reTrimStart, ""); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray2(string), start2 = charsStartIndex(strSymbols, stringToArray2(chars)); + return castSlice(strSymbols, start2).join(""); + } + function truncate(string, options) { + var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION; + if (isObject(options)) { + var separator = "separator" in options ? options.separator : separator; + length = "length" in options ? toInteger(options.length) : length; + omission = "omission" in options ? baseToString(options.omission) : omission; + } + string = toString(string); + var strLength = string.length; + if (hasUnicode(string)) { + var strSymbols = stringToArray2(string); + strLength = strSymbols.length; + } + if (length >= strLength) { + return string; + } + var end2 = length - stringSize(omission); + if (end2 < 1) { + return omission; + } + var result2 = strSymbols ? castSlice(strSymbols, 0, end2).join("") : string.slice(0, end2); + if (separator === undefined2) { + return result2 + omission; + } + if (strSymbols) { + end2 += result2.length - end2; + } + if (isRegExp2(separator)) { + if (string.slice(end2).search(separator)) { + var match, substring = result2; + if (!separator.global) { + separator = RegExp2(separator.source, toString(reFlags.exec(separator)) + "g"); + } + separator.lastIndex = 0; + while (match = separator.exec(substring)) { + var newEnd = match.index; + } + result2 = result2.slice(0, newEnd === undefined2 ? end2 : newEnd); + } + } else if (string.indexOf(baseToString(separator), end2) != end2) { + var index = result2.lastIndexOf(separator); + if (index > -1) { + result2 = result2.slice(0, index); + } + } + return result2 + omission; + } + function unescape(string) { + string = toString(string); + return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string; + } + var upperCase = createCompounder(function(result2, word, index) { + return result2 + (index ? " " : "") + word.toUpperCase(); + }); + var upperFirst = createCaseFirst("toUpperCase"); + function words(string, pattern, guard) { + string = toString(string); + pattern = guard ? undefined2 : pattern; + if (pattern === undefined2) { + return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); + } + return string.match(pattern) || []; + } + var attempt = baseRest(function(func, args) { + try { + return apply2(func, undefined2, args); + } catch (e) { + return isError(e) ? e : new Error2(e); + } + }); + var bindAll = flatRest(function(object, methodNames) { + arrayEach(methodNames, function(key) { + key = toKey(key); + baseAssignValue(object, key, bind2(object[key], object)); + }); + return object; + }); + function cond(pairs) { + var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee(); + pairs = !length ? [] : arrayMap(pairs, function(pair) { + if (typeof pair[1] != "function") { + throw new TypeError2(FUNC_ERROR_TEXT); + } + return [toIteratee(pair[0]), pair[1]]; + }); + return baseRest(function(args) { + var index = -1; + while (++index < length) { + var pair = pairs[index]; + if (apply2(pair[0], this, args)) { + return apply2(pair[1], this, args); + } + } + }); + } + function conforms(source3) { + return baseConforms(baseClone(source3, CLONE_DEEP_FLAG)); + } + function constant(value) { + return function() { + return value; + }; + } + function defaultTo(value, defaultValue) { + return value == null || value !== value ? defaultValue : value; + } + var flow = createFlow(); + var flowRight = createFlow(true); + function identity(value) { + return value; + } + function iteratee(func) { + return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG)); + } + function matches2(source3) { + return baseMatches(baseClone(source3, CLONE_DEEP_FLAG)); + } + function matchesProperty(path, srcValue) { + return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG)); + } + var method = baseRest(function(path, args) { + return function(object) { + return baseInvoke(object, path, args); + }; + }); + var methodOf = baseRest(function(object, args) { + return function(path) { + return baseInvoke(object, path, args); + }; + }); + function mixin(object, source3, options) { + var props = keys2(source3), methodNames = baseFunctions(source3, props); + if (options == null && !(isObject(source3) && (methodNames.length || !props.length))) { + options = source3; + source3 = object; + object = this; + methodNames = baseFunctions(source3, keys2(source3)); + } + var chain2 = !(isObject(options) && "chain" in options) || !!options.chain, isFunc = isFunction3(object); + arrayEach(methodNames, function(methodName) { + var func = source3[methodName]; + object[methodName] = func; + if (isFunc) { + object.prototype[methodName] = function() { + var chainAll = this.__chain__; + if (chain2 || chainAll) { + var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__); + actions.push({ "func": func, "args": arguments, "thisArg": object }); + result2.__chain__ = chainAll; + return result2; + } + return func.apply(object, arrayPush([this.value()], arguments)); + }; + } + }); + return object; + } + function noConflict() { + if (root._ === this) { + root._ = oldDash; + } + return this; + } + function noop2() { + } + function nthArg(n) { + n = toInteger(n); + return baseRest(function(args) { + return baseNth(args, n); + }); + } + var over = createOver(arrayMap); + var overEvery = createOver(arrayEvery); + var overSome = createOver(arraySome); + function property(path) { + return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); + } + function propertyOf(object) { + return function(path) { + return object == null ? undefined2 : baseGet(object, path); + }; + } + var range = createRange(); + var rangeRight = createRange(true); + function stubArray() { + return []; + } + function stubFalse() { + return false; + } + function stubObject() { + return {}; + } + function stubString() { + return ""; + } + function stubTrue() { + return true; + } + function times(n, iteratee2) { + n = toInteger(n); + if (n < 1 || n > MAX_SAFE_INTEGER) { + return []; + } + var index = MAX_ARRAY_LENGTH, length = nativeMin(n, MAX_ARRAY_LENGTH); + iteratee2 = getIteratee(iteratee2); + n -= MAX_ARRAY_LENGTH; + var result2 = baseTimes(length, iteratee2); + while (++index < n) { + iteratee2(index); + } + return result2; + } + function toPath(value) { + if (isArray(value)) { + return arrayMap(value, toKey); + } + return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); + } + function uniqueId(prefix) { + var id = ++idCounter2; + return toString(prefix) + id; + } + var add = createMathOperation(function(augend, addend) { + return augend + addend; + }, 0); + var ceil = createRound("ceil"); + var divide = createMathOperation(function(dividend, divisor) { + return dividend / divisor; + }, 1); + var floor = createRound("floor"); + function max2(array) { + return array && array.length ? baseExtremum(array, identity, baseGt) : undefined2; + } + function maxBy(array, iteratee2) { + return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseGt) : undefined2; + } + function mean(array) { + return baseMean(array, identity); + } + function meanBy(array, iteratee2) { + return baseMean(array, getIteratee(iteratee2, 2)); + } + function min2(array) { + return array && array.length ? baseExtremum(array, identity, baseLt) : undefined2; + } + function minBy(array, iteratee2) { + return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseLt) : undefined2; + } + var multiply = createMathOperation(function(multiplier, multiplicand) { + return multiplier * multiplicand; + }, 1); + var round3 = createRound("round"); + var subtract = createMathOperation(function(minuend, subtrahend) { + return minuend - subtrahend; + }, 0); + function sum(array) { + return array && array.length ? baseSum(array, identity) : 0; + } + function sumBy(array, iteratee2) { + return array && array.length ? baseSum(array, getIteratee(iteratee2, 2)) : 0; + } + lodash.after = after; + lodash.ary = ary; + lodash.assign = assign2; + lodash.assignIn = assignIn; + lodash.assignInWith = assignInWith; + lodash.assignWith = assignWith; + lodash.at = at; + lodash.before = before; + lodash.bind = bind2; + lodash.bindAll = bindAll; + lodash.bindKey = bindKey; + lodash.castArray = castArray; + lodash.chain = chain; + lodash.chunk = chunk; + lodash.compact = compact; + lodash.concat = concat3; + lodash.cond = cond; + lodash.conforms = conforms; + lodash.constant = constant; + lodash.countBy = countBy; + lodash.create = create2; + lodash.curry = curry; + lodash.curryRight = curryRight; + lodash.debounce = debounce3; + lodash.defaults = defaults2; + lodash.defaultsDeep = defaultsDeep; + lodash.defer = defer; + lodash.delay = delay; + lodash.difference = difference; + lodash.differenceBy = differenceBy; + lodash.differenceWith = differenceWith; + lodash.drop = drop; + lodash.dropRight = dropRight; + lodash.dropRightWhile = dropRightWhile; + lodash.dropWhile = dropWhile; + lodash.fill = fill; + lodash.filter = filter; + lodash.flatMap = flatMap; + lodash.flatMapDeep = flatMapDeep; + lodash.flatMapDepth = flatMapDepth; + lodash.flatten = flatten; + lodash.flattenDeep = flattenDeep; + lodash.flattenDepth = flattenDepth; + lodash.flip = flip2; + lodash.flow = flow; + lodash.flowRight = flowRight; + lodash.fromPairs = fromPairs; + lodash.functions = functions; + lodash.functionsIn = functionsIn; + lodash.groupBy = groupBy; + lodash.initial = initial; + lodash.intersection = intersection; + lodash.intersectionBy = intersectionBy; + lodash.intersectionWith = intersectionWith; + lodash.invert = invert; + lodash.invertBy = invertBy; + lodash.invokeMap = invokeMap; + lodash.iteratee = iteratee; + lodash.keyBy = keyBy; + lodash.keys = keys2; + lodash.keysIn = keysIn; + lodash.map = map2; + lodash.mapKeys = mapKeys; + lodash.mapValues = mapValues; + lodash.matches = matches2; + lodash.matchesProperty = matchesProperty; + lodash.memoize = memoize; + lodash.merge = merge; + lodash.mergeWith = mergeWith; + lodash.method = method; + lodash.methodOf = methodOf; + lodash.mixin = mixin; + lodash.negate = negate; + lodash.nthArg = nthArg; + lodash.omit = omit; + lodash.omitBy = omitBy; + lodash.once = once; + lodash.orderBy = orderBy; + lodash.over = over; + lodash.overArgs = overArgs; + lodash.overEvery = overEvery; + lodash.overSome = overSome; + lodash.partial = partial; + lodash.partialRight = partialRight; + lodash.partition = partition; + lodash.pick = pick; + lodash.pickBy = pickBy; + lodash.property = property; + lodash.propertyOf = propertyOf; + lodash.pull = pull; + lodash.pullAll = pullAll; + lodash.pullAllBy = pullAllBy; + lodash.pullAllWith = pullAllWith; + lodash.pullAt = pullAt; + lodash.range = range; + lodash.rangeRight = rangeRight; + lodash.rearg = rearg; + lodash.reject = reject; + lodash.remove = remove; + lodash.rest = rest; + lodash.reverse = reverse; + lodash.sampleSize = sampleSize; + lodash.set = set; + lodash.setWith = setWith; + lodash.shuffle = shuffle; + lodash.slice = slice2; + lodash.sortBy = sortBy; + lodash.sortedUniq = sortedUniq; + lodash.sortedUniqBy = sortedUniqBy; + lodash.split = split2; + lodash.spread = spread; + lodash.tail = tail; + lodash.take = take; + lodash.takeRight = takeRight; + lodash.takeRightWhile = takeRightWhile; + lodash.takeWhile = takeWhile; + lodash.tap = tap; + lodash.throttle = throttle; + lodash.thru = thru; + lodash.toArray = toArray; + lodash.toPairs = toPairs; + lodash.toPairsIn = toPairsIn; + lodash.toPath = toPath; + lodash.toPlainObject = toPlainObject; + lodash.transform = transform; + lodash.unary = unary; + lodash.union = union; + lodash.unionBy = unionBy; + lodash.unionWith = unionWith; + lodash.uniq = uniq; + lodash.uniqBy = uniqBy; + lodash.uniqWith = uniqWith; + lodash.unset = unset; + lodash.unzip = unzip; + lodash.unzipWith = unzipWith; + lodash.update = update; + lodash.updateWith = updateWith; + lodash.values = values; + lodash.valuesIn = valuesIn; + lodash.without = without; + lodash.words = words; + lodash.wrap = wrap2; + lodash.xor = xor; + lodash.xorBy = xorBy; + lodash.xorWith = xorWith; + lodash.zip = zip; + lodash.zipObject = zipObject; + lodash.zipObjectDeep = zipObjectDeep; + lodash.zipWith = zipWith; + lodash.entries = toPairs; + lodash.entriesIn = toPairsIn; + lodash.extend = assignIn; + lodash.extendWith = assignInWith; + mixin(lodash, lodash); + lodash.add = add; + lodash.attempt = attempt; + lodash.camelCase = camelCase; + lodash.capitalize = capitalize; + lodash.ceil = ceil; + lodash.clamp = clamp2; + lodash.clone = clone; + lodash.cloneDeep = cloneDeep; + lodash.cloneDeepWith = cloneDeepWith; + lodash.cloneWith = cloneWith; + lodash.conformsTo = conformsTo; + lodash.deburr = deburr; + lodash.defaultTo = defaultTo; + lodash.divide = divide; + lodash.endsWith = endsWith; + lodash.eq = eq; + lodash.escape = escape2; + lodash.escapeRegExp = escapeRegExp; + lodash.every = every; + lodash.find = find2; + lodash.findIndex = findIndex; + lodash.findKey = findKey; + lodash.findLast = findLast; + lodash.findLastIndex = findLastIndex; + lodash.findLastKey = findLastKey; + lodash.floor = floor; + lodash.forEach = forEach3; + lodash.forEachRight = forEachRight; + lodash.forIn = forIn; + lodash.forInRight = forInRight; + lodash.forOwn = forOwn; + lodash.forOwnRight = forOwnRight; + lodash.get = get2; + lodash.gt = gt; + lodash.gte = gte; + lodash.has = has; + lodash.hasIn = hasIn; + lodash.head = head; + lodash.identity = identity; + lodash.includes = includes; + lodash.indexOf = indexOf; + lodash.inRange = inRange; + lodash.invoke = invoke; + lodash.isArguments = isArguments; + lodash.isArray = isArray; + lodash.isArrayBuffer = isArrayBuffer; + lodash.isArrayLike = isArrayLike; + lodash.isArrayLikeObject = isArrayLikeObject; + lodash.isBoolean = isBoolean; + lodash.isBuffer = isBuffer; + lodash.isDate = isDate; + lodash.isElement = isElement3; + lodash.isEmpty = isEmpty2; + lodash.isEqual = isEqual2; + lodash.isEqualWith = isEqualWith; + lodash.isError = isError; + lodash.isFinite = isFinite; + lodash.isFunction = isFunction3; + lodash.isInteger = isInteger; + lodash.isLength = isLength; + lodash.isMap = isMap; + lodash.isMatch = isMatch; + lodash.isMatchWith = isMatchWith; + lodash.isNaN = isNaN; + lodash.isNative = isNative; + lodash.isNil = isNil; + lodash.isNull = isNull; + lodash.isNumber = isNumber2; + lodash.isObject = isObject; + lodash.isObjectLike = isObjectLike; + lodash.isPlainObject = isPlainObject2; + lodash.isRegExp = isRegExp2; + lodash.isSafeInteger = isSafeInteger; + lodash.isSet = isSet; + lodash.isString = isString; + lodash.isSymbol = isSymbol; + lodash.isTypedArray = isTypedArray; + lodash.isUndefined = isUndefined; + lodash.isWeakMap = isWeakMap; + lodash.isWeakSet = isWeakSet; + lodash.join = join2; + lodash.kebabCase = kebabCase; + lodash.last = last; + lodash.lastIndexOf = lastIndexOf; + lodash.lowerCase = lowerCase; + lodash.lowerFirst = lowerFirst; + lodash.lt = lt; + lodash.lte = lte; + lodash.max = max2; + lodash.maxBy = maxBy; + lodash.mean = mean; + lodash.meanBy = meanBy; + lodash.min = min2; + lodash.minBy = minBy; + lodash.stubArray = stubArray; + lodash.stubFalse = stubFalse; + lodash.stubObject = stubObject; + lodash.stubString = stubString; + lodash.stubTrue = stubTrue; + lodash.multiply = multiply; + lodash.nth = nth; + lodash.noConflict = noConflict; + lodash.noop = noop2; + lodash.now = now; + lodash.pad = pad; + lodash.padEnd = padEnd; + lodash.padStart = padStart; + lodash.parseInt = parseInt2; + lodash.random = random; + lodash.reduce = reduce; + lodash.reduceRight = reduceRight; + lodash.repeat = repeat; + lodash.replace = replace2; + lodash.result = result; + lodash.round = round3; + lodash.runInContext = runInContext2; + lodash.sample = sample; + lodash.size = size; + lodash.snakeCase = snakeCase; + lodash.some = some; + lodash.sortedIndex = sortedIndex; + lodash.sortedIndexBy = sortedIndexBy; + lodash.sortedIndexOf = sortedIndexOf; + lodash.sortedLastIndex = sortedLastIndex; + lodash.sortedLastIndexBy = sortedLastIndexBy; + lodash.sortedLastIndexOf = sortedLastIndexOf; + lodash.startCase = startCase; + lodash.startsWith = startsWith2; + lodash.subtract = subtract; + lodash.sum = sum; + lodash.sumBy = sumBy; + lodash.template = template; + lodash.times = times; + lodash.toFinite = toFinite; + lodash.toInteger = toInteger; + lodash.toLength = toLength; + lodash.toLower = toLower; + lodash.toNumber = toNumber; + lodash.toSafeInteger = toSafeInteger; + lodash.toString = toString; + lodash.toUpper = toUpper; + lodash.trim = trim; + lodash.trimEnd = trimEnd; + lodash.trimStart = trimStart; + lodash.truncate = truncate; + lodash.unescape = unescape; + lodash.uniqueId = uniqueId; + lodash.upperCase = upperCase; + lodash.upperFirst = upperFirst; + lodash.each = forEach3; + lodash.eachRight = forEachRight; + lodash.first = head; + mixin(lodash, function() { + var source3 = {}; + baseForOwn(lodash, function(func, methodName) { + if (!hasOwnProperty2.call(lodash.prototype, methodName)) { + source3[methodName] = func; + } + }); + return source3; + }(), { "chain": false }); + lodash.VERSION = VERSION; + arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) { + lodash[methodName].placeholder = lodash; + }); + arrayEach(["drop", "take"], function(methodName, index) { + LazyWrapper.prototype[methodName] = function(n) { + n = n === undefined2 ? 1 : nativeMax(toInteger(n), 0); + var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone(); + if (result2.__filtered__) { + result2.__takeCount__ = nativeMin(n, result2.__takeCount__); + } else { + result2.__views__.push({ + "size": nativeMin(n, MAX_ARRAY_LENGTH), + "type": methodName + (result2.__dir__ < 0 ? "Right" : "") + }); + } + return result2; + }; + LazyWrapper.prototype[methodName + "Right"] = function(n) { + return this.reverse()[methodName](n).reverse(); + }; + }); + arrayEach(["filter", "map", "takeWhile"], function(methodName, index) { + var type = index + 1, isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG; + LazyWrapper.prototype[methodName] = function(iteratee2) { + var result2 = this.clone(); + result2.__iteratees__.push({ + "iteratee": getIteratee(iteratee2, 3), + "type": type + }); + result2.__filtered__ = result2.__filtered__ || isFilter; + return result2; + }; + }); + arrayEach(["head", "last"], function(methodName, index) { + var takeName = "take" + (index ? "Right" : ""); + LazyWrapper.prototype[methodName] = function() { + return this[takeName](1).value()[0]; + }; + }); + arrayEach(["initial", "tail"], function(methodName, index) { + var dropName = "drop" + (index ? "" : "Right"); + LazyWrapper.prototype[methodName] = function() { + return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1); + }; + }); + LazyWrapper.prototype.compact = function() { + return this.filter(identity); + }; + LazyWrapper.prototype.find = function(predicate) { + return this.filter(predicate).head(); + }; + LazyWrapper.prototype.findLast = function(predicate) { + return this.reverse().find(predicate); + }; + LazyWrapper.prototype.invokeMap = baseRest(function(path, args) { + if (typeof path == "function") { + return new LazyWrapper(this); + } + return this.map(function(value) { + return baseInvoke(value, path, args); + }); + }); + LazyWrapper.prototype.reject = function(predicate) { + return this.filter(negate(getIteratee(predicate))); + }; + LazyWrapper.prototype.slice = function(start2, end2) { + start2 = toInteger(start2); + var result2 = this; + if (result2.__filtered__ && (start2 > 0 || end2 < 0)) { + return new LazyWrapper(result2); + } + if (start2 < 0) { + result2 = result2.takeRight(-start2); + } else if (start2) { + result2 = result2.drop(start2); + } + if (end2 !== undefined2) { + end2 = toInteger(end2); + result2 = end2 < 0 ? result2.dropRight(-end2) : result2.take(end2 - start2); + } + return result2; + }; + LazyWrapper.prototype.takeRightWhile = function(predicate) { + return this.reverse().takeWhile(predicate).reverse(); + }; + LazyWrapper.prototype.toArray = function() { + return this.take(MAX_ARRAY_LENGTH); + }; + baseForOwn(LazyWrapper.prototype, function(func, methodName) { + var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName); + if (!lodashFunc) { + return; + } + lodash.prototype[methodName] = function() { + var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray(value); + var interceptor = function(value2) { + var result3 = lodashFunc.apply(lodash, arrayPush([value2], args)); + return isTaker && chainAll ? result3[0] : result3; + }; + if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) { + isLazy = useLazy = false; + } + var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid; + if (!retUnwrapped && useLazy) { + value = onlyLazy ? value : new LazyWrapper(this); + var result2 = func.apply(value, args); + result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 }); + return new LodashWrapper(result2, chainAll); + } + if (isUnwrapped && onlyLazy) { + return func.apply(this, args); + } + result2 = this.thru(interceptor); + return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2; + }; + }); + arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) { + var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName); + lodash.prototype[methodName] = function() { + var args = arguments; + if (retUnwrapped && !this.__chain__) { + var value = this.value(); + return func.apply(isArray(value) ? value : [], args); + } + return this[chainName](function(value2) { + return func.apply(isArray(value2) ? value2 : [], args); + }); + }; + }); + baseForOwn(LazyWrapper.prototype, function(func, methodName) { + var lodashFunc = lodash[methodName]; + if (lodashFunc) { + var key = lodashFunc.name + ""; + if (!hasOwnProperty2.call(realNames, key)) { + realNames[key] = []; + } + realNames[key].push({ "name": methodName, "func": lodashFunc }); + } + }); + realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{ + "name": "wrapper", + "func": undefined2 + }]; + LazyWrapper.prototype.clone = lazyClone; + LazyWrapper.prototype.reverse = lazyReverse; + LazyWrapper.prototype.value = lazyValue; + lodash.prototype.at = wrapperAt; + lodash.prototype.chain = wrapperChain; + lodash.prototype.commit = wrapperCommit; + lodash.prototype.next = wrapperNext; + lodash.prototype.plant = wrapperPlant; + lodash.prototype.reverse = wrapperReverse; + lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; + lodash.prototype.first = lodash.prototype.head; + if (symIterator) { + lodash.prototype[symIterator] = wrapperToIterator; + } + return lodash; + }; + var _ = runInContext(); + if (typeof define == "function" && typeof define.amd == "object" && define.amd) { + root._ = _; + define(function() { + return _; + }); + } else if (freeModule) { + (freeModule.exports = _)._ = _; + freeExports._ = _; + } else { + root._ = _; + } + }).call(exports); + } +}); + +// node_modules/orderedmap/dist/index.js +function OrderedMap(content) { + this.content = content; +} +OrderedMap.prototype = { + constructor: OrderedMap, + find: function(key) { + for (var i = 0; i < this.content.length; i += 2) + if (this.content[i] === key) + return i; + return -1; + }, + // :: (string) → ?any + // Retrieve the value stored under `key`, or return undefined when + // no such key exists. + get: function(key) { + var found2 = this.find(key); + return found2 == -1 ? void 0 : this.content[found2 + 1]; + }, + // :: (string, any, ?string) → OrderedMap + // Create a new map by replacing the value of `key` with a new + // value, or adding a binding to the end of the map. If `newKey` is + // given, the key of the binding will be replaced with that key. + update: function(key, value, newKey) { + var self2 = newKey && newKey != key ? this.remove(newKey) : this; + var found2 = self2.find(key), content = self2.content.slice(); + if (found2 == -1) { + content.push(newKey || key, value); + } else { + content[found2 + 1] = value; + if (newKey) + content[found2] = newKey; + } + return new OrderedMap(content); + }, + // :: (string) → OrderedMap + // Return a map with the given key removed, if it existed. + remove: function(key) { + var found2 = this.find(key); + if (found2 == -1) + return this; + var content = this.content.slice(); + content.splice(found2, 2); + return new OrderedMap(content); + }, + // :: (string, any) → OrderedMap + // Add a new key to the start of the map. + addToStart: function(key, value) { + return new OrderedMap([key, value].concat(this.remove(key).content)); + }, + // :: (string, any) → OrderedMap + // Add a new key to the end of the map. + addToEnd: function(key, value) { + var content = this.remove(key).content.slice(); + content.push(key, value); + return new OrderedMap(content); + }, + // :: (string, string, any) → OrderedMap + // Add a key after the given key. If `place` is not found, the new + // key is added to the end. + addBefore: function(place, key, value) { + var without = this.remove(key), content = without.content.slice(); + var found2 = without.find(place); + content.splice(found2 == -1 ? content.length : found2, 0, key, value); + return new OrderedMap(content); + }, + // :: ((key: string, value: any)) + // Call the given function for each key/value pair in the map, in + // order. + forEach: function(f) { + for (var i = 0; i < this.content.length; i += 2) + f(this.content[i], this.content[i + 1]); + }, + // :: (union) → OrderedMap + // Create a new map by prepending the keys in this map that don't + // appear in `map` before the keys in `map`. + prepend: function(map2) { + map2 = OrderedMap.from(map2); + if (!map2.size) + return this; + return new OrderedMap(map2.content.concat(this.subtract(map2).content)); + }, + // :: (union) → OrderedMap + // Create a new map by appending the keys in this map that don't + // appear in `map` after the keys in `map`. + append: function(map2) { + map2 = OrderedMap.from(map2); + if (!map2.size) + return this; + return new OrderedMap(this.subtract(map2).content.concat(map2.content)); + }, + // :: (union) → OrderedMap + // Create a map containing all the keys in this map that don't + // appear in `map`. + subtract: function(map2) { + var result = this; + map2 = OrderedMap.from(map2); + for (var i = 0; i < map2.content.length; i += 2) + result = result.remove(map2.content[i]); + return result; + }, + // :: () → Object + // Turn ordered map into a plain object. + toObject: function() { + var result = {}; + this.forEach(function(key, value) { + result[key] = value; + }); + return result; + }, + // :: number + // The amount of keys in this map. + get size() { + return this.content.length >> 1; + } +}; +OrderedMap.from = function(value) { + if (value instanceof OrderedMap) + return value; + var content = []; + if (value) + for (var prop in value) + content.push(prop, value[prop]); + return new OrderedMap(content); +}; +var dist_default = OrderedMap; + +// node_modules/prosemirror-model/dist/index.js +function findDiffStart(a, b, pos) { + for (let i = 0; ; i++) { + if (i == a.childCount || i == b.childCount) + return a.childCount == b.childCount ? null : pos; + let childA = a.child(i), childB = b.child(i); + if (childA == childB) { + pos += childA.nodeSize; + continue; + } + if (!childA.sameMarkup(childB)) + return pos; + if (childA.isText && childA.text != childB.text) { + for (let j = 0; childA.text[j] == childB.text[j]; j++) + pos++; + return pos; + } + if (childA.content.size || childB.content.size) { + let inner = findDiffStart(childA.content, childB.content, pos + 1); + if (inner != null) + return inner; + } + pos += childA.nodeSize; + } +} +function findDiffEnd(a, b, posA, posB) { + for (let iA = a.childCount, iB = b.childCount; ; ) { + if (iA == 0 || iB == 0) + return iA == iB ? null : { a: posA, b: posB }; + let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize; + if (childA == childB) { + posA -= size; + posB -= size; + continue; + } + if (!childA.sameMarkup(childB)) + return { a: posA, b: posB }; + if (childA.isText && childA.text != childB.text) { + let same = 0, minSize = Math.min(childA.text.length, childB.text.length); + while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) { + same++; + posA--; + posB--; + } + return { a: posA, b: posB }; + } + if (childA.content.size || childB.content.size) { + let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1); + if (inner) + return inner; + } + posA -= size; + posB -= size; + } +} +var Fragment = class _Fragment { + /** + @internal + */ + constructor(content, size) { + this.content = content; + this.size = size || 0; + if (size == null) + for (let i = 0; i < content.length; i++) + this.size += content[i].nodeSize; + } + /** + Invoke a callback for all descendant nodes between the given two + positions (relative to start of this fragment). Doesn't descend + into a node when the callback returns `false`. + */ + nodesBetween(from2, to, f, nodeStart = 0, parent) { + for (let i = 0, pos = 0; pos < to; i++) { + let child = this.content[i], end2 = pos + child.nodeSize; + if (end2 > from2 && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) { + let start2 = pos + 1; + child.nodesBetween(Math.max(0, from2 - start2), Math.min(child.content.size, to - start2), f, nodeStart + start2); + } + pos = end2; + } + } + /** + Call the given callback for every descendant node. `pos` will be + relative to the start of the fragment. The callback may return + `false` to prevent traversal of a given node's children. + */ + descendants(f) { + this.nodesBetween(0, this.size, f); + } + /** + Extract the text between `from` and `to`. See the same method on + [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween). + */ + textBetween(from2, to, blockSeparator, leafText) { + let text = "", separated = true; + this.nodesBetween(from2, to, (node, pos) => { + if (node.isText) { + text += node.text.slice(Math.max(from2, pos) - pos, to - pos); + separated = !blockSeparator; + } else if (node.isLeaf) { + if (leafText) { + text += typeof leafText === "function" ? leafText(node) : leafText; + } else if (node.type.spec.leafText) { + text += node.type.spec.leafText(node); + } + separated = !blockSeparator; + } else if (!separated && node.isBlock) { + text += blockSeparator; + separated = true; + } + }, 0); + return text; + } + /** + Create a new fragment containing the combined content of this + fragment and the other. + */ + append(other) { + if (!other.size) + return this; + if (!this.size) + return other; + let last = this.lastChild, first2 = other.firstChild, content = this.content.slice(), i = 0; + if (last.isText && last.sameMarkup(first2)) { + content[content.length - 1] = last.withText(last.text + first2.text); + i = 1; + } + for (; i < other.content.length; i++) + content.push(other.content[i]); + return new _Fragment(content, this.size + other.size); + } + /** + Cut out the sub-fragment between the two given positions. + */ + cut(from2, to = this.size) { + if (from2 == 0 && to == this.size) + return this; + let result = [], size = 0; + if (to > from2) + for (let i = 0, pos = 0; pos < to; i++) { + let child = this.content[i], end2 = pos + child.nodeSize; + if (end2 > from2) { + if (pos < from2 || end2 > to) { + if (child.isText) + child = child.cut(Math.max(0, from2 - pos), Math.min(child.text.length, to - pos)); + else + child = child.cut(Math.max(0, from2 - pos - 1), Math.min(child.content.size, to - pos - 1)); + } + result.push(child); + size += child.nodeSize; + } + pos = end2; + } + return new _Fragment(result, size); + } + /** + @internal + */ + cutByIndex(from2, to) { + if (from2 == to) + return _Fragment.empty; + if (from2 == 0 && to == this.content.length) + return this; + return new _Fragment(this.content.slice(from2, to)); + } + /** + Create a new fragment in which the node at the given index is + replaced by the given node. + */ + replaceChild(index, node) { + let current = this.content[index]; + if (current == node) + return this; + let copy2 = this.content.slice(); + let size = this.size + node.nodeSize - current.nodeSize; + copy2[index] = node; + return new _Fragment(copy2, size); + } + /** + Create a new fragment by prepending the given node to this + fragment. + */ + addToStart(node) { + return new _Fragment([node].concat(this.content), this.size + node.nodeSize); + } + /** + Create a new fragment by appending the given node to this + fragment. + */ + addToEnd(node) { + return new _Fragment(this.content.concat(node), this.size + node.nodeSize); + } + /** + Compare this fragment to another one. + */ + eq(other) { + if (this.content.length != other.content.length) + return false; + for (let i = 0; i < this.content.length; i++) + if (!this.content[i].eq(other.content[i])) + return false; + return true; + } + /** + The first child of the fragment, or `null` if it is empty. + */ + get firstChild() { + return this.content.length ? this.content[0] : null; + } + /** + The last child of the fragment, or `null` if it is empty. + */ + get lastChild() { + return this.content.length ? this.content[this.content.length - 1] : null; + } + /** + The number of child nodes in this fragment. + */ + get childCount() { + return this.content.length; + } + /** + Get the child node at the given index. Raise an error when the + index is out of range. + */ + child(index) { + let found2 = this.content[index]; + if (!found2) + throw new RangeError("Index " + index + " out of range for " + this); + return found2; + } + /** + Get the child node at the given index, if it exists. + */ + maybeChild(index) { + return this.content[index] || null; + } + /** + Call `f` for every child node, passing the node, its offset + into this parent node, and its index. + */ + forEach(f) { + for (let i = 0, p = 0; i < this.content.length; i++) { + let child = this.content[i]; + f(child, p, i); + p += child.nodeSize; + } + } + /** + Find the first position at which this fragment and another + fragment differ, or `null` if they are the same. + */ + findDiffStart(other, pos = 0) { + return findDiffStart(this, other, pos); + } + /** + Find the first position, searching from the end, at which this + fragment and the given fragment differ, or `null` if they are + the same. Since this position will not be the same in both + nodes, an object with two separate positions is returned. + */ + findDiffEnd(other, pos = this.size, otherPos = other.size) { + return findDiffEnd(this, other, pos, otherPos); + } + /** + Find the index and inner offset corresponding to a given relative + position in this fragment. The result object will be reused + (overwritten) the next time the function is called. (Not public.) + */ + findIndex(pos, round3 = -1) { + if (pos == 0) + return retIndex(0, pos); + if (pos == this.size) + return retIndex(this.content.length, pos); + if (pos > this.size || pos < 0) + throw new RangeError(`Position ${pos} outside of fragment (${this})`); + for (let i = 0, curPos = 0; ; i++) { + let cur = this.child(i), end2 = curPos + cur.nodeSize; + if (end2 >= pos) { + if (end2 == pos || round3 > 0) + return retIndex(i + 1, end2); + return retIndex(i, curPos); + } + curPos = end2; + } + } + /** + Return a debugging string that describes this fragment. + */ + toString() { + return "<" + this.toStringInner() + ">"; + } + /** + @internal + */ + toStringInner() { + return this.content.join(", "); + } + /** + Create a JSON-serializeable representation of this fragment. + */ + toJSON() { + return this.content.length ? this.content.map((n) => n.toJSON()) : null; + } + /** + Deserialize a fragment from its JSON representation. + */ + static fromJSON(schema, value) { + if (!value) + return _Fragment.empty; + if (!Array.isArray(value)) + throw new RangeError("Invalid input for Fragment.fromJSON"); + return new _Fragment(value.map(schema.nodeFromJSON)); + } + /** + Build a fragment from an array of nodes. Ensures that adjacent + text nodes with the same marks are joined together. + */ + static fromArray(array) { + if (!array.length) + return _Fragment.empty; + let joined, size = 0; + for (let i = 0; i < array.length; i++) { + let node = array[i]; + size += node.nodeSize; + if (i && node.isText && array[i - 1].sameMarkup(node)) { + if (!joined) + joined = array.slice(0, i); + joined[joined.length - 1] = node.withText(joined[joined.length - 1].text + node.text); + } else if (joined) { + joined.push(node); + } + } + return new _Fragment(joined || array, size); + } + /** + Create a fragment from something that can be interpreted as a + set of nodes. For `null`, it returns the empty fragment. For a + fragment, the fragment itself. For a node or array of nodes, a + fragment containing those nodes. + */ + static from(nodes) { + if (!nodes) + return _Fragment.empty; + if (nodes instanceof _Fragment) + return nodes; + if (Array.isArray(nodes)) + return this.fromArray(nodes); + if (nodes.attrs) + return new _Fragment([nodes], nodes.nodeSize); + throw new RangeError("Can not convert " + nodes + " to a Fragment" + (nodes.nodesBetween ? " (looks like multiple versions of prosemirror-model were loaded)" : "")); + } +}; +Fragment.empty = new Fragment([], 0); +var found = { index: 0, offset: 0 }; +function retIndex(index, offset2) { + found.index = index; + found.offset = offset2; + return found; +} +function compareDeep(a, b) { + if (a === b) + return true; + if (!(a && typeof a == "object") || !(b && typeof b == "object")) + return false; + let array = Array.isArray(a); + if (Array.isArray(b) != array) + return false; + if (array) { + if (a.length != b.length) + return false; + for (let i = 0; i < a.length; i++) + if (!compareDeep(a[i], b[i])) + return false; + } else { + for (let p in a) + if (!(p in b) || !compareDeep(a[p], b[p])) + return false; + for (let p in b) + if (!(p in a)) + return false; + } + return true; +} +var Mark = class _Mark { + /** + @internal + */ + constructor(type, attrs) { + this.type = type; + this.attrs = attrs; + } + /** + Given a set of marks, create a new set which contains this one as + well, in the right position. If this mark is already in the set, + the set itself is returned. If any marks that are set to be + [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present, + those are replaced by this one. + */ + addToSet(set) { + let copy2, placed = false; + for (let i = 0; i < set.length; i++) { + let other = set[i]; + if (this.eq(other)) + return set; + if (this.type.excludes(other.type)) { + if (!copy2) + copy2 = set.slice(0, i); + } else if (other.type.excludes(this.type)) { + return set; + } else { + if (!placed && other.type.rank > this.type.rank) { + if (!copy2) + copy2 = set.slice(0, i); + copy2.push(this); + placed = true; + } + if (copy2) + copy2.push(other); + } + } + if (!copy2) + copy2 = set.slice(); + if (!placed) + copy2.push(this); + return copy2; + } + /** + Remove this mark from the given set, returning a new set. If this + mark is not in the set, the set itself is returned. + */ + removeFromSet(set) { + for (let i = 0; i < set.length; i++) + if (this.eq(set[i])) + return set.slice(0, i).concat(set.slice(i + 1)); + return set; + } + /** + Test whether this mark is in the given set of marks. + */ + isInSet(set) { + for (let i = 0; i < set.length; i++) + if (this.eq(set[i])) + return true; + return false; + } + /** + Test whether this mark has the same type and attributes as + another mark. + */ + eq(other) { + return this == other || this.type == other.type && compareDeep(this.attrs, other.attrs); + } + /** + Convert this mark to a JSON-serializeable representation. + */ + toJSON() { + let obj = { type: this.type.name }; + for (let _ in this.attrs) { + obj.attrs = this.attrs; + break; + } + return obj; + } + /** + Deserialize a mark from JSON. + */ + static fromJSON(schema, json2) { + if (!json2) + throw new RangeError("Invalid input for Mark.fromJSON"); + let type = schema.marks[json2.type]; + if (!type) + throw new RangeError(`There is no mark type ${json2.type} in this schema`); + return type.create(json2.attrs); + } + /** + Test whether two sets of marks are identical. + */ + static sameSet(a, b) { + if (a == b) + return true; + if (a.length != b.length) + return false; + for (let i = 0; i < a.length; i++) + if (!a[i].eq(b[i])) + return false; + return true; + } + /** + Create a properly sorted mark set from null, a single mark, or an + unsorted array of marks. + */ + static setFrom(marks) { + if (!marks || Array.isArray(marks) && marks.length == 0) + return _Mark.none; + if (marks instanceof _Mark) + return [marks]; + let copy2 = marks.slice(); + copy2.sort((a, b) => a.type.rank - b.type.rank); + return copy2; + } +}; +Mark.none = []; +var ReplaceError = class extends Error { +}; +var Slice = class _Slice { + /** + Create a slice. When specifying a non-zero open depth, you must + make sure that there are nodes of at least that depth at the + appropriate side of the fragment—i.e. if the fragment is an + empty paragraph node, `openStart` and `openEnd` can't be greater + than 1. + + It is not necessary for the content of open nodes to conform to + the schema's content constraints, though it should be a valid + start/end/middle for such a node, depending on which sides are + open. + */ + constructor(content, openStart, openEnd) { + this.content = content; + this.openStart = openStart; + this.openEnd = openEnd; + } + /** + The size this slice would add when inserted into a document. + */ + get size() { + return this.content.size - this.openStart - this.openEnd; + } + /** + @internal + */ + insertAt(pos, fragment) { + let content = insertInto(this.content, pos + this.openStart, fragment); + return content && new _Slice(content, this.openStart, this.openEnd); + } + /** + @internal + */ + removeBetween(from2, to) { + return new _Slice(removeRange(this.content, from2 + this.openStart, to + this.openStart), this.openStart, this.openEnd); + } + /** + Tests whether this slice is equal to another slice. + */ + eq(other) { + return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd; + } + /** + @internal + */ + toString() { + return this.content + "(" + this.openStart + "," + this.openEnd + ")"; + } + /** + Convert a slice to a JSON-serializable representation. + */ + toJSON() { + if (!this.content.size) + return null; + let json2 = { content: this.content.toJSON() }; + if (this.openStart > 0) + json2.openStart = this.openStart; + if (this.openEnd > 0) + json2.openEnd = this.openEnd; + return json2; + } + /** + Deserialize a slice from its JSON representation. + */ + static fromJSON(schema, json2) { + if (!json2) + return _Slice.empty; + let openStart = json2.openStart || 0, openEnd = json2.openEnd || 0; + if (typeof openStart != "number" || typeof openEnd != "number") + throw new RangeError("Invalid input for Slice.fromJSON"); + return new _Slice(Fragment.fromJSON(schema, json2.content), openStart, openEnd); + } + /** + Create a slice from a fragment by taking the maximum possible + open value on both side of the fragment. + */ + static maxOpen(fragment, openIsolating = true) { + let openStart = 0, openEnd = 0; + for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild) + openStart++; + for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild) + openEnd++; + return new _Slice(fragment, openStart, openEnd); + } +}; +Slice.empty = new Slice(Fragment.empty, 0, 0); +function removeRange(content, from2, to) { + let { index, offset: offset2 } = content.findIndex(from2), child = content.maybeChild(index); + let { index: indexTo, offset: offsetTo } = content.findIndex(to); + if (offset2 == from2 || child.isText) { + if (offsetTo != to && !content.child(indexTo).isText) + throw new RangeError("Removing non-flat range"); + return content.cut(0, from2).append(content.cut(to)); + } + if (index != indexTo) + throw new RangeError("Removing non-flat range"); + return content.replaceChild(index, child.copy(removeRange(child.content, from2 - offset2 - 1, to - offset2 - 1))); +} +function insertInto(content, dist, insert, parent) { + let { index, offset: offset2 } = content.findIndex(dist), child = content.maybeChild(index); + if (offset2 == dist || child.isText) { + if (parent && !parent.canReplace(index, index, insert)) + return null; + return content.cut(0, dist).append(insert).append(content.cut(dist)); + } + let inner = insertInto(child.content, dist - offset2 - 1, insert); + return inner && content.replaceChild(index, child.copy(inner)); +} +function replace($from, $to, slice2) { + if (slice2.openStart > $from.depth) + throw new ReplaceError("Inserted content deeper than insertion position"); + if ($from.depth - slice2.openStart != $to.depth - slice2.openEnd) + throw new ReplaceError("Inconsistent open depths"); + return replaceOuter($from, $to, slice2, 0); +} +function replaceOuter($from, $to, slice2, depth) { + let index = $from.index(depth), node = $from.node(depth); + if (index == $to.index(depth) && depth < $from.depth - slice2.openStart) { + let inner = replaceOuter($from, $to, slice2, depth + 1); + return node.copy(node.content.replaceChild(index, inner)); + } else if (!slice2.content.size) { + return close(node, replaceTwoWay($from, $to, depth)); + } else if (!slice2.openStart && !slice2.openEnd && $from.depth == depth && $to.depth == depth) { + let parent = $from.parent, content = parent.content; + return close(parent, content.cut(0, $from.parentOffset).append(slice2.content).append(content.cut($to.parentOffset))); + } else { + let { start: start2, end: end2 } = prepareSliceForReplace(slice2, $from); + return close(node, replaceThreeWay($from, start2, end2, $to, depth)); + } +} +function checkJoin(main2, sub) { + if (!sub.type.compatibleContent(main2.type)) + throw new ReplaceError("Cannot join " + sub.type.name + " onto " + main2.type.name); +} +function joinable($before, $after, depth) { + let node = $before.node(depth); + checkJoin(node, $after.node(depth)); + return node; +} +function addNode(child, target) { + let last = target.length - 1; + if (last >= 0 && child.isText && child.sameMarkup(target[last])) + target[last] = child.withText(target[last].text + child.text); + else + target.push(child); +} +function addRange($start, $end, depth, target) { + let node = ($end || $start).node(depth); + let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount; + if ($start) { + startIndex = $start.index(depth); + if ($start.depth > depth) { + startIndex++; + } else if ($start.textOffset) { + addNode($start.nodeAfter, target); + startIndex++; + } + } + for (let i = startIndex; i < endIndex; i++) + addNode(node.child(i), target); + if ($end && $end.depth == depth && $end.textOffset) + addNode($end.nodeBefore, target); +} +function close(node, content) { + node.type.checkContent(content); + return node.copy(content); +} +function replaceThreeWay($from, $start, $end, $to, depth) { + let openStart = $from.depth > depth && joinable($from, $start, depth + 1); + let openEnd = $to.depth > depth && joinable($end, $to, depth + 1); + let content = []; + addRange(null, $from, depth, content); + if (openStart && openEnd && $start.index(depth) == $end.index(depth)) { + checkJoin(openStart, openEnd); + addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content); + } else { + if (openStart) + addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content); + addRange($start, $end, depth, content); + if (openEnd) + addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content); + } + addRange($to, null, depth, content); + return new Fragment(content); +} +function replaceTwoWay($from, $to, depth) { + let content = []; + addRange(null, $from, depth, content); + if ($from.depth > depth) { + let type = joinable($from, $to, depth + 1); + addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content); + } + addRange($to, null, depth, content); + return new Fragment(content); +} +function prepareSliceForReplace(slice2, $along) { + let extra = $along.depth - slice2.openStart, parent = $along.node(extra); + let node = parent.copy(slice2.content); + for (let i = extra - 1; i >= 0; i--) + node = $along.node(i).copy(Fragment.from(node)); + return { + start: node.resolveNoCache(slice2.openStart + extra), + end: node.resolveNoCache(node.content.size - slice2.openEnd - extra) + }; +} +var ResolvedPos = class _ResolvedPos { + /** + @internal + */ + constructor(pos, path, parentOffset) { + this.pos = pos; + this.path = path; + this.parentOffset = parentOffset; + this.depth = path.length / 3 - 1; + } + /** + @internal + */ + resolveDepth(val) { + if (val == null) + return this.depth; + if (val < 0) + return this.depth + val; + return val; + } + /** + The parent node that the position points into. Note that even if + a position points into a text node, that node is not considered + the parent—text nodes are ‘flat’ in this model, and have no content. + */ + get parent() { + return this.node(this.depth); + } + /** + The root node in which the position was resolved. + */ + get doc() { + return this.node(0); + } + /** + The ancestor node at the given level. `p.node(p.depth)` is the + same as `p.parent`. + */ + node(depth) { + return this.path[this.resolveDepth(depth) * 3]; + } + /** + The index into the ancestor at the given level. If this points + at the 3rd node in the 2nd paragraph on the top level, for + example, `p.index(0)` is 1 and `p.index(1)` is 2. + */ + index(depth) { + return this.path[this.resolveDepth(depth) * 3 + 1]; + } + /** + The index pointing after this position into the ancestor at the + given level. + */ + indexAfter(depth) { + depth = this.resolveDepth(depth); + return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1); + } + /** + The (absolute) position at the start of the node at the given + level. + */ + start(depth) { + depth = this.resolveDepth(depth); + return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1; + } + /** + The (absolute) position at the end of the node at the given + level. + */ + end(depth) { + depth = this.resolveDepth(depth); + return this.start(depth) + this.node(depth).content.size; + } + /** + The (absolute) position directly before the wrapping node at the + given level, or, when `depth` is `this.depth + 1`, the original + position. + */ + before(depth) { + depth = this.resolveDepth(depth); + if (!depth) + throw new RangeError("There is no position before the top-level node"); + return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1]; + } + /** + The (absolute) position directly after the wrapping node at the + given level, or the original position when `depth` is `this.depth + 1`. + */ + after(depth) { + depth = this.resolveDepth(depth); + if (!depth) + throw new RangeError("There is no position after the top-level node"); + return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize; + } + /** + When this position points into a text node, this returns the + distance between the position and the start of the text node. + Will be zero for positions that point between nodes. + */ + get textOffset() { + return this.pos - this.path[this.path.length - 1]; + } + /** + Get the node directly after the position, if any. If the position + points into a text node, only the part of that node after the + position is returned. + */ + get nodeAfter() { + let parent = this.parent, index = this.index(this.depth); + if (index == parent.childCount) + return null; + let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index); + return dOff ? parent.child(index).cut(dOff) : child; + } + /** + Get the node directly before the position, if any. If the + position points into a text node, only the part of that node + before the position is returned. + */ + get nodeBefore() { + let index = this.index(this.depth); + let dOff = this.pos - this.path[this.path.length - 1]; + if (dOff) + return this.parent.child(index).cut(0, dOff); + return index == 0 ? null : this.parent.child(index - 1); + } + /** + Get the position at the given index in the parent node at the + given depth (which defaults to `this.depth`). + */ + posAtIndex(index, depth) { + depth = this.resolveDepth(depth); + let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1; + for (let i = 0; i < index; i++) + pos += node.child(i).nodeSize; + return pos; + } + /** + Get the marks at this position, factoring in the surrounding + marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the + position is at the start of a non-empty node, the marks of the + node after it (if any) are returned. + */ + marks() { + let parent = this.parent, index = this.index(); + if (parent.content.size == 0) + return Mark.none; + if (this.textOffset) + return parent.child(index).marks; + let main2 = parent.maybeChild(index - 1), other = parent.maybeChild(index); + if (!main2) { + let tmp = main2; + main2 = other; + other = tmp; + } + let marks = main2.marks; + for (var i = 0; i < marks.length; i++) + if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks))) + marks = marks[i--].removeFromSet(marks); + return marks; + } + /** + Get the marks after the current position, if any, except those + that are non-inclusive and not present at position `$end`. This + is mostly useful for getting the set of marks to preserve after a + deletion. Will return `null` if this position is at the end of + its parent node or its parent node isn't a textblock (in which + case no marks should be preserved). + */ + marksAcross($end) { + let after = this.parent.maybeChild(this.index()); + if (!after || !after.isInline) + return null; + let marks = after.marks, next = $end.parent.maybeChild($end.index()); + for (var i = 0; i < marks.length; i++) + if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks))) + marks = marks[i--].removeFromSet(marks); + return marks; + } + /** + The depth up to which this position and the given (non-resolved) + position share the same parent nodes. + */ + sharedDepth(pos) { + for (let depth = this.depth; depth > 0; depth--) + if (this.start(depth) <= pos && this.end(depth) >= pos) + return depth; + return 0; + } + /** + Returns a range based on the place where this position and the + given position diverge around block content. If both point into + the same textblock, for example, a range around that textblock + will be returned. If they point into different blocks, the range + around those blocks in their shared ancestor is returned. You can + pass in an optional predicate that will be called with a parent + node to see if a range into that parent is acceptable. + */ + blockRange(other = this, pred) { + if (other.pos < this.pos) + return other.blockRange(this); + for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--) + if (other.pos <= this.end(d) && (!pred || pred(this.node(d)))) + return new NodeRange(this, other, d); + return null; + } + /** + Query whether the given position shares the same parent node. + */ + sameParent(other) { + return this.pos - this.parentOffset == other.pos - other.parentOffset; + } + /** + Return the greater of this and the given position. + */ + max(other) { + return other.pos > this.pos ? other : this; + } + /** + Return the smaller of this and the given position. + */ + min(other) { + return other.pos < this.pos ? other : this; + } + /** + @internal + */ + toString() { + let str = ""; + for (let i = 1; i <= this.depth; i++) + str += (str ? "/" : "") + this.node(i).type.name + "_" + this.index(i - 1); + return str + ":" + this.parentOffset; + } + /** + @internal + */ + static resolve(doc3, pos) { + if (!(pos >= 0 && pos <= doc3.content.size)) + throw new RangeError("Position " + pos + " out of range"); + let path = []; + let start2 = 0, parentOffset = pos; + for (let node = doc3; ; ) { + let { index, offset: offset2 } = node.content.findIndex(parentOffset); + let rem = parentOffset - offset2; + path.push(node, index, start2 + offset2); + if (!rem) + break; + node = node.child(index); + if (node.isText) + break; + parentOffset = rem - 1; + start2 += offset2 + 1; + } + return new _ResolvedPos(pos, path, parentOffset); + } + /** + @internal + */ + static resolveCached(doc3, pos) { + for (let i = 0; i < resolveCache.length; i++) { + let cached = resolveCache[i]; + if (cached.pos == pos && cached.doc == doc3) + return cached; + } + let result = resolveCache[resolveCachePos] = _ResolvedPos.resolve(doc3, pos); + resolveCachePos = (resolveCachePos + 1) % resolveCacheSize; + return result; + } +}; +var resolveCache = []; +var resolveCachePos = 0; +var resolveCacheSize = 12; +var NodeRange = class { + /** + Construct a node range. `$from` and `$to` should point into the + same node until at least the given `depth`, since a node range + denotes an adjacent set of nodes in a single parent node. + */ + constructor($from, $to, depth) { + this.$from = $from; + this.$to = $to; + this.depth = depth; + } + /** + The position at the start of the range. + */ + get start() { + return this.$from.before(this.depth + 1); + } + /** + The position at the end of the range. + */ + get end() { + return this.$to.after(this.depth + 1); + } + /** + The parent node that the range points into. + */ + get parent() { + return this.$from.node(this.depth); + } + /** + The start index of the range in the parent node. + */ + get startIndex() { + return this.$from.index(this.depth); + } + /** + The end index of the range in the parent node. + */ + get endIndex() { + return this.$to.indexAfter(this.depth); + } +}; +var emptyAttrs = /* @__PURE__ */ Object.create(null); +var Node = class _Node { + /** + @internal + */ + constructor(type, attrs, content, marks = Mark.none) { + this.type = type; + this.attrs = attrs; + this.marks = marks; + this.content = content || Fragment.empty; + } + /** + The size of this node, as defined by the integer-based [indexing + scheme](/docs/guide/#doc.indexing). For text nodes, this is the + amount of characters. For other leaf nodes, it is one. For + non-leaf nodes, it is the size of the content plus two (the + start and end token). + */ + get nodeSize() { + return this.isLeaf ? 1 : 2 + this.content.size; + } + /** + The number of children that the node has. + */ + get childCount() { + return this.content.childCount; + } + /** + Get the child node at the given index. Raises an error when the + index is out of range. + */ + child(index) { + return this.content.child(index); + } + /** + Get the child node at the given index, if it exists. + */ + maybeChild(index) { + return this.content.maybeChild(index); + } + /** + Call `f` for every child node, passing the node, its offset + into this parent node, and its index. + */ + forEach(f) { + this.content.forEach(f); + } + /** + Invoke a callback for all descendant nodes recursively between + the given two positions that are relative to start of this + node's content. The callback is invoked with the node, its + position relative to the original node (method receiver), + its parent node, and its child index. When the callback returns + false for a given node, that node's children will not be + recursed over. The last parameter can be used to specify a + starting position to count from. + */ + nodesBetween(from2, to, f, startPos = 0) { + this.content.nodesBetween(from2, to, f, startPos, this); + } + /** + Call the given callback for every descendant node. Doesn't + descend into a node when the callback returns `false`. + */ + descendants(f) { + this.nodesBetween(0, this.content.size, f); + } + /** + Concatenates all the text nodes found in this fragment and its + children. + */ + get textContent() { + return this.isLeaf && this.type.spec.leafText ? this.type.spec.leafText(this) : this.textBetween(0, this.content.size, ""); + } + /** + Get all text between positions `from` and `to`. When + `blockSeparator` is given, it will be inserted to separate text + from different block nodes. If `leafText` is given, it'll be + inserted for every non-text leaf node encountered, otherwise + [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec^leafText) will be used. + */ + textBetween(from2, to, blockSeparator, leafText) { + return this.content.textBetween(from2, to, blockSeparator, leafText); + } + /** + Returns this node's first child, or `null` if there are no + children. + */ + get firstChild() { + return this.content.firstChild; + } + /** + Returns this node's last child, or `null` if there are no + children. + */ + get lastChild() { + return this.content.lastChild; + } + /** + Test whether two nodes represent the same piece of document. + */ + eq(other) { + return this == other || this.sameMarkup(other) && this.content.eq(other.content); + } + /** + Compare the markup (type, attributes, and marks) of this node to + those of another. Returns `true` if both have the same markup. + */ + sameMarkup(other) { + return this.hasMarkup(other.type, other.attrs, other.marks); + } + /** + Check whether this node's markup correspond to the given type, + attributes, and marks. + */ + hasMarkup(type, attrs, marks) { + return this.type == type && compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) && Mark.sameSet(this.marks, marks || Mark.none); + } + /** + Create a new node with the same markup as this node, containing + the given content (or empty, if no content is given). + */ + copy(content = null) { + if (content == this.content) + return this; + return new _Node(this.type, this.attrs, content, this.marks); + } + /** + Create a copy of this node, with the given set of marks instead + of the node's own marks. + */ + mark(marks) { + return marks == this.marks ? this : new _Node(this.type, this.attrs, this.content, marks); + } + /** + Create a copy of this node with only the content between the + given positions. If `to` is not given, it defaults to the end of + the node. + */ + cut(from2, to = this.content.size) { + if (from2 == 0 && to == this.content.size) + return this; + return this.copy(this.content.cut(from2, to)); + } + /** + Cut out the part of the document between the given positions, and + return it as a `Slice` object. + */ + slice(from2, to = this.content.size, includeParents = false) { + if (from2 == to) + return Slice.empty; + let $from = this.resolve(from2), $to = this.resolve(to); + let depth = includeParents ? 0 : $from.sharedDepth(to); + let start2 = $from.start(depth), node = $from.node(depth); + let content = node.content.cut($from.pos - start2, $to.pos - start2); + return new Slice(content, $from.depth - depth, $to.depth - depth); + } + /** + Replace the part of the document between the given positions with + the given slice. The slice must 'fit', meaning its open sides + must be able to connect to the surrounding content, and its + content nodes must be valid children for the node they are placed + into. If any of this is violated, an error of type + [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown. + */ + replace(from2, to, slice2) { + return replace(this.resolve(from2), this.resolve(to), slice2); + } + /** + Find the node directly after the given position. + */ + nodeAt(pos) { + for (let node = this; ; ) { + let { index, offset: offset2 } = node.content.findIndex(pos); + node = node.maybeChild(index); + if (!node) + return null; + if (offset2 == pos || node.isText) + return node; + pos -= offset2 + 1; + } + } + /** + Find the (direct) child node after the given offset, if any, + and return it along with its index and offset relative to this + node. + */ + childAfter(pos) { + let { index, offset: offset2 } = this.content.findIndex(pos); + return { node: this.content.maybeChild(index), index, offset: offset2 }; + } + /** + Find the (direct) child node before the given offset, if any, + and return it along with its index and offset relative to this + node. + */ + childBefore(pos) { + if (pos == 0) + return { node: null, index: 0, offset: 0 }; + let { index, offset: offset2 } = this.content.findIndex(pos); + if (offset2 < pos) + return { node: this.content.child(index), index, offset: offset2 }; + let node = this.content.child(index - 1); + return { node, index: index - 1, offset: offset2 - node.nodeSize }; + } + /** + Resolve the given position in the document, returning an + [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context. + */ + resolve(pos) { + return ResolvedPos.resolveCached(this, pos); + } + /** + @internal + */ + resolveNoCache(pos) { + return ResolvedPos.resolve(this, pos); + } + /** + Test whether a given mark or mark type occurs in this document + between the two given positions. + */ + rangeHasMark(from2, to, type) { + let found2 = false; + if (to > from2) + this.nodesBetween(from2, to, (node) => { + if (type.isInSet(node.marks)) + found2 = true; + return !found2; + }); + return found2; + } + /** + True when this is a block (non-inline node) + */ + get isBlock() { + return this.type.isBlock; + } + /** + True when this is a textblock node, a block node with inline + content. + */ + get isTextblock() { + return this.type.isTextblock; + } + /** + True when this node allows inline content. + */ + get inlineContent() { + return this.type.inlineContent; + } + /** + True when this is an inline node (a text node or a node that can + appear among text). + */ + get isInline() { + return this.type.isInline; + } + /** + True when this is a text node. + */ + get isText() { + return this.type.isText; + } + /** + True when this is a leaf node. + */ + get isLeaf() { + return this.type.isLeaf; + } + /** + True when this is an atom, i.e. when it does not have directly + editable content. This is usually the same as `isLeaf`, but can + be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom) + on a node's spec (typically used when the node is displayed as + an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)). + */ + get isAtom() { + return this.type.isAtom; + } + /** + Return a string representation of this node for debugging + purposes. + */ + toString() { + if (this.type.spec.toDebugString) + return this.type.spec.toDebugString(this); + let name = this.type.name; + if (this.content.size) + name += "(" + this.content.toStringInner() + ")"; + return wrapMarks(this.marks, name); + } + /** + Get the content match in this node at the given index. + */ + contentMatchAt(index) { + let match = this.type.contentMatch.matchFragment(this.content, 0, index); + if (!match) + throw new Error("Called contentMatchAt on a node with invalid content"); + return match; + } + /** + Test whether replacing the range between `from` and `to` (by + child index) with the given replacement fragment (which defaults + to the empty fragment) would leave the node's content valid. You + can optionally pass `start` and `end` indices into the + replacement fragment. + */ + canReplace(from2, to, replacement = Fragment.empty, start2 = 0, end2 = replacement.childCount) { + let one = this.contentMatchAt(from2).matchFragment(replacement, start2, end2); + let two = one && one.matchFragment(this.content, to); + if (!two || !two.validEnd) + return false; + for (let i = start2; i < end2; i++) + if (!this.type.allowsMarks(replacement.child(i).marks)) + return false; + return true; + } + /** + Test whether replacing the range `from` to `to` (by index) with + a node of the given type would leave the node's content valid. + */ + canReplaceWith(from2, to, type, marks) { + if (marks && !this.type.allowsMarks(marks)) + return false; + let start2 = this.contentMatchAt(from2).matchType(type); + let end2 = start2 && start2.matchFragment(this.content, to); + return end2 ? end2.validEnd : false; + } + /** + Test whether the given node's content could be appended to this + node. If that node is empty, this will only return true if there + is at least one node type that can appear in both nodes (to avoid + merging completely incompatible nodes). + */ + canAppend(other) { + if (other.content.size) + return this.canReplace(this.childCount, this.childCount, other.content); + else + return this.type.compatibleContent(other.type); + } + /** + Check whether this node and its descendants conform to the + schema, and raise error when they do not. + */ + check() { + this.type.checkContent(this.content); + let copy2 = Mark.none; + for (let i = 0; i < this.marks.length; i++) + copy2 = this.marks[i].addToSet(copy2); + if (!Mark.sameSet(copy2, this.marks)) + throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map((m) => m.type.name)}`); + this.content.forEach((node) => node.check()); + } + /** + Return a JSON-serializeable representation of this node. + */ + toJSON() { + let obj = { type: this.type.name }; + for (let _ in this.attrs) { + obj.attrs = this.attrs; + break; + } + if (this.content.size) + obj.content = this.content.toJSON(); + if (this.marks.length) + obj.marks = this.marks.map((n) => n.toJSON()); + return obj; + } + /** + Deserialize a node from its JSON representation. + */ + static fromJSON(schema, json2) { + if (!json2) + throw new RangeError("Invalid input for Node.fromJSON"); + let marks = null; + if (json2.marks) { + if (!Array.isArray(json2.marks)) + throw new RangeError("Invalid mark data for Node.fromJSON"); + marks = json2.marks.map(schema.markFromJSON); + } + if (json2.type == "text") { + if (typeof json2.text != "string") + throw new RangeError("Invalid text node in JSON"); + return schema.text(json2.text, marks); + } + let content = Fragment.fromJSON(schema, json2.content); + return schema.nodeType(json2.type).create(json2.attrs, content, marks); + } +}; +Node.prototype.text = void 0; +var TextNode = class _TextNode extends Node { + /** + @internal + */ + constructor(type, attrs, content, marks) { + super(type, attrs, null, marks); + if (!content) + throw new RangeError("Empty text nodes are not allowed"); + this.text = content; + } + toString() { + if (this.type.spec.toDebugString) + return this.type.spec.toDebugString(this); + return wrapMarks(this.marks, JSON.stringify(this.text)); + } + get textContent() { + return this.text; + } + textBetween(from2, to) { + return this.text.slice(from2, to); + } + get nodeSize() { + return this.text.length; + } + mark(marks) { + return marks == this.marks ? this : new _TextNode(this.type, this.attrs, this.text, marks); + } + withText(text) { + if (text == this.text) + return this; + return new _TextNode(this.type, this.attrs, text, this.marks); + } + cut(from2 = 0, to = this.text.length) { + if (from2 == 0 && to == this.text.length) + return this; + return this.withText(this.text.slice(from2, to)); + } + eq(other) { + return this.sameMarkup(other) && this.text == other.text; + } + toJSON() { + let base2 = super.toJSON(); + base2.text = this.text; + return base2; + } +}; +function wrapMarks(marks, str) { + for (let i = marks.length - 1; i >= 0; i--) + str = marks[i].type.name + "(" + str + ")"; + return str; +} +var ContentMatch = class _ContentMatch { + /** + @internal + */ + constructor(validEnd) { + this.validEnd = validEnd; + this.next = []; + this.wrapCache = []; + } + /** + @internal + */ + static parse(string, nodeTypes) { + let stream = new TokenStream(string, nodeTypes); + if (stream.next == null) + return _ContentMatch.empty; + let expr = parseExpr(stream); + if (stream.next) + stream.err("Unexpected trailing text"); + let match = dfa(nfa(expr)); + checkForDeadEnds(match, stream); + return match; + } + /** + Match a node type, returning a match after that node if + successful. + */ + matchType(type) { + for (let i = 0; i < this.next.length; i++) + if (this.next[i].type == type) + return this.next[i].next; + return null; + } + /** + Try to match a fragment. Returns the resulting match when + successful. + */ + matchFragment(frag, start2 = 0, end2 = frag.childCount) { + let cur = this; + for (let i = start2; cur && i < end2; i++) + cur = cur.matchType(frag.child(i).type); + return cur; + } + /** + @internal + */ + get inlineContent() { + return this.next.length != 0 && this.next[0].type.isInline; + } + /** + Get the first matching node type at this match position that can + be generated. + */ + get defaultType() { + for (let i = 0; i < this.next.length; i++) { + let { type } = this.next[i]; + if (!(type.isText || type.hasRequiredAttrs())) + return type; + } + return null; + } + /** + @internal + */ + compatible(other) { + for (let i = 0; i < this.next.length; i++) + for (let j = 0; j < other.next.length; j++) + if (this.next[i].type == other.next[j].type) + return true; + return false; + } + /** + Try to match the given fragment, and if that fails, see if it can + be made to match by inserting nodes in front of it. When + successful, return a fragment of inserted nodes (which may be + empty if nothing had to be inserted). When `toEnd` is true, only + return a fragment if the resulting match goes to the end of the + content expression. + */ + fillBefore(after, toEnd = false, startIndex = 0) { + let seen = [this]; + function search(match, types) { + let finished = match.matchFragment(after, startIndex); + if (finished && (!toEnd || finished.validEnd)) + return Fragment.from(types.map((tp) => tp.createAndFill())); + for (let i = 0; i < match.next.length; i++) { + let { type, next } = match.next[i]; + if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) { + seen.push(next); + let found2 = search(next, types.concat(type)); + if (found2) + return found2; + } + } + return null; + } + return search(this, []); + } + /** + Find a set of wrapping node types that would allow a node of the + given type to appear at this position. The result may be empty + (when it fits directly) and will be null when no such wrapping + exists. + */ + findWrapping(target) { + for (let i = 0; i < this.wrapCache.length; i += 2) + if (this.wrapCache[i] == target) + return this.wrapCache[i + 1]; + let computed = this.computeWrapping(target); + this.wrapCache.push(target, computed); + return computed; + } + /** + @internal + */ + computeWrapping(target) { + let seen = /* @__PURE__ */ Object.create(null), active = [{ match: this, type: null, via: null }]; + while (active.length) { + let current = active.shift(), match = current.match; + if (match.matchType(target)) { + let result = []; + for (let obj = current; obj.type; obj = obj.via) + result.push(obj.type); + return result.reverse(); + } + for (let i = 0; i < match.next.length; i++) { + let { type, next } = match.next[i]; + if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) { + active.push({ match: type.contentMatch, type, via: current }); + seen[type.name] = true; + } + } + } + return null; + } + /** + The number of outgoing edges this node has in the finite + automaton that describes the content expression. + */ + get edgeCount() { + return this.next.length; + } + /** + Get the _n_​th outgoing edge from this node in the finite + automaton that describes the content expression. + */ + edge(n) { + if (n >= this.next.length) + throw new RangeError(`There's no ${n}th edge in this content match`); + return this.next[n]; + } + /** + @internal + */ + toString() { + let seen = []; + function scan(m) { + seen.push(m); + for (let i = 0; i < m.next.length; i++) + if (seen.indexOf(m.next[i].next) == -1) + scan(m.next[i].next); + } + scan(this); + return seen.map((m, i) => { + let out = i + (m.validEnd ? "*" : " ") + " "; + for (let i2 = 0; i2 < m.next.length; i2++) + out += (i2 ? ", " : "") + m.next[i2].type.name + "->" + seen.indexOf(m.next[i2].next); + return out; + }).join("\n"); + } +}; +ContentMatch.empty = new ContentMatch(true); +var TokenStream = class { + constructor(string, nodeTypes) { + this.string = string; + this.nodeTypes = nodeTypes; + this.inline = null; + this.pos = 0; + this.tokens = string.split(/\s*(?=\b|\W|$)/); + if (this.tokens[this.tokens.length - 1] == "") + this.tokens.pop(); + if (this.tokens[0] == "") + this.tokens.shift(); + } + get next() { + return this.tokens[this.pos]; + } + eat(tok) { + return this.next == tok && (this.pos++ || true); + } + err(str) { + throw new SyntaxError(str + " (in content expression '" + this.string + "')"); + } +}; +function parseExpr(stream) { + let exprs = []; + do { + exprs.push(parseExprSeq(stream)); + } while (stream.eat("|")); + return exprs.length == 1 ? exprs[0] : { type: "choice", exprs }; +} +function parseExprSeq(stream) { + let exprs = []; + do { + exprs.push(parseExprSubscript(stream)); + } while (stream.next && stream.next != ")" && stream.next != "|"); + return exprs.length == 1 ? exprs[0] : { type: "seq", exprs }; +} +function parseExprSubscript(stream) { + let expr = parseExprAtom(stream); + for (; ; ) { + if (stream.eat("+")) + expr = { type: "plus", expr }; + else if (stream.eat("*")) + expr = { type: "star", expr }; + else if (stream.eat("?")) + expr = { type: "opt", expr }; + else if (stream.eat("{")) + expr = parseExprRange(stream, expr); + else + break; + } + return expr; +} +function parseNum(stream) { + if (/\D/.test(stream.next)) + stream.err("Expected number, got '" + stream.next + "'"); + let result = Number(stream.next); + stream.pos++; + return result; +} +function parseExprRange(stream, expr) { + let min2 = parseNum(stream), max2 = min2; + if (stream.eat(",")) { + if (stream.next != "}") + max2 = parseNum(stream); + else + max2 = -1; + } + if (!stream.eat("}")) + stream.err("Unclosed braced range"); + return { type: "range", min: min2, max: max2, expr }; +} +function resolveName(stream, name) { + let types = stream.nodeTypes, type = types[name]; + if (type) + return [type]; + let result = []; + for (let typeName in types) { + let type2 = types[typeName]; + if (type2.groups.indexOf(name) > -1) + result.push(type2); + } + if (result.length == 0) + stream.err("No node type or group '" + name + "' found"); + return result; +} +function parseExprAtom(stream) { + if (stream.eat("(")) { + let expr = parseExpr(stream); + if (!stream.eat(")")) + stream.err("Missing closing paren"); + return expr; + } else if (!/\W/.test(stream.next)) { + let exprs = resolveName(stream, stream.next).map((type) => { + if (stream.inline == null) + stream.inline = type.isInline; + else if (stream.inline != type.isInline) + stream.err("Mixing inline and block content"); + return { type: "name", value: type }; + }); + stream.pos++; + return exprs.length == 1 ? exprs[0] : { type: "choice", exprs }; + } else { + stream.err("Unexpected token '" + stream.next + "'"); + } +} +function nfa(expr) { + let nfa2 = [[]]; + connect(compile(expr, 0), node()); + return nfa2; + function node() { + return nfa2.push([]) - 1; + } + function edge(from2, to, term) { + let edge2 = { term, to }; + nfa2[from2].push(edge2); + return edge2; + } + function connect(edges, to) { + edges.forEach((edge2) => edge2.to = to); + } + function compile(expr2, from2) { + if (expr2.type == "choice") { + return expr2.exprs.reduce((out, expr3) => out.concat(compile(expr3, from2)), []); + } else if (expr2.type == "seq") { + for (let i = 0; ; i++) { + let next = compile(expr2.exprs[i], from2); + if (i == expr2.exprs.length - 1) + return next; + connect(next, from2 = node()); + } + } else if (expr2.type == "star") { + let loop = node(); + edge(from2, loop); + connect(compile(expr2.expr, loop), loop); + return [edge(loop)]; + } else if (expr2.type == "plus") { + let loop = node(); + connect(compile(expr2.expr, from2), loop); + connect(compile(expr2.expr, loop), loop); + return [edge(loop)]; + } else if (expr2.type == "opt") { + return [edge(from2)].concat(compile(expr2.expr, from2)); + } else if (expr2.type == "range") { + let cur = from2; + for (let i = 0; i < expr2.min; i++) { + let next = node(); + connect(compile(expr2.expr, cur), next); + cur = next; + } + if (expr2.max == -1) { + connect(compile(expr2.expr, cur), cur); + } else { + for (let i = expr2.min; i < expr2.max; i++) { + let next = node(); + edge(cur, next); + connect(compile(expr2.expr, cur), next); + cur = next; + } + } + return [edge(cur)]; + } else if (expr2.type == "name") { + return [edge(from2, void 0, expr2.value)]; + } else { + throw new Error("Unknown expr type"); + } + } +} +function cmp(a, b) { + return b - a; +} +function nullFrom(nfa2, node) { + let result = []; + scan(node); + return result.sort(cmp); + function scan(node2) { + let edges = nfa2[node2]; + if (edges.length == 1 && !edges[0].term) + return scan(edges[0].to); + result.push(node2); + for (let i = 0; i < edges.length; i++) { + let { term, to } = edges[i]; + if (!term && result.indexOf(to) == -1) + scan(to); + } + } +} +function dfa(nfa2) { + let labeled = /* @__PURE__ */ Object.create(null); + return explore(nullFrom(nfa2, 0)); + function explore(states) { + let out = []; + states.forEach((node) => { + nfa2[node].forEach(({ term, to }) => { + if (!term) + return; + let set; + for (let i = 0; i < out.length; i++) + if (out[i][0] == term) + set = out[i][1]; + nullFrom(nfa2, to).forEach((node2) => { + if (!set) + out.push([term, set = []]); + if (set.indexOf(node2) == -1) + set.push(node2); + }); + }); + }); + let state = labeled[states.join(",")] = new ContentMatch(states.indexOf(nfa2.length - 1) > -1); + for (let i = 0; i < out.length; i++) { + let states2 = out[i][1].sort(cmp); + state.next.push({ type: out[i][0], next: labeled[states2.join(",")] || explore(states2) }); + } + return state; + } +} +function checkForDeadEnds(match, stream) { + for (let i = 0, work = [match]; i < work.length; i++) { + let state = work[i], dead = !state.validEnd, nodes = []; + for (let j = 0; j < state.next.length; j++) { + let { type, next } = state.next[j]; + nodes.push(type.name); + if (dead && !(type.isText || type.hasRequiredAttrs())) + dead = false; + if (work.indexOf(next) == -1) + work.push(next); + } + if (dead) + stream.err("Only non-generatable nodes (" + nodes.join(", ") + ") in a required position (see https://prosemirror.net/docs/guide/#generatable)"); + } +} +function defaultAttrs(attrs) { + let defaults2 = /* @__PURE__ */ Object.create(null); + for (let attrName in attrs) { + let attr = attrs[attrName]; + if (!attr.hasDefault) + return null; + defaults2[attrName] = attr.default; + } + return defaults2; +} +function computeAttrs(attrs, value) { + let built = /* @__PURE__ */ Object.create(null); + for (let name in attrs) { + let given = value && value[name]; + if (given === void 0) { + let attr = attrs[name]; + if (attr.hasDefault) + given = attr.default; + else + throw new RangeError("No value supplied for attribute " + name); + } + built[name] = given; + } + return built; +} +function initAttrs(attrs) { + let result = /* @__PURE__ */ Object.create(null); + if (attrs) + for (let name in attrs) + result[name] = new Attribute(attrs[name]); + return result; +} +var NodeType = class _NodeType { + /** + @internal + */ + constructor(name, schema, spec) { + this.name = name; + this.schema = schema; + this.spec = spec; + this.markSet = null; + this.groups = spec.group ? spec.group.split(" ") : []; + this.attrs = initAttrs(spec.attrs); + this.defaultAttrs = defaultAttrs(this.attrs); + this.contentMatch = null; + this.inlineContent = null; + this.isBlock = !(spec.inline || name == "text"); + this.isText = name == "text"; + } + /** + True if this is an inline type. + */ + get isInline() { + return !this.isBlock; + } + /** + True if this is a textblock type, a block that contains inline + content. + */ + get isTextblock() { + return this.isBlock && this.inlineContent; + } + /** + True for node types that allow no content. + */ + get isLeaf() { + return this.contentMatch == ContentMatch.empty; + } + /** + True when this node is an atom, i.e. when it does not have + directly editable content. + */ + get isAtom() { + return this.isLeaf || !!this.spec.atom; + } + /** + The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option. + */ + get whitespace() { + return this.spec.whitespace || (this.spec.code ? "pre" : "normal"); + } + /** + Tells you whether this node type has any required attributes. + */ + hasRequiredAttrs() { + for (let n in this.attrs) + if (this.attrs[n].isRequired) + return true; + return false; + } + /** + Indicates whether this node allows some of the same content as + the given node type. + */ + compatibleContent(other) { + return this == other || this.contentMatch.compatible(other.contentMatch); + } + /** + @internal + */ + computeAttrs(attrs) { + if (!attrs && this.defaultAttrs) + return this.defaultAttrs; + else + return computeAttrs(this.attrs, attrs); + } + /** + Create a `Node` of this type. The given attributes are + checked and defaulted (you can pass `null` to use the type's + defaults entirely, if no required attributes exist). `content` + may be a `Fragment`, a node, an array of nodes, or + `null`. Similarly `marks` may be `null` to default to the empty + set of marks. + */ + create(attrs = null, content, marks) { + if (this.isText) + throw new Error("NodeType.create can't construct text nodes"); + return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks)); + } + /** + Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content + against the node type's content restrictions, and throw an error + if it doesn't match. + */ + createChecked(attrs = null, content, marks) { + content = Fragment.from(content); + this.checkContent(content); + return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks)); + } + /** + Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is + necessary to add nodes to the start or end of the given fragment + to make it fit the node. If no fitting wrapping can be found, + return null. Note that, due to the fact that required nodes can + always be created, this will always succeed if you pass null or + `Fragment.empty` as content. + */ + createAndFill(attrs = null, content, marks) { + attrs = this.computeAttrs(attrs); + content = Fragment.from(content); + if (content.size) { + let before = this.contentMatch.fillBefore(content); + if (!before) + return null; + content = before.append(content); + } + let matched = this.contentMatch.matchFragment(content); + let after = matched && matched.fillBefore(Fragment.empty, true); + if (!after) + return null; + return new Node(this, attrs, content.append(after), Mark.setFrom(marks)); + } + /** + Returns true if the given fragment is valid content for this node + type with the given attributes. + */ + validContent(content) { + let result = this.contentMatch.matchFragment(content); + if (!result || !result.validEnd) + return false; + for (let i = 0; i < content.childCount; i++) + if (!this.allowsMarks(content.child(i).marks)) + return false; + return true; + } + /** + Throws a RangeError if the given fragment is not valid content for this + node type. + @internal + */ + checkContent(content) { + if (!this.validContent(content)) + throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`); + } + /** + Check whether the given mark type is allowed in this node. + */ + allowsMarkType(markType) { + return this.markSet == null || this.markSet.indexOf(markType) > -1; + } + /** + Test whether the given set of marks are allowed in this node. + */ + allowsMarks(marks) { + if (this.markSet == null) + return true; + for (let i = 0; i < marks.length; i++) + if (!this.allowsMarkType(marks[i].type)) + return false; + return true; + } + /** + Removes the marks that are not allowed in this node from the given set. + */ + allowedMarks(marks) { + if (this.markSet == null) + return marks; + let copy2; + for (let i = 0; i < marks.length; i++) { + if (!this.allowsMarkType(marks[i].type)) { + if (!copy2) + copy2 = marks.slice(0, i); + } else if (copy2) { + copy2.push(marks[i]); + } + } + return !copy2 ? marks : copy2.length ? copy2 : Mark.none; + } + /** + @internal + */ + static compile(nodes, schema) { + let result = /* @__PURE__ */ Object.create(null); + nodes.forEach((name, spec) => result[name] = new _NodeType(name, schema, spec)); + let topType = schema.spec.topNode || "doc"; + if (!result[topType]) + throw new RangeError("Schema is missing its top node type ('" + topType + "')"); + if (!result.text) + throw new RangeError("Every schema needs a 'text' type"); + for (let _ in result.text.attrs) + throw new RangeError("The text node type should not have attributes"); + return result; + } +}; +var Attribute = class { + constructor(options) { + this.hasDefault = Object.prototype.hasOwnProperty.call(options, "default"); + this.default = options.default; + } + get isRequired() { + return !this.hasDefault; + } +}; +var MarkType = class _MarkType { + /** + @internal + */ + constructor(name, rank, schema, spec) { + this.name = name; + this.rank = rank; + this.schema = schema; + this.spec = spec; + this.attrs = initAttrs(spec.attrs); + this.excluded = null; + let defaults2 = defaultAttrs(this.attrs); + this.instance = defaults2 ? new Mark(this, defaults2) : null; + } + /** + Create a mark of this type. `attrs` may be `null` or an object + containing only some of the mark's attributes. The others, if + they have defaults, will be added. + */ + create(attrs = null) { + if (!attrs && this.instance) + return this.instance; + return new Mark(this, computeAttrs(this.attrs, attrs)); + } + /** + @internal + */ + static compile(marks, schema) { + let result = /* @__PURE__ */ Object.create(null), rank = 0; + marks.forEach((name, spec) => result[name] = new _MarkType(name, rank++, schema, spec)); + return result; + } + /** + When there is a mark of this type in the given set, a new set + without it is returned. Otherwise, the input set is returned. + */ + removeFromSet(set) { + for (var i = 0; i < set.length; i++) + if (set[i].type == this) { + set = set.slice(0, i).concat(set.slice(i + 1)); + i--; + } + return set; + } + /** + Tests whether there is a mark of this type in the given set. + */ + isInSet(set) { + for (let i = 0; i < set.length; i++) + if (set[i].type == this) + return set[i]; + } + /** + Queries whether a given mark type is + [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one. + */ + excludes(other) { + return this.excluded.indexOf(other) > -1; + } +}; +var Schema = class { + /** + Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec). + */ + constructor(spec) { + this.cached = /* @__PURE__ */ Object.create(null); + let instanceSpec = this.spec = {}; + for (let prop in spec) + instanceSpec[prop] = spec[prop]; + instanceSpec.nodes = dist_default.from(spec.nodes), instanceSpec.marks = dist_default.from(spec.marks || {}), this.nodes = NodeType.compile(this.spec.nodes, this); + this.marks = MarkType.compile(this.spec.marks, this); + let contentExprCache = /* @__PURE__ */ Object.create(null); + for (let prop in this.nodes) { + if (prop in this.marks) + throw new RangeError(prop + " can not be both a node and a mark"); + let type = this.nodes[prop], contentExpr = type.spec.content || "", markExpr = type.spec.marks; + type.contentMatch = contentExprCache[contentExpr] || (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes)); + type.inlineContent = type.contentMatch.inlineContent; + type.markSet = markExpr == "_" ? null : markExpr ? gatherMarks(this, markExpr.split(" ")) : markExpr == "" || !type.inlineContent ? [] : null; + } + for (let prop in this.marks) { + let type = this.marks[prop], excl = type.spec.excludes; + type.excluded = excl == null ? [type] : excl == "" ? [] : gatherMarks(this, excl.split(" ")); + } + this.nodeFromJSON = this.nodeFromJSON.bind(this); + this.markFromJSON = this.markFromJSON.bind(this); + this.topNodeType = this.nodes[this.spec.topNode || "doc"]; + this.cached.wrappings = /* @__PURE__ */ Object.create(null); + } + /** + Create a node in this schema. The `type` may be a string or a + `NodeType` instance. Attributes will be extended with defaults, + `content` may be a `Fragment`, `null`, a `Node`, or an array of + nodes. + */ + node(type, attrs = null, content, marks) { + if (typeof type == "string") + type = this.nodeType(type); + else if (!(type instanceof NodeType)) + throw new RangeError("Invalid node type: " + type); + else if (type.schema != this) + throw new RangeError("Node type from different schema used (" + type.name + ")"); + return type.createChecked(attrs, content, marks); + } + /** + Create a text node in the schema. Empty text nodes are not + allowed. + */ + text(text, marks) { + let type = this.nodes.text; + return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks)); + } + /** + Create a mark with the given type and attributes. + */ + mark(type, attrs) { + if (typeof type == "string") + type = this.marks[type]; + return type.create(attrs); + } + /** + Deserialize a node from its JSON representation. This method is + bound. + */ + nodeFromJSON(json2) { + return Node.fromJSON(this, json2); + } + /** + Deserialize a mark from its JSON representation. This method is + bound. + */ + markFromJSON(json2) { + return Mark.fromJSON(this, json2); + } + /** + @internal + */ + nodeType(name) { + let found2 = this.nodes[name]; + if (!found2) + throw new RangeError("Unknown node type: " + name); + return found2; + } +}; +function gatherMarks(schema, marks) { + let found2 = []; + for (let i = 0; i < marks.length; i++) { + let name = marks[i], mark = schema.marks[name], ok = mark; + if (mark) { + found2.push(mark); + } else { + for (let prop in schema.marks) { + let mark2 = schema.marks[prop]; + if (name == "_" || mark2.spec.group && mark2.spec.group.split(" ").indexOf(name) > -1) + found2.push(ok = mark2); + } + } + if (!ok) + throw new SyntaxError("Unknown mark type: '" + marks[i] + "'"); + } + return found2; +} +var DOMParser = class _DOMParser { + /** + Create a parser that targets the given schema, using the given + parsing rules. + */ + constructor(schema, rules) { + this.schema = schema; + this.rules = rules; + this.tags = []; + this.styles = []; + rules.forEach((rule) => { + if (rule.tag) + this.tags.push(rule); + else if (rule.style) + this.styles.push(rule); + }); + this.normalizeLists = !this.tags.some((r2) => { + if (!/^(ul|ol)\b/.test(r2.tag) || !r2.node) + return false; + let node = schema.nodes[r2.node]; + return node.contentMatch.matchType(node); + }); + } + /** + Parse a document from the content of a DOM node. + */ + parse(dom, options = {}) { + let context = new ParseContext(this, options, false); + context.addAll(dom, options.from, options.to); + return context.finish(); + } + /** + Parses the content of the given DOM node, like + [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of + options. But unlike that method, which produces a whole node, + this one returns a slice that is open at the sides, meaning that + the schema constraints aren't applied to the start of nodes to + the left of the input and the end of nodes at the end. + */ + parseSlice(dom, options = {}) { + let context = new ParseContext(this, options, true); + context.addAll(dom, options.from, options.to); + return Slice.maxOpen(context.finish()); + } + /** + @internal + */ + matchTag(dom, context, after) { + for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) { + let rule = this.tags[i]; + if (matches(dom, rule.tag) && (rule.namespace === void 0 || dom.namespaceURI == rule.namespace) && (!rule.context || context.matchesContext(rule.context))) { + if (rule.getAttrs) { + let result = rule.getAttrs(dom); + if (result === false) + continue; + rule.attrs = result || void 0; + } + return rule; + } + } + } + /** + @internal + */ + matchStyle(prop, value, context, after) { + for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) { + let rule = this.styles[i], style2 = rule.style; + if (style2.indexOf(prop) != 0 || rule.context && !context.matchesContext(rule.context) || // Test that the style string either precisely matches the prop, + // or has an '=' sign after the prop, followed by the given + // value. + style2.length > prop.length && (style2.charCodeAt(prop.length) != 61 || style2.slice(prop.length + 1) != value)) + continue; + if (rule.getAttrs) { + let result = rule.getAttrs(value); + if (result === false) + continue; + rule.attrs = result || void 0; + } + return rule; + } + } + /** + @internal + */ + static schemaRules(schema) { + let result = []; + function insert(rule) { + let priority = rule.priority == null ? 50 : rule.priority, i = 0; + for (; i < result.length; i++) { + let next = result[i], nextPriority = next.priority == null ? 50 : next.priority; + if (nextPriority < priority) + break; + } + result.splice(i, 0, rule); + } + for (let name in schema.marks) { + let rules = schema.marks[name].spec.parseDOM; + if (rules) + rules.forEach((rule) => { + insert(rule = copy(rule)); + if (!(rule.mark || rule.ignore || rule.clearMark)) + rule.mark = name; + }); + } + for (let name in schema.nodes) { + let rules = schema.nodes[name].spec.parseDOM; + if (rules) + rules.forEach((rule) => { + insert(rule = copy(rule)); + if (!(rule.node || rule.ignore || rule.mark)) + rule.node = name; + }); + } + return result; + } + /** + Construct a DOM parser using the parsing rules listed in a + schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by + [priority](https://prosemirror.net/docs/ref/#model.ParseRule.priority). + */ + static fromSchema(schema) { + return schema.cached.domParser || (schema.cached.domParser = new _DOMParser(schema, _DOMParser.schemaRules(schema))); + } +}; +var blockTags = { + address: true, + article: true, + aside: true, + blockquote: true, + canvas: true, + dd: true, + div: true, + dl: true, + fieldset: true, + figcaption: true, + figure: true, + footer: true, + form: true, + h1: true, + h2: true, + h3: true, + h4: true, + h5: true, + h6: true, + header: true, + hgroup: true, + hr: true, + li: true, + noscript: true, + ol: true, + output: true, + p: true, + pre: true, + section: true, + table: true, + tfoot: true, + ul: true +}; +var ignoreTags = { + head: true, + noscript: true, + object: true, + script: true, + style: true, + title: true +}; +var listTags = { ol: true, ul: true }; +var OPT_PRESERVE_WS = 1; +var OPT_PRESERVE_WS_FULL = 2; +var OPT_OPEN_LEFT = 4; +function wsOptionsFor(type, preserveWhitespace, base2) { + if (preserveWhitespace != null) + return (preserveWhitespace ? OPT_PRESERVE_WS : 0) | (preserveWhitespace === "full" ? OPT_PRESERVE_WS_FULL : 0); + return type && type.whitespace == "pre" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base2 & ~OPT_OPEN_LEFT; +} +var NodeContext = class { + constructor(type, attrs, marks, pendingMarks, solid, match, options) { + this.type = type; + this.attrs = attrs; + this.marks = marks; + this.pendingMarks = pendingMarks; + this.solid = solid; + this.options = options; + this.content = []; + this.activeMarks = Mark.none; + this.stashMarks = []; + this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch); + } + findWrapping(node) { + if (!this.match) { + if (!this.type) + return []; + let fill = this.type.contentMatch.fillBefore(Fragment.from(node)); + if (fill) { + this.match = this.type.contentMatch.matchFragment(fill); + } else { + let start2 = this.type.contentMatch, wrap2; + if (wrap2 = start2.findWrapping(node.type)) { + this.match = start2; + return wrap2; + } else { + return null; + } + } + } + return this.match.findWrapping(node.type); + } + finish(openEnd) { + if (!(this.options & OPT_PRESERVE_WS)) { + let last = this.content[this.content.length - 1], m; + if (last && last.isText && (m = /[ \t\r\n\u000c]+$/.exec(last.text))) { + let text = last; + if (last.text.length == m[0].length) + this.content.pop(); + else + this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length)); + } + } + let content = Fragment.from(this.content); + if (!openEnd && this.match) + content = content.append(this.match.fillBefore(Fragment.empty, true)); + return this.type ? this.type.create(this.attrs, content, this.marks) : content; + } + popFromStashMark(mark) { + for (let i = this.stashMarks.length - 1; i >= 0; i--) + if (mark.eq(this.stashMarks[i])) + return this.stashMarks.splice(i, 1)[0]; + } + applyPending(nextType) { + for (let i = 0, pending = this.pendingMarks; i < pending.length; i++) { + let mark = pending[i]; + if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) && !mark.isInSet(this.activeMarks)) { + this.activeMarks = mark.addToSet(this.activeMarks); + this.pendingMarks = mark.removeFromSet(this.pendingMarks); + } + } + } + inlineContext(node) { + if (this.type) + return this.type.inlineContent; + if (this.content.length) + return this.content[0].isInline; + return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase()); + } +}; +var ParseContext = class { + constructor(parser, options, isOpen) { + this.parser = parser; + this.options = options; + this.isOpen = isOpen; + this.open = 0; + let topNode = options.topNode, topContext; + let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0); + if (topNode) + topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions); + else if (isOpen) + topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions); + else + topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions); + this.nodes = [topContext]; + this.find = options.findPositions; + this.needsBlock = false; + } + get top() { + return this.nodes[this.open]; + } + // Add a DOM node to the content. Text is inserted as text node, + // otherwise, the node is passed to `addElement` or, if it has a + // `style` attribute, `addElementWithStyles`. + addDOM(dom) { + if (dom.nodeType == 3) + this.addTextNode(dom); + else if (dom.nodeType == 1) + this.addElement(dom); + } + withStyleRules(dom, f) { + let style2 = dom.getAttribute("style"); + if (!style2) + return f(); + let marks = this.readStyles(parseStyles(style2)); + if (!marks) + return; + let [addMarks, removeMarks] = marks, top2 = this.top; + for (let i = 0; i < removeMarks.length; i++) + this.removePendingMark(removeMarks[i], top2); + for (let i = 0; i < addMarks.length; i++) + this.addPendingMark(addMarks[i]); + f(); + for (let i = 0; i < addMarks.length; i++) + this.removePendingMark(addMarks[i], top2); + for (let i = 0; i < removeMarks.length; i++) + this.addPendingMark(removeMarks[i]); + } + addTextNode(dom) { + let value = dom.nodeValue; + let top2 = this.top; + if (top2.options & OPT_PRESERVE_WS_FULL || top2.inlineContext(dom) || /[^ \t\r\n\u000c]/.test(value)) { + if (!(top2.options & OPT_PRESERVE_WS)) { + value = value.replace(/[ \t\r\n\u000c]+/g, " "); + if (/^[ \t\r\n\u000c]/.test(value) && this.open == this.nodes.length - 1) { + let nodeBefore = top2.content[top2.content.length - 1]; + let domNodeBefore = dom.previousSibling; + if (!nodeBefore || domNodeBefore && domNodeBefore.nodeName == "BR" || nodeBefore.isText && /[ \t\r\n\u000c]$/.test(nodeBefore.text)) + value = value.slice(1); + } + } else if (!(top2.options & OPT_PRESERVE_WS_FULL)) { + value = value.replace(/\r?\n|\r/g, " "); + } else { + value = value.replace(/\r\n?/g, "\n"); + } + if (value) + this.insertNode(this.parser.schema.text(value)); + this.findInText(dom); + } else { + this.findInside(dom); + } + } + // Try to find a handler for the given tag and use that to parse. If + // none is found, the element's content nodes are added directly. + addElement(dom, matchAfter) { + let name = dom.nodeName.toLowerCase(), ruleID; + if (listTags.hasOwnProperty(name) && this.parser.normalizeLists) + normalizeList(dom); + let rule = this.options.ruleFromNode && this.options.ruleFromNode(dom) || (ruleID = this.parser.matchTag(dom, this, matchAfter)); + if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) { + this.findInside(dom); + this.ignoreFallback(dom); + } else if (!rule || rule.skip || rule.closeParent) { + if (rule && rule.closeParent) + this.open = Math.max(0, this.open - 1); + else if (rule && rule.skip.nodeType) + dom = rule.skip; + let sync, top2 = this.top, oldNeedsBlock = this.needsBlock; + if (blockTags.hasOwnProperty(name)) { + if (top2.content.length && top2.content[0].isInline && this.open) { + this.open--; + top2 = this.top; + } + sync = true; + if (!top2.type) + this.needsBlock = true; + } else if (!dom.firstChild) { + this.leafFallback(dom); + return; + } + if (rule && rule.skip) + this.addAll(dom); + else + this.withStyleRules(dom, () => this.addAll(dom)); + if (sync) + this.sync(top2); + this.needsBlock = oldNeedsBlock; + } else { + this.withStyleRules(dom, () => { + this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : void 0); + }); + } + } + // Called for leaf DOM nodes that would otherwise be ignored + leafFallback(dom) { + if (dom.nodeName == "BR" && this.top.type && this.top.type.inlineContent) + this.addTextNode(dom.ownerDocument.createTextNode("\n")); + } + // Called for ignored nodes + ignoreFallback(dom) { + if (dom.nodeName == "BR" && (!this.top.type || !this.top.type.inlineContent)) + this.findPlace(this.parser.schema.text("-")); + } + // Run any style parser associated with the node's styles. Either + // return an array of marks, or null to indicate some of the styles + // had a rule with `ignore` set. + readStyles(styles) { + let add = Mark.none, remove = Mark.none; + for (let i = 0; i < styles.length; i += 2) { + for (let after = void 0; ; ) { + let rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after); + if (!rule) + break; + if (rule.ignore) + return null; + if (rule.clearMark) { + this.top.pendingMarks.concat(this.top.activeMarks).forEach((m) => { + if (rule.clearMark(m)) + remove = m.addToSet(remove); + }); + } else { + add = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(add); + } + if (rule.consuming === false) + after = rule; + else + break; + } + } + return [add, remove]; + } + // Look up a handler for the given node. If none are found, return + // false. Otherwise, apply it, use its return value to drive the way + // the node's content is wrapped, and return true. + addElementByRule(dom, rule, continueAfter) { + let sync, nodeType, mark; + if (rule.node) { + nodeType = this.parser.schema.nodes[rule.node]; + if (!nodeType.isLeaf) { + sync = this.enter(nodeType, rule.attrs || null, rule.preserveWhitespace); + } else if (!this.insertNode(nodeType.create(rule.attrs))) { + this.leafFallback(dom); + } + } else { + let markType = this.parser.schema.marks[rule.mark]; + mark = markType.create(rule.attrs); + this.addPendingMark(mark); + } + let startIn = this.top; + if (nodeType && nodeType.isLeaf) { + this.findInside(dom); + } else if (continueAfter) { + this.addElement(dom, continueAfter); + } else if (rule.getContent) { + this.findInside(dom); + rule.getContent(dom, this.parser.schema).forEach((node) => this.insertNode(node)); + } else { + let contentDOM = dom; + if (typeof rule.contentElement == "string") + contentDOM = dom.querySelector(rule.contentElement); + else if (typeof rule.contentElement == "function") + contentDOM = rule.contentElement(dom); + else if (rule.contentElement) + contentDOM = rule.contentElement; + this.findAround(dom, contentDOM, true); + this.addAll(contentDOM); + } + if (sync && this.sync(startIn)) + this.open--; + if (mark) + this.removePendingMark(mark, startIn); + } + // Add all child nodes between `startIndex` and `endIndex` (or the + // whole node, if not given). If `sync` is passed, use it to + // synchronize after every block element. + addAll(parent, startIndex, endIndex) { + let index = startIndex || 0; + for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end2 = endIndex == null ? null : parent.childNodes[endIndex]; dom != end2; dom = dom.nextSibling, ++index) { + this.findAtPoint(parent, index); + this.addDOM(dom); + } + this.findAtPoint(parent, index); + } + // Try to find a way to fit the given node type into the current + // context. May add intermediate wrappers and/or leave non-solid + // nodes that we're in. + findPlace(node) { + let route, sync; + for (let depth = this.open; depth >= 0; depth--) { + let cx = this.nodes[depth]; + let found2 = cx.findWrapping(node); + if (found2 && (!route || route.length > found2.length)) { + route = found2; + sync = cx; + if (!found2.length) + break; + } + if (cx.solid) + break; + } + if (!route) + return false; + this.sync(sync); + for (let i = 0; i < route.length; i++) + this.enterInner(route[i], null, false); + return true; + } + // Try to insert the given node, adjusting the context when needed. + insertNode(node) { + if (node.isInline && this.needsBlock && !this.top.type) { + let block = this.textblockFromContext(); + if (block) + this.enterInner(block); + } + if (this.findPlace(node)) { + this.closeExtra(); + let top2 = this.top; + top2.applyPending(node.type); + if (top2.match) + top2.match = top2.match.matchType(node.type); + let marks = top2.activeMarks; + for (let i = 0; i < node.marks.length; i++) + if (!top2.type || top2.type.allowsMarkType(node.marks[i].type)) + marks = node.marks[i].addToSet(marks); + top2.content.push(node.mark(marks)); + return true; + } + return false; + } + // Try to start a node of the given type, adjusting the context when + // necessary. + enter(type, attrs, preserveWS) { + let ok = this.findPlace(type.create(attrs)); + if (ok) + this.enterInner(type, attrs, true, preserveWS); + return ok; + } + // Open a node of the given type + enterInner(type, attrs = null, solid = false, preserveWS) { + this.closeExtra(); + let top2 = this.top; + top2.applyPending(type); + top2.match = top2.match && top2.match.matchType(type); + let options = wsOptionsFor(type, preserveWS, top2.options); + if (top2.options & OPT_OPEN_LEFT && top2.content.length == 0) + options |= OPT_OPEN_LEFT; + this.nodes.push(new NodeContext(type, attrs, top2.activeMarks, top2.pendingMarks, solid, null, options)); + this.open++; + } + // Make sure all nodes above this.open are finished and added to + // their parents + closeExtra(openEnd = false) { + let i = this.nodes.length - 1; + if (i > this.open) { + for (; i > this.open; i--) + this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd)); + this.nodes.length = this.open + 1; + } + } + finish() { + this.open = 0; + this.closeExtra(this.isOpen); + return this.nodes[0].finish(this.isOpen || this.options.topOpen); + } + sync(to) { + for (let i = this.open; i >= 0; i--) + if (this.nodes[i] == to) { + this.open = i; + return true; + } + return false; + } + get currentPos() { + this.closeExtra(); + let pos = 0; + for (let i = this.open; i >= 0; i--) { + let content = this.nodes[i].content; + for (let j = content.length - 1; j >= 0; j--) + pos += content[j].nodeSize; + if (i) + pos++; + } + return pos; + } + findAtPoint(parent, offset2) { + if (this.find) + for (let i = 0; i < this.find.length; i++) { + if (this.find[i].node == parent && this.find[i].offset == offset2) + this.find[i].pos = this.currentPos; + } + } + findInside(parent) { + if (this.find) + for (let i = 0; i < this.find.length; i++) { + if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) + this.find[i].pos = this.currentPos; + } + } + findAround(parent, content, before) { + if (parent != content && this.find) + for (let i = 0; i < this.find.length; i++) { + if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) { + let pos = content.compareDocumentPosition(this.find[i].node); + if (pos & (before ? 2 : 4)) + this.find[i].pos = this.currentPos; + } + } + } + findInText(textNode) { + if (this.find) + for (let i = 0; i < this.find.length; i++) { + if (this.find[i].node == textNode) + this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset); + } + } + // Determines whether the given context string matches this context. + matchesContext(context) { + if (context.indexOf("|") > -1) + return context.split(/\s*\|\s*/).some(this.matchesContext, this); + let parts = context.split("/"); + let option = this.options.context; + let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type); + let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1); + let match = (i, depth) => { + for (; i >= 0; i--) { + let part = parts[i]; + if (part == "") { + if (i == parts.length - 1 || i == 0) + continue; + for (; depth >= minDepth; depth--) + if (match(i - 1, depth)) + return true; + return false; + } else { + let next = depth > 0 || depth == 0 && useRoot ? this.nodes[depth].type : option && depth >= minDepth ? option.node(depth - minDepth).type : null; + if (!next || next.name != part && next.groups.indexOf(part) == -1) + return false; + depth--; + } + } + return true; + }; + return match(parts.length - 1, this.open); + } + textblockFromContext() { + let $context = this.options.context; + if ($context) + for (let d = $context.depth; d >= 0; d--) { + let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType; + if (deflt && deflt.isTextblock && deflt.defaultAttrs) + return deflt; + } + for (let name in this.parser.schema.nodes) { + let type = this.parser.schema.nodes[name]; + if (type.isTextblock && type.defaultAttrs) + return type; + } + } + addPendingMark(mark) { + let found2 = findSameMarkInSet(mark, this.top.pendingMarks); + if (found2) + this.top.stashMarks.push(found2); + this.top.pendingMarks = mark.addToSet(this.top.pendingMarks); + } + removePendingMark(mark, upto) { + for (let depth = this.open; depth >= 0; depth--) { + let level = this.nodes[depth]; + let found2 = level.pendingMarks.lastIndexOf(mark); + if (found2 > -1) { + level.pendingMarks = mark.removeFromSet(level.pendingMarks); + } else { + level.activeMarks = mark.removeFromSet(level.activeMarks); + let stashMark = level.popFromStashMark(mark); + if (stashMark && level.type && level.type.allowsMarkType(stashMark.type)) + level.activeMarks = stashMark.addToSet(level.activeMarks); + } + if (level == upto) + break; + } + } +}; +function normalizeList(dom) { + for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) { + let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null; + if (name && listTags.hasOwnProperty(name) && prevItem) { + prevItem.appendChild(child); + child = prevItem; + } else if (name == "li") { + prevItem = child; + } else if (name) { + prevItem = null; + } + } +} +function matches(dom, selector) { + return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector); +} +function parseStyles(style2) { + let re = /\s*([\w-]+)\s*:\s*([^;]+)/g, m, result = []; + while (m = re.exec(style2)) + result.push(m[1], m[2].trim()); + return result; +} +function copy(obj) { + let copy2 = {}; + for (let prop in obj) + copy2[prop] = obj[prop]; + return copy2; +} +function markMayApply(markType, nodeType) { + let nodes = nodeType.schema.nodes; + for (let name in nodes) { + let parent = nodes[name]; + if (!parent.allowsMarkType(markType)) + continue; + let seen = [], scan = (match) => { + seen.push(match); + for (let i = 0; i < match.edgeCount; i++) { + let { type, next } = match.edge(i); + if (type == nodeType) + return true; + if (seen.indexOf(next) < 0 && scan(next)) + return true; + } + }; + if (scan(parent.contentMatch)) + return true; + } +} +function findSameMarkInSet(mark, set) { + for (let i = 0; i < set.length; i++) { + if (mark.eq(set[i])) + return set[i]; + } +} +var DOMSerializer = class _DOMSerializer { + /** + Create a serializer. `nodes` should map node names to functions + that take a node and return a description of the corresponding + DOM. `marks` does the same for mark names, but also gets an + argument that tells it whether the mark's content is block or + inline content (for typical use, it'll always be inline). A mark + serializer may be `null` to indicate that marks of that type + should not be serialized. + */ + constructor(nodes, marks) { + this.nodes = nodes; + this.marks = marks; + } + /** + Serialize the content of this fragment to a DOM fragment. When + not in the browser, the `document` option, containing a DOM + document, should be passed so that the serializer can create + nodes. + */ + serializeFragment(fragment, options = {}, target) { + if (!target) + target = doc(options).createDocumentFragment(); + let top2 = target, active = []; + fragment.forEach((node) => { + if (active.length || node.marks.length) { + let keep = 0, rendered = 0; + while (keep < active.length && rendered < node.marks.length) { + let next = node.marks[rendered]; + if (!this.marks[next.type.name]) { + rendered++; + continue; + } + if (!next.eq(active[keep][0]) || next.type.spec.spanning === false) + break; + keep++; + rendered++; + } + while (keep < active.length) + top2 = active.pop()[1]; + while (rendered < node.marks.length) { + let add = node.marks[rendered++]; + let markDOM = this.serializeMark(add, node.isInline, options); + if (markDOM) { + active.push([add, top2]); + top2.appendChild(markDOM.dom); + top2 = markDOM.contentDOM || markDOM.dom; + } + } + } + top2.appendChild(this.serializeNodeInner(node, options)); + }); + return target; + } + /** + @internal + */ + serializeNodeInner(node, options) { + let { dom, contentDOM } = _DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node)); + if (contentDOM) { + if (node.isLeaf) + throw new RangeError("Content hole not allowed in a leaf node spec"); + this.serializeFragment(node.content, options, contentDOM); + } + return dom; + } + /** + Serialize this node to a DOM node. This can be useful when you + need to serialize a part of a document, as opposed to the whole + document. To serialize a whole document, use + [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on + its [content](https://prosemirror.net/docs/ref/#model.Node.content). + */ + serializeNode(node, options = {}) { + let dom = this.serializeNodeInner(node, options); + for (let i = node.marks.length - 1; i >= 0; i--) { + let wrap2 = this.serializeMark(node.marks[i], node.isInline, options); + if (wrap2) { + (wrap2.contentDOM || wrap2.dom).appendChild(dom); + dom = wrap2.dom; + } + } + return dom; + } + /** + @internal + */ + serializeMark(mark, inline, options = {}) { + let toDOM = this.marks[mark.type.name]; + return toDOM && _DOMSerializer.renderSpec(doc(options), toDOM(mark, inline)); + } + /** + Render an [output spec](https://prosemirror.net/docs/ref/#model.DOMOutputSpec) to a DOM node. If + the spec has a hole (zero) in it, `contentDOM` will point at the + node with the hole. + */ + static renderSpec(doc3, structure, xmlNS = null) { + if (typeof structure == "string") + return { dom: doc3.createTextNode(structure) }; + if (structure.nodeType != null) + return { dom: structure }; + if (structure.dom && structure.dom.nodeType != null) + return structure; + let tagName = structure[0], space = tagName.indexOf(" "); + if (space > 0) { + xmlNS = tagName.slice(0, space); + tagName = tagName.slice(space + 1); + } + let contentDOM; + let dom = xmlNS ? doc3.createElementNS(xmlNS, tagName) : doc3.createElement(tagName); + let attrs = structure[1], start2 = 1; + if (attrs && typeof attrs == "object" && attrs.nodeType == null && !Array.isArray(attrs)) { + start2 = 2; + for (let name in attrs) + if (attrs[name] != null) { + let space2 = name.indexOf(" "); + if (space2 > 0) + dom.setAttributeNS(name.slice(0, space2), name.slice(space2 + 1), attrs[name]); + else + dom.setAttribute(name, attrs[name]); + } + } + for (let i = start2; i < structure.length; i++) { + let child = structure[i]; + if (child === 0) { + if (i < structure.length - 1 || i > start2) + throw new RangeError("Content hole must be the only child of its parent node"); + return { dom, contentDOM: dom }; + } else { + let { dom: inner, contentDOM: innerContent } = _DOMSerializer.renderSpec(doc3, child, xmlNS); + dom.appendChild(inner); + if (innerContent) { + if (contentDOM) + throw new RangeError("Multiple content holes"); + contentDOM = innerContent; + } + } + } + return { dom, contentDOM }; + } + /** + Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM) + properties in a schema's node and mark specs. + */ + static fromSchema(schema) { + return schema.cached.domSerializer || (schema.cached.domSerializer = new _DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema))); + } + /** + Gather the serializers in a schema's node specs into an object. + This can be useful as a base to build a custom serializer from. + */ + static nodesFromSchema(schema) { + let result = gatherToDOM(schema.nodes); + if (!result.text) + result.text = (node) => node.text; + return result; + } + /** + Gather the serializers in a schema's mark specs into an object. + */ + static marksFromSchema(schema) { + return gatherToDOM(schema.marks); + } +}; +function gatherToDOM(obj) { + let result = {}; + for (let name in obj) { + let toDOM = obj[name].spec.toDOM; + if (toDOM) + result[name] = toDOM; + } + return result; +} +function doc(options) { + return options.document || window.document; +} + +// node_modules/prosemirror-transform/dist/index.js +var lower16 = 65535; +var factor16 = Math.pow(2, 16); +function makeRecover(index, offset2) { + return index + offset2 * factor16; +} +function recoverIndex(value) { + return value & lower16; +} +function recoverOffset(value) { + return (value - (value & lower16)) / factor16; +} +var DEL_BEFORE = 1; +var DEL_AFTER = 2; +var DEL_ACROSS = 4; +var DEL_SIDE = 8; +var MapResult = class { + /** + @internal + */ + constructor(pos, delInfo, recover) { + this.pos = pos; + this.delInfo = delInfo; + this.recover = recover; + } + /** + Tells you whether the position was deleted, that is, whether the + step removed the token on the side queried (via the `assoc`) + argument from the document. + */ + get deleted() { + return (this.delInfo & DEL_SIDE) > 0; + } + /** + Tells you whether the token before the mapped position was deleted. + */ + get deletedBefore() { + return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; + } + /** + True when the token after the mapped position was deleted. + */ + get deletedAfter() { + return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; + } + /** + Tells whether any of the steps mapped through deletes across the + position (including both the token before and after the + position). + */ + get deletedAcross() { + return (this.delInfo & DEL_ACROSS) > 0; + } +}; +var StepMap = class _StepMap { + /** + Create a position map. The modifications to the document are + represented as an array of numbers, in which each group of three + represents a modified chunk as `[start, oldSize, newSize]`. + */ + constructor(ranges, inverted = false) { + this.ranges = ranges; + this.inverted = inverted; + if (!ranges.length && _StepMap.empty) + return _StepMap.empty; + } + /** + @internal + */ + recover(value) { + let diff2 = 0, index = recoverIndex(value); + if (!this.inverted) + for (let i = 0; i < index; i++) + diff2 += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1]; + return this.ranges[index * 3] + diff2 + recoverOffset(value); + } + mapResult(pos, assoc = 1) { + return this._map(pos, assoc, false); + } + map(pos, assoc = 1) { + return this._map(pos, assoc, true); + } + /** + @internal + */ + _map(pos, assoc, simple) { + let diff2 = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2; + for (let i = 0; i < this.ranges.length; i += 3) { + let start2 = this.ranges[i] - (this.inverted ? diff2 : 0); + if (start2 > pos) + break; + let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end2 = start2 + oldSize; + if (pos <= end2) { + let side = !oldSize ? assoc : pos == start2 ? -1 : pos == end2 ? 1 : assoc; + let result = start2 + diff2 + (side < 0 ? 0 : newSize); + if (simple) + return result; + let recover = pos == (assoc < 0 ? start2 : end2) ? null : makeRecover(i / 3, pos - start2); + let del2 = pos == start2 ? DEL_AFTER : pos == end2 ? DEL_BEFORE : DEL_ACROSS; + if (assoc < 0 ? pos != start2 : pos != end2) + del2 |= DEL_SIDE; + return new MapResult(result, del2, recover); + } + diff2 += newSize - oldSize; + } + return simple ? pos + diff2 : new MapResult(pos + diff2, 0, null); + } + /** + @internal + */ + touches(pos, recover) { + let diff2 = 0, index = recoverIndex(recover); + let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2; + for (let i = 0; i < this.ranges.length; i += 3) { + let start2 = this.ranges[i] - (this.inverted ? diff2 : 0); + if (start2 > pos) + break; + let oldSize = this.ranges[i + oldIndex], end2 = start2 + oldSize; + if (pos <= end2 && i == index * 3) + return true; + diff2 += this.ranges[i + newIndex] - oldSize; + } + return false; + } + /** + Calls the given function on each of the changed ranges included in + this map. + */ + forEach(f) { + let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2; + for (let i = 0, diff2 = 0; i < this.ranges.length; i += 3) { + let start2 = this.ranges[i], oldStart = start2 - (this.inverted ? diff2 : 0), newStart = start2 + (this.inverted ? 0 : diff2); + let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex]; + f(oldStart, oldStart + oldSize, newStart, newStart + newSize); + diff2 += newSize - oldSize; + } + } + /** + Create an inverted version of this map. The result can be used to + map positions in the post-step document to the pre-step document. + */ + invert() { + return new _StepMap(this.ranges, !this.inverted); + } + /** + @internal + */ + toString() { + return (this.inverted ? "-" : "") + JSON.stringify(this.ranges); + } + /** + Create a map that moves all positions by offset `n` (which may be + negative). This can be useful when applying steps meant for a + sub-document to a larger document, or vice-versa. + */ + static offset(n) { + return n == 0 ? _StepMap.empty : new _StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]); + } +}; +StepMap.empty = new StepMap([]); +var Mapping = class _Mapping { + /** + Create a new mapping with the given position maps. + */ + constructor(maps = [], mirror, from2 = 0, to = maps.length) { + this.maps = maps; + this.mirror = mirror; + this.from = from2; + this.to = to; + } + /** + Create a mapping that maps only through a part of this one. + */ + slice(from2 = 0, to = this.maps.length) { + return new _Mapping(this.maps, this.mirror, from2, to); + } + /** + @internal + */ + copy() { + return new _Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to); + } + /** + Add a step map to the end of this mapping. If `mirrors` is + given, it should be the index of the step map that is the mirror + image of this one. + */ + appendMap(map2, mirrors) { + this.to = this.maps.push(map2); + if (mirrors != null) + this.setMirror(this.maps.length - 1, mirrors); + } + /** + Add all the step maps in a given mapping to this one (preserving + mirroring information). + */ + appendMapping(mapping) { + for (let i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) { + let mirr = mapping.getMirror(i); + this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : void 0); + } + } + /** + Finds the offset of the step map that mirrors the map at the + given offset, in this mapping (as per the second argument to + `appendMap`). + */ + getMirror(n) { + if (this.mirror) { + for (let i = 0; i < this.mirror.length; i++) + if (this.mirror[i] == n) + return this.mirror[i + (i % 2 ? -1 : 1)]; + } + } + /** + @internal + */ + setMirror(n, m) { + if (!this.mirror) + this.mirror = []; + this.mirror.push(n, m); + } + /** + Append the inverse of the given mapping to this one. + */ + appendMappingInverted(mapping) { + for (let i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) { + let mirr = mapping.getMirror(i); + this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : void 0); + } + } + /** + Create an inverted version of this mapping. + */ + invert() { + let inverse = new _Mapping(); + inverse.appendMappingInverted(this); + return inverse; + } + /** + Map a position through this mapping. + */ + map(pos, assoc = 1) { + if (this.mirror) + return this._map(pos, assoc, true); + for (let i = this.from; i < this.to; i++) + pos = this.maps[i].map(pos, assoc); + return pos; + } + /** + Map a position through this mapping, returning a mapping + result. + */ + mapResult(pos, assoc = 1) { + return this._map(pos, assoc, false); + } + /** + @internal + */ + _map(pos, assoc, simple) { + let delInfo = 0; + for (let i = this.from; i < this.to; i++) { + let map2 = this.maps[i], result = map2.mapResult(pos, assoc); + if (result.recover != null) { + let corr = this.getMirror(i); + if (corr != null && corr > i && corr < this.to) { + i = corr; + pos = this.maps[corr].recover(result.recover); + continue; + } + } + delInfo |= result.delInfo; + pos = result.pos; + } + return simple ? pos : new MapResult(pos, delInfo, null); + } +}; +var stepsByID = /* @__PURE__ */ Object.create(null); +var Step = class { + /** + Get the step map that represents the changes made by this step, + and which can be used to transform between positions in the old + and the new document. + */ + getMap() { + return StepMap.empty; + } + /** + Try to merge this step with another one, to be applied directly + after it. Returns the merged step when possible, null if the + steps can't be merged. + */ + merge(other) { + return null; + } + /** + Deserialize a step from its JSON representation. Will call + through to the step class' own implementation of this method. + */ + static fromJSON(schema, json2) { + if (!json2 || !json2.stepType) + throw new RangeError("Invalid input for Step.fromJSON"); + let type = stepsByID[json2.stepType]; + if (!type) + throw new RangeError(`No step type ${json2.stepType} defined`); + return type.fromJSON(schema, json2); + } + /** + To be able to serialize steps to JSON, each step needs a string + ID to attach to its JSON representation. Use this method to + register an ID for your step classes. Try to pick something + that's unlikely to clash with steps from other modules. + */ + static jsonID(id, stepClass) { + if (id in stepsByID) + throw new RangeError("Duplicate use of step JSON ID " + id); + stepsByID[id] = stepClass; + stepClass.prototype.jsonID = id; + return stepClass; + } +}; +var StepResult = class _StepResult { + /** + @internal + */ + constructor(doc3, failed) { + this.doc = doc3; + this.failed = failed; + } + /** + Create a successful step result. + */ + static ok(doc3) { + return new _StepResult(doc3, null); + } + /** + Create a failed step result. + */ + static fail(message) { + return new _StepResult(null, message); + } + /** + Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given + arguments. Create a successful result if it succeeds, and a + failed one if it throws a `ReplaceError`. + */ + static fromReplace(doc3, from2, to, slice2) { + try { + return _StepResult.ok(doc3.replace(from2, to, slice2)); + } catch (e) { + if (e instanceof ReplaceError) + return _StepResult.fail(e.message); + throw e; + } + } +}; +function mapFragment(fragment, f, parent) { + let mapped = []; + for (let i = 0; i < fragment.childCount; i++) { + let child = fragment.child(i); + if (child.content.size) + child = child.copy(mapFragment(child.content, f, child)); + if (child.isInline) + child = f(child, parent, i); + mapped.push(child); + } + return Fragment.fromArray(mapped); +} +var AddMarkStep = class _AddMarkStep extends Step { + /** + Create a mark step. + */ + constructor(from2, to, mark) { + super(); + this.from = from2; + this.to = to; + this.mark = mark; + } + apply(doc3) { + let oldSlice = doc3.slice(this.from, this.to), $from = doc3.resolve(this.from); + let parent = $from.node($from.sharedDepth(this.to)); + let slice2 = new Slice(mapFragment(oldSlice.content, (node, parent2) => { + if (!node.isAtom || !parent2.type.allowsMarkType(this.mark.type)) + return node; + return node.mark(this.mark.addToSet(node.marks)); + }, parent), oldSlice.openStart, oldSlice.openEnd); + return StepResult.fromReplace(doc3, this.from, this.to, slice2); + } + invert() { + return new RemoveMarkStep(this.from, this.to, this.mark); + } + map(mapping) { + let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); + if (from2.deleted && to.deleted || from2.pos >= to.pos) + return null; + return new _AddMarkStep(from2.pos, to.pos, this.mark); + } + merge(other) { + if (other instanceof _AddMarkStep && other.mark.eq(this.mark) && this.from <= other.to && this.to >= other.from) + return new _AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark); + return null; + } + toJSON() { + return { + stepType: "addMark", + mark: this.mark.toJSON(), + from: this.from, + to: this.to + }; + } + /** + @internal + */ + static fromJSON(schema, json2) { + if (typeof json2.from != "number" || typeof json2.to != "number") + throw new RangeError("Invalid input for AddMarkStep.fromJSON"); + return new _AddMarkStep(json2.from, json2.to, schema.markFromJSON(json2.mark)); + } +}; +Step.jsonID("addMark", AddMarkStep); +var RemoveMarkStep = class _RemoveMarkStep extends Step { + /** + Create a mark-removing step. + */ + constructor(from2, to, mark) { + super(); + this.from = from2; + this.to = to; + this.mark = mark; + } + apply(doc3) { + let oldSlice = doc3.slice(this.from, this.to); + let slice2 = new Slice(mapFragment(oldSlice.content, (node) => { + return node.mark(this.mark.removeFromSet(node.marks)); + }, doc3), oldSlice.openStart, oldSlice.openEnd); + return StepResult.fromReplace(doc3, this.from, this.to, slice2); + } + invert() { + return new AddMarkStep(this.from, this.to, this.mark); + } + map(mapping) { + let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); + if (from2.deleted && to.deleted || from2.pos >= to.pos) + return null; + return new _RemoveMarkStep(from2.pos, to.pos, this.mark); + } + merge(other) { + if (other instanceof _RemoveMarkStep && other.mark.eq(this.mark) && this.from <= other.to && this.to >= other.from) + return new _RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark); + return null; + } + toJSON() { + return { + stepType: "removeMark", + mark: this.mark.toJSON(), + from: this.from, + to: this.to + }; + } + /** + @internal + */ + static fromJSON(schema, json2) { + if (typeof json2.from != "number" || typeof json2.to != "number") + throw new RangeError("Invalid input for RemoveMarkStep.fromJSON"); + return new _RemoveMarkStep(json2.from, json2.to, schema.markFromJSON(json2.mark)); + } +}; +Step.jsonID("removeMark", RemoveMarkStep); +var AddNodeMarkStep = class _AddNodeMarkStep extends Step { + /** + Create a node mark step. + */ + constructor(pos, mark) { + super(); + this.pos = pos; + this.mark = mark; + } + apply(doc3) { + let node = doc3.nodeAt(this.pos); + if (!node) + return StepResult.fail("No node at mark step's position"); + let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks)); + return StepResult.fromReplace(doc3, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1)); + } + invert(doc3) { + let node = doc3.nodeAt(this.pos); + if (node) { + let newSet = this.mark.addToSet(node.marks); + if (newSet.length == node.marks.length) { + for (let i = 0; i < node.marks.length; i++) + if (!node.marks[i].isInSet(newSet)) + return new _AddNodeMarkStep(this.pos, node.marks[i]); + return new _AddNodeMarkStep(this.pos, this.mark); + } + } + return new RemoveNodeMarkStep(this.pos, this.mark); + } + map(mapping) { + let pos = mapping.mapResult(this.pos, 1); + return pos.deletedAfter ? null : new _AddNodeMarkStep(pos.pos, this.mark); + } + toJSON() { + return { stepType: "addNodeMark", pos: this.pos, mark: this.mark.toJSON() }; + } + /** + @internal + */ + static fromJSON(schema, json2) { + if (typeof json2.pos != "number") + throw new RangeError("Invalid input for AddNodeMarkStep.fromJSON"); + return new _AddNodeMarkStep(json2.pos, schema.markFromJSON(json2.mark)); + } +}; +Step.jsonID("addNodeMark", AddNodeMarkStep); +var RemoveNodeMarkStep = class _RemoveNodeMarkStep extends Step { + /** + Create a mark-removing step. + */ + constructor(pos, mark) { + super(); + this.pos = pos; + this.mark = mark; + } + apply(doc3) { + let node = doc3.nodeAt(this.pos); + if (!node) + return StepResult.fail("No node at mark step's position"); + let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks)); + return StepResult.fromReplace(doc3, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1)); + } + invert(doc3) { + let node = doc3.nodeAt(this.pos); + if (!node || !this.mark.isInSet(node.marks)) + return this; + return new AddNodeMarkStep(this.pos, this.mark); + } + map(mapping) { + let pos = mapping.mapResult(this.pos, 1); + return pos.deletedAfter ? null : new _RemoveNodeMarkStep(pos.pos, this.mark); + } + toJSON() { + return { stepType: "removeNodeMark", pos: this.pos, mark: this.mark.toJSON() }; + } + /** + @internal + */ + static fromJSON(schema, json2) { + if (typeof json2.pos != "number") + throw new RangeError("Invalid input for RemoveNodeMarkStep.fromJSON"); + return new _RemoveNodeMarkStep(json2.pos, schema.markFromJSON(json2.mark)); + } +}; +Step.jsonID("removeNodeMark", RemoveNodeMarkStep); +var ReplaceStep = class _ReplaceStep extends Step { + /** + The given `slice` should fit the 'gap' between `from` and + `to`—the depths must line up, and the surrounding nodes must be + able to be joined with the open sides of the slice. When + `structure` is true, the step will fail if the content between + from and to is not just a sequence of closing and then opening + tokens (this is to guard against rebased replace steps + overwriting something they weren't supposed to). + */ + constructor(from2, to, slice2, structure = false) { + super(); + this.from = from2; + this.to = to; + this.slice = slice2; + this.structure = structure; + } + apply(doc3) { + if (this.structure && contentBetween(doc3, this.from, this.to)) + return StepResult.fail("Structure replace would overwrite content"); + return StepResult.fromReplace(doc3, this.from, this.to, this.slice); + } + getMap() { + return new StepMap([this.from, this.to - this.from, this.slice.size]); + } + invert(doc3) { + return new _ReplaceStep(this.from, this.from + this.slice.size, doc3.slice(this.from, this.to)); + } + map(mapping) { + let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); + if (from2.deletedAcross && to.deletedAcross) + return null; + return new _ReplaceStep(from2.pos, Math.max(from2.pos, to.pos), this.slice); + } + merge(other) { + if (!(other instanceof _ReplaceStep) || other.structure || this.structure) + return null; + if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) { + let slice2 = this.slice.size + other.slice.size == 0 ? Slice.empty : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd); + return new _ReplaceStep(this.from, this.to + (other.to - other.from), slice2, this.structure); + } else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) { + let slice2 = this.slice.size + other.slice.size == 0 ? Slice.empty : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd); + return new _ReplaceStep(other.from, this.to, slice2, this.structure); + } else { + return null; + } + } + toJSON() { + let json2 = { stepType: "replace", from: this.from, to: this.to }; + if (this.slice.size) + json2.slice = this.slice.toJSON(); + if (this.structure) + json2.structure = true; + return json2; + } + /** + @internal + */ + static fromJSON(schema, json2) { + if (typeof json2.from != "number" || typeof json2.to != "number") + throw new RangeError("Invalid input for ReplaceStep.fromJSON"); + return new _ReplaceStep(json2.from, json2.to, Slice.fromJSON(schema, json2.slice), !!json2.structure); + } +}; +Step.jsonID("replace", ReplaceStep); +var ReplaceAroundStep = class _ReplaceAroundStep extends Step { + /** + Create a replace-around step with the given range and gap. + `insert` should be the point in the slice into which the content + of the gap should be moved. `structure` has the same meaning as + it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class. + */ + constructor(from2, to, gapFrom, gapTo, slice2, insert, structure = false) { + super(); + this.from = from2; + this.to = to; + this.gapFrom = gapFrom; + this.gapTo = gapTo; + this.slice = slice2; + this.insert = insert; + this.structure = structure; + } + apply(doc3) { + if (this.structure && (contentBetween(doc3, this.from, this.gapFrom) || contentBetween(doc3, this.gapTo, this.to))) + return StepResult.fail("Structure gap-replace would overwrite content"); + let gap = doc3.slice(this.gapFrom, this.gapTo); + if (gap.openStart || gap.openEnd) + return StepResult.fail("Gap is not a flat range"); + let inserted = this.slice.insertAt(this.insert, gap.content); + if (!inserted) + return StepResult.fail("Content does not fit in gap"); + return StepResult.fromReplace(doc3, this.from, this.to, inserted); + } + getMap() { + return new StepMap([ + this.from, + this.gapFrom - this.from, + this.insert, + this.gapTo, + this.to - this.gapTo, + this.slice.size - this.insert + ]); + } + invert(doc3) { + let gap = this.gapTo - this.gapFrom; + return new _ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc3.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure); + } + map(mapping) { + let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); + let gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1); + if (from2.deletedAcross && to.deletedAcross || gapFrom < from2.pos || gapTo > to.pos) + return null; + return new _ReplaceAroundStep(from2.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure); + } + toJSON() { + let json2 = { + stepType: "replaceAround", + from: this.from, + to: this.to, + gapFrom: this.gapFrom, + gapTo: this.gapTo, + insert: this.insert + }; + if (this.slice.size) + json2.slice = this.slice.toJSON(); + if (this.structure) + json2.structure = true; + return json2; + } + /** + @internal + */ + static fromJSON(schema, json2) { + if (typeof json2.from != "number" || typeof json2.to != "number" || typeof json2.gapFrom != "number" || typeof json2.gapTo != "number" || typeof json2.insert != "number") + throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON"); + return new _ReplaceAroundStep(json2.from, json2.to, json2.gapFrom, json2.gapTo, Slice.fromJSON(schema, json2.slice), json2.insert, !!json2.structure); + } +}; +Step.jsonID("replaceAround", ReplaceAroundStep); +function contentBetween(doc3, from2, to) { + let $from = doc3.resolve(from2), dist = to - from2, depth = $from.depth; + while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) { + depth--; + dist--; + } + if (dist > 0) { + let next = $from.node(depth).maybeChild($from.indexAfter(depth)); + while (dist > 0) { + if (!next || next.isLeaf) + return true; + next = next.firstChild; + dist--; + } + } + return false; +} +function addMark(tr2, from2, to, mark) { + let removed = [], added = []; + let removing, adding; + tr2.doc.nodesBetween(from2, to, (node, pos, parent) => { + if (!node.isInline) + return; + let marks = node.marks; + if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) { + let start2 = Math.max(pos, from2), end2 = Math.min(pos + node.nodeSize, to); + let newSet = mark.addToSet(marks); + for (let i = 0; i < marks.length; i++) { + if (!marks[i].isInSet(newSet)) { + if (removing && removing.to == start2 && removing.mark.eq(marks[i])) + removing.to = end2; + else + removed.push(removing = new RemoveMarkStep(start2, end2, marks[i])); + } + } + if (adding && adding.to == start2) + adding.to = end2; + else + added.push(adding = new AddMarkStep(start2, end2, mark)); + } + }); + removed.forEach((s) => tr2.step(s)); + added.forEach((s) => tr2.step(s)); +} +function removeMark(tr2, from2, to, mark) { + let matched = [], step = 0; + tr2.doc.nodesBetween(from2, to, (node, pos) => { + if (!node.isInline) + return; + step++; + let toRemove = null; + if (mark instanceof MarkType) { + let set = node.marks, found2; + while (found2 = mark.isInSet(set)) { + (toRemove || (toRemove = [])).push(found2); + set = found2.removeFromSet(set); + } + } else if (mark) { + if (mark.isInSet(node.marks)) + toRemove = [mark]; + } else { + toRemove = node.marks; + } + if (toRemove && toRemove.length) { + let end2 = Math.min(pos + node.nodeSize, to); + for (let i = 0; i < toRemove.length; i++) { + let style2 = toRemove[i], found2; + for (let j = 0; j < matched.length; j++) { + let m = matched[j]; + if (m.step == step - 1 && style2.eq(matched[j].style)) + found2 = m; + } + if (found2) { + found2.to = end2; + found2.step = step; + } else { + matched.push({ style: style2, from: Math.max(pos, from2), to: end2, step }); + } + } + } + }); + matched.forEach((m) => tr2.step(new RemoveMarkStep(m.from, m.to, m.style))); +} +function clearIncompatible(tr2, pos, parentType, match = parentType.contentMatch) { + let node = tr2.doc.nodeAt(pos); + let replSteps = [], cur = pos + 1; + for (let i = 0; i < node.childCount; i++) { + let child = node.child(i), end2 = cur + child.nodeSize; + let allowed = match.matchType(child.type); + if (!allowed) { + replSteps.push(new ReplaceStep(cur, end2, Slice.empty)); + } else { + match = allowed; + for (let j = 0; j < child.marks.length; j++) + if (!parentType.allowsMarkType(child.marks[j].type)) + tr2.step(new RemoveMarkStep(cur, end2, child.marks[j])); + if (child.isText && !parentType.spec.code) { + let m, newline = /\r?\n|\r/g, slice2; + while (m = newline.exec(child.text)) { + if (!slice2) + slice2 = new Slice(Fragment.from(parentType.schema.text(" ", parentType.allowedMarks(child.marks))), 0, 0); + replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice2)); + } + } + } + cur = end2; + } + if (!match.validEnd) { + let fill = match.fillBefore(Fragment.empty, true); + tr2.replace(cur, cur, new Slice(fill, 0, 0)); + } + for (let i = replSteps.length - 1; i >= 0; i--) + tr2.step(replSteps[i]); +} +function canCut(node, start2, end2) { + return (start2 == 0 || node.canReplace(start2, node.childCount)) && (end2 == node.childCount || node.canReplace(0, end2)); +} +function liftTarget(range) { + let parent = range.parent; + let content = parent.content.cutByIndex(range.startIndex, range.endIndex); + for (let depth = range.depth; ; --depth) { + let node = range.$from.node(depth); + let index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth); + if (depth < range.depth && node.canReplace(index, endIndex, content)) + return depth; + if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex)) + break; + } + return null; +} +function lift(tr2, range, target) { + let { $from, $to, depth } = range; + let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1); + let start2 = gapStart, end2 = gapEnd; + let before = Fragment.empty, openStart = 0; + for (let d = depth, splitting = false; d > target; d--) + if (splitting || $from.index(d) > 0) { + splitting = true; + before = Fragment.from($from.node(d).copy(before)); + openStart++; + } else { + start2--; + } + let after = Fragment.empty, openEnd = 0; + for (let d = depth, splitting = false; d > target; d--) + if (splitting || $to.after(d + 1) < $to.end(d)) { + splitting = true; + after = Fragment.from($to.node(d).copy(after)); + openEnd++; + } else { + end2++; + } + tr2.step(new ReplaceAroundStep(start2, end2, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true)); +} +function findWrapping(range, nodeType, attrs = null, innerRange = range) { + let around = findWrappingOutside(range, nodeType); + let inner = around && findWrappingInside(innerRange, nodeType); + if (!inner) + return null; + return around.map(withAttrs).concat({ type: nodeType, attrs }).concat(inner.map(withAttrs)); +} +function withAttrs(type) { + return { type, attrs: null }; +} +function findWrappingOutside(range, type) { + let { parent, startIndex, endIndex } = range; + let around = parent.contentMatchAt(startIndex).findWrapping(type); + if (!around) + return null; + let outer = around.length ? around[0] : type; + return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null; +} +function findWrappingInside(range, type) { + let { parent, startIndex, endIndex } = range; + let inner = parent.child(startIndex); + let inside = type.contentMatch.findWrapping(inner.type); + if (!inside) + return null; + let lastType = inside.length ? inside[inside.length - 1] : type; + let innerMatch = lastType.contentMatch; + for (let i = startIndex; innerMatch && i < endIndex; i++) + innerMatch = innerMatch.matchType(parent.child(i).type); + if (!innerMatch || !innerMatch.validEnd) + return null; + return inside; +} +function wrap(tr2, range, wrappers) { + let content = Fragment.empty; + for (let i = wrappers.length - 1; i >= 0; i--) { + if (content.size) { + let match = wrappers[i].type.contentMatch.matchFragment(content); + if (!match || !match.validEnd) + throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper"); + } + content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); + } + let start2 = range.start, end2 = range.end; + tr2.step(new ReplaceAroundStep(start2, end2, start2, end2, new Slice(content, 0, 0), wrappers.length, true)); +} +function setBlockType(tr2, from2, to, type, attrs) { + if (!type.isTextblock) + throw new RangeError("Type given to setBlockType should be a textblock"); + let mapFrom = tr2.steps.length; + tr2.doc.nodesBetween(from2, to, (node, pos) => { + if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(tr2.doc, tr2.mapping.slice(mapFrom).map(pos), type)) { + tr2.clearIncompatible(tr2.mapping.slice(mapFrom).map(pos, 1), type); + let mapping = tr2.mapping.slice(mapFrom); + let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1); + tr2.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true)); + return false; + } + }); +} +function canChangeType(doc3, pos, type) { + let $pos = doc3.resolve(pos), index = $pos.index(); + return $pos.parent.canReplaceWith(index, index + 1, type); +} +function setNodeMarkup(tr2, pos, type, attrs, marks) { + let node = tr2.doc.nodeAt(pos); + if (!node) + throw new RangeError("No node at given position"); + if (!type) + type = node.type; + let newNode2 = type.create(attrs, null, marks || node.marks); + if (node.isLeaf) + return tr2.replaceWith(pos, pos + node.nodeSize, newNode2); + if (!type.validContent(node.content)) + throw new RangeError("Invalid content for node type " + type.name); + tr2.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode2), 0, 0), 1, true)); +} +function canSplit(doc3, pos, depth = 1, typesAfter) { + let $pos = doc3.resolve(pos), base2 = $pos.depth - depth; + let innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent; + if (base2 < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) + return false; + for (let d = $pos.depth - 1, i = depth - 2; d > base2; d--, i--) { + let node = $pos.node(d), index2 = $pos.index(d); + if (node.type.spec.isolating) + return false; + let rest = node.content.cutByIndex(index2, node.childCount); + let overrideChild = typesAfter && typesAfter[i + 1]; + if (overrideChild) + rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs)); + let after = typesAfter && typesAfter[i] || node; + if (!node.canReplace(index2 + 1, node.childCount) || !after.type.validContent(rest)) + return false; + } + let index = $pos.indexAfter(base2); + let baseType = typesAfter && typesAfter[0]; + return $pos.node(base2).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base2 + 1).type); +} +function split(tr2, pos, depth = 1, typesAfter) { + let $pos = tr2.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty; + for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) { + before = Fragment.from($pos.node(d).copy(before)); + let typeAfter = typesAfter && typesAfter[i]; + after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after)); + } + tr2.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true)); +} +function canJoin(doc3, pos) { + let $pos = doc3.resolve(pos), index = $pos.index(); + return joinable2($pos.nodeBefore, $pos.nodeAfter) && $pos.parent.canReplace(index, index + 1); +} +function joinable2(a, b) { + return !!(a && b && !a.isLeaf && a.canAppend(b)); +} +function joinPoint(doc3, pos, dir = -1) { + let $pos = doc3.resolve(pos); + for (let d = $pos.depth; ; d--) { + let before, after, index = $pos.index(d); + if (d == $pos.depth) { + before = $pos.nodeBefore; + after = $pos.nodeAfter; + } else if (dir > 0) { + before = $pos.node(d + 1); + index++; + after = $pos.node(d).maybeChild(index); + } else { + before = $pos.node(d).maybeChild(index - 1); + after = $pos.node(d + 1); + } + if (before && !before.isTextblock && joinable2(before, after) && $pos.node(d).canReplace(index, index + 1)) + return pos; + if (d == 0) + break; + pos = dir < 0 ? $pos.before(d) : $pos.after(d); + } +} +function join(tr2, pos, depth) { + let step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true); + tr2.step(step); +} +function insertPoint(doc3, pos, nodeType) { + let $pos = doc3.resolve(pos); + if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType)) + return pos; + if ($pos.parentOffset == 0) + for (let d = $pos.depth - 1; d >= 0; d--) { + let index = $pos.index(d); + if ($pos.node(d).canReplaceWith(index, index, nodeType)) + return $pos.before(d + 1); + if (index > 0) + return null; + } + if ($pos.parentOffset == $pos.parent.content.size) + for (let d = $pos.depth - 1; d >= 0; d--) { + let index = $pos.indexAfter(d); + if ($pos.node(d).canReplaceWith(index, index, nodeType)) + return $pos.after(d + 1); + if (index < $pos.node(d).childCount) + return null; + } + return null; +} +function dropPoint(doc3, pos, slice2) { + let $pos = doc3.resolve(pos); + if (!slice2.content.size) + return pos; + let content = slice2.content; + for (let i = 0; i < slice2.openStart; i++) + content = content.firstChild.content; + for (let pass = 1; pass <= (slice2.openStart == 0 && slice2.size ? 2 : 1); pass++) { + for (let d = $pos.depth; d >= 0; d--) { + let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1; + let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0); + let parent = $pos.node(d), fits = false; + if (pass == 1) { + fits = parent.canReplace(insertPos, insertPos, content); + } else { + let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type); + fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]); + } + if (fits) + return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1); + } + } + return null; +} +function replaceStep(doc3, from2, to = from2, slice2 = Slice.empty) { + if (from2 == to && !slice2.size) + return null; + let $from = doc3.resolve(from2), $to = doc3.resolve(to); + if (fitsTrivially($from, $to, slice2)) + return new ReplaceStep(from2, to, slice2); + return new Fitter($from, $to, slice2).fit(); +} +function fitsTrivially($from, $to, slice2) { + return !slice2.openStart && !slice2.openEnd && $from.start() == $to.start() && $from.parent.canReplace($from.index(), $to.index(), slice2.content); +} +var Fitter = class { + constructor($from, $to, unplaced) { + this.$from = $from; + this.$to = $to; + this.unplaced = unplaced; + this.frontier = []; + this.placed = Fragment.empty; + for (let i = 0; i <= $from.depth; i++) { + let node = $from.node(i); + this.frontier.push({ + type: node.type, + match: node.contentMatchAt($from.indexAfter(i)) + }); + } + for (let i = $from.depth; i > 0; i--) + this.placed = Fragment.from($from.node(i).copy(this.placed)); + } + get depth() { + return this.frontier.length - 1; + } + fit() { + while (this.unplaced.size) { + let fit = this.findFittable(); + if (fit) + this.placeNodes(fit); + else + this.openMore() || this.dropNode(); + } + let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth; + let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline)); + if (!$to) + return null; + let content = this.placed, openStart = $from.depth, openEnd = $to.depth; + while (openStart && openEnd && content.childCount == 1) { + content = content.firstChild.content; + openStart--; + openEnd--; + } + let slice2 = new Slice(content, openStart, openEnd); + if (moveInline > -1) + return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice2, placedSize); + if (slice2.size || $from.pos != this.$to.pos) + return new ReplaceStep($from.pos, $to.pos, slice2); + return null; + } + // Find a position on the start spine of `this.unplaced` that has + // content that can be moved somewhere on the frontier. Returns two + // depths, one for the slice and one for the frontier. + findFittable() { + let startDepth = this.unplaced.openStart; + for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) { + let node = cur.firstChild; + if (cur.childCount > 1) + openEnd = 0; + if (node.type.spec.isolating && openEnd <= d) { + startDepth = d; + break; + } + cur = node.content; + } + for (let pass = 1; pass <= 2; pass++) { + for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) { + let fragment, parent = null; + if (sliceDepth) { + parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild; + fragment = parent.content; + } else { + fragment = this.unplaced.content; + } + let first2 = fragment.firstChild; + for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) { + let { type, match } = this.frontier[frontierDepth], wrap2, inject = null; + if (pass == 1 && (first2 ? match.matchType(first2.type) || (inject = match.fillBefore(Fragment.from(first2), false)) : parent && type.compatibleContent(parent.type))) + return { sliceDepth, frontierDepth, parent, inject }; + else if (pass == 2 && first2 && (wrap2 = match.findWrapping(first2.type))) + return { sliceDepth, frontierDepth, parent, wrap: wrap2 }; + if (parent && match.matchType(parent.type)) + break; + } + } + } + } + openMore() { + let { content, openStart, openEnd } = this.unplaced; + let inner = contentAt(content, openStart); + if (!inner.childCount || inner.firstChild.isLeaf) + return false; + this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0)); + return true; + } + dropNode() { + let { content, openStart, openEnd } = this.unplaced; + let inner = contentAt(content, openStart); + if (inner.childCount <= 1 && openStart > 0) { + let openAtEnd = content.size - openStart <= openStart + inner.size; + this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd); + } else { + this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd); + } + } + // Move content from the unplaced slice at `sliceDepth` to the + // frontier node at `frontierDepth`. Close that frontier node when + // applicable. + placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap: wrap2 }) { + while (this.depth > frontierDepth) + this.closeFrontierNode(); + if (wrap2) + for (let i = 0; i < wrap2.length; i++) + this.openFrontierNode(wrap2[i]); + let slice2 = this.unplaced, fragment = parent ? parent.content : slice2.content; + let openStart = slice2.openStart - sliceDepth; + let taken = 0, add = []; + let { match, type } = this.frontier[frontierDepth]; + if (inject) { + for (let i = 0; i < inject.childCount; i++) + add.push(inject.child(i)); + match = match.matchFragment(inject); + } + let openEndCount = fragment.size + sliceDepth - (slice2.content.size - slice2.openEnd); + while (taken < fragment.childCount) { + let next = fragment.child(taken), matches2 = match.matchType(next.type); + if (!matches2) + break; + taken++; + if (taken > 1 || openStart == 0 || next.content.size) { + match = matches2; + add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1)); + } + } + let toEnd = taken == fragment.childCount; + if (!toEnd) + openEndCount = -1; + this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add)); + this.frontier[frontierDepth].match = match; + if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1) + this.closeFrontierNode(); + for (let i = 0, cur = fragment; i < openEndCount; i++) { + let node = cur.lastChild; + this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) }); + cur = node.content; + } + this.unplaced = !toEnd ? new Slice(dropFromFragment(slice2.content, sliceDepth, taken), slice2.openStart, slice2.openEnd) : sliceDepth == 0 ? Slice.empty : new Slice(dropFromFragment(slice2.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice2.openEnd : sliceDepth - 1); + } + mustMoveInline() { + if (!this.$to.parent.isTextblock) + return -1; + let top2 = this.frontier[this.depth], level; + if (!top2.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top2.type, top2.match, false) || this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth) + return -1; + let { depth } = this.$to, after = this.$to.after(depth); + while (depth > 1 && after == this.$to.end(--depth)) + ++after; + return after; + } + findCloseLevel($to) { + scan: + for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) { + let { match, type } = this.frontier[i]; + let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1)); + let fit = contentAfterFits($to, i, type, match, dropInner); + if (!fit) + continue; + for (let d = i - 1; d >= 0; d--) { + let { match: match2, type: type2 } = this.frontier[d]; + let matches2 = contentAfterFits($to, d, type2, match2, true); + if (!matches2 || matches2.childCount) + continue scan; + } + return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to }; + } + } + close($to) { + let close2 = this.findCloseLevel($to); + if (!close2) + return null; + while (this.depth > close2.depth) + this.closeFrontierNode(); + if (close2.fit.childCount) + this.placed = addToFragment(this.placed, close2.depth, close2.fit); + $to = close2.move; + for (let d = close2.depth + 1; d <= $to.depth; d++) { + let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d)); + this.openFrontierNode(node.type, node.attrs, add); + } + return $to; + } + openFrontierNode(type, attrs = null, content) { + let top2 = this.frontier[this.depth]; + top2.match = top2.match.matchType(type); + this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content))); + this.frontier.push({ type, match: type.contentMatch }); + } + closeFrontierNode() { + let open = this.frontier.pop(); + let add = open.match.fillBefore(Fragment.empty, true); + if (add.childCount) + this.placed = addToFragment(this.placed, this.frontier.length, add); + } +}; +function dropFromFragment(fragment, depth, count) { + if (depth == 0) + return fragment.cutByIndex(count, fragment.childCount); + return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count))); +} +function addToFragment(fragment, depth, content) { + if (depth == 0) + return fragment.append(content); + return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content))); +} +function contentAt(fragment, depth) { + for (let i = 0; i < depth; i++) + fragment = fragment.firstChild.content; + return fragment; +} +function closeNodeStart(node, openStart, openEnd) { + if (openStart <= 0) + return node; + let frag = node.content; + if (openStart > 1) + frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0)); + if (openStart > 0) { + frag = node.type.contentMatch.fillBefore(frag).append(frag); + if (openEnd <= 0) + frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true)); + } + return node.copy(frag); +} +function contentAfterFits($to, depth, type, match, open) { + let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth); + if (index == node.childCount && !type.compatibleContent(node.type)) + return null; + let fit = match.fillBefore(node.content, true, index); + return fit && !invalidMarks(type, node.content, index) ? fit : null; +} +function invalidMarks(type, fragment, start2) { + for (let i = start2; i < fragment.childCount; i++) + if (!type.allowsMarks(fragment.child(i).marks)) + return true; + return false; +} +function definesContent(type) { + return type.spec.defining || type.spec.definingForContent; +} +function replaceRange(tr2, from2, to, slice2) { + if (!slice2.size) + return tr2.deleteRange(from2, to); + let $from = tr2.doc.resolve(from2), $to = tr2.doc.resolve(to); + if (fitsTrivially($from, $to, slice2)) + return tr2.step(new ReplaceStep(from2, to, slice2)); + let targetDepths = coveredDepths($from, tr2.doc.resolve(to)); + if (targetDepths[targetDepths.length - 1] == 0) + targetDepths.pop(); + let preferredTarget = -($from.depth + 1); + targetDepths.unshift(preferredTarget); + for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) { + let spec = $from.node(d).type.spec; + if (spec.defining || spec.definingAsContext || spec.isolating) + break; + if (targetDepths.indexOf(d) > -1) + preferredTarget = d; + else if ($from.before(d) == pos) + targetDepths.splice(1, 0, -d); + } + let preferredTargetIndex = targetDepths.indexOf(preferredTarget); + let leftNodes = [], preferredDepth = slice2.openStart; + for (let content = slice2.content, i = 0; ; i++) { + let node = content.firstChild; + leftNodes.push(node); + if (i == slice2.openStart) + break; + content = node.content; + } + for (let d = preferredDepth - 1; d >= 0; d--) { + let leftNode = leftNodes[d], def = definesContent(leftNode.type); + if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1))) + preferredDepth = d; + else if (def || !leftNode.type.isTextblock) + break; + } + for (let j = slice2.openStart; j >= 0; j--) { + let openDepth = (j + preferredDepth + 1) % (slice2.openStart + 1); + let insert = leftNodes[openDepth]; + if (!insert) + continue; + for (let i = 0; i < targetDepths.length; i++) { + let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true; + if (targetDepth < 0) { + expand = false; + targetDepth = -targetDepth; + } + let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1); + if (parent.canReplaceWith(index, index, insert.type, insert.marks)) + return tr2.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice2.content, 0, slice2.openStart, openDepth), openDepth, slice2.openEnd)); + } + } + let startSteps = tr2.steps.length; + for (let i = targetDepths.length - 1; i >= 0; i--) { + tr2.replace(from2, to, slice2); + if (tr2.steps.length > startSteps) + break; + let depth = targetDepths[i]; + if (depth < 0) + continue; + from2 = $from.before(depth); + to = $to.after(depth); + } +} +function closeFragment(fragment, depth, oldOpen, newOpen, parent) { + if (depth < oldOpen) { + let first2 = fragment.firstChild; + fragment = fragment.replaceChild(0, first2.copy(closeFragment(first2.content, depth + 1, oldOpen, newOpen, first2))); + } + if (depth > newOpen) { + let match = parent.contentMatchAt(0); + let start2 = match.fillBefore(fragment).append(fragment); + fragment = start2.append(match.matchFragment(start2).fillBefore(Fragment.empty, true)); + } + return fragment; +} +function replaceRangeWith(tr2, from2, to, node) { + if (!node.isInline && from2 == to && tr2.doc.resolve(from2).parent.content.size) { + let point = insertPoint(tr2.doc, from2, node.type); + if (point != null) + from2 = to = point; + } + tr2.replaceRange(from2, to, new Slice(Fragment.from(node), 0, 0)); +} +function deleteRange(tr2, from2, to) { + let $from = tr2.doc.resolve(from2), $to = tr2.doc.resolve(to); + let covered = coveredDepths($from, $to); + for (let i = 0; i < covered.length; i++) { + let depth = covered[i], last = i == covered.length - 1; + if (last && depth == 0 || $from.node(depth).type.contentMatch.validEnd) + return tr2.delete($from.start(depth), $to.end(depth)); + if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1)))) + return tr2.delete($from.before(depth), $to.after(depth)); + } + for (let d = 1; d <= $from.depth && d <= $to.depth; d++) { + if (from2 - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d) + return tr2.delete($from.before(d), to); + } + tr2.delete(from2, to); +} +function coveredDepths($from, $to) { + let result = [], minDepth = Math.min($from.depth, $to.depth); + for (let d = minDepth; d >= 0; d--) { + let start2 = $from.start(d); + if (start2 < $from.pos - ($from.depth - d) || $to.end(d) > $to.pos + ($to.depth - d) || $from.node(d).type.spec.isolating || $to.node(d).type.spec.isolating) + break; + if (start2 == $to.start(d) || d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent && d && $to.start(d - 1) == start2 - 1) + result.push(d); + } + return result; +} +var AttrStep = class _AttrStep extends Step { + /** + Construct an attribute step. + */ + constructor(pos, attr, value) { + super(); + this.pos = pos; + this.attr = attr; + this.value = value; + } + apply(doc3) { + let node = doc3.nodeAt(this.pos); + if (!node) + return StepResult.fail("No node at attribute step's position"); + let attrs = /* @__PURE__ */ Object.create(null); + for (let name in node.attrs) + attrs[name] = node.attrs[name]; + attrs[this.attr] = this.value; + let updated = node.type.create(attrs, null, node.marks); + return StepResult.fromReplace(doc3, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1)); + } + getMap() { + return StepMap.empty; + } + invert(doc3) { + return new _AttrStep(this.pos, this.attr, doc3.nodeAt(this.pos).attrs[this.attr]); + } + map(mapping) { + let pos = mapping.mapResult(this.pos, 1); + return pos.deletedAfter ? null : new _AttrStep(pos.pos, this.attr, this.value); + } + toJSON() { + return { stepType: "attr", pos: this.pos, attr: this.attr, value: this.value }; + } + static fromJSON(schema, json2) { + if (typeof json2.pos != "number" || typeof json2.attr != "string") + throw new RangeError("Invalid input for AttrStep.fromJSON"); + return new _AttrStep(json2.pos, json2.attr, json2.value); + } +}; +Step.jsonID("attr", AttrStep); +var DocAttrStep = class _DocAttrStep extends Step { + /** + Construct an attribute step. + */ + constructor(attr, value) { + super(); + this.attr = attr; + this.value = value; + } + apply(doc3) { + let attrs = /* @__PURE__ */ Object.create(null); + for (let name in doc3.attrs) + attrs[name] = doc3.attrs[name]; + attrs[this.attr] = this.value; + let updated = doc3.type.create(attrs, doc3.content, doc3.marks); + return StepResult.ok(updated); + } + getMap() { + return StepMap.empty; + } + invert(doc3) { + return new _DocAttrStep(this.attr, doc3.attrs[this.attr]); + } + map(mapping) { + return this; + } + toJSON() { + return { stepType: "docAttr", attr: this.attr, value: this.value }; + } + static fromJSON(schema, json2) { + if (typeof json2.attr != "string") + throw new RangeError("Invalid input for DocAttrStep.fromJSON"); + return new _DocAttrStep(json2.attr, json2.value); + } +}; +Step.jsonID("docAttr", DocAttrStep); +var TransformError = class extends Error { +}; +TransformError = function TransformError2(message) { + let err = Error.call(this, message); + err.__proto__ = TransformError2.prototype; + return err; +}; +TransformError.prototype = Object.create(Error.prototype); +TransformError.prototype.constructor = TransformError; +TransformError.prototype.name = "TransformError"; +var Transform = class { + /** + Create a transform that starts with the given document. + */ + constructor(doc3) { + this.doc = doc3; + this.steps = []; + this.docs = []; + this.mapping = new Mapping(); + } + /** + The starting document. + */ + get before() { + return this.docs.length ? this.docs[0] : this.doc; + } + /** + Apply a new step in this transform, saving the result. Throws an + error when the step fails. + */ + step(step) { + let result = this.maybeStep(step); + if (result.failed) + throw new TransformError(result.failed); + return this; + } + /** + Try to apply a step in this transformation, ignoring it if it + fails. Returns the step result. + */ + maybeStep(step) { + let result = step.apply(this.doc); + if (!result.failed) + this.addStep(step, result.doc); + return result; + } + /** + True when the document has been changed (when there are any + steps). + */ + get docChanged() { + return this.steps.length > 0; + } + /** + @internal + */ + addStep(step, doc3) { + this.docs.push(this.doc); + this.steps.push(step); + this.mapping.appendMap(step.getMap()); + this.doc = doc3; + } + /** + Replace the part of the document between `from` and `to` with the + given `slice`. + */ + replace(from2, to = from2, slice2 = Slice.empty) { + let step = replaceStep(this.doc, from2, to, slice2); + if (step) + this.step(step); + return this; + } + /** + Replace the given range with the given content, which may be a + fragment, node, or array of nodes. + */ + replaceWith(from2, to, content) { + return this.replace(from2, to, new Slice(Fragment.from(content), 0, 0)); + } + /** + Delete the content between the given positions. + */ + delete(from2, to) { + return this.replace(from2, to, Slice.empty); + } + /** + Insert the given content at the given position. + */ + insert(pos, content) { + return this.replaceWith(pos, pos, content); + } + /** + Replace a range of the document with a given slice, using + `from`, `to`, and the slice's + [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather + than fixed start and end points. This method may grow the + replaced area or close open nodes in the slice in order to get a + fit that is more in line with WYSIWYG expectations, by dropping + fully covered parent nodes of the replaced region when they are + marked [non-defining as + context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an + open parent node from the slice that _is_ marked as [defining + its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent). + + This is the method, for example, to handle paste. The similar + [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more + primitive tool which will _not_ move the start and end of its given + range, and is useful in situations where you need more precise + control over what happens. + */ + replaceRange(from2, to, slice2) { + replaceRange(this, from2, to, slice2); + return this; + } + /** + Replace the given range with a node, but use `from` and `to` as + hints, rather than precise positions. When from and to are the same + and are at the start or end of a parent node in which the given + node doesn't fit, this method may _move_ them out towards a parent + that does allow the given node to be placed. When the given range + completely covers a parent node, this method may completely replace + that parent node. + */ + replaceRangeWith(from2, to, node) { + replaceRangeWith(this, from2, to, node); + return this; + } + /** + Delete the given range, expanding it to cover fully covered + parent nodes until a valid replace is found. + */ + deleteRange(from2, to) { + deleteRange(this, from2, to); + return this; + } + /** + Split the content in the given range off from its parent, if there + is sibling content before or after it, and move it up the tree to + the depth specified by `target`. You'll probably want to use + [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make + sure the lift is valid. + */ + lift(range, target) { + lift(this, range, target); + return this; + } + /** + Join the blocks around the given position. If depth is 2, their + last and first siblings are also joined, and so on. + */ + join(pos, depth = 1) { + join(this, pos, depth); + return this; + } + /** + Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers. + The wrappers are assumed to be valid in this position, and should + probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping). + */ + wrap(range, wrappers) { + wrap(this, range, wrappers); + return this; + } + /** + Set the type of all textblocks (partly) between `from` and `to` to + the given node type with the given attributes. + */ + setBlockType(from2, to = from2, type, attrs = null) { + setBlockType(this, from2, to, type, attrs); + return this; + } + /** + Change the type, attributes, and/or marks of the node at `pos`. + When `type` isn't given, the existing node type is preserved, + */ + setNodeMarkup(pos, type, attrs = null, marks) { + setNodeMarkup(this, pos, type, attrs, marks); + return this; + } + /** + Set a single attribute on a given node to a new value. + The `pos` addresses the document content. Use `setDocAttribute` + to set attributes on the document itself. + */ + setNodeAttribute(pos, attr, value) { + this.step(new AttrStep(pos, attr, value)); + return this; + } + /** + Set a single attribute on the document to a new value. + */ + setDocAttribute(attr, value) { + this.step(new DocAttrStep(attr, value)); + return this; + } + /** + Add a mark to the node at position `pos`. + */ + addNodeMark(pos, mark) { + this.step(new AddNodeMarkStep(pos, mark)); + return this; + } + /** + Remove a mark (or a mark of the given type) from the node at + position `pos`. + */ + removeNodeMark(pos, mark) { + if (!(mark instanceof Mark)) { + let node = this.doc.nodeAt(pos); + if (!node) + throw new RangeError("No node at position " + pos); + mark = mark.isInSet(node.marks); + if (!mark) + return this; + } + this.step(new RemoveNodeMarkStep(pos, mark)); + return this; + } + /** + Split the node at the given position, and optionally, if `depth` is + greater than one, any number of nodes above that. By default, the + parts split off will inherit the node type of the original node. + This can be changed by passing an array of types and attributes to + use after the split. + */ + split(pos, depth = 1, typesAfter) { + split(this, pos, depth, typesAfter); + return this; + } + /** + Add the given mark to the inline content between `from` and `to`. + */ + addMark(from2, to, mark) { + addMark(this, from2, to, mark); + return this; + } + /** + Remove marks from inline nodes between `from` and `to`. When + `mark` is a single mark, remove precisely that mark. When it is + a mark type, remove all marks of that type. When it is null, + remove all marks of any type. + */ + removeMark(from2, to, mark) { + removeMark(this, from2, to, mark); + return this; + } + /** + Removes all marks and nodes from the content of the node at + `pos` that don't match the given new parent node type. Accepts + an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as + third argument. + */ + clearIncompatible(pos, parentType, match) { + clearIncompatible(this, pos, parentType, match); + return this; + } +}; + +// node_modules/prosemirror-state/dist/index.js +var classesById = /* @__PURE__ */ Object.create(null); +var Selection = class { + /** + Initialize a selection with the head and anchor and ranges. If no + ranges are given, constructs a single range across `$anchor` and + `$head`. + */ + constructor($anchor, $head, ranges) { + this.$anchor = $anchor; + this.$head = $head; + this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))]; + } + /** + The selection's anchor, as an unresolved position. + */ + get anchor() { + return this.$anchor.pos; + } + /** + The selection's head. + */ + get head() { + return this.$head.pos; + } + /** + The lower bound of the selection's main range. + */ + get from() { + return this.$from.pos; + } + /** + The upper bound of the selection's main range. + */ + get to() { + return this.$to.pos; + } + /** + The resolved lower bound of the selection's main range. + */ + get $from() { + return this.ranges[0].$from; + } + /** + The resolved upper bound of the selection's main range. + */ + get $to() { + return this.ranges[0].$to; + } + /** + Indicates whether the selection contains any content. + */ + get empty() { + let ranges = this.ranges; + for (let i = 0; i < ranges.length; i++) + if (ranges[i].$from.pos != ranges[i].$to.pos) + return false; + return true; + } + /** + Get the content of this selection as a slice. + */ + content() { + return this.$from.doc.slice(this.from, this.to, true); + } + /** + Replace the selection with a slice or, if no slice is given, + delete the selection. Will append to the given transaction. + */ + replace(tr2, content = Slice.empty) { + let lastNode = content.content.lastChild, lastParent = null; + for (let i = 0; i < content.openEnd; i++) { + lastParent = lastNode; + lastNode = lastNode.lastChild; + } + let mapFrom = tr2.steps.length, ranges = this.ranges; + for (let i = 0; i < ranges.length; i++) { + let { $from, $to } = ranges[i], mapping = tr2.mapping.slice(mapFrom); + tr2.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content); + if (i == 0) + selectionToInsertionEnd(tr2, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1); + } + } + /** + Replace the selection with the given node, appending the changes + to the given transaction. + */ + replaceWith(tr2, node) { + let mapFrom = tr2.steps.length, ranges = this.ranges; + for (let i = 0; i < ranges.length; i++) { + let { $from, $to } = ranges[i], mapping = tr2.mapping.slice(mapFrom); + let from2 = mapping.map($from.pos), to = mapping.map($to.pos); + if (i) { + tr2.deleteRange(from2, to); + } else { + tr2.replaceRangeWith(from2, to, node); + selectionToInsertionEnd(tr2, mapFrom, node.isInline ? -1 : 1); + } + } + } + /** + Find a valid cursor or leaf node selection starting at the given + position and searching back if `dir` is negative, and forward if + positive. When `textOnly` is true, only consider cursor + selections. Will return null when no valid selection position is + found. + */ + static findFrom($pos, dir, textOnly = false) { + let inner = $pos.parent.inlineContent ? new TextSelection($pos) : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly); + if (inner) + return inner; + for (let depth = $pos.depth - 1; depth >= 0; depth--) { + let found2 = dir < 0 ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly) : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly); + if (found2) + return found2; + } + return null; + } + /** + Find a valid cursor or leaf node selection near the given + position. Searches forward first by default, but if `bias` is + negative, it will search backwards first. + */ + static near($pos, bias = 1) { + return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0)); + } + /** + Find the cursor or leaf node selection closest to the start of + the given document. Will return an + [`AllSelection`](https://prosemirror.net/docs/ref/#state.AllSelection) if no valid position + exists. + */ + static atStart(doc3) { + return findSelectionIn(doc3, doc3, 0, 0, 1) || new AllSelection(doc3); + } + /** + Find the cursor or leaf node selection closest to the end of the + given document. + */ + static atEnd(doc3) { + return findSelectionIn(doc3, doc3, doc3.content.size, doc3.childCount, -1) || new AllSelection(doc3); + } + /** + Deserialize the JSON representation of a selection. Must be + implemented for custom classes (as a static class method). + */ + static fromJSON(doc3, json2) { + if (!json2 || !json2.type) + throw new RangeError("Invalid input for Selection.fromJSON"); + let cls = classesById[json2.type]; + if (!cls) + throw new RangeError(`No selection type ${json2.type} defined`); + return cls.fromJSON(doc3, json2); + } + /** + To be able to deserialize selections from JSON, custom selection + classes must register themselves with an ID string, so that they + can be disambiguated. Try to pick something that's unlikely to + clash with classes from other modules. + */ + static jsonID(id, selectionClass) { + if (id in classesById) + throw new RangeError("Duplicate use of selection JSON ID " + id); + classesById[id] = selectionClass; + selectionClass.prototype.jsonID = id; + return selectionClass; + } + /** + Get a [bookmark](https://prosemirror.net/docs/ref/#state.SelectionBookmark) for this selection, + which is a value that can be mapped without having access to a + current document, and later resolved to a real selection for a + given document again. (This is used mostly by the history to + track and restore old selections.) The default implementation of + this method just converts the selection to a text selection and + returns the bookmark for that. + */ + getBookmark() { + return TextSelection.between(this.$anchor, this.$head).getBookmark(); + } +}; +Selection.prototype.visible = true; +var SelectionRange = class { + /** + Create a range. + */ + constructor($from, $to) { + this.$from = $from; + this.$to = $to; + } +}; +var warnedAboutTextSelection = false; +function checkTextSelection($pos) { + if (!warnedAboutTextSelection && !$pos.parent.inlineContent) { + warnedAboutTextSelection = true; + console["warn"]("TextSelection endpoint not pointing into a node with inline content (" + $pos.parent.type.name + ")"); + } +} +var TextSelection = class _TextSelection extends Selection { + /** + Construct a text selection between the given points. + */ + constructor($anchor, $head = $anchor) { + checkTextSelection($anchor); + checkTextSelection($head); + super($anchor, $head); + } + /** + Returns a resolved position if this is a cursor selection (an + empty text selection), and null otherwise. + */ + get $cursor() { + return this.$anchor.pos == this.$head.pos ? this.$head : null; + } + map(doc3, mapping) { + let $head = doc3.resolve(mapping.map(this.head)); + if (!$head.parent.inlineContent) + return Selection.near($head); + let $anchor = doc3.resolve(mapping.map(this.anchor)); + return new _TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head); + } + replace(tr2, content = Slice.empty) { + super.replace(tr2, content); + if (content == Slice.empty) { + let marks = this.$from.marksAcross(this.$to); + if (marks) + tr2.ensureMarks(marks); + } + } + eq(other) { + return other instanceof _TextSelection && other.anchor == this.anchor && other.head == this.head; + } + getBookmark() { + return new TextBookmark(this.anchor, this.head); + } + toJSON() { + return { type: "text", anchor: this.anchor, head: this.head }; + } + /** + @internal + */ + static fromJSON(doc3, json2) { + if (typeof json2.anchor != "number" || typeof json2.head != "number") + throw new RangeError("Invalid input for TextSelection.fromJSON"); + return new _TextSelection(doc3.resolve(json2.anchor), doc3.resolve(json2.head)); + } + /** + Create a text selection from non-resolved positions. + */ + static create(doc3, anchor, head = anchor) { + let $anchor = doc3.resolve(anchor); + return new this($anchor, head == anchor ? $anchor : doc3.resolve(head)); + } + /** + Return a text selection that spans the given positions or, if + they aren't text positions, find a text selection near them. + `bias` determines whether the method searches forward (default) + or backwards (negative number) first. Will fall back to calling + [`Selection.near`](https://prosemirror.net/docs/ref/#state.Selection^near) when the document + doesn't contain a valid text position. + */ + static between($anchor, $head, bias) { + let dPos = $anchor.pos - $head.pos; + if (!bias || dPos) + bias = dPos >= 0 ? 1 : -1; + if (!$head.parent.inlineContent) { + let found2 = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true); + if (found2) + $head = found2.$head; + else + return Selection.near($head, bias); + } + if (!$anchor.parent.inlineContent) { + if (dPos == 0) { + $anchor = $head; + } else { + $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor; + if ($anchor.pos < $head.pos != dPos < 0) + $anchor = $head; + } + } + return new _TextSelection($anchor, $head); + } +}; +Selection.jsonID("text", TextSelection); +var TextBookmark = class _TextBookmark { + constructor(anchor, head) { + this.anchor = anchor; + this.head = head; + } + map(mapping) { + return new _TextBookmark(mapping.map(this.anchor), mapping.map(this.head)); + } + resolve(doc3) { + return TextSelection.between(doc3.resolve(this.anchor), doc3.resolve(this.head)); + } +}; +var NodeSelection = class _NodeSelection extends Selection { + /** + Create a node selection. Does not verify the validity of its + argument. + */ + constructor($pos) { + let node = $pos.nodeAfter; + let $end = $pos.node(0).resolve($pos.pos + node.nodeSize); + super($pos, $end); + this.node = node; + } + map(doc3, mapping) { + let { deleted, pos } = mapping.mapResult(this.anchor); + let $pos = doc3.resolve(pos); + if (deleted) + return Selection.near($pos); + return new _NodeSelection($pos); + } + content() { + return new Slice(Fragment.from(this.node), 0, 0); + } + eq(other) { + return other instanceof _NodeSelection && other.anchor == this.anchor; + } + toJSON() { + return { type: "node", anchor: this.anchor }; + } + getBookmark() { + return new NodeBookmark(this.anchor); + } + /** + @internal + */ + static fromJSON(doc3, json2) { + if (typeof json2.anchor != "number") + throw new RangeError("Invalid input for NodeSelection.fromJSON"); + return new _NodeSelection(doc3.resolve(json2.anchor)); + } + /** + Create a node selection from non-resolved positions. + */ + static create(doc3, from2) { + return new _NodeSelection(doc3.resolve(from2)); + } + /** + Determines whether the given node may be selected as a node + selection. + */ + static isSelectable(node) { + return !node.isText && node.type.spec.selectable !== false; + } +}; +NodeSelection.prototype.visible = false; +Selection.jsonID("node", NodeSelection); +var NodeBookmark = class _NodeBookmark { + constructor(anchor) { + this.anchor = anchor; + } + map(mapping) { + let { deleted, pos } = mapping.mapResult(this.anchor); + return deleted ? new TextBookmark(pos, pos) : new _NodeBookmark(pos); + } + resolve(doc3) { + let $pos = doc3.resolve(this.anchor), node = $pos.nodeAfter; + if (node && NodeSelection.isSelectable(node)) + return new NodeSelection($pos); + return Selection.near($pos); + } +}; +var AllSelection = class _AllSelection extends Selection { + /** + Create an all-selection over the given document. + */ + constructor(doc3) { + super(doc3.resolve(0), doc3.resolve(doc3.content.size)); + } + replace(tr2, content = Slice.empty) { + if (content == Slice.empty) { + tr2.delete(0, tr2.doc.content.size); + let sel = Selection.atStart(tr2.doc); + if (!sel.eq(tr2.selection)) + tr2.setSelection(sel); + } else { + super.replace(tr2, content); + } + } + toJSON() { + return { type: "all" }; + } + /** + @internal + */ + static fromJSON(doc3) { + return new _AllSelection(doc3); + } + map(doc3) { + return new _AllSelection(doc3); + } + eq(other) { + return other instanceof _AllSelection; + } + getBookmark() { + return AllBookmark; + } +}; +Selection.jsonID("all", AllSelection); +var AllBookmark = { + map() { + return this; + }, + resolve(doc3) { + return new AllSelection(doc3); + } +}; +function findSelectionIn(doc3, node, pos, index, dir, text = false) { + if (node.inlineContent) + return TextSelection.create(doc3, pos); + for (let i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) { + let child = node.child(i); + if (!child.isAtom) { + let inner = findSelectionIn(doc3, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text); + if (inner) + return inner; + } else if (!text && NodeSelection.isSelectable(child)) { + return NodeSelection.create(doc3, pos - (dir < 0 ? child.nodeSize : 0)); + } + pos += child.nodeSize * dir; + } + return null; +} +function selectionToInsertionEnd(tr2, startLen, bias) { + let last = tr2.steps.length - 1; + if (last < startLen) + return; + let step = tr2.steps[last]; + if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) + return; + let map2 = tr2.mapping.maps[last], end2; + map2.forEach((_from, _to, _newFrom, newTo) => { + if (end2 == null) + end2 = newTo; + }); + tr2.setSelection(Selection.near(tr2.doc.resolve(end2), bias)); +} +var UPDATED_SEL = 1; +var UPDATED_MARKS = 2; +var UPDATED_SCROLL = 4; +var Transaction = class extends Transform { + /** + @internal + */ + constructor(state) { + super(state.doc); + this.curSelectionFor = 0; + this.updated = 0; + this.meta = /* @__PURE__ */ Object.create(null); + this.time = Date.now(); + this.curSelection = state.selection; + this.storedMarks = state.storedMarks; + } + /** + The transaction's current selection. This defaults to the editor + selection [mapped](https://prosemirror.net/docs/ref/#state.Selection.map) through the steps in the + transaction, but can be overwritten with + [`setSelection`](https://prosemirror.net/docs/ref/#state.Transaction.setSelection). + */ + get selection() { + if (this.curSelectionFor < this.steps.length) { + this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor)); + this.curSelectionFor = this.steps.length; + } + return this.curSelection; + } + /** + Update the transaction's current selection. Will determine the + selection that the editor gets when the transaction is applied. + */ + setSelection(selection) { + if (selection.$from.doc != this.doc) + throw new RangeError("Selection passed to setSelection must point at the current document"); + this.curSelection = selection; + this.curSelectionFor = this.steps.length; + this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS; + this.storedMarks = null; + return this; + } + /** + Whether the selection was explicitly updated by this transaction. + */ + get selectionSet() { + return (this.updated & UPDATED_SEL) > 0; + } + /** + Set the current stored marks. + */ + setStoredMarks(marks) { + this.storedMarks = marks; + this.updated |= UPDATED_MARKS; + return this; + } + /** + Make sure the current stored marks or, if that is null, the marks + at the selection, match the given set of marks. Does nothing if + this is already the case. + */ + ensureMarks(marks) { + if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks)) + this.setStoredMarks(marks); + return this; + } + /** + Add a mark to the set of stored marks. + */ + addStoredMark(mark) { + return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks())); + } + /** + Remove a mark or mark type from the set of stored marks. + */ + removeStoredMark(mark) { + return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks())); + } + /** + Whether the stored marks were explicitly set for this transaction. + */ + get storedMarksSet() { + return (this.updated & UPDATED_MARKS) > 0; + } + /** + @internal + */ + addStep(step, doc3) { + super.addStep(step, doc3); + this.updated = this.updated & ~UPDATED_MARKS; + this.storedMarks = null; + } + /** + Update the timestamp for the transaction. + */ + setTime(time) { + this.time = time; + return this; + } + /** + Replace the current selection with the given slice. + */ + replaceSelection(slice2) { + this.selection.replace(this, slice2); + return this; + } + /** + Replace the selection with the given node. When `inheritMarks` is + true and the content is inline, it inherits the marks from the + place where it is inserted. + */ + replaceSelectionWith(node, inheritMarks = true) { + let selection = this.selection; + if (inheritMarks) + node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : selection.$from.marksAcross(selection.$to) || Mark.none)); + selection.replaceWith(this, node); + return this; + } + /** + Delete the selection. + */ + deleteSelection() { + this.selection.replace(this); + return this; + } + /** + Replace the given range, or the selection if no range is given, + with a text node containing the given string. + */ + insertText(text, from2, to) { + let schema = this.doc.type.schema; + if (from2 == null) { + if (!text) + return this.deleteSelection(); + return this.replaceSelectionWith(schema.text(text), true); + } else { + if (to == null) + to = from2; + to = to == null ? from2 : to; + if (!text) + return this.deleteRange(from2, to); + let marks = this.storedMarks; + if (!marks) { + let $from = this.doc.resolve(from2); + marks = to == from2 ? $from.marks() : $from.marksAcross(this.doc.resolve(to)); + } + this.replaceRangeWith(from2, to, schema.text(text, marks)); + if (!this.selection.empty) + this.setSelection(Selection.near(this.selection.$to)); + return this; + } + } + /** + Store a metadata property in this transaction, keyed either by + name or by plugin. + */ + setMeta(key, value) { + this.meta[typeof key == "string" ? key : key.key] = value; + return this; + } + /** + Retrieve a metadata property for a given name or plugin. + */ + getMeta(key) { + return this.meta[typeof key == "string" ? key : key.key]; + } + /** + Returns true if this transaction doesn't contain any metadata, + and can thus safely be extended. + */ + get isGeneric() { + for (let _ in this.meta) + return false; + return true; + } + /** + Indicate that the editor should scroll the selection into view + when updated to the state produced by this transaction. + */ + scrollIntoView() { + this.updated |= UPDATED_SCROLL; + return this; + } + /** + True when this transaction has had `scrollIntoView` called on it. + */ + get scrolledIntoView() { + return (this.updated & UPDATED_SCROLL) > 0; + } +}; +function bind(f, self2) { + return !self2 || !f ? f : f.bind(self2); +} +var FieldDesc = class { + constructor(name, desc, self2) { + this.name = name; + this.init = bind(desc.init, self2); + this.apply = bind(desc.apply, self2); + } +}; +var baseFields = [ + new FieldDesc("doc", { + init(config) { + return config.doc || config.schema.topNodeType.createAndFill(); + }, + apply(tr2) { + return tr2.doc; + } + }), + new FieldDesc("selection", { + init(config, instance) { + return config.selection || Selection.atStart(instance.doc); + }, + apply(tr2) { + return tr2.selection; + } + }), + new FieldDesc("storedMarks", { + init(config) { + return config.storedMarks || null; + }, + apply(tr2, _marks, _old, state) { + return state.selection.$cursor ? tr2.storedMarks : null; + } + }), + new FieldDesc("scrollToSelection", { + init() { + return 0; + }, + apply(tr2, prev) { + return tr2.scrolledIntoView ? prev + 1 : prev; + } + }) +]; +var Configuration = class { + constructor(schema, plugins) { + this.schema = schema; + this.plugins = []; + this.pluginsByKey = /* @__PURE__ */ Object.create(null); + this.fields = baseFields.slice(); + if (plugins) + plugins.forEach((plugin) => { + if (this.pluginsByKey[plugin.key]) + throw new RangeError("Adding different instances of a keyed plugin (" + plugin.key + ")"); + this.plugins.push(plugin); + this.pluginsByKey[plugin.key] = plugin; + if (plugin.spec.state) + this.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin)); + }); + } +}; +var EditorState = class _EditorState { + /** + @internal + */ + constructor(config) { + this.config = config; + } + /** + The schema of the state's document. + */ + get schema() { + return this.config.schema; + } + /** + The plugins that are active in this state. + */ + get plugins() { + return this.config.plugins; + } + /** + Apply the given transaction to produce a new state. + */ + apply(tr2) { + return this.applyTransaction(tr2).state; + } + /** + @internal + */ + filterTransaction(tr2, ignore = -1) { + for (let i = 0; i < this.config.plugins.length; i++) + if (i != ignore) { + let plugin = this.config.plugins[i]; + if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr2, this)) + return false; + } + return true; + } + /** + Verbose variant of [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) that + returns the precise transactions that were applied (which might + be influenced by the [transaction + hooks](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) of + plugins) along with the new state. + */ + applyTransaction(rootTr) { + if (!this.filterTransaction(rootTr)) + return { state: this, transactions: [] }; + let trs = [rootTr], newState = this.applyInner(rootTr), seen = null; + for (; ; ) { + let haveNew = false; + for (let i = 0; i < this.config.plugins.length; i++) { + let plugin = this.config.plugins[i]; + if (plugin.spec.appendTransaction) { + let n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this; + let tr2 = n < trs.length && plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState); + if (tr2 && newState.filterTransaction(tr2, i)) { + tr2.setMeta("appendedTransaction", rootTr); + if (!seen) { + seen = []; + for (let j = 0; j < this.config.plugins.length; j++) + seen.push(j < i ? { state: newState, n: trs.length } : { state: this, n: 0 }); + } + trs.push(tr2); + newState = newState.applyInner(tr2); + haveNew = true; + } + if (seen) + seen[i] = { state: newState, n: trs.length }; + } + } + if (!haveNew) + return { state: newState, transactions: trs }; + } + } + /** + @internal + */ + applyInner(tr2) { + if (!tr2.before.eq(this.doc)) + throw new RangeError("Applying a mismatched transaction"); + let newInstance = new _EditorState(this.config), fields = this.config.fields; + for (let i = 0; i < fields.length; i++) { + let field = fields[i]; + newInstance[field.name] = field.apply(tr2, this[field.name], this, newInstance); + } + return newInstance; + } + /** + Start a [transaction](https://prosemirror.net/docs/ref/#state.Transaction) from this state. + */ + get tr() { + return new Transaction(this); + } + /** + Create a new state. + */ + static create(config) { + let $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins); + let instance = new _EditorState($config); + for (let i = 0; i < $config.fields.length; i++) + instance[$config.fields[i].name] = $config.fields[i].init(config, instance); + return instance; + } + /** + Create a new state based on this one, but with an adjusted set + of active plugins. State fields that exist in both sets of + plugins are kept unchanged. Those that no longer exist are + dropped, and those that are new are initialized using their + [`init`](https://prosemirror.net/docs/ref/#state.StateField.init) method, passing in the new + configuration object.. + */ + reconfigure(config) { + let $config = new Configuration(this.schema, config.plugins); + let fields = $config.fields, instance = new _EditorState($config); + for (let i = 0; i < fields.length; i++) { + let name = fields[i].name; + instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance); + } + return instance; + } + /** + Serialize this state to JSON. If you want to serialize the state + of plugins, pass an object mapping property names to use in the + resulting JSON object to plugin objects. The argument may also be + a string or number, in which case it is ignored, to support the + way `JSON.stringify` calls `toString` methods. + */ + toJSON(pluginFields) { + let result = { doc: this.doc.toJSON(), selection: this.selection.toJSON() }; + if (this.storedMarks) + result.storedMarks = this.storedMarks.map((m) => m.toJSON()); + if (pluginFields && typeof pluginFields == "object") + for (let prop in pluginFields) { + if (prop == "doc" || prop == "selection") + throw new RangeError("The JSON fields `doc` and `selection` are reserved"); + let plugin = pluginFields[prop], state = plugin.spec.state; + if (state && state.toJSON) + result[prop] = state.toJSON.call(plugin, this[plugin.key]); + } + return result; + } + /** + Deserialize a JSON representation of a state. `config` should + have at least a `schema` field, and should contain array of + plugins to initialize the state with. `pluginFields` can be used + to deserialize the state of plugins, by associating plugin + instances with the property names they use in the JSON object. + */ + static fromJSON(config, json2, pluginFields) { + if (!json2) + throw new RangeError("Invalid input for EditorState.fromJSON"); + if (!config.schema) + throw new RangeError("Required config field 'schema' missing"); + let $config = new Configuration(config.schema, config.plugins); + let instance = new _EditorState($config); + $config.fields.forEach((field) => { + if (field.name == "doc") { + instance.doc = Node.fromJSON(config.schema, json2.doc); + } else if (field.name == "selection") { + instance.selection = Selection.fromJSON(instance.doc, json2.selection); + } else if (field.name == "storedMarks") { + if (json2.storedMarks) + instance.storedMarks = json2.storedMarks.map(config.schema.markFromJSON); + } else { + if (pluginFields) + for (let prop in pluginFields) { + let plugin = pluginFields[prop], state = plugin.spec.state; + if (plugin.key == field.name && state && state.fromJSON && Object.prototype.hasOwnProperty.call(json2, prop)) { + instance[field.name] = state.fromJSON.call(plugin, config, json2[prop], instance); + return; + } + } + instance[field.name] = field.init(config, instance); + } + }); + return instance; + } +}; +function bindProps(obj, self2, target) { + for (let prop in obj) { + let val = obj[prop]; + if (val instanceof Function) + val = val.bind(self2); + else if (prop == "handleDOMEvents") + val = bindProps(val, self2, {}); + target[prop] = val; + } + return target; +} +var Plugin = class { + /** + Create a plugin. + */ + constructor(spec) { + this.spec = spec; + this.props = {}; + if (spec.props) + bindProps(spec.props, this, this.props); + this.key = spec.key ? spec.key.key : createKey("plugin"); + } + /** + Extract the plugin's state field from an editor state. + */ + getState(state) { + return state[this.key]; + } +}; +var keys = /* @__PURE__ */ Object.create(null); +function createKey(name) { + if (name in keys) + return name + "$" + ++keys[name]; + keys[name] = 0; + return name + "$"; +} +var PluginKey = class { + /** + Create a plugin key. + */ + constructor(name = "key") { + this.key = createKey(name); + } + /** + Get the active plugin with this key, if any, from an editor + state. + */ + get(state) { + return state.config.pluginsByKey[this.key]; + } + /** + Get the plugin's state from an editor state. + */ + getState(state) { + return state[this.key]; + } +}; + +// node_modules/prosemirror-view/dist/index.js +var domIndex = function(node) { + for (var index = 0; ; index++) { + node = node.previousSibling; + if (!node) + return index; + } +}; +var parentNode = function(node) { + let parent = node.assignedSlot || node.parentNode; + return parent && parent.nodeType == 11 ? parent.host : parent; +}; +var reusedRange = null; +var textRange = function(node, from2, to) { + let range = reusedRange || (reusedRange = document.createRange()); + range.setEnd(node, to == null ? node.nodeValue.length : to); + range.setStart(node, from2 || 0); + return range; +}; +var isEquivalentPosition = function(node, off, targetNode, targetOff) { + return targetNode && (scanFor(node, off, targetNode, targetOff, -1) || scanFor(node, off, targetNode, targetOff, 1)); +}; +var atomElements = /^(img|br|input|textarea|hr)$/i; +function scanFor(node, off, targetNode, targetOff, dir) { + for (; ; ) { + if (node == targetNode && off == targetOff) + return true; + if (off == (dir < 0 ? 0 : nodeSize(node))) { + let parent = node.parentNode; + if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == "false") + return false; + off = domIndex(node) + (dir < 0 ? 0 : 1); + node = parent; + } else if (node.nodeType == 1) { + node = node.childNodes[off + (dir < 0 ? -1 : 0)]; + if (node.contentEditable == "false") + return false; + off = dir < 0 ? nodeSize(node) : 0; + } else { + return false; + } + } +} +function nodeSize(node) { + return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length; +} +function isOnEdge(node, offset2, parent) { + for (let atStart = offset2 == 0, atEnd = offset2 == nodeSize(node); atStart || atEnd; ) { + if (node == parent) + return true; + let index = domIndex(node); + node = node.parentNode; + if (!node) + return false; + atStart = atStart && index == 0; + atEnd = atEnd && index == nodeSize(node); + } +} +function hasBlockDesc(dom) { + let desc; + for (let cur = dom; cur; cur = cur.parentNode) + if (desc = cur.pmViewDesc) + break; + return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom); +} +var selectionCollapsed = function(domSel) { + return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset); +}; +function keyEvent(keyCode, key) { + let event = document.createEvent("Event"); + event.initEvent("keydown", true, true); + event.keyCode = keyCode; + event.key = event.code = key; + return event; +} +function deepActiveElement(doc3) { + let elt = doc3.activeElement; + while (elt && elt.shadowRoot) + elt = elt.shadowRoot.activeElement; + return elt; +} +function caretFromPoint(doc3, x, y) { + if (doc3.caretPositionFromPoint) { + try { + let pos = doc3.caretPositionFromPoint(x, y); + if (pos) + return { node: pos.offsetNode, offset: pos.offset }; + } catch (_) { + } + } + if (doc3.caretRangeFromPoint) { + let range = doc3.caretRangeFromPoint(x, y); + if (range) + return { node: range.startContainer, offset: range.startOffset }; + } +} +var nav = typeof navigator != "undefined" ? navigator : null; +var doc2 = typeof document != "undefined" ? document : null; +var agent = nav && nav.userAgent || ""; +var ie_edge = /Edge\/(\d+)/.exec(agent); +var ie_upto10 = /MSIE \d/.exec(agent); +var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(agent); +var ie = !!(ie_upto10 || ie_11up || ie_edge); +var ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0; +var gecko = !ie && /gecko\/(\d+)/i.test(agent); +gecko && +(/Firefox\/(\d+)/.exec(agent) || [0, 0])[1]; +var _chrome = !ie && /Chrome\/(\d+)/.exec(agent); +var chrome = !!_chrome; +var chrome_version = _chrome ? +_chrome[1] : 0; +var safari = !ie && !!nav && /Apple Computer/.test(nav.vendor); +var ios = safari && (/Mobile\/\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2); +var mac = ios || (nav ? /Mac/.test(nav.platform) : false); +var windows = nav ? /Win/.test(nav.platform) : false; +var android = /Android \d/.test(agent); +var webkit = !!doc2 && "webkitFontSmoothing" in doc2.documentElement.style; +var webkit_version = webkit ? +(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0; +function windowRect(doc3) { + return { + left: 0, + right: doc3.documentElement.clientWidth, + top: 0, + bottom: doc3.documentElement.clientHeight + }; +} +function getSide(value, side) { + return typeof value == "number" ? value : value[side]; +} +function clientRect(node) { + let rect = node.getBoundingClientRect(); + let scaleX = rect.width / node.offsetWidth || 1; + let scaleY = rect.height / node.offsetHeight || 1; + return { + left: rect.left, + right: rect.left + node.clientWidth * scaleX, + top: rect.top, + bottom: rect.top + node.clientHeight * scaleY + }; +} +function scrollRectIntoView(view, rect, startDOM) { + let scrollThreshold = view.someProp("scrollThreshold") || 0, scrollMargin = view.someProp("scrollMargin") || 5; + let doc3 = view.dom.ownerDocument; + for (let parent = startDOM || view.dom; ; parent = parentNode(parent)) { + if (!parent) + break; + if (parent.nodeType != 1) + continue; + let elt = parent; + let atTop = elt == doc3.body; + let bounding = atTop ? windowRect(doc3) : clientRect(elt); + let moveX = 0, moveY = 0; + if (rect.top < bounding.top + getSide(scrollThreshold, "top")) + moveY = -(bounding.top - rect.top + getSide(scrollMargin, "top")); + else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, "bottom")) + moveY = rect.bottom - rect.top > bounding.bottom - bounding.top ? rect.top + getSide(scrollMargin, "top") - bounding.top : rect.bottom - bounding.bottom + getSide(scrollMargin, "bottom"); + if (rect.left < bounding.left + getSide(scrollThreshold, "left")) + moveX = -(bounding.left - rect.left + getSide(scrollMargin, "left")); + else if (rect.right > bounding.right - getSide(scrollThreshold, "right")) + moveX = rect.right - bounding.right + getSide(scrollMargin, "right"); + if (moveX || moveY) { + if (atTop) { + doc3.defaultView.scrollBy(moveX, moveY); + } else { + let startX = elt.scrollLeft, startY = elt.scrollTop; + if (moveY) + elt.scrollTop += moveY; + if (moveX) + elt.scrollLeft += moveX; + let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY; + rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY }; + } + } + if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent).position)) + break; + } +} +function storeScrollPos(view) { + let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top); + let refDOM, refTop; + for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) { + let dom = view.root.elementFromPoint(x, y); + if (!dom || dom == view.dom || !view.dom.contains(dom)) + continue; + let localRect = dom.getBoundingClientRect(); + if (localRect.top >= startY - 20) { + refDOM = dom; + refTop = localRect.top; + break; + } + } + return { refDOM, refTop, stack: scrollStack(view.dom) }; +} +function scrollStack(dom) { + let stack = [], doc3 = dom.ownerDocument; + for (let cur = dom; cur; cur = parentNode(cur)) { + stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft }); + if (dom == doc3) + break; + } + return stack; +} +function resetScrollPos({ refDOM, refTop, stack }) { + let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0; + restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop); +} +function restoreScrollStack(stack, dTop) { + for (let i = 0; i < stack.length; i++) { + let { dom, top: top2, left: left2 } = stack[i]; + if (dom.scrollTop != top2 + dTop) + dom.scrollTop = top2 + dTop; + if (dom.scrollLeft != left2) + dom.scrollLeft = left2; + } +} +var preventScrollSupported = null; +function focusPreventScroll(dom) { + if (dom.setActive) + return dom.setActive(); + if (preventScrollSupported) + return dom.focus(preventScrollSupported); + let stored = scrollStack(dom); + dom.focus(preventScrollSupported == null ? { + get preventScroll() { + preventScrollSupported = { preventScroll: true }; + return true; + } + } : void 0); + if (!preventScrollSupported) { + preventScrollSupported = false; + restoreScrollStack(stored, 0); + } +} +function findOffsetInNode(node, coords) { + let closest, dxClosest = 2e8, coordsClosest, offset2 = 0; + let rowBot = coords.top, rowTop = coords.top; + let firstBelow, coordsBelow; + for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) { + let rects; + if (child.nodeType == 1) + rects = child.getClientRects(); + else if (child.nodeType == 3) + rects = textRange(child).getClientRects(); + else + continue; + for (let i = 0; i < rects.length; i++) { + let rect = rects[i]; + if (rect.top <= rowBot && rect.bottom >= rowTop) { + rowBot = Math.max(rect.bottom, rowBot); + rowTop = Math.min(rect.top, rowTop); + let dx = rect.left > coords.left ? rect.left - coords.left : rect.right < coords.left ? coords.left - rect.right : 0; + if (dx < dxClosest) { + closest = child; + dxClosest = dx; + coordsClosest = dx && closest.nodeType == 3 ? { + left: rect.right < coords.left ? rect.right : rect.left, + top: coords.top + } : coords; + if (child.nodeType == 1 && dx) + offset2 = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0); + continue; + } + } else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) { + firstBelow = child; + coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top }; + } + if (!closest && (coords.left >= rect.right && coords.top >= rect.top || coords.left >= rect.left && coords.top >= rect.bottom)) + offset2 = childIndex + 1; + } + } + if (!closest && firstBelow) { + closest = firstBelow; + coordsClosest = coordsBelow; + dxClosest = 0; + } + if (closest && closest.nodeType == 3) + return findOffsetInText(closest, coordsClosest); + if (!closest || dxClosest && closest.nodeType == 1) + return { node, offset: offset2 }; + return findOffsetInNode(closest, coordsClosest); +} +function findOffsetInText(node, coords) { + let len = node.nodeValue.length; + let range = document.createRange(); + for (let i = 0; i < len; i++) { + range.setEnd(node, i + 1); + range.setStart(node, i); + let rect = singleRect(range, 1); + if (rect.top == rect.bottom) + continue; + if (inRect(coords, rect)) + return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) }; + } + return { node, offset: 0 }; +} +function inRect(coords, rect) { + return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 && coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1; +} +function targetKludge(dom, coords) { + let parent = dom.parentNode; + if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left) + return parent; + return dom; +} +function posFromElement(view, elt, coords) { + let { node, offset: offset2 } = findOffsetInNode(elt, coords), bias = -1; + if (node.nodeType == 1 && !node.firstChild) { + let rect = node.getBoundingClientRect(); + bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1; + } + return view.docView.posFromDOM(node, offset2, bias); +} +function posFromCaret(view, node, offset2, coords) { + let outsideBlock = -1; + for (let cur = node, sawBlock = false; ; ) { + if (cur == view.dom) + break; + let desc = view.docView.nearestDesc(cur, true); + if (!desc) + return null; + if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent && !sawBlock || !desc.contentDOM)) { + let rect = desc.dom.getBoundingClientRect(); + if (desc.node.isBlock && desc.parent && !sawBlock) { + sawBlock = true; + if (rect.left > coords.left || rect.top > coords.top) + outsideBlock = desc.posBefore; + else if (rect.right < coords.left || rect.bottom < coords.top) + outsideBlock = desc.posAfter; + } + if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) { + let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2 : coords.left < (rect.left + rect.right) / 2; + return before ? desc.posBefore : desc.posAfter; + } + } + cur = desc.dom.parentNode; + } + return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset2, -1); +} +function elementFromPoint(element, coords, box) { + let len = element.childNodes.length; + if (len && box.top < box.bottom) { + for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI; ; ) { + let child = element.childNodes[i]; + if (child.nodeType == 1) { + let rects = child.getClientRects(); + for (let j = 0; j < rects.length; j++) { + let rect = rects[j]; + if (inRect(coords, rect)) + return elementFromPoint(child, coords, rect); + } + } + if ((i = (i + 1) % len) == startI) + break; + } + } + return element; +} +function posAtCoords(view, coords) { + let doc3 = view.dom.ownerDocument, node, offset2 = 0; + let caret = caretFromPoint(doc3, coords.left, coords.top); + if (caret) + ({ node, offset: offset2 } = caret); + let elt = (view.root.elementFromPoint ? view.root : doc3).elementFromPoint(coords.left, coords.top); + let pos; + if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) { + let box = view.dom.getBoundingClientRect(); + if (!inRect(coords, box)) + return null; + elt = elementFromPoint(view.dom, coords, box); + if (!elt) + return null; + } + if (safari) { + for (let p = elt; node && p; p = parentNode(p)) + if (p.draggable) + node = void 0; + } + elt = targetKludge(elt, coords); + if (node) { + if (gecko && node.nodeType == 1) { + offset2 = Math.min(offset2, node.childNodes.length); + if (offset2 < node.childNodes.length) { + let next = node.childNodes[offset2], box; + if (next.nodeName == "IMG" && (box = next.getBoundingClientRect()).right <= coords.left && box.bottom > coords.top) + offset2++; + } + } + let prev; + if (webkit && offset2 && node.nodeType == 1 && (prev = node.childNodes[offset2 - 1]).nodeType == 1 && prev.contentEditable == "false" && prev.getBoundingClientRect().top >= coords.top) + offset2--; + if (node == view.dom && offset2 == node.childNodes.length - 1 && node.lastChild.nodeType == 1 && coords.top > node.lastChild.getBoundingClientRect().bottom) + pos = view.state.doc.content.size; + else if (offset2 == 0 || node.nodeType != 1 || node.childNodes[offset2 - 1].nodeName != "BR") + pos = posFromCaret(view, node, offset2, coords); + } + if (pos == null) + pos = posFromElement(view, elt, coords); + let desc = view.docView.nearestDesc(elt, true); + return { pos, inside: desc ? desc.posAtStart - desc.border : -1 }; +} +function nonZero(rect) { + return rect.top < rect.bottom || rect.left < rect.right; +} +function singleRect(target, bias) { + let rects = target.getClientRects(); + if (rects.length) { + let first2 = rects[bias < 0 ? 0 : rects.length - 1]; + if (nonZero(first2)) + return first2; + } + return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect(); +} +var BIDI = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; +function coordsAtPos(view, pos, side) { + let { node, offset: offset2, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1); + let supportEmptyRange = webkit || gecko; + if (node.nodeType == 3) { + if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset2 : offset2 == node.nodeValue.length))) { + let rect = singleRect(textRange(node, offset2, offset2), side); + if (gecko && offset2 && /\s/.test(node.nodeValue[offset2 - 1]) && offset2 < node.nodeValue.length) { + let rectBefore = singleRect(textRange(node, offset2 - 1, offset2 - 1), -1); + if (rectBefore.top == rect.top) { + let rectAfter = singleRect(textRange(node, offset2, offset2 + 1), -1); + if (rectAfter.top != rect.top) + return flattenV(rectAfter, rectAfter.left < rectBefore.left); + } + } + return rect; + } else { + let from2 = offset2, to = offset2, takeSide = side < 0 ? 1 : -1; + if (side < 0 && !offset2) { + to++; + takeSide = -1; + } else if (side >= 0 && offset2 == node.nodeValue.length) { + from2--; + takeSide = 1; + } else if (side < 0) { + from2--; + } else { + to++; + } + return flattenV(singleRect(textRange(node, from2, to), takeSide), takeSide < 0); + } + } + let $dom = view.state.doc.resolve(pos - (atom || 0)); + if (!$dom.parent.inlineContent) { + if (atom == null && offset2 && (side < 0 || offset2 == nodeSize(node))) { + let before = node.childNodes[offset2 - 1]; + if (before.nodeType == 1) + return flattenH(before.getBoundingClientRect(), false); + } + if (atom == null && offset2 < nodeSize(node)) { + let after = node.childNodes[offset2]; + if (after.nodeType == 1) + return flattenH(after.getBoundingClientRect(), true); + } + return flattenH(node.getBoundingClientRect(), side >= 0); + } + if (atom == null && offset2 && (side < 0 || offset2 == nodeSize(node))) { + let before = node.childNodes[offset2 - 1]; + let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1)) : before.nodeType == 1 && (before.nodeName != "BR" || !before.nextSibling) ? before : null; + if (target) + return flattenV(singleRect(target, 1), false); + } + if (atom == null && offset2 < nodeSize(node)) { + let after = node.childNodes[offset2]; + while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords) + after = after.nextSibling; + let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, supportEmptyRange ? 0 : 1) : after.nodeType == 1 ? after : null; + if (target) + return flattenV(singleRect(target, -1), true); + } + return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0); +} +function flattenV(rect, left2) { + if (rect.width == 0) + return rect; + let x = left2 ? rect.left : rect.right; + return { top: rect.top, bottom: rect.bottom, left: x, right: x }; +} +function flattenH(rect, top2) { + if (rect.height == 0) + return rect; + let y = top2 ? rect.top : rect.bottom; + return { top: y, bottom: y, left: rect.left, right: rect.right }; +} +function withFlushedState(view, state, f) { + let viewState = view.state, active = view.root.activeElement; + if (viewState != state) + view.updateState(state); + if (active != view.dom) + view.focus(); + try { + return f(); + } finally { + if (viewState != state) + view.updateState(viewState); + if (active != view.dom && active) + active.focus(); + } +} +function endOfTextblockVertical(view, state, dir) { + let sel = state.selection; + let $pos = dir == "up" ? sel.$from : sel.$to; + return withFlushedState(view, state, () => { + let { node: dom } = view.docView.domFromPos($pos.pos, dir == "up" ? -1 : 1); + for (; ; ) { + let nearest = view.docView.nearestDesc(dom, true); + if (!nearest) + break; + if (nearest.node.isBlock) { + dom = nearest.contentDOM || nearest.dom; + break; + } + dom = nearest.dom.parentNode; + } + let coords = coordsAtPos(view, $pos.pos, 1); + for (let child = dom.firstChild; child; child = child.nextSibling) { + let boxes; + if (child.nodeType == 1) + boxes = child.getClientRects(); + else if (child.nodeType == 3) + boxes = textRange(child, 0, child.nodeValue.length).getClientRects(); + else + continue; + for (let i = 0; i < boxes.length; i++) { + let box = boxes[i]; + if (box.bottom > box.top + 1 && (dir == "up" ? coords.top - box.top > (box.bottom - coords.top) * 2 : box.bottom - coords.bottom > (coords.bottom - box.top) * 2)) + return false; + } + } + return true; + }); +} +var maybeRTL = /[\u0590-\u08ac]/; +function endOfTextblockHorizontal(view, state, dir) { + let { $head } = state.selection; + if (!$head.parent.isTextblock) + return false; + let offset2 = $head.parentOffset, atStart = !offset2, atEnd = offset2 == $head.parent.content.size; + let sel = view.domSelection(); + if (!maybeRTL.test($head.parent.textContent) || !sel.modify) + return dir == "left" || dir == "backward" ? atStart : atEnd; + return withFlushedState(view, state, () => { + let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange(); + let oldBidiLevel = sel.caretBidiLevel; + sel.modify("move", dir, "character"); + let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom; + let { focusNode: newNode2, focusOffset: newOff } = view.domSelectionRange(); + let result = newNode2 && !parentDOM.contains(newNode2.nodeType == 1 ? newNode2 : newNode2.parentNode) || oldNode == newNode2 && oldOff == newOff; + try { + sel.collapse(anchorNode, anchorOffset); + if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend) + sel.extend(oldNode, oldOff); + } catch (_) { + } + if (oldBidiLevel != null) + sel.caretBidiLevel = oldBidiLevel; + return result; + }); +} +var cachedState = null; +var cachedDir = null; +var cachedResult = false; +function endOfTextblock(view, state, dir) { + if (cachedState == state && cachedDir == dir) + return cachedResult; + cachedState = state; + cachedDir = dir; + return cachedResult = dir == "up" || dir == "down" ? endOfTextblockVertical(view, state, dir) : endOfTextblockHorizontal(view, state, dir); +} +var NOT_DIRTY = 0; +var CHILD_DIRTY = 1; +var CONTENT_DIRTY = 2; +var NODE_DIRTY = 3; +var ViewDesc = class { + constructor(parent, children, dom, contentDOM) { + this.parent = parent; + this.children = children; + this.dom = dom; + this.contentDOM = contentDOM; + this.dirty = NOT_DIRTY; + dom.pmViewDesc = this; + } + // Used to check whether a given description corresponds to a + // widget/mark/node. + matchesWidget(widget) { + return false; + } + matchesMark(mark) { + return false; + } + matchesNode(node, outerDeco, innerDeco) { + return false; + } + matchesHack(nodeName) { + return false; + } + // When parsing in-editor content (in domchange.js), we allow + // descriptions to determine the parse rules that should be used to + // parse them. + parseRule() { + return null; + } + // Used by the editor's event handler to ignore events that come + // from certain descs. + stopEvent(event) { + return false; + } + // The size of the content represented by this desc. + get size() { + let size = 0; + for (let i = 0; i < this.children.length; i++) + size += this.children[i].size; + return size; + } + // For block nodes, this represents the space taken up by their + // start/end tokens. + get border() { + return 0; + } + destroy() { + this.parent = void 0; + if (this.dom.pmViewDesc == this) + this.dom.pmViewDesc = void 0; + for (let i = 0; i < this.children.length; i++) + this.children[i].destroy(); + } + posBeforeChild(child) { + for (let i = 0, pos = this.posAtStart; ; i++) { + let cur = this.children[i]; + if (cur == child) + return pos; + pos += cur.size; + } + } + get posBefore() { + return this.parent.posBeforeChild(this); + } + get posAtStart() { + return this.parent ? this.parent.posBeforeChild(this) + this.border : 0; + } + get posAfter() { + return this.posBefore + this.size; + } + get posAtEnd() { + return this.posAtStart + this.size - 2 * this.border; + } + localPosFromDOM(dom, offset2, bias) { + if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) { + if (bias < 0) { + let domBefore, desc; + if (dom == this.contentDOM) { + domBefore = dom.childNodes[offset2 - 1]; + } else { + while (dom.parentNode != this.contentDOM) + dom = dom.parentNode; + domBefore = dom.previousSibling; + } + while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this)) + domBefore = domBefore.previousSibling; + return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart; + } else { + let domAfter, desc; + if (dom == this.contentDOM) { + domAfter = dom.childNodes[offset2]; + } else { + while (dom.parentNode != this.contentDOM) + dom = dom.parentNode; + domAfter = dom.nextSibling; + } + while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this)) + domAfter = domAfter.nextSibling; + return domAfter ? this.posBeforeChild(desc) : this.posAtEnd; + } + } + let atEnd; + if (dom == this.dom && this.contentDOM) { + atEnd = offset2 > domIndex(this.contentDOM); + } else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) { + atEnd = dom.compareDocumentPosition(this.contentDOM) & 2; + } else if (this.dom.firstChild) { + if (offset2 == 0) + for (let search = dom; ; search = search.parentNode) { + if (search == this.dom) { + atEnd = false; + break; + } + if (search.previousSibling) + break; + } + if (atEnd == null && offset2 == dom.childNodes.length) + for (let search = dom; ; search = search.parentNode) { + if (search == this.dom) { + atEnd = true; + break; + } + if (search.nextSibling) + break; + } + } + return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart; + } + nearestDesc(dom, onlyNodes = false) { + for (let first2 = true, cur = dom; cur; cur = cur.parentNode) { + let desc = this.getDesc(cur), nodeDOM; + if (desc && (!onlyNodes || desc.node)) { + if (first2 && (nodeDOM = desc.nodeDOM) && !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom)) + first2 = false; + else + return desc; + } + } + } + getDesc(dom) { + let desc = dom.pmViewDesc; + for (let cur = desc; cur; cur = cur.parent) + if (cur == this) + return desc; + } + posFromDOM(dom, offset2, bias) { + for (let scan = dom; scan; scan = scan.parentNode) { + let desc = this.getDesc(scan); + if (desc) + return desc.localPosFromDOM(dom, offset2, bias); + } + return -1; + } + // Find the desc for the node after the given pos, if any. (When a + // parent node overrode rendering, there might not be one.) + descAt(pos) { + for (let i = 0, offset2 = 0; i < this.children.length; i++) { + let child = this.children[i], end2 = offset2 + child.size; + if (offset2 == pos && end2 != offset2) { + while (!child.border && child.children.length) + child = child.children[0]; + return child; + } + if (pos < end2) + return child.descAt(pos - offset2 - child.border); + offset2 = end2; + } + } + domFromPos(pos, side) { + if (!this.contentDOM) + return { node: this.dom, offset: 0, atom: pos + 1 }; + let i = 0, offset2 = 0; + for (let curPos = 0; i < this.children.length; i++) { + let child = this.children[i], end2 = curPos + child.size; + if (end2 > pos || child instanceof TrailingHackViewDesc) { + offset2 = pos - curPos; + break; + } + curPos = end2; + } + if (offset2) + return this.children[i].domFromPos(offset2 - this.children[i].border, side); + for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { + } + if (side <= 0) { + let prev, enter2 = true; + for (; ; i--, enter2 = false) { + prev = i ? this.children[i - 1] : null; + if (!prev || prev.dom.parentNode == this.contentDOM) + break; + } + if (prev && side && enter2 && !prev.border && !prev.domAtom) + return prev.domFromPos(prev.size, side); + return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 }; + } else { + let next, enter2 = true; + for (; ; i++, enter2 = false) { + next = i < this.children.length ? this.children[i] : null; + if (!next || next.dom.parentNode == this.contentDOM) + break; + } + if (next && enter2 && !next.border && !next.domAtom) + return next.domFromPos(0, side); + return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length }; + } + } + // Used to find a DOM range in a single parent for a given changed + // range. + parseRange(from2, to, base2 = 0) { + if (this.children.length == 0) + return { node: this.contentDOM, from: from2, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length }; + let fromOffset = -1, toOffset = -1; + for (let offset2 = base2, i = 0; ; i++) { + let child = this.children[i], end2 = offset2 + child.size; + if (fromOffset == -1 && from2 <= end2) { + let childBase = offset2 + child.border; + if (from2 >= childBase && to <= end2 - child.border && child.node && child.contentDOM && this.contentDOM.contains(child.contentDOM)) + return child.parseRange(from2, to, childBase); + from2 = offset2; + for (let j = i; j > 0; j--) { + let prev = this.children[j - 1]; + if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) { + fromOffset = domIndex(prev.dom) + 1; + break; + } + from2 -= prev.size; + } + if (fromOffset == -1) + fromOffset = 0; + } + if (fromOffset > -1 && (end2 > to || i == this.children.length - 1)) { + to = end2; + for (let j = i + 1; j < this.children.length; j++) { + let next = this.children[j]; + if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) { + toOffset = domIndex(next.dom); + break; + } + to += next.size; + } + if (toOffset == -1) + toOffset = this.contentDOM.childNodes.length; + break; + } + offset2 = end2; + } + return { node: this.contentDOM, from: from2, to, fromOffset, toOffset }; + } + emptyChildAt(side) { + if (this.border || !this.contentDOM || !this.children.length) + return false; + let child = this.children[side < 0 ? 0 : this.children.length - 1]; + return child.size == 0 || child.emptyChildAt(side); + } + domAfterPos(pos) { + let { node, offset: offset2 } = this.domFromPos(pos, 0); + if (node.nodeType != 1 || offset2 == node.childNodes.length) + throw new RangeError("No node after pos " + pos); + return node.childNodes[offset2]; + } + // View descs are responsible for setting any selection that falls + // entirely inside of them, so that custom implementations can do + // custom things with the selection. Note that this falls apart when + // a selection starts in such a node and ends in another, in which + // case we just use whatever domFromPos produces as a best effort. + setSelection(anchor, head, root, force = false) { + let from2 = Math.min(anchor, head), to = Math.max(anchor, head); + for (let i = 0, offset2 = 0; i < this.children.length; i++) { + let child = this.children[i], end2 = offset2 + child.size; + if (from2 > offset2 && to < end2) + return child.setSelection(anchor - offset2 - child.border, head - offset2 - child.border, root, force); + offset2 = end2; + } + let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1); + let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1); + let domSel = root.getSelection(); + let brKludge = false; + if ((gecko || safari) && anchor == head) { + let { node, offset: offset2 } = anchorDOM; + if (node.nodeType == 3) { + brKludge = !!(offset2 && node.nodeValue[offset2 - 1] == "\n"); + if (brKludge && offset2 == node.nodeValue.length) { + for (let scan = node, after; scan; scan = scan.parentNode) { + if (after = scan.nextSibling) { + if (after.nodeName == "BR") + anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 }; + break; + } + let desc = scan.pmViewDesc; + if (desc && desc.node && desc.node.isBlock) + break; + } + } + } else { + let prev = node.childNodes[offset2 - 1]; + brKludge = prev && (prev.nodeName == "BR" || prev.contentEditable == "false"); + } + } + if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) { + let after = domSel.focusNode.childNodes[domSel.focusOffset]; + if (after && after.contentEditable == "false") + force = true; + } + if (!(force || brKludge && safari) && isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) && isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset)) + return; + let domSelExtended = false; + if ((domSel.extend || anchor == head) && !brKludge) { + domSel.collapse(anchorDOM.node, anchorDOM.offset); + try { + if (anchor != head) + domSel.extend(headDOM.node, headDOM.offset); + domSelExtended = true; + } catch (_) { + } + } + if (!domSelExtended) { + if (anchor > head) { + let tmp = anchorDOM; + anchorDOM = headDOM; + headDOM = tmp; + } + let range = document.createRange(); + range.setEnd(headDOM.node, headDOM.offset); + range.setStart(anchorDOM.node, anchorDOM.offset); + domSel.removeAllRanges(); + domSel.addRange(range); + } + } + ignoreMutation(mutation) { + return !this.contentDOM && mutation.type != "selection"; + } + get contentLost() { + return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM); + } + // Remove a subtree of the element tree that has been touched + // by a DOM change, so that the next update will redraw it. + markDirty(from2, to) { + for (let offset2 = 0, i = 0; i < this.children.length; i++) { + let child = this.children[i], end2 = offset2 + child.size; + if (offset2 == end2 ? from2 <= end2 && to >= offset2 : from2 < end2 && to > offset2) { + let startInside = offset2 + child.border, endInside = end2 - child.border; + if (from2 >= startInside && to <= endInside) { + this.dirty = from2 == offset2 || to == end2 ? CONTENT_DIRTY : CHILD_DIRTY; + if (from2 == startInside && to == endInside && (child.contentLost || child.dom.parentNode != this.contentDOM)) + child.dirty = NODE_DIRTY; + else + child.markDirty(from2 - startInside, to - startInside); + return; + } else { + child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length ? CONTENT_DIRTY : NODE_DIRTY; + } + } + offset2 = end2; + } + this.dirty = CONTENT_DIRTY; + } + markParentsDirty() { + let level = 1; + for (let node = this.parent; node; node = node.parent, level++) { + let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY; + if (node.dirty < dirty) + node.dirty = dirty; + } + } + get domAtom() { + return false; + } + get ignoreForCoords() { + return false; + } +}; +var WidgetViewDesc = class extends ViewDesc { + constructor(parent, widget, view, pos) { + let self2, dom = widget.type.toDOM; + if (typeof dom == "function") + dom = dom(view, () => { + if (!self2) + return pos; + if (self2.parent) + return self2.parent.posBeforeChild(self2); + }); + if (!widget.type.spec.raw) { + if (dom.nodeType != 1) { + let wrap2 = document.createElement("span"); + wrap2.appendChild(dom); + dom = wrap2; + } + dom.contentEditable = "false"; + dom.classList.add("ProseMirror-widget"); + } + super(parent, [], dom, null); + this.widget = widget; + this.widget = widget; + self2 = this; + } + matchesWidget(widget) { + return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type); + } + parseRule() { + return { ignore: true }; + } + stopEvent(event) { + let stop = this.widget.spec.stopEvent; + return stop ? stop(event) : false; + } + ignoreMutation(mutation) { + return mutation.type != "selection" || this.widget.spec.ignoreSelection; + } + destroy() { + this.widget.type.destroy(this.dom); + super.destroy(); + } + get domAtom() { + return true; + } + get side() { + return this.widget.type.side; + } +}; +var CompositionViewDesc = class extends ViewDesc { + constructor(parent, dom, textDOM, text) { + super(parent, [], dom, null); + this.textDOM = textDOM; + this.text = text; + } + get size() { + return this.text.length; + } + localPosFromDOM(dom, offset2) { + if (dom != this.textDOM) + return this.posAtStart + (offset2 ? this.size : 0); + return this.posAtStart + offset2; + } + domFromPos(pos) { + return { node: this.textDOM, offset: pos }; + } + ignoreMutation(mut) { + return mut.type === "characterData" && mut.target.nodeValue == mut.oldValue; + } +}; +var MarkViewDesc = class _MarkViewDesc extends ViewDesc { + constructor(parent, mark, dom, contentDOM) { + super(parent, [], dom, contentDOM); + this.mark = mark; + } + static create(parent, mark, inline, view) { + let custom = view.nodeViews[mark.type.name]; + let spec = custom && custom(mark, view, inline); + if (!spec || !spec.dom) + spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline)); + return new _MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom); + } + parseRule() { + if (this.dirty & NODE_DIRTY || this.mark.type.spec.reparseInView) + return null; + return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM }; + } + matchesMark(mark) { + return this.dirty != NODE_DIRTY && this.mark.eq(mark); + } + markDirty(from2, to) { + super.markDirty(from2, to); + if (this.dirty != NOT_DIRTY) { + let parent = this.parent; + while (!parent.node) + parent = parent.parent; + if (parent.dirty < this.dirty) + parent.dirty = this.dirty; + this.dirty = NOT_DIRTY; + } + } + slice(from2, to, view) { + let copy2 = _MarkViewDesc.create(this.parent, this.mark, true, view); + let nodes = this.children, size = this.size; + if (to < size) + nodes = replaceNodes(nodes, to, size, view); + if (from2 > 0) + nodes = replaceNodes(nodes, 0, from2, view); + for (let i = 0; i < nodes.length; i++) + nodes[i].parent = copy2; + copy2.children = nodes; + return copy2; + } +}; +var NodeViewDesc = class _NodeViewDesc extends ViewDesc { + constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) { + super(parent, [], dom, contentDOM); + this.node = node; + this.outerDeco = outerDeco; + this.innerDeco = innerDeco; + this.nodeDOM = nodeDOM; + } + // By default, a node is rendered using the `toDOM` method from the + // node type spec. But client code can use the `nodeViews` spec to + // supply a custom node view, which can influence various aspects of + // the way the node works. + // + // (Using subclassing for this was intentionally decided against, + // since it'd require exposing a whole slew of finicky + // implementation details to the user code that they probably will + // never need.) + static create(parent, node, outerDeco, innerDeco, view, pos) { + let custom = view.nodeViews[node.type.name], descObj; + let spec = custom && custom(node, view, () => { + if (!descObj) + return pos; + if (descObj.parent) + return descObj.parent.posBeforeChild(descObj); + }, outerDeco, innerDeco); + let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM; + if (node.isText) { + if (!dom) + dom = document.createTextNode(node.text); + else if (dom.nodeType != 3) + throw new RangeError("Text must be rendered as a DOM text node"); + } else if (!dom) { + ({ dom, contentDOM } = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node))); + } + if (!contentDOM && !node.isText && dom.nodeName != "BR") { + if (!dom.hasAttribute("contenteditable")) + dom.contentEditable = "false"; + if (node.type.spec.draggable) + dom.draggable = true; + } + let nodeDOM = dom; + dom = applyOuterDeco(dom, outerDeco, node); + if (spec) + return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1); + else if (node.isText) + return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view); + else + return new _NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1); + } + parseRule() { + if (this.node.type.spec.reparseInView) + return null; + let rule = { node: this.node.type.name, attrs: this.node.attrs }; + if (this.node.type.whitespace == "pre") + rule.preserveWhitespace = "full"; + if (!this.contentDOM) { + rule.getContent = () => this.node.content; + } else if (!this.contentLost) { + rule.contentElement = this.contentDOM; + } else { + for (let i = this.children.length - 1; i >= 0; i--) { + let child = this.children[i]; + if (this.dom.contains(child.dom.parentNode)) { + rule.contentElement = child.dom.parentNode; + break; + } + } + if (!rule.contentElement) + rule.getContent = () => Fragment.empty; + } + return rule; + } + matchesNode(node, outerDeco, innerDeco) { + return this.dirty == NOT_DIRTY && node.eq(this.node) && sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco); + } + get size() { + return this.node.nodeSize; + } + get border() { + return this.node.isLeaf ? 0 : 1; + } + // Syncs `this.children` to match `this.node.content` and the local + // decorations, possibly introducing nesting for marks. Then, in a + // separate step, syncs the DOM inside `this.contentDOM` to + // `this.children`. + updateChildren(view, pos) { + let inline = this.node.inlineContent, off = pos; + let composition = view.composing ? this.localCompositionInfo(view, pos) : null; + let localComposition = composition && composition.pos > -1 ? composition : null; + let compositionInChild = composition && composition.pos < 0; + let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view); + iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => { + if (widget.spec.marks) + updater.syncToMarks(widget.spec.marks, inline, view); + else if (widget.type.side >= 0 && !insideNode) + updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view); + updater.placeWidget(widget, view, off); + }, (child, outerDeco, innerDeco, i) => { + updater.syncToMarks(child.marks, inline, view); + let compIndex; + if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) + ; + else if (compositionInChild && view.state.selection.from > off && view.state.selection.to < off + child.nodeSize && (compIndex = updater.findIndexWithChild(composition.node)) > -1 && updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) + ; + else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) + ; + else { + updater.addNode(child, outerDeco, innerDeco, view, off); + } + off += child.nodeSize; + }); + updater.syncToMarks([], inline, view); + if (this.node.isTextblock) + updater.addTextblockHacks(); + updater.destroyRest(); + if (updater.changed || this.dirty == CONTENT_DIRTY) { + if (localComposition) + this.protectLocalComposition(view, localComposition); + renderDescs(this.contentDOM, this.children, view); + if (ios) + iosHacks(this.dom); + } + } + localCompositionInfo(view, pos) { + let { from: from2, to } = view.state.selection; + if (!(view.state.selection instanceof TextSelection) || from2 < pos || to > pos + this.node.content.size) + return null; + let sel = view.domSelectionRange(); + let textNode = nearbyTextNode(sel.focusNode, sel.focusOffset); + if (!textNode || !this.dom.contains(textNode.parentNode)) + return null; + if (this.node.inlineContent) { + let text = textNode.nodeValue; + let textPos = findTextInFragment(this.node.content, text, from2 - pos, to - pos); + return textPos < 0 ? null : { node: textNode, pos: textPos, text }; + } else { + return { node: textNode, pos: -1, text: "" }; + } + } + protectLocalComposition(view, { node, pos, text }) { + if (this.getDesc(node)) + return; + let topNode = node; + for (; ; topNode = topNode.parentNode) { + if (topNode.parentNode == this.contentDOM) + break; + while (topNode.previousSibling) + topNode.parentNode.removeChild(topNode.previousSibling); + while (topNode.nextSibling) + topNode.parentNode.removeChild(topNode.nextSibling); + if (topNode.pmViewDesc) + topNode.pmViewDesc = void 0; + } + let desc = new CompositionViewDesc(this, topNode, node, text); + view.input.compositionNodes.push(desc); + this.children = replaceNodes(this.children, pos, pos + text.length, view, desc); + } + // If this desc must be updated to match the given node decoration, + // do so and return true. + update(node, outerDeco, innerDeco, view) { + if (this.dirty == NODE_DIRTY || !node.sameMarkup(this.node)) + return false; + this.updateInner(node, outerDeco, innerDeco, view); + return true; + } + updateInner(node, outerDeco, innerDeco, view) { + this.updateOuterDeco(outerDeco); + this.node = node; + this.innerDeco = innerDeco; + if (this.contentDOM) + this.updateChildren(view, this.posAtStart); + this.dirty = NOT_DIRTY; + } + updateOuterDeco(outerDeco) { + if (sameOuterDeco(outerDeco, this.outerDeco)) + return; + let needsWrap = this.nodeDOM.nodeType != 1; + let oldDOM = this.dom; + this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap)); + if (this.dom != oldDOM) { + oldDOM.pmViewDesc = void 0; + this.dom.pmViewDesc = this; + } + this.outerDeco = outerDeco; + } + // Mark this node as being the selected node. + selectNode() { + if (this.nodeDOM.nodeType == 1) + this.nodeDOM.classList.add("ProseMirror-selectednode"); + if (this.contentDOM || !this.node.type.spec.draggable) + this.dom.draggable = true; + } + // Remove selected node marking from this node. + deselectNode() { + if (this.nodeDOM.nodeType == 1) + this.nodeDOM.classList.remove("ProseMirror-selectednode"); + if (this.contentDOM || !this.node.type.spec.draggable) + this.dom.removeAttribute("draggable"); + } + get domAtom() { + return this.node.isAtom; + } +}; +function docViewDesc(doc3, outerDeco, innerDeco, dom, view) { + applyOuterDeco(dom, outerDeco, doc3); + let docView = new NodeViewDesc(void 0, doc3, outerDeco, innerDeco, dom, dom, dom, view, 0); + if (docView.contentDOM) + docView.updateChildren(view, 0); + return docView; +} +var TextViewDesc = class _TextViewDesc extends NodeViewDesc { + constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) { + super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0); + } + parseRule() { + let skip = this.nodeDOM.parentNode; + while (skip && skip != this.dom && !skip.pmIsDeco) + skip = skip.parentNode; + return { skip: skip || true }; + } + update(node, outerDeco, innerDeco, view) { + if (this.dirty == NODE_DIRTY || this.dirty != NOT_DIRTY && !this.inParent() || !node.sameMarkup(this.node)) + return false; + this.updateOuterDeco(outerDeco); + if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) { + this.nodeDOM.nodeValue = node.text; + if (view.trackWrites == this.nodeDOM) + view.trackWrites = null; + } + this.node = node; + this.dirty = NOT_DIRTY; + return true; + } + inParent() { + let parentDOM = this.parent.contentDOM; + for (let n = this.nodeDOM; n; n = n.parentNode) + if (n == parentDOM) + return true; + return false; + } + domFromPos(pos) { + return { node: this.nodeDOM, offset: pos }; + } + localPosFromDOM(dom, offset2, bias) { + if (dom == this.nodeDOM) + return this.posAtStart + Math.min(offset2, this.node.text.length); + return super.localPosFromDOM(dom, offset2, bias); + } + ignoreMutation(mutation) { + return mutation.type != "characterData" && mutation.type != "selection"; + } + slice(from2, to, view) { + let node = this.node.cut(from2, to), dom = document.createTextNode(node.text); + return new _TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view); + } + markDirty(from2, to) { + super.markDirty(from2, to); + if (this.dom != this.nodeDOM && (from2 == 0 || to == this.nodeDOM.nodeValue.length)) + this.dirty = NODE_DIRTY; + } + get domAtom() { + return false; + } +}; +var TrailingHackViewDesc = class extends ViewDesc { + parseRule() { + return { ignore: true }; + } + matchesHack(nodeName) { + return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; + } + get domAtom() { + return true; + } + get ignoreForCoords() { + return this.dom.nodeName == "IMG"; + } +}; +var CustomNodeViewDesc = class extends NodeViewDesc { + constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) { + super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos); + this.spec = spec; + } + // A custom `update` method gets to decide whether the update goes + // through. If it does, and there's a `contentDOM` node, our logic + // updates the children. + update(node, outerDeco, innerDeco, view) { + if (this.dirty == NODE_DIRTY) + return false; + if (this.spec.update) { + let result = this.spec.update(node, outerDeco, innerDeco); + if (result) + this.updateInner(node, outerDeco, innerDeco, view); + return result; + } else if (!this.contentDOM && !node.isLeaf) { + return false; + } else { + return super.update(node, outerDeco, innerDeco, view); + } + } + selectNode() { + this.spec.selectNode ? this.spec.selectNode() : super.selectNode(); + } + deselectNode() { + this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode(); + } + setSelection(anchor, head, root, force) { + this.spec.setSelection ? this.spec.setSelection(anchor, head, root) : super.setSelection(anchor, head, root, force); + } + destroy() { + if (this.spec.destroy) + this.spec.destroy(); + super.destroy(); + } + stopEvent(event) { + return this.spec.stopEvent ? this.spec.stopEvent(event) : false; + } + ignoreMutation(mutation) { + return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation); + } +}; +function renderDescs(parentDOM, descs, view) { + let dom = parentDOM.firstChild, written = false; + for (let i = 0; i < descs.length; i++) { + let desc = descs[i], childDOM = desc.dom; + if (childDOM.parentNode == parentDOM) { + while (childDOM != dom) { + dom = rm(dom); + written = true; + } + dom = dom.nextSibling; + } else { + written = true; + parentDOM.insertBefore(childDOM, dom); + } + if (desc instanceof MarkViewDesc) { + let pos = dom ? dom.previousSibling : parentDOM.lastChild; + renderDescs(desc.contentDOM, desc.children, view); + dom = pos ? pos.nextSibling : parentDOM.firstChild; + } + } + while (dom) { + dom = rm(dom); + written = true; + } + if (written && view.trackWrites == parentDOM) + view.trackWrites = null; +} +var OuterDecoLevel = function(nodeName) { + if (nodeName) + this.nodeName = nodeName; +}; +OuterDecoLevel.prototype = /* @__PURE__ */ Object.create(null); +var noDeco = [new OuterDecoLevel()]; +function computeOuterDeco(outerDeco, node, needsWrap) { + if (outerDeco.length == 0) + return noDeco; + let top2 = needsWrap ? noDeco[0] : new OuterDecoLevel(), result = [top2]; + for (let i = 0; i < outerDeco.length; i++) { + let attrs = outerDeco[i].type.attrs; + if (!attrs) + continue; + if (attrs.nodeName) + result.push(top2 = new OuterDecoLevel(attrs.nodeName)); + for (let name in attrs) { + let val = attrs[name]; + if (val == null) + continue; + if (needsWrap && result.length == 1) + result.push(top2 = new OuterDecoLevel(node.isInline ? "span" : "div")); + if (name == "class") + top2.class = (top2.class ? top2.class + " " : "") + val; + else if (name == "style") + top2.style = (top2.style ? top2.style + ";" : "") + val; + else if (name != "nodeName") + top2[name] = val; + } + } + return result; +} +function patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) { + if (prevComputed == noDeco && curComputed == noDeco) + return nodeDOM; + let curDOM = nodeDOM; + for (let i = 0; i < curComputed.length; i++) { + let deco = curComputed[i], prev = prevComputed[i]; + if (i) { + let parent; + if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM && (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) { + curDOM = parent; + } else { + parent = document.createElement(deco.nodeName); + parent.pmIsDeco = true; + parent.appendChild(curDOM); + prev = noDeco[0]; + curDOM = parent; + } + } + patchAttributes(curDOM, prev || noDeco[0], deco); + } + return curDOM; +} +function patchAttributes(dom, prev, cur) { + for (let name in prev) + if (name != "class" && name != "style" && name != "nodeName" && !(name in cur)) + dom.removeAttribute(name); + for (let name in cur) + if (name != "class" && name != "style" && name != "nodeName" && cur[name] != prev[name]) + dom.setAttribute(name, cur[name]); + if (prev.class != cur.class) { + let prevList = prev.class ? prev.class.split(" ").filter(Boolean) : []; + let curList = cur.class ? cur.class.split(" ").filter(Boolean) : []; + for (let i = 0; i < prevList.length; i++) + if (curList.indexOf(prevList[i]) == -1) + dom.classList.remove(prevList[i]); + for (let i = 0; i < curList.length; i++) + if (prevList.indexOf(curList[i]) == -1) + dom.classList.add(curList[i]); + if (dom.classList.length == 0) + dom.removeAttribute("class"); + } + if (prev.style != cur.style) { + if (prev.style) { + let prop = /\s*([\w\-\xa1-\uffff]+)\s*:(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*'|\(.*?\)|[^;])*/g, m; + while (m = prop.exec(prev.style)) + dom.style.removeProperty(m[1]); + } + if (cur.style) + dom.style.cssText += cur.style; + } +} +function applyOuterDeco(dom, deco, node) { + return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1)); +} +function sameOuterDeco(a, b) { + if (a.length != b.length) + return false; + for (let i = 0; i < a.length; i++) + if (!a[i].type.eq(b[i].type)) + return false; + return true; +} +function rm(dom) { + let next = dom.nextSibling; + dom.parentNode.removeChild(dom); + return next; +} +var ViewTreeUpdater = class { + constructor(top2, lock, view) { + this.lock = lock; + this.view = view; + this.index = 0; + this.stack = []; + this.changed = false; + this.top = top2; + this.preMatch = preMatch(top2.node.content, top2); + } + // Destroy and remove the children between the given indices in + // `this.top`. + destroyBetween(start2, end2) { + if (start2 == end2) + return; + for (let i = start2; i < end2; i++) + this.top.children[i].destroy(); + this.top.children.splice(start2, end2 - start2); + this.changed = true; + } + // Destroy all remaining children in `this.top`. + destroyRest() { + this.destroyBetween(this.index, this.top.children.length); + } + // Sync the current stack of mark descs with the given array of + // marks, reusing existing mark descs when possible. + syncToMarks(marks, inline, view) { + let keep = 0, depth = this.stack.length >> 1; + let maxKeep = Math.min(depth, marks.length); + while (keep < maxKeep && (keep == depth - 1 ? this.top : this.stack[keep + 1 << 1]).matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false) + keep++; + while (keep < depth) { + this.destroyRest(); + this.top.dirty = NOT_DIRTY; + this.index = this.stack.pop(); + this.top = this.stack.pop(); + depth--; + } + while (depth < marks.length) { + this.stack.push(this.top, this.index + 1); + let found2 = -1; + for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) { + let next = this.top.children[i]; + if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) { + found2 = i; + break; + } + } + if (found2 > -1) { + if (found2 > this.index) { + this.changed = true; + this.destroyBetween(this.index, found2); + } + this.top = this.top.children[this.index]; + } else { + let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view); + this.top.children.splice(this.index, 0, markDesc); + this.top = markDesc; + this.changed = true; + } + this.index = 0; + depth++; + } + } + // Try to find a node desc matching the given data. Skip over it and + // return true when successful. + findNodeMatch(node, outerDeco, innerDeco, index) { + let found2 = -1, targetDesc; + if (index >= this.preMatch.index && (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top && targetDesc.matchesNode(node, outerDeco, innerDeco)) { + found2 = this.top.children.indexOf(targetDesc, this.index); + } else { + for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) { + let child = this.top.children[i]; + if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) { + found2 = i; + break; + } + } + } + if (found2 < 0) + return false; + this.destroyBetween(this.index, found2); + this.index++; + return true; + } + updateNodeAt(node, outerDeco, innerDeco, index, view) { + let child = this.top.children[index]; + if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM) + child.dirty = CONTENT_DIRTY; + if (!child.update(node, outerDeco, innerDeco, view)) + return false; + this.destroyBetween(this.index, index); + this.index++; + return true; + } + findIndexWithChild(domNode) { + for (; ; ) { + let parent = domNode.parentNode; + if (!parent) + return -1; + if (parent == this.top.contentDOM) { + let desc = domNode.pmViewDesc; + if (desc) + for (let i = this.index; i < this.top.children.length; i++) { + if (this.top.children[i] == desc) + return i; + } + return -1; + } + domNode = parent; + } + } + // Try to update the next node, if any, to the given data. Checks + // pre-matches to avoid overwriting nodes that could still be used. + updateNextNode(node, outerDeco, innerDeco, view, index, pos) { + for (let i = this.index; i < this.top.children.length; i++) { + let next = this.top.children[i]; + if (next instanceof NodeViewDesc) { + let preMatch2 = this.preMatch.matched.get(next); + if (preMatch2 != null && preMatch2 != index) + return false; + let nextDOM = next.dom, updated; + let locked = this.isLocked(nextDOM) && !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text && next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco)); + if (!locked && next.update(node, outerDeco, innerDeco, view)) { + this.destroyBetween(this.index, i); + if (next.dom != nextDOM) + this.changed = true; + this.index++; + return true; + } else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) { + this.top.children[this.index] = updated; + if (updated.contentDOM) { + updated.dirty = CONTENT_DIRTY; + updated.updateChildren(view, pos + 1); + updated.dirty = NOT_DIRTY; + } + this.changed = true; + this.index++; + return true; + } + break; + } + } + return false; + } + // When a node with content is replaced by a different node with + // identical content, move over its children. + recreateWrapper(next, node, outerDeco, innerDeco, view, pos) { + if (next.dirty || node.isAtom || !next.children.length || !next.node.content.eq(node.content)) + return null; + let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos); + if (wrapper.contentDOM) { + wrapper.children = next.children; + next.children = []; + for (let ch of wrapper.children) + ch.parent = wrapper; + } + next.destroy(); + return wrapper; + } + // Insert the node as a newly created node desc. + addNode(node, outerDeco, innerDeco, view, pos) { + let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos); + if (desc.contentDOM) + desc.updateChildren(view, pos + 1); + this.top.children.splice(this.index++, 0, desc); + this.changed = true; + } + placeWidget(widget, view, pos) { + let next = this.index < this.top.children.length ? this.top.children[this.index] : null; + if (next && next.matchesWidget(widget) && (widget == next.widget || !next.widget.type.toDOM.parentNode)) { + this.index++; + } else { + let desc = new WidgetViewDesc(this.top, widget, view, pos); + this.top.children.splice(this.index++, 0, desc); + this.changed = true; + } + } + // Make sure a textblock looks and behaves correctly in + // contentEditable. + addTextblockHacks() { + let lastChild = this.top.children[this.index - 1], parent = this.top; + while (lastChild instanceof MarkViewDesc) { + parent = lastChild; + lastChild = parent.children[parent.children.length - 1]; + } + if (!lastChild || // Empty textblock + !(lastChild instanceof TextViewDesc) || /\n$/.test(lastChild.node.text) || this.view.requiresGeckoHackNode && /\s$/.test(lastChild.node.text)) { + if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == "false") + this.addHackNode("IMG", parent); + this.addHackNode("BR", this.top); + } + } + addHackNode(nodeName, parent) { + if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) { + this.index++; + } else { + let dom = document.createElement(nodeName); + if (nodeName == "IMG") { + dom.className = "ProseMirror-separator"; + dom.alt = ""; + } + if (nodeName == "BR") + dom.className = "ProseMirror-trailingBreak"; + let hack = new TrailingHackViewDesc(this.top, [], dom, null); + if (parent != this.top) + parent.children.push(hack); + else + parent.children.splice(this.index++, 0, hack); + this.changed = true; + } + } + isLocked(node) { + return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode)); + } +}; +function preMatch(frag, parentDesc) { + let curDesc = parentDesc, descI = curDesc.children.length; + let fI = frag.childCount, matched = /* @__PURE__ */ new Map(), matches2 = []; + outer: + while (fI > 0) { + let desc; + for (; ; ) { + if (descI) { + let next = curDesc.children[descI - 1]; + if (next instanceof MarkViewDesc) { + curDesc = next; + descI = next.children.length; + } else { + desc = next; + descI--; + break; + } + } else if (curDesc == parentDesc) { + break outer; + } else { + descI = curDesc.parent.children.indexOf(curDesc); + curDesc = curDesc.parent; + } + } + let node = desc.node; + if (!node) + continue; + if (node != frag.child(fI - 1)) + break; + --fI; + matched.set(desc, fI); + matches2.push(desc); + } + return { index: fI, matched, matches: matches2.reverse() }; +} +function compareSide(a, b) { + return a.type.side - b.type.side; +} +function iterDeco(parent, deco, onWidget, onNode) { + let locals = deco.locals(parent), offset2 = 0; + if (locals.length == 0) { + for (let i = 0; i < parent.childCount; i++) { + let child = parent.child(i); + onNode(child, locals, deco.forChild(offset2, child), i); + offset2 += child.nodeSize; + } + return; + } + let decoIndex = 0, active = [], restNode = null; + for (let parentIndex = 0; ; ) { + let widget, widgets; + while (decoIndex < locals.length && locals[decoIndex].to == offset2) { + let next = locals[decoIndex++]; + if (next.widget) { + if (!widget) + widget = next; + else + (widgets || (widgets = [widget])).push(next); + } + } + if (widget) { + if (widgets) { + widgets.sort(compareSide); + for (let i = 0; i < widgets.length; i++) + onWidget(widgets[i], parentIndex, !!restNode); + } else { + onWidget(widget, parentIndex, !!restNode); + } + } + let child, index; + if (restNode) { + index = -1; + child = restNode; + restNode = null; + } else if (parentIndex < parent.childCount) { + index = parentIndex; + child = parent.child(parentIndex++); + } else { + break; + } + for (let i = 0; i < active.length; i++) + if (active[i].to <= offset2) + active.splice(i--, 1); + while (decoIndex < locals.length && locals[decoIndex].from <= offset2 && locals[decoIndex].to > offset2) + active.push(locals[decoIndex++]); + let end2 = offset2 + child.nodeSize; + if (child.isText) { + let cutAt = end2; + if (decoIndex < locals.length && locals[decoIndex].from < cutAt) + cutAt = locals[decoIndex].from; + for (let i = 0; i < active.length; i++) + if (active[i].to < cutAt) + cutAt = active[i].to; + if (cutAt < end2) { + restNode = child.cut(cutAt - offset2); + child = child.cut(0, cutAt - offset2); + end2 = cutAt; + index = -1; + } + } + let outerDeco = child.isInline && !child.isLeaf ? active.filter((d) => !d.inline) : active.slice(); + onNode(child, outerDeco, deco.forChild(offset2, child), index); + offset2 = end2; + } +} +function iosHacks(dom) { + if (dom.nodeName == "UL" || dom.nodeName == "OL") { + let oldCSS = dom.style.cssText; + dom.style.cssText = oldCSS + "; list-style: square !important"; + window.getComputedStyle(dom).listStyle; + dom.style.cssText = oldCSS; + } +} +function nearbyTextNode(node, offset2) { + for (; ; ) { + if (node.nodeType == 3) + return node; + if (node.nodeType == 1 && offset2 > 0) { + if (node.childNodes.length > offset2 && node.childNodes[offset2].nodeType == 3) + return node.childNodes[offset2]; + node = node.childNodes[offset2 - 1]; + offset2 = nodeSize(node); + } else if (node.nodeType == 1 && offset2 < node.childNodes.length) { + node = node.childNodes[offset2]; + offset2 = 0; + } else { + return null; + } + } +} +function findTextInFragment(frag, text, from2, to) { + for (let i = 0, pos = 0; i < frag.childCount && pos <= to; ) { + let child = frag.child(i++), childStart = pos; + pos += child.nodeSize; + if (!child.isText) + continue; + let str = child.text; + while (i < frag.childCount) { + let next = frag.child(i++); + pos += next.nodeSize; + if (!next.isText) + break; + str += next.text; + } + if (pos >= from2) { + if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text) + return to - text.length; + let found2 = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1; + if (found2 >= 0 && found2 + text.length + childStart >= from2) + return childStart + found2; + if (from2 == to && str.length >= to + text.length - childStart && str.slice(to - childStart, to - childStart + text.length) == text) + return to; + } + } + return -1; +} +function replaceNodes(nodes, from2, to, view, replacement) { + let result = []; + for (let i = 0, off = 0; i < nodes.length; i++) { + let child = nodes[i], start2 = off, end2 = off += child.size; + if (start2 >= to || end2 <= from2) { + result.push(child); + } else { + if (start2 < from2) + result.push(child.slice(0, from2 - start2, view)); + if (replacement) { + result.push(replacement); + replacement = void 0; + } + if (end2 > to) + result.push(child.slice(to - start2, child.size, view)); + } + } + return result; +} +function selectionFromDOM(view, origin = null) { + let domSel = view.domSelectionRange(), doc3 = view.state.doc; + if (!domSel.focusNode) + return null; + let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0; + let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1); + if (head < 0) + return null; + let $head = doc3.resolve(head), $anchor, selection; + if (selectionCollapsed(domSel)) { + $anchor = $head; + while (nearestDesc && !nearestDesc.node) + nearestDesc = nearestDesc.parent; + let nearestDescNode = nearestDesc.node; + if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) { + let pos = nearestDesc.posBefore; + selection = new NodeSelection(head == pos ? $head : doc3.resolve(pos)); + } + } else { + let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1); + if (anchor < 0) + return null; + $anchor = doc3.resolve(anchor); + } + if (!selection) { + let bias = origin == "pointer" || view.state.selection.head < $head.pos && !inWidget ? 1 : -1; + selection = selectionBetween(view, $anchor, $head, bias); + } + return selection; +} +function editorOwnsSelection(view) { + return view.editable ? view.hasFocus() : hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom); +} +function selectionToDOM(view, force = false) { + let sel = view.state.selection; + syncNodeSelection(view, sel); + if (!editorOwnsSelection(view)) + return; + if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) { + let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection; + if (domSel.anchorNode && curSel.anchorNode && isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) { + view.input.mouseDown.delayedSelectionSync = true; + view.domObserver.setCurSelection(); + return; + } + } + view.domObserver.disconnectSelection(); + if (view.cursorWrapper) { + selectCursorWrapper(view); + } else { + let { anchor, head } = sel, resetEditableFrom, resetEditableTo; + if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) { + if (!sel.$from.parent.inlineContent) + resetEditableFrom = temporarilyEditableNear(view, sel.from); + if (!sel.empty && !sel.$from.parent.inlineContent) + resetEditableTo = temporarilyEditableNear(view, sel.to); + } + view.docView.setSelection(anchor, head, view.root, force); + if (brokenSelectBetweenUneditable) { + if (resetEditableFrom) + resetEditable(resetEditableFrom); + if (resetEditableTo) + resetEditable(resetEditableTo); + } + if (sel.visible) { + view.dom.classList.remove("ProseMirror-hideselection"); + } else { + view.dom.classList.add("ProseMirror-hideselection"); + if ("onselectionchange" in document) + removeClassOnSelectionChange(view); + } + } + view.domObserver.setCurSelection(); + view.domObserver.connectSelection(); +} +var brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63; +function temporarilyEditableNear(view, pos) { + let { node, offset: offset2 } = view.docView.domFromPos(pos, 0); + let after = offset2 < node.childNodes.length ? node.childNodes[offset2] : null; + let before = offset2 ? node.childNodes[offset2 - 1] : null; + if (safari && after && after.contentEditable == "false") + return setEditable(after); + if ((!after || after.contentEditable == "false") && (!before || before.contentEditable == "false")) { + if (after) + return setEditable(after); + else if (before) + return setEditable(before); + } +} +function setEditable(element) { + element.contentEditable = "true"; + if (safari && element.draggable) { + element.draggable = false; + element.wasDraggable = true; + } + return element; +} +function resetEditable(element) { + element.contentEditable = "false"; + if (element.wasDraggable) { + element.draggable = true; + element.wasDraggable = null; + } +} +function removeClassOnSelectionChange(view) { + let doc3 = view.dom.ownerDocument; + doc3.removeEventListener("selectionchange", view.input.hideSelectionGuard); + let domSel = view.domSelectionRange(); + let node = domSel.anchorNode, offset2 = domSel.anchorOffset; + doc3.addEventListener("selectionchange", view.input.hideSelectionGuard = () => { + if (domSel.anchorNode != node || domSel.anchorOffset != offset2) { + doc3.removeEventListener("selectionchange", view.input.hideSelectionGuard); + setTimeout(() => { + if (!editorOwnsSelection(view) || view.state.selection.visible) + view.dom.classList.remove("ProseMirror-hideselection"); + }, 20); + } + }); +} +function selectCursorWrapper(view) { + let domSel = view.domSelection(), range = document.createRange(); + let node = view.cursorWrapper.dom, img = node.nodeName == "IMG"; + if (img) + range.setEnd(node.parentNode, domIndex(node) + 1); + else + range.setEnd(node, 0); + range.collapse(false); + domSel.removeAllRanges(); + domSel.addRange(range); + if (!img && !view.state.selection.visible && ie && ie_version <= 11) { + node.disabled = true; + node.disabled = false; + } +} +function syncNodeSelection(view, sel) { + if (sel instanceof NodeSelection) { + let desc = view.docView.descAt(sel.from); + if (desc != view.lastSelectedViewDesc) { + clearNodeSelection(view); + if (desc) + desc.selectNode(); + view.lastSelectedViewDesc = desc; + } + } else { + clearNodeSelection(view); + } +} +function clearNodeSelection(view) { + if (view.lastSelectedViewDesc) { + if (view.lastSelectedViewDesc.parent) + view.lastSelectedViewDesc.deselectNode(); + view.lastSelectedViewDesc = void 0; + } +} +function selectionBetween(view, $anchor, $head, bias) { + return view.someProp("createSelectionBetween", (f) => f(view, $anchor, $head)) || TextSelection.between($anchor, $head, bias); +} +function hasFocusAndSelection(view) { + if (view.editable && !view.hasFocus()) + return false; + return hasSelection(view); +} +function hasSelection(view) { + let sel = view.domSelectionRange(); + if (!sel.anchorNode) + return false; + try { + return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) && (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode)); + } catch (_) { + return false; + } +} +function anchorInRightPlace(view) { + let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0); + let domSel = view.domSelectionRange(); + return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset); +} +function moveSelectionBlock(state, dir) { + let { $anchor, $head } = state.selection; + let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head); + let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null; + return $start && Selection.findFrom($start, dir); +} +function apply(view, sel) { + view.dispatch(view.state.tr.setSelection(sel).scrollIntoView()); + return true; +} +function selectHorizontally(view, dir, mods) { + let sel = view.state.selection; + if (sel instanceof TextSelection) { + if (mods.indexOf("s") > -1) { + let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter; + if (!node || node.isText || !node.isLeaf) + return false; + let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1)); + return apply(view, new TextSelection(sel.$anchor, $newHead)); + } else if (!sel.empty) { + return false; + } else if (view.endOfTextblock(dir > 0 ? "forward" : "backward")) { + let next = moveSelectionBlock(view.state, dir); + if (next && next instanceof NodeSelection) + return apply(view, next); + return false; + } else if (!(mac && mods.indexOf("m") > -1)) { + let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc; + if (!node || node.isText) + return false; + let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos; + if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM)) + return false; + if (NodeSelection.isSelectable(node)) { + return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head)); + } else if (webkit) { + return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize))); + } else { + return false; + } + } + } else if (sel instanceof NodeSelection && sel.node.isInline) { + return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from)); + } else { + let next = moveSelectionBlock(view.state, dir); + if (next) + return apply(view, next); + return false; + } +} +function nodeLen(node) { + return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length; +} +function isIgnorable(dom, dir) { + let desc = dom.pmViewDesc; + return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != "BR"); +} +function skipIgnoredNodes(view, dir) { + return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view); +} +function skipIgnoredNodesBefore(view) { + let sel = view.domSelectionRange(); + let node = sel.focusNode, offset2 = sel.focusOffset; + if (!node) + return; + let moveNode, moveOffset, force = false; + if (gecko && node.nodeType == 1 && offset2 < nodeLen(node) && isIgnorable(node.childNodes[offset2], -1)) + force = true; + for (; ; ) { + if (offset2 > 0) { + if (node.nodeType != 1) { + break; + } else { + let before = node.childNodes[offset2 - 1]; + if (isIgnorable(before, -1)) { + moveNode = node; + moveOffset = --offset2; + } else if (before.nodeType == 3) { + node = before; + offset2 = node.nodeValue.length; + } else + break; + } + } else if (isBlockNode(node)) { + break; + } else { + let prev = node.previousSibling; + while (prev && isIgnorable(prev, -1)) { + moveNode = node.parentNode; + moveOffset = domIndex(prev); + prev = prev.previousSibling; + } + if (!prev) { + node = node.parentNode; + if (node == view.dom) + break; + offset2 = 0; + } else { + node = prev; + offset2 = nodeLen(node); + } + } + } + if (force) + setSelFocus(view, node, offset2); + else if (moveNode) + setSelFocus(view, moveNode, moveOffset); +} +function skipIgnoredNodesAfter(view) { + let sel = view.domSelectionRange(); + let node = sel.focusNode, offset2 = sel.focusOffset; + if (!node) + return; + let len = nodeLen(node); + let moveNode, moveOffset; + for (; ; ) { + if (offset2 < len) { + if (node.nodeType != 1) + break; + let after = node.childNodes[offset2]; + if (isIgnorable(after, 1)) { + moveNode = node; + moveOffset = ++offset2; + } else + break; + } else if (isBlockNode(node)) { + break; + } else { + let next = node.nextSibling; + while (next && isIgnorable(next, 1)) { + moveNode = next.parentNode; + moveOffset = domIndex(next) + 1; + next = next.nextSibling; + } + if (!next) { + node = node.parentNode; + if (node == view.dom) + break; + offset2 = len = 0; + } else { + node = next; + offset2 = 0; + len = nodeLen(node); + } + } + } + if (moveNode) + setSelFocus(view, moveNode, moveOffset); +} +function isBlockNode(dom) { + let desc = dom.pmViewDesc; + return desc && desc.node && desc.node.isBlock; +} +function textNodeAfter(node, offset2) { + while (node && offset2 == node.childNodes.length && !hasBlockDesc(node)) { + offset2 = domIndex(node) + 1; + node = node.parentNode; + } + while (node && offset2 < node.childNodes.length) { + let next = node.childNodes[offset2]; + if (next.nodeType == 3) + return next; + if (next.nodeType == 1 && next.contentEditable == "false") + break; + node = next; + offset2 = 0; + } +} +function textNodeBefore(node, offset2) { + while (node && !offset2 && !hasBlockDesc(node)) { + offset2 = domIndex(node); + node = node.parentNode; + } + while (node && offset2) { + let next = node.childNodes[offset2 - 1]; + if (next.nodeType == 3) + return next; + if (next.nodeType == 1 && next.contentEditable == "false") + break; + node = next; + offset2 = node.childNodes.length; + } +} +function setSelFocus(view, node, offset2) { + if (node.nodeType != 3) { + let before, after; + if (after = textNodeAfter(node, offset2)) { + node = after; + offset2 = 0; + } else if (before = textNodeBefore(node, offset2)) { + node = before; + offset2 = before.nodeValue.length; + } + } + let sel = view.domSelection(); + if (selectionCollapsed(sel)) { + let range = document.createRange(); + range.setEnd(node, offset2); + range.setStart(node, offset2); + sel.removeAllRanges(); + sel.addRange(range); + } else if (sel.extend) { + sel.extend(node, offset2); + } + view.domObserver.setCurSelection(); + let { state } = view; + setTimeout(() => { + if (view.state == state) + selectionToDOM(view); + }, 50); +} +function findDirection(view, pos) { + let $pos = view.state.doc.resolve(pos); + if (!(chrome || windows) && $pos.parent.inlineContent) { + let coords = view.coordsAtPos(pos); + if (pos > $pos.start()) { + let before = view.coordsAtPos(pos - 1); + let mid = (before.top + before.bottom) / 2; + if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1) + return before.left < coords.left ? "ltr" : "rtl"; + } + if (pos < $pos.end()) { + let after = view.coordsAtPos(pos + 1); + let mid = (after.top + after.bottom) / 2; + if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1) + return after.left > coords.left ? "ltr" : "rtl"; + } + } + let computed = getComputedStyle(view.dom).direction; + return computed == "rtl" ? "rtl" : "ltr"; +} +function selectVertically(view, dir, mods) { + let sel = view.state.selection; + if (sel instanceof TextSelection && !sel.empty || mods.indexOf("s") > -1) + return false; + if (mac && mods.indexOf("m") > -1) + return false; + let { $from, $to } = sel; + if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? "up" : "down")) { + let next = moveSelectionBlock(view.state, dir); + if (next && next instanceof NodeSelection) + return apply(view, next); + } + if (!$from.parent.inlineContent) { + let side = dir < 0 ? $from : $to; + let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir); + return beyond ? apply(view, beyond) : false; + } + return false; +} +function stopNativeHorizontalDelete(view, dir) { + if (!(view.state.selection instanceof TextSelection)) + return true; + let { $head, $anchor, empty: empty2 } = view.state.selection; + if (!$head.sameParent($anchor)) + return true; + if (!empty2) + return false; + if (view.endOfTextblock(dir > 0 ? "forward" : "backward")) + return true; + let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter); + if (nextNode && !nextNode.isText) { + let tr2 = view.state.tr; + if (dir < 0) + tr2.delete($head.pos - nextNode.nodeSize, $head.pos); + else + tr2.delete($head.pos, $head.pos + nextNode.nodeSize); + view.dispatch(tr2); + return true; + } + return false; +} +function switchEditable(view, node, state) { + view.domObserver.stop(); + node.contentEditable = state; + view.domObserver.start(); +} +function safariDownArrowBug(view) { + if (!safari || view.state.selection.$head.parentOffset > 0) + return false; + let { focusNode, focusOffset } = view.domSelectionRange(); + if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 && focusNode.firstChild && focusNode.firstChild.contentEditable == "false") { + let child = focusNode.firstChild; + switchEditable(view, child, "true"); + setTimeout(() => switchEditable(view, child, "false"), 20); + } + return false; +} +function getMods(event) { + let result = ""; + if (event.ctrlKey) + result += "c"; + if (event.metaKey) + result += "m"; + if (event.altKey) + result += "a"; + if (event.shiftKey) + result += "s"; + return result; +} +function captureKeyDown(view, event) { + let code = event.keyCode, mods = getMods(event); + if (code == 8 || mac && code == 72 && mods == "c") { + return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1); + } else if (code == 46 && !event.shiftKey || mac && code == 68 && mods == "c") { + return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1); + } else if (code == 13 || code == 27) { + return true; + } else if (code == 37 || mac && code == 66 && mods == "c") { + let dir = code == 37 ? findDirection(view, view.state.selection.from) == "ltr" ? -1 : 1 : -1; + return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir); + } else if (code == 39 || mac && code == 70 && mods == "c") { + let dir = code == 39 ? findDirection(view, view.state.selection.from) == "ltr" ? 1 : -1 : 1; + return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir); + } else if (code == 38 || mac && code == 80 && mods == "c") { + return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1); + } else if (code == 40 || mac && code == 78 && mods == "c") { + return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1); + } else if (mods == (mac ? "m" : "c") && (code == 66 || code == 73 || code == 89 || code == 90)) { + return true; + } + return false; +} +function serializeForClipboard(view, slice2) { + view.someProp("transformCopied", (f) => { + slice2 = f(slice2, view); + }); + let context = [], { content, openStart, openEnd } = slice2; + while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) { + openStart--; + openEnd--; + let node = content.firstChild; + context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null); + content = node.content; + } + let serializer = view.someProp("clipboardSerializer") || DOMSerializer.fromSchema(view.state.schema); + let doc3 = detachedDoc(), wrap2 = doc3.createElement("div"); + wrap2.appendChild(serializer.serializeFragment(content, { document: doc3 })); + let firstChild = wrap2.firstChild, needsWrap, wrappers = 0; + while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) { + for (let i = needsWrap.length - 1; i >= 0; i--) { + let wrapper = doc3.createElement(needsWrap[i]); + while (wrap2.firstChild) + wrapper.appendChild(wrap2.firstChild); + wrap2.appendChild(wrapper); + wrappers++; + } + firstChild = wrap2.firstChild; + } + if (firstChild && firstChild.nodeType == 1) + firstChild.setAttribute("data-pm-slice", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : ""} ${JSON.stringify(context)}`); + let text = view.someProp("clipboardTextSerializer", (f) => f(slice2, view)) || slice2.content.textBetween(0, slice2.content.size, "\n\n"); + return { dom: wrap2, text }; +} +function parseFromClipboard(view, text, html, plainText, $context) { + let inCode = $context.parent.type.spec.code; + let dom, slice2; + if (!html && !text) + return null; + let asText = text && (plainText || inCode || !html); + if (asText) { + view.someProp("transformPastedText", (f) => { + text = f(text, inCode || plainText, view); + }); + if (inCode) + return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\r\n?/g, "\n"))), 0, 0) : Slice.empty; + let parsed = view.someProp("clipboardTextParser", (f) => f(text, $context, plainText, view)); + if (parsed) { + slice2 = parsed; + } else { + let marks = $context.marks(); + let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema); + dom = document.createElement("div"); + text.split(/(?:\r\n?|\n)+/).forEach((block) => { + let p = dom.appendChild(document.createElement("p")); + if (block) + p.appendChild(serializer.serializeNode(schema.text(block, marks))); + }); + } + } else { + view.someProp("transformPastedHTML", (f) => { + html = f(html, view); + }); + dom = readHTML(html); + if (webkit) + restoreReplacedSpaces(dom); + } + let contextNode = dom && dom.querySelector("[data-pm-slice]"); + let sliceData = contextNode && /^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(contextNode.getAttribute("data-pm-slice") || ""); + if (sliceData && sliceData[3]) + for (let i = +sliceData[3]; i > 0; i--) { + let child = dom.firstChild; + while (child && child.nodeType != 1) + child = child.nextSibling; + if (!child) + break; + dom = child; + } + if (!slice2) { + let parser = view.someProp("clipboardParser") || view.someProp("domParser") || DOMParser.fromSchema(view.state.schema); + slice2 = parser.parseSlice(dom, { + preserveWhitespace: !!(asText || sliceData), + context: $context, + ruleFromNode(dom2) { + if (dom2.nodeName == "BR" && !dom2.nextSibling && dom2.parentNode && !inlineParents.test(dom2.parentNode.nodeName)) + return { ignore: true }; + return null; + } + }); + } + if (sliceData) { + slice2 = addContext(closeSlice(slice2, +sliceData[1], +sliceData[2]), sliceData[4]); + } else { + slice2 = Slice.maxOpen(normalizeSiblings(slice2.content, $context), true); + if (slice2.openStart || slice2.openEnd) { + let openStart = 0, openEnd = 0; + for (let node = slice2.content.firstChild; openStart < slice2.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { + } + for (let node = slice2.content.lastChild; openEnd < slice2.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { + } + slice2 = closeSlice(slice2, openStart, openEnd); + } + } + view.someProp("transformPasted", (f) => { + slice2 = f(slice2, view); + }); + return slice2; +} +var inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i; +function normalizeSiblings(fragment, $context) { + if (fragment.childCount < 2) + return fragment; + for (let d = $context.depth; d >= 0; d--) { + let parent = $context.node(d); + let match = parent.contentMatchAt($context.index(d)); + let lastWrap, result = []; + fragment.forEach((node) => { + if (!result) + return; + let wrap2 = match.findWrapping(node.type), inLast; + if (!wrap2) + return result = null; + if (inLast = result.length && lastWrap.length && addToSibling(wrap2, lastWrap, node, result[result.length - 1], 0)) { + result[result.length - 1] = inLast; + } else { + if (result.length) + result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length); + let wrapped = withWrappers(node, wrap2); + result.push(wrapped); + match = match.matchType(wrapped.type); + lastWrap = wrap2; + } + }); + if (result) + return Fragment.from(result); + } + return fragment; +} +function withWrappers(node, wrap2, from2 = 0) { + for (let i = wrap2.length - 1; i >= from2; i--) + node = wrap2[i].create(null, Fragment.from(node)); + return node; +} +function addToSibling(wrap2, lastWrap, node, sibling, depth) { + if (depth < wrap2.length && depth < lastWrap.length && wrap2[depth] == lastWrap[depth]) { + let inner = addToSibling(wrap2, lastWrap, node, sibling.lastChild, depth + 1); + if (inner) + return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner)); + let match = sibling.contentMatchAt(sibling.childCount); + if (match.matchType(depth == wrap2.length - 1 ? node.type : wrap2[depth + 1])) + return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap2, depth + 1)))); + } +} +function closeRight(node, depth) { + if (depth == 0) + return node; + let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1)); + let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true); + return node.copy(fragment.append(fill)); +} +function closeRange(fragment, side, from2, to, depth, openEnd) { + let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content; + if (fragment.childCount > 1) + openEnd = 0; + if (depth < to - 1) + inner = closeRange(inner, side, from2, to, depth + 1, openEnd); + if (depth >= from2) + inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner) : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true)); + return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner)); +} +function closeSlice(slice2, openStart, openEnd) { + if (openStart < slice2.openStart) + slice2 = new Slice(closeRange(slice2.content, -1, openStart, slice2.openStart, 0, slice2.openEnd), openStart, slice2.openEnd); + if (openEnd < slice2.openEnd) + slice2 = new Slice(closeRange(slice2.content, 1, openEnd, slice2.openEnd, 0, 0), slice2.openStart, openEnd); + return slice2; +} +var wrapMap = { + thead: ["table"], + tbody: ["table"], + tfoot: ["table"], + caption: ["table"], + colgroup: ["table"], + col: ["table", "colgroup"], + tr: ["table", "tbody"], + td: ["table", "tbody", "tr"], + th: ["table", "tbody", "tr"] +}; +var _detachedDoc = null; +function detachedDoc() { + return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument("title")); +} +function readHTML(html) { + let metas = /^(\s*]*>)*/.exec(html); + if (metas) + html = html.slice(metas[0].length); + let elt = detachedDoc().createElement("div"); + let firstTag = /<([a-z][^>\s]+)/i.exec(html), wrap2; + if (wrap2 = firstTag && wrapMap[firstTag[1].toLowerCase()]) + html = wrap2.map((n) => "<" + n + ">").join("") + html + wrap2.map((n) => "").reverse().join(""); + elt.innerHTML = html; + if (wrap2) + for (let i = 0; i < wrap2.length; i++) + elt = elt.querySelector(wrap2[i]) || elt; + return elt; +} +function restoreReplacedSpaces(dom) { + let nodes = dom.querySelectorAll(chrome ? "span:not([class]):not([style])" : "span.Apple-converted-space"); + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i]; + if (node.childNodes.length == 1 && node.textContent == "\xA0" && node.parentNode) + node.parentNode.replaceChild(dom.ownerDocument.createTextNode(" "), node); + } +} +function addContext(slice2, context) { + if (!slice2.size) + return slice2; + let schema = slice2.content.firstChild.type.schema, array; + try { + array = JSON.parse(context); + } catch (e) { + return slice2; + } + let { content, openStart, openEnd } = slice2; + for (let i = array.length - 2; i >= 0; i -= 2) { + let type = schema.nodes[array[i]]; + if (!type || type.hasRequiredAttrs()) + break; + content = Fragment.from(type.create(array[i + 1], content)); + openStart++; + openEnd++; + } + return new Slice(content, openStart, openEnd); +} +var handlers = {}; +var editHandlers = {}; +var passiveHandlers = { touchstart: true, touchmove: true }; +var InputState = class { + constructor() { + this.shiftKey = false; + this.mouseDown = null; + this.lastKeyCode = null; + this.lastKeyCodeTime = 0; + this.lastClick = { time: 0, x: 0, y: 0, type: "" }; + this.lastSelectionOrigin = null; + this.lastSelectionTime = 0; + this.lastIOSEnter = 0; + this.lastIOSEnterFallbackTimeout = -1; + this.lastFocus = 0; + this.lastTouch = 0; + this.lastAndroidDelete = 0; + this.composing = false; + this.composingTimeout = -1; + this.compositionNodes = []; + this.compositionEndedAt = -2e8; + this.compositionID = 1; + this.compositionPendingChanges = 0; + this.domChangeCount = 0; + this.eventHandlers = /* @__PURE__ */ Object.create(null); + this.hideSelectionGuard = null; + } +}; +function initInput(view) { + for (let event in handlers) { + let handler = handlers[event]; + view.dom.addEventListener(event, view.input.eventHandlers[event] = (event2) => { + if (eventBelongsToView(view, event2) && !runCustomHandler(view, event2) && (view.editable || !(event2.type in editHandlers))) + handler(view, event2); + }, passiveHandlers[event] ? { passive: true } : void 0); + } + if (safari) + view.dom.addEventListener("input", () => null); + ensureListeners(view); +} +function setSelectionOrigin(view, origin) { + view.input.lastSelectionOrigin = origin; + view.input.lastSelectionTime = Date.now(); +} +function destroyInput(view) { + view.domObserver.stop(); + for (let type in view.input.eventHandlers) + view.dom.removeEventListener(type, view.input.eventHandlers[type]); + clearTimeout(view.input.composingTimeout); + clearTimeout(view.input.lastIOSEnterFallbackTimeout); +} +function ensureListeners(view) { + view.someProp("handleDOMEvents", (currentHandlers) => { + for (let type in currentHandlers) + if (!view.input.eventHandlers[type]) + view.dom.addEventListener(type, view.input.eventHandlers[type] = (event) => runCustomHandler(view, event)); + }); +} +function runCustomHandler(view, event) { + return view.someProp("handleDOMEvents", (handlers2) => { + let handler = handlers2[event.type]; + return handler ? handler(view, event) || event.defaultPrevented : false; + }); +} +function eventBelongsToView(view, event) { + if (!event.bubbles) + return true; + if (event.defaultPrevented) + return false; + for (let node = event.target; node != view.dom; node = node.parentNode) + if (!node || node.nodeType == 11 || node.pmViewDesc && node.pmViewDesc.stopEvent(event)) + return false; + return true; +} +function dispatchEvent(view, event) { + if (!runCustomHandler(view, event) && handlers[event.type] && (view.editable || !(event.type in editHandlers))) + handlers[event.type](view, event); +} +editHandlers.keydown = (view, _event) => { + let event = _event; + view.input.shiftKey = event.keyCode == 16 || event.shiftKey; + if (inOrNearComposition(view, event)) + return; + view.input.lastKeyCode = event.keyCode; + view.input.lastKeyCodeTime = Date.now(); + if (android && chrome && event.keyCode == 13) + return; + if (event.keyCode != 229) + view.domObserver.forceFlush(); + if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) { + let now = Date.now(); + view.input.lastIOSEnter = now; + view.input.lastIOSEnterFallbackTimeout = setTimeout(() => { + if (view.input.lastIOSEnter == now) { + view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter"))); + view.input.lastIOSEnter = 0; + } + }, 200); + } else if (view.someProp("handleKeyDown", (f) => f(view, event)) || captureKeyDown(view, event)) { + event.preventDefault(); + } else { + setSelectionOrigin(view, "key"); + } +}; +editHandlers.keyup = (view, event) => { + if (event.keyCode == 16) + view.input.shiftKey = false; +}; +editHandlers.keypress = (view, _event) => { + let event = _event; + if (inOrNearComposition(view, event) || !event.charCode || event.ctrlKey && !event.altKey || mac && event.metaKey) + return; + if (view.someProp("handleKeyPress", (f) => f(view, event))) { + event.preventDefault(); + return; + } + let sel = view.state.selection; + if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) { + let text = String.fromCharCode(event.charCode); + if (!/[\r\n]/.test(text) && !view.someProp("handleTextInput", (f) => f(view, sel.$from.pos, sel.$to.pos, text))) + view.dispatch(view.state.tr.insertText(text).scrollIntoView()); + event.preventDefault(); + } +}; +function eventCoords(event) { + return { left: event.clientX, top: event.clientY }; +} +function isNear(event, click) { + let dx = click.x - event.clientX, dy = click.y - event.clientY; + return dx * dx + dy * dy < 100; +} +function runHandlerOnContext(view, propName, pos, inside, event) { + if (inside == -1) + return false; + let $pos = view.state.doc.resolve(inside); + for (let i = $pos.depth + 1; i > 0; i--) { + if (view.someProp(propName, (f) => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true) : f(view, pos, $pos.node(i), $pos.before(i), event, false))) + return true; + } + return false; +} +function updateSelection(view, selection, origin) { + if (!view.focused) + view.focus(); + let tr2 = view.state.tr.setSelection(selection); + if (origin == "pointer") + tr2.setMeta("pointer", true); + view.dispatch(tr2); +} +function selectClickedLeaf(view, inside) { + if (inside == -1) + return false; + let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter; + if (node && node.isAtom && NodeSelection.isSelectable(node)) { + updateSelection(view, new NodeSelection($pos), "pointer"); + return true; + } + return false; +} +function selectClickedNode(view, inside) { + if (inside == -1) + return false; + let sel = view.state.selection, selectedNode, selectAt; + if (sel instanceof NodeSelection) + selectedNode = sel.node; + let $pos = view.state.doc.resolve(inside); + for (let i = $pos.depth + 1; i > 0; i--) { + let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i); + if (NodeSelection.isSelectable(node)) { + if (selectedNode && sel.$from.depth > 0 && i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos) + selectAt = $pos.before(sel.$from.depth); + else + selectAt = $pos.before(i); + break; + } + } + if (selectAt != null) { + updateSelection(view, NodeSelection.create(view.state.doc, selectAt), "pointer"); + return true; + } else { + return false; + } +} +function handleSingleClick(view, pos, inside, event, selectNode) { + return runHandlerOnContext(view, "handleClickOn", pos, inside, event) || view.someProp("handleClick", (f) => f(view, pos, event)) || (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside)); +} +function handleDoubleClick(view, pos, inside, event) { + return runHandlerOnContext(view, "handleDoubleClickOn", pos, inside, event) || view.someProp("handleDoubleClick", (f) => f(view, pos, event)); +} +function handleTripleClick(view, pos, inside, event) { + return runHandlerOnContext(view, "handleTripleClickOn", pos, inside, event) || view.someProp("handleTripleClick", (f) => f(view, pos, event)) || defaultTripleClick(view, inside, event); +} +function defaultTripleClick(view, inside, event) { + if (event.button != 0) + return false; + let doc3 = view.state.doc; + if (inside == -1) { + if (doc3.inlineContent) { + updateSelection(view, TextSelection.create(doc3, 0, doc3.content.size), "pointer"); + return true; + } + return false; + } + let $pos = doc3.resolve(inside); + for (let i = $pos.depth + 1; i > 0; i--) { + let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i); + let nodePos = $pos.before(i); + if (node.inlineContent) + updateSelection(view, TextSelection.create(doc3, nodePos + 1, nodePos + 1 + node.content.size), "pointer"); + else if (NodeSelection.isSelectable(node)) + updateSelection(view, NodeSelection.create(doc3, nodePos), "pointer"); + else + continue; + return true; + } +} +function forceDOMFlush(view) { + return endComposition(view); +} +var selectNodeModifier = mac ? "metaKey" : "ctrlKey"; +handlers.mousedown = (view, _event) => { + let event = _event; + view.input.shiftKey = event.shiftKey; + let flushed = forceDOMFlush(view); + let now = Date.now(), type = "singleClick"; + if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier]) { + if (view.input.lastClick.type == "singleClick") + type = "doubleClick"; + else if (view.input.lastClick.type == "doubleClick") + type = "tripleClick"; + } + view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type }; + let pos = view.posAtCoords(eventCoords(event)); + if (!pos) + return; + if (type == "singleClick") { + if (view.input.mouseDown) + view.input.mouseDown.done(); + view.input.mouseDown = new MouseDown(view, pos, event, !!flushed); + } else if ((type == "doubleClick" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) { + event.preventDefault(); + } else { + setSelectionOrigin(view, "pointer"); + } +}; +var MouseDown = class { + constructor(view, pos, event, flushed) { + this.view = view; + this.pos = pos; + this.event = event; + this.flushed = flushed; + this.delayedSelectionSync = false; + this.mightDrag = null; + this.startDoc = view.state.doc; + this.selectNode = !!event[selectNodeModifier]; + this.allowDefault = event.shiftKey; + let targetNode, targetPos; + if (pos.inside > -1) { + targetNode = view.state.doc.nodeAt(pos.inside); + targetPos = pos.inside; + } else { + let $pos = view.state.doc.resolve(pos.pos); + targetNode = $pos.parent; + targetPos = $pos.depth ? $pos.before() : 0; + } + const target = flushed ? null : event.target; + const targetDesc = target ? view.docView.nearestDesc(target, true) : null; + this.target = targetDesc ? targetDesc.dom : null; + let { selection } = view.state; + if (event.button == 0 && targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false || selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos) + this.mightDrag = { + node: targetNode, + pos: targetPos, + addAttr: !!(this.target && !this.target.draggable), + setUneditable: !!(this.target && gecko && !this.target.hasAttribute("contentEditable")) + }; + if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) { + this.view.domObserver.stop(); + if (this.mightDrag.addAttr) + this.target.draggable = true; + if (this.mightDrag.setUneditable) + setTimeout(() => { + if (this.view.input.mouseDown == this) + this.target.setAttribute("contentEditable", "false"); + }, 20); + this.view.domObserver.start(); + } + view.root.addEventListener("mouseup", this.up = this.up.bind(this)); + view.root.addEventListener("mousemove", this.move = this.move.bind(this)); + setSelectionOrigin(view, "pointer"); + } + done() { + this.view.root.removeEventListener("mouseup", this.up); + this.view.root.removeEventListener("mousemove", this.move); + if (this.mightDrag && this.target) { + this.view.domObserver.stop(); + if (this.mightDrag.addAttr) + this.target.removeAttribute("draggable"); + if (this.mightDrag.setUneditable) + this.target.removeAttribute("contentEditable"); + this.view.domObserver.start(); + } + if (this.delayedSelectionSync) + setTimeout(() => selectionToDOM(this.view)); + this.view.input.mouseDown = null; + } + up(event) { + this.done(); + if (!this.view.dom.contains(event.target)) + return; + let pos = this.pos; + if (this.view.state.doc != this.startDoc) + pos = this.view.posAtCoords(eventCoords(event)); + this.updateAllowDefault(event); + if (this.allowDefault || !pos) { + setSelectionOrigin(this.view, "pointer"); + } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) { + event.preventDefault(); + } else if (event.button == 0 && (this.flushed || // Safari ignores clicks on draggable elements + safari && this.mightDrag && !this.mightDrag.node.isAtom || // Chrome will sometimes treat a node selection as a + // cursor, but still report that the node is selected + // when asked through getSelection. You'll then get a + // situation where clicking at the point where that + // (hidden) cursor is doesn't change the selection, and + // thus doesn't get a reaction from ProseMirror. This + // works around that. + chrome && !this.view.state.selection.visible && Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2)) { + updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), "pointer"); + event.preventDefault(); + } else { + setSelectionOrigin(this.view, "pointer"); + } + } + move(event) { + this.updateAllowDefault(event); + setSelectionOrigin(this.view, "pointer"); + if (event.buttons == 0) + this.done(); + } + updateAllowDefault(event) { + if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 || Math.abs(this.event.y - event.clientY) > 4)) + this.allowDefault = true; + } +}; +handlers.touchstart = (view) => { + view.input.lastTouch = Date.now(); + forceDOMFlush(view); + setSelectionOrigin(view, "pointer"); +}; +handlers.touchmove = (view) => { + view.input.lastTouch = Date.now(); + setSelectionOrigin(view, "pointer"); +}; +handlers.contextmenu = (view) => forceDOMFlush(view); +function inOrNearComposition(view, event) { + if (view.composing) + return true; + if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) { + view.input.compositionEndedAt = -2e8; + return true; + } + return false; +} +var timeoutComposition = android ? 5e3 : -1; +editHandlers.compositionstart = editHandlers.compositionupdate = (view) => { + if (!view.composing) { + view.domObserver.flush(); + let { state } = view, $pos = state.selection.$from; + if (state.selection.empty && (state.storedMarks || !$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some((m) => m.type.spec.inclusive === false))) { + view.markCursor = view.state.storedMarks || $pos.marks(); + endComposition(view, true); + view.markCursor = null; + } else { + endComposition(view); + if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) { + let sel = view.domSelectionRange(); + for (let node = sel.focusNode, offset2 = sel.focusOffset; node && node.nodeType == 1 && offset2 != 0; ) { + let before = offset2 < 0 ? node.lastChild : node.childNodes[offset2 - 1]; + if (!before) + break; + if (before.nodeType == 3) { + view.domSelection().collapse(before, before.nodeValue.length); + break; + } else { + node = before; + offset2 = -1; + } + } + } + } + view.input.composing = true; + } + scheduleComposeEnd(view, timeoutComposition); +}; +editHandlers.compositionend = (view, event) => { + if (view.composing) { + view.input.composing = false; + view.input.compositionEndedAt = event.timeStamp; + view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0; + if (view.input.compositionPendingChanges) + Promise.resolve().then(() => view.domObserver.flush()); + view.input.compositionID++; + scheduleComposeEnd(view, 20); + } +}; +function scheduleComposeEnd(view, delay) { + clearTimeout(view.input.composingTimeout); + if (delay > -1) + view.input.composingTimeout = setTimeout(() => endComposition(view), delay); +} +function clearComposition(view) { + if (view.composing) { + view.input.composing = false; + view.input.compositionEndedAt = timestampFromCustomEvent(); + } + while (view.input.compositionNodes.length > 0) + view.input.compositionNodes.pop().markParentsDirty(); +} +function timestampFromCustomEvent() { + let event = document.createEvent("Event"); + event.initEvent("event", true, true); + return event.timeStamp; +} +function endComposition(view, forceUpdate = false) { + if (android && view.domObserver.flushingSoon >= 0) + return; + view.domObserver.forceFlush(); + clearComposition(view); + if (forceUpdate || view.docView && view.docView.dirty) { + let sel = selectionFromDOM(view); + if (sel && !sel.eq(view.state.selection)) + view.dispatch(view.state.tr.setSelection(sel)); + else + view.updateState(view.state); + return true; + } + return false; +} +function captureCopy(view, dom) { + if (!view.dom.parentNode) + return; + let wrap2 = view.dom.parentNode.appendChild(document.createElement("div")); + wrap2.appendChild(dom); + wrap2.style.cssText = "position: fixed; left: -10000px; top: 10px"; + let sel = getSelection(), range = document.createRange(); + range.selectNodeContents(dom); + view.dom.blur(); + sel.removeAllRanges(); + sel.addRange(range); + setTimeout(() => { + if (wrap2.parentNode) + wrap2.parentNode.removeChild(wrap2); + view.focus(); + }, 50); +} +var brokenClipboardAPI = ie && ie_version < 15 || ios && webkit_version < 604; +handlers.copy = editHandlers.cut = (view, _event) => { + let event = _event; + let sel = view.state.selection, cut2 = event.type == "cut"; + if (sel.empty) + return; + let data = brokenClipboardAPI ? null : event.clipboardData; + let slice2 = sel.content(), { dom, text } = serializeForClipboard(view, slice2); + if (data) { + event.preventDefault(); + data.clearData(); + data.setData("text/html", dom.innerHTML); + data.setData("text/plain", text); + } else { + captureCopy(view, dom); + } + if (cut2) + view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent", "cut")); +}; +function sliceSingleNode(slice2) { + return slice2.openStart == 0 && slice2.openEnd == 0 && slice2.content.childCount == 1 ? slice2.content.firstChild : null; +} +function capturePaste(view, event) { + if (!view.dom.parentNode) + return; + let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code; + let target = view.dom.parentNode.appendChild(document.createElement(plainText ? "textarea" : "div")); + if (!plainText) + target.contentEditable = "true"; + target.style.cssText = "position: fixed; left: -10000px; top: 10px"; + target.focus(); + let plain = view.input.shiftKey && view.input.lastKeyCode != 45; + setTimeout(() => { + view.focus(); + if (target.parentNode) + target.parentNode.removeChild(target); + if (plainText) + doPaste(view, target.value, null, plain, event); + else + doPaste(view, target.textContent, target.innerHTML, plain, event); + }, 50); +} +function doPaste(view, text, html, preferPlain, event) { + let slice2 = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from); + if (view.someProp("handlePaste", (f) => f(view, event, slice2 || Slice.empty))) + return true; + if (!slice2) + return false; + let singleNode = sliceSingleNode(slice2); + let tr2 = singleNode ? view.state.tr.replaceSelectionWith(singleNode, preferPlain) : view.state.tr.replaceSelection(slice2); + view.dispatch(tr2.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste")); + return true; +} +function getText(clipboardData) { + let text = clipboardData.getData("text/plain") || clipboardData.getData("Text"); + if (text) + return text; + let uris = clipboardData.getData("text/uri-list"); + return uris ? uris.replace(/\r?\n/g, " ") : ""; +} +editHandlers.paste = (view, _event) => { + let event = _event; + if (view.composing && !android) + return; + let data = brokenClipboardAPI ? null : event.clipboardData; + let plain = view.input.shiftKey && view.input.lastKeyCode != 45; + if (data && doPaste(view, getText(data), data.getData("text/html"), plain, event)) + event.preventDefault(); + else + capturePaste(view, event); +}; +var Dragging = class { + constructor(slice2, move, node) { + this.slice = slice2; + this.move = move; + this.node = node; + } +}; +var dragCopyModifier = mac ? "altKey" : "ctrlKey"; +handlers.dragstart = (view, _event) => { + let event = _event; + let mouseDown = view.input.mouseDown; + if (mouseDown) + mouseDown.done(); + if (!event.dataTransfer) + return; + let sel = view.state.selection; + let pos = sel.empty ? null : view.posAtCoords(eventCoords(event)); + let node; + if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) + ; + else if (mouseDown && mouseDown.mightDrag) { + node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos); + } else if (event.target && event.target.nodeType == 1) { + let desc = view.docView.nearestDesc(event.target, true); + if (desc && desc.node.type.spec.draggable && desc != view.docView) + node = NodeSelection.create(view.state.doc, desc.posBefore); + } + let slice2 = (node || view.state.selection).content(), { dom, text } = serializeForClipboard(view, slice2); + event.dataTransfer.clearData(); + event.dataTransfer.setData(brokenClipboardAPI ? "Text" : "text/html", dom.innerHTML); + event.dataTransfer.effectAllowed = "copyMove"; + if (!brokenClipboardAPI) + event.dataTransfer.setData("text/plain", text); + view.dragging = new Dragging(slice2, !event[dragCopyModifier], node); +}; +handlers.dragend = (view) => { + let dragging = view.dragging; + window.setTimeout(() => { + if (view.dragging == dragging) + view.dragging = null; + }, 50); +}; +editHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault(); +editHandlers.drop = (view, _event) => { + let event = _event; + let dragging = view.dragging; + view.dragging = null; + if (!event.dataTransfer) + return; + let eventPos = view.posAtCoords(eventCoords(event)); + if (!eventPos) + return; + let $mouse = view.state.doc.resolve(eventPos.pos); + let slice2 = dragging && dragging.slice; + if (slice2) { + view.someProp("transformPasted", (f) => { + slice2 = f(slice2, view); + }); + } else { + slice2 = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse); + } + let move = !!(dragging && !event[dragCopyModifier]); + if (view.someProp("handleDrop", (f) => f(view, event, slice2 || Slice.empty, move))) { + event.preventDefault(); + return; + } + if (!slice2) + return; + event.preventDefault(); + let insertPos = slice2 ? dropPoint(view.state.doc, $mouse.pos, slice2) : $mouse.pos; + if (insertPos == null) + insertPos = $mouse.pos; + let tr2 = view.state.tr; + if (move) { + let { node } = dragging; + if (node) + node.replace(tr2); + else + tr2.deleteSelection(); + } + let pos = tr2.mapping.map(insertPos); + let isNode = slice2.openStart == 0 && slice2.openEnd == 0 && slice2.content.childCount == 1; + let beforeInsert = tr2.doc; + if (isNode) + tr2.replaceRangeWith(pos, pos, slice2.content.firstChild); + else + tr2.replaceRange(pos, pos, slice2); + if (tr2.doc.eq(beforeInsert)) + return; + let $pos = tr2.doc.resolve(pos); + if (isNode && NodeSelection.isSelectable(slice2.content.firstChild) && $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice2.content.firstChild)) { + tr2.setSelection(new NodeSelection($pos)); + } else { + let end2 = tr2.mapping.map(insertPos); + tr2.mapping.maps[tr2.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end2 = newTo); + tr2.setSelection(selectionBetween(view, $pos, tr2.doc.resolve(end2))); + } + view.focus(); + view.dispatch(tr2.setMeta("uiEvent", "drop")); +}; +handlers.focus = (view) => { + view.input.lastFocus = Date.now(); + if (!view.focused) { + view.domObserver.stop(); + view.dom.classList.add("ProseMirror-focused"); + view.domObserver.start(); + view.focused = true; + setTimeout(() => { + if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange())) + selectionToDOM(view); + }, 20); + } +}; +handlers.blur = (view, _event) => { + let event = _event; + if (view.focused) { + view.domObserver.stop(); + view.dom.classList.remove("ProseMirror-focused"); + view.domObserver.start(); + if (event.relatedTarget && view.dom.contains(event.relatedTarget)) + view.domObserver.currentSelection.clear(); + view.focused = false; + } +}; +handlers.beforeinput = (view, _event) => { + let event = _event; + if (chrome && android && event.inputType == "deleteContentBackward") { + view.domObserver.flushSoon(); + let { domChangeCount } = view.input; + setTimeout(() => { + if (view.input.domChangeCount != domChangeCount) + return; + view.dom.blur(); + view.focus(); + if (view.someProp("handleKeyDown", (f) => f(view, keyEvent(8, "Backspace")))) + return; + let { $cursor } = view.state.selection; + if ($cursor && $cursor.pos > 0) + view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView()); + }, 50); + } +}; +for (let prop in editHandlers) + handlers[prop] = editHandlers[prop]; +function compareObjs(a, b) { + if (a == b) + return true; + for (let p in a) + if (a[p] !== b[p]) + return false; + for (let p in b) + if (!(p in a)) + return false; + return true; +} +var WidgetType = class _WidgetType { + constructor(toDOM, spec) { + this.toDOM = toDOM; + this.spec = spec || noSpec; + this.side = this.spec.side || 0; + } + map(mapping, span, offset2, oldOffset) { + let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1); + return deleted ? null : new Decoration(pos - offset2, pos - offset2, this); + } + valid() { + return true; + } + eq(other) { + return this == other || other instanceof _WidgetType && (this.spec.key && this.spec.key == other.spec.key || this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)); + } + destroy(node) { + if (this.spec.destroy) + this.spec.destroy(node); + } +}; +var InlineType = class _InlineType { + constructor(attrs, spec) { + this.attrs = attrs; + this.spec = spec || noSpec; + } + map(mapping, span, offset2, oldOffset) { + let from2 = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset2; + let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset2; + return from2 >= to ? null : new Decoration(from2, to, this); + } + valid(_, span) { + return span.from < span.to; + } + eq(other) { + return this == other || other instanceof _InlineType && compareObjs(this.attrs, other.attrs) && compareObjs(this.spec, other.spec); + } + static is(span) { + return span.type instanceof _InlineType; + } + destroy() { + } +}; +var NodeType2 = class _NodeType { + constructor(attrs, spec) { + this.attrs = attrs; + this.spec = spec || noSpec; + } + map(mapping, span, offset2, oldOffset) { + let from2 = mapping.mapResult(span.from + oldOffset, 1); + if (from2.deleted) + return null; + let to = mapping.mapResult(span.to + oldOffset, -1); + if (to.deleted || to.pos <= from2.pos) + return null; + return new Decoration(from2.pos - offset2, to.pos - offset2, this); + } + valid(node, span) { + let { index, offset: offset2 } = node.content.findIndex(span.from), child; + return offset2 == span.from && !(child = node.child(index)).isText && offset2 + child.nodeSize == span.to; + } + eq(other) { + return this == other || other instanceof _NodeType && compareObjs(this.attrs, other.attrs) && compareObjs(this.spec, other.spec); + } + destroy() { + } +}; +var Decoration = class _Decoration { + /** + @internal + */ + constructor(from2, to, type) { + this.from = from2; + this.to = to; + this.type = type; + } + /** + @internal + */ + copy(from2, to) { + return new _Decoration(from2, to, this.type); + } + /** + @internal + */ + eq(other, offset2 = 0) { + return this.type.eq(other.type) && this.from + offset2 == other.from && this.to + offset2 == other.to; + } + /** + @internal + */ + map(mapping, offset2, oldOffset) { + return this.type.map(mapping, this, offset2, oldOffset); + } + /** + Creates a widget decoration, which is a DOM node that's shown in + the document at the given position. It is recommended that you + delay rendering the widget by passing a function that will be + called when the widget is actually drawn in a view, but you can + also directly pass a DOM node. `getPos` can be used to find the + widget's current document position. + */ + static widget(pos, toDOM, spec) { + return new _Decoration(pos, pos, new WidgetType(toDOM, spec)); + } + /** + Creates an inline decoration, which adds the given attributes to + each inline node between `from` and `to`. + */ + static inline(from2, to, attrs, spec) { + return new _Decoration(from2, to, new InlineType(attrs, spec)); + } + /** + Creates a node decoration. `from` and `to` should point precisely + before and after a node in the document. That node, and only that + node, will receive the given attributes. + */ + static node(from2, to, attrs, spec) { + return new _Decoration(from2, to, new NodeType2(attrs, spec)); + } + /** + The spec provided when creating this decoration. Can be useful + if you've stored extra information in that object. + */ + get spec() { + return this.type.spec; + } + /** + @internal + */ + get inline() { + return this.type instanceof InlineType; + } + /** + @internal + */ + get widget() { + return this.type instanceof WidgetType; + } +}; +var none = []; +var noSpec = {}; +var DecorationSet = class _DecorationSet { + /** + @internal + */ + constructor(local, children) { + this.local = local.length ? local : none; + this.children = children.length ? children : none; + } + /** + Create a set of decorations, using the structure of the given + document. This will consume (modify) the `decorations` array, so + you must make a copy if you want need to preserve that. + */ + static create(doc3, decorations) { + return decorations.length ? buildTree(decorations, doc3, 0, noSpec) : empty; + } + /** + Find all decorations in this set which touch the given range + (including decorations that start or end directly at the + boundaries) and match the given predicate on their spec. When + `start` and `end` are omitted, all decorations in the set are + considered. When `predicate` isn't given, all decorations are + assumed to match. + */ + find(start2, end2, predicate) { + let result = []; + this.findInner(start2 == null ? 0 : start2, end2 == null ? 1e9 : end2, result, 0, predicate); + return result; + } + findInner(start2, end2, result, offset2, predicate) { + for (let i = 0; i < this.local.length; i++) { + let span = this.local[i]; + if (span.from <= end2 && span.to >= start2 && (!predicate || predicate(span.spec))) + result.push(span.copy(span.from + offset2, span.to + offset2)); + } + for (let i = 0; i < this.children.length; i += 3) { + if (this.children[i] < end2 && this.children[i + 1] > start2) { + let childOff = this.children[i] + 1; + this.children[i + 2].findInner(start2 - childOff, end2 - childOff, result, offset2 + childOff, predicate); + } + } + } + /** + Map the set of decorations in response to a change in the + document. + */ + map(mapping, doc3, options) { + if (this == empty || mapping.maps.length == 0) + return this; + return this.mapInner(mapping, doc3, 0, 0, options || noSpec); + } + /** + @internal + */ + mapInner(mapping, node, offset2, oldOffset, options) { + let newLocal; + for (let i = 0; i < this.local.length; i++) { + let mapped = this.local[i].map(mapping, offset2, oldOffset); + if (mapped && mapped.type.valid(node, mapped)) + (newLocal || (newLocal = [])).push(mapped); + else if (options.onRemove) + options.onRemove(this.local[i].spec); + } + if (this.children.length) + return mapChildren(this.children, newLocal || [], mapping, node, offset2, oldOffset, options); + else + return newLocal ? new _DecorationSet(newLocal.sort(byPos), none) : empty; + } + /** + Add the given array of decorations to the ones in the set, + producing a new set. Consumes the `decorations` array. Needs + access to the current document to create the appropriate tree + structure. + */ + add(doc3, decorations) { + if (!decorations.length) + return this; + if (this == empty) + return _DecorationSet.create(doc3, decorations); + return this.addInner(doc3, decorations, 0); + } + addInner(doc3, decorations, offset2) { + let children, childIndex = 0; + doc3.forEach((childNode, childOffset) => { + let baseOffset = childOffset + offset2, found2; + if (!(found2 = takeSpansForNode(decorations, childNode, baseOffset))) + return; + if (!children) + children = this.children.slice(); + while (childIndex < children.length && children[childIndex] < childOffset) + childIndex += 3; + if (children[childIndex] == childOffset) + children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found2, baseOffset + 1); + else + children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found2, childNode, baseOffset + 1, noSpec)); + childIndex += 3; + }); + let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset2); + for (let i = 0; i < local.length; i++) + if (!local[i].type.valid(doc3, local[i])) + local.splice(i--, 1); + return new _DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children); + } + /** + Create a new set that contains the decorations in this set, minus + the ones in the given array. + */ + remove(decorations) { + if (decorations.length == 0 || this == empty) + return this; + return this.removeInner(decorations, 0); + } + removeInner(decorations, offset2) { + let children = this.children, local = this.local; + for (let i = 0; i < children.length; i += 3) { + let found2; + let from2 = children[i] + offset2, to = children[i + 1] + offset2; + for (let j = 0, span; j < decorations.length; j++) + if (span = decorations[j]) { + if (span.from > from2 && span.to < to) { + decorations[j] = null; + (found2 || (found2 = [])).push(span); + } + } + if (!found2) + continue; + if (children == this.children) + children = this.children.slice(); + let removed = children[i + 2].removeInner(found2, from2 + 1); + if (removed != empty) { + children[i + 2] = removed; + } else { + children.splice(i, 3); + i -= 3; + } + } + if (local.length) { + for (let i = 0, span; i < decorations.length; i++) + if (span = decorations[i]) { + for (let j = 0; j < local.length; j++) + if (local[j].eq(span, offset2)) { + if (local == this.local) + local = this.local.slice(); + local.splice(j--, 1); + } + } + } + if (children == this.children && local == this.local) + return this; + return local.length || children.length ? new _DecorationSet(local, children) : empty; + } + /** + @internal + */ + forChild(offset2, node) { + if (this == empty) + return this; + if (node.isLeaf) + return _DecorationSet.empty; + let child, local; + for (let i = 0; i < this.children.length; i += 3) + if (this.children[i] >= offset2) { + if (this.children[i] == offset2) + child = this.children[i + 2]; + break; + } + let start2 = offset2 + 1, end2 = start2 + node.content.size; + for (let i = 0; i < this.local.length; i++) { + let dec = this.local[i]; + if (dec.from < end2 && dec.to > start2 && dec.type instanceof InlineType) { + let from2 = Math.max(start2, dec.from) - start2, to = Math.min(end2, dec.to) - start2; + if (from2 < to) + (local || (local = [])).push(dec.copy(from2, to)); + } + } + if (local) { + let localSet = new _DecorationSet(local.sort(byPos), none); + return child ? new DecorationGroup([localSet, child]) : localSet; + } + return child || empty; + } + /** + @internal + */ + eq(other) { + if (this == other) + return true; + if (!(other instanceof _DecorationSet) || this.local.length != other.local.length || this.children.length != other.children.length) + return false; + for (let i = 0; i < this.local.length; i++) + if (!this.local[i].eq(other.local[i])) + return false; + for (let i = 0; i < this.children.length; i += 3) + if (this.children[i] != other.children[i] || this.children[i + 1] != other.children[i + 1] || !this.children[i + 2].eq(other.children[i + 2])) + return false; + return true; + } + /** + @internal + */ + locals(node) { + return removeOverlap(this.localsInner(node)); + } + /** + @internal + */ + localsInner(node) { + if (this == empty) + return none; + if (node.inlineContent || !this.local.some(InlineType.is)) + return this.local; + let result = []; + for (let i = 0; i < this.local.length; i++) { + if (!(this.local[i].type instanceof InlineType)) + result.push(this.local[i]); + } + return result; + } +}; +DecorationSet.empty = new DecorationSet([], []); +DecorationSet.removeOverlap = removeOverlap; +var empty = DecorationSet.empty; +var DecorationGroup = class _DecorationGroup { + constructor(members) { + this.members = members; + } + map(mapping, doc3) { + const mappedDecos = this.members.map((member) => member.map(mapping, doc3, noSpec)); + return _DecorationGroup.from(mappedDecos); + } + forChild(offset2, child) { + if (child.isLeaf) + return DecorationSet.empty; + let found2 = []; + for (let i = 0; i < this.members.length; i++) { + let result = this.members[i].forChild(offset2, child); + if (result == empty) + continue; + if (result instanceof _DecorationGroup) + found2 = found2.concat(result.members); + else + found2.push(result); + } + return _DecorationGroup.from(found2); + } + eq(other) { + if (!(other instanceof _DecorationGroup) || other.members.length != this.members.length) + return false; + for (let i = 0; i < this.members.length; i++) + if (!this.members[i].eq(other.members[i])) + return false; + return true; + } + locals(node) { + let result, sorted = true; + for (let i = 0; i < this.members.length; i++) { + let locals = this.members[i].localsInner(node); + if (!locals.length) + continue; + if (!result) { + result = locals; + } else { + if (sorted) { + result = result.slice(); + sorted = false; + } + for (let j = 0; j < locals.length; j++) + result.push(locals[j]); + } + } + return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none; + } + // Create a group for the given array of decoration sets, or return + // a single set when possible. + static from(members) { + switch (members.length) { + case 0: + return empty; + case 1: + return members[0]; + default: + return new _DecorationGroup(members.every((m) => m instanceof DecorationSet) ? members : members.reduce((r2, m) => r2.concat(m instanceof DecorationSet ? m : m.members), [])); + } + } +}; +function mapChildren(oldChildren, newLocal, mapping, node, offset2, oldOffset, options) { + let children = oldChildren.slice(); + for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) { + let moved = 0; + mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => { + let dSize = newEnd - newStart - (oldEnd - oldStart); + for (let i2 = 0; i2 < children.length; i2 += 3) { + let end2 = children[i2 + 1]; + if (end2 < 0 || oldStart > end2 + baseOffset - moved) + continue; + let start2 = children[i2] + baseOffset - moved; + if (oldEnd >= start2) { + children[i2 + 1] = oldStart <= start2 ? -2 : -1; + } else if (oldStart >= baseOffset && dSize) { + children[i2] += dSize; + children[i2 + 1] += dSize; + } + } + moved += dSize; + }); + baseOffset = mapping.maps[i].map(baseOffset, -1); + } + let mustRebuild = false; + for (let i = 0; i < children.length; i += 3) + if (children[i + 1] < 0) { + if (children[i + 1] == -2) { + mustRebuild = true; + children[i + 1] = -1; + continue; + } + let from2 = mapping.map(oldChildren[i] + oldOffset), fromLocal = from2 - offset2; + if (fromLocal < 0 || fromLocal >= node.content.size) { + mustRebuild = true; + continue; + } + let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset2; + let { index, offset: childOffset } = node.content.findIndex(fromLocal); + let childNode = node.maybeChild(index); + if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) { + let mapped = children[i + 2].mapInner(mapping, childNode, from2 + 1, oldChildren[i] + oldOffset + 1, options); + if (mapped != empty) { + children[i] = fromLocal; + children[i + 1] = toLocal; + children[i + 2] = mapped; + } else { + children[i + 1] = -2; + mustRebuild = true; + } + } else { + mustRebuild = true; + } + } + if (mustRebuild) { + let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset2, oldOffset, options); + let built = buildTree(decorations, node, 0, options); + newLocal = built.local; + for (let i = 0; i < children.length; i += 3) + if (children[i + 1] < 0) { + children.splice(i, 3); + i -= 3; + } + for (let i = 0, j = 0; i < built.children.length; i += 3) { + let from2 = built.children[i]; + while (j < children.length && children[j] < from2) + j += 3; + children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]); + } + } + return new DecorationSet(newLocal.sort(byPos), children); +} +function moveSpans(spans, offset2) { + if (!offset2 || !spans.length) + return spans; + let result = []; + for (let i = 0; i < spans.length; i++) { + let span = spans[i]; + result.push(new Decoration(span.from + offset2, span.to + offset2, span.type)); + } + return result; +} +function mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset2, oldOffset, options) { + function gather(set, oldOffset2) { + for (let i = 0; i < set.local.length; i++) { + let mapped = set.local[i].map(mapping, offset2, oldOffset2); + if (mapped) + decorations.push(mapped); + else if (options.onRemove) + options.onRemove(set.local[i].spec); + } + for (let i = 0; i < set.children.length; i += 3) + gather(set.children[i + 2], set.children[i] + oldOffset2 + 1); + } + for (let i = 0; i < children.length; i += 3) + if (children[i + 1] == -1) + gather(children[i + 2], oldChildren[i] + oldOffset + 1); + return decorations; +} +function takeSpansForNode(spans, node, offset2) { + if (node.isLeaf) + return null; + let end2 = offset2 + node.nodeSize, found2 = null; + for (let i = 0, span; i < spans.length; i++) { + if ((span = spans[i]) && span.from > offset2 && span.to < end2) { + (found2 || (found2 = [])).push(span); + spans[i] = null; + } + } + return found2; +} +function withoutNulls(array) { + let result = []; + for (let i = 0; i < array.length; i++) + if (array[i] != null) + result.push(array[i]); + return result; +} +function buildTree(spans, node, offset2, options) { + let children = [], hasNulls = false; + node.forEach((childNode, localStart) => { + let found2 = takeSpansForNode(spans, childNode, localStart + offset2); + if (found2) { + hasNulls = true; + let subtree = buildTree(found2, childNode, offset2 + localStart + 1, options); + if (subtree != empty) + children.push(localStart, localStart + childNode.nodeSize, subtree); + } + }); + let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset2).sort(byPos); + for (let i = 0; i < locals.length; i++) + if (!locals[i].type.valid(node, locals[i])) { + if (options.onRemove) + options.onRemove(locals[i].spec); + locals.splice(i--, 1); + } + return locals.length || children.length ? new DecorationSet(locals, children) : empty; +} +function byPos(a, b) { + return a.from - b.from || a.to - b.to; +} +function removeOverlap(spans) { + let working = spans; + for (let i = 0; i < working.length - 1; i++) { + let span = working[i]; + if (span.from != span.to) + for (let j = i + 1; j < working.length; j++) { + let next = working[j]; + if (next.from == span.from) { + if (next.to != span.to) { + if (working == spans) + working = spans.slice(); + working[j] = next.copy(next.from, span.to); + insertAhead(working, j + 1, next.copy(span.to, next.to)); + } + continue; + } else { + if (next.from < span.to) { + if (working == spans) + working = spans.slice(); + working[i] = span.copy(span.from, next.from); + insertAhead(working, j, span.copy(next.from, span.to)); + } + break; + } + } + } + return working; +} +function insertAhead(array, i, deco) { + while (i < array.length && byPos(deco, array[i]) > 0) + i++; + array.splice(i, 0, deco); +} +function viewDecorations(view) { + let found2 = []; + view.someProp("decorations", (f) => { + let result = f(view.state); + if (result && result != empty) + found2.push(result); + }); + if (view.cursorWrapper) + found2.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco])); + return DecorationGroup.from(found2); +} +var observeOptions = { + childList: true, + characterData: true, + characterDataOldValue: true, + attributes: true, + attributeOldValue: true, + subtree: true +}; +var useCharData = ie && ie_version <= 11; +var SelectionState = class { + constructor() { + this.anchorNode = null; + this.anchorOffset = 0; + this.focusNode = null; + this.focusOffset = 0; + } + set(sel) { + this.anchorNode = sel.anchorNode; + this.anchorOffset = sel.anchorOffset; + this.focusNode = sel.focusNode; + this.focusOffset = sel.focusOffset; + } + clear() { + this.anchorNode = this.focusNode = null; + } + eq(sel) { + return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset && sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset; + } +}; +var DOMObserver = class { + constructor(view, handleDOMChange) { + this.view = view; + this.handleDOMChange = handleDOMChange; + this.queue = []; + this.flushingSoon = -1; + this.observer = null; + this.currentSelection = new SelectionState(); + this.onCharData = null; + this.suppressingSelectionUpdates = false; + this.observer = window.MutationObserver && new window.MutationObserver((mutations) => { + for (let i = 0; i < mutations.length; i++) + this.queue.push(mutations[i]); + if (ie && ie_version <= 11 && mutations.some((m) => m.type == "childList" && m.removedNodes.length || m.type == "characterData" && m.oldValue.length > m.target.nodeValue.length)) + this.flushSoon(); + else + this.flush(); + }); + if (useCharData) { + this.onCharData = (e) => { + this.queue.push({ target: e.target, type: "characterData", oldValue: e.prevValue }); + this.flushSoon(); + }; + } + this.onSelectionChange = this.onSelectionChange.bind(this); + } + flushSoon() { + if (this.flushingSoon < 0) + this.flushingSoon = window.setTimeout(() => { + this.flushingSoon = -1; + this.flush(); + }, 20); + } + forceFlush() { + if (this.flushingSoon > -1) { + window.clearTimeout(this.flushingSoon); + this.flushingSoon = -1; + this.flush(); + } + } + start() { + if (this.observer) { + this.observer.takeRecords(); + this.observer.observe(this.view.dom, observeOptions); + } + if (this.onCharData) + this.view.dom.addEventListener("DOMCharacterDataModified", this.onCharData); + this.connectSelection(); + } + stop() { + if (this.observer) { + let take = this.observer.takeRecords(); + if (take.length) { + for (let i = 0; i < take.length; i++) + this.queue.push(take[i]); + window.setTimeout(() => this.flush(), 20); + } + this.observer.disconnect(); + } + if (this.onCharData) + this.view.dom.removeEventListener("DOMCharacterDataModified", this.onCharData); + this.disconnectSelection(); + } + connectSelection() { + this.view.dom.ownerDocument.addEventListener("selectionchange", this.onSelectionChange); + } + disconnectSelection() { + this.view.dom.ownerDocument.removeEventListener("selectionchange", this.onSelectionChange); + } + suppressSelectionUpdates() { + this.suppressingSelectionUpdates = true; + setTimeout(() => this.suppressingSelectionUpdates = false, 50); + } + onSelectionChange() { + if (!hasFocusAndSelection(this.view)) + return; + if (this.suppressingSelectionUpdates) + return selectionToDOM(this.view); + if (ie && ie_version <= 11 && !this.view.state.selection.empty) { + let sel = this.view.domSelectionRange(); + if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset)) + return this.flushSoon(); + } + this.flush(); + } + setCurSelection() { + this.currentSelection.set(this.view.domSelectionRange()); + } + ignoreSelectionChange(sel) { + if (!sel.focusNode) + return true; + let ancestors = /* @__PURE__ */ new Set(), container; + for (let scan = sel.focusNode; scan; scan = parentNode(scan)) + ancestors.add(scan); + for (let scan = sel.anchorNode; scan; scan = parentNode(scan)) + if (ancestors.has(scan)) { + container = scan; + break; + } + let desc = container && this.view.docView.nearestDesc(container); + if (desc && desc.ignoreMutation({ + type: "selection", + target: container.nodeType == 3 ? container.parentNode : container + })) { + this.setCurSelection(); + return true; + } + } + pendingRecords() { + if (this.observer) + for (let mut of this.observer.takeRecords()) + this.queue.push(mut); + return this.queue; + } + flush() { + let { view } = this; + if (!view.docView || this.flushingSoon > -1) + return; + let mutations = this.pendingRecords(); + if (mutations.length) + this.queue = []; + let sel = view.domSelectionRange(); + let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel); + let from2 = -1, to = -1, typeOver = false, added = []; + if (view.editable) { + for (let i = 0; i < mutations.length; i++) { + let result = this.registerMutation(mutations[i], added); + if (result) { + from2 = from2 < 0 ? result.from : Math.min(result.from, from2); + to = to < 0 ? result.to : Math.max(result.to, to); + if (result.typeOver) + typeOver = true; + } + } + } + if (gecko && added.length > 1) { + let brs = added.filter((n) => n.nodeName == "BR"); + if (brs.length == 2) { + let a = brs[0], b = brs[1]; + if (a.parentNode && a.parentNode.parentNode == b.parentNode) + b.remove(); + else + a.remove(); + } + } + let readSel = null; + if (from2 < 0 && newSel && view.input.lastFocus > Date.now() - 200 && Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 && selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) && readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) { + view.input.lastFocus = 0; + selectionToDOM(view); + this.currentSelection.set(sel); + view.scrollToSelection(); + } else if (from2 > -1 || newSel) { + if (from2 > -1) { + view.docView.markDirty(from2, to); + checkCSS(view); + } + this.handleDOMChange(from2, to, typeOver, added); + if (view.docView && view.docView.dirty) + view.updateState(view.state); + else if (!this.currentSelection.eq(sel)) + selectionToDOM(view); + this.currentSelection.set(sel); + } + } + registerMutation(mut, added) { + if (added.indexOf(mut.target) > -1) + return null; + let desc = this.view.docView.nearestDesc(mut.target); + if (mut.type == "attributes" && (desc == this.view.docView || mut.attributeName == "contenteditable" || // Firefox sometimes fires spurious events for null/empty styles + mut.attributeName == "style" && !mut.oldValue && !mut.target.getAttribute("style"))) + return null; + if (!desc || desc.ignoreMutation(mut)) + return null; + if (mut.type == "childList") { + for (let i = 0; i < mut.addedNodes.length; i++) + added.push(mut.addedNodes[i]); + if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target)) + return { from: desc.posBefore, to: desc.posAfter }; + let prev = mut.previousSibling, next = mut.nextSibling; + if (ie && ie_version <= 11 && mut.addedNodes.length) { + for (let i = 0; i < mut.addedNodes.length; i++) { + let { previousSibling, nextSibling } = mut.addedNodes[i]; + if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0) + prev = previousSibling; + if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0) + next = nextSibling; + } + } + let fromOffset = prev && prev.parentNode == mut.target ? domIndex(prev) + 1 : 0; + let from2 = desc.localPosFromDOM(mut.target, fromOffset, -1); + let toOffset = next && next.parentNode == mut.target ? domIndex(next) : mut.target.childNodes.length; + let to = desc.localPosFromDOM(mut.target, toOffset, 1); + return { from: from2, to }; + } else if (mut.type == "attributes") { + return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border }; + } else { + return { + from: desc.posAtStart, + to: desc.posAtEnd, + // An event was generated for a text change that didn't change + // any text. Mark the dom change to fall back to assuming the + // selection was typed over with an identical value if it can't + // find another change. + typeOver: mut.target.nodeValue == mut.oldValue + }; + } + } +}; +var cssChecked = /* @__PURE__ */ new WeakMap(); +var cssCheckWarned = false; +function checkCSS(view) { + if (cssChecked.has(view)) + return; + cssChecked.set(view, null); + if (["normal", "nowrap", "pre-line"].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) { + view.requiresGeckoHackNode = gecko; + if (cssCheckWarned) + return; + console["warn"]("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package."); + cssCheckWarned = true; + } +} +function safariShadowSelectionRange(view) { + let found2; + function read2(event) { + event.preventDefault(); + event.stopImmediatePropagation(); + found2 = event.getTargetRanges()[0]; + } + view.dom.addEventListener("beforeinput", read2, true); + document.execCommand("indent"); + view.dom.removeEventListener("beforeinput", read2, true); + let anchorNode = found2.startContainer, anchorOffset = found2.startOffset; + let focusNode = found2.endContainer, focusOffset = found2.endOffset; + let currentAnchor = view.domAtPos(view.state.selection.anchor); + if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset)) + [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset]; + return { anchorNode, anchorOffset, focusNode, focusOffset }; +} +function parseBetween(view, from_, to_) { + let { node: parent, fromOffset, toOffset, from: from2, to } = view.docView.parseRange(from_, to_); + let domSel = view.domSelectionRange(); + let find2; + let anchor = domSel.anchorNode; + if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) { + find2 = [{ node: anchor, offset: domSel.anchorOffset }]; + if (!selectionCollapsed(domSel)) + find2.push({ node: domSel.focusNode, offset: domSel.focusOffset }); + } + if (chrome && view.input.lastKeyCode === 8) { + for (let off = toOffset; off > fromOffset; off--) { + let node = parent.childNodes[off - 1], desc = node.pmViewDesc; + if (node.nodeName == "BR" && !desc) { + toOffset = off; + break; + } + if (!desc || desc.size) + break; + } + } + let startDoc = view.state.doc; + let parser = view.someProp("domParser") || DOMParser.fromSchema(view.state.schema); + let $from = startDoc.resolve(from2); + let sel = null, doc3 = parser.parse(parent, { + topNode: $from.parent, + topMatch: $from.parent.contentMatchAt($from.index()), + topOpen: true, + from: fromOffset, + to: toOffset, + preserveWhitespace: $from.parent.type.whitespace == "pre" ? "full" : true, + findPositions: find2, + ruleFromNode, + context: $from + }); + if (find2 && find2[0].pos != null) { + let anchor2 = find2[0].pos, head = find2[1] && find2[1].pos; + if (head == null) + head = anchor2; + sel = { anchor: anchor2 + from2, head: head + from2 }; + } + return { doc: doc3, sel, from: from2, to }; +} +function ruleFromNode(dom) { + let desc = dom.pmViewDesc; + if (desc) { + return desc.parseRule(); + } else if (dom.nodeName == "BR" && dom.parentNode) { + if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) { + let skip = document.createElement("div"); + skip.appendChild(document.createElement("li")); + return { skip }; + } else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) { + return { ignore: true }; + } + } else if (dom.nodeName == "IMG" && dom.getAttribute("mark-placeholder")) { + return { ignore: true }; + } + return null; +} +var isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i; +function readDOMChange(view, from2, to, typeOver, addedNodes) { + let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0); + view.input.compositionPendingChanges = 0; + if (from2 < 0) { + let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null; + let newSel = selectionFromDOM(view, origin); + if (newSel && !view.state.selection.eq(newSel)) { + if (chrome && android && view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime && view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter")))) + return; + let tr3 = view.state.tr.setSelection(newSel); + if (origin == "pointer") + tr3.setMeta("pointer", true); + else if (origin == "key") + tr3.scrollIntoView(); + if (compositionID) + tr3.setMeta("composition", compositionID); + view.dispatch(tr3); + } + return; + } + let $before = view.state.doc.resolve(from2); + let shared = $before.sharedDepth(to); + from2 = $before.before(shared + 1); + to = view.state.doc.resolve(to).after(shared + 1); + let sel = view.state.selection; + let parse = parseBetween(view, from2, to); + let doc3 = view.state.doc, compare = doc3.slice(parse.from, parse.to); + let preferredPos, preferredSide; + if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) { + preferredPos = view.state.selection.to; + preferredSide = "end"; + } else { + preferredPos = view.state.selection.from; + preferredSide = "start"; + } + view.input.lastKeyCode = null; + let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide); + if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) && addedNodes.some((n) => n.nodeType == 1 && !isInline.test(n.nodeName)) && (!change || change.endA >= change.endB) && view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter")))) { + view.input.lastIOSEnter = 0; + return; + } + if (!change) { + if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) && !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) { + change = { start: sel.from, endA: sel.to, endB: sel.to }; + } else { + if (parse.sel) { + let sel2 = resolveSelection(view, view.state.doc, parse.sel); + if (sel2 && !sel2.eq(view.state.selection)) { + let tr3 = view.state.tr.setSelection(sel2); + if (compositionID) + tr3.setMeta("composition", compositionID); + view.dispatch(tr3); + } + } + return; + } + } + if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from && parse.sel.head == parse.sel.anchor) { + let size = change.endB - change.start; + parse.sel = { anchor: parse.sel.anchor + size, head: parse.sel.anchor + size }; + } + view.input.domChangeCount++; + if (view.state.selection.from < view.state.selection.to && change.start == change.endB && view.state.selection instanceof TextSelection) { + if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 && view.state.selection.from >= parse.from) { + change.start = view.state.selection.from; + } else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 && view.state.selection.to <= parse.to) { + change.endB += view.state.selection.to - change.endA; + change.endA = view.state.selection.to; + } + } + if (ie && ie_version <= 11 && change.endB == change.start + 1 && change.endA == change.start && change.start > parse.from && parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == " \xA0") { + change.start--; + change.endA--; + change.endB--; + } + let $from = parse.doc.resolveNoCache(change.start - parse.from); + let $to = parse.doc.resolveNoCache(change.endB - parse.from); + let $fromA = doc3.resolve(change.start); + let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA; + let nextSel; + if ((ios && view.input.lastIOSEnter > Date.now() - 225 && (!inlineChange || addedNodes.some((n) => n.nodeName == "DIV" || n.nodeName == "P")) || !inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) && (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter")))) { + view.input.lastIOSEnter = 0; + return; + } + if (view.state.selection.anchor > change.start && looksLikeJoin(doc3, change.start, change.endA, $from, $to) && view.someProp("handleKeyDown", (f) => f(view, keyEvent(8, "Backspace")))) { + if (android && chrome) + view.domObserver.suppressSelectionUpdates(); + return; + } + if (chrome && android && change.endB == change.start) + view.input.lastAndroidDelete = Date.now(); + if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth && parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) { + change.endB -= 2; + $to = parse.doc.resolveNoCache(change.endB - parse.from); + setTimeout(() => { + view.someProp("handleKeyDown", function(f) { + return f(view, keyEvent(13, "Enter")); + }); + }, 20); + } + let chFrom = change.start, chTo = change.endA; + let tr2, storedMarks, markChange; + if (inlineChange) { + if ($from.pos == $to.pos) { + if (ie && ie_version <= 11 && $from.parentOffset == 0) { + view.domObserver.suppressSelectionUpdates(); + setTimeout(() => selectionToDOM(view), 20); + } + tr2 = view.state.tr.delete(chFrom, chTo); + storedMarks = doc3.resolve(change.start).marksAcross(doc3.resolve(change.endA)); + } else if ( + // Adding or removing a mark + change.endA == change.endB && (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start()))) + ) { + tr2 = view.state.tr; + if (markChange.type == "add") + tr2.addMark(chFrom, chTo, markChange.mark); + else + tr2.removeMark(chFrom, chTo, markChange.mark); + } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) { + let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset); + if (view.someProp("handleTextInput", (f) => f(view, chFrom, chTo, text))) + return; + tr2 = view.state.tr.insertText(text, chFrom, chTo); + } + } + if (!tr2) + tr2 = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from)); + if (parse.sel) { + let sel2 = resolveSelection(view, tr2.doc, parse.sel); + if (sel2 && !(chrome && android && view.composing && sel2.empty && (change.start != change.endB || view.input.lastAndroidDelete < Date.now() - 100) && (sel2.head == chFrom || sel2.head == tr2.mapping.map(chTo) - 1) || ie && sel2.empty && sel2.head == chFrom)) + tr2.setSelection(sel2); + } + if (storedMarks) + tr2.ensureMarks(storedMarks); + if (compositionID) + tr2.setMeta("composition", compositionID); + view.dispatch(tr2.scrollIntoView()); +} +function resolveSelection(view, doc3, parsedSel) { + if (Math.max(parsedSel.anchor, parsedSel.head) > doc3.content.size) + return null; + return selectionBetween(view, doc3.resolve(parsedSel.anchor), doc3.resolve(parsedSel.head)); +} +function isMarkChange(cur, prev) { + let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks; + let added = curMarks, removed = prevMarks, type, mark, update; + for (let i = 0; i < prevMarks.length; i++) + added = prevMarks[i].removeFromSet(added); + for (let i = 0; i < curMarks.length; i++) + removed = curMarks[i].removeFromSet(removed); + if (added.length == 1 && removed.length == 0) { + mark = added[0]; + type = "add"; + update = (node) => node.mark(mark.addToSet(node.marks)); + } else if (added.length == 0 && removed.length == 1) { + mark = removed[0]; + type = "remove"; + update = (node) => node.mark(mark.removeFromSet(node.marks)); + } else { + return null; + } + let updated = []; + for (let i = 0; i < prev.childCount; i++) + updated.push(update(prev.child(i))); + if (Fragment.from(updated).eq(cur)) + return { mark, type }; +} +function looksLikeJoin(old, start2, end2, $newStart, $newEnd) { + if (!$newStart.parent.isTextblock || // The content must have shrunk + end2 - start2 <= $newEnd.pos - $newStart.pos || // newEnd must point directly at or after the end of the block that newStart points into + skipClosingAndOpening($newStart, true, false) < $newEnd.pos) + return false; + let $start = old.resolve(start2); + if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock) + return false; + let $next = old.resolve(skipClosingAndOpening($start, true, true)); + if (!$next.parent.isTextblock || $next.pos > end2 || skipClosingAndOpening($next, true, false) < end2) + return false; + return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content); +} +function skipClosingAndOpening($pos, fromEnd, mayOpen) { + let depth = $pos.depth, end2 = fromEnd ? $pos.end() : $pos.pos; + while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) { + depth--; + end2++; + fromEnd = false; + } + if (mayOpen) { + let next = $pos.node(depth).maybeChild($pos.indexAfter(depth)); + while (next && !next.isLeaf) { + next = next.firstChild; + end2++; + } + } + return end2; +} +function findDiff(a, b, pos, preferredPos, preferredSide) { + let start2 = a.findDiffStart(b, pos); + if (start2 == null) + return null; + let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size); + if (preferredSide == "end") { + let adjust = Math.max(0, start2 - Math.min(endA, endB)); + preferredPos -= endA + adjust - start2; + } + if (endA < start2 && a.size < b.size) { + let move = preferredPos <= start2 && preferredPos >= endA ? start2 - preferredPos : 0; + start2 -= move; + if (start2 && start2 < b.size && isSurrogatePair(b.textBetween(start2 - 1, start2 + 1))) + start2 += move ? 1 : -1; + endB = start2 + (endB - endA); + endA = start2; + } else if (endB < start2) { + let move = preferredPos <= start2 && preferredPos >= endB ? start2 - preferredPos : 0; + start2 -= move; + if (start2 && start2 < a.size && isSurrogatePair(a.textBetween(start2 - 1, start2 + 1))) + start2 += move ? 1 : -1; + endA = start2 + (endA - endB); + endB = start2; + } + return { start: start2, endA, endB }; +} +function isSurrogatePair(str) { + if (str.length != 2) + return false; + let a = str.charCodeAt(0), b = str.charCodeAt(1); + return a >= 56320 && a <= 57343 && b >= 55296 && b <= 56319; +} +var EditorView = class { + /** + Create a view. `place` may be a DOM node that the editor should + be appended to, a function that will place it into the document, + or an object whose `mount` property holds the node to use as the + document container. If it is `null`, the editor will not be + added to the document. + */ + constructor(place, props) { + this._root = null; + this.focused = false; + this.trackWrites = null; + this.mounted = false; + this.markCursor = null; + this.cursorWrapper = null; + this.lastSelectedViewDesc = void 0; + this.input = new InputState(); + this.prevDirectPlugins = []; + this.pluginViews = []; + this.requiresGeckoHackNode = false; + this.dragging = null; + this._props = props; + this.state = props.state; + this.directPlugins = props.plugins || []; + this.directPlugins.forEach(checkStateComponent); + this.dispatch = this.dispatch.bind(this); + this.dom = place && place.mount || document.createElement("div"); + if (place) { + if (place.appendChild) + place.appendChild(this.dom); + else if (typeof place == "function") + place(this.dom); + else if (place.mount) + this.mounted = true; + } + this.editable = getEditable(this); + updateCursorWrapper(this); + this.nodeViews = buildNodeViews(this); + this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this); + this.domObserver = new DOMObserver(this, (from2, to, typeOver, added) => readDOMChange(this, from2, to, typeOver, added)); + this.domObserver.start(); + initInput(this); + this.updatePluginViews(); + } + /** + Holds `true` when a + [composition](https://w3c.github.io/uievents/#events-compositionevents) + is active. + */ + get composing() { + return this.input.composing; + } + /** + The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps). + */ + get props() { + if (this._props.state != this.state) { + let prev = this._props; + this._props = {}; + for (let name in prev) + this._props[name] = prev[name]; + this._props.state = this.state; + } + return this._props; + } + /** + Update the view's props. Will immediately cause an update to + the DOM. + */ + update(props) { + if (props.handleDOMEvents != this._props.handleDOMEvents) + ensureListeners(this); + let prevProps = this._props; + this._props = props; + if (props.plugins) { + props.plugins.forEach(checkStateComponent); + this.directPlugins = props.plugins; + } + this.updateStateInner(props.state, prevProps); + } + /** + Update the view by updating existing props object with the object + given as argument. Equivalent to `view.update(Object.assign({}, + view.props, props))`. + */ + setProps(props) { + let updated = {}; + for (let name in this._props) + updated[name] = this._props[name]; + updated.state = this.state; + for (let name in props) + updated[name] = props[name]; + this.update(updated); + } + /** + Update the editor's `state` prop, without touching any of the + other props. + */ + updateState(state) { + this.updateStateInner(state, this._props); + } + updateStateInner(state, prevProps) { + var _a; + let prev = this.state, redraw = false, updateSel = false; + if (state.storedMarks && this.composing) { + clearComposition(this); + updateSel = true; + } + this.state = state; + let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins; + if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) { + let nodeViews = buildNodeViews(this); + if (changedNodeViews(nodeViews, this.nodeViews)) { + this.nodeViews = nodeViews; + redraw = true; + } + } + if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) { + ensureListeners(this); + } + this.editable = getEditable(this); + updateCursorWrapper(this); + let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this); + let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? "reset" : state.scrollToSelection > prev.scrollToSelection ? "to selection" : "preserve"; + let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco); + if (updateDoc || !state.selection.eq(prev.selection)) + updateSel = true; + let oldScrollPos = scroll == "preserve" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this); + if (updateSel) { + this.domObserver.stop(); + let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing && !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection); + if (updateDoc) { + let chromeKludge = chrome ? this.trackWrites = this.domSelectionRange().focusNode : null; + if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) { + this.docView.updateOuterDeco([]); + this.docView.destroy(); + this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this); + } + if (chromeKludge && !this.trackWrites) + forceSelUpdate = true; + } + if (forceSelUpdate || !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) && anchorInRightPlace(this))) { + selectionToDOM(this, forceSelUpdate); + } else { + syncNodeSelection(this, state.selection); + this.domObserver.setCurSelection(); + } + this.domObserver.start(); + } + this.updatePluginViews(prev); + if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc)) + this.updateDraggedNode(this.dragging, prev); + if (scroll == "reset") { + this.dom.scrollTop = 0; + } else if (scroll == "to selection") { + this.scrollToSelection(); + } else if (oldScrollPos) { + resetScrollPos(oldScrollPos); + } + } + /** + @internal + */ + scrollToSelection() { + let startDOM = this.domSelectionRange().focusNode; + if (this.someProp("handleScrollToSelection", (f) => f(this))) + ; + else if (this.state.selection instanceof NodeSelection) { + let target = this.docView.domAfterPos(this.state.selection.from); + if (target.nodeType == 1) + scrollRectIntoView(this, target.getBoundingClientRect(), startDOM); + } else { + scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM); + } + } + destroyPluginViews() { + let view; + while (view = this.pluginViews.pop()) + if (view.destroy) + view.destroy(); + } + updatePluginViews(prevState) { + if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) { + this.prevDirectPlugins = this.directPlugins; + this.destroyPluginViews(); + for (let i = 0; i < this.directPlugins.length; i++) { + let plugin = this.directPlugins[i]; + if (plugin.spec.view) + this.pluginViews.push(plugin.spec.view(this)); + } + for (let i = 0; i < this.state.plugins.length; i++) { + let plugin = this.state.plugins[i]; + if (plugin.spec.view) + this.pluginViews.push(plugin.spec.view(this)); + } + } else { + for (let i = 0; i < this.pluginViews.length; i++) { + let pluginView = this.pluginViews[i]; + if (pluginView.update) + pluginView.update(this, prevState); + } + } + } + updateDraggedNode(dragging, prev) { + let sel = dragging.node, found2 = -1; + if (this.state.doc.nodeAt(sel.from) == sel.node) { + found2 = sel.from; + } else { + let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size); + let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos); + if (moved == sel.node) + found2 = movedPos; + } + this.dragging = new Dragging(dragging.slice, dragging.move, found2 < 0 ? void 0 : NodeSelection.create(this.state.doc, found2)); + } + someProp(propName, f) { + let prop = this._props && this._props[propName], value; + if (prop != null && (value = f ? f(prop) : prop)) + return value; + for (let i = 0; i < this.directPlugins.length; i++) { + let prop2 = this.directPlugins[i].props[propName]; + if (prop2 != null && (value = f ? f(prop2) : prop2)) + return value; + } + let plugins = this.state.plugins; + if (plugins) + for (let i = 0; i < plugins.length; i++) { + let prop2 = plugins[i].props[propName]; + if (prop2 != null && (value = f ? f(prop2) : prop2)) + return value; + } + } + /** + Query whether the view has focus. + */ + hasFocus() { + if (ie) { + let node = this.root.activeElement; + if (node == this.dom) + return true; + if (!node || !this.dom.contains(node)) + return false; + while (node && this.dom != node && this.dom.contains(node)) { + if (node.contentEditable == "false") + return false; + node = node.parentElement; + } + return true; + } + return this.root.activeElement == this.dom; + } + /** + Focus the editor. + */ + focus() { + this.domObserver.stop(); + if (this.editable) + focusPreventScroll(this.dom); + selectionToDOM(this); + this.domObserver.start(); + } + /** + Get the document root in which the editor exists. This will + usually be the top-level `document`, but might be a [shadow + DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM) + root if the editor is inside one. + */ + get root() { + let cached = this._root; + if (cached == null) + for (let search = this.dom.parentNode; search; search = search.parentNode) { + if (search.nodeType == 9 || search.nodeType == 11 && search.host) { + if (!search.getSelection) + Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection(); + return this._root = search; + } + } + return cached || document; + } + /** + When an existing editor view is moved to a new document or + shadow tree, call this to make it recompute its root. + */ + updateRoot() { + this._root = null; + } + /** + Given a pair of viewport coordinates, return the document + position that corresponds to them. May return null if the given + coordinates aren't inside of the editor. When an object is + returned, its `pos` property is the position nearest to the + coordinates, and its `inside` property holds the position of the + inner node that the position falls inside of, or -1 if it is at + the top level, not in any node. + */ + posAtCoords(coords) { + return posAtCoords(this, coords); + } + /** + Returns the viewport rectangle at a given document position. + `left` and `right` will be the same number, as this returns a + flat cursor-ish rectangle. If the position is between two things + that aren't directly adjacent, `side` determines which element + is used. When < 0, the element before the position is used, + otherwise the element after. + */ + coordsAtPos(pos, side = 1) { + return coordsAtPos(this, pos, side); + } + /** + Find the DOM position that corresponds to the given document + position. When `side` is negative, find the position as close as + possible to the content before the position. When positive, + prefer positions close to the content after the position. When + zero, prefer as shallow a position as possible. + + Note that you should **not** mutate the editor's internal DOM, + only inspect it (and even that is usually not necessary). + */ + domAtPos(pos, side = 0) { + return this.docView.domFromPos(pos, side); + } + /** + Find the DOM node that represents the document node after the + given position. May return `null` when the position doesn't point + in front of a node or if the node is inside an opaque node view. + + This is intended to be able to call things like + `getBoundingClientRect` on that DOM node. Do **not** mutate the + editor DOM directly, or add styling this way, since that will be + immediately overriden by the editor as it redraws the node. + */ + nodeDOM(pos) { + let desc = this.docView.descAt(pos); + return desc ? desc.nodeDOM : null; + } + /** + Find the document position that corresponds to a given DOM + position. (Whenever possible, it is preferable to inspect the + document structure directly, rather than poking around in the + DOM, but sometimes—for example when interpreting an event + target—you don't have a choice.) + + The `bias` parameter can be used to influence which side of a DOM + node to use when the position is inside a leaf node. + */ + posAtDOM(node, offset2, bias = -1) { + let pos = this.docView.posFromDOM(node, offset2, bias); + if (pos == null) + throw new RangeError("DOM position not inside the editor"); + return pos; + } + /** + Find out whether the selection is at the end of a textblock when + moving in a given direction. When, for example, given `"left"`, + it will return true if moving left from the current cursor + position would leave that position's parent textblock. Will apply + to the view's current state by default, but it is possible to + pass a different state. + */ + endOfTextblock(dir, state) { + return endOfTextblock(this, state || this.state, dir); + } + /** + Run the editor's paste logic with the given HTML string. The + `event`, if given, will be passed to the + [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook. + */ + pasteHTML(html, event) { + return doPaste(this, "", html, false, event || new ClipboardEvent("paste")); + } + /** + Run the editor's paste logic with the given plain-text input. + */ + pasteText(text, event) { + return doPaste(this, text, null, true, event || new ClipboardEvent("paste")); + } + /** + Removes the editor from the DOM and destroys all [node + views](https://prosemirror.net/docs/ref/#view.NodeView). + */ + destroy() { + if (!this.docView) + return; + destroyInput(this); + this.destroyPluginViews(); + if (this.mounted) { + this.docView.update(this.state.doc, [], viewDecorations(this), this); + this.dom.textContent = ""; + } else if (this.dom.parentNode) { + this.dom.parentNode.removeChild(this.dom); + } + this.docView.destroy(); + this.docView = null; + } + /** + This is true when the view has been + [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be + used anymore). + */ + get isDestroyed() { + return this.docView == null; + } + /** + Used for testing. + */ + dispatchEvent(event) { + return dispatchEvent(this, event); + } + /** + Dispatch a transaction. Will call + [`dispatchTransaction`](https://prosemirror.net/docs/ref/#view.DirectEditorProps.dispatchTransaction) + when given, and otherwise defaults to applying the transaction to + the current state and calling + [`updateState`](https://prosemirror.net/docs/ref/#view.EditorView.updateState) with the result. + This method is bound to the view instance, so that it can be + easily passed around. + */ + dispatch(tr2) { + let dispatchTransaction = this._props.dispatchTransaction; + if (dispatchTransaction) + dispatchTransaction.call(this, tr2); + else + this.updateState(this.state.apply(tr2)); + } + /** + @internal + */ + domSelectionRange() { + return safari && this.root.nodeType === 11 && deepActiveElement(this.dom.ownerDocument) == this.dom ? safariShadowSelectionRange(this) : this.domSelection(); + } + /** + @internal + */ + domSelection() { + return this.root.getSelection(); + } +}; +function computeDocDeco(view) { + let attrs = /* @__PURE__ */ Object.create(null); + attrs.class = "ProseMirror"; + attrs.contenteditable = String(view.editable); + view.someProp("attributes", (value) => { + if (typeof value == "function") + value = value(view.state); + if (value) + for (let attr in value) { + if (attr == "class") + attrs.class += " " + value[attr]; + else if (attr == "style") + attrs.style = (attrs.style ? attrs.style + ";" : "") + value[attr]; + else if (!attrs[attr] && attr != "contenteditable" && attr != "nodeName") + attrs[attr] = String(value[attr]); + } + }); + if (!attrs.translate) + attrs.translate = "no"; + return [Decoration.node(0, view.state.doc.content.size, attrs)]; +} +function updateCursorWrapper(view) { + if (view.markCursor) { + let dom = document.createElement("img"); + dom.className = "ProseMirror-separator"; + dom.setAttribute("mark-placeholder", "true"); + dom.setAttribute("alt", ""); + view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.head, dom, { raw: true, marks: view.markCursor }) }; + } else { + view.cursorWrapper = null; + } +} +function getEditable(view) { + return !view.someProp("editable", (value) => value(view.state) === false); +} +function selectionContextChanged(sel1, sel2) { + let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head)); + return sel1.$anchor.start(depth) != sel2.$anchor.start(depth); +} +function buildNodeViews(view) { + let result = /* @__PURE__ */ Object.create(null); + function add(obj) { + for (let prop in obj) + if (!Object.prototype.hasOwnProperty.call(result, prop)) + result[prop] = obj[prop]; + } + view.someProp("nodeViews", add); + view.someProp("markViews", add); + return result; +} +function changedNodeViews(a, b) { + let nA = 0, nB = 0; + for (let prop in a) { + if (a[prop] != b[prop]) + return true; + nA++; + } + for (let _ in b) + nB++; + return nA != nB; +} +function checkStateComponent(plugin) { + if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction) + throw new RangeError("Plugins passed directly to the view must not have a state component"); +} + +// node_modules/w3c-keyname/index.js +var base = { + 8: "Backspace", + 9: "Tab", + 10: "Enter", + 12: "NumLock", + 13: "Enter", + 16: "Shift", + 17: "Control", + 18: "Alt", + 20: "CapsLock", + 27: "Escape", + 32: " ", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "ArrowLeft", + 38: "ArrowUp", + 39: "ArrowRight", + 40: "ArrowDown", + 44: "PrintScreen", + 45: "Insert", + 46: "Delete", + 59: ";", + 61: "=", + 91: "Meta", + 92: "Meta", + 106: "*", + 107: "+", + 108: ",", + 109: "-", + 110: ".", + 111: "/", + 144: "NumLock", + 145: "ScrollLock", + 160: "Shift", + 161: "Shift", + 162: "Control", + 163: "Control", + 164: "Alt", + 165: "Alt", + 173: "-", + 186: ";", + 187: "=", + 188: ",", + 189: "-", + 190: ".", + 191: "/", + 192: "`", + 219: "[", + 220: "\\", + 221: "]", + 222: "'" +}; +var shift = { + 48: ")", + 49: "!", + 50: "@", + 51: "#", + 52: "$", + 53: "%", + 54: "^", + 55: "&", + 56: "*", + 57: "(", + 59: ":", + 61: "+", + 173: "_", + 186: ":", + 187: "+", + 188: "<", + 189: "_", + 190: ">", + 191: "?", + 192: "~", + 219: "{", + 220: "|", + 221: "}", + 222: '"' +}; +var mac2 = typeof navigator != "undefined" && /Mac/.test(navigator.platform); +var ie2 = typeof navigator != "undefined" && /MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent); +for (i = 0; i < 10; i++) + base[48 + i] = base[96 + i] = String(i); +var i; +for (i = 1; i <= 24; i++) + base[i + 111] = "F" + i; +var i; +for (i = 65; i <= 90; i++) { + base[i] = String.fromCharCode(i + 32); + shift[i] = String.fromCharCode(i); +} +var i; +for (code in base) + if (!shift.hasOwnProperty(code)) + shift[code] = base[code]; +var code; +function keyName(event) { + var ignoreKey = mac2 && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey || ie2 && event.shiftKey && event.key && event.key.length == 1 || event.key == "Unidentified"; + var name = !ignoreKey && event.key || (event.shiftKey ? shift : base)[event.keyCode] || event.key || "Unidentified"; + if (name == "Esc") + name = "Escape"; + if (name == "Del") + name = "Delete"; + if (name == "Left") + name = "ArrowLeft"; + if (name == "Up") + name = "ArrowUp"; + if (name == "Right") + name = "ArrowRight"; + if (name == "Down") + name = "ArrowDown"; + return name; +} + +// node_modules/prosemirror-keymap/dist/index.js +var mac3 = typeof navigator != "undefined" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : false; +function normalizeKeyName(name) { + let parts = name.split(/-(?!$)/), result = parts[parts.length - 1]; + if (result == "Space") + result = " "; + let alt, ctrl, shift2, meta; + for (let i = 0; i < parts.length - 1; i++) { + let mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) + meta = true; + else if (/^a(lt)?$/i.test(mod)) + alt = true; + else if (/^(c|ctrl|control)$/i.test(mod)) + ctrl = true; + else if (/^s(hift)?$/i.test(mod)) + shift2 = true; + else if (/^mod$/i.test(mod)) { + if (mac3) + meta = true; + else + ctrl = true; + } else + throw new Error("Unrecognized modifier name: " + mod); + } + if (alt) + result = "Alt-" + result; + if (ctrl) + result = "Ctrl-" + result; + if (meta) + result = "Meta-" + result; + if (shift2) + result = "Shift-" + result; + return result; +} +function normalize(map2) { + let copy2 = /* @__PURE__ */ Object.create(null); + for (let prop in map2) + copy2[normalizeKeyName(prop)] = map2[prop]; + return copy2; +} +function modifiers(name, event, shift2 = true) { + if (event.altKey) + name = "Alt-" + name; + if (event.ctrlKey) + name = "Ctrl-" + name; + if (event.metaKey) + name = "Meta-" + name; + if (shift2 && event.shiftKey) + name = "Shift-" + name; + return name; +} +function keymap(bindings) { + return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } }); +} +function keydownHandler(bindings) { + let map2 = normalize(bindings); + return function(view, event) { + let name = keyName(event), baseName, direct = map2[modifiers(name, event)]; + if (direct && direct(view.state, view.dispatch, view)) + return true; + if (name.length == 1 && name != " ") { + if (event.shiftKey) { + let noShift = map2[modifiers(name, event, false)]; + if (noShift && noShift(view.state, view.dispatch, view)) + return true; + } + if ((event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) && (baseName = base[event.keyCode]) && baseName != name) { + let fromCode = map2[modifiers(baseName, event)]; + if (fromCode && fromCode(view.state, view.dispatch, view)) + return true; + } + } + return false; + }; +} + +// node_modules/prosemirror-commands/dist/index.js +var deleteSelection = (state, dispatch) => { + if (state.selection.empty) + return false; + if (dispatch) + dispatch(state.tr.deleteSelection().scrollIntoView()); + return true; +}; +function atBlockStart(state, view) { + let { $cursor } = state.selection; + if (!$cursor || (view ? !view.endOfTextblock("backward", state) : $cursor.parentOffset > 0)) + return null; + return $cursor; +} +var joinBackward = (state, dispatch, view) => { + let $cursor = atBlockStart(state, view); + if (!$cursor) + return false; + let $cut = findCutBefore($cursor); + if (!$cut) { + let range = $cursor.blockRange(), target = range && liftTarget(range); + if (target == null) + return false; + if (dispatch) + dispatch(state.tr.lift(range, target).scrollIntoView()); + return true; + } + let before = $cut.nodeBefore; + if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch)) + return true; + if ($cursor.parent.content.size == 0 && (textblockAt(before, "end") || NodeSelection.isSelectable(before))) { + let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty); + if (delStep && delStep.slice.size < delStep.to - delStep.from) { + if (dispatch) { + let tr2 = state.tr.step(delStep); + tr2.setSelection(textblockAt(before, "end") ? Selection.findFrom(tr2.doc.resolve(tr2.mapping.map($cut.pos, -1)), -1) : NodeSelection.create(tr2.doc, $cut.pos - before.nodeSize)); + dispatch(tr2.scrollIntoView()); + } + return true; + } + } + if (before.isAtom && $cut.depth == $cursor.depth - 1) { + if (dispatch) + dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView()); + return true; + } + return false; +}; +function textblockAt(node, side, only = false) { + for (let scan = node; scan; scan = side == "start" ? scan.firstChild : scan.lastChild) { + if (scan.isTextblock) + return true; + if (only && scan.childCount != 1) + return false; + } + return false; +} +var selectNodeBackward = (state, dispatch, view) => { + let { $head, empty: empty2 } = state.selection, $cut = $head; + if (!empty2) + return false; + if ($head.parent.isTextblock) { + if (view ? !view.endOfTextblock("backward", state) : $head.parentOffset > 0) + return false; + $cut = findCutBefore($head); + } + let node = $cut && $cut.nodeBefore; + if (!node || !NodeSelection.isSelectable(node)) + return false; + if (dispatch) + dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView()); + return true; +}; +function findCutBefore($pos) { + if (!$pos.parent.type.spec.isolating) + for (let i = $pos.depth - 1; i >= 0; i--) { + if ($pos.index(i) > 0) + return $pos.doc.resolve($pos.before(i + 1)); + if ($pos.node(i).type.spec.isolating) + break; + } + return null; +} +function atBlockEnd(state, view) { + let { $cursor } = state.selection; + if (!$cursor || (view ? !view.endOfTextblock("forward", state) : $cursor.parentOffset < $cursor.parent.content.size)) + return null; + return $cursor; +} +var joinForward = (state, dispatch, view) => { + let $cursor = atBlockEnd(state, view); + if (!$cursor) + return false; + let $cut = findCutAfter($cursor); + if (!$cut) + return false; + let after = $cut.nodeAfter; + if (deleteBarrier(state, $cut, dispatch)) + return true; + if ($cursor.parent.content.size == 0 && (textblockAt(after, "start") || NodeSelection.isSelectable(after))) { + let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty); + if (delStep && delStep.slice.size < delStep.to - delStep.from) { + if (dispatch) { + let tr2 = state.tr.step(delStep); + tr2.setSelection(textblockAt(after, "start") ? Selection.findFrom(tr2.doc.resolve(tr2.mapping.map($cut.pos)), 1) : NodeSelection.create(tr2.doc, tr2.mapping.map($cut.pos))); + dispatch(tr2.scrollIntoView()); + } + return true; + } + } + if (after.isAtom && $cut.depth == $cursor.depth - 1) { + if (dispatch) + dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView()); + return true; + } + return false; +}; +var selectNodeForward = (state, dispatch, view) => { + let { $head, empty: empty2 } = state.selection, $cut = $head; + if (!empty2) + return false; + if ($head.parent.isTextblock) { + if (view ? !view.endOfTextblock("forward", state) : $head.parentOffset < $head.parent.content.size) + return false; + $cut = findCutAfter($head); + } + let node = $cut && $cut.nodeAfter; + if (!node || !NodeSelection.isSelectable(node)) + return false; + if (dispatch) + dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView()); + return true; +}; +function findCutAfter($pos) { + if (!$pos.parent.type.spec.isolating) + for (let i = $pos.depth - 1; i >= 0; i--) { + let parent = $pos.node(i); + if ($pos.index(i) + 1 < parent.childCount) + return $pos.doc.resolve($pos.after(i + 1)); + if (parent.type.spec.isolating) + break; + } + return null; +} +var joinUp = (state, dispatch) => { + let sel = state.selection, nodeSel = sel instanceof NodeSelection, point; + if (nodeSel) { + if (sel.node.isTextblock || !canJoin(state.doc, sel.from)) + return false; + point = sel.from; + } else { + point = joinPoint(state.doc, sel.from, -1); + if (point == null) + return false; + } + if (dispatch) { + let tr2 = state.tr.join(point); + if (nodeSel) + tr2.setSelection(NodeSelection.create(tr2.doc, point - state.doc.resolve(point).nodeBefore.nodeSize)); + dispatch(tr2.scrollIntoView()); + } + return true; +}; +var joinDown = (state, dispatch) => { + let sel = state.selection, point; + if (sel instanceof NodeSelection) { + if (sel.node.isTextblock || !canJoin(state.doc, sel.to)) + return false; + point = sel.to; + } else { + point = joinPoint(state.doc, sel.to, 1); + if (point == null) + return false; + } + if (dispatch) + dispatch(state.tr.join(point).scrollIntoView()); + return true; +}; +var lift2 = (state, dispatch) => { + let { $from, $to } = state.selection; + let range = $from.blockRange($to), target = range && liftTarget(range); + if (target == null) + return false; + if (dispatch) + dispatch(state.tr.lift(range, target).scrollIntoView()); + return true; +}; +var newlineInCode = (state, dispatch) => { + let { $head, $anchor } = state.selection; + if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) + return false; + if (dispatch) + dispatch(state.tr.insertText("\n").scrollIntoView()); + return true; +}; +function defaultBlockAt(match) { + for (let i = 0; i < match.edgeCount; i++) { + let { type } = match.edge(i); + if (type.isTextblock && !type.hasRequiredAttrs()) + return type; + } + return null; +} +var exitCode = (state, dispatch) => { + let { $head, $anchor } = state.selection; + if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) + return false; + let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after)); + if (!type || !above.canReplaceWith(after, after, type)) + return false; + if (dispatch) { + let pos = $head.after(), tr2 = state.tr.replaceWith(pos, pos, type.createAndFill()); + tr2.setSelection(Selection.near(tr2.doc.resolve(pos), 1)); + dispatch(tr2.scrollIntoView()); + } + return true; +}; +var createParagraphNear = (state, dispatch) => { + let sel = state.selection, { $from, $to } = sel; + if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent) + return false; + let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter())); + if (!type || !type.isTextblock) + return false; + if (dispatch) { + let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos; + let tr2 = state.tr.insert(side, type.createAndFill()); + tr2.setSelection(TextSelection.create(tr2.doc, side + 1)); + dispatch(tr2.scrollIntoView()); + } + return true; +}; +var liftEmptyBlock = (state, dispatch) => { + let { $cursor } = state.selection; + if (!$cursor || $cursor.parent.content.size) + return false; + if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) { + let before = $cursor.before(); + if (canSplit(state.doc, before)) { + if (dispatch) + dispatch(state.tr.split(before).scrollIntoView()); + return true; + } + } + let range = $cursor.blockRange(), target = range && liftTarget(range); + if (target == null) + return false; + if (dispatch) + dispatch(state.tr.lift(range, target).scrollIntoView()); + return true; +}; +function splitBlockAs(splitNode) { + return (state, dispatch) => { + let { $from, $to } = state.selection; + if (state.selection instanceof NodeSelection && state.selection.node.isBlock) { + if (!$from.parentOffset || !canSplit(state.doc, $from.pos)) + return false; + if (dispatch) + dispatch(state.tr.split($from.pos).scrollIntoView()); + return true; + } + if (!$from.parent.isBlock) + return false; + if (dispatch) { + let atEnd = $to.parentOffset == $to.parent.content.size; + let tr2 = state.tr; + if (state.selection instanceof TextSelection || state.selection instanceof AllSelection) + tr2.deleteSelection(); + let deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1))); + let splitType = splitNode && splitNode($to.parent, atEnd); + let types = splitType ? [splitType] : atEnd && deflt ? [{ type: deflt }] : void 0; + let can = canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, types); + if (!types && !can && canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : void 0)) { + if (deflt) + types = [{ type: deflt }]; + can = true; + } + if (can) { + tr2.split(tr2.mapping.map($from.pos), 1, types); + if (!atEnd && !$from.parentOffset && $from.parent.type != deflt) { + let first2 = tr2.mapping.map($from.before()), $first = tr2.doc.resolve(first2); + if (deflt && $from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) + tr2.setNodeMarkup(tr2.mapping.map($from.before()), deflt); + } + } + dispatch(tr2.scrollIntoView()); + } + return true; + }; +} +var splitBlock = splitBlockAs(); +var selectParentNode = (state, dispatch) => { + let { $from, to } = state.selection, pos; + let same = $from.sharedDepth(to); + if (same == 0) + return false; + pos = $from.before(same); + if (dispatch) + dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos))); + return true; +}; +var selectAll = (state, dispatch) => { + if (dispatch) + dispatch(state.tr.setSelection(new AllSelection(state.doc))); + return true; +}; +function joinMaybeClear(state, $pos, dispatch) { + let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index(); + if (!before || !after || !before.type.compatibleContent(after.type)) + return false; + if (!before.content.size && $pos.parent.canReplace(index - 1, index)) { + if (dispatch) + dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView()); + return true; + } + if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos))) + return false; + if (dispatch) + dispatch(state.tr.clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount)).join($pos.pos).scrollIntoView()); + return true; +} +function deleteBarrier(state, $cut, dispatch) { + let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match; + if (before.type.spec.isolating || after.type.spec.isolating) + return false; + if (joinMaybeClear(state, $cut, dispatch)) + return true; + let canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1); + if (canDelAfter && (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) && match.matchType(conn[0] || after.type).validEnd) { + if (dispatch) { + let end2 = $cut.pos + after.nodeSize, wrap2 = Fragment.empty; + for (let i = conn.length - 1; i >= 0; i--) + wrap2 = Fragment.from(conn[i].create(null, wrap2)); + wrap2 = Fragment.from(before.copy(wrap2)); + let tr2 = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end2, $cut.pos, end2, new Slice(wrap2, 1, 0), conn.length, true)); + let joinAt = end2 + 2 * conn.length; + if (canJoin(tr2.doc, joinAt)) + tr2.join(joinAt); + dispatch(tr2.scrollIntoView()); + } + return true; + } + let selAfter = Selection.findFrom($cut, 1); + let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range); + if (target != null && target >= $cut.depth) { + if (dispatch) + dispatch(state.tr.lift(range, target).scrollIntoView()); + return true; + } + if (canDelAfter && textblockAt(after, "start", true) && textblockAt(before, "end")) { + let at = before, wrap2 = []; + for (; ; ) { + wrap2.push(at); + if (at.isTextblock) + break; + at = at.lastChild; + } + let afterText = after, afterDepth = 1; + for (; !afterText.isTextblock; afterText = afterText.firstChild) + afterDepth++; + if (at.canReplace(at.childCount, at.childCount, afterText.content)) { + if (dispatch) { + let end2 = Fragment.empty; + for (let i = wrap2.length - 1; i >= 0; i--) + end2 = Fragment.from(wrap2[i].copy(end2)); + let tr2 = state.tr.step(new ReplaceAroundStep($cut.pos - wrap2.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end2, wrap2.length, 0), 0, true)); + dispatch(tr2.scrollIntoView()); + } + return true; + } + } + return false; +} +function selectTextblockSide(side) { + return function(state, dispatch) { + let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to; + let depth = $pos.depth; + while ($pos.node(depth).isInline) { + if (!depth) + return false; + depth--; + } + if (!$pos.node(depth).isTextblock) + return false; + if (dispatch) + dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth)))); + return true; + }; +} +var selectTextblockStart = selectTextblockSide(-1); +var selectTextblockEnd = selectTextblockSide(1); +function wrapIn(nodeType, attrs = null) { + return function(state, dispatch) { + let { $from, $to } = state.selection; + let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs); + if (!wrapping) + return false; + if (dispatch) + dispatch(state.tr.wrap(range, wrapping).scrollIntoView()); + return true; + }; +} +function setBlockType2(nodeType, attrs = null) { + return function(state, dispatch) { + let applicable = false; + for (let i = 0; i < state.selection.ranges.length && !applicable; i++) { + let { $from: { pos: from2 }, $to: { pos: to } } = state.selection.ranges[i]; + state.doc.nodesBetween(from2, to, (node, pos) => { + if (applicable) + return false; + if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) + return; + if (node.type == nodeType) { + applicable = true; + } else { + let $pos = state.doc.resolve(pos), index = $pos.index(); + applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType); + } + }); + } + if (!applicable) + return false; + if (dispatch) { + let tr2 = state.tr; + for (let i = 0; i < state.selection.ranges.length; i++) { + let { $from: { pos: from2 }, $to: { pos: to } } = state.selection.ranges[i]; + tr2.setBlockType(from2, to, nodeType, attrs); + } + dispatch(tr2.scrollIntoView()); + } + return true; + }; +} +function chainCommands(...commands2) { + return function(state, dispatch, view) { + for (let i = 0; i < commands2.length; i++) + if (commands2[i](state, dispatch, view)) + return true; + return false; + }; +} +var backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward); +var del = chainCommands(deleteSelection, joinForward, selectNodeForward); +var pcBaseKeymap = { + "Enter": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock), + "Mod-Enter": exitCode, + "Backspace": backspace, + "Mod-Backspace": backspace, + "Shift-Backspace": backspace, + "Delete": del, + "Mod-Delete": del, + "Mod-a": selectAll +}; +var macBaseKeymap = { + "Ctrl-h": pcBaseKeymap["Backspace"], + "Alt-Backspace": pcBaseKeymap["Mod-Backspace"], + "Ctrl-d": pcBaseKeymap["Delete"], + "Ctrl-Alt-Backspace": pcBaseKeymap["Mod-Delete"], + "Alt-Delete": pcBaseKeymap["Mod-Delete"], + "Alt-d": pcBaseKeymap["Mod-Delete"], + "Ctrl-a": selectTextblockStart, + "Ctrl-e": selectTextblockEnd +}; +for (let key in pcBaseKeymap) + macBaseKeymap[key] = pcBaseKeymap[key]; +var mac4 = typeof navigator != "undefined" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : typeof os != "undefined" && os.platform ? os.platform() == "darwin" : false; + +// node_modules/prosemirror-schema-list/dist/index.js +function wrapInList(listType, attrs = null) { + return function(state, dispatch) { + let { $from, $to } = state.selection; + let range = $from.blockRange($to), doJoin = false, outerRange = range; + if (!range) + return false; + if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) { + if ($from.index(range.depth - 1) == 0) + return false; + let $insert = state.doc.resolve(range.start - 2); + outerRange = new NodeRange($insert, $insert, range.depth); + if (range.endIndex < range.parent.childCount) + range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth); + doJoin = true; + } + let wrap2 = findWrapping(outerRange, listType, attrs, range); + if (!wrap2) + return false; + if (dispatch) + dispatch(doWrapInList(state.tr, range, wrap2, doJoin, listType).scrollIntoView()); + return true; + }; +} +function doWrapInList(tr2, range, wrappers, joinBefore, listType) { + let content = Fragment.empty; + for (let i = wrappers.length - 1; i >= 0; i--) + content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); + tr2.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end, new Slice(content, 0, 0), wrappers.length, true)); + let found2 = 0; + for (let i = 0; i < wrappers.length; i++) + if (wrappers[i].type == listType) + found2 = i + 1; + let splitDepth = wrappers.length - found2; + let splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent; + for (let i = range.startIndex, e = range.endIndex, first2 = true; i < e; i++, first2 = false) { + if (!first2 && canSplit(tr2.doc, splitPos, splitDepth)) { + tr2.split(splitPos, splitDepth); + splitPos += 2 * splitDepth; + } + splitPos += parent.child(i).nodeSize; + } + return tr2; +} +function liftListItem(itemType) { + return function(state, dispatch) { + let { $from, $to } = state.selection; + let range = $from.blockRange($to, (node) => node.childCount > 0 && node.firstChild.type == itemType); + if (!range) + return false; + if (!dispatch) + return true; + if ($from.node(range.depth - 1).type == itemType) + return liftToOuterList(state, dispatch, itemType, range); + else + return liftOutOfList(state, dispatch, range); + }; +} +function liftToOuterList(state, dispatch, itemType, range) { + let tr2 = state.tr, end2 = range.end, endOfList = range.$to.end(range.depth); + if (end2 < endOfList) { + tr2.step(new ReplaceAroundStep(end2 - 1, endOfList, end2, endOfList, new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true)); + range = new NodeRange(tr2.doc.resolve(range.$from.pos), tr2.doc.resolve(endOfList), range.depth); + } + const target = liftTarget(range); + if (target == null) + return false; + tr2.lift(range, target); + let after = tr2.mapping.map(end2, -1) - 1; + if (canJoin(tr2.doc, after)) + tr2.join(after); + dispatch(tr2.scrollIntoView()); + return true; +} +function liftOutOfList(state, dispatch, range) { + let tr2 = state.tr, list = range.parent; + for (let pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) { + pos -= list.child(i).nodeSize; + tr2.delete(pos - 1, pos + 1); + } + let $start = tr2.doc.resolve(range.start), item = $start.nodeAfter; + if (tr2.mapping.map(range.end) != range.start + $start.nodeAfter.nodeSize) + return false; + let atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount; + let parent = $start.node(-1), indexBefore = $start.index(-1); + if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1, item.content.append(atEnd ? Fragment.empty : Fragment.from(list)))) + return false; + let start2 = $start.pos, end2 = start2 + item.nodeSize; + tr2.step(new ReplaceAroundStep(start2 - (atStart ? 1 : 0), end2 + (atEnd ? 1 : 0), start2 + 1, end2 - 1, new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))).append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))), atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1)); + dispatch(tr2.scrollIntoView()); + return true; +} +function sinkListItem(itemType) { + return function(state, dispatch) { + let { $from, $to } = state.selection; + let range = $from.blockRange($to, (node) => node.childCount > 0 && node.firstChild.type == itemType); + if (!range) + return false; + let startIndex = range.startIndex; + if (startIndex == 0) + return false; + let parent = range.parent, nodeBefore = parent.child(startIndex - 1); + if (nodeBefore.type != itemType) + return false; + if (dispatch) { + let nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type; + let inner = Fragment.from(nestedBefore ? itemType.create() : null); + let slice2 = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))), nestedBefore ? 3 : 1, 0); + let before = range.start, after = range.end; + dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after, before, after, slice2, 1, true)).scrollIntoView()); + } + return true; + }; +} + +// node_modules/@tiptap/core/dist/index.js +function createChainableState(config) { + const { state, transaction } = config; + let { selection } = transaction; + let { doc: doc3 } = transaction; + let { storedMarks } = transaction; + return { + ...state, + apply: state.apply.bind(state), + applyTransaction: state.applyTransaction.bind(state), + filterTransaction: state.filterTransaction, + plugins: state.plugins, + schema: state.schema, + reconfigure: state.reconfigure.bind(state), + toJSON: state.toJSON.bind(state), + get storedMarks() { + return storedMarks; + }, + get selection() { + return selection; + }, + get doc() { + return doc3; + }, + get tr() { + selection = transaction.selection; + doc3 = transaction.doc; + storedMarks = transaction.storedMarks; + return transaction; + } + }; +} +var CommandManager = class { + constructor(props) { + this.editor = props.editor; + this.rawCommands = this.editor.extensionManager.commands; + this.customState = props.state; + } + get hasCustomState() { + return !!this.customState; + } + get state() { + return this.customState || this.editor.state; + } + get commands() { + const { rawCommands, editor, state } = this; + const { view } = editor; + const { tr: tr2 } = state; + const props = this.buildProps(tr2); + return Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { + const method = (...args) => { + const callback = command2(...args)(props); + if (!tr2.getMeta("preventDispatch") && !this.hasCustomState) { + view.dispatch(tr2); + } + return callback; + }; + return [name, method]; + })); + } + get chain() { + return () => this.createChain(); + } + get can() { + return () => this.createCan(); + } + createChain(startTr, shouldDispatch = true) { + const { rawCommands, editor, state } = this; + const { view } = editor; + const callbacks = []; + const hasStartTransaction = !!startTr; + const tr2 = startTr || state.tr; + const run3 = () => { + if (!hasStartTransaction && shouldDispatch && !tr2.getMeta("preventDispatch") && !this.hasCustomState) { + view.dispatch(tr2); + } + return callbacks.every((callback) => callback === true); + }; + const chain = { + ...Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { + const chainedCommand = (...args) => { + const props = this.buildProps(tr2, shouldDispatch); + const callback = command2(...args)(props); + callbacks.push(callback); + return chain; + }; + return [name, chainedCommand]; + })), + run: run3 + }; + return chain; + } + createCan(startTr) { + const { rawCommands, state } = this; + const dispatch = false; + const tr2 = startTr || state.tr; + const props = this.buildProps(tr2, dispatch); + const formattedCommands = Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { + return [name, (...args) => command2(...args)({ ...props, dispatch: void 0 })]; + })); + return { + ...formattedCommands, + chain: () => this.createChain(tr2, dispatch) + }; + } + buildProps(tr2, shouldDispatch = true) { + const { rawCommands, editor, state } = this; + const { view } = editor; + const props = { + tr: tr2, + editor, + view, + state: createChainableState({ + state, + transaction: tr2 + }), + dispatch: shouldDispatch ? () => void 0 : void 0, + chain: () => this.createChain(tr2, shouldDispatch), + can: () => this.createCan(tr2), + get commands() { + return Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { + return [name, (...args) => command2(...args)(props)]; + })); + } + }; + return props; + } +}; +var EventEmitter = class { + constructor() { + this.callbacks = {}; + } + on(event, fn2) { + if (!this.callbacks[event]) { + this.callbacks[event] = []; + } + this.callbacks[event].push(fn2); + return this; + } + emit(event, ...args) { + const callbacks = this.callbacks[event]; + if (callbacks) { + callbacks.forEach((callback) => callback.apply(this, args)); + } + return this; + } + off(event, fn2) { + const callbacks = this.callbacks[event]; + if (callbacks) { + if (fn2) { + this.callbacks[event] = callbacks.filter((callback) => callback !== fn2); + } else { + delete this.callbacks[event]; + } + } + return this; + } + removeAllListeners() { + this.callbacks = {}; + } +}; +function getExtensionField(extension, field, context) { + if (extension.config[field] === void 0 && extension.parent) { + return getExtensionField(extension.parent, field, context); + } + if (typeof extension.config[field] === "function") { + const value = extension.config[field].bind({ + ...context, + parent: extension.parent ? getExtensionField(extension.parent, field, context) : null + }); + return value; + } + return extension.config[field]; +} +function splitExtensions(extensions2) { + const baseExtensions = extensions2.filter((extension) => extension.type === "extension"); + const nodeExtensions = extensions2.filter((extension) => extension.type === "node"); + const markExtensions = extensions2.filter((extension) => extension.type === "mark"); + return { + baseExtensions, + nodeExtensions, + markExtensions + }; +} +function getAttributesFromExtensions(extensions2) { + const extensionAttributes = []; + const { nodeExtensions, markExtensions } = splitExtensions(extensions2); + const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions]; + const defaultAttribute = { + default: null, + rendered: true, + renderHTML: null, + parseHTML: null, + keepOnSplit: true, + isRequired: false + }; + extensions2.forEach((extension) => { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + const addGlobalAttributes = getExtensionField(extension, "addGlobalAttributes", context); + if (!addGlobalAttributes) { + return; + } + const globalAttributes = addGlobalAttributes(); + globalAttributes.forEach((globalAttribute) => { + globalAttribute.types.forEach((type) => { + Object.entries(globalAttribute.attributes).forEach(([name, attribute]) => { + extensionAttributes.push({ + type, + name, + attribute: { + ...defaultAttribute, + ...attribute + } + }); + }); + }); + }); + }); + nodeAndMarkExtensions.forEach((extension) => { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + const addAttributes = getExtensionField(extension, "addAttributes", context); + if (!addAttributes) { + return; + } + const attributes = addAttributes(); + Object.entries(attributes).forEach(([name, attribute]) => { + const mergedAttr = { + ...defaultAttribute, + ...attribute + }; + if (typeof (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === "function") { + mergedAttr.default = mergedAttr.default(); + } + if ((mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.isRequired) && (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === void 0) { + delete mergedAttr.default; + } + extensionAttributes.push({ + type: extension.name, + name, + attribute: mergedAttr + }); + }); + }); + return extensionAttributes; +} +function getNodeType(nameOrType, schema) { + if (typeof nameOrType === "string") { + if (!schema.nodes[nameOrType]) { + throw Error(`There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`); + } + return schema.nodes[nameOrType]; + } + return nameOrType; +} +function mergeAttributes(...objects) { + return objects.filter((item) => !!item).reduce((items, item) => { + const mergedAttributes = { ...items }; + Object.entries(item).forEach(([key, value]) => { + const exists = mergedAttributes[key]; + if (!exists) { + mergedAttributes[key] = value; + return; + } + if (key === "class") { + const valueClasses = value ? value.split(" ") : []; + const existingClasses = mergedAttributes[key] ? mergedAttributes[key].split(" ") : []; + const insertClasses = valueClasses.filter((valueClass) => !existingClasses.includes(valueClass)); + mergedAttributes[key] = [...existingClasses, ...insertClasses].join(" "); + } else if (key === "style") { + mergedAttributes[key] = [mergedAttributes[key], value].join("; "); + } else { + mergedAttributes[key] = value; + } + }); + return mergedAttributes; + }, {}); +} +function getRenderedAttributes(nodeOrMark, extensionAttributes) { + return extensionAttributes.filter((item) => item.attribute.rendered).map((item) => { + if (!item.attribute.renderHTML) { + return { + [item.name]: nodeOrMark.attrs[item.name] + }; + } + return item.attribute.renderHTML(nodeOrMark.attrs) || {}; + }).reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {}); +} +function isFunction(value) { + return typeof value === "function"; +} +function callOrReturn(value, context = void 0, ...props) { + if (isFunction(value)) { + if (context) { + return value.bind(context)(...props); + } + return value(...props); + } + return value; +} +function isEmptyObject(value = {}) { + return Object.keys(value).length === 0 && value.constructor === Object; +} +function fromString(value) { + if (typeof value !== "string") { + return value; + } + if (value.match(/^[+-]?(?:\d*\.)?\d+$/)) { + return Number(value); + } + if (value === "true") { + return true; + } + if (value === "false") { + return false; + } + return value; +} +function injectExtensionAttributesToParseRule(parseRule, extensionAttributes) { + if (parseRule.style) { + return parseRule; + } + return { + ...parseRule, + getAttrs: (node) => { + const oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs; + if (oldAttributes === false) { + return false; + } + const newAttributes = extensionAttributes.reduce((items, item) => { + const value = item.attribute.parseHTML ? item.attribute.parseHTML(node) : fromString(node.getAttribute(item.name)); + if (value === null || value === void 0) { + return items; + } + return { + ...items, + [item.name]: value + }; + }, {}); + return { ...oldAttributes, ...newAttributes }; + } + }; +} +function cleanUpSchemaItem(data) { + return Object.fromEntries( + // @ts-ignore + Object.entries(data).filter(([key, value]) => { + if (key === "attrs" && isEmptyObject(value)) { + return false; + } + return value !== null && value !== void 0; + }) + ); +} +function getSchemaByResolvedExtensions(extensions2, editor) { + var _a; + const allAttributes = getAttributesFromExtensions(extensions2); + const { nodeExtensions, markExtensions } = splitExtensions(extensions2); + const topNode = (_a = nodeExtensions.find((extension) => getExtensionField(extension, "topNode"))) === null || _a === void 0 ? void 0 : _a.name; + const nodes = Object.fromEntries(nodeExtensions.map((extension) => { + const extensionAttributes = allAttributes.filter((attribute) => attribute.type === extension.name); + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage, + editor + }; + const extraNodeFields = extensions2.reduce((fields, e) => { + const extendNodeSchema = getExtensionField(e, "extendNodeSchema", context); + return { + ...fields, + ...extendNodeSchema ? extendNodeSchema(extension) : {} + }; + }, {}); + const schema = cleanUpSchemaItem({ + ...extraNodeFields, + content: callOrReturn(getExtensionField(extension, "content", context)), + marks: callOrReturn(getExtensionField(extension, "marks", context)), + group: callOrReturn(getExtensionField(extension, "group", context)), + inline: callOrReturn(getExtensionField(extension, "inline", context)), + atom: callOrReturn(getExtensionField(extension, "atom", context)), + selectable: callOrReturn(getExtensionField(extension, "selectable", context)), + draggable: callOrReturn(getExtensionField(extension, "draggable", context)), + code: callOrReturn(getExtensionField(extension, "code", context)), + defining: callOrReturn(getExtensionField(extension, "defining", context)), + isolating: callOrReturn(getExtensionField(extension, "isolating", context)), + attrs: Object.fromEntries(extensionAttributes.map((extensionAttribute) => { + var _a2; + return [extensionAttribute.name, { default: (_a2 = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a2 === void 0 ? void 0 : _a2.default }]; + })) + }); + const parseHTML = callOrReturn(getExtensionField(extension, "parseHTML", context)); + if (parseHTML) { + schema.parseDOM = parseHTML.map((parseRule) => injectExtensionAttributesToParseRule(parseRule, extensionAttributes)); + } + const renderHTML = getExtensionField(extension, "renderHTML", context); + if (renderHTML) { + schema.toDOM = (node) => renderHTML({ + node, + HTMLAttributes: getRenderedAttributes(node, extensionAttributes) + }); + } + const renderText = getExtensionField(extension, "renderText", context); + if (renderText) { + schema.toText = renderText; + } + return [extension.name, schema]; + })); + const marks = Object.fromEntries(markExtensions.map((extension) => { + const extensionAttributes = allAttributes.filter((attribute) => attribute.type === extension.name); + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage, + editor + }; + const extraMarkFields = extensions2.reduce((fields, e) => { + const extendMarkSchema = getExtensionField(e, "extendMarkSchema", context); + return { + ...fields, + ...extendMarkSchema ? extendMarkSchema(extension) : {} + }; + }, {}); + const schema = cleanUpSchemaItem({ + ...extraMarkFields, + inclusive: callOrReturn(getExtensionField(extension, "inclusive", context)), + excludes: callOrReturn(getExtensionField(extension, "excludes", context)), + group: callOrReturn(getExtensionField(extension, "group", context)), + spanning: callOrReturn(getExtensionField(extension, "spanning", context)), + code: callOrReturn(getExtensionField(extension, "code", context)), + attrs: Object.fromEntries(extensionAttributes.map((extensionAttribute) => { + var _a2; + return [extensionAttribute.name, { default: (_a2 = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a2 === void 0 ? void 0 : _a2.default }]; + })) + }); + const parseHTML = callOrReturn(getExtensionField(extension, "parseHTML", context)); + if (parseHTML) { + schema.parseDOM = parseHTML.map((parseRule) => injectExtensionAttributesToParseRule(parseRule, extensionAttributes)); + } + const renderHTML = getExtensionField(extension, "renderHTML", context); + if (renderHTML) { + schema.toDOM = (mark) => renderHTML({ + mark, + HTMLAttributes: getRenderedAttributes(mark, extensionAttributes) + }); + } + return [extension.name, schema]; + })); + return new Schema({ + topNode, + nodes, + marks + }); +} +function getSchemaTypeByName(name, schema) { + return schema.nodes[name] || schema.marks[name] || null; +} +function isExtensionRulesEnabled(extension, enabled) { + if (Array.isArray(enabled)) { + return enabled.some((enabledExtension) => { + const name = typeof enabledExtension === "string" ? enabledExtension : enabledExtension.name; + return name === extension.name; + }); + } + return enabled; +} +var getTextContentFromNodes = ($from, maxMatch = 500) => { + let textBefore = ""; + const sliceEndPos = $from.parentOffset; + $from.parent.nodesBetween(Math.max(0, sliceEndPos - maxMatch), sliceEndPos, (node, pos, parent, index) => { + var _a, _b; + const chunk = ((_b = (_a = node.type.spec).toText) === null || _b === void 0 ? void 0 : _b.call(_a, { + node, + pos, + parent, + index + })) || node.textContent || "%leaf%"; + textBefore += chunk.slice(0, Math.max(0, sliceEndPos - pos)); + }); + return textBefore; +}; +function isRegExp(value) { + return Object.prototype.toString.call(value) === "[object RegExp]"; +} +var InputRule = class { + constructor(config) { + this.find = config.find; + this.handler = config.handler; + } +}; +var inputRuleMatcherHandler = (text, find2) => { + if (isRegExp(find2)) { + return find2.exec(text); + } + const inputRuleMatch = find2(text); + if (!inputRuleMatch) { + return null; + } + const result = [inputRuleMatch.text]; + result.index = inputRuleMatch.index; + result.input = text; + result.data = inputRuleMatch.data; + if (inputRuleMatch.replaceWith) { + if (!inputRuleMatch.text.includes(inputRuleMatch.replaceWith)) { + console.warn('[tiptap warn]: "inputRuleMatch.replaceWith" must be part of "inputRuleMatch.text".'); + } + result.push(inputRuleMatch.replaceWith); + } + return result; +}; +function run$1(config) { + var _a; + const { editor, from: from2, to, text, rules, plugin } = config; + const { view } = editor; + if (view.composing) { + return false; + } + const $from = view.state.doc.resolve(from2); + if ( + // check for code node + $from.parent.type.spec.code || !!((_a = $from.nodeBefore || $from.nodeAfter) === null || _a === void 0 ? void 0 : _a.marks.find((mark) => mark.type.spec.code)) + ) { + return false; + } + let matched = false; + const textBefore = getTextContentFromNodes($from) + text; + rules.forEach((rule) => { + if (matched) { + return; + } + const match = inputRuleMatcherHandler(textBefore, rule.find); + if (!match) { + return; + } + const tr2 = view.state.tr; + const state = createChainableState({ + state: view.state, + transaction: tr2 + }); + const range = { + from: from2 - (match[0].length - text.length), + to + }; + const { commands: commands2, chain, can } = new CommandManager({ + editor, + state + }); + const handler = rule.handler({ + state, + range, + match, + commands: commands2, + chain, + can + }); + if (handler === null || !tr2.steps.length) { + return; + } + tr2.setMeta(plugin, { + transform: tr2, + from: from2, + to, + text + }); + view.dispatch(tr2); + matched = true; + }); + return matched; +} +function inputRulesPlugin(props) { + const { editor, rules } = props; + const plugin = new Plugin({ + state: { + init() { + return null; + }, + apply(tr2, prev) { + const stored = tr2.getMeta(plugin); + if (stored) { + return stored; + } + return tr2.selectionSet || tr2.docChanged ? null : prev; + } + }, + props: { + handleTextInput(view, from2, to, text) { + return run$1({ + editor, + from: from2, + to, + text, + rules, + plugin + }); + }, + handleDOMEvents: { + compositionend: (view) => { + setTimeout(() => { + const { $cursor } = view.state.selection; + if ($cursor) { + run$1({ + editor, + from: $cursor.pos, + to: $cursor.pos, + text: "", + rules, + plugin + }); + } + }); + return false; + } + }, + // add support for input rules to trigger on enter + // this is useful for example for code blocks + handleKeyDown(view, event) { + if (event.key !== "Enter") { + return false; + } + const { $cursor } = view.state.selection; + if ($cursor) { + return run$1({ + editor, + from: $cursor.pos, + to: $cursor.pos, + text: "\n", + rules, + plugin + }); + } + return false; + } + }, + // @ts-ignore + isInputRules: true + }); + return plugin; +} +function isNumber(value) { + return typeof value === "number"; +} +var PasteRule = class { + constructor(config) { + this.find = config.find; + this.handler = config.handler; + } +}; +var pasteRuleMatcherHandler = (text, find2) => { + if (isRegExp(find2)) { + return [...text.matchAll(find2)]; + } + const matches2 = find2(text); + if (!matches2) { + return []; + } + return matches2.map((pasteRuleMatch) => { + const result = [pasteRuleMatch.text]; + result.index = pasteRuleMatch.index; + result.input = text; + result.data = pasteRuleMatch.data; + if (pasteRuleMatch.replaceWith) { + if (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) { + console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".'); + } + result.push(pasteRuleMatch.replaceWith); + } + return result; + }); +}; +function run(config) { + const { editor, state, from: from2, to, rule, pasteEvent, dropEvent } = config; + const { commands: commands2, chain, can } = new CommandManager({ + editor, + state + }); + const handlers2 = []; + state.doc.nodesBetween(from2, to, (node, pos) => { + if (!node.isTextblock || node.type.spec.code) { + return; + } + const resolvedFrom = Math.max(from2, pos); + const resolvedTo = Math.min(to, pos + node.content.size); + const textToMatch = node.textBetween(resolvedFrom - pos, resolvedTo - pos, void 0, "\uFFFC"); + const matches2 = pasteRuleMatcherHandler(textToMatch, rule.find); + matches2.forEach((match) => { + if (match.index === void 0) { + return; + } + const start2 = resolvedFrom + match.index + 1; + const end2 = start2 + match[0].length; + const range = { + from: state.tr.mapping.map(start2), + to: state.tr.mapping.map(end2) + }; + const handler = rule.handler({ + state, + range, + match, + commands: commands2, + chain, + can, + pasteEvent, + dropEvent + }); + handlers2.push(handler); + }); + }); + const success = handlers2.every((handler) => handler !== null); + return success; +} +function pasteRulesPlugin(props) { + const { editor, rules } = props; + let dragSourceElement = null; + let isPastedFromProseMirror = false; + let isDroppedFromProseMirror = false; + let pasteEvent = new ClipboardEvent("paste"); + let dropEvent = new DragEvent("drop"); + const plugins = rules.map((rule) => { + return new Plugin({ + // we register a global drag handler to track the current drag source element + view(view) { + const handleDragstart = (event) => { + var _a; + dragSourceElement = ((_a = view.dom.parentElement) === null || _a === void 0 ? void 0 : _a.contains(event.target)) ? view.dom.parentElement : null; + }; + window.addEventListener("dragstart", handleDragstart); + return { + destroy() { + window.removeEventListener("dragstart", handleDragstart); + } + }; + }, + props: { + handleDOMEvents: { + drop: (view, event) => { + isDroppedFromProseMirror = dragSourceElement === view.dom.parentElement; + dropEvent = event; + return false; + }, + paste: (_view, event) => { + var _a; + const html = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData("text/html"); + pasteEvent = event; + isPastedFromProseMirror = !!(html === null || html === void 0 ? void 0 : html.includes("data-pm-slice")); + return false; + } + } + }, + appendTransaction: (transactions, oldState, state) => { + const transaction = transactions[0]; + const isPaste = transaction.getMeta("uiEvent") === "paste" && !isPastedFromProseMirror; + const isDrop = transaction.getMeta("uiEvent") === "drop" && !isDroppedFromProseMirror; + if (!isPaste && !isDrop) { + return; + } + const from2 = oldState.doc.content.findDiffStart(state.doc.content); + const to = oldState.doc.content.findDiffEnd(state.doc.content); + if (!isNumber(from2) || !to || from2 === to.b) { + return; + } + const tr2 = state.tr; + const chainableState = createChainableState({ + state, + transaction: tr2 + }); + const handler = run({ + editor, + state: chainableState, + from: Math.max(from2 - 1, 0), + to: to.b - 1, + rule, + pasteEvent, + dropEvent + }); + if (!handler || !tr2.steps.length) { + return; + } + dropEvent = new DragEvent("drop"); + pasteEvent = new ClipboardEvent("paste"); + return tr2; + } + }); + }); + return plugins; +} +function findDuplicates(items) { + const filtered = items.filter((el, index) => items.indexOf(el) !== index); + return [...new Set(filtered)]; +} +var ExtensionManager = class _ExtensionManager { + constructor(extensions2, editor) { + this.splittableMarks = []; + this.editor = editor; + this.extensions = _ExtensionManager.resolve(extensions2); + this.schema = getSchemaByResolvedExtensions(this.extensions, editor); + this.extensions.forEach((extension) => { + var _a; + this.editor.extensionStorage[extension.name] = extension.storage; + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage, + editor: this.editor, + type: getSchemaTypeByName(extension.name, this.schema) + }; + if (extension.type === "mark") { + const keepOnSplit = (_a = callOrReturn(getExtensionField(extension, "keepOnSplit", context))) !== null && _a !== void 0 ? _a : true; + if (keepOnSplit) { + this.splittableMarks.push(extension.name); + } + } + const onBeforeCreate = getExtensionField(extension, "onBeforeCreate", context); + if (onBeforeCreate) { + this.editor.on("beforeCreate", onBeforeCreate); + } + const onCreate2 = getExtensionField(extension, "onCreate", context); + if (onCreate2) { + this.editor.on("create", onCreate2); + } + const onUpdate = getExtensionField(extension, "onUpdate", context); + if (onUpdate) { + this.editor.on("update", onUpdate); + } + const onSelectionUpdate = getExtensionField(extension, "onSelectionUpdate", context); + if (onSelectionUpdate) { + this.editor.on("selectionUpdate", onSelectionUpdate); + } + const onTransaction = getExtensionField(extension, "onTransaction", context); + if (onTransaction) { + this.editor.on("transaction", onTransaction); + } + const onFocus = getExtensionField(extension, "onFocus", context); + if (onFocus) { + this.editor.on("focus", onFocus); + } + const onBlur = getExtensionField(extension, "onBlur", context); + if (onBlur) { + this.editor.on("blur", onBlur); + } + const onDestroy2 = getExtensionField(extension, "onDestroy", context); + if (onDestroy2) { + this.editor.on("destroy", onDestroy2); + } + }); + } + static resolve(extensions2) { + const resolvedExtensions = _ExtensionManager.sort(_ExtensionManager.flatten(extensions2)); + const duplicatedNames = findDuplicates(resolvedExtensions.map((extension) => extension.name)); + if (duplicatedNames.length) { + console.warn(`[tiptap warn]: Duplicate extension names found: [${duplicatedNames.map((item) => `'${item}'`).join(", ")}]. This can lead to issues.`); + } + return resolvedExtensions; + } + static flatten(extensions2) { + return extensions2.map((extension) => { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + const addExtensions = getExtensionField(extension, "addExtensions", context); + if (addExtensions) { + return [extension, ...this.flatten(addExtensions())]; + } + return extension; + }).flat(10); + } + static sort(extensions2) { + const defaultPriority = 100; + return extensions2.sort((a, b) => { + const priorityA = getExtensionField(a, "priority") || defaultPriority; + const priorityB = getExtensionField(b, "priority") || defaultPriority; + if (priorityA > priorityB) { + return -1; + } + if (priorityA < priorityB) { + return 1; + } + return 0; + }); + } + get commands() { + return this.extensions.reduce((commands2, extension) => { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage, + editor: this.editor, + type: getSchemaTypeByName(extension.name, this.schema) + }; + const addCommands = getExtensionField(extension, "addCommands", context); + if (!addCommands) { + return commands2; + } + return { + ...commands2, + ...addCommands() + }; + }, {}); + } + get plugins() { + const { editor } = this; + const extensions2 = _ExtensionManager.sort([...this.extensions].reverse()); + const inputRules = []; + const pasteRules = []; + const allPlugins = extensions2.map((extension) => { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage, + editor, + type: getSchemaTypeByName(extension.name, this.schema) + }; + const plugins = []; + const addKeyboardShortcuts = getExtensionField(extension, "addKeyboardShortcuts", context); + let defaultBindings = {}; + if (extension.type === "mark" && extension.config.exitable) { + defaultBindings.ArrowRight = () => Mark2.handleExit({ editor, mark: extension }); + } + if (addKeyboardShortcuts) { + const bindings = Object.fromEntries(Object.entries(addKeyboardShortcuts()).map(([shortcut, method]) => { + return [shortcut, () => method({ editor })]; + })); + defaultBindings = { ...defaultBindings, ...bindings }; + } + const keyMapPlugin = keymap(defaultBindings); + plugins.push(keyMapPlugin); + const addInputRules = getExtensionField(extension, "addInputRules", context); + if (isExtensionRulesEnabled(extension, editor.options.enableInputRules) && addInputRules) { + inputRules.push(...addInputRules()); + } + const addPasteRules = getExtensionField(extension, "addPasteRules", context); + if (isExtensionRulesEnabled(extension, editor.options.enablePasteRules) && addPasteRules) { + pasteRules.push(...addPasteRules()); + } + const addProseMirrorPlugins = getExtensionField(extension, "addProseMirrorPlugins", context); + if (addProseMirrorPlugins) { + const proseMirrorPlugins = addProseMirrorPlugins(); + plugins.push(...proseMirrorPlugins); + } + return plugins; + }).flat(); + return [ + inputRulesPlugin({ + editor, + rules: inputRules + }), + ...pasteRulesPlugin({ + editor, + rules: pasteRules + }), + ...allPlugins + ]; + } + get attributes() { + return getAttributesFromExtensions(this.extensions); + } + get nodeViews() { + const { editor } = this; + const { nodeExtensions } = splitExtensions(this.extensions); + return Object.fromEntries(nodeExtensions.filter((extension) => !!getExtensionField(extension, "addNodeView")).map((extension) => { + const extensionAttributes = this.attributes.filter((attribute) => attribute.type === extension.name); + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage, + editor, + type: getNodeType(extension.name, this.schema) + }; + const addNodeView = getExtensionField(extension, "addNodeView", context); + if (!addNodeView) { + return []; + } + const nodeview = (node, view, getPos, decorations) => { + const HTMLAttributes = getRenderedAttributes(node, extensionAttributes); + return addNodeView()({ + editor, + node, + getPos, + decorations, + HTMLAttributes, + extension + }); + }; + return [extension.name, nodeview]; + })); + } +}; +function getType(value) { + return Object.prototype.toString.call(value).slice(8, -1); +} +function isPlainObject(value) { + if (getType(value) !== "Object") { + return false; + } + return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype; +} +function mergeDeep(target, source3) { + const output = { ...target }; + if (isPlainObject(target) && isPlainObject(source3)) { + Object.keys(source3).forEach((key) => { + if (isPlainObject(source3[key])) { + if (!(key in target)) { + Object.assign(output, { [key]: source3[key] }); + } else { + output[key] = mergeDeep(target[key], source3[key]); + } + } else { + Object.assign(output, { [key]: source3[key] }); + } + }); + } + return output; +} +var Extension = class _Extension { + constructor(config = {}) { + this.type = "extension"; + this.name = "extension"; + this.parent = null; + this.child = null; + this.config = { + name: this.name, + defaultOptions: {} + }; + this.config = { + ...this.config, + ...config + }; + this.name = this.config.name; + if (config.defaultOptions) { + console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`); + } + this.options = this.config.defaultOptions; + if (this.config.addOptions) { + this.options = callOrReturn(getExtensionField(this, "addOptions", { + name: this.name + })); + } + this.storage = callOrReturn(getExtensionField(this, "addStorage", { + name: this.name, + options: this.options + })) || {}; + } + static create(config = {}) { + return new _Extension(config); + } + configure(options = {}) { + const extension = this.extend(); + extension.options = mergeDeep(this.options, options); + extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { + name: extension.name, + options: extension.options + })); + return extension; + } + extend(extendedConfig = {}) { + const extension = new _Extension(extendedConfig); + extension.parent = this; + this.child = extension; + extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name; + if (extendedConfig.defaultOptions) { + console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`); + } + extension.options = callOrReturn(getExtensionField(extension, "addOptions", { + name: extension.name + })); + extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { + name: extension.name, + options: extension.options + })); + return extension; + } +}; +function getTextBetween(startNode, range, options) { + const { from: from2, to } = range; + const { blockSeparator = "\n\n", textSerializers = {} } = options || {}; + let text = ""; + let separated = true; + startNode.nodesBetween(from2, to, (node, pos, parent, index) => { + var _a; + const textSerializer = textSerializers === null || textSerializers === void 0 ? void 0 : textSerializers[node.type.name]; + if (textSerializer) { + if (node.isBlock && !separated) { + text += blockSeparator; + separated = true; + } + if (parent) { + text += textSerializer({ + node, + pos, + parent, + index, + range + }); + } + } else if (node.isText) { + text += (_a = node === null || node === void 0 ? void 0 : node.text) === null || _a === void 0 ? void 0 : _a.slice(Math.max(from2, pos) - pos, to - pos); + separated = false; + } else if (node.isBlock && !separated) { + text += blockSeparator; + separated = true; + } + }); + return text; +} +function getTextSerializersFromSchema(schema) { + return Object.fromEntries(Object.entries(schema.nodes).filter(([, node]) => node.spec.toText).map(([name, node]) => [name, node.spec.toText])); +} +var ClipboardTextSerializer = Extension.create({ + name: "clipboardTextSerializer", + addProseMirrorPlugins() { + return [ + new Plugin({ + key: new PluginKey("clipboardTextSerializer"), + props: { + clipboardTextSerializer: () => { + const { editor } = this; + const { state, schema } = editor; + const { doc: doc3, selection } = state; + const { ranges } = selection; + const from2 = Math.min(...ranges.map((range2) => range2.$from.pos)); + const to = Math.max(...ranges.map((range2) => range2.$to.pos)); + const textSerializers = getTextSerializersFromSchema(schema); + const range = { from: from2, to }; + return getTextBetween(doc3, range, { + textSerializers + }); + } + } + }) + ]; + } +}); +var blur = () => ({ editor, view }) => { + requestAnimationFrame(() => { + var _a; + if (!editor.isDestroyed) { + view.dom.blur(); + (_a = window === null || window === void 0 ? void 0 : window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges(); + } + }); + return true; +}; +var clearContent = (emitUpdate = false) => ({ commands: commands2 }) => { + return commands2.setContent("", emitUpdate); +}; +var clearNodes = () => ({ state, tr: tr2, dispatch }) => { + const { selection } = tr2; + const { ranges } = selection; + if (!dispatch) { + return true; + } + ranges.forEach(({ $from, $to }) => { + state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => { + if (node.type.isText) { + return; + } + const { doc: doc3, mapping } = tr2; + const $mappedFrom = doc3.resolve(mapping.map(pos)); + const $mappedTo = doc3.resolve(mapping.map(pos + node.nodeSize)); + const nodeRange = $mappedFrom.blockRange($mappedTo); + if (!nodeRange) { + return; + } + const targetLiftDepth = liftTarget(nodeRange); + if (node.type.isTextblock) { + const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index()); + tr2.setNodeMarkup(nodeRange.start, defaultType); + } + if (targetLiftDepth || targetLiftDepth === 0) { + tr2.lift(nodeRange, targetLiftDepth); + } + }); + }); + return true; +}; +var command = (fn2) => (props) => { + return fn2(props); +}; +var createParagraphNear2 = () => ({ state, dispatch }) => { + return createParagraphNear(state, dispatch); +}; +var cut = (originRange, targetPos) => ({ editor, tr: tr2 }) => { + const { state } = editor; + const contentSlice = state.doc.slice(originRange.from, originRange.to); + tr2.deleteRange(originRange.from, originRange.to); + const newPos = tr2.mapping.map(targetPos); + tr2.insert(newPos, contentSlice.content); + tr2.setSelection(new TextSelection(tr2.doc.resolve(newPos - 1))); + return true; +}; +var deleteCurrentNode = () => ({ tr: tr2, dispatch }) => { + const { selection } = tr2; + const currentNode = selection.$anchor.node(); + if (currentNode.content.size > 0) { + return false; + } + const $pos = tr2.selection.$anchor; + for (let depth = $pos.depth; depth > 0; depth -= 1) { + const node = $pos.node(depth); + if (node.type === currentNode.type) { + if (dispatch) { + const from2 = $pos.before(depth); + const to = $pos.after(depth); + tr2.delete(from2, to).scrollIntoView(); + } + return true; + } + } + return false; +}; +var deleteNode = (typeOrName) => ({ tr: tr2, state, dispatch }) => { + const type = getNodeType(typeOrName, state.schema); + const $pos = tr2.selection.$anchor; + for (let depth = $pos.depth; depth > 0; depth -= 1) { + const node = $pos.node(depth); + if (node.type === type) { + if (dispatch) { + const from2 = $pos.before(depth); + const to = $pos.after(depth); + tr2.delete(from2, to).scrollIntoView(); + } + return true; + } + } + return false; +}; +var deleteRange2 = (range) => ({ tr: tr2, dispatch }) => { + const { from: from2, to } = range; + if (dispatch) { + tr2.delete(from2, to); + } + return true; +}; +var deleteSelection2 = () => ({ state, dispatch }) => { + return deleteSelection(state, dispatch); +}; +var enter = () => ({ commands: commands2 }) => { + return commands2.keyboardShortcut("Enter"); +}; +var exitCode2 = () => ({ state, dispatch }) => { + return exitCode(state, dispatch); +}; +function objectIncludes(object1, object2, options = { strict: true }) { + const keys2 = Object.keys(object2); + if (!keys2.length) { + return true; + } + return keys2.every((key) => { + if (options.strict) { + return object2[key] === object1[key]; + } + if (isRegExp(object2[key])) { + return object2[key].test(object1[key]); + } + return object2[key] === object1[key]; + }); +} +function findMarkInSet(marks, type, attributes = {}) { + return marks.find((item) => { + return item.type === type && objectIncludes(item.attrs, attributes); + }); +} +function isMarkInSet(marks, type, attributes = {}) { + return !!findMarkInSet(marks, type, attributes); +} +function getMarkRange($pos, type, attributes = {}) { + if (!$pos || !type) { + return; + } + let start2 = $pos.parent.childAfter($pos.parentOffset); + if ($pos.parentOffset === start2.offset && start2.offset !== 0) { + start2 = $pos.parent.childBefore($pos.parentOffset); + } + if (!start2.node) { + return; + } + const mark = findMarkInSet([...start2.node.marks], type, attributes); + if (!mark) { + return; + } + let startIndex = start2.index; + let startPos = $pos.start() + start2.offset; + let endIndex = startIndex + 1; + let endPos = startPos + start2.node.nodeSize; + findMarkInSet([...start2.node.marks], type, attributes); + while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) { + startIndex -= 1; + startPos -= $pos.parent.child(startIndex).nodeSize; + } + while (endIndex < $pos.parent.childCount && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)) { + endPos += $pos.parent.child(endIndex).nodeSize; + endIndex += 1; + } + return { + from: startPos, + to: endPos + }; +} +function getMarkType(nameOrType, schema) { + if (typeof nameOrType === "string") { + if (!schema.marks[nameOrType]) { + throw Error(`There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`); + } + return schema.marks[nameOrType]; + } + return nameOrType; +} +var extendMarkRange = (typeOrName, attributes = {}) => ({ tr: tr2, state, dispatch }) => { + const type = getMarkType(typeOrName, state.schema); + const { doc: doc3, selection } = tr2; + const { $from, from: from2, to } = selection; + if (dispatch) { + const range = getMarkRange($from, type, attributes); + if (range && range.from <= from2 && range.to >= to) { + const newSelection = TextSelection.create(doc3, range.from, range.to); + tr2.setSelection(newSelection); + } + } + return true; +}; +var first = (commands2) => (props) => { + const items = typeof commands2 === "function" ? commands2(props) : commands2; + for (let i = 0; i < items.length; i += 1) { + if (items[i](props)) { + return true; + } + } + return false; +}; +function isTextSelection(value) { + return value instanceof TextSelection; +} +function minMax(value = 0, min2 = 0, max2 = 0) { + return Math.min(Math.max(value, min2), max2); +} +function resolveFocusPosition(doc3, position = null) { + if (!position) { + return null; + } + const selectionAtStart = Selection.atStart(doc3); + const selectionAtEnd = Selection.atEnd(doc3); + if (position === "start" || position === true) { + return selectionAtStart; + } + if (position === "end") { + return selectionAtEnd; + } + const minPos = selectionAtStart.from; + const maxPos = selectionAtEnd.to; + if (position === "all") { + return TextSelection.create(doc3, minMax(0, minPos, maxPos), minMax(doc3.content.size, minPos, maxPos)); + } + return TextSelection.create(doc3, minMax(position, minPos, maxPos), minMax(position, minPos, maxPos)); +} +function isiOS() { + return [ + "iPad Simulator", + "iPhone Simulator", + "iPod Simulator", + "iPad", + "iPhone", + "iPod" + ].includes(navigator.platform) || navigator.userAgent.includes("Mac") && "ontouchend" in document; +} +var focus = (position = null, options = {}) => ({ editor, view, tr: tr2, dispatch }) => { + options = { + scrollIntoView: true, + ...options + }; + const delayedFocus = () => { + if (isiOS()) { + view.dom.focus(); + } + requestAnimationFrame(() => { + if (!editor.isDestroyed) { + view.focus(); + if (options === null || options === void 0 ? void 0 : options.scrollIntoView) { + editor.commands.scrollIntoView(); + } + } + }); + }; + if (view.hasFocus() && position === null || position === false) { + return true; + } + if (dispatch && position === null && !isTextSelection(editor.state.selection)) { + delayedFocus(); + return true; + } + const selection = resolveFocusPosition(tr2.doc, position) || editor.state.selection; + const isSameSelection = editor.state.selection.eq(selection); + if (dispatch) { + if (!isSameSelection) { + tr2.setSelection(selection); + } + if (isSameSelection && tr2.storedMarks) { + tr2.setStoredMarks(tr2.storedMarks); + } + delayedFocus(); + } + return true; +}; +var forEach = (items, fn2) => (props) => { + return items.every((item, index) => fn2(item, { ...props, index })); +}; +var insertContent = (value, options) => ({ tr: tr2, commands: commands2 }) => { + return commands2.insertContentAt({ from: tr2.selection.from, to: tr2.selection.to }, value, options); +}; +function elementFromString(value) { + const wrappedValue = `${value}`; + return new window.DOMParser().parseFromString(wrappedValue, "text/html").body; +} +function createNodeFromContent(content, schema, options) { + options = { + slice: true, + parseOptions: {}, + ...options + }; + if (typeof content === "object" && content !== null) { + try { + if (Array.isArray(content) && content.length > 0) { + return Fragment.fromArray(content.map((item) => schema.nodeFromJSON(item))); + } + return schema.nodeFromJSON(content); + } catch (error2) { + console.warn("[tiptap warn]: Invalid content.", "Passed value:", content, "Error:", error2); + return createNodeFromContent("", schema, options); + } + } + if (typeof content === "string") { + const parser = DOMParser.fromSchema(schema); + return options.slice ? parser.parseSlice(elementFromString(content), options.parseOptions).content : parser.parse(elementFromString(content), options.parseOptions); + } + return createNodeFromContent("", schema, options); +} +function selectionToInsertionEnd2(tr2, startLen, bias) { + const last = tr2.steps.length - 1; + if (last < startLen) { + return; + } + const step = tr2.steps[last]; + if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) { + return; + } + const map2 = tr2.mapping.maps[last]; + let end2 = 0; + map2.forEach((_from, _to, _newFrom, newTo) => { + if (end2 === 0) { + end2 = newTo; + } + }); + tr2.setSelection(Selection.near(tr2.doc.resolve(end2), bias)); +} +var isFragment = (nodeOrFragment) => { + return nodeOrFragment.toString().startsWith("<"); +}; +var insertContentAt = (position, value, options) => ({ tr: tr2, dispatch, editor }) => { + if (dispatch) { + options = { + parseOptions: {}, + updateSelection: true, + ...options + }; + const content = createNodeFromContent(value, editor.schema, { + parseOptions: { + preserveWhitespace: "full", + ...options.parseOptions + } + }); + if (content.toString() === "<>") { + return true; + } + let { from: from2, to } = typeof position === "number" ? { from: position, to: position } : { from: position.from, to: position.to }; + let isOnlyTextContent = true; + let isOnlyBlockContent = true; + const nodes = isFragment(content) ? content : [content]; + nodes.forEach((node) => { + node.check(); + isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false; + isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false; + }); + if (from2 === to && isOnlyBlockContent) { + const { parent } = tr2.doc.resolve(from2); + const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount; + if (isEmptyTextBlock) { + from2 -= 1; + to += 1; + } + } + if (isOnlyTextContent) { + if (Array.isArray(value)) { + tr2.insertText(value.map((v) => v.text || "").join(""), from2, to); + } else if (typeof value === "object" && !!value && !!value.text) { + tr2.insertText(value.text, from2, to); + } else { + tr2.insertText(value, from2, to); + } + } else { + tr2.replaceWith(from2, to, content); + } + if (options.updateSelection) { + selectionToInsertionEnd2(tr2, tr2.steps.length - 1, -1); + } + } + return true; +}; +var joinUp2 = () => ({ state, dispatch }) => { + return joinUp(state, dispatch); +}; +var joinDown2 = () => ({ state, dispatch }) => { + return joinDown(state, dispatch); +}; +var joinBackward2 = () => ({ state, dispatch }) => { + return joinBackward(state, dispatch); +}; +var joinForward2 = () => ({ state, dispatch }) => { + return joinForward(state, dispatch); +}; +var joinItemBackward = () => ({ tr: tr2, state, dispatch }) => { + try { + const point = joinPoint(state.doc, state.selection.$from.pos, -1); + if (point === null || point === void 0) { + return false; + } + tr2.join(point, 2); + if (dispatch) { + dispatch(tr2); + } + return true; + } catch { + return false; + } +}; +var joinItemForward = () => ({ state, dispatch, tr: tr2 }) => { + try { + const point = joinPoint(state.doc, state.selection.$from.pos, 1); + if (point === null || point === void 0) { + return false; + } + tr2.join(point, 2); + if (dispatch) { + dispatch(tr2); + } + return true; + } catch (e) { + return false; + } +}; +function isMacOS() { + return typeof navigator !== "undefined" ? /Mac/.test(navigator.platform) : false; +} +function normalizeKeyName2(name) { + const parts = name.split(/-(?!$)/); + let result = parts[parts.length - 1]; + if (result === "Space") { + result = " "; + } + let alt; + let ctrl; + let shift2; + let meta; + for (let i = 0; i < parts.length - 1; i += 1) { + const mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { + meta = true; + } else if (/^a(lt)?$/i.test(mod)) { + alt = true; + } else if (/^(c|ctrl|control)$/i.test(mod)) { + ctrl = true; + } else if (/^s(hift)?$/i.test(mod)) { + shift2 = true; + } else if (/^mod$/i.test(mod)) { + if (isiOS() || isMacOS()) { + meta = true; + } else { + ctrl = true; + } + } else { + throw new Error(`Unrecognized modifier name: ${mod}`); + } + } + if (alt) { + result = `Alt-${result}`; + } + if (ctrl) { + result = `Ctrl-${result}`; + } + if (meta) { + result = `Meta-${result}`; + } + if (shift2) { + result = `Shift-${result}`; + } + return result; +} +var keyboardShortcut = (name) => ({ editor, view, tr: tr2, dispatch }) => { + const keys2 = normalizeKeyName2(name).split(/-(?!$)/); + const key = keys2.find((item) => !["Alt", "Ctrl", "Meta", "Shift"].includes(item)); + const event = new KeyboardEvent("keydown", { + key: key === "Space" ? " " : key, + altKey: keys2.includes("Alt"), + ctrlKey: keys2.includes("Ctrl"), + metaKey: keys2.includes("Meta"), + shiftKey: keys2.includes("Shift"), + bubbles: true, + cancelable: true + }); + const capturedTransaction = editor.captureTransaction(() => { + view.someProp("handleKeyDown", (f) => f(view, event)); + }); + capturedTransaction === null || capturedTransaction === void 0 ? void 0 : capturedTransaction.steps.forEach((step) => { + const newStep = step.map(tr2.mapping); + if (newStep && dispatch) { + tr2.maybeStep(newStep); + } + }); + return true; +}; +function isNodeActive(state, typeOrName, attributes = {}) { + const { from: from2, to, empty: empty2 } = state.selection; + const type = typeOrName ? getNodeType(typeOrName, state.schema) : null; + const nodeRanges = []; + state.doc.nodesBetween(from2, to, (node, pos) => { + if (node.isText) { + return; + } + const relativeFrom = Math.max(from2, pos); + const relativeTo = Math.min(to, pos + node.nodeSize); + nodeRanges.push({ + node, + from: relativeFrom, + to: relativeTo + }); + }); + const selectionRange = to - from2; + const matchedNodeRanges = nodeRanges.filter((nodeRange) => { + if (!type) { + return true; + } + return type.name === nodeRange.node.type.name; + }).filter((nodeRange) => objectIncludes(nodeRange.node.attrs, attributes, { strict: false })); + if (empty2) { + return !!matchedNodeRanges.length; + } + const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0); + return range >= selectionRange; +} +var lift3 = (typeOrName, attributes = {}) => ({ state, dispatch }) => { + const type = getNodeType(typeOrName, state.schema); + const isActive2 = isNodeActive(state, type, attributes); + if (!isActive2) { + return false; + } + return lift2(state, dispatch); +}; +var liftEmptyBlock2 = () => ({ state, dispatch }) => { + return liftEmptyBlock(state, dispatch); +}; +var liftListItem2 = (typeOrName) => ({ state, dispatch }) => { + const type = getNodeType(typeOrName, state.schema); + return liftListItem(type)(state, dispatch); +}; +var newlineInCode2 = () => ({ state, dispatch }) => { + return newlineInCode(state, dispatch); +}; +function getSchemaTypeNameByName(name, schema) { + if (schema.nodes[name]) { + return "node"; + } + if (schema.marks[name]) { + return "mark"; + } + return null; +} +function deleteProps(obj, propOrProps) { + const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps; + return Object.keys(obj).reduce((newObj, prop) => { + if (!props.includes(prop)) { + newObj[prop] = obj[prop]; + } + return newObj; + }, {}); +} +var resetAttributes = (typeOrName, attributes) => ({ tr: tr2, state, dispatch }) => { + let nodeType = null; + let markType = null; + const schemaType = getSchemaTypeNameByName(typeof typeOrName === "string" ? typeOrName : typeOrName.name, state.schema); + if (!schemaType) { + return false; + } + if (schemaType === "node") { + nodeType = getNodeType(typeOrName, state.schema); + } + if (schemaType === "mark") { + markType = getMarkType(typeOrName, state.schema); + } + if (dispatch) { + tr2.selection.ranges.forEach((range) => { + state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => { + if (nodeType && nodeType === node.type) { + tr2.setNodeMarkup(pos, void 0, deleteProps(node.attrs, attributes)); + } + if (markType && node.marks.length) { + node.marks.forEach((mark) => { + if (markType === mark.type) { + tr2.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes))); + } + }); + } + }); + }); + } + return true; +}; +var scrollIntoView = () => ({ tr: tr2, dispatch }) => { + if (dispatch) { + tr2.scrollIntoView(); + } + return true; +}; +var selectAll2 = () => ({ tr: tr2, commands: commands2 }) => { + return commands2.setTextSelection({ + from: 0, + to: tr2.doc.content.size + }); +}; +var selectNodeBackward2 = () => ({ state, dispatch }) => { + return selectNodeBackward(state, dispatch); +}; +var selectNodeForward2 = () => ({ state, dispatch }) => { + return selectNodeForward(state, dispatch); +}; +var selectParentNode2 = () => ({ state, dispatch }) => { + return selectParentNode(state, dispatch); +}; +var selectTextblockEnd2 = () => ({ state, dispatch }) => { + return selectTextblockEnd(state, dispatch); +}; +var selectTextblockStart2 = () => ({ state, dispatch }) => { + return selectTextblockStart(state, dispatch); +}; +function createDocument(content, schema, parseOptions = {}) { + return createNodeFromContent(content, schema, { slice: false, parseOptions }); +} +var setContent = (content, emitUpdate = false, parseOptions = {}) => ({ tr: tr2, editor, dispatch }) => { + const { doc: doc3 } = tr2; + const document2 = createDocument(content, editor.schema, parseOptions); + if (dispatch) { + tr2.replaceWith(0, doc3.content.size, document2).setMeta("preventUpdate", !emitUpdate); + } + return true; +}; +function getMarkAttributes(state, typeOrName) { + const type = getMarkType(typeOrName, state.schema); + const { from: from2, to, empty: empty2 } = state.selection; + const marks = []; + if (empty2) { + if (state.storedMarks) { + marks.push(...state.storedMarks); + } + marks.push(...state.selection.$head.marks()); + } else { + state.doc.nodesBetween(from2, to, (node) => { + marks.push(...node.marks); + }); + } + const mark = marks.find((markItem) => markItem.type.name === type.name); + if (!mark) { + return {}; + } + return { ...mark.attrs }; +} +function combineTransactionSteps(oldDoc, transactions) { + const transform = new Transform(oldDoc); + transactions.forEach((transaction) => { + transaction.steps.forEach((step) => { + transform.step(step); + }); + }); + return transform; +} +function defaultBlockAt2(match) { + for (let i = 0; i < match.edgeCount; i += 1) { + const { type } = match.edge(i); + if (type.isTextblock && !type.hasRequiredAttrs()) { + return type; + } + } + return null; +} +function findChildren(node, predicate) { + const nodesWithPos = []; + node.descendants((child, pos) => { + if (predicate(child)) { + nodesWithPos.push({ + node: child, + pos + }); + } + }); + return nodesWithPos; +} +function findChildrenInRange(node, range, predicate) { + const nodesWithPos = []; + node.nodesBetween(range.from, range.to, (child, pos) => { + if (predicate(child)) { + nodesWithPos.push({ + node: child, + pos + }); + } + }); + return nodesWithPos; +} +function findParentNodeClosestToPos($pos, predicate) { + for (let i = $pos.depth; i > 0; i -= 1) { + const node = $pos.node(i); + if (predicate(node)) { + return { + pos: i > 0 ? $pos.before(i) : 0, + start: $pos.start(i), + depth: i, + node + }; + } + } +} +function findParentNode(predicate) { + return (selection) => findParentNodeClosestToPos(selection.$from, predicate); +} +function getHTMLFromFragment(fragment, schema) { + const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment); + const temporaryDocument = document.implementation.createHTMLDocument(); + const container = temporaryDocument.createElement("div"); + container.appendChild(documentFragment); + return container.innerHTML; +} +function getText2(node, options) { + const range = { + from: 0, + to: node.content.size + }; + return getTextBetween(node, range, options); +} +function getNodeAttributes(state, typeOrName) { + const type = getNodeType(typeOrName, state.schema); + const { from: from2, to } = state.selection; + const nodes = []; + state.doc.nodesBetween(from2, to, (node2) => { + nodes.push(node2); + }); + const node = nodes.reverse().find((nodeItem) => nodeItem.type.name === type.name); + if (!node) { + return {}; + } + return { ...node.attrs }; +} +function getAttributes(state, typeOrName) { + const schemaType = getSchemaTypeNameByName(typeof typeOrName === "string" ? typeOrName : typeOrName.name, state.schema); + if (schemaType === "node") { + return getNodeAttributes(state, typeOrName); + } + if (schemaType === "mark") { + return getMarkAttributes(state, typeOrName); + } + return {}; +} +function removeDuplicates(array, by = JSON.stringify) { + const seen = {}; + return array.filter((item) => { + const key = by(item); + return Object.prototype.hasOwnProperty.call(seen, key) ? false : seen[key] = true; + }); +} +function simplifyChangedRanges(changes) { + const uniqueChanges = removeDuplicates(changes); + return uniqueChanges.length === 1 ? uniqueChanges : uniqueChanges.filter((change, index) => { + const rest = uniqueChanges.filter((_, i) => i !== index); + return !rest.some((otherChange) => { + return change.oldRange.from >= otherChange.oldRange.from && change.oldRange.to <= otherChange.oldRange.to && change.newRange.from >= otherChange.newRange.from && change.newRange.to <= otherChange.newRange.to; + }); + }); +} +function getChangedRanges(transform) { + const { mapping, steps } = transform; + const changes = []; + mapping.maps.forEach((stepMap, index) => { + const ranges = []; + if (!stepMap.ranges.length) { + const { from: from2, to } = steps[index]; + if (from2 === void 0 || to === void 0) { + return; + } + ranges.push({ from: from2, to }); + } else { + stepMap.forEach((from2, to) => { + ranges.push({ from: from2, to }); + }); + } + ranges.forEach(({ from: from2, to }) => { + const newStart = mapping.slice(index).map(from2, -1); + const newEnd = mapping.slice(index).map(to); + const oldStart = mapping.invert().map(newStart, -1); + const oldEnd = mapping.invert().map(newEnd); + changes.push({ + oldRange: { + from: oldStart, + to: oldEnd + }, + newRange: { + from: newStart, + to: newEnd + } + }); + }); + }); + return simplifyChangedRanges(changes); +} +function getMarksBetween(from2, to, doc3) { + const marks = []; + if (from2 === to) { + doc3.resolve(from2).marks().forEach((mark) => { + const $pos = doc3.resolve(from2 - 1); + const range = getMarkRange($pos, mark.type); + if (!range) { + return; + } + marks.push({ + mark, + ...range + }); + }); + } else { + doc3.nodesBetween(from2, to, (node, pos) => { + marks.push(...node.marks.map((mark) => ({ + from: pos, + to: pos + node.nodeSize, + mark + }))); + }); + } + return marks; +} +function getSplittedAttributes(extensionAttributes, typeName, attributes) { + return Object.fromEntries(Object.entries(attributes).filter(([name]) => { + const extensionAttribute = extensionAttributes.find((item) => { + return item.type === typeName && item.name === name; + }); + if (!extensionAttribute) { + return false; + } + return extensionAttribute.attribute.keepOnSplit; + })); +} +function isMarkActive(state, typeOrName, attributes = {}) { + const { empty: empty2, ranges } = state.selection; + const type = typeOrName ? getMarkType(typeOrName, state.schema) : null; + if (empty2) { + return !!(state.storedMarks || state.selection.$from.marks()).filter((mark) => { + if (!type) { + return true; + } + return type.name === mark.type.name; + }).find((mark) => objectIncludes(mark.attrs, attributes, { strict: false })); + } + let selectionRange = 0; + const markRanges = []; + ranges.forEach(({ $from, $to }) => { + const from2 = $from.pos; + const to = $to.pos; + state.doc.nodesBetween(from2, to, (node, pos) => { + if (!node.isText && !node.marks.length) { + return; + } + const relativeFrom = Math.max(from2, pos); + const relativeTo = Math.min(to, pos + node.nodeSize); + const range2 = relativeTo - relativeFrom; + selectionRange += range2; + markRanges.push(...node.marks.map((mark) => ({ + mark, + from: relativeFrom, + to: relativeTo + }))); + }); + }); + if (selectionRange === 0) { + return false; + } + const matchedRange = markRanges.filter((markRange) => { + if (!type) { + return true; + } + return type.name === markRange.mark.type.name; + }).filter((markRange) => objectIncludes(markRange.mark.attrs, attributes, { strict: false })).reduce((sum, markRange) => sum + markRange.to - markRange.from, 0); + const excludedRange = markRanges.filter((markRange) => { + if (!type) { + return true; + } + return markRange.mark.type !== type && markRange.mark.type.excludes(type); + }).reduce((sum, markRange) => sum + markRange.to - markRange.from, 0); + const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange; + return range >= selectionRange; +} +function isActive(state, name, attributes = {}) { + if (!name) { + return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes); + } + const schemaType = getSchemaTypeNameByName(name, state.schema); + if (schemaType === "node") { + return isNodeActive(state, name, attributes); + } + if (schemaType === "mark") { + return isMarkActive(state, name, attributes); + } + return false; +} +function isList(name, extensions2) { + const { nodeExtensions } = splitExtensions(extensions2); + const extension = nodeExtensions.find((item) => item.name === name); + if (!extension) { + return false; + } + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + const group = callOrReturn(getExtensionField(extension, "group", context)); + if (typeof group !== "string") { + return false; + } + return group.split(" ").includes("list"); +} +function isNodeEmpty(node) { + var _a; + const defaultContent = (_a = node.type.createAndFill()) === null || _a === void 0 ? void 0 : _a.toJSON(); + const content = node.toJSON(); + return JSON.stringify(defaultContent) === JSON.stringify(content); +} +function isNodeSelection(value) { + return value instanceof NodeSelection; +} +function posToDOMRect(view, from2, to) { + const minPos = 0; + const maxPos = view.state.doc.content.size; + const resolvedFrom = minMax(from2, minPos, maxPos); + const resolvedEnd = minMax(to, minPos, maxPos); + const start2 = view.coordsAtPos(resolvedFrom); + const end2 = view.coordsAtPos(resolvedEnd, -1); + const top2 = Math.min(start2.top, end2.top); + const bottom2 = Math.max(start2.bottom, end2.bottom); + const left2 = Math.min(start2.left, end2.left); + const right2 = Math.max(start2.right, end2.right); + const width = right2 - left2; + const height = bottom2 - top2; + const x = left2; + const y = top2; + const data = { + top: top2, + bottom: bottom2, + left: left2, + right: right2, + width, + height, + x, + y + }; + return { + ...data, + toJSON: () => data + }; +} +function canSetMark(state, tr2, newMarkType) { + var _a; + const { selection } = tr2; + let cursor = null; + if (isTextSelection(selection)) { + cursor = selection.$cursor; + } + if (cursor) { + const currentMarks = (_a = state.storedMarks) !== null && _a !== void 0 ? _a : cursor.marks(); + return !!newMarkType.isInSet(currentMarks) || !currentMarks.some((mark) => mark.type.excludes(newMarkType)); + } + const { ranges } = selection; + return ranges.some(({ $from, $to }) => { + let someNodeSupportsMark = $from.depth === 0 ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType) : false; + state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => { + if (someNodeSupportsMark) { + return false; + } + if (node.isInline) { + const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType); + const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks) || !node.marks.some((otherMark) => otherMark.type.excludes(newMarkType)); + someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType; + } + return !someNodeSupportsMark; + }); + return someNodeSupportsMark; + }); +} +var setMark = (typeOrName, attributes = {}) => ({ tr: tr2, state, dispatch }) => { + const { selection } = tr2; + const { empty: empty2, ranges } = selection; + const type = getMarkType(typeOrName, state.schema); + if (dispatch) { + if (empty2) { + const oldAttributes = getMarkAttributes(state, type); + tr2.addStoredMark(type.create({ + ...oldAttributes, + ...attributes + })); + } else { + ranges.forEach((range) => { + const from2 = range.$from.pos; + const to = range.$to.pos; + state.doc.nodesBetween(from2, to, (node, pos) => { + const trimmedFrom = Math.max(pos, from2); + const trimmedTo = Math.min(pos + node.nodeSize, to); + const someHasMark = node.marks.find((mark) => mark.type === type); + if (someHasMark) { + node.marks.forEach((mark) => { + if (type === mark.type) { + tr2.addMark(trimmedFrom, trimmedTo, type.create({ + ...mark.attrs, + ...attributes + })); + } + }); + } else { + tr2.addMark(trimmedFrom, trimmedTo, type.create(attributes)); + } + }); + }); + } + } + return canSetMark(state, tr2, type); +}; +var setMeta = (key, value) => ({ tr: tr2 }) => { + tr2.setMeta(key, value); + return true; +}; +var setNode = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => { + const type = getNodeType(typeOrName, state.schema); + if (!type.isTextblock) { + console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'); + return false; + } + return chain().command(({ commands: commands2 }) => { + const canSetBlock = setBlockType2(type, attributes)(state); + if (canSetBlock) { + return true; + } + return commands2.clearNodes(); + }).command(({ state: updatedState }) => { + return setBlockType2(type, attributes)(updatedState, dispatch); + }).run(); +}; +var setNodeSelection = (position) => ({ tr: tr2, dispatch }) => { + if (dispatch) { + const { doc: doc3 } = tr2; + const from2 = minMax(position, 0, doc3.content.size); + const selection = NodeSelection.create(doc3, from2); + tr2.setSelection(selection); + } + return true; +}; +var setTextSelection = (position) => ({ tr: tr2, dispatch }) => { + if (dispatch) { + const { doc: doc3 } = tr2; + const { from: from2, to } = typeof position === "number" ? { from: position, to: position } : position; + const minPos = TextSelection.atStart(doc3).from; + const maxPos = TextSelection.atEnd(doc3).to; + const resolvedFrom = minMax(from2, minPos, maxPos); + const resolvedEnd = minMax(to, minPos, maxPos); + const selection = TextSelection.create(doc3, resolvedFrom, resolvedEnd); + tr2.setSelection(selection); + } + return true; +}; +var sinkListItem2 = (typeOrName) => ({ state, dispatch }) => { + const type = getNodeType(typeOrName, state.schema); + return sinkListItem(type)(state, dispatch); +}; +function ensureMarks(state, splittableMarks) { + const marks = state.storedMarks || state.selection.$to.parentOffset && state.selection.$from.marks(); + if (marks) { + const filteredMarks = marks.filter((mark) => splittableMarks === null || splittableMarks === void 0 ? void 0 : splittableMarks.includes(mark.type.name)); + state.tr.ensureMarks(filteredMarks); + } +} +var splitBlock2 = ({ keepMarks = true } = {}) => ({ tr: tr2, state, dispatch, editor }) => { + const { selection, doc: doc3 } = tr2; + const { $from, $to } = selection; + const extensionAttributes = editor.extensionManager.attributes; + const newAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs); + if (selection instanceof NodeSelection && selection.node.isBlock) { + if (!$from.parentOffset || !canSplit(doc3, $from.pos)) { + return false; + } + if (dispatch) { + if (keepMarks) { + ensureMarks(state, editor.extensionManager.splittableMarks); + } + tr2.split($from.pos).scrollIntoView(); + } + return true; + } + if (!$from.parent.isBlock) { + return false; + } + if (dispatch) { + const atEnd = $to.parentOffset === $to.parent.content.size; + if (selection instanceof TextSelection) { + tr2.deleteSelection(); + } + const deflt = $from.depth === 0 ? void 0 : defaultBlockAt2($from.node(-1).contentMatchAt($from.indexAfter(-1))); + let types = atEnd && deflt ? [ + { + type: deflt, + attrs: newAttributes + } + ] : void 0; + let can = canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, types); + if (!types && !can && canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : void 0)) { + can = true; + types = deflt ? [ + { + type: deflt, + attrs: newAttributes + } + ] : void 0; + } + if (can) { + tr2.split(tr2.mapping.map($from.pos), 1, types); + if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) { + const first2 = tr2.mapping.map($from.before()); + const $first = tr2.doc.resolve(first2); + if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) { + tr2.setNodeMarkup(tr2.mapping.map($from.before()), deflt); + } + } + } + if (keepMarks) { + ensureMarks(state, editor.extensionManager.splittableMarks); + } + tr2.scrollIntoView(); + } + return true; +}; +var splitListItem = (typeOrName) => ({ tr: tr2, state, dispatch, editor }) => { + var _a; + const type = getNodeType(typeOrName, state.schema); + const { $from, $to } = state.selection; + const node = state.selection.node; + if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) { + return false; + } + const grandParent = $from.node(-1); + if (grandParent.type !== type) { + return false; + } + const extensionAttributes = editor.extensionManager.attributes; + if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) { + if ($from.depth === 2 || $from.node(-3).type !== type || $from.index(-2) !== $from.node(-2).childCount - 1) { + return false; + } + if (dispatch) { + let wrap2 = Fragment.empty; + const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3; + for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) { + wrap2 = Fragment.from($from.node(d).copy(wrap2)); + } + const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3; + const newNextTypeAttributes2 = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs); + const nextType2 = ((_a = type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.createAndFill(newNextTypeAttributes2)) || void 0; + wrap2 = wrap2.append(Fragment.from(type.createAndFill(null, nextType2) || void 0)); + const start2 = $from.before($from.depth - (depthBefore - 1)); + tr2.replace(start2, $from.after(-depthAfter), new Slice(wrap2, 4 - depthBefore, 0)); + let sel = -1; + tr2.doc.nodesBetween(start2, tr2.doc.content.size, (n, pos) => { + if (sel > -1) { + return false; + } + if (n.isTextblock && n.content.size === 0) { + sel = pos + 1; + } + }); + if (sel > -1) { + tr2.setSelection(TextSelection.near(tr2.doc.resolve(sel))); + } + tr2.scrollIntoView(); + } + return true; + } + const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null; + const newTypeAttributes = getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs); + const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs); + tr2.delete($from.pos, $to.pos); + const types = nextType ? [ + { type, attrs: newTypeAttributes }, + { type: nextType, attrs: newNextTypeAttributes } + ] : [{ type, attrs: newTypeAttributes }]; + if (!canSplit(tr2.doc, $from.pos, 2)) { + return false; + } + if (dispatch) { + const { selection, storedMarks } = state; + const { splittableMarks } = editor.extensionManager; + const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); + tr2.split($from.pos, 2, types).scrollIntoView(); + if (!marks || !dispatch) { + return true; + } + const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); + tr2.ensureMarks(filteredMarks); + } + return true; +}; +var joinListBackwards = (tr2, listType) => { + const list = findParentNode((node) => node.type === listType)(tr2.selection); + if (!list) { + return true; + } + const before = tr2.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth); + if (before === void 0) { + return true; + } + const nodeBefore = tr2.doc.nodeAt(before); + const canJoinBackwards = list.node.type === (nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.type) && canJoin(tr2.doc, list.pos); + if (!canJoinBackwards) { + return true; + } + tr2.join(list.pos); + return true; +}; +var joinListForwards = (tr2, listType) => { + const list = findParentNode((node) => node.type === listType)(tr2.selection); + if (!list) { + return true; + } + const after = tr2.doc.resolve(list.start).after(list.depth); + if (after === void 0) { + return true; + } + const nodeAfter = tr2.doc.nodeAt(after); + const canJoinForwards = list.node.type === (nodeAfter === null || nodeAfter === void 0 ? void 0 : nodeAfter.type) && canJoin(tr2.doc, after); + if (!canJoinForwards) { + return true; + } + tr2.join(after); + return true; +}; +var toggleList = (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) => ({ editor, tr: tr2, state, dispatch, chain, commands: commands2, can }) => { + const { extensions: extensions2, splittableMarks } = editor.extensionManager; + const listType = getNodeType(listTypeOrName, state.schema); + const itemType = getNodeType(itemTypeOrName, state.schema); + const { selection, storedMarks } = state; + const { $from, $to } = selection; + const range = $from.blockRange($to); + const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); + if (!range) { + return false; + } + const parentList = findParentNode((node) => isList(node.type.name, extensions2))(selection); + if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) { + if (parentList.node.type === listType) { + return commands2.liftListItem(itemType); + } + if (isList(parentList.node.type.name, extensions2) && listType.validContent(parentList.node.content) && dispatch) { + return chain().command(() => { + tr2.setNodeMarkup(parentList.pos, listType); + return true; + }).command(() => joinListBackwards(tr2, listType)).command(() => joinListForwards(tr2, listType)).run(); + } + } + if (!keepMarks || !marks || !dispatch) { + return chain().command(() => { + const canWrapInList = can().wrapInList(listType, attributes); + if (canWrapInList) { + return true; + } + return commands2.clearNodes(); + }).wrapInList(listType, attributes).command(() => joinListBackwards(tr2, listType)).command(() => joinListForwards(tr2, listType)).run(); + } + return chain().command(() => { + const canWrapInList = can().wrapInList(listType, attributes); + const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); + tr2.ensureMarks(filteredMarks); + if (canWrapInList) { + return true; + } + return commands2.clearNodes(); + }).wrapInList(listType, attributes).command(() => joinListBackwards(tr2, listType)).command(() => joinListForwards(tr2, listType)).run(); +}; +var toggleMark = (typeOrName, attributes = {}, options = {}) => ({ state, commands: commands2 }) => { + const { extendEmptyMarkRange = false } = options; + const type = getMarkType(typeOrName, state.schema); + const isActive2 = isMarkActive(state, type, attributes); + if (isActive2) { + return commands2.unsetMark(type, { extendEmptyMarkRange }); + } + return commands2.setMark(type, attributes); +}; +var toggleNode = (typeOrName, toggleTypeOrName, attributes = {}) => ({ state, commands: commands2 }) => { + const type = getNodeType(typeOrName, state.schema); + const toggleType = getNodeType(toggleTypeOrName, state.schema); + const isActive2 = isNodeActive(state, type, attributes); + if (isActive2) { + return commands2.setNode(toggleType); + } + return commands2.setNode(type, attributes); +}; +var toggleWrap = (typeOrName, attributes = {}) => ({ state, commands: commands2 }) => { + const type = getNodeType(typeOrName, state.schema); + const isActive2 = isNodeActive(state, type, attributes); + if (isActive2) { + return commands2.lift(type); + } + return commands2.wrapIn(type, attributes); +}; +var undoInputRule = () => ({ state, dispatch }) => { + const plugins = state.plugins; + for (let i = 0; i < plugins.length; i += 1) { + const plugin = plugins[i]; + let undoable; + if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) { + if (dispatch) { + const tr2 = state.tr; + const toUndo = undoable.transform; + for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) { + tr2.step(toUndo.steps[j].invert(toUndo.docs[j])); + } + if (undoable.text) { + const marks = tr2.doc.resolve(undoable.from).marks(); + tr2.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks)); + } else { + tr2.delete(undoable.from, undoable.to); + } + } + return true; + } + } + return false; +}; +var unsetAllMarks = () => ({ tr: tr2, dispatch }) => { + const { selection } = tr2; + const { empty: empty2, ranges } = selection; + if (empty2) { + return true; + } + if (dispatch) { + ranges.forEach((range) => { + tr2.removeMark(range.$from.pos, range.$to.pos); + }); + } + return true; +}; +var unsetMark = (typeOrName, options = {}) => ({ tr: tr2, state, dispatch }) => { + var _a; + const { extendEmptyMarkRange = false } = options; + const { selection } = tr2; + const type = getMarkType(typeOrName, state.schema); + const { $from, empty: empty2, ranges } = selection; + if (!dispatch) { + return true; + } + if (empty2 && extendEmptyMarkRange) { + let { from: from2, to } = selection; + const attrs = (_a = $from.marks().find((mark) => mark.type === type)) === null || _a === void 0 ? void 0 : _a.attrs; + const range = getMarkRange($from, type, attrs); + if (range) { + from2 = range.from; + to = range.to; + } + tr2.removeMark(from2, to, type); + } else { + ranges.forEach((range) => { + tr2.removeMark(range.$from.pos, range.$to.pos, type); + }); + } + tr2.removeStoredMark(type); + return true; +}; +var updateAttributes = (typeOrName, attributes = {}) => ({ tr: tr2, state, dispatch }) => { + let nodeType = null; + let markType = null; + const schemaType = getSchemaTypeNameByName(typeof typeOrName === "string" ? typeOrName : typeOrName.name, state.schema); + if (!schemaType) { + return false; + } + if (schemaType === "node") { + nodeType = getNodeType(typeOrName, state.schema); + } + if (schemaType === "mark") { + markType = getMarkType(typeOrName, state.schema); + } + if (dispatch) { + tr2.selection.ranges.forEach((range) => { + const from2 = range.$from.pos; + const to = range.$to.pos; + state.doc.nodesBetween(from2, to, (node, pos) => { + if (nodeType && nodeType === node.type) { + tr2.setNodeMarkup(pos, void 0, { + ...node.attrs, + ...attributes + }); + } + if (markType && node.marks.length) { + node.marks.forEach((mark) => { + if (markType === mark.type) { + const trimmedFrom = Math.max(pos, from2); + const trimmedTo = Math.min(pos + node.nodeSize, to); + tr2.addMark(trimmedFrom, trimmedTo, markType.create({ + ...mark.attrs, + ...attributes + })); + } + }); + } + }); + }); + } + return true; +}; +var wrapIn2 = (typeOrName, attributes = {}) => ({ state, dispatch }) => { + const type = getNodeType(typeOrName, state.schema); + return wrapIn(type, attributes)(state, dispatch); +}; +var wrapInList2 = (typeOrName, attributes = {}) => ({ state, dispatch }) => { + const type = getNodeType(typeOrName, state.schema); + return wrapInList(type, attributes)(state, dispatch); +}; +var commands = /* @__PURE__ */ Object.freeze({ + __proto__: null, + blur, + clearContent, + clearNodes, + command, + createParagraphNear: createParagraphNear2, + cut, + deleteCurrentNode, + deleteNode, + deleteRange: deleteRange2, + deleteSelection: deleteSelection2, + enter, + exitCode: exitCode2, + extendMarkRange, + first, + focus, + forEach, + insertContent, + insertContentAt, + joinUp: joinUp2, + joinDown: joinDown2, + joinBackward: joinBackward2, + joinForward: joinForward2, + joinItemBackward, + joinItemForward, + keyboardShortcut, + lift: lift3, + liftEmptyBlock: liftEmptyBlock2, + liftListItem: liftListItem2, + newlineInCode: newlineInCode2, + resetAttributes, + scrollIntoView, + selectAll: selectAll2, + selectNodeBackward: selectNodeBackward2, + selectNodeForward: selectNodeForward2, + selectParentNode: selectParentNode2, + selectTextblockEnd: selectTextblockEnd2, + selectTextblockStart: selectTextblockStart2, + setContent, + setMark, + setMeta, + setNode, + setNodeSelection, + setTextSelection, + sinkListItem: sinkListItem2, + splitBlock: splitBlock2, + splitListItem, + toggleList, + toggleMark, + toggleNode, + toggleWrap, + undoInputRule, + unsetAllMarks, + unsetMark, + updateAttributes, + wrapIn: wrapIn2, + wrapInList: wrapInList2 +}); +var Commands = Extension.create({ + name: "commands", + addCommands() { + return { + ...commands + }; + } +}); +var Editable = Extension.create({ + name: "editable", + addProseMirrorPlugins() { + return [ + new Plugin({ + key: new PluginKey("editable"), + props: { + editable: () => this.editor.options.editable + } + }) + ]; + } +}); +var FocusEvents = Extension.create({ + name: "focusEvents", + addProseMirrorPlugins() { + const { editor } = this; + return [ + new Plugin({ + key: new PluginKey("focusEvents"), + props: { + handleDOMEvents: { + focus: (view, event) => { + editor.isFocused = true; + const transaction = editor.state.tr.setMeta("focus", { event }).setMeta("addToHistory", false); + view.dispatch(transaction); + return false; + }, + blur: (view, event) => { + editor.isFocused = false; + const transaction = editor.state.tr.setMeta("blur", { event }).setMeta("addToHistory", false); + view.dispatch(transaction); + return false; + } + } + } + }) + ]; + } +}); +var Keymap = Extension.create({ + name: "keymap", + addKeyboardShortcuts() { + const handleBackspace = () => this.editor.commands.first(({ commands: commands2 }) => [ + () => commands2.undoInputRule(), + // maybe convert first text block node to default node + () => commands2.command(({ tr: tr2 }) => { + const { selection, doc: doc3 } = tr2; + const { empty: empty2, $anchor } = selection; + const { pos, parent } = $anchor; + const $parentPos = $anchor.parent.isTextblock ? tr2.doc.resolve(pos - 1) : $anchor; + const parentIsIsolating = $parentPos.parent.type.spec.isolating; + const parentPos = $anchor.pos - $anchor.parentOffset; + const isAtStart = parentIsIsolating && $parentPos.parent.childCount === 1 ? parentPos === $anchor.pos : Selection.atStart(doc3).from === pos; + if (!empty2 || !isAtStart || !parent.type.isTextblock || parent.textContent.length) { + return false; + } + return commands2.clearNodes(); + }), + () => commands2.deleteSelection(), + () => commands2.joinBackward(), + () => commands2.selectNodeBackward() + ]); + const handleDelete = () => this.editor.commands.first(({ commands: commands2 }) => [ + () => commands2.deleteSelection(), + () => commands2.deleteCurrentNode(), + () => commands2.joinForward(), + () => commands2.selectNodeForward() + ]); + const handleEnter = () => this.editor.commands.first(({ commands: commands2 }) => [ + () => commands2.newlineInCode(), + () => commands2.createParagraphNear(), + () => commands2.liftEmptyBlock(), + () => commands2.splitBlock() + ]); + const baseKeymap = { + Enter: handleEnter, + "Mod-Enter": () => this.editor.commands.exitCode(), + Backspace: handleBackspace, + "Mod-Backspace": handleBackspace, + "Shift-Backspace": handleBackspace, + Delete: handleDelete, + "Mod-Delete": handleDelete, + "Mod-a": () => this.editor.commands.selectAll() + }; + const pcKeymap = { + ...baseKeymap + }; + const macKeymap = { + ...baseKeymap, + "Ctrl-h": handleBackspace, + "Alt-Backspace": handleBackspace, + "Ctrl-d": handleDelete, + "Ctrl-Alt-Backspace": handleDelete, + "Alt-Delete": handleDelete, + "Alt-d": handleDelete, + "Ctrl-a": () => this.editor.commands.selectTextblockStart(), + "Ctrl-e": () => this.editor.commands.selectTextblockEnd() + }; + if (isiOS() || isMacOS()) { + return macKeymap; + } + return pcKeymap; + }, + addProseMirrorPlugins() { + return [ + // With this plugin we check if the whole document was selected and deleted. + // In this case we will additionally call `clearNodes()` to convert e.g. a heading + // to a paragraph if necessary. + // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well + // with many other commands. + new Plugin({ + key: new PluginKey("clearDocument"), + appendTransaction: (transactions, oldState, newState) => { + const docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc); + if (!docChanges) { + return; + } + const { empty: empty2, from: from2, to } = oldState.selection; + const allFrom = Selection.atStart(oldState.doc).from; + const allEnd = Selection.atEnd(oldState.doc).to; + const allWasSelected = from2 === allFrom && to === allEnd; + if (empty2 || !allWasSelected) { + return; + } + const isEmpty2 = newState.doc.textBetween(0, newState.doc.content.size, " ", " ").length === 0; + if (!isEmpty2) { + return; + } + const tr2 = newState.tr; + const state = createChainableState({ + state: newState, + transaction: tr2 + }); + const { commands: commands2 } = new CommandManager({ + editor: this.editor, + state + }); + commands2.clearNodes(); + if (!tr2.steps.length) { + return; + } + return tr2; + } + }) + ]; + } +}); +var Tabindex = Extension.create({ + name: "tabindex", + addProseMirrorPlugins() { + return [ + new Plugin({ + key: new PluginKey("tabindex"), + props: { + attributes: this.editor.isEditable ? { tabindex: "0" } : {} + } + }) + ]; + } +}); +var extensions = /* @__PURE__ */ Object.freeze({ + __proto__: null, + ClipboardTextSerializer, + Commands, + Editable, + FocusEvents, + Keymap, + Tabindex +}); +var style = `.ProseMirror { position: relative; } -.ProseMirror { - word-wrap: break-word; - white-space: pre-wrap; - white-space: break-spaces; - -webkit-font-variant-ligatures: none; - font-variant-ligatures: none; - font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ +.ProseMirror { + word-wrap: break-word; + white-space: pre-wrap; + white-space: break-spaces; + -webkit-font-variant-ligatures: none; + font-variant-ligatures: none; + font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ +} + +.ProseMirror [contenteditable="false"] { + white-space: normal; +} + +.ProseMirror [contenteditable="false"] [contenteditable="true"] { + white-space: pre-wrap; +} + +.ProseMirror pre { + white-space: pre-wrap; +} + +img.ProseMirror-separator { + display: inline !important; + border: none !important; + margin: 0 !important; + width: 1px !important; + height: 1px !important; +} + +.ProseMirror-gapcursor { + display: none; + pointer-events: none; + position: absolute; + margin: 0; +} + +.ProseMirror-gapcursor:after { + content: ""; + display: block; + position: absolute; + top: -2px; + width: 20px; + border-top: 1px solid black; + animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; +} + +@keyframes ProseMirror-cursor-blink { + to { + visibility: hidden; + } +} + +.ProseMirror-hideselection *::selection { + background: transparent; +} + +.ProseMirror-hideselection *::-moz-selection { + background: transparent; +} + +.ProseMirror-hideselection * { + caret-color: transparent; +} + +.ProseMirror-focused .ProseMirror-gapcursor { + display: block; +} + +.tippy-box[data-animation=fade][data-state=hidden] { + opacity: 0 +}`; +function createStyleTag(style2, nonce, suffix) { + const tiptapStyleTag = document.querySelector(`style[data-tiptap-style${suffix ? `-${suffix}` : ""}]`); + if (tiptapStyleTag !== null) { + return tiptapStyleTag; + } + const styleNode = document.createElement("style"); + if (nonce) { + styleNode.setAttribute("nonce", nonce); + } + styleNode.setAttribute(`data-tiptap-style${suffix ? `-${suffix}` : ""}`, ""); + styleNode.innerHTML = style2; + document.getElementsByTagName("head")[0].appendChild(styleNode); + return styleNode; +} +var Editor = class extends EventEmitter { + constructor(options = {}) { + super(); + this.isFocused = false; + this.extensionStorage = {}; + this.options = { + element: document.createElement("div"), + content: "", + injectCSS: true, + injectNonce: void 0, + extensions: [], + autofocus: false, + editable: true, + editorProps: {}, + parseOptions: {}, + enableInputRules: true, + enablePasteRules: true, + enableCoreExtensions: true, + onBeforeCreate: () => null, + onCreate: () => null, + onUpdate: () => null, + onSelectionUpdate: () => null, + onTransaction: () => null, + onFocus: () => null, + onBlur: () => null, + onDestroy: () => null + }; + this.isCapturingTransaction = false; + this.capturedTransaction = null; + this.setOptions(options); + this.createExtensionManager(); + this.createCommandManager(); + this.createSchema(); + this.on("beforeCreate", this.options.onBeforeCreate); + this.emit("beforeCreate", { editor: this }); + this.createView(); + this.injectCSS(); + this.on("create", this.options.onCreate); + this.on("update", this.options.onUpdate); + this.on("selectionUpdate", this.options.onSelectionUpdate); + this.on("transaction", this.options.onTransaction); + this.on("focus", this.options.onFocus); + this.on("blur", this.options.onBlur); + this.on("destroy", this.options.onDestroy); + window.setTimeout(() => { + if (this.isDestroyed) { + return; + } + this.commands.focus(this.options.autofocus); + this.emit("create", { editor: this }); + }, 0); + } + /** + * Returns the editor storage. + */ + get storage() { + return this.extensionStorage; + } + /** + * An object of all registered commands. + */ + get commands() { + return this.commandManager.commands; + } + /** + * Create a command chain to call multiple commands at once. + */ + chain() { + return this.commandManager.chain(); + } + /** + * Check if a command or a command chain can be executed. Without executing it. + */ + can() { + return this.commandManager.can(); + } + /** + * Inject CSS styles. + */ + injectCSS() { + if (this.options.injectCSS && document) { + this.css = createStyleTag(style, this.options.injectNonce); + } + } + /** + * Update editor options. + * + * @param options A list of options + */ + setOptions(options = {}) { + this.options = { + ...this.options, + ...options + }; + if (!this.view || !this.state || this.isDestroyed) { + return; + } + if (this.options.editorProps) { + this.view.setProps(this.options.editorProps); + } + this.view.updateState(this.state); + } + /** + * Update editable state of the editor. + */ + setEditable(editable, emitUpdate = true) { + this.setOptions({ editable }); + if (emitUpdate) { + this.emit("update", { editor: this, transaction: this.state.tr }); + } + } + /** + * Returns whether the editor is editable. + */ + get isEditable() { + return this.options.editable && this.view && this.view.editable; + } + /** + * Returns the editor state. + */ + get state() { + return this.view.state; + } + /** + * Register a ProseMirror plugin. + * + * @param plugin A ProseMirror plugin + * @param handlePlugins Control how to merge the plugin into the existing plugins. + */ + registerPlugin(plugin, handlePlugins) { + const plugins = isFunction(handlePlugins) ? handlePlugins(plugin, [...this.state.plugins]) : [...this.state.plugins, plugin]; + const state = this.state.reconfigure({ plugins }); + this.view.updateState(state); + } + /** + * Unregister a ProseMirror plugin. + * + * @param nameOrPluginKey The plugins name + */ + unregisterPlugin(nameOrPluginKey) { + if (this.isDestroyed) { + return; + } + const name = typeof nameOrPluginKey === "string" ? `${nameOrPluginKey}$` : nameOrPluginKey.key; + const state = this.state.reconfigure({ + // @ts-ignore + plugins: this.state.plugins.filter((plugin) => !plugin.key.startsWith(name)) + }); + this.view.updateState(state); + } + /** + * Creates an extension manager. + */ + createExtensionManager() { + const coreExtensions2 = this.options.enableCoreExtensions ? Object.values(extensions) : []; + const allExtensions = [...coreExtensions2, ...this.options.extensions].filter((extension) => { + return ["extension", "node", "mark"].includes(extension === null || extension === void 0 ? void 0 : extension.type); + }); + this.extensionManager = new ExtensionManager(allExtensions, this); + } + /** + * Creates an command manager. + */ + createCommandManager() { + this.commandManager = new CommandManager({ + editor: this + }); + } + /** + * Creates a ProseMirror schema. + */ + createSchema() { + this.schema = this.extensionManager.schema; + } + /** + * Creates a ProseMirror view. + */ + createView() { + const doc3 = createDocument(this.options.content, this.schema, this.options.parseOptions); + const selection = resolveFocusPosition(doc3, this.options.autofocus); + this.view = new EditorView(this.options.element, { + ...this.options.editorProps, + dispatchTransaction: this.dispatchTransaction.bind(this), + state: EditorState.create({ + doc: doc3, + selection: selection || void 0 + }) + }); + const newState = this.state.reconfigure({ + plugins: this.extensionManager.plugins + }); + this.view.updateState(newState); + this.createNodeViews(); + this.prependClass(); + const dom = this.view.dom; + dom.editor = this; + } + /** + * Creates all node views. + */ + createNodeViews() { + this.view.setProps({ + nodeViews: this.extensionManager.nodeViews + }); + } + /** + * Prepend class name to element. + */ + prependClass() { + this.view.dom.className = `tiptap ${this.view.dom.className}`; + } + captureTransaction(fn2) { + this.isCapturingTransaction = true; + fn2(); + this.isCapturingTransaction = false; + const tr2 = this.capturedTransaction; + this.capturedTransaction = null; + return tr2; + } + /** + * The callback over which to send transactions (state updates) produced by the view. + * + * @param transaction An editor state transaction + */ + dispatchTransaction(transaction) { + if (this.view.isDestroyed) { + return; + } + if (this.isCapturingTransaction) { + if (!this.capturedTransaction) { + this.capturedTransaction = transaction; + return; + } + transaction.steps.forEach((step) => { + var _a; + return (_a = this.capturedTransaction) === null || _a === void 0 ? void 0 : _a.step(step); + }); + return; + } + const state = this.state.apply(transaction); + const selectionHasChanged = !this.state.selection.eq(state.selection); + this.view.updateState(state); + this.emit("transaction", { + editor: this, + transaction + }); + if (selectionHasChanged) { + this.emit("selectionUpdate", { + editor: this, + transaction + }); + } + const focus2 = transaction.getMeta("focus"); + const blur2 = transaction.getMeta("blur"); + if (focus2) { + this.emit("focus", { + editor: this, + event: focus2.event, + transaction + }); + } + if (blur2) { + this.emit("blur", { + editor: this, + event: blur2.event, + transaction + }); + } + if (!transaction.docChanged || transaction.getMeta("preventUpdate")) { + return; + } + this.emit("update", { + editor: this, + transaction + }); + } + /** + * Get attributes of the currently selected node or mark. + */ + getAttributes(nameOrType) { + return getAttributes(this.state, nameOrType); + } + isActive(nameOrAttributes, attributesOrUndefined) { + const name = typeof nameOrAttributes === "string" ? nameOrAttributes : null; + const attributes = typeof nameOrAttributes === "string" ? attributesOrUndefined : nameOrAttributes; + return isActive(this.state, name, attributes); + } + /** + * Get the document as JSON. + */ + getJSON() { + return this.state.doc.toJSON(); + } + /** + * Get the document as HTML. + */ + getHTML() { + return getHTMLFromFragment(this.state.doc.content, this.schema); + } + /** + * Get the document as text. + */ + getText(options) { + const { blockSeparator = "\n\n", textSerializers = {} } = options || {}; + return getText2(this.state.doc, { + blockSeparator, + textSerializers: { + ...getTextSerializersFromSchema(this.schema), + ...textSerializers + } + }); + } + /** + * Check if there is no content. + */ + get isEmpty() { + return isNodeEmpty(this.state.doc); + } + /** + * Get the number of characters for the current document. + * + * @deprecated + */ + getCharacterCount() { + console.warn('[tiptap warn]: "editor.getCharacterCount()" is deprecated. Please use "editor.storage.characterCount.characters()" instead.'); + return this.state.doc.content.size - 2; + } + /** + * Destroy the editor. + */ + destroy() { + this.emit("destroy"); + if (this.view) { + this.view.destroy(); + } + this.removeAllListeners(); + } + /** + * Check if the editor is already destroyed. + */ + get isDestroyed() { + var _a; + return !((_a = this.view) === null || _a === void 0 ? void 0 : _a.docView); + } +}; +function markInputRule(config) { + return new InputRule({ + find: config.find, + handler: ({ state, range, match }) => { + const attributes = callOrReturn(config.getAttributes, void 0, match); + if (attributes === false || attributes === null) { + return null; + } + const { tr: tr2 } = state; + const captureGroup = match[match.length - 1]; + const fullMatch = match[0]; + if (captureGroup) { + const startSpaces = fullMatch.search(/\S/); + const textStart = range.from + fullMatch.indexOf(captureGroup); + const textEnd = textStart + captureGroup.length; + const excludedMarks = getMarksBetween(range.from, range.to, state.doc).filter((item) => { + const excluded = item.mark.type.excluded; + return excluded.find((type) => type === config.type && type !== item.mark.type); + }).filter((item) => item.to > textStart); + if (excludedMarks.length) { + return null; + } + if (textEnd < range.to) { + tr2.delete(textEnd, range.to); + } + if (textStart > range.from) { + tr2.delete(range.from + startSpaces, textStart); + } + const markEnd = range.from + startSpaces + captureGroup.length; + tr2.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {})); + tr2.removeStoredMark(config.type); + } + } + }); +} +function nodeInputRule(config) { + return new InputRule({ + find: config.find, + handler: ({ state, range, match }) => { + const attributes = callOrReturn(config.getAttributes, void 0, match) || {}; + const { tr: tr2 } = state; + const start2 = range.from; + let end2 = range.to; + const newNode2 = config.type.create(attributes); + if (match[1]) { + const offset2 = match[0].lastIndexOf(match[1]); + let matchStart = start2 + offset2; + if (matchStart > end2) { + matchStart = end2; + } else { + end2 = matchStart + match[1].length; + } + const lastChar = match[0][match[0].length - 1]; + tr2.insertText(lastChar, start2 + match[0].length - 1); + tr2.replaceWith(matchStart, end2, newNode2); + } else if (match[0]) { + tr2.insert(start2 - 1, config.type.create(attributes)).delete(tr2.mapping.map(start2), tr2.mapping.map(end2)); + } + tr2.scrollIntoView(); + } + }); +} +function textblockTypeInputRule(config) { + return new InputRule({ + find: config.find, + handler: ({ state, range, match }) => { + const $start = state.doc.resolve(range.from); + const attributes = callOrReturn(config.getAttributes, void 0, match) || {}; + if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), config.type)) { + return null; + } + state.tr.delete(range.from, range.to).setBlockType(range.from, range.from, config.type, attributes); + } + }); +} +function wrappingInputRule(config) { + return new InputRule({ + find: config.find, + handler: ({ state, range, match, chain }) => { + const attributes = callOrReturn(config.getAttributes, void 0, match) || {}; + const tr2 = state.tr.delete(range.from, range.to); + const $start = tr2.doc.resolve(range.from); + const blockRange = $start.blockRange(); + const wrapping = blockRange && findWrapping(blockRange, config.type, attributes); + if (!wrapping) { + return null; + } + tr2.wrap(blockRange, wrapping); + if (config.keepMarks && config.editor) { + const { selection, storedMarks } = state; + const { splittableMarks } = config.editor.extensionManager; + const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); + if (marks) { + const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); + tr2.ensureMarks(filteredMarks); + } + } + if (config.keepAttributes) { + const nodeType = config.type.name === "bulletList" || config.type.name === "orderedList" ? "listItem" : "taskList"; + chain().updateAttributes(nodeType, attributes).run(); + } + const before = tr2.doc.resolve(range.from - 1).nodeBefore; + if (before && before.type === config.type && canJoin(tr2.doc, range.from - 1) && (!config.joinPredicate || config.joinPredicate(match, before))) { + tr2.join(range.from - 1); + } + } + }); +} +var Mark2 = class _Mark { + constructor(config = {}) { + this.type = "mark"; + this.name = "mark"; + this.parent = null; + this.child = null; + this.config = { + name: this.name, + defaultOptions: {} + }; + this.config = { + ...this.config, + ...config + }; + this.name = this.config.name; + if (config.defaultOptions) { + console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`); + } + this.options = this.config.defaultOptions; + if (this.config.addOptions) { + this.options = callOrReturn(getExtensionField(this, "addOptions", { + name: this.name + })); + } + this.storage = callOrReturn(getExtensionField(this, "addStorage", { + name: this.name, + options: this.options + })) || {}; + } + static create(config = {}) { + return new _Mark(config); + } + configure(options = {}) { + const extension = this.extend(); + extension.options = mergeDeep(this.options, options); + extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { + name: extension.name, + options: extension.options + })); + return extension; + } + extend(extendedConfig = {}) { + const extension = new _Mark(extendedConfig); + extension.parent = this; + this.child = extension; + extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name; + if (extendedConfig.defaultOptions) { + console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`); + } + extension.options = callOrReturn(getExtensionField(extension, "addOptions", { + name: extension.name + })); + extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { + name: extension.name, + options: extension.options + })); + return extension; + } + static handleExit({ editor, mark }) { + const { tr: tr2 } = editor.state; + const currentPos = editor.state.selection.$from; + const isAtEnd = currentPos.pos === currentPos.end(); + if (isAtEnd) { + const currentMarks = currentPos.marks(); + const isInMark = !!currentMarks.find((m) => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name); + if (!isInMark) { + return false; + } + const removeMark2 = currentMarks.find((m) => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name); + if (removeMark2) { + tr2.removeStoredMark(removeMark2); + } + tr2.insertText(" ", currentPos.pos); + editor.view.dispatch(tr2); + return true; + } + return false; + } +}; +var Node2 = class _Node { + constructor(config = {}) { + this.type = "node"; + this.name = "node"; + this.parent = null; + this.child = null; + this.config = { + name: this.name, + defaultOptions: {} + }; + this.config = { + ...this.config, + ...config + }; + this.name = this.config.name; + if (config.defaultOptions) { + console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`); + } + this.options = this.config.defaultOptions; + if (this.config.addOptions) { + this.options = callOrReturn(getExtensionField(this, "addOptions", { + name: this.name + })); + } + this.storage = callOrReturn(getExtensionField(this, "addStorage", { + name: this.name, + options: this.options + })) || {}; + } + static create(config = {}) { + return new _Node(config); + } + configure(options = {}) { + const extension = this.extend(); + extension.options = mergeDeep(this.options, options); + extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { + name: extension.name, + options: extension.options + })); + return extension; + } + extend(extendedConfig = {}) { + const extension = new _Node(extendedConfig); + extension.parent = this; + this.child = extension; + extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name; + if (extendedConfig.defaultOptions) { + console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`); + } + extension.options = callOrReturn(getExtensionField(extension, "addOptions", { + name: extension.name + })); + extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { + name: extension.name, + options: extension.options + })); + return extension; + } +}; +function markPasteRule(config) { + return new PasteRule({ + find: config.find, + handler: ({ state, range, match, pasteEvent }) => { + const attributes = callOrReturn(config.getAttributes, void 0, match, pasteEvent); + if (attributes === false || attributes === null) { + return null; + } + const { tr: tr2 } = state; + const captureGroup = match[match.length - 1]; + const fullMatch = match[0]; + let markEnd = range.to; + if (captureGroup) { + const startSpaces = fullMatch.search(/\S/); + const textStart = range.from + fullMatch.indexOf(captureGroup); + const textEnd = textStart + captureGroup.length; + const excludedMarks = getMarksBetween(range.from, range.to, state.doc).filter((item) => { + const excluded = item.mark.type.excluded; + return excluded.find((type) => type === config.type && type !== item.mark.type); + }).filter((item) => item.to > textStart); + if (excludedMarks.length) { + return null; + } + if (textEnd < range.to) { + tr2.delete(textEnd, range.to); + } + if (textStart > range.from) { + tr2.delete(range.from + startSpaces, textStart); + } + markEnd = range.from + startSpaces + captureGroup.length; + tr2.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {})); + tr2.removeStoredMark(config.type); + } + } + }); +} +function escapeForRegEx(string) { + return string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); +} + +// node_modules/@tiptap/extension-blockquote/dist/index.js +var inputRegex = /^\s*>\s$/; +var Blockquote = Node2.create({ + name: "blockquote", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + content: "block+", + group: "block", + defining: true, + parseHTML() { + return [ + { tag: "blockquote" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["blockquote", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setBlockquote: () => ({ commands: commands2 }) => { + return commands2.wrapIn(this.name); + }, + toggleBlockquote: () => ({ commands: commands2 }) => { + return commands2.toggleWrap(this.name); + }, + unsetBlockquote: () => ({ commands: commands2 }) => { + return commands2.lift(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Shift-b": () => this.editor.commands.toggleBlockquote() + }; + }, + addInputRules() { + return [ + wrappingInputRule({ + find: inputRegex, + type: this.type + }) + ]; + } +}); + +// node_modules/@tiptap/extension-bold/dist/index.js +var starInputRegex = /(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))$/; +var starPasteRegex = /(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))/g; +var underscoreInputRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))$/; +var underscorePasteRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))/g; +var Bold = Mark2.create({ + name: "bold", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "strong" + }, + { + tag: "b", + getAttrs: (node) => node.style.fontWeight !== "normal" && null + }, + { + style: "font-weight", + getAttrs: (value) => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["strong", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setBold: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleBold: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetBold: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-b": () => this.editor.commands.toggleBold(), + "Mod-B": () => this.editor.commands.toggleBold() + }; + }, + addInputRules() { + return [ + markInputRule({ + find: starInputRegex, + type: this.type + }), + markInputRule({ + find: underscoreInputRegex, + type: this.type + }) + ]; + }, + addPasteRules() { + return [ + markPasteRule({ + find: starPasteRegex, + type: this.type + }), + markPasteRule({ + find: underscorePasteRegex, + type: this.type + }) + ]; + } +}); + +// node_modules/@tiptap/extension-bullet-list/dist/index.js +var ListItem = Node2.create({ + name: "listItem", + addOptions() { + return { + HTMLAttributes: {}, + bulletListTypeName: "bulletList", + orderedListTypeName: "orderedList" + }; + }, + content: "paragraph block*", + defining: true, + parseHTML() { + return [ + { + tag: "li" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addKeyboardShortcuts() { + return { + Enter: () => this.editor.commands.splitListItem(this.name), + Tab: () => this.editor.commands.sinkListItem(this.name), + "Shift-Tab": () => this.editor.commands.liftListItem(this.name) + }; + } +}); +var TextStyle = Mark2.create({ + name: "textStyle", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "span", + getAttrs: (element) => { + const hasStyles = element.hasAttribute("style"); + if (!hasStyles) { + return false; + } + return {}; + } + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + removeEmptyTextStyle: () => ({ state, commands: commands2 }) => { + const attributes = getMarkAttributes(state, this.type); + const hasStyles = Object.entries(attributes).some(([, value]) => !!value); + if (hasStyles) { + return true; + } + return commands2.unsetMark(this.name); + } + }; + } +}); +var inputRegex2 = /^\s*([-+*])\s$/; +var BulletList = Node2.create({ + name: "bulletList", + addOptions() { + return { + itemTypeName: "listItem", + HTMLAttributes: {}, + keepMarks: false, + keepAttributes: false + }; + }, + group: "block list", + content() { + return `${this.options.itemTypeName}+`; + }, + parseHTML() { + return [ + { tag: "ul" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["ul", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + toggleBulletList: () => ({ commands: commands2, chain }) => { + if (this.options.keepAttributes) { + return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem.name, this.editor.getAttributes(TextStyle.name)).run(); + } + return commands2.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Shift-8": () => this.editor.commands.toggleBulletList() + }; + }, + addInputRules() { + let inputRule = wrappingInputRule({ + find: inputRegex2, + type: this.type + }); + if (this.options.keepMarks || this.options.keepAttributes) { + inputRule = wrappingInputRule({ + find: inputRegex2, + type: this.type, + keepMarks: this.options.keepMarks, + keepAttributes: this.options.keepAttributes, + getAttributes: () => { + return this.editor.getAttributes(TextStyle.name); + }, + editor: this.editor + }); + } + return [ + inputRule + ]; + } +}); + +// node_modules/@tiptap/extension-code/dist/index.js +var inputRegex3 = /(?:^|\s)((?:`)((?:[^`]+))(?:`))$/; +var pasteRegex = /(?:^|\s)((?:`)((?:[^`]+))(?:`))/g; +var Code = Mark2.create({ + name: "code", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + excludes: "_", + code: true, + exitable: true, + parseHTML() { + return [ + { tag: "code" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["code", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setCode: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleCode: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetCode: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-e": () => this.editor.commands.toggleCode() + }; + }, + addInputRules() { + return [ + markInputRule({ + find: inputRegex3, + type: this.type + }) + ]; + }, + addPasteRules() { + return [ + markPasteRule({ + find: pasteRegex, + type: this.type + }) + ]; + } +}); + +// node_modules/@tiptap/extension-text-style/dist/index.js +var TextStyle2 = Mark2.create({ + name: "textStyle", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "span", + getAttrs: (element) => { + const hasStyles = element.hasAttribute("style"); + if (!hasStyles) { + return false; + } + return {}; + } + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + removeEmptyTextStyle: () => ({ state, commands: commands2 }) => { + const attributes = getMarkAttributes(state, this.type); + const hasStyles = Object.entries(attributes).some(([, value]) => !!value); + if (hasStyles) { + return true; + } + return commands2.unsetMark(this.name); + } + }; + } +}); + +// node_modules/@tiptap/extension-color/dist/index.js +var Color = Extension.create({ + name: "color", + addOptions() { + return { + types: ["textStyle"] + }; + }, + addGlobalAttributes() { + return [ + { + types: this.options.types, + attributes: { + color: { + default: null, + parseHTML: (element) => { + var _a; + return (_a = element.style.color) === null || _a === void 0 ? void 0 : _a.replace(/['"]+/g, ""); + }, + renderHTML: (attributes) => { + if (!attributes.color) { + return {}; + } + return { + style: `color: ${attributes.color}` + }; + } + } + } + } + ]; + }, + addCommands() { + return { + setColor: (color) => ({ chain }) => { + return chain().setMark("textStyle", { color }).run(); + }, + unsetColor: () => ({ chain }) => { + return chain().setMark("textStyle", { color: null }).removeEmptyTextStyle().run(); + } + }; + } +}); + +// node_modules/@tiptap/extension-document/dist/index.js +var Document = Node2.create({ + name: "doc", + topNode: true, + content: "block+" +}); + +// node_modules/prosemirror-dropcursor/dist/index.js +function dropCursor(options = {}) { + return new Plugin({ + view(editorView) { + return new DropCursorView(editorView, options); + } + }); +} +var DropCursorView = class { + constructor(editorView, options) { + var _a; + this.editorView = editorView; + this.cursorPos = null; + this.element = null; + this.timeout = -1; + this.width = (_a = options.width) !== null && _a !== void 0 ? _a : 1; + this.color = options.color === false ? void 0 : options.color || "black"; + this.class = options.class; + this.handlers = ["dragover", "dragend", "drop", "dragleave"].map((name) => { + let handler = (e) => { + this[name](e); + }; + editorView.dom.addEventListener(name, handler); + return { name, handler }; + }); + } + destroy() { + this.handlers.forEach(({ name, handler }) => this.editorView.dom.removeEventListener(name, handler)); + } + update(editorView, prevState) { + if (this.cursorPos != null && prevState.doc != editorView.state.doc) { + if (this.cursorPos > editorView.state.doc.content.size) + this.setCursor(null); + else + this.updateOverlay(); + } + } + setCursor(pos) { + if (pos == this.cursorPos) + return; + this.cursorPos = pos; + if (pos == null) { + this.element.parentNode.removeChild(this.element); + this.element = null; + } else { + this.updateOverlay(); + } + } + updateOverlay() { + let $pos = this.editorView.state.doc.resolve(this.cursorPos); + let isBlock = !$pos.parent.inlineContent, rect; + if (isBlock) { + let before = $pos.nodeBefore, after = $pos.nodeAfter; + if (before || after) { + let node = this.editorView.nodeDOM(this.cursorPos - (before ? before.nodeSize : 0)); + if (node) { + let nodeRect = node.getBoundingClientRect(); + let top2 = before ? nodeRect.bottom : nodeRect.top; + if (before && after) + top2 = (top2 + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2; + rect = { left: nodeRect.left, right: nodeRect.right, top: top2 - this.width / 2, bottom: top2 + this.width / 2 }; + } + } + } + if (!rect) { + let coords = this.editorView.coordsAtPos(this.cursorPos); + rect = { left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom }; + } + let parent = this.editorView.dom.offsetParent; + if (!this.element) { + this.element = parent.appendChild(document.createElement("div")); + if (this.class) + this.element.className = this.class; + this.element.style.cssText = "position: absolute; z-index: 50; pointer-events: none;"; + if (this.color) { + this.element.style.backgroundColor = this.color; + } + } + this.element.classList.toggle("prosemirror-dropcursor-block", isBlock); + this.element.classList.toggle("prosemirror-dropcursor-inline", !isBlock); + let parentLeft, parentTop; + if (!parent || parent == document.body && getComputedStyle(parent).position == "static") { + parentLeft = -pageXOffset; + parentTop = -pageYOffset; + } else { + let rect2 = parent.getBoundingClientRect(); + parentLeft = rect2.left - parent.scrollLeft; + parentTop = rect2.top - parent.scrollTop; + } + this.element.style.left = rect.left - parentLeft + "px"; + this.element.style.top = rect.top - parentTop + "px"; + this.element.style.width = rect.right - rect.left + "px"; + this.element.style.height = rect.bottom - rect.top + "px"; + } + scheduleRemoval(timeout) { + clearTimeout(this.timeout); + this.timeout = setTimeout(() => this.setCursor(null), timeout); + } + dragover(event) { + if (!this.editorView.editable) + return; + let pos = this.editorView.posAtCoords({ left: event.clientX, top: event.clientY }); + let node = pos && pos.inside >= 0 && this.editorView.state.doc.nodeAt(pos.inside); + let disableDropCursor = node && node.type.spec.disableDropCursor; + let disabled = typeof disableDropCursor == "function" ? disableDropCursor(this.editorView, pos, event) : disableDropCursor; + if (pos && !disabled) { + let target = pos.pos; + if (this.editorView.dragging && this.editorView.dragging.slice) { + let point = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice); + if (point != null) + target = point; + } + this.setCursor(target); + this.scheduleRemoval(5e3); + } + } + dragend() { + this.scheduleRemoval(20); + } + drop() { + this.scheduleRemoval(20); + } + dragleave(event) { + if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget)) + this.setCursor(null); + } +}; + +// node_modules/@tiptap/extension-dropcursor/dist/index.js +var Dropcursor = Extension.create({ + name: "dropCursor", + addOptions() { + return { + color: "currentColor", + width: 1, + class: void 0 + }; + }, + addProseMirrorPlugins() { + return [ + dropCursor(this.options) + ]; + } +}); + +// node_modules/prosemirror-gapcursor/dist/index.js +var GapCursor = class _GapCursor extends Selection { + /** + Create a gap cursor. + */ + constructor($pos) { + super($pos, $pos); + } + map(doc3, mapping) { + let $pos = doc3.resolve(mapping.map(this.head)); + return _GapCursor.valid($pos) ? new _GapCursor($pos) : Selection.near($pos); + } + content() { + return Slice.empty; + } + eq(other) { + return other instanceof _GapCursor && other.head == this.head; + } + toJSON() { + return { type: "gapcursor", pos: this.head }; + } + /** + @internal + */ + static fromJSON(doc3, json2) { + if (typeof json2.pos != "number") + throw new RangeError("Invalid input for GapCursor.fromJSON"); + return new _GapCursor(doc3.resolve(json2.pos)); + } + /** + @internal + */ + getBookmark() { + return new GapBookmark(this.anchor); + } + /** + @internal + */ + static valid($pos) { + let parent = $pos.parent; + if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) + return false; + let override = parent.type.spec.allowGapCursor; + if (override != null) + return override; + let deflt = parent.contentMatchAt($pos.index()).defaultType; + return deflt && deflt.isTextblock; + } + /** + @internal + */ + static findGapCursorFrom($pos, dir, mustMove = false) { + search: + for (; ; ) { + if (!mustMove && _GapCursor.valid($pos)) + return $pos; + let pos = $pos.pos, next = null; + for (let d = $pos.depth; ; d--) { + let parent = $pos.node(d); + if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) { + next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1); + break; + } else if (d == 0) { + return null; + } + pos += dir; + let $cur = $pos.doc.resolve(pos); + if (_GapCursor.valid($cur)) + return $cur; + } + for (; ; ) { + let inside = dir > 0 ? next.firstChild : next.lastChild; + if (!inside) { + if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) { + $pos = $pos.doc.resolve(pos + next.nodeSize * dir); + mustMove = false; + continue search; + } + break; + } + next = inside; + pos += dir; + let $cur = $pos.doc.resolve(pos); + if (_GapCursor.valid($cur)) + return $cur; + } + return null; + } + } +}; +GapCursor.prototype.visible = false; +GapCursor.findFrom = GapCursor.findGapCursorFrom; +Selection.jsonID("gapcursor", GapCursor); +var GapBookmark = class _GapBookmark { + constructor(pos) { + this.pos = pos; + } + map(mapping) { + return new _GapBookmark(mapping.map(this.pos)); + } + resolve(doc3) { + let $pos = doc3.resolve(this.pos); + return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos); + } +}; +function closedBefore($pos) { + for (let d = $pos.depth; d >= 0; d--) { + let index = $pos.index(d), parent = $pos.node(d); + if (index == 0) { + if (parent.type.spec.isolating) + return true; + continue; + } + for (let before = parent.child(index - 1); ; before = before.lastChild) { + if (before.childCount == 0 && !before.inlineContent || before.isAtom || before.type.spec.isolating) + return true; + if (before.inlineContent) + return false; + } + } + return true; +} +function closedAfter($pos) { + for (let d = $pos.depth; d >= 0; d--) { + let index = $pos.indexAfter(d), parent = $pos.node(d); + if (index == parent.childCount) { + if (parent.type.spec.isolating) + return true; + continue; + } + for (let after = parent.child(index); ; after = after.firstChild) { + if (after.childCount == 0 && !after.inlineContent || after.isAtom || after.type.spec.isolating) + return true; + if (after.inlineContent) + return false; + } + } + return true; +} +function gapCursor() { + return new Plugin({ + props: { + decorations: drawGapCursor, + createSelectionBetween(_view, $anchor, $head) { + return $anchor.pos == $head.pos && GapCursor.valid($head) ? new GapCursor($head) : null; + }, + handleClick, + handleKeyDown, + handleDOMEvents: { beforeinput } + } + }); +} +var handleKeyDown = keydownHandler({ + "ArrowLeft": arrow("horiz", -1), + "ArrowRight": arrow("horiz", 1), + "ArrowUp": arrow("vert", -1), + "ArrowDown": arrow("vert", 1) +}); +function arrow(axis, dir) { + const dirStr = axis == "vert" ? dir > 0 ? "down" : "up" : dir > 0 ? "right" : "left"; + return function(state, dispatch, view) { + let sel = state.selection; + let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty; + if (sel instanceof TextSelection) { + if (!view.endOfTextblock(dirStr) || $start.depth == 0) + return false; + mustMove = false; + $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before()); + } + let $found = GapCursor.findGapCursorFrom($start, dir, mustMove); + if (!$found) + return false; + if (dispatch) + dispatch(state.tr.setSelection(new GapCursor($found))); + return true; + }; +} +function handleClick(view, pos, event) { + if (!view || !view.editable) + return false; + let $pos = view.state.doc.resolve(pos); + if (!GapCursor.valid($pos)) + return false; + let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY }); + if (clickPos && clickPos.inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside))) + return false; + view.dispatch(view.state.tr.setSelection(new GapCursor($pos))); + return true; +} +function beforeinput(view, event) { + if (event.inputType != "insertCompositionText" || !(view.state.selection instanceof GapCursor)) + return false; + let { $from } = view.state.selection; + let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text); + if (!insert) + return false; + let frag = Fragment.empty; + for (let i = insert.length - 1; i >= 0; i--) + frag = Fragment.from(insert[i].createAndFill(null, frag)); + let tr2 = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0)); + tr2.setSelection(TextSelection.near(tr2.doc.resolve($from.pos + 1))); + view.dispatch(tr2); + return false; +} +function drawGapCursor(state) { + if (!(state.selection instanceof GapCursor)) + return null; + let node = document.createElement("div"); + node.className = "ProseMirror-gapcursor"; + return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, { key: "gapcursor" })]); +} + +// node_modules/@tiptap/extension-gapcursor/dist/index.js +var Gapcursor = Extension.create({ + name: "gapCursor", + addProseMirrorPlugins() { + return [ + gapCursor() + ]; + }, + extendNodeSchema(extension) { + var _a; + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + return { + allowGapCursor: (_a = callOrReturn(getExtensionField(extension, "allowGapCursor", context))) !== null && _a !== void 0 ? _a : null + }; + } +}); + +// node_modules/@tiptap/extension-hard-break/dist/index.js +var HardBreak = Node2.create({ + name: "hardBreak", + addOptions() { + return { + keepMarks: true, + HTMLAttributes: {} + }; + }, + inline: true, + group: "inline", + selectable: false, + parseHTML() { + return [ + { tag: "br" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["br", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; + }, + renderText() { + return "\n"; + }, + addCommands() { + return { + setHardBreak: () => ({ commands: commands2, chain, state, editor }) => { + return commands2.first([ + () => commands2.exitCode(), + () => commands2.command(() => { + const { selection, storedMarks } = state; + if (selection.$from.parent.type.spec.isolating) { + return false; + } + const { keepMarks } = this.options; + const { splittableMarks } = editor.extensionManager; + const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); + return chain().insertContent({ type: this.name }).command(({ tr: tr2, dispatch }) => { + if (dispatch && marks && keepMarks) { + const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); + tr2.ensureMarks(filteredMarks); + } + return true; + }).run(); + }) + ]); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Enter": () => this.editor.commands.setHardBreak(), + "Shift-Enter": () => this.editor.commands.setHardBreak() + }; + } +}); + +// node_modules/@tiptap/extension-heading/dist/index.js +var Heading = Node2.create({ + name: "heading", + addOptions() { + return { + levels: [1, 2, 3, 4, 5, 6], + HTMLAttributes: {} + }; + }, + content: "inline*", + group: "block", + defining: true, + addAttributes() { + return { + level: { + default: 1, + rendered: false + } + }; + }, + parseHTML() { + return this.options.levels.map((level) => ({ + tag: `h${level}`, + attrs: { level } + })); + }, + renderHTML({ node, HTMLAttributes }) { + const hasLevel = this.options.levels.includes(node.attrs.level); + const level = hasLevel ? node.attrs.level : this.options.levels[0]; + return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setHeading: (attributes) => ({ commands: commands2 }) => { + if (!this.options.levels.includes(attributes.level)) { + return false; + } + return commands2.setNode(this.name, attributes); + }, + toggleHeading: (attributes) => ({ commands: commands2 }) => { + if (!this.options.levels.includes(attributes.level)) { + return false; + } + return commands2.toggleNode(this.name, "paragraph", attributes); + } + }; + }, + addKeyboardShortcuts() { + return this.options.levels.reduce((items, level) => ({ + ...items, + ...{ + [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }) + } + }), {}); + }, + addInputRules() { + return this.options.levels.map((level) => { + return textblockTypeInputRule({ + find: new RegExp(`^(#{1,${level}})\\s$`), + type: this.type, + getAttributes: { + level + } + }); + }); + } +}); + +// node_modules/rope-sequence/dist/index.js +var GOOD_LEAF_SIZE = 200; +var RopeSequence = function RopeSequence2() { +}; +RopeSequence.prototype.append = function append(other) { + if (!other.length) { + return this; + } + other = RopeSequence.from(other); + return !this.length && other || other.length < GOOD_LEAF_SIZE && this.leafAppend(other) || this.length < GOOD_LEAF_SIZE && other.leafPrepend(this) || this.appendInner(other); +}; +RopeSequence.prototype.prepend = function prepend(other) { + if (!other.length) { + return this; + } + return RopeSequence.from(other).append(this); +}; +RopeSequence.prototype.appendInner = function appendInner(other) { + return new Append(this, other); +}; +RopeSequence.prototype.slice = function slice(from2, to) { + if (from2 === void 0) + from2 = 0; + if (to === void 0) + to = this.length; + if (from2 >= to) { + return RopeSequence.empty; + } + return this.sliceInner(Math.max(0, from2), Math.min(this.length, to)); +}; +RopeSequence.prototype.get = function get(i) { + if (i < 0 || i >= this.length) { + return void 0; + } + return this.getInner(i); +}; +RopeSequence.prototype.forEach = function forEach2(f, from2, to) { + if (from2 === void 0) + from2 = 0; + if (to === void 0) + to = this.length; + if (from2 <= to) { + this.forEachInner(f, from2, to, 0); + } else { + this.forEachInvertedInner(f, from2, to, 0); + } +}; +RopeSequence.prototype.map = function map(f, from2, to) { + if (from2 === void 0) + from2 = 0; + if (to === void 0) + to = this.length; + var result = []; + this.forEach(function(elt, i) { + return result.push(f(elt, i)); + }, from2, to); + return result; +}; +RopeSequence.from = function from(values) { + if (values instanceof RopeSequence) { + return values; + } + return values && values.length ? new Leaf(values) : RopeSequence.empty; +}; +var Leaf = /* @__PURE__ */ function(RopeSequence3) { + function Leaf2(values) { + RopeSequence3.call(this); + this.values = values; + } + if (RopeSequence3) + Leaf2.__proto__ = RopeSequence3; + Leaf2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype); + Leaf2.prototype.constructor = Leaf2; + var prototypeAccessors = { length: { configurable: true }, depth: { configurable: true } }; + Leaf2.prototype.flatten = function flatten() { + return this.values; + }; + Leaf2.prototype.sliceInner = function sliceInner(from2, to) { + if (from2 == 0 && to == this.length) { + return this; + } + return new Leaf2(this.values.slice(from2, to)); + }; + Leaf2.prototype.getInner = function getInner(i) { + return this.values[i]; + }; + Leaf2.prototype.forEachInner = function forEachInner(f, from2, to, start2) { + for (var i = from2; i < to; i++) { + if (f(this.values[i], start2 + i) === false) { + return false; + } + } + }; + Leaf2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) { + for (var i = from2 - 1; i >= to; i--) { + if (f(this.values[i], start2 + i) === false) { + return false; + } + } + }; + Leaf2.prototype.leafAppend = function leafAppend(other) { + if (this.length + other.length <= GOOD_LEAF_SIZE) { + return new Leaf2(this.values.concat(other.flatten())); + } + }; + Leaf2.prototype.leafPrepend = function leafPrepend(other) { + if (this.length + other.length <= GOOD_LEAF_SIZE) { + return new Leaf2(other.flatten().concat(this.values)); + } + }; + prototypeAccessors.length.get = function() { + return this.values.length; + }; + prototypeAccessors.depth.get = function() { + return 0; + }; + Object.defineProperties(Leaf2.prototype, prototypeAccessors); + return Leaf2; +}(RopeSequence); +RopeSequence.empty = new Leaf([]); +var Append = /* @__PURE__ */ function(RopeSequence3) { + function Append2(left2, right2) { + RopeSequence3.call(this); + this.left = left2; + this.right = right2; + this.length = left2.length + right2.length; + this.depth = Math.max(left2.depth, right2.depth) + 1; + } + if (RopeSequence3) + Append2.__proto__ = RopeSequence3; + Append2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype); + Append2.prototype.constructor = Append2; + Append2.prototype.flatten = function flatten() { + return this.left.flatten().concat(this.right.flatten()); + }; + Append2.prototype.getInner = function getInner(i) { + return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length); + }; + Append2.prototype.forEachInner = function forEachInner(f, from2, to, start2) { + var leftLen = this.left.length; + if (from2 < leftLen && this.left.forEachInner(f, from2, Math.min(to, leftLen), start2) === false) { + return false; + } + if (to > leftLen && this.right.forEachInner(f, Math.max(from2 - leftLen, 0), Math.min(this.length, to) - leftLen, start2 + leftLen) === false) { + return false; + } + }; + Append2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) { + var leftLen = this.left.length; + if (from2 > leftLen && this.right.forEachInvertedInner(f, from2 - leftLen, Math.max(to, leftLen) - leftLen, start2 + leftLen) === false) { + return false; + } + if (to < leftLen && this.left.forEachInvertedInner(f, Math.min(from2, leftLen), to, start2) === false) { + return false; + } + }; + Append2.prototype.sliceInner = function sliceInner(from2, to) { + if (from2 == 0 && to == this.length) { + return this; + } + var leftLen = this.left.length; + if (to <= leftLen) { + return this.left.slice(from2, to); + } + if (from2 >= leftLen) { + return this.right.slice(from2 - leftLen, to - leftLen); + } + return this.left.slice(from2, leftLen).append(this.right.slice(0, to - leftLen)); + }; + Append2.prototype.leafAppend = function leafAppend(other) { + var inner = this.right.leafAppend(other); + if (inner) { + return new Append2(this.left, inner); + } + }; + Append2.prototype.leafPrepend = function leafPrepend(other) { + var inner = this.left.leafPrepend(other); + if (inner) { + return new Append2(inner, this.right); + } + }; + Append2.prototype.appendInner = function appendInner2(other) { + if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1) { + return new Append2(this.left, new Append2(this.right, other)); + } + return new Append2(this, other); + }; + return Append2; +}(RopeSequence); +var dist_default2 = RopeSequence; + +// node_modules/prosemirror-history/dist/index.js +var max_empty_items = 500; +var Branch = class _Branch { + constructor(items, eventCount) { + this.items = items; + this.eventCount = eventCount; + } + // Pop the latest event off the branch's history and apply it + // to a document transform. + popEvent(state, preserveItems) { + if (this.eventCount == 0) + return null; + let end2 = this.items.length; + for (; ; end2--) { + let next = this.items.get(end2 - 1); + if (next.selection) { + --end2; + break; + } + } + let remap, mapFrom; + if (preserveItems) { + remap = this.remapping(end2, this.items.length); + mapFrom = remap.maps.length; + } + let transform = state.tr; + let selection, remaining; + let addAfter = [], addBefore = []; + this.items.forEach((item, i) => { + if (!item.step) { + if (!remap) { + remap = this.remapping(end2, i + 1); + mapFrom = remap.maps.length; + } + mapFrom--; + addBefore.push(item); + return; + } + if (remap) { + addBefore.push(new Item(item.map)); + let step = item.step.map(remap.slice(mapFrom)), map2; + if (step && transform.maybeStep(step).doc) { + map2 = transform.mapping.maps[transform.mapping.maps.length - 1]; + addAfter.push(new Item(map2, void 0, void 0, addAfter.length + addBefore.length)); + } + mapFrom--; + if (map2) + remap.appendMap(map2, mapFrom); + } else { + transform.maybeStep(item.step); + } + if (item.selection) { + selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection; + remaining = new _Branch(this.items.slice(0, end2).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1); + return false; + } + }, this.items.length, 0); + return { remaining, transform, selection }; + } + // Create a new branch with the given transform added. + addTransform(transform, selection, histOptions, preserveItems) { + let newItems = [], eventCount = this.eventCount; + let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null; + for (let i = 0; i < transform.steps.length; i++) { + let step = transform.steps[i].invert(transform.docs[i]); + let item = new Item(transform.mapping.maps[i], step, selection), merged; + if (merged = lastItem && lastItem.merge(item)) { + item = merged; + if (i) + newItems.pop(); + else + oldItems = oldItems.slice(0, oldItems.length - 1); + } + newItems.push(item); + if (selection) { + eventCount++; + selection = void 0; + } + if (!preserveItems) + lastItem = item; + } + let overflow = eventCount - histOptions.depth; + if (overflow > DEPTH_OVERFLOW) { + oldItems = cutOffEvents(oldItems, overflow); + eventCount -= overflow; + } + return new _Branch(oldItems.append(newItems), eventCount); + } + remapping(from2, to) { + let maps = new Mapping(); + this.items.forEach((item, i) => { + let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from2 ? maps.maps.length - item.mirrorOffset : void 0; + maps.appendMap(item.map, mirrorPos); + }, from2, to); + return maps; + } + addMaps(array) { + if (this.eventCount == 0) + return this; + return new _Branch(this.items.append(array.map((map2) => new Item(map2))), this.eventCount); + } + // When the collab module receives remote changes, the history has + // to know about those, so that it can adjust the steps that were + // rebased on top of the remote changes, and include the position + // maps for the remote changes in its array of items. + rebased(rebasedTransform, rebasedCount) { + if (!this.eventCount) + return this; + let rebasedItems = [], start2 = Math.max(0, this.items.length - rebasedCount); + let mapping = rebasedTransform.mapping; + let newUntil = rebasedTransform.steps.length; + let eventCount = this.eventCount; + this.items.forEach((item) => { + if (item.selection) + eventCount--; + }, start2); + let iRebased = rebasedCount; + this.items.forEach((item) => { + let pos = mapping.getMirror(--iRebased); + if (pos == null) + return; + newUntil = Math.min(newUntil, pos); + let map2 = mapping.maps[pos]; + if (item.step) { + let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]); + let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos)); + if (selection) + eventCount++; + rebasedItems.push(new Item(map2, step, selection)); + } else { + rebasedItems.push(new Item(map2)); + } + }, start2); + let newMaps = []; + for (let i = rebasedCount; i < newUntil; i++) + newMaps.push(new Item(mapping.maps[i])); + let items = this.items.slice(0, start2).append(newMaps).append(rebasedItems); + let branch = new _Branch(items, eventCount); + if (branch.emptyItemCount() > max_empty_items) + branch = branch.compress(this.items.length - rebasedItems.length); + return branch; + } + emptyItemCount() { + let count = 0; + this.items.forEach((item) => { + if (!item.step) + count++; + }); + return count; + } + // Compressing a branch means rewriting it to push the air (map-only + // items) out. During collaboration, these naturally accumulate + // because each remote change adds one. The `upto` argument is used + // to ensure that only the items below a given level are compressed, + // because `rebased` relies on a clean, untouched set of items in + // order to associate old items with rebased steps. + compress(upto = this.items.length) { + let remap = this.remapping(0, upto), mapFrom = remap.maps.length; + let items = [], events = 0; + this.items.forEach((item, i) => { + if (i >= upto) { + items.push(item); + if (item.selection) + events++; + } else if (item.step) { + let step = item.step.map(remap.slice(mapFrom)), map2 = step && step.getMap(); + mapFrom--; + if (map2) + remap.appendMap(map2, mapFrom); + if (step) { + let selection = item.selection && item.selection.map(remap.slice(mapFrom)); + if (selection) + events++; + let newItem = new Item(map2.invert(), step, selection), merged, last = items.length - 1; + if (merged = items.length && items[last].merge(newItem)) + items[last] = merged; + else + items.push(newItem); + } + } else if (item.map) { + mapFrom--; + } + }, this.items.length, 0); + return new _Branch(dist_default2.from(items.reverse()), events); + } +}; +Branch.empty = new Branch(dist_default2.empty, 0); +function cutOffEvents(items, n) { + let cutPoint; + items.forEach((item, i) => { + if (item.selection && n-- == 0) { + cutPoint = i; + return false; + } + }); + return items.slice(cutPoint); +} +var Item = class _Item { + constructor(map2, step, selection, mirrorOffset) { + this.map = map2; + this.step = step; + this.selection = selection; + this.mirrorOffset = mirrorOffset; + } + merge(other) { + if (this.step && other.step && !other.selection) { + let step = other.step.merge(this.step); + if (step) + return new _Item(step.getMap().invert(), step, this.selection); + } + } +}; +var HistoryState = class { + constructor(done, undone, prevRanges, prevTime, prevComposition) { + this.done = done; + this.undone = undone; + this.prevRanges = prevRanges; + this.prevTime = prevTime; + this.prevComposition = prevComposition; + } +}; +var DEPTH_OVERFLOW = 20; +function applyTransaction(history2, state, tr2, options) { + let historyTr = tr2.getMeta(historyKey), rebased; + if (historyTr) + return historyTr.historyState; + if (tr2.getMeta(closeHistoryKey)) + history2 = new HistoryState(history2.done, history2.undone, null, 0, -1); + let appended = tr2.getMeta("appendedTransaction"); + if (tr2.steps.length == 0) { + return history2; + } else if (appended && appended.getMeta(historyKey)) { + if (appended.getMeta(historyKey).redo) + return new HistoryState(history2.done.addTransform(tr2, void 0, options, mustPreserveItems(state)), history2.undone, rangesFor(tr2.mapping.maps[tr2.steps.length - 1]), history2.prevTime, history2.prevComposition); + else + return new HistoryState(history2.done, history2.undone.addTransform(tr2, void 0, options, mustPreserveItems(state)), null, history2.prevTime, history2.prevComposition); + } else if (tr2.getMeta("addToHistory") !== false && !(appended && appended.getMeta("addToHistory") === false)) { + let composition = tr2.getMeta("composition"); + let newGroup = history2.prevTime == 0 || !appended && history2.prevComposition != composition && (history2.prevTime < (tr2.time || 0) - options.newGroupDelay || !isAdjacentTo(tr2, history2.prevRanges)); + let prevRanges = appended ? mapRanges(history2.prevRanges, tr2.mapping) : rangesFor(tr2.mapping.maps[tr2.steps.length - 1]); + return new HistoryState(history2.done.addTransform(tr2, newGroup ? state.selection.getBookmark() : void 0, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr2.time, composition == null ? history2.prevComposition : composition); + } else if (rebased = tr2.getMeta("rebased")) { + return new HistoryState(history2.done.rebased(tr2, rebased), history2.undone.rebased(tr2, rebased), mapRanges(history2.prevRanges, tr2.mapping), history2.prevTime, history2.prevComposition); + } else { + return new HistoryState(history2.done.addMaps(tr2.mapping.maps), history2.undone.addMaps(tr2.mapping.maps), mapRanges(history2.prevRanges, tr2.mapping), history2.prevTime, history2.prevComposition); + } +} +function isAdjacentTo(transform, prevRanges) { + if (!prevRanges) + return false; + if (!transform.docChanged) + return true; + let adjacent = false; + transform.mapping.maps[0].forEach((start2, end2) => { + for (let i = 0; i < prevRanges.length; i += 2) + if (start2 <= prevRanges[i + 1] && end2 >= prevRanges[i]) + adjacent = true; + }); + return adjacent; +} +function rangesFor(map2) { + let result = []; + map2.forEach((_from, _to, from2, to) => result.push(from2, to)); + return result; +} +function mapRanges(ranges, mapping) { + if (!ranges) + return null; + let result = []; + for (let i = 0; i < ranges.length; i += 2) { + let from2 = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1); + if (from2 <= to) + result.push(from2, to); + } + return result; +} +function histTransaction(history2, state, dispatch, redo2) { + let preserveItems = mustPreserveItems(state); + let histOptions = historyKey.get(state).spec.config; + let pop = (redo2 ? history2.undone : history2.done).popEvent(state, preserveItems); + if (!pop) + return; + let selection = pop.selection.resolve(pop.transform.doc); + let added = (redo2 ? history2.done : history2.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems); + let newHist = new HistoryState(redo2 ? added : pop.remaining, redo2 ? pop.remaining : added, null, 0, -1); + dispatch(pop.transform.setSelection(selection).setMeta(historyKey, { redo: redo2, historyState: newHist }).scrollIntoView()); +} +var cachedPreserveItems = false; +var cachedPreserveItemsPlugins = null; +function mustPreserveItems(state) { + let plugins = state.plugins; + if (cachedPreserveItemsPlugins != plugins) { + cachedPreserveItems = false; + cachedPreserveItemsPlugins = plugins; + for (let i = 0; i < plugins.length; i++) + if (plugins[i].spec.historyPreserveItems) { + cachedPreserveItems = true; + break; + } + } + return cachedPreserveItems; +} +var historyKey = new PluginKey("history"); +var closeHistoryKey = new PluginKey("closeHistory"); +function history(config = {}) { + config = { + depth: config.depth || 100, + newGroupDelay: config.newGroupDelay || 500 + }; + return new Plugin({ + key: historyKey, + state: { + init() { + return new HistoryState(Branch.empty, Branch.empty, null, 0, -1); + }, + apply(tr2, hist, state) { + return applyTransaction(hist, state, tr2, config); + } + }, + config, + props: { + handleDOMEvents: { + beforeinput(view, e) { + let inputType = e.inputType; + let command2 = inputType == "historyUndo" ? undo : inputType == "historyRedo" ? redo : null; + if (!command2) + return false; + e.preventDefault(); + return command2(view.state, view.dispatch); + } + } + } + }); +} +var undo = (state, dispatch) => { + let hist = historyKey.getState(state); + if (!hist || hist.done.eventCount == 0) + return false; + if (dispatch) + histTransaction(hist, state, dispatch, false); + return true; +}; +var redo = (state, dispatch) => { + let hist = historyKey.getState(state); + if (!hist || hist.undone.eventCount == 0) + return false; + if (dispatch) + histTransaction(hist, state, dispatch, true); + return true; +}; + +// node_modules/@tiptap/extension-history/dist/index.js +var History = Extension.create({ + name: "history", + addOptions() { + return { + depth: 100, + newGroupDelay: 500 + }; + }, + addCommands() { + return { + undo: () => ({ state, dispatch }) => { + return undo(state, dispatch); + }, + redo: () => ({ state, dispatch }) => { + return redo(state, dispatch); + } + }; + }, + addProseMirrorPlugins() { + return [ + history(this.options) + ]; + }, + addKeyboardShortcuts() { + return { + "Mod-z": () => this.editor.commands.undo(), + "Mod-Z": () => this.editor.commands.undo(), + "Mod-y": () => this.editor.commands.redo(), + "Mod-Y": () => this.editor.commands.redo(), + "Shift-Mod-z": () => this.editor.commands.redo(), + "Shift-Mod-Z": () => this.editor.commands.redo(), + // Russian keyboard layouts + "Mod-\u044F": () => this.editor.commands.undo(), + "Shift-Mod-\u044F": () => this.editor.commands.redo() + }; + } +}); + +// node_modules/@tiptap/extension-horizontal-rule/dist/index.js +var HorizontalRule = Node2.create({ + name: "horizontalRule", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + group: "block", + parseHTML() { + return [{ tag: "hr" }]; + }, + renderHTML({ HTMLAttributes }) { + return ["hr", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; + }, + addCommands() { + return { + setHorizontalRule: () => ({ chain, state }) => { + const { $to: $originTo } = state.selection; + const currentChain = chain(); + if ($originTo.parentOffset === 0) { + currentChain.insertContentAt(Math.max($originTo.pos - 2, 0), { type: this.name }); + } else { + currentChain.insertContent({ type: this.name }); + } + return currentChain.command(({ tr: tr2, dispatch }) => { + var _a; + if (dispatch) { + const { $to } = tr2.selection; + const posAfter = $to.end(); + if ($to.nodeAfter) { + if ($to.nodeAfter.isTextblock) { + tr2.setSelection(TextSelection.create(tr2.doc, $to.pos + 1)); + } else if ($to.nodeAfter.isBlock) { + tr2.setSelection(NodeSelection.create(tr2.doc, $to.pos)); + } else { + tr2.setSelection(TextSelection.create(tr2.doc, $to.pos)); + } + } else { + const node = (_a = $to.parent.type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.create(); + if (node) { + tr2.insert(posAfter, node); + tr2.setSelection(TextSelection.create(tr2.doc, posAfter + 1)); + } + } + tr2.scrollIntoView(); + } + return true; + }).run(); + } + }; + }, + addInputRules() { + return [ + nodeInputRule({ + find: /^(?:---|—-|___\s|\*\*\*\s)$/, + type: this.type + }) + ]; + } +}); + +// node_modules/@tiptap/extension-italic/dist/index.js +var starInputRegex2 = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))$/; +var starPasteRegex2 = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))/g; +var underscoreInputRegex2 = /(?:^|\s)((?:_)((?:[^_]+))(?:_))$/; +var underscorePasteRegex2 = /(?:^|\s)((?:_)((?:[^_]+))(?:_))/g; +var Italic = Mark2.create({ + name: "italic", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "em" + }, + { + tag: "i", + getAttrs: (node) => node.style.fontStyle !== "normal" && null + }, + { + style: "font-style=italic" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["em", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setItalic: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleItalic: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetItalic: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-i": () => this.editor.commands.toggleItalic(), + "Mod-I": () => this.editor.commands.toggleItalic() + }; + }, + addInputRules() { + return [ + markInputRule({ + find: starInputRegex2, + type: this.type + }), + markInputRule({ + find: underscoreInputRegex2, + type: this.type + }) + ]; + }, + addPasteRules() { + return [ + markPasteRule({ + find: starPasteRegex2, + type: this.type + }), + markPasteRule({ + find: underscorePasteRegex2, + type: this.type + }) + ]; + } +}); + +// node_modules/@tiptap/extension-list-item/dist/index.js +var ListItem2 = Node2.create({ + name: "listItem", + addOptions() { + return { + HTMLAttributes: {}, + bulletListTypeName: "bulletList", + orderedListTypeName: "orderedList" + }; + }, + content: "paragraph block*", + defining: true, + parseHTML() { + return [ + { + tag: "li" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addKeyboardShortcuts() { + return { + Enter: () => this.editor.commands.splitListItem(this.name), + Tab: () => this.editor.commands.sinkListItem(this.name), + "Shift-Tab": () => this.editor.commands.liftListItem(this.name) + }; + } +}); + +// node_modules/@tiptap/extension-ordered-list/dist/index.js +var ListItem3 = Node2.create({ + name: "listItem", + addOptions() { + return { + HTMLAttributes: {}, + bulletListTypeName: "bulletList", + orderedListTypeName: "orderedList" + }; + }, + content: "paragraph block*", + defining: true, + parseHTML() { + return [ + { + tag: "li" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addKeyboardShortcuts() { + return { + Enter: () => this.editor.commands.splitListItem(this.name), + Tab: () => this.editor.commands.sinkListItem(this.name), + "Shift-Tab": () => this.editor.commands.liftListItem(this.name) + }; + } +}); +var TextStyle3 = Mark2.create({ + name: "textStyle", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "span", + getAttrs: (element) => { + const hasStyles = element.hasAttribute("style"); + if (!hasStyles) { + return false; + } + return {}; + } + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + removeEmptyTextStyle: () => ({ state, commands: commands2 }) => { + const attributes = getMarkAttributes(state, this.type); + const hasStyles = Object.entries(attributes).some(([, value]) => !!value); + if (hasStyles) { + return true; + } + return commands2.unsetMark(this.name); + } + }; + } +}); +var inputRegex4 = /^(\d+)\.\s$/; +var OrderedList = Node2.create({ + name: "orderedList", + addOptions() { + return { + itemTypeName: "listItem", + HTMLAttributes: {}, + keepMarks: false, + keepAttributes: false + }; + }, + group: "block list", + content() { + return `${this.options.itemTypeName}+`; + }, + addAttributes() { + return { + start: { + default: 1, + parseHTML: (element) => { + return element.hasAttribute("start") ? parseInt(element.getAttribute("start") || "", 10) : 1; + } + } + }; + }, + parseHTML() { + return [ + { + tag: "ol" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + const { start: start2, ...attributesWithoutStart } = HTMLAttributes; + return start2 === 1 ? ["ol", mergeAttributes(this.options.HTMLAttributes, attributesWithoutStart), 0] : ["ol", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + toggleOrderedList: () => ({ commands: commands2, chain }) => { + if (this.options.keepAttributes) { + return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem3.name, this.editor.getAttributes(TextStyle3.name)).run(); + } + return commands2.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Shift-7": () => this.editor.commands.toggleOrderedList() + }; + }, + addInputRules() { + let inputRule = wrappingInputRule({ + find: inputRegex4, + type: this.type, + getAttributes: (match) => ({ start: +match[1] }), + joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1] + }); + if (this.options.keepMarks || this.options.keepAttributes) { + inputRule = wrappingInputRule({ + find: inputRegex4, + type: this.type, + keepMarks: this.options.keepMarks, + keepAttributes: this.options.keepAttributes, + getAttributes: (match) => ({ start: +match[1], ...this.editor.getAttributes(TextStyle3.name) }), + joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1], + editor: this.editor + }); + } + return [ + inputRule + ]; + } +}); + +// node_modules/@tiptap/extension-paragraph/dist/index.js +var Paragraph = Node2.create({ + name: "paragraph", + priority: 1e3, + addOptions() { + return { + HTMLAttributes: {} + }; + }, + group: "block", + content: "inline*", + parseHTML() { + return [ + { tag: "p" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["p", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setParagraph: () => ({ commands: commands2 }) => { + return commands2.setNode(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Alt-0": () => this.editor.commands.setParagraph() + }; + } +}); + +// node_modules/@tiptap/extension-placeholder/dist/index.js +var Placeholder = Extension.create({ + name: "placeholder", + addOptions() { + return { + emptyEditorClass: "is-editor-empty", + emptyNodeClass: "is-empty", + placeholder: "Write something \u2026", + showOnlyWhenEditable: true, + showOnlyCurrent: true, + includeChildren: false + }; + }, + addProseMirrorPlugins() { + return [ + new Plugin({ + key: new PluginKey("placeholder"), + props: { + decorations: ({ doc: doc3, selection }) => { + const active = this.editor.isEditable || !this.options.showOnlyWhenEditable; + const { anchor } = selection; + const decorations = []; + if (!active) { + return null; + } + const emptyDocInstance = doc3.type.createAndFill(); + const isEditorEmpty = (emptyDocInstance === null || emptyDocInstance === void 0 ? void 0 : emptyDocInstance.sameMarkup(doc3)) && emptyDocInstance.content.findDiffStart(doc3.content) === null; + doc3.descendants((node, pos) => { + const hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize; + const isEmpty2 = !node.isLeaf && !node.childCount; + if ((hasAnchor || !this.options.showOnlyCurrent) && isEmpty2) { + const classes = [this.options.emptyNodeClass]; + if (isEditorEmpty) { + classes.push(this.options.emptyEditorClass); + } + const decoration = Decoration.node(pos, pos + node.nodeSize, { + class: classes.join(" "), + "data-placeholder": typeof this.options.placeholder === "function" ? this.options.placeholder({ + editor: this.editor, + node, + pos, + hasAnchor + }) : this.options.placeholder + }); + decorations.push(decoration); + } + return this.options.includeChildren; + }); + return DecorationSet.create(doc3, decorations); + } + } + }) + ]; + } +}); + +// node_modules/@tiptap/extension-strike/dist/index.js +var inputRegex5 = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))$/; +var pasteRegex2 = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))/g; +var Strike = Mark2.create({ + name: "strike", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "s" + }, + { + tag: "del" + }, + { + tag: "strike" + }, + { + style: "text-decoration", + consuming: false, + getAttrs: (style2) => style2.includes("line-through") ? {} : false + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["s", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setStrike: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleStrike: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetStrike: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + const shortcuts = {}; + if (isMacOS()) { + shortcuts["Mod-Shift-s"] = () => this.editor.commands.toggleStrike(); + } else { + shortcuts["Ctrl-Shift-s"] = () => this.editor.commands.toggleStrike(); + } + return shortcuts; + }, + addInputRules() { + return [ + markInputRule({ + find: inputRegex5, + type: this.type + }) + ]; + }, + addPasteRules() { + return [ + markPasteRule({ + find: pasteRegex2, + type: this.type + }) + ]; + } +}); + +// node_modules/@tiptap/extension-subscript/dist/index.js +var Subscript = Mark2.create({ + name: "subscript", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "sub" + }, + { + style: "vertical-align", + getAttrs(value) { + if (value !== "sub") { + return false; + } + return null; + } + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["sub", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setSubscript: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleSubscript: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetSubscript: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-,": () => this.editor.commands.toggleSubscript() + }; + } +}); + +// node_modules/@tiptap/extension-superscript/dist/index.js +var Superscript = Mark2.create({ + name: "superscript", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "sup" + }, + { + style: "vertical-align", + getAttrs(value) { + if (value !== "super") { + return false; + } + return null; + } + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["sup", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setSuperscript: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleSuperscript: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetSuperscript: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-.": () => this.editor.commands.toggleSuperscript() + }; + } +}); + +// node_modules/prosemirror-tables/dist/index.js +var readFromCache; +var addToCache; +if (typeof WeakMap != "undefined") { + let cache2 = /* @__PURE__ */ new WeakMap(); + readFromCache = (key) => cache2.get(key); + addToCache = (key, value) => { + cache2.set(key, value); + return value; + }; +} else { + const cache2 = []; + const cacheSize = 10; + let cachePos = 0; + readFromCache = (key) => { + for (let i = 0; i < cache2.length; i += 2) + if (cache2[i] == key) + return cache2[i + 1]; + }; + addToCache = (key, value) => { + if (cachePos == cacheSize) + cachePos = 0; + cache2[cachePos++] = key; + return cache2[cachePos++] = value; + }; +} +var TableMap = class { + constructor(width, height, map2, problems) { + this.width = width; + this.height = height; + this.map = map2; + this.problems = problems; + } + // Find the dimensions of the cell at the given position. + findCell(pos) { + for (let i = 0; i < this.map.length; i++) { + const curPos = this.map[i]; + if (curPos != pos) + continue; + const left2 = i % this.width; + const top2 = i / this.width | 0; + let right2 = left2 + 1; + let bottom2 = top2 + 1; + for (let j = 1; right2 < this.width && this.map[i + j] == curPos; j++) { + right2++; + } + for (let j = 1; bottom2 < this.height && this.map[i + this.width * j] == curPos; j++) { + bottom2++; + } + return { left: left2, top: top2, right: right2, bottom: bottom2 }; + } + throw new RangeError(`No cell with offset ${pos} found`); + } + // Find the left side of the cell at the given position. + colCount(pos) { + for (let i = 0; i < this.map.length; i++) { + if (this.map[i] == pos) { + return i % this.width; + } + } + throw new RangeError(`No cell with offset ${pos} found`); + } + // Find the next cell in the given direction, starting from the cell + // at `pos`, if any. + nextCell(pos, axis, dir) { + const { left: left2, right: right2, top: top2, bottom: bottom2 } = this.findCell(pos); + if (axis == "horiz") { + if (dir < 0 ? left2 == 0 : right2 == this.width) + return null; + return this.map[top2 * this.width + (dir < 0 ? left2 - 1 : right2)]; + } else { + if (dir < 0 ? top2 == 0 : bottom2 == this.height) + return null; + return this.map[left2 + this.width * (dir < 0 ? top2 - 1 : bottom2)]; + } + } + // Get the rectangle spanning the two given cells. + rectBetween(a, b) { + const { + left: leftA, + right: rightA, + top: topA, + bottom: bottomA + } = this.findCell(a); + const { + left: leftB, + right: rightB, + top: topB, + bottom: bottomB + } = this.findCell(b); + return { + left: Math.min(leftA, leftB), + top: Math.min(topA, topB), + right: Math.max(rightA, rightB), + bottom: Math.max(bottomA, bottomB) + }; + } + // Return the position of all cells that have the top left corner in + // the given rectangle. + cellsInRect(rect) { + const result = []; + const seen = {}; + for (let row = rect.top; row < rect.bottom; row++) { + for (let col = rect.left; col < rect.right; col++) { + const index = row * this.width + col; + const pos = this.map[index]; + if (seen[pos]) + continue; + seen[pos] = true; + if (col == rect.left && col && this.map[index - 1] == pos || row == rect.top && row && this.map[index - this.width] == pos) { + continue; + } + result.push(pos); + } + } + return result; + } + // Return the position at which the cell at the given row and column + // starts, or would start, if a cell started there. + positionAt(row, col, table) { + for (let i = 0, rowStart = 0; ; i++) { + const rowEnd = rowStart + table.child(i).nodeSize; + if (i == row) { + let index = col + row * this.width; + const rowEndIndex = (row + 1) * this.width; + while (index < rowEndIndex && this.map[index] < rowStart) + index++; + return index == rowEndIndex ? rowEnd - 1 : this.map[index]; + } + rowStart = rowEnd; + } + } + // Find the table map for the given table node. + static get(table) { + return readFromCache(table) || addToCache(table, computeMap(table)); + } +}; +function computeMap(table) { + if (table.type.spec.tableRole != "table") + throw new RangeError("Not a table node: " + table.type.name); + const width = findWidth(table), height = table.childCount; + const map2 = []; + let mapPos = 0; + let problems = null; + const colWidths = []; + for (let i = 0, e = width * height; i < e; i++) + map2[i] = 0; + for (let row = 0, pos = 0; row < height; row++) { + const rowNode = table.child(row); + pos++; + for (let i = 0; ; i++) { + while (mapPos < map2.length && map2[mapPos] != 0) + mapPos++; + if (i == rowNode.childCount) + break; + const cellNode = rowNode.child(i); + const { colspan, rowspan, colwidth } = cellNode.attrs; + for (let h = 0; h < rowspan; h++) { + if (h + row >= height) { + (problems || (problems = [])).push({ + type: "overlong_rowspan", + pos, + n: rowspan - h + }); + break; + } + const start2 = mapPos + h * width; + for (let w = 0; w < colspan; w++) { + if (map2[start2 + w] == 0) + map2[start2 + w] = pos; + else + (problems || (problems = [])).push({ + type: "collision", + row, + pos, + n: colspan - w + }); + const colW = colwidth && colwidth[w]; + if (colW) { + const widthIndex = (start2 + w) % width * 2, prev = colWidths[widthIndex]; + if (prev == null || prev != colW && colWidths[widthIndex + 1] == 1) { + colWidths[widthIndex] = colW; + colWidths[widthIndex + 1] = 1; + } else if (prev == colW) { + colWidths[widthIndex + 1]++; + } + } + } + } + mapPos += colspan; + pos += cellNode.nodeSize; + } + const expectedPos = (row + 1) * width; + let missing = 0; + while (mapPos < expectedPos) + if (map2[mapPos++] == 0) + missing++; + if (missing) + (problems || (problems = [])).push({ type: "missing", row, n: missing }); + pos++; + } + const tableMap = new TableMap(width, height, map2, problems); + let badWidths = false; + for (let i = 0; !badWidths && i < colWidths.length; i += 2) + if (colWidths[i] != null && colWidths[i + 1] < height) + badWidths = true; + if (badWidths) + findBadColWidths(tableMap, colWidths, table); + return tableMap; +} +function findWidth(table) { + let width = -1; + let hasRowSpan = false; + for (let row = 0; row < table.childCount; row++) { + const rowNode = table.child(row); + let rowWidth = 0; + if (hasRowSpan) + for (let j = 0; j < row; j++) { + const prevRow = table.child(j); + for (let i = 0; i < prevRow.childCount; i++) { + const cell = prevRow.child(i); + if (j + cell.attrs.rowspan > row) + rowWidth += cell.attrs.colspan; + } + } + for (let i = 0; i < rowNode.childCount; i++) { + const cell = rowNode.child(i); + rowWidth += cell.attrs.colspan; + if (cell.attrs.rowspan > 1) + hasRowSpan = true; + } + if (width == -1) + width = rowWidth; + else if (width != rowWidth) + width = Math.max(width, rowWidth); + } + return width; +} +function findBadColWidths(map2, colWidths, table) { + if (!map2.problems) + map2.problems = []; + const seen = {}; + for (let i = 0; i < map2.map.length; i++) { + const pos = map2.map[i]; + if (seen[pos]) + continue; + seen[pos] = true; + const node = table.nodeAt(pos); + if (!node) { + throw new RangeError(`No cell with offset ${pos} found`); + } + let updated = null; + const attrs = node.attrs; + for (let j = 0; j < attrs.colspan; j++) { + const col = (i + j) % map2.width; + const colWidth = colWidths[col * 2]; + if (colWidth != null && (!attrs.colwidth || attrs.colwidth[j] != colWidth)) + (updated || (updated = freshColWidth(attrs)))[j] = colWidth; + } + if (updated) + map2.problems.unshift({ + type: "colwidth mismatch", + pos, + colwidth: updated + }); + } +} +function freshColWidth(attrs) { + if (attrs.colwidth) + return attrs.colwidth.slice(); + const result = []; + for (let i = 0; i < attrs.colspan; i++) + result.push(0); + return result; +} +function tableNodeTypes(schema) { + let result = schema.cached.tableNodeTypes; + if (!result) { + result = schema.cached.tableNodeTypes = {}; + for (const name in schema.nodes) { + const type = schema.nodes[name], role = type.spec.tableRole; + if (role) + result[role] = type; + } + } + return result; +} +var tableEditingKey = new PluginKey("selectingCells"); +function cellAround($pos) { + for (let d = $pos.depth - 1; d > 0; d--) + if ($pos.node(d).type.spec.tableRole == "row") + return $pos.node(0).resolve($pos.before(d + 1)); + return null; +} +function cellWrapping($pos) { + for (let d = $pos.depth; d > 0; d--) { + const role = $pos.node(d).type.spec.tableRole; + if (role === "cell" || role === "header_cell") + return $pos.node(d); + } + return null; +} +function isInTable(state) { + const $head = state.selection.$head; + for (let d = $head.depth; d > 0; d--) + if ($head.node(d).type.spec.tableRole == "row") + return true; + return false; +} +function selectionCell(state) { + const sel = state.selection; + if ("$anchorCell" in sel && sel.$anchorCell) { + return sel.$anchorCell.pos > sel.$headCell.pos ? sel.$anchorCell : sel.$headCell; + } else if ("node" in sel && sel.node && sel.node.type.spec.tableRole == "cell") { + return sel.$anchor; + } + const $cell = cellAround(sel.$head) || cellNear(sel.$head); + if ($cell) { + return $cell; + } + throw new RangeError(`No cell found around position ${sel.head}`); +} +function cellNear($pos) { + for (let after = $pos.nodeAfter, pos = $pos.pos; after; after = after.firstChild, pos++) { + const role = after.type.spec.tableRole; + if (role == "cell" || role == "header_cell") + return $pos.doc.resolve(pos); + } + for (let before = $pos.nodeBefore, pos = $pos.pos; before; before = before.lastChild, pos--) { + const role = before.type.spec.tableRole; + if (role == "cell" || role == "header_cell") + return $pos.doc.resolve(pos - before.nodeSize); + } +} +function pointsAtCell($pos) { + return $pos.parent.type.spec.tableRole == "row" && !!$pos.nodeAfter; +} +function moveCellForward($pos) { + return $pos.node(0).resolve($pos.pos + $pos.nodeAfter.nodeSize); +} +function inSameTable($cellA, $cellB) { + return $cellA.depth == $cellB.depth && $cellA.pos >= $cellB.start(-1) && $cellA.pos <= $cellB.end(-1); +} +function nextCell($pos, axis, dir) { + const table = $pos.node(-1); + const map2 = TableMap.get(table); + const tableStart = $pos.start(-1); + const moved = map2.nextCell($pos.pos - tableStart, axis, dir); + return moved == null ? null : $pos.node(0).resolve(tableStart + moved); +} +function removeColSpan(attrs, pos, n = 1) { + const result = { ...attrs, colspan: attrs.colspan - n }; + if (result.colwidth) { + result.colwidth = result.colwidth.slice(); + result.colwidth.splice(pos, n); + if (!result.colwidth.some((w) => w > 0)) + result.colwidth = null; + } + return result; +} +function addColSpan(attrs, pos, n = 1) { + const result = { ...attrs, colspan: attrs.colspan + n }; + if (result.colwidth) { + result.colwidth = result.colwidth.slice(); + for (let i = 0; i < n; i++) + result.colwidth.splice(pos, 0, 0); + } + return result; +} +function columnIsHeader(map2, table, col) { + const headerCell = tableNodeTypes(table.type.schema).header_cell; + for (let row = 0; row < map2.height; row++) + if (table.nodeAt(map2.map[col + row * map2.width]).type != headerCell) + return false; + return true; +} +var CellSelection = class _CellSelection extends Selection { + // A table selection is identified by its anchor and head cells. The + // positions given to this constructor should point _before_ two + // cells in the same table. They may be the same, to select a single + // cell. + constructor($anchorCell, $headCell = $anchorCell) { + const table = $anchorCell.node(-1); + const map2 = TableMap.get(table); + const tableStart = $anchorCell.start(-1); + const rect = map2.rectBetween( + $anchorCell.pos - tableStart, + $headCell.pos - tableStart + ); + const doc3 = $anchorCell.node(0); + const cells = map2.cellsInRect(rect).filter((p) => p != $headCell.pos - tableStart); + cells.unshift($headCell.pos - tableStart); + const ranges = cells.map((pos) => { + const cell = table.nodeAt(pos); + if (!cell) { + throw RangeError(`No cell with offset ${pos} found`); + } + const from2 = tableStart + pos + 1; + return new SelectionRange( + doc3.resolve(from2), + doc3.resolve(from2 + cell.content.size) + ); + }); + super(ranges[0].$from, ranges[0].$to, ranges); + this.$anchorCell = $anchorCell; + this.$headCell = $headCell; + } + map(doc3, mapping) { + const $anchorCell = doc3.resolve(mapping.map(this.$anchorCell.pos)); + const $headCell = doc3.resolve(mapping.map(this.$headCell.pos)); + if (pointsAtCell($anchorCell) && pointsAtCell($headCell) && inSameTable($anchorCell, $headCell)) { + const tableChanged = this.$anchorCell.node(-1) != $anchorCell.node(-1); + if (tableChanged && this.isRowSelection()) + return _CellSelection.rowSelection($anchorCell, $headCell); + else if (tableChanged && this.isColSelection()) + return _CellSelection.colSelection($anchorCell, $headCell); + else + return new _CellSelection($anchorCell, $headCell); + } + return TextSelection.between($anchorCell, $headCell); + } + // Returns a rectangular slice of table rows containing the selected + // cells. + content() { + const table = this.$anchorCell.node(-1); + const map2 = TableMap.get(table); + const tableStart = this.$anchorCell.start(-1); + const rect = map2.rectBetween( + this.$anchorCell.pos - tableStart, + this.$headCell.pos - tableStart + ); + const seen = {}; + const rows = []; + for (let row = rect.top; row < rect.bottom; row++) { + const rowContent = []; + for (let index = row * map2.width + rect.left, col = rect.left; col < rect.right; col++, index++) { + const pos = map2.map[index]; + if (seen[pos]) + continue; + seen[pos] = true; + const cellRect = map2.findCell(pos); + let cell = table.nodeAt(pos); + if (!cell) { + throw RangeError(`No cell with offset ${pos} found`); + } + const extraLeft = rect.left - cellRect.left; + const extraRight = cellRect.right - rect.right; + if (extraLeft > 0 || extraRight > 0) { + let attrs = cell.attrs; + if (extraLeft > 0) { + attrs = removeColSpan(attrs, 0, extraLeft); + } + if (extraRight > 0) { + attrs = removeColSpan( + attrs, + attrs.colspan - extraRight, + extraRight + ); + } + if (cellRect.left < rect.left) { + cell = cell.type.createAndFill(attrs); + if (!cell) { + throw RangeError( + `Could not create cell with attrs ${JSON.stringify(attrs)}` + ); + } + } else { + cell = cell.type.create(attrs, cell.content); + } + } + if (cellRect.top < rect.top || cellRect.bottom > rect.bottom) { + const attrs = { + ...cell.attrs, + rowspan: Math.min(cellRect.bottom, rect.bottom) - Math.max(cellRect.top, rect.top) + }; + if (cellRect.top < rect.top) { + cell = cell.type.createAndFill(attrs); + } else { + cell = cell.type.create(attrs, cell.content); + } + } + rowContent.push(cell); + } + rows.push(table.child(row).copy(Fragment.from(rowContent))); + } + const fragment = this.isColSelection() && this.isRowSelection() ? table : rows; + return new Slice(Fragment.from(fragment), 1, 1); + } + replace(tr2, content = Slice.empty) { + const mapFrom = tr2.steps.length, ranges = this.ranges; + for (let i = 0; i < ranges.length; i++) { + const { $from, $to } = ranges[i], mapping = tr2.mapping.slice(mapFrom); + tr2.replace( + mapping.map($from.pos), + mapping.map($to.pos), + i ? Slice.empty : content + ); + } + const sel = Selection.findFrom( + tr2.doc.resolve(tr2.mapping.slice(mapFrom).map(this.to)), + -1 + ); + if (sel) + tr2.setSelection(sel); + } + replaceWith(tr2, node) { + this.replace(tr2, new Slice(Fragment.from(node), 0, 0)); + } + forEachCell(f) { + const table = this.$anchorCell.node(-1); + const map2 = TableMap.get(table); + const tableStart = this.$anchorCell.start(-1); + const cells = map2.cellsInRect( + map2.rectBetween( + this.$anchorCell.pos - tableStart, + this.$headCell.pos - tableStart + ) + ); + for (let i = 0; i < cells.length; i++) { + f(table.nodeAt(cells[i]), tableStart + cells[i]); + } + } + // True if this selection goes all the way from the top to the + // bottom of the table. + isColSelection() { + const anchorTop = this.$anchorCell.index(-1); + const headTop = this.$headCell.index(-1); + if (Math.min(anchorTop, headTop) > 0) + return false; + const anchorBottom = anchorTop + this.$anchorCell.nodeAfter.attrs.rowspan; + const headBottom = headTop + this.$headCell.nodeAfter.attrs.rowspan; + return Math.max(anchorBottom, headBottom) == this.$headCell.node(-1).childCount; + } + // Returns the smallest column selection that covers the given anchor + // and head cell. + static colSelection($anchorCell, $headCell = $anchorCell) { + const table = $anchorCell.node(-1); + const map2 = TableMap.get(table); + const tableStart = $anchorCell.start(-1); + const anchorRect = map2.findCell($anchorCell.pos - tableStart); + const headRect = map2.findCell($headCell.pos - tableStart); + const doc3 = $anchorCell.node(0); + if (anchorRect.top <= headRect.top) { + if (anchorRect.top > 0) + $anchorCell = doc3.resolve(tableStart + map2.map[anchorRect.left]); + if (headRect.bottom < map2.height) + $headCell = doc3.resolve( + tableStart + map2.map[map2.width * (map2.height - 1) + headRect.right - 1] + ); + } else { + if (headRect.top > 0) + $headCell = doc3.resolve(tableStart + map2.map[headRect.left]); + if (anchorRect.bottom < map2.height) + $anchorCell = doc3.resolve( + tableStart + map2.map[map2.width * (map2.height - 1) + anchorRect.right - 1] + ); + } + return new _CellSelection($anchorCell, $headCell); + } + // True if this selection goes all the way from the left to the + // right of the table. + isRowSelection() { + const table = this.$anchorCell.node(-1); + const map2 = TableMap.get(table); + const tableStart = this.$anchorCell.start(-1); + const anchorLeft = map2.colCount(this.$anchorCell.pos - tableStart); + const headLeft = map2.colCount(this.$headCell.pos - tableStart); + if (Math.min(anchorLeft, headLeft) > 0) + return false; + const anchorRight = anchorLeft + this.$anchorCell.nodeAfter.attrs.colspan; + const headRight = headLeft + this.$headCell.nodeAfter.attrs.colspan; + return Math.max(anchorRight, headRight) == map2.width; + } + eq(other) { + return other instanceof _CellSelection && other.$anchorCell.pos == this.$anchorCell.pos && other.$headCell.pos == this.$headCell.pos; + } + // Returns the smallest row selection that covers the given anchor + // and head cell. + static rowSelection($anchorCell, $headCell = $anchorCell) { + const table = $anchorCell.node(-1); + const map2 = TableMap.get(table); + const tableStart = $anchorCell.start(-1); + const anchorRect = map2.findCell($anchorCell.pos - tableStart); + const headRect = map2.findCell($headCell.pos - tableStart); + const doc3 = $anchorCell.node(0); + if (anchorRect.left <= headRect.left) { + if (anchorRect.left > 0) + $anchorCell = doc3.resolve( + tableStart + map2.map[anchorRect.top * map2.width] + ); + if (headRect.right < map2.width) + $headCell = doc3.resolve( + tableStart + map2.map[map2.width * (headRect.top + 1) - 1] + ); + } else { + if (headRect.left > 0) + $headCell = doc3.resolve(tableStart + map2.map[headRect.top * map2.width]); + if (anchorRect.right < map2.width) + $anchorCell = doc3.resolve( + tableStart + map2.map[map2.width * (anchorRect.top + 1) - 1] + ); + } + return new _CellSelection($anchorCell, $headCell); + } + toJSON() { + return { + type: "cell", + anchor: this.$anchorCell.pos, + head: this.$headCell.pos + }; + } + static fromJSON(doc3, json2) { + return new _CellSelection(doc3.resolve(json2.anchor), doc3.resolve(json2.head)); + } + static create(doc3, anchorCell, headCell = anchorCell) { + return new _CellSelection(doc3.resolve(anchorCell), doc3.resolve(headCell)); + } + getBookmark() { + return new CellBookmark(this.$anchorCell.pos, this.$headCell.pos); + } +}; +CellSelection.prototype.visible = false; +Selection.jsonID("cell", CellSelection); +var CellBookmark = class _CellBookmark { + constructor(anchor, head) { + this.anchor = anchor; + this.head = head; + } + map(mapping) { + return new _CellBookmark(mapping.map(this.anchor), mapping.map(this.head)); + } + resolve(doc3) { + const $anchorCell = doc3.resolve(this.anchor), $headCell = doc3.resolve(this.head); + if ($anchorCell.parent.type.spec.tableRole == "row" && $headCell.parent.type.spec.tableRole == "row" && $anchorCell.index() < $anchorCell.parent.childCount && $headCell.index() < $headCell.parent.childCount && inSameTable($anchorCell, $headCell)) + return new CellSelection($anchorCell, $headCell); + else + return Selection.near($headCell, 1); + } +}; +function drawCellSelection(state) { + if (!(state.selection instanceof CellSelection)) + return null; + const cells = []; + state.selection.forEachCell((node, pos) => { + cells.push( + Decoration.node(pos, pos + node.nodeSize, { class: "selectedCell" }) + ); + }); + return DecorationSet.create(state.doc, cells); +} +function isCellBoundarySelection({ $from, $to }) { + if ($from.pos == $to.pos || $from.pos < $from.pos - 6) + return false; + let afterFrom = $from.pos; + let beforeTo = $to.pos; + let depth = $from.depth; + for (; depth >= 0; depth--, afterFrom++) + if ($from.after(depth + 1) < $from.end(depth)) + break; + for (let d = $to.depth; d >= 0; d--, beforeTo--) + if ($to.before(d + 1) > $to.start(d)) + break; + return afterFrom == beforeTo && /row|table/.test($from.node(depth).type.spec.tableRole); +} +function isTextSelectionAcrossCells({ $from, $to }) { + let fromCellBoundaryNode; + let toCellBoundaryNode; + for (let i = $from.depth; i > 0; i--) { + const node = $from.node(i); + if (node.type.spec.tableRole === "cell" || node.type.spec.tableRole === "header_cell") { + fromCellBoundaryNode = node; + break; + } + } + for (let i = $to.depth; i > 0; i--) { + const node = $to.node(i); + if (node.type.spec.tableRole === "cell" || node.type.spec.tableRole === "header_cell") { + toCellBoundaryNode = node; + break; + } + } + return fromCellBoundaryNode !== toCellBoundaryNode && $to.parentOffset === 0; +} +function normalizeSelection(state, tr2, allowTableNodeSelection) { + const sel = (tr2 || state).selection; + const doc3 = (tr2 || state).doc; + let normalize2; + let role; + if (sel instanceof NodeSelection && (role = sel.node.type.spec.tableRole)) { + if (role == "cell" || role == "header_cell") { + normalize2 = CellSelection.create(doc3, sel.from); + } else if (role == "row") { + const $cell = doc3.resolve(sel.from + 1); + normalize2 = CellSelection.rowSelection($cell, $cell); + } else if (!allowTableNodeSelection) { + const map2 = TableMap.get(sel.node); + const start2 = sel.from + 1; + const lastCell = start2 + map2.map[map2.width * map2.height - 1]; + normalize2 = CellSelection.create(doc3, start2 + 1, lastCell); + } + } else if (sel instanceof TextSelection && isCellBoundarySelection(sel)) { + normalize2 = TextSelection.create(doc3, sel.from); + } else if (sel instanceof TextSelection && isTextSelectionAcrossCells(sel)) { + normalize2 = TextSelection.create(doc3, sel.$from.start(), sel.$from.end()); + } + if (normalize2) + (tr2 || (tr2 = state.tr)).setSelection(normalize2); + return tr2; +} +var fixTablesKey = new PluginKey("fix-tables"); +function changedDescendants(old, cur, offset2, f) { + const oldSize = old.childCount, curSize = cur.childCount; + outer: + for (let i = 0, j = 0; i < curSize; i++) { + const child = cur.child(i); + for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) { + if (old.child(scan) == child) { + j = scan + 1; + offset2 += child.nodeSize; + continue outer; + } + } + f(child, offset2); + if (j < oldSize && old.child(j).sameMarkup(child)) + changedDescendants(old.child(j), child, offset2 + 1, f); + else + child.nodesBetween(0, child.content.size, f, offset2 + 1); + offset2 += child.nodeSize; + } +} +function fixTables(state, oldState) { + let tr2; + const check = (node, pos) => { + if (node.type.spec.tableRole == "table") + tr2 = fixTable(state, node, pos, tr2); + }; + if (!oldState) + state.doc.descendants(check); + else if (oldState.doc != state.doc) + changedDescendants(oldState.doc, state.doc, 0, check); + return tr2; +} +function fixTable(state, table, tablePos, tr2) { + const map2 = TableMap.get(table); + if (!map2.problems) + return tr2; + if (!tr2) + tr2 = state.tr; + const mustAdd = []; + for (let i = 0; i < map2.height; i++) + mustAdd.push(0); + for (let i = 0; i < map2.problems.length; i++) { + const prob = map2.problems[i]; + if (prob.type == "collision") { + const cell = table.nodeAt(prob.pos); + if (!cell) + continue; + const attrs = cell.attrs; + for (let j = 0; j < attrs.rowspan; j++) + mustAdd[prob.row + j] += prob.n; + tr2.setNodeMarkup( + tr2.mapping.map(tablePos + 1 + prob.pos), + null, + removeColSpan(attrs, attrs.colspan - prob.n, prob.n) + ); + } else if (prob.type == "missing") { + mustAdd[prob.row] += prob.n; + } else if (prob.type == "overlong_rowspan") { + const cell = table.nodeAt(prob.pos); + if (!cell) + continue; + tr2.setNodeMarkup(tr2.mapping.map(tablePos + 1 + prob.pos), null, { + ...cell.attrs, + rowspan: cell.attrs.rowspan - prob.n + }); + } else if (prob.type == "colwidth mismatch") { + const cell = table.nodeAt(prob.pos); + if (!cell) + continue; + tr2.setNodeMarkup(tr2.mapping.map(tablePos + 1 + prob.pos), null, { + ...cell.attrs, + colwidth: prob.colwidth + }); + } + } + let first2, last; + for (let i = 0; i < mustAdd.length; i++) + if (mustAdd[i]) { + if (first2 == null) + first2 = i; + last = i; + } + for (let i = 0, pos = tablePos + 1; i < map2.height; i++) { + const row = table.child(i); + const end2 = pos + row.nodeSize; + const add = mustAdd[i]; + if (add > 0) { + let role = "cell"; + if (row.firstChild) { + role = row.firstChild.type.spec.tableRole; + } + const nodes = []; + for (let j = 0; j < add; j++) { + const node = tableNodeTypes(state.schema)[role].createAndFill(); + if (node) + nodes.push(node); + } + const side = (i == 0 || first2 == i - 1) && last == i ? pos + 1 : end2 - 1; + tr2.insert(tr2.mapping.map(side), nodes); + } + pos = end2; + } + return tr2.setMeta(fixTablesKey, { fixTables: true }); +} +function pastedCells(slice2) { + if (!slice2.size) + return null; + let { content, openStart, openEnd } = slice2; + while (content.childCount == 1 && (openStart > 0 && openEnd > 0 || content.child(0).type.spec.tableRole == "table")) { + openStart--; + openEnd--; + content = content.child(0).content; + } + const first2 = content.child(0); + const role = first2.type.spec.tableRole; + const schema = first2.type.schema, rows = []; + if (role == "row") { + for (let i = 0; i < content.childCount; i++) { + let cells = content.child(i).content; + const left2 = i ? 0 : Math.max(0, openStart - 1); + const right2 = i < content.childCount - 1 ? 0 : Math.max(0, openEnd - 1); + if (left2 || right2) + cells = fitSlice( + tableNodeTypes(schema).row, + new Slice(cells, left2, right2) + ).content; + rows.push(cells); + } + } else if (role == "cell" || role == "header_cell") { + rows.push( + openStart || openEnd ? fitSlice( + tableNodeTypes(schema).row, + new Slice(content, openStart, openEnd) + ).content : content + ); + } else { + return null; + } + return ensureRectangular(schema, rows); +} +function ensureRectangular(schema, rows) { + const widths = []; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + for (let j = row.childCount - 1; j >= 0; j--) { + const { rowspan, colspan } = row.child(j).attrs; + for (let r2 = i; r2 < i + rowspan; r2++) + widths[r2] = (widths[r2] || 0) + colspan; + } + } + let width = 0; + for (let r2 = 0; r2 < widths.length; r2++) + width = Math.max(width, widths[r2]); + for (let r2 = 0; r2 < widths.length; r2++) { + if (r2 >= rows.length) + rows.push(Fragment.empty); + if (widths[r2] < width) { + const empty2 = tableNodeTypes(schema).cell.createAndFill(); + const cells = []; + for (let i = widths[r2]; i < width; i++) { + cells.push(empty2); + } + rows[r2] = rows[r2].append(Fragment.from(cells)); + } + } + return { height: rows.length, width, rows }; +} +function fitSlice(nodeType, slice2) { + const node = nodeType.createAndFill(); + const tr2 = new Transform(node).replace(0, node.content.size, slice2); + return tr2.doc; +} +function clipCells({ width, height, rows }, newWidth, newHeight) { + if (width != newWidth) { + const added = []; + const newRows = []; + for (let row = 0; row < rows.length; row++) { + const frag = rows[row], cells = []; + for (let col = added[row] || 0, i = 0; col < newWidth; i++) { + let cell = frag.child(i % frag.childCount); + if (col + cell.attrs.colspan > newWidth) + cell = cell.type.createChecked( + removeColSpan( + cell.attrs, + cell.attrs.colspan, + col + cell.attrs.colspan - newWidth + ), + cell.content + ); + cells.push(cell); + col += cell.attrs.colspan; + for (let j = 1; j < cell.attrs.rowspan; j++) + added[row + j] = (added[row + j] || 0) + cell.attrs.colspan; + } + newRows.push(Fragment.from(cells)); + } + rows = newRows; + width = newWidth; + } + if (height != newHeight) { + const newRows = []; + for (let row = 0, i = 0; row < newHeight; row++, i++) { + const cells = [], source3 = rows[i % height]; + for (let j = 0; j < source3.childCount; j++) { + let cell = source3.child(j); + if (row + cell.attrs.rowspan > newHeight) + cell = cell.type.create( + { + ...cell.attrs, + rowspan: Math.max(1, newHeight - cell.attrs.rowspan) + }, + cell.content + ); + cells.push(cell); + } + newRows.push(Fragment.from(cells)); + } + rows = newRows; + height = newHeight; + } + return { width, height, rows }; +} +function growTable(tr2, map2, table, start2, width, height, mapFrom) { + const schema = tr2.doc.type.schema; + const types = tableNodeTypes(schema); + let empty2; + let emptyHead; + if (width > map2.width) { + for (let row = 0, rowEnd = 0; row < map2.height; row++) { + const rowNode = table.child(row); + rowEnd += rowNode.nodeSize; + const cells = []; + let add; + if (rowNode.lastChild == null || rowNode.lastChild.type == types.cell) + add = empty2 || (empty2 = types.cell.createAndFill()); + else + add = emptyHead || (emptyHead = types.header_cell.createAndFill()); + for (let i = map2.width; i < width; i++) + cells.push(add); + tr2.insert(tr2.mapping.slice(mapFrom).map(rowEnd - 1 + start2), cells); + } + } + if (height > map2.height) { + const cells = []; + for (let i = 0, start22 = (map2.height - 1) * map2.width; i < Math.max(map2.width, width); i++) { + const header = i >= map2.width ? false : table.nodeAt(map2.map[start22 + i]).type == types.header_cell; + cells.push( + header ? emptyHead || (emptyHead = types.header_cell.createAndFill()) : empty2 || (empty2 = types.cell.createAndFill()) + ); + } + const emptyRow = types.row.create(null, Fragment.from(cells)), rows = []; + for (let i = map2.height; i < height; i++) + rows.push(emptyRow); + tr2.insert(tr2.mapping.slice(mapFrom).map(start2 + table.nodeSize - 2), rows); + } + return !!(empty2 || emptyHead); +} +function isolateHorizontal(tr2, map2, table, start2, left2, right2, top2, mapFrom) { + if (top2 == 0 || top2 == map2.height) + return false; + let found2 = false; + for (let col = left2; col < right2; col++) { + const index = top2 * map2.width + col, pos = map2.map[index]; + if (map2.map[index - map2.width] == pos) { + found2 = true; + const cell = table.nodeAt(pos); + const { top: cellTop, left: cellLeft } = map2.findCell(pos); + tr2.setNodeMarkup(tr2.mapping.slice(mapFrom).map(pos + start2), null, { + ...cell.attrs, + rowspan: top2 - cellTop + }); + tr2.insert( + tr2.mapping.slice(mapFrom).map(map2.positionAt(top2, cellLeft, table)), + cell.type.createAndFill({ + ...cell.attrs, + rowspan: cellTop + cell.attrs.rowspan - top2 + }) + ); + col += cell.attrs.colspan - 1; + } + } + return found2; +} +function isolateVertical(tr2, map2, table, start2, top2, bottom2, left2, mapFrom) { + if (left2 == 0 || left2 == map2.width) + return false; + let found2 = false; + for (let row = top2; row < bottom2; row++) { + const index = row * map2.width + left2, pos = map2.map[index]; + if (map2.map[index - 1] == pos) { + found2 = true; + const cell = table.nodeAt(pos); + const cellLeft = map2.colCount(pos); + const updatePos = tr2.mapping.slice(mapFrom).map(pos + start2); + tr2.setNodeMarkup( + updatePos, + null, + removeColSpan( + cell.attrs, + left2 - cellLeft, + cell.attrs.colspan - (left2 - cellLeft) + ) + ); + tr2.insert( + updatePos + cell.nodeSize, + cell.type.createAndFill( + removeColSpan(cell.attrs, 0, left2 - cellLeft) + ) + ); + row += cell.attrs.rowspan - 1; + } + } + return found2; +} +function insertCells(state, dispatch, tableStart, rect, cells) { + let table = tableStart ? state.doc.nodeAt(tableStart - 1) : state.doc; + if (!table) { + throw new Error("No table found"); + } + let map2 = TableMap.get(table); + const { top: top2, left: left2 } = rect; + const right2 = left2 + cells.width, bottom2 = top2 + cells.height; + const tr2 = state.tr; + let mapFrom = 0; + function recomp() { + table = tableStart ? tr2.doc.nodeAt(tableStart - 1) : tr2.doc; + if (!table) { + throw new Error("No table found"); + } + map2 = TableMap.get(table); + mapFrom = tr2.mapping.maps.length; + } + if (growTable(tr2, map2, table, tableStart, right2, bottom2, mapFrom)) + recomp(); + if (isolateHorizontal(tr2, map2, table, tableStart, left2, right2, top2, mapFrom)) + recomp(); + if (isolateHorizontal(tr2, map2, table, tableStart, left2, right2, bottom2, mapFrom)) + recomp(); + if (isolateVertical(tr2, map2, table, tableStart, top2, bottom2, left2, mapFrom)) + recomp(); + if (isolateVertical(tr2, map2, table, tableStart, top2, bottom2, right2, mapFrom)) + recomp(); + for (let row = top2; row < bottom2; row++) { + const from2 = map2.positionAt(row, left2, table), to = map2.positionAt(row, right2, table); + tr2.replace( + tr2.mapping.slice(mapFrom).map(from2 + tableStart), + tr2.mapping.slice(mapFrom).map(to + tableStart), + new Slice(cells.rows[row - top2], 0, 0) + ); + } + recomp(); + tr2.setSelection( + new CellSelection( + tr2.doc.resolve(tableStart + map2.positionAt(top2, left2, table)), + tr2.doc.resolve(tableStart + map2.positionAt(bottom2 - 1, right2 - 1, table)) + ) + ); + dispatch(tr2); +} +var handleKeyDown2 = keydownHandler({ + ArrowLeft: arrow2("horiz", -1), + ArrowRight: arrow2("horiz", 1), + ArrowUp: arrow2("vert", -1), + ArrowDown: arrow2("vert", 1), + "Shift-ArrowLeft": shiftArrow("horiz", -1), + "Shift-ArrowRight": shiftArrow("horiz", 1), + "Shift-ArrowUp": shiftArrow("vert", -1), + "Shift-ArrowDown": shiftArrow("vert", 1), + Backspace: deleteCellSelection, + "Mod-Backspace": deleteCellSelection, + Delete: deleteCellSelection, + "Mod-Delete": deleteCellSelection +}); +function maybeSetSelection(state, dispatch, selection) { + if (selection.eq(state.selection)) + return false; + if (dispatch) + dispatch(state.tr.setSelection(selection).scrollIntoView()); + return true; +} +function arrow2(axis, dir) { + return (state, dispatch, view) => { + if (!view) + return false; + const sel = state.selection; + if (sel instanceof CellSelection) { + return maybeSetSelection( + state, + dispatch, + Selection.near(sel.$headCell, dir) + ); + } + if (axis != "horiz" && !sel.empty) + return false; + const end2 = atEndOfCell(view, axis, dir); + if (end2 == null) + return false; + if (axis == "horiz") { + return maybeSetSelection( + state, + dispatch, + Selection.near(state.doc.resolve(sel.head + dir), dir) + ); + } else { + const $cell = state.doc.resolve(end2); + const $next = nextCell($cell, axis, dir); + let newSel; + if ($next) + newSel = Selection.near($next, 1); + else if (dir < 0) + newSel = Selection.near(state.doc.resolve($cell.before(-1)), -1); + else + newSel = Selection.near(state.doc.resolve($cell.after(-1)), 1); + return maybeSetSelection(state, dispatch, newSel); + } + }; +} +function shiftArrow(axis, dir) { + return (state, dispatch, view) => { + if (!view) + return false; + const sel = state.selection; + let cellSel; + if (sel instanceof CellSelection) { + cellSel = sel; + } else { + const end2 = atEndOfCell(view, axis, dir); + if (end2 == null) + return false; + cellSel = new CellSelection(state.doc.resolve(end2)); + } + const $head = nextCell(cellSel.$headCell, axis, dir); + if (!$head) + return false; + return maybeSetSelection( + state, + dispatch, + new CellSelection(cellSel.$anchorCell, $head) + ); + }; +} +function deleteCellSelection(state, dispatch) { + const sel = state.selection; + if (!(sel instanceof CellSelection)) + return false; + if (dispatch) { + const tr2 = state.tr; + const baseContent = tableNodeTypes(state.schema).cell.createAndFill().content; + sel.forEachCell((cell, pos) => { + if (!cell.content.eq(baseContent)) + tr2.replace( + tr2.mapping.map(pos + 1), + tr2.mapping.map(pos + cell.nodeSize - 1), + new Slice(baseContent, 0, 0) + ); + }); + if (tr2.docChanged) + dispatch(tr2); + } + return true; +} +function handleTripleClick2(view, pos) { + const doc3 = view.state.doc, $cell = cellAround(doc3.resolve(pos)); + if (!$cell) + return false; + view.dispatch(view.state.tr.setSelection(new CellSelection($cell))); + return true; +} +function handlePaste(view, _, slice2) { + if (!isInTable(view.state)) + return false; + let cells = pastedCells(slice2); + const sel = view.state.selection; + if (sel instanceof CellSelection) { + if (!cells) + cells = { + width: 1, + height: 1, + rows: [ + Fragment.from( + fitSlice(tableNodeTypes(view.state.schema).cell, slice2) + ) + ] + }; + const table = sel.$anchorCell.node(-1); + const start2 = sel.$anchorCell.start(-1); + const rect = TableMap.get(table).rectBetween( + sel.$anchorCell.pos - start2, + sel.$headCell.pos - start2 + ); + cells = clipCells(cells, rect.right - rect.left, rect.bottom - rect.top); + insertCells(view.state, view.dispatch, start2, rect, cells); + return true; + } else if (cells) { + const $cell = selectionCell(view.state); + const start2 = $cell.start(-1); + insertCells( + view.state, + view.dispatch, + start2, + TableMap.get($cell.node(-1)).findCell($cell.pos - start2), + cells + ); + return true; + } else { + return false; + } +} +function handleMouseDown(view, startEvent) { + var _a; + if (startEvent.ctrlKey || startEvent.metaKey) + return; + const startDOMCell = domInCell(view, startEvent.target); + let $anchor; + if (startEvent.shiftKey && view.state.selection instanceof CellSelection) { + setCellSelection(view.state.selection.$anchorCell, startEvent); + startEvent.preventDefault(); + } else if (startEvent.shiftKey && startDOMCell && ($anchor = cellAround(view.state.selection.$anchor)) != null && ((_a = cellUnderMouse(view, startEvent)) == null ? void 0 : _a.pos) != $anchor.pos) { + setCellSelection($anchor, startEvent); + startEvent.preventDefault(); + } else if (!startDOMCell) { + return; + } + function setCellSelection($anchor2, event) { + let $head = cellUnderMouse(view, event); + const starting = tableEditingKey.getState(view.state) == null; + if (!$head || !inSameTable($anchor2, $head)) { + if (starting) + $head = $anchor2; + else + return; + } + const selection = new CellSelection($anchor2, $head); + if (starting || !view.state.selection.eq(selection)) { + const tr2 = view.state.tr.setSelection(selection); + if (starting) + tr2.setMeta(tableEditingKey, $anchor2.pos); + view.dispatch(tr2); + } + } + function stop() { + view.root.removeEventListener("mouseup", stop); + view.root.removeEventListener("dragstart", stop); + view.root.removeEventListener("mousemove", move); + if (tableEditingKey.getState(view.state) != null) + view.dispatch(view.state.tr.setMeta(tableEditingKey, -1)); + } + function move(_event) { + const event = _event; + const anchor = tableEditingKey.getState(view.state); + let $anchor2; + if (anchor != null) { + $anchor2 = view.state.doc.resolve(anchor); + } else if (domInCell(view, event.target) != startDOMCell) { + $anchor2 = cellUnderMouse(view, startEvent); + if (!$anchor2) + return stop(); + } + if ($anchor2) + setCellSelection($anchor2, event); + } + view.root.addEventListener("mouseup", stop); + view.root.addEventListener("dragstart", stop); + view.root.addEventListener("mousemove", move); +} +function atEndOfCell(view, axis, dir) { + if (!(view.state.selection instanceof TextSelection)) + return null; + const { $head } = view.state.selection; + for (let d = $head.depth - 1; d >= 0; d--) { + const parent = $head.node(d), index = dir < 0 ? $head.index(d) : $head.indexAfter(d); + if (index != (dir < 0 ? 0 : parent.childCount)) + return null; + if (parent.type.spec.tableRole == "cell" || parent.type.spec.tableRole == "header_cell") { + const cellPos = $head.before(d); + const dirStr = axis == "vert" ? dir > 0 ? "down" : "up" : dir > 0 ? "right" : "left"; + return view.endOfTextblock(dirStr) ? cellPos : null; + } + } + return null; +} +function domInCell(view, dom) { + for (; dom && dom != view.dom; dom = dom.parentNode) { + if (dom.nodeName == "TD" || dom.nodeName == "TH") { + return dom; + } + } + return null; +} +function cellUnderMouse(view, event) { + const mousePos = view.posAtCoords({ + left: event.clientX, + top: event.clientY + }); + if (!mousePos) + return null; + return mousePos ? cellAround(view.state.doc.resolve(mousePos.pos)) : null; +} +var TableView = class { + constructor(node, cellMinWidth) { + this.node = node; + this.cellMinWidth = cellMinWidth; + this.dom = document.createElement("div"); + this.dom.className = "tableWrapper"; + this.table = this.dom.appendChild(document.createElement("table")); + this.colgroup = this.table.appendChild(document.createElement("colgroup")); + updateColumnsOnResize(node, this.colgroup, this.table, cellMinWidth); + this.contentDOM = this.table.appendChild(document.createElement("tbody")); + } + update(node) { + if (node.type != this.node.type) + return false; + this.node = node; + updateColumnsOnResize(node, this.colgroup, this.table, this.cellMinWidth); + return true; + } + ignoreMutation(record) { + return record.type == "attributes" && (record.target == this.table || this.colgroup.contains(record.target)); + } +}; +function updateColumnsOnResize(node, colgroup, table, cellMinWidth, overrideCol, overrideValue) { + var _a; + let totalWidth = 0; + let fixedWidth = true; + let nextDOM = colgroup.firstChild; + const row = node.firstChild; + if (!row) + return; + for (let i = 0, col = 0; i < row.childCount; i++) { + const { colspan, colwidth } = row.child(i).attrs; + for (let j = 0; j < colspan; j++, col++) { + const hasWidth = overrideCol == col ? overrideValue : colwidth && colwidth[j]; + const cssWidth = hasWidth ? hasWidth + "px" : ""; + totalWidth += hasWidth || cellMinWidth; + if (!hasWidth) + fixedWidth = false; + if (!nextDOM) { + colgroup.appendChild(document.createElement("col")).style.width = cssWidth; + } else { + if (nextDOM.style.width != cssWidth) + nextDOM.style.width = cssWidth; + nextDOM = nextDOM.nextSibling; + } + } + } + while (nextDOM) { + const after = nextDOM.nextSibling; + (_a = nextDOM.parentNode) == null ? void 0 : _a.removeChild(nextDOM); + nextDOM = after; + } + if (fixedWidth) { + table.style.width = totalWidth + "px"; + table.style.minWidth = ""; + } else { + table.style.width = ""; + table.style.minWidth = totalWidth + "px"; + } +} +var columnResizingPluginKey = new PluginKey( + "tableColumnResizing" +); +function columnResizing({ + handleWidth = 5, + cellMinWidth = 25, + View = TableView, + lastColumnResizable = true +} = {}) { + const plugin = new Plugin({ + key: columnResizingPluginKey, + state: { + init(_, state) { + plugin.spec.props.nodeViews[tableNodeTypes(state.schema).table.name] = (node, view) => new View(node, cellMinWidth, view); + return new ResizeState(-1, false); + }, + apply(tr2, prev) { + return prev.apply(tr2); + } + }, + props: { + attributes: (state) => { + const pluginState = columnResizingPluginKey.getState(state); + return pluginState && pluginState.activeHandle > -1 ? { class: "resize-cursor" } : {}; + }, + handleDOMEvents: { + mousemove: (view, event) => { + handleMouseMove( + view, + event, + handleWidth, + cellMinWidth, + lastColumnResizable + ); + }, + mouseleave: (view) => { + handleMouseLeave(view); + }, + mousedown: (view, event) => { + handleMouseDown2(view, event, cellMinWidth); + } + }, + decorations: (state) => { + const pluginState = columnResizingPluginKey.getState(state); + if (pluginState && pluginState.activeHandle > -1) { + return handleDecorations(state, pluginState.activeHandle); + } + }, + nodeViews: {} + } + }); + return plugin; +} +var ResizeState = class _ResizeState { + constructor(activeHandle, dragging) { + this.activeHandle = activeHandle; + this.dragging = dragging; + } + apply(tr2) { + const state = this; + const action = tr2.getMeta(columnResizingPluginKey); + if (action && action.setHandle != null) + return new _ResizeState(action.setHandle, false); + if (action && action.setDragging !== void 0) + return new _ResizeState(state.activeHandle, action.setDragging); + if (state.activeHandle > -1 && tr2.docChanged) { + let handle = tr2.mapping.map(state.activeHandle, -1); + if (!pointsAtCell(tr2.doc.resolve(handle))) { + handle = -1; + } + return new _ResizeState(handle, state.dragging); + } + return state; + } +}; +function handleMouseMove(view, event, handleWidth, cellMinWidth, lastColumnResizable) { + const pluginState = columnResizingPluginKey.getState(view.state); + if (!pluginState) + return; + if (!pluginState.dragging) { + const target = domCellAround(event.target); + let cell = -1; + if (target) { + const { left: left2, right: right2 } = target.getBoundingClientRect(); + if (event.clientX - left2 <= handleWidth) + cell = edgeCell(view, event, "left", handleWidth); + else if (right2 - event.clientX <= handleWidth) + cell = edgeCell(view, event, "right", handleWidth); + } + if (cell != pluginState.activeHandle) { + if (!lastColumnResizable && cell !== -1) { + const $cell = view.state.doc.resolve(cell); + const table = $cell.node(-1); + const map2 = TableMap.get(table); + const tableStart = $cell.start(-1); + const col = map2.colCount($cell.pos - tableStart) + $cell.nodeAfter.attrs.colspan - 1; + if (col == map2.width - 1) { + return; + } + } + updateHandle(view, cell); + } + } +} +function handleMouseLeave(view) { + const pluginState = columnResizingPluginKey.getState(view.state); + if (pluginState && pluginState.activeHandle > -1 && !pluginState.dragging) + updateHandle(view, -1); +} +function handleMouseDown2(view, event, cellMinWidth) { + const pluginState = columnResizingPluginKey.getState(view.state); + if (!pluginState || pluginState.activeHandle == -1 || pluginState.dragging) + return false; + const cell = view.state.doc.nodeAt(pluginState.activeHandle); + const width = currentColWidth(view, pluginState.activeHandle, cell.attrs); + view.dispatch( + view.state.tr.setMeta(columnResizingPluginKey, { + setDragging: { startX: event.clientX, startWidth: width } + }) + ); + function finish(event2) { + window.removeEventListener("mouseup", finish); + window.removeEventListener("mousemove", move); + const pluginState2 = columnResizingPluginKey.getState(view.state); + if (pluginState2 == null ? void 0 : pluginState2.dragging) { + updateColumnWidth( + view, + pluginState2.activeHandle, + draggedWidth(pluginState2.dragging, event2, cellMinWidth) + ); + view.dispatch( + view.state.tr.setMeta(columnResizingPluginKey, { setDragging: null }) + ); + } + } + function move(event2) { + if (!event2.which) + return finish(event2); + const pluginState2 = columnResizingPluginKey.getState(view.state); + if (!pluginState2) + return; + if (pluginState2.dragging) { + const dragged = draggedWidth(pluginState2.dragging, event2, cellMinWidth); + displayColumnWidth(view, pluginState2.activeHandle, dragged, cellMinWidth); + } + } + window.addEventListener("mouseup", finish); + window.addEventListener("mousemove", move); + event.preventDefault(); + return true; +} +function currentColWidth(view, cellPos, { colspan, colwidth }) { + const width = colwidth && colwidth[colwidth.length - 1]; + if (width) + return width; + const dom = view.domAtPos(cellPos); + const node = dom.node.childNodes[dom.offset]; + let domWidth = node.offsetWidth, parts = colspan; + if (colwidth) { + for (let i = 0; i < colspan; i++) + if (colwidth[i]) { + domWidth -= colwidth[i]; + parts--; + } + } + return domWidth / parts; +} +function domCellAround(target) { + while (target && target.nodeName != "TD" && target.nodeName != "TH") + target = target.classList && target.classList.contains("ProseMirror") ? null : target.parentNode; + return target; +} +function edgeCell(view, event, side, handleWidth) { + const offset2 = side == "right" ? -handleWidth : handleWidth; + const found2 = view.posAtCoords({ + left: event.clientX + offset2, + top: event.clientY + }); + if (!found2) + return -1; + const { pos } = found2; + const $cell = cellAround(view.state.doc.resolve(pos)); + if (!$cell) + return -1; + if (side == "right") + return $cell.pos; + const map2 = TableMap.get($cell.node(-1)), start2 = $cell.start(-1); + const index = map2.map.indexOf($cell.pos - start2); + return index % map2.width == 0 ? -1 : start2 + map2.map[index - 1]; +} +function draggedWidth(dragging, event, cellMinWidth) { + const offset2 = event.clientX - dragging.startX; + return Math.max(cellMinWidth, dragging.startWidth + offset2); +} +function updateHandle(view, value) { + view.dispatch( + view.state.tr.setMeta(columnResizingPluginKey, { setHandle: value }) + ); +} +function updateColumnWidth(view, cell, width) { + const $cell = view.state.doc.resolve(cell); + const table = $cell.node(-1), map2 = TableMap.get(table), start2 = $cell.start(-1); + const col = map2.colCount($cell.pos - start2) + $cell.nodeAfter.attrs.colspan - 1; + const tr2 = view.state.tr; + for (let row = 0; row < map2.height; row++) { + const mapIndex = row * map2.width + col; + if (row && map2.map[mapIndex] == map2.map[mapIndex - map2.width]) + continue; + const pos = map2.map[mapIndex]; + const attrs = table.nodeAt(pos).attrs; + const index = attrs.colspan == 1 ? 0 : col - map2.colCount(pos); + if (attrs.colwidth && attrs.colwidth[index] == width) + continue; + const colwidth = attrs.colwidth ? attrs.colwidth.slice() : zeroes(attrs.colspan); + colwidth[index] = width; + tr2.setNodeMarkup(start2 + pos, null, { ...attrs, colwidth }); + } + if (tr2.docChanged) + view.dispatch(tr2); +} +function displayColumnWidth(view, cell, width, cellMinWidth) { + const $cell = view.state.doc.resolve(cell); + const table = $cell.node(-1), start2 = $cell.start(-1); + const col = TableMap.get(table).colCount($cell.pos - start2) + $cell.nodeAfter.attrs.colspan - 1; + let dom = view.domAtPos($cell.start(-1)).node; + while (dom && dom.nodeName != "TABLE") { + dom = dom.parentNode; + } + if (!dom) + return; + updateColumnsOnResize( + table, + dom.firstChild, + dom, + cellMinWidth, + col, + width + ); +} +function zeroes(n) { + return Array(n).fill(0); +} +function handleDecorations(state, cell) { + const decorations = []; + const $cell = state.doc.resolve(cell); + const table = $cell.node(-1); + if (!table) { + return DecorationSet.empty; + } + const map2 = TableMap.get(table); + const start2 = $cell.start(-1); + const col = map2.colCount($cell.pos - start2) + $cell.nodeAfter.attrs.colspan; + for (let row = 0; row < map2.height; row++) { + const index = col + row * map2.width - 1; + if ((col == map2.width || map2.map[index] != map2.map[index + 1]) && (row == 0 || map2.map[index] != map2.map[index - map2.width])) { + const cellPos = map2.map[index]; + const pos = start2 + cellPos + table.nodeAt(cellPos).nodeSize - 1; + const dom = document.createElement("div"); + dom.className = "column-resize-handle"; + decorations.push(Decoration.widget(pos, dom)); + } + } + return DecorationSet.create(state.doc, decorations); +} +function selectedRect(state) { + const sel = state.selection; + const $pos = selectionCell(state); + const table = $pos.node(-1); + const tableStart = $pos.start(-1); + const map2 = TableMap.get(table); + const rect = sel instanceof CellSelection ? map2.rectBetween( + sel.$anchorCell.pos - tableStart, + sel.$headCell.pos - tableStart + ) : map2.findCell($pos.pos - tableStart); + return { ...rect, tableStart, map: map2, table }; +} +function addColumn(tr2, { map: map2, tableStart, table }, col) { + let refColumn = col > 0 ? -1 : 0; + if (columnIsHeader(map2, table, col + refColumn)) { + refColumn = col == 0 || col == map2.width ? null : 0; + } + for (let row = 0; row < map2.height; row++) { + const index = row * map2.width + col; + if (col > 0 && col < map2.width && map2.map[index - 1] == map2.map[index]) { + const pos = map2.map[index]; + const cell = table.nodeAt(pos); + tr2.setNodeMarkup( + tr2.mapping.map(tableStart + pos), + null, + addColSpan(cell.attrs, col - map2.colCount(pos)) + ); + row += cell.attrs.rowspan - 1; + } else { + const type = refColumn == null ? tableNodeTypes(table.type.schema).cell : table.nodeAt(map2.map[index + refColumn]).type; + const pos = map2.positionAt(row, col, table); + tr2.insert(tr2.mapping.map(tableStart + pos), type.createAndFill()); + } + } + return tr2; +} +function addColumnBefore(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const rect = selectedRect(state); + dispatch(addColumn(state.tr, rect, rect.left)); + } + return true; +} +function addColumnAfter(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const rect = selectedRect(state); + dispatch(addColumn(state.tr, rect, rect.right)); + } + return true; +} +function removeColumn(tr2, { map: map2, table, tableStart }, col) { + const mapStart = tr2.mapping.maps.length; + for (let row = 0; row < map2.height; ) { + const index = row * map2.width + col; + const pos = map2.map[index]; + const cell = table.nodeAt(pos); + const attrs = cell.attrs; + if (col > 0 && map2.map[index - 1] == pos || col < map2.width - 1 && map2.map[index + 1] == pos) { + tr2.setNodeMarkup( + tr2.mapping.slice(mapStart).map(tableStart + pos), + null, + removeColSpan(attrs, col - map2.colCount(pos)) + ); + } else { + const start2 = tr2.mapping.slice(mapStart).map(tableStart + pos); + tr2.delete(start2, start2 + cell.nodeSize); + } + row += attrs.rowspan; + } +} +function deleteColumn(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const rect = selectedRect(state); + const tr2 = state.tr; + if (rect.left == 0 && rect.right == rect.map.width) + return false; + for (let i = rect.right - 1; ; i--) { + removeColumn(tr2, rect, i); + if (i == rect.left) + break; + const table = rect.tableStart ? tr2.doc.nodeAt(rect.tableStart - 1) : tr2.doc; + if (!table) { + throw RangeError("No table found"); + } + rect.table = table; + rect.map = TableMap.get(table); + } + dispatch(tr2); + } + return true; +} +function rowIsHeader(map2, table, row) { + var _a; + const headerCell = tableNodeTypes(table.type.schema).header_cell; + for (let col = 0; col < map2.width; col++) + if (((_a = table.nodeAt(map2.map[col + row * map2.width])) == null ? void 0 : _a.type) != headerCell) + return false; + return true; +} +function addRow(tr2, { map: map2, tableStart, table }, row) { + var _a; + let rowPos = tableStart; + for (let i = 0; i < row; i++) + rowPos += table.child(i).nodeSize; + const cells = []; + let refRow = row > 0 ? -1 : 0; + if (rowIsHeader(map2, table, row + refRow)) + refRow = row == 0 || row == map2.height ? null : 0; + for (let col = 0, index = map2.width * row; col < map2.width; col++, index++) { + if (row > 0 && row < map2.height && map2.map[index] == map2.map[index - map2.width]) { + const pos = map2.map[index]; + const attrs = table.nodeAt(pos).attrs; + tr2.setNodeMarkup(tableStart + pos, null, { + ...attrs, + rowspan: attrs.rowspan + 1 + }); + col += attrs.colspan - 1; + } else { + const type = refRow == null ? tableNodeTypes(table.type.schema).cell : (_a = table.nodeAt(map2.map[index + refRow * map2.width])) == null ? void 0 : _a.type; + const node = type == null ? void 0 : type.createAndFill(); + if (node) + cells.push(node); + } + } + tr2.insert(rowPos, tableNodeTypes(table.type.schema).row.create(null, cells)); + return tr2; +} +function addRowBefore(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const rect = selectedRect(state); + dispatch(addRow(state.tr, rect, rect.top)); + } + return true; +} +function addRowAfter(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const rect = selectedRect(state); + dispatch(addRow(state.tr, rect, rect.bottom)); + } + return true; +} +function removeRow(tr2, { map: map2, table, tableStart }, row) { + let rowPos = 0; + for (let i = 0; i < row; i++) + rowPos += table.child(i).nodeSize; + const nextRow = rowPos + table.child(row).nodeSize; + const mapFrom = tr2.mapping.maps.length; + tr2.delete(rowPos + tableStart, nextRow + tableStart); + const seen = /* @__PURE__ */ new Set(); + for (let col = 0, index = row * map2.width; col < map2.width; col++, index++) { + const pos = map2.map[index]; + if (seen.has(pos)) + continue; + seen.add(pos); + if (row > 0 && pos == map2.map[index - map2.width]) { + const attrs = table.nodeAt(pos).attrs; + tr2.setNodeMarkup(tr2.mapping.slice(mapFrom).map(pos + tableStart), null, { + ...attrs, + rowspan: attrs.rowspan - 1 + }); + col += attrs.colspan - 1; + } else if (row < map2.height && pos == map2.map[index + map2.width]) { + const cell = table.nodeAt(pos); + const attrs = cell.attrs; + const copy2 = cell.type.create( + { ...attrs, rowspan: cell.attrs.rowspan - 1 }, + cell.content + ); + const newPos = map2.positionAt(row + 1, col, table); + tr2.insert(tr2.mapping.slice(mapFrom).map(tableStart + newPos), copy2); + col += attrs.colspan - 1; + } + } +} +function deleteRow(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const rect = selectedRect(state), tr2 = state.tr; + if (rect.top == 0 && rect.bottom == rect.map.height) + return false; + for (let i = rect.bottom - 1; ; i--) { + removeRow(tr2, rect, i); + if (i == rect.top) + break; + const table = rect.tableStart ? tr2.doc.nodeAt(rect.tableStart - 1) : tr2.doc; + if (!table) { + throw RangeError("No table found"); + } + rect.table = table; + rect.map = TableMap.get(rect.table); + } + dispatch(tr2); + } + return true; +} +function isEmpty(cell) { + const c2 = cell.content; + return c2.childCount == 1 && c2.child(0).isTextblock && c2.child(0).childCount == 0; +} +function cellsOverlapRectangle({ width, height, map: map2 }, rect) { + let indexTop = rect.top * width + rect.left, indexLeft = indexTop; + let indexBottom = (rect.bottom - 1) * width + rect.left, indexRight = indexTop + (rect.right - rect.left - 1); + for (let i = rect.top; i < rect.bottom; i++) { + if (rect.left > 0 && map2[indexLeft] == map2[indexLeft - 1] || rect.right < width && map2[indexRight] == map2[indexRight + 1]) + return true; + indexLeft += width; + indexRight += width; + } + for (let i = rect.left; i < rect.right; i++) { + if (rect.top > 0 && map2[indexTop] == map2[indexTop - width] || rect.bottom < height && map2[indexBottom] == map2[indexBottom + width]) + return true; + indexTop++; + indexBottom++; + } + return false; +} +function mergeCells(state, dispatch) { + const sel = state.selection; + if (!(sel instanceof CellSelection) || sel.$anchorCell.pos == sel.$headCell.pos) + return false; + const rect = selectedRect(state), { map: map2 } = rect; + if (cellsOverlapRectangle(map2, rect)) + return false; + if (dispatch) { + const tr2 = state.tr; + const seen = {}; + let content = Fragment.empty; + let mergedPos; + let mergedCell; + for (let row = rect.top; row < rect.bottom; row++) { + for (let col = rect.left; col < rect.right; col++) { + const cellPos = map2.map[row * map2.width + col]; + const cell = rect.table.nodeAt(cellPos); + if (seen[cellPos] || !cell) + continue; + seen[cellPos] = true; + if (mergedPos == null) { + mergedPos = cellPos; + mergedCell = cell; + } else { + if (!isEmpty(cell)) + content = content.append(cell.content); + const mapped = tr2.mapping.map(cellPos + rect.tableStart); + tr2.delete(mapped, mapped + cell.nodeSize); + } + } + } + if (mergedPos == null || mergedCell == null) { + return true; + } + tr2.setNodeMarkup(mergedPos + rect.tableStart, null, { + ...addColSpan( + mergedCell.attrs, + mergedCell.attrs.colspan, + rect.right - rect.left - mergedCell.attrs.colspan + ), + rowspan: rect.bottom - rect.top + }); + if (content.size) { + const end2 = mergedPos + 1 + mergedCell.content.size; + const start2 = isEmpty(mergedCell) ? mergedPos + 1 : end2; + tr2.replaceWith(start2 + rect.tableStart, end2 + rect.tableStart, content); + } + tr2.setSelection( + new CellSelection(tr2.doc.resolve(mergedPos + rect.tableStart)) + ); + dispatch(tr2); + } + return true; +} +function splitCell(state, dispatch) { + const nodeTypes = tableNodeTypes(state.schema); + return splitCellWithType(({ node }) => { + return nodeTypes[node.type.spec.tableRole]; + })(state, dispatch); +} +function splitCellWithType(getCellType) { + return (state, dispatch) => { + var _a; + const sel = state.selection; + let cellNode; + let cellPos; + if (!(sel instanceof CellSelection)) { + cellNode = cellWrapping(sel.$from); + if (!cellNode) + return false; + cellPos = (_a = cellAround(sel.$from)) == null ? void 0 : _a.pos; + } else { + if (sel.$anchorCell.pos != sel.$headCell.pos) + return false; + cellNode = sel.$anchorCell.nodeAfter; + cellPos = sel.$anchorCell.pos; + } + if (cellNode == null || cellPos == null) { + return false; + } + if (cellNode.attrs.colspan == 1 && cellNode.attrs.rowspan == 1) { + return false; + } + if (dispatch) { + let baseAttrs = cellNode.attrs; + const attrs = []; + const colwidth = baseAttrs.colwidth; + if (baseAttrs.rowspan > 1) + baseAttrs = { ...baseAttrs, rowspan: 1 }; + if (baseAttrs.colspan > 1) + baseAttrs = { ...baseAttrs, colspan: 1 }; + const rect = selectedRect(state), tr2 = state.tr; + for (let i = 0; i < rect.right - rect.left; i++) + attrs.push( + colwidth ? { + ...baseAttrs, + colwidth: colwidth && colwidth[i] ? [colwidth[i]] : null + } : baseAttrs + ); + let lastCell; + for (let row = rect.top; row < rect.bottom; row++) { + let pos = rect.map.positionAt(row, rect.left, rect.table); + if (row == rect.top) + pos += cellNode.nodeSize; + for (let col = rect.left, i = 0; col < rect.right; col++, i++) { + if (col == rect.left && row == rect.top) + continue; + tr2.insert( + lastCell = tr2.mapping.map(pos + rect.tableStart, 1), + getCellType({ node: cellNode, row, col }).createAndFill(attrs[i]) + ); + } + } + tr2.setNodeMarkup( + cellPos, + getCellType({ node: cellNode, row: rect.top, col: rect.left }), + attrs[0] + ); + if (sel instanceof CellSelection) + tr2.setSelection( + new CellSelection( + tr2.doc.resolve(sel.$anchorCell.pos), + lastCell ? tr2.doc.resolve(lastCell) : void 0 + ) + ); + dispatch(tr2); + } + return true; + }; +} +function setCellAttr(name, value) { + return function(state, dispatch) { + if (!isInTable(state)) + return false; + const $cell = selectionCell(state); + if ($cell.nodeAfter.attrs[name] === value) + return false; + if (dispatch) { + const tr2 = state.tr; + if (state.selection instanceof CellSelection) + state.selection.forEachCell((node, pos) => { + if (node.attrs[name] !== value) + tr2.setNodeMarkup(pos, null, { + ...node.attrs, + [name]: value + }); + }); + else + tr2.setNodeMarkup($cell.pos, null, { + ...$cell.nodeAfter.attrs, + [name]: value + }); + dispatch(tr2); + } + return true; + }; +} +function deprecated_toggleHeader(type) { + return function(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const types = tableNodeTypes(state.schema); + const rect = selectedRect(state), tr2 = state.tr; + const cells = rect.map.cellsInRect( + type == "column" ? { + left: rect.left, + top: 0, + right: rect.right, + bottom: rect.map.height + } : type == "row" ? { + left: 0, + top: rect.top, + right: rect.map.width, + bottom: rect.bottom + } : rect + ); + const nodes = cells.map((pos) => rect.table.nodeAt(pos)); + for (let i = 0; i < cells.length; i++) + if (nodes[i].type == types.header_cell) + tr2.setNodeMarkup( + rect.tableStart + cells[i], + types.cell, + nodes[i].attrs + ); + if (tr2.steps.length == 0) + for (let i = 0; i < cells.length; i++) + tr2.setNodeMarkup( + rect.tableStart + cells[i], + types.header_cell, + nodes[i].attrs + ); + dispatch(tr2); + } + return true; + }; +} +function isHeaderEnabledByType(type, rect, types) { + const cellPositions = rect.map.cellsInRect({ + left: 0, + top: 0, + right: type == "row" ? rect.map.width : 1, + bottom: type == "column" ? rect.map.height : 1 + }); + for (let i = 0; i < cellPositions.length; i++) { + const cell = rect.table.nodeAt(cellPositions[i]); + if (cell && cell.type !== types.header_cell) { + return false; + } + } + return true; +} +function toggleHeader(type, options) { + options = options || { useDeprecatedLogic: false }; + if (options.useDeprecatedLogic) + return deprecated_toggleHeader(type); + return function(state, dispatch) { + if (!isInTable(state)) + return false; + if (dispatch) { + const types = tableNodeTypes(state.schema); + const rect = selectedRect(state), tr2 = state.tr; + const isHeaderRowEnabled = isHeaderEnabledByType("row", rect, types); + const isHeaderColumnEnabled = isHeaderEnabledByType( + "column", + rect, + types + ); + const isHeaderEnabled = type === "column" ? isHeaderRowEnabled : type === "row" ? isHeaderColumnEnabled : false; + const selectionStartsAt = isHeaderEnabled ? 1 : 0; + const cellsRect = type == "column" ? { + left: 0, + top: selectionStartsAt, + right: 1, + bottom: rect.map.height + } : type == "row" ? { + left: selectionStartsAt, + top: 0, + right: rect.map.width, + bottom: 1 + } : rect; + const newType = type == "column" ? isHeaderColumnEnabled ? types.cell : types.header_cell : type == "row" ? isHeaderRowEnabled ? types.cell : types.header_cell : types.cell; + rect.map.cellsInRect(cellsRect).forEach((relativeCellPos) => { + const cellPos = relativeCellPos + rect.tableStart; + const cell = tr2.doc.nodeAt(cellPos); + if (cell) { + tr2.setNodeMarkup(cellPos, newType, cell.attrs); + } + }); + dispatch(tr2); + } + return true; + }; +} +var toggleHeaderRow = toggleHeader("row", { + useDeprecatedLogic: true +}); +var toggleHeaderColumn = toggleHeader("column", { + useDeprecatedLogic: true +}); +var toggleHeaderCell = toggleHeader("cell", { + useDeprecatedLogic: true +}); +function findNextCell($cell, dir) { + if (dir < 0) { + const before = $cell.nodeBefore; + if (before) + return $cell.pos - before.nodeSize; + for (let row = $cell.index(-1) - 1, rowEnd = $cell.before(); row >= 0; row--) { + const rowNode = $cell.node(-1).child(row); + const lastChild = rowNode.lastChild; + if (lastChild) { + return rowEnd - 1 - lastChild.nodeSize; + } + rowEnd -= rowNode.nodeSize; + } + } else { + if ($cell.index() < $cell.parent.childCount - 1) { + return $cell.pos + $cell.nodeAfter.nodeSize; + } + const table = $cell.node(-1); + for (let row = $cell.indexAfter(-1), rowStart = $cell.after(); row < table.childCount; row++) { + const rowNode = table.child(row); + if (rowNode.childCount) + return rowStart + 1; + rowStart += rowNode.nodeSize; + } + } + return null; +} +function goToNextCell(direction) { + return function(state, dispatch) { + if (!isInTable(state)) + return false; + const cell = findNextCell(selectionCell(state), direction); + if (cell == null) + return false; + if (dispatch) { + const $cell = state.doc.resolve(cell); + dispatch( + state.tr.setSelection(TextSelection.between($cell, moveCellForward($cell))).scrollIntoView() + ); + } + return true; + }; +} +function deleteTable(state, dispatch) { + const $pos = state.selection.$anchor; + for (let d = $pos.depth; d > 0; d--) { + const node = $pos.node(d); + if (node.type.spec.tableRole == "table") { + if (dispatch) + dispatch( + state.tr.delete($pos.before(d), $pos.after(d)).scrollIntoView() + ); + return true; + } + } + return false; +} +function tableEditing({ + allowTableNodeSelection = false +} = {}) { + return new Plugin({ + key: tableEditingKey, + // This piece of state is used to remember when a mouse-drag + // cell-selection is happening, so that it can continue even as + // transactions (which might move its anchor cell) come in. + state: { + init() { + return null; + }, + apply(tr2, cur) { + const set = tr2.getMeta(tableEditingKey); + if (set != null) + return set == -1 ? null : set; + if (cur == null || !tr2.docChanged) + return cur; + const { deleted, pos } = tr2.mapping.mapResult(cur); + return deleted ? null : pos; + } + }, + props: { + decorations: drawCellSelection, + handleDOMEvents: { + mousedown: handleMouseDown + }, + createSelectionBetween(view) { + return tableEditingKey.getState(view.state) != null ? view.state.selection : null; + }, + handleTripleClick: handleTripleClick2, + handleKeyDown: handleKeyDown2, + handlePaste + }, + appendTransaction(_, oldState, state) { + return normalizeSelection( + state, + fixTables(state, oldState), + allowTableNodeSelection + ); + } + }); +} + +// node_modules/@tiptap/extension-table/dist/index.js +function updateColumns(node, colgroup, table, cellMinWidth, overrideCol, overrideValue) { + let totalWidth = 0; + let fixedWidth = true; + let nextDOM = colgroup.firstChild; + const row = node.firstChild; + for (let i = 0, col = 0; i < row.childCount; i += 1) { + const { colspan, colwidth } = row.child(i).attrs; + for (let j = 0; j < colspan; j += 1, col += 1) { + const hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j]; + const cssWidth = hasWidth ? `${hasWidth}px` : ""; + totalWidth += hasWidth || cellMinWidth; + if (!hasWidth) { + fixedWidth = false; + } + if (!nextDOM) { + colgroup.appendChild(document.createElement("col")).style.width = cssWidth; + } else { + if (nextDOM.style.width !== cssWidth) { + nextDOM.style.width = cssWidth; + } + nextDOM = nextDOM.nextSibling; + } + } + } + while (nextDOM) { + const after = nextDOM.nextSibling; + nextDOM.parentNode.removeChild(nextDOM); + nextDOM = after; + } + if (fixedWidth) { + table.style.width = `${totalWidth}px`; + table.style.minWidth = ""; + } else { + table.style.width = ""; + table.style.minWidth = `${totalWidth}px`; + } +} +var TableView2 = class { + constructor(node, cellMinWidth) { + this.node = node; + this.cellMinWidth = cellMinWidth; + this.dom = document.createElement("div"); + this.dom.className = "tableWrapper"; + this.table = this.dom.appendChild(document.createElement("table")); + this.colgroup = this.table.appendChild(document.createElement("colgroup")); + updateColumns(node, this.colgroup, this.table, cellMinWidth); + this.contentDOM = this.table.appendChild(document.createElement("tbody")); + } + update(node) { + if (node.type !== this.node.type) { + return false; + } + this.node = node; + updateColumns(node, this.colgroup, this.table, this.cellMinWidth); + return true; + } + ignoreMutation(mutation) { + return mutation.type === "attributes" && (mutation.target === this.table || this.colgroup.contains(mutation.target)); + } +}; +function createCell(cellType, cellContent) { + if (cellContent) { + return cellType.createChecked(null, cellContent); + } + return cellType.createAndFill(); +} +function getTableNodeTypes(schema) { + if (schema.cached.tableNodeTypes) { + return schema.cached.tableNodeTypes; + } + const roles = {}; + Object.keys(schema.nodes).forEach((type) => { + const nodeType = schema.nodes[type]; + if (nodeType.spec.tableRole) { + roles[nodeType.spec.tableRole] = nodeType; + } + }); + schema.cached.tableNodeTypes = roles; + return roles; +} +function createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) { + const types = getTableNodeTypes(schema); + const headerCells = []; + const cells = []; + for (let index = 0; index < colsCount; index += 1) { + const cell = createCell(types.cell, cellContent); + if (cell) { + cells.push(cell); + } + if (withHeaderRow) { + const headerCell = createCell(types.header_cell, cellContent); + if (headerCell) { + headerCells.push(headerCell); + } + } + } + const rows = []; + for (let index = 0; index < rowsCount; index += 1) { + rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells)); + } + return types.table.createChecked(null, rows); +} +function isCellSelection(value) { + return value instanceof CellSelection; +} +var deleteTableWhenAllCellsSelected = ({ editor }) => { + const { selection } = editor.state; + if (!isCellSelection(selection)) { + return false; + } + let cellCount = 0; + const table = findParentNodeClosestToPos(selection.ranges[0].$from, (node) => { + return node.type.name === "table"; + }); + table === null || table === void 0 ? void 0 : table.node.descendants((node) => { + if (node.type.name === "table") { + return false; + } + if (["tableCell", "tableHeader"].includes(node.type.name)) { + cellCount += 1; + } + }); + const allCellsSelected = cellCount === selection.ranges.length; + if (!allCellsSelected) { + return false; + } + editor.commands.deleteTable(); + return true; +}; +var Table = Node2.create({ + name: "table", + // @ts-ignore + addOptions() { + return { + HTMLAttributes: {}, + resizable: false, + handleWidth: 5, + cellMinWidth: 25, + // TODO: fix + View: TableView2, + lastColumnResizable: true, + allowTableNodeSelection: false + }; + }, + content: "tableRow+", + tableRole: "table", + isolating: true, + group: "block", + parseHTML() { + return [{ tag: "table" }]; + }, + renderHTML({ HTMLAttributes }) { + return ["table", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), ["tbody", 0]]; + }, + addCommands() { + return { + insertTable: ({ rows = 3, cols = 3, withHeaderRow = true } = {}) => ({ tr: tr2, dispatch, editor }) => { + const node = createTable(editor.schema, rows, cols, withHeaderRow); + if (dispatch) { + const offset2 = tr2.selection.anchor + 1; + tr2.replaceSelectionWith(node).scrollIntoView().setSelection(TextSelection.near(tr2.doc.resolve(offset2))); + } + return true; + }, + addColumnBefore: () => ({ state, dispatch }) => { + return addColumnBefore(state, dispatch); + }, + addColumnAfter: () => ({ state, dispatch }) => { + return addColumnAfter(state, dispatch); + }, + deleteColumn: () => ({ state, dispatch }) => { + return deleteColumn(state, dispatch); + }, + addRowBefore: () => ({ state, dispatch }) => { + return addRowBefore(state, dispatch); + }, + addRowAfter: () => ({ state, dispatch }) => { + return addRowAfter(state, dispatch); + }, + deleteRow: () => ({ state, dispatch }) => { + return deleteRow(state, dispatch); + }, + deleteTable: () => ({ state, dispatch }) => { + return deleteTable(state, dispatch); + }, + mergeCells: () => ({ state, dispatch }) => { + return mergeCells(state, dispatch); + }, + splitCell: () => ({ state, dispatch }) => { + return splitCell(state, dispatch); + }, + toggleHeaderColumn: () => ({ state, dispatch }) => { + return toggleHeader("column")(state, dispatch); + }, + toggleHeaderRow: () => ({ state, dispatch }) => { + return toggleHeader("row")(state, dispatch); + }, + toggleHeaderCell: () => ({ state, dispatch }) => { + return toggleHeaderCell(state, dispatch); + }, + mergeOrSplit: () => ({ state, dispatch }) => { + if (mergeCells(state, dispatch)) { + return true; + } + return splitCell(state, dispatch); + }, + setCellAttribute: (name, value) => ({ state, dispatch }) => { + return setCellAttr(name, value)(state, dispatch); + }, + goToNextCell: () => ({ state, dispatch }) => { + return goToNextCell(1)(state, dispatch); + }, + goToPreviousCell: () => ({ state, dispatch }) => { + return goToNextCell(-1)(state, dispatch); + }, + fixTables: () => ({ state, dispatch }) => { + if (dispatch) { + fixTables(state); + } + return true; + }, + setCellSelection: (position) => ({ tr: tr2, dispatch }) => { + if (dispatch) { + const selection = CellSelection.create(tr2.doc, position.anchorCell, position.headCell); + tr2.setSelection(selection); + } + return true; + } + }; + }, + addKeyboardShortcuts() { + return { + Tab: () => { + if (this.editor.commands.goToNextCell()) { + return true; + } + if (!this.editor.can().addRowAfter()) { + return false; + } + return this.editor.chain().addRowAfter().goToNextCell().run(); + }, + "Shift-Tab": () => this.editor.commands.goToPreviousCell(), + Backspace: deleteTableWhenAllCellsSelected, + "Mod-Backspace": deleteTableWhenAllCellsSelected, + Delete: deleteTableWhenAllCellsSelected, + "Mod-Delete": deleteTableWhenAllCellsSelected + }; + }, + addProseMirrorPlugins() { + const isResizable = this.options.resizable && this.editor.isEditable; + return [ + ...isResizable ? [ + columnResizing({ + handleWidth: this.options.handleWidth, + cellMinWidth: this.options.cellMinWidth, + // @ts-ignore (incorrect type) + View: this.options.View, + // TODO: PR for @types/prosemirror-tables + // @ts-ignore (incorrect type) + lastColumnResizable: this.options.lastColumnResizable + }) + ] : [], + tableEditing({ + allowTableNodeSelection: this.options.allowTableNodeSelection + }) + ]; + }, + extendNodeSchema(extension) { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + return { + tableRole: callOrReturn(getExtensionField(extension, "tableRole", context)) + }; + } +}); + +// node_modules/@tiptap/extension-table-cell/dist/index.js +var TableCell = Node2.create({ + name: "tableCell", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + content: "block+", + addAttributes() { + return { + colspan: { + default: 1 + }, + rowspan: { + default: 1 + }, + colwidth: { + default: null, + parseHTML: (element) => { + const colwidth = element.getAttribute("colwidth"); + const value = colwidth ? [parseInt(colwidth, 10)] : null; + return value; + } + } + }; + }, + tableRole: "cell", + isolating: true, + parseHTML() { + return [ + { tag: "td" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["td", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + } +}); + +// node_modules/@tiptap/extension-table-header/dist/index.js +var TableHeader = Node2.create({ + name: "tableHeader", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + content: "block+", + addAttributes() { + return { + colspan: { + default: 1 + }, + rowspan: { + default: 1 + }, + colwidth: { + default: null, + parseHTML: (element) => { + const colwidth = element.getAttribute("colwidth"); + const value = colwidth ? [parseInt(colwidth, 10)] : null; + return value; + } + } + }; + }, + tableRole: "header_cell", + isolating: true, + parseHTML() { + return [ + { tag: "th" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["th", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + } +}); + +// node_modules/@tiptap/extension-table-row/dist/index.js +var TableRow = Node2.create({ + name: "tableRow", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + content: "(tableCell | tableHeader)*", + tableRole: "row", + parseHTML() { + return [ + { tag: "tr" } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["tr", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + } +}); + +// node_modules/@tiptap/extension-text/dist/index.js +var Text = Node2.create({ + name: "text", + group: "inline" +}); + +// node_modules/@tiptap/extension-underline/dist/index.js +var Underline = Mark2.create({ + name: "underline", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "u" + }, + { + style: "text-decoration", + consuming: false, + getAttrs: (style2) => style2.includes("underline") ? {} : false + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["u", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setUnderline: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleUnderline: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetUnderline: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-u": () => this.editor.commands.toggleUnderline(), + "Mod-U": () => this.editor.commands.toggleUnderline() + }; + } +}); + +// node_modules/@tiptap/extension-highlight/dist/index.js +var inputRegex6 = /(?:^|\s)((?:==)((?:[^~=]+))(?:==))$/; +var pasteRegex3 = /(?:^|\s)((?:==)((?:[^~=]+))(?:==))/g; +var Highlight = Mark2.create({ + name: "highlight", + addOptions() { + return { + multicolor: false, + HTMLAttributes: {} + }; + }, + addAttributes() { + if (!this.options.multicolor) { + return {}; + } + return { + color: { + default: null, + parseHTML: (element) => element.getAttribute("data-color") || element.style.backgroundColor, + renderHTML: (attributes) => { + if (!attributes.color) { + return {}; + } + return { + "data-color": attributes.color, + style: `background-color: ${attributes.color}; color: inherit` + }; + } + } + }; + }, + parseHTML() { + return [ + { + tag: "mark" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["mark", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setHighlight: (attributes) => ({ commands: commands2 }) => { + return commands2.setMark(this.name, attributes); + }, + toggleHighlight: (attributes) => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name, attributes); + }, + unsetHighlight: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Shift-h": () => this.editor.commands.toggleHighlight() + }; + }, + addInputRules() { + return [ + markInputRule({ + find: inputRegex6, + type: this.type + }) + ]; + }, + addPasteRules() { + return [ + markPasteRule({ + find: pasteRegex3, + type: this.type + }) + ]; + } +}); + +// resources/js/extensions/CheckedList.js +var CheckedList = Node2.create({ + name: "checkedList", + priority: 50, + addOptions() { + return { + itemTypeName: "listItem", + HTMLAttributes: { + class: "checked-list" + } + }; + }, + group: "block list", + content() { + return `${this.options.itemTypeName}+`; + }, + parseHTML() { + return [{ tag: "ul", getAttrs: (element) => element.classList.contains("checked-list"), priority: 1e3 }]; + }, + renderHTML({ HTMLAttributes }) { + return ["ul", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + toggleCheckedList: () => ({ commands: commands2 }) => { + return commands2.toggleList(this.name, this.options.itemTypeName); + } + }; + } +}); + +// resources/js/extensions/Lead.js +var Lead = Node2.create({ + name: "lead", + group: "block", + content: "block+", + addOptions() { + return { + HTMLAttributes: { + class: "lead" + } + }; + }, + parseHTML() { + return [ + { + tag: "div", + getAttrs: (element) => element.classList.contains("lead") + } + ]; + }, + renderHTML({ node, HTMLAttributes }) { + return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + toggleLead: () => ({ commands: commands2 }) => { + return commands2.toggleWrap(this.name); + } + }; + } +}); + +// node_modules/linkifyjs/dist/linkify.es.js +var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4vianca6w0s2x0a2z0ure5ba0by2idu3namex3narepublic11d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2ntley5rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0cast4mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dabur3d1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0ardian6cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6logistics9properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3ncaster6d0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2psy3ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2tura4vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9dnavy5lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0america6xi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0a1b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp2w2ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4finity6ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2"; +var encodedUtlds = "\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2"; +var assign = (target, properties) => { + for (const key in properties) { + target[key] = properties[key]; + } + return target; +}; +var numeric = "numeric"; +var ascii = "ascii"; +var alpha = "alpha"; +var asciinumeric = "asciinumeric"; +var alphanumeric = "alphanumeric"; +var domain = "domain"; +var emoji = "emoji"; +var scheme = "scheme"; +var slashscheme = "slashscheme"; +var whitespace = "whitespace"; +function registerGroup(name, groups) { + if (!(name in groups)) { + groups[name] = []; + } + return groups[name]; +} +function addToGroups(t, flags, groups) { + if (flags[numeric]) { + flags[asciinumeric] = true; + flags[alphanumeric] = true; + } + if (flags[ascii]) { + flags[asciinumeric] = true; + flags[alpha] = true; + } + if (flags[asciinumeric]) { + flags[alphanumeric] = true; + } + if (flags[alpha]) { + flags[alphanumeric] = true; + } + if (flags[alphanumeric]) { + flags[domain] = true; + } + if (flags[emoji]) { + flags[domain] = true; + } + for (const k in flags) { + const group = registerGroup(k, groups); + if (group.indexOf(t) < 0) { + group.push(t); + } + } +} +function flagsForToken(t, groups) { + const result = {}; + for (const c2 in groups) { + if (groups[c2].indexOf(t) >= 0) { + result[c2] = true; + } + } + return result; +} +function State(token) { + if (token === void 0) { + token = null; + } + this.j = {}; + this.jr = []; + this.jd = null; + this.t = token; +} +State.groups = {}; +State.prototype = { + accepts() { + return !!this.t; + }, + /** + * Follow an existing transition from the given input to the next state. + * Does not mutate. + * @param {string} input character or token type to transition on + * @returns {?State} the next state, if any + */ + go(input) { + const state = this; + const nextState = state.j[input]; + if (nextState) { + return nextState; + } + for (let i = 0; i < state.jr.length; i++) { + const regex = state.jr[i][0]; + const nextState2 = state.jr[i][1]; + if (nextState2 && regex.test(input)) { + return nextState2; + } + } + return state.jd; + }, + /** + * Whether the state has a transition for the given input. Set the second + * argument to true to only look for an exact match (and not a default or + * regular-expression-based transition) + * @param {string} input + * @param {boolean} exactOnly + */ + has(input, exactOnly) { + if (exactOnly === void 0) { + exactOnly = false; + } + return exactOnly ? input in this.j : !!this.go(input); + }, + /** + * Short for "transition all"; create a transition from the array of items + * in the given list to the same final resulting state. + * @param {string | string[]} inputs Group of inputs to transition on + * @param {Transition | State} [next] Transition options + * @param {Flags} [flags] Collections flags to add token to + * @param {Collections} [groups] Master list of token groups + */ + ta(inputs, next, flags, groups) { + for (let i = 0; i < inputs.length; i++) { + this.tt(inputs[i], next, flags, groups); + } + }, + /** + * Short for "take regexp transition"; defines a transition for this state + * when it encounters a token which matches the given regular expression + * @param {RegExp} regexp Regular expression transition (populate first) + * @param {T | State} [next] Transition options + * @param {Flags} [flags] Collections flags to add token to + * @param {Collections} [groups] Master list of token groups + * @returns {State} taken after the given input + */ + tr(regexp, next, flags, groups) { + groups = groups || State.groups; + let nextState; + if (next && next.j) { + nextState = next; + } else { + nextState = new State(next); + if (flags && groups) { + addToGroups(next, flags, groups); + } + } + this.jr.push([regexp, nextState]); + return nextState; + }, + /** + * Short for "take transitions", will take as many sequential transitions as + * the length of the given input and returns the + * resulting final state. + * @param {string | string[]} input + * @param {T | State} [next] Transition options + * @param {Flags} [flags] Collections flags to add token to + * @param {Collections} [groups] Master list of token groups + * @returns {State} taken after the given input + */ + ts(input, next, flags, groups) { + let state = this; + const len = input.length; + if (!len) { + return state; + } + for (let i = 0; i < len - 1; i++) { + state = state.tt(input[i]); + } + return state.tt(input[len - 1], next, flags, groups); + }, + /** + * Short for "take transition", this is a method for building/working with + * state machines. + * + * If a state already exists for the given input, returns it. + * + * If a token is specified, that state will emit that token when reached by + * the linkify engine. + * + * If no state exists, it will be initialized with some default transitions + * that resemble existing default transitions. + * + * If a state is given for the second argument, that state will be + * transitioned to on the given input regardless of what that input + * previously did. + * + * Specify a token group flags to define groups that this token belongs to. + * The token will be added to corresponding entires in the given groups + * object. + * + * @param {string} input character, token type to transition on + * @param {T | State} [next] Transition options + * @param {Flags} [flags] Collections flags to add token to + * @param {Collections} [groups] Master list of groups + * @returns {State} taken after the given input + */ + tt(input, next, flags, groups) { + groups = groups || State.groups; + const state = this; + if (next && next.j) { + state.j[input] = next; + return next; + } + const t = next; + let nextState, templateState = state.go(input); + if (templateState) { + nextState = new State(); + assign(nextState.j, templateState.j); + nextState.jr.push.apply(nextState.jr, templateState.jr); + nextState.jd = templateState.jd; + nextState.t = templateState.t; + } else { + nextState = new State(); + } + if (t) { + if (groups) { + if (nextState.t && typeof nextState.t === "string") { + const allFlags = assign(flagsForToken(nextState.t, groups), flags); + addToGroups(t, allFlags, groups); + } else if (flags) { + addToGroups(t, flags, groups); + } + } + nextState.t = t; + } + state.j[input] = nextState; + return nextState; + } +}; +var ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups); +var tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups); +var ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups); +var tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups); +var WORD = "WORD"; +var UWORD = "UWORD"; +var LOCALHOST = "LOCALHOST"; +var TLD = "TLD"; +var UTLD = "UTLD"; +var SCHEME = "SCHEME"; +var SLASH_SCHEME = "SLASH_SCHEME"; +var NUM = "NUM"; +var WS = "WS"; +var NL$1 = "NL"; +var OPENBRACE = "OPENBRACE"; +var CLOSEBRACE = "CLOSEBRACE"; +var OPENBRACKET = "OPENBRACKET"; +var CLOSEBRACKET = "CLOSEBRACKET"; +var OPENPAREN = "OPENPAREN"; +var CLOSEPAREN = "CLOSEPAREN"; +var OPENANGLEBRACKET = "OPENANGLEBRACKET"; +var CLOSEANGLEBRACKET = "CLOSEANGLEBRACKET"; +var FULLWIDTHLEFTPAREN = "FULLWIDTHLEFTPAREN"; +var FULLWIDTHRIGHTPAREN = "FULLWIDTHRIGHTPAREN"; +var LEFTCORNERBRACKET = "LEFTCORNERBRACKET"; +var RIGHTCORNERBRACKET = "RIGHTCORNERBRACKET"; +var LEFTWHITECORNERBRACKET = "LEFTWHITECORNERBRACKET"; +var RIGHTWHITECORNERBRACKET = "RIGHTWHITECORNERBRACKET"; +var FULLWIDTHLESSTHAN = "FULLWIDTHLESSTHAN"; +var FULLWIDTHGREATERTHAN = "FULLWIDTHGREATERTHAN"; +var AMPERSAND = "AMPERSAND"; +var APOSTROPHE = "APOSTROPHE"; +var ASTERISK = "ASTERISK"; +var AT = "AT"; +var BACKSLASH = "BACKSLASH"; +var BACKTICK = "BACKTICK"; +var CARET = "CARET"; +var COLON = "COLON"; +var COMMA = "COMMA"; +var DOLLAR = "DOLLAR"; +var DOT = "DOT"; +var EQUALS = "EQUALS"; +var EXCLAMATION = "EXCLAMATION"; +var HYPHEN = "HYPHEN"; +var PERCENT = "PERCENT"; +var PIPE = "PIPE"; +var PLUS = "PLUS"; +var POUND = "POUND"; +var QUERY = "QUERY"; +var QUOTE = "QUOTE"; +var SEMI = "SEMI"; +var SLASH = "SLASH"; +var TILDE = "TILDE"; +var UNDERSCORE = "UNDERSCORE"; +var EMOJI$1 = "EMOJI"; +var SYM = "SYM"; +var tk = /* @__PURE__ */ Object.freeze({ + __proto__: null, + WORD, + UWORD, + LOCALHOST, + TLD, + UTLD, + SCHEME, + SLASH_SCHEME, + NUM, + WS, + NL: NL$1, + OPENBRACE, + CLOSEBRACE, + OPENBRACKET, + CLOSEBRACKET, + OPENPAREN, + CLOSEPAREN, + OPENANGLEBRACKET, + CLOSEANGLEBRACKET, + FULLWIDTHLEFTPAREN, + FULLWIDTHRIGHTPAREN, + LEFTCORNERBRACKET, + RIGHTCORNERBRACKET, + LEFTWHITECORNERBRACKET, + RIGHTWHITECORNERBRACKET, + FULLWIDTHLESSTHAN, + FULLWIDTHGREATERTHAN, + AMPERSAND, + APOSTROPHE, + ASTERISK, + AT, + BACKSLASH, + BACKTICK, + CARET, + COLON, + COMMA, + DOLLAR, + DOT, + EQUALS, + EXCLAMATION, + HYPHEN, + PERCENT, + PIPE, + PLUS, + POUND, + QUERY, + QUOTE, + SEMI, + SLASH, + TILDE, + UNDERSCORE, + EMOJI: EMOJI$1, + SYM +}); +var ASCII_LETTER = /[a-z]/; +var LETTER = /\p{L}/u; +var EMOJI = /\p{Emoji}/u; +var DIGIT = /\d/; +var SPACE = /\s/; +var NL = "\n"; +var EMOJI_VARIATION = "\uFE0F"; +var EMOJI_JOINER = "\u200D"; +var tlds = null; +var utlds = null; +function init$2(customSchemes) { + if (customSchemes === void 0) { + customSchemes = []; + } + const groups = {}; + State.groups = groups; + const Start = new State(); + if (tlds == null) { + tlds = decodeTlds(encodedTlds); + } + if (utlds == null) { + utlds = decodeTlds(encodedUtlds); + } + tt(Start, "'", APOSTROPHE); + tt(Start, "{", OPENBRACE); + tt(Start, "}", CLOSEBRACE); + tt(Start, "[", OPENBRACKET); + tt(Start, "]", CLOSEBRACKET); + tt(Start, "(", OPENPAREN); + tt(Start, ")", CLOSEPAREN); + tt(Start, "<", OPENANGLEBRACKET); + tt(Start, ">", CLOSEANGLEBRACKET); + tt(Start, "\uFF08", FULLWIDTHLEFTPAREN); + tt(Start, "\uFF09", FULLWIDTHRIGHTPAREN); + tt(Start, "\u300C", LEFTCORNERBRACKET); + tt(Start, "\u300D", RIGHTCORNERBRACKET); + tt(Start, "\u300E", LEFTWHITECORNERBRACKET); + tt(Start, "\u300F", RIGHTWHITECORNERBRACKET); + tt(Start, "\uFF1C", FULLWIDTHLESSTHAN); + tt(Start, "\uFF1E", FULLWIDTHGREATERTHAN); + tt(Start, "&", AMPERSAND); + tt(Start, "*", ASTERISK); + tt(Start, "@", AT); + tt(Start, "`", BACKTICK); + tt(Start, "^", CARET); + tt(Start, ":", COLON); + tt(Start, ",", COMMA); + tt(Start, "$", DOLLAR); + tt(Start, ".", DOT); + tt(Start, "=", EQUALS); + tt(Start, "!", EXCLAMATION); + tt(Start, "-", HYPHEN); + tt(Start, "%", PERCENT); + tt(Start, "|", PIPE); + tt(Start, "+", PLUS); + tt(Start, "#", POUND); + tt(Start, "?", QUERY); + tt(Start, '"', QUOTE); + tt(Start, "/", SLASH); + tt(Start, ";", SEMI); + tt(Start, "~", TILDE); + tt(Start, "_", UNDERSCORE); + tt(Start, "\\", BACKSLASH); + const Num = tr(Start, DIGIT, NUM, { + [numeric]: true + }); + tr(Num, DIGIT, Num); + const Word = tr(Start, ASCII_LETTER, WORD, { + [ascii]: true + }); + tr(Word, ASCII_LETTER, Word); + const UWord = tr(Start, LETTER, UWORD, { + [alpha]: true + }); + tr(UWord, ASCII_LETTER); + tr(UWord, LETTER, UWord); + const Ws = tr(Start, SPACE, WS, { + [whitespace]: true + }); + tt(Start, NL, NL$1, { + [whitespace]: true + }); + tt(Ws, NL); + tr(Ws, SPACE, Ws); + const Emoji = tr(Start, EMOJI, EMOJI$1, { + [emoji]: true + }); + tr(Emoji, EMOJI, Emoji); + tt(Emoji, EMOJI_VARIATION, Emoji); + const EmojiJoiner = tt(Emoji, EMOJI_JOINER); + tr(EmojiJoiner, EMOJI, Emoji); + const wordjr = [[ASCII_LETTER, Word]]; + const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord]]; + for (let i = 0; i < tlds.length; i++) { + fastts(Start, tlds[i], TLD, WORD, wordjr); + } + for (let i = 0; i < utlds.length; i++) { + fastts(Start, utlds[i], UTLD, UWORD, uwordjr); + } + addToGroups(TLD, { + tld: true, + ascii: true + }, groups); + addToGroups(UTLD, { + utld: true, + alpha: true + }, groups); + fastts(Start, "file", SCHEME, WORD, wordjr); + fastts(Start, "mailto", SCHEME, WORD, wordjr); + fastts(Start, "http", SLASH_SCHEME, WORD, wordjr); + fastts(Start, "https", SLASH_SCHEME, WORD, wordjr); + fastts(Start, "ftp", SLASH_SCHEME, WORD, wordjr); + fastts(Start, "ftps", SLASH_SCHEME, WORD, wordjr); + addToGroups(SCHEME, { + scheme: true, + ascii: true + }, groups); + addToGroups(SLASH_SCHEME, { + slashscheme: true, + ascii: true + }, groups); + customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1); + for (let i = 0; i < customSchemes.length; i++) { + const sch = customSchemes[i][0]; + const optionalSlashSlash = customSchemes[i][1]; + const flags = optionalSlashSlash ? { + [scheme]: true + } : { + [slashscheme]: true + }; + if (sch.indexOf("-") >= 0) { + flags[domain] = true; + } else if (!ASCII_LETTER.test(sch)) { + flags[numeric] = true; + } else if (DIGIT.test(sch)) { + flags[asciinumeric] = true; + } else { + flags[ascii] = true; + } + ts(Start, sch, sch, flags); + } + ts(Start, "localhost", LOCALHOST, { + ascii: true + }); + Start.jd = new State(SYM); + return { + start: Start, + tokens: assign({ + groups + }, tk) + }; +} +function run$12(start2, str) { + const iterable = stringToArray(str.replace(/[A-Z]/g, (c2) => c2.toLowerCase())); + const charCount = iterable.length; + const tokens = []; + let cursor = 0; + let charCursor = 0; + while (charCursor < charCount) { + let state = start2; + let nextState = null; + let tokenLength = 0; + let latestAccepting = null; + let sinceAccepts = -1; + let charsSinceAccepts = -1; + while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) { + state = nextState; + if (state.accepts()) { + sinceAccepts = 0; + charsSinceAccepts = 0; + latestAccepting = state; + } else if (sinceAccepts >= 0) { + sinceAccepts += iterable[charCursor].length; + charsSinceAccepts++; + } + tokenLength += iterable[charCursor].length; + cursor += iterable[charCursor].length; + charCursor++; + } + cursor -= sinceAccepts; + charCursor -= charsSinceAccepts; + tokenLength -= sinceAccepts; + tokens.push({ + t: latestAccepting.t, + // token type/name + v: str.slice(cursor - tokenLength, cursor), + // string value + s: cursor - tokenLength, + // start index + e: cursor + // end index (excluding) + }); + } + return tokens; +} +function stringToArray(str) { + const result = []; + const len = str.length; + let index = 0; + while (index < len) { + let first2 = str.charCodeAt(index); + let second; + let char = first2 < 55296 || first2 > 56319 || index + 1 === len || (second = str.charCodeAt(index + 1)) < 56320 || second > 57343 ? str[index] : str.slice(index, index + 2); + result.push(char); + index += char.length; + } + return result; +} +function fastts(state, input, t, defaultt, jr) { + let next; + const len = input.length; + for (let i = 0; i < len - 1; i++) { + const char = input[i]; + if (state.j[char]) { + next = state.j[char]; + } else { + next = new State(defaultt); + next.jr = jr.slice(); + state.j[char] = next; + } + state = next; + } + next = new State(t); + next.jr = jr.slice(); + state.j[input[len - 1]] = next; + return next; +} +function decodeTlds(encoded) { + const words = []; + const stack = []; + let i = 0; + let digits = "0123456789"; + while (i < encoded.length) { + let popDigitCount = 0; + while (digits.indexOf(encoded[i + popDigitCount]) >= 0) { + popDigitCount++; + } + if (popDigitCount > 0) { + words.push(stack.join("")); + for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) { + stack.pop(); + } + i += popDigitCount; + } else { + stack.push(encoded[i]); + i++; + } + } + return words; +} +var defaults = { + defaultProtocol: "http", + events: null, + format: noop, + formatHref: noop, + nl2br: false, + tagName: "a", + target: null, + rel: null, + validate: true, + truncate: Infinity, + className: null, + attributes: null, + ignoreTags: [], + render: null +}; +function Options(opts, defaultRender) { + if (defaultRender === void 0) { + defaultRender = null; + } + let o = assign({}, defaults); + if (opts) { + o = assign(o, opts instanceof Options ? opts.o : opts); + } + const ignoredTags = o.ignoreTags; + const uppercaseIgnoredTags = []; + for (let i = 0; i < ignoredTags.length; i++) { + uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase()); + } + this.o = o; + if (defaultRender) { + this.defaultRender = defaultRender; + } + this.ignoreTags = uppercaseIgnoredTags; +} +Options.prototype = { + o: defaults, + /** + * @type string[] + */ + ignoreTags: [], + /** + * @param {IntermediateRepresentation} ir + * @returns {any} + */ + defaultRender(ir) { + return ir; + }, + /** + * Returns true or false based on whether a token should be displayed as a + * link based on the user options. + * @param {MultiToken} token + * @returns {boolean} + */ + check(token) { + return this.get("validate", token.toString(), token); + }, + // Private methods + /** + * Resolve an option's value based on the value of the option and the given + * params. If operator and token are specified and the target option is + * callable, automatically calls the function with the given argument. + * @template {keyof Opts} K + * @param {K} key Name of option to use + * @param {string} [operator] will be passed to the target option if it's a + * function. If not specified, RAW function value gets returned + * @param {MultiToken} [token] The token from linkify.tokenize + * @returns {Opts[K] | any} + */ + get(key, operator2, token) { + const isCallable = operator2 != null; + let option = this.o[key]; + if (!option) { + return option; + } + if (typeof option === "object") { + option = token.t in option ? option[token.t] : defaults[key]; + if (typeof option === "function" && isCallable) { + option = option(operator2, token); + } + } else if (typeof option === "function" && isCallable) { + option = option(operator2, token.t, token); + } + return option; + }, + /** + * @template {keyof Opts} L + * @param {L} key Name of options object to use + * @param {string} [operator] + * @param {MultiToken} [token] + * @returns {Opts[L] | any} + */ + getObj(key, operator2, token) { + let obj = this.o[key]; + if (typeof obj === "function" && operator2 != null) { + obj = obj(operator2, token.t, token); + } + return obj; + }, + /** + * Convert the given token to a rendered element that may be added to the + * calling-interface's DOM + * @param {MultiToken} token Token to render to an HTML element + * @returns {any} Render result; e.g., HTML string, DOM element, React + * Component, etc. + */ + render(token) { + const ir = token.render(this); + const renderFn = this.get("render", null, token) || this.defaultRender; + return renderFn(ir, token.t, token); + } +}; +function noop(val) { + return val; +} +function MultiToken(value, tokens) { + this.t = "token"; + this.v = value; + this.tk = tokens; +} +MultiToken.prototype = { + isLink: false, + /** + * Return the string this token represents. + * @return {string} + */ + toString() { + return this.v; + }, + /** + * What should the value for this token be in the `href` HTML attribute? + * Returns the `.toString` value by default. + * @param {string} [scheme] + * @return {string} + */ + toHref(scheme2) { + return this.toString(); + }, + /** + * @param {Options} options Formatting options + * @returns {string} + */ + toFormattedString(options) { + const val = this.toString(); + const truncate = options.get("truncate", val, this); + const formatted = options.get("format", val, this); + return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + "\u2026" : formatted; + }, + /** + * + * @param {Options} options + * @returns {string} + */ + toFormattedHref(options) { + return options.get("formatHref", this.toHref(options.get("defaultProtocol")), this); + }, + /** + * The start index of this token in the original input string + * @returns {number} + */ + startIndex() { + return this.tk[0].s; + }, + /** + * The end index of this token in the original input string (up to this + * index but not including it) + * @returns {number} + */ + endIndex() { + return this.tk[this.tk.length - 1].e; + }, + /** + Returns an object of relevant values for this token, which includes keys + * type - Kind of token ('url', 'email', etc.) + * value - Original text + * href - The value that should be added to the anchor tag's href + attribute + @method toObject + @param {string} [protocol] `'http'` by default + */ + toObject(protocol) { + if (protocol === void 0) { + protocol = defaults.defaultProtocol; + } + return { + type: this.t, + value: this.toString(), + isLink: this.isLink, + href: this.toHref(protocol), + start: this.startIndex(), + end: this.endIndex() + }; + }, + /** + * + * @param {Options} options Formatting option + */ + toFormattedObject(options) { + return { + type: this.t, + value: this.toFormattedString(options), + isLink: this.isLink, + href: this.toFormattedHref(options), + start: this.startIndex(), + end: this.endIndex() + }; + }, + /** + * Whether this token should be rendered as a link according to the given options + * @param {Options} options + * @returns {boolean} + */ + validate(options) { + return options.get("validate", this.toString(), this); + }, + /** + * Return an object that represents how this link should be rendered. + * @param {Options} options Formattinng options + */ + render(options) { + const token = this; + const href = this.toHref(options.get("defaultProtocol")); + const formattedHref = options.get("formatHref", href, this); + const tagName = options.get("tagName", href, token); + const content = this.toFormattedString(options); + const attributes = {}; + const className = options.get("className", href, token); + const target = options.get("target", href, token); + const rel = options.get("rel", href, token); + const attrs = options.getObj("attributes", href, token); + const eventListeners = options.getObj("events", href, token); + attributes.href = formattedHref; + if (className) { + attributes.class = className; + } + if (target) { + attributes.target = target; + } + if (rel) { + attributes.rel = rel; + } + if (attrs) { + assign(attributes, attrs); + } + return { + tagName, + attributes, + content, + eventListeners + }; + } +}; +function createTokenClass(type, props) { + class Token extends MultiToken { + constructor(value, tokens) { + super(value, tokens); + this.t = type; + } + } + for (const p in props) { + Token.prototype[p] = props[p]; + } + Token.t = type; + return Token; +} +var Email = createTokenClass("email", { + isLink: true, + toHref() { + return "mailto:" + this.toString(); + } +}); +var Text2 = createTokenClass("text"); +var Nl = createTokenClass("nl"); +var Url = createTokenClass("url", { + isLink: true, + /** + Lowercases relevant parts of the domain and adds the protocol if + required. Note that this will not escape unsafe HTML characters in the + URL. + @param {string} [scheme] default scheme (e.g., 'https') + @return {string} the full href + */ + toHref(scheme2) { + if (scheme2 === void 0) { + scheme2 = defaults.defaultProtocol; + } + return this.hasProtocol() ? this.v : `${scheme2}://${this.v}`; + }, + /** + * Check whether this URL token has a protocol + * @return {boolean} + */ + hasProtocol() { + const tokens = this.tk; + return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON; + } +}); +var makeState = (arg) => new State(arg); +function init$1(_ref) { + let { + groups + } = _ref; + const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]); + const qsNonAccepting = [APOSTROPHE, COLON, COMMA, DOT, EXCLAMATION, QUERY, QUOTE, SEMI, OPENANGLEBRACKET, CLOSEANGLEBRACKET, OPENBRACE, CLOSEBRACE, CLOSEBRACKET, OPENBRACKET, OPENPAREN, CLOSEPAREN, FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN, LEFTCORNERBRACKET, RIGHTCORNERBRACKET, LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET, FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN]; + const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, OPENBRACE, CLOSEBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE]; + const Start = makeState(); + const Localpart = tt(Start, TILDE); + ta(Localpart, localpartAccepting, Localpart); + ta(Localpart, groups.domain, Localpart); + const Domain = makeState(), Scheme = makeState(), SlashScheme = makeState(); + ta(Start, groups.domain, Domain); + ta(Start, groups.scheme, Scheme); + ta(Start, groups.slashscheme, SlashScheme); + ta(Domain, localpartAccepting, Localpart); + ta(Domain, groups.domain, Domain); + const LocalpartAt = tt(Domain, AT); + tt(Localpart, AT, LocalpartAt); + tt(Scheme, AT, LocalpartAt); + tt(SlashScheme, AT, LocalpartAt); + const LocalpartDot = tt(Localpart, DOT); + ta(LocalpartDot, localpartAccepting, Localpart); + ta(LocalpartDot, groups.domain, Localpart); + const EmailDomain = makeState(); + ta(LocalpartAt, groups.domain, EmailDomain); + ta(EmailDomain, groups.domain, EmailDomain); + const EmailDomainDot = tt(EmailDomain, DOT); + ta(EmailDomainDot, groups.domain, EmailDomain); + const Email$1 = makeState(Email); + ta(EmailDomainDot, groups.tld, Email$1); + ta(EmailDomainDot, groups.utld, Email$1); + tt(LocalpartAt, LOCALHOST, Email$1); + const EmailDomainHyphen = tt(EmailDomain, HYPHEN); + ta(EmailDomainHyphen, groups.domain, EmailDomain); + ta(Email$1, groups.domain, EmailDomain); + tt(Email$1, DOT, EmailDomainDot); + tt(Email$1, HYPHEN, EmailDomainHyphen); + const EmailColon = tt(Email$1, COLON); + ta(EmailColon, groups.numeric, Email); + const DomainHyphen = tt(Domain, HYPHEN); + const DomainDot = tt(Domain, DOT); + ta(DomainHyphen, groups.domain, Domain); + ta(DomainDot, localpartAccepting, Localpart); + ta(DomainDot, groups.domain, Domain); + const DomainDotTld = makeState(Url); + ta(DomainDot, groups.tld, DomainDotTld); + ta(DomainDot, groups.utld, DomainDotTld); + ta(DomainDotTld, groups.domain, Domain); + ta(DomainDotTld, localpartAccepting, Localpart); + tt(DomainDotTld, DOT, DomainDot); + tt(DomainDotTld, HYPHEN, DomainHyphen); + tt(DomainDotTld, AT, LocalpartAt); + const DomainDotTldColon = tt(DomainDotTld, COLON); + const DomainDotTldColonPort = makeState(Url); + ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort); + const Url$1 = makeState(Url); + const UrlNonaccept = makeState(); + ta(Url$1, qsAccepting, Url$1); + ta(Url$1, qsNonAccepting, UrlNonaccept); + ta(UrlNonaccept, qsAccepting, Url$1); + ta(UrlNonaccept, qsNonAccepting, UrlNonaccept); + tt(DomainDotTld, SLASH, Url$1); + tt(DomainDotTldColonPort, SLASH, Url$1); + const SchemeColon = tt(Scheme, COLON); + const SlashSchemeColon = tt(SlashScheme, COLON); + const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH); + const UriPrefix = tt(SlashSchemeColonSlash, SLASH); + ta(Scheme, groups.domain, Domain); + tt(Scheme, DOT, DomainDot); + tt(Scheme, HYPHEN, DomainHyphen); + ta(SlashScheme, groups.domain, Domain); + tt(SlashScheme, DOT, DomainDot); + tt(SlashScheme, HYPHEN, DomainHyphen); + ta(SchemeColon, groups.domain, Url$1); + tt(SchemeColon, SLASH, Url$1); + ta(UriPrefix, groups.domain, Url$1); + ta(UriPrefix, qsAccepting, Url$1); + tt(UriPrefix, SLASH, Url$1); + const bracketPairs = [ + [OPENBRACE, CLOSEBRACE], + // {} + [OPENBRACKET, CLOSEBRACKET], + // [] + [OPENPAREN, CLOSEPAREN], + // () + [OPENANGLEBRACKET, CLOSEANGLEBRACKET], + // <> + [FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN], + // () + [LEFTCORNERBRACKET, RIGHTCORNERBRACKET], + // 「」 + [LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET], + // 『』 + [FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN] + // <> + ]; + for (let i = 0; i < bracketPairs.length; i++) { + const [OPEN, CLOSE] = bracketPairs[i]; + const UrlOpen = tt(Url$1, OPEN); + tt(UrlNonaccept, OPEN, UrlOpen); + tt(UrlOpen, CLOSE, Url$1); + const UrlOpenQ = makeState(Url); + ta(UrlOpen, qsAccepting, UrlOpenQ); + const UrlOpenSyms = makeState(); + ta(UrlOpen, qsNonAccepting); + ta(UrlOpenQ, qsAccepting, UrlOpenQ); + ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms); + ta(UrlOpenSyms, qsAccepting, UrlOpenQ); + ta(UrlOpenSyms, qsNonAccepting, UrlOpenSyms); + tt(UrlOpenQ, CLOSE, Url$1); + tt(UrlOpenSyms, CLOSE, Url$1); + } + tt(Start, LOCALHOST, DomainDotTld); + tt(Start, NL$1, Nl); + return { + start: Start, + tokens: tk + }; +} +function run2(start2, input, tokens) { + let len = tokens.length; + let cursor = 0; + let multis = []; + let textTokens = []; + while (cursor < len) { + let state = start2; + let secondState = null; + let nextState = null; + let multiLength = 0; + let latestAccepting = null; + let sinceAccepts = -1; + while (cursor < len && !(secondState = state.go(tokens[cursor].t))) { + textTokens.push(tokens[cursor++]); + } + while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) { + secondState = null; + state = nextState; + if (state.accepts()) { + sinceAccepts = 0; + latestAccepting = state; + } else if (sinceAccepts >= 0) { + sinceAccepts++; + } + cursor++; + multiLength++; + } + if (sinceAccepts < 0) { + cursor -= multiLength; + if (cursor < len) { + textTokens.push(tokens[cursor]); + cursor++; + } + } else { + if (textTokens.length > 0) { + multis.push(initMultiToken(Text2, input, textTokens)); + textTokens = []; + } + cursor -= sinceAccepts; + multiLength -= sinceAccepts; + const Multi = latestAccepting.t; + const subtokens = tokens.slice(cursor - multiLength, cursor); + multis.push(initMultiToken(Multi, input, subtokens)); + } + } + if (textTokens.length > 0) { + multis.push(initMultiToken(Text2, input, textTokens)); + } + return multis; +} +function initMultiToken(Multi, input, tokens) { + const startIdx = tokens[0].s; + const endIdx = tokens[tokens.length - 1].e; + const value = input.slice(startIdx, endIdx); + return new Multi(value, tokens); +} +var warn = typeof console !== "undefined" && console && console.warn || (() => { +}); +var warnAdvice = "until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time."; +var INIT = { + scanner: null, + parser: null, + tokenQueue: [], + pluginQueue: [], + customSchemes: [], + initialized: false +}; +function reset() { + State.groups = {}; + INIT.scanner = null; + INIT.parser = null; + INIT.tokenQueue = []; + INIT.pluginQueue = []; + INIT.customSchemes = []; + INIT.initialized = false; +} +function registerCustomProtocol(scheme2, optionalSlashSlash) { + if (optionalSlashSlash === void 0) { + optionalSlashSlash = false; + } + if (INIT.initialized) { + warn(`linkifyjs: already initialized - will not register custom scheme "${scheme2}" ${warnAdvice}`); + } + if (!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(scheme2)) { + throw new Error(`linkifyjs: incorrect scheme format. +1. Must only contain digits, lowercase ASCII letters or "-" +2. Cannot start or end with "-" +3. "-" cannot repeat`); + } + INIT.customSchemes.push([scheme2, optionalSlashSlash]); +} +function init() { + INIT.scanner = init$2(INIT.customSchemes); + for (let i = 0; i < INIT.tokenQueue.length; i++) { + INIT.tokenQueue[i][1]({ + scanner: INIT.scanner + }); + } + INIT.parser = init$1(INIT.scanner.tokens); + for (let i = 0; i < INIT.pluginQueue.length; i++) { + INIT.pluginQueue[i][1]({ + scanner: INIT.scanner, + parser: INIT.parser + }); + } + INIT.initialized = true; +} +function tokenize(str) { + if (!INIT.initialized) { + init(); + } + return run2(INIT.parser.start, str, run$12(INIT.scanner.start, str)); +} +function find(str, type, opts) { + if (type === void 0) { + type = null; + } + if (opts === void 0) { + opts = null; + } + if (type && typeof type === "object") { + if (opts) { + throw Error(`linkifyjs: Invalid link type ${type}; must be a string`); + } + opts = type; + type = null; + } + const options = new Options(opts); + const tokens = tokenize(str); + const filtered = []; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + if (token.isLink && (!type || token.t === type) && options.check(token)) { + filtered.push(token.toFormattedObject(options)); + } + } + return filtered; +} + +// node_modules/@tiptap/extension-link/dist/index.js +function autolink(options) { + return new Plugin({ + key: new PluginKey("autolink"), + appendTransaction: (transactions, oldState, newState) => { + const docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc); + const preventAutolink = transactions.some((transaction) => transaction.getMeta("preventAutolink")); + if (!docChanges || preventAutolink) { + return; + } + const { tr: tr2 } = newState; + const transform = combineTransactionSteps(oldState.doc, [...transactions]); + const changes = getChangedRanges(transform); + changes.forEach(({ newRange }) => { + const nodesInChangedRanges = findChildrenInRange(newState.doc, newRange, (node) => node.isTextblock); + let textBlock; + let textBeforeWhitespace; + if (nodesInChangedRanges.length > 1) { + textBlock = nodesInChangedRanges[0]; + textBeforeWhitespace = newState.doc.textBetween(textBlock.pos, textBlock.pos + textBlock.node.nodeSize, void 0, " "); + } else if (nodesInChangedRanges.length && newState.doc.textBetween(newRange.from, newRange.to, " ", " ").endsWith(" ")) { + textBlock = nodesInChangedRanges[0]; + textBeforeWhitespace = newState.doc.textBetween(textBlock.pos, newRange.to, void 0, " "); + } + if (textBlock && textBeforeWhitespace) { + const wordsBeforeWhitespace = textBeforeWhitespace.split(" ").filter((s) => s !== ""); + if (wordsBeforeWhitespace.length <= 0) { + return false; + } + const lastWordBeforeSpace = wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1]; + const lastWordAndBlockOffset = textBlock.pos + textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace); + if (!lastWordBeforeSpace) { + return false; + } + find(lastWordBeforeSpace).filter((link) => link.isLink).map((link) => ({ + ...link, + from: lastWordAndBlockOffset + link.start + 1, + to: lastWordAndBlockOffset + link.end + 1 + })).filter((link) => { + if (!newState.schema.marks.code) { + return true; + } + return !newState.doc.rangeHasMark(link.from, link.to, newState.schema.marks.code); + }).filter((link) => { + if (options.validate) { + return options.validate(link.value); + } + return true; + }).forEach((link) => { + if (getMarksBetween(link.from, link.to, newState.doc).some((item) => item.mark.type === options.type)) { + return; + } + tr2.addMark(link.from, link.to, options.type.create({ + href: link.href + })); + }); + } + }); + if (!tr2.steps.length) { + return; + } + return tr2; + } + }); +} +function clickHandler(options) { + return new Plugin({ + key: new PluginKey("handleClickLink"), + props: { + handleClick: (view, pos, event) => { + var _a, _b; + if (event.button !== 0) { + return false; + } + const eventTarget = event.target; + if (eventTarget.nodeName !== "A") { + return false; + } + const attrs = getAttributes(view.state, options.type.name); + const link = event.target; + const href = (_a = link === null || link === void 0 ? void 0 : link.href) !== null && _a !== void 0 ? _a : attrs.href; + const target = (_b = link === null || link === void 0 ? void 0 : link.target) !== null && _b !== void 0 ? _b : attrs.target; + if (link && href) { + if (view.editable) { + window.open(href, target); + } + return true; + } + return false; + } + } + }); +} +function pasteHandler(options) { + return new Plugin({ + key: new PluginKey("handlePasteLink"), + props: { + handlePaste: (view, event, slice2) => { + var _a; + const { state } = view; + const { selection } = state; + const { empty: empty2 } = selection; + if (empty2) { + return false; + } + let textContent = ""; + slice2.content.forEach((node) => { + textContent += node.textContent; + }); + const link = find(textContent).find((item) => item.isLink && item.value === textContent); + if (!textContent || !link) { + return false; + } + const html = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData("text/html"); + const hrefRegex = /href="([^"]*)"/; + const existingLink = html === null || html === void 0 ? void 0 : html.match(hrefRegex); + const url = existingLink ? existingLink[1] : link.href; + options.editor.commands.setMark(options.type, { + href: url + }); + return true; + } + } + }); +} +var Link = Mark2.create({ + name: "link", + priority: 1e3, + keepOnSplit: false, + onCreate() { + this.options.protocols.forEach((protocol) => { + if (typeof protocol === "string") { + registerCustomProtocol(protocol); + return; + } + registerCustomProtocol(protocol.scheme, protocol.optionalSlashes); + }); + }, + onDestroy() { + reset(); + }, + inclusive() { + return this.options.autolink; + }, + addOptions() { + return { + openOnClick: true, + linkOnPaste: true, + autolink: true, + protocols: [], + HTMLAttributes: { + target: "_blank", + rel: "noopener noreferrer nofollow", + class: null + }, + validate: void 0 + }; + }, + addAttributes() { + return { + href: { + default: null + }, + target: { + default: this.options.HTMLAttributes.target + }, + rel: { + default: this.options.HTMLAttributes.rel + }, + class: { + default: this.options.HTMLAttributes.class + } + }; + }, + parseHTML() { + return [{ tag: 'a[href]:not([href *= "javascript:" i])' }]; + }, + renderHTML({ HTMLAttributes }) { + var _a; + if ((_a = HTMLAttributes.href) === null || _a === void 0 ? void 0 : _a.startsWith("javascript:")) { + return ["a", mergeAttributes(this.options.HTMLAttributes, { ...HTMLAttributes, href: "" }), 0]; + } + return ["a", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setLink: (attributes) => ({ chain }) => { + return chain().setMark(this.name, attributes).setMeta("preventAutolink", true).run(); + }, + toggleLink: (attributes) => ({ chain }) => { + return chain().toggleMark(this.name, attributes, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run(); + }, + unsetLink: () => ({ chain }) => { + return chain().unsetMark(this.name, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run(); + } + }; + }, + addPasteRules() { + return [ + markPasteRule({ + find: (text) => find(text).filter((link) => { + if (this.options.validate) { + return this.options.validate(link.value); + } + return true; + }).filter((link) => link.isLink).map((link) => ({ + text: link.value, + index: link.start, + data: link + })), + type: this.type, + getAttributes: (match, pasteEvent) => { + var _a, _b; + const html = (_a = pasteEvent === null || pasteEvent === void 0 ? void 0 : pasteEvent.clipboardData) === null || _a === void 0 ? void 0 : _a.getData("text/html"); + const hrefRegex = /href="([^"]*)"/; + const existingLink = html === null || html === void 0 ? void 0 : html.match(hrefRegex); + if (existingLink) { + return { + href: existingLink[1] + }; + } + return { + href: (_b = match.data) === null || _b === void 0 ? void 0 : _b.href + }; + } + }) + ]; + }, + addProseMirrorPlugins() { + const plugins = []; + if (this.options.autolink) { + plugins.push(autolink({ + type: this.type, + validate: this.options.validate + })); + } + if (this.options.openOnClick) { + plugins.push(clickHandler({ + type: this.type + })); + } + if (this.options.linkOnPaste) { + plugins.push(pasteHandler({ + editor: this.editor, + type: this.type + })); + } + return plugins; + } +}); + +// resources/js/extensions/Link.js +var CustomLink = Link.extend({ + addOptions() { + return { + openOnClick: true, + linkOnPaste: true, + autolink: true, + protocols: [], + HTMLAttributes: {}, + validate: void 0 + }; + }, + addAttributes() { + return { + href: { + default: null + }, + id: { + default: null + }, + target: { + default: this.options.HTMLAttributes.target + }, + hreflang: { + default: null + }, + rel: { + default: null + }, + referrerpolicy: { + default: null + }, + class: { + default: null + }, + as_button: { + default: null, + parseHTML: (element) => element.getAttribute("data-as-button"), + renderHTML: (attributes) => { + return { + "data-as-button": attributes.as_button + }; + } + }, + button_theme: { + default: null, + parseHTML: (element) => element.getAttribute("data-as-button-theme"), + renderHTML: (attributes) => { + return { + "data-as-button-theme": attributes.button_theme + }; + } + } + }; + } +}); + +// node_modules/@tiptap/extension-image/dist/index.js +var inputRegex7 = /(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/; +var Image = Node2.create({ + name: "image", + addOptions() { + return { + inline: false, + allowBase64: false, + HTMLAttributes: {} + }; + }, + inline() { + return this.options.inline; + }, + group() { + return this.options.inline ? "inline" : "block"; + }, + draggable: true, + addAttributes() { + return { + src: { + default: null + }, + alt: { + default: null + }, + title: { + default: null + } + }; + }, + parseHTML() { + return [ + { + tag: this.options.allowBase64 ? "img[src]" : 'img[src]:not([src^="data:"])' + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["img", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; + }, + addCommands() { + return { + setImage: (options) => ({ commands: commands2 }) => { + return commands2.insertContent({ + type: this.name, + attrs: options + }); + } + }; + }, + addInputRules() { + return [ + nodeInputRule({ + find: inputRegex7, + type: this.type, + getAttributes: (match) => { + const [, , alt, src, title] = match; + return { src, alt, title }; + } + }) + ]; + } +}); + +// resources/js/extensions/Image.js +var CustomImage = Image.extend({ + addAttributes() { + return { + src: { + default: null + }, + alt: { + default: null + }, + title: { + default: null + }, + width: { + default: null + }, + height: { + default: null + }, + lazy: { + default: null, + parseHTML: (element) => element.getAttribute("loading") === "lazy" ? element.getAttribute("data-lazy") : null, + renderHTML: (attributes) => { + if (attributes.lazy) { + return { + "data-lazy": attributes.lazy, + "loading": "lazy" + }; + } + } + } + }; + } +}); + +// resources/js/extensions/Paragraph.js +var CustomParagraph = Paragraph.extend({ + addAttributes() { + return { + class: { + default: null + } + }; + } +}); + +// resources/js/extensions/Small.js +var Small = Mark2.create({ + name: "small", + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "small" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["small", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setSmall: () => ({ commands: commands2 }) => { + return commands2.setMark(this.name); + }, + toggleSmall: () => ({ commands: commands2 }) => { + return commands2.toggleMark(this.name); + }, + unsetSmall: () => ({ commands: commands2 }) => { + return commands2.unsetMark(this.name); + } + }; + } +}); + +// resources/js/extensions/Grid/utils/createColumn.js +function createColumn(colType, colContent = null) { + if (colContent) { + return colType.createChecked(null, colContent); + } + return colType.createAndFill(); +} + +// resources/js/extensions/Grid/utils/getGridNodeTypes.js +function getGridNodeTypes(schema) { + if (schema.cached.gridNodeTypes) { + return schema.cached.gridNodeTypes; + } + const roles = {}; + Object.keys(schema.nodes).forEach((type) => { + const nodeType = schema.nodes[type]; + if (nodeType.spec.gridRole) { + roles[nodeType.spec.gridRole] = nodeType; + } + }); + schema.cached.gridNodeTypes = roles; + return roles; +} + +// resources/js/extensions/Grid/utils/createGrid.js +function createGrid(schema, colsCount, type, colContent) { + const types = getGridNodeTypes(schema); + const cols = []; + for (let index = 0; index < colsCount; index += 1) { + const col = createColumn(types.column, colContent); + if (col) { + cols.push(col); + } + } + return types.grid.createChecked({ cols: colsCount, type }, cols); +} + +// resources/js/extensions/Grid/Grid.js +var Grid = Node2.create({ + name: "grid", + group: "block", + defining: true, + isolating: true, + allowGapCursor: false, + content: "gridColumn+", + gridRole: "grid", + addOptions() { + return { + HTMLAttributes: { + class: "filament-tiptap-grid" + } + }; + }, + addAttributes() { + return { + type: { + default: "responsive", + parseHTML: (element) => element.getAttribute("type") + }, + cols: { + default: 2, + parseHTML: (element) => element.getAttribute("cols") + } + }; + }, + parseHTML() { + return [ + { + tag: "div", + getAttrs: (node) => node.classList.contains("filament-tiptap-grid") && null + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + insertGrid: ({ cols = 3, type = "responsive" } = {}) => ({ tr: tr2, dispatch, editor }) => { + const node = createGrid(editor.schema, cols, type); + if (dispatch) { + const offset2 = tr2.selection.anchor + 1; + tr2.replaceSelectionWith(node).scrollIntoView().setSelection(TextSelection.near(tr2.doc.resolve(offset2))); + } + return true; + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Alt-G": () => this.editor.commands.insertGrid() + }; + }, + extendNodeSchema(extension) { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + return { + gridRole: callOrReturn(getExtensionField(extension, "gridRole", context)) + }; + } +}); + +// resources/js/extensions/Grid/GridColumn.js +var GridColumn = Node2.create({ + name: "gridColumn", + content: "block+", + gridRole: "column", + isolating: true, + addOptions() { + return { + HTMLAttributes: { + class: "filament-tiptap-grid__column" + } + }; + }, + parseHTML() { + return [ + { + tag: "div", + getAttrs: (node) => node.classList.contains("filament-tiptap-grid__column") && null + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + } +}); + +// resources/js/extensions/Youtube/utils.js +var isValidYoutubeUrl = (url) => { + return url.match(/(youtube\.com|youtu\.be)(.+)?$/); +}; +var getYoutubeEmbedUrl = (nocookie = false) => { + return nocookie ? "https://www.youtube-nocookie.com/embed/" : "https://www.youtube.com/embed/"; +}; +var getEmbedURLFromYoutubeURL = (options) => { + const { url, controls, nocookie, startAt } = options; + if (url.includes("/embed/")) { + return url; + } + if (url.includes("youtu.be")) { + const id = url.split("/").pop(); + if (!id) { + return null; + } + return `${getYoutubeEmbedUrl(nocookie)}${id}`; + } + const videoIdRegex = /v=([-\w]+)/gm; + const matches2 = videoIdRegex.exec(url); + if (!matches2 || !matches2[1]) { + return null; + } + let outputUrl = `${getYoutubeEmbedUrl(nocookie)}${matches2[1]}`; + const params = []; + if (!controls) { + params.push("controls=0"); + } else { + params.push("controls=1"); + } + if (startAt) { + params.push(`start=${startAt}`); + } + if (params.length) { + outputUrl += `?${params.join("&")}`; + } + return outputUrl; +}; + +// resources/js/extensions/Youtube/Youtube.js +var Youtube = Node2.create({ + name: "youtube", + selectable: true, + draggable: true, + atom: true, + addOptions() { + return { + inline: false, + HTMLAttributes: {}, + width: 640, + height: 480 + }; + }, + inline() { + return this.options.inline; + }, + group() { + return this.options.inline ? "inline" : "block"; + }, + addAttributes() { + return { + style: { + default: null, + parseHTML: (element) => element.getAttribute("style") + }, + src: { + default: null + }, + width: { + default: this.options.width, + parseHTML: (element) => element.getAttribute("width") + }, + height: { + default: this.options.height, + parseHTML: (element) => element.getAttribute("height") + }, + responsive: { + default: true, + parseHTML: (element) => element.classList.contains("responsive") ?? false + }, + start: { + default: 0 + }, + controls: { + default: true + }, + nocookie: { + default: false + }, + "data-aspect-width": { + default: null, + parseHTML: (element) => element.getAttribute("data-aspect-width") + }, + "data-aspect-height": { + default: null, + parseHTML: (element) => element.getAttribute("data-aspect-height") + } + }; + }, + parseHTML() { + return [ + { + tag: "div[data-youtube-video] iframe" + } + ]; + }, + addCommands() { + return { + setYoutubeVideo: (options) => ({ commands: commands2 }) => { + if (!isValidYoutubeUrl(options.src)) { + return false; + } + const embedUrl = getEmbedURLFromYoutubeURL({ + url: options.src, + controls: options.controls, + nocookie: options.nocookie, + startAt: options.start || 0 + }); + return commands2.insertContent({ + type: this.name, + attrs: { + ...options, + src: embedUrl + } + }); + } + }; + }, + renderHTML({ HTMLAttributes }) { + const embedUrl = getEmbedURLFromYoutubeURL({ + url: HTMLAttributes.src, + controls: HTMLAttributes.controls, + nocookie: HTMLAttributes.nocookie, + startAt: HTMLAttributes.start || 0 + }); + return [ + "div", + { + "data-youtube-video": "", + class: HTMLAttributes.responsive ? "responsive" : null + }, + [ + "iframe", + { + src: embedUrl, + width: HTMLAttributes.width, + height: HTMLAttributes.height, + allowfullscreen: this.options.allowFullscreen, + style: HTMLAttributes.responsive ? `aspect-ratio: ${HTMLAttributes["data-aspect-width"]} / ${HTMLAttributes["data-aspect-height"]}; width: 100%; height: auto;` : null, + "data-aspect-width": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-width"] : null, + "data-aspect-height": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-height"] : null + } + ] + ]; + } +}); + +// resources/js/extensions/Vimeo/utils.js +var isValidVimeoUrl = (url) => { + return url.match(/(vimeo\.com)(.+)?$/); +}; +var getEmbedURLFromVimeoURL = (options) => { + const { url, autoplay, loop, title, byline, portrait } = options; + if (url.includes("/video/")) { + return url; + } + const videoIdRegex = /\.com\/([0-9]+)/gm; + const matches2 = videoIdRegex.exec(url); + if (!matches2 || !matches2[1]) { + return null; + } + let outputUrl = `https://player.vimeo.com/video/${matches2[1]}`; + const params = [`autoplay=${autoplay}`, `loop=${loop}`, `title=${title}`, `byline=${byline}`, `portrait=${portrait}`]; + outputUrl += `?${params.join("&")}`; + return outputUrl; +}; + +// resources/js/extensions/Vimeo/Vimeo.js +var Vimeo = Node2.create({ + name: "vimeo", + selectable: true, + draggable: true, + atom: true, + addOptions() { + return { + inline: false, + HTMLAttributes: {}, + allowFullscreen: true, + width: 640, + height: 480 + }; + }, + inline() { + return this.options.inline; + }, + group() { + return this.options.inline ? "inline" : "block"; + }, + addAttributes() { + return { + style: { + default: null, + parseHTML: (element) => element.getAttribute("style") + }, + src: { + default: null + }, + width: { + default: this.options.width, + parseHTML: (element) => element.getAttribute("width") + }, + height: { + default: this.options.height, + parseHTML: (element) => element.getAttribute("height") + }, + autoplay: { + default: 0 + }, + loop: { + default: 0 + }, + title: { + default: 0 + }, + byline: { + default: 0 + }, + portrait: { + default: 0 + }, + responsive: { + default: true, + parseHTML: (element) => element.classList.contains("responsive") ?? false + }, + "data-aspect-width": { + default: null, + parseHTML: (element) => element.getAttribute("data-aspect-width") + }, + "data-aspect-height": { + default: null, + parseHTML: (element) => element.getAttribute("data-aspect-height") + } + }; + }, + parseHTML() { + return [ + { + tag: "div[data-vimeo-video] iframe" + } + ]; + }, + addCommands() { + return { + setVimeoVideo: (options) => ({ commands: commands2 }) => { + if (!isValidVimeoUrl(options.src)) { + return false; + } + const embedUrl = getEmbedURLFromVimeoURL({ + url: options.src, + autoplay: options?.autoplay || 0, + loop: options?.loop || 0, + title: options?.title || 0, + byline: options?.byline || 0, + portrait: options?.portrait || 0 + }); + return commands2.insertContent({ + type: this.name, + attrs: { + ...options, + src: embedUrl + } + }); + } + }; + }, + renderHTML({ HTMLAttributes }) { + const embedUrl = getEmbedURLFromVimeoURL({ + url: HTMLAttributes.src, + autoplay: HTMLAttributes?.autoplay || 0, + loop: HTMLAttributes?.loop || 0, + title: HTMLAttributes?.title || 0, + byline: HTMLAttributes?.byline || 0, + portrait: HTMLAttributes?.portrait || 0 + }); + return [ + "div", + { "data-vimeo-video": "", class: HTMLAttributes.responsive ? "responsive" : null }, + [ + "iframe", + { + src: embedUrl, + width: HTMLAttributes.width, + height: HTMLAttributes.height, + allowfullscreen: this.options.allowfullscreen, + frameborder: 0, + allow: "autoplay; fullscreen; picture-in-picture", + style: HTMLAttributes.responsive ? `aspect-ratio: ${HTMLAttributes["data-aspect-width"]} / ${HTMLAttributes["data-aspect-height"]}; width: 100%; height: auto;` : null, + "data-aspect-width": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-width"] : null, + "data-aspect-height": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-height"] : null + } + ] + ]; + } +}); + +// resources/js/extensions/Video.js +var Video = Node2.create({ + name: "video", + selectable: true, + draggable: true, + atom: true, + inline() { + return this.options.inline; + }, + group() { + return this.options.inline ? "inline" : "block"; + }, + addOptions() { + return { + inline: false, + HTMLAttributes: { + autoplay: null, + controls: null, + loop: null + }, + width: 640, + height: 480 + }; + }, + addAttributes() { + return { + style: { + default: null, + parseHTML: (element) => element.getAttribute("style") + }, + responsive: { + default: true, + parseHTML: (element) => element.classList.contains("responsive") ?? false + }, + src: { + default: null + }, + width: { + default: this.options.width, + parseHTML: (element) => element.getAttribute("width") + }, + height: { + default: this.options.height, + parseHTML: (element) => element.getAttribute("height") + }, + autoplay: { + default: null, + parseHTML: (element) => element.getAttribute("autoplay") + }, + controls: { + default: null, + parseHTML: (element) => element.getAttribute("controls") + }, + loop: { + default: null, + parseHTML: (element) => element.getAttribute("loop") + }, + "data-aspect-width": { + default: null, + parseHTML: (element) => element.getAttribute("data-aspect-width") + }, + "data-aspect-height": { + default: null, + parseHTML: (element) => element.getAttribute("data-aspect-height") + } + }; + }, + parseHTML() { + return [ + { + tag: "div[data-native-video] video" + } + ]; + }, + addCommands() { + return { + setVideo: (options) => ({ commands: commands2 }) => { + return commands2.insertContent({ + type: this.name, + attrs: options + }); + } + }; + }, + renderHTML({ HTMLAttributes }) { + return [ + "div", + { "data-native-video": "", class: HTMLAttributes.responsive ? "responsive" : null }, + [ + "video", + { + src: HTMLAttributes.src, + width: HTMLAttributes.width, + height: HTMLAttributes.height, + autoplay: HTMLAttributes.autoplay ? "true" : null, + controls: HTMLAttributes.controls ? "true" : null, + loop: HTMLAttributes.loop ? "true" : null, + style: HTMLAttributes.responsive ? `aspect-ratio: ${HTMLAttributes["data-aspect-width"]} / ${HTMLAttributes["data-aspect-height"]}; width: 100%; height: auto;` : null, + "data-aspect-width": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-width"] : null, + "data-aspect-height": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-height"] : null + } + ] + ]; + } +}); + +// resources/js/extensions/Details/Details.js +var Details = Node2.create({ + name: "details", + content: "detailsSummary detailsContent", + group: "block", + defining: true, + isolating: true, + allowGapCursor: false, + addOptions() { + return { + HTMLAttributes: {} + }; + }, + addAttributes() { + return {}; + }, + parseHTML() { + return [ + { + tag: "details" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["details", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addNodeView() { + return ({ editor, getPos, node, HTMLAttributes }) => { + const dom = document.createElement("div"); + const content = document.createElement("div"); + const attributes = mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { + "data-type": this.name + }); + Object.entries(attributes).forEach(([key, value]) => dom.setAttribute(key, value)); + return { + dom, + contentDOM: dom, + ignoreMutation(mutation) { + if (mutation.type === "selection") { + return false; + } + return !dom.contains(mutation.target) || dom === mutation.target; + }, + update: (updatedNode) => { + if (updatedNode.type !== this.type) { + return false; + } + return true; + } + }; + }; + }, + addCommands() { + return { + setDetails: () => ({ state, chain }) => { + var _a; + const { schema, selection } = state; + const { $from, $to } = selection; + const range = $from.blockRange($to); + if (!range) { + return false; + } + const slice2 = state.doc.slice(range.start, range.end); + const match = schema.nodes.detailsContent.contentMatch.matchFragment(slice2.content); + if (!match) { + return false; + } + const content = ((_a = slice2.toJSON()) === null || _a === void 0 ? void 0 : _a.content) || []; + return chain().insertContentAt({ from: range.start, to: range.end }, { type: this.name, content: [{ type: "detailsSummary" }, { type: "detailsContent", content }] }).setTextSelection(range.start + 2).run(); + }, + unsetDetails: () => ({ state, chain }) => { + const { selection, schema } = state; + const details = findParentNode((node) => node.type === this.type)(selection); + if (!details) { + return false; + } + const detailsSummaries = findChildren(details.node, (node) => node.type === schema.nodes.detailsSummary); + const detailsContents = findChildren(details.node, (node) => node.type === schema.nodes.detailsContent); + if (!detailsSummaries.length || !detailsContents.length) { + return false; + } + const detailsSummary = detailsSummaries[0]; + const detailsContent = detailsContents[0]; + const from2 = details.pos; + const $from = state.doc.resolve(from2); + const to = from2 + details.node.nodeSize; + const range = { from: from2, to }; + const content = detailsContent.node.content.toJSON() || []; + const defaultTypeForSummary = $from.parent.type.contentMatch.defaultType; + const summaryContent = defaultTypeForSummary === null || defaultTypeForSummary === void 0 ? void 0 : defaultTypeForSummary.create(null, detailsSummary.node.content).toJSON(); + const mergedContent = [summaryContent, ...content]; + return chain().insertContentAt(range, mergedContent).setTextSelection(from2 + 1).run(); + } + }; + }, + addKeyboardShortcuts() { + return { + Backspace: () => { + const { schema, selection } = this.editor.state; + const { empty: empty2, $anchor } = selection; + if (!empty2 || $anchor.parent.type !== schema.nodes.detailsSummary) { + return false; + } + if ($anchor.parentOffset !== 0) { + return this.editor.commands.command(({ tr: tr2 }) => { + const from2 = $anchor.pos - 1; + const to = $anchor.pos; + tr2.delete(from2, to); + return true; + }); + } + return this.editor.commands.unsetDetails(); + } + }; + } +}); + +// resources/js/extensions/Details/DetailsSummary.js +var DetailsSummary = Node2.create({ + name: "detailsSummary", + content: "text*", + defining: true, + selectable: false, + isolating: true, + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: "summary" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["summary", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + } +}); + +// resources/js/extensions/Details/DetailsContent.js +var DetailsContent = Node2.create({ + name: "detailsContent", + content: "block+", + defining: true, + selectable: false, + addOptions() { + return { + HTMLAttributes: {} + }; + }, + parseHTML() { + return [ + { + tag: `div[data-type="details-content"]` + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { "data-type": "details-content" }), 0]; + }, + addKeyboardShortcuts() { + return { + // allows double enter to exit content node + Enter: ({ editor }) => { + const { state, view } = editor; + const { selection } = state; + const { $from, empty: empty2 } = selection; + const detailsContent = findParentNode((node2) => node2.type === this.type)(selection); + if (!empty2 || !detailsContent || !detailsContent.node.childCount) { + return false; + } + const fromIndex = $from.index(detailsContent.depth); + const { childCount } = detailsContent.node; + const isAtEnd = childCount === fromIndex + 1; + if (!isAtEnd) { + return false; + } + const defaultChildType = detailsContent.node.type.contentMatch.defaultType; + const defaultChildNode = defaultChildType === null || defaultChildType === void 0 ? void 0 : defaultChildType.createAndFill(); + if (!defaultChildNode) { + return false; + } + const $childPos = state.doc.resolve(detailsContent.pos + 1); + const lastChildIndex = childCount - 1; + const lastChildNode = detailsContent.node.child(lastChildIndex); + const lastChildPos = $childPos.posAtIndex(lastChildIndex, detailsContent.depth); + const lastChildNodeIsEmpty = lastChildNode.eq(defaultChildNode); + if (!lastChildNodeIsEmpty) { + return false; + } + const above = $from.node(-3); + if (!above) { + return false; + } + const after = $from.indexAfter(-3); + const type = defaultBlockAt2(above.contentMatchAt(after)); + if (!type || !above.canReplaceWith(after, after, type)) { + return false; + } + const node = type.createAndFill(); + if (!node) { + return false; + } + const { tr: tr2 } = state; + const pos = $from.after(-2); + tr2.replaceWith(pos, pos, node); + const $pos = tr2.doc.resolve(pos); + const newSelection = Selection.near($pos, 1); + tr2.setSelection(newSelection); + const deleteFrom = lastChildPos; + const deleteTo = lastChildPos + lastChildNode.nodeSize; + tr2.delete(deleteFrom, deleteTo); + tr2.scrollIntoView(); + view.dispatch(tr2); + return true; + } + }; + } +}); + +// node_modules/@tiptap/extension-code-block/dist/index.js +var backtickInputRegex = /^```([a-z]+)?[\s\n]$/; +var tildeInputRegex = /^~~~([a-z]+)?[\s\n]$/; +var CodeBlock = Node2.create({ + name: "codeBlock", + addOptions() { + return { + languageClassPrefix: "language-", + exitOnTripleEnter: true, + exitOnArrowDown: true, + HTMLAttributes: {} + }; + }, + content: "text*", + marks: "", + group: "block", + code: true, + defining: true, + addAttributes() { + return { + language: { + default: null, + parseHTML: (element) => { + var _a; + const { languageClassPrefix } = this.options; + const classNames = [...((_a = element.firstElementChild) === null || _a === void 0 ? void 0 : _a.classList) || []]; + const languages = classNames.filter((className) => className.startsWith(languageClassPrefix)).map((className) => className.replace(languageClassPrefix, "")); + const language = languages[0]; + if (!language) { + return null; + } + return language; + }, + rendered: false + } + }; + }, + parseHTML() { + return [ + { + tag: "pre", + preserveWhitespace: "full" + } + ]; + }, + renderHTML({ node, HTMLAttributes }) { + return [ + "pre", + mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), + [ + "code", + { + class: node.attrs.language ? this.options.languageClassPrefix + node.attrs.language : null + }, + 0 + ] + ]; + }, + addCommands() { + return { + setCodeBlock: (attributes) => ({ commands: commands2 }) => { + return commands2.setNode(this.name, attributes); + }, + toggleCodeBlock: (attributes) => ({ commands: commands2 }) => { + return commands2.toggleNode(this.name, "paragraph", attributes); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Alt-c": () => this.editor.commands.toggleCodeBlock(), + // remove code block when at start of document or code block is empty + Backspace: () => { + const { empty: empty2, $anchor } = this.editor.state.selection; + const isAtStart = $anchor.pos === 1; + if (!empty2 || $anchor.parent.type.name !== this.name) { + return false; + } + if (isAtStart || !$anchor.parent.textContent.length) { + return this.editor.commands.clearNodes(); + } + return false; + }, + // exit node on triple enter + Enter: ({ editor }) => { + if (!this.options.exitOnTripleEnter) { + return false; + } + const { state } = editor; + const { selection } = state; + const { $from, empty: empty2 } = selection; + if (!empty2 || $from.parent.type !== this.type) { + return false; + } + const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2; + const endsWithDoubleNewline = $from.parent.textContent.endsWith("\n\n"); + if (!isAtEnd || !endsWithDoubleNewline) { + return false; + } + return editor.chain().command(({ tr: tr2 }) => { + tr2.delete($from.pos - 2, $from.pos); + return true; + }).exitCode().run(); + }, + // exit node on arrow down + ArrowDown: ({ editor }) => { + if (!this.options.exitOnArrowDown) { + return false; + } + const { state } = editor; + const { selection, doc: doc3 } = state; + const { $from, empty: empty2 } = selection; + if (!empty2 || $from.parent.type !== this.type) { + return false; + } + const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2; + if (!isAtEnd) { + return false; + } + const after = $from.after(); + if (after === void 0) { + return false; + } + const nodeAfter = doc3.nodeAt(after); + if (nodeAfter) { + return false; + } + return editor.commands.exitCode(); + } + }; + }, + addInputRules() { + return [ + textblockTypeInputRule({ + find: backtickInputRegex, + type: this.type, + getAttributes: (match) => ({ + language: match[1] + }) + }), + textblockTypeInputRule({ + find: tildeInputRegex, + type: this.type, + getAttributes: (match) => ({ + language: match[1] + }) + }) + ]; + }, + addProseMirrorPlugins() { + return [ + // this plugin creates a code block for pasted content from VS Code + // we can also detect the copied code language + new Plugin({ + key: new PluginKey("codeBlockVSCodeHandler"), + props: { + handlePaste: (view, event) => { + if (!event.clipboardData) { + return false; + } + if (this.editor.isActive(this.type.name)) { + return false; + } + const text = event.clipboardData.getData("text/plain"); + const vscode = event.clipboardData.getData("vscode-editor-data"); + const vscodeData = vscode ? JSON.parse(vscode) : void 0; + const language = vscodeData === null || vscodeData === void 0 ? void 0 : vscodeData.mode; + if (!text || !language) { + return false; + } + const { tr: tr2 } = view.state; + tr2.replaceSelectionWith(this.type.create({ language })); + tr2.setSelection(TextSelection.near(tr2.doc.resolve(Math.max(0, tr2.selection.from - 2)))); + tr2.insertText(text.replace(/\r\n?/g, "\n")); + tr2.setMeta("paste", true); + view.dispatch(tr2); + return true; + } + } + }) + ]; + } +}); + +// node_modules/@tiptap/extension-code-block-lowlight/dist/index.js +var deepFreezeEs6 = { exports: {} }; +function deepFreeze(obj) { + if (obj instanceof Map) { + obj.clear = obj.delete = obj.set = function() { + throw new Error("map is read-only"); + }; + } else if (obj instanceof Set) { + obj.add = obj.clear = obj.delete = function() { + throw new Error("set is read-only"); + }; + } + Object.freeze(obj); + Object.getOwnPropertyNames(obj).forEach(function(name) { + var prop = obj[name]; + if (typeof prop == "object" && !Object.isFrozen(prop)) { + deepFreeze(prop); + } + }); + return obj; +} +deepFreezeEs6.exports = deepFreeze; +deepFreezeEs6.exports.default = deepFreeze; +var Response = class { + /** + * @param {CompiledMode} mode + */ + constructor(mode) { + if (mode.data === void 0) + mode.data = {}; + this.data = mode.data; + this.isMatchIgnored = false; + } + ignoreMatch() { + this.isMatchIgnored = true; + } +}; +function escapeHTML(value) { + return value.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); +} +function inherit$1(original, ...objects) { + const result = /* @__PURE__ */ Object.create(null); + for (const key in original) { + result[key] = original[key]; + } + objects.forEach(function(obj) { + for (const key in obj) { + result[key] = obj[key]; + } + }); + return ( + /** @type {T} */ + result + ); +} +var SPAN_CLOSE = ""; +var emitsWrappingTags = (node) => { + return !!node.scope || node.sublanguage && node.language; +}; +var scopeToCSSClass = (name, { prefix }) => { + if (name.includes(".")) { + const pieces = name.split("."); + return [ + `${prefix}${pieces.shift()}`, + ...pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`) + ].join(" "); + } + return `${prefix}${name}`; +}; +var HTMLRenderer = class { + /** + * Creates a new HTMLRenderer + * + * @param {Tree} parseTree - the parse tree (must support `walk` API) + * @param {{classPrefix: string}} options + */ + constructor(parseTree, options) { + this.buffer = ""; + this.classPrefix = options.classPrefix; + parseTree.walk(this); + } + /** + * Adds texts to the output stream + * + * @param {string} text */ + addText(text) { + this.buffer += escapeHTML(text); + } + /** + * Adds a node open to the output stream (if needed) + * + * @param {Node} node */ + openNode(node) { + if (!emitsWrappingTags(node)) + return; + let className = ""; + if (node.sublanguage) { + className = `language-${node.language}`; + } else { + className = scopeToCSSClass(node.scope, { prefix: this.classPrefix }); + } + this.span(className); + } + /** + * Adds a node close to the output stream (if needed) + * + * @param {Node} node */ + closeNode(node) { + if (!emitsWrappingTags(node)) + return; + this.buffer += SPAN_CLOSE; + } + /** + * returns the accumulated buffer + */ + value() { + return this.buffer; + } + // helpers + /** + * Builds a span element + * + * @param {string} className */ + span(className) { + this.buffer += ``; + } +}; +var newNode = (opts = {}) => { + const result = { children: [] }; + Object.assign(result, opts); + return result; +}; +var TokenTree = class _TokenTree { + constructor() { + this.rootNode = newNode(); + this.stack = [this.rootNode]; + } + get top() { + return this.stack[this.stack.length - 1]; + } + get root() { + return this.rootNode; + } + /** @param {Node} node */ + add(node) { + this.top.children.push(node); + } + /** @param {string} scope */ + openNode(scope) { + const node = newNode({ scope }); + this.add(node); + this.stack.push(node); + } + closeNode() { + if (this.stack.length > 1) { + return this.stack.pop(); + } + return void 0; + } + closeAllNodes() { + while (this.closeNode()) + ; + } + toJSON() { + return JSON.stringify(this.rootNode, null, 4); + } + /** + * @typedef { import("./html_renderer").Renderer } Renderer + * @param {Renderer} builder + */ + walk(builder) { + return this.constructor._walk(builder, this.rootNode); + } + /** + * @param {Renderer} builder + * @param {Node} node + */ + static _walk(builder, node) { + if (typeof node === "string") { + builder.addText(node); + } else if (node.children) { + builder.openNode(node); + node.children.forEach((child) => this._walk(builder, child)); + builder.closeNode(node); + } + return builder; + } + /** + * @param {Node} node + */ + static _collapse(node) { + if (typeof node === "string") + return; + if (!node.children) + return; + if (node.children.every((el) => typeof el === "string")) { + node.children = [node.children.join("")]; + } else { + node.children.forEach((child) => { + _TokenTree._collapse(child); + }); + } + } +}; +var TokenTreeEmitter = class extends TokenTree { + /** + * @param {*} options + */ + constructor(options) { + super(); + this.options = options; + } + /** + * @param {string} text + * @param {string} scope + */ + addKeyword(text, scope) { + if (text === "") { + return; + } + this.openNode(scope); + this.addText(text); + this.closeNode(); + } + /** + * @param {string} text + */ + addText(text) { + if (text === "") { + return; + } + this.add(text); + } + /** + * @param {Emitter & {root: DataNode}} emitter + * @param {string} name + */ + addSublanguage(emitter, name) { + const node = emitter.root; + node.sublanguage = true; + node.language = name; + this.add(node); + } + toHTML() { + const renderer = new HTMLRenderer(this, this.options); + return renderer.value(); + } + finalize() { + return true; + } +}; +function source(re) { + if (!re) + return null; + if (typeof re === "string") + return re; + return re.source; +} +function lookahead(re) { + return concat("(?=", re, ")"); +} +function anyNumberOfTimes(re) { + return concat("(?:", re, ")*"); +} +function optional(re) { + return concat("(?:", re, ")?"); +} +function concat(...args) { + const joined = args.map((x) => source(x)).join(""); + return joined; +} +function stripOptionsFromArgs(args) { + const opts = args[args.length - 1]; + if (typeof opts === "object" && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } +} +function either(...args) { + const opts = stripOptionsFromArgs(args); + const joined = "(" + (opts.capture ? "" : "?:") + args.map((x) => source(x)).join("|") + ")"; + return joined; +} +function countMatchGroups(re) { + return new RegExp(re.toString() + "|").exec("").length - 1; +} +function startsWith(re, lexeme) { + const match = re && re.exec(lexeme); + return match && match.index === 0; +} +var BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; +function _rewriteBackreferences(regexps, { joinWith }) { + let numCaptures = 0; + return regexps.map((regex) => { + numCaptures += 1; + const offset2 = numCaptures; + let re = source(regex); + let out = ""; + while (re.length > 0) { + const match = BACKREF_RE.exec(re); + if (!match) { + out += re; + break; + } + out += re.substring(0, match.index); + re = re.substring(match.index + match[0].length); + if (match[0][0] === "\\" && match[1]) { + out += "\\" + String(Number(match[1]) + offset2); + } else { + out += match[0]; + if (match[0] === "(") { + numCaptures++; + } + } + } + return out; + }).map((re) => `(${re})`).join(joinWith); +} +var MATCH_NOTHING_RE = /\b\B/; +var IDENT_RE = "[a-zA-Z]\\w*"; +var UNDERSCORE_IDENT_RE = "[a-zA-Z_]\\w*"; +var NUMBER_RE = "\\b\\d+(\\.\\d+)?"; +var C_NUMBER_RE = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)"; +var BINARY_NUMBER_RE = "\\b(0b[01]+)"; +var RE_STARTERS_RE = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~"; +var SHEBANG = (opts = {}) => { + const beginShebang = /^#![ ]*\//; + if (opts.binary) { + opts.begin = concat( + beginShebang, + /.*\b/, + opts.binary, + /\b.*/ + ); + } + return inherit$1({ + scope: "meta", + begin: beginShebang, + end: /$/, + relevance: 0, + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + if (m.index !== 0) + resp.ignoreMatch(); + } + }, opts); +}; +var BACKSLASH_ESCAPE = { + begin: "\\\\[\\s\\S]", + relevance: 0 +}; +var APOS_STRING_MODE = { + scope: "string", + begin: "'", + end: "'", + illegal: "\\n", + contains: [BACKSLASH_ESCAPE] +}; +var QUOTE_STRING_MODE = { + scope: "string", + begin: '"', + end: '"', + illegal: "\\n", + contains: [BACKSLASH_ESCAPE] +}; +var PHRASAL_WORDS_MODE = { + begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +}; +var COMMENT = function(begin, end2, modeOptions = {}) { + const mode = inherit$1( + { + scope: "comment", + begin, + end: end2, + contains: [] + }, + modeOptions + ); + mode.contains.push({ + scope: "doctag", + // hack to avoid the space from being included. the space is necessary to + // match here to prevent the plain text rule below from gobbling up doctags + begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", + end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, + excludeBegin: true, + relevance: 0 + }); + const ENGLISH_WORD = either( + // list of common 1 and 2 letter words in English + "I", + "a", + "is", + "so", + "us", + "to", + "at", + "if", + "in", + "it", + "on", + // note: this is not an exhaustive list of contractions, just popular ones + /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, + // contractions - can't we'd they're let's, etc + /[A-Za-z]+[-][a-z]+/, + // `no-way`, etc. + /[A-Za-z][a-z]{2,}/ + // allow capitalized words at beginning of sentences + ); + mode.contains.push( + { + // TODO: how to include ", (, ) without breaking grammars that use these for + // comment delimiters? + // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ + // --- + // this tries to find sequences of 3 english words in a row (without any + // "programming" type syntax) this gives us a strong signal that we've + // TRULY found a comment - vs perhaps scanning with the wrong language. + // It's possible to find something that LOOKS like the start of the + // comment - but then if there is no readable text - good chance it is a + // false match and not a comment. + // + // for a visual example please see: + // https://github.com/highlightjs/highlight.js/issues/2827 + begin: concat( + /[ ]+/, + // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ + "(", + ENGLISH_WORD, + /[.]?[:]?([.][ ]|[ ])/, + "){3}" + ) + // look for 3 words in a row + } + ); + return mode; +}; +var C_LINE_COMMENT_MODE = COMMENT("//", "$"); +var C_BLOCK_COMMENT_MODE = COMMENT("/\\*", "\\*/"); +var HASH_COMMENT_MODE = COMMENT("#", "$"); +var NUMBER_MODE = { + scope: "number", + begin: NUMBER_RE, + relevance: 0 +}; +var C_NUMBER_MODE = { + scope: "number", + begin: C_NUMBER_RE, + relevance: 0 +}; +var BINARY_NUMBER_MODE = { + scope: "number", + begin: BINARY_NUMBER_RE, + relevance: 0 +}; +var REGEXP_MODE = { + // this outer rule makes sure we actually have a WHOLE regex and not simply + // an expression such as: + // + // 3 / something + // + // (which will then blow up when regex's `illegal` sees the newline) + begin: /(?=\/[^/\n]*\/)/, + contains: [{ + scope: "regexp", + begin: /\//, + end: /\/[gimuy]*/, + illegal: /\n/, + contains: [ + BACKSLASH_ESCAPE, + { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [BACKSLASH_ESCAPE] + } + ] + }] +}; +var TITLE_MODE = { + scope: "title", + begin: IDENT_RE, + relevance: 0 +}; +var UNDERSCORE_TITLE_MODE = { + scope: "title", + begin: UNDERSCORE_IDENT_RE, + relevance: 0 +}; +var METHOD_GUARD = { + // excludes method names from keyword processing + begin: "\\.\\s*" + UNDERSCORE_IDENT_RE, + relevance: 0 +}; +var END_SAME_AS_BEGIN = function(mode) { + return Object.assign( + mode, + { + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + resp.data._beginMatch = m[1]; + }, + /** @type {ModeCallback} */ + "on:end": (m, resp) => { + if (resp.data._beginMatch !== m[1]) + resp.ignoreMatch(); + } + } + ); +}; +var MODES = /* @__PURE__ */ Object.freeze({ + __proto__: null, + MATCH_NOTHING_RE, + IDENT_RE, + UNDERSCORE_IDENT_RE, + NUMBER_RE, + C_NUMBER_RE, + BINARY_NUMBER_RE, + RE_STARTERS_RE, + SHEBANG, + BACKSLASH_ESCAPE, + APOS_STRING_MODE, + QUOTE_STRING_MODE, + PHRASAL_WORDS_MODE, + COMMENT, + C_LINE_COMMENT_MODE, + C_BLOCK_COMMENT_MODE, + HASH_COMMENT_MODE, + NUMBER_MODE, + C_NUMBER_MODE, + BINARY_NUMBER_MODE, + REGEXP_MODE, + TITLE_MODE, + UNDERSCORE_TITLE_MODE, + METHOD_GUARD, + END_SAME_AS_BEGIN +}); +function skipIfHasPrecedingDot(match, response) { + const before = match.input[match.index - 1]; + if (before === ".") { + response.ignoreMatch(); + } +} +function scopeClassName(mode, _parent) { + if (mode.className !== void 0) { + mode.scope = mode.className; + delete mode.className; + } +} +function beginKeywords(mode, parent) { + if (!parent) + return; + if (!mode.beginKeywords) + return; + mode.begin = "\\b(" + mode.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)"; + mode.__beforeBegin = skipIfHasPrecedingDot; + mode.keywords = mode.keywords || mode.beginKeywords; + delete mode.beginKeywords; + if (mode.relevance === void 0) + mode.relevance = 0; +} +function compileIllegal(mode, _parent) { + if (!Array.isArray(mode.illegal)) + return; + mode.illegal = either(...mode.illegal); +} +function compileMatch(mode, _parent) { + if (!mode.match) + return; + if (mode.begin || mode.end) + throw new Error("begin & end are not supported with match"); + mode.begin = mode.match; + delete mode.match; +} +function compileRelevance(mode, _parent) { + if (mode.relevance === void 0) + mode.relevance = 1; +} +var beforeMatchExt = (mode, parent) => { + if (!mode.beforeMatch) + return; + if (mode.starts) + throw new Error("beforeMatch cannot be used with starts"); + const originalMode = Object.assign({}, mode); + Object.keys(mode).forEach((key) => { + delete mode[key]; + }); + mode.keywords = originalMode.keywords; + mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin)); + mode.starts = { + relevance: 0, + contains: [ + Object.assign(originalMode, { endsParent: true }) + ] + }; + mode.relevance = 0; + delete originalMode.beforeMatch; +}; +var COMMON_KEYWORDS = [ + "of", + "and", + "for", + "in", + "not", + "or", + "if", + "then", + "parent", + // common variable name + "list", + // common variable name + "value" + // common variable name +]; +var DEFAULT_KEYWORD_SCOPE = "keyword"; +function compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) { + const compiledKeywords = /* @__PURE__ */ Object.create(null); + if (typeof rawKeywords === "string") { + compileList(scopeName, rawKeywords.split(" ")); + } else if (Array.isArray(rawKeywords)) { + compileList(scopeName, rawKeywords); + } else { + Object.keys(rawKeywords).forEach(function(scopeName2) { + Object.assign( + compiledKeywords, + compileKeywords(rawKeywords[scopeName2], caseInsensitive, scopeName2) + ); + }); + } + return compiledKeywords; + function compileList(scopeName2, keywordList) { + if (caseInsensitive) { + keywordList = keywordList.map((x) => x.toLowerCase()); + } + keywordList.forEach(function(keyword) { + const pair = keyword.split("|"); + compiledKeywords[pair[0]] = [scopeName2, scoreForKeyword(pair[0], pair[1])]; + }); + } +} +function scoreForKeyword(keyword, providedScore) { + if (providedScore) { + return Number(providedScore); + } + return commonKeyword(keyword) ? 0 : 1; +} +function commonKeyword(keyword) { + return COMMON_KEYWORDS.includes(keyword.toLowerCase()); +} +var seenDeprecations = {}; +var error = (message) => { + console.error(message); +}; +var warn2 = (message, ...args) => { + console.log(`WARN: ${message}`, ...args); +}; +var deprecated = (version2, message) => { + if (seenDeprecations[`${version2}/${message}`]) + return; + console.log(`Deprecated as of ${version2}. ${message}`); + seenDeprecations[`${version2}/${message}`] = true; +}; +var MultiClassError = new Error(); +function remapScopeNames(mode, regexes, { key }) { + let offset2 = 0; + const scopeNames = mode[key]; + const emit = {}; + const positions = {}; + for (let i = 1; i <= regexes.length; i++) { + positions[i + offset2] = scopeNames[i]; + emit[i + offset2] = true; + offset2 += countMatchGroups(regexes[i - 1]); + } + mode[key] = positions; + mode[key]._emit = emit; + mode[key]._multi = true; +} +function beginMultiClass(mode) { + if (!Array.isArray(mode.begin)) + return; + if (mode.skip || mode.excludeBegin || mode.returnBegin) { + error("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); + throw MultiClassError; + } + if (typeof mode.beginScope !== "object" || mode.beginScope === null) { + error("beginScope must be object"); + throw MultiClassError; + } + remapScopeNames(mode, mode.begin, { key: "beginScope" }); + mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" }); +} +function endMultiClass(mode) { + if (!Array.isArray(mode.end)) + return; + if (mode.skip || mode.excludeEnd || mode.returnEnd) { + error("skip, excludeEnd, returnEnd not compatible with endScope: {}"); + throw MultiClassError; + } + if (typeof mode.endScope !== "object" || mode.endScope === null) { + error("endScope must be object"); + throw MultiClassError; + } + remapScopeNames(mode, mode.end, { key: "endScope" }); + mode.end = _rewriteBackreferences(mode.end, { joinWith: "" }); +} +function scopeSugar(mode) { + if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { + mode.beginScope = mode.scope; + delete mode.scope; + } +} +function MultiClass(mode) { + scopeSugar(mode); + if (typeof mode.beginScope === "string") { + mode.beginScope = { _wrap: mode.beginScope }; + } + if (typeof mode.endScope === "string") { + mode.endScope = { _wrap: mode.endScope }; + } + beginMultiClass(mode); + endMultiClass(mode); +} +function compileLanguage(language) { + function langRe(value, global2) { + return new RegExp( + source(value), + "m" + (language.case_insensitive ? "i" : "") + (language.unicodeRegex ? "u" : "") + (global2 ? "g" : "") + ); + } + class MultiRegex { + constructor() { + this.matchIndexes = {}; + this.regexes = []; + this.matchAt = 1; + this.position = 0; + } + // @ts-ignore + addRule(re, opts) { + opts.position = this.position++; + this.matchIndexes[this.matchAt] = opts; + this.regexes.push([opts, re]); + this.matchAt += countMatchGroups(re) + 1; + } + compile() { + if (this.regexes.length === 0) { + this.exec = () => null; + } + const terminators = this.regexes.map((el) => el[1]); + this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: "|" }), true); + this.lastIndex = 0; + } + /** @param {string} s */ + exec(s) { + this.matcherRe.lastIndex = this.lastIndex; + const match = this.matcherRe.exec(s); + if (!match) { + return null; + } + const i = match.findIndex((el, i2) => i2 > 0 && el !== void 0); + const matchData = this.matchIndexes[i]; + match.splice(0, i); + return Object.assign(match, matchData); + } + } + class ResumableMultiRegex { + constructor() { + this.rules = []; + this.multiRegexes = []; + this.count = 0; + this.lastIndex = 0; + this.regexIndex = 0; + } + // @ts-ignore + getMatcher(index) { + if (this.multiRegexes[index]) + return this.multiRegexes[index]; + const matcher = new MultiRegex(); + this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); + matcher.compile(); + this.multiRegexes[index] = matcher; + return matcher; + } + resumingScanAtSamePosition() { + return this.regexIndex !== 0; + } + considerAll() { + this.regexIndex = 0; + } + // @ts-ignore + addRule(re, opts) { + this.rules.push([re, opts]); + if (opts.type === "begin") + this.count++; + } + /** @param {string} s */ + exec(s) { + const m = this.getMatcher(this.regexIndex); + m.lastIndex = this.lastIndex; + let result = m.exec(s); + if (this.resumingScanAtSamePosition()) { + if (result && result.index === this.lastIndex) + ; + else { + const m2 = this.getMatcher(0); + m2.lastIndex = this.lastIndex + 1; + result = m2.exec(s); + } + } + if (result) { + this.regexIndex += result.position + 1; + if (this.regexIndex === this.count) { + this.considerAll(); + } + } + return result; + } + } + function buildModeRegex(mode) { + const mm = new ResumableMultiRegex(); + mode.contains.forEach((term) => mm.addRule(term.begin, { rule: term, type: "begin" })); + if (mode.terminatorEnd) { + mm.addRule(mode.terminatorEnd, { type: "end" }); + } + if (mode.illegal) { + mm.addRule(mode.illegal, { type: "illegal" }); + } + return mm; + } + function compileMode(mode, parent) { + const cmode = ( + /** @type CompiledMode */ + mode + ); + if (mode.isCompiled) + return cmode; + [ + scopeClassName, + // do this early so compiler extensions generally don't have to worry about + // the distinction between match/begin + compileMatch, + MultiClass, + beforeMatchExt + ].forEach((ext) => ext(mode, parent)); + language.compilerExtensions.forEach((ext) => ext(mode, parent)); + mode.__beforeBegin = null; + [ + beginKeywords, + // do this later so compiler extensions that come earlier have access to the + // raw array if they wanted to perhaps manipulate it, etc. + compileIllegal, + // default to 1 relevance if not specified + compileRelevance + ].forEach((ext) => ext(mode, parent)); + mode.isCompiled = true; + let keywordPattern = null; + if (typeof mode.keywords === "object" && mode.keywords.$pattern) { + mode.keywords = Object.assign({}, mode.keywords); + keywordPattern = mode.keywords.$pattern; + delete mode.keywords.$pattern; + } + keywordPattern = keywordPattern || /\w+/; + if (mode.keywords) { + mode.keywords = compileKeywords(mode.keywords, language.case_insensitive); + } + cmode.keywordPatternRe = langRe(keywordPattern, true); + if (parent) { + if (!mode.begin) + mode.begin = /\B|\b/; + cmode.beginRe = langRe(cmode.begin); + if (!mode.end && !mode.endsWithParent) + mode.end = /\B|\b/; + if (mode.end) + cmode.endRe = langRe(cmode.end); + cmode.terminatorEnd = source(cmode.end) || ""; + if (mode.endsWithParent && parent.terminatorEnd) { + cmode.terminatorEnd += (mode.end ? "|" : "") + parent.terminatorEnd; + } + } + if (mode.illegal) + cmode.illegalRe = langRe( + /** @type {RegExp | string} */ + mode.illegal + ); + if (!mode.contains) + mode.contains = []; + mode.contains = [].concat(...mode.contains.map(function(c2) { + return expandOrCloneMode(c2 === "self" ? mode : c2); + })); + mode.contains.forEach(function(c2) { + compileMode( + /** @type Mode */ + c2, + cmode + ); + }); + if (mode.starts) { + compileMode(mode.starts, parent); + } + cmode.matcher = buildModeRegex(cmode); + return cmode; + } + if (!language.compilerExtensions) + language.compilerExtensions = []; + if (language.contains && language.contains.includes("self")) { + throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); + } + language.classNameAliases = inherit$1(language.classNameAliases || {}); + return compileMode( + /** @type Mode */ + language + ); +} +function dependencyOnParent(mode) { + if (!mode) + return false; + return mode.endsWithParent || dependencyOnParent(mode.starts); +} +function expandOrCloneMode(mode) { + if (mode.variants && !mode.cachedVariants) { + mode.cachedVariants = mode.variants.map(function(variant) { + return inherit$1(mode, { variants: null }, variant); + }); + } + if (mode.cachedVariants) { + return mode.cachedVariants; + } + if (dependencyOnParent(mode)) { + return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null }); + } + if (Object.isFrozen(mode)) { + return inherit$1(mode); + } + return mode; +} +var version = "11.6.0"; +var HTMLInjectionError = class extends Error { + constructor(reason, html) { + super(reason); + this.name = "HTMLInjectionError"; + this.html = html; + } +}; +var escape = escapeHTML; +var inherit = inherit$1; +var NO_MATCH = Symbol("nomatch"); +var MAX_KEYWORD_HITS = 7; +var HLJS = function(hljs) { + const languages = /* @__PURE__ */ Object.create(null); + const aliases = /* @__PURE__ */ Object.create(null); + const plugins = []; + let SAFE_MODE = true; + const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; + const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: "Plain text", contains: [] }; + let options = { + ignoreUnescapedHTML: false, + throwUnescapedHTML: false, + noHighlightRe: /^(no-?highlight)$/i, + languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, + classPrefix: "hljs-", + cssSelector: "pre code", + languages: null, + // beta configuration options, subject to change, welcome to discuss + // https://github.com/highlightjs/highlight.js/issues/1086 + __emitter: TokenTreeEmitter + }; + function shouldNotHighlight(languageName) { + return options.noHighlightRe.test(languageName); + } + function blockLanguage(block) { + let classes = block.className + " "; + classes += block.parentNode ? block.parentNode.className : ""; + const match = options.languageDetectRe.exec(classes); + if (match) { + const language = getLanguage(match[1]); + if (!language) { + warn2(LANGUAGE_NOT_FOUND.replace("{}", match[1])); + warn2("Falling back to no-highlight mode for this block.", block); + } + return language ? match[1] : "no-highlight"; + } + return classes.split(/\s+/).find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); + } + function highlight3(codeOrLanguageName, optionsOrCode, ignoreIllegals) { + let code = ""; + let languageName = ""; + if (typeof optionsOrCode === "object") { + code = codeOrLanguageName; + ignoreIllegals = optionsOrCode.ignoreIllegals; + languageName = optionsOrCode.language; + } else { + deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated."); + deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); + languageName = codeOrLanguageName; + code = optionsOrCode; + } + if (ignoreIllegals === void 0) { + ignoreIllegals = true; + } + const context = { + code, + language: languageName + }; + fire2("before:highlight", context); + const result = context.result ? context.result : _highlight(context.language, context.code, ignoreIllegals); + result.code = context.code; + fire2("after:highlight", result); + return result; + } + function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { + const keywordHits = /* @__PURE__ */ Object.create(null); + function keywordData(mode, matchText) { + return mode.keywords[matchText]; + } + function processKeywords() { + if (!top2.keywords) { + emitter.addText(modeBuffer); + return; + } + let lastIndex = 0; + top2.keywordPatternRe.lastIndex = 0; + let match = top2.keywordPatternRe.exec(modeBuffer); + let buf = ""; + while (match) { + buf += modeBuffer.substring(lastIndex, match.index); + const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; + const data = keywordData(top2, word); + if (data) { + const [kind, keywordRelevance] = data; + emitter.addText(buf); + buf = ""; + keywordHits[word] = (keywordHits[word] || 0) + 1; + if (keywordHits[word] <= MAX_KEYWORD_HITS) + relevance += keywordRelevance; + if (kind.startsWith("_")) { + buf += match[0]; + } else { + const cssClass = language.classNameAliases[kind] || kind; + emitter.addKeyword(match[0], cssClass); + } + } else { + buf += match[0]; + } + lastIndex = top2.keywordPatternRe.lastIndex; + match = top2.keywordPatternRe.exec(modeBuffer); + } + buf += modeBuffer.substring(lastIndex); + emitter.addText(buf); + } + function processSubLanguage() { + if (modeBuffer === "") + return; + let result2 = null; + if (typeof top2.subLanguage === "string") { + if (!languages[top2.subLanguage]) { + emitter.addText(modeBuffer); + return; + } + result2 = _highlight(top2.subLanguage, modeBuffer, true, continuations[top2.subLanguage]); + continuations[top2.subLanguage] = /** @type {CompiledMode} */ + result2._top; + } else { + result2 = highlightAuto2(modeBuffer, top2.subLanguage.length ? top2.subLanguage : null); + } + if (top2.relevance > 0) { + relevance += result2.relevance; + } + emitter.addSublanguage(result2._emitter, result2.language); + } + function processBuffer() { + if (top2.subLanguage != null) { + processSubLanguage(); + } else { + processKeywords(); + } + modeBuffer = ""; + } + function emitMultiClass(scope, match) { + let i = 1; + const max2 = match.length - 1; + while (i <= max2) { + if (!scope._emit[i]) { + i++; + continue; + } + const klass = language.classNameAliases[scope[i]] || scope[i]; + const text = match[i]; + if (klass) { + emitter.addKeyword(text, klass); + } else { + modeBuffer = text; + processKeywords(); + modeBuffer = ""; + } + i++; + } + } + function startNewMode(mode, match) { + if (mode.scope && typeof mode.scope === "string") { + emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); + } + if (mode.beginScope) { + if (mode.beginScope._wrap) { + emitter.addKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); + modeBuffer = ""; + } else if (mode.beginScope._multi) { + emitMultiClass(mode.beginScope, match); + modeBuffer = ""; + } + } + top2 = Object.create(mode, { parent: { value: top2 } }); + return top2; + } + function endOfMode(mode, match, matchPlusRemainder) { + let matched = startsWith(mode.endRe, matchPlusRemainder); + if (matched) { + if (mode["on:end"]) { + const resp = new Response(mode); + mode["on:end"](match, resp); + if (resp.isMatchIgnored) + matched = false; + } + if (matched) { + while (mode.endsParent && mode.parent) { + mode = mode.parent; + } + return mode; + } + } + if (mode.endsWithParent) { + return endOfMode(mode.parent, match, matchPlusRemainder); + } + } + function doIgnore(lexeme) { + if (top2.matcher.regexIndex === 0) { + modeBuffer += lexeme[0]; + return 1; + } else { + resumeScanAtSamePosition = true; + return 0; + } + } + function doBeginMatch(match) { + const lexeme = match[0]; + const newMode = match.rule; + const resp = new Response(newMode); + const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; + for (const cb of beforeCallbacks) { + if (!cb) + continue; + cb(match, resp); + if (resp.isMatchIgnored) + return doIgnore(lexeme); + } + if (newMode.skip) { + modeBuffer += lexeme; + } else { + if (newMode.excludeBegin) { + modeBuffer += lexeme; + } + processBuffer(); + if (!newMode.returnBegin && !newMode.excludeBegin) { + modeBuffer = lexeme; + } + } + startNewMode(newMode, match); + return newMode.returnBegin ? 0 : lexeme.length; + } + function doEndMatch(match) { + const lexeme = match[0]; + const matchPlusRemainder = codeToHighlight.substring(match.index); + const endMode = endOfMode(top2, match, matchPlusRemainder); + if (!endMode) { + return NO_MATCH; + } + const origin = top2; + if (top2.endScope && top2.endScope._wrap) { + processBuffer(); + emitter.addKeyword(lexeme, top2.endScope._wrap); + } else if (top2.endScope && top2.endScope._multi) { + processBuffer(); + emitMultiClass(top2.endScope, match); + } else if (origin.skip) { + modeBuffer += lexeme; + } else { + if (!(origin.returnEnd || origin.excludeEnd)) { + modeBuffer += lexeme; + } + processBuffer(); + if (origin.excludeEnd) { + modeBuffer = lexeme; + } + } + do { + if (top2.scope) { + emitter.closeNode(); + } + if (!top2.skip && !top2.subLanguage) { + relevance += top2.relevance; + } + top2 = top2.parent; + } while (top2 !== endMode.parent); + if (endMode.starts) { + startNewMode(endMode.starts, match); + } + return origin.returnEnd ? 0 : lexeme.length; + } + function processContinuations() { + const list = []; + for (let current = top2; current !== language; current = current.parent) { + if (current.scope) { + list.unshift(current.scope); + } + } + list.forEach((item) => emitter.openNode(item)); + } + let lastMatch = {}; + function processLexeme(textBeforeMatch, match) { + const lexeme = match && match[0]; + modeBuffer += textBeforeMatch; + if (lexeme == null) { + processBuffer(); + return 0; + } + if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { + modeBuffer += codeToHighlight.slice(match.index, match.index + 1); + if (!SAFE_MODE) { + const err = new Error(`0 width match regex (${languageName})`); + err.languageName = languageName; + err.badRule = lastMatch.rule; + throw err; + } + return 1; + } + lastMatch = match; + if (match.type === "begin") { + return doBeginMatch(match); + } else if (match.type === "illegal" && !ignoreIllegals) { + const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top2.scope || "") + '"'); + err.mode = top2; + throw err; + } else if (match.type === "end") { + const processed = doEndMatch(match); + if (processed !== NO_MATCH) { + return processed; + } + } + if (match.type === "illegal" && lexeme === "") { + return 1; + } + if (iterations > 1e5 && iterations > match.index * 3) { + const err = new Error("potential infinite loop, way more iterations than matches"); + throw err; + } + modeBuffer += lexeme; + return lexeme.length; + } + const language = getLanguage(languageName); + if (!language) { + error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); + throw new Error('Unknown language: "' + languageName + '"'); + } + const md = compileLanguage(language); + let result = ""; + let top2 = continuation || md; + const continuations = {}; + const emitter = new options.__emitter(options); + processContinuations(); + let modeBuffer = ""; + let relevance = 0; + let index = 0; + let iterations = 0; + let resumeScanAtSamePosition = false; + try { + top2.matcher.considerAll(); + for (; ; ) { + iterations++; + if (resumeScanAtSamePosition) { + resumeScanAtSamePosition = false; + } else { + top2.matcher.considerAll(); + } + top2.matcher.lastIndex = index; + const match = top2.matcher.exec(codeToHighlight); + if (!match) + break; + const beforeMatch = codeToHighlight.substring(index, match.index); + const processedCount = processLexeme(beforeMatch, match); + index = match.index + processedCount; + } + processLexeme(codeToHighlight.substring(index)); + emitter.closeAllNodes(); + emitter.finalize(); + result = emitter.toHTML(); + return { + language: languageName, + value: result, + relevance, + illegal: false, + _emitter: emitter, + _top: top2 + }; + } catch (err) { + if (err.message && err.message.includes("Illegal")) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: true, + relevance: 0, + _illegalBy: { + message: err.message, + index, + context: codeToHighlight.slice(index - 100, index + 100), + mode: err.mode, + resultSoFar: result + }, + _emitter: emitter + }; + } else if (SAFE_MODE) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: false, + relevance: 0, + errorRaised: err, + _emitter: emitter, + _top: top2 + }; + } else { + throw err; + } + } + } + function justTextHighlightResult(code) { + const result = { + value: escape(code), + illegal: false, + relevance: 0, + _top: PLAINTEXT_LANGUAGE, + _emitter: new options.__emitter(options) + }; + result._emitter.addText(code); + return result; + } + function highlightAuto2(code, languageSubset) { + languageSubset = languageSubset || options.languages || Object.keys(languages); + const plaintext2 = justTextHighlightResult(code); + const results = languageSubset.filter(getLanguage).filter(autoDetection).map( + (name) => _highlight(name, code, false) + ); + results.unshift(plaintext2); + const sorted = results.sort((a, b) => { + if (a.relevance !== b.relevance) + return b.relevance - a.relevance; + if (a.language && b.language) { + if (getLanguage(a.language).supersetOf === b.language) { + return 1; + } else if (getLanguage(b.language).supersetOf === a.language) { + return -1; + } + } + return 0; + }); + const [best, secondBest] = sorted; + const result = best; + result.secondBest = secondBest; + return result; + } + function updateClassName(element, currentLang, resultLang) { + const language = currentLang && aliases[currentLang] || resultLang; + element.classList.add("hljs"); + element.classList.add(`language-${language}`); + } + function highlightElement(element) { + let node = null; + const language = blockLanguage(element); + if (shouldNotHighlight(language)) + return; + fire2( + "before:highlightElement", + { el: element, language } + ); + if (element.children.length > 0) { + if (!options.ignoreUnescapedHTML) { + console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); + console.warn("https://github.com/highlightjs/highlight.js/wiki/security"); + console.warn("The element with unescaped HTML:"); + console.warn(element); + } + if (options.throwUnescapedHTML) { + const err = new HTMLInjectionError( + "One of your code blocks includes unescaped HTML.", + element.innerHTML + ); + throw err; + } + } + node = element; + const text = node.textContent; + const result = language ? highlight3(text, { language, ignoreIllegals: true }) : highlightAuto2(text); + element.innerHTML = result.value; + updateClassName(element, language, result.language); + element.result = { + language: result.language, + // TODO: remove with version 11.0 + re: result.relevance, + relevance: result.relevance + }; + if (result.secondBest) { + element.secondBest = { + language: result.secondBest.language, + relevance: result.secondBest.relevance + }; + } + fire2("after:highlightElement", { el: element, result, text }); + } + function configure(userOptions) { + options = inherit(options, userOptions); + } + const initHighlighting = () => { + highlightAll(); + deprecated("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); + }; + function initHighlightingOnLoad() { + highlightAll(); + deprecated("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); + } + let wantsHighlight = false; + function highlightAll() { + if (document.readyState === "loading") { + wantsHighlight = true; + return; + } + const blocks = document.querySelectorAll(options.cssSelector); + blocks.forEach(highlightElement); + } + function boot() { + if (wantsHighlight) + highlightAll(); + } + if (typeof window !== "undefined" && window.addEventListener) { + window.addEventListener("DOMContentLoaded", boot, false); + } + function registerLanguage2(languageName, languageDefinition) { + let lang = null; + try { + lang = languageDefinition(hljs); + } catch (error$1) { + error("Language definition for '{}' could not be registered.".replace("{}", languageName)); + if (!SAFE_MODE) { + throw error$1; + } else { + error(error$1); + } + lang = PLAINTEXT_LANGUAGE; + } + if (!lang.name) + lang.name = languageName; + languages[languageName] = lang; + lang.rawDefinition = languageDefinition.bind(null, hljs); + if (lang.aliases) { + registerAliases(lang.aliases, { languageName }); + } + } + function unregisterLanguage(languageName) { + delete languages[languageName]; + for (const alias of Object.keys(aliases)) { + if (aliases[alias] === languageName) { + delete aliases[alias]; + } + } + } + function listLanguages2() { + return Object.keys(languages); + } + function getLanguage(name) { + name = (name || "").toLowerCase(); + return languages[name] || languages[aliases[name]]; + } + function registerAliases(aliasList, { languageName }) { + if (typeof aliasList === "string") { + aliasList = [aliasList]; + } + aliasList.forEach((alias) => { + aliases[alias.toLowerCase()] = languageName; + }); + } + function autoDetection(name) { + const lang = getLanguage(name); + return lang && !lang.disableAutodetect; + } + function upgradePluginAPI(plugin) { + if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { + plugin["before:highlightElement"] = (data) => { + plugin["before:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { + plugin["after:highlightElement"] = (data) => { + plugin["after:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + } + function addPlugin(plugin) { + upgradePluginAPI(plugin); + plugins.push(plugin); + } + function fire2(event, args) { + const cb = event; + plugins.forEach(function(plugin) { + if (plugin[cb]) { + plugin[cb](args); + } + }); + } + function deprecateHighlightBlock(el) { + deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0"); + deprecated("10.7.0", "Please use highlightElement now."); + return highlightElement(el); + } + Object.assign(hljs, { + highlight: highlight3, + highlightAuto: highlightAuto2, + highlightAll, + highlightElement, + // TODO: Remove with v12 API + highlightBlock: deprecateHighlightBlock, + configure, + initHighlighting, + initHighlightingOnLoad, + registerLanguage: registerLanguage2, + unregisterLanguage, + listLanguages: listLanguages2, + getLanguage, + registerAliases, + autoDetection, + inherit, + addPlugin + }); + hljs.debugMode = function() { + SAFE_MODE = false; + }; + hljs.safeMode = function() { + SAFE_MODE = true; + }; + hljs.versionString = version; + hljs.regex = { + concat, + lookahead, + either, + optional, + anyNumberOfTimes + }; + for (const key in MODES) { + if (typeof MODES[key] === "object") { + deepFreezeEs6.exports(MODES[key]); + } + } + Object.assign(hljs, MODES); + return hljs; +}; +var highlight = HLJS({}); +var core = highlight; +highlight.HighlightJS = highlight; +highlight.default = highlight; +var HighlightJS = core; +function parseNodes(nodes, className = []) { + return nodes.map((node) => { + const classes = [...className, ...node.properties ? node.properties.className : []]; + if (node.children) { + return parseNodes(node.children, classes); + } + return { + text: node.value, + classes + }; + }).flat(); +} +function getHighlightNodes(result) { + return result.value || result.children || []; +} +function registered(aliasOrLanguage) { + return Boolean(HighlightJS.getLanguage(aliasOrLanguage)); +} +function getDecorations({ doc: doc3, name, lowlight: lowlight2, defaultLanguage }) { + const decorations = []; + findChildren(doc3, (node) => node.type.name === name).forEach((block) => { + let from2 = block.pos + 1; + const language = block.node.attrs.language || defaultLanguage; + const languages = lowlight2.listLanguages(); + const nodes = language && (languages.includes(language) || registered(language)) ? getHighlightNodes(lowlight2.highlight(language, block.node.textContent)) : getHighlightNodes(lowlight2.highlightAuto(block.node.textContent)); + parseNodes(nodes).forEach((node) => { + const to = from2 + node.text.length; + if (node.classes.length) { + const decoration = Decoration.inline(from2, to, { + class: node.classes.join(" ") + }); + decorations.push(decoration); + } + from2 = to; + }); + }); + return DecorationSet.create(doc3, decorations); +} +function isFunction2(param) { + return typeof param === "function"; +} +function LowlightPlugin({ name, lowlight: lowlight2, defaultLanguage }) { + if (!["highlight", "highlightAuto", "listLanguages"].every((api) => isFunction2(lowlight2[api]))) { + throw Error("You should provide an instance of lowlight to use the code-block-lowlight extension"); + } + const lowlightPlugin = new Plugin({ + key: new PluginKey("lowlight"), + state: { + init: (_, { doc: doc3 }) => getDecorations({ + doc: doc3, + name, + lowlight: lowlight2, + defaultLanguage + }), + apply: (transaction, decorationSet, oldState, newState) => { + const oldNodeName = oldState.selection.$head.parent.type.name; + const newNodeName = newState.selection.$head.parent.type.name; + const oldNodes = findChildren(oldState.doc, (node) => node.type.name === name); + const newNodes = findChildren(newState.doc, (node) => node.type.name === name); + if (transaction.docChanged && ([oldNodeName, newNodeName].includes(name) || newNodes.length !== oldNodes.length || transaction.steps.some((step) => { + return ( + // @ts-ignore + step.from !== void 0 && step.to !== void 0 && oldNodes.some((node) => { + return ( + // @ts-ignore + node.pos >= step.from && node.pos + node.node.nodeSize <= step.to + ); + }) + ); + }))) { + return getDecorations({ + doc: transaction.doc, + name, + lowlight: lowlight2, + defaultLanguage + }); + } + return decorationSet.map(transaction.mapping, transaction.doc); + } + }, + props: { + decorations(state) { + return lowlightPlugin.getState(state); + } + } + }); + return lowlightPlugin; +} +var CodeBlockLowlight = CodeBlock.extend({ + addOptions() { + var _a; + return { + ...(_a = this.parent) === null || _a === void 0 ? void 0 : _a.call(this), + lowlight: {}, + defaultLanguage: null + }; + }, + addProseMirrorPlugins() { + var _a; + return [ + ...((_a = this.parent) === null || _a === void 0 ? void 0 : _a.call(this)) || [], + LowlightPlugin({ + name: this.name, + lowlight: this.options.lowlight, + defaultLanguage: this.options.defaultLanguage + }) + ]; + } +}); + +// resources/js/extensions/CodeBlock.js +var CustomCodeBlockLowlight = CodeBlockLowlight.extend({ + addKeyboardShortcuts() { + return { + ...this.parent?.(), + ArrowDown: () => { + const state = this.editor.state; + const { from: from2, to } = state.selection; + if (from2 > 1 && from2 === to) { + let inCodeBlock = false; + state.doc.nodesBetween(from2 - 1, to - 1, (node) => { + if (node.type.name === "codeBlock") + inCodeBlock = true; + }); + let nothingOnRight = true; + state.doc.nodesBetween(from2 + 1, to + 1, (node) => { + if (node) + nothingOnRight = false; + }); + if (inCodeBlock && nothingOnRight) { + return this.editor.commands.setHardBreak(); + } + } + return false; + } + }; + } +}); + +// resources/js/extensions/Hurdle.js +var Hurdle = Node2.create({ + name: "hurdle", + group: "block", + content: "block+", + addOptions() { + return { + colors: ["gray_light", "gray", "gray_dark", "primary", "secondary", "tertiary", "accent"], + HTMLAttributes: { + class: "filament-tiptap-hurdle" + } + }; + }, + addAttributes() { + return { + color: { + default: "gray", + parseHTML: (element) => element.getAttribute("data-color"), + renderHTML: (attributes) => { + return { + "data-color": attributes.color + }; + } + } + }; + }, + parseHTML() { + return [ + { + tag: "div", + getAttrs: (element) => element.classList.contains("filament-tiptap-hurdle") + } + ]; + }, + renderHTML({ node, HTMLAttributes }) { + return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + setHurdle: (attributes) => ({ commands: commands2 }) => { + if (!this.options.colors.includes(attributes.color)) { + return false; + } + return commands2.toggleWrap(this.name, attributes); + } + }; + } +}); + +// resources/js/extensions/CustomTextAlign.js +var CustomTextAlign = Extension.create({ + name: "textAlign", + addOptions() { + return { + types: [], + alignments: ["start", "center", "end", "justify"], + defaultAlignment: "start" + }; + }, + addGlobalAttributes() { + return [ + { + types: this.options.types, + attributes: { + textAlign: { + default: this.options.defaultAlignment, + parseHTML: (element) => element.style.textAlign || this.options.defaultAlignment, + renderHTML: (attributes) => { + if (attributes.textAlign === this.options.defaultAlignment) { + return {}; + } + return { style: `text-align: ${attributes.textAlign}` }; + } + } + } + } + ]; + }, + addCommands() { + return { + setTextAlign: (alignment) => ({ commands: commands2 }) => { + if (!this.options.alignments.includes(alignment)) { + return false; + } + return this.options.types.every((type) => commands2.updateAttributes(type, { textAlign: alignment })); + }, + unsetTextAlign: () => ({ commands: commands2 }) => { + return this.options.types.every((type) => commands2.resetAttributes(type, "textAlign")); + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Shift-l": () => this.editor.commands.setTextAlign("start"), + "Mod-Shift-e": () => this.editor.commands.setTextAlign("center"), + "Mod-Shift-r": () => this.editor.commands.setTextAlign("end"), + "Mod-Shift-j": () => this.editor.commands.setTextAlign("justify") + }; + } +}); + +// node_modules/@popperjs/core/lib/enums.js +var top = "top"; +var bottom = "bottom"; +var right = "right"; +var left = "left"; +var auto = "auto"; +var basePlacements = [top, bottom, right, left]; +var start = "start"; +var end = "end"; +var clippingParents = "clippingParents"; +var viewport = "viewport"; +var popper = "popper"; +var reference = "reference"; +var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); +var beforeRead = "beforeRead"; +var read = "read"; +var afterRead = "afterRead"; +var beforeMain = "beforeMain"; +var main = "main"; +var afterMain = "afterMain"; +var beforeWrite = "beforeWrite"; +var write = "write"; +var afterWrite = "afterWrite"; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + +// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js +function getNodeName(element) { + return element ? (element.nodeName || "").toLowerCase() : null; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindow.js +function getWindow(node) { + if (node == null) { + return window; + } + if (node.toString() !== "[object Window]") { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + return node; +} + +// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js +function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; +} +function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} +function isShadowRoot(node) { + if (typeof ShadowRoot === "undefined") { + return false; + } + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} + +// node_modules/@popperjs/core/lib/modifiers/applyStyles.js +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function(name) { + var style2 = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style2); + Object.keys(attributes).forEach(function(name2) { + var value = attributes[name2]; + if (value === false) { + element.removeAttribute(name2); + } else { + element.setAttribute(name2, value === true ? "" : value); + } + }); + }); +} +function effect(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: "0", + top: "0", + margin: "0" + }, + arrow: { + position: "absolute" + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + return function() { + Object.keys(state.elements).forEach(function(name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); + var style2 = styleProperties.reduce(function(style3, property) { + style3[property] = ""; + return style3; + }, {}); + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style2); + Object.keys(attributes).forEach(function(attribute) { + element.removeAttribute(attribute); + }); + }); + }; +} +var applyStyles_default = { + name: "applyStyles", + enabled: true, + phase: "write", + fn: applyStyles, + effect, + requires: ["computeStyles"] +}; + +// node_modules/@popperjs/core/lib/utils/getBasePlacement.js +function getBasePlacement(placement) { + return placement.split("-")[0]; +} + +// node_modules/@popperjs/core/lib/utils/math.js +var max = Math.max; +var min = Math.min; +var round = Math.round; + +// node_modules/@popperjs/core/lib/utils/userAgent.js +function getUAString() { + var uaData = navigator.userAgentData; + if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) { + return uaData.brands.map(function(item) { + return item.brand + "/" + item.version; + }).join(" "); + } + return navigator.userAgent; +} + +// node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js +function isLayoutViewport() { + return !/^((?!chrome|android).)*safari/i.test(getUAString()); +} + +// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js +function getBoundingClientRect(element, includeScale, isFixedStrategy) { + if (includeScale === void 0) { + includeScale = false; + } + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + var clientRect2 = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + if (includeScale && isHTMLElement(element)) { + scaleX = element.offsetWidth > 0 ? round(clientRect2.width) / element.offsetWidth || 1 : 1; + scaleY = element.offsetHeight > 0 ? round(clientRect2.height) / element.offsetHeight || 1 : 1; + } + var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport; + var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; + var x = (clientRect2.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; + var y = (clientRect2.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; + var width = clientRect2.width / scaleX; + var height = clientRect2.height / scaleY; + return { + width, + height, + top: y, + right: x + width, + bottom: y + height, + left: x, + x, + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js +function getLayoutRect(element) { + var clientRect2 = getBoundingClientRect(element); + var width = element.offsetWidth; + var height = element.offsetHeight; + if (Math.abs(clientRect2.width - width) <= 1) { + width = clientRect2.width; + } + if (Math.abs(clientRect2.height - height) <= 1) { + height = clientRect2.height; + } + return { + x: element.offsetLeft, + y: element.offsetTop, + width, + height + }; } -.ProseMirror [contenteditable="false"] { - white-space: normal; +// node_modules/@popperjs/core/lib/dom-utils/contains.js +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); + if (parent.contains(child)) { + return true; + } else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + do { + if (next && parent.isSameNode(next)) { + return true; + } + next = next.parentNode || next.host; + } while (next); + } + return false; } -.ProseMirror [contenteditable="false"] [contenteditable="true"] { - white-space: pre-wrap; +// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js +function getComputedStyle2(element) { + return getWindow(element).getComputedStyle(element); +} + +// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js +function isTableElement(element) { + return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js +function getDocumentElement(element) { + return ((isElement(element) ? element.ownerDocument : ( + // $FlowFixMe[prop-missing] + element.document + )) || window.document).documentElement; +} + +// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js +function getParentNode(element) { + if (getNodeName(element) === "html") { + return element; + } + return ( + // this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || // DOM Element detected + (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + getDocumentElement(element) + ); +} + +// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js +function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 + getComputedStyle2(element).position === "fixed") { + return null; + } + return element.offsetParent; +} +function getContainingBlock(element) { + var isFirefox = /firefox/i.test(getUAString()); + var isIE = /Trident/i.test(getUAString()); + if (isIE && isHTMLElement(element)) { + var elementCss = getComputedStyle2(element); + if (elementCss.position === "fixed") { + return null; + } + } + var currentNode = getParentNode(element); + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } + while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { + var css2 = getComputedStyle2(currentNode); + if (css2.transform !== "none" || css2.perspective !== "none" || css2.contain === "paint" || ["transform", "perspective"].indexOf(css2.willChange) !== -1 || isFirefox && css2.willChange === "filter" || isFirefox && css2.filter && css2.filter !== "none") { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + return null; +} +function getOffsetParent(element) { + var window2 = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") { + offsetParent = getTrueOffsetParent(offsetParent); + } + if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) { + return window2; + } + return offsetParent || getContainingBlock(element) || window2; +} + +// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js +function getMainAxisFromPlacement(placement) { + return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; +} + +// node_modules/@popperjs/core/lib/utils/within.js +function within(min2, value, max2) { + return max(min2, min(value, max2)); +} +function withinMaxClamp(min2, value, max2) { + var v = within(min2, value, max2); + return v > max2 ? max2 : v; +} + +// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} + +// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js +function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); +} + +// node_modules/@popperjs/core/lib/utils/expandToHashMap.js +function expandToHashMap(value, keys2) { + return keys2.reduce(function(hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} + +// node_modules/@popperjs/core/lib/modifiers/arrow.js +var toPaddingObject = function toPaddingObject2(padding, state) { + padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); +}; +function arrow3(_ref) { + var _state$modifiersData$; + var state = _ref.state, name = _ref.name, options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets2 = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? "height" : "width"; + if (!arrowElement || !popperOffsets2) { + return; + } + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === "y" ? top : left; + var maxProp = axis === "y" ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; + var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; + var min2 = paddingObject[minProp]; + var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset2 = within(min2, center, max2); + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); +} +function effect2(_ref2) { + var state = _ref2.state, options = _ref2.options; + var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; + if (arrowElement == null) { + return; + } + if (typeof arrowElement === "string") { + arrowElement = state.elements.popper.querySelector(arrowElement); + if (!arrowElement) { + return; + } + } + if (!contains(state.elements.popper, arrowElement)) { + return; + } + state.elements.arrow = arrowElement; +} +var arrow_default = { + name: "arrow", + enabled: true, + phase: "main", + fn: arrow3, + effect: effect2, + requires: ["popperOffsets"], + requiresIfExists: ["preventOverflow"] +}; + +// node_modules/@popperjs/core/lib/utils/getVariation.js +function getVariation(placement) { + return placement.split("-")[1]; +} + +// node_modules/@popperjs/core/lib/modifiers/computeStyles.js +var unsetSides = { + top: "auto", + right: "auto", + bottom: "auto", + left: "auto" +}; +function roundOffsetsByDPR(_ref, win) { + var x = _ref.x, y = _ref.y; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x * dpr) / dpr || 0, + y: round(y * dpr) / dpr || 0 + }; +} +function mapToStyles(_ref2) { + var _Object$assign2; + var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; + var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ + x, + y + }) : { + x, + y + }; + x = _ref3.x; + y = _ref3.y; + var hasX = offsets.hasOwnProperty("x"); + var hasY = offsets.hasOwnProperty("y"); + var sideX = left; + var sideY = top; + var win = window; + if (adaptive) { + var offsetParent = getOffsetParent(popper2); + var heightProp = "clientHeight"; + var widthProp = "clientWidth"; + if (offsetParent === getWindow(popper2)) { + offsetParent = getDocumentElement(popper2); + if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") { + heightProp = "scrollHeight"; + widthProp = "scrollWidth"; + } + } + offsetParent = offsetParent; + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : ( + // $FlowFixMe[prop-missing] + offsetParent[heightProp] + ); + y -= offsetY - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : ( + // $FlowFixMe[prop-missing] + offsetParent[widthProp] + ); + x -= offsetX - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + var commonStyles = Object.assign({ + position + }, adaptive && unsetSides); + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x, + y + }, getWindow(popper2)) : { + x, + y + }; + x = _ref4.x; + y = _ref4.y; + if (gpuAcceleration) { + var _Object$assign; + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2)); +} +function computeStyles(_ref5) { + var state = _ref5.state, options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration, + isFixed: state.options.strategy === "fixed" + }; + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive, + roundOffsets + }))); + } + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: "absolute", + adaptive: false, + roundOffsets + }))); + } + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-placement": state.placement + }); +} +var computeStyles_default = { + name: "computeStyles", + enabled: true, + phase: "beforeWrite", + fn: computeStyles, + data: {} +}; + +// node_modules/@popperjs/core/lib/modifiers/eventListeners.js +var passive = { + passive: true +}; +function effect3(_ref) { + var state = _ref.state, instance = _ref.instance, options = _ref.options; + var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; + var window2 = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.addEventListener("scroll", instance.update, passive); + }); + } + if (resize) { + window2.addEventListener("resize", instance.update, passive); + } + return function() { + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.removeEventListener("scroll", instance.update, passive); + }); + } + if (resize) { + window2.removeEventListener("resize", instance.update, passive); + } + }; +} +var eventListeners_default = { + name: "eventListeners", + enabled: true, + phase: "write", + fn: function fn() { + }, + effect: effect3, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +var hash = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function(matched) { + return hash[matched]; + }); +} + +// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +var hash2 = { + start: "end", + end: "start" +}; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function(matched) { + return hash2[matched]; + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js +function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft, + scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js +function getWindowScrollBarX(element) { + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; +} + +// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js +function getViewportRect(element, strategy) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + var layoutViewport = isLayoutViewport(); + if (layoutViewport || !layoutViewport && strategy === "fixed") { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + return { + width, + height, + x: x + getWindowScrollBarX(element), + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js +function getDocumentRect(element) { + var _element$ownerDocumen; + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + if (getComputedStyle2(body || html).direction === "rtl") { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + return { + width, + height, + x, + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js +function isScrollParent(element) { + var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} + +// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js +function getScrollParent(node) { + if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { + return node.ownerDocument.body; + } + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + return getScrollParent(getParentNode(node)); +} + +// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js +function listScrollParents(element, list) { + var _element$ownerDocumen; + if (list === void 0) { + list = []; + } + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : ( + // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(getParentNode(target))) + ); +} + +// node_modules/@popperjs/core/lib/utils/rectToClientRect.js +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +function getInnerBoundingClientRect(element, strategy) { + var rect = getBoundingClientRect(element, false, strategy === "fixed"); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} +function getClientRectFromMixedType(element, clippingParent, strategy) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); +} +function getClippingParents(element) { + var clippingParents2 = listScrollParents(getParentNode(element)); + var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + if (!isElement(clipperElement)) { + return []; + } + return clippingParents2.filter(function(clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; + }); +} +function getClippingRect(element, boundary, rootBoundary, strategy) { + var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); + var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents2[0]; + var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent, strategy); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent, strategy)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} + +// node_modules/@popperjs/core/lib/utils/computeOffsets.js +function computeOffsets(_ref) { + var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference2.x + reference2.width / 2 - element.width / 2; + var commonY = reference2.y + reference2.height / 2 - element.height / 2; + var offsets; + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference2.y - element.height + }; + break; + case bottom: + offsets = { + x: commonX, + y: reference2.y + reference2.height + }; + break; + case right: + offsets = { + x: reference2.x + reference2.width, + y: commonY + }; + break; + case left: + offsets = { + x: reference2.x - element.width, + y: commonY + }; + break; + default: + offsets = { + x: reference2.x, + y: reference2.y + }; + } + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + if (mainAxis != null) { + var len = mainAxis === "y" ? "height" : "width"; + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); + break; + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); + break; + default: + } + } + return offsets; +} + +// node_modules/@popperjs/core/lib/utils/detectOverflow.js +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets2 = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: "absolute", + placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; + if (elementContext === popper && offsetData) { + var offset2 = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function(key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; + overflowOffsets[key] += offset2[axis] * multiply; + }); + } + return overflowOffsets; +} + +// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { + return getVariation(placement2) === variation; + }) : basePlacements; + var allowedPlacements = placements2.filter(function(placement2) { + return allowedAutoPlacements.indexOf(placement2) >= 0; + }); + if (allowedPlacements.length === 0) { + allowedPlacements = placements2; + } + var overflows = allowedPlacements.reduce(function(acc, placement2) { + acc[placement2] = detectOverflow(state, { + placement: placement2, + boundary, + rootBoundary, + padding + })[getBasePlacement(placement2)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function(a, b) { + return overflows[a] - overflows[b]; + }); +} + +// node_modules/@popperjs/core/lib/modifiers/flip.js +function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; +} +function flip(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + if (state.modifiersData[name]._skip) { + return; + } + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { + return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { + placement: placement2, + boundary, + rootBoundary, + padding, + flipVariations, + allowedAutoPlacements + }) : placement2); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = /* @__PURE__ */ new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements2[0]; + for (var i = 0; i < placements2.length; i++) { + var placement = placements2[i]; + var _basePlacement = getBasePlacement(placement); + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? "width" : "height"; + var overflow = detectOverflow(state, { + placement, + boundary, + rootBoundary, + altBoundary, + padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + if (checks.every(function(check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + checksMap.set(placement, checks); + } + if (makeFallbackChecks) { + var numberOfChecks = flipVariations ? 3 : 1; + var _loop = function _loop2(_i2) { + var fittingPlacement = placements2.find(function(placement2) { + var checks2 = checksMap.get(placement2); + if (checks2) { + return checks2.slice(0, _i2).every(function(check) { + return check; + }); + } + }); + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + if (_ret === "break") + break; + } + } + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} +var flip_default = { + name: "flip", + enabled: true, + phase: "main", + fn: flip, + requiresIfExists: ["offset"], + data: { + _skip: false + } +}; + +// node_modules/@popperjs/core/lib/modifiers/hide.js +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} +function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function(side) { + return overflow[side] >= 0; + }); +} +function hide(_ref) { + var state = _ref.state, name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: "reference" + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets, + popperEscapeOffsets, + isReferenceHidden, + hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-reference-hidden": isReferenceHidden, + "data-popper-escaped": hasPopperEscaped + }); +} +var hide_default = { + name: "hide", + enabled: true, + phase: "main", + requiresIfExists: ["preventOverflow"], + fn: hide +}; + +// node_modules/@popperjs/core/lib/modifiers/offset.js +function distanceAndSkiddingToXY(placement, rects, offset2) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { + placement + })) : offset2, skidding = _ref[0], distance = _ref[1]; + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} +function offset(_ref2) { + var state = _ref2.state, options = _ref2.options, name = _ref2.name; + var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function(acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); + return acc; + }, {}); + var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + state.modifiersData[name] = data; +} +var offset_default = { + name: "offset", + enabled: true, + phase: "main", + requires: ["popperOffsets"], + fn: offset +}; + +// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js +function popperOffsets(_ref) { + var state = _ref.state, name = _ref.name; + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: "absolute", + placement: state.placement + }); +} +var popperOffsets_default = { + name: "popperOffsets", + enabled: true, + phase: "read", + fn: popperOffsets, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getAltAxis.js +function getAltAxis(axis) { + return axis === "x" ? "y" : "x"; +} + +// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js +function preventOverflow(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary, + rootBoundary, + padding, + altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets2 = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 + }; + if (!popperOffsets2) { + return; + } + if (checkMainAxis) { + var _offsetModifierState$; + var mainSide = mainAxis === "y" ? top : left; + var altSide = mainAxis === "y" ? bottom : right; + var len = mainAxis === "y" ? "height" : "width"; + var offset2 = popperOffsets2[mainAxis]; + var min2 = offset2 + overflow[mainSide]; + var max2 = offset2 - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset2 + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2); + popperOffsets2[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset2; + } + if (checkAltAxis) { + var _offsetModifierState$2; + var _mainSide = mainAxis === "x" ? top : left; + var _altSide = mainAxis === "x" ? bottom : right; + var _offset = popperOffsets2[altAxis]; + var _len = altAxis === "y" ? "height" : "width"; + var _min = _offset + overflow[_mainSide]; + var _max = _offset - overflow[_altSide]; + var isOriginSide = [top, left].indexOf(basePlacement) !== -1; + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + popperOffsets2[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + state.modifiersData[name] = data; +} +var preventOverflow_default = { + name: "preventOverflow", + enabled: true, + phase: "main", + fn: preventOverflow, + requiresIfExists: ["offset"] +}; + +// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js +function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } +} + +// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js +function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; +} +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078 + isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} + +// node_modules/@popperjs/core/lib/utils/orderModifiers.js +function order(modifiers2) { + var map2 = /* @__PURE__ */ new Map(); + var visited = /* @__PURE__ */ new Set(); + var result = []; + modifiers2.forEach(function(modifier) { + map2.set(modifier.name, modifier); + }); + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function(dep) { + if (!visited.has(dep)) { + var depModifier = map2.get(dep); + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + modifiers2.forEach(function(modifier) { + if (!visited.has(modifier.name)) { + sort(modifier); + } + }); + return result; +} +function orderModifiers(modifiers2) { + var orderedModifiers = order(modifiers2); + return modifierPhases.reduce(function(acc, phase) { + return acc.concat(orderedModifiers.filter(function(modifier) { + return modifier.phase === phase; + })); + }, []); +} + +// node_modules/@popperjs/core/lib/utils/debounce.js +function debounce(fn2) { + var pending; + return function() { + if (!pending) { + pending = new Promise(function(resolve) { + Promise.resolve().then(function() { + pending = void 0; + resolve(fn2()); + }); + }); + } + return pending; + }; +} + +// node_modules/@popperjs/core/lib/utils/mergeByName.js +function mergeByName(modifiers2) { + var merged = modifiers2.reduce(function(merged2, current) { + var existing = merged2[current.name]; + merged2[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged2; + }, {}); + return Object.keys(merged).map(function(key) { + return merged[key]; + }); +} + +// node_modules/@popperjs/core/lib/createPopper.js +var DEFAULT_OPTIONS = { + placement: "bottom", + modifiers: [], + strategy: "absolute" +}; +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return !args.some(function(element) { + return !(element && typeof element.getBoundingClientRect === "function"); + }); +} +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper2(reference2, popper2, options) { + if (options === void 0) { + options = defaultOptions; + } + var state = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference2, + popper: popper2 + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state, + setOptions: function setOptions(setOptionsAction) { + var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options2); + state.scrollParents = { + reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], + popper: listScrollParents(popper2) + }; + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); + state.orderedModifiers = orderedModifiers.filter(function(m) { + return m.enabled; + }); + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; + if (!areValidElements(reference3, popper3)) { + return; + } + state.rects = { + reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), + popper: getLayoutRect(popper3) + }; + state.reset = false; + state.placement = state.options.placement; + state.orderedModifiers.forEach(function(modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; + if (typeof fn2 === "function") { + state = fn2({ + state, + options: _options, + name, + instance + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: debounce(function() { + return new Promise(function(resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + if (!areValidElements(reference2, popper2)) { + return instance; + } + instance.setOptions(options).then(function(state2) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state2); + } + }); + function runModifierEffects() { + state.orderedModifiers.forEach(function(_ref) { + var name = _ref.name, _ref$options = _ref.options, options2 = _ref$options === void 0 ? {} : _ref$options, effect5 = _ref.effect; + if (typeof effect5 === "function") { + var cleanupFn = effect5({ + state, + name, + instance, + options: options2 + }); + var noopFn = function noopFn2() { + }; + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + function cleanupModifierEffects() { + effectCleanupFns.forEach(function(fn2) { + return fn2(); + }); + effectCleanupFns = []; + } + return instance; + }; +} + +// node_modules/@popperjs/core/lib/popper.js +var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default]; +var createPopper = /* @__PURE__ */ popperGenerator({ + defaultModifiers +}); + +// node_modules/tippy.js/dist/tippy.esm.js +var BOX_CLASS = "tippy-box"; +var CONTENT_CLASS = "tippy-content"; +var BACKDROP_CLASS = "tippy-backdrop"; +var ARROW_CLASS = "tippy-arrow"; +var SVG_ARROW_CLASS = "tippy-svg-arrow"; +var TOUCH_OPTIONS = { + passive: true, + capture: true +}; +var TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO2() { + return document.body; +}; +function hasOwnProperty(obj, key) { + return {}.hasOwnProperty.call(obj, key); +} +function getValueAtIndexOrReturn(value, index, defaultValue) { + if (Array.isArray(value)) { + var v = value[index]; + return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v; + } + return value; +} +function isType(value, type) { + var str = {}.toString.call(value); + return str.indexOf("[object") === 0 && str.indexOf(type + "]") > -1; +} +function invokeWithArgsOrReturn(value, args) { + return typeof value === "function" ? value.apply(void 0, args) : value; +} +function debounce2(fn2, ms) { + if (ms === 0) { + return fn2; + } + var timeout; + return function(arg) { + clearTimeout(timeout); + timeout = setTimeout(function() { + fn2(arg); + }, ms); + }; +} +function removeProperties(obj, keys2) { + var clone = Object.assign({}, obj); + keys2.forEach(function(key) { + delete clone[key]; + }); + return clone; +} +function splitBySpaces(value) { + return value.split(/\s+/).filter(Boolean); +} +function normalizeToArray(value) { + return [].concat(value); +} +function pushIfUnique(arr, value) { + if (arr.indexOf(value) === -1) { + arr.push(value); + } +} +function unique(arr) { + return arr.filter(function(item, index) { + return arr.indexOf(item) === index; + }); +} +function getBasePlacement2(placement) { + return placement.split("-")[0]; +} +function arrayFrom(value) { + return [].slice.call(value); +} +function removeUndefinedProps(obj) { + return Object.keys(obj).reduce(function(acc, key) { + if (obj[key] !== void 0) { + acc[key] = obj[key]; + } + return acc; + }, {}); +} +function div() { + return document.createElement("div"); +} +function isElement2(value) { + return ["Element", "Fragment"].some(function(type) { + return isType(value, type); + }); +} +function isNodeList(value) { + return isType(value, "NodeList"); +} +function isMouseEvent(value) { + return isType(value, "MouseEvent"); +} +function isReferenceElement(value) { + return !!(value && value._tippy && value._tippy.reference === value); +} +function getArrayOfElements(value) { + if (isElement2(value)) { + return [value]; + } + if (isNodeList(value)) { + return arrayFrom(value); + } + if (Array.isArray(value)) { + return value; + } + return arrayFrom(document.querySelectorAll(value)); +} +function setTransitionDuration(els, value) { + els.forEach(function(el) { + if (el) { + el.style.transitionDuration = value + "ms"; + } + }); +} +function setVisibilityState(els, state) { + els.forEach(function(el) { + if (el) { + el.setAttribute("data-state", state); + } + }); +} +function getOwnerDocument(elementOrElements) { + var _element$ownerDocumen; + var _normalizeToArray = normalizeToArray(elementOrElements), element = _normalizeToArray[0]; + return element != null && (_element$ownerDocumen = element.ownerDocument) != null && _element$ownerDocumen.body ? element.ownerDocument : document; +} +function isCursorOutsideInteractiveBorder(popperTreeData, event) { + var clientX = event.clientX, clientY = event.clientY; + return popperTreeData.every(function(_ref) { + var popperRect = _ref.popperRect, popperState = _ref.popperState, props = _ref.props; + var interactiveBorder = props.interactiveBorder; + var basePlacement = getBasePlacement2(popperState.placement); + var offsetData = popperState.modifiersData.offset; + if (!offsetData) { + return true; + } + var topDistance = basePlacement === "bottom" ? offsetData.top.y : 0; + var bottomDistance = basePlacement === "top" ? offsetData.bottom.y : 0; + var leftDistance = basePlacement === "right" ? offsetData.left.x : 0; + var rightDistance = basePlacement === "left" ? offsetData.right.x : 0; + var exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder; + var exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder; + var exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder; + var exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder; + return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight; + }); +} +function updateTransitionEndListener(box, action, listener) { + var method = action + "EventListener"; + ["transitionend", "webkitTransitionEnd"].forEach(function(event) { + box[method](event, listener); + }); +} +function actualContains(parent, child) { + var target = child; + while (target) { + var _target$getRootNode; + if (parent.contains(target)) { + return true; + } + target = target.getRootNode == null ? void 0 : (_target$getRootNode = target.getRootNode()) == null ? void 0 : _target$getRootNode.host; + } + return false; +} +var currentInput = { + isTouch: false +}; +var lastMouseMoveTime = 0; +function onDocumentTouchStart() { + if (currentInput.isTouch) { + return; + } + currentInput.isTouch = true; + if (window.performance) { + document.addEventListener("mousemove", onDocumentMouseMove); + } +} +function onDocumentMouseMove() { + var now = performance.now(); + if (now - lastMouseMoveTime < 20) { + currentInput.isTouch = false; + document.removeEventListener("mousemove", onDocumentMouseMove); + } + lastMouseMoveTime = now; +} +function onWindowBlur() { + var activeElement = document.activeElement; + if (isReferenceElement(activeElement)) { + var instance = activeElement._tippy; + if (activeElement.blur && !instance.state.isVisible) { + activeElement.blur(); + } + } +} +function bindGlobalEventListeners() { + document.addEventListener("touchstart", onDocumentTouchStart, TOUCH_OPTIONS); + window.addEventListener("blur", onWindowBlur); +} +var isBrowser = typeof window !== "undefined" && typeof document !== "undefined"; +var isIE11 = isBrowser ? ( + // @ts-ignore + !!window.msCrypto +) : false; +function createMemoryLeakWarning(method) { + var txt = method === "destroy" ? "n already-" : " "; + return [method + "() was called on a" + txt + "destroyed instance. This is a no-op but", "indicates a potential memory leak."].join(" "); +} +function clean(value) { + var spacesAndTabs = /[ \t]{2,}/g; + var lineStartWithSpaces = /^[ \t]*/gm; + return value.replace(spacesAndTabs, " ").replace(lineStartWithSpaces, "").trim(); +} +function getDevMessage(message) { + return clean("\n %ctippy.js\n\n %c" + clean(message) + "\n\n %c\u{1F477}\u200D This is a development-only message. It will be removed in production.\n "); +} +function getFormattedMessage(message) { + return [ + getDevMessage(message), + // title + "color: #00C584; font-size: 1.3em; font-weight: bold;", + // message + "line-height: 1.5", + // footer + "color: #a6a095;" + ]; +} +var visitedMessages; +if (true) { + resetVisitedMessages(); +} +function resetVisitedMessages() { + visitedMessages = /* @__PURE__ */ new Set(); +} +function warnWhen(condition, message) { + if (condition && !visitedMessages.has(message)) { + var _console; + visitedMessages.add(message); + (_console = console).warn.apply(_console, getFormattedMessage(message)); + } +} +function errorWhen(condition, message) { + if (condition && !visitedMessages.has(message)) { + var _console2; + visitedMessages.add(message); + (_console2 = console).error.apply(_console2, getFormattedMessage(message)); + } +} +function validateTargets(targets) { + var didPassFalsyValue = !targets; + var didPassPlainObject = Object.prototype.toString.call(targets) === "[object Object]" && !targets.addEventListener; + errorWhen(didPassFalsyValue, ["tippy() was passed", "`" + String(targets) + "`", "as its targets (first) argument. Valid types are: String, Element,", "Element[], or NodeList."].join(" ")); + errorWhen(didPassPlainObject, ["tippy() was passed a plain object which is not supported as an argument", "for virtual positioning. Use props.getReferenceClientRect instead."].join(" ")); +} +var pluginProps = { + animateFill: false, + followCursor: false, + inlinePositioning: false, + sticky: false +}; +var renderProps = { + allowHTML: false, + animation: "fade", + arrow: true, + content: "", + inertia: false, + maxWidth: 350, + role: "tooltip", + theme: "", + zIndex: 9999 +}; +var defaultProps = Object.assign({ + appendTo: TIPPY_DEFAULT_APPEND_TO, + aria: { + content: "auto", + expanded: "auto" + }, + delay: 0, + duration: [300, 250], + getReferenceClientRect: null, + hideOnClick: true, + ignoreAttributes: false, + interactive: false, + interactiveBorder: 2, + interactiveDebounce: 0, + moveTransition: "", + offset: [0, 10], + onAfterUpdate: function onAfterUpdate() { + }, + onBeforeUpdate: function onBeforeUpdate() { + }, + onCreate: function onCreate() { + }, + onDestroy: function onDestroy() { + }, + onHidden: function onHidden() { + }, + onHide: function onHide() { + }, + onMount: function onMount() { + }, + onShow: function onShow() { + }, + onShown: function onShown() { + }, + onTrigger: function onTrigger() { + }, + onUntrigger: function onUntrigger() { + }, + onClickOutside: function onClickOutside() { + }, + placement: "top", + plugins: [], + popperOptions: {}, + render: null, + showOnCreate: false, + touch: true, + trigger: "mouseenter focus", + triggerTarget: null +}, pluginProps, renderProps); +var defaultKeys = Object.keys(defaultProps); +var setDefaultProps = function setDefaultProps2(partialProps) { + if (true) { + validateProps(partialProps, []); + } + var keys2 = Object.keys(partialProps); + keys2.forEach(function(key) { + defaultProps[key] = partialProps[key]; + }); +}; +function getExtendedPassedProps(passedProps) { + var plugins = passedProps.plugins || []; + var pluginProps2 = plugins.reduce(function(acc, plugin) { + var name = plugin.name, defaultValue = plugin.defaultValue; + if (name) { + var _name; + acc[name] = passedProps[name] !== void 0 ? passedProps[name] : (_name = defaultProps[name]) != null ? _name : defaultValue; + } + return acc; + }, {}); + return Object.assign({}, passedProps, pluginProps2); +} +function getDataAttributeProps(reference2, plugins) { + var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, { + plugins + }))) : defaultKeys; + var props = propKeys.reduce(function(acc, key) { + var valueAsString = (reference2.getAttribute("data-tippy-" + key) || "").trim(); + if (!valueAsString) { + return acc; + } + if (key === "content") { + acc[key] = valueAsString; + } else { + try { + acc[key] = JSON.parse(valueAsString); + } catch (e) { + acc[key] = valueAsString; + } + } + return acc; + }, {}); + return props; +} +function evaluateProps(reference2, props) { + var out = Object.assign({}, props, { + content: invokeWithArgsOrReturn(props.content, [reference2]) + }, props.ignoreAttributes ? {} : getDataAttributeProps(reference2, props.plugins)); + out.aria = Object.assign({}, defaultProps.aria, out.aria); + out.aria = { + expanded: out.aria.expanded === "auto" ? props.interactive : out.aria.expanded, + content: out.aria.content === "auto" ? props.interactive ? null : "describedby" : out.aria.content + }; + return out; +} +function validateProps(partialProps, plugins) { + if (partialProps === void 0) { + partialProps = {}; + } + if (plugins === void 0) { + plugins = []; + } + var keys2 = Object.keys(partialProps); + keys2.forEach(function(prop) { + var nonPluginProps = removeProperties(defaultProps, Object.keys(pluginProps)); + var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop); + if (didPassUnknownProp) { + didPassUnknownProp = plugins.filter(function(plugin) { + return plugin.name === prop; + }).length === 0; + } + warnWhen(didPassUnknownProp, ["`" + prop + "`", "is not a valid prop. You may have spelled it incorrectly, or if it's", "a plugin, forgot to pass it in an array as props.plugins.", "\n\n", "All props: https://atomiks.github.io/tippyjs/v6/all-props/\n", "Plugins: https://atomiks.github.io/tippyjs/v6/plugins/"].join(" ")); + }); +} +var innerHTML = function innerHTML2() { + return "innerHTML"; +}; +function dangerouslySetInnerHTML(element, html) { + element[innerHTML()] = html; +} +function createArrowElement(value) { + var arrow4 = div(); + if (value === true) { + arrow4.className = ARROW_CLASS; + } else { + arrow4.className = SVG_ARROW_CLASS; + if (isElement2(value)) { + arrow4.appendChild(value); + } else { + dangerouslySetInnerHTML(arrow4, value); + } + } + return arrow4; +} +function setContent2(content, props) { + if (isElement2(props.content)) { + dangerouslySetInnerHTML(content, ""); + content.appendChild(props.content); + } else if (typeof props.content !== "function") { + if (props.allowHTML) { + dangerouslySetInnerHTML(content, props.content); + } else { + content.textContent = props.content; + } + } +} +function getChildren(popper2) { + var box = popper2.firstElementChild; + var boxChildren = arrayFrom(box.children); + return { + box, + content: boxChildren.find(function(node) { + return node.classList.contains(CONTENT_CLASS); + }), + arrow: boxChildren.find(function(node) { + return node.classList.contains(ARROW_CLASS) || node.classList.contains(SVG_ARROW_CLASS); + }), + backdrop: boxChildren.find(function(node) { + return node.classList.contains(BACKDROP_CLASS); + }) + }; +} +function render(instance) { + var popper2 = div(); + var box = div(); + box.className = BOX_CLASS; + box.setAttribute("data-state", "hidden"); + box.setAttribute("tabindex", "-1"); + var content = div(); + content.className = CONTENT_CLASS; + content.setAttribute("data-state", "hidden"); + setContent2(content, instance.props); + popper2.appendChild(box); + box.appendChild(content); + onUpdate(instance.props, instance.props); + function onUpdate(prevProps, nextProps) { + var _getChildren = getChildren(popper2), box2 = _getChildren.box, content2 = _getChildren.content, arrow4 = _getChildren.arrow; + if (nextProps.theme) { + box2.setAttribute("data-theme", nextProps.theme); + } else { + box2.removeAttribute("data-theme"); + } + if (typeof nextProps.animation === "string") { + box2.setAttribute("data-animation", nextProps.animation); + } else { + box2.removeAttribute("data-animation"); + } + if (nextProps.inertia) { + box2.setAttribute("data-inertia", ""); + } else { + box2.removeAttribute("data-inertia"); + } + box2.style.maxWidth = typeof nextProps.maxWidth === "number" ? nextProps.maxWidth + "px" : nextProps.maxWidth; + if (nextProps.role) { + box2.setAttribute("role", nextProps.role); + } else { + box2.removeAttribute("role"); + } + if (prevProps.content !== nextProps.content || prevProps.allowHTML !== nextProps.allowHTML) { + setContent2(content2, instance.props); + } + if (nextProps.arrow) { + if (!arrow4) { + box2.appendChild(createArrowElement(nextProps.arrow)); + } else if (prevProps.arrow !== nextProps.arrow) { + box2.removeChild(arrow4); + box2.appendChild(createArrowElement(nextProps.arrow)); + } + } else if (arrow4) { + box2.removeChild(arrow4); + } + } + return { + popper: popper2, + onUpdate + }; +} +render.$$tippy = true; +var idCounter = 1; +var mouseMoveListeners = []; +var mountedInstances = []; +function createTippy(reference2, passedProps) { + var props = evaluateProps(reference2, Object.assign({}, defaultProps, getExtendedPassedProps(removeUndefinedProps(passedProps)))); + var showTimeout; + var hideTimeout; + var scheduleHideAnimationFrame; + var isVisibleFromClick = false; + var didHideDueToDocumentMouseDown = false; + var didTouchMove = false; + var ignoreOnFirstUpdate = false; + var lastTriggerEvent; + var currentTransitionEndListener; + var onFirstUpdate; + var listeners = []; + var debouncedOnMouseMove = debounce2(onMouseMove, props.interactiveDebounce); + var currentTarget; + var id = idCounter++; + var popperInstance = null; + var plugins = unique(props.plugins); + var state = { + // Is the instance currently enabled? + isEnabled: true, + // Is the tippy currently showing and not transitioning out? + isVisible: false, + // Has the instance been destroyed? + isDestroyed: false, + // Is the tippy currently mounted to the DOM? + isMounted: false, + // Has the tippy finished transitioning in? + isShown: false + }; + var instance = { + // properties + id, + reference: reference2, + popper: div(), + popperInstance, + props, + state, + plugins, + // methods + clearDelayTimeouts, + setProps, + setContent: setContent3, + show, + hide: hide2, + hideWithInteractivity, + enable, + disable, + unmount, + destroy + }; + if (!props.render) { + if (true) { + errorWhen(true, "render() function has not been supplied."); + } + return instance; + } + var _props$render = props.render(instance), popper2 = _props$render.popper, onUpdate = _props$render.onUpdate; + popper2.setAttribute("data-tippy-root", ""); + popper2.id = "tippy-" + instance.id; + instance.popper = popper2; + reference2._tippy = instance; + popper2._tippy = instance; + var pluginsHooks = plugins.map(function(plugin) { + return plugin.fn(instance); + }); + var hasAriaExpanded = reference2.hasAttribute("aria-expanded"); + addListeners(); + handleAriaExpandedAttribute(); + handleStyles(); + invokeHook("onCreate", [instance]); + if (props.showOnCreate) { + scheduleShow(); + } + popper2.addEventListener("mouseenter", function() { + if (instance.props.interactive && instance.state.isVisible) { + instance.clearDelayTimeouts(); + } + }); + popper2.addEventListener("mouseleave", function() { + if (instance.props.interactive && instance.props.trigger.indexOf("mouseenter") >= 0) { + getDocument().addEventListener("mousemove", debouncedOnMouseMove); + } + }); + return instance; + function getNormalizedTouchSettings() { + var touch = instance.props.touch; + return Array.isArray(touch) ? touch : [touch, 0]; + } + function getIsCustomTouchBehavior() { + return getNormalizedTouchSettings()[0] === "hold"; + } + function getIsDefaultRenderFn() { + var _instance$props$rende; + return !!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy); + } + function getCurrentTarget() { + return currentTarget || reference2; + } + function getDocument() { + var parent = getCurrentTarget().parentNode; + return parent ? getOwnerDocument(parent) : document; + } + function getDefaultTemplateChildren() { + return getChildren(popper2); + } + function getDelay(isShow) { + if (instance.state.isMounted && !instance.state.isVisible || currentInput.isTouch || lastTriggerEvent && lastTriggerEvent.type === "focus") { + return 0; + } + return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay); + } + function handleStyles(fromHide) { + if (fromHide === void 0) { + fromHide = false; + } + popper2.style.pointerEvents = instance.props.interactive && !fromHide ? "" : "none"; + popper2.style.zIndex = "" + instance.props.zIndex; + } + function invokeHook(hook, args, shouldInvokePropsHook) { + if (shouldInvokePropsHook === void 0) { + shouldInvokePropsHook = true; + } + pluginsHooks.forEach(function(pluginHooks) { + if (pluginHooks[hook]) { + pluginHooks[hook].apply(pluginHooks, args); + } + }); + if (shouldInvokePropsHook) { + var _instance$props; + (_instance$props = instance.props)[hook].apply(_instance$props, args); + } + } + function handleAriaContentAttribute() { + var aria = instance.props.aria; + if (!aria.content) { + return; + } + var attr = "aria-" + aria.content; + var id2 = popper2.id; + var nodes = normalizeToArray(instance.props.triggerTarget || reference2); + nodes.forEach(function(node) { + var currentValue = node.getAttribute(attr); + if (instance.state.isVisible) { + node.setAttribute(attr, currentValue ? currentValue + " " + id2 : id2); + } else { + var nextValue = currentValue && currentValue.replace(id2, "").trim(); + if (nextValue) { + node.setAttribute(attr, nextValue); + } else { + node.removeAttribute(attr); + } + } + }); + } + function handleAriaExpandedAttribute() { + if (hasAriaExpanded || !instance.props.aria.expanded) { + return; + } + var nodes = normalizeToArray(instance.props.triggerTarget || reference2); + nodes.forEach(function(node) { + if (instance.props.interactive) { + node.setAttribute("aria-expanded", instance.state.isVisible && node === getCurrentTarget() ? "true" : "false"); + } else { + node.removeAttribute("aria-expanded"); + } + }); + } + function cleanupInteractiveMouseListeners() { + getDocument().removeEventListener("mousemove", debouncedOnMouseMove); + mouseMoveListeners = mouseMoveListeners.filter(function(listener) { + return listener !== debouncedOnMouseMove; + }); + } + function onDocumentPress(event) { + if (currentInput.isTouch) { + if (didTouchMove || event.type === "mousedown") { + return; + } + } + var actualTarget = event.composedPath && event.composedPath()[0] || event.target; + if (instance.props.interactive && actualContains(popper2, actualTarget)) { + return; + } + if (normalizeToArray(instance.props.triggerTarget || reference2).some(function(el) { + return actualContains(el, actualTarget); + })) { + if (currentInput.isTouch) { + return; + } + if (instance.state.isVisible && instance.props.trigger.indexOf("click") >= 0) { + return; + } + } else { + invokeHook("onClickOutside", [instance, event]); + } + if (instance.props.hideOnClick === true) { + instance.clearDelayTimeouts(); + instance.hide(); + didHideDueToDocumentMouseDown = true; + setTimeout(function() { + didHideDueToDocumentMouseDown = false; + }); + if (!instance.state.isMounted) { + removeDocumentPress(); + } + } + } + function onTouchMove() { + didTouchMove = true; + } + function onTouchStart() { + didTouchMove = false; + } + function addDocumentPress() { + var doc3 = getDocument(); + doc3.addEventListener("mousedown", onDocumentPress, true); + doc3.addEventListener("touchend", onDocumentPress, TOUCH_OPTIONS); + doc3.addEventListener("touchstart", onTouchStart, TOUCH_OPTIONS); + doc3.addEventListener("touchmove", onTouchMove, TOUCH_OPTIONS); + } + function removeDocumentPress() { + var doc3 = getDocument(); + doc3.removeEventListener("mousedown", onDocumentPress, true); + doc3.removeEventListener("touchend", onDocumentPress, TOUCH_OPTIONS); + doc3.removeEventListener("touchstart", onTouchStart, TOUCH_OPTIONS); + doc3.removeEventListener("touchmove", onTouchMove, TOUCH_OPTIONS); + } + function onTransitionedOut(duration, callback) { + onTransitionEnd(duration, function() { + if (!instance.state.isVisible && popper2.parentNode && popper2.parentNode.contains(popper2)) { + callback(); + } + }); + } + function onTransitionedIn(duration, callback) { + onTransitionEnd(duration, callback); + } + function onTransitionEnd(duration, callback) { + var box = getDefaultTemplateChildren().box; + function listener(event) { + if (event.target === box) { + updateTransitionEndListener(box, "remove", listener); + callback(); + } + } + if (duration === 0) { + return callback(); + } + updateTransitionEndListener(box, "remove", currentTransitionEndListener); + updateTransitionEndListener(box, "add", listener); + currentTransitionEndListener = listener; + } + function on(eventType, handler, options) { + if (options === void 0) { + options = false; + } + var nodes = normalizeToArray(instance.props.triggerTarget || reference2); + nodes.forEach(function(node) { + node.addEventListener(eventType, handler, options); + listeners.push({ + node, + eventType, + handler, + options + }); + }); + } + function addListeners() { + if (getIsCustomTouchBehavior()) { + on("touchstart", onTrigger2, { + passive: true + }); + on("touchend", onMouseLeave, { + passive: true + }); + } + splitBySpaces(instance.props.trigger).forEach(function(eventType) { + if (eventType === "manual") { + return; + } + on(eventType, onTrigger2); + switch (eventType) { + case "mouseenter": + on("mouseleave", onMouseLeave); + break; + case "focus": + on(isIE11 ? "focusout" : "blur", onBlurOrFocusOut); + break; + case "focusin": + on("focusout", onBlurOrFocusOut); + break; + } + }); + } + function removeListeners() { + listeners.forEach(function(_ref) { + var node = _ref.node, eventType = _ref.eventType, handler = _ref.handler, options = _ref.options; + node.removeEventListener(eventType, handler, options); + }); + listeners = []; + } + function onTrigger2(event) { + var _lastTriggerEvent; + var shouldScheduleClickHide = false; + if (!instance.state.isEnabled || isEventListenerStopped(event) || didHideDueToDocumentMouseDown) { + return; + } + var wasFocused = ((_lastTriggerEvent = lastTriggerEvent) == null ? void 0 : _lastTriggerEvent.type) === "focus"; + lastTriggerEvent = event; + currentTarget = event.currentTarget; + handleAriaExpandedAttribute(); + if (!instance.state.isVisible && isMouseEvent(event)) { + mouseMoveListeners.forEach(function(listener) { + return listener(event); + }); + } + if (event.type === "click" && (instance.props.trigger.indexOf("mouseenter") < 0 || isVisibleFromClick) && instance.props.hideOnClick !== false && instance.state.isVisible) { + shouldScheduleClickHide = true; + } else { + scheduleShow(event); + } + if (event.type === "click") { + isVisibleFromClick = !shouldScheduleClickHide; + } + if (shouldScheduleClickHide && !wasFocused) { + scheduleHide(event); + } + } + function onMouseMove(event) { + var target = event.target; + var isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper2.contains(target); + if (event.type === "mousemove" && isCursorOverReferenceOrPopper) { + return; + } + var popperTreeData = getNestedPopperTree().concat(popper2).map(function(popper3) { + var _instance$popperInsta; + var instance2 = popper3._tippy; + var state2 = (_instance$popperInsta = instance2.popperInstance) == null ? void 0 : _instance$popperInsta.state; + if (state2) { + return { + popperRect: popper3.getBoundingClientRect(), + popperState: state2, + props + }; + } + return null; + }).filter(Boolean); + if (isCursorOutsideInteractiveBorder(popperTreeData, event)) { + cleanupInteractiveMouseListeners(); + scheduleHide(event); + } + } + function onMouseLeave(event) { + var shouldBail = isEventListenerStopped(event) || instance.props.trigger.indexOf("click") >= 0 && isVisibleFromClick; + if (shouldBail) { + return; + } + if (instance.props.interactive) { + instance.hideWithInteractivity(event); + return; + } + scheduleHide(event); + } + function onBlurOrFocusOut(event) { + if (instance.props.trigger.indexOf("focusin") < 0 && event.target !== getCurrentTarget()) { + return; + } + if (instance.props.interactive && event.relatedTarget && popper2.contains(event.relatedTarget)) { + return; + } + scheduleHide(event); + } + function isEventListenerStopped(event) { + return currentInput.isTouch ? getIsCustomTouchBehavior() !== event.type.indexOf("touch") >= 0 : false; + } + function createPopperInstance() { + destroyPopperInstance(); + var _instance$props2 = instance.props, popperOptions = _instance$props2.popperOptions, placement = _instance$props2.placement, offset2 = _instance$props2.offset, getReferenceClientRect = _instance$props2.getReferenceClientRect, moveTransition = _instance$props2.moveTransition; + var arrow4 = getIsDefaultRenderFn() ? getChildren(popper2).arrow : null; + var computedReference = getReferenceClientRect ? { + getBoundingClientRect: getReferenceClientRect, + contextElement: getReferenceClientRect.contextElement || getCurrentTarget() + } : reference2; + var tippyModifier = { + name: "$$tippy", + enabled: true, + phase: "beforeWrite", + requires: ["computeStyles"], + fn: function fn2(_ref2) { + var state2 = _ref2.state; + if (getIsDefaultRenderFn()) { + var _getDefaultTemplateCh = getDefaultTemplateChildren(), box = _getDefaultTemplateCh.box; + ["placement", "reference-hidden", "escaped"].forEach(function(attr) { + if (attr === "placement") { + box.setAttribute("data-placement", state2.placement); + } else { + if (state2.attributes.popper["data-popper-" + attr]) { + box.setAttribute("data-" + attr, ""); + } else { + box.removeAttribute("data-" + attr); + } + } + }); + state2.attributes.popper = {}; + } + } + }; + var modifiers2 = [{ + name: "offset", + options: { + offset: offset2 + } + }, { + name: "preventOverflow", + options: { + padding: { + top: 2, + bottom: 2, + left: 5, + right: 5 + } + } + }, { + name: "flip", + options: { + padding: 5 + } + }, { + name: "computeStyles", + options: { + adaptive: !moveTransition + } + }, tippyModifier]; + if (getIsDefaultRenderFn() && arrow4) { + modifiers2.push({ + name: "arrow", + options: { + element: arrow4, + padding: 3 + } + }); + } + modifiers2.push.apply(modifiers2, (popperOptions == null ? void 0 : popperOptions.modifiers) || []); + instance.popperInstance = createPopper(computedReference, popper2, Object.assign({}, popperOptions, { + placement, + onFirstUpdate, + modifiers: modifiers2 + })); + } + function destroyPopperInstance() { + if (instance.popperInstance) { + instance.popperInstance.destroy(); + instance.popperInstance = null; + } + } + function mount() { + var appendTo = instance.props.appendTo; + var parentNode2; + var node = getCurrentTarget(); + if (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO || appendTo === "parent") { + parentNode2 = node.parentNode; + } else { + parentNode2 = invokeWithArgsOrReturn(appendTo, [node]); + } + if (!parentNode2.contains(popper2)) { + parentNode2.appendChild(popper2); + } + instance.state.isMounted = true; + createPopperInstance(); + if (true) { + warnWhen(instance.props.interactive && appendTo === defaultProps.appendTo && node.nextElementSibling !== popper2, ["Interactive tippy element may not be accessible via keyboard", "navigation because it is not directly after the reference element", "in the DOM source order.", "\n\n", "Using a wrapper
or tag around the reference element", "solves this by creating a new parentNode context.", "\n\n", "Specifying `appendTo: document.body` silences this warning, but it", "assumes you are using a focus management solution to handle", "keyboard navigation.", "\n\n", "See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity"].join(" ")); + } + } + function getNestedPopperTree() { + return arrayFrom(popper2.querySelectorAll("[data-tippy-root]")); + } + function scheduleShow(event) { + instance.clearDelayTimeouts(); + if (event) { + invokeHook("onTrigger", [instance, event]); + } + addDocumentPress(); + var delay = getDelay(true); + var _getNormalizedTouchSe = getNormalizedTouchSettings(), touchValue = _getNormalizedTouchSe[0], touchDelay = _getNormalizedTouchSe[1]; + if (currentInput.isTouch && touchValue === "hold" && touchDelay) { + delay = touchDelay; + } + if (delay) { + showTimeout = setTimeout(function() { + instance.show(); + }, delay); + } else { + instance.show(); + } + } + function scheduleHide(event) { + instance.clearDelayTimeouts(); + invokeHook("onUntrigger", [instance, event]); + if (!instance.state.isVisible) { + removeDocumentPress(); + return; + } + if (instance.props.trigger.indexOf("mouseenter") >= 0 && instance.props.trigger.indexOf("click") >= 0 && ["mouseleave", "mousemove"].indexOf(event.type) >= 0 && isVisibleFromClick) { + return; + } + var delay = getDelay(false); + if (delay) { + hideTimeout = setTimeout(function() { + if (instance.state.isVisible) { + instance.hide(); + } + }, delay); + } else { + scheduleHideAnimationFrame = requestAnimationFrame(function() { + instance.hide(); + }); + } + } + function enable() { + instance.state.isEnabled = true; + } + function disable() { + instance.hide(); + instance.state.isEnabled = false; + } + function clearDelayTimeouts() { + clearTimeout(showTimeout); + clearTimeout(hideTimeout); + cancelAnimationFrame(scheduleHideAnimationFrame); + } + function setProps(partialProps) { + if (true) { + warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("setProps")); + } + if (instance.state.isDestroyed) { + return; + } + invokeHook("onBeforeUpdate", [instance, partialProps]); + removeListeners(); + var prevProps = instance.props; + var nextProps = evaluateProps(reference2, Object.assign({}, prevProps, removeUndefinedProps(partialProps), { + ignoreAttributes: true + })); + instance.props = nextProps; + addListeners(); + if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) { + cleanupInteractiveMouseListeners(); + debouncedOnMouseMove = debounce2(onMouseMove, nextProps.interactiveDebounce); + } + if (prevProps.triggerTarget && !nextProps.triggerTarget) { + normalizeToArray(prevProps.triggerTarget).forEach(function(node) { + node.removeAttribute("aria-expanded"); + }); + } else if (nextProps.triggerTarget) { + reference2.removeAttribute("aria-expanded"); + } + handleAriaExpandedAttribute(); + handleStyles(); + if (onUpdate) { + onUpdate(prevProps, nextProps); + } + if (instance.popperInstance) { + createPopperInstance(); + getNestedPopperTree().forEach(function(nestedPopper) { + requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate); + }); + } + invokeHook("onAfterUpdate", [instance, partialProps]); + } + function setContent3(content) { + instance.setProps({ + content + }); + } + function show() { + if (true) { + warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("show")); + } + var isAlreadyVisible = instance.state.isVisible; + var isDestroyed = instance.state.isDestroyed; + var isDisabled = !instance.state.isEnabled; + var isTouchAndTouchDisabled = currentInput.isTouch && !instance.props.touch; + var duration = getValueAtIndexOrReturn(instance.props.duration, 0, defaultProps.duration); + if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) { + return; + } + if (getCurrentTarget().hasAttribute("disabled")) { + return; + } + invokeHook("onShow", [instance], false); + if (instance.props.onShow(instance) === false) { + return; + } + instance.state.isVisible = true; + if (getIsDefaultRenderFn()) { + popper2.style.visibility = "visible"; + } + handleStyles(); + addDocumentPress(); + if (!instance.state.isMounted) { + popper2.style.transition = "none"; + } + if (getIsDefaultRenderFn()) { + var _getDefaultTemplateCh2 = getDefaultTemplateChildren(), box = _getDefaultTemplateCh2.box, content = _getDefaultTemplateCh2.content; + setTransitionDuration([box, content], 0); + } + onFirstUpdate = function onFirstUpdate2() { + var _instance$popperInsta2; + if (!instance.state.isVisible || ignoreOnFirstUpdate) { + return; + } + ignoreOnFirstUpdate = true; + void popper2.offsetHeight; + popper2.style.transition = instance.props.moveTransition; + if (getIsDefaultRenderFn() && instance.props.animation) { + var _getDefaultTemplateCh3 = getDefaultTemplateChildren(), _box = _getDefaultTemplateCh3.box, _content = _getDefaultTemplateCh3.content; + setTransitionDuration([_box, _content], duration); + setVisibilityState([_box, _content], "visible"); + } + handleAriaContentAttribute(); + handleAriaExpandedAttribute(); + pushIfUnique(mountedInstances, instance); + (_instance$popperInsta2 = instance.popperInstance) == null ? void 0 : _instance$popperInsta2.forceUpdate(); + invokeHook("onMount", [instance]); + if (instance.props.animation && getIsDefaultRenderFn()) { + onTransitionedIn(duration, function() { + instance.state.isShown = true; + invokeHook("onShown", [instance]); + }); + } + }; + mount(); + } + function hide2() { + if (true) { + warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("hide")); + } + var isAlreadyHidden = !instance.state.isVisible; + var isDestroyed = instance.state.isDestroyed; + var isDisabled = !instance.state.isEnabled; + var duration = getValueAtIndexOrReturn(instance.props.duration, 1, defaultProps.duration); + if (isAlreadyHidden || isDestroyed || isDisabled) { + return; + } + invokeHook("onHide", [instance], false); + if (instance.props.onHide(instance) === false) { + return; + } + instance.state.isVisible = false; + instance.state.isShown = false; + ignoreOnFirstUpdate = false; + isVisibleFromClick = false; + if (getIsDefaultRenderFn()) { + popper2.style.visibility = "hidden"; + } + cleanupInteractiveMouseListeners(); + removeDocumentPress(); + handleStyles(true); + if (getIsDefaultRenderFn()) { + var _getDefaultTemplateCh4 = getDefaultTemplateChildren(), box = _getDefaultTemplateCh4.box, content = _getDefaultTemplateCh4.content; + if (instance.props.animation) { + setTransitionDuration([box, content], duration); + setVisibilityState([box, content], "hidden"); + } + } + handleAriaContentAttribute(); + handleAriaExpandedAttribute(); + if (instance.props.animation) { + if (getIsDefaultRenderFn()) { + onTransitionedOut(duration, instance.unmount); + } + } else { + instance.unmount(); + } + } + function hideWithInteractivity(event) { + if (true) { + warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("hideWithInteractivity")); + } + getDocument().addEventListener("mousemove", debouncedOnMouseMove); + pushIfUnique(mouseMoveListeners, debouncedOnMouseMove); + debouncedOnMouseMove(event); + } + function unmount() { + if (true) { + warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("unmount")); + } + if (instance.state.isVisible) { + instance.hide(); + } + if (!instance.state.isMounted) { + return; + } + destroyPopperInstance(); + getNestedPopperTree().forEach(function(nestedPopper) { + nestedPopper._tippy.unmount(); + }); + if (popper2.parentNode) { + popper2.parentNode.removeChild(popper2); + } + mountedInstances = mountedInstances.filter(function(i) { + return i !== instance; + }); + instance.state.isMounted = false; + invokeHook("onHidden", [instance]); + } + function destroy() { + if (true) { + warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("destroy")); + } + if (instance.state.isDestroyed) { + return; + } + instance.clearDelayTimeouts(); + instance.unmount(); + removeListeners(); + delete reference2._tippy; + instance.state.isDestroyed = true; + invokeHook("onDestroy", [instance]); + } } - -.ProseMirror pre { - white-space: pre-wrap; +function tippy(targets, optionalProps) { + if (optionalProps === void 0) { + optionalProps = {}; + } + var plugins = defaultProps.plugins.concat(optionalProps.plugins || []); + if (true) { + validateTargets(targets); + validateProps(optionalProps, plugins); + } + bindGlobalEventListeners(); + var passedProps = Object.assign({}, optionalProps, { + plugins + }); + var elements = getArrayOfElements(targets); + if (true) { + var isSingleContentElement = isElement2(passedProps.content); + var isMoreThanOneReferenceElement = elements.length > 1; + warnWhen(isSingleContentElement && isMoreThanOneReferenceElement, ["tippy() was passed an Element as the `content` prop, but more than", "one tippy instance was created by this invocation. This means the", "content element will only be appended to the last tippy instance.", "\n\n", "Instead, pass the .innerHTML of the element, or use a function that", "returns a cloned version of the element instead.", "\n\n", "1) content: element.innerHTML\n", "2) content: () => element.cloneNode(true)"].join(" ")); + } + var instances = elements.reduce(function(acc, reference2) { + var instance = reference2 && createTippy(reference2, passedProps); + if (instance) { + acc.push(instance); + } + return acc; + }, []); + return isElement2(targets) ? instances[0] : instances; } +tippy.defaultProps = defaultProps; +tippy.setDefaultProps = setDefaultProps; +tippy.currentInput = currentInput; +var applyStylesModifier = Object.assign({}, applyStyles_default, { + effect: function effect4(_ref) { + var state = _ref.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: "0", + top: "0", + margin: "0" + }, + arrow: { + position: "absolute" + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + } +}); +tippy.setDefaultProps({ + render +}); +var tippy_esm_default = tippy; -img.ProseMirror-separator { - display: inline !important; - border: none !important; - margin: 0 !important; - width: 1px !important; - height: 1px !important; -} +// resources/js/plugins/BubbleMenuPlugin.js +var BubbleMenuView = class { + constructor({ editor, element, view, tippyOptions = {}, updateDelay = 250, shouldShow }) { + __publicField(this, "shouldShow", ({ view, state, from: from2, to }) => { + const { doc: doc3, selection } = state; + const { empty: empty2 } = selection; + const isEmptyTextBlock = !doc3.textBetween(from2, to).length && isTextSelection(state.selection); + const isChildOfMenu = this.element.contains(document.activeElement); + const hasEditorFocus = view.hasFocus() || isChildOfMenu; + return !(!hasEditorFocus || empty2 || isEmptyTextBlock || !this.editor.isEditable); + }); + __publicField(this, "mousedownHandler", () => { + this.preventHide = true; + }); + __publicField(this, "dragstartHandler", () => { + this.hide(); + }); + __publicField(this, "focusHandler", () => { + setTimeout(() => this.update(this.editor.view)); + }); + __publicField(this, "blurHandler", ({ event }) => { + if (this.preventHide) { + this.preventHide = false; + return; + } + if (event?.relatedTarget && this.element.parentNode?.contains(event.relatedTarget)) { + return; + } + this.hide(); + }); + __publicField(this, "tippyBlurHandler", (event) => { + this.blurHandler({ event }); + }); + __publicField(this, "handleDebouncedUpdate", (view, oldState) => { + const selectionChanged = !oldState?.selection.eq(view.state.selection); + const docChanged = !oldState?.doc.eq(view.state.doc); + if (!selectionChanged && !docChanged) { + return; + } + if (this.updateDebounceTimer) { + clearTimeout(this.updateDebounceTimer); + } + this.updateDebounceTimer = window.setTimeout(() => { + this.updateHandler(view, selectionChanged, docChanged, oldState); + }, this.updateDelay); + }); + __publicField(this, "updateHandler", (view, selectionChanged, docChanged, oldState) => { + const { state, composing } = view; + const { selection } = state; + const isSame = !selectionChanged && !docChanged; + if (composing || isSame) { + return; + } + this.createTooltip(); + const { ranges } = selection; + const from2 = Math.min(...ranges.map((range) => range.$from.pos)); + const to = Math.max(...ranges.map((range) => range.$to.pos)); + const shouldShow = this.shouldShow?.({ + editor: this.editor, + view, + state, + oldState, + from: from2, + to + }); + if (!shouldShow) { + this.hide(); + return; + } + if (state.selection.$anchor.pos !== oldState?.selection.$anchor.pos) { + this.update(view, state); + } + this.tippy?.setProps({ + getReferenceClientRect: this.tippyOptions?.getReferenceClientRect || (() => { + if (isNodeSelection(state.selection)) { + let node = view.nodeDOM(from2); + const nodeViewWrapper = node.dataset.nodeViewWrapper ? node : node.querySelector("[data-node-view-wrapper]"); + if (nodeViewWrapper) { + node = nodeViewWrapper.firstChild; + } + if (node) { + return node.getBoundingClientRect(); + } + } + return posToDOMRect(view, from2, to); + }) + }); + this.show(); + }); + this.editor = editor; + this.element = element; + this.view = view; + this.updateDelay = updateDelay; + if (shouldShow) { + this.shouldShow = shouldShow; + } + this.element.addEventListener("mousedown", this.mousedownHandler, { capture: true }); + this.view.dom.addEventListener("dragstart", this.dragstartHandler); + this.editor.on("focus", this.focusHandler); + this.editor.on("blur", this.blurHandler); + this.tippyOptions = tippyOptions; + this.element.style.visibility = "hidden"; + this.element.style.position = "absolute"; + } + createTooltip() { + const { element: editorElement } = this.editor.options; + const editorIsAttached = !!editorElement.parentElement; + if (this.tippy || !editorIsAttached) { + return; + } + this.tippy = tippy_esm_default(editorElement, { + duration: 0, + getReferenceClientRect: null, + content: this.element, + interactive: true, + trigger: "manual", + placement: "top", + hideOnClick: "toggle", + ...this.tippyOptions + }); + if (this.tippy.popper.firstChild) { + this.tippy.popper.firstChild.addEventListener("blur", this.tippyBlurHandler); + } + } + update(view, oldState) { + const { state } = view; + const hasValidSelection = state.selection.$from.pos !== state.selection.$to.pos; + if (this.updateDelay > 0 && hasValidSelection) { + this.handleDebouncedUpdate(view, oldState); + return; + } + const selectionChanged = !oldState?.selection.eq(view.state.selection); + const docChanged = !oldState?.doc.eq(view.state.doc); + this.updateHandler(view, selectionChanged, docChanged, oldState); + } + show() { + this.element.style.position = "relative"; + this.element.style.visibility = "visible"; + this.tippy?.show(); + } + hide() { + this.element.style.position = "absolute"; + this.element.style.visibility = "hidden"; + this.tippy?.hide(); + } + destroy() { + if (this.tippy?.popper.firstChild) { + this.tippy.popper.firstChild.removeEventListener( + "blur", + this.tippyBlurHandler + ); + } + this.tippy?.destroy(); + this.element.removeEventListener("mousedown", this.mousedownHandler, { capture: true }); + this.view.dom.removeEventListener("dragstart", this.dragstartHandler); + this.editor.off("focus", this.focusHandler); + this.editor.off("blur", this.blurHandler); + } +}; +var BubbleMenuPlugin = (options) => { + return new Plugin({ + key: typeof options.pluginKey === "string" ? new PluginKey(options.pluginKey) : options.pluginKey, + view: (view) => new BubbleMenuView({ view, ...options }) + }); +}; -.ProseMirror-gapcursor { - display: none; - pointer-events: none; - position: absolute; - margin: 0; -} +// resources/js/extensions/BubbleMenu.js +var BubbleMenu = Extension.create({ + name: "bubbleMenu", + addOptions() { + return { + element: null, + tippyOptions: {}, + pluginKey: "bubbleMenu", + updateDelay: void 0, + shouldShow: null + }; + }, + addProseMirrorPlugins() { + if (!this.options.element) { + return []; + } + return [ + BubbleMenuPlugin({ + pluginKey: this.options.pluginKey, + editor: this.editor, + element: this.options.element, + tippyOptions: this.options.tippyOptions, + updateDelay: this.options.updateDelay, + shouldShow: this.options.shouldShow + }) + ]; + } +}); -.ProseMirror-gapcursor:after { - content: ""; - display: block; - position: absolute; - top: -2px; - width: 20px; - border-top: 1px solid black; - animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; -} +// resources/js/plugins/FloatingMenuPlugin.js +var FloatingMenuView = class { + constructor({ editor, element, view, tippyOptions = {}, shouldShow }) { + __publicField(this, "shouldShow", ({ view, state }) => { + const { selection } = state; + const { $anchor, empty: empty2 } = selection; + const isRootDepth = $anchor.depth === 1; + const isEmptyTextBlock = $anchor.parent.isTextblock && !$anchor.parent.type.spec.code && !$anchor.parent.textContent; + return !(!view.hasFocus() || !empty2 || !isRootDepth || !isEmptyTextBlock || !this.editor.isEditable); + }); + __publicField(this, "mousedownHandler", () => { + this.preventHide = true; + }); + __publicField(this, "focusHandler", () => { + setTimeout(() => this.update(this.editor.view)); + }); + __publicField(this, "blurHandler", ({ event }) => { + if (this.preventHide) { + this.preventHide = false; + return; + } + if (event?.relatedTarget && this.element.parentNode?.contains(event.relatedTarget)) { + return; + } + this.hide(); + }); + __publicField(this, "tippyBlurHandler", (event) => { + this.blurHandler({ event }); + }); + this.editor = editor; + this.element = element; + this.view = view; + if (shouldShow) { + this.shouldShow = shouldShow; + } + this.element.addEventListener("mousedown", this.mousedownHandler, { capture: true }); + this.editor.on("focus", this.focusHandler); + this.editor.on("blur", this.blurHandler); + this.tippyOptions = tippyOptions; + this.element.style.visibility = "hidden"; + this.element.style.position = "absolute"; + } + createTooltip() { + const { element: editorElement } = this.editor.options; + const editorIsAttached = !!editorElement.parentElement; + if (this.tippy || !editorIsAttached) { + return; + } + this.tippy = tippy_esm_default(editorElement, { + duration: 0, + getReferenceClientRect: null, + content: this.element, + interactive: true, + trigger: "manual", + placement: "right", + hideOnClick: "toggle", + ...this.tippyOptions + }); + if (this.tippy.popper.firstChild) { + this.tippy.popper.firstChild.addEventListener("blur", this.tippyBlurHandler); + } + } + update(view, oldState) { + const { state } = view; + const { doc: doc3, selection } = state; + const { from: from2, to } = selection; + const isSame = oldState && oldState.doc.eq(doc3) && oldState.selection.eq(selection); + if (isSame) { + return; + } + this.createTooltip(); + const shouldShow = this.shouldShow?.({ + editor: this.editor, + view, + state, + oldState + }); + if (!shouldShow) { + this.hide(); + return; + } + this.tippy?.setProps({ + getReferenceClientRect: this.tippyOptions?.getReferenceClientRect || (() => posToDOMRect(view, from2, to)) + }); + this.show(); + } + show() { + this.element.style.position = "relative"; + this.element.style.visibility = "visible"; + this.tippy?.show(); + } + hide() { + this.tippy?.hide(); + } + destroy() { + if (this.tippy?.popper.firstChild) { + this.tippy.popper.firstChild.removeEventListener( + "blur", + this.tippyBlurHandler + ); + } + this.tippy?.destroy(); + this.element.removeEventListener("mousedown", this.mousedownHandler, { capture: true }); + this.editor.off("focus", this.focusHandler); + this.editor.off("blur", this.blurHandler); + } +}; +var FloatingMenuPlugin = (options) => { + return new Plugin({ + key: typeof options.pluginKey === "string" ? new PluginKey(options.pluginKey) : options.pluginKey, + view: (view) => new FloatingMenuView({ view, ...options }) + }); +}; -@keyframes ProseMirror-cursor-blink { - to { - visibility: hidden; +// resources/js/extensions/FloatingMenu.js +var FloatingMenu = Extension.create({ + name: "floatingMenu", + addOptions() { + return { + element: null, + tippyOptions: {}, + pluginKey: "floatingMenu", + shouldShow: null + }; + }, + addProseMirrorPlugins() { + if (!this.options.element) { + return []; + } + return [ + FloatingMenuPlugin({ + pluginKey: this.options.pluginKey, + editor: this.editor, + element: this.options.element, + tippyOptions: this.options.tippyOptions, + shouldShow: this.options.shouldShow + }) + ]; } -} +}); -.ProseMirror-hideselection *::selection { - background: transparent; +// resources/js/extensions/GridBuilder/utils/createBuilderColumn.js +function createBuilderColumn(colType, colSpan, colContent = null) { + if (colContent) { + return colType.createChecked({ "data-col-span": colSpan }, colContent); + } + return colType.createAndFill({ "data-col-span": colSpan }); } -.ProseMirror-hideselection *::-moz-selection { - background: transparent; +// resources/js/extensions/GridBuilder/utils/getGridBuilderNodeTypes.js +function getGridBuilderNodeTypes(schema) { + if (schema.cached.gridBuilderNodeTypes) { + return schema.cached.gridBuilderNodeTypes; + } + const roles = {}; + Object.keys(schema.nodes).forEach((type) => { + const nodeType = schema.nodes[type]; + if (nodeType.spec.gridBuilderRole) { + roles[nodeType.spec.gridBuilderRole] = nodeType; + } + }); + schema.cached.gridBuilderNodeTypes = roles; + return roles; } -.ProseMirror-hideselection * { - caret-color: transparent; +// resources/js/extensions/GridBuilder/utils/createGridBuilder.js +function createGridBuilder(schema, colsCount, type, stackAt, asymmetricLeft, asymmetricRight, colContent) { + const types = getGridBuilderNodeTypes(schema); + const cols = []; + if (type === "asymmetric") { + cols.push(createBuilderColumn(types.builderColumn, asymmetricLeft, colContent)); + cols.push(createBuilderColumn(types.builderColumn, asymmetricRight, colContent)); + } else { + for (let index = 0; index < colsCount; index += 1) { + const col = createBuilderColumn(types.builderColumn, null, colContent); + if (col) { + cols.push(col); + } + } + } + return types.gridBuilder.createChecked({ "data-cols": colsCount, "data-type": type, "data-stack-at": stackAt }, cols); } -.ProseMirror-focused .ProseMirror-gapcursor { - display: block; -} +// resources/js/extensions/GridBuilder/GridBuilder.js +var GridBuilder = Node2.create({ + name: "gridBuilder", + group: "block", + defining: true, + isolating: true, + allowGapCursor: false, + content: "gridBuilderColumn+", + gridBuilderRole: "gridBuilder", + addOptions() { + return { + HTMLAttributes: { + class: "filament-tiptap-grid-builder" + } + }; + }, + addAttributes() { + return { + "data-type": { + default: "responsive", + parseHTML: (element) => element.getAttribute("data-type") + }, + "data-cols": { + default: 2, + parseHTML: (element) => element.getAttribute("data-cols") + }, + "data-stack-at": { + default: "md", + parseHTML: (element) => element.getAttribute("data-stack-at") + }, + "style": { + default: null, + parseHTML: (element) => element.getAttribute("style"), + renderHTML: (attributes) => { + return { + style: `grid-template-columns: repeat(${attributes["data-cols"]}, 1fr);` + }; + } + } + }; + }, + parseHTML() { + return [ + { + tag: "div", + getAttrs: (node) => node.classList.contains("filament-tiptap-grid-builder") && null + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + }, + addCommands() { + return { + insertGridBuilder: ({ cols = 3, type = "responsive", stackAt, asymmetricLeft = null, asymmetricRight = null } = {}) => ({ tr: tr2, dispatch, editor }) => { + const node = createGridBuilder(editor.schema, cols, type, stackAt, asymmetricLeft, asymmetricRight); + if (dispatch) { + const offset2 = tr2.selection.anchor + 1; + tr2.replaceSelectionWith(node).scrollIntoView().setSelection(TextSelection.near(tr2.doc.resolve(offset2))); + } + return true; + } + }; + }, + addKeyboardShortcuts() { + return { + "Mod-Alt-G": () => this.editor.commands.insertGridBuilder() + }; + }, + extendNodeSchema(extension) { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage + }; + return { + gridBuilderRole: callOrReturn(getExtensionField(extension, "gridBuilderRole", context)) + }; + } +}); -.tippy-box[data-animation=fade][data-state=hidden] { - opacity: 0 -}`;function GL(t,e,n){let r=document.querySelector(`style[data-tiptap-style${n?`-${n}`:""}]`);if(r!==null)return r;let i=document.createElement("style");return e&&i.setAttribute("nonce",e),i.setAttribute(`data-tiptap-style${n?`-${n}`:""}`,""),i.innerHTML=t,document.getElementsByTagName("head")[0].appendChild(i),i}var Jl=class extends up{constructor(e={}){super(),this.isFocused=!1,this.extensionStorage={},this.options={element:document.createElement("div"),content:"",injectCSS:!0,injectNonce:void 0,extensions:[],autofocus:!1,editable:!0,editorProps:{},parseOptions:{},enableInputRules:!0,enablePasteRules:!0,enableCoreExtensions:!0,onBeforeCreate:()=>null,onCreate:()=>null,onUpdate:()=>null,onSelectionUpdate:()=>null,onTransaction:()=>null,onFocus:()=>null,onBlur:()=>null,onDestroy:()=>null},this.isCapturingTransaction=!1,this.capturedTransaction=null,this.setOptions(e),this.createExtensionManager(),this.createCommandManager(),this.createSchema(),this.on("beforeCreate",this.options.onBeforeCreate),this.emit("beforeCreate",{editor:this}),this.createView(),this.injectCSS(),this.on("create",this.options.onCreate),this.on("update",this.options.onUpdate),this.on("selectionUpdate",this.options.onSelectionUpdate),this.on("transaction",this.options.onTransaction),this.on("focus",this.options.onFocus),this.on("blur",this.options.onBlur),this.on("destroy",this.options.onDestroy),window.setTimeout(()=>{this.isDestroyed||(this.commands.focus(this.options.autofocus),this.emit("create",{editor:this}))},0)}get storage(){return this.extensionStorage}get commands(){return this.commandManager.commands}chain(){return this.commandManager.chain()}can(){return this.commandManager.can()}injectCSS(){this.options.injectCSS&&document&&(this.css=GL(VL,this.options.injectNonce))}setOptions(e={}){this.options={...this.options,...e},!(!this.view||!this.state||this.isDestroyed)&&(this.options.editorProps&&this.view.setProps(this.options.editorProps),this.view.updateState(this.state))}setEditable(e,n=!0){this.setOptions({editable:e}),n&&this.emit("update",{editor:this,transaction:this.state.tr})}get isEditable(){return this.options.editable&&this.view&&this.view.editable}get state(){return this.view.state}registerPlugin(e,n){let r=xE(n)?n(e,[...this.state.plugins]):[...this.state.plugins,e],i=this.state.reconfigure({plugins:r});this.view.updateState(i)}unregisterPlugin(e){if(this.isDestroyed)return;let n=typeof e=="string"?`${e}$`:e.key,r=this.state.reconfigure({plugins:this.state.plugins.filter(i=>!i.key.startsWith(n))});this.view.updateState(r)}createExtensionManager(){let n=[...this.options.enableCoreExtensions?Object.values(KL):[],...this.options.extensions].filter(r=>["extension","node","mark"].includes(r?.type));this.extensionManager=new pp(n,this)}createCommandManager(){this.commandManager=new Go({editor:this})}createSchema(){this.schema=this.extensionManager.schema}createView(){let e=ME(this.options.content,this.schema,this.options.parseOptions),n=TE(e,this.options.autofocus);this.view=new zl(this.options.element,{...this.options.editorProps,dispatchTransaction:this.dispatchTransaction.bind(this),state:Nl.create({doc:e,selection:n||void 0})});let r=this.state.reconfigure({plugins:this.extensionManager.plugins});this.view.updateState(r),this.createNodeViews(),this.prependClass();let i=this.view.dom;i.editor=this}createNodeViews(){this.view.setProps({nodeViews:this.extensionManager.nodeViews})}prependClass(){this.view.dom.className=`tiptap ${this.view.dom.className}`}captureTransaction(e){this.isCapturingTransaction=!0,e(),this.isCapturingTransaction=!1;let n=this.capturedTransaction;return this.capturedTransaction=null,n}dispatchTransaction(e){if(this.view.isDestroyed)return;if(this.isCapturingTransaction){if(!this.capturedTransaction){this.capturedTransaction=e;return}e.steps.forEach(s=>{var l;return(l=this.capturedTransaction)===null||l===void 0?void 0:l.step(s)});return}let n=this.state.apply(e),r=!this.state.selection.eq(n.selection);this.view.updateState(n),this.emit("transaction",{editor:this,transaction:e}),r&&this.emit("selectionUpdate",{editor:this,transaction:e});let i=e.getMeta("focus"),o=e.getMeta("blur");i&&this.emit("focus",{editor:this,event:i.event,transaction:e}),o&&this.emit("blur",{editor:this,event:o.event,transaction:e}),!(!e.docChanged||e.getMeta("preventUpdate"))&&this.emit("update",{editor:this,transaction:e})}getAttributes(e){return wp(this.state,e)}isActive(e,n){let r=typeof e=="string"?e:null,i=typeof e=="string"?n:e;return Wn(this.state,r,i)}getJSON(){return this.state.doc.toJSON()}getHTML(){return pL(this.state.doc.content,this.schema)}getText(e){let{blockSeparator:n=` +// resources/js/extensions/GridBuilder/GridBuilderColumn.js +var GridBuilderColumn = Node2.create({ + name: "gridBuilderColumn", + content: "block+", + gridBuilderRole: "builderColumn", + isolating: true, + addOptions() { + return { + HTMLAttributes: { + class: "filament-tiptap-grid-builder__column" + } + }; + }, + addAttributes() { + return { + "data-col-span": { + default: 1, + parseHTML: (element) => element.getAttribute("data-col-span") + }, + "style": { + default: null, + parseHTML: (element) => element.getAttribute("style"), + renderHTML: (attributes) => { + let colspan = attributes["data-col-span"]; + return { + style: `grid-column: span ${colspan};` + }; + } + } + }; + }, + parseHTML() { + return [ + { + tag: "div", + getAttrs: (node) => node.classList.contains("filament-tiptap-grid-builder__column") && null + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; + } +}); -`,textSerializers:r={}}=e||{};return hL(this.state.doc,{blockSeparator:n,textSerializers:{...SE(this.schema),...r}})}get isEmpty(){return yL(this.state.doc)}getCharacterCount(){return console.warn('[tiptap warn]: "editor.getCharacterCount()" is deprecated. Please use "editor.storage.characterCount.characters()" instead.'),this.state.doc.content.size-2}destroy(){this.emit("destroy"),this.view&&this.view.destroy(),this.removeAllListeners()}get isDestroyed(){var e;return!(!((e=this.view)===null||e===void 0)&&e.docView)}};function Kn(t){return new qo({find:t.find,handler:({state:e,range:n,match:r})=>{let i=Se(t.getAttributes,void 0,r);if(i===!1||i===null)return null;let{tr:o}=e,s=r[r.length-1],l=r[0];if(s){let u=l.search(/\S/),d=n.from+l.indexOf(s),f=d+s.length;if(nc(n.from,n.to,e.doc).filter(b=>b.mark.type.excluded.find(v=>v===t.type&&v!==b.mark.type)).filter(b=>b.to>d).length)return null;fn.from&&o.delete(n.from+u,d);let m=n.from+u+s.length;o.addMark(n.from+u,m,t.type.create(i||{})),o.removeStoredMark(t.type)}}})}function ic(t){return new qo({find:t.find,handler:({state:e,range:n,match:r})=>{let i=Se(t.getAttributes,void 0,r)||{},{tr:o}=e,s=n.from,l=n.to,u=t.type.create(i);if(r[1]){let d=r[0].lastIndexOf(r[1]),f=s+d;f>l?f=l:l=f+r[1].length;let h=r[0][r[0].length-1];o.insertText(h,s+r[0].length-1),o.replaceWith(f,l,u)}else r[0]&&o.insert(s-1,t.type.create(i)).delete(o.mapping.map(s),o.mapping.map(l));o.scrollIntoView()}})}function ea(t){return new qo({find:t.find,handler:({state:e,range:n,match:r})=>{let i=e.doc.resolve(n.from),o=Se(t.getAttributes,void 0,r)||{};if(!i.node(-1).canReplaceWith(i.index(-1),i.indexAfter(-1),t.type))return null;e.tr.delete(n.from,n.to).setBlockType(n.from,n.from,t.type,o)}})}function bi(t){return new qo({find:t.find,handler:({state:e,range:n,match:r,chain:i})=>{let o=Se(t.getAttributes,void 0,r)||{},s=e.tr.delete(n.from,n.to),u=s.doc.resolve(n.from).blockRange(),d=u&&Po(u,t.type,o);if(!d)return null;if(s.wrap(u,d),t.keepMarks&&t.editor){let{selection:h,storedMarks:m}=e,{splittableMarks:b}=t.editor.extensionManager,y=m||h.$to.parentOffset&&h.$from.marks();if(y){let v=y.filter(x=>b.includes(x.type.name));s.ensureMarks(v)}}if(t.keepAttributes){let h=t.type.name==="bulletList"||t.type.name==="orderedList"?"listItem":"taskList";i().updateAttributes(h,o).run()}let f=s.doc.resolve(n.from-1).nodeBefore;f&&f.type===t.type&&rr(s.doc,n.from-1)&&(!t.joinPredicate||t.joinPredicate(r,f))&&s.join(n.from-1)}})}var tt=class t{constructor(e={}){this.type="mark",this.name="mark",this.parent=null,this.child=null,this.config={name:this.name,defaultOptions:{}},this.config={...this.config,...e},this.name=this.config.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`),this.options=this.config.defaultOptions,this.config.addOptions&&(this.options=Se(ie(this,"addOptions",{name:this.name}))),this.storage=Se(ie(this,"addStorage",{name:this.name,options:this.options}))||{}}static create(e={}){return new t(e)}configure(e={}){let n=this.extend();return n.options=jl(this.options,e),n.storage=Se(ie(n,"addStorage",{name:n.name,options:n.options})),n}extend(e={}){let n=new t(e);return n.parent=this,this.child=n,n.name=e.name?e.name:n.parent.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`),n.options=Se(ie(n,"addOptions",{name:n.name})),n.storage=Se(ie(n,"addStorage",{name:n.name,options:n.options})),n}static handleExit({editor:e,mark:n}){let{tr:r}=e.state,i=e.state.selection.$from;if(i.pos===i.end()){let s=i.marks();if(!!!s.find(d=>d?.type.name===n.name))return!1;let u=s.find(d=>d?.type.name===n.name);return u&&r.removeStoredMark(u),r.insertText(" ",i.pos),e.view.dispatch(r),!0}return!1}},se=class t{constructor(e={}){this.type="node",this.name="node",this.parent=null,this.child=null,this.config={name:this.name,defaultOptions:{}},this.config={...this.config,...e},this.name=this.config.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`),this.options=this.config.defaultOptions,this.config.addOptions&&(this.options=Se(ie(this,"addOptions",{name:this.name}))),this.storage=Se(ie(this,"addStorage",{name:this.name,options:this.options}))||{}}static create(e={}){return new t(e)}configure(e={}){let n=this.extend();return n.options=jl(this.options,e),n.storage=Se(ie(n,"addStorage",{name:n.name,options:n.options})),n}extend(e={}){let n=new t(e);return n.parent=this,this.child=n,n.name=e.name?e.name:n.parent.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`),n.options=Se(ie(n,"addOptions",{name:n.name})),n.storage=Se(ie(n,"addStorage",{name:n.name,options:n.options})),n}};function xn(t){return new fp({find:t.find,handler:({state:e,range:n,match:r,pasteEvent:i})=>{let o=Se(t.getAttributes,void 0,r,i);if(o===!1||o===null)return null;let{tr:s}=e,l=r[r.length-1],u=r[0],d=n.to;if(l){let f=u.search(/\S/),h=n.from+u.indexOf(l),m=h+l.length;if(nc(n.from,n.to,e.doc).filter(y=>y.mark.type.excluded.find(x=>x===t.type&&x!==y.mark.type)).filter(y=>y.to>h).length)return null;mn.from&&s.delete(n.from+f,h),d=n.from+f+l.length,s.addMark(n.from+f,d,t.type.create(o||{})),s.removeStoredMark(t.type)}}})}function OE(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}var qL=/^\s*>\s$/,RE=se.create({name:"blockquote",addOptions(){return{HTMLAttributes:{}}},content:"block+",group:"block",defining:!0,parseHTML(){return[{tag:"blockquote"}]},renderHTML({HTMLAttributes:t}){return["blockquote",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setBlockquote:()=>({commands:t})=>t.wrapIn(this.name),toggleBlockquote:()=>({commands:t})=>t.toggleWrap(this.name),unsetBlockquote:()=>({commands:t})=>t.lift(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-b":()=>this.editor.commands.toggleBlockquote()}},addInputRules(){return[bi({find:qL,type:this.type})]}});var YL=/(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))$/,JL=/(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))/g,XL=/(?:^|\s)((?:__)((?:[^__]+))(?:__))$/,ZL=/(?:^|\s)((?:__)((?:[^__]+))(?:__))/g,IE=tt.create({name:"bold",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"strong"},{tag:"b",getAttrs:t=>t.style.fontWeight!=="normal"&&null},{style:"font-weight",getAttrs:t=>/^(bold(er)?|[5-9]\d{2,})$/.test(t)&&null}]},renderHTML({HTMLAttributes:t}){return["strong",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setBold:()=>({commands:t})=>t.setMark(this.name),toggleBold:()=>({commands:t})=>t.toggleMark(this.name),unsetBold:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-b":()=>this.editor.commands.toggleBold(),"Mod-B":()=>this.editor.commands.toggleBold()}},addInputRules(){return[Kn({find:YL,type:this.type}),Kn({find:XL,type:this.type})]},addPasteRules(){return[xn({find:JL,type:this.type}),xn({find:ZL,type:this.type})]}});var jL=se.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",j(this.options.HTMLAttributes,t),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}}),LE=tt.create({name:"textStyle",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.hasAttribute("style")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["span",j(this.options.HTMLAttributes,t),0]},addCommands(){return{removeEmptyTextStyle:()=>({state:t,commands:e})=>{let n=gi(t,this.type);return Object.entries(n).some(([,i])=>!!i)?!0:e.unsetMark(this.name)}}}}),DE=/^\s*([-+*])\s$/,PE=se.create({name:"bulletList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:"ul"}]},renderHTML({HTMLAttributes:t}){return["ul",j(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleBulletList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(jL.name,this.editor.getAttributes(LE.name)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-8":()=>this.editor.commands.toggleBulletList()}},addInputRules(){let t=bi({find:DE,type:this.type});return(this.options.keepMarks||this.options.keepAttributes)&&(t=bi({find:DE,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:()=>this.editor.getAttributes(LE.name),editor:this.editor})),[t]}});var QL=/(?:^|\s)((?:`)((?:[^`]+))(?:`))$/,eD=/(?:^|\s)((?:`)((?:[^`]+))(?:`))/g,BE=tt.create({name:"code",addOptions(){return{HTMLAttributes:{}}},excludes:"_",code:!0,exitable:!0,parseHTML(){return[{tag:"code"}]},renderHTML({HTMLAttributes:t}){return["code",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setCode:()=>({commands:t})=>t.setMark(this.name),toggleCode:()=>({commands:t})=>t.toggleMark(this.name),unsetCode:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-e":()=>this.editor.commands.toggleCode()}},addInputRules(){return[Kn({find:QL,type:this.type})]},addPasteRules(){return[xn({find:eD,type:this.type})]}});var FE=tt.create({name:"textStyle",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.hasAttribute("style")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["span",j(this.options.HTMLAttributes,t),0]},addCommands(){return{removeEmptyTextStyle:()=>({state:t,commands:e})=>{let n=gi(t,this.type);return Object.entries(n).some(([,i])=>!!i)?!0:e.unsetMark(this.name)}}}});var HE=Je.create({name:"color",addOptions(){return{types:["textStyle"]}},addGlobalAttributes(){return[{types:this.options.types,attributes:{color:{default:null,parseHTML:t=>{var e;return(e=t.style.color)===null||e===void 0?void 0:e.replace(/['"]+/g,"")},renderHTML:t=>t.color?{style:`color: ${t.color}`}:{}}}}]},addCommands(){return{setColor:t=>({chain:e})=>e().setMark("textStyle",{color:t}).run(),unsetColor:()=>({chain:t})=>t().setMark("textStyle",{color:null}).removeEmptyTextStyle().run()}}});var zE=se.create({name:"doc",topNode:!0,content:"block+"});function UE(t={}){return new Pe({view(e){return new xp(e,t)}})}var xp=class{constructor(e,n){var r;this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.width=(r=n.width)!==null&&r!==void 0?r:1,this.color=n.color===!1?void 0:n.color||"black",this.class=n.class,this.handlers=["dragover","dragend","drop","dragleave"].map(i=>{let o=s=>{this[i](s)};return e.dom.addEventListener(i,o),{name:i,handler:o}})}destroy(){this.handlers.forEach(({name:e,handler:n})=>this.editorView.dom.removeEventListener(e,n))}update(e,n){this.cursorPos!=null&&n.doc!=e.state.doc&&(this.cursorPos>e.state.doc.content.size?this.setCursor(null):this.updateOverlay())}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),n=!e.parent.inlineContent,r;if(n){let l=e.nodeBefore,u=e.nodeAfter;if(l||u){let d=this.editorView.nodeDOM(this.cursorPos-(l?l.nodeSize:0));if(d){let f=d.getBoundingClientRect(),h=l?f.bottom:f.top;l&&u&&(h=(h+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2),r={left:f.left,right:f.right,top:h-this.width/2,bottom:h+this.width/2}}}}if(!r){let l=this.editorView.coordsAtPos(this.cursorPos);r={left:l.left-this.width/2,right:l.left+this.width/2,top:l.top,bottom:l.bottom}}let i=this.editorView.dom.offsetParent;this.element||(this.element=i.appendChild(document.createElement("div")),this.class&&(this.element.className=this.class),this.element.style.cssText="position: absolute; z-index: 50; pointer-events: none;",this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle("prosemirror-dropcursor-block",n),this.element.classList.toggle("prosemirror-dropcursor-inline",!n);let o,s;if(!i||i==document.body&&getComputedStyle(i).position=="static")o=-pageXOffset,s=-pageYOffset;else{let l=i.getBoundingClientRect();o=l.left-i.scrollLeft,s=l.top-i.scrollTop}this.element.style.left=r.left-o+"px",this.element.style.top=r.top-s+"px",this.element.style.width=r.right-r.left+"px",this.element.style.height=r.bottom-r.top+"px"}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}dragover(e){if(!this.editorView.editable)return;let n=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),r=n&&n.inside>=0&&this.editorView.state.doc.nodeAt(n.inside),i=r&&r.type.spec.disableDropCursor,o=typeof i=="function"?i(this.editorView,n,e):i;if(n&&!o){let s=n.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let l=Ml(this.editorView.state.doc,s,this.editorView.dragging.slice);l!=null&&(s=l)}this.setCursor(s),this.scheduleRemoval(5e3)}}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){(e.target==this.editorView.dom||!this.editorView.dom.contains(e.relatedTarget))&&this.setCursor(null)}};var $E=Je.create({name:"dropCursor",addOptions(){return{color:"currentColor",width:1,class:void 0}},addProseMirrorPlugins(){return[UE(this.options)]}});var rn=class t extends fe{constructor(e){super(e,e)}map(e,n){let r=e.resolve(n.map(this.head));return t.valid(r)?new t(r):fe.near(r)}content(){return Z.empty}eq(e){return e instanceof t&&e.head==this.head}toJSON(){return{type:"gapcursor",pos:this.head}}static fromJSON(e,n){if(typeof n.pos!="number")throw new RangeError("Invalid input for GapCursor.fromJSON");return new t(e.resolve(n.pos))}getBookmark(){return new _p(this.anchor)}static valid(e){let n=e.parent;if(n.isTextblock||!tD(e)||!nD(e))return!1;let r=n.type.spec.allowGapCursor;if(r!=null)return r;let i=n.contentMatchAt(e.index()).defaultType;return i&&i.isTextblock}static findGapCursorFrom(e,n,r=!1){e:for(;;){if(!r&&t.valid(e))return e;let i=e.pos,o=null;for(let s=e.depth;;s--){let l=e.node(s);if(n>0?e.indexAfter(s)0){o=l.child(n>0?e.indexAfter(s):e.index(s)-1);break}else if(s==0)return null;i+=n;let u=e.doc.resolve(i);if(t.valid(u))return u}for(;;){let s=n>0?o.firstChild:o.lastChild;if(!s){if(o.isAtom&&!o.isText&&!he.isSelectable(o)){e=e.doc.resolve(i+o.nodeSize*n),r=!1;continue e}break}o=s,i+=n;let l=e.doc.resolve(i);if(t.valid(l))return l}return null}}};rn.prototype.visible=!1;rn.findFrom=rn.findGapCursorFrom;fe.jsonID("gapcursor",rn);var _p=class t{constructor(e){this.pos=e}map(e){return new t(e.map(this.pos))}resolve(e){let n=e.resolve(this.pos);return rn.valid(n)?new rn(n):fe.near(n)}};function tD(t){for(let e=t.depth;e>=0;e--){let n=t.index(e),r=t.node(e);if(n==0){if(r.type.spec.isolating)return!0;continue}for(let i=r.child(n-1);;i=i.lastChild){if(i.childCount==0&&!i.inlineContent||i.isAtom||i.type.spec.isolating)return!0;if(i.inlineContent)return!1}}return!0}function nD(t){for(let e=t.depth;e>=0;e--){let n=t.indexAfter(e),r=t.node(e);if(n==r.childCount){if(r.type.spec.isolating)return!0;continue}for(let i=r.child(n);;i=i.firstChild){if(i.childCount==0&&!i.inlineContent||i.isAtom||i.type.spec.isolating)return!0;if(i.inlineContent)return!1}}return!0}function WE(){return new Pe({props:{decorations:sD,createSelectionBetween(t,e,n){return e.pos==n.pos&&rn.valid(n)?new rn(n):null},handleClick:iD,handleKeyDown:rD,handleDOMEvents:{beforeinput:oD}}})}var rD=js({ArrowLeft:oc("horiz",-1),ArrowRight:oc("horiz",1),ArrowUp:oc("vert",-1),ArrowDown:oc("vert",1)});function oc(t,e){let n=t=="vert"?e>0?"down":"up":e>0?"right":"left";return function(r,i,o){let s=r.selection,l=e>0?s.$to:s.$from,u=s.empty;if(s instanceof ce){if(!o.endOfTextblock(n)||l.depth==0)return!1;u=!1,l=r.doc.resolve(e>0?l.after():l.before())}let d=rn.findGapCursorFrom(l,e,u);return d?(i&&i(r.tr.setSelection(new rn(d))),!0):!1}}function iD(t,e,n){if(!t||!t.editable)return!1;let r=t.state.doc.resolve(e);if(!rn.valid(r))return!1;let i=t.posAtCoords({left:n.clientX,top:n.clientY});return i&&i.inside>-1&&he.isSelectable(t.state.doc.nodeAt(i.inside))?!1:(t.dispatch(t.state.tr.setSelection(new rn(r))),!0)}function oD(t,e){if(e.inputType!="insertCompositionText"||!(t.state.selection instanceof rn))return!1;let{$from:n}=t.state.selection,r=n.parent.contentMatchAt(n.index()).findWrapping(t.state.schema.nodes.text);if(!r)return!1;let i=V.empty;for(let s=r.length-1;s>=0;s--)i=V.from(r[s].createAndFill(null,i));let o=t.state.tr.replace(n.pos,n.pos,new Z(i,0,0));return o.setSelection(ce.near(o.doc.resolve(n.pos+1))),t.dispatch(o),!1}function sD(t){if(!(t.selection instanceof rn))return null;let e=document.createElement("div");return e.className="ProseMirror-gapcursor",lt.create(t.doc,[Mt.widget(t.selection.head,e,{key:"gapcursor"})])}var KE=Je.create({name:"gapCursor",addProseMirrorPlugins(){return[WE()]},extendNodeSchema(t){var e;let n={name:t.name,options:t.options,storage:t.storage};return{allowGapCursor:(e=Se(ie(t,"allowGapCursor",n)))!==null&&e!==void 0?e:null}}});var VE=se.create({name:"hardBreak",addOptions(){return{keepMarks:!0,HTMLAttributes:{}}},inline:!0,group:"inline",selectable:!1,parseHTML(){return[{tag:"br"}]},renderHTML({HTMLAttributes:t}){return["br",j(this.options.HTMLAttributes,t)]},renderText(){return` -`},addCommands(){return{setHardBreak:()=>({commands:t,chain:e,state:n,editor:r})=>t.first([()=>t.exitCode(),()=>t.command(()=>{let{selection:i,storedMarks:o}=n;if(i.$from.parent.type.spec.isolating)return!1;let{keepMarks:s}=this.options,{splittableMarks:l}=r.extensionManager,u=o||i.$to.parentOffset&&i.$from.marks();return e().insertContent({type:this.name}).command(({tr:d,dispatch:f})=>{if(f&&u&&s){let h=u.filter(m=>l.includes(m.type.name));d.ensureMarks(h)}return!0}).run()})])}},addKeyboardShortcuts(){return{"Mod-Enter":()=>this.editor.commands.setHardBreak(),"Shift-Enter":()=>this.editor.commands.setHardBreak()}}});var GE=se.create({name:"heading",addOptions(){return{levels:[1,2,3,4,5,6],HTMLAttributes:{}}},content:"inline*",group:"block",defining:!0,addAttributes(){return{level:{default:1,rendered:!1}}},parseHTML(){return this.options.levels.map(t=>({tag:`h${t}`,attrs:{level:t}}))},renderHTML({node:t,HTMLAttributes:e}){return[`h${this.options.levels.includes(t.attrs.level)?t.attrs.level:this.options.levels[0]}`,j(this.options.HTMLAttributes,e),0]},addCommands(){return{setHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.setNode(this.name,t):!1,toggleHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.toggleNode(this.name,"paragraph",t):!1}},addKeyboardShortcuts(){return this.options.levels.reduce((t,e)=>({...t,[`Mod-Alt-${e}`]:()=>this.editor.commands.toggleHeading({level:e})}),{})},addInputRules(){return this.options.levels.map(t=>ea({find:new RegExp(`^(#{1,${t}})\\s$`),type:this.type,getAttributes:{level:t}}))}});var sc=200,Yt=function(){};Yt.prototype.append=function(e){return e.length?(e=Yt.from(e),!this.length&&e||e.length=n?Yt.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,n))};Yt.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)};Yt.prototype.forEach=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length),n<=r?this.forEachInner(e,n,r,0):this.forEachInvertedInner(e,n,r,0)};Yt.prototype.map=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length);var i=[];return this.forEach(function(o,s){return i.push(e(o,s))},n,r),i};Yt.from=function(e){return e instanceof Yt?e:e&&e.length?new qE(e):Yt.empty};var qE=function(t){function e(r){t.call(this),this.values=r}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(i,o){return i==0&&o==this.length?this:new e(this.values.slice(i,o))},e.prototype.getInner=function(i){return this.values[i]},e.prototype.forEachInner=function(i,o,s,l){for(var u=o;u=s;u--)if(i(this.values[u],l+u)===!1)return!1},e.prototype.leafAppend=function(i){if(this.length+i.length<=sc)return new e(this.values.concat(i.flatten()))},e.prototype.leafPrepend=function(i){if(this.length+i.length<=sc)return new e(i.flatten().concat(this.values))},n.length.get=function(){return this.values.length},n.depth.get=function(){return 0},Object.defineProperties(e.prototype,n),e}(Yt);Yt.empty=new qE([]);var aD=function(t){function e(n,r){t.call(this),this.left=n,this.right=r,this.length=n.length+r.length,this.depth=Math.max(n.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(r){return rl&&this.right.forEachInner(r,Math.max(i-l,0),Math.min(this.length,o)-l,s+l)===!1)return!1},e.prototype.forEachInvertedInner=function(r,i,o,s){var l=this.left.length;if(i>l&&this.right.forEachInvertedInner(r,i-l,Math.max(o,l)-l,s+l)===!1||o=o?this.right.slice(r-o,i-o):this.left.slice(r,o).append(this.right.slice(0,i-o))},e.prototype.leafAppend=function(r){var i=this.right.leafAppend(r);if(i)return new e(this.left,i)},e.prototype.leafPrepend=function(r){var i=this.left.leafPrepend(r);if(i)return new e(i,this.right)},e.prototype.appendInner=function(r){return this.left.depth>=Math.max(this.right.depth,r.depth)+1?new e(this.left,new e(this.right,r)):new e(this,r)},e}(Yt),Sp=Yt;var lD=500,ro=class t{constructor(e,n){this.items=e,this.eventCount=n}popEvent(e,n){if(this.eventCount==0)return null;let r=this.items.length;for(;;r--)if(this.items.get(r-1).selection){--r;break}let i,o;n&&(i=this.remapping(r,this.items.length),o=i.maps.length);let s=e.tr,l,u,d=[],f=[];return this.items.forEach((h,m)=>{if(!h.step){i||(i=this.remapping(r,m+1),o=i.maps.length),o--,f.push(h);return}if(i){f.push(new br(h.map));let b=h.step.map(i.slice(o)),y;b&&s.maybeStep(b).doc&&(y=s.mapping.maps[s.mapping.maps.length-1],d.push(new br(y,void 0,void 0,d.length+f.length))),o--,y&&i.appendMap(y,o)}else s.maybeStep(h.step);if(h.selection)return l=i?h.selection.map(i.slice(o)):h.selection,u=new t(this.items.slice(0,r).append(f.reverse().concat(d)),this.eventCount-1),!1},this.items.length,0),{remaining:u,transform:s,selection:l}}addTransform(e,n,r,i){let o=[],s=this.eventCount,l=this.items,u=!i&&l.length?l.get(l.length-1):null;for(let f=0;fuD&&(l=cD(l,d),s-=d),new t(l.append(o),s)}remapping(e,n){let r=new Fs;return this.items.forEach((i,o)=>{let s=i.mirrorOffset!=null&&o-i.mirrorOffset>=e?r.maps.length-i.mirrorOffset:void 0;r.appendMap(i.map,s)},e,n),r}addMaps(e){return this.eventCount==0?this:new t(this.items.append(e.map(n=>new br(n))),this.eventCount)}rebased(e,n){if(!this.eventCount)return this;let r=[],i=Math.max(0,this.items.length-n),o=e.mapping,s=e.steps.length,l=this.eventCount;this.items.forEach(m=>{m.selection&&l--},i);let u=n;this.items.forEach(m=>{let b=o.getMirror(--u);if(b==null)return;s=Math.min(s,b);let y=o.maps[b];if(m.step){let v=e.steps[b].invert(e.docs[b]),x=m.selection&&m.selection.map(o.slice(u+1,b));x&&l++,r.push(new br(y,v,x))}else r.push(new br(y))},i);let d=[];for(let m=n;mlD&&(h=h.compress(this.items.length-r.length)),h}emptyItemCount(){let e=0;return this.items.forEach(n=>{n.step||e++}),e}compress(e=this.items.length){let n=this.remapping(0,e),r=n.maps.length,i=[],o=0;return this.items.forEach((s,l)=>{if(l>=e)i.push(s),s.selection&&o++;else if(s.step){let u=s.step.map(n.slice(r)),d=u&&u.getMap();if(r--,d&&n.appendMap(d,r),u){let f=s.selection&&s.selection.map(n.slice(r));f&&o++;let h=new br(d.invert(),u,f),m,b=i.length-1;(m=i.length&&i[b].merge(h))?i[b]=m:i.push(h)}}else s.map&&r--},this.items.length,0),new t(Sp.from(i.reverse()),o)}};ro.empty=new ro(Sp.empty,0);function cD(t,e){let n;return t.forEach((r,i)=>{if(r.selection&&e--==0)return n=i,!1}),t.slice(n)}var br=class t{constructor(e,n,r,i){this.map=e,this.step=n,this.selection=r,this.mirrorOffset=i}merge(e){if(this.step&&e.step&&!e.selection){let n=e.step.merge(this.step);if(n)return new t(n.getMap().invert(),n,this.selection)}}},yr=class{constructor(e,n,r,i,o){this.done=e,this.undone=n,this.prevRanges=r,this.prevTime=i,this.prevComposition=o}},uD=20;function dD(t,e,n,r){let i=n.getMeta(yi),o;if(i)return i.historyState;n.getMeta(pD)&&(t=new yr(t.done,t.undone,null,0,-1));let s=n.getMeta("appendedTransaction");if(n.steps.length==0)return t;if(s&&s.getMeta(yi))return s.getMeta(yi).redo?new yr(t.done.addTransform(n,void 0,r,ac(e)),t.undone,YE(n.mapping.maps[n.steps.length-1]),t.prevTime,t.prevComposition):new yr(t.done,t.undone.addTransform(n,void 0,r,ac(e)),null,t.prevTime,t.prevComposition);if(n.getMeta("addToHistory")!==!1&&!(s&&s.getMeta("addToHistory")===!1)){let l=n.getMeta("composition"),u=t.prevTime==0||!s&&t.prevComposition!=l&&(t.prevTime<(n.time||0)-r.newGroupDelay||!fD(n,t.prevRanges)),d=s?Tp(t.prevRanges,n.mapping):YE(n.mapping.maps[n.steps.length-1]);return new yr(t.done.addTransform(n,u?e.selection.getBookmark():void 0,r,ac(e)),ro.empty,d,n.time,l??t.prevComposition)}else return(o=n.getMeta("rebased"))?new yr(t.done.rebased(n,o),t.undone.rebased(n,o),Tp(t.prevRanges,n.mapping),t.prevTime,t.prevComposition):new yr(t.done.addMaps(n.mapping.maps),t.undone.addMaps(n.mapping.maps),Tp(t.prevRanges,n.mapping),t.prevTime,t.prevComposition)}function fD(t,e){if(!e)return!1;if(!t.docChanged)return!0;let n=!1;return t.mapping.maps[0].forEach((r,i)=>{for(let o=0;o=e[o]&&(n=!0)}),n}function YE(t){let e=[];return t.forEach((n,r,i,o)=>e.push(i,o)),e}function Tp(t,e){if(!t)return null;let n=[];for(let r=0;r{let n=yi.getState(t);return!n||n.done.eventCount==0?!1:(e&&XE(n,t,e,!1),!0)},kp=(t,e)=>{let n=yi.getState(t);return!n||n.undone.eventCount==0?!1:(e&&XE(n,t,e,!0),!0)};var jE=Je.create({name:"history",addOptions(){return{depth:100,newGroupDelay:500}},addCommands(){return{undo:()=>({state:t,dispatch:e})=>Cp(t,e),redo:()=>({state:t,dispatch:e})=>kp(t,e)}},addProseMirrorPlugins(){return[ZE(this.options)]},addKeyboardShortcuts(){return{"Mod-z":()=>this.editor.commands.undo(),"Mod-Z":()=>this.editor.commands.undo(),"Mod-y":()=>this.editor.commands.redo(),"Mod-Y":()=>this.editor.commands.redo(),"Shift-Mod-z":()=>this.editor.commands.redo(),"Shift-Mod-Z":()=>this.editor.commands.redo(),"Mod-\u044F":()=>this.editor.commands.undo(),"Shift-Mod-\u044F":()=>this.editor.commands.redo()}}});var QE=se.create({name:"horizontalRule",addOptions(){return{HTMLAttributes:{}}},group:"block",parseHTML(){return[{tag:"hr"}]},renderHTML({HTMLAttributes:t}){return["hr",j(this.options.HTMLAttributes,t)]},addCommands(){return{setHorizontalRule:()=>({chain:t,state:e})=>{let{$to:n}=e.selection,r=t();return n.parentOffset===0?r.insertContentAt(Math.max(n.pos-2,0),{type:this.name}):r.insertContent({type:this.name}),r.command(({tr:i,dispatch:o})=>{var s;if(o){let{$to:l}=i.selection,u=l.end();if(l.nodeAfter)l.nodeAfter.isTextblock?i.setSelection(ce.create(i.doc,l.pos+1)):l.nodeAfter.isBlock?i.setSelection(he.create(i.doc,l.pos)):i.setSelection(ce.create(i.doc,l.pos));else{let d=(s=l.parent.type.contentMatch.defaultType)===null||s===void 0?void 0:s.create();d&&(i.insert(u,d),i.setSelection(ce.create(i.doc,u+1)))}i.scrollIntoView()}return!0}).run()}}},addInputRules(){return[ic({find:/^(?:---|—-|___\s|\*\*\*\s)$/,type:this.type})]}});var hD=/(?:^|\s)((?:\*)((?:[^*]+))(?:\*))$/,mD=/(?:^|\s)((?:\*)((?:[^*]+))(?:\*))/g,gD=/(?:^|\s)((?:_)((?:[^_]+))(?:_))$/,bD=/(?:^|\s)((?:_)((?:[^_]+))(?:_))/g,ev=tt.create({name:"italic",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"em"},{tag:"i",getAttrs:t=>t.style.fontStyle!=="normal"&&null},{style:"font-style=italic"}]},renderHTML({HTMLAttributes:t}){return["em",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setItalic:()=>({commands:t})=>t.setMark(this.name),toggleItalic:()=>({commands:t})=>t.toggleMark(this.name),unsetItalic:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-i":()=>this.editor.commands.toggleItalic(),"Mod-I":()=>this.editor.commands.toggleItalic()}},addInputRules(){return[Kn({find:hD,type:this.type}),Kn({find:gD,type:this.type})]},addPasteRules(){return[xn({find:mD,type:this.type}),xn({find:bD,type:this.type})]}});var Ap=se.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",j(this.options.HTMLAttributes,t),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}});var yD=se.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",j(this.options.HTMLAttributes,t),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}}),tv=tt.create({name:"textStyle",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.hasAttribute("style")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["span",j(this.options.HTMLAttributes,t),0]},addCommands(){return{removeEmptyTextStyle:()=>({state:t,commands:e})=>{let n=gi(t,this.type);return Object.entries(n).some(([,i])=>!!i)?!0:e.unsetMark(this.name)}}}}),nv=/^(\d+)\.\s$/,rv=se.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:t=>t.hasAttribute("start")?parseInt(t.getAttribute("start")||"",10):1}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:t}){let{start:e,...n}=t;return e===1?["ol",j(this.options.HTMLAttributes,n),0]:["ol",j(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleOrderedList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(yD.name,this.editor.getAttributes(tv.name)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let t=bi({find:nv,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(t=bi({find:nv,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(tv.name)}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1],editor:this.editor})),[t]}});var lc=se.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:t}){return["p",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setParagraph:()=>({commands:t})=>t.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}});var iv=Je.create({name:"placeholder",addOptions(){return{emptyEditorClass:"is-editor-empty",emptyNodeClass:"is-empty",placeholder:"Write something \u2026",showOnlyWhenEditable:!0,showOnlyCurrent:!0,includeChildren:!1}},addProseMirrorPlugins(){return[new Pe({key:new qe("placeholder"),props:{decorations:({doc:t,selection:e})=>{let n=this.editor.isEditable||!this.options.showOnlyWhenEditable,{anchor:r}=e,i=[];if(!n)return null;let o=t.type.createAndFill(),s=o?.sameMarkup(t)&&o.content.findDiffStart(t.content)===null;return t.descendants((l,u)=>{let d=r>=u&&r<=u+l.nodeSize,f=!l.isLeaf&&!l.childCount;if((d||!this.options.showOnlyCurrent)&&f){let h=[this.options.emptyNodeClass];s&&h.push(this.options.emptyEditorClass);let m=Mt.node(u,u+l.nodeSize,{class:h.join(" "),"data-placeholder":typeof this.options.placeholder=="function"?this.options.placeholder({editor:this.editor,node:l,pos:u,hasAnchor:d}):this.options.placeholder});i.push(m)}return this.options.includeChildren}),lt.create(t,i)}}})]}});var ED=/(?:^|\s)((?:~~)((?:[^~]+))(?:~~))$/,vD=/(?:^|\s)((?:~~)((?:[^~]+))(?:~~))/g,ov=tt.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["s",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setStrike:()=>({commands:t})=>t.setMark(this.name),toggleStrike:()=>({commands:t})=>t.toggleMark(this.name),unsetStrike:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){let t={};return ec()?t["Mod-Shift-s"]=()=>this.editor.commands.toggleStrike():t["Ctrl-Shift-s"]=()=>this.editor.commands.toggleStrike(),t},addInputRules(){return[Kn({find:ED,type:this.type})]},addPasteRules(){return[xn({find:vD,type:this.type})]}});var sv=tt.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(t){return t!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sub",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setSubscript:()=>({commands:t})=>t.setMark(this.name),toggleSubscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSubscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}});var av=tt.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(t){return t!=="super"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sup",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setSuperscript:()=>({commands:t})=>t.setMark(this.name),toggleSuperscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSuperscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}});var Op,Rp;if(typeof WeakMap<"u"){let t=new WeakMap;Op=e=>t.get(e),Rp=(e,n)=>(t.set(e,n),n)}else{let t=[],n=0;Op=r=>{for(let i=0;i(n==10&&(n=0),t[n++]=r,t[n++]=i)}var bt=class{constructor(t,e,n,r){this.width=t,this.height=e,this.map=n,this.problems=r}findCell(t){for(let e=0;e=n){(o||(o=[])).push({type:"overlong_rowspan",pos:f,n:M-L});break}let S=i+L*e;for(let z=0;zr&&(o+=d.attrs.colspan)}}for(let s=0;s1&&(n=!0)}e==-1?e=o:e!=o&&(e=Math.max(e,o))}return e}function _D(t,e,n){t.problems||(t.problems=[]);let r={};for(let i=0;i0;e--)if(t.node(e).type.spec.tableRole=="row")return t.node(0).resolve(t.before(e+1));return null}function TD(t){for(let e=t.depth;e>0;e--){let n=t.node(e).type.spec.tableRole;if(n==="cell"||n==="header_cell")return t.node(e)}return null}function sr(t){let e=t.selection.$head;for(let n=e.depth;n>0;n--)if(e.node(n).type.spec.tableRole=="row")return!0;return!1}function hc(t){let e=t.selection;if("$anchorCell"in e&&e.$anchorCell)return e.$anchorCell.pos>e.$headCell.pos?e.$anchorCell:e.$headCell;if("node"in e&&e.node&&e.node.type.spec.tableRole=="cell")return e.$anchor;let n=Yo(e.$head)||MD(e.$head);if(n)return n;throw new RangeError(`No cell found around position ${e.head}`)}function MD(t){for(let e=t.nodeAfter,n=t.pos;e;e=e.firstChild,n++){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n)}for(let e=t.nodeBefore,n=t.pos;e;e=e.lastChild,n--){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n-e.nodeSize)}}function Ip(t){return t.parent.type.spec.tableRole=="row"&&!!t.nodeAfter}function CD(t){return t.node(0).resolve(t.pos+t.nodeAfter.nodeSize)}function Pp(t,e){return t.depth==e.depth&&t.pos>=e.start(-1)&&t.pos<=e.end(-1)}function gv(t,e,n){let r=t.node(-1),i=bt.get(r),o=t.start(-1),s=i.nextCell(t.pos-o,e,n);return s==null?null:t.node(0).resolve(o+s)}function io(t,e,n=1){let r={...t,colspan:t.colspan-n};return r.colwidth&&(r.colwidth=r.colwidth.slice(),r.colwidth.splice(e,n),r.colwidth.some(i=>i>0)||(r.colwidth=null)),r}function bv(t,e,n=1){let r={...t,colspan:t.colspan+n};if(r.colwidth){r.colwidth=r.colwidth.slice();for(let i=0;if!=n.pos-o);u.unshift(n.pos-o);let d=u.map(f=>{let h=r.nodeAt(f);if(!h)throw RangeError(`No cell with offset ${f} found`);let m=o+f+1;return new Ws(l.resolve(m),l.resolve(m+h.content.size))});super(d[0].$from,d[0].$to,d),this.$anchorCell=e,this.$headCell=n}map(e,n){let r=e.resolve(n.map(this.$anchorCell.pos)),i=e.resolve(n.map(this.$headCell.pos));if(Ip(r)&&Ip(i)&&Pp(r,i)){let o=this.$anchorCell.node(-1)!=r.node(-1);return o&&this.isRowSelection()?$r.rowSelection(r,i):o&&this.isColSelection()?$r.colSelection(r,i):new $r(r,i)}return ce.between(r,i)}content(){let e=this.$anchorCell.node(-1),n=bt.get(e),r=this.$anchorCell.start(-1),i=n.rectBetween(this.$anchorCell.pos-r,this.$headCell.pos-r),o={},s=[];for(let u=i.top;u0||x>0){let M=y.attrs;if(v>0&&(M=io(M,0,v)),x>0&&(M=io(M,M.colspan-x,x)),b.lefti.bottom){let M={...y.attrs,rowspan:Math.min(b.bottom,i.bottom)-Math.max(b.top,i.top)};b.top0)return!1;let r=e+this.$anchorCell.nodeAfter.attrs.rowspan,i=n+this.$headCell.nodeAfter.attrs.rowspan;return Math.max(r,i)==this.$headCell.node(-1).childCount}static colSelection(e,n=e){let r=e.node(-1),i=bt.get(r),o=e.start(-1),s=i.findCell(e.pos-o),l=i.findCell(n.pos-o),u=e.node(0);return s.top<=l.top?(s.top>0&&(e=u.resolve(o+i.map[s.left])),l.bottom0&&(n=u.resolve(o+i.map[l.left])),s.bottom0)return!1;let s=i+this.$anchorCell.nodeAfter.attrs.colspan,l=o+this.$headCell.nodeAfter.attrs.colspan;return Math.max(s,l)==n.width}eq(e){return e instanceof $r&&e.$anchorCell.pos==this.$anchorCell.pos&&e.$headCell.pos==this.$headCell.pos}static rowSelection(e,n=e){let r=e.node(-1),i=bt.get(r),o=e.start(-1),s=i.findCell(e.pos-o),l=i.findCell(n.pos-o),u=e.node(0);return s.left<=l.left?(s.left>0&&(e=u.resolve(o+i.map[s.top*i.width])),l.right0&&(n=u.resolve(o+i.map[l.top*i.width])),s.right{e.push(Mt.node(r,r+n.nodeSize,{class:"selectedCell"}))}),lt.create(t.doc,e)}function OD({$from:t,$to:e}){if(t.pos==e.pos||t.pos=0&&!(t.after(i+1)=0&&!(e.before(o+1)>e.start(o));o--,r--);return n==r&&/row|table/.test(t.node(i).type.spec.tableRole)}function RD({$from:t,$to:e}){let n,r;for(let i=t.depth;i>0;i--){let o=t.node(i);if(o.type.spec.tableRole==="cell"||o.type.spec.tableRole==="header_cell"){n=o;break}}for(let i=e.depth;i>0;i--){let o=e.node(i);if(o.type.spec.tableRole==="cell"||o.type.spec.tableRole==="header_cell"){r=o;break}}return n!==r&&e.parentOffset===0}function ID(t,e,n){let r=(e||t).selection,i=(e||t).doc,o,s;if(r instanceof he&&(s=r.node.type.spec.tableRole)){if(s=="cell"||s=="header_cell")o=rt.create(i,r.from);else if(s=="row"){let l=i.resolve(r.from+1);o=rt.rowSelection(l,l)}else if(!n){let l=bt.get(r.node),u=r.from+1,d=u+l.map[l.width*l.height-1];o=rt.create(i,u+1,d)}}else r instanceof ce&&OD(r)?o=ce.create(i,r.from):r instanceof ce&&RD(r)&&(o=ce.create(i,r.$from.start(),r.$from.end()));return o&&(e||(e=t.tr)).setSelection(o),e}var LD=new qe("fix-tables");function Ev(t,e,n,r){let i=t.childCount,o=e.childCount;e:for(let s=0,l=0;s{i.type.spec.tableRole=="table"&&(n=DD(t,i,o,n))};return e?e.doc!=t.doc&&Ev(e.doc,t.doc,0,r):t.doc.descendants(r),n}function DD(t,e,n,r){let i=bt.get(e);if(!i.problems)return r;r||(r=t.tr);let o=[];for(let u=0;u0){let b="cell";f.firstChild&&(b=f.firstChild.type.spec.tableRole);let y=[];for(let x=0;x0&&r>0||e.child(0).type.spec.tableRole=="table");)n--,r--,e=e.child(0).content;let i=e.child(0),o=i.type.spec.tableRole,s=i.type.schema,l=[];if(o=="row")for(let u=0;u=0;s--){let{rowspan:l,colspan:u}=o.child(s).attrs;for(let d=i;d=e.length&&e.push(V.empty),n[i]r&&(m=m.type.createChecked(io(m.attrs,m.attrs.colspan,f+m.attrs.colspan-r),m.content)),d.push(m),f+=m.attrs.colspan;for(let b=1;bi&&(h=h.type.create({...h.attrs,rowspan:Math.max(1,i-h.attrs.rowspan)},h.content)),u.push(h)}o.push(V.from(u))}n=o,e=i}return{width:t,height:e,rows:n}}function HD(t,e,n,r,i,o,s){let l=t.doc.type.schema,u=on(l),d,f;if(i>e.width)for(let h=0,m=0;he.height){let h=[];for(let y=0,v=(e.height-1)*e.width;y=e.width?!1:n.nodeAt(e.map[v+y]).type==u.header_cell;h.push(x?f||(f=u.header_cell.createAndFill()):d||(d=u.cell.createAndFill()))}let m=u.row.create(null,V.from(h)),b=[];for(let y=e.height;y{if(!i)return!1;let o=n.selection;if(o instanceof rt)return fc(n,r,fe.near(o.$headCell,e));if(t!="horiz"&&!o.empty)return!1;let s=vv(i,t,e);if(s==null)return!1;if(t=="horiz")return fc(n,r,fe.near(n.doc.resolve(o.head+e),e));{let l=n.doc.resolve(s),u=gv(l,t,e),d;return u?d=fe.near(u,1):e<0?d=fe.near(n.doc.resolve(l.before(-1)),-1):d=fe.near(n.doc.resolve(l.after(-1)),1),fc(n,r,d)}}}function uc(t,e){return(n,r,i)=>{if(!i)return!1;let o=n.selection,s;if(o instanceof rt)s=o;else{let u=vv(i,t,e);if(u==null)return!1;s=new rt(n.doc.resolve(u))}let l=gv(s.$headCell,t,e);return l?fc(n,r,new rt(s.$anchorCell,l)):!1}}function dc(t,e){let n=t.selection;if(!(n instanceof rt))return!1;if(e){let r=t.tr,i=on(t.schema).cell.createAndFill().content;n.forEachCell((o,s)=>{o.content.eq(i)||r.replace(r.mapping.map(s+1),r.mapping.map(s+o.nodeSize-1),new Z(i,0,0))}),r.docChanged&&e(r)}return!0}function UD(t,e){let n=t.state.doc,r=Yo(n.resolve(e));return r?(t.dispatch(t.state.tr.setSelection(new rt(r))),!0):!1}function $D(t,e,n){if(!sr(t.state))return!1;let r=PD(n),i=t.state.selection;if(i instanceof rt){r||(r={width:1,height:1,rows:[V.from(Lp(on(t.state.schema).cell,n))]});let o=i.$anchorCell.node(-1),s=i.$anchorCell.start(-1),l=bt.get(o).rectBetween(i.$anchorCell.pos-s,i.$headCell.pos-s);return r=FD(r,l.right-l.left,l.bottom-l.top),uv(t.state,t.dispatch,s,l,r),!0}else if(r){let o=hc(t.state),s=o.start(-1);return uv(t.state,t.dispatch,s,bt.get(o.node(-1)).findCell(o.pos-s),r),!0}else return!1}function WD(t,e){var n;if(e.ctrlKey||e.metaKey)return;let r=dv(t,e.target),i;if(e.shiftKey&&t.state.selection instanceof rt)o(t.state.selection.$anchorCell,e),e.preventDefault();else if(e.shiftKey&&r&&(i=Yo(t.state.selection.$anchor))!=null&&((n=Np(t,e))==null?void 0:n.pos)!=i.pos)o(i,e),e.preventDefault();else if(!r)return;function o(u,d){let f=Np(t,d),h=Ei.getState(t.state)==null;if(!f||!Pp(u,f))if(h)f=u;else return;let m=new rt(u,f);if(h||!t.state.selection.eq(m)){let b=t.state.tr.setSelection(m);h&&b.setMeta(Ei,u.pos),t.dispatch(b)}}function s(){t.root.removeEventListener("mouseup",s),t.root.removeEventListener("dragstart",s),t.root.removeEventListener("mousemove",l),Ei.getState(t.state)!=null&&t.dispatch(t.state.tr.setMeta(Ei,-1))}function l(u){let d=u,f=Ei.getState(t.state),h;if(f!=null)h=t.state.doc.resolve(f);else if(dv(t,d.target)!=r&&(h=Np(t,e),!h))return s();h&&o(h,d)}t.root.addEventListener("mouseup",s),t.root.addEventListener("dragstart",s),t.root.addEventListener("mousemove",l)}function vv(t,e,n){if(!(t.state.selection instanceof ce))return null;let{$head:r}=t.state.selection;for(let i=r.depth-1;i>=0;i--){let o=r.node(i);if((n<0?r.index(i):r.indexAfter(i))!=(n<0?0:o.childCount))return null;if(o.type.spec.tableRole=="cell"||o.type.spec.tableRole=="header_cell"){let l=r.before(i),u=e=="vert"?n>0?"down":"up":n>0?"right":"left";return t.endOfTextblock(u)?l:null}}return null}function dv(t,e){for(;e&&e!=t.dom;e=e.parentNode)if(e.nodeName=="TD"||e.nodeName=="TH")return e;return null}function Np(t,e){let n=t.posAtCoords({left:e.clientX,top:e.clientY});return n&&n?Yo(t.state.doc.resolve(n.pos)):null}var KD=class{constructor(t,e){this.node=t,this.cellMinWidth=e,this.dom=document.createElement("div"),this.dom.className="tableWrapper",this.table=this.dom.appendChild(document.createElement("table")),this.colgroup=this.table.appendChild(document.createElement("colgroup")),Dp(t,this.colgroup,this.table,e),this.contentDOM=this.table.appendChild(document.createElement("tbody"))}update(t){return t.type!=this.node.type?!1:(this.node=t,Dp(t,this.colgroup,this.table,this.cellMinWidth),!0)}ignoreMutation(t){return t.type=="attributes"&&(t.target==this.table||this.colgroup.contains(t.target))}};function Dp(t,e,n,r,i,o){var s;let l=0,u=!0,d=e.firstChild,f=t.firstChild;if(f){for(let h=0,m=0;hnew n(l,e,u),new VD(-1,!1)},apply(o,s){return s.apply(o)}},props:{attributes:o=>{let s=Vn.getState(o);return s&&s.activeHandle>-1?{class:"resize-cursor"}:{}},handleDOMEvents:{mousemove:(o,s)=>{GD(o,s,t,e,r)},mouseleave:o=>{qD(o)},mousedown:(o,s)=>{YD(o,s,e)}},decorations:o=>{let s=Vn.getState(o);if(s&&s.activeHandle>-1)return eP(o,s.activeHandle)},nodeViews:{}}});return i}var VD=class pc{constructor(e,n){this.activeHandle=e,this.dragging=n}apply(e){let n=this,r=e.getMeta(Vn);if(r&&r.setHandle!=null)return new pc(r.setHandle,!1);if(r&&r.setDragging!==void 0)return new pc(n.activeHandle,r.setDragging);if(n.activeHandle>-1&&e.docChanged){let i=e.mapping.map(n.activeHandle,-1);return Ip(e.doc.resolve(i))||(i=-1),new pc(i,n.dragging)}return n}};function GD(t,e,n,r,i){let o=Vn.getState(t.state);if(o&&!o.dragging){let s=XD(e.target),l=-1;if(s){let{left:u,right:d}=s.getBoundingClientRect();e.clientX-u<=n?l=fv(t,e,"left",n):d-e.clientX<=n&&(l=fv(t,e,"right",n))}if(l!=o.activeHandle){if(!i&&l!==-1){let u=t.state.doc.resolve(l),d=u.node(-1),f=bt.get(d),h=u.start(-1);if(f.colCount(u.pos-h)+u.nodeAfter.attrs.colspan-1==f.width-1)return}xv(t,l)}}}function qD(t){let e=Vn.getState(t.state);e&&e.activeHandle>-1&&!e.dragging&&xv(t,-1)}function YD(t,e,n){let r=Vn.getState(t.state);if(!r||r.activeHandle==-1||r.dragging)return!1;let i=t.state.doc.nodeAt(r.activeHandle),o=JD(t,r.activeHandle,i.attrs);t.dispatch(t.state.tr.setMeta(Vn,{setDragging:{startX:e.clientX,startWidth:o}}));function s(u){window.removeEventListener("mouseup",s),window.removeEventListener("mousemove",l);let d=Vn.getState(t.state);d?.dragging&&(ZD(t,d.activeHandle,pv(d.dragging,u,n)),t.dispatch(t.state.tr.setMeta(Vn,{setDragging:null})))}function l(u){if(!u.which)return s(u);let d=Vn.getState(t.state);if(d&&d.dragging){let f=pv(d.dragging,u,n);jD(t,d.activeHandle,f,n)}}return window.addEventListener("mouseup",s),window.addEventListener("mousemove",l),e.preventDefault(),!0}function JD(t,e,{colspan:n,colwidth:r}){let i=r&&r[r.length-1];if(i)return i;let o=t.domAtPos(e),l=o.node.childNodes[o.offset].offsetWidth,u=n;if(r)for(let d=0;d0?-1:0;kD(e,r,i+o)&&(o=i==0||i==e.width?null:0);for(let s=0;s0&&i0&&e.map[l-1]==u||i0?-1:0;nP(e,r,i+u)&&(u=i==0||i==e.height?null:0);for(let d=0,f=e.width*i;d0&&i0&&h==e.map[f-e.width]){let m=n.nodeAt(h).attrs;t.setNodeMarkup(t.mapping.slice(l).map(h+r),null,{...m,rowspan:m.rowspan-1}),d+=m.colspan-1}else if(i0&&n[o]==n[o-1]||r.right0&&n[i]==n[i-t]||r.bottomn[r.type.spec.tableRole])(t,e)}function oP(t){return(e,n)=>{var r;let i=e.selection,o,s;if(i instanceof rt){if(i.$anchorCell.pos!=i.$headCell.pos)return!1;o=i.$anchorCell.nodeAfter,s=i.$anchorCell.pos}else{if(o=TD(i.$from),!o)return!1;s=(r=Yo(i.$from))==null?void 0:r.pos}if(o==null||s==null||o.attrs.colspan==1&&o.attrs.rowspan==1)return!1;if(n){let l=o.attrs,u=[],d=l.colwidth;l.rowspan>1&&(l={...l,rowspan:1}),l.colspan>1&&(l={...l,colspan:1});let f=Er(e),h=e.tr;for(let b=0;b{s.attrs[t]!==e&&o.setNodeMarkup(l,null,{...s.attrs,[t]:e})}):o.setNodeMarkup(i.pos,null,{...i.nodeAfter.attrs,[t]:e}),r(o)}return!0}}function sP(t){return function(e,n){if(!sr(e))return!1;if(n){let r=on(e.schema),i=Er(e),o=e.tr,s=i.map.cellsInRect(t=="column"?{left:i.left,top:0,right:i.right,bottom:i.map.height}:t=="row"?{left:0,top:i.top,right:i.map.width,bottom:i.bottom}:i),l=s.map(u=>i.table.nodeAt(u));for(let u=0;u{let y=b+o.tableStart,v=s.doc.nodeAt(y);v&&s.setNodeMarkup(y,m,v.attrs)}),r(s)}return!0}}var KU=Jo("row",{useDeprecatedLogic:!0}),VU=Jo("column",{useDeprecatedLogic:!0}),Rv=Jo("cell",{useDeprecatedLogic:!0});function aP(t,e){if(e<0){let n=t.nodeBefore;if(n)return t.pos-n.nodeSize;for(let r=t.index(-1)-1,i=t.before();r>=0;r--){let o=t.node(-1).child(r),s=o.lastChild;if(s)return i-1-s.nodeSize;i-=o.nodeSize}}else{if(t.index()0;r--)if(n.node(r).type.spec.tableRole=="table")return e&&e(t.tr.delete(n.before(r),n.after(r)).scrollIntoView()),!0;return!1}function Lv({allowTableNodeSelection:t=!1}={}){return new Pe({key:Ei,state:{init(){return null},apply(e,n){let r=e.getMeta(Ei);if(r!=null)return r==-1?null:r;if(n==null||!e.docChanged)return n;let{deleted:i,pos:o}=e.mapping.mapResult(n);return i?null:o}},props:{decorations:ND,handleDOMEvents:{mousedown:WD},createSelectionBetween(e){return Ei.getState(e.state)!=null?e.state.selection:null},handleTripleClick:UD,handleKeyDown:zD,handlePaste:$D},appendTransaction(e,n,r){return ID(r,Bp(r,n),t)}})}function Dv(t,e,n,r,i,o){let s=0,l=!0,u=e.firstChild,d=t.firstChild;for(let f=0,h=0;f{let r=t.nodes[n];r.spec.tableRole&&(e[r.spec.tableRole]=r)}),t.cached.tableNodeTypes=e,e}function cP(t,e,n,r,i){let o=lP(t),s=[],l=[];for(let d=0;d{let{selection:e}=t.state;if(!uP(e))return!1;let n=0,r=vp(e.ranges[0].$from,o=>o.type.name==="table");return r?.node.descendants(o=>{if(o.type.name==="table")return!1;["tableCell","tableHeader"].includes(o.type.name)&&(n+=1)}),n===e.ranges.length?(t.commands.deleteTable(),!0):!1},Bv=se.create({name:"table",addOptions(){return{HTMLAttributes:{},resizable:!1,handleWidth:5,cellMinWidth:25,View:Up,lastColumnResizable:!0,allowTableNodeSelection:!1}},content:"tableRow+",tableRole:"table",isolating:!0,group:"block",parseHTML(){return[{tag:"table"}]},renderHTML({HTMLAttributes:t}){return["table",j(this.options.HTMLAttributes,t),["tbody",0]]},addCommands(){return{insertTable:({rows:t=3,cols:e=3,withHeaderRow:n=!0}={})=>({tr:r,dispatch:i,editor:o})=>{let s=cP(o.schema,t,e,n);if(i){let l=r.selection.anchor+1;r.replaceSelectionWith(s).scrollIntoView().setSelection(ce.near(r.doc.resolve(l)))}return!0},addColumnBefore:()=>({state:t,dispatch:e})=>Sv(t,e),addColumnAfter:()=>({state:t,dispatch:e})=>Tv(t,e),deleteColumn:()=>({state:t,dispatch:e})=>Mv(t,e),addRowBefore:()=>({state:t,dispatch:e})=>kv(t,e),addRowAfter:()=>({state:t,dispatch:e})=>Av(t,e),deleteRow:()=>({state:t,dispatch:e})=>Nv(t,e),deleteTable:()=>({state:t,dispatch:e})=>Iv(t,e),mergeCells:()=>({state:t,dispatch:e})=>Fp(t,e),splitCell:()=>({state:t,dispatch:e})=>Hp(t,e),toggleHeaderColumn:()=>({state:t,dispatch:e})=>Jo("column")(t,e),toggleHeaderRow:()=>({state:t,dispatch:e})=>Jo("row")(t,e),toggleHeaderCell:()=>({state:t,dispatch:e})=>Rv(t,e),mergeOrSplit:()=>({state:t,dispatch:e})=>Fp(t,e)?!0:Hp(t,e),setCellAttribute:(t,e)=>({state:n,dispatch:r})=>Ov(t,e)(n,r),goToNextCell:()=>({state:t,dispatch:e})=>zp(1)(t,e),goToPreviousCell:()=>({state:t,dispatch:e})=>zp(-1)(t,e),fixTables:()=>({state:t,dispatch:e})=>(e&&Bp(t),!0),setCellSelection:t=>({tr:e,dispatch:n})=>{if(n){let r=rt.create(e.doc,t.anchorCell,t.headCell);e.setSelection(r)}return!0}}},addKeyboardShortcuts(){return{Tab:()=>this.editor.commands.goToNextCell()?!0:this.editor.can().addRowAfter()?this.editor.chain().addRowAfter().goToNextCell().run():!1,"Shift-Tab":()=>this.editor.commands.goToPreviousCell(),Backspace:mc,"Mod-Backspace":mc,Delete:mc,"Mod-Delete":mc}},addProseMirrorPlugins(){return[...this.options.resizable&&this.editor.isEditable?[wv({handleWidth:this.options.handleWidth,cellMinWidth:this.options.cellMinWidth,View:this.options.View,lastColumnResizable:this.options.lastColumnResizable})]:[],Lv({allowTableNodeSelection:this.options.allowTableNodeSelection})]},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{tableRole:Se(ie(t,"tableRole",e))}}});var Fv=se.create({name:"tableCell",addOptions(){return{HTMLAttributes:{}}},content:"block+",addAttributes(){return{colspan:{default:1},rowspan:{default:1},colwidth:{default:null,parseHTML:t=>{let e=t.getAttribute("colwidth");return e?[parseInt(e,10)]:null}}}},tableRole:"cell",isolating:!0,parseHTML(){return[{tag:"td"}]},renderHTML({HTMLAttributes:t}){return["td",j(this.options.HTMLAttributes,t),0]}});var Hv=se.create({name:"tableHeader",addOptions(){return{HTMLAttributes:{}}},content:"block+",addAttributes(){return{colspan:{default:1},rowspan:{default:1},colwidth:{default:null,parseHTML:t=>{let e=t.getAttribute("colwidth");return e?[parseInt(e,10)]:null}}}},tableRole:"header_cell",isolating:!0,parseHTML(){return[{tag:"th"}]},renderHTML({HTMLAttributes:t}){return["th",j(this.options.HTMLAttributes,t),0]}});var zv=se.create({name:"tableRow",addOptions(){return{HTMLAttributes:{}}},content:"(tableCell | tableHeader)*",tableRole:"row",parseHTML(){return[{tag:"tr"}]},renderHTML({HTMLAttributes:t}){return["tr",j(this.options.HTMLAttributes,t),0]}});var Uv=se.create({name:"text",group:"inline"});var $v=tt.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["u",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setUnderline:()=>({commands:t})=>t.setMark(this.name),toggleUnderline:()=>({commands:t})=>t.toggleMark(this.name),unsetUnderline:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});var dP=/(?:^|\s)((?:==)((?:[^~=]+))(?:==))$/,fP=/(?:^|\s)((?:==)((?:[^~=]+))(?:==))/g,Wv=tt.create({name:"highlight",addOptions(){return{multicolor:!1,HTMLAttributes:{}}},addAttributes(){return this.options.multicolor?{color:{default:null,parseHTML:t=>t.getAttribute("data-color")||t.style.backgroundColor,renderHTML:t=>t.color?{"data-color":t.color,style:`background-color: ${t.color}; color: inherit`}:{}}}:{}},parseHTML(){return[{tag:"mark"}]},renderHTML({HTMLAttributes:t}){return["mark",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setHighlight:t=>({commands:e})=>e.setMark(this.name,t),toggleHighlight:t=>({commands:e})=>e.toggleMark(this.name,t),unsetHighlight:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-h":()=>this.editor.commands.toggleHighlight()}},addInputRules(){return[Kn({find:dP,type:this.type})]},addPasteRules(){return[xn({find:fP,type:this.type})]}});var $p=se.create({name:"checkedList",priority:50,addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{class:"checked-list"}}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:"ul",getAttrs:t=>t.classList.contains("checked-list"),priority:1e3}]},renderHTML({HTMLAttributes:t}){return["ul",j(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleCheckedList:()=>({commands:t})=>t.toggleList(this.name,this.options.itemTypeName)}}});var Wp=se.create({name:"lead",group:"block",content:"block+",addOptions(){return{HTMLAttributes:{class:"lead"}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("lead")}]},renderHTML({node:t,HTMLAttributes:e}){return["div",j(this.options.HTMLAttributes,e),0]},addCommands(){return{toggleLead:()=>({commands:t})=>t.toggleWrap(this.name)}}});var pP="aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4vianca6w0s2x0a2z0ure5ba0by2idu3namex3narepublic11d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2ntley5rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0cast4mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dabur3d1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0ardian6cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6logistics9properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3ncaster6d0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2psy3ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2tura4vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9dnavy5lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0america6xi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0a1b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp2w2ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4finity6ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2",hP="\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2",jo=(t,e)=>{for(let n in e)t[n]=e[n];return t},Yp="numeric",Jp="ascii",Xp="alpha",vc="asciinumeric",gc="alphanumeric",Zp="domain",jv="emoji",mP="scheme",gP="slashscheme",Kv="whitespace";function bP(t,e){return t in e||(e[t]=[]),e[t]}function oo(t,e,n){e[Yp]&&(e[vc]=!0,e[gc]=!0),e[Jp]&&(e[vc]=!0,e[Xp]=!0),e[vc]&&(e[gc]=!0),e[Xp]&&(e[gc]=!0),e[gc]&&(e[Zp]=!0),e[jv]&&(e[Zp]=!0);for(let r in e){let i=bP(r,n);i.indexOf(t)<0&&i.push(t)}}function yP(t,e){let n={};for(let r in e)e[r].indexOf(t)>=0&&(n[r]=!0);return n}function _n(t){t===void 0&&(t=null),this.j={},this.jr=[],this.jd=null,this.t=t}_n.groups={};_n.prototype={accepts(){return!!this.t},go(t){let e=this,n=e.j[t];if(n)return n;for(let r=0;rt.ta(e,n,r,i),Gn=(t,e,n,r,i)=>t.tr(e,n,r,i),Vv=(t,e,n,r,i)=>t.ts(e,n,r,i),Q=(t,e,n,r,i)=>t.tt(e,n,r,i),Wr="WORD",jp="UWORD",ia="LOCALHOST",Qp="TLD",eh="UTLD",wc="SCHEME",Zo="SLASH_SCHEME",th="NUM",Qv="WS",nh="NL",ta="OPENBRACE",na="CLOSEBRACE",xc="OPENBRACKET",_c="CLOSEBRACKET",Sc="OPENPAREN",Tc="CLOSEPAREN",Mc="OPENANGLEBRACKET",Cc="CLOSEANGLEBRACKET",kc="FULLWIDTHLEFTPAREN",Ac="FULLWIDTHRIGHTPAREN",Nc="LEFTCORNERBRACKET",Oc="RIGHTCORNERBRACKET",Rc="LEFTWHITECORNERBRACKET",Ic="RIGHTWHITECORNERBRACKET",Lc="FULLWIDTHLESSTHAN",Dc="FULLWIDTHGREATERTHAN",Pc="AMPERSAND",Bc="APOSTROPHE",Fc="ASTERISK",wi="AT",Hc="BACKSLASH",zc="BACKTICK",Uc="CARET",xi="COLON",rh="COMMA",$c="DOLLAR",vr="DOT",Wc="EQUALS",ih="EXCLAMATION",wr="HYPHEN",Kc="PERCENT",Vc="PIPE",Gc="PLUS",qc="POUND",Yc="QUERY",oh="QUOTE",sh="SEMI",xr="SLASH",ra="TILDE",Jc="UNDERSCORE",ew="EMOJI",Xc="SYM",tw=Object.freeze({__proto__:null,WORD:Wr,UWORD:jp,LOCALHOST:ia,TLD:Qp,UTLD:eh,SCHEME:wc,SLASH_SCHEME:Zo,NUM:th,WS:Qv,NL:nh,OPENBRACE:ta,CLOSEBRACE:na,OPENBRACKET:xc,CLOSEBRACKET:_c,OPENPAREN:Sc,CLOSEPAREN:Tc,OPENANGLEBRACKET:Mc,CLOSEANGLEBRACKET:Cc,FULLWIDTHLEFTPAREN:kc,FULLWIDTHRIGHTPAREN:Ac,LEFTCORNERBRACKET:Nc,RIGHTCORNERBRACKET:Oc,LEFTWHITECORNERBRACKET:Rc,RIGHTWHITECORNERBRACKET:Ic,FULLWIDTHLESSTHAN:Lc,FULLWIDTHGREATERTHAN:Dc,AMPERSAND:Pc,APOSTROPHE:Bc,ASTERISK:Fc,AT:wi,BACKSLASH:Hc,BACKTICK:zc,CARET:Uc,COLON:xi,COMMA:rh,DOLLAR:$c,DOT:vr,EQUALS:Wc,EXCLAMATION:ih,HYPHEN:wr,PERCENT:Kc,PIPE:Vc,PLUS:Gc,POUND:qc,QUERY:Yc,QUOTE:oh,SEMI:sh,SLASH:xr,TILDE:ra,UNDERSCORE:Jc,EMOJI:ew,SYM:Xc}),Xo=/[a-z]/,Kp=/\p{L}/u,Vp=/\p{Emoji}/u;var Gp=/\d/,Gv=/\s/;var qv=` -`,EP="\uFE0F",vP="\u200D",bc=null,yc=null;function wP(t){t===void 0&&(t=[]);let e={};_n.groups=e;let n=new _n;bc==null&&(bc=Yv(pP)),yc==null&&(yc=Yv(hP)),Q(n,"'",Bc),Q(n,"{",ta),Q(n,"}",na),Q(n,"[",xc),Q(n,"]",_c),Q(n,"(",Sc),Q(n,")",Tc),Q(n,"<",Mc),Q(n,">",Cc),Q(n,"\uFF08",kc),Q(n,"\uFF09",Ac),Q(n,"\u300C",Nc),Q(n,"\u300D",Oc),Q(n,"\u300E",Rc),Q(n,"\u300F",Ic),Q(n,"\uFF1C",Lc),Q(n,"\uFF1E",Dc),Q(n,"&",Pc),Q(n,"*",Fc),Q(n,"@",wi),Q(n,"`",zc),Q(n,"^",Uc),Q(n,":",xi),Q(n,",",rh),Q(n,"$",$c),Q(n,".",vr),Q(n,"=",Wc),Q(n,"!",ih),Q(n,"-",wr),Q(n,"%",Kc),Q(n,"|",Vc),Q(n,"+",Gc),Q(n,"#",qc),Q(n,"?",Yc),Q(n,'"',oh),Q(n,"/",xr),Q(n,";",sh),Q(n,"~",ra),Q(n,"_",Jc),Q(n,"\\",Hc);let r=Gn(n,Gp,th,{[Yp]:!0});Gn(r,Gp,r);let i=Gn(n,Xo,Wr,{[Jp]:!0});Gn(i,Xo,i);let o=Gn(n,Kp,jp,{[Xp]:!0});Gn(o,Xo),Gn(o,Kp,o);let s=Gn(n,Gv,Qv,{[Kv]:!0});Q(n,qv,nh,{[Kv]:!0}),Q(s,qv),Gn(s,Gv,s);let l=Gn(n,Vp,ew,{[jv]:!0});Gn(l,Vp,l),Q(l,EP,l);let u=Q(l,vP);Gn(u,Vp,l);let d=[[Xo,i]],f=[[Xo,null],[Kp,o]];for(let h=0;hh[0]>m[0]?1:-1);for(let h=0;h=0?y[Zp]=!0:Xo.test(m)?Gp.test(m)?y[vc]=!0:y[Jp]=!0:y[Yp]=!0,Vv(n,m,m,y)}return Vv(n,"localhost",ia,{ascii:!0}),n.jd=new _n(Xc),{start:n,tokens:jo({groups:e},tw)}}function xP(t,e){let n=_P(e.replace(/[A-Z]/g,l=>l.toLowerCase())),r=n.length,i=[],o=0,s=0;for(;s=0&&(h+=n[s].length,m++),d+=n[s].length,o+=n[s].length,s++;o-=h,s-=m,d-=h,i.push({t:f.t,v:e.slice(o-d,o),s:o-d,e:o})}return i}function _P(t){let e=[],n=t.length,r=0;for(;r56319||r+1===n||(o=t.charCodeAt(r+1))<56320||o>57343?t[r]:t.slice(r,r+2);e.push(s),r+=s.length}return e}function vi(t,e,n,r,i){let o,s=e.length;for(let l=0;l=0;)o++;if(o>0){e.push(n.join(""));for(let s=parseInt(t.substring(r,r+o),10);s>0;s--)n.pop();r+=o}else n.push(t[r]),r++}return e}var oa={defaultProtocol:"http",events:null,format:Jv,formatHref:Jv,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function ah(t,e){e===void 0&&(e=null);let n=jo({},oa);t&&(n=jo(n,t instanceof ah?t.o:t));let r=n.ignoreTags,i=[];for(let o=0;on?r.substring(0,n)+"\u2026":r},toFormattedHref(t){return t.get("formatHref",this.toHref(t.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(t){return t===void 0&&(t=oa.defaultProtocol),{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(t),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(t){return{type:this.t,value:this.toFormattedString(t),isLink:this.isLink,href:this.toFormattedHref(t),start:this.startIndex(),end:this.endIndex()}},validate(t){return t.get("validate",this.toString(),this)},render(t){let e=this,n=this.toHref(t.get("defaultProtocol")),r=t.get("formatHref",n,this),i=t.get("tagName",n,e),o=this.toFormattedString(t),s={},l=t.get("className",n,e),u=t.get("target",n,e),d=t.get("rel",n,e),f=t.getObj("attributes",n,e),h=t.getObj("events",n,e);return s.href=r,l&&(s.class=l),u&&(s.target=u),d&&(s.rel=d),f&&jo(s,f),{tagName:i,attributes:s,content:o,eventListeners:h}}};function Zc(t,e){class n extends nw{constructor(i,o){super(i,o),this.t=t}}for(let r in e)n.prototype[r]=e[r];return n.t=t,n}var Xv=Zc("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),Zv=Zc("text"),SP=Zc("nl"),Ec=Zc("url",{isLink:!0,toHref(t){return t===void 0&&(t=oa.defaultProtocol),this.hasProtocol()?this.v:`${t}://${this.v}`},hasProtocol(){let t=this.tk;return t.length>=2&&t[0].t!==ia&&t[1].t===xi}});var qn=t=>new _n(t);function TP(t){let{groups:e}=t,n=e.domain.concat([Pc,Fc,wi,Hc,zc,Uc,$c,Wc,wr,th,Kc,Vc,Gc,qc,xr,Xc,ra,Jc]),r=[Bc,xi,rh,vr,ih,Yc,oh,sh,Mc,Cc,ta,na,_c,xc,Sc,Tc,kc,Ac,Nc,Oc,Rc,Ic,Lc,Dc],i=[Pc,Bc,Fc,Hc,zc,Uc,$c,Wc,wr,ta,na,Kc,Vc,Gc,qc,Yc,xr,Xc,ra,Jc],o=qn(),s=Q(o,ra);Be(s,i,s),Be(s,e.domain,s);let l=qn(),u=qn(),d=qn();Be(o,e.domain,l),Be(o,e.scheme,u),Be(o,e.slashscheme,d),Be(l,i,s),Be(l,e.domain,l);let f=Q(l,wi);Q(s,wi,f),Q(u,wi,f),Q(d,wi,f);let h=Q(s,vr);Be(h,i,s),Be(h,e.domain,s);let m=qn();Be(f,e.domain,m),Be(m,e.domain,m);let b=Q(m,vr);Be(b,e.domain,m);let y=qn(Xv);Be(b,e.tld,y),Be(b,e.utld,y),Q(f,ia,y);let v=Q(m,wr);Be(v,e.domain,m),Be(y,e.domain,m),Q(y,vr,b),Q(y,wr,v);let x=Q(y,xi);Be(x,e.numeric,Xv);let M=Q(l,wr),D=Q(l,vr);Be(M,e.domain,l),Be(D,i,s),Be(D,e.domain,l);let L=qn(Ec);Be(D,e.tld,L),Be(D,e.utld,L),Be(L,e.domain,l),Be(L,i,s),Q(L,vr,D),Q(L,wr,M),Q(L,wi,f);let S=Q(L,xi),z=qn(Ec);Be(S,e.numeric,z);let O=qn(Ec),q=qn();Be(O,n,O),Be(O,r,q),Be(q,n,O),Be(q,r,q),Q(L,xr,O),Q(z,xr,O);let J=Q(u,xi),W=Q(d,xi),ue=Q(W,xr),ye=Q(ue,xr);Be(u,e.domain,l),Q(u,vr,D),Q(u,wr,M),Be(d,e.domain,l),Q(d,vr,D),Q(d,wr,M),Be(J,e.domain,O),Q(J,xr,O),Be(ye,e.domain,O),Be(ye,n,O),Q(ye,xr,O);let Te=[[ta,na],[xc,_c],[Sc,Tc],[Mc,Cc],[kc,Ac],[Nc,Oc],[Rc,Ic],[Lc,Dc]];for(let ge=0;ge=0&&m++,i++,f++;if(m<0)i-=f,i0&&(o.push(qp(Zv,e,s)),s=[]),i-=m,f-=m;let b=h.t,y=n.slice(i-f,i);o.push(qp(b,e,y))}}return s.length>0&&o.push(qp(Zv,e,s)),o}function qp(t,e,n){let r=n[0].s,i=n[n.length-1].e,o=e.slice(r,i);return new t(o,n)}var CP=typeof console<"u"&&console&&console.warn||(()=>{}),kP="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",ht={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function rw(){_n.groups={},ht.scanner=null,ht.parser=null,ht.tokenQueue=[],ht.pluginQueue=[],ht.customSchemes=[],ht.initialized=!1}function lh(t,e){if(e===void 0&&(e=!1),ht.initialized&&CP(`linkifyjs: already initialized - will not register custom scheme "${t}" ${kP}`),!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(t))throw new Error(`linkifyjs: incorrect scheme format. -1. Must only contain digits, lowercase ASCII letters or "-" -2. Cannot start or end with "-" -3. "-" cannot repeat`);ht.customSchemes.push([t,e])}function AP(){ht.scanner=wP(ht.customSchemes);for(let t=0;t{let i=e.some(d=>d.docChanged)&&!n.doc.eq(r.doc),o=e.some(d=>d.getMeta("preventAutolink"));if(!i||o)return;let{tr:s}=r,l=CE(n.doc,[...e]);if(AE(l).forEach(({newRange:d})=>{let f=kE(r.doc,d,b=>b.isTextblock),h,m;if(f.length>1?(h=f[0],m=r.doc.textBetween(h.pos,h.pos+h.node.nodeSize,void 0," ")):f.length&&r.doc.textBetween(d.from,d.to," "," ").endsWith(" ")&&(h=f[0],m=r.doc.textBetween(h.pos,d.to,void 0," ")),h&&m){let b=m.split(" ").filter(x=>x!=="");if(b.length<=0)return!1;let y=b[b.length-1],v=h.pos+m.lastIndexOf(y);if(!y)return!1;jc(y).filter(x=>x.isLink).map(x=>({...x,from:v+x.start+1,to:v+x.end+1})).filter(x=>r.schema.marks.code?!r.doc.rangeHasMark(x.from,x.to,r.schema.marks.code):!0).filter(x=>t.validate?t.validate(x.value):!0).forEach(x=>{nc(x.from,x.to,r.doc).some(M=>M.mark.type===t.type)||s.addMark(x.from,x.to,t.type.create({href:x.href}))})}}),!!s.steps.length)return s}})}function RP(t){return new Pe({key:new qe("handleClickLink"),props:{handleClick:(e,n,r)=>{var i,o;if(r.button!==0||r.target.nodeName!=="A")return!1;let l=wp(e.state,t.type.name),u=r.target,d=(i=u?.href)!==null&&i!==void 0?i:l.href,f=(o=u?.target)!==null&&o!==void 0?o:l.target;return u&&d?(e.editable&&window.open(d,f),!0):!1}}})}function IP(t){return new Pe({key:new qe("handlePasteLink"),props:{handlePaste:(e,n,r)=>{var i;let{state:o}=e,{selection:s}=o,{empty:l}=s;if(l)return!1;let u="";r.content.forEach(y=>{u+=y.textContent});let d=jc(u).find(y=>y.isLink&&y.value===u);if(!u||!d)return!1;let f=(i=n.clipboardData)===null||i===void 0?void 0:i.getData("text/html"),h=/href="([^"]*)"/,m=f?.match(h),b=m?m[1]:d.href;return t.editor.commands.setMark(t.type,{href:b}),!0}}})}var iw=tt.create({name:"link",priority:1e3,keepOnSplit:!1,onCreate(){this.options.protocols.forEach(t=>{if(typeof t=="string"){lh(t);return}lh(t.scheme,t.optionalSlashes)})},onDestroy(){rw()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},validate:void 0}},addAttributes(){return{href:{default:null},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:'a[href]:not([href *= "javascript:" i])'}]},renderHTML({HTMLAttributes:t}){var e;return!((e=t.href)===null||e===void 0)&&e.startsWith("javascript:")?["a",j(this.options.HTMLAttributes,{...t,href:""}),0]:["a",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setLink:t=>({chain:e})=>e().setMark(this.name,t).setMeta("preventAutolink",!0).run(),toggleLink:t=>({chain:e})=>e().toggleMark(this.name,t,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run(),unsetLink:()=>({chain:t})=>t().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[xn({find:t=>jc(t).filter(e=>this.options.validate?this.options.validate(e.value):!0).filter(e=>e.isLink).map(e=>({text:e.value,index:e.start,data:e})),type:this.type,getAttributes:(t,e)=>{var n,r;let i=(n=e?.clipboardData)===null||n===void 0?void 0:n.getData("text/html"),o=/href="([^"]*)"/,s=i?.match(o);return s?{href:s[1]}:{href:(r=t.data)===null||r===void 0?void 0:r.href}}})]},addProseMirrorPlugins(){let t=[];return this.options.autolink&&t.push(OP({type:this.type,validate:this.options.validate})),this.options.openOnClick&&t.push(RP({type:this.type})),this.options.linkOnPaste&&t.push(IP({editor:this.editor,type:this.type})),t}});var ch=iw.extend({addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],HTMLAttributes:{},validate:void 0}},addAttributes(){return{href:{default:null},id:{default:null},target:{default:this.options.HTMLAttributes.target},hreflang:{default:null},rel:{default:null},referrerpolicy:{default:null},class:{default:null},as_button:{default:null,parseHTML:t=>t.getAttribute("data-as-button"),renderHTML:t=>({"data-as-button":t.as_button})},button_theme:{default:null,parseHTML:t=>t.getAttribute("data-as-button-theme"),renderHTML:t=>({"data-as-button-theme":t.button_theme})}}}});var LP=/(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/,ow=se.create({name:"image",addOptions(){return{inline:!1,allowBase64:!1,HTMLAttributes:{}}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},draggable:!0,addAttributes(){return{src:{default:null},alt:{default:null},title:{default:null}}},parseHTML(){return[{tag:this.options.allowBase64?"img[src]":'img[src]:not([src^="data:"])'}]},renderHTML({HTMLAttributes:t}){return["img",j(this.options.HTMLAttributes,t)]},addCommands(){return{setImage:t=>({commands:e})=>e.insertContent({type:this.name,attrs:t})}},addInputRules(){return[ic({find:LP,type:this.type,getAttributes:t=>{let[,,e,n,r]=t;return{src:n,alt:e,title:r}}})]}});var uh=ow.extend({addAttributes(){return{src:{default:null},alt:{default:null},title:{default:null},width:{default:null},height:{default:null},lazy:{default:null,parseHTML:t=>t.getAttribute("loading")==="lazy"?t.getAttribute("data-lazy"):null,renderHTML:t=>{if(t.lazy)return{"data-lazy":t.lazy,loading:"lazy"}}}}}});var DP=lc.extend({addAttributes(){return{class:{default:null}}}});var dh=tt.create({name:"small",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"small"}]},renderHTML({HTMLAttributes:t}){return["small",j(this.options.HTMLAttributes,t),0]},addCommands(){return{setSmall:()=>({commands:t})=>t.setMark(this.name),toggleSmall:()=>({commands:t})=>t.toggleMark(this.name),unsetSmall:()=>({commands:t})=>t.unsetMark(this.name)}}});function sw(t,e=null){return e?t.createChecked(null,e):t.createAndFill()}function aw(t){if(t.cached.gridNodeTypes)return t.cached.gridNodeTypes;let e={};return Object.keys(t.nodes).forEach(n=>{let r=t.nodes[n];r.spec.gridRole&&(e[r.spec.gridRole]=r)}),t.cached.gridNodeTypes=e,e}function lw(t,e,n,r){let i=aw(t),o=[];for(let s=0;st.getAttribute("type")},cols:{default:2,parseHTML:t=>t.getAttribute("cols")}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid")&&null}]},renderHTML({HTMLAttributes:t}){return["div",j(this.options.HTMLAttributes,t),0]},addCommands(){return{insertGrid:({cols:t=3,type:e="responsive"}={})=>({tr:n,dispatch:r,editor:i})=>{let o=lw(i.schema,t,e);if(r){let s=n.selection.anchor+1;n.replaceSelectionWith(o).scrollIntoView().setSelection(ce.near(n.doc.resolve(s)))}return!0}}},addKeyboardShortcuts(){return{"Mod-Alt-G":()=>this.editor.commands.insertGrid()}},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{gridRole:Se(ie(t,"gridRole",e))}}});var ph=se.create({name:"gridColumn",content:"block+",gridRole:"column",isolating:!0,addOptions(){return{HTMLAttributes:{class:"filament-tiptap-grid__column"}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid__column")&&null}]},renderHTML({HTMLAttributes:t}){return["div",j(this.options.HTMLAttributes,t),0]}});var uw=t=>t.match(/(youtube\.com|youtu\.be)(.+)?$/),cw=(t=!1)=>t?"https://www.youtube-nocookie.com/embed/":"https://www.youtube.com/embed/",hh=t=>{let{url:e,controls:n,nocookie:r,startAt:i}=t;if(e.includes("/embed/"))return e;if(e.includes("youtu.be")){let d=e.split("/").pop();return d?`${cw(r)}${d}`:null}let s=/v=([-\w]+)/gm.exec(e);if(!s||!s[1])return null;let l=`${cw(r)}${s[1]}`,u=[];return n?u.push("controls=1"):u.push("controls=0"),i&&u.push(`start=${i}`),u.length&&(l+=`?${u.join("&")}`),l};var mh=se.create({name:"youtube",selectable:!0,draggable:!0,atom:!0,addOptions(){return{inline:!1,HTMLAttributes:{},width:640,height:480}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},addAttributes(){return{style:{default:null,parseHTML:t=>t.getAttribute("style")},src:{default:null},width:{default:this.options.width,parseHTML:t=>t.getAttribute("width")},height:{default:this.options.height,parseHTML:t=>t.getAttribute("height")},responsive:{default:!0,parseHTML:t=>t.classList.contains("responsive")??!1},start:{default:0},controls:{default:!0},nocookie:{default:!1},"data-aspect-width":{default:null,parseHTML:t=>t.getAttribute("data-aspect-width")},"data-aspect-height":{default:null,parseHTML:t=>t.getAttribute("data-aspect-height")}}},parseHTML(){return[{tag:"div[data-youtube-video] iframe"}]},addCommands(){return{setYoutubeVideo:t=>({commands:e})=>{if(!uw(t.src))return!1;let n=hh({url:t.src,controls:t.controls,nocookie:t.nocookie,startAt:t.start||0});return e.insertContent({type:this.name,attrs:{...t,src:n}})}}},renderHTML({HTMLAttributes:t}){let e=hh({url:t.src,controls:t.controls,nocookie:t.nocookie,startAt:t.start||0});return["div",{"data-youtube-video":"",class:t.responsive?"responsive":null},["iframe",{src:e,width:t.width,height:t.height,allowfullscreen:this.options.allowFullscreen,style:t.responsive?`aspect-ratio: ${t["data-aspect-width"]} / ${t["data-aspect-height"]}; width: 100%; height: auto;`:null,"data-aspect-width":t.responsive?t["data-aspect-width"]:null,"data-aspect-height":t.responsive?t["data-aspect-height"]:null}]]}});var dw=t=>t.match(/(vimeo\.com)(.+)?$/),gh=t=>{let{url:e,autoplay:n,loop:r,title:i,byline:o,portrait:s}=t;if(e.includes("/video/"))return e;let u=/\.com\/([0-9]+)/gm.exec(e);if(!u||!u[1])return null;let d=`https://player.vimeo.com/video/${u[1]}`,f=[`autoplay=${n}`,`loop=${r}`,`title=${i}`,`byline=${o}`,`portrait=${s}`];return d+=`?${f.join("&")}`,d};var bh=se.create({name:"vimeo",selectable:!0,draggable:!0,atom:!0,addOptions(){return{inline:!1,HTMLAttributes:{},allowFullscreen:!0,width:640,height:480}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},addAttributes(){return{style:{default:null,parseHTML:t=>t.getAttribute("style")},src:{default:null},width:{default:this.options.width,parseHTML:t=>t.getAttribute("width")},height:{default:this.options.height,parseHTML:t=>t.getAttribute("height")},autoplay:{default:0},loop:{default:0},title:{default:0},byline:{default:0},portrait:{default:0},responsive:{default:!0,parseHTML:t=>t.classList.contains("responsive")??!1},"data-aspect-width":{default:null,parseHTML:t=>t.getAttribute("data-aspect-width")},"data-aspect-height":{default:null,parseHTML:t=>t.getAttribute("data-aspect-height")}}},parseHTML(){return[{tag:"div[data-vimeo-video] iframe"}]},addCommands(){return{setVimeoVideo:t=>({commands:e})=>{if(!dw(t.src))return!1;let n=gh({url:t.src,autoplay:t?.autoplay||0,loop:t?.loop||0,title:t?.title||0,byline:t?.byline||0,portrait:t?.portrait||0});return e.insertContent({type:this.name,attrs:{...t,src:n}})}}},renderHTML({HTMLAttributes:t}){let e=gh({url:t.src,autoplay:t?.autoplay||0,loop:t?.loop||0,title:t?.title||0,byline:t?.byline||0,portrait:t?.portrait||0});return["div",{"data-vimeo-video":"",class:t.responsive?"responsive":null},["iframe",{src:e,width:t.width,height:t.height,allowfullscreen:this.options.allowfullscreen,frameborder:0,allow:"autoplay; fullscreen; picture-in-picture",style:t.responsive?`aspect-ratio: ${t["data-aspect-width"]} / ${t["data-aspect-height"]}; width: 100%; height: auto;`:null,"data-aspect-width":t.responsive?t["data-aspect-width"]:null,"data-aspect-height":t.responsive?t["data-aspect-height"]:null}]]}});var yh=se.create({name:"video",selectable:!0,draggable:!0,atom:!0,inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},addOptions(){return{inline:!1,HTMLAttributes:{autoplay:null,controls:null,loop:null},width:640,height:480}},addAttributes(){return{style:{default:null,parseHTML:t=>t.getAttribute("style")},responsive:{default:!0,parseHTML:t=>t.classList.contains("responsive")??!1},src:{default:null},width:{default:this.options.width,parseHTML:t=>t.getAttribute("width")},height:{default:this.options.height,parseHTML:t=>t.getAttribute("height")},autoplay:{default:null,parseHTML:t=>t.getAttribute("autoplay")},controls:{default:null,parseHTML:t=>t.getAttribute("controls")},loop:{default:null,parseHTML:t=>t.getAttribute("loop")},"data-aspect-width":{default:null,parseHTML:t=>t.getAttribute("data-aspect-width")},"data-aspect-height":{default:null,parseHTML:t=>t.getAttribute("data-aspect-height")}}},parseHTML(){return[{tag:"div[data-native-video] video"}]},addCommands(){return{setVideo:t=>({commands:e})=>e.insertContent({type:this.name,attrs:t})}},renderHTML({HTMLAttributes:t}){return["div",{"data-native-video":"",class:t.responsive?"responsive":null},["video",{src:t.src,width:t.width,height:t.height,autoplay:t.autoplay?"true":null,controls:t.controls?"true":null,loop:t.loop?"true":null,style:t.responsive?`aspect-ratio: ${t["data-aspect-width"]} / ${t["data-aspect-height"]}; width: 100%; height: auto;`:null,"data-aspect-width":t.responsive?t["data-aspect-width"]:null,"data-aspect-height":t.responsive?t["data-aspect-height"]:null}]]}});var Eh=se.create({name:"details",content:"detailsSummary detailsContent",group:"block",defining:!0,isolating:!0,allowGapCursor:!1,addOptions(){return{HTMLAttributes:{}}},addAttributes(){return{}},parseHTML(){return[{tag:"details"}]},renderHTML({HTMLAttributes:t}){return["details",j(this.options.HTMLAttributes,t),0]},addNodeView(){return({editor:t,getPos:e,node:n,HTMLAttributes:r})=>{let i=document.createElement("div"),o=document.createElement("div"),s=j(this.options.HTMLAttributes,r,{"data-type":this.name});return Object.entries(s).forEach(([l,u])=>i.setAttribute(l,u)),{dom:i,contentDOM:i,ignoreMutation(l){return l.type==="selection"?!1:!i.contains(l.target)||i===l.target},update:l=>l.type===this.type}}},addCommands(){return{setDetails:()=>({state:t,chain:e})=>{var n;let{schema:r,selection:i}=t,{$from:o,$to:s}=i,l=o.blockRange(s);if(!l)return!1;let u=t.doc.slice(l.start,l.end);if(!r.nodes.detailsContent.contentMatch.matchFragment(u.content))return!1;let f=((n=u.toJSON())===null||n===void 0?void 0:n.content)||[];return e().insertContentAt({from:l.start,to:l.end},{type:this.name,content:[{type:"detailsSummary"},{type:"detailsContent",content:f}]}).setTextSelection(l.start+2).run()},unsetDetails:()=>({state:t,chain:e})=>{let{selection:n,schema:r}=t,i=no(M=>M.type===this.type)(n);if(!i)return!1;let o=to(i.node,M=>M.type===r.nodes.detailsSummary),s=to(i.node,M=>M.type===r.nodes.detailsContent);if(!o.length||!s.length)return!1;let l=o[0],u=s[0],d=i.pos,f=t.doc.resolve(d),h=d+i.node.nodeSize,m={from:d,to:h},b=u.node.content.toJSON()||[],y=f.parent.type.contentMatch.defaultType,x=[y?.create(null,l.node.content).toJSON(),...b];return e().insertContentAt(m,x).setTextSelection(d+1).run()}}},addKeyboardShortcuts(){return{Backspace:()=>{let{schema:t,selection:e}=this.editor.state,{empty:n,$anchor:r}=e;return!n||r.parent.type!==t.nodes.detailsSummary?!1:r.parentOffset!==0?this.editor.commands.command(({tr:i})=>{let o=r.pos-1,s=r.pos;return i.delete(o,s),!0}):this.editor.commands.unsetDetails()}}}});var vh=se.create({name:"detailsSummary",content:"text*",defining:!0,selectable:!1,isolating:!0,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"summary"}]},renderHTML({HTMLAttributes:t}){return["summary",j(this.options.HTMLAttributes,t),0]}});var wh=se.create({name:"detailsContent",content:"block+",defining:!0,selectable:!1,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:'div[data-type="details-content"]'}]},renderHTML({HTMLAttributes:t}){return["div",j(this.options.HTMLAttributes,t,{"data-type":"details-content"}),0]},addKeyboardShortcuts(){return{Enter:({editor:t})=>{let{state:e,view:n}=t,{selection:r}=e,{$from:i,empty:o}=r,s=no(ye=>ye.type===this.type)(r);if(!o||!s||!s.node.childCount)return!1;let l=i.index(s.depth),{childCount:u}=s.node;if(!(u===l+1))return!1;let f=s.node.type.contentMatch.defaultType,h=f?.createAndFill();if(!h)return!1;let m=e.doc.resolve(s.pos+1),b=u-1,y=s.node.child(b),v=m.posAtIndex(b,s.depth);if(!y.eq(h))return!1;let M=i.node(-3);if(!M)return!1;let D=i.indexAfter(-3),L=Ep(M.contentMatchAt(D));if(!L||!M.canReplaceWith(D,D,L))return!1;let S=L.createAndFill();if(!S)return!1;let{tr:z}=e,O=i.after(-2);z.replaceWith(O,O,S);let q=z.doc.resolve(O),J=fe.near(q,1);z.setSelection(J);let W=v,ue=v+y.nodeSize;return z.delete(W,ue),z.scrollIntoView(),n.dispatch(z),!0}}}});var PP=/^```([a-z]+)?[\s\n]$/,BP=/^~~~([a-z]+)?[\s\n]$/,fw=se.create({name:"codeBlock",addOptions(){return{languageClassPrefix:"language-",exitOnTripleEnter:!0,exitOnArrowDown:!0,HTMLAttributes:{}}},content:"text*",marks:"",group:"block",code:!0,defining:!0,addAttributes(){return{language:{default:null,parseHTML:t=>{var e;let{languageClassPrefix:n}=this.options,o=[...((e=t.firstElementChild)===null||e===void 0?void 0:e.classList)||[]].filter(s=>s.startsWith(n)).map(s=>s.replace(n,""))[0];return o||null},rendered:!1}}},parseHTML(){return[{tag:"pre",preserveWhitespace:"full"}]},renderHTML({node:t,HTMLAttributes:e}){return["pre",j(this.options.HTMLAttributes,e),["code",{class:t.attrs.language?this.options.languageClassPrefix+t.attrs.language:null},0]]},addCommands(){return{setCodeBlock:t=>({commands:e})=>e.setNode(this.name,t),toggleCodeBlock:t=>({commands:e})=>e.toggleNode(this.name,"paragraph",t)}},addKeyboardShortcuts(){return{"Mod-Alt-c":()=>this.editor.commands.toggleCodeBlock(),Backspace:()=>{let{empty:t,$anchor:e}=this.editor.state.selection,n=e.pos===1;return!t||e.parent.type.name!==this.name?!1:n||!e.parent.textContent.length?this.editor.commands.clearNodes():!1},Enter:({editor:t})=>{if(!this.options.exitOnTripleEnter)return!1;let{state:e}=t,{selection:n}=e,{$from:r,empty:i}=n;if(!i||r.parent.type!==this.type)return!1;let o=r.parentOffset===r.parent.nodeSize-2,s=r.parent.textContent.endsWith(` +// resources/js/extensions/DragAndDrop.js +var DragAndDropExtension = Extension.create({ + name: "dragAndDrop", + addProseMirrorPlugins(bla) { + return [ + new Plugin({ + props: { + handleDrop(view, event) { + if (!event) + return false; + event.preventDefault(); + const coordinates = view.posAtCoords({ + left: event.clientX, + top: event.clientY + }); + if (event.dataTransfer.getData("block")) { + event.target.dispatchEvent(new CustomEvent("dragged-block", { + detail: { + type: event.dataTransfer.getData("block"), + coordinates + }, + bubbles: true + })); + return false; + } + if (event.dataTransfer.getData("mergeTag")) { + event.target.dispatchEvent(new CustomEvent("dragged-merge-tag", { + detail: { + tag: event.dataTransfer.getData("mergeTag"), + coordinates + }, + bubbles: true + })); + return false; + } + return false; + } + } + }) + ]; + } +}); -`);return!o||!s?!1:t.chain().command(({tr:l})=>(l.delete(r.pos-2,r.pos),!0)).exitCode().run()},ArrowDown:({editor:t})=>{if(!this.options.exitOnArrowDown)return!1;let{state:e}=t,{selection:n,doc:r}=e,{$from:i,empty:o}=n;if(!o||i.parent.type!==this.type||!(i.parentOffset===i.parent.nodeSize-2))return!1;let l=i.after();return l===void 0||r.nodeAt(l)?!1:t.commands.exitCode()}}},addInputRules(){return[ea({find:PP,type:this.type,getAttributes:t=>({language:t[1]})}),ea({find:BP,type:this.type,getAttributes:t=>({language:t[1]})})]},addProseMirrorPlugins(){return[new Pe({key:new qe("codeBlockVSCodeHandler"),props:{handlePaste:(t,e)=>{if(!e.clipboardData||this.editor.isActive(this.type.name))return!1;let n=e.clipboardData.getData("text/plain"),r=e.clipboardData.getData("vscode-editor-data"),i=r?JSON.parse(r):void 0,o=i?.mode;if(!n||!o)return!1;let{tr:s}=t.state;return s.replaceSelectionWith(this.type.create({language:o})),s.setSelection(ce.near(s.doc.resolve(Math.max(0,s.selection.from-2)))),s.insertText(n.replace(/\r\n?/g,` -`)),s.setMeta("paste",!0),t.dispatch(s),!0}}})]}});var Ch={exports:{}};function kh(t){return t instanceof Map?t.clear=t.delete=t.set=function(){throw new Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=function(){throw new Error("set is read-only")}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach(function(e){var n=t[e];typeof n=="object"&&!Object.isFrozen(n)&&kh(n)}),t}Ch.exports=kh;Ch.exports.default=kh;var eu=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function ww(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function _i(t,...e){let n=Object.create(null);for(let r in t)n[r]=t[r];return e.forEach(function(r){for(let i in r)n[i]=r[i]}),n}var FP="",pw=t=>!!t.scope||t.sublanguage&&t.language,HP=(t,{prefix:e})=>{if(t.includes(".")){let n=t.split(".");return[`${e}${n.shift()}`,...n.map((r,i)=>`${r}${"_".repeat(i+1)}`)].join(" ")}return`${e}${t}`},_h=class{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=ww(e)}openNode(e){if(!pw(e))return;let n="";e.sublanguage?n=`language-${e.language}`:n=HP(e.scope,{prefix:this.classPrefix}),this.span(n)}closeNode(e){pw(e)&&(this.buffer+=FP)}value(){return this.buffer}span(e){this.buffer+=``}},hw=(t={})=>{let e={children:[]};return Object.assign(e,t),e},Sh=class t{constructor(){this.rootNode=hw(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let n=hw({scope:e});this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return typeof n=="string"?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(r=>this._walk(e,r)),e.closeNode(n)),e}static _collapse(e){typeof e!="string"&&e.children&&(e.children.every(n=>typeof n=="string")?e.children=[e.children.join("")]:e.children.forEach(n=>{t._collapse(n)}))}},Th=class extends Sh{constructor(e){super(),this.options=e}addKeyword(e,n){e!==""&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){e!==""&&this.add(e)}addSublanguage(e,n){let r=e.root;r.sublanguage=!0,r.language=n,this.add(r)}toHTML(){return new _h(this,this.options).value()}finalize(){return!0}};function sa(t){return t?typeof t=="string"?t:t.source:null}function xw(t){return ao("(?=",t,")")}function zP(t){return ao("(?:",t,")*")}function UP(t){return ao("(?:",t,")?")}function ao(...t){return t.map(n=>sa(n)).join("")}function $P(t){let e=t[t.length-1];return typeof e=="object"&&e.constructor===Object?(t.splice(t.length-1,1),e):{}}function Ah(...t){return"("+($P(t).capture?"":"?:")+t.map(r=>sa(r)).join("|")+")"}function _w(t){return new RegExp(t.toString()+"|").exec("").length-1}function WP(t,e){let n=t&&t.exec(e);return n&&n.index===0}var KP=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function Nh(t,{joinWith:e}){let n=0;return t.map(r=>{n+=1;let i=n,o=sa(r),s="";for(;o.length>0;){let l=KP.exec(o);if(!l){s+=o;break}s+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),l[0][0]==="\\"&&l[1]?s+="\\"+String(Number(l[1])+i):(s+=l[0],l[0]==="("&&n++)}return s}).map(r=>`(${r})`).join(e)}var VP=/\b\B/,Sw="[a-zA-Z]\\w*",Oh="[a-zA-Z_]\\w*",Tw="\\b\\d+(\\.\\d+)?",Mw="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",Cw="\\b(0b[01]+)",GP="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",qP=(t={})=>{let e=/^#![ ]*\//;return t.binary&&(t.begin=ao(e,/.*\b/,t.binary,/\b.*/)),_i({scope:"meta",begin:e,end:/$/,relevance:0,"on:begin":(n,r)=>{n.index!==0&&r.ignoreMatch()}},t)},aa={begin:"\\\\[\\s\\S]",relevance:0},YP={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[aa]},JP={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[aa]},XP={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},nu=function(t,e,n={}){let r=_i({scope:"comment",begin:t,end:e,contains:[]},n);r.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=Ah("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:ao(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),r},ZP=nu("//","$"),jP=nu("/\\*","\\*/"),QP=nu("#","$"),eB={scope:"number",begin:Tw,relevance:0},tB={scope:"number",begin:Mw,relevance:0},nB={scope:"number",begin:Cw,relevance:0},rB={begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[aa,{begin:/\[/,end:/\]/,relevance:0,contains:[aa]}]}]},iB={scope:"title",begin:Sw,relevance:0},oB={scope:"title",begin:Oh,relevance:0},sB={begin:"\\.\\s*"+Oh,relevance:0},aB=function(t){return Object.assign(t,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})},Qc=Object.freeze({__proto__:null,MATCH_NOTHING_RE:VP,IDENT_RE:Sw,UNDERSCORE_IDENT_RE:Oh,NUMBER_RE:Tw,C_NUMBER_RE:Mw,BINARY_NUMBER_RE:Cw,RE_STARTERS_RE:GP,SHEBANG:qP,BACKSLASH_ESCAPE:aa,APOS_STRING_MODE:YP,QUOTE_STRING_MODE:JP,PHRASAL_WORDS_MODE:XP,COMMENT:nu,C_LINE_COMMENT_MODE:ZP,C_BLOCK_COMMENT_MODE:jP,HASH_COMMENT_MODE:QP,NUMBER_MODE:eB,C_NUMBER_MODE:tB,BINARY_NUMBER_MODE:nB,REGEXP_MODE:rB,TITLE_MODE:iB,UNDERSCORE_TITLE_MODE:oB,METHOD_GUARD:sB,END_SAME_AS_BEGIN:aB});function lB(t,e){t.input[t.index-1]==="."&&e.ignoreMatch()}function cB(t,e){t.className!==void 0&&(t.scope=t.className,delete t.className)}function uB(t,e){e&&t.beginKeywords&&(t.begin="\\b("+t.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",t.__beforeBegin=lB,t.keywords=t.keywords||t.beginKeywords,delete t.beginKeywords,t.relevance===void 0&&(t.relevance=0))}function dB(t,e){Array.isArray(t.illegal)&&(t.illegal=Ah(...t.illegal))}function fB(t,e){if(t.match){if(t.begin||t.end)throw new Error("begin & end are not supported with match");t.begin=t.match,delete t.match}}function pB(t,e){t.relevance===void 0&&(t.relevance=1)}var hB=(t,e)=>{if(!t.beforeMatch)return;if(t.starts)throw new Error("beforeMatch cannot be used with starts");let n=Object.assign({},t);Object.keys(t).forEach(r=>{delete t[r]}),t.keywords=n.keywords,t.begin=ao(n.beforeMatch,xw(n.begin)),t.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},t.relevance=0,delete n.beforeMatch},mB=["of","and","for","in","not","or","if","then","parent","list","value"],gB="keyword";function kw(t,e,n=gB){let r=Object.create(null);return typeof t=="string"?i(n,t.split(" ")):Array.isArray(t)?i(n,t):Object.keys(t).forEach(function(o){Object.assign(r,kw(t[o],e,o))}),r;function i(o,s){e&&(s=s.map(l=>l.toLowerCase())),s.forEach(function(l){let u=l.split("|");r[u[0]]=[o,bB(u[0],u[1])]})}}function bB(t,e){return e?Number(e):yB(t)?0:1}function yB(t){return mB.includes(t.toLowerCase())}var mw={},so=t=>{console.error(t)},gw=(t,...e)=>{console.log(`WARN: ${t}`,...e)},Qo=(t,e)=>{mw[`${t}/${e}`]||(console.log(`Deprecated as of ${t}. ${e}`),mw[`${t}/${e}`]=!0)},tu=new Error;function Aw(t,e,{key:n}){let r=0,i=t[n],o={},s={};for(let l=1;l<=e.length;l++)s[l+r]=i[l],o[l+r]=!0,r+=_w(e[l-1]);t[n]=s,t[n]._emit=o,t[n]._multi=!0}function EB(t){if(Array.isArray(t.begin)){if(t.skip||t.excludeBegin||t.returnBegin)throw so("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),tu;if(typeof t.beginScope!="object"||t.beginScope===null)throw so("beginScope must be object"),tu;Aw(t,t.begin,{key:"beginScope"}),t.begin=Nh(t.begin,{joinWith:""})}}function vB(t){if(Array.isArray(t.end)){if(t.skip||t.excludeEnd||t.returnEnd)throw so("skip, excludeEnd, returnEnd not compatible with endScope: {}"),tu;if(typeof t.endScope!="object"||t.endScope===null)throw so("endScope must be object"),tu;Aw(t,t.end,{key:"endScope"}),t.end=Nh(t.end,{joinWith:""})}}function wB(t){t.scope&&typeof t.scope=="object"&&t.scope!==null&&(t.beginScope=t.scope,delete t.scope)}function xB(t){wB(t),typeof t.beginScope=="string"&&(t.beginScope={_wrap:t.beginScope}),typeof t.endScope=="string"&&(t.endScope={_wrap:t.endScope}),EB(t),vB(t)}function _B(t){function e(s,l){return new RegExp(sa(s),"m"+(t.case_insensitive?"i":"")+(t.unicodeRegex?"u":"")+(l?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(l,u){u.position=this.position++,this.matchIndexes[this.matchAt]=u,this.regexes.push([u,l]),this.matchAt+=_w(l)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let l=this.regexes.map(u=>u[1]);this.matcherRe=e(Nh(l,{joinWith:"|"}),!0),this.lastIndex=0}exec(l){this.matcherRe.lastIndex=this.lastIndex;let u=this.matcherRe.exec(l);if(!u)return null;let d=u.findIndex((h,m)=>m>0&&h!==void 0),f=this.matchIndexes[d];return u.splice(0,d),Object.assign(u,f)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(l){if(this.multiRegexes[l])return this.multiRegexes[l];let u=new n;return this.rules.slice(l).forEach(([d,f])=>u.addRule(d,f)),u.compile(),this.multiRegexes[l]=u,u}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(l,u){this.rules.push([l,u]),u.type==="begin"&&this.count++}exec(l){let u=this.getMatcher(this.regexIndex);u.lastIndex=this.lastIndex;let d=u.exec(l);if(this.resumingScanAtSamePosition()&&!(d&&d.index===this.lastIndex)){let f=this.getMatcher(0);f.lastIndex=this.lastIndex+1,d=f.exec(l)}return d&&(this.regexIndex+=d.position+1,this.regexIndex===this.count&&this.considerAll()),d}}function i(s){let l=new r;return s.contains.forEach(u=>l.addRule(u.begin,{rule:u,type:"begin"})),s.terminatorEnd&&l.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&l.addRule(s.illegal,{type:"illegal"}),l}function o(s,l){let u=s;if(s.isCompiled)return u;[cB,fB,xB,hB].forEach(f=>f(s,l)),t.compilerExtensions.forEach(f=>f(s,l)),s.__beforeBegin=null,[uB,dB,pB].forEach(f=>f(s,l)),s.isCompiled=!0;let d=null;return typeof s.keywords=="object"&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords),d=s.keywords.$pattern,delete s.keywords.$pattern),d=d||/\w+/,s.keywords&&(s.keywords=kw(s.keywords,t.case_insensitive)),u.keywordPatternRe=e(d,!0),l&&(s.begin||(s.begin=/\B|\b/),u.beginRe=e(u.begin),!s.end&&!s.endsWithParent&&(s.end=/\B|\b/),s.end&&(u.endRe=e(u.end)),u.terminatorEnd=sa(u.end)||"",s.endsWithParent&&l.terminatorEnd&&(u.terminatorEnd+=(s.end?"|":"")+l.terminatorEnd)),s.illegal&&(u.illegalRe=e(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map(function(f){return SB(f==="self"?s:f)})),s.contains.forEach(function(f){o(f,u)}),s.starts&&o(s.starts,l),u.matcher=i(u),u}if(t.compilerExtensions||(t.compilerExtensions=[]),t.contains&&t.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return t.classNameAliases=_i(t.classNameAliases||{}),o(t)}function Nw(t){return t?t.endsWithParent||Nw(t.starts):!1}function SB(t){return t.variants&&!t.cachedVariants&&(t.cachedVariants=t.variants.map(function(e){return _i(t,{variants:null},e)})),t.cachedVariants?t.cachedVariants:Nw(t)?_i(t,{starts:t.starts?_i(t.starts):null}):Object.isFrozen(t)?_i(t):t}var TB="11.6.0",Mh=class extends Error{constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}},xh=ww,bw=_i,yw=Symbol("nomatch"),MB=7,CB=function(t){let e=Object.create(null),n=Object.create(null),r=[],i=!0,o="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:Th};function u(P){return l.noHighlightRe.test(P)}function d(P){let N=P.className+" ";N+=P.parentNode?P.parentNode.className:"";let R=l.languageDetectRe.exec(N);if(R){let K=W(R[1]);return K||(gw(o.replace("{}",R[1])),gw("Falling back to no-highlight mode for this block.",P)),K?R[1]:"no-highlight"}return N.split(/\s+/).find(K=>u(K)||W(K))}function f(P,N,R){let K="",te="";typeof N=="object"?(K=P,R=N.ignoreIllegals,te=N.language):(Qo("10.7.0","highlight(lang, code, ...args) has been deprecated."),Qo("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),te=P,K=N),R===void 0&&(R=!0);let pe={code:K,language:te};we("before:highlight",pe);let Ce=pe.result?pe.result:h(pe.language,pe.code,R);return Ce.code=pe.code,we("after:highlight",Ce),Ce}function h(P,N,R,K){let te=Object.create(null);function pe(X,re){return X.keywords[re]}function Ce(){if(!me.keywords){ee.addText(ke);return}let X=0;me.keywordPatternRe.lastIndex=0;let re=me.keywordPatternRe.exec(ke),H="";for(;re;){H+=ke.substring(X,re.index);let Y=St.case_insensitive?re[0].toLowerCase():re[0],le=pe(me,Y);if(le){let[Me,ct]=le;if(ee.addText(H),H="",te[Y]=(te[Y]||0)+1,te[Y]<=MB&&(We+=ct),Me.startsWith("_"))H+=re[0];else{let Vt=St.classNameAliases[Me]||Me;ee.addKeyword(re[0],Vt)}}else H+=re[0];X=me.keywordPatternRe.lastIndex,re=me.keywordPatternRe.exec(ke)}H+=ke.substring(X),ee.addText(H)}function Ue(){if(ke==="")return;let X=null;if(typeof me.subLanguage=="string"){if(!e[me.subLanguage]){ee.addText(ke);return}X=h(me.subLanguage,ke,!0,Kt[me.subLanguage]),Kt[me.subLanguage]=X._top}else X=b(ke,me.subLanguage.length?me.subLanguage:null);me.relevance>0&&(We+=X.relevance),ee.addSublanguage(X._emitter,X.language)}function $e(){me.subLanguage!=null?Ue():Ce(),ke=""}function He(X,re){let H=1,Y=re.length-1;for(;H<=Y;){if(!X._emit[H]){H++;continue}let le=St.classNameAliases[X[H]]||X[H],Me=re[H];le?ee.addKeyword(Me,le):(ke=Me,Ce(),ke=""),H++}}function Xe(X,re){return X.scope&&typeof X.scope=="string"&&ee.openNode(St.classNameAliases[X.scope]||X.scope),X.beginScope&&(X.beginScope._wrap?(ee.addKeyword(ke,St.classNameAliases[X.beginScope._wrap]||X.beginScope._wrap),ke=""):X.beginScope._multi&&(He(X.beginScope,re),ke="")),me=Object.create(X,{parent:{value:me}}),me}function xt(X,re,H){let Y=WP(X.endRe,H);if(Y){if(X["on:end"]){let le=new eu(X);X["on:end"](re,le),le.isMatchIgnored&&(Y=!1)}if(Y){for(;X.endsParent&&X.parent;)X=X.parent;return X}}if(X.endsWithParent)return xt(X.parent,re,H)}function Pt(X){return me.matcher.regexIndex===0?(ke+=X[0],1):(Ot=!0,0)}function Le(X){let re=X[0],H=X.rule,Y=new eu(H),le=[H.__beforeBegin,H["on:begin"]];for(let Me of le)if(Me&&(Me(X,Y),Y.isMatchIgnored))return Pt(re);return H.skip?ke+=re:(H.excludeBegin&&(ke+=re),$e(),!H.returnBegin&&!H.excludeBegin&&(ke=re)),Xe(H,X),H.returnBegin?0:re.length}function _t(X){let re=X[0],H=N.substring(X.index),Y=xt(me,X,H);if(!Y)return yw;let le=me;me.endScope&&me.endScope._wrap?($e(),ee.addKeyword(re,me.endScope._wrap)):me.endScope&&me.endScope._multi?($e(),He(me.endScope,X)):le.skip?ke+=re:(le.returnEnd||le.excludeEnd||(ke+=re),$e(),le.excludeEnd&&(ke=re));do me.scope&&ee.closeNode(),!me.skip&&!me.subLanguage&&(We+=me.relevance),me=me.parent;while(me!==Y.parent);return Y.starts&&Xe(Y.starts,X),le.returnEnd?0:re.length}function Xt(){let X=[];for(let re=me;re!==St;re=re.parent)re.scope&&X.unshift(re.scope);X.forEach(re=>ee.openNode(re))}let st={};function Zt(X,re){let H=re&&re[0];if(ke+=X,H==null)return $e(),0;if(st.type==="begin"&&re.type==="end"&&st.index===re.index&&H===""){if(ke+=N.slice(re.index,re.index+1),!i){let Y=new Error(`0 width match regex (${P})`);throw Y.languageName=P,Y.badRule=st.rule,Y}return 1}if(st=re,re.type==="begin")return Le(re);if(re.type==="illegal"&&!R){let Y=new Error('Illegal lexeme "'+H+'" for mode "'+(me.scope||"")+'"');throw Y.mode=me,Y}else if(re.type==="end"){let Y=_t(re);if(Y!==yw)return Y}if(re.type==="illegal"&&H==="")return 1;if(mt>1e5&&mt>re.index*3)throw new Error("potential infinite loop, way more iterations than matches");return ke+=H,H.length}let St=W(P);if(!St)throw so(o.replace("{}",P)),new Error('Unknown language: "'+P+'"');let Nt=_B(St),ft="",me=K||Nt,Kt={},ee=new l.__emitter(l);Xt();let ke="",We=0,Oe=0,mt=0,Ot=!1;try{for(me.matcher.considerAll();;){mt++,Ot?Ot=!1:me.matcher.considerAll(),me.matcher.lastIndex=Oe;let X=me.matcher.exec(N);if(!X)break;let re=N.substring(Oe,X.index),H=Zt(re,X);Oe=X.index+H}return Zt(N.substring(Oe)),ee.closeAllNodes(),ee.finalize(),ft=ee.toHTML(),{language:P,value:ft,relevance:We,illegal:!1,_emitter:ee,_top:me}}catch(X){if(X.message&&X.message.includes("Illegal"))return{language:P,value:xh(N),illegal:!0,relevance:0,_illegalBy:{message:X.message,index:Oe,context:N.slice(Oe-100,Oe+100),mode:X.mode,resultSoFar:ft},_emitter:ee};if(i)return{language:P,value:xh(N),illegal:!1,relevance:0,errorRaised:X,_emitter:ee,_top:me};throw X}}function m(P){let N={value:xh(P),illegal:!1,relevance:0,_top:s,_emitter:new l.__emitter(l)};return N._emitter.addText(P),N}function b(P,N){N=N||l.languages||Object.keys(e);let R=m(P),K=N.filter(W).filter(ye).map($e=>h($e,P,!1));K.unshift(R);let te=K.sort(($e,He)=>{if($e.relevance!==He.relevance)return He.relevance-$e.relevance;if($e.language&&He.language){if(W($e.language).supersetOf===He.language)return 1;if(W(He.language).supersetOf===$e.language)return-1}return 0}),[pe,Ce]=te,Ue=pe;return Ue.secondBest=Ce,Ue}function y(P,N,R){let K=N&&n[N]||R;P.classList.add("hljs"),P.classList.add(`language-${K}`)}function v(P){let N=null,R=d(P);if(u(R))return;if(we("before:highlightElement",{el:P,language:R}),P.children.length>0&&(l.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(P)),l.throwUnescapedHTML))throw new Mh("One of your code blocks includes unescaped HTML.",P.innerHTML);N=P;let K=N.textContent,te=R?f(K,{language:R,ignoreIllegals:!0}):b(K);P.innerHTML=te.value,y(P,R,te.language),P.result={language:te.language,re:te.relevance,relevance:te.relevance},te.secondBest&&(P.secondBest={language:te.secondBest.language,relevance:te.secondBest.relevance}),we("after:highlightElement",{el:P,result:te,text:K})}function x(P){l=bw(l,P)}let M=()=>{S(),Qo("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function D(){S(),Qo("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let L=!1;function S(){if(document.readyState==="loading"){L=!0;return}document.querySelectorAll(l.cssSelector).forEach(v)}function z(){L&&S()}typeof window<"u"&&window.addEventListener&&window.addEventListener("DOMContentLoaded",z,!1);function O(P,N){let R=null;try{R=N(t)}catch(K){if(so("Language definition for '{}' could not be registered.".replace("{}",P)),i)so(K);else throw K;R=s}R.name||(R.name=P),e[P]=R,R.rawDefinition=N.bind(null,t),R.aliases&&ue(R.aliases,{languageName:P})}function q(P){delete e[P];for(let N of Object.keys(n))n[N]===P&&delete n[N]}function J(){return Object.keys(e)}function W(P){return P=(P||"").toLowerCase(),e[P]||e[n[P]]}function ue(P,{languageName:N}){typeof P=="string"&&(P=[P]),P.forEach(R=>{n[R.toLowerCase()]=N})}function ye(P){let N=W(P);return N&&!N.disableAutodetect}function Te(P){P["before:highlightBlock"]&&!P["before:highlightElement"]&&(P["before:highlightElement"]=N=>{P["before:highlightBlock"](Object.assign({block:N.el},N))}),P["after:highlightBlock"]&&!P["after:highlightElement"]&&(P["after:highlightElement"]=N=>{P["after:highlightBlock"](Object.assign({block:N.el},N))})}function ge(P){Te(P),r.push(P)}function we(P,N){let R=P;r.forEach(function(K){K[R]&&K[R](N)})}function xe(P){return Qo("10.7.0","highlightBlock will be removed entirely in v12.0"),Qo("10.7.0","Please use highlightElement now."),v(P)}Object.assign(t,{highlight:f,highlightAuto:b,highlightAll:S,highlightElement:v,highlightBlock:xe,configure:x,initHighlighting:M,initHighlightingOnLoad:D,registerLanguage:O,unregisterLanguage:q,listLanguages:J,getLanguage:W,registerAliases:ue,autoDetection:ye,inherit:bw,addPlugin:ge}),t.debugMode=function(){i=!1},t.safeMode=function(){i=!0},t.versionString=TB,t.regex={concat:ao,lookahead:xw,either:Ah,optional:UP,anyNumberOfTimes:zP};for(let P in Qc)typeof Qc[P]=="object"&&Ch.exports(Qc[P]);return Object.assign(t,Qc),t},la=CB({}),kB=la;la.HighlightJS=la;la.default=la;var AB=kB;function Ow(t,e=[]){return t.map(n=>{let r=[...e,...n.properties?n.properties.className:[]];return n.children?Ow(n.children,r):{text:n.value,classes:r}}).flat()}function Ew(t){return t.value||t.children||[]}function NB(t){return!!AB.getLanguage(t)}function vw({doc:t,name:e,lowlight:n,defaultLanguage:r}){let i=[];return to(t,o=>o.type.name===e).forEach(o=>{let s=o.pos+1,l=o.node.attrs.language||r,u=n.listLanguages(),d=l&&(u.includes(l)||NB(l))?Ew(n.highlight(l,o.node.textContent)):Ew(n.highlightAuto(o.node.textContent));Ow(d).forEach(f=>{let h=s+f.text.length;if(f.classes.length){let m=Mt.inline(s,h,{class:f.classes.join(" ")});i.push(m)}s=h})}),lt.create(t,i)}function OB(t){return typeof t=="function"}function RB({name:t,lowlight:e,defaultLanguage:n}){if(!["highlight","highlightAuto","listLanguages"].every(i=>OB(e[i])))throw Error("You should provide an instance of lowlight to use the code-block-lowlight extension");let r=new Pe({key:new qe("lowlight"),state:{init:(i,{doc:o})=>vw({doc:o,name:t,lowlight:e,defaultLanguage:n}),apply:(i,o,s,l)=>{let u=s.selection.$head.parent.type.name,d=l.selection.$head.parent.type.name,f=to(s.doc,m=>m.type.name===t),h=to(l.doc,m=>m.type.name===t);return i.docChanged&&([u,d].includes(t)||h.length!==f.length||i.steps.some(m=>m.from!==void 0&&m.to!==void 0&&f.some(b=>b.pos>=m.from&&b.pos+b.node.nodeSize<=m.to)))?vw({doc:i.doc,name:t,lowlight:e,defaultLanguage:n}):o.map(i.mapping,i.doc)}},props:{decorations(i){return r.getState(i)}}});return r}var Rw=fw.extend({addOptions(){var t;return{...(t=this.parent)===null||t===void 0?void 0:t.call(this),lowlight:{},defaultLanguage:null}},addProseMirrorPlugins(){var t;return[...((t=this.parent)===null||t===void 0?void 0:t.call(this))||[],RB({name:this.name,lowlight:this.options.lowlight,defaultLanguage:this.options.defaultLanguage})]}});var Rh=Rw.extend({addKeyboardShortcuts(){return{...this.parent?.(),ArrowDown:()=>{let t=this.editor.state,{from:e,to:n}=t.selection;if(e>1&&e===n){let r=!1;t.doc.nodesBetween(e-1,n-1,o=>{o.type.name==="codeBlock"&&(r=!0)});let i=!0;if(t.doc.nodesBetween(e+1,n+1,o=>{o&&(i=!1)}),r&&i)return this.editor.commands.setHardBreak()}return!1}}}});var Ih=se.create({name:"hurdle",group:"block",content:"block+",addOptions(){return{colors:["gray_light","gray","gray_dark","primary","secondary","tertiary","accent"],HTMLAttributes:{class:"filament-tiptap-hurdle"}}},addAttributes(){return{color:{default:"gray",parseHTML:t=>t.getAttribute("data-color"),renderHTML:t=>({"data-color":t.color})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-hurdle")}]},renderHTML({node:t,HTMLAttributes:e}){return["div",j(this.options.HTMLAttributes,e),0]},addCommands(){return{setHurdle:t=>({commands:e})=>this.options.colors.includes(t.color)?e.toggleWrap(this.name,t):!1}}});var Lh=Je.create({name:"textAlign",addOptions(){return{types:[],alignments:["start","center","end","justify"],defaultAlignment:"start"}},addGlobalAttributes(){return[{types:this.options.types,attributes:{textAlign:{default:this.options.defaultAlignment,parseHTML:t=>t.style.textAlign||this.options.defaultAlignment,renderHTML:t=>t.textAlign===this.options.defaultAlignment?{}:{style:`text-align: ${t.textAlign}`}}}}]},addCommands(){return{setTextAlign:t=>({commands:e})=>this.options.alignments.includes(t)?this.options.types.every(n=>e.updateAttributes(n,{textAlign:t})):!1,unsetTextAlign:()=>({commands:t})=>this.options.types.every(e=>t.resetAttributes(e,"textAlign"))}},addKeyboardShortcuts(){return{"Mod-Shift-l":()=>this.editor.commands.setTextAlign("start"),"Mod-Shift-e":()=>this.editor.commands.setTextAlign("center"),"Mod-Shift-r":()=>this.editor.commands.setTextAlign("end"),"Mod-Shift-j":()=>this.editor.commands.setTextAlign("justify")}}});var yt="top",Lt="bottom",kt="right",wt="left",ru="auto",Si=[yt,Lt,kt,wt],Kr="start",lo="end",Iw="clippingParents",iu="viewport",es="popper",Lw="reference",Dh=Si.reduce(function(t,e){return t.concat([e+"-"+Kr,e+"-"+lo])},[]),ou=[].concat(Si,[ru]).reduce(function(t,e){return t.concat([e,e+"-"+Kr,e+"-"+lo])},[]),IB="beforeRead",LB="read",DB="afterRead",PB="beforeMain",BB="main",FB="afterMain",HB="beforeWrite",zB="write",UB="afterWrite",Dw=[IB,LB,DB,PB,BB,FB,HB,zB,UB];function $t(t){return t?(t.nodeName||"").toLowerCase():null}function dt(t){if(t==null)return window;if(t.toString()!=="[object Window]"){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Yn(t){var e=dt(t).Element;return t instanceof e||t instanceof Element}function Dt(t){var e=dt(t).HTMLElement;return t instanceof e||t instanceof HTMLElement}function ts(t){if(typeof ShadowRoot>"u")return!1;var e=dt(t).ShadowRoot;return t instanceof e||t instanceof ShadowRoot}function $B(t){var e=t.state;Object.keys(e.elements).forEach(function(n){var r=e.styles[n]||{},i=e.attributes[n]||{},o=e.elements[n];!Dt(o)||!$t(o)||(Object.assign(o.style,r),Object.keys(i).forEach(function(s){var l=i[s];l===!1?o.removeAttribute(s):o.setAttribute(s,l===!0?"":l)}))})}function WB(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow),function(){Object.keys(e.elements).forEach(function(r){var i=e.elements[r],o=e.attributes[r]||{},s=Object.keys(e.styles.hasOwnProperty(r)?e.styles[r]:n[r]),l=s.reduce(function(u,d){return u[d]="",u},{});!Dt(i)||!$t(i)||(Object.assign(i.style,l),Object.keys(o).forEach(function(u){i.removeAttribute(u)}))})}}var ca={name:"applyStyles",enabled:!0,phase:"write",fn:$B,effect:WB,requires:["computeStyles"]};function Wt(t){return t.split("-")[0]}var ar=Math.max,co=Math.min,Vr=Math.round;function ns(){var t=navigator.userAgentData;return t!=null&&t.brands&&Array.isArray(t.brands)?t.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function ua(){return!/^((?!chrome|android).)*safari/i.test(ns())}function Jn(t,e,n){e===void 0&&(e=!1),n===void 0&&(n=!1);var r=t.getBoundingClientRect(),i=1,o=1;e&&Dt(t)&&(i=t.offsetWidth>0&&Vr(r.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Vr(r.height)/t.offsetHeight||1);var s=Yn(t)?dt(t):window,l=s.visualViewport,u=!ua()&&n,d=(r.left+(u&&l?l.offsetLeft:0))/i,f=(r.top+(u&&l?l.offsetTop:0))/o,h=r.width/i,m=r.height/o;return{width:h,height:m,top:f,right:d+h,bottom:f+m,left:d,x:d,y:f}}function uo(t){var e=Jn(t),n=t.offsetWidth,r=t.offsetHeight;return Math.abs(e.width-n)<=1&&(n=e.width),Math.abs(e.height-r)<=1&&(r=e.height),{x:t.offsetLeft,y:t.offsetTop,width:n,height:r}}function da(t,e){var n=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(n&&ts(n)){var r=e;do{if(r&&t.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function gn(t){return dt(t).getComputedStyle(t)}function Ph(t){return["table","td","th"].indexOf($t(t))>=0}function Jt(t){return((Yn(t)?t.ownerDocument:t.document)||window.document).documentElement}function Gr(t){return $t(t)==="html"?t:t.assignedSlot||t.parentNode||(ts(t)?t.host:null)||Jt(t)}function Pw(t){return!Dt(t)||gn(t).position==="fixed"?null:t.offsetParent}function KB(t){var e=/firefox/i.test(ns()),n=/Trident/i.test(ns());if(n&&Dt(t)){var r=gn(t);if(r.position==="fixed")return null}var i=Gr(t);for(ts(i)&&(i=i.host);Dt(i)&&["html","body"].indexOf($t(i))<0;){var o=gn(i);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||e&&o.willChange==="filter"||e&&o.filter&&o.filter!=="none")return i;i=i.parentNode}return null}function lr(t){for(var e=dt(t),n=Pw(t);n&&Ph(n)&&gn(n).position==="static";)n=Pw(n);return n&&($t(n)==="html"||$t(n)==="body"&&gn(n).position==="static")?e:n||KB(t)||e}function fo(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function po(t,e,n){return ar(t,co(e,n))}function Bw(t,e,n){var r=po(t,e,n);return r>n?n:r}function fa(){return{top:0,right:0,bottom:0,left:0}}function pa(t){return Object.assign({},fa(),t)}function ha(t,e){return e.reduce(function(n,r){return n[r]=t,n},{})}var VB=function(e,n){return e=typeof e=="function"?e(Object.assign({},n.rects,{placement:n.placement})):e,pa(typeof e!="number"?e:ha(e,Si))};function GB(t){var e,n=t.state,r=t.name,i=t.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,l=Wt(n.placement),u=fo(l),d=[wt,kt].indexOf(l)>=0,f=d?"height":"width";if(!(!o||!s)){var h=VB(i.padding,n),m=uo(o),b=u==="y"?yt:wt,y=u==="y"?Lt:kt,v=n.rects.reference[f]+n.rects.reference[u]-s[u]-n.rects.popper[f],x=s[u]-n.rects.reference[u],M=lr(o),D=M?u==="y"?M.clientHeight||0:M.clientWidth||0:0,L=v/2-x/2,S=h[b],z=D-m[f]-h[y],O=D/2-m[f]/2+L,q=po(S,O,z),J=u;n.modifiersData[r]=(e={},e[J]=q,e.centerOffset=q-O,e)}}function qB(t){var e=t.state,n=t.options,r=n.element,i=r===void 0?"[data-popper-arrow]":r;i!=null&&(typeof i=="string"&&(i=e.elements.popper.querySelector(i),!i)||da(e.elements.popper,i)&&(e.elements.arrow=i))}var Fw={name:"arrow",enabled:!0,phase:"main",fn:GB,effect:qB,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Xn(t){return t.split("-")[1]}var YB={top:"auto",right:"auto",bottom:"auto",left:"auto"};function JB(t,e){var n=t.x,r=t.y,i=e.devicePixelRatio||1;return{x:Vr(n*i)/i||0,y:Vr(r*i)/i||0}}function Hw(t){var e,n=t.popper,r=t.popperRect,i=t.placement,o=t.variation,s=t.offsets,l=t.position,u=t.gpuAcceleration,d=t.adaptive,f=t.roundOffsets,h=t.isFixed,m=s.x,b=m===void 0?0:m,y=s.y,v=y===void 0?0:y,x=typeof f=="function"?f({x:b,y:v}):{x:b,y:v};b=x.x,v=x.y;var M=s.hasOwnProperty("x"),D=s.hasOwnProperty("y"),L=wt,S=yt,z=window;if(d){var O=lr(n),q="clientHeight",J="clientWidth";if(O===dt(n)&&(O=Jt(n),gn(O).position!=="static"&&l==="absolute"&&(q="scrollHeight",J="scrollWidth")),O=O,i===yt||(i===wt||i===kt)&&o===lo){S=Lt;var W=h&&O===z&&z.visualViewport?z.visualViewport.height:O[q];v-=W-r.height,v*=u?1:-1}if(i===wt||(i===yt||i===Lt)&&o===lo){L=kt;var ue=h&&O===z&&z.visualViewport?z.visualViewport.width:O[J];b-=ue-r.width,b*=u?1:-1}}var ye=Object.assign({position:l},d&&YB),Te=f===!0?JB({x:b,y:v},dt(n)):{x:b,y:v};if(b=Te.x,v=Te.y,u){var ge;return Object.assign({},ye,(ge={},ge[S]=D?"0":"",ge[L]=M?"0":"",ge.transform=(z.devicePixelRatio||1)<=1?"translate("+b+"px, "+v+"px)":"translate3d("+b+"px, "+v+"px, 0)",ge))}return Object.assign({},ye,(e={},e[S]=D?v+"px":"",e[L]=M?b+"px":"",e.transform="",e))}function XB(t){var e=t.state,n=t.options,r=n.gpuAcceleration,i=r===void 0?!0:r,o=n.adaptive,s=o===void 0?!0:o,l=n.roundOffsets,u=l===void 0?!0:l,d={placement:Wt(e.placement),variation:Xn(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:i,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,Hw(Object.assign({},d,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:u})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,Hw(Object.assign({},d,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:u})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var zw={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:XB,data:{}};var su={passive:!0};function ZB(t){var e=t.state,n=t.instance,r=t.options,i=r.scroll,o=i===void 0?!0:i,s=r.resize,l=s===void 0?!0:s,u=dt(e.elements.popper),d=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&d.forEach(function(f){f.addEventListener("scroll",n.update,su)}),l&&u.addEventListener("resize",n.update,su),function(){o&&d.forEach(function(f){f.removeEventListener("scroll",n.update,su)}),l&&u.removeEventListener("resize",n.update,su)}}var Uw={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:ZB,data:{}};var jB={left:"right",right:"left",bottom:"top",top:"bottom"};function rs(t){return t.replace(/left|right|bottom|top/g,function(e){return jB[e]})}var QB={start:"end",end:"start"};function au(t){return t.replace(/start|end/g,function(e){return QB[e]})}function ho(t){var e=dt(t),n=e.pageXOffset,r=e.pageYOffset;return{scrollLeft:n,scrollTop:r}}function mo(t){return Jn(Jt(t)).left+ho(t).scrollLeft}function Bh(t,e){var n=dt(t),r=Jt(t),i=n.visualViewport,o=r.clientWidth,s=r.clientHeight,l=0,u=0;if(i){o=i.width,s=i.height;var d=ua();(d||!d&&e==="fixed")&&(l=i.offsetLeft,u=i.offsetTop)}return{width:o,height:s,x:l+mo(t),y:u}}function Fh(t){var e,n=Jt(t),r=ho(t),i=(e=t.ownerDocument)==null?void 0:e.body,o=ar(n.scrollWidth,n.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),s=ar(n.scrollHeight,n.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),l=-r.scrollLeft+mo(t),u=-r.scrollTop;return gn(i||n).direction==="rtl"&&(l+=ar(n.clientWidth,i?i.clientWidth:0)-o),{width:o,height:s,x:l,y:u}}function go(t){var e=gn(t),n=e.overflow,r=e.overflowX,i=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function lu(t){return["html","body","#document"].indexOf($t(t))>=0?t.ownerDocument.body:Dt(t)&&go(t)?t:lu(Gr(t))}function Ti(t,e){var n;e===void 0&&(e=[]);var r=lu(t),i=r===((n=t.ownerDocument)==null?void 0:n.body),o=dt(r),s=i?[o].concat(o.visualViewport||[],go(r)?r:[]):r,l=e.concat(s);return i?l:l.concat(Ti(Gr(s)))}function is(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function e2(t,e){var n=Jn(t,!1,e==="fixed");return n.top=n.top+t.clientTop,n.left=n.left+t.clientLeft,n.bottom=n.top+t.clientHeight,n.right=n.left+t.clientWidth,n.width=t.clientWidth,n.height=t.clientHeight,n.x=n.left,n.y=n.top,n}function $w(t,e,n){return e===iu?is(Bh(t,n)):Yn(e)?e2(e,n):is(Fh(Jt(t)))}function t2(t){var e=Ti(Gr(t)),n=["absolute","fixed"].indexOf(gn(t).position)>=0,r=n&&Dt(t)?lr(t):t;return Yn(r)?e.filter(function(i){return Yn(i)&&da(i,r)&&$t(i)!=="body"}):[]}function Hh(t,e,n,r){var i=e==="clippingParents"?t2(t):[].concat(e),o=[].concat(i,[n]),s=o[0],l=o.reduce(function(u,d){var f=$w(t,d,r);return u.top=ar(f.top,u.top),u.right=co(f.right,u.right),u.bottom=co(f.bottom,u.bottom),u.left=ar(f.left,u.left),u},$w(t,s,r));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l}function ma(t){var e=t.reference,n=t.element,r=t.placement,i=r?Wt(r):null,o=r?Xn(r):null,s=e.x+e.width/2-n.width/2,l=e.y+e.height/2-n.height/2,u;switch(i){case yt:u={x:s,y:e.y-n.height};break;case Lt:u={x:s,y:e.y+e.height};break;case kt:u={x:e.x+e.width,y:l};break;case wt:u={x:e.x-n.width,y:l};break;default:u={x:e.x,y:e.y}}var d=i?fo(i):null;if(d!=null){var f=d==="y"?"height":"width";switch(o){case Kr:u[d]=u[d]-(e[f]/2-n[f]/2);break;case lo:u[d]=u[d]+(e[f]/2-n[f]/2);break;default:}}return u}function cr(t,e){e===void 0&&(e={});var n=e,r=n.placement,i=r===void 0?t.placement:r,o=n.strategy,s=o===void 0?t.strategy:o,l=n.boundary,u=l===void 0?Iw:l,d=n.rootBoundary,f=d===void 0?iu:d,h=n.elementContext,m=h===void 0?es:h,b=n.altBoundary,y=b===void 0?!1:b,v=n.padding,x=v===void 0?0:v,M=pa(typeof x!="number"?x:ha(x,Si)),D=m===es?Lw:es,L=t.rects.popper,S=t.elements[y?D:m],z=Hh(Yn(S)?S:S.contextElement||Jt(t.elements.popper),u,f,s),O=Jn(t.elements.reference),q=ma({reference:O,element:L,strategy:"absolute",placement:i}),J=is(Object.assign({},L,q)),W=m===es?J:O,ue={top:z.top-W.top+M.top,bottom:W.bottom-z.bottom+M.bottom,left:z.left-W.left+M.left,right:W.right-z.right+M.right},ye=t.modifiersData.offset;if(m===es&&ye){var Te=ye[i];Object.keys(ue).forEach(function(ge){var we=[kt,Lt].indexOf(ge)>=0?1:-1,xe=[yt,Lt].indexOf(ge)>=0?"y":"x";ue[ge]+=Te[xe]*we})}return ue}function zh(t,e){e===void 0&&(e={});var n=e,r=n.placement,i=n.boundary,o=n.rootBoundary,s=n.padding,l=n.flipVariations,u=n.allowedAutoPlacements,d=u===void 0?ou:u,f=Xn(r),h=f?l?Dh:Dh.filter(function(y){return Xn(y)===f}):Si,m=h.filter(function(y){return d.indexOf(y)>=0});m.length===0&&(m=h);var b=m.reduce(function(y,v){return y[v]=cr(t,{placement:v,boundary:i,rootBoundary:o,padding:s})[Wt(v)],y},{});return Object.keys(b).sort(function(y,v){return b[y]-b[v]})}function n2(t){if(Wt(t)===ru)return[];var e=rs(t);return[au(t),e,au(e)]}function r2(t){var e=t.state,n=t.options,r=t.name;if(!e.modifiersData[r]._skip){for(var i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,l=s===void 0?!0:s,u=n.fallbackPlacements,d=n.padding,f=n.boundary,h=n.rootBoundary,m=n.altBoundary,b=n.flipVariations,y=b===void 0?!0:b,v=n.allowedAutoPlacements,x=e.options.placement,M=Wt(x),D=M===x,L=u||(D||!y?[rs(x)]:n2(x)),S=[x].concat(L).reduce(function($e,He){return $e.concat(Wt(He)===ru?zh(e,{placement:He,boundary:f,rootBoundary:h,padding:d,flipVariations:y,allowedAutoPlacements:v}):He)},[]),z=e.rects.reference,O=e.rects.popper,q=new Map,J=!0,W=S[0],ue=0;ue=0,xe=we?"width":"height",P=cr(e,{placement:ye,boundary:f,rootBoundary:h,altBoundary:m,padding:d}),N=we?ge?kt:wt:ge?Lt:yt;z[xe]>O[xe]&&(N=rs(N));var R=rs(N),K=[];if(o&&K.push(P[Te]<=0),l&&K.push(P[N]<=0,P[R]<=0),K.every(function($e){return $e})){W=ye,J=!1;break}q.set(ye,K)}if(J)for(var te=y?3:1,pe=function(He){var Xe=S.find(function(xt){var Pt=q.get(xt);if(Pt)return Pt.slice(0,He).every(function(Le){return Le})});if(Xe)return W=Xe,"break"},Ce=te;Ce>0;Ce--){var Ue=pe(Ce);if(Ue==="break")break}e.placement!==W&&(e.modifiersData[r]._skip=!0,e.placement=W,e.reset=!0)}}var Ww={name:"flip",enabled:!0,phase:"main",fn:r2,requiresIfExists:["offset"],data:{_skip:!1}};function Kw(t,e,n){return n===void 0&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function Vw(t){return[yt,kt,Lt,wt].some(function(e){return t[e]>=0})}function i2(t){var e=t.state,n=t.name,r=e.rects.reference,i=e.rects.popper,o=e.modifiersData.preventOverflow,s=cr(e,{elementContext:"reference"}),l=cr(e,{altBoundary:!0}),u=Kw(s,r),d=Kw(l,i,o),f=Vw(u),h=Vw(d);e.modifiersData[n]={referenceClippingOffsets:u,popperEscapeOffsets:d,isReferenceHidden:f,hasPopperEscaped:h},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":f,"data-popper-escaped":h})}var Gw={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:i2};function o2(t,e,n){var r=Wt(t),i=[wt,yt].indexOf(r)>=0?-1:1,o=typeof n=="function"?n(Object.assign({},e,{placement:t})):n,s=o[0],l=o[1];return s=s||0,l=(l||0)*i,[wt,kt].indexOf(r)>=0?{x:l,y:s}:{x:s,y:l}}function s2(t){var e=t.state,n=t.options,r=t.name,i=n.offset,o=i===void 0?[0,0]:i,s=ou.reduce(function(f,h){return f[h]=o2(h,e.rects,o),f},{}),l=s[e.placement],u=l.x,d=l.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=d),e.modifiersData[r]=s}var qw={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:s2};function a2(t){var e=t.state,n=t.name;e.modifiersData[n]=ma({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var Yw={name:"popperOffsets",enabled:!0,phase:"read",fn:a2,data:{}};function Uh(t){return t==="x"?"y":"x"}function l2(t){var e=t.state,n=t.options,r=t.name,i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,l=s===void 0?!1:s,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.padding,m=n.tether,b=m===void 0?!0:m,y=n.tetherOffset,v=y===void 0?0:y,x=cr(e,{boundary:u,rootBoundary:d,padding:h,altBoundary:f}),M=Wt(e.placement),D=Xn(e.placement),L=!D,S=fo(M),z=Uh(S),O=e.modifiersData.popperOffsets,q=e.rects.reference,J=e.rects.popper,W=typeof v=="function"?v(Object.assign({},e.rects,{placement:e.placement})):v,ue=typeof W=="number"?{mainAxis:W,altAxis:W}:Object.assign({mainAxis:0,altAxis:0},W),ye=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,Te={x:0,y:0};if(O){if(o){var ge,we=S==="y"?yt:wt,xe=S==="y"?Lt:kt,P=S==="y"?"height":"width",N=O[S],R=N+x[we],K=N-x[xe],te=b?-J[P]/2:0,pe=D===Kr?q[P]:J[P],Ce=D===Kr?-J[P]:-q[P],Ue=e.elements.arrow,$e=b&&Ue?uo(Ue):{width:0,height:0},He=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:fa(),Xe=He[we],xt=He[xe],Pt=po(0,q[P],$e[P]),Le=L?q[P]/2-te-Pt-Xe-ue.mainAxis:pe-Pt-Xe-ue.mainAxis,_t=L?-q[P]/2+te+Pt+xt+ue.mainAxis:Ce+Pt+xt+ue.mainAxis,Xt=e.elements.arrow&&lr(e.elements.arrow),st=Xt?S==="y"?Xt.clientTop||0:Xt.clientLeft||0:0,Zt=(ge=ye?.[S])!=null?ge:0,St=N+Le-Zt-st,Nt=N+_t-Zt,ft=po(b?co(R,St):R,N,b?ar(K,Nt):K);O[S]=ft,Te[S]=ft-N}if(l){var me,Kt=S==="x"?yt:wt,ee=S==="x"?Lt:kt,ke=O[z],We=z==="y"?"height":"width",Oe=ke+x[Kt],mt=ke-x[ee],Ot=[yt,wt].indexOf(M)!==-1,X=(me=ye?.[z])!=null?me:0,re=Ot?Oe:ke-q[We]-J[We]-X+ue.altAxis,H=Ot?ke+q[We]+J[We]-X-ue.altAxis:mt,Y=b&&Ot?Bw(re,ke,H):po(b?re:Oe,ke,b?H:mt);O[z]=Y,Te[z]=Y-ke}e.modifiersData[r]=Te}}var Jw={name:"preventOverflow",enabled:!0,phase:"main",fn:l2,requiresIfExists:["offset"]};function $h(t){return{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}}function Wh(t){return t===dt(t)||!Dt(t)?ho(t):$h(t)}function c2(t){var e=t.getBoundingClientRect(),n=Vr(e.width)/t.offsetWidth||1,r=Vr(e.height)/t.offsetHeight||1;return n!==1||r!==1}function Kh(t,e,n){n===void 0&&(n=!1);var r=Dt(e),i=Dt(e)&&c2(e),o=Jt(e),s=Jn(t,i,n),l={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(r||!r&&!n)&&(($t(e)!=="body"||go(o))&&(l=Wh(e)),Dt(e)?(u=Jn(e,!0),u.x+=e.clientLeft,u.y+=e.clientTop):o&&(u.x=mo(o))),{x:s.left+l.scrollLeft-u.x,y:s.top+l.scrollTop-u.y,width:s.width,height:s.height}}function u2(t){var e=new Map,n=new Set,r=[];t.forEach(function(o){e.set(o.name,o)});function i(o){n.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(l){if(!n.has(l)){var u=e.get(l);u&&i(u)}}),r.push(o)}return t.forEach(function(o){n.has(o.name)||i(o)}),r}function Vh(t){var e=u2(t);return Dw.reduce(function(n,r){return n.concat(e.filter(function(i){return i.phase===r}))},[])}function Gh(t){var e;return function(){return e||(e=new Promise(function(n){Promise.resolve().then(function(){e=void 0,n(t())})})),e}}function qh(t){var e=t.reduce(function(n,r){var i=n[r.name];return n[r.name]=i?Object.assign({},i,r,{options:Object.assign({},i.options,r.options),data:Object.assign({},i.data,r.data)}):r,n},{});return Object.keys(e).map(function(n){return e[n]})}var Xw={placement:"bottom",modifiers:[],strategy:"absolute"};function Zw(){for(var t=arguments.length,e=new Array(t),n=0;n-1}function fx(t,e){return typeof t=="function"?t.apply(void 0,e):t}function Qw(t,e){if(e===0)return t;var n;return function(r){clearTimeout(n),n=setTimeout(function(){t(r)},e)}}function h2(t){return t.split(/\s+/).filter(Boolean)}function ss(t){return[].concat(t)}function ex(t,e){t.indexOf(e)===-1&&t.push(e)}function m2(t){return t.filter(function(e,n){return t.indexOf(e)===n})}function g2(t){return t.split("-")[0]}function uu(t){return[].slice.call(t)}function tx(t){return Object.keys(t).reduce(function(e,n){return t[n]!==void 0&&(e[n]=t[n]),e},{})}function ga(){return document.createElement("div")}function du(t){return["Element","Fragment"].some(function(e){return tm(t,e)})}function b2(t){return tm(t,"NodeList")}function y2(t){return tm(t,"MouseEvent")}function E2(t){return!!(t&&t._tippy&&t._tippy.reference===t)}function v2(t){return du(t)?[t]:b2(t)?uu(t):Array.isArray(t)?t:uu(document.querySelectorAll(t))}function Xh(t,e){t.forEach(function(n){n&&(n.style.transitionDuration=e+"ms")})}function nx(t,e){t.forEach(function(n){n&&n.setAttribute("data-state",e)})}function w2(t){var e,n=ss(t),r=n[0];return r!=null&&(e=r.ownerDocument)!=null&&e.body?r.ownerDocument:document}function x2(t,e){var n=e.clientX,r=e.clientY;return t.every(function(i){var o=i.popperRect,s=i.popperState,l=i.props,u=l.interactiveBorder,d=g2(s.placement),f=s.modifiersData.offset;if(!f)return!0;var h=d==="bottom"?f.top.y:0,m=d==="top"?f.bottom.y:0,b=d==="right"?f.left.x:0,y=d==="left"?f.right.x:0,v=o.top-r+h>u,x=r-o.bottom-m>u,M=o.left-n+b>u,D=n-o.right-y>u;return v||x||M||D})}function Zh(t,e,n){var r=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach(function(i){t[r](i,n)})}function rx(t,e){for(var n=e;n;){var r;if(t.contains(n))return!0;n=n.getRootNode==null||(r=n.getRootNode())==null?void 0:r.host}return!1}var _r={isTouch:!1},ix=0;function _2(){_r.isTouch||(_r.isTouch=!0,window.performance&&document.addEventListener("mousemove",px))}function px(){var t=performance.now();t-ix<20&&(_r.isTouch=!1,document.removeEventListener("mousemove",px)),ix=t}function S2(){var t=document.activeElement;if(E2(t)){var e=t._tippy;t.blur&&!e.state.isVisible&&t.blur()}}function T2(){document.addEventListener("touchstart",_2,bo),window.addEventListener("blur",S2)}var M2=typeof window<"u"&&typeof document<"u",C2=M2?!!window.msCrypto:!1;var k2={animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},A2={allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999},ur=Object.assign({appendTo:dx,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},k2,A2),N2=Object.keys(ur),O2=function(e){var n=Object.keys(e);n.forEach(function(r){ur[r]=e[r]})};function hx(t){var e=t.plugins||[],n=e.reduce(function(r,i){var o=i.name,s=i.defaultValue;if(o){var l;r[o]=t[o]!==void 0?t[o]:(l=ur[o])!=null?l:s}return r},{});return Object.assign({},t,n)}function R2(t,e){var n=e?Object.keys(hx(Object.assign({},ur,{plugins:e}))):N2,r=n.reduce(function(i,o){var s=(t.getAttribute("data-tippy-"+o)||"").trim();if(!s)return i;if(o==="content")i[o]=s;else try{i[o]=JSON.parse(s)}catch{i[o]=s}return i},{});return r}function ox(t,e){var n=Object.assign({},e,{content:fx(e.content,[t])},e.ignoreAttributes?{}:R2(t,e.plugins));return n.aria=Object.assign({},ur.aria,n.aria),n.aria={expanded:n.aria.expanded==="auto"?e.interactive:n.aria.expanded,content:n.aria.content==="auto"?e.interactive?null:"describedby":n.aria.content},n}var I2=function(){return"innerHTML"};function Qh(t,e){t[I2()]=e}function sx(t){var e=ga();return t===!0?e.className=cx:(e.className=ux,du(t)?e.appendChild(t):Qh(e,t)),e}function ax(t,e){du(e.content)?(Qh(t,""),t.appendChild(e.content)):typeof e.content!="function"&&(e.allowHTML?Qh(t,e.content):t.textContent=e.content)}function em(t){var e=t.firstElementChild,n=uu(e.children);return{box:e,content:n.find(function(r){return r.classList.contains(lx)}),arrow:n.find(function(r){return r.classList.contains(cx)||r.classList.contains(ux)}),backdrop:n.find(function(r){return r.classList.contains(p2)})}}function mx(t){var e=ga(),n=ga();n.className=f2,n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=ga();r.className=lx,r.setAttribute("data-state","hidden"),ax(r,t.props),e.appendChild(n),n.appendChild(r),i(t.props,t.props);function i(o,s){var l=em(e),u=l.box,d=l.content,f=l.arrow;s.theme?u.setAttribute("data-theme",s.theme):u.removeAttribute("data-theme"),typeof s.animation=="string"?u.setAttribute("data-animation",s.animation):u.removeAttribute("data-animation"),s.inertia?u.setAttribute("data-inertia",""):u.removeAttribute("data-inertia"),u.style.maxWidth=typeof s.maxWidth=="number"?s.maxWidth+"px":s.maxWidth,s.role?u.setAttribute("role",s.role):u.removeAttribute("role"),(o.content!==s.content||o.allowHTML!==s.allowHTML)&&ax(d,t.props),s.arrow?f?o.arrow!==s.arrow&&(u.removeChild(f),u.appendChild(sx(s.arrow))):u.appendChild(sx(s.arrow)):f&&u.removeChild(f)}return{popper:e,onUpdate:i}}mx.$$tippy=!0;var L2=1,cu=[],jh=[];function D2(t,e){var n=ox(t,Object.assign({},ur,hx(tx(e)))),r,i,o,s=!1,l=!1,u=!1,d=!1,f,h,m,b=[],y=Qw(St,n.interactiveDebounce),v,x=L2++,M=null,D=m2(n.plugins),L={isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},S={id:x,reference:t,popper:ga(),popperInstance:M,props:n,state:L,plugins:D,clearDelayTimeouts:re,setProps:H,setContent:Y,show:le,hide:Me,hideWithInteractivity:ct,enable:Ot,disable:X,unmount:Vt,destroy:ki};if(!n.render)return S;var z=n.render(S),O=z.popper,q=z.onUpdate;O.setAttribute("data-tippy-root",""),O.id="tippy-"+S.id,S.popper=O,t._tippy=S,O._tippy=S;var J=D.map(function(B){return B.fn(S)}),W=t.hasAttribute("aria-expanded");return Xt(),te(),N(),R("onCreate",[S]),n.showOnCreate&&Oe(),O.addEventListener("mouseenter",function(){S.props.interactive&&S.state.isVisible&&S.clearDelayTimeouts()}),O.addEventListener("mouseleave",function(){S.props.interactive&&S.props.trigger.indexOf("mouseenter")>=0&&we().addEventListener("mousemove",y)}),S;function ue(){var B=S.props.touch;return Array.isArray(B)?B:[B,0]}function ye(){return ue()[0]==="hold"}function Te(){var B;return!!((B=S.props.render)!=null&&B.$$tippy)}function ge(){return v||t}function we(){var B=ge().parentNode;return B?w2(B):document}function xe(){return em(O)}function P(B){return S.state.isMounted&&!S.state.isVisible||_r.isTouch||f&&f.type==="focus"?0:Jh(S.props.delay,B?0:1,ur.delay)}function N(B){B===void 0&&(B=!1),O.style.pointerEvents=S.props.interactive&&!B?"":"none",O.style.zIndex=""+S.props.zIndex}function R(B,ae,_e){if(_e===void 0&&(_e=!0),J.forEach(function(Ve){Ve[B]&&Ve[B].apply(Ve,ae)}),_e){var Ze;(Ze=S.props)[B].apply(Ze,ae)}}function K(){var B=S.props.aria;if(B.content){var ae="aria-"+B.content,_e=O.id,Ze=ss(S.props.triggerTarget||t);Ze.forEach(function(Ve){var Bt=Ve.getAttribute(ae);if(S.state.isVisible)Ve.setAttribute(ae,Bt?Bt+" "+_e:_e);else{var sn=Bt&&Bt.replace(_e,"").trim();sn?Ve.setAttribute(ae,sn):Ve.removeAttribute(ae)}})}}function te(){if(!(W||!S.props.aria.expanded)){var B=ss(S.props.triggerTarget||t);B.forEach(function(ae){S.props.interactive?ae.setAttribute("aria-expanded",S.state.isVisible&&ae===ge()?"true":"false"):ae.removeAttribute("aria-expanded")})}}function pe(){we().removeEventListener("mousemove",y),cu=cu.filter(function(B){return B!==y})}function Ce(B){if(!(_r.isTouch&&(u||B.type==="mousedown"))){var ae=B.composedPath&&B.composedPath()[0]||B.target;if(!(S.props.interactive&&rx(O,ae))){if(ss(S.props.triggerTarget||t).some(function(_e){return rx(_e,ae)})){if(_r.isTouch||S.state.isVisible&&S.props.trigger.indexOf("click")>=0)return}else R("onClickOutside",[S,B]);S.props.hideOnClick===!0&&(S.clearDelayTimeouts(),S.hide(),l=!0,setTimeout(function(){l=!1}),S.state.isMounted||Xe())}}}function Ue(){u=!0}function $e(){u=!1}function He(){var B=we();B.addEventListener("mousedown",Ce,!0),B.addEventListener("touchend",Ce,bo),B.addEventListener("touchstart",$e,bo),B.addEventListener("touchmove",Ue,bo)}function Xe(){var B=we();B.removeEventListener("mousedown",Ce,!0),B.removeEventListener("touchend",Ce,bo),B.removeEventListener("touchstart",$e,bo),B.removeEventListener("touchmove",Ue,bo)}function xt(B,ae){Le(B,function(){!S.state.isVisible&&O.parentNode&&O.parentNode.contains(O)&&ae()})}function Pt(B,ae){Le(B,ae)}function Le(B,ae){var _e=xe().box;function Ze(Ve){Ve.target===_e&&(Zh(_e,"remove",Ze),ae())}if(B===0)return ae();Zh(_e,"remove",h),Zh(_e,"add",Ze),h=Ze}function _t(B,ae,_e){_e===void 0&&(_e=!1);var Ze=ss(S.props.triggerTarget||t);Ze.forEach(function(Ve){Ve.addEventListener(B,ae,_e),b.push({node:Ve,eventType:B,handler:ae,options:_e})})}function Xt(){ye()&&(_t("touchstart",Zt,{passive:!0}),_t("touchend",Nt,{passive:!0})),h2(S.props.trigger).forEach(function(B){if(B!=="manual")switch(_t(B,Zt),B){case"mouseenter":_t("mouseleave",Nt);break;case"focus":_t(C2?"focusout":"blur",ft);break;case"focusin":_t("focusout",ft);break}})}function st(){b.forEach(function(B){var ae=B.node,_e=B.eventType,Ze=B.handler,Ve=B.options;ae.removeEventListener(_e,Ze,Ve)}),b=[]}function Zt(B){var ae,_e=!1;if(!(!S.state.isEnabled||me(B)||l)){var Ze=((ae=f)==null?void 0:ae.type)==="focus";f=B,v=B.currentTarget,te(),!S.state.isVisible&&y2(B)&&cu.forEach(function(Ve){return Ve(B)}),B.type==="click"&&(S.props.trigger.indexOf("mouseenter")<0||s)&&S.props.hideOnClick!==!1&&S.state.isVisible?_e=!0:Oe(B),B.type==="click"&&(s=!_e),_e&&!Ze&&mt(B)}}function St(B){var ae=B.target,_e=ge().contains(ae)||O.contains(ae);if(!(B.type==="mousemove"&&_e)){var Ze=We().concat(O).map(function(Ve){var Bt,sn=Ve._tippy,Yr=(Bt=sn.popperInstance)==null?void 0:Bt.state;return Yr?{popperRect:Ve.getBoundingClientRect(),popperState:Yr,props:n}:null}).filter(Boolean);x2(Ze,B)&&(pe(),mt(B))}}function Nt(B){var ae=me(B)||S.props.trigger.indexOf("click")>=0&&s;if(!ae){if(S.props.interactive){S.hideWithInteractivity(B);return}mt(B)}}function ft(B){S.props.trigger.indexOf("focusin")<0&&B.target!==ge()||S.props.interactive&&B.relatedTarget&&O.contains(B.relatedTarget)||mt(B)}function me(B){return _r.isTouch?ye()!==B.type.indexOf("touch")>=0:!1}function Kt(){ee();var B=S.props,ae=B.popperOptions,_e=B.placement,Ze=B.offset,Ve=B.getReferenceClientRect,Bt=B.moveTransition,sn=Te()?em(O).arrow:null,Yr=Ve?{getBoundingClientRect:Ve,contextElement:Ve.contextElement||ge()}:t,Ta={name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(Ai){var Jr=Ai.state;if(Te()){var Iu=xe(),gs=Iu.box;["placement","reference-hidden","escaped"].forEach(function(Xr){Xr==="placement"?gs.setAttribute("data-placement",Jr.placement):Jr.attributes.popper["data-popper-"+Xr]?gs.setAttribute("data-"+Xr,""):gs.removeAttribute("data-"+Xr)}),Jr.attributes.popper={}}}},Sr=[{name:"offset",options:{offset:Ze}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!Bt}},Ta];Te()&&sn&&Sr.push({name:"arrow",options:{element:sn,padding:3}}),Sr.push.apply(Sr,ae?.modifiers||[]),S.popperInstance=Yh(Yr,O,Object.assign({},ae,{placement:_e,onFirstUpdate:m,modifiers:Sr}))}function ee(){S.popperInstance&&(S.popperInstance.destroy(),S.popperInstance=null)}function ke(){var B=S.props.appendTo,ae,_e=ge();S.props.interactive&&B===dx||B==="parent"?ae=_e.parentNode:ae=fx(B,[_e]),ae.contains(O)||ae.appendChild(O),S.state.isMounted=!0,Kt()}function We(){return uu(O.querySelectorAll("[data-tippy-root]"))}function Oe(B){S.clearDelayTimeouts(),B&&R("onTrigger",[S,B]),He();var ae=P(!0),_e=ue(),Ze=_e[0],Ve=_e[1];_r.isTouch&&Ze==="hold"&&Ve&&(ae=Ve),ae?r=setTimeout(function(){S.show()},ae):S.show()}function mt(B){if(S.clearDelayTimeouts(),R("onUntrigger",[S,B]),!S.state.isVisible){Xe();return}if(!(S.props.trigger.indexOf("mouseenter")>=0&&S.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(B.type)>=0&&s)){var ae=P(!1);ae?i=setTimeout(function(){S.state.isVisible&&S.hide()},ae):o=requestAnimationFrame(function(){S.hide()})}}function Ot(){S.state.isEnabled=!0}function X(){S.hide(),S.state.isEnabled=!1}function re(){clearTimeout(r),clearTimeout(i),cancelAnimationFrame(o)}function H(B){if(!S.state.isDestroyed){R("onBeforeUpdate",[S,B]),st();var ae=S.props,_e=ox(t,Object.assign({},ae,tx(B),{ignoreAttributes:!0}));S.props=_e,Xt(),ae.interactiveDebounce!==_e.interactiveDebounce&&(pe(),y=Qw(St,_e.interactiveDebounce)),ae.triggerTarget&&!_e.triggerTarget?ss(ae.triggerTarget).forEach(function(Ze){Ze.removeAttribute("aria-expanded")}):_e.triggerTarget&&t.removeAttribute("aria-expanded"),te(),N(),q&&q(ae,_e),S.popperInstance&&(Kt(),We().forEach(function(Ze){requestAnimationFrame(Ze._tippy.popperInstance.forceUpdate)})),R("onAfterUpdate",[S,B])}}function Y(B){S.setProps({content:B})}function le(){var B=S.state.isVisible,ae=S.state.isDestroyed,_e=!S.state.isEnabled,Ze=_r.isTouch&&!S.props.touch,Ve=Jh(S.props.duration,0,ur.duration);if(!(B||ae||_e||Ze)&&!ge().hasAttribute("disabled")&&(R("onShow",[S],!1),S.props.onShow(S)!==!1)){if(S.state.isVisible=!0,Te()&&(O.style.visibility="visible"),N(),He(),S.state.isMounted||(O.style.transition="none"),Te()){var Bt=xe(),sn=Bt.box,Yr=Bt.content;Xh([sn,Yr],0)}m=function(){var Sr;if(!(!S.state.isVisible||d)){if(d=!0,O.offsetHeight,O.style.transition=S.props.moveTransition,Te()&&S.props.animation){var ms=xe(),Ai=ms.box,Jr=ms.content;Xh([Ai,Jr],Ve),nx([Ai,Jr],"visible")}K(),te(),ex(jh,S),(Sr=S.popperInstance)==null||Sr.forceUpdate(),R("onMount",[S]),S.props.animation&&Te()&&Pt(Ve,function(){S.state.isShown=!0,R("onShown",[S])})}},ke()}}function Me(){var B=!S.state.isVisible,ae=S.state.isDestroyed,_e=!S.state.isEnabled,Ze=Jh(S.props.duration,1,ur.duration);if(!(B||ae||_e)&&(R("onHide",[S],!1),S.props.onHide(S)!==!1)){if(S.state.isVisible=!1,S.state.isShown=!1,d=!1,s=!1,Te()&&(O.style.visibility="hidden"),pe(),Xe(),N(!0),Te()){var Ve=xe(),Bt=Ve.box,sn=Ve.content;S.props.animation&&(Xh([Bt,sn],Ze),nx([Bt,sn],"hidden"))}K(),te(),S.props.animation?Te()&&xt(Ze,S.unmount):S.unmount()}}function ct(B){we().addEventListener("mousemove",y),ex(cu,y),y(B)}function Vt(){S.state.isVisible&&S.hide(),S.state.isMounted&&(ee(),We().forEach(function(B){B._tippy.unmount()}),O.parentNode&&O.parentNode.removeChild(O),jh=jh.filter(function(B){return B!==S}),S.state.isMounted=!1,R("onHidden",[S]))}function ki(){S.state.isDestroyed||(S.clearDelayTimeouts(),S.unmount(),st(),delete t._tippy,S.state.isDestroyed=!0,R("onDestroy",[S]))}}function ba(t,e){e===void 0&&(e={});var n=ur.plugins.concat(e.plugins||[]);T2();var r=Object.assign({},e,{plugins:n}),i=v2(t);if(0)var o,s;var l=i.reduce(function(u,d){var f=d&&D2(d,r);return f&&u.push(f),u},[]);return du(t)?l[0]:l}ba.defaultProps=ur;ba.setDefaultProps=O2;ba.currentInput=_r;var kV=Object.assign({},ca,{effect:function(e){var n=e.state,r={popper:{position:n.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(n.elements.popper.style,r.popper),n.styles=r,n.elements.arrow&&Object.assign(n.elements.arrow.style,r.arrow)}});ba.setDefaultProps({render:mx});var as=ba;var nm=class{constructor({editor:e,element:n,view:r,tippyOptions:i={},updateDelay:o=250,shouldShow:s}){un(this,"shouldShow",({view:e,state:n,from:r,to:i})=>{let{doc:o,selection:s}=n,{empty:l}=s,u=!o.textBetween(r,i).length&&Ql(n.selection),d=this.element.contains(document.activeElement);return!(!(e.hasFocus()||d)||l||u||!this.editor.isEditable)});un(this,"mousedownHandler",()=>{this.preventHide=!0});un(this,"dragstartHandler",()=>{this.hide()});un(this,"focusHandler",()=>{setTimeout(()=>this.update(this.editor.view))});un(this,"blurHandler",({event:e})=>{if(this.preventHide){this.preventHide=!1;return}e?.relatedTarget&&this.element.parentNode?.contains(e.relatedTarget)||this.hide()});un(this,"tippyBlurHandler",e=>{this.blurHandler({event:e})});un(this,"handleDebouncedUpdate",(e,n)=>{let r=!n?.selection.eq(e.state.selection),i=!n?.doc.eq(e.state.doc);!r&&!i||(this.updateDebounceTimer&&clearTimeout(this.updateDebounceTimer),this.updateDebounceTimer=window.setTimeout(()=>{this.updateHandler(e,r,i,n)},this.updateDelay))});un(this,"updateHandler",(e,n,r,i)=>{let{state:o,composing:s}=e,{selection:l}=o;if(s||!n&&!r)return;this.createTooltip();let{ranges:d}=l,f=Math.min(...d.map(b=>b.$from.pos)),h=Math.max(...d.map(b=>b.$to.pos));if(!this.shouldShow?.({editor:this.editor,view:e,state:o,oldState:i,from:f,to:h})){this.hide();return}o.selection.$anchor.pos!==i?.selection.$anchor.pos&&this.update(e,o),this.tippy?.setProps({getReferenceClientRect:this.tippyOptions?.getReferenceClientRect||(()=>{if(NE(o.selection)){let b=e.nodeDOM(f),y=b.dataset.nodeViewWrapper?b:b.querySelector("[data-node-view-wrapper]");if(y&&(b=y.firstChild),b)return b.getBoundingClientRect()}return rc(e,f,h)})}),this.show()});this.editor=e,this.element=n,this.view=r,this.updateDelay=o,s&&(this.shouldShow=s),this.element.addEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.addEventListener("dragstart",this.dragstartHandler),this.editor.on("focus",this.focusHandler),this.editor.on("blur",this.blurHandler),this.tippyOptions=i,this.element.style.visibility="hidden",this.element.style.position="absolute"}createTooltip(){let{element:e}=this.editor.options,n=!!e.parentElement;this.tippy||!n||(this.tippy=as(e,{duration:0,getReferenceClientRect:null,content:this.element,interactive:!0,trigger:"manual",placement:"top",hideOnClick:"toggle",...this.tippyOptions}),this.tippy.popper.firstChild&&this.tippy.popper.firstChild.addEventListener("blur",this.tippyBlurHandler))}update(e,n){let{state:r}=e,i=r.selection.$from.pos!==r.selection.$to.pos;if(this.updateDelay>0&&i){this.handleDebouncedUpdate(e,n);return}let o=!n?.selection.eq(e.state.selection),s=!n?.doc.eq(e.state.doc);this.updateHandler(e,o,s,n)}show(){this.element.style.position="relative",this.element.style.visibility="visible",this.tippy?.show()}hide(){this.element.style.position="absolute",this.element.style.visibility="hidden",this.tippy?.hide()}destroy(){this.tippy?.popper.firstChild&&this.tippy.popper.firstChild.removeEventListener("blur",this.tippyBlurHandler),this.tippy?.destroy(),this.element.removeEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.removeEventListener("dragstart",this.dragstartHandler),this.editor.off("focus",this.focusHandler),this.editor.off("blur",this.blurHandler)}},gx=t=>new Pe({key:typeof t.pluginKey=="string"?new qe(t.pluginKey):t.pluginKey,view:e=>new nm({view:e,...t})});var ya=Je.create({name:"bubbleMenu",addOptions(){return{element:null,tippyOptions:{},pluginKey:"bubbleMenu",updateDelay:void 0,shouldShow:null}},addProseMirrorPlugins(){return this.options.element?[gx({pluginKey:this.options.pluginKey,editor:this.editor,element:this.options.element,tippyOptions:this.options.tippyOptions,updateDelay:this.options.updateDelay,shouldShow:this.options.shouldShow})]:[]}});var rm=class{constructor({editor:e,element:n,view:r,tippyOptions:i={},shouldShow:o}){un(this,"shouldShow",({view:e,state:n})=>{let{selection:r}=n,{$anchor:i,empty:o}=r,s=i.depth===1,l=i.parent.isTextblock&&!i.parent.type.spec.code&&!i.parent.textContent;return!(!e.hasFocus()||!o||!s||!l||!this.editor.isEditable)});un(this,"mousedownHandler",()=>{this.preventHide=!0});un(this,"focusHandler",()=>{setTimeout(()=>this.update(this.editor.view))});un(this,"blurHandler",({event:e})=>{if(this.preventHide){this.preventHide=!1;return}e?.relatedTarget&&this.element.parentNode?.contains(e.relatedTarget)||this.hide()});un(this,"tippyBlurHandler",e=>{this.blurHandler({event:e})});this.editor=e,this.element=n,this.view=r,o&&(this.shouldShow=o),this.element.addEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.editor.on("focus",this.focusHandler),this.editor.on("blur",this.blurHandler),this.tippyOptions=i,this.element.style.visibility="hidden",this.element.style.position="absolute"}createTooltip(){let{element:e}=this.editor.options,n=!!e.parentElement;this.tippy||!n||(this.tippy=as(e,{duration:0,getReferenceClientRect:null,content:this.element,interactive:!0,trigger:"manual",placement:"right",hideOnClick:"toggle",...this.tippyOptions}),this.tippy.popper.firstChild&&this.tippy.popper.firstChild.addEventListener("blur",this.tippyBlurHandler))}update(e,n){let{state:r}=e,{doc:i,selection:o}=r,{from:s,to:l}=o;if(n&&n.doc.eq(i)&&n.selection.eq(o))return;if(this.createTooltip(),!this.shouldShow?.({editor:this.editor,view:e,state:r,oldState:n})){this.hide();return}this.tippy?.setProps({getReferenceClientRect:this.tippyOptions?.getReferenceClientRect||(()=>rc(e,s,l))}),this.show()}show(){this.element.style.position="relative",this.element.style.visibility="visible",this.tippy?.show()}hide(){this.tippy?.hide()}destroy(){this.tippy?.popper.firstChild&&this.tippy.popper.firstChild.removeEventListener("blur",this.tippyBlurHandler),this.tippy?.destroy(),this.element.removeEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.editor.off("focus",this.focusHandler),this.editor.off("blur",this.blurHandler)}},bx=t=>new Pe({key:typeof t.pluginKey=="string"?new qe(t.pluginKey):t.pluginKey,view:e=>new rm({view:e,...t})});var im=Je.create({name:"floatingMenu",addOptions(){return{element:null,tippyOptions:{},pluginKey:"floatingMenu",shouldShow:null}},addProseMirrorPlugins(){return this.options.element?[bx({pluginKey:this.options.pluginKey,editor:this.editor,element:this.options.element,tippyOptions:this.options.tippyOptions,shouldShow:this.options.shouldShow})]:[]}});function fu(t,e,n=null){return n?t.createChecked({"data-col-span":e},n):t.createAndFill({"data-col-span":e})}function yx(t){if(t.cached.gridBuilderNodeTypes)return t.cached.gridBuilderNodeTypes;let e={};return Object.keys(t.nodes).forEach(n=>{let r=t.nodes[n];r.spec.gridBuilderRole&&(e[r.spec.gridBuilderRole]=r)}),t.cached.gridBuilderNodeTypes=e,e}function Ex(t,e,n,r,i,o,s){let l=yx(t),u=[];if(n==="asymmetric")u.push(fu(l.builderColumn,i,s)),u.push(fu(l.builderColumn,o,s));else for(let d=0;dt.getAttribute("data-type")},"data-cols":{default:2,parseHTML:t=>t.getAttribute("data-cols")},"data-stack-at":{default:"md",parseHTML:t=>t.getAttribute("data-stack-at")},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-template-columns: repeat(${t["data-cols"]}, 1fr);`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid-builder")&&null}]},renderHTML({HTMLAttributes:t}){return["div",j(this.options.HTMLAttributes,t),0]},addCommands(){return{insertGridBuilder:({cols:t=3,type:e="responsive",stackAt:n,asymmetricLeft:r=null,asymmetricRight:i=null}={})=>({tr:o,dispatch:s,editor:l})=>{let u=Ex(l.schema,t,e,n,r,i);if(s){let d=o.selection.anchor+1;o.replaceSelectionWith(u).scrollIntoView().setSelection(ce.near(o.doc.resolve(d)))}return!0}}},addKeyboardShortcuts(){return{"Mod-Alt-G":()=>this.editor.commands.insertGridBuilder()}},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{gridBuilderRole:Se(ie(t,"gridBuilderRole",e))}}});var sm=se.create({name:"gridBuilderColumn",content:"block+",gridBuilderRole:"builderColumn",isolating:!0,addOptions(){return{HTMLAttributes:{class:"filament-tiptap-grid-builder__column"}}},addAttributes(){return{"data-col-span":{default:1,parseHTML:t=>t.getAttribute("data-col-span")},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-column: span ${t["data-col-span"]};`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid-builder__column")&&null}]},renderHTML({HTMLAttributes:t}){return["div",j(this.options.HTMLAttributes,t),0]}});var am=Je.create({name:"dragAndDrop",addProseMirrorPlugins(t){return[new Pe({props:{handleDrop(e,n){if(!n)return!1;n.preventDefault();let r=e.posAtCoords({left:n.clientX,top:n.clientY});return n.dataTransfer.getData("block")?(n.target.dispatchEvent(new CustomEvent("dragged-block",{detail:{type:n.dataTransfer.getData("block"),coordinates:r},bubbles:!0})),!1):(n.dataTransfer.getData("mergeTag")&&n.target.dispatchEvent(new CustomEvent("dragged-merge-tag",{detail:{tag:n.dataTransfer.getData("mergeTag"),coordinates:r},bubbles:!0})),!1)}}})]}});var lm=se.create({name:"tiptapBlock",group:"block",atom:!0,defining:!0,draggable:!0,selectable:!0,isolating:!0,allowGapCursor:!0,inline:!1,addAttributes(){return{preview:{default:null,parseHTML:t=>t.getAttribute("data-preview"),renderHTML:t=>t.preview?{"data-preview":t.preview}:null},statePath:{default:null,parseHTML:t=>t.getAttribute("data-state-path"),renderHTML:t=>t.statePath?{"data-state-path":t.statePath}:null},type:{default:null,parseHTML:t=>t.getAttribute("data-type"),renderHTML:t=>t.type?{"data-type":t.type}:null},label:{default:null,parseHTML:t=>t.getAttribute("data-label"),renderHTML:t=>t.label?{"data-label":t.label}:null},data:{default:null,parseHTML:t=>t.getAttribute("data-data"),renderHTML:t=>t.data?{"data-data":JSON.stringify(t.data)}:null}}},parseHTML(){return[{tag:"tiptap-block"}]},renderHTML({HTMLAttributes:t}){return["tiptap-block",j(t)]},addNodeView(){return({node:t})=>{let e=document.createElement("div");e.contentEditable="false",e.classList.add("tiptap-block-wrapper");let n=typeof t.attrs.data=="object"?JSON.stringify(t.attrs.data):t.attrs.data;return e.innerHTML=` +// resources/js/extensions/TiptapBlock.js +var TiptapBlock = Node2.create({ + name: "tiptapBlock", + group: "block", + atom: true, + defining: true, + draggable: true, + selectable: true, + isolating: true, + allowGapCursor: true, + inline: false, + addAttributes() { + return { + preview: { + default: null, + parseHTML: (element) => { + return element.getAttribute("data-preview"); + }, + renderHTML: (attributes) => { + if (!attributes.preview) { + return null; + } + return { + "data-preview": attributes.preview + }; + } + }, + statePath: { + default: null, + parseHTML: (element) => { + return element.getAttribute("data-state-path"); + }, + renderHTML: (attributes) => { + if (!attributes.statePath) { + return null; + } + return { + "data-state-path": attributes.statePath + }; + } + }, + type: { + default: null, + parseHTML: (element) => { + return element.getAttribute("data-type"); + }, + renderHTML: (attributes) => { + if (!attributes.type) { + return null; + } + return { + "data-type": attributes.type + }; + } + }, + label: { + default: null, + parseHTML: (element) => { + return element.getAttribute("data-label"); + }, + renderHTML: (attributes) => { + if (!attributes.label) { + return null; + } + return { + "data-label": attributes.label + }; + } + }, + data: { + default: null, + parseHTML: (element) => { + return element.getAttribute("data-data"); + }, + renderHTML: (attributes) => { + if (!attributes.data) { + return null; + } + return { + "data-data": JSON.stringify(attributes.data) + }; + } + } + }; + }, + parseHTML() { + return [ + { + tag: "tiptap-block" + } + ]; + }, + renderHTML({ HTMLAttributes }) { + return ["tiptap-block", mergeAttributes(HTMLAttributes)]; + }, + addNodeView() { + return ({ node }) => { + const dom = document.createElement("div"); + dom.contentEditable = "false"; + dom.classList.add("tiptap-block-wrapper"); + let data = typeof node.attrs.data === "object" ? JSON.stringify(node.attrs.data) : node.attrs.data; + dom.innerHTML = `
-

${t.attrs.label}

+

${node.attrs.label}

- ${t.attrs.preview} + ${node.attrs.preview}
- `,{dom:e}}},addCommands(){return{insertBlock:t=>({chain:e,state:n})=>{let r=e();if(![null,void 0].includes(t.coordinates?.pos))return r.insertContentAt({from:t.coordinates.pos,to:t.coordinates.pos},{type:this.name,attrs:t}),r.setTextSelection(t.coordinates.pos);let{selection:i}=n,{$from:o,$to:s}=i,l=o.blockRange(s);return l?(s.parentOffset===0?r.insertContentAt(Math.max(s.pos-1,0),{type:this.name,attrs:t}):r.insertContentAt({from:l.start,to:l.end},{type:this.name,attrs:t}),r.setTextSelection(l.end)):(s.parentOffset===0?r.insertContentAt(Math.max(s.pos-1,0),{type:"paragraph"}).insertContentAt({from:o.pos,to:s.pos},{type:this.name,attrs:t}):r.setNode({type:"paragraph"}).insertContentAt({from:o.pos,to:s.pos},{type:this.name,attrs:t}),r.setTextSelection(s.pos+1))},updateBlock:t=>({chain:e,state:n})=>{let{selection:r}=n,{$from:i,$to:o}=r,s=i.blockRange(o);if(!s)return!1;let l=e();return l.insertContentAt({from:s.start,to:s.end},{type:this.name,attrs:t}),l.focus(s.end+1)},removeBlock:()=>({commands:t})=>t.deleteSelection()}}});function P2(t){var e;let{char:n,allowSpaces:r,allowedPrefixes:i,startOfLine:o,$position:s}=t,l=OE(n),u=new RegExp(`\\s${l}$`),d=o?"^":"",f=r?new RegExp(`${d}${l}.*?(?=\\s${l}|$)`,"gm"):new RegExp(`${d}(?:^)?${l}[^\\s${l}]*`,"gm"),h=((e=s.nodeBefore)===null||e===void 0?void 0:e.isText)&&s.nodeBefore.text;if(!h)return null;let m=s.pos-h.length,b=Array.from(h.matchAll(f)).pop();if(!b||b.input===void 0||b.index===void 0)return null;let y=b.input.slice(Math.max(0,b.index-1),b.index),v=new RegExp(`^[${i?.join("")}\0]?$`).test(y);if(i!==null&&!v)return null;let x=m+b.index,M=x+b[0].length;return r&&u.test(h.slice(M-1,M+1))&&(b[0]+=" ",M+=1),x=s.pos?{range:{from:x,to:M},query:b[0].slice(n.length),text:b[0]}:null}var B2=new qe("suggestion");function vx({pluginKey:t=B2,editor:e,char:n="@",allowSpaces:r=!1,allowedPrefixes:i=[" "],startOfLine:o=!1,decorationTag:s="span",decorationClass:l="suggestion",command:u=()=>null,items:d=()=>[],render:f=()=>({}),allow:h=()=>!0}){let m,b=f?.(),y=new Pe({key:t,view(){return{update:async(v,x)=>{var M,D,L,S,z,O,q;let J=(M=this.key)===null||M===void 0?void 0:M.getState(x),W=(D=this.key)===null||D===void 0?void 0:D.getState(v.state),ue=J.active&&W.active&&J.range.from!==W.range.from,ye=!J.active&&W.active,Te=J.active&&!W.active,ge=!ye&&!Te&&J.query!==W.query,we=ye||ue,xe=ge&&!ue,P=Te||ue;if(!we&&!xe&&!P)return;let N=P&&!we?J:W,R=v.dom.querySelector(`[data-decoration-id="${N.decorationId}"]`);m={editor:e,range:N.range,query:N.query,text:N.text,items:[],command:K=>{u({editor:e,range:N.range,props:K})},decorationNode:R,clientRect:R?()=>{var K;let{decorationId:te}=(K=this.key)===null||K===void 0?void 0:K.getState(e.state),pe=v.dom.querySelector(`[data-decoration-id="${te}"]`);return pe?.getBoundingClientRect()||null}:null},we&&((L=b?.onBeforeStart)===null||L===void 0||L.call(b,m)),xe&&((S=b?.onBeforeUpdate)===null||S===void 0||S.call(b,m)),(xe||we)&&(m.items=await d({editor:e,query:N.query})),P&&((z=b?.onExit)===null||z===void 0||z.call(b,m)),xe&&((O=b?.onUpdate)===null||O===void 0||O.call(b,m)),we&&((q=b?.onStart)===null||q===void 0||q.call(b,m))},destroy:()=>{var v;m&&((v=b?.onExit)===null||v===void 0||v.call(b,m))}}},state:{init(){return{active:!1,range:{from:0,to:0},query:null,text:null,composing:!1}},apply(v,x,M,D){let{isEditable:L}=e,{composing:S}=e.view,{selection:z}=v,{empty:O,from:q}=z,J={...x};if(J.composing=S,L&&(O||e.view.composing)){(qx.range.to)&&!S&&!x.composing&&(J.active=!1);let W=P2({char:n,allowSpaces:r,allowedPrefixes:i,startOfLine:o,$position:z.$from}),ue=`id_${Math.floor(Math.random()*4294967295)}`;W&&h({editor:e,state:D,range:W.range})?(J.active=!0,J.decorationId=x.decorationId?x.decorationId:ue,J.range=W.range,J.query=W.query,J.text=W.text):J.active=!1}else J.active=!1;return J.active||(J.decorationId=null,J.range={from:0,to:0},J.query=null,J.text=null),J}},props:{handleKeyDown(v,x){var M;let{active:D,range:L}=y.getState(v.state);return D&&((M=b?.onKeyDown)===null||M===void 0?void 0:M.call(b,{view:v,event:x,range:L}))||!1},decorations(v){let{active:x,range:M,decorationId:D}=y.getState(v);return x?lt.create(v.doc,[Mt.inline(M.from,M.to,{nodeName:s,class:l,"data-decoration-id":D})]):null}}});return y}var F2=new qe("mergeTag"),cm=se.create({name:"mergeTag",group:"inline",inline:!0,selectable:!1,atom:!0,addAttributes(){return{id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}}}},parseHTML(){return[{tag:`span[data-type='${this.name}']`}]},renderHTML({node:t,HTMLAttributes:e}){return["span",j({"data-type":this.name},e),`{{ ${t.attrs.id} }}`]},renderText({node:t}){return`{{ ${t.attrs.id} }}`},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:i,anchor:o}=r;return i?(e.doc.nodesBetween(o-1,o,(s,l)=>{if(s.type.name===this.name)return n=!0,t.insertText("{{",l,l+s.nodeSize),!1}),n):!1})}},addCommands(){return{insertMergeTag:t=>({chain:e,state:n})=>{let r=e();if(![null,void 0].includes(t.coordinates?.pos))return r.insertContentAt({from:t.coordinates.pos,to:t.coordinates.pos},[{type:this.name,attrs:{id:t.tag}},{type:"text",text:" "}]),r}}},addProseMirrorPlugins(){return[vx({editor:this.editor,char:"{{",items:({query:t})=>this.options.mergeTags.filter(e=>e.toLowerCase().startsWith(t.toLowerCase())).slice(0,5),pluginKey:F2,command:({editor:t,range:e,props:n})=>{t.view.state.selection.$to.nodeAfter?.text?.startsWith(" ")&&(e.to+=1),t.chain().focus().insertContentAt(e,[{type:this.name,attrs:n},{type:"text",text:" "}]).run(),window.getSelection()?.collapseToEnd()},allow:({state:t,range:e})=>{let n=t.doc.resolve(e.from),r=t.schema.nodes[this.name];return!!n.parent.type.contentMatch.matchType(r)},render:()=>{let t,e;return{onStart:n=>{if(!n.clientRect)return;let r=` + `; + return { + dom + }; + }; + }, + addCommands() { + return { + insertBlock: (attributes) => ({ chain, state }) => { + const currentChain = chain(); + if (![null, void 0].includes(attributes.coordinates?.pos)) { + currentChain.insertContentAt({ from: attributes.coordinates.pos, to: attributes.coordinates.pos }, { type: this.name, attrs: attributes }); + return currentChain.setTextSelection(attributes.coordinates.pos); + } + const { selection } = state; + const { $from, $to } = selection; + const range = $from.blockRange($to); + if (!range) { + if ($to.parentOffset === 0) { + currentChain.insertContentAt(Math.max($to.pos - 1, 0), { type: "paragraph" }).insertContentAt({ from: $from.pos, to: $to.pos }, { type: this.name, attrs: attributes }); + } else { + currentChain.setNode({ type: "paragraph" }).insertContentAt({ from: $from.pos, to: $to.pos }, { type: this.name, attrs: attributes }); + } + return currentChain.setTextSelection($to.pos + 1); + } else { + if ($to.parentOffset === 0) { + currentChain.insertContentAt(Math.max($to.pos - 1, 0), { type: this.name, attrs: attributes }); + } else { + currentChain.insertContentAt({ from: range.start, to: range.end }, { type: this.name, attrs: attributes }); + } + return currentChain.setTextSelection(range.end); + } + }, + updateBlock: (attributes) => ({ chain, state }) => { + const { selection } = state; + const { $from, $to } = selection; + const range = $from.blockRange($to); + if (!range) { + return false; + } + const currentChain = chain(); + currentChain.insertContentAt({ from: range.start, to: range.end }, { type: this.name, attrs: attributes }); + return currentChain.focus(range.end + 1); + }, + removeBlock: () => ({ commands: commands2 }) => { + return commands2.deleteSelection(); + } + }; + } +}); + +// node_modules/@tiptap/suggestion/dist/index.js +function findSuggestionMatch(config) { + var _a; + const { char, allowSpaces, allowedPrefixes, startOfLine, $position } = config; + const escapedChar = escapeForRegEx(char); + const suffix = new RegExp(`\\s${escapedChar}$`); + const prefix = startOfLine ? "^" : ""; + const regexp = allowSpaces ? new RegExp(`${prefix}${escapedChar}.*?(?=\\s${escapedChar}|$)`, "gm") : new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${escapedChar}]*`, "gm"); + const text = ((_a = $position.nodeBefore) === null || _a === void 0 ? void 0 : _a.isText) && $position.nodeBefore.text; + if (!text) { + return null; + } + const textFrom = $position.pos - text.length; + const match = Array.from(text.matchAll(regexp)).pop(); + if (!match || match.input === void 0 || match.index === void 0) { + return null; + } + const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index); + const matchPrefixIsAllowed = new RegExp(`^[${allowedPrefixes === null || allowedPrefixes === void 0 ? void 0 : allowedPrefixes.join("")}\0]?$`).test(matchPrefix); + if (allowedPrefixes !== null && !matchPrefixIsAllowed) { + return null; + } + const from2 = textFrom + match.index; + let to = from2 + match[0].length; + if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) { + match[0] += " "; + to += 1; + } + if (from2 < $position.pos && to >= $position.pos) { + return { + range: { + from: from2, + to + }, + query: match[0].slice(char.length), + text: match[0] + }; + } + return null; +} +var SuggestionPluginKey = new PluginKey("suggestion"); +function Suggestion({ pluginKey = SuggestionPluginKey, editor, char = "@", allowSpaces = false, allowedPrefixes = [" "], startOfLine = false, decorationTag = "span", decorationClass = "suggestion", command: command2 = () => null, items = () => [], render: render2 = () => ({}), allow = () => true }) { + let props; + const renderer = render2 === null || render2 === void 0 ? void 0 : render2(); + const plugin = new Plugin({ + key: pluginKey, + view() { + return { + update: async (view, prevState) => { + var _a, _b, _c, _d, _e, _f, _g; + const prev = (_a = this.key) === null || _a === void 0 ? void 0 : _a.getState(prevState); + const next = (_b = this.key) === null || _b === void 0 ? void 0 : _b.getState(view.state); + const moved = prev.active && next.active && prev.range.from !== next.range.from; + const started = !prev.active && next.active; + const stopped = prev.active && !next.active; + const changed = !started && !stopped && prev.query !== next.query; + const handleStart = started || moved; + const handleChange = changed && !moved; + const handleExit = stopped || moved; + if (!handleStart && !handleChange && !handleExit) { + return; + } + const state = handleExit && !handleStart ? prev : next; + const decorationNode = view.dom.querySelector(`[data-decoration-id="${state.decorationId}"]`); + props = { + editor, + range: state.range, + query: state.query, + text: state.text, + items: [], + command: (commandProps) => { + command2({ + editor, + range: state.range, + props: commandProps + }); + }, + decorationNode, + // virtual node for popper.js or tippy.js + // this can be used for building popups without a DOM node + clientRect: decorationNode ? () => { + var _a2; + const { decorationId } = (_a2 = this.key) === null || _a2 === void 0 ? void 0 : _a2.getState(editor.state); + const currentDecorationNode = view.dom.querySelector(`[data-decoration-id="${decorationId}"]`); + return (currentDecorationNode === null || currentDecorationNode === void 0 ? void 0 : currentDecorationNode.getBoundingClientRect()) || null; + } : null + }; + if (handleStart) { + (_c = renderer === null || renderer === void 0 ? void 0 : renderer.onBeforeStart) === null || _c === void 0 ? void 0 : _c.call(renderer, props); + } + if (handleChange) { + (_d = renderer === null || renderer === void 0 ? void 0 : renderer.onBeforeUpdate) === null || _d === void 0 ? void 0 : _d.call(renderer, props); + } + if (handleChange || handleStart) { + props.items = await items({ + editor, + query: state.query + }); + } + if (handleExit) { + (_e = renderer === null || renderer === void 0 ? void 0 : renderer.onExit) === null || _e === void 0 ? void 0 : _e.call(renderer, props); + } + if (handleChange) { + (_f = renderer === null || renderer === void 0 ? void 0 : renderer.onUpdate) === null || _f === void 0 ? void 0 : _f.call(renderer, props); + } + if (handleStart) { + (_g = renderer === null || renderer === void 0 ? void 0 : renderer.onStart) === null || _g === void 0 ? void 0 : _g.call(renderer, props); + } + }, + destroy: () => { + var _a; + if (!props) { + return; + } + (_a = renderer === null || renderer === void 0 ? void 0 : renderer.onExit) === null || _a === void 0 ? void 0 : _a.call(renderer, props); + } + }; + }, + state: { + // Initialize the plugin's internal state. + init() { + const state = { + active: false, + range: { + from: 0, + to: 0 + }, + query: null, + text: null, + composing: false + }; + return state; + }, + // Apply changes to the plugin state from a view transaction. + apply(transaction, prev, oldState, state) { + const { isEditable } = editor; + const { composing } = editor.view; + const { selection } = transaction; + const { empty: empty2, from: from2 } = selection; + const next = { ...prev }; + next.composing = composing; + if (isEditable && (empty2 || editor.view.composing)) { + if ((from2 < prev.range.from || from2 > prev.range.to) && !composing && !prev.composing) { + next.active = false; + } + const match = findSuggestionMatch({ + char, + allowSpaces, + allowedPrefixes, + startOfLine, + $position: selection.$from + }); + const decorationId = `id_${Math.floor(Math.random() * 4294967295)}`; + if (match && allow({ editor, state, range: match.range })) { + next.active = true; + next.decorationId = prev.decorationId ? prev.decorationId : decorationId; + next.range = match.range; + next.query = match.query; + next.text = match.text; + } else { + next.active = false; + } + } else { + next.active = false; + } + if (!next.active) { + next.decorationId = null; + next.range = { from: 0, to: 0 }; + next.query = null; + next.text = null; + } + return next; + } + }, + props: { + // Call the keydown hook if suggestion is active. + handleKeyDown(view, event) { + var _a; + const { active, range } = plugin.getState(view.state); + if (!active) { + return false; + } + return ((_a = renderer === null || renderer === void 0 ? void 0 : renderer.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(renderer, { view, event, range })) || false; + }, + // Setup decorator on the currently active suggestion. + decorations(state) { + const { active, range, decorationId } = plugin.getState(state); + if (!active) { + return null; + } + return DecorationSet.create(state.doc, [ + Decoration.inline(range.from, range.to, { + nodeName: decorationTag, + class: decorationClass, + "data-decoration-id": decorationId + }) + ]); + } + } + }); + return plugin; +} + +// resources/js/extensions/MergeTag.js +var MergeTagPluginKey = new PluginKey("mergeTag"); +var MergeTag = Node2.create({ + name: "mergeTag", + group: "inline", + inline: true, + selectable: false, + atom: true, + addAttributes() { + return { + id: { + default: null, + parseHTML: (element) => element.getAttribute("data-id"), + renderHTML: (attributes) => { + if (!attributes.id) { + return {}; + } + return { + "data-id": attributes.id + }; + } + } + }; + }, + parseHTML() { + return [ + { + tag: `span[data-type='${this.name}']` + } + ]; + }, + renderHTML({ node, HTMLAttributes }) { + return [ + "span", + mergeAttributes( + { "data-type": this.name }, + HTMLAttributes + ), + `{{ ${node.attrs.id} }}` + ]; + }, + renderText({ node }) { + return `{{ ${node.attrs.id} }}`; + }, + addKeyboardShortcuts() { + return { + Backspace: () => this.editor.commands.command(({ tr: tr2, state }) => { + let isMergeTag = false; + const { selection } = state; + const { empty: empty2, anchor } = selection; + if (!empty2) { + return false; + } + state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => { + if (node.type.name === this.name) { + isMergeTag = true; + tr2.insertText( + "{{", + pos, + pos + node.nodeSize + ); + return false; + } + }); + return isMergeTag; + }) + }; + }, + addCommands() { + return { + insertMergeTag: (attributes) => ({ chain, state }) => { + const currentChain = chain(); + if (![null, void 0].includes(attributes.coordinates?.pos)) { + currentChain.insertContentAt( + { from: attributes.coordinates.pos, to: attributes.coordinates.pos }, + [ + { type: this.name, attrs: { id: attributes.tag } }, + { type: "text", text: " " } + ] + ); + return currentChain; + } + } + }; + }, + addProseMirrorPlugins() { + return [ + Suggestion({ + editor: this.editor, + char: "{{", + items: ({ query }) => this.options.mergeTags.filter((item) => item.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5), + pluginKey: MergeTagPluginKey, + command: ({ editor, range, props }) => { + const nodeAfter = editor.view.state.selection.$to.nodeAfter; + const overrideSpace = nodeAfter?.text?.startsWith(" "); + if (overrideSpace) { + range.to += 1; + } + editor.chain().focus().insertContentAt(range, [ + { + type: this.name, + attrs: props + }, + { + type: "text", + text: " " + } + ]).run(); + window.getSelection()?.collapseToEnd(); + }, + allow: ({ state, range }) => { + const $from = state.doc.resolve(range.from); + const type = state.schema.nodes[this.name]; + const allow = !!$from.parent.type.contentMatch.matchType(type); + return allow; + }, + render: () => { + let component; + let popup; + return { + onStart: (props) => { + if (!props.clientRect) { + return; + } + const html = `
- `;t=document.createElement("div"),t.innerHTML=r,t.addEventListener("merge-tags-select",i=>{n.command({id:i.detail.item})}),e=as("body",{getReferenceClientRect:n.clientRect,appendTo:()=>document.body,content:t,allowHTML:!0,showOnCreate:!0,interactive:!0,trigger:"manual",placement:"bottom-start"})},onUpdate(n){if(!n.items.length){e[0].hide();return}e[0].show(),t.dispatchEvent(new CustomEvent("merge-tags-update-items",{detail:n.items}))},onKeyDown(n){t.dispatchEvent(new CustomEvent("merge-tags-key-down",{detail:n.event}))},onExit(){e[0].destroy()}}}})]}});var um=Je.create({name:"classExtension",addGlobalAttributes(){return[{types:["heading","paragraph","link","image","listItem","bulletList","orderedList","table","tableHeader","tableRow","tableCell","textStyle"],attributes:{class:{default:null,parseHTML:t=>t.getAttribute("class")??null,renderHTML:t=>t.class?{class:t.class}:null}}}]}});var dm=Je.create({name:"idExtension",addGlobalAttributes(){return[{types:["heading","link"],attributes:{id:{default:null,parseHTML:t=>t.getAttribute("id")??null,renderHTML:t=>t.id?{id:t.id}:null}}}]}});var fm=Je.create({name:"styleExtension",addGlobalAttributes(){return[{types:["heading","paragraph","link","image","listItem","bulletList","orderedList","table","tableHeader","tableRow","tableCell","textStyle"],attributes:{style:{default:null,parseHTML:t=>t.getAttribute("style")??null,renderHTML:t=>t.style?{style:t.style}:null}}}]}});function H2(t){let e=t.regex,n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",o="<[^<>]+>",s="(?!struct)("+r+"|"+e.optional(i)+"[a-zA-Z_]\\w*"+e.optional(o)+")",l={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},u="\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)",d={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+u+"|.)",end:"'",illegal:"."},t.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},f={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},t.inherit(d,{className:"string"}),{className:"string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},m={className:"title",begin:e.optional(i)+t.IDENT_RE,relevance:0},b=e.optional(i)+t.IDENT_RE+"\\s*\\(",y=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],v=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],x=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],M=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],S={type:v,keyword:y,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:x},z={className:"function.dispatch",relevance:0,keywords:{_hint:M},begin:e.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,t.IDENT_RE,e.lookahead(/(<[^<>]+>|)\s*\(/))},O=[z,h,l,n,t.C_BLOCK_COMMENT_MODE,f,d],q={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:S,contains:O.concat([{begin:/\(/,end:/\)/,keywords:S,contains:O.concat(["self"]),relevance:0}]),relevance:0},J={className:"function",begin:"("+s+"[\\*&\\s]+)+"+b,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:S,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:S,relevance:0},{begin:b,returnBegin:!0,contains:[m],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[d,f]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:S,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,d,f,l,{begin:/\(/,end:/\)/,keywords:S,relevance:0,contains:["self",n,t.C_BLOCK_COMMENT_MODE,d,f,l]}]},l,n,t.C_BLOCK_COMMENT_MODE,h]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:S,illegal:"",keywords:S,contains:["self",l]},{begin:t.IDENT_RE+"::",keywords:S},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function wx(t){let e={type:["boolean","byte","word","String"],built_in:["KeyboardController","MouseController","SoftwareSerial","EthernetServer","EthernetClient","LiquidCrystal","RobotControl","GSMVoiceCall","EthernetUDP","EsploraTFT","HttpClient","RobotMotor","WiFiClient","GSMScanner","FileSystem","Scheduler","GSMServer","YunClient","YunServer","IPAddress","GSMClient","GSMModem","Keyboard","Ethernet","Console","GSMBand","Esplora","Stepper","Process","WiFiUDP","GSM_SMS","Mailbox","USBHost","Firmata","PImage","Client","Server","GSMPIN","FileIO","Bridge","Serial","EEPROM","Stream","Mouse","Audio","Servo","File","Task","GPRS","WiFi","Wire","TFT","GSM","SPI","SD"],_hints:["setup","loop","runShellCommandAsynchronously","analogWriteResolution","retrieveCallingNumber","printFirmwareVersion","analogReadResolution","sendDigitalPortPair","noListenOnLocalhost","readJoystickButton","setFirmwareVersion","readJoystickSwitch","scrollDisplayRight","getVoiceCallStatus","scrollDisplayLeft","writeMicroseconds","delayMicroseconds","beginTransmission","getSignalStrength","runAsynchronously","getAsynchronously","listenOnLocalhost","getCurrentCarrier","readAccelerometer","messageAvailable","sendDigitalPorts","lineFollowConfig","countryNameWrite","runShellCommand","readStringUntil","rewindDirectory","readTemperature","setClockDivider","readLightSensor","endTransmission","analogReference","detachInterrupt","countryNameRead","attachInterrupt","encryptionType","readBytesUntil","robotNameWrite","readMicrophone","robotNameRead","cityNameWrite","userNameWrite","readJoystickY","readJoystickX","mouseReleased","openNextFile","scanNetworks","noInterrupts","digitalWrite","beginSpeaker","mousePressed","isActionDone","mouseDragged","displayLogos","noAutoscroll","addParameter","remoteNumber","getModifiers","keyboardRead","userNameRead","waitContinue","processInput","parseCommand","printVersion","readNetworks","writeMessage","blinkVersion","cityNameRead","readMessage","setDataMode","parsePacket","isListening","setBitOrder","beginPacket","isDirectory","motorsWrite","drawCompass","digitalRead","clearScreen","serialEvent","rightToLeft","setTextSize","leftToRight","requestFrom","keyReleased","compassRead","analogWrite","interrupts","WiFiServer","disconnect","playMelody","parseFloat","autoscroll","getPINUsed","setPINUsed","setTimeout","sendAnalog","readSlider","analogRead","beginWrite","createChar","motorsStop","keyPressed","tempoWrite","readButton","subnetMask","debugPrint","macAddress","writeGreen","randomSeed","attachGPRS","readString","sendString","remotePort","releaseAll","mouseMoved","background","getXChange","getYChange","answerCall","getResult","voiceCall","endPacket","constrain","getSocket","writeJSON","getButton","available","connected","findUntil","readBytes","exitValue","readGreen","writeBlue","startLoop","IPAddress","isPressed","sendSysex","pauseMode","gatewayIP","setCursor","getOemKey","tuneWrite","noDisplay","loadImage","switchPIN","onRequest","onReceive","changePIN","playFile","noBuffer","parseInt","overflow","checkPIN","knobRead","beginTFT","bitClear","updateIR","bitWrite","position","writeRGB","highByte","writeRed","setSpeed","readBlue","noStroke","remoteIP","transfer","shutdown","hangCall","beginSMS","endWrite","attached","maintain","noCursor","checkReg","checkPUK","shiftOut","isValid","shiftIn","pulseIn","connect","println","localIP","pinMode","getIMEI","display","noBlink","process","getBand","running","beginSD","drawBMP","lowByte","setBand","release","bitRead","prepare","pointTo","readRed","setMode","noFill","remove","listen","stroke","detach","attach","noTone","exists","buffer","height","bitSet","circle","config","cursor","random","IRread","setDNS","endSMS","getKey","micros","millis","begin","print","write","ready","flush","width","isPIN","blink","clear","press","mkdir","rmdir","close","point","yield","image","BSSID","click","delay","read","text","move","peek","beep","rect","line","open","seek","fill","size","turn","stop","home","find","step","tone","sqrt","RSSI","SSID","end","bit","tan","cos","sin","pow","map","abs","max","min","get","run","put"],literal:["DIGITAL_MESSAGE","FIRMATA_STRING","ANALOG_MESSAGE","REPORT_DIGITAL","REPORT_ANALOG","INPUT_PULLUP","SET_PIN_MODE","INTERNAL2V56","SYSTEM_RESET","LED_BUILTIN","INTERNAL1V1","SYSEX_START","INTERNAL","EXTERNAL","DEFAULT","OUTPUT","INPUT","HIGH","LOW"]},n=H2(t),r=n.keywords;return r.type=[...r.type,...e.type],r.literal=[...r.literal,...e.literal],r.built_in=[...r.built_in,...e.built_in],r._hints=e._hints,n.name="Arduino",n.aliases=["ino"],n.supersetOf="cpp",n}function xx(t){let e=t.regex,n={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{begin:e.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});let i={className:"subst",begin:/\$\(/,end:/\)/,contains:[t.BACKSLASH_ESCAPE]},o={begin:/<<-?\s*(?=\w+)/,starts:{contains:[t.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,n,i]};i.contains.push(s);let l={className:"",begin:/\\"/},u={className:"string",begin:/'/,end:/'/},d={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},t.NUMBER_MODE,n]},f=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],h=t.SHEBANG({binary:`(${f.join("|")})`,relevance:10}),m={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[t.inherit(t.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},b=["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"],y=["true","false"],v={match:/(\/[a-z._-]+)+/},x=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],M=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias"],D=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],L=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:b,literal:y,built_in:[...x,...M,"set","shopt",...D,...L]},contains:[h,t.SHEBANG(),m,d,t.HASH_COMMENT_MODE,o,v,s,l,u,n]}}function _x(t){let e=t.regex,n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",o="<[^<>]+>",s="("+r+"|"+e.optional(i)+"[a-zA-Z_]\\w*"+e.optional(o)+")",l={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/}]},u="\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)",d={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+u+"|.)",end:"'",illegal:"."},t.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},f={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},t.inherit(d,{className:"string"}),{className:"string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},m={className:"title",begin:e.optional(i)+t.IDENT_RE,relevance:0},b=e.optional(i)+t.IDENT_RE+"\\s*\\(",x={keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"],literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},M=[h,l,n,t.C_BLOCK_COMMENT_MODE,f,d],D={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:x,contains:M.concat([{begin:/\(/,end:/\)/,keywords:x,contains:M.concat(["self"]),relevance:0}]),relevance:0},L={begin:"("+s+"[\\*&\\s]+)+"+b,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:x,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:x,relevance:0},{begin:b,returnBegin:!0,contains:[t.inherit(m,{className:"title.function"})],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:x,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,d,f,l,{begin:/\(/,end:/\)/,keywords:x,relevance:0,contains:["self",n,t.C_BLOCK_COMMENT_MODE,d,f,l]}]},l,n,t.C_BLOCK_COMMENT_MODE,h]};return{name:"C",aliases:["h"],keywords:x,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{preprocessor:h,strings:d,keywords:x}}}function Sx(t){let e=t.regex,n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",o="<[^<>]+>",s="(?!struct)("+r+"|"+e.optional(i)+"[a-zA-Z_]\\w*"+e.optional(o)+")",l={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},u="\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)",d={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+u+"|.)",end:"'",illegal:"."},t.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},f={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},t.inherit(d,{className:"string"}),{className:"string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},m={className:"title",begin:e.optional(i)+t.IDENT_RE,relevance:0},b=e.optional(i)+t.IDENT_RE+"\\s*\\(",y=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],v=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],x=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],M=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],S={type:v,keyword:y,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:x},z={className:"function.dispatch",relevance:0,keywords:{_hint:M},begin:e.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,t.IDENT_RE,e.lookahead(/(<[^<>]+>|)\s*\(/))},O=[z,h,l,n,t.C_BLOCK_COMMENT_MODE,f,d],q={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:S,contains:O.concat([{begin:/\(/,end:/\)/,keywords:S,contains:O.concat(["self"]),relevance:0}]),relevance:0},J={className:"function",begin:"("+s+"[\\*&\\s]+)+"+b,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:S,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:S,relevance:0},{begin:b,returnBegin:!0,contains:[m],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[d,f]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:S,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,d,f,l,{begin:/\(/,end:/\)/,keywords:S,relevance:0,contains:["self",n,t.C_BLOCK_COMMENT_MODE,d,f,l]}]},l,n,t.C_BLOCK_COMMENT_MODE,h]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:S,illegal:"",keywords:S,contains:["self",l]},{begin:t.IDENT_RE+"::",keywords:S},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function Tx(t){let e=["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],n=["public","private","protected","static","internal","protected","abstract","async","extern","override","unsafe","virtual","new","sealed","partial"],r=["default","false","null","true"],i=["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"],o=["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"],s={keyword:i.concat(o),built_in:e,literal:r},l=t.inherit(t.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),u={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},d={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},f=t.inherit(d,{illegal:/\n/}),h={className:"subst",begin:/\{/,end:/\}/,keywords:s},m=t.inherit(h,{illegal:/\n/}),b={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},t.BACKSLASH_ESCAPE,m]},y={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},h]},v=t.inherit(y,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},m]});h.contains=[y,b,d,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,u,t.C_BLOCK_COMMENT_MODE],m.contains=[v,b,f,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,u,t.inherit(t.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];let x={variants:[y,b,d,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},M={begin:"<",end:">",contains:[{beginKeywords:"in out"},l]},D=t.IDENT_RE+"(<"+t.IDENT_RE+"(\\s*,\\s*"+t.IDENT_RE+")*>)?(\\[\\])?",L={begin:"@"+t.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:s,illegal:/::/,contains:[t.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:""},{begin:""}]}]}),t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},x,u,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},l,M,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[l,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[l,M,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+D+"\\s+)+"+t.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:s,contains:[{beginKeywords:n.join(" "),relevance:0},{begin:t.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[t.TITLE_MODE,M],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,relevance:0,contains:[x,u,t.C_BLOCK_COMMENT_MODE]},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},L]}}var z2=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),U2=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],$2=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],W2=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],K2=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],V2=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse();function Mx(t){let e=t.regex,n=z2(t),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},i="and or not only",o=/@-?\w[\w]*(-\w+)*/,s="[a-zA-Z-][a-zA-Z0-9_-]*",l=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[n.BLOCK_COMMENT,r,n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+s,relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+W2.join("|")+")"},{begin:":(:)?("+K2.join("|")+")"}]},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+V2.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,...l,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...l,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:e.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:o},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:i,attribute:$2.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+U2.join("|")+")\\b"}]}}function Cx(t){let e=t.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:e.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:e.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}function kx(t){let o={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]};return{name:"Go",aliases:["golang"],keywords:o,illegal:"Rx(t,e,n-1))}function Ix(t){let e=t.regex,n="[\xC0-\u02B8a-zA-Z_$][\xC0-\u02B8a-zA-Z_$0-9]*",r=n+Rx("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),u={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double"],built_in:["super","this"]},d={className:"meta",begin:"@"+n,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},f={className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0,contains:[t.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:u,illegal:/<\/|#/,contains:[t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[t.BACKSLASH_ESCAPE]},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[e.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword",3:"title.class"},contains:[f,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+r+"\\s+)",t.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:u,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0,contains:[d,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,Ox,t.C_BLOCK_COMMENT_MODE]},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},Ox,d]}}var Lx="[A-Za-z$_][0-9A-Za-z$_]*",G2=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],q2=["true","false","null","undefined","NaN","Infinity"],Dx=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Px=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Bx=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Y2=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],J2=[].concat(Bx,Dx,Px);function Fx(t){let e=t.regex,n=(R,{after:K})=>{let te="",end:""},o=/<[A-Za-z0-9\\._:-]+\s*\/>/,s={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(R,K)=>{let te=R[0].length+R.index,pe=R.input[te];if(pe==="<"||pe===","){K.ignoreMatch();return}pe===">"&&(n(R,{after:te})||K.ignoreMatch());let Ce,Ue=R.input.substring(te);if(Ce=Ue.match(/^\s*=/)){K.ignoreMatch();return}if((Ce=Ue.match(/^\s+extends\s+/))&&Ce.index===0){K.ignoreMatch();return}}},l={$pattern:Lx,keyword:G2,literal:q2,built_in:J2,"variable.language":Y2},u="[0-9](_?[0-9])*",d=`\\.(${u})`,f="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",h={className:"number",variants:[{begin:`(\\b(${f})((${d})|\\.)?|(${d}))[eE][+-]?(${u})\\b`},{begin:`\\b(${f})\\b((${d})\\b|\\.)?|(${d})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},m={className:"subst",begin:"\\$\\{",end:"\\}",keywords:l,contains:[]},b={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"xml"}},y={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"css"}},v={begin:"gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"graphql"}},x={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,m]},D={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},L=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,{match:/\$\d+/},h];m.contains=L.concat({begin:/\{/,end:/\}/,keywords:l,contains:["self"].concat(L)});let S=[].concat(D,m.contains),z=S.concat([{begin:/\(/,end:/\)/,keywords:l,contains:["self"].concat(S)}]),O={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z},q={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},J={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...Dx,...Px]}},W={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},ue={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},ye={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function Te(R){return e.concat("(?!",R.join("|"),")")}let ge={match:e.concat(/\b/,Te([...Bx,"super","import"]),r,e.lookahead(/\(/)),className:"title.function",relevance:0},we={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},xe={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},P="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",N={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(P)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:l,exports:{PARAMS_CONTAINS:z,CLASS_REFERENCE:J},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),W,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,D,{match:/\$\d+/},h,J,{className:"attr",begin:r+e.lookahead(":"),relevance:0},N,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[D,t.REGEXP_MODE,{className:"function",begin:P,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:o},{begin:s.begin,"on:begin":s.isTrulyOpeningTag,end:s.end}],subLanguage:"xml",contains:[{begin:s.begin,end:s.end,skip:!0,contains:["self"]}]}]},ue,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},we,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},ge,ye,q,xe,{match:/\$[(.]/}]}}function Hx(t){let e={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:"punctuation",relevance:0},r=["true","false","null"],i={scope:"literal",beginKeywords:r.join(" ")};return{name:"JSON",keywords:{literal:r},contains:[e,n,t.QUOTE_STRING_MODE,i,t.C_NUMBER_MODE,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}var cs="[0-9](_*[0-9])*",mu=`\\.(${cs})`,gu="[0-9a-fA-F](_*[0-9a-fA-F])*",X2={className:"number",variants:[{begin:`(\\b(${cs})((${mu})|\\.)?|(${mu}))[eE][+-]?(${cs})[fFdD]?\\b`},{begin:`\\b(${cs})((${mu})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${mu})[fFdD]?\\b`},{begin:`\\b(${cs})[fFdD]\\b`},{begin:`\\b0[xX]((${gu})\\.?|(${gu})?\\.(${gu}))[pP][+-]?(${cs})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${gu})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};function zx(t){let e={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},n={className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},r={className:"symbol",begin:t.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:/\$\{/,end:/\}/,contains:[t.C_NUMBER_MODE]},o={className:"variable",begin:"\\$"+t.UNDERSCORE_IDENT_RE},s={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[o,i]},{begin:"'",end:"'",illegal:/\n/,contains:[t.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[t.BACKSLASH_ESCAPE,o,i]}]};i.contains.push(s);let l={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+t.UNDERSCORE_IDENT_RE+")?"},u={className:"meta",begin:"@"+t.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[t.inherit(s,{className:"string"}),"self"]}]},d=X2,f=t.COMMENT("/\\*","\\*/",{contains:[t.C_BLOCK_COMMENT_MODE]}),h={variants:[{className:"type",begin:t.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},m=h;return m.variants[1].contains=[h],h.variants[1].contains=[m],{name:"Kotlin",aliases:["kt","kts"],keywords:e,contains:[t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),t.C_LINE_COMMENT_MODE,f,n,r,l,u,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:e,relevance:5,contains:[{begin:t.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[t.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:e,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[h,t.C_LINE_COMMENT_MODE,f],relevance:0},t.C_LINE_COMMENT_MODE,f,l,u,s,t.C_NUMBER_MODE]},f]},{begin:[/class|interface|trait/,/\s+/,t.UNDERSCORE_IDENT_RE],beginScope:{3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},t.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/,excludeBegin:!0,returnEnd:!0},l,u]},s,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:` -`},d]}}var Z2=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),j2=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Q2=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],Ux=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],$x=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],eF=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),tF=Ux.concat($x);function Wx(t){let e=Z2(t),n=tF,r="and or not only",i="[\\w-]+",o="("+i+"|@\\{"+i+"\\})",s=[],l=[],u=function(L){return{className:"string",begin:"~?"+L+".*?"+L}},d=function(L,S,z){return{className:L,begin:S,relevance:z}},f={$pattern:/[a-z-]+/,keyword:r,attribute:Q2.join(" ")},h={begin:"\\(",end:"\\)",contains:l,keywords:f,relevance:0};l.push(t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,u("'"),u('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},e.HEXCOLOR,h,d("variable","@@?"+i,10),d("variable","@\\{"+i+"\\}"),d("built_in","~?`[^`]*?`"),{className:"attribute",begin:i+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0},e.IMPORTANT,{beginKeywords:"and not"},e.FUNCTION_DISPATCH);let m=l.concat({begin:/\{/,end:/\}/,contains:s}),b={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(l)},y={begin:o+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},e.CSS_VARIABLE,{className:"attribute",begin:"\\b("+eF.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:l}}]},v={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:f,returnEnd:!0,contains:l,relevance:0}},x={className:"variable",variants:[{begin:"@"+i+"\\s*:",relevance:15},{begin:"@"+i}],starts:{end:"[;}]",returnEnd:!0,contains:m}},M={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:o,end:/\{/}],returnBegin:!0,returnEnd:!0,illegal:`[<='$"]`,relevance:0,contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,b,d("keyword","all\\b"),d("variable","@\\{"+i+"\\}"),{begin:"\\b("+j2.join("|")+")\\b",className:"selector-tag"},e.CSS_NUMBER_MODE,d("selector-tag",o,0),d("selector-id","#"+o),d("selector-class","\\."+o,0),d("selector-tag","&",0),e.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+Ux.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+$x.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:m},{begin:"!important"},e.FUNCTION_DISPATCH]},D={begin:i+`:(:)?(${n.join("|")})`,returnBegin:!0,contains:[M]};return s.push(t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,v,x,D,y,M,b,e.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:`[=>'/<($"]`,contains:s}}function Kx(t){let e="\\[=*\\[",n="\\]=*\\]",r={begin:e,end:n,contains:["self"]},i=[t.COMMENT("--(?!"+e+")","$"),t.COMMENT("--"+e,n,{contains:[r],relevance:10})];return{name:"Lua",keywords:{$pattern:t.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[t.inherit(t.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:i}].concat(i)},t.C_NUMBER_MODE,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,{className:"string",begin:e,end:n,contains:[r],relevance:5}])}}function Vx(t){let e={className:"variable",variants:[{begin:"\\$\\("+t.UNDERSCORE_IDENT_RE+"\\)",contains:[t.BACKSLASH_ESCAPE]},{begin:/\$[@%",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},i={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},o={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},s={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},l=/[A-Za-z][A-Za-z0-9+.-]*/,u={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,l,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},d={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},f={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},h=t.inherit(d,{contains:[]}),m=t.inherit(f,{contains:[]});d.contains.push(m),f.contains.push(h);let b=[n,u];return[d,f,h,m].forEach(x=>{x.contains=x.contains.concat(b)}),b=b.concat(d,f),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:b},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:b}]}]},n,o,d,f,{className:"quote",begin:"^>\\s+",contains:b,end:"$"},i,r,u,s]}}function qx(t){let e={className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},n=/[a-zA-Z@][a-zA-Z0-9_]*/,l={"variable.language":["this","super"],$pattern:n,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"]},u={$pattern:n,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:l,illegal:"/,end:/$/,illegal:"\\n"},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+u.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:u,contains:[t.UNDERSCORE_TITLE_MODE]},{begin:"\\."+t.UNDERSCORE_IDENT_RE,relevance:0}]}}function Yx(t){let e=t.regex,n=["abs","accept","alarm","and","atan2","bind","binmode","bless","break","caller","chdir","chmod","chomp","chop","chown","chr","chroot","close","closedir","connect","continue","cos","crypt","dbmclose","dbmopen","defined","delete","die","do","dump","each","else","elsif","endgrent","endhostent","endnetent","endprotoent","endpwent","endservent","eof","eval","exec","exists","exit","exp","fcntl","fileno","flock","for","foreach","fork","format","formline","getc","getgrent","getgrgid","getgrnam","gethostbyaddr","gethostbyname","gethostent","getlogin","getnetbyaddr","getnetbyname","getnetent","getpeername","getpgrp","getpriority","getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam","getpwuid","getservbyname","getservbyport","getservent","getsockname","getsockopt","given","glob","gmtime","goto","grep","gt","hex","if","index","int","ioctl","join","keys","kill","last","lc","lcfirst","length","link","listen","local","localtime","log","lstat","lt","ma","map","mkdir","msgctl","msgget","msgrcv","msgsnd","my","ne","next","no","not","oct","open","opendir","or","ord","our","pack","package","pipe","pop","pos","print","printf","prototype","push","q|0","qq","quotemeta","qw","qx","rand","read","readdir","readline","readlink","readpipe","recv","redo","ref","rename","require","reset","return","reverse","rewinddir","rindex","rmdir","say","scalar","seek","seekdir","select","semctl","semget","semop","send","setgrent","sethostent","setnetent","setpgrp","setpriority","setprotoent","setpwent","setservent","setsockopt","shift","shmctl","shmget","shmread","shmwrite","shutdown","sin","sleep","socket","socketpair","sort","splice","split","sprintf","sqrt","srand","stat","state","study","sub","substr","symlink","syscall","sysopen","sysread","sysseek","system","syswrite","tell","telldir","tie","tied","time","times","tr","truncate","uc","ucfirst","umask","undef","unless","unlink","unpack","unshift","untie","until","use","utime","values","vec","wait","waitpid","wantarray","warn","when","while","write","x|0","xor","y|0"],r=/[dualxmsipngr]{0,12}/,i={$pattern:/[\w.]+/,keyword:n.join(" ")},o={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:i},s={begin:/->\{/,end:/\}/},l={variants:[{begin:/\$\d/},{begin:e.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@][^\s\w{]/,relevance:0}]},u=[t.BACKSLASH_ESCAPE,o,l],d=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],f=(b,y,v="\\1")=>{let x=v==="\\1"?v:e.concat(v,y);return e.concat(e.concat("(?:",b,")"),y,/(?:\\.|[^\\\/])*?/,x,/(?:\\.|[^\\\/])*?/,v,r)},h=(b,y,v)=>e.concat(e.concat("(?:",b,")"),y,/(?:\\.|[^\\\/])*?/,v,r),m=[l,t.HASH_COMMENT_MODE,t.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),s,{className:"string",contains:u,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[t.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+t.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[t.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:f("s|tr|y",e.either(...d,{capture:!0}))},{begin:f("s|tr|y","\\(","\\)")},{begin:f("s|tr|y","\\[","\\]")},{begin:f("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:h("(?:m|qr)?",/\//,/\//)},{begin:h("m|qr",e.either(...d,{capture:!0}),/\1/)},{begin:h("m|qr",/\(/,/\)/)},{begin:h("m|qr",/\[/,/\]/)},{begin:h("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[t.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return o.contains=m,s.contains=m,{name:"Perl",aliases:["pl","pm"],keywords:i,contains:m}}function Jx(t){let e=t.regex,n=/(?![A-Za-z0-9])(?![$])/,r=e.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,n),i=e.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,n),o={scope:"variable",match:"\\$+"+r},s={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},l={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},u=t.inherit(t.APOS_STRING_MODE,{illegal:null}),d=t.inherit(t.QUOTE_STRING_MODE,{illegal:null,contains:t.QUOTE_STRING_MODE.contains.concat(l)}),f={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:t.QUOTE_STRING_MODE.contains.concat(l),"on:begin":(ge,we)=>{we.data._beginMatch=ge[1]||ge[2]},"on:end":(ge,we)=>{we.data._beginMatch!==ge[1]&&we.ignoreMatch()}},h=t.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),m=`[ -]`,b={scope:"string",variants:[d,u,f,h]},y={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},v=["false","null","true"],x=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],M=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],L={keyword:x,literal:(ge=>{let we=[];return ge.forEach(xe=>{we.push(xe),xe.toLowerCase()===xe?we.push(xe.toUpperCase()):we.push(xe.toLowerCase())}),we})(v),built_in:M},S=ge=>ge.map(we=>we.replace(/\|\d+$/,"")),z={variants:[{match:[/new/,e.concat(m,"+"),e.concat("(?!",S(M).join("\\b|"),"\\b)"),i],scope:{1:"keyword",4:"title.class"}}]},O=e.concat(r,"\\b(?!\\()"),q={variants:[{match:[e.concat(/::/,e.lookahead(/(?!class\b)/)),O],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[i,e.concat(/::/,e.lookahead(/(?!class\b)/)),O],scope:{1:"title.class",3:"variable.constant"}},{match:[i,e.concat("::",e.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},J={scope:"attr",match:e.concat(r,e.lookahead(":"),e.lookahead(/(?!::)/))},W={relevance:0,begin:/\(/,end:/\)/,keywords:L,contains:[J,o,q,t.C_BLOCK_COMMENT_MODE,b,y,z]},ue={relevance:0,match:[/\b/,e.concat("(?!fn\\b|function\\b|",S(x).join("\\b|"),"|",S(M).join("\\b|"),"\\b)"),r,e.concat(m,"*"),e.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[W]};W.contains.push(ue);let ye=[J,q,t.C_BLOCK_COMMENT_MODE,b,y,z],Te={begin:e.concat(/#\[\s*/,i),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:v,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:v,keyword:["new","array"]},contains:["self",...ye]},...ye,{scope:"meta",match:i}]};return{case_insensitive:!1,keywords:L,contains:[Te,t.HASH_COMMENT_MODE,t.COMMENT("//","$"),t.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:t.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},s,{scope:"variable.language",match:/\$this\b/},o,ue,q,{match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},z,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},t.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:L,contains:["self",o,q,t.C_BLOCK_COMMENT_MODE,b,y]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[t.inherit(t.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},t.UNDERSCORE_TITLE_MODE]},b,y]}}function Xx(t){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},t.inherit(t.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),t.inherit(t.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}function Zx(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}function jx(t){let e=t.regex,n=/[\p{XID_Start}_]\p{XID_Continue}*/u,r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],l={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},u={className:"meta",begin:/^(>>>|\.\.\.) /},d={className:"subst",begin:/\{/,end:/\}/,keywords:l,illegal:/#/},f={begin:/\{\{/,relevance:0},h={className:"string",contains:[t.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,u,f,d]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,u,f,d]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[t.BACKSLASH_ESCAPE,f,d]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,f,d]},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},m="[0-9](_?[0-9])*",b=`(\\b(${m}))?\\.(${m})|\\b(${m})\\.`,y=`\\b|${r.join("|")}`,v={className:"number",relevance:0,variants:[{begin:`(\\b(${m})|(${b}))[eE][+-]?(${m})[jJ]?(?=${y})`},{begin:`(${b})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${y})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${y})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${y})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${y})`},{begin:`\\b(${m})[jJ](?=${y})`}]},x={className:"comment",begin:e.lookahead(/# type:/),end:/$/,keywords:l,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},M={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:["self",u,v,h,t.HASH_COMMENT_MODE]}]};return d.contains=[h,v,u],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:l,illegal:/(<\/|\?)|=>/,contains:[u,v,{begin:/\bself\b/},{beginKeywords:"if",relevance:0},h,x,t.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[M]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[v,M,h]}]}}function Qx(t){return{aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}function e_(t){let e=t.regex,n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,r=e.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,o=e.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:n,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[t.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:e.lookahead(e.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:n},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),t.HASH_COMMENT_MODE,{scope:"string",contains:[t.BACKSLASH_ESCAPE],variants:[t.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),t.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),t.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),t.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),t.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),t.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[i,r]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,r]},{scope:{1:"punctuation",2:"number"},match:[o,r]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,r]}]},{scope:{3:"operator"},match:[n,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:o},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}function t_(t){let e=t.regex,n="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",r=e.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=e.concat(r,/(::\w+)*/),s={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield",...["include","extend","prepend","public","private","protected","raise","throw"]],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},l={className:"doctag",begin:"@[A-Za-z]+"},u={begin:"#<",end:">"},d=[t.COMMENT("#","$",{contains:[l]}),t.COMMENT("^=begin","^=end",{contains:[l],relevance:10}),t.COMMENT("^__END__",t.MATCH_NOTHING_RE)],f={className:"subst",begin:/#\{/,end:/\}/,keywords:s},h={className:"string",contains:[t.BACKSLASH_ESCAPE,f],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:e.concat(/<<[-~]?'?/,e.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[t.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[t.BACKSLASH_ESCAPE,f]})]}]},m="[1-9](_?[0-9])*|0",b="[0-9](_?[0-9])*",y={className:"number",relevance:0,variants:[{begin:`\\b(${m})(\\.(${b}))?([eE][+-]?(${b})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},v={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:s}]},O=[h,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:s},{match:[/(include|extend)\s+/,i],scope:{2:"title.class"},keywords:s},{relevance:0,match:[i,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:r,scope:"title.class"},{match:[/def/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[v]},{begin:t.IDENT_RE+"::"},{className:"symbol",begin:t.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[h,{begin:n}],relevance:0},y,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:s},{begin:"("+t.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[t.BACKSLASH_ESCAPE,f],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(u,d),relevance:0}].concat(u,d);f.contains=O,v.contains=O;let q="[>?]>",J="[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]",W="(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>",ue=[{begin:/^\s*=>/,starts:{end:"$",contains:O}},{className:"meta.prompt",begin:"^("+q+"|"+J+"|"+W+")(?=[ ])",starts:{end:"$",keywords:s,contains:O}}];return d.unshift(u),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:s,illegal:/\/\*/,contains:[t.SHEBANG({binary:"ruby"})].concat(ue).concat(d).concat(O)}}function n_(t){let e=t.regex,n={className:"title.function.invoke",relevance:0,begin:e.concat(/\b/,/(?!let\b)/,t.IDENT_RE,e.lookahead(/\s*\(/))},r="([ui](8|16|32|64|128|size)|f(32|64))?",i=["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"],o=["true","false","Some","None","Ok","Err"],s=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],l=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:t.IDENT_RE+"!?",type:l,keyword:i,literal:o,built_in:s},illegal:""},n]}}var nF=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),rF=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],iF=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],oF=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],sF=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],aF=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse();function r_(t){let e=nF(t),n=sF,r=oF,i="@[a-z-]+",o="and or not only",l={className:"variable",begin:"(\\$"+"[a-zA-Z-][a-zA-Z0-9_-]*"+")\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,e.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},e.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+rF.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+r.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+n.join("|")+")"},l,{begin:/\(/,end:/\)/,contains:[e.CSS_NUMBER_MODE]},e.CSS_VARIABLE,{className:"attribute",begin:"\\b("+aF.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[e.BLOCK_COMMENT,l,e.HEXCOLOR,e.CSS_NUMBER_MODE,t.QUOTE_STRING_MODE,t.APOS_STRING_MODE,e.IMPORTANT,e.FUNCTION_DISPATCH]},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:o,attribute:iF.join(" ")},contains:[{begin:i,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},l,t.QUOTE_STRING_MODE,t.APOS_STRING_MODE,e.HEXCOLOR,e.CSS_NUMBER_MODE]},e.FUNCTION_DISPATCH]}}function i_(t){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}function o_(t){let e=t.regex,n=t.COMMENT("--","$"),r={className:"string",variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},i={begin:/"/,end:/"/,contains:[{begin:/""/}]},o=["true","false","unknown"],s=["double precision","large object","with timezone","without timezone"],l=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],u=["add","asc","collation","desc","final","first","last","view"],d=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],f=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],h=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],m=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],b=f,y=[...d,...u].filter(L=>!f.includes(L)),v={className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},x={className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},M={begin:e.concat(/\b/,e.either(...b),/\s*\(/),relevance:0,keywords:{built_in:b}};function D(L,{exceptions:S,when:z}={}){let O=z;return S=S||[],L.map(q=>q.match(/\|\d+$/)||S.includes(q)?q:O(q)?`${q}|0`:q)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:D(y,{when:L=>L.length<3}),literal:o,type:l,built_in:h},contains:[{begin:e.either(...m),relevance:0,keywords:{$pattern:/[\w\.]+/,keyword:y.concat(m),literal:o,type:l}},{className:"type",begin:e.either(...s)},M,v,r,i,t.C_NUMBER_MODE,t.C_BLOCK_COMMENT_MODE,n,x]}}function c_(t){return t?typeof t=="string"?t:t.source:null}function bu(t){return ot("(?=",t,")")}function ot(...t){return t.map(n=>c_(n)).join("")}function lF(t){let e=t[t.length-1];return typeof e=="object"&&e.constructor===Object?(t.splice(t.length-1,1),e):{}}function Sn(...t){return"("+(lF(t).capture?"":"?:")+t.map(r=>c_(r)).join("|")+")"}var gm=t=>ot(/\b/,t,/\w$/.test(t)?/\b/:/\B/),cF=["Protocol","Type"].map(gm),s_=["init","self"].map(gm),uF=["Any","Self"],pm=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],a_=["false","nil","true"],dF=["assignment","associativity","higherThan","left","lowerThan","none","right"],fF=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],l_=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],u_=Sn(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),d_=Sn(u_,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),hm=ot(u_,d_,"*"),f_=Sn(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),yu=Sn(f_,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),qr=ot(f_,yu,"*"),mm=ot(/[A-Z]/,yu,"*"),pF=["autoclosure",ot(/convention\(/,Sn("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",ot(/objc\(/,qr,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],hF=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"];function p_(t){let e={match:/\s+/,relevance:0},n=t.COMMENT("/\\*","\\*/",{contains:["self"]}),r=[t.C_LINE_COMMENT_MODE,n],i={match:[/\./,Sn(...cF,...s_)],className:{2:"keyword"}},o={match:ot(/\./,Sn(...pm)),relevance:0},s=pm.filter(Le=>typeof Le=="string").concat(["_|0"]),l=pm.filter(Le=>typeof Le!="string").concat(uF).map(gm),u={variants:[{className:"keyword",match:Sn(...l,...s_)}]},d={$pattern:Sn(/\b\w+/,/#\w+/),keyword:s.concat(fF),literal:a_},f=[i,o,u],h={match:ot(/\./,Sn(...l_)),relevance:0},m={className:"built_in",match:ot(/\b/,Sn(...l_),/(?=\()/)},b=[h,m],y={match:/->/,relevance:0},v={className:"operator",relevance:0,variants:[{match:hm},{match:`\\.(\\.|${d_})+`}]},x=[y,v],M="([0-9]_*)+",D="([0-9a-fA-F]_*)+",L={className:"number",relevance:0,variants:[{match:`\\b(${M})(\\.(${M}))?([eE][+-]?(${M}))?\\b`},{match:`\\b0x(${D})(\\.(${D}))?([pP][+-]?(${M}))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},S=(Le="")=>({className:"subst",variants:[{match:ot(/\\/,Le,/[0\\tnr"']/)},{match:ot(/\\/,Le,/u\{[0-9a-fA-F]{1,8}\}/)}]}),z=(Le="")=>({className:"subst",match:ot(/\\/,Le,/[\t ]*(?:[\r\n]|\r\n)/)}),O=(Le="")=>({className:"subst",label:"interpol",begin:ot(/\\/,Le,/\(/),end:/\)/}),q=(Le="")=>({begin:ot(Le,/"""/),end:ot(/"""/,Le),contains:[S(Le),z(Le),O(Le)]}),J=(Le="")=>({begin:ot(Le,/"/),end:ot(/"/,Le),contains:[S(Le),O(Le)]}),W={className:"string",variants:[q(),q("#"),q("##"),q("###"),J(),J("#"),J("##"),J("###")]},ue={match:ot(/`/,qr,/`/)},ye={className:"variable",match:/\$\d+/},Te={className:"variable",match:`\\$${yu}+`},ge=[ue,ye,Te],we={match:/(@|#(un)?)available/,className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:hF,contains:[...x,L,W]}]}},xe={className:"keyword",match:ot(/@/,Sn(...pF))},P={className:"meta",match:ot(/@/,qr)},N=[we,xe,P],R={match:bu(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:ot(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,yu,"+")},{className:"type",match:mm,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:ot(/\s+&\s+/,bu(mm)),relevance:0}]},K={begin://,keywords:d,contains:[...r,...f,...N,y,R]};R.contains.push(K);let te={match:ot(qr,/\s*:/),keywords:"_|0",relevance:0},pe={begin:/\(/,end:/\)/,relevance:0,keywords:d,contains:["self",te,...r,...f,...b,...x,L,W,...ge,...N,R]},Ce={begin://,contains:[...r,R]},Ue={begin:Sn(bu(ot(qr,/\s*:/)),bu(ot(qr,/\s+/,qr,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:qr}]},$e={begin:/\(/,end:/\)/,keywords:d,contains:[Ue,...r,...f,...x,L,W,...N,R,pe],endsParent:!0,illegal:/["']/},He={match:[/func/,/\s+/,Sn(ue.match,qr,hm)],className:{1:"keyword",3:"title.function"},contains:[Ce,$e,e],illegal:[/\[/,/%/]},Xe={match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[Ce,$e,e],illegal:/\[|%/},xt={match:[/operator/,/\s+/,hm],className:{1:"keyword",3:"title"}},Pt={begin:[/precedencegroup/,/\s+/,mm],className:{1:"keyword",3:"title"},contains:[R],keywords:[...dF,...a_],end:/}/};for(let Le of W.variants){let _t=Le.contains.find(st=>st.label==="interpol");_t.keywords=d;let Xt=[...f,...b,...x,L,W,...ge];_t.contains=[...Xt,{begin:/\(/,end:/\)/,contains:["self",...Xt]}]}return{name:"Swift",keywords:d,contains:[...r,He,Xe,{beginKeywords:"struct protocol class extension enum actor",end:"\\{",excludeEnd:!0,keywords:d,contains:[t.inherit(t.TITLE_MODE,{className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...f]},xt,Pt,{beginKeywords:"import",end:/$/,contains:[...r],relevance:0},...f,...b,...x,L,W,...ge,...N,R,pe]}}var Eu="[A-Za-z$_][0-9A-Za-z$_]*",h_=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],m_=["true","false","null","undefined","NaN","Infinity"],g_=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],b_=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],y_=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],E_=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],v_=[].concat(y_,g_,b_);function mF(t){let e=t.regex,n=(R,{after:K})=>{let te="",end:""},o=/<[A-Za-z0-9\\._:-]+\s*\/>/,s={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(R,K)=>{let te=R[0].length+R.index,pe=R.input[te];if(pe==="<"||pe===","){K.ignoreMatch();return}pe===">"&&(n(R,{after:te})||K.ignoreMatch());let Ce,Ue=R.input.substring(te);if(Ce=Ue.match(/^\s*=/)){K.ignoreMatch();return}if((Ce=Ue.match(/^\s+extends\s+/))&&Ce.index===0){K.ignoreMatch();return}}},l={$pattern:Eu,keyword:h_,literal:m_,built_in:v_,"variable.language":E_},u="[0-9](_?[0-9])*",d=`\\.(${u})`,f="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",h={className:"number",variants:[{begin:`(\\b(${f})((${d})|\\.)?|(${d}))[eE][+-]?(${u})\\b`},{begin:`\\b(${f})\\b((${d})\\b|\\.)?|(${d})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},m={className:"subst",begin:"\\$\\{",end:"\\}",keywords:l,contains:[]},b={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"xml"}},y={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"css"}},v={begin:"gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"graphql"}},x={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,m]},D={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},L=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,{match:/\$\d+/},h];m.contains=L.concat({begin:/\{/,end:/\}/,keywords:l,contains:["self"].concat(L)});let S=[].concat(D,m.contains),z=S.concat([{begin:/\(/,end:/\)/,keywords:l,contains:["self"].concat(S)}]),O={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z},q={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},J={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...g_,...b_]}},W={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},ue={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},ye={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function Te(R){return e.concat("(?!",R.join("|"),")")}let ge={match:e.concat(/\b/,Te([...y_,"super","import"]),r,e.lookahead(/\(/)),className:"title.function",relevance:0},we={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},xe={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},P="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",N={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(P)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:l,exports:{PARAMS_CONTAINS:z,CLASS_REFERENCE:J},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),W,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,D,{match:/\$\d+/},h,J,{className:"attr",begin:r+e.lookahead(":"),relevance:0},N,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[D,t.REGEXP_MODE,{className:"function",begin:P,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:o},{begin:s.begin,"on:begin":s.isTrulyOpeningTag,end:s.end}],subLanguage:"xml",contains:[{begin:s.begin,end:s.end,skip:!0,contains:["self"]}]}]},ue,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},we,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},ge,ye,q,xe,{match:/\$[(.]/}]}}function w_(t){let e=mF(t),n=Eu,r=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={beginKeywords:"namespace",end:/\{/,excludeEnd:!0,contains:[e.exports.CLASS_REFERENCE]},o={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:r},contains:[e.exports.CLASS_REFERENCE]},s={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},l=["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"],u={$pattern:Eu,keyword:h_.concat(l),literal:m_,built_in:v_.concat(r),"variable.language":E_},d={className:"meta",begin:"@"+n},f=(m,b,y)=>{let v=m.contains.findIndex(x=>x.label===b);if(v===-1)throw new Error("can not find mode to replace");m.contains.splice(v,1,y)};Object.assign(e.keywords,u),e.exports.PARAMS_CONTAINS.push(d),e.contains=e.contains.concat([d,i,o]),f(e,"shebang",t.SHEBANG()),f(e,"use_strict",s);let h=e.contains.find(m=>m.label==="func.def");return h.relevance=0,Object.assign(e,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),e}function x_(t){let e=t.regex,n={className:"string",begin:/"(""|[^/n])"C\b/},r={className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},i=/\d{1,2}\/\d{1,2}\/\d{4}/,o=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,l=/\d{1,2}(:\d{1,2}){1,2}/,u={className:"literal",variants:[{begin:e.concat(/# */,e.either(o,i),/ *#/)},{begin:e.concat(/# */,l,/ *#/)},{begin:e.concat(/# */,s,/ *#/)},{begin:e.concat(/# */,e.either(o,i),/ +/,e.either(s,l),/ *#/)}]},d={className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},f={className:"label",begin:/^\w+:/},h=t.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),m=t.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[n,r,u,d,f,h,m,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[m]}]}}function __(t){t.regex;let e=t.COMMENT(/\(;/,/;\)/);e.contains.push("self");let n=t.COMMENT(/;;/,/$/),r=["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"],i={begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},o={className:"variable",begin:/\$[\w_]+/},s={match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},l={className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/},u={match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},d={className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/};return{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:r},contains:[n,e,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},o,s,i,t.QUOTE_STRING_MODE,u,d,l]}}function S_(t){let e=t.regex,n=e.concat(/[\p{L}_]/u,e.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,i={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},o={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},s=t.inherit(o,{begin:/\(/,end:/\)/}),l=t.inherit(t.APOS_STRING_MODE,{className:"string"}),u=t.inherit(t.QUOTE_STRING_MODE,{className:"string"}),d={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[o,u,l,s,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[o,s,u,l]}]}]},t.COMMENT(//,{relevance:10}),{begin://,relevance:10},i,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[u]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[d],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[d],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:e.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:d}]},{className:"tag",begin:e.concat(/<\//,e.lookahead(e.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function T_(t){let e="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ ]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ ]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ ]|$)"}]},i={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},o={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[t.BACKSLASH_ESCAPE,i]},s=t.inherit(o,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l="[0-9]{4}(-[0-9][0-9]){0,2}",u="([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?",d="(\\.[0-9]*)?",f="([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?",h={className:"number",begin:"\\b"+l+u+d+f+"\\b"},m={end:",",endsWithParent:!0,excludeEnd:!0,keywords:e,relevance:0},b={begin:/\{/,end:/\}/,contains:[m],illegal:"\\n",relevance:0},y={begin:"\\[",end:"\\]",contains:[m],illegal:"\\n",relevance:0},v=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+t.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+t.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},t.HASH_COMMENT_MODE,{beginKeywords:e,keywords:{literal:e}},h,{className:"number",begin:t.C_NUMBER_RE+"\\b",relevance:0},b,y,o],x=[...v];return x.pop(),x.push(s),m.contains=x,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:v}}var G_=qd(V_(),1);var Zn=G_.default;var Y_=qd(q_(),1),wa=Object.assign(vo(Error),{eval:vo(EvalError),range:vo(RangeError),reference:vo(ReferenceError),syntax:vo(SyntaxError),type:vo(TypeError),uri:vo(URIError)});function vo(t){return e.displayName=t.displayName||t.name,e;function e(n,...r){let i=n&&(0,Y_.default)(n,...r);return new t(i)}}var oH={}.hasOwnProperty,J_="hljs-";function X_(t,e,n={}){let r=n.prefix;if(typeof t!="string")throw wa("Expected `string` for name, got `%s`",t);if(!Zn.getLanguage(t))throw wa("Unknown language: `%s` is not registered",t);if(typeof e!="string")throw wa("Expected `string` for value, got `%s`",e);r==null&&(r=J_),Zn.configure({__emitter:Mm,classPrefix:r});let i=Zn.highlight(e,{language:t,ignoreIllegals:!0});if(Zn.configure({}),i.errorRaised)throw i.errorRaised;return i._emitter.root.data.language=i.language,i._emitter.root.data.relevance=i.relevance,i._emitter.root}function sH(t,e={}){let n=e.subset||Zn.listLanguages(),r=e.prefix,i=-1,o={type:"root",data:{language:null,relevance:0},children:[]};if(r==null&&(r=J_),typeof t!="string")throw wa("Expected `string` for value, got `%s`",t);for(;++io.data.relevance&&(o=l)}return o}function aH(t,e){Zn.registerLanguage(t,e)}var lH=function(t,e){if(typeof t=="string")Zn.registerAliases(e,{languageName:t});else{let n;for(n in t)oH.call(t,n)&&Zn.registerAliases(t[n],{languageName:n})}};function cH(t){return!!Zn.getLanguage(t)}function uH(){return Zn.listLanguages()}var Mm=class{constructor(e){this.options=e,this.root={type:"root",data:{language:null,relevance:0},children:[]},this.stack=[this.root]}addText(e){if(e==="")return;let n=this.stack[this.stack.length-1],r=n.children[n.children.length-1];r&&r.type==="text"?r.value+=e:n.children.push({type:"text",value:e})}startScope(e){this.openNode(String(e))}endScope(){this.closeNode()}__addSublanguage(e,n){let r=this.stack[this.stack.length-1],i=e.root.children;n?r.children.push({type:"element",tagName:"span",properties:{className:[n]},children:i}):r.children.push(...i)}openNode(e){let n=e.split(".").map((o,s)=>s?o+"_".repeat(s):this.options.classPrefix+o),r=this.stack[this.stack.length-1],i={type:"element",tagName:"span",properties:{className:n},children:[]};r.children.push(i),this.stack.push(i)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}},Ie={highlight:X_,highlightAuto:sH,registerLanguage:aH,registered:cH,listLanguages:uH,registerAlias:lH};Ie.registerLanguage("arduino",wx);Ie.registerLanguage("bash",xx);Ie.registerLanguage("c",_x);Ie.registerLanguage("cpp",Sx);Ie.registerLanguage("csharp",Tx);Ie.registerLanguage("css",Mx);Ie.registerLanguage("diff",Cx);Ie.registerLanguage("go",kx);Ie.registerLanguage("graphql",Ax);Ie.registerLanguage("ini",Nx);Ie.registerLanguage("java",Ix);Ie.registerLanguage("javascript",Fx);Ie.registerLanguage("json",Hx);Ie.registerLanguage("kotlin",zx);Ie.registerLanguage("less",Wx);Ie.registerLanguage("lua",Kx);Ie.registerLanguage("makefile",Vx);Ie.registerLanguage("markdown",Gx);Ie.registerLanguage("objectivec",qx);Ie.registerLanguage("perl",Yx);Ie.registerLanguage("php",Jx);Ie.registerLanguage("php-template",Xx);Ie.registerLanguage("plaintext",Zx);Ie.registerLanguage("python",jx);Ie.registerLanguage("python-repl",Qx);Ie.registerLanguage("r",e_);Ie.registerLanguage("ruby",t_);Ie.registerLanguage("rust",n_);Ie.registerLanguage("scss",r_);Ie.registerLanguage("shell",i_);Ie.registerLanguage("sql",o_);Ie.registerLanguage("swift",p_);Ie.registerLanguage("typescript",w_);Ie.registerLanguage("vbnet",x_);Ie.registerLanguage("wasm",__);Ie.registerLanguage("xml",S_);Ie.registerLanguage("yaml",T_);var Ci=(t,e=0,n=1)=>t>n?n:tMath.round(n*t)/n;var Iq={grad:360/400,turn:360,rad:360/(Math.PI*2)},Z_=t=>hH(Tu(t)),Tu=t=>(t[0]==="#"&&(t=t.substring(1)),t.length<6?{r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16),a:t.length===4?At(parseInt(t[3]+t[3],16)/255,2):1}:{r:parseInt(t.substring(0,2),16),g:parseInt(t.substring(2,4),16),b:parseInt(t.substring(4,6),16),a:t.length===8?At(parseInt(t.substring(6,8),16)/255,2):1});var j_=t=>pH(fH(t)),dH=({h:t,s:e,v:n,a:r})=>{let i=(200-e)*n/100;return{h:At(t),s:At(i>0&&i<200?e*n/100/(i<=100?i:200-i)*100:0),l:At(i/2),a:At(r,2)}};var xa=t=>{let{h:e,s:n,l:r}=dH(t);return`hsl(${e}, ${n}%, ${r}%)`};var fH=({h:t,s:e,v:n,a:r})=>{t=t/360*6,e=e/100,n=n/100;let i=Math.floor(t),o=n*(1-e),s=n*(1-(t-i)*e),l=n*(1-(1-t+i)*e),u=i%6;return{r:At([n,s,o,o,l,n][u]*255),g:At([l,n,n,s,o,o][u]*255),b:At([o,o,l,n,n,s][u]*255),a:At(r,2)}};var Su=t=>{let e=t.toString(16);return e.length<2?"0"+e:e},pH=({r:t,g:e,b:n,a:r})=>{let i=r<1?Su(At(r*255)):"";return"#"+Su(t)+Su(e)+Su(n)+i},hH=({r:t,g:e,b:n,a:r})=>{let i=Math.max(t,e,n),o=i-Math.min(t,e,n),s=o?i===t?(e-n)/o:i===e?2+(n-t)/o:4+(t-e)/o:0;return{h:At(60*(s<0?s+6:s)),s:At(i?o/i*100:0),v:At(i/255*100),a:r}};var Cm=(t,e)=>{if(t===e)return!0;for(let n in t)if(t[n]!==e[n])return!1;return!0};var Q_=(t,e)=>t.toLowerCase()===e.toLowerCase()?!0:Cm(Tu(t),Tu(e));var eS={},Mu=t=>{let e=eS[t];return e||(e=document.createElement("template"),e.innerHTML=t,eS[t]=e),e},_a=(t,e,n)=>{t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:n}))};var fs=!1,km=t=>"touches"in t,mH=t=>fs&&!km(t)?!1:(fs||(fs=km(t)),!0),tS=(t,e)=>{let n=km(e)?e.touches[0]:e,r=t.el.getBoundingClientRect();_a(t.el,"move",t.getMove({x:Ci((n.pageX-(r.left+window.pageXOffset))/r.width),y:Ci((n.pageY-(r.top+window.pageYOffset))/r.height)}))},gH=(t,e)=>{let n=e.keyCode;n>40||t.xy&&n<37||n<33||(e.preventDefault(),_a(t.el,"move",t.getMove({x:n===39?.01:n===37?-.01:n===34?.05:n===33?-.05:n===35?1:n===36?-1:0,y:n===40?.01:n===38?-.01:0},!0)))},ps=class{constructor(e,n,r,i){let o=Mu(`
`);e.appendChild(o.content.cloneNode(!0));let s=e.querySelector(`[part=${n}]`);s.addEventListener("mousedown",this),s.addEventListener("touchstart",this),s.addEventListener("keydown",this),this.el=s,this.xy=i,this.nodes=[s.firstChild,s]}set dragging(e){let n=e?document.addEventListener:document.removeEventListener;n(fs?"touchmove":"mousemove",this),n(fs?"touchend":"mouseup",this)}handleEvent(e){switch(e.type){case"mousedown":case"touchstart":if(e.preventDefault(),!mH(e)||!fs&&e.button!=0)return;this.el.focus(),tS(this,e),this.dragging=!0;break;case"mousemove":case"touchmove":e.preventDefault(),tS(this,e);break;case"mouseup":case"touchend":this.dragging=!1;break;case"keydown":gH(this,e);break}}style(e){e.forEach((n,r)=>{for(let i in n)this.nodes[r].style.setProperty(i,n[i])})}};var Cu=class extends ps{constructor(e){super(e,"hue",'aria-label="Hue" aria-valuemin="0" aria-valuemax="360"',!1)}update({h:e}){this.h=e,this.style([{left:`${e/360*100}%`,color:xa({h:e,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuenow",`${At(e)}`)}getMove(e,n){return{h:n?Ci(this.h+e.x*360,0,360):360*e.x}}};var ku=class extends ps{constructor(e){super(e,"saturation",'aria-label="Color"',!0)}update(e){this.hsva=e,this.style([{top:`${100-e.v}%`,left:`${e.s}%`,color:xa(e)},{"background-color":xa({h:e.h,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuetext",`Saturation ${At(e.s)}%, Brightness ${At(e.v)}%`)}getMove(e,n){return{s:n?Ci(this.hsva.s+e.x*100,0,100):e.x*100,v:n?Ci(this.hsva.v-e.y*100,0,100):Math.round(100-e.y*100)}}};var nS=':host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:"";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}';var rS="[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}";var iS="[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}";var Au=Symbol("same"),Am=Symbol("color"),oS=Symbol("hsva"),Nm=Symbol("update"),sS=Symbol("parts"),aS=Symbol("css"),lS=Symbol("sliders"),Nu=class extends HTMLElement{static get observedAttributes(){return["color"]}get[aS](){return[nS,rS,iS]}get[lS](){return[ku,Cu]}get color(){return this[Am]}set color(e){if(!this[Au](e)){let n=this.colorModel.toHsva(e);this[Nm](n),this[Am]=e}}constructor(){super();let e=Mu(``),n=this.attachShadow({mode:"open"});n.appendChild(e.content.cloneNode(!0)),n.addEventListener("move",this),this[sS]=this[lS].map(r=>new r(n))}connectedCallback(){if(this.hasOwnProperty("color")){let e=this.color;delete this.color,this.color=e}else this.color||(this.color=this.colorModel.defaultColor)}attributeChangedCallback(e,n,r){let i=this.colorModel.fromAttr(r);this[Au](i)||(this.color=i)}handleEvent(e){let n=this[oS],r={...n,...e.detail};this[Nm](r);let i;!Cm(r,n)&&!this[Au](i=this.colorModel.fromHsva(r))&&(this[Am]=i,_a(this,"color-changed",{value:i}))}[Au](e){return this.color&&this.colorModel.equal(e,this.color)}[Nm](e){this[oS]=e,this[sS].forEach(n=>n.update(e))}};var bH={defaultColor:"#000",toHsva:Z_,fromHsva:({h:t,s:e,v:n})=>j_({h:t,s:e,v:n,a:1}),equal:Q_,fromAttr:t=>t},Ou=class extends Nu{get colorModel(){return bH}};var dS=qd(cS(),1);customElements.define("tiptap-hex-color-picker",Ou);var yH={blockquote:[RE],bold:[IE],"bullet-list":[PE],"checked-list":[$p],code:[BE],"code-block":[Rh.configure({lowlight:Ie,HTMLAttributes:{class:"hljs"}})],color:[HE],details:[Eh,vh,wh],grid:[fh,ph],"grid-builder":[om,sm],heading:[GE.configure({levels:[1,2,3,4,5,6]})],highlight:[Wv],hr:[QE],hurdle:[Ih],italic:[ev],lead:[Wp],link:[ch.configure({openOnClick:!1,autolink:!1,HTMLAttributes:{rel:null,hreflang:null,class:null}})],media:[uh.configure({inline:!0})],oembed:[mh,bh,yh],"ordered-list":[rv],small:[dh],strike:[ov],subscript:[sv],superscript:[av],table:[Bv.configure({resizable:!0}),Hv,Fv,zv],underline:[$v]},EH=window.TiptapEditorExtensions||{},uS={...yH,...EH},Ru=document.getElementById("activeLocale");Ru&&Ru.addEventListener("change",()=>{let t=new CustomEvent("localeChange",{bubbles:!0,detail:{locale:Ru.value}});Ru.dispatchEvent(t)});function vH({state:t,statePath:e,tools:n=[],disabled:r=!1,locale:i="en",floatingMenuTools:o=[],placeholder:s=null,mergeTags:l=[]}){let u=window.filamentTiptapEditors||{};return{id:null,tools:n,state:t,statePath:e,fullScreenMode:!1,updatedAt:Date.now(),disabled:r,locale:i,floatingMenuTools:o,getExtensions(d){let f=this.tools.map(m=>typeof m=="string"?m:m.id),h=[zE,Uv,lc,$E,KE,VE,jE,FE,lm,am,um,dm,fm];if(s&&!r&&h.push(iv.configure({placeholder:s})),f.length){let m=Object.keys(uS),b=[],y=["paragraph"];h.push(ya.configure({pluginKey:`defaultBubbleMenu${d}`,element:this.$refs.defaultBubbleMenu,tippyOptions:{duration:[500,0]},shouldShow:({state:v,from:x,to:M})=>!(x===M||Wn(v,"link")||Wn(v,"table")||Wn(v,"image")||Wn(v,"oembed")||Wn(v,"vimeo")||Wn(v,"youtube")||Wn(v,"video")||Wn(v,"tiptapBlock"))})),this.floatingMenuTools.length&&(h.push(im.configure({pluginKey:`defaultFloatingMenu${d}`,element:this.$refs.defaultFloatingMenu,tippyOptions:{duration:[500,0]}})),this.floatingMenuTools.forEach(v=>{f.includes(v)||f.push(v)})),f.forEach(v=>{m.includes(v)?uS[v].forEach(x=>{["ordered-list","bullet-list","checked-list"].includes(v)?(h.push(x),h.includes(Ap)||h.push(Ap)):(v==="table"&&h.push(ya.configure({pluginKey:`tableBubbleMenu${d}`,element:this.$refs.tableBubbleMenu,tippyOptions:{duration:[500,0]},shouldShow:({state:M})=>Wn(M,"table")})),v==="link"&&h.push(ya.configure({pluginKey:`linkBubbleMenu${d}`,element:this.$refs.linkBubbleMenu,tippyOptions:{duration:[500,0]},shouldShow:({state:M})=>Wn(M,"link")})),h.push(x))}):["align-left","align-right","align-center","align-justify"].includes(v)&&(v==="align-left"&&b.push("start"),v==="align-center"&&b.push("center"),v==="align-right"&&b.push("end"),v==="align-justify"&&b.push("justify"),f.includes("heading")&&y.push("heading"),typeof h.find(M=>M.name==="textAlign")>"u"&&h.push(Lh.configure({types:y,alignments:b})))})}return l?.length&&h.push(cm.configure({mergeTags:l})),h},init:async function(){u[this.statePath]&&u[this.statePath].destroy(),this.initEditor(this.state),window.filamentTiptapEditors=u,document.addEventListener("dblclick",function(f){(f.target&&(f.target.hasAttribute("data-youtube-video")||f.target.hasAttribute("data-vimeo-video"))||f.target.hasAttribute("data-native-video"))&&(f.target.firstChild.style.pointerEvents="all")}),window.addEventListener("localeChange",f=>{this.locale=f.detail.locale});let d=this.$el.parentElement.closest("[x-sortable]");d&&(window.Sortable.utils.on(d,"start",()=>{let f=document.querySelectorAll(".tiptap-wrapper");f.length!==0&&f.forEach(function(h){h._x_dataStack[0].editor().setEditable(!1),h._x_dataStack[0].editor().options.element.style.pointerEvents="none"})}),window.Sortable.utils.on(d,"end",()=>{let f=document.querySelectorAll(".tiptap-wrapper");f.length!==0&&f.forEach(function(h){h._x_dataStack[0].editor().setEditable(!0),h._x_dataStack[0].editor().options.element.style.pointerEvents="all"})})),this.$watch("state",(f,h)=>{this.editor().isEmpty&&(this.editor().destroy(),this.initEditor(f)),(0,dS.isEqual)(h,this.editor().state.doc.toJSON())||this.updateEditorContent(f)})},destroy(){this.editor().destroy()},editor(){return u[this.statePath]},initEditor(d){let f=this;u[this.statePath]=new Jl({element:this.$refs.element,extensions:this.getExtensions(this.statePath),editable:!this.disabled,content:d,editorProps:{handlePaste(h,m,b){b.content.descendants(y=>{y.type.name==="tiptapBlock"&&(y.attrs.statePath=f.statePath,y.attrs.data=JSON.parse(y.attrs.data))})}},onUpdate({editor:h}){f.updatedAt=Date.now(),f.state=h.isEmpty?null:h.getJSON()},onSelectionUpdate(){f.updatedAt=Date.now()},onBlur(){f.updatedAt=Date.now()},onFocus(){f.updatedAt=Date.now()}})},updateEditorContent(d){if(this.editor().isEditable){let{from:f,to:h}=this.editor().state.selection;this.editor().commands.setContent(d,!0),this.editor().chain().focus().setTextSelection({from:f,to:h}).run()}},refreshEditorContent(){this.$nextTick(()=>this.updateEditorContent(this.state))},insertContent(d){if(d.detail.statePath===this.statePath)switch(d.detail.type){case"media":this.insertMedia(d);return;case"video":this.insertVideo(d);return;case"link":this.insertLink(d);return;case"source":this.insertSource(d);return;case"grid":this.insertGridBuilder(d);return;default:return}},insertMedia(d){Array.isArray(d.detail.media)?d.detail.media.forEach(f=>{this.executeMediaInsert(f)}):this.executeMediaInsert(d.detail.media)},executeMediaInsert(d=null){if(!(!d||d?.url===null)&&d){let f=d?.url||d?.src,h=["jpg","jpeg","svg","png","webp"],b=/.*\.([a-zA-Z]*)\??/.exec(f);b!==null&&h.includes(b[1])?this.editor().chain().focus().setImage({src:f,alt:d?.alt,title:d?.title,width:d?.width,height:d?.height,lazy:d?.lazy}).run():this.editor().chain().focus().extendMarkRange("link").setLink({href:f}).insertContent(d?.link_text).run()}},insertVideo(d){let f=d.detail.video;if(!f||f.url===null)return;let h={src:f.url,width:f.responsive?f.width*100:f.width,height:f.responsive?f.height*100:f.height,responsive:f.responsive??!0,"data-aspect-width":f.width,"data-aspect-height":f.height};f.url.includes("youtube")||f.url.includes("youtu.be")?this.editor().chain().focus().setYoutubeVideo({...h,controls:f.youtube_options.includes("controls"),nocookie:f.youtube_options.includes("nocookie"),start:f.start_at??0}).run():f.url.includes("vimeo")?this.editor().chain().focus().setVimeoVideo({...h,autoplay:f.vimeo_options.includes("autoplay"),loop:f.vimeo_options.includes("loop"),title:f.vimeo_options.includes("show_title"),byline:f.vimeo_options.includes("byline"),portrait:f.vimeo_options.includes("portrait")}).run():this.editor().chain().focus().setVideo({...h,autoplay:f.native_options.includes("autoplay"),loop:f.native_options.includes("loop"),controls:f.native_options.includes("controls")}).run()},insertLink(d){let f=d.detail;if(!(f.href===null&&f.id===null)){if(f.href===""&&f.id===null){this.unsetLink();return}this.editor().chain().focus().extendMarkRange("link").setLink({href:f.href,id:f.id??null,target:f.target??null,hreflang:f.hreflang??null,rel:f.rel??null,referrerpolicy:f.referrerpolicy??null,as_button:f.as_button??null,button_theme:f.button_theme??null}).selectTextblockEnd().run()}},unsetLink(){this.editor().chain().focus().extendMarkRange("link").unsetLink().selectTextblockEnd().run()},insertSource(d){this.updateEditorContent(d.detail.source)},insertGridBuilder(d){let f=d.detail.data,h="responsive",m=parseInt(f.asymmetric_left)??null,b=parseInt(f.asymmetric_right)??null;f.fixed&&(h="fixed"),f.asymmetric&&(h="asymmetric"),this.editor().chain().focus().insertGridBuilder({cols:f.columns,type:h,stackAt:f.stack_at,asymmetricLeft:m,asymmetricRight:b}).run()},insertBlock(d){d.detail.statePath===this.statePath&&(this.editor().commands.insertBlock({type:d.detail.type,statePath:d.detail.statePath,data:d.detail.data,preview:d.detail.preview,label:d.detail.label,coordinates:d.detail.coordinates}),this.editor().isFocused||this.editor().commands.focus())},insertMergeTag(d){this.editor().commands.insertMergeTag({tag:d.detail.tag,coordinates:d.detail.coordinates}),this.editor().isFocused||this.editor().commands.focus()},openBlockSettings(d){d.detail.statePath===this.statePath&&this.$wire.dispatchFormEvent("tiptap::updateBlock",this.statePath,d.detail)},updateBlock(d){d.detail.statePath===this.statePath&&(this.editor().commands.updateBlock({type:d.detail.type,statePath:d.detail.statePath,data:d.detail.data,preview:d.detail.preview,label:d.detail.label}),this.editor().isFocused||this.editor().commands.focus())},deleteBlock(){this.editor().commands.removeBlock()}}}export{vH as default}; + `; + component = document.createElement("div"); + component.innerHTML = html; + component.addEventListener("merge-tags-select", (event) => { + props.command({ id: event.detail.item }); + }); + popup = tippy_esm_default("body", { + getReferenceClientRect: props.clientRect, + appendTo: () => document.body, + content: component, + allowHTML: true, + showOnCreate: true, + interactive: true, + trigger: "manual", + placement: "bottom-start" + }); + }, + onUpdate(props) { + if (!props.items.length) { + popup[0].hide(); + return; + } + popup[0].show(); + component.dispatchEvent(new CustomEvent("merge-tags-update-items", { detail: props.items })); + }, + onKeyDown(props) { + component.dispatchEvent(new CustomEvent("merge-tags-key-down", { detail: props.event })); + }, + onExit() { + popup[0].destroy(); + } + }; + } + }) + ]; + } +}); + +// resources/js/extensions/ClassExtension.js +var ClassExtension = Extension.create({ + name: "classExtension", + addGlobalAttributes() { + return [ + { + types: [ + "heading", + "paragraph", + "link", + "image", + "listItem", + "bulletList", + "orderedList", + "table", + "tableHeader", + "tableRow", + "tableCell", + "textStyle" + ], + attributes: { + class: { + default: null, + parseHTML: (element) => element.getAttribute("class") ?? null, + renderHTML: (attributes) => { + if (!attributes.class) { + return null; + } + return { + class: attributes.class + }; + } + } + } + } + ]; + } +}); + +// resources/js/extensions/IdExtension.js +var IdExtension = Extension.create({ + name: "idExtension", + addGlobalAttributes() { + return [ + { + types: [ + "heading", + "link" + ], + attributes: { + id: { + default: null, + parseHTML: (element) => element.getAttribute("id") ?? null, + renderHTML: (attributes) => { + if (!attributes.id) { + return null; + } + return { + id: attributes.id + }; + } + } + } + } + ]; + } +}); + +// resources/js/extensions/StyleExtension.js +var StyleExtension = Extension.create({ + name: "styleExtension", + addGlobalAttributes() { + return [ + { + types: [ + "heading", + "paragraph", + "link", + "image", + "listItem", + "bulletList", + "orderedList", + "table", + "tableHeader", + "tableRow", + "tableCell", + "textStyle" + ], + attributes: { + style: { + default: null, + parseHTML: (element) => element.getAttribute("style") ?? null, + renderHTML: (attributes) => { + if (!attributes.style) { + return null; + } + return { + style: attributes.style + }; + } + } + } + } + ]; + } +}); + +// node_modules/lowlight/node_modules/highlight.js/es/languages/arduino.js +function cPlusPlus(hljs) { + const regex = hljs.regex; + const C_LINE_COMMENT_MODE2 = hljs.COMMENT("//", "$", { contains: [{ begin: /\\\n/ }] }); + const DECLTYPE_AUTO_RE = "decltype\\(auto\\)"; + const NAMESPACE_RE = "[a-zA-Z_]\\w*::"; + const TEMPLATE_ARGUMENT_RE = "<[^<>]+>"; + const FUNCTION_TYPE_RE = "(?!struct)(" + DECLTYPE_AUTO_RE + "|" + regex.optional(NAMESPACE_RE) + "[a-zA-Z_]\\w*" + regex.optional(TEMPLATE_ARGUMENT_RE) + ")"; + const CPP_PRIMITIVE_TYPES = { + className: "type", + begin: "\\b[a-z\\d_]*_t\\b" + }; + const CHARACTER_ESCAPES = "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"; + const STRINGS = { + className: "string", + variants: [ + { + begin: '(u8?|U|L)?"', + end: '"', + illegal: "\\n", + contains: [hljs.BACKSLASH_ESCAPE] + }, + { + begin: "(u8?|U|L)?'(" + CHARACTER_ESCAPES + "|.)", + end: "'", + illegal: "." + }, + hljs.END_SAME_AS_BEGIN({ + begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, + end: /\)([^()\\ ]{0,16})"/ + }) + ] + }; + const NUMBERS = { + className: "number", + variants: [ + { begin: "\\b(0b[01']+)" }, + { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" }, + { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } + ], + relevance: 0 + }; + const PREPROCESSOR = { + className: "meta", + begin: /#\s*[a-z]+\b/, + end: /$/, + keywords: { keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" }, + contains: [ + { + begin: /\\\n/, + relevance: 0 + }, + hljs.inherit(STRINGS, { className: "string" }), + { + className: "string", + begin: /<.*?>/ + }, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE + ] + }; + const TITLE_MODE2 = { + className: "title", + begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, + relevance: 0 + }; + const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + "\\s*\\("; + const RESERVED_KEYWORDS = [ + "alignas", + "alignof", + "and", + "and_eq", + "asm", + "atomic_cancel", + "atomic_commit", + "atomic_noexcept", + "auto", + "bitand", + "bitor", + "break", + "case", + "catch", + "class", + "co_await", + "co_return", + "co_yield", + "compl", + "concept", + "const_cast|10", + "consteval", + "constexpr", + "constinit", + "continue", + "decltype", + "default", + "delete", + "do", + "dynamic_cast|10", + "else", + "enum", + "explicit", + "export", + "extern", + "false", + "final", + "for", + "friend", + "goto", + "if", + "import", + "inline", + "module", + "mutable", + "namespace", + "new", + "noexcept", + "not", + "not_eq", + "nullptr", + "operator", + "or", + "or_eq", + "override", + "private", + "protected", + "public", + "reflexpr", + "register", + "reinterpret_cast|10", + "requires", + "return", + "sizeof", + "static_assert", + "static_cast|10", + "struct", + "switch", + "synchronized", + "template", + "this", + "thread_local", + "throw", + "transaction_safe", + "transaction_safe_dynamic", + "true", + "try", + "typedef", + "typeid", + "typename", + "union", + "using", + "virtual", + "volatile", + "while", + "xor", + "xor_eq" + ]; + const RESERVED_TYPES = [ + "bool", + "char", + "char16_t", + "char32_t", + "char8_t", + "double", + "float", + "int", + "long", + "short", + "void", + "wchar_t", + "unsigned", + "signed", + "const", + "static" + ]; + const TYPE_HINTS = [ + "any", + "auto_ptr", + "barrier", + "binary_semaphore", + "bitset", + "complex", + "condition_variable", + "condition_variable_any", + "counting_semaphore", + "deque", + "false_type", + "future", + "imaginary", + "initializer_list", + "istringstream", + "jthread", + "latch", + "lock_guard", + "multimap", + "multiset", + "mutex", + "optional", + "ostringstream", + "packaged_task", + "pair", + "promise", + "priority_queue", + "queue", + "recursive_mutex", + "recursive_timed_mutex", + "scoped_lock", + "set", + "shared_future", + "shared_lock", + "shared_mutex", + "shared_timed_mutex", + "shared_ptr", + "stack", + "string_view", + "stringstream", + "timed_mutex", + "thread", + "true_type", + "tuple", + "unique_lock", + "unique_ptr", + "unordered_map", + "unordered_multimap", + "unordered_multiset", + "unordered_set", + "variant", + "vector", + "weak_ptr", + "wstring", + "wstring_view" + ]; + const FUNCTION_HINTS = [ + "abort", + "abs", + "acos", + "apply", + "as_const", + "asin", + "atan", + "atan2", + "calloc", + "ceil", + "cerr", + "cin", + "clog", + "cos", + "cosh", + "cout", + "declval", + "endl", + "exchange", + "exit", + "exp", + "fabs", + "floor", + "fmod", + "forward", + "fprintf", + "fputs", + "free", + "frexp", + "fscanf", + "future", + "invoke", + "isalnum", + "isalpha", + "iscntrl", + "isdigit", + "isgraph", + "islower", + "isprint", + "ispunct", + "isspace", + "isupper", + "isxdigit", + "labs", + "launder", + "ldexp", + "log", + "log10", + "make_pair", + "make_shared", + "make_shared_for_overwrite", + "make_tuple", + "make_unique", + "malloc", + "memchr", + "memcmp", + "memcpy", + "memset", + "modf", + "move", + "pow", + "printf", + "putchar", + "puts", + "realloc", + "scanf", + "sin", + "sinh", + "snprintf", + "sprintf", + "sqrt", + "sscanf", + "std", + "stderr", + "stdin", + "stdout", + "strcat", + "strchr", + "strcmp", + "strcpy", + "strcspn", + "strlen", + "strncat", + "strncmp", + "strncpy", + "strpbrk", + "strrchr", + "strspn", + "strstr", + "swap", + "tan", + "tanh", + "terminate", + "to_underlying", + "tolower", + "toupper", + "vfprintf", + "visit", + "vprintf", + "vsprintf" + ]; + const LITERALS3 = [ + "NULL", + "false", + "nullopt", + "nullptr", + "true" + ]; + const BUILT_IN = ["_Pragma"]; + const CPP_KEYWORDS = { + type: RESERVED_TYPES, + keyword: RESERVED_KEYWORDS, + literal: LITERALS3, + built_in: BUILT_IN, + _type_hints: TYPE_HINTS + }; + const FUNCTION_DISPATCH = { + className: "function.dispatch", + relevance: 0, + keywords: { + // Only for relevance, not highlighting. + _hint: FUNCTION_HINTS + }, + begin: regex.concat( + /\b/, + /(?!decltype)/, + /(?!if)/, + /(?!for)/, + /(?!switch)/, + /(?!while)/, + hljs.IDENT_RE, + regex.lookahead(/(<[^<>]+>|)\s*\(/) + ) + }; + const EXPRESSION_CONTAINS = [ + FUNCTION_DISPATCH, + PREPROCESSOR, + CPP_PRIMITIVE_TYPES, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + NUMBERS, + STRINGS + ]; + const EXPRESSION_CONTEXT = { + // This mode covers expression context where we can't expect a function + // definition and shouldn't highlight anything that looks like one: + // `return some()`, `else if()`, `(x*sum(1, 2))` + variants: [ + { + begin: /=/, + end: /;/ + }, + { + begin: /\(/, + end: /\)/ + }, + { + beginKeywords: "new throw return else", + end: /;/ + } + ], + keywords: CPP_KEYWORDS, + contains: EXPRESSION_CONTAINS.concat([ + { + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + contains: EXPRESSION_CONTAINS.concat(["self"]), + relevance: 0 + } + ]), + relevance: 0 + }; + const FUNCTION_DECLARATION = { + className: "function", + begin: "(" + FUNCTION_TYPE_RE + "[\\*&\\s]+)+" + FUNCTION_TITLE, + returnBegin: true, + end: /[{;=]/, + excludeEnd: true, + keywords: CPP_KEYWORDS, + illegal: /[^\w\s\*&:<>.]/, + contains: [ + { + // to prevent it from being confused as the function title + begin: DECLTYPE_AUTO_RE, + keywords: CPP_KEYWORDS, + relevance: 0 + }, + { + begin: FUNCTION_TITLE, + returnBegin: true, + contains: [TITLE_MODE2], + relevance: 0 + }, + // needed because we do not have look-behind on the below rule + // to prevent it from grabbing the final : in a :: pair + { + begin: /::/, + relevance: 0 + }, + // initializers + { + begin: /:/, + endsWithParent: true, + contains: [ + STRINGS, + NUMBERS + ] + }, + // allow for multiple declarations, e.g.: + // extern void f(int), g(char); + { + relevance: 0, + match: /,/ + }, + { + className: "params", + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + relevance: 0, + contains: [ + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + CPP_PRIMITIVE_TYPES, + // Count matching parentheses. + { + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + relevance: 0, + contains: [ + "self", + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + CPP_PRIMITIVE_TYPES + ] + } + ] + }, + CPP_PRIMITIVE_TYPES, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + PREPROCESSOR + ] + }; + return { + name: "C++", + aliases: [ + "cc", + "c++", + "h++", + "hpp", + "hh", + "hxx", + "cxx" + ], + keywords: CPP_KEYWORDS, + illegal: " rooms (9);` + begin: "\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function)\\s*<(?!<)", + end: ">", + keywords: CPP_KEYWORDS, + contains: [ + "self", + CPP_PRIMITIVE_TYPES + ] + }, + { + begin: hljs.IDENT_RE + "::", + keywords: CPP_KEYWORDS + }, + { + match: [ + // extra complexity to deal with `enum class` and `enum struct` + /\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/, + /\s+/, + /\w+/ + ], + className: { + 1: "keyword", + 3: "title.class" + } + } + ] + ) + }; +} +function arduino(hljs) { + const ARDUINO_KW = { + type: [ + "boolean", + "byte", + "word", + "String" + ], + built_in: [ + "KeyboardController", + "MouseController", + "SoftwareSerial", + "EthernetServer", + "EthernetClient", + "LiquidCrystal", + "RobotControl", + "GSMVoiceCall", + "EthernetUDP", + "EsploraTFT", + "HttpClient", + "RobotMotor", + "WiFiClient", + "GSMScanner", + "FileSystem", + "Scheduler", + "GSMServer", + "YunClient", + "YunServer", + "IPAddress", + "GSMClient", + "GSMModem", + "Keyboard", + "Ethernet", + "Console", + "GSMBand", + "Esplora", + "Stepper", + "Process", + "WiFiUDP", + "GSM_SMS", + "Mailbox", + "USBHost", + "Firmata", + "PImage", + "Client", + "Server", + "GSMPIN", + "FileIO", + "Bridge", + "Serial", + "EEPROM", + "Stream", + "Mouse", + "Audio", + "Servo", + "File", + "Task", + "GPRS", + "WiFi", + "Wire", + "TFT", + "GSM", + "SPI", + "SD" + ], + _hints: [ + "setup", + "loop", + "runShellCommandAsynchronously", + "analogWriteResolution", + "retrieveCallingNumber", + "printFirmwareVersion", + "analogReadResolution", + "sendDigitalPortPair", + "noListenOnLocalhost", + "readJoystickButton", + "setFirmwareVersion", + "readJoystickSwitch", + "scrollDisplayRight", + "getVoiceCallStatus", + "scrollDisplayLeft", + "writeMicroseconds", + "delayMicroseconds", + "beginTransmission", + "getSignalStrength", + "runAsynchronously", + "getAsynchronously", + "listenOnLocalhost", + "getCurrentCarrier", + "readAccelerometer", + "messageAvailable", + "sendDigitalPorts", + "lineFollowConfig", + "countryNameWrite", + "runShellCommand", + "readStringUntil", + "rewindDirectory", + "readTemperature", + "setClockDivider", + "readLightSensor", + "endTransmission", + "analogReference", + "detachInterrupt", + "countryNameRead", + "attachInterrupt", + "encryptionType", + "readBytesUntil", + "robotNameWrite", + "readMicrophone", + "robotNameRead", + "cityNameWrite", + "userNameWrite", + "readJoystickY", + "readJoystickX", + "mouseReleased", + "openNextFile", + "scanNetworks", + "noInterrupts", + "digitalWrite", + "beginSpeaker", + "mousePressed", + "isActionDone", + "mouseDragged", + "displayLogos", + "noAutoscroll", + "addParameter", + "remoteNumber", + "getModifiers", + "keyboardRead", + "userNameRead", + "waitContinue", + "processInput", + "parseCommand", + "printVersion", + "readNetworks", + "writeMessage", + "blinkVersion", + "cityNameRead", + "readMessage", + "setDataMode", + "parsePacket", + "isListening", + "setBitOrder", + "beginPacket", + "isDirectory", + "motorsWrite", + "drawCompass", + "digitalRead", + "clearScreen", + "serialEvent", + "rightToLeft", + "setTextSize", + "leftToRight", + "requestFrom", + "keyReleased", + "compassRead", + "analogWrite", + "interrupts", + "WiFiServer", + "disconnect", + "playMelody", + "parseFloat", + "autoscroll", + "getPINUsed", + "setPINUsed", + "setTimeout", + "sendAnalog", + "readSlider", + "analogRead", + "beginWrite", + "createChar", + "motorsStop", + "keyPressed", + "tempoWrite", + "readButton", + "subnetMask", + "debugPrint", + "macAddress", + "writeGreen", + "randomSeed", + "attachGPRS", + "readString", + "sendString", + "remotePort", + "releaseAll", + "mouseMoved", + "background", + "getXChange", + "getYChange", + "answerCall", + "getResult", + "voiceCall", + "endPacket", + "constrain", + "getSocket", + "writeJSON", + "getButton", + "available", + "connected", + "findUntil", + "readBytes", + "exitValue", + "readGreen", + "writeBlue", + "startLoop", + "IPAddress", + "isPressed", + "sendSysex", + "pauseMode", + "gatewayIP", + "setCursor", + "getOemKey", + "tuneWrite", + "noDisplay", + "loadImage", + "switchPIN", + "onRequest", + "onReceive", + "changePIN", + "playFile", + "noBuffer", + "parseInt", + "overflow", + "checkPIN", + "knobRead", + "beginTFT", + "bitClear", + "updateIR", + "bitWrite", + "position", + "writeRGB", + "highByte", + "writeRed", + "setSpeed", + "readBlue", + "noStroke", + "remoteIP", + "transfer", + "shutdown", + "hangCall", + "beginSMS", + "endWrite", + "attached", + "maintain", + "noCursor", + "checkReg", + "checkPUK", + "shiftOut", + "isValid", + "shiftIn", + "pulseIn", + "connect", + "println", + "localIP", + "pinMode", + "getIMEI", + "display", + "noBlink", + "process", + "getBand", + "running", + "beginSD", + "drawBMP", + "lowByte", + "setBand", + "release", + "bitRead", + "prepare", + "pointTo", + "readRed", + "setMode", + "noFill", + "remove", + "listen", + "stroke", + "detach", + "attach", + "noTone", + "exists", + "buffer", + "height", + "bitSet", + "circle", + "config", + "cursor", + "random", + "IRread", + "setDNS", + "endSMS", + "getKey", + "micros", + "millis", + "begin", + "print", + "write", + "ready", + "flush", + "width", + "isPIN", + "blink", + "clear", + "press", + "mkdir", + "rmdir", + "close", + "point", + "yield", + "image", + "BSSID", + "click", + "delay", + "read", + "text", + "move", + "peek", + "beep", + "rect", + "line", + "open", + "seek", + "fill", + "size", + "turn", + "stop", + "home", + "find", + "step", + "tone", + "sqrt", + "RSSI", + "SSID", + "end", + "bit", + "tan", + "cos", + "sin", + "pow", + "map", + "abs", + "max", + "min", + "get", + "run", + "put" + ], + literal: [ + "DIGITAL_MESSAGE", + "FIRMATA_STRING", + "ANALOG_MESSAGE", + "REPORT_DIGITAL", + "REPORT_ANALOG", + "INPUT_PULLUP", + "SET_PIN_MODE", + "INTERNAL2V56", + "SYSTEM_RESET", + "LED_BUILTIN", + "INTERNAL1V1", + "SYSEX_START", + "INTERNAL", + "EXTERNAL", + "DEFAULT", + "OUTPUT", + "INPUT", + "HIGH", + "LOW" + ] + }; + const ARDUINO = cPlusPlus(hljs); + const kws = ( + /** @type {Record} */ + ARDUINO.keywords + ); + kws.type = [ + ...kws.type, + ...ARDUINO_KW.type + ]; + kws.literal = [ + ...kws.literal, + ...ARDUINO_KW.literal + ]; + kws.built_in = [ + ...kws.built_in, + ...ARDUINO_KW.built_in + ]; + kws._hints = ARDUINO_KW._hints; + ARDUINO.name = "Arduino"; + ARDUINO.aliases = ["ino"]; + ARDUINO.supersetOf = "cpp"; + return ARDUINO; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/bash.js +function bash(hljs) { + const regex = hljs.regex; + const VAR = {}; + const BRACED_VAR = { + begin: /\$\{/, + end: /\}/, + contains: [ + "self", + { + begin: /:-/, + contains: [VAR] + } + // default values + ] + }; + Object.assign(VAR, { + className: "variable", + variants: [ + { begin: regex.concat( + /\$[\w\d#@][\w\d_]*/, + // negative look-ahead tries to avoid matching patterns that are not + // Perl at all like $ident$, @ident@, etc. + `(?![\\w\\d])(?![$])` + ) }, + BRACED_VAR + ] + }); + const SUBST = { + className: "subst", + begin: /\$\(/, + end: /\)/, + contains: [hljs.BACKSLASH_ESCAPE] + }; + const HERE_DOC = { + begin: /<<-?\s*(?=\w+)/, + starts: { contains: [ + hljs.END_SAME_AS_BEGIN({ + begin: /(\w+)/, + end: /(\w+)/, + className: "string" + }) + ] } + }; + const QUOTE_STRING = { + className: "string", + begin: /"/, + end: /"/, + contains: [ + hljs.BACKSLASH_ESCAPE, + VAR, + SUBST + ] + }; + SUBST.contains.push(QUOTE_STRING); + const ESCAPED_QUOTE = { + className: "", + begin: /\\"/ + }; + const APOS_STRING = { + className: "string", + begin: /'/, + end: /'/ + }; + const ARITHMETIC = { + begin: /\$?\(\(/, + end: /\)\)/, + contains: [ + { + begin: /\d+#[0-9a-f]+/, + className: "number" + }, + hljs.NUMBER_MODE, + VAR + ] + }; + const SH_LIKE_SHELLS = [ + "fish", + "bash", + "zsh", + "sh", + "csh", + "ksh", + "tcsh", + "dash", + "scsh" + ]; + const KNOWN_SHEBANG = hljs.SHEBANG({ + binary: `(${SH_LIKE_SHELLS.join("|")})`, + relevance: 10 + }); + const FUNCTION = { + className: "function", + begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, + returnBegin: true, + contains: [hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ })], + relevance: 0 + }; + const KEYWORDS3 = [ + "if", + "then", + "else", + "elif", + "fi", + "for", + "while", + "until", + "in", + "do", + "done", + "case", + "esac", + "function", + "select" + ]; + const LITERALS3 = [ + "true", + "false" + ]; + const PATH_MODE = { match: /(\/[a-z._-]+)+/ }; + const SHELL_BUILT_INS = [ + "break", + "cd", + "continue", + "eval", + "exec", + "exit", + "export", + "getopts", + "hash", + "pwd", + "readonly", + "return", + "shift", + "test", + "times", + "trap", + "umask", + "unset" + ]; + const BASH_BUILT_INS = [ + "alias", + "bind", + "builtin", + "caller", + "command", + "declare", + "echo", + "enable", + "help", + "let", + "local", + "logout", + "mapfile", + "printf", + "read", + "readarray", + "source", + "type", + "typeset", + "ulimit", + "unalias" + ]; + const ZSH_BUILT_INS = [ + "autoload", + "bg", + "bindkey", + "bye", + "cap", + "chdir", + "clone", + "comparguments", + "compcall", + "compctl", + "compdescribe", + "compfiles", + "compgroups", + "compquote", + "comptags", + "comptry", + "compvalues", + "dirs", + "disable", + "disown", + "echotc", + "echoti", + "emulate", + "fc", + "fg", + "float", + "functions", + "getcap", + "getln", + "history", + "integer", + "jobs", + "kill", + "limit", + "log", + "noglob", + "popd", + "print", + "pushd", + "pushln", + "rehash", + "sched", + "setcap", + "setopt", + "stat", + "suspend", + "ttyctl", + "unfunction", + "unhash", + "unlimit", + "unsetopt", + "vared", + "wait", + "whence", + "where", + "which", + "zcompile", + "zformat", + "zftp", + "zle", + "zmodload", + "zparseopts", + "zprof", + "zpty", + "zregexparse", + "zsocket", + "zstyle", + "ztcp" + ]; + const GNU_CORE_UTILS = [ + "chcon", + "chgrp", + "chown", + "chmod", + "cp", + "dd", + "df", + "dir", + "dircolors", + "ln", + "ls", + "mkdir", + "mkfifo", + "mknod", + "mktemp", + "mv", + "realpath", + "rm", + "rmdir", + "shred", + "sync", + "touch", + "truncate", + "vdir", + "b2sum", + "base32", + "base64", + "cat", + "cksum", + "comm", + "csplit", + "cut", + "expand", + "fmt", + "fold", + "head", + "join", + "md5sum", + "nl", + "numfmt", + "od", + "paste", + "ptx", + "pr", + "sha1sum", + "sha224sum", + "sha256sum", + "sha384sum", + "sha512sum", + "shuf", + "sort", + "split", + "sum", + "tac", + "tail", + "tr", + "tsort", + "unexpand", + "uniq", + "wc", + "arch", + "basename", + "chroot", + "date", + "dirname", + "du", + "echo", + "env", + "expr", + "factor", + // "false", // keyword literal already + "groups", + "hostid", + "id", + "link", + "logname", + "nice", + "nohup", + "nproc", + "pathchk", + "pinky", + "printenv", + "printf", + "pwd", + "readlink", + "runcon", + "seq", + "sleep", + "stat", + "stdbuf", + "stty", + "tee", + "test", + "timeout", + // "true", // keyword literal already + "tty", + "uname", + "unlink", + "uptime", + "users", + "who", + "whoami", + "yes" + ]; + return { + name: "Bash", + aliases: ["sh"], + keywords: { + $pattern: /\b[a-z][a-z0-9._-]+\b/, + keyword: KEYWORDS3, + literal: LITERALS3, + built_in: [ + ...SHELL_BUILT_INS, + ...BASH_BUILT_INS, + // Shell modifiers + "set", + "shopt", + ...ZSH_BUILT_INS, + ...GNU_CORE_UTILS + ] + }, + contains: [ + KNOWN_SHEBANG, + // to catch known shells and boost relevancy + hljs.SHEBANG(), + // to catch unknown shells but still highlight the shebang + FUNCTION, + ARITHMETIC, + hljs.HASH_COMMENT_MODE, + HERE_DOC, + PATH_MODE, + QUOTE_STRING, + ESCAPED_QUOTE, + APOS_STRING, + VAR + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/c.js +function c(hljs) { + const regex = hljs.regex; + const C_LINE_COMMENT_MODE2 = hljs.COMMENT("//", "$", { contains: [{ begin: /\\\n/ }] }); + const DECLTYPE_AUTO_RE = "decltype\\(auto\\)"; + const NAMESPACE_RE = "[a-zA-Z_]\\w*::"; + const TEMPLATE_ARGUMENT_RE = "<[^<>]+>"; + const FUNCTION_TYPE_RE = "(" + DECLTYPE_AUTO_RE + "|" + regex.optional(NAMESPACE_RE) + "[a-zA-Z_]\\w*" + regex.optional(TEMPLATE_ARGUMENT_RE) + ")"; + const TYPES3 = { + className: "type", + variants: [ + { begin: "\\b[a-z\\d_]*_t\\b" }, + { match: /\batomic_[a-z]{3,6}\b/ } + ] + }; + const CHARACTER_ESCAPES = "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"; + const STRINGS = { + className: "string", + variants: [ + { + begin: '(u8?|U|L)?"', + end: '"', + illegal: "\\n", + contains: [hljs.BACKSLASH_ESCAPE] + }, + { + begin: "(u8?|U|L)?'(" + CHARACTER_ESCAPES + "|.)", + end: "'", + illegal: "." + }, + hljs.END_SAME_AS_BEGIN({ + begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, + end: /\)([^()\\ ]{0,16})"/ + }) + ] + }; + const NUMBERS = { + className: "number", + variants: [ + { begin: "\\b(0b[01']+)" }, + { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" }, + { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } + ], + relevance: 0 + }; + const PREPROCESSOR = { + className: "meta", + begin: /#\s*[a-z]+\b/, + end: /$/, + keywords: { keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" }, + contains: [ + { + begin: /\\\n/, + relevance: 0 + }, + hljs.inherit(STRINGS, { className: "string" }), + { + className: "string", + begin: /<.*?>/ + }, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE + ] + }; + const TITLE_MODE2 = { + className: "title", + begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, + relevance: 0 + }; + const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + "\\s*\\("; + const C_KEYWORDS = [ + "asm", + "auto", + "break", + "case", + "continue", + "default", + "do", + "else", + "enum", + "extern", + "for", + "fortran", + "goto", + "if", + "inline", + "register", + "restrict", + "return", + "sizeof", + "struct", + "switch", + "typedef", + "union", + "volatile", + "while", + "_Alignas", + "_Alignof", + "_Atomic", + "_Generic", + "_Noreturn", + "_Static_assert", + "_Thread_local", + // aliases + "alignas", + "alignof", + "noreturn", + "static_assert", + "thread_local", + // not a C keyword but is, for all intents and purposes, treated exactly like one. + "_Pragma" + ]; + const C_TYPES = [ + "float", + "double", + "signed", + "unsigned", + "int", + "short", + "long", + "char", + "void", + "_Bool", + "_Complex", + "_Imaginary", + "_Decimal32", + "_Decimal64", + "_Decimal128", + // modifiers + "const", + "static", + // aliases + "complex", + "bool", + "imaginary" + ]; + const KEYWORDS3 = { + keyword: C_KEYWORDS, + type: C_TYPES, + literal: "true false NULL", + // TODO: apply hinting work similar to what was done in cpp.js + built_in: "std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" + }; + const EXPRESSION_CONTAINS = [ + PREPROCESSOR, + TYPES3, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + NUMBERS, + STRINGS + ]; + const EXPRESSION_CONTEXT = { + // This mode covers expression context where we can't expect a function + // definition and shouldn't highlight anything that looks like one: + // `return some()`, `else if()`, `(x*sum(1, 2))` + variants: [ + { + begin: /=/, + end: /;/ + }, + { + begin: /\(/, + end: /\)/ + }, + { + beginKeywords: "new throw return else", + end: /;/ + } + ], + keywords: KEYWORDS3, + contains: EXPRESSION_CONTAINS.concat([ + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS3, + contains: EXPRESSION_CONTAINS.concat(["self"]), + relevance: 0 + } + ]), + relevance: 0 + }; + const FUNCTION_DECLARATION = { + begin: "(" + FUNCTION_TYPE_RE + "[\\*&\\s]+)+" + FUNCTION_TITLE, + returnBegin: true, + end: /[{;=]/, + excludeEnd: true, + keywords: KEYWORDS3, + illegal: /[^\w\s\*&:<>.]/, + contains: [ + { + // to prevent it from being confused as the function title + begin: DECLTYPE_AUTO_RE, + keywords: KEYWORDS3, + relevance: 0 + }, + { + begin: FUNCTION_TITLE, + returnBegin: true, + contains: [hljs.inherit(TITLE_MODE2, { className: "title.function" })], + relevance: 0 + }, + // allow for multiple declarations, e.g.: + // extern void f(int), g(char); + { + relevance: 0, + match: /,/ + }, + { + className: "params", + begin: /\(/, + end: /\)/, + keywords: KEYWORDS3, + relevance: 0, + contains: [ + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + TYPES3, + // Count matching parentheses. + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS3, + relevance: 0, + contains: [ + "self", + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + TYPES3 + ] + } + ] + }, + TYPES3, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + PREPROCESSOR + ] + }; + return { + name: "C", + aliases: ["h"], + keywords: KEYWORDS3, + // Until differentiations are added between `c` and `cpp`, `c` will + // not be auto-detected to avoid auto-detect conflicts between C and C++ + disableAutodetect: true, + illegal: "=]/, + contains: [ + { beginKeywords: "final class struct" }, + hljs.TITLE_MODE + ] + } + ] + ), + exports: { + preprocessor: PREPROCESSOR, + strings: STRINGS, + keywords: KEYWORDS3 + } + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/cpp.js +function cpp(hljs) { + const regex = hljs.regex; + const C_LINE_COMMENT_MODE2 = hljs.COMMENT("//", "$", { contains: [{ begin: /\\\n/ }] }); + const DECLTYPE_AUTO_RE = "decltype\\(auto\\)"; + const NAMESPACE_RE = "[a-zA-Z_]\\w*::"; + const TEMPLATE_ARGUMENT_RE = "<[^<>]+>"; + const FUNCTION_TYPE_RE = "(?!struct)(" + DECLTYPE_AUTO_RE + "|" + regex.optional(NAMESPACE_RE) + "[a-zA-Z_]\\w*" + regex.optional(TEMPLATE_ARGUMENT_RE) + ")"; + const CPP_PRIMITIVE_TYPES = { + className: "type", + begin: "\\b[a-z\\d_]*_t\\b" + }; + const CHARACTER_ESCAPES = "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"; + const STRINGS = { + className: "string", + variants: [ + { + begin: '(u8?|U|L)?"', + end: '"', + illegal: "\\n", + contains: [hljs.BACKSLASH_ESCAPE] + }, + { + begin: "(u8?|U|L)?'(" + CHARACTER_ESCAPES + "|.)", + end: "'", + illegal: "." + }, + hljs.END_SAME_AS_BEGIN({ + begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, + end: /\)([^()\\ ]{0,16})"/ + }) + ] + }; + const NUMBERS = { + className: "number", + variants: [ + { begin: "\\b(0b[01']+)" }, + { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" }, + { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } + ], + relevance: 0 + }; + const PREPROCESSOR = { + className: "meta", + begin: /#\s*[a-z]+\b/, + end: /$/, + keywords: { keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" }, + contains: [ + { + begin: /\\\n/, + relevance: 0 + }, + hljs.inherit(STRINGS, { className: "string" }), + { + className: "string", + begin: /<.*?>/ + }, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE + ] + }; + const TITLE_MODE2 = { + className: "title", + begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, + relevance: 0 + }; + const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + "\\s*\\("; + const RESERVED_KEYWORDS = [ + "alignas", + "alignof", + "and", + "and_eq", + "asm", + "atomic_cancel", + "atomic_commit", + "atomic_noexcept", + "auto", + "bitand", + "bitor", + "break", + "case", + "catch", + "class", + "co_await", + "co_return", + "co_yield", + "compl", + "concept", + "const_cast|10", + "consteval", + "constexpr", + "constinit", + "continue", + "decltype", + "default", + "delete", + "do", + "dynamic_cast|10", + "else", + "enum", + "explicit", + "export", + "extern", + "false", + "final", + "for", + "friend", + "goto", + "if", + "import", + "inline", + "module", + "mutable", + "namespace", + "new", + "noexcept", + "not", + "not_eq", + "nullptr", + "operator", + "or", + "or_eq", + "override", + "private", + "protected", + "public", + "reflexpr", + "register", + "reinterpret_cast|10", + "requires", + "return", + "sizeof", + "static_assert", + "static_cast|10", + "struct", + "switch", + "synchronized", + "template", + "this", + "thread_local", + "throw", + "transaction_safe", + "transaction_safe_dynamic", + "true", + "try", + "typedef", + "typeid", + "typename", + "union", + "using", + "virtual", + "volatile", + "while", + "xor", + "xor_eq" + ]; + const RESERVED_TYPES = [ + "bool", + "char", + "char16_t", + "char32_t", + "char8_t", + "double", + "float", + "int", + "long", + "short", + "void", + "wchar_t", + "unsigned", + "signed", + "const", + "static" + ]; + const TYPE_HINTS = [ + "any", + "auto_ptr", + "barrier", + "binary_semaphore", + "bitset", + "complex", + "condition_variable", + "condition_variable_any", + "counting_semaphore", + "deque", + "false_type", + "future", + "imaginary", + "initializer_list", + "istringstream", + "jthread", + "latch", + "lock_guard", + "multimap", + "multiset", + "mutex", + "optional", + "ostringstream", + "packaged_task", + "pair", + "promise", + "priority_queue", + "queue", + "recursive_mutex", + "recursive_timed_mutex", + "scoped_lock", + "set", + "shared_future", + "shared_lock", + "shared_mutex", + "shared_timed_mutex", + "shared_ptr", + "stack", + "string_view", + "stringstream", + "timed_mutex", + "thread", + "true_type", + "tuple", + "unique_lock", + "unique_ptr", + "unordered_map", + "unordered_multimap", + "unordered_multiset", + "unordered_set", + "variant", + "vector", + "weak_ptr", + "wstring", + "wstring_view" + ]; + const FUNCTION_HINTS = [ + "abort", + "abs", + "acos", + "apply", + "as_const", + "asin", + "atan", + "atan2", + "calloc", + "ceil", + "cerr", + "cin", + "clog", + "cos", + "cosh", + "cout", + "declval", + "endl", + "exchange", + "exit", + "exp", + "fabs", + "floor", + "fmod", + "forward", + "fprintf", + "fputs", + "free", + "frexp", + "fscanf", + "future", + "invoke", + "isalnum", + "isalpha", + "iscntrl", + "isdigit", + "isgraph", + "islower", + "isprint", + "ispunct", + "isspace", + "isupper", + "isxdigit", + "labs", + "launder", + "ldexp", + "log", + "log10", + "make_pair", + "make_shared", + "make_shared_for_overwrite", + "make_tuple", + "make_unique", + "malloc", + "memchr", + "memcmp", + "memcpy", + "memset", + "modf", + "move", + "pow", + "printf", + "putchar", + "puts", + "realloc", + "scanf", + "sin", + "sinh", + "snprintf", + "sprintf", + "sqrt", + "sscanf", + "std", + "stderr", + "stdin", + "stdout", + "strcat", + "strchr", + "strcmp", + "strcpy", + "strcspn", + "strlen", + "strncat", + "strncmp", + "strncpy", + "strpbrk", + "strrchr", + "strspn", + "strstr", + "swap", + "tan", + "tanh", + "terminate", + "to_underlying", + "tolower", + "toupper", + "vfprintf", + "visit", + "vprintf", + "vsprintf" + ]; + const LITERALS3 = [ + "NULL", + "false", + "nullopt", + "nullptr", + "true" + ]; + const BUILT_IN = ["_Pragma"]; + const CPP_KEYWORDS = { + type: RESERVED_TYPES, + keyword: RESERVED_KEYWORDS, + literal: LITERALS3, + built_in: BUILT_IN, + _type_hints: TYPE_HINTS + }; + const FUNCTION_DISPATCH = { + className: "function.dispatch", + relevance: 0, + keywords: { + // Only for relevance, not highlighting. + _hint: FUNCTION_HINTS + }, + begin: regex.concat( + /\b/, + /(?!decltype)/, + /(?!if)/, + /(?!for)/, + /(?!switch)/, + /(?!while)/, + hljs.IDENT_RE, + regex.lookahead(/(<[^<>]+>|)\s*\(/) + ) + }; + const EXPRESSION_CONTAINS = [ + FUNCTION_DISPATCH, + PREPROCESSOR, + CPP_PRIMITIVE_TYPES, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + NUMBERS, + STRINGS + ]; + const EXPRESSION_CONTEXT = { + // This mode covers expression context where we can't expect a function + // definition and shouldn't highlight anything that looks like one: + // `return some()`, `else if()`, `(x*sum(1, 2))` + variants: [ + { + begin: /=/, + end: /;/ + }, + { + begin: /\(/, + end: /\)/ + }, + { + beginKeywords: "new throw return else", + end: /;/ + } + ], + keywords: CPP_KEYWORDS, + contains: EXPRESSION_CONTAINS.concat([ + { + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + contains: EXPRESSION_CONTAINS.concat(["self"]), + relevance: 0 + } + ]), + relevance: 0 + }; + const FUNCTION_DECLARATION = { + className: "function", + begin: "(" + FUNCTION_TYPE_RE + "[\\*&\\s]+)+" + FUNCTION_TITLE, + returnBegin: true, + end: /[{;=]/, + excludeEnd: true, + keywords: CPP_KEYWORDS, + illegal: /[^\w\s\*&:<>.]/, + contains: [ + { + // to prevent it from being confused as the function title + begin: DECLTYPE_AUTO_RE, + keywords: CPP_KEYWORDS, + relevance: 0 + }, + { + begin: FUNCTION_TITLE, + returnBegin: true, + contains: [TITLE_MODE2], + relevance: 0 + }, + // needed because we do not have look-behind on the below rule + // to prevent it from grabbing the final : in a :: pair + { + begin: /::/, + relevance: 0 + }, + // initializers + { + begin: /:/, + endsWithParent: true, + contains: [ + STRINGS, + NUMBERS + ] + }, + // allow for multiple declarations, e.g.: + // extern void f(int), g(char); + { + relevance: 0, + match: /,/ + }, + { + className: "params", + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + relevance: 0, + contains: [ + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + CPP_PRIMITIVE_TYPES, + // Count matching parentheses. + { + begin: /\(/, + end: /\)/, + keywords: CPP_KEYWORDS, + relevance: 0, + contains: [ + "self", + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + STRINGS, + NUMBERS, + CPP_PRIMITIVE_TYPES + ] + } + ] + }, + CPP_PRIMITIVE_TYPES, + C_LINE_COMMENT_MODE2, + hljs.C_BLOCK_COMMENT_MODE, + PREPROCESSOR + ] + }; + return { + name: "C++", + aliases: [ + "cc", + "c++", + "h++", + "hpp", + "hh", + "hxx", + "cxx" + ], + keywords: CPP_KEYWORDS, + illegal: " rooms (9);` + begin: "\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function)\\s*<(?!<)", + end: ">", + keywords: CPP_KEYWORDS, + contains: [ + "self", + CPP_PRIMITIVE_TYPES + ] + }, + { + begin: hljs.IDENT_RE + "::", + keywords: CPP_KEYWORDS + }, + { + match: [ + // extra complexity to deal with `enum class` and `enum struct` + /\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/, + /\s+/, + /\w+/ + ], + className: { + 1: "keyword", + 3: "title.class" + } + } + ] + ) + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/csharp.js +function csharp(hljs) { + const BUILT_IN_KEYWORDS = [ + "bool", + "byte", + "char", + "decimal", + "delegate", + "double", + "dynamic", + "enum", + "float", + "int", + "long", + "nint", + "nuint", + "object", + "sbyte", + "short", + "string", + "ulong", + "uint", + "ushort" + ]; + const FUNCTION_MODIFIERS = [ + "public", + "private", + "protected", + "static", + "internal", + "protected", + "abstract", + "async", + "extern", + "override", + "unsafe", + "virtual", + "new", + "sealed", + "partial" + ]; + const LITERAL_KEYWORDS = [ + "default", + "false", + "null", + "true" + ]; + const NORMAL_KEYWORDS = [ + "abstract", + "as", + "base", + "break", + "case", + "catch", + "class", + "const", + "continue", + "do", + "else", + "event", + "explicit", + "extern", + "finally", + "fixed", + "for", + "foreach", + "goto", + "if", + "implicit", + "in", + "interface", + "internal", + "is", + "lock", + "namespace", + "new", + "operator", + "out", + "override", + "params", + "private", + "protected", + "public", + "readonly", + "record", + "ref", + "return", + "scoped", + "sealed", + "sizeof", + "stackalloc", + "static", + "struct", + "switch", + "this", + "throw", + "try", + "typeof", + "unchecked", + "unsafe", + "using", + "virtual", + "void", + "volatile", + "while" + ]; + const CONTEXTUAL_KEYWORDS = [ + "add", + "alias", + "and", + "ascending", + "async", + "await", + "by", + "descending", + "equals", + "from", + "get", + "global", + "group", + "init", + "into", + "join", + "let", + "nameof", + "not", + "notnull", + "on", + "or", + "orderby", + "partial", + "remove", + "select", + "set", + "unmanaged", + "value|0", + "var", + "when", + "where", + "with", + "yield" + ]; + const KEYWORDS3 = { + keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS), + built_in: BUILT_IN_KEYWORDS, + literal: LITERAL_KEYWORDS + }; + const TITLE_MODE2 = hljs.inherit(hljs.TITLE_MODE, { begin: "[a-zA-Z](\\.?\\w)*" }); + const NUMBERS = { + className: "number", + variants: [ + { begin: "\\b(0b[01']+)" }, + { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)" }, + { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } + ], + relevance: 0 + }; + const VERBATIM_STRING = { + className: "string", + begin: '@"', + end: '"', + contains: [{ begin: '""' }] + }; + const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\n/ }); + const SUBST = { + className: "subst", + begin: /\{/, + end: /\}/, + keywords: KEYWORDS3 + }; + const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\n/ }); + const INTERPOLATED_STRING = { + className: "string", + begin: /\$"/, + end: '"', + illegal: /\n/, + contains: [ + { begin: /\{\{/ }, + { begin: /\}\}/ }, + hljs.BACKSLASH_ESCAPE, + SUBST_NO_LF + ] + }; + const INTERPOLATED_VERBATIM_STRING = { + className: "string", + begin: /\$@"/, + end: '"', + contains: [ + { begin: /\{\{/ }, + { begin: /\}\}/ }, + { begin: '""' }, + SUBST + ] + }; + const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, { + illegal: /\n/, + contains: [ + { begin: /\{\{/ }, + { begin: /\}\}/ }, + { begin: '""' }, + SUBST_NO_LF + ] + }); + SUBST.contains = [ + INTERPOLATED_VERBATIM_STRING, + INTERPOLATED_STRING, + VERBATIM_STRING, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + NUMBERS, + hljs.C_BLOCK_COMMENT_MODE + ]; + SUBST_NO_LF.contains = [ + INTERPOLATED_VERBATIM_STRING_NO_LF, + INTERPOLATED_STRING, + VERBATIM_STRING_NO_LF, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + NUMBERS, + hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\n/ }) + ]; + const STRING = { variants: [ + INTERPOLATED_VERBATIM_STRING, + INTERPOLATED_STRING, + VERBATIM_STRING, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] }; + const GENERIC_MODIFIER = { + begin: "<", + end: ">", + contains: [ + { beginKeywords: "in out" }, + TITLE_MODE2 + ] + }; + const TYPE_IDENT_RE = hljs.IDENT_RE + "(<" + hljs.IDENT_RE + "(\\s*,\\s*" + hljs.IDENT_RE + ")*>)?(\\[\\])?"; + const AT_IDENTIFIER = { + // prevents expressions like `@class` from incorrect flagging + // `class` as a keyword + begin: "@" + hljs.IDENT_RE, + relevance: 0 + }; + return { + name: "C#", + aliases: [ + "cs", + "c#" + ], + keywords: KEYWORDS3, + illegal: /::/, + contains: [ + hljs.COMMENT( + "///", + "$", + { + returnBegin: true, + contains: [ + { + className: "doctag", + variants: [ + { + begin: "///", + relevance: 0 + }, + { begin: "" }, + { + begin: "" + } + ] + } + ] + } + ), + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + { + className: "meta", + begin: "#", + end: "$", + keywords: { keyword: "if else elif endif define undef warning error line region endregion pragma checksum" } + }, + STRING, + NUMBERS, + { + beginKeywords: "class interface", + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:,]/, + contains: [ + { beginKeywords: "where class" }, + TITLE_MODE2, + GENERIC_MODIFIER, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + beginKeywords: "namespace", + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:]/, + contains: [ + TITLE_MODE2, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + beginKeywords: "record", + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:]/, + contains: [ + TITLE_MODE2, + GENERIC_MODIFIER, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + // [Attributes("")] + className: "meta", + begin: "^\\s*\\[(?=[\\w])", + excludeBegin: true, + end: "\\]", + excludeEnd: true, + contains: [ + { + className: "string", + begin: /"/, + end: /"/ + } + ] + }, + { + // Expression keywords prevent 'keyword Name(...)' from being + // recognized as a function definition + beginKeywords: "new return throw await else", + relevance: 0 + }, + { + className: "function", + begin: "(" + TYPE_IDENT_RE + "\\s+)+" + hljs.IDENT_RE + "\\s*(<[^=]+>\\s*)?\\(", + returnBegin: true, + end: /\s*[{;=]/, + excludeEnd: true, + keywords: KEYWORDS3, + contains: [ + // prevents these from being highlighted `title` + { + beginKeywords: FUNCTION_MODIFIERS.join(" "), + relevance: 0 + }, + { + begin: hljs.IDENT_RE + "\\s*(<[^=]+>\\s*)?\\(", + returnBegin: true, + contains: [ + hljs.TITLE_MODE, + GENERIC_MODIFIER + ], + relevance: 0 + }, + { match: /\(\)/ }, + { + className: "params", + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS3, + relevance: 0, + contains: [ + STRING, + NUMBERS, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + AT_IDENTIFIER + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/css.js +var MODES2 = (hljs) => { + return { + IMPORTANT: { + scope: "meta", + begin: "!important" + }, + BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, + HEXCOLOR: { + scope: "number", + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + }, + FUNCTION_DISPATCH: { + className: "built_in", + begin: /[\w-]+(?=\()/ + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: "selector-attr", + begin: /\[/, + end: /\]/, + illegal: "$", + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + CSS_NUMBER_MODE: { + scope: "number", + begin: hljs.NUMBER_RE + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", + relevance: 0 + }, + CSS_VARIABLE: { + className: "attr", + begin: /--[A-Za-z][A-Za-z0-9_-]*/ + } + }; +}; +var TAGS = [ + "a", + "abbr", + "address", + "article", + "aside", + "audio", + "b", + "blockquote", + "body", + "button", + "canvas", + "caption", + "cite", + "code", + "dd", + "del", + "details", + "dfn", + "div", + "dl", + "dt", + "em", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "hgroup", + "html", + "i", + "iframe", + "img", + "input", + "ins", + "kbd", + "label", + "legend", + "li", + "main", + "mark", + "menu", + "nav", + "object", + "ol", + "p", + "q", + "quote", + "samp", + "section", + "span", + "strong", + "summary", + "sup", + "table", + "tbody", + "td", + "textarea", + "tfoot", + "th", + "thead", + "time", + "tr", + "ul", + "var", + "video" +]; +var MEDIA_FEATURES = [ + "any-hover", + "any-pointer", + "aspect-ratio", + "color", + "color-gamut", + "color-index", + "device-aspect-ratio", + "device-height", + "device-width", + "display-mode", + "forced-colors", + "grid", + "height", + "hover", + "inverted-colors", + "monochrome", + "orientation", + "overflow-block", + "overflow-inline", + "pointer", + "prefers-color-scheme", + "prefers-contrast", + "prefers-reduced-motion", + "prefers-reduced-transparency", + "resolution", + "scan", + "scripting", + "update", + "width", + // TODO: find a better solution? + "min-width", + "max-width", + "min-height", + "max-height" +]; +var PSEUDO_CLASSES = [ + "active", + "any-link", + "blank", + "checked", + "current", + "default", + "defined", + "dir", + // dir() + "disabled", + "drop", + "empty", + "enabled", + "first", + "first-child", + "first-of-type", + "fullscreen", + "future", + "focus", + "focus-visible", + "focus-within", + "has", + // has() + "host", + // host or host() + "host-context", + // host-context() + "hover", + "indeterminate", + "in-range", + "invalid", + "is", + // is() + "lang", + // lang() + "last-child", + "last-of-type", + "left", + "link", + "local-link", + "not", + // not() + "nth-child", + // nth-child() + "nth-col", + // nth-col() + "nth-last-child", + // nth-last-child() + "nth-last-col", + // nth-last-col() + "nth-last-of-type", + //nth-last-of-type() + "nth-of-type", + //nth-of-type() + "only-child", + "only-of-type", + "optional", + "out-of-range", + "past", + "placeholder-shown", + "read-only", + "read-write", + "required", + "right", + "root", + "scope", + "target", + "target-within", + "user-invalid", + "valid", + "visited", + "where" + // where() +]; +var PSEUDO_ELEMENTS = [ + "after", + "backdrop", + "before", + "cue", + "cue-region", + "first-letter", + "first-line", + "grammar-error", + "marker", + "part", + "placeholder", + "selection", + "slotted", + "spelling-error" +]; +var ATTRIBUTES = [ + "align-content", + "align-items", + "align-self", + "all", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-repeat", + "background-size", + "block-size", + "border", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "border-block-start-style", + "border-block-start-width", + "border-block-style", + "border-block-width", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-inline", + "border-inline-color", + "border-inline-end", + "border-inline-end-color", + "border-inline-end-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-decoration-break", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columns", + "contain", + "content", + "content-visibility", + "counter-increment", + "counter-reset", + "cue", + "cue-after", + "cue-before", + "cursor", + "direction", + "display", + "empty-cells", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "flow", + "font", + "font-display", + "font-family", + "font-feature-settings", + "font-kerning", + "font-language-override", + "font-size", + "font-size-adjust", + "font-smoothing", + "font-stretch", + "font-style", + "font-synthesis", + "font-variant", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "gap", + "glyph-orientation-vertical", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "hanging-punctuation", + "height", + "hyphens", + "icon", + "image-orientation", + "image-rendering", + "image-resolution", + "ime-mode", + "inline-size", + "isolation", + "justify-content", + "left", + "letter-spacing", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "marks", + "mask", + "mask-border", + "mask-border-mode", + "mask-border-outset", + "mask-border-repeat", + "mask-border-slice", + "mask-border-source", + "mask-border-width", + "mask-clip", + "mask-composite", + "mask-image", + "mask-mode", + "mask-origin", + "mask-position", + "mask-repeat", + "mask-size", + "mask-type", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "mix-blend-mode", + "nav-down", + "nav-index", + "nav-left", + "nav-right", + "nav-up", + "none", + "normal", + "object-fit", + "object-position", + "opacity", + "order", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-wrap", + "overflow-x", + "overflow-y", + "padding", + "padding-block", + "padding-block-end", + "padding-block-start", + "padding-bottom", + "padding-inline", + "padding-inline-end", + "padding-inline-start", + "padding-left", + "padding-right", + "padding-top", + "page-break-after", + "page-break-before", + "page-break-inside", + "pause", + "pause-after", + "pause-before", + "perspective", + "perspective-origin", + "pointer-events", + "position", + "quotes", + "resize", + "rest", + "rest-after", + "rest-before", + "right", + "row-gap", + "scroll-margin", + "scroll-margin-block", + "scroll-margin-block-end", + "scroll-margin-block-start", + "scroll-margin-bottom", + "scroll-margin-inline", + "scroll-margin-inline-end", + "scroll-margin-inline-start", + "scroll-margin-left", + "scroll-margin-right", + "scroll-margin-top", + "scroll-padding", + "scroll-padding-block", + "scroll-padding-block-end", + "scroll-padding-block-start", + "scroll-padding-bottom", + "scroll-padding-inline", + "scroll-padding-inline-end", + "scroll-padding-inline-start", + "scroll-padding-left", + "scroll-padding-right", + "scroll-padding-top", + "scroll-snap-align", + "scroll-snap-stop", + "scroll-snap-type", + "scrollbar-color", + "scrollbar-gutter", + "scrollbar-width", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "speak", + "speak-as", + "src", + // @font-face + "tab-size", + "table-layout", + "text-align", + "text-align-all", + "text-align-last", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-style", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-indent", + "text-justify", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-transform", + "text-underline-position", + "top", + "transform", + "transform-box", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "unicode-bidi", + "vertical-align", + "visibility", + "voice-balance", + "voice-duration", + "voice-family", + "voice-pitch", + "voice-range", + "voice-rate", + "voice-stress", + "voice-volume", + "white-space", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "z-index" + // reverse makes sure longer attributes `font-weight` are matched fully + // instead of getting false positives on say `font` +].reverse(); +function css(hljs) { + const regex = hljs.regex; + const modes = MODES2(hljs); + const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ }; + const AT_MODIFIERS = "and or not only"; + const AT_PROPERTY_RE = /@-?\w[\w]*(-\w+)*/; + const IDENT_RE4 = "[a-zA-Z-][a-zA-Z0-9_-]*"; + const STRINGS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ]; + return { + name: "CSS", + case_insensitive: true, + illegal: /[=|'\$]/, + keywords: { keyframePosition: "from to" }, + classNameAliases: { + // for visual continuity with `tag {}` and because we + // don't have a great class for this? + keyframePosition: "selector-tag" + }, + contains: [ + modes.BLOCK_COMMENT, + VENDOR_PREFIX, + // to recognize keyframe 40% etc which are outside the scope of our + // attribute value mode + modes.CSS_NUMBER_MODE, + { + className: "selector-id", + begin: /#[A-Za-z0-9_-]+/, + relevance: 0 + }, + { + className: "selector-class", + begin: "\\." + IDENT_RE4, + relevance: 0 + }, + modes.ATTRIBUTE_SELECTOR_MODE, + { + className: "selector-pseudo", + variants: [ + { begin: ":(" + PSEUDO_CLASSES.join("|") + ")" }, + { begin: ":(:)?(" + PSEUDO_ELEMENTS.join("|") + ")" } + ] + }, + // we may actually need this (12/2020) + // { // pseudo-selector params + // begin: /\(/, + // end: /\)/, + // contains: [ hljs.CSS_NUMBER_MODE ] + // }, + modes.CSS_VARIABLE, + { + className: "attribute", + begin: "\\b(" + ATTRIBUTES.join("|") + ")\\b" + }, + // attribute values + { + begin: /:/, + end: /[;}{]/, + contains: [ + modes.BLOCK_COMMENT, + modes.HEXCOLOR, + modes.IMPORTANT, + modes.CSS_NUMBER_MODE, + ...STRINGS, + // needed to highlight these as strings and to avoid issues with + // illegal characters that might be inside urls that would tigger the + // languages illegal stack + { + begin: /(url|data-uri)\(/, + end: /\)/, + relevance: 0, + // from keywords + keywords: { built_in: "url data-uri" }, + contains: [ + ...STRINGS, + { + className: "string", + // any character other than `)` as in `url()` will be the start + // of a string, which ends with `)` (from the parent mode) + begin: /[^)]/, + endsWithParent: true, + excludeEnd: true + } + ] + }, + modes.FUNCTION_DISPATCH + ] + }, + { + begin: regex.lookahead(/@/), + end: "[{;]", + relevance: 0, + illegal: /:/, + // break on Less variables @var: ... + contains: [ + { + className: "keyword", + begin: AT_PROPERTY_RE + }, + { + begin: /\s/, + endsWithParent: true, + excludeEnd: true, + relevance: 0, + keywords: { + $pattern: /[a-z-]+/, + keyword: AT_MODIFIERS, + attribute: MEDIA_FEATURES.join(" ") + }, + contains: [ + { + begin: /[a-z-]+(?=:)/, + className: "attribute" + }, + ...STRINGS, + modes.CSS_NUMBER_MODE + ] + } + ] + }, + { + className: "selector-tag", + begin: "\\b(" + TAGS.join("|") + ")\\b" + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/diff.js +function diff(hljs) { + const regex = hljs.regex; + return { + name: "Diff", + aliases: ["patch"], + contains: [ + { + className: "meta", + relevance: 10, + match: regex.either( + /^@@ +-\d+,\d+ +\+\d+,\d+ +@@/, + /^\*\*\* +\d+,\d+ +\*\*\*\*$/, + /^--- +\d+,\d+ +----$/ + ) + }, + { + className: "comment", + variants: [ + { + begin: regex.either( + /Index: /, + /^index/, + /={3,}/, + /^-{3}/, + /^\*{3} /, + /^\+{3}/, + /^diff --git/ + ), + end: /$/ + }, + { match: /^\*{15}$/ } + ] + }, + { + className: "addition", + begin: /^\+/, + end: /$/ + }, + { + className: "deletion", + begin: /^-/, + end: /$/ + }, + { + className: "addition", + begin: /^!/, + end: /$/ + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/go.js +function go(hljs) { + const LITERALS3 = [ + "true", + "false", + "iota", + "nil" + ]; + const BUILT_INS3 = [ + "append", + "cap", + "close", + "complex", + "copy", + "imag", + "len", + "make", + "new", + "panic", + "print", + "println", + "real", + "recover", + "delete" + ]; + const TYPES3 = [ + "bool", + "byte", + "complex64", + "complex128", + "error", + "float32", + "float64", + "int8", + "int16", + "int32", + "int64", + "string", + "uint8", + "uint16", + "uint32", + "uint64", + "int", + "uint", + "uintptr", + "rune" + ]; + const KWS = [ + "break", + "case", + "chan", + "const", + "continue", + "default", + "defer", + "else", + "fallthrough", + "for", + "func", + "go", + "goto", + "if", + "import", + "interface", + "map", + "package", + "range", + "return", + "select", + "struct", + "switch", + "type", + "var" + ]; + const KEYWORDS3 = { + keyword: KWS, + type: TYPES3, + literal: LITERALS3, + built_in: BUILT_INS3 + }; + return { + name: "Go", + aliases: ["golang"], + keywords: KEYWORDS3, + illegal: " { + return recurRegex(re, substitution, depth - 1); + }); +} +function java(hljs) { + const regex = hljs.regex; + const JAVA_IDENT_RE = "[\xC0-\u02B8a-zA-Z_$][\xC0-\u02B8a-zA-Z_$0-9]*"; + const GENERIC_IDENT_RE = JAVA_IDENT_RE + recurRegex("(?:<" + JAVA_IDENT_RE + "~~~(?:\\s*,\\s*" + JAVA_IDENT_RE + "~~~)*>)?", /~~~/g, 2); + const MAIN_KEYWORDS = [ + "synchronized", + "abstract", + "private", + "var", + "static", + "if", + "const ", + "for", + "while", + "strictfp", + "finally", + "protected", + "import", + "native", + "final", + "void", + "enum", + "else", + "break", + "transient", + "catch", + "instanceof", + "volatile", + "case", + "assert", + "package", + "default", + "public", + "try", + "switch", + "continue", + "throws", + "protected", + "public", + "private", + "module", + "requires", + "exports", + "do", + "sealed", + "yield", + "permits" + ]; + const BUILT_INS3 = [ + "super", + "this" + ]; + const LITERALS3 = [ + "false", + "true", + "null" + ]; + const TYPES3 = [ + "char", + "boolean", + "long", + "float", + "int", + "byte", + "short", + "double" + ]; + const KEYWORDS3 = { + keyword: MAIN_KEYWORDS, + literal: LITERALS3, + type: TYPES3, + built_in: BUILT_INS3 + }; + const ANNOTATION = { + className: "meta", + begin: "@" + JAVA_IDENT_RE, + contains: [ + { + begin: /\(/, + end: /\)/, + contains: ["self"] + // allow nested () inside our annotation + } + ] + }; + const PARAMS = { + className: "params", + begin: /\(/, + end: /\)/, + keywords: KEYWORDS3, + relevance: 0, + contains: [hljs.C_BLOCK_COMMENT_MODE], + endsParent: true + }; + return { + name: "Java", + aliases: ["jsp"], + keywords: KEYWORDS3, + illegal: /<\/|#/, + contains: [ + hljs.COMMENT( + "/\\*\\*", + "\\*/", + { + relevance: 0, + contains: [ + { + // eat up @'s in emails to prevent them to be recognized as doctags + begin: /\w+@/, + relevance: 0 + }, + { + className: "doctag", + begin: "@[A-Za-z]+" + } + ] + } + ), + // relevance boost + { + begin: /import java\.[a-z]+\./, + keywords: "import", + relevance: 2 + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + { + begin: /"""/, + end: /"""/, + className: "string", + contains: [hljs.BACKSLASH_ESCAPE] + }, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + { + match: [ + /\b(?:class|interface|enum|extends|implements|new)/, + /\s+/, + JAVA_IDENT_RE + ], + className: { + 1: "keyword", + 3: "title.class" + } + }, + { + // Exceptions for hyphenated keywords + match: /non-sealed/, + scope: "keyword" + }, + { + begin: [ + regex.concat(/(?!else)/, JAVA_IDENT_RE), + /\s+/, + JAVA_IDENT_RE, + /\s+/, + /=(?!=)/ + ], + className: { + 1: "type", + 3: "variable", + 5: "operator" + } + }, + { + begin: [ + /record/, + /\s+/, + JAVA_IDENT_RE + ], + className: { + 1: "keyword", + 3: "title.class" + }, + contains: [ + PARAMS, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + // Expression keywords prevent 'keyword Name(...)' from being + // recognized as a function definition + beginKeywords: "new throw return else", + relevance: 0 + }, + { + begin: [ + "(?:" + GENERIC_IDENT_RE + "\\s+)", + hljs.UNDERSCORE_IDENT_RE, + /\s*(?=\()/ + ], + className: { 2: "title.function" }, + keywords: KEYWORDS3, + contains: [ + { + className: "params", + begin: /\(/, + end: /\)/, + keywords: KEYWORDS3, + relevance: 0, + contains: [ + ANNOTATION, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + NUMERIC, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + NUMERIC, + ANNOTATION + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/javascript.js +var IDENT_RE2 = "[A-Za-z$_][0-9A-Za-z$_]*"; +var KEYWORDS = [ + "as", + // for exports + "in", + "of", + "if", + "for", + "while", + "finally", + "var", + "new", + "function", + "do", + "return", + "void", + "else", + "break", + "catch", + "instanceof", + "with", + "throw", + "case", + "default", + "try", + "switch", + "continue", + "typeof", + "delete", + "let", + "yield", + "const", + "class", + // JS handles these with a special rule + // "get", + // "set", + "debugger", + "async", + "await", + "static", + "import", + "from", + "export", + "extends" +]; +var LITERALS = [ + "true", + "false", + "null", + "undefined", + "NaN", + "Infinity" +]; +var TYPES = [ + // Fundamental objects + "Object", + "Function", + "Boolean", + "Symbol", + // numbers and dates + "Math", + "Date", + "Number", + "BigInt", + // text + "String", + "RegExp", + // Indexed collections + "Array", + "Float32Array", + "Float64Array", + "Int8Array", + "Uint8Array", + "Uint8ClampedArray", + "Int16Array", + "Int32Array", + "Uint16Array", + "Uint32Array", + "BigInt64Array", + "BigUint64Array", + // Keyed collections + "Set", + "Map", + "WeakSet", + "WeakMap", + // Structured data + "ArrayBuffer", + "SharedArrayBuffer", + "Atomics", + "DataView", + "JSON", + // Control abstraction objects + "Promise", + "Generator", + "GeneratorFunction", + "AsyncFunction", + // Reflection + "Reflect", + "Proxy", + // Internationalization + "Intl", + // WebAssembly + "WebAssembly" +]; +var ERROR_TYPES = [ + "Error", + "EvalError", + "InternalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" +]; +var BUILT_IN_GLOBALS = [ + "setInterval", + "setTimeout", + "clearInterval", + "clearTimeout", + "require", + "exports", + "eval", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "decodeURI", + "decodeURIComponent", + "encodeURI", + "encodeURIComponent", + "escape", + "unescape" +]; +var BUILT_IN_VARIABLES = [ + "arguments", + "this", + "super", + "console", + "window", + "document", + "localStorage", + "sessionStorage", + "module", + "global" + // Node.js +]; +var BUILT_INS = [].concat( + BUILT_IN_GLOBALS, + TYPES, + ERROR_TYPES +); +function javascript(hljs) { + const regex = hljs.regex; + const hasClosingTag = (match, { after }) => { + const tag = "", + end: "" + }; + const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/; + const XML_TAG = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/, + /** + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + isTrulyOpeningTag: (match, response) => { + const afterMatchIndex = match[0].length + match.index; + const nextChar = match.input[afterMatchIndex]; + if ( + // HTML should not include another raw `<` inside a tag + // nested type? + // `>`, etc. + nextChar === "<" || // the , gives away that this is not HTML + // `` + nextChar === "," + ) { + response.ignoreMatch(); + return; + } + if (nextChar === ">") { + if (!hasClosingTag(match, { after: afterMatchIndex })) { + response.ignoreMatch(); + } + } + let m; + const afterMatch = match.input.substring(afterMatchIndex); + if (m = afterMatch.match(/^\s*=/)) { + response.ignoreMatch(); + return; + } + if (m = afterMatch.match(/^\s+extends\s+/)) { + if (m.index === 0) { + response.ignoreMatch(); + return; + } + } + } + }; + const KEYWORDS$1 = { + $pattern: IDENT_RE2, + keyword: KEYWORDS, + literal: LITERALS, + built_in: BUILT_INS, + "variable.language": BUILT_IN_VARIABLES + }; + const decimalDigits3 = "[0-9](_?[0-9])*"; + const frac3 = `\\.(${decimalDigits3})`; + const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; + const NUMBER = { + className: "number", + variants: [ + // DecimalLiteral + { begin: `(\\b(${decimalInteger})((${frac3})|\\.)?|(${frac3}))[eE][+-]?(${decimalDigits3})\\b` }, + { begin: `\\b(${decimalInteger})\\b((${frac3})\\b|\\.)?|(${frac3})\\b` }, + // DecimalBigIntegerLiteral + { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, + // NonDecimalIntegerLiteral + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, + // LegacyOctalIntegerLiteral (does not include underscore separators) + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + { begin: "\\b0[0-7]+n?\\b" } + ], + relevance: 0 + }; + const SUBST = { + className: "subst", + begin: "\\$\\{", + end: "\\}", + keywords: KEYWORDS$1, + contains: [] + // defined later + }; + const HTML_TEMPLATE = { + begin: "html`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: "xml" + } + }; + const CSS_TEMPLATE = { + begin: "css`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: "css" + } + }; + const GRAPHQL_TEMPLATE = { + begin: "gql`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: "graphql" + } + }; + const TEMPLATE_STRING = { + className: "string", + begin: "`", + end: "`", + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ] + }; + const JSDOC_COMMENT = hljs.COMMENT( + /\/\*\*(?!\/)/, + "\\*/", + { + relevance: 0, + contains: [ + { + begin: "(?=@[A-Za-z]+)", + relevance: 0, + contains: [ + { + className: "doctag", + begin: "@[A-Za-z]+" + }, + { + className: "type", + begin: "\\{", + end: "\\}", + excludeEnd: true, + excludeBegin: true, + relevance: 0 + }, + { + className: "variable", + begin: IDENT_RE$1 + "(?=\\s*(-)|$)", + endsParent: true, + relevance: 0 + }, + // eat spaces (not newlines) so we can find + // types or variables + { + begin: /(?=[^\n])\s/, + relevance: 0 + } + ] + } + ] + } + ); + const COMMENT2 = { + className: "comment", + variants: [ + JSDOC_COMMENT, + hljs.C_BLOCK_COMMENT_MODE, + hljs.C_LINE_COMMENT_MODE + ] + }; + const SUBST_INTERNALS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER + // This is intentional: + // See https://github.com/highlightjs/highlight.js/issues/3288 + // hljs.REGEXP_MODE + ]; + SUBST.contains = SUBST_INTERNALS.concat({ + // we need to pair up {} inside our subst to prevent + // it from ending too early by matching another } + begin: /\{/, + end: /\}/, + keywords: KEYWORDS$1, + contains: [ + "self" + ].concat(SUBST_INTERNALS) + }); + const SUBST_AND_COMMENTS = [].concat(COMMENT2, SUBST.contains); + const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ + // eat recursive parens in sub expressions + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS$1, + contains: ["self"].concat(SUBST_AND_COMMENTS) + } + ]); + const PARAMS = { + className: "params", + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + }; + const CLASS_OR_EXTENDS = { + variants: [ + // class Car extends vehicle + { + match: [ + /class/, + /\s+/, + IDENT_RE$1, + /\s+/, + /extends/, + /\s+/, + regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*") + ], + scope: { + 1: "keyword", + 3: "title.class", + 5: "keyword", + 7: "title.class.inherited" + } + }, + // class Car + { + match: [ + /class/, + /\s+/, + IDENT_RE$1 + ], + scope: { + 1: "keyword", + 3: "title.class" + } + } + ] + }; + const CLASS_REFERENCE = { + relevance: 0, + match: regex.either( + // Hard coded exceptions + /\bJSON/, + // Float32Array, OutT + /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, + // CSSFactory, CSSFactoryT + /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, + // FPs, FPsT + /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/ + // P + // single letters are not highlighted + // BLAH + // this will be flagged as a UPPER_CASE_CONSTANT instead + ), + className: "title.class", + keywords: { + _: [ + // se we still get relevance credit for JS library classes + ...TYPES, + ...ERROR_TYPES + ] + } + }; + const USE_STRICT = { + label: "use_strict", + className: "meta", + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/ + }; + const FUNCTION_DEFINITION = { + variants: [ + { + match: [ + /function/, + /\s+/, + IDENT_RE$1, + /(?=\s*\()/ + ] + }, + // anonymous function + { + match: [ + /function/, + /\s*(?=\()/ + ] + } + ], + className: { + 1: "keyword", + 3: "title.function" + }, + label: "func.def", + contains: [PARAMS], + illegal: /%/ + }; + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }; + function noneOf(list) { + return regex.concat("(?!", list.join("|"), ")"); + } + const FUNCTION_CALL = { + match: regex.concat( + /\b/, + noneOf([ + ...BUILT_IN_GLOBALS, + "super", + "import" + ]), + IDENT_RE$1, + regex.lookahead(/\(/) + ), + className: "title.function", + relevance: 0 + }; + const PROPERTY_ACCESS = { + begin: regex.concat(/\./, regex.lookahead( + regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/) + )), + end: IDENT_RE$1, + excludeBegin: true, + keywords: "prototype", + className: "property", + relevance: 0 + }; + const GETTER_OR_SETTER = { + match: [ + /get|set/, + /\s+/, + IDENT_RE$1, + /(?=\()/ + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + { + // eat to avoid empty params + begin: /\(\)/ + }, + PARAMS + ] + }; + const FUNC_LEAD_IN_RE = "(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|" + hljs.UNDERSCORE_IDENT_RE + ")\\s*=>"; + const FUNCTION_VARIABLE = { + match: [ + /const|var|let/, + /\s+/, + IDENT_RE$1, + /\s*/, + /=\s*/, + /(async\s*)?/, + // async is optional + regex.lookahead(FUNC_LEAD_IN_RE) + ], + keywords: "async", + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + PARAMS + ] + }; + return { + name: "JavaScript", + aliases: ["js", "jsx", "mjs", "cjs"], + keywords: KEYWORDS$1, + // this will be extended by TypeScript + exports: { PARAMS_CONTAINS, CLASS_REFERENCE }, + illegal: /#(?![$_A-z])/, + contains: [ + hljs.SHEBANG({ + label: "shebang", + binary: "node", + relevance: 5 + }), + USE_STRICT, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + COMMENT2, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + CLASS_REFERENCE, + { + className: "attr", + begin: IDENT_RE$1 + regex.lookahead(":"), + relevance: 0 + }, + FUNCTION_VARIABLE, + { + // "value" container + begin: "(" + hljs.RE_STARTERS_RE + "|\\b(case|return|throw)\\b)\\s*", + keywords: "return throw case", + relevance: 0, + contains: [ + COMMENT2, + hljs.REGEXP_MODE, + { + className: "function", + // we have to count the parens to make sure we actually have the + // correct bounding ( ) before the =>. There could be any number of + // sub-expressions inside also surrounded by parens. + begin: FUNC_LEAD_IN_RE, + returnBegin: true, + end: "\\s*=>", + contains: [ + { + className: "params", + variants: [ + { + begin: hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + }, + { + className: null, + begin: /\(\s*\)/, + skip: true + }, + { + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + } + ] + } + ] + }, + { + // could be a comma delimited list of params to a function call + begin: /,/, + relevance: 0 + }, + { + match: /\s+/, + relevance: 0 + }, + { + // JSX + variants: [ + { begin: FRAGMENT.begin, end: FRAGMENT.end }, + { match: XML_SELF_CLOSING }, + { + begin: XML_TAG.begin, + // we carefully check the opening tag to see if it truly + // is a tag and not a false positive + "on:begin": XML_TAG.isTrulyOpeningTag, + end: XML_TAG.end + } + ], + subLanguage: "xml", + contains: [ + { + begin: XML_TAG.begin, + end: XML_TAG.end, + skip: true, + contains: ["self"] + } + ] + } + ] + }, + FUNCTION_DEFINITION, + { + // prevent this from getting swallowed up by function + // since they appear "function like" + beginKeywords: "while if switch catch for" + }, + { + // we have to count the parens to make sure we actually have the correct + // bounding ( ). There could be any number of sub-expressions inside + // also surrounded by parens. + begin: "\\b(?!function)" + hljs.UNDERSCORE_IDENT_RE + "\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", + // end parens + returnBegin: true, + label: "func.def", + contains: [ + PARAMS, + hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" }) + ] + }, + // catch ... so it won't trigger the property rule below + { + match: /\.\.\./, + relevance: 0 + }, + PROPERTY_ACCESS, + // hack: prevents detection of keywords in some circumstances + // .keyword() + // $keyword = x + { + match: "\\$" + IDENT_RE$1, + relevance: 0 + }, + { + match: [/\bconstructor(?=\s*\()/], + className: { 1: "title.function" }, + contains: [PARAMS] + }, + FUNCTION_CALL, + UPPER_CASE_CONSTANT, + CLASS_OR_EXTENDS, + GETTER_OR_SETTER, + { + match: /\$[(.]/ + // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/json.js +function json(hljs) { + const ATTRIBUTE = { + className: "attr", + begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/, + relevance: 1.01 + }; + const PUNCTUATION = { + match: /[{}[\],:]/, + className: "punctuation", + relevance: 0 + }; + const LITERALS3 = [ + "true", + "false", + "null" + ]; + const LITERALS_MODE = { + scope: "literal", + beginKeywords: LITERALS3.join(" ") + }; + return { + name: "JSON", + keywords: { + literal: LITERALS3 + }, + contains: [ + ATTRIBUTE, + PUNCTUATION, + hljs.QUOTE_STRING_MODE, + LITERALS_MODE, + hljs.C_NUMBER_MODE, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ], + illegal: "\\S" + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/kotlin.js +var decimalDigits2 = "[0-9](_*[0-9])*"; +var frac2 = `\\.(${decimalDigits2})`; +var hexDigits2 = "[0-9a-fA-F](_*[0-9a-fA-F])*"; +var NUMERIC2 = { + className: "number", + variants: [ + // DecimalFloatingPointLiteral + // including ExponentPart + { begin: `(\\b(${decimalDigits2})((${frac2})|\\.)?|(${frac2}))[eE][+-]?(${decimalDigits2})[fFdD]?\\b` }, + // excluding ExponentPart + { begin: `\\b(${decimalDigits2})((${frac2})[fFdD]?\\b|\\.([fFdD]\\b)?)` }, + { begin: `(${frac2})[fFdD]?\\b` }, + { begin: `\\b(${decimalDigits2})[fFdD]\\b` }, + // HexadecimalFloatingPointLiteral + { begin: `\\b0[xX]((${hexDigits2})\\.?|(${hexDigits2})?\\.(${hexDigits2}))[pP][+-]?(${decimalDigits2})[fFdD]?\\b` }, + // DecimalIntegerLiteral + { begin: "\\b(0|[1-9](_*[0-9])*)[lL]?\\b" }, + // HexIntegerLiteral + { begin: `\\b0[xX](${hexDigits2})[lL]?\\b` }, + // OctalIntegerLiteral + { begin: "\\b0(_*[0-7])*[lL]?\\b" }, + // BinaryIntegerLiteral + { begin: "\\b0[bB][01](_*[01])*[lL]?\\b" } + ], + relevance: 0 +}; +function kotlin(hljs) { + const KEYWORDS3 = { + keyword: "abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", + built_in: "Byte Short Char Int Long Boolean Float Double Void Unit Nothing", + literal: "true false null" + }; + const KEYWORDS_WITH_LABEL = { + className: "keyword", + begin: /\b(break|continue|return|this)\b/, + starts: { contains: [ + { + className: "symbol", + begin: /@\w+/ + } + ] } + }; + const LABEL = { + className: "symbol", + begin: hljs.UNDERSCORE_IDENT_RE + "@" + }; + const SUBST = { + className: "subst", + begin: /\$\{/, + end: /\}/, + contains: [hljs.C_NUMBER_MODE] + }; + const VARIABLE = { + className: "variable", + begin: "\\$" + hljs.UNDERSCORE_IDENT_RE + }; + const STRING = { + className: "string", + variants: [ + { + begin: '"""', + end: '"""(?=[^"])', + contains: [ + VARIABLE, + SUBST + ] + }, + // Can't use built-in modes easily, as we want to use STRING in the meta + // context as 'meta-string' and there's no syntax to remove explicitly set + // classNames in built-in modes. + { + begin: "'", + end: "'", + illegal: /\n/, + contains: [hljs.BACKSLASH_ESCAPE] + }, + { + begin: '"', + end: '"', + illegal: /\n/, + contains: [ + hljs.BACKSLASH_ESCAPE, + VARIABLE, + SUBST + ] + } + ] + }; + SUBST.contains.push(STRING); + const ANNOTATION_USE_SITE = { + className: "meta", + begin: "@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*" + hljs.UNDERSCORE_IDENT_RE + ")?" + }; + const ANNOTATION = { + className: "meta", + begin: "@" + hljs.UNDERSCORE_IDENT_RE, + contains: [ + { + begin: /\(/, + end: /\)/, + contains: [ + hljs.inherit(STRING, { className: "string" }), + "self" + ] + } + ] + }; + const KOTLIN_NUMBER_MODE = NUMERIC2; + const KOTLIN_NESTED_COMMENT = hljs.COMMENT( + "/\\*", + "\\*/", + { contains: [hljs.C_BLOCK_COMMENT_MODE] } + ); + const KOTLIN_PAREN_TYPE = { variants: [ + { + className: "type", + begin: hljs.UNDERSCORE_IDENT_RE + }, + { + begin: /\(/, + end: /\)/, + contains: [] + // defined later + } + ] }; + const KOTLIN_PAREN_TYPE2 = KOTLIN_PAREN_TYPE; + KOTLIN_PAREN_TYPE2.variants[1].contains = [KOTLIN_PAREN_TYPE]; + KOTLIN_PAREN_TYPE.variants[1].contains = [KOTLIN_PAREN_TYPE2]; + return { + name: "Kotlin", + aliases: [ + "kt", + "kts" + ], + keywords: KEYWORDS3, + contains: [ + hljs.COMMENT( + "/\\*\\*", + "\\*/", + { + relevance: 0, + contains: [ + { + className: "doctag", + begin: "@[A-Za-z]+" + } + ] + } + ), + hljs.C_LINE_COMMENT_MODE, + KOTLIN_NESTED_COMMENT, + KEYWORDS_WITH_LABEL, + LABEL, + ANNOTATION_USE_SITE, + ANNOTATION, + { + className: "function", + beginKeywords: "fun", + end: "[(]|$", + returnBegin: true, + excludeEnd: true, + keywords: KEYWORDS3, + relevance: 5, + contains: [ + { + begin: hljs.UNDERSCORE_IDENT_RE + "\\s*\\(", + returnBegin: true, + relevance: 0, + contains: [hljs.UNDERSCORE_TITLE_MODE] + }, + { + className: "type", + begin: //, + keywords: "reified", + relevance: 0 + }, + { + className: "params", + begin: /\(/, + end: /\)/, + endsParent: true, + keywords: KEYWORDS3, + relevance: 0, + contains: [ + { + begin: /:/, + end: /[=,\/]/, + endsWithParent: true, + contains: [ + KOTLIN_PAREN_TYPE, + hljs.C_LINE_COMMENT_MODE, + KOTLIN_NESTED_COMMENT + ], + relevance: 0 + }, + hljs.C_LINE_COMMENT_MODE, + KOTLIN_NESTED_COMMENT, + ANNOTATION_USE_SITE, + ANNOTATION, + STRING, + hljs.C_NUMBER_MODE + ] + }, + KOTLIN_NESTED_COMMENT + ] + }, + { + begin: [ + /class|interface|trait/, + /\s+/, + hljs.UNDERSCORE_IDENT_RE + ], + beginScope: { + 3: "title.class" + }, + keywords: "class interface trait", + end: /[:\{(]|$/, + excludeEnd: true, + illegal: "extends implements", + contains: [ + { beginKeywords: "public protected internal private constructor" }, + hljs.UNDERSCORE_TITLE_MODE, + { + className: "type", + begin: //, + excludeBegin: true, + excludeEnd: true, + relevance: 0 + }, + { + className: "type", + begin: /[,:]\s*/, + end: /[<\(,){\s]|$/, + excludeBegin: true, + returnEnd: true + }, + ANNOTATION_USE_SITE, + ANNOTATION + ] + }, + STRING, + { + className: "meta", + begin: "^#!/usr/bin/env", + end: "$", + illegal: "\n" + }, + KOTLIN_NUMBER_MODE + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/less.js +var MODES3 = (hljs) => { + return { + IMPORTANT: { + scope: "meta", + begin: "!important" + }, + BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, + HEXCOLOR: { + scope: "number", + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + }, + FUNCTION_DISPATCH: { + className: "built_in", + begin: /[\w-]+(?=\()/ + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: "selector-attr", + begin: /\[/, + end: /\]/, + illegal: "$", + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + CSS_NUMBER_MODE: { + scope: "number", + begin: hljs.NUMBER_RE + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", + relevance: 0 + }, + CSS_VARIABLE: { + className: "attr", + begin: /--[A-Za-z][A-Za-z0-9_-]*/ + } + }; +}; +var TAGS2 = [ + "a", + "abbr", + "address", + "article", + "aside", + "audio", + "b", + "blockquote", + "body", + "button", + "canvas", + "caption", + "cite", + "code", + "dd", + "del", + "details", + "dfn", + "div", + "dl", + "dt", + "em", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "hgroup", + "html", + "i", + "iframe", + "img", + "input", + "ins", + "kbd", + "label", + "legend", + "li", + "main", + "mark", + "menu", + "nav", + "object", + "ol", + "p", + "q", + "quote", + "samp", + "section", + "span", + "strong", + "summary", + "sup", + "table", + "tbody", + "td", + "textarea", + "tfoot", + "th", + "thead", + "time", + "tr", + "ul", + "var", + "video" +]; +var MEDIA_FEATURES2 = [ + "any-hover", + "any-pointer", + "aspect-ratio", + "color", + "color-gamut", + "color-index", + "device-aspect-ratio", + "device-height", + "device-width", + "display-mode", + "forced-colors", + "grid", + "height", + "hover", + "inverted-colors", + "monochrome", + "orientation", + "overflow-block", + "overflow-inline", + "pointer", + "prefers-color-scheme", + "prefers-contrast", + "prefers-reduced-motion", + "prefers-reduced-transparency", + "resolution", + "scan", + "scripting", + "update", + "width", + // TODO: find a better solution? + "min-width", + "max-width", + "min-height", + "max-height" +]; +var PSEUDO_CLASSES2 = [ + "active", + "any-link", + "blank", + "checked", + "current", + "default", + "defined", + "dir", + // dir() + "disabled", + "drop", + "empty", + "enabled", + "first", + "first-child", + "first-of-type", + "fullscreen", + "future", + "focus", + "focus-visible", + "focus-within", + "has", + // has() + "host", + // host or host() + "host-context", + // host-context() + "hover", + "indeterminate", + "in-range", + "invalid", + "is", + // is() + "lang", + // lang() + "last-child", + "last-of-type", + "left", + "link", + "local-link", + "not", + // not() + "nth-child", + // nth-child() + "nth-col", + // nth-col() + "nth-last-child", + // nth-last-child() + "nth-last-col", + // nth-last-col() + "nth-last-of-type", + //nth-last-of-type() + "nth-of-type", + //nth-of-type() + "only-child", + "only-of-type", + "optional", + "out-of-range", + "past", + "placeholder-shown", + "read-only", + "read-write", + "required", + "right", + "root", + "scope", + "target", + "target-within", + "user-invalid", + "valid", + "visited", + "where" + // where() +]; +var PSEUDO_ELEMENTS2 = [ + "after", + "backdrop", + "before", + "cue", + "cue-region", + "first-letter", + "first-line", + "grammar-error", + "marker", + "part", + "placeholder", + "selection", + "slotted", + "spelling-error" +]; +var ATTRIBUTES2 = [ + "align-content", + "align-items", + "align-self", + "all", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-repeat", + "background-size", + "block-size", + "border", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "border-block-start-style", + "border-block-start-width", + "border-block-style", + "border-block-width", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-inline", + "border-inline-color", + "border-inline-end", + "border-inline-end-color", + "border-inline-end-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-decoration-break", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columns", + "contain", + "content", + "content-visibility", + "counter-increment", + "counter-reset", + "cue", + "cue-after", + "cue-before", + "cursor", + "direction", + "display", + "empty-cells", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "flow", + "font", + "font-display", + "font-family", + "font-feature-settings", + "font-kerning", + "font-language-override", + "font-size", + "font-size-adjust", + "font-smoothing", + "font-stretch", + "font-style", + "font-synthesis", + "font-variant", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "gap", + "glyph-orientation-vertical", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "hanging-punctuation", + "height", + "hyphens", + "icon", + "image-orientation", + "image-rendering", + "image-resolution", + "ime-mode", + "inline-size", + "isolation", + "justify-content", + "left", + "letter-spacing", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "marks", + "mask", + "mask-border", + "mask-border-mode", + "mask-border-outset", + "mask-border-repeat", + "mask-border-slice", + "mask-border-source", + "mask-border-width", + "mask-clip", + "mask-composite", + "mask-image", + "mask-mode", + "mask-origin", + "mask-position", + "mask-repeat", + "mask-size", + "mask-type", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "mix-blend-mode", + "nav-down", + "nav-index", + "nav-left", + "nav-right", + "nav-up", + "none", + "normal", + "object-fit", + "object-position", + "opacity", + "order", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-wrap", + "overflow-x", + "overflow-y", + "padding", + "padding-block", + "padding-block-end", + "padding-block-start", + "padding-bottom", + "padding-inline", + "padding-inline-end", + "padding-inline-start", + "padding-left", + "padding-right", + "padding-top", + "page-break-after", + "page-break-before", + "page-break-inside", + "pause", + "pause-after", + "pause-before", + "perspective", + "perspective-origin", + "pointer-events", + "position", + "quotes", + "resize", + "rest", + "rest-after", + "rest-before", + "right", + "row-gap", + "scroll-margin", + "scroll-margin-block", + "scroll-margin-block-end", + "scroll-margin-block-start", + "scroll-margin-bottom", + "scroll-margin-inline", + "scroll-margin-inline-end", + "scroll-margin-inline-start", + "scroll-margin-left", + "scroll-margin-right", + "scroll-margin-top", + "scroll-padding", + "scroll-padding-block", + "scroll-padding-block-end", + "scroll-padding-block-start", + "scroll-padding-bottom", + "scroll-padding-inline", + "scroll-padding-inline-end", + "scroll-padding-inline-start", + "scroll-padding-left", + "scroll-padding-right", + "scroll-padding-top", + "scroll-snap-align", + "scroll-snap-stop", + "scroll-snap-type", + "scrollbar-color", + "scrollbar-gutter", + "scrollbar-width", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "speak", + "speak-as", + "src", + // @font-face + "tab-size", + "table-layout", + "text-align", + "text-align-all", + "text-align-last", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-style", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-indent", + "text-justify", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-transform", + "text-underline-position", + "top", + "transform", + "transform-box", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "unicode-bidi", + "vertical-align", + "visibility", + "voice-balance", + "voice-duration", + "voice-family", + "voice-pitch", + "voice-range", + "voice-rate", + "voice-stress", + "voice-volume", + "white-space", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "z-index" + // reverse makes sure longer attributes `font-weight` are matched fully + // instead of getting false positives on say `font` +].reverse(); +var PSEUDO_SELECTORS = PSEUDO_CLASSES2.concat(PSEUDO_ELEMENTS2); +function less(hljs) { + const modes = MODES3(hljs); + const PSEUDO_SELECTORS$1 = PSEUDO_SELECTORS; + const AT_MODIFIERS = "and or not only"; + const IDENT_RE4 = "[\\w-]+"; + const INTERP_IDENT_RE = "(" + IDENT_RE4 + "|@\\{" + IDENT_RE4 + "\\})"; + const RULES = []; + const VALUE_MODES = []; + const STRING_MODE = function(c2) { + return { + // Less strings are not multiline (also include '~' for more consistent coloring of "escaped" strings) + className: "string", + begin: "~?" + c2 + ".*?" + c2 + }; + }; + const IDENT_MODE = function(name, begin, relevance) { + return { + className: name, + begin, + relevance + }; + }; + const AT_KEYWORDS = { + $pattern: /[a-z-]+/, + keyword: AT_MODIFIERS, + attribute: MEDIA_FEATURES2.join(" ") + }; + const PARENS_MODE = { + // used only to properly balance nested parens inside mixin call, def. arg list + begin: "\\(", + end: "\\)", + contains: VALUE_MODES, + keywords: AT_KEYWORDS, + relevance: 0 + }; + VALUE_MODES.push( + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + STRING_MODE("'"), + STRING_MODE('"'), + modes.CSS_NUMBER_MODE, + // fixme: it does not include dot for numbers like .5em :( + { + begin: "(url|data-uri)\\(", + starts: { + className: "string", + end: "[\\)\\n]", + excludeEnd: true + } + }, + modes.HEXCOLOR, + PARENS_MODE, + IDENT_MODE("variable", "@@?" + IDENT_RE4, 10), + IDENT_MODE("variable", "@\\{" + IDENT_RE4 + "\\}"), + IDENT_MODE("built_in", "~?`[^`]*?`"), + // inline javascript (or whatever host language) *multiline* string + { + // @media features (it’s here to not duplicate things in AT_RULE_MODE with extra PARENS_MODE overriding): + className: "attribute", + begin: IDENT_RE4 + "\\s*:", + end: ":", + returnBegin: true, + excludeEnd: true + }, + modes.IMPORTANT, + { beginKeywords: "and not" }, + modes.FUNCTION_DISPATCH + ); + const VALUE_WITH_RULESETS = VALUE_MODES.concat({ + begin: /\{/, + end: /\}/, + contains: RULES + }); + const MIXIN_GUARD_MODE = { + beginKeywords: "when", + endsWithParent: true, + contains: [{ beginKeywords: "and not" }].concat(VALUE_MODES) + // using this form to override VALUE’s 'function' match + }; + const RULE_MODE = { + begin: INTERP_IDENT_RE + "\\s*:", + returnBegin: true, + end: /[;}]/, + relevance: 0, + contains: [ + { begin: /-(webkit|moz|ms|o)-/ }, + modes.CSS_VARIABLE, + { + className: "attribute", + begin: "\\b(" + ATTRIBUTES2.join("|") + ")\\b", + end: /(?=:)/, + starts: { + endsWithParent: true, + illegal: "[<=$]", + relevance: 0, + contains: VALUE_MODES + } + } + ] + }; + const AT_RULE_MODE = { + className: "keyword", + begin: "@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", + starts: { + end: "[;{}]", + keywords: AT_KEYWORDS, + returnEnd: true, + contains: VALUE_MODES, + relevance: 0 + } + }; + const VAR_RULE_MODE = { + className: "variable", + variants: [ + // using more strict pattern for higher relevance to increase chances of Less detection. + // this is *the only* Less specific statement used in most of the sources, so... + // (we’ll still often loose to the css-parser unless there's '//' comment, + // simply because 1 variable just can't beat 99 properties :) + { + begin: "@" + IDENT_RE4 + "\\s*:", + relevance: 15 + }, + { begin: "@" + IDENT_RE4 } + ], + starts: { + end: "[;}]", + returnEnd: true, + contains: VALUE_WITH_RULESETS + } + }; + const SELECTOR_MODE = { + // first parse unambiguous selectors (i.e. those not starting with tag) + // then fall into the scary lookahead-discriminator variant. + // this mode also handles mixin definitions and calls + variants: [ + { + begin: "[\\.#:&\\[>]", + end: "[;{}]" + // mixin calls end with ';' + }, + { + begin: INTERP_IDENT_RE, + end: /\{/ + } + ], + returnBegin: true, + returnEnd: true, + illegal: `[<='$"]`, + relevance: 0, + contains: [ + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + MIXIN_GUARD_MODE, + IDENT_MODE("keyword", "all\\b"), + IDENT_MODE("variable", "@\\{" + IDENT_RE4 + "\\}"), + // otherwise it’s identified as tag + { + begin: "\\b(" + TAGS2.join("|") + ")\\b", + className: "selector-tag" + }, + modes.CSS_NUMBER_MODE, + IDENT_MODE("selector-tag", INTERP_IDENT_RE, 0), + IDENT_MODE("selector-id", "#" + INTERP_IDENT_RE), + IDENT_MODE("selector-class", "\\." + INTERP_IDENT_RE, 0), + IDENT_MODE("selector-tag", "&", 0), + modes.ATTRIBUTE_SELECTOR_MODE, + { + className: "selector-pseudo", + begin: ":(" + PSEUDO_CLASSES2.join("|") + ")" + }, + { + className: "selector-pseudo", + begin: ":(:)?(" + PSEUDO_ELEMENTS2.join("|") + ")" + }, + { + begin: /\(/, + end: /\)/, + relevance: 0, + contains: VALUE_WITH_RULESETS + }, + // argument list of parametric mixins + { begin: "!important" }, + // eat !important after mixin call or it will be colored as tag + modes.FUNCTION_DISPATCH + ] + }; + const PSEUDO_SELECTOR_MODE = { + begin: IDENT_RE4 + `:(:)?(${PSEUDO_SELECTORS$1.join("|")})`, + returnBegin: true, + contains: [SELECTOR_MODE] + }; + RULES.push( + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + AT_RULE_MODE, + VAR_RULE_MODE, + PSEUDO_SELECTOR_MODE, + RULE_MODE, + SELECTOR_MODE, + MIXIN_GUARD_MODE, + modes.FUNCTION_DISPATCH + ); + return { + name: "Less", + case_insensitive: true, + illegal: `[=>'/<($"]`, + contains: RULES + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/lua.js +function lua(hljs) { + const OPENING_LONG_BRACKET = "\\[=*\\["; + const CLOSING_LONG_BRACKET = "\\]=*\\]"; + const LONG_BRACKETS = { + begin: OPENING_LONG_BRACKET, + end: CLOSING_LONG_BRACKET, + contains: ["self"] + }; + const COMMENTS = [ + hljs.COMMENT("--(?!" + OPENING_LONG_BRACKET + ")", "$"), + hljs.COMMENT( + "--" + OPENING_LONG_BRACKET, + CLOSING_LONG_BRACKET, + { + contains: [LONG_BRACKETS], + relevance: 10 + } + ) + ]; + return { + name: "Lua", + keywords: { + $pattern: hljs.UNDERSCORE_IDENT_RE, + literal: "true false nil", + keyword: "and break do else elseif end for goto if in local not or repeat return then until while", + built_in: ( + // Metatags and globals: + "_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" + ) + }, + contains: COMMENTS.concat([ + { + className: "function", + beginKeywords: "function", + end: "\\)", + contains: [ + hljs.inherit(hljs.TITLE_MODE, { begin: "([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*" }), + { + className: "params", + begin: "\\(", + endsWithParent: true, + contains: COMMENTS + } + ].concat(COMMENTS) + }, + hljs.C_NUMBER_MODE, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + { + className: "string", + begin: OPENING_LONG_BRACKET, + end: CLOSING_LONG_BRACKET, + contains: [LONG_BRACKETS], + relevance: 5 + } + ]) + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/makefile.js +function makefile(hljs) { + const VARIABLE = { + className: "variable", + variants: [ + { + begin: "\\$\\(" + hljs.UNDERSCORE_IDENT_RE + "\\)", + contains: [hljs.BACKSLASH_ESCAPE] + }, + { begin: /\$[@%", + subLanguage: "xml", + relevance: 0 + }; + const HORIZONTAL_RULE = { + begin: "^[-\\*]{3,}", + end: "$" + }; + const CODE = { + className: "code", + variants: [ + // TODO: fix to allow these to work with sublanguage also + { begin: "(`{3,})[^`](.|\\n)*?\\1`*[ ]*" }, + { begin: "(~{3,})[^~](.|\\n)*?\\1~*[ ]*" }, + // needed to allow markdown as a sublanguage to work + { + begin: "```", + end: "```+[ ]*$" + }, + { + begin: "~~~", + end: "~~~+[ ]*$" + }, + { begin: "`.+?`" }, + { + begin: "(?=^( {4}|\\t))", + // use contains to gobble up multiple lines to allow the block to be whatever size + // but only have a single open/close tag vs one per line + contains: [ + { + begin: "^( {4}|\\t)", + end: "(\\n)$" + } + ], + relevance: 0 + } + ] + }; + const LIST = { + className: "bullet", + begin: "^[ ]*([*+-]|(\\d+\\.))(?=\\s+)", + end: "\\s+", + excludeEnd: true + }; + const LINK_REFERENCE = { + begin: /^\[[^\n]+\]:/, + returnBegin: true, + contains: [ + { + className: "symbol", + begin: /\[/, + end: /\]/, + excludeBegin: true, + excludeEnd: true + }, + { + className: "link", + begin: /:\s*/, + end: /$/, + excludeBegin: true + } + ] + }; + const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/; + const LINK = { + variants: [ + // too much like nested array access in so many languages + // to have any real relevance + { + begin: /\[.+?\]\[.*?\]/, + relevance: 0 + }, + // popular internet URLs + { + begin: /\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, + relevance: 2 + }, + { + begin: regex.concat(/\[.+?\]\(/, URL_SCHEME, /:\/\/.*?\)/), + relevance: 2 + }, + // relative urls + { + begin: /\[.+?\]\([./?&#].*?\)/, + relevance: 1 + }, + // whatever else, lower relevance (might not be a link at all) + { + begin: /\[.*?\]\(.*?\)/, + relevance: 0 + } + ], + returnBegin: true, + contains: [ + { + // empty strings for alt or link text + match: /\[(?=\])/ + }, + { + className: "string", + relevance: 0, + begin: "\\[", + end: "\\]", + excludeBegin: true, + returnEnd: true + }, + { + className: "link", + relevance: 0, + begin: "\\]\\(", + end: "\\)", + excludeBegin: true, + excludeEnd: true + }, + { + className: "symbol", + relevance: 0, + begin: "\\]\\[", + end: "\\]", + excludeBegin: true, + excludeEnd: true + } + ] + }; + const BOLD = { + className: "strong", + contains: [], + // defined later + variants: [ + { + begin: /_{2}(?!\s)/, + end: /_{2}/ + }, + { + begin: /\*{2}(?!\s)/, + end: /\*{2}/ + } + ] + }; + const ITALIC = { + className: "emphasis", + contains: [], + // defined later + variants: [ + { + begin: /\*(?![*\s])/, + end: /\*/ + }, + { + begin: /_(?![_\s])/, + end: /_/, + relevance: 0 + } + ] + }; + const BOLD_WITHOUT_ITALIC = hljs.inherit(BOLD, { contains: [] }); + const ITALIC_WITHOUT_BOLD = hljs.inherit(ITALIC, { contains: [] }); + BOLD.contains.push(ITALIC_WITHOUT_BOLD); + ITALIC.contains.push(BOLD_WITHOUT_ITALIC); + let CONTAINABLE = [ + INLINE_HTML, + LINK + ]; + [ + BOLD, + ITALIC, + BOLD_WITHOUT_ITALIC, + ITALIC_WITHOUT_BOLD + ].forEach((m) => { + m.contains = m.contains.concat(CONTAINABLE); + }); + CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC); + const HEADER = { + className: "section", + variants: [ + { + begin: "^#{1,6}", + end: "$", + contains: CONTAINABLE + }, + { + begin: "(?=^.+?\\n[=-]{2,}$)", + contains: [ + { begin: "^[=-]*$" }, + { + begin: "^", + end: "\\n", + contains: CONTAINABLE + } + ] + } + ] + }; + const BLOCKQUOTE = { + className: "quote", + begin: "^>\\s+", + contains: CONTAINABLE, + end: "$" + }; + return { + name: "Markdown", + aliases: [ + "md", + "mkdown", + "mkd" + ], + contains: [ + HEADER, + INLINE_HTML, + LIST, + BOLD, + ITALIC, + BLOCKQUOTE, + CODE, + HORIZONTAL_RULE, + LINK, + LINK_REFERENCE + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/objectivec.js +function objectivec(hljs) { + const API_CLASS = { + className: "built_in", + begin: "\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+" + }; + const IDENTIFIER_RE = /[a-zA-Z@][a-zA-Z0-9_]*/; + const TYPES3 = [ + "int", + "float", + "char", + "unsigned", + "signed", + "short", + "long", + "double", + "wchar_t", + "unichar", + "void", + "bool", + "BOOL", + "id|0", + "_Bool" + ]; + const KWS = [ + "while", + "export", + "sizeof", + "typedef", + "const", + "struct", + "for", + "union", + "volatile", + "static", + "mutable", + "if", + "do", + "return", + "goto", + "enum", + "else", + "break", + "extern", + "asm", + "case", + "default", + "register", + "explicit", + "typename", + "switch", + "continue", + "inline", + "readonly", + "assign", + "readwrite", + "self", + "@synchronized", + "id", + "typeof", + "nonatomic", + "IBOutlet", + "IBAction", + "strong", + "weak", + "copy", + "in", + "out", + "inout", + "bycopy", + "byref", + "oneway", + "__strong", + "__weak", + "__block", + "__autoreleasing", + "@private", + "@protected", + "@public", + "@try", + "@property", + "@end", + "@throw", + "@catch", + "@finally", + "@autoreleasepool", + "@synthesize", + "@dynamic", + "@selector", + "@optional", + "@required", + "@encode", + "@package", + "@import", + "@defs", + "@compatibility_alias", + "__bridge", + "__bridge_transfer", + "__bridge_retained", + "__bridge_retain", + "__covariant", + "__contravariant", + "__kindof", + "_Nonnull", + "_Nullable", + "_Null_unspecified", + "__FUNCTION__", + "__PRETTY_FUNCTION__", + "__attribute__", + "getter", + "setter", + "retain", + "unsafe_unretained", + "nonnull", + "nullable", + "null_unspecified", + "null_resettable", + "class", + "instancetype", + "NS_DESIGNATED_INITIALIZER", + "NS_UNAVAILABLE", + "NS_REQUIRES_SUPER", + "NS_RETURNS_INNER_POINTER", + "NS_INLINE", + "NS_AVAILABLE", + "NS_DEPRECATED", + "NS_ENUM", + "NS_OPTIONS", + "NS_SWIFT_UNAVAILABLE", + "NS_ASSUME_NONNULL_BEGIN", + "NS_ASSUME_NONNULL_END", + "NS_REFINED_FOR_SWIFT", + "NS_SWIFT_NAME", + "NS_SWIFT_NOTHROW", + "NS_DURING", + "NS_HANDLER", + "NS_ENDHANDLER", + "NS_VALUERETURN", + "NS_VOIDRETURN" + ]; + const LITERALS3 = [ + "false", + "true", + "FALSE", + "TRUE", + "nil", + "YES", + "NO", + "NULL" + ]; + const BUILT_INS3 = [ + "dispatch_once_t", + "dispatch_queue_t", + "dispatch_sync", + "dispatch_async", + "dispatch_once" + ]; + const KEYWORDS3 = { + "variable.language": [ + "this", + "super" + ], + $pattern: IDENTIFIER_RE, + keyword: KWS, + literal: LITERALS3, + built_in: BUILT_INS3, + type: TYPES3 + }; + const CLASS_KEYWORDS = { + $pattern: IDENTIFIER_RE, + keyword: [ + "@interface", + "@class", + "@protocol", + "@implementation" + ] + }; + return { + name: "Objective-C", + aliases: [ + "mm", + "objc", + "obj-c", + "obj-c++", + "objective-c++" + ], + keywords: KEYWORDS3, + illegal: "/, + end: /$/, + illegal: "\\n" + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + { + className: "class", + begin: "(" + CLASS_KEYWORDS.keyword.join("|") + ")\\b", + end: /(\{|$)/, + excludeEnd: true, + keywords: CLASS_KEYWORDS, + contains: [hljs.UNDERSCORE_TITLE_MODE] + }, + { + begin: "\\." + hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/perl.js +function perl(hljs) { + const regex = hljs.regex; + const KEYWORDS3 = [ + "abs", + "accept", + "alarm", + "and", + "atan2", + "bind", + "binmode", + "bless", + "break", + "caller", + "chdir", + "chmod", + "chomp", + "chop", + "chown", + "chr", + "chroot", + "close", + "closedir", + "connect", + "continue", + "cos", + "crypt", + "dbmclose", + "dbmopen", + "defined", + "delete", + "die", + "do", + "dump", + "each", + "else", + "elsif", + "endgrent", + "endhostent", + "endnetent", + "endprotoent", + "endpwent", + "endservent", + "eof", + "eval", + "exec", + "exists", + "exit", + "exp", + "fcntl", + "fileno", + "flock", + "for", + "foreach", + "fork", + "format", + "formline", + "getc", + "getgrent", + "getgrgid", + "getgrnam", + "gethostbyaddr", + "gethostbyname", + "gethostent", + "getlogin", + "getnetbyaddr", + "getnetbyname", + "getnetent", + "getpeername", + "getpgrp", + "getpriority", + "getprotobyname", + "getprotobynumber", + "getprotoent", + "getpwent", + "getpwnam", + "getpwuid", + "getservbyname", + "getservbyport", + "getservent", + "getsockname", + "getsockopt", + "given", + "glob", + "gmtime", + "goto", + "grep", + "gt", + "hex", + "if", + "index", + "int", + "ioctl", + "join", + "keys", + "kill", + "last", + "lc", + "lcfirst", + "length", + "link", + "listen", + "local", + "localtime", + "log", + "lstat", + "lt", + "ma", + "map", + "mkdir", + "msgctl", + "msgget", + "msgrcv", + "msgsnd", + "my", + "ne", + "next", + "no", + "not", + "oct", + "open", + "opendir", + "or", + "ord", + "our", + "pack", + "package", + "pipe", + "pop", + "pos", + "print", + "printf", + "prototype", + "push", + "q|0", + "qq", + "quotemeta", + "qw", + "qx", + "rand", + "read", + "readdir", + "readline", + "readlink", + "readpipe", + "recv", + "redo", + "ref", + "rename", + "require", + "reset", + "return", + "reverse", + "rewinddir", + "rindex", + "rmdir", + "say", + "scalar", + "seek", + "seekdir", + "select", + "semctl", + "semget", + "semop", + "send", + "setgrent", + "sethostent", + "setnetent", + "setpgrp", + "setpriority", + "setprotoent", + "setpwent", + "setservent", + "setsockopt", + "shift", + "shmctl", + "shmget", + "shmread", + "shmwrite", + "shutdown", + "sin", + "sleep", + "socket", + "socketpair", + "sort", + "splice", + "split", + "sprintf", + "sqrt", + "srand", + "stat", + "state", + "study", + "sub", + "substr", + "symlink", + "syscall", + "sysopen", + "sysread", + "sysseek", + "system", + "syswrite", + "tell", + "telldir", + "tie", + "tied", + "time", + "times", + "tr", + "truncate", + "uc", + "ucfirst", + "umask", + "undef", + "unless", + "unlink", + "unpack", + "unshift", + "untie", + "until", + "use", + "utime", + "values", + "vec", + "wait", + "waitpid", + "wantarray", + "warn", + "when", + "while", + "write", + "x|0", + "xor", + "y|0" + ]; + const REGEX_MODIFIERS = /[dualxmsipngr]{0,12}/; + const PERL_KEYWORDS = { + $pattern: /[\w.]+/, + keyword: KEYWORDS3.join(" ") + }; + const SUBST = { + className: "subst", + begin: "[$@]\\{", + end: "\\}", + keywords: PERL_KEYWORDS + }; + const METHOD = { + begin: /->\{/, + end: /\}/ + // contains defined later + }; + const VAR = { variants: [ + { begin: /\$\d/ }, + { begin: regex.concat( + /[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/, + // negative look-ahead tries to avoid matching patterns that are not + // Perl at all like $ident$, @ident@, etc. + `(?![A-Za-z])(?![@$%])` + ) }, + { + begin: /[$%@][^\s\w{]/, + relevance: 0 + } + ] }; + const STRING_CONTAINS = [ + hljs.BACKSLASH_ESCAPE, + SUBST, + VAR + ]; + const REGEX_DELIMS = [ + /!/, + /\//, + /\|/, + /\?/, + /'/, + /"/, + // valid but infrequent and weird + /#/ + // valid but infrequent and weird + ]; + const PAIRED_DOUBLE_RE = (prefix, open, close2 = "\\1") => { + const middle = close2 === "\\1" ? close2 : regex.concat(close2, open); + return regex.concat( + regex.concat("(?:", prefix, ")"), + open, + /(?:\\.|[^\\\/])*?/, + middle, + /(?:\\.|[^\\\/])*?/, + close2, + REGEX_MODIFIERS + ); + }; + const PAIRED_RE = (prefix, open, close2) => { + return regex.concat( + regex.concat("(?:", prefix, ")"), + open, + /(?:\\.|[^\\\/])*?/, + close2, + REGEX_MODIFIERS + ); + }; + const PERL_DEFAULT_CONTAINS = [ + VAR, + hljs.HASH_COMMENT_MODE, + hljs.COMMENT( + /^=\w/, + /=cut/, + { endsWithParent: true } + ), + METHOD, + { + className: "string", + contains: STRING_CONTAINS, + variants: [ + { + begin: "q[qwxr]?\\s*\\(", + end: "\\)", + relevance: 5 + }, + { + begin: "q[qwxr]?\\s*\\[", + end: "\\]", + relevance: 5 + }, + { + begin: "q[qwxr]?\\s*\\{", + end: "\\}", + relevance: 5 + }, + { + begin: "q[qwxr]?\\s*\\|", + end: "\\|", + relevance: 5 + }, + { + begin: "q[qwxr]?\\s*<", + end: ">", + relevance: 5 + }, + { + begin: "qw\\s+q", + end: "q", + relevance: 5 + }, + { + begin: "'", + end: "'", + contains: [hljs.BACKSLASH_ESCAPE] + }, + { + begin: '"', + end: '"' + }, + { + begin: "`", + end: "`", + contains: [hljs.BACKSLASH_ESCAPE] + }, + { + begin: /\{\w+\}/, + relevance: 0 + }, + { + begin: "-?\\w+\\s*=>", + relevance: 0 + } + ] + }, + { + className: "number", + begin: "(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", + relevance: 0 + }, + { + // regexp container + begin: "(\\/\\/|" + hljs.RE_STARTERS_RE + "|\\b(split|return|print|reverse|grep)\\b)\\s*", + keywords: "split return print reverse grep", + relevance: 0, + contains: [ + hljs.HASH_COMMENT_MODE, + { + className: "regexp", + variants: [ + // allow matching common delimiters + { begin: PAIRED_DOUBLE_RE("s|tr|y", regex.either(...REGEX_DELIMS, { capture: true })) }, + // and then paired delmis + { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\(", "\\)") }, + { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\[", "\\]") }, + { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\{", "\\}") } + ], + relevance: 2 + }, + { + className: "regexp", + variants: [ + { + // could be a comment in many languages so do not count + // as relevant + begin: /(m|qr)\/\//, + relevance: 0 + }, + // prefix is optional with /regex/ + { begin: PAIRED_RE("(?:m|qr)?", /\//, /\//) }, + // allow matching common delimiters + { begin: PAIRED_RE("m|qr", regex.either(...REGEX_DELIMS, { capture: true }), /\1/) }, + // allow common paired delmins + { begin: PAIRED_RE("m|qr", /\(/, /\)/) }, + { begin: PAIRED_RE("m|qr", /\[/, /\]/) }, + { begin: PAIRED_RE("m|qr", /\{/, /\}/) } + ] + } + ] + }, + { + className: "function", + beginKeywords: "sub", + end: "(\\s*\\(.*?\\))?[;{]", + excludeEnd: true, + relevance: 5, + contains: [hljs.TITLE_MODE] + }, + { + begin: "-\\w\\b", + relevance: 0 + }, + { + begin: "^__DATA__$", + end: "^__END__$", + subLanguage: "mojolicious", + contains: [ + { + begin: "^@@.*", + end: "$", + className: "comment" + } + ] + } + ]; + SUBST.contains = PERL_DEFAULT_CONTAINS; + METHOD.contains = PERL_DEFAULT_CONTAINS; + return { + name: "Perl", + aliases: [ + "pl", + "pm" + ], + keywords: PERL_KEYWORDS, + contains: PERL_DEFAULT_CONTAINS + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/php.js +function php(hljs) { + const regex = hljs.regex; + const NOT_PERL_ETC = /(?![A-Za-z0-9])(?![$])/; + const IDENT_RE4 = regex.concat( + /[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/, + NOT_PERL_ETC + ); + const PASCAL_CASE_CLASS_NAME_RE = regex.concat( + /(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/, + NOT_PERL_ETC + ); + const VARIABLE = { + scope: "variable", + match: "\\$+" + IDENT_RE4 + }; + const PREPROCESSOR = { + scope: "meta", + variants: [ + { begin: /<\?php/, relevance: 10 }, + // boost for obvious PHP + { begin: /<\?=/ }, + // less relevant per PSR-1 which says not to use short-tags + { begin: /<\?/, relevance: 0.1 }, + { begin: /\?>/ } + // end php tag + ] + }; + const SUBST = { + scope: "subst", + variants: [ + { begin: /\$\w+/ }, + { + begin: /\{\$/, + end: /\}/ + } + ] + }; + const SINGLE_QUOTED = hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null }); + const DOUBLE_QUOTED = hljs.inherit(hljs.QUOTE_STRING_MODE, { + illegal: null, + contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST) + }); + const HEREDOC = { + begin: /<<<[ \t]*(?:(\w+)|"(\w+)")\n/, + end: /[ \t]*(\w+)\b/, + contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST), + "on:begin": (m, resp) => { + resp.data._beginMatch = m[1] || m[2]; + }, + "on:end": (m, resp) => { + if (resp.data._beginMatch !== m[1]) + resp.ignoreMatch(); + } + }; + const NOWDOC = hljs.END_SAME_AS_BEGIN({ + begin: /<<<[ \t]*'(\w+)'\n/, + end: /[ \t]*(\w+)\b/ + }); + const WHITESPACE = "[ \n]"; + const STRING = { + scope: "string", + variants: [ + DOUBLE_QUOTED, + SINGLE_QUOTED, + HEREDOC, + NOWDOC + ] + }; + const NUMBER = { + scope: "number", + variants: [ + { begin: `\\b0[bB][01]+(?:_[01]+)*\\b` }, + // Binary w/ underscore support + { begin: `\\b0[oO][0-7]+(?:_[0-7]+)*\\b` }, + // Octals w/ underscore support + { begin: `\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b` }, + // Hex w/ underscore support + // Decimals w/ underscore support, with optional fragments and scientific exponent (e) suffix. + { begin: `(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?` } + ], + relevance: 0 + }; + const LITERALS3 = [ + "false", + "null", + "true" + ]; + const KWS = [ + // Magic constants: + // + "__CLASS__", + "__DIR__", + "__FILE__", + "__FUNCTION__", + "__COMPILER_HALT_OFFSET__", + "__LINE__", + "__METHOD__", + "__NAMESPACE__", + "__TRAIT__", + // Function that look like language construct or language construct that look like function: + // List of keywords that may not require parenthesis + "die", + "echo", + "exit", + "include", + "include_once", + "print", + "require", + "require_once", + // These are not language construct (function) but operate on the currently-executing function and can access the current symbol table + // 'compact extract func_get_arg func_get_args func_num_args get_called_class get_parent_class ' + + // Other keywords: + // + // + "array", + "abstract", + "and", + "as", + "binary", + "bool", + "boolean", + "break", + "callable", + "case", + "catch", + "class", + "clone", + "const", + "continue", + "declare", + "default", + "do", + "double", + "else", + "elseif", + "empty", + "enddeclare", + "endfor", + "endforeach", + "endif", + "endswitch", + "endwhile", + "enum", + "eval", + "extends", + "final", + "finally", + "float", + "for", + "foreach", + "from", + "global", + "goto", + "if", + "implements", + "instanceof", + "insteadof", + "int", + "integer", + "interface", + "isset", + "iterable", + "list", + "match|0", + "mixed", + "new", + "never", + "object", + "or", + "private", + "protected", + "public", + "readonly", + "real", + "return", + "string", + "switch", + "throw", + "trait", + "try", + "unset", + "use", + "var", + "void", + "while", + "xor", + "yield" + ]; + const BUILT_INS3 = [ + // Standard PHP library: + // + "Error|0", + "AppendIterator", + "ArgumentCountError", + "ArithmeticError", + "ArrayIterator", + "ArrayObject", + "AssertionError", + "BadFunctionCallException", + "BadMethodCallException", + "CachingIterator", + "CallbackFilterIterator", + "CompileError", + "Countable", + "DirectoryIterator", + "DivisionByZeroError", + "DomainException", + "EmptyIterator", + "ErrorException", + "Exception", + "FilesystemIterator", + "FilterIterator", + "GlobIterator", + "InfiniteIterator", + "InvalidArgumentException", + "IteratorIterator", + "LengthException", + "LimitIterator", + "LogicException", + "MultipleIterator", + "NoRewindIterator", + "OutOfBoundsException", + "OutOfRangeException", + "OuterIterator", + "OverflowException", + "ParentIterator", + "ParseError", + "RangeException", + "RecursiveArrayIterator", + "RecursiveCachingIterator", + "RecursiveCallbackFilterIterator", + "RecursiveDirectoryIterator", + "RecursiveFilterIterator", + "RecursiveIterator", + "RecursiveIteratorIterator", + "RecursiveRegexIterator", + "RecursiveTreeIterator", + "RegexIterator", + "RuntimeException", + "SeekableIterator", + "SplDoublyLinkedList", + "SplFileInfo", + "SplFileObject", + "SplFixedArray", + "SplHeap", + "SplMaxHeap", + "SplMinHeap", + "SplObjectStorage", + "SplObserver", + "SplPriorityQueue", + "SplQueue", + "SplStack", + "SplSubject", + "SplTempFileObject", + "TypeError", + "UnderflowException", + "UnexpectedValueException", + "UnhandledMatchError", + // Reserved interfaces: + // + "ArrayAccess", + "BackedEnum", + "Closure", + "Fiber", + "Generator", + "Iterator", + "IteratorAggregate", + "Serializable", + "Stringable", + "Throwable", + "Traversable", + "UnitEnum", + "WeakReference", + "WeakMap", + // Reserved classes: + // + "Directory", + "__PHP_Incomplete_Class", + "parent", + "php_user_filter", + "self", + "static", + "stdClass" + ]; + const dualCase = (items) => { + const result = []; + items.forEach((item) => { + result.push(item); + if (item.toLowerCase() === item) { + result.push(item.toUpperCase()); + } else { + result.push(item.toLowerCase()); + } + }); + return result; + }; + const KEYWORDS3 = { + keyword: KWS, + literal: dualCase(LITERALS3), + built_in: BUILT_INS3 + }; + const normalizeKeywords = (items) => { + return items.map((item) => { + return item.replace(/\|\d+$/, ""); + }); + }; + const CONSTRUCTOR_CALL = { variants: [ + { + match: [ + /new/, + regex.concat(WHITESPACE, "+"), + // to prevent built ins from being confused as the class constructor call + regex.concat("(?!", normalizeKeywords(BUILT_INS3).join("\\b|"), "\\b)"), + PASCAL_CASE_CLASS_NAME_RE + ], + scope: { + 1: "keyword", + 4: "title.class" + } + } + ] }; + const CONSTANT_REFERENCE = regex.concat(IDENT_RE4, "\\b(?!\\()"); + const LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON = { variants: [ + { + match: [ + regex.concat( + /::/, + regex.lookahead(/(?!class\b)/) + ), + CONSTANT_REFERENCE + ], + scope: { 2: "variable.constant" } + }, + { + match: [ + /::/, + /class/ + ], + scope: { 2: "variable.language" } + }, + { + match: [ + PASCAL_CASE_CLASS_NAME_RE, + regex.concat( + /::/, + regex.lookahead(/(?!class\b)/) + ), + CONSTANT_REFERENCE + ], + scope: { + 1: "title.class", + 3: "variable.constant" + } + }, + { + match: [ + PASCAL_CASE_CLASS_NAME_RE, + regex.concat( + "::", + regex.lookahead(/(?!class\b)/) + ) + ], + scope: { 1: "title.class" } + }, + { + match: [ + PASCAL_CASE_CLASS_NAME_RE, + /::/, + /class/ + ], + scope: { + 1: "title.class", + 3: "variable.language" + } + } + ] }; + const NAMED_ARGUMENT = { + scope: "attr", + match: regex.concat(IDENT_RE4, regex.lookahead(":"), regex.lookahead(/(?!::)/)) + }; + const PARAMS_MODE = { + relevance: 0, + begin: /\(/, + end: /\)/, + keywords: KEYWORDS3, + contains: [ + NAMED_ARGUMENT, + VARIABLE, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + hljs.C_BLOCK_COMMENT_MODE, + STRING, + NUMBER, + CONSTRUCTOR_CALL + ] + }; + const FUNCTION_INVOKE = { + relevance: 0, + match: [ + /\b/, + // to prevent keywords from being confused as the function title + regex.concat("(?!fn\\b|function\\b|", normalizeKeywords(KWS).join("\\b|"), "|", normalizeKeywords(BUILT_INS3).join("\\b|"), "\\b)"), + IDENT_RE4, + regex.concat(WHITESPACE, "*"), + regex.lookahead(/(?=\()/) + ], + scope: { 3: "title.function.invoke" }, + contains: [PARAMS_MODE] + }; + PARAMS_MODE.contains.push(FUNCTION_INVOKE); + const ATTRIBUTE_CONTAINS = [ + NAMED_ARGUMENT, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + hljs.C_BLOCK_COMMENT_MODE, + STRING, + NUMBER, + CONSTRUCTOR_CALL + ]; + const ATTRIBUTES4 = { + begin: regex.concat(/#\[\s*/, PASCAL_CASE_CLASS_NAME_RE), + beginScope: "meta", + end: /]/, + endScope: "meta", + keywords: { + literal: LITERALS3, + keyword: [ + "new", + "array" + ] + }, + contains: [ + { + begin: /\[/, + end: /]/, + keywords: { + literal: LITERALS3, + keyword: [ + "new", + "array" + ] + }, + contains: [ + "self", + ...ATTRIBUTE_CONTAINS + ] + }, + ...ATTRIBUTE_CONTAINS, + { + scope: "meta", + match: PASCAL_CASE_CLASS_NAME_RE + } + ] + }; + return { + case_insensitive: false, + keywords: KEYWORDS3, + contains: [ + ATTRIBUTES4, + hljs.HASH_COMMENT_MODE, + hljs.COMMENT("//", "$"), + hljs.COMMENT( + "/\\*", + "\\*/", + { contains: [ + { + scope: "doctag", + match: "@[A-Za-z]+" + } + ] } + ), + { + match: /__halt_compiler\(\);/, + keywords: "__halt_compiler", + starts: { + scope: "comment", + end: hljs.MATCH_NOTHING_RE, + contains: [ + { + match: /\?>/, + scope: "meta", + endsParent: true + } + ] + } + }, + PREPROCESSOR, + { + scope: "variable.language", + match: /\$this\b/ + }, + VARIABLE, + FUNCTION_INVOKE, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + { + match: [ + /const/, + /\s/, + IDENT_RE4 + ], + scope: { + 1: "keyword", + 3: "variable.constant" + } + }, + CONSTRUCTOR_CALL, + { + scope: "function", + relevance: 0, + beginKeywords: "fn function", + end: /[;{]/, + excludeEnd: true, + illegal: "[$%\\[]", + contains: [ + { beginKeywords: "use" }, + hljs.UNDERSCORE_TITLE_MODE, + { + begin: "=>", + // No markup, just a relevance booster + endsParent: true + }, + { + scope: "params", + begin: "\\(", + end: "\\)", + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS3, + contains: [ + "self", + VARIABLE, + LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, + hljs.C_BLOCK_COMMENT_MODE, + STRING, + NUMBER + ] + } + ] + }, + { + scope: "class", + variants: [ + { + beginKeywords: "enum", + illegal: /[($"]/ + }, + { + beginKeywords: "class interface trait", + illegal: /[:($"]/ + } + ], + relevance: 0, + end: /\{/, + excludeEnd: true, + contains: [ + { beginKeywords: "extends implements" }, + hljs.UNDERSCORE_TITLE_MODE + ] + }, + // both use and namespace still use "old style" rules (vs multi-match) + // because the namespace name can include `\` and we still want each + // element to be treated as its own *individual* title + { + beginKeywords: "namespace", + relevance: 0, + end: ";", + illegal: /[.']/, + contains: [hljs.inherit(hljs.UNDERSCORE_TITLE_MODE, { scope: "title.class" })] + }, + { + beginKeywords: "use", + relevance: 0, + end: ";", + contains: [ + // TODO: title.function vs title.class + { + match: /\b(as|const|function)\b/, + scope: "keyword" + }, + // TODO: could be title.class or title.function + hljs.UNDERSCORE_TITLE_MODE + ] + }, + STRING, + NUMBER + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/php-template.js +function phpTemplate(hljs) { + return { + name: "PHP template", + subLanguage: "xml", + contains: [ + { + begin: /<\?(php|=)?/, + end: /\?>/, + subLanguage: "php", + contains: [ + // We don't want the php closing tag ?> to close the PHP block when + // inside any of the following blocks: + { + begin: "/\\*", + end: "\\*/", + skip: true + }, + { + begin: 'b"', + end: '"', + skip: true + }, + { + begin: "b'", + end: "'", + skip: true + }, + hljs.inherit(hljs.APOS_STRING_MODE, { + illegal: null, + className: null, + contains: null, + skip: true + }), + hljs.inherit(hljs.QUOTE_STRING_MODE, { + illegal: null, + className: null, + contains: null, + skip: true + }) + ] + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/plaintext.js +function plaintext(hljs) { + return { + name: "Plain text", + aliases: [ + "text", + "txt" + ], + disableAutodetect: true + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/python.js +function python(hljs) { + const regex = hljs.regex; + const IDENT_RE4 = /[\p{XID_Start}_]\p{XID_Continue}*/u; + const RESERVED_WORDS = [ + "and", + "as", + "assert", + "async", + "await", + "break", + "case", + "class", + "continue", + "def", + "del", + "elif", + "else", + "except", + "finally", + "for", + "from", + "global", + "if", + "import", + "in", + "is", + "lambda", + "match", + "nonlocal|10", + "not", + "or", + "pass", + "raise", + "return", + "try", + "while", + "with", + "yield" + ]; + const BUILT_INS3 = [ + "__import__", + "abs", + "all", + "any", + "ascii", + "bin", + "bool", + "breakpoint", + "bytearray", + "bytes", + "callable", + "chr", + "classmethod", + "compile", + "complex", + "delattr", + "dict", + "dir", + "divmod", + "enumerate", + "eval", + "exec", + "filter", + "float", + "format", + "frozenset", + "getattr", + "globals", + "hasattr", + "hash", + "help", + "hex", + "id", + "input", + "int", + "isinstance", + "issubclass", + "iter", + "len", + "list", + "locals", + "map", + "max", + "memoryview", + "min", + "next", + "object", + "oct", + "open", + "ord", + "pow", + "print", + "property", + "range", + "repr", + "reversed", + "round", + "set", + "setattr", + "slice", + "sorted", + "staticmethod", + "str", + "sum", + "super", + "tuple", + "type", + "vars", + "zip" + ]; + const LITERALS3 = [ + "__debug__", + "Ellipsis", + "False", + "None", + "NotImplemented", + "True" + ]; + const TYPES3 = [ + "Any", + "Callable", + "Coroutine", + "Dict", + "List", + "Literal", + "Generic", + "Optional", + "Sequence", + "Set", + "Tuple", + "Type", + "Union" + ]; + const KEYWORDS3 = { + $pattern: /[A-Za-z]\w+|__\w+__/, + keyword: RESERVED_WORDS, + built_in: BUILT_INS3, + literal: LITERALS3, + type: TYPES3 + }; + const PROMPT = { + className: "meta", + begin: /^(>>>|\.\.\.) / + }; + const SUBST = { + className: "subst", + begin: /\{/, + end: /\}/, + keywords: KEYWORDS3, + illegal: /#/ + }; + const LITERAL_BRACKET = { + begin: /\{\{/, + relevance: 0 + }; + const STRING = { + className: "string", + contains: [hljs.BACKSLASH_ESCAPE], + variants: [ + { + begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/, + end: /'''/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT + ], + relevance: 10 + }, + { + begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/, + end: /"""/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT + ], + relevance: 10 + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])'''/, + end: /'''/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT, + LITERAL_BRACKET, + SUBST + ] + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])"""/, + end: /"""/, + contains: [ + hljs.BACKSLASH_ESCAPE, + PROMPT, + LITERAL_BRACKET, + SUBST + ] + }, + { + begin: /([uU]|[rR])'/, + end: /'/, + relevance: 10 + }, + { + begin: /([uU]|[rR])"/, + end: /"/, + relevance: 10 + }, + { + begin: /([bB]|[bB][rR]|[rR][bB])'/, + end: /'/ + }, + { + begin: /([bB]|[bB][rR]|[rR][bB])"/, + end: /"/ + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])'/, + end: /'/, + contains: [ + hljs.BACKSLASH_ESCAPE, + LITERAL_BRACKET, + SUBST + ] + }, + { + begin: /([fF][rR]|[rR][fF]|[fF])"/, + end: /"/, + contains: [ + hljs.BACKSLASH_ESCAPE, + LITERAL_BRACKET, + SUBST + ] + }, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }; + const digitpart = "[0-9](_?[0-9])*"; + const pointfloat = `(\\b(${digitpart}))?\\.(${digitpart})|\\b(${digitpart})\\.`; + const lookahead3 = `\\b|${RESERVED_WORDS.join("|")}`; + const NUMBER = { + className: "number", + relevance: 0, + variants: [ + // exponentfloat, pointfloat + // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals + // optionally imaginary + // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals + // Note: no leading \b because floats can start with a decimal point + // and we don't want to mishandle e.g. `fn(.5)`, + // no trailing \b for pointfloat because it can end with a decimal point + // and we don't want to mishandle e.g. `0..hex()`; this should be safe + // because both MUST contain a decimal point and so cannot be confused with + // the interior part of an identifier + { + begin: `(\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead3})` + }, + { + begin: `(${pointfloat})[jJ]?` + }, + // decinteger, bininteger, octinteger, hexinteger + // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals + // optionally "long" in Python 2 + // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals + // decinteger is optionally imaginary + // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals + { + begin: `\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead3})` + }, + { + begin: `\\b0[bB](_?[01])+[lL]?(?=${lookahead3})` + }, + { + begin: `\\b0[oO](_?[0-7])+[lL]?(?=${lookahead3})` + }, + { + begin: `\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead3})` + }, + // imagnumber (digitpart-based) + // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals + { + begin: `\\b(${digitpart})[jJ](?=${lookahead3})` + } + ] + }; + const COMMENT_TYPE = { + className: "comment", + begin: regex.lookahead(/# type:/), + end: /$/, + keywords: KEYWORDS3, + contains: [ + { + // prevent keywords from coloring `type` + begin: /# type:/ + }, + // comment within a datatype comment includes no keywords + { + begin: /#/, + end: /\b\B/, + endsWithParent: true + } + ] + }; + const PARAMS = { + className: "params", + variants: [ + // Exclude params in functions without params + { + className: "", + begin: /\(\s*\)/, + skip: true + }, + { + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS3, + contains: [ + "self", + PROMPT, + NUMBER, + STRING, + hljs.HASH_COMMENT_MODE + ] + } + ] + }; + SUBST.contains = [ + STRING, + NUMBER, + PROMPT + ]; + return { + name: "Python", + aliases: [ + "py", + "gyp", + "ipython" + ], + unicodeRegex: true, + keywords: KEYWORDS3, + illegal: /(<\/|\?)|=>/, + contains: [ + PROMPT, + NUMBER, + { + // very common convention + begin: /\bself\b/ + }, + { + // eat "if" prior to string so that it won't accidentally be + // labeled as an f-string + beginKeywords: "if", + relevance: 0 + }, + STRING, + COMMENT_TYPE, + hljs.HASH_COMMENT_MODE, + { + match: [ + /\bdef/, + /\s+/, + IDENT_RE4 + ], + scope: { + 1: "keyword", + 3: "title.function" + }, + contains: [PARAMS] + }, + { + variants: [ + { + match: [ + /\bclass/, + /\s+/, + IDENT_RE4, + /\s*/, + /\(\s*/, + IDENT_RE4, + /\s*\)/ + ] + }, + { + match: [ + /\bclass/, + /\s+/, + IDENT_RE4 + ] + } + ], + scope: { + 1: "keyword", + 3: "title.class", + 6: "title.class.inherited" + } + }, + { + className: "meta", + begin: /^[\t ]*@/, + end: /(?=#)|$/, + contains: [ + NUMBER, + PARAMS, + STRING + ] + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/python-repl.js +function pythonRepl(hljs) { + return { + aliases: ["pycon"], + contains: [ + { + className: "meta.prompt", + starts: { + // a space separates the REPL prefix from the actual code + // this is purely for cleaner HTML output + end: / |$/, + starts: { + end: "$", + subLanguage: "python" + } + }, + variants: [ + { begin: /^>>>(?=[ ]|$)/ }, + { begin: /^\.\.\.(?=[ ]|$)/ } + ] + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/r.js +function r(hljs) { + const regex = hljs.regex; + const IDENT_RE4 = /(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/; + const NUMBER_TYPES_RE = regex.either( + // Special case: only hexadecimal binary powers can contain fractions + /0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/, + // Hexadecimal numbers without fraction and optional binary power + /0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/, + // Decimal numbers + /(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/ + ); + const OPERATORS_RE = /[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/; + const PUNCTUATION_RE = regex.either( + /[()]/, + /[{}]/, + /\[\[/, + /[[\]]/, + /\\/, + /,/ + ); + return { + name: "R", + keywords: { + $pattern: IDENT_RE4, + keyword: "function if in break next repeat else for while", + literal: "NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", + built_in: ( + // Builtin constants + "LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" + ) + }, + contains: [ + // Roxygen comments + hljs.COMMENT( + /#'/, + /$/, + { contains: [ + { + // Handle `@examples` separately to cause all subsequent code + // until the next `@`-tag on its own line to be kept as-is, + // preventing highlighting. This code is example R code, so nested + // doctags shouldn’t be treated as such. See + // `test/markup/r/roxygen.txt` for an example. + scope: "doctag", + match: /@examples/, + starts: { + end: regex.lookahead(regex.either( + // end if another doc comment + /\n^#'\s*(?=@[a-zA-Z]+)/, + // or a line with no comment + /\n^(?!#')/ + )), + endsParent: true + } + }, + { + // Handle `@param` to highlight the parameter name following + // after. + scope: "doctag", + begin: "@param", + end: /$/, + contains: [ + { + scope: "variable", + variants: [ + { match: IDENT_RE4 }, + { match: /`(?:\\.|[^`\\])+`/ } + ], + endsParent: true + } + ] + }, + { + scope: "doctag", + match: /@[a-zA-Z]+/ + }, + { + scope: "keyword", + match: /\\[a-zA-Z]+/ + } + ] } + ), + hljs.HASH_COMMENT_MODE, + { + scope: "string", + contains: [hljs.BACKSLASH_ESCAPE], + variants: [ + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\(/, + end: /\)(-*)"/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\{/, + end: /\}(-*)"/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\[/, + end: /\](-*)"/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\(/, + end: /\)(-*)'/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\{/, + end: /\}(-*)'/ + }), + hljs.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\[/, + end: /\](-*)'/ + }), + { + begin: '"', + end: '"', + relevance: 0 + }, + { + begin: "'", + end: "'", + relevance: 0 + } + ] + }, + // Matching numbers immediately following punctuation and operators is + // tricky since we need to look at the character ahead of a number to + // ensure the number is not part of an identifier, and we cannot use + // negative look-behind assertions. So instead we explicitly handle all + // possible combinations of (operator|punctuation), number. + // TODO: replace with negative look-behind when available + // { begin: /(?>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)"; + const CLASS_NAME_RE = regex.either( + /\b([A-Z]+[a-z0-9]+)+/, + // ends in caps + /\b([A-Z]+[a-z0-9]+)+[A-Z]+/ + ); + const CLASS_NAME_WITH_NAMESPACE_RE = regex.concat(CLASS_NAME_RE, /(::\w+)*/); + const PSEUDO_KWS = [ + "include", + "extend", + "prepend", + "public", + "private", + "protected", + "raise", + "throw" + ]; + const RUBY_KEYWORDS = { + "variable.constant": [ + "__FILE__", + "__LINE__", + "__ENCODING__" + ], + "variable.language": [ + "self", + "super" + ], + keyword: [ + "alias", + "and", + "begin", + "BEGIN", + "break", + "case", + "class", + "defined", + "do", + "else", + "elsif", + "end", + "END", + "ensure", + "for", + "if", + "in", + "module", + "next", + "not", + "or", + "redo", + "require", + "rescue", + "retry", + "return", + "then", + "undef", + "unless", + "until", + "when", + "while", + "yield", + ...PSEUDO_KWS + ], + built_in: [ + "proc", + "lambda", + "attr_accessor", + "attr_reader", + "attr_writer", + "define_method", + "private_constant", + "module_function" + ], + literal: [ + "true", + "false", + "nil" + ] + }; + const YARDOCTAG = { + className: "doctag", + begin: "@[A-Za-z]+" + }; + const IRB_OBJECT = { + begin: "#<", + end: ">" + }; + const COMMENT_MODES = [ + hljs.COMMENT( + "#", + "$", + { contains: [YARDOCTAG] } + ), + hljs.COMMENT( + "^=begin", + "^=end", + { + contains: [YARDOCTAG], + relevance: 10 + } + ), + hljs.COMMENT("^__END__", hljs.MATCH_NOTHING_RE) + ]; + const SUBST = { + className: "subst", + begin: /#\{/, + end: /\}/, + keywords: RUBY_KEYWORDS + }; + const STRING = { + className: "string", + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + variants: [ + { + begin: /'/, + end: /'/ + }, + { + begin: /"/, + end: /"/ + }, + { + begin: /`/, + end: /`/ + }, + { + begin: /%[qQwWx]?\(/, + end: /\)/ + }, + { + begin: /%[qQwWx]?\[/, + end: /\]/ + }, + { + begin: /%[qQwWx]?\{/, + end: /\}/ + }, + { + begin: /%[qQwWx]?/ + }, + { + begin: /%[qQwWx]?\//, + end: /\// + }, + { + begin: /%[qQwWx]?%/, + end: /%/ + }, + { + begin: /%[qQwWx]?-/, + end: /-/ + }, + { + begin: /%[qQwWx]?\|/, + end: /\|/ + }, + // in the following expressions, \B in the beginning suppresses recognition of ?-sequences + // where ? is the last character of a preceding identifier, as in: `func?4` + { begin: /\B\?(\\\d{1,3})/ }, + { begin: /\B\?(\\x[A-Fa-f0-9]{1,2})/ }, + { begin: /\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/ }, + { begin: /\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/ }, + { begin: /\B\?\\(c|C-)[\x20-\x7e]/ }, + { begin: /\B\?\\?\S/ }, + // heredocs + { + // this guard makes sure that we have an entire heredoc and not a false + // positive (auto-detect, etc.) + begin: regex.concat( + /<<[-~]?'?/, + regex.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/) + ), + contains: [ + hljs.END_SAME_AS_BEGIN({ + begin: /(\w+)/, + end: /(\w+)/, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ] + }) + ] + } + ] + }; + const decimal = "[1-9](_?[0-9])*|0"; + const digits = "[0-9](_?[0-9])*"; + const NUMBER = { + className: "number", + relevance: 0, + variants: [ + // decimal integer/float, optionally exponential or rational, optionally imaginary + { begin: `\\b(${decimal})(\\.(${digits}))?([eE][+-]?(${digits})|r)?i?\\b` }, + // explicit decimal/binary/octal/hexadecimal integer, + // optionally rational and/or imaginary + { begin: "\\b0[dD][0-9](_?[0-9])*r?i?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*r?i?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*r?i?\\b" }, + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b" }, + // 0-prefixed implicit octal integer, optionally rational and/or imaginary + { begin: "\\b0(_?[0-7])+r?i?\\b" } + ] + }; + const PARAMS = { + variants: [ + { + match: /\(\)/ + }, + { + className: "params", + begin: /\(/, + end: /(?=\))/, + excludeBegin: true, + endsParent: true, + keywords: RUBY_KEYWORDS + } + ] + }; + const INCLUDE_EXTEND = { + match: [ + /(include|extend)\s+/, + CLASS_NAME_WITH_NAMESPACE_RE + ], + scope: { + 2: "title.class" + }, + keywords: RUBY_KEYWORDS + }; + const CLASS_DEFINITION = { + variants: [ + { + match: [ + /class\s+/, + CLASS_NAME_WITH_NAMESPACE_RE, + /\s+<\s+/, + CLASS_NAME_WITH_NAMESPACE_RE + ] + }, + { + match: [ + /\b(class|module)\s+/, + CLASS_NAME_WITH_NAMESPACE_RE + ] + } + ], + scope: { + 2: "title.class", + 4: "title.class.inherited" + }, + keywords: RUBY_KEYWORDS + }; + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }; + const METHOD_DEFINITION = { + match: [ + /def/, + /\s+/, + RUBY_METHOD_RE + ], + scope: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + PARAMS + ] + }; + const OBJECT_CREATION = { + relevance: 0, + match: [ + CLASS_NAME_WITH_NAMESPACE_RE, + /\.new[. (]/ + ], + scope: { + 1: "title.class" + } + }; + const CLASS_REFERENCE = { + relevance: 0, + match: CLASS_NAME_RE, + scope: "title.class" + }; + const RUBY_DEFAULT_CONTAINS = [ + STRING, + CLASS_DEFINITION, + INCLUDE_EXTEND, + OBJECT_CREATION, + UPPER_CASE_CONSTANT, + CLASS_REFERENCE, + METHOD_DEFINITION, + { + // swallow namespace qualifiers before symbols + begin: hljs.IDENT_RE + "::" + }, + { + className: "symbol", + begin: hljs.UNDERSCORE_IDENT_RE + "(!|\\?)?:", + relevance: 0 + }, + { + className: "symbol", + begin: ":(?!\\s)", + contains: [ + STRING, + { begin: RUBY_METHOD_RE } + ], + relevance: 0 + }, + NUMBER, + { + // negative-look forward attempts to prevent false matches like: + // @ident@ or $ident$ that might indicate this is not ruby at all + className: "variable", + begin: `(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])` + }, + { + className: "params", + begin: /\|/, + end: /\|/, + excludeBegin: true, + excludeEnd: true, + relevance: 0, + // this could be a lot of things (in other languages) other than params + keywords: RUBY_KEYWORDS + }, + { + // regexp container + begin: "(" + hljs.RE_STARTERS_RE + "|unless)\\s*", + keywords: "unless", + contains: [ + { + className: "regexp", + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + illegal: /\n/, + variants: [ + { + begin: "/", + end: "/[a-z]*" + }, + { + begin: /%r\{/, + end: /\}[a-z]*/ + }, + { + begin: "%r\\(", + end: "\\)[a-z]*" + }, + { + begin: "%r!", + end: "![a-z]*" + }, + { + begin: "%r\\[", + end: "\\][a-z]*" + } + ] + } + ].concat(IRB_OBJECT, COMMENT_MODES), + relevance: 0 + } + ].concat(IRB_OBJECT, COMMENT_MODES); + SUBST.contains = RUBY_DEFAULT_CONTAINS; + PARAMS.contains = RUBY_DEFAULT_CONTAINS; + const SIMPLE_PROMPT = "[>?]>"; + const DEFAULT_PROMPT = "[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"; + const RVM_PROMPT = "(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"; + const IRB_DEFAULT = [ + { + begin: /^\s*=>/, + starts: { + end: "$", + contains: RUBY_DEFAULT_CONTAINS + } + }, + { + className: "meta.prompt", + begin: "^(" + SIMPLE_PROMPT + "|" + DEFAULT_PROMPT + "|" + RVM_PROMPT + ")(?=[ ])", + starts: { + end: "$", + keywords: RUBY_KEYWORDS, + contains: RUBY_DEFAULT_CONTAINS + } + } + ]; + COMMENT_MODES.unshift(IRB_OBJECT); + return { + name: "Ruby", + aliases: [ + "rb", + "gemspec", + "podspec", + "thor", + "irb" + ], + keywords: RUBY_KEYWORDS, + illegal: /\/\*/, + contains: [hljs.SHEBANG({ binary: "ruby" })].concat(IRB_DEFAULT).concat(COMMENT_MODES).concat(RUBY_DEFAULT_CONTAINS) + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/rust.js +function rust(hljs) { + const regex = hljs.regex; + const FUNCTION_INVOKE = { + className: "title.function.invoke", + relevance: 0, + begin: regex.concat( + /\b/, + /(?!let\b)/, + hljs.IDENT_RE, + regex.lookahead(/\s*\(/) + ) + }; + const NUMBER_SUFFIX = "([ui](8|16|32|64|128|size)|f(32|64))?"; + const KEYWORDS3 = [ + "abstract", + "as", + "async", + "await", + "become", + "box", + "break", + "const", + "continue", + "crate", + "do", + "dyn", + "else", + "enum", + "extern", + "false", + "final", + "fn", + "for", + "if", + "impl", + "in", + "let", + "loop", + "macro", + "match", + "mod", + "move", + "mut", + "override", + "priv", + "pub", + "ref", + "return", + "self", + "Self", + "static", + "struct", + "super", + "trait", + "true", + "try", + "type", + "typeof", + "unsafe", + "unsized", + "use", + "virtual", + "where", + "while", + "yield" + ]; + const LITERALS3 = [ + "true", + "false", + "Some", + "None", + "Ok", + "Err" + ]; + const BUILTINS = [ + // functions + "drop ", + // traits + "Copy", + "Send", + "Sized", + "Sync", + "Drop", + "Fn", + "FnMut", + "FnOnce", + "ToOwned", + "Clone", + "Debug", + "PartialEq", + "PartialOrd", + "Eq", + "Ord", + "AsRef", + "AsMut", + "Into", + "From", + "Default", + "Iterator", + "Extend", + "IntoIterator", + "DoubleEndedIterator", + "ExactSizeIterator", + "SliceConcatExt", + "ToString", + // macros + "assert!", + "assert_eq!", + "bitflags!", + "bytes!", + "cfg!", + "col!", + "concat!", + "concat_idents!", + "debug_assert!", + "debug_assert_eq!", + "env!", + "panic!", + "file!", + "format!", + "format_args!", + "include_bytes!", + "include_str!", + "line!", + "local_data_key!", + "module_path!", + "option_env!", + "print!", + "println!", + "select!", + "stringify!", + "try!", + "unimplemented!", + "unreachable!", + "vec!", + "write!", + "writeln!", + "macro_rules!", + "assert_ne!", + "debug_assert_ne!" + ]; + const TYPES3 = [ + "i8", + "i16", + "i32", + "i64", + "i128", + "isize", + "u8", + "u16", + "u32", + "u64", + "u128", + "usize", + "f32", + "f64", + "str", + "char", + "bool", + "Box", + "Option", + "Result", + "String", + "Vec" + ]; + return { + name: "Rust", + aliases: ["rs"], + keywords: { + $pattern: hljs.IDENT_RE + "!?", + type: TYPES3, + keyword: KEYWORDS3, + literal: LITERALS3, + built_in: BUILTINS + }, + illegal: "" + }, + FUNCTION_INVOKE + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/scss.js +var MODES4 = (hljs) => { + return { + IMPORTANT: { + scope: "meta", + begin: "!important" + }, + BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, + HEXCOLOR: { + scope: "number", + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + }, + FUNCTION_DISPATCH: { + className: "built_in", + begin: /[\w-]+(?=\()/ + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: "selector-attr", + begin: /\[/, + end: /\]/, + illegal: "$", + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + CSS_NUMBER_MODE: { + scope: "number", + begin: hljs.NUMBER_RE + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", + relevance: 0 + }, + CSS_VARIABLE: { + className: "attr", + begin: /--[A-Za-z][A-Za-z0-9_-]*/ + } + }; +}; +var TAGS3 = [ + "a", + "abbr", + "address", + "article", + "aside", + "audio", + "b", + "blockquote", + "body", + "button", + "canvas", + "caption", + "cite", + "code", + "dd", + "del", + "details", + "dfn", + "div", + "dl", + "dt", + "em", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "hgroup", + "html", + "i", + "iframe", + "img", + "input", + "ins", + "kbd", + "label", + "legend", + "li", + "main", + "mark", + "menu", + "nav", + "object", + "ol", + "p", + "q", + "quote", + "samp", + "section", + "span", + "strong", + "summary", + "sup", + "table", + "tbody", + "td", + "textarea", + "tfoot", + "th", + "thead", + "time", + "tr", + "ul", + "var", + "video" +]; +var MEDIA_FEATURES3 = [ + "any-hover", + "any-pointer", + "aspect-ratio", + "color", + "color-gamut", + "color-index", + "device-aspect-ratio", + "device-height", + "device-width", + "display-mode", + "forced-colors", + "grid", + "height", + "hover", + "inverted-colors", + "monochrome", + "orientation", + "overflow-block", + "overflow-inline", + "pointer", + "prefers-color-scheme", + "prefers-contrast", + "prefers-reduced-motion", + "prefers-reduced-transparency", + "resolution", + "scan", + "scripting", + "update", + "width", + // TODO: find a better solution? + "min-width", + "max-width", + "min-height", + "max-height" +]; +var PSEUDO_CLASSES3 = [ + "active", + "any-link", + "blank", + "checked", + "current", + "default", + "defined", + "dir", + // dir() + "disabled", + "drop", + "empty", + "enabled", + "first", + "first-child", + "first-of-type", + "fullscreen", + "future", + "focus", + "focus-visible", + "focus-within", + "has", + // has() + "host", + // host or host() + "host-context", + // host-context() + "hover", + "indeterminate", + "in-range", + "invalid", + "is", + // is() + "lang", + // lang() + "last-child", + "last-of-type", + "left", + "link", + "local-link", + "not", + // not() + "nth-child", + // nth-child() + "nth-col", + // nth-col() + "nth-last-child", + // nth-last-child() + "nth-last-col", + // nth-last-col() + "nth-last-of-type", + //nth-last-of-type() + "nth-of-type", + //nth-of-type() + "only-child", + "only-of-type", + "optional", + "out-of-range", + "past", + "placeholder-shown", + "read-only", + "read-write", + "required", + "right", + "root", + "scope", + "target", + "target-within", + "user-invalid", + "valid", + "visited", + "where" + // where() +]; +var PSEUDO_ELEMENTS3 = [ + "after", + "backdrop", + "before", + "cue", + "cue-region", + "first-letter", + "first-line", + "grammar-error", + "marker", + "part", + "placeholder", + "selection", + "slotted", + "spelling-error" +]; +var ATTRIBUTES3 = [ + "align-content", + "align-items", + "align-self", + "all", + "animation", + "animation-delay", + "animation-direction", + "animation-duration", + "animation-fill-mode", + "animation-iteration-count", + "animation-name", + "animation-play-state", + "animation-timing-function", + "backface-visibility", + "background", + "background-attachment", + "background-blend-mode", + "background-clip", + "background-color", + "background-image", + "background-origin", + "background-position", + "background-repeat", + "background-size", + "block-size", + "border", + "border-block", + "border-block-color", + "border-block-end", + "border-block-end-color", + "border-block-end-style", + "border-block-end-width", + "border-block-start", + "border-block-start-color", + "border-block-start-style", + "border-block-start-width", + "border-block-style", + "border-block-width", + "border-bottom", + "border-bottom-color", + "border-bottom-left-radius", + "border-bottom-right-radius", + "border-bottom-style", + "border-bottom-width", + "border-collapse", + "border-color", + "border-image", + "border-image-outset", + "border-image-repeat", + "border-image-slice", + "border-image-source", + "border-image-width", + "border-inline", + "border-inline-color", + "border-inline-end", + "border-inline-end-color", + "border-inline-end-style", + "border-inline-end-width", + "border-inline-start", + "border-inline-start-color", + "border-inline-start-style", + "border-inline-start-width", + "border-inline-style", + "border-inline-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-spacing", + "border-style", + "border-top", + "border-top-color", + "border-top-left-radius", + "border-top-right-radius", + "border-top-style", + "border-top-width", + "border-width", + "bottom", + "box-decoration-break", + "box-shadow", + "box-sizing", + "break-after", + "break-before", + "break-inside", + "caption-side", + "caret-color", + "clear", + "clip", + "clip-path", + "clip-rule", + "color", + "column-count", + "column-fill", + "column-gap", + "column-rule", + "column-rule-color", + "column-rule-style", + "column-rule-width", + "column-span", + "column-width", + "columns", + "contain", + "content", + "content-visibility", + "counter-increment", + "counter-reset", + "cue", + "cue-after", + "cue-before", + "cursor", + "direction", + "display", + "empty-cells", + "filter", + "flex", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-grow", + "flex-shrink", + "flex-wrap", + "float", + "flow", + "font", + "font-display", + "font-family", + "font-feature-settings", + "font-kerning", + "font-language-override", + "font-size", + "font-size-adjust", + "font-smoothing", + "font-stretch", + "font-style", + "font-synthesis", + "font-variant", + "font-variant-caps", + "font-variant-east-asian", + "font-variant-ligatures", + "font-variant-numeric", + "font-variant-position", + "font-variation-settings", + "font-weight", + "gap", + "glyph-orientation-vertical", + "grid", + "grid-area", + "grid-auto-columns", + "grid-auto-flow", + "grid-auto-rows", + "grid-column", + "grid-column-end", + "grid-column-start", + "grid-gap", + "grid-row", + "grid-row-end", + "grid-row-start", + "grid-template", + "grid-template-areas", + "grid-template-columns", + "grid-template-rows", + "hanging-punctuation", + "height", + "hyphens", + "icon", + "image-orientation", + "image-rendering", + "image-resolution", + "ime-mode", + "inline-size", + "isolation", + "justify-content", + "left", + "letter-spacing", + "line-break", + "line-height", + "list-style", + "list-style-image", + "list-style-position", + "list-style-type", + "margin", + "margin-block", + "margin-block-end", + "margin-block-start", + "margin-bottom", + "margin-inline", + "margin-inline-end", + "margin-inline-start", + "margin-left", + "margin-right", + "margin-top", + "marks", + "mask", + "mask-border", + "mask-border-mode", + "mask-border-outset", + "mask-border-repeat", + "mask-border-slice", + "mask-border-source", + "mask-border-width", + "mask-clip", + "mask-composite", + "mask-image", + "mask-mode", + "mask-origin", + "mask-position", + "mask-repeat", + "mask-size", + "mask-type", + "max-block-size", + "max-height", + "max-inline-size", + "max-width", + "min-block-size", + "min-height", + "min-inline-size", + "min-width", + "mix-blend-mode", + "nav-down", + "nav-index", + "nav-left", + "nav-right", + "nav-up", + "none", + "normal", + "object-fit", + "object-position", + "opacity", + "order", + "orphans", + "outline", + "outline-color", + "outline-offset", + "outline-style", + "outline-width", + "overflow", + "overflow-wrap", + "overflow-x", + "overflow-y", + "padding", + "padding-block", + "padding-block-end", + "padding-block-start", + "padding-bottom", + "padding-inline", + "padding-inline-end", + "padding-inline-start", + "padding-left", + "padding-right", + "padding-top", + "page-break-after", + "page-break-before", + "page-break-inside", + "pause", + "pause-after", + "pause-before", + "perspective", + "perspective-origin", + "pointer-events", + "position", + "quotes", + "resize", + "rest", + "rest-after", + "rest-before", + "right", + "row-gap", + "scroll-margin", + "scroll-margin-block", + "scroll-margin-block-end", + "scroll-margin-block-start", + "scroll-margin-bottom", + "scroll-margin-inline", + "scroll-margin-inline-end", + "scroll-margin-inline-start", + "scroll-margin-left", + "scroll-margin-right", + "scroll-margin-top", + "scroll-padding", + "scroll-padding-block", + "scroll-padding-block-end", + "scroll-padding-block-start", + "scroll-padding-bottom", + "scroll-padding-inline", + "scroll-padding-inline-end", + "scroll-padding-inline-start", + "scroll-padding-left", + "scroll-padding-right", + "scroll-padding-top", + "scroll-snap-align", + "scroll-snap-stop", + "scroll-snap-type", + "scrollbar-color", + "scrollbar-gutter", + "scrollbar-width", + "shape-image-threshold", + "shape-margin", + "shape-outside", + "speak", + "speak-as", + "src", + // @font-face + "tab-size", + "table-layout", + "text-align", + "text-align-all", + "text-align-last", + "text-combine-upright", + "text-decoration", + "text-decoration-color", + "text-decoration-line", + "text-decoration-style", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-position", + "text-emphasis-style", + "text-indent", + "text-justify", + "text-orientation", + "text-overflow", + "text-rendering", + "text-shadow", + "text-transform", + "text-underline-position", + "top", + "transform", + "transform-box", + "transform-origin", + "transform-style", + "transition", + "transition-delay", + "transition-duration", + "transition-property", + "transition-timing-function", + "unicode-bidi", + "vertical-align", + "visibility", + "voice-balance", + "voice-duration", + "voice-family", + "voice-pitch", + "voice-range", + "voice-rate", + "voice-stress", + "voice-volume", + "white-space", + "widows", + "width", + "will-change", + "word-break", + "word-spacing", + "word-wrap", + "writing-mode", + "z-index" + // reverse makes sure longer attributes `font-weight` are matched fully + // instead of getting false positives on say `font` +].reverse(); +function scss(hljs) { + const modes = MODES4(hljs); + const PSEUDO_ELEMENTS$1 = PSEUDO_ELEMENTS3; + const PSEUDO_CLASSES$1 = PSEUDO_CLASSES3; + const AT_IDENTIFIER = "@[a-z-]+"; + const AT_MODIFIERS = "and or not only"; + const IDENT_RE4 = "[a-zA-Z-][a-zA-Z0-9_-]*"; + const VARIABLE = { + className: "variable", + begin: "(\\$" + IDENT_RE4 + ")\\b", + relevance: 0 + }; + return { + name: "SCSS", + case_insensitive: true, + illegal: "[=/|']", + contains: [ + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + // to recognize keyframe 40% etc which are outside the scope of our + // attribute value mode + modes.CSS_NUMBER_MODE, + { + className: "selector-id", + begin: "#[A-Za-z0-9_-]+", + relevance: 0 + }, + { + className: "selector-class", + begin: "\\.[A-Za-z0-9_-]+", + relevance: 0 + }, + modes.ATTRIBUTE_SELECTOR_MODE, + { + className: "selector-tag", + begin: "\\b(" + TAGS3.join("|") + ")\\b", + // was there, before, but why? + relevance: 0 + }, + { + className: "selector-pseudo", + begin: ":(" + PSEUDO_CLASSES$1.join("|") + ")" + }, + { + className: "selector-pseudo", + begin: ":(:)?(" + PSEUDO_ELEMENTS$1.join("|") + ")" + }, + VARIABLE, + { + // pseudo-selector params + begin: /\(/, + end: /\)/, + contains: [modes.CSS_NUMBER_MODE] + }, + modes.CSS_VARIABLE, + { + className: "attribute", + begin: "\\b(" + ATTRIBUTES3.join("|") + ")\\b" + }, + { begin: "\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" }, + { + begin: /:/, + end: /[;}{]/, + relevance: 0, + contains: [ + modes.BLOCK_COMMENT, + VARIABLE, + modes.HEXCOLOR, + modes.CSS_NUMBER_MODE, + hljs.QUOTE_STRING_MODE, + hljs.APOS_STRING_MODE, + modes.IMPORTANT, + modes.FUNCTION_DISPATCH + ] + }, + // matching these here allows us to treat them more like regular CSS + // rules so everything between the {} gets regular rule highlighting, + // which is what we want for page and font-face + { + begin: "@(page|font-face)", + keywords: { + $pattern: AT_IDENTIFIER, + keyword: "@page @font-face" + } + }, + { + begin: "@", + end: "[{;]", + returnBegin: true, + keywords: { + $pattern: /[a-z-]+/, + keyword: AT_MODIFIERS, + attribute: MEDIA_FEATURES3.join(" ") + }, + contains: [ + { + begin: AT_IDENTIFIER, + className: "keyword" + }, + { + begin: /[a-z-]+(?=:)/, + className: "attribute" + }, + VARIABLE, + hljs.QUOTE_STRING_MODE, + hljs.APOS_STRING_MODE, + modes.HEXCOLOR, + modes.CSS_NUMBER_MODE + ] + }, + modes.FUNCTION_DISPATCH + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/shell.js +function shell(hljs) { + return { + name: "Shell Session", + aliases: [ + "console", + "shellsession" + ], + contains: [ + { + className: "meta.prompt", + // We cannot add \s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result. + // For instance, in the following example, it would match "echo /path/to/home >" as a prompt: + // echo /path/to/home > t.exe + begin: /^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/, + starts: { + end: /[^\\](?=\s*$)/, + subLanguage: "bash" + } + } + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/sql.js +function sql(hljs) { + const regex = hljs.regex; + const COMMENT_MODE = hljs.COMMENT("--", "$"); + const STRING = { + className: "string", + variants: [ + { + begin: /'/, + end: /'/, + contains: [{ begin: /''/ }] + } + ] + }; + const QUOTED_IDENTIFIER = { + begin: /"/, + end: /"/, + contains: [{ begin: /""/ }] + }; + const LITERALS3 = [ + "true", + "false", + // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way. + // "null", + "unknown" + ]; + const MULTI_WORD_TYPES = [ + "double precision", + "large object", + "with timezone", + "without timezone" + ]; + const TYPES3 = [ + "bigint", + "binary", + "blob", + "boolean", + "char", + "character", + "clob", + "date", + "dec", + "decfloat", + "decimal", + "float", + "int", + "integer", + "interval", + "nchar", + "nclob", + "national", + "numeric", + "real", + "row", + "smallint", + "time", + "timestamp", + "varchar", + "varying", + // modifier (character varying) + "varbinary" + ]; + const NON_RESERVED_WORDS = [ + "add", + "asc", + "collation", + "desc", + "final", + "first", + "last", + "view" + ]; + const RESERVED_WORDS = [ + "abs", + "acos", + "all", + "allocate", + "alter", + "and", + "any", + "are", + "array", + "array_agg", + "array_max_cardinality", + "as", + "asensitive", + "asin", + "asymmetric", + "at", + "atan", + "atomic", + "authorization", + "avg", + "begin", + "begin_frame", + "begin_partition", + "between", + "bigint", + "binary", + "blob", + "boolean", + "both", + "by", + "call", + "called", + "cardinality", + "cascaded", + "case", + "cast", + "ceil", + "ceiling", + "char", + "char_length", + "character", + "character_length", + "check", + "classifier", + "clob", + "close", + "coalesce", + "collate", + "collect", + "column", + "commit", + "condition", + "connect", + "constraint", + "contains", + "convert", + "copy", + "corr", + "corresponding", + "cos", + "cosh", + "count", + "covar_pop", + "covar_samp", + "create", + "cross", + "cube", + "cume_dist", + "current", + "current_catalog", + "current_date", + "current_default_transform_group", + "current_path", + "current_role", + "current_row", + "current_schema", + "current_time", + "current_timestamp", + "current_path", + "current_role", + "current_transform_group_for_type", + "current_user", + "cursor", + "cycle", + "date", + "day", + "deallocate", + "dec", + "decimal", + "decfloat", + "declare", + "default", + "define", + "delete", + "dense_rank", + "deref", + "describe", + "deterministic", + "disconnect", + "distinct", + "double", + "drop", + "dynamic", + "each", + "element", + "else", + "empty", + "end", + "end_frame", + "end_partition", + "end-exec", + "equals", + "escape", + "every", + "except", + "exec", + "execute", + "exists", + "exp", + "external", + "extract", + "false", + "fetch", + "filter", + "first_value", + "float", + "floor", + "for", + "foreign", + "frame_row", + "free", + "from", + "full", + "function", + "fusion", + "get", + "global", + "grant", + "group", + "grouping", + "groups", + "having", + "hold", + "hour", + "identity", + "in", + "indicator", + "initial", + "inner", + "inout", + "insensitive", + "insert", + "int", + "integer", + "intersect", + "intersection", + "interval", + "into", + "is", + "join", + "json_array", + "json_arrayagg", + "json_exists", + "json_object", + "json_objectagg", + "json_query", + "json_table", + "json_table_primitive", + "json_value", + "lag", + "language", + "large", + "last_value", + "lateral", + "lead", + "leading", + "left", + "like", + "like_regex", + "listagg", + "ln", + "local", + "localtime", + "localtimestamp", + "log", + "log10", + "lower", + "match", + "match_number", + "match_recognize", + "matches", + "max", + "member", + "merge", + "method", + "min", + "minute", + "mod", + "modifies", + "module", + "month", + "multiset", + "national", + "natural", + "nchar", + "nclob", + "new", + "no", + "none", + "normalize", + "not", + "nth_value", + "ntile", + "null", + "nullif", + "numeric", + "octet_length", + "occurrences_regex", + "of", + "offset", + "old", + "omit", + "on", + "one", + "only", + "open", + "or", + "order", + "out", + "outer", + "over", + "overlaps", + "overlay", + "parameter", + "partition", + "pattern", + "per", + "percent", + "percent_rank", + "percentile_cont", + "percentile_disc", + "period", + "portion", + "position", + "position_regex", + "power", + "precedes", + "precision", + "prepare", + "primary", + "procedure", + "ptf", + "range", + "rank", + "reads", + "real", + "recursive", + "ref", + "references", + "referencing", + "regr_avgx", + "regr_avgy", + "regr_count", + "regr_intercept", + "regr_r2", + "regr_slope", + "regr_sxx", + "regr_sxy", + "regr_syy", + "release", + "result", + "return", + "returns", + "revoke", + "right", + "rollback", + "rollup", + "row", + "row_number", + "rows", + "running", + "savepoint", + "scope", + "scroll", + "search", + "second", + "seek", + "select", + "sensitive", + "session_user", + "set", + "show", + "similar", + "sin", + "sinh", + "skip", + "smallint", + "some", + "specific", + "specifictype", + "sql", + "sqlexception", + "sqlstate", + "sqlwarning", + "sqrt", + "start", + "static", + "stddev_pop", + "stddev_samp", + "submultiset", + "subset", + "substring", + "substring_regex", + "succeeds", + "sum", + "symmetric", + "system", + "system_time", + "system_user", + "table", + "tablesample", + "tan", + "tanh", + "then", + "time", + "timestamp", + "timezone_hour", + "timezone_minute", + "to", + "trailing", + "translate", + "translate_regex", + "translation", + "treat", + "trigger", + "trim", + "trim_array", + "true", + "truncate", + "uescape", + "union", + "unique", + "unknown", + "unnest", + "update", + "upper", + "user", + "using", + "value", + "values", + "value_of", + "var_pop", + "var_samp", + "varbinary", + "varchar", + "varying", + "versioning", + "when", + "whenever", + "where", + "width_bucket", + "window", + "with", + "within", + "without", + "year" + ]; + const RESERVED_FUNCTIONS = [ + "abs", + "acos", + "array_agg", + "asin", + "atan", + "avg", + "cast", + "ceil", + "ceiling", + "coalesce", + "corr", + "cos", + "cosh", + "count", + "covar_pop", + "covar_samp", + "cume_dist", + "dense_rank", + "deref", + "element", + "exp", + "extract", + "first_value", + "floor", + "json_array", + "json_arrayagg", + "json_exists", + "json_object", + "json_objectagg", + "json_query", + "json_table", + "json_table_primitive", + "json_value", + "lag", + "last_value", + "lead", + "listagg", + "ln", + "log", + "log10", + "lower", + "max", + "min", + "mod", + "nth_value", + "ntile", + "nullif", + "percent_rank", + "percentile_cont", + "percentile_disc", + "position", + "position_regex", + "power", + "rank", + "regr_avgx", + "regr_avgy", + "regr_count", + "regr_intercept", + "regr_r2", + "regr_slope", + "regr_sxx", + "regr_sxy", + "regr_syy", + "row_number", + "sin", + "sinh", + "sqrt", + "stddev_pop", + "stddev_samp", + "substring", + "substring_regex", + "sum", + "tan", + "tanh", + "translate", + "translate_regex", + "treat", + "trim", + "trim_array", + "unnest", + "upper", + "value_of", + "var_pop", + "var_samp", + "width_bucket" + ]; + const POSSIBLE_WITHOUT_PARENS = [ + "current_catalog", + "current_date", + "current_default_transform_group", + "current_path", + "current_role", + "current_schema", + "current_transform_group_for_type", + "current_user", + "session_user", + "system_time", + "system_user", + "current_time", + "localtime", + "current_timestamp", + "localtimestamp" + ]; + const COMBOS = [ + "create table", + "insert into", + "primary key", + "foreign key", + "not null", + "alter table", + "add constraint", + "grouping sets", + "on overflow", + "character set", + "respect nulls", + "ignore nulls", + "nulls first", + "nulls last", + "depth first", + "breadth first" + ]; + const FUNCTIONS = RESERVED_FUNCTIONS; + const KEYWORDS3 = [ + ...RESERVED_WORDS, + ...NON_RESERVED_WORDS + ].filter((keyword) => { + return !RESERVED_FUNCTIONS.includes(keyword); + }); + const VARIABLE = { + className: "variable", + begin: /@[a-z0-9][a-z0-9_]*/ + }; + const OPERATOR = { + className: "operator", + begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, + relevance: 0 + }; + const FUNCTION_CALL = { + begin: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/), + relevance: 0, + keywords: { built_in: FUNCTIONS } + }; + function reduceRelevancy(list, { + exceptions, + when + } = {}) { + const qualifyFn = when; + exceptions = exceptions || []; + return list.map((item) => { + if (item.match(/\|\d+$/) || exceptions.includes(item)) { + return item; + } else if (qualifyFn(item)) { + return `${item}|0`; + } else { + return item; + } + }); + } + return { + name: "SQL", + case_insensitive: true, + // does not include {} or HTML tags ` x.length < 3 }), + literal: LITERALS3, + type: TYPES3, + built_in: POSSIBLE_WITHOUT_PARENS + }, + contains: [ + { + begin: regex.either(...COMBOS), + relevance: 0, + keywords: { + $pattern: /[\w\.]+/, + keyword: KEYWORDS3.concat(COMBOS), + literal: LITERALS3, + type: TYPES3 + } + }, + { + className: "type", + begin: regex.either(...MULTI_WORD_TYPES) + }, + FUNCTION_CALL, + VARIABLE, + STRING, + QUOTED_IDENTIFIER, + hljs.C_NUMBER_MODE, + hljs.C_BLOCK_COMMENT_MODE, + COMMENT_MODE, + OPERATOR + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/swift.js +function source2(re) { + if (!re) + return null; + if (typeof re === "string") + return re; + return re.source; +} +function lookahead2(re) { + return concat2("(?=", re, ")"); +} +function concat2(...args) { + const joined = args.map((x) => source2(x)).join(""); + return joined; +} +function stripOptionsFromArgs2(args) { + const opts = args[args.length - 1]; + if (typeof opts === "object" && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } +} +function either2(...args) { + const opts = stripOptionsFromArgs2(args); + const joined = "(" + (opts.capture ? "" : "?:") + args.map((x) => source2(x)).join("|") + ")"; + return joined; +} +var keywordWrapper = (keyword) => concat2( + /\b/, + keyword, + /\w$/.test(keyword) ? /\b/ : /\B/ +); +var dotKeywords = [ + "Protocol", + // contextual + "Type" + // contextual +].map(keywordWrapper); +var optionalDotKeywords = [ + "init", + "self" +].map(keywordWrapper); +var keywordTypes = [ + "Any", + "Self" +]; +var keywords = [ + // strings below will be fed into the regular `keywords` engine while regex + // will result in additional modes being created to scan for those keywords to + // avoid conflicts with other rules + "actor", + "any", + // contextual + "associatedtype", + "async", + "await", + /as\?/, + // operator + /as!/, + // operator + "as", + // operator + "break", + "case", + "catch", + "class", + "continue", + "convenience", + // contextual + "default", + "defer", + "deinit", + "didSet", + // contextual + "distributed", + "do", + "dynamic", + // contextual + "else", + "enum", + "extension", + "fallthrough", + /fileprivate\(set\)/, + "fileprivate", + "final", + // contextual + "for", + "func", + "get", + // contextual + "guard", + "if", + "import", + "indirect", + // contextual + "infix", + // contextual + /init\?/, + /init!/, + "inout", + /internal\(set\)/, + "internal", + "in", + "is", + // operator + "isolated", + // contextual + "nonisolated", + // contextual + "lazy", + // contextual + "let", + "mutating", + // contextual + "nonmutating", + // contextual + /open\(set\)/, + // contextual + "open", + // contextual + "operator", + "optional", + // contextual + "override", + // contextual + "postfix", + // contextual + "precedencegroup", + "prefix", + // contextual + /private\(set\)/, + "private", + "protocol", + /public\(set\)/, + "public", + "repeat", + "required", + // contextual + "rethrows", + "return", + "set", + // contextual + "some", + // contextual + "static", + "struct", + "subscript", + "super", + "switch", + "throws", + "throw", + /try\?/, + // operator + /try!/, + // operator + "try", + // operator + "typealias", + /unowned\(safe\)/, + // contextual + /unowned\(unsafe\)/, + // contextual + "unowned", + // contextual + "var", + "weak", + // contextual + "where", + "while", + "willSet" + // contextual +]; +var literals = [ + "false", + "nil", + "true" +]; +var precedencegroupKeywords = [ + "assignment", + "associativity", + "higherThan", + "left", + "lowerThan", + "none", + "right" +]; +var numberSignKeywords = [ + "#colorLiteral", + "#column", + "#dsohandle", + "#else", + "#elseif", + "#endif", + "#error", + "#file", + "#fileID", + "#fileLiteral", + "#filePath", + "#function", + "#if", + "#imageLiteral", + "#keyPath", + "#line", + "#selector", + "#sourceLocation", + "#warn_unqualified_access", + "#warning" +]; +var builtIns = [ + "abs", + "all", + "any", + "assert", + "assertionFailure", + "debugPrint", + "dump", + "fatalError", + "getVaList", + "isKnownUniquelyReferenced", + "max", + "min", + "numericCast", + "pointwiseMax", + "pointwiseMin", + "precondition", + "preconditionFailure", + "print", + "readLine", + "repeatElement", + "sequence", + "stride", + "swap", + "swift_unboxFromSwiftValueWithType", + "transcode", + "type", + "unsafeBitCast", + "unsafeDowncast", + "withExtendedLifetime", + "withUnsafeMutablePointer", + "withUnsafePointer", + "withVaList", + "withoutActuallyEscaping", + "zip" +]; +var operatorHead = either2( + /[/=\-+!*%<>&|^~?]/, + /[\u00A1-\u00A7]/, + /[\u00A9\u00AB]/, + /[\u00AC\u00AE]/, + /[\u00B0\u00B1]/, + /[\u00B6\u00BB\u00BF\u00D7\u00F7]/, + /[\u2016-\u2017]/, + /[\u2020-\u2027]/, + /[\u2030-\u203E]/, + /[\u2041-\u2053]/, + /[\u2055-\u205E]/, + /[\u2190-\u23FF]/, + /[\u2500-\u2775]/, + /[\u2794-\u2BFF]/, + /[\u2E00-\u2E7F]/, + /[\u3001-\u3003]/, + /[\u3008-\u3020]/, + /[\u3030]/ +); +var operatorCharacter = either2( + operatorHead, + /[\u0300-\u036F]/, + /[\u1DC0-\u1DFF]/, + /[\u20D0-\u20FF]/, + /[\uFE00-\uFE0F]/, + /[\uFE20-\uFE2F]/ + // TODO: The following characters are also allowed, but the regex isn't supported yet. + // /[\u{E0100}-\u{E01EF}]/u +); +var operator = concat2(operatorHead, operatorCharacter, "*"); +var identifierHead = either2( + /[a-zA-Z_]/, + /[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/, + /[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/, + /[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/, + /[\u1E00-\u1FFF]/, + /[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/, + /[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/, + /[\u2C00-\u2DFF\u2E80-\u2FFF]/, + /[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/, + /[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/, + /[\uFE47-\uFEFE\uFF00-\uFFFD]/ + // Should be /[\uFE47-\uFFFD]/, but we have to exclude FEFF. + // The following characters are also allowed, but the regexes aren't supported yet. + // /[\u{10000}-\u{1FFFD}\u{20000-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}]/u, + // /[\u{50000}-\u{5FFFD}\u{60000-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}]/u, + // /[\u{90000}-\u{9FFFD}\u{A0000-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}]/u, + // /[\u{D0000}-\u{DFFFD}\u{E0000-\u{EFFFD}]/u +); +var identifierCharacter = either2( + identifierHead, + /\d/, + /[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/ +); +var identifier = concat2(identifierHead, identifierCharacter, "*"); +var typeIdentifier = concat2(/[A-Z]/, identifierCharacter, "*"); +var keywordAttributes = [ + "autoclosure", + concat2(/convention\(/, either2("swift", "block", "c"), /\)/), + "discardableResult", + "dynamicCallable", + "dynamicMemberLookup", + "escaping", + "frozen", + "GKInspectable", + "IBAction", + "IBDesignable", + "IBInspectable", + "IBOutlet", + "IBSegueAction", + "inlinable", + "main", + "nonobjc", + "NSApplicationMain", + "NSCopying", + "NSManaged", + concat2(/objc\(/, identifier, /\)/), + "objc", + "objcMembers", + "propertyWrapper", + "requires_stored_property_inits", + "resultBuilder", + "testable", + "UIApplicationMain", + "unknown", + "usableFromInline" +]; +var availabilityKeywords = [ + "iOS", + "iOSApplicationExtension", + "macOS", + "macOSApplicationExtension", + "macCatalyst", + "macCatalystApplicationExtension", + "watchOS", + "watchOSApplicationExtension", + "tvOS", + "tvOSApplicationExtension", + "swift" +]; +function swift(hljs) { + const WHITESPACE = { + match: /\s+/, + relevance: 0 + }; + const BLOCK_COMMENT = hljs.COMMENT( + "/\\*", + "\\*/", + { contains: ["self"] } + ); + const COMMENTS = [ + hljs.C_LINE_COMMENT_MODE, + BLOCK_COMMENT + ]; + const DOT_KEYWORD = { + match: [ + /\./, + either2(...dotKeywords, ...optionalDotKeywords) + ], + className: { 2: "keyword" } + }; + const KEYWORD_GUARD = { + // Consume .keyword to prevent highlighting properties and methods as keywords. + match: concat2(/\./, either2(...keywords)), + relevance: 0 + }; + const PLAIN_KEYWORDS = keywords.filter((kw) => typeof kw === "string").concat(["_|0"]); + const REGEX_KEYWORDS = keywords.filter((kw) => typeof kw !== "string").concat(keywordTypes).map(keywordWrapper); + const KEYWORD = { variants: [ + { + className: "keyword", + match: either2(...REGEX_KEYWORDS, ...optionalDotKeywords) + } + ] }; + const KEYWORDS3 = { + $pattern: either2( + /\b\w+/, + // regular keywords + /#\w+/ + // number keywords + ), + keyword: PLAIN_KEYWORDS.concat(numberSignKeywords), + literal: literals + }; + const KEYWORD_MODES = [ + DOT_KEYWORD, + KEYWORD_GUARD, + KEYWORD + ]; + const BUILT_IN_GUARD = { + // Consume .built_in to prevent highlighting properties and methods. + match: concat2(/\./, either2(...builtIns)), + relevance: 0 + }; + const BUILT_IN = { + className: "built_in", + match: concat2(/\b/, either2(...builtIns), /(?=\()/) + }; + const BUILT_INS3 = [ + BUILT_IN_GUARD, + BUILT_IN + ]; + const OPERATOR_GUARD = { + // Prevent -> from being highlighting as an operator. + match: /->/, + relevance: 0 + }; + const OPERATOR = { + className: "operator", + relevance: 0, + variants: [ + { match: operator }, + { + // dot-operator: only operators that start with a dot are allowed to use dots as + // characters (..., ...<, .*, etc). So there rule here is: a dot followed by one or more + // characters that may also include dots. + match: `\\.(\\.|${operatorCharacter})+` + } + ] + }; + const OPERATORS = [ + OPERATOR_GUARD, + OPERATOR + ]; + const decimalDigits3 = "([0-9]_*)+"; + const hexDigits3 = "([0-9a-fA-F]_*)+"; + const NUMBER = { + className: "number", + relevance: 0, + variants: [ + // decimal floating-point-literal (subsumes decimal-literal) + { match: `\\b(${decimalDigits3})(\\.(${decimalDigits3}))?([eE][+-]?(${decimalDigits3}))?\\b` }, + // hexadecimal floating-point-literal (subsumes hexadecimal-literal) + { match: `\\b0x(${hexDigits3})(\\.(${hexDigits3}))?([pP][+-]?(${decimalDigits3}))?\\b` }, + // octal-literal + { match: /\b0o([0-7]_*)+\b/ }, + // binary-literal + { match: /\b0b([01]_*)+\b/ } + ] + }; + const ESCAPED_CHARACTER = (rawDelimiter = "") => ({ + className: "subst", + variants: [ + { match: concat2(/\\/, rawDelimiter, /[0\\tnr"']/) }, + { match: concat2(/\\/, rawDelimiter, /u\{[0-9a-fA-F]{1,8}\}/) } + ] + }); + const ESCAPED_NEWLINE = (rawDelimiter = "") => ({ + className: "subst", + match: concat2(/\\/, rawDelimiter, /[\t ]*(?:[\r\n]|\r\n)/) + }); + const INTERPOLATION = (rawDelimiter = "") => ({ + className: "subst", + label: "interpol", + begin: concat2(/\\/, rawDelimiter, /\(/), + end: /\)/ + }); + const MULTILINE_STRING = (rawDelimiter = "") => ({ + begin: concat2(rawDelimiter, /"""/), + end: concat2(/"""/, rawDelimiter), + contains: [ + ESCAPED_CHARACTER(rawDelimiter), + ESCAPED_NEWLINE(rawDelimiter), + INTERPOLATION(rawDelimiter) + ] + }); + const SINGLE_LINE_STRING = (rawDelimiter = "") => ({ + begin: concat2(rawDelimiter, /"/), + end: concat2(/"/, rawDelimiter), + contains: [ + ESCAPED_CHARACTER(rawDelimiter), + INTERPOLATION(rawDelimiter) + ] + }); + const STRING = { + className: "string", + variants: [ + MULTILINE_STRING(), + MULTILINE_STRING("#"), + MULTILINE_STRING("##"), + MULTILINE_STRING("###"), + SINGLE_LINE_STRING(), + SINGLE_LINE_STRING("#"), + SINGLE_LINE_STRING("##"), + SINGLE_LINE_STRING("###") + ] + }; + const QUOTED_IDENTIFIER = { match: concat2(/`/, identifier, /`/) }; + const IMPLICIT_PARAMETER = { + className: "variable", + match: /\$\d+/ + }; + const PROPERTY_WRAPPER_PROJECTION = { + className: "variable", + match: `\\$${identifierCharacter}+` + }; + const IDENTIFIERS = [ + QUOTED_IDENTIFIER, + IMPLICIT_PARAMETER, + PROPERTY_WRAPPER_PROJECTION + ]; + const AVAILABLE_ATTRIBUTE = { + match: /(@|#(un)?)available/, + className: "keyword", + starts: { contains: [ + { + begin: /\(/, + end: /\)/, + keywords: availabilityKeywords, + contains: [ + ...OPERATORS, + NUMBER, + STRING + ] + } + ] } + }; + const KEYWORD_ATTRIBUTE = { + className: "keyword", + match: concat2(/@/, either2(...keywordAttributes)) + }; + const USER_DEFINED_ATTRIBUTE = { + className: "meta", + match: concat2(/@/, identifier) + }; + const ATTRIBUTES4 = [ + AVAILABLE_ATTRIBUTE, + KEYWORD_ATTRIBUTE, + USER_DEFINED_ATTRIBUTE + ]; + const TYPE = { + match: lookahead2(/\b[A-Z]/), + relevance: 0, + contains: [ + { + // Common Apple frameworks, for relevance boost + className: "type", + match: concat2(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/, identifierCharacter, "+") + }, + { + // Type identifier + className: "type", + match: typeIdentifier, + relevance: 0 + }, + { + // Optional type + match: /[?!]+/, + relevance: 0 + }, + { + // Variadic parameter + match: /\.\.\./, + relevance: 0 + }, + { + // Protocol composition + match: concat2(/\s+&\s+/, lookahead2(typeIdentifier)), + relevance: 0 + } + ] + }; + const GENERIC_ARGUMENTS = { + begin: //, + keywords: KEYWORDS3, + contains: [ + ...COMMENTS, + ...KEYWORD_MODES, + ...ATTRIBUTES4, + OPERATOR_GUARD, + TYPE + ] + }; + TYPE.contains.push(GENERIC_ARGUMENTS); + const TUPLE_ELEMENT_NAME = { + match: concat2(identifier, /\s*:/), + keywords: "_|0", + relevance: 0 + }; + const TUPLE = { + begin: /\(/, + end: /\)/, + relevance: 0, + keywords: KEYWORDS3, + contains: [ + "self", + TUPLE_ELEMENT_NAME, + ...COMMENTS, + ...KEYWORD_MODES, + ...BUILT_INS3, + ...OPERATORS, + NUMBER, + STRING, + ...IDENTIFIERS, + ...ATTRIBUTES4, + TYPE + ] + }; + const GENERIC_PARAMETERS = { + begin: //, + contains: [ + ...COMMENTS, + TYPE + ] + }; + const FUNCTION_PARAMETER_NAME = { + begin: either2( + lookahead2(concat2(identifier, /\s*:/)), + lookahead2(concat2(identifier, /\s+/, identifier, /\s*:/)) + ), + end: /:/, + relevance: 0, + contains: [ + { + className: "keyword", + match: /\b_\b/ + }, + { + className: "params", + match: identifier + } + ] + }; + const FUNCTION_PARAMETERS = { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS3, + contains: [ + FUNCTION_PARAMETER_NAME, + ...COMMENTS, + ...KEYWORD_MODES, + ...OPERATORS, + NUMBER, + STRING, + ...ATTRIBUTES4, + TYPE, + TUPLE + ], + endsParent: true, + illegal: /["']/ + }; + const FUNCTION = { + match: [ + /func/, + /\s+/, + either2(QUOTED_IDENTIFIER.match, identifier, operator) + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + GENERIC_PARAMETERS, + FUNCTION_PARAMETERS, + WHITESPACE + ], + illegal: [ + /\[/, + /%/ + ] + }; + const INIT_SUBSCRIPT = { + match: [ + /\b(?:subscript|init[?!]?)/, + /\s*(?=[<(])/ + ], + className: { 1: "keyword" }, + contains: [ + GENERIC_PARAMETERS, + FUNCTION_PARAMETERS, + WHITESPACE + ], + illegal: /\[|%/ + }; + const OPERATOR_DECLARATION = { + match: [ + /operator/, + /\s+/, + operator + ], + className: { + 1: "keyword", + 3: "title" + } + }; + const PRECEDENCEGROUP = { + begin: [ + /precedencegroup/, + /\s+/, + typeIdentifier + ], + className: { + 1: "keyword", + 3: "title" + }, + contains: [TYPE], + keywords: [ + ...precedencegroupKeywords, + ...literals + ], + end: /}/ + }; + for (const variant of STRING.variants) { + const interpolation = variant.contains.find((mode) => mode.label === "interpol"); + interpolation.keywords = KEYWORDS3; + const submodes = [ + ...KEYWORD_MODES, + ...BUILT_INS3, + ...OPERATORS, + NUMBER, + STRING, + ...IDENTIFIERS + ]; + interpolation.contains = [ + ...submodes, + { + begin: /\(/, + end: /\)/, + contains: [ + "self", + ...submodes + ] + } + ]; + } + return { + name: "Swift", + keywords: KEYWORDS3, + contains: [ + ...COMMENTS, + FUNCTION, + INIT_SUBSCRIPT, + { + beginKeywords: "struct protocol class extension enum actor", + end: "\\{", + excludeEnd: true, + keywords: KEYWORDS3, + contains: [ + hljs.inherit(hljs.TITLE_MODE, { + className: "title.class", + begin: /[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/ + }), + ...KEYWORD_MODES + ] + }, + OPERATOR_DECLARATION, + PRECEDENCEGROUP, + { + beginKeywords: "import", + end: /$/, + contains: [...COMMENTS], + relevance: 0 + }, + ...KEYWORD_MODES, + ...BUILT_INS3, + ...OPERATORS, + NUMBER, + STRING, + ...IDENTIFIERS, + ...ATTRIBUTES4, + TYPE, + TUPLE + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/typescript.js +var IDENT_RE3 = "[A-Za-z$_][0-9A-Za-z$_]*"; +var KEYWORDS2 = [ + "as", + // for exports + "in", + "of", + "if", + "for", + "while", + "finally", + "var", + "new", + "function", + "do", + "return", + "void", + "else", + "break", + "catch", + "instanceof", + "with", + "throw", + "case", + "default", + "try", + "switch", + "continue", + "typeof", + "delete", + "let", + "yield", + "const", + "class", + // JS handles these with a special rule + // "get", + // "set", + "debugger", + "async", + "await", + "static", + "import", + "from", + "export", + "extends" +]; +var LITERALS2 = [ + "true", + "false", + "null", + "undefined", + "NaN", + "Infinity" +]; +var TYPES2 = [ + // Fundamental objects + "Object", + "Function", + "Boolean", + "Symbol", + // numbers and dates + "Math", + "Date", + "Number", + "BigInt", + // text + "String", + "RegExp", + // Indexed collections + "Array", + "Float32Array", + "Float64Array", + "Int8Array", + "Uint8Array", + "Uint8ClampedArray", + "Int16Array", + "Int32Array", + "Uint16Array", + "Uint32Array", + "BigInt64Array", + "BigUint64Array", + // Keyed collections + "Set", + "Map", + "WeakSet", + "WeakMap", + // Structured data + "ArrayBuffer", + "SharedArrayBuffer", + "Atomics", + "DataView", + "JSON", + // Control abstraction objects + "Promise", + "Generator", + "GeneratorFunction", + "AsyncFunction", + // Reflection + "Reflect", + "Proxy", + // Internationalization + "Intl", + // WebAssembly + "WebAssembly" +]; +var ERROR_TYPES2 = [ + "Error", + "EvalError", + "InternalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" +]; +var BUILT_IN_GLOBALS2 = [ + "setInterval", + "setTimeout", + "clearInterval", + "clearTimeout", + "require", + "exports", + "eval", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "decodeURI", + "decodeURIComponent", + "encodeURI", + "encodeURIComponent", + "escape", + "unescape" +]; +var BUILT_IN_VARIABLES2 = [ + "arguments", + "this", + "super", + "console", + "window", + "document", + "localStorage", + "sessionStorage", + "module", + "global" + // Node.js +]; +var BUILT_INS2 = [].concat( + BUILT_IN_GLOBALS2, + TYPES2, + ERROR_TYPES2 +); +function javascript2(hljs) { + const regex = hljs.regex; + const hasClosingTag = (match, { after }) => { + const tag = "", + end: "" + }; + const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/; + const XML_TAG = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/, + /** + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + isTrulyOpeningTag: (match, response) => { + const afterMatchIndex = match[0].length + match.index; + const nextChar = match.input[afterMatchIndex]; + if ( + // HTML should not include another raw `<` inside a tag + // nested type? + // `>`, etc. + nextChar === "<" || // the , gives away that this is not HTML + // `` + nextChar === "," + ) { + response.ignoreMatch(); + return; + } + if (nextChar === ">") { + if (!hasClosingTag(match, { after: afterMatchIndex })) { + response.ignoreMatch(); + } + } + let m; + const afterMatch = match.input.substring(afterMatchIndex); + if (m = afterMatch.match(/^\s*=/)) { + response.ignoreMatch(); + return; + } + if (m = afterMatch.match(/^\s+extends\s+/)) { + if (m.index === 0) { + response.ignoreMatch(); + return; + } + } + } + }; + const KEYWORDS$1 = { + $pattern: IDENT_RE3, + keyword: KEYWORDS2, + literal: LITERALS2, + built_in: BUILT_INS2, + "variable.language": BUILT_IN_VARIABLES2 + }; + const decimalDigits3 = "[0-9](_?[0-9])*"; + const frac3 = `\\.(${decimalDigits3})`; + const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; + const NUMBER = { + className: "number", + variants: [ + // DecimalLiteral + { begin: `(\\b(${decimalInteger})((${frac3})|\\.)?|(${frac3}))[eE][+-]?(${decimalDigits3})\\b` }, + { begin: `\\b(${decimalInteger})\\b((${frac3})\\b|\\.)?|(${frac3})\\b` }, + // DecimalBigIntegerLiteral + { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, + // NonDecimalIntegerLiteral + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, + // LegacyOctalIntegerLiteral (does not include underscore separators) + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + { begin: "\\b0[0-7]+n?\\b" } + ], + relevance: 0 + }; + const SUBST = { + className: "subst", + begin: "\\$\\{", + end: "\\}", + keywords: KEYWORDS$1, + contains: [] + // defined later + }; + const HTML_TEMPLATE = { + begin: "html`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: "xml" + } + }; + const CSS_TEMPLATE = { + begin: "css`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: "css" + } + }; + const GRAPHQL_TEMPLATE = { + begin: "gql`", + end: "", + starts: { + end: "`", + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: "graphql" + } + }; + const TEMPLATE_STRING = { + className: "string", + begin: "`", + end: "`", + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ] + }; + const JSDOC_COMMENT = hljs.COMMENT( + /\/\*\*(?!\/)/, + "\\*/", + { + relevance: 0, + contains: [ + { + begin: "(?=@[A-Za-z]+)", + relevance: 0, + contains: [ + { + className: "doctag", + begin: "@[A-Za-z]+" + }, + { + className: "type", + begin: "\\{", + end: "\\}", + excludeEnd: true, + excludeBegin: true, + relevance: 0 + }, + { + className: "variable", + begin: IDENT_RE$1 + "(?=\\s*(-)|$)", + endsParent: true, + relevance: 0 + }, + // eat spaces (not newlines) so we can find + // types or variables + { + begin: /(?=[^\n])\s/, + relevance: 0 + } + ] + } + ] + } + ); + const COMMENT2 = { + className: "comment", + variants: [ + JSDOC_COMMENT, + hljs.C_BLOCK_COMMENT_MODE, + hljs.C_LINE_COMMENT_MODE + ] + }; + const SUBST_INTERNALS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER + // This is intentional: + // See https://github.com/highlightjs/highlight.js/issues/3288 + // hljs.REGEXP_MODE + ]; + SUBST.contains = SUBST_INTERNALS.concat({ + // we need to pair up {} inside our subst to prevent + // it from ending too early by matching another } + begin: /\{/, + end: /\}/, + keywords: KEYWORDS$1, + contains: [ + "self" + ].concat(SUBST_INTERNALS) + }); + const SUBST_AND_COMMENTS = [].concat(COMMENT2, SUBST.contains); + const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ + // eat recursive parens in sub expressions + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS$1, + contains: ["self"].concat(SUBST_AND_COMMENTS) + } + ]); + const PARAMS = { + className: "params", + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + }; + const CLASS_OR_EXTENDS = { + variants: [ + // class Car extends vehicle + { + match: [ + /class/, + /\s+/, + IDENT_RE$1, + /\s+/, + /extends/, + /\s+/, + regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*") + ], + scope: { + 1: "keyword", + 3: "title.class", + 5: "keyword", + 7: "title.class.inherited" + } + }, + // class Car + { + match: [ + /class/, + /\s+/, + IDENT_RE$1 + ], + scope: { + 1: "keyword", + 3: "title.class" + } + } + ] + }; + const CLASS_REFERENCE = { + relevance: 0, + match: regex.either( + // Hard coded exceptions + /\bJSON/, + // Float32Array, OutT + /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, + // CSSFactory, CSSFactoryT + /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, + // FPs, FPsT + /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/ + // P + // single letters are not highlighted + // BLAH + // this will be flagged as a UPPER_CASE_CONSTANT instead + ), + className: "title.class", + keywords: { + _: [ + // se we still get relevance credit for JS library classes + ...TYPES2, + ...ERROR_TYPES2 + ] + } + }; + const USE_STRICT = { + label: "use_strict", + className: "meta", + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/ + }; + const FUNCTION_DEFINITION = { + variants: [ + { + match: [ + /function/, + /\s+/, + IDENT_RE$1, + /(?=\s*\()/ + ] + }, + // anonymous function + { + match: [ + /function/, + /\s*(?=\()/ + ] + } + ], + className: { + 1: "keyword", + 3: "title.function" + }, + label: "func.def", + contains: [PARAMS], + illegal: /%/ + }; + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }; + function noneOf(list) { + return regex.concat("(?!", list.join("|"), ")"); + } + const FUNCTION_CALL = { + match: regex.concat( + /\b/, + noneOf([ + ...BUILT_IN_GLOBALS2, + "super", + "import" + ]), + IDENT_RE$1, + regex.lookahead(/\(/) + ), + className: "title.function", + relevance: 0 + }; + const PROPERTY_ACCESS = { + begin: regex.concat(/\./, regex.lookahead( + regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/) + )), + end: IDENT_RE$1, + excludeBegin: true, + keywords: "prototype", + className: "property", + relevance: 0 + }; + const GETTER_OR_SETTER = { + match: [ + /get|set/, + /\s+/, + IDENT_RE$1, + /(?=\()/ + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + { + // eat to avoid empty params + begin: /\(\)/ + }, + PARAMS + ] + }; + const FUNC_LEAD_IN_RE = "(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|" + hljs.UNDERSCORE_IDENT_RE + ")\\s*=>"; + const FUNCTION_VARIABLE = { + match: [ + /const|var|let/, + /\s+/, + IDENT_RE$1, + /\s*/, + /=\s*/, + /(async\s*)?/, + // async is optional + regex.lookahead(FUNC_LEAD_IN_RE) + ], + keywords: "async", + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + PARAMS + ] + }; + return { + name: "JavaScript", + aliases: ["js", "jsx", "mjs", "cjs"], + keywords: KEYWORDS$1, + // this will be extended by TypeScript + exports: { PARAMS_CONTAINS, CLASS_REFERENCE }, + illegal: /#(?![$_A-z])/, + contains: [ + hljs.SHEBANG({ + label: "shebang", + binary: "node", + relevance: 5 + }), + USE_STRICT, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + GRAPHQL_TEMPLATE, + TEMPLATE_STRING, + COMMENT2, + // Skip numbers when they are part of a variable name + { match: /\$\d+/ }, + NUMBER, + CLASS_REFERENCE, + { + className: "attr", + begin: IDENT_RE$1 + regex.lookahead(":"), + relevance: 0 + }, + FUNCTION_VARIABLE, + { + // "value" container + begin: "(" + hljs.RE_STARTERS_RE + "|\\b(case|return|throw)\\b)\\s*", + keywords: "return throw case", + relevance: 0, + contains: [ + COMMENT2, + hljs.REGEXP_MODE, + { + className: "function", + // we have to count the parens to make sure we actually have the + // correct bounding ( ) before the =>. There could be any number of + // sub-expressions inside also surrounded by parens. + begin: FUNC_LEAD_IN_RE, + returnBegin: true, + end: "\\s*=>", + contains: [ + { + className: "params", + variants: [ + { + begin: hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + }, + { + className: null, + begin: /\(\s*\)/, + skip: true + }, + { + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + } + ] + } + ] + }, + { + // could be a comma delimited list of params to a function call + begin: /,/, + relevance: 0 + }, + { + match: /\s+/, + relevance: 0 + }, + { + // JSX + variants: [ + { begin: FRAGMENT.begin, end: FRAGMENT.end }, + { match: XML_SELF_CLOSING }, + { + begin: XML_TAG.begin, + // we carefully check the opening tag to see if it truly + // is a tag and not a false positive + "on:begin": XML_TAG.isTrulyOpeningTag, + end: XML_TAG.end + } + ], + subLanguage: "xml", + contains: [ + { + begin: XML_TAG.begin, + end: XML_TAG.end, + skip: true, + contains: ["self"] + } + ] + } + ] + }, + FUNCTION_DEFINITION, + { + // prevent this from getting swallowed up by function + // since they appear "function like" + beginKeywords: "while if switch catch for" + }, + { + // we have to count the parens to make sure we actually have the correct + // bounding ( ). There could be any number of sub-expressions inside + // also surrounded by parens. + begin: "\\b(?!function)" + hljs.UNDERSCORE_IDENT_RE + "\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", + // end parens + returnBegin: true, + label: "func.def", + contains: [ + PARAMS, + hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" }) + ] + }, + // catch ... so it won't trigger the property rule below + { + match: /\.\.\./, + relevance: 0 + }, + PROPERTY_ACCESS, + // hack: prevents detection of keywords in some circumstances + // .keyword() + // $keyword = x + { + match: "\\$" + IDENT_RE$1, + relevance: 0 + }, + { + match: [/\bconstructor(?=\s*\()/], + className: { 1: "title.function" }, + contains: [PARAMS] + }, + FUNCTION_CALL, + UPPER_CASE_CONSTANT, + CLASS_OR_EXTENDS, + GETTER_OR_SETTER, + { + match: /\$[(.]/ + // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` + } + ] + }; +} +function typescript(hljs) { + const tsLanguage = javascript2(hljs); + const IDENT_RE$1 = IDENT_RE3; + const TYPES3 = [ + "any", + "void", + "number", + "boolean", + "string", + "object", + "never", + "symbol", + "bigint", + "unknown" + ]; + const NAMESPACE = { + beginKeywords: "namespace", + end: /\{/, + excludeEnd: true, + contains: [tsLanguage.exports.CLASS_REFERENCE] + }; + const INTERFACE = { + beginKeywords: "interface", + end: /\{/, + excludeEnd: true, + keywords: { + keyword: "interface extends", + built_in: TYPES3 + }, + contains: [tsLanguage.exports.CLASS_REFERENCE] + }; + const USE_STRICT = { + className: "meta", + relevance: 10, + begin: /^\s*['"]use strict['"]/ + }; + const TS_SPECIFIC_KEYWORDS = [ + "type", + "namespace", + "interface", + "public", + "private", + "protected", + "implements", + "declare", + "abstract", + "readonly", + "enum", + "override" + ]; + const KEYWORDS$1 = { + $pattern: IDENT_RE3, + keyword: KEYWORDS2.concat(TS_SPECIFIC_KEYWORDS), + literal: LITERALS2, + built_in: BUILT_INS2.concat(TYPES3), + "variable.language": BUILT_IN_VARIABLES2 + }; + const DECORATOR = { + className: "meta", + begin: "@" + IDENT_RE$1 + }; + const swapMode = (mode, label, replacement) => { + const indx = mode.contains.findIndex((m) => m.label === label); + if (indx === -1) { + throw new Error("can not find mode to replace"); + } + mode.contains.splice(indx, 1, replacement); + }; + Object.assign(tsLanguage.keywords, KEYWORDS$1); + tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR); + tsLanguage.contains = tsLanguage.contains.concat([ + DECORATOR, + NAMESPACE, + INTERFACE + ]); + swapMode(tsLanguage, "shebang", hljs.SHEBANG()); + swapMode(tsLanguage, "use_strict", USE_STRICT); + const functionDeclaration = tsLanguage.contains.find((m) => m.label === "func.def"); + functionDeclaration.relevance = 0; + Object.assign(tsLanguage, { + name: "TypeScript", + aliases: [ + "ts", + "tsx", + "mts", + "cts" + ] + }); + return tsLanguage; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/vbnet.js +function vbnet(hljs) { + const regex = hljs.regex; + const CHARACTER = { + className: "string", + begin: /"(""|[^/n])"C\b/ + }; + const STRING = { + className: "string", + begin: /"/, + end: /"/, + illegal: /\n/, + contains: [ + { + // double quote escape + begin: /""/ + } + ] + }; + const MM_DD_YYYY = /\d{1,2}\/\d{1,2}\/\d{4}/; + const YYYY_MM_DD = /\d{4}-\d{1,2}-\d{1,2}/; + const TIME_12H = /(\d|1[012])(:\d+){0,2} *(AM|PM)/; + const TIME_24H = /\d{1,2}(:\d{1,2}){1,2}/; + const DATE = { + className: "literal", + variants: [ + { + // #YYYY-MM-DD# (ISO-Date) or #M/D/YYYY# (US-Date) + begin: regex.concat(/# */, regex.either(YYYY_MM_DD, MM_DD_YYYY), / *#/) + }, + { + // #H:mm[:ss]# (24h Time) + begin: regex.concat(/# */, TIME_24H, / *#/) + }, + { + // #h[:mm[:ss]] A# (12h Time) + begin: regex.concat(/# */, TIME_12H, / *#/) + }, + { + // date plus time + begin: regex.concat( + /# */, + regex.either(YYYY_MM_DD, MM_DD_YYYY), + / +/, + regex.either(TIME_12H, TIME_24H), + / *#/ + ) + } + ] + }; + const NUMBER = { + className: "number", + relevance: 0, + variants: [ + { + // Float + begin: /\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ + }, + { + // Integer (base 10) + begin: /\b\d[\d_]*((U?[SIL])|[%&])?/ + }, + { + // Integer (base 16) + begin: /&H[\dA-F_]+((U?[SIL])|[%&])?/ + }, + { + // Integer (base 8) + begin: /&O[0-7_]+((U?[SIL])|[%&])?/ + }, + { + // Integer (base 2) + begin: /&B[01_]+((U?[SIL])|[%&])?/ + } + ] + }; + const LABEL = { + className: "label", + begin: /^\w+:/ + }; + const DOC_COMMENT = hljs.COMMENT(/'''/, /$/, { contains: [ + { + className: "doctag", + begin: /<\/?/, + end: />/ + } + ] }); + const COMMENT2 = hljs.COMMENT(null, /$/, { variants: [ + { begin: /'/ }, + { + // TODO: Use multi-class for leading spaces + begin: /([\t ]|^)REM(?=\s)/ + } + ] }); + const DIRECTIVES = { + className: "meta", + // TODO: Use multi-class for indentation once available + begin: /[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, + end: /$/, + keywords: { keyword: "const disable else elseif enable end externalsource if region then" }, + contains: [COMMENT2] + }; + return { + name: "Visual Basic .NET", + aliases: ["vb"], + case_insensitive: true, + classNameAliases: { label: "symbol" }, + keywords: { + keyword: "addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", + built_in: ( + // Operators https://docs.microsoft.com/dotnet/visual-basic/language-reference/operators + "addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort" + ), + type: ( + // Data types https://docs.microsoft.com/dotnet/visual-basic/language-reference/data-types + "boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort" + ), + literal: "true false nothing" + }, + illegal: "//|\\{|\\}|endif|gosub|variant|wend|^\\$ ", + contains: [ + CHARACTER, + STRING, + DATE, + NUMBER, + LABEL, + DOC_COMMENT, + COMMENT2, + DIRECTIVES + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/wasm.js +function wasm(hljs) { + hljs.regex; + const BLOCK_COMMENT = hljs.COMMENT(/\(;/, /;\)/); + BLOCK_COMMENT.contains.push("self"); + const LINE_COMMENT = hljs.COMMENT(/;;/, /$/); + const KWS = [ + "anyfunc", + "block", + "br", + "br_if", + "br_table", + "call", + "call_indirect", + "data", + "drop", + "elem", + "else", + "end", + "export", + "func", + "global.get", + "global.set", + "local.get", + "local.set", + "local.tee", + "get_global", + "get_local", + "global", + "if", + "import", + "local", + "loop", + "memory", + "memory.grow", + "memory.size", + "module", + "mut", + "nop", + "offset", + "param", + "result", + "return", + "select", + "set_global", + "set_local", + "start", + "table", + "tee_local", + "then", + "type", + "unreachable" + ]; + const FUNCTION_REFERENCE = { + begin: [ + /(?:func|call|call_indirect)/, + /\s+/, + /\$[^\s)]+/ + ], + className: { + 1: "keyword", + 3: "title.function" + } + }; + const ARGUMENT = { + className: "variable", + begin: /\$[\w_]+/ + }; + const PARENS = { + match: /(\((?!;)|\))+/, + className: "punctuation", + relevance: 0 + }; + const NUMBER = { + className: "number", + relevance: 0, + // borrowed from Prism, TODO: split out into variants + match: /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ + }; + const TYPE = { + // look-ahead prevents us from gobbling up opcodes + match: /(i32|i64|f32|f64)(?!\.)/, + className: "type" + }; + const MATH_OPERATIONS = { + className: "keyword", + // borrowed from Prism, TODO: split out into variants + match: /\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ + }; + const OFFSET_ALIGN = { + match: [ + /(?:offset|align)/, + /\s*/, + /=/ + ], + className: { + 1: "keyword", + 3: "operator" + } + }; + return { + name: "WebAssembly", + keywords: { + $pattern: /[\w.]+/, + keyword: KWS + }, + contains: [ + LINE_COMMENT, + BLOCK_COMMENT, + OFFSET_ALIGN, + ARGUMENT, + PARENS, + FUNCTION_REFERENCE, + hljs.QUOTE_STRING_MODE, + TYPE, + MATH_OPERATIONS, + NUMBER + ] + }; +} + +// node_modules/lowlight/node_modules/highlight.js/es/languages/xml.js +function xml(hljs) { + const regex = hljs.regex; + const TAG_NAME_RE = regex.concat(/[\p{L}_]/u, regex.optional(/[\p{L}0-9_.-]*:/u), /[\p{L}0-9_.-]*/u); + const XML_IDENT_RE = /[\p{L}0-9._:-]+/u; + const XML_ENTITIES = { + className: "symbol", + begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/ + }; + const XML_META_KEYWORDS = { + begin: /\s/, + contains: [ + { + className: "keyword", + begin: /#?[a-z_][a-z1-9_-]+/, + illegal: /\n/ + } + ] + }; + const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, { + begin: /\(/, + end: /\)/ + }); + const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: "string" }); + const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: "string" }); + const TAG_INTERNALS = { + endsWithParent: true, + illegal: /`]+/ } + ] + } + ] + } + ] + }; + return { + name: "HTML, XML", + aliases: [ + "html", + "xhtml", + "rss", + "atom", + "xjb", + "xsd", + "xsl", + "plist", + "wsf", + "svg" + ], + case_insensitive: true, + unicodeRegex: true, + contains: [ + { + className: "meta", + begin: //, + relevance: 10, + contains: [ + XML_META_KEYWORDS, + QUOTE_META_STRING_MODE, + APOS_META_STRING_MODE, + XML_META_PAR_KEYWORDS, + { + begin: /\[/, + end: /\]/, + contains: [ + { + className: "meta", + begin: //, + contains: [ + XML_META_KEYWORDS, + XML_META_PAR_KEYWORDS, + QUOTE_META_STRING_MODE, + APOS_META_STRING_MODE + ] + } + ] + } + ] + }, + hljs.COMMENT( + //, + { relevance: 10 } + ), + { + begin: //, + relevance: 10 + }, + XML_ENTITIES, + // xml processing instructions + { + className: "meta", + end: /\?>/, + variants: [ + { + begin: /<\?xml/, + relevance: 10, + contains: [ + QUOTE_META_STRING_MODE + ] + }, + { + begin: /<\?[a-z][a-z0-9]+/ + } + ] + }, + { + className: "tag", + /* + The lookahead pattern (?=...) ensures that 'begin' only matches + ')/, + end: />/, + keywords: { name: "style" }, + contains: [TAG_INTERNALS], + starts: { + end: /<\/style>/, + returnEnd: true, + subLanguage: [ + "css", + "xml" + ] + } + }, + { + className: "tag", + // See the comment in the `); + const root = this.attachShadow({ mode: "open" }); + root.appendChild(template.content.cloneNode(true)); + root.addEventListener("move", this); + this[$parts] = this[$sliders].map((slider) => new slider(root)); + } + connectedCallback() { + if (this.hasOwnProperty("color")) { + const value = this.color; + delete this["color"]; + this.color = value; + } else if (!this.color) { + this.color = this.colorModel.defaultColor; + } + } + attributeChangedCallback(_attr, _oldVal, newVal) { + const color = this.colorModel.fromAttr(newVal); + if (!this[$isSame](color)) { + this.color = color; + } + } + handleEvent(event) { + const oldHsva = this[$hsva]; + const newHsva = { ...oldHsva, ...event.detail }; + this[$update](newHsva); + let newColor; + if (!equalColorObjects(newHsva, oldHsva) && !this[$isSame](newColor = this.colorModel.fromHsva(newHsva))) { + this[$color] = newColor; + fire(this, "color-changed", { value: newColor }); + } + } + [$isSame](color) { + return this.color && this.colorModel.equal(color, this.color); + } + [$update](hsva) { + this[$hsva] = hsva; + this[$parts].forEach((part) => part.update(hsva)); + } +}; + +// node_modules/vanilla-colorful/lib/entrypoints/hex.js +var colorModel = { + defaultColor: "#000", + toHsva: hexToHsva, + fromHsva: ({ h, s, v }) => hsvaToHex({ h, s, v, a: 1 }), + equal: equalHex, + fromAttr: (color) => color +}; +var HexBase = class extends ColorPicker { + get colorModel() { + return colorModel; + } +}; + +// resources/js/plugin.js +var import_lodash = __toESM(require_lodash(), 1); +customElements.define("tiptap-hex-color-picker", HexBase); +var coreExtensions = { + blockquote: [Blockquote], + bold: [Bold], + "bullet-list": [BulletList], + "checked-list": [CheckedList], + code: [Code], + "code-block": [CustomCodeBlockLowlight.configure({ + lowlight, + HTMLAttributes: { + class: "hljs" + } + })], + color: [Color], + details: [Details, DetailsSummary, DetailsContent], + grid: [Grid, GridColumn], + "grid-builder": [GridBuilder, GridBuilderColumn], + heading: [Heading.configure({ levels: [1, 2, 3, 4, 5, 6] })], + highlight: [Highlight], + hr: [HorizontalRule], + hurdle: [Hurdle], + italic: [Italic], + lead: [Lead], + link: [CustomLink.configure({ + openOnClick: false, + autolink: false, + HTMLAttributes: { + rel: null, + hreflang: null, + class: null + } + })], + media: [CustomImage.configure({ inline: true })], + oembed: [Youtube, Vimeo, Video], + "ordered-list": [OrderedList], + small: [Small], + strike: [Strike], + subscript: [Subscript], + superscript: [Superscript], + table: [Table.configure({ resizable: true }), TableHeader, TableCell, TableRow], + underline: [Underline] +}; +var customExtensions = window.TiptapEditorExtensions || {}; +var editorExtensions = { ...coreExtensions, ...customExtensions }; +var localeSwitcher = document.getElementById("activeLocale"); +if (localeSwitcher) { + localeSwitcher.addEventListener("change", () => { + const localeChange = new CustomEvent("localeChange", { bubbles: true, detail: { locale: localeSwitcher.value } }); + localeSwitcher.dispatchEvent(localeChange); + }); +} +function tiptap({ + state, + statePath, + tools = [], + disabled = false, + locale = "en", + floatingMenuTools = [], + placeholder = null, + mergeTags = [] +}) { + let editors = window.filamentTiptapEditors || {}; + return { + id: null, + modalId: null, + tools, + state, + statePath, + fullScreenMode: false, + updatedAt: Date.now(), + disabled, + locale, + floatingMenuTools, + getExtensions(id) { + const tools2 = this.tools.map((tool) => { + if (typeof tool === "string") { + return tool; + } + return tool.id; + }); + let exts = [ + Document, + Text, + Paragraph, + Dropcursor, + Gapcursor, + HardBreak, + History, + TextStyle2, + TiptapBlock, + DragAndDropExtension, + ClassExtension, + IdExtension, + StyleExtension + ]; + if (placeholder && !disabled) { + exts.push(Placeholder.configure({ placeholder })); + } + if (tools2.length) { + const keys2 = Object.keys(editorExtensions); + let alignments = []; + let types = ["paragraph"]; + exts.push(BubbleMenu.configure({ + pluginKey: `defaultBubbleMenu${id}`, + element: this.$refs.defaultBubbleMenu, + tippyOptions: { + duration: [500, 0] + }, + shouldShow: ({ state: state2, from: from2, to }) => { + return !(from2 === to || isActive(state2, "link") || isActive(state2, "table") || isActive(state2, "image") || isActive(state2, "oembed") || isActive(state2, "vimeo") || isActive(state2, "youtube") || isActive(state2, "video") || isActive(state2, "tiptapBlock")); + } + })); + if (this.floatingMenuTools.length) { + exts.push(FloatingMenu.configure({ + pluginKey: `defaultFloatingMenu${id}`, + element: this.$refs.defaultFloatingMenu, + tippyOptions: { + duration: [500, 0] + } + })); + this.floatingMenuTools.forEach((tool) => { + if (!tools2.includes(tool)) { + tools2.push(tool); + } + }); + } + tools2.forEach((tool) => { + if (keys2.includes(tool)) { + editorExtensions[tool].forEach((e) => { + if (["ordered-list", "bullet-list", "checked-list"].includes(tool)) { + exts.push(e); + if (!exts.includes(ListItem2)) + exts.push(ListItem2); + } else { + if (tool === "table") { + exts.push(BubbleMenu.configure({ + pluginKey: `tableBubbleMenu${id}`, + element: this.$refs.tableBubbleMenu, + tippyOptions: { + duration: [500, 0] + }, + shouldShow: ({ state: state2 }) => { + return isActive(state2, "table"); + } + })); + } + if (tool === "link") { + exts.push(BubbleMenu.configure({ + pluginKey: `linkBubbleMenu${id}`, + element: this.$refs.linkBubbleMenu, + tippyOptions: { + duration: [500, 0] + }, + shouldShow: ({ state: state2 }) => { + return isActive(state2, "link"); + } + })); + } + exts.push(e); + } + }); + } else { + if (["align-left", "align-right", "align-center", "align-justify"].includes(tool)) { + if (tool === "align-left") + alignments.push("start"); + if (tool === "align-center") + alignments.push("center"); + if (tool === "align-right") + alignments.push("end"); + if (tool === "align-justify") + alignments.push("justify"); + if (tools2.includes("heading")) + types.push("heading"); + let hasTextAlign = exts.find((item) => item.name === "textAlign"); + if (typeof hasTextAlign === "undefined") + exts.push(CustomTextAlign.configure({ types, alignments })); + } + } + }); + } + if (mergeTags?.length) { + exts.push(MergeTag.configure({ + mergeTags + })); + } + return exts; + }, + init: async function() { + this.initEditor(this.state); + this.modalId = this.$el.closest('[x-ref="modalContainer"]')?.getAttribute("wire:key"); + window.filamentTiptapEditors = editors; + document.addEventListener("dblclick", function(e) { + if (e.target && (e.target.hasAttribute("data-youtube-video") || e.target.hasAttribute("data-vimeo-video")) || e.target.hasAttribute("data-native-video")) { + e.target.firstChild.style.pointerEvents = "all"; + } + }); + window.addEventListener("localeChange", (event) => { + this.locale = event.detail.locale; + }); + let sortableEl = this.$el.parentElement.closest("[x-sortable]"); + if (sortableEl) { + window.Sortable.utils.on(sortableEl, "start", () => { + let editors2 = document.querySelectorAll(".tiptap-wrapper"); + if (editors2.length === 0) + return; + editors2.forEach(function(editor) { + editor._x_dataStack[0].editor().setEditable(false); + editor._x_dataStack[0].editor().options.element.style.pointerEvents = "none"; + }); + }); + window.Sortable.utils.on(sortableEl, "end", () => { + let editors2 = document.querySelectorAll(".tiptap-wrapper"); + if (editors2.length === 0) + return; + editors2.forEach(function(editor) { + editor._x_dataStack[0].editor().setEditable(true); + editor._x_dataStack[0].editor().options.element.style.pointerEvents = "all"; + }); + }); + } + this.$watch("state", (newState, oldState) => { + if (this.editor().isEmpty) { + this.editor().destroy(); + this.initEditor(newState); + } + if (!(0, import_lodash.isEqual)(oldState, this.editor().state.doc.toJSON())) { + this.updateEditorContent(newState); + } + }); + }, + destroy() { + this.editor().destroy(); + }, + editor() { + return editors[this.statePath]; + }, + initEditor(content) { + if (editors[this.statePath]) { + content = this.editor().getJSON(); + editors[this.statePath].destroy(); + delete editors[this.statePath]; + } + let _this = this; + editors[this.statePath] = new Editor({ + element: this.$refs.element, + extensions: this.getExtensions(this.statePath), + editable: !this.disabled, + content, + editorProps: { + handlePaste(view, event, slice2) { + slice2.content.descendants((node) => { + if (node.type.name === "tiptapBlock") { + node.attrs.statePath = _this.statePath; + node.attrs.data = JSON.parse(node.attrs.data); + } + }); + } + }, + onUpdate({ editor }) { + _this.updatedAt = Date.now(); + _this.state = editor.isEmpty ? null : editor.getJSON(); + }, + onSelectionUpdate() { + _this.updatedAt = Date.now(); + }, + onBlur() { + _this.updatedAt = Date.now(); + }, + onFocus() { + _this.updatedAt = Date.now(); + } + }); + }, + updateEditorContent(content) { + if (this.editor().isEditable) { + const { from: from2, to } = this.editor().state.selection; + this.editor().commands.setContent(content, true); + this.editor().chain().focus().setTextSelection({ from: from2, to }).run(); + } + }, + refreshEditorContent() { + this.$nextTick(() => this.updateEditorContent(this.state)); + }, + insertContent(event) { + if (event.detail.statePath !== this.statePath) + return; + switch (event.detail.type) { + case "media": + this.insertMedia(event); + return; + case "video": + this.insertVideo(event); + return; + case "link": + this.insertLink(event); + return; + case "source": + this.insertSource(event); + return; + case "grid": + this.insertGridBuilder(event); + return; + default: + return; + } + }, + insertMedia(event) { + if (Array.isArray(event.detail.media)) { + event.detail.media.forEach((item) => { + this.executeMediaInsert(item); + }); + } else { + this.executeMediaInsert(event.detail.media); + } + }, + executeMediaInsert(media = null) { + if (!media || media?.url === null) { + return; + } + if (media) { + const src = media?.url || media?.src; + const imageTypes = ["jpg", "jpeg", "svg", "png", "webp"]; + const regex = /.*\.([a-zA-Z]*)\??/; + const match = regex.exec(src); + if (match !== null && imageTypes.includes(match[1])) { + this.editor().chain().focus().setImage({ + src, + alt: media?.alt, + title: media?.title, + width: media?.width, + height: media?.height, + lazy: media?.lazy + }).run(); + } else { + this.editor().chain().focus().extendMarkRange("link").setLink({ href: src }).insertContent(media?.link_text).run(); + } + } + }, + insertVideo(event) { + let video = event.detail.video; + if (!video || video.url === null) { + return; + } + let commonOptions = { + src: video.url, + width: video.responsive ? video.width * 100 : video.width, + height: video.responsive ? video.height * 100 : video.height, + responsive: video.responsive ?? true, + "data-aspect-width": video.width, + "data-aspect-height": video.height + }; + if (video.url.includes("youtube") || video.url.includes("youtu.be")) { + this.editor().chain().focus().setYoutubeVideo({ + ...commonOptions, + controls: video.youtube_options.includes("controls"), + nocookie: video.youtube_options.includes("nocookie"), + start: video.start_at ?? 0 + }).run(); + } else if (video.url.includes("vimeo")) { + this.editor().chain().focus().setVimeoVideo({ + ...commonOptions, + autoplay: video.vimeo_options.includes("autoplay"), + loop: video.vimeo_options.includes("loop"), + title: video.vimeo_options.includes("show_title"), + byline: video.vimeo_options.includes("byline"), + portrait: video.vimeo_options.includes("portrait") + }).run(); + } else { + this.editor().chain().focus().setVideo({ + ...commonOptions, + autoplay: video.native_options.includes("autoplay"), + loop: video.native_options.includes("loop"), + controls: video.native_options.includes("controls") + }).run(); + } + }, + insertLink(event) { + let link = event.detail; + if (link.href === null && link.id === null) { + return; + } + if (link.href === "" && link.id === null) { + this.unsetLink(); + return; + } + this.editor().chain().focus().extendMarkRange("link").setLink({ + href: link.href, + id: link.id ?? null, + target: link.target ?? null, + hreflang: link.hreflang ?? null, + rel: link.rel ?? null, + referrerpolicy: link.referrerpolicy ?? null, + as_button: link.as_button ?? null, + button_theme: link.button_theme ?? null + }).selectTextblockEnd().run(); + }, + unsetLink() { + this.editor().chain().focus().extendMarkRange("link").unsetLink().selectTextblockEnd().run(); + }, + insertSource(event) { + this.updateEditorContent(event.detail.source); + }, + insertGridBuilder(event) { + let grid = event.detail.data; + let type = "responsive"; + const asymmetricLeft = parseInt(grid.asymmetric_left) ?? null; + const asymmetricRight = parseInt(grid.asymmetric_right) ?? null; + if (grid.fixed) { + type = "fixed"; + } + if (grid.asymmetric) { + type = "asymmetric"; + } + this.editor().chain().focus().insertGridBuilder({ + cols: grid.columns, + type, + stackAt: grid.stack_at, + asymmetricLeft, + asymmetricRight + }).run(); + }, + insertBlock(event) { + if (event.detail.statePath !== this.statePath) + return; + this.editor().commands.insertBlock({ + type: event.detail.type, + statePath: event.detail.statePath, + data: event.detail.data, + preview: event.detail.preview, + label: event.detail.label, + coordinates: event.detail.coordinates + }); + if (!this.editor().isFocused) { + this.editor().commands.focus(); + } + }, + insertMergeTag(event) { + this.editor().commands.insertMergeTag({ + tag: event.detail.tag, + coordinates: event.detail.coordinates + }); + if (!this.editor().isFocused) { + this.editor().commands.focus(); + } + }, + openBlockSettings(event) { + if (event.detail.statePath !== this.statePath) + return; + this.$wire.dispatchFormEvent("tiptap::updateBlock", this.statePath, event.detail); + }, + updateBlock(event) { + if (event.detail.statePath !== this.statePath) + return; + this.editor().commands.updateBlock({ + type: event.detail.type, + statePath: event.detail.statePath, + data: event.detail.data, + preview: event.detail.preview, + label: event.detail.label + }); + if (!this.editor().isFocused) { + this.editor().commands.focus(); + } + }, + deleteBlock() { + this.editor().commands.removeBlock(); + } + }; +} +export { + tiptap as default +}; /*! Bundled license information: lodash/lodash.js: @@ -233,3 +48951,4 @@ lodash/lodash.js: * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *) */ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvbGliL2NvcmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zvcm1hdC9mb3JtYXQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL29yZGVyZWRtYXAvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItbW9kZWwvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItdHJhbnNmb3JtL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXN0YXRlL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXZpZXcvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdzNjLWtleW5hbWUvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLWtleW1hcC9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1jb21tYW5kcy9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zY2hlbWEtbGlzdC9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY3JlYXRlQ2hhaW5hYmxlU3RhdGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvQ29tbWFuZE1hbmFnZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvRXZlbnRFbWl0dGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9zcGxpdEV4dGVuc2lvbnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRBdHRyaWJ1dGVzRnJvbUV4dGVuc2lvbnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXROb2RlVHlwZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvbWVyZ2VBdHRyaWJ1dGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc0Z1bmN0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9jYWxsT3JSZXR1cm4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2lzRW1wdHlPYmplY3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2Zyb21TdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pbmplY3RFeHRlbnNpb25BdHRyaWJ1dGVzVG9QYXJzZVJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRTY2hlbWFCeVJlc29sdmVkRXh0ZW5zaW9ucy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFNjaGVtYVR5cGVCeU5hbWUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0V4dGVuc2lvblJ1bGVzRW5hYmxlZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFRleHRDb250ZW50RnJvbU5vZGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc1JlZ0V4cC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9JbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2lzTnVtYmVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL1Bhc3RlUnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvZmluZER1cGxpY2F0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvRXh0ZW5zaW9uTWFuYWdlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvaXNQbGFpbk9iamVjdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvbWVyZ2VEZWVwLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL0V4dGVuc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFRleHRCZXR3ZWVuLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0VGV4dFNlcmlhbGl6ZXJzRnJvbVNjaGVtYS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL2NsaXBib2FyZFRleHRTZXJpYWxpemVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2JsdXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvY2xlYXJDb250ZW50LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2NsZWFyTm9kZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9jcmVhdGVQYXJhZ3JhcGhOZWFyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2N1dC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9kZWxldGVDdXJyZW50Tm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9kZWxldGVOb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2RlbGV0ZVJhbmdlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2RlbGV0ZVNlbGVjdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9lbnRlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9leGl0Q29kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvb2JqZWN0SW5jbHVkZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRNYXJrUmFuZ2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRNYXJrVHlwZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9leHRlbmRNYXJrUmFuZ2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvZmlyc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc1RleHRTZWxlY3Rpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL21pbk1heC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL3Jlc29sdmVGb2N1c1Bvc2l0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc2lPUy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9mb2N1cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9mb3JFYWNoLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2luc2VydENvbnRlbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2VsZW1lbnRGcm9tU3RyaW5nLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY3JlYXRlTm9kZUZyb21Db250ZW50LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvaW5zZXJ0Q29udGVudEF0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2pvaW4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvam9pbkl0ZW1CYWNrd2FyZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9qb2luSXRlbUZvcndhcmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2lzTWFjT1MudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMva2V5Ym9hcmRTaG9ydGN1dC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2lzTm9kZUFjdGl2ZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9saWZ0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2xpZnRFbXB0eUJsb2NrLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2xpZnRMaXN0SXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9uZXdsaW5lSW5Db2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2RlbGV0ZVByb3BzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3Jlc2V0QXR0cmlidXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zY3JvbGxJbnRvVmlldy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zZWxlY3RBbGwudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2VsZWN0Tm9kZUJhY2t3YXJkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NlbGVjdE5vZGVGb3J3YXJkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NlbGVjdFBhcmVudE5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2VsZWN0VGV4dGJsb2NrRW5kLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NlbGVjdFRleHRibG9ja1N0YXJ0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY3JlYXRlRG9jdW1lbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2V0Q29udGVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldE1hcmtBdHRyaWJ1dGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY29tYmluZVRyYW5zYWN0aW9uU3RlcHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9kZWZhdWx0QmxvY2tBdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2ZpbmRDaGlsZHJlbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2ZpbmRDaGlsZHJlbkluUmFuZ2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9maW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1Bvcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2ZpbmRQYXJlbnROb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0SFRNTEZyb21GcmFnbWVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFNjaGVtYS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dlbmVyYXRlSFRNTC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dlbmVyYXRlSlNPTi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZW5lcmF0ZVRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXROb2RlQXR0cmlidXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldEF0dHJpYnV0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL3JlbW92ZUR1cGxpY2F0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRDaGFuZ2VkUmFuZ2VzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0RGVidWdKU09OLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0TWFya3NCZXR3ZWVuLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0Tm9kZUF0UG9zaXRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRTcGxpdHRlZEF0dHJpYnV0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc01hcmtBY3RpdmUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0FjdGl2ZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2lzQXRFbmRPZk5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0F0U3RhcnRPZk5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0xpc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc05vZGVFbXB0eS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2lzTm9kZVNlbGVjdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL3Bvc1RvRE9NUmVjdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zZXRNYXJrLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NldE1ldGEudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2V0Tm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zZXROb2RlU2VsZWN0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NldFRleHRTZWxlY3Rpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2lua0xpc3RJdGVtLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NwbGl0QmxvY2sudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc3BsaXRMaXN0SXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy90b2dnbGVMaXN0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3RvZ2dsZU1hcmsudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvdG9nZ2xlTm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy90b2dnbGVXcmFwLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3VuZG9JbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvdW5zZXRBbGxNYXJrcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy91bnNldE1hcmsudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvdXBkYXRlQXR0cmlidXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy93cmFwSW4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvd3JhcEluTGlzdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL2NvbW1hbmRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2V4dGVuc2lvbnMvZWRpdGFibGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvZXh0ZW5zaW9ucy9mb2N1c0V2ZW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL2tleW1hcC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL3RhYmluZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3N0eWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9jcmVhdGVTdHlsZVRhZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9FZGl0b3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaW5wdXRSdWxlcy9tYXJrSW5wdXRSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2lucHV0UnVsZXMvbm9kZUlucHV0UnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9pbnB1dFJ1bGVzL3RleHRibG9ja1R5cGVJbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaW5wdXRSdWxlcy90ZXh0SW5wdXRSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2lucHV0UnVsZXMvd3JhcHBpbmdJbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvTWFyay50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9Ob2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc0FuZHJvaWQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvTm9kZVZpZXcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvcGFzdGVSdWxlcy9tYXJrUGFzdGVSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9lc2NhcGVGb3JSZWdFeC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvaXNTdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvcGFzdGVSdWxlcy9ub2RlUGFzdGVSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3Bhc3RlUnVsZXMvdGV4dFBhc3RlUnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9UcmFja2VyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1ibG9ja3F1b3RlL3NyYy9ibG9ja3F1b3RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1ib2xkL3NyYy9ib2xkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saXN0LWl0ZW0vc3JjL2xpc3QtaXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGV4dC1zdHlsZS9zcmMvdGV4dC1zdHlsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tYnVsbGV0LWxpc3Qvc3JjL2J1bGxldC1saXN0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1jb2RlL3NyYy9jb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10ZXh0LXN0eWxlL3NyYy90ZXh0LXN0eWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1jb2xvci9zcmMvY29sb3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWRvY3VtZW50L3NyYy9kb2N1bWVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItZHJvcGN1cnNvci9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1kcm9wY3Vyc29yL3NyYy9kcm9wY3Vyc29yLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1nYXBjdXJzb3IvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tZ2FwY3Vyc29yL3NyYy9nYXBjdXJzb3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWhhcmQtYnJlYWsvc3JjL2hhcmQtYnJlYWsudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWhlYWRpbmcvc3JjL2hlYWRpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3JvcGUtc2VxdWVuY2UvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItaGlzdG9yeS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1oaXN0b3J5L3NyYy9oaXN0b3J5LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1ob3Jpem9udGFsLXJ1bGUvc3JjL2hvcml6b250YWwtcnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24taXRhbGljL3NyYy9pdGFsaWMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWxpc3QtaXRlbS9zcmMvbGlzdC1pdGVtLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saXN0LWl0ZW0vc3JjL2xpc3QtaXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGV4dC1zdHlsZS9zcmMvdGV4dC1zdHlsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tb3JkZXJlZC1saXN0L3NyYy9vcmRlcmVkLWxpc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXBhcmFncmFwaC9zcmMvcGFyYWdyYXBoLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1wbGFjZWhvbGRlci9zcmMvcGxhY2Vob2xkZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXN0cmlrZS9zcmMvc3RyaWtlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1zdWJzY3JpcHQvc3JjL3N1YnNjcmlwdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tc3VwZXJzY3JpcHQvc3JjL3N1cGVyc2NyaXB0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci10YWJsZXMvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGFibGUvc3JjL1RhYmxlVmlldy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGFibGUvc3JjL3V0aWxpdGllcy9jcmVhdGVDZWxsLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdXRpbGl0aWVzL2dldFRhYmxlTm9kZVR5cGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdXRpbGl0aWVzL2NyZWF0ZVRhYmxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdXRpbGl0aWVzL2lzQ2VsbFNlbGVjdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGFibGUvc3JjL3V0aWxpdGllcy9kZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdGFibGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWNlbGwvc3JjL3RhYmxlLWNlbGwudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWhlYWRlci9zcmMvdGFibGUtaGVhZGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1yb3cvc3JjL3RhYmxlLXJvdy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGV4dC9zcmMvdGV4dC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lL3NyYy91bmRlcmxpbmUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWhpZ2hsaWdodC9zcmMvaGlnaGxpZ2h0LnRzIiwgIi4uL2pzL2V4dGVuc2lvbnMvQ2hlY2tlZExpc3QuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9MZWFkLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9saW5raWZ5anMvZGlzdC9saW5raWZ5LmVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saW5rL3NyYy9oZWxwZXJzL2F1dG9saW5rLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saW5rL3NyYy9oZWxwZXJzL2NsaWNrSGFuZGxlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tbGluay9zcmMvaGVscGVycy9wYXN0ZUhhbmRsZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWxpbmsvc3JjL2xpbmsudHMiLCAiLi4vanMvZXh0ZW5zaW9ucy9MaW5rLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1pbWFnZS9zcmMvaW1hZ2UudHMiLCAiLi4vanMvZXh0ZW5zaW9ucy9JbWFnZS5qcyIsICIuLi9qcy9leHRlbnNpb25zL1BhcmFncmFwaC5qcyIsICIuLi9qcy9leHRlbnNpb25zL1NtYWxsLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvR3JpZC91dGlscy9jcmVhdGVDb2x1bW4uanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL3V0aWxzL2dldEdyaWROb2RlVHlwZXMuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL3V0aWxzL2NyZWF0ZUdyaWQuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL0dyaWQuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL0dyaWRDb2x1bW4uanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9Zb3V0dWJlL3V0aWxzLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvWW91dHViZS9Zb3V0dWJlLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvVmltZW8vdXRpbHMuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9WaW1lby9WaW1lby5qcyIsICIuLi9qcy9leHRlbnNpb25zL1ZpZGVvLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvRGV0YWlscy9EZXRhaWxzLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvRGV0YWlscy9EZXRhaWxzU3VtbWFyeS5qcyIsICIuLi9qcy9leHRlbnNpb25zL0RldGFpbHMvRGV0YWlsc0NvbnRlbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2svc3JjL2NvZGUtYmxvY2sudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvbGliL2NvcmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2stbG93bGlnaHQvc3JjL2xvd2xpZ2h0LXBsdWdpbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jay1sb3dsaWdodC9zcmMvY29kZS1ibG9jay1sb3dsaWdodC50cyIsICIuLi9qcy9leHRlbnNpb25zL0NvZGVCbG9jay5qcyIsICIuLi9qcy9leHRlbnNpb25zL0h1cmRsZS5qcyIsICIuLi9qcy9leHRlbnNpb25zL0N1c3RvbVRleHRBbGlnbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVOYW1lLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZU9mZnNldHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2ZsaXAuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL2NvbnN0YW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvZG9tLXV0aWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvYmluZEdsb2JhbEV2ZW50TGlzdGVuZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvYnJvd3Nlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL3ZhbGlkYXRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9wcm9wcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL3RlbXBsYXRlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvY3JlYXRlVGlwcHkudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL2FkZG9ucy9jcmVhdGVTaW5nbGV0b24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9hZGRvbnMvZGVsZWdhdGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9wbHVnaW5zL2FuaW1hdGVGaWxsLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvcGx1Z2lucy9mb2xsb3dDdXJzb3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9wbHVnaW5zL2lubGluZVBvc2l0aW9uaW5nLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvcGx1Z2lucy9zdGlja3kudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL2J1aWxkL2Jhc2UuanMiLCAiLi4vanMvcGx1Z2lucy9CdWJibGVNZW51UGx1Z2luLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvQnViYmxlTWVudS5qcyIsICIuLi9qcy9wbHVnaW5zL0Zsb2F0aW5nTWVudVBsdWdpbi5qcyIsICIuLi9qcy9leHRlbnNpb25zL0Zsb2F0aW5nTWVudS5qcyIsICIuLi9qcy9leHRlbnNpb25zL0dyaWRCdWlsZGVyL3V0aWxzL2NyZWF0ZUJ1aWxkZXJDb2x1bW4uanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkQnVpbGRlci91dGlscy9nZXRHcmlkQnVpbGRlck5vZGVUeXBlcy5qcyIsICIuLi9qcy9leHRlbnNpb25zL0dyaWRCdWlsZGVyL3V0aWxzL2NyZWF0ZUdyaWRCdWlsZGVyLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvR3JpZEJ1aWxkZXIvR3JpZEJ1aWxkZXIuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkQnVpbGRlci9HcmlkQnVpbGRlckNvbHVtbi5qcyIsICIuLi9qcy9leHRlbnNpb25zL0RyYWdBbmREcm9wLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvVGlwdGFwQmxvY2suanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvc3VnZ2VzdGlvbi9zcmMvZmluZFN1Z2dlc3Rpb25NYXRjaC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9zdWdnZXN0aW9uL3NyYy9zdWdnZXN0aW9uLnRzIiwgIi4uL2pzL2V4dGVuc2lvbnMvTWVyZ2VUYWcuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9DbGFzc0V4dGVuc2lvbi5qcyIsICIuLi9qcy9leHRlbnNpb25zL0lkRXh0ZW5zaW9uLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvU3R5bGVFeHRlbnNpb24uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2FyZHVpbm8uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2Jhc2guanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2NwcC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvY3NoYXJwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9jc3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2RpZmYuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2dvLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9ncmFwaHFsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9pbmkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2phdmEuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2phdmFzY3JpcHQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2pzb24uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2tvdGxpbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvbGVzcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvbHVhLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9tYWtlZmlsZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvbWFya2Rvd24uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL29iamVjdGl2ZWMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3BlcmwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3BocC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvcGhwLXRlbXBsYXRlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9wbGFpbnRleHQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3B5dGhvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvcHl0aG9uLXJlcGwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3IuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3J1YnkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3J1c3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3Njc3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3NoZWxsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9zcWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3N3aWZ0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy90eXBlc2NyaXB0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy92Ym5ldC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvd2FzbS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMveG1sLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy95YW1sLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2NvcmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2ZhdWx0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9saWIvY29yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbGliL2NvbW1vbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL3V0aWxzL21hdGgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi91dGlscy9jb252ZXJ0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvdXRpbHMvY29tcGFyZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL3V0aWxzL2RvbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL2NvbXBvbmVudHMvc2xpZGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvY29tcG9uZW50cy9odWUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi9jb21wb25lbnRzL3NhdHVyYXRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi9zdHlsZXMvY29sb3ItcGlja2VyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvc3R5bGVzL2h1ZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL3N0eWxlcy9zYXR1cmF0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvY29tcG9uZW50cy9jb2xvci1waWNrZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi9lbnRyeXBvaW50cy9oZXgudHMiLCAiLi4vanMvcGx1Z2luLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1hc3NpZ24gKi9cblxuZnVuY3Rpb24gZGVlcEZyZWV6ZShvYmopIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIG9iai5jbGVhciA9XG4gICAgICBvYmouZGVsZXRlID1cbiAgICAgIG9iai5zZXQgPVxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXAgaXMgcmVhZC1vbmx5Jyk7XG4gICAgICAgIH07XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgb2JqLmFkZCA9XG4gICAgICBvYmouY2xlYXIgPVxuICAgICAgb2JqLmRlbGV0ZSA9XG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldCBpcyByZWFkLW9ubHknKTtcbiAgICAgICAgfTtcbiAgfVxuXG4gIC8vIEZyZWV6ZSBzZWxmXG4gIE9iamVjdC5mcmVlemUob2JqKTtcblxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICBjb25zdCBwcm9wID0gb2JqW25hbWVdO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgcHJvcDtcblxuICAgIC8vIEZyZWV6ZSBwcm9wIGlmIGl0IGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiBhbmQgYWxzbyBub3QgYWxyZWFkeSBmcm96ZW5cbiAgICBpZiAoKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdmdW5jdGlvbicpICYmICFPYmplY3QuaXNGcm96ZW4ocHJvcCkpIHtcbiAgICAgIGRlZXBGcmVlemUocHJvcCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gb2JqO1xufVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ2FsbGJhY2tSZXNwb25zZX0gQ2FsbGJhY2tSZXNwb25zZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlICovXG4vKiogQGltcGxlbWVudHMgQ2FsbGJhY2tSZXNwb25zZSAqL1xuXG5jbGFzcyBSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgICBpZiAobW9kZS5kYXRhID09PSB1bmRlZmluZWQpIG1vZGUuZGF0YSA9IHt9O1xuXG4gICAgdGhpcy5kYXRhID0gbW9kZS5kYXRhO1xuICAgIHRoaXMuaXNNYXRjaElnbm9yZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlnbm9yZU1hdGNoKCkge1xuICAgIHRoaXMuaXNNYXRjaElnbm9yZWQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgLnJlcGxhY2UoLycvZywgJyYjeDI3OycpO1xufVxuXG4vKipcbiAqIHBlcmZvcm1zIGEgc2hhbGxvdyBtZXJnZSBvZiBtdWx0aXBsZSBvYmplY3RzIGludG8gb25lXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZyxhbnk+W119IG9iamVjdHNcbiAqIEByZXR1cm5zIHtUfSBhIHNpbmdsZSBuZXcgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluaGVyaXQkMShvcmlnaW5hbCwgLi4ub2JqZWN0cykge1xuICAvKiogQHR5cGUgUmVjb3JkPHN0cmluZyxhbnk+ICovXG4gIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb3JpZ2luYWwpIHtcbiAgICByZXN1bHRba2V5XSA9IG9yaWdpbmFsW2tleV07XG4gIH1cbiAgb2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtUfSAqLyAocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZW5kZXJlclxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nKSA9PiB2b2lkfSBhZGRUZXh0XG4gKiBAcHJvcGVydHkgeyhub2RlOiBOb2RlKSA9PiB2b2lkfSBvcGVuTm9kZVxuICogQHByb3BlcnR5IHsobm9kZTogTm9kZSkgPT4gdm9pZH0gY2xvc2VOb2RlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gdmFsdWVcbiAqL1xuXG4vKiogQHR5cGVkZWYge3tzY29wZT86IHN0cmluZywgbGFuZ3VhZ2U/OiBzdHJpbmcsIHN1Ymxhbmd1YWdlPzogYm9vbGVhbn19IE5vZGUgKi9cbi8qKiBAdHlwZWRlZiB7e3dhbGs6IChyOiBSZW5kZXJlcikgPT4gdm9pZH19IFRyZWUgKi9cbi8qKiAqL1xuXG5jb25zdCBTUEFOX0NMT1NFID0gJzwvc3Bhbj4nO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBub2RlIG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gPHNwYW4+XG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlICovXG5jb25zdCBlbWl0c1dyYXBwaW5nVGFncyA9IChub2RlKSA9PiB7XG4gIC8vIHJhcmVseSB3ZSBjYW4gaGF2ZSBhIHN1Ymxhbmd1YWdlIHdoZXJlIGxhbmd1YWdlIGlzIHVuZGVmaW5lZFxuICAvLyBUT0RPOiB0cmFjayBkb3duIHdoeVxuICByZXR1cm4gISFub2RlLnNjb3BlO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7e3ByZWZpeDpzdHJpbmd9fSBvcHRpb25zXG4gKi9cbmNvbnN0IHNjb3BlVG9DU1NDbGFzcyA9IChuYW1lLCB7IHByZWZpeCB9KSA9PiB7XG4gIC8vIHN1Yi1sYW5ndWFnZVxuICBpZiAobmFtZS5zdGFydHNXaXRoKFwibGFuZ3VhZ2U6XCIpKSB7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZShcImxhbmd1YWdlOlwiLCBcImxhbmd1YWdlLVwiKTtcbiAgfVxuICAvLyB0aWVyZWQgc2NvcGU6IGNvbW1lbnQubGluZVxuICBpZiAobmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICBjb25zdCBwaWVjZXMgPSBuYW1lLnNwbGl0KFwiLlwiKTtcbiAgICByZXR1cm4gW1xuICAgICAgYCR7cHJlZml4fSR7cGllY2VzLnNoaWZ0KCl9YCxcbiAgICAgIC4uLihwaWVjZXMubWFwKCh4LCBpKSA9PiBgJHt4fSR7XCJfXCIucmVwZWF0KGkgKyAxKX1gKSlcbiAgICBdLmpvaW4oXCIgXCIpO1xuICB9XG4gIC8vIHNpbXBsZSBzY29wZVxuICByZXR1cm4gYCR7cHJlZml4fSR7bmFtZX1gO1xufTtcblxuLyoqIEB0eXBlIHtSZW5kZXJlcn0gKi9cbmNsYXNzIEhUTUxSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEhUTUxSZW5kZXJlclxuICAgKlxuICAgKiBAcGFyYW0ge1RyZWV9IHBhcnNlVHJlZSAtIHRoZSBwYXJzZSB0cmVlIChtdXN0IHN1cHBvcnQgYHdhbGtgIEFQSSlcbiAgICogQHBhcmFtIHt7Y2xhc3NQcmVmaXg6IHN0cmluZ319IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcnNlVHJlZSwgb3B0aW9ucykge1xuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcbiAgICB0aGlzLmNsYXNzUHJlZml4ID0gb3B0aW9ucy5jbGFzc1ByZWZpeDtcbiAgICBwYXJzZVRyZWUud2Fsayh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRleHRzIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0ICovXG4gIGFkZFRleHQodGV4dCkge1xuICAgIHRoaXMuYnVmZmVyICs9IGVzY2FwZUhUTUwodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgb3BlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSAoaWYgbmVlZGVkKVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgKi9cbiAgb3Blbk5vZGUobm9kZSkge1xuICAgIGlmICghZW1pdHNXcmFwcGluZ1RhZ3Mobm9kZSkpIHJldHVybjtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHNjb3BlVG9DU1NDbGFzcyhub2RlLnNjb3BlLFxuICAgICAgeyBwcmVmaXg6IHRoaXMuY2xhc3NQcmVmaXggfSk7XG4gICAgdGhpcy5zcGFuKGNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgY2xvc2UgdG8gdGhlIG91dHB1dCBzdHJlYW0gKGlmIG5lZWRlZClcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGNsb3NlTm9kZShub2RlKSB7XG4gICAgaWYgKCFlbWl0c1dyYXBwaW5nVGFncyhub2RlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5idWZmZXIgKz0gU1BBTl9DTE9TRTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCBidWZmZXJcbiAgKi9cbiAgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLy8gaGVscGVyc1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzcGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAqL1xuICBzcGFuKGNsYXNzTmFtZSkge1xuICAgIHRoaXMuYnVmZmVyICs9IGA8c3BhbiBjbGFzcz1cIiR7Y2xhc3NOYW1lfVwiPmA7XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHt7c2NvcGU/OiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nLCBzdWJsYW5ndWFnZT86IGJvb2xlYW4sIGNoaWxkcmVuOiBOb2RlW119IHwgc3RyaW5nfSBOb2RlICovXG4vKiogQHR5cGVkZWYge3tzY29wZT86IHN0cmluZywgbGFuZ3VhZ2U/OiBzdHJpbmcsIHN1Ymxhbmd1YWdlPzogYm9vbGVhbiwgY2hpbGRyZW46IE5vZGVbXX0gfSBEYXRhTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkVtaXR0ZXJ9IEVtaXR0ZXIgKi9cbi8qKiAgKi9cblxuLyoqIEByZXR1cm5zIHtEYXRhTm9kZX0gKi9cbmNvbnN0IG5ld05vZGUgPSAob3B0cyA9IHt9KSA9PiB7XG4gIC8qKiBAdHlwZSBEYXRhTm9kZSAqL1xuICBjb25zdCByZXN1bHQgPSB7IGNoaWxkcmVuOiBbXSB9O1xuICBPYmplY3QuYXNzaWduKHJlc3VsdCwgb3B0cyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jbGFzcyBUb2tlblRyZWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKiogQHR5cGUgRGF0YU5vZGUgKi9cbiAgICB0aGlzLnJvb3ROb2RlID0gbmV3Tm9kZSgpO1xuICAgIHRoaXMuc3RhY2sgPSBbdGhpcy5yb290Tm9kZV07XG4gIH1cblxuICBnZXQgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gIH1cblxuICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMucm9vdE5vZGU7IH1cblxuICAvKiogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGFkZChub2RlKSB7XG4gICAgdGhpcy50b3AuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgKi9cbiAgb3Blbk5vZGUoc2NvcGUpIHtcbiAgICAvKiogQHR5cGUgTm9kZSAqL1xuICAgIGNvbnN0IG5vZGUgPSBuZXdOb2RlKHsgc2NvcGUgfSk7XG4gICAgdGhpcy5hZGQobm9kZSk7XG4gICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xuICB9XG5cbiAgY2xvc2VOb2RlKCkge1xuICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsb3NlQWxsTm9kZXMoKSB7XG4gICAgd2hpbGUgKHRoaXMuY2xvc2VOb2RlKCkpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3ROb2RlLCBudWxsLCA0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vaHRtbF9yZW5kZXJlclwiKS5SZW5kZXJlciB9IFJlbmRlcmVyXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IGJ1aWxkZXJcbiAgICovXG4gIHdhbGsoYnVpbGRlcikge1xuICAgIC8vIHRoaXMgZG9lcyBub3RcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgICAvLyB0aGlzIHdvcmtzXG4gICAgLy8gcmV0dXJuIFRva2VuVHJlZS5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSBidWlsZGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKi9cbiAgc3RhdGljIF93YWxrKGJ1aWxkZXIsIG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGJ1aWxkZXIuYWRkVGV4dChub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGJ1aWxkZXIub3Blbk5vZGUobm9kZSk7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLl93YWxrKGJ1aWxkZXIsIGNoaWxkKSk7XG4gICAgICBidWlsZGVyLmNsb3NlTm9kZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqL1xuICBzdGF0aWMgX2NvbGxhcHNlKG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHJldHVybjtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHJldHVybjtcblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmV2ZXJ5KGVsID0+IHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIC8vIG5vZGUudGV4dCA9IG5vZGUuY2hpbGRyZW4uam9pbihcIlwiKTtcbiAgICAgIC8vIGRlbGV0ZSBub2RlLmNoaWxkcmVuO1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IFtub2RlLmNoaWxkcmVuLmpvaW4oXCJcIildO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIFRva2VuVHJlZS5fY29sbGFwc2UoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICBDdXJyZW50bHkgdGhpcyBpcyBhbGwgcHJpdmF0ZSBBUEksIGJ1dCB0aGlzIGlzIHRoZSBtaW5pbWFsIEFQSSBuZWNlc3NhcnlcbiAgdGhhdCBhbiBFbWl0dGVyIG11c3QgaW1wbGVtZW50IHRvIGZ1bGx5IHN1cHBvcnQgdGhlIHBhcnNlci5cblxuICBNaW5pbWFsIGludGVyZmFjZTpcblxuICAtIGFkZFRleHQodGV4dClcbiAgLSBfX2FkZFN1Ymxhbmd1YWdlKGVtaXR0ZXIsIHN1Ykxhbmd1YWdlTmFtZSlcbiAgLSBzdGFydFNjb3BlKHNjb3BlKVxuICAtIGVuZFNjb3BlKClcbiAgLSBmaW5hbGl6ZSgpXG4gIC0gdG9IVE1MKClcblxuKi9cblxuLyoqXG4gKiBAaW1wbGVtZW50cyB7RW1pdHRlcn1cbiAqL1xuY2xhc3MgVG9rZW5UcmVlRW1pdHRlciBleHRlbmRzIFRva2VuVHJlZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICovXG4gIGFkZFRleHQodGV4dCkge1xuICAgIGlmICh0ZXh0ID09PSBcIlwiKSB7IHJldHVybjsgfVxuXG4gICAgdGhpcy5hZGQodGV4dCk7XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IHNjb3BlICovXG4gIHN0YXJ0U2NvcGUoc2NvcGUpIHtcbiAgICB0aGlzLm9wZW5Ob2RlKHNjb3BlKTtcbiAgfVxuXG4gIGVuZFNjb3BlKCkge1xuICAgIHRoaXMuY2xvc2VOb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbWl0dGVyICYge3Jvb3Q6IERhdGFOb2RlfX0gZW1pdHRlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgX19hZGRTdWJsYW5ndWFnZShlbWl0dGVyLCBuYW1lKSB7XG4gICAgLyoqIEB0eXBlIERhdGFOb2RlICovXG4gICAgY29uc3Qgbm9kZSA9IGVtaXR0ZXIucm9vdDtcbiAgICBpZiAobmFtZSkgbm9kZS5zY29wZSA9IGBsYW5ndWFnZToke25hbWV9YDtcblxuICAgIHRoaXMuYWRkKG5vZGUpO1xuICB9XG5cbiAgdG9IVE1MKCkge1xuICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IEhUTUxSZW5kZXJlcih0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHJldHVybiByZW5kZXJlci52YWx1ZSgpO1xuICB9XG5cbiAgZmluYWxpemUoKSB7XG4gICAgdGhpcy5jbG9zZUFsbE5vZGVzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtSZWdFeHB9XG4gKiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHNvdXJjZShyZSkge1xuICBpZiAoIXJlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiByZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHJlO1xuXG4gIHJldHVybiByZS5zb3VyY2U7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmcgfSByZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gbG9va2FoZWFkKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/PScsIHJlLCAnKScpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGFueU51bWJlck9mVGltZXMocmUpIHtcbiAgcmV0dXJuIGNvbmNhdCgnKD86JywgcmUsICcpKicpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9wdGlvbmFsKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/OicsIHJlLCAnKT8nKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLihSZWdFeHAgfCBzdHJpbmcpIH0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29uY2F0KC4uLmFyZ3MpIHtcbiAgY29uc3Qgam9pbmVkID0gYXJncy5tYXAoKHgpID0+IHNvdXJjZSh4KSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBBcnJheTxzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3Q+IH0gYXJnc1xuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncykge1xuICBjb25zdCBvcHRzID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcgJiYgb3B0cy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgYXJncy5zcGxpY2UoYXJncy5sZW5ndGggLSAxLCAxKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHsge2NhcHR1cmU/OiBib29sZWFufSB9IFJlZ2V4RWl0aGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIEFueSBvZiB0aGUgcGFzc2VkIGV4cHJlc3NzaW9ucyBtYXkgbWF0Y2hcbiAqXG4gKiBDcmVhdGVzIGEgaHVnZSB0aGlzIHwgdGhpcyB8IHRoYXQgfCB0aGF0IG1hdGNoXG4gKiBAcGFyYW0geyhSZWdFeHAgfCBzdHJpbmcpW10gfCBbLi4uKFJlZ0V4cCB8IHN0cmluZylbXSwgUmVnZXhFaXRoZXJPcHRpb25zXX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZWl0aGVyKC4uLmFyZ3MpIHtcbiAgLyoqIEB0eXBlIHsgb2JqZWN0ICYge2NhcHR1cmU/OiBib29sZWFufSB9ICAqL1xuICBjb25zdCBvcHRzID0gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncyk7XG4gIGNvbnN0IGpvaW5lZCA9ICcoJ1xuICAgICsgKG9wdHMuY2FwdHVyZSA/IFwiXCIgOiBcIj86XCIpXG4gICAgKyBhcmdzLm1hcCgoeCkgPT4gc291cmNlKHgpKS5qb2luKFwifFwiKSArIFwiKVwiO1xuICByZXR1cm4gam9pbmVkO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nfSByZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gY291bnRNYXRjaEdyb3VwcyhyZSkge1xuICByZXR1cm4gKG5ldyBSZWdFeHAocmUudG9TdHJpbmcoKSArICd8JykpLmV4ZWMoJycpLmxlbmd0aCAtIDE7XG59XG5cbi8qKlxuICogRG9lcyBsZXhlbWUgc3RhcnQgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZXhlbWVcbiAqL1xuZnVuY3Rpb24gc3RhcnRzV2l0aChyZSwgbGV4ZW1lKSB7XG4gIGNvbnN0IG1hdGNoID0gcmUgJiYgcmUuZXhlYyhsZXhlbWUpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2guaW5kZXggPT09IDA7XG59XG5cbi8vIEJBQ0tSRUZfUkUgbWF0Y2hlcyBhbiBvcGVuIHBhcmVudGhlc2lzIG9yIGJhY2tyZWZlcmVuY2UuIFRvIGF2b2lkXG4vLyBhbiBpbmNvcnJlY3QgcGFyc2UsIGl0IGFkZGl0aW9uYWxseSBtYXRjaGVzIHRoZSBmb2xsb3dpbmc6XG4vLyAtIFsuLi5dIGVsZW1lbnRzLCB3aGVyZSB0aGUgbWVhbmluZyBvZiBwYXJlbnRoZXNlcyBhbmQgZXNjYXBlcyBjaGFuZ2Vcbi8vIC0gb3RoZXIgZXNjYXBlIHNlcXVlbmNlcywgc28gd2UgZG8gbm90IG1pc3BhcnNlIGVzY2FwZSBzZXF1ZW5jZXMgYXNcbi8vICAgaW50ZXJlc3RpbmcgZWxlbWVudHNcbi8vIC0gbm9uLW1hdGNoaW5nIG9yIGxvb2thaGVhZCBwYXJlbnRoZXNlcywgd2hpY2ggZG8gbm90IGNhcHR1cmUuIFRoZXNlXG4vLyAgIGZvbGxvdyB0aGUgJygnIHdpdGggYSAnPycuXG5jb25zdCBCQUNLUkVGX1JFID0gL1xcWyg/OlteXFxcXFxcXV18XFxcXC4pKlxcXXxcXChcXD8/fFxcXFwoWzEtOV1bMC05XSopfFxcXFwuLztcblxuLy8gKipJTlRFUk5BTCoqIE5vdCBpbnRlbmRlZCBmb3Igb3V0c2lkZSB1c2FnZVxuLy8gam9pbiBsb2dpY2FsbHkgY29tcHV0ZXMgcmVnZXhwcy5qb2luKHNlcGFyYXRvciksIGJ1dCBmaXhlcyB0aGVcbi8vIGJhY2tyZWZlcmVuY2VzIHNvIHRoZXkgY29udGludWUgdG8gbWF0Y2guXG4vLyBpdCBhbHNvIHBsYWNlcyBlYWNoIGluZGl2aWR1YWwgcmVndWxhciBleHByZXNzaW9uIGludG8gaXQncyBvd25cbi8vIG1hdGNoIGdyb3VwLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzZXF1ZW5jaW5nIG9mIHRob3NlIG1hdGNoIGdyb3Vwc1xuLy8gaXMgY3VycmVudGx5IGFuIGV4ZXJjaXNlIGZvciB0aGUgY2FsbGVyLiA6LSlcbi8qKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgUmVnRXhwKVtdfSByZWdleHBzXG4gKiBAcGFyYW0ge3tqb2luV2l0aDogc3RyaW5nfX0gb3B0c1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhyZWdleHBzLCB7IGpvaW5XaXRoIH0pIHtcbiAgbGV0IG51bUNhcHR1cmVzID0gMDtcblxuICByZXR1cm4gcmVnZXhwcy5tYXAoKHJlZ2V4KSA9PiB7XG4gICAgbnVtQ2FwdHVyZXMgKz0gMTtcbiAgICBjb25zdCBvZmZzZXQgPSBudW1DYXB0dXJlcztcbiAgICBsZXQgcmUgPSBzb3VyY2UocmVnZXgpO1xuICAgIGxldCBvdXQgPSAnJztcblxuICAgIHdoaWxlIChyZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IEJBQ0tSRUZfUkUuZXhlYyhyZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG91dCArPSByZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvdXQgKz0gcmUuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgIHJlID0gcmUuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgIGlmIChtYXRjaFswXVswXSA9PT0gJ1xcXFwnICYmIG1hdGNoWzFdKSB7XG4gICAgICAgIC8vIEFkanVzdCB0aGUgYmFja3JlZmVyZW5jZS5cbiAgICAgICAgb3V0ICs9ICdcXFxcJyArIFN0cmluZyhOdW1iZXIobWF0Y2hbMV0pICsgb2Zmc2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSBtYXRjaFswXTtcbiAgICAgICAgaWYgKG1hdGNoWzBdID09PSAnKCcpIHtcbiAgICAgICAgICBudW1DYXB0dXJlcysrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH0pLm1hcChyZSA9PiBgKCR7cmV9KWApLmpvaW4oam9pbldpdGgpO1xufVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLk1vZGVDYWxsYmFja30gTW9kZUNhbGxiYWNrICovXG5cbi8vIENvbW1vbiByZWdleHBzXG5jb25zdCBNQVRDSF9OT1RISU5HX1JFID0gL1xcYlxcQi87XG5jb25zdCBJREVOVF9SRSA9ICdbYS16QS1aXVxcXFx3Kic7XG5jb25zdCBVTkRFUlNDT1JFX0lERU5UX1JFID0gJ1thLXpBLVpfXVxcXFx3Kic7XG5jb25zdCBOVU1CRVJfUkUgPSAnXFxcXGJcXFxcZCsoXFxcXC5cXFxcZCspPyc7XG5jb25zdCBDX05VTUJFUl9SRSA9ICcoLT8pKFxcXFxiMFt4WF1bYS1mQS1GMC05XSt8KFxcXFxiXFxcXGQrKFxcXFwuXFxcXGQqKT98XFxcXC5cXFxcZCspKFtlRV1bLStdP1xcXFxkKyk/KSc7IC8vIDB4Li4uLCAwLi4uLCBkZWNpbWFsLCBmbG9hdFxuY29uc3QgQklOQVJZX05VTUJFUl9SRSA9ICdcXFxcYigwYlswMV0rKSc7IC8vIDBiLi4uXG5jb25zdCBSRV9TVEFSVEVSU19SRSA9ICchfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFxcXCp8XFxcXCo9fFxcXFwrfFxcXFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFxcXD98XFxcXFt8XFxcXHt8XFxcXCh8XFxcXF58XFxcXF49fFxcXFx8fFxcXFx8PXxcXFxcfFxcXFx8fH4nO1xuXG4vKipcbiogQHBhcmFtIHsgUGFydGlhbDxNb2RlPiAmIHtiaW5hcnk/OiBzdHJpbmcgfCBSZWdFeHB9IH0gb3B0c1xuKi9cbmNvbnN0IFNIRUJBTkcgPSAob3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IGJlZ2luU2hlYmFuZyA9IC9eIyFbIF0qXFwvLztcbiAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgb3B0cy5iZWdpbiA9IGNvbmNhdChcbiAgICAgIGJlZ2luU2hlYmFuZyxcbiAgICAgIC8uKlxcYi8sXG4gICAgICBvcHRzLmJpbmFyeSxcbiAgICAgIC9cXGIuKi8pO1xuICB9XG4gIHJldHVybiBpbmhlcml0JDEoe1xuICAgIHNjb3BlOiAnbWV0YScsXG4gICAgYmVnaW46IGJlZ2luU2hlYmFuZyxcbiAgICBlbmQ6IC8kLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAgLyoqIEB0eXBlIHtNb2RlQ2FsbGJhY2t9ICovXG4gICAgXCJvbjpiZWdpblwiOiAobSwgcmVzcCkgPT4ge1xuICAgICAgaWYgKG0uaW5kZXggIT09IDApIHJlc3AuaWdub3JlTWF0Y2goKTtcbiAgICB9XG4gIH0sIG9wdHMpO1xufTtcblxuLy8gQ29tbW9uIG1vZGVzXG5jb25zdCBCQUNLU0xBU0hfRVNDQVBFID0ge1xuICBiZWdpbjogJ1xcXFxcXFxcW1xcXFxzXFxcXFNdJywgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQVBPU19TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1xcJycsXG4gIGVuZDogJ1xcJycsXG4gIGlsbGVnYWw6ICdcXFxcbicsXG4gIGNvbnRhaW5zOiBbQkFDS1NMQVNIX0VTQ0FQRV1cbn07XG5jb25zdCBRVU9URV9TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1wiJyxcbiAgZW5kOiAnXCInLFxuICBpbGxlZ2FsOiAnXFxcXG4nLFxuICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG59O1xuY29uc3QgUEhSQVNBTF9XT1JEU19NT0RFID0ge1xuICBiZWdpbjogL1xcYihhfGFufHRoZXxhcmV8SSdtfGlzbid0fGRvbid0fGRvZXNuJ3R8d29uJ3R8YnV0fGp1c3R8c2hvdWxkfHByZXR0eXxzaW1wbHl8ZW5vdWdofGdvbm5hfGdvaW5nfHd0Znxzb3xzdWNofHdpbGx8eW91fHlvdXJ8dGhleXxsaWtlfG1vcmUpXFxiL1xufTtcbi8qKlxuICogQ3JlYXRlcyBhIGNvbW1lbnQgbW9kZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBiZWdpblxuICogQHBhcmFtIHtzdHJpbmcgfCBSZWdFeHB9IGVuZFxuICogQHBhcmFtIHtNb2RlIHwge319IFttb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXJ0aWFsPE1vZGU+fVxuICovXG5jb25zdCBDT01NRU5UID0gZnVuY3Rpb24oYmVnaW4sIGVuZCwgbW9kZU9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtb2RlID0gaW5oZXJpdCQxKFxuICAgIHtcbiAgICAgIHNjb3BlOiAnY29tbWVudCcsXG4gICAgICBiZWdpbixcbiAgICAgIGVuZCxcbiAgICAgIGNvbnRhaW5zOiBbXVxuICAgIH0sXG4gICAgbW9kZU9wdGlvbnNcbiAgKTtcbiAgbW9kZS5jb250YWlucy5wdXNoKHtcbiAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgLy8gaGFjayB0byBhdm9pZCB0aGUgc3BhY2UgZnJvbSBiZWluZyBpbmNsdWRlZC4gdGhlIHNwYWNlIGlzIG5lY2Vzc2FyeSB0b1xuICAgIC8vIG1hdGNoIGhlcmUgdG8gcHJldmVudCB0aGUgcGxhaW4gdGV4dCBydWxlIGJlbG93IGZyb20gZ29iYmxpbmcgdXAgZG9jdGFnc1xuICAgIGJlZ2luOiAnWyBdKig/PShUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKTopJyxcbiAgICBlbmQ6IC8oVE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6LyxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH0pO1xuICBjb25zdCBFTkdMSVNIX1dPUkQgPSBlaXRoZXIoXG4gICAgLy8gbGlzdCBvZiBjb21tb24gMSBhbmQgMiBsZXR0ZXIgd29yZHMgaW4gRW5nbGlzaFxuICAgIFwiSVwiLFxuICAgIFwiYVwiLFxuICAgIFwiaXNcIixcbiAgICBcInNvXCIsXG4gICAgXCJ1c1wiLFxuICAgIFwidG9cIixcbiAgICBcImF0XCIsXG4gICAgXCJpZlwiLFxuICAgIFwiaW5cIixcbiAgICBcIml0XCIsXG4gICAgXCJvblwiLFxuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBjb250cmFjdGlvbnMsIGp1c3QgcG9wdWxhciBvbmVzXG4gICAgL1tBLVphLXpdK1snXShkfHZlfHJlfGxsfHR8c3xuKS8sIC8vIGNvbnRyYWN0aW9ucyAtIGNhbid0IHdlJ2QgdGhleSdyZSBsZXQncywgZXRjXG4gICAgL1tBLVphLXpdK1stXVthLXpdKy8sIC8vIGBuby13YXlgLCBldGMuXG4gICAgL1tBLVphLXpdW2Etel17Mix9LyAvLyBhbGxvdyBjYXBpdGFsaXplZCB3b3JkcyBhdCBiZWdpbm5pbmcgb2Ygc2VudGVuY2VzXG4gICk7XG4gIC8vIGxvb2tpbmcgbGlrZSBwbGFpbiB0ZXh0LCBtb3JlIGxpa2VseSB0byBiZSBhIGNvbW1lbnRcbiAgbW9kZS5jb250YWlucy5wdXNoKFxuICAgIHtcbiAgICAgIC8vIFRPRE86IGhvdyB0byBpbmNsdWRlIFwiLCAoLCApIHdpdGhvdXQgYnJlYWtpbmcgZ3JhbW1hcnMgdGhhdCB1c2UgdGhlc2UgZm9yXG4gICAgICAvLyBjb21tZW50IGRlbGltaXRlcnM/XG4gICAgICAvLyBiZWdpbjogL1sgXSsoWygpXCJdPyhbQS1aYS16Jy1dezMsfXxpc3xhfEl8c298dXN8W3RUXVtvT118YXR8aWZ8aW58aXR8b24pWy5dP1soKVwiOl0/KFsuXVsgXXxbIF18XFwpKSl7M30vXG4gICAgICAvLyAtLS1cblxuICAgICAgLy8gdGhpcyB0cmllcyB0byBmaW5kIHNlcXVlbmNlcyBvZiAzIGVuZ2xpc2ggd29yZHMgaW4gYSByb3cgKHdpdGhvdXQgYW55XG4gICAgICAvLyBcInByb2dyYW1taW5nXCIgdHlwZSBzeW50YXgpIHRoaXMgZ2l2ZXMgdXMgYSBzdHJvbmcgc2lnbmFsIHRoYXQgd2UndmVcbiAgICAgIC8vIFRSVUxZIGZvdW5kIGEgY29tbWVudCAtIHZzIHBlcmhhcHMgc2Nhbm5pbmcgd2l0aCB0aGUgd3JvbmcgbGFuZ3VhZ2UuXG4gICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgTE9PS1MgbGlrZSB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAvLyBjb21tZW50IC0gYnV0IHRoZW4gaWYgdGhlcmUgaXMgbm8gcmVhZGFibGUgdGV4dCAtIGdvb2QgY2hhbmNlIGl0IGlzIGFcbiAgICAgIC8vIGZhbHNlIG1hdGNoIGFuZCBub3QgYSBjb21tZW50LlxuICAgICAgLy9cbiAgICAgIC8vIGZvciBhIHZpc3VhbCBleGFtcGxlIHBsZWFzZSBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yODI3XG5cbiAgICAgIGJlZ2luOiBjb25jYXQoXG4gICAgICAgIC9bIF0rLywgLy8gbmVjZXNzYXJ5IHRvIHByZXZlbnQgdXMgZ29iYmxpbmcgdXAgZG9jdGFncyBsaWtlIC8qIEBhdXRob3IgQm9iIE1jZ2lsbCAqL1xuICAgICAgICAnKCcsXG4gICAgICAgIEVOR0xJU0hfV09SRCxcbiAgICAgICAgL1suXT9bOl0/KFsuXVsgXXxbIF0pLyxcbiAgICAgICAgJyl7M30nKSAvLyBsb29rIGZvciAzIHdvcmRzIGluIGEgcm93XG4gICAgfVxuICApO1xuICByZXR1cm4gbW9kZTtcbn07XG5jb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gQ09NTUVOVCgnLy8nLCAnJCcpO1xuY29uc3QgQ19CTE9DS19DT01NRU5UX01PREUgPSBDT01NRU5UKCcvXFxcXConLCAnXFxcXCovJyk7XG5jb25zdCBIQVNIX0NPTU1FTlRfTU9ERSA9IENPTU1FTlQoJyMnLCAnJCcpO1xuY29uc3QgTlVNQkVSX01PREUgPSB7XG4gIHNjb3BlOiAnbnVtYmVyJyxcbiAgYmVnaW46IE5VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQ19OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQ19OVU1CRVJfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IEJJTkFSWV9OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQklOQVJZX05VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgUkVHRVhQX01PREUgPSB7XG4gIC8vIHRoaXMgb3V0ZXIgcnVsZSBtYWtlcyBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgYSBXSE9MRSByZWdleCBhbmQgbm90IHNpbXBseVxuICAvLyBhbiBleHByZXNzaW9uIHN1Y2ggYXM6XG4gIC8vXG4gIC8vICAgICAzIC8gc29tZXRoaW5nXG4gIC8vXG4gIC8vICh3aGljaCB3aWxsIHRoZW4gYmxvdyB1cCB3aGVuIHJlZ2V4J3MgYGlsbGVnYWxgIHNlZXMgdGhlIG5ld2xpbmUpXG4gIGJlZ2luOiAvKD89XFwvW14vXFxuXSpcXC8pLyxcbiAgY29udGFpbnM6IFt7XG4gICAgc2NvcGU6ICdyZWdleHAnLFxuICAgIGJlZ2luOiAvXFwvLyxcbiAgICBlbmQ6IC9cXC9bZ2ltdXldKi8sXG4gICAgaWxsZWdhbDogL1xcbi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXFxdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG4gICAgICB9XG4gICAgXVxuICB9XVxufTtcbmNvbnN0IFRJVExFX01PREUgPSB7XG4gIHNjb3BlOiAndGl0bGUnLFxuICBiZWdpbjogSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IFVOREVSU0NPUkVfVElUTEVfTU9ERSA9IHtcbiAgc2NvcGU6ICd0aXRsZScsXG4gIGJlZ2luOiBVTkRFUlNDT1JFX0lERU5UX1JFLFxuICByZWxldmFuY2U6IDBcbn07XG5jb25zdCBNRVRIT0RfR1VBUkQgPSB7XG4gIC8vIGV4Y2x1ZGVzIG1ldGhvZCBuYW1lcyBmcm9tIGtleXdvcmQgcHJvY2Vzc2luZ1xuICBiZWdpbjogJ1xcXFwuXFxcXHMqJyArIFVOREVSU0NPUkVfSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcblxuLyoqXG4gKiBBZGRzIGVuZCBzYW1lIGFzIGJlZ2luIG1lY2hhbmljcyB0byBhIG1vZGVcbiAqXG4gKiBZb3VyIG1vZGUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IGEgc2luZ2xlICgpIG1hdGNoIGdyb3VwIGFzIHRoYXQgZmlyc3QgbWF0Y2hcbiAqIGdyb3VwIGlzIHdoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvblxuICogQHBhcmFtIHtQYXJ0aWFsPE1vZGU+fSBtb2RlXG4gKi9cbmNvbnN0IEVORF9TQU1FX0FTX0JFR0lOID0gZnVuY3Rpb24obW9kZSkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihtb2RlLFxuICAgIHtcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmJlZ2luJzogKG0sIHJlc3ApID0+IHsgcmVzcC5kYXRhLl9iZWdpbk1hdGNoID0gbVsxXTsgfSxcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmVuZCc6IChtLCByZXNwKSA9PiB7IGlmIChyZXNwLmRhdGEuX2JlZ2luTWF0Y2ggIT09IG1bMV0pIHJlc3AuaWdub3JlTWF0Y2goKTsgfVxuICAgIH0pO1xufTtcblxudmFyIE1PREVTID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIE1BVENIX05PVEhJTkdfUkU6IE1BVENIX05PVEhJTkdfUkUsXG4gIElERU5UX1JFOiBJREVOVF9SRSxcbiAgVU5ERVJTQ09SRV9JREVOVF9SRTogVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgTlVNQkVSX1JFOiBOVU1CRVJfUkUsXG4gIENfTlVNQkVSX1JFOiBDX05VTUJFUl9SRSxcbiAgQklOQVJZX05VTUJFUl9SRTogQklOQVJZX05VTUJFUl9SRSxcbiAgUkVfU1RBUlRFUlNfUkU6IFJFX1NUQVJURVJTX1JFLFxuICBTSEVCQU5HOiBTSEVCQU5HLFxuICBCQUNLU0xBU0hfRVNDQVBFOiBCQUNLU0xBU0hfRVNDQVBFLFxuICBBUE9TX1NUUklOR19NT0RFOiBBUE9TX1NUUklOR19NT0RFLFxuICBRVU9URV9TVFJJTkdfTU9ERTogUVVPVEVfU1RSSU5HX01PREUsXG4gIFBIUkFTQUxfV09SRFNfTU9ERTogUEhSQVNBTF9XT1JEU19NT0RFLFxuICBDT01NRU5UOiBDT01NRU5ULFxuICBDX0xJTkVfQ09NTUVOVF9NT0RFOiBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICBDX0JMT0NLX0NPTU1FTlRfTU9ERTogQ19CTE9DS19DT01NRU5UX01PREUsXG4gIEhBU0hfQ09NTUVOVF9NT0RFOiBIQVNIX0NPTU1FTlRfTU9ERSxcbiAgTlVNQkVSX01PREU6IE5VTUJFUl9NT0RFLFxuICBDX05VTUJFUl9NT0RFOiBDX05VTUJFUl9NT0RFLFxuICBCSU5BUllfTlVNQkVSX01PREU6IEJJTkFSWV9OVU1CRVJfTU9ERSxcbiAgUkVHRVhQX01PREU6IFJFR0VYUF9NT0RFLFxuICBUSVRMRV9NT0RFOiBUSVRMRV9NT0RFLFxuICBVTkRFUlNDT1JFX1RJVExFX01PREU6IFVOREVSU0NPUkVfVElUTEVfTU9ERSxcbiAgTUVUSE9EX0dVQVJEOiBNRVRIT0RfR1VBUkQsXG4gIEVORF9TQU1FX0FTX0JFR0lOOiBFTkRfU0FNRV9BU19CRUdJTlxufSk7XG5cbi8qKlxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ2FsbGJhY2tSZXNwb25zZX0gQ2FsbGJhY2tSZXNwb25zZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZXJFeHR9IENvbXBpbGVyRXh0XG4qL1xuXG4vLyBHcmFtbWFyIGV4dGVuc2lvbnMgLyBwbHVnaW5zXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzI4MzNcblxuLy8gR3JhbW1hciBleHRlbnNpb25zIGFsbG93IFwic3ludGFjdGljIHN1Z2FyXCIgdG8gYmUgYWRkZWQgdG8gdGhlIGdyYW1tYXIgbW9kZXNcbi8vIHdpdGhvdXQgcmVxdWlyaW5nIGFueSB1bmRlcmx5aW5nIGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVyIGludGVybmFscy5cblxuLy8gYGNvbXBpbGVNYXRjaGAgYmVpbmcgdGhlIHBlcmZlY3Qgc21hbGwgZXhhbXBsZSBvZiBub3cgYWxsb3dpbmcgYSBncmFtbWFyXG4vLyBhdXRob3IgdG8gd3JpdGUgYG1hdGNoYCB3aGVuIHRoZXkgZGVzaXJlIHRvIG1hdGNoIGEgc2luZ2xlIGV4cHJlc3Npb24gcmF0aGVyXG4vLyB0aGFuIGJlaW5nIGZvcmNlZCB0byB1c2UgYGJlZ2luYC4gIFRoZSBleHRlbnNpb24gdGhlbiBqdXN0IG1vdmVzIGBtYXRjaGAgaW50b1xuLy8gYGJlZ2luYCB3aGVuIGl0IHJ1bnMuICBJZSwgbm8gZmVhdHVyZXMgaGF2ZSBiZWVuIGFkZGVkLCBidXQgd2UndmUganVzdCBtYWRlXG4vLyB0aGUgZXhwZXJpZW5jZSBvZiB3cml0aW5nIChhbmQgcmVhZGluZyBncmFtbWFycykgYSBsaXR0bGUgYml0IG5pY2VyLlxuXG4vLyAtLS0tLS1cblxuLy8gVE9ETzogV2UgbmVlZCBuZWdhdGl2ZSBsb29rLWJlaGluZCBzdXBwb3J0IHRvIGRvIHRoaXMgcHJvcGVybHlcbi8qKlxuICogU2tpcCBhIG1hdGNoIGlmIGl0IGhhcyBhIHByZWNlZGluZyBkb3RcbiAqXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGBiZWdpbktleXdvcmRzYCB0byBwcmV2ZW50IG1hdGNoaW5nIGV4cHJlc3Npb25zIHN1Y2ggYXNcbiAqIGBib2Iua2V5d29yZC5kbygpYC4gVGhlIG1vZGUgY29tcGlsZXIgYXV0b21hdGljYWxseSB3aXJlcyB0aGlzIHVwIGFzIGFcbiAqIHNwZWNpYWwgX2ludGVybmFsXyAnb246YmVnaW4nIGNhbGxiYWNrIGZvciBtb2RlcyB3aXRoIGBiZWdpbktleXdvcmRzYFxuICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICogQHBhcmFtIHtDYWxsYmFja1Jlc3BvbnNlfSByZXNwb25zZVxuICovXG5mdW5jdGlvbiBza2lwSWZIYXNQcmVjZWRpbmdEb3QobWF0Y2gsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGJlZm9yZSA9IG1hdGNoLmlucHV0W21hdGNoLmluZGV4IC0gMV07XG4gIGlmIChiZWZvcmUgPT09IFwiLlwiKSB7XG4gICAgcmVzcG9uc2UuaWdub3JlTWF0Y2goKTtcbiAgfVxufVxuXG4vKipcbiAqXG4gKiBAdHlwZSB7Q29tcGlsZXJFeHR9XG4gKi9cbmZ1bmN0aW9uIHNjb3BlQ2xhc3NOYW1lKG1vZGUsIF9wYXJlbnQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICBpZiAobW9kZS5jbGFzc05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIG1vZGUuc2NvcGUgPSBtb2RlLmNsYXNzTmFtZTtcbiAgICBkZWxldGUgbW9kZS5jbGFzc05hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBgYmVnaW5LZXl3b3Jkc2Agc3ludGFjdGljIHN1Z2FyXG4gKiBAdHlwZSB7Q29tcGlsZXJFeHR9XG4gKi9cbmZ1bmN0aW9uIGJlZ2luS2V5d29yZHMobW9kZSwgcGFyZW50KSB7XG4gIGlmICghcGFyZW50KSByZXR1cm47XG4gIGlmICghbW9kZS5iZWdpbktleXdvcmRzKSByZXR1cm47XG5cbiAgLy8gZm9yIGxhbmd1YWdlcyB3aXRoIGtleXdvcmRzIHRoYXQgaW5jbHVkZSBub24td29yZCBjaGFyYWN0ZXJzIGNoZWNraW5nIGZvclxuICAvLyBhIHdvcmQgYm91bmRhcnkgaXMgbm90IHN1ZmZpY2llbnQsIHNvIGluc3RlYWQgd2UgY2hlY2sgZm9yIGEgd29yZCBib3VuZGFyeVxuICAvLyBvciB3aGl0ZXNwYWNlIC0gdGhpcyBkb2VzIG5vIGhhcm0gaW4gYW55IGNhc2Ugc2luY2Ugb3VyIGtleXdvcmQgZW5naW5lXG4gIC8vIGRvZXNuJ3QgYWxsb3cgc3BhY2VzIGluIGtleXdvcmRzIGFueXdheXMgYW5kIHdlIHN0aWxsIGNoZWNrIGZvciB0aGUgYm91bmRhcnlcbiAgLy8gZmlyc3RcbiAgbW9kZS5iZWdpbiA9ICdcXFxcYignICsgbW9kZS5iZWdpbktleXdvcmRzLnNwbGl0KCcgJykuam9pbignfCcpICsgJykoPyFcXFxcLikoPz1cXFxcYnxcXFxccyknO1xuICBtb2RlLl9fYmVmb3JlQmVnaW4gPSBza2lwSWZIYXNQcmVjZWRpbmdEb3Q7XG4gIG1vZGUua2V5d29yZHMgPSBtb2RlLmtleXdvcmRzIHx8IG1vZGUuYmVnaW5LZXl3b3JkcztcbiAgZGVsZXRlIG1vZGUuYmVnaW5LZXl3b3JkcztcblxuICAvLyBwcmV2ZW50cyBkb3VibGUgcmVsZXZhbmNlLCB0aGUga2V5d29yZHMgdGhlbXNlbHZlcyBwcm92aWRlXG4gIC8vIHJlbGV2YW5jZSwgdGhlIG1vZGUgZG9lc24ndCBuZWVkIHRvIGRvdWJsZSBpdFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gIGlmIChtb2RlLnJlbGV2YW5jZSA9PT0gdW5kZWZpbmVkKSBtb2RlLnJlbGV2YW5jZSA9IDA7XG59XG5cbi8qKlxuICogQWxsb3cgYGlsbGVnYWxgIHRvIGNvbnRhaW4gYW4gYXJyYXkgb2YgaWxsZWdhbCB2YWx1ZXNcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUlsbGVnYWwobW9kZSwgX3BhcmVudCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobW9kZS5pbGxlZ2FsKSkgcmV0dXJuO1xuXG4gIG1vZGUuaWxsZWdhbCA9IGVpdGhlciguLi5tb2RlLmlsbGVnYWwpO1xufVxuXG4vKipcbiAqIGBtYXRjaGAgdG8gbWF0Y2ggYSBzaW5nbGUgZXhwcmVzc2lvbiBmb3IgcmVhZGFiaWxpdHlcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gY29tcGlsZU1hdGNoKG1vZGUsIF9wYXJlbnQpIHtcbiAgaWYgKCFtb2RlLm1hdGNoKSByZXR1cm47XG4gIGlmIChtb2RlLmJlZ2luIHx8IG1vZGUuZW5kKSB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpbiAmIGVuZCBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1hdGNoXCIpO1xuXG4gIG1vZGUuYmVnaW4gPSBtb2RlLm1hdGNoO1xuICBkZWxldGUgbW9kZS5tYXRjaDtcbn1cblxuLyoqXG4gKiBwcm92aWRlcyB0aGUgZGVmYXVsdCAxIHJlbGV2YW5jZSB0byBhbGwgbW9kZXNcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gY29tcGlsZVJlbGV2YW5jZShtb2RlLCBfcGFyZW50KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgaWYgKG1vZGUucmVsZXZhbmNlID09PSB1bmRlZmluZWQpIG1vZGUucmVsZXZhbmNlID0gMTtcbn1cblxuLy8gYWxsb3cgYmVmb3JlTWF0Y2ggdG8gYWN0IGFzIGEgXCJxdWFsaWZpZXJcIiBmb3IgdGhlIG1hdGNoXG4vLyB0aGUgZnVsbCBtYXRjaCBiZWdpbiBtdXN0IGJlIFtiZWZvcmVNYXRjaF1bYmVnaW5dXG5jb25zdCBiZWZvcmVNYXRjaEV4dCA9IChtb2RlLCBwYXJlbnQpID0+IHtcbiAgaWYgKCFtb2RlLmJlZm9yZU1hdGNoKSByZXR1cm47XG4gIC8vIHN0YXJ0cyBjb25mbGljdHMgd2l0aCBlbmRzUGFyZW50IHdoaWNoIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjaGlsZFxuICAvLyBydWxlIGlzIG5vdCBtYXRjaGVkIG11bHRpcGxlIHRpbWVzXG4gIGlmIChtb2RlLnN0YXJ0cykgdGhyb3cgbmV3IEVycm9yKFwiYmVmb3JlTWF0Y2ggY2Fubm90IGJlIHVzZWQgd2l0aCBzdGFydHNcIik7XG5cbiAgY29uc3Qgb3JpZ2luYWxNb2RlID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZSk7XG4gIE9iamVjdC5rZXlzKG1vZGUpLmZvckVhY2goKGtleSkgPT4geyBkZWxldGUgbW9kZVtrZXldOyB9KTtcblxuICBtb2RlLmtleXdvcmRzID0gb3JpZ2luYWxNb2RlLmtleXdvcmRzO1xuICBtb2RlLmJlZ2luID0gY29uY2F0KG9yaWdpbmFsTW9kZS5iZWZvcmVNYXRjaCwgbG9va2FoZWFkKG9yaWdpbmFsTW9kZS5iZWdpbikpO1xuICBtb2RlLnN0YXJ0cyA9IHtcbiAgICByZWxldmFuY2U6IDAsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3JpZ2luYWxNb2RlLCB7IGVuZHNQYXJlbnQ6IHRydWUgfSlcbiAgICBdXG4gIH07XG4gIG1vZGUucmVsZXZhbmNlID0gMDtcblxuICBkZWxldGUgb3JpZ2luYWxNb2RlLmJlZm9yZU1hdGNoO1xufTtcblxuLy8ga2V5d29yZHMgdGhhdCBzaG91bGQgaGF2ZSBubyBkZWZhdWx0IHJlbGV2YW5jZSB2YWx1ZVxuY29uc3QgQ09NTU9OX0tFWVdPUkRTID0gW1xuICAnb2YnLFxuICAnYW5kJyxcbiAgJ2ZvcicsXG4gICdpbicsXG4gICdub3QnLFxuICAnb3InLFxuICAnaWYnLFxuICAndGhlbicsXG4gICdwYXJlbnQnLCAvLyBjb21tb24gdmFyaWFibGUgbmFtZVxuICAnbGlzdCcsIC8vIGNvbW1vbiB2YXJpYWJsZSBuYW1lXG4gICd2YWx1ZScgLy8gY29tbW9uIHZhcmlhYmxlIG5hbWVcbl07XG5cbmNvbnN0IERFRkFVTFRfS0VZV09SRF9TQ09QRSA9IFwia2V5d29yZFwiO1xuXG4vKipcbiAqIEdpdmVuIHJhdyBrZXl3b3JkcyBmcm9tIGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiwgY29tcGlsZSB0aGVtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgUmVjb3JkPHN0cmluZyxzdHJpbmd8c3RyaW5nW10+IHwgQXJyYXk8c3RyaW5nPn0gcmF3S2V5d29yZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FzZUluc2Vuc2l0aXZlXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVLZXl3b3JkcyhyYXdLZXl3b3JkcywgY2FzZUluc2Vuc2l0aXZlLCBzY29wZU5hbWUgPSBERUZBVUxUX0tFWVdPUkRfU0NPUEUpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJoaWdobGlnaHQuanMvcHJpdmF0ZVwiKS5LZXl3b3JkRGljdH0gKi9cbiAgY29uc3QgY29tcGlsZWRLZXl3b3JkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gaW5wdXQgY2FuIGJlIGEgc3RyaW5nIG9mIGtleXdvcmRzLCBhbiBhcnJheSBvZiBrZXl3b3Jkcywgb3IgYSBvYmplY3Qgd2l0aFxuICAvLyBuYW1lZCBrZXlzIHJlcHJlc2VudGluZyBzY29wZU5hbWUgKHdoaWNoIGNhbiB0aGVuIHBvaW50IHRvIGEgc3RyaW5nIG9yIGFycmF5KVxuICBpZiAodHlwZW9mIHJhd0tleXdvcmRzID09PSAnc3RyaW5nJykge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMuc3BsaXQoXCIgXCIpKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJhd0tleXdvcmRzKSkge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKHJhd0tleXdvcmRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNjb3BlTmFtZSkge1xuICAgICAgLy8gY29sbGFwc2UgYWxsIG91ciBvYmplY3RzIGJhY2sgaW50byB0aGUgcGFyZW50IG9iamVjdFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgY29tcGlsZWRLZXl3b3JkcyxcbiAgICAgICAgY29tcGlsZUtleXdvcmRzKHJhd0tleXdvcmRzW3Njb3BlTmFtZV0sIGNhc2VJbnNlbnNpdGl2ZSwgc2NvcGVOYW1lKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tcGlsZWRLZXl3b3JkcztcblxuICAvLyAtLS1cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBsaXN0IG9mIGtleXdvcmRzXG4gICAqXG4gICAqIEV4OiBcImZvciBpZiB3aGVuIHdoaWxlfDVcIlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVOYW1lXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2V5d29yZExpc3RcbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwga2V5d29yZExpc3QpIHtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBrZXl3b3JkTGlzdCA9IGtleXdvcmRMaXN0Lm1hcCh4ID0+IHgudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICAgIGtleXdvcmRMaXN0LmZvckVhY2goZnVuY3Rpb24oa2V5d29yZCkge1xuICAgICAgY29uc3QgcGFpciA9IGtleXdvcmQuc3BsaXQoJ3wnKTtcbiAgICAgIGNvbXBpbGVkS2V5d29yZHNbcGFpclswXV0gPSBbc2NvcGVOYW1lLCBzY29yZUZvcktleXdvcmQocGFpclswXSwgcGFpclsxXSldO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvcGVyIHNjb3JlIGZvciBhIGdpdmVuIGtleXdvcmRcbiAqXG4gKiBBbHNvIHRha2VzIGludG8gYWNjb3VudCBjb21tZW50IGtleXdvcmRzLCB3aGljaCB3aWxsIGJlIHNjb3JlZCAwIFVOTEVTU1xuICogYW5vdGhlciBzY29yZSBoYXMgYmVlbiBtYW51YWxseSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3ZpZGVkU2NvcmVdXG4gKi9cbmZ1bmN0aW9uIHNjb3JlRm9yS2V5d29yZChrZXl3b3JkLCBwcm92aWRlZFNjb3JlKSB7XG4gIC8vIG1hbnVhbCBzY29yZXMgYWx3YXlzIHdpbiBvdmVyIGNvbW1vbiBrZXl3b3Jkc1xuICAvLyBzbyB5b3UgY2FuIGZvcmNlIGEgc2NvcmUgb2YgMSBpZiB5b3UgcmVhbGx5IGluc2lzdFxuICBpZiAocHJvdmlkZWRTY29yZSkge1xuICAgIHJldHVybiBOdW1iZXIocHJvdmlkZWRTY29yZSk7XG4gIH1cblxuICByZXR1cm4gY29tbW9uS2V5d29yZChrZXl3b3JkKSA/IDAgOiAxO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBnaXZlbiBrZXl3b3JkIGlzIGNvbW1vbiBvciBub3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZCAqL1xuZnVuY3Rpb24gY29tbW9uS2V5d29yZChrZXl3b3JkKSB7XG4gIHJldHVybiBDT01NT05fS0VZV09SRFMuaW5jbHVkZXMoa2V5d29yZC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLypcblxuRm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgcGxlYXNlIHNlZTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzI4ODAjaXNzdWVjb21tZW50LTc0NzI3NTQxOVxuXG4qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn1cbiAqL1xuY29uc3Qgc2VlbkRlcHJlY2F0aW9ucyA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmNvbnN0IGVycm9yID0gKG1lc3NhZ2UpID0+IHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7YW55fSBhcmdzXG4gKi9cbmNvbnN0IHdhcm4gPSAobWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICBjb25zb2xlLmxvZyhgV0FSTjogJHttZXNzYWdlfWAsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuY29uc3QgZGVwcmVjYXRlZCA9ICh2ZXJzaW9uLCBtZXNzYWdlKSA9PiB7XG4gIGlmIChzZWVuRGVwcmVjYXRpb25zW2Ake3ZlcnNpb259LyR7bWVzc2FnZX1gXSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUubG9nKGBEZXByZWNhdGVkIGFzIG9mICR7dmVyc2lvbn0uICR7bWVzc2FnZX1gKTtcbiAgc2VlbkRlcHJlY2F0aW9uc1tgJHt2ZXJzaW9ufS8ke21lc3NhZ2V9YF0gPSB0cnVlO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdGhyb3ctbGl0ZXJhbCAqL1xuXG4vKipcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlXG4qL1xuXG5jb25zdCBNdWx0aUNsYXNzRXJyb3IgPSBuZXcgRXJyb3IoKTtcblxuLyoqXG4gKiBSZW51bWJlcnMgbGFiZWxlZCBzY29wZSBuYW1lcyB0byBhY2NvdW50IGZvciBhZGRpdGlvbmFsIGlubmVyIG1hdGNoXG4gKiBncm91cHMgdGhhdCBvdGhlcndpc2Ugd291bGQgYnJlYWsgZXZlcnl0aGluZy5cbiAqXG4gKiBMZXRzIHNheSB3ZSAzIG1hdGNoIHNjb3BlczpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCAzID0+IC4uLiB9XG4gKlxuICogU28gd2hhdCB3ZSBuZWVkIGlzIGEgY2xlYW4gbWF0Y2ggbGlrZSB0aGlzOlxuICpcbiAqICAgKGEpKGIpKGMpID0+IFsgXCJhXCIsIFwiYlwiLCBcImNcIiBdXG4gKlxuICogQnV0IHRoaXMgZmFsbHMgYXBhcnQgd2l0aCBpbm5lciBtYXRjaCBncm91cHM6XG4gKlxuICogKGEpKCgoYikpKShjKSA9PiBbXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJiXCIsIFwiY1wiIF1cbiAqXG4gKiBPdXIgc2NvcGVzIGFyZSBub3cgXCJvdXQgb2YgYWxpZ25tZW50XCIgYW5kIHdlJ3JlIHJlcGVhdGluZyBgYmAgMyB0aW1lcy5cbiAqIFdoYXQgbmVlZHMgdG8gaGFwcGVuIGlzIHRoZSBudW1iZXJzIGFyZSByZW1hcHBlZDpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCA1ID0+IC4uLiB9XG4gKlxuICogV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhhdCB0aGUgT05MWSBncm91cHMgdGhhdCBzaG91bGQgYmUgb3V0cHV0XG4gKiBhcmUgMSwgMiwgYW5kIDUuICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBiZWhhdmlvci5cbiAqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICogQHBhcmFtIHtBcnJheTxSZWdFeHAgfCBzdHJpbmc+fSByZWdleGVzXG4gKiBAcGFyYW0ge3trZXk6IFwiYmVnaW5TY29wZVwifFwiZW5kU2NvcGVcIn19IG9wdHNcbiAqL1xuZnVuY3Rpb24gcmVtYXBTY29wZU5hbWVzKG1vZGUsIHJlZ2V4ZXMsIHsga2V5IH0pIHtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGNvbnN0IHNjb3BlTmFtZXMgPSBtb2RlW2tleV07XG4gIC8qKiBAdHlwZSBSZWNvcmQ8bnVtYmVyLGJvb2xlYW4+ICovXG4gIGNvbnN0IGVtaXQgPSB7fTtcbiAgLyoqIEB0eXBlIFJlY29yZDxudW1iZXIsc3RyaW5nPiAqL1xuICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSByZWdleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcG9zaXRpb25zW2kgKyBvZmZzZXRdID0gc2NvcGVOYW1lc1tpXTtcbiAgICBlbWl0W2kgKyBvZmZzZXRdID0gdHJ1ZTtcbiAgICBvZmZzZXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZWdleGVzW2kgLSAxXSk7XG4gIH1cbiAgLy8gd2UgdXNlIF9lbWl0IHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWF0Y2ggZ3JvdXBzIGFyZSBcInRvcC1sZXZlbFwiIHRvIGF2b2lkIGRvdWJsZVxuICAvLyBvdXRwdXQgZnJvbSBpbnNpZGUgbWF0Y2ggZ3JvdXBzXG4gIG1vZGVba2V5XSA9IHBvc2l0aW9ucztcbiAgbW9kZVtrZXldLl9lbWl0ID0gZW1pdDtcbiAgbW9kZVtrZXldLl9tdWx0aSA9IHRydWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gYmVnaW5NdWx0aUNsYXNzKG1vZGUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGUuYmVnaW4pKSByZXR1cm47XG5cbiAgaWYgKG1vZGUuc2tpcCB8fCBtb2RlLmV4Y2x1ZGVCZWdpbiB8fCBtb2RlLnJldHVybkJlZ2luKSB7XG4gICAgZXJyb3IoXCJza2lwLCBleGNsdWRlQmVnaW4sIHJldHVybkJlZ2luIG5vdCBjb21wYXRpYmxlIHdpdGggYmVnaW5TY29wZToge31cIik7XG4gICAgdGhyb3cgTXVsdGlDbGFzc0Vycm9yO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2RlLmJlZ2luU2NvcGUgIT09IFwib2JqZWN0XCIgfHwgbW9kZS5iZWdpblNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJiZWdpblNjb3BlIG11c3QgYmUgb2JqZWN0XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIHJlbWFwU2NvcGVOYW1lcyhtb2RlLCBtb2RlLmJlZ2luLCB7IGtleTogXCJiZWdpblNjb3BlXCIgfSk7XG4gIG1vZGUuYmVnaW4gPSBfcmV3cml0ZUJhY2tyZWZlcmVuY2VzKG1vZGUuYmVnaW4sIHsgam9pbldpdGg6IFwiXCIgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gZW5kTXVsdGlDbGFzcyhtb2RlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShtb2RlLmVuZCkpIHJldHVybjtcblxuICBpZiAobW9kZS5za2lwIHx8IG1vZGUuZXhjbHVkZUVuZCB8fCBtb2RlLnJldHVybkVuZCkge1xuICAgIGVycm9yKFwic2tpcCwgZXhjbHVkZUVuZCwgcmV0dXJuRW5kIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kU2NvcGU6IHt9XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSAhPT0gXCJvYmplY3RcIiB8fCBtb2RlLmVuZFNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJlbmRTY29wZSBtdXN0IGJlIG9iamVjdFwiKTtcbiAgICB0aHJvdyBNdWx0aUNsYXNzRXJyb3I7XG4gIH1cblxuICByZW1hcFNjb3BlTmFtZXMobW9kZSwgbW9kZS5lbmQsIHsga2V5OiBcImVuZFNjb3BlXCIgfSk7XG4gIG1vZGUuZW5kID0gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhtb2RlLmVuZCwgeyBqb2luV2l0aDogXCJcIiB9KTtcbn1cblxuLyoqXG4gKiB0aGlzIGV4aXN0cyBvbmx5IHRvIGFsbG93IGBzY29wZToge31gIHRvIGJlIHVzZWQgYmVzaWRlIGBtYXRjaDpgXG4gKiBPdGhlcndpc2UgYGJlZ2luU2NvcGVgIHdvdWxkIG5lY2Vzc2FyeSBhbmQgdGhhdCB3b3VsZCBsb29rIHdlaXJkXG5cbiAge1xuICAgIG1hdGNoOiBbIC9kZWYvLCAvXFx3Ky8gXVxuICAgIHNjb3BlOiB7IDE6IFwia2V5d29yZFwiICwgMjogXCJ0aXRsZVwiIH1cbiAgfVxuXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBzY29wZVN1Z2FyKG1vZGUpIHtcbiAgaWYgKG1vZGUuc2NvcGUgJiYgdHlwZW9mIG1vZGUuc2NvcGUgPT09IFwib2JqZWN0XCIgJiYgbW9kZS5zY29wZSAhPT0gbnVsbCkge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IG1vZGUuc2NvcGU7XG4gICAgZGVsZXRlIG1vZGUuc2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBNdWx0aUNsYXNzKG1vZGUpIHtcbiAgc2NvcGVTdWdhcihtb2RlKTtcblxuICBpZiAodHlwZW9mIG1vZGUuYmVnaW5TY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IHsgX3dyYXA6IG1vZGUuYmVnaW5TY29wZSB9O1xuICB9XG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuZW5kU2NvcGUgPSB7IF93cmFwOiBtb2RlLmVuZFNjb3BlIH07XG4gIH1cblxuICBiZWdpbk11bHRpQ2xhc3MobW9kZSk7XG4gIGVuZE11bHRpQ2xhc3MobW9kZSk7XG59XG5cbi8qKlxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRNb2RlfSBDb21waWxlZE1vZGVcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkxhbmd1YWdlfSBMYW5ndWFnZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU1BsdWdpbn0gSExKU1BsdWdpblxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRMYW5ndWFnZX0gQ29tcGlsZWRMYW5ndWFnZVxuKi9cblxuLy8gY29tcGlsYXRpb25cblxuLyoqXG4gKiBDb21waWxlcyBhIGxhbmd1YWdlIGRlZmluaXRpb24gcmVzdWx0XG4gKlxuICogR2l2ZW4gdGhlIHJhdyByZXN1bHQgb2YgYSBsYW5ndWFnZSBkZWZpbml0aW9uIChMYW5ndWFnZSksIGNvbXBpbGVzIHRoaXMgc29cbiAqIHRoYXQgaXQgaXMgcmVhZHkgZm9yIGhpZ2hsaWdodGluZyBjb2RlLlxuICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2VcbiAqIEByZXR1cm5zIHtDb21waWxlZExhbmd1YWdlfVxuICovXG5mdW5jdGlvbiBjb21waWxlTGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHJlZ2V4IHdpdGggdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dsb2JhbF1cbiAgICovXG4gIGZ1bmN0aW9uIGxhbmdSZSh2YWx1ZSwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBzb3VyY2UodmFsdWUpLFxuICAgICAgJ20nXG4gICAgICArIChsYW5ndWFnZS5jYXNlX2luc2Vuc2l0aXZlID8gJ2knIDogJycpXG4gICAgICArIChsYW5ndWFnZS51bmljb2RlUmVnZXggPyAndScgOiAnJylcbiAgICAgICsgKGdsb2JhbCA/ICdnJyA6ICcnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICBTdG9yZXMgbXVsdGlwbGUgcmVndWxhciBleHByZXNzaW9ucyBhbmQgYWxsb3dzIHlvdSB0byBxdWlja2x5IHNlYXJjaCBmb3JcbiAgICB0aGVtIGFsbCBpbiBhIHN0cmluZyBzaW11bHRhbmVvdXNseSAtIHJldHVybmluZyB0aGUgZmlyc3QgbWF0Y2guICBJdCBkb2VzXG4gICAgdGhpcyBieSBjcmVhdGluZyBhIGh1Z2UgKGF8YnxjKSByZWdleCAtIGVhY2ggaW5kaXZpZHVhbCBpdGVtIHdyYXBwZWQgd2l0aCAoKVxuICAgIGFuZCBqb2luZWQgYnkgYHxgIC0gdXNpbmcgbWF0Y2ggZ3JvdXBzIHRvIHRyYWNrIHBvc2l0aW9uLiAgV2hlbiBhIG1hdGNoIGlzXG4gICAgZm91bmQgY2hlY2tpbmcgd2hpY2ggcG9zaXRpb24gaW4gdGhlIGFycmF5IGhhcyBjb250ZW50IGFsbG93cyB1cyB0byBmaWd1cmVcbiAgICBvdXQgd2hpY2ggb2YgdGhlIG9yaWdpbmFsIHJlZ2V4ZXMgLyBtYXRjaCBncm91cHMgdHJpZ2dlcmVkIHRoZSBtYXRjaC5cblxuICAgIFRoZSBtYXRjaCBvYmplY3QgaXRzZWxmICh0aGUgcmVzdWx0IG9mIGBSZWdleC5leGVjYCkgaXMgcmV0dXJuZWQgYnV0IGFsc29cbiAgICBlbmhhbmNlZCBieSBtZXJnaW5nIGluIGFueSBtZXRhLWRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdleC5cbiAgICBUaGlzIGlzIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG1vZGUgbWF0Y2hlZCwgYW5kIHdoYXQgdHlwZSBvZiBydWxlXG4gICAgKGBpbGxlZ2FsYCwgYGJlZ2luYCwgZW5kLCBldGMpLlxuICAqL1xuICBjbGFzcyBNdWx0aVJlZ2V4IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzID0ge307XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlZ2V4ZXMgPSBbXTtcbiAgICAgIHRoaXMubWF0Y2hBdCA9IDE7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYWRkUnVsZShyZSwgb3B0cykge1xuICAgICAgb3B0cy5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb24rKztcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzW3RoaXMubWF0Y2hBdF0gPSBvcHRzO1xuICAgICAgdGhpcy5yZWdleGVzLnB1c2goW29wdHMsIHJlXSk7XG4gICAgICB0aGlzLm1hdGNoQXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZSkgKyAxO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICBpZiAodGhpcy5yZWdleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBhdm9pZHMgdGhlIG5lZWQgdG8gY2hlY2sgbGVuZ3RoIGV2ZXJ5IHRpbWUgZXhlYyBpcyBjYWxsZWRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmV4ZWMgPSAoKSA9PiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdGVybWluYXRvcnMgPSB0aGlzLnJlZ2V4ZXMubWFwKGVsID0+IGVsWzFdKTtcbiAgICAgIHRoaXMubWF0Y2hlclJlID0gbGFuZ1JlKF9yZXdyaXRlQmFja3JlZmVyZW5jZXModGVybWluYXRvcnMsIHsgam9pbldpdGg6ICd8JyB9KSwgdHJ1ZSk7XG4gICAgICB0aGlzLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBzICovXG4gICAgZXhlYyhzKSB7XG4gICAgICB0aGlzLm1hdGNoZXJSZS5sYXN0SW5kZXggPSB0aGlzLmxhc3RJbmRleDtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaGVyUmUuZXhlYyhzKTtcbiAgICAgIGlmICghbWF0Y2gpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICAgICAgY29uc3QgaSA9IG1hdGNoLmZpbmRJbmRleCgoZWwsIGkpID0+IGkgPiAwICYmIGVsICE9PSB1bmRlZmluZWQpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbWF0Y2hEYXRhID0gdGhpcy5tYXRjaEluZGV4ZXNbaV07XG4gICAgICAvLyB0cmltIG9mZiBhbnkgZWFybGllciBub24tcmVsZXZhbnQgbWF0Y2ggZ3JvdXBzIChpZSwgdGhlIG90aGVyIHJlZ2V4XG4gICAgICAvLyBtYXRjaCBncm91cHMgdGhhdCBtYWtlIHVwIHRoZSBtdWx0aS1tYXRjaGVyKVxuICAgICAgbWF0Y2guc3BsaWNlKDAsIGkpO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihtYXRjaCwgbWF0Y2hEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgIENyZWF0ZWQgdG8gc29sdmUgdGhlIGtleSBkZWZpY2llbnRseSB3aXRoIE11bHRpUmVnZXggLSB0aGVyZSBpcyBubyB3YXkgdG9cbiAgICB0ZXN0IGZvciBtdWx0aXBsZSBtYXRjaGVzIGF0IGEgc2luZ2xlIGxvY2F0aW9uLiAgV2h5IHdvdWxkIHdlIG5lZWQgdG8gZG9cbiAgICB0aGF0PyAgSW4gdGhlIGZ1dHVyZSBhIG1vcmUgZHluYW1pYyBlbmdpbmUgd2lsbCBhbGxvdyBjZXJ0YWluIG1hdGNoZXMgdG8gYmVcbiAgICBpZ25vcmVkLiAgQW4gZXhhbXBsZTogaWYgd2UgbWF0Y2hlZCBzYXkgdGhlIDNyZCByZWdleCBpbiBhIGxhcmdlIGdyb3VwIGJ1dFxuICAgIGRlY2lkZWQgdG8gaWdub3JlIGl0IC0gd2UnZCBuZWVkIHRvIHN0YXJ0ZWQgdGVzdGluZyBhZ2FpbiBhdCB0aGUgNHRoXG4gICAgcmVnZXguLi4gYnV0IE11bHRpUmVnZXggaXRzZWxmIGdpdmVzIHVzIG5vIHJlYWwgd2F5IHRvIGRvIHRoYXQuXG5cbiAgICBTbyB3aGF0IHRoaXMgY2xhc3MgY3JlYXRlcyBNdWx0aVJlZ2V4cyBvbiB0aGUgZmx5IGZvciB3aGF0ZXZlciBzZWFyY2hcbiAgICBwb3NpdGlvbiB0aGV5IGFyZSBuZWVkZWQuXG5cbiAgICBOT1RFOiBUaGVzZSBhZGRpdGlvbmFsIE11bHRpUmVnZXggb2JqZWN0cyBhcmUgY3JlYXRlZCBkeW5hbWljYWxseS4gIEZvciBtb3N0XG4gICAgZ3JhbW1hcnMgbW9zdCBvZiB0aGUgdGltZSB3ZSB3aWxsIG5ldmVyIGFjdHVhbGx5IG5lZWQgYW55dGhpbmcgbW9yZSB0aGFuIHRoZVxuICAgIGZpcnN0IE11bHRpUmVnZXggLSBzbyB0aGlzIHNob3VsZG4ndCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkLlxuXG4gICAgU2F5IHRoaXMgaXMgb3VyIHNlYXJjaCBncm91cCwgYW5kIHdlIG1hdGNoIHJlZ2V4MywgYnV0IHdpc2ggdG8gaWdub3JlIGl0LlxuXG4gICAgICByZWdleDEgfCByZWdleDIgfCByZWdleDMgfCByZWdleDQgfCByZWdleDUgICAgJyBpZSwgc3RhcnRBdCA9IDBcblxuICAgIFdoYXQgd2UgbmVlZCBpcyBhIG5ldyBNdWx0aVJlZ2V4IHRoYXQgb25seSBpbmNsdWRlcyB0aGUgcmVtYWluaW5nXG4gICAgcG9zc2liaWxpdGllczpcblxuICAgICAgcmVnZXg0IHwgcmVnZXg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgaWUsIHN0YXJ0QXQgPSAzXG5cbiAgICBUaGlzIGNsYXNzIHdyYXBzIGFsbCB0aGF0IGNvbXBsZXhpdHkgdXAgaW4gYSBzaW1wbGUgQVBJLi4uIGBzdGFydEF0YCBkZWNpZGVzXG4gICAgd2hlcmUgaW4gdGhlIGFycmF5IG9mIGV4cHJlc3Npb25zIHRvIHN0YXJ0IGRvaW5nIHRoZSBtYXRjaGluZy4gSXRcbiAgICBhdXRvLWluY3JlbWVudHMsIHNvIGlmIGEgbWF0Y2ggaXMgZm91bmQgYXQgcG9zaXRpb24gMiwgdGhlbiBzdGFydEF0IHdpbGwgYmVcbiAgICBzZXQgdG8gMy4gIElmIHRoZSBlbmQgaXMgcmVhY2hlZCBzdGFydEF0IHdpbGwgcmV0dXJuIHRvIDAuXG5cbiAgICBNT1NUIG9mIHRoZSB0aW1lIHRoZSBwYXJzZXIgd2lsbCBiZSBzZXR0aW5nIHN0YXJ0QXQgbWFudWFsbHkgdG8gMC5cbiAgKi9cbiAgY2xhc3MgUmVzdW1hYmxlTXVsdGlSZWdleCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJ1bGVzID0gW107XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm11bHRpUmVnZXhlcyA9IFtdO1xuICAgICAgdGhpcy5jb3VudCA9IDA7XG5cbiAgICAgIHRoaXMubGFzdEluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVnZXhJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGdldE1hdGNoZXIoaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpUmVnZXhlc1tpbmRleF0pIHJldHVybiB0aGlzLm11bHRpUmVnZXhlc1tpbmRleF07XG5cbiAgICAgIGNvbnN0IG1hdGNoZXIgPSBuZXcgTXVsdGlSZWdleCgpO1xuICAgICAgdGhpcy5ydWxlcy5zbGljZShpbmRleCkuZm9yRWFjaCgoW3JlLCBvcHRzXSkgPT4gbWF0Y2hlci5hZGRSdWxlKHJlLCBvcHRzKSk7XG4gICAgICBtYXRjaGVyLmNvbXBpbGUoKTtcbiAgICAgIHRoaXMubXVsdGlSZWdleGVzW2luZGV4XSA9IG1hdGNoZXI7XG4gICAgICByZXR1cm4gbWF0Y2hlcjtcbiAgICB9XG5cbiAgICByZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2V4SW5kZXggIT09IDA7XG4gICAgfVxuXG4gICAgY29uc2lkZXJBbGwoKSB7XG4gICAgICB0aGlzLnJlZ2V4SW5kZXggPSAwO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhZGRSdWxlKHJlLCBvcHRzKSB7XG4gICAgICB0aGlzLnJ1bGVzLnB1c2goW3JlLCBvcHRzXSk7XG4gICAgICBpZiAob3B0cy50eXBlID09PSBcImJlZ2luXCIpIHRoaXMuY291bnQrKztcbiAgICB9XG5cbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IHMgKi9cbiAgICBleGVjKHMpIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLmdldE1hdGNoZXIodGhpcy5yZWdleEluZGV4KTtcbiAgICAgIG0ubGFzdEluZGV4ID0gdGhpcy5sYXN0SW5kZXg7XG4gICAgICBsZXQgcmVzdWx0ID0gbS5leGVjKHMpO1xuXG4gICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBlYXN5IHdheSB0byBzYXkgXCJyZXN1bWUgc2Nhbm5pbmcgYXQgdGhlXG4gICAgICAvLyBleGlzdGluZyBwb3NpdGlvbiBidXQgYWxzbyBza2lwIHRoZSBjdXJyZW50IHJ1bGUgT05MWVwiLiBXaGF0IGhhcHBlbnMgaXNcbiAgICAgIC8vIGFsbCBwcmlvciBydWxlcyBhcmUgYWxzbyBza2lwcGVkIHdoaWNoIGNhbiByZXN1bHQgaW4gbWF0Y2hpbmcgdGhlIHdyb25nXG4gICAgICAvLyB0aGluZy4gRXhhbXBsZSBvZiBtYXRjaGluZyBcImJvb2dlclwiOlxuXG4gICAgICAvLyBvdXIgbWF0Y2hlciBpcyBbc3RyaW5nLCBcImJvb2dlclwiLCBudW1iZXJdXG4gICAgICAvL1xuICAgICAgLy8gLi4uLmJvb2dlci4uLi5cblxuICAgICAgLy8gaWYgXCJib29nZXJcIiBpcyBpZ25vcmVkIHRoZW4gd2UnZCByZWFsbHkgbmVlZCBhIHJlZ2V4IHRvIHNjYW4gZnJvbSB0aGVcbiAgICAgIC8vIFNBTUUgcG9zaXRpb24gZm9yIG9ubHk6IFtzdHJpbmcsIG51bWJlcl0gYnV0IGlnbm9yaW5nIFwiYm9vZ2VyXCIgKGlmIGl0XG4gICAgICAvLyB3YXMgdGhlIGZpcnN0IG1hdGNoKSwgYSBzaW1wbGUgcmVzdW1lIHdvdWxkIHNjYW4gYWhlYWQgd2hvIGtub3dzIGhvd1xuICAgICAgLy8gZmFyIGxvb2tpbmcgb25seSBmb3IgXCJudW1iZXJcIiwgaWdub3JpbmcgcG90ZW50aWFsIHN0cmluZyBtYXRjaGVzIChvclxuICAgICAgLy8gZnV0dXJlIFwiYm9vZ2VyXCIgbWF0Y2hlcyB0aGF0IG1pZ2h0IGJlIHZhbGlkLilcblxuICAgICAgLy8gU28gd2hhdCB3ZSBkbzogV2UgZXhlY3V0ZSB0d28gbWF0Y2hlcnMsIG9uZSByZXN1bWluZyBhdCB0aGUgc2FtZVxuICAgICAgLy8gcG9zaXRpb24sIGJ1dCB0aGUgc2Vjb25kIGZ1bGwgbWF0Y2hlciBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24gYWZ0ZXI6XG5cbiAgICAgIC8vICAgICAvLS0tIHJlc3VtZSBmaXJzdCByZWdleCBtYXRjaCBoZXJlIChmb3IgW251bWJlcl0pXG4gICAgICAvLyAgICAgfC8tLS0tIGZ1bGwgbWF0Y2ggaGVyZSBmb3IgW3N0cmluZywgXCJib29nZXJcIiwgbnVtYmVyXVxuICAgICAgLy8gICAgIHZ2XG4gICAgICAvLyAuLi4uYm9vZ2VyLi4uLlxuXG4gICAgICAvLyBXaGljaCBldmVyIHJlc3VsdHMgaW4gYSBtYXRjaCBmaXJzdCBpcyB0aGVuIHVzZWQuIFNvIHRoaXMgMy00IHN0ZXBcbiAgICAgIC8vIHByb2Nlc3MgZXNzZW50aWFsbHkgYWxsb3dzIHVzIHRvIHNheSBcIm1hdGNoIGF0IHRoaXMgcG9zaXRpb24sIGV4Y2x1ZGluZ1xuICAgICAgLy8gYSBwcmlvciBydWxlIHRoYXQgd2FzIGlnbm9yZWRcIi5cbiAgICAgIC8vXG4gICAgICAvLyAxLiBNYXRjaCBcImJvb2dlclwiIGZpcnN0LCBpZ25vcmUuIEFsc28gcHJvdmVzIHRoYXQgW3N0cmluZ10gZG9lcyBub24gbWF0Y2guXG4gICAgICAvLyAyLiBSZXN1bWUgbWF0Y2hpbmcgZm9yIFtudW1iZXJdXG4gICAgICAvLyAzLiBNYXRjaCBhdCBpbmRleCArIDEgZm9yIFtzdHJpbmcsIFwiYm9vZ2VyXCIsIG51bWJlcl1cbiAgICAgIC8vIDQuIElmICMyIGFuZCAjMyByZXN1bHQgaW4gbWF0Y2hlcywgd2hpY2ggY2FtZSBmaXJzdD9cbiAgICAgIGlmICh0aGlzLnJlc3VtaW5nU2NhbkF0U2FtZVBvc2l0aW9uKCkpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuaW5kZXggPT09IHRoaXMubGFzdEluZGV4KSA7IGVsc2UgeyAvLyB1c2UgdGhlIHNlY29uZCBtYXRjaGVyIHJlc3VsdFxuICAgICAgICAgIGNvbnN0IG0yID0gdGhpcy5nZXRNYXRjaGVyKDApO1xuICAgICAgICAgIG0yLmxhc3RJbmRleCA9IHRoaXMubGFzdEluZGV4ICsgMTtcbiAgICAgICAgICByZXN1bHQgPSBtMi5leGVjKHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWdleEluZGV4ICs9IHJlc3VsdC5wb3NpdGlvbiArIDE7XG4gICAgICAgIGlmICh0aGlzLnJlZ2V4SW5kZXggPT09IHRoaXMuY291bnQpIHtcbiAgICAgICAgICAvLyB3cmFwLWFyb3VuZCB0byBjb25zaWRlcmluZyBhbGwgbWF0Y2hlcyBhZ2FpblxuICAgICAgICAgIHRoaXMuY29uc2lkZXJBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG1vZGUsIGJ1aWxkcyBhIGh1Z2UgUmVzdW1hYmxlTXVsdGlSZWdleCB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhbGtcbiAgICogdGhlIGNvbnRlbnQgYW5kIGZpbmQgbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAgICogQHJldHVybnMge1Jlc3VtYWJsZU11bHRpUmVnZXh9XG4gICAqL1xuICBmdW5jdGlvbiBidWlsZE1vZGVSZWdleChtb2RlKSB7XG4gICAgY29uc3QgbW0gPSBuZXcgUmVzdW1hYmxlTXVsdGlSZWdleCgpO1xuXG4gICAgbW9kZS5jb250YWlucy5mb3JFYWNoKHRlcm0gPT4gbW0uYWRkUnVsZSh0ZXJtLmJlZ2luLCB7IHJ1bGU6IHRlcm0sIHR5cGU6IFwiYmVnaW5cIiB9KSk7XG5cbiAgICBpZiAobW9kZS50ZXJtaW5hdG9yRW5kKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUudGVybWluYXRvckVuZCwgeyB0eXBlOiBcImVuZFwiIH0pO1xuICAgIH1cbiAgICBpZiAobW9kZS5pbGxlZ2FsKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUuaWxsZWdhbCwgeyB0eXBlOiBcImlsbGVnYWxcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW07XG4gIH1cblxuICAvKiogc2tpcCB2cyBhYm9ydCB2cyBpZ25vcmVcbiAgICpcbiAgICogQHNraXAgICAtIFRoZSBtb2RlIGlzIHN0aWxsIGVudGVyZWQgYW5kIGV4aXRlZCBub3JtYWxseSAoYW5kIGNvbnRhaW5zIHJ1bGVzIGFwcGx5KSxcbiAgICogICAgICAgICAgIGJ1dCBhbGwgY29udGVudCBpcyBoZWxkIGFuZCBhZGRlZCB0byB0aGUgcGFyZW50IGJ1ZmZlciByYXRoZXIgdGhhbiBiZWluZ1xuICAgKiAgICAgICAgICAgb3V0cHV0IHdoZW4gdGhlIG1vZGUgZW5kcy4gIE1vc3RseSB1c2VkIHdpdGggYHN1Ymxhbmd1YWdlYCB0byBidWlsZCB1cFxuICAgKiAgICAgICAgICAgYSBzaW5nbGUgbGFyZ2UgYnVmZmVyIHRoYW4gY2FuIGJlIHBhcnNlZCBieSBzdWJsYW5ndWFnZS5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBiZWdpbiBhbmRzIGVuZHMgbm9ybWFsbHkuXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQgbW9kZSBidWZmZXIuXG4gICAqICAgICAgICAgICAgIC0gVGhlIHBhcnNlciBjdXJzb3IgaXMgbW92ZWQgZm9yd2FyZCBub3JtYWxseS5cbiAgICpcbiAgICogQGFib3J0ICAtIEEgaGFjayBwbGFjZWhvbGRlciB1bnRpbCB3ZSBoYXZlIGlnbm9yZS4gIEFib3J0cyB0aGUgbW9kZSAoYXMgaWYgaXRcbiAgICogICAgICAgICAgIG5ldmVyIG1hdGNoZWQpIGJ1dCBET0VTIE5PVCBjb250aW51ZSB0byBtYXRjaCBzdWJzZXF1ZW50IGBjb250YWluc2BcbiAgICogICAgICAgICAgIG1vZGVzLiAgQWJvcnQgaXMgYmFkL3N1Ym9wdGltYWwgYmVjYXVzZSBpdCBjYW4gcmVzdWx0IGluIG1vZGVzXG4gICAqICAgICAgICAgICBmYXJ0aGVyIGRvd24gbm90IGdldHRpbmcgYXBwbGllZCBiZWNhdXNlIGFuIGVhcmxpZXIgcnVsZSBlYXRzIHRoZVxuICAgKiAgICAgICAgICAgY29udGVudCBidXQgdGhlbiBhYm9ydHMuXG4gICAqXG4gICAqICAgICAgICAgICAgIC0gVGhlIG1vZGUgZG9lcyBub3QgYmVnaW4uXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGJ5IGBiZWdpbmAgaXMgYWRkZWQgdG8gdGhlIG1vZGUgYnVmZmVyLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG1vdmVkIGZvcndhcmQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBpZ25vcmUgLSBJZ25vcmVzIHRoZSBtb2RlIChhcyBpZiBpdCBuZXZlciBtYXRjaGVkKSBhbmQgY29udGludWVzIHRvIG1hdGNoIGFueVxuICAgKiAgICAgICAgICAgc3Vic2VxdWVudCBgY29udGFpbnNgIG1vZGVzLiAgSWdub3JlIGlzbid0IHRlY2huaWNhbGx5IHBvc3NpYmxlIHdpdGhcbiAgICogICAgICAgICAgIHRoZSBjdXJyZW50IHBhcnNlciBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBkb2VzIG5vdCBiZWdpbi5cbiAgICogICAgICAgICAgICAgLSBDb250ZW50IG1hdGNoZWQgYnkgYGJlZ2luYCBpcyBpZ25vcmVkLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG5vdCBtb3ZlZCBmb3J3YXJkLlxuICAgKi9cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBtb2RlXG4gICAqXG4gICAqIFRoaXMgY2FuIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBtb2RlIGNvbnRhaW5zIGNlcnRhaW4gZGV0ZWN0YWJsZSBrbm93biBsb2dpY1xuICAgKiBpc3N1ZXMuXG4gICAqIEBwYXJhbSB7TW9kZX0gbW9kZVxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZSB8IG51bGx9IFtwYXJlbnRdXG4gICAqIEByZXR1cm5zIHtDb21waWxlZE1vZGUgfCBuZXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVNb2RlKG1vZGUsIHBhcmVudCkge1xuICAgIGNvbnN0IGNtb2RlID0gLyoqIEB0eXBlIENvbXBpbGVkTW9kZSAqLyAobW9kZSk7XG4gICAgaWYgKG1vZGUuaXNDb21waWxlZCkgcmV0dXJuIGNtb2RlO1xuXG4gICAgW1xuICAgICAgc2NvcGVDbGFzc05hbWUsXG4gICAgICAvLyBkbyB0aGlzIGVhcmx5IHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgZ2VuZXJhbGx5IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXRcbiAgICAgIC8vIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG1hdGNoL2JlZ2luXG4gICAgICBjb21waWxlTWF0Y2gsXG4gICAgICBNdWx0aUNsYXNzLFxuICAgICAgYmVmb3JlTWF0Y2hFeHRcbiAgICBdLmZvckVhY2goZXh0ID0+IGV4dChtb2RlLCBwYXJlbnQpKTtcblxuICAgIGxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucy5mb3JFYWNoKGV4dCA9PiBleHQobW9kZSwgcGFyZW50KSk7XG5cbiAgICAvLyBfX2JlZm9yZUJlZ2luIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSBBUEksIGludGVybmFsIHVzZSBvbmx5XG4gICAgbW9kZS5fX2JlZm9yZUJlZ2luID0gbnVsbDtcblxuICAgIFtcbiAgICAgIGJlZ2luS2V5d29yZHMsXG4gICAgICAvLyBkbyB0aGlzIGxhdGVyIHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgdGhhdCBjb21lIGVhcmxpZXIgaGF2ZSBhY2Nlc3MgdG8gdGhlXG4gICAgICAvLyByYXcgYXJyYXkgaWYgdGhleSB3YW50ZWQgdG8gcGVyaGFwcyBtYW5pcHVsYXRlIGl0LCBldGMuXG4gICAgICBjb21waWxlSWxsZWdhbCxcbiAgICAgIC8vIGRlZmF1bHQgdG8gMSByZWxldmFuY2UgaWYgbm90IHNwZWNpZmllZFxuICAgICAgY29tcGlsZVJlbGV2YW5jZVxuICAgIF0uZm9yRWFjaChleHQgPT4gZXh0KG1vZGUsIHBhcmVudCkpO1xuXG4gICAgbW9kZS5pc0NvbXBpbGVkID0gdHJ1ZTtcblxuICAgIGxldCBrZXl3b3JkUGF0dGVybiA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBtb2RlLmtleXdvcmRzID09PSBcIm9iamVjdFwiICYmIG1vZGUua2V5d29yZHMuJHBhdHRlcm4pIHtcbiAgICAgIC8vIHdlIG5lZWQgYSBjb3B5IGJlY2F1c2Uga2V5d29yZHMgbWlnaHQgYmUgY29tcGlsZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgIC8vIHNvIHdlIGNhbid0IGdvIGRlbGV0aW5nICRwYXR0ZXJuIGZyb20gdGhlIG9yaWdpbmFsIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gcGFzc1xuICAgICAgbW9kZS5rZXl3b3JkcyA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGUua2V5d29yZHMpO1xuICAgICAga2V5d29yZFBhdHRlcm4gPSBtb2RlLmtleXdvcmRzLiRwYXR0ZXJuO1xuICAgICAgZGVsZXRlIG1vZGUua2V5d29yZHMuJHBhdHRlcm47XG4gICAgfVxuICAgIGtleXdvcmRQYXR0ZXJuID0ga2V5d29yZFBhdHRlcm4gfHwgL1xcdysvO1xuXG4gICAgaWYgKG1vZGUua2V5d29yZHMpIHtcbiAgICAgIG1vZGUua2V5d29yZHMgPSBjb21waWxlS2V5d29yZHMobW9kZS5rZXl3b3JkcywgbGFuZ3VhZ2UuY2FzZV9pbnNlbnNpdGl2ZSk7XG4gICAgfVxuXG4gICAgY21vZGUua2V5d29yZFBhdHRlcm5SZSA9IGxhbmdSZShrZXl3b3JkUGF0dGVybiwgdHJ1ZSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAoIW1vZGUuYmVnaW4pIG1vZGUuYmVnaW4gPSAvXFxCfFxcYi87XG4gICAgICBjbW9kZS5iZWdpblJlID0gbGFuZ1JlKGNtb2RlLmJlZ2luKTtcbiAgICAgIGlmICghbW9kZS5lbmQgJiYgIW1vZGUuZW5kc1dpdGhQYXJlbnQpIG1vZGUuZW5kID0gL1xcQnxcXGIvO1xuICAgICAgaWYgKG1vZGUuZW5kKSBjbW9kZS5lbmRSZSA9IGxhbmdSZShjbW9kZS5lbmQpO1xuICAgICAgY21vZGUudGVybWluYXRvckVuZCA9IHNvdXJjZShjbW9kZS5lbmQpIHx8ICcnO1xuICAgICAgaWYgKG1vZGUuZW5kc1dpdGhQYXJlbnQgJiYgcGFyZW50LnRlcm1pbmF0b3JFbmQpIHtcbiAgICAgICAgY21vZGUudGVybWluYXRvckVuZCArPSAobW9kZS5lbmQgPyAnfCcgOiAnJykgKyBwYXJlbnQudGVybWluYXRvckVuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZGUuaWxsZWdhbCkgY21vZGUuaWxsZWdhbFJlID0gbGFuZ1JlKC8qKiBAdHlwZSB7UmVnRXhwIHwgc3RyaW5nfSAqLyAobW9kZS5pbGxlZ2FsKSk7XG4gICAgaWYgKCFtb2RlLmNvbnRhaW5zKSBtb2RlLmNvbnRhaW5zID0gW107XG5cbiAgICBtb2RlLmNvbnRhaW5zID0gW10uY29uY2F0KC4uLm1vZGUuY29udGFpbnMubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBleHBhbmRPckNsb25lTW9kZShjID09PSAnc2VsZicgPyBtb2RlIDogYyk7XG4gICAgfSkpO1xuICAgIG1vZGUuY29udGFpbnMuZm9yRWFjaChmdW5jdGlvbihjKSB7IGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChjKSwgY21vZGUpOyB9KTtcblxuICAgIGlmIChtb2RlLnN0YXJ0cykge1xuICAgICAgY29tcGlsZU1vZGUobW9kZS5zdGFydHMsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgY21vZGUubWF0Y2hlciA9IGJ1aWxkTW9kZVJlZ2V4KGNtb2RlKTtcbiAgICByZXR1cm4gY21vZGU7XG4gIH1cblxuICBpZiAoIWxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucykgbGFuZ3VhZ2UuY29tcGlsZXJFeHRlbnNpb25zID0gW107XG5cbiAgLy8gc2VsZiBpcyBub3QgdmFsaWQgYXQgdGhlIHRvcC1sZXZlbFxuICBpZiAobGFuZ3VhZ2UuY29udGFpbnMgJiYgbGFuZ3VhZ2UuY29udGFpbnMuaW5jbHVkZXMoJ3NlbGYnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkVSUjogY29udGFpbnMgYHNlbGZgIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIGxhbmd1YWdlLiAgU2VlIGRvY3VtZW50YXRpb24uXCIpO1xuICB9XG5cbiAgLy8gd2UgbmVlZCBhIG51bGwgb2JqZWN0LCB3aGljaCBpbmhlcml0IHdpbGwgZ3VhcmFudGVlXG4gIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXMgPSBpbmhlcml0JDEobGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlcyB8fCB7fSk7XG5cbiAgcmV0dXJuIGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChsYW5ndWFnZSkpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBtb2RlIGhhcyBhIGRlcGVuZGVuY3kgb24gaXQncyBwYXJlbnQgb3Igbm90XG4gKlxuICogSWYgYSBtb2RlIGRvZXMgaGF2ZSBhIHBhcmVudCBkZXBlbmRlbmN5IHRoZW4gb2Z0ZW4gd2UgbmVlZCB0byBjbG9uZSBpdCBpZlxuICogaXQncyB1c2VkIGluIG11bHRpcGxlIHBsYWNlcyBzbyB0aGF0IGVhY2ggY29weSBwb2ludHMgdG8gdGhlIGNvcnJlY3QgcGFyZW50LFxuICogd2hlcmUtYXMgbW9kZXMgd2l0aG91dCBhIHBhcmVudCBjYW4gb2Z0ZW4gc2FmZWx5IGJlIHJlLXVzZWQgYXQgdGhlIGJvdHRvbSBvZlxuICogYSBtb2RlIGNoYWluLlxuICpcbiAqIEBwYXJhbSB7TW9kZSB8IG51bGx9IG1vZGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIGlzIHRoZXJlIGEgZGVwZW5kZW5jeSBvbiB0aGUgcGFyZW50P1xuICogKi9cbmZ1bmN0aW9uIGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSB7XG4gIGlmICghbW9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBtb2RlLmVuZHNXaXRoUGFyZW50IHx8IGRlcGVuZGVuY3lPblBhcmVudChtb2RlLnN0YXJ0cyk7XG59XG5cbi8qKlxuICogRXhwYW5kcyBhIG1vZGUgb3IgY2xvbmVzIGl0IGlmIG5lY2Vzc2FyeVxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBtb2RlcyB3aXRoIHBhcmVudGFsIGRlcGVuZGVuY2VpcyAoc2VlIG5vdGVzIG9uXG4gKiBgZGVwZW5kZW5jeU9uUGFyZW50YCkgYW5kIGZvciBub2RlcyB0aGF0IGhhdmUgYHZhcmlhbnRzYCAtIHdoaWNoIG11c3QgdGhlbiBiZVxuICogZXhwbG9kZWQgaW50byB0aGVpciBvd24gaW5kaXZpZHVhbCBtb2RlcyBhdCBjb21waWxlIHRpbWUuXG4gKlxuICogQHBhcmFtIHtNb2RlfSBtb2RlXG4gKiBAcmV0dXJucyB7TW9kZSB8IE1vZGVbXX1cbiAqICovXG5mdW5jdGlvbiBleHBhbmRPckNsb25lTW9kZShtb2RlKSB7XG4gIGlmIChtb2RlLnZhcmlhbnRzICYmICFtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgbW9kZS5jYWNoZWRWYXJpYW50cyA9IG1vZGUudmFyaWFudHMubWFwKGZ1bmN0aW9uKHZhcmlhbnQpIHtcbiAgICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyB2YXJpYW50czogbnVsbCB9LCB2YXJpYW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEVYUEFORFxuICAvLyBpZiB3ZSBoYXZlIHZhcmlhbnRzIHRoZW4gZXNzZW50aWFsbHkgXCJyZXBsYWNlXCIgdGhlIG1vZGUgd2l0aCB0aGUgdmFyaWFudHNcbiAgLy8gdGhpcyBoYXBwZW5zIGluIGNvbXBpbGVNb2RlLCB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tXG4gIGlmIChtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgcmV0dXJuIG1vZGUuY2FjaGVkVmFyaWFudHM7XG4gIH1cblxuICAvLyBDTE9ORVxuICAvLyBpZiB3ZSBoYXZlIGRlcGVuZGVuY2llcyBvbiBwYXJlbnRzIHRoZW4gd2UgbmVlZCBhIHVuaXF1ZVxuICAvLyBpbnN0YW5jZSBvZiBvdXJzZWx2ZXMsIHNvIHdlIGNhbiBiZSByZXVzZWQgd2l0aCBtYW55XG4gIC8vIGRpZmZlcmVudCBwYXJlbnRzIHdpdGhvdXQgaXNzdWVcbiAgaWYgKGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSkge1xuICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyBzdGFydHM6IG1vZGUuc3RhcnRzID8gaW5oZXJpdCQxKG1vZGUuc3RhcnRzKSA6IG51bGwgfSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmlzRnJvemVuKG1vZGUpKSB7XG4gICAgcmV0dXJuIGluaGVyaXQkMShtb2RlKTtcbiAgfVxuXG4gIC8vIG5vIHNwZWNpYWwgZGVwZW5kZW5jeSBpc3N1ZXMsIGp1c3QgcmV0dXJuIG91cnNlbHZlc1xuICByZXR1cm4gbW9kZTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjExLjguMFwiO1xuXG5jbGFzcyBIVE1MSW5qZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbiwgaHRtbCkge1xuICAgIHN1cGVyKHJlYXNvbik7XG4gICAgdGhpcy5uYW1lID0gXCJIVE1MSW5qZWN0aW9uRXJyb3JcIjtcbiAgICB0aGlzLmh0bWwgPSBodG1sO1xuICB9XG59XG5cbi8qXG5TeW50YXggaGlnaGxpZ2h0aW5nIHdpdGggbGFuZ3VhZ2UgYXV0b2RldGVjdGlvbi5cbmh0dHBzOi8vaGlnaGxpZ2h0anMub3JnL1xuKi9cblxuXG4vKipcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLk1vZGV9IE1vZGVcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Db21waWxlZFNjb3BlfSBDb21waWxlZFNjb3BlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5MYW5ndWFnZX0gTGFuZ3VhZ2VcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhMSlNBcGl9IEhMSlNBcGlcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhMSlNQbHVnaW59IEhMSlNQbHVnaW5cbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLlBsdWdpbkV2ZW50fSBQbHVnaW5FdmVudFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU09wdGlvbnN9IEhMSlNPcHRpb25zXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5MYW5ndWFnZUZufSBMYW5ndWFnZUZuXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5IaWdobGlnaHRlZEhUTUxFbGVtZW50fSBIaWdobGlnaHRlZEhUTUxFbGVtZW50XG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5CZWZvcmVIaWdobGlnaHRDb250ZXh0fSBCZWZvcmVIaWdobGlnaHRDb250ZXh0XG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvcHJpdmF0ZScpLk1hdGNoVHlwZX0gTWF0Y2hUeXBlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvcHJpdmF0ZScpLktleXdvcmREYXRhfSBLZXl3b3JkRGF0YVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5FbmhhbmNlZE1hdGNofSBFbmhhbmNlZE1hdGNoXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvcHJpdmF0ZScpLkFubm90YXRlZEVycm9yfSBBbm5vdGF0ZWRFcnJvclxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQXV0b0hpZ2hsaWdodFJlc3VsdH0gQXV0b0hpZ2hsaWdodFJlc3VsdFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSGlnaGxpZ2h0T3B0aW9uc30gSGlnaGxpZ2h0T3B0aW9uc1xuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSGlnaGxpZ2h0UmVzdWx0fSBIaWdobGlnaHRSZXN1bHRcbiovXG5cblxuY29uc3QgZXNjYXBlID0gZXNjYXBlSFRNTDtcbmNvbnN0IGluaGVyaXQgPSBpbmhlcml0JDE7XG5jb25zdCBOT19NQVRDSCA9IFN5bWJvbChcIm5vbWF0Y2hcIik7XG5jb25zdCBNQVhfS0VZV09SRF9ISVRTID0gNztcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gaGxqcyAtIG9iamVjdCB0aGF0IGlzIGV4dGVuZGVkIChsZWdhY3kpXG4gKiBAcmV0dXJucyB7SExKU0FwaX1cbiAqL1xuY29uc3QgSExKUyA9IGZ1bmN0aW9uKGhsanMpIHtcbiAgLy8gR2xvYmFsIGludGVybmFsIHZhcmlhYmxlcyB1c2VkIHdpdGhpbiB0aGUgaGlnaGxpZ2h0LmpzIGxpYnJhcnkuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTGFuZ3VhZ2U+fSAqL1xuICBjb25zdCBsYW5ndWFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGFsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvKiogQHR5cGUge0hMSlNQbHVnaW5bXX0gKi9cbiAgY29uc3QgcGx1Z2lucyA9IFtdO1xuXG4gIC8vIHNhZmUvcHJvZHVjdGlvbiBtb2RlIC0gc3dhbGxvd3MgbW9yZSBlcnJvcnMsIHRyaWVzIHRvIGtlZXAgcnVubmluZ1xuICAvLyBldmVuIGlmIGEgc2luZ2xlIHN5bnRheCBvciBwYXJzZSBoaXRzIGEgZmF0YWwgZXJyb3JcbiAgbGV0IFNBRkVfTU9ERSA9IHRydWU7XG4gIGNvbnN0IExBTkdVQUdFX05PVF9GT1VORCA9IFwiQ291bGQgbm90IGZpbmQgdGhlIGxhbmd1YWdlICd7fScsIGRpZCB5b3UgZm9yZ2V0IHRvIGxvYWQvaW5jbHVkZSBhIGxhbmd1YWdlIG1vZHVsZT9cIjtcbiAgLyoqIEB0eXBlIHtMYW5ndWFnZX0gKi9cbiAgY29uc3QgUExBSU5URVhUX0xBTkdVQUdFID0geyBkaXNhYmxlQXV0b2RldGVjdDogdHJ1ZSwgbmFtZTogJ1BsYWluIHRleHQnLCBjb250YWluczogW10gfTtcblxuICAvLyBHbG9iYWwgb3B0aW9ucyB1c2VkIHdoZW4gd2l0aGluIGV4dGVybmFsIEFQSXMuIFRoaXMgaXMgbW9kaWZpZWQgd2hlblxuICAvLyBjYWxsaW5nIHRoZSBgaGxqcy5jb25maWd1cmVgIGZ1bmN0aW9uLlxuICAvKiogQHR5cGUgSExKU09wdGlvbnMgKi9cbiAgbGV0IG9wdGlvbnMgPSB7XG4gICAgaWdub3JlVW5lc2NhcGVkSFRNTDogZmFsc2UsXG4gICAgdGhyb3dVbmVzY2FwZWRIVE1MOiBmYWxzZSxcbiAgICBub0hpZ2hsaWdodFJlOiAvXihuby0/aGlnaGxpZ2h0KSQvaSxcbiAgICBsYW5ndWFnZURldGVjdFJlOiAvXFxibGFuZyg/OnVhZ2UpPy0oW1xcdy1dKylcXGIvaSxcbiAgICBjbGFzc1ByZWZpeDogJ2hsanMtJyxcbiAgICBjc3NTZWxlY3RvcjogJ3ByZSBjb2RlJyxcbiAgICBsYW5ndWFnZXM6IG51bGwsXG4gICAgLy8gYmV0YSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHN1YmplY3QgdG8gY2hhbmdlLCB3ZWxjb21lIHRvIGRpc2N1c3NcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8xMDg2XG4gICAgX19lbWl0dGVyOiBUb2tlblRyZWVFbWl0dGVyXG4gIH07XG5cbiAgLyogVXRpbGl0eSBmdW5jdGlvbnMgKi9cblxuICAvKipcbiAgICogVGVzdHMgYSBsYW5ndWFnZSBuYW1lIHRvIHNlZSBpZiBoaWdobGlnaHRpbmcgc2hvdWxkIGJlIHNraXBwZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkTm90SGlnaGxpZ2h0KGxhbmd1YWdlTmFtZSkge1xuICAgIHJldHVybiBvcHRpb25zLm5vSGlnaGxpZ2h0UmUudGVzdChsYW5ndWFnZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SGlnaGxpZ2h0ZWRIVE1MRWxlbWVudH0gYmxvY2sgLSB0aGUgSFRNTCBlbGVtZW50IHRvIGRldGVybWluZSBsYW5ndWFnZSBmb3JcbiAgICovXG4gIGZ1bmN0aW9uIGJsb2NrTGFuZ3VhZ2UoYmxvY2spIHtcbiAgICBsZXQgY2xhc3NlcyA9IGJsb2NrLmNsYXNzTmFtZSArICcgJztcblxuICAgIGNsYXNzZXMgKz0gYmxvY2sucGFyZW50Tm9kZSA/IGJsb2NrLnBhcmVudE5vZGUuY2xhc3NOYW1lIDogJyc7XG5cbiAgICAvLyBsYW5ndWFnZS0qIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBub24tcHJlZml4ZWQgY2xhc3MgbmFtZXMuXG4gICAgY29uc3QgbWF0Y2ggPSBvcHRpb25zLmxhbmd1YWdlRGV0ZWN0UmUuZXhlYyhjbGFzc2VzKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobWF0Y2hbMV0pO1xuICAgICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgICB3YXJuKExBTkdVQUdFX05PVF9GT1VORC5yZXBsYWNlKFwie31cIiwgbWF0Y2hbMV0pKTtcbiAgICAgICAgd2FybihcIkZhbGxpbmcgYmFjayB0byBuby1oaWdobGlnaHQgbW9kZSBmb3IgdGhpcyBibG9jay5cIiwgYmxvY2spO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhbmd1YWdlID8gbWF0Y2hbMV0gOiAnbm8taGlnaGxpZ2h0JztcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlc1xuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5maW5kKChfY2xhc3MpID0+IHNob3VsZE5vdEhpZ2hsaWdodChfY2xhc3MpIHx8IGdldExhbmd1YWdlKF9jbGFzcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgaGlnaGxpZ2h0aW5nIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBPTEQgQVBJXG4gICAqIGhpZ2hsaWdodChsYW5nLCBjb2RlLCBpZ25vcmVJbGxlZ2FscywgY29udGludWF0aW9uKVxuICAgKlxuICAgKiBORVcgQVBJXG4gICAqIGhpZ2hsaWdodChjb2RlLCB7bGFuZywgaWdub3JlSWxsZWdhbHN9KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZU9yTGFuZ3VhZ2VOYW1lIC0gdGhlIGxhbmd1YWdlIHRvIHVzZSBmb3IgaGlnaGxpZ2h0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgSGlnaGxpZ2h0T3B0aW9uc30gb3B0aW9uc09yQ29kZSAtIHRoZSBjb2RlIHRvIGhpZ2hsaWdodFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpZ25vcmVJbGxlZ2Fsc10gLSB3aGV0aGVyIHRvIGlnbm9yZSBpbGxlZ2FsIG1hdGNoZXMsIGRlZmF1bHQgaXMgdG8gYmFpbFxuICAgKlxuICAgKiBAcmV0dXJucyB7SGlnaGxpZ2h0UmVzdWx0fSBSZXN1bHQgLSBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxhbmd1YWdlIC0gdGhlIGxhbmd1YWdlIG5hbWVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHJlbGV2YW5jZSAtIHRoZSByZWxldmFuY2Ugc2NvcmVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdGhlIGhpZ2hsaWdodGVkIEhUTUwgY29kZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIHRoZSBvcmlnaW5hbCByYXcgY29kZVxuICAgKiBAcHJvcGVydHkge0NvbXBpbGVkTW9kZX0gdG9wIC0gdG9wIG9mIHRoZSBjdXJyZW50IG1vZGUgc3RhY2tcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBpbGxlZ2FsIC0gaW5kaWNhdGVzIHdoZXRoZXIgYW55IGlsbGVnYWwgbWF0Y2hlcyB3ZXJlIGZvdW5kXG4gICovXG4gIGZ1bmN0aW9uIGhpZ2hsaWdodChjb2RlT3JMYW5ndWFnZU5hbWUsIG9wdGlvbnNPckNvZGUsIGlnbm9yZUlsbGVnYWxzKSB7XG4gICAgbGV0IGNvZGUgPSBcIlwiO1xuICAgIGxldCBsYW5ndWFnZU5hbWUgPSBcIlwiO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yQ29kZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29kZSA9IGNvZGVPckxhbmd1YWdlTmFtZTtcbiAgICAgIGlnbm9yZUlsbGVnYWxzID0gb3B0aW9uc09yQ29kZS5pZ25vcmVJbGxlZ2FscztcbiAgICAgIGxhbmd1YWdlTmFtZSA9IG9wdGlvbnNPckNvZGUubGFuZ3VhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9sZCBBUElcbiAgICAgIGRlcHJlY2F0ZWQoXCIxMC43LjBcIiwgXCJoaWdobGlnaHQobGFuZywgY29kZSwgLi4uYXJncykgaGFzIGJlZW4gZGVwcmVjYXRlZC5cIik7XG4gICAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiUGxlYXNlIHVzZSBoaWdobGlnaHQoY29kZSwgb3B0aW9ucykgaW5zdGVhZC5cXG5odHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yMjc3XCIpO1xuICAgICAgbGFuZ3VhZ2VOYW1lID0gY29kZU9yTGFuZ3VhZ2VOYW1lO1xuICAgICAgY29kZSA9IG9wdGlvbnNPckNvZGU7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzE0OVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgICBpZiAoaWdub3JlSWxsZWdhbHMgPT09IHVuZGVmaW5lZCkgeyBpZ25vcmVJbGxlZ2FscyA9IHRydWU7IH1cblxuICAgIC8qKiBAdHlwZSB7QmVmb3JlSGlnaGxpZ2h0Q29udGV4dH0gKi9cbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgY29kZSxcbiAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZU5hbWVcbiAgICB9O1xuICAgIC8vIHRoZSBwbHVnaW4gY2FuIGNoYW5nZSB0aGUgZGVzaXJlZCBsYW5ndWFnZSBvciB0aGUgY29kZSB0byBiZSBoaWdobGlnaHRlZFxuICAgIC8vIGp1c3QgYmUgY2hhbmdpbmcgdGhlIG9iamVjdCBpdCB3YXMgcGFzc2VkXG4gICAgZmlyZShcImJlZm9yZTpoaWdobGlnaHRcIiwgY29udGV4dCk7XG5cbiAgICAvLyBhIGJlZm9yZSBwbHVnaW4gY2FuIHVzdXJwIHRoZSByZXN1bHQgY29tcGxldGVseSBieSBwcm92aWRpbmcgaXQncyBvd25cbiAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGV2ZW4gbmVlZCB0byBjYWxsIGhpZ2hsaWdodFxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucmVzdWx0XG4gICAgICA/IGNvbnRleHQucmVzdWx0XG4gICAgICA6IF9oaWdobGlnaHQoY29udGV4dC5sYW5ndWFnZSwgY29udGV4dC5jb2RlLCBpZ25vcmVJbGxlZ2Fscyk7XG5cbiAgICByZXN1bHQuY29kZSA9IGNvbnRleHQuY29kZTtcbiAgICAvLyB0aGUgcGx1Z2luIGNhbiBjaGFuZ2UgYW55dGhpbmcgaW4gcmVzdWx0IHRvIHN1aXRlIGl0XG4gICAgZmlyZShcImFmdGVyOmhpZ2hsaWdodFwiLCByZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBwcml2YXRlIGhpZ2hsaWdodCB0aGF0J3MgdXNlZCBpbnRlcm5hbGx5IGFuZCBkb2VzIG5vdCBmaXJlIGNhbGxiYWNrc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VOYW1lIC0gdGhlIGxhbmd1YWdlIHRvIHVzZSBmb3IgaGlnaGxpZ2h0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlVG9IaWdobGlnaHQgLSB0aGUgY29kZSB0byBoaWdobGlnaHRcbiAgICogQHBhcmFtIHtib29sZWFuP30gW2lnbm9yZUlsbGVnYWxzXSAtIHdoZXRoZXIgdG8gaWdub3JlIGlsbGVnYWwgbWF0Y2hlcywgZGVmYXVsdCBpcyB0byBiYWlsXG4gICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlP30gW2NvbnRpbnVhdGlvbl0gLSBjdXJyZW50IGNvbnRpbnVhdGlvbiBtb2RlLCBpZiBhbnlcbiAgICogQHJldHVybnMge0hpZ2hsaWdodFJlc3VsdH0gLSByZXN1bHQgb2YgdGhlIGhpZ2hsaWdodCBvcGVyYXRpb25cbiAgKi9cbiAgZnVuY3Rpb24gX2hpZ2hsaWdodChsYW5ndWFnZU5hbWUsIGNvZGVUb0hpZ2hsaWdodCwgaWdub3JlSWxsZWdhbHMsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IGtleXdvcmRIaXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBrZXl3b3JkIGRhdGEgaWYgYSBtYXRjaCBpcyBhIGtleXdvcmRcbiAgICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZSAtIGN1cnJlbnQgbW9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFRleHQgLSB0aGUgdGV4dHVhbCBtYXRjaFxuICAgICAqIEByZXR1cm5zIHtLZXl3b3JkRGF0YSB8IGZhbHNlfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXdvcmREYXRhKG1vZGUsIG1hdGNoVGV4dCkge1xuICAgICAgcmV0dXJuIG1vZGUua2V5d29yZHNbbWF0Y2hUZXh0XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzS2V5d29yZHMoKSB7XG4gICAgICBpZiAoIXRvcC5rZXl3b3Jkcykge1xuICAgICAgICBlbWl0dGVyLmFkZFRleHQobW9kZUJ1ZmZlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgICB0b3Aua2V5d29yZFBhdHRlcm5SZS5sYXN0SW5kZXggPSAwO1xuICAgICAgbGV0IG1hdGNoID0gdG9wLmtleXdvcmRQYXR0ZXJuUmUuZXhlYyhtb2RlQnVmZmVyKTtcbiAgICAgIGxldCBidWYgPSBcIlwiO1xuXG4gICAgICB3aGlsZSAobWF0Y2gpIHtcbiAgICAgICAgYnVmICs9IG1vZGVCdWZmZXIuc3Vic3RyaW5nKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpO1xuICAgICAgICBjb25zdCB3b3JkID0gbGFuZ3VhZ2UuY2FzZV9pbnNlbnNpdGl2ZSA/IG1hdGNoWzBdLnRvTG93ZXJDYXNlKCkgOiBtYXRjaFswXTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGtleXdvcmREYXRhKHRvcCwgd29yZCk7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgY29uc3QgW2tpbmQsIGtleXdvcmRSZWxldmFuY2VdID0gZGF0YTtcbiAgICAgICAgICBlbWl0dGVyLmFkZFRleHQoYnVmKTtcbiAgICAgICAgICBidWYgPSBcIlwiO1xuXG4gICAgICAgICAga2V5d29yZEhpdHNbd29yZF0gPSAoa2V5d29yZEhpdHNbd29yZF0gfHwgMCkgKyAxO1xuICAgICAgICAgIGlmIChrZXl3b3JkSGl0c1t3b3JkXSA8PSBNQVhfS0VZV09SRF9ISVRTKSByZWxldmFuY2UgKz0ga2V5d29yZFJlbGV2YW5jZTtcbiAgICAgICAgICBpZiAoa2luZC5zdGFydHNXaXRoKFwiX1wiKSkge1xuICAgICAgICAgICAgLy8gXyBpbXBsaWVkIGZvciByZWxldmFuY2Ugb25seSwgZG8gbm90IGhpZ2hsaWdodFxuICAgICAgICAgICAgLy8gYnkgYXBwbHlpbmcgYSBjbGFzcyBuYW1lXG4gICAgICAgICAgICBidWYgKz0gbWF0Y2hbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNzc0NsYXNzID0gbGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlc1traW5kXSB8fCBraW5kO1xuICAgICAgICAgICAgZW1pdEtleXdvcmQobWF0Y2hbMF0sIGNzc0NsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmICs9IG1hdGNoWzBdO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJbmRleCA9IHRvcC5rZXl3b3JkUGF0dGVyblJlLmxhc3RJbmRleDtcbiAgICAgICAgbWF0Y2ggPSB0b3Aua2V5d29yZFBhdHRlcm5SZS5leGVjKG1vZGVCdWZmZXIpO1xuICAgICAgfVxuICAgICAgYnVmICs9IG1vZGVCdWZmZXIuc3Vic3RyaW5nKGxhc3RJbmRleCk7XG4gICAgICBlbWl0dGVyLmFkZFRleHQoYnVmKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzU3ViTGFuZ3VhZ2UoKSB7XG4gICAgICBpZiAobW9kZUJ1ZmZlciA9PT0gXCJcIikgcmV0dXJuO1xuICAgICAgLyoqIEB0eXBlIEhpZ2hsaWdodFJlc3VsdCAqL1xuICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2YgdG9wLnN1Ykxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWxhbmd1YWdlc1t0b3Auc3ViTGFuZ3VhZ2VdKSB7XG4gICAgICAgICAgZW1pdHRlci5hZGRUZXh0KG1vZGVCdWZmZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBfaGlnaGxpZ2h0KHRvcC5zdWJMYW5ndWFnZSwgbW9kZUJ1ZmZlciwgdHJ1ZSwgY29udGludWF0aW9uc1t0b3Auc3ViTGFuZ3VhZ2VdKTtcbiAgICAgICAgY29udGludWF0aW9uc1t0b3Auc3ViTGFuZ3VhZ2VdID0gLyoqIEB0eXBlIHtDb21waWxlZE1vZGV9ICovIChyZXN1bHQuX3RvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBoaWdobGlnaHRBdXRvKG1vZGVCdWZmZXIsIHRvcC5zdWJMYW5ndWFnZS5sZW5ndGggPyB0b3Auc3ViTGFuZ3VhZ2UgOiBudWxsKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ291bnRpbmcgZW1iZWRkZWQgbGFuZ3VhZ2Ugc2NvcmUgdG93YXJkcyB0aGUgaG9zdCBsYW5ndWFnZSBtYXkgYmUgZGlzYWJsZWRcbiAgICAgIC8vIHdpdGggemVyb2luZyB0aGUgY29udGFpbmluZyBtb2RlIHJlbGV2YW5jZS4gVXNlIGNhc2UgaW4gcG9pbnQgaXMgTWFya2Rvd24gdGhhdFxuICAgICAgLy8gYWxsb3dzIFhNTCBldmVyeXdoZXJlIGFuZCBtYWtlcyBldmVyeSBYTUwgc25pcHBldCB0byBoYXZlIGEgbXVjaCBsYXJnZXIgTWFya2Rvd25cbiAgICAgIC8vIHNjb3JlLlxuICAgICAgaWYgKHRvcC5yZWxldmFuY2UgPiAwKSB7XG4gICAgICAgIHJlbGV2YW5jZSArPSByZXN1bHQucmVsZXZhbmNlO1xuICAgICAgfVxuICAgICAgZW1pdHRlci5fX2FkZFN1Ymxhbmd1YWdlKHJlc3VsdC5fZW1pdHRlciwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQnVmZmVyKCkge1xuICAgICAgaWYgKHRvcC5zdWJMYW5ndWFnZSAhPSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3NTdWJMYW5ndWFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0tleXdvcmRzKCk7XG4gICAgICB9XG4gICAgICBtb2RlQnVmZmVyID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbWl0S2V5d29yZChrZXl3b3JkLCBzY29wZSkge1xuICAgICAgaWYgKGtleXdvcmQgPT09IFwiXCIpIHJldHVybjtcblxuICAgICAgZW1pdHRlci5zdGFydFNjb3BlKHNjb3BlKTtcbiAgICAgIGVtaXR0ZXIuYWRkVGV4dChrZXl3b3JkKTtcbiAgICAgIGVtaXR0ZXIuZW5kU2NvcGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NvbXBpbGVkU2NvcGV9IHNjb3BlXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVtaXRNdWx0aUNsYXNzKHNjb3BlLCBtYXRjaCkge1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgY29uc3QgbWF4ID0gbWF0Y2gubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpIDw9IG1heCkge1xuICAgICAgICBpZiAoIXNjb3BlLl9lbWl0W2ldKSB7IGkrKzsgY29udGludWU7IH1cbiAgICAgICAgY29uc3Qga2xhc3MgPSBsYW5ndWFnZS5jbGFzc05hbWVBbGlhc2VzW3Njb3BlW2ldXSB8fCBzY29wZVtpXTtcbiAgICAgICAgY29uc3QgdGV4dCA9IG1hdGNoW2ldO1xuICAgICAgICBpZiAoa2xhc3MpIHtcbiAgICAgICAgICBlbWl0S2V5d29yZCh0ZXh0LCBrbGFzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IHRleHQ7XG4gICAgICAgICAgcHJvY2Vzc0tleXdvcmRzKCk7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlfSBtb2RlIC0gbmV3IG1vZGUgdG8gc3RhcnRcbiAgICAgKiBAcGFyYW0ge1JlZ0V4cE1hdGNoQXJyYXl9IG1hdGNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnROZXdNb2RlKG1vZGUsIG1hdGNoKSB7XG4gICAgICBpZiAobW9kZS5zY29wZSAmJiB0eXBlb2YgbW9kZS5zY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlbWl0dGVyLm9wZW5Ob2RlKGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNbbW9kZS5zY29wZV0gfHwgbW9kZS5zY29wZSk7XG4gICAgICB9XG4gICAgICBpZiAobW9kZS5iZWdpblNjb3BlKSB7XG4gICAgICAgIC8vIGJlZ2luU2NvcGUganVzdCB3cmFwcyB0aGUgYmVnaW4gbWF0Y2ggaXRzZWxmIGluIGEgc2NvcGVcbiAgICAgICAgaWYgKG1vZGUuYmVnaW5TY29wZS5fd3JhcCkge1xuICAgICAgICAgIGVtaXRLZXl3b3JkKG1vZGVCdWZmZXIsIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNbbW9kZS5iZWdpblNjb3BlLl93cmFwXSB8fCBtb2RlLmJlZ2luU2NvcGUuX3dyYXApO1xuICAgICAgICAgIG1vZGVCdWZmZXIgPSBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUuYmVnaW5TY29wZS5fbXVsdGkpIHtcbiAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IG1vZGVCdWZmZXIgc2hvdWxkIGp1c3QgYmUgdGhlIG1hdGNoXG4gICAgICAgICAgZW1pdE11bHRpQ2xhc3MobW9kZS5iZWdpblNjb3BlLCBtYXRjaCk7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdG9wID0gT2JqZWN0LmNyZWF0ZShtb2RlLCB7IHBhcmVudDogeyB2YWx1ZTogdG9wIH0gfSk7XG4gICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlIH0gbW9kZSAtIHRoZSBtb2RlIHRvIHBvdGVudGlhbGx5IGVuZFxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2ggLSB0aGUgbGF0ZXN0IG1hdGNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoUGx1c1JlbWFpbmRlciAtIG1hdGNoIHBsdXMgcmVtYWluZGVyIG9mIGNvbnRlbnRcbiAgICAgKiBAcmV0dXJucyB7Q29tcGlsZWRNb2RlIHwgdm9pZH0gLSB0aGUgbmV4dCBtb2RlLCBvciBpZiB2b2lkIGNvbnRpbnVlIG9uIGluIGN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuZE9mTW9kZShtb2RlLCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKSB7XG4gICAgICBsZXQgbWF0Y2hlZCA9IHN0YXJ0c1dpdGgobW9kZS5lbmRSZSwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcblxuICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgaWYgKG1vZGVbXCJvbjplbmRcIl0pIHtcbiAgICAgICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG1vZGUpO1xuICAgICAgICAgIG1vZGVbXCJvbjplbmRcIl0obWF0Y2gsIHJlc3ApO1xuICAgICAgICAgIGlmIChyZXNwLmlzTWF0Y2hJZ25vcmVkKSBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgIHdoaWxlIChtb2RlLmVuZHNQYXJlbnQgJiYgbW9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIG1vZGUgPSBtb2RlLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGV2ZW4gaWYgb246ZW5kIGZpcmVzIGFuIGBpZ25vcmVgIGl0J3Mgc3RpbGwgcG9zc2libGVcbiAgICAgIC8vIHRoYXQgd2UgbWlnaHQgdHJpZ2dlciB0aGUgZW5kIG5vZGUgYmVjYXVzZSBvZiBhIHBhcmVudCBtb2RlXG4gICAgICBpZiAobW9kZS5lbmRzV2l0aFBhcmVudCkge1xuICAgICAgICByZXR1cm4gZW5kT2ZNb2RlKG1vZGUucGFyZW50LCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbWF0Y2hpbmcgYnV0IHRoZW4gaWdub3JpbmcgYSBzZXF1ZW5jZSBvZiB0ZXh0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGV4ZW1lIC0gc3RyaW5nIGNvbnRhaW5pbmcgZnVsbCBtYXRjaCB0ZXh0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9JZ25vcmUobGV4ZW1lKSB7XG4gICAgICBpZiAodG9wLm1hdGNoZXIucmVnZXhJbmRleCA9PT0gMCkge1xuICAgICAgICAvLyBubyBtb3JlIHJlZ2V4ZXMgdG8gcG90ZW50aWFsbHkgbWF0Y2ggaGVyZSwgc28gd2UgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgb25lXG4gICAgICAgIC8vIHNwYWNlXG4gICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lWzBdO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIG5lZWQgdG8gbW92ZSB0aGUgY3Vyc29yLCB3ZSBzdGlsbCBoYXZlIGFkZGl0aW9uYWwgcmVnZXhlcyB0byB0cnkgYW5kXG4gICAgICAgIC8vIG1hdGNoIGF0IHRoaXMgdmVyeSBzcG90XG4gICAgICAgIHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgc3RhcnQgb2YgYSBuZXcgcG90ZW50aWFsIG1vZGUgbWF0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RW5oYW5jZWRNYXRjaH0gbWF0Y2ggLSB0aGUgY3VycmVudCBtYXRjaFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IGhvdyBmYXIgdG8gYWR2YW5jZSB0aGUgcGFyc2UgY3Vyc29yXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9CZWdpbk1hdGNoKG1hdGNoKSB7XG4gICAgICBjb25zdCBsZXhlbWUgPSBtYXRjaFswXTtcbiAgICAgIGNvbnN0IG5ld01vZGUgPSBtYXRjaC5ydWxlO1xuXG4gICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG5ld01vZGUpO1xuICAgICAgLy8gZmlyc3QgaW50ZXJuYWwgYmVmb3JlIGNhbGxiYWNrcywgdGhlbiB0aGUgcHVibGljIG9uZXNcbiAgICAgIGNvbnN0IGJlZm9yZUNhbGxiYWNrcyA9IFtuZXdNb2RlLl9fYmVmb3JlQmVnaW4sIG5ld01vZGVbXCJvbjpiZWdpblwiXV07XG4gICAgICBmb3IgKGNvbnN0IGNiIG9mIGJlZm9yZUNhbGxiYWNrcykge1xuICAgICAgICBpZiAoIWNiKSBjb250aW51ZTtcbiAgICAgICAgY2IobWF0Y2gsIHJlc3ApO1xuICAgICAgICBpZiAocmVzcC5pc01hdGNoSWdub3JlZCkgcmV0dXJuIGRvSWdub3JlKGxleGVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdNb2RlLnNraXApIHtcbiAgICAgICAgbW9kZUJ1ZmZlciArPSBsZXhlbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGlmICghbmV3TW9kZS5yZXR1cm5CZWdpbiAmJiAhbmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gbGV4ZW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydE5ld01vZGUobmV3TW9kZSwgbWF0Y2gpO1xuICAgICAgcmV0dXJuIG5ld01vZGUucmV0dXJuQmVnaW4gPyAwIDogbGV4ZW1lLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIHBvdGVudGlhbCBlbmQgb2YgbW9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaCAtIHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9FbmRNYXRjaChtYXRjaCkge1xuICAgICAgY29uc3QgbGV4ZW1lID0gbWF0Y2hbMF07XG4gICAgICBjb25zdCBtYXRjaFBsdXNSZW1haW5kZXIgPSBjb2RlVG9IaWdobGlnaHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KTtcblxuICAgICAgY29uc3QgZW5kTW9kZSA9IGVuZE9mTW9kZSh0b3AsIG1hdGNoLCBtYXRjaFBsdXNSZW1haW5kZXIpO1xuICAgICAgaWYgKCFlbmRNb2RlKSB7IHJldHVybiBOT19NQVRDSDsgfVxuXG4gICAgICBjb25zdCBvcmlnaW4gPSB0b3A7XG4gICAgICBpZiAodG9wLmVuZFNjb3BlICYmIHRvcC5lbmRTY29wZS5fd3JhcCkge1xuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGVtaXRLZXl3b3JkKGxleGVtZSwgdG9wLmVuZFNjb3BlLl93cmFwKTtcbiAgICAgIH0gZWxzZSBpZiAodG9wLmVuZFNjb3BlICYmIHRvcC5lbmRTY29wZS5fbXVsdGkpIHtcbiAgICAgICAgcHJvY2Vzc0J1ZmZlcigpO1xuICAgICAgICBlbWl0TXVsdGlDbGFzcyh0b3AuZW5kU2NvcGUsIG1hdGNoKTtcbiAgICAgIH0gZWxzZSBpZiAob3JpZ2luLnNraXApIHtcbiAgICAgICAgbW9kZUJ1ZmZlciArPSBsZXhlbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShvcmlnaW4ucmV0dXJuRW5kIHx8IG9yaWdpbi5leGNsdWRlRW5kKSkge1xuICAgICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NCdWZmZXIoKTtcbiAgICAgICAgaWYgKG9yaWdpbi5leGNsdWRlRW5kKSB7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZG8ge1xuICAgICAgICBpZiAodG9wLnNjb3BlKSB7XG4gICAgICAgICAgZW1pdHRlci5jbG9zZU5vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvcC5za2lwICYmICF0b3Auc3ViTGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZWxldmFuY2UgKz0gdG9wLnJlbGV2YW5jZTtcbiAgICAgICAgfVxuICAgICAgICB0b3AgPSB0b3AucGFyZW50O1xuICAgICAgfSB3aGlsZSAodG9wICE9PSBlbmRNb2RlLnBhcmVudCk7XG4gICAgICBpZiAoZW5kTW9kZS5zdGFydHMpIHtcbiAgICAgICAgc3RhcnROZXdNb2RlKGVuZE1vZGUuc3RhcnRzLCBtYXRjaCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luLnJldHVybkVuZCA/IDAgOiBsZXhlbWUubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NDb250aW51YXRpb25zKCkge1xuICAgICAgY29uc3QgbGlzdCA9IFtdO1xuICAgICAgZm9yIChsZXQgY3VycmVudCA9IHRvcDsgY3VycmVudCAhPT0gbGFuZ3VhZ2U7IGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudCkge1xuICAgICAgICBpZiAoY3VycmVudC5zY29wZSkge1xuICAgICAgICAgIGxpc3QudW5zaGlmdChjdXJyZW50LnNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4gZW1pdHRlci5vcGVuTm9kZShpdGVtKSk7XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHt7dHlwZT86IE1hdGNoVHlwZSwgaW5kZXg/OiBudW1iZXIsIHJ1bGU/OiBNb2RlfX19ICovXG4gICAgbGV0IGxhc3RNYXRjaCA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogIFByb2Nlc3MgYW4gaW5kaXZpZHVhbCBtYXRjaFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRCZWZvcmVNYXRjaCAtIHRleHQgcHJlY2VkaW5nIHRoZSBtYXRjaCAoc2luY2UgdGhlIGxhc3QgbWF0Y2gpXG4gICAgICogQHBhcmFtIHtFbmhhbmNlZE1hdGNofSBbbWF0Y2hdIC0gdGhlIG1hdGNoIGl0c2VsZlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NMZXhlbWUodGV4dEJlZm9yZU1hdGNoLCBtYXRjaCkge1xuICAgICAgY29uc3QgbGV4ZW1lID0gbWF0Y2ggJiYgbWF0Y2hbMF07XG5cbiAgICAgIC8vIGFkZCBub24tbWF0Y2hlZCB0ZXh0IHRvIHRoZSBjdXJyZW50IG1vZGUgYnVmZmVyXG4gICAgICBtb2RlQnVmZmVyICs9IHRleHRCZWZvcmVNYXRjaDtcblxuICAgICAgaWYgKGxleGVtZSA9PSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3NCdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlJ3ZlIGZvdW5kIGEgMCB3aWR0aCBtYXRjaCBhbmQgd2UncmUgc3R1Y2ssIHNvIHdlIG5lZWQgdG8gYWR2YW5jZVxuICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBiYWRseSBiZWhhdmVkIHJ1bGVzIHRoYXQgaGF2ZSBvcHRpb25hbCBtYXRjaGVycyB0byB0aGUgZGVncmVlIHRoYXRcbiAgICAgIC8vIHNvbWV0aW1lcyB0aGV5IGNhbiBlbmQgdXAgbWF0Y2hpbmcgbm90aGluZyBhdCBhbGxcbiAgICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjE0MFxuICAgICAgaWYgKGxhc3RNYXRjaC50eXBlID09PSBcImJlZ2luXCIgJiYgbWF0Y2gudHlwZSA9PT0gXCJlbmRcIiAmJiBsYXN0TWF0Y2guaW5kZXggPT09IG1hdGNoLmluZGV4ICYmIGxleGVtZSA9PT0gXCJcIikge1xuICAgICAgICAvLyBzcGl0IHRoZSBcInNraXBwZWRcIiBjaGFyYWN0ZXIgdGhhdCBvdXIgcmVnZXggY2hva2VkIG9uIGJhY2sgaW50byB0aGUgb3V0cHV0IHNlcXVlbmNlXG4gICAgICAgIG1vZGVCdWZmZXIgKz0gY29kZVRvSGlnaGxpZ2h0LnNsaWNlKG1hdGNoLmluZGV4LCBtYXRjaC5pbmRleCArIDEpO1xuICAgICAgICBpZiAoIVNBRkVfTU9ERSkge1xuICAgICAgICAgIC8qKiBAdHlwZSB7QW5ub3RhdGVkRXJyb3J9ICovXG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGAwIHdpZHRoIG1hdGNoIHJlZ2V4ICgke2xhbmd1YWdlTmFtZX0pYCk7XG4gICAgICAgICAgZXJyLmxhbmd1YWdlTmFtZSA9IGxhbmd1YWdlTmFtZTtcbiAgICAgICAgICBlcnIuYmFkUnVsZSA9IGxhc3RNYXRjaC5ydWxlO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGxhc3RNYXRjaCA9IG1hdGNoO1xuXG4gICAgICBpZiAobWF0Y2gudHlwZSA9PT0gXCJiZWdpblwiKSB7XG4gICAgICAgIHJldHVybiBkb0JlZ2luTWF0Y2gobWF0Y2gpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaC50eXBlID09PSBcImlsbGVnYWxcIiAmJiAhaWdub3JlSWxsZWdhbHMpIHtcbiAgICAgICAgLy8gaWxsZWdhbCBtYXRjaCwgd2UgZG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmdcbiAgICAgICAgLyoqIEB0eXBlIHtBbm5vdGF0ZWRFcnJvcn0gKi9cbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdJbGxlZ2FsIGxleGVtZSBcIicgKyBsZXhlbWUgKyAnXCIgZm9yIG1vZGUgXCInICsgKHRvcC5zY29wZSB8fCAnPHVubmFtZWQ+JykgKyAnXCInKTtcbiAgICAgICAgZXJyLm1vZGUgPSB0b3A7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2gudHlwZSA9PT0gXCJlbmRcIikge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBkb0VuZE1hdGNoKG1hdGNoKTtcbiAgICAgICAgaWYgKHByb2Nlc3NlZCAhPT0gTk9fTUFUQ0gpIHtcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGVkZ2UgY2FzZSBmb3Igd2hlbiBpbGxlZ2FsIG1hdGNoZXMgJCAoZW5kIG9mIGxpbmUpIHdoaWNoIGlzIHRlY2huaWNhbGx5XG4gICAgICAvLyBhIDAgd2lkdGggbWF0Y2ggYnV0IG5vdCBhIGJlZ2luL2VuZCBtYXRjaCBzbyBpdCdzIG5vdCBjYXVnaHQgYnkgdGhlXG4gICAgICAvLyBmaXJzdCBoYW5kbGVyICh3aGVuIGlnbm9yZUlsbGVnYWxzIGlzIHRydWUpXG4gICAgICBpZiAobWF0Y2gudHlwZSA9PT0gXCJpbGxlZ2FsXCIgJiYgbGV4ZW1lID09PSBcIlwiKSB7XG4gICAgICAgIC8vIGFkdmFuY2Ugc28gd2UgYXJlbid0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3BcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8vIGluZmluaXRlIGxvb3BzIGFyZSBCQUQsIHRoaXMgaXMgYSBsYXN0IGRpdGNoIGNhdGNoIGFsbC4gaWYgd2UgaGF2ZSBhXG4gICAgICAvLyBkZWNlbnQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgeWV0IG91ciBpbmRleCAoY3Vyc29yIHBvc2l0aW9uIGluIG91clxuICAgICAgLy8gcGFyc2luZykgc3RpbGwgM3ggYmVoaW5kIG91ciBpbmRleCB0aGVuIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nXG4gICAgICAvLyBzbyB3ZSBiYWlsXG4gICAgICBpZiAoaXRlcmF0aW9ucyA+IDEwMDAwMCAmJiBpdGVyYXRpb25zID4gbWF0Y2guaW5kZXggKiAzKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcigncG90ZW50aWFsIGluZmluaXRlIGxvb3AsIHdheSBtb3JlIGl0ZXJhdGlvbnMgdGhhbiBtYXRjaGVzJyk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgIFdoeSBtaWdodCBiZSBmaW5kIG91cnNlbHZlcyBoZXJlPyAgQW4gcG90ZW50aWFsIGVuZCBtYXRjaCB0aGF0IHdhc1xuICAgICAgdHJpZ2dlcmVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkLiAgSUUsIGBkb0VuZE1hdGNoYCByZXR1cm5lZCBOT19NQVRDSC5cbiAgICAgICh0aGlzIGNvdWxkIGJlIGJlY2F1c2UgYSBjYWxsYmFjayByZXF1ZXN0cyB0aGUgbWF0Y2ggYmUgaWdub3JlZCwgZXRjKVxuXG4gICAgICBUaGlzIGNhdXNlcyBubyByZWFsIGhhcm0gb3RoZXIgdGhhbiBzdG9wcGluZyBhIGZldyB0aW1lcyB0b28gbWFueS5cbiAgICAgICovXG5cbiAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lO1xuICAgICAgcmV0dXJuIGxleGVtZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShsYW5ndWFnZU5hbWUpO1xuICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgIGVycm9yKExBTkdVQUdFX05PVF9GT1VORC5yZXBsYWNlKFwie31cIiwgbGFuZ3VhZ2VOYW1lKSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGFuZ3VhZ2U6IFwiJyArIGxhbmd1YWdlTmFtZSArICdcIicpO1xuICAgIH1cblxuICAgIGNvbnN0IG1kID0gY29tcGlsZUxhbmd1YWdlKGxhbmd1YWdlKTtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgLyoqIEB0eXBlIHtDb21waWxlZE1vZGV9ICovXG4gICAgbGV0IHRvcCA9IGNvbnRpbnVhdGlvbiB8fCBtZDtcbiAgICAvKiogQHR5cGUgUmVjb3JkPHN0cmluZyxDb21waWxlZE1vZGU+ICovXG4gICAgY29uc3QgY29udGludWF0aW9ucyA9IHt9OyAvLyBrZWVwIGNvbnRpbnVhdGlvbnMgZm9yIHN1Yi1sYW5ndWFnZXNcbiAgICBjb25zdCBlbWl0dGVyID0gbmV3IG9wdGlvbnMuX19lbWl0dGVyKG9wdGlvbnMpO1xuICAgIHByb2Nlc3NDb250aW51YXRpb25zKCk7XG4gICAgbGV0IG1vZGVCdWZmZXIgPSAnJztcbiAgICBsZXQgcmVsZXZhbmNlID0gMDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgcmVzdW1lU2NhbkF0U2FtZVBvc2l0aW9uID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFsYW5ndWFnZS5fX2VtaXRUb2tlbnMpIHtcbiAgICAgICAgdG9wLm1hdGNoZXIuY29uc2lkZXJBbGwoKTtcblxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICAgIGlmIChyZXN1bWVTY2FuQXRTYW1lUG9zaXRpb24pIHtcbiAgICAgICAgICAgIC8vIG9ubHkgcmVnZXhlcyBub3QgbWF0Y2hlZCBwcmV2aW91c2x5IHdpbGwgbm93IGJlXG4gICAgICAgICAgICAvLyBjb25zaWRlcmVkIGZvciBhIHBvdGVudGlhbCBtYXRjaFxuICAgICAgICAgICAgcmVzdW1lU2NhbkF0U2FtZVBvc2l0aW9uID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvcC5tYXRjaGVyLmNvbnNpZGVyQWxsKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvcC5tYXRjaGVyLmxhc3RJbmRleCA9IGluZGV4O1xuXG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSB0b3AubWF0Y2hlci5leGVjKGNvZGVUb0hpZ2hsaWdodCk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaFwiLCBtYXRjaFswXSwgbWF0Y2gucnVsZSAmJiBtYXRjaC5ydWxlLmJlZ2luKVxuXG4gICAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVNYXRjaCA9IGNvZGVUb0hpZ2hsaWdodC5zdWJzdHJpbmcoaW5kZXgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRDb3VudCA9IHByb2Nlc3NMZXhlbWUoYmVmb3JlTWF0Y2gsIG1hdGNoKTtcbiAgICAgICAgICBpbmRleCA9IG1hdGNoLmluZGV4ICsgcHJvY2Vzc2VkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0xleGVtZShjb2RlVG9IaWdobGlnaHQuc3Vic3RyaW5nKGluZGV4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYW5ndWFnZS5fX2VtaXRUb2tlbnMoY29kZVRvSGlnaGxpZ2h0LCBlbWl0dGVyKTtcbiAgICAgIH1cblxuICAgICAgZW1pdHRlci5maW5hbGl6ZSgpO1xuICAgICAgcmVzdWx0ID0gZW1pdHRlci50b0hUTUwoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlTmFtZSxcbiAgICAgICAgdmFsdWU6IHJlc3VsdCxcbiAgICAgICAgcmVsZXZhbmNlLFxuICAgICAgICBpbGxlZ2FsOiBmYWxzZSxcbiAgICAgICAgX2VtaXR0ZXI6IGVtaXR0ZXIsXG4gICAgICAgIF90b3A6IHRvcFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIubWVzc2FnZSAmJiBlcnIubWVzc2FnZS5pbmNsdWRlcygnSWxsZWdhbCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlTmFtZSxcbiAgICAgICAgICB2YWx1ZTogZXNjYXBlKGNvZGVUb0hpZ2hsaWdodCksXG4gICAgICAgICAgaWxsZWdhbDogdHJ1ZSxcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgX2lsbGVnYWxCeToge1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNvZGVUb0hpZ2hsaWdodC5zbGljZShpbmRleCAtIDEwMCwgaW5kZXggKyAxMDApLFxuICAgICAgICAgICAgbW9kZTogZXJyLm1vZGUsXG4gICAgICAgICAgICByZXN1bHRTb0ZhcjogcmVzdWx0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfZW1pdHRlcjogZW1pdHRlclxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChTQUZFX01PREUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VOYW1lLFxuICAgICAgICAgIHZhbHVlOiBlc2NhcGUoY29kZVRvSGlnaGxpZ2h0KSxcbiAgICAgICAgICBpbGxlZ2FsOiBmYWxzZSxcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgZXJyb3JSYWlzZWQ6IGVycixcbiAgICAgICAgICBfZW1pdHRlcjogZW1pdHRlcixcbiAgICAgICAgICBfdG9wOiB0b3BcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIHZhbGlkIGhpZ2hsaWdodCByZXN1bHQsIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgYW55IGFjdHVhbCB3b3JrLFxuICAgKiBhdXRvIGhpZ2hsaWdodCBzdGFydHMgd2l0aCB0aGlzIGFuZCBpdCdzIHBvc3NpYmxlIGZvciBzbWFsbCBzbmlwcGV0cyB0aGF0XG4gICAqIGF1dG8tZGV0ZWN0aW9uIG1heSBub3QgZmluZCBhIGJldHRlciBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKiBAcmV0dXJucyB7SGlnaGxpZ2h0UmVzdWx0fVxuICAgKi9cbiAgZnVuY3Rpb24ganVzdFRleHRIaWdobGlnaHRSZXN1bHQoY29kZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHZhbHVlOiBlc2NhcGUoY29kZSksXG4gICAgICBpbGxlZ2FsOiBmYWxzZSxcbiAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgIF90b3A6IFBMQUlOVEVYVF9MQU5HVUFHRSxcbiAgICAgIF9lbWl0dGVyOiBuZXcgb3B0aW9ucy5fX2VtaXR0ZXIob3B0aW9ucylcbiAgICB9O1xuICAgIHJlc3VsdC5fZW1pdHRlci5hZGRUZXh0KGNvZGUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgSGlnaGxpZ2h0aW5nIHdpdGggbGFuZ3VhZ2UgZGV0ZWN0aW9uLiBBY2NlcHRzIGEgc3RyaW5nIHdpdGggdGhlIGNvZGUgdG9cbiAgaGlnaGxpZ2h0LiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcblxuICAtIGxhbmd1YWdlIChkZXRlY3RlZCBsYW5ndWFnZSlcbiAgLSByZWxldmFuY2UgKGludClcbiAgLSB2YWx1ZSAoYW4gSFRNTCBzdHJpbmcgd2l0aCBoaWdobGlnaHRpbmcgbWFya3VwKVxuICAtIHNlY29uZEJlc3QgKG9iamVjdCB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZSBmb3Igc2Vjb25kLWJlc3QgaGV1cmlzdGljYWxseVxuICAgIGRldGVjdGVkIGxhbmd1YWdlLCBtYXkgYmUgYWJzZW50KVxuXG4gICAgQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtsYW5ndWFnZVN1YnNldF1cbiAgICBAcmV0dXJucyB7QXV0b0hpZ2hsaWdodFJlc3VsdH1cbiAgKi9cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QXV0byhjb2RlLCBsYW5ndWFnZVN1YnNldCkge1xuICAgIGxhbmd1YWdlU3Vic2V0ID0gbGFuZ3VhZ2VTdWJzZXQgfHwgb3B0aW9ucy5sYW5ndWFnZXMgfHwgT2JqZWN0LmtleXMobGFuZ3VhZ2VzKTtcbiAgICBjb25zdCBwbGFpbnRleHQgPSBqdXN0VGV4dEhpZ2hsaWdodFJlc3VsdChjb2RlKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBsYW5ndWFnZVN1YnNldC5maWx0ZXIoZ2V0TGFuZ3VhZ2UpLmZpbHRlcihhdXRvRGV0ZWN0aW9uKS5tYXAobmFtZSA9PlxuICAgICAgX2hpZ2hsaWdodChuYW1lLCBjb2RlLCBmYWxzZSlcbiAgICApO1xuICAgIHJlc3VsdHMudW5zaGlmdChwbGFpbnRleHQpOyAvLyBwbGFpbnRleHQgaXMgYWx3YXlzIGFuIG9wdGlvblxuXG4gICAgY29uc3Qgc29ydGVkID0gcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBzb3J0IGJhc2Ugb24gcmVsZXZhbmNlXG4gICAgICBpZiAoYS5yZWxldmFuY2UgIT09IGIucmVsZXZhbmNlKSByZXR1cm4gYi5yZWxldmFuY2UgLSBhLnJlbGV2YW5jZTtcblxuICAgICAgLy8gYWx3YXlzIGF3YXJkIHRoZSB0aWUgdG8gdGhlIGJhc2UgbGFuZ3VhZ2VcbiAgICAgIC8vIGllIGlmIEMrKyBhbmQgQXJkdWlubyBhcmUgdGllZCwgaXQncyBtb3JlIGxpa2VseSB0byBiZSBDKytcbiAgICAgIGlmIChhLmxhbmd1YWdlICYmIGIubGFuZ3VhZ2UpIHtcbiAgICAgICAgaWYgKGdldExhbmd1YWdlKGEubGFuZ3VhZ2UpLnN1cGVyc2V0T2YgPT09IGIubGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChnZXRMYW5ndWFnZShiLmxhbmd1YWdlKS5zdXBlcnNldE9mID09PSBhLmxhbmd1YWdlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG90aGVyd2lzZSBzYXkgdGhleSBhcmUgZXF1YWwsIHdoaWNoIGhhcyB0aGUgZWZmZWN0IG9mIHNvcnRpbmcgb25cbiAgICAgIC8vIHJlbGV2YW5jZSB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBvcmRlcmluZyAtIHdoaWNoIGlzIGhvdyB0aWVzXG4gICAgICAvLyBoYXZlIGhpc3RvcmljYWxseSBiZWVuIHNldHRsZWQsIGllIHRoZSBsYW5ndWFnZSB0aGF0IGNvbWVzIGZpcnN0IGFsd2F5c1xuICAgICAgLy8gd2lucyBpbiB0aGUgY2FzZSBvZiBhIHRpZVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBbYmVzdCwgc2Vjb25kQmVzdF0gPSBzb3J0ZWQ7XG5cbiAgICAvKiogQHR5cGUge0F1dG9IaWdobGlnaHRSZXN1bHR9ICovXG4gICAgY29uc3QgcmVzdWx0ID0gYmVzdDtcbiAgICByZXN1bHQuc2Vjb25kQmVzdCA9IHNlY29uZEJlc3Q7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBuZXcgY2xhc3MgbmFtZSBmb3IgYmxvY2sgZ2l2ZW4gdGhlIGxhbmd1YWdlIG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2N1cnJlbnRMYW5nXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Jlc3VsdExhbmddXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVDbGFzc05hbWUoZWxlbWVudCwgY3VycmVudExhbmcsIHJlc3VsdExhbmcpIHtcbiAgICBjb25zdCBsYW5ndWFnZSA9IChjdXJyZW50TGFuZyAmJiBhbGlhc2VzW2N1cnJlbnRMYW5nXSkgfHwgcmVzdWx0TGFuZztcblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImhsanNcIik7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGBsYW5ndWFnZS0ke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgaGlnaGxpZ2h0aW5nIHRvIGEgRE9NIG5vZGUgY29udGFpbmluZyBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hpZ2hsaWdodGVkSFRNTEVsZW1lbnR9IGVsZW1lbnQgLSB0aGUgSFRNTCBlbGVtZW50IHRvIGhpZ2hsaWdodFxuICAqL1xuICBmdW5jdGlvbiBoaWdobGlnaHRFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAvKiogQHR5cGUgSFRNTEVsZW1lbnQgKi9cbiAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBibG9ja0xhbmd1YWdlKGVsZW1lbnQpO1xuXG4gICAgaWYgKHNob3VsZE5vdEhpZ2hsaWdodChsYW5ndWFnZSkpIHJldHVybjtcblxuICAgIGZpcmUoXCJiZWZvcmU6aGlnaGxpZ2h0RWxlbWVudFwiLFxuICAgICAgeyBlbDogZWxlbWVudCwgbGFuZ3VhZ2UgfSk7XG5cbiAgICAvLyB3ZSBzaG91bGQgYmUgYWxsIHRleHQsIG5vIGNoaWxkIG5vZGVzICh1bmVzY2FwZWQgSFRNTCkgLSB0aGlzIGlzIHBvc3NpYmx5XG4gICAgLy8gYW4gSFRNTCBpbmplY3Rpb24gYXR0YWNrIC0gaXQncyBsaWtlbHkgdG9vIGxhdGUgaWYgdGhpcyBpcyBhbHJlYWR5IGluXG4gICAgLy8gcHJvZHVjdGlvbiAodGhlIGNvZGUgaGFzIGxpa2VseSBhbHJlYWR5IGRvbmUgaXRzIGRhbWFnZSBieSB0aGUgdGltZVxuICAgIC8vIHdlJ3JlIHNlZWluZyBpdCkuLi4gYnV0IHdlIHllbGwgbG91ZGx5IGFib3V0IHRoaXMgc28gdGhhdCBob3BlZnVsbHkgaXQnc1xuICAgIC8vIG1vcmUgbGlrZWx5IHRvIGJlIGNhdWdodCBpbiBkZXZlbG9wbWVudCBiZWZvcmUgbWFraW5nIGl0IHRvIHByb2R1Y3Rpb25cbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlVW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJPbmUgb2YgeW91ciBjb2RlIGJsb2NrcyBpbmNsdWRlcyB1bmVzY2FwZWQgSFRNTC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgc2VjdXJpdHkgcmlzay5cIik7XG4gICAgICAgIGNvbnNvbGUud2FybihcImh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvd2lraS9zZWN1cml0eVwiKTtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgd2l0aCB1bmVzY2FwZWQgSFRNTDpcIik7XG4gICAgICAgIGNvbnNvbGUud2FybihlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnRocm93VW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgSFRNTEluamVjdGlvbkVycm9yKFxuICAgICAgICAgIFwiT25lIG9mIHlvdXIgY29kZSBibG9ja3MgaW5jbHVkZXMgdW5lc2NhcGVkIEhUTUwuXCIsXG4gICAgICAgICAgZWxlbWVudC5pbm5lckhUTUxcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBlbGVtZW50O1xuICAgIGNvbnN0IHRleHQgPSBub2RlLnRleHRDb250ZW50O1xuICAgIGNvbnN0IHJlc3VsdCA9IGxhbmd1YWdlID8gaGlnaGxpZ2h0KHRleHQsIHsgbGFuZ3VhZ2UsIGlnbm9yZUlsbGVnYWxzOiB0cnVlIH0pIDogaGlnaGxpZ2h0QXV0byh0ZXh0KTtcblxuICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gcmVzdWx0LnZhbHVlO1xuICAgIHVwZGF0ZUNsYXNzTmFtZShlbGVtZW50LCBsYW5ndWFnZSwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICBlbGVtZW50LnJlc3VsdCA9IHtcbiAgICAgIGxhbmd1YWdlOiByZXN1bHQubGFuZ3VhZ2UsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2ZXJzaW9uIDExLjBcbiAgICAgIHJlOiByZXN1bHQucmVsZXZhbmNlLFxuICAgICAgcmVsZXZhbmNlOiByZXN1bHQucmVsZXZhbmNlXG4gICAgfTtcbiAgICBpZiAocmVzdWx0LnNlY29uZEJlc3QpIHtcbiAgICAgIGVsZW1lbnQuc2Vjb25kQmVzdCA9IHtcbiAgICAgICAgbGFuZ3VhZ2U6IHJlc3VsdC5zZWNvbmRCZXN0Lmxhbmd1YWdlLFxuICAgICAgICByZWxldmFuY2U6IHJlc3VsdC5zZWNvbmRCZXN0LnJlbGV2YW5jZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmaXJlKFwiYWZ0ZXI6aGlnaGxpZ2h0RWxlbWVudFwiLCB7IGVsOiBlbGVtZW50LCByZXN1bHQsIHRleHQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBoaWdobGlnaHQuanMgZ2xvYmFsIG9wdGlvbnMgd2l0aCB0aGUgcGFzc2VkIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEhMSlNPcHRpb25zPn0gdXNlck9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIGNvbmZpZ3VyZSh1c2VyT3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBpbmhlcml0KG9wdGlvbnMsIHVzZXJPcHRpb25zKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSB2MTIsIGRlcHJlY2F0ZWRcbiAgY29uc3QgaW5pdEhpZ2hsaWdodGluZyA9ICgpID0+IHtcbiAgICBoaWdobGlnaHRBbGwoKTtcbiAgICBkZXByZWNhdGVkKFwiMTAuNi4wXCIsIFwiaW5pdEhpZ2hsaWdodGluZygpIGRlcHJlY2F0ZWQuICBVc2UgaGlnaGxpZ2h0QWxsKCkgbm93LlwiKTtcbiAgfTtcblxuICAvLyBUT0RPOiByZW1vdmUgdjEyLCBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIGluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSB7XG4gICAgaGlnaGxpZ2h0QWxsKCk7XG4gICAgZGVwcmVjYXRlZChcIjEwLjYuMFwiLCBcImluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy5cIik7XG4gIH1cblxuICBsZXQgd2FudHNIaWdobGlnaHQgPSBmYWxzZTtcblxuICAvKipcbiAgICogYXV0by1oaWdobGlnaHRzIGFsbCBwcmU+Y29kZSBlbGVtZW50cyBvbiB0aGUgcGFnZVxuICAgKi9cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QWxsKCkge1xuICAgIC8vIGlmIHdlIGFyZSBjYWxsZWQgdG9vIGVhcmx5IGluIHRoZSBsb2FkaW5nIHByb2Nlc3NcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgIHdhbnRzSGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBibG9ja3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG9wdGlvbnMuY3NzU2VsZWN0b3IpO1xuICAgIGJsb2Nrcy5mb3JFYWNoKGhpZ2hsaWdodEVsZW1lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYm9vdCgpIHtcbiAgICAvLyBpZiBhIGhpZ2hsaWdodCB3YXMgcmVxdWVzdGVkIGJlZm9yZSBET00gd2FzIGxvYWRlZCwgZG8gbm93XG4gICAgaWYgKHdhbnRzSGlnaGxpZ2h0KSBoaWdobGlnaHRBbGwoKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBib290LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsYW5ndWFnZSBncmFtbWFyIG1vZHVsZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VOYW1lXG4gICAqIEBwYXJhbSB7TGFuZ3VhZ2VGbn0gbGFuZ3VhZ2VEZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3Rlckxhbmd1YWdlKGxhbmd1YWdlTmFtZSwgbGFuZ3VhZ2VEZWZpbml0aW9uKSB7XG4gICAgbGV0IGxhbmcgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBsYW5nID0gbGFuZ3VhZ2VEZWZpbml0aW9uKGhsanMpO1xuICAgIH0gY2F0Y2ggKGVycm9yJDEpIHtcbiAgICAgIGVycm9yKFwiTGFuZ3VhZ2UgZGVmaW5pdGlvbiBmb3IgJ3t9JyBjb3VsZCBub3QgYmUgcmVnaXN0ZXJlZC5cIi5yZXBsYWNlKFwie31cIiwgbGFuZ3VhZ2VOYW1lKSk7XG4gICAgICAvLyBoYXJkIG9yIHNvZnQgZXJyb3JcbiAgICAgIGlmICghU0FGRV9NT0RFKSB7IHRocm93IGVycm9yJDE7IH0gZWxzZSB7IGVycm9yKGVycm9yJDEpOyB9XG4gICAgICAvLyBsYW5ndWFnZXMgdGhhdCBoYXZlIHNlcmlvdXMgZXJyb3JzIGFyZSByZXBsYWNlZCB3aXRoIGVzc2VudGlhbGx5IGFcbiAgICAgIC8vIFwicGxhaW50ZXh0XCIgc3RhbmQtaW4gc28gdGhhdCB0aGUgY29kZSBibG9ja3Mgd2lsbCBzdGlsbCBnZXQgbm9ybWFsXG4gICAgICAvLyBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIHRoZW0gLSBhbmQgb25lIGJhZCBsYW5ndWFnZSB3b24ndCBicmVhayB0aGVcbiAgICAgIC8vIGVudGlyZSBoaWdobGlnaHRlclxuICAgICAgbGFuZyA9IFBMQUlOVEVYVF9MQU5HVUFHRTtcbiAgICB9XG4gICAgLy8gZ2l2ZSBpdCBhIHRlbXBvcmFyeSBuYW1lIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgaW4gdGhlIG1ldGEtZGF0YVxuICAgIGlmICghbGFuZy5uYW1lKSBsYW5nLm5hbWUgPSBsYW5ndWFnZU5hbWU7XG4gICAgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV0gPSBsYW5nO1xuICAgIGxhbmcucmF3RGVmaW5pdGlvbiA9IGxhbmd1YWdlRGVmaW5pdGlvbi5iaW5kKG51bGwsIGhsanMpO1xuXG4gICAgaWYgKGxhbmcuYWxpYXNlcykge1xuICAgICAgcmVnaXN0ZXJBbGlhc2VzKGxhbmcuYWxpYXNlcywgeyBsYW5ndWFnZU5hbWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxhbmd1YWdlIGdyYW1tYXIgbW9kdWxlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZU5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHVucmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZU5hbWUpIHtcbiAgICBkZWxldGUgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV07XG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBPYmplY3Qua2V5cyhhbGlhc2VzKSkge1xuICAgICAgaWYgKGFsaWFzZXNbYWxpYXNdID09PSBsYW5ndWFnZU5hbWUpIHtcbiAgICAgICAgZGVsZXRlIGFsaWFzZXNbYWxpYXNdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3Qgb2YgbGFuZ3VhZ2UgaW50ZXJuYWwgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGxpc3RMYW5ndWFnZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBuYW1lIG9mIHRoZSBsYW5ndWFnZSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7TGFuZ3VhZ2UgfCB1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRMYW5ndWFnZShuYW1lKSB7XG4gICAgbmFtZSA9IChuYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBsYW5ndWFnZXNbbmFtZV0gfHwgbGFuZ3VhZ2VzW2FsaWFzZXNbbmFtZV1dO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhbGlhc0xpc3QgLSBzaW5nbGUgYWxpYXMgb3IgbGlzdCBvZiBhbGlhc2VzXG4gICAqIEBwYXJhbSB7e2xhbmd1YWdlTmFtZTogc3RyaW5nfX0gb3B0c1xuICAgKi9cbiAgZnVuY3Rpb24gcmVnaXN0ZXJBbGlhc2VzKGFsaWFzTGlzdCwgeyBsYW5ndWFnZU5hbWUgfSkge1xuICAgIGlmICh0eXBlb2YgYWxpYXNMaXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgYWxpYXNMaXN0ID0gW2FsaWFzTGlzdF07XG4gICAgfVxuICAgIGFsaWFzTGlzdC5mb3JFYWNoKGFsaWFzID0+IHsgYWxpYXNlc1thbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGxhbmd1YWdlTmFtZTsgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGxhbmd1YWdlIGhhcyBhdXRvLWRldGVjdGlvbiBlbmFibGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gbmFtZSBvZiB0aGUgbGFuZ3VhZ2VcbiAgICovXG4gIGZ1bmN0aW9uIGF1dG9EZXRlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGxhbmcgPSBnZXRMYW5ndWFnZShuYW1lKTtcbiAgICByZXR1cm4gbGFuZyAmJiAhbGFuZy5kaXNhYmxlQXV0b2RldGVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGdyYWRlcyB0aGUgb2xkIGhpZ2hsaWdodEJsb2NrIHBsdWdpbnMgdG8gdGhlIG5ld1xuICAgKiBoaWdobGlnaHRFbGVtZW50IEFQSVxuICAgKiBAcGFyYW0ge0hMSlNQbHVnaW59IHBsdWdpblxuICAgKi9cbiAgZnVuY3Rpb24gdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pIHtcbiAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2MTJcbiAgICBpZiAocGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEJsb2NrXCJdICYmICFwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0RWxlbWVudFwiXSkge1xuICAgICAgcGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0QmxvY2tcIl0oXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih7IGJsb2NrOiBkYXRhLmVsIH0sIGRhdGEpXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocGx1Z2luW1wiYWZ0ZXI6aGlnaGxpZ2h0QmxvY2tcIl0gJiYgIXBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0pIHtcbiAgICAgIHBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJhZnRlcjpoaWdobGlnaHRCbG9ja1wiXShcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHsgYmxvY2s6IGRhdGEuZWwgfSwgZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SExKU1BsdWdpbn0gcGx1Z2luXG4gICAqL1xuICBmdW5jdGlvbiBhZGRQbHVnaW4ocGx1Z2luKSB7XG4gICAgdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pO1xuICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SExKU1BsdWdpbn0gcGx1Z2luXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVQbHVnaW4ocGx1Z2luKSB7XG4gICAgY29uc3QgaW5kZXggPSBwbHVnaW5zLmluZGV4T2YocGx1Z2luKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBwbHVnaW5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7UGx1Z2luRXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7YW55fSBhcmdzXG4gICAqL1xuICBmdW5jdGlvbiBmaXJlKGV2ZW50LCBhcmdzKSB7XG4gICAgY29uc3QgY2IgPSBldmVudDtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICBpZiAocGx1Z2luW2NiXSkge1xuICAgICAgICBwbHVnaW5bY2JdKGFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERFUFJFQ0FURURcbiAgICogQHBhcmFtIHtIaWdobGlnaHRlZEhUTUxFbGVtZW50fSBlbFxuICAgKi9cbiAgZnVuY3Rpb24gZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2soZWwpIHtcbiAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wXCIpO1xuICAgIGRlcHJlY2F0ZWQoXCIxMC43LjBcIiwgXCJQbGVhc2UgdXNlIGhpZ2hsaWdodEVsZW1lbnQgbm93LlwiKTtcblxuICAgIHJldHVybiBoaWdobGlnaHRFbGVtZW50KGVsKTtcbiAgfVxuXG4gIC8qIEludGVyZmFjZSBkZWZpbml0aW9uICovXG4gIE9iamVjdC5hc3NpZ24oaGxqcywge1xuICAgIGhpZ2hsaWdodCxcbiAgICBoaWdobGlnaHRBdXRvLFxuICAgIGhpZ2hsaWdodEFsbCxcbiAgICBoaWdobGlnaHRFbGVtZW50LFxuICAgIC8vIFRPRE86IFJlbW92ZSB3aXRoIHYxMiBBUElcbiAgICBoaWdobGlnaHRCbG9jazogZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2ssXG4gICAgY29uZmlndXJlLFxuICAgIGluaXRIaWdobGlnaHRpbmcsXG4gICAgaW5pdEhpZ2hsaWdodGluZ09uTG9hZCxcbiAgICByZWdpc3Rlckxhbmd1YWdlLFxuICAgIHVucmVnaXN0ZXJMYW5ndWFnZSxcbiAgICBsaXN0TGFuZ3VhZ2VzLFxuICAgIGdldExhbmd1YWdlLFxuICAgIHJlZ2lzdGVyQWxpYXNlcyxcbiAgICBhdXRvRGV0ZWN0aW9uLFxuICAgIGluaGVyaXQsXG4gICAgYWRkUGx1Z2luLFxuICAgIHJlbW92ZVBsdWdpblxuICB9KTtcblxuICBobGpzLmRlYnVnTW9kZSA9IGZ1bmN0aW9uKCkgeyBTQUZFX01PREUgPSBmYWxzZTsgfTtcbiAgaGxqcy5zYWZlTW9kZSA9IGZ1bmN0aW9uKCkgeyBTQUZFX01PREUgPSB0cnVlOyB9O1xuICBobGpzLnZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uO1xuXG4gIGhsanMucmVnZXggPSB7XG4gICAgY29uY2F0OiBjb25jYXQsXG4gICAgbG9va2FoZWFkOiBsb29rYWhlYWQsXG4gICAgZWl0aGVyOiBlaXRoZXIsXG4gICAgb3B0aW9uYWw6IG9wdGlvbmFsLFxuICAgIGFueU51bWJlck9mVGltZXM6IGFueU51bWJlck9mVGltZXNcbiAgfTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBNT0RFUykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIE1PREVTW2tleV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGRlZXBGcmVlemUoTU9ERVNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8gbWVyZ2UgYWxsIHRoZSBtb2Rlcy9yZWdleGVzIGludG8gb3VyIG1haW4gb2JqZWN0XG4gIE9iamVjdC5hc3NpZ24oaGxqcywgTU9ERVMpO1xuXG4gIHJldHVybiBobGpzO1xufTtcblxuLy8gT3RoZXIgbmFtZXMgZm9yIHRoZSB2YXJpYWJsZSBtYXkgYnJlYWsgYnVpbGQgc2NyaXB0XG5jb25zdCBoaWdobGlnaHQgPSBITEpTKHt9KTtcblxuLy8gcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaGlnaGxpZ2h0ZXIgdG8gYmUgdXNlZCBmb3IgZXh0ZW5zaW9uc1xuLy8gY2hlY2sgaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9sb3dsaWdodC9pc3N1ZXMvNDdcbmhpZ2hsaWdodC5uZXdJbnN0YW5jZSA9ICgpID0+IEhMSlMoe30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhpZ2hsaWdodDtcbmhpZ2hsaWdodC5IaWdobGlnaHRKUyA9IGhpZ2hsaWdodDtcbmhpZ2hsaWdodC5kZWZhdWx0ID0gaGlnaGxpZ2h0O1xuIiwgIi8vXG4vLyBmb3JtYXQgLSBwcmludGYtbGlrZSBzdHJpbmcgZm9ybWF0dGluZyBmb3IgSmF2YVNjcmlwdFxuLy8gZ2l0aHViLmNvbS9zYW1zb25qcy9mb3JtYXRcbi8vIEBfc2pzXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTAgLSAyMDEzIFNhbWkgU2FtaHVyaSA8c2FtaUBzYW1odXJpLm5ldD5cbi8vXG4vLyBNSVQgTGljZW5zZVxuLy8gaHR0cDovL3Nqcy5taXQtbGljZW5zZS5vcmdcbi8vXG5cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLy8vLyBFeHBvcnQgdGhlIEFQSVxuICB2YXIgbmFtZXNwYWNlO1xuXG4gIC8vIENvbW1vbkpTIC8gTm9kZSBtb2R1bGVcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbmFtZXNwYWNlID0gbW9kdWxlLmV4cG9ydHMgPSBmb3JtYXQ7XG4gIH1cblxuICAvLyBCcm93c2VycyBhbmQgb3RoZXIgZW52aXJvbm1lbnRzXG4gIGVsc2Uge1xuICAgIC8vIEdldCB0aGUgZ2xvYmFsIG9iamVjdC4gV29ya3MgaW4gRVMzLCBFUzUsIGFuZCBFUzUgc3RyaWN0IG1vZGUuXG4gICAgbmFtZXNwYWNlID0gKGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzIHx8ICgxLGV2YWwpKCd0aGlzJykgfSgpKTtcbiAgfVxuXG4gIG5hbWVzcGFjZS5mb3JtYXQgPSBmb3JtYXQ7XG4gIG5hbWVzcGFjZS52c3ByaW50ZiA9IHZzcHJpbnRmO1xuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbmFtZXNwYWNlLnByaW50ZiA9IHByaW50ZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50ZigvKiAuLi4gKi8pIHtcbiAgICBjb25zb2xlLmxvZyhmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gIH1cblxuICBmdW5jdGlvbiB2c3ByaW50ZihmbXQsIHJlcGxhY2VtZW50cykge1xuICAgIHJldHVybiBmb3JtYXQuYXBwbHkobnVsbCwgW2ZtdF0uY29uY2F0KHJlcGxhY2VtZW50cykpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0KGZtdCkge1xuICAgIHZhciBhcmdJbmRleCA9IDEgLy8gc2tpcCBpbml0aWFsIGZvcm1hdCBhcmd1bWVudFxuICAgICAgLCBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAsIGkgPSAwXG4gICAgICAsIG4gPSBmbXQubGVuZ3RoXG4gICAgICAsIHJlc3VsdCA9ICcnXG4gICAgICAsIGNcbiAgICAgICwgZXNjYXBlZCA9IGZhbHNlXG4gICAgICAsIGFyZ1xuICAgICAgLCB0bXBcbiAgICAgICwgbGVhZGluZ1plcm8gPSBmYWxzZVxuICAgICAgLCBwcmVjaXNpb25cbiAgICAgICwgbmV4dEFyZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfVxuICAgICAgLCBzbHVycE51bWJlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBkaWdpdHMgPSAnJztcbiAgICAgICAgICB3aGlsZSAoL1xcZC8udGVzdChmbXRbaV0pKSB7XG4gICAgICAgICAgICBkaWdpdHMgKz0gZm10W2krK107XG4gICAgICAgICAgICBjID0gZm10W2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGlnaXRzLmxlbmd0aCA+IDAgPyBwYXJzZUludChkaWdpdHMpIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgO1xuICAgIGZvciAoOyBpIDwgbjsgKytpKSB7XG4gICAgICBjID0gZm10W2ldO1xuICAgICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYyA9PSAnLicpIHtcbiAgICAgICAgICBsZWFkaW5nWmVybyA9IGZhbHNlO1xuICAgICAgICAgIGMgPSBmbXRbKytpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjID09ICcwJyAmJiBmbXRbaSArIDFdID09ICcuJykge1xuICAgICAgICAgIGxlYWRpbmdaZXJvID0gdHJ1ZTtcbiAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgYyA9IGZtdFtpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsZWFkaW5nWmVybyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcHJlY2lzaW9uID0gc2x1cnBOdW1iZXIoKTtcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgIGNhc2UgJ2InOiAvLyBudW1iZXIgaW4gYmluYXJ5XG4gICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjJzogLy8gY2hhcmFjdGVyXG4gICAgICAgICAgYXJnID0gbmV4dEFyZygpO1xuICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcpXG4gICAgICAgICAgICByZXN1bHQgKz0gYXJnO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZCc6IC8vIG51bWJlciBpbiBkZWNpbWFsXG4gICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmJzogLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyXG4gICAgICAgICAgdG1wID0gU3RyaW5nKHBhcnNlRmxvYXQobmV4dEFyZygpKS50b0ZpeGVkKHByZWNpc2lvbiB8fCA2KSk7XG4gICAgICAgICAgcmVzdWx0ICs9IGxlYWRpbmdaZXJvID8gdG1wIDogdG1wLnJlcGxhY2UoL14wLywgJycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdqJzogLy8gSlNPTlxuICAgICAgICAgIHJlc3VsdCArPSBKU09OLnN0cmluZ2lmeShuZXh0QXJnKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvJzogLy8gbnVtYmVyIGluIG9jdGFsXG4gICAgICAgICAgcmVzdWx0ICs9ICcwJyArIHBhcnNlSW50KG5leHRBcmcoKSwgMTApLnRvU3RyaW5nKDgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nXG4gICAgICAgICAgcmVzdWx0ICs9IG5leHRBcmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneCc6IC8vIGxvd2VyY2FzZSBoZXhhZGVjaW1hbFxuICAgICAgICAgIHJlc3VsdCArPSAnMHgnICsgcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdYJzogLy8gdXBwZXJjYXNlIGhleGFkZWNpbWFsXG4gICAgICAgICAgcmVzdWx0ICs9ICcweCcgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXN1bHQgKz0gYztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjID09PSAnJScpIHtcbiAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG59KCkpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL29wZW5qc2Yub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUtRVM1IGVudmlyb25tZW50cy4gKi9cbiAgdmFyIHVuZGVmaW5lZDtcblxuICAvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG4gIHZhciBWRVJTSU9OID0gJzQuMTcuMjEnO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xuICB2YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuICAvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG4gIHZhciBDT1JFX0VSUk9SX1RFWFQgPSAnVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJyxcbiAgICAgIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJyxcbiAgICAgIElOVkFMSURfVEVNUExfVkFSX0VSUk9SX1RFWFQgPSAnSW52YWxpZCBgdmFyaWFibGVgIG9wdGlvbiBwYXNzZWQgaW50byBgXy50ZW1wbGF0ZWAnO1xuXG4gIC8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbiAgdmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbiAgdmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xuICB2YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbiAgdmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbiAgdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICB2YXIgV1JBUF9CSU5EX0ZMQUcgPSAxLFxuICAgICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICAgIFdSQVBfQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgICBXUkFQX1BBUlRJQUxfRkxBRyA9IDMyLFxuICAgICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NCxcbiAgICAgIFdSQVBfQVJZX0ZMQUcgPSAxMjgsXG4gICAgICBXUkFQX1JFQVJHX0ZMQUcgPSAyNTYsXG4gICAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuICAvKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi9cbiAgdmFyIERFRkFVTFRfVFJVTkNfTEVOR1RIID0gMzAsXG4gICAgICBERUZBVUxUX1RSVU5DX09NSVNTSU9OID0gJy4uLic7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xuICB2YXIgSE9UX0NPVU5UID0gODAwLFxuICAgICAgSE9UX1NQQU4gPSAxNjtcblxuICAvKiogVXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBsYXp5IGl0ZXJhdGVlcy4gKi9cbiAgdmFyIExBWllfRklMVEVSX0ZMQUcgPSAxLFxuICAgICAgTEFaWV9NQVBfRkxBRyA9IDIsXG4gICAgICBMQVpZX1dISUxFX0ZMQUcgPSAzO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuICB2YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICAgIE5BTiA9IDAgLyAwO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG4gIHZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NSxcbiAgICAgIE1BWF9BUlJBWV9JTkRFWCA9IE1BWF9BUlJBWV9MRU5HVEggLSAxLFxuICAgICAgSEFMRl9NQVhfQVJSQVlfTEVOR1RIID0gTUFYX0FSUkFZX0xFTkdUSCA+Pj4gMTtcblxuICAvKiogVXNlZCB0byBhc3NvY2lhdGUgd3JhcCBtZXRob2RzIHdpdGggdGhlaXIgYml0IGZsYWdzLiAqL1xuICB2YXIgd3JhcEZsYWdzID0gW1xuICAgIFsnYXJ5JywgV1JBUF9BUllfRkxBR10sXG4gICAgWydiaW5kJywgV1JBUF9CSU5EX0ZMQUddLFxuICAgIFsnYmluZEtleScsIFdSQVBfQklORF9LRVlfRkxBR10sXG4gICAgWydjdXJyeScsIFdSQVBfQ1VSUllfRkxBR10sXG4gICAgWydjdXJyeVJpZ2h0JywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxcbiAgICBbJ2ZsaXAnLCBXUkFQX0ZMSVBfRkxBR10sXG4gICAgWydwYXJ0aWFsJywgV1JBUF9QQVJUSUFMX0ZMQUddLFxuICAgIFsncGFydGlhbFJpZ2h0JywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFxuICAgIFsncmVhcmcnLCBXUkFQX1JFQVJHX0ZMQUddXG4gIF07XG5cbiAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuICB2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICAgIGRvbUV4Y1RhZyA9ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nLFxuICAgICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICAgIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XScsXG4gICAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nLFxuICAgICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJyxcbiAgICAgIHdlYWtTZXRUYWcgPSAnW29iamVjdCBXZWFrU2V0XSc7XG5cbiAgdmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBlbXB0eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlLiAqL1xuICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXFxiX19wIFxcKz0gJyc7L2csXG4gICAgICByZUVtcHR5U3RyaW5nTWlkZGxlID0gL1xcYihfX3AgXFwrPSkgJycgXFwrL2csXG4gICAgICByZUVtcHR5U3RyaW5nVHJhaWxpbmcgPSAvKF9fZVxcKC4qP1xcKXxcXGJfX3RcXCkpIFxcK1xcbicnOy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlZEh0bWwgPSAvJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2csXG4gICAgICByZVVuZXNjYXBlZEh0bWwgPSAvWyY8PlwiJ10vZyxcbiAgICAgIHJlSGFzRXNjYXBlZEh0bWwgPSBSZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLFxuICAgICAgcmVIYXNVbmVzY2FwZWRIdG1sID0gUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG4gIHZhciByZUVzY2FwZSA9IC88JS0oW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVFdmFsdWF0ZSA9IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUludGVycG9sYXRlID0gLzwlPShbXFxzXFxTXSs/KSU+L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLyxcbiAgICAgIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAgICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gICAqL1xuICB2YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nLFxuICAgICAgcmVIYXNSZWdFeHBDaGFyID0gUmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuICAvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbiAgdmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xuICB2YXIgcmVXcmFwQ29tbWVudCA9IC9cXHsoPzpcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoIC4rXFxdIFxcKlxcLyk/XFxuPy8sXG4gICAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdmFsaWRhdGUgdGhlIGB2YWxpZGF0ZWAgb3B0aW9uIGluIGBfLnRlbXBsYXRlYCB2YXJpYWJsZS5cbiAgICpcbiAgICogRm9yYmlkcyBjaGFyYWN0ZXJzIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgZGVmaW5pdGlvbjpcbiAgICogLSBcIigpLFwiIChtb2RpZmljYXRpb24gb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIj1cIiAoZGVmYXVsdCB2YWx1ZSlcbiAgICogLSBcIltde31cIiAoZGVzdHJ1Y3R1cmluZyBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzKVxuICAgKiAtIFwiL1wiIChiZWdpbm5pbmcgb2YgYSBjb21tZW50KVxuICAgKiAtIHdoaXRlc3BhY2VcbiAgICovXG4gIHZhciByZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycyA9IC9bKCk9LHt9XFxbXFxdXFwvXFxzXS87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaFxuICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLlxuICAgKi9cbiAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG4gIHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG4gIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggTGF0aW4gVW5pY29kZSBsZXR0ZXJzIChleGNsdWRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycykuICovXG4gIHZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbiAgdmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICAgIHJzTG93ZXJSYW5nZSA9ICdhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmYnLFxuICAgICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgICByc1B1bmN0dWF0aW9uUmFuZ2UgPSAnXFxcXHUyMDAwLVxcXFx1MjA2ZicsXG4gICAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZicsXG4gICAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xuICB2YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCIsXG4gICAgICByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICAgIHJzRGlnaXRzID0gJ1xcXFxkKycsXG4gICAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgICByc01pc2MgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArIHJzQnJlYWtSYW5nZSArIHJzRGlnaXRzICsgcnNEaW5nYmF0UmFuZ2UgKyByc0xvd2VyUmFuZ2UgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICAgIHJzVXBwZXIgPSAnWycgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xuICB2YXIgcnNNaXNjTG93ZXIgPSAnKD86JyArIHJzTG93ZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgICAgcnNPcHRDb250clVwcGVyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86RHxMTHxNfFJFfFN8VHxWRSkpPycsXG4gICAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxLFxuICAgICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG4gIHZhciByZUFwb3MgPSBSZWdFeHAocnNBcG9zLCAnZycpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kXG4gICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gICAqL1xuICB2YXIgcmVDb21ib01hcmsgPSBSZWdFeHAocnNDb21ibywgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xuICB2YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggY29tcGxleCBvciBjb21wb3VuZCB3b3Jkcy4gKi9cbiAgdmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICAgIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNNaXNjVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyICsgcnNNaXNjTG93ZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICAgIHJzT3JkVXBwZXIsXG4gICAgcnNPcmRMb3dlcixcbiAgICByc0RpZ2l0cyxcbiAgICByc0Vtb2ppXG4gIF0uam9pbignfCcpLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG4gIHZhciByZUhhc1VuaWNvZGVXb3JkID0gL1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdCdWZmZXInLCAnRGF0YVZpZXcnLCAnRGF0ZScsICdFcnJvcicsICdGbG9hdDMyQXJyYXknLCAnRmxvYXQ2NEFycmF5JyxcbiAgICAnRnVuY3Rpb24nLCAnSW50OEFycmF5JywgJ0ludDE2QXJyYXknLCAnSW50MzJBcnJheScsICdNYXAnLCAnTWF0aCcsICdPYmplY3QnLFxuICAgICdQcm9taXNlJywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ1N5bWJvbCcsICdUeXBlRXJyb3InLCAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ1VpbnQxNkFycmF5JywgJ1VpbnQzMkFycmF5JywgJ1dlYWtNYXAnLFxuICAgICdfJywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdwYXJzZUludCcsICdzZXRUaW1lb3V0J1xuICBdO1xuXG4gIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG4gIHZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xuICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICB0eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbiAgdmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbiAgY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbiAgY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbiAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcycsXG4gICAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAgICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAgICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAgICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAgICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAgICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAgICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAgICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAgICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAgICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAgICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG4gIHZhciBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgaHRtbFVuZXNjYXBlcyA9IHtcbiAgICAnJmFtcDsnOiAnJicsXG4gICAgJyZsdDsnOiAnPCcsXG4gICAgJyZndDsnOiAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyYjMzk7JzogXCInXCJcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbiAgdmFyIGZyZWVQYXJzZUZsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICAgIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbiAgLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG4gIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgICAgaWYgKHR5cGVzKSB7XG4gICAgICAgIHJldHVybiB0eXBlcztcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9KCkpO1xuXG4gIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG4gIHZhciBub2RlSXNBcnJheUJ1ZmZlciA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsXG4gICAgICBub2RlSXNEYXRlID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNEYXRlLFxuICAgICAgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXAsXG4gICAgICBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cCxcbiAgICAgIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0LFxuICAgICAgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgIH1cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsXG4gICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICAgIHZhciByZXN1bHQ7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlSW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVhbmAgYW5kIGBfLm1lYW5CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gICAqIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXlcbiAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nXG4gICAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgICAgOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICAgKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAgICogb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICAgIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltU3RhcnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSAwO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgKytyZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gICAqL1xuICB2YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIGVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIGEgd29yZCBjb21wb3NlZCBvZiBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYGl0ZXJhdG9yYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZXJhdG9yIFRoZSBpdGVyYXRvciB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikge1xuICAgIHZhciBkYXRhLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICghKGRhdGEgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBbdmFsdWUsIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5sYXN0SW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgICA6IGFzY2lpVG9BcnJheShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAgICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICAgIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byB1bmVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciB1bmVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICAgICsrcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQHNpbmNlIDEuMS4wXG4gICAqIEBjYXRlZ29yeSBVdGlsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogXy5taXhpbih7ICdmb28nOiBfLmNvbnN0YW50KCdmb28nKSB9KTtcbiAgICpcbiAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7XG4gICAqIGxvZGFzaC5taXhpbih7ICdiYXInOiBsb2Rhc2guY29uc3RhbnQoJ2JhcicpIH0pO1xuICAgKlxuICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqIF8uaXNGdW5jdGlvbihfLmJhcik7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5mb28pO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guYmFyKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKlxuICAgKiAvLyBDcmVhdGUgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanMuXG4gICAqIHZhciBkZWZlciA9IF8ucnVuSW5Db250ZXh0KHsgJ3NldFRpbWVvdXQnOiBzZXRJbW1lZGlhdGUgfSkuZGVmZXI7XG4gICAqL1xuICB2YXIgcnVuSW5Db250ZXh0ID0gKGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IGNvbnRleHQgPT0gbnVsbCA/IHJvb3QgOiBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKTtcblxuICAgIC8qKiBCdWlsdC1pbiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksXG4gICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsXG4gICAgICAgIEVycm9yID0gY29udGV4dC5FcnJvcixcbiAgICAgICAgRnVuY3Rpb24gPSBjb250ZXh0LkZ1bmN0aW9uLFxuICAgICAgICBNYXRoID0gY29udGV4dC5NYXRoLFxuICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCxcbiAgICAgICAgUmVnRXhwID0gY29udGV4dC5SZWdFeHAsXG4gICAgICAgIFN0cmluZyA9IGNvbnRleHQuU3RyaW5nLFxuICAgICAgICBUeXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjtcblxuICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICAgICAgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG4gICAgdmFyIGNvcmVKc0RhdGEgPSBjb250ZXh0WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbiAgICB2YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG4gICAgdmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqL1xuICAgIHZhciBpZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbiAgICB2YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gICAgICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAgICAgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAgICAgKiBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgdmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG4gICAgdmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgXy5ub0NvbmZsaWN0YC4gKi9cbiAgICB2YXIgb2xkRGFzaCA9IHJvb3QuXztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG4gICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBjb250ZXh0LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgU3ltYm9sID0gY29udGV4dC5TeW1ib2wsXG4gICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksXG4gICAgICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkLFxuICAgICAgICBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KSxcbiAgICAgICAgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSxcbiAgICAgICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2UsXG4gICAgICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1JdGVyYXRvciA9IFN5bWJvbCA/IFN5bWJvbC5pdGVyYXRvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgICAgICBmdW5jKHt9LCAnJywge30pO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSgpKTtcblxuICAgIC8qKiBNb2NrZWQgYnVpbHQtaW5zLiAqL1xuICAgIHZhciBjdHhDbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCAhPT0gcm9vdC5jbGVhclRpbWVvdXQgJiYgY29udGV4dC5jbGVhclRpbWVvdXQsXG4gICAgICAgIGN0eE5vdyA9IERhdGUgJiYgRGF0ZS5ub3cgIT09IHJvb3QuRGF0ZS5ub3cgJiYgRGF0ZS5ub3csXG4gICAgICAgIGN0eFNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQgIT09IHJvb3Quc2V0VGltZW91dCAmJiBjb250ZXh0LnNldFRpbWVvdXQ7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG4gICAgdmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcixcbiAgICAgICAgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gICAgICAgIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsXG4gICAgICAgIG5hdGl2ZUpvaW4gPSBhcnJheVByb3RvLmpvaW4sXG4gICAgICAgIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZU5vdyA9IERhdGUubm93LFxuICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRleHQucGFyc2VJbnQsXG4gICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tLFxuICAgICAgICBuYXRpdmVSZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuICAgIHZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShjb250ZXh0LCAnRGF0YVZpZXcnKSxcbiAgICAgICAgTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdNYXAnKSxcbiAgICAgICAgUHJvbWlzZSA9IGdldE5hdGl2ZShjb250ZXh0LCAnUHJvbWlzZScpLFxuICAgICAgICBTZXQgPSBnZXROYXRpdmUoY29udGV4dCwgJ1NldCcpLFxuICAgICAgICBXZWFrTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdXZWFrTWFwJyksXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuICAgIC8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICAgIHZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xuICAgIHZhciByZWFsTmFtZXMgPSB7fTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG4gICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICAgICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgICAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4gICAgLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG4gICAgdmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMuIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucyxcbiAgICAgKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWVcbiAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gICAgICogYW5kIHJldHVybiB0aGUgdW53cmFwcGVkIHZhbHVlLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogRXhwbGljaXQgY2hhaW4gc2VxdWVuY2VzLCB3aGljaCBtdXN0IGJlIHVud3JhcHBlZCB3aXRoIGBfI3ZhbHVlYCwgbWF5IGJlXG4gICAgICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuXG4gICAgICpcbiAgICAgKiBUaGUgZXhlY3V0aW9uIG9mIGNoYWluZWQgbWV0aG9kcyBpcyBsYXp5LCB0aGF0IGlzLCBpdCdzIGRlZmVycmVkIHVudGlsXG4gICAgICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBMYXp5IGV2YWx1YXRpb24gYWxsb3dzIHNldmVyYWwgbWV0aG9kcyB0byBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbi5cbiAgICAgKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkc1xuICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICAgICAqIGl0ZXJhdGVlIGV4ZWN1dGlvbnMuIFNlY3Rpb25zIG9mIGEgY2hhaW4gc2VxdWVuY2UgcXVhbGlmeSBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5XG4gICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlLlxuICAgICAqXG4gICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gICAgICogYGZpbmRMYXN0YCwgYGhlYWRgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGByZWplY3RgLCBgcmV2ZXJzZWAsIGBzbGljZWAsXG4gICAgICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YFxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCxcbiAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gICAgICogYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25mb3Jtc2AsIGBjb25zdGFudGAsIGBjb3VudEJ5YCwgYGNyZWF0ZWAsXG4gICAgICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsXG4gICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAgICAgKiBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGV4dGVuZGAsIGBleHRlbmRXaXRoYCwgYGZpbGxgLCBgZmlsdGVyYCxcbiAgICAgKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsXG4gICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICAgICAqIGBmdW5jdGlvbnNJbmAsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludGVyc2VjdGlvbkJ5YCxcbiAgICAgKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCxcbiAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAgICAgKiBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXJnZVdpdGhgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCwgYG5lZ2F0ZWAsXG4gICAgICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsXG4gICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gICAgICogYHBpY2tCeWAsIGBwbGFudGAsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLCBgcHVsbEFsbGAsIGBwdWxsQWxsQnlgLFxuICAgICAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsXG4gICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAgICAgKiBgc2xpY2VgLCBgc29ydGAsIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHNwcmVhZGAsIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLFxuICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICAgICAqIGB1bmlvbmAsIGB1bmlvbkJ5YCwgYHVuaW9uV2l0aGAsIGB1bmlxYCwgYHVuaXFCeWAsIGB1bmlxV2l0aGAsIGB1bnNldGAsXG4gICAgICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsXG4gICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICAgICAqIGB6aXBPYmplY3RgLCBgemlwT2JqZWN0RGVlcGAsIGFuZCBgemlwV2l0aGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gICAgICogYGFkZGAsIGBhdHRlbXB0YCwgYGNhbWVsQ2FzZWAsIGBjYXBpdGFsaXplYCwgYGNlaWxgLCBgY2xhbXBgLCBgY2xvbmVgLFxuICAgICAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLFxuICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gICAgICogYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCxcbiAgICAgKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsXG4gICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAgICAgKiBgaGFzSW5gLCBgaGVhZGAsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCwgYGluUmFuZ2VgLCBgaW52b2tlYCxcbiAgICAgKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCxcbiAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAgICAgKiBgaXNFcXVhbFdpdGhgLCBgaXNFcnJvcmAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzSW50ZWdlcmAsIGBpc0xlbmd0aGAsXG4gICAgICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCxcbiAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICAgICAqIGBpc1NhZmVJbnRlZ2VyYCwgYGlzU2V0YCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsXG4gICAgICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsXG4gICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICAgICAqIGBtaW5gLCBgbWluQnlgLCBgbXVsdGlwbHlgLCBgbm9Db25mbGljdGAsIGBub29wYCwgYG5vd2AsIGBudGhgLCBgcGFkYCxcbiAgICAgKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCxcbiAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICAgICAqIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRJbmRleEJ5YCwgYHNvcnRlZExhc3RJbmRleGAsXG4gICAgICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLFxuICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdGltZXNgLCBgdG9GaW5pdGVgLCBgdG9JbnRlZ2VyYCwgYHRvSlNPTmAsIGB0b0xlbmd0aGAsXG4gICAgICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLFxuICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICAgICAqIGB1cHBlckZpcnN0YCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpO1xuICAgICAqIC8vID0+IDZcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgICAgIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTG9kYXNoKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWluQWxsXSBFbmFibGUgZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLCBjaGFpbkFsbCkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2NoYWluX18gPSAhIWNoYWluQWxsO1xuICAgICAgdGhpcy5fX2luZGV4X18gPSAwO1xuICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlXG4gICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogcmVFc2NhcGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2V2YWx1YXRlJzogcmVFdmFsdWF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAqL1xuICAgICAgJ2ltcG9ydHMnOiB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgICdfJzogbG9kYXNoXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB3cmFwcGVycyBhcmUgaW5zdGFuY2VzIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBsb2Rhc2gucHJvdG90eXBlID0gYmFzZUxvZGFzaC5wcm90b3R5cGU7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGxvZGFzaDtcblxuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fZGlyX18gPSAxO1xuICAgICAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlZXNfXyA9IFtdO1xuICAgICAgdGhpcy5fX3Rha2VDb3VudF9fID0gTUFYX0FSUkFZX0xFTkdUSDtcbiAgICAgIHRoaXMuX192aWV3c19fID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBsYXp5IHdyYXBwZXIgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5Q2xvbmUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9fZGlyX18gPSB0aGlzLl9fZGlyX187XG4gICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdGhpcy5fX2ZpbHRlcmVkX187XG4gICAgICByZXN1bHQuX19pdGVyYXRlZXNfXyA9IGNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO1xuICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSB0aGlzLl9fdGFrZUNvdW50X187XG4gICAgICByZXN1bHQuX192aWV3c19fID0gY29weUFycmF5KHRoaXMuX192aWV3c19fKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBsYXp5IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5UmV2ZXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLl9fZmlsdGVyZWRfXykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyA9IC0xO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSB1bndyYXBwZWQgdmFsdWUgZnJvbSBpdHMgbGF6eSB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVZhbHVlKCkge1xuICAgICAgdmFyIGFycmF5ID0gdGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLFxuICAgICAgICAgIGRpciA9IHRoaXMuX19kaXJfXyxcbiAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoYXJyYXkpLFxuICAgICAgICAgIGlzUmlnaHQgPSBkaXIgPCAwLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGlzQXJyID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICB2aWV3ID0gZ2V0VmlldygwLCBhcnJMZW5ndGgsIHRoaXMuX192aWV3c19fKSxcbiAgICAgICAgICBzdGFydCA9IHZpZXcuc3RhcnQsXG4gICAgICAgICAgZW5kID0gdmlldy5lbmQsXG4gICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQsXG4gICAgICAgICAgaW5kZXggPSBpc1JpZ2h0ID8gZW5kIDogKHN0YXJ0IC0gMSksXG4gICAgICAgICAgaXRlcmF0ZWVzID0gdGhpcy5fX2l0ZXJhdGVlc19fLFxuICAgICAgICAgIGl0ZXJMZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICB0YWtlQ291bnQgPSBuYXRpdmVNaW4obGVuZ3RoLCB0aGlzLl9fdGFrZUNvdW50X18pO1xuXG4gICAgICBpZiAoIWlzQXJyIHx8ICghaXNSaWdodCAmJiBhcnJMZW5ndGggPT0gbGVuZ3RoICYmIHRha2VDb3VudCA9PSBsZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKGFycmF5LCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuXG4gICAgICAgIHZhciBpdGVySW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlICgrK2l0ZXJJbmRleCA8IGl0ZXJMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGl0ZXJhdGVlc1tpdGVySW5kZXhdLFxuICAgICAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgICAgIHR5cGUgPSBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhenlXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICAgICAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG4gICAgSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG4gICAgSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbiAgICBIYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuICAgIEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG4gICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICAgICAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgICAgICBkYXRhLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgLS10aGlzLnNpemU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgKyt0aGlzLnNpemU7XG4gICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAgICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgYWRkXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQGFsaWFzIHB1c2hcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICAgICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICAgICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gICAgICB9XG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcbiAgICBTdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG4gICAgU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuICAgIFN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcbiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICAgICAgKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVTaXplYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlU2l6ZShhcnJheSwgbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAgICAgKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZXMgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIG9uIGBhY2N1bXVsYXRvcmAgd2l0aCBrZXlzIHRyYW5zZm9ybWVkXG4gICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICAgICAqIHZhbHVlIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBdChvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBza2lwID0gb2JqZWN0ID09IG51bGw7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBza2lwID8gdW5kZWZpbmVkIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyIDw9IHVwcGVyID8gbnVtYmVyIDogdXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gICAgICogdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIERlZXAgY2xvbmVcbiAgICAgKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgKiAgNCAtIENsb25lIHN5bWJvbHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgICAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgICAgIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zVG9gIHdoaWNoIGFjY2VwdHMgYHByb3BzYCB0byBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHNvdXJjZVtrZXldLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICogdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ldmVyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICAgICAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgICAgIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgICAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmICghKHNlZW5cbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYXBwbHkoZnVuYywgb2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcnJheUJ1ZmZlclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gZGF0ZVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICAgICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gICAgICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgICAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICAgICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2FtZVRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICAgID8gY3VzdG9taXplcihzYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5udGhgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU50aChhcnJheSwgbikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG4gKz0gbiA8IDAgPyBsZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGlzSW5kZXgobiwgbGVuZ3RoKSA/IGFycmF5W25dIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gICAgICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2VHZXQodmFsdWUsIGl0ZXJhdGVlLmxlbmd0aCA9PT0gMSA/IGl0ZXJhdGVlWzBdIDogaXRlcmF0ZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW2lkZW50aXR5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgdmFyIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpLFxuICAgICAgICAgIHZhbElzVW5kZWZpbmVkID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IG5hdGl2ZUZsb29yKChsb3cgKyBoaWdoKSAvIDIpLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSxcbiAgICAgICAgICAgIG90aElzRGVmaW5lZCA9IGNvbXB1dGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBjb21wdXRlZCA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gY29tcHV0ZWQgPT09IGNvbXB1dGVkLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7XG5cbiAgICAgICAgaWYgKHZhbElzTmFOKSB7XG4gICAgICAgICAgdmFyIHNldExvdyA9IHJldEhpZ2hlc3QgfHwgb3RoSXNSZWZsZXhpdmU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiAocmV0SGlnaGVzdCB8fCBvdGhJc0RlZmluZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzTnVsbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNOdWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAhb3RoSXNOdWxsICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc1N5bWJvbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3RoSXNOdWxsIHx8IG90aElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldExvdykge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZU1pbihoaWdoLCBNQVhfQVJSQVlfSU5ERVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZFVuaXFgIGFuZCBgXy5zb3J0ZWRVbmlxQnlgIHdpdGhvdXRcbiAgICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWVxKGNvbXB1dGVkLCBzZWVuKSkge1xuICAgICAgICAgIHZhciBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAgICAgKiBjb252ZXJzaW9ucyBvZiBiaW5hcnksIGhleGFkZWNpbWFsLCBvciBvY3RhbCBzdHJpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAgICAgKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgICAgICBpZiAoc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51cGRhdGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHJldHVybiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdXBkYXRlcihiYXNlR2V0KG9iamVjdCwgcGF0aCkpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZHJvcFdoaWxlYCBhbmQgYF8udGFrZVdoaWxlYFxuICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRHJvcF0gU3BlY2lmeSBkcm9wcGluZyBlbGVtZW50cyBpbnN0ZWFkIG9mIHRha2luZyB0aGVtLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkgJiZcbiAgICAgICAgcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge31cblxuICAgICAgcmV0dXJuIGlzRHJvcFxuICAgICAgICA/IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IDAgOiBpbmRleCksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiBsZW5ndGgpKVxuICAgICAgICA6IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IDApLCAoZnJvbVJpZ2h0ID8gbGVuZ3RoIDogaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2ZcbiAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2hcbiAgICAgKiBzdWNjZXNzaXZlIGFjdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykge1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsIGZ1bmN0aW9uKHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpO1xuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ueG9yYCwgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWG9yKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VVbmlxKGFycmF5c1swXSkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpbmRleF0sXG4gICAgICAgICAgICBvdGhJbmRleCA9IC0xO1xuXG4gICAgICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKG90aEluZGV4ICE9IGluZGV4KSB7XG4gICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gYmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XSB8fCBhcnJheSwgYXJyYXlzW290aEluZGV4XSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uemlwT2JqZWN0YCB3aGljaCBhc3NpZ25zIHZhbHVlcyB1c2luZyBgYXNzaWduRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2lnbkZ1bmMocmVzdWx0LCBwcm9wc1tpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgYGJhc2VSZXN0YCBhbGlhcyB3aGljaCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBgaWRlbnRpdHlgIGJ5IG1vZHVsZVxuICAgICAqIHJlcGxhY2VtZW50IHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHZhciBjYXN0UmVzdCA9IGJhc2VSZXN0O1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gICAgICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgY2xlYXJUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vY2xlYXJUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ8T2JqZWN0fSBpZCBUaGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3Qgb2YgdGhlIHRpbWVyIHRvIGNsZWFyLlxuICAgICAqL1xuICAgIHZhciBjbGVhclRpbWVvdXQgPSBjdHhDbGVhclRpbWVvdXQgfHwgZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiByb290LmNsZWFyVGltZW91dChpZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICBidWZmZXIuY29weShyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gICAgICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHN5bWJvbCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZiA/IE9iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSkgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpO1xuXG4gICAgICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICAgICAodmFsSXNTeW1ib2wgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlICYmICFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICF2YWxJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wgJiYgIW90aElzU3ltYm9sICYmIHZhbHVlIDwgb3RoZXIpIHx8XG4gICAgICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIW90aElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gICAgICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gICAgICpcbiAgICAgKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICAgICAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAgICAgKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgICAgIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gICAgICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZWZ0TGVuZ3RoICsgcmFuZ2VMZW5ndGgpLFxuICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICAgICAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IHJhbmdlTGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IGFyZ3NJbmRleDtcbiAgICAgIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgaG9sZGVyc1tob2xkZXJzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICAgICAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgICAgIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5ncm91cEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbml0aWFsaXplcl0gVGhlIGFjY3VtdWxhdG9yIG9iamVjdCBpbml0aWFsaXplci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLCBpbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5QWdncmVnYXRvciA6IGJhc2VBZ2dyZWdhdG9yLFxuICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBpbml0aWFsaXplciA/IGluaXRpYWxpemVyKCkgOiB7fTtcblxuICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBzZXR0ZXIsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYWNjdW11bGF0b3IpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5sb3dlckZpcnN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBTdHJpbmdgIGNhc2UgbWV0aG9kIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHZhciBjaHIgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICAgICAgOiBzdHJpbmcuY2hhckF0KDApO1xuXG4gICAgICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHNcbiAgICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgICAgIDogc3RyaW5nLnNsaWNlKDEpO1xuXG4gICAgICAgIHJldHVybiBjaHJbbWV0aG9kTmFtZV0oKSArIHRyYWlsaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5jYW1lbENhc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBlYWNoIHdvcmQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhcnJheVJlZHVjZSh3b3JkcyhkZWJ1cnIoc3RyaW5nKS5yZXBsYWNlKHJlQXBvcywgJycpKSwgY2FsbGJhY2ssICcnKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbiAgICAgICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcbiAgICAgICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxcbiAgICAgICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXJpdHkgVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KSB7XG4gICAgICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpO1xuXG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuXG4gICAgICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZsb3dgIG9yIGBfLmZsb3dSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsb3cgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmxvdyhmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmbGF0UmVzdChmdW5jdGlvbihmdW5jcykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gZnVuY3MubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwcmVyZXEgPSBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O1xuXG4gICAgICAgIGlmIChmcm9tUmlnaHQpIHtcbiAgICAgICAgICBmdW5jcy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2luZGV4XTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlcmVxICYmICF3cmFwcGVyICYmIGdldEZ1bmNOYW1lKGZ1bmMpID09ICd3cmFwcGVyJykge1xuICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgTG9kYXNoV3JhcHBlcihbXSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gd3JhcHBlciA/IGluZGV4IDogbGVuZ3RoO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGZ1bmMgPSBmdW5jc1tpbmRleF07XG5cbiAgICAgICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICAgICAgZGF0YSA9IGZ1bmNOYW1lID09ICd3cmFwcGVyJyA/IGdldERhdGEoZnVuYykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoZGF0YSAmJiBpc0xhemlhYmxlKGRhdGFbMF0pICYmXG4gICAgICAgICAgICAgICAgZGF0YVsxXSA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSAmJlxuICAgICAgICAgICAgICAgICFkYXRhWzRdLmxlbmd0aCAmJiBkYXRhWzldID09IDFcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gd3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlciwgZGF0YVszXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyYXBwZXIgPSAoZnVuYy5sZW5ndGggPT0gMSAmJiBpc0xhemlhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICA/IHdyYXBwZXJbZnVuY05hbWVdKClcbiAgICAgICAgICAgICAgOiB3cmFwcGVyLnRocnUoZnVuYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzWzBdO1xuXG4gICAgICAgICAgaWYgKHdyYXBwZXIgJiYgYXJncy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGxlbmd0aCA/IGZ1bmNzW2luZGV4XS5hcHBseSh0aGlzLCBhcmdzKSA6IHZhbHVlO1xuXG4gICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNzW2luZGV4XS5jYWxsKHRoaXMsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkXG4gICAgICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBXUkFQX0FSWV9GTEFHLFxuICAgICAgICAgIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLFxuICAgICAgICAgIGlzQ3VycmllZCA9IGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgICAgICBpc0ZsaXAgPSBiaXRtYXNrICYgV1JBUF9GTElQX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgICAgICBob2xkZXJzQ291bnQgPSBjb3VudEhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgICAgICBpZiAoaXNDdXJyaWVkICYmIGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHRoaXNBcmcsXG4gICAgICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICAgICAgbGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgICAgIGlmIChhcmdQb3MpIHtcbiAgICAgICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRmxpcCAmJiBsZW5ndGggPiAxKSB7XG4gICAgICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJ5ICYmIGFyeSA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpIHtcbiAgICAgICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmludmVydEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRvSXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgaXRlcmF0ZWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludmVydGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmVydGVyKHNldHRlciwgdG9JdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgdG9JdGVyYXRlZShpdGVyYXRlZSksIHt9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSB1c2VkIGZvciBgdW5kZWZpbmVkYCBhcmd1bWVudHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3RoZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9TdHJpbmcob3RoZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICBvdGhlciA9IGJhc2VUb051bWJlcihvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ub3ZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFycmF5RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBvdmVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcbiAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgICB2YXIgdGhpc0FyZyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgIGJhc2VkIG9uIGBsZW5ndGhgLiBUaGUgYGNoYXJzYCBzdHJpbmdcbiAgICAgKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIGNoYXJzID0gY2hhcnMgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGJhc2VUb1N0cmluZyhjaGFycyk7XG5cbiAgICAgIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDtcbiAgICAgIGlmIChjaGFyc0xlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJzTGVuZ3RoID8gYmFzZVJlcGVhdChjaGFycywgbGVuZ3RoKSA6IGNoYXJzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VSZXBlYXQoY2hhcnMsIG5hdGl2ZUNlaWwobGVuZ3RoIC8gc3RyaW5nU2l6ZShjaGFycykpKTtcbiAgICAgIHJldHVybiBoYXNVbmljb2RlKGNoYXJzKVxuICAgICAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJylcbiAgICAgICAgOiByZXN1bHQuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nXG4gICAgICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZWZ0TGVuZ3RoICsgYXJnc0xlbmd0aCksXG4gICAgICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZm4sIGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAoc3RhcnQgPCBlbmQgPyAxIDogLTEpIDogdG9GaW5pdGUoc3RlcCk7XG4gICAgICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSByZWxhdGlvbmFsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlbGF0aW9uYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24ob3BlcmF0b3IpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmIHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICBvdGhlciA9IHRvTnVtYmVyKG90aGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuXG4gICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBXUkFQX0NVUlJZX0ZMQUcsXG4gICAgICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBob2xkZXJzLFxuICAgICAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogcGFydGlhbHM7XG5cbiAgICAgIGJpdG1hc2sgfD0gKGlzQ3VycnkgPyBXUkFQX1BBUlRJQUxfRkxBRyA6IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgOiBXUkFQX1BBUlRJQUxfRkxBRyk7XG5cbiAgICAgIGlmICghKGJpdG1hc2sgJiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgbmV3UGFydGlhbHMsIG5ld0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsXG4gICAgICAgIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gd3JhcEZ1bmMuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIGlmIChpc0xhemlhYmxlKGZ1bmMpKSB7XG4gICAgICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLnJvdW5kYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBNYXRoW21ldGhvZE5hbWVdO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PSBudWxsID8gMCA6IG5hdGl2ZU1pbih0b0ludGVnZXIocHJlY2lzaW9uKSwgMjkyKTtcbiAgICAgICAgaWYgKHByZWNpc2lvbiAmJiBuYXRpdmVJc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuXG4gICAgICAgICAgLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksXG4gICAgICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7XG5cbiAgICAgICAgICBwYWlyID0gKHRvU3RyaW5nKHZhbHVlKSArICdlJykuc3BsaXQoJ2UnKTtcbiAgICAgICAgICByZXR1cm4gKyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdIC0gcHJlY2lzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMobnVtYmVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gICAgICovXG4gICAgdmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy50b1BhaXJzYCBvciBgXy50b1BhaXJzSW5gIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpO1xuICAgICAgICBpZiAodGFnID09IG1hcFRhZykge1xuICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVG9QYWlycyhvYmplY3QsIGtleXNGdW5jKG9iamVjdCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogICAgMSAtIGBfLmJpbmRgXG4gICAgICogICAgMiAtIGBfLmJpbmRLZXlgXG4gICAgICogICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gICAgICogICAgOCAtIGBfLmN1cnJ5YFxuICAgICAqICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICAgICAqICAgMzIgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gICAgICogIDEyOCAtIGBfLnJlYXJnYFxuICAgICAqICAyNTYgLSBgXy5hcnlgXG4gICAgICogIDUxMiAtIGBfLmZsaXBgXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJ5ID0gYXJ5ID09PSB1bmRlZmluZWQgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApO1xuICAgICAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkID8gYXJpdHkgOiB0b0ludGVnZXIoYXJpdHkpO1xuICAgICAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgICAgIGhvbGRlcnNSaWdodCA9IGhvbGRlcnM7XG5cbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBnZXREYXRhKGZ1bmMpO1xuXG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICAgICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gICAgICB9XG4gICAgICBmdW5jID0gbmV3RGF0YVswXTtcbiAgICAgIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICAgICAgdGhpc0FyZyA9IG5ld0RhdGFbMl07XG4gICAgICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gICAgICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgICAgIGFyaXR5ID0gbmV3RGF0YVs5XSA9IG5ld0RhdGFbOV0gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gICAgICBpZiAoIWFyaXR5ICYmIGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtcbiAgICAgIH1cbiAgICAgIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICAgICAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7XG4gICAgICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZXR0ZXIgPSBkYXRhID8gYmFzZVNldERhdGEgOiBzZXREYXRhO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKSwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c2AgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25JbmAgdXNlIHRvIGFzc2lnbiBwcm9wZXJ0aWVzXG4gICAgICogb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXNcbiAgICAgKiB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzRGVlcGAgdG8gY3VzdG9taXplIGl0cyBgXy5tZXJnZWAgdXNlIHRvIG1lcmdlIHNvdXJjZVxuICAgICAqIG9iamVjdHMgaW50byBkZXN0aW5hdGlvbiBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0aHJ1LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgcGFyZW50IG9iamVjdCBvZiBgc3JjVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykge1xuICAgICAgaWYgKGlzT2JqZWN0KG9ialZhbHVlKSAmJiBpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgb2JqVmFsdWUpO1xuICAgICAgICBiYXNlTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCB1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9taXRgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uY2xvbmVEZWVwYCB1c2UgdG8gb25seSBjbG9uZSBwbGFpblxuICAgICAqIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bmNsb25lZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCB0byBkZWZlciBjbG9uaW5nIHRvIGBfLmNsb25lRGVlcGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gICAgICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gICAgICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gICAgICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gICAgICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICAgICAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgICAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgICAgIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgICAgICBpZiAob3RoZXJGdW5jID09IG51bGwgfHwgb3RoZXJGdW5jID09IGZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsICdwbGFjZWhvbGRlcicpID8gbG9kYXNoIDogZnVuYztcbiAgICAgIHJldHVybiBvYmplY3QucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBiYXNlSXRlcmF0ZWVgLlxuICAgICAqIElmIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjaG9zZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiB0aGUgY3JlYXRlZCBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdGVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5pdGVyYXRlZSB8fCBpdGVyYXRlZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gaXRlcmF0ZWUgPyBiYXNlSXRlcmF0ZWUgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJlc3VsdChhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgICAgICA6IGRhdGEubWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB3aGlsZSAob2JqZWN0KSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuICAgIGlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAgICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgICAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAgICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgICAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gICAgICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLCB3cmFwcGVyLl9fY2hhaW5fXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICAgICAgcmVzdWx0Ll9fdmFsdWVzX18gPSB3cmFwcGVyLl9fdmFsdWVzX187XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmdcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoIC8gc2l6ZSkpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYmFzZVNsaWNlKGFycmF5LCBpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICogYW5kL29yIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIG90aGVyID0gXy5jb25jYXQoYXJyYXksIDIsIFszXSwgW1s0XV0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCAtIDEpLFxuICAgICAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KSA/IGNvcHlBcnJheShhcnJheSkgOiBbYXJyYXldLCBiYXNlRmxhdHRlbihhcmdzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbEJ5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmRcbiAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMFxuICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKVxuICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCBJTkZJTklUWSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dO1xuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8udG9QYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkXG4gICAgICogZnJvbSBrZXktdmFsdWUgYHBhaXJzYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5oZWFkKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZWFkKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWBcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDAsIC0xKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBhbGwgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMl1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgaWYgKGl0ZXJhdGVlID09PSBsYXN0KG1hcHBlZCkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzXG4gICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFsbCBlbGVtZW50cyBpbiBgYXJyYXlgIGludG8gYSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5qb2luKFsnYScsICdiJywgJ2MnXSwgJ34nKTtcbiAgICAgKiAvLyA9PiAnYX5ifmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gam9pbihhcnJheSwgc2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/ICcnIDogbmF0aXZlSm9pbi5jYWxsKGFycmF5LCBzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgYXJyYXlgIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCkgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgICA/IHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpXG4gICAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAtMik7XG4gICAgICogLy8gPT4gJ2MnO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBnaXZlbiB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICogdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgcHJlZGljYXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGwoYXJyYXksICdhJywgJ2MnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIHZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogNSwgJ3knOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksIHZhbHVlcywgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdjJ11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHB1bGxlZCk7XG4gICAgICogLy8gPT4gWydiJywgJ2QnXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSBmbGF0UmVzdChmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG5cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGFycmF5TWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gICAgICB9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5maWx0ZXJgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5wdWxsYFxuICAgICAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICogW2BBcnJheSNzbGljZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3NsaWNlKSB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgJiYgdHlwZW9mIGVuZCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggJiYgZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmxhc3RJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIGlmIChlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjEsIDIuM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMSwgbGVuZ3RoKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZVxuICAgICAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAqIGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbkJ5KFsyLjFdLCBbMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb21cbiAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgKiBpbiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICAgKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgKiBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqXG4gICAgICogXy51bnppcCh6aXBwZWQpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCwgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTtcbiAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZVxuICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqL1xuICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZFxuICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yLCAzLjRdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnhvckJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB4b3JCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0RGVlcChbJ2EuYlswXS5jJywgJ2EuYlsxXS5kJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gYSArIGIgKyBjO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxMTEsIDIyMl1cbiAgICAgKi9cbiAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpdGVyYXRlZSA9IHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gKGFycmF5cy5wb3AoKSwgaXRlcmF0ZWUpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLiBUaGUgcmVzdWx0IG9mIHN1Y2ggc2VxdWVuY2VzIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gX1xuICAgICAqICAgLmNoYWluKHVzZXJzKVxuICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAqICAgICByZXR1cm4gby51c2VyICsgJyBpcyAnICsgby5hZ2U7XG4gICAgICogICB9KVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICAgICAqICAgIC8vIE11dGF0ZSBpbnB1dCBhcnJheS5cbiAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnJldmVyc2UoKVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXygnICBhYmMgICcpXG4gICAgICogIC5jaGFpbigpXG4gICAgICogIC50cmltKClcbiAgICAgKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICAgICAqXG4gICAgICogQG5hbWUgYXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDEgfHwgdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGggfHxcbiAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICAgICAgdmFsdWUuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGlmIChsZW5ndGggJiYgIWFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGFycmF5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgY2hhaW5cbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpLmhlYWQoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycylcbiAgICAgKiAgIC5jaGFpbigpXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAucGljaygndXNlcicpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHtcbiAgICAgIHJldHVybiBjaGFpbih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oYXJyYXkpLnB1c2goMyk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLmxhc3QoKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksIHRoaXMuX19jaGFpbl9fKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZVxuICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciBkb25lID0gdGhpcy5fX2luZGV4X18gPj0gdGhpcy5fX3ZhbHVlc19fLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAqXG4gICAgICogQG5hbWUgU3ltYm9sLml0ZXJhdG9yXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZFtTeW1ib2wuaXRlcmF0b3JdKCkgPT09IHdyYXBwZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogQXJyYXkuZnJvbSh3cmFwcGVkKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSkubWFwKHNxdWFyZSk7XG4gICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAqXG4gICAgICogb3RoZXIudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwO1xuICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSBjbG9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXMgPSBjbG9uZTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIHRoZSB3cmFwcGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXztcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgICAnYXJncyc6IFtyZXZlcnNlXSxcbiAgICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sIHRoaXMuX19hY3Rpb25zX18pO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgKytyZXN1bHRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAqIGVsZW1lbnRzIG9mIGVtcHR5IGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8ucmVqZWN0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gQ29tYmluaW5nIHNldmVyYWwgcHJlZGljYXRlcyB1c2luZyBgXy5vdmVyRXZlcnlgIG9yIGBfLm92ZXJTb21lYC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9Y29sbGVjdGlvbi5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgdmFyIGZpbmRMYXN0ID0gY3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlZXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgSU5GSU5JVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlcHRoKFsxLCAyXSwgZHVwbGljYXRlLCAyKTtcbiAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBkZXB0aCkge1xuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZVxuICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICAgIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXNGdW5jID8gYXBwbHkocGF0aCwgdmFsdWUsIGFyZ3MpIDogYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICAgICAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlc1xuICAgICAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICAgICAgfVxuICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleSBmb3IuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKi9cbiAgICB2YXIgcGFydGl0aW9uID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXkgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICogYW5kIGBzb3J0QnlgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICogfSwgMCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2VSaWdodCA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqIHRoYXQgYHByZWRpY2F0ZWAgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5maWx0ZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZSA6IGJhc2VTYW1wbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlXG4gICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgKiAvLyA9PiBbMiwgMywgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZVNpemUgOiBiYXNlU2FtcGxlU2l6ZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTaHVmZmxlIDogYmFzZVNodWZmbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAqIC8vID0+IDdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U29tZSA6IGJhc2VTb21lO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAgICAgKi9cbiAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gICAgICogfSwgXy5ub3coKSk7XG4gICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgbm93ID0gY3R4Tm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmJlZm9yZWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA8IDEpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHVwIHRvIGBuYCBhcmd1bWVudHMsXG4gICAgICogaWdub3JpbmcgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLmFyeShwYXJzZUludCwgMSkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnkoZnVuYywgbiwgZ3VhcmQpIHtcbiAgICAgIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAgICAgKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA8PSAxKSB7XG4gICAgICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIHdpdGggYHBhcnRpYWxzYFxuICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2VcbiAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gICAgICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnlSaWdodChhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgzKSgyKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMiwgMykoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAqIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICAgICAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICAgICAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxhc3RBcmdzLFxuICAgICAgICAgIGxhc3RUaGlzLFxuICAgICAgICAgIG1heFdhaXQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHRpbWVySWQsXG4gICAgICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgICAgICByZXR1cm4gbWF4aW5nXG4gICAgICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgICAgIDogdGltZVdhaXRpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICAgICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgICAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAgICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgICAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gICAgICByZXR1cm4gZGVib3VuY2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBpbnZva2luZyB0aGUgYGZ1bmNgIHVudGlsIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuIEFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAnZGVmZXJyZWQnKTtcbiAgICAgKiAvLyA9PiBMb2dzICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG1pbGxpc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWZlciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgMSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWxheShmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgKiAvLyA9PiBMb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVsYXkgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIHRvTnVtYmVyKHdhaXQpIHx8IDAsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxpcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZsaXBwZWQgPSBfLmZsaXAoZnVuY3Rpb24oKSB7XG4gICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gWydkJywgJ2MnLCAnYicsICdhJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGlwKGZ1bmMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfRkxJUF9GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICAgICAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAgICAgKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICAgICAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICAgICAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gICAgICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAgICAgKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICAgICAqXG4gICAgICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB2YWx1ZXMob3RoZXIpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqXG4gICAgICogb2JqZWN0LmEgPSAyO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gICAgICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKlxuICAgICAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gICAgICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgICAgIHJldHVybiBtZW1vaXplZDtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgYE1hcENhY2hlYC5cbiAgICBtZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBuZWdhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBgZnVuY2AuIFRoZVxuICAgICAqIGBmdW5jYCBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIHByZWRpY2F0ZSB0byBuZWdhdGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbmVnYXRlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNFdmVuKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gICAgICogLy8gPT4gWzEsIDMsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyByZXN0cmljdGVkIHRvIGludm9raW5nIGBmdW5jYCBvbmNlLiBSZXBlYXQgY2FsbHNcbiAgICAgKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIC8vID0+IGBjcmVhdGVBcHBsaWNhdGlvbmAgaXMgaW52b2tlZCBvbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmVmb3JlKDIsIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50cyB0cmFuc2Zvcm1lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGFyZ3VtZW50IHRyYW5zZm9ybXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGRvdWJsZWQobikge1xuICAgICAqICAgcmV0dXJuIG4gKiAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJBcmdzKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiBbeCwgeV07XG4gICAgICogfSwgW3NxdWFyZSwgZG91YmxlZF0pO1xuICAgICAqXG4gICAgICogZnVuYyg5LCAzKTtcbiAgICAgKiAvLyA9PiBbODEsIDZdXG4gICAgICpcbiAgICAgKiBmdW5jKDEwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTAwLCAxMF1cbiAgICAgKi9cbiAgICB2YXIgb3ZlckFyZ3MgPSBjYXN0UmVzdChmdW5jdGlvbihmdW5jLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB0cmFuc2Zvcm1zID0gKHRyYW5zZm9ybXMubGVuZ3RoID09IDEgJiYgaXNBcnJheSh0cmFuc2Zvcm1zWzBdKSlcbiAgICAgICAgPyBhcnJheU1hcCh0cmFuc2Zvcm1zWzBdLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpXG4gICAgICAgIDogYXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywgMSksIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciBmdW5jc0xlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oYXJncy5sZW5ndGgsIGZ1bmNzTGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gdHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLCBhcmdzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZVxuICAgICAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4gVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5iaW5kYCBleGNlcHQgaXQgZG9lcyAqKm5vdCoqXG4gICAgICogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWwoZ3JlZXQsICdoZWxsbycpO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWwoZ3JlZXQsIF8sICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsKSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50c1xuICAgICAqIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsUmlnaHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgYXJyYW5nZWQgYWNjb3JkaW5nXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBgaW5kZXhlc2Agd2hlcmUgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBmaXJzdCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBzZWNvbmQgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZWFycmFuZ2UgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcmd1bWVudCBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcmVhcmdlZCA9IF8ucmVhcmcoZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9LCBbMiwgMCwgMV0pO1xuICAgICAqXG4gICAgICogcmVhcmdlZCgnYicsICdjJywgJ2EnKVxuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIHZhciByZWFyZyA9IGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsIGluZGV4ZXMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUkVBUkdfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5kZXhlcyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXNcbiAgICAgKiBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vbWRuLmlvL3Jlc3RfcGFyYW1ldGVycykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8ucmVzdChmdW5jdGlvbih3aGF0LCBuYW1lcykge1xuICAgICAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgK1xuICAgICAqICAgICAoXy5zaXplKG5hbWVzKSA+IDEgPyAnLCAmICcgOiAnJykgKyBfLmxhc3QobmFtZXMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KCdoZWxsbycsICdmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jLCBzdGFydCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlIGZ1bmN0aW9uIGFuZCBhbiBhcnJheSBvZiBhcmd1bWVudHMgbXVjaCBsaWtlXG4gICAgICogW2BGdW5jdGlvbiNhcHBseWBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtzcHJlYWQgb3BlcmF0b3JdKGh0dHBzOi8vbWRuLmlvL3NwcmVhZF9vcGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBzcHJlYWQgYXJndW1lbnRzIG92ZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNwcmVhZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8uc3ByZWFkKGZ1bmN0aW9uKHdobywgd2hhdCkge1xuICAgICAqICAgcmV0dXJuIHdobyArICcgc2F5cyAnICsgd2hhdDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheShbJ2ZyZWQnLCAnaGVsbG8nXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQgc2F5cyBoZWxsbydcbiAgICAgKlxuICAgICAqIHZhciBudW1iZXJzID0gUHJvbWlzZS5hbGwoW1xuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDQwKSxcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSgzNilcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIG51bWJlcnMudGhlbihfLnNwcmVhZChmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4geCArIHk7XG4gICAgICogfSkpO1xuICAgICAqIC8vID0+IGEgUHJvbWlzZSBvZiA3NlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwcmVhZChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IG5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLCAwKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFyZ3Nbc3RhcnRdLFxuICAgICAgICAgICAgb3RoZXJBcmdzID0gY2FzdFNsaWNlKGFyZ3MsIDAsIHN0YXJ0KTtcblxuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBhcnJheVB1c2gob3RoZXJBcmdzLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gICAgICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAgICAgKiBtZXRob2QgdG8gY2FuY2VsIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvXG4gICAgICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gICAgICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICAgICAqIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZCB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGVcbiAgICAgKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gICAgICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy50aHJvdHRsZWAgYW5kIGBfLmRlYm91bmNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHRocm90dGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gICAgICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB0aHJvdHRsZWQpO1xuICAgICAqXG4gICAgICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCB0aHJvdHRsZWQuY2FuY2VsKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVhZGluZyA9IHRydWUsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICdsZWFkaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIHtcbiAgICAgICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgICAgICd0cmFpbGluZyc6IHRyYWlsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG9uZSBhcmd1bWVudCwgaWdub3JpbmcgYW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8udW5hcnkocGFyc2VJbnQpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5hcnkoZnVuYykge1xuICAgICAgcmV0dXJuIGFyeShmdW5jLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIGB3cmFwcGVyYCBhcyBpdHMgZmlyc3RcbiAgICAgKiBhcmd1bWVudC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWRcbiAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYHdyYXBwZXJgLiBUaGUgd3JhcHBlciBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFt3cmFwcGVyPWlkZW50aXR5XSBUaGUgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHAgPSBfLndyYXAoXy5lc2NhcGUsIGZ1bmN0aW9uKGZ1bmMsIHRleHQpIHtcbiAgICAgKiAgIHJldHVybiAnPHA+JyArIGZ1bmModGV4dCkgKyAnPC9wPic7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBwKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICc8cD5mcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXM8L3A+J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgYXMgYW4gYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoMSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbbnVsbF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKiBjb25zb2xlLmxvZyhfLmNhc3RBcnJheShhcnJheSkgPT09IGFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEFycmF5KCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gICAgICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAgICAgKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gICAgICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkXG4gICAgICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAgICAgKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gICAgICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAgICAgKiBjbG9uaW5nIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHVwIHRvIGZvdXIgYXJndW1lbnRzOyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lV2l0aGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVEZWVwV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXBXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgb2JqZWN0YCBjb25mb3JtcyB0byBgc291cmNlYCBieSBpbnZva2luZyB0aGUgcHJlZGljYXRlXG4gICAgICogcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMjsgfSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2UgPT0gbnVsbCB8fCBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKE5hTiwgTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5ndCgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUd0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheUJ1ZmZlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheUJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IG5vZGVJc0FycmF5QnVmZmVyID8gYmFzZVVuYXJ5KG5vZGVJc0FycmF5QnVmZmVyKSA6IGJhc2VJc0FycmF5QnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICAgICAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAgICAgKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gICAgICogaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUobmV3IERhdGUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKCdNb24gQXByaWwgMjMgMjAxMicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzRGF0ZSA9IG5vZGVJc0RhdGUgPyBiYXNlVW5hcnkobm9kZUlzRGF0ZSkgOiBiYXNlSXNEYXRlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoJzxib2R5PicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAgICAgKlxuICAgICAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICAgICAqIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAgICAgKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gICAgICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkodHJ1ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICAgICAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgICAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICAgICAqIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gICAgICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLFxuICAgICAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkXG4gICAgICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gICAgICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogb2JqZWN0ID09PSBvdGhlcjtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzRXF1YWxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0b1xuICAgICAqIHNpeCBhcmd1bWVudHM6IChvYmpWYWx1ZSwgb3RoVmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIG90aGVyLCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcob3RoVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddO1xuICAgICAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsV2l0aChhcnJheSwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcih2YWx1ZSwgb3RoZXIpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCB1bmRlZmluZWQsIGN1c3RvbWl6ZXIpIDogISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgYEV2YWxFcnJvcmAsIGBSYW5nZUVycm9yYCwgYFJlZmVyZW5jZUVycm9yYCxcbiAgICAgKiBgU3ludGF4RXJyb3JgLCBgVHlwZUVycm9yYCwgb3IgYFVSSUVycm9yYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IobmV3IEVycm9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IoRXJyb3IpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZXJyb3JUYWcgfHwgdGFnID09IGRvbUV4Y1RhZyB8fFxuICAgICAgICAodHlwZW9mIHZhbHVlLm1lc3NhZ2UgPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLm5hbWUgPT0gJ3N0cmluZycgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBwcmltaXRpdmUgbnVtYmVyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNGaW5pdGVgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNGaW5pdGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiBuYXRpdmVJc0Zpbml0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbihfKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gICAgICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gICAgICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICAgICAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gICAgICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBgb2JqZWN0YCBhbmQgYHNvdXJjZWAgdG9cbiAgICAgKiBkZXRlcm1pbmUgaWYgYG9iamVjdGAgY29udGFpbnMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5tYXRjaGVzYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaChvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc01hdGNoYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggZml2ZVxuICAgICAqIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwgaW5kZXh8a2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcoc3JjVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAgICAgKiB2YXIgc291cmNlID0geyAnZ3JlZXRpbmcnOiAnaGknIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNOYU5gXShodHRwczovL21kbi5pby9OdW1iZXIvaXNOYU4pIGFuZCBpcyBub3QgdGhlIHNhbWUgYXNcbiAgICAgKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgbm9uLW51bWJlciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGB0b1N0cmluZ1RhZ2AgY2hlY2sgZmlyc3QgdG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZVxuICAgICAgLy8gQWN0aXZlWCBvYmplY3RzIGluIElFLlxuICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcmlzdGluZSBuYXRpdmUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgY2FuJ3QgcmVsaWFibHkgZGV0ZWN0IG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIHByZXNlbmNlXG4gICAgICogb2YgdGhlIGNvcmUtanMgcGFja2FnZSBiZWNhdXNlIGNvcmUtanMgY2lyY3VtdmVudHMgdGhpcyBraW5kIG9mIGRldGVjdGlvbi5cbiAgICAgKiBEZXNwaXRlIG11bHRpcGxlIHJlcXVlc3RzLCB0aGUgY29yZS1qcyBtYWludGFpbmVyIGhhcyBtYWRlIGl0IGNsZWFyOiBhbnlcbiAgICAgKiBhdHRlbXB0IHRvIGZpeCB0aGUgZGV0ZWN0aW9uIHdpbGwgYmUgb2JzdHJ1Y3RlZC4gQXMgYSByZXN1bHQsIHdlJ3JlIGxlZnRcbiAgICAgKiB3aXRoIGxpdHRsZSBjaG9pY2UgYnV0IHRvIHRocm93IGFuIGVycm9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gYWZmZWN0c1xuICAgICAqIHBhY2thZ2VzLCBsaWtlIFtiYWJlbC1wb2x5ZmlsbF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcG9seWZpbGwpLFxuICAgICAqIHdoaWNoIHJlbHkgb24gY29yZS1qcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShfKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoaXNNYXNrYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbCh2b2lkIDApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBudWxsaXNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmlsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZVxuICAgICAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gICAgICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuOC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICAgICAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBSZWdFeHBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgvYWJjLyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgnL2FiYy8nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1JlZ0V4cCA9IG5vZGVJc1JlZ0V4cCA/IGJhc2VVbmFyeShub2RlSXNSZWdFeHApIDogYmFzZUlzUmVnRXhwO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIuIEFuIGludGVnZXIgaXMgc2FmZSBpZiBpdCdzIGFuIElFRUUtNzU0XG4gICAgICogZG91YmxlIHByZWNpc2lvbiBudW1iZXIgd2hpY2ggaXNuJ3QgdGhlIHJlc3VsdCBvZiBhIHJvdW5kZWQgdW5zYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc1NhZmVJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzU2FmZUludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IC1NQVhfU0FGRV9JTlRFR0VSICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gd2Vha01hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHdlYWtTZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0KDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHQgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDw9IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0FycmF5KHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KDEpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHN0cmluZ1RvQXJyYXkodmFsdWUpIDogY29weUFycmF5KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeW1JdGVyYXRvciAmJiB2YWx1ZVtzeW1JdGVyYXRvcl0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVG9BcnJheSh2YWx1ZVtzeW1JdGVyYXRvcl0oKSk7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICBmdW5jID0gdGFnID09IG1hcFRhZyA/IG1hcFRvQXJyYXkgOiAodGFnID09IHNldFRhZyA/IHNldFRvQXJyYXkgOiB2YWx1ZXMpO1xuXG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMi4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICAgICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBsZW5ndGggb2YgYW5cbiAgICAgKiBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDQyOTQ5NjcyOTVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIDAsIE1BWF9BUlJBWV9MRU5HVEgpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b051bWJlcigzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IEluZmluaXR5XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOQU47XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgICAgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAgICAgKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICAgICAqIHJlcHJlc2VudGVkIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIC1NQVhfU0FGRV9JTlRFR0VSLCBNQVhfU0FGRV9JTlRFR0VSKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAgICAgKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKG51bGwpO1xuICAgICAqIC8vID0+ICcnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKC0wKTtcbiAgICAgKiAvLyA9PiAnLTAnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gJzEsMiwzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgIGFuZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBpZiAoaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25JbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRXaXRoXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25JbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXy5hdChvYmplY3QsIFsnYVswXS5iLmMnLCAnYVsxXSddKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgYXQgPSBmbGF0UmVzdChiYXNlQXQpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgcHJvdG90eXBlYCBvYmplY3QuIElmIGFcbiAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0IGlzIGdpdmVuLCBpdHMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXNcbiAgICAgKiBhcmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICAgICAqICAgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTtcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcyA9PSBudWxsID8gcmVzdWx0IDogYmFzZUFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAgICAgKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgICAgICB2YXIgcHJvcHNJbmRleCA9IC0xO1xuICAgICAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW3Byb3BzSW5kZXhdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kZWZhdWx0c2AgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgYXNzaWduc1xuICAgICAqIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0c0RlZXAoeyAnYSc6IHsgJ2InOiAyIH0gfSwgeyAnYSc6IHsgJ2InOiAxLCAnYyc6IDMgfSB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IDIsICdjJzogMyB9IH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHNEZWVwID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgYXJncy5wdXNoKHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSk7XG4gICAgICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiByZXR1cm5zICdwZWJibGVzJyBhc3N1bWluZyBgXy5maW5kS2V5YCByZXR1cm5zICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW5cbiAgICAgKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3Iob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW5SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2MnLCAnYicsIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvckluYCBsb2dzICdhJywgJ2InLCB0aGVuICdjJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3JSaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmRcbiAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd24ob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdiJyB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIHRoZW4gJ2InLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93blJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgICAqIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc0luXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGFuZCBpbmhlcml0ZWRcbiAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gICAgICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gICAgICogcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnQob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9XG4gICAgICovXG4gICAgdmFyIGludmVydCA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRbdmFsdWVdID0ga2V5O1xuICAgIH0sIGNvbnN0YW50KGlkZW50aXR5KSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludmVydGAgZXhjZXB0IHRoYXQgdGhlIGludmVydGVkIG9iamVjdCBpcyBnZW5lcmF0ZWRcbiAgICAgKiBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogY29ycmVzcG9uZGluZyBpbnZlcnRlZCB2YWx1ZSBvZiBlYWNoIGludmVydGVkIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzXG4gICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGludmVydGVkIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAnZ3JvdXAnICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnZ3JvdXAxJzogWydhJywgJ2MnXSwgJ2dyb3VwMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0QnkgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gW2tleV07XG4gICAgICB9XG4gICAgfSwgZ2V0SXRlcmF0ZWUpO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IFsxLCAyLCAzLCA0XSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmludm9rZShvYmplY3QsICdhWzBdLmIuYy5zbGljZScsIDEsIDMpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIHZhciBpbnZva2UgPSBiYXNlUmVzdChiYXNlSW52b2tlKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAgICAgKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5cyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLmtleXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1hcFZhbHVlc2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAgICogc2FtZSB2YWx1ZXMgYXMgYG9iamVjdGAgYW5kIGtleXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZVxuICAgICAqIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcFZhbHVlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcEtleXMoeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICByZXR1cm4ga2V5ICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYTEnOiAxLCAnYjInOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBLZXlzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAgICAgKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBLZXlzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICAgICAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICAgICAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gICAgICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gICAgICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIG90aGVyID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVyZ2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlXG4gICAgICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGVcbiAgICAgKiBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggc2l4IGFyZ3VtZW50czpcbiAgICAgKiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogWzFdLCAnYic6IFsyXSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiBbM10sICdiJzogWzRdIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlV2l0aChvYmplY3QsIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogWzEsIDNdLCAnYic6IFsyLCA0XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgcGF0aHMgb2YgYG9iamVjdGAgdGhhdCBhcmUgbm90IG9taXR0ZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IHNsb3dlciB0aGFuIGBfLnBpY2tgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gb21pdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdChvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIHZhciBvbWl0ID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaXNEZWVwID0gZmFsc2U7XG4gICAgICBwYXRocyA9IGFycmF5TWFwKHBhdGhzLCBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgICBpc0RlZXAgfHwgKGlzRGVlcCA9IHBhdGgubGVuZ3RoID4gMSk7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSk7XG4gICAgICBjb3B5T2JqZWN0KG9iamVjdCwgZ2V0QWxsS2V5c0luKG9iamVjdCksIHJlc3VsdCk7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJlc3VsdCA9IGJhc2VDbG9uZShyZXN1bHQsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX0ZMQVRfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9tT21pdENsb25lKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgYmFzZVVuc2V0KHJlc3VsdCwgcGF0aHNbbGVuZ3RoXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tCeWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mXG4gICAgICogdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYG9iamVjdGAgdGhhdFxuICAgICAqIGBwcmVkaWNhdGVgIGRvZXNuJ3QgcmV0dXJuIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3b1xuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9taXRCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHBpY2tCeShvYmplY3QsIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAgICAgKiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGlja0J5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGlja0J5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFtwcm9wXTtcbiAgICAgIH0pO1xuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlKTtcbiAgICAgIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwcmVkaWNhdGUodmFsdWUsIHBhdGhbMF0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhXG4gICAgICogZnVuY3Rpb24gaXQncyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGl0cyBwYXJlbnQgb2JqZWN0IGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYzEnOiAzLCAnYzInOiBfLmNvbnN0YW50KDQpIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMScpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMicpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCBfLmNvbnN0YW50KCdkZWZhdWx0JykpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3VsdChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGxvb3AgaXMgZW50ZXJlZCB3aGVuIHBhdGggaXMgZW1wdHkuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICBvYmplY3QgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IGlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUuY2FsbChvYmplY3QpIDogdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICAgICAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICAgICAqIGFyZSBjcmVhdGVkIGZvciBhbGwgb3RoZXIgbWlzc2luZyBwcm9wZXJ0aWVzLiBVc2UgYF8uc2V0V2l0aGAgdG8gY3VzdG9taXplXG4gICAgICogYHBhdGhgIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgWyd4JywgJzAnLCAneScsICd6J10sIDUpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnNldFdpdGgob2JqZWN0LCAnWzBdWzFdJywgJ2EnLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdpdGgob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGBcbiAgICAgKiB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXAgb3Igc2V0LCBpdHNcbiAgICAgKiBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlycyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzID0gY3JlYXRlVG9QYWlycyhrZXlzKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnNcbiAgICAgKiBmb3IgYG9iamVjdGAgd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwXG4gICAgICogb3Igc2V0LCBpdHMgZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc0luXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlyc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzSW4gPSBjcmVhdGVUb1BhaXJzKGtleXNJbik7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICAgICAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICAgICAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAgICAgKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICAgICAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgOV1cbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgICAgIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogNyB9IH1dIH07XG4gICAgICogXy51bnNldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udW5zZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdHJ1ZSA6IGJhc2VVbnNldChvYmplY3QsIHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBhY2NlcHRzIGB1cGRhdGVyYCB0byBwcm9kdWNlIHRoZVxuICAgICAqIHZhbHVlIHRvIHNldC4gVXNlIGBfLnVwZGF0ZVdpdGhgIHRvIGN1c3RvbWl6ZSBgcGF0aGAgY3JlYXRpb24uIFRoZSBgdXBkYXRlcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ2FbMF0uYi5jJywgZnVuY3Rpb24obikgeyByZXR1cm4gbiAqIG47IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gOVxuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAneFswXS55LnonLCBmdW5jdGlvbihuKSB7IHJldHVybiBuID8gbiArIDEgOiAwOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVwZGF0ZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlV2l0aChvYmplY3QsICdbMF1bMV0nLCBfLmNvbnN0YW50KCdhJyksIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlciksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKCdoaScpO1xuICAgICAqIC8vID0+IFsnaCcsICdpJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5XG4gICAgICogdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IC01XG4gICAgICpcbiAgICAgKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgICAgICB1cHBlciA9IHVwcGVyID09PSB1cHBlciA/IHVwcGVyIDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gdG9OdW1iZXIobG93ZXIpO1xuICAgICAgICBsb3dlciA9IGxvd2VyID09PSBsb3dlciA/IGxvd2VyIDogMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSwgbG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG5gIGlzIGJldHdlZW4gYHN0YXJ0YCBhbmQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gSWZcbiAgICAgKiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLCBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0XG4gICAgICogbmVnYXRpdmUgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLnJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDMsIDIsIDQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCA4KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgyLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDEuMiwgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDUuMiwgNCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgtMywgLTIsIC02KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgfVxuICAgICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICAgIHJldHVybiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICogSWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXJcbiAgICAgKiBpcyByZXR1cm5lZC4gSWYgYGZsb2F0aW5nYCBpcyBgdHJ1ZWAsIG9yIGVpdGhlciBgbG93ZXJgIG9yIGB1cHBlcmAgYXJlXG4gICAgICogZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyPTBdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3VwcGVyPTFdIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZ10gU3BlY2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obG93ZXIsIHVwcGVyLCBmbG9hdGluZykge1xuICAgICAgaWYgKGZsb2F0aW5nICYmIHR5cGVvZiBmbG9hdGluZyAhPSAnYm9vbGVhbicgJiYgaXNJdGVyYXRlZUNhbGwobG93ZXIsIHVwcGVyLCBmbG9hdGluZykpIHtcbiAgICAgICAgdXBwZXIgPSBmbG9hdGluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdXBwZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSB1cHBlcjtcbiAgICAgICAgICB1cHBlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG93ZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID09PSB1bmRlZmluZWQgJiYgdXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIHVwcGVyID0gMTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBsb3dlciA9IHRvRmluaXRlKGxvd2VyKTtcbiAgICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cHBlciA9IHRvRmluaXRlKHVwcGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgICAgdmFyIHRlbXAgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1cHBlcjtcbiAgICAgICAgdXBwZXIgPSB0ZW1wO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nIHx8IGxvd2VyICUgMSB8fCB1cHBlciAlIDEpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVSYW5kb20oKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihsb3dlciArIChyYW5kICogKHVwcGVyIC0gbG93ZXIgKyBmcmVlUGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArICcnKS5sZW5ndGggLSAxKSkpKSwgdXBwZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbY2FtZWwgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FtZWxDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhbWVsIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICovXG4gICAgdmFyIGNhbWVsQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyBjYXBpdGFsaXplKHdvcmQpIDogd29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UgYW5kIHRoZSByZW1haW5pbmdcbiAgICAgKiB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICAgICAgcmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWJ1cnJzIGBzdHJpbmdgIGJ5IGNvbnZlcnRpbmdcbiAgICAgKiBbTGF0aW4tMSBTdXBwbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbi0xX1N1cHBsZW1lbnRfKFVuaWNvZGVfYmxvY2spI0NoYXJhY3Rlcl90YWJsZSlcbiAgICAgKiBhbmQgW0xhdGluIEV4dGVuZGVkLUFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX0V4dGVuZGVkLUEpXG4gICAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzIGFuZCByZW1vdmluZ1xuICAgICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWJ1cnIoJ2RcdTAwRTlqXHUwMEUwIHZ1Jyk7XG4gICAgICogLy8gPT4gJ2RlamEgdnUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBlbmRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTtcblxuICAgICAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA+PSAwICYmIHN0cmluZy5zbGljZShwb3NpdGlvbiwgZW5kKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gICAgICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICAgICAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICAgICAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gICAgICogWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGhlIGBSZWdFeHBgIHNwZWNpYWwgY2hhcmFjdGVycyBcIl5cIiwgXCIkXCIsIFwiXFxcIiwgXCIuXCIsIFwiKlwiLCBcIitcIixcbiAgICAgKiBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgYW5kIFwifFwiIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICogLy8gPT4gJ1xcW2xvZGFzaFxcXVxcKGh0dHBzOi8vbG9kYXNoXFwuY29tL1xcKSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqL1xuICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdmUkVEJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCk7XG4gICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpO1xuICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzdHJMZW5ndGggPj0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbWlkID0gKGxlbmd0aCAtIHN0ckxlbmd0aCkgLyAyO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLCBjaGFycykgK1xuICAgICAgICBzdHJpbmcgK1xuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnICAgYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tX2FiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpICsgc3RyaW5nKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYVxuICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlXG4gICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICogLy8gPT4gJyoqKidcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgKiAvLyA9PiAnYWJjYWJjJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAqIC8vID0+ICcnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTtcbiAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoIDwgMyA/IHN0cmluZyA6IHN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tRk9PLUJBUi0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICovXG4gICAgdmFyIHNuYWtlQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICdfJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX0FSUkFZX0xFTkdUSCA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKCFsaW1pdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoXG4gICAgICAgICAgICB0eXBlb2Ygc2VwYXJhdG9yID09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICAgICAgKSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksIDAsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPTBdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplc1xuICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlPV8udGVtcGxhdGVTZXR0aW5ncy5ldmFsdWF0ZV1cbiAgICAgKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICogIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgZnJlZSB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddXG4gICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnYmFybmV5JyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgRVMgdGVtcGxhdGUgbGl0ZXJhbCBkZWxpbWl0ZXIgYXMgYW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ3BlYmJsZXMnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSBiYWNrc2xhc2hlcyB0byB0cmVhdCBkZWxpbWl0ZXJzIGFzIHBsYWluIHRleHQuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gICAgICogdmFyIHRleHQgPSAnPCUganEuZWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+JztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7XG4gICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAgICAgKiBjb21waWxlZC5zb3VyY2U7XG4gICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gICAgICogLy8gICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS51c2VyICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAqIC8vIH1cbiAgICAgKlxuICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gICAgICB2YXIgaXNFc2NhcGluZyxcbiAgICAgICAgICBpc0V2YWx1YXRpbmcsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGludGVycG9sYXRlID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsXG4gICAgICAgICAgc291cmNlID0gXCJfX3AgKz0gJ1wiO1xuXG4gICAgICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKFxuICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xhdGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJ1xuICAgICAgLCAnZycpO1xuXG4gICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICAvLyBUaGUgc291cmNlVVJMIGdldHMgaW5qZWN0ZWQgaW50byB0aGUgc291cmNlIHRoYXQncyBldmFsLWVkLCBzbyBiZSBjYXJlZnVsXG4gICAgICAvLyB0byBub3JtYWxpemUgYWxsIGtpbmRzIG9mIHdoaXRlc3BhY2UsIHNvIGUuZy4gbmV3bGluZXMgKGFuZCB1bmljb2RlIHZlcnNpb25zIG9mIGl0KSBjYW4ndCBzbmVhayBpblxuICAgICAgLy8gYW5kIGVzY2FwZSB0aGUgY29tbWVudCwgdGh1cyBpbmplY3RpbmcgY29kZSB0aGF0IGdldHMgZXZhbGVkLlxuICAgICAgdmFyIHNvdXJjZVVSTCA9ICcvLyMgc291cmNlVVJMPScgK1xuICAgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnc291cmNlVVJMJylcbiAgICAgICAgICA/IChvcHRpb25zLnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9cXHMvZywgJyAnKVxuICAgICAgICAgIDogKCdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWycgKyAoKyt0ZW1wbGF0ZUNvdW50ZXIpICsgJ10nKVxuICAgICAgICApICsgJ1xcbic7XG5cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgICAgICBpbnRlcnBvbGF0ZVZhbHVlIHx8IChpbnRlcnBvbGF0ZVZhbHVlID0gZXNUZW1wbGF0ZVZhbHVlKTtcblxuICAgICAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscy5cbiAgICAgICAgc291cmNlICs9IHN0cmluZy5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBlc2NhcGVTdHJpbmdDaGFyKTtcblxuICAgICAgICAvLyBSZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBzbmlwcGV0cy5cbiAgICAgICAgaWYgKGVzY2FwZVZhbHVlKSB7XG4gICAgICAgICAgaXNFc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuX19lKFwiICsgZXNjYXBlVmFsdWUgKyBcIikgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlVmFsdWUgKyBcIjtcXG5fX3AgKz0gJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuKChfX3QgPSAoXCIgKyBpbnRlcnBvbGF0ZVZhbHVlICsgXCIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgICAgLy8gVGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cyBuZWVkcyBgbWF0Y2hgIHJldHVybmVkIGluXG4gICAgICAgIC8vIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH0pO1xuXG4gICAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgICAvLyBJZiBgdmFyaWFibGVgIGlzIG5vdCBzcGVjaWZpZWQgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkXG4gICAgICAvLyBjb2RlIHRvIGFkZCB0aGUgZGF0YSBvYmplY3QgdG8gdGhlIHRvcCBvZiB0aGUgc2NvcGUgY2hhaW4uXG4gICAgICB2YXIgdmFyaWFibGUgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICd2YXJpYWJsZScpICYmIG9wdGlvbnMudmFyaWFibGU7XG4gICAgICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgICAgIHNvdXJjZSA9ICd3aXRoIChvYmopIHtcXG4nICsgc291cmNlICsgJ1xcbn1cXG4nO1xuICAgICAgfVxuICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgYSBmb3JiaWRkZW4gY2hhcmFjdGVyIHdhcyBmb3VuZCBpbiBgdmFyaWFibGVgLCB0byBwcmV2ZW50XG4gICAgICAvLyBwb3RlbnRpYWwgY29tbWFuZCBpbmplY3Rpb24gYXR0YWNrcy5cbiAgICAgIGVsc2UgaWYgKHJlRm9yYmlkZGVuSWRlbnRpZmllckNoYXJzLnRlc3QodmFyaWFibGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsICckMScpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywgJyQxOycpO1xuXG4gICAgICAvLyBGcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyAodmFyaWFibGUgfHwgJ29iaicpICsgJykge1xcbicgK1xuICAgICAgICAodmFyaWFibGVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnb2JqIHx8IChvYmogPSB7fSk7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgXCJ2YXIgX190LCBfX3AgPSAnJ1wiICtcbiAgICAgICAgKGlzRXNjYXBpbmdcbiAgICAgICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZSdcbiAgICAgICAgICAgOiAnJ1xuICAgICAgICApICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIHZhciByZXN1bHQgPSBhdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsIHNvdXJjZVVSTCArICdyZXR1cm4gJyArIHNvdXJjZSlcbiAgICAgICAgICAuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3JcbiAgICAgIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgaWYgKGlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byBsb3dlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9Mb3dlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvTG93ZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xvd2VyKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICctLWZvby1iYXItLSdcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb2JhcidcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnX19mb29fYmFyX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byB1cHBlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9VcHBlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvVXBwZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1VwcGVyKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICctLUZPTy1CQVItLSdcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPT0JBUidcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnX19GT09fQkFSX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbSgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLm1hcChbJyAgZm9vICAnLCAnICBiYXIgICddLCBfLnRyaW0pO1xuICAgICAqIC8vID0+IFsnZm9vJywgJ2JhciddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbShzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBiYXNlVHJpbShzdHJpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltRW5kKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJyAgYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltRW5kKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnLV8tYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjICAnXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYy1fLSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0KS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgYHN0cmluZ2AgaWYgaXQncyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gICAgICogc3RyaW5nIHdoaWNoIGRlZmF1bHRzIHRvIFwiLi4uXCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub21pc3Npb249Jy4uLiddIFRoZSBzdHJpbmcgdG8gaW5kaWNhdGUgdGV4dCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuc2VwYXJhdG9yXSBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gdHJ1bmNhdGUgdG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm8uLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6ICcgJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAvLD8gKy9cbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdvbWlzc2lvbic6ICcgWy4uLl0nXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBERUZBVUxUX1RSVU5DX0xFTkdUSCxcbiAgICAgICAgICBvbWlzc2lvbiA9IERFRkFVTFRfVFJVTkNfT01JU1NJT047XG5cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gJ3NlcGFyYXRvcicgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc2VwYXJhdG9yIDogc2VwYXJhdG9yO1xuICAgICAgICBsZW5ndGggPSAnbGVuZ3RoJyBpbiBvcHRpb25zID8gdG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKSA6IGxlbmd0aDtcbiAgICAgICAgb21pc3Npb24gPSAnb21pc3Npb24nIGluIG9wdGlvbnMgPyBiYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbikgOiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTtcbiAgICAgICAgc3RyTGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pO1xuICAgICAgaWYgKGVuZCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHN0clN5bWJvbHNcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKVxuICAgICAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpO1xuXG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKHN0clN5bWJvbHMpIHtcbiAgICAgICAgZW5kICs9IChyZXN1bHQubGVuZ3RoIC0gZW5kKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlZ0V4cChzZXBhcmF0b3IpKSB7XG4gICAgICAgIGlmIChzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSkge1xuICAgICAgICAgIHZhciBtYXRjaCxcbiAgICAgICAgICAgICAgc3Vic3RyaW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgICAgICB2YXIgbmV3RW5kID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCA/IGVuZCA6IG5ld0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksIGVuZCkgIT0gZW5kKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAqIGAmYW1wO2AsIGAmbHQ7YCwgYCZndDtgLCBgJnF1b3Q7YCwgYW5kIGAmIzM5O2AgaW4gYHN0cmluZ2AgdG9cbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogSFRNTCBlbnRpdGllcyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCctLWZvby1iYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGUkVEJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b1VwcGVyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gICAgICBpZiAocGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pIHx8IFtdO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGludm9rZSBgZnVuY2AsIHJldHVybmluZyBlaXRoZXIgdGhlIHJlc3VsdCBvciB0aGUgY2F1Z2h0IGVycm9yXG4gICAgICogb2JqZWN0LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYGZ1bmNgIHJlc3VsdCBvciBlcnJvciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIHRocm93aW5nIGVycm9ycyBmb3IgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgICogdmFyIGVsZW1lbnRzID0gXy5hdHRlbXB0KGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICogICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICogfSwgJz5fPicpO1xuICAgICAqXG4gICAgICogaWYgKF8uaXNFcnJvcihlbGVtZW50cykpIHtcbiAgICAgKiAgIGVsZW1lbnRzID0gW107XG4gICAgICogfVxuICAgICAqL1xuICAgIHZhciBhdHRlbXB0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBpc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgKiBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IG1ldGhvZE5hbWVzIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVzIHRvIGJpbmQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHZpZXcgPSB7XG4gICAgICogICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICogICAnY2xpY2snOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdmlldy5jbGljayk7XG4gICAgICogLy8gPT4gTG9ncyAnY2xpY2tlZCBkb2NzJyB3aGVuIGNsaWNrZWQuXG4gICAgICovXG4gICAgdmFyIGJpbmRBbGwgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIG1ldGhvZE5hbWVzKSB7XG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBrZXkgPSB0b0tleShrZXkpO1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIGJpbmQob2JqZWN0W2tleV0sIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogZnVuY3Rpb24gb2YgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byByZXR1cm4gdHJ1dGh5LiBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uXG4gICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLmNvbmQoW1xuICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSxcbiAgICAgKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sXG4gICAgICogICBbXy5zdHViVHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgXy5jb25zdGFudCgnbm8gbWF0Y2gnKV1cbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMCwgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEInXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAnMScsICdiJzogJzInIH0pO1xuICAgICAqIC8vID0+ICdubyBtYXRjaCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25kKHBhaXJzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgdG9JdGVyYXRlZSA9IGdldEl0ZXJhdGVlKCk7XG5cbiAgICAgIHBhaXJzID0gIWxlbmd0aCA/IFtdIDogYXJyYXlNYXAocGFpcnMsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYWlyWzFdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0b0l0ZXJhdGVlKHBhaXJbMF0pLCBwYWlyWzFdXTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgICBpZiAoYXBwbHkocGFpclswXSwgdGhpcywgYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShwYWlyWzFdLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYSBnaXZlbiBvYmplY3QsIHJldHVybmluZyBgdHJ1ZWAgaWZcbiAgICAgKiBhbGwgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc1RvYCB3aXRoXG4gICAgICogYHNvdXJjZWAgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMiwgJ2InOiAxIH0sXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5jb25mb3Jtcyh7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYHZhbHVlYCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIGluXG4gICAgICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICAgICAqIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3coW18uYWRkLCBzcXVhcmVdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93ID0gY3JlYXRlRmxvdygpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbG93YCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdFxuICAgICAqIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3dSaWdodChbc3F1YXJlLCBfLmFkZF0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3dSaWdodCA9IGNyZWF0ZUZsb3codHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUsIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlXG4gICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50XG4gICAgICogc291cmNlIHByb3BlcnRpZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZShbJ3VzZXInLCAnZnJlZCddKSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsIF8uaXRlcmF0ZWUoJ3VzZXInKSk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBDcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICAgICAqICAgcmV0dXJuICFfLmlzUmVnRXhwKGZ1bmMpID8gaXRlcmF0ZWUoZnVuYykgOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgKiAgICAgcmV0dXJuIGZ1bmMudGVzdChzdHJpbmcpO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAgICAgKiAvLyA9PiBbJ2RlZiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykge1xuICAgICAgcmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gZnVuYyA6IGJhc2VDbG9uZShmdW5jLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlblxuICAgICAqIG9iamVjdCBhbmQgYHNvdXJjZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgZXF1aXZhbGVudFxuICAgICAqIHByb3BlcnR5IHZhbHVlcywgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uaXNNYXRjaGAgd2l0aCBgc291cmNlYFxuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgY2hlY2tlZCBieSBjb21iaW5pbmcgc2V2ZXJhbCBtYXRjaGVyc1xuICAgICAqIHVzaW5nIGBfLm92ZXJTb21lYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm1hdGNoZXMoeyAnYSc6IDQsICdjJzogNiB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqXG4gICAgICogLy8gQ2hlY2tpbmcgZm9yIHNldmVyYWwgcG9zc2libGUgdmFsdWVzXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5vdmVyU29tZShbXy5tYXRjaGVzKHsgJ2EnOiAxIH0pLCBfLm1hdGNoZXMoeyAnYSc6IDQgfSldKSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0aGVcbiAgICAgKiB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QgdG8gYHNyY1ZhbHVlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGVcbiAgICAgKiBvYmplY3QgdmFsdWUgaXMgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0XG4gICAgICogYHNyY1ZhbHVlYCB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZVxuICAgICAqIGBfLmlzRXF1YWxgIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgY2hlY2tlZCBieSBjb21iaW5pbmcgc2V2ZXJhbCBtYXRjaGVyc1xuICAgICAqIHVzaW5nIGBfLm92ZXJTb21lYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmQob2JqZWN0cywgXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCA0KSk7XG4gICAgICogLy8gPT4geyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlc1Byb3BlcnR5KCdhJywgMSksIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCldKSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIGJhc2VDbG9uZShzcmNWYWx1ZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDIpIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgxKSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKFsnYScsICdiJ10pKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tZXRob2RgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogdGhlIG1ldGhvZCBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gXy50aW1lcygzLCBfLmNvbnN0YW50KSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIHZhciBtZXRob2RPZiA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZVxuICAgICAqIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LiBJZiBgb2JqZWN0YCBpcyBhIGZ1bmN0aW9uLCB0aGVuIG1ldGhvZHNcbiAgICAgKiBhcmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVzZSBgXy5ydW5JbkNvbnRleHRgIHRvIGNyZWF0ZSBhIHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHRvXG4gICAgICogYXZvaWQgY29uZmxpY3RzIGNhdXNlZCBieSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gW29iamVjdD1sb2Rhc2hdIFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgbWl4aW5zIGFyZSBjaGFpbmFibGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gdm93ZWxzKHN0cmluZykge1xuICAgICAqICAgcmV0dXJuIF8uZmlsdGVyKHN0cmluZywgZnVuY3Rpb24odikge1xuICAgICAqICAgICByZXR1cm4gL1thZWlvdV0vaS50ZXN0KHYpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSk7XG4gICAgICogXy52b3dlbHMoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXygnZnJlZCcpLnZvd2VscygpLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0sIHsgJ2NoYWluJzogZmFsc2UgfSk7XG4gICAgICogXygnZnJlZCcpLnZvd2VscygpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWl4aW4ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKSxcbiAgICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBwcm9wcyk7XG5cbiAgICAgIGlmIChvcHRpb25zID09IG51bGwgJiZcbiAgICAgICAgICAhKGlzT2JqZWN0KHNvdXJjZSkgJiYgKG1ldGhvZE5hbWVzLmxlbmd0aCB8fCAhcHJvcHMubGVuZ3RoKSkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHNvdXJjZTtcbiAgICAgICAgc291cmNlID0gb2JqZWN0O1xuICAgICAgICBvYmplY3QgPSB0aGlzO1xuICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBrZXlzKHNvdXJjZSkpO1xuICAgICAgfVxuICAgICAgdmFyIGNoYWluID0gIShpc09iamVjdChvcHRpb25zKSAmJiAnY2hhaW4nIGluIG9wdGlvbnMpIHx8ICEhb3B0aW9ucy5jaGFpbixcbiAgICAgICAgICBpc0Z1bmMgPSBpc0Z1bmN0aW9uKG9iamVjdCk7XG5cbiAgICAgIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgZnVuYyA9IHNvdXJjZVttZXRob2ROYW1lXTtcbiAgICAgICAgb2JqZWN0W21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgaWYgKGlzRnVuYykge1xuICAgICAgICAgIG9iamVjdC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fO1xuICAgICAgICAgICAgaWYgKGNoYWluIHx8IGNoYWluQWxsKSB7XG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvYmplY3QodGhpcy5fX3dyYXBwZWRfXyksXG4gICAgICAgICAgICAgICAgICBhY3Rpb25zID0gcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuXG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh7ICdmdW5jJzogZnVuYywgJ2FyZ3MnOiBhcmd1bWVudHMsICd0aGlzQXJnJzogb2JqZWN0IH0pO1xuICAgICAgICAgICAgICByZXN1bHQuX19jaGFpbl9fID0gY2hhaW5BbGw7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShvYmplY3QsIGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSwgYXJndW1lbnRzKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0b1xuICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgICBpZiAocm9vdC5fID09PSB0aGlzKSB7XG4gICAgICAgIHJvb3QuXyA9IG9sZERhc2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLm5vb3ApO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub29wKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBhcmd1bWVudCBhdCBpbmRleCBgbmAuIElmIGBuYCBpcyBuZWdhdGl2ZSxcbiAgICAgKiB0aGUgbnRoIGFyZ3VtZW50IGZyb20gdGhlIGVuZCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgYXJndW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhc3MtdGhydSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygxKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKC0yKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2MnXG4gICAgICovXG4gICAgZnVuY3Rpb24gbnRoQXJnKG4pIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICByZXR1cm4gYmFzZU50aChhcmdzLCBuKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGl0ZXJhdGVlc2Agd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzXG4gICAgICogYW5kIHJldHVybnMgdGhlaXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXIoW01hdGgubWF4LCBNYXRoLm1pbl0pO1xuICAgICAqXG4gICAgICogZnVuYygxLCAyLCAzLCA0KTtcbiAgICAgKiAvLyA9PiBbNCwgMV1cbiAgICAgKi9cbiAgICB2YXIgb3ZlciA9IGNyZWF0ZU92ZXIoYXJyYXlNYXApO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYWxsKiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEZvbGxvd2luZyBzaG9ydGhhbmRzIGFyZSBwb3NzaWJsZSBmb3IgcHJvdmlkaW5nIHByZWRpY2F0ZXMuXG4gICAgICogUGFzcyBhbiBgT2JqZWN0YCBhbmQgaXQgd2lsbCBiZSB1c2VkIGFzIGFuIHBhcmFtZXRlciBmb3IgYF8ubWF0Y2hlc2AgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuXG4gICAgICogUGFzcyBhbiBgQXJyYXlgIG9mIHBhcmFtZXRlcnMgZm9yIGBfLm1hdGNoZXNQcm9wZXJ0eWAgYW5kIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckV2ZXJ5KFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIGZ1bmMoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBvdmVyRXZlcnkgPSBjcmVhdGVPdmVyKGFycmF5RXZlcnkpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYW55Kiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEZvbGxvd2luZyBzaG9ydGhhbmRzIGFyZSBwb3NzaWJsZSBmb3IgcHJvdmlkaW5nIHByZWRpY2F0ZXMuXG4gICAgICogUGFzcyBhbiBgT2JqZWN0YCBhbmQgaXQgd2lsbCBiZSB1c2VkIGFzIGFuIHBhcmFtZXRlciBmb3IgYF8ubWF0Y2hlc2AgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuXG4gICAgICogUGFzcyBhbiBgQXJyYXlgIG9mIHBhcmFtZXRlcnMgZm9yIGBfLm1hdGNoZXNQcm9wZXJ0eWAgYW5kIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlclNvbWUoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciBtYXRjaGVzRnVuYyA9IF8ub3ZlclNvbWUoW3sgJ2EnOiAxIH0sIHsgJ2EnOiAyIH1dKVxuICAgICAqIHZhciBtYXRjaGVzUHJvcGVydHlGdW5jID0gXy5vdmVyU29tZShbWydhJywgMV0sIFsnYScsIDJdXSlcbiAgICAgKi9cbiAgICB2YXIgb3ZlclNvbWUgPSBjcmVhdGVPdmVyKGFycmF5U29tZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICogdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMCwgMSwgMl0sXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3QpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAgICAgKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICAgICAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZSg0KTtcbiAgICAgKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoLTQpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJhbmdlYCBleGNlcHQgdGhhdCBpdCBwb3B1bGF0ZXMgdmFsdWVzIGluXG4gICAgICogZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoNCk7XG4gICAgICogLy8gPT4gWzMsIDIsIDEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoLTQpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICAgICAqIC8vID0+IFs0LCAzLCAyLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTUsIDEwLCA1LCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICAgICAqIC8vID0+IFtbXSwgW11dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gICAgICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5zdHViT2JqZWN0KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7fSwge31dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJycsICcnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViVHJ1ZSk7XG4gICAgICogLy8gPT4gW3RydWUsIHRydWVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlRydWUoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZlxuICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIFN0cmluZyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddXG4gICAgICpcbiAgICAgKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTtcbiAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSk7XG4gICAgICBuIC09IE1BWF9BUlJBWV9MRU5HVEg7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlVGltZXMobGVuZ3RoLCBpdGVyYXRlZSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgICAgaXRlcmF0ZWUoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBnaXZlbiwgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD0nJ10gVGhlIHZhbHVlIHRvIHByZWZpeCB0aGUgSUQgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgpO1xuICAgICAqIC8vID0+ICcxMDUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgICAgIHJldHVybiB0b1N0cmluZyhwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdG90YWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYWRkKDYsIDQpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgdmFyIGFkZCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLCBhZGRlbmQpIHtcbiAgICAgIHJldHVybiBhdWdlbmQgKyBhZGRlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg0LjAwNik7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogXy5jZWlsKDYuMDA0LCAyKTtcbiAgICAgKiAvLyA9PiA2LjAxXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNjA0MCwgLTIpO1xuICAgICAqIC8vID0+IDYxMDBcbiAgICAgKi9cbiAgICB2YXIgY2VpbCA9IGNyZWF0ZVJvdW5kKCdjZWlsJyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpZGVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBxdW90aWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaXZpZGUoNiwgNCk7XG4gICAgICogLy8gPT4gMS41XG4gICAgICovXG4gICAgdmFyIGRpdmlkZSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgIHJldHVybiBkaXZpZGVuZCAvIGRpdmlzb3I7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbG9vcig0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5mbG9vcigwLjA0NiwgMik7XG4gICAgICogLy8gPT4gMC4wNFxuICAgICAqXG4gICAgICogXy5mbG9vcig0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDAwMFxuICAgICAqL1xuICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXgoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1heGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXhCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1lYW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbihhcnJheSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBpZGVudGl0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgYXZlcmFnZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5taW4oW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbihhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGllciBUaGUgZmlyc3QgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpY2FuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHByb2R1Y3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubXVsdGlwbHkoNiwgNCk7XG4gICAgICogLy8gPT4gMjRcbiAgICAgKi9cbiAgICB2YXIgbXVsdGlwbHkgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCkge1xuICAgICAgcmV0dXJuIG11bHRpcGxpZXIgKiBtdWx0aXBsaWNhbmQ7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICAgICAqIC8vID0+IDQuMDFcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQxMDBcbiAgICAgKi9cbiAgICB2YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTtcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWludWVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN1YnRyYWhlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1YnRyYWN0KDYsIDQpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsIHN1YnRyYWhlbmQpIHtcbiAgICAgIHJldHVybiBtaW51ZW5kIC0gc3VidHJhaGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdW0oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgaWRlbnRpdHkpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7XG4gICAgbG9kYXNoLmFyeSA9IGFyeTtcbiAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduO1xuICAgIGxvZGFzaC5hc3NpZ25JbiA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5hc3NpZ25JbldpdGggPSBhc3NpZ25JbldpdGg7XG4gICAgbG9kYXNoLmFzc2lnbldpdGggPSBhc3NpZ25XaXRoO1xuICAgIGxvZGFzaC5hdCA9IGF0O1xuICAgIGxvZGFzaC5iZWZvcmUgPSBiZWZvcmU7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNhc3RBcnJheSA9IGNhc3RBcnJheTtcbiAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjtcbiAgICBsb2Rhc2guY2h1bmsgPSBjaHVuaztcbiAgICBsb2Rhc2guY29tcGFjdCA9IGNvbXBhY3Q7XG4gICAgbG9kYXNoLmNvbmNhdCA9IGNvbmNhdDtcbiAgICBsb2Rhc2guY29uZCA9IGNvbmQ7XG4gICAgbG9kYXNoLmNvbmZvcm1zID0gY29uZm9ybXM7XG4gICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7XG4gICAgbG9kYXNoLmNvdW50QnkgPSBjb3VudEJ5O1xuICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgbG9kYXNoLmN1cnJ5ID0gY3Vycnk7XG4gICAgbG9kYXNoLmN1cnJ5UmlnaHQgPSBjdXJyeVJpZ2h0O1xuICAgIGxvZGFzaC5kZWJvdW5jZSA9IGRlYm91bmNlO1xuICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgIGxvZGFzaC5kZWZhdWx0c0RlZXAgPSBkZWZhdWx0c0RlZXA7XG4gICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7XG4gICAgbG9kYXNoLmRlbGF5ID0gZGVsYXk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlO1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlQnkgPSBkaWZmZXJlbmNlQnk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VXaXRoID0gZGlmZmVyZW5jZVdpdGg7XG4gICAgbG9kYXNoLmRyb3AgPSBkcm9wO1xuICAgIGxvZGFzaC5kcm9wUmlnaHQgPSBkcm9wUmlnaHQ7XG4gICAgbG9kYXNoLmRyb3BSaWdodFdoaWxlID0gZHJvcFJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTtcbiAgICBsb2Rhc2guZmlsbCA9IGZpbGw7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdE1hcCA9IGZsYXRNYXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZWVwID0gZmxhdE1hcERlZXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZXB0aCA9IGZsYXRNYXBEZXB0aDtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZsYXR0ZW5EZWVwID0gZmxhdHRlbkRlZXA7XG4gICAgbG9kYXNoLmZsYXR0ZW5EZXB0aCA9IGZsYXR0ZW5EZXB0aDtcbiAgICBsb2Rhc2guZmxpcCA9IGZsaXA7XG4gICAgbG9kYXNoLmZsb3cgPSBmbG93O1xuICAgIGxvZGFzaC5mbG93UmlnaHQgPSBmbG93UmlnaHQ7XG4gICAgbG9kYXNoLmZyb21QYWlycyA9IGZyb21QYWlycztcbiAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zO1xuICAgIGxvZGFzaC5mdW5jdGlvbnNJbiA9IGZ1bmN0aW9uc0luO1xuICAgIGxvZGFzaC5ncm91cEJ5ID0gZ3JvdXBCeTtcbiAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uQnkgPSBpbnRlcnNlY3Rpb25CeTtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aCA9IGludGVyc2VjdGlvbldpdGg7XG4gICAgbG9kYXNoLmludmVydCA9IGludmVydDtcbiAgICBsb2Rhc2guaW52ZXJ0QnkgPSBpbnZlcnRCeTtcbiAgICBsb2Rhc2guaW52b2tlTWFwID0gaW52b2tlTWFwO1xuICAgIGxvZGFzaC5pdGVyYXRlZSA9IGl0ZXJhdGVlO1xuICAgIGxvZGFzaC5rZXlCeSA9IGtleUJ5O1xuICAgIGxvZGFzaC5rZXlzID0ga2V5cztcbiAgICBsb2Rhc2gua2V5c0luID0ga2V5c0luO1xuICAgIGxvZGFzaC5tYXAgPSBtYXA7XG4gICAgbG9kYXNoLm1hcEtleXMgPSBtYXBLZXlzO1xuICAgIGxvZGFzaC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7XG4gICAgbG9kYXNoLm1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGxvZGFzaC5tYXRjaGVzUHJvcGVydHkgPSBtYXRjaGVzUHJvcGVydHk7XG4gICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplO1xuICAgIGxvZGFzaC5tZXJnZSA9IG1lcmdlO1xuICAgIGxvZGFzaC5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG4gICAgbG9kYXNoLm1ldGhvZCA9IG1ldGhvZDtcbiAgICBsb2Rhc2gubWV0aG9kT2YgPSBtZXRob2RPZjtcbiAgICBsb2Rhc2gubWl4aW4gPSBtaXhpbjtcbiAgICBsb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xuICAgIGxvZGFzaC5udGhBcmcgPSBudGhBcmc7XG4gICAgbG9kYXNoLm9taXQgPSBvbWl0O1xuICAgIGxvZGFzaC5vbWl0QnkgPSBvbWl0Qnk7XG4gICAgbG9kYXNoLm9uY2UgPSBvbmNlO1xuICAgIGxvZGFzaC5vcmRlckJ5ID0gb3JkZXJCeTtcbiAgICBsb2Rhc2gub3ZlciA9IG92ZXI7XG4gICAgbG9kYXNoLm92ZXJBcmdzID0gb3ZlckFyZ3M7XG4gICAgbG9kYXNoLm92ZXJFdmVyeSA9IG92ZXJFdmVyeTtcbiAgICBsb2Rhc2gub3ZlclNvbWUgPSBvdmVyU29tZTtcbiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgbG9kYXNoLnBhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodDtcbiAgICBsb2Rhc2gucGFydGl0aW9uID0gcGFydGl0aW9uO1xuICAgIGxvZGFzaC5waWNrID0gcGljaztcbiAgICBsb2Rhc2gucGlja0J5ID0gcGlja0J5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eU9mID0gcHJvcGVydHlPZjtcbiAgICBsb2Rhc2gucHVsbCA9IHB1bGw7XG4gICAgbG9kYXNoLnB1bGxBbGwgPSBwdWxsQWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsQnkgPSBwdWxsQWxsQnk7XG4gICAgbG9kYXNoLnB1bGxBbGxXaXRoID0gcHVsbEFsbFdpdGg7XG4gICAgbG9kYXNoLnB1bGxBdCA9IHB1bGxBdDtcbiAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTtcbiAgICBsb2Rhc2gucmFuZ2VSaWdodCA9IHJhbmdlUmlnaHQ7XG4gICAgbG9kYXNoLnJlYXJnID0gcmVhcmc7XG4gICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDtcbiAgICBsb2Rhc2gucmVtb3ZlID0gcmVtb3ZlO1xuICAgIGxvZGFzaC5yZXN0ID0gcmVzdDtcbiAgICBsb2Rhc2gucmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgbG9kYXNoLnNhbXBsZVNpemUgPSBzYW1wbGVTaXplO1xuICAgIGxvZGFzaC5zZXQgPSBzZXQ7XG4gICAgbG9kYXNoLnNldFdpdGggPSBzZXRXaXRoO1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc2xpY2UgPSBzbGljZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxID0gc29ydGVkVW5pcTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcUJ5ID0gc29ydGVkVW5pcUJ5O1xuICAgIGxvZGFzaC5zcGxpdCA9IHNwbGl0O1xuICAgIGxvZGFzaC5zcHJlYWQgPSBzcHJlYWQ7XG4gICAgbG9kYXNoLnRhaWwgPSB0YWlsO1xuICAgIGxvZGFzaC50YWtlID0gdGFrZTtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0ID0gdGFrZVJpZ2h0O1xuICAgIGxvZGFzaC50YWtlUmlnaHRXaGlsZSA9IHRha2VSaWdodFdoaWxlO1xuICAgIGxvZGFzaC50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG4gICAgbG9kYXNoLnRhcCA9IHRhcDtcbiAgICBsb2Rhc2gudGhyb3R0bGUgPSB0aHJvdHRsZTtcbiAgICBsb2Rhc2gudGhydSA9IHRocnU7XG4gICAgbG9kYXNoLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIGxvZGFzaC50b1BhaXJzID0gdG9QYWlycztcbiAgICBsb2Rhc2gudG9QYWlyc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC50b1BhdGggPSB0b1BhdGg7XG4gICAgbG9kYXNoLnRvUGxhaW5PYmplY3QgPSB0b1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgbG9kYXNoLnVuYXJ5ID0gdW5hcnk7XG4gICAgbG9kYXNoLnVuaW9uID0gdW5pb247XG4gICAgbG9kYXNoLnVuaW9uQnkgPSB1bmlvbkJ5O1xuICAgIGxvZGFzaC51bmlvbldpdGggPSB1bmlvbldpdGg7XG4gICAgbG9kYXNoLnVuaXEgPSB1bmlxO1xuICAgIGxvZGFzaC51bmlxQnkgPSB1bmlxQnk7XG4gICAgbG9kYXNoLnVuaXFXaXRoID0gdW5pcVdpdGg7XG4gICAgbG9kYXNoLnVuc2V0ID0gdW5zZXQ7XG4gICAgbG9kYXNoLnVuemlwID0gdW56aXA7XG4gICAgbG9kYXNoLnVuemlwV2l0aCA9IHVuemlwV2l0aDtcbiAgICBsb2Rhc2gudXBkYXRlID0gdXBkYXRlO1xuICAgIGxvZGFzaC51cGRhdGVXaXRoID0gdXBkYXRlV2l0aDtcbiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzO1xuICAgIGxvZGFzaC52YWx1ZXNJbiA9IHZhbHVlc0luO1xuICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDtcbiAgICBsb2Rhc2gud29yZHMgPSB3b3JkcztcbiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7XG4gICAgbG9kYXNoLnhvciA9IHhvcjtcbiAgICBsb2Rhc2gueG9yQnkgPSB4b3JCeTtcbiAgICBsb2Rhc2gueG9yV2l0aCA9IHhvcldpdGg7XG4gICAgbG9kYXNoLnppcCA9IHppcDtcbiAgICBsb2Rhc2guemlwT2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC56aXBPYmplY3REZWVwID0gemlwT2JqZWN0RGVlcDtcbiAgICBsb2Rhc2guemlwV2l0aCA9IHppcFdpdGg7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZW50cmllcyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLmVudHJpZXNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmV4dGVuZFdpdGggPSBhc3NpZ25JbldpdGg7XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgbWl4aW4obG9kYXNoLCBsb2Rhc2gpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFkZCA9IGFkZDtcbiAgICBsb2Rhc2guYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgbG9kYXNoLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbiAgICBsb2Rhc2guY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7XG4gICAgbG9kYXNoLmNlaWwgPSBjZWlsO1xuICAgIGxvZGFzaC5jbGFtcCA9IGNsYW1wO1xuICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lO1xuICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7XG4gICAgbG9kYXNoLmNsb25lRGVlcFdpdGggPSBjbG9uZURlZXBXaXRoO1xuICAgIGxvZGFzaC5jbG9uZVdpdGggPSBjbG9uZVdpdGg7XG4gICAgbG9kYXNoLmNvbmZvcm1zVG8gPSBjb25mb3Jtc1RvO1xuICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7XG4gICAgbG9kYXNoLmRlZmF1bHRUbyA9IGRlZmF1bHRUbztcbiAgICBsb2Rhc2guZGl2aWRlID0gZGl2aWRlO1xuICAgIGxvZGFzaC5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuICAgIGxvZGFzaC5lcSA9IGVxO1xuICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7XG4gICAgbG9kYXNoLmVzY2FwZVJlZ0V4cCA9IGVzY2FwZVJlZ0V4cDtcbiAgICBsb2Rhc2guZXZlcnkgPSBldmVyeTtcbiAgICBsb2Rhc2guZmluZCA9IGZpbmQ7XG4gICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7XG4gICAgbG9kYXNoLmZpbmRMYXN0ID0gZmluZExhc3Q7XG4gICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4O1xuICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5O1xuICAgIGxvZGFzaC5mbG9vciA9IGZsb29yO1xuICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5mb3JJbiA9IGZvckluO1xuICAgIGxvZGFzaC5mb3JJblJpZ2h0ID0gZm9ySW5SaWdodDtcbiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duO1xuICAgIGxvZGFzaC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0O1xuICAgIGxvZGFzaC5nZXQgPSBnZXQ7XG4gICAgbG9kYXNoLmd0ID0gZ3Q7XG4gICAgbG9kYXNoLmd0ZSA9IGd0ZTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5oYXNJbiA9IGhhc0luO1xuICAgIGxvZGFzaC5oZWFkID0gaGVhZDtcbiAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7XG4gICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlO1xuICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7XG4gICAgbG9kYXNoLmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7XG4gICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuICAgIGxvZGFzaC5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZTtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2VPYmplY3QgPSBpc0FycmF5TGlrZU9iamVjdDtcbiAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuO1xuICAgIGxvZGFzaC5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7XG4gICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbiAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7XG4gICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsO1xuICAgIGxvZGFzaC5pc0VxdWFsV2l0aCA9IGlzRXF1YWxXaXRoO1xuICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzSW50ZWdlciA9IGlzSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNMZW5ndGggPSBpc0xlbmd0aDtcbiAgICBsb2Rhc2guaXNNYXAgPSBpc01hcDtcbiAgICBsb2Rhc2guaXNNYXRjaCA9IGlzTWF0Y2g7XG4gICAgbG9kYXNoLmlzTWF0Y2hXaXRoID0gaXNNYXRjaFdpdGg7XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTmF0aXZlID0gaXNOYXRpdmU7XG4gICAgbG9kYXNoLmlzTmlsID0gaXNOaWw7XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNPYmplY3RMaWtlID0gaXNPYmplY3RMaWtlO1xuICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcbiAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4cDtcbiAgICBsb2Rhc2guaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLmlzU2V0ID0gaXNTZXQ7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzU3ltYm9sID0gaXNTeW1ib2w7XG4gICAgbG9kYXNoLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTtcbiAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcbiAgICBsb2Rhc2guaXNXZWFrTWFwID0gaXNXZWFrTWFwO1xuICAgIGxvZGFzaC5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7XG4gICAgbG9kYXNoLmpvaW4gPSBqb2luO1xuICAgIGxvZGFzaC5rZWJhYkNhc2UgPSBrZWJhYkNhc2U7XG4gICAgbG9kYXNoLmxhc3QgPSBsYXN0O1xuICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5sb3dlckNhc2UgPSBsb3dlckNhc2U7XG4gICAgbG9kYXNoLmxvd2VyRmlyc3QgPSBsb3dlckZpcnN0O1xuICAgIGxvZGFzaC5sdCA9IGx0O1xuICAgIGxvZGFzaC5sdGUgPSBsdGU7XG4gICAgbG9kYXNoLm1heCA9IG1heDtcbiAgICBsb2Rhc2gubWF4QnkgPSBtYXhCeTtcbiAgICBsb2Rhc2gubWVhbiA9IG1lYW47XG4gICAgbG9kYXNoLm1lYW5CeSA9IG1lYW5CeTtcbiAgICBsb2Rhc2gubWluID0gbWluO1xuICAgIGxvZGFzaC5taW5CeSA9IG1pbkJ5O1xuICAgIGxvZGFzaC5zdHViQXJyYXkgPSBzdHViQXJyYXk7XG4gICAgbG9kYXNoLnN0dWJGYWxzZSA9IHN0dWJGYWxzZTtcbiAgICBsb2Rhc2guc3R1Yk9iamVjdCA9IHN0dWJPYmplY3Q7XG4gICAgbG9kYXNoLnN0dWJTdHJpbmcgPSBzdHViU3RyaW5nO1xuICAgIGxvZGFzaC5zdHViVHJ1ZSA9IHN0dWJUcnVlO1xuICAgIGxvZGFzaC5tdWx0aXBseSA9IG11bHRpcGx5O1xuICAgIGxvZGFzaC5udGggPSBudGg7XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYWQgPSBwYWQ7XG4gICAgbG9kYXNoLnBhZEVuZCA9IHBhZEVuZDtcbiAgICBsb2Rhc2gucGFkU3RhcnQgPSBwYWRTdGFydDtcbiAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUludDtcbiAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tO1xuICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1Y2U7XG4gICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7XG4gICAgbG9kYXNoLnJlcGVhdCA9IHJlcGVhdDtcbiAgICBsb2Rhc2gucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDtcbiAgICBsb2Rhc2gucm91bmQgPSByb3VuZDtcbiAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0O1xuICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zbmFrZUNhc2UgPSBzbmFrZUNhc2U7XG4gICAgbG9kYXNoLnNvbWUgPSBzb21lO1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleEJ5ID0gc29ydGVkSW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhPZiA9IHNvcnRlZEluZGV4T2Y7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4QnkgPSBzb3J0ZWRMYXN0SW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBzb3J0ZWRMYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlO1xuICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbiAgICBsb2Rhc2guc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBsb2Rhc2guc3VtID0gc3VtO1xuICAgIGxvZGFzaC5zdW1CeSA9IHN1bUJ5O1xuICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzO1xuICAgIGxvZGFzaC50b0Zpbml0ZSA9IHRvRmluaXRlO1xuICAgIGxvZGFzaC50b0ludGVnZXIgPSB0b0ludGVnZXI7XG4gICAgbG9kYXNoLnRvTGVuZ3RoID0gdG9MZW5ndGg7XG4gICAgbG9kYXNoLnRvTG93ZXIgPSB0b0xvd2VyO1xuICAgIGxvZGFzaC50b051bWJlciA9IHRvTnVtYmVyO1xuICAgIGxvZGFzaC50b1NhZmVJbnRlZ2VyID0gdG9TYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBsb2Rhc2gudG9VcHBlciA9IHRvVXBwZXI7XG4gICAgbG9kYXNoLnRyaW0gPSB0cmltO1xuICAgIGxvZGFzaC50cmltRW5kID0gdHJpbUVuZDtcbiAgICBsb2Rhc2gudHJpbVN0YXJ0ID0gdHJpbVN0YXJ0O1xuICAgIGxvZGFzaC50cnVuY2F0ZSA9IHRydW5jYXRlO1xuICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlO1xuICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGxvZGFzaC51cHBlckNhc2UgPSB1cHBlckNhc2U7XG4gICAgbG9kYXNoLnVwcGVyRmlyc3QgPSB1cHBlckZpcnN0O1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5lYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZpcnN0ID0gaGVhZDtcblxuICAgIG1peGluKGxvZGFzaCwgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHt9O1xuICAgICAgYmFzZUZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsIG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH0oKSksIHsgJ2NoYWluJzogZmFsc2UgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGxvZGFzaC5WRVJTSU9OID0gVkVSU0lPTjtcblxuICAgIC8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbiAgICBhcnJheUVhY2goWydiaW5kJywgJ2JpbmRLZXknLCAnY3VycnknLCAnY3VycnlSaWdodCcsICdwYXJ0aWFsJywgJ3BhcnRpYWxSaWdodCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICBsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXIgPSBsb2Rhc2g7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuXG4gICAgYXJyYXlFYWNoKFsnZHJvcCcsICd0YWtlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIG4gPSBuID09PSB1bmRlZmluZWQgPyAxIDogbmF0aXZlTWF4KHRvSW50ZWdlcihuKSwgMCk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9ICh0aGlzLl9fZmlsdGVyZWRfXyAmJiAhaW5kZXgpXG4gICAgICAgICAgPyBuZXcgTGF6eVdyYXBwZXIodGhpcylcbiAgICAgICAgICA6IHRoaXMuY2xvbmUoKTtcblxuICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXykge1xuICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gbmF0aXZlTWluKG4sIHJlc3VsdC5fX3Rha2VDb3VudF9fKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQuX192aWV3c19fLnB1c2goe1xuICAgICAgICAgICAgJ3NpemUnOiBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCksXG4gICAgICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSArICdSaWdodCddID0gZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdGhhdCBhY2NlcHQgYW4gYGl0ZXJhdGVlYCB2YWx1ZS5cbiAgICBhcnJheUVhY2goWydmaWx0ZXInLCAnbWFwJywgJ3Rha2VXaGlsZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHR5cGUgPSBpbmRleCArIDEsXG4gICAgICAgICAgaXNGaWx0ZXIgPSB0eXBlID09IExBWllfRklMVEVSX0ZMQUcgfHwgdHlwZSA9PSBMQVpZX1dISUxFX0ZMQUc7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe1xuICAgICAgICAgICdpdGVyYXRlZSc6IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSxcbiAgICAgICAgICAndHlwZSc6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmhlYWRgIGFuZCBgXy5sYXN0YC5cbiAgICBhcnJheUVhY2goWydoZWFkJywgJ2xhc3QnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuXG4gICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fICYmIChzdGFydCA+IDAgfHwgZW5kIDwgMCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGFrZVJpZ2h0KC1zdGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kcm9wKHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0b0ludGVnZXIoZW5kKTtcbiAgICAgICAgcmVzdWx0ID0gZW5kIDwgMCA/IHJlc3VsdC5kcm9wUmlnaHQoLWVuZCkgOiByZXN1bHQudGFrZShlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWtlKE1BWF9BUlJBWV9MRU5HVEgpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGNoZWNrSXRlcmF0ZWUgPSAvXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW2lzVGFrZXIgPyAoJ3Rha2UnICsgKG1ldGhvZE5hbWUgPT0gJ2xhc3QnID8gJ1JpZ2h0JyA6ICcnKSkgOiBtZXRob2ROYW1lXSxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSBpc1Rha2VyIHx8IC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgaWYgKCFsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICAgIGFyZ3MgPSBpc1Rha2VyID8gWzFdIDogYXJndW1lbnRzLFxuICAgICAgICAgICAgaXNMYXp5ID0gdmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixcbiAgICAgICAgICAgIGl0ZXJhdGVlID0gYXJnc1swXSxcbiAgICAgICAgICAgIHVzZUxhenkgPSBpc0xhenkgfHwgaXNBcnJheSh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIGludGVyY2VwdG9yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsIGFycmF5UHVzaChbdmFsdWVdLCBhcmdzKSk7XG4gICAgICAgICAgcmV0dXJuIChpc1Rha2VyICYmIGNoYWluQWxsKSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhIFwibGVuZ3RoXCIgdmFsdWUgb3RoZXIgdGhhbiBgMWAuXG4gICAgICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgaXNIeWJyaWQgPSAhIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLFxuICAgICAgICAgICAgaXNVbndyYXBwZWQgPSByZXRVbndyYXBwZWQgJiYgIWNoYWluQWxsLFxuICAgICAgICAgICAgb25seUxhenkgPSBpc0xhenkgJiYgIWlzSHlicmlkO1xuXG4gICAgICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9ubHlMYXp5ID8gdmFsdWUgOiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbndyYXBwZWQgJiYgb25seUxhenkpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgICByZXR1cm4gaXNVbndyYXBwZWQgPyAoaXNUYWtlciA/IHJlc3VsdC52YWx1ZSgpWzBdIDogcmVzdWx0LnZhbHVlKCkpIDogcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgQXJyYXlgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGFycmF5RWFjaChbJ3BvcCcsICdwdXNoJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVByb3RvW21ldGhvZE5hbWVdLFxuICAgICAgICAgIGNoYWluTmFtZSA9IC9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKSA/ICd0YXAnIDogJ3RocnUnLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IC9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIXRoaXMuX19jaGFpbl9fKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIE1hcCBtaW5pZmllZCBtZXRob2QgbmFtZXMgdG8gdGhlaXIgcmVhbCBuYW1lcy5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbbWV0aG9kTmFtZV07XG4gICAgICBpZiAobG9kYXNoRnVuYykge1xuICAgICAgICB2YXIga2V5ID0gbG9kYXNoRnVuYy5uYW1lICsgJyc7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIGtleSkpIHtcbiAgICAgICAgICByZWFsTmFtZXNba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJlYWxOYW1lc1trZXldLnB1c2goeyAnbmFtZSc6IG1ldGhvZE5hbWUsICdmdW5jJzogbG9kYXNoRnVuYyB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLCBXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3tcbiAgICAgICduYW1lJzogJ3dyYXBwZXInLFxuICAgICAgJ2Z1bmMnOiB1bmRlZmluZWRcbiAgICB9XTtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMYXp5V3JhcHBlcmAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lID0gbGF6eUNsb25lO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlID0gbGF6eVJldmVyc2U7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlID0gbGF6eVZhbHVlO1xuXG4gICAgLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5hdCA9IHdyYXBwZXJBdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29tbWl0ID0gd3JhcHBlckNvbW1pdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLm5leHQgPSB3cmFwcGVyTmV4dDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnBsYW50ID0gd3JhcHBlclBsYW50O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucmV2ZXJzZSA9IHdyYXBwZXJSZXZlcnNlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTtcblxuICAgIC8vIEFkZCBsYXp5IGFsaWFzZXMuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5maXJzdCA9IGxvZGFzaC5wcm90b3R5cGUuaGVhZDtcblxuICAgIGlmIChzeW1JdGVyYXRvcikge1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl0gPSB3cmFwcGVyVG9JdGVyYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfSk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLy8gRXhwb3J0IGxvZGFzaC5cbiAgdmFyIF8gPSBydW5JbkNvbnRleHQoKTtcblxuICAvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBjb25kaXRpb24gcGF0dGVybnMgbGlrZTpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIExvZGFzaCBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBwcmV2ZW50IGVycm9ycyB3aGVuIExvZGFzaCBpc1xuICAgIC8vIGxvYWRlZCBieSBhIHNjcmlwdCB0YWcgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRCBsb2FkZXIuXG4gICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjbWlzbWF0Y2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAvLyBVc2UgYF8ubm9Db25mbGljdGAgdG8gcmVtb3ZlIExvZGFzaCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG5cbiAgICAvLyBEZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBpdC5cbiAgZWxzZSBpZiAoZnJlZU1vZHVsZSkge1xuICAgIC8vIEV4cG9ydCBmb3IgTm9kZS5qcy5cbiAgICAoZnJlZU1vZHVsZS5leHBvcnRzID0gXykuXyA9IF87XG4gICAgLy8gRXhwb3J0IGZvciBDb21tb25KUyBzdXBwb3J0LlxuICAgIGZyZWVFeHBvcnRzLl8gPSBfO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIEV4cG9ydCB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuICB9XG59LmNhbGwodGhpcykpO1xuIiwgIi8vIDo6LSBQZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBvcmRlcmVkIG1hcHBpbmcgZnJvbVxuLy8gc3RyaW5ncyB0byB2YWx1ZXMsIHdpdGggc29tZSBjb252ZW5pZW50IHVwZGF0ZSBtZXRob2RzLlxuZnVuY3Rpb24gT3JkZXJlZE1hcChjb250ZW50KSB7XG4gIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG59XG5cbk9yZGVyZWRNYXAucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogT3JkZXJlZE1hcCxcblxuICBmaW5kOiBmdW5jdGlvbihrZXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbaV0gPT09IGtleSkgcmV0dXJuIGlcbiAgICByZXR1cm4gLTFcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nKSBcdTIxOTIgP2FueVxuICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyIGBrZXlgLCBvciByZXR1cm4gdW5kZWZpbmVkIHdoZW5cbiAgLy8gbm8gc3VjaCBrZXkgZXhpc3RzLlxuICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZChrZXkpO1xuICAgIHJldHVybiBmb3VuZCA9PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudFtmb3VuZCArIDFdXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55LCA/c3RyaW5nKSBcdTIxOTIgT3JkZXJlZE1hcFxuICAvLyBDcmVhdGUgYSBuZXcgbWFwIGJ5IHJlcGxhY2luZyB0aGUgdmFsdWUgb2YgYGtleWAgd2l0aCBhIG5ld1xuICAvLyB2YWx1ZSwgb3IgYWRkaW5nIGEgYmluZGluZyB0byB0aGUgZW5kIG9mIHRoZSBtYXAuIElmIGBuZXdLZXlgIGlzXG4gIC8vIGdpdmVuLCB0aGUga2V5IG9mIHRoZSBiaW5kaW5nIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGF0IGtleS5cbiAgdXBkYXRlOiBmdW5jdGlvbihrZXksIHZhbHVlLCBuZXdLZXkpIHtcbiAgICB2YXIgc2VsZiA9IG5ld0tleSAmJiBuZXdLZXkgIT0ga2V5ID8gdGhpcy5yZW1vdmUobmV3S2V5KSA6IHRoaXM7XG4gICAgdmFyIGZvdW5kID0gc2VsZi5maW5kKGtleSksIGNvbnRlbnQgPSBzZWxmLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHtcbiAgICAgIGNvbnRlbnQucHVzaChuZXdLZXkgfHwga2V5LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRbZm91bmQgKyAxXSA9IHZhbHVlO1xuICAgICAgaWYgKG5ld0tleSkgY29udGVudFtmb3VuZF0gPSBuZXdLZXk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcpIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIFJldHVybiBhIG1hcCB3aXRoIHRoZSBnaXZlbiBrZXkgcmVtb3ZlZCwgaWYgaXQgZXhpc3RlZC5cbiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHJldHVybiB0aGlzXG4gICAgdmFyIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBjb250ZW50LnNwbGljZShmb3VuZCwgMik7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55KSBcdTIxOTIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBuZXcga2V5IHRvIHRoZSBzdGFydCBvZiB0aGUgbWFwLlxuICBhZGRUb1N0YXJ0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKFtrZXksIHZhbHVlXS5jb25jYXQodGhpcy5yZW1vdmUoa2V5KS5jb250ZW50KSlcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIEFkZCBhIG5ldyBrZXkgdG8gdGhlIGVuZCBvZiB0aGUgbWFwLlxuICBhZGRUb0VuZDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBjb250ZW50ID0gdGhpcy5yZW1vdmUoa2V5KS5jb250ZW50LnNsaWNlKCk7XG4gICAgY29udGVudC5wdXNoKGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcsIHN0cmluZywgYW55KSBcdTIxOTIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBrZXkgYWZ0ZXIgdGhlIGdpdmVuIGtleS4gSWYgYHBsYWNlYCBpcyBub3QgZm91bmQsIHRoZSBuZXdcbiAgLy8ga2V5IGlzIGFkZGVkIHRvIHRoZSBlbmQuXG4gIGFkZEJlZm9yZTogZnVuY3Rpb24ocGxhY2UsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgd2l0aG91dCA9IHRoaXMucmVtb3ZlKGtleSksIGNvbnRlbnQgPSB3aXRob3V0LmNvbnRlbnQuc2xpY2UoKTtcbiAgICB2YXIgZm91bmQgPSB3aXRob3V0LmZpbmQocGxhY2UpO1xuICAgIGNvbnRlbnQuc3BsaWNlKGZvdW5kID09IC0xID8gY29udGVudC5sZW5ndGggOiBmb3VuZCwgMCwga2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkpXG4gIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBtYXAsIGluXG4gIC8vIG9yZGVyLlxuICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICBmKHRoaXMuY29udGVudFtpXSwgdGhpcy5jb250ZW50W2kgKyAxXSk7XG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgcHJlcGVuZGluZyB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYCBiZWZvcmUgdGhlIGtleXMgaW4gYG1hcGAuXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKG1hcC5jb250ZW50LmNvbmNhdCh0aGlzLnN1YnRyYWN0KG1hcCkuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgYXBwZW5kaW5nIHRoZSBrZXlzIGluIHRoaXMgbWFwIHRoYXQgZG9uJ3RcbiAgLy8gYXBwZWFyIGluIGBtYXBgIGFmdGVyIHRoZSBrZXlzIGluIGBtYXBgLlxuICBhcHBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKHRoaXMuc3VidHJhY3QobWFwKS5jb250ZW50LmNvbmNhdChtYXAuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG1hcCBjb250YWluaW5nIGFsbCB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYC5cbiAgc3VidHJhY3Q6IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzO1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXN1bHQgPSByZXN1bHQucmVtb3ZlKG1hcC5jb250ZW50W2ldKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sXG5cbiAgLy8gOjogKCkgXHUyMTkyIE9iamVjdFxuICAvLyBUdXJuIG9yZGVyZWQgbWFwIGludG8gYSBwbGFpbiBvYmplY3QuXG4gIHRvT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsgcmVzdWx0W2tleV0gPSB2YWx1ZTsgfSk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LFxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBUaGUgYW1vdW50IG9mIGtleXMgaW4gdGhpcyBtYXAuXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID4+IDFcbiAgfVxufTtcblxuLy8gOjogKD91bmlvbjxPYmplY3QsIE9yZGVyZWRNYXA+KSBcdTIxOTIgT3JkZXJlZE1hcFxuLy8gUmV0dXJuIGEgbWFwIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuIElmIG51bGwsIGNyZWF0ZSBhbiBlbXB0eVxuLy8gbWFwLiBJZiBnaXZlbiBhbiBvcmRlcmVkIG1hcCwgcmV0dXJuIHRoYXQgbWFwIGl0c2VsZi4gSWYgZ2l2ZW4gYW5cbi8vIG9iamVjdCwgY3JlYXRlIGEgbWFwIGZyb20gdGhlIG9iamVjdCdzIHByb3BlcnRpZXMuXG5PcmRlcmVkTWFwLmZyb20gPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPcmRlcmVkTWFwKSByZXR1cm4gdmFsdWVcbiAgdmFyIGNvbnRlbnQgPSBbXTtcbiAgaWYgKHZhbHVlKSBmb3IgKHZhciBwcm9wIGluIHZhbHVlKSBjb250ZW50LnB1c2gocHJvcCwgdmFsdWVbcHJvcF0pO1xuICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9yZGVyZWRNYXA7XG4iLCAiaW1wb3J0IE9yZGVyZWRNYXAgZnJvbSAnb3JkZXJlZG1hcCc7XG5cbmZ1bmN0aW9uIGZpbmREaWZmU3RhcnQoYSwgYiwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT0gYS5jaGlsZENvdW50IHx8IGkgPT0gYi5jaGlsZENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIGEuY2hpbGRDb3VudCA9PSBiLmNoaWxkQ291bnQgPyBudWxsIDogcG9zO1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZChpKSwgY2hpbGRCID0gYi5jaGlsZChpKTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZEEubm9kZVNpemU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoaWxkQS5zYW1lTWFya3VwKGNoaWxkQikpXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNoaWxkQS50ZXh0W2pdID09IGNoaWxkQi50ZXh0W2pdOyBqKyspXG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZEEuY29udGVudC5zaXplIHx8IGNoaWxkQi5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGZpbmREaWZmU3RhcnQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3MgKyAxKTtcbiAgICAgICAgICAgIGlmIChpbm5lciAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gY2hpbGRBLm5vZGVTaXplO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmREaWZmRW5kKGEsIGIsIHBvc0EsIHBvc0IpIHtcbiAgICBmb3IgKGxldCBpQSA9IGEuY2hpbGRDb3VudCwgaUIgPSBiLmNoaWxkQ291bnQ7Oykge1xuICAgICAgICBpZiAoaUEgPT0gMCB8fCBpQiA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGlBID09IGlCID8gbnVsbCA6IHsgYTogcG9zQSwgYjogcG9zQiB9O1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZCgtLWlBKSwgY2hpbGRCID0gYi5jaGlsZCgtLWlCKSwgc2l6ZSA9IGNoaWxkQS5ub2RlU2l6ZTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvc0EgLT0gc2l6ZTtcbiAgICAgICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSlcbiAgICAgICAgICAgIHJldHVybiB7IGE6IHBvc0EsIGI6IHBvc0IgfTtcbiAgICAgICAgaWYgKGNoaWxkQS5pc1RleHQgJiYgY2hpbGRBLnRleHQgIT0gY2hpbGRCLnRleHQpIHtcbiAgICAgICAgICAgIGxldCBzYW1lID0gMCwgbWluU2l6ZSA9IE1hdGgubWluKGNoaWxkQS50ZXh0Lmxlbmd0aCwgY2hpbGRCLnRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIHdoaWxlIChzYW1lIDwgbWluU2l6ZSAmJiBjaGlsZEEudGV4dFtjaGlsZEEudGV4dC5sZW5ndGggLSBzYW1lIC0gMV0gPT0gY2hpbGRCLnRleHRbY2hpbGRCLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdKSB7XG4gICAgICAgICAgICAgICAgc2FtZSsrO1xuICAgICAgICAgICAgICAgIHBvc0EtLTtcbiAgICAgICAgICAgICAgICBwb3NCLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBhOiBwb3NBLCBiOiBwb3NCIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkQS5jb250ZW50LnNpemUgfHwgY2hpbGRCLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZERpZmZFbmQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3NBIC0gMSwgcG9zQiAtIDEpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3NBIC09IHNpemU7XG4gICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICB9XG59XG5cbi8qKlxuQSBmcmFnbWVudCByZXByZXNlbnRzIGEgbm9kZSdzIGNvbGxlY3Rpb24gb2YgY2hpbGQgbm9kZXMuXG5cbkxpa2Ugbm9kZXMsIGZyYWdtZW50cyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMsIGFuZCB5b3VcbnNob3VsZCBub3QgbXV0YXRlIHRoZW0gb3IgdGhlaXIgY29udGVudC4gUmF0aGVyLCB5b3UgY3JlYXRlIG5ld1xuaW5zdGFuY2VzIHdoZW5ldmVyIG5lZWRlZC4gVGhlIEFQSSB0cmllcyB0byBtYWtlIHRoaXMgZWFzeS5cbiovXG5jbGFzcyBGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnRlbnQsIHNpemUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCAwO1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSArPSBjb250ZW50W2ldLm5vZGVTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdHdvXG4gICAgcG9zaXRpb25zIChyZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIGZyYWdtZW50KS4gRG9lc24ndCBkZXNjZW5kXG4gICAgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgbm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBub2RlU3RhcnQgPSAwLCBwYXJlbnQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXSwgZW5kID0gcG9zICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSAmJiBmKGNoaWxkLCBub2RlU3RhcnQgKyBwb3MsIHBhcmVudCB8fCBudWxsLCBpKSAhPT0gZmFsc2UgJiYgY2hpbGQuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zICsgMTtcbiAgICAgICAgICAgICAgICBjaGlsZC5ub2Rlc0JldHdlZW4oTWF0aC5tYXgoMCwgZnJvbSAtIHN0YXJ0KSwgTWF0aC5taW4oY2hpbGQuY29udGVudC5zaXplLCB0byAtIHN0YXJ0KSwgZiwgbm9kZVN0YXJ0ICsgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGwgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBldmVyeSBkZXNjZW5kYW50IG5vZGUuIGBwb3NgIHdpbGwgYmVcbiAgICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50LiBUaGUgY2FsbGJhY2sgbWF5IHJldHVyblxuICAgIGBmYWxzZWAgdG8gcHJldmVudCB0cmF2ZXJzYWwgb2YgYSBnaXZlbiBub2RlJ3MgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBkZXNjZW5kYW50cyhmKSB7XG4gICAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKDAsIHRoaXMuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dHJhY3QgdGhlIHRleHQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuIFNlZSB0aGUgc2FtZSBtZXRob2Qgb25cbiAgICBbYE5vZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS50ZXh0QmV0d2VlbikuXG4gICAgKi9cbiAgICB0ZXh0QmV0d2Vlbihmcm9tLCB0bywgYmxvY2tTZXBhcmF0b3IsIGxlYWZUZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIiwgc2VwYXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLmlzVGV4dCkge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gbm9kZS50ZXh0LnNsaWNlKE1hdGgubWF4KGZyb20sIHBvcykgLSBwb3MsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgICAgICBzZXBhcmF0ZWQgPSAhYmxvY2tTZXBhcmF0b3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmlzTGVhZikge1xuICAgICAgICAgICAgICAgIGlmIChsZWFmVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHR5cGVvZiBsZWFmVGV4dCA9PT0gXCJmdW5jdGlvblwiID8gbGVhZlRleHQobm9kZSkgOiBsZWFmVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlLnNwZWMubGVhZlRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBub2RlLnR5cGUuc3BlYy5sZWFmVGV4dChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VwYXJhdGVkID0gIWJsb2NrU2VwYXJhdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXNlcGFyYXRlZCAmJiBub2RlLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgIHNlcGFyYXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGNvbWJpbmVkIGNvbnRlbnQgb2YgdGhpc1xuICAgIGZyYWdtZW50IGFuZCB0aGUgb3RoZXIuXG4gICAgKi9cbiAgICBhcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlci5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubGFzdENoaWxkLCBmaXJzdCA9IG90aGVyLmZpcnN0Q2hpbGQsIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKSwgaSA9IDA7XG4gICAgICAgIGlmIChsYXN0LmlzVGV4dCAmJiBsYXN0LnNhbWVNYXJrdXAoZmlyc3QpKSB7XG4gICAgICAgICAgICBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV0gPSBsYXN0LndpdGhUZXh0KGxhc3QudGV4dCArIGZpcnN0LnRleHQpO1xuICAgICAgICAgICAgaSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPCBvdGhlci5jb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgY29udGVudC5wdXNoKG90aGVyLmNvbnRlbnRbaV0pO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvbnRlbnQsIHRoaXMuc2l6ZSArIG90aGVyLnNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDdXQgb3V0IHRoZSBzdWItZnJhZ21lbnQgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuc2l6ZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHNpemUgPSAwO1xuICAgICAgICBpZiAodG8gPiBmcm9tKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sIGVuZCA9IHBvcyArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tIHx8IGVuZCA+IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KE1hdGgubWF4KDAsIGZyb20gLSBwb3MpLCBNYXRoLm1pbihjaGlsZC50ZXh0Lmxlbmd0aCwgdG8gLSBwb3MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmN1dChNYXRoLm1heCgwLCBmcm9tIC0gcG9zIC0gMSksIE1hdGgubWluKGNoaWxkLmNvbnRlbnQuc2l6ZSwgdG8gLSBwb3MgLSAxKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBzaXplICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQocmVzdWx0LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjdXRCeUluZGV4KGZyb20sIHRvKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuY29udGVudC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudCh0aGlzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGluIHdoaWNoIHRoZSBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCBpc1xuICAgIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBub2RlLlxuICAgICovXG4gICAgcmVwbGFjZUNoaWxkKGluZGV4LCBub2RlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5jb250ZW50W2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbm9kZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY29weSA9IHRoaXMuY29udGVudC5zbGljZSgpO1xuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUgLSBjdXJyZW50Lm5vZGVTaXplO1xuICAgICAgICBjb3B5W2luZGV4XSA9IG5vZGU7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29weSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBwcmVwZW5kaW5nIHRoZSBnaXZlbiBub2RlIHRvIHRoaXNcbiAgICBmcmFnbWVudC5cbiAgICAqL1xuICAgIGFkZFRvU3RhcnQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2RlXS5jb25jYXQodGhpcy5jb250ZW50KSwgdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIG5vZGUgdG8gdGhpc1xuICAgIGZyYWdtZW50LlxuICAgICovXG4gICAgYWRkVG9FbmQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHRoaXMuY29udGVudC5jb25jYXQobm9kZSksIHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgZnJhZ21lbnQgdG8gYW5vdGhlciBvbmUuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aCAhPSBvdGhlci5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFtpXS5lcShvdGhlci5jb250ZW50W2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIGxhc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBpbiB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleC4gUmFpc2UgYW4gZXJyb3Igd2hlbiB0aGVcbiAgICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgKi9cbiAgICBjaGlsZChpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLmNvbnRlbnRbaW5kZXhdO1xuICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBcIiArIGluZGV4ICsgXCIgb3V0IG9mIHJhbmdlIGZvciBcIiArIHRoaXMpO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGl0IGV4aXN0cy5cbiAgICAqL1xuICAgIG1heWJlQ2hpbGQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFtpbmRleF0gfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV07XG4gICAgICAgICAgICBmKGNoaWxkLCBwLCBpKTtcbiAgICAgICAgICAgIHAgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhpcyBmcmFnbWVudCBhbmQgYW5vdGhlclxuICAgIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICovXG4gICAgZmluZERpZmZTdGFydChvdGhlciwgcG9zID0gMCkge1xuICAgICAgICByZXR1cm4gZmluZERpZmZTdGFydCh0aGlzLCBvdGhlciwgcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24sIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQsIGF0IHdoaWNoIHRoaXNcbiAgICBmcmFnbWVudCBhbmQgdGhlIGdpdmVuIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlXG4gICAgdGhlIHNhbWUuIFNpbmNlIHRoaXMgcG9zaXRpb24gd2lsbCBub3QgYmUgdGhlIHNhbWUgaW4gYm90aFxuICAgIG5vZGVzLCBhbiBvYmplY3Qgd2l0aCB0d28gc2VwYXJhdGUgcG9zaXRpb25zIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZmluZERpZmZFbmQob3RoZXIsIHBvcyA9IHRoaXMuc2l6ZSwgb3RoZXJQb3MgPSBvdGhlci5zaXplKSB7XG4gICAgICAgIHJldHVybiBmaW5kRGlmZkVuZCh0aGlzLCBvdGhlciwgcG9zLCBvdGhlclBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGV4IGFuZCBpbm5lciBvZmZzZXQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHJlbGF0aXZlXG4gICAgcG9zaXRpb24gaW4gdGhpcyBmcmFnbWVudC4gVGhlIHJlc3VsdCBvYmplY3Qgd2lsbCBiZSByZXVzZWRcbiAgICAob3ZlcndyaXR0ZW4pIHRoZSBuZXh0IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gKE5vdCBwdWJsaWMuKVxuICAgICovXG4gICAgZmluZEluZGV4KHBvcywgcm91bmQgPSAtMSkge1xuICAgICAgICBpZiAocG9zID09IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoMCwgcG9zKTtcbiAgICAgICAgaWYgKHBvcyA9PSB0aGlzLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgodGhpcy5jb250ZW50Lmxlbmd0aCwgcG9zKTtcbiAgICAgICAgaWYgKHBvcyA+IHRoaXMuc2l6ZSB8fCBwb3MgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBvc2l0aW9uICR7cG9zfSBvdXRzaWRlIG9mIGZyYWdtZW50ICgke3RoaXN9KWApO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgY3VyUG9zID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHRoaXMuY2hpbGQoaSksIGVuZCA9IGN1clBvcyArIGN1ci5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBwb3MgfHwgcm91bmQgPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoaSArIDEsIGVuZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KGksIGN1clBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZGVidWdnaW5nIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBcIjxcIiArIHRoaXMudG9TdHJpbmdJbm5lcigpICsgXCI+XCI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nSW5uZXIoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuam9pbihcIiwgXCIpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50Lm1hcChuID0+IG4udG9KU09OKCkpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBmcmFnbWVudCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRnJhZ21lbnQuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQodmFsdWUubWFwKHNjaGVtYS5ub2RlRnJvbUpTT04pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBmcmFnbWVudCBmcm9tIGFuIGFycmF5IG9mIG5vZGVzLiBFbnN1cmVzIHRoYXQgYWRqYWNlbnRcbiAgICB0ZXh0IG5vZGVzIHdpdGggdGhlIHNhbWUgbWFya3MgYXJlIGpvaW5lZCB0b2dldGhlci5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQXJyYXkoYXJyYXkpIHtcbiAgICAgICAgaWYgKCFhcnJheS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGxldCBqb2luZWQsIHNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGFycmF5W2ldO1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGkgJiYgbm9kZS5pc1RleHQgJiYgYXJyYXlbaSAtIDFdLnNhbWVNYXJrdXAobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW5lZClcbiAgICAgICAgICAgICAgICAgICAgam9pbmVkID0gYXJyYXkuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgam9pbmVkW2pvaW5lZC5sZW5ndGggLSAxXSA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUZXh0KGpvaW5lZFtqb2luZWQubGVuZ3RoIC0gMV0udGV4dCArIG5vZGUudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChqb2luZWQpIHtcbiAgICAgICAgICAgICAgICBqb2luZWQucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGpvaW5lZCB8fCBhcnJheSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGZyYWdtZW50IGZyb20gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGFcbiAgICBzZXQgb2Ygbm9kZXMuIEZvciBgbnVsbGAsIGl0IHJldHVybnMgdGhlIGVtcHR5IGZyYWdtZW50LiBGb3IgYVxuICAgIGZyYWdtZW50LCB0aGUgZnJhZ21lbnQgaXRzZWxmLiBGb3IgYSBub2RlIG9yIGFycmF5IG9mIG5vZGVzLCBhXG4gICAgZnJhZ21lbnQgY29udGFpbmluZyB0aG9zZSBub2Rlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG5vZGVzKSB7XG4gICAgICAgIGlmICghbm9kZXMpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGlmIChub2RlcyBpbnN0YW5jZW9mIEZyYWdtZW50KVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkobm9kZXMpO1xuICAgICAgICBpZiAobm9kZXMuYXR0cnMpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2Rlc10sIG5vZGVzLm5vZGVTaXplKTtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gbm90IGNvbnZlcnQgXCIgKyBub2RlcyArIFwiIHRvIGEgRnJhZ21lbnRcIiArXG4gICAgICAgICAgICAobm9kZXMubm9kZXNCZXR3ZWVuID8gXCIgKGxvb2tzIGxpa2UgbXVsdGlwbGUgdmVyc2lvbnMgb2YgcHJvc2VtaXJyb3ItbW9kZWwgd2VyZSBsb2FkZWQpXCIgOiBcIlwiKSk7XG4gICAgfVxufVxuLyoqXG5BbiBlbXB0eSBmcmFnbWVudC4gSW50ZW5kZWQgdG8gYmUgcmV1c2VkIHdoZW5ldmVyIGEgbm9kZSBkb2Vzbid0XG5jb250YWluIGFueXRoaW5nIChyYXRoZXIgdGhhbiBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGZyYWdtZW50IGZvclxuZWFjaCBsZWFmIG5vZGUpLlxuKi9cbkZyYWdtZW50LmVtcHR5ID0gbmV3IEZyYWdtZW50KFtdLCAwKTtcbmNvbnN0IGZvdW5kID0geyBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG5mdW5jdGlvbiByZXRJbmRleChpbmRleCwgb2Zmc2V0KSB7XG4gICAgZm91bmQuaW5kZXggPSBpbmRleDtcbiAgICBmb3VuZC5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlRGVlcChhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKGEgJiYgdHlwZW9mIGEgPT0gXCJvYmplY3RcIikgfHxcbiAgICAgICAgIShiICYmIHR5cGVvZiBiID09IFwib2JqZWN0XCIpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiKSAhPSBhcnJheSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghY29tcGFyZURlZXAoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICAgICAgaWYgKCEocCBpbiBiKSB8fCAhY29tcGFyZURlZXAoYVtwXSwgYltwXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgICAgICBpZiAoIShwIGluIGEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuQSBtYXJrIGlzIGEgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBub2RlLFxuc3VjaCBhcyBpdCBiZWluZyBlbXBoYXNpemVkLCBpbiBjb2RlIGZvbnQsIG9yIGEgbGluay4gSXQgaGFzIGFcbnR5cGUgYW5kIG9wdGlvbmFsbHkgYSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgZnVydGhlclxuaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHRhcmdldCBvZiB0aGUgbGluaykuIE1hcmtzIGFyZSBjcmVhdGVkXG50aHJvdWdoIGEgYFNjaGVtYWAsIHdoaWNoIGNvbnRyb2xzIHdoaWNoIHR5cGVzIGV4aXN0IGFuZCB3aGljaFxuYXR0cmlidXRlcyB0aGV5IGhhdmUuXG4qL1xuY2xhc3MgTWFyayB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0aGlzIG1hcmsuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXJrLlxuICAgICovXG4gICAgYXR0cnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgIH1cbiAgICAvKipcbiAgICBHaXZlbiBhIHNldCBvZiBtYXJrcywgY3JlYXRlIGEgbmV3IHNldCB3aGljaCBjb250YWlucyB0aGlzIG9uZSBhc1xuICAgIHdlbGwsIGluIHRoZSByaWdodCBwb3NpdGlvbi4gSWYgdGhpcyBtYXJrIGlzIGFscmVhZHkgaW4gdGhlIHNldCxcbiAgICB0aGUgc2V0IGl0c2VsZiBpcyByZXR1cm5lZC4gSWYgYW55IG1hcmtzIHRoYXQgYXJlIHNldCB0byBiZVxuICAgIFtleGNsdXNpdmVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5leGNsdWRlcykgd2l0aCB0aGlzIG1hcmsgYXJlIHByZXNlbnQsXG4gICAgdGhvc2UgYXJlIHJlcGxhY2VkIGJ5IHRoaXMgb25lLlxuICAgICovXG4gICAgYWRkVG9TZXQoc2V0KSB7XG4gICAgICAgIGxldCBjb3B5LCBwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvdGhlciA9IHNldFtpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKG90aGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZS5leGNsdWRlcyhvdGhlci50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IHNldC5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG90aGVyLnR5cGUuZXhjbHVkZXModGhpcy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBsYWNlZCAmJiBvdGhlci50eXBlLnJhbmsgPiB0aGlzLnR5cGUucmFuaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gc2V0LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2gob3RoZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgIGNvcHkgPSBzZXQuc2xpY2UoKTtcbiAgICAgICAgaWYgKCFwbGFjZWQpXG4gICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmUgdGhpcyBtYXJrIGZyb20gdGhlIGdpdmVuIHNldCwgcmV0dXJuaW5nIGEgbmV3IHNldC4gSWYgdGhpc1xuICAgIG1hcmsgaXMgbm90IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodGhpcy5lcShzZXRbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGlzIGluIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKHNldFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoaXMgbWFyayBoYXMgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlcyBhc1xuICAgIGFub3RoZXIgbWFyay5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAodGhpcy50eXBlID09IG90aGVyLnR5cGUgJiYgY29tcGFyZURlZXAodGhpcy5hdHRycywgb3RoZXIuYXR0cnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIG1hcmsgdG8gYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIEpTT04uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgTWFyay5mcm9tSlNPTlwiKTtcbiAgICAgICAgbGV0IHR5cGUgPSBzY2hlbWEubWFya3NbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZXJlIGlzIG5vIG1hcmsgdHlwZSAke2pzb24udHlwZX0gaW4gdGhpcyBzY2hlbWFgKTtcbiAgICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlKGpzb24uYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdHdvIHNldHMgb2YgbWFya3MgYXJlIGlkZW50aWNhbC5cbiAgICAqL1xuICAgIHN0YXRpYyBzYW1lU2V0KGEsIGIpIHtcbiAgICAgICAgaWYgKGEgPT0gYilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwcm9wZXJseSBzb3J0ZWQgbWFyayBzZXQgZnJvbSBudWxsLCBhIHNpbmdsZSBtYXJrLCBvciBhblxuICAgIHVuc29ydGVkIGFycmF5IG9mIG1hcmtzLlxuICAgICovXG4gICAgc3RhdGljIHNldEZyb20obWFya3MpIHtcbiAgICAgICAgaWYgKCFtYXJrcyB8fCBBcnJheS5pc0FycmF5KG1hcmtzKSAmJiBtYXJrcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIGlmIChtYXJrcyBpbnN0YW5jZW9mIE1hcmspXG4gICAgICAgICAgICByZXR1cm4gW21hcmtzXTtcbiAgICAgICAgbGV0IGNvcHkgPSBtYXJrcy5zbGljZSgpO1xuICAgICAgICBjb3B5LnNvcnQoKGEsIGIpID0+IGEudHlwZS5yYW5rIC0gYi50eXBlLnJhbmspO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgbWFya3MuXG4qL1xuTWFyay5ub25lID0gW107XG5cbi8qKlxuRXJyb3IgdHlwZSByYWlzZWQgYnkgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aGVuXG5naXZlbiBhbiBpbnZhbGlkIHJlcGxhY2VtZW50LlxuKi9cbmNsYXNzIFJlcGxhY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qXG5SZXBsYWNlRXJyb3IgPSBmdW5jdGlvbih0aGlzOiBhbnksIG1lc3NhZ2U6IHN0cmluZykge1xuICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKVxuICA7KGVyciBhcyBhbnkpLl9fcHJvdG9fXyA9IFJlcGxhY2VFcnJvci5wcm90b3R5cGVcbiAgcmV0dXJuIGVyclxufSBhcyBhbnlcblxuUmVwbGFjZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlcGxhY2VFcnJvclxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJSZXBsYWNlRXJyb3JcIlxuKi9cbi8qKlxuQSBzbGljZSByZXByZXNlbnRzIGEgcGllY2UgY3V0IG91dCBvZiBhIGxhcmdlciBkb2N1bWVudC4gSXRcbnN0b3JlcyBub3Qgb25seSBhIGZyYWdtZW50LCBidXQgYWxzbyB0aGUgZGVwdGggdXAgdG8gd2hpY2ggbm9kZXMgb25cbmJvdGggc2lkZSBhcmUgXHUyMDE4b3Blblx1MjAxOSAoY3V0IHRocm91Z2gpLlxuKi9cbmNsYXNzIFNsaWNlIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzbGljZS4gV2hlbiBzcGVjaWZ5aW5nIGEgbm9uLXplcm8gb3BlbiBkZXB0aCwgeW91IG11c3RcbiAgICBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm9kZXMgb2YgYXQgbGVhc3QgdGhhdCBkZXB0aCBhdCB0aGVcbiAgICBhcHByb3ByaWF0ZSBzaWRlIG9mIHRoZSBmcmFnbWVudFx1MjAxNGkuZS4gaWYgdGhlIGZyYWdtZW50IGlzIGFuXG4gICAgZW1wdHkgcGFyYWdyYXBoIG5vZGUsIGBvcGVuU3RhcnRgIGFuZCBgb3BlbkVuZGAgY2FuJ3QgYmUgZ3JlYXRlclxuICAgIHRoYW4gMS5cbiAgICBcbiAgICBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgY29udGVudCBvZiBvcGVuIG5vZGVzIHRvIGNvbmZvcm0gdG9cbiAgICB0aGUgc2NoZW1hJ3MgY29udGVudCBjb25zdHJhaW50cywgdGhvdWdoIGl0IHNob3VsZCBiZSBhIHZhbGlkXG4gICAgc3RhcnQvZW5kL21pZGRsZSBmb3Igc3VjaCBhIG5vZGUsIGRlcGVuZGluZyBvbiB3aGljaCBzaWRlcyBhcmVcbiAgICBvcGVuLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHNsaWNlJ3MgY29udGVudC5cbiAgICAqL1xuICAgIGNvbnRlbnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBvcGVuU3RhcnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBlbmQuXG4gICAgKi9cbiAgICBvcGVuRW5kKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSBvcGVuRW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSB0aGlzIHNsaWNlIHdvdWxkIGFkZCB3aGVuIGluc2VydGVkIGludG8gYSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnNpemUgLSB0aGlzLm9wZW5TdGFydCAtIHRoaXMub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRBdChwb3MsIGZyYWdtZW50KSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gaW5zZXJ0SW50byh0aGlzLmNvbnRlbnQsIHBvcyArIHRoaXMub3BlblN0YXJ0LCBmcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBjb250ZW50ICYmIG5ldyBTbGljZShjb250ZW50LCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZW1vdmVCZXR3ZWVuKGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UocmVtb3ZlUmFuZ2UodGhpcy5jb250ZW50LCBmcm9tICsgdGhpcy5vcGVuU3RhcnQsIHRvICsgdGhpcy5vcGVuU3RhcnQpLCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGlzIHNsaWNlIGlzIGVxdWFsIHRvIGFub3RoZXIgc2xpY2UuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpICYmIHRoaXMub3BlblN0YXJ0ID09IG90aGVyLm9wZW5TdGFydCAmJiB0aGlzLm9wZW5FbmQgPT0gb3RoZXIub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudCArIFwiKFwiICsgdGhpcy5vcGVuU3RhcnQgKyBcIixcIiArIHRoaXMub3BlbkVuZCArIFwiKVwiO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgc2xpY2UgdG8gYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQganNvbiA9IHsgY29udGVudDogdGhpcy5jb250ZW50LnRvSlNPTigpIH07XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA+IDApXG4gICAgICAgICAgICBqc29uLm9wZW5TdGFydCA9IHRoaXMub3BlblN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5vcGVuRW5kID4gMClcbiAgICAgICAgICAgIGpzb24ub3BlbkVuZCA9IHRoaXMub3BlbkVuZDtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgc2xpY2UgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0ganNvbi5vcGVuU3RhcnQgfHwgMCwgb3BlbkVuZCA9IGpzb24ub3BlbkVuZCB8fCAwO1xuICAgICAgICBpZiAodHlwZW9mIG9wZW5TdGFydCAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBvcGVuRW5kICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFNsaWNlLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2xpY2UgZnJvbSBhIGZyYWdtZW50IGJ5IHRha2luZyB0aGUgbWF4aW11bSBwb3NzaWJsZVxuICAgIG9wZW4gdmFsdWUgb24gYm90aCBzaWRlIG9mIHRoZSBmcmFnbWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXhPcGVuKGZyYWdtZW50LCBvcGVuSXNvbGF0aW5nID0gdHJ1ZSkge1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0gMCwgb3BlbkVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IG4gPSBmcmFnbWVudC5maXJzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIG9wZW5TdGFydCsrO1xuICAgICAgICBmb3IgKGxldCBuID0gZnJhZ21lbnQubGFzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4ubGFzdENoaWxkKVxuICAgICAgICAgICAgb3BlbkVuZCsrO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGZyYWdtZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNsaWNlLlxuKi9cblNsaWNlLmVtcHR5ID0gbmV3IFNsaWNlKEZyYWdtZW50LmVtcHR5LCAwLCAwKTtcbmZ1bmN0aW9uIHJlbW92ZVJhbmdlKGNvbnRlbnQsIGZyb20sIHRvKSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZnJvbSksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBsZXQgeyBpbmRleDogaW5kZXhUbywgb2Zmc2V0OiBvZmZzZXRUbyB9ID0gY29udGVudC5maW5kSW5kZXgodG8pO1xuICAgIGlmIChvZmZzZXQgPT0gZnJvbSB8fCBjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgaWYgKG9mZnNldFRvICE9IHRvICYmICFjb250ZW50LmNoaWxkKGluZGV4VG8pLmlzVGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBjb250ZW50LmN1dCgwLCBmcm9tKS5hcHBlbmQoY29udGVudC5jdXQodG8pKTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9IGluZGV4VG8pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBjaGlsZC5jb3B5KHJlbW92ZVJhbmdlKGNoaWxkLmNvbnRlbnQsIGZyb20gLSBvZmZzZXQgLSAxLCB0byAtIG9mZnNldCAtIDEpKSk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbnRvKGNvbnRlbnQsIGRpc3QsIGluc2VydCwgcGFyZW50KSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZGlzdCksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBpZiAob2Zmc2V0ID09IGRpc3QgfHwgY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5jYW5SZXBsYWNlKGluZGV4LCBpbmRleCwgaW5zZXJ0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gY29udGVudC5jdXQoMCwgZGlzdCkuYXBwZW5kKGluc2VydCkuYXBwZW5kKGNvbnRlbnQuY3V0KGRpc3QpKTtcbiAgICB9XG4gICAgbGV0IGlubmVyID0gaW5zZXJ0SW50byhjaGlsZC5jb250ZW50LCBkaXN0IC0gb2Zmc2V0IC0gMSwgaW5zZXJ0KTtcbiAgICByZXR1cm4gaW5uZXIgJiYgY29udGVudC5yZXBsYWNlQ2hpbGQoaW5kZXgsIGNoaWxkLmNvcHkoaW5uZXIpKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2UoJGZyb20sICR0bywgc2xpY2UpIHtcbiAgICBpZiAoc2xpY2Uub3BlblN0YXJ0ID4gJGZyb20uZGVwdGgpXG4gICAgICAgIHRocm93IG5ldyBSZXBsYWNlRXJyb3IoXCJJbnNlcnRlZCBjb250ZW50IGRlZXBlciB0aGFuIGluc2VydGlvbiBwb3NpdGlvblwiKTtcbiAgICBpZiAoJGZyb20uZGVwdGggLSBzbGljZS5vcGVuU3RhcnQgIT0gJHRvLmRlcHRoIC0gc2xpY2Uub3BlbkVuZClcbiAgICAgICAgdGhyb3cgbmV3IFJlcGxhY2VFcnJvcihcIkluY29uc2lzdGVudCBvcGVuIGRlcHRoc1wiKTtcbiAgICByZXR1cm4gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCAwKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGgpIHtcbiAgICBsZXQgaW5kZXggPSAkZnJvbS5pbmRleChkZXB0aCksIG5vZGUgPSAkZnJvbS5ub2RlKGRlcHRoKTtcbiAgICBpZiAoaW5kZXggPT0gJHRvLmluZGV4KGRlcHRoKSAmJiBkZXB0aCA8ICRmcm9tLmRlcHRoIC0gc2xpY2Uub3BlblN0YXJ0KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGggKyAxKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuY29weShub2RlLmNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBpbm5lcikpO1xuICAgIH1cbiAgICBlbHNlIGlmICghc2xpY2UuY29udGVudC5zaXplKSB7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFzbGljZS5vcGVuU3RhcnQgJiYgIXNsaWNlLm9wZW5FbmQgJiYgJGZyb20uZGVwdGggPT0gZGVwdGggJiYgJHRvLmRlcHRoID09IGRlcHRoKSB7IC8vIFNpbXBsZSwgZmxhdCBjYXNlXG4gICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5wYXJlbnQsIGNvbnRlbnQgPSBwYXJlbnQuY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNsb3NlKHBhcmVudCwgY29udGVudC5jdXQoMCwgJGZyb20ucGFyZW50T2Zmc2V0KS5hcHBlbmQoc2xpY2UuY29udGVudCkuYXBwZW5kKGNvbnRlbnQuY3V0KCR0by5wYXJlbnRPZmZzZXQpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBwcmVwYXJlU2xpY2VGb3JSZXBsYWNlKHNsaWNlLCAkZnJvbSk7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVGhyZWVXYXkoJGZyb20sIHN0YXJ0LCBlbmQsICR0bywgZGVwdGgpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0pvaW4obWFpbiwgc3ViKSB7XG4gICAgaWYgKCFzdWIudHlwZS5jb21wYXRpYmxlQ29udGVudChtYWluLnR5cGUpKVxuICAgICAgICB0aHJvdyBuZXcgUmVwbGFjZUVycm9yKFwiQ2Fubm90IGpvaW4gXCIgKyBzdWIudHlwZS5uYW1lICsgXCIgb250byBcIiArIG1haW4udHlwZS5uYW1lKTtcbn1cbmZ1bmN0aW9uIGpvaW5hYmxlKCRiZWZvcmUsICRhZnRlciwgZGVwdGgpIHtcbiAgICBsZXQgbm9kZSA9ICRiZWZvcmUubm9kZShkZXB0aCk7XG4gICAgY2hlY2tKb2luKG5vZGUsICRhZnRlci5ub2RlKGRlcHRoKSk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBhZGROb2RlKGNoaWxkLCB0YXJnZXQpIHtcbiAgICBsZXQgbGFzdCA9IHRhcmdldC5sZW5ndGggLSAxO1xuICAgIGlmIChsYXN0ID49IDAgJiYgY2hpbGQuaXNUZXh0ICYmIGNoaWxkLnNhbWVNYXJrdXAodGFyZ2V0W2xhc3RdKSlcbiAgICAgICAgdGFyZ2V0W2xhc3RdID0gY2hpbGQud2l0aFRleHQodGFyZ2V0W2xhc3RdLnRleHQgKyBjaGlsZC50ZXh0KTtcbiAgICBlbHNlXG4gICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFkZFJhbmdlKCRzdGFydCwgJGVuZCwgZGVwdGgsIHRhcmdldCkge1xuICAgIGxldCBub2RlID0gKCRlbmQgfHwgJHN0YXJ0KS5ub2RlKGRlcHRoKTtcbiAgICBsZXQgc3RhcnRJbmRleCA9IDAsIGVuZEluZGV4ID0gJGVuZCA/ICRlbmQuaW5kZXgoZGVwdGgpIDogbm9kZS5jaGlsZENvdW50O1xuICAgIGlmICgkc3RhcnQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9ICRzdGFydC5pbmRleChkZXB0aCk7XG4gICAgICAgIGlmICgkc3RhcnQuZGVwdGggPiBkZXB0aCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCRzdGFydC50ZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICBhZGROb2RlKCRzdGFydC5ub2RlQWZ0ZXIsIHRhcmdldCk7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKVxuICAgICAgICBhZGROb2RlKG5vZGUuY2hpbGQoaSksIHRhcmdldCk7XG4gICAgaWYgKCRlbmQgJiYgJGVuZC5kZXB0aCA9PSBkZXB0aCAmJiAkZW5kLnRleHRPZmZzZXQpXG4gICAgICAgIGFkZE5vZGUoJGVuZC5ub2RlQmVmb3JlLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gY2xvc2Uobm9kZSwgY29udGVudCkge1xuICAgIG5vZGUudHlwZS5jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgcmV0dXJuIG5vZGUuY29weShjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgJHN0YXJ0LCAkZW5kLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IG9wZW5TdGFydCA9ICRmcm9tLmRlcHRoID4gZGVwdGggJiYgam9pbmFibGUoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKTtcbiAgICBsZXQgb3BlbkVuZCA9ICR0by5kZXB0aCA+IGRlcHRoICYmIGpvaW5hYmxlKCRlbmQsICR0bywgZGVwdGggKyAxKTtcbiAgICBsZXQgY29udGVudCA9IFtdO1xuICAgIGFkZFJhbmdlKG51bGwsICRmcm9tLCBkZXB0aCwgY29udGVudCk7XG4gICAgaWYgKG9wZW5TdGFydCAmJiBvcGVuRW5kICYmICRzdGFydC5pbmRleChkZXB0aCkgPT0gJGVuZC5pbmRleChkZXB0aCkpIHtcbiAgICAgICAgY2hlY2tKb2luKG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIGFkZE5vZGUoY2xvc2Uob3BlblN0YXJ0LCByZXBsYWNlVGhyZWVXYXkoJGZyb20sICRzdGFydCwgJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAob3BlblN0YXJ0KVxuICAgICAgICAgICAgYWRkTm9kZShjbG9zZShvcGVuU3RhcnQsIHJlcGxhY2VUd29XYXkoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgICAgICBhZGRSYW5nZSgkc3RhcnQsICRlbmQsIGRlcHRoLCBjb250ZW50KTtcbiAgICAgICAgaWYgKG9wZW5FbmQpXG4gICAgICAgICAgICBhZGROb2RlKGNsb3NlKG9wZW5FbmQsIHJlcGxhY2VUd29XYXkoJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGFkZFJhbmdlKCR0bywgbnVsbCwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29udGVudCk7XG59XG5mdW5jdGlvbiByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXTtcbiAgICBhZGRSYW5nZShudWxsLCAkZnJvbSwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIGlmICgkZnJvbS5kZXB0aCA+IGRlcHRoKSB7XG4gICAgICAgIGxldCB0eXBlID0gam9pbmFibGUoJGZyb20sICR0bywgZGVwdGggKyAxKTtcbiAgICAgICAgYWRkTm9kZShjbG9zZSh0eXBlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgYWRkUmFuZ2UoJHRvLCBudWxsLCBkZXB0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTbGljZUZvclJlcGxhY2Uoc2xpY2UsICRhbG9uZykge1xuICAgIGxldCBleHRyYSA9ICRhbG9uZy5kZXB0aCAtIHNsaWNlLm9wZW5TdGFydCwgcGFyZW50ID0gJGFsb25nLm5vZGUoZXh0cmEpO1xuICAgIGxldCBub2RlID0gcGFyZW50LmNvcHkoc2xpY2UuY29udGVudCk7XG4gICAgZm9yIChsZXQgaSA9IGV4dHJhIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIG5vZGUgPSAkYWxvbmcubm9kZShpKS5jb3B5KEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiB7IHN0YXJ0OiBub2RlLnJlc29sdmVOb0NhY2hlKHNsaWNlLm9wZW5TdGFydCArIGV4dHJhKSxcbiAgICAgICAgZW5kOiBub2RlLnJlc29sdmVOb0NhY2hlKG5vZGUuY29udGVudC5zaXplIC0gc2xpY2Uub3BlbkVuZCAtIGV4dHJhKSB9O1xufVxuXG4vKipcbllvdSBjYW4gW19yZXNvbHZlX10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUucmVzb2x2ZSkgYSBwb3NpdGlvbiB0byBnZXQgbW9yZVxuaW5mb3JtYXRpb24gYWJvdXQgaXQuIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgc3VjaCBhXG5yZXNvbHZlZCBwb3NpdGlvbiwgcHJvdmlkaW5nIHZhcmlvdXMgcGllY2VzIG9mIGNvbnRleHRcbmluZm9ybWF0aW9uLCBhbmQgc29tZSBoZWxwZXIgbWV0aG9kcy5cblxuVGhyb3VnaG91dCB0aGlzIGludGVyZmFjZSwgbWV0aG9kcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgYGRlcHRoYFxucGFyYW1ldGVyIHdpbGwgaW50ZXJwcmV0IHVuZGVmaW5lZCBhcyBgdGhpcy5kZXB0aGAgYW5kIG5lZ2F0aXZlXG5udW1iZXJzIGFzIGB0aGlzLmRlcHRoICsgdmFsdWVgLlxuKi9cbmNsYXNzIFJlc29sdmVkUG9zIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiB0aGF0IHdhcyByZXNvbHZlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBwYXRoLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IHRoaXMgcG9zaXRpb24gaGFzIGludG8gaXRzIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgcGFyZW50T2Zmc2V0KSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnBhcmVudE9mZnNldCA9IHBhcmVudE9mZnNldDtcbiAgICAgICAgdGhpcy5kZXB0aCA9IHBhdGgubGVuZ3RoIC8gMyAtIDE7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZURlcHRoKHZhbCkge1xuICAgICAgICBpZiAodmFsID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aDtcbiAgICAgICAgaWYgKHZhbCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aCArIHZhbDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHBvc2l0aW9uIHBvaW50cyBpbnRvLiBOb3RlIHRoYXQgZXZlbiBpZlxuICAgIGEgcG9zaXRpb24gcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIHRoYXQgbm9kZSBpcyBub3QgY29uc2lkZXJlZFxuICAgIHRoZSBwYXJlbnRcdTIwMTR0ZXh0IG5vZGVzIGFyZSBcdTIwMThmbGF0XHUyMDE5IGluIHRoaXMgbW9kZWwsIGFuZCBoYXZlIG5vIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgcGFyZW50KCkgeyByZXR1cm4gdGhpcy5ub2RlKHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIHJvb3Qgbm9kZSBpbiB3aGljaCB0aGUgcG9zaXRpb24gd2FzIHJlc29sdmVkLlxuICAgICovXG4gICAgZ2V0IGRvYygpIHsgcmV0dXJuIHRoaXMubm9kZSgwKTsgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNlc3RvciBub2RlIGF0IHRoZSBnaXZlbiBsZXZlbC4gYHAubm9kZShwLmRlcHRoKWAgaXMgdGhlXG4gICAgc2FtZSBhcyBgcC5wYXJlbnRgLlxuICAgICovXG4gICAgbm9kZShkZXB0aCkgeyByZXR1cm4gdGhpcy5wYXRoW3RoaXMucmVzb2x2ZURlcHRoKGRlcHRoKSAqIDNdOyB9XG4gICAgLyoqXG4gICAgVGhlIGluZGV4IGludG8gdGhlIGFuY2VzdG9yIGF0IHRoZSBnaXZlbiBsZXZlbC4gSWYgdGhpcyBwb2ludHNcbiAgICBhdCB0aGUgM3JkIG5vZGUgaW4gdGhlIDJuZCBwYXJhZ3JhcGggb24gdGhlIHRvcCBsZXZlbCwgZm9yXG4gICAgZXhhbXBsZSwgYHAuaW5kZXgoMClgIGlzIDEgYW5kIGBwLmluZGV4KDEpYCBpcyAyLlxuICAgICovXG4gICAgaW5kZXgoZGVwdGgpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnJlc29sdmVEZXB0aChkZXB0aCkgKiAzICsgMV07IH1cbiAgICAvKipcbiAgICBUaGUgaW5kZXggcG9pbnRpbmcgYWZ0ZXIgdGhpcyBwb3NpdGlvbiBpbnRvIHRoZSBhbmNlc3RvciBhdCB0aGVcbiAgICBnaXZlbiBsZXZlbC5cbiAgICAqL1xuICAgIGluZGV4QWZ0ZXIoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4KGRlcHRoKSArIChkZXB0aCA9PSB0aGlzLmRlcHRoICYmICF0aGlzLnRleHRPZmZzZXQgPyAwIDogMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW5cbiAgICBsZXZlbC5cbiAgICAqL1xuICAgIHN0YXJ0KGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gMCA/IDAgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV0gKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBub2RlIGF0IHRoZSBnaXZlblxuICAgIGxldmVsLlxuICAgICovXG4gICAgZW5kKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydChkZXB0aCkgKyB0aGlzLm5vZGUoZGVwdGgpLmNvbnRlbnQuc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYmVmb3JlIHRoZSB3cmFwcGluZyBub2RlIGF0IHRoZVxuICAgIGdpdmVuIGxldmVsLCBvciwgd2hlbiBgZGVwdGhgIGlzIGB0aGlzLmRlcHRoICsgMWAsIHRoZSBvcmlnaW5hbFxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgYmVmb3JlKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBiZWZvcmUgdGhlIHRvcC1sZXZlbCBub2RlXCIpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gdGhpcy5kZXB0aCArIDEgPyB0aGlzLnBvcyA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYWZ0ZXIgdGhlIHdyYXBwaW5nIG5vZGUgYXQgdGhlXG4gICAgZ2l2ZW4gbGV2ZWwsIG9yIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiB3aGVuIGBkZXB0aGAgaXMgYHRoaXMuZGVwdGggKyAxYC5cbiAgICAqL1xuICAgIGFmdGVyKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBhZnRlciB0aGUgdG9wLWxldmVsIG5vZGVcIik7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSB0aGlzLmRlcHRoICsgMSA/IHRoaXMucG9zIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdICsgdGhpcy5wYXRoW2RlcHRoICogM10ubm9kZVNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhpcyBwb3NpdGlvbiBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgdGhpcyByZXR1cm5zIHRoZVxuICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgbm9kZS5cbiAgICBXaWxsIGJlIHplcm8gZm9yIHBvc2l0aW9ucyB0aGF0IHBvaW50IGJldHdlZW4gbm9kZXMuXG4gICAgKi9cbiAgICBnZXQgdGV4dE9mZnNldCgpIHsgcmV0dXJuIHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBhZnRlciB0aGUgcG9zaXRpb24sIGlmIGFueS4gSWYgdGhlIHBvc2l0aW9uXG4gICAgcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgb2YgdGhhdCBub2RlIGFmdGVyIHRoZVxuICAgIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZ2V0IG5vZGVBZnRlcigpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50LCBpbmRleCA9IHRoaXMuaW5kZXgodGhpcy5kZXB0aCk7XG4gICAgICAgIGlmIChpbmRleCA9PSBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZE9mZiA9IHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXSwgY2hpbGQgPSBwYXJlbnQuY2hpbGQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gZE9mZiA/IHBhcmVudC5jaGlsZChpbmRleCkuY3V0KGRPZmYpIDogY2hpbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBiZWZvcmUgdGhlIHBvc2l0aW9uLCBpZiBhbnkuIElmIHRoZVxuICAgIHBvc2l0aW9uIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCBvbmx5IHRoZSBwYXJ0IG9mIHRoYXQgbm9kZVxuICAgIGJlZm9yZSB0aGUgcG9zaXRpb24gaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBnZXQgbm9kZUJlZm9yZSgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5pbmRleCh0aGlzLmRlcHRoKTtcbiAgICAgICAgbGV0IGRPZmYgPSB0aGlzLnBvcyAtIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChkT2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkKGluZGV4KS5jdXQoMCwgZE9mZik7XG4gICAgICAgIHJldHVybiBpbmRleCA9PSAwID8gbnVsbCA6IHRoaXMucGFyZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcG9zaXRpb24gYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBwYXJlbnQgbm9kZSBhdCB0aGVcbiAgICBnaXZlbiBkZXB0aCAod2hpY2ggZGVmYXVsdHMgdG8gYHRoaXMuZGVwdGhgKS5cbiAgICAqL1xuICAgIHBvc0F0SW5kZXgoaW5kZXgsIGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMucGF0aFtkZXB0aCAqIDNdLCBwb3MgPSBkZXB0aCA9PSAwID8gMCA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXSArIDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgICAgICAgIHBvcyArPSBub2RlLmNoaWxkKGkpLm5vZGVTaXplO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGF0IHRoaXMgcG9zaXRpb24sIGZhY3RvcmluZyBpbiB0aGUgc3Vycm91bmRpbmdcbiAgICBtYXJrcycgW2BpbmNsdXNpdmVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMuaW5jbHVzaXZlKSBwcm9wZXJ0eS4gSWYgdGhlXG4gICAgcG9zaXRpb24gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbm9uLWVtcHR5IG5vZGUsIHRoZSBtYXJrcyBvZiB0aGVcbiAgICBub2RlIGFmdGVyIGl0IChpZiBhbnkpIGFyZSByZXR1cm5lZC5cbiAgICAqL1xuICAgIG1hcmtzKCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQsIGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgICAvLyBJbiBhbiBlbXB0eSBwYXJlbnQsIHJldHVybiB0aGUgZW1wdHkgYXJyYXlcbiAgICAgICAgaWYgKHBhcmVudC5jb250ZW50LnNpemUgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIC8vIFdoZW4gaW5zaWRlIGEgdGV4dCBub2RlLCBqdXN0IHJldHVybiB0aGUgdGV4dCBub2RlJ3MgbWFya3NcbiAgICAgICAgaWYgKHRoaXMudGV4dE9mZnNldClcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY2hpbGQoaW5kZXgpLm1hcmtzO1xuICAgICAgICBsZXQgbWFpbiA9IHBhcmVudC5tYXliZUNoaWxkKGluZGV4IC0gMSksIG90aGVyID0gcGFyZW50Lm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAvLyBJZiB0aGUgYGFmdGVyYCBmbGFnIGlzIHRydWUgb2YgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUsIG1ha2VcbiAgICAgICAgLy8gdGhlIG5vZGUgYWZ0ZXIgdGhpcyBwb3NpdGlvbiB0aGUgbWFpbiByZWZlcmVuY2UuXG4gICAgICAgIGlmICghbWFpbikge1xuICAgICAgICAgICAgbGV0IHRtcCA9IG1haW47XG4gICAgICAgICAgICBtYWluID0gb3RoZXI7XG4gICAgICAgICAgICBvdGhlciA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgYWxsIG1hcmtzIGluIHRoZSBtYWluIG5vZGUsIGV4Y2VwdCB0aG9zZSB0aGF0IGhhdmVcbiAgICAgICAgLy8gYGluY2x1c2l2ZWAgc2V0IHRvIGZhbHNlIGFuZCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG90aGVyIG5vZGUuXG4gICAgICAgIGxldCBtYXJrcyA9IG1haW4ubWFya3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFvdGhlciB8fCAhbWFya3NbaV0uaXNJblNldChvdGhlci5tYXJrcykpKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3NbaS0tXS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpZiBhbnksIGV4Y2VwdCB0aG9zZVxuICAgIHRoYXQgYXJlIG5vbi1pbmNsdXNpdmUgYW5kIG5vdCBwcmVzZW50IGF0IHBvc2l0aW9uIGAkZW5kYC4gVGhpc1xuICAgIGlzIG1vc3RseSB1c2VmdWwgZm9yIGdldHRpbmcgdGhlIHNldCBvZiBtYXJrcyB0byBwcmVzZXJ2ZSBhZnRlciBhXG4gICAgZGVsZXRpb24uIFdpbGwgcmV0dXJuIGBudWxsYCBpZiB0aGlzIHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2ZcbiAgICBpdHMgcGFyZW50IG5vZGUgb3IgaXRzIHBhcmVudCBub2RlIGlzbid0IGEgdGV4dGJsb2NrIChpbiB3aGljaFxuICAgIGNhc2Ugbm8gbWFya3Mgc2hvdWxkIGJlIHByZXNlcnZlZCkuXG4gICAgKi9cbiAgICBtYXJrc0Fjcm9zcygkZW5kKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMucGFyZW50Lm1heWJlQ2hpbGQodGhpcy5pbmRleCgpKTtcbiAgICAgICAgaWYgKCFhZnRlciB8fCAhYWZ0ZXIuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG1hcmtzID0gYWZ0ZXIubWFya3MsIG5leHQgPSAkZW5kLnBhcmVudC5tYXliZUNoaWxkKCRlbmQuaW5kZXgoKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFuZXh0IHx8ICFtYXJrc1tpXS5pc0luU2V0KG5leHQubWFya3MpKSlcbiAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzW2ktLV0ucmVtb3ZlRnJvbVNldChtYXJrcyk7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIHVwIHRvIHdoaWNoIHRoaXMgcG9zaXRpb24gYW5kIHRoZSBnaXZlbiAobm9uLXJlc29sdmVkKVxuICAgIHBvc2l0aW9uIHNoYXJlIHRoZSBzYW1lIHBhcmVudCBub2Rlcy5cbiAgICAqL1xuICAgIHNoYXJlZERlcHRoKHBvcykge1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IHRoaXMuZGVwdGg7IGRlcHRoID4gMDsgZGVwdGgtLSlcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0KGRlcHRoKSA8PSBwb3MgJiYgdGhpcy5lbmQoZGVwdGgpID49IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVwdGg7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgcmFuZ2UgYmFzZWQgb24gdGhlIHBsYWNlIHdoZXJlIHRoaXMgcG9zaXRpb24gYW5kIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9uIGRpdmVyZ2UgYXJvdW5kIGJsb2NrIGNvbnRlbnQuIElmIGJvdGggcG9pbnQgaW50b1xuICAgIHRoZSBzYW1lIHRleHRibG9jaywgZm9yIGV4YW1wbGUsIGEgcmFuZ2UgYXJvdW5kIHRoYXQgdGV4dGJsb2NrXG4gICAgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhleSBwb2ludCBpbnRvIGRpZmZlcmVudCBibG9ja3MsIHRoZSByYW5nZVxuICAgIGFyb3VuZCB0aG9zZSBibG9ja3MgaW4gdGhlaXIgc2hhcmVkIGFuY2VzdG9yIGlzIHJldHVybmVkLiBZb3UgY2FuXG4gICAgcGFzcyBpbiBhbiBvcHRpb25hbCBwcmVkaWNhdGUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgcGFyZW50XG4gICAgbm9kZSB0byBzZWUgaWYgYSByYW5nZSBpbnRvIHRoYXQgcGFyZW50IGlzIGFjY2VwdGFibGUuXG4gICAgKi9cbiAgICBibG9ja1JhbmdlKG90aGVyID0gdGhpcywgcHJlZCkge1xuICAgICAgICBpZiAob3RoZXIucG9zIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICByZXR1cm4gb3RoZXIuYmxvY2tSYW5nZSh0aGlzKTtcbiAgICAgICAgZm9yIChsZXQgZCA9IHRoaXMuZGVwdGggLSAodGhpcy5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB0aGlzLnBvcyA9PSBvdGhlci5wb3MgPyAxIDogMCk7IGQgPj0gMDsgZC0tKVxuICAgICAgICAgICAgaWYgKG90aGVyLnBvcyA8PSB0aGlzLmVuZChkKSAmJiAoIXByZWQgfHwgcHJlZCh0aGlzLm5vZGUoZCkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVSYW5nZSh0aGlzLCBvdGhlciwgZCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyeSB3aGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbiBzaGFyZXMgdGhlIHNhbWUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBzYW1lUGFyZW50KG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyAtIHRoaXMucGFyZW50T2Zmc2V0ID09IG90aGVyLnBvcyAtIG90aGVyLnBhcmVudE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBncmVhdGVyIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG1heChvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIucG9zID4gdGhpcy5wb3MgPyBvdGhlciA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgc21hbGxlciBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBtaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLnBvcyA8IHRoaXMucG9zID8gb3RoZXIgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgc3RyID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdGhpcy5kZXB0aDsgaSsrKVxuICAgICAgICAgICAgc3RyICs9IChzdHIgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy5ub2RlKGkpLnR5cGUubmFtZSArIFwiX1wiICsgdGhpcy5pbmRleChpIC0gMSk7XG4gICAgICAgIHJldHVybiBzdHIgKyBcIjpcIiArIHRoaXMucGFyZW50T2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKGRvYywgcG9zKSB7XG4gICAgICAgIGlmICghKHBvcyA+PSAwICYmIHBvcyA8PSBkb2MuY29udGVudC5zaXplKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUG9zaXRpb24gXCIgKyBwb3MgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICAgIGxldCBwYXRoID0gW107XG4gICAgICAgIGxldCBzdGFydCA9IDAsIHBhcmVudE9mZnNldCA9IHBvcztcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IGRvYzs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBhcmVudE9mZnNldCk7XG4gICAgICAgICAgICBsZXQgcmVtID0gcGFyZW50T2Zmc2V0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUsIGluZGV4LCBzdGFydCArIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoIXJlbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBhcmVudE9mZnNldCA9IHJlbSAtIDE7XG4gICAgICAgICAgICBzdGFydCArPSBvZmZzZXQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQb3MocG9zLCBwYXRoLCBwYXJlbnRPZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlQ2FjaGVkKGRvYywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2FjaGVkID0gcmVzb2x2ZUNhY2hlW2ldO1xuICAgICAgICAgICAgaWYgKGNhY2hlZC5wb3MgPT0gcG9zICYmIGNhY2hlZC5kb2MgPT0gZG9jKVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc29sdmVDYWNoZVtyZXNvbHZlQ2FjaGVQb3NdID0gUmVzb2x2ZWRQb3MucmVzb2x2ZShkb2MsIHBvcyk7XG4gICAgICAgIHJlc29sdmVDYWNoZVBvcyA9IChyZXNvbHZlQ2FjaGVQb3MgKyAxKSAlIHJlc29sdmVDYWNoZVNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxubGV0IHJlc29sdmVDYWNoZSA9IFtdLCByZXNvbHZlQ2FjaGVQb3MgPSAwLCByZXNvbHZlQ2FjaGVTaXplID0gMTI7XG4vKipcblJlcHJlc2VudHMgYSBmbGF0IHJhbmdlIG9mIGNvbnRlbnQsIGkuZS4gb25lIHRoYXQgc3RhcnRzIGFuZFxuZW5kcyBpbiB0aGUgc2FtZSBub2RlLlxuKi9cbmNsYXNzIE5vZGVSYW5nZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbm9kZSByYW5nZS4gYCRmcm9tYCBhbmQgYCR0b2Agc2hvdWxkIHBvaW50IGludG8gdGhlXG4gICAgc2FtZSBub2RlIHVudGlsIGF0IGxlYXN0IHRoZSBnaXZlbiBgZGVwdGhgLCBzaW5jZSBhIG5vZGUgcmFuZ2VcbiAgICBkZW5vdGVzIGFuIGFkamFjZW50IHNldCBvZiBub2RlcyBpbiBhIHNpbmdsZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEEgcmVzb2x2ZWQgcG9zaXRpb24gYWxvbmcgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50LiBNYXkgaGF2ZSBhXG4gICAgYGRlcHRoYCBncmVhdGVyIHRoYW4gdGhpcyBvYmplY3QncyBgZGVwdGhgIHByb3BlcnR5LCBzaW5jZVxuICAgIHRoZXNlIGFyZSB0aGUgcG9zaXRpb25zIHRoYXQgd2VyZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHJhbmdlLFxuICAgIG5vdCByZS1yZXNvbHZlZCBwb3NpdGlvbnMgZGlyZWN0bHkgYXQgaXRzIGJvdW5kYXJpZXMuXG4gICAgKi9cbiAgICAkZnJvbSwgXG4gICAgLyoqXG4gICAgQSBwb3NpdGlvbiBhbG9uZyB0aGUgZW5kIG9mIHRoZSBjb250ZW50LiBTZWVcbiAgICBjYXZlYXQgZm9yIFtgJGZyb21gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVJhbmdlLiRmcm9tKS5cbiAgICAqL1xuICAgICR0bywgXG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIG9mIHRoZSBub2RlIHRoYXQgdGhpcyByYW5nZSBwb2ludHMgaW50by5cbiAgICAqL1xuICAgIGRlcHRoKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLiRmcm9tLmJlZm9yZSh0aGlzLmRlcHRoICsgMSk7IH1cbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy4kdG8uYWZ0ZXIodGhpcy5kZXB0aCArIDEpOyB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHJhbmdlIHBvaW50cyBpbnRvLlxuICAgICovXG4gICAgZ2V0IHBhcmVudCgpIHsgcmV0dXJuIHRoaXMuJGZyb20ubm9kZSh0aGlzLmRlcHRoKTsgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IHN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLiRmcm9tLmluZGV4KHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IGVuZEluZGV4KCkgeyByZXR1cm4gdGhpcy4kdG8uaW5kZXhBZnRlcih0aGlzLmRlcHRoKTsgfVxufVxuXG5jb25zdCBlbXB0eUF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgdHJlZSB0aGF0IG1ha2VzIHVwIGFcblByb3NlTWlycm9yIGRvY3VtZW50LiBTbyBhIGRvY3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGBOb2RlYCwgd2l0aFxuY2hpbGRyZW4gdGhhdCBhcmUgYWxzbyBpbnN0YW5jZXMgb2YgYE5vZGVgLlxuXG5Ob2RlcyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMuIEluc3RlYWQgb2YgY2hhbmdpbmcgdGhlbSwgeW91XG5jcmVhdGUgbmV3IG9uZXMgd2l0aCB0aGUgY29udGVudCB5b3Ugd2FudC4gT2xkIG9uZXMga2VlcCBwb2ludGluZ1xuYXQgdGhlIG9sZCBkb2N1bWVudCBzaGFwZS4gVGhpcyBpcyBtYWRlIGNoZWFwZXIgYnkgc2hhcmluZ1xuc3RydWN0dXJlIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGRhdGEgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2hpY2ggYVxudHJlZSBzaGFwZSBsaWtlIHRoaXMgKHdpdGhvdXQgYmFjayBwb2ludGVycykgbWFrZXMgZWFzeS5cblxuKipEbyBub3QqKiBkaXJlY3RseSBtdXRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYSBgTm9kZWAgb2JqZWN0LiBTZWVcblt0aGUgZ3VpZGVdKC9kb2NzL2d1aWRlLyNkb2MpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuKi9cbmNsYXNzIE5vZGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgaXMuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBBbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzLiBUaGUga2luZCBvZlxuICAgIGF0dHJpYnV0ZXMgYWxsb3dlZCBhbmQgcmVxdWlyZWQgYXJlXG4gICAgW2RldGVybWluZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5hdHRycykgYnkgdGhlIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIGF0dHJzLCBcbiAgICAvLyBBIGZyYWdtZW50IGhvbGRpbmcgdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICBjb250ZW50LCBcbiAgICAvKipcbiAgICBUaGUgbWFya3MgKHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQgaXMgZW1waGFzaXplZCBvciBwYXJ0IG9mIGFcbiAgICBsaW5rKSBhcHBsaWVkIHRvIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIG1hcmtzID0gTWFyay5ub25lKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50IHx8IEZyYWdtZW50LmVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSBvZiB0aGlzIG5vZGUsIGFzIGRlZmluZWQgYnkgdGhlIGludGVnZXItYmFzZWQgW2luZGV4aW5nXG4gICAgc2NoZW1lXSgvZG9jcy9ndWlkZS8jZG9jLmluZGV4aW5nKS4gRm9yIHRleHQgbm9kZXMsIHRoaXMgaXMgdGhlXG4gICAgYW1vdW50IG9mIGNoYXJhY3RlcnMuIEZvciBvdGhlciBsZWFmIG5vZGVzLCBpdCBpcyBvbmUuIEZvclxuICAgIG5vbi1sZWFmIG5vZGVzLCBpdCBpcyB0aGUgc2l6ZSBvZiB0aGUgY29udGVudCBwbHVzIHR3byAodGhlXG4gICAgc3RhcnQgYW5kIGVuZCB0b2tlbikuXG4gICAgKi9cbiAgICBnZXQgbm9kZVNpemUoKSB7IHJldHVybiB0aGlzLmlzTGVhZiA/IDEgOiAyICsgdGhpcy5jb250ZW50LnNpemU7IH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgdGhlIG5vZGUgaGFzLlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGRDb3VudDsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFJhaXNlcyBhbiBlcnJvciB3aGVuIHRoZVxuICAgIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiAgICAqL1xuICAgIGNoaWxkKGluZGV4KSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCwgaWYgaXQgZXhpc3RzLlxuICAgICovXG4gICAgbWF5YmVDaGlsZChpbmRleCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHsgdGhpcy5jb250ZW50LmZvckVhY2goZik7IH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgcmVjdXJzaXZlbHkgYmV0d2VlblxuICAgIHRoZSBnaXZlbiB0d28gcG9zaXRpb25zIHRoYXQgYXJlIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHRoaXNcbiAgICBub2RlJ3MgY29udGVudC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCB0aGUgbm9kZSwgaXRzXG4gICAgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIG5vZGUgKG1ldGhvZCByZWNlaXZlciksXG4gICAgaXRzIHBhcmVudCBub2RlLCBhbmQgaXRzIGNoaWxkIGluZGV4LiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgZmFsc2UgZm9yIGEgZ2l2ZW4gbm9kZSwgdGhhdCBub2RlJ3MgY2hpbGRyZW4gd2lsbCBub3QgYmVcbiAgICByZWN1cnNlZCBvdmVyLiBUaGUgbGFzdCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhXG4gICAgc3RhcnRpbmcgcG9zaXRpb24gdG8gY291bnQgZnJvbS5cbiAgICAqL1xuICAgIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgc3RhcnRQb3MgPSAwKSB7XG4gICAgICAgIHRoaXMuY29udGVudC5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHN0YXJ0UG9zLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgbm9kZS4gRG9lc24ndFxuICAgIGRlc2NlbmQgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgZGVzY2VuZGFudHMoZikge1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2VlbigwLCB0aGlzLmNvbnRlbnQuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbmNhdGVuYXRlcyBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgdGV4dENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0xlYWYgJiYgdGhpcy50eXBlLnNwZWMubGVhZlRleHQpXG4gICAgICAgICAgICA/IHRoaXMudHlwZS5zcGVjLmxlYWZUZXh0KHRoaXMpXG4gICAgICAgICAgICA6IHRoaXMudGV4dEJldHdlZW4oMCwgdGhpcy5jb250ZW50LnNpemUsIFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYWxsIHRleHQgYmV0d2VlbiBwb3NpdGlvbnMgYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYGJsb2NrU2VwYXJhdG9yYCBpcyBnaXZlbiwgaXQgd2lsbCBiZSBpbnNlcnRlZCB0byBzZXBhcmF0ZSB0ZXh0XG4gICAgZnJvbSBkaWZmZXJlbnQgYmxvY2sgbm9kZXMuIElmIGBsZWFmVGV4dGAgaXMgZ2l2ZW4sIGl0J2xsIGJlXG4gICAgaW5zZXJ0ZWQgZm9yIGV2ZXJ5IG5vbi10ZXh0IGxlYWYgbm9kZSBlbmNvdW50ZXJlZCwgb3RoZXJ3aXNlXG4gICAgW2BsZWFmVGV4dGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlY15sZWFmVGV4dCkgd2lsbCBiZSB1c2VkLlxuICAgICovXG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8sIGJsb2NrU2VwYXJhdG9yLCBsZWFmVGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnRleHRCZXR3ZWVuKGZyb20sIHRvLCBibG9ja1NlcGFyYXRvciwgbGVhZlRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5maXJzdENoaWxkOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxhc3RDaGlsZDsgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0d28gbm9kZXMgcmVwcmVzZW50IHRoZSBzYW1lIHBpZWNlIG9mIGRvY3VtZW50LlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgKHRoaXMuc2FtZU1hcmt1cChvdGhlcikgJiYgdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgbWFya3VwICh0eXBlLCBhdHRyaWJ1dGVzLCBhbmQgbWFya3MpIG9mIHRoaXMgbm9kZSB0b1xuICAgIHRob3NlIG9mIGFub3RoZXIuIFJldHVybnMgYHRydWVgIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSBtYXJrdXAuXG4gICAgKi9cbiAgICBzYW1lTWFya3VwKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc01hcmt1cChvdGhlci50eXBlLCBvdGhlci5hdHRycywgb3RoZXIubWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSdzIG1hcmt1cCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiB0eXBlLFxuICAgIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcy5cbiAgICAqL1xuICAgIGhhc01hcmt1cCh0eXBlLCBhdHRycywgbWFya3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlICYmXG4gICAgICAgICAgICBjb21wYXJlRGVlcCh0aGlzLmF0dHJzLCBhdHRycyB8fCB0eXBlLmRlZmF1bHRBdHRycyB8fCBlbXB0eUF0dHJzKSAmJlxuICAgICAgICAgICAgTWFyay5zYW1lU2V0KHRoaXMubWFya3MsIG1hcmtzIHx8IE1hcmsubm9uZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggdGhlIHNhbWUgbWFya3VwIGFzIHRoaXMgbm9kZSwgY29udGFpbmluZ1xuICAgIHRoZSBnaXZlbiBjb250ZW50IChvciBlbXB0eSwgaWYgbm8gY29udGVudCBpcyBnaXZlbikuXG4gICAgKi9cbiAgICBjb3B5KGNvbnRlbnQgPSBudWxsKSB7XG4gICAgICAgIGlmIChjb250ZW50ID09IHRoaXMuY29udGVudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUsIHdpdGggdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBpbnN0ZWFkXG4gICAgb2YgdGhlIG5vZGUncyBvd24gbWFya3MuXG4gICAgKi9cbiAgICBtYXJrKG1hcmtzKSB7XG4gICAgICAgIHJldHVybiBtYXJrcyA9PSB0aGlzLm1hcmtzID8gdGhpcyA6IG5ldyBOb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy5jb250ZW50LCBtYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggb25seSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9ucy4gSWYgYHRvYCBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2ZcbiAgICB0aGUgbm9kZS5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuY3V0KGZyb20sIHRvKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEN1dCBvdXQgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucywgYW5kXG4gICAgcmV0dXJuIGl0IGFzIGEgYFNsaWNlYCBvYmplY3QuXG4gICAgKi9cbiAgICBzbGljZShmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplLCBpbmNsdWRlUGFyZW50cyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgJGZyb20gPSB0aGlzLnJlc29sdmUoZnJvbSksICR0byA9IHRoaXMucmVzb2x2ZSh0byk7XG4gICAgICAgIGxldCBkZXB0aCA9IGluY2x1ZGVQYXJlbnRzID8gMCA6ICRmcm9tLnNoYXJlZERlcHRoKHRvKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gJGZyb20uc3RhcnQoZGVwdGgpLCBub2RlID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgIGxldCBjb250ZW50ID0gbm9kZS5jb250ZW50LmN1dCgkZnJvbS5wb3MgLSBzdGFydCwgJHRvLnBvcyAtIHN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShjb250ZW50LCAkZnJvbS5kZXB0aCAtIGRlcHRoLCAkdG8uZGVwdGggLSBkZXB0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucyB3aXRoXG4gICAgdGhlIGdpdmVuIHNsaWNlLiBUaGUgc2xpY2UgbXVzdCAnZml0JywgbWVhbmluZyBpdHMgb3BlbiBzaWRlc1xuICAgIG11c3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzdXJyb3VuZGluZyBjb250ZW50LCBhbmQgaXRzXG4gICAgY29udGVudCBub2RlcyBtdXN0IGJlIHZhbGlkIGNoaWxkcmVuIGZvciB0aGUgbm9kZSB0aGV5IGFyZSBwbGFjZWRcbiAgICBpbnRvLiBJZiBhbnkgb2YgdGhpcyBpcyB2aW9sYXRlZCwgYW4gZXJyb3Igb2YgdHlwZVxuICAgIFtgUmVwbGFjZUVycm9yYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlcGxhY2VFcnJvcikgaXMgdGhyb3duLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgc2xpY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2UodGhpcy5yZXNvbHZlKGZyb20pLCB0aGlzLnJlc29sdmUodG8pLCBzbGljZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIG5vZGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbm9kZUF0KHBvcykge1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdGhpczs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBvcyk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zIHx8IG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgcG9zIC09IG9mZnNldCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBhZnRlciB0aGUgZ2l2ZW4gb2Zmc2V0LCBpZiBhbnksXG4gICAgYW5kIHJldHVybiBpdCBhbG9uZyB3aXRoIGl0cyBpbmRleCBhbmQgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoaXNcbiAgICBub2RlLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHtcbiAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gdGhpcy5jb250ZW50LmZpbmRJbmRleChwb3MpO1xuICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnQubWF5YmVDaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIG9mZnNldCwgaWYgYW55LFxuICAgIGFuZCByZXR1cm4gaXQgYWxvbmcgd2l0aCBpdHMgaW5kZXggYW5kIG9mZnNldCByZWxhdGl2ZSB0byB0aGlzXG4gICAgbm9kZS5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykge1xuICAgICAgICBpZiAocG9zID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBudWxsLCBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG4gICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IHRoaXMuY29udGVudC5maW5kSW5kZXgocG9zKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IHBvcylcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudC5jaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgaW5kZXg6IGluZGV4IC0gMSwgb2Zmc2V0OiBvZmZzZXQgLSBub2RlLm5vZGVTaXplIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJlc29sdmUgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCwgcmV0dXJuaW5nIGFuXG4gICAgW29iamVjdF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlc29sdmVkUG9zKSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjb250ZXh0LlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MpIHsgcmV0dXJuIFJlc29sdmVkUG9zLnJlc29sdmVDYWNoZWQodGhpcywgcG9zKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZU5vQ2FjaGUocG9zKSB7IHJldHVybiBSZXNvbHZlZFBvcy5yZXNvbHZlKHRoaXMsIHBvcyk7IH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgYSBnaXZlbiBtYXJrIG9yIG1hcmsgdHlwZSBvY2N1cnMgaW4gdGhpcyBkb2N1bWVudFxuICAgIGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICByYW5nZUhhc01hcmsoZnJvbSwgdG8sIHR5cGUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmICh0byA+IGZyb20pXG4gICAgICAgICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAhZm91bmQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIGJsb2NrIChub24taW5saW5lIG5vZGUpXG4gICAgKi9cbiAgICBnZXQgaXNCbG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0Jsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSB0ZXh0YmxvY2sgbm9kZSwgYSBibG9jayBub2RlIHdpdGggaW5saW5lXG4gICAgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc1RleHRibG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc1RleHRibG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgYWxsb3dzIGlubGluZSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlubGluZUNvbnRlbnQoKSB7IHJldHVybiB0aGlzLnR5cGUuaW5saW5lQ29udGVudDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGlubGluZSBub2RlIChhIHRleHQgbm9kZSBvciBhIG5vZGUgdGhhdCBjYW5cbiAgICBhcHBlYXIgYW1vbmcgdGV4dCkuXG4gICAgKi9cbiAgICBnZXQgaXNJbmxpbmUoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNJbmxpbmU7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBpc1RleHQoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNUZXh0OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNMZWFmKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzTGVhZjsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGF0b20sIGkuZS4gd2hlbiBpdCBkb2VzIG5vdCBoYXZlIGRpcmVjdGx5XG4gICAgZWRpdGFibGUgY29udGVudC4gVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIGBpc0xlYWZgLCBidXQgY2FuXG4gICAgYmUgY29uZmlndXJlZCB3aXRoIHRoZSBbYGF0b21gIHByb3BlcnR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuYXRvbSlcbiAgICBvbiBhIG5vZGUncyBzcGVjICh0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBub2RlIGlzIGRpc3BsYXllZCBhc1xuICAgIGFuIHVuZWRpdGFibGUgW25vZGUgdmlld10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuTm9kZVZpZXcpKS5cbiAgICAqL1xuICAgIGdldCBpc0F0b20oKSB7IHJldHVybiB0aGlzLnR5cGUuaXNBdG9tOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBmb3IgZGVidWdnaW5nXG4gICAgcHVycG9zZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZyh0aGlzKTtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnR5cGUubmFtZTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgbmFtZSArPSBcIihcIiArIHRoaXMuY29udGVudC50b1N0cmluZ0lubmVyKCkgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb250ZW50IG1hdGNoIGluIHRoaXMgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgKi9cbiAgICBjb250ZW50TWF0Y2hBdChpbmRleCkge1xuICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCAwLCBpbmRleCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsZWQgY29udGVudE1hdGNoQXQgb24gYSBub2RlIHdpdGggaW52YWxpZCBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIChieVxuICAgIGNoaWxkIGluZGV4KSB3aXRoIHRoZSBnaXZlbiByZXBsYWNlbWVudCBmcmFnbWVudCAod2hpY2ggZGVmYXVsdHNcbiAgICB0byB0aGUgZW1wdHkgZnJhZ21lbnQpIHdvdWxkIGxlYXZlIHRoZSBub2RlJ3MgY29udGVudCB2YWxpZC4gWW91XG4gICAgY2FuIG9wdGlvbmFsbHkgcGFzcyBgc3RhcnRgIGFuZCBgZW5kYCBpbmRpY2VzIGludG8gdGhlXG4gICAgcmVwbGFjZW1lbnQgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlKGZyb20sIHRvLCByZXBsYWNlbWVudCA9IEZyYWdtZW50LmVtcHR5LCBzdGFydCA9IDAsIGVuZCA9IHJlcGxhY2VtZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgbGV0IG9uZSA9IHRoaXMuY29udGVudE1hdGNoQXQoZnJvbSkubWF0Y2hGcmFnbWVudChyZXBsYWNlbWVudCwgc3RhcnQsIGVuZCk7XG4gICAgICAgIGxldCB0d28gPSBvbmUgJiYgb25lLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIGlmICghdHdvIHx8ICF0d28udmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUuYWxsb3dzTWFya3MocmVwbGFjZW1lbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGBmcm9tYCB0byBgdG9gIChieSBpbmRleCkgd2l0aFxuICAgIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSB3b3VsZCBsZWF2ZSB0aGUgbm9kZSdzIGNvbnRlbnQgdmFsaWQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlV2l0aChmcm9tLCB0bywgdHlwZSwgbWFya3MpIHtcbiAgICAgICAgaWYgKG1hcmtzICYmICF0aGlzLnR5cGUuYWxsb3dzTWFya3MobWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNvbnRlbnRNYXRjaEF0KGZyb20pLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICYmIHN0YXJ0Lm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIHJldHVybiBlbmQgPyBlbmQudmFsaWRFbmQgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBub2RlJ3MgY29udGVudCBjb3VsZCBiZSBhcHBlbmRlZCB0byB0aGlzXG4gICAgbm9kZS4gSWYgdGhhdCBub2RlIGlzIGVtcHR5LCB0aGlzIHdpbGwgb25seSByZXR1cm4gdHJ1ZSBpZiB0aGVyZVxuICAgIGlzIGF0IGxlYXN0IG9uZSBub2RlIHR5cGUgdGhhdCBjYW4gYXBwZWFyIGluIGJvdGggbm9kZXMgKHRvIGF2b2lkXG4gICAgbWVyZ2luZyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZSBub2RlcykuXG4gICAgKi9cbiAgICBjYW5BcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhblJlcGxhY2UodGhpcy5jaGlsZENvdW50LCB0aGlzLmNoaWxkQ291bnQsIG90aGVyLmNvbnRlbnQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmNvbXBhdGlibGVDb250ZW50KG90aGVyLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSBhbmQgaXRzIGRlc2NlbmRhbnRzIGNvbmZvcm0gdG8gdGhlXG4gICAgc2NoZW1hLCBhbmQgcmFpc2UgZXJyb3Igd2hlbiB0aGV5IGRvIG5vdC5cbiAgICAqL1xuICAgIGNoZWNrKCkge1xuICAgICAgICB0aGlzLnR5cGUuY2hlY2tDb250ZW50KHRoaXMuY29udGVudCk7XG4gICAgICAgIGxldCBjb3B5ID0gTWFyay5ub25lO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjb3B5ID0gdGhpcy5tYXJrc1tpXS5hZGRUb1NldChjb3B5KTtcbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQoY29weSwgdGhpcy5tYXJrcykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjb2xsZWN0aW9uIG9mIG1hcmtzIGZvciBub2RlICR7dGhpcy50eXBlLm5hbWV9OiAke3RoaXMubWFya3MubWFwKG0gPT4gbS50eXBlLm5hbWUpfWApO1xuICAgICAgICB0aGlzLmNvbnRlbnQuZm9yRWFjaChub2RlID0+IG5vZGUuY2hlY2soKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIG9iai5jb250ZW50ID0gdGhpcy5jb250ZW50LnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICBvYmoubWFya3MgPSB0aGlzLm1hcmtzLm1hcChuID0+IG4udG9KU09OKCkpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG5vZGUgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgbWFya3MgPSBudWxsO1xuICAgICAgICBpZiAoanNvbi5tYXJrcykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb24ubWFya3MpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBtYXJrIGRhdGEgZm9yIE5vZGUuZnJvbUpTT05cIik7XG4gICAgICAgICAgICBtYXJrcyA9IGpzb24ubWFya3MubWFwKHNjaGVtYS5tYXJrRnJvbUpTT04pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uLnR5cGUgPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YganNvbi50ZXh0ICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHRleHQgbm9kZSBpbiBKU09OXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS50ZXh0KGpzb24udGV4dCwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQuZnJvbUpTT04oc2NoZW1hLCBqc29uLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gc2NoZW1hLm5vZGVUeXBlKGpzb24udHlwZSkuY3JlYXRlKGpzb24uYXR0cnMsIGNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG59XG5Ob2RlLnByb3RvdHlwZS50ZXh0ID0gdW5kZWZpbmVkO1xuY2xhc3MgVGV4dE5vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBzdXBlcih0eXBlLCBhdHRycywgbnVsbCwgbWFya3MpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkVtcHR5IHRleHQgbm9kZXMgYXJlIG5vdCBhbGxvd2VkXCIpO1xuICAgICAgICB0aGlzLnRleHQgPSBjb250ZW50O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRleHQpKTtcbiAgICB9XG4gICAgZ2V0IHRleHRDb250ZW50KCkgeyByZXR1cm4gdGhpcy50ZXh0OyB9XG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8pIHsgcmV0dXJuIHRoaXMudGV4dC5zbGljZShmcm9tLCB0byk7IH1cbiAgICBnZXQgbm9kZVNpemUoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgbWFyayhtYXJrcykge1xuICAgICAgICByZXR1cm4gbWFya3MgPT0gdGhpcy5tYXJrcyA/IHRoaXMgOiBuZXcgVGV4dE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0aGlzLnRleHQsIG1hcmtzKTtcbiAgICB9XG4gICAgd2l0aFRleHQodGV4dCkge1xuICAgICAgICBpZiAodGV4dCA9PSB0aGlzLnRleHQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRleHQsIHRoaXMubWFya3MpO1xuICAgIH1cbiAgICBjdXQoZnJvbSA9IDAsIHRvID0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMudGV4dC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFRleHQodGhpcy50ZXh0LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbWVNYXJrdXAob3RoZXIpICYmIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBiYXNlID0gc3VwZXIudG9KU09OKCk7XG4gICAgICAgIGJhc2UudGV4dCA9IHRoaXMudGV4dDtcbiAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcE1hcmtzKG1hcmtzLCBzdHIpIHtcbiAgICBmb3IgKGxldCBpID0gbWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIHN0ciA9IG1hcmtzW2ldLnR5cGUubmFtZSArIFwiKFwiICsgc3RyICsgXCIpXCI7XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG5JbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBtYXRjaCBzdGF0ZSBvZiBhIG5vZGUgdHlwZSdzXG5bY29udGVudCBleHByZXNzaW9uXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29udGVudCksIGFuZCBjYW4gYmUgdXNlZCB0b1xuZmluZCBvdXQgd2hldGhlciBmdXJ0aGVyIGNvbnRlbnQgbWF0Y2hlcyBoZXJlLCBhbmQgd2hldGhlciBhIGdpdmVuXG5wb3NpdGlvbiBpcyBhIHZhbGlkIGVuZCBvZiB0aGUgbm9kZS5cbiovXG5jbGFzcyBDb250ZW50TWF0Y2gge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbWF0Y2ggc3RhdGUgcmVwcmVzZW50cyBhIHZhbGlkIGVuZCBvZiB0aGUgbm9kZS5cbiAgICAqL1xuICAgIHZhbGlkRW5kKSB7XG4gICAgICAgIHRoaXMudmFsaWRFbmQgPSB2YWxpZEVuZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm5leHQgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLndyYXBDYWNoZSA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShzdHJpbmcsIG5vZGVUeXBlcykge1xuICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKHN0cmluZywgbm9kZVR5cGVzKTtcbiAgICAgICAgaWYgKHN0cmVhbS5uZXh0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gQ29udGVudE1hdGNoLmVtcHR5O1xuICAgICAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzdHJlYW0pO1xuICAgICAgICBpZiAoc3RyZWFtLm5leHQpXG4gICAgICAgICAgICBzdHJlYW0uZXJyKFwiVW5leHBlY3RlZCB0cmFpbGluZyB0ZXh0XCIpO1xuICAgICAgICBsZXQgbWF0Y2ggPSBkZmEobmZhKGV4cHIpKTtcbiAgICAgICAgY2hlY2tGb3JEZWFkRW5kcyhtYXRjaCwgc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCBhIG5vZGUgdHlwZSwgcmV0dXJuaW5nIGEgbWF0Y2ggYWZ0ZXIgdGhhdCBub2RlIGlmXG4gICAgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIG1hdGNoVHlwZSh0eXBlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHRoaXMubmV4dFtpXS50eXBlID09IHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dFtpXS5uZXh0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1hdGNoIGEgZnJhZ21lbnQuIFJldHVybnMgdGhlIHJlc3VsdGluZyBtYXRjaCB3aGVuXG4gICAgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIG1hdGNoRnJhZ21lbnQoZnJhZywgc3RhcnQgPSAwLCBlbmQgPSBmcmFnLmNoaWxkQ291bnQpIHtcbiAgICAgICAgbGV0IGN1ciA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgY3VyICYmIGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIGN1ciA9IGN1ci5tYXRjaFR5cGUoZnJhZy5jaGlsZChpKS50eXBlKTtcbiAgICAgICAgcmV0dXJuIGN1cjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaW5saW5lQ29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dC5sZW5ndGggIT0gMCAmJiB0aGlzLm5leHRbMF0udHlwZS5pc0lubGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBmaXJzdCBtYXRjaGluZyBub2RlIHR5cGUgYXQgdGhpcyBtYXRjaCBwb3NpdGlvbiB0aGF0IGNhblxuICAgIGJlIGdlbmVyYXRlZC5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0VHlwZSgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHR5cGUgfSA9IHRoaXMubmV4dFtpXTtcbiAgICAgICAgICAgIGlmICghKHR5cGUuaXNUZXh0IHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXRpYmxlKG90aGVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvdGhlci5uZXh0Lmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRbaV0udHlwZSA9PSBvdGhlci5uZXh0W2pdLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFRyeSB0byBtYXRjaCB0aGUgZ2l2ZW4gZnJhZ21lbnQsIGFuZCBpZiB0aGF0IGZhaWxzLCBzZWUgaWYgaXQgY2FuXG4gICAgYmUgbWFkZSB0byBtYXRjaCBieSBpbnNlcnRpbmcgbm9kZXMgaW4gZnJvbnQgb2YgaXQuIFdoZW5cbiAgICBzdWNjZXNzZnVsLCByZXR1cm4gYSBmcmFnbWVudCBvZiBpbnNlcnRlZCBub2RlcyAod2hpY2ggbWF5IGJlXG4gICAgZW1wdHkgaWYgbm90aGluZyBoYWQgdG8gYmUgaW5zZXJ0ZWQpLiBXaGVuIGB0b0VuZGAgaXMgdHJ1ZSwgb25seVxuICAgIHJldHVybiBhIGZyYWdtZW50IGlmIHRoZSByZXN1bHRpbmcgbWF0Y2ggZ29lcyB0byB0aGUgZW5kIG9mIHRoZVxuICAgIGNvbnRlbnQgZXhwcmVzc2lvbi5cbiAgICAqL1xuICAgIGZpbGxCZWZvcmUoYWZ0ZXIsIHRvRW5kID0gZmFsc2UsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGxldCBzZWVuID0gW3RoaXNdO1xuICAgICAgICBmdW5jdGlvbiBzZWFyY2gobWF0Y2gsIHR5cGVzKSB7XG4gICAgICAgICAgICBsZXQgZmluaXNoZWQgPSBtYXRjaC5tYXRjaEZyYWdtZW50KGFmdGVyLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCAmJiAoIXRvRW5kIHx8IGZpbmlzaGVkLnZhbGlkRW5kKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbSh0eXBlcy5tYXAodHAgPT4gdHAuY3JlYXRlQW5kRmlsbCgpKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5uZXh0W2ldO1xuICAgICAgICAgICAgICAgIGlmICghKHR5cGUuaXNUZXh0IHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKSAmJiBzZWVuLmluZGV4T2YobmV4dCkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vlbi5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzZWFyY2gobmV4dCwgdHlwZXMuY29uY2F0KHR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWFyY2godGhpcywgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgc2V0IG9mIHdyYXBwaW5nIG5vZGUgdHlwZXMgdGhhdCB3b3VsZCBhbGxvdyBhIG5vZGUgb2YgdGhlXG4gICAgZ2l2ZW4gdHlwZSB0byBhcHBlYXIgYXQgdGhpcyBwb3NpdGlvbi4gVGhlIHJlc3VsdCBtYXkgYmUgZW1wdHlcbiAgICAod2hlbiBpdCBmaXRzIGRpcmVjdGx5KSBhbmQgd2lsbCBiZSBudWxsIHdoZW4gbm8gc3VjaCB3cmFwcGluZ1xuICAgIGV4aXN0cy5cbiAgICAqL1xuICAgIGZpbmRXcmFwcGluZyh0YXJnZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndyYXBDYWNoZS5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIGlmICh0aGlzLndyYXBDYWNoZVtpXSA9PSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcENhY2hlW2kgKyAxXTtcbiAgICAgICAgbGV0IGNvbXB1dGVkID0gdGhpcy5jb21wdXRlV3JhcHBpbmcodGFyZ2V0KTtcbiAgICAgICAgdGhpcy53cmFwQ2FjaGUucHVzaCh0YXJnZXQsIGNvbXB1dGVkKTtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXB1dGVXcmFwcGluZyh0YXJnZXQpIHtcbiAgICAgICAgbGV0IHNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpLCBhY3RpdmUgPSBbeyBtYXRjaDogdGhpcywgdHlwZTogbnVsbCwgdmlhOiBudWxsIH1dO1xuICAgICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhY3RpdmUuc2hpZnQoKSwgbWF0Y2ggPSBjdXJyZW50Lm1hdGNoO1xuICAgICAgICAgICAgaWYgKG1hdGNoLm1hdGNoVHlwZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9iaiA9IGN1cnJlbnQ7IG9iai50eXBlOyBvYmogPSBvYmoudmlhKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvYmoudHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5uZXh0W2ldO1xuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc0xlYWYgJiYgIXR5cGUuaGFzUmVxdWlyZWRBdHRycygpICYmICEodHlwZS5uYW1lIGluIHNlZW4pICYmICghY3VycmVudC50eXBlIHx8IG5leHQudmFsaWRFbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKHsgbWF0Y2g6IHR5cGUuY29udGVudE1hdGNoLCB0eXBlLCB2aWE6IGN1cnJlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5bdHlwZS5uYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIG91dGdvaW5nIGVkZ2VzIHRoaXMgbm9kZSBoYXMgaW4gdGhlIGZpbml0ZVxuICAgIGF1dG9tYXRvbiB0aGF0IGRlc2NyaWJlcyB0aGUgY29udGVudCBleHByZXNzaW9uLlxuICAgICovXG4gICAgZ2V0IGVkZ2VDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dC5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgX25fXHUyMDBCdGggb3V0Z29pbmcgZWRnZSBmcm9tIHRoaXMgbm9kZSBpbiB0aGUgZmluaXRlXG4gICAgYXV0b21hdG9uIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50IGV4cHJlc3Npb24uXG4gICAgKi9cbiAgICBlZGdlKG4pIHtcbiAgICAgICAgaWYgKG4gPj0gdGhpcy5uZXh0Lmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGVyZSdzIG5vICR7bn10aCBlZGdlIGluIHRoaXMgY29udGVudCBtYXRjaGApO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0W25dO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgc2VlbiA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBzY2FuKG0pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChtKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbS5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChzZWVuLmluZGV4T2YobS5uZXh0W2ldLm5leHQpID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBzY2FuKG0ubmV4dFtpXS5uZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBzY2FuKHRoaXMpO1xuICAgICAgICByZXR1cm4gc2Vlbi5tYXAoKG0sIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBvdXQgPSBpICsgKG0udmFsaWRFbmQgPyBcIipcIiA6IFwiIFwiKSArIFwiIFwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgb3V0ICs9IChpID8gXCIsIFwiIDogXCJcIikgKyBtLm5leHRbaV0udHlwZS5uYW1lICsgXCItPlwiICsgc2Vlbi5pbmRleE9mKG0ubmV4dFtpXS5uZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0pLmpvaW4oXCJcXG5cIik7XG4gICAgfVxufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5Db250ZW50TWF0Y2guZW1wdHkgPSBuZXcgQ29udGVudE1hdGNoKHRydWUpO1xuY2xhc3MgVG9rZW5TdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHN0cmluZywgbm9kZVR5cGVzKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xuICAgICAgICB0aGlzLm5vZGVUeXBlcyA9IG5vZGVUeXBlcztcbiAgICAgICAgdGhpcy5pbmxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMudG9rZW5zID0gc3RyaW5nLnNwbGl0KC9cXHMqKD89XFxifFxcV3wkKS8pO1xuICAgICAgICBpZiAodGhpcy50b2tlbnNbdGhpcy50b2tlbnMubGVuZ3RoIC0gMV0gPT0gXCJcIilcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLnBvcCgpO1xuICAgICAgICBpZiAodGhpcy50b2tlbnNbMF0gPT0gXCJcIilcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLnNoaWZ0KCk7XG4gICAgfVxuICAgIGdldCBuZXh0KCkgeyByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5wb3NdOyB9XG4gICAgZWF0KHRvaykgeyByZXR1cm4gdGhpcy5uZXh0ID09IHRvayAmJiAodGhpcy5wb3MrKyB8fCB0cnVlKTsgfVxuICAgIGVycihzdHIpIHsgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN0ciArIFwiIChpbiBjb250ZW50IGV4cHJlc3Npb24gJ1wiICsgdGhpcy5zdHJpbmcgKyBcIicpXCIpOyB9XG59XG5mdW5jdGlvbiBwYXJzZUV4cHIoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHJzID0gW107XG4gICAgZG8ge1xuICAgICAgICBleHBycy5wdXNoKHBhcnNlRXhwclNlcShzdHJlYW0pKTtcbiAgICB9IHdoaWxlIChzdHJlYW0uZWF0KFwifFwiKSk7XG4gICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA9PSAxID8gZXhwcnNbMF0gOiB7IHR5cGU6IFwiY2hvaWNlXCIsIGV4cHJzIH07XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJTZXEoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHJzID0gW107XG4gICAgZG8ge1xuICAgICAgICBleHBycy5wdXNoKHBhcnNlRXhwclN1YnNjcmlwdChzdHJlYW0pKTtcbiAgICB9IHdoaWxlIChzdHJlYW0ubmV4dCAmJiBzdHJlYW0ubmV4dCAhPSBcIilcIiAmJiBzdHJlYW0ubmV4dCAhPSBcInxcIik7XG4gICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA9PSAxID8gZXhwcnNbMF0gOiB7IHR5cGU6IFwic2VxXCIsIGV4cHJzIH07XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJTdWJzY3JpcHQoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHIgPSBwYXJzZUV4cHJBdG9tKHN0cmVhbSk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoc3RyZWFtLmVhdChcIitcIikpXG4gICAgICAgICAgICBleHByID0geyB0eXBlOiBcInBsdXNcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwiKlwiKSlcbiAgICAgICAgICAgIGV4cHIgPSB7IHR5cGU6IFwic3RhclwiLCBleHByIH07XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoXCI/XCIpKVxuICAgICAgICAgICAgZXhwciA9IHsgdHlwZTogXCJvcHRcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwie1wiKSlcbiAgICAgICAgICAgIGV4cHIgPSBwYXJzZUV4cHJSYW5nZShzdHJlYW0sIGV4cHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG59XG5mdW5jdGlvbiBwYXJzZU51bShzdHJlYW0pIHtcbiAgICBpZiAoL1xcRC8udGVzdChzdHJlYW0ubmV4dCkpXG4gICAgICAgIHN0cmVhbS5lcnIoXCJFeHBlY3RlZCBudW1iZXIsIGdvdCAnXCIgKyBzdHJlYW0ubmV4dCArIFwiJ1wiKTtcbiAgICBsZXQgcmVzdWx0ID0gTnVtYmVyKHN0cmVhbS5uZXh0KTtcbiAgICBzdHJlYW0ucG9zKys7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwclJhbmdlKHN0cmVhbSwgZXhwcikge1xuICAgIGxldCBtaW4gPSBwYXJzZU51bShzdHJlYW0pLCBtYXggPSBtaW47XG4gICAgaWYgKHN0cmVhbS5lYXQoXCIsXCIpKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubmV4dCAhPSBcIn1cIilcbiAgICAgICAgICAgIG1heCA9IHBhcnNlTnVtKHN0cmVhbSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1heCA9IC0xO1xuICAgIH1cbiAgICBpZiAoIXN0cmVhbS5lYXQoXCJ9XCIpKVxuICAgICAgICBzdHJlYW0uZXJyKFwiVW5jbG9zZWQgYnJhY2VkIHJhbmdlXCIpO1xuICAgIHJldHVybiB7IHR5cGU6IFwicmFuZ2VcIiwgbWluLCBtYXgsIGV4cHIgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVOYW1lKHN0cmVhbSwgbmFtZSkge1xuICAgIGxldCB0eXBlcyA9IHN0cmVhbS5ub2RlVHlwZXMsIHR5cGUgPSB0eXBlc1tuYW1lXTtcbiAgICBpZiAodHlwZSlcbiAgICAgICAgcmV0dXJuIFt0eXBlXTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgdHlwZU5hbWUgaW4gdHlwZXMpIHtcbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1t0eXBlTmFtZV07XG4gICAgICAgIGlmICh0eXBlLmdyb3Vwcy5pbmRleE9mKG5hbWUpID4gLTEpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMClcbiAgICAgICAgc3RyZWFtLmVycihcIk5vIG5vZGUgdHlwZSBvciBncm91cCAnXCIgKyBuYW1lICsgXCInIGZvdW5kXCIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJBdG9tKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0uZWF0KFwiKFwiKSkge1xuICAgICAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzdHJlYW0pO1xuICAgICAgICBpZiAoIXN0cmVhbS5lYXQoXCIpXCIpKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk1pc3NpbmcgY2xvc2luZyBwYXJlblwiKTtcbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEvXFxXLy50ZXN0KHN0cmVhbS5uZXh0KSkge1xuICAgICAgICBsZXQgZXhwcnMgPSByZXNvbHZlTmFtZShzdHJlYW0sIHN0cmVhbS5uZXh0KS5tYXAodHlwZSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLmlubGluZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5pbmxpbmUgPSB0eXBlLmlzSW5saW5lO1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmlubGluZSAhPSB0eXBlLmlzSW5saW5lKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJNaXhpbmcgaW5saW5lIGFuZCBibG9jayBjb250ZW50XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJuYW1lXCIsIHZhbHVlOiB0eXBlIH07XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ucG9zKys7XG4gICAgICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcImNob2ljZVwiLCBleHBycyB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyZWFtLmVycihcIlVuZXhwZWN0ZWQgdG9rZW4gJ1wiICsgc3RyZWFtLm5leHQgKyBcIidcIik7XG4gICAgfVxufVxuLyoqXG5Db25zdHJ1Y3QgYW4gTkZBIGZyb20gYW4gZXhwcmVzc2lvbiBhcyByZXR1cm5lZCBieSB0aGUgcGFyc2VyLiBUaGVcbk5GQSBpcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBzdGF0ZXMsIHdoaWNoIGFyZSB0aGVtc2VsdmVzXG5hcnJheXMgb2YgZWRnZXMsIHdoaWNoIGFyZSBge3Rlcm0sIHRvfWAgb2JqZWN0cy4gVGhlIGZpcnN0IHN0YXRlIGlzXG50aGUgZW50cnkgc3RhdGUgYW5kIHRoZSBsYXN0IG5vZGUgaXMgdGhlIHN1Y2Nlc3Mgc3RhdGUuXG5cbk5vdGUgdGhhdCB1bmxpa2UgdHlwaWNhbCBORkFzLCB0aGUgZWRnZSBvcmRlcmluZyBpbiB0aGlzIG9uZSBpc1xuc2lnbmlmaWNhbnQsIGluIHRoYXQgaXQgaXMgdXNlZCB0byBjb250cnVjdCBmaWxsZXIgY29udGVudCB3aGVuXG5uZWNlc3NhcnkuXG4qL1xuZnVuY3Rpb24gbmZhKGV4cHIpIHtcbiAgICBsZXQgbmZhID0gW1tdXTtcbiAgICBjb25uZWN0KGNvbXBpbGUoZXhwciwgMCksIG5vZGUoKSk7XG4gICAgcmV0dXJuIG5mYTtcbiAgICBmdW5jdGlvbiBub2RlKCkgeyByZXR1cm4gbmZhLnB1c2goW10pIC0gMTsgfVxuICAgIGZ1bmN0aW9uIGVkZ2UoZnJvbSwgdG8sIHRlcm0pIHtcbiAgICAgICAgbGV0IGVkZ2UgPSB7IHRlcm0sIHRvIH07XG4gICAgICAgIG5mYVtmcm9tXS5wdXNoKGVkZ2UpO1xuICAgICAgICByZXR1cm4gZWRnZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29ubmVjdChlZGdlcywgdG8pIHtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChlZGdlID0+IGVkZ2UudG8gPSB0byk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBpbGUoZXhwciwgZnJvbSkge1xuICAgICAgICBpZiAoZXhwci50eXBlID09IFwiY2hvaWNlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByLmV4cHJzLnJlZHVjZSgob3V0LCBleHByKSA9PiBvdXQuY29uY2F0KGNvbXBpbGUoZXhwciwgZnJvbSkpLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwic2VxXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjb21waWxlKGV4cHIuZXhwcnNbaV0sIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChpID09IGV4cHIuZXhwcnMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICAgICAgY29ubmVjdChuZXh0LCBmcm9tID0gbm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJzdGFyXCIpIHtcbiAgICAgICAgICAgIGxldCBsb29wID0gbm9kZSgpO1xuICAgICAgICAgICAgZWRnZShmcm9tLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicGx1c1wiKSB7XG4gICAgICAgICAgICBsZXQgbG9vcCA9IG5vZGUoKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGZyb20pLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwib3B0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShmcm9tKV0uY29uY2F0KGNvbXBpbGUoZXhwci5leHByLCBmcm9tKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicmFuZ2VcIikge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIubWluOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUoKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBuZXh0KTtcbiAgICAgICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIubWF4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBleHByLm1pbjsgaSA8IGV4cHIubWF4OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVkZ2UoY3VyLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGN1cildO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcIm5hbWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGZyb20sIHVuZGVmaW5lZCwgZXhwci52YWx1ZSldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBleHByIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gYiAtIGE7IH1cbi8vIEdldCB0aGUgc2V0IG9mIG5vZGVzIHJlYWNoYWJsZSBieSBudWxsIGVkZ2VzIGZyb20gYG5vZGVgLiBPbWl0XG4vLyBub2RlcyB3aXRoIG9ubHkgYSBzaW5nbGUgbnVsbC1vdXQtZWRnZSwgc2luY2UgdGhleSBtYXkgbGVhZCB0b1xuLy8gbmVlZGxlc3MgZHVwbGljYXRlZCBub2Rlcy5cbmZ1bmN0aW9uIG51bGxGcm9tKG5mYSwgbm9kZSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBzY2FuKG5vZGUpO1xuICAgIHJldHVybiByZXN1bHQuc29ydChjbXApO1xuICAgIGZ1bmN0aW9uIHNjYW4obm9kZSkge1xuICAgICAgICBsZXQgZWRnZXMgPSBuZmFbbm9kZV07XG4gICAgICAgIGlmIChlZGdlcy5sZW5ndGggPT0gMSAmJiAhZWRnZXNbMF0udGVybSlcbiAgICAgICAgICAgIHJldHVybiBzY2FuKGVkZ2VzWzBdLnRvKTtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHRlcm0sIHRvIH0gPSBlZGdlc1tpXTtcbiAgICAgICAgICAgIGlmICghdGVybSAmJiByZXN1bHQuaW5kZXhPZih0bykgPT0gLTEpXG4gICAgICAgICAgICAgICAgc2Nhbih0byk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBDb21waWxlcyBhbiBORkEgYXMgcHJvZHVjZWQgYnkgYG5mYWAgaW50byBhIERGQSwgbW9kZWxlZCBhcyBhIHNldFxuLy8gb2Ygc3RhdGUgb2JqZWN0cyAoYENvbnRlbnRNYXRjaGAgaW5zdGFuY2VzKSB3aXRoIHRyYW5zaXRpb25zXG4vLyBiZXR3ZWVuIHRoZW0uXG5mdW5jdGlvbiBkZmEobmZhKSB7XG4gICAgbGV0IGxhYmVsZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHJldHVybiBleHBsb3JlKG51bGxGcm9tKG5mYSwgMCkpO1xuICAgIGZ1bmN0aW9uIGV4cGxvcmUoc3RhdGVzKSB7XG4gICAgICAgIGxldCBvdXQgPSBbXTtcbiAgICAgICAgc3RhdGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBuZmFbbm9kZV0uZm9yRWFjaCgoeyB0ZXJtLCB0byB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXJtKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbGV0IHNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFtpXVswXSA9PSB0ZXJtKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gb3V0W2ldWzFdO1xuICAgICAgICAgICAgICAgIG51bGxGcm9tKG5mYSwgdG8pLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goW3Rlcm0sIHNldCA9IFtdXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXQuaW5kZXhPZihub2RlKSA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgc3RhdGUgPSBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gPSBuZXcgQ29udGVudE1hdGNoKHN0YXRlcy5pbmRleE9mKG5mYS5sZW5ndGggLSAxKSA+IC0xKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZXMgPSBvdXRbaV1bMV0uc29ydChjbXApO1xuICAgICAgICAgICAgc3RhdGUubmV4dC5wdXNoKHsgdHlwZTogb3V0W2ldWzBdLCBuZXh0OiBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gfHwgZXhwbG9yZShzdGF0ZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0ZvckRlYWRFbmRzKG1hdGNoLCBzdHJlYW0pIHtcbiAgICBmb3IgKGxldCBpID0gMCwgd29yayA9IFttYXRjaF07IGkgPCB3b3JrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHdvcmtbaV0sIGRlYWQgPSAhc3RhdGUudmFsaWRFbmQsIG5vZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RhdGUubmV4dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gc3RhdGUubmV4dFtqXTtcbiAgICAgICAgICAgIG5vZGVzLnB1c2godHlwZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChkZWFkICYmICEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpKVxuICAgICAgICAgICAgICAgIGRlYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh3b3JrLmluZGV4T2YobmV4dCkgPT0gLTEpXG4gICAgICAgICAgICAgICAgd29yay5wdXNoKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWFkKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk9ubHkgbm9uLWdlbmVyYXRhYmxlIG5vZGVzIChcIiArIG5vZGVzLmpvaW4oXCIsIFwiKSArIFwiKSBpbiBhIHJlcXVpcmVkIHBvc2l0aW9uIChzZWUgaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jZ2VuZXJhdGFibGUpXCIpO1xuICAgIH1cbn1cblxuLy8gRm9yIG5vZGUgdHlwZXMgd2hlcmUgYWxsIGF0dHJzIGhhdmUgYSBkZWZhdWx0IHZhbHVlIChvciB3aGljaCBkb24ndFxuLy8gaGF2ZSBhbnkgYXR0cmlidXRlcyksIGJ1aWxkIHVwIGEgc2luZ2xlIHJldXNhYmxlIGRlZmF1bHQgYXR0cmlidXRlXG4vLyBvYmplY3QsIGFuZCB1c2UgaXQgZm9yIGFsbCBub2RlcyB0aGF0IGRvbid0IHNwZWNpZnkgc3BlY2lmaWNcbi8vIGF0dHJpYnV0ZXMuXG5mdW5jdGlvbiBkZWZhdWx0QXR0cnMoYXR0cnMpIHtcbiAgICBsZXQgZGVmYXVsdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGF0dHJOYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGxldCBhdHRyID0gYXR0cnNbYXR0ck5hbWVdO1xuICAgICAgICBpZiAoIWF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBkZWZhdWx0c1thdHRyTmFtZV0gPSBhdHRyLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0cztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVBdHRycyhhdHRycywgdmFsdWUpIHtcbiAgICBsZXQgYnVpbHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgbGV0IGdpdmVuID0gdmFsdWUgJiYgdmFsdWVbbmFtZV07XG4gICAgICAgIGlmIChnaXZlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYXR0ciA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKGF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgICAgICBnaXZlbiA9IGF0dHIuZGVmYXVsdDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIHZhbHVlIHN1cHBsaWVkIGZvciBhdHRyaWJ1dGUgXCIgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBidWlsdFtuYW1lXSA9IGdpdmVuO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbHQ7XG59XG5mdW5jdGlvbiBpbml0QXR0cnMoYXR0cnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBuZXcgQXR0cmlidXRlKGF0dHJzW25hbWVdKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5Ob2RlIHR5cGVzIGFyZSBvYmplY3RzIGFsbG9jYXRlZCBvbmNlIHBlciBgU2NoZW1hYCBhbmQgdXNlZCB0b1xuW3RhZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUudHlwZSkgYE5vZGVgIGluc3RhbmNlcy4gVGhleSBjb250YWluIGluZm9ybWF0aW9uXG5hYm91dCB0aGUgbm9kZSB0eXBlLCBzdWNoIGFzIGl0cyBuYW1lIGFuZCB3aGF0IGtpbmQgb2Ygbm9kZSBpdFxucmVwcmVzZW50cy5cbiovXG5jbGFzcyBOb2RlVHlwZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSB0aGUgbm9kZSB0eXBlIGhhcyBpbiB0aGlzIHNjaGVtYS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEEgbGluayBiYWNrIHRvIHRoZSBgU2NoZW1hYCB0aGUgbm9kZSB0eXBlIGJlbG9uZ3MgdG8uXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzcGVjIHRoYXQgdGhpcyB0eXBlIGlzIGJhc2VkIG9uXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIHNldCBvZiBtYXJrcyBhbGxvd2VkIGluIHRoaXMgbm9kZS4gYG51bGxgIG1lYW5zIGFsbCBtYXJrc1xuICAgICAgICBhcmUgYWxsb3dlZC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrU2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBzcGVjLmdyb3VwID8gc3BlYy5ncm91cC5zcGxpdChcIiBcIikgOiBbXTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGluaXRBdHRycyhzcGVjLmF0dHJzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXR0cnMgPSBkZWZhdWx0QXR0cnModGhpcy5hdHRycyk7XG4gICAgICAgIHRoaXMuY29udGVudE1hdGNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbmxpbmVDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0Jsb2NrID0gIShzcGVjLmlubGluZSB8fCBuYW1lID09IFwidGV4dFwiKTtcbiAgICAgICAgdGhpcy5pc1RleHQgPSBuYW1lID09IFwidGV4dFwiO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHRoaXMgaXMgYW4gaW5saW5lIHR5cGUuXG4gICAgKi9cbiAgICBnZXQgaXNJbmxpbmUoKSB7IHJldHVybiAhdGhpcy5pc0Jsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB0aGlzIGlzIGEgdGV4dGJsb2NrIHR5cGUsIGEgYmxvY2sgdGhhdCBjb250YWlucyBpbmxpbmVcbiAgICBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzVGV4dGJsb2NrKCkgeyByZXR1cm4gdGhpcy5pc0Jsb2NrICYmIHRoaXMuaW5saW5lQ29udGVudDsgfVxuICAgIC8qKlxuICAgIFRydWUgZm9yIG5vZGUgdHlwZXMgdGhhdCBhbGxvdyBubyBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzTGVhZigpIHsgcmV0dXJuIHRoaXMuY29udGVudE1hdGNoID09IENvbnRlbnRNYXRjaC5lbXB0eTsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgaXMgYW4gYXRvbSwgaS5lLiB3aGVuIGl0IGRvZXMgbm90IGhhdmVcbiAgICBkaXJlY3RseSBlZGl0YWJsZSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzQXRvbSgpIHsgcmV0dXJuIHRoaXMuaXNMZWFmIHx8ICEhdGhpcy5zcGVjLmF0b207IH1cbiAgICAvKipcbiAgICBUaGUgbm9kZSB0eXBlJ3MgW3doaXRlc3BhY2VdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy53aGl0ZXNwYWNlKSBvcHRpb24uXG4gICAgKi9cbiAgICBnZXQgd2hpdGVzcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BlYy53aGl0ZXNwYWNlIHx8ICh0aGlzLnNwZWMuY29kZSA/IFwicHJlXCIgOiBcIm5vcm1hbFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhpcyBub2RlIHR5cGUgaGFzIGFueSByZXF1aXJlZCBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgaGFzUmVxdWlyZWRBdHRycygpIHtcbiAgICAgICAgZm9yIChsZXQgbiBpbiB0aGlzLmF0dHJzKVxuICAgICAgICAgICAgaWYgKHRoaXMuYXR0cnNbbl0uaXNSZXF1aXJlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG5vZGUgYWxsb3dzIHNvbWUgb2YgdGhlIHNhbWUgY29udGVudCBhc1xuICAgIHRoZSBnaXZlbiBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBjb21wYXRpYmxlQ29udGVudChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCB0aGlzLmNvbnRlbnRNYXRjaC5jb21wYXRpYmxlKG90aGVyLmNvbnRlbnRNYXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcHV0ZUF0dHJzKGF0dHJzKSB7XG4gICAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QXR0cnM7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBjb21wdXRlQXR0cnModGhpcy5hdHRycywgYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBgTm9kZWAgb2YgdGhpcyB0eXBlLiBUaGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmVcbiAgICBjaGVja2VkIGFuZCBkZWZhdWx0ZWQgKHlvdSBjYW4gcGFzcyBgbnVsbGAgdG8gdXNlIHRoZSB0eXBlJ3NcbiAgICBkZWZhdWx0cyBlbnRpcmVseSwgaWYgbm8gcmVxdWlyZWQgYXR0cmlidXRlcyBleGlzdCkuIGBjb250ZW50YFxuICAgIG1heSBiZSBhIGBGcmFnbWVudGAsIGEgbm9kZSwgYW4gYXJyYXkgb2Ygbm9kZXMsIG9yXG4gICAgYG51bGxgLiBTaW1pbGFybHkgYG1hcmtzYCBtYXkgYmUgYG51bGxgIHRvIGRlZmF1bHQgdG8gdGhlIGVtcHR5XG4gICAgc2V0IG9mIG1hcmtzLlxuICAgICovXG4gICAgY3JlYXRlKGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNUZXh0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZVR5cGUuY3JlYXRlIGNhbid0IGNvbnN0cnVjdCB0ZXh0IG5vZGVzXCIpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5jb21wdXRlQXR0cnMoYXR0cnMpLCBGcmFnbWVudC5mcm9tKGNvbnRlbnQpLCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTGlrZSBbYGNyZWF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZS5jcmVhdGUpLCBidXQgY2hlY2sgdGhlIGdpdmVuIGNvbnRlbnRcbiAgICBhZ2FpbnN0IHRoZSBub2RlIHR5cGUncyBjb250ZW50IHJlc3RyaWN0aW9ucywgYW5kIHRocm93IGFuIGVycm9yXG4gICAgaWYgaXQgZG9lc24ndCBtYXRjaC5cbiAgICAqL1xuICAgIGNyZWF0ZUNoZWNrZWQoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbShjb250ZW50KTtcbiAgICAgICAgdGhpcy5jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCB0aGlzLmNvbXB1dGVBdHRycyhhdHRycyksIGNvbnRlbnQsIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgY3JlYXRlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVUeXBlLmNyZWF0ZSksIGJ1dCBzZWUgaWYgaXQgaXNcbiAgICBuZWNlc3NhcnkgdG8gYWRkIG5vZGVzIHRvIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGdpdmVuIGZyYWdtZW50XG4gICAgdG8gbWFrZSBpdCBmaXQgdGhlIG5vZGUuIElmIG5vIGZpdHRpbmcgd3JhcHBpbmcgY2FuIGJlIGZvdW5kLFxuICAgIHJldHVybiBudWxsLiBOb3RlIHRoYXQsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJlcXVpcmVkIG5vZGVzIGNhblxuICAgIGFsd2F5cyBiZSBjcmVhdGVkLCB0aGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQgaWYgeW91IHBhc3MgbnVsbCBvclxuICAgIGBGcmFnbWVudC5lbXB0eWAgYXMgY29udGVudC5cbiAgICAqL1xuICAgIGNyZWF0ZUFuZEZpbGwoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBhdHRycyA9IHRoaXMuY29tcHV0ZUF0dHJzKGF0dHJzKTtcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20oY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSB0aGlzLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFiZWZvcmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb250ZW50ID0gYmVmb3JlLmFwcGVuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2hlZCA9IHRoaXMuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgIGxldCBhZnRlciA9IG1hdGNoZWQgJiYgbWF0Y2hlZC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKTtcbiAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgYXR0cnMsIGNvbnRlbnQuYXBwZW5kKGFmdGVyKSwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgdmFsaWQgY29udGVudCBmb3IgdGhpcyBub2RlXG4gICAgdHlwZSB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgdmFsaWRDb250ZW50KGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQudmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya3MoY29udGVudC5jaGlsZChpKS5tYXJrcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhyb3dzIGEgUmFuZ2VFcnJvciBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgbm90IHZhbGlkIGNvbnRlbnQgZm9yIHRoaXNcbiAgICBub2RlIHR5cGUuXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0NvbnRlbnQoY29udGVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRDb250ZW50KGNvbnRlbnQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY29udGVudCBmb3Igbm9kZSAke3RoaXMubmFtZX06ICR7Y29udGVudC50b1N0cmluZygpLnNsaWNlKDAsIDUwKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbWFyayB0eXBlIGlzIGFsbG93ZWQgaW4gdGhpcyBub2RlLlxuICAgICovXG4gICAgYWxsb3dzTWFya1R5cGUobWFya1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFya1NldCA9PSBudWxsIHx8IHRoaXMubWFya1NldC5pbmRleE9mKG1hcmtUeXBlKSA+IC0xO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBhcmUgYWxsb3dlZCBpbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBhbGxvd3NNYXJrcyhtYXJrcykge1xuICAgICAgICBpZiAodGhpcy5tYXJrU2V0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrVHlwZShtYXJrc1tpXS50eXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIHRoZSBtYXJrcyB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gc2V0LlxuICAgICovXG4gICAgYWxsb3dlZE1hcmtzKG1hcmtzKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtTZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBtYXJrcztcbiAgICAgICAgbGV0IGNvcHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrVHlwZShtYXJrc1tpXS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IG1hcmtzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29weSkge1xuICAgICAgICAgICAgICAgIGNvcHkucHVzaChtYXJrc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFjb3B5ID8gbWFya3MgOiBjb3B5Lmxlbmd0aCA/IGNvcHkgOiBNYXJrLm5vbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNvbXBpbGUobm9kZXMsIHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobmFtZSwgc3BlYykgPT4gcmVzdWx0W25hbWVdID0gbmV3IE5vZGVUeXBlKG5hbWUsIHNjaGVtYSwgc3BlYykpO1xuICAgICAgICBsZXQgdG9wVHlwZSA9IHNjaGVtYS5zcGVjLnRvcE5vZGUgfHwgXCJkb2NcIjtcbiAgICAgICAgaWYgKCFyZXN1bHRbdG9wVHlwZV0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNjaGVtYSBpcyBtaXNzaW5nIGl0cyB0b3Agbm9kZSB0eXBlICgnXCIgKyB0b3BUeXBlICsgXCInKVwiKTtcbiAgICAgICAgaWYgKCFyZXN1bHQudGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRXZlcnkgc2NoZW1hIG5lZWRzIGEgJ3RleHQnIHR5cGVcIik7XG4gICAgICAgIGZvciAobGV0IF8gaW4gcmVzdWx0LnRleHQuYXR0cnMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSB0ZXh0IG5vZGUgdHlwZSBzaG91bGQgbm90IGhhdmUgYXR0cmlidXRlc1wiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vLyBBdHRyaWJ1dGUgZGVzY3JpcHRvcnNcbmNsYXNzIEF0dHJpYnV0ZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLmhhc0RlZmF1bHQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgXCJkZWZhdWx0XCIpO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSBvcHRpb25zLmRlZmF1bHQ7XG4gICAgfVxuICAgIGdldCBpc1JlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGFzRGVmYXVsdDtcbiAgICB9XG59XG4vLyBNYXJrc1xuLyoqXG5MaWtlIG5vZGVzLCBtYXJrcyAod2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBub2RlcyB0byBzaWduaWZ5XG50aGluZ3MgbGlrZSBlbXBoYXNpcyBvciBiZWluZyBwYXJ0IG9mIGEgbGluaykgYXJlXG5bdGFnZ2VkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFyay50eXBlKSB3aXRoIHR5cGUgb2JqZWN0cywgd2hpY2ggYXJlXG5pbnN0YW50aWF0ZWQgb25jZSBwZXIgYFNjaGVtYWAuXG4qL1xuY2xhc3MgTWFya1R5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhlIG1hcmsgdHlwZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmFuaywgXG4gICAgLyoqXG4gICAgVGhlIHNjaGVtYSB0aGF0IHRoaXMgbWFyayB0eXBlIGluc3RhbmNlIGlzIHBhcnQgb2YuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzcGVjIG9uIHdoaWNoIHRoZSB0eXBlIGlzIGJhc2VkLlxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgdGhpcy5hdHRycyA9IGluaXRBdHRycyhzcGVjLmF0dHJzKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZCA9IG51bGw7XG4gICAgICAgIGxldCBkZWZhdWx0cyA9IGRlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGRlZmF1bHRzID8gbmV3IE1hcmsodGhpcywgZGVmYXVsdHMpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBvZiB0aGlzIHR5cGUuIGBhdHRyc2AgbWF5IGJlIGBudWxsYCBvciBhbiBvYmplY3RcbiAgICBjb250YWluaW5nIG9ubHkgc29tZSBvZiB0aGUgbWFyaydzIGF0dHJpYnV0ZXMuIFRoZSBvdGhlcnMsIGlmXG4gICAgdGhleSBoYXZlIGRlZmF1bHRzLCB3aWxsIGJlIGFkZGVkLlxuICAgICovXG4gICAgY3JlYXRlKGF0dHJzID0gbnVsbCkge1xuICAgICAgICBpZiAoIWF0dHJzICYmIHRoaXMuaW5zdGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrKHRoaXMsIGNvbXB1dGVBdHRycyh0aGlzLmF0dHJzLCBhdHRycykpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjb21waWxlKG1hcmtzLCBzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCksIHJhbmsgPSAwO1xuICAgICAgICBtYXJrcy5mb3JFYWNoKChuYW1lLCBzcGVjKSA9PiByZXN1bHRbbmFtZV0gPSBuZXcgTWFya1R5cGUobmFtZSwgcmFuaysrLCBzY2hlbWEsIHNwZWMpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQsIGEgbmV3IHNldFxuICAgIHdpdGhvdXQgaXQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGlucHV0IHNldCBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIHJlbW92ZUZyb21TZXQoc2V0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldFtpXS50eXBlID09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBzZXQgPSBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRbaV07XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJpZXMgd2hldGhlciBhIGdpdmVuIG1hcmsgdHlwZSBpc1xuICAgIFtleGNsdWRlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjLmV4Y2x1ZGVzKSBieSB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGV4Y2x1ZGVzKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2x1ZGVkLmluZGV4T2Yob3RoZXIpID4gLTE7XG4gICAgfVxufVxuLyoqXG5BIGRvY3VtZW50IHNjaGVtYS4gSG9sZHMgW25vZGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZSkgYW5kIFttYXJrXG50eXBlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1R5cGUpIG9iamVjdHMgZm9yIHRoZSBub2RlcyBhbmQgbWFya3MgdGhhdCBtYXlcbm9jY3VyIGluIGNvbmZvcm1pbmcgZG9jdW1lbnRzLCBhbmQgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3JcbmNyZWF0aW5nIGFuZCBkZXNlcmlhbGl6aW5nIHN1Y2ggZG9jdW1lbnRzLlxuXG5XaGVuIGdpdmVuLCB0aGUgdHlwZSBwYXJhbWV0ZXJzIHByb3ZpZGUgdGhlIG5hbWVzIG9mIHRoZSBub2RlcyBhbmRcbm1hcmtzIGluIHRoaXMgc2NoZW1hLlxuKi9cbmNsYXNzIFNjaGVtYSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgc2NoZW1hIGZyb20gYSBzY2hlbWEgW3NwZWNpZmljYXRpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5TY2hlbWFTcGVjKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgIEFuIG9iamVjdCBmb3Igc3RvcmluZyB3aGF0ZXZlciB2YWx1ZXMgbW9kdWxlcyBtYXkgd2FudCB0b1xuICAgICAgICBjb21wdXRlIGFuZCBjYWNoZSBwZXIgc2NoZW1hLiAoSWYgeW91IHdhbnQgdG8gc3RvcmUgc29tZXRoaW5nXG4gICAgICAgIGluIGl0LCB0cnkgdG8gdXNlIHByb3BlcnR5IG5hbWVzIHVubGlrZWx5IHRvIGNsYXNoLilcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgaW5zdGFuY2VTcGVjID0gdGhpcy5zcGVjID0ge307XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gc3BlYylcbiAgICAgICAgICAgIGluc3RhbmNlU3BlY1twcm9wXSA9IHNwZWNbcHJvcF07XG4gICAgICAgIGluc3RhbmNlU3BlYy5ub2RlcyA9IE9yZGVyZWRNYXAuZnJvbShzcGVjLm5vZGVzKSxcbiAgICAgICAgICAgIGluc3RhbmNlU3BlYy5tYXJrcyA9IE9yZGVyZWRNYXAuZnJvbShzcGVjLm1hcmtzIHx8IHt9KSxcbiAgICAgICAgICAgIHRoaXMubm9kZXMgPSBOb2RlVHlwZS5jb21waWxlKHRoaXMuc3BlYy5ub2RlcywgdGhpcyk7XG4gICAgICAgIHRoaXMubWFya3MgPSBNYXJrVHlwZS5jb21waWxlKHRoaXMuc3BlYy5tYXJrcywgdGhpcyk7XG4gICAgICAgIGxldCBjb250ZW50RXhwckNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcCBpbiB0aGlzLm1hcmtzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKHByb3AgKyBcIiBjYW4gbm90IGJlIGJvdGggYSBub2RlIGFuZCBhIG1hcmtcIik7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMubm9kZXNbcHJvcF0sIGNvbnRlbnRFeHByID0gdHlwZS5zcGVjLmNvbnRlbnQgfHwgXCJcIiwgbWFya0V4cHIgPSB0eXBlLnNwZWMubWFya3M7XG4gICAgICAgICAgICB0eXBlLmNvbnRlbnRNYXRjaCA9IGNvbnRlbnRFeHByQ2FjaGVbY29udGVudEV4cHJdIHx8XG4gICAgICAgICAgICAgICAgKGNvbnRlbnRFeHByQ2FjaGVbY29udGVudEV4cHJdID0gQ29udGVudE1hdGNoLnBhcnNlKGNvbnRlbnRFeHByLCB0aGlzLm5vZGVzKSk7XG4gICAgICAgICAgICB0eXBlLmlubGluZUNvbnRlbnQgPSB0eXBlLmNvbnRlbnRNYXRjaC5pbmxpbmVDb250ZW50O1xuICAgICAgICAgICAgdHlwZS5tYXJrU2V0ID0gbWFya0V4cHIgPT0gXCJfXCIgPyBudWxsIDpcbiAgICAgICAgICAgICAgICBtYXJrRXhwciA/IGdhdGhlck1hcmtzKHRoaXMsIG1hcmtFeHByLnNwbGl0KFwiIFwiKSkgOlxuICAgICAgICAgICAgICAgICAgICBtYXJrRXhwciA9PSBcIlwiIHx8ICF0eXBlLmlubGluZUNvbnRlbnQgPyBbXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLm1hcmtzKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMubWFya3NbcHJvcF0sIGV4Y2wgPSB0eXBlLnNwZWMuZXhjbHVkZXM7XG4gICAgICAgICAgICB0eXBlLmV4Y2x1ZGVkID0gZXhjbCA9PSBudWxsID8gW3R5cGVdIDogZXhjbCA9PSBcIlwiID8gW10gOiBnYXRoZXJNYXJrcyh0aGlzLCBleGNsLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlRnJvbUpTT04gPSB0aGlzLm5vZGVGcm9tSlNPTi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm1hcmtGcm9tSlNPTiA9IHRoaXMubWFya0Zyb21KU09OLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudG9wTm9kZVR5cGUgPSB0aGlzLm5vZGVzW3RoaXMuc3BlYy50b3BOb2RlIHx8IFwiZG9jXCJdO1xuICAgICAgICB0aGlzLmNhY2hlZC53cmFwcGluZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIGluIHRoaXMgc2NoZW1hLiBUaGUgYHR5cGVgIG1heSBiZSBhIHN0cmluZyBvciBhXG4gICAgYE5vZGVUeXBlYCBpbnN0YW5jZS4gQXR0cmlidXRlcyB3aWxsIGJlIGV4dGVuZGVkIHdpdGggZGVmYXVsdHMsXG4gICAgYGNvbnRlbnRgIG1heSBiZSBhIGBGcmFnbWVudGAsIGBudWxsYCwgYSBgTm9kZWAsIG9yIGFuIGFycmF5IG9mXG4gICAgbm9kZXMuXG4gICAgKi9cbiAgICBub2RlKHR5cGUsIGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0eXBlID0gdGhpcy5ub2RlVHlwZSh0eXBlKTtcbiAgICAgICAgZWxzZSBpZiAoISh0eXBlIGluc3RhbmNlb2YgTm9kZVR5cGUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIG5vZGUgdHlwZTogXCIgKyB0eXBlKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZS5zY2hlbWEgIT0gdGhpcylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm9kZSB0eXBlIGZyb20gZGlmZmVyZW50IHNjaGVtYSB1c2VkIChcIiArIHR5cGUubmFtZSArIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlQ2hlY2tlZChhdHRycywgY29udGVudCwgbWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0ZXh0IG5vZGUgaW4gdGhlIHNjaGVtYS4gRW1wdHkgdGV4dCBub2RlcyBhcmUgbm90XG4gICAgYWxsb3dlZC5cbiAgICAqL1xuICAgIHRleHQodGV4dCwgbWFya3MpIHtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLm5vZGVzLnRleHQ7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUodHlwZSwgdHlwZS5kZWZhdWx0QXR0cnMsIHRleHQsIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBtYXJrKHR5cGUsIGF0dHJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdHlwZSA9IHRoaXMubWFya3NbdHlwZV07XG4gICAgICAgIHJldHVybiB0eXBlLmNyZWF0ZShhdHRycyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIGJvdW5kLlxuICAgICovXG4gICAgbm9kZUZyb21KU09OKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIE5vZGUuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIGJvdW5kLlxuICAgICovXG4gICAgbWFya0Zyb21KU09OKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIE1hcmsuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbm9kZVR5cGUobmFtZSkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLm5vZGVzW25hbWVdO1xuICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVbmtub3duIG5vZGUgdHlwZTogXCIgKyBuYW1lKTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdhdGhlck1hcmtzKHNjaGVtYSwgbWFya3MpIHtcbiAgICBsZXQgZm91bmQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBuYW1lID0gbWFya3NbaV0sIG1hcmsgPSBzY2hlbWEubWFya3NbbmFtZV0sIG9rID0gbWFyaztcbiAgICAgICAgaWYgKG1hcmspIHtcbiAgICAgICAgICAgIGZvdW5kLnB1c2gobWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNjaGVtYS5tYXJrcykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gc2NoZW1hLm1hcmtzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwiX1wiIHx8IChtYXJrLnNwZWMuZ3JvdXAgJiYgbWFyay5zcGVjLmdyb3VwLnNwbGl0KFwiIFwiKS5pbmRleE9mKG5hbWUpID4gLTEpKVxuICAgICAgICAgICAgICAgICAgICBmb3VuZC5wdXNoKG9rID0gbWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvaylcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlVua25vd24gbWFyayB0eXBlOiAnXCIgKyBtYXJrc1tpXSArIFwiJ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG4vKipcbkEgRE9NIHBhcnNlciByZXByZXNlbnRzIGEgc3RyYXRlZ3kgZm9yIHBhcnNpbmcgRE9NIGNvbnRlbnQgaW50byBhXG5Qcm9zZU1pcnJvciBkb2N1bWVudCBjb25mb3JtaW5nIHRvIGEgZ2l2ZW4gc2NoZW1hLiBJdHMgYmVoYXZpb3IgaXNcbmRlZmluZWQgYnkgYW4gYXJyYXkgb2YgW3J1bGVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlKS5cbiovXG5jbGFzcyBET01QYXJzZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBhcnNlciB0aGF0IHRhcmdldHMgdGhlIGdpdmVuIHNjaGVtYSwgdXNpbmcgdGhlIGdpdmVuXG4gICAgcGFyc2luZyBydWxlcy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzY2hlbWEgaW50byB3aGljaCB0aGUgcGFyc2VyIHBhcnNlcy5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhlIHNldCBvZiBbcGFyc2UgcnVsZXNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5QYXJzZVJ1bGUpIHRoYXQgdGhlIHBhcnNlclxuICAgIHVzZXMsIGluIG9yZGVyIG9mIHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBydWxlcykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudGFncyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3R5bGVzID0gW107XG4gICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICBpZiAocnVsZS50YWcpXG4gICAgICAgICAgICAgICAgdGhpcy50YWdzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChydWxlLnN0eWxlKVxuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbmx5IG5vcm1hbGl6ZSBsaXN0IGVsZW1lbnRzIHdoZW4gbGlzdHMgaW4gdGhlIHNjaGVtYSBjYW4ndCBkaXJlY3RseSBjb250YWluIHRoZW1zZWx2ZXNcbiAgICAgICAgdGhpcy5ub3JtYWxpemVMaXN0cyA9ICF0aGlzLnRhZ3Muc29tZShyID0+IHtcbiAgICAgICAgICAgIGlmICghL14odWx8b2wpXFxiLy50ZXN0KHIudGFnKSB8fCAhci5ub2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBub2RlID0gc2NoZW1hLm5vZGVzW3Iubm9kZV07XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUGFyc2UgYSBkb2N1bWVudCBmcm9tIHRoZSBjb250ZW50IG9mIGEgRE9NIG5vZGUuXG4gICAgKi9cbiAgICBwYXJzZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgICBjb250ZXh0LmFkZEFsbChkb20sIG9wdGlvbnMuZnJvbSwgb3B0aW9ucy50byk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBQYXJzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBub2RlLCBsaWtlXG4gICAgW2BwYXJzZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5ET01QYXJzZXIucGFyc2UpLCBhbmQgdGFrZXMgdGhlIHNhbWUgc2V0IG9mXG4gICAgb3B0aW9ucy4gQnV0IHVubGlrZSB0aGF0IG1ldGhvZCwgd2hpY2ggcHJvZHVjZXMgYSB3aG9sZSBub2RlLFxuICAgIHRoaXMgb25lIHJldHVybnMgYSBzbGljZSB0aGF0IGlzIG9wZW4gYXQgdGhlIHNpZGVzLCBtZWFuaW5nIHRoYXRcbiAgICB0aGUgc2NoZW1hIGNvbnN0cmFpbnRzIGFyZW4ndCBhcHBsaWVkIHRvIHRoZSBzdGFydCBvZiBub2RlcyB0b1xuICAgIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBhbmQgdGhlIGVuZCBvZiBub2RlcyBhdCB0aGUgZW5kLlxuICAgICovXG4gICAgcGFyc2VTbGljZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuYWRkQWxsKGRvbSwgb3B0aW9ucy5mcm9tLCBvcHRpb25zLnRvKTtcbiAgICAgICAgcmV0dXJuIFNsaWNlLm1heE9wZW4oY29udGV4dC5maW5pc2goKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF0Y2hUYWcoZG9tLCBjb250ZXh0LCBhZnRlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gYWZ0ZXIgPyB0aGlzLnRhZ3MuaW5kZXhPZihhZnRlcikgKyAxIDogMDsgaSA8IHRoaXMudGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJ1bGUgPSB0aGlzLnRhZ3NbaV07XG4gICAgICAgICAgICBpZiAobWF0Y2hlcyhkb20sIHJ1bGUudGFnKSAmJlxuICAgICAgICAgICAgICAgIChydWxlLm5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkIHx8IGRvbS5uYW1lc3BhY2VVUkkgPT0gcnVsZS5uYW1lc3BhY2UpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlLmNvbnRleHQgfHwgY29udGV4dC5tYXRjaGVzQ29udGV4dChydWxlLmNvbnRleHQpKSkge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBydWxlLmdldEF0dHJzKGRvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUuYXR0cnMgPSByZXN1bHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hdGNoU3R5bGUocHJvcCwgdmFsdWUsIGNvbnRleHQsIGFmdGVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZnRlciA/IHRoaXMuc3R5bGVzLmluZGV4T2YoYWZ0ZXIpICsgMSA6IDA7IGkgPCB0aGlzLnN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJ1bGUgPSB0aGlzLnN0eWxlc1tpXSwgc3R5bGUgPSBydWxlLnN0eWxlO1xuICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YocHJvcCkgIT0gMCB8fFxuICAgICAgICAgICAgICAgIHJ1bGUuY29udGV4dCAmJiAhY29udGV4dC5tYXRjaGVzQ29udGV4dChydWxlLmNvbnRleHQpIHx8XG4gICAgICAgICAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBzdHlsZSBzdHJpbmcgZWl0aGVyIHByZWNpc2VseSBtYXRjaGVzIHRoZSBwcm9wLFxuICAgICAgICAgICAgICAgIC8vIG9yIGhhcyBhbiAnPScgc2lnbiBhZnRlciB0aGUgcHJvcCwgZm9sbG93ZWQgYnkgdGhlIGdpdmVuXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgc3R5bGUubGVuZ3RoID4gcHJvcC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHN0eWxlLmNoYXJDb2RlQXQocHJvcC5sZW5ndGgpICE9IDYxIHx8IHN0eWxlLnNsaWNlKHByb3AubGVuZ3RoICsgMSkgIT0gdmFsdWUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJ1bGUuZ2V0QXR0cnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcnVsZS5nZXRBdHRycyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJ1bGUuYXR0cnMgPSByZXN1bHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgc2NoZW1hUnVsZXMoc2NoZW1hKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gaW5zZXJ0KHJ1bGUpIHtcbiAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IHJ1bGUucHJpb3JpdHkgPT0gbnVsbCA/IDUwIDogcnVsZS5wcmlvcml0eSwgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcmVzdWx0W2ldLCBuZXh0UHJpb3JpdHkgPSBuZXh0LnByaW9yaXR5ID09IG51bGwgPyA1MCA6IG5leHQucHJpb3JpdHk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRQcmlvcml0eSA8IHByaW9yaXR5KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UoaSwgMCwgcnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBzY2hlbWEubWFya3MpIHtcbiAgICAgICAgICAgIGxldCBydWxlcyA9IHNjaGVtYS5tYXJrc1tuYW1lXS5zcGVjLnBhcnNlRE9NO1xuICAgICAgICAgICAgaWYgKHJ1bGVzKVxuICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydChydWxlID0gY29weShydWxlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHJ1bGUubWFyayB8fCBydWxlLmlnbm9yZSB8fCBydWxlLmNsZWFyTWFyaykpXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlLm1hcmsgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gc2NoZW1hLm5vZGVzKSB7XG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBzY2hlbWEubm9kZXNbbmFtZV0uc3BlYy5wYXJzZURPTTtcbiAgICAgICAgICAgIGlmIChydWxlcylcbiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnQocnVsZSA9IGNvcHkocnVsZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShydWxlLm5vZGUgfHwgcnVsZS5pZ25vcmUgfHwgcnVsZS5tYXJrKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubm9kZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgRE9NIHBhcnNlciB1c2luZyB0aGUgcGFyc2luZyBydWxlcyBsaXN0ZWQgaW4gYVxuICAgIHNjaGVtYSdzIFtub2RlIHNwZWNzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMucGFyc2VET00pLCByZW9yZGVyZWQgYnlcbiAgICBbcHJpb3JpdHldKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5QYXJzZVJ1bGUucHJpb3JpdHkpLlxuICAgICovXG4gICAgc3RhdGljIGZyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuY2FjaGVkLmRvbVBhcnNlciB8fFxuICAgICAgICAgICAgKHNjaGVtYS5jYWNoZWQuZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcihzY2hlbWEsIERPTVBhcnNlci5zY2hlbWFSdWxlcyhzY2hlbWEpKSk7XG4gICAgfVxufVxuY29uc3QgYmxvY2tUYWdzID0ge1xuICAgIGFkZHJlc3M6IHRydWUsIGFydGljbGU6IHRydWUsIGFzaWRlOiB0cnVlLCBibG9ja3F1b3RlOiB0cnVlLCBjYW52YXM6IHRydWUsXG4gICAgZGQ6IHRydWUsIGRpdjogdHJ1ZSwgZGw6IHRydWUsIGZpZWxkc2V0OiB0cnVlLCBmaWdjYXB0aW9uOiB0cnVlLCBmaWd1cmU6IHRydWUsXG4gICAgZm9vdGVyOiB0cnVlLCBmb3JtOiB0cnVlLCBoMTogdHJ1ZSwgaDI6IHRydWUsIGgzOiB0cnVlLCBoNDogdHJ1ZSwgaDU6IHRydWUsXG4gICAgaDY6IHRydWUsIGhlYWRlcjogdHJ1ZSwgaGdyb3VwOiB0cnVlLCBocjogdHJ1ZSwgbGk6IHRydWUsIG5vc2NyaXB0OiB0cnVlLCBvbDogdHJ1ZSxcbiAgICBvdXRwdXQ6IHRydWUsIHA6IHRydWUsIHByZTogdHJ1ZSwgc2VjdGlvbjogdHJ1ZSwgdGFibGU6IHRydWUsIHRmb290OiB0cnVlLCB1bDogdHJ1ZVxufTtcbmNvbnN0IGlnbm9yZVRhZ3MgPSB7XG4gICAgaGVhZDogdHJ1ZSwgbm9zY3JpcHQ6IHRydWUsIG9iamVjdDogdHJ1ZSwgc2NyaXB0OiB0cnVlLCBzdHlsZTogdHJ1ZSwgdGl0bGU6IHRydWVcbn07XG5jb25zdCBsaXN0VGFncyA9IHsgb2w6IHRydWUsIHVsOiB0cnVlIH07XG4vLyBVc2luZyBhIGJpdGZpZWxkIGZvciBub2RlIGNvbnRleHQgb3B0aW9uc1xuY29uc3QgT1BUX1BSRVNFUlZFX1dTID0gMSwgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgPSAyLCBPUFRfT1BFTl9MRUZUID0gNDtcbmZ1bmN0aW9uIHdzT3B0aW9uc0Zvcih0eXBlLCBwcmVzZXJ2ZVdoaXRlc3BhY2UsIGJhc2UpIHtcbiAgICBpZiAocHJlc2VydmVXaGl0ZXNwYWNlICE9IG51bGwpXG4gICAgICAgIHJldHVybiAocHJlc2VydmVXaGl0ZXNwYWNlID8gT1BUX1BSRVNFUlZFX1dTIDogMCkgfFxuICAgICAgICAgICAgKHByZXNlcnZlV2hpdGVzcGFjZSA9PT0gXCJmdWxsXCIgPyBPUFRfUFJFU0VSVkVfV1NfRlVMTCA6IDApO1xuICAgIHJldHVybiB0eXBlICYmIHR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiID8gT1BUX1BSRVNFUlZFX1dTIHwgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgOiBiYXNlICYgfk9QVF9PUEVOX0xFRlQ7XG59XG5jbGFzcyBOb2RlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgYXR0cnMsIFxuICAgIC8vIE1hcmtzIGFwcGxpZWQgdG8gdGhpcyBub2RlIGl0c2VsZlxuICAgIG1hcmtzLCBcbiAgICAvLyBNYXJrcyB0aGF0IGNhbid0IGFwcGx5IGhlcmUsIGJ1dCB3aWxsIGJlIHVzZWQgaW4gY2hpbGRyZW4gaWYgcG9zc2libGVcbiAgICBwZW5kaW5nTWFya3MsIHNvbGlkLCBtYXRjaCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy5wZW5kaW5nTWFya3MgPSBwZW5kaW5nTWFya3M7XG4gICAgICAgIHRoaXMuc29saWQgPSBzb2xpZDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5jb250ZW50ID0gW107XG4gICAgICAgIC8vIE1hcmtzIGFwcGxpZWQgdG8gdGhlIG5vZGUncyBjaGlsZHJlblxuICAgICAgICB0aGlzLmFjdGl2ZU1hcmtzID0gTWFyay5ub25lO1xuICAgICAgICAvLyBOZXN0ZWQgTWFya3Mgd2l0aCBzYW1lIHR5cGVcbiAgICAgICAgdGhpcy5zdGFzaE1hcmtzID0gW107XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaCB8fCAob3B0aW9ucyAmIE9QVF9PUEVOX0xFRlQgPyBudWxsIDogdHlwZS5jb250ZW50TWF0Y2gpO1xuICAgIH1cbiAgICBmaW5kV3JhcHBpbmcobm9kZSkge1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2gpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBmaWxsID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgICAgICAgICAgaWYgKGZpbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGZpbGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaCwgd3JhcDtcbiAgICAgICAgICAgICAgICBpZiAod3JhcCA9IHN0YXJ0LmZpbmRXcmFwcGluZyhub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2guZmluZFdyYXBwaW5nKG5vZGUudHlwZSk7XG4gICAgfVxuICAgIGZpbmlzaChvcGVuRW5kKSB7XG4gICAgICAgIGlmICghKHRoaXMub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XUykpIHsgLy8gU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdLCBtO1xuICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC5pc1RleHQgJiYgKG0gPSAvWyBcXHRcXHJcXG5cXHUwMDBjXSskLy5leGVjKGxhc3QudGV4dCkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsYXN0LnRleHQubGVuZ3RoID09IG1bMF0ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucG9wKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdID0gdGV4dC53aXRoVGV4dCh0ZXh0LnRleHQuc2xpY2UoMCwgdGV4dC50ZXh0Lmxlbmd0aCAtIG1bMF0ubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHRoaXMuY29udGVudCk7XG4gICAgICAgIGlmICghb3BlbkVuZCAmJiB0aGlzLm1hdGNoKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuYXBwZW5kKHRoaXMubWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID8gdGhpcy50eXBlLmNyZWF0ZSh0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKSA6IGNvbnRlbnQ7XG4gICAgfVxuICAgIHBvcEZyb21TdGFzaE1hcmsobWFyaykge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFzaE1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgaWYgKG1hcmsuZXEodGhpcy5zdGFzaE1hcmtzW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFzaE1hcmtzLnNwbGljZShpLCAxKVswXTtcbiAgICB9XG4gICAgYXBwbHlQZW5kaW5nKG5leHRUeXBlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nTWFya3M7IGkgPCBwZW5kaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFyayA9IHBlbmRpbmdbaV07XG4gICAgICAgICAgICBpZiAoKHRoaXMudHlwZSA/IHRoaXMudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrLnR5cGUpIDogbWFya01heUFwcGx5KG1hcmsudHlwZSwgbmV4dFR5cGUpKSAmJlxuICAgICAgICAgICAgICAgICFtYXJrLmlzSW5TZXQodGhpcy5hY3RpdmVNYXJrcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU1hcmtzID0gbWFyay5hZGRUb1NldCh0aGlzLmFjdGl2ZU1hcmtzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdNYXJrcyA9IG1hcmsucmVtb3ZlRnJvbVNldCh0aGlzLnBlbmRpbmdNYXJrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5saW5lQ29udGV4dChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmlubGluZUNvbnRlbnQ7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFswXS5pc0lubGluZTtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSAmJiAhYmxvY2tUYWdzLmhhc093blByb3BlcnR5KG5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG59XG5jbGFzcyBQYXJzZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBwYXJzZXIgd2UgYXJlIHVzaW5nLlxuICAgIHBhcnNlciwgXG4gICAgLy8gVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoaXMgcGFyc2UuXG4gICAgb3B0aW9ucywgaXNPcGVuKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGlzT3BlbjtcbiAgICAgICAgdGhpcy5vcGVuID0gMDtcbiAgICAgICAgbGV0IHRvcE5vZGUgPSBvcHRpb25zLnRvcE5vZGUsIHRvcENvbnRleHQ7XG4gICAgICAgIGxldCB0b3BPcHRpb25zID0gd3NPcHRpb25zRm9yKG51bGwsIG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlLCAwKSB8IChpc09wZW4gPyBPUFRfT1BFTl9MRUZUIDogMCk7XG4gICAgICAgIGlmICh0b3BOb2RlKVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dCh0b3BOb2RlLnR5cGUsIHRvcE5vZGUuYXR0cnMsIE1hcmsubm9uZSwgTWFyay5ub25lLCB0cnVlLCBvcHRpb25zLnRvcE1hdGNoIHx8IHRvcE5vZGUudHlwZS5jb250ZW50TWF0Y2gsIHRvcE9wdGlvbnMpO1xuICAgICAgICBlbHNlIGlmIChpc09wZW4pXG4gICAgICAgICAgICB0b3BDb250ZXh0ID0gbmV3IE5vZGVDb250ZXh0KG51bGwsIG51bGwsIE1hcmsubm9uZSwgTWFyay5ub25lLCB0cnVlLCBudWxsLCB0b3BPcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dChwYXJzZXIuc2NoZW1hLnRvcE5vZGVUeXBlLCBudWxsLCBNYXJrLm5vbmUsIE1hcmsubm9uZSwgdHJ1ZSwgbnVsbCwgdG9wT3B0aW9ucyk7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbdG9wQ29udGV4dF07XG4gICAgICAgIHRoaXMuZmluZCA9IG9wdGlvbnMuZmluZFBvc2l0aW9ucztcbiAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCB0b3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzW3RoaXMub3Blbl07XG4gICAgfVxuICAgIC8vIEFkZCBhIERPTSBub2RlIHRvIHRoZSBjb250ZW50LiBUZXh0IGlzIGluc2VydGVkIGFzIHRleHQgbm9kZSxcbiAgICAvLyBvdGhlcndpc2UsIHRoZSBub2RlIGlzIHBhc3NlZCB0byBgYWRkRWxlbWVudGAgb3IsIGlmIGl0IGhhcyBhXG4gICAgLy8gYHN0eWxlYCBhdHRyaWJ1dGUsIGBhZGRFbGVtZW50V2l0aFN0eWxlc2AuXG4gICAgYWRkRE9NKGRvbSkge1xuICAgICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKGRvbSk7XG4gICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KGRvbSk7XG4gICAgfVxuICAgIHdpdGhTdHlsZVJ1bGVzKGRvbSwgZikge1xuICAgICAgICBsZXQgc3R5bGUgPSBkb20uZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgIGlmICghc3R5bGUpXG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICBsZXQgbWFya3MgPSB0aGlzLnJlYWRTdHlsZXMocGFyc2VTdHlsZXMoc3R5bGUpKTtcbiAgICAgICAgaWYgKCFtYXJrcylcbiAgICAgICAgICAgIHJldHVybjsgLy8gQSBzdHlsZSB3aXRoIGlnbm9yZTogdHJ1ZVxuICAgICAgICBsZXQgW2FkZE1hcmtzLCByZW1vdmVNYXJrc10gPSBtYXJrcywgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlTWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVBlbmRpbmdNYXJrKHJlbW92ZU1hcmtzW2ldLCB0b3ApO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZE1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5hZGRQZW5kaW5nTWFyayhhZGRNYXJrc1tpXSk7XG4gICAgICAgIGYoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRNYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUGVuZGluZ01hcmsoYWRkTWFya3NbaV0sIHRvcCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlTWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmFkZFBlbmRpbmdNYXJrKHJlbW92ZU1hcmtzW2ldKTtcbiAgICB9XG4gICAgYWRkVGV4dE5vZGUoZG9tKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGRvbS5ub2RlVmFsdWU7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcDtcbiAgICAgICAgaWYgKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgfHxcbiAgICAgICAgICAgIHRvcC5pbmxpbmVDb250ZXh0KGRvbSkgfHxcbiAgICAgICAgICAgIC9bXiBcXHRcXHJcXG5cXHUwMDBjXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICghKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvWyBcXHRcXHJcXG5cXHUwMDBjXSsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3RhcnRzIHdpdGggd2hpdGVzcGFjZSwgYW5kIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlIGl0LCBvclxuICAgICAgICAgICAgICAgIC8vIGEgaGFyZCBicmVhaywgb3IgYSB0ZXh0IG5vZGUgdGhhdCBlbmRzIHdpdGggd2hpdGVzcGFjZSwgc3RyaXAgdGhlXG4gICAgICAgICAgICAgICAgLy8gbGVhZGluZyBzcGFjZS5cbiAgICAgICAgICAgICAgICBpZiAoL15bIFxcdFxcclxcblxcdTAwMGNdLy50ZXN0KHZhbHVlKSAmJiB0aGlzLm9wZW4gPT0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlQmVmb3JlID0gdG9wLmNvbnRlbnRbdG9wLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb21Ob2RlQmVmb3JlID0gZG9tLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlQmVmb3JlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZG9tTm9kZUJlZm9yZSAmJiBkb21Ob2RlQmVmb3JlLm5vZGVOYW1lID09ICdCUicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAobm9kZUJlZm9yZS5pc1RleHQgJiYgL1sgXFx0XFxyXFxuXFx1MDAwY10kLy50ZXN0KG5vZGVCZWZvcmUudGV4dCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTX0ZVTEwpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnROb2RlKHRoaXMucGFyc2VyLnNjaGVtYS50ZXh0KHZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLmZpbmRJblRleHQoZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIHRhZyBhbmQgdXNlIHRoYXQgdG8gcGFyc2UuIElmXG4gICAgLy8gbm9uZSBpcyBmb3VuZCwgdGhlIGVsZW1lbnQncyBjb250ZW50IG5vZGVzIGFyZSBhZGRlZCBkaXJlY3RseS5cbiAgICBhZGRFbGVtZW50KGRvbSwgbWF0Y2hBZnRlcikge1xuICAgICAgICBsZXQgbmFtZSA9IGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBydWxlSUQ7XG4gICAgICAgIGlmIChsaXN0VGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB0aGlzLnBhcnNlci5ub3JtYWxpemVMaXN0cylcbiAgICAgICAgICAgIG5vcm1hbGl6ZUxpc3QoZG9tKTtcbiAgICAgICAgbGV0IHJ1bGUgPSAodGhpcy5vcHRpb25zLnJ1bGVGcm9tTm9kZSAmJiB0aGlzLm9wdGlvbnMucnVsZUZyb21Ob2RlKGRvbSkpIHx8XG4gICAgICAgICAgICAocnVsZUlEID0gdGhpcy5wYXJzZXIubWF0Y2hUYWcoZG9tLCB0aGlzLCBtYXRjaEFmdGVyKSk7XG4gICAgICAgIGlmIChydWxlID8gcnVsZS5pZ25vcmUgOiBpZ25vcmVUYWdzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlRmFsbGJhY2soZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcnVsZSB8fCBydWxlLnNraXAgfHwgcnVsZS5jbG9zZVBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5jbG9zZVBhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBNYXRoLm1heCgwLCB0aGlzLm9wZW4gLSAxKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUgJiYgcnVsZS5za2lwLm5vZGVUeXBlKVxuICAgICAgICAgICAgICAgIGRvbSA9IHJ1bGUuc2tpcDtcbiAgICAgICAgICAgIGxldCBzeW5jLCB0b3AgPSB0aGlzLnRvcCwgb2xkTmVlZHNCbG9jayA9IHRoaXMubmVlZHNCbG9jaztcbiAgICAgICAgICAgIGlmIChibG9ja1RhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wLmNvbnRlbnQubGVuZ3RoICYmIHRvcC5jb250ZW50WzBdLmlzSW5saW5lICYmIHRoaXMub3Blbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4tLTtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGhpcy50b3A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghdG9wLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZG9tLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxlYWZGYWxsYmFjayhkb20pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUuc2tpcClcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFsbChkb20pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFN0eWxlUnVsZXMoZG9tLCAoKSA9PiB0aGlzLmFkZEFsbChkb20pKTtcbiAgICAgICAgICAgIGlmIChzeW5jKVxuICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gb2xkTmVlZHNCbG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFN0eWxlUnVsZXMoZG9tLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50QnlSdWxlKGRvbSwgcnVsZSwgcnVsZS5jb25zdW1pbmcgPT09IGZhbHNlID8gcnVsZUlEIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbGxlZCBmb3IgbGVhZiBET00gbm9kZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaWdub3JlZFxuICAgIGxlYWZGYWxsYmFjayhkb20pIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgdGhpcy50b3AudHlwZSAmJiB0aGlzLnRvcC50eXBlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKGRvbS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXFxuXCIpKTtcbiAgICB9XG4gICAgLy8gQ2FsbGVkIGZvciBpZ25vcmVkIG5vZGVzXG4gICAgaWdub3JlRmFsbGJhY2soZG9tKSB7XG4gICAgICAgIC8vIElnbm9yZWQgQlIgbm9kZXMgc2hvdWxkIGF0IGxlYXN0IGNyZWF0ZSBhbiBpbmxpbmUgY29udGV4dFxuICAgICAgICBpZiAoZG9tLm5vZGVOYW1lID09IFwiQlJcIiAmJiAoIXRoaXMudG9wLnR5cGUgfHwgIXRoaXMudG9wLnR5cGUuaW5saW5lQ29udGVudCkpXG4gICAgICAgICAgICB0aGlzLmZpbmRQbGFjZSh0aGlzLnBhcnNlci5zY2hlbWEudGV4dChcIi1cIikpO1xuICAgIH1cbiAgICAvLyBSdW4gYW55IHN0eWxlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUncyBzdHlsZXMuIEVpdGhlclxuICAgIC8vIHJldHVybiBhbiBhcnJheSBvZiBtYXJrcywgb3IgbnVsbCB0byBpbmRpY2F0ZSBzb21lIG9mIHRoZSBzdHlsZXNcbiAgICAvLyBoYWQgYSBydWxlIHdpdGggYGlnbm9yZWAgc2V0LlxuICAgIHJlYWRTdHlsZXMoc3R5bGVzKSB7XG4gICAgICAgIGxldCBhZGQgPSBNYXJrLm5vbmUsIHJlbW92ZSA9IE1hcmsubm9uZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGFmdGVyID0gdW5kZWZpbmVkOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHRoaXMucGFyc2VyLm1hdGNoU3R5bGUoc3R5bGVzW2ldLCBzdHlsZXNbaSArIDFdLCB0aGlzLCBhZnRlcik7XG4gICAgICAgICAgICAgICAgaWYgKCFydWxlKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5pZ25vcmUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmNsZWFyTWFyaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcC5wZW5kaW5nTWFya3MuY29uY2F0KHRoaXMudG9wLmFjdGl2ZU1hcmtzKS5mb3JFYWNoKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY2xlYXJNYXJrKG0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IG0uYWRkVG9TZXQocmVtb3ZlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGQgPSB0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXS5jcmVhdGUocnVsZS5hdHRycykuYWRkVG9TZXQoYWRkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuY29uc3VtaW5nID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBydWxlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFthZGQsIHJlbW92ZV07XG4gICAgfVxuICAgIC8vIExvb2sgdXAgYSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gbm9kZS4gSWYgbm9uZSBhcmUgZm91bmQsIHJldHVyblxuICAgIC8vIGZhbHNlLiBPdGhlcndpc2UsIGFwcGx5IGl0LCB1c2UgaXRzIHJldHVybiB2YWx1ZSB0byBkcml2ZSB0aGUgd2F5XG4gICAgLy8gdGhlIG5vZGUncyBjb250ZW50IGlzIHdyYXBwZWQsIGFuZCByZXR1cm4gdHJ1ZS5cbiAgICBhZGRFbGVtZW50QnlSdWxlKGRvbSwgcnVsZSwgY29udGludWVBZnRlcikge1xuICAgICAgICBsZXQgc3luYywgbm9kZVR5cGUsIG1hcms7XG4gICAgICAgIGlmIChydWxlLm5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVUeXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW3J1bGUubm9kZV07XG4gICAgICAgICAgICBpZiAoIW5vZGVUeXBlLmlzTGVhZikge1xuICAgICAgICAgICAgICAgIHN5bmMgPSB0aGlzLmVudGVyKG5vZGVUeXBlLCBydWxlLmF0dHJzIHx8IG51bGwsIHJ1bGUucHJlc2VydmVXaGl0ZXNwYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmluc2VydE5vZGUobm9kZVR5cGUuY3JlYXRlKHJ1bGUuYXR0cnMpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVhZkZhbGxiYWNrKGRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFya1R5cGUgPSB0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXTtcbiAgICAgICAgICAgIG1hcmsgPSBtYXJrVHlwZS5jcmVhdGUocnVsZS5hdHRycyk7XG4gICAgICAgICAgICB0aGlzLmFkZFBlbmRpbmdNYXJrKG1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydEluID0gdGhpcy50b3A7XG4gICAgICAgIGlmIChub2RlVHlwZSAmJiBub2RlVHlwZS5pc0xlYWYpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRpbnVlQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudChkb20sIGNvbnRpbnVlQWZ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGUuZ2V0Q29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgICAgICBydWxlLmdldENvbnRlbnQoZG9tLCB0aGlzLnBhcnNlci5zY2hlbWEpLmZvckVhY2gobm9kZSA9PiB0aGlzLmluc2VydE5vZGUobm9kZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRET00gPSBkb207XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUuY29udGVudEVsZW1lbnQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gZG9tLnF1ZXJ5U2VsZWN0b3IocnVsZS5jb250ZW50RWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcnVsZS5jb250ZW50RWxlbWVudCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQoZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUuY29udGVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmZpbmRBcm91bmQoZG9tLCBjb250ZW50RE9NLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQWxsKGNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW5jICYmIHRoaXMuc3luYyhzdGFydEluKSlcbiAgICAgICAgICAgIHRoaXMub3Blbi0tO1xuICAgICAgICBpZiAobWFyaylcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUGVuZGluZ01hcmsobWFyaywgc3RhcnRJbik7XG4gICAgfVxuICAgIC8vIEFkZCBhbGwgY2hpbGQgbm9kZXMgYmV0d2VlbiBgc3RhcnRJbmRleGAgYW5kIGBlbmRJbmRleGAgKG9yIHRoZVxuICAgIC8vIHdob2xlIG5vZGUsIGlmIG5vdCBnaXZlbikuIElmIGBzeW5jYCBpcyBwYXNzZWQsIHVzZSBpdCB0b1xuICAgIC8vIHN5bmNocm9uaXplIGFmdGVyIGV2ZXJ5IGJsb2NrIGVsZW1lbnQuXG4gICAgYWRkQWxsKHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gc3RhcnRJbmRleCB8fCAwO1xuICAgICAgICBmb3IgKGxldCBkb20gPSBzdGFydEluZGV4ID8gcGFyZW50LmNoaWxkTm9kZXNbc3RhcnRJbmRleF0gOiBwYXJlbnQuZmlyc3RDaGlsZCwgZW5kID0gZW5kSW5kZXggPT0gbnVsbCA/IG51bGwgOiBwYXJlbnQuY2hpbGROb2Rlc1tlbmRJbmRleF07IGRvbSAhPSBlbmQ7IGRvbSA9IGRvbS5uZXh0U2libGluZywgKytpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRE9NKGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpbmQgYSB3YXkgdG8gZml0IHRoZSBnaXZlbiBub2RlIHR5cGUgaW50byB0aGUgY3VycmVudFxuICAgIC8vIGNvbnRleHQuIE1heSBhZGQgaW50ZXJtZWRpYXRlIHdyYXBwZXJzIGFuZC9vciBsZWF2ZSBub24tc29saWRcbiAgICAvLyBub2RlcyB0aGF0IHdlJ3JlIGluLlxuICAgIGZpbmRQbGFjZShub2RlKSB7XG4gICAgICAgIGxldCByb3V0ZSwgc3luYztcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSB0aGlzLm9wZW47IGRlcHRoID49IDA7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBjeCA9IHRoaXMubm9kZXNbZGVwdGhdO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gY3guZmluZFdyYXBwaW5nKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGZvdW5kICYmICghcm91dGUgfHwgcm91dGUubGVuZ3RoID4gZm91bmQubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIHJvdXRlID0gZm91bmQ7XG4gICAgICAgICAgICAgICAgc3luYyA9IGN4O1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjeC5zb2xpZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnN5bmMoc3luYyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmVudGVySW5uZXIocm91dGVbaV0sIG51bGwsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFRyeSB0byBpbnNlcnQgdGhlIGdpdmVuIG5vZGUsIGFkanVzdGluZyB0aGUgY29udGV4dCB3aGVuIG5lZWRlZC5cbiAgICBpbnNlcnROb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuaXNJbmxpbmUgJiYgdGhpcy5uZWVkc0Jsb2NrICYmICF0aGlzLnRvcC50eXBlKSB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLnRleHRibG9ja0Zyb21Db250ZXh0KCk7XG4gICAgICAgICAgICBpZiAoYmxvY2spXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRlcklubmVyKGJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maW5kUGxhY2Uobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wO1xuICAgICAgICAgICAgdG9wLmFwcGx5UGVuZGluZyhub2RlLnR5cGUpO1xuICAgICAgICAgICAgaWYgKHRvcC5tYXRjaClcbiAgICAgICAgICAgICAgICB0b3AubWF0Y2ggPSB0b3AubWF0Y2gubWF0Y2hUeXBlKG5vZGUudHlwZSk7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSB0b3AuYWN0aXZlTWFya3M7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0b3AudHlwZSB8fCB0b3AudHlwZS5hbGxvd3NNYXJrVHlwZShub2RlLm1hcmtzW2ldLnR5cGUpKVxuICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG5vZGUubWFya3NbaV0uYWRkVG9TZXQobWFya3MpO1xuICAgICAgICAgICAgdG9wLmNvbnRlbnQucHVzaChub2RlLm1hcmsobWFya3MpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIHN0YXJ0IGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSwgYWRqdXN0aW5nIHRoZSBjb250ZXh0IHdoZW5cbiAgICAvLyBuZWNlc3NhcnkuXG4gICAgZW50ZXIodHlwZSwgYXR0cnMsIHByZXNlcnZlV1MpIHtcbiAgICAgICAgbGV0IG9rID0gdGhpcy5maW5kUGxhY2UodHlwZS5jcmVhdGUoYXR0cnMpKTtcbiAgICAgICAgaWYgKG9rKVxuICAgICAgICAgICAgdGhpcy5lbnRlcklubmVyKHR5cGUsIGF0dHJzLCB0cnVlLCBwcmVzZXJ2ZVdTKTtcbiAgICAgICAgcmV0dXJuIG9rO1xuICAgIH1cbiAgICAvLyBPcGVuIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICAgIGVudGVySW5uZXIodHlwZSwgYXR0cnMgPSBudWxsLCBzb2xpZCA9IGZhbHNlLCBwcmVzZXJ2ZVdTKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIHRvcC5hcHBseVBlbmRpbmcodHlwZSk7XG4gICAgICAgIHRvcC5tYXRjaCA9IHRvcC5tYXRjaCAmJiB0b3AubWF0Y2gubWF0Y2hUeXBlKHR5cGUpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHdzT3B0aW9uc0Zvcih0eXBlLCBwcmVzZXJ2ZVdTLCB0b3Aub3B0aW9ucyk7XG4gICAgICAgIGlmICgodG9wLm9wdGlvbnMgJiBPUFRfT1BFTl9MRUZUKSAmJiB0b3AuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIG9wdGlvbnMgfD0gT1BUX09QRU5fTEVGVDtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBOb2RlQ29udGV4dCh0eXBlLCBhdHRycywgdG9wLmFjdGl2ZU1hcmtzLCB0b3AucGVuZGluZ01hcmtzLCBzb2xpZCwgbnVsbCwgb3B0aW9ucykpO1xuICAgICAgICB0aGlzLm9wZW4rKztcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGFsbCBub2RlcyBhYm92ZSB0aGlzLm9wZW4gYXJlIGZpbmlzaGVkIGFuZCBhZGRlZCB0b1xuICAgIC8vIHRoZWlyIHBhcmVudHNcbiAgICBjbG9zZUV4dHJhKG9wZW5FbmQgPSBmYWxzZSkge1xuICAgICAgICBsZXQgaSA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGkgPiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIGZvciAoOyBpID4gdGhpcy5vcGVuOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tpIC0gMV0uY29udGVudC5wdXNoKHRoaXMubm9kZXNbaV0uZmluaXNoKG9wZW5FbmQpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMubGVuZ3RoID0gdGhpcy5vcGVuICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IDA7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSh0aGlzLmlzT3Blbik7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdLmZpbmlzaCh0aGlzLmlzT3BlbiB8fCB0aGlzLm9wdGlvbnMudG9wT3Blbik7XG4gICAgfVxuICAgIHN5bmModG8pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbjsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlc1tpXSA9PSB0bykge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IGk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRQb3MoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5ub2Rlc1tpXS5jb250ZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGNvbnRlbnQubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pXG4gICAgICAgICAgICAgICAgcG9zICs9IGNvbnRlbnRbal0ubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICBmaW5kQXRQb2ludChwYXJlbnQsIG9mZnNldCkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLm5vZGUgPT0gcGFyZW50ICYmIHRoaXMuZmluZFtpXS5vZmZzZXQgPT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kSW5zaWRlKHBhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLnBvcyA9PSBudWxsICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxICYmIHBhcmVudC5jb250YWlucyh0aGlzLmZpbmRbaV0ubm9kZSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3M7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRBcm91bmQocGFyZW50LCBjb250ZW50LCBiZWZvcmUpIHtcbiAgICAgICAgaWYgKHBhcmVudCAhPSBjb250ZW50ICYmIHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5wb3MgPT0gbnVsbCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMSAmJiBwYXJlbnQuY29udGFpbnModGhpcy5maW5kW2ldLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMuZmluZFtpXS5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyAmIChiZWZvcmUgPyAyIDogNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZmluZEluVGV4dCh0ZXh0Tm9kZSkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLm5vZGUgPT0gdGV4dE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3MgLSAodGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCAtIHRoaXMuZmluZFtpXS5vZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRleHQgc3RyaW5nIG1hdGNoZXMgdGhpcyBjb250ZXh0LlxuICAgIG1hdGNoZXNDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQuaW5kZXhPZihcInxcIikgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnNwbGl0KC9cXHMqXFx8XFxzKi8pLnNvbWUodGhpcy5tYXRjaGVzQ29udGV4dCwgdGhpcyk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGNvbnRleHQuc3BsaXQoXCIvXCIpO1xuICAgICAgICBsZXQgb3B0aW9uID0gdGhpcy5vcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGxldCB1c2VSb290ID0gIXRoaXMuaXNPcGVuICYmICghb3B0aW9uIHx8IG9wdGlvbi5wYXJlbnQudHlwZSA9PSB0aGlzLm5vZGVzWzBdLnR5cGUpO1xuICAgICAgICBsZXQgbWluRGVwdGggPSAtKG9wdGlvbiA/IG9wdGlvbi5kZXB0aCArIDEgOiAwKSArICh1c2VSb290ID8gMCA6IDEpO1xuICAgICAgICBsZXQgbWF0Y2ggPSAoaSwgZGVwdGgpID0+IHtcbiAgICAgICAgICAgIGZvciAoOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBwYXJ0cy5sZW5ndGggLSAxIHx8IGkgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZGVwdGggPj0gbWluRGVwdGg7IGRlcHRoLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2goaSAtIDEsIGRlcHRoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBkZXB0aCA+IDAgfHwgKGRlcHRoID09IDAgJiYgdXNlUm9vdCkgPyB0aGlzLm5vZGVzW2RlcHRoXS50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbiAmJiBkZXB0aCA+PSBtaW5EZXB0aCA/IG9wdGlvbi5ub2RlKGRlcHRoIC0gbWluRGVwdGgpLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCAobmV4dC5uYW1lICE9IHBhcnQgJiYgbmV4dC5ncm91cHMuaW5kZXhPZihwYXJ0KSA9PSAtMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtYXRjaChwYXJ0cy5sZW5ndGggLSAxLCB0aGlzLm9wZW4pO1xuICAgIH1cbiAgICB0ZXh0YmxvY2tGcm9tQ29udGV4dCgpIHtcbiAgICAgICAgbGV0ICRjb250ZXh0ID0gdGhpcy5vcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmICgkY29udGV4dClcbiAgICAgICAgICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVmbHQgPSAkY29udGV4dC5ub2RlKGQpLmNvbnRlbnRNYXRjaEF0KCRjb250ZXh0LmluZGV4QWZ0ZXIoZCkpLmRlZmF1bHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmIChkZWZsdCAmJiBkZWZsdC5pc1RleHRibG9jayAmJiBkZWZsdC5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLnBhcnNlci5zY2hlbWEubm9kZXMpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGUuaXNUZXh0YmxvY2sgJiYgdHlwZS5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkUGVuZGluZ01hcmsobWFyaykge1xuICAgICAgICBsZXQgZm91bmQgPSBmaW5kU2FtZU1hcmtJblNldChtYXJrLCB0aGlzLnRvcC5wZW5kaW5nTWFya3MpO1xuICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICB0aGlzLnRvcC5zdGFzaE1hcmtzLnB1c2goZm91bmQpO1xuICAgICAgICB0aGlzLnRvcC5wZW5kaW5nTWFya3MgPSBtYXJrLmFkZFRvU2V0KHRoaXMudG9wLnBlbmRpbmdNYXJrcyk7XG4gICAgfVxuICAgIHJlbW92ZVBlbmRpbmdNYXJrKG1hcmssIHVwdG8pIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSB0aGlzLm9wZW47IGRlcHRoID49IDA7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBsZXZlbCA9IHRoaXMubm9kZXNbZGVwdGhdO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gbGV2ZWwucGVuZGluZ01hcmtzLmxhc3RJbmRleE9mKG1hcmspO1xuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXZlbC5wZW5kaW5nTWFya3MgPSBtYXJrLnJlbW92ZUZyb21TZXQobGV2ZWwucGVuZGluZ01hcmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldmVsLmFjdGl2ZU1hcmtzID0gbWFyay5yZW1vdmVGcm9tU2V0KGxldmVsLmFjdGl2ZU1hcmtzKTtcbiAgICAgICAgICAgICAgICBsZXQgc3Rhc2hNYXJrID0gbGV2ZWwucG9wRnJvbVN0YXNoTWFyayhtYXJrKTtcbiAgICAgICAgICAgICAgICBpZiAoc3Rhc2hNYXJrICYmIGxldmVsLnR5cGUgJiYgbGV2ZWwudHlwZS5hbGxvd3NNYXJrVHlwZShzdGFzaE1hcmsudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIGxldmVsLmFjdGl2ZU1hcmtzID0gc3Rhc2hNYXJrLmFkZFRvU2V0KGxldmVsLmFjdGl2ZU1hcmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZXZlbCA9PSB1cHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIGRpcmVjdGx5IG5lc3RlZCBsaXN0IG5vZGVzIHByb2R1Y2VkIGJ5IHNvbWVcbi8vIHRvb2xzIGFuZCBhbGxvd2VkIGJ5IGJyb3dzZXJzIHRvIG1lYW4gdGhhdCB0aGUgbmVzdGVkIGxpc3QgaXNcbi8vIGFjdHVhbGx5IHBhcnQgb2YgdGhlIGxpc3QgaXRlbSBhYm92ZSBpdC5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpc3QoZG9tKSB7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZCwgcHJldkl0ZW0gPSBudWxsOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgbmFtZSA9IGNoaWxkLm5vZGVUeXBlID09IDEgPyBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgaWYgKG5hbWUgJiYgbGlzdFRhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgcHJldkl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZJdGVtLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIGNoaWxkID0gcHJldkl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHByZXZJdGVtID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSkge1xuICAgICAgICAgICAgcHJldkl0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gQXBwbHkgYSBDU1Mgc2VsZWN0b3IuXG5mdW5jdGlvbiBtYXRjaGVzKGRvbSwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gKGRvbS5tYXRjaGVzIHx8IGRvbS5tc01hdGNoZXNTZWxlY3RvciB8fCBkb20ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGRvbS5tb3pNYXRjaGVzU2VsZWN0b3IpLmNhbGwoZG9tLCBzZWxlY3Rvcik7XG59XG4vLyBUb2tlbml6ZSBhIHN0eWxlIGF0dHJpYnV0ZSBpbnRvIHByb3BlcnR5L3ZhbHVlIHBhaXJzLlxuZnVuY3Rpb24gcGFyc2VTdHlsZXMoc3R5bGUpIHtcbiAgICBsZXQgcmUgPSAvXFxzKihbXFx3LV0rKVxccyo6XFxzKihbXjtdKykvZywgbSwgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKG0gPSByZS5leGVjKHN0eWxlKSlcbiAgICAgICAgcmVzdWx0LnB1c2gobVsxXSwgbVsyXS50cmltKCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb3B5KG9iaikge1xuICAgIGxldCBjb3B5ID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgcmV0dXJuIGNvcHk7XG59XG4vLyBVc2VkIHdoZW4gZmluZGluZyBhIG1hcmsgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZyYWdtZW50IHBhcnNlLlxuLy8gQ2hlY2tzIHdoZXRoZXIgaXQgd291bGQgYmUgcmVhc29uYWJsZSB0byBhcHBseSBhIGdpdmVuIG1hcmsgdHlwZSB0b1xuLy8gYSBnaXZlbiBub2RlLCBieSBsb29raW5nIGF0IHRoZSB3YXkgdGhlIG1hcmsgb2NjdXJzIGluIHRoZSBzY2hlbWEuXG5mdW5jdGlvbiBtYXJrTWF5QXBwbHkobWFya1R5cGUsIG5vZGVUeXBlKSB7XG4gICAgbGV0IG5vZGVzID0gbm9kZVR5cGUuc2NoZW1hLm5vZGVzO1xuICAgIGZvciAobGV0IG5hbWUgaW4gbm9kZXMpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGVzW25hbWVdO1xuICAgICAgICBpZiAoIXBhcmVudC5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IHNlZW4gPSBbXSwgc2NhbiA9IChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKG1hdGNoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2guZWRnZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5lZGdlKGkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG5vZGVUeXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5leHQpIDwgMCAmJiBzY2FuKG5leHQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNjYW4ocGFyZW50LmNvbnRlbnRNYXRjaCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kU2FtZU1hcmtJblNldChtYXJrLCBzZXQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWFyay5lcShzZXRbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIHNldFtpXTtcbiAgICB9XG59XG5cbi8qKlxuQSBET00gc2VyaWFsaXplciBrbm93cyBob3cgdG8gY29udmVydCBQcm9zZU1pcnJvciBub2RlcyBhbmRcbm1hcmtzIG9mIHZhcmlvdXMgdHlwZXMgdG8gRE9NIG5vZGVzLlxuKi9cbmNsYXNzIERPTVNlcmlhbGl6ZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlcmlhbGl6ZXIuIGBub2Rlc2Agc2hvdWxkIG1hcCBub2RlIG5hbWVzIHRvIGZ1bmN0aW9uc1xuICAgIHRoYXQgdGFrZSBhIG5vZGUgYW5kIHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgRE9NLiBgbWFya3NgIGRvZXMgdGhlIHNhbWUgZm9yIG1hcmsgbmFtZXMsIGJ1dCBhbHNvIGdldHMgYW5cbiAgICBhcmd1bWVudCB0aGF0IHRlbGxzIGl0IHdoZXRoZXIgdGhlIG1hcmsncyBjb250ZW50IGlzIGJsb2NrIG9yXG4gICAgaW5saW5lIGNvbnRlbnQgKGZvciB0eXBpY2FsIHVzZSwgaXQnbGwgYWx3YXlzIGJlIGlubGluZSkuIEEgbWFya1xuICAgIHNlcmlhbGl6ZXIgbWF5IGJlIGBudWxsYCB0byBpbmRpY2F0ZSB0aGF0IG1hcmtzIG9mIHRoYXQgdHlwZVxuICAgIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbm9kZXMsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbWFya3MpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGlzIGZyYWdtZW50IHRvIGEgRE9NIGZyYWdtZW50LiBXaGVuXG4gICAgbm90IGluIHRoZSBicm93c2VyLCB0aGUgYGRvY3VtZW50YCBvcHRpb24sIGNvbnRhaW5pbmcgYSBET01cbiAgICBkb2N1bWVudCwgc2hvdWxkIGJlIHBhc3NlZCBzbyB0aGF0IHRoZSBzZXJpYWxpemVyIGNhbiBjcmVhdGVcbiAgICBub2Rlcy5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZUZyYWdtZW50KGZyYWdtZW50LCBvcHRpb25zID0ge30sIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IGRvYyhvcHRpb25zKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGxldCB0b3AgPSB0YXJnZXQsIGFjdGl2ZSA9IFtdO1xuICAgICAgICBmcmFnbWVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggfHwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQga2VlcCA9IDAsIHJlbmRlcmVkID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcCA8IGFjdGl2ZS5sZW5ndGggJiYgcmVuZGVyZWQgPCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUubWFya3NbcmVuZGVyZWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya3NbbmV4dC50eXBlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0LmVxKGFjdGl2ZVtrZWVwXVswXSkgfHwgbmV4dC50eXBlLnNwZWMuc3Bhbm5pbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBhY3RpdmUucG9wKClbMV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlbmRlcmVkIDwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZCA9IG5vZGUubWFya3NbcmVuZGVyZWQrK107XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXJrRE9NID0gdGhpcy5zZXJpYWxpemVNYXJrKGFkZCwgbm9kZS5pc0lubGluZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUucHVzaChbYWRkLCB0b3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5hcHBlbmRDaGlsZChtYXJrRE9NLmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBtYXJrRE9NLmNvbnRlbnRET00gfHwgbWFya0RPTS5kb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b3AuYXBwZW5kQ2hpbGQodGhpcy5zZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgeyBkb20sIGNvbnRlbnRET00gfSA9IERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2Mob3B0aW9ucyksIHRoaXMubm9kZXNbbm9kZS50eXBlLm5hbWVdKG5vZGUpKTtcbiAgICAgICAgaWYgKGNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRlbnQgaG9sZSBub3QgYWxsb3dlZCBpbiBhIGxlYWYgbm9kZSBzcGVjXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVGcmFnbWVudChub2RlLmNvbnRlbnQsIG9wdGlvbnMsIGNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIG5vZGUgdG8gYSBET00gbm9kZS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91XG4gICAgbmVlZCB0byBzZXJpYWxpemUgYSBwYXJ0IG9mIGEgZG9jdW1lbnQsIGFzIG9wcG9zZWQgdG8gdGhlIHdob2xlXG4gICAgZG9jdW1lbnQuIFRvIHNlcmlhbGl6ZSBhIHdob2xlIGRvY3VtZW50LCB1c2VcbiAgICBbYHNlcmlhbGl6ZUZyYWdtZW50YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkRPTVNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQpIG9uXG4gICAgaXRzIFtjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5jb250ZW50KS5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZU5vZGUobm9kZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBkb20gPSB0aGlzLnNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwID0gdGhpcy5zZXJpYWxpemVNYXJrKG5vZGUubWFya3NbaV0sIG5vZGUuaXNJbmxpbmUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHdyYXApIHtcbiAgICAgICAgICAgICAgICAod3JhcC5jb250ZW50RE9NIHx8IHdyYXAuZG9tKS5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IHdyYXAuZG9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2VyaWFsaXplTWFyayhtYXJrLCBpbmxpbmUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgdG9ET00gPSB0aGlzLm1hcmtzW21hcmsudHlwZS5uYW1lXTtcbiAgICAgICAgcmV0dXJuIHRvRE9NICYmIERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2Mob3B0aW9ucyksIHRvRE9NKG1hcmssIGlubGluZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgYW4gW291dHB1dCBzcGVjXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuRE9NT3V0cHV0U3BlYykgdG8gYSBET00gbm9kZS4gSWZcbiAgICB0aGUgc3BlYyBoYXMgYSBob2xlICh6ZXJvKSBpbiBpdCwgYGNvbnRlbnRET01gIHdpbGwgcG9pbnQgYXQgdGhlXG4gICAgbm9kZSB3aXRoIHRoZSBob2xlLlxuICAgICovXG4gICAgc3RhdGljIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TID0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIHN0cnVjdHVyZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgcmV0dXJuIHsgZG9tOiBkb2MuY3JlYXRlVGV4dE5vZGUoc3RydWN0dXJlKSB9O1xuICAgICAgICBpZiAoc3RydWN0dXJlLm5vZGVUeXBlICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4geyBkb206IHN0cnVjdHVyZSB9O1xuICAgICAgICBpZiAoc3RydWN0dXJlLmRvbSAmJiBzdHJ1Y3R1cmUuZG9tLm5vZGVUeXBlICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gc3RydWN0dXJlO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHN0cnVjdHVyZVswXSwgc3BhY2UgPSB0YWdOYW1lLmluZGV4T2YoXCIgXCIpO1xuICAgICAgICBpZiAoc3BhY2UgPiAwKSB7XG4gICAgICAgICAgICB4bWxOUyA9IHRhZ05hbWUuc2xpY2UoMCwgc3BhY2UpO1xuICAgICAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUuc2xpY2Uoc3BhY2UgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudERPTTtcbiAgICAgICAgbGV0IGRvbSA9ICh4bWxOUyA/IGRvYy5jcmVhdGVFbGVtZW50TlMoeG1sTlMsIHRhZ05hbWUpIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpO1xuICAgICAgICBsZXQgYXR0cnMgPSBzdHJ1Y3R1cmVbMV0sIHN0YXJ0ID0gMTtcbiAgICAgICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PSBcIm9iamVjdFwiICYmIGF0dHJzLm5vZGVUeXBlID09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoYXR0cnMpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDI7XG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgICAgIGlmIChhdHRyc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZSA9IG5hbWUuaW5kZXhPZihcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFjZSA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlTlMobmFtZS5zbGljZSgwLCBzcGFjZSksIG5hbWUuc2xpY2Uoc3BhY2UgKyAxKSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIGF0dHJzW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBzdHJ1Y3R1cmVbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHN0cnVjdHVyZS5sZW5ndGggLSAxIHx8IGkgPiBzdGFydClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDb250ZW50IGhvbGUgbXVzdCBiZSB0aGUgb25seSBjaGlsZCBvZiBpdHMgcGFyZW50IG5vZGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9tLCBjb250ZW50RE9NOiBkb20gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB7IGRvbTogaW5uZXIsIGNvbnRlbnRET006IGlubmVyQ29udGVudCB9ID0gRE9NU2VyaWFsaXplci5yZW5kZXJTcGVjKGRvYywgY2hpbGQsIHhtbE5TKTtcbiAgICAgICAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoaW5uZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11bHRpcGxlIGNvbnRlbnQgaG9sZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBpbm5lckNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbSwgY29udGVudERPTSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIHNlcmlhbGl6ZXIgdXNpbmcgdGhlIFtgdG9ET01gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMudG9ET00pXG4gICAgcHJvcGVydGllcyBpbiBhIHNjaGVtYSdzIG5vZGUgYW5kIG1hcmsgc3BlY3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciB8fFxuICAgICAgICAgICAgKHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKHRoaXMubm9kZXNGcm9tU2NoZW1hKHNjaGVtYSksIHRoaXMubWFya3NGcm9tU2NoZW1hKHNjaGVtYSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2F0aGVyIHRoZSBzZXJpYWxpemVycyBpbiBhIHNjaGVtYSdzIG5vZGUgc3BlY3MgaW50byBhbiBvYmplY3QuXG4gICAgVGhpcyBjYW4gYmUgdXNlZnVsIGFzIGEgYmFzZSB0byBidWlsZCBhIGN1c3RvbSBzZXJpYWxpemVyIGZyb20uXG4gICAgKi9cbiAgICBzdGF0aWMgbm9kZXNGcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZ2F0aGVyVG9ET00oc2NoZW1hLm5vZGVzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQudGV4dClcbiAgICAgICAgICAgIHJlc3VsdC50ZXh0ID0gbm9kZSA9PiBub2RlLnRleHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdhdGhlciB0aGUgc2VyaWFsaXplcnMgaW4gYSBzY2hlbWEncyBtYXJrIHNwZWNzIGludG8gYW4gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIG1hcmtzRnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIGdhdGhlclRvRE9NKHNjaGVtYS5tYXJrcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2F0aGVyVG9ET00ob2JqKSB7XG4gICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IG5hbWUgaW4gb2JqKSB7XG4gICAgICAgIGxldCB0b0RPTSA9IG9ialtuYW1lXS5zcGVjLnRvRE9NO1xuICAgICAgICBpZiAodG9ET00pXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB0b0RPTTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvYyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50O1xufVxuXG5leHBvcnQgeyBDb250ZW50TWF0Y2gsIERPTVBhcnNlciwgRE9NU2VyaWFsaXplciwgRnJhZ21lbnQsIE1hcmssIE1hcmtUeXBlLCBOb2RlLCBOb2RlUmFuZ2UsIE5vZGVUeXBlLCBSZXBsYWNlRXJyb3IsIFJlc29sdmVkUG9zLCBTY2hlbWEsIFNsaWNlIH07XG4iLCAiaW1wb3J0IHsgUmVwbGFjZUVycm9yLCBTbGljZSwgRnJhZ21lbnQsIE1hcmtUeXBlLCBNYXJrIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuXG4vLyBSZWNvdmVyeSB2YWx1ZXMgZW5jb2RlIGEgcmFuZ2UgaW5kZXggYW5kIGFuIG9mZnNldC4gVGhleSBhcmVcbi8vIHJlcHJlc2VudGVkIGFzIG51bWJlcnMsIGJlY2F1c2UgdG9ucyBvZiB0aGVtIHdpbGwgYmUgY3JlYXRlZCB3aGVuXG4vLyBtYXBwaW5nLCBmb3IgZXhhbXBsZSwgYSBsYXJnZSBudW1iZXIgb2YgZGVjb3JhdGlvbnMuIFRoZSBudW1iZXInc1xuLy8gbG93ZXIgMTYgYml0cyBwcm92aWRlIHRoZSBpbmRleCwgdGhlIHJlbWFpbmluZyBiaXRzIHRoZSBvZmZzZXQuXG4vL1xuLy8gTm90ZTogV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYml0IHNoaWZ0IG9wZXJhdG9ycyB0byBlbi0gYW5kXG4vLyBkZWNvZGUgdGhlc2UsIHNpbmNlIHRob3NlIGNsaXAgdG8gMzIgYml0cywgd2hpY2ggd2UgbWlnaHQgaW4gcmFyZVxuLy8gY2FzZXMgd2FudCB0byBvdmVyZmxvdy4gQSA2NC1iaXQgZmxvYXQgY2FuIHJlcHJlc2VudCA0OC1iaXRcbi8vIGludGVnZXJzIHByZWNpc2VseS5cbmNvbnN0IGxvd2VyMTYgPSAweGZmZmY7XG5jb25zdCBmYWN0b3IxNiA9IE1hdGgucG93KDIsIDE2KTtcbmZ1bmN0aW9uIG1ha2VSZWNvdmVyKGluZGV4LCBvZmZzZXQpIHsgcmV0dXJuIGluZGV4ICsgb2Zmc2V0ICogZmFjdG9yMTY7IH1cbmZ1bmN0aW9uIHJlY292ZXJJbmRleCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgJiBsb3dlcjE2OyB9XG5mdW5jdGlvbiByZWNvdmVyT2Zmc2V0KHZhbHVlKSB7IHJldHVybiAodmFsdWUgLSAodmFsdWUgJiBsb3dlcjE2KSkgLyBmYWN0b3IxNjsgfVxuY29uc3QgREVMX0JFRk9SRSA9IDEsIERFTF9BRlRFUiA9IDIsIERFTF9BQ1JPU1MgPSA0LCBERUxfU0lERSA9IDg7XG4vKipcbkFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtYXBwZWQgcG9zaXRpb24gd2l0aCBleHRyYVxuaW5mb3JtYXRpb24uXG4qL1xuY2xhc3MgTWFwUmVzdWx0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBtYXBwZWQgdmVyc2lvbiBvZiB0aGUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZGVsSW5mbywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyKSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmRlbEluZm8gPSBkZWxJbmZvO1xuICAgICAgICB0aGlzLnJlY292ZXIgPSByZWNvdmVyO1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGUgcG9zaXRpb24gd2FzIGRlbGV0ZWQsIHRoYXQgaXMsIHdoZXRoZXIgdGhlXG4gICAgc3RlcCByZW1vdmVkIHRoZSB0b2tlbiBvbiB0aGUgc2lkZSBxdWVyaWVkICh2aWEgdGhlIGBhc3NvY2ApXG4gICAgYXJndW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZCgpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiBERUxfU0lERSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIHRva2VuIGJlZm9yZSB0aGUgbWFwcGVkIHBvc2l0aW9uIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRCZWZvcmUoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgKERFTF9CRUZPUkUgfCBERUxfQUNST1NTKSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoZSB0b2tlbiBhZnRlciB0aGUgbWFwcGVkIHBvc2l0aW9uIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRBZnRlcigpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiAoREVMX0FGVEVSIHwgREVMX0FDUk9TUykpID4gMDsgfVxuICAgIC8qKlxuICAgIFRlbGxzIHdoZXRoZXIgYW55IG9mIHRoZSBzdGVwcyBtYXBwZWQgdGhyb3VnaCBkZWxldGVzIGFjcm9zcyB0aGVcbiAgICBwb3NpdGlvbiAoaW5jbHVkaW5nIGJvdGggdGhlIHRva2VuIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlXG4gICAgcG9zaXRpb24pLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRBY3Jvc3MoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgREVMX0FDUk9TUykgPiAwOyB9XG59XG4vKipcbkEgbWFwIGRlc2NyaWJpbmcgdGhlIGRlbGV0aW9ucyBhbmQgaW5zZXJ0aW9ucyBtYWRlIGJ5IGEgc3RlcCwgd2hpY2hcbmNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gcG9zaXRpb25zIGluIHRoZVxucHJlLXN0ZXAgdmVyc2lvbiBvZiBhIGRvY3VtZW50IGFuZCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGVcbnBvc3Qtc3RlcCB2ZXJzaW9uLlxuKi9cbmNsYXNzIFN0ZXBNYXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBvc2l0aW9uIG1hcC4gVGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50IGFyZVxuICAgIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG51bWJlcnMsIGluIHdoaWNoIGVhY2ggZ3JvdXAgb2YgdGhyZWVcbiAgICByZXByZXNlbnRzIGEgbW9kaWZpZWQgY2h1bmsgYXMgYFtzdGFydCwgb2xkU2l6ZSwgbmV3U2l6ZV1gLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByYW5nZXMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaW52ZXJ0ZWQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5pbnZlcnRlZCA9IGludmVydGVkO1xuICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGggJiYgU3RlcE1hcC5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlY292ZXIodmFsdWUpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBpbmRleCA9IHJlY292ZXJJbmRleCh2YWx1ZSk7XG4gICAgICAgIGlmICghdGhpcy5pbnZlcnRlZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgICAgICAgICAgICBkaWZmICs9IHRoaXMucmFuZ2VzW2kgKiAzICsgMl0gLSB0aGlzLnJhbmdlc1tpICogMyArIDFdO1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbaW5kZXggKiAzXSArIGRpZmYgKyByZWNvdmVyT2Zmc2V0KHZhbHVlKTtcbiAgICB9XG4gICAgbWFwUmVzdWx0KHBvcywgYXNzb2MgPSAxKSB7IHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgZmFsc2UpOyB9XG4gICAgbWFwKHBvcywgYXNzb2MgPSAxKSB7IHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIF9tYXAocG9zLCBhc3NvYywgc2ltcGxlKSB7XG4gICAgICAgIGxldCBkaWZmID0gMCwgb2xkSW5kZXggPSB0aGlzLmludmVydGVkID8gMiA6IDEsIG5ld0luZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDEgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1tpXSAtICh0aGlzLmludmVydGVkID8gZGlmZiA6IDApO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID4gcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IG9sZFNpemUgPSB0aGlzLnJhbmdlc1tpICsgb2xkSW5kZXhdLCBuZXdTaXplID0gdGhpcy5yYW5nZXNbaSArIG5ld0luZGV4XSwgZW5kID0gc3RhcnQgKyBvbGRTaXplO1xuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2lkZSA9ICFvbGRTaXplID8gYXNzb2MgOiBwb3MgPT0gc3RhcnQgPyAtMSA6IHBvcyA9PSBlbmQgPyAxIDogYXNzb2M7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHN0YXJ0ICsgZGlmZiArIChzaWRlIDwgMCA/IDAgOiBuZXdTaXplKTtcbiAgICAgICAgICAgICAgICBpZiAoc2ltcGxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGxldCByZWNvdmVyID0gcG9zID09IChhc3NvYyA8IDAgPyBzdGFydCA6IGVuZCkgPyBudWxsIDogbWFrZVJlY292ZXIoaSAvIDMsIHBvcyAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBsZXQgZGVsID0gcG9zID09IHN0YXJ0ID8gREVMX0FGVEVSIDogcG9zID09IGVuZCA/IERFTF9CRUZPUkUgOiBERUxfQUNST1NTO1xuICAgICAgICAgICAgICAgIGlmIChhc3NvYyA8IDAgPyBwb3MgIT0gc3RhcnQgOiBwb3MgIT0gZW5kKVxuICAgICAgICAgICAgICAgICAgICBkZWwgfD0gREVMX1NJREU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQocmVzdWx0LCBkZWwsIHJlY292ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlmZiArPSBuZXdTaXplIC0gb2xkU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlID8gcG9zICsgZGlmZiA6IG5ldyBNYXBSZXN1bHQocG9zICsgZGlmZiwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG91Y2hlcyhwb3MsIHJlY292ZXIpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBpbmRleCA9IHJlY292ZXJJbmRleChyZWNvdmVyKTtcbiAgICAgICAgbGV0IG9sZEluZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDIgOiAxLCBuZXdJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAxIDogMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbaV0gLSAodGhpcy5pbnZlcnRlZCA/IGRpZmYgOiAwKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA+IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBvbGRTaXplID0gdGhpcy5yYW5nZXNbaSArIG9sZEluZGV4XSwgZW5kID0gc3RhcnQgKyBvbGRTaXplO1xuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQgJiYgaSA9PSBpbmRleCAqIDMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkaWZmICs9IHRoaXMucmFuZ2VzW2kgKyBuZXdJbmRleF0gLSBvbGRTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIGVhY2ggb2YgdGhlIGNoYW5nZWQgcmFuZ2VzIGluY2x1ZGVkIGluXG4gICAgdGhpcyBtYXAuXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHtcbiAgICAgICAgbGV0IG9sZEluZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDIgOiAxLCBuZXdJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAxIDogMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGRpZmYgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzW2ldLCBvbGRTdGFydCA9IHN0YXJ0IC0gKHRoaXMuaW52ZXJ0ZWQgPyBkaWZmIDogMCksIG5ld1N0YXJ0ID0gc3RhcnQgKyAodGhpcy5pbnZlcnRlZCA/IDAgOiBkaWZmKTtcbiAgICAgICAgICAgIGxldCBvbGRTaXplID0gdGhpcy5yYW5nZXNbaSArIG9sZEluZGV4XSwgbmV3U2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBuZXdJbmRleF07XG4gICAgICAgICAgICBmKG9sZFN0YXJ0LCBvbGRTdGFydCArIG9sZFNpemUsIG5ld1N0YXJ0LCBuZXdTdGFydCArIG5ld1NpemUpO1xuICAgICAgICAgICAgZGlmZiArPSBuZXdTaXplIC0gb2xkU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hcC4gVGhlIHJlc3VsdCBjYW4gYmUgdXNlZCB0b1xuICAgIG1hcCBwb3NpdGlvbnMgaW4gdGhlIHBvc3Qtc3RlcCBkb2N1bWVudCB0byB0aGUgcHJlLXN0ZXAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBpbnZlcnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RlcE1hcCh0aGlzLnJhbmdlcywgIXRoaXMuaW52ZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaW52ZXJ0ZWQgPyBcIi1cIiA6IFwiXCIpICsgSlNPTi5zdHJpbmdpZnkodGhpcy5yYW5nZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXAgdGhhdCBtb3ZlcyBhbGwgcG9zaXRpb25zIGJ5IG9mZnNldCBgbmAgKHdoaWNoIG1heSBiZVxuICAgIG5lZ2F0aXZlKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gYXBwbHlpbmcgc3RlcHMgbWVhbnQgZm9yIGFcbiAgICBzdWItZG9jdW1lbnQgdG8gYSBsYXJnZXIgZG9jdW1lbnQsIG9yIHZpY2UtdmVyc2EuXG4gICAgKi9cbiAgICBzdGF0aWMgb2Zmc2V0KG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPT0gMCA/IFN0ZXBNYXAuZW1wdHkgOiBuZXcgU3RlcE1hcChuIDwgMCA/IFswLCAtbiwgMF0gOiBbMCwgMCwgbl0pO1xuICAgIH1cbn1cbi8qKlxuQSBTdGVwTWFwIHRoYXQgY29udGFpbnMgbm8gY2hhbmdlZCByYW5nZXMuXG4qL1xuU3RlcE1hcC5lbXB0eSA9IG5ldyBTdGVwTWFwKFtdKTtcbi8qKlxuQSBtYXBwaW5nIHJlcHJlc2VudHMgYSBwaXBlbGluZSBvZiB6ZXJvIG9yIG1vcmUgW3N0ZXBcbm1hcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcE1hcCkuIEl0IGhhcyBzcGVjaWFsIHByb3Zpc2lvbnMgZm9yIGxvc3NsZXNzbHlcbmhhbmRsaW5nIG1hcHBpbmcgcG9zaXRpb25zIHRocm91Z2ggYSBzZXJpZXMgb2Ygc3RlcHMgaW4gd2hpY2ggc29tZVxuc3RlcHMgYXJlIGludmVydGVkIHZlcnNpb25zIG9mIGVhcmxpZXIgc3RlcHMuIChUaGlzIGNvbWVzIHVwIHdoZW5cblx1MjAxOFtyZWJhc2luZ10oL2RvY3MvZ3VpZGUvI3RyYW5zZm9ybS5yZWJhc2luZylcdTIwMTkgc3RlcHMgZm9yXG5jb2xsYWJvcmF0aW9uIG9yIGhpc3RvcnkgbWFuYWdlbWVudC4pXG4qL1xuY2xhc3MgTWFwcGluZyB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gcG9zaXRpb24gbWFwcy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGVwIG1hcHMgaW4gdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgbWFwcyA9IFtdLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1pcnJvciwgXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXksIHVzZWQgd2hlbiBgbWFwYCBvclxuICAgIGBtYXBSZXN1bHRgIGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIGZyb20gPSAwLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXkuXG4gICAgKi9cbiAgICB0byA9IG1hcHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubWFwcyA9IG1hcHM7XG4gICAgICAgIHRoaXMubWlycm9yID0gbWlycm9yO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcHBpbmcgdGhhdCBtYXBzIG9ubHkgdGhyb3VnaCBhIHBhcnQgb2YgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBzbGljZShmcm9tID0gMCwgdG8gPSB0aGlzLm1hcHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwcGluZyh0aGlzLm1hcHMsIHRoaXMubWlycm9yLCBmcm9tLCB0byk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29weSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwaW5nKHRoaXMubWFwcy5zbGljZSgpLCB0aGlzLm1pcnJvciAmJiB0aGlzLm1pcnJvci5zbGljZSgpLCB0aGlzLmZyb20sIHRoaXMudG8pO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBzdGVwIG1hcCB0byB0aGUgZW5kIG9mIHRoaXMgbWFwcGluZy4gSWYgYG1pcnJvcnNgIGlzXG4gICAgZ2l2ZW4sIGl0IHNob3VsZCBiZSB0aGUgaW5kZXggb2YgdGhlIHN0ZXAgbWFwIHRoYXQgaXMgdGhlIG1pcnJvclxuICAgIGltYWdlIG9mIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kTWFwKG1hcCwgbWlycm9ycykge1xuICAgICAgICB0aGlzLnRvID0gdGhpcy5tYXBzLnB1c2gobWFwKTtcbiAgICAgICAgaWYgKG1pcnJvcnMgIT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuc2V0TWlycm9yKHRoaXMubWFwcy5sZW5ndGggLSAxLCBtaXJyb3JzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGFsbCB0aGUgc3RlcCBtYXBzIGluIGEgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZSAocHJlc2VydmluZ1xuICAgIG1pcnJvcmluZyBpbmZvcm1hdGlvbikuXG4gICAgKi9cbiAgICBhcHBlbmRNYXBwaW5nKG1hcHBpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0U2l6ZSA9IHRoaXMubWFwcy5sZW5ndGg7IGkgPCBtYXBwaW5nLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtaXJyID0gbWFwcGluZy5nZXRNaXJyb3IoaSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZE1hcChtYXBwaW5nLm1hcHNbaV0sIG1pcnIgIT0gbnVsbCAmJiBtaXJyIDwgaSA/IHN0YXJ0U2l6ZSArIG1pcnIgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmRzIHRoZSBvZmZzZXQgb2YgdGhlIHN0ZXAgbWFwIHRoYXQgbWlycm9ycyB0aGUgbWFwIGF0IHRoZVxuICAgIGdpdmVuIG9mZnNldCwgaW4gdGhpcyBtYXBwaW5nIChhcyBwZXIgdGhlIHNlY29uZCBhcmd1bWVudCB0b1xuICAgIGBhcHBlbmRNYXBgKS5cbiAgICAqL1xuICAgIGdldE1pcnJvcihuKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5taXJyb3IubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yW2ldID09IG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pcnJvcltpICsgKGkgJSAyID8gLTEgOiAxKV07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2V0TWlycm9yKG4sIG0pIHtcbiAgICAgICAgaWYgKCF0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHRoaXMubWlycm9yID0gW107XG4gICAgICAgIHRoaXMubWlycm9yLnB1c2gobiwgbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCB0aGUgaW52ZXJzZSBvZiB0aGUgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFwcGVuZE1hcHBpbmdJbnZlcnRlZChtYXBwaW5nKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXBwaW5nLm1hcHMubGVuZ3RoIC0gMSwgdG90YWxTaXplID0gdGhpcy5tYXBzLmxlbmd0aCArIG1hcHBpbmcubWFwcy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgbWlyciA9IG1hcHBpbmcuZ2V0TWlycm9yKGkpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRNYXAobWFwcGluZy5tYXBzW2ldLmludmVydCgpLCBtaXJyICE9IG51bGwgJiYgbWlyciA+IGkgPyB0b3RhbFNpemUgLSBtaXJyIC0gMSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGludmVydGVkIHZlcnNpb24gb2YgdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgaW52ZXJ0KCkge1xuICAgICAgICBsZXQgaW52ZXJzZSA9IG5ldyBNYXBwaW5nO1xuICAgICAgICBpbnZlcnNlLmFwcGVuZE1hcHBpbmdJbnZlcnRlZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGludmVyc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgbWFwKHBvcywgYXNzb2MgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgdHJ1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZyb207IGkgPCB0aGlzLnRvOyBpKyspXG4gICAgICAgICAgICBwb3MgPSB0aGlzLm1hcHNbaV0ubWFwKHBvcywgYXNzb2MpO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgbWFwcGluZywgcmV0dXJuaW5nIGEgbWFwcGluZ1xuICAgIHJlc3VsdC5cbiAgICAqL1xuICAgIG1hcFJlc3VsdChwb3MsIGFzc29jID0gMSkgeyByZXR1cm4gdGhpcy5fbWFwKHBvcywgYXNzb2MsIGZhbHNlKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgX21hcChwb3MsIGFzc29jLCBzaW1wbGUpIHtcbiAgICAgICAgbGV0IGRlbEluZm8gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcm9tOyBpIDwgdGhpcy50bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwID0gdGhpcy5tYXBzW2ldLCByZXN1bHQgPSBtYXAubWFwUmVzdWx0KHBvcywgYXNzb2MpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWNvdmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29yciA9IHRoaXMuZ2V0TWlycm9yKGkpO1xuICAgICAgICAgICAgICAgIGlmIChjb3JyICE9IG51bGwgJiYgY29yciA+IGkgJiYgY29yciA8IHRoaXMudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNvcnI7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMubWFwc1tjb3JyXS5yZWNvdmVyKHJlc3VsdC5yZWNvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsSW5mbyB8PSByZXN1bHQuZGVsSW5mbztcbiAgICAgICAgICAgIHBvcyA9IHJlc3VsdC5wb3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZSA/IHBvcyA6IG5ldyBNYXBSZXN1bHQocG9zLCBkZWxJbmZvLCBudWxsKTtcbiAgICB9XG59XG5cbmNvbnN0IHN0ZXBzQnlJRCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcbkEgc3RlcCBvYmplY3QgcmVwcmVzZW50cyBhbiBhdG9taWMgY2hhbmdlLiBJdCBnZW5lcmFsbHkgYXBwbGllc1xub25seSB0byB0aGUgZG9jdW1lbnQgaXQgd2FzIGNyZWF0ZWQgZm9yLCBzaW5jZSB0aGUgcG9zaXRpb25zXG5zdG9yZWQgaW4gaXQgd2lsbCBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHRoYXQgZG9jdW1lbnQuXG5cbk5ldyBzdGVwcyBhcmUgZGVmaW5lZCBieSBjcmVhdGluZyBjbGFzc2VzIHRoYXQgZXh0ZW5kIGBTdGVwYCxcbm92ZXJyaWRpbmcgdGhlIGBhcHBseWAsIGBpbnZlcnRgLCBgbWFwYCwgYGdldE1hcGAgYW5kIGBmcm9tSlNPTmBcbm1ldGhvZHMsIGFuZCByZWdpc3RlcmluZyB5b3VyIGNsYXNzIHdpdGggYSB1bmlxdWVcbkpTT04tc2VyaWFsaXphdGlvbiBpZGVudGlmaWVyIHVzaW5nXG5bYFN0ZXAuanNvbklEYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwXmpzb25JRCkuXG4qL1xuY2xhc3MgU3RlcCB7XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzdGVwIG1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgbWFkZSBieSB0aGlzIHN0ZXAsXG4gICAgYW5kIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHBvc2l0aW9ucyBpbiB0aGUgb2xkXG4gICAgYW5kIHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXRNYXAoKSB7IHJldHVybiBTdGVwTWFwLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1lcmdlIHRoaXMgc3RlcCB3aXRoIGFub3RoZXIgb25lLCB0byBiZSBhcHBsaWVkIGRpcmVjdGx5XG4gICAgYWZ0ZXIgaXQuIFJldHVybnMgdGhlIG1lcmdlZCBzdGVwIHdoZW4gcG9zc2libGUsIG51bGwgaWYgdGhlXG4gICAgc3RlcHMgY2FuJ3QgYmUgbWVyZ2VkLlxuICAgICovXG4gICAgbWVyZ2Uob3RoZXIpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0ZXAgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gV2lsbCBjYWxsXG4gICAgdGhyb3VnaCB0byB0aGUgc3RlcCBjbGFzcycgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24uc3RlcFR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIGxldCB0eXBlID0gc3RlcHNCeUlEW2pzb24uc3RlcFR5cGVdO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc3RlcCB0eXBlICR7anNvbi5zdGVwVHlwZX0gZGVmaW5lZGApO1xuICAgICAgICByZXR1cm4gdHlwZS5mcm9tSlNPTihzY2hlbWEsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIHNlcmlhbGl6ZSBzdGVwcyB0byBKU09OLCBlYWNoIHN0ZXAgbmVlZHMgYSBzdHJpbmdcbiAgICBJRCB0byBhdHRhY2ggdG8gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFVzZSB0aGlzIG1ldGhvZCB0b1xuICAgIHJlZ2lzdGVyIGFuIElEIGZvciB5b3VyIHN0ZXAgY2xhc3Nlcy4gVHJ5IHRvIHBpY2sgc29tZXRoaW5nXG4gICAgdGhhdCdzIHVubGlrZWx5IHRvIGNsYXNoIHdpdGggc3RlcHMgZnJvbSBvdGhlciBtb2R1bGVzLlxuICAgICovXG4gICAgc3RhdGljIGpzb25JRChpZCwgc3RlcENsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBzdGVwc0J5SUQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkR1cGxpY2F0ZSB1c2Ugb2Ygc3RlcCBKU09OIElEIFwiICsgaWQpO1xuICAgICAgICBzdGVwc0J5SURbaWRdID0gc3RlcENsYXNzO1xuICAgICAgICBzdGVwQ2xhc3MucHJvdG90eXBlLmpzb25JRCA9IGlkO1xuICAgICAgICByZXR1cm4gc3RlcENsYXNzO1xuICAgIH1cbn1cbi8qKlxuVGhlIHJlc3VsdCBvZiBbYXBwbHlpbmddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcC5hcHBseSkgYSBzdGVwLiBDb250YWlucyBlaXRoZXIgYVxubmV3IGRvY3VtZW50IG9yIGEgZmFpbHVyZSB2YWx1ZS5cbiovXG5jbGFzcyBTdGVwUmVzdWx0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCwgaWYgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGZhaWx1cmUgbWVzc2FnZSwgaWYgdW5zdWNjZXNzZnVsLlxuICAgICovXG4gICAgZmFpbGVkKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmZhaWxlZCA9IGZhaWxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc3VjY2Vzc2Z1bCBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIHN0YXRpYyBvayhkb2MpIHsgcmV0dXJuIG5ldyBTdGVwUmVzdWx0KGRvYywgbnVsbCk7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmYWlsZWQgc3RlcCByZXN1bHQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmFpbChtZXNzYWdlKSB7IHJldHVybiBuZXcgU3RlcFJlc3VsdChudWxsLCBtZXNzYWdlKTsgfVxuICAgIC8qKlxuICAgIENhbGwgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aXRoIHRoZSBnaXZlblxuICAgIGFyZ3VtZW50cy4gQ3JlYXRlIGEgc3VjY2Vzc2Z1bCByZXN1bHQgaWYgaXQgc3VjY2VlZHMsIGFuZCBhXG4gICAgZmFpbGVkIG9uZSBpZiBpdCB0aHJvd3MgYSBgUmVwbGFjZUVycm9yYC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tUmVwbGFjZShkb2MsIGZyb20sIHRvLCBzbGljZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQub2soZG9jLnJlcGxhY2UoZnJvbSwgdG8sIHNsaWNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVwbGFjZUVycm9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcEZyYWdtZW50KGZyYWdtZW50LCBmLCBwYXJlbnQpIHtcbiAgICBsZXQgbWFwcGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFnbWVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gZnJhZ21lbnQuY2hpbGQoaSk7XG4gICAgICAgIGlmIChjaGlsZC5jb250ZW50LnNpemUpXG4gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmNvcHkobWFwRnJhZ21lbnQoY2hpbGQuY29udGVudCwgZiwgY2hpbGQpKTtcbiAgICAgICAgaWYgKGNoaWxkLmlzSW5saW5lKVxuICAgICAgICAgICAgY2hpbGQgPSBmKGNoaWxkLCBwYXJlbnQsIGkpO1xuICAgICAgICBtYXBwZWQucHVzaChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkobWFwcGVkKTtcbn1cbi8qKlxuQWRkIGEgbWFyayB0byBhbGwgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiB0d28gcG9zaXRpb25zLlxuKi9cbmNsYXNzIEFkZE1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gYWRkLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKSwgJGZyb20gPSBkb2MucmVzb2x2ZSh0aGlzLmZyb20pO1xuICAgICAgICBsZXQgcGFyZW50ID0gJGZyb20ubm9kZSgkZnJvbS5zaGFyZWREZXB0aCh0aGlzLnRvKSk7XG4gICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShtYXBGcmFnbWVudChvbGRTbGljZS5jb250ZW50LCAobm9kZSwgcGFyZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vZGUuaXNBdG9tIHx8ICFwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZSh0aGlzLm1hcmsudHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHRoaXMubWFyay5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIHBhcmVudCksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBBZGRNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGRNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJhZGRNYXJrXCIsIEFkZE1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGFsbCBpbmxpbmUgY29udGVudCBiZXR3ZWVuIHR3byBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmVtb3ZlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHVubWFya2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgdW5tYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gcmVtb3ZlLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKG1hcEZyYWdtZW50KG9sZFNsaWNlLmNvbnRlbnQsIG5vZGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFyayh0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIGRvYyksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBSZW1vdmVNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcInJlbW92ZU1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZW1vdmVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVNYXJrXCIsIFJlbW92ZU1hcmtTdGVwKTtcbi8qKlxuQWRkIGEgbWFyayB0byBhIHNwZWNpZmljIG5vZGUuXG4qL1xuY2xhc3MgQWRkTm9kZU1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBtYXJrIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byBhZGQuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMucG9zLCB0aGlzLnBvcyArIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHVwZGF0ZWQpLCAwLCBub2RlLmlzTGVhZiA/IDAgOiAxKSk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGxldCBuZXdTZXQgPSB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcyk7XG4gICAgICAgICAgICBpZiAobmV3U2V0Lmxlbmd0aCA9PSBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5tYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLm1hcmtzW2ldLmlzSW5TZXQobmV3U2V0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCBub2RlLm1hcmtzW2ldKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFkZE5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMucG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIHBvcy5kZWxldGVkQWZ0ZXIgPyBudWxsIDogbmV3IEFkZE5vZGVNYXJrU3RlcChwb3MucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE5vZGVNYXJrXCIsIHBvczogdGhpcy5wb3MsIG1hcms6IHRoaXMubWFyay50b0pTT04oKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLnBvcyAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGROb2RlTWFya1N0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKGpzb24ucG9zLCBzY2hlbWEubWFya0Zyb21KU09OKGpzb24ubWFyaykpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYWRkTm9kZU1hcmtcIiwgQWRkTm9kZU1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBSZW1vdmVOb2RlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byByZW1vdmUuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5wb3MsIHRoaXMucG9zICsgMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odXBkYXRlZCksIDAsIG5vZGUuaXNMZWFmID8gMCA6IDEpKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMubWFyay5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgcG9zID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5wb3MsIDEpO1xuICAgICAgICByZXR1cm4gcG9zLmRlbGV0ZWRBZnRlciA/IG51bGwgOiBuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcy5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwicmVtb3ZlTm9kZU1hcmtcIiwgcG9zOiB0aGlzLnBvcywgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24ucG9zICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlbW92ZU5vZGVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAoanNvbi5wb3MsIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVOb2RlTWFya1wiLCBSZW1vdmVOb2RlTWFya1N0ZXApO1xuXG4vKipcblJlcGxhY2UgYSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgc2xpY2Ugb2YgbmV3IGNvbnRlbnQuXG4qL1xuY2xhc3MgUmVwbGFjZVN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBUaGUgZ2l2ZW4gYHNsaWNlYCBzaG91bGQgZml0IHRoZSAnZ2FwJyBiZXR3ZWVuIGBmcm9tYCBhbmRcbiAgICBgdG9gXHUyMDE0dGhlIGRlcHRocyBtdXN0IGxpbmUgdXAsIGFuZCB0aGUgc3Vycm91bmRpbmcgbm9kZXMgbXVzdCBiZVxuICAgIGFibGUgdG8gYmUgam9pbmVkIHdpdGggdGhlIG9wZW4gc2lkZXMgb2YgdGhlIHNsaWNlLiBXaGVuXG4gICAgYHN0cnVjdHVyZWAgaXMgdHJ1ZSwgdGhlIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZSBjb250ZW50IGJldHdlZW5cbiAgICBmcm9tIGFuZCB0byBpcyBub3QganVzdCBhIHNlcXVlbmNlIG9mIGNsb3NpbmcgYW5kIHRoZW4gb3BlbmluZ1xuICAgIHRva2VucyAodGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHJlYmFzZWQgcmVwbGFjZSBzdGVwc1xuICAgIG92ZXJ3cml0aW5nIHNvbWV0aGluZyB0aGV5IHdlcmVuJ3Qgc3VwcG9zZWQgdG8pLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSB0byBpbnNlcnQuXG4gICAgKi9cbiAgICBzbGljZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdHJ1Y3R1cmUgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUgJiYgY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmZyb20sIHRoaXMudG8pKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIlN0cnVjdHVyZSByZXBsYWNlIHdvdWxkIG92ZXJ3cml0ZSBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy5zbGljZSk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKFt0aGlzLmZyb20sIHRoaXMudG8gLSB0aGlzLmZyb20sIHRoaXMuc2xpY2Uuc2l6ZV0pO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAodGhpcy5mcm9tLCB0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUsIGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMudG8sIC0xKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZEFjcm9zcyAmJiB0by5kZWxldGVkQWNyb3NzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoZnJvbS5wb3MsIE1hdGgubWF4KGZyb20ucG9zLCB0by5wb3MpLCB0aGlzLnNsaWNlKTtcbiAgICB9XG4gICAgbWVyZ2Uob3RoZXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCkgfHwgb3RoZXIuc3RydWN0dXJlIHx8IHRoaXMuc3RydWN0dXJlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUgPT0gb3RoZXIuZnJvbSAmJiAhdGhpcy5zbGljZS5vcGVuRW5kICYmICFvdGhlci5zbGljZS5vcGVuU3RhcnQpIHtcbiAgICAgICAgICAgIGxldCBzbGljZSA9IHRoaXMuc2xpY2Uuc2l6ZSArIG90aGVyLnNsaWNlLnNpemUgPT0gMCA/IFNsaWNlLmVtcHR5XG4gICAgICAgICAgICAgICAgOiBuZXcgU2xpY2UodGhpcy5zbGljZS5jb250ZW50LmFwcGVuZChvdGhlci5zbGljZS5jb250ZW50KSwgdGhpcy5zbGljZS5vcGVuU3RhcnQsIG90aGVyLnNsaWNlLm9wZW5FbmQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcCh0aGlzLmZyb20sIHRoaXMudG8gKyAob3RoZXIudG8gLSBvdGhlci5mcm9tKSwgc2xpY2UsIHRoaXMuc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvdGhlci50byA9PSB0aGlzLmZyb20gJiYgIXRoaXMuc2xpY2Uub3BlblN0YXJ0ICYmICFvdGhlci5zbGljZS5vcGVuRW5kKSB7XG4gICAgICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLnNsaWNlLnNpemUgKyBvdGhlci5zbGljZS5zaXplID09IDAgPyBTbGljZS5lbXB0eVxuICAgICAgICAgICAgICAgIDogbmV3IFNsaWNlKG90aGVyLnNsaWNlLmNvbnRlbnQuYXBwZW5kKHRoaXMuc2xpY2UuY29udGVudCksIG90aGVyLnNsaWNlLm9wZW5TdGFydCwgdGhpcy5zbGljZS5vcGVuRW5kKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAob3RoZXIuZnJvbSwgdGhpcy50bywgc2xpY2UsIHRoaXMuc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGpzb24gPSB7IHN0ZXBUeXBlOiBcInJlcGxhY2VcIiwgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgICAgICBpZiAodGhpcy5zbGljZS5zaXplKVxuICAgICAgICAgICAganNvbi5zbGljZSA9IHRoaXMuc2xpY2UudG9KU09OKCk7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSlcbiAgICAgICAgICAgIGpzb24uc3RydWN0dXJlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLnRvICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlcGxhY2VTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKGpzb24uZnJvbSwganNvbi50bywgU2xpY2UuZnJvbUpTT04oc2NoZW1hLCBqc29uLnNsaWNlKSwgISFqc29uLnN0cnVjdHVyZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZXBsYWNlXCIsIFJlcGxhY2VTdGVwKTtcbi8qKlxuUmVwbGFjZSBhIHBhcnQgb2YgdGhlIGRvY3VtZW50IHdpdGggYSBzbGljZSBvZiBjb250ZW50LCBidXRcbnByZXNlcnZlIGEgcmFuZ2Ugb2YgdGhlIHJlcGxhY2VkIGNvbnRlbnQgYnkgbW92aW5nIGl0IGludG8gdGhlXG5zbGljZS5cbiovXG5jbGFzcyBSZXBsYWNlQXJvdW5kU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJlcGxhY2UtYXJvdW5kIHN0ZXAgd2l0aCB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIGdhcC5cbiAgICBgaW5zZXJ0YCBzaG91bGQgYmUgdGhlIHBvaW50IGluIHRoZSBzbGljZSBpbnRvIHdoaWNoIHRoZSBjb250ZW50XG4gICAgb2YgdGhlIGdhcCBzaG91bGQgYmUgbW92ZWQuIGBzdHJ1Y3R1cmVgIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzXG4gICAgaXQgaGFzIGluIHRoZSBbYFJlcGxhY2VTdGVwYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5SZXBsYWNlU3RlcCkgY2xhc3MuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgcmVwbGFjZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHByZXNlcnZlZCByYW5nZS5cbiAgICAqL1xuICAgIGdhcEZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgcHJlc2VydmVkIHJhbmdlLlxuICAgICovXG4gICAgZ2FwVG8sIFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSB0byBpbnNlcnQuXG4gICAgKi9cbiAgICBzbGljZSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGluIHRoZSBzbGljZSB3aGVyZSB0aGUgcHJlc2VydmVkIHJhbmdlIHNob3VsZCBiZVxuICAgIGluc2VydGVkLlxuICAgICovXG4gICAgaW5zZXJ0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0cnVjdHVyZSA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5nYXBGcm9tID0gZ2FwRnJvbTtcbiAgICAgICAgdGhpcy5nYXBUbyA9IGdhcFRvO1xuICAgICAgICB0aGlzLnNsaWNlID0gc2xpY2U7XG4gICAgICAgIHRoaXMuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgICAgICB0aGlzLnN0cnVjdHVyZSA9IHN0cnVjdHVyZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSAmJiAoY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmZyb20sIHRoaXMuZ2FwRnJvbSkgfHxcbiAgICAgICAgICAgIGNvbnRlbnRCZXR3ZWVuKGRvYywgdGhpcy5nYXBUbywgdGhpcy50bykpKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIlN0cnVjdHVyZSBnYXAtcmVwbGFjZSB3b3VsZCBvdmVyd3JpdGUgY29udGVudFwiKTtcbiAgICAgICAgbGV0IGdhcCA9IGRvYy5zbGljZSh0aGlzLmdhcEZyb20sIHRoaXMuZ2FwVG8pO1xuICAgICAgICBpZiAoZ2FwLm9wZW5TdGFydCB8fCBnYXAub3BlbkVuZClcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJHYXAgaXMgbm90IGEgZmxhdCByYW5nZVwiKTtcbiAgICAgICAgbGV0IGluc2VydGVkID0gdGhpcy5zbGljZS5pbnNlcnRBdCh0aGlzLmluc2VydCwgZ2FwLmNvbnRlbnQpO1xuICAgICAgICBpZiAoIWluc2VydGVkKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIkNvbnRlbnQgZG9lcyBub3QgZml0IGluIGdhcFwiKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLmZyb20sIHRoaXMudG8sIGluc2VydGVkKTtcbiAgICB9XG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0ZXBNYXAoW3RoaXMuZnJvbSwgdGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLmluc2VydCxcbiAgICAgICAgICAgIHRoaXMuZ2FwVG8sIHRoaXMudG8gLSB0aGlzLmdhcFRvLCB0aGlzLnNsaWNlLnNpemUgLSB0aGlzLmluc2VydF0pO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIGxldCBnYXAgPSB0aGlzLmdhcFRvIC0gdGhpcy5nYXBGcm9tO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKHRoaXMuZnJvbSwgdGhpcy5mcm9tICsgdGhpcy5zbGljZS5zaXplICsgZ2FwLCB0aGlzLmZyb20gKyB0aGlzLmluc2VydCwgdGhpcy5mcm9tICsgdGhpcy5pbnNlcnQgKyBnYXAsIGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pLnJlbW92ZUJldHdlZW4odGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLmdhcFRvIC0gdGhpcy5mcm9tKSwgdGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGxldCBnYXBGcm9tID0gbWFwcGluZy5tYXAodGhpcy5nYXBGcm9tLCAtMSksIGdhcFRvID0gbWFwcGluZy5tYXAodGhpcy5nYXBUbywgMSk7XG4gICAgICAgIGlmICgoZnJvbS5kZWxldGVkQWNyb3NzICYmIHRvLmRlbGV0ZWRBY3Jvc3MpIHx8IGdhcEZyb20gPCBmcm9tLnBvcyB8fCBnYXBUbyA+IHRvLnBvcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKGZyb20ucG9zLCB0by5wb3MsIGdhcEZyb20sIGdhcFRvLCB0aGlzLnNsaWNlLCB0aGlzLmluc2VydCwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBqc29uID0geyBzdGVwVHlwZTogXCJyZXBsYWNlQXJvdW5kXCIsIGZyb206IHRoaXMuZnJvbSwgdG86IHRoaXMudG8sXG4gICAgICAgICAgICBnYXBGcm9tOiB0aGlzLmdhcEZyb20sIGdhcFRvOiB0aGlzLmdhcFRvLCBpbnNlcnQ6IHRoaXMuaW5zZXJ0IH07XG4gICAgICAgIGlmICh0aGlzLnNsaWNlLnNpemUpXG4gICAgICAgICAgICBqc29uLnNsaWNlID0gdGhpcy5zbGljZS50b0pTT04oKTtcbiAgICAgICAgaWYgKHRoaXMuc3RydWN0dXJlKVxuICAgICAgICAgICAganNvbi5zdHJ1Y3R1cmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5mcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24udG8gIT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIGpzb24uZ2FwRnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmdhcFRvICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaW5zZXJ0ICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlcGxhY2VBcm91bmRTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKGpzb24uZnJvbSwganNvbi50bywganNvbi5nYXBGcm9tLCBqc29uLmdhcFRvLCBTbGljZS5mcm9tSlNPTihzY2hlbWEsIGpzb24uc2xpY2UpLCBqc29uLmluc2VydCwgISFqc29uLnN0cnVjdHVyZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZXBsYWNlQXJvdW5kXCIsIFJlcGxhY2VBcm91bmRTdGVwKTtcbmZ1bmN0aW9uIGNvbnRlbnRCZXR3ZWVuKGRvYywgZnJvbSwgdG8pIHtcbiAgICBsZXQgJGZyb20gPSBkb2MucmVzb2x2ZShmcm9tKSwgZGlzdCA9IHRvIC0gZnJvbSwgZGVwdGggPSAkZnJvbS5kZXB0aDtcbiAgICB3aGlsZSAoZGlzdCA+IDAgJiYgZGVwdGggPiAwICYmICRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpID09ICRmcm9tLm5vZGUoZGVwdGgpLmNoaWxkQ291bnQpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgZGlzdC0tO1xuICAgIH1cbiAgICBpZiAoZGlzdCA+IDApIHtcbiAgICAgICAgbGV0IG5leHQgPSAkZnJvbS5ub2RlKGRlcHRoKS5tYXliZUNoaWxkKCRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpKTtcbiAgICAgICAgd2hpbGUgKGRpc3QgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC5pc0xlYWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dC5maXJzdENoaWxkO1xuICAgICAgICAgICAgZGlzdC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkTWFyayh0ciwgZnJvbSwgdG8sIG1hcmspIHtcbiAgICBsZXQgcmVtb3ZlZCA9IFtdLCBhZGRlZCA9IFtdO1xuICAgIGxldCByZW1vdmluZywgYWRkaW5nO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MsIHBhcmVudCkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtYXJrcyA9IG5vZGUubWFya3M7XG4gICAgICAgIGlmICghbWFyay5pc0luU2V0KG1hcmtzKSAmJiBwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrLnR5cGUpKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChwb3MsIGZyb20pLCBlbmQgPSBNYXRoLm1pbihwb3MgKyBub2RlLm5vZGVTaXplLCB0byk7XG4gICAgICAgICAgICBsZXQgbmV3U2V0ID0gbWFyay5hZGRUb1NldChtYXJrcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXJrc1tpXS5pc0luU2V0KG5ld1NldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92aW5nICYmIHJlbW92aW5nLnRvID09IHN0YXJ0ICYmIHJlbW92aW5nLm1hcmsuZXEobWFya3NbaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZpbmcudG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQucHVzaChyZW1vdmluZyA9IG5ldyBSZW1vdmVNYXJrU3RlcChzdGFydCwgZW5kLCBtYXJrc1tpXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhZGRpbmcgJiYgYWRkaW5nLnRvID09IHN0YXJ0KVxuICAgICAgICAgICAgICAgIGFkZGluZy50byA9IGVuZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhZGRlZC5wdXNoKGFkZGluZyA9IG5ldyBBZGRNYXJrU3RlcChzdGFydCwgZW5kLCBtYXJrKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZW1vdmVkLmZvckVhY2gocyA9PiB0ci5zdGVwKHMpKTtcbiAgICBhZGRlZC5mb3JFYWNoKHMgPT4gdHIuc3RlcChzKSk7XG59XG5mdW5jdGlvbiByZW1vdmVNYXJrKHRyLCBmcm9tLCB0bywgbWFyaykge1xuICAgIGxldCBtYXRjaGVkID0gW10sIHN0ZXAgPSAwO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgaWYgKCFub2RlLmlzSW5saW5lKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdGVwKys7XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IG51bGw7XG4gICAgICAgIGlmIChtYXJrIGluc3RhbmNlb2YgTWFya1R5cGUpIHtcbiAgICAgICAgICAgIGxldCBzZXQgPSBub2RlLm1hcmtzLCBmb3VuZDtcbiAgICAgICAgICAgIHdoaWxlIChmb3VuZCA9IG1hcmsuaXNJblNldChzZXQpKSB7XG4gICAgICAgICAgICAgICAgKHRvUmVtb3ZlIHx8ICh0b1JlbW92ZSA9IFtdKSkucHVzaChmb3VuZCk7XG4gICAgICAgICAgICAgICAgc2V0ID0gZm91bmQucmVtb3ZlRnJvbVNldChzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcmspIHtcbiAgICAgICAgICAgIGlmIChtYXJrLmlzSW5TZXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUgPSBbbWFya107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b1JlbW92ZSA9IG5vZGUubWFya3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvUmVtb3ZlICYmIHRvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHBvcyArIG5vZGUubm9kZVNpemUsIHRvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0b1JlbW92ZVtpXSwgZm91bmQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gbWF0Y2hlZFtqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0uc3RlcCA9PSBzdGVwIC0gMSAmJiBzdHlsZS5lcShtYXRjaGVkW2pdLnN0eWxlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kLnRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICBmb3VuZC5zdGVwID0gc3RlcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQucHVzaCh7IHN0eWxlLCBmcm9tOiBNYXRoLm1heChwb3MsIGZyb20pLCB0bzogZW5kLCBzdGVwIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIG1hdGNoZWQuZm9yRWFjaChtID0+IHRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKG0uZnJvbSwgbS50bywgbS5zdHlsZSkpKTtcbn1cbmZ1bmN0aW9uIGNsZWFySW5jb21wYXRpYmxlKHRyLCBwb3MsIHBhcmVudFR5cGUsIG1hdGNoID0gcGFyZW50VHlwZS5jb250ZW50TWF0Y2gpIHtcbiAgICBsZXQgbm9kZSA9IHRyLmRvYy5ub2RlQXQocG9zKTtcbiAgICBsZXQgcmVwbFN0ZXBzID0gW10sIGN1ciA9IHBvcyArIDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpLCBlbmQgPSBjdXIgKyBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBtYXRjaC5tYXRjaFR5cGUoY2hpbGQudHlwZSk7XG4gICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgICAgcmVwbFN0ZXBzLnB1c2gobmV3IFJlcGxhY2VTdGVwKGN1ciwgZW5kLCBTbGljZS5lbXB0eSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2ggPSBhbGxvd2VkO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZC5tYXJrcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudFR5cGUuYWxsb3dzTWFya1R5cGUoY2hpbGQubWFya3Nbal0udHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKGN1ciwgZW5kLCBjaGlsZC5tYXJrc1tqXSkpO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmlzVGV4dCAmJiAhcGFyZW50VHlwZS5zcGVjLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbSwgbmV3bGluZSA9IC9cXHI/XFxufFxcci9nLCBzbGljZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobSA9IG5ld2xpbmUuZXhlYyhjaGlsZC50ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNsaWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShwYXJlbnRUeXBlLnNjaGVtYS50ZXh0KFwiIFwiLCBwYXJlbnRUeXBlLmFsbG93ZWRNYXJrcyhjaGlsZC5tYXJrcykpKSwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxTdGVwcy5wdXNoKG5ldyBSZXBsYWNlU3RlcChjdXIgKyBtLmluZGV4LCBjdXIgKyBtLmluZGV4ICsgbVswXS5sZW5ndGgsIHNsaWNlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1ciA9IGVuZDtcbiAgICB9XG4gICAgaWYgKCFtYXRjaC52YWxpZEVuZCkge1xuICAgICAgICBsZXQgZmlsbCA9IG1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICB0ci5yZXBsYWNlKGN1ciwgY3VyLCBuZXcgU2xpY2UoZmlsbCwgMCwgMCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gcmVwbFN0ZXBzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICB0ci5zdGVwKHJlcGxTdGVwc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNhbkN1dChub2RlLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIChzdGFydCA9PSAwIHx8IG5vZGUuY2FuUmVwbGFjZShzdGFydCwgbm9kZS5jaGlsZENvdW50KSkgJiZcbiAgICAgICAgKGVuZCA9PSBub2RlLmNoaWxkQ291bnQgfHwgbm9kZS5jYW5SZXBsYWNlKDAsIGVuZCkpO1xufVxuLyoqXG5UcnkgdG8gZmluZCBhIHRhcmdldCBkZXB0aCB0byB3aGljaCB0aGUgY29udGVudCBpbiB0aGUgZ2l2ZW4gcmFuZ2VcbmNhbiBiZSBsaWZ0ZWQuIFdpbGwgbm90IGdvIGFjcm9zc1xuW2lzb2xhdGluZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmlzb2xhdGluZykgcGFyZW50IG5vZGVzLlxuKi9cbmZ1bmN0aW9uIGxpZnRUYXJnZXQocmFuZ2UpIHtcbiAgICBsZXQgcGFyZW50ID0gcmFuZ2UucGFyZW50O1xuICAgIGxldCBjb250ZW50ID0gcGFyZW50LmNvbnRlbnQuY3V0QnlJbmRleChyYW5nZS5zdGFydEluZGV4LCByYW5nZS5lbmRJbmRleCk7XG4gICAgZm9yIChsZXQgZGVwdGggPSByYW5nZS5kZXB0aDs7IC0tZGVwdGgpIHtcbiAgICAgICAgbGV0IG5vZGUgPSByYW5nZS4kZnJvbS5ub2RlKGRlcHRoKTtcbiAgICAgICAgbGV0IGluZGV4ID0gcmFuZ2UuJGZyb20uaW5kZXgoZGVwdGgpLCBlbmRJbmRleCA9IHJhbmdlLiR0by5pbmRleEFmdGVyKGRlcHRoKTtcbiAgICAgICAgaWYgKGRlcHRoIDwgcmFuZ2UuZGVwdGggJiYgbm9kZS5jYW5SZXBsYWNlKGluZGV4LCBlbmRJbmRleCwgY29udGVudCkpXG4gICAgICAgICAgICByZXR1cm4gZGVwdGg7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwIHx8IG5vZGUudHlwZS5zcGVjLmlzb2xhdGluZyB8fCAhY2FuQ3V0KG5vZGUsIGluZGV4LCBlbmRJbmRleCkpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBsaWZ0KHRyLCByYW5nZSwgdGFyZ2V0KSB7XG4gICAgbGV0IHsgJGZyb20sICR0bywgZGVwdGggfSA9IHJhbmdlO1xuICAgIGxldCBnYXBTdGFydCA9ICRmcm9tLmJlZm9yZShkZXB0aCArIDEpLCBnYXBFbmQgPSAkdG8uYWZ0ZXIoZGVwdGggKyAxKTtcbiAgICBsZXQgc3RhcnQgPSBnYXBTdGFydCwgZW5kID0gZ2FwRW5kO1xuICAgIGxldCBiZWZvcmUgPSBGcmFnbWVudC5lbXB0eSwgb3BlblN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBkID0gZGVwdGgsIHNwbGl0dGluZyA9IGZhbHNlOyBkID4gdGFyZ2V0OyBkLS0pXG4gICAgICAgIGlmIChzcGxpdHRpbmcgfHwgJGZyb20uaW5kZXgoZCkgPiAwKSB7XG4gICAgICAgICAgICBzcGxpdHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYmVmb3JlID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGQpLmNvcHkoYmVmb3JlKSk7XG4gICAgICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgIH1cbiAgICBsZXQgYWZ0ZXIgPSBGcmFnbWVudC5lbXB0eSwgb3BlbkVuZCA9IDA7XG4gICAgZm9yIChsZXQgZCA9IGRlcHRoLCBzcGxpdHRpbmcgPSBmYWxzZTsgZCA+IHRhcmdldDsgZC0tKVxuICAgICAgICBpZiAoc3BsaXR0aW5nIHx8ICR0by5hZnRlcihkICsgMSkgPCAkdG8uZW5kKGQpKSB7XG4gICAgICAgICAgICBzcGxpdHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYWZ0ZXIgPSBGcmFnbWVudC5mcm9tKCR0by5ub2RlKGQpLmNvcHkoYWZ0ZXIpKTtcbiAgICAgICAgICAgIG9wZW5FbmQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoc3RhcnQsIGVuZCwgZ2FwU3RhcnQsIGdhcEVuZCwgbmV3IFNsaWNlKGJlZm9yZS5hcHBlbmQoYWZ0ZXIpLCBvcGVuU3RhcnQsIG9wZW5FbmQpLCBiZWZvcmUuc2l6ZSAtIG9wZW5TdGFydCwgdHJ1ZSkpO1xufVxuLyoqXG5UcnkgdG8gZmluZCBhIHZhbGlkIHdheSB0byB3cmFwIHRoZSBjb250ZW50IGluIHRoZSBnaXZlbiByYW5nZSBpbiBhXG5ub2RlIG9mIHRoZSBnaXZlbiB0eXBlLiBNYXkgaW50cm9kdWNlIGV4dHJhIG5vZGVzIGFyb3VuZCBhbmQgaW5zaWRlXG50aGUgd3JhcHBlciBub2RlLCBpZiBuZWNlc3NhcnkuIFJldHVybnMgbnVsbCBpZiBubyB2YWxpZCB3cmFwcGluZ1xuY291bGQgYmUgZm91bmQuIFdoZW4gYGlubmVyUmFuZ2VgIGlzIGdpdmVuLCB0aGF0IHJhbmdlJ3MgY29udGVudCBpc1xudXNlZCBhcyB0aGUgY29udGVudCB0byBmaXQgaW50byB0aGUgd3JhcHBpbmcsIGluc3RlYWQgb2YgdGhlXG5jb250ZW50IG9mIGByYW5nZWAuXG4qL1xuZnVuY3Rpb24gZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMgPSBudWxsLCBpbm5lclJhbmdlID0gcmFuZ2UpIHtcbiAgICBsZXQgYXJvdW5kID0gZmluZFdyYXBwaW5nT3V0c2lkZShyYW5nZSwgbm9kZVR5cGUpO1xuICAgIGxldCBpbm5lciA9IGFyb3VuZCAmJiBmaW5kV3JhcHBpbmdJbnNpZGUoaW5uZXJSYW5nZSwgbm9kZVR5cGUpO1xuICAgIGlmICghaW5uZXIpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBhcm91bmQubWFwKHdpdGhBdHRycylcbiAgICAgICAgLmNvbmNhdCh7IHR5cGU6IG5vZGVUeXBlLCBhdHRycyB9KS5jb25jYXQoaW5uZXIubWFwKHdpdGhBdHRycykpO1xufVxuZnVuY3Rpb24gd2l0aEF0dHJzKHR5cGUpIHsgcmV0dXJuIHsgdHlwZSwgYXR0cnM6IG51bGwgfTsgfVxuZnVuY3Rpb24gZmluZFdyYXBwaW5nT3V0c2lkZShyYW5nZSwgdHlwZSkge1xuICAgIGxldCB7IHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHJhbmdlO1xuICAgIGxldCBhcm91bmQgPSBwYXJlbnQuY29udGVudE1hdGNoQXQoc3RhcnRJbmRleCkuZmluZFdyYXBwaW5nKHR5cGUpO1xuICAgIGlmICghYXJvdW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb3V0ZXIgPSBhcm91bmQubGVuZ3RoID8gYXJvdW5kWzBdIDogdHlwZTtcbiAgICByZXR1cm4gcGFyZW50LmNhblJlcGxhY2VXaXRoKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBvdXRlcikgPyBhcm91bmQgOiBudWxsO1xufVxuZnVuY3Rpb24gZmluZFdyYXBwaW5nSW5zaWRlKHJhbmdlLCB0eXBlKSB7XG4gICAgbGV0IHsgcGFyZW50LCBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gcmFuZ2U7XG4gICAgbGV0IGlubmVyID0gcGFyZW50LmNoaWxkKHN0YXJ0SW5kZXgpO1xuICAgIGxldCBpbnNpZGUgPSB0eXBlLmNvbnRlbnRNYXRjaC5maW5kV3JhcHBpbmcoaW5uZXIudHlwZSk7XG4gICAgaWYgKCFpbnNpZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBsYXN0VHlwZSA9IGluc2lkZS5sZW5ndGggPyBpbnNpZGVbaW5zaWRlLmxlbmd0aCAtIDFdIDogdHlwZTtcbiAgICBsZXQgaW5uZXJNYXRjaCA9IGxhc3RUeXBlLmNvbnRlbnRNYXRjaDtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaW5uZXJNYXRjaCAmJiBpIDwgZW5kSW5kZXg7IGkrKylcbiAgICAgICAgaW5uZXJNYXRjaCA9IGlubmVyTWF0Y2gubWF0Y2hUeXBlKHBhcmVudC5jaGlsZChpKS50eXBlKTtcbiAgICBpZiAoIWlubmVyTWF0Y2ggfHwgIWlubmVyTWF0Y2gudmFsaWRFbmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpbnNpZGU7XG59XG5mdW5jdGlvbiB3cmFwKHRyLCByYW5nZSwgd3JhcHBlcnMpIHtcbiAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSB3cmFwcGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSB3cmFwcGVyc1tpXS50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gudmFsaWRFbmQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJXcmFwcGVyIHR5cGUgZ2l2ZW4gdG8gVHJhbnNmb3JtLndyYXAgZG9lcyBub3QgZm9ybSB2YWxpZCBjb250ZW50IG9mIGl0cyBwYXJlbnQgd3JhcHBlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbSh3cmFwcGVyc1tpXS50eXBlLmNyZWF0ZSh3cmFwcGVyc1tpXS5hdHRycywgY29udGVudCkpO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSByYW5nZS5zdGFydCwgZW5kID0gcmFuZ2UuZW5kO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0LCBlbmQsIHN0YXJ0LCBlbmQsIG5ldyBTbGljZShjb250ZW50LCAwLCAwKSwgd3JhcHBlcnMubGVuZ3RoLCB0cnVlKSk7XG59XG5mdW5jdGlvbiBzZXRCbG9ja1R5cGUodHIsIGZyb20sIHRvLCB0eXBlLCBhdHRycykge1xuICAgIGlmICghdHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUeXBlIGdpdmVuIHRvIHNldEJsb2NrVHlwZSBzaG91bGQgYmUgYSB0ZXh0YmxvY2tcIik7XG4gICAgbGV0IG1hcEZyb20gPSB0ci5zdGVwcy5sZW5ndGg7XG4gICAgdHIuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS5oYXNNYXJrdXAodHlwZSwgYXR0cnMpICYmIGNhbkNoYW5nZVR5cGUodHIuZG9jLCB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChwb3MpLCB0eXBlKSkge1xuICAgICAgICAgICAgLy8gRW5zdXJlIGFsbCBtYXJrdXAgdGhhdCBpc24ndCBhbGxvd2VkIGluIHRoZSBuZXcgbm9kZSB0eXBlIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIHRyLmNsZWFySW5jb21wYXRpYmxlKHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcywgMSksIHR5cGUpO1xuICAgICAgICAgICAgbGV0IG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgbGV0IHN0YXJ0TSA9IG1hcHBpbmcubWFwKHBvcywgMSksIGVuZE0gPSBtYXBwaW5nLm1hcChwb3MgKyBub2RlLm5vZGVTaXplLCAxKTtcbiAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0TSwgZW5kTSwgc3RhcnRNICsgMSwgZW5kTSAtIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGF0dHJzLCBudWxsLCBub2RlLm1hcmtzKSksIDAsIDApLCAxLCB0cnVlKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNhbkNoYW5nZVR5cGUoZG9jLCBwb3MsIHR5cGUpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyksIGluZGV4ID0gJHBvcy5pbmRleCgpO1xuICAgIHJldHVybiAkcG9zLnBhcmVudC5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXggKyAxLCB0eXBlKTtcbn1cbi8qKlxuQ2hhbmdlIHRoZSB0eXBlLCBhdHRyaWJ1dGVzLCBhbmQvb3IgbWFya3Mgb2YgdGhlIG5vZGUgYXQgYHBvc2AuXG5XaGVuIGB0eXBlYCBpc24ndCBnaXZlbiwgdGhlIGV4aXN0aW5nIG5vZGUgdHlwZSBpcyBwcmVzZXJ2ZWQsXG4qL1xuZnVuY3Rpb24gc2V0Tm9kZU1hcmt1cCh0ciwgcG9zLCB0eXBlLCBhdHRycywgbWFya3MpIHtcbiAgICBsZXQgbm9kZSA9IHRyLmRvYy5ub2RlQXQocG9zKTtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhdCBnaXZlbiBwb3NpdGlvblwiKTtcbiAgICBpZiAoIXR5cGUpXG4gICAgICAgIHR5cGUgPSBub2RlLnR5cGU7XG4gICAgbGV0IG5ld05vZGUgPSB0eXBlLmNyZWF0ZShhdHRycywgbnVsbCwgbWFya3MgfHwgbm9kZS5tYXJrcyk7XG4gICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICByZXR1cm4gdHIucmVwbGFjZVdpdGgocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCBuZXdOb2RlKTtcbiAgICBpZiAoIXR5cGUudmFsaWRDb250ZW50KG5vZGUuY29udGVudCkpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBjb250ZW50IGZvciBub2RlIHR5cGUgXCIgKyB0eXBlLm5hbWUpO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHBvcywgcG9zICsgbm9kZS5ub2RlU2l6ZSwgcG9zICsgMSwgcG9zICsgbm9kZS5ub2RlU2l6ZSAtIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKG5ld05vZGUpLCAwLCAwKSwgMSwgdHJ1ZSkpO1xufVxuLyoqXG5DaGVjayB3aGV0aGVyIHNwbGl0dGluZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgYWxsb3dlZC5cbiovXG5mdW5jdGlvbiBjYW5TcGxpdChkb2MsIHBvcywgZGVwdGggPSAxLCB0eXBlc0FmdGVyKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBiYXNlID0gJHBvcy5kZXB0aCAtIGRlcHRoO1xuICAgIGxldCBpbm5lclR5cGUgPSAodHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW3R5cGVzQWZ0ZXIubGVuZ3RoIC0gMV0pIHx8ICRwb3MucGFyZW50O1xuICAgIGlmIChiYXNlIDwgMCB8fCAkcG9zLnBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nIHx8XG4gICAgICAgICEkcG9zLnBhcmVudC5jYW5SZXBsYWNlKCRwb3MuaW5kZXgoKSwgJHBvcy5wYXJlbnQuY2hpbGRDb3VudCkgfHxcbiAgICAgICAgIWlubmVyVHlwZS50eXBlLnZhbGlkQ29udGVudCgkcG9zLnBhcmVudC5jb250ZW50LmN1dEJ5SW5kZXgoJHBvcy5pbmRleCgpLCAkcG9zLnBhcmVudC5jaGlsZENvdW50KSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCAtIDEsIGkgPSBkZXB0aCAtIDI7IGQgPiBiYXNlOyBkLS0sIGktLSkge1xuICAgICAgICBsZXQgbm9kZSA9ICRwb3Mubm9kZShkKSwgaW5kZXggPSAkcG9zLmluZGV4KGQpO1xuICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmVzdCA9IG5vZGUuY29udGVudC5jdXRCeUluZGV4KGluZGV4LCBub2RlLmNoaWxkQ291bnQpO1xuICAgICAgICBsZXQgb3ZlcnJpZGVDaGlsZCA9IHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlcltpICsgMV07XG4gICAgICAgIGlmIChvdmVycmlkZUNoaWxkKVxuICAgICAgICAgICAgcmVzdCA9IHJlc3QucmVwbGFjZUNoaWxkKDAsIG92ZXJyaWRlQ2hpbGQudHlwZS5jcmVhdGUob3ZlcnJpZGVDaGlsZC5hdHRycykpO1xuICAgICAgICBsZXQgYWZ0ZXIgPSAodHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW2ldKSB8fCBub2RlO1xuICAgICAgICBpZiAoIW5vZGUuY2FuUmVwbGFjZShpbmRleCArIDEsIG5vZGUuY2hpbGRDb3VudCkgfHwgIWFmdGVyLnR5cGUudmFsaWRDb250ZW50KHJlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4QWZ0ZXIoYmFzZSk7XG4gICAgbGV0IGJhc2VUeXBlID0gdHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyWzBdO1xuICAgIHJldHVybiAkcG9zLm5vZGUoYmFzZSkuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBiYXNlVHlwZSA/IGJhc2VUeXBlLnR5cGUgOiAkcG9zLm5vZGUoYmFzZSArIDEpLnR5cGUpO1xufVxuZnVuY3Rpb24gc3BsaXQodHIsIHBvcywgZGVwdGggPSAxLCB0eXBlc0FmdGVyKSB7XG4gICAgbGV0ICRwb3MgPSB0ci5kb2MucmVzb2x2ZShwb3MpLCBiZWZvcmUgPSBGcmFnbWVudC5lbXB0eSwgYWZ0ZXIgPSBGcmFnbWVudC5lbXB0eTtcbiAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCwgZSA9ICRwb3MuZGVwdGggLSBkZXB0aCwgaSA9IGRlcHRoIC0gMTsgZCA+IGU7IGQtLSwgaS0tKSB7XG4gICAgICAgIGJlZm9yZSA9IEZyYWdtZW50LmZyb20oJHBvcy5ub2RlKGQpLmNvcHkoYmVmb3JlKSk7XG4gICAgICAgIGxldCB0eXBlQWZ0ZXIgPSB0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbaV07XG4gICAgICAgIGFmdGVyID0gRnJhZ21lbnQuZnJvbSh0eXBlQWZ0ZXIgPyB0eXBlQWZ0ZXIudHlwZS5jcmVhdGUodHlwZUFmdGVyLmF0dHJzLCBhZnRlcikgOiAkcG9zLm5vZGUoZCkuY29weShhZnRlcikpO1xuICAgIH1cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlU3RlcChwb3MsIHBvcywgbmV3IFNsaWNlKGJlZm9yZS5hcHBlbmQoYWZ0ZXIpLCBkZXB0aCwgZGVwdGgpLCB0cnVlKSk7XG59XG4vKipcblRlc3Qgd2hldGhlciB0aGUgYmxvY2tzIGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBwb3NpdGlvbiBjYW4gYmVcbmpvaW5lZC5cbiovXG5mdW5jdGlvbiBjYW5Kb2luKGRvYywgcG9zKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICByZXR1cm4gam9pbmFibGUoJHBvcy5ub2RlQmVmb3JlLCAkcG9zLm5vZGVBZnRlcikgJiZcbiAgICAgICAgJHBvcy5wYXJlbnQuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKTtcbn1cbmZ1bmN0aW9uIGpvaW5hYmxlKGEsIGIpIHtcbiAgICByZXR1cm4gISEoYSAmJiBiICYmICFhLmlzTGVhZiAmJiBhLmNhbkFwcGVuZChiKSk7XG59XG4vKipcbkZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHBvc2l0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCB0byB0aGVcbmJsb2NrIGJlZm9yZSAob3IgYWZ0ZXIgaWYgYGRpcmAgaXMgcG9zaXRpdmUpLiBSZXR1cm5zIHRoZSBqb2luYWJsZVxucG9pbnQsIGlmIGFueS5cbiovXG5mdW5jdGlvbiBqb2luUG9pbnQoZG9jLCBwb3MsIGRpciA9IC0xKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOzsgZC0tKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgIGlmIChkID09ICRwb3MuZGVwdGgpIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZUJlZm9yZTtcbiAgICAgICAgICAgIGFmdGVyID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyID4gMCkge1xuICAgICAgICAgICAgYmVmb3JlID0gJHBvcy5ub2RlKGQgKyAxKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZm9yZSAmJiAhYmVmb3JlLmlzVGV4dGJsb2NrICYmIGpvaW5hYmxlKGJlZm9yZSwgYWZ0ZXIpICYmXG4gICAgICAgICAgICAkcG9zLm5vZGUoZCkuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKSlcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIGlmIChkID09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcG9zID0gZGlyIDwgMCA/ICRwb3MuYmVmb3JlKGQpIDogJHBvcy5hZnRlcihkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBqb2luKHRyLCBwb3MsIGRlcHRoKSB7XG4gICAgbGV0IHN0ZXAgPSBuZXcgUmVwbGFjZVN0ZXAocG9zIC0gZGVwdGgsIHBvcyArIGRlcHRoLCBTbGljZS5lbXB0eSwgdHJ1ZSk7XG4gICAgdHIuc3RlcChzdGVwKTtcbn1cbi8qKlxuVHJ5IHRvIGZpbmQgYSBwb2ludCB3aGVyZSBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUgY2FuIGJlIGluc2VydGVkXG5uZWFyIGBwb3NgLCBieSBzZWFyY2hpbmcgdXAgdGhlIG5vZGUgaGllcmFyY2h5IHdoZW4gYHBvc2AgaXRzZWxmXG5pc24ndCBhIHZhbGlkIHBsYWNlIGJ1dCBpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbm9kZS4gUmV0dXJuXG5udWxsIGlmIG5vIHBvc2l0aW9uIHdhcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBpbnNlcnRQb2ludChkb2MsIHBvcywgbm9kZVR5cGUpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgaWYgKCRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKCRwb3MuaW5kZXgoKSwgJHBvcy5pbmRleCgpLCBub2RlVHlwZSkpXG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgaWYgKCRwb3MucGFyZW50T2Zmc2V0ID09IDApXG4gICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGQpLmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgbm9kZVR5cGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmJlZm9yZShkICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgaWYgKCRwb3MucGFyZW50T2Zmc2V0ID09ICRwb3MucGFyZW50LmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gJHBvcy5pbmRleEFmdGVyKGQpO1xuICAgICAgICAgICAgaWYgKCRwb3Mubm9kZShkKS5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXgsIG5vZGVUeXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5hZnRlcihkICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCAkcG9zLm5vZGUoZCkuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG5GaW5kcyBhIHBvc2l0aW9uIGF0IG9yIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24gd2hlcmUgdGhlIGdpdmVuXG5zbGljZSBjYW4gYmUgaW5zZXJ0ZWQuIFdpbGwgbG9vayBhdCBwYXJlbnQgbm9kZXMnIG5lYXJlc3QgYm91bmRhcnlcbmFuZCB0cnkgdGhlcmUsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIHdhc24ndCBkaXJlY3RseSBhdCB0aGVcbnN0YXJ0IG9yIGVuZCBvZiB0aGF0IG5vZGUuIFJldHVybnMgbnVsbCB3aGVuIG5vIHBvc2l0aW9uIHdhcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBkcm9wUG9pbnQoZG9jLCBwb3MsIHNsaWNlKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGlmICghc2xpY2UuY29udGVudC5zaXplKVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIGxldCBjb250ZW50ID0gc2xpY2UuY29udGVudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLm9wZW5TdGFydDsgaSsrKVxuICAgICAgICBjb250ZW50ID0gY29udGVudC5maXJzdENoaWxkLmNvbnRlbnQ7XG4gICAgZm9yIChsZXQgcGFzcyA9IDE7IHBhc3MgPD0gKHNsaWNlLm9wZW5TdGFydCA9PSAwICYmIHNsaWNlLnNpemUgPyAyIDogMSk7IHBhc3MrKykge1xuICAgICAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBiaWFzID0gZCA9PSAkcG9zLmRlcHRoID8gMCA6ICRwb3MucG9zIDw9ICgkcG9zLnN0YXJ0KGQgKyAxKSArICRwb3MuZW5kKGQgKyAxKSkgLyAyID8gLTEgOiAxO1xuICAgICAgICAgICAgbGV0IGluc2VydFBvcyA9ICRwb3MuaW5kZXgoZCkgKyAoYmlhcyA+IDAgPyAxIDogMCk7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gJHBvcy5ub2RlKGQpLCBmaXRzID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocGFzcyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgZml0cyA9IHBhcmVudC5jYW5SZXBsYWNlKGluc2VydFBvcywgaW5zZXJ0UG9zLCBjb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB3cmFwcGluZyA9IHBhcmVudC5jb250ZW50TWF0Y2hBdChpbnNlcnRQb3MpLmZpbmRXcmFwcGluZyhjb250ZW50LmZpcnN0Q2hpbGQudHlwZSk7XG4gICAgICAgICAgICAgICAgZml0cyA9IHdyYXBwaW5nICYmIHBhcmVudC5jYW5SZXBsYWNlV2l0aChpbnNlcnRQb3MsIGluc2VydFBvcywgd3JhcHBpbmdbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpdHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpYXMgPT0gMCA/ICRwb3MucG9zIDogYmlhcyA8IDAgPyAkcG9zLmJlZm9yZShkICsgMSkgOiAkcG9zLmFmdGVyKGQgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG5cdTIwMThGaXRcdTIwMTkgYSBzbGljZSBpbnRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LCBwcm9kdWNpbmcgYVxuW3N0ZXBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcCkgdGhhdCBpbnNlcnRzIGl0LiBXaWxsIHJldHVybiBudWxsIGlmXG50aGVyZSdzIG5vIG1lYW5pbmdmdWwgd2F5IHRvIGluc2VydCB0aGUgc2xpY2UgaGVyZSwgb3IgaW5zZXJ0aW5nIGl0XG53b3VsZCBiZSBhIG5vLW9wIChhbiBlbXB0eSBzbGljZSBvdmVyIGFuIGVtcHR5IHJhbmdlKS5cbiovXG5mdW5jdGlvbiByZXBsYWNlU3RlcChkb2MsIGZyb20sIHRvID0gZnJvbSwgc2xpY2UgPSBTbGljZS5lbXB0eSkge1xuICAgIGlmIChmcm9tID09IHRvICYmICFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgJGZyb20gPSBkb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gZG9jLnJlc29sdmUodG8pO1xuICAgIC8vIE9wdGltaXphdGlvbiAtLSBhdm9pZCB3b3JrIGlmIGl0J3Mgb2J2aW91cyB0aGF0IGl0J3Mgbm90IG5lZWRlZC5cbiAgICBpZiAoZml0c1RyaXZpYWxseSgkZnJvbSwgJHRvLCBzbGljZSkpXG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoZnJvbSwgdG8sIHNsaWNlKTtcbiAgICByZXR1cm4gbmV3IEZpdHRlcigkZnJvbSwgJHRvLCBzbGljZSkuZml0KCk7XG59XG5mdW5jdGlvbiBmaXRzVHJpdmlhbGx5KCRmcm9tLCAkdG8sIHNsaWNlKSB7XG4gICAgcmV0dXJuICFzbGljZS5vcGVuU3RhcnQgJiYgIXNsaWNlLm9wZW5FbmQgJiYgJGZyb20uc3RhcnQoKSA9PSAkdG8uc3RhcnQoKSAmJlxuICAgICAgICAkZnJvbS5wYXJlbnQuY2FuUmVwbGFjZSgkZnJvbS5pbmRleCgpLCAkdG8uaW5kZXgoKSwgc2xpY2UuY29udGVudCk7XG59XG4vLyBBbGdvcml0aG0gZm9yICdwbGFjaW5nJyB0aGUgZWxlbWVudHMgb2YgYSBzbGljZSBpbnRvIGEgZ2FwOlxuLy9cbi8vIFdlIGNvbnNpZGVyIHRoZSBjb250ZW50IG9mIGVhY2ggbm9kZSB0aGF0IGlzIG9wZW4gdG8gdGhlIGxlZnQgdG8gYmVcbi8vIGluZGVwZW5kZW50bHkgcGxhY2VhYmxlLiBJLmUuIGluIDxwKFwiZm9vXCIpLCBwKFwiYmFyXCIpPiwgd2hlbiB0aGVcbi8vIHBhcmFncmFwaCBvbiB0aGUgbGVmdCBpcyBvcGVuLCBcImZvb1wiIGNhbiBiZSBwbGFjZWQgKHNvbWV3aGVyZSBvblxuLy8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgcmVwbGFjZW1lbnQgZ2FwKSBpbmRlcGVuZGVudGx5IGZyb20gcChcImJhclwiKS5cbi8vXG4vLyBUaGlzIGNsYXNzIHRyYWNrcyB0aGUgc3RhdGUgb2YgdGhlIHBsYWNlbWVudCBwcm9ncmVzcyBpbiB0aGVcbi8vIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuLy9cbi8vICAtIGBmcm9udGllcmAgaG9sZHMgYSBzdGFjayBvZiBge3R5cGUsIG1hdGNofWAgb2JqZWN0cyB0aGF0XG4vLyAgICByZXByZXNlbnQgdGhlIG9wZW4gc2lkZSBvZiB0aGUgcmVwbGFjZW1lbnQuIEl0IHN0YXJ0cyBhdFxuLy8gICAgYCRmcm9tYCwgdGhlbiBtb3ZlcyBmb3J3YXJkIGFzIGNvbnRlbnQgaXMgcGxhY2VkLCBhbmQgaXMgZmluYWxseVxuLy8gICAgcmVjb25jaWxlZCB3aXRoIGAkdG9gLlxuLy9cbi8vICAtIGB1bnBsYWNlZGAgaXMgYSBzbGljZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnQgdGhhdCBoYXNuJ3Rcbi8vICAgIGJlZW4gcGxhY2VkIHlldC5cbi8vXG4vLyAgLSBgcGxhY2VkYCBpcyBhIGZyYWdtZW50IG9mIHBsYWNlZCBjb250ZW50LiBJdHMgb3Blbi1zdGFydCB2YWx1ZVxuLy8gICAgaXMgaW1wbGljaXQgaW4gYCRmcm9tYCwgYW5kIGl0cyBvcGVuLWVuZCB2YWx1ZSBpbiBgZnJvbnRpZXJgLlxuY2xhc3MgRml0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigkZnJvbSwgJHRvLCB1bnBsYWNlZCkge1xuICAgICAgICB0aGlzLiRmcm9tID0gJGZyb207XG4gICAgICAgIHRoaXMuJHRvID0gJHRvO1xuICAgICAgICB0aGlzLnVucGxhY2VkID0gdW5wbGFjZWQ7XG4gICAgICAgIHRoaXMuZnJvbnRpZXIgPSBbXTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gJGZyb20uZGVwdGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSAkZnJvbS5ub2RlKGkpO1xuICAgICAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAgICAgICAgICAgbWF0Y2g6IG5vZGUuY29udGVudE1hdGNoQXQoJGZyb20uaW5kZXhBZnRlcihpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAkZnJvbS5kZXB0aDsgaSA+IDA7IGktLSlcbiAgICAgICAgICAgIHRoaXMucGxhY2VkID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGkpLmNvcHkodGhpcy5wbGFjZWQpKTtcbiAgICB9XG4gICAgZ2V0IGRlcHRoKCkgeyByZXR1cm4gdGhpcy5mcm9udGllci5sZW5ndGggLSAxOyB9XG4gICAgZml0KCkge1xuICAgICAgICAvLyBBcyBsb25nIGFzIHRoZXJlJ3MgdW5wbGFjZWQgY29udGVudCwgdHJ5IHRvIHBsYWNlIHNvbWUgb2YgaXQuXG4gICAgICAgIC8vIElmIHRoYXQgZmFpbHMsIGVpdGhlciBpbmNyZWFzZSB0aGUgb3BlbiBzY29yZSBvZiB0aGUgdW5wbGFjZWRcbiAgICAgICAgLy8gc2xpY2UsIG9yIGRyb3Agbm9kZXMgZnJvbSBpdCwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgICAgICB3aGlsZSAodGhpcy51bnBsYWNlZC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgZml0ID0gdGhpcy5maW5kRml0dGFibGUoKTtcbiAgICAgICAgICAgIGlmIChmaXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZU5vZGVzKGZpdCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuTW9yZSgpIHx8IHRoaXMuZHJvcE5vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZXJlJ3MgaW5saW5lIGNvbnRlbnQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGZyb250aWVyIF9hbmRfXG4gICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIGB0aGlzLiR0b2AsIHdlIG11c3QgZ2VuZXJhdGUgYSBgUmVwbGFjZUFyb3VuZGBcbiAgICAgICAgLy8gc3RlcCB0aGF0IHB1bGxzIHRoYXQgY29udGVudCBpbnRvIHRoZSBub2RlIGFmdGVyIHRoZSBmcm9udGllci5cbiAgICAgICAgLy8gVGhhdCBtZWFucyB0aGUgZml0dGluZyBtdXN0IGJlIGRvbmUgdG8gdGhlIGVuZCBvZiB0aGUgdGV4dGJsb2NrXG4gICAgICAgIC8vIG5vZGUgYWZ0ZXIgYHRoaXMuJHRvYCwgbm90IGB0aGlzLiR0b2AgaXRzZWxmLlxuICAgICAgICBsZXQgbW92ZUlubGluZSA9IHRoaXMubXVzdE1vdmVJbmxpbmUoKSwgcGxhY2VkU2l6ZSA9IHRoaXMucGxhY2VkLnNpemUgLSB0aGlzLmRlcHRoIC0gdGhpcy4kZnJvbS5kZXB0aDtcbiAgICAgICAgbGV0ICRmcm9tID0gdGhpcy4kZnJvbSwgJHRvID0gdGhpcy5jbG9zZShtb3ZlSW5saW5lIDwgMCA/IHRoaXMuJHRvIDogJGZyb20uZG9jLnJlc29sdmUobW92ZUlubGluZSkpO1xuICAgICAgICBpZiAoISR0bylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAvLyBJZiBjbG9zaW5nIHRvIGAkdG9gIHN1Y2NlZWRlZCwgY3JlYXRlIGEgc3RlcFxuICAgICAgICBsZXQgY29udGVudCA9IHRoaXMucGxhY2VkLCBvcGVuU3RhcnQgPSAkZnJvbS5kZXB0aCwgb3BlbkVuZCA9ICR0by5kZXB0aDtcbiAgICAgICAgd2hpbGUgKG9wZW5TdGFydCAmJiBvcGVuRW5kICYmIGNvbnRlbnQuY2hpbGRDb3VudCA9PSAxKSB7IC8vIE5vcm1hbGl6ZSBieSBkcm9wcGluZyBvcGVuIHBhcmVudCBub2Rlc1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgICAgICAgICAgb3BlblN0YXJ0LS07XG4gICAgICAgICAgICBvcGVuRW5kLS07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIGlmIChtb3ZlSW5saW5lID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKCRmcm9tLnBvcywgbW92ZUlubGluZSwgdGhpcy4kdG8ucG9zLCB0aGlzLiR0by5lbmQoKSwgc2xpY2UsIHBsYWNlZFNpemUpO1xuICAgICAgICBpZiAoc2xpY2Uuc2l6ZSB8fCAkZnJvbS5wb3MgIT0gdGhpcy4kdG8ucG9zKSAvLyBEb24ndCBnZW5lcmF0ZSBuby1vcCBzdGVwc1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcCgkZnJvbS5wb3MsICR0by5wb3MsIHNsaWNlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEZpbmQgYSBwb3NpdGlvbiBvbiB0aGUgc3RhcnQgc3BpbmUgb2YgYHRoaXMudW5wbGFjZWRgIHRoYXQgaGFzXG4gICAgLy8gY29udGVudCB0aGF0IGNhbiBiZSBtb3ZlZCBzb21ld2hlcmUgb24gdGhlIGZyb250aWVyLiBSZXR1cm5zIHR3b1xuICAgIC8vIGRlcHRocywgb25lIGZvciB0aGUgc2xpY2UgYW5kIG9uZSBmb3IgdGhlIGZyb250aWVyLlxuICAgIGZpbmRGaXR0YWJsZSgpIHtcbiAgICAgICAgbGV0IHN0YXJ0RGVwdGggPSB0aGlzLnVucGxhY2VkLm9wZW5TdGFydDtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gdGhpcy51bnBsYWNlZC5jb250ZW50LCBkID0gMCwgb3BlbkVuZCA9IHRoaXMudW5wbGFjZWQub3BlbkVuZDsgZCA8IHN0YXJ0RGVwdGg7IGQrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBjdXIuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmIChjdXIuY2hpbGRDb3VudCA+IDEpXG4gICAgICAgICAgICAgICAgb3BlbkVuZCA9IDA7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nICYmIG9wZW5FbmQgPD0gZCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGVwdGggPSBkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyID0gbm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgdHJ5IHdyYXBwaW5nIG5vZGVzIChwYXNzIDIpIGFmdGVyIGZpbmRpbmcgYSBwbGFjZSB3aXRob3V0XG4gICAgICAgIC8vIHdyYXBwaW5nIGZhaWxlZC5cbiAgICAgICAgZm9yIChsZXQgcGFzcyA9IDE7IHBhc3MgPD0gMjsgcGFzcysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbGljZURlcHRoID0gcGFzcyA9PSAxID8gc3RhcnREZXB0aCA6IHRoaXMudW5wbGFjZWQub3BlblN0YXJ0OyBzbGljZURlcHRoID49IDA7IHNsaWNlRGVwdGgtLSkge1xuICAgICAgICAgICAgICAgIGxldCBmcmFnbWVudCwgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoc2xpY2VEZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBjb250ZW50QXQodGhpcy51bnBsYWNlZC5jb250ZW50LCBzbGljZURlcHRoIC0gMSkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBwYXJlbnQuY29udGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy51bnBsYWNlZC5jb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZyb250aWVyRGVwdGggPSB0aGlzLmRlcHRoOyBmcm9udGllckRlcHRoID49IDA7IGZyb250aWVyRGVwdGgtLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBtYXRjaCB9ID0gdGhpcy5mcm9udGllcltmcm9udGllckRlcHRoXSwgd3JhcCwgaW5qZWN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gcGFzcyAxLCBpZiB0aGUgbmV4dCBub2RlIG1hdGNoZXMsIG9yIHRoZXJlIGlzIG5vIG5leHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSBidXQgdGhlIHBhcmVudHMgbG9vayBjb21wYXRpYmxlLCB3ZSd2ZSBmb3VuZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSAxICYmIChmaXJzdCA/IG1hdGNoLm1hdGNoVHlwZShmaXJzdC50eXBlKSB8fCAoaW5qZWN0ID0gbWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5mcm9tKGZpcnN0KSwgZmFsc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJlbnQgJiYgdHlwZS5jb21wYXRpYmxlQ29udGVudChwYXJlbnQudHlwZSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2xpY2VEZXB0aCwgZnJvbnRpZXJEZXB0aCwgcGFyZW50LCBpbmplY3QgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gcGFzcyAyLCBsb29rIGZvciBhIHNldCBvZiB3cmFwcGluZyBub2RlcyB0aGF0IG1ha2VcbiAgICAgICAgICAgICAgICAgICAgLy8gYGZpcnN0YCBmaXQgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzcyA9PSAyICYmIGZpcnN0ICYmICh3cmFwID0gbWF0Y2guZmluZFdyYXBwaW5nKGZpcnN0LnR5cGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgd3JhcCB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjb250aW51ZSBsb29raW5nIGZ1cnRoZXIgdXAgaWYgdGhlIHBhcmVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGZpdCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIG1hdGNoLm1hdGNoVHlwZShwYXJlbnQudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3Blbk1vcmUoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gdGhpcy51bnBsYWNlZDtcbiAgICAgICAgbGV0IGlubmVyID0gY29udGVudEF0KGNvbnRlbnQsIG9wZW5TdGFydCk7XG4gICAgICAgIGlmICghaW5uZXIuY2hpbGRDb3VudCB8fCBpbm5lci5maXJzdENoaWxkLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShjb250ZW50LCBvcGVuU3RhcnQgKyAxLCBNYXRoLm1heChvcGVuRW5kLCBpbm5lci5zaXplICsgb3BlblN0YXJ0ID49IGNvbnRlbnQuc2l6ZSAtIG9wZW5FbmQgPyBvcGVuU3RhcnQgKyAxIDogMCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZHJvcE5vZGUoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gdGhpcy51bnBsYWNlZDtcbiAgICAgICAgbGV0IGlubmVyID0gY29udGVudEF0KGNvbnRlbnQsIG9wZW5TdGFydCk7XG4gICAgICAgIGlmIChpbm5lci5jaGlsZENvdW50IDw9IDEgJiYgb3BlblN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgbGV0IG9wZW5BdEVuZCA9IGNvbnRlbnQuc2l6ZSAtIG9wZW5TdGFydCA8PSBvcGVuU3RhcnQgKyBpbm5lci5zaXplO1xuICAgICAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KGNvbnRlbnQsIG9wZW5TdGFydCAtIDEsIDEpLCBvcGVuU3RhcnQgLSAxLCBvcGVuQXRFbmQgPyBvcGVuU3RhcnQgLSAxIDogb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVucGxhY2VkID0gbmV3IFNsaWNlKGRyb3BGcm9tRnJhZ21lbnQoY29udGVudCwgb3BlblN0YXJ0LCAxKSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNb3ZlIGNvbnRlbnQgZnJvbSB0aGUgdW5wbGFjZWQgc2xpY2UgYXQgYHNsaWNlRGVwdGhgIHRvIHRoZVxuICAgIC8vIGZyb250aWVyIG5vZGUgYXQgYGZyb250aWVyRGVwdGhgLiBDbG9zZSB0aGF0IGZyb250aWVyIG5vZGUgd2hlblxuICAgIC8vIGFwcGxpY2FibGUuXG4gICAgcGxhY2VOb2Rlcyh7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgaW5qZWN0LCB3cmFwIH0pIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGVwdGggPiBmcm9udGllckRlcHRoKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICBpZiAod3JhcClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Gcm9udGllck5vZGUod3JhcFtpXSk7XG4gICAgICAgIGxldCBzbGljZSA9IHRoaXMudW5wbGFjZWQsIGZyYWdtZW50ID0gcGFyZW50ID8gcGFyZW50LmNvbnRlbnQgOiBzbGljZS5jb250ZW50O1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0gc2xpY2Uub3BlblN0YXJ0IC0gc2xpY2VEZXB0aDtcbiAgICAgICAgbGV0IHRha2VuID0gMCwgYWRkID0gW107XG4gICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2Zyb250aWVyRGVwdGhdO1xuICAgICAgICBpZiAoaW5qZWN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICAgICAgYWRkLnB1c2goaW5qZWN0LmNoaWxkKGkpKTtcbiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2gubWF0Y2hGcmFnbWVudChpbmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbXB1dGVzIHRoZSBhbW91bnQgb2YgKGVuZCkgb3BlbiBub2RlcyBhdCB0aGUgZW5kIG9mIHRoZVxuICAgICAgICAvLyBmcmFnbWVudC4gV2hlbiAwLCB0aGUgcGFyZW50IGlzIG9wZW4sIGJ1dCBubyBtb3JlLiBXaGVuXG4gICAgICAgIC8vIG5lZ2F0aXZlLCBub3RoaW5nIGlzIG9wZW4uXG4gICAgICAgIGxldCBvcGVuRW5kQ291bnQgPSAoZnJhZ21lbnQuc2l6ZSArIHNsaWNlRGVwdGgpIC0gKHNsaWNlLmNvbnRlbnQuc2l6ZSAtIHNsaWNlLm9wZW5FbmQpO1xuICAgICAgICAvLyBTY2FuIG92ZXIgdGhlIGZyYWdtZW50LCBmaXR0aW5nIGFzIG1hbnkgY2hpbGQgbm9kZXMgYXNcbiAgICAgICAgLy8gcG9zc2libGUuXG4gICAgICAgIHdoaWxlICh0YWtlbiA8IGZyYWdtZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZnJhZ21lbnQuY2hpbGQodGFrZW4pLCBtYXRjaGVzID0gbWF0Y2gubWF0Y2hUeXBlKG5leHQudHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB0YWtlbisrO1xuICAgICAgICAgICAgaWYgKHRha2VuID4gMSB8fCBvcGVuU3RhcnQgPT0gMCB8fCBuZXh0LmNvbnRlbnQuc2l6ZSkgeyAvLyBEcm9wIGVtcHR5IG9wZW4gbm9kZXNcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXM7XG4gICAgICAgICAgICAgICAgYWRkLnB1c2goY2xvc2VOb2RlU3RhcnQobmV4dC5tYXJrKHR5cGUuYWxsb3dlZE1hcmtzKG5leHQubWFya3MpKSwgdGFrZW4gPT0gMSA/IG9wZW5TdGFydCA6IDAsIHRha2VuID09IGZyYWdtZW50LmNoaWxkQ291bnQgPyBvcGVuRW5kQ291bnQgOiAtMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0b0VuZCA9IHRha2VuID09IGZyYWdtZW50LmNoaWxkQ291bnQ7XG4gICAgICAgIGlmICghdG9FbmQpXG4gICAgICAgICAgICBvcGVuRW5kQ291bnQgPSAtMTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCBmcm9udGllckRlcHRoLCBGcmFnbWVudC5mcm9tKGFkZCkpO1xuICAgICAgICB0aGlzLmZyb250aWVyW2Zyb250aWVyRGVwdGhdLm1hdGNoID0gbWF0Y2g7XG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgdHlwZXMgbWF0Y2gsIGFuZCB0aGUgZW50aXJlIG5vZGUgd2FzIG1vdmVkLCBhbmRcbiAgICAgICAgLy8gaXQncyBub3Qgb3BlbiwgY2xvc2UgdGhpcyBmcm9udGllciBub2RlIHJpZ2h0IGF3YXkuXG4gICAgICAgIGlmICh0b0VuZCAmJiBvcGVuRW5kQ291bnQgPCAwICYmIHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PSB0aGlzLmZyb250aWVyW3RoaXMuZGVwdGhdLnR5cGUgJiYgdGhpcy5mcm9udGllci5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICAvLyBBZGQgbmV3IGZyb250aWVyIG5vZGVzIGZvciBhbnkgb3BlbiBub2RlcyBhdCB0aGUgZW5kLlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgY3VyID0gZnJhZ21lbnQ7IGkgPCBvcGVuRW5kQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBjdXIubGFzdENoaWxkO1xuICAgICAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHsgdHlwZTogbm9kZS50eXBlLCBtYXRjaDogbm9kZS5jb250ZW50TWF0Y2hBdChub2RlLmNoaWxkQ291bnQpIH0pO1xuICAgICAgICAgICAgY3VyID0gbm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBgdGhpcy51bnBsYWNlZGAuIERyb3AgdGhlIGVudGlyZSBub2RlIGZyb20gd2hpY2ggd2VcbiAgICAgICAgLy8gcGxhY2VkIGl0IHdlIGdvdCB0byBpdHMgZW5kLCBvdGhlcndpc2UganVzdCBkcm9wIHRoZSBwbGFjZWRcbiAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgIHRoaXMudW5wbGFjZWQgPSAhdG9FbmQgPyBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChzbGljZS5jb250ZW50LCBzbGljZURlcHRoLCB0YWtlbiksIHNsaWNlLm9wZW5TdGFydCwgc2xpY2Uub3BlbkVuZClcbiAgICAgICAgICAgIDogc2xpY2VEZXB0aCA9PSAwID8gU2xpY2UuZW1wdHlcbiAgICAgICAgICAgICAgICA6IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KHNsaWNlLmNvbnRlbnQsIHNsaWNlRGVwdGggLSAxLCAxKSwgc2xpY2VEZXB0aCAtIDEsIG9wZW5FbmRDb3VudCA8IDAgPyBzbGljZS5vcGVuRW5kIDogc2xpY2VEZXB0aCAtIDEpO1xuICAgIH1cbiAgICBtdXN0TW92ZUlubGluZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiR0by5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLmZyb250aWVyW3RoaXMuZGVwdGhdLCBsZXZlbDtcbiAgICAgICAgaWYgKCF0b3AudHlwZS5pc1RleHRibG9jayB8fCAhY29udGVudEFmdGVyRml0cyh0aGlzLiR0bywgdGhpcy4kdG8uZGVwdGgsIHRvcC50eXBlLCB0b3AubWF0Y2gsIGZhbHNlKSB8fFxuICAgICAgICAgICAgKHRoaXMuJHRvLmRlcHRoID09IHRoaXMuZGVwdGggJiYgKGxldmVsID0gdGhpcy5maW5kQ2xvc2VMZXZlbCh0aGlzLiR0bykpICYmIGxldmVsLmRlcHRoID09IHRoaXMuZGVwdGgpKVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBsZXQgeyBkZXB0aCB9ID0gdGhpcy4kdG8sIGFmdGVyID0gdGhpcy4kdG8uYWZ0ZXIoZGVwdGgpO1xuICAgICAgICB3aGlsZSAoZGVwdGggPiAxICYmIGFmdGVyID09IHRoaXMuJHRvLmVuZCgtLWRlcHRoKSlcbiAgICAgICAgICAgICsrYWZ0ZXI7XG4gICAgICAgIHJldHVybiBhZnRlcjtcbiAgICB9XG4gICAgZmluZENsb3NlTGV2ZWwoJHRvKSB7XG4gICAgICAgIHNjYW46IGZvciAobGV0IGkgPSBNYXRoLm1pbih0aGlzLmRlcHRoLCAkdG8uZGVwdGgpOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHsgbWF0Y2gsIHR5cGUgfSA9IHRoaXMuZnJvbnRpZXJbaV07XG4gICAgICAgICAgICBsZXQgZHJvcElubmVyID0gaSA8ICR0by5kZXB0aCAmJiAkdG8uZW5kKGkgKyAxKSA9PSAkdG8ucG9zICsgKCR0by5kZXB0aCAtIChpICsgMSkpO1xuICAgICAgICAgICAgbGV0IGZpdCA9IGNvbnRlbnRBZnRlckZpdHMoJHRvLCBpLCB0eXBlLCBtYXRjaCwgZHJvcElubmVyKTtcbiAgICAgICAgICAgIGlmICghZml0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgZCA9IGkgLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2RdO1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gY29udGVudEFmdGVyRml0cygkdG8sIGQsIHR5cGUsIG1hdGNoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5jaGlsZENvdW50KVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzY2FuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGVwdGg6IGksIGZpdCwgbW92ZTogZHJvcElubmVyID8gJHRvLmRvYy5yZXNvbHZlKCR0by5hZnRlcihpICsgMSkpIDogJHRvIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xvc2UoJHRvKSB7XG4gICAgICAgIGxldCBjbG9zZSA9IHRoaXMuZmluZENsb3NlTGV2ZWwoJHRvKTtcbiAgICAgICAgaWYgKCFjbG9zZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAodGhpcy5kZXB0aCA+IGNsb3NlLmRlcHRoKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICBpZiAoY2xvc2UuZml0LmNoaWxkQ291bnQpXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIGNsb3NlLmRlcHRoLCBjbG9zZS5maXQpO1xuICAgICAgICAkdG8gPSBjbG9zZS5tb3ZlO1xuICAgICAgICBmb3IgKGxldCBkID0gY2xvc2UuZGVwdGggKyAxOyBkIDw9ICR0by5kZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9ICR0by5ub2RlKGQpLCBhZGQgPSBub2RlLnR5cGUuY29udGVudE1hdGNoLmZpbGxCZWZvcmUobm9kZS5jb250ZW50LCB0cnVlLCAkdG8uaW5kZXgoZCkpO1xuICAgICAgICAgICAgdGhpcy5vcGVuRnJvbnRpZXJOb2RlKG5vZGUudHlwZSwgbm9kZS5hdHRycywgYWRkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJHRvO1xuICAgIH1cbiAgICBvcGVuRnJvbnRpZXJOb2RlKHR5cGUsIGF0dHJzID0gbnVsbCwgY29udGVudCkge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy5mcm9udGllclt0aGlzLmRlcHRoXTtcbiAgICAgICAgdG9wLm1hdGNoID0gdG9wLm1hdGNoLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCB0aGlzLmRlcHRoLCBGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGF0dHJzLCBjb250ZW50KSkpO1xuICAgICAgICB0aGlzLmZyb250aWVyLnB1c2goeyB0eXBlLCBtYXRjaDogdHlwZS5jb250ZW50TWF0Y2ggfSk7XG4gICAgfVxuICAgIGNsb3NlRnJvbnRpZXJOb2RlKCkge1xuICAgICAgICBsZXQgb3BlbiA9IHRoaXMuZnJvbnRpZXIucG9wKCk7XG4gICAgICAgIGxldCBhZGQgPSBvcGVuLm1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICBpZiAoYWRkLmNoaWxkQ291bnQpXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIHRoaXMuZnJvbnRpZXIubGVuZ3RoLCBhZGQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRyb3BGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIGRlcHRoLCBjb3VudCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQuY3V0QnlJbmRleChjb3VudCwgZnJhZ21lbnQuY2hpbGRDb3VudCk7XG4gICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2VDaGlsZCgwLCBmcmFnbWVudC5maXJzdENoaWxkLmNvcHkoZHJvcEZyb21GcmFnbWVudChmcmFnbWVudC5maXJzdENoaWxkLmNvbnRlbnQsIGRlcHRoIC0gMSwgY291bnQpKSk7XG59XG5mdW5jdGlvbiBhZGRUb0ZyYWdtZW50KGZyYWdtZW50LCBkZXB0aCwgY29udGVudCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoZnJhZ21lbnQuY2hpbGRDb3VudCAtIDEsIGZyYWdtZW50Lmxhc3RDaGlsZC5jb3B5KGFkZFRvRnJhZ21lbnQoZnJhZ21lbnQubGFzdENoaWxkLmNvbnRlbnQsIGRlcHRoIC0gMSwgY29udGVudCkpKTtcbn1cbmZ1bmN0aW9uIGNvbnRlbnRBdChmcmFnbWVudCwgZGVwdGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgIHJldHVybiBmcmFnbWVudDtcbn1cbmZ1bmN0aW9uIGNsb3NlTm9kZVN0YXJ0KG5vZGUsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGlmIChvcGVuU3RhcnQgPD0gMClcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgbGV0IGZyYWcgPSBub2RlLmNvbnRlbnQ7XG4gICAgaWYgKG9wZW5TdGFydCA+IDEpXG4gICAgICAgIGZyYWcgPSBmcmFnLnJlcGxhY2VDaGlsZCgwLCBjbG9zZU5vZGVTdGFydChmcmFnLmZpcnN0Q2hpbGQsIG9wZW5TdGFydCAtIDEsIGZyYWcuY2hpbGRDb3VudCA9PSAxID8gb3BlbkVuZCAtIDEgOiAwKSk7XG4gICAgaWYgKG9wZW5TdGFydCA+IDApIHtcbiAgICAgICAgZnJhZyA9IG5vZGUudHlwZS5jb250ZW50TWF0Y2guZmlsbEJlZm9yZShmcmFnKS5hcHBlbmQoZnJhZyk7XG4gICAgICAgIGlmIChvcGVuRW5kIDw9IDApXG4gICAgICAgICAgICBmcmFnID0gZnJhZy5hcHBlbmQobm9kZS50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGZyYWcpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUuY29weShmcmFnKTtcbn1cbmZ1bmN0aW9uIGNvbnRlbnRBZnRlckZpdHMoJHRvLCBkZXB0aCwgdHlwZSwgbWF0Y2gsIG9wZW4pIHtcbiAgICBsZXQgbm9kZSA9ICR0by5ub2RlKGRlcHRoKSwgaW5kZXggPSBvcGVuID8gJHRvLmluZGV4QWZ0ZXIoZGVwdGgpIDogJHRvLmluZGV4KGRlcHRoKTtcbiAgICBpZiAoaW5kZXggPT0gbm9kZS5jaGlsZENvdW50ICYmICF0eXBlLmNvbXBhdGlibGVDb250ZW50KG5vZGUudHlwZSkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmaXQgPSBtYXRjaC5maWxsQmVmb3JlKG5vZGUuY29udGVudCwgdHJ1ZSwgaW5kZXgpO1xuICAgIHJldHVybiBmaXQgJiYgIWludmFsaWRNYXJrcyh0eXBlLCBub2RlLmNvbnRlbnQsIGluZGV4KSA/IGZpdCA6IG51bGw7XG59XG5mdW5jdGlvbiBpbnZhbGlkTWFya3ModHlwZSwgZnJhZ21lbnQsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZnJhZ21lbnQuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICBpZiAoIXR5cGUuYWxsb3dzTWFya3MoZnJhZ21lbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZGVmaW5lc0NvbnRlbnQodHlwZSkge1xuICAgIHJldHVybiB0eXBlLnNwZWMuZGVmaW5pbmcgfHwgdHlwZS5zcGVjLmRlZmluaW5nRm9yQ29udGVudDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VSYW5nZSh0ciwgZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgaWYgKCFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gdHIuZGVsZXRlUmFuZ2UoZnJvbSwgdG8pO1xuICAgIGxldCAkZnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pLCAkdG8gPSB0ci5kb2MucmVzb2x2ZSh0byk7XG4gICAgaWYgKGZpdHNUcml2aWFsbHkoJGZyb20sICR0bywgc2xpY2UpKVxuICAgICAgICByZXR1cm4gdHIuc3RlcChuZXcgUmVwbGFjZVN0ZXAoZnJvbSwgdG8sIHNsaWNlKSk7XG4gICAgbGV0IHRhcmdldERlcHRocyA9IGNvdmVyZWREZXB0aHMoJGZyb20sIHRyLmRvYy5yZXNvbHZlKHRvKSk7XG4gICAgLy8gQ2FuJ3QgcmVwbGFjZSB0aGUgd2hvbGUgZG9jdW1lbnQsIHNvIHJlbW92ZSAwIGlmIGl0J3MgcHJlc2VudFxuICAgIGlmICh0YXJnZXREZXB0aHNbdGFyZ2V0RGVwdGhzLmxlbmd0aCAtIDFdID09IDApXG4gICAgICAgIHRhcmdldERlcHRocy5wb3AoKTtcbiAgICAvLyBOZWdhdGl2ZSBudW1iZXJzIHJlcHJlc2VudCBub3QgZXhwYW5zaW9uIG92ZXIgdGhlIHdob2xlIG5vZGUgYXRcbiAgICAvLyB0aGF0IGRlcHRoLCBidXQgcmVwbGFjaW5nIGZyb20gJGZyb20uYmVmb3JlKC1EKSB0byAkdG8ucG9zLlxuICAgIGxldCBwcmVmZXJyZWRUYXJnZXQgPSAtKCRmcm9tLmRlcHRoICsgMSk7XG4gICAgdGFyZ2V0RGVwdGhzLnVuc2hpZnQocHJlZmVycmVkVGFyZ2V0KTtcbiAgICAvLyBUaGlzIGxvb3AgcGlja3MgYSBwcmVmZXJyZWQgdGFyZ2V0IGRlcHRoLCBpZiBvbmUgb2YgdGhlIGNvdmVyaW5nXG4gICAgLy8gZGVwdGhzIGlzIG5vdCBvdXRzaWRlIG9mIGEgZGVmaW5pbmcgbm9kZSwgYW5kIGFkZHMgbmVnYXRpdmVcbiAgICAvLyBkZXB0aHMgZm9yIGFueSBkZXB0aCB0aGF0IGhhcyAkZnJvbSBhdCBpdHMgc3RhcnQgYW5kIGRvZXMgbm90XG4gICAgLy8gY3Jvc3MgYSBkZWZpbmluZyBub2RlLlxuICAgIGZvciAobGV0IGQgPSAkZnJvbS5kZXB0aCwgcG9zID0gJGZyb20ucG9zIC0gMTsgZCA+IDA7IGQtLSwgcG9zLS0pIHtcbiAgICAgICAgbGV0IHNwZWMgPSAkZnJvbS5ub2RlKGQpLnR5cGUuc3BlYztcbiAgICAgICAgaWYgKHNwZWMuZGVmaW5pbmcgfHwgc3BlYy5kZWZpbmluZ0FzQ29udGV4dCB8fCBzcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAodGFyZ2V0RGVwdGhzLmluZGV4T2YoZCkgPiAtMSlcbiAgICAgICAgICAgIHByZWZlcnJlZFRhcmdldCA9IGQ7XG4gICAgICAgIGVsc2UgaWYgKCRmcm9tLmJlZm9yZShkKSA9PSBwb3MpXG4gICAgICAgICAgICB0YXJnZXREZXB0aHMuc3BsaWNlKDEsIDAsIC1kKTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpdCBlYWNoIHBvc3NpYmxlIGRlcHRoIG9mIHRoZSBzbGljZSBpbnRvIGVhY2ggcG9zc2libGVcbiAgICAvLyB0YXJnZXQgZGVwdGgsIHN0YXJ0aW5nIHdpdGggdGhlIHByZWZlcnJlZCBkZXB0aHMuXG4gICAgbGV0IHByZWZlcnJlZFRhcmdldEluZGV4ID0gdGFyZ2V0RGVwdGhzLmluZGV4T2YocHJlZmVycmVkVGFyZ2V0KTtcbiAgICBsZXQgbGVmdE5vZGVzID0gW10sIHByZWZlcnJlZERlcHRoID0gc2xpY2Uub3BlblN0YXJ0O1xuICAgIGZvciAobGV0IGNvbnRlbnQgPSBzbGljZS5jb250ZW50LCBpID0gMDs7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IGNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgbGVmdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChpID09IHNsaWNlLm9wZW5TdGFydClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjb250ZW50ID0gbm9kZS5jb250ZW50O1xuICAgIH1cbiAgICAvLyBCYWNrIHVwIHByZWZlcnJlZERlcHRoIHRvIGNvdmVyIGRlZmluaW5nIHRleHRibG9ja3MgZGlyZWN0bHlcbiAgICAvLyBhYm92ZSBpdCwgcG9zc2libHkgc2tpcHBpbmcgYSBub24tZGVmaW5pbmcgdGV4dGJsb2NrLlxuICAgIGZvciAobGV0IGQgPSBwcmVmZXJyZWREZXB0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBsZWZ0Tm9kZSA9IGxlZnROb2Rlc1tkXSwgZGVmID0gZGVmaW5lc0NvbnRlbnQobGVmdE5vZGUudHlwZSk7XG4gICAgICAgIGlmIChkZWYgJiYgIWxlZnROb2RlLnNhbWVNYXJrdXAoJGZyb20ubm9kZShNYXRoLmFicyhwcmVmZXJyZWRUYXJnZXQpIC0gMSkpKVxuICAgICAgICAgICAgcHJlZmVycmVkRGVwdGggPSBkO1xuICAgICAgICBlbHNlIGlmIChkZWYgfHwgIWxlZnROb2RlLnR5cGUuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IHNsaWNlLm9wZW5TdGFydDsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgbGV0IG9wZW5EZXB0aCA9IChqICsgcHJlZmVycmVkRGVwdGggKyAxKSAlIChzbGljZS5vcGVuU3RhcnQgKyAxKTtcbiAgICAgICAgbGV0IGluc2VydCA9IGxlZnROb2Rlc1tvcGVuRGVwdGhdO1xuICAgICAgICBpZiAoIWluc2VydClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldERlcHRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHBvc3NpYmxlIGV4cGFuc2lvbiBsZXZlbHMsIHN0YXJ0aW5nIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBwcmVmZXJyZWQgb25lXG4gICAgICAgICAgICBsZXQgdGFyZ2V0RGVwdGggPSB0YXJnZXREZXB0aHNbKGkgKyBwcmVmZXJyZWRUYXJnZXRJbmRleCkgJSB0YXJnZXREZXB0aHMubGVuZ3RoXSwgZXhwYW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0YXJnZXREZXB0aCA8IDApIHtcbiAgICAgICAgICAgICAgICBleHBhbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0YXJnZXREZXB0aCA9IC10YXJnZXREZXB0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5ub2RlKHRhcmdldERlcHRoIC0gMSksIGluZGV4ID0gJGZyb20uaW5kZXgodGFyZ2V0RGVwdGggLSAxKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBpbnNlcnQudHlwZSwgaW5zZXJ0Lm1hcmtzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHIucmVwbGFjZSgkZnJvbS5iZWZvcmUodGFyZ2V0RGVwdGgpLCBleHBhbmQgPyAkdG8uYWZ0ZXIodGFyZ2V0RGVwdGgpIDogdG8sIG5ldyBTbGljZShjbG9zZUZyYWdtZW50KHNsaWNlLmNvbnRlbnQsIDAsIHNsaWNlLm9wZW5TdGFydCwgb3BlbkRlcHRoKSwgb3BlbkRlcHRoLCBzbGljZS5vcGVuRW5kKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0YXJ0U3RlcHMgPSB0ci5zdGVwcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IHRhcmdldERlcHRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0ci5yZXBsYWNlKGZyb20sIHRvLCBzbGljZSk7XG4gICAgICAgIGlmICh0ci5zdGVwcy5sZW5ndGggPiBzdGFydFN0ZXBzKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBkZXB0aCA9IHRhcmdldERlcHRoc1tpXTtcbiAgICAgICAgaWYgKGRlcHRoIDwgMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmcm9tID0gJGZyb20uYmVmb3JlKGRlcHRoKTtcbiAgICAgICAgdG8gPSAkdG8uYWZ0ZXIoZGVwdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsb3NlRnJhZ21lbnQoZnJhZ21lbnQsIGRlcHRoLCBvbGRPcGVuLCBuZXdPcGVuLCBwYXJlbnQpIHtcbiAgICBpZiAoZGVwdGggPCBvbGRPcGVuKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQucmVwbGFjZUNoaWxkKDAsIGZpcnN0LmNvcHkoY2xvc2VGcmFnbWVudChmaXJzdC5jb250ZW50LCBkZXB0aCArIDEsIG9sZE9wZW4sIG5ld09wZW4sIGZpcnN0KSkpO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPiBuZXdPcGVuKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdCgwKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gbWF0Y2guZmlsbEJlZm9yZShmcmFnbWVudCkuYXBwZW5kKGZyYWdtZW50KTtcbiAgICAgICAgZnJhZ21lbnQgPSBzdGFydC5hcHBlbmQobWF0Y2gubWF0Y2hGcmFnbWVudChzdGFydCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiByZXBsYWNlUmFuZ2VXaXRoKHRyLCBmcm9tLCB0bywgbm9kZSkge1xuICAgIGlmICghbm9kZS5pc0lubGluZSAmJiBmcm9tID09IHRvICYmIHRyLmRvYy5yZXNvbHZlKGZyb20pLnBhcmVudC5jb250ZW50LnNpemUpIHtcbiAgICAgICAgbGV0IHBvaW50ID0gaW5zZXJ0UG9pbnQodHIuZG9jLCBmcm9tLCBub2RlLnR5cGUpO1xuICAgICAgICBpZiAocG9pbnQgIT0gbnVsbClcbiAgICAgICAgICAgIGZyb20gPSB0byA9IHBvaW50O1xuICAgIH1cbiAgICB0ci5yZXBsYWNlUmFuZ2UoZnJvbSwgdG8sIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKG5vZGUpLCAwLCAwKSk7XG59XG5mdW5jdGlvbiBkZWxldGVSYW5nZSh0ciwgZnJvbSwgdG8pIHtcbiAgICBsZXQgJGZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gdHIuZG9jLnJlc29sdmUodG8pO1xuICAgIGxldCBjb3ZlcmVkID0gY292ZXJlZERlcHRocygkZnJvbSwgJHRvKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdmVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRlcHRoID0gY292ZXJlZFtpXSwgbGFzdCA9IGkgPT0gY292ZXJlZC5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoKGxhc3QgJiYgZGVwdGggPT0gMCkgfHwgJGZyb20ubm9kZShkZXB0aCkudHlwZS5jb250ZW50TWF0Y2gudmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLnN0YXJ0KGRlcHRoKSwgJHRvLmVuZChkZXB0aCkpO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIChsYXN0IHx8ICRmcm9tLm5vZGUoZGVwdGggLSAxKS5jYW5SZXBsYWNlKCRmcm9tLmluZGV4KGRlcHRoIC0gMSksICR0by5pbmRleEFmdGVyKGRlcHRoIC0gMSkpKSlcbiAgICAgICAgICAgIHJldHVybiB0ci5kZWxldGUoJGZyb20uYmVmb3JlKGRlcHRoKSwgJHRvLmFmdGVyKGRlcHRoKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGQgPSAxOyBkIDw9ICRmcm9tLmRlcHRoICYmIGQgPD0gJHRvLmRlcHRoOyBkKyspIHtcbiAgICAgICAgaWYgKGZyb20gLSAkZnJvbS5zdGFydChkKSA9PSAkZnJvbS5kZXB0aCAtIGQgJiYgdG8gPiAkZnJvbS5lbmQoZCkgJiYgJHRvLmVuZChkKSAtIHRvICE9ICR0by5kZXB0aCAtIGQpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLmJlZm9yZShkKSwgdG8pO1xuICAgIH1cbiAgICB0ci5kZWxldGUoZnJvbSwgdG8pO1xufVxuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZGVwdGhzIGZvciB3aGljaCAkZnJvbSAtICR0byBzcGFucyB0aGVcbi8vIHdob2xlIGNvbnRlbnQgb2YgdGhlIG5vZGVzIGF0IHRoYXQgZGVwdGguXG5mdW5jdGlvbiBjb3ZlcmVkRGVwdGhzKCRmcm9tLCAkdG8pIHtcbiAgICBsZXQgcmVzdWx0ID0gW10sIG1pbkRlcHRoID0gTWF0aC5taW4oJGZyb20uZGVwdGgsICR0by5kZXB0aCk7XG4gICAgZm9yIChsZXQgZCA9IG1pbkRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5zdGFydChkKTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgJGZyb20ucG9zIC0gKCRmcm9tLmRlcHRoIC0gZCkgfHxcbiAgICAgICAgICAgICR0by5lbmQoZCkgPiAkdG8ucG9zICsgKCR0by5kZXB0aCAtIGQpIHx8XG4gICAgICAgICAgICAkZnJvbS5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcgfHxcbiAgICAgICAgICAgICR0by5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHN0YXJ0ID09ICR0by5zdGFydChkKSB8fFxuICAgICAgICAgICAgKGQgPT0gJGZyb20uZGVwdGggJiYgZCA9PSAkdG8uZGVwdGggJiYgJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQgJiYgJHRvLnBhcmVudC5pbmxpbmVDb250ZW50ICYmXG4gICAgICAgICAgICAgICAgZCAmJiAkdG8uc3RhcnQoZCAtIDEpID09IHN0YXJ0IC0gMSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaChkKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5VcGRhdGUgYW4gYXR0cmlidXRlIGluIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBBdHRyU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhbiBhdHRyaWJ1dGUgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxuICAgICovXG4gICAgYXR0ciwgXG4gICAgLy8gVGhlIGF0dHJpYnV0ZSdzIG5ldyB2YWx1ZS5cbiAgICB2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5hdHRyID0gYXR0cjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgYXR0cmlidXRlIHN0ZXAncyBwb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBub2RlLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBub2RlLmF0dHJzW25hbWVdO1xuICAgICAgICBhdHRyc1t0aGlzLmF0dHJdID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBub2RlLnR5cGUuY3JlYXRlKGF0dHJzLCBudWxsLCBub2RlLm1hcmtzKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLnBvcywgdGhpcy5wb3MgKyAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKSwgMCwgbm9kZS5pc0xlYWYgPyAwIDogMSkpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXR0clN0ZXAodGhpcy5wb3MsIHRoaXMuYXR0ciwgZG9jLm5vZGVBdCh0aGlzLnBvcykuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnBvcywgMSk7XG4gICAgICAgIHJldHVybiBwb3MuZGVsZXRlZEFmdGVyID8gbnVsbCA6IG5ldyBBdHRyU3RlcChwb3MucG9zLCB0aGlzLmF0dHIsIHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImF0dHJcIiwgcG9zOiB0aGlzLnBvcywgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEF0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJTdGVwKGpzb24ucG9zLCBqc29uLmF0dHIsIGpzb24udmFsdWUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYXR0clwiLCBBdHRyU3RlcCk7XG4vKipcblVwZGF0ZSBhbiBhdHRyaWJ1dGUgaW4gdGhlIGRvYyBub2RlLlxuKi9cbmNsYXNzIERvY0F0dHJTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGFuIGF0dHJpYnV0ZSBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGF0dHJpYnV0ZSB0byBzZXQuXG4gICAgKi9cbiAgICBhdHRyLCBcbiAgICAvLyBUaGUgYXR0cmlidXRlJ3MgbmV3IHZhbHVlLlxuICAgIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gZG9jLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBkb2MuYXR0cnNbbmFtZV07XG4gICAgICAgIGF0dHJzW3RoaXMuYXR0cl0gPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGRvYy50eXBlLmNyZWF0ZShhdHRycywgZG9jLmNvbnRlbnQsIGRvYy5tYXJrcyk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0Lm9rKHVwZGF0ZWQpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRG9jQXR0clN0ZXAodGhpcy5hdHRyLCBkb2MuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImRvY0F0dHJcIiwgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIERvY0F0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IERvY0F0dHJTdGVwKGpzb24uYXR0ciwganNvbi52YWx1ZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJkb2NBdHRyXCIsIERvY0F0dHJTdGVwKTtcblxuLyoqXG5AaW50ZXJuYWxcbiovXG5sZXQgVHJhbnNmb3JtRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbn07XG5UcmFuc2Zvcm1FcnJvciA9IGZ1bmN0aW9uIFRyYW5zZm9ybUVycm9yKG1lc3NhZ2UpIHtcbiAgICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgICBlcnIuX19wcm90b19fID0gVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlO1xuICAgIHJldHVybiBlcnI7XG59O1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHJhbnNmb3JtRXJyb3I7XG5UcmFuc2Zvcm1FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiVHJhbnNmb3JtRXJyb3JcIjtcbi8qKlxuQWJzdHJhY3Rpb24gdG8gYnVpbGQgdXAgYW5kIHRyYWNrIGFuIGFycmF5IG9mXG5bc3RlcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcCkgcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgdHJhbnNmb3JtYXRpb24uXG5cbk1vc3QgdHJhbnNmb3JtaW5nIG1ldGhvZHMgcmV0dXJuIHRoZSBgVHJhbnNmb3JtYCBvYmplY3QgaXRzZWxmLCBzb1xudGhhdCB0aGV5IGNhbiBiZSBjaGFpbmVkLlxuKi9cbmNsYXNzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdHJhbnNmb3JtIHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQgKHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zZm9ybSkuXG4gICAgKi9cbiAgICBkb2MpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RlcHMgaW4gdGhpcyB0cmFuc2Zvcm0uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBkb2N1bWVudHMgYmVmb3JlIGVhY2ggb2YgdGhlIHN0ZXBzLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRvY3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEEgbWFwcGluZyB3aXRoIHRoZSBtYXBzIGZvciBlYWNoIG9mIHRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zZm9ybS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydGluZyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBiZWZvcmUoKSB7IHJldHVybiB0aGlzLmRvY3MubGVuZ3RoID8gdGhpcy5kb2NzWzBdIDogdGhpcy5kb2M7IH1cbiAgICAvKipcbiAgICBBcHBseSBhIG5ldyBzdGVwIGluIHRoaXMgdHJhbnNmb3JtLCBzYXZpbmcgdGhlIHJlc3VsdC4gVGhyb3dzIGFuXG4gICAgZXJyb3Igd2hlbiB0aGUgc3RlcCBmYWlscy5cbiAgICAqL1xuICAgIHN0ZXAoc3RlcCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5tYXliZVN0ZXAoc3RlcCk7XG4gICAgICAgIGlmIChyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybUVycm9yKHJlc3VsdC5mYWlsZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIGFwcGx5IGEgc3RlcCBpbiB0aGlzIHRyYW5zZm9ybWF0aW9uLCBpZ25vcmluZyBpdCBpZiBpdFxuICAgIGZhaWxzLiBSZXR1cm5zIHRoZSBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIG1heWJlU3RlcChzdGVwKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgICAgaWYgKCFyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhpcy5hZGRTdGVwKHN0ZXAsIHJlc3VsdC5kb2MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQgKHdoZW4gdGhlcmUgYXJlIGFueVxuICAgIHN0ZXBzKS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZFN0ZXAoc3RlcCwgZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jcy5wdXNoKHRoaXMuZG9jKTtcbiAgICAgICAgdGhpcy5zdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICB0aGlzLm1hcHBpbmcuYXBwZW5kTWFwKHN0ZXAuZ2V0TWFwKCkpO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2Agd2l0aCB0aGVcbiAgICBnaXZlbiBgc2xpY2VgLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0byA9IGZyb20sIHNsaWNlID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgbGV0IHN0ZXAgPSByZXBsYWNlU3RlcCh0aGlzLmRvYywgZnJvbSwgdG8sIHNsaWNlKTtcbiAgICAgICAgaWYgKHN0ZXApXG4gICAgICAgICAgICB0aGlzLnN0ZXAoc3RlcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBnaXZlbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCB3aGljaCBtYXkgYmUgYVxuICAgIGZyYWdtZW50LCBub2RlLCBvciBhcnJheSBvZiBub2Rlcy5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKGZyb20sIHRvLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoZnJvbSwgdG8sIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGNvbnRlbnQpLCAwLCAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBkZWxldGUoZnJvbSwgdG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShmcm9tLCB0bywgU2xpY2UuZW1wdHkpO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnNlcnQgdGhlIGdpdmVuIGNvbnRlbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgaW5zZXJ0KHBvcywgY29udGVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChwb3MsIHBvcywgY29udGVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIHNsaWNlLCB1c2luZ1xuICAgIGBmcm9tYCwgYHRvYCwgYW5kIHRoZSBzbGljZSdzXG4gICAgW2BvcGVuU3RhcnRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2xpY2Uub3BlblN0YXJ0KSBwcm9wZXJ0eSBhcyBoaW50cywgcmF0aGVyXG4gICAgdGhhbiBmaXhlZCBzdGFydCBhbmQgZW5kIHBvaW50cy4gVGhpcyBtZXRob2QgbWF5IGdyb3cgdGhlXG4gICAgcmVwbGFjZWQgYXJlYSBvciBjbG9zZSBvcGVuIG5vZGVzIGluIHRoZSBzbGljZSBpbiBvcmRlciB0byBnZXQgYVxuICAgIGZpdCB0aGF0IGlzIG1vcmUgaW4gbGluZSB3aXRoIFdZU0lXWUcgZXhwZWN0YXRpb25zLCBieSBkcm9wcGluZ1xuICAgIGZ1bGx5IGNvdmVyZWQgcGFyZW50IG5vZGVzIG9mIHRoZSByZXBsYWNlZCByZWdpb24gd2hlbiB0aGV5IGFyZVxuICAgIG1hcmtlZCBbbm9uLWRlZmluaW5nIGFzXG4gICAgY29udGV4dF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmRlZmluaW5nQXNDb250ZXh0KSwgb3IgaW5jbHVkaW5nIGFuXG4gICAgb3BlbiBwYXJlbnQgbm9kZSBmcm9tIHRoZSBzbGljZSB0aGF0IF9pc18gbWFya2VkIGFzIFtkZWZpbmluZ1xuICAgIGl0cyBjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuZGVmaW5pbmdGb3JDb250ZW50KS5cbiAgICBcbiAgICBUaGlzIGlzIHRoZSBtZXRob2QsIGZvciBleGFtcGxlLCB0byBoYW5kbGUgcGFzdGUuIFRoZSBzaW1pbGFyXG4gICAgW2ByZXBsYWNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5UcmFuc2Zvcm0ucmVwbGFjZSkgbWV0aG9kIGlzIGEgbW9yZVxuICAgIHByaW1pdGl2ZSB0b29sIHdoaWNoIHdpbGwgX25vdF8gbW92ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiBpdHMgZ2l2ZW5cbiAgICByYW5nZSwgYW5kIGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIG1vcmUgcHJlY2lzZVxuICAgIGNvbnRyb2wgb3ZlciB3aGF0IGhhcHBlbnMuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2UoZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBmcm9tLCB0bywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aCBhIG5vZGUsIGJ1dCB1c2UgYGZyb21gIGFuZCBgdG9gIGFzXG4gICAgaGludHMsIHJhdGhlciB0aGFuIHByZWNpc2UgcG9zaXRpb25zLiBXaGVuIGZyb20gYW5kIHRvIGFyZSB0aGUgc2FtZVxuICAgIGFuZCBhcmUgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIHBhcmVudCBub2RlIGluIHdoaWNoIHRoZSBnaXZlblxuICAgIG5vZGUgZG9lc24ndCBmaXQsIHRoaXMgbWV0aG9kIG1heSBfbW92ZV8gdGhlbSBvdXQgdG93YXJkcyBhIHBhcmVudFxuICAgIHRoYXQgZG9lcyBhbGxvdyB0aGUgZ2l2ZW4gbm9kZSB0byBiZSBwbGFjZWQuIFdoZW4gdGhlIGdpdmVuIHJhbmdlXG4gICAgY29tcGxldGVseSBjb3ZlcnMgYSBwYXJlbnQgbm9kZSwgdGhpcyBtZXRob2QgbWF5IGNvbXBsZXRlbHkgcmVwbGFjZVxuICAgIHRoYXQgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBub2RlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZVdpdGgodGhpcywgZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVsZXRlIHRoZSBnaXZlbiByYW5nZSwgZXhwYW5kaW5nIGl0IHRvIGNvdmVyIGZ1bGx5IGNvdmVyZWRcbiAgICBwYXJlbnQgbm9kZXMgdW50aWwgYSB2YWxpZCByZXBsYWNlIGlzIGZvdW5kLlxuICAgICovXG4gICAgZGVsZXRlUmFuZ2UoZnJvbSwgdG8pIHtcbiAgICAgICAgZGVsZXRlUmFuZ2UodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU3BsaXQgdGhlIGNvbnRlbnQgaW4gdGhlIGdpdmVuIHJhbmdlIG9mZiBmcm9tIGl0cyBwYXJlbnQsIGlmIHRoZXJlXG4gICAgaXMgc2libGluZyBjb250ZW50IGJlZm9yZSBvciBhZnRlciBpdCwgYW5kIG1vdmUgaXQgdXAgdGhlIHRyZWUgdG9cbiAgICB0aGUgZGVwdGggc3BlY2lmaWVkIGJ5IGB0YXJnZXRgLiBZb3UnbGwgcHJvYmFibHkgd2FudCB0byB1c2VcbiAgICBbYGxpZnRUYXJnZXRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmxpZnRUYXJnZXQpIHRvIGNvbXB1dGUgYHRhcmdldGAsIHRvIG1ha2VcbiAgICBzdXJlIHRoZSBsaWZ0IGlzIHZhbGlkLlxuICAgICovXG4gICAgbGlmdChyYW5nZSwgdGFyZ2V0KSB7XG4gICAgICAgIGxpZnQodGhpcywgcmFuZ2UsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIHRoZSBibG9ja3MgYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi4gSWYgZGVwdGggaXMgMiwgdGhlaXJcbiAgICBsYXN0IGFuZCBmaXJzdCBzaWJsaW5ncyBhcmUgYWxzbyBqb2luZWQsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIGpvaW4ocG9zLCBkZXB0aCA9IDEpIHtcbiAgICAgICAgam9pbih0aGlzLCBwb3MsIGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFdyYXAgdGhlIGdpdmVuIFtyYW5nZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVSYW5nZSkgaW4gdGhlIGdpdmVuIHNldCBvZiB3cmFwcGVycy5cbiAgICBUaGUgd3JhcHBlcnMgYXJlIGFzc3VtZWQgdG8gYmUgdmFsaWQgaW4gdGhpcyBwb3NpdGlvbiwgYW5kIHNob3VsZFxuICAgIHByb2JhYmx5IGJlIGNvbXB1dGVkIHdpdGggW2BmaW5kV3JhcHBpbmdgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmZpbmRXcmFwcGluZykuXG4gICAgKi9cbiAgICB3cmFwKHJhbmdlLCB3cmFwcGVycykge1xuICAgICAgICB3cmFwKHRoaXMsIHJhbmdlLCB3cmFwcGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHR5cGUgb2YgYWxsIHRleHRibG9ja3MgKHBhcnRseSkgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgdG9cbiAgICB0aGUgZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBzZXRCbG9ja1R5cGUoZnJvbSwgdG8gPSBmcm9tLCB0eXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICAgICAgc2V0QmxvY2tUeXBlKHRoaXMsIGZyb20sIHRvLCB0eXBlLCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGFuZ2UgdGhlIHR5cGUsIGF0dHJpYnV0ZXMsIGFuZC9vciBtYXJrcyBvZiB0aGUgbm9kZSBhdCBgcG9zYC5cbiAgICBXaGVuIGB0eXBlYCBpc24ndCBnaXZlbiwgdGhlIGV4aXN0aW5nIG5vZGUgdHlwZSBpcyBwcmVzZXJ2ZWQsXG4gICAgKi9cbiAgICBzZXROb2RlTWFya3VwKHBvcywgdHlwZSwgYXR0cnMgPSBudWxsLCBtYXJrcykge1xuICAgICAgICBzZXROb2RlTWFya3VwKHRoaXMsIHBvcywgdHlwZSwgYXR0cnMsIG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCBhIHNpbmdsZSBhdHRyaWJ1dGUgb24gYSBnaXZlbiBub2RlIHRvIGEgbmV3IHZhbHVlLlxuICAgIFRoZSBgcG9zYCBhZGRyZXNzZXMgdGhlIGRvY3VtZW50IGNvbnRlbnQuIFVzZSBgc2V0RG9jQXR0cmlidXRlYFxuICAgIHRvIHNldCBhdHRyaWJ1dGVzIG9uIHRoZSBkb2N1bWVudCBpdHNlbGYuXG4gICAgKi9cbiAgICBzZXROb2RlQXR0cmlidXRlKHBvcywgYXR0ciwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdGVwKG5ldyBBdHRyU3RlcChwb3MsIGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgYSBzaW5nbGUgYXR0cmlidXRlIG9uIHRoZSBkb2N1bWVudCB0byBhIG5ldyB2YWx1ZS5cbiAgICAqL1xuICAgIHNldERvY0F0dHJpYnV0ZShhdHRyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnN0ZXAobmV3IERvY0F0dHJTdGVwKGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBtYXJrIHRvIHRoZSBub2RlIGF0IHBvc2l0aW9uIGBwb3NgLlxuICAgICovXG4gICAgYWRkTm9kZU1hcmsocG9zLCBtYXJrKSB7XG4gICAgICAgIHRoaXMuc3RlcChuZXcgQWRkTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayAob3IgYSBtYXJrIG9mIHRoZSBnaXZlbiB0eXBlKSBmcm9tIHRoZSBub2RlIGF0XG4gICAgcG9zaXRpb24gYHBvc2AuXG4gICAgKi9cbiAgICByZW1vdmVOb2RlTWFyayhwb3MsIG1hcmspIHtcbiAgICAgICAgaWYgKCEobWFyayBpbnN0YW5jZW9mIE1hcmspKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuZG9jLm5vZGVBdChwb3MpO1xuICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhdCBwb3NpdGlvbiBcIiArIHBvcyk7XG4gICAgICAgICAgICBtYXJrID0gbWFyay5pc0luU2V0KG5vZGUubWFya3MpO1xuICAgICAgICAgICAgaWYgKCFtYXJrKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcChuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU3BsaXQgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhbmQgb3B0aW9uYWxseSwgaWYgYGRlcHRoYCBpc1xuICAgIGdyZWF0ZXIgdGhhbiBvbmUsIGFueSBudW1iZXIgb2Ygbm9kZXMgYWJvdmUgdGhhdC4gQnkgZGVmYXVsdCwgdGhlXG4gICAgcGFydHMgc3BsaXQgb2ZmIHdpbGwgaW5oZXJpdCB0aGUgbm9kZSB0eXBlIG9mIHRoZSBvcmlnaW5hbCBub2RlLlxuICAgIFRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgcGFzc2luZyBhbiBhcnJheSBvZiB0eXBlcyBhbmQgYXR0cmlidXRlcyB0b1xuICAgIHVzZSBhZnRlciB0aGUgc3BsaXQuXG4gICAgKi9cbiAgICBzcGxpdChwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgICAgICBzcGxpdCh0aGlzLCBwb3MsIGRlcHRoLCB0eXBlc0FmdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG4gICAgKi9cbiAgICBhZGRNYXJrKGZyb20sIHRvLCBtYXJrKSB7XG4gICAgICAgIGFkZE1hcmsodGhpcywgZnJvbSwgdG8sIG1hcmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIG1hcmtzIGZyb20gaW5saW5lIG5vZGVzIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYG1hcmtgIGlzIGEgc2luZ2xlIG1hcmssIHJlbW92ZSBwcmVjaXNlbHkgdGhhdCBtYXJrLiBXaGVuIGl0IGlzXG4gICAgYSBtYXJrIHR5cGUsIHJlbW92ZSBhbGwgbWFya3Mgb2YgdGhhdCB0eXBlLiBXaGVuIGl0IGlzIG51bGwsXG4gICAgcmVtb3ZlIGFsbCBtYXJrcyBvZiBhbnkgdHlwZS5cbiAgICAqL1xuICAgIHJlbW92ZU1hcmsoZnJvbSwgdG8sIG1hcmspIHtcbiAgICAgICAgcmVtb3ZlTWFyayh0aGlzLCBmcm9tLCB0bywgbWFyayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIGFsbCBtYXJrcyBhbmQgbm9kZXMgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSBhdFxuICAgIGBwb3NgIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGdpdmVuIG5ldyBwYXJlbnQgbm9kZSB0eXBlLiBBY2NlcHRzXG4gICAgYW4gb3B0aW9uYWwgc3RhcnRpbmcgW2NvbnRlbnQgbWF0Y2hdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Db250ZW50TWF0Y2gpIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBjbGVhckluY29tcGF0aWJsZShwb3MsIHBhcmVudFR5cGUsIG1hdGNoKSB7XG4gICAgICAgIGNsZWFySW5jb21wYXRpYmxlKHRoaXMsIHBvcywgcGFyZW50VHlwZSwgbWF0Y2gpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IEFkZE1hcmtTdGVwLCBBZGROb2RlTWFya1N0ZXAsIEF0dHJTdGVwLCBEb2NBdHRyU3RlcCwgTWFwUmVzdWx0LCBNYXBwaW5nLCBSZW1vdmVNYXJrU3RlcCwgUmVtb3ZlTm9kZU1hcmtTdGVwLCBSZXBsYWNlQXJvdW5kU3RlcCwgUmVwbGFjZVN0ZXAsIFN0ZXAsIFN0ZXBNYXAsIFN0ZXBSZXN1bHQsIFRyYW5zZm9ybSwgVHJhbnNmb3JtRXJyb3IsIGNhbkpvaW4sIGNhblNwbGl0LCBkcm9wUG9pbnQsIGZpbmRXcmFwcGluZywgaW5zZXJ0UG9pbnQsIGpvaW5Qb2ludCwgbGlmdFRhcmdldCwgcmVwbGFjZVN0ZXAgfTtcbiIsICJpbXBvcnQgeyBTbGljZSwgRnJhZ21lbnQsIE1hcmssIE5vZGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBSZXBsYWNlU3RlcCwgUmVwbGFjZUFyb3VuZFN0ZXAsIFRyYW5zZm9ybSB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbmNvbnN0IGNsYXNzZXNCeUlkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuU3VwZXJjbGFzcyBmb3IgZWRpdG9yIHNlbGVjdGlvbnMuIEV2ZXJ5IHNlbGVjdGlvbiB0eXBlIHNob3VsZFxuZXh0ZW5kIHRoaXMuIFNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuKi9cbmNsYXNzIFNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgSW5pdGlhbGl6ZSBhIHNlbGVjdGlvbiB3aXRoIHRoZSBoZWFkIGFuZCBhbmNob3IgYW5kIHJhbmdlcy4gSWYgbm9cbiAgICByYW5nZXMgYXJlIGdpdmVuLCBjb25zdHJ1Y3RzIGEgc2luZ2xlIHJhbmdlIGFjcm9zcyBgJGFuY2hvcmAgYW5kXG4gICAgYCRoZWFkYC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCBhbmNob3Igb2YgdGhlIHNlbGVjdGlvbiAodGhlIHNpZGUgdGhhdCBzdGF5cyBpblxuICAgIHBsYWNlIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBtb2RpZmllZCkuXG4gICAgKi9cbiAgICAkYW5jaG9yLCBcbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgaGVhZCBvZiB0aGUgc2VsZWN0aW9uICh0aGUgc2lkZSB0aGF0IG1vdmVzIHdoZW5cbiAgICB0aGUgc2VsZWN0aW9uIGlzIG1vZGlmaWVkKS5cbiAgICAqL1xuICAgICRoZWFkLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy4kYW5jaG9yID0gJGFuY2hvcjtcbiAgICAgICAgdGhpcy4kaGVhZCA9ICRoZWFkO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcyB8fCBbbmV3IFNlbGVjdGlvblJhbmdlKCRhbmNob3IubWluKCRoZWFkKSwgJGFuY2hvci5tYXgoJGhlYWQpKV07XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBhbmNob3IsIGFzIGFuIHVucmVzb2x2ZWQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy4kYW5jaG9yLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBoZWFkLlxuICAgICovXG4gICAgZ2V0IGhlYWQoKSB7IHJldHVybiB0aGlzLiRoZWFkLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy4kZnJvbS5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHNlbGVjdGlvbidzIG1haW4gcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLiR0by5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgbG93ZXIgIGJvdW5kIG9mIHRoZSBzZWxlY3Rpb24ncyBtYWluIHJhbmdlLlxuICAgICovXG4gICAgZ2V0ICRmcm9tKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbMF0uJGZyb207XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCB1cHBlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCAkdG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlc1swXS4kdG87XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgYW55IGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocmFuZ2VzW2ldLiRmcm9tLnBvcyAhPSByYW5nZXNbaV0uJHRvLnBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBzZWxlY3Rpb24gYXMgYSBzbGljZS5cbiAgICAqL1xuICAgIGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRmcm9tLmRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8sIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBhIHNsaWNlIG9yLCBpZiBubyBzbGljZSBpcyBnaXZlbixcbiAgICBkZWxldGUgdGhlIHNlbGVjdGlvbi4gV2lsbCBhcHBlbmQgdG8gdGhlIGdpdmVuIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgIC8vIFB1dCB0aGUgbmV3IHNlbGVjdGlvbiBhdCB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIGluc2VydGVkXG4gICAgICAgIC8vIGNvbnRlbnQuIFdoZW4gdGhhdCBlbmRlZCBpbiBhbiBpbmxpbmUgbm9kZSwgc2VhcmNoIGJhY2t3YXJkcyxcbiAgICAgICAgLy8gdG8gZ2V0IHRoZSBwb3NpdGlvbiBhZnRlciB0aGF0IG5vZGUuIElmIG5vdCwgc2VhcmNoIGZvcndhcmQuXG4gICAgICAgIGxldCBsYXN0Tm9kZSA9IGNvbnRlbnQuY29udGVudC5sYXN0Q2hpbGQsIGxhc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQub3BlbkVuZDsgaSsrKSB7XG4gICAgICAgICAgICBsYXN0UGFyZW50ID0gbGFzdE5vZGU7XG4gICAgICAgICAgICBsYXN0Tm9kZSA9IGxhc3ROb2RlLmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aCwgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV0sIG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgdHIucmVwbGFjZVJhbmdlKG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIG1hcHBpbmcubWFwKCR0by5wb3MpLCBpID8gU2xpY2UuZW1wdHkgOiBjb250ZW50KTtcbiAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQodHIsIG1hcEZyb20sIChsYXN0Tm9kZSA/IGxhc3ROb2RlLmlzSW5saW5lIDogbGFzdFBhcmVudCAmJiBsYXN0UGFyZW50LmlzVGV4dGJsb2NrKSA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUsIGFwcGVuZGluZyB0aGUgY2hhbmdlc1xuICAgIHRvIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKHRyLCBub2RlKSB7XG4gICAgICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoLCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXSwgbWFwcGluZyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSk7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIHRvID0gbWFwcGluZy5tYXAoJHRvLnBvcyk7XG4gICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgIHRyLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyLnJlcGxhY2VSYW5nZVdpdGgoZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBtYXBGcm9tLCBub2RlLmlzSW5saW5lID8gLTEgOiAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gc3RhcnRpbmcgYXQgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gYW5kIHNlYXJjaGluZyBiYWNrIGlmIGBkaXJgIGlzIG5lZ2F0aXZlLCBhbmQgZm9yd2FyZCBpZlxuICAgIHBvc2l0aXZlLiBXaGVuIGB0ZXh0T25seWAgaXMgdHJ1ZSwgb25seSBjb25zaWRlciBjdXJzb3JcbiAgICBzZWxlY3Rpb25zLiBXaWxsIHJldHVybiBudWxsIHdoZW4gbm8gdmFsaWQgc2VsZWN0aW9uIHBvc2l0aW9uIGlzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEZyb20oJHBvcywgZGlyLCB0ZXh0T25seSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBpbm5lciA9ICRwb3MucGFyZW50LmlubGluZUNvbnRlbnQgPyBuZXcgVGV4dFNlbGVjdGlvbigkcG9zKVxuICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLnBhcmVudCwgJHBvcy5wb3MsICRwb3MuaW5kZXgoKSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgIGlmIChpbm5lcilcbiAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAkcG9zLmRlcHRoIC0gMTsgZGVwdGggPj0gMDsgZGVwdGgtLSkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZGlyIDwgMFxuICAgICAgICAgICAgICAgID8gZmluZFNlbGVjdGlvbkluKCRwb3Mubm9kZSgwKSwgJHBvcy5ub2RlKGRlcHRoKSwgJHBvcy5iZWZvcmUoZGVwdGggKyAxKSwgJHBvcy5pbmRleChkZXB0aCksIGRpciwgdGV4dE9ubHkpXG4gICAgICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLm5vZGUoZGVwdGgpLCAkcG9zLmFmdGVyKGRlcHRoICsgMSksICRwb3MuaW5kZXgoZGVwdGgpICsgMSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gbmVhciB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi4gU2VhcmNoZXMgZm9yd2FyZCBmaXJzdCBieSBkZWZhdWx0LCBidXQgaWYgYGJpYXNgIGlzXG4gICAgbmVnYXRpdmUsIGl0IHdpbGwgc2VhcmNoIGJhY2t3YXJkcyBmaXJzdC5cbiAgICAqL1xuICAgIHN0YXRpYyBuZWFyKCRwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRGcm9tKCRwb3MsIGJpYXMpIHx8IHRoaXMuZmluZEZyb20oJHBvcywgLWJpYXMpIHx8IG5ldyBBbGxTZWxlY3Rpb24oJHBvcy5ub2RlKDApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gY2xvc2VzdCB0byB0aGUgc3RhcnQgb2ZcbiAgICB0aGUgZ2l2ZW4gZG9jdW1lbnQuIFdpbGwgcmV0dXJuIGFuXG4gICAgW2BBbGxTZWxlY3Rpb25gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuQWxsU2VsZWN0aW9uKSBpZiBubyB2YWxpZCBwb3NpdGlvblxuICAgIGV4aXN0cy5cbiAgICAqL1xuICAgIHN0YXRpYyBhdFN0YXJ0KGRvYykge1xuICAgICAgICByZXR1cm4gZmluZFNlbGVjdGlvbkluKGRvYywgZG9jLCAwLCAwLCAxKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGN1cnNvciBvciBsZWFmIG5vZGUgc2VsZWN0aW9uIGNsb3Nlc3QgdG8gdGhlIGVuZCBvZiB0aGVcbiAgICBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBhdEVuZChkb2MpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3Rpb25Jbihkb2MsIGRvYywgZG9jLmNvbnRlbnQuc2l6ZSwgZG9jLmNoaWxkQ291bnQsIC0xKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc2VsZWN0aW9uLiBNdXN0IGJlXG4gICAgaW1wbGVtZW50ZWQgZm9yIGN1c3RvbSBjbGFzc2VzIChhcyBhIHN0YXRpYyBjbGFzcyBtZXRob2QpLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24udHlwZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgY2xzID0gY2xhc3Nlc0J5SWRbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCFjbHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc2VsZWN0aW9uIHR5cGUgJHtqc29uLnR5cGV9IGRlZmluZWRgKTtcbiAgICAgICAgcmV0dXJuIGNscy5mcm9tSlNPTihkb2MsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIGRlc2VyaWFsaXplIHNlbGVjdGlvbnMgZnJvbSBKU09OLCBjdXN0b20gc2VsZWN0aW9uXG4gICAgY2xhc3NlcyBtdXN0IHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBhbiBJRCBzdHJpbmcsIHNvIHRoYXQgdGhleVxuICAgIGNhbiBiZSBkaXNhbWJpZ3VhdGVkLiBUcnkgdG8gcGljayBzb21ldGhpbmcgdGhhdCdzIHVubGlrZWx5IHRvXG4gICAgY2xhc2ggd2l0aCBjbGFzc2VzIGZyb20gb3RoZXIgbW9kdWxlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBqc29uSUQoaWQsIHNlbGVjdGlvbkNsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBjbGFzc2VzQnlJZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRHVwbGljYXRlIHVzZSBvZiBzZWxlY3Rpb24gSlNPTiBJRCBcIiArIGlkKTtcbiAgICAgICAgY2xhc3Nlc0J5SWRbaWRdID0gc2VsZWN0aW9uQ2xhc3M7XG4gICAgICAgIHNlbGVjdGlvbkNsYXNzLnByb3RvdHlwZS5qc29uSUQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkNsYXNzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbYm9va21hcmtdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25Cb29rbWFyaykgZm9yIHRoaXMgc2VsZWN0aW9uLFxuICAgIHdoaWNoIGlzIGEgdmFsdWUgdGhhdCBjYW4gYmUgbWFwcGVkIHdpdGhvdXQgaGF2aW5nIGFjY2VzcyB0byBhXG4gICAgY3VycmVudCBkb2N1bWVudCwgYW5kIGxhdGVyIHJlc29sdmVkIHRvIGEgcmVhbCBzZWxlY3Rpb24gZm9yIGFcbiAgICBnaXZlbiBkb2N1bWVudCBhZ2Fpbi4gKFRoaXMgaXMgdXNlZCBtb3N0bHkgYnkgdGhlIGhpc3RvcnkgdG9cbiAgICB0cmFjayBhbmQgcmVzdG9yZSBvbGQgc2VsZWN0aW9ucy4pIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mXG4gICAgdGhpcyBtZXRob2QganVzdCBjb252ZXJ0cyB0aGUgc2VsZWN0aW9uIHRvIGEgdGV4dCBzZWxlY3Rpb24gYW5kXG4gICAgcmV0dXJucyB0aGUgYm9va21hcmsgZm9yIHRoYXQuXG4gICAgKi9cbiAgICBnZXRCb29rbWFyaygpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbih0aGlzLiRhbmNob3IsIHRoaXMuJGhlYWQpLmdldEJvb2ttYXJrKCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gdHJ1ZTtcbi8qKlxuUmVwcmVzZW50cyBhIHNlbGVjdGVkIHJhbmdlIGluIGEgZG9jdW1lbnQuXG4qL1xuY2xhc3MgU2VsZWN0aW9uUmFuZ2Uge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgICRmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgJHRvKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgfVxufVxubGV0IHdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tUZXh0U2VsZWN0aW9uKCRwb3MpIHtcbiAgICBpZiAoIXdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiAmJiAhJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICB3YXJuZWRBYm91dFRleHRTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBjb25zb2xlW1wid2FyblwiXShcIlRleHRTZWxlY3Rpb24gZW5kcG9pbnQgbm90IHBvaW50aW5nIGludG8gYSBub2RlIHdpdGggaW5saW5lIGNvbnRlbnQgKFwiICsgJHBvcy5wYXJlbnQudHlwZS5uYW1lICsgXCIpXCIpO1xuICAgIH1cbn1cbi8qKlxuQSB0ZXh0IHNlbGVjdGlvbiByZXByZXNlbnRzIGEgY2xhc3NpY2FsIGVkaXRvciBzZWxlY3Rpb24sIHdpdGggYVxuaGVhZCAodGhlIG1vdmluZyBzaWRlKSBhbmQgYW5jaG9yIChpbW1vYmlsZSBzaWRlKSwgYm90aCBvZiB3aGljaFxucG9pbnQgaW50byB0ZXh0YmxvY2sgbm9kZXMuIEl0IGNhbiBiZSBlbXB0eSAoYSByZWd1bGFyIGN1cnNvclxucG9zaXRpb24pLlxuKi9cbmNsYXNzIFRleHRTZWxlY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb24ge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHRleHQgc2VsZWN0aW9uIGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRhbmNob3IsICRoZWFkID0gJGFuY2hvcikge1xuICAgICAgICBjaGVja1RleHRTZWxlY3Rpb24oJGFuY2hvcik7XG4gICAgICAgIGNoZWNrVGV4dFNlbGVjdGlvbigkaGVhZCk7XG4gICAgICAgIHN1cGVyKCRhbmNob3IsICRoZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIHJlc29sdmVkIHBvc2l0aW9uIGlmIHRoaXMgaXMgYSBjdXJzb3Igc2VsZWN0aW9uIChhblxuICAgIGVtcHR5IHRleHQgc2VsZWN0aW9uKSwgYW5kIG51bGwgb3RoZXJ3aXNlLlxuICAgICovXG4gICAgZ2V0ICRjdXJzb3IoKSB7IHJldHVybiB0aGlzLiRhbmNob3IucG9zID09IHRoaXMuJGhlYWQucG9zID8gdGhpcy4kaGVhZCA6IG51bGw7IH1cbiAgICBtYXAoZG9jLCBtYXBwaW5nKSB7XG4gICAgICAgIGxldCAkaGVhZCA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHRoaXMuaGVhZCkpO1xuICAgICAgICBpZiAoISRoZWFkLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5uZWFyKCRoZWFkKTtcbiAgICAgICAgbGV0ICRhbmNob3IgPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcCh0aGlzLmFuY2hvcikpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRhbmNob3IgOiAkaGVhZCwgJGhlYWQpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgc3VwZXIucmVwbGFjZSh0ciwgY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50ID09IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSB0aGlzLiRmcm9tLm1hcmtzQWNyb3NzKHRoaXMuJHRvKTtcbiAgICAgICAgICAgIGlmIChtYXJrcylcbiAgICAgICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhtYXJrcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBvdGhlci5hbmNob3IgPT0gdGhpcy5hbmNob3IgJiYgb3RoZXIuaGVhZCA9PSB0aGlzLmhlYWQ7XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRleHRCb29rbWFyayh0aGlzLmFuY2hvciwgdGhpcy5oZWFkKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcInRleHRcIiwgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uYW5jaG9yICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaGVhZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBUZXh0U2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpLCBkb2MucmVzb2x2ZShqc29uLmhlYWQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGV4dCBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICBsZXQgJGFuY2hvciA9IGRvYy5yZXNvbHZlKGFuY2hvcik7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcygkYW5jaG9yLCBoZWFkID09IGFuY2hvciA/ICRhbmNob3IgOiBkb2MucmVzb2x2ZShoZWFkKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIHRleHQgc2VsZWN0aW9uIHRoYXQgc3BhbnMgdGhlIGdpdmVuIHBvc2l0aW9ucyBvciwgaWZcbiAgICB0aGV5IGFyZW4ndCB0ZXh0IHBvc2l0aW9ucywgZmluZCBhIHRleHQgc2VsZWN0aW9uIG5lYXIgdGhlbS5cbiAgICBgYmlhc2AgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtZXRob2Qgc2VhcmNoZXMgZm9yd2FyZCAoZGVmYXVsdClcbiAgICBvciBiYWNrd2FyZHMgKG5lZ2F0aXZlIG51bWJlcikgZmlyc3QuIFdpbGwgZmFsbCBiYWNrIHRvIGNhbGxpbmdcbiAgICBbYFNlbGVjdGlvbi5uZWFyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbl5uZWFyKSB3aGVuIHRoZSBkb2N1bWVudFxuICAgIGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIHRleHQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcykge1xuICAgICAgICBsZXQgZFBvcyA9ICRhbmNob3IucG9zIC0gJGhlYWQucG9zO1xuICAgICAgICBpZiAoIWJpYXMgfHwgZFBvcylcbiAgICAgICAgICAgIGJpYXMgPSBkUG9zID49IDAgPyAxIDogLTE7XG4gICAgICAgIGlmICghJGhlYWQucGFyZW50LmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IFNlbGVjdGlvbi5maW5kRnJvbSgkaGVhZCwgYmlhcywgdHJ1ZSkgfHwgU2VsZWN0aW9uLmZpbmRGcm9tKCRoZWFkLCAtYmlhcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgJGhlYWQgPSBmb3VuZC4kaGVhZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJGhlYWQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgaWYgKGRQb3MgPT0gMCkge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAkaGVhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAoU2VsZWN0aW9uLmZpbmRGcm9tKCRhbmNob3IsIC1iaWFzLCB0cnVlKSB8fCBTZWxlY3Rpb24uZmluZEZyb20oJGFuY2hvciwgYmlhcywgdHJ1ZSkpLiRhbmNob3I7XG4gICAgICAgICAgICAgICAgaWYgKCgkYW5jaG9yLnBvcyA8ICRoZWFkLnBvcykgIT0gKGRQb3MgPCAwKSlcbiAgICAgICAgICAgICAgICAgICAgJGFuY2hvciA9ICRoZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbigkYW5jaG9yLCAkaGVhZCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLmpzb25JRChcInRleHRcIiwgVGV4dFNlbGVjdGlvbik7XG5jbGFzcyBUZXh0Qm9va21hcmsge1xuICAgIGNvbnN0cnVjdG9yKGFuY2hvciwgaGVhZCkge1xuICAgICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICAgICAgdGhpcy5oZWFkID0gaGVhZDtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Qm9va21hcmsobWFwcGluZy5tYXAodGhpcy5hbmNob3IpLCBtYXBwaW5nLm1hcCh0aGlzLmhlYWQpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbihkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIGRvYy5yZXNvbHZlKHRoaXMuaGVhZCkpO1xuICAgIH1cbn1cbi8qKlxuQSBub2RlIHNlbGVjdGlvbiBpcyBhIHNlbGVjdGlvbiB0aGF0IHBvaW50cyBhdCBhIHNpbmdsZSBub2RlLiBBbGxcbm5vZGVzIG1hcmtlZCBbc2VsZWN0YWJsZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnNlbGVjdGFibGUpIGNhbiBiZSB0aGVcbnRhcmdldCBvZiBhIG5vZGUgc2VsZWN0aW9uLiBJbiBzdWNoIGEgc2VsZWN0aW9uLCBgZnJvbWAgYW5kIGB0b2BcbnBvaW50IGRpcmVjdGx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNlbGVjdGVkIG5vZGUsIGBhbmNob3JgIGVxdWFsc1xuYGZyb21gLCBhbmQgYGhlYWRgIGVxdWFscyBgdG9gLi5cbiovXG5jbGFzcyBOb2RlU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIHNlbGVjdGlvbi4gRG9lcyBub3QgdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBpdHNcbiAgICBhcmd1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRwb3MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgbGV0ICRlbmQgPSAkcG9zLm5vZGUoMCkucmVzb2x2ZSgkcG9zLnBvcyArIG5vZGUubm9kZVNpemUpO1xuICAgICAgICBzdXBlcigkcG9zLCAkZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICBpZiAoZGVsZXRlZClcbiAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKCRwb3MpO1xuICAgIH1cbiAgICBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odGhpcy5ub2RlKSwgMCwgMCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgb3RoZXIuYW5jaG9yID09IHRoaXMuYW5jaG9yO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwibm9kZVwiLCBhbmNob3I6IHRoaXMuYW5jaG9yIH07XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkgeyByZXR1cm4gbmV3IE5vZGVCb29rbWFyayh0aGlzLmFuY2hvcik7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihkb2MsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKGRvYy5yZXNvbHZlKGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIG1heSBiZSBzZWxlY3RlZCBhcyBhIG5vZGVcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgaXNTZWxlY3RhYmxlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICFub2RlLmlzVGV4dCAmJiBub2RlLnR5cGUuc3BlYy5zZWxlY3RhYmxlICE9PSBmYWxzZTtcbiAgICB9XG59XG5Ob2RlU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gZmFsc2U7XG5TZWxlY3Rpb24uanNvbklEKFwibm9kZVwiLCBOb2RlU2VsZWN0aW9uKTtcbmNsYXNzIE5vZGVCb29rbWFyayB7XG4gICAgY29uc3RydWN0b3IoYW5jaG9yKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQgPyBuZXcgVGV4dEJvb2ttYXJrKHBvcywgcG9zKSA6IG5ldyBOb2RlQm9va21hcmsocG9zKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oJHBvcyk7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICB9XG59XG4vKipcbkEgc2VsZWN0aW9uIHR5cGUgdGhhdCByZXByZXNlbnRzIHNlbGVjdGluZyB0aGUgd2hvbGUgZG9jdW1lbnRcbih3aGljaCBjYW4gbm90IG5lY2Vzc2FyaWx5IGJlIGV4cHJlc3NlZCB3aXRoIGEgdGV4dCBzZWxlY3Rpb24sIHdoZW5cbnRoZXJlIGFyZSBmb3IgZXhhbXBsZSBsZWFmIGJsb2NrIG5vZGVzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlXG5kb2N1bWVudCkuXG4qL1xuY2xhc3MgQWxsU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gYWxsLXNlbGVjdGlvbiBvdmVyIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvYykge1xuICAgICAgICBzdXBlcihkb2MucmVzb2x2ZSgwKSwgZG9jLnJlc29sdmUoZG9jLmNvbnRlbnQuc2l6ZSkpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgwLCB0ci5kb2MuY29udGVudC5zaXplKTtcbiAgICAgICAgICAgIGxldCBzZWwgPSBTZWxlY3Rpb24uYXRTdGFydCh0ci5kb2MpO1xuICAgICAgICAgICAgaWYgKCFzZWwuZXEodHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnJlcGxhY2UodHIsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgdHlwZTogXCJhbGxcIiB9OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBtYXAoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb247IH1cbiAgICBnZXRCb29rbWFyaygpIHsgcmV0dXJuIEFsbEJvb2ttYXJrOyB9XG59XG5TZWxlY3Rpb24uanNvbklEKFwiYWxsXCIsIEFsbFNlbGVjdGlvbik7XG5jb25zdCBBbGxCb29rbWFyayA9IHtcbiAgICBtYXAoKSB7IHJldHVybiB0aGlzOyB9LFxuICAgIHJlc29sdmUoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbn07XG4vLyBGSVhNRSB3ZSdsbCBuZWVkIHNvbWUgYXdhcmVuZXNzIG9mIHRleHQgZGlyZWN0aW9uIHdoZW4gc2Nhbm5pbmcgZm9yIHNlbGVjdGlvbnNcbi8vIFRyeSB0byBmaW5kIGEgc2VsZWN0aW9uIGluc2lkZSB0aGUgZ2l2ZW4gbm9kZS4gYHBvc2AgcG9pbnRzIGF0IHRoZVxuLy8gcG9zaXRpb24gd2hlcmUgdGhlIHNlYXJjaCBzdGFydHMuIFdoZW4gYHRleHRgIGlzIHRydWUsIG9ubHkgcmV0dXJuXG4vLyB0ZXh0IHNlbGVjdGlvbnMuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBub2RlLCBwb3MsIGluZGV4LCBkaXIsIHRleHQgPSBmYWxzZSkge1xuICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyk7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4IC0gKGRpciA+IDAgPyAwIDogMSk7IGRpciA+IDAgPyBpIDwgbm9kZS5jaGlsZENvdW50IDogaSA+PSAwOyBpICs9IGRpcikge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpO1xuICAgICAgICBpZiAoIWNoaWxkLmlzQXRvbSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZFNlbGVjdGlvbkluKGRvYywgY2hpbGQsIHBvcyArIGRpciwgZGlyIDwgMCA/IGNoaWxkLmNoaWxkQ291bnQgOiAwLCBkaXIsIHRleHQpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGV4dCAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOb2RlU2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyAtIChkaXIgPCAwID8gY2hpbGQubm9kZVNpemUgOiAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IGNoaWxkLm5vZGVTaXplICogZGlyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBzdGFydExlbiwgYmlhcykge1xuICAgIGxldCBsYXN0ID0gdHIuc3RlcHMubGVuZ3RoIC0gMTtcbiAgICBpZiAobGFzdCA8IHN0YXJ0TGVuKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHN0ZXAgPSB0ci5zdGVwc1tsYXN0XTtcbiAgICBpZiAoIShzdGVwIGluc3RhbmNlb2YgUmVwbGFjZVN0ZXAgfHwgc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VBcm91bmRTdGVwKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBtYXAgPSB0ci5tYXBwaW5nLm1hcHNbbGFzdF0sIGVuZDtcbiAgICBtYXAuZm9yRWFjaCgoX2Zyb20sIF90bywgX25ld0Zyb20sIG5ld1RvKSA9PiB7IGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgZW5kID0gbmV3VG87IH0pO1xuICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShlbmQpLCBiaWFzKSk7XG59XG5cbmNvbnN0IFVQREFURURfU0VMID0gMSwgVVBEQVRFRF9NQVJLUyA9IDIsIFVQREFURURfU0NST0xMID0gNDtcbi8qKlxuQW4gZWRpdG9yIHN0YXRlIHRyYW5zYWN0aW9uLCB3aGljaCBjYW4gYmUgYXBwbGllZCB0byBhIHN0YXRlIHRvXG5jcmVhdGUgYW4gdXBkYXRlZCBzdGF0ZS4gVXNlXG5bYEVkaXRvclN0YXRlLnRyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRyKSB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG5cblRyYW5zYWN0aW9ucyB0cmFjayBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudCAodGhleSBhcmUgYSBzdWJjbGFzcyBvZlxuW2BUcmFuc2Zvcm1gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlRyYW5zZm9ybSkpLCBidXQgYWxzbyBvdGhlciBzdGF0ZSBjaGFuZ2VzLFxubGlrZSBzZWxlY3Rpb24gdXBkYXRlcyBhbmQgYWRqdXN0bWVudHMgb2YgdGhlIHNldCBvZiBbc3RvcmVkXG5tYXJrc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnN0b3JlZE1hcmtzKS4gSW4gYWRkaXRpb24sIHlvdSBjYW4gc3RvcmVcbm1ldGFkYXRhIHByb3BlcnRpZXMgaW4gYSB0cmFuc2FjdGlvbiwgd2hpY2ggYXJlIGV4dHJhIHBpZWNlcyBvZlxuaW5mb3JtYXRpb24gdGhhdCBjbGllbnQgY29kZSBvciBwbHVnaW5zIGNhbiB1c2UgdG8gZGVzY3JpYmUgd2hhdCBhXG50cmFuc2FjdGlvbiByZXByZXNlbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHVwZGF0ZSB0aGVpciBbb3duXG5zdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpIGFjY29yZGluZ2x5LlxuXG5UaGUgW2VkaXRvciB2aWV3XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3KSB1c2VzIGEgZmV3IG1ldGFkYXRhXG5wcm9wZXJ0aWVzOiBpdCB3aWxsIGF0dGFjaCBhIHByb3BlcnR5IGBcInBvaW50ZXJcImAgd2l0aCB0aGUgdmFsdWVcbmB0cnVlYCB0byBzZWxlY3Rpb24gdHJhbnNhY3Rpb25zIGRpcmVjdGx5IGNhdXNlZCBieSBtb3VzZSBvciB0b3VjaFxuaW5wdXQsIGEgYFwiY29tcG9zaXRpb25cImAgcHJvcGVydHkgaG9sZGluZyBhbiBJRCBpZGVudGlmeWluZyB0aGVcbmNvbXBvc2l0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIHRyYW5zYWN0aW9ucyBjYXVzZWQgYnkgY29tcG9zZWQgRE9NXG5pbnB1dCwgYW5kIGEgYFwidWlFdmVudFwiYCBwcm9wZXJ0eSBvZiB0aGF0IG1heSBiZSBgXCJwYXN0ZVwiYCxcbmBcImN1dFwiYCwgb3IgYFwiZHJvcFwiYC5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICBzdXBlcihzdGF0ZS5kb2MpO1xuICAgICAgICAvLyBUaGUgc3RlcCBjb3VudCBmb3Igd2hpY2ggdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIHZhbGlkLlxuICAgICAgICB0aGlzLmN1clNlbGVjdGlvbkZvciA9IDA7XG4gICAgICAgIC8vIEJpdGZpZWxkIHRvIHRyYWNrIHdoaWNoIGFzcGVjdHMgb2YgdGhlIHN0YXRlIHdlcmUgdXBkYXRlZCBieVxuICAgICAgICAvLyB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAgICB0aGlzLnVwZGF0ZWQgPSAwO1xuICAgICAgICAvLyBPYmplY3QgdXNlZCB0byBzdG9yZSBtZXRhZGF0YSBwcm9wZXJ0aWVzIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMubWV0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbidzIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSBlZGl0b3JcbiAgICBzZWxlY3Rpb24gW21hcHBlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbi5tYXApIHRocm91Z2ggdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zYWN0aW9uLCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIHdpdGhcbiAgICBbYHNldFNlbGVjdGlvbmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZXRTZWxlY3Rpb24pLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyU2VsZWN0aW9uRm9yIDwgdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gdGhpcy5jdXJTZWxlY3Rpb24ubWFwKHRoaXMuZG9jLCB0aGlzLm1hcHBpbmcuc2xpY2UodGhpcy5jdXJTZWxlY3Rpb25Gb3IpKTtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyU2VsZWN0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHRyYW5zYWN0aW9uJ3MgY3VycmVudCBzZWxlY3Rpb24uIFdpbGwgZGV0ZXJtaW5lIHRoZVxuICAgIHNlbGVjdGlvbiB0aGF0IHRoZSBlZGl0b3IgZ2V0cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhcHBsaWVkLlxuICAgICovXG4gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikge1xuICAgICAgICBpZiAoc2VsZWN0aW9uLiRmcm9tLmRvYyAhPSB0aGlzLmRvYylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VsZWN0aW9uIHBhc3NlZCB0byBzZXRTZWxlY3Rpb24gbXVzdCBwb2ludCBhdCB0aGUgY3VycmVudCBkb2N1bWVudFwiKTtcbiAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9ICh0aGlzLnVwZGF0ZWQgfCBVUERBVEVEX1NFTCkgJiB+VVBEQVRFRF9NQVJLUztcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gd2FzIGV4cGxpY2l0bHkgdXBkYXRlZCBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvblNldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVwZGF0ZWQgJiBVUERBVEVEX1NFTCkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIGN1cnJlbnQgc3RvcmVkIG1hcmtzLlxuICAgICovXG4gICAgc2V0U3RvcmVkTWFya3MobWFya3MpIHtcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9NQVJLUztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBzdG9yZWQgbWFya3Mgb3IsIGlmIHRoYXQgaXMgbnVsbCwgdGhlIG1hcmtzXG4gICAgYXQgdGhlIHNlbGVjdGlvbiwgbWF0Y2ggdGhlIGdpdmVuIHNldCBvZiBtYXJrcy4gRG9lcyBub3RoaW5nIGlmXG4gICAgdGhpcyBpcyBhbHJlYWR5IHRoZSBjYXNlLlxuICAgICovXG4gICAgZW5zdXJlTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpLCBtYXJrcykpXG4gICAgICAgICAgICB0aGlzLnNldFN0b3JlZE1hcmtzKG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIG1hcmsgdG8gdGhlIHNldCBvZiBzdG9yZWQgbWFya3MuXG4gICAgKi9cbiAgICBhZGRTdG9yZWRNYXJrKG1hcmspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlTWFya3MobWFyay5hZGRUb1NldCh0aGlzLnN0b3JlZE1hcmtzIHx8IHRoaXMuc2VsZWN0aW9uLiRoZWFkLm1hcmtzKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayBvciBtYXJrIHR5cGUgZnJvbSB0aGUgc2V0IG9mIHN0b3JlZCBtYXJrcy5cbiAgICAqL1xuICAgIHJlbW92ZVN0b3JlZE1hcmsobWFyaykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnN1cmVNYXJrcyhtYXJrLnJlbW92ZUZyb21TZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kaGVhZC5tYXJrcygpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0b3JlZCBtYXJrcyB3ZXJlIGV4cGxpY2l0bHkgc2V0IGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHN0b3JlZE1hcmtzU2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudXBkYXRlZCAmIFVQREFURURfTUFSS1MpID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRTdGVwKHN0ZXAsIGRvYykge1xuICAgICAgICBzdXBlci5hZGRTdGVwKHN0ZXAsIGRvYyk7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9IHRoaXMudXBkYXRlZCAmIH5VUERBVEVEX01BUktTO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNldFRpbWUodGltZSkge1xuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gc2xpY2UuXG4gICAgKi9cbiAgICByZXBsYWNlU2VsZWN0aW9uKHNsaWNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UodGhpcywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUuIFdoZW4gYGluaGVyaXRNYXJrc2AgaXNcbiAgICB0cnVlIGFuZCB0aGUgY29udGVudCBpcyBpbmxpbmUsIGl0IGluaGVyaXRzIHRoZSBtYXJrcyBmcm9tIHRoZVxuICAgIHBsYWNlIHdoZXJlIGl0IGlzIGluc2VydGVkLlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbldpdGgobm9kZSwgaW5oZXJpdE1hcmtzID0gdHJ1ZSkge1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGlmIChpbmhlcml0TWFya3MpXG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXJrKHRoaXMuc3RvcmVkTWFya3MgfHwgKHNlbGVjdGlvbi5lbXB0eSA/IHNlbGVjdGlvbi4kZnJvbS5tYXJrcygpIDogKHNlbGVjdGlvbi4kZnJvbS5tYXJrc0Fjcm9zcyhzZWxlY3Rpb24uJHRvKSB8fCBNYXJrLm5vbmUpKSk7XG4gICAgICAgIHNlbGVjdGlvbi5yZXBsYWNlV2l0aCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgc2VsZWN0aW9uLlxuICAgICovXG4gICAgZGVsZXRlU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2UsIG9yIHRoZSBzZWxlY3Rpb24gaWYgbm8gcmFuZ2UgaXMgZ2l2ZW4sXG4gICAgd2l0aCBhIHRleHQgbm9kZSBjb250YWluaW5nIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBpbnNlcnRUZXh0KHRleHQsIGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzY2hlbWEgPSB0aGlzLmRvYy50eXBlLnNjaGVtYTtcbiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVNlbGVjdGlvbldpdGgoc2NoZW1hLnRleHQodGV4dCksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSBmcm9tO1xuICAgICAgICAgICAgdG8gPSB0byA9PSBudWxsID8gZnJvbSA6IHRvO1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IHRoaXMuc3RvcmVkTWFya3M7XG4gICAgICAgICAgICBpZiAoIW1hcmtzKSB7XG4gICAgICAgICAgICAgICAgbGV0ICRmcm9tID0gdGhpcy5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICAgICAgICAgICAgICBtYXJrcyA9IHRvID09IGZyb20gPyAkZnJvbS5tYXJrcygpIDogJGZyb20ubWFya3NBY3Jvc3ModGhpcy5kb2MucmVzb2x2ZSh0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBzY2hlbWEudGV4dCh0ZXh0LCBtYXJrcykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5lbXB0eSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0aGlzLnNlbGVjdGlvbi4kdG8pKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFN0b3JlIGEgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhpcyB0cmFuc2FjdGlvbiwga2V5ZWQgZWl0aGVyIGJ5XG4gICAgbmFtZSBvciBieSBwbHVnaW4uXG4gICAgKi9cbiAgICBzZXRNZXRhKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5tZXRhW3R5cGVvZiBrZXkgPT0gXCJzdHJpbmdcIiA/IGtleSA6IGtleS5rZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSBhIG1ldGFkYXRhIHByb3BlcnR5IGZvciBhIGdpdmVuIG5hbWUgb3IgcGx1Z2luLlxuICAgICovXG4gICAgZ2V0TWV0YShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YVt0eXBlb2Yga2V5ID09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkua2V5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNhY3Rpb24gZG9lc24ndCBjb250YWluIGFueSBtZXRhZGF0YSxcbiAgICBhbmQgY2FuIHRodXMgc2FmZWx5IGJlIGV4dGVuZGVkLlxuICAgICovXG4gICAgZ2V0IGlzR2VuZXJpYygpIHtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLm1ldGEpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZSB0aGF0IHRoZSBlZGl0b3Igc2hvdWxkIHNjcm9sbCB0aGUgc2VsZWN0aW9uIGludG8gdmlld1xuICAgIHdoZW4gdXBkYXRlZCB0byB0aGUgc3RhdGUgcHJvZHVjZWQgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9TQ1JPTEw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB0cmFuc2FjdGlvbiBoYXMgaGFkIGBzY3JvbGxJbnRvVmlld2AgY2FsbGVkIG9uIGl0LlxuICAgICovXG4gICAgZ2V0IHNjcm9sbGVkSW50b1ZpZXcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy51cGRhdGVkICYgVVBEQVRFRF9TQ1JPTEwpID4gMDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmQoZiwgc2VsZikge1xuICAgIHJldHVybiAhc2VsZiB8fCAhZiA/IGYgOiBmLmJpbmQoc2VsZik7XG59XG5jbGFzcyBGaWVsZERlc2Mge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2MsIHNlbGYpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pbml0ID0gYmluZChkZXNjLmluaXQsIHNlbGYpO1xuICAgICAgICB0aGlzLmFwcGx5ID0gYmluZChkZXNjLmFwcGx5LCBzZWxmKTtcbiAgICB9XG59XG5jb25zdCBiYXNlRmllbGRzID0gW1xuICAgIG5ldyBGaWVsZERlc2MoXCJkb2NcIiwge1xuICAgICAgICBpbml0KGNvbmZpZykgeyByZXR1cm4gY29uZmlnLmRvYyB8fCBjb25maWcuc2NoZW1hLnRvcE5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLmRvYzsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzZWxlY3Rpb25cIiwge1xuICAgICAgICBpbml0KGNvbmZpZywgaW5zdGFuY2UpIHsgcmV0dXJuIGNvbmZpZy5zZWxlY3Rpb24gfHwgU2VsZWN0aW9uLmF0U3RhcnQoaW5zdGFuY2UuZG9jKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLnNlbGVjdGlvbjsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzdG9yZWRNYXJrc1wiLCB7XG4gICAgICAgIGluaXQoY29uZmlnKSB7IHJldHVybiBjb25maWcuc3RvcmVkTWFya3MgfHwgbnVsbDsgfSxcbiAgICAgICAgYXBwbHkodHIsIF9tYXJrcywgX29sZCwgc3RhdGUpIHsgcmV0dXJuIHN0YXRlLnNlbGVjdGlvbi4kY3Vyc29yID8gdHIuc3RvcmVkTWFya3MgOiBudWxsOyB9XG4gICAgfSksXG4gICAgbmV3IEZpZWxkRGVzYyhcInNjcm9sbFRvU2VsZWN0aW9uXCIsIHtcbiAgICAgICAgaW5pdCgpIHsgcmV0dXJuIDA7IH0sXG4gICAgICAgIGFwcGx5KHRyLCBwcmV2KSB7IHJldHVybiB0ci5zY3JvbGxlZEludG9WaWV3ID8gcHJldiArIDEgOiBwcmV2OyB9XG4gICAgfSlcbl07XG4vLyBPYmplY3Qgd3JhcHBpbmcgdGhlIHBhcnQgb2YgYSBzdGF0ZSBvYmplY3QgdGhhdCBzdGF5cyB0aGUgc2FtZVxuLy8gYWNyb3NzIHRyYW5zYWN0aW9ucy4gU3RvcmVkIGluIHRoZSBzdGF0ZSdzIGBjb25maWdgIHByb3BlcnR5LlxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBwbHVnaW5zKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5zQnlLZXkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGJhc2VGaWVsZHMuc2xpY2UoKTtcbiAgICAgICAgaWYgKHBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zQnlLZXlbcGx1Z2luLmtleV0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQWRkaW5nIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBrZXllZCBwbHVnaW4gKFwiICsgcGx1Z2luLmtleSArIFwiKVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc0J5S2V5W3BsdWdpbi5rZXldID0gcGx1Z2luO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5zdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHMucHVzaChuZXcgRmllbGREZXNjKHBsdWdpbi5rZXksIHBsdWdpbi5zcGVjLnN0YXRlLCBwbHVnaW4pKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuVGhlIHN0YXRlIG9mIGEgUHJvc2VNaXJyb3IgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IGFuIG9iamVjdCBvZlxudGhpcyB0eXBlLiBBIHN0YXRlIGlzIGEgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZVx1MjAxNGl0IGlzbid0XG51cGRhdGVkLCBidXQgcmF0aGVyIGEgbmV3IHN0YXRlIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gYW4gb2xkIG9uZVxudXNpbmcgdGhlIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIG1ldGhvZC5cblxuQSBzdGF0ZSBob2xkcyBhIG51bWJlciBvZiBidWlsdC1pbiBmaWVsZHMsIGFuZCBwbHVnaW5zIGNhblxuW2RlZmluZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuc3RhdGUpIGFkZGl0aW9uYWwgZmllbGRzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIG9mIHRoZSBzdGF0ZSdzIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnNjaGVtYTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBsdWdpbnMgdGhhdCBhcmUgYWN0aXZlIGluIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnBsdWdpbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB0byBwcm9kdWNlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHkodHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlUcmFuc2FjdGlvbih0cikuc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmlsdGVyVHJhbnNhY3Rpb24odHIsIGlnbm9yZSA9IC0xKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChpICE9IGlnbm9yZSkge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5maWx0ZXJUcmFuc2FjdGlvbiAmJiAhcGx1Z2luLnNwZWMuZmlsdGVyVHJhbnNhY3Rpb24uY2FsbChwbHVnaW4sIHRyLCB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVmVyYm9zZSB2YXJpYW50IG9mIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIHRoYXRcbiAgICByZXR1cm5zIHRoZSBwcmVjaXNlIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgYXBwbGllZCAod2hpY2ggbWlnaHRcbiAgICBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBbdHJhbnNhY3Rpb25cbiAgICBob29rc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuZmlsdGVyVHJhbnNhY3Rpb24pIG9mXG4gICAgcGx1Z2lucykgYWxvbmcgd2l0aCB0aGUgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHlUcmFuc2FjdGlvbihyb290VHIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlclRyYW5zYWN0aW9uKHJvb3RUcikpXG4gICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogdGhpcywgdHJhbnNhY3Rpb25zOiBbXSB9O1xuICAgICAgICBsZXQgdHJzID0gW3Jvb3RUcl0sIG5ld1N0YXRlID0gdGhpcy5hcHBseUlubmVyKHJvb3RUciksIHNlZW4gPSBudWxsO1xuICAgICAgICAvLyBUaGlzIGxvb3AgcmVwZWF0ZWRseSBnaXZlcyBwbHVnaW5zIGEgY2hhbmNlIHRvIHJlc3BvbmQgdG9cbiAgICAgICAgLy8gdHJhbnNhY3Rpb25zIGFzIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGFkZGVkLCBtYWtpbmcgc3VyZSB0byBvbmx5XG4gICAgICAgIC8vIHBhc3MgdGhlIHRyYW5zYWN0aW9ucyB0aGUgcGx1Z2luIGRpZCBub3Qgc2VlIGJlZm9yZS5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGhhdmVOZXcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5hcHBlbmRUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IHNlZW4gPyBzZWVuW2ldLm4gOiAwLCBvbGRTdGF0ZSA9IHNlZW4gPyBzZWVuW2ldLnN0YXRlIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyID0gbiA8IHRycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zcGVjLmFwcGVuZFRyYW5zYWN0aW9uLmNhbGwocGx1Z2luLCBuID8gdHJzLnNsaWNlKG4pIDogdHJzLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHIgJiYgbmV3U3RhdGUuZmlsdGVyVHJhbnNhY3Rpb24odHIsIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiYXBwZW5kZWRUcmFuc2FjdGlvblwiLCByb290VHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGogPCBpID8geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfSA6IHsgc3RhdGU6IHRoaXMsIG46IDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnMucHVzaCh0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IG5ld1N0YXRlLmFwcGx5SW5uZXIodHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZU5ldyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2ldID0geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhdmVOZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IG5ld1N0YXRlLCB0cmFuc2FjdGlvbnM6IHRycyB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYXBwbHlJbm5lcih0cikge1xuICAgICAgICBpZiAoIXRyLmJlZm9yZS5lcSh0aGlzLmRvYykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGEgbWlzbWF0Y2hlZCB0cmFuc2FjdGlvblwiKTtcbiAgICAgICAgbGV0IG5ld0luc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKHRoaXMuY29uZmlnKSwgZmllbGRzID0gdGhpcy5jb25maWcuZmllbGRzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgbmV3SW5zdGFuY2VbZmllbGQubmFtZV0gPSBmaWVsZC5hcHBseSh0ciwgdGhpc1tmaWVsZC5uYW1lXSwgdGhpcywgbmV3SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhcnQgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbikgZnJvbSB0aGlzIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IHRyKCkgeyByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHRoaXMpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcpIHtcbiAgICAgICAgbGV0ICRjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcuZG9jID8gY29uZmlnLmRvYy50eXBlLnNjaGVtYSA6IGNvbmZpZy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKCRjb25maWcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRjb25maWcuZmllbGRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaW5zdGFuY2VbJGNvbmZpZy5maWVsZHNbaV0ubmFtZV0gPSAkY29uZmlnLmZpZWxkc1tpXS5pbml0KGNvbmZpZywgaW5zdGFuY2UpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZSBiYXNlZCBvbiB0aGlzIG9uZSwgYnV0IHdpdGggYW4gYWRqdXN0ZWQgc2V0XG4gICAgb2YgYWN0aXZlIHBsdWdpbnMuIFN0YXRlIGZpZWxkcyB0aGF0IGV4aXN0IGluIGJvdGggc2V0cyBvZlxuICAgIHBsdWdpbnMgYXJlIGtlcHQgdW5jaGFuZ2VkLiBUaG9zZSB0aGF0IG5vIGxvbmdlciBleGlzdCBhcmVcbiAgICBkcm9wcGVkLCBhbmQgdGhvc2UgdGhhdCBhcmUgbmV3IGFyZSBpbml0aWFsaXplZCB1c2luZyB0aGVpclxuICAgIFtgaW5pdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkLmluaXQpIG1ldGhvZCwgcGFzc2luZyBpbiB0aGUgbmV3XG4gICAgY29uZmlndXJhdGlvbiBvYmplY3QuLlxuICAgICovXG4gICAgcmVjb25maWd1cmUoY29uZmlnKSB7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24odGhpcy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICRjb25maWcuZmllbGRzLCBpbnN0YW5jZSA9IG5ldyBFZGl0b3JTdGF0ZSgkY29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gZmllbGRzW2ldLm5hbWU7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IHRoaXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyB0aGlzW25hbWVdIDogZmllbGRzW2ldLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBzdGF0ZSB0byBKU09OLiBJZiB5b3Ugd2FudCB0byBzZXJpYWxpemUgdGhlIHN0YXRlXG4gICAgb2YgcGx1Z2lucywgcGFzcyBhbiBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyB0byB1c2UgaW4gdGhlXG4gICAgcmVzdWx0aW5nIEpTT04gb2JqZWN0IHRvIHBsdWdpbiBvYmplY3RzLiBUaGUgYXJndW1lbnQgbWF5IGFsc28gYmVcbiAgICBhIHN0cmluZyBvciBudW1iZXIsIGluIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZCwgdG8gc3VwcG9ydCB0aGVcbiAgICB3YXkgYEpTT04uc3RyaW5naWZ5YCBjYWxscyBgdG9TdHJpbmdgIG1ldGhvZHMuXG4gICAgKi9cbiAgICB0b0pTT04ocGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRvYzogdGhpcy5kb2MudG9KU09OKCksIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKCkgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVkTWFya3MpXG4gICAgICAgICAgICByZXN1bHQuc3RvcmVkTWFya3MgPSB0aGlzLnN0b3JlZE1hcmtzLm1hcChtID0+IG0udG9KU09OKCkpO1xuICAgICAgICBpZiAocGx1Z2luRmllbGRzICYmIHR5cGVvZiBwbHVnaW5GaWVsZHMgPT0gJ29iamVjdCcpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wID09IFwiZG9jXCIgfHwgcHJvcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBKU09OIGZpZWxkcyBgZG9jYCBhbmQgYHNlbGVjdGlvbmAgYXJlIHJlc2VydmVkXCIpO1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5GaWVsZHNbcHJvcF0sIHN0YXRlID0gcGx1Z2luLnNwZWMuc3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnRvSlNPTilcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gc3RhdGUudG9KU09OLmNhbGwocGx1Z2luLCB0aGlzW3BsdWdpbi5rZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RhdGUuIGBjb25maWdgIHNob3VsZFxuICAgIGhhdmUgYXQgbGVhc3QgYSBgc2NoZW1hYCBmaWVsZCwgYW5kIHNob3VsZCBjb250YWluIGFycmF5IG9mXG4gICAgcGx1Z2lucyB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSB3aXRoLiBgcGx1Z2luRmllbGRzYCBjYW4gYmUgdXNlZFxuICAgIHRvIGRlc2VyaWFsaXplIHRoZSBzdGF0ZSBvZiBwbHVnaW5zLCBieSBhc3NvY2lhdGluZyBwbHVnaW5cbiAgICBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvcGVydHkgbmFtZXMgdGhleSB1c2UgaW4gdGhlIEpTT04gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGNvbmZpZywganNvbiwgcGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRWRpdG9yU3RhdGUuZnJvbUpTT05cIik7XG4gICAgICAgIGlmICghY29uZmlnLnNjaGVtYSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVxdWlyZWQgY29uZmlnIGZpZWxkICdzY2hlbWEnIG1pc3NpbmdcIik7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oY29uZmlnLnNjaGVtYSwgY29uZmlnLnBsdWdpbnMpO1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgRWRpdG9yU3RhdGUoJGNvbmZpZyk7XG4gICAgICAgICRjb25maWcuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gXCJkb2NcIikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLmRvYyA9IE5vZGUuZnJvbUpTT04oY29uZmlnLnNjaGVtYSwganNvbi5kb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2VsZWN0aW9uID0gU2VsZWN0aW9uLmZyb21KU09OKGluc3RhbmNlLmRvYywganNvbi5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInN0b3JlZE1hcmtzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvbi5zdG9yZWRNYXJrcylcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RvcmVkTWFya3MgPSBqc29uLnN0b3JlZE1hcmtzLm1hcChjb25maWcuc2NoZW1hLm1hcmtGcm9tSlNPTik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luRmllbGRzKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbkZpZWxkc1twcm9wXSwgc3RhdGUgPSBwbHVnaW4uc3BlYy5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ua2V5ID09IGZpZWxkLm5hbWUgJiYgc3RhdGUgJiYgc3RhdGUuZnJvbUpTT04gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IHN0YXRlLmZyb21KU09OLmNhbGwocGx1Z2luLCBjb25maWcsIGpzb25bcHJvcF0sIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IGZpZWxkLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kUHJvcHMob2JqLCBzZWxmLCB0YXJnZXQpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9iaikge1xuICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgICAgICB2YWwgPSB2YWwuYmluZChzZWxmKTtcbiAgICAgICAgZWxzZSBpZiAocHJvcCA9PSBcImhhbmRsZURPTUV2ZW50c1wiKVxuICAgICAgICAgICAgdmFsID0gYmluZFByb3BzKHZhbCwgc2VsZiwge30pO1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG4vKipcblBsdWdpbnMgYnVuZGxlIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYW4gZWRpdG9yLlxuVGhleSBhcmUgcGFydCBvZiB0aGUgW2VkaXRvciBzdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlKSBhbmRcbm1heSBpbmZsdWVuY2UgdGhhdCBzdGF0ZSBhbmQgdGhlIHZpZXcgdGhhdCBjb250YWlucyBpdC5cbiovXG5jbGFzcyBQbHVnaW4ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBsdWdpbi5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwbHVnaW4ncyBbc3BlYyBvYmplY3RdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjKS5cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBbcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzKSBleHBvcnRlZCBieSB0aGlzIHBsdWdpbi5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgICAgICBpZiAoc3BlYy5wcm9wcylcbiAgICAgICAgICAgIGJpbmRQcm9wcyhzcGVjLnByb3BzLCB0aGlzLCB0aGlzLnByb3BzKTtcbiAgICAgICAgdGhpcy5rZXkgPSBzcGVjLmtleSA/IHNwZWMua2V5LmtleSA6IGNyZWF0ZUtleShcInBsdWdpblwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0cmFjdCB0aGUgcGx1Z2luJ3Mgc3RhdGUgZmllbGQgZnJvbSBhbiBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXRTdGF0ZShzdGF0ZSkgeyByZXR1cm4gc3RhdGVbdGhpcy5rZXldOyB9XG59XG5jb25zdCBrZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZ1bmN0aW9uIGNyZWF0ZUtleShuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4ga2V5cylcbiAgICAgICAgcmV0dXJuIG5hbWUgKyBcIiRcIiArICsra2V5c1tuYW1lXTtcbiAgICBrZXlzW25hbWVdID0gMDtcbiAgICByZXR1cm4gbmFtZSArIFwiJFwiO1xufVxuLyoqXG5BIGtleSBpcyB1c2VkIHRvIFt0YWddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjLmtleSkgcGx1Z2lucyBpbiBhIHdheVxudGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBmaW5kIHRoZW0sIGdpdmVuIGFuIGVkaXRvciBzdGF0ZS5cbkFzc2lnbmluZyBhIGtleSBkb2VzIG1lYW4gb25seSBvbmUgcGx1Z2luIG9mIHRoYXQgdHlwZSBjYW4gYmVcbmFjdGl2ZSBpbiBhIHN0YXRlLlxuKi9cbmNsYXNzIFBsdWdpbktleSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGx1Z2luIGtleS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUgPSBcImtleVwiKSB7IHRoaXMua2V5ID0gY3JlYXRlS2V5KG5hbWUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBhY3RpdmUgcGx1Z2luIHdpdGggdGhpcyBrZXksIGlmIGFueSwgZnJvbSBhbiBlZGl0b3JcbiAgICBzdGF0ZS5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkgeyByZXR1cm4gc3RhdGUuY29uZmlnLnBsdWdpbnNCeUtleVt0aGlzLmtleV07IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHBsdWdpbidzIHN0YXRlIGZyb20gYW4gZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgZ2V0U3RhdGUoc3RhdGUpIHsgcmV0dXJuIHN0YXRlW3RoaXMua2V5XTsgfVxufVxuXG5leHBvcnQgeyBBbGxTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBOb2RlU2VsZWN0aW9uLCBQbHVnaW4sIFBsdWdpbktleSwgU2VsZWN0aW9uLCBTZWxlY3Rpb25SYW5nZSwgVGV4dFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfTtcbiIsICJpbXBvcnQgeyBUZXh0U2VsZWN0aW9uLCBOb2RlU2VsZWN0aW9uLCBBbGxTZWxlY3Rpb24sIFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IERPTVNlcmlhbGl6ZXIsIEZyYWdtZW50LCBNYXJrLCBTbGljZSwgRE9NUGFyc2VyIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgZHJvcFBvaW50IH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcblxuY29uc3QgZG9tSW5kZXggPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGZvciAodmFyIGluZGV4ID0gMDs7IGluZGV4KyspIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufTtcbmNvbnN0IHBhcmVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGxldCBwYXJlbnQgPSBub2RlLmFzc2lnbmVkU2xvdCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMTEgPyBwYXJlbnQuaG9zdCA6IHBhcmVudDtcbn07XG5sZXQgcmV1c2VkUmFuZ2UgPSBudWxsO1xuLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJhbmdlLCBiZWNhdXNlIERPTSByYW5nZVxuLy8gb2JqZWN0cyBhcmUgZXZlcnkgZXhwZW5zaXZlLCBhbmQga2VlcCBzbG93aW5nIGRvd24gc3Vic2VxdWVudCBET01cbi8vIHVwZGF0ZXMsIGZvciBzb21lIHJlYXNvbi5cbmNvbnN0IHRleHRSYW5nZSA9IGZ1bmN0aW9uIChub2RlLCBmcm9tLCB0bykge1xuICAgIGxldCByYW5nZSA9IHJldXNlZFJhbmdlIHx8IChyZXVzZWRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpO1xuICAgIHJhbmdlLnNldEVuZChub2RlLCB0byA9PSBudWxsID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogdG8pO1xuICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGZyb20gfHwgMCk7XG4gICAgcmV0dXJuIHJhbmdlO1xufTtcbi8vIFNjYW5zIGZvcndhcmQgYW5kIGJhY2t3YXJkIHRocm91Z2ggRE9NIHBvc2l0aW9ucyBlcXVpdmFsZW50IHRvIHRoZVxuLy8gZ2l2ZW4gb25lIHRvIHNlZSBpZiB0aGUgdHdvIGFyZSBpbiB0aGUgc2FtZSBwbGFjZSAoaS5lLiBhZnRlciBhXG4vLyB0ZXh0IG5vZGUgdnMgYXQgdGhlIGVuZCBvZiB0aGF0IHRleHQgbm9kZSlcbmNvbnN0IGlzRXF1aXZhbGVudFBvc2l0aW9uID0gZnVuY3Rpb24gKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmKSB7XG4gICAgcmV0dXJuIHRhcmdldE5vZGUgJiYgKHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIC0xKSB8fFxuICAgICAgICBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAxKSk7XG59O1xuY29uc3QgYXRvbUVsZW1lbnRzID0gL14oaW1nfGJyfGlucHV0fHRleHRhcmVhfGhyKSQvaTtcbmZ1bmN0aW9uIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIGRpcikge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0Tm9kZSAmJiBvZmYgPT0gdGFyZ2V0T2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvZmYgPT0gKGRpciA8IDAgPyAwIDogbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEgfHwgaGFzQmxvY2tEZXNjKG5vZGUpIHx8IGF0b21FbGVtZW50cy50ZXN0KG5vZGUubm9kZU5hbWUpIHx8XG4gICAgICAgICAgICAgICAgbm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRvbUluZGV4KG5vZGUpICsgKGRpciA8IDAgPyAwIDogMSk7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmYgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkaXIgPCAwID8gbm9kZVNpemUobm9kZSkgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbm9kZVNpemUobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xufVxuZnVuY3Rpb24gaXNPbkVkZ2Uobm9kZSwgb2Zmc2V0LCBwYXJlbnQpIHtcbiAgICBmb3IgKGxldCBhdFN0YXJ0ID0gb2Zmc2V0ID09IDAsIGF0RW5kID0gb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpOyBhdFN0YXJ0IHx8IGF0RW5kOykge1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGluZGV4ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXRTdGFydCA9IGF0U3RhcnQgJiYgaW5kZXggPT0gMDtcbiAgICAgICAgYXRFbmQgPSBhdEVuZCAmJiBpbmRleCA9PSBub2RlU2l6ZShub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNCbG9ja0Rlc2MoZG9tKSB7XG4gICAgbGV0IGRlc2M7XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKVxuICAgICAgICBpZiAoZGVzYyA9IGN1ci5wbVZpZXdEZXNjKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgcmV0dXJuIGRlc2MgJiYgZGVzYy5ub2RlICYmIGRlc2Mubm9kZS5pc0Jsb2NrICYmIChkZXNjLmRvbSA9PSBkb20gfHwgZGVzYy5jb250ZW50RE9NID09IGRvbSk7XG59XG4vLyBXb3JrIGFyb3VuZCBDaHJvbWUgaXNzdWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3NTIzXG4vLyAoaXNDb2xsYXBzZWQgaW5hcHByb3ByaWF0ZWx5IHJldHVybnMgdHJ1ZSBpbiBzaGFkb3cgZG9tKVxuY29uc3Qgc2VsZWN0aW9uQ29sbGFwc2VkID0gZnVuY3Rpb24gKGRvbVNlbCkge1xuICAgIHJldHVybiBkb21TZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xufTtcbmZ1bmN0aW9uIGtleUV2ZW50KGtleUNvZGUsIGtleSkge1xuICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KFwia2V5ZG93blwiLCB0cnVlLCB0cnVlKTtcbiAgICBldmVudC5rZXlDb2RlID0ga2V5Q29kZTtcbiAgICBldmVudC5rZXkgPSBldmVudC5jb2RlID0ga2V5O1xuICAgIHJldHVybiBldmVudDtcbn1cbmZ1bmN0aW9uIGRlZXBBY3RpdmVFbGVtZW50KGRvYykge1xuICAgIGxldCBlbHQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAoZWx0ICYmIGVsdC5zaGFkb3dSb290KVxuICAgICAgICBlbHQgPSBlbHQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiBlbHQ7XG59XG5mdW5jdGlvbiBjYXJldEZyb21Qb2ludChkb2MsIHgsIHkpIHtcbiAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHtcbiAgICAgICAgdHJ5IHsgLy8gRmlyZWZveCB0aHJvd3MgZm9yIHRoaXMgY2FsbCBpbiBoYXJkLXRvLXByZWRpY3QgY2lyY3Vtc3RhbmNlcyAoIzk5NClcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGlmIChwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogcG9zLm9mZnNldE5vZGUsIG9mZnNldDogcG9zLm9mZnNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICB9XG4gICAgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7XG4gICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAocmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiByYW5nZS5zdGFydENvbnRhaW5lciwgb2Zmc2V0OiByYW5nZS5zdGFydE9mZnNldCB9O1xuICAgIH1cbn1cblxuY29uc3QgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yIDogbnVsbDtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiBudWxsO1xuY29uc3QgYWdlbnQgPSAobmF2ICYmIG5hdi51c2VyQWdlbnQpIHx8IFwiXCI7XG5jb25zdCBpZV9lZGdlID0gL0VkZ2VcXC8oXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWVfdXB0bzEwID0gL01TSUUgXFxkLy5leGVjKGFnZW50KTtcbmNvbnN0IGllXzExdXAgPSAvVHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWUgPSAhIShpZV91cHRvMTAgfHwgaWVfMTF1cCB8fCBpZV9lZGdlKTtcbmNvbnN0IGllX3ZlcnNpb24gPSBpZV91cHRvMTAgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiBpZV8xMXVwID8gK2llXzExdXBbMV0gOiBpZV9lZGdlID8gK2llX2VkZ2VbMV0gOiAwO1xuY29uc3QgZ2Vja28gPSAhaWUgJiYgL2dlY2tvXFwvKFxcZCspL2kudGVzdChhZ2VudCk7XG5nZWNrbyAmJiArKC9GaXJlZm94XFwvKFxcZCspLy5leGVjKGFnZW50KSB8fCBbMCwgMF0pWzFdO1xuY29uc3QgX2Nocm9tZSA9ICFpZSAmJiAvQ2hyb21lXFwvKFxcZCspLy5leGVjKGFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICEhX2Nocm9tZTtcbmNvbnN0IGNocm9tZV92ZXJzaW9uID0gX2Nocm9tZSA/ICtfY2hyb21lWzFdIDogMDtcbmNvbnN0IHNhZmFyaSA9ICFpZSAmJiAhIW5hdiAmJiAvQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2LnZlbmRvcik7XG4vLyBJcyB0cnVlIGZvciBib3RoIGlPUyBhbmQgaVBhZE9TIGZvciBjb252ZW5pZW5jZVxuY29uc3QgaW9zID0gc2FmYXJpICYmICgvTW9iaWxlXFwvXFx3Ky8udGVzdChhZ2VudCkgfHwgISFuYXYgJiYgbmF2Lm1heFRvdWNoUG9pbnRzID4gMik7XG5jb25zdCBtYWMgPSBpb3MgfHwgKG5hdiA/IC9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSA6IGZhbHNlKTtcbmNvbnN0IHdpbmRvd3MgPSBuYXYgPyAvV2luLy50ZXN0KG5hdi5wbGF0Zm9ybSkgOiBmYWxzZTtcbmNvbnN0IGFuZHJvaWQgPSAvQW5kcm9pZCBcXGQvLnRlc3QoYWdlbnQpO1xuY29uc3Qgd2Via2l0ID0gISFkb2MgJiYgXCJ3ZWJraXRGb250U21vb3RoaW5nXCIgaW4gZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbmNvbnN0IHdlYmtpdF92ZXJzaW9uID0gd2Via2l0ID8gKygvXFxiQXBwbGVXZWJLaXRcXC8oXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDA7XG5cbmZ1bmN0aW9uIHdpbmRvd1JlY3QoZG9jKSB7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB9O1xufVxuZnVuY3Rpb24gZ2V0U2lkZSh2YWx1ZSwgc2lkZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIiA/IHZhbHVlIDogdmFsdWVbc2lkZV07XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0KG5vZGUpIHtcbiAgICBsZXQgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gQWRqdXN0IGZvciBlbGVtZW50cyB3aXRoIHN0eWxlIFwidHJhbnNmb3JtOiBzY2FsZSgpXCJcbiAgICBsZXQgc2NhbGVYID0gKHJlY3Qud2lkdGggLyBub2RlLm9mZnNldFdpZHRoKSB8fCAxO1xuICAgIGxldCBzY2FsZVkgPSAocmVjdC5oZWlnaHQgLyBub2RlLm9mZnNldEhlaWdodCkgfHwgMTtcbiAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICByZXR1cm4geyBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgKyBub2RlLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgbm9kZS5jbGllbnRIZWlnaHQgKiBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyh2aWV3LCByZWN0LCBzdGFydERPTSkge1xuICAgIGxldCBzY3JvbGxUaHJlc2hvbGQgPSB2aWV3LnNvbWVQcm9wKFwic2Nyb2xsVGhyZXNob2xkXCIpIHx8IDAsIHNjcm9sbE1hcmdpbiA9IHZpZXcuc29tZVByb3AoXCJzY3JvbGxNYXJnaW5cIikgfHwgNTtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBwYXJlbnQgPSBzdGFydERPTSB8fCB2aWV3LmRvbTs7IHBhcmVudCA9IHBhcmVudE5vZGUocGFyZW50KSkge1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAocGFyZW50Lm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgbGV0IGF0VG9wID0gZWx0ID09IGRvYy5ib2R5O1xuICAgICAgICBsZXQgYm91bmRpbmcgPSBhdFRvcCA/IHdpbmRvd1JlY3QoZG9jKSA6IGNsaWVudFJlY3QoZWx0KTtcbiAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3AgKyBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJ0b3BcIikpXG4gICAgICAgICAgICBtb3ZlWSA9IC0oYm91bmRpbmcudG9wIC0gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSAtIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImJvdHRvbVwiKSlcbiAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IGJvdW5kaW5nLmJvdHRvbSAtIGJvdW5kaW5nLnRvcFxuICAgICAgICAgICAgICAgID8gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikgLSBib3VuZGluZy50b3BcbiAgICAgICAgICAgICAgICA6IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwiYm90dG9tXCIpO1xuICAgICAgICBpZiAocmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCArIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImxlZnRcIikpXG4gICAgICAgICAgICBtb3ZlWCA9IC0oYm91bmRpbmcubGVmdCAtIHJlY3QubGVmdCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcImxlZnRcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgLSBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJyaWdodFwiKSlcbiAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwicmlnaHRcIik7XG4gICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgaWYgKGF0VG9wKSB7XG4gICAgICAgICAgICAgICAgZG9jLmRlZmF1bHRWaWV3LnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRYID0gZWx0LnNjcm9sbExlZnQsIHN0YXJ0WSA9IGVsdC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgaWYgKG1vdmVZKVxuICAgICAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsVG9wICs9IG1vdmVZO1xuICAgICAgICAgICAgICAgIGlmIChtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgZWx0LnNjcm9sbExlZnQgKz0gbW92ZVg7XG4gICAgICAgICAgICAgICAgbGV0IGRYID0gZWx0LnNjcm9sbExlZnQgLSBzdGFydFgsIGRZID0gZWx0LnNjcm9sbFRvcCAtIHN0YXJ0WTtcbiAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBkWCwgdG9wOiByZWN0LnRvcCAtIGRZLCByaWdodDogcmVjdC5yaWdodCAtIGRYLCBib3R0b206IHJlY3QuYm90dG9tIC0gZFkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYXRUb3AgfHwgL14oZml4ZWR8c3RpY2t5KSQvLnRlc3QoZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpLnBvc2l0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn1cbi8vIFN0b3JlIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIGVkaXRvcidzIHBhcmVudCBub2RlcywgYWxvbmcgd2l0aFxuLy8gdGhlIHRvcCBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IG5lYXIgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLCB3aGljaFxuLy8gd2lsbCBiZSB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgdmlzaWJsZSB2aWV3cG9ydCByZW1haW5zIHN0YWJsZSBldmVuXG4vLyB3aGVuIHRoZSBzaXplIG9mIHRoZSBjb250ZW50IGFib3ZlIGNoYW5nZXMuXG5mdW5jdGlvbiBzdG9yZVNjcm9sbFBvcyh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgc3RhcnRZID0gTWF0aC5tYXgoMCwgcmVjdC50b3ApO1xuICAgIGxldCByZWZET00sIHJlZlRvcDtcbiAgICBmb3IgKGxldCB4ID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiwgeSA9IHN0YXJ0WSArIDE7IHkgPCBNYXRoLm1pbihpbm5lckhlaWdodCwgcmVjdC5ib3R0b20pOyB5ICs9IDUpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAoIWRvbSB8fCBkb20gPT0gdmlldy5kb20gfHwgIXZpZXcuZG9tLmNvbnRhaW5zKGRvbSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IGxvY2FsUmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGxvY2FsUmVjdC50b3AgPj0gc3RhcnRZIC0gMjApIHtcbiAgICAgICAgICAgIHJlZkRPTSA9IGRvbTtcbiAgICAgICAgICAgIHJlZlRvcCA9IGxvY2FsUmVjdC50b3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZWZET006IHJlZkRPTSwgcmVmVG9wOiByZWZUb3AsIHN0YWNrOiBzY3JvbGxTdGFjayh2aWV3LmRvbSkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFN0YWNrKGRvbSkge1xuICAgIGxldCBzdGFjayA9IFtdLCBkb2MgPSBkb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gcGFyZW50Tm9kZShjdXIpKSB7XG4gICAgICAgIHN0YWNrLnB1c2goeyBkb206IGN1ciwgdG9wOiBjdXIuc2Nyb2xsVG9wLCBsZWZ0OiBjdXIuc2Nyb2xsTGVmdCB9KTtcbiAgICAgICAgaWYgKGRvbSA9PSBkb2MpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrO1xufVxuLy8gUmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZWRpdG9yJ3MgcGFyZW50IG5vZGVzIHRvIHRoYXQgd2hhdFxuLy8gaXQgd2FzIGJlZm9yZSwgd2hlbiBzdG9yZVNjcm9sbFBvcyB3YXMgY2FsbGVkLlxuZnVuY3Rpb24gcmVzZXRTY3JvbGxQb3MoeyByZWZET00sIHJlZlRvcCwgc3RhY2sgfSkge1xuICAgIGxldCBuZXdSZWZUb3AgPSByZWZET00gPyByZWZET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDogMDtcbiAgICByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIG5ld1JlZlRvcCA9PSAwID8gMCA6IG5ld1JlZlRvcCAtIHJlZlRvcCk7XG59XG5mdW5jdGlvbiByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIGRUb3ApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGRvbSwgdG9wLCBsZWZ0IH0gPSBzdGFja1tpXTtcbiAgICAgICAgaWYgKGRvbS5zY3JvbGxUb3AgIT0gdG9wICsgZFRvcClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxUb3AgPSB0b3AgKyBkVG9wO1xuICAgICAgICBpZiAoZG9tLnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0b3JlZCA9IHNjcm9sbFN0YWNrKGRvbSk7XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIHJlc3RvcmVTY3JvbGxTdGFjayhzdG9yZWQsIDApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXRJbk5vZGUobm9kZSwgY29vcmRzKSB7XG4gICAgbGV0IGNsb3Nlc3QsIGR4Q2xvc2VzdCA9IDJlOCwgY29vcmRzQ2xvc2VzdCwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgcm93Qm90ID0gY29vcmRzLnRvcCwgcm93VG9wID0gY29vcmRzLnRvcDtcbiAgICBsZXQgZmlyc3RCZWxvdywgY29vcmRzQmVsb3c7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQsIGNoaWxkSW5kZXggPSAwOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZywgY2hpbGRJbmRleCsrKSB7XG4gICAgICAgIGxldCByZWN0cztcbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZWN0cyA9IHRleHRSYW5nZShjaGlsZCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPD0gcm93Qm90ICYmIHJlY3QuYm90dG9tID49IHJvd1RvcCkge1xuICAgICAgICAgICAgICAgIHJvd0JvdCA9IE1hdGgubWF4KHJlY3QuYm90dG9tLCByb3dCb3QpO1xuICAgICAgICAgICAgICAgIHJvd1RvcCA9IE1hdGgubWluKHJlY3QudG9wLCByb3dUb3ApO1xuICAgICAgICAgICAgICAgIGxldCBkeCA9IHJlY3QubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gcmVjdC5sZWZ0IC0gY29vcmRzLmxlZnRcbiAgICAgICAgICAgICAgICAgICAgOiByZWN0LnJpZ2h0IDwgY29vcmRzLmxlZnQgPyBjb29yZHMubGVmdCAtIHJlY3QucmlnaHQgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChkeCA8IGR4Q2xvc2VzdCkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGR4Q2xvc2VzdCA9IGR4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZHNDbG9zZXN0ID0gZHggJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAzID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5yaWdodCA8IGNvb3Jkcy5sZWZ0ID8gcmVjdC5yaWdodCA6IHJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogY29vcmRzLnRvcFxuICAgICAgICAgICAgICAgICAgICB9IDogY29vcmRzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSAmJiBkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAoY29vcmRzLmxlZnQgPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVjdC50b3AgPiBjb29yZHMudG9wICYmICFmaXJzdEJlbG93ICYmIHJlY3QubGVmdCA8PSBjb29yZHMubGVmdCAmJiByZWN0LnJpZ2h0ID49IGNvb3Jkcy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgZmlyc3RCZWxvdyA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGNvb3Jkc0JlbG93ID0geyBsZWZ0OiBNYXRoLm1heChyZWN0LmxlZnQsIE1hdGgubWluKHJlY3QucmlnaHQsIGNvb3Jkcy5sZWZ0KSksIHRvcDogcmVjdC50b3AgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2xvc2VzdCAmJiAoY29vcmRzLmxlZnQgPj0gcmVjdC5yaWdodCAmJiBjb29yZHMudG9wID49IHJlY3QudG9wIHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLmxlZnQgPj0gcmVjdC5sZWZ0ICYmIGNvb3Jkcy50b3AgPj0gcmVjdC5ib3R0b20pKVxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghY2xvc2VzdCAmJiBmaXJzdEJlbG93KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBmaXJzdEJlbG93O1xuICAgICAgICBjb29yZHNDbG9zZXN0ID0gY29vcmRzQmVsb3c7XG4gICAgICAgIGR4Q2xvc2VzdCA9IDA7XG4gICAgfVxuICAgIGlmIChjbG9zZXN0ICYmIGNsb3Nlc3Qubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIGZpbmRPZmZzZXRJblRleHQoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG4gICAgaWYgKCFjbG9zZXN0IHx8IChkeENsb3Nlc3QgJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAxKSlcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0IH07XG4gICAgcmV0dXJuIGZpbmRPZmZzZXRJbk5vZGUoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG59XG5mdW5jdGlvbiBmaW5kT2Zmc2V0SW5UZXh0KG5vZGUsIGNvb3Jkcykge1xuICAgIGxldCBsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QocmFuZ2UsIDEpO1xuICAgICAgICBpZiAocmVjdC50b3AgPT0gcmVjdC5ib3R0b20pXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGluUmVjdChjb29yZHMsIHJlY3QpKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGNvb3Jkcy5sZWZ0ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIgPyAxIDogMCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiAwIH07XG59XG5mdW5jdGlvbiBpblJlY3QoY29vcmRzLCByZWN0KSB7XG4gICAgcmV0dXJuIGNvb3Jkcy5sZWZ0ID49IHJlY3QubGVmdCAtIDEgJiYgY29vcmRzLmxlZnQgPD0gcmVjdC5yaWdodCArIDEgJiZcbiAgICAgICAgY29vcmRzLnRvcCA+PSByZWN0LnRvcCAtIDEgJiYgY29vcmRzLnRvcCA8PSByZWN0LmJvdHRvbSArIDE7XG59XG5mdW5jdGlvbiB0YXJnZXRLbHVkZ2UoZG9tLCBjb29yZHMpIHtcbiAgICBsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCAmJiAvXmxpJC9pLnRlc3QocGFyZW50Lm5vZGVOYW1lKSAmJiBjb29yZHMubGVmdCA8IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KVxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIHJldHVybiBkb207XG59XG5mdW5jdGlvbiBwb3NGcm9tRWxlbWVudCh2aWV3LCBlbHQsIGNvb3Jkcykge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gZmluZE9mZnNldEluTm9kZShlbHQsIGNvb3JkcyksIGJpYXMgPSAtMTtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICFub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBiaWFzID0gcmVjdC5sZWZ0ICE9IHJlY3QucmlnaHQgJiYgY29vcmRzLmxlZnQgPiAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gMSA6IC0xO1xuICAgIH1cbiAgICByZXR1cm4gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCBiaWFzKTtcbn1cbmZ1bmN0aW9uIHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcykge1xuICAgIC8vIEJyb3dzZXIgKGluIGNhcmV0UG9zaXRpb24vUmFuZ2VGcm9tUG9pbnQpIHdpbGwgYWdyZXNzaXZlbHlcbiAgICAvLyBub3JtYWxpemUgdG93YXJkcyBuZWFyYnkgaW5saW5lIG5vZGVzLiBTaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpblxuICAgIC8vIHBvc2l0aW9ucyBiZXR3ZWVuIGJsb2NrIG5vZGVzIHRvbywgd2UgZmlyc3Qgd2FsayB1cCB0aGUgaGllcmFyY2h5XG4gICAgLy8gb2Ygbm9kZXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBibG9jayBub2RlcyB0aGF0IHRoZSBjb29yZGluYXRlc1xuICAgIC8vIGZhbGwgb3V0c2lkZSBvZi4gSWYgc28sIHdlIHRha2UgdGhlIHBvc2l0aW9uIGJlZm9yZS9hZnRlciB0aGF0XG4gICAgLy8gYmxvY2suIElmIG5vdCwgd2UgY2FsbCBgcG9zRnJvbURPTWAgb24gdGhlIHJhdyBub2RlL29mZnNldC5cbiAgICBsZXQgb3V0c2lkZUJsb2NrID0gLTE7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZSwgc2F3QmxvY2sgPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gdmlldy5kb20pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoY3VyLCB0cnVlKTtcbiAgICAgICAgaWYgKCFkZXNjKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChkZXNjLmRvbS5ub2RlVHlwZSA9PSAxICYmIChkZXNjLm5vZGUuaXNCbG9jayAmJiBkZXNjLnBhcmVudCAmJiAhc2F3QmxvY2sgfHwgIWRlc2MuY29udGVudERPTSkpIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gZGVzYy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBpZiAoZGVzYy5ub2RlLmlzQmxvY2sgJiYgZGVzYy5wYXJlbnQgJiYgIXNhd0Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgc2F3QmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPiBjb29yZHMubGVmdCB8fCByZWN0LnRvcCA+IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGVCbG9jayA9IGRlc2MucG9zQmVmb3JlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPCBjb29yZHMubGVmdCB8fCByZWN0LmJvdHRvbSA8IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGVCbG9jayA9IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRlc2MuY29udGVudERPTSAmJiBvdXRzaWRlQmxvY2sgPCAwICYmICFkZXNjLm5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGluc2lkZSBhIGxlYWYsIHJldHVybiB0aGUgc2lkZSBvZiB0aGUgbGVhZiBjbG9zZXIgdG8gdGhlIGNvb3Jkc1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBkZXNjLm5vZGUuaXNCbG9jayA/IGNvb3Jkcy50b3AgPCAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyXG4gICAgICAgICAgICAgICAgICAgIDogY29vcmRzLmxlZnQgPCAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUgPyBkZXNjLnBvc0JlZm9yZSA6IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gZGVzYy5kb20ucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHNpZGVCbG9jayA+IC0xID8gb3V0c2lkZUJsb2NrIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCAtMSk7XG59XG5mdW5jdGlvbiBlbGVtZW50RnJvbVBvaW50KGVsZW1lbnQsIGNvb3JkcywgYm94KSB7XG4gICAgbGV0IGxlbiA9IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgaWYgKGxlbiAmJiBib3gudG9wIDwgYm94LmJvdHRvbSkge1xuICAgICAgICBmb3IgKGxldCBzdGFydEkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZW4gLSAxLCBNYXRoLmZsb29yKGxlbiAqIChjb29yZHMudG9wIC0gYm94LnRvcCkgLyAoYm94LmJvdHRvbSAtIGJveC50b3ApKSAtIDIpKSwgaSA9IHN0YXJ0STs7KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5SZWN0KGNvb3JkcywgcmVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudEZyb21Qb2ludChjaGlsZCwgY29vcmRzLCByZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgPSAoaSArIDEpICUgbGVuKSA9PSBzdGFydEkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vLyBHaXZlbiBhbiB4LHkgcG9zaXRpb24gb24gdGhlIGVkaXRvciwgZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG5mdW5jdGlvbiBwb3NBdENvb3Jkcyh2aWV3LCBjb29yZHMpIHtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudCwgbm9kZSwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgY2FyZXQgPSBjYXJldEZyb21Qb2ludChkb2MsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBpZiAoY2FyZXQpXG4gICAgICAgICh7IG5vZGUsIG9mZnNldCB9ID0gY2FyZXQpO1xuICAgIGxldCBlbHQgPSAodmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2MpXG4gICAgICAgIC5lbGVtZW50RnJvbVBvaW50KGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBsZXQgcG9zO1xuICAgIGlmICghZWx0IHx8ICF2aWV3LmRvbS5jb250YWlucyhlbHQubm9kZVR5cGUgIT0gMSA/IGVsdC5wYXJlbnROb2RlIDogZWx0KSkge1xuICAgICAgICBsZXQgYm94ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghaW5SZWN0KGNvb3JkcywgYm94KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBlbHQgPSBlbGVtZW50RnJvbVBvaW50KHZpZXcuZG9tLCBjb29yZHMsIGJveCk7XG4gICAgICAgIGlmICghZWx0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFNhZmFyaSdzIGNhcmV0UmFuZ2VGcm9tUG9pbnQgcmV0dXJucyBub25zZW5zZSB3aGVuIG9uIGEgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICBpZiAoc2FmYXJpKSB7XG4gICAgICAgIGZvciAobGV0IHAgPSBlbHQ7IG5vZGUgJiYgcDsgcCA9IHBhcmVudE5vZGUocCkpXG4gICAgICAgICAgICBpZiAocC5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWx0ID0gdGFyZ2V0S2x1ZGdlKGVsdCwgY29vcmRzKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgICBpZiAoZ2Vja28gJiYgbm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHdpbGwgc29tZXRpbWVzIHJldHVybiBvZmZzZXRzIGludG8gPGlucHV0PiBub2Rlcywgd2hpY2hcbiAgICAgICAgICAgIC8vIGhhdmUgbm8gYWN0dWFsIGNoaWxkcmVuLCBmcm9tIGNhcmV0UG9zaXRpb25Gcm9tUG9pbnQgKCM5NTMpXG4gICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAgICAgICAgLy8gSXQnbGwgYWxzbyBtb3ZlIHRoZSByZXR1cm5lZCBwb3NpdGlvbiBiZWZvcmUgaW1hZ2Ugbm9kZXMsXG4gICAgICAgICAgICAvLyBldmVuIGlmIHRob3NlIGFyZSBiZWhpbmQgaXQuXG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF0sIGJveDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5ub2RlTmFtZSA9PSBcIklNR1wiICYmIChib3ggPSBuZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS5yaWdodCA8PSBjb29yZHMubGVmdCAmJlxuICAgICAgICAgICAgICAgICAgICBib3guYm90dG9tID4gY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXY7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgYWJvdmUgdGhlIHJpZ2h0IHNpZGUgb2YgYW4gdW5lZGl0YWJsZSBub2RlLCBDaHJvbWUgd2lsbCByZXBvcnQgYSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdGhhdCBub2RlLlxuICAgICAgICBpZiAod2Via2l0ICYmIG9mZnNldCAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgKHByZXYgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0pLm5vZGVUeXBlID09IDEgJiZcbiAgICAgICAgICAgIHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiAmJiBwcmV2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA+PSBjb29yZHMudG9wKVxuICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgIC8vIFN1c3BpY2lvdXNseSBzcGVjaWZpYyBrbHVkZ2UgdG8gd29yayBhcm91bmQgY2FyZXQqRnJvbVBvaW50XG4gICAgICAgIC8vIG5ldmVyIHJldHVybmluZyBhIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50XG4gICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tICYmIG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSAmJiBub2RlLmxhc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmXG4gICAgICAgICAgICBjb29yZHMudG9wID4gbm9kZS5sYXN0Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKVxuICAgICAgICAgICAgcG9zID0gdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplO1xuICAgICAgICAvLyBJZ25vcmUgcG9zaXRpb25zIGRpcmVjdGx5IGFmdGVyIGEgQlIsIHNpbmNlIGNhcmV0KkZyb21Qb2ludFxuICAgICAgICAvLyAncm91bmQgdXAnIHBvc2l0aW9ucyB0aGF0IHdvdWxkIGJlIG1vcmUgYWNjdXJhdGVseSBwbGFjZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBCUiBub2RlLlxuICAgICAgICBlbHNlIGlmIChvZmZzZXQgPT0gMCB8fCBub2RlLm5vZGVUeXBlICE9IDEgfHwgbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdLm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHBvcyA9IHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcyk7XG4gICAgfVxuICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgcG9zID0gcG9zRnJvbUVsZW1lbnQodmlldywgZWx0LCBjb29yZHMpO1xuICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGVsdCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHsgcG9zLCBpbnNpZGU6IGRlc2MgPyBkZXNjLnBvc0F0U3RhcnQgLSBkZXNjLmJvcmRlciA6IC0xIH07XG59XG5mdW5jdGlvbiBub25aZXJvKHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC50b3AgPCByZWN0LmJvdHRvbSB8fCByZWN0LmxlZnQgPCByZWN0LnJpZ2h0O1xufVxuZnVuY3Rpb24gc2luZ2xlUmVjdCh0YXJnZXQsIGJpYXMpIHtcbiAgICBsZXQgcmVjdHMgPSB0YXJnZXQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHJlY3RzW2JpYXMgPCAwID8gMCA6IHJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobm9uWmVybyhmaXJzdCkpXG4gICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHJlY3RzLCBub25aZXJvKSB8fCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG59XG5jb25zdCBCSURJID0gL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNdLztcbi8vIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IG1vZGVsLCBnZXQgYSBib3VuZGluZyBib3ggb2YgdGhlXG4vLyBjaGFyYWN0ZXIgYXQgdGhhdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbmZ1bmN0aW9uIGNvb3Jkc0F0UG9zKHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCwgYXRvbSB9ID0gdmlldy5kb2NWaWV3LmRvbUZyb21Qb3MocG9zLCBzaWRlIDwgMCA/IC0xIDogMSk7XG4gICAgbGV0IHN1cHBvcnRFbXB0eVJhbmdlID0gd2Via2l0IHx8IGdlY2tvO1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgLy8gVGhlc2UgYnJvd3NlcnMgc3VwcG9ydCBxdWVyeWluZyBlbXB0eSB0ZXh0IHJhbmdlcy4gUHJlZmVyIHRoYXQgaW5cbiAgICAgICAgLy8gYmlkaSBjb250ZXh0IG9yIHdoZW4gYXQgdGhlIGVuZCBvZiBhIG5vZGUuXG4gICAgICAgIGlmIChzdXBwb3J0RW1wdHlSYW5nZSAmJiAoQklESS50ZXN0KG5vZGUubm9kZVZhbHVlKSB8fCAoc2lkZSA8IDAgPyAhb2Zmc2V0IDogb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkpKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0KSwgc2lkZSk7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHJldHVybnMgYmFkIHJlc3VsdHMgKHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIHNwYWNlKVxuICAgICAgICAgICAgLy8gd2hlbiBxdWVyeWluZyBhIHBvc2l0aW9uIGRpcmVjdGx5IGFmdGVyIGxpbmUtYnJva2VuXG4gICAgICAgICAgICAvLyB3aGl0ZXNwYWNlLiBEZXRlY3QgdGhpcyBzaXR1YXRpb24gYW5kIGFuZCBrbHVkZ2UgYXJvdW5kIGl0XG4gICAgICAgICAgICBpZiAoZ2Vja28gJiYgb2Zmc2V0ICYmIC9cXHMvLnRlc3Qobm9kZS5ub2RlVmFsdWVbb2Zmc2V0IC0gMV0pICYmIG9mZnNldCA8IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0QmVmb3JlID0gc2luZ2xlUmVjdCh0ZXh0UmFuZ2Uobm9kZSwgb2Zmc2V0IC0gMSwgb2Zmc2V0IC0gMSksIC0xKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjdEJlZm9yZS50b3AgPT0gcmVjdC50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RBZnRlciA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0ICsgMSksIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RBZnRlci50b3AgIT0gcmVjdC50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlblYocmVjdEFmdGVyLCByZWN0QWZ0ZXIubGVmdCA8IHJlY3RCZWZvcmUubGVmdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG9mZnNldCwgdG8gPSBvZmZzZXQsIHRha2VTaWRlID0gc2lkZSA8IDAgPyAxIDogLTE7XG4gICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgIW9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICAgICAgdGFrZVNpZGUgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPj0gMCAmJiBvZmZzZXQgPT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgICAgIHRha2VTaWRlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPCAwKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBmcm9tLCB0byksIHRha2VTaWRlKSwgdGFrZVNpZGUgPCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgJGRvbSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zIC0gKGF0b20gfHwgMCkpO1xuICAgIC8vIFJldHVybiBhIGhvcml6b250YWwgbGluZSBpbiBibG9jayBjb250ZXh0XG4gICAgaWYgKCEkZG9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChiZWZvcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCA8IG5vZGVTaXplKG5vZGUpKSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChhZnRlci5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChhZnRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5IKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHNpZGUgPj0gMCk7XG4gICAgfVxuICAgIC8vIElubGluZSwgbm90IGluIHRleHQgbm9kZSAodGhpcyBpcyBub3QgQmlkaS1zYWZlKVxuICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgIGxldCBiZWZvcmUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgIGxldCB0YXJnZXQgPSBiZWZvcmUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShiZWZvcmUsIG5vZGVTaXplKGJlZm9yZSkgLSAoc3VwcG9ydEVtcHR5UmFuZ2UgPyAwIDogMSkpXG4gICAgICAgICAgICAvLyBCUiBub2RlcyB0ZW5kIHRvIG9ubHkgcmV0dXJuIHRoZSByZWN0YW5nbGUgYmVmb3JlIHRoZW0uXG4gICAgICAgICAgICAvLyBPbmx5IHVzZSB0aGVtIGlmIHRoZXkgYXJlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlaXIgcGFyZW50XG4gICAgICAgICAgICA6IGJlZm9yZS5ub2RlVHlwZSA9PSAxICYmIChiZWZvcmUubm9kZU5hbWUgIT0gXCJCUlwiIHx8ICFiZWZvcmUubmV4dFNpYmxpbmcpID8gYmVmb3JlIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgMSksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGF0b20gPT0gbnVsbCAmJiBvZmZzZXQgPCBub2RlU2l6ZShub2RlKSkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgd2hpbGUgKGFmdGVyLnBtVmlld0Rlc2MgJiYgYWZ0ZXIucG1WaWV3RGVzYy5pZ25vcmVGb3JDb29yZHMpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gIWFmdGVyID8gbnVsbCA6IGFmdGVyLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2UoYWZ0ZXIsIDAsIChzdXBwb3J0RW1wdHlSYW5nZSA/IDAgOiAxKSlcbiAgICAgICAgICAgIDogYWZ0ZXIubm9kZVR5cGUgPT0gMSA/IGFmdGVyIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgLTEpLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gQWxsIGVsc2UgZmFpbGVkLCBqdXN0IHRyeSB0byBnZXQgYSByZWN0YW5nbGUgZm9yIHRoZSB0YXJnZXQgbm9kZVxuICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KG5vZGUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShub2RlKSA6IG5vZGUsIC1zaWRlKSwgc2lkZSA+PSAwKTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5WKHJlY3QsIGxlZnQpIHtcbiAgICBpZiAocmVjdC53aWR0aCA9PSAwKVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICBsZXQgeCA9IGxlZnQgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0O1xuICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiB4IH07XG59XG5mdW5jdGlvbiBmbGF0dGVuSChyZWN0LCB0b3ApIHtcbiAgICBpZiAocmVjdC5oZWlnaHQgPT0gMClcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgbGV0IHkgPSB0b3AgPyByZWN0LnRvcCA6IHJlY3QuYm90dG9tO1xuICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0IH07XG59XG5mdW5jdGlvbiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCBmKSB7XG4gICAgbGV0IHZpZXdTdGF0ZSA9IHZpZXcuc3RhdGUsIGFjdGl2ZSA9IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50O1xuICAgIGlmICh2aWV3U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgIHZpZXcudXBkYXRlU3RhdGUoc3RhdGUpO1xuICAgIGlmIChhY3RpdmUgIT0gdmlldy5kb20pXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZigpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHZpZXdTdGF0ZSAhPSBzdGF0ZSlcbiAgICAgICAgICAgIHZpZXcudXBkYXRlU3RhdGUodmlld1N0YXRlKTtcbiAgICAgICAgaWYgKGFjdGl2ZSAhPSB2aWV3LmRvbSAmJiBhY3RpdmUpXG4gICAgICAgICAgICBhY3RpdmUuZm9jdXMoKTtcbiAgICB9XG59XG4vLyBXaGV0aGVyIHZlcnRpY2FsIHBvc2l0aW9uIG1vdGlvbiBpbiBhIGdpdmVuIGRpcmVjdGlvblxuLy8gZnJvbSBhIHBvc2l0aW9uIHdvdWxkIGxlYXZlIGEgdGV4dCBibG9jay5cbmZ1bmN0aW9uIGVuZE9mVGV4dGJsb2NrVmVydGljYWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0ICRwb3MgPSBkaXIgPT0gXCJ1cFwiID8gc2VsLiRmcm9tIDogc2VsLiR0bztcbiAgICByZXR1cm4gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgKCkgPT4ge1xuICAgICAgICBsZXQgeyBub2RlOiBkb20gfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKCRwb3MucG9zLCBkaXIgPT0gXCJ1cFwiID8gLTEgOiAxKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IG5lYXJlc3QgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZG9tLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghbmVhcmVzdClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChuZWFyZXN0Lm5vZGUuaXNCbG9jaykge1xuICAgICAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuY29udGVudERPTSB8fCBuZWFyZXN0LmRvbTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuZG9tLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvb3JkcyA9IGNvb3Jkc0F0UG9zKHZpZXcsICRwb3MucG9zLCAxKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBib3hlcztcbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIGJveGVzID0gY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgYm94ZXMgPSB0ZXh0UmFuZ2UoY2hpbGQsIDAsIGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGgpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJveCA9IGJveGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChib3guYm90dG9tID4gYm94LnRvcCArIDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRpciA9PSBcInVwXCIgPyBjb29yZHMudG9wIC0gYm94LnRvcCA+IChib3guYm90dG9tIC0gY29vcmRzLnRvcCkgKiAyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJveC5ib3R0b20gLSBjb29yZHMuYm90dG9tID4gKGNvb3Jkcy5ib3R0b20gLSBib3gudG9wKSAqIDIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5jb25zdCBtYXliZVJUTCA9IC9bXFx1MDU5MC1cXHUwOGFjXS87XG5mdW5jdGlvbiBlbmRPZlRleHRibG9ja0hvcml6b250YWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCB7ICRoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb2Zmc2V0ID0gJGhlYWQucGFyZW50T2Zmc2V0LCBhdFN0YXJ0ID0gIW9mZnNldCwgYXRFbmQgPSBvZmZzZXQgPT0gJGhlYWQucGFyZW50LmNvbnRlbnQuc2l6ZTtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICAvLyBJZiB0aGUgdGV4dGJsb2NrIGlzIGFsbCBMVFIsIG9yIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydFxuICAgIC8vIFNlbGVjdGlvbi5tb2RpZnkgKEVkZ2UpLCBmYWxsIGJhY2sgdG8gYSBwcmltaXRpdmUgYXBwcm9hY2hcbiAgICBpZiAoIW1heWJlUlRMLnRlc3QoJGhlYWQucGFyZW50LnRleHRDb250ZW50KSB8fCAhc2VsLm1vZGlmeSlcbiAgICAgICAgcmV0dXJuIGRpciA9PSBcImxlZnRcIiB8fCBkaXIgPT0gXCJiYWNrd2FyZFwiID8gYXRTdGFydCA6IGF0RW5kO1xuICAgIHJldHVybiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCAoKSA9PiB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBodWdlIGhhY2ssIGJ1dCBhcHBlYXJzIHRvIGJlIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBjdXJyZW50bHkgZG86IHVzZSBgU2VsZWN0aW9uLm1vZGlmeWAgdG8gbW92ZSB0aGUgc2VsZWN0aW9uIGJ5XG4gICAgICAgIC8vIG9uZSBjaGFyYWN0ZXIsIGFuZCBzZWUgaWYgdGhhdCBtb3ZlcyB0aGUgY3Vyc29yIG91dCBvZiB0aGVcbiAgICAgICAgLy8gdGV4dGJsb2NrIChvciBkb2Vzbid0IG1vdmUgaXQgYXQgYWxsLCB3aGVuIGF0IHRoZSBzdGFydC9lbmQgb2ZcbiAgICAgICAgLy8gdGhlIGRvY3VtZW50KS5cbiAgICAgICAgbGV0IHsgZm9jdXNOb2RlOiBvbGROb2RlLCBmb2N1c09mZnNldDogb2xkT2ZmLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG9sZEJpZGlMZXZlbCA9IHNlbC5jYXJldEJpZGlMZXZlbCAvLyBPbmx5IGZvciBGaXJlZm94XG4gICAgICAgIDtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgZGlyLCBcImNoYXJhY3RlclwiKTtcbiAgICAgICAgbGV0IHBhcmVudERPTSA9ICRoZWFkLmRlcHRoID8gdmlldy5kb2NWaWV3LmRvbUFmdGVyUG9zKCRoZWFkLmJlZm9yZSgpKSA6IHZpZXcuZG9tO1xuICAgICAgICBsZXQgeyBmb2N1c05vZGU6IG5ld05vZGUsIGZvY3VzT2Zmc2V0OiBuZXdPZmYgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ld05vZGUgJiYgIXBhcmVudERPTS5jb250YWlucyhuZXdOb2RlLm5vZGVUeXBlID09IDEgPyBuZXdOb2RlIDogbmV3Tm9kZS5wYXJlbnROb2RlKSB8fFxuICAgICAgICAgICAgKG9sZE5vZGUgPT0gbmV3Tm9kZSAmJiBvbGRPZmYgPT0gbmV3T2ZmKTtcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChvbGROb2RlICYmIChvbGROb2RlICE9IGFuY2hvck5vZGUgfHwgb2xkT2ZmICE9IGFuY2hvck9mZnNldCkgJiYgc2VsLmV4dGVuZClcbiAgICAgICAgICAgICAgICBzZWwuZXh0ZW5kKG9sZE5vZGUsIG9sZE9mZik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICBpZiAob2xkQmlkaUxldmVsICE9IG51bGwpXG4gICAgICAgICAgICBzZWwuY2FyZXRCaWRpTGV2ZWwgPSBvbGRCaWRpTGV2ZWw7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5sZXQgY2FjaGVkU3RhdGUgPSBudWxsO1xubGV0IGNhY2hlZERpciA9IG51bGw7XG5sZXQgY2FjaGVkUmVzdWx0ID0gZmFsc2U7XG5mdW5jdGlvbiBlbmRPZlRleHRibG9jayh2aWV3LCBzdGF0ZSwgZGlyKSB7XG4gICAgaWYgKGNhY2hlZFN0YXRlID09IHN0YXRlICYmIGNhY2hlZERpciA9PSBkaXIpXG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgY2FjaGVkU3RhdGUgPSBzdGF0ZTtcbiAgICBjYWNoZWREaXIgPSBkaXI7XG4gICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9IGRpciA9PSBcInVwXCIgfHwgZGlyID09IFwiZG93blwiXG4gICAgICAgID8gZW5kT2ZUZXh0YmxvY2tWZXJ0aWNhbCh2aWV3LCBzdGF0ZSwgZGlyKVxuICAgICAgICA6IGVuZE9mVGV4dGJsb2NrSG9yaXpvbnRhbCh2aWV3LCBzdGF0ZSwgZGlyKTtcbn1cblxuLy8gVmlldyBkZXNjcmlwdGlvbnMgYXJlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGRlc2NyaWJlIHRoZSBET00gdGhhdCBpc1xuLy8gdXNlZCB0byByZXByZXNlbnQgdGhlIGVkaXRvcidzIGNvbnRlbnQuIFRoZXkgYXJlIHVzZWQgZm9yOlxuLy9cbi8vIC0gSW5jcmVtZW50YWwgcmVkcmF3aW5nIHdoZW4gdGhlIGRvY3VtZW50IGNoYW5nZXNcbi8vXG4vLyAtIEZpZ3VyaW5nIG91dCB3aGF0IHBhcnQgb2YgdGhlIGRvY3VtZW50IGEgZ2l2ZW4gRE9NIHBvc2l0aW9uXG4vLyAgIGNvcnJlc3BvbmRzIHRvXG4vL1xuLy8gLSBXaXJpbmcgaW4gY3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZWRpdGluZyBpbnRlcmZhY2UgZm9yIGFcbi8vICAgZ2l2ZW4gbm9kZVxuLy9cbi8vIFRoZXkgZm9ybSBhIGRvdWJseS1saW5rZWQgbXV0YWJsZSB0cmVlLCBzdGFydGluZyBhdCBgdmlldy5kb2NWaWV3YC5cbmNvbnN0IE5PVF9ESVJUWSA9IDAsIENISUxEX0RJUlRZID0gMSwgQ09OVEVOVF9ESVJUWSA9IDIsIE5PREVfRElSVFkgPSAzO1xuLy8gU3VwZXJjbGFzcyBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRpb25zLiBEZWZpbmVzIHRoZWlyXG4vLyBiYXNpYyBzdHJ1Y3R1cmUgYW5kIHNoYXJlZCBtZXRob2RzLlxuY2xhc3MgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgY2hpbGRyZW4sIGRvbSwgXG4gICAgLy8gVGhpcyBpcyB0aGUgbm9kZSB0aGF0IGhvbGRzIHRoZSBjaGlsZCB2aWV3cy4gSXQgbWF5IGJlIG51bGwgZm9yXG4gICAgLy8gZGVzY3MgdGhhdCBkb24ndCBoYXZlIGNoaWxkcmVuLlxuICAgIGNvbnRlbnRET00pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGNvbnRlbnRET007XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIC8vIEFuIGV4cGFuZG8gcHJvcGVydHkgb24gdGhlIERPTSBub2RlIHByb3ZpZGVzIGEgbGluayBiYWNrIHRvIGl0c1xuICAgICAgICAvLyBkZXNjcmlwdGlvbi5cbiAgICAgICAgZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgIH1cbiAgICAvLyBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBkZXNjcmlwdGlvbiBjb3JyZXNwb25kcyB0byBhXG4gICAgLy8gd2lkZ2V0L21hcmsvbm9kZS5cbiAgICBtYXRjaGVzV2lkZ2V0KHdpZGdldCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzTWFyayhtYXJrKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNIYWNrKG5vZGVOYW1lKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8vIFdoZW4gcGFyc2luZyBpbi1lZGl0b3IgY29udGVudCAoaW4gZG9tY2hhbmdlLmpzKSwgd2UgYWxsb3dcbiAgICAvLyBkZXNjcmlwdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBwYXJzZSBydWxlcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvXG4gICAgLy8gcGFyc2UgdGhlbS5cbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiBudWxsOyB9XG4gICAgLy8gVXNlZCBieSB0aGUgZWRpdG9yJ3MgZXZlbnQgaGFuZGxlciB0byBpZ25vcmUgZXZlbnRzIHRoYXQgY29tZVxuICAgIC8vIGZyb20gY2VydGFpbiBkZXNjcy5cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZXNjLlxuICAgIGdldCBzaXplKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jaGlsZHJlbltpXS5zaXplO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLy8gRm9yIGJsb2NrIG5vZGVzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHNwYWNlIHRha2VuIHVwIGJ5IHRoZWlyXG4gICAgLy8gc3RhcnQvZW5kIHRva2Vucy5cbiAgICBnZXQgYm9yZGVyKCkgeyByZXR1cm4gMDsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5kb20ucG1WaWV3RGVzYyA9PSB0aGlzKVxuICAgICAgICAgICAgdGhpcy5kb20ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHBvc0JlZm9yZUNoaWxkKGNoaWxkKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGN1ciA9PSBjaGlsZClcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGN1ci5zaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwb3NCZWZvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5wb3NCZWZvcmVDaGlsZCh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnBvc0JlZm9yZUNoaWxkKHRoaXMpICsgdGhpcy5ib3JkZXIgOiAwO1xuICAgIH1cbiAgICBnZXQgcG9zQWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSArIHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5zaXplIC0gMiAqIHRoaXMuYm9yZGVyO1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgLy8gSWYgdGhlIERPTSBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGVudCwgdXNlIHRoZSBjaGlsZCBkZXNjIGFmdGVyXG4gICAgICAgIC8vIGl0IHRvIGZpZ3VyZSBvdXQgYSBwb3NpdGlvbi5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChiaWFzIDwgMCkge1xuICAgICAgICAgICAgICAgIGxldCBkb21CZWZvcmUsIGRlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdoaWxlIChkb21CZWZvcmUgJiYgISgoZGVzYyA9IGRvbUJlZm9yZS5wbVZpZXdEZXNjKSAmJiBkZXNjLnBhcmVudCA9PSB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tQmVmb3JlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmVmb3JlID8gdGhpcy5wb3NCZWZvcmVDaGlsZChkZXNjKSArIGRlc2Muc2l6ZSA6IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBkb21BZnRlciwgZGVzYztcbiAgICAgICAgICAgICAgICBpZiAoZG9tID09IHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUFmdGVyID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoZG9tQWZ0ZXIgJiYgISgoZGVzYyA9IGRvbUFmdGVyLnBtVmlld0Rlc2MpICYmIGRlc2MucGFyZW50ID09IHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbUFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBkb21BZnRlciA/IHRoaXMucG9zQmVmb3JlQ2hpbGQoZGVzYykgOiB0aGlzLnBvc0F0RW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIHZhcmlvdXMgaGV1cmlzdGljcywgZmFsbGluZyBiYWNrIG9uIHRoZSBiaWFzXG4gICAgICAgIC8vIHBhcmFtZXRlciwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBwb3NpdGlvbiBhdCB0aGVcbiAgICAgICAgLy8gc3RhcnQgb3IgYXQgdGhlIGVuZCBvZiB0aGlzIHZpZXcgZGVzYy5cbiAgICAgICAgbGV0IGF0RW5kO1xuICAgICAgICBpZiAoZG9tID09IHRoaXMuZG9tICYmIHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgYXRFbmQgPSBvZmZzZXQgPiBkb21JbmRleCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00gIT0gdGhpcy5kb20gJiYgdGhpcy5kb20uY29udGFpbnModGhpcy5jb250ZW50RE9NKSkge1xuICAgICAgICAgICAgYXRFbmQgPSBkb20uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5jb250ZW50RE9NKSAmIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb20uZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IGRvbTs7IHNlYXJjaCA9IHNlYXJjaC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLnByZXZpb3VzU2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhdEVuZCA9PSBudWxsICYmIG9mZnNldCA9PSBkb20uY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoID0gZG9tOzsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGF0RW5kID09IG51bGwgPyBiaWFzID4gMCA6IGF0RW5kKSA/IHRoaXMucG9zQXRFbmQgOiB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIG5lYXJlc3REZXNjKGRvbSwgb25seU5vZGVzID0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChsZXQgZmlyc3QgPSB0cnVlLCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gdGhpcy5nZXREZXNjKGN1ciksIG5vZGVET007XG4gICAgICAgICAgICBpZiAoZGVzYyAmJiAoIW9ubHlOb2RlcyB8fCBkZXNjLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZG9tIGlzIG91dHNpZGUgb2YgdGhpcyBkZXNjJ3Mgbm9kZURPTSwgZG9uJ3QgY291bnQgaXQuXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0ICYmIChub2RlRE9NID0gZGVzYy5ub2RlRE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGVET00ubm9kZVR5cGUgPT0gMSA/IG5vZGVET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkgOiBub2RlRE9NID09IGRvbSkpXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREZXNjKGRvbSkge1xuICAgICAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgICAgICBmb3IgKGxldCBjdXIgPSBkZXNjOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnQpXG4gICAgICAgICAgICBpZiAoY3VyID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxuICAgIHBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IGRvbTsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbGV0IGRlc2MgPSB0aGlzLmdldERlc2Moc2Nhbik7XG4gICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5sb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLy8gRmluZCB0aGUgZGVzYyBmb3IgdGhlIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIHBvcywgaWYgYW55LiAoV2hlbiBhXG4gICAgLy8gcGFyZW50IG5vZGUgb3ZlcnJvZGUgcmVuZGVyaW5nLCB0aGVyZSBtaWdodCBub3QgYmUgb25lLilcbiAgICBkZXNjQXQocG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmZzZXQgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zICYmIGVuZCAhPSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWNoaWxkLmJvcmRlciAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuZGVzY0F0KHBvcyAtIG9mZnNldCAtIGNoaWxkLmJvcmRlcik7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmRvbSwgb2Zmc2V0OiAwLCBhdG9tOiBwb3MgKyAxIH07XG4gICAgICAgIC8vIEZpcnN0IGZpbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBjaGlsZCBhcnJheVxuICAgICAgICBsZXQgaSA9IDAsIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGN1clBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBjdXJQb3MgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcyB8fCBjaGlsZCBpbnN0YW5jZW9mIFRyYWlsaW5nSGFja1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gcG9zIC0gY3VyUG9zO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyUG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoaXMgcG9pbnRzIGludG8gdGhlIG1pZGRsZSBvZiBhIGNoaWxkLCBjYWxsIHRocm91Z2hcbiAgICAgICAgaWYgKG9mZnNldClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUZyb21Qb3Mob2Zmc2V0IC0gdGhpcy5jaGlsZHJlbltpXS5ib3JkZXIsIHNpZGUpO1xuICAgICAgICAvLyBHbyBiYWNrIGlmIHRoZXJlIHdlcmUgYW55IHplcm8tbGVuZ3RoIHdpZGdldHMgd2l0aCBzaWRlID49IDAgYmVmb3JlIHRoaXMgcG9pbnRcbiAgICAgICAgZm9yIChsZXQgcHJldjsgaSAmJiAhKHByZXYgPSB0aGlzLmNoaWxkcmVuW2kgLSAxXSkuc2l6ZSAmJiBwcmV2IGluc3RhbmNlb2YgV2lkZ2V0Vmlld0Rlc2MgJiYgcHJldi5zaWRlID49IDA7IGktLSkgeyB9XG4gICAgICAgIC8vIFNjYW4gdG93YXJkcyB0aGUgZmlyc3QgdXNlYWJsZSBub2RlXG4gICAgICAgIGlmIChzaWRlIDw9IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGktLSwgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSBpID8gdGhpcy5jaGlsZHJlbltpIC0gMV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghcHJldiB8fCBwcmV2LmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldiAmJiBzaWRlICYmIGVudGVyICYmICFwcmV2LmJvcmRlciAmJiAhcHJldi5kb21BdG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LmRvbUZyb21Qb3MocHJldi5zaXplLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBwcmV2ID8gZG9tSW5kZXgocHJldi5kb20pICsgMSA6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKywgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmNoaWxkcmVuW2ldIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHQgJiYgZW50ZXIgJiYgIW5leHQuYm9yZGVyICYmICFuZXh0LmRvbUF0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuZG9tRnJvbVBvcygwLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBuZXh0ID8gZG9tSW5kZXgobmV4dC5kb20pIDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXNlZCB0byBmaW5kIGEgRE9NIHJhbmdlIGluIGEgc2luZ2xlIHBhcmVudCBmb3IgYSBnaXZlbiBjaGFuZ2VkXG4gICAgLy8gcmFuZ2UuXG4gICAgcGFyc2VSYW5nZShmcm9tLCB0bywgYmFzZSA9IDApIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIGZyb20sIHRvLCBmcm9tT2Zmc2V0OiAwLCB0b09mZnNldDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIGxldCBmcm9tT2Zmc2V0ID0gLTEsIHRvT2Zmc2V0ID0gLTE7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IGJhc2UsIGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEgJiYgZnJvbSA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRCYXNlID0gb2Zmc2V0ICsgY2hpbGQuYm9yZGVyO1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIG1heWJlIGRlc2NlbmQgbWFyayB2aWV3cyB0byBwYXJzZSBhIG5hcnJvd2VyIHJhbmdlP1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IGNoaWxkQmFzZSAmJiB0byA8PSBlbmQgLSBjaGlsZC5ib3JkZXIgJiYgY2hpbGQubm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jb250ZW50RE9NICYmIHRoaXMuY29udGVudERPTS5jb250YWlucyhjaGlsZC5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnBhcnNlUmFuZ2UoZnJvbSwgdG8sIGNoaWxkQmFzZSk7XG4gICAgICAgICAgICAgICAgZnJvbSA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuY2hpbGRyZW5baiAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5zaXplICYmIHByZXYuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFwcmV2LmVtcHR5Q2hpbGRBdCgxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9mZnNldCA9IGRvbUluZGV4KHByZXYuZG9tKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcm9tIC09IHByZXYuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGZyb21PZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPiAtMSAmJiAoZW5kID4gdG8gfHwgaSA9PSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICAgICAgdG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuY2hpbGRyZW5bal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LnNpemUgJiYgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00gJiYgIW5leHQuZW1wdHlDaGlsZEF0KC0xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSBkb21JbmRleChuZXh0LmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0byArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b09mZnNldCA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSB0aGlzLmNvbnRlbnRET00uY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50RE9NLCBmcm9tLCB0bywgZnJvbU9mZnNldCwgdG9PZmZzZXQgfTtcbiAgICB9XG4gICAgZW1wdHlDaGlsZEF0KHNpZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuYm9yZGVyIHx8ICF0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3NpZGUgPCAwID8gMCA6IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBjaGlsZC5zaXplID09IDAgfHwgY2hpbGQuZW1wdHlDaGlsZEF0KHNpZGUpO1xuICAgIH1cbiAgICBkb21BZnRlclBvcyhwb3MpIHtcbiAgICAgICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSB0aGlzLmRvbUZyb21Qb3MocG9zLCAwKTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSB8fCBvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhZnRlciBwb3MgXCIgKyBwb3MpO1xuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgfVxuICAgIC8vIFZpZXcgZGVzY3MgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGFueSBzZWxlY3Rpb24gdGhhdCBmYWxsc1xuICAgIC8vIGVudGlyZWx5IGluc2lkZSBvZiB0aGVtLCBzbyB0aGF0IGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgY2FuIGRvXG4gICAgLy8gY3VzdG9tIHRoaW5ncyB3aXRoIHRoZSBzZWxlY3Rpb24uIE5vdGUgdGhhdCB0aGlzIGZhbGxzIGFwYXJ0IHdoZW5cbiAgICAvLyBhIHNlbGVjdGlvbiBzdGFydHMgaW4gc3VjaCBhIG5vZGUgYW5kIGVuZHMgaW4gYW5vdGhlciwgaW4gd2hpY2hcbiAgICAvLyBjYXNlIHdlIGp1c3QgdXNlIHdoYXRldmVyIGRvbUZyb21Qb3MgcHJvZHVjZXMgYXMgYSBiZXN0IGVmZm9ydC5cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCByb290LCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gZmFsbHMgZW50aXJlbHkgaW4gYSBjaGlsZCwgZ2l2ZSBpdCB0byB0aGF0IGNoaWxkXG4gICAgICAgIGxldCBmcm9tID0gTWF0aC5taW4oYW5jaG9yLCBoZWFkKSwgdG8gPSBNYXRoLm1heChhbmNob3IsIGhlYWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IG9mZnNldCAmJiB0byA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2V0U2VsZWN0aW9uKGFuY2hvciAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgaGVhZCAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgcm9vdCwgZm9yY2UpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbmNob3JET00gPSB0aGlzLmRvbUZyb21Qb3MoYW5jaG9yLCBhbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgaGVhZERPTSA9IGhlYWQgPT0gYW5jaG9yID8gYW5jaG9yRE9NIDogdGhpcy5kb21Gcm9tUG9zKGhlYWQsIGhlYWQgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgZG9tU2VsID0gcm9vdC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgbGV0IGJyS2x1ZGdlID0gZmFsc2U7XG4gICAgICAgIC8vIE9uIEZpcmVmb3gsIHVzaW5nIFNlbGVjdGlvbi5jb2xsYXBzZSB0byBwdXQgdGhlIGN1cnNvciBhZnRlciBhXG4gICAgICAgIC8vIEJSIG5vZGUgZm9yIHNvbWUgcmVhc29uIGRvZXNuJ3QgYWx3YXlzIHdvcmsgKCMxMDczKS4gT24gU2FmYXJpLFxuICAgICAgICAvLyB0aGUgY3Vyc29yIHNvbWV0aW1lcyBpbmV4cGxpY2FibGUgdmlzdWFsbHkgbGFncyBiZWhpbmQgaXRzXG4gICAgICAgIC8vIHJlcG9ydGVkIHBvc2l0aW9uIGluIHN1Y2ggc2l0dWF0aW9ucyAoIzEwOTIpLlxuICAgICAgICBpZiAoKGdlY2tvIHx8IHNhZmFyaSkgJiYgYW5jaG9yID09IGhlYWQpIHtcbiAgICAgICAgICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gYW5jaG9yRE9NO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIGJyS2x1ZGdlID0gISEob2Zmc2V0ICYmIG5vZGUubm9kZVZhbHVlW29mZnNldCAtIDFdID09IFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIC8vIElzc3VlICMxMTI4XG4gICAgICAgICAgICAgICAgaWYgKGJyS2x1ZGdlICYmIG9mZnNldCA9PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc2NhbiA9IG5vZGUsIGFmdGVyOyBzY2FuOyBzY2FuID0gc2Nhbi5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPSBzY2FuLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyLm5vZGVOYW1lID09IFwiQlJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRE9NID0gaGVhZERPTSA9IHsgbm9kZTogYWZ0ZXIucGFyZW50Tm9kZSwgb2Zmc2V0OiBkb21JbmRleChhZnRlcikgKyAxIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IHNjYW4ucG1WaWV3RGVzYztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgIGJyS2x1ZGdlID0gcHJldiAmJiAocHJldi5ub2RlTmFtZSA9PSBcIkJSXCIgfHwgcHJldi5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGaXJlZm94IGNhbiBhY3Qgc3RyYW5nZWx5IHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBpbiBmcm9udCBvZiBhblxuICAgICAgICAvLyB1bmVkaXRhYmxlIG5vZGUuIFNlZSAjMTE2MyBhbmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcwOTUzNlxuICAgICAgICBpZiAoZ2Vja28gJiYgZG9tU2VsLmZvY3VzTm9kZSAmJiBkb21TZWwuZm9jdXNOb2RlICE9IGhlYWRET00ubm9kZSAmJiBkb21TZWwuZm9jdXNOb2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IGRvbVNlbC5mb2N1c05vZGUuY2hpbGROb2Rlc1tkb21TZWwuZm9jdXNPZmZzZXRdO1xuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGZvcmNlIHx8IGJyS2x1ZGdlICYmIHNhZmFyaSkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0LCBkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQsIGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIFNlbGVjdGlvbi5leHRlbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuICdpbnZlcnRlZCcgc2VsZWN0aW9uXG4gICAgICAgIC8vIChvbmUgd2hlcmUgdGhlIGZvY3VzIGlzIGJlZm9yZSB0aGUgYW5jaG9yKSwgYnV0IG5vdCBhbGxcbiAgICAgICAgLy8gYnJvd3NlcnMgc3VwcG9ydCBpdCB5ZXQuXG4gICAgICAgIGxldCBkb21TZWxFeHRlbmRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoKGRvbVNlbC5leHRlbmQgfHwgYW5jaG9yID09IGhlYWQpICYmICFicktsdWRnZSkge1xuICAgICAgICAgICAgZG9tU2VsLmNvbGxhcHNlKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvciAhPSBoZWFkKVxuICAgICAgICAgICAgICAgICAgICBkb21TZWwuZXh0ZW5kKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGRvbVNlbEV4dGVuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcyB3aXRoIENocm9tZSB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFmdGVyIGNhbGxpbmdcbiAgICAgICAgICAgICAgICAvLyBjb2xsYXBzZSwgZXZlbiB3aGVuIGl0IHNob3VsZCBiZSB2YWxpZC4gVGhpcyBhcHBlYXJzIHRvIGJlIGEgYnVnLCBidXRcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBkaWZmaWN1bHQgdG8gaXNvbGF0ZS4gSWYgdGhpcyBoYXBwZW5zIGZhbGxiYWNrIHRvIHRoZSBvbGQgcGF0aFxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdXNpbmcgZXh0ZW5kLlxuICAgICAgICAgICAgICAgIC8vIFNpbWlsYXJseSwgdGhpcyBjb3VsZCBjcmFzaCBvbiBTYWZhcmkgaWYgdGhlIGVkaXRvciBpcyBoaWRkZW4sIGFuZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdhcyBubyBzZWxlY3Rpb24uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb21TZWxFeHRlbmRlZCkge1xuICAgICAgICAgICAgaWYgKGFuY2hvciA+IGhlYWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdG1wID0gYW5jaG9yRE9NO1xuICAgICAgICAgICAgICAgIGFuY2hvckRPTSA9IGhlYWRET007XG4gICAgICAgICAgICAgICAgaGVhZERPTSA9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoaGVhZERPTS5ub2RlLCBoZWFkRE9NLm9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChhbmNob3JET00ubm9kZSwgYW5jaG9yRE9NLm9mZnNldCk7XG4gICAgICAgICAgICBkb21TZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBkb21TZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250ZW50RE9NICYmIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIjtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRMb3N0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50RE9NICYmIHRoaXMuY29udGVudERPTSAhPSB0aGlzLmRvbSAmJiAhdGhpcy5kb20uY29udGFpbnModGhpcy5jb250ZW50RE9NKTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGEgc3VidHJlZSBvZiB0aGUgZWxlbWVudCB0cmVlIHRoYXQgaGFzIGJlZW4gdG91Y2hlZFxuICAgIC8vIGJ5IGEgRE9NIGNoYW5nZSwgc28gdGhhdCB0aGUgbmV4dCB1cGRhdGUgd2lsbCByZWRyYXcgaXQuXG4gICAgbWFya0RpcnR5KGZyb20sIHRvKSB7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDAsIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gZW5kID8gZnJvbSA8PSBlbmQgJiYgdG8gPj0gb2Zmc2V0IDogZnJvbSA8IGVuZCAmJiB0byA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydEluc2lkZSA9IG9mZnNldCArIGNoaWxkLmJvcmRlciwgZW5kSW5zaWRlID0gZW5kIC0gY2hpbGQuYm9yZGVyO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IHN0YXJ0SW5zaWRlICYmIHRvIDw9IGVuZEluc2lkZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcnR5ID0gZnJvbSA9PSBvZmZzZXQgfHwgdG8gPT0gZW5kID8gQ09OVEVOVF9ESVJUWSA6IENISUxEX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA9PSBzdGFydEluc2lkZSAmJiB0byA9PSBlbmRJbnNpZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGlsZC5jb250ZW50TG9zdCB8fCBjaGlsZC5kb20ucGFyZW50Tm9kZSAhPSB0aGlzLmNvbnRlbnRET00pKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBOT0RFX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tYXJrRGlydHkoZnJvbSAtIHN0YXJ0SW5zaWRlLCB0byAtIHN0YXJ0SW5zaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBjaGlsZC5kb20gPT0gY2hpbGQuY29udGVudERPTSAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00gJiYgIWNoaWxkLmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBDT05URU5UX0RJUlRZIDogTk9ERV9ESVJUWTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eSA9IENPTlRFTlRfRElSVFk7XG4gICAgfVxuICAgIG1hcmtQYXJlbnRzRGlydHkoKSB7XG4gICAgICAgIGxldCBsZXZlbCA9IDE7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSB0aGlzLnBhcmVudDsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50LCBsZXZlbCsrKSB7XG4gICAgICAgICAgICBsZXQgZGlydHkgPSBsZXZlbCA9PSAxID8gQ09OVEVOVF9ESVJUWSA6IENISUxEX0RJUlRZO1xuICAgICAgICAgICAgaWYgKG5vZGUuZGlydHkgPCBkaXJ0eSlcbiAgICAgICAgICAgICAgICBub2RlLmRpcnR5ID0gZGlydHk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRvbUF0b20oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpZ25vcmVGb3JDb29yZHMoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuLy8gQSB3aWRnZXQgZGVzYyByZXByZXNlbnRzIGEgd2lkZ2V0IGRlY29yYXRpb24sIHdoaWNoIGlzIGEgRE9NIG5vZGVcbi8vIGRyYXduIGJldHdlZW4gdGhlIGRvY3VtZW50IG5vZGVzLlxuY2xhc3MgV2lkZ2V0Vmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCB3aWRnZXQsIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgc2VsZiwgZG9tID0gd2lkZ2V0LnR5cGUudG9ET007XG4gICAgICAgIGlmICh0eXBlb2YgZG9tID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGRvbSA9IGRvbSh2aWV3LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWxmKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnBhcmVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50LnBvc0JlZm9yZUNoaWxkKHNlbGYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICghd2lkZ2V0LnR5cGUuc3BlYy5yYXcpIHtcbiAgICAgICAgICAgIGlmIChkb20ubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgICAgIGxldCB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICAgICAgd3JhcC5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IHdyYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5hZGQoXCJQcm9zZU1pcnJvci13aWRnZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBudWxsKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICBzZWxmID0gdGhpcztcbiAgICB9XG4gICAgbWF0Y2hlc1dpZGdldCh3aWRnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlydHkgPT0gTk9UX0RJUlRZICYmIHdpZGdldC50eXBlLmVxKHRoaXMud2lkZ2V0LnR5cGUpO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiB7IGlnbm9yZTogdHJ1ZSB9OyB9XG4gICAgc3RvcEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGxldCBzdG9wID0gdGhpcy53aWRnZXQuc3BlYy5zdG9wRXZlbnQ7XG4gICAgICAgIHJldHVybiBzdG9wID8gc3RvcChldmVudCkgOiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIiB8fCB0aGlzLndpZGdldC5zcGVjLmlnbm9yZVNlbGVjdGlvbjtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy53aWRnZXQudHlwZS5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgc2lkZSgpIHsgcmV0dXJuIHRoaXMud2lkZ2V0LnR5cGUuc2lkZTsgfVxufVxuY2xhc3MgQ29tcG9zaXRpb25WaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIGRvbSwgdGV4dERPTSwgdGV4dCkge1xuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIG51bGwpO1xuICAgICAgICB0aGlzLnRleHRET00gPSB0ZXh0RE9NO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKGRvbSAhPSB0aGlzLnRleHRET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgKG9mZnNldCA/IHRoaXMuc2l6ZSA6IDApO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgb2Zmc2V0O1xuICAgIH1cbiAgICBkb21Gcm9tUG9zKHBvcykge1xuICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLnRleHRET00sIG9mZnNldDogcG9zIH07XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dCkge1xuICAgICAgICByZXR1cm4gbXV0LnR5cGUgPT09ICdjaGFyYWN0ZXJEYXRhJyAmJiBtdXQudGFyZ2V0Lm5vZGVWYWx1ZSA9PSBtdXQub2xkVmFsdWU7XG4gICAgfVxufVxuLy8gQSBtYXJrIGRlc2MgcmVwcmVzZW50cyBhIG1hcmsuIE1heSBoYXZlIG11bHRpcGxlIGNoaWxkcmVuLFxuLy8gZGVwZW5kaW5nIG9uIGhvdyB0aGUgbWFyayBpcyBzcGxpdC4gTm90ZSB0aGF0IG1hcmtzIGFyZSBkcmF3biB1c2luZ1xuLy8gYSBmaXhlZCBuZXN0aW5nIG9yZGVyLCBmb3Igc2ltcGxpY2l0eSBhbmQgcHJlZGljdGFiaWxpdHksIHNvIGluXG4vLyBzb21lIGNhc2VzIHRoZXkgd2lsbCBiZSBzcGxpdCBtb3JlIG9mdGVuIHRoYW4gd291bGQgYXBwZWFyXG4vLyBuZWNlc3NhcnkuXG5jbGFzcyBNYXJrVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBtYXJrLCBkb20sIGNvbnRlbnRET00pIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBjb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShwYXJlbnQsIG1hcmssIGlubGluZSwgdmlldykge1xuICAgICAgICBsZXQgY3VzdG9tID0gdmlldy5ub2RlVmlld3NbbWFyay50eXBlLm5hbWVdO1xuICAgICAgICBsZXQgc3BlYyA9IGN1c3RvbSAmJiBjdXN0b20obWFyaywgdmlldywgaW5saW5lKTtcbiAgICAgICAgaWYgKCFzcGVjIHx8ICFzcGVjLmRvbSlcbiAgICAgICAgICAgIHNwZWMgPSBET01TZXJpYWxpemVyLnJlbmRlclNwZWMoZG9jdW1lbnQsIG1hcmsudHlwZS5zcGVjLnRvRE9NKG1hcmssIGlubGluZSkpO1xuICAgICAgICByZXR1cm4gbmV3IE1hcmtWaWV3RGVzYyhwYXJlbnQsIG1hcmssIHNwZWMuZG9tLCBzcGVjLmNvbnRlbnRET00gfHwgc3BlYy5kb20pO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7XG4gICAgICAgIGlmICgodGhpcy5kaXJ0eSAmIE5PREVfRElSVFkpIHx8IHRoaXMubWFyay50eXBlLnNwZWMucmVwYXJzZUluVmlldylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4geyBtYXJrOiB0aGlzLm1hcmsudHlwZS5uYW1lLCBhdHRyczogdGhpcy5tYXJrLmF0dHJzLCBjb250ZW50RWxlbWVudDogdGhpcy5jb250ZW50RE9NIH07XG4gICAgfVxuICAgIG1hdGNoZXNNYXJrKG1hcmspIHsgcmV0dXJuIHRoaXMuZGlydHkgIT0gTk9ERV9ESVJUWSAmJiB0aGlzLm1hcmsuZXEobWFyayk7IH1cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgc3VwZXIubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgLy8gTW92ZSBkaXJ0eSBpbmZvIHRvIG5lYXJlc3Qgbm9kZSB2aWV3XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ICE9IE5PVF9ESVJUWSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgd2hpbGUgKCFwYXJlbnQubm9kZSlcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgICAgICAgaWYgKHBhcmVudC5kaXJ0eSA8IHRoaXMuZGlydHkpXG4gICAgICAgICAgICAgICAgcGFyZW50LmRpcnR5ID0gdGhpcy5kaXJ0eTtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2xpY2UoZnJvbSwgdG8sIHZpZXcpIHtcbiAgICAgICAgbGV0IGNvcHkgPSBNYXJrVmlld0Rlc2MuY3JlYXRlKHRoaXMucGFyZW50LCB0aGlzLm1hcmssIHRydWUsIHZpZXcpO1xuICAgICAgICBsZXQgbm9kZXMgPSB0aGlzLmNoaWxkcmVuLCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBpZiAodG8gPCBzaXplKVxuICAgICAgICAgICAgbm9kZXMgPSByZXBsYWNlTm9kZXMobm9kZXMsIHRvLCBzaXplLCB2aWV3KTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgbm9kZXMgPSByZXBsYWNlTm9kZXMobm9kZXMsIDAsIGZyb20sIHZpZXcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgbm9kZXNbaV0ucGFyZW50ID0gY29weTtcbiAgICAgICAgY29weS5jaGlsZHJlbiA9IG5vZGVzO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG4vLyBOb2RlIHZpZXcgZGVzY3MgYXJlIHRoZSBtYWluLCBtb3N0IGNvbW1vbiB0eXBlIG9mIHZpZXcgZGVzYywgYW5kXG4vLyBjb3JyZXNwb25kIHRvIGFuIGFjdHVhbCBub2RlIGluIHRoZSBkb2N1bWVudC4gVW5saWtlIG1hcmsgZGVzY3MsXG4vLyB0aGV5IHBvcHVsYXRlIHRoZWlyIGNoaWxkIGFycmF5IHRoZW1zZWx2ZXMuXG5jbGFzcyBOb2RlVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NLCBub2RlRE9NLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBjb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vdXRlckRlY28gPSBvdXRlckRlY287XG4gICAgICAgIHRoaXMuaW5uZXJEZWNvID0gaW5uZXJEZWNvO1xuICAgICAgICB0aGlzLm5vZGVET00gPSBub2RlRE9NO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0LCBhIG5vZGUgaXMgcmVuZGVyZWQgdXNpbmcgdGhlIGB0b0RPTWAgbWV0aG9kIGZyb20gdGhlXG4gICAgLy8gbm9kZSB0eXBlIHNwZWMuIEJ1dCBjbGllbnQgY29kZSBjYW4gdXNlIHRoZSBgbm9kZVZpZXdzYCBzcGVjIHRvXG4gICAgLy8gc3VwcGx5IGEgY3VzdG9tIG5vZGUgdmlldywgd2hpY2ggY2FuIGluZmx1ZW5jZSB2YXJpb3VzIGFzcGVjdHMgb2ZcbiAgICAvLyB0aGUgd2F5IHRoZSBub2RlIHdvcmtzLlxuICAgIC8vXG4gICAgLy8gKFVzaW5nIHN1YmNsYXNzaW5nIGZvciB0aGlzIHdhcyBpbnRlbnRpb25hbGx5IGRlY2lkZWQgYWdhaW5zdCxcbiAgICAvLyBzaW5jZSBpdCdkIHJlcXVpcmUgZXhwb3NpbmcgYSB3aG9sZSBzbGV3IG9mIGZpbmlja3lcbiAgICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIHRoZSB1c2VyIGNvZGUgdGhhdCB0aGV5IHByb2JhYmx5IHdpbGxcbiAgICAvLyBuZXZlciBuZWVkLilcbiAgICBzdGF0aWMgY3JlYXRlKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgY3VzdG9tID0gdmlldy5ub2RlVmlld3Nbbm9kZS50eXBlLm5hbWVdLCBkZXNjT2JqO1xuICAgICAgICBsZXQgc3BlYyA9IGN1c3RvbSAmJiBjdXN0b20obm9kZSwgdmlldywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gKFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGFsbG93cyB0aGUgY3VzdG9tIHZpZXcgdG8gZmluZCBpdHNcbiAgICAgICAgICAgIC8vIG93biBwb3NpdGlvbilcbiAgICAgICAgICAgIGlmICghZGVzY09iailcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgaWYgKGRlc2NPYmoucGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBkZXNjT2JqLnBhcmVudC5wb3NCZWZvcmVDaGlsZChkZXNjT2JqKTtcbiAgICAgICAgfSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pO1xuICAgICAgICBsZXQgZG9tID0gc3BlYyAmJiBzcGVjLmRvbSwgY29udGVudERPTSA9IHNwZWMgJiYgc3BlYy5jb250ZW50RE9NO1xuICAgICAgICBpZiAobm9kZS5pc1RleHQpIHtcbiAgICAgICAgICAgIGlmICghZG9tKVxuICAgICAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5vZGUudGV4dCk7XG4gICAgICAgICAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgIT0gMylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRleHQgbXVzdCBiZSByZW5kZXJlZCBhcyBhIERPTSB0ZXh0IG5vZGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWRvbSkge1xuICAgICAgICAgICAgKHsgZG9tLCBjb250ZW50RE9NIH0gPSBET01TZXJpYWxpemVyLnJlbmRlclNwZWMoZG9jdW1lbnQsIG5vZGUudHlwZS5zcGVjLnRvRE9NKG5vZGUpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250ZW50RE9NICYmICFub2RlLmlzVGV4dCAmJiBkb20ubm9kZU5hbWUgIT0gXCJCUlwiKSB7IC8vIENocm9tZSBnZXRzIGNvbmZ1c2VkIGJ5IDxiciBjb250ZW50ZWRpdGFibGU9ZmFsc2U+XG4gICAgICAgICAgICBpZiAoIWRvbS5oYXNBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIikpXG4gICAgICAgICAgICAgICAgZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgZG9tLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5vZGVET00gPSBkb207XG4gICAgICAgIGRvbSA9IGFwcGx5T3V0ZXJEZWNvKGRvbSwgb3V0ZXJEZWNvLCBub2RlKTtcbiAgICAgICAgaWYgKHNwZWMpXG4gICAgICAgICAgICByZXR1cm4gZGVzY09iaiA9IG5ldyBDdXN0b21Ob2RlVmlld0Rlc2MocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NIHx8IG51bGwsIG5vZGVET00sIHNwZWMsIHZpZXcsIHBvcyArIDEpO1xuICAgICAgICBlbHNlIGlmIChub2RlLmlzVGV4dClcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFZpZXdEZXNjKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgbm9kZURPTSwgdmlldyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZVZpZXdEZXNjKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSB8fCBudWxsLCBub2RlRE9NLCB2aWV3LCBwb3MgKyAxKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICAvLyBFeHBlcmltZW50YWwga2x1ZGdlIHRvIGFsbG93IG9wdC1pbiByZS1wYXJzaW5nIG9mIG5vZGVzXG4gICAgICAgIGlmICh0aGlzLm5vZGUudHlwZS5zcGVjLnJlcGFyc2VJblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRklYTUUgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGNhbiBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIGF0dHJzIG1lYW5zIHRoYXQgaWYgdGhlIHVzZXIgc29tZWhvdyBtYW5hZ2VzIHRvIGNoYW5nZSB0aGVcbiAgICAgICAgLy8gYXR0cnMgaW4gdGhlIGRvbSwgdGhhdCB3b24ndCBiZSBwaWNrZWQgdXAuIE5vdCBlbnRpcmVseSBzdXJlXG4gICAgICAgIC8vIHdoZXRoZXIgdGhpcyBpcyBhIHByb2JsZW1cbiAgICAgICAgbGV0IHJ1bGUgPSB7IG5vZGU6IHRoaXMubm9kZS50eXBlLm5hbWUsIGF0dHJzOiB0aGlzLm5vZGUuYXR0cnMgfTtcbiAgICAgICAgaWYgKHRoaXMubm9kZS50eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIilcbiAgICAgICAgICAgIHJ1bGUucHJlc2VydmVXaGl0ZXNwYWNlID0gXCJmdWxsXCI7XG4gICAgICAgIGlmICghdGhpcy5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICBydWxlLmdldENvbnRlbnQgPSAoKSA9PiB0aGlzLm5vZGUuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZW50TG9zdCkge1xuICAgICAgICAgICAgcnVsZS5jb250ZW50RWxlbWVudCA9IHRoaXMuY29udGVudERPTTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIENocm9tZSBsaWtlcyB0byByYW5kb21seSByZWNyZWF0ZSBwYXJlbnQgbm9kZXMgd2hlblxuICAgICAgICAgICAgLy8gYmFja3NwYWNpbmcgdGhpbmdzLiBXaGVuIHRoYXQgaGFwcGVucywgdGhpcyB0cmllcyB0byBmaW5kIHRoZVxuICAgICAgICAgICAgLy8gbmV3IHBhcmVudC5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb20uY29udGFpbnMoY2hpbGQuZG9tLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUuY29udGVudEVsZW1lbnQgPSBjaGlsZC5kb20ucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFydWxlLmNvbnRlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJ1bGUuZ2V0Q29udGVudCA9ICgpID0+IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydWxlO1xuICAgIH1cbiAgICBtYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJ0eSA9PSBOT1RfRElSVFkgJiYgbm9kZS5lcSh0aGlzLm5vZGUpICYmXG4gICAgICAgICAgICBzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgdGhpcy5vdXRlckRlY28pICYmIGlubmVyRGVjby5lcSh0aGlzLmlubmVyRGVjbyk7XG4gICAgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy5ub2RlLm5vZGVTaXplOyB9XG4gICAgZ2V0IGJvcmRlcigpIHsgcmV0dXJuIHRoaXMubm9kZS5pc0xlYWYgPyAwIDogMTsgfVxuICAgIC8vIFN5bmNzIGB0aGlzLmNoaWxkcmVuYCB0byBtYXRjaCBgdGhpcy5ub2RlLmNvbnRlbnRgIGFuZCB0aGUgbG9jYWxcbiAgICAvLyBkZWNvcmF0aW9ucywgcG9zc2libHkgaW50cm9kdWNpbmcgbmVzdGluZyBmb3IgbWFya3MuIFRoZW4sIGluIGFcbiAgICAvLyBzZXBhcmF0ZSBzdGVwLCBzeW5jcyB0aGUgRE9NIGluc2lkZSBgdGhpcy5jb250ZW50RE9NYCB0b1xuICAgIC8vIGB0aGlzLmNoaWxkcmVuYC5cbiAgICB1cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IGlubGluZSA9IHRoaXMubm9kZS5pbmxpbmVDb250ZW50LCBvZmYgPSBwb3M7XG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IHZpZXcuY29tcG9zaW5nID8gdGhpcy5sb2NhbENvbXBvc2l0aW9uSW5mbyh2aWV3LCBwb3MpIDogbnVsbDtcbiAgICAgICAgbGV0IGxvY2FsQ29tcG9zaXRpb24gPSBjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5wb3MgPiAtMSA/IGNvbXBvc2l0aW9uIDogbnVsbDtcbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uSW5DaGlsZCA9IGNvbXBvc2l0aW9uICYmIGNvbXBvc2l0aW9uLnBvcyA8IDA7XG4gICAgICAgIGxldCB1cGRhdGVyID0gbmV3IFZpZXdUcmVlVXBkYXRlcih0aGlzLCBsb2NhbENvbXBvc2l0aW9uICYmIGxvY2FsQ29tcG9zaXRpb24ubm9kZSwgdmlldyk7XG4gICAgICAgIGl0ZXJEZWNvKHRoaXMubm9kZSwgdGhpcy5pbm5lckRlY28sICh3aWRnZXQsIGksIGluc2lkZU5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmICh3aWRnZXQuc3BlYy5tYXJrcylcbiAgICAgICAgICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKHdpZGdldC5zcGVjLm1hcmtzLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgZWxzZSBpZiAod2lkZ2V0LnR5cGUuc2lkZSA+PSAwICYmICFpbnNpZGVOb2RlKVxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3MoaSA9PSB0aGlzLm5vZGUuY2hpbGRDb3VudCA/IE1hcmsubm9uZSA6IHRoaXMubm9kZS5jaGlsZChpKS5tYXJrcywgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IG5vZGUgaXMgYSBkZXNjIG1hdGNoaW5nIHRoaXMgd2lkZ2V0LCByZXVzZSBpdCxcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBpbnNlcnQgdGhlIHdpZGdldCBhcyBhIG5ldyB2aWV3IGRlc2MuXG4gICAgICAgICAgICB1cGRhdGVyLnBsYWNlV2lkZ2V0KHdpZGdldCwgdmlldywgb2ZmKTtcbiAgICAgICAgfSwgKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgaSkgPT4ge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB3cmFwcGluZyBtYXJrIGRlc2NzIG1hdGNoIHRoZSBub2RlJ3MgbWFya3MuXG4gICAgICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKGNoaWxkLm1hcmtzLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgLy8gVHJ5IHNldmVyYWwgc3RyYXRlZ2llcyBmb3IgZHJhd2luZyB0aGlzIG5vZGVcbiAgICAgICAgICAgIGxldCBjb21wSW5kZXg7XG4gICAgICAgICAgICBpZiAodXBkYXRlci5maW5kTm9kZU1hdGNoKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgaSkpIDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBvc2l0aW9uSW5DaGlsZCAmJiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tID4gb2ZmICYmXG4gICAgICAgICAgICAgICAgdmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gPCBvZmYgKyBjaGlsZC5ub2RlU2l6ZSAmJlxuICAgICAgICAgICAgICAgIChjb21wSW5kZXggPSB1cGRhdGVyLmZpbmRJbmRleFdpdGhDaGlsZChjb21wb3NpdGlvbi5ub2RlKSkgPiAtMSAmJlxuICAgICAgICAgICAgICAgIHVwZGF0ZXIudXBkYXRlTm9kZUF0KGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgY29tcEluZGV4LCB2aWV3KSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAodXBkYXRlci51cGRhdGVOZXh0Tm9kZShjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIGksIG9mZikpIDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBpdCBhcyBhIG5ldyB2aWV3XG4gICAgICAgICAgICAgICAgdXBkYXRlci5hZGROb2RlKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgb2ZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIERyb3AgYWxsIHJlbWFpbmluZyBkZXNjcyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyhbXSwgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5pc1RleHRibG9jaylcbiAgICAgICAgICAgIHVwZGF0ZXIuYWRkVGV4dGJsb2NrSGFja3MoKTtcbiAgICAgICAgdXBkYXRlci5kZXN0cm95UmVzdCgpO1xuICAgICAgICAvLyBTeW5jIHRoZSBET00gaWYgYW55dGhpbmcgY2hhbmdlZFxuICAgICAgICBpZiAodXBkYXRlci5jaGFuZ2VkIHx8IHRoaXMuZGlydHkgPT0gQ09OVEVOVF9ESVJUWSkge1xuICAgICAgICAgICAgLy8gTWF5IGhhdmUgdG8gcHJvdGVjdCBmb2N1c2VkIERPTSBmcm9tIGJlaW5nIGNoYW5nZWQgaWYgYSBjb21wb3NpdGlvbiBpcyBhY3RpdmVcbiAgICAgICAgICAgIGlmIChsb2NhbENvbXBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdGVjdExvY2FsQ29tcG9zaXRpb24odmlldywgbG9jYWxDb21wb3NpdGlvbik7XG4gICAgICAgICAgICByZW5kZXJEZXNjcyh0aGlzLmNvbnRlbnRET00sIHRoaXMuY2hpbGRyZW4sIHZpZXcpO1xuICAgICAgICAgICAgaWYgKGlvcylcbiAgICAgICAgICAgICAgICBpb3NIYWNrcyh0aGlzLmRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9jYWxDb21wb3NpdGlvbkluZm8odmlldywgcG9zKSB7XG4gICAgICAgIC8vIE9ubHkgZG8gc29tZXRoaW5nIGlmIGJvdGggdGhlIHNlbGVjdGlvbiBhbmQgYSBmb2N1c2VkIHRleHQgbm9kZVxuICAgICAgICAvLyBhcmUgaW5zaWRlIG9mIHRoaXMgbm9kZVxuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmICghKHZpZXcuc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgfHwgZnJvbSA8IHBvcyB8fCB0byA+IHBvcyArIHRoaXMubm9kZS5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IHRleHROb2RlID0gbmVhcmJ5VGV4dE5vZGUoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgICAgaWYgKCF0ZXh0Tm9kZSB8fCAhdGhpcy5kb20uY29udGFpbnModGV4dE5vZGUucGFyZW50Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSB0ZXh0IGluIHRoZSBmb2N1c2VkIG5vZGUgaW4gdGhlIG5vZGUsIHN0b3AgaWYgaXQncyBub3RcbiAgICAgICAgICAgIC8vIHRoZXJlIChtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHRocm91Z2ggb3RoZXIgbWVhbnMsIGluIHdoaWNoXG4gICAgICAgICAgICAvLyBjYXNlIGl0IHNob3VsZCBvdmVyd3JpdHRlbilcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgbGV0IHRleHRQb3MgPSBmaW5kVGV4dEluRnJhZ21lbnQodGhpcy5ub2RlLmNvbnRlbnQsIHRleHQsIGZyb20gLSBwb3MsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0UG9zIDwgMCA/IG51bGwgOiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IHRleHRQb3MsIHRleHQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IC0xLCB0ZXh0OiBcIlwiIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdExvY2FsQ29tcG9zaXRpb24odmlldywgeyBub2RlLCBwb3MsIHRleHQgfSkge1xuICAgICAgICAvLyBUaGUgbm9kZSBpcyBhbHJlYWR5IHBhcnQgb2YgYSBsb2NhbCB2aWV3IGRlc2MsIGxlYXZlIGl0IHRoZXJlXG4gICAgICAgIGlmICh0aGlzLmdldERlc2Mobm9kZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0aW9uIHZpZXcgZm9yIHRoZSBvcnBoYW5lZCBub2Rlc1xuICAgICAgICBsZXQgdG9wTm9kZSA9IG5vZGU7XG4gICAgICAgIGZvciAoOzsgdG9wTm9kZSA9IHRvcE5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKHRvcE5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB3aGlsZSAodG9wTm9kZS5wcmV2aW91c1NpYmxpbmcpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvcE5vZGUucHJldmlvdXNTaWJsaW5nKTtcbiAgICAgICAgICAgIHdoaWxlICh0b3BOb2RlLm5leHRTaWJsaW5nKVxuICAgICAgICAgICAgICAgIHRvcE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b3BOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIGlmICh0b3BOb2RlLnBtVmlld0Rlc2MpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wbVZpZXdEZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZXNjID0gbmV3IENvbXBvc2l0aW9uVmlld0Rlc2ModGhpcywgdG9wTm9kZSwgbm9kZSwgdGV4dCk7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5wdXNoKGRlc2MpO1xuICAgICAgICAvLyBQYXRjaCB1cCB0aGlzLmNoaWxkcmVuIHRvIGNvbnRhaW4gdGhlIGNvbXBvc2l0aW9uIHZpZXdcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHJlcGxhY2VOb2Rlcyh0aGlzLmNoaWxkcmVuLCBwb3MsIHBvcyArIHRleHQubGVuZ3RoLCB2aWV3LCBkZXNjKTtcbiAgICB9XG4gICAgLy8gSWYgdGhpcyBkZXNjIG11c3QgYmUgdXBkYXRlZCB0byBtYXRjaCB0aGUgZ2l2ZW4gbm9kZSBkZWNvcmF0aW9uLFxuICAgIC8vIGRvIHNvIGFuZCByZXR1cm4gdHJ1ZS5cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSB8fFxuICAgICAgICAgICAgIW5vZGUuc2FtZU1hcmt1cCh0aGlzLm5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuaW5uZXJEZWNvID0gaW5uZXJEZWNvO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbih2aWV3LCB0aGlzLnBvc0F0U3RhcnQpO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgIH1cbiAgICB1cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKSB7XG4gICAgICAgIGlmIChzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgdGhpcy5vdXRlckRlY28pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbmVlZHNXcmFwID0gdGhpcy5ub2RlRE9NLm5vZGVUeXBlICE9IDE7XG4gICAgICAgIGxldCBvbGRET00gPSB0aGlzLmRvbTtcbiAgICAgICAgdGhpcy5kb20gPSBwYXRjaE91dGVyRGVjbyh0aGlzLmRvbSwgdGhpcy5ub2RlRE9NLCBjb21wdXRlT3V0ZXJEZWNvKHRoaXMub3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCksIGNvbXB1dGVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCkpO1xuICAgICAgICBpZiAodGhpcy5kb20gIT0gb2xkRE9NKSB7XG4gICAgICAgICAgICBvbGRET00ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0ZXJEZWNvID0gb3V0ZXJEZWNvO1xuICAgIH1cbiAgICAvLyBNYXJrIHRoaXMgbm9kZSBhcyBiZWluZyB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5ub2RlRE9NLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICB0aGlzLm5vZGVET00uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSB8fCAhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICB0aGlzLmRvbS5kcmFnZ2FibGUgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgbm9kZSBtYXJraW5nIGZyb20gdGhpcyBub2RlLlxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZURPTS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5ub2RlRE9NLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1zZWxlY3RlZG5vZGVcIik7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMubm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlQXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRoaXMubm9kZS5pc0F0b207IH1cbn1cbi8vIENyZWF0ZSBhIHZpZXcgZGVzYyBmb3IgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCBub2RlLCB0byBiZSBleHBvcnRlZFxuLy8gYW5kIHVzZWQgYnkgdGhlIHZpZXcgY2xhc3MuXG5mdW5jdGlvbiBkb2NWaWV3RGVzYyhkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIHZpZXcpIHtcbiAgICBhcHBseU91dGVyRGVjbyhkb20sIG91dGVyRGVjbywgZG9jKTtcbiAgICBsZXQgZG9jVmlldyA9IG5ldyBOb2RlVmlld0Rlc2ModW5kZWZpbmVkLCBkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGRvbSwgZG9tLCB2aWV3LCAwKTtcbiAgICBpZiAoZG9jVmlldy5jb250ZW50RE9NKVxuICAgICAgICBkb2NWaWV3LnVwZGF0ZUNoaWxkcmVuKHZpZXcsIDApO1xuICAgIHJldHVybiBkb2NWaWV3O1xufVxuY2xhc3MgVGV4dFZpZXdEZXNjIGV4dGVuZHMgTm9kZVZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG5vZGVET00sIHZpZXcpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBudWxsLCBub2RlRE9NLCB2aWV3LCAwKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICBsZXQgc2tpcCA9IHRoaXMubm9kZURPTS5wYXJlbnROb2RlO1xuICAgICAgICB3aGlsZSAoc2tpcCAmJiBza2lwICE9IHRoaXMuZG9tICYmICFza2lwLnBtSXNEZWNvKVxuICAgICAgICAgICAgc2tpcCA9IHNraXAucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIHsgc2tpcDogKHNraXAgfHwgdHJ1ZSkgfTtcbiAgICB9XG4gICAgdXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ID09IE5PREVfRElSVFkgfHwgKHRoaXMuZGlydHkgIT0gTk9UX0RJUlRZICYmICF0aGlzLmluUGFyZW50KCkpIHx8XG4gICAgICAgICAgICAhbm9kZS5zYW1lTWFya3VwKHRoaXMubm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIGlmICgodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkgfHwgbm9kZS50ZXh0ICE9IHRoaXMubm9kZS50ZXh0KSAmJiBub2RlLnRleHQgIT0gdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSA9IG5vZGUudGV4dDtcbiAgICAgICAgICAgIGlmICh2aWV3LnRyYWNrV3JpdGVzID09IHRoaXMubm9kZURPTSlcbiAgICAgICAgICAgICAgICB2aWV3LnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaW5QYXJlbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnRET00gPSB0aGlzLnBhcmVudC5jb250ZW50RE9NO1xuICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5ub2RlRE9NOyBuOyBuID0gbi5wYXJlbnROb2RlKVxuICAgICAgICAgICAgaWYgKG4gPT0gcGFyZW50RE9NKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMubm9kZURPTSwgb2Zmc2V0OiBwb3MgfTtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIGlmIChkb20gPT0gdGhpcy5ub2RlRE9NKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIE1hdGgubWluKG9mZnNldCwgdGhpcy5ub2RlLnRleHQubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmxvY2FsUG9zRnJvbURPTShkb20sIG9mZnNldCwgYmlhcyk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGlvbi50eXBlICE9IFwiY2hhcmFjdGVyRGF0YVwiICYmIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIjtcbiAgICB9XG4gICAgc2xpY2UoZnJvbSwgdG8sIHZpZXcpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLm5vZGUuY3V0KGZyb20sIHRvKSwgZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Vmlld0Rlc2ModGhpcy5wYXJlbnQsIG5vZGUsIHRoaXMub3V0ZXJEZWNvLCB0aGlzLmlubmVyRGVjbywgZG9tLCBkb20sIHZpZXcpO1xuICAgIH1cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgc3VwZXIubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tICE9IHRoaXMubm9kZURPTSAmJiAoZnJvbSA9PSAwIHx8IHRvID09IHRoaXMubm9kZURPTS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBOT0RFX0RJUlRZO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vLyBBIGR1bW15IGRlc2MgdXNlZCB0byB0YWcgdHJhaWxpbmcgQlIgb3IgSU1HIG5vZGVzIGNyZWF0ZWQgdG8gd29ya1xuLy8gYXJvdW5kIGNvbnRlbnRFZGl0YWJsZSB0ZXJyaWJsZW5lc3MuXG5jbGFzcyBUcmFpbGluZ0hhY2tWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiB7IGlnbm9yZTogdHJ1ZSB9OyB9XG4gICAgbWF0Y2hlc0hhY2sobm9kZU5hbWUpIHsgcmV0dXJuIHRoaXMuZGlydHkgPT0gTk9UX0RJUlRZICYmIHRoaXMuZG9tLm5vZGVOYW1lID09IG5vZGVOYW1lOyB9XG4gICAgZ2V0IGRvbUF0b20oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlnbm9yZUZvckNvb3JkcygpIHsgcmV0dXJuIHRoaXMuZG9tLm5vZGVOYW1lID09IFwiSU1HXCI7IH1cbn1cbi8vIEEgc2VwYXJhdGUgc3ViY2xhc3MgaXMgdXNlZCBmb3IgY3VzdG9taXplZCBub2RlIHZpZXdzLCBzbyB0aGF0IHRoZVxuLy8gZXh0cmEgY2hlY2tzIG9ubHkgaGF2ZSB0byBiZSBtYWRlIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWxseVxuLy8gY3VzdG9taXplZC5cbmNsYXNzIEN1c3RvbU5vZGVWaWV3RGVzYyBleHRlbmRzIE5vZGVWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NLCBub2RlRE9NLCBzcGVjLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NLCBub2RlRE9NLCB2aWV3LCBwb3MpO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIH1cbiAgICAvLyBBIGN1c3RvbSBgdXBkYXRlYCBtZXRob2QgZ2V0cyB0byBkZWNpZGUgd2hldGhlciB0aGUgdXBkYXRlIGdvZXNcbiAgICAvLyB0aHJvdWdoLiBJZiBpdCBkb2VzLCBhbmQgdGhlcmUncyBhIGBjb250ZW50RE9NYCBub2RlLCBvdXIgbG9naWNcbiAgICAvLyB1cGRhdGVzIHRoZSBjaGlsZHJlbi5cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy51cGRhdGUpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnNwZWMudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRlbnRET00gJiYgIW5vZGUuaXNMZWFmKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICB0aGlzLnNwZWMuc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5zZWxlY3ROb2RlKCkgOiBzdXBlci5zZWxlY3ROb2RlKCk7XG4gICAgfVxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjLmRlc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5kZXNlbGVjdE5vZGUoKSA6IHN1cGVyLmRlc2VsZWN0Tm9kZSgpO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCByb290LCBmb3JjZSkge1xuICAgICAgICB0aGlzLnNwZWMuc2V0U2VsZWN0aW9uID8gdGhpcy5zcGVjLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHJvb3QpXG4gICAgICAgICAgICA6IHN1cGVyLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHJvb3QsIGZvcmNlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5zcGVjLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BlYy5zdG9wRXZlbnQgPyB0aGlzLnNwZWMuc3RvcEV2ZW50KGV2ZW50KSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uID8gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSA6IHN1cGVyLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKTtcbiAgICB9XG59XG4vLyBTeW5jIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gbm9kZSB3aXRoIHRoZSBub2RlcyBhc3NvY2lhdGVkXG4vLyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZiB2aWV3IGRlc2NzLCByZWN1cnNpbmcgaW50byBtYXJrIGRlc2NzXG4vLyBiZWNhdXNlIHRoaXMgc2hvdWxkIHN5bmMgdGhlIHN1YnRyZWUgZm9yIGEgd2hvbGUgbm9kZSBhdCBhIHRpbWUuXG5mdW5jdGlvbiByZW5kZXJEZXNjcyhwYXJlbnRET00sIGRlc2NzLCB2aWV3KSB7XG4gICAgbGV0IGRvbSA9IHBhcmVudERPTS5maXJzdENoaWxkLCB3cml0dGVuID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZGVzYyA9IGRlc2NzW2ldLCBjaGlsZERPTSA9IGRlc2MuZG9tO1xuICAgICAgICBpZiAoY2hpbGRET00ucGFyZW50Tm9kZSA9PSBwYXJlbnRET00pIHtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZERPTSAhPSBkb20pIHtcbiAgICAgICAgICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICBwYXJlbnRET00uaW5zZXJ0QmVmb3JlKGNoaWxkRE9NLCBkb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgTWFya1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gZG9tID8gZG9tLnByZXZpb3VzU2libGluZyA6IHBhcmVudERPTS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICByZW5kZXJEZXNjcyhkZXNjLmNvbnRlbnRET00sIGRlc2MuY2hpbGRyZW4sIHZpZXcpO1xuICAgICAgICAgICAgZG9tID0gcG9zID8gcG9zLm5leHRTaWJsaW5nIDogcGFyZW50RE9NLmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKGRvbSkge1xuICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICB3cml0dGVuID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHdyaXR0ZW4gJiYgdmlldy50cmFja1dyaXRlcyA9PSBwYXJlbnRET00pXG4gICAgICAgIHZpZXcudHJhY2tXcml0ZXMgPSBudWxsO1xufVxuY29uc3QgT3V0ZXJEZWNvTGV2ZWwgPSBmdW5jdGlvbiAobm9kZU5hbWUpIHtcbiAgICBpZiAobm9kZU5hbWUpXG4gICAgICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTtcbn07XG5PdXRlckRlY29MZXZlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgbm9EZWNvID0gW25ldyBPdXRlckRlY29MZXZlbF07XG5mdW5jdGlvbiBjb21wdXRlT3V0ZXJEZWNvKG91dGVyRGVjbywgbm9kZSwgbmVlZHNXcmFwKSB7XG4gICAgaWYgKG91dGVyRGVjby5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG5vRGVjbztcbiAgICBsZXQgdG9wID0gbmVlZHNXcmFwID8gbm9EZWNvWzBdIDogbmV3IE91dGVyRGVjb0xldmVsLCByZXN1bHQgPSBbdG9wXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyRGVjby5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgYXR0cnMgPSBvdXRlckRlY29baV0udHlwZS5hdHRycztcbiAgICAgICAgaWYgKCFhdHRycylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoYXR0cnMubm9kZU5hbWUpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0b3AgPSBuZXcgT3V0ZXJEZWNvTGV2ZWwoYXR0cnMubm9kZU5hbWUpKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG5lZWRzV3JhcCAmJiByZXN1bHQubGVuZ3RoID09IDEpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9wID0gbmV3IE91dGVyRGVjb0xldmVsKG5vZGUuaXNJbmxpbmUgPyBcInNwYW5cIiA6IFwiZGl2XCIpKTtcbiAgICAgICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIilcbiAgICAgICAgICAgICAgICB0b3AuY2xhc3MgPSAodG9wLmNsYXNzID8gdG9wLmNsYXNzICsgXCIgXCIgOiBcIlwiKSArIHZhbDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgIHRvcC5zdHlsZSA9ICh0b3Auc3R5bGUgPyB0b3Auc3R5bGUgKyBcIjtcIiA6IFwiXCIpICsgdmFsO1xuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBcIm5vZGVOYW1lXCIpXG4gICAgICAgICAgICAgICAgdG9wW25hbWVdID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXRjaE91dGVyRGVjbyhvdXRlckRPTSwgbm9kZURPTSwgcHJldkNvbXB1dGVkLCBjdXJDb21wdXRlZCkge1xuICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGNhc2VcbiAgICBpZiAocHJldkNvbXB1dGVkID09IG5vRGVjbyAmJiBjdXJDb21wdXRlZCA9PSBub0RlY28pXG4gICAgICAgIHJldHVybiBub2RlRE9NO1xuICAgIGxldCBjdXJET00gPSBub2RlRE9NO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyQ29tcHV0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRlY28gPSBjdXJDb21wdXRlZFtpXSwgcHJldiA9IHByZXZDb21wdXRlZFtpXTtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2Lm5vZGVOYW1lID09IGRlY28ubm9kZU5hbWUgJiYgY3VyRE9NICE9IG91dGVyRE9NICYmXG4gICAgICAgICAgICAgICAgKHBhcmVudCA9IGN1ckRPTS5wYXJlbnROb2RlKSAmJiBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBkZWNvLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkZWNvLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQucG1Jc0RlY28gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjdXJET00pO1xuICAgICAgICAgICAgICAgIHByZXYgPSBub0RlY29bMF07XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhdGNoQXR0cmlidXRlcyhjdXJET00sIHByZXYgfHwgbm9EZWNvWzBdLCBkZWNvKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1ckRPTTtcbn1cbmZ1bmN0aW9uIHBhdGNoQXR0cmlidXRlcyhkb20sIHByZXYsIGN1cikge1xuICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmICEobmFtZSBpbiBjdXIpKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGN1cilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmIGN1cltuYW1lXSAhPSBwcmV2W25hbWVdKVxuICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBjdXJbbmFtZV0pO1xuICAgIGlmIChwcmV2LmNsYXNzICE9IGN1ci5jbGFzcykge1xuICAgICAgICBsZXQgcHJldkxpc3QgPSBwcmV2LmNsYXNzID8gcHJldi5jbGFzcy5zcGxpdChcIiBcIikuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICAgIGxldCBjdXJMaXN0ID0gY3VyLmNsYXNzID8gY3VyLmNsYXNzLnNwbGl0KFwiIFwiKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2TGlzdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjdXJMaXN0LmluZGV4T2YocHJldkxpc3RbaV0pID09IC0xKVxuICAgICAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QucmVtb3ZlKHByZXZMaXN0W2ldKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJMaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHByZXZMaXN0LmluZGV4T2YoY3VyTGlzdFtpXSkgPT0gLTEpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5hZGQoY3VyTGlzdFtpXSk7XG4gICAgICAgIGlmIChkb20uY2xhc3NMaXN0Lmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIH1cbiAgICBpZiAocHJldi5zdHlsZSAhPSBjdXIuc3R5bGUpIHtcbiAgICAgICAgaWYgKHByZXYuc3R5bGUpIHtcbiAgICAgICAgICAgIGxldCBwcm9wID0gL1xccyooW1xcd1xcLVxceGExLVxcdWZmZmZdKylcXHMqOig/OlwiKD86XFxcXC58W15cIl0pKlwifCcoPzpcXFxcLnxbXiddKSonfFxcKC4qP1xcKXxbXjtdKSovZywgbTtcbiAgICAgICAgICAgIHdoaWxlIChtID0gcHJvcC5leGVjKHByZXYuc3R5bGUpKVxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShtWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLnN0eWxlKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgKz0gY3VyLnN0eWxlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5T3V0ZXJEZWNvKGRvbSwgZGVjbywgbm9kZSkge1xuICAgIHJldHVybiBwYXRjaE91dGVyRGVjbyhkb20sIGRvbSwgbm9EZWNvLCBjb21wdXRlT3V0ZXJEZWNvKGRlY28sIG5vZGUsIGRvbS5ub2RlVHlwZSAhPSAxKSk7XG59XG5mdW5jdGlvbiBzYW1lT3V0ZXJEZWNvKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS50eXBlLmVxKGJbaV0udHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybShkb20pIHtcbiAgICBsZXQgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgICBkb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20pO1xuICAgIHJldHVybiBuZXh0O1xufVxuLy8gSGVscGVyIGNsYXNzIGZvciBpbmNyZW1lbnRhbGx5IHVwZGF0aW5nIGEgdHJlZSBvZiBtYXJrIGRlc2NzIGFuZFxuLy8gdGhlIHdpZGdldCBhbmQgbm9kZSBkZXNjcyBpbnNpZGUgb2YgdGhlbS5cbmNsYXNzIFZpZXdUcmVlVXBkYXRlciB7XG4gICAgY29uc3RydWN0b3IodG9wLCBsb2NrLCB2aWV3KSB7XG4gICAgICAgIHRoaXMubG9jayA9IGxvY2s7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIC8vIEluZGV4IGludG8gYHRoaXMudG9wYCdzIGNoaWxkIGFycmF5LCByZXByZXNlbnRzIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbi5cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIC8vIFdoZW4gZW50ZXJpbmcgYSBtYXJrLCB0aGUgY3VycmVudCB0b3AgYW5kIGluZGV4IGFyZSBwdXNoZWRcbiAgICAgICAgLy8gb250byB0aGlzLlxuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8vIFRyYWNrcyB3aGV0aGVyIGFueXRoaW5nIHdhcyBjaGFuZ2VkXG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5wcmVNYXRjaCA9IHByZU1hdGNoKHRvcC5ub2RlLmNvbnRlbnQsIHRvcCk7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYW5kIHJlbW92ZSB0aGUgY2hpbGRyZW4gYmV0d2VlbiB0aGUgZ2l2ZW4gaW5kaWNlcyBpblxuICAgIC8vIGB0aGlzLnRvcGAuXG4gICAgZGVzdHJveUJldHdlZW4oc3RhcnQsIGVuZCkge1xuICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYWxsIHJlbWFpbmluZyBjaGlsZHJlbiBpbiBgdGhpcy50b3BgLlxuICAgIGRlc3Ryb3lSZXN0KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIGN1cnJlbnQgc3RhY2sgb2YgbWFyayBkZXNjcyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZlxuICAgIC8vIG1hcmtzLCByZXVzaW5nIGV4aXN0aW5nIG1hcmsgZGVzY3Mgd2hlbiBwb3NzaWJsZS5cbiAgICBzeW5jVG9NYXJrcyhtYXJrcywgaW5saW5lLCB2aWV3KSB7XG4gICAgICAgIGxldCBrZWVwID0gMCwgZGVwdGggPSB0aGlzLnN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICBsZXQgbWF4S2VlcCA9IE1hdGgubWluKGRlcHRoLCBtYXJrcy5sZW5ndGgpO1xuICAgICAgICB3aGlsZSAoa2VlcCA8IG1heEtlZXAgJiZcbiAgICAgICAgICAgIChrZWVwID09IGRlcHRoIC0gMSA/IHRoaXMudG9wIDogdGhpcy5zdGFja1soa2VlcCArIDEpIDw8IDFdKVxuICAgICAgICAgICAgICAgIC5tYXRjaGVzTWFyayhtYXJrc1trZWVwXSkgJiYgbWFya3Nba2VlcF0udHlwZS5zcGVjLnNwYW5uaW5nICE9PSBmYWxzZSlcbiAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgd2hpbGUgKGtlZXAgPCBkZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVzdCgpO1xuICAgICAgICAgICAgdGhpcy50b3AuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGRlcHRoIDwgbWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy50b3AsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IC0xO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXg7IGkgPCBNYXRoLm1pbih0aGlzLmluZGV4ICsgMywgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5tYXRjaGVzTWFyayhtYXJrc1tkZXB0aF0pICYmICF0aGlzLmlzTG9ja2VkKG5leHQuZG9tKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kID4gdGhpcy5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrRGVzYyA9IE1hcmtWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG1hcmtzW2RlcHRoXSwgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCwgMCwgbWFya0Rlc2MpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9wID0gbWFya0Rlc2M7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gZmluZCBhIG5vZGUgZGVzYyBtYXRjaGluZyB0aGUgZ2l2ZW4gZGF0YS4gU2tpcCBvdmVyIGl0IGFuZFxuICAgIC8vIHJldHVybiB0cnVlIHdoZW4gc3VjY2Vzc2Z1bC5cbiAgICBmaW5kTm9kZU1hdGNoKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSAtMSwgdGFyZ2V0RGVzYztcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMucHJlTWF0Y2guaW5kZXggJiZcbiAgICAgICAgICAgICh0YXJnZXREZXNjID0gdGhpcy5wcmVNYXRjaC5tYXRjaGVzW2luZGV4IC0gdGhpcy5wcmVNYXRjaC5pbmRleF0pLnBhcmVudCA9PSB0aGlzLnRvcCAmJlxuICAgICAgICAgICAgdGFyZ2V0RGVzYy5tYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdGhpcy50b3AuY2hpbGRyZW4uaW5kZXhPZih0YXJnZXREZXNjLCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4LCBlID0gTWF0aC5taW4odGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoLCBpICsgNSk7IGkgPCBlOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubWF0Y2hlc05vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pICYmICF0aGlzLnByZU1hdGNoLm1hdGNoZWQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdXBkYXRlTm9kZUF0KG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCwgdmlldykge1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpbmRleF07XG4gICAgICAgIGlmIChjaGlsZC5kaXJ0eSA9PSBOT0RFX0RJUlRZICYmIGNoaWxkLmRvbSA9PSBjaGlsZC5jb250ZW50RE9NKVxuICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICBpZiAoIWNoaWxkLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaW5kZXgpO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmaW5kSW5kZXhXaXRoQ2hpbGQoZG9tTm9kZSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gZG9tTm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcC5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBkb21Ob2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2MpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4OyBpIDwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvcC5jaGlsZHJlbltpXSA9PSBkZXNjKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tTm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gdXBkYXRlIHRoZSBuZXh0IG5vZGUsIGlmIGFueSwgdG8gdGhlIGdpdmVuIGRhdGEuIENoZWNrc1xuICAgIC8vIHByZS1tYXRjaGVzIHRvIGF2b2lkIG92ZXJ3cml0aW5nIG5vZGVzIHRoYXQgY291bGQgc3RpbGwgYmUgdXNlZC5cbiAgICB1cGRhdGVOZXh0Tm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgaW5kZXgsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBOb2RlVmlld0Rlc2MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlTWF0Y2ggPSB0aGlzLnByZU1hdGNoLm1hdGNoZWQuZ2V0KG5leHQpO1xuICAgICAgICAgICAgICAgIGlmIChwcmVNYXRjaCAhPSBudWxsICYmIHByZU1hdGNoICE9IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRET00gPSBuZXh0LmRvbSwgdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAvLyBDYW4ndCB1cGRhdGUgaWYgbmV4dERPTSBpcyBvciBjb250YWlucyB0aGlzLmxvY2ssIGV4Y2VwdCBpZlxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSB0ZXh0IG5vZGUgd2hvc2UgY29udGVudCBhbHJlYWR5IG1hdGNoZXMgdGhlIG5ldyB0ZXh0XG4gICAgICAgICAgICAgICAgLy8gYW5kIHdob3NlIGRlY29yYXRpb25zIG1hdGNoIHRoZSBuZXcgb25lcy5cbiAgICAgICAgICAgICAgICBsZXQgbG9ja2VkID0gdGhpcy5pc0xvY2tlZChuZXh0RE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGUuaXNUZXh0ICYmIG5leHQubm9kZSAmJiBuZXh0Lm5vZGUuaXNUZXh0ICYmIG5leHQubm9kZURPTS5ub2RlVmFsdWUgPT0gbm9kZS50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmRpcnR5ICE9IE5PREVfRElSVFkgJiYgc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIG5leHQub3V0ZXJEZWNvKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2NrZWQgJiYgbmV4dC51cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmRvbSAhPSBuZXh0RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWxvY2tlZCAmJiAodXBkYXRlZCA9IHRoaXMucmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBXaGVuIGEgbm9kZSB3aXRoIGNvbnRlbnQgaXMgcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgbm9kZSB3aXRoXG4gICAgLy8gaWRlbnRpY2FsIGNvbnRlbnQsIG1vdmUgb3ZlciBpdHMgY2hpbGRyZW4uXG4gICAgcmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgaWYgKG5leHQuZGlydHkgfHwgbm9kZS5pc0F0b20gfHwgIW5leHQuY2hpbGRyZW4ubGVuZ3RoIHx8XG4gICAgICAgICAgICAhbmV4dC5ub2RlLmNvbnRlbnQuZXEobm9kZS5jb250ZW50KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgd3JhcHBlciA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAod3JhcHBlci5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICB3cmFwcGVyLmNoaWxkcmVuID0gbmV4dC5jaGlsZHJlbjtcbiAgICAgICAgICAgIG5leHQuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIHdyYXBwZXIuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2gucGFyZW50ID0gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgICAgICBuZXh0LmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuICAgIC8vIEluc2VydCB0aGUgbm9kZSBhcyBhIG5ld2x5IGNyZWF0ZWQgbm9kZSBkZXNjLlxuICAgIGFkZE5vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgZGVzYyA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAoZGVzYy5jb250ZW50RE9NKVxuICAgICAgICAgICAgZGVzYy51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgZGVzYyk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIHBsYWNlV2lkZ2V0KHdpZGdldCwgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5pbmRleCA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCA/IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdIDogbnVsbDtcbiAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5tYXRjaGVzV2lkZ2V0KHdpZGdldCkgJiZcbiAgICAgICAgICAgICh3aWRnZXQgPT0gbmV4dC53aWRnZXQgfHwgIW5leHQud2lkZ2V0LnR5cGUudG9ET00ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gbmV3IFdpZGdldFZpZXdEZXNjKHRoaXMudG9wLCB3aWRnZXQsIHZpZXcsIHBvcyk7XG4gICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBkZXNjKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGEgdGV4dGJsb2NrIGxvb2tzIGFuZCBiZWhhdmVzIGNvcnJlY3RseSBpblxuICAgIC8vIGNvbnRlbnRFZGl0YWJsZS5cbiAgICBhZGRUZXh0YmxvY2tIYWNrcygpIHtcbiAgICAgICAgbGV0IGxhc3RDaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXggLSAxXSwgcGFyZW50ID0gdGhpcy50b3A7XG4gICAgICAgIHdoaWxlIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IGxhc3RDaGlsZDtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHBhcmVudC5jaGlsZHJlbltwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0Q2hpbGQgfHwgLy8gRW1wdHkgdGV4dGJsb2NrXG4gICAgICAgICAgICAhKGxhc3RDaGlsZCBpbnN0YW5jZW9mIFRleHRWaWV3RGVzYykgfHxcbiAgICAgICAgICAgIC9cXG4kLy50ZXN0KGxhc3RDaGlsZC5ub2RlLnRleHQpIHx8XG4gICAgICAgICAgICAodGhpcy52aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSAmJiAvXFxzJC8udGVzdChsYXN0Q2hpbGQubm9kZS50ZXh0KSkpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3MgaW4gU2FmYXJpJ3MgY3Vyc29yIGRyYXdpbmcgKCMxMTY1KSBhbmQgQ2hyb21lJ3MgbW91c2Ugc2VsZWN0aW9uICgjMTE1MilcbiAgICAgICAgICAgIGlmICgoc2FmYXJpIHx8IGNocm9tZSkgJiYgbGFzdENoaWxkICYmIGxhc3RDaGlsZC5kb20uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiSU1HXCIsIHBhcmVudCk7XG4gICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiQlJcIiwgdGhpcy50b3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEhhY2tOb2RlKG5vZGVOYW1lLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcCAmJiB0aGlzLmluZGV4IDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAmJiBwYXJlbnQuY2hpbGRyZW5bdGhpcy5pbmRleF0ubWF0Y2hlc0hhY2sobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLXNlcGFyYXRvclwiO1xuICAgICAgICAgICAgICAgIGRvbS5hbHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiQlJcIilcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci10cmFpbGluZ0JyZWFrXCI7XG4gICAgICAgICAgICBsZXQgaGFjayA9IG5ldyBUcmFpbGluZ0hhY2tWaWV3RGVzYyh0aGlzLnRvcCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMudG9wKVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKGhhY2spO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBoYWNrKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNMb2NrZWQobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NrICYmIChub2RlID09IHRoaXMubG9jayB8fCBub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5jb250YWlucyh0aGlzLmxvY2sucGFyZW50Tm9kZSkpO1xuICAgIH1cbn1cbi8vIEl0ZXJhdGUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudCBhbmQgYXJyYXkgb2YgZGVzY3MgdG8gZmluZFxuLy8gZGlyZWN0bHkgbWF0Y2hpbmcgb25lcywgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmVhZ2VybHkgcmV1c2luZyB0aG9zZVxuLy8gZm9yIG90aGVyIG5vZGVzLiBSZXR1cm5zIHRoZSBmcmFnbWVudCBpbmRleCBvZiB0aGUgZmlyc3Qgbm9kZSB0aGF0XG4vLyBpcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSBvZiBtYXRjaGVkIG5vZGVzIGF0IHRoZSBlbmQgb2YgdGhlXG4vLyBmcmFnbWVudC5cbmZ1bmN0aW9uIHByZU1hdGNoKGZyYWcsIHBhcmVudERlc2MpIHtcbiAgICBsZXQgY3VyRGVzYyA9IHBhcmVudERlc2MsIGRlc2NJID0gY3VyRGVzYy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGZJID0gZnJhZy5jaGlsZENvdW50LCBtYXRjaGVkID0gbmV3IE1hcCwgbWF0Y2hlcyA9IFtdO1xuICAgIG91dGVyOiB3aGlsZSAoZkkgPiAwKSB7XG4gICAgICAgIGxldCBkZXNjO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoZGVzY0kpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGN1ckRlc2MuY2hpbGRyZW5bZGVzY0kgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIE1hcmtWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjdXJEZXNjID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgZGVzY0kgPSBuZXh0LmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICBkZXNjSS0tO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJEZXNjID09IHBhcmVudERlc2MpIHtcbiAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FXG4gICAgICAgICAgICAgICAgZGVzY0kgPSBjdXJEZXNjLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGN1ckRlc2MpO1xuICAgICAgICAgICAgICAgIGN1ckRlc2MgPSBjdXJEZXNjLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IGRlc2Mubm9kZTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChub2RlICE9IGZyYWcuY2hpbGQoZkkgLSAxKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAtLWZJO1xuICAgICAgICBtYXRjaGVkLnNldChkZXNjLCBmSSk7XG4gICAgICAgIG1hdGNoZXMucHVzaChkZXNjKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5kZXg6IGZJLCBtYXRjaGVkLCBtYXRjaGVzOiBtYXRjaGVzLnJldmVyc2UoKSB9O1xufVxuZnVuY3Rpb24gY29tcGFyZVNpZGUoYSwgYikge1xuICAgIHJldHVybiBhLnR5cGUuc2lkZSAtIGIudHlwZS5zaWRlO1xufVxuLy8gVGhpcyBmdW5jdGlvbiBhYnN0cmFjdHMgaXRlcmF0aW5nIG92ZXIgdGhlIG5vZGVzIGFuZCBkZWNvcmF0aW9ucyBpblxuLy8gYSBmcmFnbWVudC4gQ2FsbHMgYG9uTm9kZWAgZm9yIGVhY2ggbm9kZSwgd2l0aCBpdHMgbG9jYWwgYW5kIGNoaWxkXG4vLyBkZWNvcmF0aW9ucy4gU3BsaXRzIHRleHQgbm9kZXMgd2hlbiB0aGVyZSBpcyBhIGRlY29yYXRpb24gc3RhcnRpbmdcbi8vIG9yIGVuZGluZyBpbnNpZGUgb2YgdGhlbS4gQ2FsbHMgYG9uV2lkZ2V0YCBmb3IgZWFjaCB3aWRnZXQuXG5mdW5jdGlvbiBpdGVyRGVjbyhwYXJlbnQsIGRlY28sIG9uV2lkZ2V0LCBvbk5vZGUpIHtcbiAgICBsZXQgbG9jYWxzID0gZGVjby5sb2NhbHMocGFyZW50KSwgb2Zmc2V0ID0gMDtcbiAgICAvLyBTaW1wbGUsIGNoZWFwIHZhcmlhbnQgZm9yIHdoZW4gdGhlcmUgYXJlIG5vIGxvY2FsIGRlY29yYXRpb25zXG4gICAgaWYgKGxvY2Fscy5sZW5ndGggPT0gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHBhcmVudC5jaGlsZChpKTtcbiAgICAgICAgICAgIG9uTm9kZShjaGlsZCwgbG9jYWxzLCBkZWNvLmZvckNoaWxkKG9mZnNldCwgY2hpbGQpLCBpKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkZWNvSW5kZXggPSAwLCBhY3RpdmUgPSBbXSwgcmVzdE5vZGUgPSBudWxsO1xuICAgIGZvciAobGV0IHBhcmVudEluZGV4ID0gMDs7KSB7XG4gICAgICAgIGxldCB3aWRnZXQsIHdpZGdldHM7XG4gICAgICAgIHdoaWxlIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLnRvID09IG9mZnNldCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBsb2NhbHNbZGVjb0luZGV4KytdO1xuICAgICAgICAgICAgaWYgKG5leHQud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3aWRnZXQpXG4gICAgICAgICAgICAgICAgICAgIHdpZGdldCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAod2lkZ2V0cyB8fCAod2lkZ2V0cyA9IFt3aWRnZXRdKSkucHVzaChuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkZ2V0KSB7XG4gICAgICAgICAgICBpZiAod2lkZ2V0cykge1xuICAgICAgICAgICAgICAgIHdpZGdldHMuc29ydChjb21wYXJlU2lkZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWRnZXRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXRzW2ldLCBwYXJlbnRJbmRleCwgISFyZXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXQsIHBhcmVudEluZGV4LCAhIXJlc3ROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hpbGQsIGluZGV4O1xuICAgICAgICBpZiAocmVzdE5vZGUpIHtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjaGlsZCA9IHJlc3ROb2RlO1xuICAgICAgICAgICAgcmVzdE5vZGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudEluZGV4IDwgcGFyZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgICAgICAgICBjaGlsZCA9IHBhcmVudC5jaGlsZChwYXJlbnRJbmRleCsrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGFjdGl2ZVtpXS50byA8PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgYWN0aXZlLnNwbGljZShpLS0sIDEpO1xuICAgICAgICB3aGlsZSAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS5mcm9tIDw9IG9mZnNldCAmJiBsb2NhbHNbZGVjb0luZGV4XS50byA+IG9mZnNldClcbiAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGxvY2Fsc1tkZWNvSW5kZXgrK10pO1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgIGlmIChjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgICAgIGxldCBjdXRBdCA9IGVuZDtcbiAgICAgICAgICAgIGlmIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLmZyb20gPCBjdXRBdClcbiAgICAgICAgICAgICAgICBjdXRBdCA9IGxvY2Fsc1tkZWNvSW5kZXhdLmZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlW2ldLnRvIDwgY3V0QXQpXG4gICAgICAgICAgICAgICAgICAgIGN1dEF0ID0gYWN0aXZlW2ldLnRvO1xuICAgICAgICAgICAgaWYgKGN1dEF0IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdE5vZGUgPSBjaGlsZC5jdXQoY3V0QXQgLSBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KDAsIGN1dEF0IC0gb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBlbmQgPSBjdXRBdDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRlckRlY28gPSBjaGlsZC5pc0lubGluZSAmJiAhY2hpbGQuaXNMZWFmID8gYWN0aXZlLmZpbHRlcihkID0+ICFkLmlubGluZSkgOiBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgb25Ob2RlKGNoaWxkLCBvdXRlckRlY28sIGRlY28uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCksIGluZGV4KTtcbiAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgIH1cbn1cbi8vIExpc3QgbWFya2VycyBpbiBNb2JpbGUgU2FmYXJpIHdpbGwgbXlzdGVyaW91c2x5IGRpc2FwcGVhclxuLy8gc29tZXRpbWVzLiBUaGlzIHdvcmtzIGFyb3VuZCB0aGF0LlxuZnVuY3Rpb24gaW9zSGFja3MoZG9tKSB7XG4gICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIlVMXCIgfHwgZG9tLm5vZGVOYW1lID09IFwiT0xcIikge1xuICAgICAgICBsZXQgb2xkQ1NTID0gZG9tLnN0eWxlLmNzc1RleHQ7XG4gICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gb2xkQ1NTICsgXCI7IGxpc3Qtc3R5bGU6IHNxdWFyZSAhaW1wb3J0YW50XCI7XG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbSkubGlzdFN0eWxlO1xuICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IG9sZENTUztcbiAgICB9XG59XG5mdW5jdGlvbiBuZWFyYnlUZXh0Tm9kZShub2RlLCBvZmZzZXQpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IG9mZnNldCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICBvZmZzZXQgPSBub2RlU2l6ZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gRmluZCBhIHBpZWNlIG9mIHRleHQgaW4gYW4gaW5saW5lIGZyYWdtZW50LCBvdmVybGFwcGluZyBmcm9tLXRvXG5mdW5jdGlvbiBmaW5kVGV4dEluRnJhZ21lbnQoZnJhZywgdGV4dCwgZnJvbSwgdG8pIHtcbiAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IGZyYWcuY2hpbGRDb3VudCAmJiBwb3MgPD0gdG87KSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGZyYWcuY2hpbGQoaSsrKSwgY2hpbGRTdGFydCA9IHBvcztcbiAgICAgICAgcG9zICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICBpZiAoIWNoaWxkLmlzVGV4dClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc3RyID0gY2hpbGQudGV4dDtcbiAgICAgICAgd2hpbGUgKGkgPCBmcmFnLmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZnJhZy5jaGlsZChpKyspO1xuICAgICAgICAgICAgcG9zICs9IG5leHQubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoIW5leHQuaXNUZXh0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgc3RyICs9IG5leHQudGV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID49IGZyb20pIHtcbiAgICAgICAgICAgIGlmIChwb3MgPj0gdG8gJiYgc3RyLnNsaWNlKHRvIC0gdGV4dC5sZW5ndGggLSBjaGlsZFN0YXJ0LCB0byAtIGNoaWxkU3RhcnQpID09IHRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvIC0gdGV4dC5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBjaGlsZFN0YXJ0IDwgdG8gPyBzdHIubGFzdEluZGV4T2YodGV4dCwgdG8gLSBjaGlsZFN0YXJ0IC0gMSkgOiAtMTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA+PSAwICYmIGZvdW5kICsgdGV4dC5sZW5ndGggKyBjaGlsZFN0YXJ0ID49IGZyb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkU3RhcnQgKyBmb3VuZDtcbiAgICAgICAgICAgIGlmIChmcm9tID09IHRvICYmIHN0ci5sZW5ndGggPj0gKHRvICsgdGV4dC5sZW5ndGgpIC0gY2hpbGRTdGFydCAmJlxuICAgICAgICAgICAgICAgIHN0ci5zbGljZSh0byAtIGNoaWxkU3RhcnQsIHRvIC0gY2hpbGRTdGFydCArIHRleHQubGVuZ3RoKSA9PSB0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0bztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4vLyBSZXBsYWNlIHJhbmdlIGZyb20tdG8gaW4gYW4gYXJyYXkgb2YgdmlldyBkZXNjcyB3aXRoIHJlcGxhY2VtZW50XG4vLyAobWF5IGJlIG51bGwgdG8ganVzdCBkZWxldGUpLiBUaGlzIGdvZXMgdmVyeSBtdWNoIGFnYWluc3QgdGhlIGdyYWluXG4vLyBvZiB0aGUgcmVzdCBvZiB0aGlzIGNvZGUsIHdoaWNoIHRlbmRzIHRvIGNyZWF0ZSBub2RlcyB3aXRoIHRoZVxuLy8gcmlnaHQgc2hhcGUgaW4gb25lIGdvLCByYXRoZXIgdGhhbiBtZXNzaW5nIHdpdGggdGhlbSBhZnRlclxuLy8gY3JlYXRpb24sIGJ1dCBpcyBuZWNlc3NhcnkgaW4gdGhlIGNvbXBvc2l0aW9uIGhhY2suXG5mdW5jdGlvbiByZXBsYWNlTm9kZXMobm9kZXMsIGZyb20sIHRvLCB2aWV3LCByZXBsYWNlbWVudCkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IG5vZGVzW2ldLCBzdGFydCA9IG9mZiwgZW5kID0gb2ZmICs9IGNoaWxkLnNpemU7XG4gICAgICAgIGlmIChzdGFydCA+PSB0byB8fCBlbmQgPD0gZnJvbSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZC5zbGljZSgwLCBmcm9tIC0gc3RhcnQsIHZpZXcpKTtcbiAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZC5zbGljZSh0byAtIHN0YXJ0LCBjaGlsZC5zaXplLCB2aWV3KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uRnJvbURPTSh2aWV3LCBvcmlnaW4gPSBudWxsKSB7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSwgZG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgaWYgKCFkb21TZWwuZm9jdXNOb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgbmVhcmVzdERlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZG9tU2VsLmZvY3VzTm9kZSksIGluV2lkZ2V0ID0gbmVhcmVzdERlc2MgJiYgbmVhcmVzdERlc2Muc2l6ZSA9PSAwO1xuICAgIGxldCBoZWFkID0gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0LCAxKTtcbiAgICBpZiAoaGVhZCA8IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCAkaGVhZCA9IGRvYy5yZXNvbHZlKGhlYWQpLCAkYW5jaG9yLCBzZWxlY3Rpb247XG4gICAgaWYgKHNlbGVjdGlvbkNvbGxhcHNlZChkb21TZWwpKSB7XG4gICAgICAgICRhbmNob3IgPSAkaGVhZDtcbiAgICAgICAgd2hpbGUgKG5lYXJlc3REZXNjICYmICFuZWFyZXN0RGVzYy5ub2RlKVxuICAgICAgICAgICAgbmVhcmVzdERlc2MgPSBuZWFyZXN0RGVzYy5wYXJlbnQ7XG4gICAgICAgIGxldCBuZWFyZXN0RGVzY05vZGUgPSBuZWFyZXN0RGVzYy5ub2RlO1xuICAgICAgICBpZiAobmVhcmVzdERlc2MgJiYgbmVhcmVzdERlc2NOb2RlLmlzQXRvbSAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShuZWFyZXN0RGVzY05vZGUpICYmIG5lYXJlc3REZXNjLnBhcmVudFxuICAgICAgICAgICAgJiYgIShuZWFyZXN0RGVzY05vZGUuaXNJbmxpbmUgJiYgaXNPbkVkZ2UoZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0LCBuZWFyZXN0RGVzYy5kb20pKSkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IG5lYXJlc3REZXNjLnBvc0JlZm9yZTtcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IG5ldyBOb2RlU2VsZWN0aW9uKGhlYWQgPT0gcG9zID8gJGhlYWQgOiBkb2MucmVzb2x2ZShwb3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGFuY2hvciA9IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0LCAxKTtcbiAgICAgICAgaWYgKGFuY2hvciA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgJGFuY2hvciA9IGRvYy5yZXNvbHZlKGFuY2hvcik7XG4gICAgfVxuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBiaWFzID0gb3JpZ2luID09IFwicG9pbnRlclwiIHx8ICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5oZWFkIDwgJGhlYWQucG9zICYmICFpbldpZGdldCkgPyAxIDogLTE7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbkJldHdlZW4odmlldywgJGFuY2hvciwgJGhlYWQsIGJpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uO1xufVxuZnVuY3Rpb24gZWRpdG9yT3duc1NlbGVjdGlvbih2aWV3KSB7XG4gICAgcmV0dXJuIHZpZXcuZWRpdGFibGUgPyB2aWV3Lmhhc0ZvY3VzKCkgOlxuICAgICAgICBoYXNTZWxlY3Rpb24odmlldykgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNvbnRhaW5zKHZpZXcuZG9tKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvRE9NKHZpZXcsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgc3luY05vZGVTZWxlY3Rpb24odmlldywgc2VsKTtcbiAgICBpZiAoIWVkaXRvck93bnNTZWxlY3Rpb24odmlldykpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBUaGUgZGVsYXllZCBkcmFnIHNlbGVjdGlvbiBjYXVzZXMgaXNzdWVzIHdpdGggQ2VsbCBTZWxlY3Rpb25zXG4gICAgLy8gaW4gU2FmYXJpLiBBbmQgdGhlIGRyYWcgc2VsZWN0aW9uIGRlbGF5IGlzIHRvIHdvcmthcm9uZCBpc3N1ZXNcbiAgICAvLyB3aGljaCBvbmx5IHByZXNlbnQgaW4gQ2hyb21lLlxuICAgIGlmICghZm9yY2UgJiYgdmlldy5pbnB1dC5tb3VzZURvd24gJiYgdmlldy5pbnB1dC5tb3VzZURvd24uYWxsb3dEZWZhdWx0ICYmIGNocm9tZSkge1xuICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpLCBjdXJTZWwgPSB2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgIGlmIChkb21TZWwuYW5jaG9yTm9kZSAmJiBjdXJTZWwuYW5jaG9yTm9kZSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQsIGN1clNlbC5hbmNob3JOb2RlLCBjdXJTZWwuYW5jaG9yT2Zmc2V0KSkge1xuICAgICAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24uZGVsYXllZFNlbGVjdGlvblN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLmRpc2Nvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICBpZiAodmlldy5jdXJzb3JXcmFwcGVyKSB7XG4gICAgICAgIHNlbGVjdEN1cnNvcldyYXBwZXIodmlldyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBhbmNob3IsIGhlYWQgfSA9IHNlbCwgcmVzZXRFZGl0YWJsZUZyb20sIHJlc2V0RWRpdGFibGVUbztcbiAgICAgICAgaWYgKGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlICYmICEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmICghc2VsLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGVGcm9tID0gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgc2VsLmZyb20pO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkgJiYgIXNlbC4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlVG8gPSB0ZW1wb3JhcmlseUVkaXRhYmxlTmVhcih2aWV3LCBzZWwudG8pO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcuZG9jVmlldy5zZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LnJvb3QsIGZvcmNlKTtcbiAgICAgICAgaWYgKGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAocmVzZXRFZGl0YWJsZUZyb20pXG4gICAgICAgICAgICAgICAgcmVzZXRFZGl0YWJsZShyZXNldEVkaXRhYmxlRnJvbSk7XG4gICAgICAgICAgICBpZiAocmVzZXRFZGl0YWJsZVRvKVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGUocmVzZXRFZGl0YWJsZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsLnZpc2libGUpIHtcbiAgICAgICAgICAgIHZpZXcuZG9tLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb25cIik7XG4gICAgICAgICAgICBpZiAoXCJvbnNlbGVjdGlvbmNoYW5nZVwiIGluIGRvY3VtZW50KVxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzT25TZWxlY3Rpb25DaGFuZ2Uodmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICB2aWV3LmRvbU9ic2VydmVyLmNvbm5lY3RTZWxlY3Rpb24oKTtcbn1cbi8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCBXZWJraXQgbm90IGFsbG93aW5nIGEgc2VsZWN0aW9uIHRvIHN0YXJ0L2VuZFxuLy8gYmV0d2VlbiBub24tZWRpdGFibGUgYmxvY2sgbm9kZXMuIFdlIGJyaWVmbHkgbWFrZSBzb21ldGhpbmdcbi8vIGVkaXRhYmxlLCBzZXQgdGhlIHNlbGVjdGlvbiwgdGhlbiBzZXQgaXQgdW5lZGl0YWJsZSBhZ2Fpbi5cbmNvbnN0IGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlID0gc2FmYXJpIHx8IGNocm9tZSAmJiBjaHJvbWVfdmVyc2lvbiA8IDYzO1xuZnVuY3Rpb24gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgcG9zKSB7XG4gICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSB2aWV3LmRvY1ZpZXcuZG9tRnJvbVBvcyhwb3MsIDApO1xuICAgIGxldCBhZnRlciA9IG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPyBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XSA6IG51bGw7XG4gICAgbGV0IGJlZm9yZSA9IG9mZnNldCA/IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXSA6IG51bGw7XG4gICAgaWYgKHNhZmFyaSAmJiBhZnRlciAmJiBhZnRlci5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICByZXR1cm4gc2V0RWRpdGFibGUoYWZ0ZXIpO1xuICAgIGlmICgoIWFmdGVyIHx8IGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpICYmXG4gICAgICAgICghYmVmb3JlIHx8IGJlZm9yZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSkge1xuICAgICAgICBpZiAoYWZ0ZXIpXG4gICAgICAgICAgICByZXR1cm4gc2V0RWRpdGFibGUoYWZ0ZXIpO1xuICAgICAgICBlbHNlIGlmIChiZWZvcmUpXG4gICAgICAgICAgICByZXR1cm4gc2V0RWRpdGFibGUoYmVmb3JlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRFZGl0YWJsZShlbGVtZW50KSB7XG4gICAgZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICBpZiAoc2FmYXJpICYmIGVsZW1lbnQuZHJhZ2dhYmxlKSB7XG4gICAgICAgIGVsZW1lbnQuZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICAgIGVsZW1lbnQud2FzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5mdW5jdGlvbiByZXNldEVkaXRhYmxlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICBpZiAoZWxlbWVudC53YXNEcmFnZ2FibGUpIHtcbiAgICAgICAgZWxlbWVudC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICBlbGVtZW50Lndhc0RyYWdnYWJsZSA9IG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3NPblNlbGVjdGlvbkNoYW5nZSh2aWV3KSB7XG4gICAgbGV0IGRvYyA9IHZpZXcuZG9tLm93bmVyRG9jdW1lbnQ7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdmlldy5pbnB1dC5oaWRlU2VsZWN0aW9uR3VhcmQpO1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgbGV0IG5vZGUgPSBkb21TZWwuYW5jaG9yTm9kZSwgb2Zmc2V0ID0gZG9tU2VsLmFuY2hvck9mZnNldDtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB2aWV3LmlucHV0LmhpZGVTZWxlY3Rpb25HdWFyZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGRvbVNlbC5hbmNob3JOb2RlICE9IG5vZGUgfHwgZG9tU2VsLmFuY2hvck9mZnNldCAhPSBvZmZzZXQpIHtcbiAgICAgICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHZpZXcuaW5wdXQuaGlkZVNlbGVjdGlvbkd1YXJkKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZWRpdG9yT3duc1NlbGVjdGlvbih2aWV3KSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbi52aXNpYmxlKVxuICAgICAgICAgICAgICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvblwiKTtcbiAgICAgICAgICAgIH0sIDIwKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gc2VsZWN0Q3Vyc29yV3JhcHBlcih2aWV3KSB7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uKCksIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHZpZXcuY3Vyc29yV3JhcHBlci5kb20sIGltZyA9IG5vZGUubm9kZU5hbWUgPT0gXCJJTUdcIjtcbiAgICBpZiAoaW1nKVxuICAgICAgICByYW5nZS5zZXRFbmQobm9kZS5wYXJlbnROb2RlLCBkb21JbmRleChub2RlKSArIDEpO1xuICAgIGVsc2VcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIDApO1xuICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICBkb21TZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgZG9tU2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAvLyBLbHVkZ2UgdG8ga2lsbCAnY29udHJvbCBzZWxlY3Rpb24nIGluIElFMTEgd2hlbiBzZWxlY3RpbmcgYW5cbiAgICAvLyBpbnZpc2libGUgY3Vyc29yIHdyYXBwZXIsIHNpbmNlIHRoYXQgd291bGQgcmVzdWx0IGluIHRob3NlIHdlaXJkXG4gICAgLy8gcmVzaXplIGhhbmRsZXMgYW5kIGEgc2VsZWN0aW9uIHRoYXQgY29uc2lkZXJzIHRoZSBhYnNvbHV0ZWx5XG4gICAgLy8gcG9zaXRpb25lZCB3cmFwcGVyLCByYXRoZXIgdGhhbiB0aGUgcm9vdCBlZGl0YWJsZSBub2RlLCB0aGVcbiAgICAvLyBmb2N1c2VkIGVsZW1lbnQuXG4gICAgaWYgKCFpbWcgJiYgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUgJiYgaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSkge1xuICAgICAgICBub2RlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgbm9kZS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN5bmNOb2RlU2VsZWN0aW9uKHZpZXcsIHNlbCkge1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3LmRlc2NBdChzZWwuZnJvbSk7XG4gICAgICAgIGlmIChkZXNjICE9IHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICAgICAgICAgIGlmIChkZXNjKVxuICAgICAgICAgICAgICAgIGRlc2Muc2VsZWN0Tm9kZSgpO1xuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IGRlc2M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICB9XG59XG4vLyBDbGVhciBhbGwgRE9NIHN0YXRlZnVsbmVzcyBvZiB0aGUgbGFzdCBub2RlIHNlbGVjdGlvbi5cbmZ1bmN0aW9uIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MucGFyZW50KVxuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYy5kZXNlbGVjdE5vZGUoKTtcbiAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRhbmNob3IsICRoZWFkLCBiaWFzKSB7XG4gICAgcmV0dXJuIHZpZXcuc29tZVByb3AoXCJjcmVhdGVTZWxlY3Rpb25CZXR3ZWVuXCIsIGYgPT4gZih2aWV3LCAkYW5jaG9yLCAkaGVhZCkpXG4gICAgICAgIHx8IFRleHRTZWxlY3Rpb24uYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcyk7XG59XG5mdW5jdGlvbiBoYXNGb2N1c0FuZFNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcuZWRpdGFibGUgJiYgIXZpZXcuaGFzRm9jdXMoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBoYXNTZWxlY3Rpb24odmlldyk7XG59XG5mdW5jdGlvbiBoYXNTZWxlY3Rpb24odmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFzZWwuYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gdmlldy5kb20uY29udGFpbnMoc2VsLmFuY2hvck5vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5hbmNob3JOb2RlLnBhcmVudE5vZGUgOiBzZWwuYW5jaG9yTm9kZSkgJiZcbiAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8IHZpZXcuZG9tLmNvbnRhaW5zKHNlbC5mb2N1c05vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5mb2N1c05vZGUucGFyZW50Tm9kZSA6IHNlbC5mb2N1c05vZGUpKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFuY2hvckluUmlnaHRQbGFjZSh2aWV3KSB7XG4gICAgbGV0IGFuY2hvckRPTSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvciwgMCk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICByZXR1cm4gaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gbW92ZVNlbGVjdGlvbkJsb2NrKHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgeyAkYW5jaG9yLCAkaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCAkc2lkZSA9IGRpciA+IDAgPyAkYW5jaG9yLm1heCgkaGVhZCkgOiAkYW5jaG9yLm1pbigkaGVhZCk7XG4gICAgbGV0ICRzdGFydCA9ICEkc2lkZS5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRzaWRlIDogJHNpZGUuZGVwdGggPyBzdGF0ZS5kb2MucmVzb2x2ZShkaXIgPiAwID8gJHNpZGUuYWZ0ZXIoKSA6ICRzaWRlLmJlZm9yZSgpKSA6IG51bGw7XG4gICAgcmV0dXJuICRzdGFydCAmJiBTZWxlY3Rpb24uZmluZEZyb20oJHN0YXJ0LCBkaXIpO1xufVxuZnVuY3Rpb24gYXBwbHkodmlldywgc2VsKSB7XG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gc2VsZWN0SG9yaXpvbnRhbGx5KHZpZXcsIGRpciwgbW9kcykge1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikge1xuICAgICAgICBpZiAobW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgeyAkaGVhZCB9ID0gc2VsLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlcjtcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dCB8fCAhbm9kZS5pc0xlYWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0ICRuZXdIZWFkID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSgkaGVhZC5wb3MgKyBub2RlLm5vZGVTaXplICogKGRpciA8IDAgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihzZWwuJGFuY2hvciwgJG5ld0hlYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghc2VsLmVtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayh2aWV3LnN0YXRlLCBkaXIpO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShtYWMgJiYgbW9kcy5pbmRleE9mKFwibVwiKSA+IC0xKSkge1xuICAgICAgICAgICAgbGV0ICRoZWFkID0gc2VsLiRoZWFkLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlciwgZGVzYztcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbm9kZVBvcyA9IGRpciA8IDAgPyAkaGVhZC5wb3MgLSBub2RlLm5vZGVTaXplIDogJGhlYWQucG9zO1xuICAgICAgICAgICAgaWYgKCEobm9kZS5pc0F0b20gfHwgKGRlc2MgPSB2aWV3LmRvY1ZpZXcuZGVzY0F0KG5vZGVQb3MpKSAmJiAhZGVzYy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IE5vZGVTZWxlY3Rpb24oZGlyIDwgMCA/IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoJGhlYWQucG9zIC0gbm9kZS5ub2RlU2l6ZSkgOiAkaGVhZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2Via2l0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIGFuZCBTYWZhcmkgd2lsbCBpbnRyb2R1Y2UgZXh0cmEgcG9pbnRsZXNzIGN1cnNvclxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9ucyBhcm91bmQgaW5saW5lIHVuZWRpdGFibGUgbm9kZXMsIHNvIHdlIGhhdmUgdG9cbiAgICAgICAgICAgICAgICAvLyB0YWtlIG92ZXIgYW5kIG1vdmUgdGhlIGN1cnNvciBwYXN0IHRoZW0gKCM5MzcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5ldyBUZXh0U2VsZWN0aW9uKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZGlyIDwgMCA/IG5vZGVQb3MgOiBub2RlUG9zICsgbm9kZS5ub2RlU2l6ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbC5ub2RlLmlzSW5saW5lKSB7XG4gICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihkaXIgPiAwID8gc2VsLiR0byA6IHNlbC4kZnJvbSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBub2RlTGVuKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGlzSWdub3JhYmxlKGRvbSwgZGlyKSB7XG4gICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICByZXR1cm4gZGVzYyAmJiBkZXNjLnNpemUgPT0gMCAmJiAoZGlyIDwgMCB8fCBkb20ubmV4dFNpYmxpbmcgfHwgZG9tLm5vZGVOYW1lICE9IFwiQlJcIik7XG59XG5mdW5jdGlvbiBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcikge1xuICAgIHJldHVybiBkaXIgPCAwID8gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSA6IHNraXBJZ25vcmVkTm9kZXNBZnRlcih2aWV3KTtcbn1cbi8vIE1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzbid0IGRpcmVjdGx5IGFmdGVyIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLCB3aGljaCB3aWxsIGNvbmZ1c2UgdGhlIGJyb3dzZXIncyBjdXJzb3IgbW90aW9uIGxvZ2ljLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHNlbC5mb2N1c05vZGUsIG9mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbW92ZU5vZGUsIG1vdmVPZmZzZXQsIGZvcmNlID0gZmFsc2U7XG4gICAgLy8gR2Vja28gd2lsbCBkbyBvZGQgdGhpbmdzIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBkaXJlY3RseSBpbiBmcm9udFxuICAgIC8vIG9mIGEgbm9uLWVkaXRhYmxlIG5vZGUsIHNvIGluIHRoYXQgY2FzZSwgbW92ZSBpdCBpbnRvIHRoZSBuZXh0XG4gICAgLy8gbm9kZSBpZiBwb3NzaWJsZS4gSXNzdWUgcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3IjODMyLlxuICAgIGlmIChnZWNrbyAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZUxlbihub2RlKSAmJiBpc0lnbm9yYWJsZShub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XSwgLTEpKVxuICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmFibGUoYmVmb3JlLCAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0ID0gLS1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Jsb2NrTm9kZShub2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHByZXYgJiYgaXNJZ25vcmFibGUocHJldiwgLTEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KHByZXYpO1xuICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJldikge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlTGVuKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JjZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbm9kZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChtb3ZlTm9kZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbW92ZU5vZGUsIG1vdmVPZmZzZXQpO1xufVxuLy8gTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXNuJ3QgZGlyZWN0bHkgYmVmb3JlIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0FmdGVyKHZpZXcpIHtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBsZW4gPSBub2RlTGVuKG5vZGUpO1xuICAgIGxldCBtb3ZlTm9kZSwgbW92ZU9mZnNldDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChvZmZzZXQgPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChpc0lnbm9yYWJsZShhZnRlciwgMSkpIHtcbiAgICAgICAgICAgICAgICBtb3ZlTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9ICsrb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQmxvY2tOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIGlzSWdub3JhYmxlKG5leHQsIDEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBuZXh0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KG5leHQpICsgMTtcbiAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGxlbiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGVMZW4obm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vdmVOb2RlKVxuICAgICAgICBzZXRTZWxGb2N1cyh2aWV3LCBtb3ZlTm9kZSwgbW92ZU9mZnNldCk7XG59XG5mdW5jdGlvbiBpc0Jsb2NrTm9kZShkb20pIHtcbiAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgIHJldHVybiBkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jaztcbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIobm9kZSwgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKG5vZGUgJiYgb2Zmc2V0ID09IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYgIWhhc0Jsb2NrRGVzYyhub2RlKSkge1xuICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKSArIDE7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUJlZm9yZShub2RlLCBvZmZzZXQpIHtcbiAgICB3aGlsZSAobm9kZSAmJiAhb2Zmc2V0ICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCkge1xuICAgICAgICBsZXQgbmV4dCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRTZWxGb2N1cyh2aWV3LCBub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgICAgICBpZiAoYWZ0ZXIgPSB0ZXh0Tm9kZUFmdGVyKG5vZGUsIG9mZnNldCkpIHtcbiAgICAgICAgICAgIG5vZGUgPSBhZnRlcjtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmVmb3JlID0gdGV4dE5vZGVCZWZvcmUobm9kZSwgb2Zmc2V0KSkge1xuICAgICAgICAgICAgbm9kZSA9IGJlZm9yZTtcbiAgICAgICAgICAgIG9mZnNldCA9IGJlZm9yZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpO1xuICAgIGlmIChzZWxlY3Rpb25Db2xsYXBzZWQoc2VsKSkge1xuICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZXRFbmQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWwuZXh0ZW5kKSB7XG4gICAgICAgIHNlbC5leHRlbmQobm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICBsZXQgeyBzdGF0ZSB9ID0gdmlldztcbiAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgZW5kcyB1cCBoYXBwZW5pbmcsIHJlc2V0IHRoZSBzZWxlY3Rpb24uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlID09IHN0YXRlKVxuICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgfSwgNTApO1xufVxuZnVuY3Rpb24gZmluZERpcmVjdGlvbih2aWV3LCBwb3MpIHtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIShjaHJvbWUgfHwgd2luZG93cykgJiYgJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgY29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICBpZiAocG9zID4gJHBvcy5zdGFydCgpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdmlldy5jb29yZHNBdFBvcyhwb3MgLSAxKTtcbiAgICAgICAgICAgIGxldCBtaWQgPSAoYmVmb3JlLnRvcCArIGJlZm9yZS5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgIGlmIChtaWQgPiBjb29yZHMudG9wICYmIG1pZCA8IGNvb3Jkcy5ib3R0b20gJiYgTWF0aC5hYnMoYmVmb3JlLmxlZnQgLSBjb29yZHMubGVmdCkgPiAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUubGVmdCA8IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA8ICRwb3MuZW5kKCkpIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IHZpZXcuY29vcmRzQXRQb3MocG9zICsgMSk7XG4gICAgICAgICAgICBsZXQgbWlkID0gKGFmdGVyLnRvcCArIGFmdGVyLmJvdHRvbSkgLyAyO1xuICAgICAgICAgICAgaWYgKG1pZCA+IGNvb3Jkcy50b3AgJiYgbWlkIDwgY29vcmRzLmJvdHRvbSAmJiBNYXRoLmFicyhhZnRlci5sZWZ0IC0gY29vcmRzLmxlZnQpID4gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbXB1dGVkID0gZ2V0Q29tcHV0ZWRTdHlsZSh2aWV3LmRvbSkuZGlyZWN0aW9uO1xuICAgIHJldHVybiBjb21wdXRlZCA9PSBcInJ0bFwiID8gXCJydGxcIiA6IFwibHRyXCI7XG59XG4vLyBDaGVjayB3aGV0aGVyIHZlcnRpY2FsIHNlbGVjdGlvbiBtb3Rpb24gd291bGQgaW52b2x2ZSBub2RlXG4vLyBzZWxlY3Rpb25zLiBJZiBzbywgYXBwbHkgaXQgKGlmIG5vdCwgdGhlIHJlc3VsdCBpcyBsZWZ0IHRvIHRoZVxuLy8gYnJvd3NlcilcbmZ1bmN0aW9uIHNlbGVjdFZlcnRpY2FsbHkodmlldywgZGlyLCBtb2RzKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFzZWwuZW1wdHkgfHwgbW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hYyAmJiBtb2RzLmluZGV4T2YoXCJtXCIpID4gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB2aWV3LmVuZE9mVGV4dGJsb2NrKGRpciA8IDAgPyBcInVwXCIgOiBcImRvd25cIikpIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXh0KTtcbiAgICB9XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgc2lkZSA9IGRpciA8IDAgPyAkZnJvbSA6ICR0bztcbiAgICAgICAgbGV0IGJleW9uZCA9IHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiA/IFNlbGVjdGlvbi5uZWFyKHNpZGUsIGRpcikgOiBTZWxlY3Rpb24uZmluZEZyb20oc2lkZSwgZGlyKTtcbiAgICAgICAgcmV0dXJuIGJleW9uZCA/IGFwcGx5KHZpZXcsIGJleW9uZCkgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgZGlyKSB7XG4gICAgaWYgKCEodmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHsgJGhlYWQsICRhbmNob3IsIGVtcHR5IH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgbmV4dE5vZGUgPSAhJGhlYWQudGV4dE9mZnNldCAmJiAoZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXIpO1xuICAgIGlmIChuZXh0Tm9kZSAmJiAhbmV4dE5vZGUuaXNUZXh0KSB7XG4gICAgICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHI7XG4gICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgdHIuZGVsZXRlKCRoZWFkLnBvcyAtIG5leHROb2RlLm5vZGVTaXplLCAkaGVhZC5wb3MpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ci5kZWxldGUoJGhlYWQucG9zLCAkaGVhZC5wb3MgKyBuZXh0Tm9kZS5ub2RlU2l6ZSk7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3dpdGNoRWRpdGFibGUodmlldywgbm9kZSwgc3RhdGUpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBub2RlLmNvbnRlbnRFZGl0YWJsZSA9IHN0YXRlO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbn1cbi8vIElzc3VlICM4NjcgLyAjMTA5MCAvIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTkwMzgyMVxuLy8gSW4gd2hpY2ggU2FmYXJpIChhbmQgYXQgc29tZSBwb2ludCBpbiB0aGUgcGFzdCwgQ2hyb21lKSBkb2VzIHJlYWxseVxuLy8gd3JvbmcgdGhpbmdzIHdoZW4gdGhlIGRvd24gYXJyb3cgaXMgcHJlc3NlZCB3aGVuIHRoZSBjdXJzb3IgaXNcbi8vIGRpcmVjdGx5IGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBhbmQgaGFzIGFuIHVuZWRpdGFibGUgbm9kZVxuLy8gYWZ0ZXIgaXRcbmZ1bmN0aW9uIHNhZmFyaURvd25BcnJvd0J1Zyh2aWV3KSB7XG4gICAgaWYgKCFzYWZhcmkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB7IGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBpZiAoZm9jdXNOb2RlICYmIGZvY3VzTm9kZS5ub2RlVHlwZSA9PSAxICYmIGZvY3VzT2Zmc2V0ID09IDAgJiZcbiAgICAgICAgZm9jdXNOb2RlLmZpcnN0Q2hpbGQgJiYgZm9jdXNOb2RlLmZpcnN0Q2hpbGQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikge1xuICAgICAgICBsZXQgY2hpbGQgPSBmb2N1c05vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgc3dpdGNoRWRpdGFibGUodmlldywgY2hpbGQsIFwidHJ1ZVwiKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBjaGlsZCwgXCJmYWxzZVwiKSwgMjApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBBIGJhY2tkcm9wIGtleSBtYXBwaW5nIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cyBzdXBwcmVzcyBrZXlzXG4vLyB0aGF0IGhhdmUgYSBkYW5nZXJvdXMgZGVmYXVsdCBlZmZlY3QsIGV2ZW4gaWYgdGhlIGNvbW1hbmRzIHRoZXkgYXJlXG4vLyBib3VuZCB0byByZXR1cm4gZmFsc2UsIGFuZCB0byBtYWtlIHN1cmUgdGhhdCBjdXJzb3ItbW90aW9uIGtleXNcbi8vIGZpbmQgYSBjdXJzb3IgKGFzIG9wcG9zZWQgdG8gYSBub2RlIHNlbGVjdGlvbikgd2hlbiBwcmVzc2VkLiBGb3Jcbi8vIGN1cnNvci1tb3Rpb24ga2V5cywgdGhlIGNvZGUgaW4gdGhlIGhhbmRsZXJzIGFsc28gdGFrZXMgY2FyZSBvZlxuLy8gYmxvY2sgc2VsZWN0aW9ucy5cbmZ1bmN0aW9uIGdldE1vZHMoZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoZXZlbnQuY3RybEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiY1wiO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJtXCI7XG4gICAgaWYgKGV2ZW50LmFsdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiYVwiO1xuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwic1wiO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjYXB0dXJlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgIGxldCBjb2RlID0gZXZlbnQua2V5Q29kZSwgbW9kcyA9IGdldE1vZHMoZXZlbnQpO1xuICAgIGlmIChjb2RlID09IDggfHwgKG1hYyAmJiBjb2RlID09IDcyICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIEJhY2tzcGFjZSwgQ3RybC1oIG9uIE1hY1xuICAgICAgICByZXR1cm4gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgLTEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgLTEpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoY29kZSA9PSA0NiAmJiAhZXZlbnQuc2hpZnRLZXkpIHx8IChtYWMgJiYgY29kZSA9PSA2OCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBEZWxldGUsIEN0cmwtZCBvbiBNYWNcbiAgICAgICAgcmV0dXJuIHN0b3BOYXRpdmVIb3Jpem9udGFsRGVsZXRlKHZpZXcsIDEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMTMgfHwgY29kZSA9PSAyNykgeyAvLyBFbnRlciwgRXNjXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDM3IHx8IChtYWMgJiYgY29kZSA9PSA2NiAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBMZWZ0IGFycm93LCBDdHJsLWIgb24gTWFjXG4gICAgICAgIGxldCBkaXIgPSBjb2RlID09IDM3ID8gKGZpbmREaXJlY3Rpb24odmlldywgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSkgPT0gXCJsdHJcIiA/IC0xIDogMSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgZGlyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAzOSB8fCAobWFjICYmIGNvZGUgPT0gNzAgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gUmlnaHQgYXJyb3csIEN0cmwtZiBvbiBNYWNcbiAgICAgICAgbGV0IGRpciA9IGNvZGUgPT0gMzkgPyAoZmluZERpcmVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSA9PSBcImx0clwiID8gMSA6IC0xKSA6IDE7XG4gICAgICAgIHJldHVybiBzZWxlY3RIb3Jpem9udGFsbHkodmlldywgZGlyLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMzggfHwgKG1hYyAmJiBjb2RlID09IDgwICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIFVwIGFycm93LCBDdHJsLXAgb24gTWFjXG4gICAgICAgIHJldHVybiBzZWxlY3RWZXJ0aWNhbGx5KHZpZXcsIC0xLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIC0xKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSA0MCB8fCAobWFjICYmIGNvZGUgPT0gNzggJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gRG93biBhcnJvdywgQ3RybC1uIG9uIE1hY1xuICAgICAgICByZXR1cm4gc2FmYXJpRG93bkFycm93QnVnKHZpZXcpIHx8IHNlbGVjdFZlcnRpY2FsbHkodmlldywgMSwgbW9kcykgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAxKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kcyA9PSAobWFjID8gXCJtXCIgOiBcImNcIikgJiZcbiAgICAgICAgKGNvZGUgPT0gNjYgfHwgY29kZSA9PSA3MyB8fCBjb2RlID09IDg5IHx8IGNvZGUgPT0gOTApKSB7IC8vIE1vZC1bYml5el1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKSB7XG4gICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybUNvcGllZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgbGV0IGNvbnRleHQgPSBbXSwgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHNsaWNlO1xuICAgIHdoaWxlIChvcGVuU3RhcnQgPiAxICYmIG9wZW5FbmQgPiAxICYmIGNvbnRlbnQuY2hpbGRDb3VudCA9PSAxICYmIGNvbnRlbnQuZmlyc3RDaGlsZC5jaGlsZENvdW50ID09IDEpIHtcbiAgICAgICAgb3BlblN0YXJ0LS07XG4gICAgICAgIG9wZW5FbmQtLTtcbiAgICAgICAgbGV0IG5vZGUgPSBjb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGNvbnRleHQucHVzaChub2RlLnR5cGUubmFtZSwgbm9kZS5hdHRycyAhPSBub2RlLnR5cGUuZGVmYXVsdEF0dHJzID8gbm9kZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBjb250ZW50ID0gbm9kZS5jb250ZW50O1xuICAgIH1cbiAgICBsZXQgc2VyaWFsaXplciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRTZXJpYWxpemVyXCIpIHx8IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgbGV0IGRvYyA9IGRldGFjaGVkRG9jKCksIHdyYXAgPSBkb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQoY29udGVudCwgeyBkb2N1bWVudDogZG9jIH0pKTtcbiAgICBsZXQgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZCwgbmVlZHNXcmFwLCB3cmFwcGVycyA9IDA7XG4gICAgd2hpbGUgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmIChuZWVkc1dyYXAgPSB3cmFwTWFwW2ZpcnN0Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBuZWVkc1dyYXAubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwcGVyID0gZG9jLmNyZWF0ZUVsZW1lbnQobmVlZHNXcmFwW2ldKTtcbiAgICAgICAgICAgIHdoaWxlICh3cmFwLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh3cmFwLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICAgICAgICAgIHdyYXBwZXJzKys7XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICBmaXJzdENoaWxkLnNldEF0dHJpYnV0ZShcImRhdGEtcG0tc2xpY2VcIiwgYCR7b3BlblN0YXJ0fSAke29wZW5FbmR9JHt3cmFwcGVycyA/IGAgLSR7d3JhcHBlcnN9YCA6IFwiXCJ9ICR7SlNPTi5zdHJpbmdpZnkoY29udGV4dCl9YCk7XG4gICAgbGV0IHRleHQgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXJcIiwgZiA9PiBmKHNsaWNlLCB2aWV3KSkgfHxcbiAgICAgICAgc2xpY2UuY29udGVudC50ZXh0QmV0d2VlbigwLCBzbGljZS5jb250ZW50LnNpemUsIFwiXFxuXFxuXCIpO1xuICAgIHJldHVybiB7IGRvbTogd3JhcCwgdGV4dCB9O1xufVxuLy8gUmVhZCBhIHNsaWNlIG9mIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIChvciBkcm9wIGRhdGEpLlxuZnVuY3Rpb24gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHBsYWluVGV4dCwgJGNvbnRleHQpIHtcbiAgICBsZXQgaW5Db2RlID0gJGNvbnRleHQucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCBkb20sIHNsaWNlO1xuICAgIGlmICghaHRtbCAmJiAhdGV4dClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFzVGV4dCA9IHRleHQgJiYgKHBsYWluVGV4dCB8fCBpbkNvZGUgfHwgIWh0bWwpO1xuICAgIGlmIChhc1RleHQpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFRleHRcIiwgZiA9PiB7IHRleHQgPSBmKHRleHQsIGluQ29kZSB8fCBwbGFpblRleHQsIHZpZXcpOyB9KTtcbiAgICAgICAgaWYgKGluQ29kZSlcbiAgICAgICAgICAgIHJldHVybiB0ZXh0ID8gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odmlldy5zdGF0ZS5zY2hlbWEudGV4dCh0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikpKSwgMCwgMCkgOiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRUZXh0UGFyc2VyXCIsIGYgPT4gZih0ZXh0LCAkY29udGV4dCwgcGxhaW5UZXh0LCB2aWV3KSk7XG4gICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIHNsaWNlID0gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gJGNvbnRleHQubWFya3MoKTtcbiAgICAgICAgICAgIGxldCB7IHNjaGVtYSB9ID0gdmlldy5zdGF0ZSwgc2VyaWFsaXplciA9IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYShzY2hlbWEpO1xuICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRleHQuc3BsaXQoLyg/Olxcclxcbj98XFxuKSsvKS5mb3JFYWNoKGJsb2NrID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrKVxuICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplTm9kZShzY2hlbWEudGV4dChibG9jaywgbWFya3MpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZEhUTUxcIiwgZiA9PiB7IGh0bWwgPSBmKGh0bWwsIHZpZXcpOyB9KTtcbiAgICAgICAgZG9tID0gcmVhZEhUTUwoaHRtbCk7XG4gICAgICAgIGlmICh3ZWJraXQpXG4gICAgICAgICAgICByZXN0b3JlUmVwbGFjZWRTcGFjZXMoZG9tKTtcbiAgICB9XG4gICAgbGV0IGNvbnRleHROb2RlID0gZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtcG0tc2xpY2VdXCIpO1xuICAgIGxldCBzbGljZURhdGEgPSBjb250ZXh0Tm9kZSAmJiAvXihcXGQrKSAoXFxkKykoPzogLShcXGQrKSk/ICguKikvLmV4ZWMoY29udGV4dE5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wbS1zbGljZVwiKSB8fCBcIlwiKTtcbiAgICBpZiAoc2xpY2VEYXRhICYmIHNsaWNlRGF0YVszXSlcbiAgICAgICAgZm9yIChsZXQgaSA9ICtzbGljZURhdGFbM107IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IGRvbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkb20gPSBjaGlsZDtcbiAgICAgICAgfVxuICAgIGlmICghc2xpY2UpIHtcbiAgICAgICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRQYXJzZXJcIikgfHwgdmlldy5zb21lUHJvcChcImRvbVBhcnNlclwiKSB8fCBET01QYXJzZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgICAgIHNsaWNlID0gcGFyc2VyLnBhcnNlU2xpY2UoZG9tLCB7XG4gICAgICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICEhKGFzVGV4dCB8fCBzbGljZURhdGEpLFxuICAgICAgICAgICAgY29udGV4dDogJGNvbnRleHQsXG4gICAgICAgICAgICBydWxlRnJvbU5vZGUoZG9tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRvbS5uZXh0U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBkb20ucGFyZW50Tm9kZSAmJiAhaW5saW5lUGFyZW50cy50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2xpY2VEYXRhKSB7XG4gICAgICAgIHNsaWNlID0gYWRkQ29udGV4dChjbG9zZVNsaWNlKHNsaWNlLCArc2xpY2VEYXRhWzFdLCArc2xpY2VEYXRhWzJdKSwgc2xpY2VEYXRhWzRdKTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIEhUTUwgd2Fzbid0IGNyZWF0ZWQgYnkgUHJvc2VNaXJyb3IuIE1ha2Ugc3VyZSB0b3AtbGV2ZWwgc2libGluZ3MgYXJlIGNvaGVyZW50XG4gICAgICAgIHNsaWNlID0gU2xpY2UubWF4T3Blbihub3JtYWxpemVTaWJsaW5ncyhzbGljZS5jb250ZW50LCAkY29udGV4dCksIHRydWUpO1xuICAgICAgICBpZiAoc2xpY2Uub3BlblN0YXJ0IHx8IHNsaWNlLm9wZW5FbmQpIHtcbiAgICAgICAgICAgIGxldCBvcGVuU3RhcnQgPSAwLCBvcGVuRW5kID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgPSBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQ7IG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydCAmJiAhbm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nOyBvcGVuU3RhcnQrKywgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZCkgeyB9XG4gICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2xpY2UuY29udGVudC5sYXN0Q2hpbGQ7IG9wZW5FbmQgPCBzbGljZS5vcGVuRW5kICYmICFub2RlLnR5cGUuc3BlYy5pc29sYXRpbmc7IG9wZW5FbmQrKywgbm9kZSA9IG5vZGUubGFzdENoaWxkKSB7IH1cbiAgICAgICAgICAgIHNsaWNlID0gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtUGFzdGVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG5jb25zdCBpbmxpbmVQYXJlbnRzID0gL14oYXxhYmJyfGFjcm9ueW18YnxjaXRlfGNvZGV8ZGVsfGVtfGl8aW5zfGtiZHxsYWJlbHxvdXRwdXR8cXxydWJ5fHN8c2FtcHxzcGFufHN0cm9uZ3xzdWJ8c3VwfHRpbWV8dXx0dHx2YXIpJC9pO1xuLy8gVGFrZXMgYSBzbGljZSBwYXJzZWQgd2l0aCBwYXJzZVNsaWNlLCB3aGljaCBtZWFucyB0aGVyZSBoYXNuJ3QgYmVlblxuLy8gYW55IGNvbnRlbnQtZXhwcmVzc2lvbiBjaGVja2luZyBkb25lIG9uIHRoZSB0b3Agbm9kZXMsIHRyaWVzIHRvXG4vLyBmaW5kIGEgcGFyZW50IG5vZGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dCB0aGF0IG1pZ2h0IGZpdCB0aGUgbm9kZXMsXG4vLyBhbmQgaWYgc3VjY2Vzc2Z1bCwgcmVidWlsZHMgdGhlIHNsaWNlIHNvIHRoYXQgaXQgZml0cyBpbnRvIHRoYXQgcGFyZW50LlxuLy9cbi8vIFRoaXMgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIHRoYXQgVHJhbnNmb3JtLnJlcGxhY2UgZXhwZWN0cyBhXG4vLyBjb2hlcmVudCBzbGljZSwgYW5kIHdpbGwgZmFpbCB0byBwbGFjZSBhIHNldCBvZiBzaWJsaW5ncyB0aGF0IGRvbid0XG4vLyBmaXQgYW55d2hlcmUgaW4gdGhlIHNjaGVtYS5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpYmxpbmdzKGZyYWdtZW50LCAkY29udGV4dCkge1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50IDwgMilcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjb250ZXh0Lm5vZGUoZCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdCgkY29udGV4dC5pbmRleChkKSk7XG4gICAgICAgIGxldCBsYXN0V3JhcCwgcmVzdWx0ID0gW107XG4gICAgICAgIGZyYWdtZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgd3JhcCA9IG1hdGNoLmZpbmRXcmFwcGluZyhub2RlLnR5cGUpLCBpbkxhc3Q7XG4gICAgICAgICAgICBpZiAoIXdyYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaW5MYXN0ID0gcmVzdWx0Lmxlbmd0aCAmJiBsYXN0V3JhcC5sZW5ndGggJiYgYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLCAwKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBpbkxhc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGNsb3NlUmlnaHQocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSwgbGFzdFdyYXAubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcHBlZCA9IHdpdGhXcmFwcGVycyhub2RlLCB3cmFwKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3cmFwcGVkKTtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoVHlwZSh3cmFwcGVkLnR5cGUpO1xuICAgICAgICAgICAgICAgIGxhc3RXcmFwID0gd3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiB3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZnJvbSA9IDApIHtcbiAgICBmb3IgKGxldCBpID0gd3JhcC5sZW5ndGggLSAxOyBpID49IGZyb207IGktLSlcbiAgICAgICAgbm9kZSA9IHdyYXBbaV0uY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiBub2RlO1xufVxuLy8gVXNlZCB0byBncm91cCBhZGphY2VudCBub2RlcyB3cmFwcGVkIGluIHNpbWlsYXIgcGFyZW50cyBieVxuLy8gbm9ybWFsaXplU2libGluZ3MgaW50byB0aGUgc2FtZSBwYXJlbnQgbm9kZVxuZnVuY3Rpb24gYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCBzaWJsaW5nLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA8IHdyYXAubGVuZ3RoICYmIGRlcHRoIDwgbGFzdFdyYXAubGVuZ3RoICYmIHdyYXBbZGVwdGhdID09IGxhc3RXcmFwW2RlcHRoXSkge1xuICAgICAgICBsZXQgaW5uZXIgPSBhZGRUb1NpYmxpbmcod3JhcCwgbGFzdFdyYXAsIG5vZGUsIHNpYmxpbmcubGFzdENoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgICBpZiAoaW5uZXIpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5yZXBsYWNlQ2hpbGQoc2libGluZy5jaGlsZENvdW50IC0gMSwgaW5uZXIpKTtcbiAgICAgICAgbGV0IG1hdGNoID0gc2libGluZy5jb250ZW50TWF0Y2hBdChzaWJsaW5nLmNoaWxkQ291bnQpO1xuICAgICAgICBpZiAobWF0Y2gubWF0Y2hUeXBlKGRlcHRoID09IHdyYXAubGVuZ3RoIC0gMSA/IG5vZGUudHlwZSA6IHdyYXBbZGVwdGggKyAxXSkpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5hcHBlbmQoRnJhZ21lbnQuZnJvbSh3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZGVwdGggKyAxKSkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbG9zZVJpZ2h0KG5vZGUsIGRlcHRoKSB7XG4gICAgaWYgKGRlcHRoID09IDApXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIGxldCBmcmFnbWVudCA9IG5vZGUuY29udGVudC5yZXBsYWNlQ2hpbGQobm9kZS5jaGlsZENvdW50IC0gMSwgY2xvc2VSaWdodChub2RlLmxhc3RDaGlsZCwgZGVwdGggLSAxKSk7XG4gICAgbGV0IGZpbGwgPSBub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5vZGUuY29weShmcmFnbWVudC5hcHBlbmQoZmlsbCkpO1xufVxuZnVuY3Rpb24gY2xvc2VSYW5nZShmcmFnbWVudCwgc2lkZSwgZnJvbSwgdG8sIGRlcHRoLCBvcGVuRW5kKSB7XG4gICAgbGV0IG5vZGUgPSBzaWRlIDwgMCA/IGZyYWdtZW50LmZpcnN0Q2hpbGQgOiBmcmFnbWVudC5sYXN0Q2hpbGQsIGlubmVyID0gbm9kZS5jb250ZW50O1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50ID4gMSlcbiAgICAgICAgb3BlbkVuZCA9IDA7XG4gICAgaWYgKGRlcHRoIDwgdG8gLSAxKVxuICAgICAgICBpbm5lciA9IGNsb3NlUmFuZ2UoaW5uZXIsIHNpZGUsIGZyb20sIHRvLCBkZXB0aCArIDEsIG9wZW5FbmQpO1xuICAgIGlmIChkZXB0aCA+PSBmcm9tKVxuICAgICAgICBpbm5lciA9IHNpZGUgPCAwID8gbm9kZS5jb250ZW50TWF0Y2hBdCgwKS5maWxsQmVmb3JlKGlubmVyLCBvcGVuRW5kIDw9IGRlcHRoKS5hcHBlbmQoaW5uZXIpXG4gICAgICAgICAgICA6IGlubmVyLmFwcGVuZChub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoc2lkZSA8IDAgPyAwIDogZnJhZ21lbnQuY2hpbGRDb3VudCAtIDEsIG5vZGUuY29weShpbm5lcikpO1xufVxuZnVuY3Rpb24gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgaWYgKG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAtMSwgb3BlblN0YXJ0LCBzbGljZS5vcGVuU3RhcnQsIDAsIHNsaWNlLm9wZW5FbmQpLCBvcGVuU3RhcnQsIHNsaWNlLm9wZW5FbmQpO1xuICAgIGlmIChvcGVuRW5kIDwgc2xpY2Uub3BlbkVuZClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAxLCBvcGVuRW5kLCBzbGljZS5vcGVuRW5kLCAwLCAwKSwgc2xpY2Uub3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG4vLyBUcmljayBmcm9tIGpRdWVyeSAtLSBzb21lIGVsZW1lbnRzIG11c3QgYmUgd3JhcHBlZCBpbiBvdGhlclxuLy8gZWxlbWVudHMgZm9yIGlubmVySFRNTCB0byB3b3JrLiBJLmUuIGlmIHlvdSBkbyBgZGl2LmlubmVySFRNTCA9XG4vLyBcIjx0ZD4uLjwvdGQ+XCJgIHRoZSB0YWJsZSBjZWxscyBhcmUgaWdub3JlZC5cbmNvbnN0IHdyYXBNYXAgPSB7XG4gICAgdGhlYWQ6IFtcInRhYmxlXCJdLFxuICAgIHRib2R5OiBbXCJ0YWJsZVwiXSxcbiAgICB0Zm9vdDogW1widGFibGVcIl0sXG4gICAgY2FwdGlvbjogW1widGFibGVcIl0sXG4gICAgY29sZ3JvdXA6IFtcInRhYmxlXCJdLFxuICAgIGNvbDogW1widGFibGVcIiwgXCJjb2xncm91cFwiXSxcbiAgICB0cjogW1widGFibGVcIiwgXCJ0Ym9keVwiXSxcbiAgICB0ZDogW1widGFibGVcIiwgXCJ0Ym9keVwiLCBcInRyXCJdLFxuICAgIHRoOiBbXCJ0YWJsZVwiLCBcInRib2R5XCIsIFwidHJcIl1cbn07XG5sZXQgX2RldGFjaGVkRG9jID0gbnVsbDtcbmZ1bmN0aW9uIGRldGFjaGVkRG9jKCkge1xuICAgIHJldHVybiBfZGV0YWNoZWREb2MgfHwgKF9kZXRhY2hlZERvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcInRpdGxlXCIpKTtcbn1cbmZ1bmN0aW9uIHJlYWRIVE1MKGh0bWwpIHtcbiAgICBsZXQgbWV0YXMgPSAvXihcXHMqPG1ldGEgW14+XSo+KSovLmV4ZWMoaHRtbCk7XG4gICAgaWYgKG1ldGFzKVxuICAgICAgICBodG1sID0gaHRtbC5zbGljZShtZXRhc1swXS5sZW5ndGgpO1xuICAgIGxldCBlbHQgPSBkZXRhY2hlZERvYygpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbGV0IGZpcnN0VGFnID0gLzwoW2Etel1bXj5cXHNdKykvaS5leGVjKGh0bWwpLCB3cmFwO1xuICAgIGlmICh3cmFwID0gZmlyc3RUYWcgJiYgd3JhcE1hcFtmaXJzdFRhZ1sxXS50b0xvd2VyQ2FzZSgpXSlcbiAgICAgICAgaHRtbCA9IHdyYXAubWFwKG4gPT4gXCI8XCIgKyBuICsgXCI+XCIpLmpvaW4oXCJcIikgKyBodG1sICsgd3JhcC5tYXAobiA9PiBcIjwvXCIgKyBuICsgXCI+XCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgIGVsdC5pbm5lckhUTUwgPSBodG1sO1xuICAgIGlmICh3cmFwKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXAubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbHQgPSBlbHQucXVlcnlTZWxlY3Rvcih3cmFwW2ldKSB8fCBlbHQ7XG4gICAgcmV0dXJuIGVsdDtcbn1cbi8vIFdlYmtpdCBicm93c2VycyBkbyBzb21lIGhhcmQtdG8tcHJlZGljdCByZXBsYWNlbWVudCBvZiByZWd1bGFyXG4vLyBzcGFjZXMgd2l0aCBub24tYnJlYWtpbmcgc3BhY2VzIHdoZW4gcHV0dGluZyBjb250ZW50IG9uIHRoZVxuLy8gY2xpcGJvYXJkLiBUaGlzIHRyaWVzIHRvIGNvbnZlcnQgc3VjaCBub24tYnJlYWtpbmcgc3BhY2VzICh3aGljaFxuLy8gd2lsbCBiZSB3cmFwcGVkIGluIGEgcGxhaW4gc3BhbiBvbiBDaHJvbWUsIGEgc3BhbiB3aXRoIGNsYXNzXG4vLyBBcHBsZS1jb252ZXJ0ZWQtc3BhY2Ugb24gU2FmYXJpKSBiYWNrIHRvIHJlZ3VsYXIgc3BhY2VzLlxuZnVuY3Rpb24gcmVzdG9yZVJlcGxhY2VkU3BhY2VzKGRvbSkge1xuICAgIGxldCBub2RlcyA9IGRvbS5xdWVyeVNlbGVjdG9yQWxsKGNocm9tZSA/IFwic3Bhbjpub3QoW2NsYXNzXSk6bm90KFtzdHlsZV0pXCIgOiBcInNwYW4uQXBwbGUtY29udmVydGVkLXNwYWNlXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSAmJiBub2RlLnRleHRDb250ZW50ID09IFwiXFx1MDBhMFwiICYmIG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZG9tLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIgXCIpLCBub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRDb250ZXh0KHNsaWNlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgbGV0IHNjaGVtYSA9IHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZC50eXBlLnNjaGVtYSwgYXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgICAgYXJyYXkgPSBKU09OLnBhcnNlKGNvbnRleHQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgfVxuICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gc2xpY2U7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIGxldCB0eXBlID0gc2NoZW1hLm5vZGVzW2FycmF5W2ldXTtcbiAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGFycmF5W2kgKyAxXSwgY29udGVudCkpO1xuICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgb3BlbkVuZCsrO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBET00gZXZlbnRzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBlZGl0b3IsIGFuZCBjYWxsYmFjayBmdW5jdGlvbnNcbi8vIHRvIGludm9rZSB3aGVuIHRoZSBldmVudCBmaXJlcy5cbmNvbnN0IGhhbmRsZXJzID0ge307XG5jb25zdCBlZGl0SGFuZGxlcnMgPSB7fTtcbmNvbnN0IHBhc3NpdmVIYW5kbGVycyA9IHsgdG91Y2hzdGFydDogdHJ1ZSwgdG91Y2htb3ZlOiB0cnVlIH07XG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zaGlmdEtleSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlRG93biA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdENsaWNrID0geyB0aW1lOiAwLCB4OiAwLCB5OiAwLCB0eXBlOiBcIlwiIH07XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RJT1NFbnRlciA9IDA7XG4gICAgICAgIHRoaXMubGFzdElPU0VudGVyRmFsbGJhY2tUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdEZvY3VzID0gMDtcbiAgICAgICAgdGhpcy5sYXN0VG91Y2ggPSAwO1xuICAgICAgICB0aGlzLmxhc3RBbmRyb2lkRGVsZXRlID0gMDtcbiAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21wb3NpbmdUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Ob2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25JRCA9IDE7XG4gICAgICAgIC8vIFNldCB0byBhIGNvbXBvc2l0aW9uIElEIHdoZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBhdCBjb21wb3NpdGlvbmVuZFxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgPSAwO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5oaWRlU2VsZWN0aW9uR3VhcmQgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRJbnB1dCh2aWV3KSB7XG4gICAgZm9yIChsZXQgZXZlbnQgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1tldmVudF0gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudEJlbG9uZ3NUb1ZpZXcodmlldywgZXZlbnQpICYmICFydW5DdXN0b21IYW5kbGVyKHZpZXcsIGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHZpZXcsIGV2ZW50KTtcbiAgICAgICAgfSwgcGFzc2l2ZUhhbmRsZXJzW2V2ZW50XSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgLy8gT24gU2FmYXJpLCBmb3IgcmVhc29ucyBiZXlvbmQgbXkgdW5kZXJzdGFuZGluZywgYWRkaW5nIGFuIGlucHV0XG4gICAgLy8gZXZlbnQgaGFuZGxlciBtYWtlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlblxuICAgIC8vIHlvdSBwcmVzcyBlbnRlciBnbyBhd2F5LlxuICAgIGlmIChzYWZhcmkpXG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiBudWxsKTtcbiAgICBlbnN1cmVMaXN0ZW5lcnModmlldyk7XG59XG5mdW5jdGlvbiBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgb3JpZ2luKSB7XG4gICAgdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgIHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPSBEYXRlLm5vdygpO1xufVxuZnVuY3Rpb24gZGVzdHJveUlucHV0KHZpZXcpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBmb3IgKGxldCB0eXBlIGluIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVycylcbiAgICAgICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB2aWV3LmlucHV0LmV2ZW50SGFuZGxlcnNbdHlwZV0pO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCk7XG59XG5mdW5jdGlvbiBlbnN1cmVMaXN0ZW5lcnModmlldykge1xuICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVET01FdmVudHNcIiwgY3VycmVudEhhbmRsZXJzID0+IHtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBjdXJyZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBpZiAoIXZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSA9IGV2ZW50ID0+IHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpIHtcbiAgICByZXR1cm4gdmlldy5zb21lUHJvcChcImhhbmRsZURPTUV2ZW50c1wiLCBoYW5kbGVycyA9PiB7XG4gICAgICAgIGxldCBoYW5kbGVyID0gaGFuZGxlcnNbZXZlbnQudHlwZV07XG4gICAgICAgIHJldHVybiBoYW5kbGVyID8gaGFuZGxlcih2aWV3LCBldmVudCkgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IGZhbHNlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZXZlbnRCZWxvbmdzVG9WaWV3KHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQ7IG5vZGUgIT0gdmlldy5kb207IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8XG4gICAgICAgICAgICAobm9kZS5wbVZpZXdEZXNjICYmIG5vZGUucG1WaWV3RGVzYy5zdG9wRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIXJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpICYmIGhhbmRsZXJzW2V2ZW50LnR5cGVdICYmXG4gICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgaGFuZGxlcnNbZXZlbnQudHlwZV0odmlldywgZXZlbnQpO1xufVxuZWRpdEhhbmRsZXJzLmtleWRvd24gPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBldmVudC5rZXlDb2RlID09IDE2IHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgIGlmIChpbk9yTmVhckNvbXBvc2l0aW9uKHZpZXcsIGV2ZW50KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBTdXBwcmVzcyBlbnRlciBrZXkgZXZlbnRzIG9uIENocm9tZSBBbmRyb2lkLCBiZWNhdXNlIHRob3NlIHRlbmRcbiAgICAvLyB0byBiZSBwYXJ0IG9mIGEgY29uZnVzZWQgc2VxdWVuY2Ugb2YgY29tcG9zaXRpb24gZXZlbnRzIGZpcmVkLFxuICAgIC8vIGFuZCBoYW5kbGluZyB0aGVtIGVhZ2VybHkgdGVuZHMgdG8gY29ycnVwdCB0aGUgaW5wdXQuXG4gICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lICYmIGV2ZW50LmtleUNvZGUgPT0gMTMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIC8vIE9uIGlPUywgaWYgd2UgcHJldmVudERlZmF1bHQgZW50ZXIga2V5IHByZXNzZXMsIHRoZSB2aXJ0dWFsXG4gICAgLy8ga2V5Ym9hcmQgZ2V0cyBjb25mdXNlZC4gU28gdGhlIGhhY2sgaGVyZSBpcyB0byBzZXQgYSBmbGFnIHRoYXRcbiAgICAvLyBtYWtlcyB0aGUgRE9NIGNoYW5nZSBjb2RlIHJlY29nbml6ZSB0aGF0IHdoYXQganVzdCBoYXBwZW5zIHNob3VsZFxuICAgIC8vIGJlIHJlcGxhY2VkIGJ5IHdoYXRldmVyIHRoZSBFbnRlciBrZXkgaGFuZGxlcnMgZG8uXG4gICAgaWYgKGlvcyAmJiBldmVudC5rZXlDb2RlID09IDEzICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gbm93O1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdElPU0VudGVyID09IG5vdykge1xuICAgICAgICAgICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpO1xuICAgICAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkgfHwgY2FwdHVyZUtleURvd24odmlldywgZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJrZXlcIik7XG4gICAgfVxufTtcbmVkaXRIYW5kbGVycy5rZXl1cCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDE2KVxuICAgICAgICB2aWV3LmlucHV0LnNoaWZ0S2V5ID0gZmFsc2U7XG59O1xuZWRpdEhhbmRsZXJzLmtleXByZXNzID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAoaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkgfHwgIWV2ZW50LmNoYXJDb2RlIHx8XG4gICAgICAgIGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fCBtYWMgJiYgZXZlbnQubWV0YUtleSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5UHJlc3NcIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgfHwgIXNlbC4kZnJvbS5zYW1lUGFyZW50KHNlbC4kdG8pKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSk7XG4gICAgICAgIGlmICghL1tcXHJcXG5dLy50ZXN0KHRleHQpICYmICF2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVGV4dElucHV0XCIsIGYgPT4gZih2aWV3LCBzZWwuJGZyb20ucG9zLCBzZWwuJHRvLnBvcywgdGV4dCkpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmluc2VydFRleHQodGV4dCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGV2ZW50Q29vcmRzKGV2ZW50KSB7IHJldHVybiB7IGxlZnQ6IGV2ZW50LmNsaWVudFgsIHRvcDogZXZlbnQuY2xpZW50WSB9OyB9XG5mdW5jdGlvbiBpc05lYXIoZXZlbnQsIGNsaWNrKSB7XG4gICAgbGV0IGR4ID0gY2xpY2sueCAtIGV2ZW50LmNsaWVudFgsIGR5ID0gY2xpY2sueSAtIGV2ZW50LmNsaWVudFk7XG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5IDwgMTAwO1xufVxuZnVuY3Rpb24gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBwcm9wTmFtZSwgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBpZiAodmlldy5zb21lUHJvcChwcm9wTmFtZSwgZiA9PiBpID4gJHBvcy5kZXB0aCA/IGYodmlldywgcG9zLCAkcG9zLm5vZGVBZnRlciwgJHBvcy5iZWZvcmUoaSksIGV2ZW50LCB0cnVlKVxuICAgICAgICAgICAgOiBmKHZpZXcsIHBvcywgJHBvcy5ub2RlKGkpLCAkcG9zLmJlZm9yZShpKSwgZXZlbnQsIGZhbHNlKSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKHZpZXcsIHNlbGVjdGlvbiwgb3JpZ2luKSB7XG4gICAgaWYgKCF2aWV3LmZvY3VzZWQpXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgIGlmIChvcmlnaW4gPT0gXCJwb2ludGVyXCIpXG4gICAgICAgIHRyLnNldE1ldGEoXCJwb2ludGVyXCIsIHRydWUpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIpO1xufVxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZExlYWYodmlldywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpLCBub2RlID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgaWYgKG5vZGUgJiYgbm9kZS5pc0F0b20gJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIG5ldyBOb2RlU2VsZWN0aW9uKCRwb3MpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzZWxlY3RDbGlja2VkTm9kZSh2aWV3LCBpbnNpZGUpIHtcbiAgICBpZiAoaW5zaWRlID09IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLCBzZWxlY3RlZE5vZGUsIHNlbGVjdEF0O1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKVxuICAgICAgICBzZWxlY3RlZE5vZGUgPSBzZWwubm9kZTtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoaW5zaWRlKTtcbiAgICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aCArIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSBpID4gJHBvcy5kZXB0aCA/ICRwb3Mubm9kZUFmdGVyIDogJHBvcy5ub2RlKGkpO1xuICAgICAgICBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZE5vZGUgJiYgc2VsLiRmcm9tLmRlcHRoID4gMCAmJlxuICAgICAgICAgICAgICAgIGkgPj0gc2VsLiRmcm9tLmRlcHRoICYmICRwb3MuYmVmb3JlKHNlbC4kZnJvbS5kZXB0aCArIDEpID09IHNlbC4kZnJvbS5wb3MpXG4gICAgICAgICAgICAgICAgc2VsZWN0QXQgPSAkcG9zLmJlZm9yZShzZWwuJGZyb20uZGVwdGgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlbGVjdEF0ID0gJHBvcy5iZWZvcmUoaSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZWN0QXQgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIHNlbGVjdEF0KSwgXCJwb2ludGVyXCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVTaW5nbGVDbGljayh2aWV3LCBwb3MsIGluc2lkZSwgZXZlbnQsIHNlbGVjdE5vZGUpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBcImhhbmRsZUNsaWNrT25cIiwgcG9zLCBpbnNpZGUsIGV2ZW50KSB8fFxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlQ2xpY2tcIiwgZiA9PiBmKHZpZXcsIHBvcywgZXZlbnQpKSB8fFxuICAgICAgICAoc2VsZWN0Tm9kZSA/IHNlbGVjdENsaWNrZWROb2RlKHZpZXcsIGluc2lkZSkgOiBzZWxlY3RDbGlja2VkTGVhZih2aWV3LCBpbnNpZGUpKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZURvdWJsZUNsaWNrKHZpZXcsIHBvcywgaW5zaWRlLCBldmVudCkge1xuICAgIHJldHVybiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIFwiaGFuZGxlRG91YmxlQ2xpY2tPblwiLCBwb3MsIGluc2lkZSwgZXZlbnQpIHx8XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVEb3VibGVDbGlja1wiLCBmID0+IGYodmlldywgcG9zLCBldmVudCkpO1xufVxuZnVuY3Rpb24gaGFuZGxlVHJpcGxlQ2xpY2sodmlldywgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgcmV0dXJuIHJ1bkhhbmRsZXJPbkNvbnRleHQodmlldywgXCJoYW5kbGVUcmlwbGVDbGlja09uXCIsIHBvcywgaW5zaWRlLCBldmVudCkgfHxcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZVRyaXBsZUNsaWNrXCIsIGYgPT4gZih2aWV3LCBwb3MsIGV2ZW50KSkgfHxcbiAgICAgICAgZGVmYXVsdFRyaXBsZUNsaWNrKHZpZXcsIGluc2lkZSwgZXZlbnQpO1xufVxuZnVuY3Rpb24gZGVmYXVsdFRyaXBsZUNsaWNrKHZpZXcsIGluc2lkZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgaWYgKGluc2lkZSA9PSAtMSkge1xuICAgICAgICBpZiAoZG9jLmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIDAsIGRvYy5jb250ZW50LnNpemUpLCBcInBvaW50ZXJcIik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUoaW5zaWRlKTtcbiAgICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aCArIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSBpID4gJHBvcy5kZXB0aCA/ICRwb3Mubm9kZUFmdGVyIDogJHBvcy5ub2RlKGkpO1xuICAgICAgICBsZXQgbm9kZVBvcyA9ICRwb3MuYmVmb3JlKGkpO1xuICAgICAgICBpZiAobm9kZS5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgbm9kZVBvcyArIDEsIG5vZGVQb3MgKyAxICsgbm9kZS5jb250ZW50LnNpemUpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIGVsc2UgaWYgKE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKVxuICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIE5vZGVTZWxlY3Rpb24uY3JlYXRlKGRvYywgbm9kZVBvcyksIFwicG9pbnRlclwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZvcmNlRE9NRmx1c2godmlldykge1xuICAgIHJldHVybiBlbmRDb21wb3NpdGlvbih2aWV3KTtcbn1cbmNvbnN0IHNlbGVjdE5vZGVNb2RpZmllciA9IG1hYyA/IFwibWV0YUtleVwiIDogXCJjdHJsS2V5XCI7XG5oYW5kbGVycy5tb3VzZWRvd24gPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTtcbiAgICBsZXQgZmx1c2hlZCA9IGZvcmNlRE9NRmx1c2godmlldyk7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCksIHR5cGUgPSBcInNpbmdsZUNsaWNrXCI7XG4gICAgaWYgKG5vdyAtIHZpZXcuaW5wdXQubGFzdENsaWNrLnRpbWUgPCA1MDAgJiYgaXNOZWFyKGV2ZW50LCB2aWV3LmlucHV0Lmxhc3RDbGljaykgJiYgIWV2ZW50W3NlbGVjdE5vZGVNb2RpZmllcl0pIHtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdENsaWNrLnR5cGUgPT0gXCJzaW5nbGVDbGlja1wiKVxuICAgICAgICAgICAgdHlwZSA9IFwiZG91YmxlQ2xpY2tcIjtcbiAgICAgICAgZWxzZSBpZiAodmlldy5pbnB1dC5sYXN0Q2xpY2sudHlwZSA9PSBcImRvdWJsZUNsaWNrXCIpXG4gICAgICAgICAgICB0eXBlID0gXCJ0cmlwbGVDbGlja1wiO1xuICAgIH1cbiAgICB2aWV3LmlucHV0Lmxhc3RDbGljayA9IHsgdGltZTogbm93LCB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCB0eXBlIH07XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBpZiAoIXBvcylcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh0eXBlID09IFwic2luZ2xlQ2xpY2tcIikge1xuICAgICAgICBpZiAodmlldy5pbnB1dC5tb3VzZURvd24pXG4gICAgICAgICAgICB2aWV3LmlucHV0Lm1vdXNlRG93bi5kb25lKCk7XG4gICAgICAgIHZpZXcuaW5wdXQubW91c2VEb3duID0gbmV3IE1vdXNlRG93bih2aWV3LCBwb3MsIGV2ZW50LCAhIWZsdXNoZWQpO1xuICAgIH1cbiAgICBlbHNlIGlmICgodHlwZSA9PSBcImRvdWJsZUNsaWNrXCIgPyBoYW5kbGVEb3VibGVDbGljayA6IGhhbmRsZVRyaXBsZUNsaWNrKSh2aWV3LCBwb3MucG9zLCBwb3MuaW5zaWRlLCBldmVudCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih2aWV3LCBcInBvaW50ZXJcIik7XG4gICAgfVxufTtcbmNsYXNzIE1vdXNlRG93biB7XG4gICAgY29uc3RydWN0b3IodmlldywgcG9zLCBldmVudCwgZmx1c2hlZCkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50O1xuICAgICAgICB0aGlzLmZsdXNoZWQgPSBmbHVzaGVkO1xuICAgICAgICB0aGlzLmRlbGF5ZWRTZWxlY3Rpb25TeW5jID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWlnaHREcmFnID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGFydERvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUgPSAhIWV2ZW50W3NlbGVjdE5vZGVNb2RpZmllcl07XG4gICAgICAgIHRoaXMuYWxsb3dEZWZhdWx0ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIGxldCB0YXJnZXROb2RlLCB0YXJnZXRQb3M7XG4gICAgICAgIGlmIChwb3MuaW5zaWRlID4gLTEpIHtcbiAgICAgICAgICAgIHRhcmdldE5vZGUgPSB2aWV3LnN0YXRlLmRvYy5ub2RlQXQocG9zLmluc2lkZSk7XG4gICAgICAgICAgICB0YXJnZXRQb3MgPSBwb3MuaW5zaWRlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKHBvcy5wb3MpO1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9ICRwb3MucGFyZW50O1xuICAgICAgICAgICAgdGFyZ2V0UG9zID0gJHBvcy5kZXB0aCA/ICRwb3MuYmVmb3JlKCkgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGZsdXNoZWQgPyBudWxsIDogZXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCB0YXJnZXREZXNjID0gdGFyZ2V0ID8gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKHRhcmdldCwgdHJ1ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldERlc2MgPyB0YXJnZXREZXNjLmRvbSA6IG51bGw7XG4gICAgICAgIGxldCB7IHNlbGVjdGlvbiB9ID0gdmlldy5zdGF0ZTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PSAwICYmXG4gICAgICAgICAgICB0YXJnZXROb2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUgJiYgdGFyZ2V0Tm9kZS50eXBlLnNwZWMuc2VsZWN0YWJsZSAhPT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHNlbGVjdGlvbiBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZyb20gPD0gdGFyZ2V0UG9zICYmIHNlbGVjdGlvbi50byA+IHRhcmdldFBvcylcbiAgICAgICAgICAgIHRoaXMubWlnaHREcmFnID0ge1xuICAgICAgICAgICAgICAgIG5vZGU6IHRhcmdldE5vZGUsXG4gICAgICAgICAgICAgICAgcG9zOiB0YXJnZXRQb3MsXG4gICAgICAgICAgICAgICAgYWRkQXR0cjogISEodGhpcy50YXJnZXQgJiYgIXRoaXMudGFyZ2V0LmRyYWdnYWJsZSksXG4gICAgICAgICAgICAgICAgc2V0VW5lZGl0YWJsZTogISEodGhpcy50YXJnZXQgJiYgZ2Vja28gJiYgIXRoaXMudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLm1pZ2h0RHJhZyAmJiAodGhpcy5taWdodERyYWcuYWRkQXR0ciB8fCB0aGlzLm1pZ2h0RHJhZy5zZXRVbmVkaXRhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pZ2h0RHJhZy5hZGRBdHRyKVxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPT0gdGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcImZhbHNlXCIpO1xuICAgICAgICAgICAgICAgIH0sIDIwKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmlldy5yb290LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlID0gdGhpcy5tb3ZlLmJpbmQodGhpcykpO1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xuICAgIH1cbiAgICBkb25lKCkge1xuICAgICAgICB0aGlzLnZpZXcucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUpO1xuICAgICAgICBpZiAodGhpcy5taWdodERyYWcgJiYgdGhpcy50YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuYWRkQXR0cilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIik7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxheWVkU2VsZWN0aW9uU3luYylcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2VsZWN0aW9uVG9ET00odGhpcy52aWV3KSk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPSBudWxsO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICB0aGlzLmRvbmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5kb2MgIT0gdGhpcy5zdGFydERvYylcbiAgICAgICAgICAgIHBvcyA9IHRoaXMudmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmFsbG93RGVmYXVsdCB8fCAhcG9zKSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGFuZGxlU2luZ2xlQ2xpY2sodGhpcy52aWV3LCBwb3MucG9zLCBwb3MuaW5zaWRlLCBldmVudCwgdGhpcy5zZWxlY3ROb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudC5idXR0b24gPT0gMCAmJlxuICAgICAgICAgICAgKHRoaXMuZmx1c2hlZCB8fFxuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBpZ25vcmVzIGNsaWNrcyBvbiBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAoc2FmYXJpICYmIHRoaXMubWlnaHREcmFnICYmICF0aGlzLm1pZ2h0RHJhZy5ub2RlLmlzQXRvbSkgfHxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMgdHJlYXQgYSBub2RlIHNlbGVjdGlvbiBhcyBhXG4gICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBidXQgc3RpbGwgcmVwb3J0IHRoYXQgdGhlIG5vZGUgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyB3aGVuIGFza2VkIHRocm91Z2ggZ2V0U2VsZWN0aW9uLiBZb3UnbGwgdGhlbiBnZXQgYVxuICAgICAgICAgICAgICAgIC8vIHNpdHVhdGlvbiB3aGVyZSBjbGlja2luZyBhdCB0aGUgcG9pbnQgd2hlcmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIChoaWRkZW4pIGN1cnNvciBpcyBkb2Vzbid0IGNoYW5nZSB0aGUgc2VsZWN0aW9uLCBhbmRcbiAgICAgICAgICAgICAgICAvLyB0aHVzIGRvZXNuJ3QgZ2V0IGEgcmVhY3Rpb24gZnJvbSBQcm9zZU1pcnJvci4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtzIGFyb3VuZCB0aGF0LlxuICAgICAgICAgICAgICAgIChjaHJvbWUgJiYgIXRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udmlzaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihNYXRoLmFicyhwb3MucG9zIC0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSwgTWF0aC5hYnMocG9zLnBvcyAtIHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udG8pKSA8PSAyKSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih0aGlzLnZpZXcsIFNlbGVjdGlvbi5uZWFyKHRoaXMudmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MucG9zKSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW92ZShldmVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih0aGlzLnZpZXcsIFwicG9pbnRlclwiKTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHRoaXMuZG9uZSgpO1xuICAgIH1cbiAgICB1cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93RGVmYXVsdCAmJiAoTWF0aC5hYnModGhpcy5ldmVudC54IC0gZXZlbnQuY2xpZW50WCkgPiA0IHx8XG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmV2ZW50LnkgLSBldmVudC5jbGllbnRZKSA+IDQpKVxuICAgICAgICAgICAgdGhpcy5hbGxvd0RlZmF1bHQgPSB0cnVlO1xuICAgIH1cbn1cbmhhbmRsZXJzLnRvdWNoc3RhcnQgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0Lmxhc3RUb3VjaCA9IERhdGUubm93KCk7XG4gICAgZm9yY2VET01GbHVzaCh2aWV3KTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXQubGFzdFRvdWNoID0gRGF0ZS5ub3coKTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLmNvbnRleHRtZW51ID0gdmlldyA9PiBmb3JjZURPTUZsdXNoKHZpZXcpO1xuZnVuY3Rpb24gaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LnN0dW0uZGUvMjAxNi8wNi8yNC9oYW5kbGluZy1pbWUtZXZlbnRzLWluLWphdmFzY3JpcHQvLlxuICAgIC8vIE9uIEphcGFuZXNlIGlucHV0IG1ldGhvZCBlZGl0b3JzIChJTUVzKSwgdGhlIEVudGVyIGtleSBpcyB1c2VkIHRvIGNvbmZpcm0gY2hhcmFjdGVyXG4gICAgLy8gc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCwgY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZVxuICAgIC8vIGVtaXR0ZWQuIFRoZSBrZXlkb3duIGV2ZW50IHRyaWdnZXJzIG5ld2xpbmUgaW5zZXJ0aW9uLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5ZG93biBldmVudCBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAvLyBXZSBvbmx5IGlnbm9yZSBpdCBvbmNlLCBhcyBwcmVzc2luZyBFbnRlciBhIHNlY29uZCB0aW1lICpzaG91bGQqIGluc2VydCBhIG5ld2xpbmUuXG4gICAgLy8gRnVydGhlcm1vcmUsIHRoZSBrZXlkb3duIGV2ZW50IHRpbWVzdGFtcCBtdXN0IGJlIGNsb3NlIHRvIHRoZSBjb21wb3NpdGlvbkVuZGVkQXQgdGltZXN0YW1wLlxuICAgIC8vIFRoaXMgZ3VhcmRzIGFnYWluc3QgdGhlIGNhc2Ugd2hlcmUgY29tcG9zaXRpb25lbmQgaXMgdHJpZ2dlcmVkIHdpdGhvdXQgdGhlIGtleWJvYXJkXG4gICAgLy8gKGUuZy4gY2hhcmFjdGVyIGNvbmZpcm1hdGlvbiBtYXkgYmUgZG9uZSB3aXRoIHRoZSBtb3VzZSksIGFuZCBrZXlkb3duIGlzIHRyaWdnZXJlZFxuICAgIC8vIGFmdGVyd2FyZHMtIHdlIHdvdWxkbid0IHdhbnQgdG8gaWdub3JlIHRoZSBrZXlkb3duIGV2ZW50IGluIHRoaXMgY2FzZS5cbiAgICBpZiAoc2FmYXJpICYmIE1hdGguYWJzKGV2ZW50LnRpbWVTdGFtcCAtIHZpZXcuaW5wdXQuY29tcG9zaXRpb25FbmRlZEF0KSA8IDUwMCkge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBEcm9wIGFjdGl2ZSBjb21wb3NpdGlvbiBhZnRlciA1IHNlY29uZHMgb2YgaW5hY3Rpdml0eSBvbiBBbmRyb2lkXG5jb25zdCB0aW1lb3V0Q29tcG9zaXRpb24gPSBhbmRyb2lkID8gNTAwMCA6IC0xO1xuZWRpdEhhbmRsZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBlZGl0SGFuZGxlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAoIXZpZXcuY29tcG9zaW5nKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZmx1c2goKTtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsICRwb3MgPSBzdGF0ZS5zZWxlY3Rpb24uJGZyb207XG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiZcbiAgICAgICAgICAgIChzdGF0ZS5zdG9yZWRNYXJrcyB8fFxuICAgICAgICAgICAgICAgICghJHBvcy50ZXh0T2Zmc2V0ICYmICRwb3MucGFyZW50T2Zmc2V0ICYmICRwb3Mubm9kZUJlZm9yZS5tYXJrcy5zb21lKG0gPT4gbS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSkpKSkge1xuICAgICAgICAgICAgLy8gTmVlZCB0byB3cmFwIHRoZSBjdXJzb3IgaW4gbWFyayBub2RlcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lcyBpbiB0aGUgRE9NIGNvbnRleHRcbiAgICAgICAgICAgIHZpZXcubWFya0N1cnNvciA9IHZpZXcuc3RhdGUuc3RvcmVkTWFya3MgfHwgJHBvcy5tYXJrcygpO1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldywgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3Lm1hcmtDdXJzb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldyk7XG4gICAgICAgICAgICAvLyBJbiBmaXJlZm94LCBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIGJ1dCBvdXRzaWRlIGEgbWFya2VkIG5vZGUsXG4gICAgICAgICAgICAvLyB0aGUgaW5zZXJ0ZWQgdGV4dCB3b24ndCBpbmhlcml0IHRoZSBtYXJrcy4gU28gdGhpcyBtb3ZlcyBpdFxuICAgICAgICAgICAgLy8gaW5zaWRlIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgICAgIGlmIChnZWNrbyAmJiBzdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiYgJHBvcy5wYXJlbnRPZmZzZXQgJiYgISRwb3MudGV4dE9mZnNldCAmJiAkcG9zLm5vZGVCZWZvcmUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0OyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgIT0gMDspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG9mZnNldCA8IDAgPyBub2RlLmxhc3RDaGlsZCA6IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRvbVNlbGVjdGlvbigpLmNvbGxhcHNlKGJlZm9yZSwgYmVmb3JlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgdGltZW91dENvbXBvc2l0aW9uKTtcbn07XG5lZGl0SGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSBldmVudC50aW1lU3RhbXA7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IHZpZXcuZG9tT2JzZXJ2ZXIucGVuZGluZ1JlY29yZHMoKS5sZW5ndGggPyB2aWV3LmlucHV0LmNvbXBvc2l0aW9uSUQgOiAwO1xuICAgICAgICBpZiAodmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzKVxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB2aWV3LmRvbU9ic2VydmVyLmZsdXNoKCkpO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uSUQrKztcbiAgICAgICAgc2NoZWR1bGVDb21wb3NlRW5kKHZpZXcsIDIwKTtcbiAgICB9XG59O1xuZnVuY3Rpb24gc2NoZWR1bGVDb21wb3NlRW5kKHZpZXcsIGRlbGF5KSB7XG4gICAgY2xlYXJUaW1lb3V0KHZpZXcuaW5wdXQuY29tcG9zaW5nVGltZW91dCk7XG4gICAgaWYgKGRlbGF5ID4gLTEpXG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gZW5kQ29tcG9zaXRpb24odmlldyksIGRlbGF5KTtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29tcG9zaXRpb24odmlldykge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZykge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IHRpbWVzdGFtcEZyb21DdXN0b21FdmVudCgpO1xuICAgIH1cbiAgICB3aGlsZSAodmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5wb3AoKS5tYXJrUGFyZW50c0RpcnR5KCk7XG59XG5mdW5jdGlvbiB0aW1lc3RhbXBGcm9tQ3VzdG9tRXZlbnQoKSB7XG4gICAgbGV0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBldmVudC5pbml0RXZlbnQoXCJldmVudFwiLCB0cnVlLCB0cnVlKTtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wO1xufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5mdW5jdGlvbiBlbmRDb21wb3NpdGlvbih2aWV3LCBmb3JjZVVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKGFuZHJvaWQgJiYgdmlldy5kb21PYnNlcnZlci5mbHVzaGluZ1Nvb24gPj0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIGNsZWFyQ29tcG9zaXRpb24odmlldyk7XG4gICAgaWYgKGZvcmNlVXBkYXRlIHx8IHZpZXcuZG9jVmlldyAmJiB2aWV3LmRvY1ZpZXcuZGlydHkpIHtcbiAgICAgICAgbGV0IHNlbCA9IHNlbGVjdGlvbkZyb21ET00odmlldyk7XG4gICAgICAgIGlmIChzZWwgJiYgIXNlbC5lcSh2aWV3LnN0YXRlLnNlbGVjdGlvbikpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXcuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2FwdHVyZUNvcHkodmlldywgZG9tKSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGlmICghdmlldy5kb20ucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCB3cmFwID0gdmlldy5kb20ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgd3JhcC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKCksIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZG9tKTtcbiAgICAvLyBEb25lIGJlY2F1c2UgSUUgd2lsbCBmaXJlIGEgc2VsZWN0aW9uY2hhbmdlIG1vdmluZyB0aGUgc2VsZWN0aW9uXG4gICAgLy8gdG8gaXRzIHN0YXJ0IHdoZW4gcmVtb3ZlQWxsUmFuZ2VzIGlzIGNhbGxlZCBhbmQgdGhlIGVkaXRvciBzdGlsbFxuICAgIC8vIGhhcyBmb2N1cyAod2hpY2ggd2lsbCBtZXNzIHVwIHRoZSBlZGl0b3IncyBzZWxlY3Rpb24gc3RhdGUpLlxuICAgIHZpZXcuZG9tLmJsdXIoKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHdyYXAucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHdyYXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSVx1MjAxNGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChpZSAmJiBpZV92ZXJzaW9uIDwgMTUpIHx8XG4gICAgKGlvcyAmJiB3ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5oYW5kbGVycy5jb3B5ID0gZWRpdEhhbmRsZXJzLmN1dCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLCBjdXQgPSBldmVudC50eXBlID09IFwiY3V0XCI7XG4gICAgaWYgKHNlbC5lbXB0eSlcbiAgICAgICAgcmV0dXJuO1xuICAgIC8vIElFIGFuZCBFZGdlJ3MgY2xpcGJvYXJkIGludGVyZmFjZSBpcyBjb21wbGV0ZWx5IGJyb2tlblxuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgbGV0IHNsaWNlID0gc2VsLmNvbnRlbnQoKSwgeyBkb20sIHRleHQgfSA9IHNlcmlhbGl6ZUZvckNsaXBib2FyZCh2aWV3LCBzbGljZSk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9odG1sXCIsIGRvbS5pbm5lckhUTUwpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZUNvcHkodmlldywgZG9tKTtcbiAgICB9XG4gICAgaWYgKGN1dClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJjdXRcIikpO1xufTtcbmZ1bmN0aW9uIHNsaWNlU2luZ2xlTm9kZShzbGljZSkge1xuICAgIHJldHVybiBzbGljZS5vcGVuU3RhcnQgPT0gMCAmJiBzbGljZS5vcGVuRW5kID09IDAgJiYgc2xpY2UuY29udGVudC5jaGlsZENvdW50ID09IDEgPyBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQgOiBudWxsO1xufVxuZnVuY3Rpb24gY2FwdHVyZVBhc3RlKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCF2aWV3LmRvbS5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHBsYWluVGV4dCA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGZyb20ucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCB0YXJnZXQgPSB2aWV3LmRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGxhaW5UZXh0ID8gXCJ0ZXh0YXJlYVwiIDogXCJkaXZcIikpO1xuICAgIGlmICghcGxhaW5UZXh0KVxuICAgICAgICB0YXJnZXQuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICBpZiAodGFyZ2V0LnBhcmVudE5vZGUpXG4gICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpO1xuICAgICAgICBpZiAocGxhaW5UZXh0KVxuICAgICAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUsIG51bGwsIHBsYWluLCBldmVudCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnRleHRDb250ZW50LCB0YXJnZXQuaW5uZXJIVE1MLCBwbGFpbiwgZXZlbnQpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGRvUGFzdGUodmlldywgdGV4dCwgaHRtbCwgcHJlZmVyUGxhaW4sIGV2ZW50KSB7XG4gICAgbGV0IHNsaWNlID0gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHByZWZlclBsYWluLCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbSk7XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVQYXN0ZVwiLCBmID0+IGYodmlldywgZXZlbnQsIHNsaWNlIHx8IFNsaWNlLmVtcHR5KSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghc2xpY2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2luZ2xlTm9kZSA9IHNsaWNlU2luZ2xlTm9kZShzbGljZSk7XG4gICAgbGV0IHRyID0gc2luZ2xlTm9kZVxuICAgICAgICA/IHZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbldpdGgoc2luZ2xlTm9kZSwgcHJlZmVyUGxhaW4pXG4gICAgICAgIDogdmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uKHNsaWNlKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInBhc3RlXCIsIHRydWUpLnNldE1ldGEoXCJ1aUV2ZW50XCIsIFwicGFzdGVcIikpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0VGV4dChjbGlwYm9hcmREYXRhKSB7XG4gICAgbGV0IHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgaWYgKHRleHQpXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGxldCB1cmlzID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC91cmktbGlzdFwiKTtcbiAgICByZXR1cm4gdXJpcyA/IHVyaXMucmVwbGFjZSgvXFxyP1xcbi9nLCBcIiBcIikgOiBcIlwiO1xufVxuZWRpdEhhbmRsZXJzLnBhc3RlID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICAvLyBIYW5kbGluZyBwYXN0ZSBmcm9tIEphdmFTY3JpcHQgZHVyaW5nIGNvbXBvc2l0aW9uIGlzIHZlcnkgcG9vcmx5XG4gICAgLy8gaGFuZGxlZCBieSBicm93c2Vycywgc28gYXMgYSBkb2RneSBidXQgcHJlZmVyYWJsZSBrbHVkZ2UsIHdlIGp1c3RcbiAgICAvLyBsZXQgdGhlIGJyb3dzZXIgZG8gaXRzIG5hdGl2ZSB0aGluZyB0aGVyZSwgZXhjZXB0IG9uIEFuZHJvaWQsXG4gICAgLy8gd2hlcmUgdGhlIGVkaXRvciBpcyBhbG1vc3QgYWx3YXlzIGNvbXBvc2luZy5cbiAgICBpZiAodmlldy5jb21wb3NpbmcgJiYgIWFuZHJvaWQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZGF0YSA9IGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5jbGlwYm9hcmREYXRhO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBpZiAoZGF0YSAmJiBkb1Bhc3RlKHZpZXcsIGdldFRleHQoZGF0YSksIGRhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgcGxhaW4sIGV2ZW50KSlcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBlbHNlXG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3LCBldmVudCk7XG59O1xuY2xhc3MgRHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKHNsaWNlLCBtb3ZlLCBub2RlKSB7XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5tb3ZlID0gbW92ZTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG59XG5jb25zdCBkcmFnQ29weU1vZGlmaWVyID0gbWFjID8gXCJhbHRLZXlcIiA6IFwiY3RybEtleVwiO1xuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBsZXQgbW91c2VEb3duID0gdmlldy5pbnB1dC5tb3VzZURvd247XG4gICAgaWYgKG1vdXNlRG93bilcbiAgICAgICAgbW91c2VEb3duLmRvbmUoKTtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgcG9zID0gc2VsLmVtcHR5ID8gbnVsbCA6IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBsZXQgbm9kZTtcbiAgICBpZiAocG9zICYmIHBvcy5wb3MgPj0gc2VsLmZyb20gJiYgcG9zLnBvcyA8PSAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiA/IHNlbC50byAtIDEgOiBzZWwudG8pKSA7XG4gICAgZWxzZSBpZiAobW91c2VEb3duICYmIG1vdXNlRG93bi5taWdodERyYWcpIHtcbiAgICAgICAgbm9kZSA9IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBtb3VzZURvd24ubWlnaHREcmFnLnBvcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhldmVudC50YXJnZXQsIHRydWUpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLm5vZGUudHlwZS5zcGVjLmRyYWdnYWJsZSAmJiBkZXNjICE9IHZpZXcuZG9jVmlldylcbiAgICAgICAgICAgIG5vZGUgPSBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgZGVzYy5wb3NCZWZvcmUpO1xuICAgIH1cbiAgICBsZXQgc2xpY2UgPSAobm9kZSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbikuY29udGVudCgpLCB7IGRvbSwgdGV4dCB9ID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuY2xlYXJEYXRhKCk7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoYnJva2VuQ2xpcGJvYXJkQVBJID8gXCJUZXh0XCIgOiBcInRleHQvaHRtbFwiLCBkb20uaW5uZXJIVE1MKTtcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yL2lzc3Vlcy8xMTU2XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcImNvcHlNb3ZlXCI7XG4gICAgaWYgKCFicm9rZW5DbGlwYm9hcmRBUEkpXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0ZXh0KTtcbiAgICB2aWV3LmRyYWdnaW5nID0gbmV3IERyYWdnaW5nKHNsaWNlLCAhZXZlbnRbZHJhZ0NvcHlNb2RpZmllcl0sIG5vZGUpO1xufTtcbmhhbmRsZXJzLmRyYWdlbmQgPSB2aWV3ID0+IHtcbiAgICBsZXQgZHJhZ2dpbmcgPSB2aWV3LmRyYWdnaW5nO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXcuZHJhZ2dpbmcgPT0gZHJhZ2dpbmcpXG4gICAgICAgICAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICB9LCA1MCk7XG59O1xuZWRpdEhhbmRsZXJzLmRyYWdvdmVyID0gZWRpdEhhbmRsZXJzLmRyYWdlbnRlciA9IChfLCBlKSA9PiBlLnByZXZlbnREZWZhdWx0KCk7XG5lZGl0SGFuZGxlcnMuZHJvcCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IGRyYWdnaW5nID0gdmlldy5kcmFnZ2luZztcbiAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBldmVudFBvcyA9IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBpZiAoIWV2ZW50UG9zKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0ICRtb3VzZSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZXZlbnRQb3MucG9zKTtcbiAgICBsZXQgc2xpY2UgPSBkcmFnZ2luZyAmJiBkcmFnZ2luZy5zbGljZTtcbiAgICBpZiAoc2xpY2UpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzbGljZSA9IHBhcnNlRnJvbUNsaXBib2FyZCh2aWV3LCBnZXRUZXh0KGV2ZW50LmRhdGFUcmFuc2ZlciksIGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgZmFsc2UsICRtb3VzZSk7XG4gICAgfVxuICAgIGxldCBtb3ZlID0gISEoZHJhZ2dpbmcgJiYgIWV2ZW50W2RyYWdDb3B5TW9kaWZpZXJdKTtcbiAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZURyb3BcIiwgZiA9PiBmKHZpZXcsIGV2ZW50LCBzbGljZSB8fCBTbGljZS5lbXB0eSwgbW92ZSkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFzbGljZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IGluc2VydFBvcyA9IHNsaWNlID8gZHJvcFBvaW50KHZpZXcuc3RhdGUuZG9jLCAkbW91c2UucG9zLCBzbGljZSkgOiAkbW91c2UucG9zO1xuICAgIGlmIChpbnNlcnRQb3MgPT0gbnVsbClcbiAgICAgICAgaW5zZXJ0UG9zID0gJG1vdXNlLnBvcztcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyO1xuICAgIGlmIChtb3ZlKSB7XG4gICAgICAgIGxldCB7IG5vZGUgfSA9IGRyYWdnaW5nO1xuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICAgIG5vZGUucmVwbGFjZSh0cik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBsZXQgcG9zID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICBsZXQgaXNOb2RlID0gc2xpY2Uub3BlblN0YXJ0ID09IDAgJiYgc2xpY2Uub3BlbkVuZCA9PSAwICYmIHNsaWNlLmNvbnRlbnQuY2hpbGRDb3VudCA9PSAxO1xuICAgIGxldCBiZWZvcmVJbnNlcnQgPSB0ci5kb2M7XG4gICAgaWYgKGlzTm9kZSlcbiAgICAgICAgdHIucmVwbGFjZVJhbmdlV2l0aChwb3MsIHBvcywgc2xpY2UuY29udGVudC5maXJzdENoaWxkKTtcbiAgICBlbHNlXG4gICAgICAgIHRyLnJlcGxhY2VSYW5nZShwb3MsIHBvcywgc2xpY2UpO1xuICAgIGlmICh0ci5kb2MuZXEoYmVmb3JlSW5zZXJ0KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCAkcG9zID0gdHIuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoaXNOb2RlICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCkgJiZcbiAgICAgICAgJHBvcy5ub2RlQWZ0ZXIgJiYgJHBvcy5ub2RlQWZ0ZXIuc2FtZU1hcmt1cChzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQpKSB7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihuZXcgTm9kZVNlbGVjdGlvbigkcG9zKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgZW5kID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICAgICAgdHIubWFwcGluZy5tYXBzW3RyLm1hcHBpbmcubWFwcy5sZW5ndGggLSAxXS5mb3JFYWNoKChfZnJvbSwgX3RvLCBfbmV3RnJvbSwgbmV3VG8pID0+IGVuZCA9IG5ld1RvKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkJldHdlZW4odmlldywgJHBvcywgdHIuZG9jLnJlc29sdmUoZW5kKSkpO1xuICAgIH1cbiAgICB2aWV3LmZvY3VzKCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zZXRNZXRhKFwidWlFdmVudFwiLCBcImRyb3BcIikpO1xufTtcbmhhbmRsZXJzLmZvY3VzID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPSBEYXRlLm5vdygpO1xuICAgIGlmICghdmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmRvY1ZpZXcgJiYgdmlldy5oYXNGb2N1cygpICYmICF2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uZXEodmlldy5kb21TZWxlY3Rpb25SYW5nZSgpKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgfSwgMjApO1xuICAgIH1cbn07XG5oYW5kbGVycy5ibHVyID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAodmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAmJiB2aWV3LmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG59O1xuaGFuZGxlcnMuYmVmb3JlaW5wdXQgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIC8vIFdlIHNob3VsZCBwcm9iYWJseSBkbyBtb3JlIHdpdGggYmVmb3JlaW5wdXQgZXZlbnRzLCBidXQgc3VwcG9ydFxuICAgIC8vIGlzIHNvIHNwb3R0eSB0aGF0IEknbSBzdGlsbCB3YWl0aW5nIHRvIHNlZSB3aGVyZSB0aGV5IGFyZSBnb2luZy5cbiAgICAvLyBWZXJ5IHNwZWNpZmljIGhhY2sgdG8gZGVhbCB3aXRoIGJhY2tzcGFjZSBzb21ldGltZXMgZmFpbGluZyBvblxuICAgIC8vIENocm9tZSBBbmRyb2lkIHdoZW4gYWZ0ZXIgYW4gdW5lZGl0YWJsZSBub2RlLlxuICAgIGlmIChjaHJvbWUgJiYgYW5kcm9pZCAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJkZWxldGVDb250ZW50QmFja3dhcmRcIikge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgICAgICBsZXQgeyBkb21DaGFuZ2VDb3VudCB9ID0gdmlldy5pbnB1dDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCAhPSBkb21DaGFuZ2VDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIEV2ZW50IGFscmVhZHkgaGFkIHNvbWUgZWZmZWN0XG4gICAgICAgICAgICAvLyBUaGlzIGJ1ZyB0ZW5kcyB0byBjbG9zZSB0aGUgdmlydHVhbCBrZXlib2FyZCwgc28gd2UgcmVmb2N1c1xuICAgICAgICAgICAgdmlldy5kb20uYmx1cigpO1xuICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCg4LCBcIkJhY2tzcGFjZVwiKSkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgLy8gQ3J1ZGUgYXBwcm94aW1hdGlvbiBvZiBiYWNrc3BhY2UgYmVoYXZpb3Igd2hlbiBubyBjb21tYW5kIGhhbmRsZWQgaXRcbiAgICAgICAgICAgIGlmICgkY3Vyc29yICYmICRjdXJzb3IucG9zID4gMClcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlKCRjdXJzb3IucG9zIC0gMSwgJGN1cnNvci5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbi8vIE1ha2Ugc3VyZSBhbGwgaGFuZGxlcnMgZ2V0IHJlZ2lzdGVyZWRcbmZvciAobGV0IHByb3AgaW4gZWRpdEhhbmRsZXJzKVxuICAgIGhhbmRsZXJzW3Byb3BdID0gZWRpdEhhbmRsZXJzW3Byb3BdO1xuXG5mdW5jdGlvbiBjb21wYXJlT2JqcyhhLCBiKSB7XG4gICAgaWYgKGEgPT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICBpZiAoYVtwXSAhPT0gYltwXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgIGlmICghKHAgaW4gYSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jbGFzcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0b0RPTSwgc3BlYykge1xuICAgICAgICB0aGlzLnRvRE9NID0gdG9ET007XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgICAgICB0aGlzLnNpZGUgPSB0aGlzLnNwZWMuc2lkZSB8fCAwO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IHsgcG9zLCBkZWxldGVkIH0gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIHRoaXMuc2lkZSA8IDAgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gZGVsZXRlZCA/IG51bGwgOiBuZXcgRGVjb3JhdGlvbihwb3MgLSBvZmZzZXQsIHBvcyAtIG9mZnNldCwgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRUeXBlICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuc3BlYy5rZXkgJiYgdGhpcy5zcGVjLmtleSA9PSBvdGhlci5zcGVjLmtleSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvRE9NID09IG90aGVyLnRvRE9NICYmIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpKTtcbiAgICB9XG4gICAgZGVzdHJveShub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnNwZWMuZGVzdHJveSlcbiAgICAgICAgICAgIHRoaXMuc3BlYy5kZXN0cm95KG5vZGUpO1xuICAgIH1cbn1cbmNsYXNzIElubGluZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYyB8fCBub1NwZWM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBzcGFuLCBvZmZzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKHNwYW4uZnJvbSArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZVN0YXJ0ID8gLTEgOiAxKSAtIG9mZnNldDtcbiAgICAgICAgbGV0IHRvID0gbWFwcGluZy5tYXAoc3Bhbi50byArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZUVuZCA/IDEgOiAtMSkgLSBvZmZzZXQ7XG4gICAgICAgIHJldHVybiBmcm9tID49IHRvID8gbnVsbCA6IG5ldyBEZWNvcmF0aW9uKGZyb20sIHRvLCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQoXywgc3BhbikgeyByZXR1cm4gc3Bhbi5mcm9tIDwgc3Bhbi50bzsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBJbmxpbmVUeXBlICYmIGNvbXBhcmVPYmpzKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpO1xuICAgIH1cbiAgICBzdGF0aWMgaXMoc3BhbikgeyByZXR1cm4gc3Bhbi50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihhdHRycywgc3BlYykge1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIDEpO1xuICAgICAgICBpZiAoZnJvbS5kZWxldGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHNwYW4udG8gKyBvbGRPZmZzZXQsIC0xKTtcbiAgICAgICAgaWYgKHRvLmRlbGV0ZWQgfHwgdG8ucG9zIDw9IGZyb20ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLnBvcyAtIG9mZnNldCwgdG8ucG9zIC0gb2Zmc2V0LCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQobm9kZSwgc3Bhbikge1xuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHNwYW4uZnJvbSksIGNoaWxkO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID09IHNwYW4uZnJvbSAmJiAhKGNoaWxkID0gbm9kZS5jaGlsZChpbmRleCkpLmlzVGV4dCAmJiBvZmZzZXQgKyBjaGlsZC5ub2RlU2l6ZSA9PSBzcGFuLnRvO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgTm9kZVR5cGUgJiYgY29tcGFyZU9ianModGhpcy5hdHRycywgb3RoZXIuYXR0cnMpICYmXG4gICAgICAgICAgICAgICAgY29tcGFyZU9ianModGhpcy5zcGVjLCBvdGhlci5zcGVjKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbi8qKlxuRGVjb3JhdGlvbiBvYmplY3RzIGNhbiBiZSBwcm92aWRlZCB0byB0aGUgdmlldyB0aHJvdWdoIHRoZVxuW2BkZWNvcmF0aW9uc2AgcHJvcF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuZGVjb3JhdGlvbnMpLiBUaGV5IGNvbWUgaW5cbnNldmVyYWwgdmFyaWFudHNcdTIwMTRzZWUgdGhlIHN0YXRpYyBtZW1iZXJzIG9mIHRoaXMgY2xhc3MgZm9yIGRldGFpbHMuXG4qL1xuY2xhc3MgRGVjb3JhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uLiBXaWxsIGJlIHRoZSBzYW1lIGFzIGBmcm9tYCBmb3IgW3dpZGdldFxuICAgIGRlY29yYXRpb25zXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXndpZGdldCkuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb3B5KGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgdGhpcy50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlcShvdGhlciwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVxKG90aGVyLnR5cGUpICYmIHRoaXMuZnJvbSArIG9mZnNldCA9PSBvdGhlci5mcm9tICYmIHRoaXMudG8gKyBvZmZzZXQgPT0gb3RoZXIudG87XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUubWFwKG1hcHBpbmcsIHRoaXMsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBpcyBhIERPTSBub2RlIHRoYXQncyBzaG93biBpblxuICAgIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91XG4gICAgZGVsYXkgcmVuZGVyaW5nIHRoZSB3aWRnZXQgYnkgcGFzc2luZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZVxuICAgIGNhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgYWN0dWFsbHkgZHJhd24gaW4gYSB2aWV3LCBidXQgeW91IGNhblxuICAgIGFsc28gZGlyZWN0bHkgcGFzcyBhIERPTSBub2RlLiBgZ2V0UG9zYCBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZVxuICAgIHdpZGdldCdzIGN1cnJlbnQgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHBvcywgdG9ET00sIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKHBvcywgcG9zLCBuZXcgV2lkZ2V0VHlwZSh0b0RPTSwgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGVzIGFuIGlubGluZSBkZWNvcmF0aW9uLCB3aGljaCBhZGRzIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIHRvXG4gICAgZWFjaCBpbmxpbmUgbm9kZSBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbiAgICAqL1xuICAgIHN0YXRpYyBpbmxpbmUoZnJvbSwgdG8sIGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgbmV3IElubGluZVR5cGUoYXR0cnMsIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIG5vZGUgZGVjb3JhdGlvbi4gYGZyb21gIGFuZCBgdG9gIHNob3VsZCBwb2ludCBwcmVjaXNlbHlcbiAgICBiZWZvcmUgYW5kIGFmdGVyIGEgbm9kZSBpbiB0aGUgZG9jdW1lbnQuIFRoYXQgbm9kZSwgYW5kIG9ubHkgdGhhdFxuICAgIG5vZGUsIHdpbGwgcmVjZWl2ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBub2RlKGZyb20sIHRvLCBhdHRycywgc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIG5ldyBOb2RlVHlwZShhdHRycywgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3BlYyBwcm92aWRlZCB3aGVuIGNyZWF0aW5nIHRoaXMgZGVjb3JhdGlvbi4gQ2FuIGJlIHVzZWZ1bFxuICAgIGlmIHlvdSd2ZSBzdG9yZWQgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhhdCBvYmplY3QuXG4gICAgKi9cbiAgICBnZXQgc3BlYygpIHsgcmV0dXJuIHRoaXMudHlwZS5zcGVjOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaW5saW5lKCkgeyByZXR1cm4gdGhpcy50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHdpZGdldCgpIHsgcmV0dXJuIHRoaXMudHlwZSBpbnN0YW5jZW9mIFdpZGdldFR5cGU7IH1cbn1cbmNvbnN0IG5vbmUgPSBbXSwgbm9TcGVjID0ge307XG4vKipcbkEgY29sbGVjdGlvbiBvZiBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pLCBvcmdhbml6ZWQgaW4gc3VjaFxuYSB3YXkgdGhhdCB0aGUgZHJhd2luZyBhbGdvcml0aG0gY2FuIGVmZmljaWVudGx5IHVzZSBhbmQgY29tcGFyZVxudGhlbS4gVGhpcyBpcyBhIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVcdTIwMTRpdCBpcyBub3QgbW9kaWZpZWQsXG51cGRhdGVzIGNyZWF0ZSBhIG5ldyB2YWx1ZS5cbiovXG5jbGFzcyBEZWNvcmF0aW9uU2V0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsLCBjaGlsZHJlbikge1xuICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWwubGVuZ3RoID8gbG9jYWwgOiBub25lO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW4gOiBub25lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZGVjb3JhdGlvbnMsIHVzaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdpdmVuXG4gICAgZG9jdW1lbnQuIFRoaXMgd2lsbCBjb25zdW1lIChtb2RpZnkpIHRoZSBgZGVjb3JhdGlvbnNgIGFycmF5LCBzb1xuICAgIHlvdSBtdXN0IG1ha2UgYSBjb3B5IGlmIHlvdSB3YW50IG5lZWQgdG8gcHJlc2VydmUgdGhhdC5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZG9jLCBkZWNvcmF0aW9ucykge1xuICAgICAgICByZXR1cm4gZGVjb3JhdGlvbnMubGVuZ3RoID8gYnVpbGRUcmVlKGRlY29yYXRpb25zLCBkb2MsIDAsIG5vU3BlYykgOiBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhbGwgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQgd2hpY2ggdG91Y2ggdGhlIGdpdmVuIHJhbmdlXG4gICAgKGluY2x1ZGluZyBkZWNvcmF0aW9ucyB0aGF0IHN0YXJ0IG9yIGVuZCBkaXJlY3RseSBhdCB0aGVcbiAgICBib3VuZGFyaWVzKSBhbmQgbWF0Y2ggdGhlIGdpdmVuIHByZWRpY2F0ZSBvbiB0aGVpciBzcGVjLiBXaGVuXG4gICAgYHN0YXJ0YCBhbmQgYGVuZGAgYXJlIG9taXR0ZWQsIGFsbCBkZWNvcmF0aW9ucyBpbiB0aGUgc2V0IGFyZVxuICAgIGNvbnNpZGVyZWQuIFdoZW4gYHByZWRpY2F0ZWAgaXNuJ3QgZ2l2ZW4sIGFsbCBkZWNvcmF0aW9ucyBhcmVcbiAgICBhc3N1bWVkIHRvIG1hdGNoLlxuICAgICovXG4gICAgZmluZChzdGFydCwgZW5kLCBwcmVkaWNhdGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZpbmRJbm5lcihzdGFydCA9PSBudWxsID8gMCA6IHN0YXJ0LCBlbmQgPT0gbnVsbCA/IDFlOSA6IGVuZCwgcmVzdWx0LCAwLCBwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmaW5kSW5uZXIoc3RhcnQsIGVuZCwgcmVzdWx0LCBvZmZzZXQsIHByZWRpY2F0ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gdGhpcy5sb2NhbFtpXTtcbiAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPD0gZW5kICYmIHNwYW4udG8gPj0gc3RhcnQgJiYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHNwYW4uc3BlYykpKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYW4uY29weShzcGFuLmZyb20gKyBvZmZzZXQsIHNwYW4udG8gKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldIDwgZW5kICYmIHRoaXMuY2hpbGRyZW5baSArIDFdID4gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPZmYgPSB0aGlzLmNoaWxkcmVuW2ldICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2kgKyAyXS5maW5kSW5uZXIoc3RhcnQgLSBjaGlsZE9mZiwgZW5kIC0gY2hpbGRPZmYsIHJlc3VsdCwgb2Zmc2V0ICsgY2hpbGRPZmYsIHByZWRpY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoZSBzZXQgb2YgZGVjb3JhdGlvbnMgaW4gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZywgZG9jLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5IHx8IG1hcHBpbmcubWFwcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBJbm5lcihtYXBwaW5nLCBkb2MsIDAsIDAsIG9wdGlvbnMgfHwgbm9TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXBJbm5lcihtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgbmV3TG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMubG9jYWxbaV0ubWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQgJiYgbWFwcGVkLnR5cGUudmFsaWQobm9kZSwgbWFwcGVkKSlcbiAgICAgICAgICAgICAgICAobmV3TG9jYWwgfHwgKG5ld0xvY2FsID0gW10pKS5wdXNoKG1hcHBlZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUodGhpcy5sb2NhbFtpXS5zcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbWFwQ2hpbGRyZW4odGhpcy5jaGlsZHJlbiwgbmV3TG9jYWwgfHwgW10sIG1hcHBpbmcsIG5vZGUsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ld0xvY2FsID8gbmV3IERlY29yYXRpb25TZXQobmV3TG9jYWwuc29ydChieVBvcyksIG5vbmUpIDogZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gYXJyYXkgb2YgZGVjb3JhdGlvbnMgdG8gdGhlIG9uZXMgaW4gdGhlIHNldCxcbiAgICBwcm9kdWNpbmcgYSBuZXcgc2V0LiBDb25zdW1lcyB0aGUgYGRlY29yYXRpb25zYCBhcnJheS4gTmVlZHNcbiAgICBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0cmVlXG4gICAgc3RydWN0dXJlLlxuICAgICovXG4gICAgYWRkKGRvYywgZGVjb3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFkZWNvcmF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZElubmVyKGRvYywgZGVjb3JhdGlvbnMsIDApO1xuICAgIH1cbiAgICBhZGRJbm5lcihkb2MsIGRlY29yYXRpb25zLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuLCBjaGlsZEluZGV4ID0gMDtcbiAgICAgICAgZG9jLmZvckVhY2goKGNoaWxkTm9kZSwgY2hpbGRPZmZzZXQpID0+IHtcbiAgICAgICAgICAgIGxldCBiYXNlT2Zmc2V0ID0gY2hpbGRPZmZzZXQgKyBvZmZzZXQsIGZvdW5kO1xuICAgICAgICAgICAgaWYgKCEoZm91bmQgPSB0YWtlU3BhbnNGb3JOb2RlKGRlY29yYXRpb25zLCBjaGlsZE5vZGUsIGJhc2VPZmZzZXQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkSW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5bY2hpbGRJbmRleF0gPCBjaGlsZE9mZnNldClcbiAgICAgICAgICAgICAgICBjaGlsZEluZGV4ICs9IDM7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5bY2hpbGRJbmRleF0gPT0gY2hpbGRPZmZzZXQpXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdID0gY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdLmFkZElubmVyKGNoaWxkTm9kZSwgZm91bmQsIGJhc2VPZmZzZXQgKyAxKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoY2hpbGRJbmRleCwgMCwgY2hpbGRPZmZzZXQsIGNoaWxkT2Zmc2V0ICsgY2hpbGROb2RlLm5vZGVTaXplLCBidWlsZFRyZWUoZm91bmQsIGNoaWxkTm9kZSwgYmFzZU9mZnNldCArIDEsIG5vU3BlYykpO1xuICAgICAgICAgICAgY2hpbGRJbmRleCArPSAzO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxvY2FsID0gbW92ZVNwYW5zKGNoaWxkSW5kZXggPyB3aXRob3V0TnVsbHMoZGVjb3JhdGlvbnMpIDogZGVjb3JhdGlvbnMsIC1vZmZzZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFsb2NhbFtpXS50eXBlLnZhbGlkKGRvYywgbG9jYWxbaV0pKVxuICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShpLS0sIDEpO1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb25TZXQobG9jYWwubGVuZ3RoID8gdGhpcy5sb2NhbC5jb25jYXQobG9jYWwpLnNvcnQoYnlQb3MpIDogdGhpcy5sb2NhbCwgY2hpbGRyZW4gfHwgdGhpcy5jaGlsZHJlbik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzZXQgdGhhdCBjb250YWlucyB0aGUgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQsIG1pbnVzXG4gICAgdGhlIG9uZXMgaW4gdGhlIGdpdmVuIGFycmF5LlxuICAgICovXG4gICAgcmVtb3ZlKGRlY29yYXRpb25zKSB7XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUlubmVyKGRlY29yYXRpb25zLCAwKTtcbiAgICB9XG4gICAgcmVtb3ZlSW5uZXIoZGVjb3JhdGlvbnMsIG9mZnNldCkge1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLCBsb2NhbCA9IHRoaXMubG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZDtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY2hpbGRyZW5baV0gKyBvZmZzZXQsIHRvID0gY2hpbGRyZW5baSArIDFdICsgb2Zmc2V0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIHNwYW47IGogPCBkZWNvcmF0aW9ucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoc3BhbiA9IGRlY29yYXRpb25zW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPiBmcm9tICYmIHNwYW4udG8gPCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbnNbal0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGZvdW5kIHx8IChmb3VuZCA9IFtdKSkucHVzaChzcGFuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gY2hpbGRyZW5baSArIDJdLnJlbW92ZUlubmVyKGZvdW5kLCBmcm9tICsgMSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZCAhPSBlbXB0eSkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAyXSA9IHJlbW92ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMyk7XG4gICAgICAgICAgICAgICAgaSAtPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbC5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgc3BhbjsgaSA8IGRlY29yYXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChzcGFuID0gZGVjb3JhdGlvbnNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsb2NhbC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFtqXS5lcShzcGFuLCBvZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsID09IHRoaXMubG9jYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gdGhpcy5sb2NhbC5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuID09IHRoaXMuY2hpbGRyZW4gJiYgbG9jYWwgPT0gdGhpcy5sb2NhbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbG9jYWwubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA/IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLCBjaGlsZHJlbikgOiBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3JDaGlsZChvZmZzZXQsIG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuZW1wdHk7XG4gICAgICAgIGxldCBjaGlsZCwgbG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldID49IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldID09IG9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2kgKyAyXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gb2Zmc2V0ICsgMSwgZW5kID0gc3RhcnQgKyBub2RlLmNvbnRlbnQuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZGVjID0gdGhpcy5sb2NhbFtpXTtcbiAgICAgICAgICAgIGlmIChkZWMuZnJvbSA8IGVuZCAmJiBkZWMudG8gPiBzdGFydCAmJiAoZGVjLnR5cGUgaW5zdGFuY2VvZiBJbmxpbmVUeXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoc3RhcnQsIGRlYy5mcm9tKSAtIHN0YXJ0LCB0byA9IE1hdGgubWluKGVuZCwgZGVjLnRvKSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pXG4gICAgICAgICAgICAgICAgICAgIChsb2NhbCB8fCAobG9jYWwgPSBbXSkpLnB1c2goZGVjLmNvcHkoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICAgIGxldCBsb2NhbFNldCA9IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLnNvcnQoYnlQb3MpLCBub25lKTtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZCA/IG5ldyBEZWNvcmF0aW9uR3JvdXAoW2xvY2FsU2V0LCBjaGlsZF0pIDogbG9jYWxTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkIHx8IGVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzID09IG90aGVyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRGVjb3JhdGlvblNldCkgfHxcbiAgICAgICAgICAgIHRoaXMubG9jYWwubGVuZ3RoICE9IG90aGVyLmxvY2FsLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggIT0gb3RoZXIuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMubG9jYWxbaV0uZXEob3RoZXIubG9jYWxbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0gIT0gb3RoZXIuY2hpbGRyZW5baV0gfHxcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2kgKyAxXSAhPSBvdGhlci5jaGlsZHJlbltpICsgMV0gfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5jaGlsZHJlbltpICsgMl0uZXEob3RoZXIuY2hpbGRyZW5baSArIDJdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGxvY2Fscyhub2RlKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVPdmVybGFwKHRoaXMubG9jYWxzSW5uZXIobm9kZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGxvY2Fsc0lubmVyKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gbm9uZTtcbiAgICAgICAgaWYgKG5vZGUuaW5saW5lQ29udGVudCB8fCAhdGhpcy5sb2NhbC5zb21lKElubGluZVR5cGUuaXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWw7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmxvY2FsW2ldLnR5cGUgaW5zdGFuY2VvZiBJbmxpbmVUeXBlKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmxvY2FsW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiBkZWNvcmF0aW9ucy5cbiovXG5EZWNvcmF0aW9uU2V0LmVtcHR5ID0gbmV3IERlY29yYXRpb25TZXQoW10sIFtdKTtcbi8qKlxuQGludGVybmFsXG4qL1xuRGVjb3JhdGlvblNldC5yZW1vdmVPdmVybGFwID0gcmVtb3ZlT3ZlcmxhcDtcbmNvbnN0IGVtcHR5ID0gRGVjb3JhdGlvblNldC5lbXB0eTtcbi8vIEFuIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIHRoZSBjb2RlIGRlYWxpbmcgd2l0aCBkZWNvcmF0aW9ucyB0b1xuLy8gdHJlYXQgbXVsdGlwbGUgRGVjb3JhdGlvblNldCBvYmplY3RzIGFzIGlmIGl0IHdlcmUgYSBzaW5nbGUgb2JqZWN0XG4vLyB3aXRoIChhIHN1YnNldCBvZikgdGhlIHNhbWUgaW50ZXJmYWNlLlxuY2xhc3MgRGVjb3JhdGlvbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihtZW1iZXJzKSB7XG4gICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBkb2MpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkRGVjb3MgPSB0aGlzLm1lbWJlcnMubWFwKG1lbWJlciA9PiBtZW1iZXIubWFwKG1hcHBpbmcsIGRvYywgbm9TcGVjKSk7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShtYXBwZWREZWNvcyk7XG4gICAgfVxuICAgIGZvckNoaWxkKG9mZnNldCwgY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmVtcHR5O1xuICAgICAgICBsZXQgZm91bmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm1lbWJlcnNbaV0uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09IGVtcHR5KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIERlY29yYXRpb25Hcm91cClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kLmNvbmNhdChyZXN1bHQubWVtYmVycyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm91bmQucHVzaChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShmb3VuZCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRGVjb3JhdGlvbkdyb3VwKSB8fFxuICAgICAgICAgICAgb3RoZXIubWVtYmVycy5sZW5ndGggIT0gdGhpcy5tZW1iZXJzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMubWVtYmVyc1tpXS5lcShvdGhlci5tZW1iZXJzW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsb2NhbHMobm9kZSkge1xuICAgICAgICBsZXQgcmVzdWx0LCBzb3J0ZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxvY2FscyA9IHRoaXMubWVtYmVyc1tpXS5sb2NhbHNJbm5lcihub2RlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9jYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWxzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsb2NhbHNbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgPyByZW1vdmVPdmVybGFwKHNvcnRlZCA/IHJlc3VsdCA6IHJlc3VsdC5zb3J0KGJ5UG9zKSkgOiBub25lO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGRlY29yYXRpb24gc2V0cywgb3IgcmV0dXJuXG4gICAgLy8gYSBzaW5nbGUgc2V0IHdoZW4gcG9zc2libGUuXG4gICAgc3RhdGljIGZyb20obWVtYmVycykge1xuICAgICAgICBzd2l0Y2ggKG1lbWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG1lbWJlcnNbMF07XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gbmV3IERlY29yYXRpb25Hcm91cChtZW1iZXJzLmV2ZXJ5KG0gPT4gbSBpbnN0YW5jZW9mIERlY29yYXRpb25TZXQpID8gbWVtYmVycyA6XG4gICAgICAgICAgICAgICAgbWVtYmVycy5yZWR1Y2UoKHIsIG0pID0+IHIuY29uY2F0KG0gaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0ID8gbSA6IG0ubWVtYmVycyksIFtdKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXBDaGlsZHJlbihvbGRDaGlsZHJlbiwgbmV3TG9jYWwsIG1hcHBpbmcsIG5vZGUsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgbGV0IGNoaWxkcmVuID0gb2xkQ2hpbGRyZW4uc2xpY2UoKTtcbiAgICAvLyBNYXJrIHRoZSBjaGlsZHJlbiB0aGF0IGFyZSBkaXJlY3RseSB0b3VjaGVkIGJ5IGNoYW5nZXMsIGFuZFxuICAgIC8vIG1vdmUgdGhvc2UgdGhhdCBhcmUgYWZ0ZXIgdGhlIGNoYW5nZXMuXG4gICAgZm9yIChsZXQgaSA9IDAsIGJhc2VPZmZzZXQgPSBvbGRPZmZzZXQ7IGkgPCBtYXBwaW5nLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG1vdmVkID0gMDtcbiAgICAgICAgbWFwcGluZy5tYXBzW2ldLmZvckVhY2goKG9sZFN0YXJ0LCBvbGRFbmQsIG5ld1N0YXJ0LCBuZXdFbmQpID0+IHtcbiAgICAgICAgICAgIGxldCBkU2l6ZSA9IChuZXdFbmQgLSBuZXdTdGFydCkgLSAob2xkRW5kIC0gb2xkU3RhcnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBjaGlsZHJlbltpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA8IDAgfHwgb2xkU3RhcnQgPiBlbmQgKyBiYXNlT2Zmc2V0IC0gbW92ZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGNoaWxkcmVuW2ldICsgYmFzZU9mZnNldCAtIG1vdmVkO1xuICAgICAgICAgICAgICAgIGlmIChvbGRFbmQgPj0gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gb2xkU3RhcnQgPD0gc3RhcnQgPyAtMiA6IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvbGRTdGFydCA+PSBiYXNlT2Zmc2V0ICYmIGRTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldICs9IGRTaXplO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gKz0gZFNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbW92ZWQgKz0gZFNpemU7XG4gICAgICAgIH0pO1xuICAgICAgICBiYXNlT2Zmc2V0ID0gbWFwcGluZy5tYXBzW2ldLm1hcChiYXNlT2Zmc2V0LCAtMSk7XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIGNoaWxkIG5vZGVzIHRoYXQgc3RpbGwgY29ycmVzcG9uZCB0byBhIHNpbmdsZSBub2RlLFxuICAgIC8vIHJlY3Vyc2l2ZWx5IGNhbGwgbWFwSW5uZXIgb24gdGhlbSBhbmQgdXBkYXRlIHRoZWlyIHBvc2l0aW9ucy5cbiAgICBsZXQgbXVzdFJlYnVpbGQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdIDwgMCkgeyAvLyBUb3VjaGVkIG5vZGVzXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdID09IC0yKSB7XG4gICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IC0xO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcChvbGRDaGlsZHJlbltpXSArIG9sZE9mZnNldCksIGZyb21Mb2NhbCA9IGZyb20gLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoZnJvbUxvY2FsIDwgMCB8fCBmcm9tTG9jYWwgPj0gbm9kZS5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNdXN0IHJlYWQgb2xkQ2hpbGRyZW4gYmVjYXVzZSBjaGlsZHJlbiB3YXMgdGFnZ2VkIHdpdGggLTFcbiAgICAgICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwKG9sZENoaWxkcmVuW2kgKyAxXSArIG9sZE9mZnNldCwgLTEpLCB0b0xvY2FsID0gdG8gLSBvZmZzZXQ7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0OiBjaGlsZE9mZnNldCB9ID0gbm9kZS5jb250ZW50LmZpbmRJbmRleChmcm9tTG9jYWwpO1xuICAgICAgICAgICAgbGV0IGNoaWxkTm9kZSA9IG5vZGUubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgICAgICBpZiAoY2hpbGROb2RlICYmIGNoaWxkT2Zmc2V0ID09IGZyb21Mb2NhbCAmJiBjaGlsZE9mZnNldCArIGNoaWxkTm9kZS5ub2RlU2l6ZSA9PSB0b0xvY2FsKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGNoaWxkcmVuW2kgKyAyXVxuICAgICAgICAgICAgICAgICAgICAubWFwSW5uZXIobWFwcGluZywgY2hpbGROb2RlLCBmcm9tICsgMSwgb2xkQ2hpbGRyZW5baV0gKyBvbGRPZmZzZXQgKyAxLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkICE9IGVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gZnJvbUxvY2FsO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSB0b0xvY2FsO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMl0gPSBtYXBwZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIC8vIFJlbWFpbmluZyBjaGlsZHJlbiBtdXN0IGJlIGNvbGxlY3RlZCBhbmQgcmVidWlsdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmVcbiAgICBpZiAobXVzdFJlYnVpbGQpIHtcbiAgICAgICAgbGV0IGRlY29yYXRpb25zID0gbWFwQW5kR2F0aGVyUmVtYWluaW5nRGVjb3JhdGlvbnMoY2hpbGRyZW4sIG9sZENoaWxkcmVuLCBuZXdMb2NhbCwgbWFwcGluZywgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgYnVpbHQgPSBidWlsZFRyZWUoZGVjb3JhdGlvbnMsIG5vZGUsIDAsIG9wdGlvbnMpO1xuICAgICAgICBuZXdMb2NhbCA9IGJ1aWx0LmxvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA8IDApIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMyk7XG4gICAgICAgICAgICAgICAgaSAtPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCBidWlsdC5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBidWlsdC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIHdoaWxlIChqIDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuW2pdIDwgZnJvbSlcbiAgICAgICAgICAgICAgICBqICs9IDM7XG4gICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaiwgMCwgYnVpbHQuY2hpbGRyZW5baV0sIGJ1aWx0LmNoaWxkcmVuW2kgKyAxXSwgYnVpbHQuY2hpbGRyZW5baSArIDJdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IERlY29yYXRpb25TZXQobmV3TG9jYWwuc29ydChieVBvcyksIGNoaWxkcmVuKTtcbn1cbmZ1bmN0aW9uIG1vdmVTcGFucyhzcGFucywgb2Zmc2V0KSB7XG4gICAgaWYgKCFvZmZzZXQgfHwgIXNwYW5zLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIHNwYW5zO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzcGFuID0gc3BhbnNbaV07XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBEZWNvcmF0aW9uKHNwYW4uZnJvbSArIG9mZnNldCwgc3Bhbi50byArIG9mZnNldCwgc3Bhbi50eXBlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXBBbmRHYXRoZXJSZW1haW5pbmdEZWNvcmF0aW9ucyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIGRlY29yYXRpb25zLCBtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgIC8vIEdhdGhlciBhbGwgZGVjb3JhdGlvbnMgZnJvbSB0aGUgcmVtYWluaW5nIG1hcmtlZCBjaGlsZHJlblxuICAgIGZ1bmN0aW9uIGdhdGhlcihzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IHNldC5sb2NhbFtpXS5tYXAobWFwcGluZywgb2Zmc2V0LCBvbGRPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKG1hcHBlZClcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcHBlZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUoc2V0LmxvY2FsW2ldLnNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgZ2F0aGVyKHNldC5jaGlsZHJlbltpICsgMl0sIHNldC5jaGlsZHJlbltpXSArIG9sZE9mZnNldCArIDEpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdID09IC0xKVxuICAgICAgICAgICAgZ2F0aGVyKGNoaWxkcmVuW2kgKyAyXSwgb2xkQ2hpbGRyZW5baV0gKyBvbGRPZmZzZXQgKyAxKTtcbiAgICByZXR1cm4gZGVjb3JhdGlvbnM7XG59XG5mdW5jdGlvbiB0YWtlU3BhbnNGb3JOb2RlKHNwYW5zLCBub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5pc0xlYWYpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBlbmQgPSBvZmZzZXQgKyBub2RlLm5vZGVTaXplLCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDAsIHNwYW47IGkgPCBzcGFucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoKHNwYW4gPSBzcGFuc1tpXSkgJiYgc3Bhbi5mcm9tID4gb2Zmc2V0ICYmIHNwYW4udG8gPCBlbmQpIHtcbiAgICAgICAgICAgIChmb3VuZCB8fCAoZm91bmQgPSBbXSkpLnB1c2goc3Bhbik7XG4gICAgICAgICAgICBzcGFuc1tpXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gd2l0aG91dE51bGxzKGFycmF5KSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChhcnJheVtpXSAhPSBudWxsKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBCdWlsZCB1cCBhIHRyZWUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNldCBvZiBkZWNvcmF0aW9ucy4gYG9mZnNldGBcbi8vIGlzIGEgYmFzZSBvZmZzZXQgdGhhdCBzaG91bGQgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBgZnJvbWAgYW5kIGB0b2Bcbi8vIHBvc2l0aW9ucyBpbiB0aGUgc3BhbnMgKHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSBuZXcgc3BhbnNcbi8vIGZvciByZWN1cnNpdmUgY2FsbHMpLlxuZnVuY3Rpb24gYnVpbGRUcmVlKHNwYW5zLCBub2RlLCBvZmZzZXQsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2hpbGRyZW4gPSBbXSwgaGFzTnVsbHMgPSBmYWxzZTtcbiAgICBub2RlLmZvckVhY2goKGNoaWxkTm9kZSwgbG9jYWxTdGFydCkgPT4ge1xuICAgICAgICBsZXQgZm91bmQgPSB0YWtlU3BhbnNGb3JOb2RlKHNwYW5zLCBjaGlsZE5vZGUsIGxvY2FsU3RhcnQgKyBvZmZzZXQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGhhc051bGxzID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBzdWJ0cmVlID0gYnVpbGRUcmVlKGZvdW5kLCBjaGlsZE5vZGUsIG9mZnNldCArIGxvY2FsU3RhcnQgKyAxLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChzdWJ0cmVlICE9IGVtcHR5KVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobG9jYWxTdGFydCwgbG9jYWxTdGFydCArIGNoaWxkTm9kZS5ub2RlU2l6ZSwgc3VidHJlZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgbG9jYWxzID0gbW92ZVNwYW5zKGhhc051bGxzID8gd2l0aG91dE51bGxzKHNwYW5zKSA6IHNwYW5zLCAtb2Zmc2V0KS5zb3J0KGJ5UG9zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2Fscy5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFsb2NhbHNbaV0udHlwZS52YWxpZChub2RlLCBsb2NhbHNbaV0pKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5vblJlbW92ZSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVtb3ZlKGxvY2Fsc1tpXS5zcGVjKTtcbiAgICAgICAgICAgIGxvY2Fscy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBsb2NhbHMubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA/IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FscywgY2hpbGRyZW4pIDogZW1wdHk7XG59XG4vLyBVc2VkIHRvIHNvcnQgZGVjb3JhdGlvbnMgc28gdGhhdCBvbmVzIHdpdGggYSBsb3cgc3RhcnQgcG9zaXRpb25cbi8vIGNvbWUgZmlyc3QsIGFuZCB3aXRoaW4gYSBzZXQgd2l0aCB0aGUgc2FtZSBzdGFydCBwb3NpdGlvbiwgdGhvc2Vcbi8vIHdpdGggYW4gc21hbGxlciBlbmQgcG9zaXRpb24gY29tZSBmaXJzdC5cbmZ1bmN0aW9uIGJ5UG9zKGEsIGIpIHtcbiAgICByZXR1cm4gYS5mcm9tIC0gYi5mcm9tIHx8IGEudG8gLSBiLnRvO1xufVxuLy8gU2NhbiBhIHNvcnRlZCBhcnJheSBvZiBkZWNvcmF0aW9ucyBmb3IgcGFydGlhbGx5IG92ZXJsYXBwaW5nIHNwYW5zLFxuLy8gYW5kIHNwbGl0IHRob3NlIHNvIHRoYXQgb25seSBmdWxseSBvdmVybGFwcGluZyBzcGFucyBhcmUgbGVmdCAodG9cbi8vIG1ha2Ugc3Vic2VxdWVudCByZW5kZXJpbmcgZWFzaWVyKS4gV2lsbCByZXR1cm4gdGhlIGlucHV0IGFycmF5IGlmXG4vLyBubyBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgc3BhbnMgYXJlIGZvdW5kICh0aGUgY29tbW9uIGNhc2UpLlxuZnVuY3Rpb24gcmVtb3ZlT3ZlcmxhcChzcGFucykge1xuICAgIGxldCB3b3JraW5nID0gc3BhbnM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JraW5nLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBsZXQgc3BhbiA9IHdvcmtpbmdbaV07XG4gICAgICAgIGlmIChzcGFuLmZyb20gIT0gc3Bhbi50bylcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHdvcmtpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHdvcmtpbmdbal07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuZnJvbSA9PSBzcGFuLmZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQudG8gIT0gc3Bhbi50bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtpbmcgPT0gc3BhbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IHNwYW5zLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dlZCBieSBhIHBhcnRpYWxseSBvdmVybGFwcGluZyBsYXJnZXIgc3Bhbi4gU3BsaXQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Bhbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdbal0gPSBuZXh0LmNvcHkobmV4dC5mcm9tLCBzcGFuLnRvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEFoZWFkKHdvcmtpbmcsIGogKyAxLCBuZXh0LmNvcHkoc3Bhbi50bywgbmV4dC50bykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuZnJvbSA8IHNwYW4udG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JraW5nID09IHNwYW5zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgPSBzcGFucy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVuZCBvZiB0aGlzIG9uZSBvdmVybGFwcyB3aXRoIGEgc3Vic2VxdWVudCBzcGFuLiBTcGxpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nW2ldID0gc3Bhbi5jb3B5KHNwYW4uZnJvbSwgbmV4dC5mcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEFoZWFkKHdvcmtpbmcsIGosIHNwYW4uY29weShuZXh0LmZyb20sIHNwYW4udG8pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3b3JraW5nO1xufVxuZnVuY3Rpb24gaW5zZXJ0QWhlYWQoYXJyYXksIGksIGRlY28pIHtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCAmJiBieVBvcyhkZWNvLCBhcnJheVtpXSkgPiAwKVxuICAgICAgICBpKys7XG4gICAgYXJyYXkuc3BsaWNlKGksIDAsIGRlY28pO1xufVxuLy8gR2V0IHRoZSBkZWNvcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcHJvcHMgb2YgYSB2aWV3LlxuZnVuY3Rpb24gdmlld0RlY29yYXRpb25zKHZpZXcpIHtcbiAgICBsZXQgZm91bmQgPSBbXTtcbiAgICB2aWV3LnNvbWVQcm9wKFwiZGVjb3JhdGlvbnNcIiwgZiA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmKHZpZXcuc3RhdGUpO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSBlbXB0eSlcbiAgICAgICAgICAgIGZvdW5kLnB1c2gocmVzdWx0KTtcbiAgICB9KTtcbiAgICBpZiAodmlldy5jdXJzb3JXcmFwcGVyKVxuICAgICAgICBmb3VuZC5wdXNoKERlY29yYXRpb25TZXQuY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBbdmlldy5jdXJzb3JXcmFwcGVyLmRlY29dKSk7XG4gICAgcmV0dXJuIERlY29yYXRpb25Hcm91cC5mcm9tKGZvdW5kKTtcbn1cblxuY29uc3Qgb2JzZXJ2ZU9wdGlvbnMgPSB7XG4gICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YU9sZFZhbHVlOiB0cnVlLFxuICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgYXR0cmlidXRlT2xkVmFsdWU6IHRydWUsXG4gICAgc3VidHJlZTogdHJ1ZVxufTtcbi8vIElFMTEgaGFzIHZlcnkgYnJva2VuIG11dGF0aW9uIG9ic2VydmVycywgc28gd2UgYWxzbyBsaXN0ZW4gdG8gRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXG5jb25zdCB1c2VDaGFyRGF0YSA9IGllICYmIGllX3ZlcnNpb24gPD0gMTE7XG5jbGFzcyBTZWxlY3Rpb25TdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgc2V0KHNlbCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBzZWwuYW5jaG9yTm9kZTtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0O1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IHNlbC5mb2N1c05vZGU7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgfVxuICAgIGVxKHNlbCkge1xuICAgICAgICByZXR1cm4gc2VsLmFuY2hvck5vZGUgPT0gdGhpcy5hbmNob3JOb2RlICYmIHNlbC5hbmNob3JPZmZzZXQgPT0gdGhpcy5hbmNob3JPZmZzZXQgJiZcbiAgICAgICAgICAgIHNlbC5mb2N1c05vZGUgPT0gdGhpcy5mb2N1c05vZGUgJiYgc2VsLmZvY3VzT2Zmc2V0ID09IHRoaXMuZm9jdXNPZmZzZXQ7XG4gICAgfVxufVxuY2xhc3MgRE9NT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGhhbmRsZURPTUNoYW5nZSkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmhhbmRsZURPTUNoYW5nZSA9IGhhbmRsZURPTUNoYW5nZTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLmZsdXNoaW5nU29vbiA9IC0xO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvblN0YXRlO1xuICAgICAgICB0aGlzLm9uQ2hhckRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiZcbiAgICAgICAgICAgIG5ldyB3aW5kb3cuTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0YXRpb25zW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBJRTExIHdpbGwgc29tZXRpbWVzIChvbiBiYWNrc3BhY2luZyBvdXQgYSBzaW5nbGUgY2hhcmFjdGVyXG4gICAgICAgICAgICAgICAgLy8gdGV4dCBub2RlIGFmdGVyIGEgQlIgbm9kZSkgY2FsbCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgYWN0dWFsbHkgdXBkYXRpbmcgdGhlIERPTSwgd2hpY2ggd2lsbCBjYXVzZVxuICAgICAgICAgICAgICAgIC8vIFByb3NlTWlycm9yIHRvIG1pc3MgdGhlIGNoYW5nZSAoc2VlICM5MzApXG4gICAgICAgICAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgbXV0YXRpb25zLnNvbWUobSA9PiBtLnR5cGUgPT0gXCJjaGlsZExpc3RcIiAmJiBtLnJlbW92ZWROb2Rlcy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAgICAgbS50eXBlID09IFwiY2hhcmFjdGVyRGF0YVwiICYmIG0ub2xkVmFsdWUubGVuZ3RoID4gbS50YXJnZXQubm9kZVZhbHVlLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhckRhdGEgPSBlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2goeyB0YXJnZXQ6IGUudGFyZ2V0LCB0eXBlOiBcImNoYXJhY3RlckRhdGFcIiwgb2xkVmFsdWU6IGUucHJldlZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGZsdXNoU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hpbmdTb29uIDwgMClcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdTb29uID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmZsdXNoaW5nU29vbiA9IC0xOyB0aGlzLmZsdXNoKCk7IH0sIDIwKTtcbiAgICB9XG4gICAgZm9yY2VGbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hpbmdTb29uID4gLTEpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5mbHVzaGluZ1Nvb24pO1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZ1Nvb24gPSAtMTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKTtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnZpZXcuZG9tLCBvYnNlcnZlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25DaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgICAgICB0aGlzLmNvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIGxldCB0YWtlID0gdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpO1xuICAgICAgICAgICAgaWYgKHRha2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWtlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2godGFrZVtpXSk7XG4gICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5mbHVzaCgpLCAyMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbkNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdFNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBjb25uZWN0U2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnZpZXcuZG9tLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgZGlzY29ubmVjdFNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIHN1cHByZXNzU2VsZWN0aW9uVXBkYXRlcygpIHtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzID0gZmFsc2UsIDUwKTtcbiAgICB9XG4gICAgb25TZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgICAgIGlmICghaGFzRm9jdXNBbmRTZWxlY3Rpb24odGhpcy52aWV3KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzKVxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvblRvRE9NKHRoaXMudmlldyk7XG4gICAgICAgIC8vIERlbGV0aW9ucyBvbiBJRTExIGZpcmUgdGhlaXIgZXZlbnRzIGluIHRoZSB3cm9uZyBvcmRlciwgZ2l2aW5nXG4gICAgICAgIC8vIHVzIGEgc2VsZWN0aW9uIGNoYW5nZSBldmVudCBiZWZvcmUgdGhlIERPTSBjaGFuZ2VzIGFyZVxuICAgICAgICAvLyByZXBvcnRlZC5cbiAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgIXRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCBzZWwgPSB0aGlzLnZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgICAgIC8vIFNlbGVjdGlvbi5pc0NvbGxhcHNlZCBpc24ndCByZWxpYWJsZSBvbiBJRVxuICAgICAgICAgICAgaWYgKHNlbC5mb2N1c05vZGUgJiYgaXNFcXVpdmFsZW50UG9zaXRpb24oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICBzZXRDdXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5zZXQodGhpcy52aWV3LmRvbVNlbGVjdGlvblJhbmdlKCkpO1xuICAgIH1cbiAgICBpZ25vcmVTZWxlY3Rpb25DaGFuZ2Uoc2VsKSB7XG4gICAgICAgIGlmICghc2VsLmZvY3VzTm9kZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgYW5jZXN0b3JzID0gbmV3IFNldCwgY29udGFpbmVyO1xuICAgICAgICBmb3IgKGxldCBzY2FuID0gc2VsLmZvY3VzTm9kZTsgc2Nhbjsgc2NhbiA9IHBhcmVudE5vZGUoc2NhbikpXG4gICAgICAgICAgICBhbmNlc3RvcnMuYWRkKHNjYW4pO1xuICAgICAgICBmb3IgKGxldCBzY2FuID0gc2VsLmFuY2hvck5vZGU7IHNjYW47IHNjYW4gPSBwYXJlbnROb2RlKHNjYW4pKVxuICAgICAgICAgICAgaWYgKGFuY2VzdG9ycy5oYXMoc2NhbikpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBzY2FuO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICBsZXQgZGVzYyA9IGNvbnRhaW5lciAmJiB0aGlzLnZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhjb250YWluZXIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLmlnbm9yZU11dGF0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgICAgICB0YXJnZXQ6IGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXJcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nUmVjb3JkcygpIHtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpXG4gICAgICAgICAgICBmb3IgKGxldCBtdXQgb2YgdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpKVxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZTtcbiAgICB9XG4gICAgZmx1c2goKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIGlmICghdmlldy5kb2NWaWV3IHx8IHRoaXMuZmx1c2hpbmdTb29uID4gLTEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtdXRhdGlvbnMgPSB0aGlzLnBlbmRpbmdSZWNvcmRzKCk7XG4gICAgICAgIGlmIChtdXRhdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgbmV3U2VsID0gIXRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzICYmICF0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZXEoc2VsKSAmJiBoYXNGb2N1c0FuZFNlbGVjdGlvbih2aWV3KSAmJiAhdGhpcy5pZ25vcmVTZWxlY3Rpb25DaGFuZ2Uoc2VsKTtcbiAgICAgICAgbGV0IGZyb20gPSAtMSwgdG8gPSAtMSwgdHlwZU92ZXIgPSBmYWxzZSwgYWRkZWQgPSBbXTtcbiAgICAgICAgaWYgKHZpZXcuZWRpdGFibGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVnaXN0ZXJNdXRhdGlvbihtdXRhdGlvbnNbaV0sIGFkZGVkKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBmcm9tIDwgMCA/IHJlc3VsdC5mcm9tIDogTWF0aC5taW4ocmVzdWx0LmZyb20sIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICB0byA9IHRvIDwgMCA/IHJlc3VsdC50byA6IE1hdGgubWF4KHJlc3VsdC50bywgdG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnR5cGVPdmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2Vja28gJiYgYWRkZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IGJycyA9IGFkZGVkLmZpbHRlcihuID0+IG4ubm9kZU5hbWUgPT0gXCJCUlwiKTtcbiAgICAgICAgICAgIGlmIChicnMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IGJyc1swXSwgYiA9IGJyc1sxXTtcbiAgICAgICAgICAgICAgICBpZiAoYS5wYXJlbnROb2RlICYmIGEucGFyZW50Tm9kZS5wYXJlbnROb2RlID09IGIucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgYi5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGEucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlYWRTZWwgPSBudWxsO1xuICAgICAgICAvLyBJZiBpdCBsb29rcyBsaWtlIHRoZSBicm93c2VyIGhhcyByZXNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZVxuICAgICAgICAvLyBzdGFydCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgZm9jdXMsIHJlc3RvcmUgdGhlIHNlbGVjdGlvbiBmcm9tXG4gICAgICAgIC8vIHRoZSBzdGF0ZVxuICAgICAgICBpZiAoZnJvbSA8IDAgJiYgbmV3U2VsICYmIHZpZXcuaW5wdXQubGFzdEZvY3VzID4gRGF0ZS5ub3coKSAtIDIwMCAmJlxuICAgICAgICAgICAgTWF0aC5tYXgodmlldy5pbnB1dC5sYXN0VG91Y2gsIHZpZXcuaW5wdXQubGFzdENsaWNrLnRpbWUpIDwgRGF0ZS5ub3coKSAtIDMwMCAmJlxuICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGFwc2VkKHNlbCkgJiYgKHJlYWRTZWwgPSBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcpKSAmJlxuICAgICAgICAgICAgcmVhZFNlbC5lcShTZWxlY3Rpb24ubmVhcih2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKDApLCAxKSkpIHtcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdEZvY3VzID0gMDtcbiAgICAgICAgICAgIHNlbGVjdGlvblRvRE9NKHZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldChzZWwpO1xuICAgICAgICAgICAgdmlldy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZyb20gPiAtMSB8fCBuZXdTZWwpIHtcbiAgICAgICAgICAgIGlmIChmcm9tID4gLTEpIHtcbiAgICAgICAgICAgICAgICB2aWV3LmRvY1ZpZXcubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICBjaGVja0NTUyh2aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRE9NQ2hhbmdlKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpO1xuICAgICAgICAgICAgaWYgKHZpZXcuZG9jVmlldyAmJiB2aWV3LmRvY1ZpZXcuZGlydHkpXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGVTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZXEoc2VsKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5zZXQoc2VsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWdpc3Rlck11dGF0aW9uKG11dCwgYWRkZWQpIHtcbiAgICAgICAgLy8gSWdub3JlIG11dGF0aW9ucyBpbnNpZGUgbm9kZXMgdGhhdCB3ZXJlIGFscmVhZHkgbm90ZWQgYXMgaW5zZXJ0ZWRcbiAgICAgICAgaWYgKGFkZGVkLmluZGV4T2YobXV0LnRhcmdldCkgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZGVzYyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKG11dC50YXJnZXQpO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIgJiZcbiAgICAgICAgICAgIChkZXNjID09IHRoaXMudmlldy5kb2NWaWV3IHx8IG11dC5hdHRyaWJ1dGVOYW1lID09IFwiY29udGVudGVkaXRhYmxlXCIgfHxcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHNvbWV0aW1lcyBmaXJlcyBzcHVyaW91cyBldmVudHMgZm9yIG51bGwvZW1wdHkgc3R5bGVzXG4gICAgICAgICAgICAgICAgKG11dC5hdHRyaWJ1dGVOYW1lID09IFwic3R5bGVcIiAmJiAhbXV0Lm9sZFZhbHVlICYmICFtdXQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpKSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFkZXNjIHx8IGRlc2MuaWdub3JlTXV0YXRpb24obXV0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJjaGlsZExpc3RcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYWRkZWROb2Rlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBhZGRlZC5wdXNoKG11dC5hZGRlZE5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmIChkZXNjLmNvbnRlbnRET00gJiYgZGVzYy5jb250ZW50RE9NICE9IGRlc2MuZG9tICYmICFkZXNjLmNvbnRlbnRET00uY29udGFpbnMobXV0LnRhcmdldCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogZGVzYy5wb3NCZWZvcmUsIHRvOiBkZXNjLnBvc0FmdGVyIH07XG4gICAgICAgICAgICBsZXQgcHJldiA9IG11dC5wcmV2aW91c1NpYmxpbmcsIG5leHQgPSBtdXQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBtdXQuYWRkZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBJRTExIGdpdmVzIHVzIGluY29ycmVjdCBuZXh0L3ByZXYgc2libGluZ3MgZm9yIHNvbWVcbiAgICAgICAgICAgICAgICAvLyBpbnNlcnRpb25zLCBzbyBpZiB0aGVyZSBhcmUgYWRkZWQgbm9kZXMsIHJlY29tcHV0ZSB0aG9zZVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXV0LmFkZGVkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgcHJldmlvdXNTaWJsaW5nLCBuZXh0U2libGluZyB9ID0gbXV0LmFkZGVkTm9kZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNTaWJsaW5nIHx8IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwobXV0LmFkZGVkTm9kZXMsIHByZXZpb3VzU2libGluZykgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0U2libGluZyB8fCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKG11dC5hZGRlZE5vZGVzLCBuZXh0U2libGluZykgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmcm9tT2Zmc2V0ID0gcHJldiAmJiBwcmV2LnBhcmVudE5vZGUgPT0gbXV0LnRhcmdldFxuICAgICAgICAgICAgICAgID8gZG9tSW5kZXgocHJldikgKyAxIDogMDtcbiAgICAgICAgICAgIGxldCBmcm9tID0gZGVzYy5sb2NhbFBvc0Zyb21ET00obXV0LnRhcmdldCwgZnJvbU9mZnNldCwgLTEpO1xuICAgICAgICAgICAgbGV0IHRvT2Zmc2V0ID0gbmV4dCAmJiBuZXh0LnBhcmVudE5vZGUgPT0gbXV0LnRhcmdldFxuICAgICAgICAgICAgICAgID8gZG9tSW5kZXgobmV4dCkgOiBtdXQudGFyZ2V0LmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHRvID0gZGVzYy5sb2NhbFBvc0Zyb21ET00obXV0LnRhcmdldCwgdG9PZmZzZXQsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtdXQudHlwZSA9PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogZGVzYy5wb3NBdFN0YXJ0IC0gZGVzYy5ib3JkZXIsIHRvOiBkZXNjLnBvc0F0RW5kICsgZGVzYy5ib3JkZXIgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gXCJjaGFyYWN0ZXJEYXRhXCJcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZnJvbTogZGVzYy5wb3NBdFN0YXJ0LFxuICAgICAgICAgICAgICAgIHRvOiBkZXNjLnBvc0F0RW5kLFxuICAgICAgICAgICAgICAgIC8vIEFuIGV2ZW50IHdhcyBnZW5lcmF0ZWQgZm9yIGEgdGV4dCBjaGFuZ2UgdGhhdCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgLy8gYW55IHRleHQuIE1hcmsgdGhlIGRvbSBjaGFuZ2UgdG8gZmFsbCBiYWNrIHRvIGFzc3VtaW5nIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiB3YXMgdHlwZWQgb3ZlciB3aXRoIGFuIGlkZW50aWNhbCB2YWx1ZSBpZiBpdCBjYW4ndFxuICAgICAgICAgICAgICAgIC8vIGZpbmQgYW5vdGhlciBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgdHlwZU92ZXI6IG11dC50YXJnZXQubm9kZVZhbHVlID09IG11dC5vbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBjc3NDaGVja2VkID0gbmV3IFdlYWtNYXAoKTtcbmxldCBjc3NDaGVja1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tDU1Modmlldykge1xuICAgIGlmIChjc3NDaGVja2VkLmhhcyh2aWV3KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNzc0NoZWNrZWQuc2V0KHZpZXcsIG51bGwpO1xuICAgIGlmIChbJ25vcm1hbCcsICdub3dyYXAnLCAncHJlLWxpbmUnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUodmlldy5kb20pLndoaXRlU3BhY2UpICE9PSAtMSkge1xuICAgICAgICB2aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGdlY2tvO1xuICAgICAgICBpZiAoY3NzQ2hlY2tXYXJuZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnNvbGVbXCJ3YXJuXCJdKFwiUHJvc2VNaXJyb3IgZXhwZWN0cyB0aGUgQ1NTIHdoaXRlLXNwYWNlIHByb3BlcnR5IHRvIGJlIHNldCwgcHJlZmVyYWJseSB0byAncHJlLXdyYXAnLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsb2FkIHN0eWxlL3Byb3NlbWlycm9yLmNzcyBmcm9tIHRoZSBwcm9zZW1pcnJvci12aWV3IHBhY2thZ2UuXCIpO1xuICAgICAgICBjc3NDaGVja1dhcm5lZCA9IHRydWU7XG4gICAgfVxufVxuLy8gVXNlZCB0byB3b3JrIGFyb3VuZCBhIFNhZmFyaSBTZWxlY3Rpb24vc2hhZG93IERPTSBidWdcbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDE0IGZpeFxuZnVuY3Rpb24gc2FmYXJpU2hhZG93U2VsZWN0aW9uUmFuZ2Uodmlldykge1xuICAgIGxldCBmb3VuZDtcbiAgICBmdW5jdGlvbiByZWFkKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBmb3VuZCA9IGV2ZW50LmdldFRhcmdldFJhbmdlcygpWzBdO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIFNhZmFyaSAoYXQgbGVhc3QgaW4gMjAxOC0yMDIyKSBkb2Vzbid0IHByb3ZpZGUgcmVndWxhclxuICAgIC8vIGFjY2VzcyB0byB0aGUgc2VsZWN0aW9uIGluc2lkZSBhIHNoYWRvd1Jvb3QsIHdlIGhhdmUgdG8gcGVyZm9ybSBhXG4gICAgLy8gcmlkaWN1bG91cyBoYWNrIHRvIGdldCBhdCBpdFx1MjAxNHVzaW5nIGBleGVjQ29tbWFuZGAgdG8gdHJpZ2dlciBhXG4gICAgLy8gYGJlZm9yZUlucHV0YCBldmVudCBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSB0YXJnZXQgcmFuZ2UgZnJvbSB0aGVcbiAgICAvLyBldmVudC5cbiAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbmRlbnRcIik7XG4gICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIGxldCBhbmNob3JOb2RlID0gZm91bmQuc3RhcnRDb250YWluZXIsIGFuY2hvck9mZnNldCA9IGZvdW5kLnN0YXJ0T2Zmc2V0O1xuICAgIGxldCBmb2N1c05vZGUgPSBmb3VuZC5lbmRDb250YWluZXIsIGZvY3VzT2Zmc2V0ID0gZm91bmQuZW5kT2Zmc2V0O1xuICAgIGxldCBjdXJyZW50QW5jaG9yID0gdmlldy5kb21BdFBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IpO1xuICAgIC8vIFNpbmNlIHN1Y2ggYSByYW5nZSBkb2Vzbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW5jaG9yIGFuZCBoZWFkLFxuICAgIC8vIHVzZSBhIGhldXJpc3RpYyB0aGF0IGZsaXBzIGl0IGFyb3VuZCBpZiBpdHMgZW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBhbmNob3IuXG4gICAgaWYgKGlzRXF1aXZhbGVudFBvc2l0aW9uKGN1cnJlbnRBbmNob3Iubm9kZSwgY3VycmVudEFuY2hvci5vZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKVxuICAgICAgICBbYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0XSA9IFtmb2N1c05vZGUsIGZvY3VzT2Zmc2V0LCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXRdO1xuICAgIHJldHVybiB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9O1xufVxuXG4vLyBOb3RlIHRoYXQgYWxsIHJlZmVyZW5jaW5nIGFuZCBwYXJzaW5nIGlzIGRvbmUgd2l0aCB0aGVcbi8vIHN0YXJ0LW9mLW9wZXJhdGlvbiBzZWxlY3Rpb24gYW5kIGRvY3VtZW50LCBzaW5jZSB0aGF0J3MgdGhlIG9uZVxuLy8gdGhhdCB0aGUgRE9NIHJlcHJlc2VudHMuIElmIGFueSBjaGFuZ2VzIGNhbWUgaW4gaW4gdGhlIG1lYW50aW1lLFxuLy8gdGhlIG1vZGlmaWNhdGlvbiBpcyBtYXBwZWQgb3ZlciB0aG9zZSBiZWZvcmUgaXQgaXMgYXBwbGllZCwgaW5cbi8vIHJlYWRET01DaGFuZ2UuXG5mdW5jdGlvbiBwYXJzZUJldHdlZW4odmlldywgZnJvbV8sIHRvXykge1xuICAgIGxldCB7IG5vZGU6IHBhcmVudCwgZnJvbU9mZnNldCwgdG9PZmZzZXQsIGZyb20sIHRvIH0gPSB2aWV3LmRvY1ZpZXcucGFyc2VSYW5nZShmcm9tXywgdG9fKTtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBmaW5kO1xuICAgIGxldCBhbmNob3IgPSBkb21TZWwuYW5jaG9yTm9kZTtcbiAgICBpZiAoYW5jaG9yICYmIHZpZXcuZG9tLmNvbnRhaW5zKGFuY2hvci5ub2RlVHlwZSA9PSAxID8gYW5jaG9yIDogYW5jaG9yLnBhcmVudE5vZGUpKSB7XG4gICAgICAgIGZpbmQgPSBbeyBub2RlOiBhbmNob3IsIG9mZnNldDogZG9tU2VsLmFuY2hvck9mZnNldCB9XTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25Db2xsYXBzZWQoZG9tU2VsKSlcbiAgICAgICAgICAgIGZpbmQucHVzaCh7IG5vZGU6IGRvbVNlbC5mb2N1c05vZGUsIG9mZnNldDogZG9tU2VsLmZvY3VzT2Zmc2V0IH0pO1xuICAgIH1cbiAgICAvLyBXb3JrIGFyb3VuZCBpc3N1ZSBpbiBDaHJvbWUgd2hlcmUgYmFja3NwYWNpbmcgc29tZXRpbWVzIHJlcGxhY2VzXG4gICAgLy8gdGhlIGRlbGV0ZWQgY29udGVudCB3aXRoIGEgcmFuZG9tIEJSIG5vZGUgKGlzc3VlcyAjNzk5LCAjODMxKVxuICAgIGlmIChjaHJvbWUgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCkge1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0b09mZnNldDsgb2ZmID4gZnJvbU9mZnNldDsgb2ZmLS0pIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcGFyZW50LmNoaWxkTm9kZXNbb2ZmIC0gMV0sIGRlc2MgPSBub2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRlc2MpIHtcbiAgICAgICAgICAgICAgICB0b09mZnNldCA9IG9mZjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGVzYyB8fCBkZXNjLnNpemUpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0YXJ0RG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJkb21QYXJzZXJcIikgfHwgRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpO1xuICAgIGxldCAkZnJvbSA9IHN0YXJ0RG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHNlbCA9IG51bGwsIGRvYyA9IHBhcnNlci5wYXJzZShwYXJlbnQsIHtcbiAgICAgICAgdG9wTm9kZTogJGZyb20ucGFyZW50LFxuICAgICAgICB0b3BNYXRjaDogJGZyb20ucGFyZW50LmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4KCkpLFxuICAgICAgICB0b3BPcGVuOiB0cnVlLFxuICAgICAgICBmcm9tOiBmcm9tT2Zmc2V0LFxuICAgICAgICB0bzogdG9PZmZzZXQsXG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZTogJGZyb20ucGFyZW50LnR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiID8gXCJmdWxsXCIgOiB0cnVlLFxuICAgICAgICBmaW5kUG9zaXRpb25zOiBmaW5kLFxuICAgICAgICBydWxlRnJvbU5vZGUsXG4gICAgICAgIGNvbnRleHQ6ICRmcm9tXG4gICAgfSk7XG4gICAgaWYgKGZpbmQgJiYgZmluZFswXS5wb3MgIT0gbnVsbCkge1xuICAgICAgICBsZXQgYW5jaG9yID0gZmluZFswXS5wb3MsIGhlYWQgPSBmaW5kWzFdICYmIGZpbmRbMV0ucG9zO1xuICAgICAgICBpZiAoaGVhZCA9PSBudWxsKVxuICAgICAgICAgICAgaGVhZCA9IGFuY2hvcjtcbiAgICAgICAgc2VsID0geyBhbmNob3I6IGFuY2hvciArIGZyb20sIGhlYWQ6IGhlYWQgKyBmcm9tIH07XG4gICAgfVxuICAgIHJldHVybiB7IGRvYywgc2VsLCBmcm9tLCB0byB9O1xufVxuZnVuY3Rpb24gcnVsZUZyb21Ob2RlKGRvbSkge1xuICAgIGxldCBkZXNjID0gZG9tLnBtVmlld0Rlc2M7XG4gICAgaWYgKGRlc2MpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MucGFyc2VSdWxlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgLy8gU2FmYXJpIHJlcGxhY2VzIHRoZSBsaXN0IGl0ZW0gb3IgdGFibGUgY2VsbCB3aXRoIGEgQlJcbiAgICAgICAgLy8gZGlyZWN0bHkgaW4gdGhlIGxpc3Qgbm9kZSAoPyEpIGlmIHlvdSBkZWxldGUgdGhlIGxhc3RcbiAgICAgICAgLy8gY2hhcmFjdGVyIGluIGEgbGlzdCBpdGVtIG9yIHRhYmxlIGNlbGwgKCM3MDgsICM4NjIpXG4gICAgICAgIGlmIChzYWZhcmkgJiYgL14odWx8b2wpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBza2lwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaVwiKSk7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9tLnBhcmVudE5vZGUubGFzdENoaWxkID09IGRvbSB8fCBzYWZhcmkgJiYgL14odHJ8dGFibGUpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkb20ubm9kZU5hbWUgPT0gXCJJTUdcIiAmJiBkb20uZ2V0QXR0cmlidXRlKFwibWFyay1wbGFjZWhvbGRlclwiKSkge1xuICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jb25zdCBpc0lubGluZSA9IC9eKGF8YWJicnxhY3JvbnltfGJ8YmRbaW9dfGJpZ3xicnxidXR0b258Y2l0ZXxjb2RlfGRhdGEobGlzdCk/fGRlbHxkZm58ZW18aXxpbnN8a2JkfGxhYmVsfG1hcHxtYXJrfG1ldGVyfG91dHB1dHxxfHJ1Ynl8c3xzYW1wfHNtYWxsfHNwYW58c3Ryb25nfHN1W2JwXXx0aW1lfHV8dHR8dmFyKSQvaTtcbmZ1bmN0aW9uIHJlYWRET01DaGFuZ2UodmlldywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZE5vZGVzKSB7XG4gICAgbGV0IGNvbXBvc2l0aW9uSUQgPSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgfHwgKHZpZXcuY29tcG9zaW5nID8gdmlldy5pbnB1dC5jb21wb3NpdGlvbklEIDogMCk7XG4gICAgdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzID0gMDtcbiAgICBpZiAoZnJvbSA8IDApIHtcbiAgICAgICAgbGV0IG9yaWdpbiA9IHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPiBEYXRlLm5vdygpIC0gNTAgPyB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25PcmlnaW4gOiBudWxsO1xuICAgICAgICBsZXQgbmV3U2VsID0gc2VsZWN0aW9uRnJvbURPTSh2aWV3LCBvcmlnaW4pO1xuICAgICAgICBpZiAobmV3U2VsICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5lcShuZXdTZWwpKSB7XG4gICAgICAgICAgICBpZiAoY2hyb21lICYmIGFuZHJvaWQgJiZcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlID09PSAxMyAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUgJiZcbiAgICAgICAgICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXdTZWwpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbiA9PSBcInBvaW50ZXJcIilcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwicG9pbnRlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG9yaWdpbiA9PSBcImtleVwiKVxuICAgICAgICAgICAgICAgIHRyLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JRClcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCAkYmVmb3JlID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICBsZXQgc2hhcmVkID0gJGJlZm9yZS5zaGFyZWREZXB0aCh0byk7XG4gICAgZnJvbSA9ICRiZWZvcmUuYmVmb3JlKHNoYXJlZCArIDEpO1xuICAgIHRvID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSh0bykuYWZ0ZXIoc2hhcmVkICsgMSk7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCBwYXJzZSA9IHBhcnNlQmV0d2Vlbih2aWV3LCBmcm9tLCB0byk7XG4gICAgbGV0IGRvYyA9IHZpZXcuc3RhdGUuZG9jLCBjb21wYXJlID0gZG9jLnNsaWNlKHBhcnNlLmZyb20sIHBhcnNlLnRvKTtcbiAgICBsZXQgcHJlZmVycmVkUG9zLCBwcmVmZXJyZWRTaWRlO1xuICAgIC8vIFByZWZlciBhbmNob3JpbmcgdG8gZW5kIHdoZW4gQmFja3NwYWNlIGlzIHByZXNzZWRcbiAgICBpZiAodmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUpIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24udG87XG4gICAgICAgIHByZWZlcnJlZFNpZGUgPSBcImVuZFwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbTtcbiAgICAgICAgcHJlZmVycmVkU2lkZSA9IFwic3RhcnRcIjtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9IG51bGw7XG4gICAgbGV0IGNoYW5nZSA9IGZpbmREaWZmKGNvbXBhcmUuY29udGVudCwgcGFyc2UuZG9jLmNvbnRlbnQsIHBhcnNlLmZyb20sIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSk7XG4gICAgaWYgKChpb3MgJiYgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPiBEYXRlLm5vdygpIC0gMjI1IHx8IGFuZHJvaWQpICYmXG4gICAgICAgIGFkZGVkTm9kZXMuc29tZShuID0+IG4ubm9kZVR5cGUgPT0gMSAmJiAhaXNJbmxpbmUudGVzdChuLm5vZGVOYW1lKSkgJiZcbiAgICAgICAgKCFjaGFuZ2UgfHwgY2hhbmdlLmVuZEEgPj0gY2hhbmdlLmVuZEIpICYmXG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpKSB7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICBpZiAodHlwZU92ZXIgJiYgc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiAhc2VsLmVtcHR5ICYmIHNlbC4kaGVhZC5zYW1lUGFyZW50KHNlbC4kYW5jaG9yKSAmJlxuICAgICAgICAgICAgIXZpZXcuY29tcG9zaW5nICYmICEocGFyc2Uuc2VsICYmIHBhcnNlLnNlbC5hbmNob3IgIT0gcGFyc2Uuc2VsLmhlYWQpKSB7XG4gICAgICAgICAgICBjaGFuZ2UgPSB7IHN0YXJ0OiBzZWwuZnJvbSwgZW5kQTogc2VsLnRvLCBlbmRCOiBzZWwudG8gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwYXJzZS5zZWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsID0gcmVzb2x2ZVNlbGVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLmRvYywgcGFyc2Uuc2VsKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsICYmICFzZWwuZXEodmlldy5zdGF0ZS5zZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbklEKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHIuc2V0TWV0YShcImNvbXBvc2l0aW9uXCIsIGNvbXBvc2l0aW9uSUQpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2hyb21lIHNvbWV0aW1lcyBsZWF2ZXMgdGhlIGN1cnNvciBiZWZvcmUgdGhlIGluc2VydGVkIHRleHQgd2hlblxuICAgIC8vIGNvbXBvc2luZyBhZnRlciBhIGN1cnNvciB3cmFwcGVyLiBUaGlzIG1vdmVzIGl0IGZvcndhcmQuXG4gICAgaWYgKGNocm9tZSAmJiB2aWV3LmN1cnNvcldyYXBwZXIgJiYgcGFyc2Uuc2VsICYmIHBhcnNlLnNlbC5hbmNob3IgPT0gdmlldy5jdXJzb3JXcmFwcGVyLmRlY28uZnJvbSAmJlxuICAgICAgICBwYXJzZS5zZWwuaGVhZCA9PSBwYXJzZS5zZWwuYW5jaG9yKSB7XG4gICAgICAgIGxldCBzaXplID0gY2hhbmdlLmVuZEIgLSBjaGFuZ2Uuc3RhcnQ7XG4gICAgICAgIHBhcnNlLnNlbCA9IHsgYW5jaG9yOiBwYXJzZS5zZWwuYW5jaG9yICsgc2l6ZSwgaGVhZDogcGFyc2Uuc2VsLmFuY2hvciArIHNpemUgfTtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCsrO1xuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvdmVyd3JpdGluZyBhIHNlbGVjdGlvbiBieSB0eXBpbmcgbWF0Y2hlc1xuICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHNlbGVjdGVkIGNvbnRlbnQsIGNyZWF0aW5nIGEgY2hhbmdlXG4gICAgLy8gdGhhdCdzIHNtYWxsZXIgdGhhbiB3aGF0IHdhcyBhY3R1YWxseSBvdmVyd3JpdHRlbi5cbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA8IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvICYmXG4gICAgICAgIGNoYW5nZS5zdGFydCA9PSBjaGFuZ2UuZW5kQiAmJlxuICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKGNoYW5nZS5zdGFydCA+IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gJiYgY2hhbmdlLnN0YXJ0IDw9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gKyAyICYmXG4gICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tID49IHBhcnNlLmZyb20pIHtcbiAgICAgICAgICAgIGNoYW5nZS5zdGFydCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlLmVuZEEgPCB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAmJiBjaGFuZ2UuZW5kQSA+PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAtIDIgJiZcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIDw9IHBhcnNlLnRvKSB7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQiArPSAodmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gLSBjaGFuZ2UuZW5kQSk7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElFMTEgd2lsbCBpbnNlcnQgYSBub24tYnJlYWtpbmcgc3BhY2UgX2FoZWFkXyBvZiB0aGUgc3BhY2UgYWZ0ZXJcbiAgICAvLyB0aGUgY3Vyc29yIHNwYWNlIHdoZW4gYWRkaW5nIGEgc3BhY2UgYmVmb3JlIGFub3RoZXIgc3BhY2UuIFdoZW5cbiAgICAvLyB0aGF0IGhhcHBlbmVkLCBhZGp1c3QgdGhlIGNoYW5nZSB0byBjb3ZlciB0aGUgc3BhY2UgaW5zdGVhZC5cbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBjaGFuZ2UuZW5kQiA9PSBjaGFuZ2Uuc3RhcnQgKyAxICYmXG4gICAgICAgIGNoYW5nZS5lbmRBID09IGNoYW5nZS5zdGFydCAmJiBjaGFuZ2Uuc3RhcnQgPiBwYXJzZS5mcm9tICYmXG4gICAgICAgIHBhcnNlLmRvYy50ZXh0QmV0d2VlbihjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tIC0gMSwgY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSArIDEpID09IFwiIFxcdTAwYTBcIikge1xuICAgICAgICBjaGFuZ2Uuc3RhcnQtLTtcbiAgICAgICAgY2hhbmdlLmVuZEEtLTtcbiAgICAgICAgY2hhbmdlLmVuZEItLTtcbiAgICB9XG4gICAgbGV0ICRmcm9tID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20pO1xuICAgIGxldCAkdG8gPSBwYXJzZS5kb2MucmVzb2x2ZU5vQ2FjaGUoY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKTtcbiAgICBsZXQgJGZyb21BID0gZG9jLnJlc29sdmUoY2hhbmdlLnN0YXJ0KTtcbiAgICBsZXQgaW5saW5lQ2hhbmdlID0gJGZyb20uc2FtZVBhcmVudCgkdG8pICYmICRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50ICYmICRmcm9tQS5lbmQoKSA+PSBjaGFuZ2UuZW5kQTtcbiAgICBsZXQgbmV4dFNlbDtcbiAgICAvLyBJZiB0aGlzIGxvb2tzIGxpa2UgdGhlIGVmZmVjdCBvZiBwcmVzc2luZyBFbnRlciAob3Igd2FzIHJlY29yZGVkXG4gICAgLy8gYXMgYmVpbmcgYW4gaU9TIGVudGVyIHByZXNzKSwganVzdCBkaXNwYXRjaCBhbiBFbnRlciBrZXkgaW5zdGVhZC5cbiAgICBpZiAoKChpb3MgJiYgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPiBEYXRlLm5vdygpIC0gMjI1ICYmXG4gICAgICAgICghaW5saW5lQ2hhbmdlIHx8IGFkZGVkTm9kZXMuc29tZShuID0+IG4ubm9kZU5hbWUgPT0gXCJESVZcIiB8fCBuLm5vZGVOYW1lID09IFwiUFwiKSkpIHx8XG4gICAgICAgICghaW5saW5lQ2hhbmdlICYmICRmcm9tLnBvcyA8IHBhcnNlLmRvYy5jb250ZW50LnNpemUgJiYgISRmcm9tLnNhbWVQYXJlbnQoJHRvKSAmJlxuICAgICAgICAgICAgKG5leHRTZWwgPSBTZWxlY3Rpb24uZmluZEZyb20ocGFyc2UuZG9jLnJlc29sdmUoJGZyb20ucG9zICsgMSksIDEsIHRydWUpKSAmJlxuICAgICAgICAgICAgbmV4dFNlbC5oZWFkID09ICR0by5wb3MpKSAmJlxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSkge1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlciA9IDA7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU2FtZSBmb3IgYmFja3NwYWNlXG4gICAgaWYgKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvciA+IGNoYW5nZS5zdGFydCAmJlxuICAgICAgICBsb29rc0xpa2VKb2luKGRvYywgY2hhbmdlLnN0YXJ0LCBjaGFuZ2UuZW5kQSwgJGZyb20sICR0bykgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDgsIFwiQmFja3NwYWNlXCIpKSkpIHtcbiAgICAgICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lKVxuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKTsgLy8gIzgyMFxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENocm9tZSBBbmRyb2lkIHdpbGwgb2NjYXNpb25hbGx5LCBkdXJpbmcgY29tcG9zaXRpb24sIGRlbGV0ZSB0aGVcbiAgICAvLyBlbnRpcmUgY29tcG9zaXRpb24gYW5kIHRoZW4gaW1tZWRpYXRlbHkgaW5zZXJ0IGl0IGFnYWluLiBUaGlzIGlzXG4gICAgLy8gdXNlZCB0byBkZXRlY3QgdGhhdCBzaXR1YXRpb24uXG4gICAgaWYgKGNocm9tZSAmJiBhbmRyb2lkICYmIGNoYW5nZS5lbmRCID09IGNoYW5nZS5zdGFydClcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0QW5kcm9pZERlbGV0ZSA9IERhdGUubm93KCk7XG4gICAgLy8gVGhpcyB0cmllcyB0byBkZXRlY3QgQW5kcm9pZCB2aXJ0dWFsIGtleWJvYXJkXG4gICAgLy8gZW50ZXItYW5kLXBpY2stc3VnZ2VzdGlvbiBhY3Rpb24uIFRoYXQgc29tZXRpbWVzIChzZWUgaXNzdWVcbiAgICAvLyAjMTA1OSkgZmlyc3QgZmlyZXMgYSBET00gbXV0YXRpb24sIGJlZm9yZSBtb3ZpbmcgdGhlIHNlbGVjdGlvbiB0b1xuICAgIC8vIHRoZSBuZXdseSBjcmVhdGVkIGJsb2NrLiBBbmQgdGhlbiwgYmVjYXVzZSBQcm9zZU1pcnJvciBjbGVhbnMgdXBcbiAgICAvLyB0aGUgRE9NIHNlbGVjdGlvbiwgaXQgZ2l2ZXMgdXAgbW92aW5nIHRoZSBzZWxlY3Rpb24gZW50aXJlbHksXG4gICAgLy8gbGVhdmluZyB0aGUgY3Vyc29yIGluIHRoZSB3cm9uZyBwbGFjZS4gV2hlbiB0aGF0IGhhcHBlbnMsIHdlIGRyb3BcbiAgICAvLyB0aGUgbmV3IHBhcmFncmFwaCBmcm9tIHRoZSBpbml0aWFsIGNoYW5nZSwgYW5kIGZpcmUgYSBzaW11bGF0ZWRcbiAgICAvLyBlbnRlciBrZXkgYWZ0ZXJ3YXJkcy5cbiAgICBpZiAoYW5kcm9pZCAmJiAhaW5saW5lQ2hhbmdlICYmICRmcm9tLnN0YXJ0KCkgIT0gJHRvLnN0YXJ0KCkgJiYgJHRvLnBhcmVudE9mZnNldCA9PSAwICYmICRmcm9tLmRlcHRoID09ICR0by5kZXB0aCAmJlxuICAgICAgICBwYXJzZS5zZWwgJiYgcGFyc2Uuc2VsLmFuY2hvciA9PSBwYXJzZS5zZWwuaGVhZCAmJiBwYXJzZS5zZWwuaGVhZCA9PSBjaGFuZ2UuZW5kQSkge1xuICAgICAgICBjaGFuZ2UuZW5kQiAtPSAyO1xuICAgICAgICAkdG8gPSBwYXJzZS5kb2MucmVzb2x2ZU5vQ2FjaGUoY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmdW5jdGlvbiAoZikgeyByZXR1cm4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSk7IH0pO1xuICAgICAgICB9LCAyMCk7XG4gICAgfVxuICAgIGxldCBjaEZyb20gPSBjaGFuZ2Uuc3RhcnQsIGNoVG8gPSBjaGFuZ2UuZW5kQTtcbiAgICBsZXQgdHIsIHN0b3JlZE1hcmtzLCBtYXJrQ2hhbmdlO1xuICAgIGlmIChpbmxpbmVDaGFuZ2UpIHtcbiAgICAgICAgaWYgKCRmcm9tLnBvcyA9PSAkdG8ucG9zKSB7IC8vIERlbGV0aW9uXG4gICAgICAgICAgICAvLyBJRTExIHNvbWV0aW1lcyB3ZWlyZGx5IG1vdmVzIHRoZSBET00gc2VsZWN0aW9uIGFyb3VuZCBhZnRlclxuICAgICAgICAgICAgLy8gYmFja3NwYWNpbmcgb3V0IHRoZSBmaXJzdCBlbGVtZW50IGluIGEgdGV4dGJsb2NrXG4gICAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiAkZnJvbS5wYXJlbnRPZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3VwcHJlc3NTZWxlY3Rpb25VcGRhdGVzKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzZWxlY3Rpb25Ub0RPTSh2aWV3KSwgMjApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyLmRlbGV0ZShjaEZyb20sIGNoVG8pO1xuICAgICAgICAgICAgc3RvcmVkTWFya3MgPSBkb2MucmVzb2x2ZShjaGFuZ2Uuc3RhcnQpLm1hcmtzQWNyb3NzKGRvYy5yZXNvbHZlKGNoYW5nZS5lbmRBKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIC8vIEFkZGluZyBvciByZW1vdmluZyBhIG1hcmtcbiAgICAgICAgY2hhbmdlLmVuZEEgPT0gY2hhbmdlLmVuZEIgJiZcbiAgICAgICAgICAgIChtYXJrQ2hhbmdlID0gaXNNYXJrQ2hhbmdlKCRmcm9tLnBhcmVudC5jb250ZW50LmN1dCgkZnJvbS5wYXJlbnRPZmZzZXQsICR0by5wYXJlbnRPZmZzZXQpLCAkZnJvbUEucGFyZW50LmNvbnRlbnQuY3V0KCRmcm9tQS5wYXJlbnRPZmZzZXQsIGNoYW5nZS5lbmRBIC0gJGZyb21BLnN0YXJ0KCkpKSkpIHtcbiAgICAgICAgICAgIHRyID0gdmlldy5zdGF0ZS50cjtcbiAgICAgICAgICAgIGlmIChtYXJrQ2hhbmdlLnR5cGUgPT0gXCJhZGRcIilcbiAgICAgICAgICAgICAgICB0ci5hZGRNYXJrKGNoRnJvbSwgY2hUbywgbWFya0NoYW5nZS5tYXJrKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0ci5yZW1vdmVNYXJrKGNoRnJvbSwgY2hUbywgbWFya0NoYW5nZS5tYXJrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgkZnJvbS5wYXJlbnQuY2hpbGQoJGZyb20uaW5kZXgoKSkuaXNUZXh0ICYmICRmcm9tLmluZGV4KCkgPT0gJHRvLmluZGV4KCkgLSAoJHRvLnRleHRPZmZzZXQgPyAwIDogMSkpIHtcbiAgICAgICAgICAgIC8vIEJvdGggcG9zaXRpb25zIGluIHRoZSBzYW1lIHRleHQgbm9kZSAtLSBzaW1wbHkgaW5zZXJ0IHRleHRcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gJGZyb20ucGFyZW50LnRleHRCZXR3ZWVuKCRmcm9tLnBhcmVudE9mZnNldCwgJHRvLnBhcmVudE9mZnNldCk7XG4gICAgICAgICAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZVRleHRJbnB1dFwiLCBmID0+IGYodmlldywgY2hGcm9tLCBjaFRvLCB0ZXh0KSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyLmluc2VydFRleHQodGV4dCwgY2hGcm9tLCBjaFRvKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRyKVxuICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHIucmVwbGFjZShjaEZyb20sIGNoVG8sIHBhcnNlLmRvYy5zbGljZShjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tLCBjaGFuZ2UuZW5kQiAtIHBhcnNlLmZyb20pKTtcbiAgICBpZiAocGFyc2Uuc2VsKSB7XG4gICAgICAgIGxldCBzZWwgPSByZXNvbHZlU2VsZWN0aW9uKHZpZXcsIHRyLmRvYywgcGFyc2Uuc2VsKTtcbiAgICAgICAgLy8gQ2hyb21lIEFuZHJvaWQgd2lsbCBzb21ldGltZXMsIGR1cmluZyBjb21wb3NpdGlvbiwgcmVwb3J0IHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gaW4gdGhlIHdyb25nIHBsYWNlLiBJZiBpdCBsb29rcyBsaWtlIHRoYXQgaXNcbiAgICAgICAgLy8gaGFwcGVuaW5nLCBkb24ndCB1cGRhdGUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgLy8gRWRnZSBqdXN0IGRvZXNuJ3QgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgd2hlbiB5b3Ugc3RhcnQgdHlwaW5nXG4gICAgICAgIC8vIGluIGFuIGVtcHR5IGJsb2NrIG9yIGJldHdlZW4gYnIgbm9kZXMuXG4gICAgICAgIGlmIChzZWwgJiYgIShjaHJvbWUgJiYgYW5kcm9pZCAmJiB2aWV3LmNvbXBvc2luZyAmJiBzZWwuZW1wdHkgJiZcbiAgICAgICAgICAgIChjaGFuZ2Uuc3RhcnQgIT0gY2hhbmdlLmVuZEIgfHwgdmlldy5pbnB1dC5sYXN0QW5kcm9pZERlbGV0ZSA8IERhdGUubm93KCkgLSAxMDApICYmXG4gICAgICAgICAgICAoc2VsLmhlYWQgPT0gY2hGcm9tIHx8IHNlbC5oZWFkID09IHRyLm1hcHBpbmcubWFwKGNoVG8pIC0gMSkgfHxcbiAgICAgICAgICAgIGllICYmIHNlbC5lbXB0eSAmJiBzZWwuaGVhZCA9PSBjaEZyb20pKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbCk7XG4gICAgfVxuICAgIGlmIChzdG9yZWRNYXJrcylcbiAgICAgICAgdHIuZW5zdXJlTWFya3Moc3RvcmVkTWFya3MpO1xuICAgIGlmIChjb21wb3NpdGlvbklEKVxuICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVTZWxlY3Rpb24odmlldywgZG9jLCBwYXJzZWRTZWwpIHtcbiAgICBpZiAoTWF0aC5tYXgocGFyc2VkU2VsLmFuY2hvciwgcGFyc2VkU2VsLmhlYWQpID4gZG9jLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkJldHdlZW4odmlldywgZG9jLnJlc29sdmUocGFyc2VkU2VsLmFuY2hvciksIGRvYy5yZXNvbHZlKHBhcnNlZFNlbC5oZWFkKSk7XG59XG4vLyBHaXZlbiB0d28gc2FtZS1sZW5ndGgsIG5vbi1lbXB0eSBmcmFnbWVudHMgb2YgaW5saW5lIGNvbnRlbnQsXG4vLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmlyc3QgY291bGQgYmUgY3JlYXRlZCBmcm9tIHRoZSBzZWNvbmQgYnlcbi8vIHJlbW92aW5nIG9yIGFkZGluZyBhIHNpbmdsZSBtYXJrIHR5cGUuXG5mdW5jdGlvbiBpc01hcmtDaGFuZ2UoY3VyLCBwcmV2KSB7XG4gICAgbGV0IGN1ck1hcmtzID0gY3VyLmZpcnN0Q2hpbGQubWFya3MsIHByZXZNYXJrcyA9IHByZXYuZmlyc3RDaGlsZC5tYXJrcztcbiAgICBsZXQgYWRkZWQgPSBjdXJNYXJrcywgcmVtb3ZlZCA9IHByZXZNYXJrcywgdHlwZSwgbWFyaywgdXBkYXRlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldk1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICBhZGRlZCA9IHByZXZNYXJrc1tpXS5yZW1vdmVGcm9tU2V0KGFkZGVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICByZW1vdmVkID0gY3VyTWFya3NbaV0ucmVtb3ZlRnJvbVNldChyZW1vdmVkKTtcbiAgICBpZiAoYWRkZWQubGVuZ3RoID09IDEgJiYgcmVtb3ZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICBtYXJrID0gYWRkZWRbMF07XG4gICAgICAgIHR5cGUgPSBcImFkZFwiO1xuICAgICAgICB1cGRhdGUgPSAobm9kZSkgPT4gbm9kZS5tYXJrKG1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhZGRlZC5sZW5ndGggPT0gMCAmJiByZW1vdmVkLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIG1hcmsgPSByZW1vdmVkWzBdO1xuICAgICAgICB0eXBlID0gXCJyZW1vdmVcIjtcbiAgICAgICAgdXBkYXRlID0gKG5vZGUpID0+IG5vZGUubWFyayhtYXJrLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB1cGRhdGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgdXBkYXRlZC5wdXNoKHVwZGF0ZShwcmV2LmNoaWxkKGkpKSk7XG4gICAgaWYgKEZyYWdtZW50LmZyb20odXBkYXRlZCkuZXEoY3VyKSlcbiAgICAgICAgcmV0dXJuIHsgbWFyaywgdHlwZSB9O1xufVxuZnVuY3Rpb24gbG9va3NMaWtlSm9pbihvbGQsIHN0YXJ0LCBlbmQsICRuZXdTdGFydCwgJG5ld0VuZCkge1xuICAgIGlmICghJG5ld1N0YXJ0LnBhcmVudC5pc1RleHRibG9jayB8fFxuICAgICAgICAvLyBUaGUgY29udGVudCBtdXN0IGhhdmUgc2hydW5rXG4gICAgICAgIGVuZCAtIHN0YXJ0IDw9ICRuZXdFbmQucG9zIC0gJG5ld1N0YXJ0LnBvcyB8fFxuICAgICAgICAvLyBuZXdFbmQgbXVzdCBwb2ludCBkaXJlY3RseSBhdCBvciBhZnRlciB0aGUgZW5kIG9mIHRoZSBibG9jayB0aGF0IG5ld1N0YXJ0IHBvaW50cyBpbnRvXG4gICAgICAgIHNraXBDbG9zaW5nQW5kT3BlbmluZygkbmV3U3RhcnQsIHRydWUsIGZhbHNlKSA8ICRuZXdFbmQucG9zKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRzdGFydCA9IG9sZC5yZXNvbHZlKHN0YXJ0KTtcbiAgICAvLyBTdGFydCBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgYSBibG9ja1xuICAgIGlmICgkc3RhcnQucGFyZW50T2Zmc2V0IDwgJHN0YXJ0LnBhcmVudC5jb250ZW50LnNpemUgfHwgISRzdGFydC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJG5leHQgPSBvbGQucmVzb2x2ZShza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHN0YXJ0LCB0cnVlLCB0cnVlKSk7XG4gICAgLy8gVGhlIG5leHQgdGV4dGJsb2NrIG11c3Qgc3RhcnQgYmVmb3JlIGVuZCBhbmQgZW5kIG5lYXIgaXRcbiAgICBpZiAoISRuZXh0LnBhcmVudC5pc1RleHRibG9jayB8fCAkbmV4dC5wb3MgPiBlbmQgfHxcbiAgICAgICAgc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRuZXh0LCB0cnVlLCBmYWxzZSkgPCBlbmQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBUaGUgZnJhZ21lbnRzIGFmdGVyIHRoZSBqb2luIHBvaW50IG11c3QgbWF0Y2hcbiAgICByZXR1cm4gJG5ld1N0YXJ0LnBhcmVudC5jb250ZW50LmN1dCgkbmV3U3RhcnQucGFyZW50T2Zmc2V0KS5lcSgkbmV4dC5wYXJlbnQuY29udGVudCk7XG59XG5mdW5jdGlvbiBza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHBvcywgZnJvbUVuZCwgbWF5T3Blbikge1xuICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGgsIGVuZCA9IGZyb21FbmQgPyAkcG9zLmVuZCgpIDogJHBvcy5wb3M7XG4gICAgd2hpbGUgKGRlcHRoID4gMCAmJiAoZnJvbUVuZCB8fCAkcG9zLmluZGV4QWZ0ZXIoZGVwdGgpID09ICRwb3Mubm9kZShkZXB0aCkuY2hpbGRDb3VudCkpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgZW5kKys7XG4gICAgICAgIGZyb21FbmQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1heU9wZW4pIHtcbiAgICAgICAgbGV0IG5leHQgPSAkcG9zLm5vZGUoZGVwdGgpLm1heWJlQ2hpbGQoJHBvcy5pbmRleEFmdGVyKGRlcHRoKSk7XG4gICAgICAgIHdoaWxlIChuZXh0ICYmICFuZXh0LmlzTGVhZikge1xuICAgICAgICAgICAgbmV4dCA9IG5leHQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5mdW5jdGlvbiBmaW5kRGlmZihhLCBiLCBwb3MsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBzdGFydCA9IGEuZmluZERpZmZTdGFydChiLCBwb3MpO1xuICAgIGlmIChzdGFydCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgeyBhOiBlbmRBLCBiOiBlbmRCIH0gPSBhLmZpbmREaWZmRW5kKGIsIHBvcyArIGEuc2l6ZSwgcG9zICsgYi5zaXplKTtcbiAgICBpZiAocHJlZmVycmVkU2lkZSA9PSBcImVuZFwiKSB7XG4gICAgICAgIGxldCBhZGp1c3QgPSBNYXRoLm1heCgwLCBzdGFydCAtIE1hdGgubWluKGVuZEEsIGVuZEIpKTtcbiAgICAgICAgcHJlZmVycmVkUG9zIC09IGVuZEEgKyBhZGp1c3QgLSBzdGFydDtcbiAgICB9XG4gICAgaWYgKGVuZEEgPCBzdGFydCAmJiBhLnNpemUgPCBiLnNpemUpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEEgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGIuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYi50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0ICsgKGVuZEIgLSBlbmRBKTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0O1xuICAgIH1cbiAgICBlbHNlIGlmIChlbmRCIDwgc3RhcnQpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEIgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGEuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYS50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0ICsgKGVuZEEgLSBlbmRCKTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kQSwgZW5kQiB9O1xufVxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoICE9IDIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYSA9IHN0ci5jaGFyQ29kZUF0KDApLCBiID0gc3RyLmNoYXJDb2RlQXQoMSk7XG4gICAgcmV0dXJuIGEgPj0gMHhEQzAwICYmIGEgPD0gMHhERkZGICYmIGIgPj0gMHhEODAwICYmIGIgPD0gMHhEQkZGO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fc2VyaWFsaXplRm9yQ2xpcGJvYXJkID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkO1xuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3BhcnNlRnJvbUNsaXBib2FyZCA9IHBhcnNlRnJvbUNsaXBib2FyZDtcbi8qKlxuQGludGVybmFsXG4qL1xuY29uc3QgX19lbmRDb21wb3NpdGlvbiA9IGVuZENvbXBvc2l0aW9uO1xuLyoqXG5BbiBlZGl0b3IgdmlldyBtYW5hZ2VzIHRoZSBET00gc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhblxuZWRpdGFibGUgZG9jdW1lbnQuIEl0cyBzdGF0ZSBhbmQgYmVoYXZpb3IgYXJlIGRldGVybWluZWQgYnkgaXRzXG5bcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRpcmVjdEVkaXRvclByb3BzKS5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB2aWV3LiBgcGxhY2VgIG1heSBiZSBhIERPTSBub2RlIHRoYXQgdGhlIGVkaXRvciBzaG91bGRcbiAgICBiZSBhcHBlbmRlZCB0bywgYSBmdW5jdGlvbiB0aGF0IHdpbGwgcGxhY2UgaXQgaW50byB0aGUgZG9jdW1lbnQsXG4gICAgb3IgYW4gb2JqZWN0IHdob3NlIGBtb3VudGAgcHJvcGVydHkgaG9sZHMgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZVxuICAgIGRvY3VtZW50IGNvbnRhaW5lci4gSWYgaXQgaXMgYG51bGxgLCB0aGUgZWRpdG9yIHdpbGwgbm90IGJlXG4gICAgYWRkZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IocGxhY2UsIHByb3BzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgS2x1ZGdlIHVzZWQgdG8gd29yayBhcm91bmQgYSBDaHJvbWUgYnVnIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrQ3Vyc29yID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnNvcldyYXBwZXIgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnB1dCA9IG5ldyBJbnB1dFN0YXRlO1xuICAgICAgICB0aGlzLnByZXZEaXJlY3RQbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luVmlld3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEhvbGRzIGB0cnVlYCB3aGVuIGEgaGFjayBub2RlIGlzIG5lZWRlZCBpbiBGaXJlZm94IHRvIHByZXZlbnQgdGhlXG4gICAgICAgIFtzcGFjZSBpcyBlYXRlbiBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yL2lzc3Vlcy82NTEpXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgV2hlbiBlZGl0b3IgY29udGVudCBpcyBiZWluZyBkcmFnZ2VkLCB0aGlzIG9iamVjdCBjb250YWluc1xuICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJhZ2dlZCBzbGljZSBhbmQgd2hldGhlciBpdCBpcyBiZWluZ1xuICAgICAgICBjb3BpZWQgb3IgbW92ZWQuIEF0IGFueSBvdGhlciB0aW1lLCBpdCBpcyBudWxsLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHByb3BzLnN0YXRlO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zIHx8IFtdO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMuZm9yRWFjaChjaGVja1N0YXRlQ29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kb20gPSAocGxhY2UgJiYgcGxhY2UubW91bnQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmIChwbGFjZSkge1xuICAgICAgICAgICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKVxuICAgICAgICAgICAgICAgIHBsYWNlLmFwcGVuZENoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwbGFjZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgcGxhY2UodGhpcy5kb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAocGxhY2UubW91bnQpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIHRoaXMubm9kZVZpZXdzID0gYnVpbGROb2RlVmlld3ModGhpcyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IGRvY1ZpZXdEZXNjKHRoaXMuc3RhdGUuZG9jLCBjb21wdXRlRG9jRGVjbyh0aGlzKSwgdmlld0RlY29yYXRpb25zKHRoaXMpLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIodGhpcywgKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpID0+IHJlYWRET01DaGFuZ2UodGhpcywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCkpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIGluaXRJbnB1dCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cygpO1xuICAgIH1cbiAgICAvKipcbiAgICBIb2xkcyBgdHJ1ZWAgd2hlbiBhXG4gICAgW2NvbXBvc2l0aW9uXShodHRwczovL3czYy5naXRodWIuaW8vdWlldmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50cylcbiAgICBpcyBhY3RpdmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gdGhpcy5pbnB1dC5jb21wb3Npbmc7IH1cbiAgICAvKipcbiAgICBUaGUgdmlldydzIGN1cnJlbnQgW3Byb3BzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcykuXG4gICAgKi9cbiAgICBnZXQgcHJvcHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcm9wcy5zdGF0ZSAhPSB0aGlzLnN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuX3Byb3BzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wc1tuYW1lXSA9IHByZXZbbmFtZV07XG4gICAgICAgICAgICB0aGlzLl9wcm9wcy5zdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BzO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcncyBwcm9wcy4gV2lsbCBpbW1lZGlhdGVseSBjYXVzZSBhbiB1cGRhdGUgdG9cbiAgICB0aGUgRE9NLlxuICAgICovXG4gICAgdXBkYXRlKHByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wcy5oYW5kbGVET01FdmVudHMgIT0gdGhpcy5fcHJvcHMuaGFuZGxlRE9NRXZlbnRzKVxuICAgICAgICAgICAgZW5zdXJlTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBsZXQgcHJldlByb3BzID0gdGhpcy5fcHJvcHM7XG4gICAgICAgIHRoaXMuX3Byb3BzID0gcHJvcHM7XG4gICAgICAgIGlmIChwcm9wcy5wbHVnaW5zKSB7XG4gICAgICAgICAgICBwcm9wcy5wbHVnaW5zLmZvckVhY2goY2hlY2tTdGF0ZUNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGVJbm5lcihwcm9wcy5zdGF0ZSwgcHJldlByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB2aWV3IGJ5IHVwZGF0aW5nIGV4aXN0aW5nIHByb3BzIG9iamVjdCB3aXRoIHRoZSBvYmplY3RcbiAgICBnaXZlbiBhcyBhcmd1bWVudC4gRXF1aXZhbGVudCB0byBgdmlldy51cGRhdGUoT2JqZWN0LmFzc2lnbih7fSxcbiAgICB2aWV3LnByb3BzLCBwcm9wcykpYC5cbiAgICAqL1xuICAgIHNldFByb3BzKHByb3BzKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0ge307XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5fcHJvcHMpXG4gICAgICAgICAgICB1cGRhdGVkW25hbWVdID0gdGhpcy5fcHJvcHNbbmFtZV07XG4gICAgICAgIHVwZGF0ZWQuc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByb3BzKVxuICAgICAgICAgICAgdXBkYXRlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgICAgICB0aGlzLnVwZGF0ZSh1cGRhdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSBlZGl0b3IncyBgc3RhdGVgIHByb3AsIHdpdGhvdXQgdG91Y2hpbmcgYW55IG9mIHRoZVxuICAgIG90aGVyIHByb3BzLlxuICAgICovXG4gICAgdXBkYXRlU3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUlubmVyKHN0YXRlLCB0aGlzLl9wcm9wcyk7XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlSW5uZXIoc3RhdGUsIHByZXZQcm9wcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5zdGF0ZSwgcmVkcmF3ID0gZmFsc2UsIHVwZGF0ZVNlbCA9IGZhbHNlO1xuICAgICAgICAvLyBXaGVuIHN0b3JlZCBtYXJrcyBhcmUgYWRkZWQsIHN0b3AgY29tcG9zaXRpb24sIHNvIHRoYXQgdGhleSBjYW5cbiAgICAgICAgLy8gYmUgZGlzcGxheWVkLlxuICAgICAgICBpZiAoc3RhdGUuc3RvcmVkTWFya3MgJiYgdGhpcy5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgIGNsZWFyQ29tcG9zaXRpb24odGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVTZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgbGV0IHBsdWdpbnNDaGFuZ2VkID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMucGx1Z2lucyAhPSBwcmV2UHJvcHMucGx1Z2lucztcbiAgICAgICAgaWYgKHBsdWdpbnNDaGFuZ2VkIHx8IHRoaXMuX3Byb3BzLnBsdWdpbnMgIT0gcHJldlByb3BzLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMubm9kZVZpZXdzICE9IHByZXZQcm9wcy5ub2RlVmlld3MpIHtcbiAgICAgICAgICAgIGxldCBub2RlVmlld3MgPSBidWlsZE5vZGVWaWV3cyh0aGlzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkTm9kZVZpZXdzKG5vZGVWaWV3cywgdGhpcy5ub2RlVmlld3MpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlVmlld3MgPSBub2RlVmlld3M7XG4gICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGx1Z2luc0NoYW5nZWQgfHwgcHJldlByb3BzLmhhbmRsZURPTUV2ZW50cyAhPSB0aGlzLl9wcm9wcy5oYW5kbGVET01FdmVudHMpIHtcbiAgICAgICAgICAgIGVuc3VyZUxpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIGxldCBpbm5lckRlY28gPSB2aWV3RGVjb3JhdGlvbnModGhpcyksIG91dGVyRGVjbyA9IGNvbXB1dGVEb2NEZWNvKHRoaXMpO1xuICAgICAgICBsZXQgc2Nyb2xsID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykgPyBcInJlc2V0XCJcbiAgICAgICAgICAgIDogc3RhdGUuc2Nyb2xsVG9TZWxlY3Rpb24gPiBwcmV2LnNjcm9sbFRvU2VsZWN0aW9uID8gXCJ0byBzZWxlY3Rpb25cIiA6IFwicHJlc2VydmVcIjtcbiAgICAgICAgbGV0IHVwZGF0ZURvYyA9IHJlZHJhdyB8fCAhdGhpcy5kb2NWaWV3Lm1hdGNoZXNOb2RlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28pO1xuICAgICAgICBpZiAodXBkYXRlRG9jIHx8ICFzdGF0ZS5zZWxlY3Rpb24uZXEocHJldi5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgdXBkYXRlU2VsID0gdHJ1ZTtcbiAgICAgICAgbGV0IG9sZFNjcm9sbFBvcyA9IHNjcm9sbCA9PSBcInByZXNlcnZlXCIgJiYgdXBkYXRlU2VsICYmIHRoaXMuZG9tLnN0eWxlLm92ZXJmbG93QW5jaG9yID09IG51bGwgJiYgc3RvcmVTY3JvbGxQb3ModGhpcyk7XG4gICAgICAgIGlmICh1cGRhdGVTZWwpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgLy8gV29yayBhcm91bmQgYW4gaXNzdWUgaW4gQ2hyb21lLCBJRSwgYW5kIEVkZ2Ugd2hlcmUgY2hhbmdpbmdcbiAgICAgICAgICAgIC8vIHRoZSBET00gYXJvdW5kIGFuIGFjdGl2ZSBzZWxlY3Rpb24gcHV0cyBpdCBpbnRvIGEgYnJva2VuXG4gICAgICAgICAgICAvLyBzdGF0ZSB3aGVyZSB0aGUgdGhpbmcgdGhlIHVzZXIgc2VlcyBkaWZmZXJzIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gcmVwb3J0ZWQgYnkgdGhlIFNlbGVjdGlvbiBvYmplY3QgKCM3MTAsICM5NzMsXG4gICAgICAgICAgICAvLyAjMTAxMSwgIzEwMTMsICMxMDM1KS5cbiAgICAgICAgICAgIGxldCBmb3JjZVNlbFVwZGF0ZSA9IHVwZGF0ZURvYyAmJiAoaWUgfHwgY2hyb21lKSAmJiAhdGhpcy5jb21wb3NpbmcgJiZcbiAgICAgICAgICAgICAgICAhcHJldi5zZWxlY3Rpb24uZW1wdHkgJiYgIXN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiBzZWxlY3Rpb25Db250ZXh0Q2hhbmdlZChwcmV2LnNlbGVjdGlvbiwgc3RhdGUuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVEb2MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSB0aGF0IHRoZSBzZWxlY3Rpb24gcG9pbnRzIGludG8gaXMgd3JpdHRlbiB0byxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgc29tZXRpbWVzIHN0YXJ0cyBtaXNyZXBvcnRpbmcgdGhlIHNlbGVjdGlvbiwgc28gdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRyYWNrcyB0aGF0IGFuZCBmb3JjZXMgYSBzZWxlY3Rpb24gcmVzZXQgd2hlbiBvdXIgdXBkYXRlXG4gICAgICAgICAgICAgICAgLy8gZGlkIHdyaXRlIHRvIHRoZSBub2RlLlxuICAgICAgICAgICAgICAgIGxldCBjaHJvbWVLbHVkZ2UgPSBjaHJvbWUgPyAodGhpcy50cmFja1dyaXRlcyA9IHRoaXMuZG9tU2VsZWN0aW9uUmFuZ2UoKS5mb2N1c05vZGUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocmVkcmF3IHx8ICF0aGlzLmRvY1ZpZXcudXBkYXRlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVPdXRlckRlY28oW10pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcgPSBkb2NWaWV3RGVzYyhzdGF0ZS5kb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHJvbWVLbHVkZ2UgJiYgIXRoaXMudHJhY2tXcml0ZXMpXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlU2VsVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGZvciBhbiBpc3N1ZSB3aGVyZSBhbiB1cGRhdGUgYXJyaXZpbmcgcmlnaHQgYmV0d2VlblxuICAgICAgICAgICAgLy8gYSBET00gc2VsZWN0aW9uIGNoYW5nZSBhbmQgdGhlIFwic2VsZWN0aW9uY2hhbmdlXCIgZXZlbnQgZm9yIGl0XG4gICAgICAgICAgICAvLyBjYW4gY2F1c2UgYSBzcHVyaW91cyBET00gc2VsZWN0aW9uIHVwZGF0ZSwgZGlzcnVwdGluZyBtb3VzZVxuICAgICAgICAgICAgLy8gZHJhZyBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZm9yY2VTZWxVcGRhdGUgfHxcbiAgICAgICAgICAgICAgICAhKHRoaXMuaW5wdXQubW91c2VEb3duICYmIHRoaXMuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5lcSh0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkpICYmXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvckluUmlnaHRQbGFjZSh0aGlzKSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh0aGlzLCBmb3JjZVNlbFVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzeW5jTm9kZVNlbGVjdGlvbih0aGlzLCBzdGF0ZS5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cyhwcmV2KTtcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmRyYWdnaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZSkgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURyYWdnZWROb2RlKHRoaXMuZHJhZ2dpbmcsIHByZXYpO1xuICAgICAgICBpZiAoc2Nyb2xsID09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgdGhpcy5kb20uc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY3JvbGwgPT0gXCJ0byBzZWxlY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFNjcm9sbFBvcykge1xuICAgICAgICAgICAgcmVzZXRTY3JvbGxQb3Mob2xkU2Nyb2xsUG9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjcm9sbFRvU2VsZWN0aW9uKCkge1xuICAgICAgICBsZXQgc3RhcnRET00gPSB0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkuZm9jdXNOb2RlO1xuICAgICAgICBpZiAodGhpcy5zb21lUHJvcChcImhhbmRsZVNjcm9sbFRvU2VsZWN0aW9uXCIsIGYgPT4gZih0aGlzKSkpIDtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5kb2NWaWV3LmRvbUFmdGVyUG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmZyb20pO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHN0YXJ0RE9NKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0aGlzLmNvb3Jkc0F0UG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmhlYWQsIDEpLCBzdGFydERPTSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveVBsdWdpblZpZXdzKCkge1xuICAgICAgICBsZXQgdmlldztcbiAgICAgICAgd2hpbGUgKHZpZXcgPSB0aGlzLnBsdWdpblZpZXdzLnBvcCgpKVxuICAgICAgICAgICAgaWYgKHZpZXcuZGVzdHJveSlcbiAgICAgICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2luVmlld3MocHJldlN0YXRlKSB7XG4gICAgICAgIGlmICghcHJldlN0YXRlIHx8IHByZXZTdGF0ZS5wbHVnaW5zICE9IHRoaXMuc3RhdGUucGx1Z2lucyB8fCB0aGlzLmRpcmVjdFBsdWdpbnMgIT0gdGhpcy5wcmV2RGlyZWN0UGx1Z2lucykge1xuICAgICAgICAgICAgdGhpcy5wcmV2RGlyZWN0UGx1Z2lucyA9IHRoaXMuZGlyZWN0UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVBsdWdpblZpZXdzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGlyZWN0UGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmRpcmVjdFBsdWdpbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zcGVjLnZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luVmlld3MucHVzaChwbHVnaW4uc3BlYy52aWV3KHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5wbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuc3RhdGUucGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMudmlldylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5WaWV3cy5wdXNoKHBsdWdpbi5zcGVjLnZpZXcodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpblZpZXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpblZpZXcgPSB0aGlzLnBsdWdpblZpZXdzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW5WaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luVmlldy51cGRhdGUodGhpcywgcHJldlN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVEcmFnZ2VkTm9kZShkcmFnZ2luZywgcHJldikge1xuICAgICAgICBsZXQgc2VsID0gZHJhZ2dpbmcubm9kZSwgZm91bmQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZG9jLm5vZGVBdChzZWwuZnJvbSkgPT0gc2VsLm5vZGUpIHtcbiAgICAgICAgICAgIGZvdW5kID0gc2VsLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbW92ZWRQb3MgPSBzZWwuZnJvbSArICh0aGlzLnN0YXRlLmRvYy5jb250ZW50LnNpemUgLSBwcmV2LmRvYy5jb250ZW50LnNpemUpO1xuICAgICAgICAgICAgbGV0IG1vdmVkID0gbW92ZWRQb3MgPiAwICYmIHRoaXMuc3RhdGUuZG9jLm5vZGVBdChtb3ZlZFBvcyk7XG4gICAgICAgICAgICBpZiAobW92ZWQgPT0gc2VsLm5vZGUpXG4gICAgICAgICAgICAgICAgZm91bmQgPSBtb3ZlZFBvcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbmV3IERyYWdnaW5nKGRyYWdnaW5nLnNsaWNlLCBkcmFnZ2luZy5tb3ZlLCBmb3VuZCA8IDAgPyB1bmRlZmluZWQgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnN0YXRlLmRvYywgZm91bmQpKTtcbiAgICB9XG4gICAgc29tZVByb3AocHJvcE5hbWUsIGYpIHtcbiAgICAgICAgbGV0IHByb3AgPSB0aGlzLl9wcm9wcyAmJiB0aGlzLl9wcm9wc1twcm9wTmFtZV0sIHZhbHVlO1xuICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RQbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJvcCA9IHRoaXMuZGlyZWN0UGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwbHVnaW5zID0gdGhpcy5zdGF0ZS5wbHVnaW5zO1xuICAgICAgICBpZiAocGx1Z2lucylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwcm9wID0gcGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgIT0gbnVsbCAmJiAodmFsdWUgPSBmID8gZihwcm9wKSA6IHByb3ApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhlIHZpZXcgaGFzIGZvY3VzLlxuICAgICovXG4gICAgaGFzRm9jdXMoKSB7XG4gICAgICAgIC8vIFdvcmsgYXJvdW5kIElFIG5vdCBoYW5kbGluZyBmb2N1cyBjb3JyZWN0bHkgaWYgcmVzaXplIGhhbmRsZXMgYXJlIHNob3duLlxuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBhbiBlbGVtZW50IHdpdGggcmVzaXplIGhhbmRsZXMsIGFjdGl2ZUVsZW1lbnRcbiAgICAgICAgLy8gd2lsbCBiZSB0aGF0IGVsZW1lbnQgaW5zdGVhZCBvZiB0aGlzLmRvbS5cbiAgICAgICAgaWYgKGllKSB7XG4gICAgICAgICAgICAvLyBJZiBhY3RpdmVFbGVtZW50IGlzIHdpdGhpbiB0aGlzLmRvbSwgYW5kIHRoZXJlIGFyZSBubyBvdGhlciBlbGVtZW50c1xuICAgICAgICAgICAgLy8gc2V0dGluZyBgY29udGVudGVkaXRhYmxlYCB0byBmYWxzZSBpbiBiZXR3ZWVuLCB0cmVhdCBpdCBhcyBmb2N1c2VkLlxuICAgICAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChub2RlID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLmRvbS5jb250YWlucyhub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiB0aGlzLmRvbSAhPSBub2RlICYmIHRoaXMuZG9tLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09ICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBGb2N1cyB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSlcbiAgICAgICAgICAgIGZvY3VzUHJldmVudFNjcm9sbCh0aGlzLmRvbSk7XG4gICAgICAgIHNlbGVjdGlvblRvRE9NKHRoaXMpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZG9jdW1lbnQgcm9vdCBpbiB3aGljaCB0aGUgZWRpdG9yIGV4aXN0cy4gVGhpcyB3aWxsXG4gICAgdXN1YWxseSBiZSB0aGUgdG9wLWxldmVsIGBkb2N1bWVudGAsIGJ1dCBtaWdodCBiZSBhIFtzaGFkb3dcbiAgICBET01dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1dlYl9Db21wb25lbnRzL1NoYWRvd19ET00pXG4gICAgcm9vdCBpZiB0aGUgZWRpdG9yIGlzIGluc2lkZSBvbmUuXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuX3Jvb3Q7XG4gICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IHRoaXMuZG9tLnBhcmVudE5vZGU7IHNlYXJjaDsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLm5vZGVUeXBlID09IDkgfHwgKHNlYXJjaC5ub2RlVHlwZSA9PSAxMSAmJiBzZWFyY2guaG9zdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWFyY2guZ2V0U2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNlYXJjaCkuZ2V0U2VsZWN0aW9uID0gKCkgPT4gc2VhcmNoLm93bmVyRG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290ID0gc2VhcmNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZCB8fCBkb2N1bWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiBhbiBleGlzdGluZyBlZGl0b3IgdmlldyBpcyBtb3ZlZCB0byBhIG5ldyBkb2N1bWVudCBvclxuICAgIHNoYWRvdyB0cmVlLCBjYWxsIHRoaXMgdG8gbWFrZSBpdCByZWNvbXB1dGUgaXRzIHJvb3QuXG4gICAgKi9cbiAgICB1cGRhdGVSb290KCkge1xuICAgICAgICB0aGlzLl9yb290ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2l2ZW4gYSBwYWlyIG9mIHZpZXdwb3J0IGNvb3JkaW5hdGVzLCByZXR1cm4gdGhlIGRvY3VtZW50XG4gICAgcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGVtLiBNYXkgcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuXG4gICAgY29vcmRpbmF0ZXMgYXJlbid0IGluc2lkZSBvZiB0aGUgZWRpdG9yLiBXaGVuIGFuIG9iamVjdCBpc1xuICAgIHJldHVybmVkLCBpdHMgYHBvc2AgcHJvcGVydHkgaXMgdGhlIHBvc2l0aW9uIG5lYXJlc3QgdG8gdGhlXG4gICAgY29vcmRpbmF0ZXMsIGFuZCBpdHMgYGluc2lkZWAgcHJvcGVydHkgaG9sZHMgdGhlIHBvc2l0aW9uIG9mIHRoZVxuICAgIGlubmVyIG5vZGUgdGhhdCB0aGUgcG9zaXRpb24gZmFsbHMgaW5zaWRlIG9mLCBvciAtMSBpZiBpdCBpcyBhdFxuICAgIHRoZSB0b3AgbGV2ZWwsIG5vdCBpbiBhbnkgbm9kZS5cbiAgICAqL1xuICAgIHBvc0F0Q29vcmRzKGNvb3Jkcykge1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgYGxlZnRgIGFuZCBgcmlnaHRgIHdpbGwgYmUgdGhlIHNhbWUgbnVtYmVyLCBhcyB0aGlzIHJldHVybnMgYVxuICAgIGZsYXQgY3Vyc29yLWlzaCByZWN0YW5nbGUuIElmIHRoZSBwb3NpdGlvbiBpcyBiZXR3ZWVuIHR3byB0aGluZ3NcbiAgICB0aGF0IGFyZW4ndCBkaXJlY3RseSBhZGphY2VudCwgYHNpZGVgIGRldGVybWluZXMgd2hpY2ggZWxlbWVudFxuICAgIGlzIHVzZWQuIFdoZW4gPCAwLCB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIHBvc2l0aW9uIGlzIHVzZWQsXG4gICAgb3RoZXJ3aXNlIHRoZSBlbGVtZW50IGFmdGVyLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICByZXR1cm4gY29vcmRzQXRQb3ModGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGRvY3VtZW50XG4gICAgcG9zaXRpb24uIFdoZW4gYHNpZGVgIGlzIG5lZ2F0aXZlLCBmaW5kIHRoZSBwb3NpdGlvbiBhcyBjbG9zZSBhc1xuICAgIHBvc3NpYmxlIHRvIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgcG9zaXRpb24uIFdoZW4gcG9zaXRpdmUsXG4gICAgcHJlZmVyIHBvc2l0aW9ucyBjbG9zZSB0byB0aGUgY29udGVudCBhZnRlciB0aGUgcG9zaXRpb24uIFdoZW5cbiAgICB6ZXJvLCBwcmVmZXIgYXMgc2hhbGxvdyBhIHBvc2l0aW9uIGFzIHBvc3NpYmxlLlxuICAgIFxuICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkICoqbm90KiogbXV0YXRlIHRoZSBlZGl0b3IncyBpbnRlcm5hbCBET00sXG4gICAgb25seSBpbnNwZWN0IGl0IChhbmQgZXZlbiB0aGF0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tRnJvbVBvcyhwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IG5vZGUgYWZ0ZXIgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uIE1heSByZXR1cm4gYG51bGxgIHdoZW4gdGhlIHBvc2l0aW9uIGRvZXNuJ3QgcG9pbnRcbiAgICBpbiBmcm9udCBvZiBhIG5vZGUgb3IgaWYgdGhlIG5vZGUgaXMgaW5zaWRlIGFuIG9wYXF1ZSBub2RlIHZpZXcuXG4gICAgXG4gICAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhYmxlIHRvIGNhbGwgdGhpbmdzIGxpa2VcbiAgICBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBvbiB0aGF0IERPTSBub2RlLiBEbyAqKm5vdCoqIG11dGF0ZSB0aGVcbiAgICBlZGl0b3IgRE9NIGRpcmVjdGx5LCBvciBhZGQgc3R5bGluZyB0aGlzIHdheSwgc2luY2UgdGhhdCB3aWxsIGJlXG4gICAgaW1tZWRpYXRlbHkgb3ZlcnJpZGVuIGJ5IHRoZSBlZGl0b3IgYXMgaXQgcmVkcmF3cyB0aGUgbm9kZS5cbiAgICAqL1xuICAgIG5vZGVET00ocG9zKSB7XG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5kb2NWaWV3LmRlc2NBdChwb3MpO1xuICAgICAgICByZXR1cm4gZGVzYyA/IGRlc2Mubm9kZURPTSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBET01cbiAgICBwb3NpdGlvbi4gKFdoZW5ldmVyIHBvc3NpYmxlLCBpdCBpcyBwcmVmZXJhYmxlIHRvIGluc3BlY3QgdGhlXG4gICAgZG9jdW1lbnQgc3RydWN0dXJlIGRpcmVjdGx5LCByYXRoZXIgdGhhbiBwb2tpbmcgYXJvdW5kIGluIHRoZVxuICAgIERPTSwgYnV0IHNvbWV0aW1lc1x1MjAxNGZvciBleGFtcGxlIHdoZW4gaW50ZXJwcmV0aW5nIGFuIGV2ZW50XG4gICAgdGFyZ2V0XHUyMDE0eW91IGRvbid0IGhhdmUgYSBjaG9pY2UuKVxuICAgIFxuICAgIFRoZSBgYmlhc2AgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB3aGljaCBzaWRlIG9mIGEgRE9NXG4gICAgbm9kZSB0byB1c2Ugd2hlbiB0aGUgcG9zaXRpb24gaXMgaW5zaWRlIGEgbGVhZiBub2RlLlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0LCBiaWFzID0gLTEpIHtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCwgYmlhcyk7XG4gICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRE9NIHBvc2l0aW9uIG5vdCBpbnNpZGUgdGhlIGVkaXRvclwiKTtcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBvdXQgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2sgd2hlblxuICAgIG1vdmluZyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gV2hlbiwgZm9yIGV4YW1wbGUsIGdpdmVuIGBcImxlZnRcImAsXG4gICAgaXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBtb3ZpbmcgbGVmdCBmcm9tIHRoZSBjdXJyZW50IGN1cnNvclxuICAgIHBvc2l0aW9uIHdvdWxkIGxlYXZlIHRoYXQgcG9zaXRpb24ncyBwYXJlbnQgdGV4dGJsb2NrLiBXaWxsIGFwcGx5XG4gICAgdG8gdGhlIHZpZXcncyBjdXJyZW50IHN0YXRlIGJ5IGRlZmF1bHQsIGJ1dCBpdCBpcyBwb3NzaWJsZSB0b1xuICAgIHBhc3MgYSBkaWZmZXJlbnQgc3RhdGUuXG4gICAgKi9cbiAgICBlbmRPZlRleHRibG9jayhkaXIsIHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBlbmRPZlRleHRibG9jayh0aGlzLCBzdGF0ZSB8fCB0aGlzLnN0YXRlLCBkaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSdW4gdGhlIGVkaXRvcidzIHBhc3RlIGxvZ2ljIHdpdGggdGhlIGdpdmVuIEhUTUwgc3RyaW5nLiBUaGVcbiAgICBgZXZlbnRgLCBpZiBnaXZlbiwgd2lsbCBiZSBwYXNzZWQgdG8gdGhlXG4gICAgW2BoYW5kbGVQYXN0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLmhhbmRsZVBhc3RlKSBob29rLlxuICAgICovXG4gICAgcGFzdGVIVE1MKGh0bWwsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkb1Bhc3RlKHRoaXMsIFwiXCIsIGh0bWwsIGZhbHNlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biB0aGUgZWRpdG9yJ3MgcGFzdGUgbG9naWMgd2l0aCB0aGUgZ2l2ZW4gcGxhaW4tdGV4dCBpbnB1dC5cbiAgICAqL1xuICAgIHBhc3RlVGV4dCh0ZXh0LCBldmVudCkge1xuICAgICAgICByZXR1cm4gZG9QYXN0ZSh0aGlzLCB0ZXh0LCBudWxsLCB0cnVlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZXMgdGhlIGVkaXRvciBmcm9tIHRoZSBET00gYW5kIGRlc3Ryb3lzIGFsbCBbbm9kZVxuICAgIHZpZXdzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5Ob2RlVmlldykuXG4gICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9jVmlldylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVzdHJveUlucHV0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lQbHVnaW5WaWV3cygpO1xuICAgICAgICBpZiAodGhpcy5tb3VudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlKHRoaXMuc3RhdGUuZG9jLCBbXSwgdmlld0RlY29yYXRpb25zKHRoaXMpLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmRvbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvY1ZpZXcgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGlzIGlzIHRydWUgd2hlbiB0aGUgdmlldyBoYXMgYmVlblxuICAgIFtkZXN0cm95ZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGVzdHJveSkgKGFuZCB0aHVzIHNob3VsZCBub3QgYmVcbiAgICB1c2VkIGFueW1vcmUpLlxuICAgICovXG4gICAgZ2V0IGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3ID09IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzZWQgZm9yIHRlc3RpbmcuXG4gICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGlzcGF0Y2ggYSB0cmFuc2FjdGlvbi4gV2lsbCBjYWxsXG4gICAgW2BkaXNwYXRjaFRyYW5zYWN0aW9uYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0RWRpdG9yUHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbilcbiAgICB3aGVuIGdpdmVuLCBhbmQgb3RoZXJ3aXNlIGRlZmF1bHRzIHRvIGFwcGx5aW5nIHRoZSB0cmFuc2FjdGlvbiB0b1xuICAgIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBjYWxsaW5nXG4gICAgW2B1cGRhdGVTdGF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudXBkYXRlU3RhdGUpIHdpdGggdGhlIHJlc3VsdC5cbiAgICBUaGlzIG1ldGhvZCBpcyBib3VuZCB0byB0aGUgdmlldyBpbnN0YW5jZSwgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBlYXNpbHkgcGFzc2VkIGFyb3VuZC5cbiAgICAqL1xuICAgIGRpc3BhdGNoKHRyKSB7XG4gICAgICAgIGxldCBkaXNwYXRjaFRyYW5zYWN0aW9uID0gdGhpcy5fcHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbjtcbiAgICAgICAgaWYgKGRpc3BhdGNoVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICBkaXNwYXRjaFRyYW5zYWN0aW9uLmNhbGwodGhpcywgdHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHRoaXMuc3RhdGUuYXBwbHkodHIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21TZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgcmV0dXJuIHNhZmFyaSAmJiB0aGlzLnJvb3Qubm9kZVR5cGUgPT09IDExICYmIGRlZXBBY3RpdmVFbGVtZW50KHRoaXMuZG9tLm93bmVyRG9jdW1lbnQpID09IHRoaXMuZG9tXG4gICAgICAgICAgICA/IHNhZmFyaVNoYWRvd1NlbGVjdGlvblJhbmdlKHRoaXMpIDogdGhpcy5kb21TZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QuZ2V0U2VsZWN0aW9uKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZURvY0RlY28odmlldykge1xuICAgIGxldCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgYXR0cnMuY2xhc3MgPSBcIlByb3NlTWlycm9yXCI7XG4gICAgYXR0cnMuY29udGVudGVkaXRhYmxlID0gU3RyaW5nKHZpZXcuZWRpdGFibGUpO1xuICAgIHZpZXcuc29tZVByb3AoXCJhdHRyaWJ1dGVzXCIsIHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHZpZXcuc3RhdGUpO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICBmb3IgKGxldCBhdHRyIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIgPT0gXCJjbGFzc1wiKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5jbGFzcyArPSBcIiBcIiArIHZhbHVlW2F0dHJdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0dHIgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5zdHlsZSA9IChhdHRycy5zdHlsZSA/IGF0dHJzLnN0eWxlICsgXCI7XCIgOiBcIlwiKSArIHZhbHVlW2F0dHJdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhdHRyc1thdHRyXSAmJiBhdHRyICE9IFwiY29udGVudGVkaXRhYmxlXCIgJiYgYXR0ciAhPSBcIm5vZGVOYW1lXCIpXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzW2F0dHJdID0gU3RyaW5nKHZhbHVlW2F0dHJdKTtcbiAgICAgICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWF0dHJzLnRyYW5zbGF0ZSlcbiAgICAgICAgYXR0cnMudHJhbnNsYXRlID0gXCJub1wiO1xuICAgIHJldHVybiBbRGVjb3JhdGlvbi5ub2RlKDAsIHZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSwgYXR0cnMpXTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUN1cnNvcldyYXBwZXIodmlldykge1xuICAgIGlmICh2aWV3Lm1hcmtDdXJzb3IpIHtcbiAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgIGRvbS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLXNlcGFyYXRvclwiO1xuICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwibWFyay1wbGFjZWhvbGRlclwiLCBcInRydWVcIik7XG4gICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoXCJhbHRcIiwgXCJcIik7XG4gICAgICAgIHZpZXcuY3Vyc29yV3JhcHBlciA9IHsgZG9tLCBkZWNvOiBEZWNvcmF0aW9uLndpZGdldCh2aWV3LnN0YXRlLnNlbGVjdGlvbi5oZWFkLCBkb20sIHsgcmF3OiB0cnVlLCBtYXJrczogdmlldy5tYXJrQ3Vyc29yIH0pIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2aWV3LmN1cnNvcldyYXBwZXIgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEVkaXRhYmxlKHZpZXcpIHtcbiAgICByZXR1cm4gIXZpZXcuc29tZVByb3AoXCJlZGl0YWJsZVwiLCB2YWx1ZSA9PiB2YWx1ZSh2aWV3LnN0YXRlKSA9PT0gZmFsc2UpO1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uQ29udGV4dENoYW5nZWQoc2VsMSwgc2VsMikge1xuICAgIGxldCBkZXB0aCA9IE1hdGgubWluKHNlbDEuJGFuY2hvci5zaGFyZWREZXB0aChzZWwxLmhlYWQpLCBzZWwyLiRhbmNob3Iuc2hhcmVkRGVwdGgoc2VsMi5oZWFkKSk7XG4gICAgcmV0dXJuIHNlbDEuJGFuY2hvci5zdGFydChkZXB0aCkgIT0gc2VsMi4kYW5jaG9yLnN0YXJ0KGRlcHRoKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkTm9kZVZpZXdzKHZpZXcpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmdW5jdGlvbiBhZGQob2JqKSB7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gb2JqKVxuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBwcm9wKSlcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICAgIHZpZXcuc29tZVByb3AoXCJub2RlVmlld3NcIiwgYWRkKTtcbiAgICB2aWV3LnNvbWVQcm9wKFwibWFya1ZpZXdzXCIsIGFkZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNoYW5nZWROb2RlVmlld3MoYSwgYikge1xuICAgIGxldCBuQSA9IDAsIG5CID0gMDtcbiAgICBmb3IgKGxldCBwcm9wIGluIGEpIHtcbiAgICAgICAgaWYgKGFbcHJvcF0gIT0gYltwcm9wXSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBuQSsrO1xuICAgIH1cbiAgICBmb3IgKGxldCBfIGluIGIpXG4gICAgICAgIG5CKys7XG4gICAgcmV0dXJuIG5BICE9IG5CO1xufVxuZnVuY3Rpb24gY2hlY2tTdGF0ZUNvbXBvbmVudChwbHVnaW4pIHtcbiAgICBpZiAocGx1Z2luLnNwZWMuc3RhdGUgfHwgcGx1Z2luLnNwZWMuZmlsdGVyVHJhbnNhY3Rpb24gfHwgcGx1Z2luLnNwZWMuYXBwZW5kVHJhbnNhY3Rpb24pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUGx1Z2lucyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIHZpZXcgbXVzdCBub3QgaGF2ZSBhIHN0YXRlIGNvbXBvbmVudFwiKTtcbn1cblxuZXhwb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCwgRWRpdG9yVmlldywgX19lbmRDb21wb3NpdGlvbiwgX19wYXJzZUZyb21DbGlwYm9hcmQsIF9fc2VyaWFsaXplRm9yQ2xpcGJvYXJkIH07XG4iLCAiZXhwb3J0IHZhciBiYXNlID0ge1xuICA4OiBcIkJhY2tzcGFjZVwiLFxuICA5OiBcIlRhYlwiLFxuICAxMDogXCJFbnRlclwiLFxuICAxMjogXCJOdW1Mb2NrXCIsXG4gIDEzOiBcIkVudGVyXCIsXG4gIDE2OiBcIlNoaWZ0XCIsXG4gIDE3OiBcIkNvbnRyb2xcIixcbiAgMTg6IFwiQWx0XCIsXG4gIDIwOiBcIkNhcHNMb2NrXCIsXG4gIDI3OiBcIkVzY2FwZVwiLFxuICAzMjogXCIgXCIsXG4gIDMzOiBcIlBhZ2VVcFwiLFxuICAzNDogXCJQYWdlRG93blwiLFxuICAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLFxuICAzNzogXCJBcnJvd0xlZnRcIixcbiAgMzg6IFwiQXJyb3dVcFwiLFxuICAzOTogXCJBcnJvd1JpZ2h0XCIsXG4gIDQwOiBcIkFycm93RG93blwiLFxuICA0NDogXCJQcmludFNjcmVlblwiLFxuICA0NTogXCJJbnNlcnRcIixcbiAgNDY6IFwiRGVsZXRlXCIsXG4gIDU5OiBcIjtcIixcbiAgNjE6IFwiPVwiLFxuICA5MTogXCJNZXRhXCIsXG4gIDkyOiBcIk1ldGFcIixcbiAgMTA2OiBcIipcIixcbiAgMTA3OiBcIitcIixcbiAgMTA4OiBcIixcIixcbiAgMTA5OiBcIi1cIixcbiAgMTEwOiBcIi5cIixcbiAgMTExOiBcIi9cIixcbiAgMTQ0OiBcIk51bUxvY2tcIixcbiAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgMTYwOiBcIlNoaWZ0XCIsXG4gIDE2MTogXCJTaGlmdFwiLFxuICAxNjI6IFwiQ29udHJvbFwiLFxuICAxNjM6IFwiQ29udHJvbFwiLFxuICAxNjQ6IFwiQWx0XCIsXG4gIDE2NTogXCJBbHRcIixcbiAgMTczOiBcIi1cIixcbiAgMTg2OiBcIjtcIixcbiAgMTg3OiBcIj1cIixcbiAgMTg4OiBcIixcIixcbiAgMTg5OiBcIi1cIixcbiAgMTkwOiBcIi5cIixcbiAgMTkxOiBcIi9cIixcbiAgMTkyOiBcImBcIixcbiAgMjE5OiBcIltcIixcbiAgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIixcbiAgMjIyOiBcIidcIlxufVxuXG5leHBvcnQgdmFyIHNoaWZ0ID0ge1xuICA0ODogXCIpXCIsXG4gIDQ5OiBcIiFcIixcbiAgNTA6IFwiQFwiLFxuICA1MTogXCIjXCIsXG4gIDUyOiBcIiRcIixcbiAgNTM6IFwiJVwiLFxuICA1NDogXCJeXCIsXG4gIDU1OiBcIiZcIixcbiAgNTY6IFwiKlwiLFxuICA1NzogXCIoXCIsXG4gIDU5OiBcIjpcIixcbiAgNjE6IFwiK1wiLFxuICAxNzM6IFwiX1wiLFxuICAxODY6IFwiOlwiLFxuICAxODc6IFwiK1wiLFxuICAxODg6IFwiPFwiLFxuICAxODk6IFwiX1wiLFxuICAxOTA6IFwiPlwiLFxuICAxOTE6IFwiP1wiLFxuICAxOTI6IFwiflwiLFxuICAyMTk6IFwie1wiLFxuICAyMjA6IFwifFwiLFxuICAyMjE6IFwifVwiLFxuICAyMjI6IFwiXFxcIlwiXG59XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG52YXIgaWUgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgXFxkfFRyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbi8vIEZpbGwgaW4gdGhlIGRpZ2l0IGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgYmFzZVs0OCArIGldID0gYmFzZVs5NiArIGldID0gU3RyaW5nKGkpXG5cbi8vIFRoZSBmdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAyNDsgaSsrKSBiYXNlW2kgKyAxMTFdID0gXCJGXCIgKyBpXG5cbi8vIEFuZCB0aGUgYWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBiYXNlW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpICsgMzIpXG4gIHNoaWZ0W2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxufVxuXG4vLyBGb3IgZWFjaCBjb2RlIHRoYXQgZG9lc24ndCBoYXZlIGEgc2hpZnQtZXF1aXZhbGVudCwgY29weSB0aGUgYmFzZSBuYW1lXG5mb3IgKHZhciBjb2RlIGluIGJhc2UpIGlmICghc2hpZnQuaGFzT3duUHJvcGVydHkoY29kZSkpIHNoaWZ0W2NvZGVdID0gYmFzZVtjb2RlXVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5TmFtZShldmVudCkge1xuICAvLyBPbiBtYWNPUywga2V5cyBoZWxkIHdpdGggU2hpZnQgYW5kIENtZCBkb24ndCByZWZsZWN0IHRoZSBlZmZlY3Qgb2YgU2hpZnQgaW4gYC5rZXlgLlxuICAvLyBPbiBJRSwgc2hpZnQgZWZmZWN0IGlzIG5ldmVyIGluY2x1ZGVkIGluIGAua2V5YC5cbiAgdmFyIGlnbm9yZUtleSA9IG1hYyAmJiBldmVudC5tZXRhS2V5ICYmIGV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgfHxcbiAgICAgIGllICYmIGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSAmJiBldmVudC5rZXkubGVuZ3RoID09IDEgfHxcbiAgICAgIGV2ZW50LmtleSA9PSBcIlVuaWRlbnRpZmllZFwiXG4gIHZhciBuYW1lID0gKCFpZ25vcmVLZXkgJiYgZXZlbnQua2V5KSB8fFxuICAgIChldmVudC5zaGlmdEtleSA/IHNoaWZ0IDogYmFzZSlbZXZlbnQua2V5Q29kZV0gfHxcbiAgICBldmVudC5rZXkgfHwgXCJVbmlkZW50aWZpZWRcIlxuICAvLyBFZGdlIHNvbWV0aW1lcyBwcm9kdWNlcyB3cm9uZyBuYW1lcyAoSXNzdWUgIzMpXG4gIGlmIChuYW1lID09IFwiRXNjXCIpIG5hbWUgPSBcIkVzY2FwZVwiXG4gIGlmIChuYW1lID09IFwiRGVsXCIpIG5hbWUgPSBcIkRlbGV0ZVwiXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzg4NjA1NzEvXG4gIGlmIChuYW1lID09IFwiTGVmdFwiKSBuYW1lID0gXCJBcnJvd0xlZnRcIlxuICBpZiAobmFtZSA9PSBcIlVwXCIpIG5hbWUgPSBcIkFycm93VXBcIlxuICBpZiAobmFtZSA9PSBcIlJpZ2h0XCIpIG5hbWUgPSBcIkFycm93UmlnaHRcIlxuICBpZiAobmFtZSA9PSBcIkRvd25cIikgbmFtZSA9IFwiQXJyb3dEb3duXCJcbiAgcmV0dXJuIG5hbWVcbn1cbiIsICJpbXBvcnQgeyBrZXlOYW1lLCBiYXNlIH0gZnJvbSAndzNjLWtleW5hbWUnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG5jb25zdCBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyAvTWFjfGlQKGhvbmV8W29hXWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgOiBmYWxzZTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSkge1xuICAgIGxldCBwYXJ0cyA9IG5hbWUuc3BsaXQoLy0oPyEkKS8pLCByZXN1bHQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICBpZiAocmVzdWx0ID09IFwiU3BhY2VcIilcbiAgICAgICAgcmVzdWx0ID0gXCIgXCI7XG4gICAgbGV0IGFsdCwgY3RybCwgc2hpZnQsIG1ldGE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKG1hYylcbiAgICAgICAgICAgICAgICBtZXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbW9kaWZpZXIgbmFtZTogXCIgKyBtb2QpO1xuICAgIH1cbiAgICBpZiAoYWx0KVxuICAgICAgICByZXN1bHQgPSBcIkFsdC1cIiArIHJlc3VsdDtcbiAgICBpZiAoY3RybClcbiAgICAgICAgcmVzdWx0ID0gXCJDdHJsLVwiICsgcmVzdWx0O1xuICAgIGlmIChtZXRhKVxuICAgICAgICByZXN1bHQgPSBcIk1ldGEtXCIgKyByZXN1bHQ7XG4gICAgaWYgKHNoaWZ0KVxuICAgICAgICByZXN1bHQgPSBcIlNoaWZ0LVwiICsgcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemUobWFwKSB7XG4gICAgbGV0IGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gbWFwKVxuICAgICAgICBjb3B5W25vcm1hbGl6ZUtleU5hbWUocHJvcCldID0gbWFwW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCA9IHRydWUpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG4vKipcbkNyZWF0ZSBhIGtleW1hcCBwbHVnaW4gZm9yIHRoZSBnaXZlbiBzZXQgb2YgYmluZGluZ3MuXG5cbkJpbmRpbmdzIHNob3VsZCBtYXAga2V5IG5hbWVzIHRvIFtjb21tYW5kXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMpLXN0eWxlXG5mdW5jdGlvbnMsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggYChFZGl0b3JTdGF0ZSwgZGlzcGF0Y2gsXG5FZGl0b3JWaWV3KWAgYXJndW1lbnRzLCBhbmQgc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhleSd2ZSBoYW5kbGVkXG50aGUga2V5LiBOb3RlIHRoYXQgdGhlIHZpZXcgYXJndW1lbnQgaXNuJ3QgcGFydCBvZiB0aGUgY29tbWFuZFxucHJvdG9jb2wsIGJ1dCBjYW4gYmUgdXNlZCBhcyBhbiBlc2NhcGUgaGF0Y2ggaWYgYSBiaW5kaW5nIG5lZWRzIHRvXG5kaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBVSS5cblxuS2V5IG5hbWVzIG1heSBiZSBzdHJpbmdzIGxpa2UgYFwiU2hpZnQtQ3RybC1FbnRlclwiYFx1MjAxNGEga2V5XG5pZGVudGlmaWVyIHByZWZpeGVkIHdpdGggemVybyBvciBtb3JlIG1vZGlmaWVycy4gS2V5IGlkZW50aWZpZXJzXG5hcmUgYmFzZWQgb24gdGhlIHN0cmluZ3MgdGhhdCBjYW4gYXBwZWFyIGluXG5bYEtleUV2ZW50LmtleWBdKGh0dHBzOmRldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkpLlxuVXNlIGxvd2VyY2FzZSBsZXR0ZXJzIHRvIHJlZmVyIHRvIGxldHRlciBrZXlzIChvciB1cHBlcmNhc2UgbGV0dGVyc1xuaWYgeW91IHdhbnQgc2hpZnQgdG8gYmUgaGVsZCkuIFlvdSBtYXkgdXNlIGBcIlNwYWNlXCJgIGFzIGFuIGFsaWFzXG5mb3IgdGhlIGBcIiBcImAgbmFtZS5cblxuTW9kaWZpZXJzIGNhbiBiZSBnaXZlbiBpbiBhbnkgb3JkZXIuIGBTaGlmdC1gIChvciBgcy1gKSwgYEFsdC1gIChvclxuYGEtYCksIGBDdHJsLWAgKG9yIGBjLWAgb3IgYENvbnRyb2wtYCkgYW5kIGBDbWQtYCAob3IgYG0tYCBvclxuYE1ldGEtYCkgYXJlIHJlY29nbml6ZWQuIEZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgaG9sZGluZ1xuc2hpZnQsIHRoZSBgU2hpZnQtYCBwcmVmaXggaXMgaW1wbGllZCwgYW5kIHNob3VsZCBub3QgYmUgYWRkZWRcbmV4cGxpY2l0bHkuXG5cbllvdSBjYW4gdXNlIGBNb2QtYCBhcyBhIHNob3J0aGFuZCBmb3IgYENtZC1gIG9uIE1hYyBhbmQgYEN0cmwtYCBvblxub3RoZXIgcGxhdGZvcm1zLlxuXG5Zb3UgY2FuIGFkZCBtdWx0aXBsZSBrZXltYXAgcGx1Z2lucyB0byBhbiBlZGl0b3IuIFRoZSBvcmRlciBpblxud2hpY2ggdGhleSBhcHBlYXIgZGV0ZXJtaW5lcyB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBlYXJseSBpblxudGhlIGFycmF5IGdldCB0byBkaXNwYXRjaCBmaXJzdCkuXG4qL1xuZnVuY3Rpb24ga2V5bWFwKGJpbmRpbmdzKSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oeyBwcm9wczogeyBoYW5kbGVLZXlEb3duOiBrZXlkb3duSGFuZGxlcihiaW5kaW5ncykgfSB9KTtcbn1cbi8qKlxuR2l2ZW4gYSBzZXQgb2YgYmluZGluZ3MgKHVzaW5nIHRoZSBzYW1lIGZvcm1hdCBhc1xuW2BrZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8ja2V5bWFwLmtleW1hcCkpLCByZXR1cm4gYSBba2V5ZG93blxuaGFuZGxlcl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuaGFuZGxlS2V5RG93bikgdGhhdCBoYW5kbGVzIHRoZW0uXG4qL1xuZnVuY3Rpb24ga2V5ZG93bkhhbmRsZXIoYmluZGluZ3MpIHtcbiAgICBsZXQgbWFwID0gbm9ybWFsaXplKGJpbmRpbmdzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZpZXcsIGV2ZW50KSB7XG4gICAgICAgIGxldCBuYW1lID0ga2V5TmFtZShldmVudCksIGJhc2VOYW1lLCBkaXJlY3QgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50KV07XG4gICAgICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0KHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gsIHZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIEEgY2hhcmFjdGVyIGtleVxuICAgICAgICBpZiAobmFtZS5sZW5ndGggPT0gMSAmJiBuYW1lICE9IFwiIFwiKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBuYW1lIHdhcyBhbHJlYWR5IG1vZGlmaWVkIGJ5IHNoaWZ0LCB0cnkgbG9va2luZ1xuICAgICAgICAgICAgICAgIC8vIGl0IHVwIHdpdGhvdXQgaXRzIHNoaWZ0IG1vZGlmaWVyXG4gICAgICAgICAgICAgICAgbGV0IG5vU2hpZnQgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBmYWxzZSldO1xuICAgICAgICAgICAgICAgIGlmIChub1NoaWZ0ICYmIG5vU2hpZnQodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBuYW1lLmNoYXJDb2RlQXQoMCkgPiAxMjcpICYmXG4gICAgICAgICAgICAgICAgKGJhc2VOYW1lID0gYmFzZVtldmVudC5rZXlDb2RlXSkgJiYgYmFzZU5hbWUgIT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFRyeSBmYWxsaW5nIGJhY2sgdG8gdGhlIGtleUNvZGUgd2hlbiB0aGVyZSdzIGEgbW9kaWZpZXJcbiAgICAgICAgICAgICAgICAvLyBhY3RpdmUgb3IgdGhlIGNoYXJhY3RlciBwcm9kdWNlZCBpc24ndCBBU0NJSSwgYW5kIG91ciB0YWJsZVxuICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VzIGEgZGlmZmVyZW50IG5hbWUgZnJvbSB0aGUgdGhlIGtleUNvZGUuIFNlZSAjNjY4LFxuICAgICAgICAgICAgICAgIC8vICMxMDYwXG4gICAgICAgICAgICAgICAgbGV0IGZyb21Db2RlID0gbWFwW21vZGlmaWVycyhiYXNlTmFtZSwgZXZlbnQpXTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUNvZGUgJiYgZnJvbUNvZGUodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxuXG5leHBvcnQgeyBrZXlkb3duSGFuZGxlciwga2V5bWFwIH07XG4iLCAiaW1wb3J0IHsgbGlmdFRhcmdldCwgcmVwbGFjZVN0ZXAsIFJlcGxhY2VTdGVwLCBjYW5Kb2luLCBqb2luUG9pbnQsIGNhblNwbGl0LCBSZXBsYWNlQXJvdW5kU3RlcCwgZmluZFdyYXBwaW5nIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcbmltcG9ydCB7IFNsaWNlLCBGcmFnbWVudCB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IE5vZGVTZWxlY3Rpb24sIFNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiwgQWxsU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG4vKipcbkRlbGV0ZSB0aGUgc2VsZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4qL1xuY29uc3QgZGVsZXRlU2VsZWN0aW9uID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldykge1xuICAgIGxldCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRjdXJzb3IgfHwgKHZpZXcgPyAhdmlldy5lbmRPZlRleHRibG9jayhcImJhY2t3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0ID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiAkY3Vyc29yO1xufVxuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2ssIHRyeSB0b1xucmVkdWNlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoYXQgYmxvY2sgYW5kIHRoZSBvbmUgYmVmb3JlIGl0XHUyMDE0aWZcbnRoZXJlJ3MgYSBibG9jayBkaXJlY3RseSBiZWZvcmUgaXQgdGhhdCBjYW4gYmUgam9pbmVkLCBqb2luIHRoZW0uXG5JZiBub3QsIHRyeSB0byBtb3ZlIHRoZSBzZWxlY3RlZCBibG9jayBjbG9zZXIgdG8gdGhlIG5leHQgb25lIGluXG50aGUgZG9jdW1lbnQgc3RydWN0dXJlIGJ5IGxpZnRpbmcgaXQgb3V0IG9mIGl0cyBwYXJlbnQgb3IgbW92aW5nIGl0XG5pbnRvIGEgcGFyZW50IG9mIHRoZSBwcmV2aW91cyBibG9jay4gV2lsbCB1c2UgdGhlIHZpZXcgZm9yIGFjY3VyYXRlXG4oYmlkaS1hd2FyZSkgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrU3RhcnQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEJlZm9yZSgkY3Vyc29yKTtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBub2RlIGJlZm9yZSB0aGlzLCB0cnkgdG8gbGlmdFxuICAgIGlmICghJGN1dCkge1xuICAgICAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIubGlmdChyYW5nZSwgdGFyZ2V0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBiZWZvcmUgPSAkY3V0Lm5vZGVCZWZvcmU7XG4gICAgLy8gQXBwbHkgdGhlIGpvaW5pbmcgYWxnb3JpdGhtXG4gICAgaWYgKCFiZWZvcmUudHlwZS5zcGVjLmlzb2xhdGluZyAmJiBkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGJlbG93IGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBhYm92ZSBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBiZWxvdyBhbmQgc2VsZWN0IHRoZSBvbmUgYWJvdmUuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChiZWZvcmUsIFwiZW5kXCIpIHx8IE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKGJlZm9yZSkpKSB7XG4gICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZSgpLCAkY3Vyc29yLmFmdGVyKCksIFNsaWNlLmVtcHR5KTtcbiAgICAgICAgaWYgKGRlbFN0ZXAgJiYgZGVsU3RlcC5zbGljZS5zaXplIDwgZGVsU3RlcC50byAtIGRlbFN0ZXAuZnJvbSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChkZWxTdGVwKTtcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24odGV4dGJsb2NrQXQoYmVmb3JlLCBcImVuZFwiKSA/IFNlbGVjdGlvbi5maW5kRnJvbSh0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcCgkY3V0LnBvcywgLTEpKSwgLTEpXG4gICAgICAgICAgICAgICAgICAgIDogTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCAkY3V0LnBvcyAtIGJlZm9yZS5ub2RlU2l6ZSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5vZGUgYmVmb3JlIGlzIGFuIGF0b20sIGRlbGV0ZSBpdFxuICAgIGlmIChiZWZvcmUuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkY3V0LnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5BIG1vcmUgbGltaXRlZCBmb3JtIG9mIFtgam9pbkJhY2t3YXJkYF0oJGNvbW1hbmRzLmpvaW5CYWNrd2FyZClcbnRoYXQgb25seSB0cmllcyB0byBqb2luIHRoZSBjdXJyZW50IHRleHRibG9jayB0byB0aGUgb25lIGJlZm9yZVxuaXQsIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLlxuKi9cbmNvbnN0IGpvaW5UZXh0YmxvY2tCYWNrd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldyk7XG4gICAgaWYgKCEkY3Vyc29yKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRjdXQgPSBmaW5kQ3V0QmVmb3JlKCRjdXJzb3IpO1xuICAgIHJldHVybiAkY3V0ID8gam9pblRleHRibG9ja3NBcm91bmQoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSA6IGZhbHNlO1xufTtcbi8qKlxuQSBtb3JlIGxpbWl0ZWQgZm9ybSBvZiBbYGpvaW5Gb3J3YXJkYF0oJGNvbW1hbmRzLmpvaW5Gb3J3YXJkKVxudGhhdCBvbmx5IHRyaWVzIHRvIGpvaW4gdGhlIGN1cnJlbnQgdGV4dGJsb2NrIHRvIHRoZSBvbmUgYWZ0ZXJcbml0LCBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2suXG4qL1xuY29uc3Qgam9pblRleHRibG9ja0ZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrRW5kKHN0YXRlLCB2aWV3KTtcbiAgICBpZiAoISRjdXJzb3IpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJGN1dCA9IGZpbmRDdXRBZnRlcigkY3Vyc29yKTtcbiAgICByZXR1cm4gJGN1dCA/IGpvaW5UZXh0YmxvY2tzQXJvdW5kKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiBqb2luVGV4dGJsb2Nrc0Fyb3VuZChzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJGN1dC5ub2RlQmVmb3JlLCBiZWZvcmVUZXh0ID0gYmVmb3JlLCBiZWZvcmVQb3MgPSAkY3V0LnBvcyAtIDE7XG4gICAgZm9yICg7ICFiZWZvcmVUZXh0LmlzVGV4dGJsb2NrOyBiZWZvcmVQb3MtLSkge1xuICAgICAgICBpZiAoYmVmb3JlVGV4dC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSBiZWZvcmVUZXh0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFjaGlsZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYmVmb3JlVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyUG9zID0gJGN1dC5wb3MgKyAxO1xuICAgIGZvciAoOyAhYWZ0ZXJUZXh0LmlzVGV4dGJsb2NrOyBhZnRlclBvcysrKSB7XG4gICAgICAgIGlmIChhZnRlclRleHQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGNoaWxkID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGFmdGVyVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgc3RlcCA9IHJlcGxhY2VTdGVwKHN0YXRlLmRvYywgYmVmb3JlUG9zLCBhZnRlclBvcywgU2xpY2UuZW1wdHkpO1xuICAgIGlmICghc3RlcCB8fCBzdGVwLmZyb20gIT0gYmVmb3JlUG9zIHx8XG4gICAgICAgIHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCAmJiBzdGVwLnNsaWNlLnNpemUgPj0gYWZ0ZXJQb3MgLSBiZWZvcmVQb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChzdGVwKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgYmVmb3JlUG9zKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRleHRibG9ja0F0KG5vZGUsIHNpZGUsIG9ubHkgPSBmYWxzZSkge1xuICAgIGZvciAobGV0IHNjYW4gPSBub2RlOyBzY2FuOyBzY2FuID0gKHNpZGUgPT0gXCJzdGFydFwiID8gc2Nhbi5maXJzdENoaWxkIDogc2Nhbi5sYXN0Q2hpbGQpKSB7XG4gICAgICAgIGlmIChzY2FuLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvbmx5ICYmIHNjYW4uY2hpbGRDb3VudCAhPSAxKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLCBzZWxlY3RcbnRoZSBub2RlIGJlZm9yZSB0aGF0IHRleHRibG9jaywgaWYgcG9zc2libGUuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbmJvdW5kIHRvIGtleXMgbGlrZSBiYWNrc3BhY2UsIGFmdGVyXG5bYGpvaW5CYWNrd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luQmFja3dhcmQpIG9yIG90aGVyIGRlbGV0aW5nXG5jb21tYW5kcywgYXMgYSBmYWxsLWJhY2sgYmVoYXZpb3Igd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3QgYWxsb3dcbmRlbGV0aW9uIGF0IHRoZSBzZWxlY3RlZCBwb2ludC5cbiovXG5jb25zdCBzZWxlY3ROb2RlQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiYmFja3dhcmRcIiwgc3RhdGUpIDogJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgJGN1dCA9IGZpbmRDdXRCZWZvcmUoJGhlYWQpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9ICRjdXQgJiYgJGN1dC5ub2RlQmVmb3JlO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zIC0gbm9kZS5ub2RlU2l6ZSkpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGZpbmRDdXRCZWZvcmUoJHBvcykge1xuICAgIGlmICghJHBvcy5wYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKCRwb3MuaW5kZXgoaSkgPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmRvYy5yZXNvbHZlKCRwb3MuYmVmb3JlKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGkpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpIHtcbiAgICBsZXQgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkY3Vyc29yIHx8ICh2aWV3ID8gIXZpZXcuZW5kT2ZUZXh0YmxvY2soXCJmb3J3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0IDwgJGN1cnNvci5wYXJlbnQuY29udGVudC5zaXplKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuICRjdXJzb3I7XG59XG4vKipcbklmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYW5kIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiBhXG50ZXh0YmxvY2ssIHRyeSB0byByZWR1Y2Ugb3IgcmVtb3ZlIHRoZSBib3VuZGFyeSBiZXR3ZWVuIHRoYXQgYmxvY2tcbmFuZCB0aGUgb25lIGFmdGVyIGl0LCBlaXRoZXIgYnkgam9pbmluZyB0aGVtIG9yIGJ5IG1vdmluZyB0aGUgb3RoZXJcbmJsb2NrIGNsb3NlciB0byB0aGlzIG9uZSBpbiB0aGUgdHJlZSBzdHJ1Y3R1cmUuIFdpbGwgdXNlIHRoZSB2aWV3XG5mb3IgYWNjdXJhdGUgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luRm9yd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEFmdGVyKCRjdXJzb3IpO1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYWZ0ZXIgdGhpcywgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCEkY3V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFmdGVyID0gJGN1dC5ub2RlQWZ0ZXI7XG4gICAgLy8gVHJ5IHRoZSBqb2luaW5nIGFsZ29yaXRobVxuICAgIGlmIChkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGFib3ZlIGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBiZWxvdyBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBhYm92ZSBhbmQgc2VsZWN0IHRoZSBvbmUgYmVsb3cuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChhZnRlciwgXCJzdGFydFwiKSB8fCBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShhZnRlcikpKSB7XG4gICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZSgpLCAkY3Vyc29yLmFmdGVyKCksIFNsaWNlLmVtcHR5KTtcbiAgICAgICAgaWYgKGRlbFN0ZXAgJiYgZGVsU3RlcC5zbGljZS5zaXplIDwgZGVsU3RlcC50byAtIGRlbFN0ZXAuZnJvbSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChkZWxTdGVwKTtcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24odGV4dGJsb2NrQXQoYWZ0ZXIsIFwic3RhcnRcIikgPyBTZWxlY3Rpb24uZmluZEZyb20odHIuZG9jLnJlc29sdmUodHIubWFwcGluZy5tYXAoJGN1dC5wb3MpKSwgMSlcbiAgICAgICAgICAgICAgICAgICAgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsIHRyLm1hcHBpbmcubWFwKCRjdXQucG9zKSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5leHQgbm9kZSBpcyBhbiBhdG9tLCBkZWxldGUgaXRcbiAgICBpZiAoYWZ0ZXIuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIGVuZCBvZiBhIHRleHRibG9jaywgc2VsZWN0XG50aGUgbm9kZSBjb21pbmcgYWZ0ZXIgdGhhdCB0ZXh0YmxvY2ssIGlmIHBvc3NpYmxlLiBUaGlzIGlzIGludGVuZGVkXG50byBiZSBib3VuZCB0byBrZXlzIGxpa2UgZGVsZXRlLCBhZnRlclxuW2Bqb2luRm9yd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luRm9yd2FyZCkgYW5kIHNpbWlsYXIgZGVsZXRpbmdcbmNvbW1hbmRzLCB0byBwcm92aWRlIGEgZmFsbC1iYWNrIGJlaGF2aW9yIHdoZW4gdGhlIHNjaGVtYSBkb2Vzbid0XG5hbGxvdyBkZWxldGlvbiBhdCB0aGUgc2VsZWN0ZWQgcG9pbnQuXG4qL1xuY29uc3Qgc2VsZWN0Tm9kZUZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiZm9yd2FyZFwiLCBzdGF0ZSkgOiAkaGVhZC5wYXJlbnRPZmZzZXQgPCAkaGVhZC5wYXJlbnQuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAkY3V0ID0gZmluZEN1dEFmdGVyKCRoZWFkKTtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSAkY3V0ICYmICRjdXQubm9kZUFmdGVyO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zKSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZmluZEN1dEFmdGVyKCRwb3MpIHtcbiAgICBpZiAoISRwb3MucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkcG9zLm5vZGUoaSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5pbmRleChpKSArIDEgPCBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5kb2MucmVzb2x2ZSgkcG9zLmFmdGVyKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuSm9pbiB0aGUgc2VsZWN0ZWQgYmxvY2sgb3IsIGlmIHRoZXJlIGlzIGEgdGV4dCBzZWxlY3Rpb24sIHRoZVxuY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGUgc2VsZWN0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCwgd2l0aFxudGhlIHNpYmxpbmcgYWJvdmUgaXQuXG4qL1xuY29uc3Qgam9pblVwID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIG5vZGVTZWwgPSBzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uLCBwb2ludDtcbiAgICBpZiAobm9kZVNlbCkge1xuICAgICAgICBpZiAoc2VsLm5vZGUuaXNUZXh0YmxvY2sgfHwgIWNhbkpvaW4oc3RhdGUuZG9jLCBzZWwuZnJvbSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLmZyb207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwb2ludCA9IGpvaW5Qb2ludChzdGF0ZS5kb2MsIHNlbC5mcm9tLCAtMSk7XG4gICAgICAgIGlmIChwb2ludCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuam9pbihwb2ludCk7XG4gICAgICAgIGlmIChub2RlU2VsKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgcG9pbnQgLSBzdGF0ZS5kb2MucmVzb2x2ZShwb2ludCkubm9kZUJlZm9yZS5ub2RlU2l6ZSkpO1xuICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5Kb2luIHRoZSBzZWxlY3RlZCBibG9jaywgb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3Igb2YgdGhlIHNlbGVjdGlvblxudGhhdCBjYW4gYmUgam9pbmVkLCB3aXRoIHRoZSBzaWJsaW5nIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGpvaW5Eb3duID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIHBvaW50O1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGlmIChzZWwubm9kZS5pc1RleHRibG9jayB8fCAhY2FuSm9pbihzdGF0ZS5kb2MsIHNlbC50bykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLnRvO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcG9pbnQgPSBqb2luUG9pbnQoc3RhdGUuZG9jLCBzZWwudG8sIDEpO1xuICAgICAgICBpZiAocG9pbnQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5qb2luKHBvaW50KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbkxpZnQgdGhlIHNlbGVjdGVkIGJsb2NrLCBvciB0aGUgY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGVcbnNlbGVjdGlvbiB0aGF0IGNhbiBiZSBsaWZ0ZWQsIG91dCBvZiBpdHMgcGFyZW50IG5vZGUuXG4qL1xuY29uc3QgbGlmdCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pLCB0YXJnZXQgPSByYW5nZSAmJiBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmxpZnQocmFuZ2UsIHRhcmdldCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aG9zZSB0eXBlIGhhcyBhIHRydXRoeVxuW2Bjb2RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmNvZGUpIHByb3BlcnR5IGluIGl0cyBzcGVjLCByZXBsYWNlIHRoZVxuc2VsZWN0aW9uIHdpdGggYSBuZXdsaW5lIGNoYXJhY3Rlci5cbiovXG5jb25zdCBuZXdsaW5lSW5Db2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmluc2VydFRleHQoXCJcXG5cIikuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZGVmYXVsdEJsb2NrQXQobWF0Y2gpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLmVkZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCB7IHR5cGUgfSA9IG1hdGNoLmVkZ2UoaSk7XG4gICAgICAgIGlmICh0eXBlLmlzVGV4dGJsb2NrICYmICF0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSlcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aXRoIGEgdHJ1dGh5XG5bYGNvZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29kZSkgcHJvcGVydHkgaW4gaXRzIHNwZWMsIGNyZWF0ZSBhXG5kZWZhdWx0IGJsb2NrIGFmdGVyIHRoZSBjb2RlIGJsb2NrLCBhbmQgbW92ZSB0aGUgY3Vyc29yIHRoZXJlLlxuKi9cbmNvbnN0IGV4aXRDb2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYWJvdmUgPSAkaGVhZC5ub2RlKC0xKSwgYWZ0ZXIgPSAkaGVhZC5pbmRleEFmdGVyKC0xKSwgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KGFib3ZlLmNvbnRlbnRNYXRjaEF0KGFmdGVyKSk7XG4gICAgaWYgKCF0eXBlIHx8ICFhYm92ZS5jYW5SZXBsYWNlV2l0aChhZnRlciwgYWZ0ZXIsIHR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBwb3MgPSAkaGVhZC5hZnRlcigpLCB0ciA9IHN0YXRlLnRyLnJlcGxhY2VXaXRoKHBvcywgcG9zLCB0eXBlLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShwb3MpLCAxKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbklmIGEgYmxvY2sgbm9kZSBpcyBzZWxlY3RlZCwgY3JlYXRlIGFuIGVtcHR5IHBhcmFncmFwaCBiZWZvcmUgKGlmXG5pdCBpcyBpdHMgcGFyZW50J3MgZmlyc3QgY2hpbGQpIG9yIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGNyZWF0ZVBhcmFncmFwaE5lYXIgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbiwgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiB8fCAkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCAkdG8ucGFyZW50LmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KCR0by5wYXJlbnQuY29udGVudE1hdGNoQXQoJHRvLmluZGV4QWZ0ZXIoKSkpO1xuICAgIGlmICghdHlwZSB8fCAhdHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICBsZXQgc2lkZSA9ICghJGZyb20ucGFyZW50T2Zmc2V0ICYmICR0by5pbmRleCgpIDwgJHRvLnBhcmVudC5jaGlsZENvdW50ID8gJGZyb20gOiAkdG8pLnBvcztcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuaW5zZXJ0KHNpZGUsIHR5cGUuY3JlYXRlQW5kRmlsbCgpKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgc2lkZSArIDEpKTtcbiAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuSWYgdGhlIGN1cnNvciBpcyBpbiBhbiBlbXB0eSB0ZXh0YmxvY2sgdGhhdCBjYW4gYmUgbGlmdGVkLCBsaWZ0IHRoZVxuYmxvY2suXG4qL1xuY29uc3QgbGlmdEVtcHR5QmxvY2sgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGN1cnNvciB8fCAkY3Vyc29yLnBhcmVudC5jb250ZW50LnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoJGN1cnNvci5kZXB0aCA+IDEgJiYgJGN1cnNvci5hZnRlcigpICE9ICRjdXJzb3IuZW5kKC0xKSkge1xuICAgICAgICBsZXQgYmVmb3JlID0gJGN1cnNvci5iZWZvcmUoKTtcbiAgICAgICAgaWYgKGNhblNwbGl0KHN0YXRlLmRvYywgYmVmb3JlKSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNwbGl0KGJlZm9yZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuQ3JlYXRlIGEgdmFyaWFudCBvZiBbYHNwbGl0QmxvY2tgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuc3BsaXRCbG9jaykgdGhhdCB1c2VzXG5hIGN1c3RvbSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIG5ld2x5IHNwbGl0IG9mZiBibG9jay5cbiovXG5mdW5jdGlvbiBzcGxpdEJsb2NrQXMoc3BsaXROb2RlKSB7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBzdGF0ZS5zZWxlY3Rpb24ubm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgICBpZiAoISRmcm9tLnBhcmVudE9mZnNldCB8fCAhY2FuU3BsaXQoc3RhdGUuZG9jLCAkZnJvbS5wb3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zcGxpdCgkZnJvbS5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkZnJvbS5wYXJlbnQuaXNCbG9jaylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgYXRFbmQgPSAkdG8ucGFyZW50T2Zmc2V0ID09ICR0by5wYXJlbnQuY29udGVudC5zaXplO1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiB8fCBzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgdHIuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBsZXQgZGVmbHQgPSAkZnJvbS5kZXB0aCA9PSAwID8gbnVsbCA6IGRlZmF1bHRCbG9ja0F0KCRmcm9tLm5vZGUoLTEpLmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4QWZ0ZXIoLTEpKSk7XG4gICAgICAgICAgICBsZXQgc3BsaXRUeXBlID0gc3BsaXROb2RlICYmIHNwbGl0Tm9kZSgkdG8ucGFyZW50LCBhdEVuZCk7XG4gICAgICAgICAgICBsZXQgdHlwZXMgPSBzcGxpdFR5cGUgPyBbc3BsaXRUeXBlXSA6IGF0RW5kICYmIGRlZmx0ID8gW3sgdHlwZTogZGVmbHQgfV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgY2FuID0gY2FuU3BsaXQodHIuZG9jLCB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCB0eXBlcyk7XG4gICAgICAgICAgICBpZiAoIXR5cGVzICYmICFjYW4gJiYgY2FuU3BsaXQodHIuZG9jLCB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCBkZWZsdCA/IFt7IHR5cGU6IGRlZmx0IH1dIDogdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWZsdClcbiAgICAgICAgICAgICAgICAgICAgdHlwZXMgPSBbeyB0eXBlOiBkZWZsdCB9XTtcbiAgICAgICAgICAgICAgICBjYW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhbikge1xuICAgICAgICAgICAgICAgIHRyLnNwbGl0KHRyLm1hcHBpbmcubWFwKCRmcm9tLnBvcyksIDEsIHR5cGVzKTtcbiAgICAgICAgICAgICAgICBpZiAoIWF0RW5kICYmICEkZnJvbS5wYXJlbnRPZmZzZXQgJiYgJGZyb20ucGFyZW50LnR5cGUgIT0gZGVmbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHIubWFwcGluZy5tYXAoJGZyb20uYmVmb3JlKCkpLCAkZmlyc3QgPSB0ci5kb2MucmVzb2x2ZShmaXJzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZsdCAmJiAkZnJvbS5ub2RlKC0xKS5jYW5SZXBsYWNlV2l0aCgkZmlyc3QuaW5kZXgoKSwgJGZpcnN0LmluZGV4KCkgKyAxLCBkZWZsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXROb2RlTWFya3VwKHRyLm1hcHBpbmcubWFwKCRmcm9tLmJlZm9yZSgpKSwgZGVmbHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblNwbGl0IHRoZSBwYXJlbnQgYmxvY2sgb2YgdGhlIHNlbGVjdGlvbi4gSWYgdGhlIHNlbGVjdGlvbiBpcyBhIHRleHRcbnNlbGVjdGlvbiwgYWxzbyBkZWxldGUgaXRzIGNvbnRlbnQuXG4qL1xuY29uc3Qgc3BsaXRCbG9jayA9IHNwbGl0QmxvY2tBcygpO1xuLyoqXG5BY3RzIGxpa2UgW2BzcGxpdEJsb2NrYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLnNwbGl0QmxvY2spLCBidXQgd2l0aG91dFxucmVzZXR0aW5nIHRoZSBzZXQgb2YgYWN0aXZlIG1hcmtzIGF0IHRoZSBjdXJzb3IuXG4qL1xuY29uc3Qgc3BsaXRCbG9ja0tlZXBNYXJrcyA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICByZXR1cm4gc3BsaXRCbG9jayhzdGF0ZSwgZGlzcGF0Y2ggJiYgKHRyID0+IHtcbiAgICAgICAgbGV0IG1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3MgfHwgKHN0YXRlLnNlbGVjdGlvbi4kdG8ucGFyZW50T2Zmc2V0ICYmIHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKTtcbiAgICAgICAgaWYgKG1hcmtzKVxuICAgICAgICAgICAgdHIuZW5zdXJlTWFya3MobWFya3MpO1xuICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgfSkpO1xufTtcbi8qKlxuTW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBub2RlIHdyYXBwaW5nIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgaWZcbmFueS4gKFdpbGwgbm90IHNlbGVjdCB0aGUgZG9jdW1lbnQgbm9kZS4pXG4qL1xuY29uc3Qgc2VsZWN0UGFyZW50Tm9kZSA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgdG8gfSA9IHN0YXRlLnNlbGVjdGlvbiwgcG9zO1xuICAgIGxldCBzYW1lID0gJGZyb20uc2hhcmVkRGVwdGgodG8pO1xuICAgIGlmIChzYW1lID09IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBwb3MgPSAkZnJvbS5iZWZvcmUoc2FtZSk7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBwb3MpKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5TZWxlY3QgdGhlIHdob2xlIGRvY3VtZW50LlxuKi9cbmNvbnN0IHNlbGVjdEFsbCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXcgQWxsU2VsZWN0aW9uKHN0YXRlLmRvYykpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBqb2luTWF5YmVDbGVhcihzdGF0ZSwgJHBvcywgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJHBvcy5ub2RlQmVmb3JlLCBhZnRlciA9ICRwb3Mubm9kZUFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICBpZiAoIWJlZm9yZSB8fCAhYWZ0ZXIgfHwgIWJlZm9yZS50eXBlLmNvbXBhdGlibGVDb250ZW50KGFmdGVyLnR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFiZWZvcmUuY29udGVudC5zaXplICYmICRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXggLSAxLCBpbmRleCkpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRwb3MucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkcG9zLnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoISRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSkgfHwgIShhZnRlci5pc1RleHRibG9jayB8fCBjYW5Kb2luKHN0YXRlLmRvYywgJHBvcy5wb3MpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHJcbiAgICAgICAgICAgIC5jbGVhckluY29tcGF0aWJsZSgkcG9zLnBvcywgYmVmb3JlLnR5cGUsIGJlZm9yZS5jb250ZW50TWF0Y2hBdChiZWZvcmUuY2hpbGRDb3VudCkpXG4gICAgICAgICAgICAuam9pbigkcG9zLnBvcylcbiAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZUJhcnJpZXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSB7XG4gICAgbGV0IGJlZm9yZSA9ICRjdXQubm9kZUJlZm9yZSwgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgY29ubiwgbWF0Y2g7XG4gICAgaWYgKGJlZm9yZS50eXBlLnNwZWMuaXNvbGF0aW5nIHx8IGFmdGVyLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoam9pbk1heWJlQ2xlYXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGNhbkRlbEFmdGVyID0gJGN1dC5wYXJlbnQuY2FuUmVwbGFjZSgkY3V0LmluZGV4KCksICRjdXQuaW5kZXgoKSArIDEpO1xuICAgIGlmIChjYW5EZWxBZnRlciAmJlxuICAgICAgICAoY29ubiA9IChtYXRjaCA9IGJlZm9yZS5jb250ZW50TWF0Y2hBdChiZWZvcmUuY2hpbGRDb3VudCkpLmZpbmRXcmFwcGluZyhhZnRlci50eXBlKSkgJiZcbiAgICAgICAgbWF0Y2gubWF0Y2hUeXBlKGNvbm5bMF0gfHwgYWZ0ZXIudHlwZSkudmFsaWRFbmQpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gJGN1dC5wb3MgKyBhZnRlci5ub2RlU2l6ZSwgd3JhcCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbm4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oY29ubltpXS5jcmVhdGUobnVsbCwgd3JhcCkpO1xuICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oYmVmb3JlLmNvcHkod3JhcCkpO1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoJGN1dC5wb3MgLSAxLCBlbmQsICRjdXQucG9zLCBlbmQsIG5ldyBTbGljZSh3cmFwLCAxLCAwKSwgY29ubi5sZW5ndGgsIHRydWUpKTtcbiAgICAgICAgICAgIGxldCBqb2luQXQgPSBlbmQgKyAyICogY29ubi5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoY2FuSm9pbih0ci5kb2MsIGpvaW5BdCkpXG4gICAgICAgICAgICAgICAgdHIuam9pbihqb2luQXQpO1xuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBzZWxBZnRlciA9IFNlbGVjdGlvbi5maW5kRnJvbSgkY3V0LCAxKTtcbiAgICBsZXQgcmFuZ2UgPSBzZWxBZnRlciAmJiBzZWxBZnRlci4kZnJvbS5ibG9ja1JhbmdlKHNlbEFmdGVyLiR0byksIHRhcmdldCA9IHJhbmdlICYmIGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgPj0gJGN1dC5kZXB0aCkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNhbkRlbEFmdGVyICYmIHRleHRibG9ja0F0KGFmdGVyLCBcInN0YXJ0XCIsIHRydWUpICYmIHRleHRibG9ja0F0KGJlZm9yZSwgXCJlbmRcIikpIHtcbiAgICAgICAgbGV0IGF0ID0gYmVmb3JlLCB3cmFwID0gW107XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIHdyYXAucHVzaChhdCk7XG4gICAgICAgICAgICBpZiAoYXQuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBhdCA9IGF0Lmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyRGVwdGggPSAxO1xuICAgICAgICBmb3IgKDsgIWFmdGVyVGV4dC5pc1RleHRibG9jazsgYWZ0ZXJUZXh0ID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICBhZnRlckRlcHRoKys7XG4gICAgICAgIGlmIChhdC5jYW5SZXBsYWNlKGF0LmNoaWxkQ291bnQsIGF0LmNoaWxkQ291bnQsIGFmdGVyVGV4dC5jb250ZW50KSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB3cmFwLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgICAgICAgICBlbmQgPSBGcmFnbWVudC5mcm9tKHdyYXBbaV0uY29weShlbmQpKTtcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkY3V0LnBvcyAtIHdyYXAubGVuZ3RoLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplLCAkY3V0LnBvcyArIGFmdGVyRGVwdGgsICRjdXQucG9zICsgYWZ0ZXIubm9kZVNpemUgLSBhZnRlckRlcHRoLCBuZXcgU2xpY2UoZW5kLCB3cmFwLmxlbmd0aCwgMCksIDAsIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdFRleHRibG9ja1NpZGUoc2lkZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sICRwb3MgPSBzaWRlIDwgMCA/IHNlbC4kZnJvbSA6IHNlbC4kdG87XG4gICAgICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGg7XG4gICAgICAgIHdoaWxlICgkcG9zLm5vZGUoZGVwdGgpLmlzSW5saW5lKSB7XG4gICAgICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkcG9zLm5vZGUoZGVwdGgpLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBzaWRlIDwgMCA/ICRwb3Muc3RhcnQoZGVwdGgpIDogJHBvcy5lbmQoZGVwdGgpKSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5Nb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IHRleHQgYmxvY2suXG4qL1xuY29uc3Qgc2VsZWN0VGV4dGJsb2NrU3RhcnQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKC0xKTtcbi8qKlxuTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIGN1cnJlbnQgdGV4dCBibG9jay5cbiovXG5jb25zdCBzZWxlY3RUZXh0YmxvY2tFbmQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKDEpO1xuLy8gUGFyYW1ldGVyaXplZCBjb21tYW5kc1xuLyoqXG5XcmFwIHRoZSBzZWxlY3Rpb24gaW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuXG5hdHRyaWJ1dGVzLlxuKi9cbmZ1bmN0aW9uIHdyYXBJbihub2RlVHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byksIHdyYXBwaW5nID0gcmFuZ2UgJiYgZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMpO1xuICAgICAgICBpZiAoIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci53cmFwKHJhbmdlLCB3cmFwcGluZykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblJldHVybnMgYSBjb21tYW5kIHRoYXQgdHJpZXMgdG8gc2V0IHRoZSBzZWxlY3RlZCB0ZXh0YmxvY2tzIHRvIHRoZVxuZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4qL1xuZnVuY3Rpb24gc2V0QmxvY2tUeXBlKG5vZGVUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgYXBwbGljYWJsZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoICYmICFhcHBsaWNhYmxlOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tOiB7IHBvczogZnJvbSB9LCAkdG86IHsgcG9zOiB0byB9IH0gPSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzW2ldO1xuICAgICAgICAgICAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhYmxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrIHx8IG5vZGUuaGFzTWFya3VwKG5vZGVUeXBlLCBhdHRycykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09IG5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0ICRwb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9ICRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCArIDEsIG5vZGVUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFwcGxpY2FibGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyAkZnJvbTogeyBwb3M6IGZyb20gfSwgJHRvOiB7IHBvczogdG8gfSB9ID0gc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICB0ci5zZXRCbG9ja1R5cGUoZnJvbSwgdG8sIG5vZGVUeXBlLCBhdHRycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbWFya0FwcGxpZXMoZG9jLCByYW5nZXMsIHR5cGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV07XG4gICAgICAgIGxldCBjYW4gPSAkZnJvbS5kZXB0aCA9PSAwID8gZG9jLmlubGluZUNvbnRlbnQgJiYgZG9jLnR5cGUuYWxsb3dzTWFya1R5cGUodHlwZSkgOiBmYWxzZTtcbiAgICAgICAgZG9jLm5vZGVzQmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MsIG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYW4gPSBub2RlLmlubGluZUNvbnRlbnQgJiYgbm9kZS50eXBlLmFsbG93c01hcmtUeXBlKHR5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB0b2dnbGVzIHRoZSBnaXZlbiBtYXJrIHdpdGggdGhlXG5naXZlbiBhdHRyaWJ1dGVzLiBXaWxsIHJldHVybiBgZmFsc2VgIHdoZW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG5kb2Vzbid0IHN1cHBvcnQgdGhhdCBtYXJrLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBtYXJrIGlmIGFueSBtYXJrc1xub2YgdGhhdCB0eXBlIGV4aXN0IGluIHRoZSBzZWxlY3Rpb24sIG9yIGFkZCBpdCBvdGhlcndpc2UuIElmIHRoZVxuc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGlzIGFwcGxpZXMgdG8gdGhlIFtzdG9yZWRcbm1hcmtzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuc3RvcmVkTWFya3MpIGluc3RlYWQgb2YgYSByYW5nZSBvZiB0aGVcbmRvY3VtZW50LlxuKi9cbmZ1bmN0aW9uIHRvZ2dsZU1hcmsobWFya1R5cGUsIGF0dHJzID0gbnVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7IGVtcHR5LCAkY3Vyc29yLCByYW5nZXMgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKChlbXB0eSAmJiAhJGN1cnNvcikgfHwgIW1hcmtBcHBsaWVzKHN0YXRlLmRvYywgcmFuZ2VzLCBtYXJrVHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgaWYgKCRjdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAobWFya1R5cGUuaXNJblNldChzdGF0ZS5zdG9yZWRNYXJrcyB8fCAkY3Vyc29yLm1hcmtzKCkpKVxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5yZW1vdmVTdG9yZWRNYXJrKG1hcmtUeXBlKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5hZGRTdG9yZWRNYXJrKG1hcmtUeXBlLmNyZWF0ZShhdHRycykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBoYXMgPSBmYWxzZSwgdHIgPSBzdGF0ZS50cjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhcyAmJiBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaGFzID0gc3RhdGUuZG9jLnJhbmdlSGFzTWFyaygkZnJvbS5wb3MsICR0by5wb3MsIG1hcmtUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5yZW1vdmVNYXJrKCRmcm9tLnBvcywgJHRvLnBvcywgbWFya1R5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSAkZnJvbS5wb3MsIHRvID0gJHRvLnBvcywgc3RhcnQgPSAkZnJvbS5ub2RlQWZ0ZXIsIGVuZCA9ICR0by5ub2RlQmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlU3RhcnQgPSBzdGFydCAmJiBzdGFydC5pc1RleHQgPyAvXlxccyovLmV4ZWMoc3RhcnQudGV4dClbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZUVuZCA9IGVuZCAmJiBlbmQuaXNUZXh0ID8gL1xccyokLy5leGVjKGVuZC50ZXh0KVswXS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gKyBzcGFjZVN0YXJ0IDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHNwYWNlU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gLT0gc3BhY2VFbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5hZGRNYXJrKGZyb20sIHRvLCBtYXJrVHlwZS5jcmVhdGUoYXR0cnMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gd3JhcERpc3BhdGNoRm9ySm9pbihkaXNwYXRjaCwgaXNKb2luYWJsZSkge1xuICAgIHJldHVybiAodHIpID0+IHtcbiAgICAgICAgaWYgKCF0ci5pc0dlbmVyaWMpXG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2godHIpO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHIubWFwcGluZy5tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwID0gdHIubWFwcGluZy5tYXBzW2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByYW5nZXMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgcmFuZ2VzW2pdID0gbWFwLm1hcChyYW5nZXNbal0pO1xuICAgICAgICAgICAgbWFwLmZvckVhY2goKF9zLCBfZSwgZnJvbSwgdG8pID0+IHJhbmdlcy5wdXNoKGZyb20sIHRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBqb2luYWJsZSBwb2ludHMgZXhpc3QgaW5zaWRlIHRob3NlIHJhbmdlcyxcbiAgICAgICAgLy8gYnkgY2hlY2tpbmcgYWxsIG5vZGUgYm91bmRhcmllcyBpbiB0aGVpciBwYXJlbnQgbm9kZXMuXG4gICAgICAgIGxldCBqb2luYWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbaV0sIHRvID0gcmFuZ2VzW2kgKyAxXTtcbiAgICAgICAgICAgIGxldCAkZnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pLCBkZXB0aCA9ICRmcm9tLnNoYXJlZERlcHRoKHRvKSwgcGFyZW50ID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9ICRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpLCBwb3MgPSAkZnJvbS5hZnRlcihkZXB0aCArIDEpOyBwb3MgPD0gdG87ICsraW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBwYXJlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICYmIGpvaW5hYmxlLmluZGV4T2YocG9zKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gcGFyZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmUudHlwZSA9PSBhZnRlci50eXBlICYmIGlzSm9pbmFibGUoYmVmb3JlLCBhZnRlcikpXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luYWJsZS5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyArPSBhZnRlci5ub2RlU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKb2luIHRoZSBqb2luYWJsZSBwb2ludHNcbiAgICAgICAgam9pbmFibGUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBmb3IgKGxldCBpID0gam9pbmFibGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChjYW5Kb2luKHRyLmRvYywgam9pbmFibGVbaV0pKVxuICAgICAgICAgICAgICAgIHRyLmpvaW4oam9pbmFibGVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICB9O1xufVxuLyoqXG5XcmFwIGEgY29tbWFuZCBzbyB0aGF0LCB3aGVuIGl0IHByb2R1Y2VzIGEgdHJhbnNmb3JtIHRoYXQgY2F1c2VzXG50d28gam9pbmFibGUgbm9kZXMgdG8gZW5kIHVwIG5leHQgdG8gZWFjaCBvdGhlciwgdGhvc2UgYXJlIGpvaW5lZC5cbk5vZGVzIGFyZSBjb25zaWRlcmVkIGpvaW5hYmxlIHdoZW4gdGhleSBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmRcbndoZW4gdGhlIGBpc0pvaW5hYmxlYCBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciB0aGVtIG9yLCBpZiBhblxuYXJyYXkgb2Ygc3RyaW5ncyB3YXMgcGFzc2VkLCBpZiB0aGVpciBub2RlIHR5cGUgbmFtZSBpcyBpbiB0aGF0XG5hcnJheS5cbiovXG5mdW5jdGlvbiBhdXRvSm9pbihjb21tYW5kLCBpc0pvaW5hYmxlKSB7XG4gICAgbGV0IGNhbkpvaW4gPSBBcnJheS5pc0FycmF5KGlzSm9pbmFibGUpID8gKG5vZGUpID0+IGlzSm9pbmFibGUuaW5kZXhPZihub2RlLnR5cGUubmFtZSkgPiAtMVxuICAgICAgICA6IGlzSm9pbmFibGU7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IGNvbW1hbmQoc3RhdGUsIGRpc3BhdGNoICYmIHdyYXBEaXNwYXRjaEZvckpvaW4oZGlzcGF0Y2gsIGNhbkpvaW4pLCB2aWV3KTtcbn1cbi8qKlxuQ29tYmluZSBhIG51bWJlciBvZiBjb21tYW5kIGZ1bmN0aW9ucyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uICh3aGljaFxuY2FsbHMgdGhlbSBvbmUgYnkgb25lIHVudGlsIG9uZSByZXR1cm5zIHRydWUpLlxuKi9cbmZ1bmN0aW9uIGNoYWluQ29tbWFuZHMoLi4uY29tbWFuZHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGNvbW1hbmRzW2ldKHN0YXRlLCBkaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxubGV0IGJhY2tzcGFjZSA9IGNoYWluQ29tbWFuZHMoZGVsZXRlU2VsZWN0aW9uLCBqb2luQmFja3dhcmQsIHNlbGVjdE5vZGVCYWNrd2FyZCk7XG5sZXQgZGVsID0gY2hhaW5Db21tYW5kcyhkZWxldGVTZWxlY3Rpb24sIGpvaW5Gb3J3YXJkLCBzZWxlY3ROb2RlRm9yd2FyZCk7XG4vKipcbkEgYmFzaWMga2V5bWFwIGNvbnRhaW5pbmcgYmluZGluZ3Mgbm90IHNwZWNpZmljIHRvIGFueSBzY2hlbWEuXG5CaW5kcyB0aGUgZm9sbG93aW5nIGtleXMgKHdoZW4gbXVsdGlwbGUgY29tbWFuZHMgYXJlIGxpc3RlZCwgdGhleVxuYXJlIGNoYWluZWQgd2l0aCBbYGNoYWluQ29tbWFuZHNgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuY2hhaW5Db21tYW5kcykpOlxuXG4qICoqRW50ZXIqKiB0byBgbmV3bGluZUluQ29kZWAsIGBjcmVhdGVQYXJhZ3JhcGhOZWFyYCwgYGxpZnRFbXB0eUJsb2NrYCwgYHNwbGl0QmxvY2tgXG4qICoqTW9kLUVudGVyKiogdG8gYGV4aXRDb2RlYFxuKiAqKkJhY2tzcGFjZSoqIGFuZCAqKk1vZC1CYWNrc3BhY2UqKiB0byBgZGVsZXRlU2VsZWN0aW9uYCwgYGpvaW5CYWNrd2FyZGAsIGBzZWxlY3ROb2RlQmFja3dhcmRgXG4qICoqRGVsZXRlKiogYW5kICoqTW9kLURlbGV0ZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkZvcndhcmRgLCBgc2VsZWN0Tm9kZUZvcndhcmRgXG4qICoqTW9kLURlbGV0ZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkZvcndhcmRgLCBgc2VsZWN0Tm9kZUZvcndhcmRgXG4qICoqTW9kLWEqKiB0byBgc2VsZWN0QWxsYFxuKi9cbmNvbnN0IHBjQmFzZUtleW1hcCA9IHtcbiAgICBcIkVudGVyXCI6IGNoYWluQ29tbWFuZHMobmV3bGluZUluQ29kZSwgY3JlYXRlUGFyYWdyYXBoTmVhciwgbGlmdEVtcHR5QmxvY2ssIHNwbGl0QmxvY2spLFxuICAgIFwiTW9kLUVudGVyXCI6IGV4aXRDb2RlLFxuICAgIFwiQmFja3NwYWNlXCI6IGJhY2tzcGFjZSxcbiAgICBcIk1vZC1CYWNrc3BhY2VcIjogYmFja3NwYWNlLFxuICAgIFwiU2hpZnQtQmFja3NwYWNlXCI6IGJhY2tzcGFjZSxcbiAgICBcIkRlbGV0ZVwiOiBkZWwsXG4gICAgXCJNb2QtRGVsZXRlXCI6IGRlbCxcbiAgICBcIk1vZC1hXCI6IHNlbGVjdEFsbFxufTtcbi8qKlxuQSBjb3B5IG9mIGBwY0Jhc2VLZXltYXBgIHRoYXQgYWxzbyBiaW5kcyAqKkN0cmwtaCoqIGxpa2UgQmFja3NwYWNlLFxuKipDdHJsLWQqKiBsaWtlIERlbGV0ZSwgKipBbHQtQmFja3NwYWNlKiogbGlrZSBDdHJsLUJhY2tzcGFjZSwgYW5kXG4qKkN0cmwtQWx0LUJhY2tzcGFjZSoqLCAqKkFsdC1EZWxldGUqKiwgYW5kICoqQWx0LWQqKiBsaWtlXG5DdHJsLURlbGV0ZS5cbiovXG5jb25zdCBtYWNCYXNlS2V5bWFwID0ge1xuICAgIFwiQ3RybC1oXCI6IHBjQmFzZUtleW1hcFtcIkJhY2tzcGFjZVwiXSxcbiAgICBcIkFsdC1CYWNrc3BhY2VcIjogcGNCYXNlS2V5bWFwW1wiTW9kLUJhY2tzcGFjZVwiXSxcbiAgICBcIkN0cmwtZFwiOiBwY0Jhc2VLZXltYXBbXCJEZWxldGVcIl0sXG4gICAgXCJDdHJsLUFsdC1CYWNrc3BhY2VcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkFsdC1EZWxldGVcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkFsdC1kXCI6IHBjQmFzZUtleW1hcFtcIk1vZC1EZWxldGVcIl0sXG4gICAgXCJDdHJsLWFcIjogc2VsZWN0VGV4dGJsb2NrU3RhcnQsXG4gICAgXCJDdHJsLWVcIjogc2VsZWN0VGV4dGJsb2NrRW5kXG59O1xuZm9yIChsZXQga2V5IGluIHBjQmFzZUtleW1hcClcbiAgICBtYWNCYXNlS2V5bWFwW2tleV0gPSBwY0Jhc2VLZXltYXBba2V5XTtcbmNvbnN0IG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiA/IC9NYWN8aVAoaG9uZXxbb2FdZCkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICA6IHR5cGVvZiBvcyAhPSBcInVuZGVmaW5lZFwiICYmIG9zLnBsYXRmb3JtID8gb3MucGxhdGZvcm0oKSA9PSBcImRhcndpblwiIDogZmFsc2U7XG4vKipcbkRlcGVuZGluZyBvbiB0aGUgZGV0ZWN0ZWQgcGxhdGZvcm0sIHRoaXMgd2lsbCBob2xkXG5bYHBjQmFzZWtleW1hcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5wY0Jhc2VLZXltYXApIG9yXG5bYG1hY0Jhc2VLZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMubWFjQmFzZUtleW1hcCkuXG4qL1xuY29uc3QgYmFzZUtleW1hcCA9IG1hYyA/IG1hY0Jhc2VLZXltYXAgOiBwY0Jhc2VLZXltYXA7XG5cbmV4cG9ydCB7IGF1dG9Kb2luLCBiYXNlS2V5bWFwLCBjaGFpbkNvbW1hbmRzLCBjcmVhdGVQYXJhZ3JhcGhOZWFyLCBkZWxldGVTZWxlY3Rpb24sIGV4aXRDb2RlLCBqb2luQmFja3dhcmQsIGpvaW5Eb3duLCBqb2luRm9yd2FyZCwgam9pblRleHRibG9ja0JhY2t3YXJkLCBqb2luVGV4dGJsb2NrRm9yd2FyZCwgam9pblVwLCBsaWZ0LCBsaWZ0RW1wdHlCbG9jaywgbWFjQmFzZUtleW1hcCwgbmV3bGluZUluQ29kZSwgcGNCYXNlS2V5bWFwLCBzZWxlY3RBbGwsIHNlbGVjdE5vZGVCYWNrd2FyZCwgc2VsZWN0Tm9kZUZvcndhcmQsIHNlbGVjdFBhcmVudE5vZGUsIHNlbGVjdFRleHRibG9ja0VuZCwgc2VsZWN0VGV4dGJsb2NrU3RhcnQsIHNldEJsb2NrVHlwZSwgc3BsaXRCbG9jaywgc3BsaXRCbG9ja0FzLCBzcGxpdEJsb2NrS2VlcE1hcmtzLCB0b2dnbGVNYXJrLCB3cmFwSW4gfTtcbiIsICJpbXBvcnQgeyBmaW5kV3JhcHBpbmcsIFJlcGxhY2VBcm91bmRTdGVwLCBjYW5TcGxpdCwgbGlmdFRhcmdldCwgY2FuSm9pbiB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBOb2RlUmFuZ2UsIEZyYWdtZW50LCBTbGljZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuY29uc3Qgb2xET00gPSBbXCJvbFwiLCAwXSwgdWxET00gPSBbXCJ1bFwiLCAwXSwgbGlET00gPSBbXCJsaVwiLCAwXTtcbi8qKlxuQW4gb3JkZXJlZCBsaXN0IFtub2RlIHNwZWNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYykuIEhhcyBhIHNpbmdsZVxuYXR0cmlidXRlLCBgb3JkZXJgLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgYXQgd2hpY2ggdGhlIGxpc3RcbnN0YXJ0cyBjb3VudGluZywgYW5kIGRlZmF1bHRzIHRvIDEuIFJlcHJlc2VudGVkIGFzIGFuIGA8b2w+YFxuZWxlbWVudC5cbiovXG5jb25zdCBvcmRlcmVkTGlzdCA9IHtcbiAgICBhdHRyczogeyBvcmRlcjogeyBkZWZhdWx0OiAxIH0gfSxcbiAgICBwYXJzZURPTTogW3sgdGFnOiBcIm9sXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG9yZGVyOiBkb20uaGFzQXR0cmlidXRlKFwic3RhcnRcIikgPyArZG9tLmdldEF0dHJpYnV0ZShcInN0YXJ0XCIpIDogMSB9O1xuICAgICAgICAgICAgfSB9XSxcbiAgICB0b0RPTShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmF0dHJzLm9yZGVyID09IDEgPyBvbERPTSA6IFtcIm9sXCIsIHsgc3RhcnQ6IG5vZGUuYXR0cnMub3JkZXIgfSwgMF07XG4gICAgfVxufTtcbi8qKlxuQSBidWxsZXQgbGlzdCBub2RlIHNwZWMsIHJlcHJlc2VudGVkIGluIHRoZSBET00gYXMgYDx1bD5gLlxuKi9cbmNvbnN0IGJ1bGxldExpc3QgPSB7XG4gICAgcGFyc2VET006IFt7IHRhZzogXCJ1bFwiIH1dLFxuICAgIHRvRE9NKCkgeyByZXR1cm4gdWxET007IH1cbn07XG4vKipcbkEgbGlzdCBpdGVtIChgPGxpPmApIHNwZWMuXG4qL1xuY29uc3QgbGlzdEl0ZW0gPSB7XG4gICAgcGFyc2VET006IFt7IHRhZzogXCJsaVwiIH1dLFxuICAgIHRvRE9NKCkgeyByZXR1cm4gbGlET007IH0sXG4gICAgZGVmaW5pbmc6IHRydWVcbn07XG5mdW5jdGlvbiBhZGQob2JqLCBwcm9wcykge1xuICAgIGxldCBjb3B5ID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcylcbiAgICAgICAgY29weVtwcm9wXSA9IHByb3BzW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuLyoqXG5Db252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWRkaW5nIGxpc3QtcmVsYXRlZCBub2RlIHR5cGVzIHRvIGEgbWFwXG5zcGVjaWZ5aW5nIHRoZSBub2RlcyBmb3IgYSBzY2hlbWEuIEFkZHNcbltgb3JkZXJlZExpc3RgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3Qub3JkZXJlZExpc3QpIGFzIGBcIm9yZGVyZWRfbGlzdFwiYCxcbltgYnVsbGV0TGlzdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdC5idWxsZXRMaXN0KSBhcyBgXCJidWxsZXRfbGlzdFwiYCwgYW5kXG5bYGxpc3RJdGVtYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYS1saXN0Lmxpc3RJdGVtKSBhcyBgXCJsaXN0X2l0ZW1cImAuXG5cbmBpdGVtQ29udGVudGAgZGV0ZXJtaW5lcyB0aGUgY29udGVudCBleHByZXNzaW9uIGZvciB0aGUgbGlzdCBpdGVtcy5cbklmIHlvdSB3YW50IHRoZSBjb21tYW5kcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIHRvIGFwcGx5IHRvIHlvdXJcbmxpc3Qgc3RydWN0dXJlLCBpdCBzaG91bGQgaGF2ZSBhIHNoYXBlIGxpa2UgYFwicGFyYWdyYXBoIGJsb2NrKlwiYCBvclxuYFwicGFyYWdyYXBoIChvcmRlcmVkX2xpc3QgfCBidWxsZXRfbGlzdCkqXCJgLiBgbGlzdEdyb3VwYCBjYW4gYmVcbmdpdmVuIHRvIGFzc2lnbiBhIGdyb3VwIG5hbWUgdG8gdGhlIGxpc3Qgbm9kZSB0eXBlcywgZm9yIGV4YW1wbGVcbmBcImJsb2NrXCJgLlxuKi9cbmZ1bmN0aW9uIGFkZExpc3ROb2Rlcyhub2RlcywgaXRlbUNvbnRlbnQsIGxpc3RHcm91cCkge1xuICAgIHJldHVybiBub2Rlcy5hcHBlbmQoe1xuICAgICAgICBvcmRlcmVkX2xpc3Q6IGFkZChvcmRlcmVkTGlzdCwgeyBjb250ZW50OiBcImxpc3RfaXRlbStcIiwgZ3JvdXA6IGxpc3RHcm91cCB9KSxcbiAgICAgICAgYnVsbGV0X2xpc3Q6IGFkZChidWxsZXRMaXN0LCB7IGNvbnRlbnQ6IFwibGlzdF9pdGVtK1wiLCBncm91cDogbGlzdEdyb3VwIH0pLFxuICAgICAgICBsaXN0X2l0ZW06IGFkZChsaXN0SXRlbSwgeyBjb250ZW50OiBpdGVtQ29udGVudCB9KVxuICAgIH0pO1xufVxuLyoqXG5SZXR1cm5zIGEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBzZWxlY3Rpb24gaW4gYSBsaXN0IHdpdGhcbnRoZSBnaXZlbiB0eXBlIGFuIGF0dHJpYnV0ZXMuIElmIGBkaXNwYXRjaGAgaXMgbnVsbCwgb25seSByZXR1cm4gYVxudmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIHBvc3NpYmxlLCBidXQgZG9uJ3QgYWN0dWFsbHlcbnBlcmZvcm0gdGhlIGNoYW5nZS5cbiovXG5mdW5jdGlvbiB3cmFwSW5MaXN0KGxpc3RUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKSwgZG9Kb2luID0gZmFsc2UsIG91dGVyUmFuZ2UgPSByYW5nZTtcbiAgICAgICAgaWYgKCFyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gVGhpcyBpcyBhdCB0aGUgdG9wIG9mIGFuIGV4aXN0aW5nIGxpc3QgaXRlbVxuICAgICAgICBpZiAocmFuZ2UuZGVwdGggPj0gMiAmJiAkZnJvbS5ub2RlKHJhbmdlLmRlcHRoIC0gMSkudHlwZS5jb21wYXRpYmxlQ29udGVudChsaXN0VHlwZSkgJiYgcmFuZ2Uuc3RhcnRJbmRleCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGlzIHRoZSB0b3Agb2YgdGhlIGxpc3RcbiAgICAgICAgICAgIGlmICgkZnJvbS5pbmRleChyYW5nZS5kZXB0aCAtIDEpID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0ICRpbnNlcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShyYW5nZS5zdGFydCAtIDIpO1xuICAgICAgICAgICAgb3V0ZXJSYW5nZSA9IG5ldyBOb2RlUmFuZ2UoJGluc2VydCwgJGluc2VydCwgcmFuZ2UuZGVwdGgpO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVuZEluZGV4IDwgcmFuZ2UucGFyZW50LmNoaWxkQ291bnQpXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgTm9kZVJhbmdlKCRmcm9tLCBzdGF0ZS5kb2MucmVzb2x2ZSgkdG8uZW5kKHJhbmdlLmRlcHRoKSksIHJhbmdlLmRlcHRoKTtcbiAgICAgICAgICAgIGRvSm9pbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdyYXAgPSBmaW5kV3JhcHBpbmcob3V0ZXJSYW5nZSwgbGlzdFR5cGUsIGF0dHJzLCByYW5nZSk7XG4gICAgICAgIGlmICghd3JhcClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goZG9XcmFwSW5MaXN0KHN0YXRlLnRyLCByYW5nZSwgd3JhcCwgZG9Kb2luLCBsaXN0VHlwZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5mdW5jdGlvbiBkb1dyYXBJbkxpc3QodHIsIHJhbmdlLCB3cmFwcGVycywgam9pbkJlZm9yZSwgbGlzdFR5cGUpIHtcbiAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSB3cmFwcGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20od3JhcHBlcnNbaV0udHlwZS5jcmVhdGUod3JhcHBlcnNbaV0uYXR0cnMsIGNvbnRlbnQpKTtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChyYW5nZS5zdGFydCAtIChqb2luQmVmb3JlID8gMiA6IDApLCByYW5nZS5lbmQsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIG5ldyBTbGljZShjb250ZW50LCAwLCAwKSwgd3JhcHBlcnMubGVuZ3RoLCB0cnVlKSk7XG4gICAgbGV0IGZvdW5kID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXBwZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAod3JhcHBlcnNbaV0udHlwZSA9PSBsaXN0VHlwZSlcbiAgICAgICAgICAgIGZvdW5kID0gaSArIDE7XG4gICAgbGV0IHNwbGl0RGVwdGggPSB3cmFwcGVycy5sZW5ndGggLSBmb3VuZDtcbiAgICBsZXQgc3BsaXRQb3MgPSByYW5nZS5zdGFydCArIHdyYXBwZXJzLmxlbmd0aCAtIChqb2luQmVmb3JlID8gMiA6IDApLCBwYXJlbnQgPSByYW5nZS5wYXJlbnQ7XG4gICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0SW5kZXgsIGUgPSByYW5nZS5lbmRJbmRleCwgZmlyc3QgPSB0cnVlOyBpIDwgZTsgaSsrLCBmaXJzdCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghZmlyc3QgJiYgY2FuU3BsaXQodHIuZG9jLCBzcGxpdFBvcywgc3BsaXREZXB0aCkpIHtcbiAgICAgICAgICAgIHRyLnNwbGl0KHNwbGl0UG9zLCBzcGxpdERlcHRoKTtcbiAgICAgICAgICAgIHNwbGl0UG9zICs9IDIgKiBzcGxpdERlcHRoO1xuICAgICAgICB9XG4gICAgICAgIHNwbGl0UG9zICs9IHBhcmVudC5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuLyoqXG5CdWlsZCBhIGNvbW1hbmQgdGhhdCBzcGxpdHMgYSBub24tZW1wdHkgdGV4dGJsb2NrIGF0IHRoZSB0b3AgbGV2ZWxcbm9mIGEgbGlzdCBpdGVtIGJ5IGFsc28gc3BsaXR0aW5nIHRoYXQgbGlzdCBpdGVtLlxuKi9cbmZ1bmN0aW9uIHNwbGl0TGlzdEl0ZW0oaXRlbVR5cGUsIGl0ZW1BdHRycykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8sIG5vZGUgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKChub2RlICYmIG5vZGUuaXNCbG9jaykgfHwgJGZyb20uZGVwdGggPCAyIHx8ICEkZnJvbS5zYW1lUGFyZW50KCR0bykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBncmFuZFBhcmVudCA9ICRmcm9tLm5vZGUoLTEpO1xuICAgICAgICBpZiAoZ3JhbmRQYXJlbnQudHlwZSAhPSBpdGVtVHlwZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCRmcm9tLnBhcmVudC5jb250ZW50LnNpemUgPT0gMCAmJiAkZnJvbS5ub2RlKC0xKS5jaGlsZENvdW50ID09ICRmcm9tLmluZGV4QWZ0ZXIoLTEpKSB7XG4gICAgICAgICAgICAvLyBJbiBhbiBlbXB0eSBibG9jay4gSWYgdGhpcyBpcyBhIG5lc3RlZCBsaXN0LCB0aGUgd3JhcHBpbmdcbiAgICAgICAgICAgIC8vIGxpc3QgaXRlbSBzaG91bGQgYmUgc3BsaXQuIE90aGVyd2lzZSwgYmFpbCBvdXQgYW5kIGxldCBuZXh0XG4gICAgICAgICAgICAvLyBjb21tYW5kIGhhbmRsZSBsaWZ0aW5nLlxuICAgICAgICAgICAgaWYgKCRmcm9tLmRlcHRoID09IDMgfHwgJGZyb20ubm9kZSgtMykudHlwZSAhPSBpdGVtVHlwZSB8fFxuICAgICAgICAgICAgICAgICRmcm9tLmluZGV4KC0yKSAhPSAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50IC0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aEJlZm9yZSA9ICRmcm9tLmluZGV4KC0xKSA/IDEgOiAkZnJvbS5pbmRleCgtMikgPyAyIDogMztcbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGZyYWdtZW50IGNvbnRhaW5pbmcgZW1wdHkgdmVyc2lvbnMgb2YgdGhlIHN0cnVjdHVyZVxuICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG91dGVyIGxpc3QgaXRlbSB0byB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAkZnJvbS5kZXB0aCAtIGRlcHRoQmVmb3JlOyBkID49ICRmcm9tLmRlcHRoIC0gMzsgZC0tKVxuICAgICAgICAgICAgICAgICAgICB3cmFwID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGQpLmNvcHkod3JhcCkpO1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aEFmdGVyID0gJGZyb20uaW5kZXhBZnRlcigtMSkgPCAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50ID8gMVxuICAgICAgICAgICAgICAgICAgICA6ICRmcm9tLmluZGV4QWZ0ZXIoLTIpIDwgJGZyb20ubm9kZSgtMykuY2hpbGRDb3VudCA/IDIgOiAzO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBhIHNlY29uZCBsaXN0IGl0ZW0gd2l0aCBhbiBlbXB0eSBkZWZhdWx0IHN0YXJ0IG5vZGVcbiAgICAgICAgICAgICAgICB3cmFwID0gd3JhcC5hcHBlbmQoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGVBbmRGaWxsKCkpKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5iZWZvcmUoJGZyb20uZGVwdGggLSAoZGVwdGhCZWZvcmUgLSAxKSk7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIucmVwbGFjZShzdGFydCwgJGZyb20uYWZ0ZXIoLWRlcHRoQWZ0ZXIpLCBuZXcgU2xpY2Uod3JhcCwgNCAtIGRlcHRoQmVmb3JlLCAwKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IC0xO1xuICAgICAgICAgICAgICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oc3RhcnQsIHRyLmRvYy5jb250ZW50LnNpemUsIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jayAmJiBub2RlLmNvbnRlbnQuc2l6ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsID0gcG9zICsgMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShzZWwpKSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFR5cGUgPSAkdG8ucG9zID09ICRmcm9tLmVuZCgpID8gZ3JhbmRQYXJlbnQuY29udGVudE1hdGNoQXQoMCkuZGVmYXVsdFR5cGUgOiBudWxsO1xuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5kZWxldGUoJGZyb20ucG9zLCAkdG8ucG9zKTtcbiAgICAgICAgbGV0IHR5cGVzID0gbmV4dFR5cGUgPyBbaXRlbUF0dHJzID8geyB0eXBlOiBpdGVtVHlwZSwgYXR0cnM6IGl0ZW1BdHRycyB9IDogbnVsbCwgeyB0eXBlOiBuZXh0VHlwZSB9XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjYW5TcGxpdCh0ci5kb2MsICRmcm9tLnBvcywgMiwgdHlwZXMpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zcGxpdCgkZnJvbS5wb3MsIDIsIHR5cGVzKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuQ3JlYXRlIGEgY29tbWFuZCB0byBsaWZ0IHRoZSBsaXN0IGl0ZW0gYXJvdW5kIHRoZSBzZWxlY3Rpb24gdXAgaW50b1xuYSB3cmFwcGluZyBsaXN0LlxuKi9cbmZ1bmN0aW9uIGxpZnRMaXN0SXRlbShpdGVtVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8sIG5vZGUgPT4gbm9kZS5jaGlsZENvdW50ID4gMCAmJiBub2RlLmZpcnN0Q2hpbGQudHlwZSA9PSBpdGVtVHlwZSk7XG4gICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghZGlzcGF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCRmcm9tLm5vZGUocmFuZ2UuZGVwdGggLSAxKS50eXBlID09IGl0ZW1UeXBlKSAvLyBJbnNpZGUgYSBwYXJlbnQgbGlzdFxuICAgICAgICAgICAgcmV0dXJuIGxpZnRUb091dGVyTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIGl0ZW1UeXBlLCByYW5nZSk7XG4gICAgICAgIGVsc2UgLy8gT3V0ZXIgbGlzdCBub2RlXG4gICAgICAgICAgICByZXR1cm4gbGlmdE91dE9mTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIHJhbmdlKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbGlmdFRvT3V0ZXJMaXN0KHN0YXRlLCBkaXNwYXRjaCwgaXRlbVR5cGUsIHJhbmdlKSB7XG4gICAgbGV0IHRyID0gc3RhdGUudHIsIGVuZCA9IHJhbmdlLmVuZCwgZW5kT2ZMaXN0ID0gcmFuZ2UuJHRvLmVuZChyYW5nZS5kZXB0aCk7XG4gICAgaWYgKGVuZCA8IGVuZE9mTGlzdCkge1xuICAgICAgICAvLyBUaGVyZSBhcmUgc2libGluZ3MgYWZ0ZXIgdGhlIGxpZnRlZCBpdGVtcywgd2hpY2ggbXVzdCBiZWNvbWVcbiAgICAgICAgLy8gY2hpbGRyZW4gb2YgdGhlIGxhc3QgaXRlbVxuICAgICAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChlbmQgLSAxLCBlbmRPZkxpc3QsIGVuZCwgZW5kT2ZMaXN0LCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGUobnVsbCwgcmFuZ2UucGFyZW50LmNvcHkoKSkpLCAxLCAwKSwgMSwgdHJ1ZSkpO1xuICAgICAgICByYW5nZSA9IG5ldyBOb2RlUmFuZ2UodHIuZG9jLnJlc29sdmUocmFuZ2UuJGZyb20ucG9zKSwgdHIuZG9jLnJlc29sdmUoZW5kT2ZMaXN0KSwgcmFuZ2UuZGVwdGgpO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0ci5saWZ0KHJhbmdlLCB0YXJnZXQpO1xuICAgIGxldCBhZnRlciA9IHRyLm1hcHBpbmcubWFwKGVuZCwgLTEpIC0gMTtcbiAgICBpZiAoY2FuSm9pbih0ci5kb2MsIGFmdGVyKSlcbiAgICAgICAgdHIuam9pbihhZnRlcik7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBsaWZ0T3V0T2ZMaXN0KHN0YXRlLCBkaXNwYXRjaCwgcmFuZ2UpIHtcbiAgICBsZXQgdHIgPSBzdGF0ZS50ciwgbGlzdCA9IHJhbmdlLnBhcmVudDtcbiAgICAvLyBNZXJnZSB0aGUgbGlzdCBpdGVtcyBpbnRvIGEgc2luZ2xlIGJpZyBpdGVtXG4gICAgZm9yIChsZXQgcG9zID0gcmFuZ2UuZW5kLCBpID0gcmFuZ2UuZW5kSW5kZXggLSAxLCBlID0gcmFuZ2Uuc3RhcnRJbmRleDsgaSA+IGU7IGktLSkge1xuICAgICAgICBwb3MgLT0gbGlzdC5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICAgICAgdHIuZGVsZXRlKHBvcyAtIDEsIHBvcyArIDEpO1xuICAgIH1cbiAgICBsZXQgJHN0YXJ0ID0gdHIuZG9jLnJlc29sdmUocmFuZ2Uuc3RhcnQpLCBpdGVtID0gJHN0YXJ0Lm5vZGVBZnRlcjtcbiAgICBpZiAodHIubWFwcGluZy5tYXAocmFuZ2UuZW5kKSAhPSByYW5nZS5zdGFydCArICRzdGFydC5ub2RlQWZ0ZXIubm9kZVNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYXRTdGFydCA9IHJhbmdlLnN0YXJ0SW5kZXggPT0gMCwgYXRFbmQgPSByYW5nZS5lbmRJbmRleCA9PSBsaXN0LmNoaWxkQ291bnQ7XG4gICAgbGV0IHBhcmVudCA9ICRzdGFydC5ub2RlKC0xKSwgaW5kZXhCZWZvcmUgPSAkc3RhcnQuaW5kZXgoLTEpO1xuICAgIGlmICghcGFyZW50LmNhblJlcGxhY2UoaW5kZXhCZWZvcmUgKyAoYXRTdGFydCA/IDAgOiAxKSwgaW5kZXhCZWZvcmUgKyAxLCBpdGVtLmNvbnRlbnQuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QpKSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc3RhcnQgPSAkc3RhcnQucG9zLCBlbmQgPSBzdGFydCArIGl0ZW0ubm9kZVNpemU7XG4gICAgLy8gU3RyaXAgb2ZmIHRoZSBzdXJyb3VuZGluZyBsaXN0LiBBdCB0aGUgc2lkZXMgd2hlcmUgd2UncmUgbm90IGF0XG4gICAgLy8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIGV4aXN0aW5nIGxpc3QgaXMgY2xvc2VkLiBBdCBzaWRlcyB3aGVyZVxuICAgIC8vIHRoaXMgaXMgdGhlIGVuZCwgaXQgaXMgb3ZlcndyaXR0ZW4gdG8gaXRzIGVuZC5cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydCAtIChhdFN0YXJ0ID8gMSA6IDApLCBlbmQgKyAoYXRFbmQgPyAxIDogMCksIHN0YXJ0ICsgMSwgZW5kIC0gMSwgbmV3IFNsaWNlKChhdFN0YXJ0ID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKVxuICAgICAgICAuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKSwgYXRTdGFydCA/IDAgOiAxLCBhdEVuZCA/IDAgOiAxKSwgYXRTdGFydCA/IDAgOiAxKSk7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgdG8gc2luayB0aGUgbGlzdCBpdGVtIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGRvd25cbmludG8gYW4gaW5uZXIgbGlzdC5cbiovXG5mdW5jdGlvbiBzaW5rTGlzdEl0ZW0oaXRlbVR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvLCBub2RlID0+IG5vZGUuY2hpbGRDb3VudCA+IDAgJiYgbm9kZS5maXJzdENoaWxkLnR5cGUgPT0gaXRlbVR5cGUpO1xuICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHJhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBwYXJlbnQgPSByYW5nZS5wYXJlbnQsIG5vZGVCZWZvcmUgPSBwYXJlbnQuY2hpbGQoc3RhcnRJbmRleCAtIDEpO1xuICAgICAgICBpZiAobm9kZUJlZm9yZS50eXBlICE9IGl0ZW1UeXBlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBuZXN0ZWRCZWZvcmUgPSBub2RlQmVmb3JlLmxhc3RDaGlsZCAmJiBub2RlQmVmb3JlLmxhc3RDaGlsZC50eXBlID09IHBhcmVudC50eXBlO1xuICAgICAgICAgICAgbGV0IGlubmVyID0gRnJhZ21lbnQuZnJvbShuZXN0ZWRCZWZvcmUgPyBpdGVtVHlwZS5jcmVhdGUoKSA6IG51bGwpO1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20oaXRlbVR5cGUuY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20ocGFyZW50LnR5cGUuY3JlYXRlKG51bGwsIGlubmVyKSkpKSwgbmVzdGVkQmVmb3JlID8gMyA6IDEsIDApO1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHJhbmdlLnN0YXJ0LCBhZnRlciA9IHJhbmdlLmVuZDtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKGJlZm9yZSAtIChuZXN0ZWRCZWZvcmUgPyAzIDogMSksIGFmdGVyLCBiZWZvcmUsIGFmdGVyLCBzbGljZSwgMSwgdHJ1ZSkpXG4gICAgICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGFkZExpc3ROb2RlcywgYnVsbGV0TGlzdCwgbGlmdExpc3RJdGVtLCBsaXN0SXRlbSwgb3JkZXJlZExpc3QsIHNpbmtMaXN0SXRlbSwgc3BsaXRMaXN0SXRlbSwgd3JhcEluTGlzdCB9O1xuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVTdGF0ZShjb25maWc6IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZVxufSk6IEVkaXRvclN0YXRlIHtcbiAgY29uc3QgeyBzdGF0ZSwgdHJhbnNhY3Rpb24gfSA9IGNvbmZpZ1xuICBsZXQgeyBzZWxlY3Rpb24gfSA9IHRyYW5zYWN0aW9uXG4gIGxldCB7IGRvYyB9ID0gdHJhbnNhY3Rpb25cbiAgbGV0IHsgc3RvcmVkTWFya3MgfSA9IHRyYW5zYWN0aW9uXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhcHBseTogc3RhdGUuYXBwbHkuYmluZChzdGF0ZSksXG4gICAgYXBwbHlUcmFuc2FjdGlvbjogc3RhdGUuYXBwbHlUcmFuc2FjdGlvbi5iaW5kKHN0YXRlKSxcbiAgICBmaWx0ZXJUcmFuc2FjdGlvbjogc3RhdGUuZmlsdGVyVHJhbnNhY3Rpb24sXG4gICAgcGx1Z2luczogc3RhdGUucGx1Z2lucyxcbiAgICBzY2hlbWE6IHN0YXRlLnNjaGVtYSxcbiAgICByZWNvbmZpZ3VyZTogc3RhdGUucmVjb25maWd1cmUuYmluZChzdGF0ZSksXG4gICAgdG9KU09OOiBzdGF0ZS50b0pTT04uYmluZChzdGF0ZSksXG4gICAgZ2V0IHN0b3JlZE1hcmtzKCkge1xuICAgICAgcmV0dXJuIHN0b3JlZE1hcmtzXG4gICAgfSxcbiAgICBnZXQgc2VsZWN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGVjdGlvblxuICAgIH0sXG4gICAgZ2V0IGRvYygpIHtcbiAgICAgIHJldHVybiBkb2NcbiAgICB9LFxuICAgIGdldCB0cigpIHtcbiAgICAgIHNlbGVjdGlvbiA9IHRyYW5zYWN0aW9uLnNlbGVjdGlvblxuICAgICAgZG9jID0gdHJhbnNhY3Rpb24uZG9jXG4gICAgICBzdG9yZWRNYXJrcyA9IHRyYW5zYWN0aW9uLnN0b3JlZE1hcmtzXG5cbiAgICAgIHJldHVybiB0cmFuc2FjdGlvblxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSwgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICcuL0VkaXRvci5qcydcbmltcG9ydCB7IGNyZWF0ZUNoYWluYWJsZVN0YXRlIH0gZnJvbSAnLi9oZWxwZXJzL2NyZWF0ZUNoYWluYWJsZVN0YXRlLmpzJ1xuaW1wb3J0IHtcbiAgQW55Q29tbWFuZHMsIENhbkNvbW1hbmRzLCBDaGFpbmVkQ29tbWFuZHMsIENvbW1hbmRQcm9wcywgU2luZ2xlQ29tbWFuZHMsXG59IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kTWFuYWdlciB7XG4gIGVkaXRvcjogRWRpdG9yXG5cbiAgcmF3Q29tbWFuZHM6IEFueUNvbW1hbmRzXG5cbiAgY3VzdG9tU3RhdGU/OiBFZGl0b3JTdGF0ZVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiB7IGVkaXRvcjogRWRpdG9yOyBzdGF0ZT86IEVkaXRvclN0YXRlIH0pIHtcbiAgICB0aGlzLmVkaXRvciA9IHByb3BzLmVkaXRvclxuICAgIHRoaXMucmF3Q29tbWFuZHMgPSB0aGlzLmVkaXRvci5leHRlbnNpb25NYW5hZ2VyLmNvbW1hbmRzXG4gICAgdGhpcy5jdXN0b21TdGF0ZSA9IHByb3BzLnN0YXRlXG4gIH1cblxuICBnZXQgaGFzQ3VzdG9tU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jdXN0b21TdGF0ZVxuICB9XG5cbiAgZ2V0IHN0YXRlKCk6IEVkaXRvclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21TdGF0ZSB8fCB0aGlzLmVkaXRvci5zdGF0ZVxuICB9XG5cbiAgZ2V0IGNvbW1hbmRzKCk6IFNpbmdsZUNvbW1hbmRzIHtcbiAgICBjb25zdCB7IHJhd0NvbW1hbmRzLCBlZGl0b3IsIHN0YXRlIH0gPSB0aGlzXG4gICAgY29uc3QgeyB2aWV3IH0gPSBlZGl0b3JcbiAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZVxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5idWlsZFByb3BzKHRyKVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJhd0NvbW1hbmRzKS5tYXAoKFtuYW1lLCBjb21tYW5kXSkgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2QgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGNvbW1hbmQoLi4uYXJncykocHJvcHMpXG5cbiAgICAgICAgICBpZiAoIXRyLmdldE1ldGEoJ3ByZXZlbnREaXNwYXRjaCcpICYmICF0aGlzLmhhc0N1c3RvbVN0YXRlKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjYWxsYmFja1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtuYW1lLCBtZXRob2RdXG4gICAgICB9KSxcbiAgICApIGFzIHVua25vd24gYXMgU2luZ2xlQ29tbWFuZHNcbiAgfVxuXG4gIGdldCBjaGFpbigpOiAoKSA9PiBDaGFpbmVkQ29tbWFuZHMge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLmNyZWF0ZUNoYWluKClcbiAgfVxuXG4gIGdldCBjYW4oKTogKCkgPT4gQ2FuQ29tbWFuZHMge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLmNyZWF0ZUNhbigpXG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQ2hhaW4oc3RhcnRUcj86IFRyYW5zYWN0aW9uLCBzaG91bGREaXNwYXRjaCA9IHRydWUpOiBDaGFpbmVkQ29tbWFuZHMge1xuICAgIGNvbnN0IHsgcmF3Q29tbWFuZHMsIGVkaXRvciwgc3RhdGUgfSA9IHRoaXNcbiAgICBjb25zdCB7IHZpZXcgfSA9IGVkaXRvclxuICAgIGNvbnN0IGNhbGxiYWNrczogYm9vbGVhbltdID0gW11cbiAgICBjb25zdCBoYXNTdGFydFRyYW5zYWN0aW9uID0gISFzdGFydFRyXG4gICAgY29uc3QgdHIgPSBzdGFydFRyIHx8IHN0YXRlLnRyXG5cbiAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFoYXNTdGFydFRyYW5zYWN0aW9uXG4gICAgICAgICYmIHNob3VsZERpc3BhdGNoXG4gICAgICAgICYmICF0ci5nZXRNZXRhKCdwcmV2ZW50RGlzcGF0Y2gnKVxuICAgICAgICAmJiAhdGhpcy5oYXNDdXN0b21TdGF0ZVxuICAgICAgKSB7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYWxsYmFja3MuZXZlcnkoY2FsbGJhY2sgPT4gY2FsbGJhY2sgPT09IHRydWUpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhaW4gPSB7XG4gICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJhd0NvbW1hbmRzKS5tYXAoKFtuYW1lLCBjb21tYW5kXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoYWluZWRDb21tYW5kID0gKC4uLmFyZ3M6IG5ldmVyW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5idWlsZFByb3BzKHRyLCBzaG91bGREaXNwYXRjaClcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gY29tbWFuZCguLi5hcmdzKShwcm9wcylcblxuICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG5cbiAgICAgICAgICAgIHJldHVybiBjaGFpblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbbmFtZSwgY2hhaW5lZENvbW1hbmRdXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIHJ1bixcbiAgICB9IGFzIHVua25vd24gYXMgQ2hhaW5lZENvbW1hbmRzXG5cbiAgICByZXR1cm4gY2hhaW5cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVDYW4oc3RhcnRUcj86IFRyYW5zYWN0aW9uKTogQ2FuQ29tbWFuZHMge1xuICAgIGNvbnN0IHsgcmF3Q29tbWFuZHMsIHN0YXRlIH0gPSB0aGlzXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBmYWxzZVxuICAgIGNvbnN0IHRyID0gc3RhcnRUciB8fCBzdGF0ZS50clxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5idWlsZFByb3BzKHRyLCBkaXNwYXRjaClcbiAgICBjb25zdCBmb3JtYXR0ZWRDb21tYW5kcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJhd0NvbW1hbmRzKS5tYXAoKFtuYW1lLCBjb21tYW5kXSkgPT4ge1xuICAgICAgICByZXR1cm4gW25hbWUsICguLi5hcmdzOiBuZXZlcltdKSA9PiBjb21tYW5kKC4uLmFyZ3MpKHsgLi4ucHJvcHMsIGRpc3BhdGNoOiB1bmRlZmluZWQgfSldXG4gICAgICB9KSxcbiAgICApIGFzIHVua25vd24gYXMgU2luZ2xlQ29tbWFuZHNcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5mb3JtYXR0ZWRDb21tYW5kcyxcbiAgICAgIGNoYWluOiAoKSA9PiB0aGlzLmNyZWF0ZUNoYWluKHRyLCBkaXNwYXRjaCksXG4gICAgfSBhcyBDYW5Db21tYW5kc1xuICB9XG5cbiAgcHVibGljIGJ1aWxkUHJvcHModHI6IFRyYW5zYWN0aW9uLCBzaG91bGREaXNwYXRjaCA9IHRydWUpOiBDb21tYW5kUHJvcHMge1xuICAgIGNvbnN0IHsgcmF3Q29tbWFuZHMsIGVkaXRvciwgc3RhdGUgfSA9IHRoaXNcbiAgICBjb25zdCB7IHZpZXcgfSA9IGVkaXRvclxuXG4gICAgY29uc3QgcHJvcHM6IENvbW1hbmRQcm9wcyA9IHtcbiAgICAgIHRyLFxuICAgICAgZWRpdG9yLFxuICAgICAgdmlldyxcbiAgICAgIHN0YXRlOiBjcmVhdGVDaGFpbmFibGVTdGF0ZSh7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICB0cmFuc2FjdGlvbjogdHIsXG4gICAgICB9KSxcbiAgICAgIGRpc3BhdGNoOiBzaG91bGREaXNwYXRjaCA/ICgpID0+IHVuZGVmaW5lZCA6IHVuZGVmaW5lZCxcbiAgICAgIGNoYWluOiAoKSA9PiB0aGlzLmNyZWF0ZUNoYWluKHRyLCBzaG91bGREaXNwYXRjaCksXG4gICAgICBjYW46ICgpID0+IHRoaXMuY3JlYXRlQ2FuKHRyKSxcbiAgICAgIGdldCBjb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhyYXdDb21tYW5kcykubWFwKChbbmFtZSwgY29tbWFuZF0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbbmFtZSwgKC4uLmFyZ3M6IG5ldmVyW10pID0+IGNvbW1hbmQoLi4uYXJncykocHJvcHMpXVxuICAgICAgICAgIH0pLFxuICAgICAgICApIGFzIHVua25vd24gYXMgU2luZ2xlQ29tbWFuZHNcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzXG4gIH1cbn1cbiIsICJ0eXBlIFN0cmluZ0tleU9mPFQ+ID0gRXh0cmFjdDxrZXlvZiBULCBzdHJpbmc+XG50eXBlIENhbGxiYWNrVHlwZTxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleU9mPFQ+LFxuPiA9IFRbRXZlbnROYW1lXSBleHRlbmRzIGFueVtdID8gVFtFdmVudE5hbWVdIDogW1RbRXZlbnROYW1lXV1cbnR5cGUgQ2FsbGJhY2tGdW5jdGlvbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleU9mPFQ+LFxuPiA9ICguLi5wcm9wczogQ2FsbGJhY2tUeXBlPFQsIEV2ZW50TmFtZT4pID0+IGFueVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG5cbiAgcHJpdmF0ZSBjYWxsYmFja3M6IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb25bXSB9ID0ge31cblxuICBwdWJsaWMgb248RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5T2Y8VD4+KGV2ZW50OiBFdmVudE5hbWUsIGZuOiBDYWxsYmFja0Z1bmN0aW9uPFQsIEV2ZW50TmFtZT4pOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2tzW2V2ZW50XSkge1xuICAgICAgdGhpcy5jYWxsYmFja3NbZXZlbnRdID0gW11cbiAgICB9XG5cbiAgICB0aGlzLmNhbGxiYWNrc1tldmVudF0ucHVzaChmbilcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdDxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlPZjxUPj4oZXZlbnQ6IEV2ZW50TmFtZSwgLi4uYXJnczogQ2FsbGJhY2tUeXBlPFQsIEV2ZW50TmFtZT4pOiB0aGlzIHtcbiAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLmNhbGxiYWNrc1tldmVudF1cblxuICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleU9mPFQ+PihldmVudDogRXZlbnROYW1lLCBmbj86IENhbGxiYWNrRnVuY3Rpb248VCwgRXZlbnROYW1lPik6IHRoaXMge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzW2V2ZW50XVxuXG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzW2V2ZW50XSA9IGNhbGxiYWNrcy5maWx0ZXIoY2FsbGJhY2sgPT4gY2FsbGJhY2sgIT09IGZuKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2V2ZW50XVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlQWxsTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge31cbiAgfVxufVxuIiwgImltcG9ydCB7IEFueUV4dGVuc2lvbiwgTWF5YmVUaGlzUGFyYW1ldGVyVHlwZSwgUmVtb3ZlVGhpcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uRmllbGQ8VCA9IGFueT4oXG4gIGV4dGVuc2lvbjogQW55RXh0ZW5zaW9uLFxuICBmaWVsZDogc3RyaW5nLFxuICBjb250ZXh0PzogT21pdDxNYXliZVRoaXNQYXJhbWV0ZXJUeXBlPFQ+LCAncGFyZW50Jz4sXG4pOiBSZW1vdmVUaGlzPFQ+IHtcblxuICBpZiAoZXh0ZW5zaW9uLmNvbmZpZ1tmaWVsZF0gPT09IHVuZGVmaW5lZCAmJiBleHRlbnNpb24ucGFyZW50KSB7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbi5wYXJlbnQsIGZpZWxkLCBjb250ZXh0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiBleHRlbnNpb24uY29uZmlnW2ZpZWxkXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gZXh0ZW5zaW9uLmNvbmZpZ1tmaWVsZF0uYmluZCh7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgcGFyZW50OiBleHRlbnNpb24ucGFyZW50XG4gICAgICAgID8gZ2V0RXh0ZW5zaW9uRmllbGQoZXh0ZW5zaW9uLnBhcmVudCwgZmllbGQsIGNvbnRleHQpXG4gICAgICAgIDogbnVsbCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICByZXR1cm4gZXh0ZW5zaW9uLmNvbmZpZ1tmaWVsZF1cbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9FeHRlbnNpb24uanMnXG5pbXBvcnQgeyBNYXJrIH0gZnJvbSAnLi4vTWFyay5qcydcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuLi9Ob2RlLmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRFeHRlbnNpb25zKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpIHtcbiAgY29uc3QgYmFzZUV4dGVuc2lvbnMgPSBleHRlbnNpb25zLmZpbHRlcihleHRlbnNpb24gPT4gZXh0ZW5zaW9uLnR5cGUgPT09ICdleHRlbnNpb24nKSBhcyBFeHRlbnNpb25bXVxuICBjb25zdCBub2RlRXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMuZmlsdGVyKGV4dGVuc2lvbiA9PiBleHRlbnNpb24udHlwZSA9PT0gJ25vZGUnKSBhcyBOb2RlW11cbiAgY29uc3QgbWFya0V4dGVuc2lvbnMgPSBleHRlbnNpb25zLmZpbHRlcihleHRlbnNpb24gPT4gZXh0ZW5zaW9uLnR5cGUgPT09ICdtYXJrJykgYXMgTWFya1tdXG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlRXh0ZW5zaW9ucyxcbiAgICBub2RlRXh0ZW5zaW9ucyxcbiAgICBtYXJrRXh0ZW5zaW9ucyxcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtDb25maWcsIE5vZGVDb25maWcgfSBmcm9tICcuLi9pbmRleC5qcydcbmltcG9ydCB7XG4gIEFueUNvbmZpZyxcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVzLFxuICBFeHRlbnNpb25BdHRyaWJ1dGUsXG4gIEV4dGVuc2lvbnMsXG4gIEdsb2JhbEF0dHJpYnV0ZXMsXG59IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgc3BsaXRFeHRlbnNpb25zIH0gZnJvbSAnLi9zcGxpdEV4dGVuc2lvbnMuanMnXG5cbi8qKlxuICogR2V0IGEgbGlzdCBvZiBhbGwgZXh0ZW5zaW9uIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBgYWRkQXR0cmlidXRlYCBhbmQgYGFkZEdsb2JhbEF0dHJpYnV0ZWAuXG4gKiBAcGFyYW0gZXh0ZW5zaW9ucyBMaXN0IG9mIGV4dGVuc2lvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBFeHRlbnNpb25zKTogRXh0ZW5zaW9uQXR0cmlidXRlW10ge1xuICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzOiBFeHRlbnNpb25BdHRyaWJ1dGVbXSA9IFtdXG4gIGNvbnN0IHsgbm9kZUV4dGVuc2lvbnMsIG1hcmtFeHRlbnNpb25zIH0gPSBzcGxpdEV4dGVuc2lvbnMoZXh0ZW5zaW9ucylcbiAgY29uc3Qgbm9kZUFuZE1hcmtFeHRlbnNpb25zID0gWy4uLm5vZGVFeHRlbnNpb25zLCAuLi5tYXJrRXh0ZW5zaW9uc11cbiAgY29uc3QgZGVmYXVsdEF0dHJpYnV0ZTogUmVxdWlyZWQ8QXR0cmlidXRlPiA9IHtcbiAgICBkZWZhdWx0OiBudWxsLFxuICAgIHJlbmRlcmVkOiB0cnVlLFxuICAgIHJlbmRlckhUTUw6IG51bGwsXG4gICAgcGFyc2VIVE1MOiBudWxsLFxuICAgIGtlZXBPblNwbGl0OiB0cnVlLFxuICAgIGlzUmVxdWlyZWQ6IGZhbHNlLFxuICB9XG5cbiAgZXh0ZW5zaW9ucy5mb3JFYWNoKGV4dGVuc2lvbiA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgICB9XG5cbiAgICBjb25zdCBhZGRHbG9iYWxBdHRyaWJ1dGVzID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRHbG9iYWxBdHRyaWJ1dGVzJ10+KFxuICAgICAgZXh0ZW5zaW9uLFxuICAgICAgJ2FkZEdsb2JhbEF0dHJpYnV0ZXMnLFxuICAgICAgY29udGV4dCxcbiAgICApXG5cbiAgICBpZiAoIWFkZEdsb2JhbEF0dHJpYnV0ZXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSBgYXMgR2xvYmFsQXR0cmlidXRlc2BcbiAgICBjb25zdCBnbG9iYWxBdHRyaWJ1dGVzID0gYWRkR2xvYmFsQXR0cmlidXRlcygpIGFzIEdsb2JhbEF0dHJpYnV0ZXNcblxuICAgIGdsb2JhbEF0dHJpYnV0ZXMuZm9yRWFjaChnbG9iYWxBdHRyaWJ1dGUgPT4ge1xuICAgICAgZ2xvYmFsQXR0cmlidXRlLnR5cGVzLmZvckVhY2godHlwZSA9PiB7XG4gICAgICAgIE9iamVjdFxuICAgICAgICAgIC5lbnRyaWVzKGdsb2JhbEF0dHJpYnV0ZS5hdHRyaWJ1dGVzKVxuICAgICAgICAgIC5mb3JFYWNoKChbbmFtZSwgYXR0cmlidXRlXSkgPT4ge1xuICAgICAgICAgICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgYXR0cmlidXRlOiB7XG4gICAgICAgICAgICAgICAgLi4uZGVmYXVsdEF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgbm9kZUFuZE1hcmtFeHRlbnNpb25zLmZvckVhY2goZXh0ZW5zaW9uID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgIH1cblxuICAgIGNvbnN0IGFkZEF0dHJpYnV0ZXMgPSBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydhZGRBdHRyaWJ1dGVzJ10gfCBNYXJrQ29uZmlnWydhZGRBdHRyaWJ1dGVzJ10+KFxuICAgICAgZXh0ZW5zaW9uLFxuICAgICAgJ2FkZEF0dHJpYnV0ZXMnLFxuICAgICAgY29udGV4dCxcbiAgICApXG5cbiAgICBpZiAoIWFkZEF0dHJpYnV0ZXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSBgYXMgQXR0cmlidXRlc2BcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gYWRkQXR0cmlidXRlcygpIGFzIEF0dHJpYnV0ZXNcblxuICAgIE9iamVjdFxuICAgICAgLmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAgIC5mb3JFYWNoKChbbmFtZSwgYXR0cmlidXRlXSkgPT4ge1xuICAgICAgICBjb25zdCBtZXJnZWRBdHRyID0ge1xuICAgICAgICAgIC4uLmRlZmF1bHRBdHRyaWJ1dGUsXG4gICAgICAgICAgLi4uYXR0cmlidXRlLFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtZXJnZWRBdHRyPy5kZWZhdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbWVyZ2VkQXR0ci5kZWZhdWx0ID0gbWVyZ2VkQXR0ci5kZWZhdWx0KClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXJnZWRBdHRyPy5pc1JlcXVpcmVkICYmIG1lcmdlZEF0dHI/LmRlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSBtZXJnZWRBdHRyLmRlZmF1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBhdHRyaWJ1dGU6IG1lcmdlZEF0dHIsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9KVxuXG4gIHJldHVybiBleHRlbnNpb25BdHRyaWJ1dGVzXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUsIFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlVHlwZShuYW1lT3JUeXBlOiBzdHJpbmcgfCBOb2RlVHlwZSwgc2NoZW1hOiBTY2hlbWEpOiBOb2RlVHlwZSB7XG4gIGlmICh0eXBlb2YgbmFtZU9yVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXNjaGVtYS5ub2Rlc1tuYW1lT3JUeXBlXSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBUaGVyZSBpcyBubyBub2RlIHR5cGUgbmFtZWQgJyR7bmFtZU9yVHlwZX0nLiBNYXliZSB5b3UgZm9yZ290IHRvIGFkZCB0aGUgZXh0ZW5zaW9uP2AsXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNjaGVtYS5ub2Rlc1tuYW1lT3JUeXBlXVxuICB9XG5cbiAgcmV0dXJuIG5hbWVPclR5cGVcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbWVyZ2VBdHRyaWJ1dGVzKC4uLm9iamVjdHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICByZXR1cm4gb2JqZWN0c1xuICAgIC5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pXG4gICAgLnJlZHVjZSgoaXRlbXMsIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IG1lcmdlZEF0dHJpYnV0ZXMgPSB7IC4uLml0ZW1zIH1cblxuICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG1lcmdlZEF0dHJpYnV0ZXNba2V5XVxuXG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgbWVyZ2VkQXR0cmlidXRlc1trZXldID0gdmFsdWVcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ2xhc3Nlczogc3RyaW5nW10gPSB2YWx1ZSA/IHZhbHVlLnNwbGl0KCcgJykgOiBbXVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhc3Nlczogc3RyaW5nW10gPSBtZXJnZWRBdHRyaWJ1dGVzW2tleV0gPyBtZXJnZWRBdHRyaWJ1dGVzW2tleV0uc3BsaXQoJyAnKSA6IFtdXG5cbiAgICAgICAgICBjb25zdCBpbnNlcnRDbGFzc2VzID0gdmFsdWVDbGFzc2VzLmZpbHRlcihcbiAgICAgICAgICAgIHZhbHVlQ2xhc3MgPT4gIWV4aXN0aW5nQ2xhc3Nlcy5pbmNsdWRlcyh2YWx1ZUNsYXNzKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBtZXJnZWRBdHRyaWJ1dGVzW2tleV0gPSBbLi4uZXhpc3RpbmdDbGFzc2VzLCAuLi5pbnNlcnRDbGFzc2VzXS5qb2luKCcgJylcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICBtZXJnZWRBdHRyaWJ1dGVzW2tleV0gPSBbbWVyZ2VkQXR0cmlidXRlc1trZXldLCB2YWx1ZV0uam9pbignOyAnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lcmdlZEF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBtZXJnZWRBdHRyaWJ1dGVzXG4gICAgfSwge30pXG59XG4iLCAiaW1wb3J0IHsgTWFyaywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IEV4dGVuc2lvbkF0dHJpYnV0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSAnLi4vdXRpbGl0aWVzL21lcmdlQXR0cmlidXRlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbmRlcmVkQXR0cmlidXRlcyhcbiAgbm9kZU9yTWFyazogTm9kZSB8IE1hcmssXG4gIGV4dGVuc2lvbkF0dHJpYnV0ZXM6IEV4dGVuc2lvbkF0dHJpYnV0ZVtdLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIHJldHVybiBleHRlbnNpb25BdHRyaWJ1dGVzXG4gICAgLmZpbHRlcihpdGVtID0+IGl0ZW0uYXR0cmlidXRlLnJlbmRlcmVkKVxuICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0uYXR0cmlidXRlLnJlbmRlckhUTUwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbaXRlbS5uYW1lXTogbm9kZU9yTWFyay5hdHRyc1tpdGVtLm5hbWVdLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtLmF0dHJpYnV0ZS5yZW5kZXJIVE1MKG5vZGVPck1hcmsuYXR0cnMpIHx8IHt9XG4gICAgfSlcbiAgICAucmVkdWNlKChhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUpID0+IG1lcmdlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUpLCB7fSlcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZTogYW55KTogdmFsdWUgaXMgRnVuY3Rpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG59XG4iLCAiaW1wb3J0IHsgTWF5YmVSZXR1cm5UeXBlIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJ1xuXG4vKipcbiAqIE9wdGlvbmFsbHkgY2FsbHMgYHZhbHVlYCBhcyBhIGZ1bmN0aW9uLlxuICogT3RoZXJ3aXNlIGl0IGlzIHJldHVybmVkIGRpcmVjdGx5LlxuICogQHBhcmFtIHZhbHVlIEZ1bmN0aW9uIG9yIGFueSB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGNvbnRleHQgdG8gYmluZCB0byBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwcm9wcyBPcHRpb25hbCBwcm9wcyB0byBwYXNzIHRvIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsbE9yUmV0dXJuPFQ+KHZhbHVlOiBULCBjb250ZXh0OiBhbnkgPSB1bmRlZmluZWQsIC4uLnByb3BzOiBhbnlbXSk6IE1heWJlUmV0dXJuVHlwZTxUPiB7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdmFsdWUuYmluZChjb250ZXh0KSguLi5wcm9wcylcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUoLi4ucHJvcHMpXG4gIH1cblxuICByZXR1cm4gdmFsdWUgYXMgTWF5YmVSZXR1cm5UeXBlPFQ+XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlPYmplY3QodmFsdWUgPSB7fSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWU6IGFueSk6IGFueSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUubWF0Y2goL15bKy1dPyg/OlxcZCpcXC4pP1xcZCskLykpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cbiIsICJpbXBvcnQgeyBQYXJzZVJ1bGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb25BdHRyaWJ1dGUgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGZyb21TdHJpbmcgfSBmcm9tICcuLi91dGlsaXRpZXMvZnJvbVN0cmluZy5qcydcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1lcmdlcyBleHRlbnNpb24gYXR0cmlidXRlcyBpbnRvIHBhcnNlcnVsZSBhdHRyaWJ1dGVzIChgYXR0cnNgIG9yIGBnZXRBdHRyc2ApLlxuICogQ2FuY2VscyB3aGVuIGBnZXRBdHRyc2AgcmV0dXJuZWQgYGZhbHNlYC5cbiAqIEBwYXJhbSBwYXJzZVJ1bGUgUHJvc2VNaXJyb3IgUGFyc2VSdWxlXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQXR0cmlidXRlcyBMaXN0IG9mIGF0dHJpYnV0ZXMgdG8gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RFeHRlbnNpb25BdHRyaWJ1dGVzVG9QYXJzZVJ1bGUoXG4gIHBhcnNlUnVsZTogUGFyc2VSdWxlLFxuICBleHRlbnNpb25BdHRyaWJ1dGVzOiBFeHRlbnNpb25BdHRyaWJ1dGVbXSxcbik6IFBhcnNlUnVsZSB7XG4gIGlmIChwYXJzZVJ1bGUuc3R5bGUpIHtcbiAgICByZXR1cm4gcGFyc2VSdWxlXG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnBhcnNlUnVsZSxcbiAgICBnZXRBdHRyczogbm9kZSA9PiB7XG4gICAgICBjb25zdCBvbGRBdHRyaWJ1dGVzID0gcGFyc2VSdWxlLmdldEF0dHJzID8gcGFyc2VSdWxlLmdldEF0dHJzKG5vZGUpIDogcGFyc2VSdWxlLmF0dHJzXG5cbiAgICAgIGlmIChvbGRBdHRyaWJ1dGVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IGV4dGVuc2lvbkF0dHJpYnV0ZXMucmVkdWNlKChpdGVtcywgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0uYXR0cmlidXRlLnBhcnNlSFRNTFxuICAgICAgICAgID8gaXRlbS5hdHRyaWJ1dGUucGFyc2VIVE1MKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgOiBmcm9tU3RyaW5nKChub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoaXRlbS5uYW1lKSlcblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBpdGVtc1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtcyxcbiAgICAgICAgICBbaXRlbS5uYW1lXTogdmFsdWUsXG4gICAgICAgIH1cbiAgICAgIH0sIHt9KVxuXG4gICAgICByZXR1cm4geyAuLi5vbGRBdHRyaWJ1dGVzLCAuLi5uZXdBdHRyaWJ1dGVzIH1cbiAgICB9LFxuICB9XG59XG4iLCAiaW1wb3J0IHsgTWFya1NwZWMsIE5vZGVTcGVjLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBFZGl0b3IsIE1hcmtDb25maWcsIE5vZGVDb25maWcgfSBmcm9tICcuLi9pbmRleC5qcydcbmltcG9ydCB7IEFueUNvbmZpZywgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IGlzRW1wdHlPYmplY3QgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNFbXB0eU9iamVjdC5qcydcbmltcG9ydCB7IGdldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucyB9IGZyb20gJy4vZ2V0QXR0cmlidXRlc0Zyb21FeHRlbnNpb25zLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZXRSZW5kZXJlZEF0dHJpYnV0ZXMuanMnXG5pbXBvcnQgeyBpbmplY3RFeHRlbnNpb25BdHRyaWJ1dGVzVG9QYXJzZVJ1bGUgfSBmcm9tICcuL2luamVjdEV4dGVuc2lvbkF0dHJpYnV0ZXNUb1BhcnNlUnVsZS5qcydcbmltcG9ydCB7IHNwbGl0RXh0ZW5zaW9ucyB9IGZyb20gJy4vc3BsaXRFeHRlbnNpb25zLmpzJ1xuXG5mdW5jdGlvbiBjbGVhblVwU2NoZW1hSXRlbTxUPihkYXRhOiBUKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAnYXR0cnMnICYmIGlzRW1wdHlPYmplY3QodmFsdWUgYXMge30gfCB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgIH0pLFxuICApIGFzIFRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYUJ5UmVzb2x2ZWRFeHRlbnNpb25zKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsIGVkaXRvcj86IEVkaXRvcik6IFNjaGVtYSB7XG4gIGNvbnN0IGFsbEF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzRnJvbUV4dGVuc2lvbnMoZXh0ZW5zaW9ucylcbiAgY29uc3QgeyBub2RlRXh0ZW5zaW9ucywgbWFya0V4dGVuc2lvbnMgfSA9IHNwbGl0RXh0ZW5zaW9ucyhleHRlbnNpb25zKVxuICBjb25zdCB0b3BOb2RlID0gbm9kZUV4dGVuc2lvbnMuZmluZChleHRlbnNpb24gPT4gZ2V0RXh0ZW5zaW9uRmllbGQoZXh0ZW5zaW9uLCAndG9wTm9kZScpKT8ubmFtZVxuXG4gIGNvbnN0IG5vZGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIG5vZGVFeHRlbnNpb25zLm1hcChleHRlbnNpb24gPT4ge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uQXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXMuZmlsdGVyKFxuICAgICAgICBhdHRyaWJ1dGUgPT4gYXR0cmlidXRlLnR5cGUgPT09IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgKVxuICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgICAgICAgZWRpdG9yLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRyYU5vZGVGaWVsZHMgPSBleHRlbnNpb25zLnJlZHVjZSgoZmllbGRzLCBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4dGVuZE5vZGVTY2hlbWEgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2V4dGVuZE5vZGVTY2hlbWEnXT4oXG4gICAgICAgICAgZSxcbiAgICAgICAgICAnZXh0ZW5kTm9kZVNjaGVtYScsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIC4uLihleHRlbmROb2RlU2NoZW1hID8gZXh0ZW5kTm9kZVNjaGVtYShleHRlbnNpb24pIDoge30pLFxuICAgICAgICB9XG4gICAgICB9LCB7fSlcblxuICAgICAgY29uc3Qgc2NoZW1hOiBOb2RlU3BlYyA9IGNsZWFuVXBTY2hlbWFJdGVtKHtcbiAgICAgICAgLi4uZXh0cmFOb2RlRmllbGRzLFxuICAgICAgICBjb250ZW50OiBjYWxsT3JSZXR1cm4oXG4gICAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snY29udGVudCddPihleHRlbnNpb24sICdjb250ZW50JywgY29udGV4dCksXG4gICAgICAgICksXG4gICAgICAgIG1hcmtzOiBjYWxsT3JSZXR1cm4oZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snbWFya3MnXT4oZXh0ZW5zaW9uLCAnbWFya3MnLCBjb250ZXh0KSksXG4gICAgICAgIGdyb3VwOiBjYWxsT3JSZXR1cm4oZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snZ3JvdXAnXT4oZXh0ZW5zaW9uLCAnZ3JvdXAnLCBjb250ZXh0KSksXG4gICAgICAgIGlubGluZTogY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2lubGluZSddPihleHRlbnNpb24sICdpbmxpbmUnLCBjb250ZXh0KSksXG4gICAgICAgIGF0b206IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydhdG9tJ10+KGV4dGVuc2lvbiwgJ2F0b20nLCBjb250ZXh0KSksXG4gICAgICAgIHNlbGVjdGFibGU6IGNhbGxPclJldHVybihcbiAgICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydzZWxlY3RhYmxlJ10+KGV4dGVuc2lvbiwgJ3NlbGVjdGFibGUnLCBjb250ZXh0KSxcbiAgICAgICAgKSxcbiAgICAgICAgZHJhZ2dhYmxlOiBjYWxsT3JSZXR1cm4oXG4gICAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snZHJhZ2dhYmxlJ10+KGV4dGVuc2lvbiwgJ2RyYWdnYWJsZScsIGNvbnRleHQpLFxuICAgICAgICApLFxuICAgICAgICBjb2RlOiBjYWxsT3JSZXR1cm4oZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snY29kZSddPihleHRlbnNpb24sICdjb2RlJywgY29udGV4dCkpLFxuICAgICAgICBkZWZpbmluZzogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2RlZmluaW5nJ10+KGV4dGVuc2lvbiwgJ2RlZmluaW5nJywgY29udGV4dCksXG4gICAgICAgICksXG4gICAgICAgIGlzb2xhdGluZzogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2lzb2xhdGluZyddPihleHRlbnNpb24sICdpc29sYXRpbmcnLCBjb250ZXh0KSxcbiAgICAgICAgKSxcbiAgICAgICAgYXR0cnM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBleHRlbnNpb25BdHRyaWJ1dGVzLm1hcChleHRlbnNpb25BdHRyaWJ1dGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFtleHRlbnNpb25BdHRyaWJ1dGUubmFtZSwgeyBkZWZhdWx0OiBleHRlbnNpb25BdHRyaWJ1dGU/LmF0dHJpYnV0ZT8uZGVmYXVsdCB9XVxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcGFyc2VIVE1MID0gY2FsbE9yUmV0dXJuKFxuICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydwYXJzZUhUTUwnXT4oZXh0ZW5zaW9uLCAncGFyc2VIVE1MJywgY29udGV4dCksXG4gICAgICApXG5cbiAgICAgIGlmIChwYXJzZUhUTUwpIHtcbiAgICAgICAgc2NoZW1hLnBhcnNlRE9NID0gcGFyc2VIVE1MLm1hcChwYXJzZVJ1bGUgPT4gaW5qZWN0RXh0ZW5zaW9uQXR0cmlidXRlc1RvUGFyc2VSdWxlKHBhcnNlUnVsZSwgZXh0ZW5zaW9uQXR0cmlidXRlcykpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbmRlckhUTUwgPSBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydyZW5kZXJIVE1MJ10+KFxuICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICdyZW5kZXJIVE1MJyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIClcblxuICAgICAgaWYgKHJlbmRlckhUTUwpIHtcbiAgICAgICAgc2NoZW1hLnRvRE9NID0gbm9kZSA9PiByZW5kZXJIVE1MKHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzOiBnZXRSZW5kZXJlZEF0dHJpYnV0ZXMobm9kZSwgZXh0ZW5zaW9uQXR0cmlidXRlcyksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbmRlclRleHQgPSBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydyZW5kZXJUZXh0J10+KFxuICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICdyZW5kZXJUZXh0JyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIClcblxuICAgICAgaWYgKHJlbmRlclRleHQpIHtcbiAgICAgICAgc2NoZW1hLnRvVGV4dCA9IHJlbmRlclRleHRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtleHRlbnNpb24ubmFtZSwgc2NoZW1hXVxuICAgIH0pLFxuICApXG5cbiAgY29uc3QgbWFya3MgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgbWFya0V4dGVuc2lvbnMubWFwKGV4dGVuc2lvbiA9PiB7XG4gICAgICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzID0gYWxsQXR0cmlidXRlcy5maWx0ZXIoXG4gICAgICAgIGF0dHJpYnV0ZSA9PiBhdHRyaWJ1dGUudHlwZSA9PT0gZXh0ZW5zaW9uLm5hbWUsXG4gICAgICApXG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgICAgICBlZGl0b3IsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dHJhTWFya0ZpZWxkcyA9IGV4dGVuc2lvbnMucmVkdWNlKChmaWVsZHMsIGUpID0+IHtcbiAgICAgICAgY29uc3QgZXh0ZW5kTWFya1NjaGVtYSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snZXh0ZW5kTWFya1NjaGVtYSddPihcbiAgICAgICAgICBlLFxuICAgICAgICAgICdleHRlbmRNYXJrU2NoZW1hJyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgLi4uKGV4dGVuZE1hcmtTY2hlbWEgPyBleHRlbmRNYXJrU2NoZW1hKGV4dGVuc2lvbikgOiB7fSksXG4gICAgICAgIH1cbiAgICAgIH0sIHt9KVxuXG4gICAgICBjb25zdCBzY2hlbWE6IE1hcmtTcGVjID0gY2xlYW5VcFNjaGVtYUl0ZW0oe1xuICAgICAgICAuLi5leHRyYU1hcmtGaWVsZHMsXG4gICAgICAgIGluY2x1c2l2ZTogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE1hcmtDb25maWdbJ2luY2x1c2l2ZSddPihleHRlbnNpb24sICdpbmNsdXNpdmUnLCBjb250ZXh0KSxcbiAgICAgICAgKSxcbiAgICAgICAgZXhjbHVkZXM6IGNhbGxPclJldHVybihcbiAgICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxNYXJrQ29uZmlnWydleGNsdWRlcyddPihleHRlbnNpb24sICdleGNsdWRlcycsIGNvbnRleHQpLFxuICAgICAgICApLFxuICAgICAgICBncm91cDogY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkPE1hcmtDb25maWdbJ2dyb3VwJ10+KGV4dGVuc2lvbiwgJ2dyb3VwJywgY29udGV4dCkpLFxuICAgICAgICBzcGFubmluZzogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE1hcmtDb25maWdbJ3NwYW5uaW5nJ10+KGV4dGVuc2lvbiwgJ3NwYW5uaW5nJywgY29udGV4dCksXG4gICAgICAgICksXG4gICAgICAgIGNvZGU6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZDxNYXJrQ29uZmlnWydjb2RlJ10+KGV4dGVuc2lvbiwgJ2NvZGUnLCBjb250ZXh0KSksXG4gICAgICAgIGF0dHJzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5tYXAoZXh0ZW5zaW9uQXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbZXh0ZW5zaW9uQXR0cmlidXRlLm5hbWUsIHsgZGVmYXVsdDogZXh0ZW5zaW9uQXR0cmlidXRlPy5hdHRyaWJ1dGU/LmRlZmF1bHQgfV1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHBhcnNlSFRNTCA9IGNhbGxPclJldHVybihcbiAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8TWFya0NvbmZpZ1sncGFyc2VIVE1MJ10+KGV4dGVuc2lvbiwgJ3BhcnNlSFRNTCcsIGNvbnRleHQpLFxuICAgICAgKVxuXG4gICAgICBpZiAocGFyc2VIVE1MKSB7XG4gICAgICAgIHNjaGVtYS5wYXJzZURPTSA9IHBhcnNlSFRNTC5tYXAocGFyc2VSdWxlID0+IGluamVjdEV4dGVuc2lvbkF0dHJpYnV0ZXNUb1BhcnNlUnVsZShwYXJzZVJ1bGUsIGV4dGVuc2lvbkF0dHJpYnV0ZXMpKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZW5kZXJIVE1MID0gZ2V0RXh0ZW5zaW9uRmllbGQ8TWFya0NvbmZpZ1sncmVuZGVySFRNTCddPihcbiAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAncmVuZGVySFRNTCcsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIGlmIChyZW5kZXJIVE1MKSB7XG4gICAgICAgIHNjaGVtYS50b0RPTSA9IG1hcmsgPT4gcmVuZGVySFRNTCh7XG4gICAgICAgICAgbWFyayxcbiAgICAgICAgICBIVE1MQXR0cmlidXRlczogZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzKG1hcmssIGV4dGVuc2lvbkF0dHJpYnV0ZXMpLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2V4dGVuc2lvbi5uYW1lLCBzY2hlbWFdXG4gICAgfSksXG4gIClcblxuICByZXR1cm4gbmV3IFNjaGVtYSh7XG4gICAgdG9wTm9kZSxcbiAgICBub2RlcyxcbiAgICBtYXJrcyxcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBNYXJrVHlwZSwgTm9kZVR5cGUsIFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFUeXBlQnlOYW1lKG5hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWEpOiBOb2RlVHlwZSB8IE1hcmtUeXBlIHwgbnVsbCB7XG4gIHJldHVybiBzY2hlbWEubm9kZXNbbmFtZV0gfHwgc2NoZW1hLm1hcmtzW25hbWVdIHx8IG51bGxcbn1cbiIsICJpbXBvcnQgeyBBbnlFeHRlbnNpb24sIEVuYWJsZVJ1bGVzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V4dGVuc2lvblJ1bGVzRW5hYmxlZChleHRlbnNpb246IEFueUV4dGVuc2lvbiwgZW5hYmxlZDogRW5hYmxlUnVsZXMpOiBib29sZWFuIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZW5hYmxlZCkpIHtcbiAgICByZXR1cm4gZW5hYmxlZC5zb21lKGVuYWJsZWRFeHRlbnNpb24gPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBlbmFibGVkRXh0ZW5zaW9uID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGVuYWJsZWRFeHRlbnNpb25cbiAgICAgICAgOiBlbmFibGVkRXh0ZW5zaW9uLm5hbWVcblxuICAgICAgcmV0dXJuIG5hbWUgPT09IGV4dGVuc2lvbi5uYW1lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBlbmFibGVkXG59XG4iLCAiaW1wb3J0IHsgUmVzb2x2ZWRQb3MgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dENvbnRlbnRGcm9tTm9kZXMgPSAoJGZyb206IFJlc29sdmVkUG9zLCBtYXhNYXRjaCA9IDUwMCkgPT4ge1xuICBsZXQgdGV4dEJlZm9yZSA9ICcnXG5cbiAgY29uc3Qgc2xpY2VFbmRQb3MgPSAkZnJvbS5wYXJlbnRPZmZzZXRcblxuICAkZnJvbS5wYXJlbnQubm9kZXNCZXR3ZWVuKFxuICAgIE1hdGgubWF4KDAsIHNsaWNlRW5kUG9zIC0gbWF4TWF0Y2gpLFxuICAgIHNsaWNlRW5kUG9zLFxuICAgIChub2RlLCBwb3MsIHBhcmVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNodW5rID0gbm9kZS50eXBlLnNwZWMudG9UZXh0Py4oe1xuICAgICAgICBub2RlLFxuICAgICAgICBwb3MsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaW5kZXgsXG4gICAgICB9KVxuICAgICAgICB8fCBub2RlLnRleHRDb250ZW50XG4gICAgICAgIHx8ICclbGVhZiUnXG5cbiAgICAgIHRleHRCZWZvcmUgKz0gY2h1bmsuc2xpY2UoMCwgTWF0aC5tYXgoMCwgc2xpY2VFbmRQb3MgLSBwb3MpKVxuICAgIH0sXG4gIClcblxuICByZXR1cm4gdGV4dEJlZm9yZVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBpc1JlZ0V4cCh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVnRXhwIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nXG59XG4iLCAiaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiwgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IENvbW1hbmRNYW5hZ2VyIH0gZnJvbSAnLi9Db21tYW5kTWFuYWdlci5qcydcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgY3JlYXRlQ2hhaW5hYmxlU3RhdGUgfSBmcm9tICcuL2hlbHBlcnMvY3JlYXRlQ2hhaW5hYmxlU3RhdGUuanMnXG5pbXBvcnQgeyBnZXRUZXh0Q29udGVudEZyb21Ob2RlcyB9IGZyb20gJy4vaGVscGVycy9nZXRUZXh0Q29udGVudEZyb21Ob2Rlcy5qcydcbmltcG9ydCB7XG4gIENhbkNvbW1hbmRzLFxuICBDaGFpbmVkQ29tbWFuZHMsXG4gIEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSxcbiAgUmFuZ2UsXG4gIFNpbmdsZUNvbW1hbmRzLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNSZWdFeHAgfSBmcm9tICcuL3V0aWxpdGllcy9pc1JlZ0V4cC5qcydcblxuZXhwb3J0IHR5cGUgSW5wdXRSdWxlTWF0Y2ggPSB7XG4gIGluZGV4OiBudW1iZXJcbiAgdGV4dDogc3RyaW5nXG4gIHJlcGxhY2VXaXRoPzogc3RyaW5nXG4gIG1hdGNoPzogUmVnRXhwTWF0Y2hBcnJheVxuICBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PlxufVxuXG5leHBvcnQgdHlwZSBJbnB1dFJ1bGVGaW5kZXIgPSBSZWdFeHAgfCAoKHRleHQ6IHN0cmluZykgPT4gSW5wdXRSdWxlTWF0Y2ggfCBudWxsKVxuXG5leHBvcnQgY2xhc3MgSW5wdXRSdWxlIHtcbiAgZmluZDogSW5wdXRSdWxlRmluZGVyXG5cbiAgaGFuZGxlcjogKHByb3BzOiB7XG4gICAgc3RhdGU6IEVkaXRvclN0YXRlXG4gICAgcmFuZ2U6IFJhbmdlXG4gICAgbWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheVxuICAgIGNvbW1hbmRzOiBTaW5nbGVDb21tYW5kc1xuICAgIGNoYWluOiAoKSA9PiBDaGFpbmVkQ29tbWFuZHNcbiAgICBjYW46ICgpID0+IENhbkNvbW1hbmRzXG4gIH0pID0+IHZvaWQgfCBudWxsXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiB7XG4gICAgZmluZDogSW5wdXRSdWxlRmluZGVyXG4gICAgaGFuZGxlcjogKHByb3BzOiB7XG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGVcbiAgICAgIHJhbmdlOiBSYW5nZVxuICAgICAgbWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheVxuICAgICAgY29tbWFuZHM6IFNpbmdsZUNvbW1hbmRzXG4gICAgICBjaGFpbjogKCkgPT4gQ2hhaW5lZENvbW1hbmRzXG4gICAgICBjYW46ICgpID0+IENhbkNvbW1hbmRzXG4gICAgfSkgPT4gdm9pZCB8IG51bGxcbiAgfSkge1xuICAgIHRoaXMuZmluZCA9IGNvbmZpZy5maW5kXG4gICAgdGhpcy5oYW5kbGVyID0gY29uZmlnLmhhbmRsZXJcbiAgfVxufVxuXG5jb25zdCBpbnB1dFJ1bGVNYXRjaGVySGFuZGxlciA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmaW5kOiBJbnB1dFJ1bGVGaW5kZXIsXG4pOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkgfCBudWxsID0+IHtcbiAgaWYgKGlzUmVnRXhwKGZpbmQpKSB7XG4gICAgcmV0dXJuIGZpbmQuZXhlYyh0ZXh0KVxuICB9XG5cbiAgY29uc3QgaW5wdXRSdWxlTWF0Y2ggPSBmaW5kKHRleHQpXG5cbiAgaWYgKCFpbnB1dFJ1bGVNYXRjaCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCByZXN1bHQ6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSA9IFtpbnB1dFJ1bGVNYXRjaC50ZXh0XVxuXG4gIHJlc3VsdC5pbmRleCA9IGlucHV0UnVsZU1hdGNoLmluZGV4XG4gIHJlc3VsdC5pbnB1dCA9IHRleHRcbiAgcmVzdWx0LmRhdGEgPSBpbnB1dFJ1bGVNYXRjaC5kYXRhXG5cbiAgaWYgKGlucHV0UnVsZU1hdGNoLnJlcGxhY2VXaXRoKSB7XG4gICAgaWYgKCFpbnB1dFJ1bGVNYXRjaC50ZXh0LmluY2x1ZGVzKGlucHV0UnVsZU1hdGNoLnJlcGxhY2VXaXRoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3RpcHRhcCB3YXJuXTogXCJpbnB1dFJ1bGVNYXRjaC5yZXBsYWNlV2l0aFwiIG11c3QgYmUgcGFydCBvZiBcImlucHV0UnVsZU1hdGNoLnRleHRcIi4nLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGlucHV0UnVsZU1hdGNoLnJlcGxhY2VXaXRoKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBydW4oY29uZmlnOiB7XG4gIGVkaXRvcjogRWRpdG9yXG4gIGZyb206IG51bWJlclxuICB0bzogbnVtYmVyXG4gIHRleHQ6IHN0cmluZ1xuICBydWxlczogSW5wdXRSdWxlW11cbiAgcGx1Z2luOiBQbHVnaW5cbn0pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGVkaXRvciwgZnJvbSwgdG8sIHRleHQsIHJ1bGVzLCBwbHVnaW4sXG4gIH0gPSBjb25maWdcbiAgY29uc3QgeyB2aWV3IH0gPSBlZGl0b3JcblxuICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0ICRmcm9tID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShmcm9tKVxuXG4gIGlmIChcbiAgICAvLyBjaGVjayBmb3IgY29kZSBub2RlXG4gICAgJGZyb20ucGFyZW50LnR5cGUuc3BlYy5jb2RlXG4gICAgLy8gY2hlY2sgZm9yIGNvZGUgbWFya1xuICAgIHx8ICEhKCRmcm9tLm5vZGVCZWZvcmUgfHwgJGZyb20ubm9kZUFmdGVyKT8ubWFya3MuZmluZChtYXJrID0+IG1hcmsudHlwZS5zcGVjLmNvZGUpXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IG1hdGNoZWQgPSBmYWxzZVxuXG4gIGNvbnN0IHRleHRCZWZvcmUgPSBnZXRUZXh0Q29udGVudEZyb21Ob2RlcygkZnJvbSkgKyB0ZXh0XG5cbiAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSBpbnB1dFJ1bGVNYXRjaGVySGFuZGxlcih0ZXh0QmVmb3JlLCBydWxlLmZpbmQpXG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0ciA9IHZpZXcuc3RhdGUudHJcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUNoYWluYWJsZVN0YXRlKHtcbiAgICAgIHN0YXRlOiB2aWV3LnN0YXRlLFxuICAgICAgdHJhbnNhY3Rpb246IHRyLFxuICAgIH0pXG4gICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICBmcm9tOiBmcm9tIC0gKG1hdGNoWzBdLmxlbmd0aCAtIHRleHQubGVuZ3RoKSxcbiAgICAgIHRvLFxuICAgIH1cblxuICAgIGNvbnN0IHsgY29tbWFuZHMsIGNoYWluLCBjYW4gfSA9IG5ldyBDb21tYW5kTWFuYWdlcih7XG4gICAgICBlZGl0b3IsXG4gICAgICBzdGF0ZSxcbiAgICB9KVxuXG4gICAgY29uc3QgaGFuZGxlciA9IHJ1bGUuaGFuZGxlcih7XG4gICAgICBzdGF0ZSxcbiAgICAgIHJhbmdlLFxuICAgICAgbWF0Y2gsXG4gICAgICBjb21tYW5kcyxcbiAgICAgIGNoYWluLFxuICAgICAgY2FuLFxuICAgIH0pXG5cbiAgICAvLyBzdG9wIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VzXG4gICAgaWYgKGhhbmRsZXIgPT09IG51bGwgfHwgIXRyLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gc3RvcmUgdHJhbnNmb3JtIGFzIG1ldGEgZGF0YVxuICAgIC8vIHNvIHdlIGNhbiB1bmRvIGlucHV0IHJ1bGVzIHdpdGhpbiB0aGUgYHVuZG9JbnB1dFJ1bGVzYCBjb21tYW5kXG4gICAgdHIuc2V0TWV0YShwbHVnaW4sIHtcbiAgICAgIHRyYW5zZm9ybTogdHIsXG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICB0ZXh0LFxuICAgIH0pXG5cbiAgICB2aWV3LmRpc3BhdGNoKHRyKVxuICAgIG1hdGNoZWQgPSB0cnVlXG4gIH0pXG5cbiAgcmV0dXJuIG1hdGNoZWRcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5wdXQgcnVsZXMgcGx1Z2luLiBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgY2F1c2UgdGV4dFxuICogaW5wdXQgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcnVsZXMgdG8gdHJpZ2dlciB0aGUgcnVsZeKAmXNcbiAqIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlucHV0UnVsZXNQbHVnaW4ocHJvcHM6IHsgZWRpdG9yOiBFZGl0b3I7IHJ1bGVzOiBJbnB1dFJ1bGVbXSB9KTogUGx1Z2luIHtcbiAgY29uc3QgeyBlZGl0b3IsIHJ1bGVzIH0gPSBwcm9wc1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHtcbiAgICBzdGF0ZToge1xuICAgICAgaW5pdCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0sXG4gICAgICBhcHBseSh0ciwgcHJldikge1xuICAgICAgICBjb25zdCBzdG9yZWQgPSB0ci5nZXRNZXRhKHBsdWdpbilcblxuICAgICAgICBpZiAoc3RvcmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHN0b3JlZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyLnNlbGVjdGlvblNldCB8fCB0ci5kb2NDaGFuZ2VkID8gbnVsbCA6IHByZXZcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHByb3BzOiB7XG4gICAgICBoYW5kbGVUZXh0SW5wdXQodmlldywgZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJ1bih7XG4gICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgIGZyb20sXG4gICAgICAgICAgdG8sXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBydWxlcyxcbiAgICAgICAgICBwbHVnaW4sXG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgY29tcG9zaXRpb25lbmQ6IHZpZXcgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyAkY3Vyc29yIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uXG5cbiAgICAgICAgICAgIGlmICgkY3Vyc29yKSB7XG4gICAgICAgICAgICAgIHJ1bih7XG4gICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgIGZyb206ICRjdXJzb3IucG9zLFxuICAgICAgICAgICAgICAgIHRvOiAkY3Vyc29yLnBvcyxcbiAgICAgICAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICBydWxlcyxcbiAgICAgICAgICAgICAgICBwbHVnaW4sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gYWRkIHN1cHBvcnQgZm9yIGlucHV0IHJ1bGVzIHRvIHRyaWdnZXIgb24gZW50ZXJcbiAgICAgIC8vIHRoaXMgaXMgdXNlZnVsIGZvciBleGFtcGxlIGZvciBjb2RlIGJsb2Nrc1xuICAgICAgaGFuZGxlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb25cblxuICAgICAgICBpZiAoJGN1cnNvcikge1xuICAgICAgICAgIHJldHVybiBydW4oe1xuICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgZnJvbTogJGN1cnNvci5wb3MsXG4gICAgICAgICAgICB0bzogJGN1cnNvci5wb3MsXG4gICAgICAgICAgICB0ZXh0OiAnXFxuJyxcbiAgICAgICAgICAgIHJ1bGVzLFxuICAgICAgICAgICAgcGx1Z2luLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpc0lucHV0UnVsZXM6IHRydWUsXG4gIH0pIGFzIFBsdWdpblxuXG4gIHJldHVybiBwbHVnaW5cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG59XG4iLCAiaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IENvbW1hbmRNYW5hZ2VyIH0gZnJvbSAnLi9Db21tYW5kTWFuYWdlci5qcydcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgY3JlYXRlQ2hhaW5hYmxlU3RhdGUgfSBmcm9tICcuL2hlbHBlcnMvY3JlYXRlQ2hhaW5hYmxlU3RhdGUuanMnXG5pbXBvcnQge1xuICBDYW5Db21tYW5kcyxcbiAgQ2hhaW5lZENvbW1hbmRzLFxuICBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXksXG4gIFJhbmdlLFxuICBTaW5nbGVDb21tYW5kcyxcbn0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi91dGlsaXRpZXMvaXNOdW1iZXIuanMnXG5pbXBvcnQgeyBpc1JlZ0V4cCB9IGZyb20gJy4vdXRpbGl0aWVzL2lzUmVnRXhwLmpzJ1xuXG5leHBvcnQgdHlwZSBQYXN0ZVJ1bGVNYXRjaCA9IHtcbiAgaW5kZXg6IG51bWJlclxuICB0ZXh0OiBzdHJpbmdcbiAgcmVwbGFjZVdpdGg/OiBzdHJpbmdcbiAgbWF0Y2g/OiBSZWdFeHBNYXRjaEFycmF5XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCB0eXBlIFBhc3RlUnVsZUZpbmRlciA9IFJlZ0V4cCB8ICgodGV4dDogc3RyaW5nKSA9PiBQYXN0ZVJ1bGVNYXRjaFtdIHwgbnVsbCB8IHVuZGVmaW5lZClcblxuZXhwb3J0IGNsYXNzIFBhc3RlUnVsZSB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlclxuXG4gIGhhbmRsZXI6IChwcm9wczoge1xuICAgIHN0YXRlOiBFZGl0b3JTdGF0ZVxuICAgIHJhbmdlOiBSYW5nZVxuICAgIG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXlcbiAgICBjb21tYW5kczogU2luZ2xlQ29tbWFuZHNcbiAgICBjaGFpbjogKCkgPT4gQ2hhaW5lZENvbW1hbmRzXG4gICAgY2FuOiAoKSA9PiBDYW5Db21tYW5kc1xuICAgIHBhc3RlRXZlbnQ6IENsaXBib2FyZEV2ZW50XG4gICAgZHJvcEV2ZW50OiBEcmFnRXZlbnRcbiAgfSkgPT4gdm9pZCB8IG51bGxcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IHtcbiAgICBmaW5kOiBQYXN0ZVJ1bGVGaW5kZXJcbiAgICBoYW5kbGVyOiAocHJvcHM6IHtcbiAgICAgIGNhbjogKCkgPT4gQ2FuQ29tbWFuZHNcbiAgICAgIGNoYWluOiAoKSA9PiBDaGFpbmVkQ29tbWFuZHNcbiAgICAgIGNvbW1hbmRzOiBTaW5nbGVDb21tYW5kc1xuICAgICAgZHJvcEV2ZW50OiBEcmFnRXZlbnRcbiAgICAgIG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXlcbiAgICAgIHBhc3RlRXZlbnQ6IENsaXBib2FyZEV2ZW50XG4gICAgICByYW5nZTogUmFuZ2VcbiAgICAgIHN0YXRlOiBFZGl0b3JTdGF0ZVxuICAgIH0pID0+IHZvaWQgfCBudWxsXG4gIH0pIHtcbiAgICB0aGlzLmZpbmQgPSBjb25maWcuZmluZFxuICAgIHRoaXMuaGFuZGxlciA9IGNvbmZpZy5oYW5kbGVyXG4gIH1cbn1cblxuY29uc3QgcGFzdGVSdWxlTWF0Y2hlckhhbmRsZXIgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZmluZDogUGFzdGVSdWxlRmluZGVyLFxuKTogRXh0ZW5kZWRSZWdFeHBNYXRjaEFycmF5W10gPT4ge1xuICBpZiAoaXNSZWdFeHAoZmluZCkpIHtcbiAgICByZXR1cm4gWy4uLnRleHQubWF0Y2hBbGwoZmluZCldXG4gIH1cblxuICBjb25zdCBtYXRjaGVzID0gZmluZCh0ZXh0KVxuXG4gIGlmICghbWF0Y2hlcykge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXMubWFwKHBhc3RlUnVsZU1hdGNoID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSA9IFtwYXN0ZVJ1bGVNYXRjaC50ZXh0XVxuXG4gICAgcmVzdWx0LmluZGV4ID0gcGFzdGVSdWxlTWF0Y2guaW5kZXhcbiAgICByZXN1bHQuaW5wdXQgPSB0ZXh0XG4gICAgcmVzdWx0LmRhdGEgPSBwYXN0ZVJ1bGVNYXRjaC5kYXRhXG5cbiAgICBpZiAocGFzdGVSdWxlTWF0Y2gucmVwbGFjZVdpdGgpIHtcbiAgICAgIGlmICghcGFzdGVSdWxlTWF0Y2gudGV4dC5pbmNsdWRlcyhwYXN0ZVJ1bGVNYXRjaC5yZXBsYWNlV2l0aCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdbdGlwdGFwIHdhcm5dOiBcInBhc3RlUnVsZU1hdGNoLnJlcGxhY2VXaXRoXCIgbXVzdCBiZSBwYXJ0IG9mIFwicGFzdGVSdWxlTWF0Y2gudGV4dFwiLicsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmVzdWx0LnB1c2gocGFzdGVSdWxlTWF0Y2gucmVwbGFjZVdpdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxufVxuXG5mdW5jdGlvbiBydW4oY29uZmlnOiB7XG4gIGVkaXRvcjogRWRpdG9yXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZVxuICBmcm9tOiBudW1iZXJcbiAgdG86IG51bWJlclxuICBydWxlOiBQYXN0ZVJ1bGVcbiAgcGFzdGVFdmVudDogQ2xpcGJvYXJkRXZlbnRcbiAgZHJvcEV2ZW50OiBEcmFnRXZlbnRcbn0pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGVkaXRvciwgc3RhdGUsIGZyb20sIHRvLCBydWxlLCBwYXN0ZUV2ZW50LCBkcm9wRXZlbnQsXG4gIH0gPSBjb25maWdcblxuICBjb25zdCB7IGNvbW1hbmRzLCBjaGFpbiwgY2FuIH0gPSBuZXcgQ29tbWFuZE1hbmFnZXIoe1xuICAgIGVkaXRvcixcbiAgICBzdGF0ZSxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVyczogKHZvaWQgfCBudWxsKVtdID0gW11cblxuICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrIHx8IG5vZGUudHlwZS5zcGVjLmNvZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcylcbiAgICBjb25zdCByZXNvbHZlZFRvID0gTWF0aC5taW4odG8sIHBvcyArIG5vZGUuY29udGVudC5zaXplKVxuICAgIGNvbnN0IHRleHRUb01hdGNoID0gbm9kZS50ZXh0QmV0d2VlbihyZXNvbHZlZEZyb20gLSBwb3MsIHJlc29sdmVkVG8gLSBwb3MsIHVuZGVmaW5lZCwgJ1xcdWZmZmMnKVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IHBhc3RlUnVsZU1hdGNoZXJIYW5kbGVyKHRleHRUb01hdGNoLCBydWxlLmZpbmQpXG5cbiAgICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgICAgaWYgKG1hdGNoLmluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXJ0ID0gcmVzb2x2ZWRGcm9tICsgbWF0Y2guaW5kZXggKyAxXG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIG1hdGNoWzBdLmxlbmd0aFxuICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgIGZyb206IHN0YXRlLnRyLm1hcHBpbmcubWFwKHN0YXJ0KSxcbiAgICAgICAgdG86IHN0YXRlLnRyLm1hcHBpbmcubWFwKGVuZCksXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBydWxlLmhhbmRsZXIoe1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIG1hdGNoLFxuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgY2hhaW4sXG4gICAgICAgIGNhbixcbiAgICAgICAgcGFzdGVFdmVudCxcbiAgICAgICAgZHJvcEV2ZW50LFxuICAgICAgfSlcblxuICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgIH0pXG4gIH0pXG5cbiAgY29uc3Qgc3VjY2VzcyA9IGhhbmRsZXJzLmV2ZXJ5KGhhbmRsZXIgPT4gaGFuZGxlciAhPT0gbnVsbClcblxuICByZXR1cm4gc3VjY2Vzc1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBwYXN0ZSBydWxlcyBwbHVnaW4uIFdoZW4gZW5hYmxlZCwgaXQgd2lsbCBjYXVzZSBwYXN0ZWRcbiAqIHRleHQgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcnVsZXMgdG8gdHJpZ2dlciB0aGUgcnVsZeKAmXNcbiAqIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhc3RlUnVsZXNQbHVnaW4ocHJvcHM6IHsgZWRpdG9yOiBFZGl0b3I7IHJ1bGVzOiBQYXN0ZVJ1bGVbXSB9KTogUGx1Z2luW10ge1xuICBjb25zdCB7IGVkaXRvciwgcnVsZXMgfSA9IHByb3BzXG4gIGxldCBkcmFnU291cmNlRWxlbWVudDogRWxlbWVudCB8IG51bGwgPSBudWxsXG4gIGxldCBpc1Bhc3RlZEZyb21Qcm9zZU1pcnJvciA9IGZhbHNlXG4gIGxldCBpc0Ryb3BwZWRGcm9tUHJvc2VNaXJyb3IgPSBmYWxzZVxuICBsZXQgcGFzdGVFdmVudCA9IG5ldyBDbGlwYm9hcmRFdmVudCgncGFzdGUnKVxuICBsZXQgZHJvcEV2ZW50ID0gbmV3IERyYWdFdmVudCgnZHJvcCcpXG5cbiAgY29uc3QgcGx1Z2lucyA9IHJ1bGVzLm1hcChydWxlID0+IHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAgICAvLyB3ZSByZWdpc3RlciBhIGdsb2JhbCBkcmFnIGhhbmRsZXIgdG8gdHJhY2sgdGhlIGN1cnJlbnQgZHJhZyBzb3VyY2UgZWxlbWVudFxuICAgICAgdmlldyh2aWV3KSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZURyYWdzdGFydCA9IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgICAgZHJhZ1NvdXJjZUVsZW1lbnQgPSB2aWV3LmRvbS5wYXJlbnRFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgRWxlbWVudClcbiAgICAgICAgICAgID8gdmlldy5kb20ucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgaGFuZGxlRHJhZ3N0YXJ0KVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBoYW5kbGVEcmFnc3RhcnQpXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgICAgZHJvcDogKHZpZXcsIGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgaXNEcm9wcGVkRnJvbVByb3NlTWlycm9yID0gZHJhZ1NvdXJjZUVsZW1lbnQgPT09IHZpZXcuZG9tLnBhcmVudEVsZW1lbnRcbiAgICAgICAgICAgIGRyb3BFdmVudCA9IGV2ZW50IGFzIERyYWdFdmVudFxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgcGFzdGU6IChfdmlldywgZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gKGV2ZW50IGFzIENsaXBib2FyZEV2ZW50KS5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0L2h0bWwnKVxuXG4gICAgICAgICAgICBwYXN0ZUV2ZW50ID0gZXZlbnQgYXMgQ2xpcGJvYXJkRXZlbnRcblxuICAgICAgICAgICAgaXNQYXN0ZWRGcm9tUHJvc2VNaXJyb3IgPSAhIWh0bWw/LmluY2x1ZGVzKCdkYXRhLXBtLXNsaWNlJylcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFwcGVuZFRyYW5zYWN0aW9uOiAodHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbnNbMF1cbiAgICAgICAgY29uc3QgaXNQYXN0ZSA9IHRyYW5zYWN0aW9uLmdldE1ldGEoJ3VpRXZlbnQnKSA9PT0gJ3Bhc3RlJyAmJiAhaXNQYXN0ZWRGcm9tUHJvc2VNaXJyb3JcbiAgICAgICAgY29uc3QgaXNEcm9wID0gdHJhbnNhY3Rpb24uZ2V0TWV0YSgndWlFdmVudCcpID09PSAnZHJvcCcgJiYgIWlzRHJvcHBlZEZyb21Qcm9zZU1pcnJvclxuXG4gICAgICAgIGlmICghaXNQYXN0ZSAmJiAhaXNEcm9wKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9wIGlmIHRoZXJlIGlzIG5vIGNoYW5nZWQgcmFuZ2VcbiAgICAgICAgY29uc3QgZnJvbSA9IG9sZFN0YXRlLmRvYy5jb250ZW50LmZpbmREaWZmU3RhcnQoc3RhdGUuZG9jLmNvbnRlbnQpXG4gICAgICAgIGNvbnN0IHRvID0gb2xkU3RhdGUuZG9jLmNvbnRlbnQuZmluZERpZmZFbmQoc3RhdGUuZG9jLmNvbnRlbnQpXG5cbiAgICAgICAgaWYgKCFpc051bWJlcihmcm9tKSB8fCAhdG8gfHwgZnJvbSA9PT0gdG8uYikge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYnVpbGQgYSBjaGFpbmFibGUgc3RhdGVcbiAgICAgICAgLy8gc28gd2UgY2FuIHVzZSBhIHNpbmdsZSB0cmFuc2FjdGlvbiBmb3IgYWxsIHBhc3RlIHJ1bGVzXG4gICAgICAgIGNvbnN0IHRyID0gc3RhdGUudHJcbiAgICAgICAgY29uc3QgY2hhaW5hYmxlU3RhdGUgPSBjcmVhdGVDaGFpbmFibGVTdGF0ZSh7XG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgdHJhbnNhY3Rpb246IHRyLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBydW4oe1xuICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICBzdGF0ZTogY2hhaW5hYmxlU3RhdGUsXG4gICAgICAgICAgZnJvbTogTWF0aC5tYXgoZnJvbSAtIDEsIDApLFxuICAgICAgICAgIHRvOiB0by5iIC0gMSxcbiAgICAgICAgICBydWxlLFxuICAgICAgICAgIHBhc3RlRXZlbnQsXG4gICAgICAgICAgZHJvcEV2ZW50LFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIHN0b3AgaWYgdGhlcmUgYXJlIG5vIGNoYW5nZXNcbiAgICAgICAgaWYgKCFoYW5kbGVyIHx8ICF0ci5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRyb3BFdmVudCA9IG5ldyBEcmFnRXZlbnQoJ2Ryb3AnKVxuICAgICAgICBwYXN0ZUV2ZW50ID0gbmV3IENsaXBib2FyZEV2ZW50KCdwYXN0ZScpXG5cbiAgICAgICAgcmV0dXJuIHRyXG4gICAgICB9LFxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIHBsdWdpbnNcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gZmluZER1cGxpY2F0ZXMoaXRlbXM6IGFueVtdKTogYW55W10ge1xuICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoZWwsIGluZGV4KSA9PiBpdGVtcy5pbmRleE9mKGVsKSAhPT0gaW5kZXgpXG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbHRlcmVkKV1cbn1cbiIsICJpbXBvcnQgeyBrZXltYXAgfSBmcm9tICdAdGlwdGFwL3BtL2tleW1hcCdcbmltcG9ydCB7IE5vZGUgYXMgUHJvc2VtaXJyb3JOb2RlLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcbmltcG9ydCB7IERlY29yYXRpb24sIEVkaXRvclZpZXcgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0QXR0cmlidXRlc0Zyb21FeHRlbnNpb25zIH0gZnJvbSAnLi9oZWxwZXJzL2dldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucy5qcydcbmltcG9ydCB7IGdldEV4dGVuc2lvbkZpZWxkIH0gZnJvbSAnLi9oZWxwZXJzL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgZ2V0Tm9kZVR5cGUgfSBmcm9tICcuL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBnZXRSZW5kZXJlZEF0dHJpYnV0ZXMgfSBmcm9tICcuL2hlbHBlcnMvZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQnlSZXNvbHZlZEV4dGVuc2lvbnMgfSBmcm9tICcuL2hlbHBlcnMvZ2V0U2NoZW1hQnlSZXNvbHZlZEV4dGVuc2lvbnMuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFUeXBlQnlOYW1lIH0gZnJvbSAnLi9oZWxwZXJzL2dldFNjaGVtYVR5cGVCeU5hbWUuanMnXG5pbXBvcnQgeyBpc0V4dGVuc2lvblJ1bGVzRW5hYmxlZCB9IGZyb20gJy4vaGVscGVycy9pc0V4dGVuc2lvblJ1bGVzRW5hYmxlZC5qcydcbmltcG9ydCB7IHNwbGl0RXh0ZW5zaW9ucyB9IGZyb20gJy4vaGVscGVycy9zcGxpdEV4dGVuc2lvbnMuanMnXG5pbXBvcnQgeyBNYXJrLCBOb2RlQ29uZmlnIH0gZnJvbSAnLi9pbmRleC5qcydcbmltcG9ydCB7IGlucHV0UnVsZXNQbHVnaW4gfSBmcm9tICcuL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IHBhc3RlUnVsZXNQbHVnaW4gfSBmcm9tICcuL1Bhc3RlUnVsZS5qcydcbmltcG9ydCB7IEFueUNvbmZpZywgRXh0ZW5zaW9ucywgUmF3Q29tbWFuZHMgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi91dGlsaXRpZXMvY2FsbE9yUmV0dXJuLmpzJ1xuaW1wb3J0IHsgZmluZER1cGxpY2F0ZXMgfSBmcm9tICcuL3V0aWxpdGllcy9maW5kRHVwbGljYXRlcy5qcydcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIge1xuICBlZGl0b3I6IEVkaXRvclxuXG4gIHNjaGVtYTogU2NoZW1hXG5cbiAgZXh0ZW5zaW9uczogRXh0ZW5zaW9uc1xuXG4gIHNwbGl0dGFibGVNYXJrczogc3RyaW5nW10gPSBbXVxuXG4gIGNvbnN0cnVjdG9yKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsIGVkaXRvcjogRWRpdG9yKSB7XG4gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3JcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSBFeHRlbnNpb25NYW5hZ2VyLnJlc29sdmUoZXh0ZW5zaW9ucylcbiAgICB0aGlzLnNjaGVtYSA9IGdldFNjaGVtYUJ5UmVzb2x2ZWRFeHRlbnNpb25zKHRoaXMuZXh0ZW5zaW9ucywgZWRpdG9yKVxuXG4gICAgdGhpcy5leHRlbnNpb25zLmZvckVhY2goZXh0ZW5zaW9uID0+IHtcbiAgICAgIC8vIHN0b3JlIGV4dGVuc2lvbiBzdG9yYWdlIGluIGVkaXRvclxuICAgICAgdGhpcy5lZGl0b3IuZXh0ZW5zaW9uU3RvcmFnZVtleHRlbnNpb24ubmFtZV0gPSBleHRlbnNpb24uc3RvcmFnZVxuXG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICB0eXBlOiBnZXRTY2hlbWFUeXBlQnlOYW1lKGV4dGVuc2lvbi5uYW1lLCB0aGlzLnNjaGVtYSksXG4gICAgICB9XG5cbiAgICAgIGlmIChleHRlbnNpb24udHlwZSA9PT0gJ21hcmsnKSB7XG4gICAgICAgIGNvbnN0IGtlZXBPblNwbGl0ID0gY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbiwgJ2tlZXBPblNwbGl0JywgY29udGV4dCkpID8/IHRydWVcblxuICAgICAgICBpZiAoa2VlcE9uU3BsaXQpIHtcbiAgICAgICAgICB0aGlzLnNwbGl0dGFibGVNYXJrcy5wdXNoKGV4dGVuc2lvbi5uYW1lKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uQmVmb3JlQ3JlYXRlID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydvbkJlZm9yZUNyZWF0ZSddPihcbiAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAnb25CZWZvcmVDcmVhdGUnLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKVxuXG4gICAgICBpZiAob25CZWZvcmVDcmVhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JlZm9yZUNyZWF0ZScsIG9uQmVmb3JlQ3JlYXRlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvbkNyZWF0ZSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25DcmVhdGUnXT4oZXh0ZW5zaW9uLCAnb25DcmVhdGUnLCBjb250ZXh0KVxuXG4gICAgICBpZiAob25DcmVhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2NyZWF0ZScsIG9uQ3JlYXRlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvblVwZGF0ZSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25VcGRhdGUnXT4oZXh0ZW5zaW9uLCAnb25VcGRhdGUnLCBjb250ZXh0KVxuXG4gICAgICBpZiAob25VcGRhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ3VwZGF0ZScsIG9uVXBkYXRlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvblNlbGVjdGlvblVwZGF0ZSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25TZWxlY3Rpb25VcGRhdGUnXT4oXG4gICAgICAgIGV4dGVuc2lvbixcbiAgICAgICAgJ29uU2VsZWN0aW9uVXBkYXRlJyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIClcblxuICAgICAgaWYgKG9uU2VsZWN0aW9uVXBkYXRlKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKCdzZWxlY3Rpb25VcGRhdGUnLCBvblNlbGVjdGlvblVwZGF0ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25UcmFuc2FjdGlvbiA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25UcmFuc2FjdGlvbiddPihcbiAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAnb25UcmFuc2FjdGlvbicsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIGlmIChvblRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKCd0cmFuc2FjdGlvbicsIG9uVHJhbnNhY3Rpb24pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uRm9jdXMgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ29uRm9jdXMnXT4oZXh0ZW5zaW9uLCAnb25Gb2N1cycsIGNvbnRleHQpXG5cbiAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKCdmb2N1cycsIG9uRm9jdXMpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uQmx1ciA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25CbHVyJ10+KGV4dGVuc2lvbiwgJ29uQmx1cicsIGNvbnRleHQpXG5cbiAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JsdXInLCBvbkJsdXIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uRGVzdHJveSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25EZXN0cm95J10+KGV4dGVuc2lvbiwgJ29uRGVzdHJveScsIGNvbnRleHQpXG5cbiAgICAgIGlmIChvbkRlc3Ryb3kpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2Rlc3Ryb3knLCBvbkRlc3Ryb3kpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyByZXNvbHZlKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpOiBFeHRlbnNpb25zIHtcbiAgICBjb25zdCByZXNvbHZlZEV4dGVuc2lvbnMgPSBFeHRlbnNpb25NYW5hZ2VyLnNvcnQoRXh0ZW5zaW9uTWFuYWdlci5mbGF0dGVuKGV4dGVuc2lvbnMpKVxuICAgIGNvbnN0IGR1cGxpY2F0ZWROYW1lcyA9IGZpbmREdXBsaWNhdGVzKHJlc29sdmVkRXh0ZW5zaW9ucy5tYXAoZXh0ZW5zaW9uID0+IGV4dGVuc2lvbi5uYW1lKSlcblxuICAgIGlmIChkdXBsaWNhdGVkTmFtZXMubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbdGlwdGFwIHdhcm5dOiBEdXBsaWNhdGUgZXh0ZW5zaW9uIG5hbWVzIGZvdW5kOiBbJHtkdXBsaWNhdGVkTmFtZXNcbiAgICAgICAgICAubWFwKGl0ZW0gPT4gYCcke2l0ZW19J2ApXG4gICAgICAgICAgLmpvaW4oJywgJyl9XS4gVGhpcyBjYW4gbGVhZCB0byBpc3N1ZXMuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRFeHRlbnNpb25zXG4gIH1cblxuICBzdGF0aWMgZmxhdHRlbihleHRlbnNpb25zOiBFeHRlbnNpb25zKTogRXh0ZW5zaW9ucyB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgLm1hcChleHRlbnNpb24gPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYWRkRXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkRXh0ZW5zaW9ucyddPihcbiAgICAgICAgICAgIGV4dGVuc2lvbixcbiAgICAgICAgICAgICdhZGRFeHRlbnNpb25zJyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKGFkZEV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbZXh0ZW5zaW9uLCAuLi50aGlzLmZsYXR0ZW4oYWRkRXh0ZW5zaW9ucygpKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uXG4gICAgICAgIH0pXG4gICAgICAgIC8vIGBJbmZpbml0eWAgd2lsbCBicmVhayBUeXBlU2NyaXB0IHNvIHdlIHNldCBhIG51bWJlciB0aGF0IGlzIHByb2JhYmx5IGhpZ2ggZW5vdWdoXG4gICAgICAgIC5mbGF0KDEwKVxuICAgIClcbiAgfVxuXG4gIHN0YXRpYyBzb3J0KGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpOiBFeHRlbnNpb25zIHtcbiAgICBjb25zdCBkZWZhdWx0UHJpb3JpdHkgPSAxMDBcblxuICAgIHJldHVybiBleHRlbnNpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IHByaW9yaXR5QSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1sncHJpb3JpdHknXT4oYSwgJ3ByaW9yaXR5JykgfHwgZGVmYXVsdFByaW9yaXR5XG4gICAgICBjb25zdCBwcmlvcml0eUIgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ3ByaW9yaXR5J10+KGIsICdwcmlvcml0eScpIHx8IGRlZmF1bHRQcmlvcml0eVxuXG4gICAgICBpZiAocHJpb3JpdHlBID4gcHJpb3JpdHlCKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3JpdHlBIDwgcHJpb3JpdHlCKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwXG4gICAgfSlcbiAgfVxuXG4gIGdldCBjb21tYW5kcygpOiBSYXdDb21tYW5kcyB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5yZWR1Y2UoKGNvbW1hbmRzLCBleHRlbnNpb24pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgIGVkaXRvcjogdGhpcy5lZGl0b3IsXG4gICAgICAgIHR5cGU6IGdldFNjaGVtYVR5cGVCeU5hbWUoZXh0ZW5zaW9uLm5hbWUsIHRoaXMuc2NoZW1hKSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWRkQ29tbWFuZHMgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZENvbW1hbmRzJ10+KFxuICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICdhZGRDb21tYW5kcycsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIGlmICghYWRkQ29tbWFuZHMpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbW1hbmRzLFxuICAgICAgICAuLi5hZGRDb21tYW5kcygpLFxuICAgICAgfVxuICAgIH0sIHt9IGFzIFJhd0NvbW1hbmRzKVxuICB9XG5cbiAgZ2V0IHBsdWdpbnMoKTogUGx1Z2luW10ge1xuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzXG5cbiAgICAvLyBXaXRoIFByb3NlTWlycm9yLCBmaXJzdCBwbHVnaW5zIHdpdGhpbiBhbiBhcnJheSBhcmUgZXhlY3V0ZWQgZmlyc3QuXG4gICAgLy8gSW4gVGlwdGFwLCB3ZSBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIG92ZXJyaWRlIHBsdWdpbnMsXG4gICAgLy8gc28gaXQgZmVlbHMgbW9yZSBuYXR1cmFsIHRvIHJ1biBwbHVnaW5zIGF0IHRoZSBlbmQgb2YgYW4gYXJyYXkgZmlyc3QuXG4gICAgLy8gVGhhdOKAmXMgd2h5IHdlIGhhdmUgdG8gcmV2ZXJzZSB0aGUgYGV4dGVuc2lvbnNgIGFycmF5IGFuZCBzb3J0IGFnYWluXG4gICAgLy8gYmFzZWQgb24gdGhlIGBwcmlvcml0eWAgb3B0aW9uLlxuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBFeHRlbnNpb25NYW5hZ2VyLnNvcnQoWy4uLnRoaXMuZXh0ZW5zaW9uc10ucmV2ZXJzZSgpKVxuXG4gICAgY29uc3QgaW5wdXRSdWxlczogYW55W10gPSBbXVxuICAgIGNvbnN0IHBhc3RlUnVsZXM6IGFueVtdID0gW11cblxuICAgIGNvbnN0IGFsbFBsdWdpbnMgPSBleHRlbnNpb25zXG4gICAgICAubWFwKGV4dGVuc2lvbiA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgIHR5cGU6IGdldFNjaGVtYVR5cGVCeU5hbWUoZXh0ZW5zaW9uLm5hbWUsIHRoaXMuc2NoZW1hKSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW11cblxuICAgICAgICBjb25zdCBhZGRLZXlib2FyZFNob3J0Y3V0cyA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkS2V5Ym9hcmRTaG9ydGN1dHMnXT4oXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICdhZGRLZXlib2FyZFNob3J0Y3V0cycsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKVxuXG4gICAgICAgIGxldCBkZWZhdWx0QmluZGluZ3M6IFJlY29yZDxzdHJpbmcsICgpID0+IGJvb2xlYW4+ID0ge31cblxuICAgICAgICAvLyBiaW5kIGV4aXQgaGFuZGxpbmdcbiAgICAgICAgaWYgKGV4dGVuc2lvbi50eXBlID09PSAnbWFyaycgJiYgZXh0ZW5zaW9uLmNvbmZpZy5leGl0YWJsZSkge1xuICAgICAgICAgIGRlZmF1bHRCaW5kaW5ncy5BcnJvd1JpZ2h0ID0gKCkgPT4gTWFyay5oYW5kbGVFeGl0KHsgZWRpdG9yLCBtYXJrOiBleHRlbnNpb24gYXMgTWFyayB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkZEtleWJvYXJkU2hvcnRjdXRzKSB7XG4gICAgICAgICAgY29uc3QgYmluZGluZ3MgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhhZGRLZXlib2FyZFNob3J0Y3V0cygpKS5tYXAoKFtzaG9ydGN1dCwgbWV0aG9kXSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3Nob3J0Y3V0LCAoKSA9PiBtZXRob2QoeyBlZGl0b3IgfSldXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBkZWZhdWx0QmluZGluZ3MgPSB7IC4uLmRlZmF1bHRCaW5kaW5ncywgLi4uYmluZGluZ3MgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TWFwUGx1Z2luID0ga2V5bWFwKGRlZmF1bHRCaW5kaW5ncylcblxuICAgICAgICBwbHVnaW5zLnB1c2goa2V5TWFwUGx1Z2luKVxuXG4gICAgICAgIGNvbnN0IGFkZElucHV0UnVsZXMgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZElucHV0UnVsZXMnXT4oXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICdhZGRJbnB1dFJ1bGVzJyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGlzRXh0ZW5zaW9uUnVsZXNFbmFibGVkKGV4dGVuc2lvbiwgZWRpdG9yLm9wdGlvbnMuZW5hYmxlSW5wdXRSdWxlcykgJiYgYWRkSW5wdXRSdWxlcykge1xuICAgICAgICAgIGlucHV0UnVsZXMucHVzaCguLi5hZGRJbnB1dFJ1bGVzKCkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRQYXN0ZVJ1bGVzID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRQYXN0ZVJ1bGVzJ10+KFxuICAgICAgICAgIGV4dGVuc2lvbixcbiAgICAgICAgICAnYWRkUGFzdGVSdWxlcycsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChpc0V4dGVuc2lvblJ1bGVzRW5hYmxlZChleHRlbnNpb24sIGVkaXRvci5vcHRpb25zLmVuYWJsZVBhc3RlUnVsZXMpICYmIGFkZFBhc3RlUnVsZXMpIHtcbiAgICAgICAgICBwYXN0ZVJ1bGVzLnB1c2goLi4uYWRkUGFzdGVSdWxlcygpKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkUHJvc2VNaXJyb3JQbHVnaW5zID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRQcm9zZU1pcnJvclBsdWdpbnMnXT4oXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICdhZGRQcm9zZU1pcnJvclBsdWdpbnMnLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoYWRkUHJvc2VNaXJyb3JQbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgcHJvc2VNaXJyb3JQbHVnaW5zID0gYWRkUHJvc2VNaXJyb3JQbHVnaW5zKClcblxuICAgICAgICAgIHBsdWdpbnMucHVzaCguLi5wcm9zZU1pcnJvclBsdWdpbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGx1Z2luc1xuICAgICAgfSlcbiAgICAgIC5mbGF0KClcblxuICAgIHJldHVybiBbXG4gICAgICBpbnB1dFJ1bGVzUGx1Z2luKHtcbiAgICAgICAgZWRpdG9yLFxuICAgICAgICBydWxlczogaW5wdXRSdWxlcyxcbiAgICAgIH0pLFxuICAgICAgLi4ucGFzdGVSdWxlc1BsdWdpbih7XG4gICAgICAgIGVkaXRvcixcbiAgICAgICAgcnVsZXM6IHBhc3RlUnVsZXMsXG4gICAgICB9KSxcbiAgICAgIC4uLmFsbFBsdWdpbnMsXG4gICAgXVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIGdldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucyh0aGlzLmV4dGVuc2lvbnMpXG4gIH1cblxuICBnZXQgbm9kZVZpZXdzKCkge1xuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzXG4gICAgY29uc3QgeyBub2RlRXh0ZW5zaW9ucyB9ID0gc3BsaXRFeHRlbnNpb25zKHRoaXMuZXh0ZW5zaW9ucylcblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBub2RlRXh0ZW5zaW9uc1xuICAgICAgICAuZmlsdGVyKGV4dGVuc2lvbiA9PiAhIWdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbiwgJ2FkZE5vZGVWaWV3JykpXG4gICAgICAgIC5tYXAoZXh0ZW5zaW9uID0+IHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLmZpbHRlcihcbiAgICAgICAgICAgIGF0dHJpYnV0ZSA9PiBhdHRyaWJ1dGUudHlwZSA9PT0gZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICB0eXBlOiBnZXROb2RlVHlwZShleHRlbnNpb24ubmFtZSwgdGhpcy5zY2hlbWEpLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGROb2RlVmlldyA9IGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2FkZE5vZGVWaWV3J10+KFxuICAgICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICAgJ2FkZE5vZGVWaWV3JyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKCFhZGROb2RlVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgbm9kZXZpZXcgPSAoXG4gICAgICAgICAgICBub2RlOiBQcm9zZW1pcnJvck5vZGUsXG4gICAgICAgICAgICB2aWV3OiBFZGl0b3JWaWV3LFxuICAgICAgICAgICAgZ2V0UG9zOiAoKCkgPT4gbnVtYmVyKSB8IGJvb2xlYW4sXG4gICAgICAgICAgICBkZWNvcmF0aW9uczogRGVjb3JhdGlvbltdLFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgY29uc3QgSFRNTEF0dHJpYnV0ZXMgPSBnZXRSZW5kZXJlZEF0dHJpYnV0ZXMobm9kZSwgZXh0ZW5zaW9uQXR0cmlidXRlcylcblxuICAgICAgICAgICAgcmV0dXJuIGFkZE5vZGVWaWV3KCkoe1xuICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIGdldFBvcyxcbiAgICAgICAgICAgICAgZGVjb3JhdGlvbnMsXG4gICAgICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbZXh0ZW5zaW9uLm5hbWUsIG5vZGV2aWV3XVxuICAgICAgICB9KSxcbiAgICApXG4gIH1cbn1cbiIsICIvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZXNxdWVlYi9pcy13aGF0L2Jsb2IvODhkNmU0Y2E5MmZiMmJhYWI2MDAzYzU0ZTAyZWVkZjRlNzI5ZTVhYi9zcmMvaW5kZXgudHNcblxuZnVuY3Rpb24gZ2V0VHlwZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnT2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZVxufVxuIiwgImltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICcuL2lzUGxhaW5PYmplY3QuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3Qgb3V0cHV0ID0geyAuLi50YXJnZXQgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRhcmdldCkpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgeyBba2V5XTogc291cmNlW2tleV0gfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXRba2V5XSA9IG1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQuanMnXG5pbXBvcnQgeyBFeHRlbnNpb25Db25maWcgfSBmcm9tICcuL2luZGV4LmpzJ1xuaW1wb3J0IHsgSW5wdXRSdWxlIH0gZnJvbSAnLi9JbnB1dFJ1bGUuanMnXG5pbXBvcnQgeyBNYXJrIH0gZnJvbSAnLi9NYXJrLmpzJ1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4vTm9kZS5qcydcbmltcG9ydCB7IFBhc3RlUnVsZSB9IGZyb20gJy4vUGFzdGVSdWxlLmpzJ1xuaW1wb3J0IHtcbiAgQW55Q29uZmlnLFxuICBFeHRlbnNpb25zLFxuICBHbG9iYWxBdHRyaWJ1dGVzLFxuICBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZCxcbiAgUGFyZW50Q29uZmlnLFxuICBSYXdDb21tYW5kcyxcbn0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gJy4vdXRpbGl0aWVzL21lcmdlRGVlcC5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgRXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMgPSBhbnksIFN0b3JhZ2UgPSBhbnk+IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAgIC8qKlxuICAgICAqIE5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIFByaW9yaXR5XG4gICAgICovXG4gICAgcHJpb3JpdHk/OiBudW1iZXJcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgb3B0aW9uc1xuICAgICAqL1xuICAgIGRlZmF1bHRPcHRpb25zPzogT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBPcHRpb25zXG4gICAgICovXG4gICAgYWRkT3B0aW9ucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkT3B0aW9ucyddLCB1bmRlZmluZWQ+XG4gICAgfSkgPT4gT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBTdG9yYWdlXG4gICAgICovXG4gICAgYWRkU3RvcmFnZT86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkU3RvcmFnZSddLCB1bmRlZmluZWQ+XG4gICAgfSkgPT4gU3RvcmFnZVxuXG4gICAgLyoqXG4gICAgICogR2xvYmFsIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRHbG9iYWxBdHRyaWJ1dGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkR2xvYmFsQXR0cmlidXRlcyddXG4gICAgfSkgPT4gR2xvYmFsQXR0cmlidXRlcyB8IHt9XG5cbiAgICAvKipcbiAgICAgKiBSYXdcbiAgICAgKi9cbiAgICBhZGRDb21tYW5kcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRDb21tYW5kcyddXG4gICAgfSkgPT4gUGFydGlhbDxSYXdDb21tYW5kcz5cblxuICAgIC8qKlxuICAgICAqIEtleWJvYXJkIHNob3J0Y3V0c1xuICAgICAqL1xuICAgIGFkZEtleWJvYXJkU2hvcnRjdXRzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEtleWJvYXJkU2hvcnRjdXRzJ11cbiAgICB9KSA9PiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElucHV0IHJ1bGVzXG4gICAgICovXG4gICAgYWRkSW5wdXRSdWxlcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRJbnB1dFJ1bGVzJ11cbiAgICB9KSA9PiBJbnB1dFJ1bGVbXVxuXG4gICAgLyoqXG4gICAgICogUGFzdGUgcnVsZXNcbiAgICAgKi9cbiAgICBhZGRQYXN0ZVJ1bGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFBhc3RlUnVsZXMnXVxuICAgIH0pID0+IFBhc3RlUnVsZVtdXG5cbiAgICAvKipcbiAgICAgKiBQcm9zZU1pcnJvciBwbHVnaW5zXG4gICAgICovXG4gICAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFByb3NlTWlycm9yUGx1Z2lucyddXG4gICAgfSkgPT4gUGx1Z2luW11cblxuICAgIC8qKlxuICAgICAqIEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBhZGRFeHRlbnNpb25zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkRXh0ZW5zaW9ucyddXG4gICAgfSkgPT4gRXh0ZW5zaW9uc1xuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIE5vZGUgU2NoZW1hXG4gICAgICovXG4gICAgZXh0ZW5kTm9kZVNjaGVtYT86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydleHRlbmROb2RlU2NoZW1hJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4dGVuc2lvbjogTm9kZSxcbiAgICAgICAgKSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgTWFyayBTY2hlbWFcbiAgICAgKi9cbiAgICBleHRlbmRNYXJrU2NoZW1hPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4dGVuZE1hcmtTY2hlbWEnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBNYXJrLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgbm90IHJlYWR5IHlldC5cbiAgICAgKi9cbiAgICBvbkJlZm9yZUNyZWF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkJlZm9yZUNyZWF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgcmVhZHkuXG4gICAgICovXG4gICAgb25DcmVhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25DcmVhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBvblVwZGF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvblVwZGF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICovXG4gICAgb25TZWxlY3Rpb25VcGRhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25TZWxlY3Rpb25VcGRhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uVHJhbnNhY3Rpb24/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uVHJhbnNhY3Rpb24nXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBmb2N1c2VkLlxuICAgICAqL1xuICAgIG9uRm9jdXM/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRm9jdXMnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGV2ZW50OiBGb2N1c0V2ZW50XG4gICAgICAgICAgfSxcbiAgICAgICAgKSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGlzbuKAmXQgZm9jdXNlZCBhbnltb3JlLlxuICAgICAqL1xuICAgIG9uQmx1cj86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25CbHVyJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgb25EZXN0cm95PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRGVzdHJveSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uPE9wdGlvbnMgPSBhbnksIFN0b3JhZ2UgPSBhbnk+IHtcbiAgdHlwZSA9ICdleHRlbnNpb24nXG5cbiAgbmFtZSA9ICdleHRlbnNpb24nXG5cbiAgcGFyZW50OiBFeHRlbnNpb24gfCBudWxsID0gbnVsbFxuXG4gIGNoaWxkOiBFeHRlbnNpb24gfCBudWxsID0gbnVsbFxuXG4gIG9wdGlvbnM6IE9wdGlvbnNcblxuICBzdG9yYWdlOiBTdG9yYWdlXG5cbiAgY29uZmlnOiBFeHRlbnNpb25Db25maWcgPSB7XG4gICAgbmFtZTogdGhpcy5uYW1lLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+ID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgLi4uY29uZmlnLFxuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uZmlnLm5hbWVcblxuICAgIGlmIChjb25maWcuZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt0aXB0YXAgd2Fybl06IEJSRUFLSU5HIENIQU5HRTogXCJkZWZhdWx0T3B0aW9uc1wiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJhZGRPcHRpb25zXCIgaW5zdGVhZC4gRm91bmQgaW4gZXh0ZW5zaW9uOiBcIiR7dGhpcy5uYW1lfVwiLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlIGBhZGRPcHRpb25zYCBmYWxsYmFja1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuY29uZmlnLmRlZmF1bHRPcHRpb25zXG5cbiAgICBpZiAodGhpcy5jb25maWcuYWRkT3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0gY2FsbE9yUmV0dXJuKFxuICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZE9wdGlvbnMnXT4odGhpcywgJ2FkZE9wdGlvbnMnLCB7XG4gICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JhZ2UgPSBjYWxsT3JSZXR1cm4oXG4gICAgICBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZFN0b3JhZ2UnXT4odGhpcywgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgfSksXG4gICAgKSB8fCB7fVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZTxPID0gYW55LCBTID0gYW55Pihjb25maWc6IFBhcnRpYWw8RXh0ZW5zaW9uQ29uZmlnPE8sIFM+PiA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlbnNpb248TywgUz4oY29uZmlnKVxuICB9XG5cbiAgY29uZmlndXJlKG9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7fSkge1xuICAgIC8vIHJldHVybiBhIG5ldyBpbnN0YW5jZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGV4dGVuc2lvblxuICAgIC8vIHdpdGggZGlmZmVyZW50IGNhbGxzIG9mIGBjb25maWd1cmVgXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5leHRlbmQoKVxuXG4gICAgZXh0ZW5zaW9uLm9wdGlvbnMgPSBtZXJnZURlZXAodGhpcy5vcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnMpIGFzIE9wdGlvbnNcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxuXG4gIGV4dGVuZDxFeHRlbmRlZE9wdGlvbnMgPSBPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2UgPSBTdG9yYWdlPihcbiAgICBleHRlbmRlZENvbmZpZzogUGFydGlhbDxFeHRlbnNpb25Db25maWc8RXh0ZW5kZWRPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2U+PiA9IHt9LFxuICApIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uPEV4dGVuZGVkT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlPihleHRlbmRlZENvbmZpZylcblxuICAgIGV4dGVuc2lvbi5wYXJlbnQgPSB0aGlzXG5cbiAgICB0aGlzLmNoaWxkID0gZXh0ZW5zaW9uXG5cbiAgICBleHRlbnNpb24ubmFtZSA9IGV4dGVuZGVkQ29uZmlnLm5hbWUgPyBleHRlbmRlZENvbmZpZy5uYW1lIDogZXh0ZW5zaW9uLnBhcmVudC5uYW1lXG5cbiAgICBpZiAoZXh0ZW5kZWRDb25maWcuZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt0aXB0YXAgd2Fybl06IEJSRUFLSU5HIENIQU5HRTogXCJkZWZhdWx0T3B0aW9uc1wiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJhZGRPcHRpb25zXCIgaW5zdGVhZC4gRm91bmQgaW4gZXh0ZW5zaW9uOiBcIiR7ZXh0ZW5zaW9uLm5hbWV9XCIuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBleHRlbnNpb24ub3B0aW9ucyA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkT3B0aW9ucyddPihleHRlbnNpb24sICdhZGRPcHRpb25zJywge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgUmFuZ2UsIFRleHRTZXJpYWxpemVyIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0QmV0d2VlbihcbiAgc3RhcnROb2RlOiBQcm9zZU1pcnJvck5vZGUsXG4gIHJhbmdlOiBSYW5nZSxcbiAgb3B0aW9ucz86IHtcbiAgICBibG9ja1NlcGFyYXRvcj86IHN0cmluZ1xuICAgIHRleHRTZXJpYWxpemVycz86IFJlY29yZDxzdHJpbmcsIFRleHRTZXJpYWxpemVyPlxuICB9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgeyBmcm9tLCB0byB9ID0gcmFuZ2VcbiAgY29uc3QgeyBibG9ja1NlcGFyYXRvciA9ICdcXG5cXG4nLCB0ZXh0U2VyaWFsaXplcnMgPSB7fSB9ID0gb3B0aW9ucyB8fCB7fVxuICBsZXQgdGV4dCA9ICcnXG4gIGxldCBzZXBhcmF0ZWQgPSB0cnVlXG5cbiAgc3RhcnROb2RlLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcywgcGFyZW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHRleHRTZXJpYWxpemVyID0gdGV4dFNlcmlhbGl6ZXJzPy5bbm9kZS50eXBlLm5hbWVdXG5cbiAgICBpZiAodGV4dFNlcmlhbGl6ZXIpIHtcbiAgICAgIGlmIChub2RlLmlzQmxvY2sgJiYgIXNlcGFyYXRlZCkge1xuICAgICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yXG4gICAgICAgIHNlcGFyYXRlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICB0ZXh0ICs9IHRleHRTZXJpYWxpemVyKHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHBvcyxcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgcmFuZ2UsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLmlzVGV4dCkge1xuICAgICAgdGV4dCArPSBub2RlPy50ZXh0Py5zbGljZShNYXRoLm1heChmcm9tLCBwb3MpIC0gcG9zLCB0byAtIHBvcykgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgc2VwYXJhdGVkID0gZmFsc2VcbiAgICB9IGVsc2UgaWYgKG5vZGUuaXNCbG9jayAmJiAhc2VwYXJhdGVkKSB7XG4gICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yXG4gICAgICBzZXBhcmF0ZWQgPSB0cnVlXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB0ZXh0XG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgVGV4dFNlcmlhbGl6ZXIgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEoc2NoZW1hOiBTY2hlbWEpOiBSZWNvcmQ8c3RyaW5nLCBUZXh0U2VyaWFsaXplcj4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5ub2RlcylcbiAgICAgIC5maWx0ZXIoKFssIG5vZGVdKSA9PiBub2RlLnNwZWMudG9UZXh0KVxuICAgICAgLm1hcCgoW25hbWUsIG5vZGVdKSA9PiBbbmFtZSwgbm9kZS5zcGVjLnRvVGV4dF0pLFxuICApXG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9FeHRlbnNpb24uanMnXG5pbXBvcnQgeyBnZXRUZXh0QmV0d2VlbiB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0VGV4dEJldHdlZW4uanMnXG5pbXBvcnQgeyBnZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hIH0gZnJvbSAnLi4vaGVscGVycy9nZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hLmpzJ1xuXG5leHBvcnQgY29uc3QgQ2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXIgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2NsaXBib2FyZFRleHRTZXJpYWxpemVyJyxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICBrZXk6IG5ldyBQbHVnaW5LZXkoJ2NsaXBib2FyZFRleHRTZXJpYWxpemVyJyksXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgY2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXI6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzXG4gICAgICAgICAgICBjb25zdCB7IHN0YXRlLCBzY2hlbWEgfSA9IGVkaXRvclxuICAgICAgICAgICAgY29uc3QgeyBkb2MsIHNlbGVjdGlvbiB9ID0gc3RhdGVcbiAgICAgICAgICAgIGNvbnN0IHsgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1pbiguLi5yYW5nZXMubWFwKHJhbmdlID0+IHJhbmdlLiRmcm9tLnBvcykpXG4gICAgICAgICAgICBjb25zdCB0byA9IE1hdGgubWF4KC4uLnJhbmdlcy5tYXAocmFuZ2UgPT4gcmFuZ2UuJHRvLnBvcykpXG4gICAgICAgICAgICBjb25zdCB0ZXh0U2VyaWFsaXplcnMgPSBnZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hKHNjaGVtYSlcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0geyBmcm9tLCB0byB9XG5cbiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0QmV0d2Vlbihkb2MsIHJhbmdlLCB7XG4gICAgICAgICAgICAgIHRleHRTZXJpYWxpemVycyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJsdXI6IHtcbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBlZGl0b3IuXG4gICAgICAgKi9cbiAgICAgIGJsdXI6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibHVyOiBSYXdDb21tYW5kc1snYmx1ciddID0gKCkgPT4gKHsgZWRpdG9yLCB2aWV3IH0pID0+IHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICBpZiAoIWVkaXRvci5pc0Rlc3Ryb3llZCkge1xuICAgICAgKHZpZXcuZG9tIGFzIEhUTUxFbGVtZW50KS5ibHVyKClcblxuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIHJlbW92ZSB0aGUgY2FyZXQgb24gYmx1ciBidXQgc2FmYXJpIGRvZXMgbm90LlxuICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdWViZXJkb3Npcy90aXB0YXAvaXNzdWVzLzI0MDVcbiAgICAgIHdpbmRvdz8uZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGNsZWFyQ29udGVudDoge1xuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciB0aGUgd2hvbGUgZG9jdW1lbnQuXG4gICAgICAgKi9cbiAgICAgIGNsZWFyQ29udGVudDogKGVtaXRVcGRhdGU/OiBib29sZWFuKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJDb250ZW50OiBSYXdDb21tYW5kc1snY2xlYXJDb250ZW50J10gPSAoZW1pdFVwZGF0ZSA9IGZhbHNlKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gIHJldHVybiBjb21tYW5kcy5zZXRDb250ZW50KCcnLCBlbWl0VXBkYXRlKVxufVxuIiwgImltcG9ydCB7IGxpZnRUYXJnZXQgfSBmcm9tICdAdGlwdGFwL3BtL3RyYW5zZm9ybSdcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGNsZWFyTm9kZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogTm9ybWFsaXplIG5vZGVzIHRvIGEgc2ltcGxlIHBhcmFncmFwaC5cbiAgICAgICAqL1xuICAgICAgY2xlYXJOb2RlczogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFyTm9kZXM6IFJhd0NvbW1hbmRzWydjbGVhck5vZGVzJ10gPSAoKSA9PiAoeyBzdGF0ZSwgdHIsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHRyXG4gIGNvbnN0IHsgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICBpZiAoIWRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJhbmdlcy5mb3JFYWNoKCh7ICRmcm9tLCAkdG8gfSkgPT4ge1xuICAgIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oJGZyb20ucG9zLCAkdG8ucG9zLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlLmlzVGV4dCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkb2MsIG1hcHBpbmcgfSA9IHRyXG4gICAgICBjb25zdCAkbWFwcGVkRnJvbSA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHBvcykpXG4gICAgICBjb25zdCAkbWFwcGVkVG8gPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcChwb3MgKyBub2RlLm5vZGVTaXplKSlcbiAgICAgIGNvbnN0IG5vZGVSYW5nZSA9ICRtYXBwZWRGcm9tLmJsb2NrUmFuZ2UoJG1hcHBlZFRvKVxuXG4gICAgICBpZiAoIW5vZGVSYW5nZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0TGlmdERlcHRoID0gbGlmdFRhcmdldChub2RlUmFuZ2UpXG5cbiAgICAgIGlmIChub2RlLnR5cGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0VHlwZSB9ID0gJG1hcHBlZEZyb20ucGFyZW50LmNvbnRlbnRNYXRjaEF0KCRtYXBwZWRGcm9tLmluZGV4KCkpXG5cbiAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cChub2RlUmFuZ2Uuc3RhcnQsIGRlZmF1bHRUeXBlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFyZ2V0TGlmdERlcHRoIHx8IHRhcmdldExpZnREZXB0aCA9PT0gMCkge1xuICAgICAgICB0ci5saWZ0KG5vZGVSYW5nZSwgdGFyZ2V0TGlmdERlcHRoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBDb21tYW5kLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgY29tbWFuZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWZpbmUgYSBjb21tYW5kIGlubGluZS5cbiAgICAgICAqL1xuICAgICAgY29tbWFuZDogKGZuOiAocHJvcHM6IFBhcmFtZXRlcnM8Q29tbWFuZD5bMF0pID0+IGJvb2xlYW4pID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb21tYW5kOiBSYXdDb21tYW5kc1snY29tbWFuZCddID0gZm4gPT4gcHJvcHMgPT4ge1xuICByZXR1cm4gZm4ocHJvcHMpXG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlUGFyYWdyYXBoTmVhciBhcyBvcmlnaW5hbENyZWF0ZVBhcmFncmFwaE5lYXIgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgY3JlYXRlUGFyYWdyYXBoTmVhcjoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGUgYSBwYXJhZ3JhcGggbmVhcmJ5LlxuICAgICAgICovXG4gICAgICBjcmVhdGVQYXJhZ3JhcGhOZWFyOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXJhZ3JhcGhOZWFyOiBSYXdDb21tYW5kc1snY3JlYXRlUGFyYWdyYXBoTmVhciddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsQ3JlYXRlUGFyYWdyYXBoTmVhcihzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBjdXQ6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3V0cyBjb250ZW50IGZyb20gYSByYW5nZSBhbmQgaW5zZXJ0cyBpdCBhdCBhIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgICovXG4gICAgICBjdXQ6ICh7IGZyb20sIHRvIH06IHsgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyIH0sIHRhcmdldFBvczogbnVtYmVyKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY3V0OiBSYXdDb21tYW5kc1snY3V0J10gPSAob3JpZ2luUmFuZ2UsIHRhcmdldFBvcykgPT4gKHsgZWRpdG9yLCB0ciB9KSA9PiB7XG4gIGNvbnN0IHsgc3RhdGUgfSA9IGVkaXRvclxuXG4gIGNvbnN0IGNvbnRlbnRTbGljZSA9IHN0YXRlLmRvYy5zbGljZShvcmlnaW5SYW5nZS5mcm9tLCBvcmlnaW5SYW5nZS50bylcblxuICB0ci5kZWxldGVSYW5nZShvcmlnaW5SYW5nZS5mcm9tLCBvcmlnaW5SYW5nZS50bylcbiAgY29uc3QgbmV3UG9zID0gdHIubWFwcGluZy5tYXAodGFyZ2V0UG9zKVxuXG4gIHRyLmluc2VydChuZXdQb3MsIGNvbnRlbnRTbGljZS5jb250ZW50KVxuXG4gIHRyLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbih0ci5kb2MucmVzb2x2ZShuZXdQb3MgLSAxKSkpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZGVsZXRlQ3VycmVudE5vZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlIHRoZSBub2RlIHRoYXQgY3VycmVudGx5IGhhcyB0aGUgc2VsZWN0aW9uIGFuY2hvci5cbiAgICAgICAqL1xuICAgICAgZGVsZXRlQ3VycmVudE5vZGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVDdXJyZW50Tm9kZTogUmF3Q29tbWFuZHNbJ2RlbGV0ZUN1cnJlbnROb2RlJ10gPSAoKSA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJcbiAgY29uc3QgY3VycmVudE5vZGUgPSBzZWxlY3Rpb24uJGFuY2hvci5ub2RlKClcblxuICAvLyBpZiB0aGVyZSBpcyBjb250ZW50IGluc2lkZSB0aGUgY3VycmVudCBub2RlLCBicmVhayBvdXQgb2YgdGhpcyBjb21tYW5kXG4gIGlmIChjdXJyZW50Tm9kZS5jb250ZW50LnNpemUgPiAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCAkcG9zID0gdHIuc2VsZWN0aW9uLiRhbmNob3JcblxuICBmb3IgKGxldCBkZXB0aCA9ICRwb3MuZGVwdGg7IGRlcHRoID4gMDsgZGVwdGggLT0gMSkge1xuICAgIGNvbnN0IG5vZGUgPSAkcG9zLm5vZGUoZGVwdGgpXG5cbiAgICBpZiAobm9kZS50eXBlID09PSBjdXJyZW50Tm9kZS50eXBlKSB7XG4gICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgY29uc3QgZnJvbSA9ICRwb3MuYmVmb3JlKGRlcHRoKVxuICAgICAgICBjb25zdCB0byA9ICRwb3MuYWZ0ZXIoZGVwdGgpXG5cbiAgICAgICAgdHIuZGVsZXRlKGZyb20sIHRvKS5zY3JvbGxJbnRvVmlldygpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZGVsZXRlTm9kZToge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGUgYSBub2RlLlxuICAgICAgICovXG4gICAgICBkZWxldGVOb2RlOiAodHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVOb2RlOiBSYXdDb21tYW5kc1snZGVsZXRlTm9kZSddID0gdHlwZU9yTmFtZSA9PiAoeyB0ciwgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgJHBvcyA9IHRyLnNlbGVjdGlvbi4kYW5jaG9yXG5cbiAgZm9yIChsZXQgZGVwdGggPSAkcG9zLmRlcHRoOyBkZXB0aCA+IDA7IGRlcHRoIC09IDEpIHtcbiAgICBjb25zdCBub2RlID0gJHBvcy5ub2RlKGRlcHRoKVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gdHlwZSkge1xuICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGNvbnN0IGZyb20gPSAkcG9zLmJlZm9yZShkZXB0aClcbiAgICAgICAgY29uc3QgdG8gPSAkcG9zLmFmdGVyKGRlcHRoKVxuXG4gICAgICAgIHRyLmRlbGV0ZShmcm9tLCB0bykuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IFJhbmdlLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZGVsZXRlUmFuZ2U6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlIGEgZ2l2ZW4gcmFuZ2UuXG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZVJhbmdlOiAocmFuZ2U6IFJhbmdlKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVsZXRlUmFuZ2U6IFJhd0NvbW1hbmRzWydkZWxldGVSYW5nZSddID0gcmFuZ2UgPT4gKHsgdHIsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgeyBmcm9tLCB0byB9ID0gcmFuZ2VcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICB0ci5kZWxldGUoZnJvbSwgdG8pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IGRlbGV0ZVNlbGVjdGlvbiBhcyBvcmlnaW5hbERlbGV0ZVNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBkZWxldGVTZWxlY3Rpb246IHtcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlIHRoZSBzZWxlY3Rpb24sIGlmIHRoZXJlIGlzIG9uZS5cbiAgICAgICAqL1xuICAgICAgZGVsZXRlU2VsZWN0aW9uOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVTZWxlY3Rpb246IFJhd0NvbW1hbmRzWydkZWxldGVTZWxlY3Rpb24nXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbERlbGV0ZVNlbGVjdGlvbihzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGVudGVyOiB7XG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgZW50ZXIuXG4gICAgICAgKi9cbiAgICAgIGVudGVyOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZW50ZXI6IFJhd0NvbW1hbmRzWydlbnRlciddID0gKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICByZXR1cm4gY29tbWFuZHMua2V5Ym9hcmRTaG9ydGN1dCgnRW50ZXInKVxufVxuIiwgImltcG9ydCB7IGV4aXRDb2RlIGFzIG9yaWdpbmFsRXhpdENvZGUgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZXhpdENvZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogRXhpdCBmcm9tIGEgY29kZSBibG9jay5cbiAgICAgICAqL1xuICAgICAgZXhpdENvZGU6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGV4aXRDb2RlOiBSYXdDb21tYW5kc1snZXhpdENvZGUnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbEV4aXRDb2RlKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgeyBpc1JlZ0V4cCB9IGZyb20gJy4vaXNSZWdFeHAuanMnXG5cbi8qKlxuICogQ2hlY2sgaWYgb2JqZWN0MSBpbmNsdWRlcyBvYmplY3QyXG4gKiBAcGFyYW0gb2JqZWN0MSBPYmplY3RcbiAqIEBwYXJhbSBvYmplY3QyIE9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0SW5jbHVkZXMoXG4gIG9iamVjdDE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9iamVjdDI6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9wdGlvbnM6IHsgc3RyaWN0OiBib29sZWFuIH0gPSB7IHN0cmljdDogdHJ1ZSB9LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QyKVxuXG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoa2V5ID0+IHtcbiAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QyW2tleV0gPT09IG9iamVjdDFba2V5XVxuICAgIH1cblxuICAgIGlmIChpc1JlZ0V4cChvYmplY3QyW2tleV0pKSB7XG4gICAgICByZXR1cm4gb2JqZWN0MltrZXldLnRlc3Qob2JqZWN0MVtrZXldKVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3QyW2tleV0gPT09IG9iamVjdDFba2V5XVxuICB9KVxufVxuIiwgImltcG9ydCB7IE1hcmsgYXMgUHJvc2VNaXJyb3JNYXJrLCBNYXJrVHlwZSwgUmVzb2x2ZWRQb3MgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgb2JqZWN0SW5jbHVkZXMgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JqZWN0SW5jbHVkZXMuanMnXG5cbmZ1bmN0aW9uIGZpbmRNYXJrSW5TZXQoXG4gIG1hcmtzOiBQcm9zZU1pcnJvck1hcmtbXSxcbiAgdHlwZTogTWFya1R5cGUsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IFByb3NlTWlycm9yTWFyayB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBtYXJrcy5maW5kKGl0ZW0gPT4ge1xuICAgIHJldHVybiBpdGVtLnR5cGUgPT09IHR5cGUgJiYgb2JqZWN0SW5jbHVkZXMoaXRlbS5hdHRycywgYXR0cmlidXRlcylcbiAgfSlcbn1cblxuZnVuY3Rpb24gaXNNYXJrSW5TZXQoXG4gIG1hcmtzOiBQcm9zZU1pcnJvck1hcmtbXSxcbiAgdHlwZTogTWFya1R5cGUsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFmaW5kTWFya0luU2V0KG1hcmtzLCB0eXBlLCBhdHRyaWJ1dGVzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya1JhbmdlKFxuICAkcG9zOiBSZXNvbHZlZFBvcyxcbiAgdHlwZTogTWFya1R5cGUsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IFJhbmdlIHwgdm9pZCB7XG4gIGlmICghJHBvcyB8fCAhdHlwZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IHN0YXJ0ID0gJHBvcy5wYXJlbnQuY2hpbGRBZnRlcigkcG9zLnBhcmVudE9mZnNldClcblxuICBpZiAoJHBvcy5wYXJlbnRPZmZzZXQgPT09IHN0YXJ0Lm9mZnNldCAmJiBzdGFydC5vZmZzZXQgIT09IDApIHtcbiAgICBzdGFydCA9ICRwb3MucGFyZW50LmNoaWxkQmVmb3JlKCRwb3MucGFyZW50T2Zmc2V0KVxuICB9XG5cbiAgaWYgKCFzdGFydC5ub2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtYXJrID0gZmluZE1hcmtJblNldChbLi4uc3RhcnQubm9kZS5tYXJrc10sIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgaWYgKCFtYXJrKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgc3RhcnRJbmRleCA9IHN0YXJ0LmluZGV4XG4gIGxldCBzdGFydFBvcyA9ICRwb3Muc3RhcnQoKSArIHN0YXJ0Lm9mZnNldFxuICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgMVxuICBsZXQgZW5kUG9zID0gc3RhcnRQb3MgKyBzdGFydC5ub2RlLm5vZGVTaXplXG5cbiAgZmluZE1hcmtJblNldChbLi4uc3RhcnQubm9kZS5tYXJrc10sIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgd2hpbGUgKHN0YXJ0SW5kZXggPiAwICYmIG1hcmsuaXNJblNldCgkcG9zLnBhcmVudC5jaGlsZChzdGFydEluZGV4IC0gMSkubWFya3MpKSB7XG4gICAgc3RhcnRJbmRleCAtPSAxXG4gICAgc3RhcnRQb3MgLT0gJHBvcy5wYXJlbnQuY2hpbGQoc3RhcnRJbmRleCkubm9kZVNpemVcbiAgfVxuXG4gIHdoaWxlIChcbiAgICBlbmRJbmRleCA8ICRwb3MucGFyZW50LmNoaWxkQ291bnRcbiAgICAmJiBpc01hcmtJblNldChbLi4uJHBvcy5wYXJlbnQuY2hpbGQoZW5kSW5kZXgpLm1hcmtzXSwgdHlwZSwgYXR0cmlidXRlcylcbiAgKSB7XG4gICAgZW5kUG9zICs9ICRwb3MucGFyZW50LmNoaWxkKGVuZEluZGV4KS5ub2RlU2l6ZVxuICAgIGVuZEluZGV4ICs9IDFcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbTogc3RhcnRQb3MsXG4gICAgdG86IGVuZFBvcyxcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya1R5cGUobmFtZU9yVHlwZTogc3RyaW5nIHwgTWFya1R5cGUsIHNjaGVtYTogU2NoZW1hKTogTWFya1R5cGUge1xuICBpZiAodHlwZW9mIG5hbWVPclR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFzY2hlbWEubWFya3NbbmFtZU9yVHlwZV0pIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gbWFyayB0eXBlIG5hbWVkICcke25hbWVPclR5cGV9Jy4gTWF5YmUgeW91IGZvcmdvdCB0byBhZGQgdGhlIGV4dGVuc2lvbj9gLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWEubWFya3NbbmFtZU9yVHlwZV1cbiAgfVxuXG4gIHJldHVybiBuYW1lT3JUeXBlXG59XG4iLCAiaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGdldE1hcmtSYW5nZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0TWFya1JhbmdlLmpzJ1xuaW1wb3J0IHsgZ2V0TWFya1R5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtUeXBlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGV4dGVuZE1hcmtSYW5nZToge1xuICAgICAgLyoqXG4gICAgICAgKiBFeHRlbmRzIHRoZSB0ZXh0IHNlbGVjdGlvbiB0byB0aGUgY3VycmVudCBtYXJrLlxuICAgICAgICovXG4gICAgICBleHRlbmRNYXJrUmFuZ2U6IChcbiAgICAgICAgdHlwZU9yTmFtZTogc3RyaW5nIHwgTWFya1R5cGUsXG4gICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBleHRlbmRNYXJrUmFuZ2U6IFJhd0NvbW1hbmRzWydleHRlbmRNYXJrUmFuZ2UnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7IHRyLCBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB0eXBlID0gZ2V0TWFya1R5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7IGRvYywgc2VsZWN0aW9uIH0gPSB0clxuICBjb25zdCB7ICRmcm9tLCBmcm9tLCB0byB9ID0gc2VsZWN0aW9uXG5cbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBnZXRNYXJrUmFuZ2UoJGZyb20sIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgICBpZiAocmFuZ2UgJiYgcmFuZ2UuZnJvbSA8PSBmcm9tICYmIHJhbmdlLnRvID49IHRvKSB7XG4gICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIHJhbmdlLmZyb20sIHJhbmdlLnRvKVxuXG4gICAgICB0ci5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZFByb3BzLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZmlyc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogUnVucyBvbmUgY29tbWFuZCBhZnRlciB0aGUgb3RoZXIgYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aGljaCByZXR1cm5zIHRydWUuXG4gICAgICAgKi9cbiAgICAgIGZpcnN0OiAoY29tbWFuZHM6IENvbW1hbmRbXSB8ICgocHJvcHM6IENvbW1hbmRQcm9wcykgPT4gQ29tbWFuZFtdKSkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGZpcnN0OiBSYXdDb21tYW5kc1snZmlyc3QnXSA9IGNvbW1hbmRzID0+IHByb3BzID0+IHtcbiAgY29uc3QgaXRlbXMgPSB0eXBlb2YgY29tbWFuZHMgPT09ICdmdW5jdGlvbidcbiAgICA/IGNvbW1hbmRzKHByb3BzKVxuICAgIDogY29tbWFuZHNcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGl0ZW1zW2ldKHByb3BzKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBUZXh0U2VsZWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGV4dFNlbGVjdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRleHRTZWxlY3Rpb24ge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG1pbk1heCh2YWx1ZSA9IDAsIG1pbiA9IDAsIG1heCA9IDApOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIG1pbiksIG1heClcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBTZWxlY3Rpb24sIFRleHRTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBGb2N1c1Bvc2l0aW9uIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBtaW5NYXggfSBmcm9tICcuLi91dGlsaXRpZXMvbWluTWF4LmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvY3VzUG9zaXRpb24oXG4gIGRvYzogUHJvc2VNaXJyb3JOb2RlLFxuICBwb3NpdGlvbjogRm9jdXNQb3NpdGlvbiA9IG51bGwsXG4pOiBTZWxlY3Rpb24gfCBudWxsIHtcbiAgaWYgKCFwb3NpdGlvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBzZWxlY3Rpb25BdFN0YXJ0ID0gU2VsZWN0aW9uLmF0U3RhcnQoZG9jKVxuICBjb25zdCBzZWxlY3Rpb25BdEVuZCA9IFNlbGVjdGlvbi5hdEVuZChkb2MpXG5cbiAgaWYgKHBvc2l0aW9uID09PSAnc3RhcnQnIHx8IHBvc2l0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkF0U3RhcnRcbiAgfVxuXG4gIGlmIChwb3NpdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICByZXR1cm4gc2VsZWN0aW9uQXRFbmRcbiAgfVxuXG4gIGNvbnN0IG1pblBvcyA9IHNlbGVjdGlvbkF0U3RhcnQuZnJvbVxuICBjb25zdCBtYXhQb3MgPSBzZWxlY3Rpb25BdEVuZC50b1xuXG4gIGlmIChwb3NpdGlvbiA9PT0gJ2FsbCcpIHtcbiAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGUoXG4gICAgICBkb2MsXG4gICAgICBtaW5NYXgoMCwgbWluUG9zLCBtYXhQb3MpLFxuICAgICAgbWluTWF4KGRvYy5jb250ZW50LnNpemUsIG1pblBvcywgbWF4UG9zKSxcbiAgICApXG4gIH1cblxuICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGUoXG4gICAgZG9jLFxuICAgIG1pbk1heChwb3NpdGlvbiwgbWluUG9zLCBtYXhQb3MpLFxuICAgIG1pbk1heChwb3NpdGlvbiwgbWluUG9zLCBtYXhQb3MpLFxuICApXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzaU9TKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgICdpUGFkIFNpbXVsYXRvcicsXG4gICAgJ2lQaG9uZSBTaW11bGF0b3InLFxuICAgICdpUG9kIFNpbXVsYXRvcicsXG4gICAgJ2lQYWQnLFxuICAgICdpUGhvbmUnLFxuICAgICdpUG9kJyxcbiAgXS5pbmNsdWRlcyhuYXZpZ2F0b3IucGxhdGZvcm0pXG4gIC8vIGlQYWQgb24gaU9TIDEzIGRldGVjdGlvblxuICB8fCAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygnTWFjJykgJiYgJ29udG91Y2hlbmQnIGluIGRvY3VtZW50KVxufVxuIiwgImltcG9ydCB7IGlzVGV4dFNlbGVjdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvaXNUZXh0U2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZUZvY3VzUG9zaXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL3Jlc29sdmVGb2N1c1Bvc2l0aW9uLmpzJ1xuaW1wb3J0IHsgRm9jdXNQb3NpdGlvbiwgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGlzaU9TIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzaU9TLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZm9jdXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRm9jdXMgdGhlIGVkaXRvciBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgICAgKi9cbiAgICAgIGZvY3VzOiAoXG4gICAgICAgIHBvc2l0aW9uPzogRm9jdXNQb3NpdGlvbixcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldz86IGJvb2xlYW4sXG4gICAgICAgIH0sXG4gICAgICApID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBmb2N1czogUmF3Q29tbWFuZHNbJ2ZvY3VzJ10gPSAocG9zaXRpb24gPSBudWxsLCBvcHRpb25zID0ge30pID0+ICh7XG4gIGVkaXRvcixcbiAgdmlldyxcbiAgdHIsXG4gIGRpc3BhdGNoLFxufSkgPT4ge1xuICBvcHRpb25zID0ge1xuICAgIHNjcm9sbEludG9WaWV3OiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cblxuICBjb25zdCBkZWxheWVkRm9jdXMgPSAoKSA9PiB7XG4gICAgLy8gZm9jdXMgd2l0aGluIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGJyZWFrcyBmb2N1cyBvbiBpT1NcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGNhbGwgdGhpc1xuICAgIGlmIChpc2lPUygpKSB7XG4gICAgICAodmlldy5kb20gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKClcbiAgICB9XG5cbiAgICAvLyBGb3IgUmVhY3Qgd2UgaGF2ZSB0byBmb2N1cyBhc3luY2hyb25vdXNseS4gT3RoZXJ3aXNlIHdpbGQgdGhpbmdzIGhhcHBlbi5cbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS91ZWJlcmRvc2lzL3RpcHRhcC9pc3N1ZXMvMTUyMFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAoIWVkaXRvci5pc0Rlc3Ryb3llZCkge1xuICAgICAgICB2aWV3LmZvY3VzKClcblxuICAgICAgICBpZiAob3B0aW9ucz8uc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgICBlZGl0b3IuY29tbWFuZHMuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmICgodmlldy5oYXNGb2N1cygpICYmIHBvc2l0aW9uID09PSBudWxsKSB8fCBwb3NpdGlvbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gd2UgZG9u4oCZdCB0cnkgdG8gcmVzb2x2ZSBhIE5vZGVTZWxlY3Rpb24gb3IgQ2VsbFNlbGVjdGlvblxuICBpZiAoZGlzcGF0Y2ggJiYgcG9zaXRpb24gPT09IG51bGwgJiYgIWlzVGV4dFNlbGVjdGlvbihlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uKSkge1xuICAgIGRlbGF5ZWRGb2N1cygpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIHBhc3MgdGhyb3VnaCB0ci5kb2MgaW5zdGVhZCBvZiBlZGl0b3Iuc3RhdGUuZG9jXG4gIC8vIHNpbmNlIHRyYW5zYWN0aW9ucyBjb3VsZCBjaGFuZ2UgdGhlIGVkaXRvcnMgc3RhdGUgYmVmb3JlIHRoaXMgY29tbWFuZCBoYXMgYmVlbiBydW5cbiAgY29uc3Qgc2VsZWN0aW9uID0gcmVzb2x2ZUZvY3VzUG9zaXRpb24odHIuZG9jLCBwb3NpdGlvbikgfHwgZWRpdG9yLnN0YXRlLnNlbGVjdGlvblxuICBjb25zdCBpc1NhbWVTZWxlY3Rpb24gPSBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLmVxKHNlbGVjdGlvbilcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBpZiAoIWlzU2FtZVNlbGVjdGlvbikge1xuICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbilcbiAgICB9XG5cbiAgICAvLyBgdHIuc2V0U2VsZWN0aW9uYCByZXNldHMgdGhlIHN0b3JlZCBtYXJrc1xuICAgIC8vIHNvIHdl4oCZbGwgcmVzdG9yZSB0aGVtIGlmIHRoZSBzZWxlY3Rpb24gaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gICAgaWYgKGlzU2FtZVNlbGVjdGlvbiAmJiB0ci5zdG9yZWRNYXJrcykge1xuICAgICAgdHIuc2V0U3RvcmVkTWFya3ModHIuc3RvcmVkTWFya3MpXG4gICAgfVxuXG4gICAgZGVsYXllZEZvY3VzKClcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFByb3BzLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZm9yRWFjaDoge1xuICAgICAgLyoqXG4gICAgICAgKiBMb29wIHRocm91Z2ggYW4gYXJyYXkgb2YgaXRlbXMuXG4gICAgICAgKi9cbiAgICAgIGZvckVhY2g6IDxUPihcbiAgICAgICAgaXRlbXM6IFRbXSxcbiAgICAgICAgZm46IChcbiAgICAgICAgICBpdGVtOiBULFxuICAgICAgICAgIHByb3BzOiBDb21tYW5kUHJvcHMgJiB7XG4gICAgICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gYm9vbGVhbixcbiAgICAgICkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGZvckVhY2g6IFJhd0NvbW1hbmRzWydmb3JFYWNoJ10gPSAoaXRlbXMsIGZuKSA9PiBwcm9wcyA9PiB7XG4gIHJldHVybiBpdGVtcy5ldmVyeSgoaXRlbSwgaW5kZXgpID0+IGZuKGl0ZW0sIHsgLi4ucHJvcHMsIGluZGV4IH0pKVxufVxuIiwgImltcG9ydCB7IFBhcnNlT3B0aW9ucyB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IENvbnRlbnQsIFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBpbnNlcnRDb250ZW50OiB7XG4gICAgICAvKipcbiAgICAgICAqIEluc2VydCBhIG5vZGUgb3Igc3RyaW5nIG9mIEhUTUwgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICAgKi9cbiAgICAgIGluc2VydENvbnRlbnQ6IChcbiAgICAgICAgdmFsdWU6IENvbnRlbnQsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgcGFyc2VPcHRpb25zPzogUGFyc2VPcHRpb25zXG4gICAgICAgICAgdXBkYXRlU2VsZWN0aW9uPzogYm9vbGVhblxuICAgICAgICB9LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRDb250ZW50OiBSYXdDb21tYW5kc1snaW5zZXJ0Q29udGVudCddID0gKHZhbHVlLCBvcHRpb25zKSA9PiAoeyB0ciwgY29tbWFuZHMgfSkgPT4ge1xuICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudEF0KFxuICAgIHsgZnJvbTogdHIuc2VsZWN0aW9uLmZyb20sIHRvOiB0ci5zZWxlY3Rpb24udG8gfSxcbiAgICB2YWx1ZSxcbiAgICBvcHRpb25zLFxuICApXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRGcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIC8vIGFkZCBhIHdyYXBwZXIgdG8gcHJlc2VydmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZVxuICBjb25zdCB3cmFwcGVkVmFsdWUgPSBgPGJvZHk+JHt2YWx1ZX08L2JvZHk+YFxuXG4gIHJldHVybiBuZXcgd2luZG93LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh3cmFwcGVkVmFsdWUsICd0ZXh0L2h0bWwnKS5ib2R5XG59XG4iLCAiaW1wb3J0IHtcbiAgRE9NUGFyc2VyLFxuICBGcmFnbWVudCxcbiAgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUsXG4gIFBhcnNlT3B0aW9ucyxcbiAgU2NoZW1hLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBlbGVtZW50RnJvbVN0cmluZyB9IGZyb20gJy4uL3V0aWxpdGllcy9lbGVtZW50RnJvbVN0cmluZy5qcydcblxuZXhwb3J0IHR5cGUgQ3JlYXRlTm9kZUZyb21Db250ZW50T3B0aW9ucyA9IHtcbiAgc2xpY2U/OiBib29sZWFuXG4gIHBhcnNlT3B0aW9ucz86IFBhcnNlT3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTm9kZUZyb21Db250ZW50KFxuICBjb250ZW50OiBDb250ZW50LFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgb3B0aW9ucz86IENyZWF0ZU5vZGVGcm9tQ29udGVudE9wdGlvbnMsXG4pOiBQcm9zZU1pcnJvck5vZGUgfCBGcmFnbWVudCB7XG4gIG9wdGlvbnMgPSB7XG4gICAgc2xpY2U6IHRydWUsXG4gICAgcGFyc2VPcHRpb25zOiB7fSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnb2JqZWN0JyAmJiBjb250ZW50ICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpICYmIGNvbnRlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbUFycmF5KGNvbnRlbnQubWFwKGl0ZW0gPT4gc2NoZW1hLm5vZGVGcm9tSlNPTihpdGVtKSkpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWEubm9kZUZyb21KU09OKGNvbnRlbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3RpcHRhcCB3YXJuXTogSW52YWxpZCBjb250ZW50LicsICdQYXNzZWQgdmFsdWU6JywgY29udGVudCwgJ0Vycm9yOicsIGVycm9yKVxuXG4gICAgICByZXR1cm4gY3JlYXRlTm9kZUZyb21Db250ZW50KCcnLCBzY2hlbWEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlciA9IERPTVBhcnNlci5mcm9tU2NoZW1hKHNjaGVtYSlcblxuICAgIHJldHVybiBvcHRpb25zLnNsaWNlXG4gICAgICA/IHBhcnNlci5wYXJzZVNsaWNlKGVsZW1lbnRGcm9tU3RyaW5nKGNvbnRlbnQpLCBvcHRpb25zLnBhcnNlT3B0aW9ucykuY29udGVudFxuICAgICAgOiBwYXJzZXIucGFyc2UoZWxlbWVudEZyb21TdHJpbmcoY29udGVudCksIG9wdGlvbnMucGFyc2VPcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZU5vZGVGcm9tQ29udGVudCgnJywgc2NoZW1hLCBvcHRpb25zKVxufVxuIiwgImltcG9ydCB7IFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgUmVwbGFjZUFyb3VuZFN0ZXAsIFJlcGxhY2VTdGVwIH0gZnJvbSAnQHRpcHRhcC9wbS90cmFuc2Zvcm0nXG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yLXN0YXRlL2Jsb2IvbWFzdGVyL3NyYy9zZWxlY3Rpb24uanMjTDQ2NlxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyOiBUcmFuc2FjdGlvbiwgc3RhcnRMZW46IG51bWJlciwgYmlhczogbnVtYmVyKSB7XG4gIGNvbnN0IGxhc3QgPSB0ci5zdGVwcy5sZW5ndGggLSAxXG5cbiAgaWYgKGxhc3QgPCBzdGFydExlbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RlcCA9IHRyLnN0ZXBzW2xhc3RdXG5cbiAgaWYgKCEoc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VTdGVwIHx8IHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlQXJvdW5kU3RlcCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1hcCA9IHRyLm1hcHBpbmcubWFwc1tsYXN0XVxuICBsZXQgZW5kID0gMFxuXG4gIG1hcC5mb3JFYWNoKChfZnJvbSwgX3RvLCBfbmV3RnJvbSwgbmV3VG8pID0+IHtcbiAgICBpZiAoZW5kID09PSAwKSB7XG4gICAgICBlbmQgPSBuZXdUb1xuICAgIH1cbiAgfSlcblxuICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoZW5kKSwgYmlhcykpXG59XG4iLCAiaW1wb3J0IHsgRnJhZ21lbnQsIE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlLCBQYXJzZU9wdGlvbnMgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBjcmVhdGVOb2RlRnJvbUNvbnRlbnQgfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZU5vZGVGcm9tQ29udGVudC5qcydcbmltcG9ydCB7IHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kIH0gZnJvbSAnLi4vaGVscGVycy9zZWxlY3Rpb25Ub0luc2VydGlvbkVuZC5qcydcbmltcG9ydCB7IENvbnRlbnQsIFJhbmdlLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaW5zZXJ0Q29udGVudEF0OiB7XG4gICAgICAvKipcbiAgICAgICAqIEluc2VydCBhIG5vZGUgb3Igc3RyaW5nIG9mIEhUTUwgYXQgYSBzcGVjaWZpYyBwb3NpdGlvbi5cbiAgICAgICAqL1xuICAgICAgaW5zZXJ0Q29udGVudEF0OiAoXG4gICAgICAgIHBvc2l0aW9uOiBudW1iZXIgfCBSYW5nZSxcbiAgICAgICAgdmFsdWU6IENvbnRlbnQsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgcGFyc2VPcHRpb25zPzogUGFyc2VPcHRpb25zXG4gICAgICAgICAgdXBkYXRlU2VsZWN0aW9uPzogYm9vbGVhblxuICAgICAgICB9LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGlzRnJhZ21lbnQgPSAobm9kZU9yRnJhZ21lbnQ6IFByb3NlTWlycm9yTm9kZSB8IEZyYWdtZW50KTogbm9kZU9yRnJhZ21lbnQgaXMgRnJhZ21lbnQgPT4ge1xuICByZXR1cm4gbm9kZU9yRnJhZ21lbnQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCc8Jylcbn1cblxuZXhwb3J0IGNvbnN0IGluc2VydENvbnRlbnRBdDogUmF3Q29tbWFuZHNbJ2luc2VydENvbnRlbnRBdCddID0gKHBvc2l0aW9uLCB2YWx1ZSwgb3B0aW9ucykgPT4gKHsgdHIsIGRpc3BhdGNoLCBlZGl0b3IgfSkgPT4ge1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgcGFyc2VPcHRpb25zOiB7fSxcbiAgICAgIHVwZGF0ZVNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGNyZWF0ZU5vZGVGcm9tQ29udGVudCh2YWx1ZSwgZWRpdG9yLnNjaGVtYSwge1xuICAgICAgcGFyc2VPcHRpb25zOiB7XG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZTogJ2Z1bGwnLFxuICAgICAgICAuLi5vcHRpb25zLnBhcnNlT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIC8vIGRvbuKAmXQgZGlzcGF0Y2ggYW4gZW1wdHkgZnJhZ21lbnQgYmVjYXVzZSB0aGlzIGNhbiBsZWFkIHRvIHN0cmFuZ2UgZXJyb3JzXG4gICAgaWYgKGNvbnRlbnQudG9TdHJpbmcoKSA9PT0gJzw+Jykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBsZXQgeyBmcm9tLCB0byB9ID0gdHlwZW9mIHBvc2l0aW9uID09PSAnbnVtYmVyJyA/IHsgZnJvbTogcG9zaXRpb24sIHRvOiBwb3NpdGlvbiB9IDogeyBmcm9tOiBwb3NpdGlvbi5mcm9tLCB0bzogcG9zaXRpb24udG8gfVxuXG4gICAgbGV0IGlzT25seVRleHRDb250ZW50ID0gdHJ1ZVxuICAgIGxldCBpc09ubHlCbG9ja0NvbnRlbnQgPSB0cnVlXG4gICAgY29uc3Qgbm9kZXMgPSBpc0ZyYWdtZW50KGNvbnRlbnQpID8gY29udGVudCA6IFtjb250ZW50XVxuXG4gICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGFkZGVkIG5vZGUgaXMgdmFsaWRcbiAgICAgIG5vZGUuY2hlY2soKVxuXG4gICAgICBpc09ubHlUZXh0Q29udGVudCA9IGlzT25seVRleHRDb250ZW50ID8gbm9kZS5pc1RleHQgJiYgbm9kZS5tYXJrcy5sZW5ndGggPT09IDAgOiBmYWxzZVxuXG4gICAgICBpc09ubHlCbG9ja0NvbnRlbnQgPSBpc09ubHlCbG9ja0NvbnRlbnQgPyBub2RlLmlzQmxvY2sgOiBmYWxzZVxuICAgIH0pXG5cbiAgICAvLyBjaGVjayBpZiB3ZSBjYW4gcmVwbGFjZSB0aGUgd3JhcHBpbmcgbm9kZSBieVxuICAgIC8vIHRoZSBuZXdseSBpbnNlcnRlZCBjb250ZW50XG4gICAgLy8gZXhhbXBsZTpcbiAgICAvLyByZXBsYWNlIGFuIGVtcHR5IHBhcmFncmFwaCBieSBhbiBpbnNlcnRlZCBpbWFnZVxuICAgIC8vIGluc3RlYWQgb2YgaW5zZXJ0aW5nIHRoZSBpbWFnZSBiZWxvdyB0aGUgcGFyYWdyYXBoXG4gICAgaWYgKGZyb20gPT09IHRvICYmIGlzT25seUJsb2NrQ29udGVudCkge1xuICAgICAgY29uc3QgeyBwYXJlbnQgfSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pXG4gICAgICBjb25zdCBpc0VtcHR5VGV4dEJsb2NrID0gcGFyZW50LmlzVGV4dGJsb2NrICYmICFwYXJlbnQudHlwZS5zcGVjLmNvZGUgJiYgIXBhcmVudC5jaGlsZENvdW50XG5cbiAgICAgIGlmIChpc0VtcHR5VGV4dEJsb2NrKSB7XG4gICAgICAgIGZyb20gLT0gMVxuICAgICAgICB0byArPSAxXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgaXMgb25seSBwbGFpbiB0ZXh0IHdlIGhhdmUgdG8gdXNlIGBpbnNlcnRUZXh0YFxuICAgIC8vIGJlY2F1c2UgdGhpcyB3aWxsIGtlZXAgdGhlIGN1cnJlbnQgbWFya3NcbiAgICBpZiAoaXNPbmx5VGV4dENvbnRlbnQpIHtcbiAgICAgIC8vIGlmIHZhbHVlIGlzIHN0cmluZywgd2UgY2FuIHVzZSBpdCBkaXJlY3RseVxuICAgICAgLy8gb3RoZXJ3aXNlIGlmIGl0IGlzIGFuIGFycmF5LCB3ZSBoYXZlIHRvIGpvaW4gaXRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0ci5pbnNlcnRUZXh0KHZhbHVlLm1hcCh2ID0+IHYudGV4dCB8fCAnJykuam9pbignJyksIGZyb20sIHRvKVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEhdmFsdWUgJiYgISF2YWx1ZS50ZXh0KSB7XG4gICAgICAgIHRyLmluc2VydFRleHQodmFsdWUudGV4dCwgZnJvbSwgdG8pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ci5pbnNlcnRUZXh0KHZhbHVlIGFzIHN0cmluZywgZnJvbSwgdG8pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyLnJlcGxhY2VXaXRoKGZyb20sIHRvLCBjb250ZW50KVxuICAgIH1cblxuICAgIC8vIHNldCBjdXJzb3IgYXQgZW5kIG9mIGluc2VydGVkIGNvbnRlbnRcbiAgICBpZiAob3B0aW9ucy51cGRhdGVTZWxlY3Rpb24pIHtcbiAgICAgIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCB0ci5zdGVwcy5sZW5ndGggLSAxLCAtMSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7XG4gIGpvaW5CYWNrd2FyZCBhcyBvcmlnaW5hbEpvaW5CYWNrd2FyZCxcbiAgam9pbkRvd24gYXMgb3JpZ2luYWxKb2luRG93bixcbiAgam9pbkZvcndhcmQgYXMgb3JpZ2luYWxKb2luRm9yd2FyZCxcbiAgam9pblVwIGFzIG9yaWdpbmFsSm9pblVwLFxufSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgam9pblVwOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIFVwLlxuICAgICAgICovXG4gICAgICBqb2luVXA6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gICAgam9pbkRvd246IHtcbiAgICAgIC8qKlxuICAgICAgICogSm9pbiB0d28gbm9kZXMgRG93bi5cbiAgICAgICAqL1xuICAgICAgam9pbkRvd246ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gICAgam9pbkJhY2t3YXJkOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIEJhY2t3YXJkcy5cbiAgICAgICAqL1xuICAgICAgam9pbkJhY2t3YXJkOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICAgIGpvaW5Gb3J3YXJkOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIEZvcndhcmRzLlxuICAgICAgICovXG4gICAgICBqb2luRm9yd2FyZDogKCkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgam9pblVwOiBSYXdDb21tYW5kc1snam9pblVwJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxKb2luVXAoc3RhdGUsIGRpc3BhdGNoKVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkRvd246IFJhd0NvbW1hbmRzWydqb2luRG93biddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsSm9pbkRvd24oc3RhdGUsIGRpc3BhdGNoKVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkJhY2t3YXJkOiBSYXdDb21tYW5kc1snam9pbkJhY2t3YXJkJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxKb2luQmFja3dhcmQoc3RhdGUsIGRpc3BhdGNoKVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkZvcndhcmQ6IFJhd0NvbW1hbmRzWydqb2luRm9yd2FyZCddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsSm9pbkZvcndhcmQoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IGpvaW5Qb2ludCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgam9pbkl0ZW1CYWNrd2FyZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBKb2luIHR3byBub2RlcyBGb3J3YXJkcy5cbiAgICAgICAqL1xuICAgICAgam9pbkl0ZW1CYWNrd2FyZDogKCkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkl0ZW1CYWNrd2FyZDogUmF3Q29tbWFuZHNbJ2pvaW5JdGVtQmFja3dhcmQnXSA9ICgpID0+ICh7XG4gIHRyLCBzdGF0ZSwgZGlzcGF0Y2gsXG59KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcG9pbnQgPSBqb2luUG9pbnQoc3RhdGUuZG9jLCBzdGF0ZS5zZWxlY3Rpb24uJGZyb20ucG9zLCAtMSlcblxuICAgIGlmIChwb2ludCA9PT0gbnVsbCB8fCBwb2ludCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0ci5qb2luKHBvaW50LCAyKVxuXG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBkaXNwYXRjaCh0cilcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwgImltcG9ydCB7IGpvaW5Qb2ludCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgam9pbkl0ZW1Gb3J3YXJkOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIEZvcndhcmRzLlxuICAgICAgICovXG4gICAgICBqb2luSXRlbUZvcndhcmQ6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGpvaW5JdGVtRm9yd2FyZDogUmF3Q29tbWFuZHNbJ2pvaW5JdGVtRm9yd2FyZCddID0gKCkgPT4gKHtcbiAgc3RhdGUsXG4gIGRpc3BhdGNoLFxuICB0cixcbn0pID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwb2ludCA9IGpvaW5Qb2ludChzdGF0ZS5kb2MsIHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wb3MsICsxKVxuXG4gICAgaWYgKHBvaW50ID09PSBudWxsIHx8IHBvaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRyLmpvaW4ocG9pbnQsIDIpXG5cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgIGRpc3BhdGNoKHRyKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBpc01hY09TKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgIDogZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNpT1MgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNpT1MuanMnXG5pbXBvcnQgeyBpc01hY09TIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzTWFjT1MuanMnXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLylcbiAgbGV0IHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG5cbiAgaWYgKHJlc3VsdCA9PT0gJ1NwYWNlJykge1xuICAgIHJlc3VsdCA9ICcgJ1xuICB9XG5cbiAgbGV0IGFsdFxuICBsZXQgY3RybFxuICBsZXQgc2hpZnRcbiAgbGV0IG1ldGFcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkge1xuICAgIGNvbnN0IG1vZCA9IHBhcnRzW2ldXG5cbiAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKSB7XG4gICAgICBtZXRhID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKSB7XG4gICAgICBhbHQgPSB0cnVlXG4gICAgfSBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKSB7XG4gICAgICBjdHJsID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpIHtcbiAgICAgIHNoaWZ0ID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoL15tb2QkL2kudGVzdChtb2QpKSB7XG4gICAgICBpZiAoaXNpT1MoKSB8fCBpc01hY09TKCkpIHtcbiAgICAgICAgbWV0YSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0cmwgPSB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6ICR7bW9kfWApXG4gICAgfVxuICB9XG5cbiAgaWYgKGFsdCkge1xuICAgIHJlc3VsdCA9IGBBbHQtJHtyZXN1bHR9YFxuICB9XG5cbiAgaWYgKGN0cmwpIHtcbiAgICByZXN1bHQgPSBgQ3RybC0ke3Jlc3VsdH1gXG4gIH1cblxuICBpZiAobWV0YSkge1xuICAgIHJlc3VsdCA9IGBNZXRhLSR7cmVzdWx0fWBcbiAgfVxuXG4gIGlmIChzaGlmdCkge1xuICAgIHJlc3VsdCA9IGBTaGlmdC0ke3Jlc3VsdH1gXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBrZXlib2FyZFNob3J0Y3V0OiB7XG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYSBrZXlib2FyZCBzaG9ydGN1dC5cbiAgICAgICAqL1xuICAgICAga2V5Ym9hcmRTaG9ydGN1dDogKG5hbWU6IHN0cmluZykgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGtleWJvYXJkU2hvcnRjdXQ6IFJhd0NvbW1hbmRzWydrZXlib2FyZFNob3J0Y3V0J10gPSBuYW1lID0+ICh7XG4gIGVkaXRvcixcbiAgdmlldyxcbiAgdHIsXG4gIGRpc3BhdGNoLFxufSkgPT4ge1xuICBjb25zdCBrZXlzID0gbm9ybWFsaXplS2V5TmFtZShuYW1lKS5zcGxpdCgvLSg/ISQpLylcbiAgY29uc3Qga2V5ID0ga2V5cy5maW5kKGl0ZW0gPT4gIVsnQWx0JywgJ0N0cmwnLCAnTWV0YScsICdTaGlmdCddLmluY2x1ZGVzKGl0ZW0pKVxuICBjb25zdCBldmVudCA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywge1xuICAgIGtleToga2V5ID09PSAnU3BhY2UnXG4gICAgICA/ICcgJ1xuICAgICAgOiBrZXksXG4gICAgYWx0S2V5OiBrZXlzLmluY2x1ZGVzKCdBbHQnKSxcbiAgICBjdHJsS2V5OiBrZXlzLmluY2x1ZGVzKCdDdHJsJyksXG4gICAgbWV0YUtleToga2V5cy5pbmNsdWRlcygnTWV0YScpLFxuICAgIHNoaWZ0S2V5OiBrZXlzLmluY2x1ZGVzKCdTaGlmdCcpLFxuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgfSlcblxuICBjb25zdCBjYXB0dXJlZFRyYW5zYWN0aW9uID0gZWRpdG9yLmNhcHR1cmVUcmFuc2FjdGlvbigoKSA9PiB7XG4gICAgdmlldy5zb21lUHJvcCgnaGFuZGxlS2V5RG93bicsIGYgPT4gZih2aWV3LCBldmVudCkpXG4gIH0pXG5cbiAgY2FwdHVyZWRUcmFuc2FjdGlvbj8uc3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBuZXdTdGVwID0gc3RlcC5tYXAodHIubWFwcGluZylcblxuICAgIGlmIChuZXdTdGVwICYmIGRpc3BhdGNoKSB7XG4gICAgICB0ci5tYXliZVN0ZXAobmV3U3RlcClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IE5vZGVSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgb2JqZWN0SW5jbHVkZXMgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JqZWN0SW5jbHVkZXMuanMnXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4vZ2V0Tm9kZVR5cGUuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVBY3RpdmUoXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZSxcbiAgdHlwZU9yTmFtZTogTm9kZVR5cGUgfCBzdHJpbmcgfCBudWxsLFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgeyBmcm9tLCB0bywgZW1wdHkgfSA9IHN0YXRlLnNlbGVjdGlvblxuICBjb25zdCB0eXBlID0gdHlwZU9yTmFtZSA/IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSkgOiBudWxsXG5cbiAgY29uc3Qgbm9kZVJhbmdlczogTm9kZVJhbmdlW10gPSBbXVxuXG4gIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICBpZiAobm9kZS5pc1RleHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcylcbiAgICBjb25zdCByZWxhdGl2ZVRvID0gTWF0aC5taW4odG8sIHBvcyArIG5vZGUubm9kZVNpemUpXG5cbiAgICBub2RlUmFuZ2VzLnB1c2goe1xuICAgICAgbm9kZSxcbiAgICAgIGZyb206IHJlbGF0aXZlRnJvbSxcbiAgICAgIHRvOiByZWxhdGl2ZVRvLFxuICAgIH0pXG4gIH0pXG5cbiAgY29uc3Qgc2VsZWN0aW9uUmFuZ2UgPSB0byAtIGZyb21cbiAgY29uc3QgbWF0Y2hlZE5vZGVSYW5nZXMgPSBub2RlUmFuZ2VzXG4gICAgLmZpbHRlcihub2RlUmFuZ2UgPT4ge1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlLm5hbWUgPT09IG5vZGVSYW5nZS5ub2RlLnR5cGUubmFtZVxuICAgIH0pXG4gICAgLmZpbHRlcihub2RlUmFuZ2UgPT4gb2JqZWN0SW5jbHVkZXMobm9kZVJhbmdlLm5vZGUuYXR0cnMsIGF0dHJpYnV0ZXMsIHsgc3RyaWN0OiBmYWxzZSB9KSlcblxuICBpZiAoZW1wdHkpIHtcbiAgICByZXR1cm4gISFtYXRjaGVkTm9kZVJhbmdlcy5sZW5ndGhcbiAgfVxuXG4gIGNvbnN0IHJhbmdlID0gbWF0Y2hlZE5vZGVSYW5nZXMucmVkdWNlKChzdW0sIG5vZGVSYW5nZSkgPT4gc3VtICsgbm9kZVJhbmdlLnRvIC0gbm9kZVJhbmdlLmZyb20sIDApXG5cbiAgcmV0dXJuIHJhbmdlID49IHNlbGVjdGlvblJhbmdlXG59XG4iLCAiaW1wb3J0IHsgbGlmdCBhcyBvcmlnaW5hbExpZnQgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBpc05vZGVBY3RpdmUgfSBmcm9tICcuLi9oZWxwZXJzL2lzTm9kZUFjdGl2ZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBsaWZ0OiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZXMgYW4gZXhpc3Rpbmcgd3JhcC5cbiAgICAgICAqL1xuICAgICAgbGlmdDogKHR5cGVPck5hbWU6IHN0cmluZyB8IE5vZGVUeXBlLCBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbGlmdDogUmF3Q29tbWFuZHNbJ2xpZnQnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGNvbnN0IHR5cGUgPSBnZXROb2RlVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IGlzQWN0aXZlID0gaXNOb2RlQWN0aXZlKHN0YXRlLCB0eXBlLCBhdHRyaWJ1dGVzKVxuXG4gIGlmICghaXNBY3RpdmUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBvcmlnaW5hbExpZnQoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IGxpZnRFbXB0eUJsb2NrIGFzIG9yaWdpbmFsTGlmdEVtcHR5QmxvY2sgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgbGlmdEVtcHR5QmxvY2s6IHtcbiAgICAgIC8qKlxuICAgICAgICogTGlmdCBibG9jayBpZiBlbXB0eS5cbiAgICAgICAqL1xuICAgICAgbGlmdEVtcHR5QmxvY2s6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsaWZ0RW1wdHlCbG9jazogUmF3Q29tbWFuZHNbJ2xpZnRFbXB0eUJsb2NrJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxMaWZ0RW1wdHlCbG9jayhzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgbGlmdExpc3RJdGVtIGFzIG9yaWdpbmFsTGlmdExpc3RJdGVtIH0gZnJvbSAnQHRpcHRhcC9wbS9zY2hlbWEtbGlzdCdcblxuaW1wb3J0IHsgZ2V0Tm9kZVR5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE5vZGVUeXBlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGxpZnRMaXN0SXRlbToge1xuICAgICAgLyoqXG4gICAgICAgKiBMaWZ0IHRoZSBsaXN0IGl0ZW0gaW50byBhIHdyYXBwaW5nIGxpc3QuXG4gICAgICAgKi9cbiAgICAgIGxpZnRMaXN0SXRlbTogKHR5cGVPck5hbWU6IHN0cmluZyB8IE5vZGVUeXBlKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsaWZ0TGlzdEl0ZW06IFJhd0NvbW1hbmRzWydsaWZ0TGlzdEl0ZW0nXSA9IHR5cGVPck5hbWUgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICByZXR1cm4gb3JpZ2luYWxMaWZ0TGlzdEl0ZW0odHlwZSkoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IG5ld2xpbmVJbkNvZGUgYXMgb3JpZ2luYWxOZXdsaW5lSW5Db2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9jb21tYW5kcydcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIG5ld2xpbmVJbkNvZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgaW4gY29kZS5cbiAgICAgICAqL1xuICAgICAgbmV3bGluZUluQ29kZTogKCkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV3bGluZUluQ29kZTogUmF3Q29tbWFuZHNbJ25ld2xpbmVJbkNvZGUnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbE5ld2xpbmVJbkNvZGUoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZShuYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogJ25vZGUnIHwgJ21hcmsnIHwgbnVsbCB7XG4gIGlmIChzY2hlbWEubm9kZXNbbmFtZV0pIHtcbiAgICByZXR1cm4gJ25vZGUnXG4gIH1cblxuICBpZiAoc2NoZW1hLm1hcmtzW25hbWVdKSB7XG4gICAgcmV0dXJuICdtYXJrJ1xuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbiIsICIvKipcbiAqIFJlbW92ZSBhIHByb3BlcnR5IG9yIGFuIGFycmF5IG9mIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3RcbiAqIEBwYXJhbSBvYmogT2JqZWN0XG4gKiBAcGFyYW0ga2V5IEtleSB0byByZW1vdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVByb3BzKG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgcHJvcE9yUHJvcHM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IHByb3BzID0gdHlwZW9mIHByb3BPclByb3BzID09PSAnc3RyaW5nJ1xuICAgID8gW3Byb3BPclByb3BzXVxuICAgIDogcHJvcE9yUHJvcHNcblxuICByZXR1cm4gT2JqZWN0XG4gICAgLmtleXMob2JqKVxuICAgIC5yZWR1Y2UoKG5ld09iajogUmVjb3JkPHN0cmluZywgYW55PiwgcHJvcCkgPT4ge1xuICAgICAgaWYgKCFwcm9wcy5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICBuZXdPYmpbcHJvcF0gPSBvYmpbcHJvcF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09ialxuICAgIH0sIHt9KVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IGdldFNjaGVtYVR5cGVOYW1lQnlOYW1lIH0gZnJvbSAnLi4vaGVscGVycy9nZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBkZWxldGVQcm9wcyB9IGZyb20gJy4uL3V0aWxpdGllcy9kZWxldGVQcm9wcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHJlc2V0QXR0cmlidXRlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXNldHMgc29tZSBub2RlIGF0dHJpYnV0ZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgKi9cbiAgICAgIHJlc2V0QXR0cmlidXRlczogKFxuICAgICAgICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSB8IE1hcmtUeXBlLFxuICAgICAgICBhdHRyaWJ1dGVzOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVzZXRBdHRyaWJ1dGVzOiBSYXdDb21tYW5kc1sncmVzZXRBdHRyaWJ1dGVzJ10gPSAodHlwZU9yTmFtZSwgYXR0cmlidXRlcykgPT4gKHsgdHIsIHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGxldCBub2RlVHlwZTogTm9kZVR5cGUgfCBudWxsID0gbnVsbFxuICBsZXQgbWFya1R5cGU6IE1hcmtUeXBlIHwgbnVsbCA9IG51bGxcblxuICBjb25zdCBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUoXG4gICAgdHlwZW9mIHR5cGVPck5hbWUgPT09ICdzdHJpbmcnID8gdHlwZU9yTmFtZSA6IHR5cGVPck5hbWUubmFtZSxcbiAgICBzdGF0ZS5zY2hlbWEsXG4gIClcblxuICBpZiAoIXNjaGVtYVR5cGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChzY2hlbWFUeXBlID09PSAnbm9kZScpIHtcbiAgICBub2RlVHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUgYXMgTm9kZVR5cGUsIHN0YXRlLnNjaGVtYSlcbiAgfVxuXG4gIGlmIChzY2hlbWFUeXBlID09PSAnbWFyaycpIHtcbiAgICBtYXJrVHlwZSA9IGdldE1hcmtUeXBlKHR5cGVPck5hbWUgYXMgTWFya1R5cGUsIHN0YXRlLnNjaGVtYSlcbiAgfVxuXG4gIGlmIChkaXNwYXRjaCkge1xuICAgIHRyLnNlbGVjdGlvbi5yYW5nZXMuZm9yRWFjaChyYW5nZSA9PiB7XG4gICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKHJhbmdlLiRmcm9tLnBvcywgcmFuZ2UuJHRvLnBvcywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICBpZiAobm9kZVR5cGUgJiYgbm9kZVR5cGUgPT09IG5vZGUudHlwZSkge1xuICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAocG9zLCB1bmRlZmluZWQsIGRlbGV0ZVByb3BzKG5vZGUuYXR0cnMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcmtUeXBlICYmIG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgbm9kZS5tYXJrcy5mb3JFYWNoKG1hcmsgPT4ge1xuICAgICAgICAgICAgaWYgKG1hcmtUeXBlID09PSBtYXJrLnR5cGUpIHtcbiAgICAgICAgICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgICAgICAgICBwb3MsXG4gICAgICAgICAgICAgICAgcG9zICsgbm9kZS5ub2RlU2l6ZSxcbiAgICAgICAgICAgICAgICBtYXJrVHlwZS5jcmVhdGUoZGVsZXRlUHJvcHMobWFyay5hdHRycywgYXR0cmlidXRlcykpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc2Nyb2xsSW50b1ZpZXc6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3LlxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlldzogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNjcm9sbEludG9WaWV3OiBSYXdDb21tYW5kc1snc2Nyb2xsSW50b1ZpZXcnXSA9ICgpID0+ICh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIHRyLnNjcm9sbEludG9WaWV3KClcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNlbGVjdEFsbDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgdGhlIHdob2xlIGRvY3VtZW50LlxuICAgICAgICovXG4gICAgICBzZWxlY3RBbGw6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RBbGw6IFJhd0NvbW1hbmRzWydzZWxlY3RBbGwnXSA9ICgpID0+ICh7IHRyLCBjb21tYW5kcyB9KSA9PiB7XG4gIHJldHVybiBjb21tYW5kcy5zZXRUZXh0U2VsZWN0aW9uKHtcbiAgICBmcm9tOiAwLFxuICAgIHRvOiB0ci5kb2MuY29udGVudC5zaXplLFxuICB9KVxufVxuIiwgImltcG9ydCB7IHNlbGVjdE5vZGVCYWNrd2FyZCBhcyBvcmlnaW5hbFNlbGVjdE5vZGVCYWNrd2FyZCB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZWxlY3ROb2RlQmFja3dhcmQ6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGEgbm9kZSBiYWNrd2FyZC5cbiAgICAgICAqL1xuICAgICAgc2VsZWN0Tm9kZUJhY2t3YXJkOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlQmFja3dhcmQ6IFJhd0NvbW1hbmRzWydzZWxlY3ROb2RlQmFja3dhcmQnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbFNlbGVjdE5vZGVCYWNrd2FyZChzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgc2VsZWN0Tm9kZUZvcndhcmQgYXMgb3JpZ2luYWxTZWxlY3ROb2RlRm9yd2FyZCB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZWxlY3ROb2RlRm9yd2FyZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgYSBub2RlIGZvcndhcmQuXG4gICAgICAgKi9cbiAgICAgIHNlbGVjdE5vZGVGb3J3YXJkOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlRm9yd2FyZDogUmF3Q29tbWFuZHNbJ3NlbGVjdE5vZGVGb3J3YXJkJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxTZWxlY3ROb2RlRm9yd2FyZChzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgc2VsZWN0UGFyZW50Tm9kZSBhcyBvcmlnaW5hbFNlbGVjdFBhcmVudE5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc2VsZWN0UGFyZW50Tm9kZToge1xuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgdGhlIHBhcmVudCBub2RlLlxuICAgICAgICovXG4gICAgICBzZWxlY3RQYXJlbnROb2RlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RQYXJlbnROb2RlOiBSYXdDb21tYW5kc1snc2VsZWN0UGFyZW50Tm9kZSddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsU2VsZWN0UGFyZW50Tm9kZShzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiLy8gQHRzLWlnbm9yZVxuLy8gVE9ETzogYWRkIHR5cGVzIHRvIEB0eXBlcy9wcm9zZW1pcnJvci1jb21tYW5kc1xuaW1wb3J0IHsgc2VsZWN0VGV4dGJsb2NrRW5kIGFzIG9yaWdpbmFsU2VsZWN0VGV4dGJsb2NrRW5kIH0gZnJvbSAnQHRpcHRhcC9wbS9jb21tYW5kcydcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNlbGVjdFRleHRibG9ja0VuZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgY3VycmVudCB0ZXh0IGJsb2NrLlxuICAgICAgICovXG4gICAgICBzZWxlY3RUZXh0YmxvY2tFbmQ6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdFRleHRibG9ja0VuZDogUmF3Q29tbWFuZHNbJ3NlbGVjdFRleHRibG9ja0VuZCddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsU2VsZWN0VGV4dGJsb2NrRW5kKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICIvLyBAdHMtaWdub3JlXG4vLyBUT0RPOiBhZGQgdHlwZXMgdG8gQHR5cGVzL3Byb3NlbWlycm9yLWNvbW1hbmRzXG5pbXBvcnQgeyBzZWxlY3RUZXh0YmxvY2tTdGFydCBhcyBvcmlnaW5hbFNlbGVjdFRleHRibG9ja1N0YXJ0IH0gZnJvbSAnQHRpcHRhcC9wbS9jb21tYW5kcydcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNlbGVjdFRleHRibG9ja1N0YXJ0OiB7XG4gICAgICAvKipcbiAgICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIGN1cnJlbnQgdGV4dCBibG9jay5cbiAgICAgICAqL1xuICAgICAgc2VsZWN0VGV4dGJsb2NrU3RhcnQ6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdFRleHRibG9ja1N0YXJ0OiBSYXdDb21tYW5kc1snc2VsZWN0VGV4dGJsb2NrU3RhcnQnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbFNlbGVjdFRleHRibG9ja1N0YXJ0KHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgUGFyc2VPcHRpb25zLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBjcmVhdGVOb2RlRnJvbUNvbnRlbnQgfSBmcm9tICcuL2NyZWF0ZU5vZGVGcm9tQ29udGVudC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50KFxuICBjb250ZW50OiBDb250ZW50LFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgcGFyc2VPcHRpb25zOiBQYXJzZU9wdGlvbnMgPSB7fSxcbik6IFByb3NlTWlycm9yTm9kZSB7XG4gIHJldHVybiBjcmVhdGVOb2RlRnJvbUNvbnRlbnQoY29udGVudCwgc2NoZW1hLCB7IHNsaWNlOiBmYWxzZSwgcGFyc2VPcHRpb25zIH0pIGFzIFByb3NlTWlycm9yTm9kZVxufVxuIiwgImltcG9ydCB7IFBhcnNlT3B0aW9ucyB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGNyZWF0ZURvY3VtZW50IH0gZnJvbSAnLi4vaGVscGVycy9jcmVhdGVEb2N1bWVudC5qcydcbmltcG9ydCB7IENvbnRlbnQsIFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXRDb250ZW50OiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlcGxhY2UgdGhlIHdob2xlIGRvY3VtZW50IHdpdGggbmV3IGNvbnRlbnQuXG4gICAgICAgKi9cbiAgICAgIHNldENvbnRlbnQ6IChcbiAgICAgICAgY29udGVudDogQ29udGVudCxcbiAgICAgICAgZW1pdFVwZGF0ZT86IGJvb2xlYW4sXG4gICAgICAgIHBhcnNlT3B0aW9ucz86IFBhcnNlT3B0aW9ucyxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2V0Q29udGVudDogUmF3Q29tbWFuZHNbJ3NldENvbnRlbnQnXSA9IChjb250ZW50LCBlbWl0VXBkYXRlID0gZmFsc2UsIHBhcnNlT3B0aW9ucyA9IHt9KSA9PiAoeyB0ciwgZWRpdG9yLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGNvbnN0IHsgZG9jIH0gPSB0clxuICBjb25zdCBkb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KGNvbnRlbnQsIGVkaXRvci5zY2hlbWEsIHBhcnNlT3B0aW9ucylcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICB0ci5yZXBsYWNlV2l0aCgwLCBkb2MuY29udGVudC5zaXplLCBkb2N1bWVudCkuc2V0TWV0YSgncHJldmVudFVwZGF0ZScsICFlbWl0VXBkYXRlKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBNYXJrLCBNYXJrVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi9nZXRNYXJrVHlwZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtBdHRyaWJ1dGVzKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIHR5cGVPck5hbWU6IHN0cmluZyB8IE1hcmtUeXBlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IHR5cGUgPSBnZXRNYXJrVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IHsgZnJvbSwgdG8sIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb25cbiAgY29uc3QgbWFya3M6IE1hcmtbXSA9IFtdXG5cbiAgaWYgKGVtcHR5KSB7XG4gICAgaWYgKHN0YXRlLnN0b3JlZE1hcmtzKSB7XG4gICAgICBtYXJrcy5wdXNoKC4uLnN0YXRlLnN0b3JlZE1hcmtzKVxuICAgIH1cblxuICAgIG1hcmtzLnB1c2goLi4uc3RhdGUuc2VsZWN0aW9uLiRoZWFkLm1hcmtzKCkpXG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgICBtYXJrcy5wdXNoKC4uLm5vZGUubWFya3MpXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IG1hcmsgPSBtYXJrcy5maW5kKG1hcmtJdGVtID0+IG1hcmtJdGVtLnR5cGUubmFtZSA9PT0gdHlwZS5uYW1lKVxuXG4gIGlmICghbWFyaykge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ubWFyay5hdHRycyB9XG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnQHRpcHRhcC9wbS90cmFuc2Zvcm0nXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBgVHJhbnNmb3JtYCBiYXNlZCBvbiBhbGwgc3RlcHMgb2YgdGhlIHBhc3NlZCB0cmFuc2FjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lVHJhbnNhY3Rpb25TdGVwcyhcbiAgb2xkRG9jOiBQcm9zZU1pcnJvck5vZGUsXG4gIHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSxcbik6IFRyYW5zZm9ybSB7XG4gIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0ob2xkRG9jKVxuXG4gIHRyYW5zYWN0aW9ucy5mb3JFYWNoKHRyYW5zYWN0aW9uID0+IHtcbiAgICB0cmFuc2FjdGlvbi5zdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgdHJhbnNmb3JtLnN0ZXAoc3RlcClcbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiB0cmFuc2Zvcm1cbn1cbiIsICJpbXBvcnQgeyBDb250ZW50TWF0Y2gsIE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRCbG9ja0F0KG1hdGNoOiBDb250ZW50TWF0Y2gpOiBOb2RlVHlwZSB8IG51bGwge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLmVkZ2VDb3VudDsgaSArPSAxKSB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSBtYXRjaC5lZGdlKGkpXG5cbiAgICBpZiAodHlwZS5pc1RleHRibG9jayAmJiAhdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpIHtcbiAgICAgIHJldHVybiB0eXBlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IE5vZGVXaXRoUG9zLCBQcmVkaWNhdGUgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDaGlsZHJlbihub2RlOiBQcm9zZU1pcnJvck5vZGUsIHByZWRpY2F0ZTogUHJlZGljYXRlKTogTm9kZVdpdGhQb3NbXSB7XG4gIGNvbnN0IG5vZGVzV2l0aFBvczogTm9kZVdpdGhQb3NbXSA9IFtdXG5cbiAgbm9kZS5kZXNjZW5kYW50cygoY2hpbGQsIHBvcykgPT4ge1xuICAgIGlmIChwcmVkaWNhdGUoY2hpbGQpKSB7XG4gICAgICBub2Rlc1dpdGhQb3MucHVzaCh7XG4gICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICBwb3MsXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbm9kZXNXaXRoUG9zXG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBOb2RlV2l0aFBvcywgUHJlZGljYXRlLCBSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG4vKipcbiAqIFNhbWUgYXMgYGZpbmRDaGlsZHJlbmAgYnV0IHNlYXJjaGVzIG9ubHkgd2l0aGluIGEgYHJhbmdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDaGlsZHJlbkluUmFuZ2UoXG4gIG5vZGU6IFByb3NlTWlycm9yTm9kZSxcbiAgcmFuZ2U6IFJhbmdlLFxuICBwcmVkaWNhdGU6IFByZWRpY2F0ZSxcbik6IE5vZGVXaXRoUG9zW10ge1xuICBjb25zdCBub2Rlc1dpdGhQb3M6IE5vZGVXaXRoUG9zW10gPSBbXVxuXG4gIC8vIGlmIChyYW5nZS5mcm9tID09PSByYW5nZS50bykge1xuICAvLyAgIGNvbnN0IG5vZGVBdCA9IG5vZGUubm9kZUF0KHJhbmdlLmZyb20pXG5cbiAgLy8gICBpZiAobm9kZUF0KSB7XG4gIC8vICAgICBub2Rlc1dpdGhQb3MucHVzaCh7XG4gIC8vICAgICAgIG5vZGU6IG5vZGVBdCxcbiAgLy8gICAgICAgcG9zOiByYW5nZS5mcm9tLFxuICAvLyAgICAgfSlcbiAgLy8gICB9XG4gIC8vIH1cblxuICBub2RlLm5vZGVzQmV0d2VlbihyYW5nZS5mcm9tLCByYW5nZS50bywgKGNoaWxkLCBwb3MpID0+IHtcbiAgICBpZiAocHJlZGljYXRlKGNoaWxkKSkge1xuICAgICAgbm9kZXNXaXRoUG9zLnB1c2goe1xuICAgICAgICBub2RlOiBjaGlsZCxcbiAgICAgICAgcG9zLFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG5vZGVzV2l0aFBvc1xufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlLCBSZXNvbHZlZFBvcyB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IFByZWRpY2F0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudE5vZGVDbG9zZXN0VG9Qb3MoXG4gICRwb3M6IFJlc29sdmVkUG9zLFxuICBwcmVkaWNhdGU6IFByZWRpY2F0ZSxcbik6XG4gIHwge1xuICAgICAgcG9zOiBudW1iZXJcbiAgICAgIHN0YXJ0OiBudW1iZXJcbiAgICAgIGRlcHRoOiBudW1iZXJcbiAgICAgIG5vZGU6IFByb3NlTWlycm9yTm9kZVxuICAgIH1cbiAgfCB1bmRlZmluZWQge1xuICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aDsgaSA+IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IG5vZGUgPSAkcG9zLm5vZGUoaSlcblxuICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvczogaSA+IDAgPyAkcG9zLmJlZm9yZShpKSA6IDAsXG4gICAgICAgIHN0YXJ0OiAkcG9zLnN0YXJ0KGkpLFxuICAgICAgICBkZXB0aDogaSxcbiAgICAgICAgbm9kZSxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBQcmVkaWNhdGUgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGZpbmRQYXJlbnROb2RlQ2xvc2VzdFRvUG9zIH0gZnJvbSAnLi9maW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1Bvcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQYXJlbnROb2RlKHByZWRpY2F0ZTogUHJlZGljYXRlKSB7XG4gIHJldHVybiAoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IGZpbmRQYXJlbnROb2RlQ2xvc2VzdFRvUG9zKHNlbGVjdGlvbi4kZnJvbSwgcHJlZGljYXRlKVxufVxuIiwgImltcG9ydCB7IERPTVNlcmlhbGl6ZXIsIEZyYWdtZW50LCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SFRNTEZyb21GcmFnbWVudChmcmFnbWVudDogRnJhZ21lbnQsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QgZG9jdW1lbnRGcmFnbWVudCA9IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYShzY2hlbWEpLnNlcmlhbGl6ZUZyYWdtZW50KGZyYWdtZW50KVxuXG4gIGNvbnN0IHRlbXBvcmFyeURvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KClcbiAgY29uc3QgY29udGFpbmVyID0gdGVtcG9yYXJ5RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcblxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnRGcmFnbWVudClcblxuICByZXR1cm4gY29udGFpbmVyLmlubmVySFRNTFxufVxuIiwgImltcG9ydCB7IFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4uL0VkaXRvci5qcydcbmltcG9ydCB7IEV4dGVuc2lvbk1hbmFnZXIgfSBmcm9tICcuLi9FeHRlbnNpb25NYW5hZ2VyLmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQnlSZXNvbHZlZEV4dGVuc2lvbnMgfSBmcm9tICcuL2dldFNjaGVtYUJ5UmVzb2x2ZWRFeHRlbnNpb25zLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsIGVkaXRvcj86IEVkaXRvcik6IFNjaGVtYSB7XG4gIGNvbnN0IHJlc29sdmVkRXh0ZW5zaW9ucyA9IEV4dGVuc2lvbk1hbmFnZXIucmVzb2x2ZShleHRlbnNpb25zKVxuXG4gIHJldHVybiBnZXRTY2hlbWFCeVJlc29sdmVkRXh0ZW5zaW9ucyhyZXNvbHZlZEV4dGVuc2lvbnMsIGVkaXRvcilcbn1cbiIsICJpbXBvcnQgeyBOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgRXh0ZW5zaW9ucywgSlNPTkNvbnRlbnQgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGdldEhUTUxGcm9tRnJhZ21lbnQgfSBmcm9tICcuL2dldEhUTUxGcm9tRnJhZ21lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWEgfSBmcm9tICcuL2dldFNjaGVtYS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSFRNTChkb2M6IEpTT05Db250ZW50LCBleHRlbnNpb25zOiBFeHRlbnNpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKGV4dGVuc2lvbnMpXG4gIGNvbnN0IGNvbnRlbnROb2RlID0gTm9kZS5mcm9tSlNPTihzY2hlbWEsIGRvYylcblxuICByZXR1cm4gZ2V0SFRNTEZyb21GcmFnbWVudChjb250ZW50Tm9kZS5jb250ZW50LCBzY2hlbWEpXG59XG4iLCAiaW1wb3J0IHsgRE9NUGFyc2VyIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZWxlbWVudEZyb21TdHJpbmcgfSBmcm9tICcuLi91dGlsaXRpZXMvZWxlbWVudEZyb21TdHJpbmcuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWEgfSBmcm9tICcuL2dldFNjaGVtYS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSlNPTihodG1sOiBzdHJpbmcsIGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKGV4dGVuc2lvbnMpXG4gIGNvbnN0IGRvbSA9IGVsZW1lbnRGcm9tU3RyaW5nKGh0bWwpXG5cbiAgcmV0dXJuIERPTVBhcnNlci5mcm9tU2NoZW1hKHNjaGVtYSkucGFyc2UoZG9tKS50b0pTT04oKVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgVGV4dFNlcmlhbGl6ZXIgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGdldFRleHRCZXR3ZWVuIH0gZnJvbSAnLi9nZXRUZXh0QmV0d2Vlbi5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHQoXG4gIG5vZGU6IFByb3NlTWlycm9yTm9kZSxcbiAgb3B0aW9ucz86IHtcbiAgICBibG9ja1NlcGFyYXRvcj86IHN0cmluZ1xuICAgIHRleHRTZXJpYWxpemVycz86IFJlY29yZDxzdHJpbmcsIFRleHRTZXJpYWxpemVyPlxuICB9LFxuKSB7XG4gIGNvbnN0IHJhbmdlID0ge1xuICAgIGZyb206IDAsXG4gICAgdG86IG5vZGUuY29udGVudC5zaXplLFxuICB9XG5cbiAgcmV0dXJuIGdldFRleHRCZXR3ZWVuKG5vZGUsIHJhbmdlLCBvcHRpb25zKVxufVxuIiwgImltcG9ydCB7IE5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb25zLCBKU09OQ29udGVudCwgVGV4dFNlcmlhbGl6ZXIgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGdldFNjaGVtYSB9IGZyb20gJy4vZ2V0U2NoZW1hLmpzJ1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4vZ2V0VGV4dC5qcydcbmltcG9ydCB7IGdldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEgfSBmcm9tICcuL2dldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRleHQoXG4gIGRvYzogSlNPTkNvbnRlbnQsXG4gIGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsXG4gIG9wdGlvbnM/OiB7XG4gICAgYmxvY2tTZXBhcmF0b3I/OiBzdHJpbmdcbiAgICB0ZXh0U2VyaWFsaXplcnM/OiBSZWNvcmQ8c3RyaW5nLCBUZXh0U2VyaWFsaXplcj5cbiAgfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgYmxvY2tTZXBhcmF0b3IgPSAnXFxuXFxuJywgdGV4dFNlcmlhbGl6ZXJzID0ge30gfSA9IG9wdGlvbnMgfHwge31cbiAgY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKGV4dGVuc2lvbnMpXG4gIGNvbnN0IGNvbnRlbnROb2RlID0gTm9kZS5mcm9tSlNPTihzY2hlbWEsIGRvYylcblxuICByZXR1cm4gZ2V0VGV4dChjb250ZW50Tm9kZSwge1xuICAgIGJsb2NrU2VwYXJhdG9yLFxuICAgIHRleHRTZXJpYWxpemVyczoge1xuICAgICAgLi4uZ2V0VGV4dFNlcmlhbGl6ZXJzRnJvbVNjaGVtYShzY2hlbWEpLFxuICAgICAgLi4udGV4dFNlcmlhbGl6ZXJzLFxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgTm9kZSwgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4vZ2V0Tm9kZVR5cGUuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlQXR0cmlidXRlcyhcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCB0eXBlID0gZ2V0Tm9kZVR5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7IGZyb20sIHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb25cbiAgY29uc3Qgbm9kZXM6IE5vZGVbXSA9IFtdXG5cbiAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgbm9kZXMucHVzaChub2RlKVxuICB9KVxuXG4gIGNvbnN0IG5vZGUgPSBub2Rlcy5yZXZlcnNlKCkuZmluZChub2RlSXRlbSA9PiBub2RlSXRlbS50eXBlLm5hbWUgPT09IHR5cGUubmFtZSlcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHJldHVybiB7IC4uLm5vZGUuYXR0cnMgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGdldE1hcmtBdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZXRNYXJrQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IGdldE5vZGVBdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZXROb2RlQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IGdldFNjaGVtYVR5cGVOYW1lQnlOYW1lIH0gZnJvbSAnLi9nZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXMoXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZSxcbiAgdHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUgfCBNYXJrVHlwZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUoXG4gICAgdHlwZW9mIHR5cGVPck5hbWUgPT09ICdzdHJpbmcnID8gdHlwZU9yTmFtZSA6IHR5cGVPck5hbWUubmFtZSxcbiAgICBzdGF0ZS5zY2hlbWEsXG4gIClcblxuICBpZiAoc2NoZW1hVHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgcmV0dXJuIGdldE5vZGVBdHRyaWJ1dGVzKHN0YXRlLCB0eXBlT3JOYW1lIGFzIE5vZGVUeXBlKVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdtYXJrJykge1xuICAgIHJldHVybiBnZXRNYXJrQXR0cmlidXRlcyhzdGF0ZSwgdHlwZU9yTmFtZSBhcyBNYXJrVHlwZSlcbiAgfVxuXG4gIHJldHVybiB7fVxufVxuIiwgIi8qKlxuICogUmVtb3ZlcyBkdXBsaWNhdGVkIHZhbHVlcyB3aXRoaW4gYW4gYXJyYXkuXG4gKiBTdXBwb3J0cyBudW1iZXJzLCBzdHJpbmdzIGFuZCBvYmplY3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRlczxUPihhcnJheTogVFtdLCBieSA9IEpTT04uc3RyaW5naWZ5KTogVFtdIHtcbiAgY29uc3Qgc2VlbjogUmVjb3JkPGFueSwgYW55PiA9IHt9XG5cbiAgcmV0dXJuIGFycmF5LmZpbHRlcihpdGVtID0+IHtcbiAgICBjb25zdCBrZXkgPSBieShpdGVtKVxuXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWVuLCBrZXkpXG4gICAgICA/IGZhbHNlXG4gICAgICA6IChzZWVuW2tleV0gPSB0cnVlKVxuICB9KVxufVxuIiwgImltcG9ydCB7IFN0ZXAsIFRyYW5zZm9ybSB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgcmVtb3ZlRHVwbGljYXRlcyB9IGZyb20gJy4uL3V0aWxpdGllcy9yZW1vdmVEdXBsaWNhdGVzLmpzJ1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VkUmFuZ2UgPSB7XG4gIG9sZFJhbmdlOiBSYW5nZSxcbiAgbmV3UmFuZ2U6IFJhbmdlLFxufVxuXG4vKipcbiAqIFJlbW92ZXMgZHVwbGljYXRlZCByYW5nZXMgYW5kIHJhbmdlcyB0aGF0IGFyZVxuICogZnVsbHkgY2FwdHVyZWQgYnkgb3RoZXIgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiBzaW1wbGlmeUNoYW5nZWRSYW5nZXMoY2hhbmdlczogQ2hhbmdlZFJhbmdlW10pOiBDaGFuZ2VkUmFuZ2VbXSB7XG4gIGNvbnN0IHVuaXF1ZUNoYW5nZXMgPSByZW1vdmVEdXBsaWNhdGVzKGNoYW5nZXMpXG5cbiAgcmV0dXJuIHVuaXF1ZUNoYW5nZXMubGVuZ3RoID09PSAxXG4gICAgPyB1bmlxdWVDaGFuZ2VzXG4gICAgOiB1bmlxdWVDaGFuZ2VzLmZpbHRlcigoY2hhbmdlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzdCA9IHVuaXF1ZUNoYW5nZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcblxuICAgICAgcmV0dXJuICFyZXN0LnNvbWUob3RoZXJDaGFuZ2UgPT4ge1xuICAgICAgICByZXR1cm4gY2hhbmdlLm9sZFJhbmdlLmZyb20gPj0gb3RoZXJDaGFuZ2Uub2xkUmFuZ2UuZnJvbVxuICAgICAgICAgICYmIGNoYW5nZS5vbGRSYW5nZS50byA8PSBvdGhlckNoYW5nZS5vbGRSYW5nZS50b1xuICAgICAgICAgICYmIGNoYW5nZS5uZXdSYW5nZS5mcm9tID49IG90aGVyQ2hhbmdlLm5ld1JhbmdlLmZyb21cbiAgICAgICAgICAmJiBjaGFuZ2UubmV3UmFuZ2UudG8gPD0gb3RoZXJDaGFuZ2UubmV3UmFuZ2UudG9cbiAgICAgIH0pXG4gICAgfSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBjaGFuZ2VkIHJhbmdlc1xuICogYmFzZWQgb24gdGhlIGZpcnN0IGFuZCBsYXN0IHN0YXRlIG9mIGFsbCBzdGVwcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5nZWRSYW5nZXModHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBDaGFuZ2VkUmFuZ2VbXSB7XG4gIGNvbnN0IHsgbWFwcGluZywgc3RlcHMgfSA9IHRyYW5zZm9ybVxuICBjb25zdCBjaGFuZ2VzOiBDaGFuZ2VkUmFuZ2VbXSA9IFtdXG5cbiAgbWFwcGluZy5tYXBzLmZvckVhY2goKHN0ZXBNYXAsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcmFuZ2VzOiBSYW5nZVtdID0gW11cblxuICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHN0ZXAgY2hhbmdlcyB3aGVyZSBubyByYW5nZSB3YXMgYWN0dWFsbHkgYWx0ZXJlZFxuICAgIC8vIGUuZy4gd2hlbiBzZXR0aW5nIGEgbWFyaywgbm9kZSBhdHRyaWJ1dGUsIGV0Yy5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCFzdGVwTWFwLnJhbmdlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHN0ZXBzW2luZGV4XSBhcyBTdGVwICYge1xuICAgICAgICBmcm9tPzogbnVtYmVyLFxuICAgICAgICB0bz86IG51bWJlcixcbiAgICAgIH1cblxuICAgICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCB8fCB0byA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByYW5nZXMucHVzaCh7IGZyb20sIHRvIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBNYXAuZm9yRWFjaCgoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByYW5nZXMuZm9yRWFjaCgoeyBmcm9tLCB0byB9KSA9PiB7XG4gICAgICBjb25zdCBuZXdTdGFydCA9IG1hcHBpbmcuc2xpY2UoaW5kZXgpLm1hcChmcm9tLCAtMSlcbiAgICAgIGNvbnN0IG5ld0VuZCA9IG1hcHBpbmcuc2xpY2UoaW5kZXgpLm1hcCh0bylcbiAgICAgIGNvbnN0IG9sZFN0YXJ0ID0gbWFwcGluZy5pbnZlcnQoKS5tYXAobmV3U3RhcnQsIC0xKVxuICAgICAgY29uc3Qgb2xkRW5kID0gbWFwcGluZy5pbnZlcnQoKS5tYXAobmV3RW5kKVxuXG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBvbGRSYW5nZToge1xuICAgICAgICAgIGZyb206IG9sZFN0YXJ0LFxuICAgICAgICAgIHRvOiBvbGRFbmQsXG4gICAgICAgIH0sXG4gICAgICAgIG5ld1JhbmdlOiB7XG4gICAgICAgICAgZnJvbTogbmV3U3RhcnQsXG4gICAgICAgICAgdG86IG5ld0VuZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gc2ltcGxpZnlDaGFuZ2VkUmFuZ2VzKGNoYW5nZXMpXG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBKU09OQ29udGVudCB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5pbnRlcmZhY2UgRGVidWdKU09OQ29udGVudCBleHRlbmRzIEpTT05Db250ZW50IHtcbiAgZnJvbTogbnVtYmVyXG4gIHRvOiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlYnVnSlNPTihub2RlOiBQcm9zZU1pcnJvck5vZGUsIHN0YXJ0T2Zmc2V0ID0gMCk6IERlYnVnSlNPTkNvbnRlbnQge1xuICBjb25zdCBpc1RvcE5vZGUgPSBub2RlLnR5cGUgPT09IG5vZGUudHlwZS5zY2hlbWEudG9wTm9kZVR5cGVcbiAgY29uc3QgaW5jcmVtZW50ID0gaXNUb3BOb2RlID8gMCA6IDFcbiAgY29uc3QgZnJvbSA9IHN0YXJ0T2Zmc2V0XG4gIGNvbnN0IHRvID0gZnJvbSArIG5vZGUubm9kZVNpemVcbiAgY29uc3QgbWFya3MgPSBub2RlLm1hcmtzLm1hcChtYXJrID0+IHtcbiAgICBjb25zdCBvdXRwdXQ6IHsgdHlwZTogc3RyaW5nOyBhdHRycz86IFJlY29yZDxzdHJpbmcsIGFueT4gfSA9IHtcbiAgICAgIHR5cGU6IG1hcmsudHlwZS5uYW1lLFxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhtYXJrLmF0dHJzKS5sZW5ndGgpIHtcbiAgICAgIG91dHB1dC5hdHRycyA9IHsgLi4ubWFyay5hdHRycyB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dFxuICB9KVxuICBjb25zdCBhdHRycyA9IHsgLi4ubm9kZS5hdHRycyB9XG4gIGNvbnN0IG91dHB1dDogRGVidWdKU09OQ29udGVudCA9IHtcbiAgICB0eXBlOiBub2RlLnR5cGUubmFtZSxcbiAgICBmcm9tLFxuICAgIHRvLFxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGF0dHJzKS5sZW5ndGgpIHtcbiAgICBvdXRwdXQuYXR0cnMgPSBhdHRyc1xuICB9XG5cbiAgaWYgKG1hcmtzLmxlbmd0aCkge1xuICAgIG91dHB1dC5tYXJrcyA9IG1hcmtzXG4gIH1cblxuICBpZiAobm9kZS5jb250ZW50LmNoaWxkQ291bnQpIHtcbiAgICBvdXRwdXQuY29udGVudCA9IFtdXG5cbiAgICBub2RlLmZvckVhY2goKGNoaWxkLCBvZmZzZXQpID0+IHtcbiAgICAgIG91dHB1dC5jb250ZW50Py5wdXNoKGdldERlYnVnSlNPTihjaGlsZCwgc3RhcnRPZmZzZXQgKyBvZmZzZXQgKyBpbmNyZW1lbnQpKVxuICAgIH0pXG4gIH1cblxuICBpZiAobm9kZS50ZXh0KSB7XG4gICAgb3V0cHV0LnRleHQgPSBub2RlLnRleHRcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IE1hcmtSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZ2V0TWFya1JhbmdlIH0gZnJvbSAnLi9nZXRNYXJrUmFuZ2UuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrc0JldHdlZW4oZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBkb2M6IFByb3NlTWlycm9yTm9kZSk6IE1hcmtSYW5nZVtdIHtcbiAgY29uc3QgbWFya3M6IE1hcmtSYW5nZVtdID0gW11cblxuICAvLyBnZXQgYWxsIGluY2x1c2l2ZSBtYXJrcyBvbiBlbXB0eSBzZWxlY3Rpb25cbiAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgZG9jXG4gICAgICAucmVzb2x2ZShmcm9tKVxuICAgICAgLm1hcmtzKClcbiAgICAgIC5mb3JFYWNoKG1hcmsgPT4ge1xuICAgICAgICBjb25zdCAkcG9zID0gZG9jLnJlc29sdmUoZnJvbSAtIDEpXG4gICAgICAgIGNvbnN0IHJhbmdlID0gZ2V0TWFya1JhbmdlKCRwb3MsIG1hcmsudHlwZSlcblxuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBtYXJrcy5wdXNoKHtcbiAgICAgICAgICBtYXJrLFxuICAgICAgICAgIC4uLnJhbmdlLFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgfSBlbHNlIHtcbiAgICBkb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICBtYXJrcy5wdXNoKFxuICAgICAgICAuLi5ub2RlLm1hcmtzLm1hcChtYXJrID0+ICh7XG4gICAgICAgICAgZnJvbTogcG9zLFxuICAgICAgICAgIHRvOiBwb3MgKyBub2RlLm5vZGVTaXplLFxuICAgICAgICAgIG1hcmssXG4gICAgICAgIH0pKSxcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG1hcmtzXG59XG4iLCAiaW1wb3J0IHsgTm9kZSwgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBub2RlIG9mIGEgZ2l2ZW4gdHlwZSBvciBuYW1lIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqIEBwYXJhbSBzdGF0ZSBUaGUgZWRpdG9yIHN0YXRlLlxuICogQHBhcmFtIHR5cGVPck5hbWUgVGhlIG5vZGUgdHlwZSBvciBuYW1lLlxuICogQHBhcmFtIHBvcyBUaGUgcG9zaXRpb24gdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20uXG4gKiBAcGFyYW0gbWF4RGVwdGggVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICogQHJldHVybnMgVGhlIG5vZGUgYW5kIHRoZSBkZXB0aCBhcyBhbiBhcnJheS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vZGVBdFBvc2l0aW9uID0gKHN0YXRlOiBFZGl0b3JTdGF0ZSwgdHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIHBvczogbnVtYmVyLCBtYXhEZXB0aCA9IDIwKSA9PiB7XG4gIGNvbnN0ICRwb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpXG5cbiAgbGV0IGN1cnJlbnREZXB0aCA9IG1heERlcHRoXG4gIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IG51bGxcblxuICB3aGlsZSAoY3VycmVudERlcHRoID4gMCAmJiBub2RlID09PSBudWxsKSB7XG4gICAgY29uc3QgY3VycmVudE5vZGUgPSAkcG9zLm5vZGUoY3VycmVudERlcHRoKVxuXG4gICAgaWYgKGN1cnJlbnROb2RlPy50eXBlLm5hbWUgPT09IHR5cGVPck5hbWUpIHtcbiAgICAgIG5vZGUgPSBjdXJyZW50Tm9kZVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50RGVwdGggLT0gMVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbm9kZSwgY3VycmVudERlcHRoXSBhcyBbTm9kZSB8IG51bGwsIG51bWJlcl1cbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb25BdHRyaWJ1dGUgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwbGl0dGVkQXR0cmlidXRlcyhcbiAgZXh0ZW5zaW9uQXR0cmlidXRlczogRXh0ZW5zaW9uQXR0cmlidXRlW10sXG4gIHR5cGVOYW1lOiBzdHJpbmcsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3RcbiAgICAuZW50cmllcyhhdHRyaWJ1dGVzKVxuICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4ge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uQXR0cmlidXRlID0gZXh0ZW5zaW9uQXR0cmlidXRlcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSB0eXBlTmFtZSAmJiBpdGVtLm5hbWUgPT09IG5hbWVcbiAgICAgIH0pXG5cbiAgICAgIGlmICghZXh0ZW5zaW9uQXR0cmlidXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXh0ZW5zaW9uQXR0cmlidXRlLmF0dHJpYnV0ZS5rZWVwT25TcGxpdFxuICAgIH0pKVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgTWFya1JhbmdlIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBvYmplY3RJbmNsdWRlcyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYmplY3RJbmNsdWRlcy5qcydcbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi9nZXRNYXJrVHlwZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya0FjdGl2ZShcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICB0eXBlT3JOYW1lOiBNYXJrVHlwZSB8IHN0cmluZyB8IG51bGwsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCB7IGVtcHR5LCByYW5nZXMgfSA9IHN0YXRlLnNlbGVjdGlvblxuICBjb25zdCB0eXBlID0gdHlwZU9yTmFtZSA/IGdldE1hcmtUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSkgOiBudWxsXG5cbiAgaWYgKGVtcHR5KSB7XG4gICAgcmV0dXJuICEhKHN0YXRlLnN0b3JlZE1hcmtzIHx8IHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKVxuICAgICAgLmZpbHRlcihtYXJrID0+IHtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlLm5hbWUgPT09IG1hcmsudHlwZS5uYW1lXG4gICAgICB9KVxuICAgICAgLmZpbmQobWFyayA9PiBvYmplY3RJbmNsdWRlcyhtYXJrLmF0dHJzLCBhdHRyaWJ1dGVzLCB7IHN0cmljdDogZmFsc2UgfSkpXG4gIH1cblxuICBsZXQgc2VsZWN0aW9uUmFuZ2UgPSAwXG4gIGNvbnN0IG1hcmtSYW5nZXM6IE1hcmtSYW5nZVtdID0gW11cblxuICByYW5nZXMuZm9yRWFjaCgoeyAkZnJvbSwgJHRvIH0pID0+IHtcbiAgICBjb25zdCBmcm9tID0gJGZyb20ucG9zXG4gICAgY29uc3QgdG8gPSAkdG8ucG9zXG5cbiAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0ICYmICFub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tID0gTWF0aC5tYXgoZnJvbSwgcG9zKVxuICAgICAgY29uc3QgcmVsYXRpdmVUbyA9IE1hdGgubWluKHRvLCBwb3MgKyBub2RlLm5vZGVTaXplKVxuICAgICAgY29uc3QgcmFuZ2UgPSByZWxhdGl2ZVRvIC0gcmVsYXRpdmVGcm9tXG5cbiAgICAgIHNlbGVjdGlvblJhbmdlICs9IHJhbmdlXG5cbiAgICAgIG1hcmtSYW5nZXMucHVzaChcbiAgICAgICAgLi4ubm9kZS5tYXJrcy5tYXAobWFyayA9PiAoe1xuICAgICAgICAgIG1hcmssXG4gICAgICAgICAgZnJvbTogcmVsYXRpdmVGcm9tLFxuICAgICAgICAgIHRvOiByZWxhdGl2ZVRvLFxuICAgICAgICB9KSksXG4gICAgICApXG4gICAgfSlcbiAgfSlcblxuICBpZiAoc2VsZWN0aW9uUmFuZ2UgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSByYW5nZSBvZiBtYXRjaGVkIG1hcmtcbiAgY29uc3QgbWF0Y2hlZFJhbmdlID0gbWFya1Jhbmdlc1xuICAgIC5maWx0ZXIobWFya1JhbmdlID0+IHtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZS5uYW1lID09PSBtYXJrUmFuZ2UubWFyay50eXBlLm5hbWVcbiAgICB9KVxuICAgIC5maWx0ZXIobWFya1JhbmdlID0+IG9iamVjdEluY2x1ZGVzKG1hcmtSYW5nZS5tYXJrLmF0dHJzLCBhdHRyaWJ1dGVzLCB7IHN0cmljdDogZmFsc2UgfSkpXG4gICAgLnJlZHVjZSgoc3VtLCBtYXJrUmFuZ2UpID0+IHN1bSArIG1hcmtSYW5nZS50byAtIG1hcmtSYW5nZS5mcm9tLCAwKVxuXG4gIC8vIGNhbGN1bGF0ZSByYW5nZSBvZiBtYXJrcyB0aGF0IGV4Y2x1ZGVzIHRoZSBzZWFyY2hlZCBtYXJrXG4gIC8vIGZvciBleGFtcGxlIGBjb2RlYCBkb2VzbuKAmXQgYWxsb3cgYW55IG90aGVyIG1hcmtzXG4gIGNvbnN0IGV4Y2x1ZGVkUmFuZ2UgPSBtYXJrUmFuZ2VzXG4gICAgLmZpbHRlcihtYXJrUmFuZ2UgPT4ge1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXJrUmFuZ2UubWFyay50eXBlICE9PSB0eXBlICYmIG1hcmtSYW5nZS5tYXJrLnR5cGUuZXhjbHVkZXModHlwZSlcbiAgICB9KVxuICAgIC5yZWR1Y2UoKHN1bSwgbWFya1JhbmdlKSA9PiBzdW0gKyBtYXJrUmFuZ2UudG8gLSBtYXJrUmFuZ2UuZnJvbSwgMClcblxuICAvLyB3ZSBvbmx5IGluY2x1ZGUgdGhlIHJlc3VsdCBvZiBgZXhjbHVkZWRSYW5nZWBcbiAgLy8gaWYgdGhlcmUgaXMgYSBtYXRjaCBhdCBhbGxcbiAgY29uc3QgcmFuZ2UgPSBtYXRjaGVkUmFuZ2UgPiAwID8gbWF0Y2hlZFJhbmdlICsgZXhjbHVkZWRSYW5nZSA6IG1hdGNoZWRSYW5nZVxuXG4gIHJldHVybiByYW5nZSA+PSBzZWxlY3Rpb25SYW5nZVxufVxuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUgfSBmcm9tICcuL2dldFNjaGVtYVR5cGVOYW1lQnlOYW1lLmpzJ1xuaW1wb3J0IHsgaXNNYXJrQWN0aXZlIH0gZnJvbSAnLi9pc01hcmtBY3RpdmUuanMnXG5pbXBvcnQgeyBpc05vZGVBY3RpdmUgfSBmcm9tICcuL2lzTm9kZUFjdGl2ZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aXZlKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIG5hbWU6IHN0cmluZyB8IG51bGwsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IGJvb2xlYW4ge1xuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gaXNOb2RlQWN0aXZlKHN0YXRlLCBudWxsLCBhdHRyaWJ1dGVzKSB8fCBpc01hcmtBY3RpdmUoc3RhdGUsIG51bGwsIGF0dHJpYnV0ZXMpXG4gIH1cblxuICBjb25zdCBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUobmFtZSwgc3RhdGUuc2NoZW1hKVxuXG4gIGlmIChzY2hlbWFUeXBlID09PSAnbm9kZScpIHtcbiAgICByZXR1cm4gaXNOb2RlQWN0aXZlKHN0YXRlLCBuYW1lLCBhdHRyaWJ1dGVzKVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdtYXJrJykge1xuICAgIHJldHVybiBpc01hcmtBY3RpdmUoc3RhdGUsIG5hbWUsIGF0dHJpYnV0ZXMpXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGZpbmRQYXJlbnROb2RlIH0gZnJvbSAnLi9maW5kUGFyZW50Tm9kZS5qcydcblxuZXhwb3J0IGNvbnN0IGlzQXRFbmRPZk5vZGUgPSAoc3RhdGU6IEVkaXRvclN0YXRlLCBub2RlVHlwZT86IHN0cmluZykgPT4ge1xuICBjb25zdCB7ICRmcm9tLCAkdG8sICRhbmNob3IgfSA9IHN0YXRlLnNlbGVjdGlvblxuXG4gIGlmIChub2RlVHlwZSkge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IG5vZGUudHlwZS5uYW1lID09PSBub2RlVHlwZSkoc3RhdGUuc2VsZWN0aW9uKVxuXG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCAkcGFyZW50UG9zID0gc3RhdGUuZG9jLnJlc29sdmUocGFyZW50Tm9kZS5wb3MgKyAxKVxuXG4gICAgaWYgKCRhbmNob3IucG9zICsgMSA9PT0gJHBhcmVudFBvcy5lbmQoKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICgkdG8ucGFyZW50T2Zmc2V0IDwgJHRvLnBhcmVudC5ub2RlU2l6ZSAtIDIgfHwgJGZyb20ucG9zICE9PSAkdG8ucG9zKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGNvbnN0IGlzQXRTdGFydE9mTm9kZSA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb25cblxuICBpZiAoJGZyb20ucGFyZW50T2Zmc2V0ID4gMCB8fCAkZnJvbS5wb3MgIT09ICR0by5wb3MpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuLi9oZWxwZXJzL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgTm9kZUNvbmZpZyB9IGZyb20gJy4uL2luZGV4LmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IHNwbGl0RXh0ZW5zaW9ucyB9IGZyb20gJy4vc3BsaXRFeHRlbnNpb25zLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0KG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uczogRXh0ZW5zaW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IG5vZGVFeHRlbnNpb25zIH0gPSBzcGxpdEV4dGVuc2lvbnMoZXh0ZW5zaW9ucylcbiAgY29uc3QgZXh0ZW5zaW9uID0gbm9kZUV4dGVuc2lvbnMuZmluZChpdGVtID0+IGl0ZW0ubmFtZSA9PT0gbmFtZSlcblxuICBpZiAoIWV4dGVuc2lvbikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgfVxuICBjb25zdCBncm91cCA9IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydncm91cCddPihleHRlbnNpb24sICdncm91cCcsIGNvbnRleHQpKVxuXG4gIGlmICh0eXBlb2YgZ3JvdXAgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZ3JvdXAuc3BsaXQoJyAnKS5pbmNsdWRlcygnbGlzdCcpXG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlRW1wdHkobm9kZTogUHJvc2VNaXJyb3JOb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRDb250ZW50ID0gbm9kZS50eXBlLmNyZWF0ZUFuZEZpbGwoKT8udG9KU09OKClcbiAgY29uc3QgY29udGVudCA9IG5vZGUudG9KU09OKClcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGVmYXVsdENvbnRlbnQpID09PSBKU09OLnN0cmluZ2lmeShjb250ZW50KVxufVxuIiwgImltcG9ydCB7IE5vZGVTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlU2VsZWN0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTm9kZVNlbGVjdGlvbiB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb25cbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAnQHRpcHRhcC9wbS92aWV3J1xuXG5pbXBvcnQgeyBtaW5NYXggfSBmcm9tICcuLi91dGlsaXRpZXMvbWluTWF4LmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zVG9ET01SZWN0KHZpZXc6IEVkaXRvclZpZXcsIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IERPTVJlY3Qge1xuICBjb25zdCBtaW5Qb3MgPSAwXG4gIGNvbnN0IG1heFBvcyA9IHZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZVxuICBjb25zdCByZXNvbHZlZEZyb20gPSBtaW5NYXgoZnJvbSwgbWluUG9zLCBtYXhQb3MpXG4gIGNvbnN0IHJlc29sdmVkRW5kID0gbWluTWF4KHRvLCBtaW5Qb3MsIG1heFBvcylcbiAgY29uc3Qgc3RhcnQgPSB2aWV3LmNvb3Jkc0F0UG9zKHJlc29sdmVkRnJvbSlcbiAgY29uc3QgZW5kID0gdmlldy5jb29yZHNBdFBvcyhyZXNvbHZlZEVuZCwgLTEpXG4gIGNvbnN0IHRvcCA9IE1hdGgubWluKHN0YXJ0LnRvcCwgZW5kLnRvcClcbiAgY29uc3QgYm90dG9tID0gTWF0aC5tYXgoc3RhcnQuYm90dG9tLCBlbmQuYm90dG9tKVxuICBjb25zdCBsZWZ0ID0gTWF0aC5taW4oc3RhcnQubGVmdCwgZW5kLmxlZnQpXG4gIGNvbnN0IHJpZ2h0ID0gTWF0aC5tYXgoc3RhcnQucmlnaHQsIGVuZC5yaWdodClcbiAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnRcbiAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wXG4gIGNvbnN0IHggPSBsZWZ0XG4gIGNvbnN0IHkgPSB0b3BcbiAgY29uc3QgZGF0YSA9IHtcbiAgICB0b3AsXG4gICAgYm90dG9tLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeSxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICB0b0pTT046ICgpID0+IGRhdGEsXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYXJrVHlwZSwgUmVzb2x2ZWRQb3MgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFRyYW5zYWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgZ2V0TWFya0F0dHJpYnV0ZXMgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtBdHRyaWJ1dGVzLmpzJ1xuaW1wb3J0IHsgZ2V0TWFya1R5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtUeXBlLmpzJ1xuaW1wb3J0IHsgaXNUZXh0U2VsZWN0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXRNYXJrOiB7XG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIG1hcmsgd2l0aCBuZXcgYXR0cmlidXRlcy5cbiAgICAgICAqL1xuICAgICAgc2V0TWFyazogKHR5cGVPck5hbWU6IHN0cmluZyB8IE1hcmtUeXBlLCBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5TZXRNYXJrKHN0YXRlOiBFZGl0b3JTdGF0ZSwgdHI6IFRyYW5zYWN0aW9uLCBuZXdNYXJrVHlwZTogTWFya1R5cGUpIHtcbiAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHRyXG4gIGxldCBjdXJzb3I6IFJlc29sdmVkUG9zIHwgbnVsbCA9IG51bGxcblxuICBpZiAoaXNUZXh0U2VsZWN0aW9uKHNlbGVjdGlvbikpIHtcbiAgICBjdXJzb3IgPSBzZWxlY3Rpb24uJGN1cnNvclxuICB9XG5cbiAgaWYgKGN1cnNvcikge1xuICAgIGNvbnN0IGN1cnJlbnRNYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzID8/IGN1cnNvci5tYXJrcygpXG5cbiAgICAvLyBUaGVyZSBjYW4gYmUgbm8gY3VycmVudCBtYXJrcyB0aGF0IGV4Y2x1ZGUgdGhlIG5ldyBtYXJrXG4gICAgcmV0dXJuIChcbiAgICAgICEhbmV3TWFya1R5cGUuaXNJblNldChjdXJyZW50TWFya3MpXG4gICAgICB8fCAhY3VycmVudE1hcmtzLnNvbWUobWFyayA9PiBtYXJrLnR5cGUuZXhjbHVkZXMobmV3TWFya1R5cGUpKVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICByZXR1cm4gcmFuZ2VzLnNvbWUoKHsgJGZyb20sICR0byB9KSA9PiB7XG4gICAgbGV0IHNvbWVOb2RlU3VwcG9ydHNNYXJrID0gJGZyb20uZGVwdGggPT09IDBcbiAgICAgID8gc3RhdGUuZG9jLmlubGluZUNvbnRlbnQgJiYgc3RhdGUuZG9jLnR5cGUuYWxsb3dzTWFya1R5cGUobmV3TWFya1R5cGUpXG4gICAgICA6IGZhbHNlXG5cbiAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKCRmcm9tLnBvcywgJHRvLnBvcywgKG5vZGUsIF9wb3MsIHBhcmVudCkgPT4ge1xuICAgICAgLy8gSWYgd2UgYWxyZWFkeSBmb3VuZCBhIG1hcmsgdGhhdCB3ZSBjYW4gZW5hYmxlLCByZXR1cm4gZmFsc2UgdG8gYnlwYXNzIHRoZSByZW1haW5pbmcgc2VhcmNoXG4gICAgICBpZiAoc29tZU5vZGVTdXBwb3J0c01hcmspIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmlzSW5saW5lKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEFsbG93c01hcmtUeXBlID0gIXBhcmVudCB8fCBwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShuZXdNYXJrVHlwZSlcbiAgICAgICAgY29uc3QgY3VycmVudE1hcmtzQWxsb3dNYXJrVHlwZSA9ICEhbmV3TWFya1R5cGUuaXNJblNldChub2RlLm1hcmtzKVxuICAgICAgICAgIHx8ICFub2RlLm1hcmtzLnNvbWUob3RoZXJNYXJrID0+IG90aGVyTWFyay50eXBlLmV4Y2x1ZGVzKG5ld01hcmtUeXBlKSlcblxuICAgICAgICBzb21lTm9kZVN1cHBvcnRzTWFyayA9IHBhcmVudEFsbG93c01hcmtUeXBlICYmIGN1cnJlbnRNYXJrc0FsbG93TWFya1R5cGVcbiAgICAgIH1cbiAgICAgIHJldHVybiAhc29tZU5vZGVTdXBwb3J0c01hcmtcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNvbWVOb2RlU3VwcG9ydHNNYXJrXG4gIH0pXG59XG5leHBvcnQgY29uc3Qgc2V0TWFyazogUmF3Q29tbWFuZHNbJ3NldE1hcmsnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7IHRyLCBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJcbiAgY29uc3QgeyBlbXB0eSwgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cbiAgY29uc3QgdHlwZSA9IGdldE1hcmtUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBpZiAoZW1wdHkpIHtcbiAgICAgIGNvbnN0IG9sZEF0dHJpYnV0ZXMgPSBnZXRNYXJrQXR0cmlidXRlcyhzdGF0ZSwgdHlwZSlcblxuICAgICAgdHIuYWRkU3RvcmVkTWFyayhcbiAgICAgICAgdHlwZS5jcmVhdGUoe1xuICAgICAgICAgIC4uLm9sZEF0dHJpYnV0ZXMsXG4gICAgICAgICAgLi4uYXR0cmlidXRlcyxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5mb3JFYWNoKHJhbmdlID0+IHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHJhbmdlLiRmcm9tLnBvc1xuICAgICAgICBjb25zdCB0byA9IHJhbmdlLiR0by5wb3NcblxuICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJpbW1lZEZyb20gPSBNYXRoLm1heChwb3MsIGZyb20pXG4gICAgICAgICAgY29uc3QgdHJpbW1lZFRvID0gTWF0aC5taW4ocG9zICsgbm9kZS5ub2RlU2l6ZSwgdG8pXG4gICAgICAgICAgY29uc3Qgc29tZUhhc01hcmsgPSBub2RlLm1hcmtzLmZpbmQobWFyayA9PiBtYXJrLnR5cGUgPT09IHR5cGUpXG5cbiAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgbWFyayBvZiB0aGlzIHR5cGVcbiAgICAgICAgICAvLyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSB0byBtZXJnZSBpdHMgYXR0cmlidXRlc1xuICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBhZGQgYSBmcmVzaCBuZXcgbWFya1xuICAgICAgICAgIGlmIChzb21lSGFzTWFyaykge1xuICAgICAgICAgICAgbm9kZS5tYXJrcy5mb3JFYWNoKG1hcmsgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gbWFyay50eXBlKSB7XG4gICAgICAgICAgICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgICAgICAgICAgIHRyaW1tZWRGcm9tLFxuICAgICAgICAgICAgICAgICAgdHJpbW1lZFRvLFxuICAgICAgICAgICAgICAgICAgdHlwZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5tYXJrLmF0dHJzLFxuICAgICAgICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ci5hZGRNYXJrKHRyaW1tZWRGcm9tLCB0cmltbWVkVG8sIHR5cGUuY3JlYXRlKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhblNldE1hcmsoc3RhdGUsIHRyLCB0eXBlKVxufVxuIiwgImltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXRNZXRhOiB7XG4gICAgICAvKipcbiAgICAgICAqIFN0b3JlIGEgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uXG4gICAgICAgKi9cbiAgICAgIHNldE1ldGE6IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNldE1ldGE6IFJhd0NvbW1hbmRzWydzZXRNZXRhJ10gPSAoa2V5LCB2YWx1ZSkgPT4gKHsgdHIgfSkgPT4ge1xuICB0ci5zZXRNZXRhKGtleSwgdmFsdWUpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBzZXRCbG9ja1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc2V0Tm9kZToge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXBsYWNlIGEgZ2l2ZW4gcmFuZ2Ugd2l0aCBhIG5vZGUuXG4gICAgICAgKi9cbiAgICAgIHNldE5vZGU6ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSwgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNldE5vZGU6IFJhd0NvbW1hbmRzWydzZXROb2RlJ10gPSAodHlwZU9yTmFtZSwgYXR0cmlidXRlcyA9IHt9KSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2gsIGNoYWluIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICAvLyBUT0RPOiB1c2UgYSBmYWxsYmFjayBsaWtlIGluc2VydENvbnRlbnQ/XG4gIGlmICghdHlwZS5pc1RleHRibG9jaykge1xuICAgIGNvbnNvbGUud2FybignW3RpcHRhcCB3YXJuXTogQ3VycmVudGx5IFwic2V0Tm9kZSgpXCIgb25seSBzdXBwb3J0cyB0ZXh0IGJsb2NrIG5vZGVzLicpXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgY2hhaW4oKVxuICAgIC8vIHRyeSB0byBjb252ZXJ0IG5vZGUgdG8gZGVmYXVsdCBub2RlIGlmIG5lZWRlZFxuICAgICAgLmNvbW1hbmQoKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICBjb25zdCBjYW5TZXRCbG9jayA9IHNldEJsb2NrVHlwZSh0eXBlLCBhdHRyaWJ1dGVzKShzdGF0ZSlcblxuICAgICAgICBpZiAoY2FuU2V0QmxvY2spIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLmNsZWFyTm9kZXMoKVxuICAgICAgfSlcbiAgICAgIC5jb21tYW5kKCh7IHN0YXRlOiB1cGRhdGVkU3RhdGUgfSkgPT4ge1xuICAgICAgICByZXR1cm4gc2V0QmxvY2tUeXBlKHR5cGUsIGF0dHJpYnV0ZXMpKHVwZGF0ZWRTdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICB9KVxuICAgICAgLnJ1bigpXG4gIClcbn1cbiIsICJpbXBvcnQgeyBOb2RlU2VsZWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IG1pbk1heCB9IGZyb20gJy4uL3V0aWxpdGllcy9taW5NYXguanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXROb2RlU2VsZWN0aW9uOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSBOb2RlU2VsZWN0aW9uLlxuICAgICAgICovXG4gICAgICBzZXROb2RlU2VsZWN0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2V0Tm9kZVNlbGVjdGlvbjogUmF3Q29tbWFuZHNbJ3NldE5vZGVTZWxlY3Rpb24nXSA9IHBvc2l0aW9uID0+ICh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHsgZG9jIH0gPSB0clxuICAgIGNvbnN0IGZyb20gPSBtaW5NYXgocG9zaXRpb24sIDAsIGRvYy5jb250ZW50LnNpemUpXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUoZG9jLCBmcm9tKVxuXG4gICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbilcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IFJhbmdlLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgbWluTWF4IH0gZnJvbSAnLi4vdXRpbGl0aWVzL21pbk1heC5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNldFRleHRTZWxlY3Rpb246IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIFRleHRTZWxlY3Rpb24uXG4gICAgICAgKi9cbiAgICAgIHNldFRleHRTZWxlY3Rpb246IChwb3NpdGlvbjogbnVtYmVyIHwgUmFuZ2UpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNldFRleHRTZWxlY3Rpb246IFJhd0NvbW1hbmRzWydzZXRUZXh0U2VsZWN0aW9uJ10gPSBwb3NpdGlvbiA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gdHJcbiAgICBjb25zdCB7IGZyb20sIHRvIH0gPSB0eXBlb2YgcG9zaXRpb24gPT09ICdudW1iZXInID8geyBmcm9tOiBwb3NpdGlvbiwgdG86IHBvc2l0aW9uIH0gOiBwb3NpdGlvblxuICAgIGNvbnN0IG1pblBvcyA9IFRleHRTZWxlY3Rpb24uYXRTdGFydChkb2MpLmZyb21cbiAgICBjb25zdCBtYXhQb3MgPSBUZXh0U2VsZWN0aW9uLmF0RW5kKGRvYykudG9cbiAgICBjb25zdCByZXNvbHZlZEZyb20gPSBtaW5NYXgoZnJvbSwgbWluUG9zLCBtYXhQb3MpXG4gICAgY29uc3QgcmVzb2x2ZWRFbmQgPSBtaW5NYXgodG8sIG1pblBvcywgbWF4UG9zKVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgcmVzb2x2ZWRGcm9tLCByZXNvbHZlZEVuZClcblxuICAgIHRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IHNpbmtMaXN0SXRlbSBhcyBvcmlnaW5hbFNpbmtMaXN0SXRlbSB9IGZyb20gJ0B0aXB0YXAvcG0vc2NoZW1hLWxpc3QnXG5cbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzaW5rTGlzdEl0ZW06IHtcbiAgICAgIC8qKlxuICAgICAgICogU2luayB0aGUgbGlzdCBpdGVtIGRvd24gaW50byBhbiBpbm5lciBsaXN0LlxuICAgICAgICovXG4gICAgICBzaW5rTGlzdEl0ZW06ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2lua0xpc3RJdGVtOiBSYXdDb21tYW5kc1snc2lua0xpc3RJdGVtJ10gPSB0eXBlT3JOYW1lID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGNvbnN0IHR5cGUgPSBnZXROb2RlVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG5cbiAgcmV0dXJuIG9yaWdpbmFsU2lua0xpc3RJdGVtKHR5cGUpKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSwgTm9kZVNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBjYW5TcGxpdCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBkZWZhdWx0QmxvY2tBdCB9IGZyb20gJy4uL2hlbHBlcnMvZGVmYXVsdEJsb2NrQXQuanMnXG5pbXBvcnQgeyBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9oZWxwZXJzL2dldFNwbGl0dGVkQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmZ1bmN0aW9uIGVuc3VyZU1hcmtzKHN0YXRlOiBFZGl0b3JTdGF0ZSwgc3BsaXR0YWJsZU1hcmtzPzogc3RyaW5nW10pIHtcbiAgY29uc3QgbWFya3MgPSBzdGF0ZS5zdG9yZWRNYXJrcyB8fCAoc3RhdGUuc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc3RhdGUuc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpXG5cbiAgaWYgKG1hcmtzKSB7XG4gICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzLmZpbHRlcihtYXJrID0+IHNwbGl0dGFibGVNYXJrcz8uaW5jbHVkZXMobWFyay50eXBlLm5hbWUpKVxuXG4gICAgc3RhdGUudHIuZW5zdXJlTWFya3MoZmlsdGVyZWRNYXJrcylcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc3BsaXRCbG9jazoge1xuICAgICAgLyoqXG4gICAgICAgKiBGb3JrcyBhIG5ldyBub2RlIGZyb20gYW4gZXhpc3Rpbmcgbm9kZS5cbiAgICAgICAqL1xuICAgICAgc3BsaXRCbG9jazogKG9wdGlvbnM/OiB7IGtlZXBNYXJrcz86IGJvb2xlYW4gfSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3BsaXRCbG9jazogUmF3Q29tbWFuZHNbJ3NwbGl0QmxvY2snXSA9ICh7IGtlZXBNYXJrcyA9IHRydWUgfSA9IHt9KSA9PiAoe1xuICB0ciwgc3RhdGUsIGRpc3BhdGNoLCBlZGl0b3IsXG59KSA9PiB7XG4gIGNvbnN0IHsgc2VsZWN0aW9uLCBkb2MgfSA9IHRyXG4gIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc2VsZWN0aW9uXG4gIGNvbnN0IGV4dGVuc2lvbkF0dHJpYnV0ZXMgPSBlZGl0b3IuZXh0ZW5zaW9uTWFuYWdlci5hdHRyaWJ1dGVzXG4gIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMoXG4gICAgZXh0ZW5zaW9uQXR0cmlidXRlcyxcbiAgICAkZnJvbS5ub2RlKCkudHlwZS5uYW1lLFxuICAgICRmcm9tLm5vZGUoKS5hdHRycyxcbiAgKVxuXG4gIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbGVjdGlvbi5ub2RlLmlzQmxvY2spIHtcbiAgICBpZiAoISRmcm9tLnBhcmVudE9mZnNldCB8fCAhY2FuU3BsaXQoZG9jLCAkZnJvbS5wb3MpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgIGlmIChrZWVwTWFya3MpIHtcbiAgICAgICAgZW5zdXJlTWFya3Moc3RhdGUsIGVkaXRvci5leHRlbnNpb25NYW5hZ2VyLnNwbGl0dGFibGVNYXJrcylcbiAgICAgIH1cblxuICAgICAgdHIuc3BsaXQoJGZyb20ucG9zKS5zY3JvbGxJbnRvVmlldygpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICghJGZyb20ucGFyZW50LmlzQmxvY2spIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IGF0RW5kID0gJHRvLnBhcmVudE9mZnNldCA9PT0gJHRvLnBhcmVudC5jb250ZW50LnNpemVcblxuICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB7XG4gICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmx0ID0gJGZyb20uZGVwdGggPT09IDBcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGRlZmF1bHRCbG9ja0F0KCRmcm9tLm5vZGUoLTEpLmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4QWZ0ZXIoLTEpKSlcblxuICAgIGxldCB0eXBlcyA9IGF0RW5kICYmIGRlZmx0XG4gICAgICA/IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IGRlZmx0LFxuICAgICAgICAgIGF0dHJzOiBuZXdBdHRyaWJ1dGVzLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGxldCBjYW4gPSBjYW5TcGxpdCh0ci5kb2MsIHRyLm1hcHBpbmcubWFwKCRmcm9tLnBvcyksIDEsIHR5cGVzKVxuXG4gICAgaWYgKFxuICAgICAgIXR5cGVzXG4gICAgICAgICYmICFjYW5cbiAgICAgICAgJiYgY2FuU3BsaXQodHIuZG9jLCB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCBkZWZsdCA/IFt7IHR5cGU6IGRlZmx0IH1dIDogdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgY2FuID0gdHJ1ZVxuICAgICAgdHlwZXMgPSBkZWZsdFxuICAgICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBkZWZsdCxcbiAgICAgICAgICAgIGF0dHJzOiBuZXdBdHRyaWJ1dGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpZiAoY2FuKSB7XG4gICAgICB0ci5zcGxpdCh0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCB0eXBlcylcblxuICAgICAgaWYgKGRlZmx0ICYmICFhdEVuZCAmJiAhJGZyb20ucGFyZW50T2Zmc2V0ICYmICRmcm9tLnBhcmVudC50eXBlICE9PSBkZWZsdCkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRyLm1hcHBpbmcubWFwKCRmcm9tLmJlZm9yZSgpKVxuICAgICAgICBjb25zdCAkZmlyc3QgPSB0ci5kb2MucmVzb2x2ZShmaXJzdClcblxuICAgICAgICBpZiAoJGZyb20ubm9kZSgtMSkuY2FuUmVwbGFjZVdpdGgoJGZpcnN0LmluZGV4KCksICRmaXJzdC5pbmRleCgpICsgMSwgZGVmbHQpKSB7XG4gICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cCh0ci5tYXBwaW5nLm1hcCgkZnJvbS5iZWZvcmUoKSksIGRlZmx0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtlZXBNYXJrcykge1xuICAgICAgZW5zdXJlTWFya3Moc3RhdGUsIGVkaXRvci5leHRlbnNpb25NYW5hZ2VyLnNwbGl0dGFibGVNYXJrcylcbiAgICB9XG5cbiAgICB0ci5zY3JvbGxJbnRvVmlldygpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7XG4gIEZyYWdtZW50LCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgTm9kZVR5cGUsIFNsaWNlLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBjYW5TcGxpdCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9oZWxwZXJzL2dldFNwbGl0dGVkQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzcGxpdExpc3RJdGVtOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNwbGl0cyBvbmUgbGlzdCBpdGVtIGludG8gdHdvIGxpc3QgaXRlbXMuXG4gICAgICAgKi9cbiAgICAgIHNwbGl0TGlzdEl0ZW06ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3BsaXRMaXN0SXRlbTogUmF3Q29tbWFuZHNbJ3NwbGl0TGlzdEl0ZW0nXSA9IHR5cGVPck5hbWUgPT4gKHtcbiAgdHIsIHN0YXRlLCBkaXNwYXRjaCwgZWRpdG9yLFxufSkgPT4ge1xuICBjb25zdCB0eXBlID0gZ2V0Tm9kZVR5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvblxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgY29uc3Qgbm9kZTogUHJvc2VNaXJyb3JOb2RlID0gc3RhdGUuc2VsZWN0aW9uLm5vZGVcblxuICBpZiAoKG5vZGUgJiYgbm9kZS5pc0Jsb2NrKSB8fCAkZnJvbS5kZXB0aCA8IDIgfHwgISRmcm9tLnNhbWVQYXJlbnQoJHRvKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgZ3JhbmRQYXJlbnQgPSAkZnJvbS5ub2RlKC0xKVxuXG4gIGlmIChncmFuZFBhcmVudC50eXBlICE9PSB0eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzID0gZWRpdG9yLmV4dGVuc2lvbk1hbmFnZXIuYXR0cmlidXRlc1xuXG4gIGlmICgkZnJvbS5wYXJlbnQuY29udGVudC5zaXplID09PSAwICYmICRmcm9tLm5vZGUoLTEpLmNoaWxkQ291bnQgPT09ICRmcm9tLmluZGV4QWZ0ZXIoLTEpKSB7XG4gICAgLy8gSW4gYW4gZW1wdHkgYmxvY2suIElmIHRoaXMgaXMgYSBuZXN0ZWQgbGlzdCwgdGhlIHdyYXBwaW5nXG4gICAgLy8gbGlzdCBpdGVtIHNob3VsZCBiZSBzcGxpdC4gT3RoZXJ3aXNlLCBiYWlsIG91dCBhbmQgbGV0IG5leHRcbiAgICAvLyBjb21tYW5kIGhhbmRsZSBsaWZ0aW5nLlxuICAgIGlmIChcbiAgICAgICRmcm9tLmRlcHRoID09PSAyXG4gICAgICAgIHx8ICRmcm9tLm5vZGUoLTMpLnR5cGUgIT09IHR5cGVcbiAgICAgICAgfHwgJGZyb20uaW5kZXgoLTIpICE9PSAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50IC0gMVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBsZXQgd3JhcCA9IEZyYWdtZW50LmVtcHR5XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgY29uc3QgZGVwdGhCZWZvcmUgPSAkZnJvbS5pbmRleCgtMSkgPyAxIDogJGZyb20uaW5kZXgoLTIpID8gMiA6IDNcblxuICAgICAgLy8gQnVpbGQgYSBmcmFnbWVudCBjb250YWluaW5nIGVtcHR5IHZlcnNpb25zIG9mIHRoZSBzdHJ1Y3R1cmVcbiAgICAgIC8vIGZyb20gdGhlIG91dGVyIGxpc3QgaXRlbSB0byB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIGN1cnNvclxuICAgICAgZm9yIChsZXQgZCA9ICRmcm9tLmRlcHRoIC0gZGVwdGhCZWZvcmU7IGQgPj0gJGZyb20uZGVwdGggLSAzOyBkIC09IDEpIHtcbiAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShkKS5jb3B5KHdyYXApKVxuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgY29uc3QgZGVwdGhBZnRlciA9ICRmcm9tLmluZGV4QWZ0ZXIoLTEpIDwgJGZyb20ubm9kZSgtMikuY2hpbGRDb3VudCA/IDEgOiAkZnJvbS5pbmRleEFmdGVyKC0yKSA8ICRmcm9tLm5vZGUoLTMpLmNoaWxkQ291bnQgPyAyIDogM1xuXG4gICAgICAvLyBBZGQgYSBzZWNvbmQgbGlzdCBpdGVtIHdpdGggYW4gZW1wdHkgZGVmYXVsdCBzdGFydCBub2RlXG4gICAgICBjb25zdCBuZXdOZXh0VHlwZUF0dHJpYnV0ZXMgPSBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMoXG4gICAgICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMsXG4gICAgICAgICRmcm9tLm5vZGUoKS50eXBlLm5hbWUsXG4gICAgICAgICRmcm9tLm5vZGUoKS5hdHRycyxcbiAgICAgIClcbiAgICAgIGNvbnN0IG5leHRUeXBlID0gdHlwZS5jb250ZW50TWF0Y2guZGVmYXVsdFR5cGU/LmNyZWF0ZUFuZEZpbGwobmV3TmV4dFR5cGVBdHRyaWJ1dGVzKSB8fCB1bmRlZmluZWRcblxuICAgICAgd3JhcCA9IHdyYXAuYXBwZW5kKEZyYWdtZW50LmZyb20odHlwZS5jcmVhdGVBbmRGaWxsKG51bGwsIG5leHRUeXBlKSB8fCB1bmRlZmluZWQpKVxuXG4gICAgICBjb25zdCBzdGFydCA9ICRmcm9tLmJlZm9yZSgkZnJvbS5kZXB0aCAtIChkZXB0aEJlZm9yZSAtIDEpKVxuXG4gICAgICB0ci5yZXBsYWNlKHN0YXJ0LCAkZnJvbS5hZnRlcigtZGVwdGhBZnRlciksIG5ldyBTbGljZSh3cmFwLCA0IC0gZGVwdGhCZWZvcmUsIDApKVxuXG4gICAgICBsZXQgc2VsID0gLTFcblxuICAgICAgdHIuZG9jLm5vZGVzQmV0d2VlbihzdGFydCwgdHIuZG9jLmNvbnRlbnQuc2l6ZSwgKG4sIHBvcykgPT4ge1xuICAgICAgICBpZiAoc2VsID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuLmlzVGV4dGJsb2NrICYmIG4uY29udGVudC5zaXplID09PSAwKSB7XG4gICAgICAgICAgc2VsID0gcG9zICsgMVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoc2VsID4gLTEpIHtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShzZWwpKSlcbiAgICAgIH1cblxuICAgICAgdHIuc2Nyb2xsSW50b1ZpZXcoKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCBuZXh0VHlwZSA9ICR0by5wb3MgPT09ICRmcm9tLmVuZCgpID8gZ3JhbmRQYXJlbnQuY29udGVudE1hdGNoQXQoMCkuZGVmYXVsdFR5cGUgOiBudWxsXG5cbiAgY29uc3QgbmV3VHlwZUF0dHJpYnV0ZXMgPSBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMoXG4gICAgZXh0ZW5zaW9uQXR0cmlidXRlcyxcbiAgICBncmFuZFBhcmVudC50eXBlLm5hbWUsXG4gICAgZ3JhbmRQYXJlbnQuYXR0cnMsXG4gIClcbiAgY29uc3QgbmV3TmV4dFR5cGVBdHRyaWJ1dGVzID0gZ2V0U3BsaXR0ZWRBdHRyaWJ1dGVzKFxuICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMsXG4gICAgJGZyb20ubm9kZSgpLnR5cGUubmFtZSxcbiAgICAkZnJvbS5ub2RlKCkuYXR0cnMsXG4gIClcblxuICB0ci5kZWxldGUoJGZyb20ucG9zLCAkdG8ucG9zKVxuXG4gIGNvbnN0IHR5cGVzID0gbmV4dFR5cGVcbiAgICA/IFtcbiAgICAgIHsgdHlwZSwgYXR0cnM6IG5ld1R5cGVBdHRyaWJ1dGVzIH0sXG4gICAgICB7IHR5cGU6IG5leHRUeXBlLCBhdHRyczogbmV3TmV4dFR5cGVBdHRyaWJ1dGVzIH0sXG4gICAgXVxuICAgIDogW3sgdHlwZSwgYXR0cnM6IG5ld1R5cGVBdHRyaWJ1dGVzIH1dXG5cbiAgaWYgKCFjYW5TcGxpdCh0ci5kb2MsICRmcm9tLnBvcywgMikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uLCBzdG9yZWRNYXJrcyB9ID0gc3RhdGVcbiAgICBjb25zdCB7IHNwbGl0dGFibGVNYXJrcyB9ID0gZWRpdG9yLmV4dGVuc2lvbk1hbmFnZXJcbiAgICBjb25zdCBtYXJrcyA9IHN0b3JlZE1hcmtzIHx8IChzZWxlY3Rpb24uJHRvLnBhcmVudE9mZnNldCAmJiBzZWxlY3Rpb24uJGZyb20ubWFya3MoKSlcblxuICAgIHRyLnNwbGl0KCRmcm9tLnBvcywgMiwgdHlwZXMpLnNjcm9sbEludG9WaWV3KClcblxuICAgIGlmICghbWFya3MgfHwgIWRpc3BhdGNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkTWFya3MgPSBtYXJrcy5maWx0ZXIobWFyayA9PiBzcGxpdHRhYmxlTWFya3MuaW5jbHVkZXMobWFyay50eXBlLm5hbWUpKVxuXG4gICAgdHIuZW5zdXJlTWFya3MoZmlsdGVyZWRNYXJrcylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgY2FuSm9pbiB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBmaW5kUGFyZW50Tm9kZSB9IGZyb20gJy4uL2hlbHBlcnMvZmluZFBhcmVudE5vZGUuanMnXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBpc0xpc3QgfSBmcm9tICcuLi9oZWxwZXJzL2lzTGlzdC5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmNvbnN0IGpvaW5MaXN0QmFja3dhcmRzID0gKHRyOiBUcmFuc2FjdGlvbiwgbGlzdFR5cGU6IE5vZGVUeXBlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGxpc3QgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IG5vZGUudHlwZSA9PT0gbGlzdFR5cGUpKHRyLnNlbGVjdGlvbilcblxuICBpZiAoIWxpc3QpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgYmVmb3JlID0gdHIuZG9jLnJlc29sdmUoTWF0aC5tYXgoMCwgbGlzdC5wb3MgLSAxKSkuYmVmb3JlKGxpc3QuZGVwdGgpXG5cbiAgaWYgKGJlZm9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0IG5vZGVCZWZvcmUgPSB0ci5kb2Mubm9kZUF0KGJlZm9yZSlcbiAgY29uc3QgY2FuSm9pbkJhY2t3YXJkcyA9IGxpc3Qubm9kZS50eXBlID09PSBub2RlQmVmb3JlPy50eXBlICYmIGNhbkpvaW4odHIuZG9jLCBsaXN0LnBvcylcblxuICBpZiAoIWNhbkpvaW5CYWNrd2FyZHMpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdHIuam9pbihsaXN0LnBvcylcblxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBqb2luTGlzdEZvcndhcmRzID0gKHRyOiBUcmFuc2FjdGlvbiwgbGlzdFR5cGU6IE5vZGVUeXBlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGxpc3QgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IG5vZGUudHlwZSA9PT0gbGlzdFR5cGUpKHRyLnNlbGVjdGlvbilcblxuICBpZiAoIWxpc3QpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgYWZ0ZXIgPSB0ci5kb2MucmVzb2x2ZShsaXN0LnN0YXJ0KS5hZnRlcihsaXN0LmRlcHRoKVxuXG4gIGlmIChhZnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0IG5vZGVBZnRlciA9IHRyLmRvYy5ub2RlQXQoYWZ0ZXIpXG4gIGNvbnN0IGNhbkpvaW5Gb3J3YXJkcyA9IGxpc3Qubm9kZS50eXBlID09PSBub2RlQWZ0ZXI/LnR5cGUgJiYgY2FuSm9pbih0ci5kb2MsIGFmdGVyKVxuXG4gIGlmICghY2FuSm9pbkZvcndhcmRzKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHRyLmpvaW4oYWZ0ZXIpXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRvZ2dsZUxpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGJldHdlZW4gZGlmZmVyZW50IGxpc3QgdHlwZXMuXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUxpc3Q6IChsaXN0VHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIGl0ZW1UeXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSwga2VlcE1hcmtzPzogYm9vbGVhbiwgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFJldHVyblR5cGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVMaXN0OiBSYXdDb21tYW5kc1sndG9nZ2xlTGlzdCddID0gKGxpc3RUeXBlT3JOYW1lLCBpdGVtVHlwZU9yTmFtZSwga2VlcE1hcmtzLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7XG4gIGVkaXRvciwgdHIsIHN0YXRlLCBkaXNwYXRjaCwgY2hhaW4sIGNvbW1hbmRzLCBjYW4sXG59KSA9PiB7XG4gIGNvbnN0IHsgZXh0ZW5zaW9ucywgc3BsaXR0YWJsZU1hcmtzIH0gPSBlZGl0b3IuZXh0ZW5zaW9uTWFuYWdlclxuICBjb25zdCBsaXN0VHlwZSA9IGdldE5vZGVUeXBlKGxpc3RUeXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IGl0ZW1UeXBlID0gZ2V0Tm9kZVR5cGUoaXRlbVR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgeyBzZWxlY3Rpb24sIHN0b3JlZE1hcmtzIH0gPSBzdGF0ZVxuICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHNlbGVjdGlvblxuICBjb25zdCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKVxuXG4gIGNvbnN0IG1hcmtzID0gc3RvcmVkTWFya3MgfHwgKHNlbGVjdGlvbi4kdG8ucGFyZW50T2Zmc2V0ICYmIHNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKVxuXG4gIGlmICghcmFuZ2UpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHBhcmVudExpc3QgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IGlzTGlzdChub2RlLnR5cGUubmFtZSwgZXh0ZW5zaW9ucykpKHNlbGVjdGlvbilcblxuICBpZiAocmFuZ2UuZGVwdGggPj0gMSAmJiBwYXJlbnRMaXN0ICYmIHJhbmdlLmRlcHRoIC0gcGFyZW50TGlzdC5kZXB0aCA8PSAxKSB7XG4gICAgLy8gcmVtb3ZlIGxpc3RcbiAgICBpZiAocGFyZW50TGlzdC5ub2RlLnR5cGUgPT09IGxpc3RUeXBlKSB7XG4gICAgICByZXR1cm4gY29tbWFuZHMubGlmdExpc3RJdGVtKGl0ZW1UeXBlKVxuICAgIH1cblxuICAgIC8vIGNoYW5nZSBsaXN0IHR5cGVcbiAgICBpZiAoXG4gICAgICBpc0xpc3QocGFyZW50TGlzdC5ub2RlLnR5cGUubmFtZSwgZXh0ZW5zaW9ucylcbiAgICAgICAgJiYgbGlzdFR5cGUudmFsaWRDb250ZW50KHBhcmVudExpc3Qubm9kZS5jb250ZW50KVxuICAgICAgICAmJiBkaXNwYXRjaFxuICAgICkge1xuICAgICAgcmV0dXJuIGNoYWluKClcbiAgICAgICAgLmNvbW1hbmQoKCkgPT4ge1xuICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAocGFyZW50TGlzdC5wb3MsIGxpc3RUeXBlKVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RCYWNrd2FyZHModHIsIGxpc3RUeXBlKSlcbiAgICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RGb3J3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgICAucnVuKClcbiAgICB9XG4gIH1cbiAgaWYgKCFrZWVwTWFya3MgfHwgIW1hcmtzIHx8ICFkaXNwYXRjaCkge1xuXG4gICAgcmV0dXJuIGNoYWluKClcbiAgICAgIC8vIHRyeSB0byBjb252ZXJ0IG5vZGUgdG8gZGVmYXVsdCBub2RlIGlmIG5lZWRlZFxuICAgICAgLmNvbW1hbmQoKCkgPT4ge1xuICAgICAgICBjb25zdCBjYW5XcmFwSW5MaXN0ID0gY2FuKCkud3JhcEluTGlzdChsaXN0VHlwZSwgYXR0cmlidXRlcylcblxuICAgICAgICBpZiAoY2FuV3JhcEluTGlzdCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWFuZHMuY2xlYXJOb2RlcygpXG4gICAgICB9KVxuICAgICAgLndyYXBJbkxpc3QobGlzdFR5cGUsIGF0dHJpYnV0ZXMpXG4gICAgICAuY29tbWFuZCgoKSA9PiBqb2luTGlzdEJhY2t3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RGb3J3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLnJ1bigpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIGNoYWluKClcbiAgICAvLyB0cnkgdG8gY29udmVydCBub2RlIHRvIGRlZmF1bHQgbm9kZSBpZiBuZWVkZWRcbiAgICAgIC5jb21tYW5kKCgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuV3JhcEluTGlzdCA9IGNhbigpLndyYXBJbkxpc3QobGlzdFR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzLmZpbHRlcihtYXJrID0+IHNwbGl0dGFibGVNYXJrcy5pbmNsdWRlcyhtYXJrLnR5cGUubmFtZSkpXG5cbiAgICAgICAgdHIuZW5zdXJlTWFya3MoZmlsdGVyZWRNYXJrcylcblxuICAgICAgICBpZiAoY2FuV3JhcEluTGlzdCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWFuZHMuY2xlYXJOb2RlcygpXG4gICAgICB9KVxuICAgICAgLndyYXBJbkxpc3QobGlzdFR5cGUsIGF0dHJpYnV0ZXMpXG4gICAgICAuY29tbWFuZCgoKSA9PiBqb2luTGlzdEJhY2t3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RGb3J3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLnJ1bigpXG4gIClcbn1cbiIsICJpbXBvcnQgeyBNYXJrVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IGlzTWFya0FjdGl2ZSB9IGZyb20gJy4uL2hlbHBlcnMvaXNNYXJrQWN0aXZlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRvZ2dsZU1hcms6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgbWFyayBvbiBhbmQgb2ZmLlxuICAgICAgICovXG4gICAgICB0b2dnbGVNYXJrOiAoXG4gICAgICAgIHR5cGVPck5hbWU6IHN0cmluZyB8IE1hcmtUeXBlLFxuICAgICAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZW1vdmVzIHRoZSBtYXJrIGV2ZW4gYWNyb3NzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBleHRlbmRFbXB0eU1hcmtSYW5nZT86IGJvb2xlYW5cbiAgICAgICAgfSxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdG9nZ2xlTWFyazogUmF3Q29tbWFuZHNbJ3RvZ2dsZU1hcmsnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30sIG9wdGlvbnMgPSB7fSkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgY29uc3QgeyBleHRlbmRFbXB0eU1hcmtSYW5nZSA9IGZhbHNlIH0gPSBvcHRpb25zXG4gIGNvbnN0IHR5cGUgPSBnZXRNYXJrVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IGlzQWN0aXZlID0gaXNNYXJrQWN0aXZlKHN0YXRlLCB0eXBlLCBhdHRyaWJ1dGVzKVxuXG4gIGlmIChpc0FjdGl2ZSkge1xuICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodHlwZSwgeyBleHRlbmRFbXB0eU1hcmtSYW5nZSB9KVxuICB9XG5cbiAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodHlwZSwgYXR0cmlidXRlcylcbn1cbiIsICJpbXBvcnQgeyBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IGlzTm9kZUFjdGl2ZSB9IGZyb20gJy4uL2hlbHBlcnMvaXNOb2RlQWN0aXZlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRvZ2dsZU5vZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgbm9kZSB3aXRoIGFub3RoZXIgbm9kZS5cbiAgICAgICAqL1xuICAgICAgdG9nZ2xlTm9kZTogKFxuICAgICAgICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSxcbiAgICAgICAgdG9nZ2xlVHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsXG4gICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVOb2RlOiBSYXdDb21tYW5kc1sndG9nZ2xlTm9kZSddID0gKHR5cGVPck5hbWUsIHRvZ2dsZVR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgdG9nZ2xlVHlwZSA9IGdldE5vZGVUeXBlKHRvZ2dsZVR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgaXNBY3RpdmUgPSBpc05vZGVBY3RpdmUoc3RhdGUsIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgaWYgKGlzQWN0aXZlKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRzLnNldE5vZGUodG9nZ2xlVHlwZSlcbiAgfVxuXG4gIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHR5cGUsIGF0dHJpYnV0ZXMpXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBpc05vZGVBY3RpdmUgfSBmcm9tICcuLi9oZWxwZXJzL2lzTm9kZUFjdGl2ZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB0b2dnbGVXcmFwOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdyYXBzIG5vZGVzIGluIGFub3RoZXIgbm9kZSwgb3IgcmVtb3ZlcyBhbiBleGlzdGluZyB3cmFwLlxuICAgICAgICovXG4gICAgICB0b2dnbGVXcmFwOiAodHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVXcmFwOiBSYXdDb21tYW5kc1sndG9nZ2xlV3JhcCddID0gKHR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgaXNBY3RpdmUgPSBpc05vZGVBY3RpdmUoc3RhdGUsIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgaWYgKGlzQWN0aXZlKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRzLmxpZnQodHlwZSlcbiAgfVxuXG4gIHJldHVybiBjb21tYW5kcy53cmFwSW4odHlwZSwgYXR0cmlidXRlcylcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgdW5kb0lucHV0UnVsZToge1xuICAgICAgLyoqXG4gICAgICAgKiBVbmRvIGFuIGlucHV0IHJ1bGUuXG4gICAgICAgKi9cbiAgICAgIHVuZG9JbnB1dFJ1bGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB1bmRvSW5wdXRSdWxlOiBSYXdDb21tYW5kc1sndW5kb0lucHV0UnVsZSddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHN0YXRlLnBsdWdpbnNcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW2ldXG4gICAgbGV0IHVuZG9hYmxlXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgaWYgKHBsdWdpbi5zcGVjLmlzSW5wdXRSdWxlcyAmJiAodW5kb2FibGUgPSBwbHVnaW4uZ2V0U3RhdGUoc3RhdGUpKSkge1xuICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGNvbnN0IHRyID0gc3RhdGUudHJcbiAgICAgICAgY29uc3QgdG9VbmRvID0gdW5kb2FibGUudHJhbnNmb3JtXG5cbiAgICAgICAgZm9yIChsZXQgaiA9IHRvVW5kby5zdGVwcy5sZW5ndGggLSAxOyBqID49IDA7IGogLT0gMSkge1xuICAgICAgICAgIHRyLnN0ZXAodG9VbmRvLnN0ZXBzW2pdLmludmVydCh0b1VuZG8uZG9jc1tqXSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5kb2FibGUudGV4dCkge1xuICAgICAgICAgIGNvbnN0IG1hcmtzID0gdHIuZG9jLnJlc29sdmUodW5kb2FibGUuZnJvbSkubWFya3MoKVxuXG4gICAgICAgICAgdHIucmVwbGFjZVdpdGgodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8sIHN0YXRlLnNjaGVtYS50ZXh0KHVuZG9hYmxlLnRleHQsIG1hcmtzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ci5kZWxldGUodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgdW5zZXRBbGxNYXJrczoge1xuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYWxsIG1hcmtzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAgICAqL1xuICAgICAgdW5zZXRBbGxNYXJrczogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHVuc2V0QWxsTWFya3M6IFJhd0NvbW1hbmRzWyd1bnNldEFsbE1hcmtzJ10gPSAoKSA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJcbiAgY29uc3QgeyBlbXB0eSwgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICBpZiAoZW1wdHkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgcmFuZ2VzLmZvckVhY2gocmFuZ2UgPT4ge1xuICAgICAgdHIucmVtb3ZlTWFyayhyYW5nZS4kZnJvbS5wb3MsIHJhbmdlLiR0by5wb3MpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXRNYXJrUmFuZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtSYW5nZS5qcydcbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB1bnNldE1hcms6IHtcbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFsbCBtYXJrcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gICAgICAgKi9cbiAgICAgIHVuc2V0TWFyazogKFxuICAgICAgICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBNYXJrVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZW1vdmVzIHRoZSBtYXJrIGV2ZW4gYWNyb3NzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBleHRlbmRFbXB0eU1hcmtSYW5nZT86IGJvb2xlYW5cbiAgICAgICAgfSxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdW5zZXRNYXJrOiBSYXdDb21tYW5kc1sndW5zZXRNYXJrJ10gPSAodHlwZU9yTmFtZSwgb3B0aW9ucyA9IHt9KSA9PiAoeyB0ciwgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgeyBleHRlbmRFbXB0eU1hcmtSYW5nZSA9IGZhbHNlIH0gPSBvcHRpb25zXG4gIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSB0clxuICBjb25zdCB0eXBlID0gZ2V0TWFya1R5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7ICRmcm9tLCBlbXB0eSwgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICBpZiAoIWRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChlbXB0eSAmJiBleHRlbmRFbXB0eU1hcmtSYW5nZSkge1xuICAgIGxldCB7IGZyb20sIHRvIH0gPSBzZWxlY3Rpb25cbiAgICBjb25zdCBhdHRycyA9ICRmcm9tLm1hcmtzKCkuZmluZChtYXJrID0+IG1hcmsudHlwZSA9PT0gdHlwZSk/LmF0dHJzXG4gICAgY29uc3QgcmFuZ2UgPSBnZXRNYXJrUmFuZ2UoJGZyb20sIHR5cGUsIGF0dHJzKVxuXG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICBmcm9tID0gcmFuZ2UuZnJvbVxuICAgICAgdG8gPSByYW5nZS50b1xuICAgIH1cblxuICAgIHRyLnJlbW92ZU1hcmsoZnJvbSwgdG8sIHR5cGUpXG4gIH0gZWxzZSB7XG4gICAgcmFuZ2VzLmZvckVhY2gocmFuZ2UgPT4ge1xuICAgICAgdHIucmVtb3ZlTWFyayhyYW5nZS4kZnJvbS5wb3MsIHJhbmdlLiR0by5wb3MsIHR5cGUpXG4gICAgfSlcbiAgfVxuXG4gIHRyLnJlbW92ZVN0b3JlZE1hcmsodHlwZSlcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IGdldFNjaGVtYVR5cGVOYW1lQnlOYW1lIH0gZnJvbSAnLi4vaGVscGVycy9nZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB1cGRhdGVBdHRyaWJ1dGVzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBhdHRyaWJ1dGVzIG9mIGEgbm9kZSBvciBtYXJrLlxuICAgICAgICovXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzOiAoXG4gICAgICAgIHR5cGVPck5hbWU6IHN0cmluZyB8IE5vZGVUeXBlIHwgTWFya1R5cGUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICApID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUF0dHJpYnV0ZXM6IFJhd0NvbW1hbmRzWyd1cGRhdGVBdHRyaWJ1dGVzJ10gPSAodHlwZU9yTmFtZSwgYXR0cmlidXRlcyA9IHt9KSA9PiAoeyB0ciwgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgbGV0IG5vZGVUeXBlOiBOb2RlVHlwZSB8IG51bGwgPSBudWxsXG4gIGxldCBtYXJrVHlwZTogTWFya1R5cGUgfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0IHNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZShcbiAgICB0eXBlb2YgdHlwZU9yTmFtZSA9PT0gJ3N0cmluZycgPyB0eXBlT3JOYW1lIDogdHlwZU9yTmFtZS5uYW1lLFxuICAgIHN0YXRlLnNjaGVtYSxcbiAgKVxuXG4gIGlmICghc2NoZW1hVHlwZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdub2RlJykge1xuICAgIG5vZGVUeXBlID0gZ2V0Tm9kZVR5cGUodHlwZU9yTmFtZSBhcyBOb2RlVHlwZSwgc3RhdGUuc2NoZW1hKVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdtYXJrJykge1xuICAgIG1hcmtUeXBlID0gZ2V0TWFya1R5cGUodHlwZU9yTmFtZSBhcyBNYXJrVHlwZSwgc3RhdGUuc2NoZW1hKVxuICB9XG5cbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgdHIuc2VsZWN0aW9uLnJhbmdlcy5mb3JFYWNoKHJhbmdlID0+IHtcbiAgICAgIGNvbnN0IGZyb20gPSByYW5nZS4kZnJvbS5wb3NcbiAgICAgIGNvbnN0IHRvID0gcmFuZ2UuJHRvLnBvc1xuXG4gICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgIGlmIChub2RlVHlwZSAmJiBub2RlVHlwZSA9PT0gbm9kZS50eXBlKSB7XG4gICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cChwb3MsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgLi4ubm9kZS5hdHRycyxcbiAgICAgICAgICAgIC4uLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXJrVHlwZSAmJiBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgIG5vZGUubWFya3MuZm9yRWFjaChtYXJrID0+IHtcbiAgICAgICAgICAgIGlmIChtYXJrVHlwZSA9PT0gbWFyay50eXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWRGcm9tID0gTWF0aC5tYXgocG9zLCBmcm9tKVxuICAgICAgICAgICAgICBjb25zdCB0cmltbWVkVG8gPSBNYXRoLm1pbihwb3MgKyBub2RlLm5vZGVTaXplLCB0bylcblxuICAgICAgICAgICAgICB0ci5hZGRNYXJrKFxuICAgICAgICAgICAgICAgIHRyaW1tZWRGcm9tLFxuICAgICAgICAgICAgICAgIHRyaW1tZWRUbyxcbiAgICAgICAgICAgICAgICBtYXJrVHlwZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgLi4ubWFyay5hdHRycyxcbiAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IHdyYXBJbiBhcyBvcmlnaW5hbFdyYXBJbiB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5pbXBvcnQgeyBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB3cmFwSW46IHtcbiAgICAgIC8qKlxuICAgICAgICogV3JhcHMgbm9kZXMgaW4gYW5vdGhlciBub2RlLlxuICAgICAgICovXG4gICAgICB3cmFwSW46ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSwgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHdyYXBJbjogUmF3Q29tbWFuZHNbJ3dyYXBJbiddID0gKHR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICByZXR1cm4gb3JpZ2luYWxXcmFwSW4odHlwZSwgYXR0cmlidXRlcykoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IHdyYXBJbkxpc3QgYXMgb3JpZ2luYWxXcmFwSW5MaXN0IH0gZnJvbSAnQHRpcHRhcC9wbS9zY2hlbWEtbGlzdCdcblxuaW1wb3J0IHsgZ2V0Tm9kZVR5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE5vZGVUeXBlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHdyYXBJbkxpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogV3JhcCBhIG5vZGUgaW4gYSBsaXN0LlxuICAgICAgICovXG4gICAgICB3cmFwSW5MaXN0OiAodHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB3cmFwSW5MaXN0OiBSYXdDb21tYW5kc1snd3JhcEluTGlzdCddID0gKHR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICByZXR1cm4gb3JpZ2luYWxXcmFwSW5MaXN0KHR5cGUsIGF0dHJpYnV0ZXMpKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgKiBhcyBjb21tYW5kcyBmcm9tICcuLi9jb21tYW5kcy9pbmRleC5qcydcbmltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gJy4uL0V4dGVuc2lvbi5qcydcblxuZXhwb3J0ICogZnJvbSAnLi4vY29tbWFuZHMvaW5kZXguanMnXG5cbmV4cG9ydCBjb25zdCBDb21tYW5kcyA9IEV4dGVuc2lvbi5jcmVhdGUoe1xuICBuYW1lOiAnY29tbWFuZHMnLFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21tYW5kcyxcbiAgICB9XG4gIH0sXG59KVxuIiwgImltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vRXh0ZW5zaW9uLmpzJ1xuXG5leHBvcnQgY29uc3QgRWRpdGFibGUgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2VkaXRhYmxlJyxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICBrZXk6IG5ldyBQbHVnaW5LZXkoJ2VkaXRhYmxlJyksXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgZWRpdGFibGU6ICgpID0+IHRoaXMuZWRpdG9yLm9wdGlvbnMuZWRpdGFibGUsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vRXh0ZW5zaW9uLmpzJ1xuXG5leHBvcnQgY29uc3QgRm9jdXNFdmVudHMgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2ZvY3VzRXZlbnRzJyxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXNcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdmb2N1c0V2ZW50cycpLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGhhbmRsZURPTUV2ZW50czoge1xuICAgICAgICAgICAgZm9jdXM6ICh2aWV3LCBldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgZWRpdG9yLmlzRm9jdXNlZCA9IHRydWVcblxuICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGVkaXRvci5zdGF0ZS50clxuICAgICAgICAgICAgICAgIC5zZXRNZXRhKCdmb2N1cycsIHsgZXZlbnQgfSlcbiAgICAgICAgICAgICAgICAuc2V0TWV0YSgnYWRkVG9IaXN0b3J5JywgZmFsc2UpXG5cbiAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cmFuc2FjdGlvbilcblxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibHVyOiAodmlldywgZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGVkaXRvci5pc0ZvY3VzZWQgPSBmYWxzZVxuXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZWRpdG9yLnN0YXRlLnRyXG4gICAgICAgICAgICAgICAgLnNldE1ldGEoJ2JsdXInLCB7IGV2ZW50IH0pXG4gICAgICAgICAgICAgICAgLnNldE1ldGEoJ2FkZFRvSGlzdG9yeScsIGZhbHNlKVxuXG4gICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godHJhbnNhY3Rpb24pXG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5LCBTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBDb21tYW5kTWFuYWdlciB9IGZyb20gJy4uL0NvbW1hbmRNYW5hZ2VyLmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vRXh0ZW5zaW9uLmpzJ1xuaW1wb3J0IHsgY3JlYXRlQ2hhaW5hYmxlU3RhdGUgfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZUNoYWluYWJsZVN0YXRlLmpzJ1xuaW1wb3J0IHsgaXNpT1MgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNpT1MuanMnXG5pbXBvcnQgeyBpc01hY09TIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzTWFjT1MuanMnXG5cbmV4cG9ydCBjb25zdCBLZXltYXAgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2tleW1hcCcsXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgY29uc3QgaGFuZGxlQmFja3NwYWNlID0gKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuZmlyc3QoKHsgY29tbWFuZHMgfSkgPT4gW1xuICAgICAgKCkgPT4gY29tbWFuZHMudW5kb0lucHV0UnVsZSgpLFxuXG4gICAgICAvLyBtYXliZSBjb252ZXJ0IGZpcnN0IHRleHQgYmxvY2sgbm9kZSB0byBkZWZhdWx0IG5vZGVcbiAgICAgICgpID0+IGNvbW1hbmRzLmNvbW1hbmQoKHsgdHIgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgZG9jIH0gPSB0clxuICAgICAgICBjb25zdCB7IGVtcHR5LCAkYW5jaG9yIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgeyBwb3MsIHBhcmVudCB9ID0gJGFuY2hvclxuICAgICAgICBjb25zdCAkcGFyZW50UG9zID0gJGFuY2hvci5wYXJlbnQuaXNUZXh0YmxvY2sgPyB0ci5kb2MucmVzb2x2ZShwb3MgLSAxKSA6ICRhbmNob3JcbiAgICAgICAgY29uc3QgcGFyZW50SXNJc29sYXRpbmcgPSAkcGFyZW50UG9zLnBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nXG5cbiAgICAgICAgY29uc3QgcGFyZW50UG9zID0gJGFuY2hvci5wb3MgLSAkYW5jaG9yLnBhcmVudE9mZnNldFxuXG4gICAgICAgIGNvbnN0IGlzQXRTdGFydCA9IChwYXJlbnRJc0lzb2xhdGluZyAmJiAkcGFyZW50UG9zLnBhcmVudC5jaGlsZENvdW50ID09PSAxKVxuICAgICAgICAgID8gcGFyZW50UG9zID09PSAkYW5jaG9yLnBvc1xuICAgICAgICAgIDogU2VsZWN0aW9uLmF0U3RhcnQoZG9jKS5mcm9tID09PSBwb3NcblxuICAgICAgICBpZiAoIWVtcHR5IHx8ICFpc0F0U3RhcnQgfHwgIXBhcmVudC50eXBlLmlzVGV4dGJsb2NrIHx8IHBhcmVudC50ZXh0Q29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy5jbGVhck5vZGVzKClcbiAgICAgIH0pLFxuXG4gICAgICAoKSA9PiBjb21tYW5kcy5kZWxldGVTZWxlY3Rpb24oKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmpvaW5CYWNrd2FyZCgpLFxuICAgICAgKCkgPT4gY29tbWFuZHMuc2VsZWN0Tm9kZUJhY2t3YXJkKCksXG4gICAgXSlcblxuICAgIGNvbnN0IGhhbmRsZURlbGV0ZSA9ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmZpcnN0KCh7IGNvbW1hbmRzIH0pID0+IFtcbiAgICAgICgpID0+IGNvbW1hbmRzLmRlbGV0ZVNlbGVjdGlvbigpLFxuICAgICAgKCkgPT4gY29tbWFuZHMuZGVsZXRlQ3VycmVudE5vZGUoKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmpvaW5Gb3J3YXJkKCksXG4gICAgICAoKSA9PiBjb21tYW5kcy5zZWxlY3ROb2RlRm9yd2FyZCgpLFxuICAgIF0pXG5cbiAgICBjb25zdCBoYW5kbGVFbnRlciA9ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmZpcnN0KCh7IGNvbW1hbmRzIH0pID0+IFtcbiAgICAgICgpID0+IGNvbW1hbmRzLm5ld2xpbmVJbkNvZGUoKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmNyZWF0ZVBhcmFncmFwaE5lYXIoKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmxpZnRFbXB0eUJsb2NrKCksXG4gICAgICAoKSA9PiBjb21tYW5kcy5zcGxpdEJsb2NrKCksXG4gICAgXSlcblxuICAgIGNvbnN0IGJhc2VLZXltYXAgPSB7XG4gICAgICBFbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgICAnTW9kLUVudGVyJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuZXhpdENvZGUoKSxcbiAgICAgIEJhY2tzcGFjZTogaGFuZGxlQmFja3NwYWNlLFxuICAgICAgJ01vZC1CYWNrc3BhY2UnOiBoYW5kbGVCYWNrc3BhY2UsXG4gICAgICAnU2hpZnQtQmFja3NwYWNlJzogaGFuZGxlQmFja3NwYWNlLFxuICAgICAgRGVsZXRlOiBoYW5kbGVEZWxldGUsXG4gICAgICAnTW9kLURlbGV0ZSc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdNb2QtYSc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNlbGVjdEFsbCgpLFxuICAgIH1cblxuICAgIGNvbnN0IHBjS2V5bWFwID0ge1xuICAgICAgLi4uYmFzZUtleW1hcCxcbiAgICB9XG5cbiAgICBjb25zdCBtYWNLZXltYXAgPSB7XG4gICAgICAuLi5iYXNlS2V5bWFwLFxuICAgICAgJ0N0cmwtaCc6IGhhbmRsZUJhY2tzcGFjZSxcbiAgICAgICdBbHQtQmFja3NwYWNlJzogaGFuZGxlQmFja3NwYWNlLFxuICAgICAgJ0N0cmwtZCc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdDdHJsLUFsdC1CYWNrc3BhY2UnOiBoYW5kbGVEZWxldGUsXG4gICAgICAnQWx0LURlbGV0ZSc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdBbHQtZCc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdDdHJsLWEnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zZWxlY3RUZXh0YmxvY2tTdGFydCgpLFxuICAgICAgJ0N0cmwtZSc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNlbGVjdFRleHRibG9ja0VuZCgpLFxuICAgIH1cblxuICAgIGlmIChpc2lPUygpIHx8IGlzTWFjT1MoKSkge1xuICAgICAgcmV0dXJuIG1hY0tleW1hcFxuICAgIH1cblxuICAgIHJldHVybiBwY0tleW1hcFxuICB9LFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiB3ZSBjaGVjayBpZiB0aGUgd2hvbGUgZG9jdW1lbnQgd2FzIHNlbGVjdGVkIGFuZCBkZWxldGVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHdpbGwgYWRkaXRpb25hbGx5IGNhbGwgYGNsZWFyTm9kZXMoKWAgdG8gY29udmVydCBlLmcuIGEgaGVhZGluZ1xuICAgICAgLy8gdG8gYSBwYXJhZ3JhcGggaWYgbmVjZXNzYXJ5LlxuICAgICAgLy8gVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byBQcm9zZU1pcnJvcidzIGBBbGxTZWxlY3Rpb25gLCB3aGljaCBkb2VzbuKAmXQgd29yayB3ZWxsXG4gICAgICAvLyB3aXRoIG1hbnkgb3RoZXIgY29tbWFuZHMuXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdjbGVhckRvY3VtZW50JyksXG4gICAgICAgIGFwcGVuZFRyYW5zYWN0aW9uOiAodHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkb2NDaGFuZ2VzID0gdHJhbnNhY3Rpb25zLnNvbWUodHJhbnNhY3Rpb24gPT4gdHJhbnNhY3Rpb24uZG9jQ2hhbmdlZClcbiAgICAgICAgICAgICYmICFvbGRTdGF0ZS5kb2MuZXEobmV3U3RhdGUuZG9jKVxuXG4gICAgICAgICAgaWYgKCFkb2NDaGFuZ2VzKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGVtcHR5LCBmcm9tLCB0byB9ID0gb2xkU3RhdGUuc2VsZWN0aW9uXG4gICAgICAgICAgY29uc3QgYWxsRnJvbSA9IFNlbGVjdGlvbi5hdFN0YXJ0KG9sZFN0YXRlLmRvYykuZnJvbVxuICAgICAgICAgIGNvbnN0IGFsbEVuZCA9IFNlbGVjdGlvbi5hdEVuZChvbGRTdGF0ZS5kb2MpLnRvXG4gICAgICAgICAgY29uc3QgYWxsV2FzU2VsZWN0ZWQgPSBmcm9tID09PSBhbGxGcm9tICYmIHRvID09PSBhbGxFbmRcblxuICAgICAgICAgIGlmIChlbXB0eSB8fCAhYWxsV2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBuZXdTdGF0ZS5kb2MudGV4dEJldHdlZW4oMCwgbmV3U3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSwgJyAnLCAnICcpLmxlbmd0aCA9PT0gMFxuXG4gICAgICAgICAgaWYgKCFpc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ciA9IG5ld1N0YXRlLnRyXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVDaGFpbmFibGVTdGF0ZSh7XG4gICAgICAgICAgICBzdGF0ZTogbmV3U3RhdGUsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogdHIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCB7IGNvbW1hbmRzIH0gPSBuZXcgQ29tbWFuZE1hbmFnZXIoe1xuICAgICAgICAgICAgZWRpdG9yOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb21tYW5kcy5jbGVhck5vZGVzKClcblxuICAgICAgICAgIGlmICghdHIuc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9FeHRlbnNpb24uanMnXG5cbmV4cG9ydCBjb25zdCBUYWJpbmRleCA9IEV4dGVuc2lvbi5jcmVhdGUoe1xuICBuYW1lOiAndGFiaW5kZXgnLFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFBsdWdpbih7XG4gICAgICAgIGtleTogbmV3IFBsdWdpbktleSgndGFiaW5kZXgnKSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0aGlzLmVkaXRvci5pc0VkaXRhYmxlID8geyB0YWJpbmRleDogJzAnIH0gOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IHN0eWxlID0gYC5Qcm9zZU1pcnJvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLlByb3NlTWlycm9yIHtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gIHdoaXRlLXNwYWNlOiBicmVhay1zcGFjZXM7XG4gIC13ZWJraXQtZm9udC12YXJpYW50LWxpZ2F0dXJlczogbm9uZTtcbiAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogbm9uZTtcbiAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiBcImxpZ2FcIiAwOyAvKiB0aGUgYWJvdmUgZG9lc24ndCBzZWVtIHRvIHdvcmsgaW4gRWRnZSAqL1xufVxuXG4uUHJvc2VNaXJyb3IgW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdIHtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbn1cblxuLlByb3NlTWlycm9yIFtjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXSBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLlByb3NlTWlycm9yIHByZSB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuaW1nLlByb3NlTWlycm9yLXNlcGFyYXRvciB7XG4gIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gIHdpZHRoOiAxcHggIWltcG9ydGFudDtcbiAgaGVpZ2h0OiAxcHggIWltcG9ydGFudDtcbn1cblxuLlByb3NlTWlycm9yLWdhcGN1cnNvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbjogMDtcbn1cblxuLlByb3NlTWlycm9yLWdhcGN1cnNvcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTJweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjaztcbiAgYW5pbWF0aW9uOiBQcm9zZU1pcnJvci1jdXJzb3ItYmxpbmsgMS4xcyBzdGVwcygyLCBzdGFydCkgaW5maW5pdGU7XG59XG5cbkBrZXlmcmFtZXMgUHJvc2VNaXJyb3ItY3Vyc29yLWJsaW5rIHtcbiAgdG8ge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxufVxuXG4uUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvbiAqOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cblxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKjo6LW1vei1zZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cblxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKiB7XG4gIGNhcmV0LWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLlByb3NlTWlycm9yLWZvY3VzZWQgLlByb3NlTWlycm9yLWdhcGN1cnNvciB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4udGlwcHktYm94W2RhdGEtYW5pbWF0aW9uPWZhZGVdW2RhdGEtc3RhdGU9aGlkZGVuXSB7XG4gIG9wYWNpdHk6IDBcbn1gXG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlVGFnKHN0eWxlOiBzdHJpbmcsIG5vbmNlPzogc3RyaW5nLCBzdWZmaXg/OiBzdHJpbmcpOiBIVE1MU3R5bGVFbGVtZW50IHtcbiAgY29uc3QgdGlwdGFwU3R5bGVUYWcgPSAoPEhUTUxTdHlsZUVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc3R5bGVbZGF0YS10aXB0YXAtc3R5bGUke3N1ZmZpeCA/IGAtJHtzdWZmaXh9YCA6ICcnfV1gKSlcblxuICBpZiAodGlwdGFwU3R5bGVUYWcgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGlwdGFwU3R5bGVUYWdcbiAgfVxuXG4gIGNvbnN0IHN0eWxlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcblxuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKVxuICB9XG5cbiAgc3R5bGVOb2RlLnNldEF0dHJpYnV0ZShgZGF0YS10aXB0YXAtc3R5bGUke3N1ZmZpeCA/IGAtJHtzdWZmaXh9YCA6ICcnfWAsICcnKVxuICBzdHlsZU5vZGUuaW5uZXJIVE1MID0gc3R5bGVcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZU5vZGUpXG5cbiAgcmV0dXJuIHN0eWxlTm9kZVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSwgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7XG4gIEVkaXRvclN0YXRlLCBQbHVnaW4sIFBsdWdpbktleSwgVHJhbnNhY3Rpb24sXG59IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAnQHRpcHRhcC9wbS92aWV3J1xuXG5pbXBvcnQgeyBDb21tYW5kTWFuYWdlciB9IGZyb20gJy4vQ29tbWFuZE1hbmFnZXIuanMnXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlci5qcydcbmltcG9ydCB7IEV4dGVuc2lvbk1hbmFnZXIgfSBmcm9tICcuL0V4dGVuc2lvbk1hbmFnZXIuanMnXG5pbXBvcnQgKiBhcyBleHRlbnNpb25zIGZyb20gJy4vZXh0ZW5zaW9ucy9pbmRleC5qcydcbmltcG9ydCB7IGNyZWF0ZURvY3VtZW50IH0gZnJvbSAnLi9oZWxwZXJzL2NyZWF0ZURvY3VtZW50LmpzJ1xuaW1wb3J0IHsgZ2V0QXR0cmlidXRlcyB9IGZyb20gJy4vaGVscGVycy9nZXRBdHRyaWJ1dGVzLmpzJ1xuaW1wb3J0IHsgZ2V0SFRNTEZyb21GcmFnbWVudCB9IGZyb20gJy4vaGVscGVycy9nZXRIVE1MRnJvbUZyYWdtZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4vaGVscGVycy9nZXRUZXh0LmpzJ1xuaW1wb3J0IHsgZ2V0VGV4dFNlcmlhbGl6ZXJzRnJvbVNjaGVtYSB9IGZyb20gJy4vaGVscGVycy9nZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hLmpzJ1xuaW1wb3J0IHsgaXNBY3RpdmUgfSBmcm9tICcuL2hlbHBlcnMvaXNBY3RpdmUuanMnXG5pbXBvcnQgeyBpc05vZGVFbXB0eSB9IGZyb20gJy4vaGVscGVycy9pc05vZGVFbXB0eS5qcydcbmltcG9ydCB7IHJlc29sdmVGb2N1c1Bvc2l0aW9uIH0gZnJvbSAnLi9oZWxwZXJzL3Jlc29sdmVGb2N1c1Bvc2l0aW9uLmpzJ1xuaW1wb3J0IHsgc3R5bGUgfSBmcm9tICcuL3N0eWxlLmpzJ1xuaW1wb3J0IHtcbiAgQ2FuQ29tbWFuZHMsXG4gIENoYWluZWRDb21tYW5kcyxcbiAgRWRpdG9yRXZlbnRzLFxuICBFZGl0b3JPcHRpb25zLFxuICBKU09OQ29udGVudCxcbiAgU2luZ2xlQ29tbWFuZHMsXG4gIFRleHRTZXJpYWxpemVyLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY3JlYXRlU3R5bGVUYWcgfSBmcm9tICcuL3V0aWxpdGllcy9jcmVhdGVTdHlsZVRhZy5qcydcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL3V0aWxpdGllcy9pc0Z1bmN0aW9uLmpzJ1xuXG5leHBvcnQgeyBleHRlbnNpb25zIH1cblxuZXhwb3J0IGludGVyZmFjZSBIVE1MRWxlbWVudCB7XG4gIGVkaXRvcj86IEVkaXRvclxufVxuXG5leHBvcnQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEVkaXRvckV2ZW50cz4ge1xuICBwcml2YXRlIGNvbW1hbmRNYW5hZ2VyITogQ29tbWFuZE1hbmFnZXJcblxuICBwdWJsaWMgZXh0ZW5zaW9uTWFuYWdlciE6IEV4dGVuc2lvbk1hbmFnZXJcblxuICBwcml2YXRlIGNzcyE6IEhUTUxTdHlsZUVsZW1lbnRcblxuICBwdWJsaWMgc2NoZW1hITogU2NoZW1hXG5cbiAgcHVibGljIHZpZXchOiBFZGl0b3JWaWV3XG5cbiAgcHVibGljIGlzRm9jdXNlZCA9IGZhbHNlXG5cbiAgcHVibGljIGV4dGVuc2lvblN0b3JhZ2U6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gIHB1YmxpYyBvcHRpb25zOiBFZGl0b3JPcHRpb25zID0ge1xuICAgIGVsZW1lbnQ6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIGNvbnRlbnQ6ICcnLFxuICAgIGluamVjdENTUzogdHJ1ZSxcbiAgICBpbmplY3ROb25jZTogdW5kZWZpbmVkLFxuICAgIGV4dGVuc2lvbnM6IFtdLFxuICAgIGF1dG9mb2N1czogZmFsc2UsXG4gICAgZWRpdGFibGU6IHRydWUsXG4gICAgZWRpdG9yUHJvcHM6IHt9LFxuICAgIHBhcnNlT3B0aW9uczoge30sXG4gICAgZW5hYmxlSW5wdXRSdWxlczogdHJ1ZSxcbiAgICBlbmFibGVQYXN0ZVJ1bGVzOiB0cnVlLFxuICAgIGVuYWJsZUNvcmVFeHRlbnNpb25zOiB0cnVlLFxuICAgIG9uQmVmb3JlQ3JlYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uQ3JlYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uVXBkYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uVHJhbnNhY3Rpb246ICgpID0+IG51bGwsXG4gICAgb25Gb2N1czogKCkgPT4gbnVsbCxcbiAgICBvbkJsdXI6ICgpID0+IG51bGwsXG4gICAgb25EZXN0cm95OiAoKSA9PiBudWxsLFxuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFydGlhbDxFZGl0b3JPcHRpb25zPiA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKVxuICAgIHRoaXMuY3JlYXRlRXh0ZW5zaW9uTWFuYWdlcigpXG4gICAgdGhpcy5jcmVhdGVDb21tYW5kTWFuYWdlcigpXG4gICAgdGhpcy5jcmVhdGVTY2hlbWEoKVxuICAgIHRoaXMub24oJ2JlZm9yZUNyZWF0ZScsIHRoaXMub3B0aW9ucy5vbkJlZm9yZUNyZWF0ZSlcbiAgICB0aGlzLmVtaXQoJ2JlZm9yZUNyZWF0ZScsIHsgZWRpdG9yOiB0aGlzIH0pXG4gICAgdGhpcy5jcmVhdGVWaWV3KClcbiAgICB0aGlzLmluamVjdENTUygpXG4gICAgdGhpcy5vbignY3JlYXRlJywgdGhpcy5vcHRpb25zLm9uQ3JlYXRlKVxuICAgIHRoaXMub24oJ3VwZGF0ZScsIHRoaXMub3B0aW9ucy5vblVwZGF0ZSlcbiAgICB0aGlzLm9uKCdzZWxlY3Rpb25VcGRhdGUnLCB0aGlzLm9wdGlvbnMub25TZWxlY3Rpb25VcGRhdGUpXG4gICAgdGhpcy5vbigndHJhbnNhY3Rpb24nLCB0aGlzLm9wdGlvbnMub25UcmFuc2FjdGlvbilcbiAgICB0aGlzLm9uKCdmb2N1cycsIHRoaXMub3B0aW9ucy5vbkZvY3VzKVxuICAgIHRoaXMub24oJ2JsdXInLCB0aGlzLm9wdGlvbnMub25CbHVyKVxuICAgIHRoaXMub24oJ2Rlc3Ryb3knLCB0aGlzLm9wdGlvbnMub25EZXN0cm95KVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29tbWFuZHMuZm9jdXModGhpcy5vcHRpb25zLmF1dG9mb2N1cylcbiAgICAgIHRoaXMuZW1pdCgnY3JlYXRlJywgeyBlZGl0b3I6IHRoaXMgfSlcbiAgICB9LCAwKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVkaXRvciBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBzdG9yYWdlKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvblN0b3JhZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY29tbWFuZHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1hbmRzKCk6IFNpbmdsZUNvbW1hbmRzIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kTWFuYWdlci5jb21tYW5kc1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvbW1hbmQgY2hhaW4gdG8gY2FsbCBtdWx0aXBsZSBjb21tYW5kcyBhdCBvbmNlLlxuICAgKi9cbiAgcHVibGljIGNoYWluKCk6IENoYWluZWRDb21tYW5kcyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZE1hbmFnZXIuY2hhaW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgY29tbWFuZCBvciBhIGNvbW1hbmQgY2hhaW4gY2FuIGJlIGV4ZWN1dGVkLiBXaXRob3V0IGV4ZWN1dGluZyBpdC5cbiAgICovXG4gIHB1YmxpYyBjYW4oKTogQ2FuQ29tbWFuZHMge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmRNYW5hZ2VyLmNhbigpXG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IENTUyBzdHlsZXMuXG4gICAqL1xuICBwcml2YXRlIGluamVjdENTUygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmluamVjdENTUyAmJiBkb2N1bWVudCkge1xuICAgICAgdGhpcy5jc3MgPSBjcmVhdGVTdHlsZVRhZyhzdHlsZSwgdGhpcy5vcHRpb25zLmluamVjdE5vbmNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZWRpdG9yIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIEEgbGlzdCBvZiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBQYXJ0aWFsPEVkaXRvck9wdGlvbnM+ID0ge30pOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cblxuICAgIGlmICghdGhpcy52aWV3IHx8ICF0aGlzLnN0YXRlIHx8IHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdG9yUHJvcHMpIHtcbiAgICAgIHRoaXMudmlldy5zZXRQcm9wcyh0aGlzLm9wdGlvbnMuZWRpdG9yUHJvcHMpXG4gICAgfVxuXG4gICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKHRoaXMuc3RhdGUpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGVkaXRhYmxlIHN0YXRlIG9mIHRoZSBlZGl0b3IuXG4gICAqL1xuICBwdWJsaWMgc2V0RWRpdGFibGUoZWRpdGFibGU6IGJvb2xlYW4sIGVtaXRVcGRhdGUgPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5zZXRPcHRpb25zKHsgZWRpdGFibGUgfSlcblxuICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICB0aGlzLmVtaXQoJ3VwZGF0ZScsIHsgZWRpdG9yOiB0aGlzLCB0cmFuc2FjdGlvbjogdGhpcy5zdGF0ZS50ciB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVkaXRvciBpcyBlZGl0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAvLyBzaW5jZSBwbHVnaW5zIGFyZSBhcHBsaWVkIGFmdGVyIGNyZWF0aW5nIHRoZSB2aWV3XG4gICAgLy8gYGVkaXRhYmxlYCBpcyBhbHdheXMgYHRydWVgIGZvciBvbmUgdGljay5cbiAgICAvLyB0aGF04oCZcyB3aHkgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIGZvciBgb3B0aW9ucy5lZGl0YWJsZWBcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVkaXRhYmxlICYmIHRoaXMudmlldyAmJiB0aGlzLnZpZXcuZWRpdGFibGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlZGl0b3Igc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IEVkaXRvclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy52aWV3LnN0YXRlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBQcm9zZU1pcnJvciBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gQSBQcm9zZU1pcnJvciBwbHVnaW5cbiAgICogQHBhcmFtIGhhbmRsZVBsdWdpbnMgQ29udHJvbCBob3cgdG8gbWVyZ2UgdGhlIHBsdWdpbiBpbnRvIHRoZSBleGlzdGluZyBwbHVnaW5zLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyUGx1Z2luKFxuICAgIHBsdWdpbjogUGx1Z2luLFxuICAgIGhhbmRsZVBsdWdpbnM/OiAobmV3UGx1Z2luOiBQbHVnaW4sIHBsdWdpbnM6IFBsdWdpbltdKSA9PiBQbHVnaW5bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGx1Z2lucyA9IGlzRnVuY3Rpb24oaGFuZGxlUGx1Z2lucylcbiAgICAgID8gaGFuZGxlUGx1Z2lucyhwbHVnaW4sIFsuLi50aGlzLnN0YXRlLnBsdWdpbnNdKVxuICAgICAgOiBbLi4udGhpcy5zdGF0ZS5wbHVnaW5zLCBwbHVnaW5dXG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUucmVjb25maWd1cmUoeyBwbHVnaW5zIH0pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUoc3RhdGUpXG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhIFByb3NlTWlycm9yIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIG5hbWVPclBsdWdpbktleSBUaGUgcGx1Z2lucyBuYW1lXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclBsdWdpbihuYW1lT3JQbHVnaW5LZXk6IHN0cmluZyB8IFBsdWdpbktleSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JQbHVnaW5LZXkgPT09ICdzdHJpbmcnID8gYCR7bmFtZU9yUGx1Z2luS2V5fSRgIDogbmFtZU9yUGx1Z2luS2V5LmtleVxuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlLnJlY29uZmlndXJlKHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHBsdWdpbnM6IHRoaXMuc3RhdGUucGx1Z2lucy5maWx0ZXIocGx1Z2luID0+ICFwbHVnaW4ua2V5LnN0YXJ0c1dpdGgobmFtZSkpLFxuICAgIH0pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUoc3RhdGUpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBleHRlbnNpb24gbWFuYWdlci5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRXh0ZW5zaW9uTWFuYWdlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb3JlRXh0ZW5zaW9ucyA9IHRoaXMub3B0aW9ucy5lbmFibGVDb3JlRXh0ZW5zaW9ucyA/IE9iamVjdC52YWx1ZXMoZXh0ZW5zaW9ucykgOiBbXVxuICAgIGNvbnN0IGFsbEV4dGVuc2lvbnMgPSBbLi4uY29yZUV4dGVuc2lvbnMsIC4uLnRoaXMub3B0aW9ucy5leHRlbnNpb25zXS5maWx0ZXIoZXh0ZW5zaW9uID0+IHtcbiAgICAgIHJldHVybiBbJ2V4dGVuc2lvbicsICdub2RlJywgJ21hcmsnXS5pbmNsdWRlcyhleHRlbnNpb24/LnR5cGUpXG4gICAgfSlcblxuICAgIHRoaXMuZXh0ZW5zaW9uTWFuYWdlciA9IG5ldyBFeHRlbnNpb25NYW5hZ2VyKGFsbEV4dGVuc2lvbnMsIHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBjb21tYW5kIG1hbmFnZXIuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbW1hbmRNYW5hZ2VyKCk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZE1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIoe1xuICAgICAgZWRpdG9yOiB0aGlzLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFByb3NlTWlycm9yIHNjaGVtYS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2NoZW1hKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZW1hID0gdGhpcy5leHRlbnNpb25NYW5hZ2VyLnNjaGVtYVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBQcm9zZU1pcnJvciB2aWV3LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVWaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IGRvYyA9IGNyZWF0ZURvY3VtZW50KHRoaXMub3B0aW9ucy5jb250ZW50LCB0aGlzLnNjaGVtYSwgdGhpcy5vcHRpb25zLnBhcnNlT3B0aW9ucylcbiAgICBjb25zdCBzZWxlY3Rpb24gPSByZXNvbHZlRm9jdXNQb3NpdGlvbihkb2MsIHRoaXMub3B0aW9ucy5hdXRvZm9jdXMpXG5cbiAgICB0aGlzLnZpZXcgPSBuZXcgRWRpdG9yVmlldyh0aGlzLm9wdGlvbnMuZWxlbWVudCwge1xuICAgICAgLi4udGhpcy5vcHRpb25zLmVkaXRvclByb3BzLFxuICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbjogdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9uLmJpbmQodGhpcyksXG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgZG9jLFxuICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbiB8fCB1bmRlZmluZWQsXG4gICAgICB9KSxcbiAgICB9KVxuXG4gICAgLy8gYGVkaXRvci52aWV3YCBpcyBub3QgeWV0IGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUuXG4gICAgLy8gVGhlcmVmb3JlIHdlIHdpbGwgYWRkIGFsbCBwbHVnaW5zIGFuZCBub2RlIHZpZXdzIGRpcmVjdGx5IGFmdGVyd2FyZHMuXG4gICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnN0YXRlLnJlY29uZmlndXJlKHtcbiAgICAgIHBsdWdpbnM6IHRoaXMuZXh0ZW5zaW9uTWFuYWdlci5wbHVnaW5zLFxuICAgIH0pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUobmV3U3RhdGUpXG5cbiAgICB0aGlzLmNyZWF0ZU5vZGVWaWV3cygpXG4gICAgdGhpcy5wcmVwZW5kQ2xhc3MoKVxuXG4gICAgLy8gTGV04oCZcyBzdG9yZSB0aGUgZWRpdG9yIGluc3RhbmNlIGluIHRoZSBET00gZWxlbWVudC5cbiAgICAvLyBTbyB3ZeKAmWxsIGhhdmUgYWNjZXNzIHRvIGl0IGZvciB0ZXN0cy5cbiAgICBjb25zdCBkb20gPSB0aGlzLnZpZXcuZG9tIGFzIEhUTUxFbGVtZW50XG5cbiAgICBkb20uZWRpdG9yID0gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYWxsIG5vZGUgdmlld3MuXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTm9kZVZpZXdzKCk6IHZvaWQge1xuICAgIHRoaXMudmlldy5zZXRQcm9wcyh7XG4gICAgICBub2RlVmlld3M6IHRoaXMuZXh0ZW5zaW9uTWFuYWdlci5ub2RlVmlld3MsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kIGNsYXNzIG5hbWUgdG8gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBwcmVwZW5kQ2xhc3MoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LmRvbS5jbGFzc05hbWUgPSBgdGlwdGFwICR7dGhpcy52aWV3LmRvbS5jbGFzc05hbWV9YFxuICB9XG5cbiAgcHVibGljIGlzQ2FwdHVyaW5nVHJhbnNhY3Rpb24gPSBmYWxzZVxuXG4gIHByaXZhdGUgY2FwdHVyZWRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gfCBudWxsID0gbnVsbFxuXG4gIHB1YmxpYyBjYXB0dXJlVHJhbnNhY3Rpb24oZm46IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5pc0NhcHR1cmluZ1RyYW5zYWN0aW9uID0gdHJ1ZVxuICAgIGZuKClcbiAgICB0aGlzLmlzQ2FwdHVyaW5nVHJhbnNhY3Rpb24gPSBmYWxzZVxuXG4gICAgY29uc3QgdHIgPSB0aGlzLmNhcHR1cmVkVHJhbnNhY3Rpb25cblxuICAgIHRoaXMuY2FwdHVyZWRUcmFuc2FjdGlvbiA9IG51bGxcblxuICAgIHJldHVybiB0clxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBvdmVyIHdoaWNoIHRvIHNlbmQgdHJhbnNhY3Rpb25zIChzdGF0ZSB1cGRhdGVzKSBwcm9kdWNlZCBieSB0aGUgdmlldy5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIEFuIGVkaXRvciBzdGF0ZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIC8vIGlmIHRoZSBlZGl0b3IgLyB0aGUgdmlldyBvZiB0aGUgZWRpdG9yIHdhcyBkZXN0cm95ZWRcbiAgICAvLyB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIG5vdCBiZSBkaXNwYXRjaGVkIGFzIHRoZXJlIGlzIG5vIHZpZXcgYW55bW9yZS5cbiAgICBpZiAodGhpcy52aWV3LmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NhcHR1cmluZ1RyYW5zYWN0aW9uKSB7XG4gICAgICBpZiAoIXRoaXMuY2FwdHVyZWRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmNhcHR1cmVkVHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvblxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zdGVwcy5mb3JFYWNoKHN0ZXAgPT4gdGhpcy5jYXB0dXJlZFRyYW5zYWN0aW9uPy5zdGVwKHN0ZXApKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuYXBwbHkodHJhbnNhY3Rpb24pXG4gICAgY29uc3Qgc2VsZWN0aW9uSGFzQ2hhbmdlZCA9ICF0aGlzLnN0YXRlLnNlbGVjdGlvbi5lcShzdGF0ZS5zZWxlY3Rpb24pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUoc3RhdGUpXG4gICAgdGhpcy5lbWl0KCd0cmFuc2FjdGlvbicsIHtcbiAgICAgIGVkaXRvcjogdGhpcyxcbiAgICAgIHRyYW5zYWN0aW9uLFxuICAgIH0pXG5cbiAgICBpZiAoc2VsZWN0aW9uSGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5lbWl0KCdzZWxlY3Rpb25VcGRhdGUnLCB7XG4gICAgICAgIGVkaXRvcjogdGhpcyxcbiAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzID0gdHJhbnNhY3Rpb24uZ2V0TWV0YSgnZm9jdXMnKVxuICAgIGNvbnN0IGJsdXIgPSB0cmFuc2FjdGlvbi5nZXRNZXRhKCdibHVyJylcblxuICAgIGlmIChmb2N1cykge1xuICAgICAgdGhpcy5lbWl0KCdmb2N1cycsIHtcbiAgICAgICAgZWRpdG9yOiB0aGlzLFxuICAgICAgICBldmVudDogZm9jdXMuZXZlbnQsXG4gICAgICAgIHRyYW5zYWN0aW9uLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYmx1cikge1xuICAgICAgdGhpcy5lbWl0KCdibHVyJywge1xuICAgICAgICBlZGl0b3I6IHRoaXMsXG4gICAgICAgIGV2ZW50OiBibHVyLmV2ZW50LFxuICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKCF0cmFuc2FjdGlvbi5kb2NDaGFuZ2VkIHx8IHRyYW5zYWN0aW9uLmdldE1ldGEoJ3ByZXZlbnRVcGRhdGUnKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KCd1cGRhdGUnLCB7XG4gICAgICBlZGl0b3I6IHRoaXMsXG4gICAgICB0cmFuc2FjdGlvbixcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdHRyaWJ1dGVzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBvciBtYXJrLlxuICAgKi9cbiAgcHVibGljIGdldEF0dHJpYnV0ZXMobmFtZU9yVHlwZTogc3RyaW5nIHwgTm9kZVR5cGUgfCBNYXJrVHlwZSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKHRoaXMuc3RhdGUsIG5hbWVPclR5cGUpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5vZGUgb3IgbWFyayBpcyBhY3RpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5vZGUgb3IgbWFya1xuICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBdHRyaWJ1dGVzIG9mIHRoZSBub2RlIG9yIG1hcmtcbiAgICovXG4gIHB1YmxpYyBpc0FjdGl2ZShuYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZXM/OiB7fSk6IGJvb2xlYW5cbiAgcHVibGljIGlzQWN0aXZlKGF0dHJpYnV0ZXM6IHt9KTogYm9vbGVhblxuICBwdWJsaWMgaXNBY3RpdmUobmFtZU9yQXR0cmlidXRlczogc3RyaW5nLCBhdHRyaWJ1dGVzT3JVbmRlZmluZWQ/OiB7fSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgbmFtZU9yQXR0cmlidXRlcyA9PT0gJ3N0cmluZycgPyBuYW1lT3JBdHRyaWJ1dGVzIDogbnVsbFxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHR5cGVvZiBuYW1lT3JBdHRyaWJ1dGVzID09PSAnc3RyaW5nJyA/IGF0dHJpYnV0ZXNPclVuZGVmaW5lZCA6IG5hbWVPckF0dHJpYnV0ZXNcblxuICAgIHJldHVybiBpc0FjdGl2ZSh0aGlzLnN0YXRlLCBuYW1lLCBhdHRyaWJ1dGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZG9jdW1lbnQgYXMgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBnZXRKU09OKCk6IEpTT05Db250ZW50IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5kb2MudG9KU09OKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRvY3VtZW50IGFzIEhUTUwuXG4gICAqL1xuICBwdWJsaWMgZ2V0SFRNTCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRIVE1MRnJvbUZyYWdtZW50KHRoaXMuc3RhdGUuZG9jLmNvbnRlbnQsIHRoaXMuc2NoZW1hKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZG9jdW1lbnQgYXMgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXRUZXh0KG9wdGlvbnM/OiB7XG4gICAgYmxvY2tTZXBhcmF0b3I/OiBzdHJpbmdcbiAgICB0ZXh0U2VyaWFsaXplcnM/OiBSZWNvcmQ8c3RyaW5nLCBUZXh0U2VyaWFsaXplcj5cbiAgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBibG9ja1NlcGFyYXRvciA9ICdcXG5cXG4nLCB0ZXh0U2VyaWFsaXplcnMgPSB7fSB9ID0gb3B0aW9ucyB8fCB7fVxuXG4gICAgcmV0dXJuIGdldFRleHQodGhpcy5zdGF0ZS5kb2MsIHtcbiAgICAgIGJsb2NrU2VwYXJhdG9yLFxuICAgICAgdGV4dFNlcmlhbGl6ZXJzOiB7XG4gICAgICAgIC4uLmdldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEodGhpcy5zY2hlbWEpLFxuICAgICAgICAuLi50ZXh0U2VyaWFsaXplcnMsXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUgaXMgbm8gY29udGVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOb2RlRW1wdHkodGhpcy5zdGF0ZS5kb2MpXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2hhcmFjdGVyQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3RpcHRhcCB3YXJuXTogXCJlZGl0b3IuZ2V0Q2hhcmFjdGVyQ291bnQoKVwiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJlZGl0b3Iuc3RvcmFnZS5jaGFyYWN0ZXJDb3VudC5jaGFyYWN0ZXJzKClcIiBpbnN0ZWFkLicsXG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSAtIDJcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBlZGl0b3IuXG4gICAqL1xuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKVxuXG4gICAgaWYgKHRoaXMudmlldykge1xuICAgICAgdGhpcy52aWV3LmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgZGVzdHJveWVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICF0aGlzLnZpZXc/LmRvY1ZpZXdcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgZ2V0TWFya3NCZXR3ZWVuIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrc0JldHdlZW4uanMnXG5pbXBvcnQgeyBJbnB1dFJ1bGUsIElucHV0UnVsZUZpbmRlciB9IGZyb20gJy4uL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBpbnB1dCBydWxlIHRoYXQgYWRkcyBhIG1hcmsgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyB0eXBlZCBpbnRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya0lucHV0UnVsZShjb25maWc6IHtcbiAgZmluZDogSW5wdXRSdWxlRmluZGVyXG4gIHR5cGU6IE1hcmtUeXBlXG4gIGdldEF0dHJpYnV0ZXM/OlxuICAgIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICAgIHwgKChtYXRjaDogRXh0ZW5kZWRSZWdFeHBNYXRjaEFycmF5KSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgIHwgZmFsc2VcbiAgICB8IG51bGxcbn0pIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXI6ICh7IHN0YXRlLCByYW5nZSwgbWF0Y2ggfSkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGNhbGxPclJldHVybihjb25maWcuZ2V0QXR0cmlidXRlcywgdW5kZWZpbmVkLCBtYXRjaClcblxuICAgICAgaWYgKGF0dHJpYnV0ZXMgPT09IGZhbHNlIHx8IGF0dHJpYnV0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0ciB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IGNhcHR1cmVHcm91cCA9IG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdXG4gICAgICBjb25zdCBmdWxsTWF0Y2ggPSBtYXRjaFswXVxuXG4gICAgICBpZiAoY2FwdHVyZUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0U3BhY2VzID0gZnVsbE1hdGNoLnNlYXJjaCgvXFxTLylcbiAgICAgICAgY29uc3QgdGV4dFN0YXJ0ID0gcmFuZ2UuZnJvbSArIGZ1bGxNYXRjaC5pbmRleE9mKGNhcHR1cmVHcm91cClcbiAgICAgICAgY29uc3QgdGV4dEVuZCA9IHRleHRTdGFydCArIGNhcHR1cmVHcm91cC5sZW5ndGhcblxuICAgICAgICBjb25zdCBleGNsdWRlZE1hcmtzID0gZ2V0TWFya3NCZXR3ZWVuKHJhbmdlLmZyb20sIHJhbmdlLnRvLCBzdGF0ZS5kb2MpXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gaXRlbS5tYXJrLnR5cGUuZXhjbHVkZWQgYXMgTWFya1R5cGVbXVxuXG4gICAgICAgICAgICByZXR1cm4gZXhjbHVkZWQuZmluZCh0eXBlID0+IHR5cGUgPT09IGNvbmZpZy50eXBlICYmIHR5cGUgIT09IGl0ZW0ubWFyay50eXBlKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udG8gPiB0ZXh0U3RhcnQpXG5cbiAgICAgICAgaWYgKGV4Y2x1ZGVkTWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXh0RW5kIDwgcmFuZ2UudG8pIHtcbiAgICAgICAgICB0ci5kZWxldGUodGV4dEVuZCwgcmFuZ2UudG8pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dFN0YXJ0ID4gcmFuZ2UuZnJvbSkge1xuICAgICAgICAgIHRyLmRlbGV0ZShyYW5nZS5mcm9tICsgc3RhcnRTcGFjZXMsIHRleHRTdGFydClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcmtFbmQgPSByYW5nZS5mcm9tICsgc3RhcnRTcGFjZXMgKyBjYXB0dXJlR3JvdXAubGVuZ3RoXG5cbiAgICAgICAgdHIuYWRkTWFyayhyYW5nZS5mcm9tICsgc3RhcnRTcGFjZXMsIG1hcmtFbmQsIGNvbmZpZy50eXBlLmNyZWF0ZShhdHRyaWJ1dGVzIHx8IHt9KSlcblxuICAgICAgICB0ci5yZW1vdmVTdG9yZWRNYXJrKGNvbmZpZy50eXBlKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBJbnB1dFJ1bGUsIElucHV0UnVsZUZpbmRlciB9IGZyb20gJy4uL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBpbnB1dCBydWxlIHRoYXQgYWRkcyBhIG5vZGUgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyB0eXBlZCBpbnRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9kZUlucHV0UnVsZShjb25maWc6IHtcbiAgLyoqXG4gICAqIFRoZSByZWdleCB0byBtYXRjaC5cbiAgICovXG4gIGZpbmQ6IElucHV0UnVsZUZpbmRlclxuXG4gIC8qKlxuICAgKiBUaGUgbm9kZSB0eXBlIHRvIGFkZC5cbiAgICovXG4gIHR5cGU6IE5vZGVUeXBlXG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgbm9kZVxuICAgKiBjYW4gYWxzbyBiZSBhbiBvYmplY3Qgb2YgYXR0cmlidXRlc1xuICAgKi9cbiAgZ2V0QXR0cmlidXRlcz86XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfCAoKG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkpID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgfCBmYWxzZVxuICAgIHwgbnVsbFxufSkge1xuICByZXR1cm4gbmV3IElucHV0UnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY2FsbE9yUmV0dXJuKGNvbmZpZy5nZXRBdHRyaWJ1dGVzLCB1bmRlZmluZWQsIG1hdGNoKSB8fCB7fVxuICAgICAgY29uc3QgeyB0ciB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcmFuZ2UuZnJvbVxuICAgICAgbGV0IGVuZCA9IHJhbmdlLnRvXG5cbiAgICAgIGNvbnN0IG5ld05vZGUgPSBjb25maWcudHlwZS5jcmVhdGUoYXR0cmlidXRlcylcblxuICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IG1hdGNoWzBdLmxhc3RJbmRleE9mKG1hdGNoWzFdKVxuICAgICAgICBsZXQgbWF0Y2hTdGFydCA9IHN0YXJ0ICsgb2Zmc2V0XG5cbiAgICAgICAgaWYgKG1hdGNoU3RhcnQgPiBlbmQpIHtcbiAgICAgICAgICBtYXRjaFN0YXJ0ID0gZW5kXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gbWF0Y2hTdGFydCArIG1hdGNoWzFdLmxlbmd0aFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5zZXJ0IGxhc3QgdHlwZWQgY2hhcmFjdGVyXG4gICAgICAgIGNvbnN0IGxhc3RDaGFyID0gbWF0Y2hbMF1bbWF0Y2hbMF0ubGVuZ3RoIC0gMV1cblxuICAgICAgICB0ci5pbnNlcnRUZXh0KGxhc3RDaGFyLCBzdGFydCArIG1hdGNoWzBdLmxlbmd0aCAtIDEpXG5cbiAgICAgICAgLy8gaW5zZXJ0IG5vZGUgZnJvbSBpbnB1dCBydWxlXG4gICAgICAgIHRyLnJlcGxhY2VXaXRoKG1hdGNoU3RhcnQsIGVuZCwgbmV3Tm9kZSlcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hbMF0pIHtcbiAgICAgICAgdHIuaW5zZXJ0KHN0YXJ0IC0gMSwgY29uZmlnLnR5cGUuY3JlYXRlKGF0dHJpYnV0ZXMpKS5kZWxldGUoXG4gICAgICAgICAgdHIubWFwcGluZy5tYXAoc3RhcnQpLFxuICAgICAgICAgIHRyLm1hcHBpbmcubWFwKGVuZCksXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdHIuc2Nyb2xsSW50b1ZpZXcoKVxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBJbnB1dFJ1bGUsIElucHV0UnVsZUZpbmRlciB9IGZyb20gJy4uL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBpbnB1dCBydWxlIHRoYXQgY2hhbmdlcyB0aGUgdHlwZSBvZiBhIHRleHRibG9jayB3aGVuIHRoZVxuICogbWF0Y2hlZCB0ZXh0IGlzIHR5cGVkIGludG8gaXQuIFdoZW4gdXNpbmcgYSByZWd1bGFyIGV4cHJlc2lvbiB5b3XigJlsbFxuICogcHJvYmFibHkgd2FudCB0aGUgcmVnZXhwIHRvIHN0YXJ0IHdpdGggYF5gLCBzbyB0aGF0IHRoZSBwYXR0ZXJuIGNhblxuICogb25seSBvY2N1ciBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKGNvbmZpZzoge1xuICBmaW5kOiBJbnB1dFJ1bGVGaW5kZXJcbiAgdHlwZTogTm9kZVR5cGVcbiAgZ2V0QXR0cmlidXRlcz86XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfCAoKG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkpID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgfCBmYWxzZVxuICAgIHwgbnVsbFxufSkge1xuICByZXR1cm4gbmV3IElucHV0UnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBjb25zdCAkc3RhcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShyYW5nZS5mcm9tKVxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGNhbGxPclJldHVybihjb25maWcuZ2V0QXR0cmlidXRlcywgdW5kZWZpbmVkLCBtYXRjaCkgfHwge31cblxuICAgICAgaWYgKCEkc3RhcnQubm9kZSgtMSkuY2FuUmVwbGFjZVdpdGgoJHN0YXJ0LmluZGV4KC0xKSwgJHN0YXJ0LmluZGV4QWZ0ZXIoLTEpLCBjb25maWcudHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgc3RhdGUudHJcbiAgICAgICAgLmRlbGV0ZShyYW5nZS5mcm9tLCByYW5nZS50bylcbiAgICAgICAgLnNldEJsb2NrVHlwZShyYW5nZS5mcm9tLCByYW5nZS5mcm9tLCBjb25maWcudHlwZSwgYXR0cmlidXRlcylcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IElucHV0UnVsZSwgSW5wdXRSdWxlRmluZGVyIH0gZnJvbSAnLi4vSW5wdXRSdWxlLmpzJ1xuXG4vKipcbiAqIEJ1aWxkIGFuIGlucHV0IHJ1bGUgdGhhdCByZXBsYWNlcyB0ZXh0IHdoZW4gdGhlXG4gKiBtYXRjaGVkIHRleHQgaXMgdHlwZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRleHRJbnB1dFJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IElucHV0UnVsZUZpbmRlcixcbiAgcmVwbGFjZTogc3RyaW5nLFxufSkge1xuICByZXR1cm4gbmV3IElucHV0UnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBsZXQgaW5zZXJ0ID0gY29uZmlnLnJlcGxhY2VcbiAgICAgIGxldCBzdGFydCA9IHJhbmdlLmZyb21cbiAgICAgIGNvbnN0IGVuZCA9IHJhbmdlLnRvXG5cbiAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtYXRjaFswXS5sYXN0SW5kZXhPZihtYXRjaFsxXSlcblxuICAgICAgICBpbnNlcnQgKz0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0ICsgbWF0Y2hbMV0ubGVuZ3RoKVxuICAgICAgICBzdGFydCArPSBvZmZzZXRcblxuICAgICAgICBjb25zdCBjdXRPZmYgPSBzdGFydCAtIGVuZFxuXG4gICAgICAgIGlmIChjdXRPZmYgPiAwKSB7XG4gICAgICAgICAgaW5zZXJ0ID0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0IC0gY3V0T2ZmLCBvZmZzZXQpICsgaW5zZXJ0XG4gICAgICAgICAgc3RhcnQgPSBlbmRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0ZS50ci5pbnNlcnRUZXh0KGluc2VydCwgc3RhcnQsIGVuZClcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBjYW5Kb2luLCBmaW5kV3JhcHBpbmcgfSBmcm9tICdAdGlwdGFwL3BtL3RyYW5zZm9ybSdcblxuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnLi4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgSW5wdXRSdWxlLCBJbnB1dFJ1bGVGaW5kZXIgfSBmcm9tICcuLi9JbnB1dFJ1bGUuanMnXG5pbXBvcnQgeyBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4uL3V0aWxpdGllcy9jYWxsT3JSZXR1cm4uanMnXG5cbi8qKlxuICogQnVpbGQgYW4gaW5wdXQgcnVsZSBmb3IgYXV0b21hdGljYWxseSB3cmFwcGluZyBhIHRleHRibG9jayB3aGVuIGFcbiAqIGdpdmVuIHN0cmluZyBpcyB0eXBlZC4gV2hlbiB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzaW9uIHlvdeKAmWxsXG4gKiBwcm9iYWJseSB3YW50IHRoZSByZWdleHAgdG8gc3RhcnQgd2l0aCBgXmAsIHNvIHRoYXQgdGhlIHBhdHRlcm4gY2FuXG4gKiBvbmx5IG9jY3VyIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jay5cbiAqXG4gKiBgdHlwZWAgaXMgdGhlIHR5cGUgb2Ygbm9kZSB0byB3cmFwIGluLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGlmIHRoZXJl4oCZcyBhIG5vZGUgd2l0aCB0aGUgc2FtZSB0eXBlIGFib3ZlIHRoZSBuZXdseVxuICogd3JhcHBlZCBub2RlLCB0aGUgcnVsZSB3aWxsIHRyeSB0byBqb2luIHRob3NlXG4gKiB0d28gbm9kZXMuIFlvdSBjYW4gcGFzcyBhIGpvaW4gcHJlZGljYXRlLCB3aGljaCB0YWtlcyBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24gbWF0Y2ggYW5kIHRoZSBub2RlIGJlZm9yZSB0aGUgd3JhcHBlZCBub2RlLCBhbmQgY2FuXG4gKiByZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgYSBqb2luIHNob3VsZCBoYXBwZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwcGluZ0lucHV0UnVsZShjb25maWc6IHtcbiAgZmluZDogSW5wdXRSdWxlRmluZGVyLFxuICB0eXBlOiBOb2RlVHlwZSxcbiAga2VlcE1hcmtzPzogYm9vbGVhbixcbiAga2VlcEF0dHJpYnV0ZXM/OiBib29sZWFuLFxuICBlZGl0b3I/OiBFZGl0b3JcbiAgZ2V0QXR0cmlidXRlcz86XG4gIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICB8ICgobWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSkgPT4gUmVjb3JkPHN0cmluZywgYW55PilcbiAgfCBmYWxzZVxuICB8IG51bGxcbiAgLFxuICBqb2luUHJlZGljYXRlPzogKG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXksIG5vZGU6IFByb3NlTWlycm9yTm9kZSkgPT4gYm9vbGVhbixcbn0pIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXI6ICh7XG4gICAgICBzdGF0ZSwgcmFuZ2UsIG1hdGNoLCBjaGFpbixcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY2FsbE9yUmV0dXJuKGNvbmZpZy5nZXRBdHRyaWJ1dGVzLCB1bmRlZmluZWQsIG1hdGNoKSB8fCB7fVxuICAgICAgY29uc3QgdHIgPSBzdGF0ZS50ci5kZWxldGUocmFuZ2UuZnJvbSwgcmFuZ2UudG8pXG4gICAgICBjb25zdCAkc3RhcnQgPSB0ci5kb2MucmVzb2x2ZShyYW5nZS5mcm9tKVxuICAgICAgY29uc3QgYmxvY2tSYW5nZSA9ICRzdGFydC5ibG9ja1JhbmdlKClcbiAgICAgIGNvbnN0IHdyYXBwaW5nID0gYmxvY2tSYW5nZSAmJiBmaW5kV3JhcHBpbmcoYmxvY2tSYW5nZSwgY29uZmlnLnR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgICAgIGlmICghd3JhcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgdHIud3JhcChibG9ja1JhbmdlLCB3cmFwcGluZylcblxuICAgICAgaWYgKGNvbmZpZy5rZWVwTWFya3MgJiYgY29uZmlnLmVkaXRvcikge1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgc3RvcmVkTWFya3MgfSA9IHN0YXRlXG4gICAgICAgIGNvbnN0IHsgc3BsaXR0YWJsZU1hcmtzIH0gPSBjb25maWcuZWRpdG9yLmV4dGVuc2lvbk1hbmFnZXJcbiAgICAgICAgY29uc3QgbWFya3MgPSBzdG9yZWRNYXJrcyB8fCAoc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpXG5cbiAgICAgICAgaWYgKG1hcmtzKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzLmZpbHRlcihtYXJrID0+IHNwbGl0dGFibGVNYXJrcy5pbmNsdWRlcyhtYXJrLnR5cGUubmFtZSkpXG5cbiAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhmaWx0ZXJlZE1hcmtzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICAgIC8qKiBJZiB0aGUgbm9kZVR5cGUgaXMgYGJ1bGxldExpc3RgIG9yIGBvcmRlcmVkTGlzdGAgc2V0IHRoZSBgbm9kZVR5cGVgIGFzIGBsaXN0SXRlbWAgKi9cbiAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBjb25maWcudHlwZS5uYW1lID09PSAnYnVsbGV0TGlzdCcgfHwgY29uZmlnLnR5cGUubmFtZSA9PT0gJ29yZGVyZWRMaXN0JyA/ICdsaXN0SXRlbScgOiAndGFza0xpc3QnXG5cbiAgICAgICAgY2hhaW4oKS51cGRhdGVBdHRyaWJ1dGVzKG5vZGVUeXBlLCBhdHRyaWJ1dGVzKS5ydW4oKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBiZWZvcmUgPSB0ci5kb2MucmVzb2x2ZShyYW5nZS5mcm9tIC0gMSkubm9kZUJlZm9yZVxuXG4gICAgICBpZiAoXG4gICAgICAgIGJlZm9yZVxuICAgICAgICAmJiBiZWZvcmUudHlwZSA9PT0gY29uZmlnLnR5cGVcbiAgICAgICAgJiYgY2FuSm9pbih0ci5kb2MsIHJhbmdlLmZyb20gLSAxKVxuICAgICAgICAmJiAoIWNvbmZpZy5qb2luUHJlZGljYXRlIHx8IGNvbmZpZy5qb2luUHJlZGljYXRlKG1hdGNoLCBiZWZvcmUpKVxuICAgICAgKSB7XG4gICAgICAgIHRyLmpvaW4ocmFuZ2UuZnJvbSAtIDEpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQge1xuICBET01PdXRwdXRTcGVjLCBNYXJrIGFzIFByb3NlTWlycm9yTWFyaywgTWFya1NwZWMsIE1hcmtUeXBlLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQuanMnXG5pbXBvcnQgeyBNYXJrQ29uZmlnIH0gZnJvbSAnLi9pbmRleC5qcydcbmltcG9ydCB7IElucHV0UnVsZSB9IGZyb20gJy4vSW5wdXRSdWxlLmpzJ1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4vTm9kZS5qcydcbmltcG9ydCB7IFBhc3RlUnVsZSB9IGZyb20gJy4vUGFzdGVSdWxlLmpzJ1xuaW1wb3J0IHtcbiAgQW55Q29uZmlnLFxuICBBdHRyaWJ1dGVzLFxuICBFeHRlbnNpb25zLFxuICBHbG9iYWxBdHRyaWJ1dGVzLFxuICBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZCxcbiAgUGFyZW50Q29uZmlnLFxuICBSYXdDb21tYW5kcyxcbn0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gJy4vdXRpbGl0aWVzL21lcmdlRGVlcC5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBleHBvcnQgaW50ZXJmYWNlIE1hcmtDb25maWc8T3B0aW9ucyA9IGFueSwgU3RvcmFnZSA9IGFueT4ge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxuXG4gICAgLyoqXG4gICAgICogTmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogUHJpb3JpdHlcbiAgICAgKi9cbiAgICBwcmlvcml0eT86IG51bWJlclxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBvcHRpb25zXG4gICAgICovXG4gICAgZGVmYXVsdE9wdGlvbnM/OiBPcHRpb25zXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IE9wdGlvbnNcbiAgICAgKi9cbiAgICBhZGRPcHRpb25zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgcGFyZW50OiBFeGNsdWRlPFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkT3B0aW9ucyddLCB1bmRlZmluZWQ+XG4gICAgfSkgPT4gT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBTdG9yYWdlXG4gICAgICovXG4gICAgYWRkU3RvcmFnZT86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFN0b3JhZ2UnXSwgdW5kZWZpbmVkPlxuICAgIH0pID0+IFN0b3JhZ2VcblxuICAgIC8qKlxuICAgICAqIEdsb2JhbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkR2xvYmFsQXR0cmlidXRlcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRHbG9iYWxBdHRyaWJ1dGVzJ11cbiAgICB9KSA9PiBHbG9iYWxBdHRyaWJ1dGVzIHwge31cblxuICAgIC8qKlxuICAgICAqIFJhd1xuICAgICAqL1xuICAgIGFkZENvbW1hbmRzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkQ29tbWFuZHMnXVxuICAgIH0pID0+IFBhcnRpYWw8UmF3Q29tbWFuZHM+XG5cbiAgICAvKipcbiAgICAgKiBLZXlib2FyZCBzaG9ydGN1dHNcbiAgICAgKi9cbiAgICBhZGRLZXlib2FyZFNob3J0Y3V0cz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEtleWJvYXJkU2hvcnRjdXRzJ11cbiAgICB9KSA9PiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElucHV0IHJ1bGVzXG4gICAgICovXG4gICAgYWRkSW5wdXRSdWxlcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZElucHV0UnVsZXMnXVxuICAgIH0pID0+IElucHV0UnVsZVtdXG5cbiAgICAvKipcbiAgICAgKiBQYXN0ZSBydWxlc1xuICAgICAqL1xuICAgIGFkZFBhc3RlUnVsZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRQYXN0ZVJ1bGVzJ11cbiAgICB9KSA9PiBQYXN0ZVJ1bGVbXVxuXG4gICAgLyoqXG4gICAgICogUHJvc2VNaXJyb3IgcGx1Z2luc1xuICAgICAqL1xuICAgIGFkZFByb3NlTWlycm9yUGx1Z2lucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFByb3NlTWlycm9yUGx1Z2lucyddXG4gICAgfSkgPT4gUGx1Z2luW11cblxuICAgIC8qKlxuICAgICAqIEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBhZGRFeHRlbnNpb25zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEV4dGVuc2lvbnMnXVxuICAgIH0pID0+IEV4dGVuc2lvbnNcblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCBOb2RlIFNjaGVtYVxuICAgICAqL1xuICAgIGV4dGVuZE5vZGVTY2hlbWE/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4dGVuZE5vZGVTY2hlbWEnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBOb2RlLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCBNYXJrIFNjaGVtYVxuICAgICAqL1xuICAgIGV4dGVuZE1hcmtTY2hlbWE/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4dGVuZE1hcmtTY2hlbWEnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBNYXJrLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgbm90IHJlYWR5IHlldC5cbiAgICAgKi9cbiAgICBvbkJlZm9yZUNyZWF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkJlZm9yZUNyZWF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgcmVhZHkuXG4gICAgICovXG4gICAgb25DcmVhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25DcmVhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBvblVwZGF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvblVwZGF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICovXG4gICAgb25TZWxlY3Rpb25VcGRhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25TZWxlY3Rpb25VcGRhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uVHJhbnNhY3Rpb24/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25UcmFuc2FjdGlvbiddXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG4gICAgICAgICAgfSxcbiAgICAgICAgKSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGlzIGZvY3VzZWQuXG4gICAgICovXG4gICAgb25Gb2N1cz86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkZvY3VzJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpc27igJl0IGZvY3VzZWQgYW55bW9yZS5cbiAgICAgKi9cbiAgICBvbkJsdXI/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25CbHVyJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgb25EZXN0cm95PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRGVzdHJveSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIEtlZXAgbWFyayBhZnRlciBzcGxpdCBub2RlXG4gICAgICovXG4gICAga2VlcE9uU3BsaXQ/OiBib29sZWFuIHwgKCgpID0+IGJvb2xlYW4pXG5cbiAgICAvKipcbiAgICAgKiBJbmNsdXNpdmVcbiAgICAgKi9cbiAgICBpbmNsdXNpdmU/OlxuICAgICAgfCBNYXJrU3BlY1snaW5jbHVzaXZlJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnaW5jbHVzaXZlJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTWFya1NwZWNbJ2luY2x1c2l2ZSddKVxuXG4gICAgLyoqXG4gICAgICogRXhjbHVkZXNcbiAgICAgKi9cbiAgICBleGNsdWRlcz86XG4gICAgICB8IE1hcmtTcGVjWydleGNsdWRlcyddXG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4Y2x1ZGVzJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTWFya1NwZWNbJ2V4Y2x1ZGVzJ10pXG5cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGlzIE1hcmsgYXMgZXhpdGFibGVcbiAgICAgKi9cbiAgICBleGl0YWJsZT86IGJvb2xlYW4gfCAoKCkgPT4gYm9vbGVhbilcblxuICAgIC8qKlxuICAgICAqIEdyb3VwXG4gICAgICovXG4gICAgZ3JvdXA/OlxuICAgICAgfCBNYXJrU3BlY1snZ3JvdXAnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+Wydncm91cCddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE1hcmtTcGVjWydncm91cCddKVxuXG4gICAgLyoqXG4gICAgICogU3Bhbm5pbmdcbiAgICAgKi9cbiAgICBzcGFubmluZz86XG4gICAgICB8IE1hcmtTcGVjWydzcGFubmluZyddXG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ3NwYW5uaW5nJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTWFya1NwZWNbJ3NwYW5uaW5nJ10pXG5cbiAgICAvKipcbiAgICAgKiBDb2RlXG4gICAgICovXG4gICAgY29kZT86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnY29kZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IGJvb2xlYW4pXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBIVE1MXG4gICAgICovXG4gICAgcGFyc2VIVE1MPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ3BhcnNlSFRNTCddXG4gICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICB9KSA9PiBNYXJrU3BlY1sncGFyc2VET00nXVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIEhUTUxcbiAgICAgKi9cbiAgICByZW5kZXJIVE1MPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydyZW5kZXJIVE1MJ11cbiAgICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIG1hcms6IFByb3NlTWlycm9yTWFya1xuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICB9LFxuICAgICAgICApID0+IERPTU91dHB1dFNwZWMpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRBdHRyaWJ1dGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEF0dHJpYnV0ZXMnXVxuICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgfSkgPT4gQXR0cmlidXRlcyB8IHt9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcms8T3B0aW9ucyA9IGFueSwgU3RvcmFnZSA9IGFueT4ge1xuICB0eXBlID0gJ21hcmsnXG5cbiAgbmFtZSA9ICdtYXJrJ1xuXG4gIHBhcmVudDogTWFyayB8IG51bGwgPSBudWxsXG5cbiAgY2hpbGQ6IE1hcmsgfCBudWxsID0gbnVsbFxuXG4gIG9wdGlvbnM6IE9wdGlvbnNcblxuICBzdG9yYWdlOiBTdG9yYWdlXG5cbiAgY29uZmlnOiBNYXJrQ29uZmlnID0ge1xuICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICBkZWZhdWx0T3B0aW9uczoge30sXG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj4gPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAuLi5jb25maWcsXG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25maWcubmFtZVxuXG4gICAgaWYgKGNvbmZpZy5kZWZhdWx0T3B0aW9ucykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3RpcHRhcCB3YXJuXTogQlJFQUtJTkcgQ0hBTkdFOiBcImRlZmF1bHRPcHRpb25zXCIgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBcImFkZE9wdGlvbnNcIiBpbnN0ZWFkLiBGb3VuZCBpbiBleHRlbnNpb246IFwiJHt0aGlzLm5hbWV9XCIuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgYGFkZE9wdGlvbnNgIGZhbGxiYWNrXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5jb25maWcuZGVmYXVsdE9wdGlvbnNcblxuICAgIGlmICh0aGlzLmNvbmZpZy5hZGRPcHRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBjYWxsT3JSZXR1cm4oXG4gICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkT3B0aW9ucyddPih0aGlzLCAnYWRkT3B0aW9ucycsIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZSA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkU3RvcmFnZSddPih0aGlzLCAnYWRkU3RvcmFnZScsIHtcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICB9KSxcbiAgICApIHx8IHt9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlPE8gPSBhbnksIFMgPSBhbnk+KGNvbmZpZzogUGFydGlhbDxNYXJrQ29uZmlnPE8sIFM+PiA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBNYXJrPE8sIFM+KGNvbmZpZylcbiAgfVxuXG4gIGNvbmZpZ3VyZShvcHRpb25zOiBQYXJ0aWFsPE9wdGlvbnM+ID0ge30pIHtcbiAgICAvLyByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugc28gd2UgY2FuIHVzZSB0aGUgc2FtZSBleHRlbnNpb25cbiAgICAvLyB3aXRoIGRpZmZlcmVudCBjYWxscyBvZiBgY29uZmlndXJlYFxuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMuZXh0ZW5kKClcblxuICAgIGV4dGVuc2lvbi5vcHRpb25zID0gbWVyZ2VEZWVwKHRoaXMub3B0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvcHRpb25zKSBhcyBPcHRpb25zXG5cbiAgICBleHRlbnNpb24uc3RvcmFnZSA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkU3RvcmFnZSddPihleHRlbnNpb24sICdhZGRTdG9yYWdlJywge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICB9KSxcbiAgICApXG5cbiAgICByZXR1cm4gZXh0ZW5zaW9uXG4gIH1cblxuICBleHRlbmQ8RXh0ZW5kZWRPcHRpb25zID0gT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlID0gU3RvcmFnZT4oXG4gICAgZXh0ZW5kZWRDb25maWc6IFBhcnRpYWw8TWFya0NvbmZpZzxFeHRlbmRlZE9wdGlvbnMsIEV4dGVuZGVkU3RvcmFnZT4+ID0ge30sXG4gICkge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IG5ldyBNYXJrPEV4dGVuZGVkT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlPihleHRlbmRlZENvbmZpZylcblxuICAgIGV4dGVuc2lvbi5wYXJlbnQgPSB0aGlzXG5cbiAgICB0aGlzLmNoaWxkID0gZXh0ZW5zaW9uXG5cbiAgICBleHRlbnNpb24ubmFtZSA9IGV4dGVuZGVkQ29uZmlnLm5hbWUgPyBleHRlbmRlZENvbmZpZy5uYW1lIDogZXh0ZW5zaW9uLnBhcmVudC5uYW1lXG5cbiAgICBpZiAoZXh0ZW5kZWRDb25maWcuZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt0aXB0YXAgd2Fybl06IEJSRUFLSU5HIENIQU5HRTogXCJkZWZhdWx0T3B0aW9uc1wiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJhZGRPcHRpb25zXCIgaW5zdGVhZC4gRm91bmQgaW4gZXh0ZW5zaW9uOiBcIiR7ZXh0ZW5zaW9uLm5hbWV9XCIuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBleHRlbnNpb24ub3B0aW9ucyA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkT3B0aW9ucyddPihleHRlbnNpb24sICdhZGRPcHRpb25zJywge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVFeGl0KHsgZWRpdG9yLCBtYXJrIH06IHsgZWRpdG9yOiBFZGl0b3I7IG1hcms6IE1hcmsgfSkge1xuICAgIGNvbnN0IHsgdHIgfSA9IGVkaXRvci5zdGF0ZVxuICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLiRmcm9tXG4gICAgY29uc3QgaXNBdEVuZCA9IGN1cnJlbnRQb3MucG9zID09PSBjdXJyZW50UG9zLmVuZCgpXG5cbiAgICBpZiAoaXNBdEVuZCkge1xuICAgICAgY29uc3QgY3VycmVudE1hcmtzID0gY3VycmVudFBvcy5tYXJrcygpXG4gICAgICBjb25zdCBpc0luTWFyayA9ICEhY3VycmVudE1hcmtzLmZpbmQobSA9PiBtPy50eXBlLm5hbWUgPT09IG1hcmsubmFtZSlcblxuICAgICAgaWYgKCFpc0luTWFyaykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVtb3ZlTWFyayA9IGN1cnJlbnRNYXJrcy5maW5kKG0gPT4gbT8udHlwZS5uYW1lID09PSBtYXJrLm5hbWUpXG5cbiAgICAgIGlmIChyZW1vdmVNYXJrKSB7XG4gICAgICAgIHRyLnJlbW92ZVN0b3JlZE1hcmsocmVtb3ZlTWFyaylcbiAgICAgIH1cbiAgICAgIHRyLmluc2VydFRleHQoJyAnLCBjdXJyZW50UG9zLnBvcylcblxuICAgICAgZWRpdG9yLnZpZXcuZGlzcGF0Y2godHIpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBET01PdXRwdXRTcGVjLCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgTm9kZVNwZWMsIE5vZGVUeXBlLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQuanMnXG5pbXBvcnQgeyBOb2RlQ29uZmlnIH0gZnJvbSAnLi9pbmRleC5qcydcbmltcG9ydCB7IElucHV0UnVsZSB9IGZyb20gJy4vSW5wdXRSdWxlLmpzJ1xuaW1wb3J0IHsgUGFzdGVSdWxlIH0gZnJvbSAnLi9QYXN0ZVJ1bGUuanMnXG5pbXBvcnQge1xuICBBbnlDb25maWcsXG4gIEF0dHJpYnV0ZXMsXG4gIEV4dGVuc2lvbnMsXG4gIEdsb2JhbEF0dHJpYnV0ZXMsXG4gIEtleWJvYXJkU2hvcnRjdXRDb21tYW5kLFxuICBOb2RlVmlld1JlbmRlcmVyLFxuICBQYXJlbnRDb25maWcsXG4gIFJhd0NvbW1hbmRzLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi91dGlsaXRpZXMvY2FsbE9yUmV0dXJuLmpzJ1xuaW1wb3J0IHsgbWVyZ2VEZWVwIH0gZnJvbSAnLi91dGlsaXRpZXMvbWVyZ2VEZWVwLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBOb2RlQ29uZmlnPE9wdGlvbnMgPSBhbnksIFN0b3JhZ2UgPSBhbnk+IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAgIC8qKlxuICAgICAqIE5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIFByaW9yaXR5XG4gICAgICovXG4gICAgcHJpb3JpdHk/OiBudW1iZXJcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgb3B0aW9uc1xuICAgICAqL1xuICAgIGRlZmF1bHRPcHRpb25zPzogT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBPcHRpb25zXG4gICAgICovXG4gICAgYWRkT3B0aW9ucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZE9wdGlvbnMnXSwgdW5kZWZpbmVkPlxuICAgIH0pID0+IE9wdGlvbnNcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgU3RvcmFnZVxuICAgICAqL1xuICAgIGFkZFN0b3JhZ2U/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBwYXJlbnQ6IEV4Y2x1ZGU8UGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRTdG9yYWdlJ10sIHVuZGVmaW5lZD5cbiAgICB9KSA9PiBTdG9yYWdlXG5cbiAgICAvKipcbiAgICAgKiBHbG9iYWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkR2xvYmFsQXR0cmlidXRlcyddXG4gICAgfSkgPT4gR2xvYmFsQXR0cmlidXRlcyB8IHt9XG5cbiAgICAvKipcbiAgICAgKiBSYXdcbiAgICAgKi9cbiAgICBhZGRDb21tYW5kcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBOb2RlVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZENvbW1hbmRzJ11cbiAgICB9KSA9PiBQYXJ0aWFsPFJhd0NvbW1hbmRzPlxuXG4gICAgLyoqXG4gICAgICogS2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgICovXG4gICAgYWRkS2V5Ym9hcmRTaG9ydGN1dHM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRLZXlib2FyZFNob3J0Y3V0cyddXG4gICAgfSkgPT4ge1xuICAgICAgW2tleTogc3RyaW5nXTogS2V5Ym9hcmRTaG9ydGN1dENvbW1hbmRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnB1dCBydWxlc1xuICAgICAqL1xuICAgIGFkZElucHV0UnVsZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRJbnB1dFJ1bGVzJ11cbiAgICB9KSA9PiBJbnB1dFJ1bGVbXVxuXG4gICAgLyoqXG4gICAgICogUGFzdGUgcnVsZXNcbiAgICAgKi9cbiAgICBhZGRQYXN0ZVJ1bGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkUGFzdGVSdWxlcyddXG4gICAgfSkgPT4gUGFzdGVSdWxlW11cblxuICAgIC8qKlxuICAgICAqIFByb3NlTWlycm9yIHBsdWdpbnNcbiAgICAgKi9cbiAgICBhZGRQcm9zZU1pcnJvclBsdWdpbnM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRQcm9zZU1pcnJvclBsdWdpbnMnXVxuICAgIH0pID0+IFBsdWdpbltdXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbnNpb25zXG4gICAgICovXG4gICAgYWRkRXh0ZW5zaW9ucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRFeHRlbnNpb25zJ11cbiAgICB9KSA9PiBFeHRlbnNpb25zXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgTm9kZSBTY2hlbWFcbiAgICAgKi9cbiAgICBleHRlbmROb2RlU2NoZW1hPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydleHRlbmROb2RlU2NoZW1hJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4dGVuc2lvbjogTm9kZSxcbiAgICAgICAgKSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgTWFyayBTY2hlbWFcbiAgICAgKi9cbiAgICBleHRlbmRNYXJrU2NoZW1hPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydleHRlbmRNYXJrU2NoZW1hJ11cbiAgICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBOb2RlLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgbm90IHJlYWR5IHlldC5cbiAgICAgKi9cbiAgICBvbkJlZm9yZUNyZWF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkJlZm9yZUNyZWF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgcmVhZHkuXG4gICAgICovXG4gICAgb25DcmVhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25DcmVhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBvblVwZGF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvblVwZGF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICovXG4gICAgb25TZWxlY3Rpb25VcGRhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25TZWxlY3Rpb25VcGRhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uVHJhbnNhY3Rpb24/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25UcmFuc2FjdGlvbiddXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG4gICAgICAgICAgfSxcbiAgICAgICAgKSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGlzIGZvY3VzZWQuXG4gICAgICovXG4gICAgb25Gb2N1cz86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkZvY3VzJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpc27igJl0IGZvY3VzZWQgYW55bW9yZS5cbiAgICAgKi9cbiAgICBvbkJsdXI/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25CbHVyJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgb25EZXN0cm95PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRGVzdHJveSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIE5vZGUgVmlld1xuICAgICAqL1xuICAgIGFkZE5vZGVWaWV3PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZE5vZGVWaWV3J11cbiAgICAgICAgfSkgPT4gTm9kZVZpZXdSZW5kZXJlcilcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVG9wTm9kZVxuICAgICAqL1xuICAgIHRvcE5vZGU/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50XG4gICAgICovXG4gICAgY29udGVudD86XG4gICAgICB8IE5vZGVTcGVjWydjb250ZW50J11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnY29udGVudCddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydjb250ZW50J10pXG5cbiAgICAvKipcbiAgICAgKiBNYXJrc1xuICAgICAqL1xuICAgIG1hcmtzPzpcbiAgICAgIHwgTm9kZVNwZWNbJ21hcmtzJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnbWFya3MnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snbWFya3MnXSlcblxuICAgIC8qKlxuICAgICAqIEdyb3VwXG4gICAgICovXG4gICAgZ3JvdXA/OlxuICAgICAgfCBOb2RlU3BlY1snZ3JvdXAnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+Wydncm91cCddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydncm91cCddKVxuXG4gICAgLyoqXG4gICAgICogSW5saW5lXG4gICAgICovXG4gICAgaW5saW5lPzpcbiAgICAgIHwgTm9kZVNwZWNbJ2lubGluZSddXG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2lubGluZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydpbmxpbmUnXSlcblxuICAgIC8qKlxuICAgICAqIEF0b21cbiAgICAgKi9cbiAgICBhdG9tPzpcbiAgICAgIHwgTm9kZVNwZWNbJ2F0b20nXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhdG9tJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTm9kZVNwZWNbJ2F0b20nXSlcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGFibGVcbiAgICAgKi9cbiAgICBzZWxlY3RhYmxlPzpcbiAgICAgIHwgTm9kZVNwZWNbJ3NlbGVjdGFibGUnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydzZWxlY3RhYmxlJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTm9kZVNwZWNbJ3NlbGVjdGFibGUnXSlcblxuICAgIC8qKlxuICAgICAqIERyYWdnYWJsZVxuICAgICAqL1xuICAgIGRyYWdnYWJsZT86XG4gICAgICB8IE5vZGVTcGVjWydkcmFnZ2FibGUnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydkcmFnZ2FibGUnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snZHJhZ2dhYmxlJ10pXG5cbiAgICAvKipcbiAgICAgKiBDb2RlXG4gICAgICovXG4gICAgY29kZT86XG4gICAgICB8IE5vZGVTcGVjWydjb2RlJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnY29kZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydjb2RlJ10pXG5cbiAgICAvKipcbiAgICAgKiBXaGl0ZXNwYWNlXG4gICAgICovXG4gICAgd2hpdGVzcGFjZT86XG4gICAgICB8IE5vZGVTcGVjWyd3aGl0ZXNwYWNlJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnd2hpdGVzcGFjZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWyd3aGl0ZXNwYWNlJ10pXG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmluZ1xuICAgICAqL1xuICAgIGRlZmluaW5nPzpcbiAgICAgIHwgTm9kZVNwZWNbJ2RlZmluaW5nJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnZGVmaW5pbmcnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snZGVmaW5pbmcnXSlcblxuICAgIC8qKlxuICAgICAqIElzb2xhdGluZ1xuICAgICAqL1xuICAgIGlzb2xhdGluZz86XG4gICAgICB8IE5vZGVTcGVjWydpc29sYXRpbmcnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+Wydpc29sYXRpbmcnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snaXNvbGF0aW5nJ10pXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBIVE1MXG4gICAgICovXG4gICAgcGFyc2VIVE1MPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ3BhcnNlSFRNTCddXG4gICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICB9KSA9PiBOb2RlU3BlY1sncGFyc2VET00nXVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIEhUTUxcbiAgICAgKi9cbiAgICByZW5kZXJIVE1MPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydyZW5kZXJIVE1MJ11cbiAgICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIG5vZGU6IFByb3NlTWlycm9yTm9kZVxuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICB9LFxuICAgICAgICApID0+IERPTU91dHB1dFNwZWMpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFJlbmRlciBUZXh0XG4gICAgICovXG4gICAgcmVuZGVyVGV4dD86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsncmVuZGVyVGV4dCddXG4gICAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBub2RlOiBQcm9zZU1pcnJvck5vZGVcbiAgICAgICAgICAgIHBvczogbnVtYmVyXG4gICAgICAgICAgICBwYXJlbnQ6IFByb3NlTWlycm9yTm9kZVxuICAgICAgICAgICAgaW5kZXg6IG51bWJlclxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gc3RyaW5nKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBBZGQgQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZEF0dHJpYnV0ZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkQXR0cmlidXRlcyddXG4gICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICB9KSA9PiBBdHRyaWJ1dGVzIHwge31cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9kZTxPcHRpb25zID0gYW55LCBTdG9yYWdlID0gYW55PiB7XG4gIHR5cGUgPSAnbm9kZSdcblxuICBuYW1lID0gJ25vZGUnXG5cbiAgcGFyZW50OiBOb2RlIHwgbnVsbCA9IG51bGxcblxuICBjaGlsZDogTm9kZSB8IG51bGwgPSBudWxsXG5cbiAgb3B0aW9uczogT3B0aW9uc1xuXG4gIHN0b3JhZ2U6IFN0b3JhZ2VcblxuICBjb25maWc6IE5vZGVDb25maWcgPSB7XG4gICAgbmFtZTogdGhpcy5uYW1lLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbmZpZy5uYW1lXG5cbiAgICBpZiAoY29uZmlnLmRlZmF1bHRPcHRpb25zKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbdGlwdGFwIHdhcm5dOiBCUkVBS0lORyBDSEFOR0U6IFwiZGVmYXVsdE9wdGlvbnNcIiBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFwiYWRkT3B0aW9uc1wiIGluc3RlYWQuIEZvdW5kIGluIGV4dGVuc2lvbjogXCIke3RoaXMubmFtZX1cIi5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSBgYWRkT3B0aW9uc2AgZmFsbGJhY2tcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kZWZhdWx0T3B0aW9uc1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmFkZE9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IGNhbGxPclJldHVybihcbiAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRPcHRpb25zJ10+KHRoaXMsICdhZGRPcHRpb25zJywge1xuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KHRoaXMsICdhZGRTdG9yYWdlJywge1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgICkgfHwge31cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8TyA9IGFueSwgUyA9IGFueT4oY29uZmlnOiBQYXJ0aWFsPE5vZGVDb25maWc8TywgUz4+ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IE5vZGU8TywgUz4oY29uZmlnKVxuICB9XG5cbiAgY29uZmlndXJlKG9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7fSkge1xuICAgIC8vIHJldHVybiBhIG5ldyBpbnN0YW5jZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGV4dGVuc2lvblxuICAgIC8vIHdpdGggZGlmZmVyZW50IGNhbGxzIG9mIGBjb25maWd1cmVgXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5leHRlbmQoKVxuXG4gICAgZXh0ZW5zaW9uLm9wdGlvbnMgPSBtZXJnZURlZXAodGhpcy5vcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnMpIGFzIE9wdGlvbnNcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxuXG4gIGV4dGVuZDxFeHRlbmRlZE9wdGlvbnMgPSBPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2UgPSBTdG9yYWdlPihcbiAgICBleHRlbmRlZENvbmZpZzogUGFydGlhbDxOb2RlQ29uZmlnPEV4dGVuZGVkT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlPj4gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gbmV3IE5vZGU8RXh0ZW5kZWRPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2U+KGV4dGVuZGVkQ29uZmlnKVxuXG4gICAgZXh0ZW5zaW9uLnBhcmVudCA9IHRoaXNcblxuICAgIHRoaXMuY2hpbGQgPSBleHRlbnNpb25cblxuICAgIGV4dGVuc2lvbi5uYW1lID0gZXh0ZW5kZWRDb25maWcubmFtZSA/IGV4dGVuZGVkQ29uZmlnLm5hbWUgOiBleHRlbnNpb24ucGFyZW50Lm5hbWVcblxuICAgIGlmIChleHRlbmRlZENvbmZpZy5kZWZhdWx0T3B0aW9ucykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3RpcHRhcCB3YXJuXTogQlJFQUtJTkcgQ0hBTkdFOiBcImRlZmF1bHRPcHRpb25zXCIgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBcImFkZE9wdGlvbnNcIiBpbnN0ZWFkLiBGb3VuZCBpbiBleHRlbnNpb246IFwiJHtleHRlbnNpb24ubmFtZX1cIi5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIGV4dGVuc2lvbi5vcHRpb25zID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRPcHRpb25zJ10+KGV4dGVuc2lvbiwgJ2FkZE9wdGlvbnMnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgZXh0ZW5zaW9uLnN0b3JhZ2UgPSBjYWxsT3JSZXR1cm4oXG4gICAgICBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZFN0b3JhZ2UnXT4oZXh0ZW5zaW9uLCAnYWRkU3RvcmFnZScsIHtcbiAgICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcmV0dXJuIGV4dGVuc2lvblxuICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzQW5kcm9pZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ0FuZHJvaWQnIHx8IC9hbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IE5vZGVTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgTm9kZVZpZXcgYXMgUHJvc2VNaXJyb3JOb2RlVmlldyB9IGZyb20gJ0B0aXB0YXAvcG0vdmlldydcblxuaW1wb3J0IHsgRWRpdG9yIGFzIENvcmVFZGl0b3IgfSBmcm9tICcuL0VkaXRvci5qcydcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuL05vZGUuanMnXG5pbXBvcnQgeyBEZWNvcmF0aW9uV2l0aFR5cGUsIE5vZGVWaWV3UmVuZGVyZXJPcHRpb25zLCBOb2RlVmlld1JlbmRlcmVyUHJvcHMgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNBbmRyb2lkIH0gZnJvbSAnLi91dGlsaXRpZXMvaXNBbmRyb2lkLmpzJ1xuaW1wb3J0IHsgaXNpT1MgfSBmcm9tICcuL3V0aWxpdGllcy9pc2lPUy5qcydcblxuZXhwb3J0IGNsYXNzIE5vZGVWaWV3PFxuICBDb21wb25lbnQsXG4gIE5vZGVFZGl0b3IgZXh0ZW5kcyBDb3JlRWRpdG9yID0gQ29yZUVkaXRvcixcbiAgT3B0aW9ucyBleHRlbmRzIE5vZGVWaWV3UmVuZGVyZXJPcHRpb25zID0gTm9kZVZpZXdSZW5kZXJlck9wdGlvbnMsXG4+IGltcGxlbWVudHMgUHJvc2VNaXJyb3JOb2RlVmlldyB7XG4gIGNvbXBvbmVudDogQ29tcG9uZW50XG5cbiAgZWRpdG9yOiBOb2RlRWRpdG9yXG5cbiAgb3B0aW9uczogT3B0aW9uc1xuXG4gIGV4dGVuc2lvbjogTm9kZVxuXG4gIG5vZGU6IFByb3NlTWlycm9yTm9kZVxuXG4gIGRlY29yYXRpb25zOiBEZWNvcmF0aW9uV2l0aFR5cGVbXVxuXG4gIGdldFBvczogYW55XG5cbiAgaXNEcmFnZ2luZyA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoY29tcG9uZW50OiBDb21wb25lbnQsIHByb3BzOiBOb2RlVmlld1JlbmRlcmVyUHJvcHMsIG9wdGlvbnM/OiBQYXJ0aWFsPE9wdGlvbnM+KSB7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnRcbiAgICB0aGlzLmVkaXRvciA9IHByb3BzLmVkaXRvciBhcyBOb2RlRWRpdG9yXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgc3RvcEV2ZW50OiBudWxsLFxuICAgICAgaWdub3JlTXV0YXRpb246IG51bGwsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0gYXMgT3B0aW9uc1xuICAgIHRoaXMuZXh0ZW5zaW9uID0gcHJvcHMuZXh0ZW5zaW9uXG4gICAgdGhpcy5ub2RlID0gcHJvcHMubm9kZVxuICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBwcm9wcy5kZWNvcmF0aW9ucyBhcyBEZWNvcmF0aW9uV2l0aFR5cGVbXVxuICAgIHRoaXMuZ2V0UG9zID0gcHJvcHMuZ2V0UG9zXG4gICAgdGhpcy5tb3VudCgpXG4gIH1cblxuICBtb3VudCgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZXR1cm5cbiAgfVxuXG4gIGdldCBkb20oKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci52aWV3LmRvbSBhcyBIVE1MRWxlbWVudFxuICB9XG5cbiAgZ2V0IGNvbnRlbnRET00oKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGNvbnN0IHsgdmlldyB9ID0gdGhpcy5lZGl0b3JcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcblxuICAgIC8vIGdldCB0aGUgZHJhZyBoYW5kbGUgZWxlbWVudFxuICAgIC8vIGBjbG9zZXN0YCBpcyBub3QgYXZhaWxhYmxlIGZvciB0ZXh0IG5vZGVzIHNvIHdlIG1heSBoYXZlIHRvIHVzZSBpdHMgcGFyZW50XG4gICAgY29uc3QgZHJhZ0hhbmRsZSA9IHRhcmdldC5ub2RlVHlwZSA9PT0gM1xuICAgICAgPyB0YXJnZXQucGFyZW50RWxlbWVudD8uY2xvc2VzdCgnW2RhdGEtZHJhZy1oYW5kbGVdJylcbiAgICAgIDogdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWRyYWctaGFuZGxlXScpXG5cbiAgICBpZiAoIXRoaXMuZG9tIHx8IHRoaXMuY29udGVudERPTT8uY29udGFpbnModGFyZ2V0KSB8fCAhZHJhZ0hhbmRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IHggPSAwXG4gICAgbGV0IHkgPSAwXG5cbiAgICAvLyBjYWxjdWxhdGUgb2Zmc2V0IGZvciBkcmFnIGVsZW1lbnQgaWYgd2UgdXNlIGEgZGlmZmVyZW50IGRyYWcgaGFuZGxlIGVsZW1lbnRcbiAgICBpZiAodGhpcy5kb20gIT09IGRyYWdIYW5kbGUpIHtcbiAgICAgIGNvbnN0IGRvbUJveCA9IHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCBoYW5kbGVCb3ggPSBkcmFnSGFuZGxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgIC8vIEluIFJlYWN0LCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggbmF0aXZlRXZlbnQgdG8gcmVhY2ggb2Zmc2V0WC9vZmZzZXRZLlxuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50Lm9mZnNldFggPz8gKGV2ZW50IGFzIGFueSkubmF0aXZlRXZlbnQ/Lm9mZnNldFhcbiAgICAgIGNvbnN0IG9mZnNldFkgPSBldmVudC5vZmZzZXRZID8/IChldmVudCBhcyBhbnkpLm5hdGl2ZUV2ZW50Py5vZmZzZXRZXG5cbiAgICAgIHggPSBoYW5kbGVCb3gueCAtIGRvbUJveC54ICsgb2Zmc2V0WFxuICAgICAgeSA9IGhhbmRsZUJveC55IC0gZG9tQm94LnkgKyBvZmZzZXRZXG4gICAgfVxuXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREcmFnSW1hZ2UodGhpcy5kb20sIHgsIHkpXG5cbiAgICAvLyB3ZSBuZWVkIHRvIHRlbGwgUHJvc2VNaXJyb3IgdGhhdCB3ZSB3YW50IHRvIG1vdmUgdGhlIHdob2xlIG5vZGVcbiAgICAvLyBzbyB3ZSBjcmVhdGUgYSBOb2RlU2VsZWN0aW9uXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIHRoaXMuZ2V0UG9zKCkpXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pXG5cbiAgICB2aWV3LmRpc3BhdGNoKHRyYW5zYWN0aW9uKVxuICB9XG5cbiAgc3RvcEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnN0b3BFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zdG9wRXZlbnQoeyBldmVudCB9KVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxuICAgIGNvbnN0IGlzSW5FbGVtZW50ID0gdGhpcy5kb20uY29udGFpbnModGFyZ2V0KSAmJiAhdGhpcy5jb250ZW50RE9NPy5jb250YWlucyh0YXJnZXQpXG5cbiAgICAvLyBhbnkgZXZlbnQgZnJvbSBjaGlsZCBub2RlcyBzaG91bGQgYmUgaGFuZGxlZCBieSBQcm9zZU1pcnJvclxuICAgIGlmICghaXNJbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGlzRHJhZ0V2ZW50ID0gZXZlbnQudHlwZS5zdGFydHNXaXRoKCdkcmFnJylcbiAgICBjb25zdCBpc0Ryb3BFdmVudCA9IGV2ZW50LnR5cGUgPT09ICdkcm9wJ1xuICAgIGNvbnN0IGlzSW5wdXQgPSBbJ0lOUFVUJywgJ0JVVFRPTicsICdTRUxFQ1QnLCAnVEVYVEFSRUEnXS5pbmNsdWRlcyh0YXJnZXQudGFnTmFtZSkgfHwgdGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlXG5cbiAgICAvLyBhbnkgaW5wdXQgZXZlbnQgd2l0aGluIG5vZGUgdmlld3Mgc2hvdWxkIGJlIGlnbm9yZWQgYnkgUHJvc2VNaXJyb3JcbiAgICBpZiAoaXNJbnB1dCAmJiAhaXNEcm9wRXZlbnQgJiYgIWlzRHJhZ0V2ZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHsgaXNFZGl0YWJsZSB9ID0gdGhpcy5lZGl0b3JcbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcgfSA9IHRoaXNcbiAgICBjb25zdCBpc0RyYWdnYWJsZSA9ICEhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGVcbiAgICBjb25zdCBpc1NlbGVjdGFibGUgPSBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZSh0aGlzLm5vZGUpXG4gICAgY29uc3QgaXNDb3B5RXZlbnQgPSBldmVudC50eXBlID09PSAnY29weSdcbiAgICBjb25zdCBpc1Bhc3RlRXZlbnQgPSBldmVudC50eXBlID09PSAncGFzdGUnXG4gICAgY29uc3QgaXNDdXRFdmVudCA9IGV2ZW50LnR5cGUgPT09ICdjdXQnXG4gICAgY29uc3QgaXNDbGlja0V2ZW50ID0gZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bidcblxuICAgIC8vIFByb3NlTWlycm9yIHRyaWVzIHRvIGRyYWcgc2VsZWN0YWJsZSBub2Rlc1xuICAgIC8vIGV2ZW4gaWYgYGRyYWdnYWJsZWAgaXMgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyB0aGlzIGZpeCBwcmV2ZW50cyB0aGF0XG4gICAgaWYgKCFpc0RyYWdnYWJsZSAmJiBpc1NlbGVjdGFibGUgJiYgaXNEcmFnRXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAoaXNEcmFnZ2FibGUgJiYgaXNEcmFnRXZlbnQgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhhdCBkcmFnZ2luZyBzdGFydGVkXG4gICAgaWYgKGlzRHJhZ2dhYmxlICYmIGlzRWRpdGFibGUgJiYgIWlzRHJhZ2dpbmcgJiYgaXNDbGlja0V2ZW50KSB7XG4gICAgICBjb25zdCBkcmFnSGFuZGxlID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWRyYWctaGFuZGxlXScpXG4gICAgICBjb25zdCBpc1ZhbGlkRHJhZ0hhbmRsZSA9IGRyYWdIYW5kbGUgJiYgKHRoaXMuZG9tID09PSBkcmFnSGFuZGxlIHx8IHRoaXMuZG9tLmNvbnRhaW5zKGRyYWdIYW5kbGUpKVxuXG4gICAgICBpZiAoaXNWYWxpZERyYWdIYW5kbGUpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZVxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2RyYWdlbmQnLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICAgICAgKVxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2Ryb3AnLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICAgICAgKVxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ21vdXNldXAnLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRoZXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBwcm9zZW1pcnJvclxuICAgIGlmIChcbiAgICAgIGlzRHJhZ2dpbmdcbiAgICAgIHx8IGlzRHJvcEV2ZW50XG4gICAgICB8fCBpc0NvcHlFdmVudFxuICAgICAgfHwgaXNQYXN0ZUV2ZW50XG4gICAgICB8fCBpc0N1dEV2ZW50XG4gICAgICB8fCAoaXNDbGlja0V2ZW50ICYmIGlzU2VsZWN0YWJsZSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQgfCB7IHR5cGU6ICdzZWxlY3Rpb24nOyB0YXJnZXQ6IEVsZW1lbnQgfSkge1xuICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMuY29udGVudERPTSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5pZ25vcmVNdXRhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pZ25vcmVNdXRhdGlvbih7IG11dGF0aW9uIH0pXG4gICAgfVxuXG4gICAgLy8gYSBsZWFmL2F0b20gbm9kZSBpcyBsaWtlIGEgYmxhY2sgYm94IGZvciBQcm9zZU1pcnJvclxuICAgIC8vIGFuZCBzaG91bGQgYmUgZnVsbHkgaGFuZGxlZCBieSB0aGUgbm9kZSB2aWV3XG4gICAgaWYgKHRoaXMubm9kZS5pc0xlYWYgfHwgdGhpcy5ub2RlLmlzQXRvbSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBQcm9zZU1pcnJvciBzaG91bGQgaGFuZGxlIGFueSBzZWxlY3Rpb25zXG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdzZWxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyB0cnkgdG8gcHJldmVudCBhIGJ1ZyBvbiBpT1MgYW5kIEFuZHJvaWQgdGhhdCB3aWxsIGJyZWFrIG5vZGUgdmlld3Mgb24gZW50ZXJcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgUHJvc2VNaXJyb3IgY2Fu4oCZdCBwcmV2ZW50RGlzcGF0Y2ggb24gZW50ZXJcbiAgICAvLyB0aGlzIHdpbGwgbGVhZCB0byBhIHJlLXJlbmRlciBvZiB0aGUgbm9kZSB2aWV3IG9uIGVudGVyXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vdWViZXJkb3Npcy90aXB0YXAvaXNzdWVzLzEyMTRcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS91ZWJlcmRvc2lzL3RpcHRhcC9pc3N1ZXMvMjUzNFxuICAgIGlmIChcbiAgICAgIHRoaXMuZG9tLmNvbnRhaW5zKG11dGF0aW9uLnRhcmdldClcbiAgICAgICYmIG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnXG4gICAgICAmJiAoaXNpT1MoKSB8fCBpc0FuZHJvaWQoKSlcbiAgICAgICYmIHRoaXMuZWRpdG9yLmlzRm9jdXNlZFxuICAgICkge1xuICAgICAgY29uc3QgY2hhbmdlZE5vZGVzID0gW1xuICAgICAgICAuLi5BcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLFxuICAgICAgICAuLi5BcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2RlcyksXG4gICAgICBdIGFzIEhUTUxFbGVtZW50W11cblxuICAgICAgLy8gd2XigJlsbCBjaGVjayBpZiBldmVyeSBjaGFuZ2VkIG5vZGUgaXMgY29udGVudEVkaXRhYmxlXG4gICAgICAvLyB0byBtYWtlIHN1cmUgaXTigJlzIHByb2JhYmx5IG11dGF0ZWQgYnkgUHJvc2VNaXJyb3JcbiAgICAgIGlmIChjaGFuZ2VkTm9kZXMuZXZlcnkobm9kZSA9PiBub2RlLmlzQ29udGVudEVkaXRhYmxlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB3ZSB3aWxsIGFsbG93IG11dGF0aW9uIGNvbnRlbnRET00gd2l0aCBhdHRyaWJ1dGVzXG4gICAgLy8gc28gd2UgY2FuIGZvciBleGFtcGxlIGFkZGluZyBjbGFzc2VzIHdpdGhpbiBvdXIgbm9kZSB2aWV3XG4gICAgaWYgKHRoaXMuY29udGVudERPTSA9PT0gbXV0YXRpb24udGFyZ2V0ICYmIG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBQcm9zZU1pcnJvciBzaG91bGQgaGFuZGxlIGFueSBjaGFuZ2VzIHdpdGhpbiBjb250ZW50RE9NXG4gICAgaWYgKHRoaXMuY29udGVudERPTS5jb250YWlucyhtdXRhdGlvbi50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlcyhhdHRyaWJ1dGVzOiB7fSkge1xuICAgIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmNvbW1hbmQoKHsgdHIgfSkgPT4ge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRQb3MoKVxuXG4gICAgICB0ci5zZXROb2RlTWFya3VwKHBvcywgdW5kZWZpbmVkLCB7XG4gICAgICAgIC4uLnRoaXMubm9kZS5hdHRycyxcbiAgICAgICAgLi4uYXR0cmlidXRlcyxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSlcbiAgfVxuXG4gIGRlbGV0ZU5vZGUoKTogdm9pZCB7XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuZ2V0UG9zKClcbiAgICBjb25zdCB0byA9IGZyb20gKyB0aGlzLm5vZGUubm9kZVNpemVcblxuICAgIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmRlbGV0ZVJhbmdlKHsgZnJvbSwgdG8gfSlcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgZ2V0TWFya3NCZXR3ZWVuIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrc0JldHdlZW4uanMnXG5pbXBvcnQgeyBQYXN0ZVJ1bGUsIFBhc3RlUnVsZUZpbmRlciB9IGZyb20gJy4uL1Bhc3RlUnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBwYXN0ZSBydWxlIHRoYXQgYWRkcyBhIG1hcmsgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyBwYXN0ZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtQYXN0ZVJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlclxuICB0eXBlOiBNYXJrVHlwZVxuICBnZXRBdHRyaWJ1dGVzPzpcbiAgICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICB8ICgobWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSwgZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgIHwgZmFsc2VcbiAgICB8IG51bGxcbn0pIHtcbiAgcmV0dXJuIG5ldyBQYXN0ZVJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXI6ICh7XG4gICAgICBzdGF0ZSwgcmFuZ2UsIG1hdGNoLCBwYXN0ZUV2ZW50LFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjYWxsT3JSZXR1cm4oY29uZmlnLmdldEF0dHJpYnV0ZXMsIHVuZGVmaW5lZCwgbWF0Y2gsIHBhc3RlRXZlbnQpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVzID09PSBmYWxzZSB8fCBhdHRyaWJ1dGVzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgdHIgfSA9IHN0YXRlXG4gICAgICBjb25zdCBjYXB0dXJlR3JvdXAgPSBtYXRjaFttYXRjaC5sZW5ndGggLSAxXVxuICAgICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF1cbiAgICAgIGxldCBtYXJrRW5kID0gcmFuZ2UudG9cblxuICAgICAgaWYgKGNhcHR1cmVHcm91cCkge1xuICAgICAgICBjb25zdCBzdGFydFNwYWNlcyA9IGZ1bGxNYXRjaC5zZWFyY2goL1xcUy8pXG4gICAgICAgIGNvbnN0IHRleHRTdGFydCA9IHJhbmdlLmZyb20gKyBmdWxsTWF0Y2guaW5kZXhPZihjYXB0dXJlR3JvdXApXG4gICAgICAgIGNvbnN0IHRleHRFbmQgPSB0ZXh0U3RhcnQgKyBjYXB0dXJlR3JvdXAubGVuZ3RoXG5cbiAgICAgICAgY29uc3QgZXhjbHVkZWRNYXJrcyA9IGdldE1hcmtzQmV0d2VlbihyYW5nZS5mcm9tLCByYW5nZS50bywgc3RhdGUuZG9jKVxuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBleGNsdWRlZCA9IGl0ZW0ubWFyay50eXBlLmV4Y2x1ZGVkIGFzIE1hcmtUeXBlW11cblxuICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVkLmZpbmQodHlwZSA9PiB0eXBlID09PSBjb25maWcudHlwZSAmJiB0eXBlICE9PSBpdGVtLm1hcmsudHlwZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLnRvID4gdGV4dFN0YXJ0KVxuXG4gICAgICAgIGlmIChleGNsdWRlZE1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dEVuZCA8IHJhbmdlLnRvKSB7XG4gICAgICAgICAgdHIuZGVsZXRlKHRleHRFbmQsIHJhbmdlLnRvKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRleHRTdGFydCA+IHJhbmdlLmZyb20pIHtcbiAgICAgICAgICB0ci5kZWxldGUocmFuZ2UuZnJvbSArIHN0YXJ0U3BhY2VzLCB0ZXh0U3RhcnQpXG4gICAgICAgIH1cblxuICAgICAgICBtYXJrRW5kID0gcmFuZ2UuZnJvbSArIHN0YXJ0U3BhY2VzICsgY2FwdHVyZUdyb3VwLmxlbmd0aFxuXG4gICAgICAgIHRyLmFkZE1hcmsocmFuZ2UuZnJvbSArIHN0YXJ0U3BhY2VzLCBtYXJrRW5kLCBjb25maWcudHlwZS5jcmVhdGUoYXR0cmlidXRlcyB8fCB7fSkpXG5cbiAgICAgICAgdHIucmVtb3ZlU3RvcmVkTWFyayhjb25maWcudHlwZSlcbiAgICAgIH1cbiAgICB9LFxuICB9KVxufVxuIiwgIi8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzY5Njk0ODZcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVGb3JSZWdFeChzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xufVxuIiwgImltcG9ydCB7IE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgUGFzdGVSdWxlLCBQYXN0ZVJ1bGVGaW5kZXIgfSBmcm9tICcuLi9QYXN0ZVJ1bGUuanMnXG5pbXBvcnQgeyBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4uL3V0aWxpdGllcy9pbmRleC5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBwYXN0ZSBydWxlIHRoYXQgYWRkcyBhIG5vZGUgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyBwYXN0ZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vZGVQYXN0ZVJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlclxuICB0eXBlOiBOb2RlVHlwZVxuICBnZXRBdHRyaWJ1dGVzPzpcbiAgICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICB8ICgobWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSwgZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgIHwgZmFsc2VcbiAgICB8IG51bGxcbn0pIHtcbiAgcmV0dXJuIG5ldyBQYXN0ZVJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXIoe1xuICAgICAgbWF0Y2gsIGNoYWluLCByYW5nZSwgcGFzdGVFdmVudCxcbiAgICB9KSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY2FsbE9yUmV0dXJuKGNvbmZpZy5nZXRBdHRyaWJ1dGVzLCB1bmRlZmluZWQsIG1hdGNoLCBwYXN0ZUV2ZW50KVxuXG4gICAgICBpZiAoYXR0cmlidXRlcyA9PT0gZmFsc2UgfHwgYXR0cmlidXRlcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2guaW5wdXQpIHtcbiAgICAgICAgY2hhaW4oKS5kZWxldGVSYW5nZShyYW5nZSkuaW5zZXJ0Q29udGVudEF0KHJhbmdlLmZyb20sIHtcbiAgICAgICAgICB0eXBlOiBjb25maWcudHlwZS5uYW1lLFxuICAgICAgICAgIGF0dHJzOiBhdHRyaWJ1dGVzLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgUGFzdGVSdWxlLCBQYXN0ZVJ1bGVGaW5kZXIgfSBmcm9tICcuLi9QYXN0ZVJ1bGUuanMnXG5cbi8qKlxuICogQnVpbGQgYW4gcGFzdGUgcnVsZSB0aGF0IHJlcGxhY2VzIHRleHQgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyBwYXN0ZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRleHRQYXN0ZVJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlcixcbiAgcmVwbGFjZTogc3RyaW5nLFxufSkge1xuICByZXR1cm4gbmV3IFBhc3RlUnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBsZXQgaW5zZXJ0ID0gY29uZmlnLnJlcGxhY2VcbiAgICAgIGxldCBzdGFydCA9IHJhbmdlLmZyb21cbiAgICAgIGNvbnN0IGVuZCA9IHJhbmdlLnRvXG5cbiAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtYXRjaFswXS5sYXN0SW5kZXhPZihtYXRjaFsxXSlcblxuICAgICAgICBpbnNlcnQgKz0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0ICsgbWF0Y2hbMV0ubGVuZ3RoKVxuICAgICAgICBzdGFydCArPSBvZmZzZXRcblxuICAgICAgICBjb25zdCBjdXRPZmYgPSBzdGFydCAtIGVuZFxuXG4gICAgICAgIGlmIChjdXRPZmYgPiAwKSB7XG4gICAgICAgICAgaW5zZXJ0ID0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0IC0gY3V0T2ZmLCBvZmZzZXQpICsgaW5zZXJ0XG4gICAgICAgICAgc3RhcnQgPSBlbmRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0ZS50ci5pbnNlcnRUZXh0KGluc2VydCwgc3RhcnQsIGVuZClcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGludGVyZmFjZSBUcmFja2VyUmVzdWx0IHtcbiAgcG9zaXRpb246IG51bWJlclxuICBkZWxldGVkOiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBUcmFja2VyIHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG5cbiAgY3VycmVudFN0ZXA6IG51bWJlclxuXG4gIGNvbnN0cnVjdG9yKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvblxuICAgIHRoaXMuY3VycmVudFN0ZXAgPSB0aGlzLnRyYW5zYWN0aW9uLnN0ZXBzLmxlbmd0aFxuICB9XG5cbiAgbWFwKHBvc2l0aW9uOiBudW1iZXIpOiBUcmFja2VyUmVzdWx0IHtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlXG5cbiAgICBjb25zdCBtYXBwZWRQb3NpdGlvbiA9IHRoaXMudHJhbnNhY3Rpb24uc3RlcHNcbiAgICAgIC5zbGljZSh0aGlzLmN1cnJlbnRTdGVwKVxuICAgICAgLnJlZHVjZSgobmV3UG9zaXRpb24sIHN0ZXApID0+IHtcbiAgICAgICAgY29uc3QgbWFwUmVzdWx0ID0gc3RlcC5nZXRNYXAoKS5tYXBSZXN1bHQobmV3UG9zaXRpb24pXG5cbiAgICAgICAgaWYgKG1hcFJlc3VsdC5kZWxldGVkKSB7XG4gICAgICAgICAgZGVsZXRlZCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXBSZXN1bHQucG9zXG4gICAgICB9LCBwb3NpdGlvbilcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogbWFwcGVkUG9zaXRpb24sXG4gICAgICBkZWxldGVkLFxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSwgd3JhcHBpbmdJbnB1dFJ1bGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmxvY2txdW90ZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJsb2NrUXVvdGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgYmxvY2txdW90ZSBub2RlXG4gICAgICAgKi9cbiAgICAgIHNldEJsb2NrcXVvdGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIGJsb2NrcXVvdGUgbm9kZVxuICAgICAgICovXG4gICAgICB0b2dnbGVCbG9ja3F1b3RlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIGJsb2NrcXVvdGUgbm9kZVxuICAgICAgICovXG4gICAgICB1bnNldEJsb2NrcXVvdGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpbnB1dFJlZ2V4ID0gL15cXHMqPlxccyQvXG5cbmV4cG9ydCBjb25zdCBCbG9ja3F1b3RlID0gTm9kZS5jcmVhdGU8QmxvY2txdW90ZU9wdGlvbnM+KHtcblxuICBuYW1lOiAnYmxvY2txdW90ZScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAnYmxvY2srJyxcblxuICBncm91cDogJ2Jsb2NrJyxcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgdGFnOiAnYmxvY2txdW90ZScgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydibG9ja3F1b3RlJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRCbG9ja3F1b3RlOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy53cmFwSW4odGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUJsb2NrcXVvdGU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZVdyYXAodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHVuc2V0QmxvY2txdW90ZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMubGlmdCh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC1TaGlmdC1iJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlQmxvY2txdW90ZSgpLFxuICAgIH1cbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB3cmFwcGluZ0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgTWFyayxcbiAgbWFya0lucHV0UnVsZSxcbiAgbWFya1Bhc3RlUnVsZSxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9sZE9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJvbGQ6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgYm9sZCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldEJvbGQ6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIGJvbGQgbWFya1xuICAgICAgICovXG4gICAgICB0b2dnbGVCb2xkOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIGJvbGQgbWFya1xuICAgICAgICovXG4gICAgICB1bnNldEJvbGQ6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzdGFySW5wdXRSZWdleCA9IC8oPzpefFxccykoKD86XFwqXFwqKSgoPzpbXipdKykpKD86XFwqXFwqKSkkL1xuZXhwb3J0IGNvbnN0IHN0YXJQYXN0ZVJlZ2V4ID0gLyg/Ol58XFxzKSgoPzpcXCpcXCopKCg/OlteKl0rKSkoPzpcXCpcXCopKS9nXG5leHBvcnQgY29uc3QgdW5kZXJzY29yZUlucHV0UmVnZXggPSAvKD86XnxcXHMpKCg/Ol9fKSgoPzpbXl9fXSspKSg/Ol9fKSkkL1xuZXhwb3J0IGNvbnN0IHVuZGVyc2NvcmVQYXN0ZVJlZ2V4ID0gLyg/Ol58XFxzKSgoPzpfXykoKD86W15fX10rKSkoPzpfXykpL2dcblxuZXhwb3J0IGNvbnN0IEJvbGQgPSBNYXJrLmNyZWF0ZTxCb2xkT3B0aW9ucz4oe1xuICBuYW1lOiAnYm9sZCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3Ryb25nJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2InLFxuICAgICAgICBnZXRBdHRyczogbm9kZSA9PiAobm9kZSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZm9udFdlaWdodCAhPT0gJ25vcm1hbCcgJiYgbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiAnZm9udC13ZWlnaHQnLFxuICAgICAgICBnZXRBdHRyczogdmFsdWUgPT4gL14oYm9sZChlcik/fFs1LTldXFxkezIsfSkkLy50ZXN0KHZhbHVlIGFzIHN0cmluZykgJiYgbnVsbCxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnc3Ryb25nJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRCb2xkOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB0b2dnbGVCb2xkOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB1bnNldEJvbGQ6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC1iJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlQm9sZCgpLFxuICAgICAgJ01vZC1CJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlQm9sZCgpLFxuICAgIH1cbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogc3RhcklucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgICAgbWFya0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IHVuZGVyc2NvcmVJbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgYWRkUGFzdGVSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya1Bhc3RlUnVsZSh7XG4gICAgICAgIGZpbmQ6IHN0YXJQYXN0ZVJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICAgIG1hcmtQYXN0ZVJ1bGUoe1xuICAgICAgICBmaW5kOiB1bmRlcnNjb3JlUGFzdGVSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEl0ZW1PcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGJ1bGxldExpc3RUeXBlTmFtZTogc3RyaW5nXG4gIG9yZGVyZWRMaXN0VHlwZU5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgTGlzdEl0ZW0gPSBOb2RlLmNyZWF0ZTxMaXN0SXRlbU9wdGlvbnM+KHtcbiAgbmFtZTogJ2xpc3RJdGVtJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgICBidWxsZXRMaXN0VHlwZU5hbWU6ICdidWxsZXRMaXN0JyxcbiAgICAgIG9yZGVyZWRMaXN0VHlwZU5hbWU6ICdvcmRlcmVkTGlzdCcsXG4gICAgfVxuICB9LFxuXG4gIGNvbnRlbnQ6ICdwYXJhZ3JhcGggYmxvY2sqJyxcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnbGknLFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydsaScsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgRW50ZXI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNwbGl0TGlzdEl0ZW0odGhpcy5uYW1lKSxcbiAgICAgIFRhYjogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuc2lua0xpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgICAnU2hpZnQtVGFiJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMubGlmdExpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQge1xuICBnZXRNYXJrQXR0cmlidXRlcyxcbiAgTWFyayxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dFN0eWxlT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgdGV4dFN0eWxlOiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBzcGFucyB3aXRob3V0IGlubGluZSBzdHlsZSBhdHRyaWJ1dGVzLlxuICAgICAgICovXG4gICAgICByZW1vdmVFbXB0eVRleHRTdHlsZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRleHRTdHlsZSA9IE1hcmsuY3JlYXRlPFRleHRTdHlsZU9wdGlvbnM+KHtcbiAgbmFtZTogJ3RleHRTdHlsZScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3BhbicsXG4gICAgICAgIGdldEF0dHJzOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNTdHlsZXMgPSAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKCdzdHlsZScpXG5cbiAgICAgICAgICBpZiAoIWhhc1N0eWxlcykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3NwYW4nLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbW92ZUVtcHR5VGV4dFN0eWxlOiAoKSA9PiAoeyBzdGF0ZSwgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2V0TWFya0F0dHJpYnV0ZXMoc3RhdGUsIHRoaXMudHlwZSlcbiAgICAgICAgY29uc3QgaGFzU3R5bGVzID0gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykuc29tZSgoWywgdmFsdWVdKSA9PiAhIXZhbHVlKVxuXG4gICAgICAgIGlmIChoYXNTdHlsZXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUsIHdyYXBwaW5nSW5wdXRSdWxlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5pbXBvcnQgTGlzdEl0ZW0gZnJvbSAnLi4vLi4vZXh0ZW5zaW9uLWxpc3QtaXRlbS9zcmMvaW5kZXguanMnXG5pbXBvcnQgVGV4dFN0eWxlIGZyb20gJy4uLy4uL2V4dGVuc2lvbi10ZXh0LXN0eWxlL3NyYy9pbmRleC5qcydcblxuZXhwb3J0IGludGVyZmFjZSBCdWxsZXRMaXN0T3B0aW9ucyB7XG4gIGl0ZW1UeXBlTmFtZTogc3RyaW5nLFxuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PixcbiAga2VlcE1hcmtzOiBib29sZWFuLFxuICBrZWVwQXR0cmlidXRlczogYm9vbGVhbixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJ1bGxldExpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgYnVsbGV0IGxpc3RcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlQnVsbGV0TGlzdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlucHV0UmVnZXggPSAvXlxccyooWy0rKl0pXFxzJC9cblxuZXhwb3J0IGNvbnN0IEJ1bGxldExpc3QgPSBOb2RlLmNyZWF0ZTxCdWxsZXRMaXN0T3B0aW9ucz4oe1xuICBuYW1lOiAnYnVsbGV0TGlzdCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbVR5cGVOYW1lOiAnbGlzdEl0ZW0nLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAga2VlcE1hcmtzOiBmYWxzZSxcbiAgICAgIGtlZXBBdHRyaWJ1dGVzOiBmYWxzZSxcbiAgICB9XG4gIH0sXG5cbiAgZ3JvdXA6ICdibG9jayBsaXN0JyxcblxuICBjb250ZW50KCkge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lfStgXG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3VsJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3VsJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0b2dnbGVCdWxsZXRMaXN0OiAoKSA9PiAoeyBjb21tYW5kcywgY2hhaW4gfSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKCkudG9nZ2xlTGlzdCh0aGlzLm5hbWUsIHRoaXMub3B0aW9ucy5pdGVtVHlwZU5hbWUsIHRoaXMub3B0aW9ucy5rZWVwTWFya3MpLnVwZGF0ZUF0dHJpYnV0ZXMoTGlzdEl0ZW0ubmFtZSwgdGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhUZXh0U3R5bGUubmFtZSkpLnJ1bigpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZUxpc3QodGhpcy5uYW1lLCB0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lLCB0aGlzLm9wdGlvbnMua2VlcE1hcmtzKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtU2hpZnQtOCc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZUJ1bGxldExpc3QoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICBsZXQgaW5wdXRSdWxlID0gd3JhcHBpbmdJbnB1dFJ1bGUoe1xuICAgICAgZmluZDogaW5wdXRSZWdleCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5rZWVwTWFya3MgfHwgdGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICBpbnB1dFJ1bGUgPSB3cmFwcGluZ0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAga2VlcE1hcmtzOiB0aGlzLm9wdGlvbnMua2VlcE1hcmtzLFxuICAgICAgICBrZWVwQXR0cmlidXRlczogdGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzLFxuICAgICAgICBnZXRBdHRyaWJ1dGVzOiAoKSA9PiB7IHJldHVybiB0aGlzLmVkaXRvci5nZXRBdHRyaWJ1dGVzKFRleHRTdHlsZS5uYW1lKSB9LFxuICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIGlucHV0UnVsZSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7XG4gIE1hcmssXG4gIG1hcmtJbnB1dFJ1bGUsXG4gIG1hcmtQYXN0ZVJ1bGUsXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVPcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBjb2RlOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNldCBhIGNvZGUgbWFya1xuICAgICAgICovXG4gICAgICBzZXRDb2RlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgaW5saW5lIGNvZGVcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlQ29kZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBjb2RlIG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRDb2RlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaW5wdXRSZWdleCA9IC8oPzpefFxccykoKD86YCkoKD86W15gXSspKSg/OmApKSQvXG5leHBvcnQgY29uc3QgcGFzdGVSZWdleCA9IC8oPzpefFxccykoKD86YCkoKD86W15gXSspKSg/OmApKS9nXG5cbmV4cG9ydCBjb25zdCBDb2RlID0gTWFyay5jcmVhdGU8Q29kZU9wdGlvbnM+KHtcbiAgbmFtZTogJ2NvZGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgZXhjbHVkZXM6ICdfJyxcblxuICBjb2RlOiB0cnVlLFxuXG4gIGV4aXRhYmxlOiB0cnVlLFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgeyB0YWc6ICdjb2RlJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2NvZGUnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldENvZGU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUNvZGU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZU1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHVuc2V0Q29kZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLWUnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVDb2RlKCksXG4gICAgfVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hcmtJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiBpbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgYWRkUGFzdGVSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya1Bhc3RlUnVsZSh7XG4gICAgICAgIGZpbmQ6IHBhc3RlUmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgZ2V0TWFya0F0dHJpYnV0ZXMsXG4gIE1hcmssXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRleHRTdHlsZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRleHRTdHlsZToge1xuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgc3BhbnMgd2l0aG91dCBpbmxpbmUgc3R5bGUgYXR0cmlidXRlcy5cbiAgICAgICAqL1xuICAgICAgcmVtb3ZlRW1wdHlUZXh0U3R5bGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUZXh0U3R5bGUgPSBNYXJrLmNyZWF0ZTxUZXh0U3R5bGVPcHRpb25zPih7XG4gIG5hbWU6ICd0ZXh0U3R5bGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgICBnZXRBdHRyczogZWxlbWVudCA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzU3R5bGVzID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKVxuXG4gICAgICAgICAgaWYgKCFoYXNTdHlsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzcGFuJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZW1vdmVFbXB0eVRleHRTdHlsZTogKCkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdldE1hcmtBdHRyaWJ1dGVzKHN0YXRlLCB0aGlzLnR5cGUpXG4gICAgICAgIGNvbnN0IGhhc1N0eWxlcyA9IE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLnNvbWUoKFssIHZhbHVlXSkgPT4gISF2YWx1ZSlcblxuICAgICAgICBpZiAoaGFzU3R5bGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbn0pXG4iLCAiaW1wb3J0ICdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0LXN0eWxlJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCB0eXBlIENvbG9yT3B0aW9ucyA9IHtcbiAgdHlwZXM6IHN0cmluZ1tdLFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgY29sb3I6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IHRoZSB0ZXh0IGNvbG9yXG4gICAgICAgKi9cbiAgICAgIHNldENvbG9yOiAoY29sb3I6IHN0cmluZykgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgdGhlIHRleHQgY29sb3JcbiAgICAgICAqL1xuICAgICAgdW5zZXRDb2xvcjogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IENvbG9yID0gRXh0ZW5zaW9uLmNyZWF0ZTxDb2xvck9wdGlvbnM+KHtcbiAgbmFtZTogJ2NvbG9yJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlczogWyd0ZXh0U3R5bGUnXSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkR2xvYmFsQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0eXBlczogdGhpcy5vcHRpb25zLnR5cGVzLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5zdHlsZS5jb2xvcj8ucmVwbGFjZSgvWydcIl0rL2csICcnKSxcbiAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXMuY29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IGBjb2xvcjogJHthdHRyaWJ1dGVzLmNvbG9yfWAsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRDb2xvcjogY29sb3IgPT4gKHsgY2hhaW4gfSkgPT4ge1xuICAgICAgICByZXR1cm4gY2hhaW4oKVxuICAgICAgICAgIC5zZXRNYXJrKCd0ZXh0U3R5bGUnLCB7IGNvbG9yIH0pXG4gICAgICAgICAgLnJ1bigpXG4gICAgICB9LFxuICAgICAgdW5zZXRDb2xvcjogKCkgPT4gKHsgY2hhaW4gfSkgPT4ge1xuICAgICAgICByZXR1cm4gY2hhaW4oKVxuICAgICAgICAgIC5zZXRNYXJrKCd0ZXh0U3R5bGUnLCB7IGNvbG9yOiBudWxsIH0pXG4gICAgICAgICAgLnJlbW92ZUVtcHR5VGV4dFN0eWxlKClcbiAgICAgICAgICAucnVuKClcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgY29uc3QgRG9jdW1lbnQgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6ICdkb2MnLFxuICB0b3BOb2RlOiB0cnVlLFxuICBjb250ZW50OiAnYmxvY2srJyxcbn0pXG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgZHJvcFBvaW50IH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcblxuLyoqXG5DcmVhdGUgYSBwbHVnaW4gdGhhdCwgd2hlbiBhZGRlZCB0byBhIFByb3NlTWlycm9yIGluc3RhbmNlLFxuY2F1c2VzIGEgZGVjb3JhdGlvbiB0byBzaG93IHVwIGF0IHRoZSBkcm9wIHBvc2l0aW9uIHdoZW4gc29tZXRoaW5nXG5pcyBkcmFnZ2VkIG92ZXIgdGhlIGVkaXRvci5cblxuTm9kZXMgbWF5IGFkZCBhIGBkaXNhYmxlRHJvcEN1cnNvcmAgcHJvcGVydHkgdG8gdGhlaXIgc3BlYyB0b1xuY29udHJvbCB0aGUgc2hvd2luZyBvZiBhIGRyb3AgY3Vyc29yIGluc2lkZSB0aGVtLiBUaGlzIG1heSBiZSBhXG5ib29sZWFuIG9yIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggYSB2aWV3IGFuZCBhXG5wb3NpdGlvbiwgYW5kIHNob3VsZCByZXR1cm4gYSBib29sZWFuLlxuKi9cbmZ1bmN0aW9uIGRyb3BDdXJzb3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgICAgICB2aWV3KGVkaXRvclZpZXcpIHsgcmV0dXJuIG5ldyBEcm9wQ3Vyc29yVmlldyhlZGl0b3JWaWV3LCBvcHRpb25zKTsgfVxuICAgIH0pO1xufVxuY2xhc3MgRHJvcEN1cnNvclZpZXcge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRvclZpZXcsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmVkaXRvclZpZXcgPSBlZGl0b3JWaWV3O1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLndpZHRoID0gKF9hID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMTtcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdGlvbnMuY29sb3IgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogKG9wdGlvbnMuY29sb3IgfHwgXCJibGFja1wiKTtcbiAgICAgICAgdGhpcy5jbGFzcyA9IG9wdGlvbnMuY2xhc3M7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXCJkcmFnb3ZlclwiLCBcImRyYWdlbmRcIiwgXCJkcm9wXCIsIFwiZHJhZ2xlYXZlXCJdLm1hcChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gKGUpID0+IHsgdGhpc1tuYW1lXShlKTsgfTtcbiAgICAgICAgICAgIGVkaXRvclZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lLCBoYW5kbGVyIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmZvckVhY2goKHsgbmFtZSwgaGFuZGxlciB9KSA9PiB0aGlzLmVkaXRvclZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcikpO1xuICAgIH1cbiAgICB1cGRhdGUoZWRpdG9yVmlldywgcHJldlN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvclBvcyAhPSBudWxsICYmIHByZXZTdGF0ZS5kb2MgIT0gZWRpdG9yVmlldy5zdGF0ZS5kb2MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvclBvcyA+IGVkaXRvclZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnNvcihudWxsKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU92ZXJsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXJzb3IocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPT0gdGhpcy5jdXJzb3JQb3MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gcG9zO1xuICAgICAgICBpZiAocG9zID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlT3ZlcmxheSgpIHtcbiAgICAgICAgbGV0ICRwb3MgPSB0aGlzLmVkaXRvclZpZXcuc3RhdGUuZG9jLnJlc29sdmUodGhpcy5jdXJzb3JQb3MpO1xuICAgICAgICBsZXQgaXNCbG9jayA9ICEkcG9zLnBhcmVudC5pbmxpbmVDb250ZW50LCByZWN0O1xuICAgICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9ICRwb3Mubm9kZUJlZm9yZSwgYWZ0ZXIgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgICAgIGlmIChiZWZvcmUgfHwgYWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuZWRpdG9yVmlldy5ub2RlRE9NKHRoaXMuY3Vyc29yUG9zIC0gKGJlZm9yZSA/IGJlZm9yZS5ub2RlU2l6ZSA6IDApKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wID0gYmVmb3JlID8gbm9kZVJlY3QuYm90dG9tIDogbm9kZVJlY3QudG9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlICYmIGFmdGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gKHRvcCArIHRoaXMuZWRpdG9yVmlldy5ub2RlRE9NKHRoaXMuY3Vyc29yUG9zKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogbm9kZVJlY3QubGVmdCwgcmlnaHQ6IG5vZGVSZWN0LnJpZ2h0LCB0b3A6IHRvcCAtIHRoaXMud2lkdGggLyAyLCBib3R0b206IHRvcCArIHRoaXMud2lkdGggLyAyIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVjdCkge1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IHRoaXMuZWRpdG9yVmlldy5jb29yZHNBdFBvcyh0aGlzLmN1cnNvclBvcyk7XG4gICAgICAgICAgICByZWN0ID0geyBsZWZ0OiBjb29yZHMubGVmdCAtIHRoaXMud2lkdGggLyAyLCByaWdodDogY29vcmRzLmxlZnQgKyB0aGlzLndpZHRoIC8gMiwgdG9wOiBjb29yZHMudG9wLCBib3R0b206IGNvb3Jkcy5ib3R0b20gfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5lZGl0b3JWaWV3LmRvbS5vZmZzZXRQYXJlbnQ7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBwYXJlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGFzcylcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5jbGFzcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDUwOyBwb2ludGVyLWV2ZW50czogbm9uZTtcIjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJwcm9zZW1pcnJvci1kcm9wY3Vyc29yLWJsb2NrXCIsIGlzQmxvY2spO1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShcInByb3NlbWlycm9yLWRyb3BjdXJzb3ItaW5saW5lXCIsICFpc0Jsb2NrKTtcbiAgICAgICAgbGV0IHBhcmVudExlZnQsIHBhcmVudFRvcDtcbiAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09IGRvY3VtZW50LmJvZHkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpLnBvc2l0aW9uID09IFwic3RhdGljXCIpIHtcbiAgICAgICAgICAgIHBhcmVudExlZnQgPSAtcGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICBwYXJlbnRUb3AgPSAtcGFnZVlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHBhcmVudExlZnQgPSByZWN0LmxlZnQgLSBwYXJlbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIHBhcmVudFRvcCA9IHJlY3QudG9wIC0gcGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9IChyZWN0LmxlZnQgLSBwYXJlbnRMZWZ0KSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRvcCA9IChyZWN0LnRvcCAtIHBhcmVudFRvcCkgKyBcInB4XCI7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IChyZWN0LmJvdHRvbSAtIHJlY3QudG9wKSArIFwicHhcIjtcbiAgICB9XG4gICAgc2NoZWR1bGVSZW1vdmFsKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRDdXJzb3IobnVsbCksIHRpbWVvdXQpO1xuICAgIH1cbiAgICBkcmFnb3ZlcihldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuZWRpdG9yVmlldy5lZGl0YWJsZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuZWRpdG9yVmlldy5wb3NBdENvb3Jkcyh7IGxlZnQ6IGV2ZW50LmNsaWVudFgsIHRvcDogZXZlbnQuY2xpZW50WSB9KTtcbiAgICAgICAgbGV0IG5vZGUgPSBwb3MgJiYgcG9zLmluc2lkZSA+PSAwICYmIHRoaXMuZWRpdG9yVmlldy5zdGF0ZS5kb2Mubm9kZUF0KHBvcy5pbnNpZGUpO1xuICAgICAgICBsZXQgZGlzYWJsZURyb3BDdXJzb3IgPSBub2RlICYmIG5vZGUudHlwZS5zcGVjLmRpc2FibGVEcm9wQ3Vyc29yO1xuICAgICAgICBsZXQgZGlzYWJsZWQgPSB0eXBlb2YgZGlzYWJsZURyb3BDdXJzb3IgPT0gXCJmdW5jdGlvblwiID8gZGlzYWJsZURyb3BDdXJzb3IodGhpcy5lZGl0b3JWaWV3LCBwb3MsIGV2ZW50KSA6IGRpc2FibGVEcm9wQ3Vyc29yO1xuICAgICAgICBpZiAocG9zICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHBvcy5wb3M7XG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3JWaWV3LmRyYWdnaW5nICYmIHRoaXMuZWRpdG9yVmlldy5kcmFnZ2luZy5zbGljZSkge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IGRyb3BQb2ludCh0aGlzLmVkaXRvclZpZXcuc3RhdGUuZG9jLCB0YXJnZXQsIHRoaXMuZWRpdG9yVmlldy5kcmFnZ2luZy5zbGljZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvaW50ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3IodGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZW1vdmFsKDUwMDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRyYWdlbmQoKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZW1vdmFsKDIwKTtcbiAgICB9XG4gICAgZHJvcCgpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlbW92YWwoMjApO1xuICAgIH1cbiAgICBkcmFnbGVhdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PSB0aGlzLmVkaXRvclZpZXcuZG9tIHx8ICF0aGlzLmVkaXRvclZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3IobnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBkcm9wQ3Vyc29yIH07XG4iLCAiaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgZHJvcEN1cnNvciB9IGZyb20gJ0B0aXB0YXAvcG0vZHJvcGN1cnNvcidcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wY3Vyc29yT3B0aW9ucyB7XG4gIGNvbG9yOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGNsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG59XG5cbmV4cG9ydCBjb25zdCBEcm9wY3Vyc29yID0gRXh0ZW5zaW9uLmNyZWF0ZTxEcm9wY3Vyc29yT3B0aW9ucz4oe1xuICBuYW1lOiAnZHJvcEN1cnNvcicsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6ICdjdXJyZW50Q29sb3InLFxuICAgICAgd2lkdGg6IDEsXG4gICAgICBjbGFzczogdW5kZWZpbmVkLFxuICAgIH1cbiAgfSxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGRyb3BDdXJzb3IodGhpcy5vcHRpb25zKSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IGtleWRvd25IYW5kbGVyIH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7IFNlbGVjdGlvbiwgTm9kZVNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiwgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgU2xpY2UsIEZyYWdtZW50IH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgRGVjb3JhdGlvblNldCwgRGVjb3JhdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuXG4vKipcbkdhcCBjdXJzb3Igc2VsZWN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhpcyBjbGFzcy4gSXRzXG5gJGFuY2hvcmAgYW5kIGAkaGVhZGAgcHJvcGVydGllcyBib3RoIHBvaW50IGF0IHRoZSBjdXJzb3IgcG9zaXRpb24uXG4qL1xuY2xhc3MgR2FwQ3Vyc29yIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBnYXAgY3Vyc29yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoJHBvcykge1xuICAgICAgICBzdXBlcigkcG9zLCAkcG9zKTtcbiAgICB9XG4gICAgbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHRoaXMuaGVhZCkpO1xuICAgICAgICByZXR1cm4gR2FwQ3Vyc29yLnZhbGlkKCRwb3MpID8gbmV3IEdhcEN1cnNvcigkcG9zKSA6IFNlbGVjdGlvbi5uZWFyKCRwb3MpO1xuICAgIH1cbiAgICBjb250ZW50KCkgeyByZXR1cm4gU2xpY2UuZW1wdHk7IH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBHYXBDdXJzb3IgJiYgb3RoZXIuaGVhZCA9PSB0aGlzLmhlYWQ7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJnYXBjdXJzb3JcIiwgcG9zOiB0aGlzLmhlYWQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgR2FwQ3Vyc29yLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEdhcEN1cnNvcihkb2MucmVzb2x2ZShqc29uLnBvcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldEJvb2ttYXJrKCkgeyByZXR1cm4gbmV3IEdhcEJvb2ttYXJrKHRoaXMuYW5jaG9yKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHZhbGlkKCRwb3MpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRwb3MucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50LmlzVGV4dGJsb2NrIHx8ICFjbG9zZWRCZWZvcmUoJHBvcykgfHwgIWNsb3NlZEFmdGVyKCRwb3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgb3ZlcnJpZGUgPSBwYXJlbnQudHlwZS5zcGVjLmFsbG93R2FwQ3Vyc29yO1xuICAgICAgICBpZiAob3ZlcnJpZGUgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBvdmVycmlkZTtcbiAgICAgICAgbGV0IGRlZmx0ID0gcGFyZW50LmNvbnRlbnRNYXRjaEF0KCRwb3MuaW5kZXgoKSkuZGVmYXVsdFR5cGU7XG4gICAgICAgIHJldHVybiBkZWZsdCAmJiBkZWZsdC5pc1RleHRibG9jaztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEdhcEN1cnNvckZyb20oJHBvcywgZGlyLCBtdXN0TW92ZSA9IGZhbHNlKSB7XG4gICAgICAgIHNlYXJjaDogZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKCFtdXN0TW92ZSAmJiBHYXBDdXJzb3IudmFsaWQoJHBvcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuICRwb3M7XG4gICAgICAgICAgICBsZXQgcG9zID0gJHBvcy5wb3MsIG5leHQgPSBudWxsO1xuICAgICAgICAgICAgLy8gU2NhbiB1cCBmcm9tIHRoaXMgcG9zaXRpb25cbiAgICAgICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOzsgZC0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9ICRwb3Mubm9kZShkKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyID4gMCA/ICRwb3MuaW5kZXhBZnRlcihkKSA8IHBhcmVudC5jaGlsZENvdW50IDogJHBvcy5pbmRleChkKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHBhcmVudC5jaGlsZChkaXIgPiAwID8gJHBvcy5pbmRleEFmdGVyKGQpIDogJHBvcy5pbmRleChkKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgKz0gZGlyO1xuICAgICAgICAgICAgICAgIGxldCAkY3VyID0gJHBvcy5kb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICAgICAgICAgIGlmIChHYXBDdXJzb3IudmFsaWQoJGN1cikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkY3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQW5kIHRoZW4gZG93biBpbnRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5zaWRlID0gZGlyID4gMCA/IG5leHQuZmlyc3RDaGlsZCA6IG5leHQubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgIGlmICghaW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmlzQXRvbSAmJiAhbmV4dC5pc1RleHQgJiYgIU5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkcG9zID0gJHBvcy5kb2MucmVzb2x2ZShwb3MgKyBuZXh0Lm5vZGVTaXplICogZGlyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11c3RNb3ZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzZWFyY2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgPSBpbnNpZGU7XG4gICAgICAgICAgICAgICAgcG9zICs9IGRpcjtcbiAgICAgICAgICAgICAgICBsZXQgJGN1ciA9ICRwb3MuZG9jLnJlc29sdmUocG9zKTtcbiAgICAgICAgICAgICAgICBpZiAoR2FwQ3Vyc29yLnZhbGlkKCRjdXIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGN1cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuR2FwQ3Vyc29yLnByb3RvdHlwZS52aXNpYmxlID0gZmFsc2U7XG5HYXBDdXJzb3IuZmluZEZyb20gPSBHYXBDdXJzb3IuZmluZEdhcEN1cnNvckZyb207XG5TZWxlY3Rpb24uanNvbklEKFwiZ2FwY3Vyc29yXCIsIEdhcEN1cnNvcik7XG5jbGFzcyBHYXBCb29rbWFyayB7XG4gICAgY29uc3RydWN0b3IocG9zKSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICByZXR1cm4gbmV3IEdhcEJvb2ttYXJrKG1hcHBpbmcubWFwKHRoaXMucG9zKSk7XG4gICAgfVxuICAgIHJlc29sdmUoZG9jKSB7XG4gICAgICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUodGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gR2FwQ3Vyc29yLnZhbGlkKCRwb3MpID8gbmV3IEdhcEN1cnNvcigkcG9zKSA6IFNlbGVjdGlvbi5uZWFyKCRwb3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsb3NlZEJlZm9yZSgkcG9zKSB7XG4gICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXgoZCksIHBhcmVudCA9ICRwb3Mubm9kZShkKTtcbiAgICAgICAgLy8gQXQgdGhlIHN0YXJ0IG9mIHRoaXMgcGFyZW50LCBsb29rIGF0IG5leHQgb25lXG4gICAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWUgaWYgdGhlIG5vZGUgYmVmb3JlIChvciBpdHMgZmlyc3QgYW5jZXN0b3IpIGlzIGNsb3NlZFxuICAgICAgICBmb3IgKGxldCBiZWZvcmUgPSBwYXJlbnQuY2hpbGQoaW5kZXggLSAxKTs7IGJlZm9yZSA9IGJlZm9yZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmICgoYmVmb3JlLmNoaWxkQ291bnQgPT0gMCAmJiAhYmVmb3JlLmlubGluZUNvbnRlbnQpIHx8IGJlZm9yZS5pc0F0b20gfHwgYmVmb3JlLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoYmVmb3JlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhpdCBzdGFydCBvZiBkb2N1bWVudFxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY2xvc2VkQWZ0ZXIoJHBvcykge1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4QWZ0ZXIoZCksIHBhcmVudCA9ICRwb3Mubm9kZShkKTtcbiAgICAgICAgaWYgKGluZGV4ID09IHBhcmVudC5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBhZnRlciA9IHBhcmVudC5jaGlsZChpbmRleCk7OyBhZnRlciA9IGFmdGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmICgoYWZ0ZXIuY2hpbGRDb3VudCA9PSAwICYmICFhZnRlci5pbmxpbmVDb250ZW50KSB8fCBhZnRlci5pc0F0b20gfHwgYWZ0ZXIudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChhZnRlci5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG5DcmVhdGUgYSBnYXAgY3Vyc29yIHBsdWdpbi4gV2hlbiBlbmFibGVkLCB0aGlzIHdpbGwgY2FwdHVyZSBjbGlja3Ncbm5lYXIgYW5kIGFycm93LWtleS1tb3Rpb24gcGFzdCBwbGFjZXMgdGhhdCBkb24ndCBoYXZlIGEgbm9ybWFsbHlcbnNlbGVjdGFibGUgcG9zaXRpb24gbmVhcmJ5LCBhbmQgY3JlYXRlIGEgZ2FwIGN1cnNvciBzZWxlY3Rpb24gZm9yXG50aGVtLiBUaGUgY3Vyc29yIGlzIGRyYXduIGFzIGFuIGVsZW1lbnQgd2l0aCBjbGFzc1xuYFByb3NlTWlycm9yLWdhcGN1cnNvcmAuIFlvdSBjYW4gZWl0aGVyIGluY2x1ZGVcbmBzdHlsZS9nYXBjdXJzb3IuY3NzYCBmcm9tIHRoZSBwYWNrYWdlJ3MgZGlyZWN0b3J5IG9yIGFkZCB5b3VyIG93blxuc3R5bGVzIHRvIG1ha2UgaXQgdmlzaWJsZS5cbiovXG5mdW5jdGlvbiBnYXBDdXJzb3IoKSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZGVjb3JhdGlvbnM6IGRyYXdHYXBDdXJzb3IsXG4gICAgICAgICAgICBjcmVhdGVTZWxlY3Rpb25CZXR3ZWVuKF92aWV3LCAkYW5jaG9yLCAkaGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkYW5jaG9yLnBvcyA9PSAkaGVhZC5wb3MgJiYgR2FwQ3Vyc29yLnZhbGlkKCRoZWFkKSA/IG5ldyBHYXBDdXJzb3IoJGhlYWQpIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYW5kbGVDbGljayxcbiAgICAgICAgICAgIGhhbmRsZUtleURvd24sXG4gICAgICAgICAgICBoYW5kbGVET01FdmVudHM6IHsgYmVmb3JlaW5wdXQ6IGJlZm9yZWlucHV0IH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuY29uc3QgaGFuZGxlS2V5RG93biA9IGtleWRvd25IYW5kbGVyKHtcbiAgICBcIkFycm93TGVmdFwiOiBhcnJvdyhcImhvcml6XCIsIC0xKSxcbiAgICBcIkFycm93UmlnaHRcIjogYXJyb3coXCJob3JpelwiLCAxKSxcbiAgICBcIkFycm93VXBcIjogYXJyb3coXCJ2ZXJ0XCIsIC0xKSxcbiAgICBcIkFycm93RG93blwiOiBhcnJvdyhcInZlcnRcIiwgMSlcbn0pO1xuZnVuY3Rpb24gYXJyb3coYXhpcywgZGlyKSB7XG4gICAgY29uc3QgZGlyU3RyID0gYXhpcyA9PSBcInZlcnRcIiA/IChkaXIgPiAwID8gXCJkb3duXCIgOiBcInVwXCIpIDogKGRpciA+IDAgPyBcInJpZ2h0XCIgOiBcImxlZnRcIik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpIHtcbiAgICAgICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0ICRzdGFydCA9IGRpciA+IDAgPyBzZWwuJHRvIDogc2VsLiRmcm9tLCBtdXN0TW92ZSA9IHNlbC5lbXB0eTtcbiAgICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghdmlldy5lbmRPZlRleHRibG9jayhkaXJTdHIpIHx8ICRzdGFydC5kZXB0aCA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG11c3RNb3ZlID0gZmFsc2U7XG4gICAgICAgICAgICAkc3RhcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShkaXIgPiAwID8gJHN0YXJ0LmFmdGVyKCkgOiAkc3RhcnQuYmVmb3JlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCAkZm91bmQgPSBHYXBDdXJzb3IuZmluZEdhcEN1cnNvckZyb20oJHN0YXJ0LCBkaXIsIG11c3RNb3ZlKTtcbiAgICAgICAgaWYgKCEkZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXcgR2FwQ3Vyc29yKCRmb3VuZCkpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUNsaWNrKHZpZXcsIHBvcywgZXZlbnQpIHtcbiAgICBpZiAoIXZpZXcgfHwgIXZpZXcuZWRpdGFibGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIUdhcEN1cnNvci52YWxpZCgkcG9zKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBjbGlja1BvcyA9IHZpZXcucG9zQXRDb29yZHMoeyBsZWZ0OiBldmVudC5jbGllbnRYLCB0b3A6IGV2ZW50LmNsaWVudFkgfSk7XG4gICAgaWYgKGNsaWNrUG9zICYmIGNsaWNrUG9zLmluc2lkZSA+IC0xICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKHZpZXcuc3RhdGUuZG9jLm5vZGVBdChjbGlja1Bvcy5pbnNpZGUpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24obmV3IEdhcEN1cnNvcigkcG9zKSkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuLy8gVGhpcyBpcyBhIGhhY2sgdGhhdCwgd2hlbiBhIGNvbXBvc2l0aW9uIHN0YXJ0cyB3aGlsZSBhIGdhcCBjdXJzb3Jcbi8vIGlzIGFjdGl2ZSwgcXVpY2tseSBjcmVhdGVzIGFuIGlubGluZSBjb250ZXh0IGZvciB0aGUgY29tcG9zaXRpb24gdG9cbi8vIGhhcHBlbiBpbiwgdG8gYXZvaWQgaXQgYmVpbmcgYWJvcnRlZCBieSB0aGUgRE9NIHNlbGVjdGlvbiBiZWluZ1xuLy8gbW92ZWQgaW50byBhIHZhbGlkIHBvc2l0aW9uLlxuZnVuY3Rpb24gYmVmb3JlaW5wdXQodmlldywgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuaW5wdXRUeXBlICE9IFwiaW5zZXJ0Q29tcG9zaXRpb25UZXh0XCIgfHwgISh2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIEdhcEN1cnNvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgeyAkZnJvbSB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IGluc2VydCA9ICRmcm9tLnBhcmVudC5jb250ZW50TWF0Y2hBdCgkZnJvbS5pbmRleCgpKS5maW5kV3JhcHBpbmcodmlldy5zdGF0ZS5zY2hlbWEubm9kZXMudGV4dCk7XG4gICAgaWYgKCFpbnNlcnQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZnJhZyA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSBpbnNlcnQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIGZyYWcgPSBGcmFnbWVudC5mcm9tKGluc2VydFtpXS5jcmVhdGVBbmRGaWxsKG51bGwsIGZyYWcpKTtcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnJlcGxhY2UoJGZyb20ucG9zLCAkZnJvbS5wb3MsIG5ldyBTbGljZShmcmFnLCAwLCAwKSk7XG4gICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZSgkZnJvbS5wb3MgKyAxKSkpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRyYXdHYXBDdXJzb3Ioc3RhdGUpIHtcbiAgICBpZiAoIShzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBHYXBDdXJzb3IpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbm9kZS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLWdhcGN1cnNvclwiO1xuICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmNyZWF0ZShzdGF0ZS5kb2MsIFtEZWNvcmF0aW9uLndpZGdldChzdGF0ZS5zZWxlY3Rpb24uaGVhZCwgbm9kZSwgeyBrZXk6IFwiZ2FwY3Vyc29yXCIgfSldKTtcbn1cblxuZXhwb3J0IHsgR2FwQ3Vyc29yLCBnYXBDdXJzb3IgfTtcbiIsICJpbXBvcnQge1xuICBjYWxsT3JSZXR1cm4sXG4gIEV4dGVuc2lvbixcbiAgZ2V0RXh0ZW5zaW9uRmllbGQsXG4gIFBhcmVudENvbmZpZyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgZ2FwQ3Vyc29yIH0gZnJvbSAnQHRpcHRhcC9wbS9nYXBjdXJzb3InXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4ge1xuICAgIC8qKlxuICAgICAqIEFsbG93IGdhcCBjdXJzb3JcbiAgICAgKi9cbiAgICBhbGxvd0dhcEN1cnNvcj86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgbnVsbFxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zOiBPcHRpb25zLFxuICAgICAgICBzdG9yYWdlOiBTdG9yYWdlLFxuICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnM+PlsnYWxsb3dHYXBDdXJzb3InXSxcbiAgICAgIH0pID0+IGJvb2xlYW4gfCBudWxsKSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgR2FwY3Vyc29yID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gIG5hbWU6ICdnYXBDdXJzb3InLFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgZ2FwQ3Vyc29yKCksXG4gICAgXVxuICB9LFxuXG4gIGV4dGVuZE5vZGVTY2hlbWEoZXh0ZW5zaW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dHYXBDdXJzb3I6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZChleHRlbnNpb24sICdhbGxvd0dhcEN1cnNvcicsIGNvbnRleHQpKSA/PyBudWxsLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhcmRCcmVha09wdGlvbnMge1xuICBrZWVwTWFya3M6IGJvb2xlYW4sXG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaGFyZEJyZWFrOiB7XG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIGhhcmQgYnJlYWtcbiAgICAgICAqL1xuICAgICAgc2V0SGFyZEJyZWFrOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSGFyZEJyZWFrID0gTm9kZS5jcmVhdGU8SGFyZEJyZWFrT3B0aW9ucz4oe1xuICBuYW1lOiAnaGFyZEJyZWFrJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBrZWVwTWFya3M6IHRydWUsXG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIGlubGluZTogdHJ1ZSxcblxuICBncm91cDogJ2lubGluZScsXG5cbiAgc2VsZWN0YWJsZTogZmFsc2UsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ2JyJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2JyJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpXVxuICB9LFxuXG4gIHJlbmRlclRleHQoKSB7XG4gICAgcmV0dXJuICdcXG4nXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldEhhcmRCcmVhazogKCkgPT4gKHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGNoYWluLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZWRpdG9yLFxuICAgICAgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMuZmlyc3QoW1xuICAgICAgICAgICgpID0+IGNvbW1hbmRzLmV4aXRDb2RlKCksXG4gICAgICAgICAgKCkgPT4gY29tbWFuZHMuY29tbWFuZCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgc3RvcmVkTWFya3MgfSA9IHN0YXRlXG5cbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uJGZyb20ucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHsga2VlcE1hcmtzIH0gPSB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IHsgc3BsaXR0YWJsZU1hcmtzIH0gPSBlZGl0b3IuZXh0ZW5zaW9uTWFuYWdlclxuICAgICAgICAgICAgY29uc3QgbWFya3MgPSBzdG9yZWRNYXJrc1xuICAgICAgICAgICAgICB8fCAoc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpXG5cbiAgICAgICAgICAgIHJldHVybiBjaGFpbigpXG4gICAgICAgICAgICAgIC5pbnNlcnRDb250ZW50KHsgdHlwZTogdGhpcy5uYW1lIH0pXG4gICAgICAgICAgICAgIC5jb21tYW5kKCh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoICYmIG1hcmtzICYmIGtlZXBNYXJrcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobWFyayA9PiBzcGxpdHRhYmxlTWFya3MuaW5jbHVkZXMobWFyay50eXBlLm5hbWUpKVxuXG4gICAgICAgICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhmaWx0ZXJlZE1hcmtzKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5ydW4oKVxuICAgICAgICAgIH0pLFxuICAgICAgICBdKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtRW50ZXInOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zZXRIYXJkQnJlYWsoKSxcbiAgICAgICdTaGlmdC1FbnRlcic6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldEhhcmRCcmVhaygpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlLCB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgdHlwZSBMZXZlbCA9IDEgfCAyIHwgMyB8IDQgfCA1IHwgNlxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRpbmdPcHRpb25zIHtcbiAgbGV2ZWxzOiBMZXZlbFtdLFxuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGhlYWRpbmc6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgaGVhZGluZyBub2RlXG4gICAgICAgKi9cbiAgICAgIHNldEhlYWRpbmc6IChhdHRyaWJ1dGVzOiB7IGxldmVsOiBMZXZlbCB9KSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgYSBoZWFkaW5nIG5vZGVcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlSGVhZGluZzogKGF0dHJpYnV0ZXM6IHsgbGV2ZWw6IExldmVsIH0pID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBIZWFkaW5nID0gTm9kZS5jcmVhdGU8SGVhZGluZ09wdGlvbnM+KHtcbiAgbmFtZTogJ2hlYWRpbmcnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsczogWzEsIDIsIDMsIDQsIDUsIDZdLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAnaW5saW5lKicsXG5cbiAgZ3JvdXA6ICdibG9jaycsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IHtcbiAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgcmVuZGVyZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGV2ZWxzXG4gICAgICAubWFwKChsZXZlbDogTGV2ZWwpID0+ICh7XG4gICAgICAgIHRhZzogYGgke2xldmVsfWAsXG4gICAgICAgIGF0dHJzOiB7IGxldmVsIH0sXG4gICAgICB9KSlcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgbm9kZSwgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIGNvbnN0IGhhc0xldmVsID0gdGhpcy5vcHRpb25zLmxldmVscy5pbmNsdWRlcyhub2RlLmF0dHJzLmxldmVsKVxuICAgIGNvbnN0IGxldmVsID0gaGFzTGV2ZWxcbiAgICAgID8gbm9kZS5hdHRycy5sZXZlbFxuICAgICAgOiB0aGlzLm9wdGlvbnMubGV2ZWxzWzBdXG5cbiAgICByZXR1cm4gW2BoJHtsZXZlbH1gLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldEhlYWRpbmc6IGF0dHJpYnV0ZXMgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sZXZlbHMuaW5jbHVkZXMoYXR0cmlidXRlcy5sZXZlbCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgIH0sXG4gICAgICB0b2dnbGVIZWFkaW5nOiBhdHRyaWJ1dGVzID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubGV2ZWxzLmluY2x1ZGVzKGF0dHJpYnV0ZXMubGV2ZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTm9kZSh0aGlzLm5hbWUsICdwYXJhZ3JhcGgnLCBhdHRyaWJ1dGVzKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZXZlbHMucmVkdWNlKChpdGVtcywgbGV2ZWwpID0+ICh7XG4gICAgICAuLi5pdGVtcyxcbiAgICAgIC4uLntcbiAgICAgICAgW2BNb2QtQWx0LSR7bGV2ZWx9YF06ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbCB9KSxcbiAgICAgIH0sXG4gICAgfSksIHt9KVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZXZlbHMubWFwKGxldmVsID0+IHtcbiAgICAgIHJldHVybiB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogbmV3IFJlZ0V4cChgXigjezEsJHtsZXZlbH19KVxcXFxzJGApLFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGdldEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSxcbn0pXG4iLCAidmFyIEdPT0RfTEVBRl9TSVpFID0gMjAwO1xuXG4vLyA6OiBjbGFzczxUPiBBIHJvcGUgc2VxdWVuY2UgaXMgYSBwZXJzaXN0ZW50IHNlcXVlbmNlIGRhdGEgc3RydWN0dXJlXG4vLyB0aGF0IHN1cHBvcnRzIGFwcGVuZGluZywgcHJlcGVuZGluZywgYW5kIHNsaWNpbmcgd2l0aG91dCBkb2luZyBhXG4vLyBmdWxsIGNvcHkuIEl0IGlzIHJlcHJlc2VudGVkIGFzIGEgbW9zdGx5LWJhbGFuY2VkIHRyZWUuXG52YXIgUm9wZVNlcXVlbmNlID0gZnVuY3Rpb24gUm9wZVNlcXVlbmNlICgpIHt9O1xuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAob3RoZXIpIHtcbiAgaWYgKCFvdGhlci5sZW5ndGgpIHsgcmV0dXJuIHRoaXMgfVxuICBvdGhlciA9IFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKTtcblxuICByZXR1cm4gKCF0aGlzLmxlbmd0aCAmJiBvdGhlcikgfHxcbiAgICAob3RoZXIubGVuZ3RoIDwgR09PRF9MRUFGX1NJWkUgJiYgdGhpcy5sZWFmQXBwZW5kKG90aGVyKSkgfHxcbiAgICAodGhpcy5sZW5ndGggPCBHT09EX0xFQUZfU0laRSAmJiBvdGhlci5sZWFmUHJlcGVuZCh0aGlzKSkgfHxcbiAgICB0aGlzLmFwcGVuZElubmVyKG90aGVyKVxufTtcblxuLy8gOjogKHVuaW9uPFtUXSwgUm9wZVNlcXVlbmNlPFQ+PikgXHUyMTkyIFJvcGVTZXF1ZW5jZTxUPlxuLy8gUHJlcGVuZCBhbiBhcnJheSBvciBvdGhlciByb3BlIHRvIHRoaXMgb25lLCByZXR1cm5pbmcgYSBuZXcgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIHByZXBlbmQgKG90aGVyKSB7XG4gIGlmICghb3RoZXIubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgcmV0dXJuIFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKS5hcHBlbmQodGhpcylcbn07XG5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuYXBwZW5kSW5uZXIgPSBmdW5jdGlvbiBhcHBlbmRJbm5lciAob3RoZXIpIHtcbiAgcmV0dXJuIG5ldyBBcHBlbmQodGhpcywgb3RoZXIpXG59O1xuXG4vLyA6OiAoP251bWJlciwgP251bWJlcikgXHUyMTkyIFJvcGVTZXF1ZW5jZTxUPlxuLy8gQ3JlYXRlIGEgcm9wZSByZXBlc2VudGluZyBhIHN1Yi1zZXF1ZW5jZSBvZiB0aGlzIHJvcGUuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIGlmIChmcm9tID49IHRvKSB7IHJldHVybiBSb3BlU2VxdWVuY2UuZW1wdHkgfVxuICByZXR1cm4gdGhpcy5zbGljZUlubmVyKE1hdGgubWF4KDAsIGZyb20pLCBNYXRoLm1pbih0aGlzLmxlbmd0aCwgdG8pKVxufTtcblxuLy8gOjogKG51bWJlcikgXHUyMTkyIFRcbi8vIFJldHJpZXZlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoaXMgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpKSB7XG4gIGlmIChpIDwgMCB8fCBpID49IHRoaXMubGVuZ3RoKSB7IHJldHVybiB1bmRlZmluZWQgfVxuICByZXR1cm4gdGhpcy5nZXRJbm5lcihpKVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSBcdTIxOTIgP2Jvb2wsID9udW1iZXIsID9udW1iZXIpXG4vLyBDYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBlbGVtZW50IGJldHdlZW4gdGhlIGdpdmVuXG4vLyBpbmRpY2VzLiBUaGlzIHRlbmRzIHRvIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gbG9vcGluZyBvdmVyIHRoZVxuLy8gaW5kaWNlcyBhbmQgY2FsbGluZyBgZ2V0YCwgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgdG8gZGVzY2VuZCB0aGVcbi8vIHRyZWUgZm9yIGV2ZXJ5IGVsZW1lbnQuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoIChmLCBmcm9tLCB0bykge1xuICAgIGlmICggZnJvbSA9PT0gdm9pZCAwICkgZnJvbSA9IDA7XG4gICAgaWYgKCB0byA9PT0gdm9pZCAwICkgdG8gPSB0aGlzLmxlbmd0aDtcblxuICBpZiAoZnJvbSA8PSB0bylcbiAgICB7IHRoaXMuZm9yRWFjaElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLmZvckVhY2hJbnZlcnRlZElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSBcdTIxOTIgVSwgP251bWJlciwgP251bWJlcikgXHUyMTkyIFtVXVxuLy8gTWFwIHRoZSBnaXZlbiBmdW5jdGlvbnMgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHJvcGUsIHByb2R1Y2luZ1xuLy8gYSBmbGF0IGFycmF5LlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAgKGYsIGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbHQsIGkpIHsgcmV0dXJuIHJlc3VsdC5wdXNoKGYoZWx0LCBpKSk7IH0sIGZyb20sIHRvKTtcbiAgcmV0dXJuIHJlc3VsdFxufTtcblxuLy8gOjogKD91bmlvbjxbVF0sIFJvcGVTZXF1ZW5jZTxUPj4pIFx1MjE5MiBSb3BlU2VxdWVuY2U8VD5cbi8vIENyZWF0ZSBhIHJvcGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBhcnJheSwgb3IgcmV0dXJuIHRoZSByb3BlXG4vLyBpdHNlbGYgaWYgYSByb3BlIHdhcyBnaXZlbi5cblJvcGVTZXF1ZW5jZS5mcm9tID0gZnVuY3Rpb24gZnJvbSAodmFsdWVzKSB7XG4gIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBSb3BlU2VxdWVuY2UpIHsgcmV0dXJuIHZhbHVlcyB9XG4gIHJldHVybiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA/IG5ldyBMZWFmKHZhbHVlcykgOiBSb3BlU2VxdWVuY2UuZW1wdHlcbn07XG5cbnZhciBMZWFmID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIExlYWYodmFsdWVzKSB7XG4gICAgUm9wZVNlcXVlbmNlLmNhbGwodGhpcyk7XG4gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIExlYWYuX19wcm90b19fID0gUm9wZVNlcXVlbmNlO1xuICBMZWFmLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFJvcGVTZXF1ZW5jZSAmJiBSb3BlU2VxdWVuY2UucHJvdG90eXBlICk7XG4gIExlYWYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGVhZjtcblxuICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBsZW5ndGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGVwdGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICBMZWFmLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgcmV0dXJuIG5ldyBMZWFmKHRoaXMudmFsdWVzLnNsaWNlKGZyb20sIHRvKSlcbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5nZXRJbm5lciA9IGZ1bmN0aW9uIGdldElubmVyIChpKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2ldXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaElubmVyID0gZnVuY3Rpb24gZm9yRWFjaElubmVyIChmLCBmcm9tLCB0bywgc3RhcnQpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbTsgaSA8IHRvOyBpKyspXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaEludmVydGVkSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW52ZXJ0ZWRJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgZm9yICh2YXIgaSA9IGZyb20gLSAxOyBpID49IHRvOyBpLS0pXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUubGVhZkFwcGVuZCA9IGZ1bmN0aW9uIGxlYWZBcHBlbmQgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoIDw9IEdPT0RfTEVBRl9TSVpFKVxuICAgICAgeyByZXR1cm4gbmV3IExlYWYodGhpcy52YWx1ZXMuY29uY2F0KG90aGVyLmZsYXR0ZW4oKSkpIH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aCA8PSBHT09EX0xFQUZfU0laRSlcbiAgICAgIHsgcmV0dXJuIG5ldyBMZWFmKG90aGVyLmZsYXR0ZW4oKS5jb25jYXQodGhpcy52YWx1ZXMpKSB9XG4gIH07XG5cbiAgcHJvdG90eXBlQWNjZXNzb3JzLmxlbmd0aC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggfTtcblxuICBwcm90b3R5cGVBY2Nlc3NvcnMuZGVwdGguZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMCB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMZWFmLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgcmV0dXJuIExlYWY7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG4vLyA6OiBSb3BlU2VxdWVuY2Vcbi8vIFRoZSBlbXB0eSByb3BlIHNlcXVlbmNlLlxuUm9wZVNlcXVlbmNlLmVtcHR5ID0gbmV3IExlYWYoW10pO1xuXG52YXIgQXBwZW5kID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIEFwcGVuZChsZWZ0LCByaWdodCkge1xuICAgIFJvcGVTZXF1ZW5jZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgIHRoaXMubGVuZ3RoID0gbGVmdC5sZW5ndGggKyByaWdodC5sZW5ndGg7XG4gICAgdGhpcy5kZXB0aCA9IE1hdGgubWF4KGxlZnQuZGVwdGgsIHJpZ2h0LmRlcHRoKSArIDE7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIEFwcGVuZC5fX3Byb3RvX18gPSBSb3BlU2VxdWVuY2U7XG4gIEFwcGVuZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBSb3BlU2VxdWVuY2UgJiYgUm9wZVNlcXVlbmNlLnByb3RvdHlwZSApO1xuICBBcHBlbmQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXBwZW5kO1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZmxhdHRlbiA9IGZ1bmN0aW9uIGZsYXR0ZW4gKCkge1xuICAgIHJldHVybiB0aGlzLmxlZnQuZmxhdHRlbigpLmNvbmNhdCh0aGlzLnJpZ2h0LmZsYXR0ZW4oKSlcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmdldElubmVyID0gZnVuY3Rpb24gZ2V0SW5uZXIgKGkpIHtcbiAgICByZXR1cm4gaSA8IHRoaXMubGVmdC5sZW5ndGggPyB0aGlzLmxlZnQuZ2V0KGkpIDogdGhpcy5yaWdodC5nZXQoaSAtIHRoaXMubGVmdC5sZW5ndGgpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5mb3JFYWNoSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA8IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hJbm5lcihmLCBmcm9tLCBNYXRoLm1pbih0bywgbGVmdExlbiksIHN0YXJ0KSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvID4gbGVmdExlbiAmJlxuICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hJbm5lcihmLCBNYXRoLm1heChmcm9tIC0gbGVmdExlbiwgMCksIE1hdGgubWluKHRoaXMubGVuZ3RoLCB0bykgLSBsZWZ0TGVuLCBzdGFydCArIGxlZnRMZW4pID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmZvckVhY2hJbnZlcnRlZElubmVyID0gZnVuY3Rpb24gZm9yRWFjaEludmVydGVkSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA+IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoSW52ZXJ0ZWRJbm5lcihmLCBmcm9tIC0gbGVmdExlbiwgTWF0aC5tYXgodG8sIGxlZnRMZW4pIC0gbGVmdExlbiwgc3RhcnQgKyBsZWZ0TGVuKSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvIDwgbGVmdExlbiAmJlxuICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaEludmVydGVkSW5uZXIoZiwgTWF0aC5taW4oZnJvbSwgbGVmdExlbiksIHRvLCBzdGFydCkgPT09IGZhbHNlKVxuICAgICAgeyByZXR1cm4gZmFsc2UgfVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmICh0byA8PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLmxlZnQuc2xpY2UoZnJvbSwgdG8pIH1cbiAgICBpZiAoZnJvbSA+PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKGZyb20gLSBsZWZ0TGVuLCB0byAtIGxlZnRMZW4pIH1cbiAgICByZXR1cm4gdGhpcy5sZWZ0LnNsaWNlKGZyb20sIGxlZnRMZW4pLmFwcGVuZCh0aGlzLnJpZ2h0LnNsaWNlKDAsIHRvIC0gbGVmdExlbikpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmQXBwZW5kID0gZnVuY3Rpb24gbGVhZkFwcGVuZCAob3RoZXIpIHtcbiAgICB2YXIgaW5uZXIgPSB0aGlzLnJpZ2h0LmxlYWZBcHBlbmQob3RoZXIpO1xuICAgIGlmIChpbm5lcikgeyByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLmxlZnQsIGlubmVyKSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIHZhciBpbm5lciA9IHRoaXMubGVmdC5sZWFmUHJlcGVuZChvdGhlcik7XG4gICAgaWYgKGlubmVyKSB7IHJldHVybiBuZXcgQXBwZW5kKGlubmVyLCB0aGlzLnJpZ2h0KSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5hcHBlbmRJbm5lciA9IGZ1bmN0aW9uIGFwcGVuZElubmVyIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlZnQuZGVwdGggPj0gTWF0aC5tYXgodGhpcy5yaWdodC5kZXB0aCwgb3RoZXIuZGVwdGgpICsgMSlcbiAgICAgIHsgcmV0dXJuIG5ldyBBcHBlbmQodGhpcy5sZWZ0LCBuZXcgQXBwZW5kKHRoaXMucmlnaHQsIG90aGVyKSkgfVxuICAgIHJldHVybiBuZXcgQXBwZW5kKHRoaXMsIG90aGVyKVxuICB9O1xuXG4gIHJldHVybiBBcHBlbmQ7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBSb3BlU2VxdWVuY2U7XG4iLCAiaW1wb3J0IFJvcGVTZXF1ZW5jZSBmcm9tICdyb3BlLXNlcXVlbmNlJztcbmltcG9ydCB7IE1hcHBpbmcgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgUGx1Z2luS2V5LCBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5cbi8vIFByb3NlTWlycm9yJ3MgaGlzdG9yeSBpc24ndCBzaW1wbHkgYSB3YXkgdG8gcm9sbCBiYWNrIHRvIGEgcHJldmlvdXNcbi8vIHN0YXRlLCBiZWNhdXNlIFByb3NlTWlycm9yIHN1cHBvcnRzIGFwcGx5aW5nIGNoYW5nZXMgd2l0aG91dCBhZGRpbmdcbi8vIHRoZW0gdG8gdGhlIGhpc3RvcnkgKGZvciBleGFtcGxlIGR1cmluZyBjb2xsYWJvcmF0aW9uKS5cbi8vXG4vLyBUbyB0aGlzIGVuZCwgZWFjaCAnQnJhbmNoJyAob25lIGZvciB0aGUgdW5kbyBoaXN0b3J5IGFuZCBvbmUgZm9yXG4vLyB0aGUgcmVkbyBoaXN0b3J5KSBrZWVwcyBhbiBhcnJheSBvZiAnSXRlbXMnLCB3aGljaCBjYW4gb3B0aW9uYWxseVxuLy8gaG9sZCBhIHN0ZXAgKGFuIGFjdHVhbCB1bmRvYWJsZSBjaGFuZ2UpLCBhbmQgYWx3YXlzIGhvbGQgYSBwb3NpdGlvblxuLy8gbWFwICh3aGljaCBpcyBuZWVkZWQgdG8gbW92ZSBjaGFuZ2VzIGJlbG93IHRoZW0gdG8gYXBwbHkgdG8gdGhlXG4vLyBjdXJyZW50IGRvY3VtZW50KS5cbi8vXG4vLyBBbiBpdGVtIHRoYXQgaGFzIGJvdGggYSBzdGVwIGFuZCBhIHNlbGVjdGlvbiBib29rbWFyayBpcyB0aGUgc3RhcnRcbi8vIG9mIGFuICdldmVudCcgXHUyMDE0IGEgZ3JvdXAgb2YgY2hhbmdlcyB0aGF0IHdpbGwgYmUgdW5kb25lIG9yIHJlZG9uZSBhdFxuLy8gb25jZS4gKEl0IHN0b3JlcyBvbmx5IHRoZSBib29rbWFyaywgc2luY2UgdGhhdCB3YXkgd2UgZG9uJ3QgaGF2ZSB0b1xuLy8gcHJvdmlkZSBhIGRvY3VtZW50IHVudGlsIHRoZSBzZWxlY3Rpb24gaXMgYWN0dWFsbHkgYXBwbGllZCwgd2hpY2hcbi8vIGlzIHVzZWZ1bCB3aGVuIGNvbXByZXNzaW5nLilcbi8vIFVzZWQgdG8gc2NoZWR1bGUgaGlzdG9yeSBjb21wcmVzc2lvblxuY29uc3QgbWF4X2VtcHR5X2l0ZW1zID0gNTAwO1xuY2xhc3MgQnJhbmNoIHtcbiAgICBjb25zdHJ1Y3RvcihpdGVtcywgZXZlbnRDb3VudCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuZXZlbnRDb3VudCA9IGV2ZW50Q291bnQ7XG4gICAgfVxuICAgIC8vIFBvcCB0aGUgbGF0ZXN0IGV2ZW50IG9mZiB0aGUgYnJhbmNoJ3MgaGlzdG9yeSBhbmQgYXBwbHkgaXRcbiAgICAvLyB0byBhIGRvY3VtZW50IHRyYW5zZm9ybS5cbiAgICBwb3BFdmVudChzdGF0ZSwgcHJlc2VydmVJdGVtcykge1xuICAgICAgICBpZiAodGhpcy5ldmVudENvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgICAgICBmb3IgKDs7IGVuZC0tKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuaXRlbXMuZ2V0KGVuZCAtIDEpO1xuICAgICAgICAgICAgaWYgKG5leHQuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLS1lbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlbWFwLCBtYXBGcm9tO1xuICAgICAgICBpZiAocHJlc2VydmVJdGVtcykge1xuICAgICAgICAgICAgcmVtYXAgPSB0aGlzLnJlbWFwcGluZyhlbmQsIHRoaXMuaXRlbXMubGVuZ3RoKTtcbiAgICAgICAgICAgIG1hcEZyb20gPSByZW1hcC5tYXBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHJhbnNmb3JtID0gc3RhdGUudHI7XG4gICAgICAgIGxldCBzZWxlY3Rpb24sIHJlbWFpbmluZztcbiAgICAgICAgbGV0IGFkZEFmdGVyID0gW10sIGFkZEJlZm9yZSA9IFtdO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZW1hcCkge1xuICAgICAgICAgICAgICAgICAgICByZW1hcCA9IHRoaXMucmVtYXBwaW5nKGVuZCwgaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBtYXBGcm9tID0gcmVtYXAubWFwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgICAgICBhZGRCZWZvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVtYXApIHtcbiAgICAgICAgICAgICAgICBhZGRCZWZvcmUucHVzaChuZXcgSXRlbShpdGVtLm1hcCkpO1xuICAgICAgICAgICAgICAgIGxldCBzdGVwID0gaXRlbS5zdGVwLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSksIG1hcDtcbiAgICAgICAgICAgICAgICBpZiAoc3RlcCAmJiB0cmFuc2Zvcm0ubWF5YmVTdGVwKHN0ZXApLmRvYykge1xuICAgICAgICAgICAgICAgICAgICBtYXAgPSB0cmFuc2Zvcm0ubWFwcGluZy5tYXBzW3RyYW5zZm9ybS5tYXBwaW5nLm1hcHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGFkZEFmdGVyLnB1c2gobmV3IEl0ZW0obWFwLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWRkQWZ0ZXIubGVuZ3RoICsgYWRkQmVmb3JlLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICAgICAgaWYgKG1hcClcbiAgICAgICAgICAgICAgICAgICAgcmVtYXAuYXBwZW5kTWFwKG1hcCwgbWFwRnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0ubWF5YmVTdGVwKGl0ZW0uc3RlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbS5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSByZW1hcCA/IGl0ZW0uc2VsZWN0aW9uLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSkgOiBpdGVtLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBuZXcgQnJhbmNoKHRoaXMuaXRlbXMuc2xpY2UoMCwgZW5kKS5hcHBlbmQoYWRkQmVmb3JlLnJldmVyc2UoKS5jb25jYXQoYWRkQWZ0ZXIpKSwgdGhpcy5ldmVudENvdW50IC0gMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLml0ZW1zLmxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiB7IHJlbWFpbmluZzogcmVtYWluaW5nLCB0cmFuc2Zvcm0sIHNlbGVjdGlvbjogc2VsZWN0aW9uIH07XG4gICAgfVxuICAgIC8vIENyZWF0ZSBhIG5ldyBicmFuY2ggd2l0aCB0aGUgZ2l2ZW4gdHJhbnNmb3JtIGFkZGVkLlxuICAgIGFkZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHNlbGVjdGlvbiwgaGlzdE9wdGlvbnMsIHByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgbGV0IG5ld0l0ZW1zID0gW10sIGV2ZW50Q291bnQgPSB0aGlzLmV2ZW50Q291bnQ7XG4gICAgICAgIGxldCBvbGRJdGVtcyA9IHRoaXMuaXRlbXMsIGxhc3RJdGVtID0gIXByZXNlcnZlSXRlbXMgJiYgb2xkSXRlbXMubGVuZ3RoID8gb2xkSXRlbXMuZ2V0KG9sZEl0ZW1zLmxlbmd0aCAtIDEpIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm0uc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGVwID0gdHJhbnNmb3JtLnN0ZXBzW2ldLmludmVydCh0cmFuc2Zvcm0uZG9jc1tpXSk7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IG5ldyBJdGVtKHRyYW5zZm9ybS5tYXBwaW5nLm1hcHNbaV0sIHN0ZXAsIHNlbGVjdGlvbiksIG1lcmdlZDtcbiAgICAgICAgICAgIGlmIChtZXJnZWQgPSBsYXN0SXRlbSAmJiBsYXN0SXRlbS5tZXJnZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBtZXJnZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGkpXG4gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW1zLnBvcCgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb2xkSXRlbXMgPSBvbGRJdGVtcy5zbGljZSgwLCBvbGRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0l0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRDb3VudCsrO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJlc2VydmVJdGVtcylcbiAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG92ZXJmbG93ID0gZXZlbnRDb3VudCAtIGhpc3RPcHRpb25zLmRlcHRoO1xuICAgICAgICBpZiAob3ZlcmZsb3cgPiBERVBUSF9PVkVSRkxPVykge1xuICAgICAgICAgICAgb2xkSXRlbXMgPSBjdXRPZmZFdmVudHMob2xkSXRlbXMsIG92ZXJmbG93KTtcbiAgICAgICAgICAgIGV2ZW50Q291bnQgLT0gb3ZlcmZsb3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBCcmFuY2gob2xkSXRlbXMuYXBwZW5kKG5ld0l0ZW1zKSwgZXZlbnRDb3VudCk7XG4gICAgfVxuICAgIHJlbWFwcGluZyhmcm9tLCB0bykge1xuICAgICAgICBsZXQgbWFwcyA9IG5ldyBNYXBwaW5nO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBtaXJyb3JQb3MgPSBpdGVtLm1pcnJvck9mZnNldCAhPSBudWxsICYmIGkgLSBpdGVtLm1pcnJvck9mZnNldCA+PSBmcm9tXG4gICAgICAgICAgICAgICAgPyBtYXBzLm1hcHMubGVuZ3RoIC0gaXRlbS5taXJyb3JPZmZzZXQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtYXBzLmFwcGVuZE1hcChpdGVtLm1hcCwgbWlycm9yUG9zKTtcbiAgICAgICAgfSwgZnJvbSwgdG8pO1xuICAgICAgICByZXR1cm4gbWFwcztcbiAgICB9XG4gICAgYWRkTWFwcyhhcnJheSkge1xuICAgICAgICBpZiAodGhpcy5ldmVudENvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBCcmFuY2godGhpcy5pdGVtcy5hcHBlbmQoYXJyYXkubWFwKG1hcCA9PiBuZXcgSXRlbShtYXApKSksIHRoaXMuZXZlbnRDb3VudCk7XG4gICAgfVxuICAgIC8vIFdoZW4gdGhlIGNvbGxhYiBtb2R1bGUgcmVjZWl2ZXMgcmVtb3RlIGNoYW5nZXMsIHRoZSBoaXN0b3J5IGhhc1xuICAgIC8vIHRvIGtub3cgYWJvdXQgdGhvc2UsIHNvIHRoYXQgaXQgY2FuIGFkanVzdCB0aGUgc3RlcHMgdGhhdCB3ZXJlXG4gICAgLy8gcmViYXNlZCBvbiB0b3Agb2YgdGhlIHJlbW90ZSBjaGFuZ2VzLCBhbmQgaW5jbHVkZSB0aGUgcG9zaXRpb25cbiAgICAvLyBtYXBzIGZvciB0aGUgcmVtb3RlIGNoYW5nZXMgaW4gaXRzIGFycmF5IG9mIGl0ZW1zLlxuICAgIHJlYmFzZWQocmViYXNlZFRyYW5zZm9ybSwgcmViYXNlZENvdW50KSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCByZWJhc2VkSXRlbXMgPSBbXSwgc3RhcnQgPSBNYXRoLm1heCgwLCB0aGlzLml0ZW1zLmxlbmd0aCAtIHJlYmFzZWRDb3VudCk7XG4gICAgICAgIGxldCBtYXBwaW5nID0gcmViYXNlZFRyYW5zZm9ybS5tYXBwaW5nO1xuICAgICAgICBsZXQgbmV3VW50aWwgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzLmxlbmd0aDtcbiAgICAgICAgbGV0IGV2ZW50Q291bnQgPSB0aGlzLmV2ZW50Q291bnQ7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHsgaWYgKGl0ZW0uc2VsZWN0aW9uKVxuICAgICAgICAgICAgZXZlbnRDb3VudC0tOyB9LCBzdGFydCk7XG4gICAgICAgIGxldCBpUmViYXNlZCA9IHJlYmFzZWRDb3VudDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcuZ2V0TWlycm9yKC0taVJlYmFzZWQpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIG5ld1VudGlsID0gTWF0aC5taW4obmV3VW50aWwsIHBvcyk7XG4gICAgICAgICAgICBsZXQgbWFwID0gbWFwcGluZy5tYXBzW3Bvc107XG4gICAgICAgICAgICBpZiAoaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzW3Bvc10uaW52ZXJ0KHJlYmFzZWRUcmFuc2Zvcm0uZG9jc1twb3NdKTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gaXRlbS5zZWxlY3Rpb24gJiYgaXRlbS5zZWxlY3Rpb24ubWFwKG1hcHBpbmcuc2xpY2UoaVJlYmFzZWQgKyAxLCBwb3MpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICBldmVudENvdW50Kys7XG4gICAgICAgICAgICAgICAgcmViYXNlZEl0ZW1zLnB1c2gobmV3IEl0ZW0obWFwLCBzdGVwLCBzZWxlY3Rpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlYmFzZWRJdGVtcy5wdXNoKG5ldyBJdGVtKG1hcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBzdGFydCk7XG4gICAgICAgIGxldCBuZXdNYXBzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSByZWJhc2VkQ291bnQ7IGkgPCBuZXdVbnRpbDsgaSsrKVxuICAgICAgICAgICAgbmV3TWFwcy5wdXNoKG5ldyBJdGVtKG1hcHBpbmcubWFwc1tpXSkpO1xuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHN0YXJ0KS5hcHBlbmQobmV3TWFwcykuYXBwZW5kKHJlYmFzZWRJdGVtcyk7XG4gICAgICAgIGxldCBicmFuY2ggPSBuZXcgQnJhbmNoKGl0ZW1zLCBldmVudENvdW50KTtcbiAgICAgICAgaWYgKGJyYW5jaC5lbXB0eUl0ZW1Db3VudCgpID4gbWF4X2VtcHR5X2l0ZW1zKVxuICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoLmNvbXByZXNzKHRoaXMuaXRlbXMubGVuZ3RoIC0gcmViYXNlZEl0ZW1zLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBicmFuY2g7XG4gICAgfVxuICAgIGVtcHR5SXRlbUNvdW50KCkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7IGlmICghaXRlbS5zdGVwKVxuICAgICAgICAgICAgY291bnQrKzsgfSk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gICAgLy8gQ29tcHJlc3NpbmcgYSBicmFuY2ggbWVhbnMgcmV3cml0aW5nIGl0IHRvIHB1c2ggdGhlIGFpciAobWFwLW9ubHlcbiAgICAvLyBpdGVtcykgb3V0LiBEdXJpbmcgY29sbGFib3JhdGlvbiwgdGhlc2UgbmF0dXJhbGx5IGFjY3VtdWxhdGVcbiAgICAvLyBiZWNhdXNlIGVhY2ggcmVtb3RlIGNoYW5nZSBhZGRzIG9uZS4gVGhlIGB1cHRvYCBhcmd1bWVudCBpcyB1c2VkXG4gICAgLy8gdG8gZW5zdXJlIHRoYXQgb25seSB0aGUgaXRlbXMgYmVsb3cgYSBnaXZlbiBsZXZlbCBhcmUgY29tcHJlc3NlZCxcbiAgICAvLyBiZWNhdXNlIGByZWJhc2VkYCByZWxpZXMgb24gYSBjbGVhbiwgdW50b3VjaGVkIHNldCBvZiBpdGVtcyBpblxuICAgIC8vIG9yZGVyIHRvIGFzc29jaWF0ZSBvbGQgaXRlbXMgd2l0aCByZWJhc2VkIHN0ZXBzLlxuICAgIGNvbXByZXNzKHVwdG8gPSB0aGlzLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICBsZXQgcmVtYXAgPSB0aGlzLnJlbWFwcGluZygwLCB1cHRvKSwgbWFwRnJvbSA9IHJlbWFwLm1hcHMubGVuZ3RoO1xuICAgICAgICBsZXQgaXRlbXMgPSBbXSwgZXZlbnRzID0gMDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA+PSB1cHRvKSB7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5zZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSBpdGVtLnN0ZXAubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKSwgbWFwID0gc3RlcCAmJiBzdGVwLmdldE1hcCgpO1xuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgICAgICBpZiAobWFwKVxuICAgICAgICAgICAgICAgICAgICByZW1hcC5hcHBlbmRNYXAobWFwLCBtYXBGcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gaXRlbS5zZWxlY3Rpb24gJiYgaXRlbS5zZWxlY3Rpb24ubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cysrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SXRlbSA9IG5ldyBJdGVtKG1hcC5pbnZlcnQoKSwgc3RlcCwgc2VsZWN0aW9uKSwgbWVyZ2VkLCBsYXN0ID0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZCA9IGl0ZW1zLmxlbmd0aCAmJiBpdGVtc1tsYXN0XS5tZXJnZShuZXdJdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2xhc3RdID0gbWVyZ2VkO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0ubWFwKSB7XG4gICAgICAgICAgICAgICAgbWFwRnJvbS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLml0ZW1zLmxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiBuZXcgQnJhbmNoKFJvcGVTZXF1ZW5jZS5mcm9tKGl0ZW1zLnJldmVyc2UoKSksIGV2ZW50cyk7XG4gICAgfVxufVxuQnJhbmNoLmVtcHR5ID0gbmV3IEJyYW5jaChSb3BlU2VxdWVuY2UuZW1wdHksIDApO1xuZnVuY3Rpb24gY3V0T2ZmRXZlbnRzKGl0ZW1zLCBuKSB7XG4gICAgbGV0IGN1dFBvaW50O1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0aW9uICYmIChuLS0gPT0gMCkpIHtcbiAgICAgICAgICAgIGN1dFBvaW50ID0gaTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpdGVtcy5zbGljZShjdXRQb2ludCk7XG59XG5jbGFzcyBJdGVtIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBUaGUgKGZvcndhcmQpIHN0ZXAgbWFwIGZvciB0aGlzIGl0ZW0uXG4gICAgbWFwLCBcbiAgICAvLyBUaGUgaW52ZXJ0ZWQgc3RlcFxuICAgIHN0ZXAsIFxuICAgIC8vIElmIHRoaXMgaXMgbm9uLW51bGwsIHRoaXMgaXRlbSBpcyB0aGUgc3RhcnQgb2YgYSBncm91cCwgYW5kXG4gICAgLy8gdGhpcyBzZWxlY3Rpb24gaXMgdGhlIHN0YXJ0aW5nIHNlbGVjdGlvbiBmb3IgdGhlIGdyb3VwICh0aGUgb25lXG4gICAgLy8gdGhhdCB3YXMgYWN0aXZlIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcCB3YXMgYXBwbGllZClcbiAgICBzZWxlY3Rpb24sIFxuICAgIC8vIElmIHRoaXMgaXRlbSBpcyB0aGUgaW52ZXJzZSBvZiBhIHByZXZpb3VzIG1hcHBpbmcgb24gdGhlIHN0YWNrLFxuICAgIC8vIHRoaXMgcG9pbnRzIGF0IHRoZSBpbnZlcnNlJ3Mgb2Zmc2V0XG4gICAgbWlycm9yT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLnN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5taXJyb3JPZmZzZXQgPSBtaXJyb3JPZmZzZXQ7XG4gICAgfVxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnN0ZXAgJiYgb3RoZXIuc3RlcCAmJiAhb3RoZXIuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgc3RlcCA9IG90aGVyLnN0ZXAubWVyZ2UodGhpcy5zdGVwKTtcbiAgICAgICAgICAgIGlmIChzdGVwKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlbShzdGVwLmdldE1hcCgpLmludmVydCgpLCBzdGVwLCB0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBUaGUgdmFsdWUgb2YgdGhlIHN0YXRlIGZpZWxkIHRoYXQgdHJhY2tzIHVuZG8vcmVkbyBoaXN0b3J5IGZvciB0aGF0XG4vLyBzdGF0ZS4gV2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBsdWdpbiBzdGF0ZSB3aGVuIHRoZSBoaXN0b3J5IHBsdWdpblxuLy8gaXMgYWN0aXZlLlxuY2xhc3MgSGlzdG9yeVN0YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcihkb25lLCB1bmRvbmUsIHByZXZSYW5nZXMsIHByZXZUaW1lLCBwcmV2Q29tcG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5kb25lID0gZG9uZTtcbiAgICAgICAgdGhpcy51bmRvbmUgPSB1bmRvbmU7XG4gICAgICAgIHRoaXMucHJldlJhbmdlcyA9IHByZXZSYW5nZXM7XG4gICAgICAgIHRoaXMucHJldlRpbWUgPSBwcmV2VGltZTtcbiAgICAgICAgdGhpcy5wcmV2Q29tcG9zaXRpb24gPSBwcmV2Q29tcG9zaXRpb247XG4gICAgfVxufVxuY29uc3QgREVQVEhfT1ZFUkZMT1cgPSAyMDtcbi8vIFJlY29yZCBhIHRyYW5zZm9ybWF0aW9uIGluIHVuZG8gaGlzdG9yeS5cbmZ1bmN0aW9uIGFwcGx5VHJhbnNhY3Rpb24oaGlzdG9yeSwgc3RhdGUsIHRyLCBvcHRpb25zKSB7XG4gICAgbGV0IGhpc3RvcnlUciA9IHRyLmdldE1ldGEoaGlzdG9yeUtleSksIHJlYmFzZWQ7XG4gICAgaWYgKGhpc3RvcnlUcilcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlUci5oaXN0b3J5U3RhdGU7XG4gICAgaWYgKHRyLmdldE1ldGEoY2xvc2VIaXN0b3J5S2V5KSlcbiAgICAgICAgaGlzdG9yeSA9IG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLCBoaXN0b3J5LnVuZG9uZSwgbnVsbCwgMCwgLTEpO1xuICAgIGxldCBhcHBlbmRlZCA9IHRyLmdldE1ldGEoXCJhcHBlbmRlZFRyYW5zYWN0aW9uXCIpO1xuICAgIGlmICh0ci5zdGVwcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXBwZW5kZWQgJiYgYXBwZW5kZWQuZ2V0TWV0YShoaXN0b3J5S2V5KSkge1xuICAgICAgICBpZiAoYXBwZW5kZWQuZ2V0TWV0YShoaXN0b3J5S2V5KS5yZWRvKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLmFkZFRyYW5zZm9ybSh0ciwgdW5kZWZpbmVkLCBvcHRpb25zLCBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSkpLCBoaXN0b3J5LnVuZG9uZSwgcmFuZ2VzRm9yKHRyLm1hcHBpbmcubWFwc1t0ci5zdGVwcy5sZW5ndGggLSAxXSksIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLCBoaXN0b3J5LnVuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIHVuZGVmaW5lZCwgb3B0aW9ucywgbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpKSwgbnVsbCwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0ci5nZXRNZXRhKFwiYWRkVG9IaXN0b3J5XCIpICE9PSBmYWxzZSAmJiAhKGFwcGVuZGVkICYmIGFwcGVuZGVkLmdldE1ldGEoXCJhZGRUb0hpc3RvcnlcIikgPT09IGZhbHNlKSkge1xuICAgICAgICAvLyBHcm91cCB0cmFuc2Zvcm1zIHRoYXQgb2NjdXIgaW4gcXVpY2sgc3VjY2Vzc2lvbiBpbnRvIG9uZSBldmVudC5cbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gdHIuZ2V0TWV0YShcImNvbXBvc2l0aW9uXCIpO1xuICAgICAgICBsZXQgbmV3R3JvdXAgPSBoaXN0b3J5LnByZXZUaW1lID09IDAgfHxcbiAgICAgICAgICAgICghYXBwZW5kZWQgJiYgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24gIT0gY29tcG9zaXRpb24gJiZcbiAgICAgICAgICAgICAgICAoaGlzdG9yeS5wcmV2VGltZSA8ICh0ci50aW1lIHx8IDApIC0gb3B0aW9ucy5uZXdHcm91cERlbGF5IHx8ICFpc0FkamFjZW50VG8odHIsIGhpc3RvcnkucHJldlJhbmdlcykpKTtcbiAgICAgICAgbGV0IHByZXZSYW5nZXMgPSBhcHBlbmRlZCA/IG1hcFJhbmdlcyhoaXN0b3J5LnByZXZSYW5nZXMsIHRyLm1hcHBpbmcpIDogcmFuZ2VzRm9yKHRyLm1hcHBpbmcubWFwc1t0ci5zdGVwcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIG5ld0dyb3VwID8gc3RhdGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCkgOiB1bmRlZmluZWQsIG9wdGlvbnMsIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSksIEJyYW5jaC5lbXB0eSwgcHJldlJhbmdlcywgdHIudGltZSwgY29tcG9zaXRpb24gPT0gbnVsbCA/IGhpc3RvcnkucHJldkNvbXBvc2l0aW9uIDogY29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZWJhc2VkID0gdHIuZ2V0TWV0YShcInJlYmFzZWRcIikpIHtcbiAgICAgICAgLy8gVXNlZCBieSB0aGUgY29sbGFiIG1vZHVsZSB0byB0ZWxsIHRoZSBoaXN0b3J5IHRoYXQgc29tZSBvZiBpdHNcbiAgICAgICAgLy8gY29udGVudCBoYXMgYmVlbiByZWJhc2VkLlxuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUucmViYXNlZCh0ciwgcmViYXNlZCksIGhpc3RvcnkudW5kb25lLnJlYmFzZWQodHIsIHJlYmFzZWQpLCBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLmFkZE1hcHModHIubWFwcGluZy5tYXBzKSwgaGlzdG9yeS51bmRvbmUuYWRkTWFwcyh0ci5tYXBwaW5nLm1hcHMpLCBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQWRqYWNlbnRUbyh0cmFuc2Zvcm0sIHByZXZSYW5nZXMpIHtcbiAgICBpZiAoIXByZXZSYW5nZXMpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRyYW5zZm9ybS5kb2NDaGFuZ2VkKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgYWRqYWNlbnQgPSBmYWxzZTtcbiAgICB0cmFuc2Zvcm0ubWFwcGluZy5tYXBzWzBdLmZvckVhY2goKHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2UmFuZ2VzLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IHByZXZSYW5nZXNbaSArIDFdICYmIGVuZCA+PSBwcmV2UmFuZ2VzW2ldKVxuICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWRqYWNlbnQ7XG59XG5mdW5jdGlvbiByYW5nZXNGb3IobWFwKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIG1hcC5mb3JFYWNoKChfZnJvbSwgX3RvLCBmcm9tLCB0bykgPT4gcmVzdWx0LnB1c2goZnJvbSwgdG8pKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFwUmFuZ2VzKHJhbmdlcywgbWFwcGluZykge1xuICAgIGlmICghcmFuZ2VzKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcChyYW5nZXNbaV0sIDEpLCB0byA9IG1hcHBpbmcubWFwKHJhbmdlc1tpICsgMV0sIC0xKTtcbiAgICAgICAgaWYgKGZyb20gPD0gdG8pXG4gICAgICAgICAgICByZXN1bHQucHVzaChmcm9tLCB0byk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBBcHBseSB0aGUgbGF0ZXN0IGV2ZW50IGZyb20gb25lIGJyYW5jaCB0byB0aGUgZG9jdW1lbnQgYW5kIHNoaWZ0IHRoZSBldmVudFxuLy8gb250byB0aGUgb3RoZXIgYnJhbmNoLlxuZnVuY3Rpb24gaGlzdFRyYW5zYWN0aW9uKGhpc3RvcnksIHN0YXRlLCBkaXNwYXRjaCwgcmVkbykge1xuICAgIGxldCBwcmVzZXJ2ZUl0ZW1zID0gbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpO1xuICAgIGxldCBoaXN0T3B0aW9ucyA9IGhpc3RvcnlLZXkuZ2V0KHN0YXRlKS5zcGVjLmNvbmZpZztcbiAgICBsZXQgcG9wID0gKHJlZG8gPyBoaXN0b3J5LnVuZG9uZSA6IGhpc3RvcnkuZG9uZSkucG9wRXZlbnQoc3RhdGUsIHByZXNlcnZlSXRlbXMpO1xuICAgIGlmICghcG9wKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHNlbGVjdGlvbiA9IHBvcC5zZWxlY3Rpb24ucmVzb2x2ZShwb3AudHJhbnNmb3JtLmRvYyk7XG4gICAgbGV0IGFkZGVkID0gKHJlZG8gPyBoaXN0b3J5LmRvbmUgOiBoaXN0b3J5LnVuZG9uZSkuYWRkVHJhbnNmb3JtKHBvcC50cmFuc2Zvcm0sIHN0YXRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpLCBoaXN0T3B0aW9ucywgcHJlc2VydmVJdGVtcyk7XG4gICAgbGV0IG5ld0hpc3QgPSBuZXcgSGlzdG9yeVN0YXRlKHJlZG8gPyBhZGRlZCA6IHBvcC5yZW1haW5pbmcsIHJlZG8gPyBwb3AucmVtYWluaW5nIDogYWRkZWQsIG51bGwsIDAsIC0xKTtcbiAgICBkaXNwYXRjaChwb3AudHJhbnNmb3JtLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pLnNldE1ldGEoaGlzdG9yeUtleSwgeyByZWRvLCBoaXN0b3J5U3RhdGU6IG5ld0hpc3QgfSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG59XG5sZXQgY2FjaGVkUHJlc2VydmVJdGVtcyA9IGZhbHNlLCBjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyA9IG51bGw7XG4vLyBDaGVjayB3aGV0aGVyIGFueSBwbHVnaW4gaW4gdGhlIGdpdmVuIHN0YXRlIGhhcyBhXG4vLyBgaGlzdG9yeVByZXNlcnZlSXRlbXNgIHByb3BlcnR5IGluIGl0cyBzcGVjLCBpbiB3aGljaCBjYXNlIHdlIG11c3Rcbi8vIHByZXNlcnZlIHN0ZXBzIGV4YWN0bHkgYXMgdGhleSBjYW1lIGluLCBzbyB0aGF0IHRoZXkgY2FuIGJlXG4vLyByZWJhc2VkLlxuZnVuY3Rpb24gbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpIHtcbiAgICBsZXQgcGx1Z2lucyA9IHN0YXRlLnBsdWdpbnM7XG4gICAgaWYgKGNhY2hlZFByZXNlcnZlSXRlbXNQbHVnaW5zICE9IHBsdWdpbnMpIHtcbiAgICAgICAgY2FjaGVkUHJlc2VydmVJdGVtcyA9IGZhbHNlO1xuICAgICAgICBjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyA9IHBsdWdpbnM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChwbHVnaW5zW2ldLnNwZWMuaGlzdG9yeVByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgICAgICAgICBjYWNoZWRQcmVzZXJ2ZUl0ZW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZFByZXNlcnZlSXRlbXM7XG59XG4vKipcblNldCBhIGZsYWcgb24gdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHRoYXQgd2lsbCBwcmV2ZW50IGZ1cnRoZXIgc3RlcHNcbmZyb20gYmVpbmcgYXBwZW5kZWQgdG8gYW4gZXhpc3RpbmcgaGlzdG9yeSBldmVudCAoc28gdGhhdCB0aGV5XG5yZXF1aXJlIGEgc2VwYXJhdGUgdW5kbyBjb21tYW5kIHRvIHVuZG8pLlxuKi9cbmZ1bmN0aW9uIGNsb3NlSGlzdG9yeSh0cikge1xuICAgIHJldHVybiB0ci5zZXRNZXRhKGNsb3NlSGlzdG9yeUtleSwgdHJ1ZSk7XG59XG5jb25zdCBoaXN0b3J5S2V5ID0gbmV3IFBsdWdpbktleShcImhpc3RvcnlcIik7XG5jb25zdCBjbG9zZUhpc3RvcnlLZXkgPSBuZXcgUGx1Z2luS2V5KFwiY2xvc2VIaXN0b3J5XCIpO1xuLyoqXG5SZXR1cm5zIGEgcGx1Z2luIHRoYXQgZW5hYmxlcyB0aGUgdW5kbyBoaXN0b3J5IGZvciBhbiBlZGl0b3IuIFRoZVxucGx1Z2luIHdpbGwgdHJhY2sgdW5kbyBhbmQgcmVkbyBzdGFja3MsIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlXG5bYHVuZG9gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jaGlzdG9yeS51bmRvKSBhbmQgW2ByZWRvYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2hpc3RvcnkucmVkbykgY29tbWFuZHMuXG5cbllvdSBjYW4gc2V0IGFuIGBcImFkZFRvSGlzdG9yeVwiYCBbbWV0YWRhdGFcbnByb3BlcnR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2V0TWV0YSkgb2YgYGZhbHNlYCBvbiBhIHRyYW5zYWN0aW9uXG50byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcm9sbGVkIGJhY2sgYnkgdW5kby5cbiovXG5mdW5jdGlvbiBoaXN0b3J5KGNvbmZpZyA9IHt9KSB7XG4gICAgY29uZmlnID0geyBkZXB0aDogY29uZmlnLmRlcHRoIHx8IDEwMCxcbiAgICAgICAgbmV3R3JvdXBEZWxheTogY29uZmlnLm5ld0dyb3VwRGVsYXkgfHwgNTAwIH07XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgICAgICBrZXk6IGhpc3RvcnlLZXksXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKEJyYW5jaC5lbXB0eSwgQnJhbmNoLmVtcHR5LCBudWxsLCAwLCAtMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwbHkodHIsIGhpc3QsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIHRyLCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgICAgICAgICBiZWZvcmVpbnB1dCh2aWV3LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFR5cGUgPSBlLmlucHV0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSBpbnB1dFR5cGUgPT0gXCJoaXN0b3J5VW5kb1wiID8gdW5kbyA6IGlucHV0VHlwZSA9PSBcImhpc3RvcnlSZWRvXCIgPyByZWRvIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21tYW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kKHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB1bmRvZXMgdGhlIGxhc3QgY2hhbmdlLCBpZiBhbnkuXG4qL1xuY29uc3QgdW5kbyA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgIGlmICghaGlzdCB8fCBoaXN0LmRvbmUuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBoaXN0VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIGRpc3BhdGNoLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCByZWRvZXMgdGhlIGxhc3QgdW5kb25lIGNoYW5nZSwgaWYgYW55LlxuKi9cbmNvbnN0IHJlZG8gPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IGhpc3QgPSBoaXN0b3J5S2V5LmdldFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIWhpc3QgfHwgaGlzdC51bmRvbmUuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBoaXN0VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIGRpc3BhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcblRoZSBhbW91bnQgb2YgdW5kb2FibGUgZXZlbnRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIHVuZG9EZXB0aChzdGF0ZSkge1xuICAgIGxldCBoaXN0ID0gaGlzdG9yeUtleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgcmV0dXJuIGhpc3QgPyBoaXN0LmRvbmUuZXZlbnRDb3VudCA6IDA7XG59XG4vKipcblRoZSBhbW91bnQgb2YgcmVkb2FibGUgZXZlbnRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGVkaXRvciBzdGF0ZS5cbiovXG5mdW5jdGlvbiByZWRvRGVwdGgoc3RhdGUpIHtcbiAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgIHJldHVybiBoaXN0ID8gaGlzdC51bmRvbmUuZXZlbnRDb3VudCA6IDA7XG59XG5cbmV4cG9ydCB7IGNsb3NlSGlzdG9yeSwgaGlzdG9yeSwgcmVkbywgcmVkb0RlcHRoLCB1bmRvLCB1bmRvRGVwdGggfTtcbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBoaXN0b3J5LCByZWRvLCB1bmRvIH0gZnJvbSAnQHRpcHRhcC9wbS9oaXN0b3J5J1xuXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlPcHRpb25zIHtcbiAgZGVwdGg6IG51bWJlcixcbiAgbmV3R3JvdXBEZWxheTogbnVtYmVyLFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaGlzdG9yeToge1xuICAgICAgLyoqXG4gICAgICAgKiBVbmRvIHJlY2VudCBjaGFuZ2VzXG4gICAgICAgKi9cbiAgICAgIHVuZG86ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFJlYXBwbHkgcmV2ZXJ0ZWQgY2hhbmdlc1xuICAgICAgICovXG4gICAgICByZWRvOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSGlzdG9yeSA9IEV4dGVuc2lvbi5jcmVhdGU8SGlzdG9yeU9wdGlvbnM+KHtcbiAgbmFtZTogJ2hpc3RvcnknLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcHRoOiAxMDAsXG4gICAgICBuZXdHcm91cERlbGF5OiA1MDAsXG4gICAgfVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1bmRvOiAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdW5kbyhzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICB9LFxuICAgICAgcmVkbzogKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZG8oc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgIHJldHVybiBbXG4gICAgICBoaXN0b3J5KHRoaXMub3B0aW9ucyksXG4gICAgXVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLXonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy51bmRvKCksXG4gICAgICAnTW9kLVonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy51bmRvKCksXG4gICAgICAnTW9kLXknOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgICAnTW9kLVknOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgICAnU2hpZnQtTW9kLXonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgICAnU2hpZnQtTW9kLVonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG5cbiAgICAgIC8vIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0c1xuICAgICAgJ01vZC3Rjyc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnVuZG8oKSxcbiAgICAgICdTaGlmdC1Nb2Qt0Y8nOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUsIG5vZGVJbnB1dFJ1bGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBOb2RlU2VsZWN0aW9uLCBUZXh0U2VsZWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGludGVyZmFjZSBIb3Jpem9udGFsUnVsZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PlxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaG9yaXpvbnRhbFJ1bGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgaG9yaXpvbnRhbCBydWxlXG4gICAgICAgKi9cbiAgICAgIHNldEhvcml6b250YWxSdWxlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBIb3Jpem9udGFsUnVsZSA9IE5vZGUuY3JlYXRlPEhvcml6b250YWxSdWxlT3B0aW9ucz4oe1xuICBuYW1lOiAnaG9yaXpvbnRhbFJ1bGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgZ3JvdXA6ICdibG9jaycsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbeyB0YWc6ICdocicgfV1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2hyJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRIb3Jpem9udGFsUnVsZTpcbiAgICAgICAgKCkgPT4gKHsgY2hhaW4sIHN0YXRlIH0pID0+IHtcbiAgICAgICAgICBjb25zdCB7ICR0bzogJG9yaWdpblRvIH0gPSBzdGF0ZS5zZWxlY3Rpb25cblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFpbiA9IGNoYWluKClcblxuICAgICAgICAgIGlmICgkb3JpZ2luVG8ucGFyZW50T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KE1hdGgubWF4KCRvcmlnaW5Uby5wb3MgLSAyLCAwKSwgeyB0eXBlOiB0aGlzLm5hbWUgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudENoYWluLmluc2VydENvbnRlbnQoeyB0eXBlOiB0aGlzLm5hbWUgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY3VycmVudENoYWluXG4gICAgICAgICAgICAgIC8vIHNldCBjdXJzb3IgYWZ0ZXIgaG9yaXpvbnRhbCBydWxlXG4gICAgICAgICAgICAgIC5jb21tYW5kKCh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB7ICR0byB9ID0gdHIuc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICBjb25zdCBwb3NBZnRlciA9ICR0by5lbmQoKVxuXG4gICAgICAgICAgICAgICAgICBpZiAoJHRvLm5vZGVBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHRvLm5vZGVBZnRlci5pc1RleHRibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsICR0by5wb3MgKyAxKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkdG8ubm9kZUFmdGVyLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCAkdG8ucG9zKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCAkdG8ucG9zKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5vZGUgYWZ0ZXIgaG9yaXpvbnRhbCBydWxlIGlmIGl04oCZcyB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gJHRvLnBhcmVudC50eXBlLmNvbnRlbnRNYXRjaC5kZWZhdWx0VHlwZT8uY3JlYXRlKClcblxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRyLmluc2VydChwb3NBZnRlciwgbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBwb3NBZnRlciArIDEpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHRyLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucnVuKClcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5vZGVJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiAvXig/Oi0tLXzigJQtfF9fX1xcc3xcXCpcXCpcXCpcXHMpJC8sXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgTWFyayxcbiAgbWFya0lucHV0UnVsZSxcbiAgbWFya1Bhc3RlUnVsZSxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRhbGljT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaXRhbGljOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNldCBhbiBpdGFsaWMgbWFya1xuICAgICAgICovXG4gICAgICBzZXRJdGFsaWM6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhbiBpdGFsaWMgbWFya1xuICAgICAgICovXG4gICAgICB0b2dnbGVJdGFsaWM6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFVuc2V0IGFuIGl0YWxpYyBtYXJrXG4gICAgICAgKi9cbiAgICAgIHVuc2V0SXRhbGljOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3RhcklucHV0UmVnZXggPSAvKD86XnxcXHMpKCg/OlxcKikoKD86W14qXSspKSg/OlxcKikpJC9cbmV4cG9ydCBjb25zdCBzdGFyUGFzdGVSZWdleCA9IC8oPzpefFxccykoKD86XFwqKSgoPzpbXipdKykpKD86XFwqKSkvZ1xuZXhwb3J0IGNvbnN0IHVuZGVyc2NvcmVJbnB1dFJlZ2V4ID0gLyg/Ol58XFxzKSgoPzpfKSgoPzpbXl9dKykpKD86XykpJC9cbmV4cG9ydCBjb25zdCB1bmRlcnNjb3JlUGFzdGVSZWdleCA9IC8oPzpefFxccykoKD86XykoKD86W15fXSspKSg/Ol8pKS9nXG5cbmV4cG9ydCBjb25zdCBJdGFsaWMgPSBNYXJrLmNyZWF0ZTxJdGFsaWNPcHRpb25zPih7XG4gIG5hbWU6ICdpdGFsaWMnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2VtJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2knLFxuICAgICAgICBnZXRBdHRyczogbm9kZSA9PiAobm9kZSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZm9udFN0eWxlICE9PSAnbm9ybWFsJyAmJiBudWxsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3R5bGU6ICdmb250LXN0eWxlPWl0YWxpYycsXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2VtJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRJdGFsaWM6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUl0YWxpYzogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRJdGFsaWM6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC1pJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlSXRhbGljKCksXG4gICAgICAnTW9kLUknOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVJdGFsaWMoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IHN0YXJJbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICAgIG1hcmtJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiB1bmRlcnNjb3JlSW5wdXRSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxuXG4gIGFkZFBhc3RlUnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hcmtQYXN0ZVJ1bGUoe1xuICAgICAgICBmaW5kOiBzdGFyUGFzdGVSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgICBtYXJrUGFzdGVSdWxlKHtcbiAgICAgICAgZmluZDogdW5kZXJzY29yZVBhc3RlUmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBidWxsZXRMaXN0VHlwZU5hbWU6IHN0cmluZ1xuICBvcmRlcmVkTGlzdFR5cGVOYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IExpc3RJdGVtID0gTm9kZS5jcmVhdGU8TGlzdEl0ZW1PcHRpb25zPih7XG4gIG5hbWU6ICdsaXN0SXRlbScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYnVsbGV0TGlzdFR5cGVOYW1lOiAnYnVsbGV0TGlzdCcsXG4gICAgICBvcmRlcmVkTGlzdFR5cGVOYW1lOiAnb3JkZXJlZExpc3QnLFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAncGFyYWdyYXBoIGJsb2NrKicsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2xpJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnbGknLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEVudGVyOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zcGxpdExpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgICBUYWI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNpbmtMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgICAgJ1NoaWZ0LVRhYic6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmxpZnRMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBidWxsZXRMaXN0VHlwZU5hbWU6IHN0cmluZ1xuICBvcmRlcmVkTGlzdFR5cGVOYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IExpc3RJdGVtID0gTm9kZS5jcmVhdGU8TGlzdEl0ZW1PcHRpb25zPih7XG4gIG5hbWU6ICdsaXN0SXRlbScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYnVsbGV0TGlzdFR5cGVOYW1lOiAnYnVsbGV0TGlzdCcsXG4gICAgICBvcmRlcmVkTGlzdFR5cGVOYW1lOiAnb3JkZXJlZExpc3QnLFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAncGFyYWdyYXBoIGJsb2NrKicsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2xpJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnbGknLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEVudGVyOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zcGxpdExpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgICBUYWI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNpbmtMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgICAgJ1NoaWZ0LVRhYic6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmxpZnRMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgZ2V0TWFya0F0dHJpYnV0ZXMsXG4gIE1hcmssXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRleHRTdHlsZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRleHRTdHlsZToge1xuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgc3BhbnMgd2l0aG91dCBpbmxpbmUgc3R5bGUgYXR0cmlidXRlcy5cbiAgICAgICAqL1xuICAgICAgcmVtb3ZlRW1wdHlUZXh0U3R5bGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUZXh0U3R5bGUgPSBNYXJrLmNyZWF0ZTxUZXh0U3R5bGVPcHRpb25zPih7XG4gIG5hbWU6ICd0ZXh0U3R5bGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgICBnZXRBdHRyczogZWxlbWVudCA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzU3R5bGVzID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKVxuXG4gICAgICAgICAgaWYgKCFoYXNTdHlsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzcGFuJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZW1vdmVFbXB0eVRleHRTdHlsZTogKCkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdldE1hcmtBdHRyaWJ1dGVzKHN0YXRlLCB0aGlzLnR5cGUpXG4gICAgICAgIGNvbnN0IGhhc1N0eWxlcyA9IE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLnNvbWUoKFssIHZhbHVlXSkgPT4gISF2YWx1ZSlcblxuICAgICAgICBpZiAoaGFzU3R5bGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlLCB3cmFwcGluZ0lucHV0UnVsZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuaW1wb3J0IExpc3RJdGVtIGZyb20gJy4uLy4uL2V4dGVuc2lvbi1saXN0LWl0ZW0vc3JjL2luZGV4LmpzJ1xuaW1wb3J0IFRleHRTdHlsZSBmcm9tICcuLi8uLi9leHRlbnNpb24tdGV4dC1zdHlsZS9zcmMvaW5kZXguanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JkZXJlZExpc3RPcHRpb25zIHtcbiAgaXRlbVR5cGVOYW1lOiBzdHJpbmcsXG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBrZWVwTWFya3M6IGJvb2xlYW4sXG4gIGtlZXBBdHRyaWJ1dGVzOiBib29sZWFuLFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgb3JkZXJlZExpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGFuIG9yZGVyZWQgbGlzdFxuICAgICAgICovXG4gICAgICB0b2dnbGVPcmRlcmVkTGlzdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlucHV0UmVnZXggPSAvXihcXGQrKVxcLlxccyQvXG5cbmV4cG9ydCBjb25zdCBPcmRlcmVkTGlzdCA9IE5vZGUuY3JlYXRlPE9yZGVyZWRMaXN0T3B0aW9ucz4oe1xuICBuYW1lOiAnb3JkZXJlZExpc3QnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1UeXBlTmFtZTogJ2xpc3RJdGVtJyxcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGtlZXBNYXJrczogZmFsc2UsXG4gICAgICBrZWVwQXR0cmlidXRlczogZmFsc2UsXG4gICAgfVxuICB9LFxuXG4gIGdyb3VwOiAnYmxvY2sgbGlzdCcsXG5cbiAgY29udGVudCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLml0ZW1UeXBlTmFtZX0rYFxuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdzdGFydCcpXG4gICAgICAgICAgICA/IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGFydCcpIHx8ICcnLCAxMClcbiAgICAgICAgICAgIDogMVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ29sJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgY29uc3QgeyBzdGFydCwgLi4uYXR0cmlidXRlc1dpdGhvdXRTdGFydCB9ID0gSFRNTEF0dHJpYnV0ZXNcblxuICAgIHJldHVybiBzdGFydCA9PT0gMVxuICAgICAgPyBbJ29sJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgYXR0cmlidXRlc1dpdGhvdXRTdGFydCksIDBdXG4gICAgICA6IFsnb2wnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvZ2dsZU9yZGVyZWRMaXN0OiAoKSA9PiAoeyBjb21tYW5kcywgY2hhaW4gfSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKCkudG9nZ2xlTGlzdCh0aGlzLm5hbWUsIHRoaXMub3B0aW9ucy5pdGVtVHlwZU5hbWUsIHRoaXMub3B0aW9ucy5rZWVwTWFya3MpLnVwZGF0ZUF0dHJpYnV0ZXMoTGlzdEl0ZW0ubmFtZSwgdGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhUZXh0U3R5bGUubmFtZSkpLnJ1bigpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZUxpc3QodGhpcy5uYW1lLCB0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lLCB0aGlzLm9wdGlvbnMua2VlcE1hcmtzKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtU2hpZnQtNyc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZU9yZGVyZWRMaXN0KCksXG4gICAgfVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgbGV0IGlucHV0UnVsZSA9IHdyYXBwaW5nSW5wdXRSdWxlKHtcbiAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBnZXRBdHRyaWJ1dGVzOiBtYXRjaCA9PiAoeyBzdGFydDogK21hdGNoWzFdIH0pLFxuICAgICAgam9pblByZWRpY2F0ZTogKG1hdGNoLCBub2RlKSA9PiBub2RlLmNoaWxkQ291bnQgKyBub2RlLmF0dHJzLnN0YXJ0ID09PSArbWF0Y2hbMV0sXG4gICAgfSlcblxuICAgIGlmICh0aGlzLm9wdGlvbnMua2VlcE1hcmtzIHx8IHRoaXMub3B0aW9ucy5rZWVwQXR0cmlidXRlcykge1xuICAgICAgaW5wdXRSdWxlID0gd3JhcHBpbmdJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiBpbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGtlZXBNYXJrczogdGhpcy5vcHRpb25zLmtlZXBNYXJrcyxcbiAgICAgICAga2VlcEF0dHJpYnV0ZXM6IHRoaXMub3B0aW9ucy5rZWVwQXR0cmlidXRlcyxcbiAgICAgICAgZ2V0QXR0cmlidXRlczogbWF0Y2ggPT4gKHsgc3RhcnQ6ICttYXRjaFsxXSwgLi4udGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhUZXh0U3R5bGUubmFtZSkgfSksXG4gICAgICAgIGpvaW5QcmVkaWNhdGU6IChtYXRjaCwgbm9kZSkgPT4gbm9kZS5jaGlsZENvdW50ICsgbm9kZS5hdHRycy5zdGFydCA9PT0gK21hdGNoWzFdLFxuICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIGlucHV0UnVsZSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBQYXJhZ3JhcGhPcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBwYXJhZ3JhcGg6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgcGFyYWdyYXBoXG4gICAgICAgKi9cbiAgICAgIHNldFBhcmFncmFwaDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBhcmFncmFwaCA9IE5vZGUuY3JlYXRlPFBhcmFncmFwaE9wdGlvbnM+KHtcbiAgbmFtZTogJ3BhcmFncmFwaCcsXG5cbiAgcHJpb3JpdHk6IDEwMDAsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBncm91cDogJ2Jsb2NrJyxcblxuICBjb250ZW50OiAnaW5saW5lKicsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3AnIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsncCcsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0UGFyYWdyYXBoOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLUFsdC0wJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuc2V0UGFyYWdyYXBoKCksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBFZGl0b3IsIEV4dGVuc2lvbiB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IE5vZGUgYXMgUHJvc2VtaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcbmltcG9ydCB7IERlY29yYXRpb24sIERlY29yYXRpb25TZXQgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJPcHRpb25zIHtcbiAgZW1wdHlFZGl0b3JDbGFzczogc3RyaW5nXG4gIGVtcHR5Tm9kZUNsYXNzOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXI6XG4gICAgfCAoKFBsYWNlaG9sZGVyUHJvcHM6IHtcbiAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgbm9kZTogUHJvc2VtaXJyb3JOb2RlXG4gICAgICAgIHBvczogbnVtYmVyXG4gICAgICAgIGhhc0FuY2hvcjogYm9vbGVhblxuICAgICAgfSkgPT4gc3RyaW5nKVxuICAgIHwgc3RyaW5nXG4gIHNob3dPbmx5V2hlbkVkaXRhYmxlOiBib29sZWFuXG4gIHNob3dPbmx5Q3VycmVudDogYm9vbGVhblxuICBpbmNsdWRlQ2hpbGRyZW46IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IFBsYWNlaG9sZGVyID0gRXh0ZW5zaW9uLmNyZWF0ZTxQbGFjZWhvbGRlck9wdGlvbnM+KHtcbiAgbmFtZTogJ3BsYWNlaG9sZGVyJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlbXB0eUVkaXRvckNsYXNzOiAnaXMtZWRpdG9yLWVtcHR5JyxcbiAgICAgIGVtcHR5Tm9kZUNsYXNzOiAnaXMtZW1wdHknLFxuICAgICAgcGxhY2Vob2xkZXI6ICdXcml0ZSBzb21ldGhpbmcg4oCmJyxcbiAgICAgIHNob3dPbmx5V2hlbkVkaXRhYmxlOiB0cnVlLFxuICAgICAgc2hvd09ubHlDdXJyZW50OiB0cnVlLFxuICAgICAgaW5jbHVkZUNoaWxkcmVuOiBmYWxzZSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgIHJldHVybiBbXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdwbGFjZWhvbGRlcicpLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGRlY29yYXRpb25zOiAoeyBkb2MsIHNlbGVjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmVkaXRvci5pc0VkaXRhYmxlIHx8ICF0aGlzLm9wdGlvbnMuc2hvd09ubHlXaGVuRWRpdGFibGVcbiAgICAgICAgICAgIGNvbnN0IHsgYW5jaG9yIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGRlY29yYXRpb25zOiBEZWNvcmF0aW9uW10gPSBbXVxuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBvbmx5IGNhbGN1bGF0ZSBpc0VtcHR5IG9uY2UgZHVlIHRvIGl0cyBwZXJmb3JtYW5jZSBpbXBhY3RzIChzZWUgaXNzdWUgIzMzNjApXG4gICAgICAgICAgICBjb25zdCBlbXB0eURvY0luc3RhbmNlID0gZG9jLnR5cGUuY3JlYXRlQW5kRmlsbCgpXG4gICAgICAgICAgICBjb25zdCBpc0VkaXRvckVtcHR5ID0gZW1wdHlEb2NJbnN0YW5jZT8uc2FtZU1hcmt1cChkb2MpXG4gICAgICAgICAgICAgICYmIGVtcHR5RG9jSW5zdGFuY2UuY29udGVudC5maW5kRGlmZlN0YXJ0KGRvYy5jb250ZW50KSA9PT0gbnVsbFxuXG4gICAgICAgICAgICBkb2MuZGVzY2VuZGFudHMoKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBoYXNBbmNob3IgPSBhbmNob3IgPj0gcG9zICYmIGFuY2hvciA8PSBwb3MgKyBub2RlLm5vZGVTaXplXG4gICAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSAhbm9kZS5pc0xlYWYgJiYgIW5vZGUuY2hpbGRDb3VudFxuXG4gICAgICAgICAgICAgIGlmICgoaGFzQW5jaG9yIHx8ICF0aGlzLm9wdGlvbnMuc2hvd09ubHlDdXJyZW50KSAmJiBpc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IFt0aGlzLm9wdGlvbnMuZW1wdHlOb2RlQ2xhc3NdXG5cbiAgICAgICAgICAgICAgICBpZiAoaXNFZGl0b3JFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMub3B0aW9ucy5lbXB0eUVkaXRvckNsYXNzKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRpb24gPSBEZWNvcmF0aW9uLm5vZGUocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCB7XG4gICAgICAgICAgICAgICAgICBjbGFzczogY2xhc3Nlcy5qb2luKCcgJyksXG4gICAgICAgICAgICAgICAgICAnZGF0YS1wbGFjZWhvbGRlcic6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGRlY29yYXRpb24pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmluY2x1ZGVDaGlsZHJlblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuY3JlYXRlKGRvYywgZGVjb3JhdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgaXNNYWNPUyxcbiAgTWFyayxcbiAgbWFya0lucHV0UnVsZSxcbiAgbWFya1Bhc3RlUnVsZSxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaWtlT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc3RyaWtlOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNldCBhIHN0cmlrZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldFN0cmlrZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgc3RyaWtlIG1hcmtcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlU3RyaWtlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIHN0cmlrZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHVuc2V0U3RyaWtlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaW5wdXRSZWdleCA9IC8oPzpefFxccykoKD86fn4pKCg/Oltefl0rKSkoPzp+fikpJC9cbmV4cG9ydCBjb25zdCBwYXN0ZVJlZ2V4ID0gLyg/Ol58XFxzKSgoPzp+fikoKD86W15+XSspKSg/On5+KSkvZ1xuXG5leHBvcnQgY29uc3QgU3RyaWtlID0gTWFyay5jcmVhdGU8U3RyaWtlT3B0aW9ucz4oe1xuICBuYW1lOiAnc3RyaWtlJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdzJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2RlbCcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0YWc6ICdzdHJpa2UnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3R5bGU6ICd0ZXh0LWRlY29yYXRpb24nLFxuICAgICAgICBjb25zdW1pbmc6IGZhbHNlLFxuICAgICAgICBnZXRBdHRyczogc3R5bGUgPT4gKChzdHlsZSBhcyBzdHJpbmcpLmluY2x1ZGVzKCdsaW5lLXRocm91Z2gnKSA/IHt9IDogZmFsc2UpLFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTdHJpa2U6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZVN0cmlrZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRTdHJpa2U6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICBjb25zdCBzaG9ydGN1dHM6IFJlY29yZDxzdHJpbmcsICgpID0+IGJvb2xlYW4+ID0ge31cblxuICAgIGlmIChpc01hY09TKCkpIHtcbiAgICAgIHNob3J0Y3V0c1snTW9kLVNoaWZ0LXMnXSA9ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZVN0cmlrZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3J0Y3V0c1snQ3RybC1TaGlmdC1zJ10gPSAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVTdHJpa2UoKVxuICAgIH1cblxuICAgIHJldHVybiBzaG9ydGN1dHNcbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogaW5wdXRSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxuXG4gIGFkZFBhc3RlUnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hcmtQYXN0ZVJ1bGUoe1xuICAgICAgICBmaW5kOiBwYXN0ZVJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IE1hcmssIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpcHRFeHRlbnNpb25PcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IE9iamVjdCxcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHN1YnNjcmlwdDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzdWJzY3JpcHQgbWFya1xuICAgICAgICovXG4gICAgICBzZXRTdWJzY3JpcHQ6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIHN1YnNjcmlwdCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZVN1YnNjcmlwdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBzdWJzY3JpcHQgbWFya1xuICAgICAgICovXG4gICAgICB1bnNldFN1YnNjcmlwdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFN1YnNjcmlwdCA9IE1hcmsuY3JlYXRlPFN1YnNjcmlwdEV4dGVuc2lvbk9wdGlvbnM+KHtcbiAgbmFtZTogJ3N1YnNjcmlwdCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3ViJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiAndmVydGljYWwtYWxpZ24nLFxuICAgICAgICBnZXRBdHRycyh2YWx1ZSkge1xuICAgICAgICAgIC8vIERvbuKAmXQgbWF0Y2ggdGhpcyBydWxlIGlmIHRoZSB2ZXJ0aWNhbCBhbGlnbiBpc27igJl0IHN1Yi5cbiAgICAgICAgICBpZiAodmFsdWUgIT09ICdzdWInKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBpdCBmYWxscyB0aHJvdWdoIHdl4oCZbGwgbWF0Y2gsIGFuZCB0aGlzIG1hcmsgd2lsbCBiZSBhcHBsaWVkLlxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3N1YicsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3Vic2NyaXB0OiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB0b2dnbGVTdWJzY3JpcHQ6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZU1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHVuc2V0U3Vic2NyaXB0OiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtLCc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZVN1YnNjcmlwdCgpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgTWFyaywgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1cGVyc2NyaXB0RXh0ZW5zaW9uT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBPYmplY3QsXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzdXBlcnNjcmlwdDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzdXBlcnNjcmlwdCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldFN1cGVyc2NyaXB0OiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgYSBzdXBlcnNjcmlwdCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZVN1cGVyc2NyaXB0OiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIHN1cGVyc2NyaXB0IG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRTdXBlcnNjcmlwdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFN1cGVyc2NyaXB0ID0gTWFyay5jcmVhdGU8U3VwZXJzY3JpcHRFeHRlbnNpb25PcHRpb25zPih7XG4gIG5hbWU6ICdzdXBlcnNjcmlwdCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3VwJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiAndmVydGljYWwtYWxpZ24nLFxuICAgICAgICBnZXRBdHRycyh2YWx1ZSkge1xuICAgICAgICAgIC8vIERvbuKAmXQgbWF0Y2ggdGhpcyBydWxlIGlmIHRoZSB2ZXJ0aWNhbCBhbGlnbiBpc27igJl0IHN1cGVyLlxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gJ3N1cGVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgaXQgZmFsbHMgdGhyb3VnaCB3ZeKAmWxsIG1hdGNoLCBhbmQgdGhpcyBtYXJrIHdpbGwgYmUgYXBwbGllZC5cbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzdXAnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN1cGVyc2NyaXB0OiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB0b2dnbGVTdXBlcnNjcmlwdDogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRTdXBlcnNjcmlwdDogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLS4nOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVTdXBlcnNjcmlwdCgpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiLy8gc3JjL2luZGV4LnRzXG5pbXBvcnQgeyBQbHVnaW4gYXMgUGx1Z2luMiB9IGZyb20gXCJwcm9zZW1pcnJvci1zdGF0ZVwiO1xuXG4vLyBzcmMvY2VsbHNlbGVjdGlvbi50c1xuaW1wb3J0IHsgRnJhZ21lbnQsIFNsaWNlIH0gZnJvbSBcInByb3NlbWlycm9yLW1vZGVsXCI7XG5pbXBvcnQge1xuICBOb2RlU2VsZWN0aW9uIGFzIE5vZGVTZWxlY3Rpb24yLFxuICBTZWxlY3Rpb24sXG4gIFNlbGVjdGlvblJhbmdlLFxuICBUZXh0U2VsZWN0aW9uXG59IGZyb20gXCJwcm9zZW1pcnJvci1zdGF0ZVwiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCB9IGZyb20gXCJwcm9zZW1pcnJvci12aWV3XCI7XG5cbi8vIHNyYy90YWJsZW1hcC50c1xudmFyIHJlYWRGcm9tQ2FjaGU7XG52YXIgYWRkVG9DYWNoZTtcbmlmICh0eXBlb2YgV2Vha01hcCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gIGxldCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICByZWFkRnJvbUNhY2hlID0gKGtleSkgPT4gY2FjaGUuZ2V0KGtleSk7XG4gIGFkZFRvQ2FjaGUgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgIGNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59IGVsc2Uge1xuICBjb25zdCBjYWNoZSA9IFtdO1xuICBjb25zdCBjYWNoZVNpemUgPSAxMDtcbiAgbGV0IGNhY2hlUG9zID0gMDtcbiAgcmVhZEZyb21DYWNoZSA9IChrZXkpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgaSArPSAyKVxuICAgICAgaWYgKGNhY2hlW2ldID09IGtleSlcbiAgICAgICAgcmV0dXJuIGNhY2hlW2kgKyAxXTtcbiAgfTtcbiAgYWRkVG9DYWNoZSA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgaWYgKGNhY2hlUG9zID09IGNhY2hlU2l6ZSlcbiAgICAgIGNhY2hlUG9zID0gMDtcbiAgICBjYWNoZVtjYWNoZVBvcysrXSA9IGtleTtcbiAgICByZXR1cm4gY2FjaGVbY2FjaGVQb3MrK10gPSB2YWx1ZTtcbiAgfTtcbn1cbnZhciBUYWJsZU1hcCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCwgbWFwLCBwcm9ibGVtcykge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB0aGlzLnByb2JsZW1zID0gcHJvYmxlbXM7XG4gIH1cbiAgLy8gRmluZCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY2VsbCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gIGZpbmRDZWxsKHBvcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1clBvcyA9IHRoaXMubWFwW2ldO1xuICAgICAgaWYgKGN1clBvcyAhPSBwb3MpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbGVmdCA9IGkgJSB0aGlzLndpZHRoO1xuICAgICAgY29uc3QgdG9wID0gaSAvIHRoaXMud2lkdGggfCAwO1xuICAgICAgbGV0IHJpZ2h0ID0gbGVmdCArIDE7XG4gICAgICBsZXQgYm90dG9tID0gdG9wICsgMTtcbiAgICAgIGZvciAobGV0IGogPSAxOyByaWdodCA8IHRoaXMud2lkdGggJiYgdGhpcy5tYXBbaSArIGpdID09IGN1clBvczsgaisrKSB7XG4gICAgICAgIHJpZ2h0Kys7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBqID0gMTsgYm90dG9tIDwgdGhpcy5oZWlnaHQgJiYgdGhpcy5tYXBbaSArIHRoaXMud2lkdGggKiBqXSA9PSBjdXJQb3M7IGorKykge1xuICAgICAgICBib3R0b20rKztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gY2VsbCB3aXRoIG9mZnNldCAke3Bvc30gZm91bmRgKTtcbiAgfVxuICAvLyBGaW5kIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGNlbGwgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICBjb2xDb3VudChwb3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFwLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5tYXBbaV0gPT0gcG9zKSB7XG4gICAgICAgIHJldHVybiBpICUgdGhpcy53aWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIGNlbGwgd2l0aCBvZmZzZXQgJHtwb3N9IGZvdW5kYCk7XG4gIH1cbiAgLy8gRmluZCB0aGUgbmV4dCBjZWxsIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24sIHN0YXJ0aW5nIGZyb20gdGhlIGNlbGxcbiAgLy8gYXQgYHBvc2AsIGlmIGFueS5cbiAgbmV4dENlbGwocG9zLCBheGlzLCBkaXIpIHtcbiAgICBjb25zdCB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9ID0gdGhpcy5maW5kQ2VsbChwb3MpO1xuICAgIGlmIChheGlzID09IFwiaG9yaXpcIikge1xuICAgICAgaWYgKGRpciA8IDAgPyBsZWZ0ID09IDAgOiByaWdodCA9PSB0aGlzLndpZHRoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLm1hcFt0b3AgKiB0aGlzLndpZHRoICsgKGRpciA8IDAgPyBsZWZ0IC0gMSA6IHJpZ2h0KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkaXIgPCAwID8gdG9wID09IDAgOiBib3R0b20gPT0gdGhpcy5oZWlnaHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMubWFwW2xlZnQgKyB0aGlzLndpZHRoICogKGRpciA8IDAgPyB0b3AgLSAxIDogYm90dG9tKV07XG4gICAgfVxuICB9XG4gIC8vIEdldCB0aGUgcmVjdGFuZ2xlIHNwYW5uaW5nIHRoZSB0d28gZ2l2ZW4gY2VsbHMuXG4gIHJlY3RCZXR3ZWVuKGEsIGIpIHtcbiAgICBjb25zdCB7XG4gICAgICBsZWZ0OiBsZWZ0QSxcbiAgICAgIHJpZ2h0OiByaWdodEEsXG4gICAgICB0b3A6IHRvcEEsXG4gICAgICBib3R0b206IGJvdHRvbUFcbiAgICB9ID0gdGhpcy5maW5kQ2VsbChhKTtcbiAgICBjb25zdCB7XG4gICAgICBsZWZ0OiBsZWZ0QixcbiAgICAgIHJpZ2h0OiByaWdodEIsXG4gICAgICB0b3A6IHRvcEIsXG4gICAgICBib3R0b206IGJvdHRvbUJcbiAgICB9ID0gdGhpcy5maW5kQ2VsbChiKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogTWF0aC5taW4obGVmdEEsIGxlZnRCKSxcbiAgICAgIHRvcDogTWF0aC5taW4odG9wQSwgdG9wQiksXG4gICAgICByaWdodDogTWF0aC5tYXgocmlnaHRBLCByaWdodEIpLFxuICAgICAgYm90dG9tOiBNYXRoLm1heChib3R0b21BLCBib3R0b21CKVxuICAgIH07XG4gIH1cbiAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBhbGwgY2VsbHMgdGhhdCBoYXZlIHRoZSB0b3AgbGVmdCBjb3JuZXIgaW5cbiAgLy8gdGhlIGdpdmVuIHJlY3RhbmdsZS5cbiAgY2VsbHNJblJlY3QocmVjdCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSB7fTtcbiAgICBmb3IgKGxldCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSByZWN0LmxlZnQ7IGNvbCA8IHJlY3QucmlnaHQ7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcm93ICogdGhpcy53aWR0aCArIGNvbDtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5tYXBbaW5kZXhdO1xuICAgICAgICBpZiAoc2Vlbltwb3NdKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBzZWVuW3Bvc10gPSB0cnVlO1xuICAgICAgICBpZiAoY29sID09IHJlY3QubGVmdCAmJiBjb2wgJiYgdGhpcy5tYXBbaW5kZXggLSAxXSA9PSBwb3MgfHwgcm93ID09IHJlY3QudG9wICYmIHJvdyAmJiB0aGlzLm1hcFtpbmRleCAtIHRoaXMud2lkdGhdID09IHBvcykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHBvcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgY2VsbCBhdCB0aGUgZ2l2ZW4gcm93IGFuZCBjb2x1bW5cbiAgLy8gc3RhcnRzLCBvciB3b3VsZCBzdGFydCwgaWYgYSBjZWxsIHN0YXJ0ZWQgdGhlcmUuXG4gIHBvc2l0aW9uQXQocm93LCBjb2wsIHRhYmxlKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIHJvd1N0YXJ0ID0gMDsgOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvd0VuZCA9IHJvd1N0YXJ0ICsgdGFibGUuY2hpbGQoaSkubm9kZVNpemU7XG4gICAgICBpZiAoaSA9PSByb3cpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gY29sICsgcm93ICogdGhpcy53aWR0aDtcbiAgICAgICAgY29uc3Qgcm93RW5kSW5kZXggPSAocm93ICsgMSkgKiB0aGlzLndpZHRoO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCByb3dFbmRJbmRleCAmJiB0aGlzLm1hcFtpbmRleF0gPCByb3dTdGFydClcbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICByZXR1cm4gaW5kZXggPT0gcm93RW5kSW5kZXggPyByb3dFbmQgLSAxIDogdGhpcy5tYXBbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcm93U3RhcnQgPSByb3dFbmQ7XG4gICAgfVxuICB9XG4gIC8vIEZpbmQgdGhlIHRhYmxlIG1hcCBmb3IgdGhlIGdpdmVuIHRhYmxlIG5vZGUuXG4gIHN0YXRpYyBnZXQodGFibGUpIHtcbiAgICByZXR1cm4gcmVhZEZyb21DYWNoZSh0YWJsZSkgfHwgYWRkVG9DYWNoZSh0YWJsZSwgY29tcHV0ZU1hcCh0YWJsZSkpO1xuICB9XG59O1xuZnVuY3Rpb24gY29tcHV0ZU1hcCh0YWJsZSkge1xuICBpZiAodGFibGUudHlwZS5zcGVjLnRhYmxlUm9sZSAhPSBcInRhYmxlXCIpXG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJOb3QgYSB0YWJsZSBub2RlOiBcIiArIHRhYmxlLnR5cGUubmFtZSk7XG4gIGNvbnN0IHdpZHRoID0gZmluZFdpZHRoKHRhYmxlKSwgaGVpZ2h0ID0gdGFibGUuY2hpbGRDb3VudDtcbiAgY29uc3QgbWFwID0gW107XG4gIGxldCBtYXBQb3MgPSAwO1xuICBsZXQgcHJvYmxlbXMgPSBudWxsO1xuICBjb25zdCBjb2xXaWR0aHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGUgPSB3aWR0aCAqIGhlaWdodDsgaSA8IGU7IGkrKylcbiAgICBtYXBbaV0gPSAwO1xuICBmb3IgKGxldCByb3cgPSAwLCBwb3MgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3Qgcm93Tm9kZSA9IHRhYmxlLmNoaWxkKHJvdyk7XG4gICAgcG9zKys7XG4gICAgZm9yIChsZXQgaSA9IDA7IDsgaSsrKSB7XG4gICAgICB3aGlsZSAobWFwUG9zIDwgbWFwLmxlbmd0aCAmJiBtYXBbbWFwUG9zXSAhPSAwKVxuICAgICAgICBtYXBQb3MrKztcbiAgICAgIGlmIChpID09IHJvd05vZGUuY2hpbGRDb3VudClcbiAgICAgICAgYnJlYWs7XG4gICAgICBjb25zdCBjZWxsTm9kZSA9IHJvd05vZGUuY2hpbGQoaSk7XG4gICAgICBjb25zdCB7IGNvbHNwYW4sIHJvd3NwYW4sIGNvbHdpZHRoIH0gPSBjZWxsTm9kZS5hdHRycztcbiAgICAgIGZvciAobGV0IGggPSAwOyBoIDwgcm93c3BhbjsgaCsrKSB7XG4gICAgICAgIGlmIChoICsgcm93ID49IGhlaWdodCkge1xuICAgICAgICAgIChwcm9ibGVtcyB8fCAocHJvYmxlbXMgPSBbXSkpLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJvdmVybG9uZ19yb3dzcGFuXCIsXG4gICAgICAgICAgICBwb3MsXG4gICAgICAgICAgICBuOiByb3dzcGFuIC0gaFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbWFwUG9zICsgaCAqIHdpZHRoO1xuICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGNvbHNwYW47IHcrKykge1xuICAgICAgICAgIGlmIChtYXBbc3RhcnQgKyB3XSA9PSAwKVxuICAgICAgICAgICAgbWFwW3N0YXJ0ICsgd10gPSBwb3M7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgKHByb2JsZW1zIHx8IChwcm9ibGVtcyA9IFtdKSkucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiY29sbGlzaW9uXCIsXG4gICAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgICAgcG9zLFxuICAgICAgICAgICAgICBuOiBjb2xzcGFuIC0gd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgY29sVyA9IGNvbHdpZHRoICYmIGNvbHdpZHRoW3ddO1xuICAgICAgICAgIGlmIChjb2xXKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEluZGV4ID0gKHN0YXJ0ICsgdykgJSB3aWR0aCAqIDIsIHByZXYgPSBjb2xXaWR0aHNbd2lkdGhJbmRleF07XG4gICAgICAgICAgICBpZiAocHJldiA9PSBudWxsIHx8IHByZXYgIT0gY29sVyAmJiBjb2xXaWR0aHNbd2lkdGhJbmRleCArIDFdID09IDEpIHtcbiAgICAgICAgICAgICAgY29sV2lkdGhzW3dpZHRoSW5kZXhdID0gY29sVztcbiAgICAgICAgICAgICAgY29sV2lkdGhzW3dpZHRoSW5kZXggKyAxXSA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByZXYgPT0gY29sVykge1xuICAgICAgICAgICAgICBjb2xXaWR0aHNbd2lkdGhJbmRleCArIDFdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYXBQb3MgKz0gY29sc3BhbjtcbiAgICAgIHBvcyArPSBjZWxsTm9kZS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgY29uc3QgZXhwZWN0ZWRQb3MgPSAocm93ICsgMSkgKiB3aWR0aDtcbiAgICBsZXQgbWlzc2luZyA9IDA7XG4gICAgd2hpbGUgKG1hcFBvcyA8IGV4cGVjdGVkUG9zKVxuICAgICAgaWYgKG1hcFttYXBQb3MrK10gPT0gMClcbiAgICAgICAgbWlzc2luZysrO1xuICAgIGlmIChtaXNzaW5nKVxuICAgICAgKHByb2JsZW1zIHx8IChwcm9ibGVtcyA9IFtdKSkucHVzaCh7IHR5cGU6IFwibWlzc2luZ1wiLCByb3csIG46IG1pc3NpbmcgfSk7XG4gICAgcG9zKys7XG4gIH1cbiAgY29uc3QgdGFibGVNYXAgPSBuZXcgVGFibGVNYXAod2lkdGgsIGhlaWdodCwgbWFwLCBwcm9ibGVtcyk7XG4gIGxldCBiYWRXaWR0aHMgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7ICFiYWRXaWR0aHMgJiYgaSA8IGNvbFdpZHRocy5sZW5ndGg7IGkgKz0gMilcbiAgICBpZiAoY29sV2lkdGhzW2ldICE9IG51bGwgJiYgY29sV2lkdGhzW2kgKyAxXSA8IGhlaWdodClcbiAgICAgIGJhZFdpZHRocyA9IHRydWU7XG4gIGlmIChiYWRXaWR0aHMpXG4gICAgZmluZEJhZENvbFdpZHRocyh0YWJsZU1hcCwgY29sV2lkdGhzLCB0YWJsZSk7XG4gIHJldHVybiB0YWJsZU1hcDtcbn1cbmZ1bmN0aW9uIGZpbmRXaWR0aCh0YWJsZSkge1xuICBsZXQgd2lkdGggPSAtMTtcbiAgbGV0IGhhc1Jvd1NwYW4gPSBmYWxzZTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdGFibGUuY2hpbGRDb3VudDsgcm93KyspIHtcbiAgICBjb25zdCByb3dOb2RlID0gdGFibGUuY2hpbGQocm93KTtcbiAgICBsZXQgcm93V2lkdGggPSAwO1xuICAgIGlmIChoYXNSb3dTcGFuKVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3c7IGorKykge1xuICAgICAgICBjb25zdCBwcmV2Um93ID0gdGFibGUuY2hpbGQoaik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlJvdy5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjZWxsID0gcHJldlJvdy5jaGlsZChpKTtcbiAgICAgICAgICBpZiAoaiArIGNlbGwuYXR0cnMucm93c3BhbiA+IHJvdylcbiAgICAgICAgICAgIHJvd1dpZHRoICs9IGNlbGwuYXR0cnMuY29sc3BhbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Tm9kZS5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGNlbGwgPSByb3dOb2RlLmNoaWxkKGkpO1xuICAgICAgcm93V2lkdGggKz0gY2VsbC5hdHRycy5jb2xzcGFuO1xuICAgICAgaWYgKGNlbGwuYXR0cnMucm93c3BhbiA+IDEpXG4gICAgICAgIGhhc1Jvd1NwYW4gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAod2lkdGggPT0gLTEpXG4gICAgICB3aWR0aCA9IHJvd1dpZHRoO1xuICAgIGVsc2UgaWYgKHdpZHRoICE9IHJvd1dpZHRoKVxuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgcm93V2lkdGgpO1xuICB9XG4gIHJldHVybiB3aWR0aDtcbn1cbmZ1bmN0aW9uIGZpbmRCYWRDb2xXaWR0aHMobWFwLCBjb2xXaWR0aHMsIHRhYmxlKSB7XG4gIGlmICghbWFwLnByb2JsZW1zKVxuICAgIG1hcC5wcm9ibGVtcyA9IFtdO1xuICBjb25zdCBzZWVuID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwLm1hcC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBvcyA9IG1hcC5tYXBbaV07XG4gICAgaWYgKHNlZW5bcG9zXSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIHNlZW5bcG9zXSA9IHRydWU7XG4gICAgY29uc3Qgbm9kZSA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIGNlbGwgd2l0aCBvZmZzZXQgJHtwb3N9IGZvdW5kYCk7XG4gICAgfVxuICAgIGxldCB1cGRhdGVkID0gbnVsbDtcbiAgICBjb25zdCBhdHRycyA9IG5vZGUuYXR0cnM7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRycy5jb2xzcGFuOyBqKyspIHtcbiAgICAgIGNvbnN0IGNvbCA9IChpICsgaikgJSBtYXAud2lkdGg7XG4gICAgICBjb25zdCBjb2xXaWR0aCA9IGNvbFdpZHRoc1tjb2wgKiAyXTtcbiAgICAgIGlmIChjb2xXaWR0aCAhPSBudWxsICYmICghYXR0cnMuY29sd2lkdGggfHwgYXR0cnMuY29sd2lkdGhbal0gIT0gY29sV2lkdGgpKVxuICAgICAgICAodXBkYXRlZCB8fCAodXBkYXRlZCA9IGZyZXNoQ29sV2lkdGgoYXR0cnMpKSlbal0gPSBjb2xXaWR0aDtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZWQpXG4gICAgICBtYXAucHJvYmxlbXMudW5zaGlmdCh7XG4gICAgICAgIHR5cGU6IFwiY29sd2lkdGggbWlzbWF0Y2hcIixcbiAgICAgICAgcG9zLFxuICAgICAgICBjb2x3aWR0aDogdXBkYXRlZFxuICAgICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZyZXNoQ29sV2lkdGgoYXR0cnMpIHtcbiAgaWYgKGF0dHJzLmNvbHdpZHRoKVxuICAgIHJldHVybiBhdHRycy5jb2x3aWR0aC5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5jb2xzcGFuOyBpKyspXG4gICAgcmVzdWx0LnB1c2goMCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy91dGlsLnRzXG5pbXBvcnQgeyBQbHVnaW5LZXkgfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcblxuLy8gc3JjL3NjaGVtYS50c1xuZnVuY3Rpb24gZ2V0Q2VsbEF0dHJzKGRvbSwgZXh0cmFBdHRycykge1xuICBpZiAodHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCB3aWR0aEF0dHIgPSBkb20uZ2V0QXR0cmlidXRlKFwiZGF0YS1jb2x3aWR0aFwiKTtcbiAgY29uc3Qgd2lkdGhzID0gd2lkdGhBdHRyICYmIC9eXFxkKygsXFxkKykqJC8udGVzdCh3aWR0aEF0dHIpID8gd2lkdGhBdHRyLnNwbGl0KFwiLFwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkgOiBudWxsO1xuICBjb25zdCBjb2xzcGFuID0gTnVtYmVyKGRvbS5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpIHx8IDEpO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgY29sc3BhbixcbiAgICByb3dzcGFuOiBOdW1iZXIoZG9tLmdldEF0dHJpYnV0ZShcInJvd3NwYW5cIikgfHwgMSksXG4gICAgY29sd2lkdGg6IHdpZHRocyAmJiB3aWR0aHMubGVuZ3RoID09IGNvbHNwYW4gPyB3aWR0aHMgOiBudWxsXG4gIH07XG4gIGZvciAoY29uc3QgcHJvcCBpbiBleHRyYUF0dHJzKSB7XG4gICAgY29uc3QgZ2V0dGVyID0gZXh0cmFBdHRyc1twcm9wXS5nZXRGcm9tRE9NO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyICYmIGdldHRlcihkb20pO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNldENlbGxBdHRycyhub2RlLCBleHRyYUF0dHJzKSB7XG4gIGNvbnN0IGF0dHJzID0ge307XG4gIGlmIChub2RlLmF0dHJzLmNvbHNwYW4gIT0gMSlcbiAgICBhdHRycy5jb2xzcGFuID0gbm9kZS5hdHRycy5jb2xzcGFuO1xuICBpZiAobm9kZS5hdHRycy5yb3dzcGFuICE9IDEpXG4gICAgYXR0cnMucm93c3BhbiA9IG5vZGUuYXR0cnMucm93c3BhbjtcbiAgaWYgKG5vZGUuYXR0cnMuY29sd2lkdGgpXG4gICAgYXR0cnNbXCJkYXRhLWNvbHdpZHRoXCJdID0gbm9kZS5hdHRycy5jb2x3aWR0aC5qb2luKFwiLFwiKTtcbiAgZm9yIChjb25zdCBwcm9wIGluIGV4dHJhQXR0cnMpIHtcbiAgICBjb25zdCBzZXR0ZXIgPSBleHRyYUF0dHJzW3Byb3BdLnNldERPTUF0dHI7XG4gICAgaWYgKHNldHRlcilcbiAgICAgIHNldHRlcihub2RlLmF0dHJzW3Byb3BdLCBhdHRycyk7XG4gIH1cbiAgcmV0dXJuIGF0dHJzO1xufVxuZnVuY3Rpb24gdGFibGVOb2RlcyhvcHRpb25zKSB7XG4gIGNvbnN0IGV4dHJhQXR0cnMgPSBvcHRpb25zLmNlbGxBdHRyaWJ1dGVzIHx8IHt9O1xuICBjb25zdCBjZWxsQXR0cnMgPSB7XG4gICAgY29sc3BhbjogeyBkZWZhdWx0OiAxIH0sXG4gICAgcm93c3BhbjogeyBkZWZhdWx0OiAxIH0sXG4gICAgY29sd2lkdGg6IHsgZGVmYXVsdDogbnVsbCB9XG4gIH07XG4gIGZvciAoY29uc3QgcHJvcCBpbiBleHRyYUF0dHJzKVxuICAgIGNlbGxBdHRyc1twcm9wXSA9IHsgZGVmYXVsdDogZXh0cmFBdHRyc1twcm9wXS5kZWZhdWx0IH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHtcbiAgICAgIGNvbnRlbnQ6IFwidGFibGVfcm93K1wiLFxuICAgICAgdGFibGVSb2xlOiBcInRhYmxlXCIsXG4gICAgICBpc29sYXRpbmc6IHRydWUsXG4gICAgICBncm91cDogb3B0aW9ucy50YWJsZUdyb3VwLFxuICAgICAgcGFyc2VET006IFt7IHRhZzogXCJ0YWJsZVwiIH1dLFxuICAgICAgdG9ET00oKSB7XG4gICAgICAgIHJldHVybiBbXCJ0YWJsZVwiLCBbXCJ0Ym9keVwiLCAwXV07XG4gICAgICB9XG4gICAgfSxcbiAgICB0YWJsZV9yb3c6IHtcbiAgICAgIGNvbnRlbnQ6IFwiKHRhYmxlX2NlbGwgfCB0YWJsZV9oZWFkZXIpKlwiLFxuICAgICAgdGFibGVSb2xlOiBcInJvd1wiLFxuICAgICAgcGFyc2VET006IFt7IHRhZzogXCJ0clwiIH1dLFxuICAgICAgdG9ET00oKSB7XG4gICAgICAgIHJldHVybiBbXCJ0clwiLCAwXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYmxlX2NlbGw6IHtcbiAgICAgIGNvbnRlbnQ6IG9wdGlvbnMuY2VsbENvbnRlbnQsXG4gICAgICBhdHRyczogY2VsbEF0dHJzLFxuICAgICAgdGFibGVSb2xlOiBcImNlbGxcIixcbiAgICAgIGlzb2xhdGluZzogdHJ1ZSxcbiAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgIHsgdGFnOiBcInRkXCIsIGdldEF0dHJzOiAoZG9tKSA9PiBnZXRDZWxsQXR0cnMoZG9tLCBleHRyYUF0dHJzKSB9XG4gICAgICBdLFxuICAgICAgdG9ET00obm9kZSkge1xuICAgICAgICByZXR1cm4gW1widGRcIiwgc2V0Q2VsbEF0dHJzKG5vZGUsIGV4dHJhQXR0cnMpLCAwXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYmxlX2hlYWRlcjoge1xuICAgICAgY29udGVudDogb3B0aW9ucy5jZWxsQ29udGVudCxcbiAgICAgIGF0dHJzOiBjZWxsQXR0cnMsXG4gICAgICB0YWJsZVJvbGU6IFwiaGVhZGVyX2NlbGxcIixcbiAgICAgIGlzb2xhdGluZzogdHJ1ZSxcbiAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgIHsgdGFnOiBcInRoXCIsIGdldEF0dHJzOiAoZG9tKSA9PiBnZXRDZWxsQXR0cnMoZG9tLCBleHRyYUF0dHJzKSB9XG4gICAgICBdLFxuICAgICAgdG9ET00obm9kZSkge1xuICAgICAgICByZXR1cm4gW1widGhcIiwgc2V0Q2VsbEF0dHJzKG5vZGUsIGV4dHJhQXR0cnMpLCAwXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiB0YWJsZU5vZGVUeXBlcyhzY2hlbWEpIHtcbiAgbGV0IHJlc3VsdCA9IHNjaGVtYS5jYWNoZWQudGFibGVOb2RlVHlwZXM7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmVzdWx0ID0gc2NoZW1hLmNhY2hlZC50YWJsZU5vZGVUeXBlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBzY2hlbWEubm9kZXMpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBzY2hlbWEubm9kZXNbbmFtZV0sIHJvbGUgPSB0eXBlLnNwZWMudGFibGVSb2xlO1xuICAgICAgaWYgKHJvbGUpXG4gICAgICAgIHJlc3VsdFtyb2xlXSA9IHR5cGU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy91dGlsLnRzXG52YXIgdGFibGVFZGl0aW5nS2V5ID0gbmV3IFBsdWdpbktleShcInNlbGVjdGluZ0NlbGxzXCIpO1xuZnVuY3Rpb24gY2VsbEFyb3VuZCgkcG9zKSB7XG4gIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMTsgZCA+IDA7IGQtLSlcbiAgICBpZiAoJHBvcy5ub2RlKGQpLnR5cGUuc3BlYy50YWJsZVJvbGUgPT0gXCJyb3dcIilcbiAgICAgIHJldHVybiAkcG9zLm5vZGUoMCkucmVzb2x2ZSgkcG9zLmJlZm9yZShkICsgMSkpO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNlbGxXcmFwcGluZygkcG9zKSB7XG4gIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOyBkID4gMDsgZC0tKSB7XG4gICAgY29uc3Qgcm9sZSA9ICRwb3Mubm9kZShkKS50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgIGlmIChyb2xlID09PSBcImNlbGxcIiB8fCByb2xlID09PSBcImhlYWRlcl9jZWxsXCIpXG4gICAgICByZXR1cm4gJHBvcy5ub2RlKGQpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gaXNJblRhYmxlKHN0YXRlKSB7XG4gIGNvbnN0ICRoZWFkID0gc3RhdGUuc2VsZWN0aW9uLiRoZWFkO1xuICBmb3IgKGxldCBkID0gJGhlYWQuZGVwdGg7IGQgPiAwOyBkLS0pXG4gICAgaWYgKCRoZWFkLm5vZGUoZCkudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcInJvd1wiKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkNlbGwoc3RhdGUpIHtcbiAgY29uc3Qgc2VsID0gc3RhdGUuc2VsZWN0aW9uO1xuICBpZiAoXCIkYW5jaG9yQ2VsbFwiIGluIHNlbCAmJiBzZWwuJGFuY2hvckNlbGwpIHtcbiAgICByZXR1cm4gc2VsLiRhbmNob3JDZWxsLnBvcyA+IHNlbC4kaGVhZENlbGwucG9zID8gc2VsLiRhbmNob3JDZWxsIDogc2VsLiRoZWFkQ2VsbDtcbiAgfSBlbHNlIGlmIChcIm5vZGVcIiBpbiBzZWwgJiYgc2VsLm5vZGUgJiYgc2VsLm5vZGUudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcImNlbGxcIikge1xuICAgIHJldHVybiBzZWwuJGFuY2hvcjtcbiAgfVxuICBjb25zdCAkY2VsbCA9IGNlbGxBcm91bmQoc2VsLiRoZWFkKSB8fCBjZWxsTmVhcihzZWwuJGhlYWQpO1xuICBpZiAoJGNlbGwpIHtcbiAgICByZXR1cm4gJGNlbGw7XG4gIH1cbiAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIGNlbGwgZm91bmQgYXJvdW5kIHBvc2l0aW9uICR7c2VsLmhlYWR9YCk7XG59XG5mdW5jdGlvbiBjZWxsTmVhcigkcG9zKSB7XG4gIGZvciAobGV0IGFmdGVyID0gJHBvcy5ub2RlQWZ0ZXIsIHBvcyA9ICRwb3MucG9zOyBhZnRlcjsgYWZ0ZXIgPSBhZnRlci5maXJzdENoaWxkLCBwb3MrKykge1xuICAgIGNvbnN0IHJvbGUgPSBhZnRlci50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKVxuICAgICAgcmV0dXJuICRwb3MuZG9jLnJlc29sdmUocG9zKTtcbiAgfVxuICBmb3IgKGxldCBiZWZvcmUgPSAkcG9zLm5vZGVCZWZvcmUsIHBvcyA9ICRwb3MucG9zOyBiZWZvcmU7IGJlZm9yZSA9IGJlZm9yZS5sYXN0Q2hpbGQsIHBvcy0tKSB7XG4gICAgY29uc3Qgcm9sZSA9IGJlZm9yZS50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKVxuICAgICAgcmV0dXJuICRwb3MuZG9jLnJlc29sdmUocG9zIC0gYmVmb3JlLm5vZGVTaXplKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9pbnRzQXRDZWxsKCRwb3MpIHtcbiAgcmV0dXJuICRwb3MucGFyZW50LnR5cGUuc3BlYy50YWJsZVJvbGUgPT0gXCJyb3dcIiAmJiAhISRwb3Mubm9kZUFmdGVyO1xufVxuZnVuY3Rpb24gbW92ZUNlbGxGb3J3YXJkKCRwb3MpIHtcbiAgcmV0dXJuICRwb3Mubm9kZSgwKS5yZXNvbHZlKCRwb3MucG9zICsgJHBvcy5ub2RlQWZ0ZXIubm9kZVNpemUpO1xufVxuZnVuY3Rpb24gaW5TYW1lVGFibGUoJGNlbGxBLCAkY2VsbEIpIHtcbiAgcmV0dXJuICRjZWxsQS5kZXB0aCA9PSAkY2VsbEIuZGVwdGggJiYgJGNlbGxBLnBvcyA+PSAkY2VsbEIuc3RhcnQoLTEpICYmICRjZWxsQS5wb3MgPD0gJGNlbGxCLmVuZCgtMSk7XG59XG5mdW5jdGlvbiBmaW5kQ2VsbCgkcG9zKSB7XG4gIHJldHVybiBUYWJsZU1hcC5nZXQoJHBvcy5ub2RlKC0xKSkuZmluZENlbGwoJHBvcy5wb3MgLSAkcG9zLnN0YXJ0KC0xKSk7XG59XG5mdW5jdGlvbiBjb2xDb3VudCgkcG9zKSB7XG4gIHJldHVybiBUYWJsZU1hcC5nZXQoJHBvcy5ub2RlKC0xKSkuY29sQ291bnQoJHBvcy5wb3MgLSAkcG9zLnN0YXJ0KC0xKSk7XG59XG5mdW5jdGlvbiBuZXh0Q2VsbCgkcG9zLCBheGlzLCBkaXIpIHtcbiAgY29uc3QgdGFibGUgPSAkcG9zLm5vZGUoLTEpO1xuICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICBjb25zdCB0YWJsZVN0YXJ0ID0gJHBvcy5zdGFydCgtMSk7XG4gIGNvbnN0IG1vdmVkID0gbWFwLm5leHRDZWxsKCRwb3MucG9zIC0gdGFibGVTdGFydCwgYXhpcywgZGlyKTtcbiAgcmV0dXJuIG1vdmVkID09IG51bGwgPyBudWxsIDogJHBvcy5ub2RlKDApLnJlc29sdmUodGFibGVTdGFydCArIG1vdmVkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNvbFNwYW4oYXR0cnMsIHBvcywgbiA9IDEpIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5hdHRycywgY29sc3BhbjogYXR0cnMuY29sc3BhbiAtIG4gfTtcbiAgaWYgKHJlc3VsdC5jb2x3aWR0aCkge1xuICAgIHJlc3VsdC5jb2x3aWR0aCA9IHJlc3VsdC5jb2x3aWR0aC5zbGljZSgpO1xuICAgIHJlc3VsdC5jb2x3aWR0aC5zcGxpY2UocG9zLCBuKTtcbiAgICBpZiAoIXJlc3VsdC5jb2x3aWR0aC5zb21lKCh3KSA9PiB3ID4gMCkpXG4gICAgICByZXN1bHQuY29sd2lkdGggPSBudWxsO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBhZGRDb2xTcGFuKGF0dHJzLCBwb3MsIG4gPSAxKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4uYXR0cnMsIGNvbHNwYW46IGF0dHJzLmNvbHNwYW4gKyBuIH07XG4gIGlmIChyZXN1bHQuY29sd2lkdGgpIHtcbiAgICByZXN1bHQuY29sd2lkdGggPSByZXN1bHQuY29sd2lkdGguc2xpY2UoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKylcbiAgICAgIHJlc3VsdC5jb2x3aWR0aC5zcGxpY2UocG9zLCAwLCAwKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29sdW1uSXNIZWFkZXIobWFwLCB0YWJsZSwgY29sKSB7XG4gIGNvbnN0IGhlYWRlckNlbGwgPSB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkuaGVhZGVyX2NlbGw7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG1hcC5oZWlnaHQ7IHJvdysrKVxuICAgIGlmICh0YWJsZS5ub2RlQXQobWFwLm1hcFtjb2wgKyByb3cgKiBtYXAud2lkdGhdKS50eXBlICE9IGhlYWRlckNlbGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvY2VsbHNlbGVjdGlvbi50c1xudmFyIENlbGxTZWxlY3Rpb24gPSBjbGFzcyBfQ2VsbFNlbGVjdGlvbiBleHRlbmRzIFNlbGVjdGlvbiB7XG4gIC8vIEEgdGFibGUgc2VsZWN0aW9uIGlzIGlkZW50aWZpZWQgYnkgaXRzIGFuY2hvciBhbmQgaGVhZCBjZWxscy4gVGhlXG4gIC8vIHBvc2l0aW9ucyBnaXZlbiB0byB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBwb2ludCBfYmVmb3JlXyB0d29cbiAgLy8gY2VsbHMgaW4gdGhlIHNhbWUgdGFibGUuIFRoZXkgbWF5IGJlIHRoZSBzYW1lLCB0byBzZWxlY3QgYSBzaW5nbGVcbiAgLy8gY2VsbC5cbiAgY29uc3RydWN0b3IoJGFuY2hvckNlbGwsICRoZWFkQ2VsbCA9ICRhbmNob3JDZWxsKSB7XG4gICAgY29uc3QgdGFibGUgPSAkYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgIGNvbnN0IHRhYmxlU3RhcnQgPSAkYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgcmVjdCA9IG1hcC5yZWN0QmV0d2VlbihcbiAgICAgICRhbmNob3JDZWxsLnBvcyAtIHRhYmxlU3RhcnQsXG4gICAgICAkaGVhZENlbGwucG9zIC0gdGFibGVTdGFydFxuICAgICk7XG4gICAgY29uc3QgZG9jID0gJGFuY2hvckNlbGwubm9kZSgwKTtcbiAgICBjb25zdCBjZWxscyA9IG1hcC5jZWxsc0luUmVjdChyZWN0KS5maWx0ZXIoKHApID0+IHAgIT0gJGhlYWRDZWxsLnBvcyAtIHRhYmxlU3RhcnQpO1xuICAgIGNlbGxzLnVuc2hpZnQoJGhlYWRDZWxsLnBvcyAtIHRhYmxlU3RhcnQpO1xuICAgIGNvbnN0IHJhbmdlcyA9IGNlbGxzLm1hcCgocG9zKSA9PiB7XG4gICAgICBjb25zdCBjZWxsID0gdGFibGUubm9kZUF0KHBvcyk7XG4gICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgTm8gY2VsbCB3aXRoIG9mZnNldCAke3Bvc30gZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZyb20gPSB0YWJsZVN0YXJ0ICsgcG9zICsgMTtcbiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgIGRvYy5yZXNvbHZlKGZyb20pLFxuICAgICAgICBkb2MucmVzb2x2ZShmcm9tICsgY2VsbC5jb250ZW50LnNpemUpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHN1cGVyKHJhbmdlc1swXS4kZnJvbSwgcmFuZ2VzWzBdLiR0bywgcmFuZ2VzKTtcbiAgICB0aGlzLiRhbmNob3JDZWxsID0gJGFuY2hvckNlbGw7XG4gICAgdGhpcy4kaGVhZENlbGwgPSAkaGVhZENlbGw7XG4gIH1cbiAgbWFwKGRvYywgbWFwcGluZykge1xuICAgIGNvbnN0ICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUobWFwcGluZy5tYXAodGhpcy4kYW5jaG9yQ2VsbC5wb3MpKTtcbiAgICBjb25zdCAkaGVhZENlbGwgPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcCh0aGlzLiRoZWFkQ2VsbC5wb3MpKTtcbiAgICBpZiAocG9pbnRzQXRDZWxsKCRhbmNob3JDZWxsKSAmJiBwb2ludHNBdENlbGwoJGhlYWRDZWxsKSAmJiBpblNhbWVUYWJsZSgkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKSkge1xuICAgICAgY29uc3QgdGFibGVDaGFuZ2VkID0gdGhpcy4kYW5jaG9yQ2VsbC5ub2RlKC0xKSAhPSAkYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICAgIGlmICh0YWJsZUNoYW5nZWQgJiYgdGhpcy5pc1Jvd1NlbGVjdGlvbigpKVxuICAgICAgICByZXR1cm4gX0NlbGxTZWxlY3Rpb24ucm93U2VsZWN0aW9uKCRhbmNob3JDZWxsLCAkaGVhZENlbGwpO1xuICAgICAgZWxzZSBpZiAodGFibGVDaGFuZ2VkICYmIHRoaXMuaXNDb2xTZWxlY3Rpb24oKSlcbiAgICAgICAgcmV0dXJuIF9DZWxsU2VsZWN0aW9uLmNvbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG5ldyBfQ2VsbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2VlbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgfVxuICAvLyBSZXR1cm5zIGEgcmVjdGFuZ3VsYXIgc2xpY2Ugb2YgdGFibGUgcm93cyBjb250YWluaW5nIHRoZSBzZWxlY3RlZFxuICAvLyBjZWxscy5cbiAgY29udGVudCgpIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuJGFuY2hvckNlbGwubm9kZSgtMSk7XG4gICAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHRhYmxlKTtcbiAgICBjb25zdCB0YWJsZVN0YXJ0ID0gdGhpcy4kYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgcmVjdCA9IG1hcC5yZWN0QmV0d2VlbihcbiAgICAgIHRoaXMuJGFuY2hvckNlbGwucG9zIC0gdGFibGVTdGFydCxcbiAgICAgIHRoaXMuJGhlYWRDZWxsLnBvcyAtIHRhYmxlU3RhcnRcbiAgICApO1xuICAgIGNvbnN0IHNlZW4gPSB7fTtcbiAgICBjb25zdCByb3dzID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykge1xuICAgICAgY29uc3Qgcm93Q29udGVudCA9IFtdO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSByb3cgKiBtYXAud2lkdGggKyByZWN0LmxlZnQsIGNvbCA9IHJlY3QubGVmdDsgY29sIDwgcmVjdC5yaWdodDsgY29sKyssIGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgICAgIGlmIChzZWVuW3Bvc10pXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIHNlZW5bcG9zXSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGNlbGxSZWN0ID0gbWFwLmZpbmRDZWxsKHBvcyk7XG4gICAgICAgIGxldCBjZWxsID0gdGFibGUubm9kZUF0KHBvcyk7XG4gICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoYE5vIGNlbGwgd2l0aCBvZmZzZXQgJHtwb3N9IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0cmFMZWZ0ID0gcmVjdC5sZWZ0IC0gY2VsbFJlY3QubGVmdDtcbiAgICAgICAgY29uc3QgZXh0cmFSaWdodCA9IGNlbGxSZWN0LnJpZ2h0IC0gcmVjdC5yaWdodDtcbiAgICAgICAgaWYgKGV4dHJhTGVmdCA+IDAgfHwgZXh0cmFSaWdodCA+IDApIHtcbiAgICAgICAgICBsZXQgYXR0cnMgPSBjZWxsLmF0dHJzO1xuICAgICAgICAgIGlmIChleHRyYUxlZnQgPiAwKSB7XG4gICAgICAgICAgICBhdHRycyA9IHJlbW92ZUNvbFNwYW4oYXR0cnMsIDAsIGV4dHJhTGVmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHRyYVJpZ2h0ID4gMCkge1xuICAgICAgICAgICAgYXR0cnMgPSByZW1vdmVDb2xTcGFuKFxuICAgICAgICAgICAgICBhdHRycyxcbiAgICAgICAgICAgICAgYXR0cnMuY29sc3BhbiAtIGV4dHJhUmlnaHQsXG4gICAgICAgICAgICAgIGV4dHJhUmlnaHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjZWxsUmVjdC5sZWZ0IDwgcmVjdC5sZWZ0KSB7XG4gICAgICAgICAgICBjZWxsID0gY2VsbC50eXBlLmNyZWF0ZUFuZEZpbGwoYXR0cnMpO1xuICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBjcmVhdGUgY2VsbCB3aXRoIGF0dHJzICR7SlNPTi5zdHJpbmdpZnkoYXR0cnMpfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VsbCA9IGNlbGwudHlwZS5jcmVhdGUoYXR0cnMsIGNlbGwuY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsUmVjdC50b3AgPCByZWN0LnRvcCB8fCBjZWxsUmVjdC5ib3R0b20gPiByZWN0LmJvdHRvbSkge1xuICAgICAgICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgICAgIHJvd3NwYW46IE1hdGgubWluKGNlbGxSZWN0LmJvdHRvbSwgcmVjdC5ib3R0b20pIC0gTWF0aC5tYXgoY2VsbFJlY3QudG9wLCByZWN0LnRvcClcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjZWxsUmVjdC50b3AgPCByZWN0LnRvcCkge1xuICAgICAgICAgICAgY2VsbCA9IGNlbGwudHlwZS5jcmVhdGVBbmRGaWxsKGF0dHJzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VsbCA9IGNlbGwudHlwZS5jcmVhdGUoYXR0cnMsIGNlbGwuY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJvd0NvbnRlbnQucHVzaChjZWxsKTtcbiAgICAgIH1cbiAgICAgIHJvd3MucHVzaCh0YWJsZS5jaGlsZChyb3cpLmNvcHkoRnJhZ21lbnQuZnJvbShyb3dDb250ZW50KSkpO1xuICAgIH1cbiAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuaXNDb2xTZWxlY3Rpb24oKSAmJiB0aGlzLmlzUm93U2VsZWN0aW9uKCkgPyB0YWJsZSA6IHJvd3M7XG4gICAgcmV0dXJuIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGZyYWdtZW50KSwgMSwgMSk7XG4gIH1cbiAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgY29uc3QgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aCwgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldLCBtYXBwaW5nID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKTtcbiAgICAgIHRyLnJlcGxhY2UoXG4gICAgICAgIG1hcHBpbmcubWFwKCRmcm9tLnBvcyksXG4gICAgICAgIG1hcHBpbmcubWFwKCR0by5wb3MpLFxuICAgICAgICBpID8gU2xpY2UuZW1wdHkgOiBjb250ZW50XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZWwgPSBTZWxlY3Rpb24uZmluZEZyb20oXG4gICAgICB0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcCh0aGlzLnRvKSksXG4gICAgICAtMVxuICAgICk7XG4gICAgaWYgKHNlbClcbiAgICAgIHRyLnNldFNlbGVjdGlvbihzZWwpO1xuICB9XG4gIHJlcGxhY2VXaXRoKHRyLCBub2RlKSB7XG4gICAgdGhpcy5yZXBsYWNlKHRyLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShub2RlKSwgMCwgMCkpO1xuICB9XG4gIGZvckVhY2hDZWxsKGYpIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuJGFuY2hvckNlbGwubm9kZSgtMSk7XG4gICAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHRhYmxlKTtcbiAgICBjb25zdCB0YWJsZVN0YXJ0ID0gdGhpcy4kYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgY2VsbHMgPSBtYXAuY2VsbHNJblJlY3QoXG4gICAgICBtYXAucmVjdEJldHdlZW4oXG4gICAgICAgIHRoaXMuJGFuY2hvckNlbGwucG9zIC0gdGFibGVTdGFydCxcbiAgICAgICAgdGhpcy4kaGVhZENlbGwucG9zIC0gdGFibGVTdGFydFxuICAgICAgKVxuICAgICk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgZih0YWJsZS5ub2RlQXQoY2VsbHNbaV0pLCB0YWJsZVN0YXJ0ICsgY2VsbHNbaV0pO1xuICAgIH1cbiAgfVxuICAvLyBUcnVlIGlmIHRoaXMgc2VsZWN0aW9uIGdvZXMgYWxsIHRoZSB3YXkgZnJvbSB0aGUgdG9wIHRvIHRoZVxuICAvLyBib3R0b20gb2YgdGhlIHRhYmxlLlxuICBpc0NvbFNlbGVjdGlvbigpIHtcbiAgICBjb25zdCBhbmNob3JUb3AgPSB0aGlzLiRhbmNob3JDZWxsLmluZGV4KC0xKTtcbiAgICBjb25zdCBoZWFkVG9wID0gdGhpcy4kaGVhZENlbGwuaW5kZXgoLTEpO1xuICAgIGlmIChNYXRoLm1pbihhbmNob3JUb3AsIGhlYWRUb3ApID4gMClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhbmNob3JCb3R0b20gPSBhbmNob3JUb3AgKyB0aGlzLiRhbmNob3JDZWxsLm5vZGVBZnRlci5hdHRycy5yb3dzcGFuO1xuICAgIGNvbnN0IGhlYWRCb3R0b20gPSBoZWFkVG9wICsgdGhpcy4kaGVhZENlbGwubm9kZUFmdGVyLmF0dHJzLnJvd3NwYW47XG4gICAgcmV0dXJuIE1hdGgubWF4KGFuY2hvckJvdHRvbSwgaGVhZEJvdHRvbSkgPT0gdGhpcy4kaGVhZENlbGwubm9kZSgtMSkuY2hpbGRDb3VudDtcbiAgfVxuICAvLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBjb2x1bW4gc2VsZWN0aW9uIHRoYXQgY292ZXJzIHRoZSBnaXZlbiBhbmNob3JcbiAgLy8gYW5kIGhlYWQgY2VsbC5cbiAgc3RhdGljIGNvbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsID0gJGFuY2hvckNlbGwpIHtcbiAgICBjb25zdCB0YWJsZSA9ICRhbmNob3JDZWxsLm5vZGUoLTEpO1xuICAgIGNvbnN0IG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gICAgY29uc3QgdGFibGVTdGFydCA9ICRhbmNob3JDZWxsLnN0YXJ0KC0xKTtcbiAgICBjb25zdCBhbmNob3JSZWN0ID0gbWFwLmZpbmRDZWxsKCRhbmNob3JDZWxsLnBvcyAtIHRhYmxlU3RhcnQpO1xuICAgIGNvbnN0IGhlYWRSZWN0ID0gbWFwLmZpbmRDZWxsKCRoZWFkQ2VsbC5wb3MgLSB0YWJsZVN0YXJ0KTtcbiAgICBjb25zdCBkb2MgPSAkYW5jaG9yQ2VsbC5ub2RlKDApO1xuICAgIGlmIChhbmNob3JSZWN0LnRvcCA8PSBoZWFkUmVjdC50b3ApIHtcbiAgICAgIGlmIChhbmNob3JSZWN0LnRvcCA+IDApXG4gICAgICAgICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUodGFibGVTdGFydCArIG1hcC5tYXBbYW5jaG9yUmVjdC5sZWZ0XSk7XG4gICAgICBpZiAoaGVhZFJlY3QuYm90dG9tIDwgbWFwLmhlaWdodClcbiAgICAgICAgJGhlYWRDZWxsID0gZG9jLnJlc29sdmUoXG4gICAgICAgICAgdGFibGVTdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogKG1hcC5oZWlnaHQgLSAxKSArIGhlYWRSZWN0LnJpZ2h0IC0gMV1cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhlYWRSZWN0LnRvcCA+IDApXG4gICAgICAgICRoZWFkQ2VsbCA9IGRvYy5yZXNvbHZlKHRhYmxlU3RhcnQgKyBtYXAubWFwW2hlYWRSZWN0LmxlZnRdKTtcbiAgICAgIGlmIChhbmNob3JSZWN0LmJvdHRvbSA8IG1hcC5oZWlnaHQpXG4gICAgICAgICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUoXG4gICAgICAgICAgdGFibGVTdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogKG1hcC5oZWlnaHQgLSAxKSArIGFuY2hvclJlY3QucmlnaHQgLSAxXVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9DZWxsU2VsZWN0aW9uKCRhbmNob3JDZWxsLCAkaGVhZENlbGwpO1xuICB9XG4gIC8vIFRydWUgaWYgdGhpcyBzZWxlY3Rpb24gZ29lcyBhbGwgdGhlIHdheSBmcm9tIHRoZSBsZWZ0IHRvIHRoZVxuICAvLyByaWdodCBvZiB0aGUgdGFibGUuXG4gIGlzUm93U2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgIGNvbnN0IHRhYmxlU3RhcnQgPSB0aGlzLiRhbmNob3JDZWxsLnN0YXJ0KC0xKTtcbiAgICBjb25zdCBhbmNob3JMZWZ0ID0gbWFwLmNvbENvdW50KHRoaXMuJGFuY2hvckNlbGwucG9zIC0gdGFibGVTdGFydCk7XG4gICAgY29uc3QgaGVhZExlZnQgPSBtYXAuY29sQ291bnQodGhpcy4kaGVhZENlbGwucG9zIC0gdGFibGVTdGFydCk7XG4gICAgaWYgKE1hdGgubWluKGFuY2hvckxlZnQsIGhlYWRMZWZ0KSA+IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYW5jaG9yUmlnaHQgPSBhbmNob3JMZWZ0ICsgdGhpcy4kYW5jaG9yQ2VsbC5ub2RlQWZ0ZXIuYXR0cnMuY29sc3BhbjtcbiAgICBjb25zdCBoZWFkUmlnaHQgPSBoZWFkTGVmdCArIHRoaXMuJGhlYWRDZWxsLm5vZGVBZnRlci5hdHRycy5jb2xzcGFuO1xuICAgIHJldHVybiBNYXRoLm1heChhbmNob3JSaWdodCwgaGVhZFJpZ2h0KSA9PSBtYXAud2lkdGg7XG4gIH1cbiAgZXEob3RoZXIpIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBfQ2VsbFNlbGVjdGlvbiAmJiBvdGhlci4kYW5jaG9yQ2VsbC5wb3MgPT0gdGhpcy4kYW5jaG9yQ2VsbC5wb3MgJiYgb3RoZXIuJGhlYWRDZWxsLnBvcyA9PSB0aGlzLiRoZWFkQ2VsbC5wb3M7XG4gIH1cbiAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgcm93IHNlbGVjdGlvbiB0aGF0IGNvdmVycyB0aGUgZ2l2ZW4gYW5jaG9yXG4gIC8vIGFuZCBoZWFkIGNlbGwuXG4gIHN0YXRpYyByb3dTZWxlY3Rpb24oJGFuY2hvckNlbGwsICRoZWFkQ2VsbCA9ICRhbmNob3JDZWxsKSB7XG4gICAgY29uc3QgdGFibGUgPSAkYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgIGNvbnN0IHRhYmxlU3RhcnQgPSAkYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgYW5jaG9yUmVjdCA9IG1hcC5maW5kQ2VsbCgkYW5jaG9yQ2VsbC5wb3MgLSB0YWJsZVN0YXJ0KTtcbiAgICBjb25zdCBoZWFkUmVjdCA9IG1hcC5maW5kQ2VsbCgkaGVhZENlbGwucG9zIC0gdGFibGVTdGFydCk7XG4gICAgY29uc3QgZG9jID0gJGFuY2hvckNlbGwubm9kZSgwKTtcbiAgICBpZiAoYW5jaG9yUmVjdC5sZWZ0IDw9IGhlYWRSZWN0LmxlZnQpIHtcbiAgICAgIGlmIChhbmNob3JSZWN0LmxlZnQgPiAwKVxuICAgICAgICAkYW5jaG9yQ2VsbCA9IGRvYy5yZXNvbHZlKFxuICAgICAgICAgIHRhYmxlU3RhcnQgKyBtYXAubWFwW2FuY2hvclJlY3QudG9wICogbWFwLndpZHRoXVxuICAgICAgICApO1xuICAgICAgaWYgKGhlYWRSZWN0LnJpZ2h0IDwgbWFwLndpZHRoKVxuICAgICAgICAkaGVhZENlbGwgPSBkb2MucmVzb2x2ZShcbiAgICAgICAgICB0YWJsZVN0YXJ0ICsgbWFwLm1hcFttYXAud2lkdGggKiAoaGVhZFJlY3QudG9wICsgMSkgLSAxXVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGVhZFJlY3QubGVmdCA+IDApXG4gICAgICAgICRoZWFkQ2VsbCA9IGRvYy5yZXNvbHZlKHRhYmxlU3RhcnQgKyBtYXAubWFwW2hlYWRSZWN0LnRvcCAqIG1hcC53aWR0aF0pO1xuICAgICAgaWYgKGFuY2hvclJlY3QucmlnaHQgPCBtYXAud2lkdGgpXG4gICAgICAgICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUoXG4gICAgICAgICAgdGFibGVTdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogKGFuY2hvclJlY3QudG9wICsgMSkgLSAxXVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9DZWxsU2VsZWN0aW9uKCRhbmNob3JDZWxsLCAkaGVhZENlbGwpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjZWxsXCIsXG4gICAgICBhbmNob3I6IHRoaXMuJGFuY2hvckNlbGwucG9zLFxuICAgICAgaGVhZDogdGhpcy4kaGVhZENlbGwucG9zXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgZnJvbUpTT04oZG9jLCBqc29uKSB7XG4gICAgcmV0dXJuIG5ldyBfQ2VsbFNlbGVjdGlvbihkb2MucmVzb2x2ZShqc29uLmFuY2hvciksIGRvYy5yZXNvbHZlKGpzb24uaGVhZCkpO1xuICB9XG4gIHN0YXRpYyBjcmVhdGUoZG9jLCBhbmNob3JDZWxsLCBoZWFkQ2VsbCA9IGFuY2hvckNlbGwpIHtcbiAgICByZXR1cm4gbmV3IF9DZWxsU2VsZWN0aW9uKGRvYy5yZXNvbHZlKGFuY2hvckNlbGwpLCBkb2MucmVzb2x2ZShoZWFkQ2VsbCkpO1xuICB9XG4gIGdldEJvb2ttYXJrKCkge1xuICAgIHJldHVybiBuZXcgQ2VsbEJvb2ttYXJrKHRoaXMuJGFuY2hvckNlbGwucG9zLCB0aGlzLiRoZWFkQ2VsbC5wb3MpO1xuICB9XG59O1xuQ2VsbFNlbGVjdGlvbi5wcm90b3R5cGUudmlzaWJsZSA9IGZhbHNlO1xuU2VsZWN0aW9uLmpzb25JRChcImNlbGxcIiwgQ2VsbFNlbGVjdGlvbik7XG52YXIgQ2VsbEJvb2ttYXJrID0gY2xhc3MgX0NlbGxCb29rbWFyayB7XG4gIGNvbnN0cnVjdG9yKGFuY2hvciwgaGVhZCkge1xuICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gIH1cbiAgbWFwKG1hcHBpbmcpIHtcbiAgICByZXR1cm4gbmV3IF9DZWxsQm9va21hcmsobWFwcGluZy5tYXAodGhpcy5hbmNob3IpLCBtYXBwaW5nLm1hcCh0aGlzLmhlYWQpKTtcbiAgfVxuICByZXNvbHZlKGRvYykge1xuICAgIGNvbnN0ICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUodGhpcy5hbmNob3IpLCAkaGVhZENlbGwgPSBkb2MucmVzb2x2ZSh0aGlzLmhlYWQpO1xuICAgIGlmICgkYW5jaG9yQ2VsbC5wYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcInJvd1wiICYmICRoZWFkQ2VsbC5wYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcInJvd1wiICYmICRhbmNob3JDZWxsLmluZGV4KCkgPCAkYW5jaG9yQ2VsbC5wYXJlbnQuY2hpbGRDb3VudCAmJiAkaGVhZENlbGwuaW5kZXgoKSA8ICRoZWFkQ2VsbC5wYXJlbnQuY2hpbGRDb3VudCAmJiBpblNhbWVUYWJsZSgkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKSlcbiAgICAgIHJldHVybiBuZXcgQ2VsbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJGhlYWRDZWxsLCAxKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGRyYXdDZWxsU2VsZWN0aW9uKHN0YXRlKSB7XG4gIGlmICghKHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCBjZWxscyA9IFtdO1xuICBzdGF0ZS5zZWxlY3Rpb24uZm9yRWFjaENlbGwoKG5vZGUsIHBvcykgPT4ge1xuICAgIGNlbGxzLnB1c2goXG4gICAgICBEZWNvcmF0aW9uLm5vZGUocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCB7IGNsYXNzOiBcInNlbGVjdGVkQ2VsbFwiIH0pXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiBEZWNvcmF0aW9uU2V0LmNyZWF0ZShzdGF0ZS5kb2MsIGNlbGxzKTtcbn1cbmZ1bmN0aW9uIGlzQ2VsbEJvdW5kYXJ5U2VsZWN0aW9uKHsgJGZyb20sICR0byB9KSB7XG4gIGlmICgkZnJvbS5wb3MgPT0gJHRvLnBvcyB8fCAkZnJvbS5wb3MgPCAkZnJvbS5wb3MgLSA2KVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IGFmdGVyRnJvbSA9ICRmcm9tLnBvcztcbiAgbGV0IGJlZm9yZVRvID0gJHRvLnBvcztcbiAgbGV0IGRlcHRoID0gJGZyb20uZGVwdGg7XG4gIGZvciAoOyBkZXB0aCA+PSAwOyBkZXB0aC0tLCBhZnRlckZyb20rKylcbiAgICBpZiAoJGZyb20uYWZ0ZXIoZGVwdGggKyAxKSA8ICRmcm9tLmVuZChkZXB0aCkpXG4gICAgICBicmVhaztcbiAgZm9yIChsZXQgZCA9ICR0by5kZXB0aDsgZCA+PSAwOyBkLS0sIGJlZm9yZVRvLS0pXG4gICAgaWYgKCR0by5iZWZvcmUoZCArIDEpID4gJHRvLnN0YXJ0KGQpKVxuICAgICAgYnJlYWs7XG4gIHJldHVybiBhZnRlckZyb20gPT0gYmVmb3JlVG8gJiYgL3Jvd3x0YWJsZS8udGVzdCgkZnJvbS5ub2RlKGRlcHRoKS50eXBlLnNwZWMudGFibGVSb2xlKTtcbn1cbmZ1bmN0aW9uIGlzVGV4dFNlbGVjdGlvbkFjcm9zc0NlbGxzKHsgJGZyb20sICR0byB9KSB7XG4gIGxldCBmcm9tQ2VsbEJvdW5kYXJ5Tm9kZTtcbiAgbGV0IHRvQ2VsbEJvdW5kYXJ5Tm9kZTtcbiAgZm9yIChsZXQgaSA9ICRmcm9tLmRlcHRoOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3Qgbm9kZSA9ICRmcm9tLm5vZGUoaSk7XG4gICAgaWYgKG5vZGUudHlwZS5zcGVjLnRhYmxlUm9sZSA9PT0gXCJjZWxsXCIgfHwgbm9kZS50eXBlLnNwZWMudGFibGVSb2xlID09PSBcImhlYWRlcl9jZWxsXCIpIHtcbiAgICAgIGZyb21DZWxsQm91bmRhcnlOb2RlID0gbm9kZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gJHRvLmRlcHRoOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3Qgbm9kZSA9ICR0by5ub2RlKGkpO1xuICAgIGlmIChub2RlLnR5cGUuc3BlYy50YWJsZVJvbGUgPT09IFwiY2VsbFwiIHx8IG5vZGUudHlwZS5zcGVjLnRhYmxlUm9sZSA9PT0gXCJoZWFkZXJfY2VsbFwiKSB7XG4gICAgICB0b0NlbGxCb3VuZGFyeU5vZGUgPSBub2RlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmcm9tQ2VsbEJvdW5kYXJ5Tm9kZSAhPT0gdG9DZWxsQm91bmRhcnlOb2RlICYmICR0by5wYXJlbnRPZmZzZXQgPT09IDA7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTZWxlY3Rpb24oc3RhdGUsIHRyLCBhbGxvd1RhYmxlTm9kZVNlbGVjdGlvbikge1xuICBjb25zdCBzZWwgPSAodHIgfHwgc3RhdGUpLnNlbGVjdGlvbjtcbiAgY29uc3QgZG9jID0gKHRyIHx8IHN0YXRlKS5kb2M7XG4gIGxldCBub3JtYWxpemU7XG4gIGxldCByb2xlO1xuICBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbjIgJiYgKHJvbGUgPSBzZWwubm9kZS50eXBlLnNwZWMudGFibGVSb2xlKSkge1xuICAgIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKSB7XG4gICAgICBub3JtYWxpemUgPSBDZWxsU2VsZWN0aW9uLmNyZWF0ZShkb2MsIHNlbC5mcm9tKTtcbiAgICB9IGVsc2UgaWYgKHJvbGUgPT0gXCJyb3dcIikge1xuICAgICAgY29uc3QgJGNlbGwgPSBkb2MucmVzb2x2ZShzZWwuZnJvbSArIDEpO1xuICAgICAgbm9ybWFsaXplID0gQ2VsbFNlbGVjdGlvbi5yb3dTZWxlY3Rpb24oJGNlbGwsICRjZWxsKTtcbiAgICB9IGVsc2UgaWYgKCFhbGxvd1RhYmxlTm9kZVNlbGVjdGlvbikge1xuICAgICAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHNlbC5ub2RlKTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gc2VsLmZyb20gKyAxO1xuICAgICAgY29uc3QgbGFzdENlbGwgPSBzdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogbWFwLmhlaWdodCAtIDFdO1xuICAgICAgbm9ybWFsaXplID0gQ2VsbFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBzdGFydCArIDEsIGxhc3RDZWxsKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBpc0NlbGxCb3VuZGFyeVNlbGVjdGlvbihzZWwpKSB7XG4gICAgbm9ybWFsaXplID0gVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBzZWwuZnJvbSk7XG4gIH0gZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBpc1RleHRTZWxlY3Rpb25BY3Jvc3NDZWxscyhzZWwpKSB7XG4gICAgbm9ybWFsaXplID0gVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBzZWwuJGZyb20uc3RhcnQoKSwgc2VsLiRmcm9tLmVuZCgpKTtcbiAgfVxuICBpZiAobm9ybWFsaXplKVxuICAgICh0ciB8fCAodHIgPSBzdGF0ZS50cikpLnNldFNlbGVjdGlvbihub3JtYWxpemUpO1xuICByZXR1cm4gdHI7XG59XG5cbi8vIHNyYy9maXh0YWJsZXMudHNcbmltcG9ydCB7IFBsdWdpbktleSBhcyBQbHVnaW5LZXkyIH0gZnJvbSBcInByb3NlbWlycm9yLXN0YXRlXCI7XG52YXIgZml4VGFibGVzS2V5ID0gbmV3IFBsdWdpbktleTIoXCJmaXgtdGFibGVzXCIpO1xuZnVuY3Rpb24gY2hhbmdlZERlc2NlbmRhbnRzKG9sZCwgY3VyLCBvZmZzZXQsIGYpIHtcbiAgY29uc3Qgb2xkU2l6ZSA9IG9sZC5jaGlsZENvdW50LCBjdXJTaXplID0gY3VyLmNoaWxkQ291bnQ7XG4gIG91dGVyOlxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGN1clNpemU7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBjdXIuY2hpbGQoaSk7XG4gICAgICBmb3IgKGxldCBzY2FuID0gaiwgZSA9IE1hdGgubWluKG9sZFNpemUsIGkgKyAzKTsgc2NhbiA8IGU7IHNjYW4rKykge1xuICAgICAgICBpZiAob2xkLmNoaWxkKHNjYW4pID09IGNoaWxkKSB7XG4gICAgICAgICAgaiA9IHNjYW4gKyAxO1xuICAgICAgICAgIG9mZnNldCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZihjaGlsZCwgb2Zmc2V0KTtcbiAgICAgIGlmIChqIDwgb2xkU2l6ZSAmJiBvbGQuY2hpbGQoaikuc2FtZU1hcmt1cChjaGlsZCkpXG4gICAgICAgIGNoYW5nZWREZXNjZW5kYW50cyhvbGQuY2hpbGQoaiksIGNoaWxkLCBvZmZzZXQgKyAxLCBmKTtcbiAgICAgIGVsc2VcbiAgICAgICAgY2hpbGQubm9kZXNCZXR3ZWVuKDAsIGNoaWxkLmNvbnRlbnQuc2l6ZSwgZiwgb2Zmc2V0ICsgMSk7XG4gICAgICBvZmZzZXQgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgfVxufVxuZnVuY3Rpb24gZml4VGFibGVzKHN0YXRlLCBvbGRTdGF0ZSkge1xuICBsZXQgdHI7XG4gIGNvbnN0IGNoZWNrID0gKG5vZGUsIHBvcykgPT4ge1xuICAgIGlmIChub2RlLnR5cGUuc3BlYy50YWJsZVJvbGUgPT0gXCJ0YWJsZVwiKVxuICAgICAgdHIgPSBmaXhUYWJsZShzdGF0ZSwgbm9kZSwgcG9zLCB0cik7XG4gIH07XG4gIGlmICghb2xkU3RhdGUpXG4gICAgc3RhdGUuZG9jLmRlc2NlbmRhbnRzKGNoZWNrKTtcbiAgZWxzZSBpZiAob2xkU3RhdGUuZG9jICE9IHN0YXRlLmRvYylcbiAgICBjaGFuZ2VkRGVzY2VuZGFudHMob2xkU3RhdGUuZG9jLCBzdGF0ZS5kb2MsIDAsIGNoZWNrKTtcbiAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gZml4VGFibGUoc3RhdGUsIHRhYmxlLCB0YWJsZVBvcywgdHIpIHtcbiAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHRhYmxlKTtcbiAgaWYgKCFtYXAucHJvYmxlbXMpXG4gICAgcmV0dXJuIHRyO1xuICBpZiAoIXRyKVxuICAgIHRyID0gc3RhdGUudHI7XG4gIGNvbnN0IG11c3RBZGQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXAuaGVpZ2h0OyBpKyspXG4gICAgbXVzdEFkZC5wdXNoKDApO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcC5wcm9ibGVtcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByb2IgPSBtYXAucHJvYmxlbXNbaV07XG4gICAgaWYgKHByb2IudHlwZSA9PSBcImNvbGxpc2lvblwiKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGFibGUubm9kZUF0KHByb2IucG9zKTtcbiAgICAgIGlmICghY2VsbClcbiAgICAgICAgY29udGludWU7XG4gICAgICBjb25zdCBhdHRycyA9IGNlbGwuYXR0cnM7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJzLnJvd3NwYW47IGorKylcbiAgICAgICAgbXVzdEFkZFtwcm9iLnJvdyArIGpdICs9IHByb2IubjtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgIHRyLm1hcHBpbmcubWFwKHRhYmxlUG9zICsgMSArIHByb2IucG9zKSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcmVtb3ZlQ29sU3BhbihhdHRycywgYXR0cnMuY29sc3BhbiAtIHByb2IubiwgcHJvYi5uKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHByb2IudHlwZSA9PSBcIm1pc3NpbmdcIikge1xuICAgICAgbXVzdEFkZFtwcm9iLnJvd10gKz0gcHJvYi5uO1xuICAgIH0gZWxzZSBpZiAocHJvYi50eXBlID09IFwib3Zlcmxvbmdfcm93c3BhblwiKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGFibGUubm9kZUF0KHByb2IucG9zKTtcbiAgICAgIGlmICghY2VsbClcbiAgICAgICAgY29udGludWU7XG4gICAgICB0ci5zZXROb2RlTWFya3VwKHRyLm1hcHBpbmcubWFwKHRhYmxlUG9zICsgMSArIHByb2IucG9zKSwgbnVsbCwge1xuICAgICAgICAuLi5jZWxsLmF0dHJzLFxuICAgICAgICByb3dzcGFuOiBjZWxsLmF0dHJzLnJvd3NwYW4gLSBwcm9iLm5cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocHJvYi50eXBlID09IFwiY29sd2lkdGggbWlzbWF0Y2hcIikge1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwcm9iLnBvcyk7XG4gICAgICBpZiAoIWNlbGwpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdHIuc2V0Tm9kZU1hcmt1cCh0ci5tYXBwaW5nLm1hcCh0YWJsZVBvcyArIDEgKyBwcm9iLnBvcyksIG51bGwsIHtcbiAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgY29sd2lkdGg6IHByb2IuY29sd2lkdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBsZXQgZmlyc3QsIGxhc3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbXVzdEFkZC5sZW5ndGg7IGkrKylcbiAgICBpZiAobXVzdEFkZFtpXSkge1xuICAgICAgaWYgKGZpcnN0ID09IG51bGwpXG4gICAgICAgIGZpcnN0ID0gaTtcbiAgICAgIGxhc3QgPSBpO1xuICAgIH1cbiAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IHRhYmxlUG9zICsgMTsgaSA8IG1hcC5oZWlnaHQ7IGkrKykge1xuICAgIGNvbnN0IHJvdyA9IHRhYmxlLmNoaWxkKGkpO1xuICAgIGNvbnN0IGVuZCA9IHBvcyArIHJvdy5ub2RlU2l6ZTtcbiAgICBjb25zdCBhZGQgPSBtdXN0QWRkW2ldO1xuICAgIGlmIChhZGQgPiAwKSB7XG4gICAgICBsZXQgcm9sZSA9IFwiY2VsbFwiO1xuICAgICAgaWYgKHJvdy5maXJzdENoaWxkKSB7XG4gICAgICAgIHJvbGUgPSByb3cuZmlyc3RDaGlsZC50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYWRkOyBqKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSlbcm9sZV0uY3JlYXRlQW5kRmlsbCgpO1xuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2lkZSA9IChpID09IDAgfHwgZmlyc3QgPT0gaSAtIDEpICYmIGxhc3QgPT0gaSA/IHBvcyArIDEgOiBlbmQgLSAxO1xuICAgICAgdHIuaW5zZXJ0KHRyLm1hcHBpbmcubWFwKHNpZGUpLCBub2Rlcyk7XG4gICAgfVxuICAgIHBvcyA9IGVuZDtcbiAgfVxuICByZXR1cm4gdHIuc2V0TWV0YShmaXhUYWJsZXNLZXksIHsgZml4VGFibGVzOiB0cnVlIH0pO1xufVxuXG4vLyBzcmMvaW5wdXQudHNcbmltcG9ydCB7IEZyYWdtZW50IGFzIEZyYWdtZW50MywgU2xpY2UgYXMgU2xpY2UzIH0gZnJvbSBcInByb3NlbWlycm9yLW1vZGVsXCI7XG5pbXBvcnQge1xuICBTZWxlY3Rpb24gYXMgU2VsZWN0aW9uMixcbiAgVGV4dFNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uMlxufSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmltcG9ydCB7IGtleWRvd25IYW5kbGVyIH0gZnJvbSBcInByb3NlbWlycm9yLWtleW1hcFwiO1xuXG4vLyBzcmMvY29weXBhc3RlLnRzXG5pbXBvcnQgeyBGcmFnbWVudCBhcyBGcmFnbWVudDIsIFNsaWNlIGFzIFNsaWNlMiB9IGZyb20gXCJwcm9zZW1pcnJvci1tb2RlbFwiO1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSBcInByb3NlbWlycm9yLXRyYW5zZm9ybVwiO1xuZnVuY3Rpb24gcGFzdGVkQ2VsbHMoc2xpY2UpIHtcbiAgaWYgKCFzbGljZS5zaXplKVxuICAgIHJldHVybiBudWxsO1xuICBsZXQgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHNsaWNlO1xuICB3aGlsZSAoY29udGVudC5jaGlsZENvdW50ID09IDEgJiYgKG9wZW5TdGFydCA+IDAgJiYgb3BlbkVuZCA+IDAgfHwgY29udGVudC5jaGlsZCgwKS50eXBlLnNwZWMudGFibGVSb2xlID09IFwidGFibGVcIikpIHtcbiAgICBvcGVuU3RhcnQtLTtcbiAgICBvcGVuRW5kLS07XG4gICAgY29udGVudCA9IGNvbnRlbnQuY2hpbGQoMCkuY29udGVudDtcbiAgfVxuICBjb25zdCBmaXJzdCA9IGNvbnRlbnQuY2hpbGQoMCk7XG4gIGNvbnN0IHJvbGUgPSBmaXJzdC50eXBlLnNwZWMudGFibGVSb2xlO1xuICBjb25zdCBzY2hlbWEgPSBmaXJzdC50eXBlLnNjaGVtYSwgcm93cyA9IFtdO1xuICBpZiAocm9sZSA9PSBcInJvd1wiKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50LmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgbGV0IGNlbGxzID0gY29udGVudC5jaGlsZChpKS5jb250ZW50O1xuICAgICAgY29uc3QgbGVmdCA9IGkgPyAwIDogTWF0aC5tYXgoMCwgb3BlblN0YXJ0IC0gMSk7XG4gICAgICBjb25zdCByaWdodCA9IGkgPCBjb250ZW50LmNoaWxkQ291bnQgLSAxID8gMCA6IE1hdGgubWF4KDAsIG9wZW5FbmQgLSAxKTtcbiAgICAgIGlmIChsZWZ0IHx8IHJpZ2h0KVxuICAgICAgICBjZWxscyA9IGZpdFNsaWNlKFxuICAgICAgICAgIHRhYmxlTm9kZVR5cGVzKHNjaGVtYSkucm93LFxuICAgICAgICAgIG5ldyBTbGljZTIoY2VsbHMsIGxlZnQsIHJpZ2h0KVxuICAgICAgICApLmNvbnRlbnQ7XG4gICAgICByb3dzLnB1c2goY2VsbHMpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKSB7XG4gICAgcm93cy5wdXNoKFxuICAgICAgb3BlblN0YXJ0IHx8IG9wZW5FbmQgPyBmaXRTbGljZShcbiAgICAgICAgdGFibGVOb2RlVHlwZXMoc2NoZW1hKS5yb3csXG4gICAgICAgIG5ldyBTbGljZTIoY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kKVxuICAgICAgKS5jb250ZW50IDogY29udGVudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGVuc3VyZVJlY3Rhbmd1bGFyKHNjaGVtYSwgcm93cyk7XG59XG5mdW5jdGlvbiBlbnN1cmVSZWN0YW5ndWxhcihzY2hlbWEsIHJvd3MpIHtcbiAgY29uc3Qgd2lkdGhzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gICAgZm9yIChsZXQgaiA9IHJvdy5jaGlsZENvdW50IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIGNvbnN0IHsgcm93c3BhbiwgY29sc3BhbiB9ID0gcm93LmNoaWxkKGopLmF0dHJzO1xuICAgICAgZm9yIChsZXQgciA9IGk7IHIgPCBpICsgcm93c3BhbjsgcisrKVxuICAgICAgICB3aWR0aHNbcl0gPSAod2lkdGhzW3JdIHx8IDApICsgY29sc3BhbjtcbiAgICB9XG4gIH1cbiAgbGV0IHdpZHRoID0gMDtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCB3aWR0aHMubGVuZ3RoOyByKyspXG4gICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgd2lkdGhzW3JdKTtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCB3aWR0aHMubGVuZ3RoOyByKyspIHtcbiAgICBpZiAociA+PSByb3dzLmxlbmd0aClcbiAgICAgIHJvd3MucHVzaChGcmFnbWVudDIuZW1wdHkpO1xuICAgIGlmICh3aWR0aHNbcl0gPCB3aWR0aCkge1xuICAgICAgY29uc3QgZW1wdHkgPSB0YWJsZU5vZGVUeXBlcyhzY2hlbWEpLmNlbGwuY3JlYXRlQW5kRmlsbCgpO1xuICAgICAgY29uc3QgY2VsbHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSB3aWR0aHNbcl07IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgICAgIGNlbGxzLnB1c2goZW1wdHkpO1xuICAgICAgfVxuICAgICAgcm93c1tyXSA9IHJvd3Nbcl0uYXBwZW5kKEZyYWdtZW50Mi5mcm9tKGNlbGxzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGhlaWdodDogcm93cy5sZW5ndGgsIHdpZHRoLCByb3dzIH07XG59XG5mdW5jdGlvbiBmaXRTbGljZShub2RlVHlwZSwgc2xpY2UpIHtcbiAgY29uc3Qgbm9kZSA9IG5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTtcbiAgY29uc3QgdHIgPSBuZXcgVHJhbnNmb3JtKG5vZGUpLnJlcGxhY2UoMCwgbm9kZS5jb250ZW50LnNpemUsIHNsaWNlKTtcbiAgcmV0dXJuIHRyLmRvYztcbn1cbmZ1bmN0aW9uIGNsaXBDZWxscyh7IHdpZHRoLCBoZWlnaHQsIHJvd3MgfSwgbmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICBpZiAod2lkdGggIT0gbmV3V2lkdGgpIHtcbiAgICBjb25zdCBhZGRlZCA9IFtdO1xuICAgIGNvbnN0IG5ld1Jvd3MgPSBbXTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dzLmxlbmd0aDsgcm93KyspIHtcbiAgICAgIGNvbnN0IGZyYWcgPSByb3dzW3Jvd10sIGNlbGxzID0gW107XG4gICAgICBmb3IgKGxldCBjb2wgPSBhZGRlZFtyb3ddIHx8IDAsIGkgPSAwOyBjb2wgPCBuZXdXaWR0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjZWxsID0gZnJhZy5jaGlsZChpICUgZnJhZy5jaGlsZENvdW50KTtcbiAgICAgICAgaWYgKGNvbCArIGNlbGwuYXR0cnMuY29sc3BhbiA+IG5ld1dpZHRoKVxuICAgICAgICAgIGNlbGwgPSBjZWxsLnR5cGUuY3JlYXRlQ2hlY2tlZChcbiAgICAgICAgICAgIHJlbW92ZUNvbFNwYW4oXG4gICAgICAgICAgICAgIGNlbGwuYXR0cnMsXG4gICAgICAgICAgICAgIGNlbGwuYXR0cnMuY29sc3BhbixcbiAgICAgICAgICAgICAgY29sICsgY2VsbC5hdHRycy5jb2xzcGFuIC0gbmV3V2lkdGhcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRcbiAgICAgICAgICApO1xuICAgICAgICBjZWxscy5wdXNoKGNlbGwpO1xuICAgICAgICBjb2wgKz0gY2VsbC5hdHRycy5jb2xzcGFuO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGNlbGwuYXR0cnMucm93c3BhbjsgaisrKVxuICAgICAgICAgIGFkZGVkW3JvdyArIGpdID0gKGFkZGVkW3JvdyArIGpdIHx8IDApICsgY2VsbC5hdHRycy5jb2xzcGFuO1xuICAgICAgfVxuICAgICAgbmV3Um93cy5wdXNoKEZyYWdtZW50Mi5mcm9tKGNlbGxzKSk7XG4gICAgfVxuICAgIHJvd3MgPSBuZXdSb3dzO1xuICAgIHdpZHRoID0gbmV3V2lkdGg7XG4gIH1cbiAgaWYgKGhlaWdodCAhPSBuZXdIZWlnaHQpIHtcbiAgICBjb25zdCBuZXdSb3dzID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMCwgaSA9IDA7IHJvdyA8IG5ld0hlaWdodDsgcm93KyssIGkrKykge1xuICAgICAgY29uc3QgY2VsbHMgPSBbXSwgc291cmNlID0gcm93c1tpICUgaGVpZ2h0XTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc291cmNlLmNoaWxkQ291bnQ7IGorKykge1xuICAgICAgICBsZXQgY2VsbCA9IHNvdXJjZS5jaGlsZChqKTtcbiAgICAgICAgaWYgKHJvdyArIGNlbGwuYXR0cnMucm93c3BhbiA+IG5ld0hlaWdodClcbiAgICAgICAgICBjZWxsID0gY2VsbC50eXBlLmNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgICAgICAgcm93c3BhbjogTWF0aC5tYXgoMSwgbmV3SGVpZ2h0IC0gY2VsbC5hdHRycy5yb3dzcGFuKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNlbGwuY29udGVudFxuICAgICAgICAgICk7XG4gICAgICAgIGNlbGxzLnB1c2goY2VsbCk7XG4gICAgICB9XG4gICAgICBuZXdSb3dzLnB1c2goRnJhZ21lbnQyLmZyb20oY2VsbHMpKTtcbiAgICB9XG4gICAgcm93cyA9IG5ld1Jvd3M7XG4gICAgaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICB9XG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIHJvd3MgfTtcbn1cbmZ1bmN0aW9uIGdyb3dUYWJsZSh0ciwgbWFwLCB0YWJsZSwgc3RhcnQsIHdpZHRoLCBoZWlnaHQsIG1hcEZyb20pIHtcbiAgY29uc3Qgc2NoZW1hID0gdHIuZG9jLnR5cGUuc2NoZW1hO1xuICBjb25zdCB0eXBlcyA9IHRhYmxlTm9kZVR5cGVzKHNjaGVtYSk7XG4gIGxldCBlbXB0eTtcbiAgbGV0IGVtcHR5SGVhZDtcbiAgaWYgKHdpZHRoID4gbWFwLndpZHRoKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMCwgcm93RW5kID0gMDsgcm93IDwgbWFwLmhlaWdodDsgcm93KyspIHtcbiAgICAgIGNvbnN0IHJvd05vZGUgPSB0YWJsZS5jaGlsZChyb3cpO1xuICAgICAgcm93RW5kICs9IHJvd05vZGUubm9kZVNpemU7XG4gICAgICBjb25zdCBjZWxscyA9IFtdO1xuICAgICAgbGV0IGFkZDtcbiAgICAgIGlmIChyb3dOb2RlLmxhc3RDaGlsZCA9PSBudWxsIHx8IHJvd05vZGUubGFzdENoaWxkLnR5cGUgPT0gdHlwZXMuY2VsbClcbiAgICAgICAgYWRkID0gZW1wdHkgfHwgKGVtcHR5ID0gdHlwZXMuY2VsbC5jcmVhdGVBbmRGaWxsKCkpO1xuICAgICAgZWxzZVxuICAgICAgICBhZGQgPSBlbXB0eUhlYWQgfHwgKGVtcHR5SGVhZCA9IHR5cGVzLmhlYWRlcl9jZWxsLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICBmb3IgKGxldCBpID0gbWFwLndpZHRoOyBpIDwgd2lkdGg7IGkrKylcbiAgICAgICAgY2VsbHMucHVzaChhZGQpO1xuICAgICAgdHIuaW5zZXJ0KHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHJvd0VuZCAtIDEgKyBzdGFydCksIGNlbGxzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGhlaWdodCA+IG1hcC5oZWlnaHQpIHtcbiAgICBjb25zdCBjZWxscyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdGFydDIgPSAobWFwLmhlaWdodCAtIDEpICogbWFwLndpZHRoOyBpIDwgTWF0aC5tYXgobWFwLndpZHRoLCB3aWR0aCk7IGkrKykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaSA+PSBtYXAud2lkdGggPyBmYWxzZSA6IHRhYmxlLm5vZGVBdChtYXAubWFwW3N0YXJ0MiArIGldKS50eXBlID09IHR5cGVzLmhlYWRlcl9jZWxsO1xuICAgICAgY2VsbHMucHVzaChcbiAgICAgICAgaGVhZGVyID8gZW1wdHlIZWFkIHx8IChlbXB0eUhlYWQgPSB0eXBlcy5oZWFkZXJfY2VsbC5jcmVhdGVBbmRGaWxsKCkpIDogZW1wdHkgfHwgKGVtcHR5ID0gdHlwZXMuY2VsbC5jcmVhdGVBbmRGaWxsKCkpXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBlbXB0eVJvdyA9IHR5cGVzLnJvdy5jcmVhdGUobnVsbCwgRnJhZ21lbnQyLmZyb20oY2VsbHMpKSwgcm93cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBtYXAuaGVpZ2h0OyBpIDwgaGVpZ2h0OyBpKyspXG4gICAgICByb3dzLnB1c2goZW1wdHlSb3cpO1xuICAgIHRyLmluc2VydCh0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChzdGFydCArIHRhYmxlLm5vZGVTaXplIC0gMiksIHJvd3MpO1xuICB9XG4gIHJldHVybiAhIShlbXB0eSB8fCBlbXB0eUhlYWQpO1xufVxuZnVuY3Rpb24gaXNvbGF0ZUhvcml6b250YWwodHIsIG1hcCwgdGFibGUsIHN0YXJ0LCBsZWZ0LCByaWdodCwgdG9wLCBtYXBGcm9tKSB7XG4gIGlmICh0b3AgPT0gMCB8fCB0b3AgPT0gbWFwLmhlaWdodClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGxldCBmb3VuZCA9IGZhbHNlO1xuICBmb3IgKGxldCBjb2wgPSBsZWZ0OyBjb2wgPCByaWdodDsgY29sKyspIHtcbiAgICBjb25zdCBpbmRleCA9IHRvcCAqIG1hcC53aWR0aCArIGNvbCwgcG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgaWYgKG1hcC5tYXBbaW5kZXggLSBtYXAud2lkdGhdID09IHBvcykge1xuICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgICAgY29uc3QgeyB0b3A6IGNlbGxUb3AsIGxlZnQ6IGNlbGxMZWZ0IH0gPSBtYXAuZmluZENlbGwocG9zKTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAodHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zICsgc3RhcnQpLCBudWxsLCB7XG4gICAgICAgIC4uLmNlbGwuYXR0cnMsXG4gICAgICAgIHJvd3NwYW46IHRvcCAtIGNlbGxUb3BcbiAgICAgIH0pO1xuICAgICAgdHIuaW5zZXJ0KFxuICAgICAgICB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChtYXAucG9zaXRpb25BdCh0b3AsIGNlbGxMZWZ0LCB0YWJsZSkpLFxuICAgICAgICBjZWxsLnR5cGUuY3JlYXRlQW5kRmlsbCh7XG4gICAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgICByb3dzcGFuOiBjZWxsVG9wICsgY2VsbC5hdHRycy5yb3dzcGFuIC0gdG9wXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29sICs9IGNlbGwuYXR0cnMuY29sc3BhbiAtIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGlzb2xhdGVWZXJ0aWNhbCh0ciwgbWFwLCB0YWJsZSwgc3RhcnQsIHRvcCwgYm90dG9tLCBsZWZ0LCBtYXBGcm9tKSB7XG4gIGlmIChsZWZ0ID09IDAgfHwgbGVmdCA9PSBtYXAud2lkdGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgcm93ID0gdG9wOyByb3cgPCBib3R0b207IHJvdysrKSB7XG4gICAgY29uc3QgaW5kZXggPSByb3cgKiBtYXAud2lkdGggKyBsZWZ0LCBwb3MgPSBtYXAubWFwW2luZGV4XTtcbiAgICBpZiAobWFwLm1hcFtpbmRleCAtIDFdID09IHBvcykge1xuICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgICAgY29uc3QgY2VsbExlZnQgPSBtYXAuY29sQ291bnQocG9zKTtcbiAgICAgIGNvbnN0IHVwZGF0ZVBvcyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyArIHN0YXJ0KTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgIHVwZGF0ZVBvcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcmVtb3ZlQ29sU3BhbihcbiAgICAgICAgICBjZWxsLmF0dHJzLFxuICAgICAgICAgIGxlZnQgLSBjZWxsTGVmdCxcbiAgICAgICAgICBjZWxsLmF0dHJzLmNvbHNwYW4gLSAobGVmdCAtIGNlbGxMZWZ0KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgdHIuaW5zZXJ0KFxuICAgICAgICB1cGRhdGVQb3MgKyBjZWxsLm5vZGVTaXplLFxuICAgICAgICBjZWxsLnR5cGUuY3JlYXRlQW5kRmlsbChcbiAgICAgICAgICByZW1vdmVDb2xTcGFuKGNlbGwuYXR0cnMsIDAsIGxlZnQgLSBjZWxsTGVmdClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJvdyArPSBjZWxsLmF0dHJzLnJvd3NwYW4gLSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBpbnNlcnRDZWxscyhzdGF0ZSwgZGlzcGF0Y2gsIHRhYmxlU3RhcnQsIHJlY3QsIGNlbGxzKSB7XG4gIGxldCB0YWJsZSA9IHRhYmxlU3RhcnQgPyBzdGF0ZS5kb2Mubm9kZUF0KHRhYmxlU3RhcnQgLSAxKSA6IHN0YXRlLmRvYztcbiAgaWYgKCF0YWJsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHRhYmxlIGZvdW5kXCIpO1xuICB9XG4gIGxldCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICBjb25zdCB7IHRvcCwgbGVmdCB9ID0gcmVjdDtcbiAgY29uc3QgcmlnaHQgPSBsZWZ0ICsgY2VsbHMud2lkdGgsIGJvdHRvbSA9IHRvcCArIGNlbGxzLmhlaWdodDtcbiAgY29uc3QgdHIgPSBzdGF0ZS50cjtcbiAgbGV0IG1hcEZyb20gPSAwO1xuICBmdW5jdGlvbiByZWNvbXAoKSB7XG4gICAgdGFibGUgPSB0YWJsZVN0YXJ0ID8gdHIuZG9jLm5vZGVBdCh0YWJsZVN0YXJ0IC0gMSkgOiB0ci5kb2M7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFibGUgZm91bmRcIik7XG4gICAgfVxuICAgIG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gICAgbWFwRnJvbSA9IHRyLm1hcHBpbmcubWFwcy5sZW5ndGg7XG4gIH1cbiAgaWYgKGdyb3dUYWJsZSh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgcmlnaHQsIGJvdHRvbSwgbWFwRnJvbSkpXG4gICAgcmVjb21wKCk7XG4gIGlmIChpc29sYXRlSG9yaXpvbnRhbCh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgbGVmdCwgcmlnaHQsIHRvcCwgbWFwRnJvbSkpXG4gICAgcmVjb21wKCk7XG4gIGlmIChpc29sYXRlSG9yaXpvbnRhbCh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgbWFwRnJvbSkpXG4gICAgcmVjb21wKCk7XG4gIGlmIChpc29sYXRlVmVydGljYWwodHIsIG1hcCwgdGFibGUsIHRhYmxlU3RhcnQsIHRvcCwgYm90dG9tLCBsZWZ0LCBtYXBGcm9tKSlcbiAgICByZWNvbXAoKTtcbiAgaWYgKGlzb2xhdGVWZXJ0aWNhbCh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgdG9wLCBib3R0b20sIHJpZ2h0LCBtYXBGcm9tKSlcbiAgICByZWNvbXAoKTtcbiAgZm9yIChsZXQgcm93ID0gdG9wOyByb3cgPCBib3R0b207IHJvdysrKSB7XG4gICAgY29uc3QgZnJvbSA9IG1hcC5wb3NpdGlvbkF0KHJvdywgbGVmdCwgdGFibGUpLCB0byA9IG1hcC5wb3NpdGlvbkF0KHJvdywgcmlnaHQsIHRhYmxlKTtcbiAgICB0ci5yZXBsYWNlKFxuICAgICAgdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAoZnJvbSArIHRhYmxlU3RhcnQpLFxuICAgICAgdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAodG8gKyB0YWJsZVN0YXJ0KSxcbiAgICAgIG5ldyBTbGljZTIoY2VsbHMucm93c1tyb3cgLSB0b3BdLCAwLCAwKVxuICAgICk7XG4gIH1cbiAgcmVjb21wKCk7XG4gIHRyLnNldFNlbGVjdGlvbihcbiAgICBuZXcgQ2VsbFNlbGVjdGlvbihcbiAgICAgIHRyLmRvYy5yZXNvbHZlKHRhYmxlU3RhcnQgKyBtYXAucG9zaXRpb25BdCh0b3AsIGxlZnQsIHRhYmxlKSksXG4gICAgICB0ci5kb2MucmVzb2x2ZSh0YWJsZVN0YXJ0ICsgbWFwLnBvc2l0aW9uQXQoYm90dG9tIC0gMSwgcmlnaHQgLSAxLCB0YWJsZSkpXG4gICAgKVxuICApO1xuICBkaXNwYXRjaCh0cik7XG59XG5cbi8vIHNyYy9pbnB1dC50c1xudmFyIGhhbmRsZUtleURvd24gPSBrZXlkb3duSGFuZGxlcih7XG4gIEFycm93TGVmdDogYXJyb3coXCJob3JpelwiLCAtMSksXG4gIEFycm93UmlnaHQ6IGFycm93KFwiaG9yaXpcIiwgMSksXG4gIEFycm93VXA6IGFycm93KFwidmVydFwiLCAtMSksXG4gIEFycm93RG93bjogYXJyb3coXCJ2ZXJ0XCIsIDEpLFxuICBcIlNoaWZ0LUFycm93TGVmdFwiOiBzaGlmdEFycm93KFwiaG9yaXpcIiwgLTEpLFxuICBcIlNoaWZ0LUFycm93UmlnaHRcIjogc2hpZnRBcnJvdyhcImhvcml6XCIsIDEpLFxuICBcIlNoaWZ0LUFycm93VXBcIjogc2hpZnRBcnJvdyhcInZlcnRcIiwgLTEpLFxuICBcIlNoaWZ0LUFycm93RG93blwiOiBzaGlmdEFycm93KFwidmVydFwiLCAxKSxcbiAgQmFja3NwYWNlOiBkZWxldGVDZWxsU2VsZWN0aW9uLFxuICBcIk1vZC1CYWNrc3BhY2VcIjogZGVsZXRlQ2VsbFNlbGVjdGlvbixcbiAgRGVsZXRlOiBkZWxldGVDZWxsU2VsZWN0aW9uLFxuICBcIk1vZC1EZWxldGVcIjogZGVsZXRlQ2VsbFNlbGVjdGlvblxufSk7XG5mdW5jdGlvbiBtYXliZVNldFNlbGVjdGlvbihzdGF0ZSwgZGlzcGF0Y2gsIHNlbGVjdGlvbikge1xuICBpZiAoc2VsZWN0aW9uLmVxKHN0YXRlLnNlbGVjdGlvbikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpXG4gICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYXJyb3coYXhpcywgZGlyKSB7XG4gIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgaWYgKCF2aWV3KVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgQ2VsbFNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIG1heWJlU2V0U2VsZWN0aW9uKFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIFNlbGVjdGlvbjIubmVhcihzZWwuJGhlYWRDZWxsLCBkaXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXhpcyAhPSBcImhvcml6XCIgJiYgIXNlbC5lbXB0eSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbmQgPSBhdEVuZE9mQ2VsbCh2aWV3LCBheGlzLCBkaXIpO1xuICAgIGlmIChlbmQgPT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXhpcyA9PSBcImhvcml6XCIpIHtcbiAgICAgIHJldHVybiBtYXliZVNldFNlbGVjdGlvbihcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGRpc3BhdGNoLFxuICAgICAgICBTZWxlY3Rpb24yLm5lYXIoc3RhdGUuZG9jLnJlc29sdmUoc2VsLmhlYWQgKyBkaXIpLCBkaXIpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkY2VsbCA9IHN0YXRlLmRvYy5yZXNvbHZlKGVuZCk7XG4gICAgICBjb25zdCAkbmV4dCA9IG5leHRDZWxsKCRjZWxsLCBheGlzLCBkaXIpO1xuICAgICAgbGV0IG5ld1NlbDtcbiAgICAgIGlmICgkbmV4dClcbiAgICAgICAgbmV3U2VsID0gU2VsZWN0aW9uMi5uZWFyKCRuZXh0LCAxKTtcbiAgICAgIGVsc2UgaWYgKGRpciA8IDApXG4gICAgICAgIG5ld1NlbCA9IFNlbGVjdGlvbjIubmVhcihzdGF0ZS5kb2MucmVzb2x2ZSgkY2VsbC5iZWZvcmUoLTEpKSwgLTEpO1xuICAgICAgZWxzZVxuICAgICAgICBuZXdTZWwgPSBTZWxlY3Rpb24yLm5lYXIoc3RhdGUuZG9jLnJlc29sdmUoJGNlbGwuYWZ0ZXIoLTEpKSwgMSk7XG4gICAgICByZXR1cm4gbWF5YmVTZXRTZWxlY3Rpb24oc3RhdGUsIGRpc3BhdGNoLCBuZXdTZWwpO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHNoaWZ0QXJyb3coYXhpcywgZGlyKSB7XG4gIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgaWYgKCF2aWV3KVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgY2VsbFNlbDtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgQ2VsbFNlbGVjdGlvbikge1xuICAgICAgY2VsbFNlbCA9IHNlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZW5kID0gYXRFbmRPZkNlbGwodmlldywgYXhpcywgZGlyKTtcbiAgICAgIGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2VsbFNlbCA9IG5ldyBDZWxsU2VsZWN0aW9uKHN0YXRlLmRvYy5yZXNvbHZlKGVuZCkpO1xuICAgIH1cbiAgICBjb25zdCAkaGVhZCA9IG5leHRDZWxsKGNlbGxTZWwuJGhlYWRDZWxsLCBheGlzLCBkaXIpO1xuICAgIGlmICghJGhlYWQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG1heWJlU2V0U2VsZWN0aW9uKFxuICAgICAgc3RhdGUsXG4gICAgICBkaXNwYXRjaCxcbiAgICAgIG5ldyBDZWxsU2VsZWN0aW9uKGNlbGxTZWwuJGFuY2hvckNlbGwsICRoZWFkKVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBkZWxldGVDZWxsU2VsZWN0aW9uKHN0YXRlLCBkaXNwYXRjaCkge1xuICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gIGlmICghKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgdHIgPSBzdGF0ZS50cjtcbiAgICBjb25zdCBiYXNlQ29udGVudCA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSkuY2VsbC5jcmVhdGVBbmRGaWxsKCkuY29udGVudDtcbiAgICBzZWwuZm9yRWFjaENlbGwoKGNlbGwsIHBvcykgPT4ge1xuICAgICAgaWYgKCFjZWxsLmNvbnRlbnQuZXEoYmFzZUNvbnRlbnQpKVxuICAgICAgICB0ci5yZXBsYWNlKFxuICAgICAgICAgIHRyLm1hcHBpbmcubWFwKHBvcyArIDEpLFxuICAgICAgICAgIHRyLm1hcHBpbmcubWFwKHBvcyArIGNlbGwubm9kZVNpemUgLSAxKSxcbiAgICAgICAgICBuZXcgU2xpY2UzKGJhc2VDb250ZW50LCAwLCAwKVxuICAgICAgICApO1xuICAgIH0pO1xuICAgIGlmICh0ci5kb2NDaGFuZ2VkKVxuICAgICAgZGlzcGF0Y2godHIpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaGFuZGxlVHJpcGxlQ2xpY2sodmlldywgcG9zKSB7XG4gIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jLCAkY2VsbCA9IGNlbGxBcm91bmQoZG9jLnJlc29sdmUocG9zKSk7XG4gIGlmICghJGNlbGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKG5ldyBDZWxsU2VsZWN0aW9uKCRjZWxsKSkpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVBhc3RlKHZpZXcsIF8sIHNsaWNlKSB7XG4gIGlmICghaXNJblRhYmxlKHZpZXcuc3RhdGUpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IGNlbGxzID0gcGFzdGVkQ2VsbHMoc2xpY2UpO1xuICBjb25zdCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgaWYgKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pIHtcbiAgICBpZiAoIWNlbGxzKVxuICAgICAgY2VsbHMgPSB7XG4gICAgICAgIHdpZHRoOiAxLFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICBGcmFnbWVudDMuZnJvbShcbiAgICAgICAgICAgIGZpdFNsaWNlKHRhYmxlTm9kZVR5cGVzKHZpZXcuc3RhdGUuc2NoZW1hKS5jZWxsLCBzbGljZSlcbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgY29uc3QgdGFibGUgPSBzZWwuJGFuY2hvckNlbGwubm9kZSgtMSk7XG4gICAgY29uc3Qgc3RhcnQgPSBzZWwuJGFuY2hvckNlbGwuc3RhcnQoLTEpO1xuICAgIGNvbnN0IHJlY3QgPSBUYWJsZU1hcC5nZXQodGFibGUpLnJlY3RCZXR3ZWVuKFxuICAgICAgc2VsLiRhbmNob3JDZWxsLnBvcyAtIHN0YXJ0LFxuICAgICAgc2VsLiRoZWFkQ2VsbC5wb3MgLSBzdGFydFxuICAgICk7XG4gICAgY2VsbHMgPSBjbGlwQ2VsbHMoY2VsbHMsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3ApO1xuICAgIGluc2VydENlbGxzKHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gsIHN0YXJ0LCByZWN0LCBjZWxscyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoY2VsbHMpIHtcbiAgICBjb25zdCAkY2VsbCA9IHNlbGVjdGlvbkNlbGwodmlldy5zdGF0ZSk7XG4gICAgY29uc3Qgc3RhcnQgPSAkY2VsbC5zdGFydCgtMSk7XG4gICAgaW5zZXJ0Q2VsbHMoXG4gICAgICB2aWV3LnN0YXRlLFxuICAgICAgdmlldy5kaXNwYXRjaCxcbiAgICAgIHN0YXJ0LFxuICAgICAgVGFibGVNYXAuZ2V0KCRjZWxsLm5vZGUoLTEpKS5maW5kQ2VsbCgkY2VsbC5wb3MgLSBzdGFydCksXG4gICAgICBjZWxsc1xuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVNb3VzZURvd24odmlldywgc3RhcnRFdmVudCkge1xuICB2YXIgX2E7XG4gIGlmIChzdGFydEV2ZW50LmN0cmxLZXkgfHwgc3RhcnRFdmVudC5tZXRhS2V5KVxuICAgIHJldHVybjtcbiAgY29uc3Qgc3RhcnRET01DZWxsID0gZG9tSW5DZWxsKHZpZXcsIHN0YXJ0RXZlbnQudGFyZ2V0KTtcbiAgbGV0ICRhbmNob3I7XG4gIGlmIChzdGFydEV2ZW50LnNoaWZ0S2V5ICYmIHZpZXcuc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgQ2VsbFNlbGVjdGlvbikge1xuICAgIHNldENlbGxTZWxlY3Rpb24odmlldy5zdGF0ZS5zZWxlY3Rpb24uJGFuY2hvckNlbGwsIHN0YXJ0RXZlbnQpO1xuICAgIHN0YXJ0RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSBlbHNlIGlmIChzdGFydEV2ZW50LnNoaWZ0S2V5ICYmIHN0YXJ0RE9NQ2VsbCAmJiAoJGFuY2hvciA9IGNlbGxBcm91bmQodmlldy5zdGF0ZS5zZWxlY3Rpb24uJGFuY2hvcikpICE9IG51bGwgJiYgKChfYSA9IGNlbGxVbmRlck1vdXNlKHZpZXcsIHN0YXJ0RXZlbnQpKSA9PSBudWxsID8gdm9pZCAwIDogX2EucG9zKSAhPSAkYW5jaG9yLnBvcykge1xuICAgIHNldENlbGxTZWxlY3Rpb24oJGFuY2hvciwgc3RhcnRFdmVudCk7XG4gICAgc3RhcnRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9IGVsc2UgaWYgKCFzdGFydERPTUNlbGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZnVuY3Rpb24gc2V0Q2VsbFNlbGVjdGlvbigkYW5jaG9yMiwgZXZlbnQpIHtcbiAgICBsZXQgJGhlYWQgPSBjZWxsVW5kZXJNb3VzZSh2aWV3LCBldmVudCk7XG4gICAgY29uc3Qgc3RhcnRpbmcgPSB0YWJsZUVkaXRpbmdLZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSkgPT0gbnVsbDtcbiAgICBpZiAoISRoZWFkIHx8ICFpblNhbWVUYWJsZSgkYW5jaG9yMiwgJGhlYWQpKSB7XG4gICAgICBpZiAoc3RhcnRpbmcpXG4gICAgICAgICRoZWFkID0gJGFuY2hvcjI7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gbmV3IENlbGxTZWxlY3Rpb24oJGFuY2hvcjIsICRoZWFkKTtcbiAgICBpZiAoc3RhcnRpbmcgfHwgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLmVxKHNlbGVjdGlvbikpIHtcbiAgICAgIGNvbnN0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICAgIGlmIChzdGFydGluZylcbiAgICAgICAgdHIuc2V0TWV0YSh0YWJsZUVkaXRpbmdLZXksICRhbmNob3IyLnBvcyk7XG4gICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB2aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgc3RvcCk7XG4gICAgdmlldy5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkcmFnc3RhcnRcIiwgc3RvcCk7XG4gICAgdmlldy5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW92ZSk7XG4gICAgaWYgKHRhYmxlRWRpdGluZ0tleS5nZXRTdGF0ZSh2aWV3LnN0YXRlKSAhPSBudWxsKVxuICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldE1ldGEodGFibGVFZGl0aW5nS2V5LCAtMSkpO1xuICB9XG4gIGZ1bmN0aW9uIG1vdmUoX2V2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSBfZXZlbnQ7XG4gICAgY29uc3QgYW5jaG9yID0gdGFibGVFZGl0aW5nS2V5LmdldFN0YXRlKHZpZXcuc3RhdGUpO1xuICAgIGxldCAkYW5jaG9yMjtcbiAgICBpZiAoYW5jaG9yICE9IG51bGwpIHtcbiAgICAgICRhbmNob3IyID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShhbmNob3IpO1xuICAgIH0gZWxzZSBpZiAoZG9tSW5DZWxsKHZpZXcsIGV2ZW50LnRhcmdldCkgIT0gc3RhcnRET01DZWxsKSB7XG4gICAgICAkYW5jaG9yMiA9IGNlbGxVbmRlck1vdXNlKHZpZXcsIHN0YXJ0RXZlbnQpO1xuICAgICAgaWYgKCEkYW5jaG9yMilcbiAgICAgICAgcmV0dXJuIHN0b3AoKTtcbiAgICB9XG4gICAgaWYgKCRhbmNob3IyKVxuICAgICAgc2V0Q2VsbFNlbGVjdGlvbigkYW5jaG9yMiwgZXZlbnQpO1xuICB9XG4gIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBzdG9wKTtcbiAgdmlldy5yb290LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnc3RhcnRcIiwgc3RvcCk7XG4gIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xufVxuZnVuY3Rpb24gYXRFbmRPZkNlbGwodmlldywgYXhpcywgZGlyKSB7XG4gIGlmICghKHZpZXcuc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbjIpKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCB7ICRoZWFkIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgZm9yIChsZXQgZCA9ICRoZWFkLmRlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICBjb25zdCBwYXJlbnQgPSAkaGVhZC5ub2RlKGQpLCBpbmRleCA9IGRpciA8IDAgPyAkaGVhZC5pbmRleChkKSA6ICRoZWFkLmluZGV4QWZ0ZXIoZCk7XG4gICAgaWYgKGluZGV4ICE9IChkaXIgPCAwID8gMCA6IHBhcmVudC5jaGlsZENvdW50KSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChwYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcImNlbGxcIiB8fCBwYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcImhlYWRlcl9jZWxsXCIpIHtcbiAgICAgIGNvbnN0IGNlbGxQb3MgPSAkaGVhZC5iZWZvcmUoZCk7XG4gICAgICBjb25zdCBkaXJTdHIgPSBheGlzID09IFwidmVydFwiID8gZGlyID4gMCA/IFwiZG93blwiIDogXCJ1cFwiIDogZGlyID4gMCA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuICAgICAgcmV0dXJuIHZpZXcuZW5kT2ZUZXh0YmxvY2soZGlyU3RyKSA/IGNlbGxQb3MgOiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRvbUluQ2VsbCh2aWV3LCBkb20pIHtcbiAgZm9yICg7IGRvbSAmJiBkb20gIT0gdmlldy5kb207IGRvbSA9IGRvbS5wYXJlbnROb2RlKSB7XG4gICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIlREXCIgfHwgZG9tLm5vZGVOYW1lID09IFwiVEhcIikge1xuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjZWxsVW5kZXJNb3VzZSh2aWV3LCBldmVudCkge1xuICBjb25zdCBtb3VzZVBvcyA9IHZpZXcucG9zQXRDb29yZHMoe1xuICAgIGxlZnQ6IGV2ZW50LmNsaWVudFgsXG4gICAgdG9wOiBldmVudC5jbGllbnRZXG4gIH0pO1xuICBpZiAoIW1vdXNlUG9zKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gbW91c2VQb3MgPyBjZWxsQXJvdW5kKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUobW91c2VQb3MucG9zKSkgOiBudWxsO1xufVxuXG4vLyBzcmMvY29sdW1ucmVzaXppbmcudHNcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IGFzIFBsdWdpbktleTMgfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmltcG9ydCB7XG4gIERlY29yYXRpb24gYXMgRGVjb3JhdGlvbjIsXG4gIERlY29yYXRpb25TZXQgYXMgRGVjb3JhdGlvblNldDJcbn0gZnJvbSBcInByb3NlbWlycm9yLXZpZXdcIjtcblxuLy8gc3JjL3RhYmxldmlldy50c1xudmFyIFRhYmxlVmlldyA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Iobm9kZSwgY2VsbE1pbldpZHRoKSB7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB0aGlzLmNlbGxNaW5XaWR0aCA9IGNlbGxNaW5XaWR0aDtcbiAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJ0YWJsZVdyYXBwZXJcIjtcbiAgICB0aGlzLnRhYmxlID0gdGhpcy5kb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIpKTtcbiAgICB0aGlzLmNvbGdyb3VwID0gdGhpcy50YWJsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29sZ3JvdXBcIikpO1xuICAgIHVwZGF0ZUNvbHVtbnNPblJlc2l6ZShub2RlLCB0aGlzLmNvbGdyb3VwLCB0aGlzLnRhYmxlLCBjZWxsTWluV2lkdGgpO1xuICAgIHRoaXMuY29udGVudERPTSA9IHRoaXMudGFibGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRib2R5XCIpKTtcbiAgfVxuICB1cGRhdGUobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT0gdGhpcy5ub2RlLnR5cGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB1cGRhdGVDb2x1bW5zT25SZXNpemUobm9kZSwgdGhpcy5jb2xncm91cCwgdGhpcy50YWJsZSwgdGhpcy5jZWxsTWluV2lkdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlnbm9yZU11dGF0aW9uKHJlY29yZCkge1xuICAgIHJldHVybiByZWNvcmQudHlwZSA9PSBcImF0dHJpYnV0ZXNcIiAmJiAocmVjb3JkLnRhcmdldCA9PSB0aGlzLnRhYmxlIHx8IHRoaXMuY29sZ3JvdXAuY29udGFpbnMocmVjb3JkLnRhcmdldCkpO1xuICB9XG59O1xuZnVuY3Rpb24gdXBkYXRlQ29sdW1uc09uUmVzaXplKG5vZGUsIGNvbGdyb3VwLCB0YWJsZSwgY2VsbE1pbldpZHRoLCBvdmVycmlkZUNvbCwgb3ZlcnJpZGVWYWx1ZSkge1xuICB2YXIgX2E7XG4gIGxldCB0b3RhbFdpZHRoID0gMDtcbiAgbGV0IGZpeGVkV2lkdGggPSB0cnVlO1xuICBsZXQgbmV4dERPTSA9IGNvbGdyb3VwLmZpcnN0Q2hpbGQ7XG4gIGNvbnN0IHJvdyA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgaWYgKCFyb3cpXG4gICAgcmV0dXJuO1xuICBmb3IgKGxldCBpID0gMCwgY29sID0gMDsgaSA8IHJvdy5jaGlsZENvdW50OyBpKyspIHtcbiAgICBjb25zdCB7IGNvbHNwYW4sIGNvbHdpZHRoIH0gPSByb3cuY2hpbGQoaSkuYXR0cnM7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzcGFuOyBqKyssIGNvbCsrKSB7XG4gICAgICBjb25zdCBoYXNXaWR0aCA9IG92ZXJyaWRlQ29sID09IGNvbCA/IG92ZXJyaWRlVmFsdWUgOiBjb2x3aWR0aCAmJiBjb2x3aWR0aFtqXTtcbiAgICAgIGNvbnN0IGNzc1dpZHRoID0gaGFzV2lkdGggPyBoYXNXaWR0aCArIFwicHhcIiA6IFwiXCI7XG4gICAgICB0b3RhbFdpZHRoICs9IGhhc1dpZHRoIHx8IGNlbGxNaW5XaWR0aDtcbiAgICAgIGlmICghaGFzV2lkdGgpXG4gICAgICAgIGZpeGVkV2lkdGggPSBmYWxzZTtcbiAgICAgIGlmICghbmV4dERPTSkge1xuICAgICAgICBjb2xncm91cC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29sXCIpKS5zdHlsZS53aWR0aCA9IGNzc1dpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5leHRET00uc3R5bGUud2lkdGggIT0gY3NzV2lkdGgpXG4gICAgICAgICAgbmV4dERPTS5zdHlsZS53aWR0aCA9IGNzc1dpZHRoO1xuICAgICAgICBuZXh0RE9NID0gbmV4dERPTS5uZXh0U2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgd2hpbGUgKG5leHRET00pIHtcbiAgICBjb25zdCBhZnRlciA9IG5leHRET00ubmV4dFNpYmxpbmc7XG4gICAgKF9hID0gbmV4dERPTS5wYXJlbnROb2RlKSA9PSBudWxsID8gdm9pZCAwIDogX2EucmVtb3ZlQ2hpbGQobmV4dERPTSk7XG4gICAgbmV4dERPTSA9IGFmdGVyO1xuICB9XG4gIGlmIChmaXhlZFdpZHRoKSB7XG4gICAgdGFibGUuc3R5bGUud2lkdGggPSB0b3RhbFdpZHRoICsgXCJweFwiO1xuICAgIHRhYmxlLnN0eWxlLm1pbldpZHRoID0gXCJcIjtcbiAgfSBlbHNlIHtcbiAgICB0YWJsZS5zdHlsZS53aWR0aCA9IFwiXCI7XG4gICAgdGFibGUuc3R5bGUubWluV2lkdGggPSB0b3RhbFdpZHRoICsgXCJweFwiO1xuICB9XG59XG5cbi8vIHNyYy9jb2x1bW5yZXNpemluZy50c1xudmFyIGNvbHVtblJlc2l6aW5nUGx1Z2luS2V5ID0gbmV3IFBsdWdpbktleTMoXG4gIFwidGFibGVDb2x1bW5SZXNpemluZ1wiXG4pO1xuZnVuY3Rpb24gY29sdW1uUmVzaXppbmcoe1xuICBoYW5kbGVXaWR0aCA9IDUsXG4gIGNlbGxNaW5XaWR0aCA9IDI1LFxuICBWaWV3ID0gVGFibGVWaWV3LFxuICBsYXN0Q29sdW1uUmVzaXphYmxlID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW4oe1xuICAgIGtleTogY29sdW1uUmVzaXppbmdQbHVnaW5LZXksXG4gICAgc3RhdGU6IHtcbiAgICAgIGluaXQoXywgc3RhdGUpIHtcbiAgICAgICAgcGx1Z2luLnNwZWMucHJvcHMubm9kZVZpZXdzW3RhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSkudGFibGUubmFtZV0gPSAobm9kZSwgdmlldykgPT4gbmV3IFZpZXcobm9kZSwgY2VsbE1pbldpZHRoLCB2aWV3KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNpemVTdGF0ZSgtMSwgZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGFwcGx5KHRyLCBwcmV2KSB7XG4gICAgICAgIHJldHVybiBwcmV2LmFwcGx5KHRyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHByb3BzOiB7XG4gICAgICBhdHRyaWJ1dGVzOiAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luU3RhdGUgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIHJldHVybiBwbHVnaW5TdGF0ZSAmJiBwbHVnaW5TdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSA/IHsgY2xhc3M6IFwicmVzaXplLWN1cnNvclwiIH0gOiB7fTtcbiAgICAgIH0sXG4gICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgbW91c2Vtb3ZlOiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgICBoYW5kbGVNb3VzZU1vdmUoXG4gICAgICAgICAgICB2aWV3LFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBoYW5kbGVXaWR0aCxcbiAgICAgICAgICAgIGNlbGxNaW5XaWR0aCxcbiAgICAgICAgICAgIGxhc3RDb2x1bW5SZXNpemFibGVcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBtb3VzZWxlYXZlOiAodmlldykgPT4ge1xuICAgICAgICAgIGhhbmRsZU1vdXNlTGVhdmUodmlldyk7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdXNlZG93bjogKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgaGFuZGxlTW91c2VEb3duMih2aWV3LCBldmVudCwgY2VsbE1pbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlY29yYXRpb25zOiAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luU3RhdGUgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIGlmIChwbHVnaW5TdGF0ZSAmJiBwbHVnaW5TdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSkge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVEZWNvcmF0aW9ucyhzdGF0ZSwgcGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG5vZGVWaWV3czoge31cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGx1Z2luO1xufVxudmFyIFJlc2l6ZVN0YXRlID0gY2xhc3MgX1Jlc2l6ZVN0YXRlIHtcbiAgY29uc3RydWN0b3IoYWN0aXZlSGFuZGxlLCBkcmFnZ2luZykge1xuICAgIHRoaXMuYWN0aXZlSGFuZGxlID0gYWN0aXZlSGFuZGxlO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBkcmFnZ2luZztcbiAgfVxuICBhcHBseSh0cikge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcztcbiAgICBjb25zdCBhY3Rpb24gPSB0ci5nZXRNZXRhKGNvbHVtblJlc2l6aW5nUGx1Z2luS2V5KTtcbiAgICBpZiAoYWN0aW9uICYmIGFjdGlvbi5zZXRIYW5kbGUgIT0gbnVsbClcbiAgICAgIHJldHVybiBuZXcgX1Jlc2l6ZVN0YXRlKGFjdGlvbi5zZXRIYW5kbGUsIGZhbHNlKTtcbiAgICBpZiAoYWN0aW9uICYmIGFjdGlvbi5zZXREcmFnZ2luZyAhPT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIG5ldyBfUmVzaXplU3RhdGUoc3RhdGUuYWN0aXZlSGFuZGxlLCBhY3Rpb24uc2V0RHJhZ2dpbmcpO1xuICAgIGlmIChzdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSAmJiB0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICBsZXQgaGFuZGxlID0gdHIubWFwcGluZy5tYXAoc3RhdGUuYWN0aXZlSGFuZGxlLCAtMSk7XG4gICAgICBpZiAoIXBvaW50c0F0Q2VsbCh0ci5kb2MucmVzb2x2ZShoYW5kbGUpKSkge1xuICAgICAgICBoYW5kbGUgPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgX1Jlc2l6ZVN0YXRlKGhhbmRsZSwgc3RhdGUuZHJhZ2dpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn07XG5mdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUodmlldywgZXZlbnQsIGhhbmRsZVdpZHRoLCBjZWxsTWluV2lkdGgsIGxhc3RDb2x1bW5SZXNpemFibGUpIHtcbiAgY29uc3QgcGx1Z2luU3RhdGUgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgaWYgKCFwbHVnaW5TdGF0ZSlcbiAgICByZXR1cm47XG4gIGlmICghcGx1Z2luU3RhdGUuZHJhZ2dpbmcpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBkb21DZWxsQXJvdW5kKGV2ZW50LnRhcmdldCk7XG4gICAgbGV0IGNlbGwgPSAtMTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0IH0gPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoZXZlbnQuY2xpZW50WCAtIGxlZnQgPD0gaGFuZGxlV2lkdGgpXG4gICAgICAgIGNlbGwgPSBlZGdlQ2VsbCh2aWV3LCBldmVudCwgXCJsZWZ0XCIsIGhhbmRsZVdpZHRoKTtcbiAgICAgIGVsc2UgaWYgKHJpZ2h0IC0gZXZlbnQuY2xpZW50WCA8PSBoYW5kbGVXaWR0aClcbiAgICAgICAgY2VsbCA9IGVkZ2VDZWxsKHZpZXcsIGV2ZW50LCBcInJpZ2h0XCIsIGhhbmRsZVdpZHRoKTtcbiAgICB9XG4gICAgaWYgKGNlbGwgIT0gcGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlKSB7XG4gICAgICBpZiAoIWxhc3RDb2x1bW5SZXNpemFibGUgJiYgY2VsbCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgJGNlbGwgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGNlbGwpO1xuICAgICAgICBjb25zdCB0YWJsZSA9ICRjZWxsLm5vZGUoLTEpO1xuICAgICAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZVN0YXJ0ID0gJGNlbGwuc3RhcnQoLTEpO1xuICAgICAgICBjb25zdCBjb2wgPSBtYXAuY29sQ291bnQoJGNlbGwucG9zIC0gdGFibGVTdGFydCkgKyAkY2VsbC5ub2RlQWZ0ZXIuYXR0cnMuY29sc3BhbiAtIDE7XG4gICAgICAgIGlmIChjb2wgPT0gbWFwLndpZHRoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdXBkYXRlSGFuZGxlKHZpZXcsIGNlbGwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlTW91c2VMZWF2ZSh2aWV3KSB7XG4gIGNvbnN0IHBsdWdpblN0YXRlID0gY29sdW1uUmVzaXppbmdQbHVnaW5LZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSk7XG4gIGlmIChwbHVnaW5TdGF0ZSAmJiBwbHVnaW5TdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSAmJiAhcGx1Z2luU3RhdGUuZHJhZ2dpbmcpXG4gICAgdXBkYXRlSGFuZGxlKHZpZXcsIC0xKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bjIodmlldywgZXZlbnQsIGNlbGxNaW5XaWR0aCkge1xuICBjb25zdCBwbHVnaW5TdGF0ZSA9IGNvbHVtblJlc2l6aW5nUGx1Z2luS2V5LmdldFN0YXRlKHZpZXcuc3RhdGUpO1xuICBpZiAoIXBsdWdpblN0YXRlIHx8IHBsdWdpblN0YXRlLmFjdGl2ZUhhbmRsZSA9PSAtMSB8fCBwbHVnaW5TdGF0ZS5kcmFnZ2luZylcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGNlbGwgPSB2aWV3LnN0YXRlLmRvYy5ub2RlQXQocGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlKTtcbiAgY29uc3Qgd2lkdGggPSBjdXJyZW50Q29sV2lkdGgodmlldywgcGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlLCBjZWxsLmF0dHJzKTtcbiAgdmlldy5kaXNwYXRjaChcbiAgICB2aWV3LnN0YXRlLnRyLnNldE1ldGEoY29sdW1uUmVzaXppbmdQbHVnaW5LZXksIHtcbiAgICAgIHNldERyYWdnaW5nOiB7IHN0YXJ0WDogZXZlbnQuY2xpZW50WCwgc3RhcnRXaWR0aDogd2lkdGggfVxuICAgIH0pXG4gICk7XG4gIGZ1bmN0aW9uIGZpbmlzaChldmVudDIpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZmluaXNoKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3ZlKTtcbiAgICBjb25zdCBwbHVnaW5TdGF0ZTIgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgICBpZiAocGx1Z2luU3RhdGUyID09IG51bGwgPyB2b2lkIDAgOiBwbHVnaW5TdGF0ZTIuZHJhZ2dpbmcpIHtcbiAgICAgIHVwZGF0ZUNvbHVtbldpZHRoKFxuICAgICAgICB2aWV3LFxuICAgICAgICBwbHVnaW5TdGF0ZTIuYWN0aXZlSGFuZGxlLFxuICAgICAgICBkcmFnZ2VkV2lkdGgocGx1Z2luU3RhdGUyLmRyYWdnaW5nLCBldmVudDIsIGNlbGxNaW5XaWR0aClcbiAgICAgICk7XG4gICAgICB2aWV3LmRpc3BhdGNoKFxuICAgICAgICB2aWV3LnN0YXRlLnRyLnNldE1ldGEoY29sdW1uUmVzaXppbmdQbHVnaW5LZXksIHsgc2V0RHJhZ2dpbmc6IG51bGwgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG1vdmUoZXZlbnQyKSB7XG4gICAgaWYgKCFldmVudDIud2hpY2gpXG4gICAgICByZXR1cm4gZmluaXNoKGV2ZW50Mik7XG4gICAgY29uc3QgcGx1Z2luU3RhdGUyID0gY29sdW1uUmVzaXppbmdQbHVnaW5LZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSk7XG4gICAgaWYgKCFwbHVnaW5TdGF0ZTIpXG4gICAgICByZXR1cm47XG4gICAgaWYgKHBsdWdpblN0YXRlMi5kcmFnZ2luZykge1xuICAgICAgY29uc3QgZHJhZ2dlZCA9IGRyYWdnZWRXaWR0aChwbHVnaW5TdGF0ZTIuZHJhZ2dpbmcsIGV2ZW50MiwgY2VsbE1pbldpZHRoKTtcbiAgICAgIGRpc3BsYXlDb2x1bW5XaWR0aCh2aWV3LCBwbHVnaW5TdGF0ZTIuYWN0aXZlSGFuZGxlLCBkcmFnZ2VkLCBjZWxsTWluV2lkdGgpO1xuICAgIH1cbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZmluaXNoKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW92ZSk7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY3VycmVudENvbFdpZHRoKHZpZXcsIGNlbGxQb3MsIHsgY29sc3BhbiwgY29sd2lkdGggfSkge1xuICBjb25zdCB3aWR0aCA9IGNvbHdpZHRoICYmIGNvbHdpZHRoW2NvbHdpZHRoLmxlbmd0aCAtIDFdO1xuICBpZiAod2lkdGgpXG4gICAgcmV0dXJuIHdpZHRoO1xuICBjb25zdCBkb20gPSB2aWV3LmRvbUF0UG9zKGNlbGxQb3MpO1xuICBjb25zdCBub2RlID0gZG9tLm5vZGUuY2hpbGROb2Rlc1tkb20ub2Zmc2V0XTtcbiAgbGV0IGRvbVdpZHRoID0gbm9kZS5vZmZzZXRXaWR0aCwgcGFydHMgPSBjb2xzcGFuO1xuICBpZiAoY29sd2lkdGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHNwYW47IGkrKylcbiAgICAgIGlmIChjb2x3aWR0aFtpXSkge1xuICAgICAgICBkb21XaWR0aCAtPSBjb2x3aWR0aFtpXTtcbiAgICAgICAgcGFydHMtLTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZG9tV2lkdGggLyBwYXJ0cztcbn1cbmZ1bmN0aW9uIGRvbUNlbGxBcm91bmQodGFyZ2V0KSB7XG4gIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVOYW1lICE9IFwiVERcIiAmJiB0YXJnZXQubm9kZU5hbWUgIT0gXCJUSFwiKVxuICAgIHRhcmdldCA9IHRhcmdldC5jbGFzc0xpc3QgJiYgdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcIlByb3NlTWlycm9yXCIpID8gbnVsbCA6IHRhcmdldC5wYXJlbnROb2RlO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZWRnZUNlbGwodmlldywgZXZlbnQsIHNpZGUsIGhhbmRsZVdpZHRoKSB7XG4gIGNvbnN0IG9mZnNldCA9IHNpZGUgPT0gXCJyaWdodFwiID8gLWhhbmRsZVdpZHRoIDogaGFuZGxlV2lkdGg7XG4gIGNvbnN0IGZvdW5kID0gdmlldy5wb3NBdENvb3Jkcyh7XG4gICAgbGVmdDogZXZlbnQuY2xpZW50WCArIG9mZnNldCxcbiAgICB0b3A6IGV2ZW50LmNsaWVudFlcbiAgfSk7XG4gIGlmICghZm91bmQpXG4gICAgcmV0dXJuIC0xO1xuICBjb25zdCB7IHBvcyB9ID0gZm91bmQ7XG4gIGNvbnN0ICRjZWxsID0gY2VsbEFyb3VuZCh2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKHBvcykpO1xuICBpZiAoISRjZWxsKVxuICAgIHJldHVybiAtMTtcbiAgaWYgKHNpZGUgPT0gXCJyaWdodFwiKVxuICAgIHJldHVybiAkY2VsbC5wb3M7XG4gIGNvbnN0IG1hcCA9IFRhYmxlTWFwLmdldCgkY2VsbC5ub2RlKC0xKSksIHN0YXJ0ID0gJGNlbGwuc3RhcnQoLTEpO1xuICBjb25zdCBpbmRleCA9IG1hcC5tYXAuaW5kZXhPZigkY2VsbC5wb3MgLSBzdGFydCk7XG4gIHJldHVybiBpbmRleCAlIG1hcC53aWR0aCA9PSAwID8gLTEgOiBzdGFydCArIG1hcC5tYXBbaW5kZXggLSAxXTtcbn1cbmZ1bmN0aW9uIGRyYWdnZWRXaWR0aChkcmFnZ2luZywgZXZlbnQsIGNlbGxNaW5XaWR0aCkge1xuICBjb25zdCBvZmZzZXQgPSBldmVudC5jbGllbnRYIC0gZHJhZ2dpbmcuc3RhcnRYO1xuICByZXR1cm4gTWF0aC5tYXgoY2VsbE1pbldpZHRoLCBkcmFnZ2luZy5zdGFydFdpZHRoICsgb2Zmc2V0KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhhbmRsZSh2aWV3LCB2YWx1ZSkge1xuICB2aWV3LmRpc3BhdGNoKFxuICAgIHZpZXcuc3RhdGUudHIuc2V0TWV0YShjb2x1bW5SZXNpemluZ1BsdWdpbktleSwgeyBzZXRIYW5kbGU6IHZhbHVlIH0pXG4gICk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb2x1bW5XaWR0aCh2aWV3LCBjZWxsLCB3aWR0aCkge1xuICBjb25zdCAkY2VsbCA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoY2VsbCk7XG4gIGNvbnN0IHRhYmxlID0gJGNlbGwubm9kZSgtMSksIG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSksIHN0YXJ0ID0gJGNlbGwuc3RhcnQoLTEpO1xuICBjb25zdCBjb2wgPSBtYXAuY29sQ291bnQoJGNlbGwucG9zIC0gc3RhcnQpICsgJGNlbGwubm9kZUFmdGVyLmF0dHJzLmNvbHNwYW4gLSAxO1xuICBjb25zdCB0ciA9IHZpZXcuc3RhdGUudHI7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG1hcC5oZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgbWFwSW5kZXggPSByb3cgKiBtYXAud2lkdGggKyBjb2w7XG4gICAgaWYgKHJvdyAmJiBtYXAubWFwW21hcEluZGV4XSA9PSBtYXAubWFwW21hcEluZGV4IC0gbWFwLndpZHRoXSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBvcyA9IG1hcC5tYXBbbWFwSW5kZXhdO1xuICAgIGNvbnN0IGF0dHJzID0gdGFibGUubm9kZUF0KHBvcykuYXR0cnM7XG4gICAgY29uc3QgaW5kZXggPSBhdHRycy5jb2xzcGFuID09IDEgPyAwIDogY29sIC0gbWFwLmNvbENvdW50KHBvcyk7XG4gICAgaWYgKGF0dHJzLmNvbHdpZHRoICYmIGF0dHJzLmNvbHdpZHRoW2luZGV4XSA9PSB3aWR0aClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbHdpZHRoID0gYXR0cnMuY29sd2lkdGggPyBhdHRycy5jb2x3aWR0aC5zbGljZSgpIDogemVyb2VzKGF0dHJzLmNvbHNwYW4pO1xuICAgIGNvbHdpZHRoW2luZGV4XSA9IHdpZHRoO1xuICAgIHRyLnNldE5vZGVNYXJrdXAoc3RhcnQgKyBwb3MsIG51bGwsIHsgLi4uYXR0cnMsIGNvbHdpZHRoIH0pO1xuICB9XG4gIGlmICh0ci5kb2NDaGFuZ2VkKVxuICAgIHZpZXcuZGlzcGF0Y2godHIpO1xufVxuZnVuY3Rpb24gZGlzcGxheUNvbHVtbldpZHRoKHZpZXcsIGNlbGwsIHdpZHRoLCBjZWxsTWluV2lkdGgpIHtcbiAgY29uc3QgJGNlbGwgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGNlbGwpO1xuICBjb25zdCB0YWJsZSA9ICRjZWxsLm5vZGUoLTEpLCBzdGFydCA9ICRjZWxsLnN0YXJ0KC0xKTtcbiAgY29uc3QgY29sID0gVGFibGVNYXAuZ2V0KHRhYmxlKS5jb2xDb3VudCgkY2VsbC5wb3MgLSBzdGFydCkgKyAkY2VsbC5ub2RlQWZ0ZXIuYXR0cnMuY29sc3BhbiAtIDE7XG4gIGxldCBkb20gPSB2aWV3LmRvbUF0UG9zKCRjZWxsLnN0YXJ0KC0xKSkubm9kZTtcbiAgd2hpbGUgKGRvbSAmJiBkb20ubm9kZU5hbWUgIT0gXCJUQUJMRVwiKSB7XG4gICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gIH1cbiAgaWYgKCFkb20pXG4gICAgcmV0dXJuO1xuICB1cGRhdGVDb2x1bW5zT25SZXNpemUoXG4gICAgdGFibGUsXG4gICAgZG9tLmZpcnN0Q2hpbGQsXG4gICAgZG9tLFxuICAgIGNlbGxNaW5XaWR0aCxcbiAgICBjb2wsXG4gICAgd2lkdGhcbiAgKTtcbn1cbmZ1bmN0aW9uIHplcm9lcyhuKSB7XG4gIHJldHVybiBBcnJheShuKS5maWxsKDApO1xufVxuZnVuY3Rpb24gaGFuZGxlRGVjb3JhdGlvbnMoc3RhdGUsIGNlbGwpIHtcbiAgY29uc3QgZGVjb3JhdGlvbnMgPSBbXTtcbiAgY29uc3QgJGNlbGwgPSBzdGF0ZS5kb2MucmVzb2x2ZShjZWxsKTtcbiAgY29uc3QgdGFibGUgPSAkY2VsbC5ub2RlKC0xKTtcbiAgaWYgKCF0YWJsZSkge1xuICAgIHJldHVybiBEZWNvcmF0aW9uU2V0Mi5lbXB0eTtcbiAgfVxuICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICBjb25zdCBzdGFydCA9ICRjZWxsLnN0YXJ0KC0xKTtcbiAgY29uc3QgY29sID0gbWFwLmNvbENvdW50KCRjZWxsLnBvcyAtIHN0YXJ0KSArICRjZWxsLm5vZGVBZnRlci5hdHRycy5jb2xzcGFuO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBtYXAuaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IGluZGV4ID0gY29sICsgcm93ICogbWFwLndpZHRoIC0gMTtcbiAgICBpZiAoKGNvbCA9PSBtYXAud2lkdGggfHwgbWFwLm1hcFtpbmRleF0gIT0gbWFwLm1hcFtpbmRleCArIDFdKSAmJiAocm93ID09IDAgfHwgbWFwLm1hcFtpbmRleF0gIT0gbWFwLm1hcFtpbmRleCAtIG1hcC53aWR0aF0pKSB7XG4gICAgICBjb25zdCBjZWxsUG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgICBjb25zdCBwb3MgPSBzdGFydCArIGNlbGxQb3MgKyB0YWJsZS5ub2RlQXQoY2VsbFBvcykubm9kZVNpemUgLSAxO1xuICAgICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRvbS5jbGFzc05hbWUgPSBcImNvbHVtbi1yZXNpemUtaGFuZGxlXCI7XG4gICAgICBkZWNvcmF0aW9ucy5wdXNoKERlY29yYXRpb24yLndpZGdldChwb3MsIGRvbSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvblNldDIuY3JlYXRlKHN0YXRlLmRvYywgZGVjb3JhdGlvbnMpO1xufVxuXG4vLyBzcmMvY29tbWFuZHMudHNcbmltcG9ydCB7IEZyYWdtZW50IGFzIEZyYWdtZW50NCB9IGZyb20gXCJwcm9zZW1pcnJvci1tb2RlbFwiO1xuaW1wb3J0IHtcbiAgVGV4dFNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uM1xufSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmZ1bmN0aW9uIHNlbGVjdGVkUmVjdChzdGF0ZSkge1xuICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gIGNvbnN0ICRwb3MgPSBzZWxlY3Rpb25DZWxsKHN0YXRlKTtcbiAgY29uc3QgdGFibGUgPSAkcG9zLm5vZGUoLTEpO1xuICBjb25zdCB0YWJsZVN0YXJ0ID0gJHBvcy5zdGFydCgtMSk7XG4gIGNvbnN0IG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gIGNvbnN0IHJlY3QgPSBzZWwgaW5zdGFuY2VvZiBDZWxsU2VsZWN0aW9uID8gbWFwLnJlY3RCZXR3ZWVuKFxuICAgIHNlbC4kYW5jaG9yQ2VsbC5wb3MgLSB0YWJsZVN0YXJ0LFxuICAgIHNlbC4kaGVhZENlbGwucG9zIC0gdGFibGVTdGFydFxuICApIDogbWFwLmZpbmRDZWxsKCRwb3MucG9zIC0gdGFibGVTdGFydCk7XG4gIHJldHVybiB7IC4uLnJlY3QsIHRhYmxlU3RhcnQsIG1hcCwgdGFibGUgfTtcbn1cbmZ1bmN0aW9uIGFkZENvbHVtbih0ciwgeyBtYXAsIHRhYmxlU3RhcnQsIHRhYmxlIH0sIGNvbCkge1xuICBsZXQgcmVmQ29sdW1uID0gY29sID4gMCA/IC0xIDogMDtcbiAgaWYgKGNvbHVtbklzSGVhZGVyKG1hcCwgdGFibGUsIGNvbCArIHJlZkNvbHVtbikpIHtcbiAgICByZWZDb2x1bW4gPSBjb2wgPT0gMCB8fCBjb2wgPT0gbWFwLndpZHRoID8gbnVsbCA6IDA7XG4gIH1cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgbWFwLmhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBpbmRleCA9IHJvdyAqIG1hcC53aWR0aCArIGNvbDtcbiAgICBpZiAoY29sID4gMCAmJiBjb2wgPCBtYXAud2lkdGggJiYgbWFwLm1hcFtpbmRleCAtIDFdID09IG1hcC5tYXBbaW5kZXhdKSB7XG4gICAgICBjb25zdCBwb3MgPSBtYXAubWFwW2luZGV4XTtcbiAgICAgIGNvbnN0IGNlbGwgPSB0YWJsZS5ub2RlQXQocG9zKTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgIHRyLm1hcHBpbmcubWFwKHRhYmxlU3RhcnQgKyBwb3MpLFxuICAgICAgICBudWxsLFxuICAgICAgICBhZGRDb2xTcGFuKGNlbGwuYXR0cnMsIGNvbCAtIG1hcC5jb2xDb3VudChwb3MpKVxuICAgICAgKTtcbiAgICAgIHJvdyArPSBjZWxsLmF0dHJzLnJvd3NwYW4gLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID0gcmVmQ29sdW1uID09IG51bGwgPyB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkuY2VsbCA6IHRhYmxlLm5vZGVBdChtYXAubWFwW2luZGV4ICsgcmVmQ29sdW1uXSkudHlwZTtcbiAgICAgIGNvbnN0IHBvcyA9IG1hcC5wb3NpdGlvbkF0KHJvdywgY29sLCB0YWJsZSk7XG4gICAgICB0ci5pbnNlcnQodHIubWFwcGluZy5tYXAodGFibGVTdGFydCArIHBvcyksIHR5cGUuY3JlYXRlQW5kRmlsbCgpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uQmVmb3JlKHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKTtcbiAgICBkaXNwYXRjaChhZGRDb2x1bW4oc3RhdGUudHIsIHJlY3QsIHJlY3QubGVmdCkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uQWZ0ZXIoc3RhdGUsIGRpc3BhdGNoKSB7XG4gIGlmICghaXNJblRhYmxlKHN0YXRlKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHJlY3QgPSBzZWxlY3RlZFJlY3Qoc3RhdGUpO1xuICAgIGRpc3BhdGNoKGFkZENvbHVtbihzdGF0ZS50ciwgcmVjdCwgcmVjdC5yaWdodCkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ29sdW1uKHRyLCB7IG1hcCwgdGFibGUsIHRhYmxlU3RhcnQgfSwgY29sKSB7XG4gIGNvbnN0IG1hcFN0YXJ0ID0gdHIubWFwcGluZy5tYXBzLmxlbmd0aDtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgbWFwLmhlaWdodDsgKSB7XG4gICAgY29uc3QgaW5kZXggPSByb3cgKiBtYXAud2lkdGggKyBjb2w7XG4gICAgY29uc3QgcG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgIGNvbnN0IGF0dHJzID0gY2VsbC5hdHRycztcbiAgICBpZiAoY29sID4gMCAmJiBtYXAubWFwW2luZGV4IC0gMV0gPT0gcG9zIHx8IGNvbCA8IG1hcC53aWR0aCAtIDEgJiYgbWFwLm1hcFtpbmRleCArIDFdID09IHBvcykge1xuICAgICAgdHIuc2V0Tm9kZU1hcmt1cChcbiAgICAgICAgdHIubWFwcGluZy5zbGljZShtYXBTdGFydCkubWFwKHRhYmxlU3RhcnQgKyBwb3MpLFxuICAgICAgICBudWxsLFxuICAgICAgICByZW1vdmVDb2xTcGFuKGF0dHJzLCBjb2wgLSBtYXAuY29sQ291bnQocG9zKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdHIubWFwcGluZy5zbGljZShtYXBTdGFydCkubWFwKHRhYmxlU3RhcnQgKyBwb3MpO1xuICAgICAgdHIuZGVsZXRlKHN0YXJ0LCBzdGFydCArIGNlbGwubm9kZVNpemUpO1xuICAgIH1cbiAgICByb3cgKz0gYXR0cnMucm93c3BhbjtcbiAgfVxufVxuZnVuY3Rpb24gZGVsZXRlQ29sdW1uKHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKTtcbiAgICBjb25zdCB0ciA9IHN0YXRlLnRyO1xuICAgIGlmIChyZWN0LmxlZnQgPT0gMCAmJiByZWN0LnJpZ2h0ID09IHJlY3QubWFwLndpZHRoKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSByZWN0LnJpZ2h0IC0gMTsgOyBpLS0pIHtcbiAgICAgIHJlbW92ZUNvbHVtbih0ciwgcmVjdCwgaSk7XG4gICAgICBpZiAoaSA9PSByZWN0LmxlZnQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY29uc3QgdGFibGUgPSByZWN0LnRhYmxlU3RhcnQgPyB0ci5kb2Mubm9kZUF0KHJlY3QudGFibGVTdGFydCAtIDEpIDogdHIuZG9jO1xuICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiTm8gdGFibGUgZm91bmRcIik7XG4gICAgICB9XG4gICAgICByZWN0LnRhYmxlID0gdGFibGU7XG4gICAgICByZWN0Lm1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gICAgfVxuICAgIGRpc3BhdGNoKHRyKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJvd0lzSGVhZGVyKG1hcCwgdGFibGUsIHJvdykge1xuICB2YXIgX2E7XG4gIGNvbnN0IGhlYWRlckNlbGwgPSB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkuaGVhZGVyX2NlbGw7XG4gIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IG1hcC53aWR0aDsgY29sKyspXG4gICAgaWYgKCgoX2EgPSB0YWJsZS5ub2RlQXQobWFwLm1hcFtjb2wgKyByb3cgKiBtYXAud2lkdGhdKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnR5cGUpICE9IGhlYWRlckNlbGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYWRkUm93KHRyLCB7IG1hcCwgdGFibGVTdGFydCwgdGFibGUgfSwgcm93KSB7XG4gIHZhciBfYTtcbiAgbGV0IHJvd1BvcyA9IHRhYmxlU3RhcnQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93OyBpKyspXG4gICAgcm93UG9zICs9IHRhYmxlLmNoaWxkKGkpLm5vZGVTaXplO1xuICBjb25zdCBjZWxscyA9IFtdO1xuICBsZXQgcmVmUm93ID0gcm93ID4gMCA/IC0xIDogMDtcbiAgaWYgKHJvd0lzSGVhZGVyKG1hcCwgdGFibGUsIHJvdyArIHJlZlJvdykpXG4gICAgcmVmUm93ID0gcm93ID09IDAgfHwgcm93ID09IG1hcC5oZWlnaHQgPyBudWxsIDogMDtcbiAgZm9yIChsZXQgY29sID0gMCwgaW5kZXggPSBtYXAud2lkdGggKiByb3c7IGNvbCA8IG1hcC53aWR0aDsgY29sKyssIGluZGV4KyspIHtcbiAgICBpZiAocm93ID4gMCAmJiByb3cgPCBtYXAuaGVpZ2h0ICYmIG1hcC5tYXBbaW5kZXhdID09IG1hcC5tYXBbaW5kZXggLSBtYXAud2lkdGhdKSB7XG4gICAgICBjb25zdCBwb3MgPSBtYXAubWFwW2luZGV4XTtcbiAgICAgIGNvbnN0IGF0dHJzID0gdGFibGUubm9kZUF0KHBvcykuYXR0cnM7XG4gICAgICB0ci5zZXROb2RlTWFya3VwKHRhYmxlU3RhcnQgKyBwb3MsIG51bGwsIHtcbiAgICAgICAgLi4uYXR0cnMsXG4gICAgICAgIHJvd3NwYW46IGF0dHJzLnJvd3NwYW4gKyAxXG4gICAgICB9KTtcbiAgICAgIGNvbCArPSBhdHRycy5jb2xzcGFuIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IHJlZlJvdyA9PSBudWxsID8gdGFibGVOb2RlVHlwZXModGFibGUudHlwZS5zY2hlbWEpLmNlbGwgOiAoX2EgPSB0YWJsZS5ub2RlQXQobWFwLm1hcFtpbmRleCArIHJlZlJvdyAqIG1hcC53aWR0aF0pKSA9PSBudWxsID8gdm9pZCAwIDogX2EudHlwZTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0eXBlID09IG51bGwgPyB2b2lkIDAgOiB0eXBlLmNyZWF0ZUFuZEZpbGwoKTtcbiAgICAgIGlmIChub2RlKVxuICAgICAgICBjZWxscy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICB0ci5pbnNlcnQocm93UG9zLCB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkucm93LmNyZWF0ZShudWxsLCBjZWxscykpO1xuICByZXR1cm4gdHI7XG59XG5mdW5jdGlvbiBhZGRSb3dCZWZvcmUoc3RhdGUsIGRpc3BhdGNoKSB7XG4gIGlmICghaXNJblRhYmxlKHN0YXRlKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHJlY3QgPSBzZWxlY3RlZFJlY3Qoc3RhdGUpO1xuICAgIGRpc3BhdGNoKGFkZFJvdyhzdGF0ZS50ciwgcmVjdCwgcmVjdC50b3ApKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFkZFJvd0FmdGVyKHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKTtcbiAgICBkaXNwYXRjaChhZGRSb3coc3RhdGUudHIsIHJlY3QsIHJlY3QuYm90dG9tKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZW1vdmVSb3codHIsIHsgbWFwLCB0YWJsZSwgdGFibGVTdGFydCB9LCByb3cpIHtcbiAgbGV0IHJvd1BvcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93OyBpKyspXG4gICAgcm93UG9zICs9IHRhYmxlLmNoaWxkKGkpLm5vZGVTaXplO1xuICBjb25zdCBuZXh0Um93ID0gcm93UG9zICsgdGFibGUuY2hpbGQocm93KS5ub2RlU2l6ZTtcbiAgY29uc3QgbWFwRnJvbSA9IHRyLm1hcHBpbmcubWFwcy5sZW5ndGg7XG4gIHRyLmRlbGV0ZShyb3dQb3MgKyB0YWJsZVN0YXJ0LCBuZXh0Um93ICsgdGFibGVTdGFydCk7XG4gIGNvbnN0IHNlZW4gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBmb3IgKGxldCBjb2wgPSAwLCBpbmRleCA9IHJvdyAqIG1hcC53aWR0aDsgY29sIDwgbWFwLndpZHRoOyBjb2wrKywgaW5kZXgrKykge1xuICAgIGNvbnN0IHBvcyA9IG1hcC5tYXBbaW5kZXhdO1xuICAgIGlmIChzZWVuLmhhcyhwb3MpKVxuICAgICAgY29udGludWU7XG4gICAgc2Vlbi5hZGQocG9zKTtcbiAgICBpZiAocm93ID4gMCAmJiBwb3MgPT0gbWFwLm1hcFtpbmRleCAtIG1hcC53aWR0aF0pIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gdGFibGUubm9kZUF0KHBvcykuYXR0cnM7XG4gICAgICB0ci5zZXROb2RlTWFya3VwKHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyArIHRhYmxlU3RhcnQpLCBudWxsLCB7XG4gICAgICAgIC4uLmF0dHJzLFxuICAgICAgICByb3dzcGFuOiBhdHRycy5yb3dzcGFuIC0gMVxuICAgICAgfSk7XG4gICAgICBjb2wgKz0gYXR0cnMuY29sc3BhbiAtIDE7XG4gICAgfSBlbHNlIGlmIChyb3cgPCBtYXAuaGVpZ2h0ICYmIHBvcyA9PSBtYXAubWFwW2luZGV4ICsgbWFwLndpZHRoXSkge1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgICAgY29uc3QgYXR0cnMgPSBjZWxsLmF0dHJzO1xuICAgICAgY29uc3QgY29weSA9IGNlbGwudHlwZS5jcmVhdGUoXG4gICAgICAgIHsgLi4uYXR0cnMsIHJvd3NwYW46IGNlbGwuYXR0cnMucm93c3BhbiAtIDEgfSxcbiAgICAgICAgY2VsbC5jb250ZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV3UG9zID0gbWFwLnBvc2l0aW9uQXQocm93ICsgMSwgY29sLCB0YWJsZSk7XG4gICAgICB0ci5pbnNlcnQodHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAodGFibGVTdGFydCArIG5ld1BvcyksIGNvcHkpO1xuICAgICAgY29sICs9IGF0dHJzLmNvbHNwYW4gLSAxO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGVsZXRlUm93KHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKSwgdHIgPSBzdGF0ZS50cjtcbiAgICBpZiAocmVjdC50b3AgPT0gMCAmJiByZWN0LmJvdHRvbSA9PSByZWN0Lm1hcC5oZWlnaHQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IHJlY3QuYm90dG9tIC0gMTsgOyBpLS0pIHtcbiAgICAgIHJlbW92ZVJvdyh0ciwgcmVjdCwgaSk7XG4gICAgICBpZiAoaSA9PSByZWN0LnRvcClcbiAgICAgICAgYnJlYWs7XG4gICAgICBjb25zdCB0YWJsZSA9IHJlY3QudGFibGVTdGFydCA/IHRyLmRvYy5ub2RlQXQocmVjdC50YWJsZVN0YXJ0IC0gMSkgOiB0ci5kb2M7XG4gICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJObyB0YWJsZSBmb3VuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJlY3QudGFibGUgPSB0YWJsZTtcbiAgICAgIHJlY3QubWFwID0gVGFibGVNYXAuZ2V0KHJlY3QudGFibGUpO1xuICAgIH1cbiAgICBkaXNwYXRjaCh0cik7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBpc0VtcHR5KGNlbGwpIHtcbiAgY29uc3QgYyA9IGNlbGwuY29udGVudDtcbiAgcmV0dXJuIGMuY2hpbGRDb3VudCA9PSAxICYmIGMuY2hpbGQoMCkuaXNUZXh0YmxvY2sgJiYgYy5jaGlsZCgwKS5jaGlsZENvdW50ID09IDA7XG59XG5mdW5jdGlvbiBjZWxsc092ZXJsYXBSZWN0YW5nbGUoeyB3aWR0aCwgaGVpZ2h0LCBtYXAgfSwgcmVjdCkge1xuICBsZXQgaW5kZXhUb3AgPSByZWN0LnRvcCAqIHdpZHRoICsgcmVjdC5sZWZ0LCBpbmRleExlZnQgPSBpbmRleFRvcDtcbiAgbGV0IGluZGV4Qm90dG9tID0gKHJlY3QuYm90dG9tIC0gMSkgKiB3aWR0aCArIHJlY3QubGVmdCwgaW5kZXhSaWdodCA9IGluZGV4VG9wICsgKHJlY3QucmlnaHQgLSByZWN0LmxlZnQgLSAxKTtcbiAgZm9yIChsZXQgaSA9IHJlY3QudG9wOyBpIDwgcmVjdC5ib3R0b207IGkrKykge1xuICAgIGlmIChyZWN0LmxlZnQgPiAwICYmIG1hcFtpbmRleExlZnRdID09IG1hcFtpbmRleExlZnQgLSAxXSB8fCByZWN0LnJpZ2h0IDwgd2lkdGggJiYgbWFwW2luZGV4UmlnaHRdID09IG1hcFtpbmRleFJpZ2h0ICsgMV0pXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpbmRleExlZnQgKz0gd2lkdGg7XG4gICAgaW5kZXhSaWdodCArPSB3aWR0aDtcbiAgfVxuICBmb3IgKGxldCBpID0gcmVjdC5sZWZ0OyBpIDwgcmVjdC5yaWdodDsgaSsrKSB7XG4gICAgaWYgKHJlY3QudG9wID4gMCAmJiBtYXBbaW5kZXhUb3BdID09IG1hcFtpbmRleFRvcCAtIHdpZHRoXSB8fCByZWN0LmJvdHRvbSA8IGhlaWdodCAmJiBtYXBbaW5kZXhCb3R0b21dID09IG1hcFtpbmRleEJvdHRvbSArIHdpZHRoXSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGluZGV4VG9wKys7XG4gICAgaW5kZXhCb3R0b20rKztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBtZXJnZUNlbGxzKHN0YXRlLCBkaXNwYXRjaCkge1xuICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gIGlmICghKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pIHx8IHNlbC4kYW5jaG9yQ2VsbC5wb3MgPT0gc2VsLiRoZWFkQ2VsbC5wb3MpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKSwgeyBtYXAgfSA9IHJlY3Q7XG4gIGlmIChjZWxsc092ZXJsYXBSZWN0YW5nbGUobWFwLCByZWN0KSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHRyID0gc3RhdGUudHI7XG4gICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQ0LmVtcHR5O1xuICAgIGxldCBtZXJnZWRQb3M7XG4gICAgbGV0IG1lcmdlZENlbGw7XG4gICAgZm9yIChsZXQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gcmVjdC5sZWZ0OyBjb2wgPCByZWN0LnJpZ2h0OyBjb2wrKykge1xuICAgICAgICBjb25zdCBjZWxsUG9zID0gbWFwLm1hcFtyb3cgKiBtYXAud2lkdGggKyBjb2xdO1xuICAgICAgICBjb25zdCBjZWxsID0gcmVjdC50YWJsZS5ub2RlQXQoY2VsbFBvcyk7XG4gICAgICAgIGlmIChzZWVuW2NlbGxQb3NdIHx8ICFjZWxsKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBzZWVuW2NlbGxQb3NdID0gdHJ1ZTtcbiAgICAgICAgaWYgKG1lcmdlZFBvcyA9PSBudWxsKSB7XG4gICAgICAgICAgbWVyZ2VkUG9zID0gY2VsbFBvcztcbiAgICAgICAgICBtZXJnZWRDZWxsID0gY2VsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWlzRW1wdHkoY2VsbCkpXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5hcHBlbmQoY2VsbC5jb250ZW50KTtcbiAgICAgICAgICBjb25zdCBtYXBwZWQgPSB0ci5tYXBwaW5nLm1hcChjZWxsUG9zICsgcmVjdC50YWJsZVN0YXJ0KTtcbiAgICAgICAgICB0ci5kZWxldGUobWFwcGVkLCBtYXBwZWQgKyBjZWxsLm5vZGVTaXplKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWVyZ2VkUG9zID09IG51bGwgfHwgbWVyZ2VkQ2VsbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdHIuc2V0Tm9kZU1hcmt1cChtZXJnZWRQb3MgKyByZWN0LnRhYmxlU3RhcnQsIG51bGwsIHtcbiAgICAgIC4uLmFkZENvbFNwYW4oXG4gICAgICAgIG1lcmdlZENlbGwuYXR0cnMsXG4gICAgICAgIG1lcmdlZENlbGwuYXR0cnMuY29sc3BhbixcbiAgICAgICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCAtIG1lcmdlZENlbGwuYXR0cnMuY29sc3BhblxuICAgICAgKSxcbiAgICAgIHJvd3NwYW46IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICB9KTtcbiAgICBpZiAoY29udGVudC5zaXplKSB7XG4gICAgICBjb25zdCBlbmQgPSBtZXJnZWRQb3MgKyAxICsgbWVyZ2VkQ2VsbC5jb250ZW50LnNpemU7XG4gICAgICBjb25zdCBzdGFydCA9IGlzRW1wdHkobWVyZ2VkQ2VsbCkgPyBtZXJnZWRQb3MgKyAxIDogZW5kO1xuICAgICAgdHIucmVwbGFjZVdpdGgoc3RhcnQgKyByZWN0LnRhYmxlU3RhcnQsIGVuZCArIHJlY3QudGFibGVTdGFydCwgY29udGVudCk7XG4gICAgfVxuICAgIHRyLnNldFNlbGVjdGlvbihcbiAgICAgIG5ldyBDZWxsU2VsZWN0aW9uKHRyLmRvYy5yZXNvbHZlKG1lcmdlZFBvcyArIHJlY3QudGFibGVTdGFydCkpXG4gICAgKTtcbiAgICBkaXNwYXRjaCh0cik7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBzcGxpdENlbGwoc3RhdGUsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IG5vZGVUeXBlcyA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSk7XG4gIHJldHVybiBzcGxpdENlbGxXaXRoVHlwZSgoeyBub2RlIH0pID0+IHtcbiAgICByZXR1cm4gbm9kZVR5cGVzW25vZGUudHlwZS5zcGVjLnRhYmxlUm9sZV07XG4gIH0pKHN0YXRlLCBkaXNwYXRjaCk7XG59XG5mdW5jdGlvbiBzcGxpdENlbGxXaXRoVHlwZShnZXRDZWxsVHlwZSkge1xuICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IGNlbGxOb2RlO1xuICAgIGxldCBjZWxsUG9zO1xuICAgIGlmICghKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pKSB7XG4gICAgICBjZWxsTm9kZSA9IGNlbGxXcmFwcGluZyhzZWwuJGZyb20pO1xuICAgICAgaWYgKCFjZWxsTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2VsbFBvcyA9IChfYSA9IGNlbGxBcm91bmQoc2VsLiRmcm9tKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNlbC4kYW5jaG9yQ2VsbC5wb3MgIT0gc2VsLiRoZWFkQ2VsbC5wb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNlbGxOb2RlID0gc2VsLiRhbmNob3JDZWxsLm5vZGVBZnRlcjtcbiAgICAgIGNlbGxQb3MgPSBzZWwuJGFuY2hvckNlbGwucG9zO1xuICAgIH1cbiAgICBpZiAoY2VsbE5vZGUgPT0gbnVsbCB8fCBjZWxsUG9zID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNlbGxOb2RlLmF0dHJzLmNvbHNwYW4gPT0gMSAmJiBjZWxsTm9kZS5hdHRycy5yb3dzcGFuID09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBsZXQgYmFzZUF0dHJzID0gY2VsbE5vZGUuYXR0cnM7XG4gICAgICBjb25zdCBhdHRycyA9IFtdO1xuICAgICAgY29uc3QgY29sd2lkdGggPSBiYXNlQXR0cnMuY29sd2lkdGg7XG4gICAgICBpZiAoYmFzZUF0dHJzLnJvd3NwYW4gPiAxKVxuICAgICAgICBiYXNlQXR0cnMgPSB7IC4uLmJhc2VBdHRycywgcm93c3BhbjogMSB9O1xuICAgICAgaWYgKGJhc2VBdHRycy5jb2xzcGFuID4gMSlcbiAgICAgICAgYmFzZUF0dHJzID0geyAuLi5iYXNlQXR0cnMsIGNvbHNwYW46IDEgfTtcbiAgICAgIGNvbnN0IHJlY3QgPSBzZWxlY3RlZFJlY3Qoc3RhdGUpLCB0ciA9IHN0YXRlLnRyO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OyBpKyspXG4gICAgICAgIGF0dHJzLnB1c2goXG4gICAgICAgICAgY29sd2lkdGggPyB7XG4gICAgICAgICAgICAuLi5iYXNlQXR0cnMsXG4gICAgICAgICAgICBjb2x3aWR0aDogY29sd2lkdGggJiYgY29sd2lkdGhbaV0gPyBbY29sd2lkdGhbaV1dIDogbnVsbFxuICAgICAgICAgIH0gOiBiYXNlQXR0cnNcbiAgICAgICAgKTtcbiAgICAgIGxldCBsYXN0Q2VsbDtcbiAgICAgIGZvciAobGV0IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHtcbiAgICAgICAgbGV0IHBvcyA9IHJlY3QubWFwLnBvc2l0aW9uQXQocm93LCByZWN0LmxlZnQsIHJlY3QudGFibGUpO1xuICAgICAgICBpZiAocm93ID09IHJlY3QudG9wKVxuICAgICAgICAgIHBvcyArPSBjZWxsTm9kZS5ub2RlU2l6ZTtcbiAgICAgICAgZm9yIChsZXQgY29sID0gcmVjdC5sZWZ0LCBpID0gMDsgY29sIDwgcmVjdC5yaWdodDsgY29sKyssIGkrKykge1xuICAgICAgICAgIGlmIChjb2wgPT0gcmVjdC5sZWZ0ICYmIHJvdyA9PSByZWN0LnRvcClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIHRyLmluc2VydChcbiAgICAgICAgICAgIGxhc3RDZWxsID0gdHIubWFwcGluZy5tYXAocG9zICsgcmVjdC50YWJsZVN0YXJ0LCAxKSxcbiAgICAgICAgICAgIGdldENlbGxUeXBlKHsgbm9kZTogY2VsbE5vZGUsIHJvdywgY29sIH0pLmNyZWF0ZUFuZEZpbGwoYXR0cnNbaV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHIuc2V0Tm9kZU1hcmt1cChcbiAgICAgICAgY2VsbFBvcyxcbiAgICAgICAgZ2V0Q2VsbFR5cGUoeyBub2RlOiBjZWxsTm9kZSwgcm93OiByZWN0LnRvcCwgY29sOiByZWN0LmxlZnQgfSksXG4gICAgICAgIGF0dHJzWzBdXG4gICAgICApO1xuICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pXG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihcbiAgICAgICAgICBuZXcgQ2VsbFNlbGVjdGlvbihcbiAgICAgICAgICAgIHRyLmRvYy5yZXNvbHZlKHNlbC4kYW5jaG9yQ2VsbC5wb3MpLFxuICAgICAgICAgICAgbGFzdENlbGwgPyB0ci5kb2MucmVzb2x2ZShsYXN0Q2VsbCkgOiB2b2lkIDBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuZnVuY3Rpb24gc2V0Q2VsbEF0dHIobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgIGlmICghaXNJblRhYmxlKHN0YXRlKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCAkY2VsbCA9IHNlbGVjdGlvbkNlbGwoc3RhdGUpO1xuICAgIGlmICgkY2VsbC5ub2RlQWZ0ZXIuYXR0cnNbbmFtZV0gPT09IHZhbHVlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgY29uc3QgdHIgPSBzdGF0ZS50cjtcbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBDZWxsU2VsZWN0aW9uKVxuICAgICAgICBzdGF0ZS5zZWxlY3Rpb24uZm9yRWFjaENlbGwoKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgIGlmIChub2RlLmF0dHJzW25hbWVdICE9PSB2YWx1ZSlcbiAgICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAocG9zLCBudWxsLCB7XG4gICAgICAgICAgICAgIC4uLm5vZGUuYXR0cnMsXG4gICAgICAgICAgICAgIFtuYW1lXTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIGVsc2VcbiAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cCgkY2VsbC5wb3MsIG51bGwsIHtcbiAgICAgICAgICAuLi4kY2VsbC5ub2RlQWZ0ZXIuYXR0cnMsXG4gICAgICAgICAgW25hbWVdOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5mdW5jdGlvbiBkZXByZWNhdGVkX3RvZ2dsZUhlYWRlcih0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBjb25zdCB0eXBlcyA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSk7XG4gICAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKSwgdHIgPSBzdGF0ZS50cjtcbiAgICAgIGNvbnN0IGNlbGxzID0gcmVjdC5tYXAuY2VsbHNJblJlY3QoXG4gICAgICAgIHR5cGUgPT0gXCJjb2x1bW5cIiA/IHtcbiAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxuICAgICAgICAgIGJvdHRvbTogcmVjdC5tYXAuaGVpZ2h0XG4gICAgICAgIH0gOiB0eXBlID09IFwicm93XCIgPyB7XG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgICAgIHJpZ2h0OiByZWN0Lm1hcC53aWR0aCxcbiAgICAgICAgICBib3R0b206IHJlY3QuYm90dG9tXG4gICAgICAgIH0gOiByZWN0XG4gICAgICApO1xuICAgICAgY29uc3Qgbm9kZXMgPSBjZWxscy5tYXAoKHBvcykgPT4gcmVjdC50YWJsZS5ub2RlQXQocG9zKSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAobm9kZXNbaV0udHlwZSA9PSB0eXBlcy5oZWFkZXJfY2VsbClcbiAgICAgICAgICB0ci5zZXROb2RlTWFya3VwKFxuICAgICAgICAgICAgcmVjdC50YWJsZVN0YXJ0ICsgY2VsbHNbaV0sXG4gICAgICAgICAgICB0eXBlcy5jZWxsLFxuICAgICAgICAgICAgbm9kZXNbaV0uYXR0cnNcbiAgICAgICAgICApO1xuICAgICAgaWYgKHRyLnN0ZXBzLmxlbmd0aCA9PSAwKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgICAgICByZWN0LnRhYmxlU3RhcnQgKyBjZWxsc1tpXSxcbiAgICAgICAgICAgIHR5cGVzLmhlYWRlcl9jZWxsLFxuICAgICAgICAgICAgbm9kZXNbaV0uYXR0cnNcbiAgICAgICAgICApO1xuICAgICAgZGlzcGF0Y2godHIpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGlzSGVhZGVyRW5hYmxlZEJ5VHlwZSh0eXBlLCByZWN0LCB0eXBlcykge1xuICBjb25zdCBjZWxsUG9zaXRpb25zID0gcmVjdC5tYXAuY2VsbHNJblJlY3Qoe1xuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiB0eXBlID09IFwicm93XCIgPyByZWN0Lm1hcC53aWR0aCA6IDEsXG4gICAgYm90dG9tOiB0eXBlID09IFwiY29sdW1uXCIgPyByZWN0Lm1hcC5oZWlnaHQgOiAxXG4gIH0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjZWxsID0gcmVjdC50YWJsZS5ub2RlQXQoY2VsbFBvc2l0aW9uc1tpXSk7XG4gICAgaWYgKGNlbGwgJiYgY2VsbC50eXBlICE9PSB0eXBlcy5oZWFkZXJfY2VsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZUhlYWRlcih0eXBlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHsgdXNlRGVwcmVjYXRlZExvZ2ljOiBmYWxzZSB9O1xuICBpZiAob3B0aW9ucy51c2VEZXByZWNhdGVkTG9naWMpXG4gICAgcmV0dXJuIGRlcHJlY2F0ZWRfdG9nZ2xlSGVhZGVyKHR5cGUpO1xuICByZXR1cm4gZnVuY3Rpb24oc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgaWYgKCFpc0luVGFibGUoc3RhdGUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgY29uc3QgdHlwZXMgPSB0YWJsZU5vZGVUeXBlcyhzdGF0ZS5zY2hlbWEpO1xuICAgICAgY29uc3QgcmVjdCA9IHNlbGVjdGVkUmVjdChzdGF0ZSksIHRyID0gc3RhdGUudHI7XG4gICAgICBjb25zdCBpc0hlYWRlclJvd0VuYWJsZWQgPSBpc0hlYWRlckVuYWJsZWRCeVR5cGUoXCJyb3dcIiwgcmVjdCwgdHlwZXMpO1xuICAgICAgY29uc3QgaXNIZWFkZXJDb2x1bW5FbmFibGVkID0gaXNIZWFkZXJFbmFibGVkQnlUeXBlKFxuICAgICAgICBcImNvbHVtblwiLFxuICAgICAgICByZWN0LFxuICAgICAgICB0eXBlc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzSGVhZGVyRW5hYmxlZCA9IHR5cGUgPT09IFwiY29sdW1uXCIgPyBpc0hlYWRlclJvd0VuYWJsZWQgOiB0eXBlID09PSBcInJvd1wiID8gaXNIZWFkZXJDb2x1bW5FbmFibGVkIDogZmFsc2U7XG4gICAgICBjb25zdCBzZWxlY3Rpb25TdGFydHNBdCA9IGlzSGVhZGVyRW5hYmxlZCA/IDEgOiAwO1xuICAgICAgY29uc3QgY2VsbHNSZWN0ID0gdHlwZSA9PSBcImNvbHVtblwiID8ge1xuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IHNlbGVjdGlvblN0YXJ0c0F0LFxuICAgICAgICByaWdodDogMSxcbiAgICAgICAgYm90dG9tOiByZWN0Lm1hcC5oZWlnaHRcbiAgICAgIH0gOiB0eXBlID09IFwicm93XCIgPyB7XG4gICAgICAgIGxlZnQ6IHNlbGVjdGlvblN0YXJ0c0F0LFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIHJpZ2h0OiByZWN0Lm1hcC53aWR0aCxcbiAgICAgICAgYm90dG9tOiAxXG4gICAgICB9IDogcmVjdDtcbiAgICAgIGNvbnN0IG5ld1R5cGUgPSB0eXBlID09IFwiY29sdW1uXCIgPyBpc0hlYWRlckNvbHVtbkVuYWJsZWQgPyB0eXBlcy5jZWxsIDogdHlwZXMuaGVhZGVyX2NlbGwgOiB0eXBlID09IFwicm93XCIgPyBpc0hlYWRlclJvd0VuYWJsZWQgPyB0eXBlcy5jZWxsIDogdHlwZXMuaGVhZGVyX2NlbGwgOiB0eXBlcy5jZWxsO1xuICAgICAgcmVjdC5tYXAuY2VsbHNJblJlY3QoY2VsbHNSZWN0KS5mb3JFYWNoKChyZWxhdGl2ZUNlbGxQb3MpID0+IHtcbiAgICAgICAgY29uc3QgY2VsbFBvcyA9IHJlbGF0aXZlQ2VsbFBvcyArIHJlY3QudGFibGVTdGFydDtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRyLmRvYy5ub2RlQXQoY2VsbFBvcyk7XG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cChjZWxsUG9zLCBuZXdUeXBlLCBjZWxsLmF0dHJzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxudmFyIHRvZ2dsZUhlYWRlclJvdyA9IHRvZ2dsZUhlYWRlcihcInJvd1wiLCB7XG4gIHVzZURlcHJlY2F0ZWRMb2dpYzogdHJ1ZVxufSk7XG52YXIgdG9nZ2xlSGVhZGVyQ29sdW1uID0gdG9nZ2xlSGVhZGVyKFwiY29sdW1uXCIsIHtcbiAgdXNlRGVwcmVjYXRlZExvZ2ljOiB0cnVlXG59KTtcbnZhciB0b2dnbGVIZWFkZXJDZWxsID0gdG9nZ2xlSGVhZGVyKFwiY2VsbFwiLCB7XG4gIHVzZURlcHJlY2F0ZWRMb2dpYzogdHJ1ZVxufSk7XG5mdW5jdGlvbiBmaW5kTmV4dENlbGwoJGNlbGwsIGRpcikge1xuICBpZiAoZGlyIDwgMCkge1xuICAgIGNvbnN0IGJlZm9yZSA9ICRjZWxsLm5vZGVCZWZvcmU7XG4gICAgaWYgKGJlZm9yZSlcbiAgICAgIHJldHVybiAkY2VsbC5wb3MgLSBiZWZvcmUubm9kZVNpemU7XG4gICAgZm9yIChsZXQgcm93ID0gJGNlbGwuaW5kZXgoLTEpIC0gMSwgcm93RW5kID0gJGNlbGwuYmVmb3JlKCk7IHJvdyA+PSAwOyByb3ctLSkge1xuICAgICAgY29uc3Qgcm93Tm9kZSA9ICRjZWxsLm5vZGUoLTEpLmNoaWxkKHJvdyk7XG4gICAgICBjb25zdCBsYXN0Q2hpbGQgPSByb3dOb2RlLmxhc3RDaGlsZDtcbiAgICAgIGlmIChsYXN0Q2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIHJvd0VuZCAtIDEgLSBsYXN0Q2hpbGQubm9kZVNpemU7XG4gICAgICB9XG4gICAgICByb3dFbmQgLT0gcm93Tm9kZS5ub2RlU2l6ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCRjZWxsLmluZGV4KCkgPCAkY2VsbC5wYXJlbnQuY2hpbGRDb3VudCAtIDEpIHtcbiAgICAgIHJldHVybiAkY2VsbC5wb3MgKyAkY2VsbC5ub2RlQWZ0ZXIubm9kZVNpemU7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gJGNlbGwubm9kZSgtMSk7XG4gICAgZm9yIChsZXQgcm93ID0gJGNlbGwuaW5kZXhBZnRlcigtMSksIHJvd1N0YXJ0ID0gJGNlbGwuYWZ0ZXIoKTsgcm93IDwgdGFibGUuY2hpbGRDb3VudDsgcm93KyspIHtcbiAgICAgIGNvbnN0IHJvd05vZGUgPSB0YWJsZS5jaGlsZChyb3cpO1xuICAgICAgaWYgKHJvd05vZGUuY2hpbGRDb3VudClcbiAgICAgICAgcmV0dXJuIHJvd1N0YXJ0ICsgMTtcbiAgICAgIHJvd1N0YXJ0ICs9IHJvd05vZGUubm9kZVNpemU7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ29Ub05leHRDZWxsKGRpcmVjdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgaWYgKCFpc0luVGFibGUoc3RhdGUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNlbGwgPSBmaW5kTmV4dENlbGwoc2VsZWN0aW9uQ2VsbChzdGF0ZSksIGRpcmVjdGlvbik7XG4gICAgaWYgKGNlbGwgPT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgIGNvbnN0ICRjZWxsID0gc3RhdGUuZG9jLnJlc29sdmUoY2VsbCk7XG4gICAgICBkaXNwYXRjaChcbiAgICAgICAgc3RhdGUudHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24zLmJldHdlZW4oJGNlbGwsIG1vdmVDZWxsRm9yd2FyZCgkY2VsbCkpKS5zY3JvbGxJbnRvVmlldygpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZVRhYmxlKHN0YXRlLCBkaXNwYXRjaCkge1xuICBjb25zdCAkcG9zID0gc3RhdGUuc2VsZWN0aW9uLiRhbmNob3I7XG4gIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOyBkID4gMDsgZC0tKSB7XG4gICAgY29uc3Qgbm9kZSA9ICRwb3Mubm9kZShkKTtcbiAgICBpZiAobm9kZS50eXBlLnNwZWMudGFibGVSb2xlID09IFwidGFibGVcIikge1xuICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICBzdGF0ZS50ci5kZWxldGUoJHBvcy5iZWZvcmUoZCksICRwb3MuYWZ0ZXIoZCkpLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHNyYy9pbmRleC50c1xuZnVuY3Rpb24gdGFibGVFZGl0aW5nKHtcbiAgYWxsb3dUYWJsZU5vZGVTZWxlY3Rpb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIHJldHVybiBuZXcgUGx1Z2luMih7XG4gICAga2V5OiB0YWJsZUVkaXRpbmdLZXksXG4gICAgLy8gVGhpcyBwaWVjZSBvZiBzdGF0ZSBpcyB1c2VkIHRvIHJlbWVtYmVyIHdoZW4gYSBtb3VzZS1kcmFnXG4gICAgLy8gY2VsbC1zZWxlY3Rpb24gaXMgaGFwcGVuaW5nLCBzbyB0aGF0IGl0IGNhbiBjb250aW51ZSBldmVuIGFzXG4gICAgLy8gdHJhbnNhY3Rpb25zICh3aGljaCBtaWdodCBtb3ZlIGl0cyBhbmNob3IgY2VsbCkgY29tZSBpbi5cbiAgICBzdGF0ZToge1xuICAgICAgaW5pdCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICAgYXBwbHkodHIsIGN1cikge1xuICAgICAgICBjb25zdCBzZXQgPSB0ci5nZXRNZXRhKHRhYmxlRWRpdGluZ0tleSk7XG4gICAgICAgIGlmIChzZXQgIT0gbnVsbClcbiAgICAgICAgICByZXR1cm4gc2V0ID09IC0xID8gbnVsbCA6IHNldDtcbiAgICAgICAgaWYgKGN1ciA9PSBudWxsIHx8ICF0ci5kb2NDaGFuZ2VkKVxuICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgIGNvbnN0IHsgZGVsZXRlZCwgcG9zIH0gPSB0ci5tYXBwaW5nLm1hcFJlc3VsdChjdXIpO1xuICAgICAgICByZXR1cm4gZGVsZXRlZCA/IG51bGwgOiBwb3M7XG4gICAgICB9XG4gICAgfSxcbiAgICBwcm9wczoge1xuICAgICAgZGVjb3JhdGlvbnM6IGRyYXdDZWxsU2VsZWN0aW9uLFxuICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgIG1vdXNlZG93bjogaGFuZGxlTW91c2VEb3duXG4gICAgICB9LFxuICAgICAgY3JlYXRlU2VsZWN0aW9uQmV0d2Vlbih2aWV3KSB7XG4gICAgICAgIHJldHVybiB0YWJsZUVkaXRpbmdLZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSkgIT0gbnVsbCA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uIDogbnVsbDtcbiAgICAgIH0sXG4gICAgICBoYW5kbGVUcmlwbGVDbGljayxcbiAgICAgIGhhbmRsZUtleURvd24sXG4gICAgICBoYW5kbGVQYXN0ZVxuICAgIH0sXG4gICAgYXBwZW5kVHJhbnNhY3Rpb24oXywgb2xkU3RhdGUsIHN0YXRlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplU2VsZWN0aW9uKFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZml4VGFibGVzKHN0YXRlLCBvbGRTdGF0ZSksXG4gICAgICAgIGFsbG93VGFibGVOb2RlU2VsZWN0aW9uXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG5leHBvcnQge1xuICBDZWxsQm9va21hcmssXG4gIENlbGxTZWxlY3Rpb24sXG4gIFJlc2l6ZVN0YXRlLFxuICBUYWJsZU1hcCxcbiAgVGFibGVWaWV3LFxuICBjbGlwQ2VsbHMgYXMgX19jbGlwQ2VsbHMsXG4gIGluc2VydENlbGxzIGFzIF9faW5zZXJ0Q2VsbHMsXG4gIHBhc3RlZENlbGxzIGFzIF9fcGFzdGVkQ2VsbHMsXG4gIGFkZENvbFNwYW4sXG4gIGFkZENvbHVtbixcbiAgYWRkQ29sdW1uQWZ0ZXIsXG4gIGFkZENvbHVtbkJlZm9yZSxcbiAgYWRkUm93LFxuICBhZGRSb3dBZnRlcixcbiAgYWRkUm93QmVmb3JlLFxuICBjZWxsQXJvdW5kLFxuICBjb2xDb3VudCxcbiAgY29sdW1uSXNIZWFkZXIsXG4gIGNvbHVtblJlc2l6aW5nLFxuICBjb2x1bW5SZXNpemluZ1BsdWdpbktleSxcbiAgZGVsZXRlQ29sdW1uLFxuICBkZWxldGVSb3csXG4gIGRlbGV0ZVRhYmxlLFxuICBmaW5kQ2VsbCxcbiAgZml4VGFibGVzLFxuICBmaXhUYWJsZXNLZXksXG4gIGdvVG9OZXh0Q2VsbCxcbiAgaGFuZGxlUGFzdGUsXG4gIGluU2FtZVRhYmxlLFxuICBpc0luVGFibGUsXG4gIG1lcmdlQ2VsbHMsXG4gIG1vdmVDZWxsRm9yd2FyZCxcbiAgbmV4dENlbGwsXG4gIHBvaW50c0F0Q2VsbCxcbiAgcmVtb3ZlQ29sU3BhbixcbiAgcmVtb3ZlQ29sdW1uLFxuICByZW1vdmVSb3csXG4gIHJvd0lzSGVhZGVyLFxuICBzZWxlY3RlZFJlY3QsXG4gIHNlbGVjdGlvbkNlbGwsXG4gIHNldENlbGxBdHRyLFxuICBzcGxpdENlbGwsXG4gIHNwbGl0Q2VsbFdpdGhUeXBlLFxuICB0YWJsZUVkaXRpbmcsXG4gIHRhYmxlRWRpdGluZ0tleSxcbiAgdGFibGVOb2RlVHlwZXMsXG4gIHRhYmxlTm9kZXMsXG4gIHRvZ2dsZUhlYWRlcixcbiAgdG9nZ2xlSGVhZGVyQ2VsbCxcbiAgdG9nZ2xlSGVhZGVyQ29sdW1uLFxuICB0b2dnbGVIZWFkZXJSb3csXG4gIHVwZGF0ZUNvbHVtbnNPblJlc2l6ZVxufTtcbiIsICIvLyBAdHMtbm9jaGVja1xuaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgTm9kZVZpZXcgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDb2x1bW5zKFxuICBub2RlOiBQcm9zZU1pcnJvck5vZGUsXG4gIGNvbGdyb3VwOiBFbGVtZW50LFxuICB0YWJsZTogRWxlbWVudCxcbiAgY2VsbE1pbldpZHRoOiBudW1iZXIsXG4gIG92ZXJyaWRlQ29sPzogbnVtYmVyLFxuICBvdmVycmlkZVZhbHVlPzogYW55LFxuKSB7XG4gIGxldCB0b3RhbFdpZHRoID0gMFxuICBsZXQgZml4ZWRXaWR0aCA9IHRydWVcbiAgbGV0IG5leHRET00gPSBjb2xncm91cC5maXJzdENoaWxkXG4gIGNvbnN0IHJvdyA9IG5vZGUuZmlyc3RDaGlsZFxuXG4gIGZvciAobGV0IGkgPSAwLCBjb2wgPSAwOyBpIDwgcm93LmNoaWxkQ291bnQ7IGkgKz0gMSkge1xuICAgIGNvbnN0IHsgY29sc3BhbiwgY29sd2lkdGggfSA9IHJvdy5jaGlsZChpKS5hdHRyc1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzcGFuOyBqICs9IDEsIGNvbCArPSAxKSB7XG4gICAgICBjb25zdCBoYXNXaWR0aCA9IG92ZXJyaWRlQ29sID09PSBjb2wgPyBvdmVycmlkZVZhbHVlIDogY29sd2lkdGggJiYgY29sd2lkdGhbal1cbiAgICAgIGNvbnN0IGNzc1dpZHRoID0gaGFzV2lkdGggPyBgJHtoYXNXaWR0aH1weGAgOiAnJ1xuXG4gICAgICB0b3RhbFdpZHRoICs9IGhhc1dpZHRoIHx8IGNlbGxNaW5XaWR0aFxuXG4gICAgICBpZiAoIWhhc1dpZHRoKSB7XG4gICAgICAgIGZpeGVkV2lkdGggPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpZiAoIW5leHRET00pIHtcbiAgICAgICAgY29sZ3JvdXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY29sJykpLnN0eWxlLndpZHRoID0gY3NzV2lkdGhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuZXh0RE9NLnN0eWxlLndpZHRoICE9PSBjc3NXaWR0aCkge1xuICAgICAgICAgIG5leHRET00uc3R5bGUud2lkdGggPSBjc3NXaWR0aFxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dERPTSA9IG5leHRET00ubmV4dFNpYmxpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3aGlsZSAobmV4dERPTSkge1xuICAgIGNvbnN0IGFmdGVyID0gbmV4dERPTS5uZXh0U2libGluZ1xuXG4gICAgbmV4dERPTS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHRET00pXG4gICAgbmV4dERPTSA9IGFmdGVyXG4gIH1cblxuICBpZiAoZml4ZWRXaWR0aCkge1xuICAgIHRhYmxlLnN0eWxlLndpZHRoID0gYCR7dG90YWxXaWR0aH1weGBcbiAgICB0YWJsZS5zdHlsZS5taW5XaWR0aCA9ICcnXG4gIH0gZWxzZSB7XG4gICAgdGFibGUuc3R5bGUud2lkdGggPSAnJ1xuICAgIHRhYmxlLnN0eWxlLm1pbldpZHRoID0gYCR7dG90YWxXaWR0aH1weGBcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVWaWV3IGltcGxlbWVudHMgTm9kZVZpZXcge1xuICBub2RlOiBQcm9zZU1pcnJvck5vZGVcblxuICBjZWxsTWluV2lkdGg6IG51bWJlclxuXG4gIGRvbTogRWxlbWVudFxuXG4gIHRhYmxlOiBFbGVtZW50XG5cbiAgY29sZ3JvdXA6IEVsZW1lbnRcblxuICBjb250ZW50RE9NOiBFbGVtZW50XG5cbiAgY29uc3RydWN0b3Iobm9kZTogUHJvc2VNaXJyb3JOb2RlLCBjZWxsTWluV2lkdGg6IG51bWJlcikge1xuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICB0aGlzLmNlbGxNaW5XaWR0aCA9IGNlbGxNaW5XaWR0aFxuICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSAndGFibGVXcmFwcGVyJ1xuICAgIHRoaXMudGFibGUgPSB0aGlzLmRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpKVxuICAgIHRoaXMuY29sZ3JvdXAgPSB0aGlzLnRhYmxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvbGdyb3VwJykpXG4gICAgdXBkYXRlQ29sdW1ucyhub2RlLCB0aGlzLmNvbGdyb3VwLCB0aGlzLnRhYmxlLCBjZWxsTWluV2lkdGgpXG4gICAgdGhpcy5jb250ZW50RE9NID0gdGhpcy50YWJsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpKVxuICB9XG5cbiAgdXBkYXRlKG5vZGU6IFByb3NlTWlycm9yTm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT09IHRoaXMubm9kZS50eXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLm5vZGUgPSBub2RlXG4gICAgdXBkYXRlQ29sdW1ucyhub2RlLCB0aGlzLmNvbGdyb3VwLCB0aGlzLnRhYmxlLCB0aGlzLmNlbGxNaW5XaWR0aClcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQgfCB7IHR5cGU6ICdzZWxlY3Rpb24nOyB0YXJnZXQ6IEVsZW1lbnQgfSkge1xuICAgIHJldHVybiAoXG4gICAgICBtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcydcbiAgICAgICYmIChtdXRhdGlvbi50YXJnZXQgPT09IHRoaXMudGFibGUgfHwgdGhpcy5jb2xncm91cC5jb250YWlucyhtdXRhdGlvbi50YXJnZXQpKVxuICAgIClcbiAgfVxufVxuIiwgImltcG9ydCB7IEZyYWdtZW50LCBOb2RlIGFzIFByb3NlbWlycm9yTm9kZSwgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2VsbChcbiAgY2VsbFR5cGU6IE5vZGVUeXBlLFxuICBjZWxsQ29udGVudD86IEZyYWdtZW50IHwgUHJvc2VtaXJyb3JOb2RlIHwgQXJyYXk8UHJvc2VtaXJyb3JOb2RlPixcbik6IFByb3NlbWlycm9yTm9kZSB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoY2VsbENvbnRlbnQpIHtcbiAgICByZXR1cm4gY2VsbFR5cGUuY3JlYXRlQ2hlY2tlZChudWxsLCBjZWxsQ29udGVudClcbiAgfVxuXG4gIHJldHVybiBjZWxsVHlwZS5jcmVhdGVBbmRGaWxsKClcbn1cbiIsICJpbXBvcnQgeyBOb2RlVHlwZSwgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTm9kZVR5cGVzKHNjaGVtYTogU2NoZW1hKTogeyBba2V5OiBzdHJpbmddOiBOb2RlVHlwZSB9IHtcbiAgaWYgKHNjaGVtYS5jYWNoZWQudGFibGVOb2RlVHlwZXMpIHtcbiAgICByZXR1cm4gc2NoZW1hLmNhY2hlZC50YWJsZU5vZGVUeXBlc1xuICB9XG5cbiAgY29uc3Qgcm9sZXM6IHsgW2tleTogc3RyaW5nXTogTm9kZVR5cGUgfSA9IHt9XG5cbiAgT2JqZWN0LmtleXMoc2NoZW1hLm5vZGVzKS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgIGNvbnN0IG5vZGVUeXBlID0gc2NoZW1hLm5vZGVzW3R5cGVdXG5cbiAgICBpZiAobm9kZVR5cGUuc3BlYy50YWJsZVJvbGUpIHtcbiAgICAgIHJvbGVzW25vZGVUeXBlLnNwZWMudGFibGVSb2xlXSA9IG5vZGVUeXBlXG4gICAgfVxuICB9KVxuXG4gIHNjaGVtYS5jYWNoZWQudGFibGVOb2RlVHlwZXMgPSByb2xlc1xuXG4gIHJldHVybiByb2xlc1xufVxuIiwgImltcG9ydCB7IEZyYWdtZW50LCBOb2RlIGFzIFByb3NlbWlycm9yTm9kZSwgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgY3JlYXRlQ2VsbCB9IGZyb20gJy4vY3JlYXRlQ2VsbC5qcydcbmltcG9ydCB7IGdldFRhYmxlTm9kZVR5cGVzIH0gZnJvbSAnLi9nZXRUYWJsZU5vZGVUeXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgcm93c0NvdW50OiBudW1iZXIsXG4gIGNvbHNDb3VudDogbnVtYmVyLFxuICB3aXRoSGVhZGVyUm93OiBib29sZWFuLFxuICBjZWxsQ29udGVudD86IEZyYWdtZW50IHwgUHJvc2VtaXJyb3JOb2RlIHwgQXJyYXk8UHJvc2VtaXJyb3JOb2RlPixcbik6IFByb3NlbWlycm9yTm9kZSB7XG4gIGNvbnN0IHR5cGVzID0gZ2V0VGFibGVOb2RlVHlwZXMoc2NoZW1hKVxuICBjb25zdCBoZWFkZXJDZWxsczogUHJvc2VtaXJyb3JOb2RlW10gPSBbXVxuICBjb25zdCBjZWxsczogUHJvc2VtaXJyb3JOb2RlW10gPSBbXVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb2xzQ291bnQ7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBjZWxsID0gY3JlYXRlQ2VsbCh0eXBlcy5jZWxsLCBjZWxsQ29udGVudClcblxuICAgIGlmIChjZWxsKSB7XG4gICAgICBjZWxscy5wdXNoKGNlbGwpXG4gICAgfVxuXG4gICAgaWYgKHdpdGhIZWFkZXJSb3cpIHtcbiAgICAgIGNvbnN0IGhlYWRlckNlbGwgPSBjcmVhdGVDZWxsKHR5cGVzLmhlYWRlcl9jZWxsLCBjZWxsQ29udGVudClcblxuICAgICAgaWYgKGhlYWRlckNlbGwpIHtcbiAgICAgICAgaGVhZGVyQ2VsbHMucHVzaChoZWFkZXJDZWxsKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJvd3M6IFByb3NlbWlycm9yTm9kZVtdID0gW11cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93c0NvdW50OyBpbmRleCArPSAxKSB7XG4gICAgcm93cy5wdXNoKHR5cGVzLnJvdy5jcmVhdGVDaGVja2VkKG51bGwsIHdpdGhIZWFkZXJSb3cgJiYgaW5kZXggPT09IDAgPyBoZWFkZXJDZWxscyA6IGNlbGxzKSlcbiAgfVxuXG4gIHJldHVybiB0eXBlcy50YWJsZS5jcmVhdGVDaGVja2VkKG51bGwsIHJvd3MpXG59XG4iLCAiaW1wb3J0IHsgQ2VsbFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vdGFibGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDZWxsU2VsZWN0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ2VsbFNlbGVjdGlvbiB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb25cbn1cbiIsICJpbXBvcnQgeyBmaW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1BvcywgS2V5Ym9hcmRTaG9ydGN1dENvbW1hbmQgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmltcG9ydCB7IGlzQ2VsbFNlbGVjdGlvbiB9IGZyb20gJy4vaXNDZWxsU2VsZWN0aW9uLmpzJ1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFibGVXaGVuQWxsQ2VsbHNTZWxlY3RlZDogS2V5Ym9hcmRTaG9ydGN1dENvbW1hbmQgPSAoeyBlZGl0b3IgfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yLnN0YXRlXG5cbiAgaWYgKCFpc0NlbGxTZWxlY3Rpb24oc2VsZWN0aW9uKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IGNlbGxDb3VudCA9IDBcbiAgY29uc3QgdGFibGUgPSBmaW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1BvcyhzZWxlY3Rpb24ucmFuZ2VzWzBdLiRmcm9tLCBub2RlID0+IHtcbiAgICByZXR1cm4gbm9kZS50eXBlLm5hbWUgPT09ICd0YWJsZSdcbiAgfSlcblxuICB0YWJsZT8ubm9kZS5kZXNjZW5kYW50cyhub2RlID0+IHtcbiAgICBpZiAobm9kZS50eXBlLm5hbWUgPT09ICd0YWJsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChbJ3RhYmxlQ2VsbCcsICd0YWJsZUhlYWRlciddLmluY2x1ZGVzKG5vZGUudHlwZS5uYW1lKSkge1xuICAgICAgY2VsbENvdW50ICs9IDFcbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgYWxsQ2VsbHNTZWxlY3RlZCA9IGNlbGxDb3VudCA9PT0gc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGhcblxuICBpZiAoIWFsbENlbGxzU2VsZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGVkaXRvci5jb21tYW5kcy5kZWxldGVUYWJsZSgpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQge1xuICBjYWxsT3JSZXR1cm4sIGdldEV4dGVuc2lvbkZpZWxkLCBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUsIFBhcmVudENvbmZpZyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQge1xuICBhZGRDb2x1bW5BZnRlcixcbiAgYWRkQ29sdW1uQmVmb3JlLFxuICBhZGRSb3dBZnRlcixcbiAgYWRkUm93QmVmb3JlLFxuICBDZWxsU2VsZWN0aW9uLFxuICBjb2x1bW5SZXNpemluZyxcbiAgZGVsZXRlQ29sdW1uLFxuICBkZWxldGVSb3csXG4gIGRlbGV0ZVRhYmxlLFxuICBmaXhUYWJsZXMsXG4gIGdvVG9OZXh0Q2VsbCxcbiAgbWVyZ2VDZWxscyxcbiAgc2V0Q2VsbEF0dHIsXG4gIHNwbGl0Q2VsbCxcbiAgdGFibGVFZGl0aW5nLFxuICB0b2dnbGVIZWFkZXIsXG4gIHRvZ2dsZUhlYWRlckNlbGwsXG59IGZyb20gJ0B0aXB0YXAvcG0vdGFibGVzJ1xuaW1wb3J0IHsgTm9kZVZpZXcgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmltcG9ydCB7IFRhYmxlVmlldyB9IGZyb20gJy4vVGFibGVWaWV3LmpzJ1xuaW1wb3J0IHsgY3JlYXRlVGFibGUgfSBmcm9tICcuL3V0aWxpdGllcy9jcmVhdGVUYWJsZS5qcydcbmltcG9ydCB7IGRlbGV0ZVRhYmxlV2hlbkFsbENlbGxzU2VsZWN0ZWQgfSBmcm9tICcuL3V0aWxpdGllcy9kZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIHJlc2l6YWJsZTogYm9vbGVhblxuICBoYW5kbGVXaWR0aDogbnVtYmVyXG4gIGNlbGxNaW5XaWR0aDogbnVtYmVyXG4gIFZpZXc6IE5vZGVWaWV3XG4gIGxhc3RDb2x1bW5SZXNpemFibGU6IGJvb2xlYW5cbiAgYWxsb3dUYWJsZU5vZGVTZWxlY3Rpb246IGJvb2xlYW5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRhYmxlOiB7XG4gICAgICBpbnNlcnRUYWJsZTogKG9wdGlvbnM/OiB7XG4gICAgICAgIHJvd3M/OiBudW1iZXJcbiAgICAgICAgY29scz86IG51bWJlclxuICAgICAgICB3aXRoSGVhZGVyUm93PzogYm9vbGVhblxuICAgICAgfSkgPT4gUmV0dXJuVHlwZVxuICAgICAgYWRkQ29sdW1uQmVmb3JlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBhZGRDb2x1bW5BZnRlcjogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgZGVsZXRlQ29sdW1uOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBhZGRSb3dCZWZvcmU6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIGFkZFJvd0FmdGVyOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBkZWxldGVSb3c6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIGRlbGV0ZVRhYmxlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBtZXJnZUNlbGxzOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBzcGxpdENlbGw6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIHRvZ2dsZUhlYWRlckNvbHVtbjogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgdG9nZ2xlSGVhZGVyUm93OiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICB0b2dnbGVIZWFkZXJDZWxsOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBtZXJnZU9yU3BsaXQ6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIHNldENlbGxBdHRyaWJ1dGU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IFJldHVyblR5cGVcbiAgICAgIGdvVG9OZXh0Q2VsbDogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgZ29Ub1ByZXZpb3VzQ2VsbDogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgZml4VGFibGVzOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBzZXRDZWxsU2VsZWN0aW9uOiAocG9zaXRpb246IHsgYW5jaG9yQ2VsbDogbnVtYmVyOyBoZWFkQ2VsbD86IG51bWJlciB9KSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG5cbiAgaW50ZXJmYWNlIE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4ge1xuICAgIC8qKlxuICAgICAqIFRhYmxlIFJvbGVcbiAgICAgKi9cbiAgICB0YWJsZVJvbGU/OlxuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnM+PlsndGFibGVSb2xlJ11cbiAgICAgICAgfSkgPT4gc3RyaW5nKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUYWJsZSA9IE5vZGUuY3JlYXRlPFRhYmxlT3B0aW9ucz4oe1xuICBuYW1lOiAndGFibGUnLFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgcmVzaXphYmxlOiBmYWxzZSxcbiAgICAgIGhhbmRsZVdpZHRoOiA1LFxuICAgICAgY2VsbE1pbldpZHRoOiAyNSxcbiAgICAgIC8vIFRPRE86IGZpeFxuICAgICAgVmlldzogVGFibGVWaWV3LFxuICAgICAgbGFzdENvbHVtblJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgIGFsbG93VGFibGVOb2RlU2VsZWN0aW9uOiBmYWxzZSxcbiAgICB9XG4gIH0sXG5cbiAgY29udGVudDogJ3RhYmxlUm93KycsXG5cbiAgdGFibGVSb2xlOiAndGFibGUnLFxuXG4gIGlzb2xhdGluZzogdHJ1ZSxcblxuICBncm91cDogJ2Jsb2NrJyxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFt7IHRhZzogJ3RhYmxlJyB9XVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsndGFibGUnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIFsndGJvZHknLCAwXV1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0VGFibGU6XG4gICAgICAgICh7IHJvd3MgPSAzLCBjb2xzID0gMywgd2l0aEhlYWRlclJvdyA9IHRydWUgfSA9IHt9KSA9PiAoeyB0ciwgZGlzcGF0Y2gsIGVkaXRvciB9KSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IGNyZWF0ZVRhYmxlKGVkaXRvci5zY2hlbWEsIHJvd3MsIGNvbHMsIHdpdGhIZWFkZXJSb3cpXG5cbiAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRyLnNlbGVjdGlvbi5hbmNob3IgKyAxXG5cbiAgICAgICAgICAgIHRyLnJlcGxhY2VTZWxlY3Rpb25XaXRoKG5vZGUpXG4gICAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldygpXG4gICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKG9mZnNldCkpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICBhZGRDb2x1bW5CZWZvcmU6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFkZENvbHVtbkJlZm9yZShzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICBhZGRDb2x1bW5BZnRlcjpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uQWZ0ZXIoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgZGVsZXRlQ29sdW1uOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkZWxldGVDb2x1bW4oc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgYWRkUm93QmVmb3JlOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhZGRSb3dCZWZvcmUoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgYWRkUm93QWZ0ZXI6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFkZFJvd0FmdGVyKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGRlbGV0ZVJvdzpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gZGVsZXRlUm93KHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGRlbGV0ZVRhYmxlOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkZWxldGVUYWJsZShzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICBtZXJnZUNlbGxzOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBtZXJnZUNlbGxzKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIHNwbGl0Q2VsbDpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3BsaXRDZWxsKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIHRvZ2dsZUhlYWRlckNvbHVtbjpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdG9nZ2xlSGVhZGVyKCdjb2x1bW4nKShzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICB0b2dnbGVIZWFkZXJSb3c6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRvZ2dsZUhlYWRlcigncm93Jykoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgdG9nZ2xlSGVhZGVyQ2VsbDpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdG9nZ2xlSGVhZGVyQ2VsbChzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICBtZXJnZU9yU3BsaXQ6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgaWYgKG1lcmdlQ2VsbHMoc3RhdGUsIGRpc3BhdGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3BsaXRDZWxsKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIHNldENlbGxBdHRyaWJ1dGU6XG4gICAgICAgIChuYW1lLCB2YWx1ZSkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc2V0Q2VsbEF0dHIobmFtZSwgdmFsdWUpKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGdvVG9OZXh0Q2VsbDpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gZ29Ub05leHRDZWxsKDEpKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGdvVG9QcmV2aW91c0NlbGw6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGdvVG9OZXh0Q2VsbCgtMSkoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgZml4VGFibGVzOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgZml4VGFibGVzKHN0YXRlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICBzZXRDZWxsU2VsZWN0aW9uOlxuICAgICAgICBwb3NpdGlvbiA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gQ2VsbFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBwb3NpdGlvbi5hbmNob3JDZWxsLCBwb3NpdGlvbi5oZWFkQ2VsbClcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgVGFiOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvci5jb21tYW5kcy5nb1RvTmV4dENlbGwoKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZWRpdG9yLmNhbigpLmFkZFJvd0FmdGVyKCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvci5jaGFpbigpLmFkZFJvd0FmdGVyKCkuZ29Ub05leHRDZWxsKCkucnVuKClcbiAgICAgIH0sXG4gICAgICAnU2hpZnQtVGFiJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuZ29Ub1ByZXZpb3VzQ2VsbCgpLFxuICAgICAgQmFja3NwYWNlOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgICAgJ01vZC1CYWNrc3BhY2UnOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgICAgRGVsZXRlOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgICAgJ01vZC1EZWxldGUnOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgIH1cbiAgfSxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgY29uc3QgaXNSZXNpemFibGUgPSB0aGlzLm9wdGlvbnMucmVzaXphYmxlICYmIHRoaXMuZWRpdG9yLmlzRWRpdGFibGVcblxuICAgIHJldHVybiBbXG4gICAgICAuLi4oaXNSZXNpemFibGVcbiAgICAgICAgPyBbXG4gICAgICAgICAgY29sdW1uUmVzaXppbmcoe1xuICAgICAgICAgICAgaGFuZGxlV2lkdGg6IHRoaXMub3B0aW9ucy5oYW5kbGVXaWR0aCxcbiAgICAgICAgICAgIGNlbGxNaW5XaWR0aDogdGhpcy5vcHRpb25zLmNlbGxNaW5XaWR0aCxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgKGluY29ycmVjdCB0eXBlKVxuICAgICAgICAgICAgVmlldzogdGhpcy5vcHRpb25zLlZpZXcsXG4gICAgICAgICAgICAvLyBUT0RPOiBQUiBmb3IgQHR5cGVzL3Byb3NlbWlycm9yLXRhYmxlc1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAoaW5jb3JyZWN0IHR5cGUpXG4gICAgICAgICAgICBsYXN0Q29sdW1uUmVzaXphYmxlOiB0aGlzLm9wdGlvbnMubGFzdENvbHVtblJlc2l6YWJsZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIHRhYmxlRWRpdGluZyh7XG4gICAgICAgIGFsbG93VGFibGVOb2RlU2VsZWN0aW9uOiB0aGlzLm9wdGlvbnMuYWxsb3dUYWJsZU5vZGVTZWxlY3Rpb24sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgZXh0ZW5kTm9kZVNjaGVtYShleHRlbnNpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZVJvbGU6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZChleHRlbnNpb24sICd0YWJsZVJvbGUnLCBjb250ZXh0KSksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDZWxsT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5leHBvcnQgY29uc3QgVGFibGVDZWxsID0gTm9kZS5jcmVhdGU8VGFibGVDZWxsT3B0aW9ucz4oe1xuICBuYW1lOiAndGFibGVDZWxsJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIGNvbnRlbnQ6ICdibG9jaysnLFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHNwYW46IHtcbiAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgIH0sXG4gICAgICByb3dzcGFuOiB7XG4gICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICB9LFxuICAgICAgY29sd2lkdGg6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x3aWR0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjb2x3aWR0aCcpXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2x3aWR0aFxuICAgICAgICAgICAgPyBbcGFyc2VJbnQoY29sd2lkdGgsIDEwKV1cbiAgICAgICAgICAgIDogbnVsbFxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICB0YWJsZVJvbGU6ICdjZWxsJyxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3RkJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3RkJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG59KVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUhlYWRlck9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cbmV4cG9ydCBjb25zdCBUYWJsZUhlYWRlciA9IE5vZGUuY3JlYXRlPFRhYmxlSGVhZGVyT3B0aW9ucz4oe1xuICBuYW1lOiAndGFibGVIZWFkZXInLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgY29udGVudDogJ2Jsb2NrKycsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sc3Bhbjoge1xuICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgfSxcbiAgICAgIHJvd3NwYW46IHtcbiAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgIH0sXG4gICAgICBjb2x3aWR0aDoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHdpZHRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NvbHdpZHRoJylcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbHdpZHRoXG4gICAgICAgICAgICA/IFtwYXJzZUludChjb2x3aWR0aCwgMTApXVxuICAgICAgICAgICAgOiBudWxsXG5cbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHRhYmxlUm9sZTogJ2hlYWRlcl9jZWxsJyxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3RoJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3RoJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG59KVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVJvd09wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZXhwb3J0IGNvbnN0IFRhYmxlUm93ID0gTm9kZS5jcmVhdGU8VGFibGVSb3dPcHRpb25zPih7XG4gIG5hbWU6ICd0YWJsZVJvdycsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAnKHRhYmxlQ2VsbCB8IHRhYmxlSGVhZGVyKSonLFxuXG4gIHRhYmxlUm9sZTogJ3JvdycsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3RyJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3RyJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgY29uc3QgVGV4dCA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogJ3RleHQnLFxuICBncm91cDogJ2lubGluZScsXG59KVxuIiwgImltcG9ydCB7IE1hcmssIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBVbmRlcmxpbmVPcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB1bmRlcmxpbmU6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGFuIHVuZGVybGluZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldFVuZGVybGluZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGFuIHVuZGVybGluZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZVVuZGVybGluZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYW4gdW5kZXJsaW5lIG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRVbmRlcmxpbmU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBVbmRlcmxpbmUgPSBNYXJrLmNyZWF0ZTxVbmRlcmxpbmVPcHRpb25zPih7XG4gIG5hbWU6ICd1bmRlcmxpbmUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ3UnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3R5bGU6ICd0ZXh0LWRlY29yYXRpb24nLFxuICAgICAgICBjb25zdW1pbmc6IGZhbHNlLFxuICAgICAgICBnZXRBdHRyczogc3R5bGUgPT4gKChzdHlsZSBhcyBzdHJpbmcpLmluY2x1ZGVzKCd1bmRlcmxpbmUnKSA/IHt9IDogZmFsc2UpLFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWyd1JywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRVbmRlcmxpbmU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZVVuZGVybGluZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRVbmRlcmxpbmU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC11JzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lKCksXG4gICAgICAnTW9kLVUnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVVbmRlcmxpbmUoKSxcbiAgICB9XG4gIH0sXG59KVxuIiwgImltcG9ydCB7XG4gIE1hcmssXG4gIG1hcmtJbnB1dFJ1bGUsXG4gIG1hcmtQYXN0ZVJ1bGUsXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEhpZ2hsaWdodE9wdGlvbnMge1xuICBtdWx0aWNvbG9yOiBib29sZWFuLFxuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGhpZ2hsaWdodDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBoaWdobGlnaHQgbWFya1xuICAgICAgICovXG4gICAgICBzZXRIaWdobGlnaHQ6IChhdHRyaWJ1dGVzPzogeyBjb2xvcjogc3RyaW5nIH0pID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIGhpZ2hsaWdodCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUhpZ2hsaWdodDogKGF0dHJpYnV0ZXM/OiB7IGNvbG9yOiBzdHJpbmcgfSkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBoaWdobGlnaHQgbWFya1xuICAgICAgICovXG4gICAgICB1bnNldEhpZ2hsaWdodDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlucHV0UmVnZXggPSAvKD86XnxcXHMpKCg/Oj09KSgoPzpbXn49XSspKSg/Oj09KSkkL1xuZXhwb3J0IGNvbnN0IHBhc3RlUmVnZXggPSAvKD86XnxcXHMpKCg/Oj09KSgoPzpbXn49XSspKSg/Oj09KSkvZ1xuXG5leHBvcnQgY29uc3QgSGlnaGxpZ2h0ID0gTWFyay5jcmVhdGU8SGlnaGxpZ2h0T3B0aW9ucz4oe1xuICBuYW1lOiAnaGlnaGxpZ2h0JyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtdWx0aWNvbG9yOiBmYWxzZSxcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aWNvbG9yKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbG9yJykgfHwgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgIGlmICghYXR0cmlidXRlcy5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdkYXRhLWNvbG9yJzogYXR0cmlidXRlcy5jb2xvcixcbiAgICAgICAgICAgIHN0eWxlOiBgYmFja2dyb3VuZC1jb2xvcjogJHthdHRyaWJ1dGVzLmNvbG9yfTsgY29sb3I6IGluaGVyaXRgLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdtYXJrJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnbWFyaycsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0SGlnaGxpZ2h0OiBhdHRyaWJ1dGVzID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lLCBhdHRyaWJ1dGVzKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUhpZ2hsaWdodDogYXR0cmlidXRlcyA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgIH0sXG4gICAgICB1bnNldEhpZ2hsaWdodDogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLVNoaWZ0LWgnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVIaWdobGlnaHQoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcblxuICBhZGRQYXN0ZVJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrUGFzdGVSdWxlKHtcbiAgICAgICAgZmluZDogcGFzdGVSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBOb2RlLCBtZXJnZUF0dHJpYnV0ZXMgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5cbmV4cG9ydCBjb25zdCBDaGVja2VkTGlzdCA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogXCJjaGVja2VkTGlzdFwiLFxuXG4gIHByaW9yaXR5OiA1MCxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtVHlwZU5hbWU6IFwibGlzdEl0ZW1cIixcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIGNsYXNzOiBcImNoZWNrZWQtbGlzdFwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGdyb3VwOiBcImJsb2NrIGxpc3RcIixcblxuICBjb250ZW50KCkge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lfStgO1xuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW3sgdGFnOiBcInVsXCIsIGdldEF0dHJzOiAoZWxlbWVudCkgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjaGVja2VkLWxpc3RcIiksIHByaW9yaXR5OiAxMDAwIH1dO1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcInVsXCIsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF07XG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvZ2dsZUNoZWNrZWRMaXN0OlxuICAgICAgICAoKSA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZUxpc3QodGhpcy5uYW1lLCB0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgTGVhZCA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogXCJsZWFkXCIsXG4gIGdyb3VwOiBcImJsb2NrXCIsXG4gIGNvbnRlbnQ6IFwiYmxvY2srXCIsXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIGNsYXNzOiBcImxlYWRcIixcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgZ2V0QXR0cnM6IChlbGVtZW50KSA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImxlYWRcIiksXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIHJlbmRlckhUTUwoeyBub2RlLCBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICB9LFxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9nZ2xlTGVhZDpcbiAgICAgICAgKCkgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVXcmFwKHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgIi8vIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBETyBOT1QgRURJVCBESVJFQ1RMWVxuLy8gU2VlIHVwZGF0ZS10bGRzLmpzIGZvciBlbmNvZGluZy9kZWNvZGluZyBmb3JtYXRcbi8vIGh0dHBzOi8vZGF0YS5pYW5hLm9yZy9UTEQvdGxkcy1hbHBoYS1ieS1kb21haW4udHh0XG5jb25zdCBlbmNvZGVkVGxkcyA9ICdhYWExcnAzYmIwb3R0M3ZpZTRjMWxlMm9nYWRvNXVkaGFiaTdjMGFkZW15NWNlbnR1cmU2b3VudGFudDBzOW8xdG9yNGQwczF1bHQ0ZTBnMXJvMnRuYTRmMGwxcmljYTVnMGFraGFuNWVuY3k1aTBnMXJidXMzZm9yY2U1dGVsNWtkbjNsMGliYWJhNHBheTRsZmluYW56NnN0YXRlNXkyc2FjZTN0b201bTBhem9uNGVyaWNhbmV4cHJlc3M3ZmFtaWx5MTF4MmZhbTNpY2Ezc3RlcmRhbThuYWx5dGljczdkcm9pZDVxdWFuNHoybzBsMnBhcnRtZW50czhwMGxlNHEwdWFyZWxsZThyMGFiMW1jbzRjaGkzbXkycGEydDBlM3MwZGEyaWEyc29jaWF0ZXM5dDBobGV0YTV0b3JuZXk3dTBjdGlvbjVkaTBibGUzbzNzcG9zdDV0aG9yM28wczR2aWFuY2E2dzBzMngwYTJ6MHVyZTViYTBieTJpZHUzbmFtZXgzbmFyZXB1YmxpYzExZDFrMnIwY2Vsb25hNWxheWNhcmQ0czVlZm9vdDVnYWluczZzZWJhbGw1a2V0YmFsbDh1aGF1czV5ZXJuNWIwYzF0MXZhM2NnMW4yZDFlMGF0czJ1dHk0ZXIybnRsZXk1cmxpbjRzdDBidXk1dDJmMWcxaDBhcnRpNWkwYmxlM2Qxa2UybmcwbzNvMXoyajFsYWNrMGZyaWRheTlvY2tidXN0ZXI4ZzFvbWJlcmc3dWUzbTBzMXcybjBwcGFyaWJhczlvMGF0czNlaHJpbmdlcjhmYTJtMW5kMm8wazBpbmc1c2NoMnRpazJvbjR0MXV0aXF1ZTZ4MnIwYWRlc2NvNmlkZ2VzdG9uZTlvYWR3YXk1a2VyM3RoZXI1dXNzZWxzN3MxdDF1aWxkMGVyczZzaW5lc3M2eTF6ejN2MXcxeTF6MGgzY2EwYjFmZTJsMGwxdmlua2xlaW45bTBlcmEzcDJub24zcGV0b3duNWl0YWwwb25lOHIwYXZhbjRkczJlMGVyMHM0czJzYTFlMWgxaW5vNHQwZXJpbmc1aG9saWM3YmExbjFyZTNjMWQxZW50ZXI0bzFybjNmMGExZDJnMWgwYW5lbDJuZWw0cml0eTRzZTJ0MmVhcDNpbnRhaTVyaXN0bWFzNm9tZTR1cmNoNWkwcHJpYW5pNnJjbGU0c2NvM3RhZGVsNGkwYzJ5M2sxbDBhaW1zNGVhbmluZzZpY2sybmljMXF1ZTZvdGhpbmc1dWQzdWIwbWVkNm0xbjFvMGFjaDNkZXMzZmZlZTRsbGVnZTRvZ25lNW0wY2FzdDRtYmFuazR1bml0eTZwYW55MnJlM3V0ZXI1c2VjNG5kb3Mzc3RydWN0aW9uOHVsdGluZzd0YWN0M3JhY3RvcnM5b2tpbmc0bDFwMnJzaWNhNXVudHJ5NHBvbjBzNHJzZXM2cGEycjBlZGl0MGNhcmQ0dW5pb245aWNrZXQ1b3duM3MxdWlzZTBzNnUwaXNpbmVsbGE5djF3MXgxeTBtcnUzb3UzejJkYWJ1cjNkMW5jZTN0YTFlMWluZzNzdW40eTJjbGszZHMyZTBhbDBlcjJzM2dyZWU0bGl2ZXJ5NWwxb2l0dGU1dGEzbW9jcmF0Nm50YWwyaXN0NXNpMGduNHYyaGwyaWFtb25kczZldDJnaXRhbDVyZWN0MG9yeTdzY291bnQzdmVyNWgyeTJqMWsxbTFucDJvMGNzMXRvcjRnMW1haW5zNXQxd25sb2FkN3JpdmU0dHYydWJhaTNubG9wNHBvbnQ0cmJhbjV2YWcycjJ6MmVhcnRoM3QyYzBvMmRla2EzdTBjYXRpb244ZTFnMW1haWwzZXJjazVuZXJneTRnaW5lZXIwaW5nOXRlcnByaXNlczEwcHNvbjRxdWlwbWVudDhyMGljc3NvbjZuaTNzMHExdGF0ZTV0MXUwcm92aXNpb244czJ2ZW50czV4Y2hhbmdlNnBlcnQzb3NlZDRyZXNzNXRyYXNwYWNlMTBmYWdlMmlsMXJ3aW5kczZ0aDNtaWx5NG4wczJybTBlcnM1c2hpb240dDNlZGV4M2VkYmFjazZycmFyaTNlcm82aTBkZWxpdHk1bzJsbTJuYWwxbmNlMWlhbDdyZTBzdG9uZTZtZGFsZTZzaDBpbmc1dDBuZXNzNmoxazFsaWNrcjNnaHRzNHIyb3Jpc3Q0d2VyczV5Mm0xbzBvMGQxdGJhbGw2cmQxZXgyc2FsZTR1bTN1bmRhdGlvbjh4MnIwZWUxc2VuaXVzN2wxb2dhbnM0bnRpZXI3dHIydWppdHN1NW4wZDJybml0dXJlN3Rib2w1eWkzZ2EwbDBsZXJ5M28xdXA0bWUwczNwMXJkZW40eTJiMGl6M2QwbjJlMGExbnQwaW5nNW9yZ2U1ZjFnMGVlM2gxaTBmdDBzM3ZlczJpbmc1bDBhc3MzZTFvYmFsMm80bTBhaWwzYmgybzF4Mm4xb2RhZGR5NWxkMHBvaW50NmYybzBkeWVhcjVnMGxlNHAxdDF2MnAxcTFyMGFpbmdlcjVwaGljczV0aXM0ZWVuM2lwZTNvY2VyeTR1cDRzMXQxdTBhcmRpYW42Y2NpM2dlMmlkZTJ0YXJzNXJ1M3cxeTJoYWlyMm1idXJnNW5nb3V0NXVzM2JvMmRmYzBiYW5rN2VhbHRoMGNhcmU4bHAxc2lua2k2cmUxbWVzNWlwaG9wNHNhbWl0c3U3dGFjaGk1djJrMHQybTFuMW9ja2V5NGxkaW5nczVpZGF5NW1lZGVwb3Q1Z29vZHM1czBlbnNlN25kYTNyc2Uzc3BpdGFsNXQwaW5nNXQwZWxzM21haWw1dXNlM3cycjFzYmMzdDF1MGdoZXM1eWF0dDN1bmRhaTdpYm0yY2JjMmUxdTJkMWUwZWUzZm0ya2FubzRsMW0wYW1hdDRkYjJtbzBiaWxpZW45bjBjMWR1c3RyaWVzOGZpbml0aTVvMmcxazFzdGl0dXRlNnVyYW5jZTRlNHQwZXJuYXRpb25hbDEwdWl0NHZlc3RtZW50czEwbzFwaXJhbmdhN3ExcjBpc2g0czBtYWlsaTV0MGFuYnVsN3QwYXUydjNqYWd1YXI0dmEzY2IyZTBlcDJ0enQzd2Vscnk2aW8ybGwybTBwMm5qMm8wYnMxdXJnNHQxeTJwMG1vcmdhbjZyczN1ZWdvczRuaXBlcjdrYXVmZW41ZGRpM2UwcnJ5aG90ZWxzNmxvZ2lzdGljczlwcm9wZXJ0aWVzMTRmaDJnMWgxaTBhMWRzMm0xbmRsZTR0Y2hlbjV3aTNtMW4xb2VsbjNtYXRzdTVzaGVyNXAwbWcybjJyMGQxZWQzdW9rZ3JvdXA4dzF5MG90bzR6MmxhMGNhaXhhNW1ib3JnaGluaThlcjNuY2FzdGVyNmQwcm92ZXI2eGVzczVzYWxsZTV0MGlubzNyb2JlNXcweWVyNWIxYzFkczJlYXNlM2NsZXJjNWZyYWs0Z2FsMm8yeHVzNGdidDNpMGRsMmZlMGluc3VyYW5jZTlzdHlsZTdnaHRpbmc2a2UybGx5M21pdGVkNG8ybmNvbG40azJwc3kzdmUxaW5nNWsxbGMxcDJvYW4wczNja2VyM3VzM2wxbmRvbjR0dGUxbzN2ZTNwbDBmaW5hbmNpYWwxMXIxczF0MGQwYTN1MG5kYmVjazZ4ZTF1cnk1djF5Mm1hMGRyaWQ0aWYxc29uNGtldXA0bjBhZ2VtZW50N2dvM3AxcmtldDBpbmczczRyaW90dDVzaGFsbHM3dHRlbDViYTJjMGtpbnNleTdkMWUwZDBpYTNldDJsYm91cm5lN21lMW9yaWFsNm4wdTJyY2ttc2Q3ZzFoMWlhbWkzY3Jvc29mdDdsMW5pMXQydDBzdWJpc2hpOWsxbDBiMXMybTBhMm4xbzBiaTBsZTRkYTJlMWkxbTFuYXNoM2V5MnN0ZXI1cm1vbjN0Z2FnZTZzY293NHRvMHJjeWNsZXM5djBpZTRwMXExcjFzMGQydDBuMXIydTBzZXVtM2ljNHYxdzF4MXkxejJuYTBiMWdveWE0bWUydHVyYTR2eTNiYTJjMWUwYzF0MGJhbms0ZmxpeDR3b3JrNXVzdGFyNXcwczJ4dDBkaXJlY3Q3dXM0ZjBsMmcwbzJoazJpMGNvMmtlMW9uM25qYTNzc2FuMXk1bDFvMGtpYTNydG9uNHcwcnV6M3R2NHAxcjBhMXcydHQydTF5YzJ6Mm9iaTFzZXJ2ZXI3ZmZpY2U1a2luYXdhNmxheWFuMGdyb3VwOWRuYXZ5NWxvM20wZWdhNG5lMWcxbDBpbmU1b28ycGVuM3JhY2xlM25nZTRnMGFuaWM1aWdpbnM2c2FrYTR0c3VrYTR0MnZoM3BhMGdlMm5hc29uaWM3cmlzMnMxdG5lcnM0czF5M3kyY2N3M2UwdDJmMGl6ZXI1ZzFoMGFybWFjeTZkMWlsaXBzNW9uZTJ0bzBncmFwaHk2czR5c2lvNWljczF0ZXQydXJlczZkMW4wZzFrMm9uZWVyNXp6YTRrMWwwYWNlMnkwc3RhdGlvbjl1bWJpbmc1czNtMW4wYzJvaGwya2VyM2xpdGllNXJuMnN0M3IwYW1lcmljYTZ4aTNlc3MzaW1lM28wZDB1Y3Rpb25zOGYxZ3Jlc3NpdmU4bW8ycGVydGllczN5NXRlY3Rpb244dTBkZW50aWFsOXMxdDF1YjJ3MGMyeTJxYTFwb24zdWViZWMzc3Q1cmFjaW5nNGRpbzRlMGFkMWxlc3RhdGU2dG9yMnk0Y2lwZXM1ZDBzdG9uZTV1bWJyZWxsYTloYWIzaXNlMG4zdDJsaWFuY2U2bjB0MGFsczVwYWlyM29ydDN1YmxpY2FuOHN0MGF1cmFudDh2aWV3MHM1eHJvdGg2aWNoMGFyZGxpNm9oM2wxbzFwMm8wY2tzM2RlbzNnZXJzNG9tM3MwdnAzdTBnYnkzaHIybjJ3MGUyeXVreXU2c2EwYXJsYW5kNmZlMHR5NGt1cmE0bGUxb24zbXNjbHViNHVuZzVuZHZpazBjb3JvbWFudDEyb2ZpNHAxcmwyczF2ZTJ4bzNiMGkxczJjMGExYjFoYWVmZmxlcjdtaWR0NG9sYXJzaGlwczhvbDN1bGUzd2FyejVpZW5jZTVvdDNkMWUwYXJjaDN0MmN1cmUxaXR5NmVrMmxlY3Q0bmVyM3J2aWNlczZ2ZW4zdzF4MHkzZnIyZzFoMGFuZ3JpbGE2cnAydzJlbGwzaWExa3NoYTVvZXMycDBwaW5nNXVqaTN3M2kwbGsybmExZ2xlczV0ZTNqMWswaTBuMnkwcGU0bDBpbmc0bTBhcnQzaWxlNG4wY2YzbzBjY2VyM2lhbDRmdGJhbms0d2FyZTZodTJsYXIydXRpb25zN25nMXkyeTJwYTBjZTNvcnQydDNyMGwyczF0MGFkYTJwbGVzNHIxdGViYW5rNGZhcm03YzBncm91cDZvY2tob2xtNnJhZ2UzZTNyZWFtNHVkaW8yeTN5bGU0dTBja3MzcHBsaWVzM3kyb3J0NXJmMWdlcnk1enVraTV2MXdhdGNoNGlzczR4MXkwZG5leTRzdGVtczZ6MnRhYjFpcGVpNGxrMm9iYW80cmdldDR0YW1vdG9yczZyMnRvbzR4MGkzYzBpMmQwazJlYW0yY2gwbm9sb2d5OGwxbWFzZWs1bm5pczR2YTNmMWcxaDBkMWVhdGVyMnJlNmlhYTJja2V0czVlbmRhNHBzMnJlczJvbDRqMG1heHg0eDJrMG1heHg1bDFtMGFsbDRuMW8wZGF5M2t5bzNvbHMzcDFyYXkzc2hpYmE1dGFsM3VyczN3bjJ5b3RhM3MzcjBhZGUxaW5nNGluaW5nNXZlbDBlcnMwaW5zdXJhbmNlMTZ1c3QzdjJ0MXViZTJpMW5lczNzaHU0djBzMncxejJ1YTFiYW5rM3MyZzFrMW5pY29tM3ZlcnNpdHk4bzJvbDJwczJzMXkxejJ2YTBjYXRpb25zN25hMWd1YXJkN2MxZTBnYXMzbnR1cmVzNnJpc2lnbjVtXHUwMEY2Z2Vuc2JlcmF0ZXIydW5nMTRzaWNoZXJ1bmcxMHQyZzFpMGFqZXM0ZGVvM2cxa2luZzRsbGFzNG4xcDFyZ2luNHNhMWlvbjR2YTFvM2xhYW5kZXJlbjluMW9ka2EzbHZvM3RlMWluZzNvMnlhZ2U1dTJ3YWxlczJtYXJ0NHRlcjRuZzBnb3U1dGNoMGVzNmVhdGhlcjBjaGFubmVsMTJiY2FtM2VyMnNpdGU1ZDBkaW5nNWlibzJyM2YxaG9zd2hvNmllbjJraTJsbGlhbWhpbGw5bjBkb3dzNGUxbmVyczZtZTJvbHRlcnNrbHV3ZXIxMW9kc2lkZTZyazBzMmxkM3cyczF0YzFmM3hib3gzZXJveDRmaW5pdHk2aWh1YW40bjJ4eDJ5ejN5YWNodHM0aG9vM21heHVuNW5kZXg1ZTFvZG9iYXNoaTdnYTJrb2hhbWE2dTB0dWJlNnQxdW4zemEwcHBvczRyYTNlcm8zaXAybTFvbmUzdWVyaWNoNncyJztcbi8vIEludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lcyBjb250YWluaW5nIG5vbi1BU0NJSVxuY29uc3QgZW5jb2RlZFV0bGRzID0gJ1x1MDNCNVx1MDNCQjFcdTAzQzUyXHUwNDMxXHUwNDMzMVx1MDQzNVx1MDQzQjNcdTA0MzRcdTA0MzVcdTA0NDJcdTA0Mzg0XHUwNDM1XHUwNDRFMlx1MDQzQVx1MDQzMFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQzOFx1MDQzQTZcdTA0M0VcdTA0M0MzXHUwNDNDXHUwNDNBXHUwNDM0Mlx1MDQzRVx1MDQzRDFcdTA0NDFcdTA0M0FcdTA0MzJcdTA0MzA2XHUwNDNFXHUwNDNEXHUwNDNCXHUwNDMwXHUwNDM5XHUwNDNENVx1MDQ0MFx1MDQzMzNcdTA0NDBcdTA0NDNcdTA0NDEyXHUwNDQ0Mlx1MDQ0MVx1MDQzMFx1MDQzOVx1MDQ0MjNcdTA0NDBcdTA0MzEzXHUwNDQzXHUwNDNBXHUwNDQwM1x1MDQ5Qlx1MDQzMFx1MDQzNzNcdTA1NzBcdTA1NjFcdTA1NzUzXHUwNUQ5XHUwNUU5XHUwNUU4XHUwNUQwXHUwNURDNVx1MDVFN1x1MDVENVx1MDVERDNcdTA2MjdcdTA2MjhcdTA2NDhcdTA2MzhcdTA2MjhcdTA2NEE1XHUwNjMxXHUwNjI3XHUwNjQ1XHUwNjQzXHUwNjQ4NVx1MDY0NFx1MDYyN1x1MDYzMVx1MDYyRlx1MDY0NjRcdTA2MjhcdTA2MkRcdTA2MzFcdTA2NEFcdTA2NDY1XHUwNjJDXHUwNjMyXHUwNjI3XHUwNjI2XHUwNjMxNVx1MDYzM1x1MDYzOVx1MDY0OFx1MDYyRlx1MDY0QVx1MDYyOTZcdTA2MzlcdTA2NDRcdTA2NEFcdTA2MjdcdTA2NDY1XHUwNjQ1XHUwNjNBXHUwNjMxXHUwNjI4NVx1MDY0NVx1MDYyN1x1MDYzMVx1MDYyN1x1MDYyQTVcdTA2Q0NcdTA2MzFcdTA2MjdcdTA2NDY1XHUwNjI4XHUwNjI3XHUwNjMxXHUwNjJBMlx1MDYzMlx1MDYyN1x1MDYzMTRcdTA2NEFcdTA2MkFcdTA2NDMzXHUwNkJFXHUwNjI3XHUwNjMxXHUwNjJBNVx1MDYyQVx1MDY0OFx1MDY0Nlx1MDYzMzRcdTA2MzNcdTA2NDhcdTA2MkZcdTA2MjdcdTA2NDYzXHUwNjMxXHUwNjRBXHUwNjI5NVx1MDYzNFx1MDYyOFx1MDY0M1x1MDYyOTRcdTA2MzlcdTA2MzFcdTA2MjdcdTA2NDIyXHUwNjI4Mlx1MDY0NVx1MDYyN1x1MDY0NjRcdTA2NDFcdTA2NDRcdTA2MzNcdTA2MzdcdTA2NEFcdTA2NDY2XHUwNjQyXHUwNjM3XHUwNjMxM1x1MDY0M1x1MDYyN1x1MDYyQlx1MDY0OFx1MDY0NFx1MDY0QVx1MDY0MzZcdTA2NDhcdTA2NDUzXHUwNjQ1XHUwNjM1XHUwNjMxMlx1MDY0NFx1MDY0QVx1MDYzM1x1MDY0QVx1MDYyNzVcdTA2NDhcdTA2MzFcdTA2NEFcdTA2MkFcdTA2MjdcdTA2NDZcdTA2NEFcdTA2Mjc3XHUwNjQyXHUwNjM5NFx1MDY0N1x1MDY0NVx1MDYzMVx1MDYyN1x1MDY0NzVcdTA2N0VcdTA2MjdcdTA2QTlcdTA2MzNcdTA2MkFcdTA2MjdcdTA2NDY3XHUwNjgwXHUwNjI3XHUwNjMxXHUwNjJBNFx1MDkxNVx1MDk0OVx1MDkyRTNcdTA5MjhcdTA5NDdcdTA5MUYzXHUwOTJEXHUwOTNFXHUwOTMwXHUwOTI0MFx1MDkyRVx1MDk0RDNcdTA5NEJcdTA5MjQ1XHUwOTM4XHUwOTAyXHUwOTE3XHUwOTIwXHUwOTI4NVx1MDlBQ1x1MDlCRVx1MDk4Mlx1MDlCMlx1MDlCRTVcdTA5QURcdTA5QkVcdTA5QjBcdTA5QTQyXHUwOUYwXHUwOUE0NFx1MEEyRFx1MEEzRVx1MEEzMFx1MEEyNDRcdTBBQURcdTBBQkVcdTBBQjBcdTBBQTQ0XHUwQjJEXHUwQjNFXHUwQjMwXHUwQjI0NFx1MEI4N1x1MEJBOFx1MEJDRFx1MEJBNFx1MEJCRlx1MEJBRlx1MEJCRTZcdTBCQjJcdTBCOTlcdTBCQ0RcdTBCOTVcdTBCQzg2XHUwQjlBXHUwQkJGXHUwQjk5XHUwQkNEXHUwQjk1XHUwQkFBXHUwQkNEXHUwQkFBXHUwQkMyXHUwQkIwXHUwQkNEMTFcdTBDMkRcdTBDM0VcdTBDMzBcdTBDMjRcdTBDNEQ1XHUwQ0FEXHUwQ0JFXHUwQ0IwXHUwQ0E0NFx1MEQyRFx1MEQzRVx1MEQzMFx1MEQyNFx1MEQwMjVcdTBEQkRcdTBEODJcdTBEOUFcdTBEQ0Y0XHUwRTA0XHUwRTJEXHUwRTIxM1x1MEU0NFx1MEUxN1x1MEUyMjNcdTBFQTVcdTBFQjJcdTBFQTczXHUxMEQyXHUxMEQ0Mlx1MzA3Rlx1MzA5M1x1MzA2QTNcdTMwQTJcdTMwREVcdTMwQkVcdTMwRjM0XHUzMEFGXHUzMEU5XHUzMEE2XHUzMEM5NFx1MzBCMFx1MzBGQ1x1MzBCMFx1MzBFQjRcdTMwQjNcdTMwRTAyXHUzMEI5XHUzMEM4XHUzMEEyM1x1MzBCQlx1MzBGQ1x1MzBFQjNcdTMwRDVcdTMwQTFcdTMwQzNcdTMwQjdcdTMwRTdcdTMwRjM2XHUzMEREXHUzMEE0XHUzMEYzXHUzMEM4NFx1NEUxNlx1NzU0QzJcdTRFMkRcdTRGRTExXHU1NkZEMVx1NTcwQjFcdTY1ODdcdTdGNTEzXHU0RTlBXHU5QTZDXHU5MDBBM1x1NEYwMVx1NEUxQTJcdTRGNUJcdTVDNzEyXHU0RkUxXHU2MDZGMlx1NTA2NVx1NUVCNzJcdTUxNkJcdTUzNjYyXHU1MTZDXHU1M0Y4MVx1NzZDQTJcdTUzRjBcdTZFN0UxXHU3MDYzMlx1NTU0Nlx1NTdDRTFcdTVFOTcxXHU2ODA3Mlx1NTYwOVx1OTFDQzBcdTU5MjdcdTkxNTJcdTVFOTc1XHU1NzI4XHU3RUJGMlx1NTkyN1x1NjJGRjJcdTU5MjlcdTRFM0JcdTY1NTkzXHU1QTMxXHU0RTUwMlx1NUJCNlx1OTZGQjJcdTVFN0ZcdTRFMUMyXHU1RkFFXHU1MzVBMlx1NjE0OFx1NTU4NDJcdTYyMTFcdTcyMzFcdTRGNjAzXHU2MjRCXHU2NzNBMlx1NjJEQlx1ODA1ODJcdTY1M0ZcdTUyQTExXHU1RTlDMlx1NjVCMFx1NTJBMFx1NTc2MTJcdTk1RkIyXHU2NUY2XHU1QzFBMlx1NjZGOFx1N0M0RDJcdTY3M0FcdTY3ODQyXHU2REUxXHU5QTZDXHU5NTIxM1x1NkUzOFx1NjIwRjJcdTZGQjNcdTk1ODAyXHU3MEI5XHU3NzBCMlx1NzlGQlx1NTJBODJcdTdFQzRcdTdFQzdcdTY3M0FcdTY3ODQ0XHU3RjUxXHU1NzQwMVx1NUU5NzFcdTdBRDkxXHU3RURDMlx1ODA1NFx1OTAxQTJcdThDMzdcdTZCNEMyXHU4RDJEXHU3MjY5Mlx1OTAxQVx1OENBOTJcdTk2QzZcdTU2RTIyXHU5NkZCXHU4QTBBXHU3NkM4XHU3OUQxNFx1OThERVx1NTIyOVx1NkQ2NjNcdTk4REZcdTU0QzEyXHU5OTEwXHU1Mzg1Mlx1OTk5OVx1NjgzQ1x1OTFDQ1x1NjJDOTNcdTZFMkYyXHVCMkY3XHVCMTM3MVx1Q0VGNDJcdUMwQkNcdUMxMzEyXHVENTVDXHVBRDZEMic7XG5cbi8qKlxuICogQHRlbXBsYXRlIEFcbiAqIEB0ZW1wbGF0ZSBCXG4gKiBAcGFyYW0ge0F9IHRhcmdldFxuICogQHBhcmFtIHtCfSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtBICYgQn1cbiAqL1xuY29uc3QgYXNzaWduID0gKHRhcmdldCwgcHJvcGVydGllcykgPT4ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgdGFyZ2V0W2tleV0gPSBwcm9wZXJ0aWVzW2tleV07XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbi8qKlxuICogRmluaXRlIFN0YXRlIE1hY2hpbmUgZ2VuZXJhdGlvbiB1dGlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7eyBbZ3JvdXA6IHN0cmluZ106IFRbXSB9fSBDb2xsZWN0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgW2dyb3VwOiBzdHJpbmddOiB0cnVlIH19IEZsYWdzXG4gKi9cblxuLy8gS2V5cyBpbiBzY2FubmVyIENvbGxlY3Rpb25zIGluc3RhbmNlc1xuY29uc3QgbnVtZXJpYyA9ICdudW1lcmljJztcbmNvbnN0IGFzY2lpID0gJ2FzY2lpJztcbmNvbnN0IGFscGhhID0gJ2FscGhhJztcbmNvbnN0IGFzY2lpbnVtZXJpYyA9ICdhc2NpaW51bWVyaWMnO1xuY29uc3QgYWxwaGFudW1lcmljID0gJ2FscGhhbnVtZXJpYyc7XG5jb25zdCBkb21haW4gPSAnZG9tYWluJztcbmNvbnN0IGVtb2ppID0gJ2Vtb2ppJztcbmNvbnN0IHNjaGVtZSA9ICdzY2hlbWUnO1xuY29uc3Qgc2xhc2hzY2hlbWUgPSAnc2xhc2hzY2hlbWUnO1xuY29uc3Qgd2hpdGVzcGFjZSA9ICd3aGl0ZXNwYWNlJztcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IGdyb3VwcyB0byByZWdpc3RlciBpblxuICogQHJldHVybnMge1RbXX0gQ3VycmVudCBsaXN0IG9mIHRva2VucyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvblxuICovXG5mdW5jdGlvbiByZWdpc3Rlckdyb3VwKG5hbWUsIGdyb3Vwcykge1xuICBpZiAoIShuYW1lIGluIGdyb3VwcykpIHtcbiAgICBncm91cHNbbmFtZV0gPSBbXTtcbiAgfVxuICByZXR1cm4gZ3JvdXBzW25hbWVdO1xufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHQgdG9rZW4gdG8gYWRkXG4gKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBncm91cHNcbiAqIEBwYXJhbSB7RmxhZ3N9IGZsYWdzXG4gKi9cbmZ1bmN0aW9uIGFkZFRvR3JvdXBzKHQsIGZsYWdzLCBncm91cHMpIHtcbiAgaWYgKGZsYWdzW251bWVyaWNdKSB7XG4gICAgZmxhZ3NbYXNjaWludW1lcmljXSA9IHRydWU7XG4gICAgZmxhZ3NbYWxwaGFudW1lcmljXSA9IHRydWU7XG4gIH1cbiAgaWYgKGZsYWdzW2FzY2lpXSkge1xuICAgIGZsYWdzW2FzY2lpbnVtZXJpY10gPSB0cnVlO1xuICAgIGZsYWdzW2FscGhhXSA9IHRydWU7XG4gIH1cbiAgaWYgKGZsYWdzW2FzY2lpbnVtZXJpY10pIHtcbiAgICBmbGFnc1thbHBoYW51bWVyaWNdID0gdHJ1ZTtcbiAgfVxuICBpZiAoZmxhZ3NbYWxwaGFdKSB7XG4gICAgZmxhZ3NbYWxwaGFudW1lcmljXSA9IHRydWU7XG4gIH1cbiAgaWYgKGZsYWdzW2FscGhhbnVtZXJpY10pIHtcbiAgICBmbGFnc1tkb21haW5dID0gdHJ1ZTtcbiAgfVxuICBpZiAoZmxhZ3NbZW1vamldKSB7XG4gICAgZmxhZ3NbZG9tYWluXSA9IHRydWU7XG4gIH1cbiAgZm9yIChjb25zdCBrIGluIGZsYWdzKSB7XG4gICAgY29uc3QgZ3JvdXAgPSByZWdpc3Rlckdyb3VwKGssIGdyb3Vwcyk7XG4gICAgaWYgKGdyb3VwLmluZGV4T2YodCkgPCAwKSB7XG4gICAgICBncm91cC5wdXNoKHQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHQgdG9rZW4gdG8gY2hlY2tcbiAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IGdyb3Vwc1xuICogQHJldHVybnMge0ZsYWdzfSBncm91cCBmbGFncyB0aGF0IGNvbnRhaW4gdGhpcyB0b2tlblxuICovXG5mdW5jdGlvbiBmbGFnc0ZvclRva2VuKHQsIGdyb3Vwcykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBjIGluIGdyb3Vwcykge1xuICAgIGlmIChncm91cHNbY10uaW5kZXhPZih0KSA+PSAwKSB7XG4gICAgICByZXN1bHRbY10gPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7bnVsbCB8IFQgfSBUcmFuc2l0aW9uXG4gKi9cblxuLyoqXG4gKiBEZWZpbmUgYSBiYXNpYyBzdGF0ZSBtYWNoaW5lIHN0YXRlLiBqIGlzIHRoZSBsaXN0IG9mIGNoYXJhY3RlciB0cmFuc2l0aW9ucyxcbiAqIGpyIGlzIHRoZSBsaXN0IG9mIHJlZ2V4LW1hdGNoIHRyYW5zaXRpb25zLCBqZCBpcyB0aGUgZGVmYXVsdCBzdGF0ZSB0b1xuICogdHJhbnNpdGlvbiB0byB0IGlzIHRoZSBhY2NlcHRpbmcgdG9rZW4gdHlwZSwgaWYgYW55LiBJZiB0aGlzIGlzIHRoZSB0ZXJtaW5hbFxuICogc3RhdGUsIHRoZW4gaXQgZG9lcyBub3QgZW1pdCBhIHRva2VuLlxuICpcbiAqIFRoZSB0ZW1wbGF0ZSB0eXBlIFQgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gdGhpcyBzdGF0ZSBhY2NlcHRzLiBUaGlzXG4gKiBzaG91bGQgYmUgYSBzdHJpbmcgKHN1Y2ggYXMgb2YgdGhlIHRva2VuIGV4cG9ydHMgaW4gYHRleHQuanNgKSBvciBhXG4gKiBNdWx0aVRva2VuIHN1YmNsYXNzIChmcm9tIGBtdWx0aS5qc2ApXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gW3Rva2VuXSBUb2tlbiB0aGF0IHRoaXMgc3RhdGUgZW1pdHNcbiAqL1xuZnVuY3Rpb24gU3RhdGUodG9rZW4pIHtcbiAgaWYgKHRva2VuID09PSB2b2lkIDApIHtcbiAgICB0b2tlbiA9IG51bGw7XG4gIH1cbiAgLy8gdGhpcy5uID0gbnVsbDsgLy8gREVCVUc6IFN0YXRlIG5hbWVcbiAgLyoqIEB0eXBlIHt7IFtpbnB1dDogc3RyaW5nXTogU3RhdGU8VD4gfX0gaiAqL1xuICB0aGlzLmogPSB7fTsgLy8gSU1QTEVNRU5UQVRJT04gMVxuICAvLyB0aGlzLmogPSBbXTsgLy8gSU1QTEVNRU5UQVRJT04gMlxuICAvKiogQHR5cGUge1tSZWdFeHAsIFN0YXRlPFQ+XVtdfSBqciAqL1xuICB0aGlzLmpyID0gW107XG4gIC8qKiBAdHlwZSB7P1N0YXRlPFQ+fSBqZCAqL1xuICB0aGlzLmpkID0gbnVsbDtcbiAgLyoqIEB0eXBlIHs/VH0gdCAqL1xuICB0aGlzLnQgPSB0b2tlbjtcbn1cblxuLyoqXG4gKiBTY2FubmVyIHRva2VuIGdyb3Vwc1xuICogQHR5cGUgQ29sbGVjdGlvbnM8c3RyaW5nPlxuICovXG5TdGF0ZS5ncm91cHMgPSB7fTtcblN0YXRlLnByb3RvdHlwZSA9IHtcbiAgYWNjZXB0cygpIHtcbiAgICByZXR1cm4gISF0aGlzLnQ7XG4gIH0sXG4gIC8qKlxuICAgKiBGb2xsb3cgYW4gZXhpc3RpbmcgdHJhbnNpdGlvbiBmcm9tIHRoZSBnaXZlbiBpbnB1dCB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICogRG9lcyBub3QgbXV0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgY2hhcmFjdGVyIG9yIHRva2VuIHR5cGUgdG8gdHJhbnNpdGlvbiBvblxuICAgKiBAcmV0dXJucyB7P1N0YXRlPFQ+fSB0aGUgbmV4dCBzdGF0ZSwgaWYgYW55XG4gICAqL1xuICBnbyhpbnB1dCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcztcbiAgICBjb25zdCBuZXh0U3RhdGUgPSBzdGF0ZS5qW2lucHV0XTtcbiAgICBpZiAobmV4dFN0YXRlKSB7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLmpyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZWdleCA9IHN0YXRlLmpyW2ldWzBdO1xuICAgICAgY29uc3QgbmV4dFN0YXRlID0gc3RhdGUuanJbaV1bMV07IC8vIG5vdGU6IG1pZ2h0IGJlIGVtcHR5IHRvIHByZXZlbnQgZGVmYXVsdCBqdW1wXG4gICAgICBpZiAobmV4dFN0YXRlICYmIHJlZ2V4LnRlc3QoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vd2hlcmUgbGVmdCB0byBqdW1wISBSZXR1cm4gZGVmYXVsdCwgaWYgYW55XG4gICAgcmV0dXJuIHN0YXRlLmpkO1xuICB9LFxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RhdGUgaGFzIGEgdHJhbnNpdGlvbiBmb3IgdGhlIGdpdmVuIGlucHV0LiBTZXQgdGhlIHNlY29uZFxuICAgKiBhcmd1bWVudCB0byB0cnVlIHRvIG9ubHkgbG9vayBmb3IgYW4gZXhhY3QgbWF0Y2ggKGFuZCBub3QgYSBkZWZhdWx0IG9yXG4gICAqIHJlZ3VsYXItZXhwcmVzc2lvbi1iYXNlZCB0cmFuc2l0aW9uKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAgICogQHBhcmFtIHtib29sZWFufSBleGFjdE9ubHlcbiAgICovXG4gIGhhcyhpbnB1dCwgZXhhY3RPbmx5KSB7XG4gICAgaWYgKGV4YWN0T25seSA9PT0gdm9pZCAwKSB7XG4gICAgICBleGFjdE9ubHkgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGV4YWN0T25seSA/IGlucHV0IGluIHRoaXMuaiA6ICEhdGhpcy5nbyhpbnB1dCk7XG4gIH0sXG4gIC8qKlxuICAgKiBTaG9ydCBmb3IgXCJ0cmFuc2l0aW9uIGFsbFwiOyBjcmVhdGUgYSB0cmFuc2l0aW9uIGZyb20gdGhlIGFycmF5IG9mIGl0ZW1zXG4gICAqIGluIHRoZSBnaXZlbiBsaXN0IHRvIHRoZSBzYW1lIGZpbmFsIHJlc3VsdGluZyBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gaW5wdXRzIEdyb3VwIG9mIGlucHV0cyB0byB0cmFuc2l0aW9uIG9uXG4gICAqIEBwYXJhbSB7VHJhbnNpdGlvbjxUPiB8IFN0YXRlPFQ+fSBbbmV4dF0gVHJhbnNpdGlvbiBvcHRpb25zXG4gICAqIEBwYXJhbSB7RmxhZ3N9IFtmbGFnc10gQ29sbGVjdGlvbnMgZmxhZ3MgdG8gYWRkIHRva2VuIHRvXG4gICAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IFtncm91cHNdIE1hc3RlciBsaXN0IG9mIHRva2VuIGdyb3Vwc1xuICAgKi9cbiAgdGEoaW5wdXRzLCBuZXh0LCBmbGFncywgZ3JvdXBzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudHQoaW5wdXRzW2ldLCBuZXh0LCBmbGFncywgZ3JvdXBzKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBTaG9ydCBmb3IgXCJ0YWtlIHJlZ2V4cCB0cmFuc2l0aW9uXCI7IGRlZmluZXMgYSB0cmFuc2l0aW9uIGZvciB0aGlzIHN0YXRlXG4gICAqIHdoZW4gaXQgZW5jb3VudGVycyBhIHRva2VuIHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwIFJlZ3VsYXIgZXhwcmVzc2lvbiB0cmFuc2l0aW9uIChwb3B1bGF0ZSBmaXJzdClcbiAgICogQHBhcmFtIHtUIHwgU3RhdGU8VD59IFtuZXh0XSBUcmFuc2l0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXSBDb2xsZWN0aW9ucyBmbGFncyB0byBhZGQgdG9rZW4gdG9cbiAgICogQHBhcmFtIHtDb2xsZWN0aW9uczxUPn0gW2dyb3Vwc10gTWFzdGVyIGxpc3Qgb2YgdG9rZW4gZ3JvdXBzXG4gICAqIEByZXR1cm5zIHtTdGF0ZTxUPn0gdGFrZW4gYWZ0ZXIgdGhlIGdpdmVuIGlucHV0XG4gICAqL1xuICB0cihyZWdleHAsIG5leHQsIGZsYWdzLCBncm91cHMpIHtcbiAgICBncm91cHMgPSBncm91cHMgfHwgU3RhdGUuZ3JvdXBzO1xuICAgIGxldCBuZXh0U3RhdGU7XG4gICAgaWYgKG5leHQgJiYgbmV4dC5qKSB7XG4gICAgICBuZXh0U3RhdGUgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUb2tlbiB3aXRoIG1heWJlIHRva2VuIGdyb3Vwc1xuICAgICAgbmV4dFN0YXRlID0gbmV3IFN0YXRlKG5leHQpO1xuICAgICAgaWYgKGZsYWdzICYmIGdyb3Vwcykge1xuICAgICAgICBhZGRUb0dyb3VwcyhuZXh0LCBmbGFncywgZ3JvdXBzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5qci5wdXNoKFtyZWdleHAsIG5leHRTdGF0ZV0pO1xuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH0sXG4gIC8qKlxuICAgKiBTaG9ydCBmb3IgXCJ0YWtlIHRyYW5zaXRpb25zXCIsIHdpbGwgdGFrZSBhcyBtYW55IHNlcXVlbnRpYWwgdHJhbnNpdGlvbnMgYXNcbiAgICogdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gaW5wdXQgYW5kIHJldHVybnMgdGhlXG4gICAqIHJlc3VsdGluZyBmaW5hbCBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gaW5wdXRcbiAgICogQHBhcmFtIHtUIHwgU3RhdGU8VD59IFtuZXh0XSBUcmFuc2l0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXSBDb2xsZWN0aW9ucyBmbGFncyB0byBhZGQgdG9rZW4gdG9cbiAgICogQHBhcmFtIHtDb2xsZWN0aW9uczxUPn0gW2dyb3Vwc10gTWFzdGVyIGxpc3Qgb2YgdG9rZW4gZ3JvdXBzXG4gICAqIEByZXR1cm5zIHtTdGF0ZTxUPn0gdGFrZW4gYWZ0ZXIgdGhlIGdpdmVuIGlucHV0XG4gICAqL1xuICB0cyhpbnB1dCwgbmV4dCwgZmxhZ3MsIGdyb3Vwcykge1xuICAgIGxldCBzdGF0ZSA9IHRoaXM7XG4gICAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICAgIGlmICghbGVuKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7XG4gICAgICBzdGF0ZSA9IHN0YXRlLnR0KGlucHV0W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLnR0KGlucHV0W2xlbiAtIDFdLCBuZXh0LCBmbGFncywgZ3JvdXBzKTtcbiAgfSxcbiAgLyoqXG4gICAqIFNob3J0IGZvciBcInRha2UgdHJhbnNpdGlvblwiLCB0aGlzIGlzIGEgbWV0aG9kIGZvciBidWlsZGluZy93b3JraW5nIHdpdGhcbiAgICogc3RhdGUgbWFjaGluZXMuXG4gICAqXG4gICAqIElmIGEgc3RhdGUgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBpbnB1dCwgcmV0dXJucyBpdC5cbiAgICpcbiAgICogSWYgYSB0b2tlbiBpcyBzcGVjaWZpZWQsIHRoYXQgc3RhdGUgd2lsbCBlbWl0IHRoYXQgdG9rZW4gd2hlbiByZWFjaGVkIGJ5XG4gICAqIHRoZSBsaW5raWZ5IGVuZ2luZS5cbiAgICpcbiAgICogSWYgbm8gc3RhdGUgZXhpc3RzLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggc29tZSBkZWZhdWx0IHRyYW5zaXRpb25zXG4gICAqIHRoYXQgcmVzZW1ibGUgZXhpc3RpbmcgZGVmYXVsdCB0cmFuc2l0aW9ucy5cbiAgICpcbiAgICogSWYgYSBzdGF0ZSBpcyBnaXZlbiBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCwgdGhhdCBzdGF0ZSB3aWxsIGJlXG4gICAqIHRyYW5zaXRpb25lZCB0byBvbiB0aGUgZ2l2ZW4gaW5wdXQgcmVnYXJkbGVzcyBvZiB3aGF0IHRoYXQgaW5wdXRcbiAgICogcHJldmlvdXNseSBkaWQuXG4gICAqXG4gICAqIFNwZWNpZnkgYSB0b2tlbiBncm91cCBmbGFncyB0byBkZWZpbmUgZ3JvdXBzIHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvLlxuICAgKiBUaGUgdG9rZW4gd2lsbCBiZSBhZGRlZCB0byBjb3JyZXNwb25kaW5nIGVudGlyZXMgaW4gdGhlIGdpdmVuIGdyb3Vwc1xuICAgKiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBjaGFyYWN0ZXIsIHRva2VuIHR5cGUgdG8gdHJhbnNpdGlvbiBvblxuICAgKiBAcGFyYW0ge1QgfCBTdGF0ZTxUPn0gW25leHRdIFRyYW5zaXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0ZsYWdzfSBbZmxhZ3NdIENvbGxlY3Rpb25zIGZsYWdzIHRvIGFkZCB0b2tlbiB0b1xuICAgKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBbZ3JvdXBzXSBNYXN0ZXIgbGlzdCBvZiBncm91cHNcbiAgICogQHJldHVybnMge1N0YXRlPFQ+fSB0YWtlbiBhZnRlciB0aGUgZ2l2ZW4gaW5wdXRcbiAgICovXG4gIHR0KGlucHV0LCBuZXh0LCBmbGFncywgZ3JvdXBzKSB7XG4gICAgZ3JvdXBzID0gZ3JvdXBzIHx8IFN0YXRlLmdyb3VwcztcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXM7XG5cbiAgICAvLyBDaGVjayBpZiBleGlzdGluZyBzdGF0ZSBnaXZlbiwganVzdCBhIGJhc2ljIHRyYW5zaXRpb25cbiAgICBpZiAobmV4dCAmJiBuZXh0LmopIHtcbiAgICAgIHN0YXRlLmpbaW5wdXRdID0gbmV4dDtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cbiAgICBjb25zdCB0ID0gbmV4dDtcblxuICAgIC8vIFRha2UgdGhlIHRyYW5zaXRpb24gd2l0aCB0aGUgdXN1YWwgZGVmYXVsdCBtZWNoYW5pc21zIGFuZCB1c2UgdGhhdCBhc1xuICAgIC8vIGEgdGVtcGxhdGUgZm9yIGNyZWF0aW5nIHRoZSBuZXh0IHN0YXRlXG4gICAgbGV0IG5leHRTdGF0ZSxcbiAgICAgIHRlbXBsYXRlU3RhdGUgPSBzdGF0ZS5nbyhpbnB1dCk7XG4gICAgaWYgKHRlbXBsYXRlU3RhdGUpIHtcbiAgICAgIG5leHRTdGF0ZSA9IG5ldyBTdGF0ZSgpO1xuICAgICAgYXNzaWduKG5leHRTdGF0ZS5qLCB0ZW1wbGF0ZVN0YXRlLmopO1xuICAgICAgbmV4dFN0YXRlLmpyLnB1c2guYXBwbHkobmV4dFN0YXRlLmpyLCB0ZW1wbGF0ZVN0YXRlLmpyKTtcbiAgICAgIG5leHRTdGF0ZS5qZCA9IHRlbXBsYXRlU3RhdGUuamQ7XG4gICAgICBuZXh0U3RhdGUudCA9IHRlbXBsYXRlU3RhdGUudDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFN0YXRlID0gbmV3IFN0YXRlKCk7XG4gICAgfVxuICAgIGlmICh0KSB7XG4gICAgICAvLyBFbnN1cmUgbmV3bHkgdG9rZW4gaXMgaW4gdGhlIHNhbWUgZ3JvdXBzIGFzIHRoZSBvbGQgdG9rZW5cbiAgICAgIGlmIChncm91cHMpIHtcbiAgICAgICAgaWYgKG5leHRTdGF0ZS50ICYmIHR5cGVvZiBuZXh0U3RhdGUudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBhbGxGbGFncyA9IGFzc2lnbihmbGFnc0ZvclRva2VuKG5leHRTdGF0ZS50LCBncm91cHMpLCBmbGFncyk7XG4gICAgICAgICAgYWRkVG9Hcm91cHModCwgYWxsRmxhZ3MsIGdyb3Vwcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MpIHtcbiAgICAgICAgICBhZGRUb0dyb3Vwcyh0LCBmbGFncywgZ3JvdXBzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dFN0YXRlLnQgPSB0OyAvLyBvdmVyd3JpdGUgYW55dGhpbmcgdGhhdCB3YXMgcHJldmlvdXNseSB0aGVyZVxuICAgIH1cblxuICAgIHN0YXRlLmpbaW5wdXRdID0gbmV4dFN0YXRlO1xuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH1cbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgdG8gaW1wcm92ZSBtaW5pZmljYXRpb24gKG5vdCBleHBvcnRlZCBvdXRzaWRlIGxpbmtpZnlqcyBtb2R1bGUpXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3RhdGU8VD59IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBpbnB1dFxuICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXVxuICogQHBhcmFtIHtDb2xsZWN0aW9uczxUPn0gW2dyb3Vwc11cbiAqL1xuY29uc3QgdGEgPSAoc3RhdGUsIGlucHV0LCBuZXh0LCBmbGFncywgZ3JvdXBzKSA9PiBzdGF0ZS50YShpbnB1dCwgbmV4dCwgZmxhZ3MsIGdyb3Vwcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3RhdGU8VD59IHN0YXRlXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gKiBAcGFyYW0ge1QgfCBTdGF0ZTxUPn0gW25leHRdXG4gKiBAcGFyYW0ge0ZsYWdzfSBbZmxhZ3NdXG4gKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBbZ3JvdXBzXVxuICovXG5jb25zdCB0ciA9IChzdGF0ZSwgcmVnZXhwLCBuZXh0LCBmbGFncywgZ3JvdXBzKSA9PiBzdGF0ZS50cihyZWdleHAsIG5leHQsIGZsYWdzLCBncm91cHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N0YXRlPFQ+fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gaW5wdXRcbiAqIEBwYXJhbSB7VCB8IFN0YXRlPFQ+fSBbbmV4dF1cbiAqIEBwYXJhbSB7RmxhZ3N9IFtmbGFnc11cbiAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IFtncm91cHNdXG4gKi9cbmNvbnN0IHRzID0gKHN0YXRlLCBpbnB1dCwgbmV4dCwgZmxhZ3MsIGdyb3VwcykgPT4gc3RhdGUudHMoaW5wdXQsIG5leHQsIGZsYWdzLCBncm91cHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N0YXRlPFQ+fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge1QgfCBTdGF0ZTxUPn0gW25leHRdXG4gKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBbZ3JvdXBzXVxuICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXVxuICovXG5jb25zdCB0dCA9IChzdGF0ZSwgaW5wdXQsIG5leHQsIGZsYWdzLCBncm91cHMpID0+IHN0YXRlLnR0KGlucHV0LCBuZXh0LCBmbGFncywgZ3JvdXBzKTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuVGV4dCBUb2tlbnNcbklkZW50aWZpZXJzIGZvciB0b2tlbiBvdXRwdXRzIGZyb20gdGhlIHJlZ2V4cCBzY2FubmVyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIEEgdmFsaWQgd2ViIGRvbWFpbiB0b2tlblxuY29uc3QgV09SRCA9ICdXT1JEJzsgLy8gb25seSBjb250YWlucyBhLXpcbmNvbnN0IFVXT1JEID0gJ1VXT1JEJzsgLy8gY29udGFpbnMgbGV0dGVycyBvdGhlciB0aGFuIGEteiwgdXNlZCBmb3IgSUROXG5cbi8vIFNwZWNpYWwgY2FzZSBvZiB3b3JkXG5jb25zdCBMT0NBTEhPU1QgPSAnTE9DQUxIT1NUJztcblxuLy8gVmFsaWQgdG9wLWxldmVsIGRvbWFpbiwgc3BlY2lhbCBjYXNlIG9mIFdPUkQgKHNlZSB0bGRzLmpzKVxuY29uc3QgVExEID0gJ1RMRCc7XG5cbi8vIFZhbGlkIElETiBUTEQsIHNwZWNpYWwgY2FzZSBvZiBVV09SRCAoc2VlIHRsZHMuanMpXG5jb25zdCBVVExEID0gJ1VUTEQnO1xuXG4vLyBUaGUgc2NoZW1lIHBvcnRpb24gb2YgYSB3ZWIgVVJJIHByb3RvY29sLiBTdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZTogYG1haWx0b2AsXG4vLyBgZmlsZWAsIGFuZCB1c2VyLWRlZmluZWQgY3VzdG9tIHByb3RvY29scy4gTGltaXRlZCB0byBzY2hlbWVzIHRoYXQgY29udGFpblxuLy8gb25seSBsZXR0ZXJzXG5jb25zdCBTQ0hFTUUgPSAnU0NIRU1FJztcblxuLy8gU2ltaWxhciB0byBTQ0hFTUUsIGV4Y2VwdCBtYWtlcyBkaXN0aW5jdGlvbiBmb3Igc2NoZW1lcyB0aGF0IG11c3QgYWx3YXlzIGJlXG4vLyBmb2xsb3dlZCBieSBgOi8vYCwgbm90IGp1c3QgYDpgLiBTdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZSBgaHR0cGAsIGBodHRwc2AsXG4vLyBgZnRwYCwgYGZ0cHNgXG5jb25zdCBTTEFTSF9TQ0hFTUUgPSAnU0xBU0hfU0NIRU1FJztcblxuLy8gQW55IHNlcXVlbmNlIG9mIGRpZ2l0cyAwLTlcbmNvbnN0IE5VTSA9ICdOVU0nO1xuXG4vLyBBbnkgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgbmV3bGluZVxuY29uc3QgV1MgPSAnV1MnO1xuXG4vLyBOZXcgbGluZSAodW5peCBzdHlsZSlcbmNvbnN0IE5MJDEgPSAnTkwnOyAvLyBcXG5cblxuLy8gT3BlbmluZy9jbG9zaW5nIGJyYWNrZXQgY2xhc3Nlc1xuLy8gVE9ETzogUmVuYW1lIE9QRU4gLT4gTEVGVCBhbmQgQ0xPU0UgLT4gUklHSFQgaW4gdjUgdG8gZml0IHdpdGggVW5pY29kZSBuYW1lc1xuLy8gQWxzbyByZW5hbWUgYW5nbGUgYnJhY2tlcyB0byBMRVNTVEhBTiBhbmQgR1JFQVRFUiBUSEFOXG5jb25zdCBPUEVOQlJBQ0UgPSAnT1BFTkJSQUNFJzsgLy8ge1xuY29uc3QgQ0xPU0VCUkFDRSA9ICdDTE9TRUJSQUNFJzsgLy8gfVxuY29uc3QgT1BFTkJSQUNLRVQgPSAnT1BFTkJSQUNLRVQnOyAvLyBbXG5jb25zdCBDTE9TRUJSQUNLRVQgPSAnQ0xPU0VCUkFDS0VUJzsgLy8gXVxuY29uc3QgT1BFTlBBUkVOID0gJ09QRU5QQVJFTic7IC8vIChcbmNvbnN0IENMT1NFUEFSRU4gPSAnQ0xPU0VQQVJFTic7IC8vIClcbmNvbnN0IE9QRU5BTkdMRUJSQUNLRVQgPSAnT1BFTkFOR0xFQlJBQ0tFVCc7IC8vIDxcbmNvbnN0IENMT1NFQU5HTEVCUkFDS0VUID0gJ0NMT1NFQU5HTEVCUkFDS0VUJzsgLy8gPlxuY29uc3QgRlVMTFdJRFRITEVGVFBBUkVOID0gJ0ZVTExXSURUSExFRlRQQVJFTic7IC8vIFx1RkYwOFxuY29uc3QgRlVMTFdJRFRIUklHSFRQQVJFTiA9ICdGVUxMV0lEVEhSSUdIVFBBUkVOJzsgLy8gXHVGRjA5XG5jb25zdCBMRUZUQ09STkVSQlJBQ0tFVCA9ICdMRUZUQ09STkVSQlJBQ0tFVCc7IC8vIFx1MzAwQ1xuY29uc3QgUklHSFRDT1JORVJCUkFDS0VUID0gJ1JJR0hUQ09STkVSQlJBQ0tFVCc7IC8vIFx1MzAwRFxuY29uc3QgTEVGVFdISVRFQ09STkVSQlJBQ0tFVCA9ICdMRUZUV0hJVEVDT1JORVJCUkFDS0VUJzsgLy8gXHUzMDBFXG5jb25zdCBSSUdIVFdISVRFQ09STkVSQlJBQ0tFVCA9ICdSSUdIVFdISVRFQ09STkVSQlJBQ0tFVCc7IC8vIFx1MzAwRlxuY29uc3QgRlVMTFdJRFRITEVTU1RIQU4gPSAnRlVMTFdJRFRITEVTU1RIQU4nOyAvLyBcdUZGMUNcbmNvbnN0IEZVTExXSURUSEdSRUFURVJUSEFOID0gJ0ZVTExXSURUSEdSRUFURVJUSEFOJzsgLy8gXHVGRjFFXG5cbi8vIFZhcmlvdXMgc3ltYm9sc1xuY29uc3QgQU1QRVJTQU5EID0gJ0FNUEVSU0FORCc7IC8vICZcbmNvbnN0IEFQT1NUUk9QSEUgPSAnQVBPU1RST1BIRSc7IC8vICdcbmNvbnN0IEFTVEVSSVNLID0gJ0FTVEVSSVNLJzsgLy8gKlxuY29uc3QgQVQgPSAnQVQnOyAvLyBAXG5jb25zdCBCQUNLU0xBU0ggPSAnQkFDS1NMQVNIJzsgLy8gXFxcbmNvbnN0IEJBQ0tUSUNLID0gJ0JBQ0tUSUNLJzsgLy8gYFxuY29uc3QgQ0FSRVQgPSAnQ0FSRVQnOyAvLyBeXG5jb25zdCBDT0xPTiA9ICdDT0xPTic7IC8vIDpcbmNvbnN0IENPTU1BID0gJ0NPTU1BJzsgLy8gLFxuY29uc3QgRE9MTEFSID0gJ0RPTExBUic7IC8vICRcbmNvbnN0IERPVCA9ICdET1QnOyAvLyAuXG5jb25zdCBFUVVBTFMgPSAnRVFVQUxTJzsgLy8gPVxuY29uc3QgRVhDTEFNQVRJT04gPSAnRVhDTEFNQVRJT04nOyAvLyAhXG5jb25zdCBIWVBIRU4gPSAnSFlQSEVOJzsgLy8gLVxuY29uc3QgUEVSQ0VOVCA9ICdQRVJDRU5UJzsgLy8gJVxuY29uc3QgUElQRSA9ICdQSVBFJzsgLy8gfFxuY29uc3QgUExVUyA9ICdQTFVTJzsgLy8gK1xuY29uc3QgUE9VTkQgPSAnUE9VTkQnOyAvLyAjXG5jb25zdCBRVUVSWSA9ICdRVUVSWSc7IC8vID9cbmNvbnN0IFFVT1RFID0gJ1FVT1RFJzsgLy8gXCJcblxuY29uc3QgU0VNSSA9ICdTRU1JJzsgLy8gO1xuY29uc3QgU0xBU0ggPSAnU0xBU0gnOyAvLyAvXG5jb25zdCBUSUxERSA9ICdUSUxERSc7IC8vIH5cbmNvbnN0IFVOREVSU0NPUkUgPSAnVU5ERVJTQ09SRSc7IC8vIF9cblxuLy8gRW1vamkgc3ltYm9sXG5jb25zdCBFTU9KSSQxID0gJ0VNT0pJJztcblxuLy8gRGVmYXVsdCB0b2tlbiAtIGFueXRoaW5nIHRoYXQgaXMgbm90IG9uZSBvZiB0aGUgYWJvdmVcbmNvbnN0IFNZTSA9ICdTWU0nO1xuXG52YXIgdGsgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0V09SRDogV09SRCxcblx0VVdPUkQ6IFVXT1JELFxuXHRMT0NBTEhPU1Q6IExPQ0FMSE9TVCxcblx0VExEOiBUTEQsXG5cdFVUTEQ6IFVUTEQsXG5cdFNDSEVNRTogU0NIRU1FLFxuXHRTTEFTSF9TQ0hFTUU6IFNMQVNIX1NDSEVNRSxcblx0TlVNOiBOVU0sXG5cdFdTOiBXUyxcblx0Tkw6IE5MJDEsXG5cdE9QRU5CUkFDRTogT1BFTkJSQUNFLFxuXHRDTE9TRUJSQUNFOiBDTE9TRUJSQUNFLFxuXHRPUEVOQlJBQ0tFVDogT1BFTkJSQUNLRVQsXG5cdENMT1NFQlJBQ0tFVDogQ0xPU0VCUkFDS0VULFxuXHRPUEVOUEFSRU46IE9QRU5QQVJFTixcblx0Q0xPU0VQQVJFTjogQ0xPU0VQQVJFTixcblx0T1BFTkFOR0xFQlJBQ0tFVDogT1BFTkFOR0xFQlJBQ0tFVCxcblx0Q0xPU0VBTkdMRUJSQUNLRVQ6IENMT1NFQU5HTEVCUkFDS0VULFxuXHRGVUxMV0lEVEhMRUZUUEFSRU46IEZVTExXSURUSExFRlRQQVJFTixcblx0RlVMTFdJRFRIUklHSFRQQVJFTjogRlVMTFdJRFRIUklHSFRQQVJFTixcblx0TEVGVENPUk5FUkJSQUNLRVQ6IExFRlRDT1JORVJCUkFDS0VULFxuXHRSSUdIVENPUk5FUkJSQUNLRVQ6IFJJR0hUQ09STkVSQlJBQ0tFVCxcblx0TEVGVFdISVRFQ09STkVSQlJBQ0tFVDogTEVGVFdISVRFQ09STkVSQlJBQ0tFVCxcblx0UklHSFRXSElURUNPUk5FUkJSQUNLRVQ6IFJJR0hUV0hJVEVDT1JORVJCUkFDS0VULFxuXHRGVUxMV0lEVEhMRVNTVEhBTjogRlVMTFdJRFRITEVTU1RIQU4sXG5cdEZVTExXSURUSEdSRUFURVJUSEFOOiBGVUxMV0lEVEhHUkVBVEVSVEhBTixcblx0QU1QRVJTQU5EOiBBTVBFUlNBTkQsXG5cdEFQT1NUUk9QSEU6IEFQT1NUUk9QSEUsXG5cdEFTVEVSSVNLOiBBU1RFUklTSyxcblx0QVQ6IEFULFxuXHRCQUNLU0xBU0g6IEJBQ0tTTEFTSCxcblx0QkFDS1RJQ0s6IEJBQ0tUSUNLLFxuXHRDQVJFVDogQ0FSRVQsXG5cdENPTE9OOiBDT0xPTixcblx0Q09NTUE6IENPTU1BLFxuXHRET0xMQVI6IERPTExBUixcblx0RE9UOiBET1QsXG5cdEVRVUFMUzogRVFVQUxTLFxuXHRFWENMQU1BVElPTjogRVhDTEFNQVRJT04sXG5cdEhZUEhFTjogSFlQSEVOLFxuXHRQRVJDRU5UOiBQRVJDRU5ULFxuXHRQSVBFOiBQSVBFLFxuXHRQTFVTOiBQTFVTLFxuXHRQT1VORDogUE9VTkQsXG5cdFFVRVJZOiBRVUVSWSxcblx0UVVPVEU6IFFVT1RFLFxuXHRTRU1JOiBTRU1JLFxuXHRTTEFTSDogU0xBU0gsXG5cdFRJTERFOiBUSUxERSxcblx0VU5ERVJTQ09SRTogVU5ERVJTQ09SRSxcblx0RU1PSkk6IEVNT0pJJDEsXG5cdFNZTTogU1lNXG59KTtcblxuLy8gTm90ZSB0aGF0IHRoZXNlIHR3byBVbmljb2RlIG9uZXMgZXhwYW5kIGludG8gYSByZWFsbHkgYmlnIG9uZSB3aXRoIEJhYmVsXG5jb25zdCBBU0NJSV9MRVRURVIgPSAvW2Etel0vO1xuY29uc3QgTEVUVEVSID0gL1xccHtMfS91OyAvLyBBbnkgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCBsZXR0ZXIgZGF0YSB0eXBlXG5jb25zdCBFTU9KSSA9IC9cXHB7RW1vaml9L3U7IC8vIEFueSBVbmljb2RlIGVtb2ppIGNoYXJhY3RlclxuY29uc3QgRU1PSklfVkFSSUFUSU9OJDEgPSAvXFx1ZmUwZi87XG5jb25zdCBESUdJVCA9IC9cXGQvO1xuY29uc3QgU1BBQ0UgPSAvXFxzLztcblxudmFyIHJlZ2V4cCA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRBU0NJSV9MRVRURVI6IEFTQ0lJX0xFVFRFUixcblx0TEVUVEVSOiBMRVRURVIsXG5cdEVNT0pJOiBFTU9KSSxcblx0RU1PSklfVkFSSUFUSU9OOiBFTU9KSV9WQVJJQVRJT04kMSxcblx0RElHSVQ6IERJR0lULFxuXHRTUEFDRTogU1BBQ0Vcbn0pO1xuXG4vKipcblx0VGhlIHNjYW5uZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRoYXQgdGFrZXMgYSBzdHJpbmcgb2YgdGV4dCBhcyBpbnB1dCwgYW5kXG5cdG91dHB1dHMgYW4gYXJyYXkgb2YgdG9rZW5zIGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBlYXN5IFVSTCBwYXJzaW5nLlxuKi9cbmNvbnN0IE5MID0gJ1xcbic7IC8vIE5ldyBsaW5lIGNoYXJhY3RlclxuY29uc3QgRU1PSklfVkFSSUFUSU9OID0gJ1xcdWZlMGYnOyAvLyBWYXJpYXRpb24gc2VsZWN0b3IsIGZvbGxvd3MgaGVhcnQgYW5kIG90aGVyc1xuY29uc3QgRU1PSklfSk9JTkVSID0gJ1xcdTIwMGQnOyAvLyB6ZXJvLXdpZHRoIGpvaW5lclxuXG5sZXQgdGxkcyA9IG51bGwsXG4gIHV0bGRzID0gbnVsbDsgLy8gZG9uJ3QgY2hhbmdlIHNvIG9ubHkgaGF2ZSB0byBiZSBjb21wdXRlZCBvbmNlXG5cbi8qKlxuICogU2Nhbm5lciBvdXRwdXQgdG9rZW46XG4gKiAtIGB0YCBpcyB0aGUgdG9rZW4gbmFtZSAoZS5nLiwgJ05VTScsICdFTU9KSScsICdUTEQnKVxuICogLSBgdmAgaXMgdGhlIHZhbHVlIG9mIHRoZSB0b2tlbiAoZS5nLiwgJzEyMycsICdcdTI3NjRcdUZFMEYnLCAnY29tJylcbiAqIC0gYHNgIGlzIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdG9rZW4gaW4gdGhlIG9yaWdpbmFsIHN0cmluZ1xuICogLSBgZWAgaXMgdGhlIGVuZCBpbmRleCBvZiB0aGUgdG9rZW4gaW4gdGhlIG9yaWdpbmFsIHN0cmluZ1xuICogQHR5cGVkZWYge3t0OiBzdHJpbmcsIHY6IHN0cmluZywgczogbnVtYmVyLCBlOiBudW1iZXJ9fSBUb2tlblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IFtjb2xsZWN0aW9uOiBzdHJpbmddOiBUW10gfX0gQ29sbGVjdGlvbnNcbiAqL1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHNjYW5uZXIgY2hhcmFjdGVyLWJhc2VkIHN0YXRlIG1hY2hpbmUgZm9yIHRoZSBnaXZlbiBzdGFydFxuICogc3RhdGVcbiAqIEBwYXJhbSB7W3N0cmluZywgYm9vbGVhbl1bXX0gY3VzdG9tU2NoZW1lcyBMaXN0IG9mIGN1c3RvbSBzY2hlbWVzLCB3aGVyZSBlYWNoXG4gKiBpdGVtIGlzIGEgbGVuZ3RoLTIgdHVwbGUgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBzZXQgdG8gdGhlIHN0cmluZyBzY2hlbWUsIGFuZFxuICogdGhlIHNlY29uZCBlbGVtZW50IHNldCB0byBgdHJ1ZWAgaWYgdGhlIGA6Ly9gIGFmdGVyIHRoZSBzY2hlbWUgaXMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gaW5pdCQyKGN1c3RvbVNjaGVtZXMpIHtcbiAgaWYgKGN1c3RvbVNjaGVtZXMgPT09IHZvaWQgMCkge1xuICAgIGN1c3RvbVNjaGVtZXMgPSBbXTtcbiAgfVxuICAvLyBGcmVxdWVudGx5IHVzZWQgc3RhdGVzIChuYW1lIGFyZ3VtZW50IHJlbW92ZWQgZHVyaW5nIG1pbmlmaWNhdGlvbilcbiAgLyoqIEB0eXBlIENvbGxlY3Rpb25zPHN0cmluZz4gKi9cbiAgY29uc3QgZ3JvdXBzID0ge307IC8vIG9mIHRva2Vuc1xuICBTdGF0ZS5ncm91cHMgPSBncm91cHM7XG4gIC8qKiBAdHlwZSBTdGF0ZTxzdHJpbmc+ICovXG4gIGNvbnN0IFN0YXJ0ID0gbmV3IFN0YXRlKCk7XG4gIGlmICh0bGRzID09IG51bGwpIHtcbiAgICB0bGRzID0gZGVjb2RlVGxkcyhlbmNvZGVkVGxkcyk7XG4gIH1cbiAgaWYgKHV0bGRzID09IG51bGwpIHtcbiAgICB1dGxkcyA9IGRlY29kZVRsZHMoZW5jb2RlZFV0bGRzKTtcbiAgfVxuXG4gIC8vIFN0YXRlcyBmb3Igc3BlY2lhbCBVUkwgc3ltYm9scyB0aGF0IGFjY2VwdCBpbW1lZGlhdGVseSBhZnRlciBzdGFydFxuICB0dChTdGFydCwgXCInXCIsIEFQT1NUUk9QSEUpO1xuICB0dChTdGFydCwgJ3snLCBPUEVOQlJBQ0UpO1xuICB0dChTdGFydCwgJ30nLCBDTE9TRUJSQUNFKTtcbiAgdHQoU3RhcnQsICdbJywgT1BFTkJSQUNLRVQpO1xuICB0dChTdGFydCwgJ10nLCBDTE9TRUJSQUNLRVQpO1xuICB0dChTdGFydCwgJygnLCBPUEVOUEFSRU4pO1xuICB0dChTdGFydCwgJyknLCBDTE9TRVBBUkVOKTtcbiAgdHQoU3RhcnQsICc8JywgT1BFTkFOR0xFQlJBQ0tFVCk7XG4gIHR0KFN0YXJ0LCAnPicsIENMT1NFQU5HTEVCUkFDS0VUKTtcbiAgdHQoU3RhcnQsICdcdUZGMDgnLCBGVUxMV0lEVEhMRUZUUEFSRU4pO1xuICB0dChTdGFydCwgJ1x1RkYwOScsIEZVTExXSURUSFJJR0hUUEFSRU4pO1xuICB0dChTdGFydCwgJ1x1MzAwQycsIExFRlRDT1JORVJCUkFDS0VUKTtcbiAgdHQoU3RhcnQsICdcdTMwMEQnLCBSSUdIVENPUk5FUkJSQUNLRVQpO1xuICB0dChTdGFydCwgJ1x1MzAwRScsIExFRlRXSElURUNPUk5FUkJSQUNLRVQpO1xuICB0dChTdGFydCwgJ1x1MzAwRicsIFJJR0hUV0hJVEVDT1JORVJCUkFDS0VUKTtcbiAgdHQoU3RhcnQsICdcdUZGMUMnLCBGVUxMV0lEVEhMRVNTVEhBTik7XG4gIHR0KFN0YXJ0LCAnXHVGRjFFJywgRlVMTFdJRFRIR1JFQVRFUlRIQU4pO1xuICB0dChTdGFydCwgJyYnLCBBTVBFUlNBTkQpO1xuICB0dChTdGFydCwgJyonLCBBU1RFUklTSyk7XG4gIHR0KFN0YXJ0LCAnQCcsIEFUKTtcbiAgdHQoU3RhcnQsICdgJywgQkFDS1RJQ0spO1xuICB0dChTdGFydCwgJ14nLCBDQVJFVCk7XG4gIHR0KFN0YXJ0LCAnOicsIENPTE9OKTtcbiAgdHQoU3RhcnQsICcsJywgQ09NTUEpO1xuICB0dChTdGFydCwgJyQnLCBET0xMQVIpO1xuICB0dChTdGFydCwgJy4nLCBET1QpO1xuICB0dChTdGFydCwgJz0nLCBFUVVBTFMpO1xuICB0dChTdGFydCwgJyEnLCBFWENMQU1BVElPTik7XG4gIHR0KFN0YXJ0LCAnLScsIEhZUEhFTik7XG4gIHR0KFN0YXJ0LCAnJScsIFBFUkNFTlQpO1xuICB0dChTdGFydCwgJ3wnLCBQSVBFKTtcbiAgdHQoU3RhcnQsICcrJywgUExVUyk7XG4gIHR0KFN0YXJ0LCAnIycsIFBPVU5EKTtcbiAgdHQoU3RhcnQsICc/JywgUVVFUlkpO1xuICB0dChTdGFydCwgJ1wiJywgUVVPVEUpO1xuICB0dChTdGFydCwgJy8nLCBTTEFTSCk7XG4gIHR0KFN0YXJ0LCAnOycsIFNFTUkpO1xuICB0dChTdGFydCwgJ34nLCBUSUxERSk7XG4gIHR0KFN0YXJ0LCAnXycsIFVOREVSU0NPUkUpO1xuICB0dChTdGFydCwgJ1xcXFwnLCBCQUNLU0xBU0gpO1xuICBjb25zdCBOdW0gPSB0cihTdGFydCwgRElHSVQsIE5VTSwge1xuICAgIFtudW1lcmljXTogdHJ1ZVxuICB9KTtcbiAgdHIoTnVtLCBESUdJVCwgTnVtKTtcblxuICAvLyBTdGF0ZSB3aGljaCBlbWl0cyBhIHdvcmQgdG9rZW5cbiAgY29uc3QgV29yZCA9IHRyKFN0YXJ0LCBBU0NJSV9MRVRURVIsIFdPUkQsIHtcbiAgICBbYXNjaWldOiB0cnVlXG4gIH0pO1xuICB0cihXb3JkLCBBU0NJSV9MRVRURVIsIFdvcmQpO1xuXG4gIC8vIFNhbWUgYXMgcHJldmlvdXMsIGJ1dCBzcGVjaWZpYyB0byBub24tZnNtLmFzY2lpIGFscGhhYmV0IHdvcmRzXG4gIGNvbnN0IFVXb3JkID0gdHIoU3RhcnQsIExFVFRFUiwgVVdPUkQsIHtcbiAgICBbYWxwaGFdOiB0cnVlXG4gIH0pO1xuICB0cihVV29yZCwgQVNDSUlfTEVUVEVSKTsgLy8gTm9uLWFjY2VwdGluZ1xuICB0cihVV29yZCwgTEVUVEVSLCBVV29yZCk7XG5cbiAgLy8gV2hpdGVzcGFjZSBqdW1wc1xuICAvLyBUb2tlbnMgb2Ygb25seSBub24tbmV3bGluZSB3aGl0ZXNwYWNlIGFyZSBhcmJpdHJhcmlseSBsb25nXG4gIC8vIElmIGFueSB3aGl0ZXNwYWNlIGV4Y2VwdCBuZXdsaW5lLCBtb3JlIHdoaXRlc3BhY2UhXG4gIGNvbnN0IFdzID0gdHIoU3RhcnQsIFNQQUNFLCBXUywge1xuICAgIFt3aGl0ZXNwYWNlXTogdHJ1ZVxuICB9KTtcbiAgdHQoU3RhcnQsIE5MLCBOTCQxLCB7XG4gICAgW3doaXRlc3BhY2VdOiB0cnVlXG4gIH0pO1xuICB0dChXcywgTkwpOyAvLyBub24tYWNjZXB0aW5nIHN0YXRlIHRvIGF2b2lkIG1peGluZyB3aGl0ZXNwYWNlc1xuICB0cihXcywgU1BBQ0UsIFdzKTtcblxuICAvLyBFbW9qaSB0b2tlbnMuIFRoZXkgYXJlIG5vdCBncm91cGVkIGJ5IHRoZSBzY2FubmVyIGV4Y2VwdCBpbiBjYXNlcyB3aGVyZSBhXG4gIC8vIHplcm8td2lkdGggam9pbmVyIGlzIHByZXNlbnRcbiAgY29uc3QgRW1vamkgPSB0cihTdGFydCwgRU1PSkksIEVNT0pJJDEsIHtcbiAgICBbZW1vamldOiB0cnVlXG4gIH0pO1xuICB0cihFbW9qaSwgRU1PSkksIEVtb2ppKTtcbiAgdHQoRW1vamksIEVNT0pJX1ZBUklBVElPTiwgRW1vamkpO1xuICAvLyB0dChTdGFydCwgRU1PSklfVkFSSUFUSU9OLCBFbW9qaSk7IC8vIFRoaXMgb25lIGlzIHNrZXRjaHlcblxuICBjb25zdCBFbW9qaUpvaW5lciA9IHR0KEVtb2ppLCBFTU9KSV9KT0lORVIpO1xuICB0cihFbW9qaUpvaW5lciwgRU1PSkksIEVtb2ppKTtcbiAgLy8gdHQoRW1vamlKb2luZXIsIEVNT0pJX1ZBUklBVElPTiwgRW1vamkpOyAvLyBhbHNvIHNrZXRjaHlcblxuICAvLyBHZW5lcmF0ZXMgc3RhdGVzIGZvciB0b3AtbGV2ZWwgZG9tYWluc1xuICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBtb3N0IGFjY3VyYXRlIHdoZW4gdGxkcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyXG4gIGNvbnN0IHdvcmRqciA9IFtbQVNDSUlfTEVUVEVSLCBXb3JkXV07XG4gIGNvbnN0IHV3b3JkanIgPSBbW0FTQ0lJX0xFVFRFUiwgbnVsbF0sIFtMRVRURVIsIFVXb3JkXV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGxkcy5sZW5ndGg7IGkrKykge1xuICAgIGZhc3R0cyhTdGFydCwgdGxkc1tpXSwgVExELCBXT1JELCB3b3JkanIpO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXRsZHMubGVuZ3RoOyBpKyspIHtcbiAgICBmYXN0dHMoU3RhcnQsIHV0bGRzW2ldLCBVVExELCBVV09SRCwgdXdvcmRqcik7XG4gIH1cbiAgYWRkVG9Hcm91cHMoVExELCB7XG4gICAgdGxkOiB0cnVlLFxuICAgIGFzY2lpOiB0cnVlXG4gIH0sIGdyb3Vwcyk7XG4gIGFkZFRvR3JvdXBzKFVUTEQsIHtcbiAgICB1dGxkOiB0cnVlLFxuICAgIGFscGhhOiB0cnVlXG4gIH0sIGdyb3Vwcyk7XG5cbiAgLy8gQ29sbGVjdCB0aGUgc3RhdGVzIGdlbmVyYXRlZCBieSBkaWZmZXJlbnQgcHJvdG9jb2xzLiBOT1RFOiBJZiBhbnkgbmV3IFRMRHNcbiAgLy8gZ2V0IGFkZGVkIHRoYXQgYXJlIGFsc28gcHJvdG9jb2xzLCBzZXQgdGhlIHRva2VuIHRvIGJlIHRoZSBzYW1lIGFzIHRoZVxuICAvLyBwcm90b2NvbCB0byBlbnN1cmUgcGFyc2luZyB3b3JrcyBhcyBleHBlY3RlZC5cbiAgZmFzdHRzKFN0YXJ0LCAnZmlsZScsIFNDSEVNRSwgV09SRCwgd29yZGpyKTtcbiAgZmFzdHRzKFN0YXJ0LCAnbWFpbHRvJywgU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBmYXN0dHMoU3RhcnQsICdodHRwJywgU0xBU0hfU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBmYXN0dHMoU3RhcnQsICdodHRwcycsIFNMQVNIX1NDSEVNRSwgV09SRCwgd29yZGpyKTtcbiAgZmFzdHRzKFN0YXJ0LCAnZnRwJywgU0xBU0hfU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBmYXN0dHMoU3RhcnQsICdmdHBzJywgU0xBU0hfU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBhZGRUb0dyb3VwcyhTQ0hFTUUsIHtcbiAgICBzY2hlbWU6IHRydWUsXG4gICAgYXNjaWk6IHRydWVcbiAgfSwgZ3JvdXBzKTtcbiAgYWRkVG9Hcm91cHMoU0xBU0hfU0NIRU1FLCB7XG4gICAgc2xhc2hzY2hlbWU6IHRydWUsXG4gICAgYXNjaWk6IHRydWVcbiAgfSwgZ3JvdXBzKTtcblxuICAvLyBSZWdpc3RlciBjdXN0b20gc2NoZW1lcy4gQXNzdW1lcyBlYWNoIHNjaGVtZSBpcyBhc2NpaW51bWVyaWMgd2l0aCBoeXBoZW5zXG4gIGN1c3RvbVNjaGVtZXMgPSBjdXN0b21TY2hlbWVzLnNvcnQoKGEsIGIpID0+IGFbMF0gPiBiWzBdID8gMSA6IC0xKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXN0b21TY2hlbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2NoID0gY3VzdG9tU2NoZW1lc1tpXVswXTtcbiAgICBjb25zdCBvcHRpb25hbFNsYXNoU2xhc2ggPSBjdXN0b21TY2hlbWVzW2ldWzFdO1xuICAgIGNvbnN0IGZsYWdzID0gb3B0aW9uYWxTbGFzaFNsYXNoID8ge1xuICAgICAgW3NjaGVtZV06IHRydWVcbiAgICB9IDoge1xuICAgICAgW3NsYXNoc2NoZW1lXTogdHJ1ZVxuICAgIH07XG4gICAgaWYgKHNjaC5pbmRleE9mKCctJykgPj0gMCkge1xuICAgICAgZmxhZ3NbZG9tYWluXSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghQVNDSUlfTEVUVEVSLnRlc3Qoc2NoKSkge1xuICAgICAgZmxhZ3NbbnVtZXJpY10gPSB0cnVlOyAvLyBudW1iZXJzIG9ubHlcbiAgICB9IGVsc2UgaWYgKERJR0lULnRlc3Qoc2NoKSkge1xuICAgICAgZmxhZ3NbYXNjaWludW1lcmljXSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYWdzW2FzY2lpXSA9IHRydWU7XG4gICAgfVxuICAgIHRzKFN0YXJ0LCBzY2gsIHNjaCwgZmxhZ3MpO1xuICB9XG5cbiAgLy8gTG9jYWxob3N0IHRva2VuXG4gIHRzKFN0YXJ0LCAnbG9jYWxob3N0JywgTE9DQUxIT1NULCB7XG4gICAgYXNjaWk6IHRydWVcbiAgfSk7XG5cbiAgLy8gU2V0IGRlZmF1bHQgdHJhbnNpdGlvbiBmb3Igc3RhcnQgc3RhdGUgKHNvbWUgc3ltYm9sKVxuICBTdGFydC5qZCA9IG5ldyBTdGF0ZShTWU0pO1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBTdGFydCxcbiAgICB0b2tlbnM6IGFzc2lnbih7XG4gICAgICBncm91cHNcbiAgICB9LCB0aylcbiAgfTtcbn1cblxuLyoqXG5cdEdpdmVuIGEgc3RyaW5nLCByZXR1cm5zIGFuIGFycmF5IG9mIFRPS0VOIGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlXG5cdGNvbXBvc2l0aW9uIG9mIHRoYXQgc3RyaW5nLlxuXG5cdEBtZXRob2QgcnVuXG5cdEBwYXJhbSB7U3RhdGU8c3RyaW5nPn0gc3RhcnQgc2Nhbm5lciBzdGFydGluZyBzdGF0ZVxuXHRAcGFyYW0ge3N0cmluZ30gc3RyIGlucHV0IHN0cmluZyB0byBzY2FuXG5cdEByZXR1cm4ge1Rva2VuW119IGxpc3Qgb2YgdG9rZW5zLCBlYWNoIHdpdGggYSB0eXBlIGFuZCB2YWx1ZVxuKi9cbmZ1bmN0aW9uIHJ1biQxKHN0YXJ0LCBzdHIpIHtcbiAgLy8gU3RhdGUgbWFjaGluZSBpcyBub3QgY2FzZSBzZW5zaXRpdmUsIHNvIGlucHV0IGlzIHRva2VuaXplZCBpbiBsb3dlcmNhc2VkXG4gIC8vIGZvcm0gKHN0aWxsIHJldHVybnMgcmVndWxhciBjYXNlKS4gVXNlcyBzZWxlY3RpdmUgYHRvTG93ZXJDYXNlYCBiZWNhdXNlXG4gIC8vIGxvd2VyY2FzaW5nIHRoZSBlbnRpcmUgc3RyaW5nIGNhdXNlcyB0aGUgbGVuZ3RoIGFuZCBjaGFyYWN0ZXIgcG9zaXRpb24gdG9cbiAgLy8gdmFyeSBpbiBzb21lIG5vbi1FbmdsaXNoIHN0cmluZ3Mgd2l0aCBWOC1iYXNlZCBydW50aW1lcy5cbiAgY29uc3QgaXRlcmFibGUgPSBzdHJpbmdUb0FycmF5KHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBjID0+IGMudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBjaGFyQ291bnQgPSBpdGVyYWJsZS5sZW5ndGg7IC8vIDw9IGxlbiBpZiB0aGVyZSBhcmUgZW1vamlzLCBldGNcbiAgY29uc3QgdG9rZW5zID0gW107IC8vIHJldHVybiB2YWx1ZVxuXG4gIC8vIGN1cnNvciB0aHJvdWdoIHRoZSBzdHJpbmcgaXRzZWxmLCBhY2NvdW50aW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgaGF2ZVxuICAvLyB3aWR0aCB3aXRoIGxlbmd0aCAyIHN1Y2ggYXMgZW1vamlzXG4gIGxldCBjdXJzb3IgPSAwO1xuXG4gIC8vIEN1cnNvciB0aHJvdWdoIHRoZSBhcnJheS1yZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RyaW5nXG4gIGxldCBjaGFyQ3Vyc29yID0gMDtcblxuICAvLyBUb2tlbml6ZSB0aGUgc3RyaW5nXG4gIHdoaWxlIChjaGFyQ3Vyc29yIDwgY2hhckNvdW50KSB7XG4gICAgbGV0IHN0YXRlID0gc3RhcnQ7XG4gICAgbGV0IG5leHRTdGF0ZSA9IG51bGw7XG4gICAgbGV0IHRva2VuTGVuZ3RoID0gMDtcbiAgICBsZXQgbGF0ZXN0QWNjZXB0aW5nID0gbnVsbDtcbiAgICBsZXQgc2luY2VBY2NlcHRzID0gLTE7XG4gICAgbGV0IGNoYXJzU2luY2VBY2NlcHRzID0gLTE7XG4gICAgd2hpbGUgKGNoYXJDdXJzb3IgPCBjaGFyQ291bnQgJiYgKG5leHRTdGF0ZSA9IHN0YXRlLmdvKGl0ZXJhYmxlW2NoYXJDdXJzb3JdKSkpIHtcbiAgICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXRlc3QgYWNjZXB0aW5nIHN0YXRlXG4gICAgICBpZiAoc3RhdGUuYWNjZXB0cygpKSB7XG4gICAgICAgIHNpbmNlQWNjZXB0cyA9IDA7XG4gICAgICAgIGNoYXJzU2luY2VBY2NlcHRzID0gMDtcbiAgICAgICAgbGF0ZXN0QWNjZXB0aW5nID0gc3RhdGU7XG4gICAgICB9IGVsc2UgaWYgKHNpbmNlQWNjZXB0cyA+PSAwKSB7XG4gICAgICAgIHNpbmNlQWNjZXB0cyArPSBpdGVyYWJsZVtjaGFyQ3Vyc29yXS5sZW5ndGg7XG4gICAgICAgIGNoYXJzU2luY2VBY2NlcHRzKys7XG4gICAgICB9XG4gICAgICB0b2tlbkxlbmd0aCArPSBpdGVyYWJsZVtjaGFyQ3Vyc29yXS5sZW5ndGg7XG4gICAgICBjdXJzb3IgKz0gaXRlcmFibGVbY2hhckN1cnNvcl0ubGVuZ3RoO1xuICAgICAgY2hhckN1cnNvcisrO1xuICAgIH1cblxuICAgIC8vIFJvbGwgYmFjayB0byB0aGUgbGF0ZXN0IGFjY2VwdGluZyBzdGF0ZVxuICAgIGN1cnNvciAtPSBzaW5jZUFjY2VwdHM7XG4gICAgY2hhckN1cnNvciAtPSBjaGFyc1NpbmNlQWNjZXB0cztcbiAgICB0b2tlbkxlbmd0aCAtPSBzaW5jZUFjY2VwdHM7XG5cbiAgICAvLyBObyBtb3JlIGp1bXBzLCBqdXN0IG1ha2UgYSBuZXcgdG9rZW4gZnJvbSB0aGUgbGFzdCBhY2NlcHRpbmcgb25lXG4gICAgdG9rZW5zLnB1c2goe1xuICAgICAgdDogbGF0ZXN0QWNjZXB0aW5nLnQsXG4gICAgICAvLyB0b2tlbiB0eXBlL25hbWVcbiAgICAgIHY6IHN0ci5zbGljZShjdXJzb3IgLSB0b2tlbkxlbmd0aCwgY3Vyc29yKSxcbiAgICAgIC8vIHN0cmluZyB2YWx1ZVxuICAgICAgczogY3Vyc29yIC0gdG9rZW5MZW5ndGgsXG4gICAgICAvLyBzdGFydCBpbmRleFxuICAgICAgZTogY3Vyc29yIC8vIGVuZCBpbmRleCAoZXhjbHVkaW5nKVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgU3RyaW5nIHRvIGFuIEFycmF5IG9mIGNoYXJhY3RlcnMsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdCBzb21lXG4gKiBjaGFyYWN0ZXJzIGxpa2UgZW1vamlzIHRha2UgdXAgdHdvIHN0cmluZyBpbmRleGVzLlxuICpcbiAqIEFkYXB0ZWQgZnJvbSBjb3JlLWpzIChNSVQgbGljZW5zZSlcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvMmQ2OWNmNWY5OWFiM2VhMzQ2M2MzOTVkZjgxZTVhMTViNjhmNDlkOS9wYWNrYWdlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXG4gKlxuICogQGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHIpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxlbikge1xuICAgIGxldCBmaXJzdCA9IHN0ci5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICBsZXQgc2Vjb25kO1xuICAgIGxldCBjaGFyID0gZmlyc3QgPCAweGQ4MDAgfHwgZmlyc3QgPiAweGRiZmYgfHwgaW5kZXggKyAxID09PSBsZW4gfHwgKHNlY29uZCA9IHN0ci5jaGFyQ29kZUF0KGluZGV4ICsgMSkpIDwgMHhkYzAwIHx8IHNlY29uZCA+IDB4ZGZmZiA/IHN0cltpbmRleF0gLy8gc2luZ2xlIGNoYXJhY3RlclxuICAgIDogc3RyLnNsaWNlKGluZGV4LCBpbmRleCArIDIpOyAvLyB0d28taW5kZXggY2hhcmFjdGVyc1xuICAgIHJlc3VsdC5wdXNoKGNoYXIpO1xuICAgIGluZGV4ICs9IGNoYXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRmFzdCB2ZXJzaW9uIG9mIHRzIGZ1bmN0aW9uIGZvciB3aGVuIHRyYW5zaXRpb24gZGVmYXVsdHMgYXJlIHdlbGwga25vd25cbiAqIEBwYXJhbSB7U3RhdGU8c3RyaW5nPn0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHtzdHJpbmd9IHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0dFxuICogQHBhcmFtIHtbUmVnRXhwLCBTdGF0ZTxzdHJpbmc+XVtdfSBqclxuICogQHJldHVybnMge1N0YXRlPHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIGZhc3R0cyhzdGF0ZSwgaW5wdXQsIHQsIGRlZmF1bHR0LCBqcikge1xuICBsZXQgbmV4dDtcbiAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBpbnB1dFtpXTtcbiAgICBpZiAoc3RhdGUualtjaGFyXSkge1xuICAgICAgbmV4dCA9IHN0YXRlLmpbY2hhcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQgPSBuZXcgU3RhdGUoZGVmYXVsdHQpO1xuICAgICAgbmV4dC5qciA9IGpyLnNsaWNlKCk7XG4gICAgICBzdGF0ZS5qW2NoYXJdID0gbmV4dDtcbiAgICB9XG4gICAgc3RhdGUgPSBuZXh0O1xuICB9XG4gIG5leHQgPSBuZXcgU3RhdGUodCk7XG4gIG5leHQuanIgPSBqci5zbGljZSgpO1xuICBzdGF0ZS5qW2lucHV0W2xlbiAtIDFdXSA9IG5leHQ7XG4gIHJldHVybiBuZXh0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFRvcC1MZXZlbCBEb21haW4gbmFtZXMgZW5jb2RlZCBpbiB1cGRhdGUtdGxkcy5qcyBiYWNrXG4gKiBpbnRvIGEgbGlzdCBvZiBzdHJpbmdzLlxuICogQHBhcmFtIHtzdHJ9IGVuY29kZWQgZW5jb2RlZCBUTERzIHN0cmluZ1xuICogQHJldHVybnMge3N0cltdfSBvcmlnaW5hbCBUTERzIGxpc3RcbiAqL1xuZnVuY3Rpb24gZGVjb2RlVGxkcyhlbmNvZGVkKSB7XG4gIGNvbnN0IHdvcmRzID0gW107XG4gIGNvbnN0IHN0YWNrID0gW107XG4gIGxldCBpID0gMDtcbiAgbGV0IGRpZ2l0cyA9ICcwMTIzNDU2Nzg5JztcbiAgd2hpbGUgKGkgPCBlbmNvZGVkLmxlbmd0aCkge1xuICAgIGxldCBwb3BEaWdpdENvdW50ID0gMDtcbiAgICB3aGlsZSAoZGlnaXRzLmluZGV4T2YoZW5jb2RlZFtpICsgcG9wRGlnaXRDb3VudF0pID49IDApIHtcbiAgICAgIHBvcERpZ2l0Q291bnQrKzsgLy8gZW5jb3VudGVyZWQgc29tZSBkaWdpdHMsIGhhdmUgdG8gcG9wIHRvIGdvIG9uZSBsZXZlbCB1cCB0cmllXG4gICAgfVxuXG4gICAgaWYgKHBvcERpZ2l0Q291bnQgPiAwKSB7XG4gICAgICB3b3Jkcy5wdXNoKHN0YWNrLmpvaW4oJycpKTsgLy8gd2hhdGV2ZXIgcHJlY2VkZWQgdGhlIHBvcCBkaWdpdHMgbXVzdCBiZSBhIHdvcmRcbiAgICAgIGZvciAobGV0IHBvcENvdW50ID0gcGFyc2VJbnQoZW5jb2RlZC5zdWJzdHJpbmcoaSwgaSArIHBvcERpZ2l0Q291bnQpLCAxMCk7IHBvcENvdW50ID4gMDsgcG9wQ291bnQtLSkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH1cbiAgICAgIGkgKz0gcG9wRGlnaXRDb3VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhY2sucHVzaChlbmNvZGVkW2ldKTsgLy8gZHJvcCBkb3duIGEgbGV2ZWwgaW50byB0aGUgdHJpZVxuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd29yZHM7XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHdoZXJlIGVhY2gga2V5IGlzIGEgdmFsaWQgRE9NIEV2ZW50IE5hbWUgc3VjaCBhcyBgY2xpY2tgIG9yIGBmb2N1c2BcbiAqIGFuZCBlYWNoIHZhbHVlIGlzIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQjZXZlbnRzXG4gKiBAdHlwZWRlZiB7P3sgW2V2ZW50OiBzdHJpbmddOiBGdW5jdGlvbiB9fSBFdmVudExpc3RlbmVyc1xuICovXG5cbi8qKlxuICogQWxsIGZvcm1hdHRlZCBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIHJlbmRlciBhIGxpbmssIGluY2x1ZGluZyBgdGFnTmFtZWAsXG4gKiBgYXR0cmlidXRlc2AsIGBjb250ZW50YCBhbmQgYGV2ZW50TGlzdGVuZXJzYC5cbiAqIEB0eXBlZGVmIHt7IHRhZ05hbWU6IGFueSwgYXR0cmlidXRlczoge1thdHRyOiBzdHJpbmddOiBhbnl9LCBjb250ZW50OiBzdHJpbmcsXG4gKiBldmVudExpc3RlbmVyczogRXZlbnRMaXN0ZW5lcnMgfX0gSW50ZXJtZWRpYXRlUmVwcmVzZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIFNwZWNpZnkgZWl0aGVyIGFuIG9iamVjdCBkZXNjcmliZWQgYnkgdGhlIHRlbXBsYXRlIHR5cGUgYE9gIG9yIGEgZnVuY3Rpb24uXG4gKlxuICogVGhlIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHZhbHVlICh1c3VhbGx5IHRoZSBsaW5rJ3MgaHJlZiBhdHRyaWJ1dGUpLCB0aGVcbiAqIGxpbmsgdHlwZSAoYCd1cmwnYCwgYCdoYXNodGFnYCcsIGV0Yy4pIGFuZCBhbiBpbnRlcm5hbCB0b2tlbiByZXByZXNlbnRhdGlvblxuICogb2YgdGhlIGxpbmsuIEl0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSB0ZW1wbGF0ZSB0eXBlIGBPYFxuICogQHRlbXBsYXRlIE9cbiAqIEB0eXBlZGVmIHtPIHwgKCh2YWx1ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIHRva2VuOiBNdWx0aVRva2VuKSA9PiBPKX0gT3B0T2JqXG4gKi9cblxuLyoqXG4gKiBTcGVjaWZ5IGVpdGhlciBhIGZ1bmN0aW9uIGRlc2NyaWJlZCBieSB0ZW1wbGF0ZSB0eXBlIGBGYCBvciBhbiBvYmplY3QuXG4gKlxuICogRWFjaCBrZXkgaW4gdGhlIG9iamVjdCBzaG91bGQgYmUgYSBsaW5rIHR5cGUgKGAndXJsJ2AsIGAnaGFzaHRhZ2AnLCBldGMuKS4gRWFjaFxuICogdmFsdWUgc2hvdWxkIGJlIGEgZnVuY3Rpb24gd2l0aCB0ZW1wbGF0ZSB0eXBlIGBGYCB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZVxuICogY29ycmVzcG9uZGluZyBsaW5rIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4gKiBAdGVtcGxhdGUgRlxuICogQHR5cGVkZWYge0YgfCB7IFt0eXBlOiBzdHJpbmddOiBGfX0gT3B0Rm5cbiAqL1xuXG4vKipcbiAqIFNwZWNpZnkgZWl0aGVyIGEgdmFsdWUgd2l0aCB0ZW1wbGF0ZSB0eXBlIGBWYCwgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYFZgIG9yXG4gKiBhbiBvYmplY3Qgd2hlcmUgZWFjaCB2YWx1ZSByZXNvbHZlcyB0byBgVmAuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHZhbHVlICh1c3VhbGx5IHRoZSBsaW5rJ3MgaHJlZiBhdHRyaWJ1dGUpLCB0aGVcbiAqIGxpbmsgdHlwZSAoYCd1cmwnYCwgYCdoYXNodGFnYCcsIGV0Yy4pIGFuZCBhbiBpbnRlcm5hbCB0b2tlbiByZXByZXNlbnRhdGlvblxuICogb2YgdGhlIGxpbmsuIEl0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSB0ZW1wbGF0ZSB0eXBlIGBWYFxuICpcbiAqIEZvciB0aGUgb2JqZWN0LCBlYWNoIGtleSBzaG91bGQgYmUgYSBsaW5rIHR5cGUgKGAndXJsJ2AsIGAnaGFzaHRhZ2AnLCBldGMuKS5cbiAqIEVhY2ggdmFsdWUgc2hvdWxkIGVpdGhlciBoYXZlIHR5cGUgYFZgIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIFYuIFRoaXNcbiAqIGZ1bmN0aW9uIHNpbWlsYXJseSB0YWtlcyBhIHN0cmluZyB2YWx1ZSBhbmQgYSB0b2tlbi5cbiAqXG4gKiBFeGFtcGxlIHZhbGlkIHR5cGVzIGZvciBgT3B0PHN0cmluZz5gOlxuICpcbiAqIGBgYGpzXG4gKiAnaGVsbG8nXG4gKiAodmFsdWUsIHR5cGUsIHRva2VuKSA9PiAnd29ybGQnXG4gKiB7IHVybDogJ2hlbGxvJywgZW1haWw6ICh2YWx1ZSwgdG9rZW4pID0+ICd3b3JsZCd9XG4gKiBgYGBcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7ViB8ICgodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCB0b2tlbjogTXVsdGlUb2tlbikgPT4gVikgfCB7IFt0eXBlOiBzdHJpbmddOiBWIHwgKCh2YWx1ZTogc3RyaW5nLCB0b2tlbjogTXVsdGlUb2tlbikgPT4gVikgfX0gT3B0XG4gKi9cblxuLyoqXG4gKiBTZWUgYXZhaWxhYmxlIG9wdGlvbnM6IGh0dHBzOi8vbGlua2lmeS5qcy5vcmcvZG9jcy9vcHRpb25zLmh0bWxcbiAqIEB0eXBlZGVmIHt7XG4gKiBcdGRlZmF1bHRQcm90b2NvbD86IHN0cmluZyxcbiAqICBldmVudHM/OiBPcHRPYmo8RXZlbnRMaXN0ZW5lcnM+LFxuICogXHRmb3JtYXQ/OiBPcHQ8c3RyaW5nPixcbiAqIFx0Zm9ybWF0SHJlZj86IE9wdDxzdHJpbmc+LFxuICogXHRubDJicj86IGJvb2xlYW4sXG4gKiBcdHRhZ05hbWU/OiBPcHQ8YW55PixcbiAqIFx0dGFyZ2V0PzogT3B0PHN0cmluZz4sXG4gKiBcdHJlbD86IE9wdDxzdHJpbmc+LFxuICogXHR2YWxpZGF0ZT86IE9wdDxib29sZWFuPixcbiAqIFx0dHJ1bmNhdGU/OiBPcHQ8bnVtYmVyPixcbiAqIFx0Y2xhc3NOYW1lPzogT3B0PHN0cmluZz4sXG4gKiBcdGF0dHJpYnV0ZXM/OiBPcHRPYmo8KHsgW2F0dHI6IHN0cmluZ106IGFueSB9KT4sXG4gKiAgaWdub3JlVGFncz86IHN0cmluZ1tdLFxuICogXHRyZW5kZXI/OiBPcHRGbjwoKGlyOiBJbnRlcm1lZGlhdGVSZXByZXNlbnRhdGlvbikgPT4gYW55KT5cbiAqIH19IE9wdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlIFJlcXVpcmVkPE9wdHM+XG4gKi9cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBkZWZhdWx0UHJvdG9jb2w6ICdodHRwJyxcbiAgZXZlbnRzOiBudWxsLFxuICBmb3JtYXQ6IG5vb3AsXG4gIGZvcm1hdEhyZWY6IG5vb3AsXG4gIG5sMmJyOiBmYWxzZSxcbiAgdGFnTmFtZTogJ2EnLFxuICB0YXJnZXQ6IG51bGwsXG4gIHJlbDogbnVsbCxcbiAgdmFsaWRhdGU6IHRydWUsXG4gIHRydW5jYXRlOiBJbmZpbml0eSxcbiAgY2xhc3NOYW1lOiBudWxsLFxuICBhdHRyaWJ1dGVzOiBudWxsLFxuICBpZ25vcmVUYWdzOiBbXSxcbiAgcmVuZGVyOiBudWxsXG59O1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIGxpbmtpZnkgaW50ZXJmYWNlcyB0byBhcHBseSBzcGVjaWZpZWRcbiAqIHtAbGluayBPcHRzIGZvcm1hdHRpbmcgYW5kIHJlbmRlcmluZyBvcHRpb25zfS5cbiAqXG4gKiBAcGFyYW0ge09wdHMgfCBPcHRpb25zfSBbb3B0c10gT3B0aW9uIHZhbHVlIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSB7KGlyOiBJbnRlcm1lZGlhdGVSZXByZXNlbnRhdGlvbikgPT4gYW55fSBbZGVmYXVsdFJlbmRlcl0gKEZvclxuICogICBpbnRlcm5hbCB1c2UpIGRlZmF1bHQgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gZ2VuZXJhdGUgYW5cbiAqICAgSFRNTCBlbGVtZW50IGJhc2VkIG9uIGEgbGluayB0b2tlbidzIGRlcml2ZWQgdGFnTmFtZSwgYXR0cmlidXRlcyBhbmQgSFRNTC5cbiAqICAgU2ltaWxhciB0byByZW5kZXIgb3B0aW9uXG4gKi9cbmZ1bmN0aW9uIE9wdGlvbnMob3B0cywgZGVmYXVsdFJlbmRlcikge1xuICBpZiAoZGVmYXVsdFJlbmRlciA9PT0gdm9pZCAwKSB7XG4gICAgZGVmYXVsdFJlbmRlciA9IG51bGw7XG4gIH1cbiAgbGV0IG8gPSBhc3NpZ24oe30sIGRlZmF1bHRzKTtcbiAgaWYgKG9wdHMpIHtcbiAgICBvID0gYXNzaWduKG8sIG9wdHMgaW5zdGFuY2VvZiBPcHRpb25zID8gb3B0cy5vIDogb3B0cyk7XG4gIH1cblxuICAvLyBFbnN1cmUgYWxsIGlnbm9yZWQgdGFncyBhcmUgdXBwZXJjYXNlXG4gIGNvbnN0IGlnbm9yZWRUYWdzID0gby5pZ25vcmVUYWdzO1xuICBjb25zdCB1cHBlcmNhc2VJZ25vcmVkVGFncyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlnbm9yZWRUYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdXBwZXJjYXNlSWdub3JlZFRhZ3MucHVzaChpZ25vcmVkVGFnc1tpXS50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuICAvKiogQHByb3RlY3RlZCAqL1xuICB0aGlzLm8gPSBvO1xuICBpZiAoZGVmYXVsdFJlbmRlcikge1xuICAgIHRoaXMuZGVmYXVsdFJlbmRlciA9IGRlZmF1bHRSZW5kZXI7XG4gIH1cbiAgdGhpcy5pZ25vcmVUYWdzID0gdXBwZXJjYXNlSWdub3JlZFRhZ3M7XG59XG5PcHRpb25zLnByb3RvdHlwZSA9IHtcbiAgbzogZGVmYXVsdHMsXG4gIC8qKlxuICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgKi9cbiAgaWdub3JlVGFnczogW10sXG4gIC8qKlxuICAgKiBAcGFyYW0ge0ludGVybWVkaWF0ZVJlcHJlc2VudGF0aW9ufSBpclxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZGVmYXVsdFJlbmRlcihpcikge1xuICAgIHJldHVybiBpcjtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiB3aGV0aGVyIGEgdG9rZW4gc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBhXG4gICAqIGxpbmsgYmFzZWQgb24gdGhlIHVzZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtNdWx0aVRva2VufSB0b2tlblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGNoZWNrKHRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCd2YWxpZGF0ZScsIHRva2VuLnRvU3RyaW5nKCksIHRva2VuKTtcbiAgfSxcbiAgLy8gUHJpdmF0ZSBtZXRob2RzXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gb3B0aW9uJ3MgdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gYW5kIHRoZSBnaXZlblxuICAgKiBwYXJhbXMuIElmIG9wZXJhdG9yIGFuZCB0b2tlbiBhcmUgc3BlY2lmaWVkIGFuZCB0aGUgdGFyZ2V0IG9wdGlvbiBpc1xuICAgKiBjYWxsYWJsZSwgYXV0b21hdGljYWxseSBjYWxscyB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnQuXG4gICAqIEB0ZW1wbGF0ZSB7a2V5b2YgT3B0c30gS1xuICAgKiBAcGFyYW0ge0t9IGtleSBOYW1lIG9mIG9wdGlvbiB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcGVyYXRvcl0gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBvcHRpb24gaWYgaXQncyBhXG4gICAqIGZ1bmN0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCBSQVcgZnVuY3Rpb24gdmFsdWUgZ2V0cyByZXR1cm5lZFxuICAgKiBAcGFyYW0ge011bHRpVG9rZW59IFt0b2tlbl0gVGhlIHRva2VuIGZyb20gbGlua2lmeS50b2tlbml6ZVxuICAgKiBAcmV0dXJucyB7T3B0c1tLXSB8IGFueX1cbiAgICovXG4gIGdldChrZXksIG9wZXJhdG9yLCB0b2tlbikge1xuICAgIGNvbnN0IGlzQ2FsbGFibGUgPSBvcGVyYXRvciAhPSBudWxsO1xuICAgIGxldCBvcHRpb24gPSB0aGlzLm9ba2V5XTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRpb24gPSB0b2tlbi50IGluIG9wdGlvbiA/IG9wdGlvblt0b2tlbi50XSA6IGRlZmF1bHRzW2tleV07XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0NhbGxhYmxlKSB7XG4gICAgICAgIG9wdGlvbiA9IG9wdGlvbihvcGVyYXRvciwgdG9rZW4pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0NhbGxhYmxlKSB7XG4gICAgICBvcHRpb24gPSBvcHRpb24ob3BlcmF0b3IsIHRva2VuLnQsIHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfSxcbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7a2V5b2YgT3B0c30gTFxuICAgKiBAcGFyYW0ge0x9IGtleSBOYW1lIG9mIG9wdGlvbnMgb2JqZWN0IHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wZXJhdG9yXVxuICAgKiBAcGFyYW0ge011bHRpVG9rZW59IFt0b2tlbl1cbiAgICogQHJldHVybnMge09wdHNbTF0gfCBhbnl9XG4gICAqL1xuICBnZXRPYmooa2V5LCBvcGVyYXRvciwgdG9rZW4pIHtcbiAgICBsZXQgb2JqID0gdGhpcy5vW2tleV07XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicgJiYgb3BlcmF0b3IgIT0gbnVsbCkge1xuICAgICAgb2JqID0gb2JqKG9wZXJhdG9yLCB0b2tlbi50LCB0b2tlbik7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0sXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBnaXZlbiB0b2tlbiB0byBhIHJlbmRlcmVkIGVsZW1lbnQgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlXG4gICAqIGNhbGxpbmctaW50ZXJmYWNlJ3MgRE9NXG4gICAqIEBwYXJhbSB7TXVsdGlUb2tlbn0gdG9rZW4gVG9rZW4gdG8gcmVuZGVyIHRvIGFuIEhUTUwgZWxlbWVudFxuICAgKiBAcmV0dXJucyB7YW55fSBSZW5kZXIgcmVzdWx0OyBlLmcuLCBIVE1MIHN0cmluZywgRE9NIGVsZW1lbnQsIFJlYWN0XG4gICAqICAgQ29tcG9uZW50LCBldGMuXG4gICAqL1xuICByZW5kZXIodG9rZW4pIHtcbiAgICBjb25zdCBpciA9IHRva2VuLnJlbmRlcih0aGlzKTsgLy8gaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgY29uc3QgcmVuZGVyRm4gPSB0aGlzLmdldCgncmVuZGVyJywgbnVsbCwgdG9rZW4pIHx8IHRoaXMuZGVmYXVsdFJlbmRlcjtcbiAgICByZXR1cm4gcmVuZGVyRm4oaXIsIHRva2VuLnQsIHRva2VuKTtcbiAgfVxufTtcbmZ1bmN0aW9uIG5vb3AodmFsKSB7XG4gIHJldHVybiB2YWw7XG59XG5cbnZhciBvcHRpb25zID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGRlZmF1bHRzOiBkZWZhdWx0cyxcblx0T3B0aW9uczogT3B0aW9ucyxcblx0YXNzaWduOiBhc3NpZ25cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cdE11bHRpLVRva2Vuc1xuXHRUb2tlbnMgY29tcG9zZWQgb2YgYXJyYXlzIG9mIFRleHRUb2tlbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7VG9rZW5bXX0gdG9rZW5zXG4gKi9cbmZ1bmN0aW9uIE11bHRpVG9rZW4odmFsdWUsIHRva2Vucykge1xuICB0aGlzLnQgPSAndG9rZW4nO1xuICB0aGlzLnYgPSB2YWx1ZTtcbiAgdGhpcy50ayA9IHRva2Vucztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyB1c2VkIGZvciBtYW51ZmFjdHVyaW5nIHRva2VucyBvZiB0ZXh0IHRva2Vucy4gVGhhdCBpcyByYXRoZXJcbiAqIHRoYW4gdGhlIHZhbHVlIGZvciBhIHRva2VuIGJlaW5nIGEgc21hbGwgc3RyaW5nIG9mIHRleHQsIGl0J3MgdmFsdWUgYW4gYXJyYXlcbiAqIG9mIHRleHQgdG9rZW5zLlxuICpcbiAqIFVzZWQgZm9yIGdyb3VwaW5nIHRvZ2V0aGVyIFVSTHMsIGVtYWlscywgaGFzaHRhZ3MsIGFuZCBvdGhlciBwb3RlbnRpYWxcbiAqIGNyZWF0aW9ucy5cbiAqIEBjbGFzcyBNdWx0aVRva2VuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZcbiAqIEBwcm9wZXJ0eSB7VG9rZW5bXX0gdGtcbiAqIEBhYnN0cmFjdFxuICovXG5NdWx0aVRva2VuLnByb3RvdHlwZSA9IHtcbiAgaXNMaW5rOiBmYWxzZSxcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc3RyaW5nIHRoaXMgdG9rZW4gcmVwcmVzZW50cy5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudjtcbiAgfSxcbiAgLyoqXG4gICAqIFdoYXQgc2hvdWxkIHRoZSB2YWx1ZSBmb3IgdGhpcyB0b2tlbiBiZSBpbiB0aGUgYGhyZWZgIEhUTUwgYXR0cmlidXRlP1xuICAgKiBSZXR1cm5zIHRoZSBgLnRvU3RyaW5nYCB2YWx1ZSBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjaGVtZV1cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAqL1xuICB0b0hyZWYoc2NoZW1lKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBGb3JtYXR0aW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRvRm9ybWF0dGVkU3RyaW5nKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgdHJ1bmNhdGUgPSBvcHRpb25zLmdldCgndHJ1bmNhdGUnLCB2YWwsIHRoaXMpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IG9wdGlvbnMuZ2V0KCdmb3JtYXQnLCB2YWwsIHRoaXMpO1xuICAgIHJldHVybiB0cnVuY2F0ZSAmJiBmb3JtYXR0ZWQubGVuZ3RoID4gdHJ1bmNhdGUgPyBmb3JtYXR0ZWQuc3Vic3RyaW5nKDAsIHRydW5jYXRlKSArICdcdTIwMjYnIDogZm9ybWF0dGVkO1xuICB9LFxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdHRlZEhyZWYob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLmdldCgnZm9ybWF0SHJlZicsIHRoaXMudG9IcmVmKG9wdGlvbnMuZ2V0KCdkZWZhdWx0UHJvdG9jb2wnKSksIHRoaXMpO1xuICB9LFxuICAvKipcbiAgICogVGhlIHN0YXJ0IGluZGV4IG9mIHRoaXMgdG9rZW4gaW4gdGhlIG9yaWdpbmFsIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgc3RhcnRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy50a1swXS5zO1xuICB9LFxuICAvKipcbiAgICogVGhlIGVuZCBpbmRleCBvZiB0aGlzIHRva2VuIGluIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJpbmcgKHVwIHRvIHRoaXNcbiAgICogaW5kZXggYnV0IG5vdCBpbmNsdWRpbmcgaXQpXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBlbmRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy50a1t0aGlzLnRrLmxlbmd0aCAtIDFdLmU7XG4gIH0sXG4gIC8qKlxuICBcdFJldHVybnMgYW4gb2JqZWN0ICBvZiByZWxldmFudCB2YWx1ZXMgZm9yIHRoaXMgdG9rZW4sIHdoaWNoIGluY2x1ZGVzIGtleXNcbiAgXHQqIHR5cGUgLSBLaW5kIG9mIHRva2VuICgndXJsJywgJ2VtYWlsJywgZXRjLilcbiAgXHQqIHZhbHVlIC0gT3JpZ2luYWwgdGV4dFxuICBcdCogaHJlZiAtIFRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgYW5jaG9yIHRhZydzIGhyZWZcbiAgXHRcdGF0dHJpYnV0ZVxuICBcdFx0QG1ldGhvZCB0b09iamVjdFxuICBcdEBwYXJhbSB7c3RyaW5nfSBbcHJvdG9jb2xdIGAnaHR0cCdgIGJ5IGRlZmF1bHRcbiAgKi9cbiAgdG9PYmplY3QocHJvdG9jb2wpIHtcbiAgICBpZiAocHJvdG9jb2wgPT09IHZvaWQgMCkge1xuICAgICAgcHJvdG9jb2wgPSBkZWZhdWx0cy5kZWZhdWx0UHJvdG9jb2w7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnQsXG4gICAgICB2YWx1ZTogdGhpcy50b1N0cmluZygpLFxuICAgICAgaXNMaW5rOiB0aGlzLmlzTGluayxcbiAgICAgIGhyZWY6IHRoaXMudG9IcmVmKHByb3RvY29sKSxcbiAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0SW5kZXgoKSxcbiAgICAgIGVuZDogdGhpcy5lbmRJbmRleCgpXG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBGb3JtYXR0aW5nIG9wdGlvblxuICAgKi9cbiAgdG9Gb3JtYXR0ZWRPYmplY3Qob3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnQsXG4gICAgICB2YWx1ZTogdGhpcy50b0Zvcm1hdHRlZFN0cmluZyhvcHRpb25zKSxcbiAgICAgIGlzTGluazogdGhpcy5pc0xpbmssXG4gICAgICBocmVmOiB0aGlzLnRvRm9ybWF0dGVkSHJlZihvcHRpb25zKSxcbiAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0SW5kZXgoKSxcbiAgICAgIGVuZDogdGhpcy5lbmRJbmRleCgpXG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0b2tlbiBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBsaW5rIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWxpZGF0ZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZ2V0KCd2YWxpZGF0ZScsIHRoaXMudG9TdHJpbmcoKSwgdGhpcyk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBob3cgdGhpcyBsaW5rIHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIEZvcm1hdHRpbm5nIG9wdGlvbnNcbiAgICovXG4gIHJlbmRlcihvcHRpb25zKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzO1xuICAgIGNvbnN0IGhyZWYgPSB0aGlzLnRvSHJlZihvcHRpb25zLmdldCgnZGVmYXVsdFByb3RvY29sJykpO1xuICAgIGNvbnN0IGZvcm1hdHRlZEhyZWYgPSBvcHRpb25zLmdldCgnZm9ybWF0SHJlZicsIGhyZWYsIHRoaXMpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSBvcHRpb25zLmdldCgndGFnTmFtZScsIGhyZWYsIHRva2VuKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy50b0Zvcm1hdHRlZFN0cmluZyhvcHRpb25zKTtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgY29uc3QgY2xhc3NOYW1lID0gb3B0aW9ucy5nZXQoJ2NsYXNzTmFtZScsIGhyZWYsIHRva2VuKTtcbiAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLmdldCgndGFyZ2V0JywgaHJlZiwgdG9rZW4pO1xuICAgIGNvbnN0IHJlbCA9IG9wdGlvbnMuZ2V0KCdyZWwnLCBocmVmLCB0b2tlbik7XG4gICAgY29uc3QgYXR0cnMgPSBvcHRpb25zLmdldE9iaignYXR0cmlidXRlcycsIGhyZWYsIHRva2VuKTtcbiAgICBjb25zdCBldmVudExpc3RlbmVycyA9IG9wdGlvbnMuZ2V0T2JqKCdldmVudHMnLCBocmVmLCB0b2tlbik7XG4gICAgYXR0cmlidXRlcy5ocmVmID0gZm9ybWF0dGVkSHJlZjtcbiAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBhdHRyaWJ1dGVzLnRhcmdldCA9IHRhcmdldDtcbiAgICB9XG4gICAgaWYgKHJlbCkge1xuICAgICAgYXR0cmlidXRlcy5yZWwgPSByZWw7XG4gICAgfVxuICAgIGlmIChhdHRycykge1xuICAgICAgYXNzaWduKGF0dHJpYnV0ZXMsIGF0dHJzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhZ05hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgY29udGVudCxcbiAgICAgIGV2ZW50TGlzdGVuZXJzXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgdG9rZW4gdGhhdCBjYW4gYmUgZW1pdHRlZCBieSB0aGUgcGFyc2VyIHN0YXRlIG1hY2hpbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIHJlYWRhYmxlIHR5cGUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgcHJvcGVydGllcyB0byBhc3NpZ24gb3Igb3ZlcnJpZGUsIGluY2x1ZGluZyBpc0xpbmsgPSB0cnVlIG9yIGZhbHNlXG4gKiBAcmV0dXJucyB7bmV3ICh2YWx1ZTogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10pID0+IE11bHRpVG9rZW59IG5ldyB0b2tlbiBjbGFzc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUb2tlbkNsYXNzKHR5cGUsIHByb3BzKSB7XG4gIGNsYXNzIFRva2VuIGV4dGVuZHMgTXVsdGlUb2tlbiB7XG4gICAgY29uc3RydWN0b3IodmFsdWUsIHRva2Vucykge1xuICAgICAgc3VwZXIodmFsdWUsIHRva2Vucyk7XG4gICAgICB0aGlzLnQgPSB0eXBlO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IHAgaW4gcHJvcHMpIHtcbiAgICBUb2tlbi5wcm90b3R5cGVbcF0gPSBwcm9wc1twXTtcbiAgfVxuICBUb2tlbi50ID0gdHlwZTtcbiAgcmV0dXJuIFRva2VuO1xufVxuXG4vKipcblx0UmVwcmVzZW50cyBhIGxpc3Qgb2YgdG9rZW5zIG1ha2luZyB1cCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcbiovXG5jb25zdCBFbWFpbCA9IGNyZWF0ZVRva2VuQ2xhc3MoJ2VtYWlsJywge1xuICBpc0xpbms6IHRydWUsXG4gIHRvSHJlZigpIHtcbiAgICByZXR1cm4gJ21haWx0bzonICsgdGhpcy50b1N0cmluZygpO1xuICB9XG59KTtcblxuLyoqXG5cdFJlcHJlc2VudHMgc29tZSBwbGFpbiB0ZXh0XG4qL1xuY29uc3QgVGV4dCA9IGNyZWF0ZVRva2VuQ2xhc3MoJ3RleHQnKTtcblxuLyoqXG5cdE11bHRpLWxpbmVicmVhayB0b2tlbiAtIHJlcHJlc2VudHMgYSBsaW5lIGJyZWFrXG5cdEBjbGFzcyBObFxuKi9cbmNvbnN0IE5sID0gY3JlYXRlVG9rZW5DbGFzcygnbmwnKTtcblxuLyoqXG5cdFJlcHJlc2VudHMgYSBsaXN0IG9mIHRleHQgdG9rZW5zIG1ha2luZyB1cCBhIHZhbGlkIFVSTFxuXHRAY2xhc3MgVXJsXG4qL1xuY29uc3QgVXJsID0gY3JlYXRlVG9rZW5DbGFzcygndXJsJywge1xuICBpc0xpbms6IHRydWUsXG4gIC8qKlxuICBcdExvd2VyY2FzZXMgcmVsZXZhbnQgcGFydHMgb2YgdGhlIGRvbWFpbiBhbmQgYWRkcyB0aGUgcHJvdG9jb2wgaWZcbiAgXHRyZXF1aXJlZC4gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgZXNjYXBlIHVuc2FmZSBIVE1MIGNoYXJhY3RlcnMgaW4gdGhlXG4gIFx0VVJMLlxuICBcdFx0QHBhcmFtIHtzdHJpbmd9IFtzY2hlbWVdIGRlZmF1bHQgc2NoZW1lIChlLmcuLCAnaHR0cHMnKVxuICBcdEByZXR1cm4ge3N0cmluZ30gdGhlIGZ1bGwgaHJlZlxuICAqL1xuICB0b0hyZWYoc2NoZW1lKSB7XG4gICAgaWYgKHNjaGVtZSA9PT0gdm9pZCAwKSB7XG4gICAgICBzY2hlbWUgPSBkZWZhdWx0cy5kZWZhdWx0UHJvdG9jb2w7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaGFzIGEgcHJlZml4IHNjaGVtZVxuICAgIHJldHVybiB0aGlzLmhhc1Byb3RvY29sKCkgPyB0aGlzLnYgOiBgJHtzY2hlbWV9Oi8vJHt0aGlzLnZ9YDtcbiAgfSxcbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhpcyBVUkwgdG9rZW4gaGFzIGEgcHJvdG9jb2xcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc1Byb3RvY29sKCkge1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMudGs7XG4gICAgcmV0dXJuIHRva2Vucy5sZW5ndGggPj0gMiAmJiB0b2tlbnNbMF0udCAhPT0gTE9DQUxIT1NUICYmIHRva2Vuc1sxXS50ID09PSBDT0xPTjtcbiAgfVxufSk7XG5cbnZhciBtdWx0aSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRNdWx0aVRva2VuOiBNdWx0aVRva2VuLFxuXHRCYXNlOiBNdWx0aVRva2VuLFxuXHRjcmVhdGVUb2tlbkNsYXNzOiBjcmVhdGVUb2tlbkNsYXNzLFxuXHRFbWFpbDogRW1haWwsXG5cdFRleHQ6IFRleHQsXG5cdE5sOiBObCxcblx0VXJsOiBVcmxcbn0pO1xuXG4vKipcblx0Tm90IGV4YWN0bHkgcGFyc2VyLCBtb3JlIGxpa2UgdGhlIHNlY29uZC1zdGFnZSBzY2FubmVyIChhbHRob3VnaCB3ZSBjYW5cblx0dGhlb3JldGljYWxseSBob3Rzd2FwIHRoZSBjb2RlIGhlcmUgd2l0aCBhIHJlYWwgcGFyc2VyIGluIHRoZSBmdXR1cmUuLi4gYnV0XG5cdGZvciBhIGxpdHRsZSBVUkwtZmluZGluZyB1dGlsaXR5IGFic3RyYWN0IHN5bnRheCB0cmVlcyBtYXkgYmUgYSBsaXR0bGVcblx0b3ZlcmtpbGwpLlxuXG5cdFVSTCBmb3JtYXQ6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVJJX3NjaGVtZVxuXHRFbWFpbCBmb3JtYXQ6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1haWxBZGRyZXNzIChsaW5rcyB0byBSRkMgaW5cblx0cmVmZXJlbmNlKVxuXG5cdEBtb2R1bGUgbGlua2lmeVxuXHRAc3VibW9kdWxlIHBhcnNlclxuXHRAbWFpbiBydW5cbiovXG5jb25zdCBtYWtlU3RhdGUgPSBhcmcgPT4gbmV3IFN0YXRlKGFyZyk7XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHBhcnNlciBtdWx0aSB0b2tlbi1iYXNlZCBzdGF0ZSBtYWNoaW5lXG4gKiBAcGFyYW0ge3sgZ3JvdXBzOiBDb2xsZWN0aW9uczxzdHJpbmc+IH19IHRva2Vuc1xuICovXG5mdW5jdGlvbiBpbml0JDEoX3JlZikge1xuICBsZXQge1xuICAgIGdyb3Vwc1xuICB9ID0gX3JlZjtcbiAgLy8gVHlwZXMgb2YgY2hhcmFjdGVycyB0aGUgVVJMIGNhbiBkZWZpbml0ZWx5IGVuZCBpblxuICBjb25zdCBxc0FjY2VwdGluZyA9IGdyb3Vwcy5kb21haW4uY29uY2F0KFtBTVBFUlNBTkQsIEFTVEVSSVNLLCBBVCwgQkFDS1NMQVNILCBCQUNLVElDSywgQ0FSRVQsIERPTExBUiwgRVFVQUxTLCBIWVBIRU4sIE5VTSwgUEVSQ0VOVCwgUElQRSwgUExVUywgUE9VTkQsIFNMQVNILCBTWU0sIFRJTERFLCBVTkRFUlNDT1JFXSk7XG5cbiAgLy8gVHlwZXMgb2YgdG9rZW5zIHRoYXQgY2FuIGZvbGxvdyBhIFVSTCBhbmQgYmUgcGFydCBvZiB0aGUgcXVlcnkgc3RyaW5nXG4gIC8vIGJ1dCBjYW5ub3QgYmUgdGhlIHZlcnkgbGFzdCBjaGFyYWN0ZXJzXG4gIC8vIENoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYXBwZWFyIGluIHRoZSBVUkwgYXQgYWxsIHNob3VsZCBiZSBleGNsdWRlZFxuICBjb25zdCBxc05vbkFjY2VwdGluZyA9IFtBUE9TVFJPUEhFLCBDT0xPTiwgQ09NTUEsIERPVCwgRVhDTEFNQVRJT04sIFFVRVJZLCBRVU9URSwgU0VNSSwgT1BFTkFOR0xFQlJBQ0tFVCwgQ0xPU0VBTkdMRUJSQUNLRVQsIE9QRU5CUkFDRSwgQ0xPU0VCUkFDRSwgQ0xPU0VCUkFDS0VULCBPUEVOQlJBQ0tFVCwgT1BFTlBBUkVOLCBDTE9TRVBBUkVOLCBGVUxMV0lEVEhMRUZUUEFSRU4sIEZVTExXSURUSFJJR0hUUEFSRU4sIExFRlRDT1JORVJCUkFDS0VULCBSSUdIVENPUk5FUkJSQUNLRVQsIExFRlRXSElURUNPUk5FUkJSQUNLRVQsIFJJR0hUV0hJVEVDT1JORVJCUkFDS0VULCBGVUxMV0lEVEhMRVNTVEhBTiwgRlVMTFdJRFRIR1JFQVRFUlRIQU5dO1xuXG4gIC8vIEZvciBhZGRyZXNzZXMgd2l0aG91dCB0aGUgbWFpbHRvIHByZWZpeFxuICAvLyBUb2tlbnMgYWxsb3dlZCBpbiB0aGUgbG9jYWxwYXJ0IG9mIHRoZSBlbWFpbFxuICBjb25zdCBsb2NhbHBhcnRBY2NlcHRpbmcgPSBbQU1QRVJTQU5ELCBBUE9TVFJPUEhFLCBBU1RFUklTSywgQkFDS1NMQVNILCBCQUNLVElDSywgQ0FSRVQsIERPTExBUiwgRVFVQUxTLCBIWVBIRU4sIE9QRU5CUkFDRSwgQ0xPU0VCUkFDRSwgUEVSQ0VOVCwgUElQRSwgUExVUywgUE9VTkQsIFFVRVJZLCBTTEFTSCwgU1lNLCBUSUxERSwgVU5ERVJTQ09SRV07XG5cbiAgLy8gVGhlIHVuaXZlcnNhbCBzdGFydGluZyBzdGF0ZS5cbiAgLyoqXG4gICAqIEB0eXBlIFN0YXRlPFRva2VuPlxuICAgKi9cbiAgY29uc3QgU3RhcnQgPSBtYWtlU3RhdGUoKTtcbiAgY29uc3QgTG9jYWxwYXJ0ID0gdHQoU3RhcnQsIFRJTERFKTsgLy8gTG9jYWwgcGFydCBvZiB0aGUgZW1haWwgYWRkcmVzc1xuICB0YShMb2NhbHBhcnQsIGxvY2FscGFydEFjY2VwdGluZywgTG9jYWxwYXJ0KTtcbiAgdGEoTG9jYWxwYXJ0LCBncm91cHMuZG9tYWluLCBMb2NhbHBhcnQpO1xuICBjb25zdCBEb21haW4gPSBtYWtlU3RhdGUoKSxcbiAgICBTY2hlbWUgPSBtYWtlU3RhdGUoKSxcbiAgICBTbGFzaFNjaGVtZSA9IG1ha2VTdGF0ZSgpO1xuICB0YShTdGFydCwgZ3JvdXBzLmRvbWFpbiwgRG9tYWluKTsgLy8gcGFyc2VkIHN0cmluZyBlbmRzIHdpdGggYSBwb3RlbnRpYWwgZG9tYWluIG5hbWUgKEEpXG4gIHRhKFN0YXJ0LCBncm91cHMuc2NoZW1lLCBTY2hlbWUpOyAvLyBlLmcuLCAnbWFpbHRvJ1xuICB0YShTdGFydCwgZ3JvdXBzLnNsYXNoc2NoZW1lLCBTbGFzaFNjaGVtZSk7IC8vIGUuZy4sICdodHRwJ1xuXG4gIHRhKERvbWFpbiwgbG9jYWxwYXJ0QWNjZXB0aW5nLCBMb2NhbHBhcnQpO1xuICB0YShEb21haW4sIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIGNvbnN0IExvY2FscGFydEF0ID0gdHQoRG9tYWluLCBBVCk7IC8vIExvY2FsIHBhcnQgb2YgdGhlIGVtYWlsIGFkZHJlc3MgcGx1cyBAXG5cbiAgdHQoTG9jYWxwYXJ0LCBBVCwgTG9jYWxwYXJ0QXQpOyAvLyBjbG9zZSB0byBhbiBlbWFpbCBhZGRyZXNzIG5vd1xuXG4gIC8vIExvY2FsIHBhcnQgb2YgYW4gZW1haWwgYWRkcmVzcyBjYW4gYmUgZS5nLiAnaHR0cCcgb3IgJ21haWx0bydcbiAgdHQoU2NoZW1lLCBBVCwgTG9jYWxwYXJ0QXQpO1xuICB0dChTbGFzaFNjaGVtZSwgQVQsIExvY2FscGFydEF0KTtcbiAgY29uc3QgTG9jYWxwYXJ0RG90ID0gdHQoTG9jYWxwYXJ0LCBET1QpOyAvLyBMb2NhbCBwYXJ0IG9mIHRoZSBlbWFpbCBhZGRyZXNzIHBsdXMgJy4nIChsb2NhbHBhcnQgY2Fubm90IGVuZCBpbiAuKVxuICB0YShMb2NhbHBhcnREb3QsIGxvY2FscGFydEFjY2VwdGluZywgTG9jYWxwYXJ0KTtcbiAgdGEoTG9jYWxwYXJ0RG90LCBncm91cHMuZG9tYWluLCBMb2NhbHBhcnQpO1xuICBjb25zdCBFbWFpbERvbWFpbiA9IG1ha2VTdGF0ZSgpO1xuICB0YShMb2NhbHBhcnRBdCwgZ3JvdXBzLmRvbWFpbiwgRW1haWxEb21haW4pOyAvLyBwYXJzZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIGxvY2FsIGVtYWlsIGluZm8gKyBAIHdpdGggYSBwb3RlbnRpYWwgZG9tYWluIG5hbWVcbiAgdGEoRW1haWxEb21haW4sIGdyb3Vwcy5kb21haW4sIEVtYWlsRG9tYWluKTtcbiAgY29uc3QgRW1haWxEb21haW5Eb3QgPSB0dChFbWFpbERvbWFpbiwgRE9UKTsgLy8gZG9tYWluIGZvbGxvd2VkIGJ5IERPVFxuICB0YShFbWFpbERvbWFpbkRvdCwgZ3JvdXBzLmRvbWFpbiwgRW1haWxEb21haW4pO1xuICBjb25zdCBFbWFpbCQxID0gbWFrZVN0YXRlKEVtYWlsKTsgLy8gUG9zc2libGUgZW1haWwgYWRkcmVzcyAoY291bGQgaGF2ZSBtb3JlIHRsZHMpXG4gIHRhKEVtYWlsRG9tYWluRG90LCBncm91cHMudGxkLCBFbWFpbCQxKTtcbiAgdGEoRW1haWxEb21haW5Eb3QsIGdyb3Vwcy51dGxkLCBFbWFpbCQxKTtcbiAgdHQoTG9jYWxwYXJ0QXQsIExPQ0FMSE9TVCwgRW1haWwkMSk7XG5cbiAgLy8gSHlwaGVuIGNhbiBqdW1wIGJhY2sgdG8gYSBkb21haW4gbmFtZVxuICBjb25zdCBFbWFpbERvbWFpbkh5cGhlbiA9IHR0KEVtYWlsRG9tYWluLCBIWVBIRU4pOyAvLyBwYXJzZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIGxvY2FsIGVtYWlsIGluZm8gKyBAIHdpdGggYSBwb3RlbnRpYWwgZG9tYWluIG5hbWVcbiAgdGEoRW1haWxEb21haW5IeXBoZW4sIGdyb3Vwcy5kb21haW4sIEVtYWlsRG9tYWluKTtcbiAgdGEoRW1haWwkMSwgZ3JvdXBzLmRvbWFpbiwgRW1haWxEb21haW4pO1xuICB0dChFbWFpbCQxLCBET1QsIEVtYWlsRG9tYWluRG90KTtcbiAgdHQoRW1haWwkMSwgSFlQSEVOLCBFbWFpbERvbWFpbkh5cGhlbik7XG5cbiAgLy8gRmluYWwgcG9zc2libGUgZW1haWwgc3RhdGVzXG4gIGNvbnN0IEVtYWlsQ29sb24gPSB0dChFbWFpbCQxLCBDT0xPTik7IC8vIFVSTCBmb2xsb3dlZCBieSBjb2xvbiAocG90ZW50aWFsIHBvcnQgbnVtYmVyIGhlcmUpXG4gIC8qY29uc3QgRW1haWxDb2xvblBvcnQgPSAqL1xuICB0YShFbWFpbENvbG9uLCBncm91cHMubnVtZXJpYywgRW1haWwpOyAvLyBVUkwgZm9sbG93ZWQgYnkgY29sb24gYW5kIHBvcnQgbnVtYmVyXG5cbiAgLy8gQWNjb3VudCBmb3IgZG90cyBhbmQgaHlwaGVucy4gSHlwaGVucyBhcmUgdXN1YWxseSBwYXJ0cyBvZiBkb21haW4gbmFtZXNcbiAgLy8gKGJ1dCBub3QgVExEcylcbiAgY29uc3QgRG9tYWluSHlwaGVuID0gdHQoRG9tYWluLCBIWVBIRU4pOyAvLyBkb21haW4gZm9sbG93ZWQgYnkgaHlwaGVuXG4gIGNvbnN0IERvbWFpbkRvdCA9IHR0KERvbWFpbiwgRE9UKTsgLy8gZG9tYWluIGZvbGxvd2VkIGJ5IERPVFxuICB0YShEb21haW5IeXBoZW4sIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIHRhKERvbWFpbkRvdCwgbG9jYWxwYXJ0QWNjZXB0aW5nLCBMb2NhbHBhcnQpO1xuICB0YShEb21haW5Eb3QsIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIGNvbnN0IERvbWFpbkRvdFRsZCA9IG1ha2VTdGF0ZShVcmwpOyAvLyBTaW1wbGVzdCBwb3NzaWJsZSBVUkwgd2l0aCBubyBxdWVyeSBzdHJpbmdcbiAgdGEoRG9tYWluRG90LCBncm91cHMudGxkLCBEb21haW5Eb3RUbGQpO1xuICB0YShEb21haW5Eb3QsIGdyb3Vwcy51dGxkLCBEb21haW5Eb3RUbGQpO1xuICB0YShEb21haW5Eb3RUbGQsIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIHRhKERvbWFpbkRvdFRsZCwgbG9jYWxwYXJ0QWNjZXB0aW5nLCBMb2NhbHBhcnQpO1xuICB0dChEb21haW5Eb3RUbGQsIERPVCwgRG9tYWluRG90KTtcbiAgdHQoRG9tYWluRG90VGxkLCBIWVBIRU4sIERvbWFpbkh5cGhlbik7XG4gIHR0KERvbWFpbkRvdFRsZCwgQVQsIExvY2FscGFydEF0KTtcbiAgY29uc3QgRG9tYWluRG90VGxkQ29sb24gPSB0dChEb21haW5Eb3RUbGQsIENPTE9OKTsgLy8gVVJMIGZvbGxvd2VkIGJ5IGNvbG9uIChwb3RlbnRpYWwgcG9ydCBudW1iZXIgaGVyZSlcbiAgY29uc3QgRG9tYWluRG90VGxkQ29sb25Qb3J0ID0gbWFrZVN0YXRlKFVybCk7IC8vIFRMRCBmb2xsb3dlZCBieSBhIHBvcnQgbnVtYmVyXG4gIHRhKERvbWFpbkRvdFRsZENvbG9uLCBncm91cHMubnVtZXJpYywgRG9tYWluRG90VGxkQ29sb25Qb3J0KTtcblxuICAvLyBMb25nIFVSTCB3aXRoIG9wdGlvbmFsIHBvcnQgYW5kIG1heWJlIHF1ZXJ5IHN0cmluZ1xuICBjb25zdCBVcmwkMSA9IG1ha2VTdGF0ZShVcmwpO1xuXG4gIC8vIFVSTCB3aXRoIGV4dHJhIHN5bWJvbHMgYXQgdGhlIGVuZCwgZm9sbG93ZWQgYnkgYW4gb3BlbmluZyBicmFja2V0XG4gIGNvbnN0IFVybE5vbmFjY2VwdCA9IG1ha2VTdGF0ZSgpOyAvLyBVUkwgZm9sbG93ZWQgYnkgc29tZSBzeW1ib2xzICh3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBmaW5hbCBVUkwpXG5cbiAgLy8gUXVlcnkgc3RyaW5nc1xuICB0YShVcmwkMSwgcXNBY2NlcHRpbmcsIFVybCQxKTtcbiAgdGEoVXJsJDEsIHFzTm9uQWNjZXB0aW5nLCBVcmxOb25hY2NlcHQpO1xuICB0YShVcmxOb25hY2NlcHQsIHFzQWNjZXB0aW5nLCBVcmwkMSk7XG4gIHRhKFVybE5vbmFjY2VwdCwgcXNOb25BY2NlcHRpbmcsIFVybE5vbmFjY2VwdCk7XG5cbiAgLy8gQmVjb21lIHJlYWwgVVJMcyBhZnRlciBgU0xBU0hgIG9yIGBDT0xPTiBOVU0gU0xBU0hgXG4gIC8vIEhlcmUgd29ya3Mgd2l0aCBvciB3aXRob3V0IHNjaGVtZTovLyBwcmVmaXhcbiAgdHQoRG9tYWluRG90VGxkLCBTTEFTSCwgVXJsJDEpO1xuICB0dChEb21haW5Eb3RUbGRDb2xvblBvcnQsIFNMQVNILCBVcmwkMSk7XG5cbiAgLy8gTm90ZSB0aGF0IGRvbWFpbnMgdGhhdCBiZWdpbiB3aXRoIHNjaGVtZXMgYXJlIHRyZWF0ZWQgc2xpZ2hseSBkaWZmZXJlbnRseVxuICBjb25zdCBTY2hlbWVDb2xvbiA9IHR0KFNjaGVtZSwgQ09MT04pOyAvLyBlLmcuLCAnbWFpbHRvOidcbiAgY29uc3QgU2xhc2hTY2hlbWVDb2xvbiA9IHR0KFNsYXNoU2NoZW1lLCBDT0xPTik7IC8vIGUuZy4sICdodHRwOidcbiAgY29uc3QgU2xhc2hTY2hlbWVDb2xvblNsYXNoID0gdHQoU2xhc2hTY2hlbWVDb2xvbiwgU0xBU0gpOyAvLyBlLmcuLCAnaHR0cDovJ1xuXG4gIGNvbnN0IFVyaVByZWZpeCA9IHR0KFNsYXNoU2NoZW1lQ29sb25TbGFzaCwgU0xBU0gpOyAvLyBlLmcuLCAnaHR0cDovLydcblxuICAvLyBTY2hlbWUgc3RhdGVzIGNhbiB0cmFuc2l0aW9uIHRvIGRvbWFpbiBzdGF0ZXNcbiAgdGEoU2NoZW1lLCBncm91cHMuZG9tYWluLCBEb21haW4pO1xuICB0dChTY2hlbWUsIERPVCwgRG9tYWluRG90KTtcbiAgdHQoU2NoZW1lLCBIWVBIRU4sIERvbWFpbkh5cGhlbik7XG4gIHRhKFNsYXNoU2NoZW1lLCBncm91cHMuZG9tYWluLCBEb21haW4pO1xuICB0dChTbGFzaFNjaGVtZSwgRE9ULCBEb21haW5Eb3QpO1xuICB0dChTbGFzaFNjaGVtZSwgSFlQSEVOLCBEb21haW5IeXBoZW4pO1xuXG4gIC8vIEZvcmNlIFVSTCB3aXRoIHNjaGVtZSBwcmVmaXggZm9sbG93ZWQgYnkgYW55dGhpbmcgc2FuZVxuICB0YShTY2hlbWVDb2xvbiwgZ3JvdXBzLmRvbWFpbiwgVXJsJDEpO1xuICB0dChTY2hlbWVDb2xvbiwgU0xBU0gsIFVybCQxKTtcbiAgdGEoVXJpUHJlZml4LCBncm91cHMuZG9tYWluLCBVcmwkMSk7XG4gIHRhKFVyaVByZWZpeCwgcXNBY2NlcHRpbmcsIFVybCQxKTtcbiAgdHQoVXJpUHJlZml4LCBTTEFTSCwgVXJsJDEpO1xuICBjb25zdCBicmFja2V0UGFpcnMgPSBbW09QRU5CUkFDRSwgQ0xPU0VCUkFDRV0sXG4gIC8vIHt9XG4gIFtPUEVOQlJBQ0tFVCwgQ0xPU0VCUkFDS0VUXSxcbiAgLy8gW11cbiAgW09QRU5QQVJFTiwgQ0xPU0VQQVJFTl0sXG4gIC8vICgpXG4gIFtPUEVOQU5HTEVCUkFDS0VULCBDTE9TRUFOR0xFQlJBQ0tFVF0sXG4gIC8vIDw+XG4gIFtGVUxMV0lEVEhMRUZUUEFSRU4sIEZVTExXSURUSFJJR0hUUEFSRU5dLFxuICAvLyBcdUZGMDhcdUZGMDlcbiAgW0xFRlRDT1JORVJCUkFDS0VULCBSSUdIVENPUk5FUkJSQUNLRVRdLFxuICAvLyBcdTMwMENcdTMwMERcbiAgW0xFRlRXSElURUNPUk5FUkJSQUNLRVQsIFJJR0hUV0hJVEVDT1JORVJCUkFDS0VUXSxcbiAgLy8gXHUzMDBFXHUzMDBGXG4gIFtGVUxMV0lEVEhMRVNTVEhBTiwgRlVMTFdJRFRIR1JFQVRFUlRIQU5dIC8vIFx1RkYxQ1x1RkYxRVxuICBdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhY2tldFBhaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgW09QRU4sIENMT1NFXSA9IGJyYWNrZXRQYWlyc1tpXTtcbiAgICBjb25zdCBVcmxPcGVuID0gdHQoVXJsJDEsIE9QRU4pOyAvLyBVUkwgZm9sbG93ZWQgYnkgb3BlbiBicmFja2V0XG5cbiAgICAvLyBDb250aW51ZSBub3QgYWNjZXB0aW5nIGZvciBvcGVuIGJyYWNrZXRzXG4gICAgdHQoVXJsTm9uYWNjZXB0LCBPUEVOLCBVcmxPcGVuKTtcblxuICAgIC8vIENsb3NpbmcgYnJhY2tldCBjb21wb25lbnQuIFRoaXMgY2hhcmFjdGVyIFdJTEwgYmUgaW5jbHVkZWQgaW4gdGhlIFVSTFxuICAgIHR0KFVybE9wZW4sIENMT1NFLCBVcmwkMSk7XG5cbiAgICAvLyBVUkwgdGhhdCBiZWluZ3Mgd2l0aCBhbiBvcGVuaW5nIGJyYWNrZXQsIGZvbGxvd2VkIGJ5IGEgc3ltYm9scy5cbiAgICAvLyBOb3RlIHRoYXQgdGhlIGZpbmFsIHN0YXRlIGNhbiBzdGlsbCBiZSBgVXJsT3BlbmAgKGlmIHRoZSBVUkwgaGFzIGFcbiAgICAvLyBzaW5nbGUgb3BlbmluZyBicmFja2V0IGZvciBzb21lIHJlYXNvbikuXG4gICAgY29uc3QgVXJsT3BlblEgPSBtYWtlU3RhdGUoVXJsKTtcbiAgICB0YShVcmxPcGVuLCBxc0FjY2VwdGluZywgVXJsT3BlblEpO1xuICAgIGNvbnN0IFVybE9wZW5TeW1zID0gbWFrZVN0YXRlKCk7IC8vIFVybE9wZW4gZm9sbG93ZWQgYnkgc29tZSBzeW1ib2xzIGl0IGNhbm5vdCBlbmQgaXRcbiAgICB0YShVcmxPcGVuLCBxc05vbkFjY2VwdGluZyk7XG5cbiAgICAvLyBVUkwgdGhhdCBiZWdpbnMgd2l0aCBhbiBvcGVuaW5nIGJyYWNrZXQsIGZvbGxvd2VkIGJ5IHNvbWUgc3ltYm9sc1xuICAgIHRhKFVybE9wZW5RLCBxc0FjY2VwdGluZywgVXJsT3BlblEpO1xuICAgIHRhKFVybE9wZW5RLCBxc05vbkFjY2VwdGluZywgVXJsT3BlblN5bXMpO1xuICAgIHRhKFVybE9wZW5TeW1zLCBxc0FjY2VwdGluZywgVXJsT3BlblEpO1xuICAgIHRhKFVybE9wZW5TeW1zLCBxc05vbkFjY2VwdGluZywgVXJsT3BlblN5bXMpO1xuXG4gICAgLy8gQ2xvc2UgYnJhY2UvYnJhY2tldCB0byBiZWNvbWUgcmVndWxhciBVUkxcbiAgICB0dChVcmxPcGVuUSwgQ0xPU0UsIFVybCQxKTtcbiAgICB0dChVcmxPcGVuU3ltcywgQ0xPU0UsIFVybCQxKTtcbiAgfVxuICB0dChTdGFydCwgTE9DQUxIT1NULCBEb21haW5Eb3RUbGQpOyAvLyBsb2NhbGhvc3QgaXMgYSB2YWxpZCBVUkwgc3RhdGVcbiAgdHQoU3RhcnQsIE5MJDEsIE5sKTsgLy8gc2luZ2xlIG5ldyBsaW5lXG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogU3RhcnQsXG4gICAgdG9rZW5zOiB0a1xuICB9O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGFyc2VyIHN0YXRlIG1hY2hpbmUgb24gYSBsaXN0IG9mIHNjYW5uZWQgc3RyaW5nLWJhc2VkIHRva2VucyB0b1xuICogY3JlYXRlIGEgbGlzdCBvZiBtdWx0aSB0b2tlbnMsIGVhY2ggb2Ygd2hpY2ggcmVwcmVzZW50cyBhIFVSTCwgZW1haWwgYWRkcmVzcyxcbiAqIHBsYWluIHRleHQsIGV0Yy5cbiAqXG4gKiBAcGFyYW0ge1N0YXRlPE11bHRpVG9rZW4+fSBzdGFydCBwYXJzZXIgc3RhcnQgc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCB0aGUgb3JpZ2luYWwgaW5wdXQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2l2ZW4gdG9rZW5zXG4gKiBAcGFyYW0ge1Rva2VuW119IHRva2VucyBsaXN0IG9mIHNjYW5uZWQgdG9rZW5zXG4gKiBAcmV0dXJucyB7TXVsdGlUb2tlbltdfVxuICovXG5mdW5jdGlvbiBydW4oc3RhcnQsIGlucHV0LCB0b2tlbnMpIHtcbiAgbGV0IGxlbiA9IHRva2Vucy5sZW5ndGg7XG4gIGxldCBjdXJzb3IgPSAwO1xuICBsZXQgbXVsdGlzID0gW107XG4gIGxldCB0ZXh0VG9rZW5zID0gW107XG4gIHdoaWxlIChjdXJzb3IgPCBsZW4pIHtcbiAgICBsZXQgc3RhdGUgPSBzdGFydDtcbiAgICBsZXQgc2Vjb25kU3RhdGUgPSBudWxsO1xuICAgIGxldCBuZXh0U3RhdGUgPSBudWxsO1xuICAgIGxldCBtdWx0aUxlbmd0aCA9IDA7XG4gICAgbGV0IGxhdGVzdEFjY2VwdGluZyA9IG51bGw7XG4gICAgbGV0IHNpbmNlQWNjZXB0cyA9IC0xO1xuICAgIHdoaWxlIChjdXJzb3IgPCBsZW4gJiYgIShzZWNvbmRTdGF0ZSA9IHN0YXRlLmdvKHRva2Vuc1tjdXJzb3JdLnQpKSkge1xuICAgICAgLy8gU3RhcnRpbmcgdG9rZW5zIHdpdGggbm93aGVyZSB0byBqdW1wIHRvLlxuICAgICAgLy8gQ29uc2lkZXIgdGhlc2UgdG8gYmUganVzdCBwbGFpbiB0ZXh0XG4gICAgICB0ZXh0VG9rZW5zLnB1c2godG9rZW5zW2N1cnNvcisrXSk7XG4gICAgfVxuICAgIHdoaWxlIChjdXJzb3IgPCBsZW4gJiYgKG5leHRTdGF0ZSA9IHNlY29uZFN0YXRlIHx8IHN0YXRlLmdvKHRva2Vuc1tjdXJzb3JdLnQpKSkge1xuICAgICAgLy8gR2V0IHRoZSBuZXh0IHN0YXRlXG4gICAgICBzZWNvbmRTdGF0ZSA9IG51bGw7XG4gICAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGF0ZXN0IGFjY2VwdGluZyBzdGF0ZVxuICAgICAgaWYgKHN0YXRlLmFjY2VwdHMoKSkge1xuICAgICAgICBzaW5jZUFjY2VwdHMgPSAwO1xuICAgICAgICBsYXRlc3RBY2NlcHRpbmcgPSBzdGF0ZTtcbiAgICAgIH0gZWxzZSBpZiAoc2luY2VBY2NlcHRzID49IDApIHtcbiAgICAgICAgc2luY2VBY2NlcHRzKys7XG4gICAgICB9XG4gICAgICBjdXJzb3IrKztcbiAgICAgIG11bHRpTGVuZ3RoKys7XG4gICAgfVxuICAgIGlmIChzaW5jZUFjY2VwdHMgPCAwKSB7XG4gICAgICAvLyBObyBhY2NlcHRpbmcgc3RhdGUgd2FzIGZvdW5kLCBwYXJ0IG9mIGEgcmVndWxhciB0ZXh0IHRva2VuIGFkZFxuICAgICAgLy8gdGhlIGZpcnN0IHRleHQgdG9rZW4gdG8gdGhlIHRleHQgdG9rZW5zIGFycmF5IGFuZCB0cnkgYWdhaW4gZnJvbVxuICAgICAgLy8gdGhlIG5leHRcbiAgICAgIGN1cnNvciAtPSBtdWx0aUxlbmd0aDtcbiAgICAgIGlmIChjdXJzb3IgPCBsZW4pIHtcbiAgICAgICAgdGV4dFRva2Vucy5wdXNoKHRva2Vuc1tjdXJzb3JdKTtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFjY2VwdGluZyBzdGF0ZSFcbiAgICAgIC8vIEZpcnN0IGNsb3NlIG9mZiB0aGUgdGV4dFRva2VucyAoaWYgYXZhaWxhYmxlKVxuICAgICAgaWYgKHRleHRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBtdWx0aXMucHVzaChpbml0TXVsdGlUb2tlbihUZXh0LCBpbnB1dCwgdGV4dFRva2VucykpO1xuICAgICAgICB0ZXh0VG9rZW5zID0gW107XG4gICAgICB9XG5cbiAgICAgIC8vIFJvbGwgYmFjayB0byB0aGUgbGF0ZXN0IGFjY2VwdGluZyBzdGF0ZVxuICAgICAgY3Vyc29yIC09IHNpbmNlQWNjZXB0cztcbiAgICAgIG11bHRpTGVuZ3RoIC09IHNpbmNlQWNjZXB0cztcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IG11bHRpdG9rZW5cbiAgICAgIGNvbnN0IE11bHRpID0gbGF0ZXN0QWNjZXB0aW5nLnQ7XG4gICAgICBjb25zdCBzdWJ0b2tlbnMgPSB0b2tlbnMuc2xpY2UoY3Vyc29yIC0gbXVsdGlMZW5ndGgsIGN1cnNvcik7XG4gICAgICBtdWx0aXMucHVzaChpbml0TXVsdGlUb2tlbihNdWx0aSwgaW5wdXQsIHN1YnRva2VucykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmFsbHkgY2xvc2Ugb2ZmIHRoZSB0ZXh0VG9rZW5zIChpZiBhdmFpbGFibGUpXG4gIGlmICh0ZXh0VG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICBtdWx0aXMucHVzaChpbml0TXVsdGlUb2tlbihUZXh0LCBpbnB1dCwgdGV4dFRva2VucykpO1xuICB9XG4gIHJldHVybiBtdWx0aXM7XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgaW5zdGFudGlhdGluZyBhIG5ldyBtdWx0aXRva2VuIHdpdGggYWxsIHRoZSByZWxldmFudFxuICogZmllbGRzIGR1cmluZyBwYXJzaW5nLlxuICogQHBhcmFtIHtuZXcgKHZhbHVlOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSkgPT4gTXVsdGlUb2tlbn0gTXVsdGkgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBvcmlnaW5hbCBpbnB1dCBzdHJpbmdcbiAqIEBwYXJhbSB7VG9rZW5bXX0gdG9rZW5zIGNvbnNlY3V0aXZlIHRva2VucyBzY2FubmVkIGZyb20gaW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7TXVsdGlUb2tlbn1cbiAqL1xuZnVuY3Rpb24gaW5pdE11bHRpVG9rZW4oTXVsdGksIGlucHV0LCB0b2tlbnMpIHtcbiAgY29uc3Qgc3RhcnRJZHggPSB0b2tlbnNbMF0ucztcbiAgY29uc3QgZW5kSWR4ID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5lO1xuICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHgpO1xuICByZXR1cm4gbmV3IE11bHRpKHZhbHVlLCB0b2tlbnMpO1xufVxuXG5jb25zdCB3YXJuID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUgJiYgY29uc29sZS53YXJuIHx8ICgoKSA9PiB7fSk7XG5jb25zdCB3YXJuQWR2aWNlID0gJ3VudGlsIG1hbnVhbCBjYWxsIG9mIGxpbmtpZnkuaW5pdCgpLiBSZWdpc3RlciBhbGwgc2NoZW1lcyBhbmQgcGx1Z2lucyBiZWZvcmUgaW52b2tpbmcgbGlua2lmeSB0aGUgZmlyc3QgdGltZS4nO1xuXG4vLyBTaWRlLWVmZmVjdCBpbml0aWFsaXphdGlvbiBzdGF0ZVxuY29uc3QgSU5JVCA9IHtcbiAgc2Nhbm5lcjogbnVsbCxcbiAgcGFyc2VyOiBudWxsLFxuICB0b2tlblF1ZXVlOiBbXSxcbiAgcGx1Z2luUXVldWU6IFtdLFxuICBjdXN0b21TY2hlbWVzOiBbXSxcbiAgaW5pdGlhbGl6ZWQ6IGZhbHNlXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiBcdHN0YXJ0OiBTdGF0ZTxzdHJpbmc+LFxuICogXHR0b2tlbnM6IHsgZ3JvdXBzOiBDb2xsZWN0aW9uczxzdHJpbmc+IH0gJiB0eXBlb2YgdGtcbiAqIH19IFNjYW5uZXJJbml0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogXHRzdGFydDogU3RhdGU8TXVsdGlUb2tlbj4sXG4gKiBcdHRva2VuczogdHlwZW9mIG11bHRpXG4gKiB9fSBQYXJzZXJJbml0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFyZzogeyBzY2FubmVyOiBTY2FubmVySW5pdCB9KSA9PiB2b2lkfSBUb2tlblBsdWdpblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmc6IHsgc2Nhbm5lcjogU2Nhbm5lckluaXQsIHBhcnNlcjogUGFyc2VySW5pdCB9KSA9PiB2b2lkfSBQbHVnaW5cbiAqL1xuXG4vKipcbiAqIERlLXJlZ2lzdGVyIGFsbCBwbHVnaW5zIGFuZCByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGUtbWFjaGluZS4gVXNlZCBmb3JcbiAqIHRlc3Rpbmc7IG5vdCByZXF1aXJlZCBpbiBwcmFjdGljZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc2V0KCkge1xuICBTdGF0ZS5ncm91cHMgPSB7fTtcbiAgSU5JVC5zY2FubmVyID0gbnVsbDtcbiAgSU5JVC5wYXJzZXIgPSBudWxsO1xuICBJTklULnRva2VuUXVldWUgPSBbXTtcbiAgSU5JVC5wbHVnaW5RdWV1ZSA9IFtdO1xuICBJTklULmN1c3RvbVNjaGVtZXMgPSBbXTtcbiAgSU5JVC5pbml0aWFsaXplZCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgdG9rZW4gcGx1Z2luIHRvIGFsbG93IHRoZSBzY2FubmVyIHRvIHJlY29nbml6ZSBhZGRpdGlvbmFsIHRva2VuXG4gKiB0eXBlcyBiZWZvcmUgdGhlIHBhcnNlciBzdGF0ZSBtYWNoaW5lIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHJlc3VsdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBvZiBwbHVnaW4gdG8gcmVnaXN0ZXJcbiAqIEBwYXJhbSB7VG9rZW5QbHVnaW59IHBsdWdpbiBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHNjYW5uZXIgc3RhdGUgbWFjaGluZVxuICogYW5kIGF2YWlsYWJsZSBzY2FubmVyIHRva2VucyBhbmQgY29sbGVjdGlvbnMgYW5kIGV4dGVuZHMgdGhlIHN0YXRlIG1hY2hpbmUgdG9cbiAqIHJlY29nbml6ZSBhZGRpdGlvbmFsIHRva2VucyBvciBncm91cHMuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyVG9rZW5QbHVnaW4obmFtZSwgcGx1Z2luKSB7XG4gIGlmICh0eXBlb2YgcGx1Z2luICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsaW5raWZ5anM6IEludmFsaWQgdG9rZW4gcGx1Z2luICR7cGx1Z2lufSAoZXhwZWN0cyBmdW5jdGlvbilgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IElOSVQudG9rZW5RdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChuYW1lID09PSBJTklULnRva2VuUXVldWVbaV1bMF0pIHtcbiAgICAgIHdhcm4oYGxpbmtpZnlqczogdG9rZW4gcGx1Z2luIFwiJHtuYW1lfVwiIGFscmVhZHkgcmVnaXN0ZXJlZCAtIHdpbGwgYmUgb3ZlcndyaXR0ZW5gKTtcbiAgICAgIElOSVQudG9rZW5RdWV1ZVtpXSA9IFtuYW1lLCBwbHVnaW5dO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBJTklULnRva2VuUXVldWUucHVzaChbbmFtZSwgcGx1Z2luXSk7XG4gIGlmIChJTklULmluaXRpYWxpemVkKSB7XG4gICAgd2FybihgbGlua2lmeWpzOiBhbHJlYWR5IGluaXRpYWxpemVkIC0gd2lsbCBub3QgcmVnaXN0ZXIgdG9rZW4gcGx1Z2luIFwiJHtuYW1lfVwiICR7d2FybkFkdmljZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgbGlua2lmeSBwbHVnaW5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG9mIHBsdWdpbiB0byByZWdpc3RlclxuICogQHBhcmFtIHtQbHVnaW59IHBsdWdpbiBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHBhcnNlciBzdGF0ZSBtYWNoaW5lIGFuZFxuICogZXh0ZW5kcyB0aGUgcGFyc2VyIHRvIHJlY29nbml6ZSBhZGRpdGlvbmFsIGxpbmsgdHlwZXNcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4obmFtZSwgcGx1Z2luKSB7XG4gIGlmICh0eXBlb2YgcGx1Z2luICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsaW5raWZ5anM6IEludmFsaWQgcGx1Z2luICR7cGx1Z2lufSAoZXhwZWN0cyBmdW5jdGlvbilgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IElOSVQucGx1Z2luUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobmFtZSA9PT0gSU5JVC5wbHVnaW5RdWV1ZVtpXVswXSkge1xuICAgICAgd2FybihgbGlua2lmeWpzOiBwbHVnaW4gXCIke25hbWV9XCIgYWxyZWFkeSByZWdpc3RlcmVkIC0gd2lsbCBiZSBvdmVyd3JpdHRlbmApO1xuICAgICAgSU5JVC5wbHVnaW5RdWV1ZVtpXSA9IFtuYW1lLCBwbHVnaW5dO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBJTklULnBsdWdpblF1ZXVlLnB1c2goW25hbWUsIHBsdWdpbl0pO1xuICBpZiAoSU5JVC5pbml0aWFsaXplZCkge1xuICAgIHdhcm4oYGxpbmtpZnlqczogYWxyZWFkeSBpbml0aWFsaXplZCAtIHdpbGwgbm90IHJlZ2lzdGVyIHBsdWdpbiBcIiR7bmFtZX1cIiAke3dhcm5BZHZpY2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgVVJMcyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm90b2NvbC4gQW55dGhpbmcgd2l0aCBmb3JtYXRcbiAqIFwicHJvdG9jb2w6Ly8uLi5cIiB3aWxsIGJlIGNvbnNpZGVyZWQgYSBsaW5rLiBJZiBgb3B0aW9uYWxTbGFzaFNsYXNoYCBpcyBzZXQgdG9cbiAqIGB0cnVlYCwgYW55dGhpbmcgd2l0aCBmb3JtYXQgXCJwcm90b2NvbDouLi5cIiB3aWxsIGJlIGNvbnNpZGVyZWQgYSBsaW5rLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3RvY29sXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25hbFNsYXNoU2xhc2hdXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tUHJvdG9jb2woc2NoZW1lLCBvcHRpb25hbFNsYXNoU2xhc2gpIHtcbiAgaWYgKG9wdGlvbmFsU2xhc2hTbGFzaCA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9uYWxTbGFzaFNsYXNoID0gZmFsc2U7XG4gIH1cbiAgaWYgKElOSVQuaW5pdGlhbGl6ZWQpIHtcbiAgICB3YXJuKGBsaW5raWZ5anM6IGFscmVhZHkgaW5pdGlhbGl6ZWQgLSB3aWxsIG5vdCByZWdpc3RlciBjdXN0b20gc2NoZW1lIFwiJHtzY2hlbWV9XCIgJHt3YXJuQWR2aWNlfWApO1xuICB9XG4gIGlmICghL15bMC05YS16XSsoLVswLTlhLXpdKykqJC8udGVzdChzY2hlbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsaW5raWZ5anM6IGluY29ycmVjdCBzY2hlbWUgZm9ybWF0LlxuMS4gTXVzdCBvbmx5IGNvbnRhaW4gZGlnaXRzLCBsb3dlcmNhc2UgQVNDSUkgbGV0dGVycyBvciBcIi1cIlxuMi4gQ2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIFwiLVwiXG4zLiBcIi1cIiBjYW5ub3QgcmVwZWF0YCk7XG4gIH1cbiAgSU5JVC5jdXN0b21TY2hlbWVzLnB1c2goW3NjaGVtZSwgb3B0aW9uYWxTbGFzaFNsYXNoXSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgbGlua2lmeSBzdGF0ZSBtYWNoaW5lLiBDYWxsZWQgYXV0b21hdGljYWxseSB0aGUgZmlyc3QgdGltZVxuICogbGlua2lmeSBpcyBjYWxsZWQgb24gYSBzdHJpbmcsIGJ1dCBtYXkgYmUgY2FsbGVkIG1hbnVhbGx5IGFzIHdlbGwuXG4gKi9cbmZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vIEluaXRpYWxpemUgc2Nhbm5lciBzdGF0ZSBtYWNoaW5lIGFuZCBwbHVnaW5zXG4gIElOSVQuc2Nhbm5lciA9IGluaXQkMihJTklULmN1c3RvbVNjaGVtZXMpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IElOSVQudG9rZW5RdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIElOSVQudG9rZW5RdWV1ZVtpXVsxXSh7XG4gICAgICBzY2FubmVyOiBJTklULnNjYW5uZXJcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgcGFyc2VyIHN0YXRlIG1hY2hpbmUgYW5kIHBsdWdpbnNcbiAgSU5JVC5wYXJzZXIgPSBpbml0JDEoSU5JVC5zY2FubmVyLnRva2Vucyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgSU5JVC5wbHVnaW5RdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIElOSVQucGx1Z2luUXVldWVbaV1bMV0oe1xuICAgICAgc2Nhbm5lcjogSU5JVC5zY2FubmVyLFxuICAgICAgcGFyc2VyOiBJTklULnBhcnNlclxuICAgIH0pO1xuICB9XG4gIElOSVQuaW5pdGlhbGl6ZWQgPSB0cnVlO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgc3RyaW5nIGludG8gdG9rZW5zIHRoYXQgcmVwcmVzZW50IGxpbmthYmxlIGFuZCBub24tbGlua2FibGUgc3ViLWNvbXBvbmVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge011bHRpVG9rZW5bXX0gdG9rZW5zXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplKHN0cikge1xuICBpZiAoIUlOSVQuaW5pdGlhbGl6ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgcmV0dXJuIHJ1bihJTklULnBhcnNlci5zdGFydCwgc3RyLCBydW4kMShJTklULnNjYW5uZXIuc3RhcnQsIHN0cikpO1xufVxuXG4vKipcbiAqIEZpbmQgYSBsaXN0IG9mIGxpbmthYmxlIGl0ZW1zIGluIHRoZSBnaXZlbiBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIHN0cmluZyB0byBmaW5kIGxpbmtzIGluXG4gKiBAcGFyYW0ge3N0cmluZyB8IE9wdHN9IFt0eXBlXSBlaXRoZXIgZm9ybWF0dGluZyBvcHRpb25zIG9yIHNwZWNpZmljIHR5cGUgb2ZcbiAqIGxpbmtzIHRvIGZpbmQsIGUuZy4sICd1cmwnIG9yICdlbWFpbCdcbiAqIEBwYXJhbSB7T3B0c30gW29wdHNdIGZvcm1hdHRpbmcgb3B0aW9ucyBmb3IgZmluYWwgb3V0cHV0LiBDYW5ub3QgYmUgc3BlY2lmaWVkXG4gKiBpZiBvcHRzIGFscmVhZHkgcHJvdmlkZWQgaW4gYHR5cGVgIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmQoc3RyLCB0eXBlLCBvcHRzKSB7XG4gIGlmICh0eXBlID09PSB2b2lkIDApIHtcbiAgICB0eXBlID0gbnVsbDtcbiAgfVxuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IG51bGw7XG4gIH1cbiAgaWYgKHR5cGUgJiYgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIHRocm93IEVycm9yKGBsaW5raWZ5anM6IEludmFsaWQgbGluayB0eXBlICR7dHlwZX07IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICB9XG4gICAgb3B0cyA9IHR5cGU7XG4gICAgdHlwZSA9IG51bGw7XG4gIH1cbiAgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKG9wdHMpO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZShzdHIpO1xuICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgIGlmICh0b2tlbi5pc0xpbmsgJiYgKCF0eXBlIHx8IHRva2VuLnQgPT09IHR5cGUpICYmIG9wdGlvbnMuY2hlY2sodG9rZW4pKSB7XG4gICAgICBmaWx0ZXJlZC5wdXNoKHRva2VuLnRvRm9ybWF0dGVkT2JqZWN0KG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgdmFsaWQgbGlua2FibGUgdGV4dCBvZiBzb21lIHNvcnQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90XG4gKiB0cmltIHRoZSB0ZXh0IGZvciB5b3UuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGEgc2Vjb25kIGB0eXBlYCBwYXJhbSwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgbGluayB0byB0ZXN0XG4gKiBmb3IuXG4gKlxuICogRm9yIGV4YW1wbGUsXG4gKlxuICogICAgIGxpbmtpZnkudGVzdChzdHIsICdlbWFpbCcpO1xuICpcbiAqIFJldHVybnMgYHRydWVgIGlmIHN0ciBpcyBhIHZhbGlkIGVtYWlsLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBzdHJpbmcgdG8gdGVzdCBmb3IgbGlua3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZV0gb3B0aW9uYWwgc3BlY2lmaWMgbGluayB0eXBlIHRvIGxvb2sgZm9yXG4gKiBAcmV0dXJucyBib29sZWFuIHRydWUvZmFsc2VcbiAqL1xuZnVuY3Rpb24gdGVzdChzdHIsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IHZvaWQgMCkge1xuICAgIHR5cGUgPSBudWxsO1xuICB9XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplKHN0cik7XG4gIHJldHVybiB0b2tlbnMubGVuZ3RoID09PSAxICYmIHRva2Vuc1swXS5pc0xpbmsgJiYgKCF0eXBlIHx8IHRva2Vuc1swXS50ID09PSB0eXBlKTtcbn1cblxuZXhwb3J0IHsgTXVsdGlUb2tlbiwgT3B0aW9ucywgU3RhdGUsIGNyZWF0ZVRva2VuQ2xhc3MsIGZpbmQsIGluaXQsIG11bHRpLCBvcHRpb25zLCByZWdleHAsIHJlZ2lzdGVyQ3VzdG9tUHJvdG9jb2wsIHJlZ2lzdGVyUGx1Z2luLCByZWdpc3RlclRva2VuUGx1Z2luLCByZXNldCwgc3RyaW5nVG9BcnJheSwgdGVzdCwgdG9rZW5pemUgfTtcbiIsICJpbXBvcnQge1xuICBjb21iaW5lVHJhbnNhY3Rpb25TdGVwcyxcbiAgZmluZENoaWxkcmVuSW5SYW5nZSxcbiAgZ2V0Q2hhbmdlZFJhbmdlcyxcbiAgZ2V0TWFya3NCZXR3ZWVuLFxuICBOb2RlV2l0aFBvcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgZmluZCB9IGZyb20gJ2xpbmtpZnlqcydcblxudHlwZSBBdXRvbGlua09wdGlvbnMgPSB7XG4gIHR5cGU6IE1hcmtUeXBlXG4gIHZhbGlkYXRlPzogKHVybDogc3RyaW5nKSA9PiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGluayhvcHRpb25zOiBBdXRvbGlua09wdGlvbnMpOiBQbHVnaW4ge1xuICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAga2V5OiBuZXcgUGx1Z2luS2V5KCdhdXRvbGluaycpLFxuICAgIGFwcGVuZFRyYW5zYWN0aW9uOiAodHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGNvbnN0IGRvY0NoYW5nZXMgPSB0cmFuc2FjdGlvbnMuc29tZSh0cmFuc2FjdGlvbiA9PiB0cmFuc2FjdGlvbi5kb2NDaGFuZ2VkKSAmJiAhb2xkU3RhdGUuZG9jLmVxKG5ld1N0YXRlLmRvYylcbiAgICAgIGNvbnN0IHByZXZlbnRBdXRvbGluayA9IHRyYW5zYWN0aW9ucy5zb21lKHRyYW5zYWN0aW9uID0+IHRyYW5zYWN0aW9uLmdldE1ldGEoJ3ByZXZlbnRBdXRvbGluaycpKVxuXG4gICAgICBpZiAoIWRvY0NoYW5nZXMgfHwgcHJldmVudEF1dG9saW5rKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRyIH0gPSBuZXdTdGF0ZVxuICAgICAgY29uc3QgdHJhbnNmb3JtID0gY29tYmluZVRyYW5zYWN0aW9uU3RlcHMob2xkU3RhdGUuZG9jLCBbLi4udHJhbnNhY3Rpb25zXSlcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBnZXRDaGFuZ2VkUmFuZ2VzKHRyYW5zZm9ybSlcblxuICAgICAgY2hhbmdlcy5mb3JFYWNoKCh7IG5ld1JhbmdlIH0pID0+IHtcbiAgICAgICAgLy8gTm93IGxldOKAmXMgc2VlIGlmIHdlIGNhbiBhZGQgbmV3IGxpbmtzLlxuICAgICAgICBjb25zdCBub2Rlc0luQ2hhbmdlZFJhbmdlcyA9IGZpbmRDaGlsZHJlbkluUmFuZ2UoXG4gICAgICAgICAgbmV3U3RhdGUuZG9jLFxuICAgICAgICAgIG5ld1JhbmdlLFxuICAgICAgICAgIG5vZGUgPT4gbm9kZS5pc1RleHRibG9jayxcbiAgICAgICAgKVxuXG4gICAgICAgIGxldCB0ZXh0QmxvY2s6IE5vZGVXaXRoUG9zIHwgdW5kZWZpbmVkXG4gICAgICAgIGxldCB0ZXh0QmVmb3JlV2hpdGVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKG5vZGVzSW5DaGFuZ2VkUmFuZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAvLyBHcmFiIHRoZSBmaXJzdCBub2RlIHdpdGhpbiB0aGUgY2hhbmdlZCByYW5nZXMgKGV4LiB0aGUgZmlyc3Qgb2YgdHdvIHBhcmFncmFwaHMgd2hlbiBoaXR0aW5nIGVudGVyKS5cbiAgICAgICAgICB0ZXh0QmxvY2sgPSBub2Rlc0luQ2hhbmdlZFJhbmdlc1swXVxuICAgICAgICAgIHRleHRCZWZvcmVXaGl0ZXNwYWNlID0gbmV3U3RhdGUuZG9jLnRleHRCZXR3ZWVuKFxuICAgICAgICAgICAgdGV4dEJsb2NrLnBvcyxcbiAgICAgICAgICAgIHRleHRCbG9jay5wb3MgKyB0ZXh0QmxvY2subm9kZS5ub2RlU2l6ZSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICcgJyxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZXNJbkNoYW5nZWRSYW5nZXMubGVuZ3RoXG4gICAgICAgICAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gaW5jbHVkZSB0aGUgYmxvY2sgc2VwZXJhdG9yIGFyZ3VtZW50IHRvIHRyZWF0IGhhcmQgYnJlYWtzIGxpa2Ugc3BhY2VzLlxuICAgICAgICAgICYmIG5ld1N0YXRlLmRvYy50ZXh0QmV0d2VlbihuZXdSYW5nZS5mcm9tLCBuZXdSYW5nZS50bywgJyAnLCAnICcpLmVuZHNXaXRoKCcgJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGV4dEJsb2NrID0gbm9kZXNJbkNoYW5nZWRSYW5nZXNbMF1cbiAgICAgICAgICB0ZXh0QmVmb3JlV2hpdGVzcGFjZSA9IG5ld1N0YXRlLmRvYy50ZXh0QmV0d2VlbihcbiAgICAgICAgICAgIHRleHRCbG9jay5wb3MsXG4gICAgICAgICAgICBuZXdSYW5nZS50byxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICcgJyxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dEJsb2NrICYmIHRleHRCZWZvcmVXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgY29uc3Qgd29yZHNCZWZvcmVXaGl0ZXNwYWNlID0gdGV4dEJlZm9yZVdoaXRlc3BhY2Uuc3BsaXQoJyAnKS5maWx0ZXIocyA9PiBzICE9PSAnJylcblxuICAgICAgICAgIGlmICh3b3Jkc0JlZm9yZVdoaXRlc3BhY2UubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxhc3RXb3JkQmVmb3JlU3BhY2UgPSB3b3Jkc0JlZm9yZVdoaXRlc3BhY2Vbd29yZHNCZWZvcmVXaGl0ZXNwYWNlLmxlbmd0aCAtIDFdXG4gICAgICAgICAgY29uc3QgbGFzdFdvcmRBbmRCbG9ja09mZnNldCA9IHRleHRCbG9jay5wb3MgKyB0ZXh0QmVmb3JlV2hpdGVzcGFjZS5sYXN0SW5kZXhPZihsYXN0V29yZEJlZm9yZVNwYWNlKVxuXG4gICAgICAgICAgaWYgKCFsYXN0V29yZEJlZm9yZVNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaW5kKGxhc3RXb3JkQmVmb3JlU3BhY2UpXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmsgPT4gbGluay5pc0xpbmspXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgbGluayBwb3NpdGlvbi5cbiAgICAgICAgICAgIC5tYXAobGluayA9PiAoe1xuICAgICAgICAgICAgICAuLi5saW5rLFxuICAgICAgICAgICAgICBmcm9tOiBsYXN0V29yZEFuZEJsb2NrT2Zmc2V0ICsgbGluay5zdGFydCArIDEsXG4gICAgICAgICAgICAgIHRvOiBsYXN0V29yZEFuZEJsb2NrT2Zmc2V0ICsgbGluay5lbmQgKyAxLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAvLyBpZ25vcmUgbGluayBpbnNpZGUgY29kZSBtYXJrXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmsgPT4ge1xuICAgICAgICAgICAgICBpZiAoIW5ld1N0YXRlLnNjaGVtYS5tYXJrcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiAhbmV3U3RhdGUuZG9jLnJhbmdlSGFzTWFyayhcbiAgICAgICAgICAgICAgICBsaW5rLmZyb20sXG4gICAgICAgICAgICAgICAgbGluay50byxcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZS5zY2hlbWEubWFya3MuY29kZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC8vIHZhbGlkYXRlIGxpbmtcbiAgICAgICAgICAgIC5maWx0ZXIobGluayA9PiB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMudmFsaWRhdGUobGluay52YWx1ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC8vIEFkZCBsaW5rIG1hcmsuXG4gICAgICAgICAgICAuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgICAgICAgICAgaWYgKGdldE1hcmtzQmV0d2VlbihsaW5rLmZyb20sIGxpbmsudG8sIG5ld1N0YXRlLmRvYykuc29tZShpdGVtID0+IGl0ZW0ubWFyay50eXBlID09PSBvcHRpb25zLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0ci5hZGRNYXJrKFxuICAgICAgICAgICAgICAgIGxpbmsuZnJvbSxcbiAgICAgICAgICAgICAgICBsaW5rLnRvLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgaHJlZjogbGluay5ocmVmLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoIXRyLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyXG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBnZXRBdHRyaWJ1dGVzIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG50eXBlIENsaWNrSGFuZGxlck9wdGlvbnMgPSB7XG4gIHR5cGU6IE1hcmtUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGlja0hhbmRsZXIob3B0aW9uczogQ2xpY2tIYW5kbGVyT3B0aW9ucyk6IFBsdWdpbiB7XG4gIHJldHVybiBuZXcgUGx1Z2luKHtcbiAgICBrZXk6IG5ldyBQbHVnaW5LZXkoJ2hhbmRsZUNsaWNrTGluaycpLFxuICAgIHByb3BzOiB7XG4gICAgICBoYW5kbGVDbGljazogKHZpZXcsIHBvcywgZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRUYXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcblxuICAgICAgICBpZiAoZXZlbnRUYXJnZXQubm9kZU5hbWUgIT09ICdBJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cnMgPSBnZXRBdHRyaWJ1dGVzKHZpZXcuc3RhdGUsIG9wdGlvbnMudHlwZS5uYW1lKVxuICAgICAgICBjb25zdCBsaW5rID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MTGlua0VsZW1lbnQpXG5cbiAgICAgICAgY29uc3QgaHJlZiA9IGxpbms/LmhyZWYgPz8gYXR0cnMuaHJlZlxuICAgICAgICBjb25zdCB0YXJnZXQgPSBsaW5rPy50YXJnZXQgPz8gYXR0cnMudGFyZ2V0XG5cbiAgICAgICAgaWYgKGxpbmsgJiYgaHJlZikge1xuICAgICAgICAgIGlmICh2aWV3LmVkaXRhYmxlKSB7XG4gICAgICAgICAgICB3aW5kb3cub3BlbihocmVmLCB0YXJnZXQpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IEVkaXRvciB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcbmltcG9ydCB7IGZpbmQgfSBmcm9tICdsaW5raWZ5anMnXG5cbnR5cGUgUGFzdGVIYW5kbGVyT3B0aW9ucyA9IHtcbiAgZWRpdG9yOiBFZGl0b3JcbiAgdHlwZTogTWFya1R5cGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhc3RlSGFuZGxlcihvcHRpb25zOiBQYXN0ZUhhbmRsZXJPcHRpb25zKTogUGx1Z2luIHtcbiAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgIGtleTogbmV3IFBsdWdpbktleSgnaGFuZGxlUGFzdGVMaW5rJyksXG4gICAgcHJvcHM6IHtcbiAgICAgIGhhbmRsZVBhc3RlOiAodmlldywgZXZlbnQsIHNsaWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHZpZXdcbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgIGNvbnN0IHsgZW1wdHkgfSA9IHNlbGVjdGlvblxuXG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRleHRDb250ZW50ID0gJydcblxuICAgICAgICBzbGljZS5jb250ZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgdGV4dENvbnRlbnQgKz0gbm9kZS50ZXh0Q29udGVudFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGxpbmsgPSBmaW5kKHRleHRDb250ZW50KS5maW5kKGl0ZW0gPT4gaXRlbS5pc0xpbmsgJiYgaXRlbS52YWx1ZSA9PT0gdGV4dENvbnRlbnQpXG5cbiAgICAgICAgaWYgKCF0ZXh0Q29udGVudCB8fCAhbGluaykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvaHRtbCcpXG5cbiAgICAgICAgY29uc3QgaHJlZlJlZ2V4ID0gL2hyZWY9XCIoW15cIl0qKVwiL1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nTGluayA9IGh0bWw/Lm1hdGNoKGhyZWZSZWdleClcblxuICAgICAgICBjb25zdCB1cmwgPSBleGlzdGluZ0xpbmsgPyBleGlzdGluZ0xpbmtbMV0gOiBsaW5rLmhyZWZcblxuICAgICAgICBvcHRpb25zLmVkaXRvci5jb21tYW5kcy5zZXRNYXJrKG9wdGlvbnMudHlwZSwge1xuICAgICAgICAgIGhyZWY6IHVybCxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IE1hcmssIG1hcmtQYXN0ZVJ1bGUsIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBmaW5kLCByZWdpc3RlckN1c3RvbVByb3RvY29sLCByZXNldCB9IGZyb20gJ2xpbmtpZnlqcydcblxuaW1wb3J0IHsgYXV0b2xpbmsgfSBmcm9tICcuL2hlbHBlcnMvYXV0b2xpbmsuanMnXG5pbXBvcnQgeyBjbGlja0hhbmRsZXIgfSBmcm9tICcuL2hlbHBlcnMvY2xpY2tIYW5kbGVyLmpzJ1xuaW1wb3J0IHsgcGFzdGVIYW5kbGVyIH0gZnJvbSAnLi9oZWxwZXJzL3Bhc3RlSGFuZGxlci5qcydcblxuZXhwb3J0IGludGVyZmFjZSBMaW5rUHJvdG9jb2xPcHRpb25zIHtcbiAgc2NoZW1lOiBzdHJpbmc7XG4gIG9wdGlvbmFsU2xhc2hlcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09wdGlvbnMge1xuICAvKipcbiAgICogSWYgZW5hYmxlZCwgaXQgYWRkcyBsaW5rcyBhcyB5b3UgdHlwZS5cbiAgICovXG4gIGF1dG9saW5rOiBib29sZWFuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjdXN0b20gcHJvdG9jb2xzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBsaW5raWZ5anMuXG4gICAqL1xuICBwcm90b2NvbHM6IEFycmF5PExpbmtQcm90b2NvbE9wdGlvbnMgfCBzdHJpbmc+XG4gIC8qKlxuICAgKiBJZiBlbmFibGVkLCBsaW5rcyB3aWxsIGJlIG9wZW5lZCBvbiBjbGljay5cbiAgICovXG4gIG9wZW5PbkNsaWNrOiBib29sZWFuXG4gIC8qKlxuICAgKiBBZGRzIGEgbGluayB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gaWYgdGhlIHBhc3RlZCBjb250ZW50IG9ubHkgY29udGFpbnMgYW4gdXJsLlxuICAgKi9cbiAgbGlua09uUGFzdGU6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBIVE1MIGF0dHJpYnV0ZXMgdG8gYmUgcmVuZGVyZWQuXG4gICAqL1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PlxuICAvKipcbiAgICogQSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgbW9kaWZpZXMgbGluayB2ZXJpZmljYXRpb24gZm9yIHRoZSBhdXRvIGxpbmtlci5cbiAgICogQHBhcmFtIHVybCAtIFRoZSB1cmwgdG8gYmUgdmFsaWRhdGVkLlxuICAgKiBAcmV0dXJucyAtIFRydWUgaWYgdGhlIHVybCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgdmFsaWRhdGU/OiAodXJsOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGxpbms6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgbGluayBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldExpbms6IChhdHRyaWJ1dGVzOiB7IGhyZWY6IHN0cmluZzsgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbDsgcmVsPzogc3RyaW5nIHwgbnVsbDsgY2xhc3M/OiBzdHJpbmcgfCBudWxsIH0pID0+IFJldHVyblR5cGVcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgbGluayBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUxpbms6IChhdHRyaWJ1dGVzOiB7IGhyZWY6IHN0cmluZzsgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbDsgcmVsPzogc3RyaW5nIHwgbnVsbDsgY2xhc3M/OiBzdHJpbmcgfCBudWxsIH0pID0+IFJldHVyblR5cGVcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBsaW5rIG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRMaW5rOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBMaW5rID0gTWFyay5jcmVhdGU8TGlua09wdGlvbnM+KHtcbiAgbmFtZTogJ2xpbmsnLFxuXG4gIHByaW9yaXR5OiAxMDAwLFxuXG4gIGtlZXBPblNwbGl0OiBmYWxzZSxcblxuICBvbkNyZWF0ZSgpIHtcbiAgICB0aGlzLm9wdGlvbnMucHJvdG9jb2xzLmZvckVhY2gocHJvdG9jb2wgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBwcm90b2NvbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVnaXN0ZXJDdXN0b21Qcm90b2NvbChwcm90b2NvbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICByZWdpc3RlckN1c3RvbVByb3RvY29sKHByb3RvY29sLnNjaGVtZSwgcHJvdG9jb2wub3B0aW9uYWxTbGFzaGVzKVxuICAgIH0pXG4gIH0sXG5cbiAgb25EZXN0cm95KCkge1xuICAgIHJlc2V0KClcbiAgfSxcblxuICBpbmNsdXNpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdXRvbGlua1xuICB9LFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5PbkNsaWNrOiB0cnVlLFxuICAgICAgbGlua09uUGFzdGU6IHRydWUsXG4gICAgICBhdXRvbGluazogdHJ1ZSxcbiAgICAgIHByb3RvY29sczogW10sXG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICB0YXJnZXQ6ICdfYmxhbmsnLFxuICAgICAgICByZWw6ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JyxcbiAgICAgICAgY2xhc3M6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsaWRhdGU6IHVuZGVmaW5lZCxcbiAgICB9XG4gIH0sXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaHJlZjoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHRhcmdldDoge1xuICAgICAgICBkZWZhdWx0OiB0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMudGFyZ2V0LFxuICAgICAgfSxcbiAgICAgIHJlbDoge1xuICAgICAgICBkZWZhdWx0OiB0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMucmVsLFxuICAgICAgfSxcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcy5jbGFzcyxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW3sgdGFnOiAnYVtocmVmXTpub3QoW2hyZWYgKj0gXCJqYXZhc2NyaXB0OlwiIGldKScgfV1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIC8vIEZhbHNlIHBvc2l0aXZlOyB3ZSdyZSBleHBsaWNpdGx5IGNoZWNraW5nIGZvciBqYXZhc2NyaXB0OiBsaW5rcyB0byBpZ25vcmUgdGhlbVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zY3JpcHQtdXJsXG4gICAgaWYgKEhUTUxBdHRyaWJ1dGVzLmhyZWY/LnN0YXJ0c1dpdGgoJ2phdmFzY3JpcHQ6JykpIHtcbiAgICAgIC8vIHN0cmlwIG91dCB0aGUgaHJlZlxuICAgICAgcmV0dXJuIFsnYScsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIHsgLi4uSFRNTEF0dHJpYnV0ZXMsIGhyZWY6ICcnIH0pLCAwXVxuICAgIH1cbiAgICByZXR1cm4gWydhJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRMaW5rOlxuICAgICAgICBhdHRyaWJ1dGVzID0+ICh7IGNoYWluIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY2hhaW4oKS5zZXRNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcykuc2V0TWV0YSgncHJldmVudEF1dG9saW5rJywgdHJ1ZSkucnVuKClcbiAgICAgICAgfSxcblxuICAgICAgdG9nZ2xlTGluazpcbiAgICAgICAgYXR0cmlidXRlcyA9PiAoeyBjaGFpbiB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKClcbiAgICAgICAgICAgIC50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcywgeyBleHRlbmRFbXB0eU1hcmtSYW5nZTogdHJ1ZSB9KVxuICAgICAgICAgICAgLnNldE1ldGEoJ3ByZXZlbnRBdXRvbGluaycsIHRydWUpXG4gICAgICAgICAgICAucnVuKClcbiAgICAgICAgfSxcblxuICAgICAgdW5zZXRMaW5rOlxuICAgICAgICAoKSA9PiAoeyBjaGFpbiB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKClcbiAgICAgICAgICAgIC51bnNldE1hcmsodGhpcy5uYW1lLCB7IGV4dGVuZEVtcHR5TWFya1JhbmdlOiB0cnVlIH0pXG4gICAgICAgICAgICAuc2V0TWV0YSgncHJldmVudEF1dG9saW5rJywgdHJ1ZSlcbiAgICAgICAgICAgIC5ydW4oKVxuICAgICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRQYXN0ZVJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrUGFzdGVSdWxlKHtcbiAgICAgICAgZmluZDogdGV4dCA9PiBmaW5kKHRleHQpXG4gICAgICAgICAgLmZpbHRlcihsaW5rID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy52YWxpZGF0ZShsaW5rLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihsaW5rID0+IGxpbmsuaXNMaW5rKVxuICAgICAgICAgIC5tYXAobGluayA9PiAoe1xuICAgICAgICAgICAgdGV4dDogbGluay52YWx1ZSxcbiAgICAgICAgICAgIGluZGV4OiBsaW5rLnN0YXJ0LFxuICAgICAgICAgICAgZGF0YTogbGluayxcbiAgICAgICAgICB9KSksXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgZ2V0QXR0cmlidXRlczogKG1hdGNoLCBwYXN0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IHBhc3RlRXZlbnQ/LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvaHRtbCcpXG4gICAgICAgICAgY29uc3QgaHJlZlJlZ2V4ID0gL2hyZWY9XCIoW15cIl0qKVwiL1xuXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdMaW5rID0gaHRtbD8ubWF0Y2goaHJlZlJlZ2V4KVxuXG4gICAgICAgICAgaWYgKGV4aXN0aW5nTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaHJlZjogZXhpc3RpbmdMaW5rWzFdLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBocmVmOiBtYXRjaC5kYXRhPy5ocmVmLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvbGluaykge1xuICAgICAgcGx1Z2lucy5wdXNoKFxuICAgICAgICBhdXRvbGluayh7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHZhbGlkYXRlOiB0aGlzLm9wdGlvbnMudmFsaWRhdGUsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3Blbk9uQ2xpY2spIHtcbiAgICAgIHBsdWdpbnMucHVzaChcbiAgICAgICAgY2xpY2tIYW5kbGVyKHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGlua09uUGFzdGUpIHtcbiAgICAgIHBsdWdpbnMucHVzaChcbiAgICAgICAgcGFzdGVIYW5kbGVyKHtcbiAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBsdWdpbnNcbiAgfSxcbn0pXG4iLCAiaW1wb3J0IExpbmsgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWxpbmtcIjtcblxuZXhwb3J0IGNvbnN0IEN1c3RvbUxpbmsgPSBMaW5rLmV4dGVuZCh7XG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5PbkNsaWNrOiB0cnVlLFxuICAgICAgbGlua09uUGFzdGU6IHRydWUsXG4gICAgICBhdXRvbGluazogdHJ1ZSxcbiAgICAgIHByb3RvY29sczogW10sXG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgICB2YWxpZGF0ZTogdW5kZWZpbmVkLFxuICAgIH07XG4gIH0sXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaHJlZjoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGlkOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcy50YXJnZXQsXG4gICAgICB9LFxuICAgICAgaHJlZmxhbmc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICByZWw6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICByZWZlcnJlcnBvbGljeToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYXNfYnV0dG9uOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1hcy1idXR0b24nKSxcbiAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdkYXRhLWFzLWJ1dHRvbic6IGF0dHJpYnV0ZXMuYXNfYnV0dG9uLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGJ1dHRvbl90aGVtZToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXMtYnV0dG9uLXRoZW1lJyksXG4gICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnZGF0YS1hcy1idXR0b24tdGhlbWUnOiBhdHRyaWJ1dGVzLmJ1dHRvbl90aGVtZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIG1lcmdlQXR0cmlidXRlcyxcbiAgTm9kZSxcbiAgbm9kZUlucHV0UnVsZSxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlT3B0aW9ucyB7XG4gIGlubGluZTogYm9vbGVhbixcbiAgYWxsb3dCYXNlNjQ6IGJvb2xlYW4sXG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaW1hZ2U6IHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGltYWdlXG4gICAgICAgKi9cbiAgICAgIHNldEltYWdlOiAob3B0aW9uczogeyBzcmM6IHN0cmluZywgYWx0Pzogc3RyaW5nLCB0aXRsZT86IHN0cmluZyB9KSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaW5wdXRSZWdleCA9IC8oPzpefFxccykoIVxcWyguK3w6PyldXFwoKFxcUyspKD86KD86XFxzKylbXCInXShcXFMrKVtcIiddKT9cXCkpJC9cblxuZXhwb3J0IGNvbnN0IEltYWdlID0gTm9kZS5jcmVhdGU8SW1hZ2VPcHRpb25zPih7XG4gIG5hbWU6ICdpbWFnZScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5saW5lOiBmYWxzZSxcbiAgICAgIGFsbG93QmFzZTY0OiBmYWxzZSxcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgaW5saW5lKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lXG4gIH0sXG5cbiAgZ3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmxpbmUgPyAnaW5saW5lJyA6ICdibG9jaydcbiAgfSxcblxuICBkcmFnZ2FibGU6IHRydWUsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3JjOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYWx0OiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IHRoaXMub3B0aW9ucy5hbGxvd0Jhc2U2NFxuICAgICAgICAgID8gJ2ltZ1tzcmNdJ1xuICAgICAgICAgIDogJ2ltZ1tzcmNdOm5vdChbc3JjXj1cImRhdGE6XCJdKScsXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2ltZycsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKV1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0SW1hZ2U6IG9wdGlvbnMgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudCh7XG4gICAgICAgICAgdHlwZTogdGhpcy5uYW1lLFxuICAgICAgICAgIGF0dHJzOiBvcHRpb25zLFxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbm9kZUlucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgZ2V0QXR0cmlidXRlczogbWF0Y2ggPT4ge1xuICAgICAgICAgIGNvbnN0IFssLCBhbHQsIHNyYywgdGl0bGVdID0gbWF0Y2hcblxuICAgICAgICAgIHJldHVybiB7IHNyYywgYWx0LCB0aXRsZSB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCBJbWFnZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24taW1hZ2VcIjtcblxuZXhwb3J0IGNvbnN0IEN1c3RvbUltYWdlID0gSW1hZ2UuZXh0ZW5kKHtcbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3JjOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYWx0OiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB3aWR0aDoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxhenk6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsb2FkaW5nJykgPT09ICdsYXp5JyA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxhenknKSA6IG51bGwsXG4gICAgICAgIHJlbmRlckhUTUw6IChhdHRyaWJ1dGVzKSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZXMubGF6eSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgXCJkYXRhLWxhenlcIjogYXR0cmlidXRlcy5sYXp5LFxuICAgICAgICAgICAgICBcImxvYWRpbmdcIjogXCJsYXp5XCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgUGFyYWdyYXBoIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1wYXJhZ3JhcGhcIjtcblxuZXhwb3J0IGNvbnN0IEN1c3RvbVBhcmFncmFwaCA9IFBhcmFncmFwaC5leHRlbmQoe1xuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzczoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTWFyaywgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgU21hbGwgPSBNYXJrLmNyZWF0ZSh7XG4gIG5hbWU6IFwic21hbGxcIixcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcInNtYWxsXCIsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gW1wic21hbGxcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMuc2V0TWFyayh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgdG9nZ2xlU21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgdW5zZXRTbWFsbDpcbiAgICAgICAgKCkgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbihjb2xUeXBlLCBjb2xDb250ZW50ID0gbnVsbCkge1xuICBpZiAoY29sQ29udGVudCkge1xuICAgIHJldHVybiBjb2xUeXBlLmNyZWF0ZUNoZWNrZWQobnVsbCwgY29sQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4gY29sVHlwZS5jcmVhdGVBbmRGaWxsKCk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGdldEdyaWROb2RlVHlwZXMoc2NoZW1hKSB7XG4gIGlmIChzY2hlbWEuY2FjaGVkLmdyaWROb2RlVHlwZXMpIHtcbiAgICByZXR1cm4gc2NoZW1hLmNhY2hlZC5ncmlkTm9kZVR5cGVzO1xuICB9XG5cbiAgY29uc3Qgcm9sZXMgPSB7fTtcblxuICBPYmplY3Qua2V5cyhzY2hlbWEubm9kZXMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBjb25zdCBub2RlVHlwZSA9IHNjaGVtYS5ub2Rlc1t0eXBlXTtcblxuICAgIGlmIChub2RlVHlwZS5zcGVjLmdyaWRSb2xlKSB7XG4gICAgICByb2xlc1tub2RlVHlwZS5zcGVjLmdyaWRSb2xlXSA9IG5vZGVUeXBlO1xuICAgIH1cbiAgfSk7XG5cbiAgc2NoZW1hLmNhY2hlZC5ncmlkTm9kZVR5cGVzID0gcm9sZXM7XG5cbiAgcmV0dXJuIHJvbGVzO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbHVtbiB9IGZyb20gXCIuL2NyZWF0ZUNvbHVtblwiO1xuaW1wb3J0IHsgZ2V0R3JpZE5vZGVUeXBlcyB9IGZyb20gXCIuL2dldEdyaWROb2RlVHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyaWQoc2NoZW1hLCBjb2xzQ291bnQsIHR5cGUsIGNvbENvbnRlbnQpIHtcbiAgY29uc3QgdHlwZXMgPSBnZXRHcmlkTm9kZVR5cGVzKHNjaGVtYSk7XG4gIGNvbnN0IGNvbHMgPSBbXTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sc0NvdW50OyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY29sID0gY3JlYXRlQ29sdW1uKHR5cGVzLmNvbHVtbiwgY29sQ29udGVudCk7XG5cbiAgICBpZiAoY29sKSB7XG4gICAgICBjb2xzLnB1c2goY29sKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHlwZXMuZ3JpZC5jcmVhdGVDaGVja2VkKHsgY29sczogY29sc0NvdW50LCB0eXBlOiB0eXBlIH0sIGNvbHMpO1xufVxuIiwgImltcG9ydCB7IGNhbGxPclJldHVybiwgZ2V0RXh0ZW5zaW9uRmllbGQsIE5vZGUsIG1lcmdlQXR0cmlidXRlcywgZmluZFBhcmVudE5vZGUsIGZpbmRDaGlsZHJlbiB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFRleHRTZWxlY3Rpb24gfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUdyaWQgfSBmcm9tIFwiLi91dGlscy9jcmVhdGVHcmlkXCI7XG5pbXBvcnQgeyBHYXBDdXJzb3IgfSBmcm9tIFwicHJvc2VtaXJyb3ItZ2FwY3Vyc29yXCI7XG5cbmV4cG9ydCBjb25zdCBHcmlkID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcImdyaWRcIixcblxuICBncm91cDogXCJibG9ja1wiLFxuXG4gIGRlZmluaW5nOiB0cnVlLFxuXG4gIGlzb2xhdGluZzogdHJ1ZSxcblxuICBhbGxvd0dhcEN1cnNvcjogZmFsc2UsXG5cbiAgY29udGVudDogXCJncmlkQ29sdW1uK1wiLFxuXG4gIGdyaWRSb2xlOiBcImdyaWRcIixcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtZ3JpZFwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgZGVmYXVsdDogXCJyZXNwb25zaXZlXCIsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSxcbiAgICAgIH0sXG4gICAgICBjb2xzOiB7XG4gICAgICAgIGRlZmF1bHQ6IDIsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29sc1wiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBnZXRBdHRyczogKG5vZGUpID0+IG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmlsYW1lbnQtdGlwdGFwLWdyaWRcIikgJiYgbnVsbCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJkaXZcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0R3JpZDpcbiAgICAgICAgKHsgY29scyA9IDMsIHR5cGUgPSBcInJlc3BvbnNpdmVcIiB9ID0ge30pID0+XG4gICAgICAgICh7IHRyLCBkaXNwYXRjaCwgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBub2RlID0gY3JlYXRlR3JpZChlZGl0b3Iuc2NoZW1hLCBjb2xzLCB0eXBlKTtcblxuICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHIuc2VsZWN0aW9uLmFuY2hvciArIDE7XG5cbiAgICAgICAgICAgIHRyLnJlcGxhY2VTZWxlY3Rpb25XaXRoKG5vZGUpXG4gICAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldygpXG4gICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKG9mZnNldCkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBcIk1vZC1BbHQtR1wiOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5pbnNlcnRHcmlkKCksXG4gICAgfTtcbiAgfSxcblxuICBleHRlbmROb2RlU2NoZW1hKGV4dGVuc2lvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBncmlkUm9sZTogY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbiwgXCJncmlkUm9sZVwiLCBjb250ZXh0KSksXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IE5vZGUsIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcblxuZXhwb3J0IGNvbnN0IEdyaWRDb2x1bW4gPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZ3JpZENvbHVtblwiLFxuICBjb250ZW50OiBcImJsb2NrK1wiLFxuICBncmlkUm9sZTogXCJjb2x1bW5cIixcbiAgaXNvbGF0aW5nOiB0cnVlLFxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtZ3JpZF9fY29sdW1uXCIsXG4gICAgICB9LFxuICAgIH07XG4gIH0sXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgIGdldEF0dHJzOiAobm9kZSkgPT4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoXCJmaWxhbWVudC10aXB0YXAtZ3JpZF9fY29sdW1uXCIpICYmIG51bGwsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICB9LFxufSk7XG4iLCAiZXhwb3J0IGNvbnN0IGlzVmFsaWRZb3V0dWJlVXJsID0gKHVybCkgPT4ge1xuICByZXR1cm4gdXJsLm1hdGNoKC8oeW91dHViZVxcLmNvbXx5b3V0dVxcLmJlKSguKyk/JC8pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFlvdXR1YmVFbWJlZFVybCA9IChub2Nvb2tpZSA9IGZhbHNlKSA9PiB7XG4gIHJldHVybiBub2Nvb2tpZSA/IFwiaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20vZW1iZWQvXCIgOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL1wiO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVtYmVkVVJMRnJvbVlvdXR1YmVVUkwgPSAob3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHVybCwgY29udHJvbHMsIG5vY29va2llLCBzdGFydEF0IH0gPSBvcHRpb25zO1xuXG4gIC8vIGlmIGlzIGFscmVhZHkgYW4gZW1iZWQgdXJsLCByZXR1cm4gaXRcbiAgaWYgKHVybC5pbmNsdWRlcyhcIi9lbWJlZC9cIikpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgLy8gaWYgaXMgYSB5b3V0dS5iZSB1cmwsIGdldCB0aGUgaWQgYWZ0ZXIgdGhlIC9cbiAgaWYgKHVybC5pbmNsdWRlcyhcInlvdXR1LmJlXCIpKSB7XG4gICAgY29uc3QgaWQgPSB1cmwuc3BsaXQoXCIvXCIpLnBvcCgpO1xuXG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBgJHtnZXRZb3V0dWJlRW1iZWRVcmwobm9jb29raWUpfSR7aWR9YDtcbiAgfVxuXG4gIGNvbnN0IHZpZGVvSWRSZWdleCA9IC92PShbLVxcd10rKS9nbTtcbiAgY29uc3QgbWF0Y2hlcyA9IHZpZGVvSWRSZWdleC5leGVjKHVybCk7XG5cbiAgaWYgKCFtYXRjaGVzIHx8ICFtYXRjaGVzWzFdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgb3V0cHV0VXJsID0gYCR7Z2V0WW91dHViZUVtYmVkVXJsKG5vY29va2llKX0ke21hdGNoZXNbMV19YDtcblxuICBjb25zdCBwYXJhbXMgPSBbXTtcblxuICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgcGFyYW1zLnB1c2goXCJjb250cm9scz0wXCIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmFtcy5wdXNoKFwiY29udHJvbHM9MVwiKTtcbiAgfVxuXG4gIGlmIChzdGFydEF0KSB7XG4gICAgcGFyYW1zLnB1c2goYHN0YXJ0PSR7c3RhcnRBdH1gKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgb3V0cHV0VXJsICs9IGA/JHtwYXJhbXMuam9pbihcIiZcIil9YDtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRVcmw7XG59O1xuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcblxuaW1wb3J0IHsgZ2V0RW1iZWRVUkxGcm9tWW91dHViZVVSTCwgaXNWYWxpZFlvdXR1YmVVcmwgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgWW91dHViZSA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogXCJ5b3V0dWJlXCIsXG5cbiAgc2VsZWN0YWJsZTogdHJ1ZSxcblxuICBkcmFnZ2FibGU6IHRydWUsXG5cbiAgYXRvbTogdHJ1ZSxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgd2lkdGg6IDY0MCxcbiAgICAgIGhlaWdodDogNDgwLFxuICAgIH07XG4gIH0sXG5cbiAgaW5saW5lKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lO1xuICB9LFxuXG4gIGdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgfSxcblxuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLFxuICAgICAgfSxcbiAgICAgIHNyYzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy53aWR0aCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiksXG4gICAgICB9LFxuICAgICAgcmVzcG9uc2l2ZToge1xuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInJlc3BvbnNpdmVcIikgPz8gZmFsc2UsXG4gICAgICB9LFxuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBjb250cm9sczoge1xuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIG5vY29va2llOiB7XG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC13aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0Jzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtYXNwZWN0LWhlaWdodFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdltkYXRhLXlvdXR1YmUtdmlkZW9dIGlmcmFtZVwiLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRZb3V0dWJlVmlkZW86XG4gICAgICAgIChvcHRpb25zKSA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1ZhbGlkWW91dHViZVVybChvcHRpb25zLnNyYykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbWJlZFVybCA9IGdldEVtYmVkVVJMRnJvbVlvdXR1YmVVUkwoe1xuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnNyYyxcbiAgICAgICAgICAgIGNvbnRyb2xzOiBvcHRpb25zLmNvbnRyb2xzLFxuICAgICAgICAgICAgbm9jb29raWU6IG9wdGlvbnMubm9jb29raWUsXG4gICAgICAgICAgICBzdGFydEF0OiBvcHRpb25zLnN0YXJ0IHx8IDAsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudCh7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICBzcmM6IGVtYmVkVXJsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgY29uc3QgZW1iZWRVcmwgPSBnZXRFbWJlZFVSTEZyb21Zb3V0dWJlVVJMKHtcbiAgICAgIHVybDogSFRNTEF0dHJpYnV0ZXMuc3JjLFxuICAgICAgY29udHJvbHM6IEhUTUxBdHRyaWJ1dGVzLmNvbnRyb2xzLFxuICAgICAgbm9jb29raWU6IEhUTUxBdHRyaWJ1dGVzLm5vY29va2llLFxuICAgICAgc3RhcnRBdDogSFRNTEF0dHJpYnV0ZXMuc3RhcnQgfHwgMCxcbiAgICB9KTtcblxuICAgIHJldHVybiBbXG4gICAgICBcImRpdlwiLFxuICAgICAge1xuICAgICAgICBcImRhdGEteW91dHViZS12aWRlb1wiOiBcIlwiLFxuICAgICAgICBjbGFzczogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IFwicmVzcG9uc2l2ZVwiIDogbnVsbFxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgXCJpZnJhbWVcIixcbiAgICAgICAge1xuICAgICAgICAgIHNyYzogZW1iZWRVcmwsXG4gICAgICAgICAgd2lkdGg6IEhUTUxBdHRyaWJ1dGVzLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogSFRNTEF0dHJpYnV0ZXMuaGVpZ2h0LFxuICAgICAgICAgIGFsbG93ZnVsbHNjcmVlbjogdGhpcy5vcHRpb25zLmFsbG93RnVsbHNjcmVlbixcbiAgICAgICAgICBzdHlsZTogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IGBhc3BlY3QtcmF0aW86ICR7SFRNTEF0dHJpYnV0ZXNbJ2RhdGEtYXNwZWN0LXdpZHRoJ119IC8gJHtIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3QtaGVpZ2h0J119OyB3aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvO2AgOiBudWxsLFxuICAgICAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXSA6IG51bGwsXG4gICAgICAgICAgJ2RhdGEtYXNwZWN0LWhlaWdodCc6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3QtaGVpZ2h0J10gOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuICB9LFxufSk7XG4iLCAiZXhwb3J0IGNvbnN0IGlzVmFsaWRWaW1lb1VybCA9ICh1cmwpID0+IHtcbiAgcmV0dXJuIHVybC5tYXRjaCgvKHZpbWVvXFwuY29tKSguKyk/JC8pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVtYmVkVVJMRnJvbVZpbWVvVVJMID0gKG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyB1cmwsIGF1dG9wbGF5LCBsb29wLCB0aXRsZSwgYnlsaW5lLCBwb3J0cmFpdCB9ID0gb3B0aW9ucztcblxuICAvLyBpZiBpcyBhbHJlYWR5IGFuIGVtYmVkIHVybCwgcmV0dXJuIGl0XG4gIGlmICh1cmwuaW5jbHVkZXMoXCIvdmlkZW8vXCIpKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIGNvbnN0IHZpZGVvSWRSZWdleCA9IC9cXC5jb21cXC8oWzAtOV0rKS9nbTtcbiAgY29uc3QgbWF0Y2hlcyA9IHZpZGVvSWRSZWdleC5leGVjKHVybCk7XG5cbiAgaWYgKCFtYXRjaGVzIHx8ICFtYXRjaGVzWzFdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgb3V0cHV0VXJsID0gYGh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8ke21hdGNoZXNbMV19YDtcblxuICBjb25zdCBwYXJhbXMgPSBbYGF1dG9wbGF5PSR7YXV0b3BsYXl9YCwgYGxvb3A9JHtsb29wfWAsIGB0aXRsZT0ke3RpdGxlfWAsIGBieWxpbmU9JHtieWxpbmV9YCwgYHBvcnRyYWl0PSR7cG9ydHJhaXR9YF07XG5cbiAgb3V0cHV0VXJsICs9IGA/JHtwYXJhbXMuam9pbihcIiZcIil9YDtcblxuICByZXR1cm4gb3V0cHV0VXJsO1xufTtcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBnZXRFbWJlZFVSTEZyb21WaW1lb1VSTCwgaXNWYWxpZFZpbWVvVXJsIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7Z2V0RW1iZWRVUkxGcm9tWW91dHViZVVSTH0gZnJvbSBcIi4uL1lvdXR1YmUvdXRpbHMuanNcIjtcblxuZXhwb3J0IGNvbnN0IFZpbWVvID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcInZpbWVvXCIsXG5cbiAgc2VsZWN0YWJsZTogdHJ1ZSxcblxuICBkcmFnZ2FibGU6IHRydWUsXG5cbiAgYXRvbTogdHJ1ZSxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYWxsb3dGdWxsc2NyZWVuOiB0cnVlLFxuICAgICAgd2lkdGg6IDY0MCxcbiAgICAgIGhlaWdodDogNDgwLFxuICAgIH07XG4gIH0sXG5cbiAgaW5saW5lKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lO1xuICB9LFxuXG4gIGdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgfSxcblxuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLFxuICAgICAgfSxcbiAgICAgIHNyYzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy53aWR0aCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiksXG4gICAgICB9LFxuICAgICAgYXV0b3BsYXk6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBsb29wOiB7XG4gICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBieWxpbmU6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBwb3J0cmFpdDoge1xuICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgfSxcbiAgICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJyZXNwb25zaXZlXCIpID8/IGZhbHNlLFxuICAgICAgfSxcbiAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC13aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0Jzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtYXNwZWN0LWhlaWdodFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdltkYXRhLXZpbWVvLXZpZGVvXSBpZnJhbWVcIixcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0VmltZW9WaWRlbzpcbiAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICBpZiAoIWlzVmFsaWRWaW1lb1VybChvcHRpb25zLnNyYykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbWJlZFVybCA9IGdldEVtYmVkVVJMRnJvbVZpbWVvVVJMKHtcbiAgICAgICAgICAgIHVybDogb3B0aW9ucy5zcmMsXG4gICAgICAgICAgICBhdXRvcGxheTogb3B0aW9ucz8uYXV0b3BsYXkgfHwgMCxcbiAgICAgICAgICAgIGxvb3A6IG9wdGlvbnM/Lmxvb3AgfHwgMCxcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSB8fCAwLFxuICAgICAgICAgICAgYnlsaW5lOiBvcHRpb25zPy5ieWxpbmUgfHwgMCxcbiAgICAgICAgICAgIHBvcnRyYWl0OiBvcHRpb25zPy5wb3J0cmFpdCB8fCAwLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLmluc2VydENvbnRlbnQoe1xuICAgICAgICAgICAgdHlwZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgc3JjOiBlbWJlZFVybCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIGNvbnN0IGVtYmVkVXJsID0gZ2V0RW1iZWRVUkxGcm9tVmltZW9VUkwoe1xuICAgICAgdXJsOiBIVE1MQXR0cmlidXRlcy5zcmMsXG4gICAgICBhdXRvcGxheTogSFRNTEF0dHJpYnV0ZXM/LmF1dG9wbGF5IHx8IDAsXG4gICAgICBsb29wOiBIVE1MQXR0cmlidXRlcz8ubG9vcCB8fCAwLFxuICAgICAgdGl0bGU6IEhUTUxBdHRyaWJ1dGVzPy50aXRsZSB8fCAwLFxuICAgICAgYnlsaW5lOiBIVE1MQXR0cmlidXRlcz8uYnlsaW5lIHx8IDAsXG4gICAgICBwb3J0cmFpdDogSFRNTEF0dHJpYnV0ZXM/LnBvcnRyYWl0IHx8IDAsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHsgXCJkYXRhLXZpbWVvLXZpZGVvXCI6IFwiXCIsIGNsYXNzOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gXCJyZXNwb25zaXZlXCIgOiBudWxsIH0sXG4gICAgICBbXG4gICAgICAgIFwiaWZyYW1lXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzcmM6IGVtYmVkVXJsLFxuICAgICAgICAgIHdpZHRoOiBIVE1MQXR0cmlidXRlcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IEhUTUxBdHRyaWJ1dGVzLmhlaWdodCxcbiAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW46IHRoaXMub3B0aW9ucy5hbGxvd2Z1bGxzY3JlZW4sXG4gICAgICAgICAgZnJhbWVib3JkZXI6IDAsXG4gICAgICAgICAgYWxsb3c6IFwiYXV0b3BsYXk7IGZ1bGxzY3JlZW47IHBpY3R1cmUtaW4tcGljdHVyZVwiLFxuICAgICAgICAgIHN0eWxlOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gYGFzcGVjdC1yYXRpbzogJHtIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXX0gLyAke0hUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC1oZWlnaHQnXX07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87YCA6IG51bGwsXG4gICAgICAgICAgJ2RhdGEtYXNwZWN0LXdpZHRoJzogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IEhUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC13aWR0aCddIDogbnVsbCxcbiAgICAgICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0JzogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IEhUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC1oZWlnaHQnXSA6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5cbmV4cG9ydCBjb25zdCBWaWRlbyA9IE5vZGUuY3JlYXRlKHtcbiAgICBuYW1lOiBcInZpZGVvXCIsXG5cbiAgICBzZWxlY3RhYmxlOiB0cnVlLFxuXG4gICAgZHJhZ2dhYmxlOiB0cnVlLFxuXG4gICAgYXRvbTogdHJ1ZSxcblxuICAgIGlubGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmxpbmU7XG4gICAgfSxcblxuICAgIGdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmlubGluZSA/IFwiaW5saW5lXCIgOiBcImJsb2NrXCI7XG4gICAgfSxcblxuICAgIGFkZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICBhdXRvcGxheTogbnVsbCxcbiAgICAgICAgICAgICAgICBjb250cm9sczogbnVsbCxcbiAgICAgICAgICAgICAgICBsb29wOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgYWRkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmVzcG9uc2l2ZVwiKSA/PyBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzcmM6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLndpZHRoLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwid2lkdGhcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVpZ2h0OiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImhlaWdodFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRvcGxheToge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhdXRvcGxheVwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250cm9sczoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250cm9sc1wiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb29wOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImxvb3BcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RhdGEtYXNwZWN0LXdpZHRoJzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC13aWR0aFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC1oZWlnaHRcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBwYXJzZUhUTUwoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGFnOiBcImRpdltkYXRhLW5hdGl2ZS12aWRlb10gdmlkZW9cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfSxcblxuICAgIGFkZENvbW1hbmRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0VmlkZW86XG4gICAgICAgICAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICAgICAgICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kcy5pbnNlcnRDb250ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7IFwiZGF0YS1uYXRpdmUtdmlkZW9cIjogXCJcIiwgY2xhc3M6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBcInJlc3BvbnNpdmVcIiA6IG51bGwgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBcInZpZGVvXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzcmM6IEhUTUxBdHRyaWJ1dGVzLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IEhUTUxBdHRyaWJ1dGVzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IEhUTUxBdHRyaWJ1dGVzLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b3BsYXk6IEhUTUxBdHRyaWJ1dGVzLmF1dG9wbGF5ID8gJ3RydWUnIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHM6IEhUTUxBdHRyaWJ1dGVzLmNvbnRyb2xzID8gJ3RydWUnIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbG9vcDogSFRNTEF0dHJpYnV0ZXMubG9vcCA/ICd0cnVlJyA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gYGFzcGVjdC1yYXRpbzogJHtIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXX0gLyAke0hUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC1oZWlnaHQnXX07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC1oZWlnaHQnOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gSFRNTEF0dHJpYnV0ZXNbJ2RhdGEtYXNwZWN0LWhlaWdodCddIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgXTtcbiAgICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZmluZFBhcmVudE5vZGUsIGZpbmRDaGlsZHJlbiwgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzLCBkZWZhdWx0QmxvY2tBdCwgaXNBY3RpdmUgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb24sIFBsdWdpbiwgUGx1Z2luS2V5LCBUZXh0U2VsZWN0aW9uIH0gZnJvbSBcInByb3NlbWlycm9yLXN0YXRlXCI7XG5pbXBvcnQgeyBpc05vZGVWaXNpYmxlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjb25zdCBEZXRhaWxzID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcImRldGFpbHNcIixcblxuICBjb250ZW50OiBcImRldGFpbHNTdW1tYXJ5IGRldGFpbHNDb250ZW50XCIsXG5cbiAgZ3JvdXA6IFwiYmxvY2tcIixcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgYWxsb3dHYXBDdXJzb3I6IGZhbHNlLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IFwiZGV0YWlsc1wiLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRldGFpbHNcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcblxuICBhZGROb2RlVmlldygpIHtcbiAgICByZXR1cm4gKHsgZWRpdG9yLCBnZXRQb3MsIG5vZGUsIEhUTUxBdHRyaWJ1dGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzLCB7XG4gICAgICAgIFwiZGF0YS10eXBlXCI6IHRoaXMubmFtZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBkb20uc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZG9tLFxuICAgICAgICBjb250ZW50RE9NOiBkb20sXG4gICAgICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICFkb20uY29udGFpbnMobXV0YXRpb24udGFyZ2V0KSB8fCBkb20gPT09IG11dGF0aW9uLnRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlOiAodXBkYXRlZE5vZGUpID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlZE5vZGUudHlwZSAhPT0gdGhpcy50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9O1xuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXREZXRhaWxzOlxuICAgICAgICAoKSA9PlxuICAgICAgICAoeyBzdGF0ZSwgY2hhaW4gfSkgPT4ge1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICBjb25zdCB7IHNjaGVtYSwgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHNlbGVjdGlvbjtcbiAgICAgICAgICBjb25zdCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKTtcbiAgICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNsaWNlID0gc3RhdGUuZG9jLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gc2NoZW1hLm5vZGVzLmRldGFpbHNDb250ZW50LmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KHNsaWNlLmNvbnRlbnQpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gKChfYSA9IHNsaWNlLnRvSlNPTigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGVudCkgfHwgW107XG5cbiAgICAgICAgICByZXR1cm4gY2hhaW4oKVxuICAgICAgICAgICAgLmluc2VydENvbnRlbnRBdCh7IGZyb206IHJhbmdlLnN0YXJ0LCB0bzogcmFuZ2UuZW5kIH0sIHsgdHlwZTogdGhpcy5uYW1lLCBjb250ZW50OiBbeyB0eXBlOiBcImRldGFpbHNTdW1tYXJ5XCIgfSwgeyB0eXBlOiBcImRldGFpbHNDb250ZW50XCIsIGNvbnRlbnQgfV0gfSlcbiAgICAgICAgICAgIC5zZXRUZXh0U2VsZWN0aW9uKHJhbmdlLnN0YXJ0ICsgMilcbiAgICAgICAgICAgIC5ydW4oKTtcbiAgICAgICAgfSxcbiAgICAgIHVuc2V0RGV0YWlsczpcbiAgICAgICAgKCkgPT5cbiAgICAgICAgKHsgc3RhdGUsIGNoYWluIH0pID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgc2NoZW1hIH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZmluZFBhcmVudE5vZGUoKG5vZGUpID0+IG5vZGUudHlwZSA9PT0gdGhpcy50eXBlKShzZWxlY3Rpb24pO1xuICAgICAgICAgIGlmICghZGV0YWlscykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkZXRhaWxzU3VtbWFyaWVzID0gZmluZENoaWxkcmVuKGRldGFpbHMubm9kZSwgKG5vZGUpID0+IG5vZGUudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmRldGFpbHNTdW1tYXJ5KTtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzQ29udGVudHMgPSBmaW5kQ2hpbGRyZW4oZGV0YWlscy5ub2RlLCAobm9kZSkgPT4gbm9kZS50eXBlID09PSBzY2hlbWEubm9kZXMuZGV0YWlsc0NvbnRlbnQpO1xuICAgICAgICAgIGlmICghZGV0YWlsc1N1bW1hcmllcy5sZW5ndGggfHwgIWRldGFpbHNDb250ZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGV0YWlsc1N1bW1hcnkgPSBkZXRhaWxzU3VtbWFyaWVzWzBdO1xuICAgICAgICAgIGNvbnN0IGRldGFpbHNDb250ZW50ID0gZGV0YWlsc0NvbnRlbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGZyb20gPSBkZXRhaWxzLnBvcztcbiAgICAgICAgICBjb25zdCAkZnJvbSA9IHN0YXRlLmRvYy5yZXNvbHZlKGZyb20pO1xuICAgICAgICAgIGNvbnN0IHRvID0gZnJvbSArIGRldGFpbHMubm9kZS5ub2RlU2l6ZTtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IHsgZnJvbSwgdG8gfTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZGV0YWlsc0NvbnRlbnQubm9kZS5jb250ZW50LnRvSlNPTigpIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRUeXBlRm9yU3VtbWFyeSA9ICRmcm9tLnBhcmVudC50eXBlLmNvbnRlbnRNYXRjaC5kZWZhdWx0VHlwZTtcbiAgICAgICAgICAvLyBUT0RPOiB0aGlzIG1heSBicmVhayBmb3Igc29tZSBjdXN0b20gc2NoZW1hc1xuICAgICAgICAgIGNvbnN0IHN1bW1hcnlDb250ZW50ID0gZGVmYXVsdFR5cGVGb3JTdW1tYXJ5ID09PSBudWxsIHx8IGRlZmF1bHRUeXBlRm9yU3VtbWFyeSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVmYXVsdFR5cGVGb3JTdW1tYXJ5LmNyZWF0ZShudWxsLCBkZXRhaWxzU3VtbWFyeS5ub2RlLmNvbnRlbnQpLnRvSlNPTigpO1xuICAgICAgICAgIGNvbnN0IG1lcmdlZENvbnRlbnQgPSBbc3VtbWFyeUNvbnRlbnQsIC4uLmNvbnRlbnRdO1xuICAgICAgICAgIHJldHVybiBjaGFpbigpXG4gICAgICAgICAgICAuaW5zZXJ0Q29udGVudEF0KHJhbmdlLCBtZXJnZWRDb250ZW50KVxuICAgICAgICAgICAgLnNldFRleHRTZWxlY3Rpb24oZnJvbSArIDEpXG4gICAgICAgICAgICAucnVuKCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQmFja3NwYWNlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2NoZW1hLCBzZWxlY3Rpb24gfSA9IHRoaXMuZWRpdG9yLnN0YXRlO1xuICAgICAgICBjb25zdCB7IGVtcHR5LCAkYW5jaG9yIH0gPSBzZWxlY3Rpb247XG4gICAgICAgIGlmICghZW1wdHkgfHwgJGFuY2hvci5wYXJlbnQudHlwZSAhPT0gc2NoZW1hLm5vZGVzLmRldGFpbHNTdW1tYXJ5KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvciBzb21lIHJlYXNvbiBzYWZhcmkgcmVtb3ZlcyB0aGUgd2hvbGUgdGV4dCBjb250ZW50IHdpdGhpbiBhIGA8c3VtbWFyeT5gdGFnIG9uIGJhY2tzcGFjZVxuICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgdGV4dCBtYW51YWxseVxuICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZGlzY3Vzcy5wcm9zZW1pcnJvci5uZXQvdC9zYWZhcmktYmFja3NwYWNlLWJ1Zy13aXRoLWRldGFpbHMtdGFnLzQyMjNcbiAgICAgICAgaWYgKCRhbmNob3IucGFyZW50T2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmNvbW1hbmQoKHsgdHIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJvbSA9ICRhbmNob3IucG9zIC0gMTtcbiAgICAgICAgICAgIGNvbnN0IHRvID0gJGFuY2hvci5wb3M7XG4gICAgICAgICAgICB0ci5kZWxldGUoZnJvbSwgdG8pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLnVuc2V0RGV0YWlscygpO1xuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgRGV0YWlsc1N1bW1hcnkgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZGV0YWlsc1N1bW1hcnlcIixcbiAgY29udGVudDogXCJ0ZXh0KlwiLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgc2VsZWN0YWJsZTogZmFsc2UsXG4gIGlzb2xhdGluZzogdHJ1ZSxcbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH07XG4gIH0sXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IFwic3VtbWFyeVwiLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJzdW1tYXJ5XCIsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBOb2RlLCBtZXJnZUF0dHJpYnV0ZXMsIGZpbmRQYXJlbnROb2RlLCBkZWZhdWx0QmxvY2tBdCB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gXCJwcm9zZW1pcnJvci1zdGF0ZVwiO1xuXG5leHBvcnQgY29uc3QgRGV0YWlsc0NvbnRlbnQgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZGV0YWlsc0NvbnRlbnRcIixcblxuICBjb250ZW50OiBcImJsb2NrK1wiLFxuXG4gIGRlZmluaW5nOiB0cnVlLFxuXG4gIHNlbGVjdGFibGU6IGZhbHNlLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IGBkaXZbZGF0YS10eXBlPVwiZGV0YWlscy1jb250ZW50XCJdYCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJkaXZcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMsIHsgXCJkYXRhLXR5cGVcIjogXCJkZXRhaWxzLWNvbnRlbnRcIiB9KSwgMF07XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGFsbG93cyBkb3VibGUgZW50ZXIgdG8gZXhpdCBjb250ZW50IG5vZGVcbiAgICAgIEVudGVyOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXRlLCB2aWV3IH0gPSBlZGl0b3I7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgeyAkZnJvbSwgZW1wdHkgfSA9IHNlbGVjdGlvbjtcbiAgICAgICAgY29uc3QgZGV0YWlsc0NvbnRlbnQgPSBmaW5kUGFyZW50Tm9kZSgobm9kZSkgPT4gbm9kZS50eXBlID09PSB0aGlzLnR5cGUpKHNlbGVjdGlvbik7XG5cbiAgICAgICAgaWYgKCFlbXB0eSB8fCAhZGV0YWlsc0NvbnRlbnQgfHwgIWRldGFpbHNDb250ZW50Lm5vZGUuY2hpbGRDb3VudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZyb21JbmRleCA9ICRmcm9tLmluZGV4KGRldGFpbHNDb250ZW50LmRlcHRoKTtcbiAgICAgICAgY29uc3QgeyBjaGlsZENvdW50IH0gPSBkZXRhaWxzQ29udGVudC5ub2RlO1xuICAgICAgICBjb25zdCBpc0F0RW5kID0gY2hpbGRDb3VudCA9PT0gZnJvbUluZGV4ICsgMTtcblxuICAgICAgICBpZiAoIWlzQXRFbmQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0Q2hpbGRUeXBlID0gZGV0YWlsc0NvbnRlbnQubm9kZS50eXBlLmNvbnRlbnRNYXRjaC5kZWZhdWx0VHlwZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdENoaWxkTm9kZSA9IGRlZmF1bHRDaGlsZFR5cGUgPT09IG51bGwgfHwgZGVmYXVsdENoaWxkVHlwZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVmYXVsdENoaWxkVHlwZS5jcmVhdGVBbmRGaWxsKCk7XG5cbiAgICAgICAgaWYgKCFkZWZhdWx0Q2hpbGROb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJGNoaWxkUG9zID0gc3RhdGUuZG9jLnJlc29sdmUoZGV0YWlsc0NvbnRlbnQucG9zICsgMSk7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZEluZGV4ID0gY2hpbGRDb3VudCAtIDE7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZE5vZGUgPSBkZXRhaWxzQ29udGVudC5ub2RlLmNoaWxkKGxhc3RDaGlsZEluZGV4KTtcbiAgICAgICAgY29uc3QgbGFzdENoaWxkUG9zID0gJGNoaWxkUG9zLnBvc0F0SW5kZXgobGFzdENoaWxkSW5kZXgsIGRldGFpbHNDb250ZW50LmRlcHRoKTtcbiAgICAgICAgY29uc3QgbGFzdENoaWxkTm9kZUlzRW1wdHkgPSBsYXN0Q2hpbGROb2RlLmVxKGRlZmF1bHRDaGlsZE5vZGUpO1xuXG4gICAgICAgIGlmICghbGFzdENoaWxkTm9kZUlzRW1wdHkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhYm92ZSA9ICRmcm9tLm5vZGUoLTMpO1xuICAgICAgICBpZiAoIWFib3ZlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWZ0ZXIgPSAkZnJvbS5pbmRleEFmdGVyKC0zKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KGFib3ZlLmNvbnRlbnRNYXRjaEF0KGFmdGVyKSk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhYWJvdmUuY2FuUmVwbGFjZVdpdGgoYWZ0ZXIsIGFmdGVyLCB0eXBlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0eXBlLmNyZWF0ZUFuZEZpbGwoKTtcblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgcG9zID0gJGZyb20uYWZ0ZXIoLTIpO1xuICAgICAgICB0ci5yZXBsYWNlV2l0aChwb3MsIHBvcywgbm9kZSk7XG4gICAgICAgIGNvbnN0ICRwb3MgPSB0ci5kb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBTZWxlY3Rpb24ubmVhcigkcG9zLCAxKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7XG4gICAgICAgIGNvbnN0IGRlbGV0ZUZyb20gPSBsYXN0Q2hpbGRQb3M7XG4gICAgICAgIGNvbnN0IGRlbGV0ZVRvID0gbGFzdENoaWxkUG9zICsgbGFzdENoaWxkTm9kZS5ub2RlU2l6ZTtcbiAgICAgICAgdHIuZGVsZXRlKGRlbGV0ZUZyb20sIGRlbGV0ZVRvKTtcbiAgICAgICAgdHIuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlLCB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXksIFRleHRTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja09wdGlvbnMge1xuICAvKipcbiAgICogQWRkcyBhIHByZWZpeCB0byBsYW5ndWFnZSBjbGFzc2VzIHRoYXQgYXJlIGFwcGxpZWQgdG8gY29kZSB0YWdzLlxuICAgKiBEZWZhdWx0cyB0byBgJ2xhbmd1YWdlLSdgLlxuICAgKi9cbiAgbGFuZ3VhZ2VDbGFzc1ByZWZpeDogc3RyaW5nXG4gIC8qKlxuICAgKiBEZWZpbmUgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgZXhpdGVkIG9uIHRyaXBsZSBlbnRlci5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgZXhpdE9uVHJpcGxlRW50ZXI6IGJvb2xlYW5cbiAgLyoqXG4gICAqIERlZmluZSB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBleGl0ZWQgb24gYXJyb3cgZG93biBpZiB0aGVyZSBpcyBubyBub2RlIGFmdGVyIGl0LlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBleGl0T25BcnJvd0Rvd246IGJvb2xlYW5cbiAgLyoqXG4gICAqIEN1c3RvbSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlbmRlcmVkIEhUTUwgdGFnLlxuICAgKi9cbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGNvZGVCbG9jazoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBjb2RlIGJsb2NrXG4gICAgICAgKi9cbiAgICAgIHNldENvZGVCbG9jazogKGF0dHJpYnV0ZXM/OiB7IGxhbmd1YWdlOiBzdHJpbmcgfSkgPT4gUmV0dXJuVHlwZVxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgYSBjb2RlIGJsb2NrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUNvZGVCbG9jazogKGF0dHJpYnV0ZXM/OiB7IGxhbmd1YWdlOiBzdHJpbmcgfSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmFja3RpY2tJbnB1dFJlZ2V4ID0gL15gYGAoW2Etel0rKT9bXFxzXFxuXSQvXG5leHBvcnQgY29uc3QgdGlsZGVJbnB1dFJlZ2V4ID0gL15+fn4oW2Etel0rKT9bXFxzXFxuXSQvXG5cbmV4cG9ydCBjb25zdCBDb2RlQmxvY2sgPSBOb2RlLmNyZWF0ZTxDb2RlQmxvY2tPcHRpb25zPih7XG4gIG5hbWU6ICdjb2RlQmxvY2snLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhbmd1YWdlQ2xhc3NQcmVmaXg6ICdsYW5ndWFnZS0nLFxuICAgICAgZXhpdE9uVHJpcGxlRW50ZXI6IHRydWUsXG4gICAgICBleGl0T25BcnJvd0Rvd246IHRydWUsXG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIGNvbnRlbnQ6ICd0ZXh0KicsXG5cbiAgbWFya3M6ICcnLFxuXG4gIGdyb3VwOiAnYmxvY2snLFxuXG4gIGNvZGU6IHRydWUsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCB7IGxhbmd1YWdlQ2xhc3NQcmVmaXggfSA9IHRoaXMub3B0aW9uc1xuICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbLi4uKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdCB8fCBbXSldXG4gICAgICAgICAgY29uc3QgbGFuZ3VhZ2VzID0gY2xhc3NOYW1lc1xuICAgICAgICAgICAgLmZpbHRlcihjbGFzc05hbWUgPT4gY2xhc3NOYW1lLnN0YXJ0c1dpdGgobGFuZ3VhZ2VDbGFzc1ByZWZpeCkpXG4gICAgICAgICAgICAubWFwKGNsYXNzTmFtZSA9PiBjbGFzc05hbWUucmVwbGFjZShsYW5ndWFnZUNsYXNzUHJlZml4LCAnJykpXG4gICAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbMF1cblxuICAgICAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGxhbmd1YWdlXG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdwcmUnLFxuICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICdmdWxsJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBub2RlLCBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdwcmUnLFxuICAgICAgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLFxuICAgICAgW1xuICAgICAgICAnY29kZScsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzczogbm9kZS5hdHRycy5sYW5ndWFnZVxuICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VDbGFzc1ByZWZpeCArIG5vZGUuYXR0cnMubGFuZ3VhZ2VcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgMCxcbiAgICAgIF0sXG4gICAgXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRDb2RlQmxvY2s6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHRvZ2dsZUNvZGVCbG9jazpcbiAgICAgICAgYXR0cmlidXRlcyA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZU5vZGUodGhpcy5uYW1lLCAncGFyYWdyYXBoJywgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtQWx0LWMnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVDb2RlQmxvY2soKSxcblxuICAgICAgLy8gcmVtb3ZlIGNvZGUgYmxvY2sgd2hlbiBhdCBzdGFydCBvZiBkb2N1bWVudCBvciBjb2RlIGJsb2NrIGlzIGVtcHR5XG4gICAgICBCYWNrc3BhY2U6ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbXB0eSwgJGFuY2hvciB9ID0gdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzQXRTdGFydCA9ICRhbmNob3IucG9zID09PSAxXG5cbiAgICAgICAgaWYgKCFlbXB0eSB8fCAkYW5jaG9yLnBhcmVudC50eXBlLm5hbWUgIT09IHRoaXMubmFtZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXRTdGFydCB8fCAhJGFuY2hvci5wYXJlbnQudGV4dENvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmNsZWFyTm9kZXMoKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9LFxuXG4gICAgICAvLyBleGl0IG5vZGUgb24gdHJpcGxlIGVudGVyXG4gICAgICBFbnRlcjogKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZXhpdE9uVHJpcGxlRW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IGVkaXRvclxuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gc3RhdGVcbiAgICAgICAgY29uc3QgeyAkZnJvbSwgZW1wdHkgfSA9IHNlbGVjdGlvblxuXG4gICAgICAgIGlmICghZW1wdHkgfHwgJGZyb20ucGFyZW50LnR5cGUgIT09IHRoaXMudHlwZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNBdEVuZCA9ICRmcm9tLnBhcmVudE9mZnNldCA9PT0gJGZyb20ucGFyZW50Lm5vZGVTaXplIC0gMlxuICAgICAgICBjb25zdCBlbmRzV2l0aERvdWJsZU5ld2xpbmUgPSAkZnJvbS5wYXJlbnQudGV4dENvbnRlbnQuZW5kc1dpdGgoJ1xcblxcbicpXG5cbiAgICAgICAgaWYgKCFpc0F0RW5kIHx8ICFlbmRzV2l0aERvdWJsZU5ld2xpbmUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlZGl0b3JcbiAgICAgICAgICAuY2hhaW4oKVxuICAgICAgICAgIC5jb21tYW5kKCh7IHRyIH0pID0+IHtcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgkZnJvbS5wb3MgLSAyLCAkZnJvbS5wb3MpXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZXhpdENvZGUoKVxuICAgICAgICAgIC5ydW4oKVxuICAgICAgfSxcblxuICAgICAgLy8gZXhpdCBub2RlIG9uIGFycm93IGRvd25cbiAgICAgIEFycm93RG93bjogKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZXhpdE9uQXJyb3dEb3duKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSBlZGl0b3JcbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24sIGRvYyB9ID0gc3RhdGVcbiAgICAgICAgY29uc3QgeyAkZnJvbSwgZW1wdHkgfSA9IHNlbGVjdGlvblxuXG4gICAgICAgIGlmICghZW1wdHkgfHwgJGZyb20ucGFyZW50LnR5cGUgIT09IHRoaXMudHlwZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNBdEVuZCA9ICRmcm9tLnBhcmVudE9mZnNldCA9PT0gJGZyb20ucGFyZW50Lm5vZGVTaXplIC0gMlxuXG4gICAgICAgIGlmICghaXNBdEVuZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWZ0ZXIgPSAkZnJvbS5hZnRlcigpXG5cbiAgICAgICAgaWYgKGFmdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVBZnRlciA9IGRvYy5ub2RlQXQoYWZ0ZXIpXG5cbiAgICAgICAgaWYgKG5vZGVBZnRlcikge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVkaXRvci5jb21tYW5kcy5leGl0Q29kZSgpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogYmFja3RpY2tJbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGdldEF0dHJpYnV0ZXM6IG1hdGNoID0+ICh7XG4gICAgICAgICAgbGFuZ3VhZ2U6IG1hdGNoWzFdLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IHRpbGRlSW5wdXRSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICBnZXRBdHRyaWJ1dGVzOiBtYXRjaCA9PiAoe1xuICAgICAgICAgIGxhbmd1YWdlOiBtYXRjaFsxXSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAvLyB0aGlzIHBsdWdpbiBjcmVhdGVzIGEgY29kZSBibG9jayBmb3IgcGFzdGVkIGNvbnRlbnQgZnJvbSBWUyBDb2RlXG4gICAgICAvLyB3ZSBjYW4gYWxzbyBkZXRlY3QgdGhlIGNvcGllZCBjb2RlIGxhbmd1YWdlXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdjb2RlQmxvY2tWU0NvZGVIYW5kbGVyJyksXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgaGFuZGxlUGFzdGU6ICh2aWV3LCBldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudC5jbGlwYm9hcmREYXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkb27igJl0IGNyZWF0ZSBhIG5ldyBjb2RlIGJsb2NrIHdpdGhpbiBjb2RlIGJsb2Nrc1xuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yLmlzQWN0aXZlKHRoaXMudHlwZS5uYW1lKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpXG4gICAgICAgICAgICBjb25zdCB2c2NvZGUgPSBldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3ZzY29kZS1lZGl0b3ItZGF0YScpXG4gICAgICAgICAgICBjb25zdCB2c2NvZGVEYXRhID0gdnNjb2RlID8gSlNPTi5wYXJzZSh2c2NvZGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHZzY29kZURhdGE/Lm1vZGVcblxuICAgICAgICAgICAgaWYgKCF0ZXh0IHx8ICFsYW5ndWFnZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyB0ciB9ID0gdmlldy5zdGF0ZVxuXG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gZW1wdHkgY29kZSBibG9ja1xuICAgICAgICAgICAgdHIucmVwbGFjZVNlbGVjdGlvbldpdGgodGhpcy50eXBlLmNyZWF0ZSh7IGxhbmd1YWdlIH0pKVxuXG4gICAgICAgICAgICAvLyBwdXQgY3Vyc29yIGluc2lkZSB0aGUgbmV3bHkgY3JlYXRlZCBjb2RlIGJsb2NrXG4gICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKE1hdGgubWF4KDAsIHRyLnNlbGVjdGlvbi5mcm9tIC0gMikpKSlcblxuICAgICAgICAgICAgLy8gYWRkIHRleHQgdG8gY29kZSBibG9ja1xuICAgICAgICAgICAgLy8gc3RyaXAgY2FycmlhZ2UgcmV0dXJuIGNoYXJzIGZyb20gdGV4dCBwYXN0ZWQgYXMgY29kZVxuICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3Itdmlldy9jb21taXQvYTUwYTZiY2NlYjRjZTUyYWM4ZmNjNjE2MjQ4OGQ4ODc1NjEzYWFjZFxuICAgICAgICAgICAgdHIuaW5zZXJ0VGV4dCh0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgJ1xcbicpKVxuXG4gICAgICAgICAgICAvLyBzdG9yZSBtZXRhIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWZ1bCBmb3Igb3RoZXIgcGx1Z2lucyB0aGF0IGRlcGVuZHMgb24gdGhlIHBhc3RlIGV2ZW50XG4gICAgICAgICAgICAvLyBsaWtlIHRoZSBwYXN0ZSBydWxlIHBsdWdpblxuICAgICAgICAgICAgdHIuc2V0TWV0YSgncGFzdGUnLCB0cnVlKVxuXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgInZhciBkZWVwRnJlZXplRXM2ID0ge2V4cG9ydHM6IHt9fTtcblxuZnVuY3Rpb24gZGVlcEZyZWV6ZShvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIG9iai5jbGVhciA9IG9iai5kZWxldGUgPSBvYmouc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXAgaXMgcmVhZC1vbmx5Jyk7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgb2JqLmFkZCA9IG9iai5jbGVhciA9IG9iai5kZWxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldCBpcyByZWFkLW9ubHknKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGcmVlemUgc2VsZlxuICAgIE9iamVjdC5mcmVlemUob2JqKTtcblxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgcHJvcCA9IG9ialtuYW1lXTtcblxuICAgICAgICAvLyBGcmVlemUgcHJvcCBpZiBpdCBpcyBhbiBvYmplY3RcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09ICdvYmplY3QnICYmICFPYmplY3QuaXNGcm96ZW4ocHJvcCkpIHtcbiAgICAgICAgICAgIGRlZXBGcmVlemUocHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG59XG5cbmRlZXBGcmVlemVFczYuZXhwb3J0cyA9IGRlZXBGcmVlemU7XG5kZWVwRnJlZXplRXM2LmV4cG9ydHMuZGVmYXVsdCA9IGRlZXBGcmVlemU7XG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5DYWxsYmFja1Jlc3BvbnNlfSBDYWxsYmFja1Jlc3BvbnNlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRNb2RlfSBDb21waWxlZE1vZGUgKi9cbi8qKiBAaW1wbGVtZW50cyBDYWxsYmFja1Jlc3BvbnNlICovXG5cbmNsYXNzIFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlfSBtb2RlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICAgIGlmIChtb2RlLmRhdGEgPT09IHVuZGVmaW5lZCkgbW9kZS5kYXRhID0ge307XG5cbiAgICB0aGlzLmRhdGEgPSBtb2RlLmRhdGE7XG4gICAgdGhpcy5pc01hdGNoSWdub3JlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWdub3JlTWF0Y2goKSB7XG4gICAgdGhpcy5pc01hdGNoSWdub3JlZCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUhUTUwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAucmVwbGFjZSgvJy9nLCAnJiN4Mjc7Jyk7XG59XG5cbi8qKlxuICogcGVyZm9ybXMgYSBzaGFsbG93IG1lcmdlIG9mIG11bHRpcGxlIG9iamVjdHMgaW50byBvbmVcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBvcmlnaW5hbFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLGFueT5bXX0gb2JqZWN0c1xuICogQHJldHVybnMge1R9IGEgc2luZ2xlIG5ldyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaW5oZXJpdCQxKG9yaWdpbmFsLCAuLi5vYmplY3RzKSB7XG4gIC8qKiBAdHlwZSBSZWNvcmQ8c3RyaW5nLGFueT4gKi9cbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBvcmlnaW5hbCkge1xuICAgIHJlc3VsdFtrZXldID0gb3JpZ2luYWxba2V5XTtcbiAgfVxuICBvYmplY3RzLmZvckVhY2goZnVuY3Rpb24ob2JqKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge1R9ICovIChyZXN1bHQpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlbmRlcmVyXG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcpID0+IHZvaWR9IGFkZFRleHRcbiAqIEBwcm9wZXJ0eSB7KG5vZGU6IE5vZGUpID0+IHZvaWR9IG9wZW5Ob2RlXG4gKiBAcHJvcGVydHkgeyhub2RlOiBOb2RlKSA9PiB2b2lkfSBjbG9zZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB2YWx1ZVxuICovXG5cbi8qKiBAdHlwZWRlZiB7e3Njb3BlPzogc3RyaW5nLCBsYW5ndWFnZT86IHN0cmluZywgc3VibGFuZ3VhZ2U/OiBib29sZWFufX0gTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHt7d2FsazogKHI6IFJlbmRlcmVyKSA9PiB2b2lkfX0gVHJlZSAqL1xuLyoqICovXG5cbmNvbnN0IFNQQU5fQ0xPU0UgPSAnPC9zcGFuPic7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIG5vZGUgbmVlZHMgdG8gYmUgd3JhcHBlZCBpbiA8c3Bhbj5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgKi9cbmNvbnN0IGVtaXRzV3JhcHBpbmdUYWdzID0gKG5vZGUpID0+IHtcbiAgLy8gcmFyZWx5IHdlIGNhbiBoYXZlIGEgc3VibGFuZ3VhZ2Ugd2hlcmUgbGFuZ3VhZ2UgaXMgdW5kZWZpbmVkXG4gIC8vIFRPRE86IHRyYWNrIGRvd24gd2h5XG4gIHJldHVybiAhIW5vZGUuc2NvcGUgfHwgKG5vZGUuc3VibGFuZ3VhZ2UgJiYgbm9kZS5sYW5ndWFnZSk7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHt7cHJlZml4OnN0cmluZ319IG9wdGlvbnNcbiAqL1xuY29uc3Qgc2NvcGVUb0NTU0NsYXNzID0gKG5hbWUsIHsgcHJlZml4IH0pID0+IHtcbiAgaWYgKG5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgY29uc3QgcGllY2VzID0gbmFtZS5zcGxpdChcIi5cIik7XG4gICAgcmV0dXJuIFtcbiAgICAgIGAke3ByZWZpeH0ke3BpZWNlcy5zaGlmdCgpfWAsXG4gICAgICAuLi4ocGllY2VzLm1hcCgoeCwgaSkgPT4gYCR7eH0ke1wiX1wiLnJlcGVhdChpICsgMSl9YCkpXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxuICByZXR1cm4gYCR7cHJlZml4fSR7bmFtZX1gO1xufTtcblxuLyoqIEB0eXBlIHtSZW5kZXJlcn0gKi9cbmNsYXNzIEhUTUxSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEhUTUxSZW5kZXJlclxuICAgKlxuICAgKiBAcGFyYW0ge1RyZWV9IHBhcnNlVHJlZSAtIHRoZSBwYXJzZSB0cmVlIChtdXN0IHN1cHBvcnQgYHdhbGtgIEFQSSlcbiAgICogQHBhcmFtIHt7Y2xhc3NQcmVmaXg6IHN0cmluZ319IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcnNlVHJlZSwgb3B0aW9ucykge1xuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcbiAgICB0aGlzLmNsYXNzUHJlZml4ID0gb3B0aW9ucy5jbGFzc1ByZWZpeDtcbiAgICBwYXJzZVRyZWUud2Fsayh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRleHRzIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0ICovXG4gIGFkZFRleHQodGV4dCkge1xuICAgIHRoaXMuYnVmZmVyICs9IGVzY2FwZUhUTUwodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgb3BlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSAoaWYgbmVlZGVkKVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgKi9cbiAgb3Blbk5vZGUobm9kZSkge1xuICAgIGlmICghZW1pdHNXcmFwcGluZ1RhZ3Mobm9kZSkpIHJldHVybjtcblxuICAgIGxldCBjbGFzc05hbWUgPSBcIlwiO1xuICAgIGlmIChub2RlLnN1Ymxhbmd1YWdlKSB7XG4gICAgICBjbGFzc05hbWUgPSBgbGFuZ3VhZ2UtJHtub2RlLmxhbmd1YWdlfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsYXNzTmFtZSA9IHNjb3BlVG9DU1NDbGFzcyhub2RlLnNjb3BlLCB7IHByZWZpeDogdGhpcy5jbGFzc1ByZWZpeCB9KTtcbiAgICB9XG4gICAgdGhpcy5zcGFuKGNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgY2xvc2UgdG8gdGhlIG91dHB1dCBzdHJlYW0gKGlmIG5lZWRlZClcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGNsb3NlTm9kZShub2RlKSB7XG4gICAgaWYgKCFlbWl0c1dyYXBwaW5nVGFncyhub2RlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5idWZmZXIgKz0gU1BBTl9DTE9TRTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCBidWZmZXJcbiAgKi9cbiAgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLy8gaGVscGVyc1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzcGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAqL1xuICBzcGFuKGNsYXNzTmFtZSkge1xuICAgIHRoaXMuYnVmZmVyICs9IGA8c3BhbiBjbGFzcz1cIiR7Y2xhc3NOYW1lfVwiPmA7XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHt7c2NvcGU/OiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nLCBzdWJsYW5ndWFnZT86IGJvb2xlYW4sIGNoaWxkcmVuOiBOb2RlW119IHwgc3RyaW5nfSBOb2RlICovXG4vKiogQHR5cGVkZWYge3tzY29wZT86IHN0cmluZywgbGFuZ3VhZ2U/OiBzdHJpbmcsIHN1Ymxhbmd1YWdlPzogYm9vbGVhbiwgY2hpbGRyZW46IE5vZGVbXX0gfSBEYXRhTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkVtaXR0ZXJ9IEVtaXR0ZXIgKi9cbi8qKiAgKi9cblxuLyoqIEByZXR1cm5zIHtEYXRhTm9kZX0gKi9cbmNvbnN0IG5ld05vZGUgPSAob3B0cyA9IHt9KSA9PiB7XG4gIC8qKiBAdHlwZSBEYXRhTm9kZSAqL1xuICBjb25zdCByZXN1bHQgPSB7IGNoaWxkcmVuOiBbXSB9O1xuICBPYmplY3QuYXNzaWduKHJlc3VsdCwgb3B0cyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jbGFzcyBUb2tlblRyZWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKiogQHR5cGUgRGF0YU5vZGUgKi9cbiAgICB0aGlzLnJvb3ROb2RlID0gbmV3Tm9kZSgpO1xuICAgIHRoaXMuc3RhY2sgPSBbdGhpcy5yb290Tm9kZV07XG4gIH1cblxuICBnZXQgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gIH1cblxuICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMucm9vdE5vZGU7IH1cblxuICAvKiogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGFkZChub2RlKSB7XG4gICAgdGhpcy50b3AuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgKi9cbiAgb3Blbk5vZGUoc2NvcGUpIHtcbiAgICAvKiogQHR5cGUgTm9kZSAqL1xuICAgIGNvbnN0IG5vZGUgPSBuZXdOb2RlKHsgc2NvcGUgfSk7XG4gICAgdGhpcy5hZGQobm9kZSk7XG4gICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xuICB9XG5cbiAgY2xvc2VOb2RlKCkge1xuICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsb3NlQWxsTm9kZXMoKSB7XG4gICAgd2hpbGUgKHRoaXMuY2xvc2VOb2RlKCkpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3ROb2RlLCBudWxsLCA0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vaHRtbF9yZW5kZXJlclwiKS5SZW5kZXJlciB9IFJlbmRlcmVyXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IGJ1aWxkZXJcbiAgICovXG4gIHdhbGsoYnVpbGRlcikge1xuICAgIC8vIHRoaXMgZG9lcyBub3RcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgICAvLyB0aGlzIHdvcmtzXG4gICAgLy8gcmV0dXJuIFRva2VuVHJlZS5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSBidWlsZGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKi9cbiAgc3RhdGljIF93YWxrKGJ1aWxkZXIsIG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGJ1aWxkZXIuYWRkVGV4dChub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGJ1aWxkZXIub3Blbk5vZGUobm9kZSk7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLl93YWxrKGJ1aWxkZXIsIGNoaWxkKSk7XG4gICAgICBidWlsZGVyLmNsb3NlTm9kZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqL1xuICBzdGF0aWMgX2NvbGxhcHNlKG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHJldHVybjtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHJldHVybjtcblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmV2ZXJ5KGVsID0+IHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIC8vIG5vZGUudGV4dCA9IG5vZGUuY2hpbGRyZW4uam9pbihcIlwiKTtcbiAgICAgIC8vIGRlbGV0ZSBub2RlLmNoaWxkcmVuO1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IFtub2RlLmNoaWxkcmVuLmpvaW4oXCJcIildO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIFRva2VuVHJlZS5fY29sbGFwc2UoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICBDdXJyZW50bHkgdGhpcyBpcyBhbGwgcHJpdmF0ZSBBUEksIGJ1dCB0aGlzIGlzIHRoZSBtaW5pbWFsIEFQSSBuZWNlc3NhcnlcbiAgdGhhdCBhbiBFbWl0dGVyIG11c3QgaW1wbGVtZW50IHRvIGZ1bGx5IHN1cHBvcnQgdGhlIHBhcnNlci5cblxuICBNaW5pbWFsIGludGVyZmFjZTpcblxuICAtIGFkZEtleXdvcmQodGV4dCwgc2NvcGUpXG4gIC0gYWRkVGV4dCh0ZXh0KVxuICAtIGFkZFN1Ymxhbmd1YWdlKGVtaXR0ZXIsIHN1Ykxhbmd1YWdlTmFtZSlcbiAgLSBmaW5hbGl6ZSgpXG4gIC0gb3Blbk5vZGUoc2NvcGUpXG4gIC0gY2xvc2VOb2RlKClcbiAgLSBjbG9zZUFsbE5vZGVzKClcbiAgLSB0b0hUTUwoKVxuXG4qL1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtFbWl0dGVyfVxuICovXG5jbGFzcyBUb2tlblRyZWVFbWl0dGVyIGV4dGVuZHMgVG9rZW5UcmVlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVcbiAgICovXG4gIGFkZEtleXdvcmQodGV4dCwgc2NvcGUpIHtcbiAgICBpZiAodGV4dCA9PT0gXCJcIikgeyByZXR1cm47IH1cblxuICAgIHRoaXMub3Blbk5vZGUoc2NvcGUpO1xuICAgIHRoaXMuYWRkVGV4dCh0ZXh0KTtcbiAgICB0aGlzLmNsb3NlTm9kZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqL1xuICBhZGRUZXh0KHRleHQpIHtcbiAgICBpZiAodGV4dCA9PT0gXCJcIikgeyByZXR1cm47IH1cblxuICAgIHRoaXMuYWRkKHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RW1pdHRlciAmIHtyb290OiBEYXRhTm9kZX19IGVtaXR0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGFkZFN1Ymxhbmd1YWdlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgICAvKiogQHR5cGUgRGF0YU5vZGUgKi9cbiAgICBjb25zdCBub2RlID0gZW1pdHRlci5yb290O1xuICAgIG5vZGUuc3VibGFuZ3VhZ2UgPSB0cnVlO1xuICAgIG5vZGUubGFuZ3VhZ2UgPSBuYW1lO1xuICAgIHRoaXMuYWRkKG5vZGUpO1xuICB9XG5cbiAgdG9IVE1MKCkge1xuICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IEhUTUxSZW5kZXJlcih0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHJldHVybiByZW5kZXJlci52YWx1ZSgpO1xuICB9XG5cbiAgZmluYWxpemUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtSZWdFeHB9XG4gKiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHNvdXJjZShyZSkge1xuICBpZiAoIXJlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiByZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHJlO1xuXG4gIHJldHVybiByZS5zb3VyY2U7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmcgfSByZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gbG9va2FoZWFkKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/PScsIHJlLCAnKScpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGFueU51bWJlck9mVGltZXMocmUpIHtcbiAgcmV0dXJuIGNvbmNhdCgnKD86JywgcmUsICcpKicpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9wdGlvbmFsKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/OicsIHJlLCAnKT8nKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLihSZWdFeHAgfCBzdHJpbmcpIH0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29uY2F0KC4uLmFyZ3MpIHtcbiAgY29uc3Qgam9pbmVkID0gYXJncy5tYXAoKHgpID0+IHNvdXJjZSh4KSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBBcnJheTxzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3Q+IH0gYXJnc1xuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncykge1xuICBjb25zdCBvcHRzID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcgJiYgb3B0cy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgYXJncy5zcGxpY2UoYXJncy5sZW5ndGggLSAxLCAxKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHsge2NhcHR1cmU/OiBib29sZWFufSB9IFJlZ2V4RWl0aGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIEFueSBvZiB0aGUgcGFzc2VkIGV4cHJlc3NzaW9ucyBtYXkgbWF0Y2hcbiAqXG4gKiBDcmVhdGVzIGEgaHVnZSB0aGlzIHwgdGhpcyB8IHRoYXQgfCB0aGF0IG1hdGNoXG4gKiBAcGFyYW0geyhSZWdFeHAgfCBzdHJpbmcpW10gfCBbLi4uKFJlZ0V4cCB8IHN0cmluZylbXSwgUmVnZXhFaXRoZXJPcHRpb25zXX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZWl0aGVyKC4uLmFyZ3MpIHtcbiAgLyoqIEB0eXBlIHsgb2JqZWN0ICYge2NhcHR1cmU/OiBib29sZWFufSB9ICAqL1xuICBjb25zdCBvcHRzID0gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncyk7XG4gIGNvbnN0IGpvaW5lZCA9ICcoJ1xuICAgICsgKG9wdHMuY2FwdHVyZSA/IFwiXCIgOiBcIj86XCIpXG4gICAgKyBhcmdzLm1hcCgoeCkgPT4gc291cmNlKHgpKS5qb2luKFwifFwiKSArIFwiKVwiO1xuICByZXR1cm4gam9pbmVkO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nfSByZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gY291bnRNYXRjaEdyb3VwcyhyZSkge1xuICByZXR1cm4gKG5ldyBSZWdFeHAocmUudG9TdHJpbmcoKSArICd8JykpLmV4ZWMoJycpLmxlbmd0aCAtIDE7XG59XG5cbi8qKlxuICogRG9lcyBsZXhlbWUgc3RhcnQgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZXhlbWVcbiAqL1xuZnVuY3Rpb24gc3RhcnRzV2l0aChyZSwgbGV4ZW1lKSB7XG4gIGNvbnN0IG1hdGNoID0gcmUgJiYgcmUuZXhlYyhsZXhlbWUpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2guaW5kZXggPT09IDA7XG59XG5cbi8vIEJBQ0tSRUZfUkUgbWF0Y2hlcyBhbiBvcGVuIHBhcmVudGhlc2lzIG9yIGJhY2tyZWZlcmVuY2UuIFRvIGF2b2lkXG4vLyBhbiBpbmNvcnJlY3QgcGFyc2UsIGl0IGFkZGl0aW9uYWxseSBtYXRjaGVzIHRoZSBmb2xsb3dpbmc6XG4vLyAtIFsuLi5dIGVsZW1lbnRzLCB3aGVyZSB0aGUgbWVhbmluZyBvZiBwYXJlbnRoZXNlcyBhbmQgZXNjYXBlcyBjaGFuZ2Vcbi8vIC0gb3RoZXIgZXNjYXBlIHNlcXVlbmNlcywgc28gd2UgZG8gbm90IG1pc3BhcnNlIGVzY2FwZSBzZXF1ZW5jZXMgYXNcbi8vICAgaW50ZXJlc3RpbmcgZWxlbWVudHNcbi8vIC0gbm9uLW1hdGNoaW5nIG9yIGxvb2thaGVhZCBwYXJlbnRoZXNlcywgd2hpY2ggZG8gbm90IGNhcHR1cmUuIFRoZXNlXG4vLyAgIGZvbGxvdyB0aGUgJygnIHdpdGggYSAnPycuXG5jb25zdCBCQUNLUkVGX1JFID0gL1xcWyg/OlteXFxcXFxcXV18XFxcXC4pKlxcXXxcXChcXD8/fFxcXFwoWzEtOV1bMC05XSopfFxcXFwuLztcblxuLy8gKipJTlRFUk5BTCoqIE5vdCBpbnRlbmRlZCBmb3Igb3V0c2lkZSB1c2FnZVxuLy8gam9pbiBsb2dpY2FsbHkgY29tcHV0ZXMgcmVnZXhwcy5qb2luKHNlcGFyYXRvciksIGJ1dCBmaXhlcyB0aGVcbi8vIGJhY2tyZWZlcmVuY2VzIHNvIHRoZXkgY29udGludWUgdG8gbWF0Y2guXG4vLyBpdCBhbHNvIHBsYWNlcyBlYWNoIGluZGl2aWR1YWwgcmVndWxhciBleHByZXNzaW9uIGludG8gaXQncyBvd25cbi8vIG1hdGNoIGdyb3VwLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzZXF1ZW5jaW5nIG9mIHRob3NlIG1hdGNoIGdyb3Vwc1xuLy8gaXMgY3VycmVudGx5IGFuIGV4ZXJjaXNlIGZvciB0aGUgY2FsbGVyLiA6LSlcbi8qKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgUmVnRXhwKVtdfSByZWdleHBzXG4gKiBAcGFyYW0ge3tqb2luV2l0aDogc3RyaW5nfX0gb3B0c1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhyZWdleHBzLCB7IGpvaW5XaXRoIH0pIHtcbiAgbGV0IG51bUNhcHR1cmVzID0gMDtcblxuICByZXR1cm4gcmVnZXhwcy5tYXAoKHJlZ2V4KSA9PiB7XG4gICAgbnVtQ2FwdHVyZXMgKz0gMTtcbiAgICBjb25zdCBvZmZzZXQgPSBudW1DYXB0dXJlcztcbiAgICBsZXQgcmUgPSBzb3VyY2UocmVnZXgpO1xuICAgIGxldCBvdXQgPSAnJztcblxuICAgIHdoaWxlIChyZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IEJBQ0tSRUZfUkUuZXhlYyhyZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG91dCArPSByZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvdXQgKz0gcmUuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgIHJlID0gcmUuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgIGlmIChtYXRjaFswXVswXSA9PT0gJ1xcXFwnICYmIG1hdGNoWzFdKSB7XG4gICAgICAgIC8vIEFkanVzdCB0aGUgYmFja3JlZmVyZW5jZS5cbiAgICAgICAgb3V0ICs9ICdcXFxcJyArIFN0cmluZyhOdW1iZXIobWF0Y2hbMV0pICsgb2Zmc2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSBtYXRjaFswXTtcbiAgICAgICAgaWYgKG1hdGNoWzBdID09PSAnKCcpIHtcbiAgICAgICAgICBudW1DYXB0dXJlcysrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH0pLm1hcChyZSA9PiBgKCR7cmV9KWApLmpvaW4oam9pbldpdGgpO1xufVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLk1vZGVDYWxsYmFja30gTW9kZUNhbGxiYWNrICovXG5cbi8vIENvbW1vbiByZWdleHBzXG5jb25zdCBNQVRDSF9OT1RISU5HX1JFID0gL1xcYlxcQi87XG5jb25zdCBJREVOVF9SRSA9ICdbYS16QS1aXVxcXFx3Kic7XG5jb25zdCBVTkRFUlNDT1JFX0lERU5UX1JFID0gJ1thLXpBLVpfXVxcXFx3Kic7XG5jb25zdCBOVU1CRVJfUkUgPSAnXFxcXGJcXFxcZCsoXFxcXC5cXFxcZCspPyc7XG5jb25zdCBDX05VTUJFUl9SRSA9ICcoLT8pKFxcXFxiMFt4WF1bYS1mQS1GMC05XSt8KFxcXFxiXFxcXGQrKFxcXFwuXFxcXGQqKT98XFxcXC5cXFxcZCspKFtlRV1bLStdP1xcXFxkKyk/KSc7IC8vIDB4Li4uLCAwLi4uLCBkZWNpbWFsLCBmbG9hdFxuY29uc3QgQklOQVJZX05VTUJFUl9SRSA9ICdcXFxcYigwYlswMV0rKSc7IC8vIDBiLi4uXG5jb25zdCBSRV9TVEFSVEVSU19SRSA9ICchfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFxcXCp8XFxcXCo9fFxcXFwrfFxcXFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFxcXD98XFxcXFt8XFxcXHt8XFxcXCh8XFxcXF58XFxcXF49fFxcXFx8fFxcXFx8PXxcXFxcfFxcXFx8fH4nO1xuXG4vKipcbiogQHBhcmFtIHsgUGFydGlhbDxNb2RlPiAmIHtiaW5hcnk/OiBzdHJpbmcgfCBSZWdFeHB9IH0gb3B0c1xuKi9cbmNvbnN0IFNIRUJBTkcgPSAob3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IGJlZ2luU2hlYmFuZyA9IC9eIyFbIF0qXFwvLztcbiAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgb3B0cy5iZWdpbiA9IGNvbmNhdChcbiAgICAgIGJlZ2luU2hlYmFuZyxcbiAgICAgIC8uKlxcYi8sXG4gICAgICBvcHRzLmJpbmFyeSxcbiAgICAgIC9cXGIuKi8pO1xuICB9XG4gIHJldHVybiBpbmhlcml0JDEoe1xuICAgIHNjb3BlOiAnbWV0YScsXG4gICAgYmVnaW46IGJlZ2luU2hlYmFuZyxcbiAgICBlbmQ6IC8kLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAgLyoqIEB0eXBlIHtNb2RlQ2FsbGJhY2t9ICovXG4gICAgXCJvbjpiZWdpblwiOiAobSwgcmVzcCkgPT4ge1xuICAgICAgaWYgKG0uaW5kZXggIT09IDApIHJlc3AuaWdub3JlTWF0Y2goKTtcbiAgICB9XG4gIH0sIG9wdHMpO1xufTtcblxuLy8gQ29tbW9uIG1vZGVzXG5jb25zdCBCQUNLU0xBU0hfRVNDQVBFID0ge1xuICBiZWdpbjogJ1xcXFxcXFxcW1xcXFxzXFxcXFNdJywgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQVBPU19TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1xcJycsXG4gIGVuZDogJ1xcJycsXG4gIGlsbGVnYWw6ICdcXFxcbicsXG4gIGNvbnRhaW5zOiBbQkFDS1NMQVNIX0VTQ0FQRV1cbn07XG5jb25zdCBRVU9URV9TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1wiJyxcbiAgZW5kOiAnXCInLFxuICBpbGxlZ2FsOiAnXFxcXG4nLFxuICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG59O1xuY29uc3QgUEhSQVNBTF9XT1JEU19NT0RFID0ge1xuICBiZWdpbjogL1xcYihhfGFufHRoZXxhcmV8SSdtfGlzbid0fGRvbid0fGRvZXNuJ3R8d29uJ3R8YnV0fGp1c3R8c2hvdWxkfHByZXR0eXxzaW1wbHl8ZW5vdWdofGdvbm5hfGdvaW5nfHd0Znxzb3xzdWNofHdpbGx8eW91fHlvdXJ8dGhleXxsaWtlfG1vcmUpXFxiL1xufTtcbi8qKlxuICogQ3JlYXRlcyBhIGNvbW1lbnQgbW9kZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBiZWdpblxuICogQHBhcmFtIHtzdHJpbmcgfCBSZWdFeHB9IGVuZFxuICogQHBhcmFtIHtNb2RlIHwge319IFttb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXJ0aWFsPE1vZGU+fVxuICovXG5jb25zdCBDT01NRU5UID0gZnVuY3Rpb24oYmVnaW4sIGVuZCwgbW9kZU9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtb2RlID0gaW5oZXJpdCQxKFxuICAgIHtcbiAgICAgIHNjb3BlOiAnY29tbWVudCcsXG4gICAgICBiZWdpbixcbiAgICAgIGVuZCxcbiAgICAgIGNvbnRhaW5zOiBbXVxuICAgIH0sXG4gICAgbW9kZU9wdGlvbnNcbiAgKTtcbiAgbW9kZS5jb250YWlucy5wdXNoKHtcbiAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgLy8gaGFjayB0byBhdm9pZCB0aGUgc3BhY2UgZnJvbSBiZWluZyBpbmNsdWRlZC4gdGhlIHNwYWNlIGlzIG5lY2Vzc2FyeSB0b1xuICAgIC8vIG1hdGNoIGhlcmUgdG8gcHJldmVudCB0aGUgcGxhaW4gdGV4dCBydWxlIGJlbG93IGZyb20gZ29iYmxpbmcgdXAgZG9jdGFnc1xuICAgIGJlZ2luOiAnWyBdKig/PShUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKTopJyxcbiAgICBlbmQ6IC8oVE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6LyxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH0pO1xuICBjb25zdCBFTkdMSVNIX1dPUkQgPSBlaXRoZXIoXG4gICAgLy8gbGlzdCBvZiBjb21tb24gMSBhbmQgMiBsZXR0ZXIgd29yZHMgaW4gRW5nbGlzaFxuICAgIFwiSVwiLFxuICAgIFwiYVwiLFxuICAgIFwiaXNcIixcbiAgICBcInNvXCIsXG4gICAgXCJ1c1wiLFxuICAgIFwidG9cIixcbiAgICBcImF0XCIsXG4gICAgXCJpZlwiLFxuICAgIFwiaW5cIixcbiAgICBcIml0XCIsXG4gICAgXCJvblwiLFxuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBjb250cmFjdGlvbnMsIGp1c3QgcG9wdWxhciBvbmVzXG4gICAgL1tBLVphLXpdK1snXShkfHZlfHJlfGxsfHR8c3xuKS8sIC8vIGNvbnRyYWN0aW9ucyAtIGNhbid0IHdlJ2QgdGhleSdyZSBsZXQncywgZXRjXG4gICAgL1tBLVphLXpdK1stXVthLXpdKy8sIC8vIGBuby13YXlgLCBldGMuXG4gICAgL1tBLVphLXpdW2Etel17Mix9LyAvLyBhbGxvdyBjYXBpdGFsaXplZCB3b3JkcyBhdCBiZWdpbm5pbmcgb2Ygc2VudGVuY2VzXG4gICk7XG4gIC8vIGxvb2tpbmcgbGlrZSBwbGFpbiB0ZXh0LCBtb3JlIGxpa2VseSB0byBiZSBhIGNvbW1lbnRcbiAgbW9kZS5jb250YWlucy5wdXNoKFxuICAgIHtcbiAgICAgIC8vIFRPRE86IGhvdyB0byBpbmNsdWRlIFwiLCAoLCApIHdpdGhvdXQgYnJlYWtpbmcgZ3JhbW1hcnMgdGhhdCB1c2UgdGhlc2UgZm9yXG4gICAgICAvLyBjb21tZW50IGRlbGltaXRlcnM/XG4gICAgICAvLyBiZWdpbjogL1sgXSsoWygpXCJdPyhbQS1aYS16Jy1dezMsfXxpc3xhfEl8c298dXN8W3RUXVtvT118YXR8aWZ8aW58aXR8b24pWy5dP1soKVwiOl0/KFsuXVsgXXxbIF18XFwpKSl7M30vXG4gICAgICAvLyAtLS1cblxuICAgICAgLy8gdGhpcyB0cmllcyB0byBmaW5kIHNlcXVlbmNlcyBvZiAzIGVuZ2xpc2ggd29yZHMgaW4gYSByb3cgKHdpdGhvdXQgYW55XG4gICAgICAvLyBcInByb2dyYW1taW5nXCIgdHlwZSBzeW50YXgpIHRoaXMgZ2l2ZXMgdXMgYSBzdHJvbmcgc2lnbmFsIHRoYXQgd2UndmVcbiAgICAgIC8vIFRSVUxZIGZvdW5kIGEgY29tbWVudCAtIHZzIHBlcmhhcHMgc2Nhbm5pbmcgd2l0aCB0aGUgd3JvbmcgbGFuZ3VhZ2UuXG4gICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgTE9PS1MgbGlrZSB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAvLyBjb21tZW50IC0gYnV0IHRoZW4gaWYgdGhlcmUgaXMgbm8gcmVhZGFibGUgdGV4dCAtIGdvb2QgY2hhbmNlIGl0IGlzIGFcbiAgICAgIC8vIGZhbHNlIG1hdGNoIGFuZCBub3QgYSBjb21tZW50LlxuICAgICAgLy9cbiAgICAgIC8vIGZvciBhIHZpc3VhbCBleGFtcGxlIHBsZWFzZSBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yODI3XG5cbiAgICAgIGJlZ2luOiBjb25jYXQoXG4gICAgICAgIC9bIF0rLywgLy8gbmVjZXNzYXJ5IHRvIHByZXZlbnQgdXMgZ29iYmxpbmcgdXAgZG9jdGFncyBsaWtlIC8qIEBhdXRob3IgQm9iIE1jZ2lsbCAqL1xuICAgICAgICAnKCcsXG4gICAgICAgIEVOR0xJU0hfV09SRCxcbiAgICAgICAgL1suXT9bOl0/KFsuXVsgXXxbIF0pLyxcbiAgICAgICAgJyl7M30nKSAvLyBsb29rIGZvciAzIHdvcmRzIGluIGEgcm93XG4gICAgfVxuICApO1xuICByZXR1cm4gbW9kZTtcbn07XG5jb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gQ09NTUVOVCgnLy8nLCAnJCcpO1xuY29uc3QgQ19CTE9DS19DT01NRU5UX01PREUgPSBDT01NRU5UKCcvXFxcXConLCAnXFxcXCovJyk7XG5jb25zdCBIQVNIX0NPTU1FTlRfTU9ERSA9IENPTU1FTlQoJyMnLCAnJCcpO1xuY29uc3QgTlVNQkVSX01PREUgPSB7XG4gIHNjb3BlOiAnbnVtYmVyJyxcbiAgYmVnaW46IE5VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQ19OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQ19OVU1CRVJfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IEJJTkFSWV9OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQklOQVJZX05VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgUkVHRVhQX01PREUgPSB7XG4gIC8vIHRoaXMgb3V0ZXIgcnVsZSBtYWtlcyBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgYSBXSE9MRSByZWdleCBhbmQgbm90IHNpbXBseVxuICAvLyBhbiBleHByZXNzaW9uIHN1Y2ggYXM6XG4gIC8vXG4gIC8vICAgICAzIC8gc29tZXRoaW5nXG4gIC8vXG4gIC8vICh3aGljaCB3aWxsIHRoZW4gYmxvdyB1cCB3aGVuIHJlZ2V4J3MgYGlsbGVnYWxgIHNlZXMgdGhlIG5ld2xpbmUpXG4gIGJlZ2luOiAvKD89XFwvW14vXFxuXSpcXC8pLyxcbiAgY29udGFpbnM6IFt7XG4gICAgc2NvcGU6ICdyZWdleHAnLFxuICAgIGJlZ2luOiAvXFwvLyxcbiAgICBlbmQ6IC9cXC9bZ2ltdXldKi8sXG4gICAgaWxsZWdhbDogL1xcbi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXFxdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG4gICAgICB9XG4gICAgXVxuICB9XVxufTtcbmNvbnN0IFRJVExFX01PREUgPSB7XG4gIHNjb3BlOiAndGl0bGUnLFxuICBiZWdpbjogSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IFVOREVSU0NPUkVfVElUTEVfTU9ERSA9IHtcbiAgc2NvcGU6ICd0aXRsZScsXG4gIGJlZ2luOiBVTkRFUlNDT1JFX0lERU5UX1JFLFxuICByZWxldmFuY2U6IDBcbn07XG5jb25zdCBNRVRIT0RfR1VBUkQgPSB7XG4gIC8vIGV4Y2x1ZGVzIG1ldGhvZCBuYW1lcyBmcm9tIGtleXdvcmQgcHJvY2Vzc2luZ1xuICBiZWdpbjogJ1xcXFwuXFxcXHMqJyArIFVOREVSU0NPUkVfSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcblxuLyoqXG4gKiBBZGRzIGVuZCBzYW1lIGFzIGJlZ2luIG1lY2hhbmljcyB0byBhIG1vZGVcbiAqXG4gKiBZb3VyIG1vZGUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IGEgc2luZ2xlICgpIG1hdGNoIGdyb3VwIGFzIHRoYXQgZmlyc3QgbWF0Y2hcbiAqIGdyb3VwIGlzIHdoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvblxuICogQHBhcmFtIHtQYXJ0aWFsPE1vZGU+fSBtb2RlXG4gKi9cbmNvbnN0IEVORF9TQU1FX0FTX0JFR0lOID0gZnVuY3Rpb24obW9kZSkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihtb2RlLFxuICAgIHtcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmJlZ2luJzogKG0sIHJlc3ApID0+IHsgcmVzcC5kYXRhLl9iZWdpbk1hdGNoID0gbVsxXTsgfSxcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmVuZCc6IChtLCByZXNwKSA9PiB7IGlmIChyZXNwLmRhdGEuX2JlZ2luTWF0Y2ggIT09IG1bMV0pIHJlc3AuaWdub3JlTWF0Y2goKTsgfVxuICAgIH0pO1xufTtcblxudmFyIE1PREVTID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBNQVRDSF9OT1RISU5HX1JFOiBNQVRDSF9OT1RISU5HX1JFLFxuICAgIElERU5UX1JFOiBJREVOVF9SRSxcbiAgICBVTkRFUlNDT1JFX0lERU5UX1JFOiBVTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgIE5VTUJFUl9SRTogTlVNQkVSX1JFLFxuICAgIENfTlVNQkVSX1JFOiBDX05VTUJFUl9SRSxcbiAgICBCSU5BUllfTlVNQkVSX1JFOiBCSU5BUllfTlVNQkVSX1JFLFxuICAgIFJFX1NUQVJURVJTX1JFOiBSRV9TVEFSVEVSU19SRSxcbiAgICBTSEVCQU5HOiBTSEVCQU5HLFxuICAgIEJBQ0tTTEFTSF9FU0NBUEU6IEJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgQVBPU19TVFJJTkdfTU9ERTogQVBPU19TVFJJTkdfTU9ERSxcbiAgICBRVU9URV9TVFJJTkdfTU9ERTogUVVPVEVfU1RSSU5HX01PREUsXG4gICAgUEhSQVNBTF9XT1JEU19NT0RFOiBQSFJBU0FMX1dPUkRTX01PREUsXG4gICAgQ09NTUVOVDogQ09NTUVOVCxcbiAgICBDX0xJTkVfQ09NTUVOVF9NT0RFOiBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgIENfQkxPQ0tfQ09NTUVOVF9NT0RFOiBDX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBIQVNIX0NPTU1FTlRfTU9ERTogSEFTSF9DT01NRU5UX01PREUsXG4gICAgTlVNQkVSX01PREU6IE5VTUJFUl9NT0RFLFxuICAgIENfTlVNQkVSX01PREU6IENfTlVNQkVSX01PREUsXG4gICAgQklOQVJZX05VTUJFUl9NT0RFOiBCSU5BUllfTlVNQkVSX01PREUsXG4gICAgUkVHRVhQX01PREU6IFJFR0VYUF9NT0RFLFxuICAgIFRJVExFX01PREU6IFRJVExFX01PREUsXG4gICAgVU5ERVJTQ09SRV9USVRMRV9NT0RFOiBVTkRFUlNDT1JFX1RJVExFX01PREUsXG4gICAgTUVUSE9EX0dVQVJEOiBNRVRIT0RfR1VBUkQsXG4gICAgRU5EX1NBTUVfQVNfQkVHSU46IEVORF9TQU1FX0FTX0JFR0lOXG59KTtcblxuLyoqXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5DYWxsYmFja1Jlc3BvbnNlfSBDYWxsYmFja1Jlc3BvbnNlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Db21waWxlckV4dH0gQ29tcGlsZXJFeHRcbiovXG5cbi8vIEdyYW1tYXIgZXh0ZW5zaW9ucyAvIHBsdWdpbnNcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjgzM1xuXG4vLyBHcmFtbWFyIGV4dGVuc2lvbnMgYWxsb3cgXCJzeW50YWN0aWMgc3VnYXJcIiB0byBiZSBhZGRlZCB0byB0aGUgZ3JhbW1hciBtb2Rlc1xuLy8gd2l0aG91dCByZXF1aXJpbmcgYW55IHVuZGVybHlpbmcgY2hhbmdlcyB0byB0aGUgY29tcGlsZXIgaW50ZXJuYWxzLlxuXG4vLyBgY29tcGlsZU1hdGNoYCBiZWluZyB0aGUgcGVyZmVjdCBzbWFsbCBleGFtcGxlIG9mIG5vdyBhbGxvd2luZyBhIGdyYW1tYXJcbi8vIGF1dGhvciB0byB3cml0ZSBgbWF0Y2hgIHdoZW4gdGhleSBkZXNpcmUgdG8gbWF0Y2ggYSBzaW5nbGUgZXhwcmVzc2lvbiByYXRoZXJcbi8vIHRoYW4gYmVpbmcgZm9yY2VkIHRvIHVzZSBgYmVnaW5gLiAgVGhlIGV4dGVuc2lvbiB0aGVuIGp1c3QgbW92ZXMgYG1hdGNoYCBpbnRvXG4vLyBgYmVnaW5gIHdoZW4gaXQgcnVucy4gIEllLCBubyBmZWF0dXJlcyBoYXZlIGJlZW4gYWRkZWQsIGJ1dCB3ZSd2ZSBqdXN0IG1hZGVcbi8vIHRoZSBleHBlcmllbmNlIG9mIHdyaXRpbmcgKGFuZCByZWFkaW5nIGdyYW1tYXJzKSBhIGxpdHRsZSBiaXQgbmljZXIuXG5cbi8vIC0tLS0tLVxuXG4vLyBUT0RPOiBXZSBuZWVkIG5lZ2F0aXZlIGxvb2stYmVoaW5kIHN1cHBvcnQgdG8gZG8gdGhpcyBwcm9wZXJseVxuLyoqXG4gKiBTa2lwIGEgbWF0Y2ggaWYgaXQgaGFzIGEgcHJlY2VkaW5nIGRvdFxuICpcbiAqIFRoaXMgaXMgdXNlZCBmb3IgYGJlZ2luS2V5d29yZHNgIHRvIHByZXZlbnQgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgc3VjaCBhc1xuICogYGJvYi5rZXl3b3JkLmRvKClgLiBUaGUgbW9kZSBjb21waWxlciBhdXRvbWF0aWNhbGx5IHdpcmVzIHRoaXMgdXAgYXMgYVxuICogc3BlY2lhbCBfaW50ZXJuYWxfICdvbjpiZWdpbicgY2FsbGJhY2sgZm9yIG1vZGVzIHdpdGggYGJlZ2luS2V5d29yZHNgXG4gKiBAcGFyYW0ge1JlZ0V4cE1hdGNoQXJyYXl9IG1hdGNoXG4gKiBAcGFyYW0ge0NhbGxiYWNrUmVzcG9uc2V9IHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIHNraXBJZkhhc1ByZWNlZGluZ0RvdChtYXRjaCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgYmVmb3JlID0gbWF0Y2guaW5wdXRbbWF0Y2guaW5kZXggLSAxXTtcbiAgaWYgKGJlZm9yZSA9PT0gXCIuXCIpIHtcbiAgICByZXNwb25zZS5pZ25vcmVNYXRjaCgpO1xuICB9XG59XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gc2NvcGVDbGFzc05hbWUobW9kZSwgX3BhcmVudCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gIGlmIChtb2RlLmNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbW9kZS5zY29wZSA9IG1vZGUuY2xhc3NOYW1lO1xuICAgIGRlbGV0ZSBtb2RlLmNsYXNzTmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIGBiZWdpbktleXdvcmRzYCBzeW50YWN0aWMgc3VnYXJcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gYmVnaW5LZXl3b3Jkcyhtb2RlLCBwYXJlbnQpIHtcbiAgaWYgKCFwYXJlbnQpIHJldHVybjtcbiAgaWYgKCFtb2RlLmJlZ2luS2V5d29yZHMpIHJldHVybjtcblxuICAvLyBmb3IgbGFuZ3VhZ2VzIHdpdGgga2V5d29yZHMgdGhhdCBpbmNsdWRlIG5vbi13b3JkIGNoYXJhY3RlcnMgY2hlY2tpbmcgZm9yXG4gIC8vIGEgd29yZCBib3VuZGFyeSBpcyBub3Qgc3VmZmljaWVudCwgc28gaW5zdGVhZCB3ZSBjaGVjayBmb3IgYSB3b3JkIGJvdW5kYXJ5XG4gIC8vIG9yIHdoaXRlc3BhY2UgLSB0aGlzIGRvZXMgbm8gaGFybSBpbiBhbnkgY2FzZSBzaW5jZSBvdXIga2V5d29yZCBlbmdpbmVcbiAgLy8gZG9lc24ndCBhbGxvdyBzcGFjZXMgaW4ga2V5d29yZHMgYW55d2F5cyBhbmQgd2Ugc3RpbGwgY2hlY2sgZm9yIHRoZSBib3VuZGFyeVxuICAvLyBmaXJzdFxuICBtb2RlLmJlZ2luID0gJ1xcXFxiKCcgKyBtb2RlLmJlZ2luS2V5d29yZHMuc3BsaXQoJyAnKS5qb2luKCd8JykgKyAnKSg/IVxcXFwuKSg/PVxcXFxifFxcXFxzKSc7XG4gIG1vZGUuX19iZWZvcmVCZWdpbiA9IHNraXBJZkhhc1ByZWNlZGluZ0RvdDtcbiAgbW9kZS5rZXl3b3JkcyA9IG1vZGUua2V5d29yZHMgfHwgbW9kZS5iZWdpbktleXdvcmRzO1xuICBkZWxldGUgbW9kZS5iZWdpbktleXdvcmRzO1xuXG4gIC8vIHByZXZlbnRzIGRvdWJsZSByZWxldmFuY2UsIHRoZSBrZXl3b3JkcyB0aGVtc2VsdmVzIHByb3ZpZGVcbiAgLy8gcmVsZXZhbmNlLCB0aGUgbW9kZSBkb2Vzbid0IG5lZWQgdG8gZG91YmxlIGl0XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgaWYgKG1vZGUucmVsZXZhbmNlID09PSB1bmRlZmluZWQpIG1vZGUucmVsZXZhbmNlID0gMDtcbn1cblxuLyoqXG4gKiBBbGxvdyBgaWxsZWdhbGAgdG8gY29udGFpbiBhbiBhcnJheSBvZiBpbGxlZ2FsIHZhbHVlc1xuICogQHR5cGUge0NvbXBpbGVyRXh0fVxuICovXG5mdW5jdGlvbiBjb21waWxlSWxsZWdhbChtb2RlLCBfcGFyZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShtb2RlLmlsbGVnYWwpKSByZXR1cm47XG5cbiAgbW9kZS5pbGxlZ2FsID0gZWl0aGVyKC4uLm1vZGUuaWxsZWdhbCk7XG59XG5cbi8qKlxuICogYG1hdGNoYCB0byBtYXRjaCBhIHNpbmdsZSBleHByZXNzaW9uIGZvciByZWFkYWJpbGl0eVxuICogQHR5cGUge0NvbXBpbGVyRXh0fVxuICovXG5mdW5jdGlvbiBjb21waWxlTWF0Y2gobW9kZSwgX3BhcmVudCkge1xuICBpZiAoIW1vZGUubWF0Y2gpIHJldHVybjtcbiAgaWYgKG1vZGUuYmVnaW4gfHwgbW9kZS5lbmQpIHRocm93IG5ldyBFcnJvcihcImJlZ2luICYgZW5kIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWF0Y2hcIik7XG5cbiAgbW9kZS5iZWdpbiA9IG1vZGUubWF0Y2g7XG4gIGRlbGV0ZSBtb2RlLm1hdGNoO1xufVxuXG4vKipcbiAqIHByb3ZpZGVzIHRoZSBkZWZhdWx0IDEgcmVsZXZhbmNlIHRvIGFsbCBtb2Rlc1xuICogQHR5cGUge0NvbXBpbGVyRXh0fVxuICovXG5mdW5jdGlvbiBjb21waWxlUmVsZXZhbmNlKG1vZGUsIF9wYXJlbnQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICBpZiAobW9kZS5yZWxldmFuY2UgPT09IHVuZGVmaW5lZCkgbW9kZS5yZWxldmFuY2UgPSAxO1xufVxuXG4vLyBhbGxvdyBiZWZvcmVNYXRjaCB0byBhY3QgYXMgYSBcInF1YWxpZmllclwiIGZvciB0aGUgbWF0Y2hcbi8vIHRoZSBmdWxsIG1hdGNoIGJlZ2luIG11c3QgYmUgW2JlZm9yZU1hdGNoXVtiZWdpbl1cbmNvbnN0IGJlZm9yZU1hdGNoRXh0ID0gKG1vZGUsIHBhcmVudCkgPT4ge1xuICBpZiAoIW1vZGUuYmVmb3JlTWF0Y2gpIHJldHVybjtcbiAgLy8gc3RhcnRzIGNvbmZsaWN0cyB3aXRoIGVuZHNQYXJlbnQgd2hpY2ggd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGNoaWxkXG4gIC8vIHJ1bGUgaXMgbm90IG1hdGNoZWQgbXVsdGlwbGUgdGltZXNcbiAgaWYgKG1vZGUuc3RhcnRzKSB0aHJvdyBuZXcgRXJyb3IoXCJiZWZvcmVNYXRjaCBjYW5ub3QgYmUgdXNlZCB3aXRoIHN0YXJ0c1wiKTtcblxuICBjb25zdCBvcmlnaW5hbE1vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlKTtcbiAgT2JqZWN0LmtleXMobW9kZSkuZm9yRWFjaCgoa2V5KSA9PiB7IGRlbGV0ZSBtb2RlW2tleV07IH0pO1xuXG4gIG1vZGUua2V5d29yZHMgPSBvcmlnaW5hbE1vZGUua2V5d29yZHM7XG4gIG1vZGUuYmVnaW4gPSBjb25jYXQob3JpZ2luYWxNb2RlLmJlZm9yZU1hdGNoLCBsb29rYWhlYWQob3JpZ2luYWxNb2RlLmJlZ2luKSk7XG4gIG1vZGUuc3RhcnRzID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogW1xuICAgICAgT2JqZWN0LmFzc2lnbihvcmlnaW5hbE1vZGUsIHsgZW5kc1BhcmVudDogdHJ1ZSB9KVxuICAgIF1cbiAgfTtcbiAgbW9kZS5yZWxldmFuY2UgPSAwO1xuXG4gIGRlbGV0ZSBvcmlnaW5hbE1vZGUuYmVmb3JlTWF0Y2g7XG59O1xuXG4vLyBrZXl3b3JkcyB0aGF0IHNob3VsZCBoYXZlIG5vIGRlZmF1bHQgcmVsZXZhbmNlIHZhbHVlXG5jb25zdCBDT01NT05fS0VZV09SRFMgPSBbXG4gICdvZicsXG4gICdhbmQnLFxuICAnZm9yJyxcbiAgJ2luJyxcbiAgJ25vdCcsXG4gICdvcicsXG4gICdpZicsXG4gICd0aGVuJyxcbiAgJ3BhcmVudCcsIC8vIGNvbW1vbiB2YXJpYWJsZSBuYW1lXG4gICdsaXN0JywgLy8gY29tbW9uIHZhcmlhYmxlIG5hbWVcbiAgJ3ZhbHVlJyAvLyBjb21tb24gdmFyaWFibGUgbmFtZVxuXTtcblxuY29uc3QgREVGQVVMVF9LRVlXT1JEX1NDT1BFID0gXCJrZXl3b3JkXCI7XG5cbi8qKlxuICogR2l2ZW4gcmF3IGtleXdvcmRzIGZyb20gYSBsYW5ndWFnZSBkZWZpbml0aW9uLCBjb21waWxlIHRoZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLHN0cmluZ3xzdHJpbmdbXT4gfCBBcnJheTxzdHJpbmc+fSByYXdLZXl3b3Jkc1xuICogQHBhcmFtIHtib29sZWFufSBjYXNlSW5zZW5zaXRpdmVcbiAqL1xuZnVuY3Rpb24gY29tcGlsZUtleXdvcmRzKHJhd0tleXdvcmRzLCBjYXNlSW5zZW5zaXRpdmUsIHNjb3BlTmFtZSA9IERFRkFVTFRfS0VZV09SRF9TQ09QRSkge1xuICAvKiogQHR5cGUgS2V5d29yZERpY3QgKi9cbiAgY29uc3QgY29tcGlsZWRLZXl3b3JkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gaW5wdXQgY2FuIGJlIGEgc3RyaW5nIG9mIGtleXdvcmRzLCBhbiBhcnJheSBvZiBrZXl3b3Jkcywgb3IgYSBvYmplY3Qgd2l0aFxuICAvLyBuYW1lZCBrZXlzIHJlcHJlc2VudGluZyBzY29wZU5hbWUgKHdoaWNoIGNhbiB0aGVuIHBvaW50IHRvIGEgc3RyaW5nIG9yIGFycmF5KVxuICBpZiAodHlwZW9mIHJhd0tleXdvcmRzID09PSAnc3RyaW5nJykge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMuc3BsaXQoXCIgXCIpKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJhd0tleXdvcmRzKSkge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKHJhd0tleXdvcmRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNjb3BlTmFtZSkge1xuICAgICAgLy8gY29sbGFwc2UgYWxsIG91ciBvYmplY3RzIGJhY2sgaW50byB0aGUgcGFyZW50IG9iamVjdFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgY29tcGlsZWRLZXl3b3JkcyxcbiAgICAgICAgY29tcGlsZUtleXdvcmRzKHJhd0tleXdvcmRzW3Njb3BlTmFtZV0sIGNhc2VJbnNlbnNpdGl2ZSwgc2NvcGVOYW1lKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tcGlsZWRLZXl3b3JkcztcblxuICAvLyAtLS1cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBsaXN0IG9mIGtleXdvcmRzXG4gICAqXG4gICAqIEV4OiBcImZvciBpZiB3aGVuIHdoaWxlfDVcIlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVOYW1lXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2V5d29yZExpc3RcbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwga2V5d29yZExpc3QpIHtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBrZXl3b3JkTGlzdCA9IGtleXdvcmRMaXN0Lm1hcCh4ID0+IHgudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICAgIGtleXdvcmRMaXN0LmZvckVhY2goZnVuY3Rpb24oa2V5d29yZCkge1xuICAgICAgY29uc3QgcGFpciA9IGtleXdvcmQuc3BsaXQoJ3wnKTtcbiAgICAgIGNvbXBpbGVkS2V5d29yZHNbcGFpclswXV0gPSBbc2NvcGVOYW1lLCBzY29yZUZvcktleXdvcmQocGFpclswXSwgcGFpclsxXSldO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvcGVyIHNjb3JlIGZvciBhIGdpdmVuIGtleXdvcmRcbiAqXG4gKiBBbHNvIHRha2VzIGludG8gYWNjb3VudCBjb21tZW50IGtleXdvcmRzLCB3aGljaCB3aWxsIGJlIHNjb3JlZCAwIFVOTEVTU1xuICogYW5vdGhlciBzY29yZSBoYXMgYmVlbiBtYW51YWxseSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3ZpZGVkU2NvcmVdXG4gKi9cbmZ1bmN0aW9uIHNjb3JlRm9yS2V5d29yZChrZXl3b3JkLCBwcm92aWRlZFNjb3JlKSB7XG4gIC8vIG1hbnVhbCBzY29yZXMgYWx3YXlzIHdpbiBvdmVyIGNvbW1vbiBrZXl3b3Jkc1xuICAvLyBzbyB5b3UgY2FuIGZvcmNlIGEgc2NvcmUgb2YgMSBpZiB5b3UgcmVhbGx5IGluc2lzdFxuICBpZiAocHJvdmlkZWRTY29yZSkge1xuICAgIHJldHVybiBOdW1iZXIocHJvdmlkZWRTY29yZSk7XG4gIH1cblxuICByZXR1cm4gY29tbW9uS2V5d29yZChrZXl3b3JkKSA/IDAgOiAxO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBnaXZlbiBrZXl3b3JkIGlzIGNvbW1vbiBvciBub3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZCAqL1xuZnVuY3Rpb24gY29tbW9uS2V5d29yZChrZXl3b3JkKSB7XG4gIHJldHVybiBDT01NT05fS0VZV09SRFMuaW5jbHVkZXMoa2V5d29yZC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLypcblxuRm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgcGxlYXNlIHNlZTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzI4ODAjaXNzdWVjb21tZW50LTc0NzI3NTQxOVxuXG4qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn1cbiAqL1xuY29uc3Qgc2VlbkRlcHJlY2F0aW9ucyA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmNvbnN0IGVycm9yID0gKG1lc3NhZ2UpID0+IHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7YW55fSBhcmdzXG4gKi9cbmNvbnN0IHdhcm4gPSAobWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICBjb25zb2xlLmxvZyhgV0FSTjogJHttZXNzYWdlfWAsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuY29uc3QgZGVwcmVjYXRlZCA9ICh2ZXJzaW9uLCBtZXNzYWdlKSA9PiB7XG4gIGlmIChzZWVuRGVwcmVjYXRpb25zW2Ake3ZlcnNpb259LyR7bWVzc2FnZX1gXSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUubG9nKGBEZXByZWNhdGVkIGFzIG9mICR7dmVyc2lvbn0uICR7bWVzc2FnZX1gKTtcbiAgc2VlbkRlcHJlY2F0aW9uc1tgJHt2ZXJzaW9ufS8ke21lc3NhZ2V9YF0gPSB0cnVlO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdGhyb3ctbGl0ZXJhbCAqL1xuXG4vKipcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlXG4qL1xuXG5jb25zdCBNdWx0aUNsYXNzRXJyb3IgPSBuZXcgRXJyb3IoKTtcblxuLyoqXG4gKiBSZW51bWJlcnMgbGFiZWxlZCBzY29wZSBuYW1lcyB0byBhY2NvdW50IGZvciBhZGRpdGlvbmFsIGlubmVyIG1hdGNoXG4gKiBncm91cHMgdGhhdCBvdGhlcndpc2Ugd291bGQgYnJlYWsgZXZlcnl0aGluZy5cbiAqXG4gKiBMZXRzIHNheSB3ZSAzIG1hdGNoIHNjb3BlczpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCAzID0+IC4uLiB9XG4gKlxuICogU28gd2hhdCB3ZSBuZWVkIGlzIGEgY2xlYW4gbWF0Y2ggbGlrZSB0aGlzOlxuICpcbiAqICAgKGEpKGIpKGMpID0+IFsgXCJhXCIsIFwiYlwiLCBcImNcIiBdXG4gKlxuICogQnV0IHRoaXMgZmFsbHMgYXBhcnQgd2l0aCBpbm5lciBtYXRjaCBncm91cHM6XG4gKlxuICogKGEpKCgoYikpKShjKSA9PiBbXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJiXCIsIFwiY1wiIF1cbiAqXG4gKiBPdXIgc2NvcGVzIGFyZSBub3cgXCJvdXQgb2YgYWxpZ25tZW50XCIgYW5kIHdlJ3JlIHJlcGVhdGluZyBgYmAgMyB0aW1lcy5cbiAqIFdoYXQgbmVlZHMgdG8gaGFwcGVuIGlzIHRoZSBudW1iZXJzIGFyZSByZW1hcHBlZDpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCA1ID0+IC4uLiB9XG4gKlxuICogV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhhdCB0aGUgT05MWSBncm91cHMgdGhhdCBzaG91bGQgYmUgb3V0cHV0XG4gKiBhcmUgMSwgMiwgYW5kIDUuICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBiZWhhdmlvci5cbiAqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICogQHBhcmFtIHtBcnJheTxSZWdFeHAgfCBzdHJpbmc+fSByZWdleGVzXG4gKiBAcGFyYW0ge3trZXk6IFwiYmVnaW5TY29wZVwifFwiZW5kU2NvcGVcIn19IG9wdHNcbiAqL1xuZnVuY3Rpb24gcmVtYXBTY29wZU5hbWVzKG1vZGUsIHJlZ2V4ZXMsIHsga2V5IH0pIHtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGNvbnN0IHNjb3BlTmFtZXMgPSBtb2RlW2tleV07XG4gIC8qKiBAdHlwZSBSZWNvcmQ8bnVtYmVyLGJvb2xlYW4+ICovXG4gIGNvbnN0IGVtaXQgPSB7fTtcbiAgLyoqIEB0eXBlIFJlY29yZDxudW1iZXIsc3RyaW5nPiAqL1xuICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSByZWdleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcG9zaXRpb25zW2kgKyBvZmZzZXRdID0gc2NvcGVOYW1lc1tpXTtcbiAgICBlbWl0W2kgKyBvZmZzZXRdID0gdHJ1ZTtcbiAgICBvZmZzZXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZWdleGVzW2kgLSAxXSk7XG4gIH1cbiAgLy8gd2UgdXNlIF9lbWl0IHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWF0Y2ggZ3JvdXBzIGFyZSBcInRvcC1sZXZlbFwiIHRvIGF2b2lkIGRvdWJsZVxuICAvLyBvdXRwdXQgZnJvbSBpbnNpZGUgbWF0Y2ggZ3JvdXBzXG4gIG1vZGVba2V5XSA9IHBvc2l0aW9ucztcbiAgbW9kZVtrZXldLl9lbWl0ID0gZW1pdDtcbiAgbW9kZVtrZXldLl9tdWx0aSA9IHRydWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gYmVnaW5NdWx0aUNsYXNzKG1vZGUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGUuYmVnaW4pKSByZXR1cm47XG5cbiAgaWYgKG1vZGUuc2tpcCB8fCBtb2RlLmV4Y2x1ZGVCZWdpbiB8fCBtb2RlLnJldHVybkJlZ2luKSB7XG4gICAgZXJyb3IoXCJza2lwLCBleGNsdWRlQmVnaW4sIHJldHVybkJlZ2luIG5vdCBjb21wYXRpYmxlIHdpdGggYmVnaW5TY29wZToge31cIik7XG4gICAgdGhyb3cgTXVsdGlDbGFzc0Vycm9yO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2RlLmJlZ2luU2NvcGUgIT09IFwib2JqZWN0XCIgfHwgbW9kZS5iZWdpblNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJiZWdpblNjb3BlIG11c3QgYmUgb2JqZWN0XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIHJlbWFwU2NvcGVOYW1lcyhtb2RlLCBtb2RlLmJlZ2luLCB7IGtleTogXCJiZWdpblNjb3BlXCIgfSk7XG4gIG1vZGUuYmVnaW4gPSBfcmV3cml0ZUJhY2tyZWZlcmVuY2VzKG1vZGUuYmVnaW4sIHsgam9pbldpdGg6IFwiXCIgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gZW5kTXVsdGlDbGFzcyhtb2RlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShtb2RlLmVuZCkpIHJldHVybjtcblxuICBpZiAobW9kZS5za2lwIHx8IG1vZGUuZXhjbHVkZUVuZCB8fCBtb2RlLnJldHVybkVuZCkge1xuICAgIGVycm9yKFwic2tpcCwgZXhjbHVkZUVuZCwgcmV0dXJuRW5kIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kU2NvcGU6IHt9XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSAhPT0gXCJvYmplY3RcIiB8fCBtb2RlLmVuZFNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJlbmRTY29wZSBtdXN0IGJlIG9iamVjdFwiKTtcbiAgICB0aHJvdyBNdWx0aUNsYXNzRXJyb3I7XG4gIH1cblxuICByZW1hcFNjb3BlTmFtZXMobW9kZSwgbW9kZS5lbmQsIHsga2V5OiBcImVuZFNjb3BlXCIgfSk7XG4gIG1vZGUuZW5kID0gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhtb2RlLmVuZCwgeyBqb2luV2l0aDogXCJcIiB9KTtcbn1cblxuLyoqXG4gKiB0aGlzIGV4aXN0cyBvbmx5IHRvIGFsbG93IGBzY29wZToge31gIHRvIGJlIHVzZWQgYmVzaWRlIGBtYXRjaDpgXG4gKiBPdGhlcndpc2UgYGJlZ2luU2NvcGVgIHdvdWxkIG5lY2Vzc2FyeSBhbmQgdGhhdCB3b3VsZCBsb29rIHdlaXJkXG5cbiAge1xuICAgIG1hdGNoOiBbIC9kZWYvLCAvXFx3Ky8gXVxuICAgIHNjb3BlOiB7IDE6IFwia2V5d29yZFwiICwgMjogXCJ0aXRsZVwiIH1cbiAgfVxuXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBzY29wZVN1Z2FyKG1vZGUpIHtcbiAgaWYgKG1vZGUuc2NvcGUgJiYgdHlwZW9mIG1vZGUuc2NvcGUgPT09IFwib2JqZWN0XCIgJiYgbW9kZS5zY29wZSAhPT0gbnVsbCkge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IG1vZGUuc2NvcGU7XG4gICAgZGVsZXRlIG1vZGUuc2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBNdWx0aUNsYXNzKG1vZGUpIHtcbiAgc2NvcGVTdWdhcihtb2RlKTtcblxuICBpZiAodHlwZW9mIG1vZGUuYmVnaW5TY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IHsgX3dyYXA6IG1vZGUuYmVnaW5TY29wZSB9O1xuICB9XG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuZW5kU2NvcGUgPSB7IF93cmFwOiBtb2RlLmVuZFNjb3BlIH07XG4gIH1cblxuICBiZWdpbk11bHRpQ2xhc3MobW9kZSk7XG4gIGVuZE11bHRpQ2xhc3MobW9kZSk7XG59XG5cbi8qKlxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRNb2RlfSBDb21waWxlZE1vZGVcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkxhbmd1YWdlfSBMYW5ndWFnZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU1BsdWdpbn0gSExKU1BsdWdpblxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRMYW5ndWFnZX0gQ29tcGlsZWRMYW5ndWFnZVxuKi9cblxuLy8gY29tcGlsYXRpb25cblxuLyoqXG4gKiBDb21waWxlcyBhIGxhbmd1YWdlIGRlZmluaXRpb24gcmVzdWx0XG4gKlxuICogR2l2ZW4gdGhlIHJhdyByZXN1bHQgb2YgYSBsYW5ndWFnZSBkZWZpbml0aW9uIChMYW5ndWFnZSksIGNvbXBpbGVzIHRoaXMgc29cbiAqIHRoYXQgaXQgaXMgcmVhZHkgZm9yIGhpZ2hsaWdodGluZyBjb2RlLlxuICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2VcbiAqIEByZXR1cm5zIHtDb21waWxlZExhbmd1YWdlfVxuICovXG5mdW5jdGlvbiBjb21waWxlTGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHJlZ2V4IHdpdGggdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dsb2JhbF1cbiAgICovXG4gIGZ1bmN0aW9uIGxhbmdSZSh2YWx1ZSwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBzb3VyY2UodmFsdWUpLFxuICAgICAgJ20nXG4gICAgICArIChsYW5ndWFnZS5jYXNlX2luc2Vuc2l0aXZlID8gJ2knIDogJycpXG4gICAgICArIChsYW5ndWFnZS51bmljb2RlUmVnZXggPyAndScgOiAnJylcbiAgICAgICsgKGdsb2JhbCA/ICdnJyA6ICcnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICBTdG9yZXMgbXVsdGlwbGUgcmVndWxhciBleHByZXNzaW9ucyBhbmQgYWxsb3dzIHlvdSB0byBxdWlja2x5IHNlYXJjaCBmb3JcbiAgICB0aGVtIGFsbCBpbiBhIHN0cmluZyBzaW11bHRhbmVvdXNseSAtIHJldHVybmluZyB0aGUgZmlyc3QgbWF0Y2guICBJdCBkb2VzXG4gICAgdGhpcyBieSBjcmVhdGluZyBhIGh1Z2UgKGF8YnxjKSByZWdleCAtIGVhY2ggaW5kaXZpZHVhbCBpdGVtIHdyYXBwZWQgd2l0aCAoKVxuICAgIGFuZCBqb2luZWQgYnkgYHxgIC0gdXNpbmcgbWF0Y2ggZ3JvdXBzIHRvIHRyYWNrIHBvc2l0aW9uLiAgV2hlbiBhIG1hdGNoIGlzXG4gICAgZm91bmQgY2hlY2tpbmcgd2hpY2ggcG9zaXRpb24gaW4gdGhlIGFycmF5IGhhcyBjb250ZW50IGFsbG93cyB1cyB0byBmaWd1cmVcbiAgICBvdXQgd2hpY2ggb2YgdGhlIG9yaWdpbmFsIHJlZ2V4ZXMgLyBtYXRjaCBncm91cHMgdHJpZ2dlcmVkIHRoZSBtYXRjaC5cblxuICAgIFRoZSBtYXRjaCBvYmplY3QgaXRzZWxmICh0aGUgcmVzdWx0IG9mIGBSZWdleC5leGVjYCkgaXMgcmV0dXJuZWQgYnV0IGFsc29cbiAgICBlbmhhbmNlZCBieSBtZXJnaW5nIGluIGFueSBtZXRhLWRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdleC5cbiAgICBUaGlzIGlzIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG1vZGUgbWF0Y2hlZCwgYW5kIHdoYXQgdHlwZSBvZiBydWxlXG4gICAgKGBpbGxlZ2FsYCwgYGJlZ2luYCwgZW5kLCBldGMpLlxuICAqL1xuICBjbGFzcyBNdWx0aVJlZ2V4IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzID0ge307XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlZ2V4ZXMgPSBbXTtcbiAgICAgIHRoaXMubWF0Y2hBdCA9IDE7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYWRkUnVsZShyZSwgb3B0cykge1xuICAgICAgb3B0cy5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb24rKztcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzW3RoaXMubWF0Y2hBdF0gPSBvcHRzO1xuICAgICAgdGhpcy5yZWdleGVzLnB1c2goW29wdHMsIHJlXSk7XG4gICAgICB0aGlzLm1hdGNoQXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZSkgKyAxO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICBpZiAodGhpcy5yZWdleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBhdm9pZHMgdGhlIG5lZWQgdG8gY2hlY2sgbGVuZ3RoIGV2ZXJ5IHRpbWUgZXhlYyBpcyBjYWxsZWRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmV4ZWMgPSAoKSA9PiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdGVybWluYXRvcnMgPSB0aGlzLnJlZ2V4ZXMubWFwKGVsID0+IGVsWzFdKTtcbiAgICAgIHRoaXMubWF0Y2hlclJlID0gbGFuZ1JlKF9yZXdyaXRlQmFja3JlZmVyZW5jZXModGVybWluYXRvcnMsIHsgam9pbldpdGg6ICd8JyB9KSwgdHJ1ZSk7XG4gICAgICB0aGlzLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBzICovXG4gICAgZXhlYyhzKSB7XG4gICAgICB0aGlzLm1hdGNoZXJSZS5sYXN0SW5kZXggPSB0aGlzLmxhc3RJbmRleDtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaGVyUmUuZXhlYyhzKTtcbiAgICAgIGlmICghbWF0Y2gpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICAgICAgY29uc3QgaSA9IG1hdGNoLmZpbmRJbmRleCgoZWwsIGkpID0+IGkgPiAwICYmIGVsICE9PSB1bmRlZmluZWQpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbWF0Y2hEYXRhID0gdGhpcy5tYXRjaEluZGV4ZXNbaV07XG4gICAgICAvLyB0cmltIG9mZiBhbnkgZWFybGllciBub24tcmVsZXZhbnQgbWF0Y2ggZ3JvdXBzIChpZSwgdGhlIG90aGVyIHJlZ2V4XG4gICAgICAvLyBtYXRjaCBncm91cHMgdGhhdCBtYWtlIHVwIHRoZSBtdWx0aS1tYXRjaGVyKVxuICAgICAgbWF0Y2guc3BsaWNlKDAsIGkpO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihtYXRjaCwgbWF0Y2hEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgIENyZWF0ZWQgdG8gc29sdmUgdGhlIGtleSBkZWZpY2llbnRseSB3aXRoIE11bHRpUmVnZXggLSB0aGVyZSBpcyBubyB3YXkgdG9cbiAgICB0ZXN0IGZvciBtdWx0aXBsZSBtYXRjaGVzIGF0IGEgc2luZ2xlIGxvY2F0aW9uLiAgV2h5IHdvdWxkIHdlIG5lZWQgdG8gZG9cbiAgICB0aGF0PyAgSW4gdGhlIGZ1dHVyZSBhIG1vcmUgZHluYW1pYyBlbmdpbmUgd2lsbCBhbGxvdyBjZXJ0YWluIG1hdGNoZXMgdG8gYmVcbiAgICBpZ25vcmVkLiAgQW4gZXhhbXBsZTogaWYgd2UgbWF0Y2hlZCBzYXkgdGhlIDNyZCByZWdleCBpbiBhIGxhcmdlIGdyb3VwIGJ1dFxuICAgIGRlY2lkZWQgdG8gaWdub3JlIGl0IC0gd2UnZCBuZWVkIHRvIHN0YXJ0ZWQgdGVzdGluZyBhZ2FpbiBhdCB0aGUgNHRoXG4gICAgcmVnZXguLi4gYnV0IE11bHRpUmVnZXggaXRzZWxmIGdpdmVzIHVzIG5vIHJlYWwgd2F5IHRvIGRvIHRoYXQuXG5cbiAgICBTbyB3aGF0IHRoaXMgY2xhc3MgY3JlYXRlcyBNdWx0aVJlZ2V4cyBvbiB0aGUgZmx5IGZvciB3aGF0ZXZlciBzZWFyY2hcbiAgICBwb3NpdGlvbiB0aGV5IGFyZSBuZWVkZWQuXG5cbiAgICBOT1RFOiBUaGVzZSBhZGRpdGlvbmFsIE11bHRpUmVnZXggb2JqZWN0cyBhcmUgY3JlYXRlZCBkeW5hbWljYWxseS4gIEZvciBtb3N0XG4gICAgZ3JhbW1hcnMgbW9zdCBvZiB0aGUgdGltZSB3ZSB3aWxsIG5ldmVyIGFjdHVhbGx5IG5lZWQgYW55dGhpbmcgbW9yZSB0aGFuIHRoZVxuICAgIGZpcnN0IE11bHRpUmVnZXggLSBzbyB0aGlzIHNob3VsZG4ndCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkLlxuXG4gICAgU2F5IHRoaXMgaXMgb3VyIHNlYXJjaCBncm91cCwgYW5kIHdlIG1hdGNoIHJlZ2V4MywgYnV0IHdpc2ggdG8gaWdub3JlIGl0LlxuXG4gICAgICByZWdleDEgfCByZWdleDIgfCByZWdleDMgfCByZWdleDQgfCByZWdleDUgICAgJyBpZSwgc3RhcnRBdCA9IDBcblxuICAgIFdoYXQgd2UgbmVlZCBpcyBhIG5ldyBNdWx0aVJlZ2V4IHRoYXQgb25seSBpbmNsdWRlcyB0aGUgcmVtYWluaW5nXG4gICAgcG9zc2liaWxpdGllczpcblxuICAgICAgcmVnZXg0IHwgcmVnZXg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgaWUsIHN0YXJ0QXQgPSAzXG5cbiAgICBUaGlzIGNsYXNzIHdyYXBzIGFsbCB0aGF0IGNvbXBsZXhpdHkgdXAgaW4gYSBzaW1wbGUgQVBJLi4uIGBzdGFydEF0YCBkZWNpZGVzXG4gICAgd2hlcmUgaW4gdGhlIGFycmF5IG9mIGV4cHJlc3Npb25zIHRvIHN0YXJ0IGRvaW5nIHRoZSBtYXRjaGluZy4gSXRcbiAgICBhdXRvLWluY3JlbWVudHMsIHNvIGlmIGEgbWF0Y2ggaXMgZm91bmQgYXQgcG9zaXRpb24gMiwgdGhlbiBzdGFydEF0IHdpbGwgYmVcbiAgICBzZXQgdG8gMy4gIElmIHRoZSBlbmQgaXMgcmVhY2hlZCBzdGFydEF0IHdpbGwgcmV0dXJuIHRvIDAuXG5cbiAgICBNT1NUIG9mIHRoZSB0aW1lIHRoZSBwYXJzZXIgd2lsbCBiZSBzZXR0aW5nIHN0YXJ0QXQgbWFudWFsbHkgdG8gMC5cbiAgKi9cbiAgY2xhc3MgUmVzdW1hYmxlTXVsdGlSZWdleCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJ1bGVzID0gW107XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm11bHRpUmVnZXhlcyA9IFtdO1xuICAgICAgdGhpcy5jb3VudCA9IDA7XG5cbiAgICAgIHRoaXMubGFzdEluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVnZXhJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGdldE1hdGNoZXIoaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpUmVnZXhlc1tpbmRleF0pIHJldHVybiB0aGlzLm11bHRpUmVnZXhlc1tpbmRleF07XG5cbiAgICAgIGNvbnN0IG1hdGNoZXIgPSBuZXcgTXVsdGlSZWdleCgpO1xuICAgICAgdGhpcy5ydWxlcy5zbGljZShpbmRleCkuZm9yRWFjaCgoW3JlLCBvcHRzXSkgPT4gbWF0Y2hlci5hZGRSdWxlKHJlLCBvcHRzKSk7XG4gICAgICBtYXRjaGVyLmNvbXBpbGUoKTtcbiAgICAgIHRoaXMubXVsdGlSZWdleGVzW2luZGV4XSA9IG1hdGNoZXI7XG4gICAgICByZXR1cm4gbWF0Y2hlcjtcbiAgICB9XG5cbiAgICByZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2V4SW5kZXggIT09IDA7XG4gICAgfVxuXG4gICAgY29uc2lkZXJBbGwoKSB7XG4gICAgICB0aGlzLnJlZ2V4SW5kZXggPSAwO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhZGRSdWxlKHJlLCBvcHRzKSB7XG4gICAgICB0aGlzLnJ1bGVzLnB1c2goW3JlLCBvcHRzXSk7XG4gICAgICBpZiAob3B0cy50eXBlID09PSBcImJlZ2luXCIpIHRoaXMuY291bnQrKztcbiAgICB9XG5cbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IHMgKi9cbiAgICBleGVjKHMpIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLmdldE1hdGNoZXIodGhpcy5yZWdleEluZGV4KTtcbiAgICAgIG0ubGFzdEluZGV4ID0gdGhpcy5sYXN0SW5kZXg7XG4gICAgICBsZXQgcmVzdWx0ID0gbS5leGVjKHMpO1xuXG4gICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBlYXN5IHdheSB0byBzYXkgXCJyZXN1bWUgc2Nhbm5pbmcgYXQgdGhlXG4gICAgICAvLyBleGlzdGluZyBwb3NpdGlvbiBidXQgYWxzbyBza2lwIHRoZSBjdXJyZW50IHJ1bGUgT05MWVwiLiBXaGF0IGhhcHBlbnMgaXNcbiAgICAgIC8vIGFsbCBwcmlvciBydWxlcyBhcmUgYWxzbyBza2lwcGVkIHdoaWNoIGNhbiByZXN1bHQgaW4gbWF0Y2hpbmcgdGhlIHdyb25nXG4gICAgICAvLyB0aGluZy4gRXhhbXBsZSBvZiBtYXRjaGluZyBcImJvb2dlclwiOlxuXG4gICAgICAvLyBvdXIgbWF0Y2hlciBpcyBbc3RyaW5nLCBcImJvb2dlclwiLCBudW1iZXJdXG4gICAgICAvL1xuICAgICAgLy8gLi4uLmJvb2dlci4uLi5cblxuICAgICAgLy8gaWYgXCJib29nZXJcIiBpcyBpZ25vcmVkIHRoZW4gd2UnZCByZWFsbHkgbmVlZCBhIHJlZ2V4IHRvIHNjYW4gZnJvbSB0aGVcbiAgICAgIC8vIFNBTUUgcG9zaXRpb24gZm9yIG9ubHk6IFtzdHJpbmcsIG51bWJlcl0gYnV0IGlnbm9yaW5nIFwiYm9vZ2VyXCIgKGlmIGl0XG4gICAgICAvLyB3YXMgdGhlIGZpcnN0IG1hdGNoKSwgYSBzaW1wbGUgcmVzdW1lIHdvdWxkIHNjYW4gYWhlYWQgd2hvIGtub3dzIGhvd1xuICAgICAgLy8gZmFyIGxvb2tpbmcgb25seSBmb3IgXCJudW1iZXJcIiwgaWdub3JpbmcgcG90ZW50aWFsIHN0cmluZyBtYXRjaGVzIChvclxuICAgICAgLy8gZnV0dXJlIFwiYm9vZ2VyXCIgbWF0Y2hlcyB0aGF0IG1pZ2h0IGJlIHZhbGlkLilcblxuICAgICAgLy8gU28gd2hhdCB3ZSBkbzogV2UgZXhlY3V0ZSB0d28gbWF0Y2hlcnMsIG9uZSByZXN1bWluZyBhdCB0aGUgc2FtZVxuICAgICAgLy8gcG9zaXRpb24sIGJ1dCB0aGUgc2Vjb25kIGZ1bGwgbWF0Y2hlciBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24gYWZ0ZXI6XG5cbiAgICAgIC8vICAgICAvLS0tIHJlc3VtZSBmaXJzdCByZWdleCBtYXRjaCBoZXJlIChmb3IgW251bWJlcl0pXG4gICAgICAvLyAgICAgfC8tLS0tIGZ1bGwgbWF0Y2ggaGVyZSBmb3IgW3N0cmluZywgXCJib29nZXJcIiwgbnVtYmVyXVxuICAgICAgLy8gICAgIHZ2XG4gICAgICAvLyAuLi4uYm9vZ2VyLi4uLlxuXG4gICAgICAvLyBXaGljaCBldmVyIHJlc3VsdHMgaW4gYSBtYXRjaCBmaXJzdCBpcyB0aGVuIHVzZWQuIFNvIHRoaXMgMy00IHN0ZXBcbiAgICAgIC8vIHByb2Nlc3MgZXNzZW50aWFsbHkgYWxsb3dzIHVzIHRvIHNheSBcIm1hdGNoIGF0IHRoaXMgcG9zaXRpb24sIGV4Y2x1ZGluZ1xuICAgICAgLy8gYSBwcmlvciBydWxlIHRoYXQgd2FzIGlnbm9yZWRcIi5cbiAgICAgIC8vXG4gICAgICAvLyAxLiBNYXRjaCBcImJvb2dlclwiIGZpcnN0LCBpZ25vcmUuIEFsc28gcHJvdmVzIHRoYXQgW3N0cmluZ10gZG9lcyBub24gbWF0Y2guXG4gICAgICAvLyAyLiBSZXN1bWUgbWF0Y2hpbmcgZm9yIFtudW1iZXJdXG4gICAgICAvLyAzLiBNYXRjaCBhdCBpbmRleCArIDEgZm9yIFtzdHJpbmcsIFwiYm9vZ2VyXCIsIG51bWJlcl1cbiAgICAgIC8vIDQuIElmICMyIGFuZCAjMyByZXN1bHQgaW4gbWF0Y2hlcywgd2hpY2ggY2FtZSBmaXJzdD9cbiAgICAgIGlmICh0aGlzLnJlc3VtaW5nU2NhbkF0U2FtZVBvc2l0aW9uKCkpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuaW5kZXggPT09IHRoaXMubGFzdEluZGV4KSA7IGVsc2UgeyAvLyB1c2UgdGhlIHNlY29uZCBtYXRjaGVyIHJlc3VsdFxuICAgICAgICAgIGNvbnN0IG0yID0gdGhpcy5nZXRNYXRjaGVyKDApO1xuICAgICAgICAgIG0yLmxhc3RJbmRleCA9IHRoaXMubGFzdEluZGV4ICsgMTtcbiAgICAgICAgICByZXN1bHQgPSBtMi5leGVjKHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWdleEluZGV4ICs9IHJlc3VsdC5wb3NpdGlvbiArIDE7XG4gICAgICAgIGlmICh0aGlzLnJlZ2V4SW5kZXggPT09IHRoaXMuY291bnQpIHtcbiAgICAgICAgICAvLyB3cmFwLWFyb3VuZCB0byBjb25zaWRlcmluZyBhbGwgbWF0Y2hlcyBhZ2FpblxuICAgICAgICAgIHRoaXMuY29uc2lkZXJBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG1vZGUsIGJ1aWxkcyBhIGh1Z2UgUmVzdW1hYmxlTXVsdGlSZWdleCB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhbGtcbiAgICogdGhlIGNvbnRlbnQgYW5kIGZpbmQgbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAgICogQHJldHVybnMge1Jlc3VtYWJsZU11bHRpUmVnZXh9XG4gICAqL1xuICBmdW5jdGlvbiBidWlsZE1vZGVSZWdleChtb2RlKSB7XG4gICAgY29uc3QgbW0gPSBuZXcgUmVzdW1hYmxlTXVsdGlSZWdleCgpO1xuXG4gICAgbW9kZS5jb250YWlucy5mb3JFYWNoKHRlcm0gPT4gbW0uYWRkUnVsZSh0ZXJtLmJlZ2luLCB7IHJ1bGU6IHRlcm0sIHR5cGU6IFwiYmVnaW5cIiB9KSk7XG5cbiAgICBpZiAobW9kZS50ZXJtaW5hdG9yRW5kKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUudGVybWluYXRvckVuZCwgeyB0eXBlOiBcImVuZFwiIH0pO1xuICAgIH1cbiAgICBpZiAobW9kZS5pbGxlZ2FsKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUuaWxsZWdhbCwgeyB0eXBlOiBcImlsbGVnYWxcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW07XG4gIH1cblxuICAvKiogc2tpcCB2cyBhYm9ydCB2cyBpZ25vcmVcbiAgICpcbiAgICogQHNraXAgICAtIFRoZSBtb2RlIGlzIHN0aWxsIGVudGVyZWQgYW5kIGV4aXRlZCBub3JtYWxseSAoYW5kIGNvbnRhaW5zIHJ1bGVzIGFwcGx5KSxcbiAgICogICAgICAgICAgIGJ1dCBhbGwgY29udGVudCBpcyBoZWxkIGFuZCBhZGRlZCB0byB0aGUgcGFyZW50IGJ1ZmZlciByYXRoZXIgdGhhbiBiZWluZ1xuICAgKiAgICAgICAgICAgb3V0cHV0IHdoZW4gdGhlIG1vZGUgZW5kcy4gIE1vc3RseSB1c2VkIHdpdGggYHN1Ymxhbmd1YWdlYCB0byBidWlsZCB1cFxuICAgKiAgICAgICAgICAgYSBzaW5nbGUgbGFyZ2UgYnVmZmVyIHRoYW4gY2FuIGJlIHBhcnNlZCBieSBzdWJsYW5ndWFnZS5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBiZWdpbiBhbmRzIGVuZHMgbm9ybWFsbHkuXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQgbW9kZSBidWZmZXIuXG4gICAqICAgICAgICAgICAgIC0gVGhlIHBhcnNlciBjdXJzb3IgaXMgbW92ZWQgZm9yd2FyZCBub3JtYWxseS5cbiAgICpcbiAgICogQGFib3J0ICAtIEEgaGFjayBwbGFjZWhvbGRlciB1bnRpbCB3ZSBoYXZlIGlnbm9yZS4gIEFib3J0cyB0aGUgbW9kZSAoYXMgaWYgaXRcbiAgICogICAgICAgICAgIG5ldmVyIG1hdGNoZWQpIGJ1dCBET0VTIE5PVCBjb250aW51ZSB0byBtYXRjaCBzdWJzZXF1ZW50IGBjb250YWluc2BcbiAgICogICAgICAgICAgIG1vZGVzLiAgQWJvcnQgaXMgYmFkL3N1Ym9wdGltYWwgYmVjYXVzZSBpdCBjYW4gcmVzdWx0IGluIG1vZGVzXG4gICAqICAgICAgICAgICBmYXJ0aGVyIGRvd24gbm90IGdldHRpbmcgYXBwbGllZCBiZWNhdXNlIGFuIGVhcmxpZXIgcnVsZSBlYXRzIHRoZVxuICAgKiAgICAgICAgICAgY29udGVudCBidXQgdGhlbiBhYm9ydHMuXG4gICAqXG4gICAqICAgICAgICAgICAgIC0gVGhlIG1vZGUgZG9lcyBub3QgYmVnaW4uXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGJ5IGBiZWdpbmAgaXMgYWRkZWQgdG8gdGhlIG1vZGUgYnVmZmVyLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG1vdmVkIGZvcndhcmQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBpZ25vcmUgLSBJZ25vcmVzIHRoZSBtb2RlIChhcyBpZiBpdCBuZXZlciBtYXRjaGVkKSBhbmQgY29udGludWVzIHRvIG1hdGNoIGFueVxuICAgKiAgICAgICAgICAgc3Vic2VxdWVudCBgY29udGFpbnNgIG1vZGVzLiAgSWdub3JlIGlzbid0IHRlY2huaWNhbGx5IHBvc3NpYmxlIHdpdGhcbiAgICogICAgICAgICAgIHRoZSBjdXJyZW50IHBhcnNlciBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBkb2VzIG5vdCBiZWdpbi5cbiAgICogICAgICAgICAgICAgLSBDb250ZW50IG1hdGNoZWQgYnkgYGJlZ2luYCBpcyBpZ25vcmVkLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG5vdCBtb3ZlZCBmb3J3YXJkLlxuICAgKi9cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBtb2RlXG4gICAqXG4gICAqIFRoaXMgY2FuIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBtb2RlIGNvbnRhaW5zIGNlcnRhaW4gZGV0ZWN0YWJsZSBrbm93biBsb2dpY1xuICAgKiBpc3N1ZXMuXG4gICAqIEBwYXJhbSB7TW9kZX0gbW9kZVxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZSB8IG51bGx9IFtwYXJlbnRdXG4gICAqIEByZXR1cm5zIHtDb21waWxlZE1vZGUgfCBuZXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVNb2RlKG1vZGUsIHBhcmVudCkge1xuICAgIGNvbnN0IGNtb2RlID0gLyoqIEB0eXBlIENvbXBpbGVkTW9kZSAqLyAobW9kZSk7XG4gICAgaWYgKG1vZGUuaXNDb21waWxlZCkgcmV0dXJuIGNtb2RlO1xuXG4gICAgW1xuICAgICAgc2NvcGVDbGFzc05hbWUsXG4gICAgICAvLyBkbyB0aGlzIGVhcmx5IHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgZ2VuZXJhbGx5IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXRcbiAgICAgIC8vIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG1hdGNoL2JlZ2luXG4gICAgICBjb21waWxlTWF0Y2gsXG4gICAgICBNdWx0aUNsYXNzLFxuICAgICAgYmVmb3JlTWF0Y2hFeHRcbiAgICBdLmZvckVhY2goZXh0ID0+IGV4dChtb2RlLCBwYXJlbnQpKTtcblxuICAgIGxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucy5mb3JFYWNoKGV4dCA9PiBleHQobW9kZSwgcGFyZW50KSk7XG5cbiAgICAvLyBfX2JlZm9yZUJlZ2luIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSBBUEksIGludGVybmFsIHVzZSBvbmx5XG4gICAgbW9kZS5fX2JlZm9yZUJlZ2luID0gbnVsbDtcblxuICAgIFtcbiAgICAgIGJlZ2luS2V5d29yZHMsXG4gICAgICAvLyBkbyB0aGlzIGxhdGVyIHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgdGhhdCBjb21lIGVhcmxpZXIgaGF2ZSBhY2Nlc3MgdG8gdGhlXG4gICAgICAvLyByYXcgYXJyYXkgaWYgdGhleSB3YW50ZWQgdG8gcGVyaGFwcyBtYW5pcHVsYXRlIGl0LCBldGMuXG4gICAgICBjb21waWxlSWxsZWdhbCxcbiAgICAgIC8vIGRlZmF1bHQgdG8gMSByZWxldmFuY2UgaWYgbm90IHNwZWNpZmllZFxuICAgICAgY29tcGlsZVJlbGV2YW5jZVxuICAgIF0uZm9yRWFjaChleHQgPT4gZXh0KG1vZGUsIHBhcmVudCkpO1xuXG4gICAgbW9kZS5pc0NvbXBpbGVkID0gdHJ1ZTtcblxuICAgIGxldCBrZXl3b3JkUGF0dGVybiA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBtb2RlLmtleXdvcmRzID09PSBcIm9iamVjdFwiICYmIG1vZGUua2V5d29yZHMuJHBhdHRlcm4pIHtcbiAgICAgIC8vIHdlIG5lZWQgYSBjb3B5IGJlY2F1c2Uga2V5d29yZHMgbWlnaHQgYmUgY29tcGlsZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgIC8vIHNvIHdlIGNhbid0IGdvIGRlbGV0aW5nICRwYXR0ZXJuIGZyb20gdGhlIG9yaWdpbmFsIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gcGFzc1xuICAgICAgbW9kZS5rZXl3b3JkcyA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGUua2V5d29yZHMpO1xuICAgICAga2V5d29yZFBhdHRlcm4gPSBtb2RlLmtleXdvcmRzLiRwYXR0ZXJuO1xuICAgICAgZGVsZXRlIG1vZGUua2V5d29yZHMuJHBhdHRlcm47XG4gICAgfVxuICAgIGtleXdvcmRQYXR0ZXJuID0ga2V5d29yZFBhdHRlcm4gfHwgL1xcdysvO1xuXG4gICAgaWYgKG1vZGUua2V5d29yZHMpIHtcbiAgICAgIG1vZGUua2V5d29yZHMgPSBjb21waWxlS2V5d29yZHMobW9kZS5rZXl3b3JkcywgbGFuZ3VhZ2UuY2FzZV9pbnNlbnNpdGl2ZSk7XG4gICAgfVxuXG4gICAgY21vZGUua2V5d29yZFBhdHRlcm5SZSA9IGxhbmdSZShrZXl3b3JkUGF0dGVybiwgdHJ1ZSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAoIW1vZGUuYmVnaW4pIG1vZGUuYmVnaW4gPSAvXFxCfFxcYi87XG4gICAgICBjbW9kZS5iZWdpblJlID0gbGFuZ1JlKGNtb2RlLmJlZ2luKTtcbiAgICAgIGlmICghbW9kZS5lbmQgJiYgIW1vZGUuZW5kc1dpdGhQYXJlbnQpIG1vZGUuZW5kID0gL1xcQnxcXGIvO1xuICAgICAgaWYgKG1vZGUuZW5kKSBjbW9kZS5lbmRSZSA9IGxhbmdSZShjbW9kZS5lbmQpO1xuICAgICAgY21vZGUudGVybWluYXRvckVuZCA9IHNvdXJjZShjbW9kZS5lbmQpIHx8ICcnO1xuICAgICAgaWYgKG1vZGUuZW5kc1dpdGhQYXJlbnQgJiYgcGFyZW50LnRlcm1pbmF0b3JFbmQpIHtcbiAgICAgICAgY21vZGUudGVybWluYXRvckVuZCArPSAobW9kZS5lbmQgPyAnfCcgOiAnJykgKyBwYXJlbnQudGVybWluYXRvckVuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZGUuaWxsZWdhbCkgY21vZGUuaWxsZWdhbFJlID0gbGFuZ1JlKC8qKiBAdHlwZSB7UmVnRXhwIHwgc3RyaW5nfSAqLyAobW9kZS5pbGxlZ2FsKSk7XG4gICAgaWYgKCFtb2RlLmNvbnRhaW5zKSBtb2RlLmNvbnRhaW5zID0gW107XG5cbiAgICBtb2RlLmNvbnRhaW5zID0gW10uY29uY2F0KC4uLm1vZGUuY29udGFpbnMubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBleHBhbmRPckNsb25lTW9kZShjID09PSAnc2VsZicgPyBtb2RlIDogYyk7XG4gICAgfSkpO1xuICAgIG1vZGUuY29udGFpbnMuZm9yRWFjaChmdW5jdGlvbihjKSB7IGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChjKSwgY21vZGUpOyB9KTtcblxuICAgIGlmIChtb2RlLnN0YXJ0cykge1xuICAgICAgY29tcGlsZU1vZGUobW9kZS5zdGFydHMsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgY21vZGUubWF0Y2hlciA9IGJ1aWxkTW9kZVJlZ2V4KGNtb2RlKTtcbiAgICByZXR1cm4gY21vZGU7XG4gIH1cblxuICBpZiAoIWxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucykgbGFuZ3VhZ2UuY29tcGlsZXJFeHRlbnNpb25zID0gW107XG5cbiAgLy8gc2VsZiBpcyBub3QgdmFsaWQgYXQgdGhlIHRvcC1sZXZlbFxuICBpZiAobGFuZ3VhZ2UuY29udGFpbnMgJiYgbGFuZ3VhZ2UuY29udGFpbnMuaW5jbHVkZXMoJ3NlbGYnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkVSUjogY29udGFpbnMgYHNlbGZgIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIGxhbmd1YWdlLiAgU2VlIGRvY3VtZW50YXRpb24uXCIpO1xuICB9XG5cbiAgLy8gd2UgbmVlZCBhIG51bGwgb2JqZWN0LCB3aGljaCBpbmhlcml0IHdpbGwgZ3VhcmFudGVlXG4gIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXMgPSBpbmhlcml0JDEobGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlcyB8fCB7fSk7XG5cbiAgcmV0dXJuIGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChsYW5ndWFnZSkpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBtb2RlIGhhcyBhIGRlcGVuZGVuY3kgb24gaXQncyBwYXJlbnQgb3Igbm90XG4gKlxuICogSWYgYSBtb2RlIGRvZXMgaGF2ZSBhIHBhcmVudCBkZXBlbmRlbmN5IHRoZW4gb2Z0ZW4gd2UgbmVlZCB0byBjbG9uZSBpdCBpZlxuICogaXQncyB1c2VkIGluIG11bHRpcGxlIHBsYWNlcyBzbyB0aGF0IGVhY2ggY29weSBwb2ludHMgdG8gdGhlIGNvcnJlY3QgcGFyZW50LFxuICogd2hlcmUtYXMgbW9kZXMgd2l0aG91dCBhIHBhcmVudCBjYW4gb2Z0ZW4gc2FmZWx5IGJlIHJlLXVzZWQgYXQgdGhlIGJvdHRvbSBvZlxuICogYSBtb2RlIGNoYWluLlxuICpcbiAqIEBwYXJhbSB7TW9kZSB8IG51bGx9IG1vZGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIGlzIHRoZXJlIGEgZGVwZW5kZW5jeSBvbiB0aGUgcGFyZW50P1xuICogKi9cbmZ1bmN0aW9uIGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSB7XG4gIGlmICghbW9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBtb2RlLmVuZHNXaXRoUGFyZW50IHx8IGRlcGVuZGVuY3lPblBhcmVudChtb2RlLnN0YXJ0cyk7XG59XG5cbi8qKlxuICogRXhwYW5kcyBhIG1vZGUgb3IgY2xvbmVzIGl0IGlmIG5lY2Vzc2FyeVxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBtb2RlcyB3aXRoIHBhcmVudGFsIGRlcGVuZGVuY2VpcyAoc2VlIG5vdGVzIG9uXG4gKiBgZGVwZW5kZW5jeU9uUGFyZW50YCkgYW5kIGZvciBub2RlcyB0aGF0IGhhdmUgYHZhcmlhbnRzYCAtIHdoaWNoIG11c3QgdGhlbiBiZVxuICogZXhwbG9kZWQgaW50byB0aGVpciBvd24gaW5kaXZpZHVhbCBtb2RlcyBhdCBjb21waWxlIHRpbWUuXG4gKlxuICogQHBhcmFtIHtNb2RlfSBtb2RlXG4gKiBAcmV0dXJucyB7TW9kZSB8IE1vZGVbXX1cbiAqICovXG5mdW5jdGlvbiBleHBhbmRPckNsb25lTW9kZShtb2RlKSB7XG4gIGlmIChtb2RlLnZhcmlhbnRzICYmICFtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgbW9kZS5jYWNoZWRWYXJpYW50cyA9IG1vZGUudmFyaWFudHMubWFwKGZ1bmN0aW9uKHZhcmlhbnQpIHtcbiAgICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyB2YXJpYW50czogbnVsbCB9LCB2YXJpYW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEVYUEFORFxuICAvLyBpZiB3ZSBoYXZlIHZhcmlhbnRzIHRoZW4gZXNzZW50aWFsbHkgXCJyZXBsYWNlXCIgdGhlIG1vZGUgd2l0aCB0aGUgdmFyaWFudHNcbiAgLy8gdGhpcyBoYXBwZW5zIGluIGNvbXBpbGVNb2RlLCB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tXG4gIGlmIChtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgcmV0dXJuIG1vZGUuY2FjaGVkVmFyaWFudHM7XG4gIH1cblxuICAvLyBDTE9ORVxuICAvLyBpZiB3ZSBoYXZlIGRlcGVuZGVuY2llcyBvbiBwYXJlbnRzIHRoZW4gd2UgbmVlZCBhIHVuaXF1ZVxuICAvLyBpbnN0YW5jZSBvZiBvdXJzZWx2ZXMsIHNvIHdlIGNhbiBiZSByZXVzZWQgd2l0aCBtYW55XG4gIC8vIGRpZmZlcmVudCBwYXJlbnRzIHdpdGhvdXQgaXNzdWVcbiAgaWYgKGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSkge1xuICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyBzdGFydHM6IG1vZGUuc3RhcnRzID8gaW5oZXJpdCQxKG1vZGUuc3RhcnRzKSA6IG51bGwgfSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmlzRnJvemVuKG1vZGUpKSB7XG4gICAgcmV0dXJuIGluaGVyaXQkMShtb2RlKTtcbiAgfVxuXG4gIC8vIG5vIHNwZWNpYWwgZGVwZW5kZW5jeSBpc3N1ZXMsIGp1c3QgcmV0dXJuIG91cnNlbHZlc1xuICByZXR1cm4gbW9kZTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjExLjYuMFwiO1xuXG5jbGFzcyBIVE1MSW5qZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbiwgaHRtbCkge1xuICAgIHN1cGVyKHJlYXNvbik7XG4gICAgdGhpcy5uYW1lID0gXCJIVE1MSW5qZWN0aW9uRXJyb3JcIjtcbiAgICB0aGlzLmh0bWwgPSBodG1sO1xuICB9XG59XG5cbi8qXG5TeW50YXggaGlnaGxpZ2h0aW5nIHdpdGggbGFuZ3VhZ2UgYXV0b2RldGVjdGlvbi5cbmh0dHBzOi8vaGlnaGxpZ2h0anMub3JnL1xuKi9cblxuLyoqXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Nb2RlfSBNb2RlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Db21waWxlZE1vZGV9IENvbXBpbGVkTW9kZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRTY29wZX0gQ29tcGlsZWRTY29wZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTGFuZ3VhZ2V9IExhbmd1YWdlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5ITEpTQXBpfSBITEpTQXBpXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5ITEpTUGx1Z2lufSBITEpTUGx1Z2luXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5QbHVnaW5FdmVudH0gUGx1Z2luRXZlbnRcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhMSlNPcHRpb25zfSBITEpTT3B0aW9uc1xuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTGFuZ3VhZ2VGbn0gTGFuZ3VhZ2VGblxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSGlnaGxpZ2h0ZWRIVE1MRWxlbWVudH0gSGlnaGxpZ2h0ZWRIVE1MRWxlbWVudFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQmVmb3JlSGlnaGxpZ2h0Q29udGV4dH0gQmVmb3JlSGlnaGxpZ2h0Q29udGV4dFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5NYXRjaFR5cGV9IE1hdGNoVHlwZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5LZXl3b3JkRGF0YX0gS2V5d29yZERhdGFcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcy9wcml2YXRlJykuRW5oYW5jZWRNYXRjaH0gRW5oYW5jZWRNYXRjaFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5Bbm5vdGF0ZWRFcnJvcn0gQW5ub3RhdGVkRXJyb3JcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkF1dG9IaWdobGlnaHRSZXN1bHR9IEF1dG9IaWdobGlnaHRSZXN1bHRcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhpZ2hsaWdodE9wdGlvbnN9IEhpZ2hsaWdodE9wdGlvbnNcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhpZ2hsaWdodFJlc3VsdH0gSGlnaGxpZ2h0UmVzdWx0XG4qL1xuXG5cbmNvbnN0IGVzY2FwZSA9IGVzY2FwZUhUTUw7XG5jb25zdCBpbmhlcml0ID0gaW5oZXJpdCQxO1xuY29uc3QgTk9fTUFUQ0ggPSBTeW1ib2woXCJub21hdGNoXCIpO1xuY29uc3QgTUFYX0tFWVdPUkRfSElUUyA9IDc7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGhsanMgLSBvYmplY3QgdGhhdCBpcyBleHRlbmRlZCAobGVnYWN5KVxuICogQHJldHVybnMge0hMSlNBcGl9XG4gKi9cbmNvbnN0IEhMSlMgPSBmdW5jdGlvbihobGpzKSB7XG4gIC8vIEdsb2JhbCBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCB3aXRoaW4gdGhlIGhpZ2hsaWdodC5qcyBsaWJyYXJ5LlxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIExhbmd1YWdlPn0gKi9cbiAgY29uc3QgbGFuZ3VhZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBhbGlhc2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLyoqIEB0eXBlIHtITEpTUGx1Z2luW119ICovXG4gIGNvbnN0IHBsdWdpbnMgPSBbXTtcblxuICAvLyBzYWZlL3Byb2R1Y3Rpb24gbW9kZSAtIHN3YWxsb3dzIG1vcmUgZXJyb3JzLCB0cmllcyB0byBrZWVwIHJ1bm5pbmdcbiAgLy8gZXZlbiBpZiBhIHNpbmdsZSBzeW50YXggb3IgcGFyc2UgaGl0cyBhIGZhdGFsIGVycm9yXG4gIGxldCBTQUZFX01PREUgPSB0cnVlO1xuICBjb25zdCBMQU5HVUFHRV9OT1RfRk9VTkQgPSBcIkNvdWxkIG5vdCBmaW5kIHRoZSBsYW5ndWFnZSAne30nLCBkaWQgeW91IGZvcmdldCB0byBsb2FkL2luY2x1ZGUgYSBsYW5ndWFnZSBtb2R1bGU/XCI7XG4gIC8qKiBAdHlwZSB7TGFuZ3VhZ2V9ICovXG4gIGNvbnN0IFBMQUlOVEVYVF9MQU5HVUFHRSA9IHsgZGlzYWJsZUF1dG9kZXRlY3Q6IHRydWUsIG5hbWU6ICdQbGFpbiB0ZXh0JywgY29udGFpbnM6IFtdIH07XG5cbiAgLy8gR2xvYmFsIG9wdGlvbnMgdXNlZCB3aGVuIHdpdGhpbiBleHRlcm5hbCBBUElzLiBUaGlzIGlzIG1vZGlmaWVkIHdoZW5cbiAgLy8gY2FsbGluZyB0aGUgYGhsanMuY29uZmlndXJlYCBmdW5jdGlvbi5cbiAgLyoqIEB0eXBlIEhMSlNPcHRpb25zICovXG4gIGxldCBvcHRpb25zID0ge1xuICAgIGlnbm9yZVVuZXNjYXBlZEhUTUw6IGZhbHNlLFxuICAgIHRocm93VW5lc2NhcGVkSFRNTDogZmFsc2UsXG4gICAgbm9IaWdobGlnaHRSZTogL14obm8tP2hpZ2hsaWdodCkkL2ksXG4gICAgbGFuZ3VhZ2VEZXRlY3RSZTogL1xcYmxhbmcoPzp1YWdlKT8tKFtcXHctXSspXFxiL2ksXG4gICAgY2xhc3NQcmVmaXg6ICdobGpzLScsXG4gICAgY3NzU2VsZWN0b3I6ICdwcmUgY29kZScsXG4gICAgbGFuZ3VhZ2VzOiBudWxsLFxuICAgIC8vIGJldGEgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzdWJqZWN0IHRvIGNoYW5nZSwgd2VsY29tZSB0byBkaXNjdXNzXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMTA4NlxuICAgIF9fZW1pdHRlcjogVG9rZW5UcmVlRW1pdHRlclxuICB9O1xuXG4gIC8qIFV0aWxpdHkgZnVuY3Rpb25zICovXG5cbiAgLyoqXG4gICAqIFRlc3RzIGEgbGFuZ3VhZ2UgbmFtZSB0byBzZWUgaWYgaGlnaGxpZ2h0aW5nIHNob3VsZCBiZSBza2lwcGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZU5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZE5vdEhpZ2hsaWdodChsYW5ndWFnZU5hbWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5ub0hpZ2hsaWdodFJlLnRlc3QobGFuZ3VhZ2VOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hpZ2hsaWdodGVkSFRNTEVsZW1lbnR9IGJsb2NrIC0gdGhlIEhUTUwgZWxlbWVudCB0byBkZXRlcm1pbmUgbGFuZ3VhZ2UgZm9yXG4gICAqL1xuICBmdW5jdGlvbiBibG9ja0xhbmd1YWdlKGJsb2NrKSB7XG4gICAgbGV0IGNsYXNzZXMgPSBibG9jay5jbGFzc05hbWUgKyAnICc7XG5cbiAgICBjbGFzc2VzICs9IGJsb2NrLnBhcmVudE5vZGUgPyBibG9jay5wYXJlbnROb2RlLmNsYXNzTmFtZSA6ICcnO1xuXG4gICAgLy8gbGFuZ3VhZ2UtKiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbm9uLXByZWZpeGVkIGNsYXNzIG5hbWVzLlxuICAgIGNvbnN0IG1hdGNoID0gb3B0aW9ucy5sYW5ndWFnZURldGVjdFJlLmV4ZWMoY2xhc3Nlcyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1hdGNoWzFdKTtcbiAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgd2FybihMQU5HVUFHRV9OT1RfRk9VTkQucmVwbGFjZShcInt9XCIsIG1hdGNoWzFdKSk7XG4gICAgICAgIHdhcm4oXCJGYWxsaW5nIGJhY2sgdG8gbm8taGlnaGxpZ2h0IG1vZGUgZm9yIHRoaXMgYmxvY2suXCIsIGJsb2NrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYW5ndWFnZSA/IG1hdGNoWzFdIDogJ25vLWhpZ2hsaWdodCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzZXNcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuZmluZCgoX2NsYXNzKSA9PiBzaG91bGROb3RIaWdobGlnaHQoX2NsYXNzKSB8fCBnZXRMYW5ndWFnZShfY2xhc3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIGhpZ2hsaWdodGluZyBmdW5jdGlvbi5cbiAgICpcbiAgICogT0xEIEFQSVxuICAgKiBoaWdobGlnaHQobGFuZywgY29kZSwgaWdub3JlSWxsZWdhbHMsIGNvbnRpbnVhdGlvbilcbiAgICpcbiAgICogTkVXIEFQSVxuICAgKiBoaWdobGlnaHQoY29kZSwge2xhbmcsIGlnbm9yZUlsbGVnYWxzfSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVPckxhbmd1YWdlTmFtZSAtIHRoZSBsYW5ndWFnZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IEhpZ2hsaWdodE9wdGlvbnN9IG9wdGlvbnNPckNvZGUgLSB0aGUgY29kZSB0byBoaWdobGlnaHRcbiAgICogQHBhcmFtIHtib29sZWFufSBbaWdub3JlSWxsZWdhbHNdIC0gd2hldGhlciB0byBpZ25vcmUgaWxsZWdhbCBtYXRjaGVzLCBkZWZhdWx0IGlzIHRvIGJhaWxcbiAgICpcbiAgICogQHJldHVybnMge0hpZ2hsaWdodFJlc3VsdH0gUmVzdWx0IC0gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYW5ndWFnZSAtIHRoZSBsYW5ndWFnZSBuYW1lXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByZWxldmFuY2UgLSB0aGUgcmVsZXZhbmNlIHNjb3JlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIHRoZSBoaWdobGlnaHRlZCBIVE1MIGNvZGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvZGUgLSB0aGUgb3JpZ2luYWwgcmF3IGNvZGVcbiAgICogQHByb3BlcnR5IHtDb21waWxlZE1vZGV9IHRvcCAtIHRvcCBvZiB0aGUgY3VycmVudCBtb2RlIHN0YWNrXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaWxsZWdhbCAtIGluZGljYXRlcyB3aGV0aGVyIGFueSBpbGxlZ2FsIG1hdGNoZXMgd2VyZSBmb3VuZFxuICAqL1xuICBmdW5jdGlvbiBoaWdobGlnaHQoY29kZU9yTGFuZ3VhZ2VOYW1lLCBvcHRpb25zT3JDb2RlLCBpZ25vcmVJbGxlZ2Fscykge1xuICAgIGxldCBjb2RlID0gXCJcIjtcbiAgICBsZXQgbGFuZ3VhZ2VOYW1lID0gXCJcIjtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPckNvZGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvZGUgPSBjb2RlT3JMYW5ndWFnZU5hbWU7XG4gICAgICBpZ25vcmVJbGxlZ2FscyA9IG9wdGlvbnNPckNvZGUuaWdub3JlSWxsZWdhbHM7XG4gICAgICBsYW5ndWFnZU5hbWUgPSBvcHRpb25zT3JDb2RlLmxhbmd1YWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbGQgQVBJXG4gICAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiaGlnaGxpZ2h0KGxhbmcsIGNvZGUsIC4uLmFyZ3MpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuXCIpO1xuICAgICAgZGVwcmVjYXRlZChcIjEwLjcuMFwiLCBcIlBsZWFzZSB1c2UgaGlnaGxpZ2h0KGNvZGUsIG9wdGlvbnMpIGluc3RlYWQuXFxuaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjI3N1wiKTtcbiAgICAgIGxhbmd1YWdlTmFtZSA9IGNvZGVPckxhbmd1YWdlTmFtZTtcbiAgICAgIGNvZGUgPSBvcHRpb25zT3JDb2RlO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzMxNDlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgaWYgKGlnbm9yZUlsbGVnYWxzID09PSB1bmRlZmluZWQpIHsgaWdub3JlSWxsZWdhbHMgPSB0cnVlOyB9XG5cbiAgICAvKiogQHR5cGUge0JlZm9yZUhpZ2hsaWdodENvbnRleHR9ICovXG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIGNvZGUsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VOYW1lXG4gICAgfTtcbiAgICAvLyB0aGUgcGx1Z2luIGNhbiBjaGFuZ2UgdGhlIGRlc2lyZWQgbGFuZ3VhZ2Ugb3IgdGhlIGNvZGUgdG8gYmUgaGlnaGxpZ2h0ZWRcbiAgICAvLyBqdXN0IGJlIGNoYW5naW5nIHRoZSBvYmplY3QgaXQgd2FzIHBhc3NlZFxuICAgIGZpcmUoXCJiZWZvcmU6aGlnaGxpZ2h0XCIsIGNvbnRleHQpO1xuXG4gICAgLy8gYSBiZWZvcmUgcGx1Z2luIGNhbiB1c3VycCB0aGUgcmVzdWx0IGNvbXBsZXRlbHkgYnkgcHJvdmlkaW5nIGl0J3Mgb3duXG4gICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBldmVuIG5lZWQgdG8gY2FsbCBoaWdobGlnaHRcbiAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnJlc3VsdFxuICAgICAgPyBjb250ZXh0LnJlc3VsdFxuICAgICAgOiBfaGlnaGxpZ2h0KGNvbnRleHQubGFuZ3VhZ2UsIGNvbnRleHQuY29kZSwgaWdub3JlSWxsZWdhbHMpO1xuXG4gICAgcmVzdWx0LmNvZGUgPSBjb250ZXh0LmNvZGU7XG4gICAgLy8gdGhlIHBsdWdpbiBjYW4gY2hhbmdlIGFueXRoaW5nIGluIHJlc3VsdCB0byBzdWl0ZSBpdFxuICAgIGZpcmUoXCJhZnRlcjpoaWdobGlnaHRcIiwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogcHJpdmF0ZSBoaWdobGlnaHQgdGhhdCdzIHVzZWQgaW50ZXJuYWxseSBhbmQgZG9lcyBub3QgZmlyZSBjYWxsYmFja3NcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlTmFtZSAtIHRoZSBsYW5ndWFnZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVRvSGlnaGxpZ2h0IC0gdGhlIGNvZGUgdG8gaGlnaGxpZ2h0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbj99IFtpZ25vcmVJbGxlZ2Fsc10gLSB3aGV0aGVyIHRvIGlnbm9yZSBpbGxlZ2FsIG1hdGNoZXMsIGRlZmF1bHQgaXMgdG8gYmFpbFxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZT99IFtjb250aW51YXRpb25dIC0gY3VycmVudCBjb250aW51YXRpb24gbW9kZSwgaWYgYW55XG4gICAqIEByZXR1cm5zIHtIaWdobGlnaHRSZXN1bHR9IC0gcmVzdWx0IG9mIHRoZSBoaWdobGlnaHQgb3BlcmF0aW9uXG4gICovXG4gIGZ1bmN0aW9uIF9oaWdobGlnaHQobGFuZ3VhZ2VOYW1lLCBjb2RlVG9IaWdobGlnaHQsIGlnbm9yZUlsbGVnYWxzLCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBrZXl3b3JkSGl0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4ga2V5d29yZCBkYXRhIGlmIGEgbWF0Y2ggaXMgYSBrZXl3b3JkXG4gICAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGUgLSBjdXJyZW50IG1vZGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hUZXh0IC0gdGhlIHRleHR1YWwgbWF0Y2hcbiAgICAgKiBAcmV0dXJucyB7S2V5d29yZERhdGEgfCBmYWxzZX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXl3b3JkRGF0YShtb2RlLCBtYXRjaFRleHQpIHtcbiAgICAgIHJldHVybiBtb2RlLmtleXdvcmRzW21hdGNoVGV4dF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0tleXdvcmRzKCkge1xuICAgICAgaWYgKCF0b3Aua2V5d29yZHMpIHtcbiAgICAgICAgZW1pdHRlci5hZGRUZXh0KG1vZGVCdWZmZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgICAgdG9wLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4ID0gMDtcbiAgICAgIGxldCBtYXRjaCA9IHRvcC5rZXl3b3JkUGF0dGVyblJlLmV4ZWMobW9kZUJ1ZmZlcik7XG4gICAgICBsZXQgYnVmID0gXCJcIjtcblxuICAgICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgIGJ1ZiArPSBtb2RlQnVmZmVyLnN1YnN0cmluZyhsYXN0SW5kZXgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgY29uc3Qgd29yZCA9IGxhbmd1YWdlLmNhc2VfaW5zZW5zaXRpdmUgPyBtYXRjaFswXS50b0xvd2VyQ2FzZSgpIDogbWF0Y2hbMF07XG4gICAgICAgIGNvbnN0IGRhdGEgPSBrZXl3b3JkRGF0YSh0b3AsIHdvcmQpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGNvbnN0IFtraW5kLCBrZXl3b3JkUmVsZXZhbmNlXSA9IGRhdGE7XG4gICAgICAgICAgZW1pdHRlci5hZGRUZXh0KGJ1Zik7XG4gICAgICAgICAgYnVmID0gXCJcIjtcblxuICAgICAgICAgIGtleXdvcmRIaXRzW3dvcmRdID0gKGtleXdvcmRIaXRzW3dvcmRdIHx8IDApICsgMTtcbiAgICAgICAgICBpZiAoa2V5d29yZEhpdHNbd29yZF0gPD0gTUFYX0tFWVdPUkRfSElUUykgcmVsZXZhbmNlICs9IGtleXdvcmRSZWxldmFuY2U7XG4gICAgICAgICAgaWYgKGtpbmQuc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgICAgIC8vIF8gaW1wbGllZCBmb3IgcmVsZXZhbmNlIG9ubHksIGRvIG5vdCBoaWdobGlnaHRcbiAgICAgICAgICAgIC8vIGJ5IGFwcGx5aW5nIGEgY2xhc3MgbmFtZVxuICAgICAgICAgICAgYnVmICs9IG1hdGNoWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjc3NDbGFzcyA9IGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNba2luZF0gfHwga2luZDtcbiAgICAgICAgICAgIGVtaXR0ZXIuYWRkS2V5d29yZChtYXRjaFswXSwgY3NzQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWYgKz0gbWF0Y2hbMF07XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEluZGV4ID0gdG9wLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4O1xuICAgICAgICBtYXRjaCA9IHRvcC5rZXl3b3JkUGF0dGVyblJlLmV4ZWMobW9kZUJ1ZmZlcik7XG4gICAgICB9XG4gICAgICBidWYgKz0gbW9kZUJ1ZmZlci5zdWJzdHJpbmcobGFzdEluZGV4KTtcbiAgICAgIGVtaXR0ZXIuYWRkVGV4dChidWYpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NTdWJMYW5ndWFnZSgpIHtcbiAgICAgIGlmIChtb2RlQnVmZmVyID09PSBcIlwiKSByZXR1cm47XG4gICAgICAvKiogQHR5cGUgSGlnaGxpZ2h0UmVzdWx0ICovXG4gICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiB0b3Auc3ViTGFuZ3VhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghbGFuZ3VhZ2VzW3RvcC5zdWJMYW5ndWFnZV0pIHtcbiAgICAgICAgICBlbWl0dGVyLmFkZFRleHQobW9kZUJ1ZmZlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IF9oaWdobGlnaHQodG9wLnN1Ykxhbmd1YWdlLCBtb2RlQnVmZmVyLCB0cnVlLCBjb250aW51YXRpb25zW3RvcC5zdWJMYW5ndWFnZV0pO1xuICAgICAgICBjb250aW51YXRpb25zW3RvcC5zdWJMYW5ndWFnZV0gPSAvKiogQHR5cGUge0NvbXBpbGVkTW9kZX0gKi8gKHJlc3VsdC5fdG9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGhpZ2hsaWdodEF1dG8obW9kZUJ1ZmZlciwgdG9wLnN1Ykxhbmd1YWdlLmxlbmd0aCA/IHRvcC5zdWJMYW5ndWFnZSA6IG51bGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudGluZyBlbWJlZGRlZCBsYW5ndWFnZSBzY29yZSB0b3dhcmRzIHRoZSBob3N0IGxhbmd1YWdlIG1heSBiZSBkaXNhYmxlZFxuICAgICAgLy8gd2l0aCB6ZXJvaW5nIHRoZSBjb250YWluaW5nIG1vZGUgcmVsZXZhbmNlLiBVc2UgY2FzZSBpbiBwb2ludCBpcyBNYXJrZG93biB0aGF0XG4gICAgICAvLyBhbGxvd3MgWE1MIGV2ZXJ5d2hlcmUgYW5kIG1ha2VzIGV2ZXJ5IFhNTCBzbmlwcGV0IHRvIGhhdmUgYSBtdWNoIGxhcmdlciBNYXJrZG93blxuICAgICAgLy8gc2NvcmUuXG4gICAgICBpZiAodG9wLnJlbGV2YW5jZSA+IDApIHtcbiAgICAgICAgcmVsZXZhbmNlICs9IHJlc3VsdC5yZWxldmFuY2U7XG4gICAgICB9XG4gICAgICBlbWl0dGVyLmFkZFN1Ymxhbmd1YWdlKHJlc3VsdC5fZW1pdHRlciwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQnVmZmVyKCkge1xuICAgICAgaWYgKHRvcC5zdWJMYW5ndWFnZSAhPSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3NTdWJMYW5ndWFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0tleXdvcmRzKCk7XG4gICAgICB9XG4gICAgICBtb2RlQnVmZmVyID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDb21waWxlZFNjb3BlfSBzY29wZVxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbWl0TXVsdGlDbGFzcyhzY29wZSwgbWF0Y2gpIHtcbiAgICAgIGxldCBpID0gMTtcbiAgICAgIGNvbnN0IG1heCA9IG1hdGNoLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaSA8PSBtYXgpIHtcbiAgICAgICAgaWYgKCFzY29wZS5fZW1pdFtpXSkgeyBpKys7IGNvbnRpbnVlOyB9XG4gICAgICAgIGNvbnN0IGtsYXNzID0gbGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlc1tzY29wZVtpXV0gfHwgc2NvcGVbaV07XG4gICAgICAgIGNvbnN0IHRleHQgPSBtYXRjaFtpXTtcbiAgICAgICAgaWYgKGtsYXNzKSB7XG4gICAgICAgICAgZW1pdHRlci5hZGRLZXl3b3JkKHRleHQsIGtsYXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gdGV4dDtcbiAgICAgICAgICBwcm9jZXNzS2V5d29yZHMoKTtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGUgLSBuZXcgbW9kZSB0byBzdGFydFxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydE5ld01vZGUobW9kZSwgbWF0Y2gpIHtcbiAgICAgIGlmIChtb2RlLnNjb3BlICYmIHR5cGVvZiBtb2RlLnNjb3BlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVtaXR0ZXIub3Blbk5vZGUobGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlc1ttb2RlLnNjb3BlXSB8fCBtb2RlLnNjb3BlKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlLmJlZ2luU2NvcGUpIHtcbiAgICAgICAgLy8gYmVnaW5TY29wZSBqdXN0IHdyYXBzIHRoZSBiZWdpbiBtYXRjaCBpdHNlbGYgaW4gYSBzY29wZVxuICAgICAgICBpZiAobW9kZS5iZWdpblNjb3BlLl93cmFwKSB7XG4gICAgICAgICAgZW1pdHRlci5hZGRLZXl3b3JkKG1vZGVCdWZmZXIsIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNbbW9kZS5iZWdpblNjb3BlLl93cmFwXSB8fCBtb2RlLmJlZ2luU2NvcGUuX3dyYXApO1xuICAgICAgICAgIG1vZGVCdWZmZXIgPSBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUuYmVnaW5TY29wZS5fbXVsdGkpIHtcbiAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IG1vZGVCdWZmZXIgc2hvdWxkIGp1c3QgYmUgdGhlIG1hdGNoXG4gICAgICAgICAgZW1pdE11bHRpQ2xhc3MobW9kZS5iZWdpblNjb3BlLCBtYXRjaCk7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdG9wID0gT2JqZWN0LmNyZWF0ZShtb2RlLCB7IHBhcmVudDogeyB2YWx1ZTogdG9wIH0gfSk7XG4gICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlIH0gbW9kZSAtIHRoZSBtb2RlIHRvIHBvdGVudGlhbGx5IGVuZFxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2ggLSB0aGUgbGF0ZXN0IG1hdGNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoUGx1c1JlbWFpbmRlciAtIG1hdGNoIHBsdXMgcmVtYWluZGVyIG9mIGNvbnRlbnRcbiAgICAgKiBAcmV0dXJucyB7Q29tcGlsZWRNb2RlIHwgdm9pZH0gLSB0aGUgbmV4dCBtb2RlLCBvciBpZiB2b2lkIGNvbnRpbnVlIG9uIGluIGN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuZE9mTW9kZShtb2RlLCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKSB7XG4gICAgICBsZXQgbWF0Y2hlZCA9IHN0YXJ0c1dpdGgobW9kZS5lbmRSZSwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcblxuICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgaWYgKG1vZGVbXCJvbjplbmRcIl0pIHtcbiAgICAgICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG1vZGUpO1xuICAgICAgICAgIG1vZGVbXCJvbjplbmRcIl0obWF0Y2gsIHJlc3ApO1xuICAgICAgICAgIGlmIChyZXNwLmlzTWF0Y2hJZ25vcmVkKSBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgIHdoaWxlIChtb2RlLmVuZHNQYXJlbnQgJiYgbW9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIG1vZGUgPSBtb2RlLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGV2ZW4gaWYgb246ZW5kIGZpcmVzIGFuIGBpZ25vcmVgIGl0J3Mgc3RpbGwgcG9zc2libGVcbiAgICAgIC8vIHRoYXQgd2UgbWlnaHQgdHJpZ2dlciB0aGUgZW5kIG5vZGUgYmVjYXVzZSBvZiBhIHBhcmVudCBtb2RlXG4gICAgICBpZiAobW9kZS5lbmRzV2l0aFBhcmVudCkge1xuICAgICAgICByZXR1cm4gZW5kT2ZNb2RlKG1vZGUucGFyZW50LCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbWF0Y2hpbmcgYnV0IHRoZW4gaWdub3JpbmcgYSBzZXF1ZW5jZSBvZiB0ZXh0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGV4ZW1lIC0gc3RyaW5nIGNvbnRhaW5pbmcgZnVsbCBtYXRjaCB0ZXh0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9JZ25vcmUobGV4ZW1lKSB7XG4gICAgICBpZiAodG9wLm1hdGNoZXIucmVnZXhJbmRleCA9PT0gMCkge1xuICAgICAgICAvLyBubyBtb3JlIHJlZ2V4ZXMgdG8gcG90ZW50aWFsbHkgbWF0Y2ggaGVyZSwgc28gd2UgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgb25lXG4gICAgICAgIC8vIHNwYWNlXG4gICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lWzBdO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIG5lZWQgdG8gbW92ZSB0aGUgY3Vyc29yLCB3ZSBzdGlsbCBoYXZlIGFkZGl0aW9uYWwgcmVnZXhlcyB0byB0cnkgYW5kXG4gICAgICAgIC8vIG1hdGNoIGF0IHRoaXMgdmVyeSBzcG90XG4gICAgICAgIHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgc3RhcnQgb2YgYSBuZXcgcG90ZW50aWFsIG1vZGUgbWF0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RW5oYW5jZWRNYXRjaH0gbWF0Y2ggLSB0aGUgY3VycmVudCBtYXRjaFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IGhvdyBmYXIgdG8gYWR2YW5jZSB0aGUgcGFyc2UgY3Vyc29yXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9CZWdpbk1hdGNoKG1hdGNoKSB7XG4gICAgICBjb25zdCBsZXhlbWUgPSBtYXRjaFswXTtcbiAgICAgIGNvbnN0IG5ld01vZGUgPSBtYXRjaC5ydWxlO1xuXG4gICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG5ld01vZGUpO1xuICAgICAgLy8gZmlyc3QgaW50ZXJuYWwgYmVmb3JlIGNhbGxiYWNrcywgdGhlbiB0aGUgcHVibGljIG9uZXNcbiAgICAgIGNvbnN0IGJlZm9yZUNhbGxiYWNrcyA9IFtuZXdNb2RlLl9fYmVmb3JlQmVnaW4sIG5ld01vZGVbXCJvbjpiZWdpblwiXV07XG4gICAgICBmb3IgKGNvbnN0IGNiIG9mIGJlZm9yZUNhbGxiYWNrcykge1xuICAgICAgICBpZiAoIWNiKSBjb250aW51ZTtcbiAgICAgICAgY2IobWF0Y2gsIHJlc3ApO1xuICAgICAgICBpZiAocmVzcC5pc01hdGNoSWdub3JlZCkgcmV0dXJuIGRvSWdub3JlKGxleGVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdNb2RlLnNraXApIHtcbiAgICAgICAgbW9kZUJ1ZmZlciArPSBsZXhlbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGlmICghbmV3TW9kZS5yZXR1cm5CZWdpbiAmJiAhbmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gbGV4ZW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydE5ld01vZGUobmV3TW9kZSwgbWF0Y2gpO1xuICAgICAgcmV0dXJuIG5ld01vZGUucmV0dXJuQmVnaW4gPyAwIDogbGV4ZW1lLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIHBvdGVudGlhbCBlbmQgb2YgbW9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaCAtIHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9FbmRNYXRjaChtYXRjaCkge1xuICAgICAgY29uc3QgbGV4ZW1lID0gbWF0Y2hbMF07XG4gICAgICBjb25zdCBtYXRjaFBsdXNSZW1haW5kZXIgPSBjb2RlVG9IaWdobGlnaHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KTtcblxuICAgICAgY29uc3QgZW5kTW9kZSA9IGVuZE9mTW9kZSh0b3AsIG1hdGNoLCBtYXRjaFBsdXNSZW1haW5kZXIpO1xuICAgICAgaWYgKCFlbmRNb2RlKSB7IHJldHVybiBOT19NQVRDSDsgfVxuXG4gICAgICBjb25zdCBvcmlnaW4gPSB0b3A7XG4gICAgICBpZiAodG9wLmVuZFNjb3BlICYmIHRvcC5lbmRTY29wZS5fd3JhcCkge1xuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGVtaXR0ZXIuYWRkS2V5d29yZChsZXhlbWUsIHRvcC5lbmRTY29wZS5fd3JhcCk7XG4gICAgICB9IGVsc2UgaWYgKHRvcC5lbmRTY29wZSAmJiB0b3AuZW5kU2NvcGUuX211bHRpKSB7XG4gICAgICAgIHByb2Nlc3NCdWZmZXIoKTtcbiAgICAgICAgZW1pdE11bHRpQ2xhc3ModG9wLmVuZFNjb3BlLCBtYXRjaCk7XG4gICAgICB9IGVsc2UgaWYgKG9yaWdpbi5za2lwKSB7XG4gICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEob3JpZ2luLnJldHVybkVuZCB8fCBvcmlnaW4uZXhjbHVkZUVuZCkpIHtcbiAgICAgICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGlmIChvcmlnaW4uZXhjbHVkZUVuZCkge1xuICAgICAgICAgIG1vZGVCdWZmZXIgPSBsZXhlbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRvcC5zY29wZSkge1xuICAgICAgICAgIGVtaXR0ZXIuY2xvc2VOb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0b3Auc2tpcCAmJiAhdG9wLnN1Ykxhbmd1YWdlKSB7XG4gICAgICAgICAgcmVsZXZhbmNlICs9IHRvcC5yZWxldmFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgdG9wID0gdG9wLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKHRvcCAhPT0gZW5kTW9kZS5wYXJlbnQpO1xuICAgICAgaWYgKGVuZE1vZGUuc3RhcnRzKSB7XG4gICAgICAgIHN0YXJ0TmV3TW9kZShlbmRNb2RlLnN0YXJ0cywgbWF0Y2gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yaWdpbi5yZXR1cm5FbmQgPyAwIDogbGV4ZW1lLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQ29udGludWF0aW9ucygpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgICAgIGZvciAobGV0IGN1cnJlbnQgPSB0b3A7IGN1cnJlbnQgIT09IGxhbmd1YWdlOyBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQuc2NvcGUpIHtcbiAgICAgICAgICBsaXN0LnVuc2hpZnQoY3VycmVudC5zY29wZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QuZm9yRWFjaChpdGVtID0+IGVtaXR0ZXIub3Blbk5vZGUoaXRlbSkpO1xuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7e3R5cGU/OiBNYXRjaFR5cGUsIGluZGV4PzogbnVtYmVyLCBydWxlPzogTW9kZX19fSAqL1xuICAgIGxldCBsYXN0TWF0Y2ggPSB7fTtcblxuICAgIC8qKlxuICAgICAqICBQcm9jZXNzIGFuIGluZGl2aWR1YWwgbWF0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0QmVmb3JlTWF0Y2ggLSB0ZXh0IHByZWNlZGluZyB0aGUgbWF0Y2ggKHNpbmNlIHRoZSBsYXN0IG1hdGNoKVxuICAgICAqIEBwYXJhbSB7RW5oYW5jZWRNYXRjaH0gW21hdGNoXSAtIHRoZSBtYXRjaCBpdHNlbGZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9jZXNzTGV4ZW1lKHRleHRCZWZvcmVNYXRjaCwgbWF0Y2gpIHtcbiAgICAgIGNvbnN0IGxleGVtZSA9IG1hdGNoICYmIG1hdGNoWzBdO1xuXG4gICAgICAvLyBhZGQgbm9uLW1hdGNoZWQgdGV4dCB0byB0aGUgY3VycmVudCBtb2RlIGJ1ZmZlclxuICAgICAgbW9kZUJ1ZmZlciArPSB0ZXh0QmVmb3JlTWF0Y2g7XG5cbiAgICAgIGlmIChsZXhlbWUgPT0gbnVsbCkge1xuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSd2ZSBmb3VuZCBhIDAgd2lkdGggbWF0Y2ggYW5kIHdlJ3JlIHN0dWNrLCBzbyB3ZSBuZWVkIHRvIGFkdmFuY2VcbiAgICAgIC8vIHRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYmFkbHkgYmVoYXZlZCBydWxlcyB0aGF0IGhhdmUgb3B0aW9uYWwgbWF0Y2hlcnMgdG8gdGhlIGRlZ3JlZSB0aGF0XG4gICAgICAvLyBzb21ldGltZXMgdGhleSBjYW4gZW5kIHVwIG1hdGNoaW5nIG5vdGhpbmcgYXQgYWxsXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzIxNDBcbiAgICAgIGlmIChsYXN0TWF0Y2gudHlwZSA9PT0gXCJiZWdpblwiICYmIG1hdGNoLnR5cGUgPT09IFwiZW5kXCIgJiYgbGFzdE1hdGNoLmluZGV4ID09PSBtYXRjaC5pbmRleCAmJiBsZXhlbWUgPT09IFwiXCIpIHtcbiAgICAgICAgLy8gc3BpdCB0aGUgXCJza2lwcGVkXCIgY2hhcmFjdGVyIHRoYXQgb3VyIHJlZ2V4IGNob2tlZCBvbiBiYWNrIGludG8gdGhlIG91dHB1dCBzZXF1ZW5jZVxuICAgICAgICBtb2RlQnVmZmVyICs9IGNvZGVUb0hpZ2hsaWdodC5zbGljZShtYXRjaC5pbmRleCwgbWF0Y2guaW5kZXggKyAxKTtcbiAgICAgICAgaWYgKCFTQUZFX01PREUpIHtcbiAgICAgICAgICAvKiogQHR5cGUge0Fubm90YXRlZEVycm9yfSAqL1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgMCB3aWR0aCBtYXRjaCByZWdleCAoJHtsYW5ndWFnZU5hbWV9KWApO1xuICAgICAgICAgIGVyci5sYW5ndWFnZU5hbWUgPSBsYW5ndWFnZU5hbWU7XG4gICAgICAgICAgZXJyLmJhZFJ1bGUgPSBsYXN0TWF0Y2gucnVsZTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBsYXN0TWF0Y2ggPSBtYXRjaDtcblxuICAgICAgaWYgKG1hdGNoLnR5cGUgPT09IFwiYmVnaW5cIikge1xuICAgICAgICByZXR1cm4gZG9CZWdpbk1hdGNoKG1hdGNoKTtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2gudHlwZSA9PT0gXCJpbGxlZ2FsXCIgJiYgIWlnbm9yZUlsbGVnYWxzKSB7XG4gICAgICAgIC8vIGlsbGVnYWwgbWF0Y2gsIHdlIGRvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5nXG4gICAgICAgIC8qKiBAdHlwZSB7QW5ub3RhdGVkRXJyb3J9ICovXG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignSWxsZWdhbCBsZXhlbWUgXCInICsgbGV4ZW1lICsgJ1wiIGZvciBtb2RlIFwiJyArICh0b3Auc2NvcGUgfHwgJzx1bm5hbWVkPicpICsgJ1wiJyk7XG4gICAgICAgIGVyci5tb2RlID0gdG9wO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoLnR5cGUgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gZG9FbmRNYXRjaChtYXRjaCk7XG4gICAgICAgIGlmIChwcm9jZXNzZWQgIT09IE5PX01BVENIKSB7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlZGdlIGNhc2UgZm9yIHdoZW4gaWxsZWdhbCBtYXRjaGVzICQgKGVuZCBvZiBsaW5lKSB3aGljaCBpcyB0ZWNobmljYWxseVxuICAgICAgLy8gYSAwIHdpZHRoIG1hdGNoIGJ1dCBub3QgYSBiZWdpbi9lbmQgbWF0Y2ggc28gaXQncyBub3QgY2F1Z2h0IGJ5IHRoZVxuICAgICAgLy8gZmlyc3QgaGFuZGxlciAod2hlbiBpZ25vcmVJbGxlZ2FscyBpcyB0cnVlKVxuICAgICAgaWYgKG1hdGNoLnR5cGUgPT09IFwiaWxsZWdhbFwiICYmIGxleGVtZSA9PT0gXCJcIikge1xuICAgICAgICAvLyBhZHZhbmNlIHNvIHdlIGFyZW4ndCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvLyBpbmZpbml0ZSBsb29wcyBhcmUgQkFELCB0aGlzIGlzIGEgbGFzdCBkaXRjaCBjYXRjaCBhbGwuIGlmIHdlIGhhdmUgYVxuICAgICAgLy8gZGVjZW50IG51bWJlciBvZiBpdGVyYXRpb25zIHlldCBvdXIgaW5kZXggKGN1cnNvciBwb3NpdGlvbiBpbiBvdXJcbiAgICAgIC8vIHBhcnNpbmcpIHN0aWxsIDN4IGJlaGluZCBvdXIgaW5kZXggdGhlbiBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZ1xuICAgICAgLy8gc28gd2UgYmFpbFxuICAgICAgaWYgKGl0ZXJhdGlvbnMgPiAxMDAwMDAgJiYgaXRlcmF0aW9ucyA+IG1hdGNoLmluZGV4ICogMykge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ3BvdGVudGlhbCBpbmZpbml0ZSBsb29wLCB3YXkgbW9yZSBpdGVyYXRpb25zIHRoYW4gbWF0Y2hlcycpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICBXaHkgbWlnaHQgYmUgZmluZCBvdXJzZWx2ZXMgaGVyZT8gIEFuIHBvdGVudGlhbCBlbmQgbWF0Y2ggdGhhdCB3YXNcbiAgICAgIHRyaWdnZXJlZCBidXQgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gIElFLCBgZG9FbmRNYXRjaGAgcmV0dXJuZWQgTk9fTUFUQ0guXG4gICAgICAodGhpcyBjb3VsZCBiZSBiZWNhdXNlIGEgY2FsbGJhY2sgcmVxdWVzdHMgdGhlIG1hdGNoIGJlIGlnbm9yZWQsIGV0YylcblxuICAgICAgVGhpcyBjYXVzZXMgbm8gcmVhbCBoYXJtIG90aGVyIHRoYW4gc3RvcHBpbmcgYSBmZXcgdGltZXMgdG9vIG1hbnkuXG4gICAgICAqL1xuXG4gICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgIHJldHVybiBsZXhlbWUubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobGFuZ3VhZ2VOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBlcnJvcihMQU5HVUFHRV9OT1RfRk9VTkQucmVwbGFjZShcInt9XCIsIGxhbmd1YWdlTmFtZSkpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlOiBcIicgKyBsYW5ndWFnZU5hbWUgKyAnXCInKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZCA9IGNvbXBpbGVMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIC8qKiBAdHlwZSB7Q29tcGlsZWRNb2RlfSAqL1xuICAgIGxldCB0b3AgPSBjb250aW51YXRpb24gfHwgbWQ7XG4gICAgLyoqIEB0eXBlIFJlY29yZDxzdHJpbmcsQ29tcGlsZWRNb2RlPiAqL1xuICAgIGNvbnN0IGNvbnRpbnVhdGlvbnMgPSB7fTsgLy8ga2VlcCBjb250aW51YXRpb25zIGZvciBzdWItbGFuZ3VhZ2VzXG4gICAgY29uc3QgZW1pdHRlciA9IG5ldyBvcHRpb25zLl9fZW1pdHRlcihvcHRpb25zKTtcbiAgICBwcm9jZXNzQ29udGludWF0aW9ucygpO1xuICAgIGxldCBtb2RlQnVmZmVyID0gJyc7XG4gICAgbGV0IHJlbGV2YW5jZSA9IDA7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgaXRlcmF0aW9ucyA9IDA7XG4gICAgbGV0IHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRvcC5tYXRjaGVyLmNvbnNpZGVyQWxsKCk7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICBpZiAocmVzdW1lU2NhbkF0U2FtZVBvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gb25seSByZWdleGVzIG5vdCBtYXRjaGVkIHByZXZpb3VzbHkgd2lsbCBub3cgYmVcbiAgICAgICAgICAvLyBjb25zaWRlcmVkIGZvciBhIHBvdGVudGlhbCBtYXRjaFxuICAgICAgICAgIHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvcC5tYXRjaGVyLmNvbnNpZGVyQWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgdG9wLm1hdGNoZXIubGFzdEluZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0b3AubWF0Y2hlci5leGVjKGNvZGVUb0hpZ2hsaWdodCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwibWF0Y2hcIiwgbWF0Y2hbMF0sIG1hdGNoLnJ1bGUgJiYgbWF0Y2gucnVsZS5iZWdpbilcblxuICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcblxuICAgICAgICBjb25zdCBiZWZvcmVNYXRjaCA9IGNvZGVUb0hpZ2hsaWdodC5zdWJzdHJpbmcoaW5kZXgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkQ291bnQgPSBwcm9jZXNzTGV4ZW1lKGJlZm9yZU1hdGNoLCBtYXRjaCk7XG4gICAgICAgIGluZGV4ID0gbWF0Y2guaW5kZXggKyBwcm9jZXNzZWRDb3VudDtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3NMZXhlbWUoY29kZVRvSGlnaGxpZ2h0LnN1YnN0cmluZyhpbmRleCkpO1xuICAgICAgZW1pdHRlci5jbG9zZUFsbE5vZGVzKCk7XG4gICAgICBlbWl0dGVyLmZpbmFsaXplKCk7XG4gICAgICByZXN1bHQgPSBlbWl0dGVyLnRvSFRNTCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VOYW1lLFxuICAgICAgICB2YWx1ZTogcmVzdWx0LFxuICAgICAgICByZWxldmFuY2U6IHJlbGV2YW5jZSxcbiAgICAgICAgaWxsZWdhbDogZmFsc2UsXG4gICAgICAgIF9lbWl0dGVyOiBlbWl0dGVyLFxuICAgICAgICBfdG9wOiB0b3BcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ0lsbGVnYWwnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZU5hbWUsXG4gICAgICAgICAgdmFsdWU6IGVzY2FwZShjb2RlVG9IaWdobGlnaHQpLFxuICAgICAgICAgIGlsbGVnYWw6IHRydWUsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIF9pbGxlZ2FsQnk6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgY29udGV4dDogY29kZVRvSGlnaGxpZ2h0LnNsaWNlKGluZGV4IC0gMTAwLCBpbmRleCArIDEwMCksXG4gICAgICAgICAgICBtb2RlOiBlcnIubW9kZSxcbiAgICAgICAgICAgIHJlc3VsdFNvRmFyOiByZXN1bHRcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9lbWl0dGVyOiBlbWl0dGVyXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKFNBRkVfTU9ERSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZU5hbWUsXG4gICAgICAgICAgdmFsdWU6IGVzY2FwZShjb2RlVG9IaWdobGlnaHQpLFxuICAgICAgICAgIGlsbGVnYWw6IGZhbHNlLFxuICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICBlcnJvclJhaXNlZDogZXJyLFxuICAgICAgICAgIF9lbWl0dGVyOiBlbWl0dGVyLFxuICAgICAgICAgIF90b3A6IHRvcFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgdmFsaWQgaGlnaGxpZ2h0IHJlc3VsdCwgd2l0aG91dCBhY3R1YWxseSBkb2luZyBhbnkgYWN0dWFsIHdvcmssXG4gICAqIGF1dG8gaGlnaGxpZ2h0IHN0YXJ0cyB3aXRoIHRoaXMgYW5kIGl0J3MgcG9zc2libGUgZm9yIHNtYWxsIHNuaXBwZXRzIHRoYXRcbiAgICogYXV0by1kZXRlY3Rpb24gbWF5IG5vdCBmaW5kIGEgYmV0dGVyIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqIEByZXR1cm5zIHtIaWdobGlnaHRSZXN1bHR9XG4gICAqL1xuICBmdW5jdGlvbiBqdXN0VGV4dEhpZ2hsaWdodFJlc3VsdChjb2RlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgdmFsdWU6IGVzY2FwZShjb2RlKSxcbiAgICAgIGlsbGVnYWw6IGZhbHNlLFxuICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgX3RvcDogUExBSU5URVhUX0xBTkdVQUdFLFxuICAgICAgX2VtaXR0ZXI6IG5ldyBvcHRpb25zLl9fZW1pdHRlcihvcHRpb25zKVxuICAgIH07XG4gICAgcmVzdWx0Ll9lbWl0dGVyLmFkZFRleHQoY29kZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICBIaWdobGlnaHRpbmcgd2l0aCBsYW5ndWFnZSBkZXRlY3Rpb24uIEFjY2VwdHMgYSBzdHJpbmcgd2l0aCB0aGUgY29kZSB0b1xuICBoaWdobGlnaHQuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuXG4gIC0gbGFuZ3VhZ2UgKGRldGVjdGVkIGxhbmd1YWdlKVxuICAtIHJlbGV2YW5jZSAoaW50KVxuICAtIHZhbHVlIChhbiBIVE1MIHN0cmluZyB3aXRoIGhpZ2hsaWdodGluZyBtYXJrdXApXG4gIC0gc2Vjb25kQmVzdCAob2JqZWN0IHdpdGggdGhlIHNhbWUgc3RydWN0dXJlIGZvciBzZWNvbmQtYmVzdCBoZXVyaXN0aWNhbGx5XG4gICAgZGV0ZWN0ZWQgbGFuZ3VhZ2UsIG1heSBiZSBhYnNlbnQpXG5cbiAgICBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2xhbmd1YWdlU3Vic2V0XVxuICAgIEByZXR1cm5zIHtBdXRvSGlnaGxpZ2h0UmVzdWx0fVxuICAqL1xuICBmdW5jdGlvbiBoaWdobGlnaHRBdXRvKGNvZGUsIGxhbmd1YWdlU3Vic2V0KSB7XG4gICAgbGFuZ3VhZ2VTdWJzZXQgPSBsYW5ndWFnZVN1YnNldCB8fCBvcHRpb25zLmxhbmd1YWdlcyB8fCBPYmplY3Qua2V5cyhsYW5ndWFnZXMpO1xuICAgIGNvbnN0IHBsYWludGV4dCA9IGp1c3RUZXh0SGlnaGxpZ2h0UmVzdWx0KGNvZGUpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGxhbmd1YWdlU3Vic2V0LmZpbHRlcihnZXRMYW5ndWFnZSkuZmlsdGVyKGF1dG9EZXRlY3Rpb24pLm1hcChuYW1lID0+XG4gICAgICBfaGlnaGxpZ2h0KG5hbWUsIGNvZGUsIGZhbHNlKVxuICAgICk7XG4gICAgcmVzdWx0cy51bnNoaWZ0KHBsYWludGV4dCk7IC8vIHBsYWludGV4dCBpcyBhbHdheXMgYW4gb3B0aW9uXG5cbiAgICBjb25zdCBzb3J0ZWQgPSByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIHNvcnQgYmFzZSBvbiByZWxldmFuY2VcbiAgICAgIGlmIChhLnJlbGV2YW5jZSAhPT0gYi5yZWxldmFuY2UpIHJldHVybiBiLnJlbGV2YW5jZSAtIGEucmVsZXZhbmNlO1xuXG4gICAgICAvLyBhbHdheXMgYXdhcmQgdGhlIHRpZSB0byB0aGUgYmFzZSBsYW5ndWFnZVxuICAgICAgLy8gaWUgaWYgQysrIGFuZCBBcmR1aW5vIGFyZSB0aWVkLCBpdCdzIG1vcmUgbGlrZWx5IHRvIGJlIEMrK1xuICAgICAgaWYgKGEubGFuZ3VhZ2UgJiYgYi5sYW5ndWFnZSkge1xuICAgICAgICBpZiAoZ2V0TGFuZ3VhZ2UoYS5sYW5ndWFnZSkuc3VwZXJzZXRPZiA9PT0gYi5sYW5ndWFnZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGdldExhbmd1YWdlKGIubGFuZ3VhZ2UpLnN1cGVyc2V0T2YgPT09IGEubGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb3RoZXJ3aXNlIHNheSB0aGV5IGFyZSBlcXVhbCwgd2hpY2ggaGFzIHRoZSBlZmZlY3Qgb2Ygc29ydGluZyBvblxuICAgICAgLy8gcmVsZXZhbmNlIHdoaWxlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIG9yZGVyaW5nIC0gd2hpY2ggaXMgaG93IHRpZXNcbiAgICAgIC8vIGhhdmUgaGlzdG9yaWNhbGx5IGJlZW4gc2V0dGxlZCwgaWUgdGhlIGxhbmd1YWdlIHRoYXQgY29tZXMgZmlyc3QgYWx3YXlzXG4gICAgICAvLyB3aW5zIGluIHRoZSBjYXNlIG9mIGEgdGllXG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIGNvbnN0IFtiZXN0LCBzZWNvbmRCZXN0XSA9IHNvcnRlZDtcblxuICAgIC8qKiBAdHlwZSB7QXV0b0hpZ2hsaWdodFJlc3VsdH0gKi9cbiAgICBjb25zdCByZXN1bHQgPSBiZXN0O1xuICAgIHJlc3VsdC5zZWNvbmRCZXN0ID0gc2Vjb25kQmVzdDtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIG5ldyBjbGFzcyBuYW1lIGZvciBibG9jayBnaXZlbiB0aGUgbGFuZ3VhZ2UgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudExhbmddXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVzdWx0TGFuZ11cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZUNsYXNzTmFtZShlbGVtZW50LCBjdXJyZW50TGFuZywgcmVzdWx0TGFuZykge1xuICAgIGNvbnN0IGxhbmd1YWdlID0gKGN1cnJlbnRMYW5nICYmIGFsaWFzZXNbY3VycmVudExhbmddKSB8fCByZXN1bHRMYW5nO1xuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGxqc1wiKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYGxhbmd1YWdlLSR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBoaWdobGlnaHRpbmcgdG8gYSBET00gbm9kZSBjb250YWluaW5nIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7SGlnaGxpZ2h0ZWRIVE1MRWxlbWVudH0gZWxlbWVudCAtIHRoZSBIVE1MIGVsZW1lbnQgdG8gaGlnaGxpZ2h0XG4gICovXG4gIGZ1bmN0aW9uIGhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCkge1xuICAgIC8qKiBAdHlwZSBIVE1MRWxlbWVudCAqL1xuICAgIGxldCBub2RlID0gbnVsbDtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGJsb2NrTGFuZ3VhZ2UoZWxlbWVudCk7XG5cbiAgICBpZiAoc2hvdWxkTm90SGlnaGxpZ2h0KGxhbmd1YWdlKSkgcmV0dXJuO1xuXG4gICAgZmlyZShcImJlZm9yZTpoaWdobGlnaHRFbGVtZW50XCIsXG4gICAgICB7IGVsOiBlbGVtZW50LCBsYW5ndWFnZTogbGFuZ3VhZ2UgfSk7XG5cbiAgICAvLyB3ZSBzaG91bGQgYmUgYWxsIHRleHQsIG5vIGNoaWxkIG5vZGVzICh1bmVzY2FwZWQgSFRNTCkgLSB0aGlzIGlzIHBvc3NpYmx5XG4gICAgLy8gYW4gSFRNTCBpbmplY3Rpb24gYXR0YWNrIC0gaXQncyBsaWtlbHkgdG9vIGxhdGUgaWYgdGhpcyBpcyBhbHJlYWR5IGluXG4gICAgLy8gcHJvZHVjdGlvbiAodGhlIGNvZGUgaGFzIGxpa2VseSBhbHJlYWR5IGRvbmUgaXRzIGRhbWFnZSBieSB0aGUgdGltZVxuICAgIC8vIHdlJ3JlIHNlZWluZyBpdCkuLi4gYnV0IHdlIHllbGwgbG91ZGx5IGFib3V0IHRoaXMgc28gdGhhdCBob3BlZnVsbHkgaXQnc1xuICAgIC8vIG1vcmUgbGlrZWx5IHRvIGJlIGNhdWdodCBpbiBkZXZlbG9wbWVudCBiZWZvcmUgbWFraW5nIGl0IHRvIHByb2R1Y3Rpb25cbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlVW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJPbmUgb2YgeW91ciBjb2RlIGJsb2NrcyBpbmNsdWRlcyB1bmVzY2FwZWQgSFRNTC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgc2VjdXJpdHkgcmlzay5cIik7XG4gICAgICAgIGNvbnNvbGUud2FybihcImh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvd2lraS9zZWN1cml0eVwiKTtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgd2l0aCB1bmVzY2FwZWQgSFRNTDpcIik7XG4gICAgICAgIGNvbnNvbGUud2FybihlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnRocm93VW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgSFRNTEluamVjdGlvbkVycm9yKFxuICAgICAgICAgIFwiT25lIG9mIHlvdXIgY29kZSBibG9ja3MgaW5jbHVkZXMgdW5lc2NhcGVkIEhUTUwuXCIsXG4gICAgICAgICAgZWxlbWVudC5pbm5lckhUTUxcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBlbGVtZW50O1xuICAgIGNvbnN0IHRleHQgPSBub2RlLnRleHRDb250ZW50O1xuICAgIGNvbnN0IHJlc3VsdCA9IGxhbmd1YWdlID8gaGlnaGxpZ2h0KHRleHQsIHsgbGFuZ3VhZ2UsIGlnbm9yZUlsbGVnYWxzOiB0cnVlIH0pIDogaGlnaGxpZ2h0QXV0byh0ZXh0KTtcblxuICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gcmVzdWx0LnZhbHVlO1xuICAgIHVwZGF0ZUNsYXNzTmFtZShlbGVtZW50LCBsYW5ndWFnZSwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICBlbGVtZW50LnJlc3VsdCA9IHtcbiAgICAgIGxhbmd1YWdlOiByZXN1bHQubGFuZ3VhZ2UsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2ZXJzaW9uIDExLjBcbiAgICAgIHJlOiByZXN1bHQucmVsZXZhbmNlLFxuICAgICAgcmVsZXZhbmNlOiByZXN1bHQucmVsZXZhbmNlXG4gICAgfTtcbiAgICBpZiAocmVzdWx0LnNlY29uZEJlc3QpIHtcbiAgICAgIGVsZW1lbnQuc2Vjb25kQmVzdCA9IHtcbiAgICAgICAgbGFuZ3VhZ2U6IHJlc3VsdC5zZWNvbmRCZXN0Lmxhbmd1YWdlLFxuICAgICAgICByZWxldmFuY2U6IHJlc3VsdC5zZWNvbmRCZXN0LnJlbGV2YW5jZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmaXJlKFwiYWZ0ZXI6aGlnaGxpZ2h0RWxlbWVudFwiLCB7IGVsOiBlbGVtZW50LCByZXN1bHQsIHRleHQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBoaWdobGlnaHQuanMgZ2xvYmFsIG9wdGlvbnMgd2l0aCB0aGUgcGFzc2VkIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEhMSlNPcHRpb25zPn0gdXNlck9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIGNvbmZpZ3VyZSh1c2VyT3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBpbmhlcml0KG9wdGlvbnMsIHVzZXJPcHRpb25zKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSB2MTIsIGRlcHJlY2F0ZWRcbiAgY29uc3QgaW5pdEhpZ2hsaWdodGluZyA9ICgpID0+IHtcbiAgICBoaWdobGlnaHRBbGwoKTtcbiAgICBkZXByZWNhdGVkKFwiMTAuNi4wXCIsIFwiaW5pdEhpZ2hsaWdodGluZygpIGRlcHJlY2F0ZWQuICBVc2UgaGlnaGxpZ2h0QWxsKCkgbm93LlwiKTtcbiAgfTtcblxuICAvLyBUT0RPOiByZW1vdmUgdjEyLCBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIGluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSB7XG4gICAgaGlnaGxpZ2h0QWxsKCk7XG4gICAgZGVwcmVjYXRlZChcIjEwLjYuMFwiLCBcImluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy5cIik7XG4gIH1cblxuICBsZXQgd2FudHNIaWdobGlnaHQgPSBmYWxzZTtcblxuICAvKipcbiAgICogYXV0by1oaWdobGlnaHRzIGFsbCBwcmU+Y29kZSBlbGVtZW50cyBvbiB0aGUgcGFnZVxuICAgKi9cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QWxsKCkge1xuICAgIC8vIGlmIHdlIGFyZSBjYWxsZWQgdG9vIGVhcmx5IGluIHRoZSBsb2FkaW5nIHByb2Nlc3NcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgIHdhbnRzSGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBibG9ja3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG9wdGlvbnMuY3NzU2VsZWN0b3IpO1xuICAgIGJsb2Nrcy5mb3JFYWNoKGhpZ2hsaWdodEVsZW1lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYm9vdCgpIHtcbiAgICAvLyBpZiBhIGhpZ2hsaWdodCB3YXMgcmVxdWVzdGVkIGJlZm9yZSBET00gd2FzIGxvYWRlZCwgZG8gbm93XG4gICAgaWYgKHdhbnRzSGlnaGxpZ2h0KSBoaWdobGlnaHRBbGwoKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBib290LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsYW5ndWFnZSBncmFtbWFyIG1vZHVsZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VOYW1lXG4gICAqIEBwYXJhbSB7TGFuZ3VhZ2VGbn0gbGFuZ3VhZ2VEZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3Rlckxhbmd1YWdlKGxhbmd1YWdlTmFtZSwgbGFuZ3VhZ2VEZWZpbml0aW9uKSB7XG4gICAgbGV0IGxhbmcgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBsYW5nID0gbGFuZ3VhZ2VEZWZpbml0aW9uKGhsanMpO1xuICAgIH0gY2F0Y2ggKGVycm9yJDEpIHtcbiAgICAgIGVycm9yKFwiTGFuZ3VhZ2UgZGVmaW5pdGlvbiBmb3IgJ3t9JyBjb3VsZCBub3QgYmUgcmVnaXN0ZXJlZC5cIi5yZXBsYWNlKFwie31cIiwgbGFuZ3VhZ2VOYW1lKSk7XG4gICAgICAvLyBoYXJkIG9yIHNvZnQgZXJyb3JcbiAgICAgIGlmICghU0FGRV9NT0RFKSB7IHRocm93IGVycm9yJDE7IH0gZWxzZSB7IGVycm9yKGVycm9yJDEpOyB9XG4gICAgICAvLyBsYW5ndWFnZXMgdGhhdCBoYXZlIHNlcmlvdXMgZXJyb3JzIGFyZSByZXBsYWNlZCB3aXRoIGVzc2VudGlhbGx5IGFcbiAgICAgIC8vIFwicGxhaW50ZXh0XCIgc3RhbmQtaW4gc28gdGhhdCB0aGUgY29kZSBibG9ja3Mgd2lsbCBzdGlsbCBnZXQgbm9ybWFsXG4gICAgICAvLyBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIHRoZW0gLSBhbmQgb25lIGJhZCBsYW5ndWFnZSB3b24ndCBicmVhayB0aGVcbiAgICAgIC8vIGVudGlyZSBoaWdobGlnaHRlclxuICAgICAgbGFuZyA9IFBMQUlOVEVYVF9MQU5HVUFHRTtcbiAgICB9XG4gICAgLy8gZ2l2ZSBpdCBhIHRlbXBvcmFyeSBuYW1lIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgaW4gdGhlIG1ldGEtZGF0YVxuICAgIGlmICghbGFuZy5uYW1lKSBsYW5nLm5hbWUgPSBsYW5ndWFnZU5hbWU7XG4gICAgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV0gPSBsYW5nO1xuICAgIGxhbmcucmF3RGVmaW5pdGlvbiA9IGxhbmd1YWdlRGVmaW5pdGlvbi5iaW5kKG51bGwsIGhsanMpO1xuXG4gICAgaWYgKGxhbmcuYWxpYXNlcykge1xuICAgICAgcmVnaXN0ZXJBbGlhc2VzKGxhbmcuYWxpYXNlcywgeyBsYW5ndWFnZU5hbWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxhbmd1YWdlIGdyYW1tYXIgbW9kdWxlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZU5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHVucmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZU5hbWUpIHtcbiAgICBkZWxldGUgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV07XG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBPYmplY3Qua2V5cyhhbGlhc2VzKSkge1xuICAgICAgaWYgKGFsaWFzZXNbYWxpYXNdID09PSBsYW5ndWFnZU5hbWUpIHtcbiAgICAgICAgZGVsZXRlIGFsaWFzZXNbYWxpYXNdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3Qgb2YgbGFuZ3VhZ2UgaW50ZXJuYWwgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGxpc3RMYW5ndWFnZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBuYW1lIG9mIHRoZSBsYW5ndWFnZSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7TGFuZ3VhZ2UgfCB1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRMYW5ndWFnZShuYW1lKSB7XG4gICAgbmFtZSA9IChuYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBsYW5ndWFnZXNbbmFtZV0gfHwgbGFuZ3VhZ2VzW2FsaWFzZXNbbmFtZV1dO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhbGlhc0xpc3QgLSBzaW5nbGUgYWxpYXMgb3IgbGlzdCBvZiBhbGlhc2VzXG4gICAqIEBwYXJhbSB7e2xhbmd1YWdlTmFtZTogc3RyaW5nfX0gb3B0c1xuICAgKi9cbiAgZnVuY3Rpb24gcmVnaXN0ZXJBbGlhc2VzKGFsaWFzTGlzdCwgeyBsYW5ndWFnZU5hbWUgfSkge1xuICAgIGlmICh0eXBlb2YgYWxpYXNMaXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgYWxpYXNMaXN0ID0gW2FsaWFzTGlzdF07XG4gICAgfVxuICAgIGFsaWFzTGlzdC5mb3JFYWNoKGFsaWFzID0+IHsgYWxpYXNlc1thbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGxhbmd1YWdlTmFtZTsgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGxhbmd1YWdlIGhhcyBhdXRvLWRldGVjdGlvbiBlbmFibGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gbmFtZSBvZiB0aGUgbGFuZ3VhZ2VcbiAgICovXG4gIGZ1bmN0aW9uIGF1dG9EZXRlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGxhbmcgPSBnZXRMYW5ndWFnZShuYW1lKTtcbiAgICByZXR1cm4gbGFuZyAmJiAhbGFuZy5kaXNhYmxlQXV0b2RldGVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGdyYWRlcyB0aGUgb2xkIGhpZ2hsaWdodEJsb2NrIHBsdWdpbnMgdG8gdGhlIG5ld1xuICAgKiBoaWdobGlnaHRFbGVtZW50IEFQSVxuICAgKiBAcGFyYW0ge0hMSlNQbHVnaW59IHBsdWdpblxuICAgKi9cbiAgZnVuY3Rpb24gdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pIHtcbiAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2MTJcbiAgICBpZiAocGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEJsb2NrXCJdICYmICFwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0RWxlbWVudFwiXSkge1xuICAgICAgcGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0QmxvY2tcIl0oXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih7IGJsb2NrOiBkYXRhLmVsIH0sIGRhdGEpXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocGx1Z2luW1wiYWZ0ZXI6aGlnaGxpZ2h0QmxvY2tcIl0gJiYgIXBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0pIHtcbiAgICAgIHBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJhZnRlcjpoaWdobGlnaHRCbG9ja1wiXShcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHsgYmxvY2s6IGRhdGEuZWwgfSwgZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SExKU1BsdWdpbn0gcGx1Z2luXG4gICAqL1xuICBmdW5jdGlvbiBhZGRQbHVnaW4ocGx1Z2luKSB7XG4gICAgdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pO1xuICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7UGx1Z2luRXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7YW55fSBhcmdzXG4gICAqL1xuICBmdW5jdGlvbiBmaXJlKGV2ZW50LCBhcmdzKSB7XG4gICAgY29uc3QgY2IgPSBldmVudDtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICBpZiAocGx1Z2luW2NiXSkge1xuICAgICAgICBwbHVnaW5bY2JdKGFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERFUFJFQ0FURURcbiAgICogQHBhcmFtIHtIaWdobGlnaHRlZEhUTUxFbGVtZW50fSBlbFxuICAgKi9cbiAgZnVuY3Rpb24gZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2soZWwpIHtcbiAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wXCIpO1xuICAgIGRlcHJlY2F0ZWQoXCIxMC43LjBcIiwgXCJQbGVhc2UgdXNlIGhpZ2hsaWdodEVsZW1lbnQgbm93LlwiKTtcblxuICAgIHJldHVybiBoaWdobGlnaHRFbGVtZW50KGVsKTtcbiAgfVxuXG4gIC8qIEludGVyZmFjZSBkZWZpbml0aW9uICovXG4gIE9iamVjdC5hc3NpZ24oaGxqcywge1xuICAgIGhpZ2hsaWdodCxcbiAgICBoaWdobGlnaHRBdXRvLFxuICAgIGhpZ2hsaWdodEFsbCxcbiAgICBoaWdobGlnaHRFbGVtZW50LFxuICAgIC8vIFRPRE86IFJlbW92ZSB3aXRoIHYxMiBBUElcbiAgICBoaWdobGlnaHRCbG9jazogZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2ssXG4gICAgY29uZmlndXJlLFxuICAgIGluaXRIaWdobGlnaHRpbmcsXG4gICAgaW5pdEhpZ2hsaWdodGluZ09uTG9hZCxcbiAgICByZWdpc3Rlckxhbmd1YWdlLFxuICAgIHVucmVnaXN0ZXJMYW5ndWFnZSxcbiAgICBsaXN0TGFuZ3VhZ2VzLFxuICAgIGdldExhbmd1YWdlLFxuICAgIHJlZ2lzdGVyQWxpYXNlcyxcbiAgICBhdXRvRGV0ZWN0aW9uLFxuICAgIGluaGVyaXQsXG4gICAgYWRkUGx1Z2luXG4gIH0pO1xuXG4gIGhsanMuZGVidWdNb2RlID0gZnVuY3Rpb24oKSB7IFNBRkVfTU9ERSA9IGZhbHNlOyB9O1xuICBobGpzLnNhZmVNb2RlID0gZnVuY3Rpb24oKSB7IFNBRkVfTU9ERSA9IHRydWU7IH07XG4gIGhsanMudmVyc2lvblN0cmluZyA9IHZlcnNpb247XG5cbiAgaGxqcy5yZWdleCA9IHtcbiAgICBjb25jYXQ6IGNvbmNhdCxcbiAgICBsb29rYWhlYWQ6IGxvb2thaGVhZCxcbiAgICBlaXRoZXI6IGVpdGhlcixcbiAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgYW55TnVtYmVyT2ZUaW1lczogYW55TnVtYmVyT2ZUaW1lc1xuICB9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIE1PREVTKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgTU9ERVNba2V5XSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZGVlcEZyZWV6ZUVzNi5leHBvcnRzKE1PREVTW2tleV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1lcmdlIGFsbCB0aGUgbW9kZXMvcmVnZXhlcyBpbnRvIG91ciBtYWluIG9iamVjdFxuICBPYmplY3QuYXNzaWduKGhsanMsIE1PREVTKTtcblxuICByZXR1cm4gaGxqcztcbn07XG5cbi8vIGV4cG9ydCBhbiBcImluc3RhbmNlXCIgb2YgdGhlIGhpZ2hsaWdodGVyXG52YXIgaGlnaGxpZ2h0ID0gSExKUyh7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gaGlnaGxpZ2h0O1xuaGlnaGxpZ2h0LkhpZ2hsaWdodEpTID0gaGlnaGxpZ2h0O1xuaGlnaGxpZ2h0LmRlZmF1bHQgPSBoaWdobGlnaHQ7XG4iLCAiaW1wb3J0IHsgZmluZENoaWxkcmVuIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgTm9kZSBhcyBQcm9zZW1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCB9IGZyb20gJ0B0aXB0YXAvcG0vdmlldydcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBoaWdobGlnaHQgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9jb3JlJ1xuXG5mdW5jdGlvbiBwYXJzZU5vZGVzKG5vZGVzOiBhbnlbXSwgY2xhc3NOYW1lOiBzdHJpbmdbXSA9IFtdKTogeyB0ZXh0OiBzdHJpbmc7IGNsYXNzZXM6IHN0cmluZ1tdIH1bXSB7XG4gIHJldHVybiBub2Rlc1xuICAgIC5tYXAobm9kZSA9PiB7XG4gICAgICBjb25zdCBjbGFzc2VzID0gWy4uLmNsYXNzTmFtZSwgLi4uKG5vZGUucHJvcGVydGllcyA/IG5vZGUucHJvcGVydGllcy5jbGFzc05hbWUgOiBbXSldXG5cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBwYXJzZU5vZGVzKG5vZGUuY2hpbGRyZW4sIGNsYXNzZXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQ6IG5vZGUudmFsdWUsXG4gICAgICAgIGNsYXNzZXMsXG4gICAgICB9XG4gICAgfSlcbiAgICAuZmxhdCgpXG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodE5vZGVzKHJlc3VsdDogYW55KSB7XG4gIC8vIGAudmFsdWVgIGZvciBsb3dsaWdodCB2MSwgYC5jaGlsZHJlbmAgZm9yIGxvd2xpZ2h0IHYyXG4gIHJldHVybiByZXN1bHQudmFsdWUgfHwgcmVzdWx0LmNoaWxkcmVuIHx8IFtdXG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyZWQoYWxpYXNPckxhbmd1YWdlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEJvb2xlYW4oaGlnaGxpZ2h0LmdldExhbmd1YWdlKGFsaWFzT3JMYW5ndWFnZSkpXG59XG5cbmZ1bmN0aW9uIGdldERlY29yYXRpb25zKHtcbiAgZG9jLFxuICBuYW1lLFxuICBsb3dsaWdodCxcbiAgZGVmYXVsdExhbmd1YWdlLFxufToge1xuICBkb2M6IFByb3NlbWlycm9yTm9kZVxuICBuYW1lOiBzdHJpbmdcbiAgbG93bGlnaHQ6IGFueVxuICBkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbn0pIHtcbiAgY29uc3QgZGVjb3JhdGlvbnM6IERlY29yYXRpb25bXSA9IFtdXG5cbiAgZmluZENoaWxkcmVuKGRvYywgbm9kZSA9PiBub2RlLnR5cGUubmFtZSA9PT0gbmFtZSkuZm9yRWFjaChibG9jayA9PiB7XG4gICAgbGV0IGZyb20gPSBibG9jay5wb3MgKyAxXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBibG9jay5ub2RlLmF0dHJzLmxhbmd1YWdlIHx8IGRlZmF1bHRMYW5ndWFnZVxuICAgIGNvbnN0IGxhbmd1YWdlcyA9IGxvd2xpZ2h0Lmxpc3RMYW5ndWFnZXMoKVxuXG4gICAgY29uc3Qgbm9kZXMgPSBsYW5ndWFnZSAmJiAobGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSB8fCByZWdpc3RlcmVkKGxhbmd1YWdlKSlcbiAgICAgID8gZ2V0SGlnaGxpZ2h0Tm9kZXMobG93bGlnaHQuaGlnaGxpZ2h0KGxhbmd1YWdlLCBibG9jay5ub2RlLnRleHRDb250ZW50KSlcbiAgICAgIDogZ2V0SGlnaGxpZ2h0Tm9kZXMobG93bGlnaHQuaGlnaGxpZ2h0QXV0byhibG9jay5ub2RlLnRleHRDb250ZW50KSlcblxuICAgIHBhcnNlTm9kZXMobm9kZXMpLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBjb25zdCB0byA9IGZyb20gKyBub2RlLnRleHQubGVuZ3RoXG5cbiAgICAgIGlmIChub2RlLmNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRpb24gPSBEZWNvcmF0aW9uLmlubGluZShmcm9tLCB0bywge1xuICAgICAgICAgIGNsYXNzOiBub2RlLmNsYXNzZXMuam9pbignICcpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGRlY29yYXRpb25zLnB1c2goZGVjb3JhdGlvbilcbiAgICAgIH1cblxuICAgICAgZnJvbSA9IHRvXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucylcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihwYXJhbTogRnVuY3Rpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTG93bGlnaHRQbHVnaW4oe1xuICBuYW1lLFxuICBsb3dsaWdodCxcbiAgZGVmYXVsdExhbmd1YWdlLFxufToge1xuICBuYW1lOiBzdHJpbmdcbiAgbG93bGlnaHQ6IGFueVxuICBkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbn0pIHtcbiAgaWYgKCFbJ2hpZ2hsaWdodCcsICdoaWdobGlnaHRBdXRvJywgJ2xpc3RMYW5ndWFnZXMnXS5ldmVyeShhcGkgPT4gaXNGdW5jdGlvbihsb3dsaWdodFthcGldKSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICdZb3Ugc2hvdWxkIHByb3ZpZGUgYW4gaW5zdGFuY2Ugb2YgbG93bGlnaHQgdG8gdXNlIHRoZSBjb2RlLWJsb2NrLWxvd2xpZ2h0IGV4dGVuc2lvbicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbG93bGlnaHRQbHVnaW46IFBsdWdpbjxhbnk+ID0gbmV3IFBsdWdpbih7XG4gICAga2V5OiBuZXcgUGx1Z2luS2V5KCdsb3dsaWdodCcpLFxuXG4gICAgc3RhdGU6IHtcbiAgICAgIGluaXQ6IChfLCB7IGRvYyB9KSA9PiBnZXREZWNvcmF0aW9ucyh7XG4gICAgICAgIGRvYyxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbG93bGlnaHQsXG4gICAgICAgIGRlZmF1bHRMYW5ndWFnZSxcbiAgICAgIH0pLFxuICAgICAgYXBwbHk6ICh0cmFuc2FjdGlvbiwgZGVjb3JhdGlvblNldCwgb2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZE5vZGVOYW1lID0gb2xkU3RhdGUuc2VsZWN0aW9uLiRoZWFkLnBhcmVudC50eXBlLm5hbWVcbiAgICAgICAgY29uc3QgbmV3Tm9kZU5hbWUgPSBuZXdTdGF0ZS5zZWxlY3Rpb24uJGhlYWQucGFyZW50LnR5cGUubmFtZVxuICAgICAgICBjb25zdCBvbGROb2RlcyA9IGZpbmRDaGlsZHJlbihvbGRTdGF0ZS5kb2MsIG5vZGUgPT4gbm9kZS50eXBlLm5hbWUgPT09IG5hbWUpXG4gICAgICAgIGNvbnN0IG5ld05vZGVzID0gZmluZENoaWxkcmVuKG5ld1N0YXRlLmRvYywgbm9kZSA9PiBub2RlLnR5cGUubmFtZSA9PT0gbmFtZSlcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHJhbnNhY3Rpb24uZG9jQ2hhbmdlZFxuICAgICAgICAgIC8vIEFwcGx5IGRlY29yYXRpb25zIGlmOlxuICAgICAgICAgIC8vIHNlbGVjdGlvbiBpbmNsdWRlcyBuYW1lZCBub2RlLFxuICAgICAgICAgICYmIChbb2xkTm9kZU5hbWUsIG5ld05vZGVOYW1lXS5pbmNsdWRlcyhuYW1lKVxuICAgICAgICAgICAgLy8gT1IgdHJhbnNhY3Rpb24gYWRkcy9yZW1vdmVzIG5hbWVkIG5vZGUsXG4gICAgICAgICAgICB8fCBuZXdOb2Rlcy5sZW5ndGggIT09IG9sZE5vZGVzLmxlbmd0aFxuICAgICAgICAgICAgLy8gT1IgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZXMgdGhhdCBjb21wbGV0ZWx5IGVuY2Fwc3VsdGUgYSBub2RlXG4gICAgICAgICAgICAvLyAoZm9yIGV4YW1wbGUsIGEgdHJhbnNhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBlbnRpcmUgZG9jdW1lbnQpLlxuICAgICAgICAgICAgLy8gU3VjaCB0cmFuc2FjdGlvbnMgY2FuIGhhcHBlbiBkdXJpbmcgY29sbGFiIHN5bmNpbmcgdmlhIHktcHJvc2VtaXJyb3IsIGZvciBleGFtcGxlLlxuICAgICAgICAgICAgfHwgdHJhbnNhY3Rpb24uc3RlcHMuc29tZShzdGVwID0+IHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBzdGVwLmZyb20gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAmJiBzdGVwLnRvICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAmJiBvbGROb2Rlcy5zb21lKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBub2RlLnBvcyA+PSBzdGVwLmZyb21cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAmJiBub2RlLnBvcyArIG5vZGUubm9kZS5ub2RlU2l6ZSA8PSBzdGVwLnRvXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBnZXREZWNvcmF0aW9ucyh7XG4gICAgICAgICAgICBkb2M6IHRyYW5zYWN0aW9uLmRvYyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBsb3dsaWdodCxcbiAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlY29yYXRpb25TZXQubWFwKHRyYW5zYWN0aW9uLm1hcHBpbmcsIHRyYW5zYWN0aW9uLmRvYylcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHByb3BzOiB7XG4gICAgICBkZWNvcmF0aW9ucyhzdGF0ZSkge1xuICAgICAgICByZXR1cm4gbG93bGlnaHRQbHVnaW4uZ2V0U3RhdGUoc3RhdGUpXG4gICAgICB9LFxuICAgIH0sXG4gIH0pXG5cbiAgcmV0dXJuIGxvd2xpZ2h0UGx1Z2luXG59XG4iLCAiaW1wb3J0IENvZGVCbG9jaywgeyBDb2RlQmxvY2tPcHRpb25zIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jaydcblxuaW1wb3J0IHsgTG93bGlnaHRQbHVnaW4gfSBmcm9tICcuL2xvd2xpZ2h0LXBsdWdpbi5qcydcblxuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tMb3dsaWdodE9wdGlvbnMgZXh0ZW5kcyBDb2RlQmxvY2tPcHRpb25zIHtcbiAgbG93bGlnaHQ6IGFueSxcbiAgZGVmYXVsdExhbmd1YWdlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxufVxuXG5leHBvcnQgY29uc3QgQ29kZUJsb2NrTG93bGlnaHQgPSBDb2RlQmxvY2suZXh0ZW5kPENvZGVCbG9ja0xvd2xpZ2h0T3B0aW9ucz4oe1xuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnBhcmVudD8uKCksXG4gICAgICBsb3dsaWdodDoge30sXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U6IG51bGwsXG4gICAgfVxuICB9LFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5wYXJlbnQ/LigpIHx8IFtdLFxuICAgICAgTG93bGlnaHRQbHVnaW4oe1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGxvd2xpZ2h0OiB0aGlzLm9wdGlvbnMubG93bGlnaHQsXG4gICAgICAgIGRlZmF1bHRMYW5ndWFnZTogdGhpcy5vcHRpb25zLmRlZmF1bHRMYW5ndWFnZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IENvZGVCbG9ja0xvd2xpZ2h0IGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1jb2RlLWJsb2NrLWxvd2xpZ2h0XCI7XG5cbmV4cG9ydCBjb25zdCBDdXN0b21Db2RlQmxvY2tMb3dsaWdodCA9IENvZGVCbG9ja0xvd2xpZ2h0LmV4dGVuZCh7XG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnBhcmVudD8uKCksXG4gICAgICBBcnJvd0Rvd246ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmVkaXRvci5zdGF0ZTtcbiAgICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuXG4gICAgICAgIGlmIChmcm9tID4gMSAmJiBmcm9tID09PSB0bykge1xuICAgICAgICAgIGxldCBpbkNvZGVCbG9jayA9IGZhbHNlO1xuICAgICAgICAgIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSAtIDEsIHRvIC0gMSwgKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUubmFtZSA9PT0gXCJjb2RlQmxvY2tcIikgaW5Db2RlQmxvY2sgPSB0cnVlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbGV0IG5vdGhpbmdPblJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20gKyAxLCB0byArIDEsIChub2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZSkgbm90aGluZ09uUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChpbkNvZGVCbG9jayAmJiBub3RoaW5nT25SaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldEhhcmRCcmVhaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7Tm9kZSwgbWVyZ2VBdHRyaWJ1dGVzfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5cbmV4cG9ydCBjb25zdCBIdXJkbGUgPSBOb2RlLmNyZWF0ZSh7XG4gICAgbmFtZTogXCJodXJkbGVcIixcbiAgICBncm91cDogXCJibG9ja1wiLFxuICAgIGNvbnRlbnQ6IFwiYmxvY2srXCIsXG4gICAgYWRkT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbG9yczogWydncmF5X2xpZ2h0JywgJ2dyYXknLCAnZ3JheV9kYXJrJywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5JywgJ3RlcnRpYXJ5JywgJ2FjY2VudCddLFxuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtaHVyZGxlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgYWRkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJ2dyYXknLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb2xvcicpLFxuICAgICAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtY29sb3InOiBhdHRyaWJ1dGVzLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgICAgICAgICBnZXRBdHRyczogKGVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmlsYW1lbnQtdGlwdGFwLWh1cmRsZVwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfSxcbiAgICByZW5kZXJIVE1MKHtub2RlLCBIVE1MQXR0cmlidXRlc30pIHtcbiAgICAgICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICAgIH0sXG4gICAgYWRkQ29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXRIdXJkbGU6IGF0dHJpYnV0ZXMgPT4gKHtjb21tYW5kc30pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb2xvcnMuaW5jbHVkZXMoYXR0cmlidXRlcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVXcmFwKHRoaXMubmFtZSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59KTtcbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBjb25zdCBDdXN0b21UZXh0QWxpZ24gPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgICBuYW1lOiAndGV4dEFsaWduJyxcblxuICAgIGFkZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlczogW10sXG4gICAgICAgICAgICBhbGlnbm1lbnRzOiBbJ3N0YXJ0JywgJ2NlbnRlcicsICdlbmQnLCAnanVzdGlmeSddLFxuICAgICAgICAgICAgZGVmYXVsdEFsaWdubWVudDogJ3N0YXJ0JyxcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRHbG9iYWxBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGVzOiB0aGlzLm9wdGlvbnMudHlwZXMsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy5kZWZhdWx0QWxpZ25tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuc3R5bGUudGV4dEFsaWduIHx8IHRoaXMub3B0aW9ucy5kZWZhdWx0QWxpZ25tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMudGV4dEFsaWduID09PSB0aGlzLm9wdGlvbnMuZGVmYXVsdEFsaWdubWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdHlsZTogYHRleHQtYWxpZ246ICR7YXR0cmlidXRlcy50ZXh0QWxpZ259YCB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfSxcblxuICAgIGFkZENvbW1hbmRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0VGV4dEFsaWduOiAoYWxpZ25tZW50KSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxpZ25tZW50cy5pbmNsdWRlcyhhbGlnbm1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudHlwZXMuZXZlcnkodHlwZSA9PiBjb21tYW5kcy51cGRhdGVBdHRyaWJ1dGVzKHR5cGUsIHsgdGV4dEFsaWduOiBhbGlnbm1lbnQgfSkpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1bnNldFRleHRBbGlnbjogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudHlwZXMuZXZlcnkodHlwZSA9PiBjb21tYW5kcy5yZXNldEF0dHJpYnV0ZXModHlwZSwgJ3RleHRBbGlnbicpKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdNb2QtU2hpZnQtbCc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldFRleHRBbGlnbignc3RhcnQnKSxcbiAgICAgICAgICAgICdNb2QtU2hpZnQtZSc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldFRleHRBbGlnbignY2VudGVyJyksXG4gICAgICAgICAgICAnTW9kLVNoaWZ0LXInOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zZXRUZXh0QWxpZ24oJ2VuZCcpLFxuICAgICAgICAgICAgJ01vZC1TaGlmdC1qJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuc2V0VGV4dEFsaWduKCdqdXN0aWZ5JyksXG4gICAgICAgIH1cbiAgICB9LFxufSlcbiIsICJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsICJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwgImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCAiaW1wb3J0IGdldFVBU3RyaW5nIGZyb20gXCIuLi91dGlscy91c2VyQWdlbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTGF5b3V0Vmlld3BvcnQoKSB7XG4gIHJldHVybiAhL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChnZXRVQVN0cmluZygpKTtcbn0iLCAiaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGluY2x1ZGVTY2FsZSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgc2NhbGVYID0gZWxlbWVudC5vZmZzZXRXaWR0aCA+IDAgPyByb3VuZChjbGllbnRSZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMSA6IDE7XG4gICAgc2NhbGVZID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgPiAwID8gcm91bmQoY2xpZW50UmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMSA6IDE7XG4gIH1cblxuICB2YXIgX3JlZiA9IGlzRWxlbWVudChlbGVtZW50KSA/IGdldFdpbmRvdyhlbGVtZW50KSA6IHdpbmRvdyxcbiAgICAgIHZpc3VhbFZpZXdwb3J0ID0gX3JlZi52aXN1YWxWaWV3cG9ydDtcblxuICB2YXIgYWRkVmlzdWFsT2Zmc2V0cyA9ICFpc0xheW91dFZpZXdwb3J0KCkgJiYgaXNGaXhlZFN0cmF0ZWd5O1xuICB2YXIgeCA9IChjbGllbnRSZWN0LmxlZnQgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQgOiAwKSkgLyBzY2FsZVg7XG4gIHZhciB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3AgOiAwKSkgLyBzY2FsZVk7XG4gIHZhciB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIHZhciBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlWTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIGxlZnQ6IHgsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkge1xuICB2YXIgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSAmJiBjaGlsZC5nZXRSb290Tm9kZSgpOyAvLyBGaXJzdCwgYXR0ZW1wdCB3aXRoIGZhc3RlciBuYXRpdmUgbWV0aG9kXG5cbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyB0aGVuIGZhbGxiYWNrIHRvIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aXRoIFNoYWRvdyBET00gc3VwcG9ydFxuICBlbHNlIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgICB2YXIgbmV4dCA9IGNoaWxkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChuZXh0ICYmIHBhcmVudC5pc1NhbWVOb2RlKG5leHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddOiBuZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4uLlxuXG5cbiAgICAgICAgbmV4dCA9IG5leHQucGFyZW50Tm9kZSB8fCBuZXh0Lmhvc3Q7XG4gICAgICB9IHdoaWxlIChuZXh0KTtcbiAgICB9IC8vIEdpdmUgdXAsIHRoZSByZXN1bHQgaXMgZmFsc2VcblxuXG4gIHJldHVybiBmYWxzZTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwgImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwgImltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSB7XG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgcmV0dXJuICgoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudC5vd25lckRvY3VtZW50IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gIGVsZW1lbnQuZG9jdW1lbnQpIHx8IHdpbmRvdy5kb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50O1xufSIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgPj0gMCA/ICd4JyA6ICd5Jztcbn0iLCAiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwgImltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4vZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZVBhZGRpbmdPYmplY3QocGFkZGluZ09iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCksIHBhZGRpbmdPYmplY3QpO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZiwgd2luKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIGdldFdpbmRvdyhwb3BwZXIpKSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjQueDtcbiAgeSA9IF9yZWY0Lnk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjUpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjUub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCAidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwgInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIHZhciBsYXlvdXRWaWV3cG9ydCA9IGlzTGF5b3V0Vmlld3BvcnQoKTtcblxuICAgIGlmIChsYXlvdXRWaWV3cG9ydCB8fCAhbGF5b3V0Vmlld3BvcnQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gRmlyZWZveCB3YW50cyB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbFxuICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyxcbiAgICAgIG92ZXJmbG93WCA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WCxcbiAgICAgIG92ZXJmbG93WSA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WTtcblxuICByZXR1cm4gL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVuLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKTtcbn0iLCAiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCAiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCAiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgZmFsc2UsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KSB7XG4gIHZhciBtYWluQ2xpcHBpbmdQYXJlbnRzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ1BhcmVudHMnID8gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IFtdLmNvbmNhdChtYWluQ2xpcHBpbmdQYXJlbnRzLCBbcm9vdEJvdW5kYXJ5XSk7XG4gIHZhciBmaXJzdENsaXBwaW5nUGFyZW50ID0gY2xpcHBpbmdQYXJlbnRzWzBdO1xuICB2YXIgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCAiaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkc3RyYXRlZ3kgPSBfb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHN0cmF0ZWd5ID0gX29wdGlvbnMkc3RyYXRlZ3kgPT09IHZvaWQgMCA/IHN0YXRlLnN0cmF0ZWd5IDogX29wdGlvbnMkc3RyYXRlZ3ksXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QsIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIFx1MjAxMyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsICJpbXBvcnQgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QsIHByZXZlbnRlZE9mZnNldHMpIHtcbiAgaWYgKHByZXZlbnRlZE9mZnNldHMgPT09IHZvaWQgMCkge1xuICAgIHByZXZlbnRlZE9mZnNldHMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQgLSBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCArIHByZXZlbnRlZE9mZnNldHMueCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0ICsgcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoIC0gcHJldmVudGVkT2Zmc2V0cy54XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0uc29tZShmdW5jdGlvbiAoc2lkZSkge1xuICAgIHJldHVybiBvdmVyZmxvd1tzaWRlXSA+PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGlkZShfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBwcmV2ZW50ZWRPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3c7XG4gIHZhciByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gIH0pO1xuICB2YXIgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gIH0pO1xuICB2YXIgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocmVmZXJlbmNlT3ZlcmZsb3csIHJlZmVyZW5jZVJlY3QpO1xuICB2YXIgcG9wcGVyRXNjYXBlT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHBvcHBlckFsdE92ZXJmbG93LCBwb3BwZXJSZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKTtcbiAgdmFyIGlzUmVmZXJlbmNlSGlkZGVuID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyk7XG4gIHZhciBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0ge1xuICAgIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czogcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHM6IHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW46IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgIGhhc1BvcHBlckVzY2FwZWQ6IGhhc1BvcHBlckVzY2FwZWRcbiAgfTtcbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59OyIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsICJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QWx0QXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59IiwgImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59IiwgImltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRIVE1MRWxlbWVudFNjcm9sbCBmcm9tIFwiLi9nZXRIVE1MRWxlbWVudFNjcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZVNjcm9sbChub2RlKSB7XG4gIGlmIChub2RlID09PSBnZXRXaW5kb3cobm9kZSkgfHwgIWlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsKG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRIVE1MRWxlbWVudFNjcm9sbChub2RlKTtcbiAgfVxufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSBcIi4vZ2V0Tm9kZVNjcm9sbC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQsIGlzRml4ZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIFx1MjAxMyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUgXHUyMDEzIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZi5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCAiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG5pbXBvcnQgb2Zmc2V0IGZyb20gXCIuL21vZGlmaWVycy9vZmZzZXQuanNcIjtcbmltcG9ydCBmbGlwIGZyb20gXCIuL21vZGlmaWVycy9mbGlwLmpzXCI7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gXCIuL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBhcnJvdyBmcm9tIFwiLi9tb2RpZmllcnMvYXJyb3cuanNcIjtcbmltcG9ydCBoaWRlIGZyb20gXCIuL21vZGlmaWVycy9oaWRlLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvdywgaGlkZV07XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsiLCAiZXhwb3J0IGNvbnN0IFJPVU5EX0FSUk9XID1cbiAgJzxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0wIDZzMS43OTYtLjAxMyA0LjY3LTMuNjE1QzUuODUxLjkgNi45My4wMDYgOCAwYzEuMDctLjAwNiAyLjE0OC44ODcgMy4zNDMgMi4zODVDMTQuMjMzIDYuMDA1IDE2IDYgMTYgNkgwelwiPjwvc3ZnPic7XG5cbmV4cG9ydCBjb25zdCBCT1hfQ0xBU1MgPSBgX19OQU1FU1BBQ0VfUFJFRklYX18tYm94YDtcbmV4cG9ydCBjb25zdCBDT05URU5UX0NMQVNTID0gYF9fTkFNRVNQQUNFX1BSRUZJWF9fLWNvbnRlbnRgO1xuZXhwb3J0IGNvbnN0IEJBQ0tEUk9QX0NMQVNTID0gYF9fTkFNRVNQQUNFX1BSRUZJWF9fLWJhY2tkcm9wYDtcbmV4cG9ydCBjb25zdCBBUlJPV19DTEFTUyA9IGBfX05BTUVTUEFDRV9QUkVGSVhfXy1hcnJvd2A7XG5leHBvcnQgY29uc3QgU1ZHX0FSUk9XX0NMQVNTID0gYF9fTkFNRVNQQUNFX1BSRUZJWF9fLXN2Zy1hcnJvd2A7XG5cbmV4cG9ydCBjb25zdCBUT1VDSF9PUFRJT05TID0ge3Bhc3NpdmU6IHRydWUsIGNhcHR1cmU6IHRydWV9O1xuXG5leHBvcnQgY29uc3QgVElQUFlfREVGQVVMVF9BUFBFTkRfVE8gPSAoKSA9PiBkb2N1bWVudC5ib2R5O1xuIiwgImltcG9ydCB7QmFzZVBsYWNlbWVudCwgUGxhY2VtZW50fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBrZXk6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIHJldHVybiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQXRJbmRleE9yUmV0dXJuPFQ+KFxuICB2YWx1ZTogVCB8IFtUIHwgbnVsbCwgVCB8IG51bGxdLFxuICBpbmRleDogbnVtYmVyLFxuICBkZWZhdWx0VmFsdWU6IFQgfCBbVCwgVF1cbik6IFQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCB2ID0gdmFsdWVbaW5kZXhdO1xuICAgIHJldHVybiB2ID09IG51bGxcbiAgICAgID8gQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpXG4gICAgICAgID8gZGVmYXVsdFZhbHVlW2luZGV4XVxuICAgICAgICA6IGRlZmF1bHRWYWx1ZVxuICAgICAgOiB2O1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlKHZhbHVlOiBhbnksIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzdHIgPSB7fS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgcmV0dXJuIHN0ci5pbmRleE9mKCdbb2JqZWN0JykgPT09IDAgJiYgc3RyLmluZGV4T2YoYCR7dHlwZX1dYCkgPiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVdpdGhBcmdzT3JSZXR1cm4odmFsdWU6IGFueSwgYXJnczogYW55W10pOiBhbnkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUoLi4uYXJncykgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlPFQ+KFxuICBmbjogKGFyZzogVCkgPT4gdm9pZCxcbiAgbXM6IG51bWJlclxuKTogKGFyZzogVCkgPT4gdm9pZCB7XG4gIC8vIEF2b2lkIHdyYXBwaW5nIGluIGBzZXRUaW1lb3V0YCBpZiBtcyBpcyAwIGFueXdheVxuICBpZiAobXMgPT09IDApIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBsZXQgdGltZW91dDogYW55O1xuXG4gIHJldHVybiAoYXJnKTogdm9pZCA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZuKGFyZyk7XG4gICAgfSwgbXMpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydGllczxUPihvYmo6IFQsIGtleXM6IHN0cmluZ1tdKTogUGFydGlhbDxUPiB7XG4gIGNvbnN0IGNsb25lID0gey4uLm9ian07XG4gIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgZGVsZXRlIChjbG9uZSBhcyBhbnkpW2tleV07XG4gIH0pO1xuICByZXR1cm4gY2xvbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5U3BhY2VzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRvQXJyYXk8VD4odmFsdWU6IFQgfCBUW10pOiBUW10ge1xuICByZXR1cm4gKFtdIGFzIFRbXSkuY29uY2F0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hJZlVuaXF1ZTxUPihhcnI6IFRbXSwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgaWYgKGFyci5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBhcnIucHVzaCh2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFB4SWZOdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gYCR7dmFsdWV9cHhgIDogdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oYXJyOiBUW10pOiBUW10ge1xuICByZXR1cm4gYXJyLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IGFyci5pbmRleE9mKGl0ZW0pID09PSBpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50OiBQbGFjZW1lbnQpOiBCYXNlUGxhY2VtZW50IHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdIGFzIEJhc2VQbGFjZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUZyb20odmFsdWU6IEFycmF5TGlrZTxhbnk+KTogYW55W10ge1xuICByZXR1cm4gW10uc2xpY2UuY2FsbCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVVbmRlZmluZWRQcm9wcyhcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgaWYgKG9ialtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIChhY2MgYXMgYW55KVtrZXldID0gb2JqW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuIiwgImltcG9ydCB7UmVmZXJlbmNlRWxlbWVudCwgVGFyZ2V0c30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1BvcHBlclRyZWVEYXRhfSBmcm9tICcuL3R5cGVzLWludGVybmFsJztcbmltcG9ydCB7YXJyYXlGcm9tLCBpc1R5cGUsIG5vcm1hbGl6ZVRvQXJyYXksIGdldEJhc2VQbGFjZW1lbnR9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2KCk6IEhUTUxEaXZFbGVtZW50IHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICByZXR1cm4gWydFbGVtZW50JywgJ0ZyYWdtZW50J10uc29tZSgodHlwZSkgPT4gaXNUeXBlKHZhbHVlLCB0eXBlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVMaXN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTm9kZUxpc3Qge1xuICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnTm9kZUxpc3QnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW91c2VFdmVudCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE1vdXNlRXZlbnQge1xuICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnTW91c2VFdmVudCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZlcmVuY2VFbGVtZW50KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWZlcmVuY2VFbGVtZW50IHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl90aXBweSAmJiB2YWx1ZS5fdGlwcHkucmVmZXJlbmNlID09PSB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcnJheU9mRWxlbWVudHModmFsdWU6IFRhcmdldHMpOiBFbGVtZW50W10ge1xuICBpZiAoaXNFbGVtZW50KHZhbHVlKSkge1xuICAgIHJldHVybiBbdmFsdWVdO1xuICB9XG5cbiAgaWYgKGlzTm9kZUxpc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGFycmF5RnJvbSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gYXJyYXlGcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRyYW5zaXRpb25EdXJhdGlvbihcbiAgZWxzOiAoSFRNTERpdkVsZW1lbnQgfCBudWxsKVtdLFxuICB2YWx1ZTogbnVtYmVyXG4pOiB2b2lkIHtcbiAgZWxzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHt2YWx1ZX1tc2A7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFZpc2liaWxpdHlTdGF0ZShcbiAgZWxzOiAoSFRNTERpdkVsZW1lbnQgfCBudWxsKVtdLFxuICBzdGF0ZTogJ3Zpc2libGUnIHwgJ2hpZGRlbidcbik6IHZvaWQge1xuICBlbHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScsIHN0YXRlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudChcbiAgZWxlbWVudE9yRWxlbWVudHM6IEVsZW1lbnQgfCBFbGVtZW50W11cbik6IERvY3VtZW50IHtcbiAgY29uc3QgW2VsZW1lbnRdID0gbm9ybWFsaXplVG9BcnJheShlbGVtZW50T3JFbGVtZW50cyk7XG5cbiAgLy8gRWxlbWVudHMgY3JlYXRlZCB2aWEgYSA8dGVtcGxhdGU+IGhhdmUgYW4gb3duZXJEb2N1bWVudCB3aXRoIG5vIHJlZmVyZW5jZSB0byB0aGUgYm9keVxuICByZXR1cm4gZWxlbWVudD8ub3duZXJEb2N1bWVudD8uYm9keSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IGRvY3VtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDdXJzb3JPdXRzaWRlSW50ZXJhY3RpdmVCb3JkZXIoXG4gIHBvcHBlclRyZWVEYXRhOiBQb3BwZXJUcmVlRGF0YVtdLFxuICBldmVudDogTW91c2VFdmVudFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtjbGllbnRYLCBjbGllbnRZfSA9IGV2ZW50O1xuXG4gIHJldHVybiBwb3BwZXJUcmVlRGF0YS5ldmVyeSgoe3BvcHBlclJlY3QsIHBvcHBlclN0YXRlLCBwcm9wc30pID0+IHtcbiAgICBjb25zdCB7aW50ZXJhY3RpdmVCb3JkZXJ9ID0gcHJvcHM7XG4gICAgY29uc3QgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocG9wcGVyU3RhdGUucGxhY2VtZW50KTtcbiAgICBjb25zdCBvZmZzZXREYXRhID0gcG9wcGVyU3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7XG5cbiAgICBpZiAoIW9mZnNldERhdGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcERpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ2JvdHRvbScgPyBvZmZzZXREYXRhLnRvcCEueSA6IDA7XG4gICAgY29uc3QgYm90dG9tRGlzdGFuY2UgPSBiYXNlUGxhY2VtZW50ID09PSAndG9wJyA/IG9mZnNldERhdGEuYm90dG9tIS55IDogMDtcbiAgICBjb25zdCBsZWZ0RGlzdGFuY2UgPSBiYXNlUGxhY2VtZW50ID09PSAncmlnaHQnID8gb2Zmc2V0RGF0YS5sZWZ0IS54IDogMDtcbiAgICBjb25zdCByaWdodERpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnID8gb2Zmc2V0RGF0YS5yaWdodCEueCA6IDA7XG5cbiAgICBjb25zdCBleGNlZWRzVG9wID1cbiAgICAgIHBvcHBlclJlY3QudG9wIC0gY2xpZW50WSArIHRvcERpc3RhbmNlID4gaW50ZXJhY3RpdmVCb3JkZXI7XG4gICAgY29uc3QgZXhjZWVkc0JvdHRvbSA9XG4gICAgICBjbGllbnRZIC0gcG9wcGVyUmVjdC5ib3R0b20gLSBib3R0b21EaXN0YW5jZSA+IGludGVyYWN0aXZlQm9yZGVyO1xuICAgIGNvbnN0IGV4Y2VlZHNMZWZ0ID1cbiAgICAgIHBvcHBlclJlY3QubGVmdCAtIGNsaWVudFggKyBsZWZ0RGlzdGFuY2UgPiBpbnRlcmFjdGl2ZUJvcmRlcjtcbiAgICBjb25zdCBleGNlZWRzUmlnaHQgPVxuICAgICAgY2xpZW50WCAtIHBvcHBlclJlY3QucmlnaHQgLSByaWdodERpc3RhbmNlID4gaW50ZXJhY3RpdmVCb3JkZXI7XG5cbiAgICByZXR1cm4gZXhjZWVkc1RvcCB8fCBleGNlZWRzQm90dG9tIHx8IGV4Y2VlZHNMZWZ0IHx8IGV4Y2VlZHNSaWdodDtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uRW5kTGlzdGVuZXIoXG4gIGJveDogSFRNTERpdkVsZW1lbnQsXG4gIGFjdGlvbjogJ2FkZCcgfCAncmVtb3ZlJyxcbiAgbGlzdGVuZXI6IChldmVudDogVHJhbnNpdGlvbkV2ZW50KSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3QgbWV0aG9kID0gYCR7YWN0aW9ufUV2ZW50TGlzdGVuZXJgIGFzXG4gICAgfCAnYWRkRXZlbnRMaXN0ZW5lcidcbiAgICB8ICdyZW1vdmVFdmVudExpc3RlbmVyJztcblxuICAvLyBzb21lIGJyb3dzZXJzIGFwcGFyZW50bHkgc3VwcG9ydCBgdHJhbnNpdGlvbmAgKHVucHJlZml4ZWQpIGJ1dCBvbmx5IGZpcmVcbiAgLy8gYHdlYmtpdFRyYW5zaXRpb25FbmRgLi4uXG4gIFsndHJhbnNpdGlvbmVuZCcsICd3ZWJraXRUcmFuc2l0aW9uRW5kJ10uZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICBib3hbbWV0aG9kXShldmVudCwgbGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcik7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmVkIHRvIHh4eC5jb250YWlucywgdGhpcyBmdW5jdGlvbiB3b3JrcyBmb3IgZG9tIHN0cnVjdHVyZXMgd2l0aCBzaGFkb3dcbiAqIGRvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0dWFsQ29udGFpbnMocGFyZW50OiBFbGVtZW50LCBjaGlsZDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICBsZXQgdGFyZ2V0ID0gY2hpbGQ7XG4gIHdoaWxlICh0YXJnZXQpIHtcbiAgICBpZiAocGFyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0YXJnZXQgPSAodGFyZ2V0LmdldFJvb3ROb2RlPy4oKSBhcyBhbnkpPy5ob3N0O1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQge1RPVUNIX09QVElPTlN9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7aXNSZWZlcmVuY2VFbGVtZW50fSBmcm9tICcuL2RvbS11dGlscyc7XG5cbmV4cG9ydCBjb25zdCBjdXJyZW50SW5wdXQgPSB7aXNUb3VjaDogZmFsc2V9O1xubGV0IGxhc3RNb3VzZU1vdmVUaW1lID0gMDtcblxuLyoqXG4gKiBXaGVuIGEgYHRvdWNoc3RhcnRgIGV2ZW50IGlzIGZpcmVkLCBpdCdzIGFzc3VtZWQgdGhlIHVzZXIgaXMgdXNpbmcgdG91Y2hcbiAqIGlucHV0LiBXZSdsbCBiaW5kIGEgYG1vdXNlbW92ZWAgZXZlbnQgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBtb3VzZSBpbnB1dCBpblxuICogdGhlIGZ1dHVyZS4gVGhpcyB3YXksIHRoZSBgaXNUb3VjaGAgcHJvcGVydHkgaXMgZnVsbHkgZHluYW1pYyBhbmQgd2lsbCBoYW5kbGVcbiAqIGh5YnJpZCBkZXZpY2VzIHRoYXQgdXNlIGEgbWl4IG9mIHRvdWNoICsgbW91c2UgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRvY3VtZW50VG91Y2hTdGFydCgpOiB2b2lkIHtcbiAgaWYgKGN1cnJlbnRJbnB1dC5pc1RvdWNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY3VycmVudElucHV0LmlzVG91Y2ggPSB0cnVlO1xuXG4gIGlmICh3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbkRvY3VtZW50TW91c2VNb3ZlKTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZW4gdHdvIGBtb3VzZW1vdmVgIGV2ZW50IGFyZSBmaXJlZCBjb25zZWN1dGl2ZWx5IHdpdGhpbiAyMG1zLCBpdCdzIGFzc3VtZWRcbiAqIHRoZSB1c2VyIGlzIHVzaW5nIG1vdXNlIGlucHV0IGFnYWluLiBgbW91c2Vtb3ZlYCBjYW4gZmlyZSBvbiB0b3VjaCBkZXZpY2VzIGFzXG4gKiB3ZWxsLCBidXQgdmVyeSByYXJlbHkgdGhhdCBxdWlja2x5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25Eb2N1bWVudE1vdXNlTW92ZSgpOiB2b2lkIHtcbiAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgaWYgKG5vdyAtIGxhc3RNb3VzZU1vdmVUaW1lIDwgMjApIHtcbiAgICBjdXJyZW50SW5wdXQuaXNUb3VjaCA9IGZhbHNlO1xuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Eb2N1bWVudE1vdXNlTW92ZSk7XG4gIH1cblxuICBsYXN0TW91c2VNb3ZlVGltZSA9IG5vdztcbn1cblxuLyoqXG4gKiBXaGVuIGFuIGVsZW1lbnQgaXMgaW4gZm9jdXMgYW5kIGhhcyBhIHRpcHB5LCBsZWF2aW5nIHRoZSB0YWIvd2luZG93IGFuZFxuICogcmV0dXJuaW5nIGNhdXNlcyBpdCB0byBzaG93IGFnYWluLiBGb3IgbW91c2UgdXNlcnMgdGhpcyBpcyB1bmV4cGVjdGVkLCBidXRcbiAqIGZvciBrZXlib2FyZCB1c2UgaXQgbWFrZXMgc2Vuc2UuXG4gKiBUT0RPOiBmaW5kIGEgYmV0dGVyIHRlY2huaXF1ZSB0byBzb2x2ZSB0aGlzIHByb2JsZW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uV2luZG93Qmx1cigpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIGlmIChpc1JlZmVyZW5jZUVsZW1lbnQoYWN0aXZlRWxlbWVudCkpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGFjdGl2ZUVsZW1lbnQuX3RpcHB5ITtcblxuICAgIGlmIChhY3RpdmVFbGVtZW50LmJsdXIgJiYgIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmRHbG9iYWxFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uRG9jdW1lbnRUb3VjaFN0YXJ0LCBUT1VDSF9PUFRJT05TKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbldpbmRvd0JsdXIpO1xufVxuIiwgImV4cG9ydCBjb25zdCBpc0Jyb3dzZXIgPVxuICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgY29uc3QgaXNJRTExID0gaXNCcm93c2VyXG4gID8gLy8gQHRzLWlnbm9yZVxuICAgICEhd2luZG93Lm1zQ3J5cHRvXG4gIDogZmFsc2U7XG4iLCAiaW1wb3J0IHtUYXJnZXRzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKG1ldGhvZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHh0ID0gbWV0aG9kID09PSAnZGVzdHJveScgPyAnbiBhbHJlYWR5LScgOiAnICc7XG5cbiAgcmV0dXJuIFtcbiAgICBgJHttZXRob2R9KCkgd2FzIGNhbGxlZCBvbiBhJHt0eHR9ZGVzdHJveWVkIGluc3RhbmNlLiBUaGlzIGlzIGEgbm8tb3AgYnV0YCxcbiAgICAnaW5kaWNhdGVzIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrLicsXG4gIF0uam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNwYWNlc0FuZFRhYnMgPSAvWyBcXHRdezIsfS9nO1xuICBjb25zdCBsaW5lU3RhcnRXaXRoU3BhY2VzID0gL15bIFxcdF0qL2dtO1xuXG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKHNwYWNlc0FuZFRhYnMsICcgJylcbiAgICAucmVwbGFjZShsaW5lU3RhcnRXaXRoU3BhY2VzLCAnJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXREZXZNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjbGVhbihgXG4gICVjdGlwcHkuanNcblxuICAlYyR7Y2xlYW4obWVzc2FnZSl9XG5cbiAgJWPwn5G34oCNIFRoaXMgaXMgYSBkZXZlbG9wbWVudC1vbmx5IG1lc3NhZ2UuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBwcm9kdWN0aW9uLlxuICBgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGdldERldk1lc3NhZ2UobWVzc2FnZSksXG4gICAgLy8gdGl0bGVcbiAgICAnY29sb3I6ICMwMEM1ODQ7IGZvbnQtc2l6ZTogMS4zZW07IGZvbnQtd2VpZ2h0OiBib2xkOycsXG4gICAgLy8gbWVzc2FnZVxuICAgICdsaW5lLWhlaWdodDogMS41JyxcbiAgICAvLyBmb290ZXJcbiAgICAnY29sb3I6ICNhNmEwOTU7JyxcbiAgXTtcbn1cblxuLy8gQXNzdW1lIHdhcm5pbmdzIGFuZCBlcnJvcnMgbmV2ZXIgaGF2ZSB0aGUgc2FtZSBtZXNzYWdlXG5sZXQgdmlzaXRlZE1lc3NhZ2VzOiBTZXQ8c3RyaW5nPjtcbmlmIChfX0RFVl9fKSB7XG4gIHJlc2V0VmlzaXRlZE1lc3NhZ2VzKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFZpc2l0ZWRNZXNzYWdlcygpOiB2b2lkIHtcbiAgdmlzaXRlZE1lc3NhZ2VzID0gbmV3IFNldCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2FybldoZW4oY29uZGl0aW9uOiBib29sZWFuLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGNvbmRpdGlvbiAmJiAhdmlzaXRlZE1lc3NhZ2VzLmhhcyhtZXNzYWdlKSkge1xuICAgIHZpc2l0ZWRNZXNzYWdlcy5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS53YXJuKC4uLmdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcldoZW4oY29uZGl0aW9uOiBib29sZWFuLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGNvbmRpdGlvbiAmJiAhdmlzaXRlZE1lc3NhZ2VzLmhhcyhtZXNzYWdlKSkge1xuICAgIHZpc2l0ZWRNZXNzYWdlcy5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvciguLi5nZXRGb3JtYXR0ZWRNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRzKHRhcmdldHM6IFRhcmdldHMpOiB2b2lkIHtcbiAgY29uc3QgZGlkUGFzc0ZhbHN5VmFsdWUgPSAhdGFyZ2V0cztcbiAgY29uc3QgZGlkUGFzc1BsYWluT2JqZWN0ID1cbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGFyZ2V0cykgPT09ICdbb2JqZWN0IE9iamVjdF0nICYmXG4gICAgISh0YXJnZXRzIGFzIGFueSkuYWRkRXZlbnRMaXN0ZW5lcjtcblxuICBlcnJvcldoZW4oXG4gICAgZGlkUGFzc0ZhbHN5VmFsdWUsXG4gICAgW1xuICAgICAgJ3RpcHB5KCkgd2FzIHBhc3NlZCcsXG4gICAgICAnYCcgKyBTdHJpbmcodGFyZ2V0cykgKyAnYCcsXG4gICAgICAnYXMgaXRzIHRhcmdldHMgKGZpcnN0KSBhcmd1bWVudC4gVmFsaWQgdHlwZXMgYXJlOiBTdHJpbmcsIEVsZW1lbnQsJyxcbiAgICAgICdFbGVtZW50W10sIG9yIE5vZGVMaXN0LicsXG4gICAgXS5qb2luKCcgJylcbiAgKTtcblxuICBlcnJvcldoZW4oXG4gICAgZGlkUGFzc1BsYWluT2JqZWN0LFxuICAgIFtcbiAgICAgICd0aXBweSgpIHdhcyBwYXNzZWQgYSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBhcyBhbiBhcmd1bWVudCcsXG4gICAgICAnZm9yIHZpcnR1YWwgcG9zaXRpb25pbmcuIFVzZSBwcm9wcy5nZXRSZWZlcmVuY2VDbGllbnRSZWN0IGluc3RlYWQuJyxcbiAgICBdLmpvaW4oJyAnKVxuICApO1xufVxuIiwgImltcG9ydCB7RGVmYXVsdFByb3BzLCBQbHVnaW4sIFByb3BzLCBSZWZlcmVuY2VFbGVtZW50LCBUaXBweX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBoYXNPd25Qcm9wZXJ0eSxcbiAgcmVtb3ZlUHJvcGVydGllcyxcbiAgaW52b2tlV2l0aEFyZ3NPclJldHVybixcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3dhcm5XaGVufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHtUSVBQWV9ERUZBVUxUX0FQUEVORF9UT30gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5jb25zdCBwbHVnaW5Qcm9wcyA9IHtcbiAgYW5pbWF0ZUZpbGw6IGZhbHNlLFxuICBmb2xsb3dDdXJzb3I6IGZhbHNlLFxuICBpbmxpbmVQb3NpdGlvbmluZzogZmFsc2UsXG4gIHN0aWNreTogZmFsc2UsXG59O1xuXG5jb25zdCByZW5kZXJQcm9wcyA9IHtcbiAgYWxsb3dIVE1MOiBmYWxzZSxcbiAgYW5pbWF0aW9uOiAnZmFkZScsXG4gIGFycm93OiB0cnVlLFxuICBjb250ZW50OiAnJyxcbiAgaW5lcnRpYTogZmFsc2UsXG4gIG1heFdpZHRoOiAzNTAsXG4gIHJvbGU6ICd0b29sdGlwJyxcbiAgdGhlbWU6ICcnLFxuICB6SW5kZXg6IDk5OTksXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHMgPSB7XG4gIGFwcGVuZFRvOiBUSVBQWV9ERUZBVUxUX0FQUEVORF9UTyxcbiAgYXJpYToge1xuICAgIGNvbnRlbnQ6ICdhdXRvJyxcbiAgICBleHBhbmRlZDogJ2F1dG8nLFxuICB9LFxuICBkZWxheTogMCxcbiAgZHVyYXRpb246IFszMDAsIDI1MF0sXG4gIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IG51bGwsXG4gIGhpZGVPbkNsaWNrOiB0cnVlLFxuICBpZ25vcmVBdHRyaWJ1dGVzOiBmYWxzZSxcbiAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICBpbnRlcmFjdGl2ZUJvcmRlcjogMixcbiAgaW50ZXJhY3RpdmVEZWJvdW5jZTogMCxcbiAgbW92ZVRyYW5zaXRpb246ICcnLFxuICBvZmZzZXQ6IFswLCAxMF0sXG4gIG9uQWZ0ZXJVcGRhdGUoKSB7fSxcbiAgb25CZWZvcmVVcGRhdGUoKSB7fSxcbiAgb25DcmVhdGUoKSB7fSxcbiAgb25EZXN0cm95KCkge30sXG4gIG9uSGlkZGVuKCkge30sXG4gIG9uSGlkZSgpIHt9LFxuICBvbk1vdW50KCkge30sXG4gIG9uU2hvdygpIHt9LFxuICBvblNob3duKCkge30sXG4gIG9uVHJpZ2dlcigpIHt9LFxuICBvblVudHJpZ2dlcigpIHt9LFxuICBvbkNsaWNrT3V0c2lkZSgpIHt9LFxuICBwbGFjZW1lbnQ6ICd0b3AnLFxuICBwbHVnaW5zOiBbXSxcbiAgcG9wcGVyT3B0aW9uczoge30sXG4gIHJlbmRlcjogbnVsbCxcbiAgc2hvd09uQ3JlYXRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHRyaWdnZXI6ICdtb3VzZWVudGVyIGZvY3VzJyxcbiAgdHJpZ2dlclRhcmdldDogbnVsbCxcbiAgLi4ucGx1Z2luUHJvcHMsXG4gIC4uLnJlbmRlclByb3BzLFxufTtcblxuY29uc3QgZGVmYXVsdEtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0UHJvcHMpO1xuXG5leHBvcnQgY29uc3Qgc2V0RGVmYXVsdFByb3BzOiBUaXBweVsnc2V0RGVmYXVsdFByb3BzJ10gPSAocGFydGlhbFByb3BzKSA9PiB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhwYXJ0aWFsUHJvcHMsIFtdKTtcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwYXJ0aWFsUHJvcHMpIGFzIEFycmF5PGtleW9mIERlZmF1bHRQcm9wcz47XG4gIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgKGRlZmF1bHRQcm9wcyBhcyBhbnkpW2tleV0gPSBwYXJ0aWFsUHJvcHNba2V5XTtcbiAgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wcyhcbiAgcGFzc2VkUHJvcHM6IFBhcnRpYWw8UHJvcHM+ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFBhcnRpYWw8UHJvcHM+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHBhc3NlZFByb3BzLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpblByb3BzID0gcGx1Z2lucy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KChhY2MsIHBsdWdpbikgPT4ge1xuICAgIGNvbnN0IHtuYW1lLCBkZWZhdWx0VmFsdWV9ID0gcGx1Z2luO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGFjY1tuYW1lXSA9XG4gICAgICAgIHBhc3NlZFByb3BzW25hbWVdICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHBhc3NlZFByb3BzW25hbWVdXG4gICAgICAgICAgOiAoZGVmYXVsdFByb3BzIGFzIGFueSlbbmFtZV0gPz8gZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnBhc3NlZFByb3BzLFxuICAgIC4uLnBsdWdpblByb3BzLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YUF0dHJpYnV0ZVByb3BzKFxuICByZWZlcmVuY2U6IFJlZmVyZW5jZUVsZW1lbnQsXG4gIHBsdWdpbnM6IFBsdWdpbltdXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHByb3BLZXlzID0gcGx1Z2luc1xuICAgID8gT2JqZWN0LmtleXMoZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wcyh7Li4uZGVmYXVsdFByb3BzLCBwbHVnaW5zfSkpXG4gICAgOiBkZWZhdWx0S2V5cztcblxuICBjb25zdCBwcm9wcyA9IHByb3BLZXlzLnJlZHVjZShcbiAgICAoYWNjOiBQYXJ0aWFsPFByb3BzPiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlQXNTdHJpbmcgPSAoXG4gICAgICAgIHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoYGRhdGEtdGlwcHktJHtrZXl9YCkgfHwgJydcbiAgICAgICkudHJpbSgpO1xuXG4gICAgICBpZiAoIXZhbHVlQXNTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWVBc1N0cmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWNjW2tleV0gPSBKU09OLnBhcnNlKHZhbHVlQXNTdHJpbmcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZUFzU3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fVxuICApO1xuXG4gIHJldHVybiBwcm9wcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlUHJvcHMoXG4gIHJlZmVyZW5jZTogUmVmZXJlbmNlRWxlbWVudCxcbiAgcHJvcHM6IFByb3BzXG4pOiBQcm9wcyB7XG4gIGNvbnN0IG91dCA9IHtcbiAgICAuLi5wcm9wcyxcbiAgICBjb250ZW50OiBpbnZva2VXaXRoQXJnc09yUmV0dXJuKHByb3BzLmNvbnRlbnQsIFtyZWZlcmVuY2VdKSxcbiAgICAuLi4ocHJvcHMuaWdub3JlQXR0cmlidXRlc1xuICAgICAgPyB7fVxuICAgICAgOiBnZXREYXRhQXR0cmlidXRlUHJvcHMocmVmZXJlbmNlLCBwcm9wcy5wbHVnaW5zKSksXG4gIH07XG5cbiAgb3V0LmFyaWEgPSB7XG4gICAgLi4uZGVmYXVsdFByb3BzLmFyaWEsXG4gICAgLi4ub3V0LmFyaWEsXG4gIH07XG5cbiAgb3V0LmFyaWEgPSB7XG4gICAgZXhwYW5kZWQ6XG4gICAgICBvdXQuYXJpYS5leHBhbmRlZCA9PT0gJ2F1dG8nID8gcHJvcHMuaW50ZXJhY3RpdmUgOiBvdXQuYXJpYS5leHBhbmRlZCxcbiAgICBjb250ZW50OlxuICAgICAgb3V0LmFyaWEuY29udGVudCA9PT0gJ2F1dG8nXG4gICAgICAgID8gcHJvcHMuaW50ZXJhY3RpdmVcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6ICdkZXNjcmliZWRieSdcbiAgICAgICAgOiBvdXQuYXJpYS5jb250ZW50LFxuICB9O1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BzKFxuICBwYXJ0aWFsUHJvcHM6IFBhcnRpYWw8UHJvcHM+ID0ge30sXG4gIHBsdWdpbnM6IFBsdWdpbltdID0gW11cbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFydGlhbFByb3BzKSBhcyBBcnJheTxrZXlvZiBQcm9wcz47XG4gIGtleXMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgIGNvbnN0IG5vblBsdWdpblByb3BzID0gcmVtb3ZlUHJvcGVydGllcyhcbiAgICAgIGRlZmF1bHRQcm9wcyxcbiAgICAgIE9iamVjdC5rZXlzKHBsdWdpblByb3BzKVxuICAgICk7XG5cbiAgICBsZXQgZGlkUGFzc1Vua25vd25Qcm9wID0gIWhhc093blByb3BlcnR5KG5vblBsdWdpblByb3BzLCBwcm9wKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwcm9wIGV4aXN0cyBpbiBgcGx1Z2luc2BcbiAgICBpZiAoZGlkUGFzc1Vua25vd25Qcm9wKSB7XG4gICAgICBkaWRQYXNzVW5rbm93blByb3AgPVxuICAgICAgICBwbHVnaW5zLmZpbHRlcigocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gcHJvcCkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHdhcm5XaGVuKFxuICAgICAgZGlkUGFzc1Vua25vd25Qcm9wLFxuICAgICAgW1xuICAgICAgICBgXFxgJHtwcm9wfVxcYGAsXG4gICAgICAgIFwiaXMgbm90IGEgdmFsaWQgcHJvcC4gWW91IG1heSBoYXZlIHNwZWxsZWQgaXQgaW5jb3JyZWN0bHksIG9yIGlmIGl0J3NcIixcbiAgICAgICAgJ2EgcGx1Z2luLCBmb3Jnb3QgdG8gcGFzcyBpdCBpbiBhbiBhcnJheSBhcyBwcm9wcy5wbHVnaW5zLicsXG4gICAgICAgICdcXG5cXG4nLFxuICAgICAgICAnQWxsIHByb3BzOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvYWxsLXByb3BzL1xcbicsXG4gICAgICAgICdQbHVnaW5zOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvcGx1Z2lucy8nLFxuICAgICAgXS5qb2luKCcgJylcbiAgICApO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge1xuICBBUlJPV19DTEFTUyxcbiAgQkFDS0RST1BfQ0xBU1MsXG4gIEJPWF9DTEFTUyxcbiAgQ09OVEVOVF9DTEFTUyxcbiAgU1ZHX0FSUk9XX0NMQVNTLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge2RpdiwgaXNFbGVtZW50fSBmcm9tICcuL2RvbS11dGlscyc7XG5pbXBvcnQge0luc3RhbmNlLCBQb3BwZXJFbGVtZW50LCBQcm9wc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1BvcHBlckNoaWxkcmVufSBmcm9tICcuL3R5cGVzLWludGVybmFsJztcbmltcG9ydCB7YXJyYXlGcm9tfSBmcm9tICcuL3V0aWxzJztcblxuLy8gRmlyZWZveCBleHRlbnNpb25zIGRvbid0IGFsbG93IC5pbm5lckhUTUwgPSBcIi4uLlwiIHByb3BlcnR5LiBUaGlzIHRyaWNrcyBpdC5cbmNvbnN0IGlubmVySFRNTCA9ICgpOiAnaW5uZXJIVE1MJyA9PiAnaW5uZXJIVE1MJztcblxuZnVuY3Rpb24gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoZWxlbWVudDogRWxlbWVudCwgaHRtbDogc3RyaW5nKTogdm9pZCB7XG4gIGVsZW1lbnRbaW5uZXJIVE1MKCldID0gaHRtbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXJyb3dFbGVtZW50KHZhbHVlOiBQcm9wc1snYXJyb3cnXSk6IEhUTUxEaXZFbGVtZW50IHtcbiAgY29uc3QgYXJyb3cgPSBkaXYoKTtcblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICBhcnJvdy5jbGFzc05hbWUgPSBBUlJPV19DTEFTUztcbiAgfSBlbHNlIHtcbiAgICBhcnJvdy5jbGFzc05hbWUgPSBTVkdfQVJST1dfQ0xBU1M7XG5cbiAgICBpZiAoaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAgYXJyb3cuYXBwZW5kQ2hpbGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTChhcnJvdywgdmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyb3c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250ZW50KGNvbnRlbnQ6IEhUTUxEaXZFbGVtZW50LCBwcm9wczogUHJvcHMpOiB2b2lkIHtcbiAgaWYgKGlzRWxlbWVudChwcm9wcy5jb250ZW50KSkge1xuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKGNvbnRlbnQsICcnKTtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkKHByb3BzLmNvbnRlbnQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5jb250ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHByb3BzLmFsbG93SFRNTCkge1xuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoY29udGVudCwgcHJvcHMuY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQudGV4dENvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4ocG9wcGVyOiBQb3BwZXJFbGVtZW50KTogUG9wcGVyQ2hpbGRyZW4ge1xuICBjb25zdCBib3ggPSBwb3BwZXIuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTERpdkVsZW1lbnQ7XG4gIGNvbnN0IGJveENoaWxkcmVuID0gYXJyYXlGcm9tKGJveC5jaGlsZHJlbik7XG5cbiAgcmV0dXJuIHtcbiAgICBib3gsXG4gICAgY29udGVudDogYm94Q2hpbGRyZW4uZmluZCgobm9kZSkgPT4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoQ09OVEVOVF9DTEFTUykpLFxuICAgIGFycm93OiBib3hDaGlsZHJlbi5maW5kKFxuICAgICAgKG5vZGUpID0+XG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKEFSUk9XX0NMQVNTKSB8fFxuICAgICAgICBub2RlLmNsYXNzTGlzdC5jb250YWlucyhTVkdfQVJST1dfQ0xBU1MpXG4gICAgKSxcbiAgICBiYWNrZHJvcDogYm94Q2hpbGRyZW4uZmluZCgobm9kZSkgPT5cbiAgICAgIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKEJBQ0tEUk9QX0NMQVNTKVxuICAgICksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXIoXG4gIGluc3RhbmNlOiBJbnN0YW5jZVxuKToge1xuICBwb3BwZXI6IFBvcHBlckVsZW1lbnQ7XG4gIG9uVXBkYXRlPzogKHByZXZQcm9wczogUHJvcHMsIG5leHRQcm9wczogUHJvcHMpID0+IHZvaWQ7XG59IHtcbiAgY29uc3QgcG9wcGVyID0gZGl2KCk7XG5cbiAgY29uc3QgYm94ID0gZGl2KCk7XG4gIGJveC5jbGFzc05hbWUgPSBCT1hfQ0xBU1M7XG4gIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XG4gIGJveC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG5cbiAgY29uc3QgY29udGVudCA9IGRpdigpO1xuICBjb250ZW50LmNsYXNzTmFtZSA9IENPTlRFTlRfQ0xBU1M7XG4gIGNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXRlJywgJ2hpZGRlbicpO1xuXG4gIHNldENvbnRlbnQoY29udGVudCwgaW5zdGFuY2UucHJvcHMpO1xuXG4gIHBvcHBlci5hcHBlbmRDaGlsZChib3gpO1xuICBib3guYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgb25VcGRhdGUoaW5zdGFuY2UucHJvcHMsIGluc3RhbmNlLnByb3BzKTtcblxuICBmdW5jdGlvbiBvblVwZGF0ZShwcmV2UHJvcHM6IFByb3BzLCBuZXh0UHJvcHM6IFByb3BzKTogdm9pZCB7XG4gICAgY29uc3Qge2JveCwgY29udGVudCwgYXJyb3d9ID0gZ2V0Q2hpbGRyZW4ocG9wcGVyKTtcblxuICAgIGlmIChuZXh0UHJvcHMudGhlbWUpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCBuZXh0UHJvcHMudGhlbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3gucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRoZW1lJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXh0UHJvcHMuYW5pbWF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb24nLCBuZXh0UHJvcHMuYW5pbWF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFByb3BzLmluZXJ0aWEpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaW5lcnRpYScsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1pbmVydGlhJyk7XG4gICAgfVxuXG4gICAgYm94LnN0eWxlLm1heFdpZHRoID1cbiAgICAgIHR5cGVvZiBuZXh0UHJvcHMubWF4V2lkdGggPT09ICdudW1iZXInXG4gICAgICAgID8gYCR7bmV4dFByb3BzLm1heFdpZHRofXB4YFxuICAgICAgICA6IG5leHRQcm9wcy5tYXhXaWR0aDtcblxuICAgIGlmIChuZXh0UHJvcHMucm9sZSkge1xuICAgICAgYm94LnNldEF0dHJpYnV0ZSgncm9sZScsIG5leHRQcm9wcy5yb2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByZXZQcm9wcy5jb250ZW50ICE9PSBuZXh0UHJvcHMuY29udGVudCB8fFxuICAgICAgcHJldlByb3BzLmFsbG93SFRNTCAhPT0gbmV4dFByb3BzLmFsbG93SFRNTFxuICAgICkge1xuICAgICAgc2V0Q29udGVudChjb250ZW50LCBpbnN0YW5jZS5wcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKG5leHRQcm9wcy5hcnJvdykge1xuICAgICAgaWYgKCFhcnJvdykge1xuICAgICAgICBib3guYXBwZW5kQ2hpbGQoY3JlYXRlQXJyb3dFbGVtZW50KG5leHRQcm9wcy5hcnJvdykpO1xuICAgICAgfSBlbHNlIGlmIChwcmV2UHJvcHMuYXJyb3cgIT09IG5leHRQcm9wcy5hcnJvdykge1xuICAgICAgICBib3gucmVtb3ZlQ2hpbGQoYXJyb3cpO1xuICAgICAgICBib3guYXBwZW5kQ2hpbGQoY3JlYXRlQXJyb3dFbGVtZW50KG5leHRQcm9wcy5hcnJvdykpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJyb3cpIHtcbiAgICAgIGJveC5yZW1vdmVDaGlsZChhcnJvdyEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcG9wcGVyLFxuICAgIG9uVXBkYXRlLFxuICB9O1xufVxuXG4vLyBSdW50aW1lIGNoZWNrIHRvIGlkZW50aWZ5IGlmIHRoZSByZW5kZXIgZnVuY3Rpb24gaXMgdGhlIGRlZmF1bHQgb25lOyB0aGlzXG4vLyB3YXkgd2UgY2FuIGFwcGx5IGRlZmF1bHQgQ1NTIHRyYW5zaXRpb25zIGxvZ2ljIGFuZCBpdCBjYW4gYmUgdHJlZS1zaGFrZW4gYXdheVxucmVuZGVyLiQkdGlwcHkgPSB0cnVlO1xuIiwgImltcG9ydCB7Y3JlYXRlUG9wcGVyLCBTdHJpY3RNb2RpZmllcnMsIE1vZGlmaWVyfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5pbXBvcnQge2N1cnJlbnRJbnB1dH0gZnJvbSAnLi9iaW5kR2xvYmFsRXZlbnRMaXN0ZW5lcnMnO1xuaW1wb3J0IHtpc0lFMTF9IGZyb20gJy4vYnJvd3Nlcic7XG5pbXBvcnQge1RJUFBZX0RFRkFVTFRfQVBQRU5EX1RPLCBUT1VDSF9PUFRJT05TfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBhY3R1YWxDb250YWlucyxcbiAgZGl2LFxuICBnZXRPd25lckRvY3VtZW50LFxuICBpc0N1cnNvck91dHNpZGVJbnRlcmFjdGl2ZUJvcmRlcixcbiAgaXNNb3VzZUV2ZW50LFxuICBzZXRUcmFuc2l0aW9uRHVyYXRpb24sXG4gIHNldFZpc2liaWxpdHlTdGF0ZSxcbiAgdXBkYXRlVHJhbnNpdGlvbkVuZExpc3RlbmVyLFxufSBmcm9tICcuL2RvbS11dGlscyc7XG5pbXBvcnQge2RlZmF1bHRQcm9wcywgZXZhbHVhdGVQcm9wcywgZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wc30gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQge2dldENoaWxkcmVufSBmcm9tICcuL3RlbXBsYXRlJztcbmltcG9ydCB7XG4gIENvbnRlbnQsXG4gIEluc3RhbmNlLFxuICBMaWZlY3ljbGVIb29rcyxcbiAgUG9wcGVyRWxlbWVudCxcbiAgUHJvcHMsXG4gIFJlZmVyZW5jZUVsZW1lbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtMaXN0ZW5lck9iamVjdCwgUG9wcGVyVHJlZURhdGEsIFBvcHBlckNoaWxkcmVufSBmcm9tICcuL3R5cGVzLWludGVybmFsJztcbmltcG9ydCB7XG4gIGFycmF5RnJvbSxcbiAgZGVib3VuY2UsXG4gIGdldFZhbHVlQXRJbmRleE9yUmV0dXJuLFxuICBpbnZva2VXaXRoQXJnc09yUmV0dXJuLFxuICBub3JtYWxpemVUb0FycmF5LFxuICBwdXNoSWZVbmlxdWUsXG4gIHNwbGl0QnlTcGFjZXMsXG4gIHVuaXF1ZSxcbiAgcmVtb3ZlVW5kZWZpbmVkUHJvcHMsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtjcmVhdGVNZW1vcnlMZWFrV2FybmluZywgZXJyb3JXaGVuLCB3YXJuV2hlbn0gZnJvbSAnLi92YWxpZGF0aW9uJztcblxubGV0IGlkQ291bnRlciA9IDE7XG5sZXQgbW91c2VNb3ZlTGlzdGVuZXJzOiAoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkKVtdID0gW107XG5cbi8vIFVzZWQgYnkgYGhpZGVBbGwoKWBcbmV4cG9ydCBsZXQgbW91bnRlZEluc3RhbmNlczogSW5zdGFuY2VbXSA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVUaXBweShcbiAgcmVmZXJlbmNlOiBSZWZlcmVuY2VFbGVtZW50LFxuICBwYXNzZWRQcm9wczogUGFydGlhbDxQcm9wcz5cbik6IEluc3RhbmNlIHtcbiAgY29uc3QgcHJvcHMgPSBldmFsdWF0ZVByb3BzKHJlZmVyZW5jZSwge1xuICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAuLi5nZXRFeHRlbmRlZFBhc3NlZFByb3BzKHJlbW92ZVVuZGVmaW5lZFByb3BzKHBhc3NlZFByb3BzKSksXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyDwn5SSIFByaXZhdGUgbWVtYmVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IHNob3dUaW1lb3V0OiBhbnk7XG4gIGxldCBoaWRlVGltZW91dDogYW55O1xuICBsZXQgc2NoZWR1bGVIaWRlQW5pbWF0aW9uRnJhbWU6IG51bWJlcjtcbiAgbGV0IGlzVmlzaWJsZUZyb21DbGljayA9IGZhbHNlO1xuICBsZXQgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd24gPSBmYWxzZTtcbiAgbGV0IGRpZFRvdWNoTW92ZSA9IGZhbHNlO1xuICBsZXQgaWdub3JlT25GaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICBsZXQgbGFzdFRyaWdnZXJFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50VHJhbnNpdGlvbkVuZExpc3RlbmVyOiAoZXZlbnQ6IFRyYW5zaXRpb25FdmVudCkgPT4gdm9pZDtcbiAgbGV0IG9uRmlyc3RVcGRhdGU6ICgpID0+IHZvaWQ7XG4gIGxldCBsaXN0ZW5lcnM6IExpc3RlbmVyT2JqZWN0W10gPSBbXTtcbiAgbGV0IGRlYm91bmNlZE9uTW91c2VNb3ZlID0gZGVib3VuY2Uob25Nb3VzZU1vdmUsIHByb3BzLmludGVyYWN0aXZlRGVib3VuY2UpO1xuICBsZXQgY3VycmVudFRhcmdldDogRWxlbWVudDtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8g8J+UkSBQdWJsaWMgbWVtYmVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgaWQgPSBpZENvdW50ZXIrKztcbiAgY29uc3QgcG9wcGVySW5zdGFuY2UgPSBudWxsO1xuICBjb25zdCBwbHVnaW5zID0gdW5pcXVlKHByb3BzLnBsdWdpbnMpO1xuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIC8vIElzIHRoZSBpbnN0YW5jZSBjdXJyZW50bHkgZW5hYmxlZD9cbiAgICBpc0VuYWJsZWQ6IHRydWUsXG4gICAgLy8gSXMgdGhlIHRpcHB5IGN1cnJlbnRseSBzaG93aW5nIGFuZCBub3QgdHJhbnNpdGlvbmluZyBvdXQ/XG4gICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAvLyBIYXMgdGhlIGluc3RhbmNlIGJlZW4gZGVzdHJveWVkP1xuICAgIGlzRGVzdHJveWVkOiBmYWxzZSxcbiAgICAvLyBJcyB0aGUgdGlwcHkgY3VycmVudGx5IG1vdW50ZWQgdG8gdGhlIERPTT9cbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIC8vIEhhcyB0aGUgdGlwcHkgZmluaXNoZWQgdHJhbnNpdGlvbmluZyBpbj9cbiAgICBpc1Nob3duOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdCBpbnN0YW5jZTogSW5zdGFuY2UgPSB7XG4gICAgLy8gcHJvcGVydGllc1xuICAgIGlkLFxuICAgIHJlZmVyZW5jZSxcbiAgICBwb3BwZXI6IGRpdigpLFxuICAgIHBvcHBlckluc3RhbmNlLFxuICAgIHByb3BzLFxuICAgIHN0YXRlLFxuICAgIHBsdWdpbnMsXG4gICAgLy8gbWV0aG9kc1xuICAgIGNsZWFyRGVsYXlUaW1lb3V0cyxcbiAgICBzZXRQcm9wcyxcbiAgICBzZXRDb250ZW50LFxuICAgIHNob3csXG4gICAgaGlkZSxcbiAgICBoaWRlV2l0aEludGVyYWN0aXZpdHksXG4gICAgZW5hYmxlLFxuICAgIGRpc2FibGUsXG4gICAgdW5tb3VudCxcbiAgICBkZXN0cm95LFxuICB9O1xuXG4gIC8vIFRPRE86IEludmVzdGlnYXRlIHdoeSB0aGlzIGVhcmx5IHJldHVybiBjYXVzZXMgYSBURFogZXJyb3IgaW4gdGhlIHRlc3RzIOKAlFxuICAvLyBpdCBkb2Vzbid0IHNlZW0gdG8gaGFwcGVuIGluIHRoZSBicm93c2VyXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIXByb3BzLnJlbmRlcikge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBlcnJvcldoZW4odHJ1ZSwgJ3JlbmRlcigpIGZ1bmN0aW9uIGhhcyBub3QgYmVlbiBzdXBwbGllZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbCBtdXRhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHtwb3BwZXIsIG9uVXBkYXRlfSA9IHByb3BzLnJlbmRlcihpbnN0YW5jZSk7XG5cbiAgcG9wcGVyLnNldEF0dHJpYnV0ZSgnZGF0YS1fX05BTUVTUEFDRV9QUkVGSVhfXy1yb290JywgJycpO1xuICBwb3BwZXIuaWQgPSBgX19OQU1FU1BBQ0VfUFJFRklYX18tJHtpbnN0YW5jZS5pZH1gO1xuXG4gIGluc3RhbmNlLnBvcHBlciA9IHBvcHBlcjtcbiAgcmVmZXJlbmNlLl90aXBweSA9IGluc3RhbmNlO1xuICBwb3BwZXIuX3RpcHB5ID0gaW5zdGFuY2U7XG5cbiAgY29uc3QgcGx1Z2luc0hvb2tzID0gcGx1Z2lucy5tYXAoKHBsdWdpbikgPT4gcGx1Z2luLmZuKGluc3RhbmNlKSk7XG4gIGNvbnN0IGhhc0FyaWFFeHBhbmRlZCA9IHJlZmVyZW5jZS5oYXNBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnKTtcblxuICBhZGRMaXN0ZW5lcnMoKTtcbiAgaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCk7XG4gIGhhbmRsZVN0eWxlcygpO1xuXG4gIGludm9rZUhvb2soJ29uQ3JlYXRlJywgW2luc3RhbmNlXSk7XG5cbiAgaWYgKHByb3BzLnNob3dPbkNyZWF0ZSkge1xuICAgIHNjaGVkdWxlU2hvdygpO1xuICB9XG5cbiAgLy8gUHJldmVudCBhIHRpcHB5IHdpdGggYSBkZWxheSBmcm9tIGhpZGluZyBpZiB0aGUgY3Vyc29yIGxlZnQgdGhlbiByZXR1cm5lZFxuICAvLyBiZWZvcmUgaXQgc3RhcnRlZCBoaWRpbmdcbiAgcG9wcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlICYmIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgaW5zdGFuY2UuY2xlYXJEZWxheVRpbWVvdXRzKCk7XG4gICAgfVxuICB9KTtcblxuICBwb3BwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICBpZiAoXG4gICAgICBpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJlxuICAgICAgaW5zdGFuY2UucHJvcHMudHJpZ2dlci5pbmRleE9mKCdtb3VzZWVudGVyJykgPj0gMFxuICAgICkge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBkZWJvdW5jZWRPbk1vdXNlTW92ZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIPCflJIgUHJpdmF0ZSBtZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBnZXROb3JtYWxpemVkVG91Y2hTZXR0aW5ncygpOiBbc3RyaW5nIHwgYm9vbGVhbiwgbnVtYmVyXSB7XG4gICAgY29uc3Qge3RvdWNofSA9IGluc3RhbmNlLnByb3BzO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRvdWNoKSA/IHRvdWNoIDogW3RvdWNoLCAwXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElzQ3VzdG9tVG91Y2hCZWhhdmlvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0Tm9ybWFsaXplZFRvdWNoU2V0dGluZ3MoKVswXSA9PT0gJ2hvbGQnO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKTogYm9vbGVhbiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAhIWluc3RhbmNlLnByb3BzLnJlbmRlcj8uJCR0aXBweTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRUYXJnZXQoKTogRWxlbWVudCB7XG4gICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQgfHwgcmVmZXJlbmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKTogRG9jdW1lbnQge1xuICAgIGNvbnN0IHBhcmVudCA9IGdldEN1cnJlbnRUYXJnZXQoKS5wYXJlbnROb2RlIGFzIEVsZW1lbnQ7XG4gICAgcmV0dXJuIHBhcmVudCA/IGdldE93bmVyRG9jdW1lbnQocGFyZW50KSA6IGRvY3VtZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKTogUG9wcGVyQ2hpbGRyZW4ge1xuICAgIHJldHVybiBnZXRDaGlsZHJlbihwb3BwZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGVsYXkoaXNTaG93OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAvLyBGb3IgdG91Y2ggb3Iga2V5Ym9hcmQgaW5wdXQsIGZvcmNlIGAwYCBkZWxheSBmb3IgVVggcmVhc29uc1xuICAgIC8vIEFsc28gaWYgdGhlIGluc3RhbmNlIGlzIG1vdW50ZWQgYnV0IG5vdCB2aXNpYmxlICh0cmFuc2l0aW9uaW5nIG91dCksXG4gICAgLy8gaWdub3JlIGRlbGF5XG4gICAgaWYgKFxuICAgICAgKGluc3RhbmNlLnN0YXRlLmlzTW91bnRlZCAmJiAhaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB8fFxuICAgICAgY3VycmVudElucHV0LmlzVG91Y2ggfHxcbiAgICAgIChsYXN0VHJpZ2dlckV2ZW50ICYmIGxhc3RUcmlnZ2VyRXZlbnQudHlwZSA9PT0gJ2ZvY3VzJylcbiAgICApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRWYWx1ZUF0SW5kZXhPclJldHVybihcbiAgICAgIGluc3RhbmNlLnByb3BzLmRlbGF5LFxuICAgICAgaXNTaG93ID8gMCA6IDEsXG4gICAgICBkZWZhdWx0UHJvcHMuZGVsYXlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3R5bGVzKGZyb21IaWRlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBwb3BwZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9XG4gICAgICBpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiAhZnJvbUhpZGUgPyAnJyA6ICdub25lJztcbiAgICBwb3BwZXIuc3R5bGUuekluZGV4ID0gYCR7aW5zdGFuY2UucHJvcHMuekluZGV4fWA7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VIb29rKFxuICAgIGhvb2s6IGtleW9mIExpZmVjeWNsZUhvb2tzLFxuICAgIGFyZ3M6IFtJbnN0YW5jZSwgYW55P10sXG4gICAgc2hvdWxkSW52b2tlUHJvcHNIb29rID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICBwbHVnaW5zSG9va3MuZm9yRWFjaCgocGx1Z2luSG9va3MpID0+IHtcbiAgICAgIGlmIChwbHVnaW5Ib29rc1tob29rXSkge1xuICAgICAgICBwbHVnaW5Ib29rc1tob29rXSEoLi4uYXJncyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoc2hvdWxkSW52b2tlUHJvcHNIb29rKSB7XG4gICAgICBpbnN0YW5jZS5wcm9wc1tob29rXSguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBcmlhQ29udGVudEF0dHJpYnV0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB7YXJpYX0gPSBpbnN0YW5jZS5wcm9wcztcblxuICAgIGlmICghYXJpYS5jb250ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0ciA9IGBhcmlhLSR7YXJpYS5jb250ZW50fWA7XG4gICAgY29uc3QgaWQgPSBwb3BwZXIuaWQ7XG4gICAgY29uc3Qgbm9kZXMgPSBub3JtYWxpemVUb0FycmF5KGluc3RhbmNlLnByb3BzLnRyaWdnZXJUYXJnZXQgfHwgcmVmZXJlbmNlKTtcblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHIsIGN1cnJlbnRWYWx1ZSA/IGAke2N1cnJlbnRWYWx1ZX0gJHtpZH1gIDogaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5yZXBsYWNlKGlkLCAnJykudHJpbSgpO1xuXG4gICAgICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyLCBuZXh0VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBcmlhRXhwYW5kZWRBdHRyaWJ1dGUoKTogdm9pZCB7XG4gICAgaWYgKGhhc0FyaWFFeHBhbmRlZCB8fCAhaW5zdGFuY2UucHJvcHMuYXJpYS5leHBhbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbm9ybWFsaXplVG9BcnJheShpbnN0YW5jZS5wcm9wcy50cmlnZ2VyVGFyZ2V0IHx8IHJlZmVyZW5jZSk7XG5cbiAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnLFxuICAgICAgICAgIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJiBub2RlID09PSBnZXRDdXJyZW50VGFyZ2V0KClcbiAgICAgICAgICAgID8gJ3RydWUnXG4gICAgICAgICAgICA6ICdmYWxzZSdcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwSW50ZXJhY3RpdmVNb3VzZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBnZXREb2N1bWVudCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGRlYm91bmNlZE9uTW91c2VNb3ZlKTtcbiAgICBtb3VzZU1vdmVMaXN0ZW5lcnMgPSBtb3VzZU1vdmVMaXN0ZW5lcnMuZmlsdGVyKFxuICAgICAgKGxpc3RlbmVyKSA9PiBsaXN0ZW5lciAhPT0gZGVib3VuY2VkT25Nb3VzZU1vdmVcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Eb2N1bWVudFByZXNzKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIC8vIE1vdmVkIGZpbmdlciB0byBzY3JvbGwgaW5zdGVhZCBvZiBhbiBpbnRlbnRpb25hbCB0YXAgb3V0c2lkZVxuICAgIGlmIChjdXJyZW50SW5wdXQuaXNUb3VjaCkge1xuICAgICAgaWYgKGRpZFRvdWNoTW92ZSB8fCBldmVudC50eXBlID09PSAnbW91c2Vkb3duJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVGFyZ2V0ID1cbiAgICAgIChldmVudC5jb21wb3NlZFBhdGggJiYgZXZlbnQuY29tcG9zZWRQYXRoKClbMF0pIHx8IGV2ZW50LnRhcmdldDtcblxuICAgIC8vIENsaWNrZWQgb24gaW50ZXJhY3RpdmUgcG9wcGVyXG4gICAgaWYgKFxuICAgICAgaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiZcbiAgICAgIGFjdHVhbENvbnRhaW5zKHBvcHBlciwgYWN0dWFsVGFyZ2V0IGFzIEVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xpY2tlZCBvbiB0aGUgZXZlbnQgbGlzdGVuZXJzIHRhcmdldFxuICAgIGlmIChcbiAgICAgIG5vcm1hbGl6ZVRvQXJyYXkoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpLnNvbWUoKGVsKSA9PlxuICAgICAgICBhY3R1YWxDb250YWlucyhlbCwgYWN0dWFsVGFyZ2V0IGFzIEVsZW1lbnQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpZiAoY3VycmVudElucHV0LmlzVG91Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJlxuICAgICAgICBpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2NsaWNrJykgPj0gMFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW52b2tlSG9vaygnb25DbGlja091dHNpZGUnLCBbaW5zdGFuY2UsIGV2ZW50XSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmhpZGVPbkNsaWNrID09PSB0cnVlKSB7XG4gICAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcbiAgICAgIGluc3RhbmNlLmhpZGUoKTtcblxuICAgICAgLy8gYG1vdXNlZG93bmAgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYmVmb3JlIGBmb2N1c2AgaWYgcHJlc3NpbmcgdGhlXG4gICAgICAvLyBjdXJyZW50VGFyZ2V0LiBUaGlzIGxldHMgYSB0aXBweSB3aXRoIGBmb2N1c2AgdHJpZ2dlciBrbm93IHRoYXQgaXRcbiAgICAgIC8vIHNob3VsZCBub3Qgc2hvd1xuICAgICAgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd24gPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpZEhpZGVEdWVUb0RvY3VtZW50TW91c2VEb3duID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGxpc3RlbmVyIGdldHMgYWRkZWQgaW4gYHNjaGVkdWxlU2hvdygpYCwgYnV0IHRoaXMgbWF5IGJlIGhpZGluZyBpdFxuICAgICAgLy8gYmVmb3JlIGl0IHNob3dzLCBhbmQgaGlkZSgpJ3MgZWFybHkgYmFpbC1vdXQgYmVoYXZpb3IgY2FuIHByZXZlbnQgaXRcbiAgICAgIC8vIGZyb20gYmVpbmcgY2xlYW5lZCB1cFxuICAgICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgcmVtb3ZlRG9jdW1lbnRQcmVzcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKCk6IHZvaWQge1xuICAgIGRpZFRvdWNoTW92ZSA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoKTogdm9pZCB7XG4gICAgZGlkVG91Y2hNb3ZlID0gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBhZGREb2N1bWVudFByZXNzKCk6IHZvaWQge1xuICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KCk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uRG9jdW1lbnRQcmVzcywgdHJ1ZSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Eb2N1bWVudFByZXNzLCBUT1VDSF9PUFRJT05TKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgVE9VQ0hfT1BUSU9OUyk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBUT1VDSF9PUFRJT05TKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZURvY3VtZW50UHJlc3MoKTogdm9pZCB7XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Eb2N1bWVudFByZXNzLCB0cnVlKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbkRvY3VtZW50UHJlc3MsIFRPVUNIX09QVElPTlMpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBUT1VDSF9PUFRJT05TKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIFRPVUNIX09QVElPTlMpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UcmFuc2l0aW9uZWRPdXQoZHVyYXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBvblRyYW5zaXRpb25FbmQoZHVyYXRpb24sICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJlxuICAgICAgICBwb3BwZXIucGFyZW50Tm9kZSAmJlxuICAgICAgICBwb3BwZXIucGFyZW50Tm9kZS5jb250YWlucyhwb3BwZXIpXG4gICAgICApIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHJhbnNpdGlvbmVkSW4oZHVyYXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBvblRyYW5zaXRpb25FbmQoZHVyYXRpb24sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHJhbnNpdGlvbkVuZChkdXJhdGlvbjogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGJveCA9IGdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuKCkuYm94O1xuXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIoZXZlbnQ6IFRyYW5zaXRpb25FdmVudCk6IHZvaWQge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gYm94KSB7XG4gICAgICAgIHVwZGF0ZVRyYW5zaXRpb25FbmRMaXN0ZW5lcihib3gsICdyZW1vdmUnLCBsaXN0ZW5lcik7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFrZSBjYWxsYmFjayBzeW5jaHJvbm91cyBpZiBkdXJhdGlvbiBpcyAwXG4gICAgLy8gYHRyYW5zaXRpb25lbmRgIHdvbid0IGZpcmUgb3RoZXJ3aXNlXG4gICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9uRW5kTGlzdGVuZXIoYm94LCAncmVtb3ZlJywgY3VycmVudFRyYW5zaXRpb25FbmRMaXN0ZW5lcik7XG4gICAgdXBkYXRlVHJhbnNpdGlvbkVuZExpc3RlbmVyKGJveCwgJ2FkZCcsIGxpc3RlbmVyKTtcblxuICAgIGN1cnJlbnRUcmFuc2l0aW9uRW5kTGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uKFxuICAgIGV2ZW50VHlwZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIsXG4gICAgb3B0aW9uczogYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZXMgPSBub3JtYWxpemVUb0FycmF5KGluc3RhbmNlLnByb3BzLnRyaWdnZXJUYXJnZXQgfHwgcmVmZXJlbmNlKTtcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICAgIGxpc3RlbmVycy5wdXNoKHtub2RlLCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnN9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAoZ2V0SXNDdXN0b21Ub3VjaEJlaGF2aW9yKCkpIHtcbiAgICAgIG9uKCd0b3VjaHN0YXJ0Jywgb25UcmlnZ2VyLCB7cGFzc2l2ZTogdHJ1ZX0pO1xuICAgICAgb24oJ3RvdWNoZW5kJywgb25Nb3VzZUxlYXZlIGFzIEV2ZW50TGlzdGVuZXIsIHtwYXNzaXZlOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgc3BsaXRCeVNwYWNlcyhpbnN0YW5jZS5wcm9wcy50cmlnZ2VyKS5mb3JFYWNoKChldmVudFR5cGUpID0+IHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09ICdtYW51YWwnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb24oZXZlbnRUeXBlLCBvblRyaWdnZXIpO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICAgICAgICBvbignbW91c2VsZWF2ZScsIG9uTW91c2VMZWF2ZSBhcyBFdmVudExpc3RlbmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZm9jdXMnOlxuICAgICAgICAgIG9uKGlzSUUxMSA/ICdmb2N1c291dCcgOiAnYmx1cicsIG9uQmx1ck9yRm9jdXNPdXQgYXMgRXZlbnRMaXN0ZW5lcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgICAgIG9uKCdmb2N1c291dCcsIG9uQmx1ck9yRm9jdXNPdXQgYXMgRXZlbnRMaXN0ZW5lcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKHtub2RlLCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnN9OiBMaXN0ZW5lck9iamVjdCkgPT4ge1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBmdW5jdGlvbiBvblRyaWdnZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IHNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlID0gZmFsc2U7XG5cbiAgICBpZiAoXG4gICAgICAhaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkIHx8XG4gICAgICBpc0V2ZW50TGlzdGVuZXJTdG9wcGVkKGV2ZW50KSB8fFxuICAgICAgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd25cbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gbGFzdFRyaWdnZXJFdmVudD8udHlwZSA9PT0gJ2ZvY3VzJztcblxuICAgIGxhc3RUcmlnZ2VyRXZlbnQgPSBldmVudDtcbiAgICBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCk7XG5cbiAgICBpZiAoIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJiBpc01vdXNlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAvLyBJZiBzY3JvbGxpbmcsIGBtb3VzZWVudGVyYCBldmVudHMgY2FuIGJlIGZpcmVkIGlmIHRoZSBjdXJzb3IgbGFuZHNcbiAgICAgIC8vIG92ZXIgYSBuZXcgdGFyZ2V0LCBidXQgYG1vdXNlbW92ZWAgZXZlbnRzIGRvbid0IGdldCBmaXJlZC4gVGhpc1xuICAgICAgLy8gY2F1c2VzIGludGVyYWN0aXZlIHRvb2x0aXBzIHRvIGdldCBzdHVjayBvcGVuIHVudGlsIHRoZSBjdXJzb3IgaXNcbiAgICAgIC8vIG1vdmVkXG4gICAgICBtb3VzZU1vdmVMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgLy8gVG9nZ2xlIHNob3cvaGlkZSB3aGVuIGNsaWNraW5nIGNsaWNrLXRyaWdnZXJlZCB0b29sdGlwc1xuICAgIGlmIChcbiAgICAgIGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ21vdXNlZW50ZXInKSA8IDAgfHxcbiAgICAgICAgaXNWaXNpYmxlRnJvbUNsaWNrKSAmJlxuICAgICAgaW5zdGFuY2UucHJvcHMuaGlkZU9uQ2xpY2sgIT09IGZhbHNlICYmXG4gICAgICBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGVcbiAgICApIHtcbiAgICAgIHNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTaG93KGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaXNWaXNpYmxlRnJvbUNsaWNrID0gIXNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRTY2hlZHVsZUNsaWNrSGlkZSAmJiAhd2FzRm9jdXNlZCkge1xuICAgICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGNvbnN0IGlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyID1cbiAgICAgIGdldEN1cnJlbnRUYXJnZXQoKS5jb250YWlucyh0YXJnZXQpIHx8IHBvcHBlci5jb250YWlucyh0YXJnZXQpO1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnICYmIGlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9wcGVyVHJlZURhdGEgPSBnZXROZXN0ZWRQb3BwZXJUcmVlKClcbiAgICAgIC5jb25jYXQocG9wcGVyKVxuICAgICAgLm1hcCgocG9wcGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gcG9wcGVyLl90aXBweSE7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaW5zdGFuY2UucG9wcGVySW5zdGFuY2U/LnN0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3BwZXJSZWN0OiBwb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBwb3BwZXJTdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQb3BwZXJUcmVlRGF0YVtdO1xuXG4gICAgaWYgKGlzQ3Vyc29yT3V0c2lkZUludGVyYWN0aXZlQm9yZGVyKHBvcHBlclRyZWVEYXRhLCBldmVudCkpIHtcbiAgICAgIGNsZWFudXBJbnRlcmFjdGl2ZU1vdXNlTGlzdGVuZXJzKCk7XG4gICAgICBzY2hlZHVsZUhpZGUoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTW91c2VMZWF2ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNob3VsZEJhaWwgPVxuICAgICAgaXNFdmVudExpc3RlbmVyU3RvcHBlZChldmVudCkgfHxcbiAgICAgIChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2NsaWNrJykgPj0gMCAmJiBpc1Zpc2libGVGcm9tQ2xpY2spO1xuXG4gICAgaWYgKHNob3VsZEJhaWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUpIHtcbiAgICAgIGluc3RhbmNlLmhpZGVXaXRoSW50ZXJhY3Rpdml0eShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQmx1ck9yRm9jdXNPdXQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2ZvY3VzaW4nKSA8IDAgJiZcbiAgICAgIGV2ZW50LnRhcmdldCAhPT0gZ2V0Q3VycmVudFRhcmdldCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgZm9jdXMgd2FzIG1vdmVkIHRvIHdpdGhpbiB0aGUgcG9wcGVyXG4gICAgaWYgKFxuICAgICAgaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiZcbiAgICAgIGV2ZW50LnJlbGF0ZWRUYXJnZXQgJiZcbiAgICAgIHBvcHBlci5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRXZlbnRMaXN0ZW5lclN0b3BwZWQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGN1cnJlbnRJbnB1dC5pc1RvdWNoXG4gICAgICA/IGdldElzQ3VzdG9tVG91Y2hCZWhhdmlvcigpICE9PSBldmVudC50eXBlLmluZGV4T2YoJ3RvdWNoJykgPj0gMFxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlckluc3RhbmNlKCk6IHZvaWQge1xuICAgIGRlc3Ryb3lQb3BwZXJJbnN0YW5jZSgpO1xuXG4gICAgY29uc3Qge1xuICAgICAgcG9wcGVyT3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIG9mZnNldCxcbiAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgICBtb3ZlVHJhbnNpdGlvbixcbiAgICB9ID0gaW5zdGFuY2UucHJvcHM7XG5cbiAgICBjb25zdCBhcnJvdyA9IGdldElzRGVmYXVsdFJlbmRlckZuKCkgPyBnZXRDaGlsZHJlbihwb3BwZXIpLmFycm93IDogbnVsbDtcblxuICAgIGNvbnN0IGNvbXB1dGVkUmVmZXJlbmNlID0gZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdFxuICAgICAgPyB7XG4gICAgICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0OiBnZXRSZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgICAgICAgIGNvbnRleHRFbGVtZW50OlxuICAgICAgICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdC5jb250ZXh0RWxlbWVudCB8fCBnZXRDdXJyZW50VGFyZ2V0KCksXG4gICAgICAgIH1cbiAgICAgIDogcmVmZXJlbmNlO1xuXG4gICAgY29uc3QgdGlwcHlNb2RpZmllcjogTW9kaWZpZXI8JyQkdGlwcHknLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7XG4gICAgICBuYW1lOiAnJCR0aXBweScsXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gICAgICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ10sXG4gICAgICBmbih7c3RhdGV9KSB7XG4gICAgICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICAgICAgY29uc3Qge2JveH0gPSBnZXREZWZhdWx0VGVtcGxhdGVDaGlsZHJlbigpO1xuXG4gICAgICAgICAgWydwbGFjZW1lbnQnLCAncmVmZXJlbmNlLWhpZGRlbicsICdlc2NhcGVkJ10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgICAgICAgaWYgKGF0dHIgPT09ICdwbGFjZW1lbnQnKSB7XG4gICAgICAgICAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2VtZW50Jywgc3RhdGUucGxhY2VtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlcltgZGF0YS1wb3BwZXItJHthdHRyfWBdKSB7XG4gICAgICAgICAgICAgICAgYm94LnNldEF0dHJpYnV0ZShgZGF0YS0ke2F0dHJ9YCwgJycpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJveC5yZW1vdmVBdHRyaWJ1dGUoYGRhdGEtJHthdHRyfWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0eXBlIFRpcHB5TW9kaWZpZXIgPSBNb2RpZmllcjwnJCR0aXBweScsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICB0eXBlIEV4dGVuZGVkTW9kaWZpZXJzID0gU3RyaWN0TW9kaWZpZXJzIHwgUGFydGlhbDxUaXBweU1vZGlmaWVyPjtcblxuICAgIGNvbnN0IG1vZGlmaWVyczogQXJyYXk8RXh0ZW5kZWRNb2RpZmllcnM+ID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGFkZGluZzoge1xuICAgICAgICAgICAgdG9wOiAyLFxuICAgICAgICAgICAgYm90dG9tOiAyLFxuICAgICAgICAgICAgbGVmdDogNSxcbiAgICAgICAgICAgIHJpZ2h0OiA1LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwYWRkaW5nOiA1LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYWRhcHRpdmU6ICFtb3ZlVHJhbnNpdGlvbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0aXBweU1vZGlmaWVyLFxuICAgIF07XG5cbiAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSAmJiBhcnJvdykge1xuICAgICAgbW9kaWZpZXJzLnB1c2goe1xuICAgICAgICBuYW1lOiAnYXJyb3cnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZWxlbWVudDogYXJyb3csXG4gICAgICAgICAgcGFkZGluZzogMyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1vZGlmaWVycy5wdXNoKC4uLihwb3BwZXJPcHRpb25zPy5tb2RpZmllcnMgfHwgW10pKTtcblxuICAgIGluc3RhbmNlLnBvcHBlckluc3RhbmNlID0gY3JlYXRlUG9wcGVyPEV4dGVuZGVkTW9kaWZpZXJzPihcbiAgICAgIGNvbXB1dGVkUmVmZXJlbmNlLFxuICAgICAgcG9wcGVyLFxuICAgICAge1xuICAgICAgICAuLi5wb3BwZXJPcHRpb25zLFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG9uRmlyc3RVcGRhdGUsXG4gICAgICAgIG1vZGlmaWVycyxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveVBvcHBlckluc3RhbmNlKCk6IHZvaWQge1xuICAgIGlmIChpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHthcHBlbmRUb30gPSBpbnN0YW5jZS5wcm9wcztcblxuICAgIGxldCBwYXJlbnROb2RlOiBhbnk7XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB3ZSdsbCBhcHBlbmQgdGhlIHBvcHBlciB0byB0aGUgdHJpZ2dlclRhcmdldHMncyBwYXJlbnROb2RlIHNvXG4gICAgLy8gaXQncyBkaXJlY3RseSBhZnRlciB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgc28gdGhlIGVsZW1lbnRzIGluc2lkZSB0aGVcbiAgICAvLyB0aXBweSBjYW4gYmUgdGFiYmVkIHRvXG4gICAgLy8gSWYgdGhlcmUgYXJlIGNsaXBwaW5nIGlzc3VlcywgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQgYXBwZW5kVG9cbiAgICAvLyBhbmQgZW5zdXJlIGZvY3VzIG1hbmFnZW1lbnQgaXMgaGFuZGxlZCBjb3JyZWN0bHkgbWFudWFsbHlcbiAgICBjb25zdCBub2RlID0gZ2V0Q3VycmVudFRhcmdldCgpO1xuXG4gICAgaWYgKFxuICAgICAgKGluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlICYmIGFwcGVuZFRvID09PSBUSVBQWV9ERUZBVUxUX0FQUEVORF9UTykgfHxcbiAgICAgIGFwcGVuZFRvID09PSAncGFyZW50J1xuICAgICkge1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Tm9kZSA9IGludm9rZVdpdGhBcmdzT3JSZXR1cm4oYXBwZW5kVG8sIFtub2RlXSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHBvcHBlciBlbGVtZW50IG5lZWRzIHRvIGV4aXN0IG9uIHRoZSBET00gYmVmb3JlIGl0cyBwb3NpdGlvbiBjYW4gYmVcbiAgICAvLyB1cGRhdGVkIGFzIFBvcHBlciBuZWVkcyB0byByZWFkIGl0cyBkaW1lbnNpb25zXG4gICAgaWYgKCFwYXJlbnROb2RlLmNvbnRhaW5zKHBvcHBlcikpIHtcbiAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQocG9wcGVyKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQgPSB0cnVlO1xuXG4gICAgY3JlYXRlUG9wcGVySW5zdGFuY2UoKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIC8vIEFjY2Vzc2liaWxpdHkgY2hlY2tcbiAgICAgIHdhcm5XaGVuKFxuICAgICAgICBpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJlxuICAgICAgICAgIGFwcGVuZFRvID09PSBkZWZhdWx0UHJvcHMuYXBwZW5kVG8gJiZcbiAgICAgICAgICBub2RlLm5leHRFbGVtZW50U2libGluZyAhPT0gcG9wcGVyLFxuICAgICAgICBbXG4gICAgICAgICAgJ0ludGVyYWN0aXZlIHRpcHB5IGVsZW1lbnQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlIHZpYSBrZXlib2FyZCcsXG4gICAgICAgICAgJ25hdmlnYXRpb24gYmVjYXVzZSBpdCBpcyBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50JyxcbiAgICAgICAgICAnaW4gdGhlIERPTSBzb3VyY2Ugb3JkZXIuJyxcbiAgICAgICAgICAnXFxuXFxuJyxcbiAgICAgICAgICAnVXNpbmcgYSB3cmFwcGVyIDxkaXY+IG9yIDxzcGFuPiB0YWcgYXJvdW5kIHRoZSByZWZlcmVuY2UgZWxlbWVudCcsXG4gICAgICAgICAgJ3NvbHZlcyB0aGlzIGJ5IGNyZWF0aW5nIGEgbmV3IHBhcmVudE5vZGUgY29udGV4dC4nLFxuICAgICAgICAgICdcXG5cXG4nLFxuICAgICAgICAgICdTcGVjaWZ5aW5nIGBhcHBlbmRUbzogZG9jdW1lbnQuYm9keWAgc2lsZW5jZXMgdGhpcyB3YXJuaW5nLCBidXQgaXQnLFxuICAgICAgICAgICdhc3N1bWVzIHlvdSBhcmUgdXNpbmcgYSBmb2N1cyBtYW5hZ2VtZW50IHNvbHV0aW9uIHRvIGhhbmRsZScsXG4gICAgICAgICAgJ2tleWJvYXJkIG5hdmlnYXRpb24uJyxcbiAgICAgICAgICAnXFxuXFxuJyxcbiAgICAgICAgICAnU2VlOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvYWNjZXNzaWJpbGl0eS8jaW50ZXJhY3Rpdml0eScsXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5lc3RlZFBvcHBlclRyZWUoKTogUG9wcGVyRWxlbWVudFtdIHtcbiAgICByZXR1cm4gYXJyYXlGcm9tKFxuICAgICAgcG9wcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLV9fTkFNRVNQQUNFX1BSRUZJWF9fLXJvb3RdJylcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGVTaG93KGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcblxuICAgIGlmIChldmVudCkge1xuICAgICAgaW52b2tlSG9vaygnb25UcmlnZ2VyJywgW2luc3RhbmNlLCBldmVudF0pO1xuICAgIH1cblxuICAgIGFkZERvY3VtZW50UHJlc3MoKTtcblxuICAgIGxldCBkZWxheSA9IGdldERlbGF5KHRydWUpO1xuICAgIGNvbnN0IFt0b3VjaFZhbHVlLCB0b3VjaERlbGF5XSA9IGdldE5vcm1hbGl6ZWRUb3VjaFNldHRpbmdzKCk7XG5cbiAgICBpZiAoY3VycmVudElucHV0LmlzVG91Y2ggJiYgdG91Y2hWYWx1ZSA9PT0gJ2hvbGQnICYmIHRvdWNoRGVsYXkpIHtcbiAgICAgIGRlbGF5ID0gdG91Y2hEZWxheTtcbiAgICB9XG5cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHNob3dUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlLnNob3coKTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlSGlkZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcblxuICAgIGludm9rZUhvb2soJ29uVW50cmlnZ2VyJywgW2luc3RhbmNlLCBldmVudF0pO1xuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUpIHtcbiAgICAgIHJlbW92ZURvY3VtZW50UHJlc3MoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBpbnRlcmFjdGl2ZSB0aXBwaWVzLCBzY2hlZHVsZUhpZGUgaXMgYWRkZWQgdG8gYSBkb2N1bWVudC5ib2R5IGhhbmRsZXJcbiAgICAvLyBmcm9tIG9uTW91c2VMZWF2ZSBzbyBtdXN0IGludGVyY2VwdCBzY2hlZHVsZWQgaGlkZXMgZnJvbSBtb3VzZW1vdmUvbGVhdmVcbiAgICAvLyBldmVudHMgd2hlbiB0cmlnZ2VyIGNvbnRhaW5zIG1vdXNlZW50ZXIgYW5kIGNsaWNrLCBhbmQgdGhlIHRpcCBpc1xuICAgIC8vIGN1cnJlbnRseSBzaG93biBhcyBhIHJlc3VsdCBvZiBhIGNsaWNrLlxuICAgIGlmIChcbiAgICAgIGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignbW91c2VlbnRlcicpID49IDAgJiZcbiAgICAgIGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignY2xpY2snKSA+PSAwICYmXG4gICAgICBbJ21vdXNlbGVhdmUnLCAnbW91c2Vtb3ZlJ10uaW5kZXhPZihldmVudC50eXBlKSA+PSAwICYmXG4gICAgICBpc1Zpc2libGVGcm9tQ2xpY2tcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxheSA9IGdldERlbGF5KGZhbHNlKTtcblxuICAgIGlmIChkZWxheSkge1xuICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaXhlcyBhIGB0cmFuc2l0aW9uZW5kYCBwcm9ibGVtIHdoZW4gaXQgZmlyZXMgMSBmcmFtZSB0b29cbiAgICAgIC8vIGxhdGUgc29tZXRpbWVzLCB3ZSBkb24ndCB3YW50IGhpZGUoKSB0byBiZSBjYWxsZWQuXG4gICAgICBzY2hlZHVsZUhpZGVBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyDwn5SRIFB1YmxpYyBtZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlbmFibGUoKTogdm9pZCB7XG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGUoKTogdm9pZCB7XG4gICAgLy8gRGlzYWJsaW5nIHRoZSBpbnN0YW5jZSBzaG91bGQgYWxzbyBoaWRlIGl0XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F0b21pa3MvdGlwcHkuanMtcmVhY3QvaXNzdWVzLzEwNlxuICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICBpbnN0YW5jZS5zdGF0ZS5pc0VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyRGVsYXlUaW1lb3V0cygpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoc2hvd1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoc2NoZWR1bGVIaWRlQW5pbWF0aW9uRnJhbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0UHJvcHMocGFydGlhbFByb3BzOiBQYXJ0aWFsPFByb3BzPik6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygnc2V0UHJvcHMnKSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25CZWZvcmVVcGRhdGUnLCBbaW5zdGFuY2UsIHBhcnRpYWxQcm9wc10pO1xuXG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG5cbiAgICBjb25zdCBwcmV2UHJvcHMgPSBpbnN0YW5jZS5wcm9wcztcbiAgICBjb25zdCBuZXh0UHJvcHMgPSBldmFsdWF0ZVByb3BzKHJlZmVyZW5jZSwge1xuICAgICAgLi4ucHJldlByb3BzLFxuICAgICAgLi4ucmVtb3ZlVW5kZWZpbmVkUHJvcHMocGFydGlhbFByb3BzKSxcbiAgICAgIGlnbm9yZUF0dHJpYnV0ZXM6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpbnN0YW5jZS5wcm9wcyA9IG5leHRQcm9wcztcblxuICAgIGFkZExpc3RlbmVycygpO1xuXG4gICAgaWYgKHByZXZQcm9wcy5pbnRlcmFjdGl2ZURlYm91bmNlICE9PSBuZXh0UHJvcHMuaW50ZXJhY3RpdmVEZWJvdW5jZSkge1xuICAgICAgY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKTtcbiAgICAgIGRlYm91bmNlZE9uTW91c2VNb3ZlID0gZGVib3VuY2UoXG4gICAgICAgIG9uTW91c2VNb3ZlLFxuICAgICAgICBuZXh0UHJvcHMuaW50ZXJhY3RpdmVEZWJvdW5jZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgc3RhbGUgYXJpYS1leHBhbmRlZCBhdHRyaWJ1dGVzIGFyZSByZW1vdmVkXG4gICAgaWYgKHByZXZQcm9wcy50cmlnZ2VyVGFyZ2V0ICYmICFuZXh0UHJvcHMudHJpZ2dlclRhcmdldCkge1xuICAgICAgbm9ybWFsaXplVG9BcnJheShwcmV2UHJvcHMudHJpZ2dlclRhcmdldCkuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChuZXh0UHJvcHMudHJpZ2dlclRhcmdldCkge1xuICAgICAgcmVmZXJlbmNlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpO1xuICAgIH1cblxuICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuICAgIGhhbmRsZVN0eWxlcygpO1xuXG4gICAgaWYgKG9uVXBkYXRlKSB7XG4gICAgICBvblVwZGF0ZShwcmV2UHJvcHMsIG5leHRQcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnBvcHBlckluc3RhbmNlKSB7XG4gICAgICBjcmVhdGVQb3BwZXJJbnN0YW5jZSgpO1xuXG4gICAgICAvLyBGaXhlcyBhbiBpc3N1ZSB3aXRoIG5lc3RlZCB0aXBwaWVzIGlmIHRoZXkgYXJlIGFsbCBnZXR0aW5nIHJlLXJlbmRlcmVkLFxuICAgICAgLy8gYW5kIHRoZSBuZXN0ZWQgb25lcyBnZXQgcmUtcmVuZGVyZWQgZmlyc3QuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXRvbWlrcy90aXBweWpzLXJlYWN0L2lzc3Vlcy8xNzdcbiAgICAgIC8vIFRPRE86IGZpbmQgYSBjbGVhbmVyIC8gbW9yZSBlZmZpY2llbnQgc29sdXRpb24oISlcbiAgICAgIGdldE5lc3RlZFBvcHBlclRyZWUoKS5mb3JFYWNoKChuZXN0ZWRQb3BwZXIpID0+IHtcbiAgICAgICAgLy8gUmVhY3QgKGFuZCBvdGhlciBVSSBsaWJzIGxpa2VseSkgcmVxdWlyZXMgYSByQUYgd3JhcHBlciBhcyBpdCBmbHVzaGVzXG4gICAgICAgIC8vIGl0cyB3b3JrIGluIG9uZVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobmVzdGVkUG9wcGVyLl90aXBweSEucG9wcGVySW5zdGFuY2UhLmZvcmNlVXBkYXRlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGludm9rZUhvb2soJ29uQWZ0ZXJVcGRhdGUnLCBbaW5zdGFuY2UsIHBhcnRpYWxQcm9wc10pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Q29udGVudChjb250ZW50OiBDb250ZW50KTogdm9pZCB7XG4gICAgaW5zdGFuY2Uuc2V0UHJvcHMoe2NvbnRlbnR9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3coKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgd2FybldoZW4oaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQsIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKCdzaG93JykpO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IGJhaWwtb3V0XG4gICAgY29uc3QgaXNBbHJlYWR5VmlzaWJsZSA9IGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZTtcbiAgICBjb25zdCBpc0Rlc3Ryb3llZCA9IGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSAhaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkO1xuICAgIGNvbnN0IGlzVG91Y2hBbmRUb3VjaERpc2FibGVkID1cbiAgICAgIGN1cnJlbnRJbnB1dC5pc1RvdWNoICYmICFpbnN0YW5jZS5wcm9wcy50b3VjaDtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGdldFZhbHVlQXRJbmRleE9yUmV0dXJuKFxuICAgICAgaW5zdGFuY2UucHJvcHMuZHVyYXRpb24sXG4gICAgICAwLFxuICAgICAgZGVmYXVsdFByb3BzLmR1cmF0aW9uXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIGlzQWxyZWFkeVZpc2libGUgfHxcbiAgICAgIGlzRGVzdHJveWVkIHx8XG4gICAgICBpc0Rpc2FibGVkIHx8XG4gICAgICBpc1RvdWNoQW5kVG91Y2hEaXNhYmxlZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSBgZGlzYWJsZWRgIGJlaGF2aW9yIGFjcm9zcyBicm93c2Vycy5cbiAgICAvLyBGaXJlZm94IGFsbG93cyBldmVudHMgb24gZGlzYWJsZWQgZWxlbWVudHMsIGJ1dCBDaHJvbWUgZG9lc24ndC5cbiAgICAvLyBVc2luZyBhIHdyYXBwZXIgZWxlbWVudCAoaS5lLiA8c3Bhbj4pIGlzIHJlY29tbWVuZGVkLlxuICAgIGlmIChnZXRDdXJyZW50VGFyZ2V0KCkuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25TaG93JywgW2luc3RhbmNlXSwgZmFsc2UpO1xuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5vblNob3coaW5zdGFuY2UpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSA9IHRydWU7XG5cbiAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSkge1xuICAgICAgcG9wcGVyLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgaGFuZGxlU3R5bGVzKCk7XG4gICAgYWRkRG9jdW1lbnRQcmVzcygpO1xuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgIHBvcHBlci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIElmIGZsaXBwaW5nIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGFmdGVyIGhpZGluZyBhdCBsZWFzdCBvbmNlLCB0aGVcbiAgICAvLyBhbmltYXRpb24gd2lsbCB1c2UgdGhlIHdyb25nIHBsYWNlbWVudCB3aXRob3V0IHJlc2V0dGluZyB0aGUgZHVyYXRpb25cbiAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSkge1xuICAgICAgY29uc3Qge2JveCwgY29udGVudH0gPSBnZXREZWZhdWx0VGVtcGxhdGVDaGlsZHJlbigpO1xuICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKFtib3gsIGNvbnRlbnRdLCAwKTtcbiAgICB9XG5cbiAgICBvbkZpcnN0VXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgfHwgaWdub3JlT25GaXJzdFVwZGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlnbm9yZU9uRmlyc3RVcGRhdGUgPSB0cnVlO1xuXG4gICAgICAvLyByZWZsb3dcbiAgICAgIHZvaWQgcG9wcGVyLm9mZnNldEhlaWdodDtcblxuICAgICAgcG9wcGVyLnN0eWxlLnRyYW5zaXRpb24gPSBpbnN0YW5jZS5wcm9wcy5tb3ZlVHJhbnNpdGlvbjtcblxuICAgICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkgJiYgaW5zdGFuY2UucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHtib3gsIGNvbnRlbnR9ID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKFtib3gsIGNvbnRlbnRdLCBkdXJhdGlvbik7XG4gICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbYm94LCBjb250ZW50XSwgJ3Zpc2libGUnKTtcbiAgICAgIH1cblxuICAgICAgaGFuZGxlQXJpYUNvbnRlbnRBdHRyaWJ1dGUoKTtcbiAgICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuXG4gICAgICBwdXNoSWZVbmlxdWUobW91bnRlZEluc3RhbmNlcywgaW5zdGFuY2UpO1xuXG4gICAgICAvLyBjZXJ0YWluIG1vZGlmaWVycyAoZS5nLiBgbWF4U2l6ZWApIHJlcXVpcmUgYSBzZWNvbmQgdXBkYXRlIGFmdGVyIHRoZVxuICAgICAgLy8gcG9wcGVyIGhhcyBiZWVuIHBvc2l0aW9uZWQgZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAgICBpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZT8uZm9yY2VVcGRhdGUoKTtcblxuICAgICAgaW52b2tlSG9vaygnb25Nb3VudCcsIFtpbnN0YW5jZV0pO1xuXG4gICAgICBpZiAoaW5zdGFuY2UucHJvcHMuYW5pbWF0aW9uICYmIGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgICAgb25UcmFuc2l0aW9uZWRJbihkdXJhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnN0YXRlLmlzU2hvd24gPSB0cnVlO1xuICAgICAgICAgIGludm9rZUhvb2soJ29uU2hvd24nLCBbaW5zdGFuY2VdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIG1vdW50KCk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygnaGlkZScpKTtcbiAgICB9XG5cbiAgICAvLyBFYXJseSBiYWlsLW91dFxuICAgIGNvbnN0IGlzQWxyZWFkeUhpZGRlbiA9ICFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGU7XG4gICAgY29uc3QgaXNEZXN0cm95ZWQgPSBpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZDtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gIWluc3RhbmNlLnN0YXRlLmlzRW5hYmxlZDtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGdldFZhbHVlQXRJbmRleE9yUmV0dXJuKFxuICAgICAgaW5zdGFuY2UucHJvcHMuZHVyYXRpb24sXG4gICAgICAxLFxuICAgICAgZGVmYXVsdFByb3BzLmR1cmF0aW9uXG4gICAgKTtcblxuICAgIGlmIChpc0FscmVhZHlIaWRkZW4gfHwgaXNEZXN0cm95ZWQgfHwgaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGludm9rZUhvb2soJ29uSGlkZScsIFtpbnN0YW5jZV0sIGZhbHNlKTtcbiAgICBpZiAoaW5zdGFuY2UucHJvcHMub25IaWRlKGluc3RhbmNlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBpbnN0YW5jZS5zdGF0ZS5pc1Nob3duID0gZmFsc2U7XG4gICAgaWdub3JlT25GaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICAgIGlzVmlzaWJsZUZyb21DbGljayA9IGZhbHNlO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIHBvcHBlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKTtcbiAgICByZW1vdmVEb2N1bWVudFByZXNzKCk7XG4gICAgaGFuZGxlU3R5bGVzKHRydWUpO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIGNvbnN0IHtib3gsIGNvbnRlbnR9ID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKTtcblxuICAgICAgaWYgKGluc3RhbmNlLnByb3BzLmFuaW1hdGlvbikge1xuICAgICAgICBzZXRUcmFuc2l0aW9uRHVyYXRpb24oW2JveCwgY29udGVudF0sIGR1cmF0aW9uKTtcbiAgICAgICAgc2V0VmlzaWJpbGl0eVN0YXRlKFtib3gsIGNvbnRlbnRdLCAnaGlkZGVuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQXJpYUNvbnRlbnRBdHRyaWJ1dGUoKTtcbiAgICBoYW5kbGVBcmlhRXhwYW5kZWRBdHRyaWJ1dGUoKTtcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5hbmltYXRpb24pIHtcbiAgICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICAgIG9uVHJhbnNpdGlvbmVkT3V0KGR1cmF0aW9uLCBpbnN0YW5jZS51bm1vdW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UudW5tb3VudCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGVXaXRoSW50ZXJhY3Rpdml0eShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKFxuICAgICAgICBpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCxcbiAgICAgICAgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ2hpZGVXaXRoSW50ZXJhY3Rpdml0eScpXG4gICAgICApO1xuICAgIH1cblxuICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZGVib3VuY2VkT25Nb3VzZU1vdmUpO1xuICAgIHB1c2hJZlVuaXF1ZShtb3VzZU1vdmVMaXN0ZW5lcnMsIGRlYm91bmNlZE9uTW91c2VNb3ZlKTtcbiAgICBkZWJvdW5jZWRPbk1vdXNlTW92ZShldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB1bm1vdW50KCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygndW5tb3VudCcpKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZXN0cm95UG9wcGVySW5zdGFuY2UoKTtcblxuICAgIC8vIElmIGEgcG9wcGVyIGlzIG5vdCBpbnRlcmFjdGl2ZSwgaXQgd2lsbCBiZSBhcHBlbmRlZCBvdXRzaWRlIHRoZSBwb3BwZXJcbiAgICAvLyB0cmVlIGJ5IGRlZmF1bHQuIFRoaXMgc2VlbXMgbWFpbmx5IGZvciBpbnRlcmFjdGl2ZSB0aXBwaWVzLCBidXQgd2Ugc2hvdWxkXG4gICAgLy8gZmluZCBhIHdvcmthcm91bmQgaWYgcG9zc2libGVcbiAgICBnZXROZXN0ZWRQb3BwZXJUcmVlKCkuZm9yRWFjaCgobmVzdGVkUG9wcGVyKSA9PiB7XG4gICAgICBuZXN0ZWRQb3BwZXIuX3RpcHB5IS51bm1vdW50KCk7XG4gICAgfSk7XG5cbiAgICBpZiAocG9wcGVyLnBhcmVudE5vZGUpIHtcbiAgICAgIHBvcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHBvcHBlcik7XG4gICAgfVxuXG4gICAgbW91bnRlZEluc3RhbmNlcyA9IG1vdW50ZWRJbnN0YW5jZXMuZmlsdGVyKChpKSA9PiBpICE9PSBpbnN0YW5jZSk7XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQgPSBmYWxzZTtcbiAgICBpbnZva2VIb29rKCdvbkhpZGRlbicsIFtpbnN0YW5jZV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB3YXJuV2hlbihpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCwgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ2Rlc3Ryb3knKSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5zdGFuY2UuY2xlYXJEZWxheVRpbWVvdXRzKCk7XG4gICAgaW5zdGFuY2UudW5tb3VudCgpO1xuXG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG5cbiAgICBkZWxldGUgcmVmZXJlbmNlLl90aXBweTtcblxuICAgIGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIGludm9rZUhvb2soJ29uRGVzdHJveScsIFtpbnN0YW5jZV0pO1xuICB9XG59XG4iLCAiaW1wb3J0IGJpbmRHbG9iYWxFdmVudExpc3RlbmVycywge1xuICBjdXJyZW50SW5wdXQsXG59IGZyb20gJy4vYmluZEdsb2JhbEV2ZW50TGlzdGVuZXJzJztcbmltcG9ydCBjcmVhdGVUaXBweSwge21vdW50ZWRJbnN0YW5jZXN9IGZyb20gJy4vY3JlYXRlVGlwcHknO1xuaW1wb3J0IHtnZXRBcnJheU9mRWxlbWVudHMsIGlzRWxlbWVudCwgaXNSZWZlcmVuY2VFbGVtZW50fSBmcm9tICcuL2RvbS11dGlscyc7XG5pbXBvcnQge2RlZmF1bHRQcm9wcywgc2V0RGVmYXVsdFByb3BzLCB2YWxpZGF0ZVByb3BzfSBmcm9tICcuL3Byb3BzJztcbmltcG9ydCB7SGlkZUFsbCwgSGlkZUFsbE9wdGlvbnMsIEluc3RhbmNlLCBQcm9wcywgVGFyZ2V0c30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3ZhbGlkYXRlVGFyZ2V0cywgd2FybldoZW59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmZ1bmN0aW9uIHRpcHB5KFxuICB0YXJnZXRzOiBUYXJnZXRzLFxuICBvcHRpb25hbFByb3BzOiBQYXJ0aWFsPFByb3BzPiA9IHt9XG4pOiBJbnN0YW5jZSB8IEluc3RhbmNlW10ge1xuICBjb25zdCBwbHVnaW5zID0gZGVmYXVsdFByb3BzLnBsdWdpbnMuY29uY2F0KG9wdGlvbmFsUHJvcHMucGx1Z2lucyB8fCBbXSk7XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKF9fREVWX18pIHtcbiAgICB2YWxpZGF0ZVRhcmdldHModGFyZ2V0cyk7XG4gICAgdmFsaWRhdGVQcm9wcyhvcHRpb25hbFByb3BzLCBwbHVnaW5zKTtcbiAgfVxuXG4gIGJpbmRHbG9iYWxFdmVudExpc3RlbmVycygpO1xuXG4gIGNvbnN0IHBhc3NlZFByb3BzOiBQYXJ0aWFsPFByb3BzPiA9IHsuLi5vcHRpb25hbFByb3BzLCBwbHVnaW5zfTtcblxuICBjb25zdCBlbGVtZW50cyA9IGdldEFycmF5T2ZFbGVtZW50cyh0YXJnZXRzKTtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoX19ERVZfXykge1xuICAgIGNvbnN0IGlzU2luZ2xlQ29udGVudEVsZW1lbnQgPSBpc0VsZW1lbnQocGFzc2VkUHJvcHMuY29udGVudCk7XG4gICAgY29uc3QgaXNNb3JlVGhhbk9uZVJlZmVyZW5jZUVsZW1lbnQgPSBlbGVtZW50cy5sZW5ndGggPiAxO1xuICAgIHdhcm5XaGVuKFxuICAgICAgaXNTaW5nbGVDb250ZW50RWxlbWVudCAmJiBpc01vcmVUaGFuT25lUmVmZXJlbmNlRWxlbWVudCxcbiAgICAgIFtcbiAgICAgICAgJ3RpcHB5KCkgd2FzIHBhc3NlZCBhbiBFbGVtZW50IGFzIHRoZSBgY29udGVudGAgcHJvcCwgYnV0IG1vcmUgdGhhbicsXG4gICAgICAgICdvbmUgdGlwcHkgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgYnkgdGhpcyBpbnZvY2F0aW9uLiBUaGlzIG1lYW5zIHRoZScsXG4gICAgICAgICdjb250ZW50IGVsZW1lbnQgd2lsbCBvbmx5IGJlIGFwcGVuZGVkIHRvIHRoZSBsYXN0IHRpcHB5IGluc3RhbmNlLicsXG4gICAgICAgICdcXG5cXG4nLFxuICAgICAgICAnSW5zdGVhZCwgcGFzcyB0aGUgLmlubmVySFRNTCBvZiB0aGUgZWxlbWVudCwgb3IgdXNlIGEgZnVuY3Rpb24gdGhhdCcsXG4gICAgICAgICdyZXR1cm5zIGEgY2xvbmVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgaW5zdGVhZC4nLFxuICAgICAgICAnXFxuXFxuJyxcbiAgICAgICAgJzEpIGNvbnRlbnQ6IGVsZW1lbnQuaW5uZXJIVE1MXFxuJyxcbiAgICAgICAgJzIpIGNvbnRlbnQ6ICgpID0+IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpJyxcbiAgICAgIF0uam9pbignICcpXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluc3RhbmNlcyA9IGVsZW1lbnRzLnJlZHVjZTxJbnN0YW5jZVtdPihcbiAgICAoYWNjLCByZWZlcmVuY2UpOiBJbnN0YW5jZVtdID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gcmVmZXJlbmNlICYmIGNyZWF0ZVRpcHB5KHJlZmVyZW5jZSwgcGFzc2VkUHJvcHMpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgYWNjLnB1c2goaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICByZXR1cm4gaXNFbGVtZW50KHRhcmdldHMpID8gaW5zdGFuY2VzWzBdIDogaW5zdGFuY2VzO1xufVxuXG50aXBweS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG50aXBweS5zZXREZWZhdWx0UHJvcHMgPSBzZXREZWZhdWx0UHJvcHM7XG50aXBweS5jdXJyZW50SW5wdXQgPSBjdXJyZW50SW5wdXQ7XG5cbmV4cG9ydCBkZWZhdWx0IHRpcHB5O1xuXG5leHBvcnQgY29uc3QgaGlkZUFsbDogSGlkZUFsbCA9ICh7XG4gIGV4Y2x1ZGU6IGV4Y2x1ZGVkUmVmZXJlbmNlT3JJbnN0YW5jZSxcbiAgZHVyYXRpb24sXG59OiBIaWRlQWxsT3B0aW9ucyA9IHt9KSA9PiB7XG4gIG1vdW50ZWRJbnN0YW5jZXMuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICBsZXQgaXNFeGNsdWRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGV4Y2x1ZGVkUmVmZXJlbmNlT3JJbnN0YW5jZSkge1xuICAgICAgaXNFeGNsdWRlZCA9IGlzUmVmZXJlbmNlRWxlbWVudChleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UpXG4gICAgICAgID8gaW5zdGFuY2UucmVmZXJlbmNlID09PSBleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2VcbiAgICAgICAgOiBpbnN0YW5jZS5wb3BwZXIgPT09IChleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UgYXMgSW5zdGFuY2UpLnBvcHBlcjtcbiAgICB9XG5cbiAgICBpZiAoIWlzRXhjbHVkZWQpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRHVyYXRpb24gPSBpbnN0YW5jZS5wcm9wcy5kdXJhdGlvbjtcblxuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe2R1cmF0aW9ufSk7XG4gICAgICBpbnN0YW5jZS5oaWRlKCk7XG5cbiAgICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe2R1cmF0aW9uOiBvcmlnaW5hbER1cmF0aW9ufSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG4iLCAiaW1wb3J0IHRpcHB5IGZyb20gJy4uJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9kb20tdXRpbHMnO1xuaW1wb3J0IHtcbiAgQ3JlYXRlU2luZ2xldG9uLFxuICBQbHVnaW4sXG4gIENyZWF0ZVNpbmdsZXRvblByb3BzLFxuICBSZWZlcmVuY2VFbGVtZW50LFxuICBDcmVhdGVTaW5nbGV0b25JbnN0YW5jZSxcbiAgSW5zdGFuY2UsXG4gIFByb3BzLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge25vcm1hbGl6ZVRvQXJyYXksIHJlbW92ZVByb3BlcnRpZXN9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7ZXJyb3JXaGVufSBmcm9tICcuLi92YWxpZGF0aW9uJztcbmltcG9ydCB7YXBwbHlTdHlsZXMsIE1vZGlmaWVyfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5cbi8vIFRoZSBkZWZhdWx0IGBhcHBseVN0eWxlc2AgbW9kaWZpZXIgaGFzIGEgY2xlYW51cCBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkXG4vLyBldmVyeSB0aW1lIHRoZSBwb3BwZXIgaXMgZGVzdHJveWVkIChpLmUuIGEgbmV3IHRhcmdldCksIHJlbW92aW5nIHRoZSBzdHlsZXNcbi8vIGFuZCBjYXVzaW5nIHRyYW5zaXRpb25zIHRvIGJyZWFrIGZvciBzaW5nbGV0b25zIHdoZW4gdGhlIGNvbnNvbGUgaXMgb3BlbiwgYnV0XG4vLyBtb3N0IG5vdGFibHkgZm9yIG5vbi10cmFuc2Zvcm0gc3R5bGVzIGJlaW5nIHVzZWQsIGBncHVBY2NlbGVyYXRpb246IGZhbHNlYC5cbmNvbnN0IGFwcGx5U3R5bGVzTW9kaWZpZXI6IE1vZGlmaWVyPCdhcHBseVN0eWxlcycsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgLi4uYXBwbHlTdHlsZXMsXG4gIGVmZmVjdCh7c3RhdGV9KSB7XG4gICAgY29uc3QgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICAgIHBvcHBlcjoge1xuICAgICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgbWFyZ2luOiAnMCcsXG4gICAgICB9LFxuICAgICAgYXJyb3c6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB9LFxuICAgICAgcmVmZXJlbmNlOiB7fSxcbiAgICB9O1xuXG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5wb3BwZXIuc3R5bGUsIGluaXRpYWxTdHlsZXMucG9wcGVyKTtcbiAgICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gICAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLmFycm93LnN0eWxlLCBpbml0aWFsU3R5bGVzLmFycm93KTtcbiAgICB9XG5cbiAgICAvLyBpbnRlbnRpb25hbGx5IHJldHVybiBubyBjbGVhbnVwIGZ1bmN0aW9uXG4gICAgLy8gcmV0dXJuICgpID0+IHsgLi4uIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZVNpbmdsZXRvbjogQ3JlYXRlU2luZ2xldG9uID0gKFxuICB0aXBweUluc3RhbmNlcyxcbiAgb3B0aW9uYWxQcm9wcyA9IHt9XG4pID0+IHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKF9fREVWX18pIHtcbiAgICBlcnJvcldoZW4oXG4gICAgICAhQXJyYXkuaXNBcnJheSh0aXBweUluc3RhbmNlcyksXG4gICAgICBbXG4gICAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVNpbmdsZXRvbigpIG11c3QgYmUgYW4gYXJyYXkgb2YnLFxuICAgICAgICAndGlwcHkgaW5zdGFuY2VzLiBUaGUgcGFzc2VkIHZhbHVlIHdhcycsXG4gICAgICAgIFN0cmluZyh0aXBweUluc3RhbmNlcyksXG4gICAgICBdLmpvaW4oJyAnKVxuICAgICk7XG4gIH1cblxuICBsZXQgaW5kaXZpZHVhbEluc3RhbmNlcyA9IHRpcHB5SW5zdGFuY2VzO1xuICBsZXQgcmVmZXJlbmNlczogQXJyYXk8UmVmZXJlbmNlRWxlbWVudD4gPSBbXTtcbiAgbGV0IHRyaWdnZXJUYXJnZXRzOiBBcnJheTxFbGVtZW50PiA9IFtdO1xuICBsZXQgY3VycmVudFRhcmdldDogRWxlbWVudCB8IG51bGw7XG4gIGxldCBvdmVycmlkZXMgPSBvcHRpb25hbFByb3BzLm92ZXJyaWRlcztcbiAgbGV0IGludGVyY2VwdFNldFByb3BzQ2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG4gIGxldCBzaG93bk9uQ3JlYXRlID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gc2V0VHJpZ2dlclRhcmdldHMoKTogdm9pZCB7XG4gICAgdHJpZ2dlclRhcmdldHMgPSBpbmRpdmlkdWFsSW5zdGFuY2VzXG4gICAgICAubWFwKChpbnN0YW5jZSkgPT5cbiAgICAgICAgbm9ybWFsaXplVG9BcnJheShpbnN0YW5jZS5wcm9wcy50cmlnZ2VyVGFyZ2V0IHx8IGluc3RhbmNlLnJlZmVyZW5jZSlcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjLmNvbmNhdChpdGVtKSwgW10pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0UmVmZXJlbmNlcygpOiB2b2lkIHtcbiAgICByZWZlcmVuY2VzID0gaW5kaXZpZHVhbEluc3RhbmNlcy5tYXAoKGluc3RhbmNlKSA9PiBpbnN0YW5jZS5yZWZlcmVuY2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5hYmxlSW5zdGFuY2VzKGlzRW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGluZGl2aWR1YWxJbnN0YW5jZXMuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgaW5zdGFuY2UuZW5hYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcmNlcHRTZXRQcm9wcyhzaW5nbGV0b246IEluc3RhbmNlKTogQXJyYXk8KCkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBpbmRpdmlkdWFsSW5zdGFuY2VzLm1hcCgoaW5zdGFuY2UpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsU2V0UHJvcHMgPSBpbnN0YW5jZS5zZXRQcm9wcztcblxuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMgPSAocHJvcHMpOiB2b2lkID0+IHtcbiAgICAgICAgb3JpZ2luYWxTZXRQcm9wcyhwcm9wcyk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlLnJlZmVyZW5jZSA9PT0gY3VycmVudFRhcmdldCkge1xuICAgICAgICAgIHNpbmdsZXRvbi5zZXRQcm9wcyhwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGluc3RhbmNlLnNldFByb3BzID0gb3JpZ2luYWxTZXRQcm9wcztcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBoYXZlIHRvIHBhc3Mgc2luZ2xldG9uLCBhcyBpdCBtYXliZSB1bmRlZmluZWQgb24gZmlyc3QgY2FsbFxuICBmdW5jdGlvbiBwcmVwYXJlSW5zdGFuY2UoXG4gICAgc2luZ2xldG9uOiBJbnN0YW5jZSxcbiAgICB0YXJnZXQ6IFJlZmVyZW5jZUVsZW1lbnRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0cmlnZ2VyVGFyZ2V0cy5pbmRleE9mKHRhcmdldCk7XG5cbiAgICAvLyBiYWlsLW91dFxuICAgIGlmICh0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgY29uc3Qgb3ZlcnJpZGVQcm9wczogUGFydGlhbDxQcm9wcz4gPSAob3ZlcnJpZGVzIHx8IFtdKVxuICAgICAgLmNvbmNhdCgnY29udGVudCcpXG4gICAgICAucmVkdWNlKChhY2MsIHByb3ApID0+IHtcbiAgICAgICAgKGFjYyBhcyBhbnkpW3Byb3BdID0gaW5kaXZpZHVhbEluc3RhbmNlc1tpbmRleF0ucHJvcHNbcHJvcF07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG5cbiAgICBzaW5nbGV0b24uc2V0UHJvcHMoe1xuICAgICAgLi4ub3ZlcnJpZGVQcm9wcyxcbiAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6XG4gICAgICAgIHR5cGVvZiBvdmVycmlkZVByb3BzLmdldFJlZmVyZW5jZUNsaWVudFJlY3QgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IG92ZXJyaWRlUHJvcHMuZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdFxuICAgICAgICAgIDogKCk6IENsaWVudFJlY3QgPT4gcmVmZXJlbmNlc1tpbmRleF0/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlSW5zdGFuY2VzKGZhbHNlKTtcbiAgc2V0UmVmZXJlbmNlcygpO1xuICBzZXRUcmlnZ2VyVGFyZ2V0cygpO1xuXG4gIGNvbnN0IHBsdWdpbjogUGx1Z2luID0ge1xuICAgIGZuKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAgIGVuYWJsZUluc3RhbmNlcyh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IaWRkZW4oKTogdm9pZCB7XG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xpY2tPdXRzaWRlKGluc3RhbmNlKTogdm9pZCB7XG4gICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzLnNob3dPbkNyZWF0ZSAmJiAhc2hvd25PbkNyZWF0ZSkge1xuICAgICAgICAgICAgc2hvd25PbkNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2hvdyhpbnN0YW5jZSk6IHZvaWQge1xuICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5zaG93T25DcmVhdGUgJiYgIXNob3duT25DcmVhdGUpIHtcbiAgICAgICAgICAgIHNob3duT25DcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcHJlcGFyZUluc3RhbmNlKGluc3RhbmNlLCByZWZlcmVuY2VzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uVHJpZ2dlcihpbnN0YW5jZSwgZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgICBwcmVwYXJlSW5zdGFuY2UoaW5zdGFuY2UsIGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgRWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3Qgc2luZ2xldG9uID0gdGlwcHkoZGl2KCksIHtcbiAgICAuLi5yZW1vdmVQcm9wZXJ0aWVzKG9wdGlvbmFsUHJvcHMsIFsnb3ZlcnJpZGVzJ10pLFxuICAgIHBsdWdpbnM6IFtwbHVnaW4sIC4uLihvcHRpb25hbFByb3BzLnBsdWdpbnMgfHwgW10pXSxcbiAgICB0cmlnZ2VyVGFyZ2V0OiB0cmlnZ2VyVGFyZ2V0cyxcbiAgICBwb3BwZXJPcHRpb25zOiB7XG4gICAgICAuLi5vcHRpb25hbFByb3BzLnBvcHBlck9wdGlvbnMsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgLi4uKG9wdGlvbmFsUHJvcHMucG9wcGVyT3B0aW9ucz8ubW9kaWZpZXJzIHx8IFtdKSxcbiAgICAgICAgYXBwbHlTdHlsZXNNb2RpZmllcixcbiAgICAgIF0sXG4gICAgfSxcbiAgfSkgYXMgQ3JlYXRlU2luZ2xldG9uSW5zdGFuY2U8Q3JlYXRlU2luZ2xldG9uUHJvcHM+O1xuXG4gIGNvbnN0IG9yaWdpbmFsU2hvdyA9IHNpbmdsZXRvbi5zaG93O1xuXG4gIHNpbmdsZXRvbi5zaG93ID0gKHRhcmdldD86IFJlZmVyZW5jZUVsZW1lbnQgfCBJbnN0YW5jZSB8IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIG9yaWdpbmFsU2hvdygpO1xuXG4gICAgLy8gZmlyc3QgdGltZSwgc2hvd09uQ3JlYXRlIG9yIHByb2dyYW1tYXRpYyBjYWxsIHdpdGggbm8gcGFyYW1zXG4gICAgLy8gZGVmYXVsdCB0byBzaG93aW5nIGZpcnN0IGluc3RhbmNlXG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0ICYmIHRhcmdldCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcHJlcGFyZUluc3RhbmNlKHNpbmdsZXRvbiwgcmVmZXJlbmNlc1swXSk7XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlcmVkIGZyb20gZXZlbnQgKGRvIG5vdGhpbmcgYXMgcHJlcGFyZUluc3RhbmNlIGFscmVhZHkgY2FsbGVkIGJ5IG9uVHJpZ2dlcilcbiAgICAvLyBwcm9ncmFtbWF0aWMgY2FsbCB3aXRoIG5vIHBhcmFtcyB3aGVuIGFscmVhZHkgdmlzaWJsZSAoZG8gbm90aGluZyBhZ2FpbilcbiAgICBpZiAoY3VycmVudFRhcmdldCAmJiB0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRhcmdldCBpcyBpbmRleCBvZiBpbnN0YW5jZVxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgcmVmZXJlbmNlc1t0YXJnZXRdICYmIHByZXBhcmVJbnN0YW5jZShzaW5nbGV0b24sIHJlZmVyZW5jZXNbdGFyZ2V0XSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdGFyZ2V0IGlzIGEgY2hpbGQgdGlwcHkgaW5zdGFuY2VcbiAgICBpZiAoaW5kaXZpZHVhbEluc3RhbmNlcy5pbmRleE9mKHRhcmdldCBhcyBJbnN0YW5jZSkgPj0gMCkge1xuICAgICAgY29uc3QgcmVmID0gKHRhcmdldCBhcyBJbnN0YW5jZSkucmVmZXJlbmNlO1xuICAgICAgcmV0dXJuIHByZXBhcmVJbnN0YW5jZShzaW5nbGV0b24sIHJlZik7XG4gICAgfVxuXG4gICAgLy8gdGFyZ2V0IGlzIGEgUmVmZXJlbmNlRWxlbWVudFxuICAgIGlmIChyZWZlcmVuY2VzLmluZGV4T2YodGFyZ2V0IGFzIFJlZmVyZW5jZUVsZW1lbnQpID49IDApIHtcbiAgICAgIHJldHVybiBwcmVwYXJlSW5zdGFuY2Uoc2luZ2xldG9uLCB0YXJnZXQgYXMgUmVmZXJlbmNlRWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIHNpbmdsZXRvbi5zaG93TmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBmaXJzdCA9IHJlZmVyZW5jZXNbMF07XG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2luZ2xldG9uLnNob3coMCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gcmVmZXJlbmNlcy5pbmRleE9mKGN1cnJlbnRUYXJnZXQpO1xuICAgIHNpbmdsZXRvbi5zaG93KHJlZmVyZW5jZXNbaW5kZXggKyAxXSB8fCBmaXJzdCk7XG4gIH07XG5cbiAgc2luZ2xldG9uLnNob3dQcmV2aW91cyA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBsYXN0ID0gcmVmZXJlbmNlc1tyZWZlcmVuY2VzLmxlbmd0aCAtIDFdO1xuICAgIGlmICghY3VycmVudFRhcmdldCkge1xuICAgICAgcmV0dXJuIHNpbmdsZXRvbi5zaG93KGxhc3QpO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHJlZmVyZW5jZXMuaW5kZXhPZihjdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCB0YXJnZXQgPSByZWZlcmVuY2VzW2luZGV4IC0gMV0gfHwgbGFzdDtcbiAgICBzaW5nbGV0b24uc2hvdyh0YXJnZXQpO1xuICB9O1xuXG4gIGNvbnN0IG9yaWdpbmFsU2V0UHJvcHMgPSBzaW5nbGV0b24uc2V0UHJvcHM7XG5cbiAgc2luZ2xldG9uLnNldFByb3BzID0gKHByb3BzKTogdm9pZCA9PiB7XG4gICAgb3ZlcnJpZGVzID0gcHJvcHMub3ZlcnJpZGVzIHx8IG92ZXJyaWRlcztcbiAgICBvcmlnaW5hbFNldFByb3BzKHByb3BzKTtcbiAgfTtcblxuICBzaW5nbGV0b24uc2V0SW5zdGFuY2VzID0gKG5leHRJbnN0YW5jZXMpOiB2b2lkID0+IHtcbiAgICBlbmFibGVJbnN0YW5jZXModHJ1ZSk7XG4gICAgaW50ZXJjZXB0U2V0UHJvcHNDbGVhbnVwcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cbiAgICBpbmRpdmlkdWFsSW5zdGFuY2VzID0gbmV4dEluc3RhbmNlcztcblxuICAgIGVuYWJsZUluc3RhbmNlcyhmYWxzZSk7XG4gICAgc2V0UmVmZXJlbmNlcygpO1xuICAgIHNldFRyaWdnZXJUYXJnZXRzKCk7XG4gICAgaW50ZXJjZXB0U2V0UHJvcHNDbGVhbnVwcyA9IGludGVyY2VwdFNldFByb3BzKHNpbmdsZXRvbik7XG5cbiAgICBzaW5nbGV0b24uc2V0UHJvcHMoe3RyaWdnZXJUYXJnZXQ6IHRyaWdnZXJUYXJnZXRzfSk7XG4gIH07XG5cbiAgaW50ZXJjZXB0U2V0UHJvcHNDbGVhbnVwcyA9IGludGVyY2VwdFNldFByb3BzKHNpbmdsZXRvbik7XG5cbiAgcmV0dXJuIHNpbmdsZXRvbjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVNpbmdsZXRvbjtcbiIsICJpbXBvcnQgdGlwcHkgZnJvbSAnLi4nO1xuaW1wb3J0IHtUT1VDSF9PUFRJT05TfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtkZWZhdWx0UHJvcHN9IGZyb20gJy4uL3Byb3BzJztcbmltcG9ydCB7SW5zdGFuY2UsIFByb3BzLCBUYXJnZXRzfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0xpc3RlbmVyT2JqZWN0fSBmcm9tICcuLi90eXBlcy1pbnRlcm5hbCc7XG5pbXBvcnQge25vcm1hbGl6ZVRvQXJyYXksIHJlbW92ZVByb3BlcnRpZXN9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7ZXJyb3JXaGVufSBmcm9tICcuLi92YWxpZGF0aW9uJztcblxuY29uc3QgQlVCQkxJTkdfRVZFTlRTX01BUCA9IHtcbiAgbW91c2VvdmVyOiAnbW91c2VlbnRlcicsXG4gIGZvY3VzaW46ICdmb2N1cycsXG4gIGNsaWNrOiAnY2xpY2snLFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVsZWdhdGUgaW5zdGFuY2UgdGhhdCBjb250cm9scyB0aGUgY3JlYXRpb24gb2YgdGlwcHkgaW5zdGFuY2VzXG4gKiBmb3IgY2hpbGQgZWxlbWVudHMgKGB0YXJnZXRgIENTUyBzZWxlY3RvcikuXG4gKi9cbmZ1bmN0aW9uIGRlbGVnYXRlKFxuICB0YXJnZXRzOiBUYXJnZXRzLFxuICBwcm9wczogUGFydGlhbDxQcm9wcz4gJiB7dGFyZ2V0OiBzdHJpbmd9XG4pOiBJbnN0YW5jZSB8IEluc3RhbmNlW10ge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoX19ERVZfXykge1xuICAgIGVycm9yV2hlbihcbiAgICAgICEocHJvcHMgJiYgcHJvcHMudGFyZ2V0KSxcbiAgICAgIFtcbiAgICAgICAgJ1lvdSBtdXN0IHNwZWNpdHkgYSBgdGFyZ2V0YCBwcm9wIGluZGljYXRpbmcgYSBDU1Mgc2VsZWN0b3Igc3RyaW5nIG1hdGNoaW5nJyxcbiAgICAgICAgJ3RoZSB0YXJnZXQgZWxlbWVudHMgdGhhdCBzaG91bGQgcmVjZWl2ZSBhIHRpcHB5LicsXG4gICAgICBdLmpvaW4oJyAnKVxuICAgICk7XG4gIH1cblxuICBsZXQgbGlzdGVuZXJzOiBMaXN0ZW5lck9iamVjdFtdID0gW107XG4gIGxldCBjaGlsZFRpcHB5SW5zdGFuY2VzOiBJbnN0YW5jZVtdID0gW107XG4gIGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHt0YXJnZXR9ID0gcHJvcHM7XG5cbiAgY29uc3QgbmF0aXZlUHJvcHMgPSByZW1vdmVQcm9wZXJ0aWVzKHByb3BzLCBbJ3RhcmdldCddKTtcbiAgY29uc3QgcGFyZW50UHJvcHMgPSB7Li4ubmF0aXZlUHJvcHMsIHRyaWdnZXI6ICdtYW51YWwnLCB0b3VjaDogZmFsc2V9O1xuICBjb25zdCBjaGlsZFByb3BzID0ge1xuICAgIHRvdWNoOiBkZWZhdWx0UHJvcHMudG91Y2gsXG4gICAgLi4ubmF0aXZlUHJvcHMsXG4gICAgc2hvd09uQ3JlYXRlOiB0cnVlLFxuICB9O1xuXG4gIGNvbnN0IHJldHVyblZhbHVlID0gdGlwcHkodGFyZ2V0cywgcGFyZW50UHJvcHMpO1xuICBjb25zdCBub3JtYWxpemVkUmV0dXJuVmFsdWUgPSBub3JtYWxpemVUb0FycmF5KHJldHVyblZhbHVlKTtcblxuICBmdW5jdGlvbiBvblRyaWdnZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFldmVudC50YXJnZXQgfHwgZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXROb2RlID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5jbG9zZXN0KHRhcmdldCk7XG5cbiAgICBpZiAoIXRhcmdldE5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgcmVsZXZhbnQgdHJpZ2dlciB3aXRoIGZhbGxiYWNrczpcbiAgICAvLyAxLiBDaGVjayBgZGF0YS10aXBweS10cmlnZ2VyYCBhdHRyaWJ1dGUgb24gdGFyZ2V0IG5vZGVcbiAgICAvLyAyLiBGYWxsYmFjayB0byBgdHJpZ2dlcmAgcGFzc2VkIHRvIGBkZWxlZ2F0ZSgpYFxuICAgIC8vIDMuIEZhbGxiYWNrIHRvIGBkZWZhdWx0UHJvcHMudHJpZ2dlcmBcbiAgICBjb25zdCB0cmlnZ2VyID1cbiAgICAgIHRhcmdldE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LXRyaWdnZXInKSB8fFxuICAgICAgcHJvcHMudHJpZ2dlciB8fFxuICAgICAgZGVmYXVsdFByb3BzLnRyaWdnZXI7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHRhcmdldE5vZGUuX3RpcHB5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0JyAmJiB0eXBlb2YgY2hpbGRQcm9wcy50b3VjaCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXZlbnQudHlwZSAhPT0gJ3RvdWNoc3RhcnQnICYmXG4gICAgICB0cmlnZ2VyLmluZGV4T2YoKEJVQkJMSU5HX0VWRU5UU19NQVAgYXMgYW55KVtldmVudC50eXBlXSkgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aXBweSh0YXJnZXROb2RlLCBjaGlsZFByb3BzKTtcblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2hpbGRUaXBweUluc3RhbmNlcyA9IGNoaWxkVGlwcHlJbnN0YW5jZXMuY29uY2F0KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbihcbiAgICBub2RlOiBFbGVtZW50LFxuICAgIGV2ZW50VHlwZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIsXG4gICAgb3B0aW9uczogYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgbGlzdGVuZXJzLnB1c2goe25vZGUsIGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9uc30pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnMoaW5zdGFuY2U6IEluc3RhbmNlKTogdm9pZCB7XG4gICAgY29uc3Qge3JlZmVyZW5jZX0gPSBpbnN0YW5jZTtcblxuICAgIG9uKHJlZmVyZW5jZSwgJ3RvdWNoc3RhcnQnLCBvblRyaWdnZXIsIFRPVUNIX09QVElPTlMpO1xuICAgIG9uKHJlZmVyZW5jZSwgJ21vdXNlb3ZlcicsIG9uVHJpZ2dlcik7XG4gICAgb24ocmVmZXJlbmNlLCAnZm9jdXNpbicsIG9uVHJpZ2dlcik7XG4gICAgb24ocmVmZXJlbmNlLCAnY2xpY2snLCBvblRyaWdnZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKHtub2RlLCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnN9OiBMaXN0ZW5lck9iamVjdCkgPT4ge1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseU11dGF0aW9ucyhpbnN0YW5jZTogSW5zdGFuY2UpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBpbnN0YW5jZS5kZXN0cm95O1xuICAgIGNvbnN0IG9yaWdpbmFsRW5hYmxlID0gaW5zdGFuY2UuZW5hYmxlO1xuICAgIGNvbnN0IG9yaWdpbmFsRGlzYWJsZSA9IGluc3RhbmNlLmRpc2FibGU7XG5cbiAgICBpbnN0YW5jZS5kZXN0cm95ID0gKHNob3VsZERlc3Ryb3lDaGlsZEluc3RhbmNlcyA9IHRydWUpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzaG91bGREZXN0cm95Q2hpbGRJbnN0YW5jZXMpIHtcbiAgICAgICAgY2hpbGRUaXBweUluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGlwcHlJbnN0YW5jZXMgPSBbXTtcblxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgIH07XG5cbiAgICBpbnN0YW5jZS5lbmFibGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBvcmlnaW5hbEVuYWJsZSgpO1xuICAgICAgY2hpbGRUaXBweUluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuZW5hYmxlKCkpO1xuICAgICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgaW5zdGFuY2UuZGlzYWJsZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIG9yaWdpbmFsRGlzYWJsZSgpO1xuICAgICAgY2hpbGRUaXBweUluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuZGlzYWJsZSgpKTtcbiAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcnMoaW5zdGFuY2UpO1xuICB9XG5cbiAgbm9ybWFsaXplZFJldHVyblZhbHVlLmZvckVhY2goYXBwbHlNdXRhdGlvbnMpO1xuXG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVsZWdhdGU7XG4iLCAiaW1wb3J0IHtCQUNLRFJPUF9DTEFTU30gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7ZGl2LCBzZXRWaXNpYmlsaXR5U3RhdGV9IGZyb20gJy4uL2RvbS11dGlscyc7XG5pbXBvcnQge2dldENoaWxkcmVufSBmcm9tICcuLi90ZW1wbGF0ZSc7XG5pbXBvcnQge0FuaW1hdGVGaWxsfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Vycm9yV2hlbn0gZnJvbSAnLi4vdmFsaWRhdGlvbic7XG5cbmNvbnN0IGFuaW1hdGVGaWxsOiBBbmltYXRlRmlsbCA9IHtcbiAgbmFtZTogJ2FuaW1hdGVGaWxsJyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm4oaW5zdGFuY2UpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCFpbnN0YW5jZS5wcm9wcy5yZW5kZXI/LiQkdGlwcHkpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIGVycm9yV2hlbihcbiAgICAgICAgICBpbnN0YW5jZS5wcm9wcy5hbmltYXRlRmlsbCxcbiAgICAgICAgICAnVGhlIGBhbmltYXRlRmlsbGAgcGx1Z2luIHJlcXVpcmVzIHRoZSBkZWZhdWx0IHJlbmRlciBmdW5jdGlvbi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCB7Ym94LCBjb250ZW50fSA9IGdldENoaWxkcmVuKGluc3RhbmNlLnBvcHBlcik7XG5cbiAgICBjb25zdCBiYWNrZHJvcCA9IGluc3RhbmNlLnByb3BzLmFuaW1hdGVGaWxsXG4gICAgICA/IGNyZWF0ZUJhY2tkcm9wRWxlbWVudCgpXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb25DcmVhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmIChiYWNrZHJvcCkge1xuICAgICAgICAgIGJveC5pbnNlcnRCZWZvcmUoYmFja2Ryb3AsIGJveC5maXJzdEVsZW1lbnRDaGlsZCEpO1xuICAgICAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0ZWZpbGwnLCAnJyk7XG4gICAgICAgICAgYm94LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7YXJyb3c6IGZhbHNlLCBhbmltYXRpb246ICdzaGlmdC1hd2F5J30pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Nb3VudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICAgICAgY29uc3Qge3RyYW5zaXRpb25EdXJhdGlvbn0gPSBib3guc3R5bGU7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBOdW1iZXIodHJhbnNpdGlvbkR1cmF0aW9uLnJlcGxhY2UoJ21zJywgJycpKTtcblxuICAgICAgICAgIC8vIFRoZSBjb250ZW50IHNob3VsZCBmYWRlIGluIGFmdGVyIHRoZSBiYWNrZHJvcCBoYXMgbW9zdGx5IGZpbGxlZCB0aGVcbiAgICAgICAgICAvLyB0b29sdGlwIGVsZW1lbnQuIGBjbGlwLXBhdGhgIGlzIHRoZSBvdGhlciBhbHRlcm5hdGl2ZSBidXQgaXMgbm90XG4gICAgICAgICAgLy8gd2VsbC1zdXBwb3J0ZWQgYW5kIGlzIGJ1Z2d5IG9uIHNvbWUgZGV2aWNlcy5cbiAgICAgICAgICBjb250ZW50LnN0eWxlLnRyYW5zaXRpb25EZWxheSA9IGAke01hdGgucm91bmQoZHVyYXRpb24gLyAxMCl9bXNgO1xuXG4gICAgICAgICAgYmFja2Ryb3Auc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uO1xuICAgICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbYmFja2Ryb3BdLCAndmlzaWJsZScpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25TaG93KCk6IHZvaWQge1xuICAgICAgICBpZiAoYmFja2Ryb3ApIHtcbiAgICAgICAgICBiYWNrZHJvcC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnMG1zJztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uSGlkZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICAgICAgc2V0VmlzaWJpbGl0eVN0YXRlKFtiYWNrZHJvcF0sICdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgYW5pbWF0ZUZpbGw7XG5cbmZ1bmN0aW9uIGNyZWF0ZUJhY2tkcm9wRWxlbWVudCgpOiBIVE1MRGl2RWxlbWVudCB7XG4gIGNvbnN0IGJhY2tkcm9wID0gZGl2KCk7XG4gIGJhY2tkcm9wLmNsYXNzTmFtZSA9IEJBQ0tEUk9QX0NMQVNTO1xuICBzZXRWaXNpYmlsaXR5U3RhdGUoW2JhY2tkcm9wXSwgJ2hpZGRlbicpO1xuICByZXR1cm4gYmFja2Ryb3A7XG59XG4iLCAiaW1wb3J0IHtnZXRPd25lckRvY3VtZW50LCBpc01vdXNlRXZlbnR9IGZyb20gJy4uL2RvbS11dGlscyc7XG5pbXBvcnQge0ZvbGxvd0N1cnNvciwgSW5zdGFuY2V9IGZyb20gJy4uL3R5cGVzJztcblxubGV0IG1vdXNlQ29vcmRzID0ge2NsaWVudFg6IDAsIGNsaWVudFk6IDB9O1xubGV0IGFjdGl2ZUluc3RhbmNlczogQXJyYXk8e2luc3RhbmNlOiBJbnN0YW5jZTsgZG9jOiBEb2N1bWVudH0+ID0gW107XG5cbmZ1bmN0aW9uIHN0b3JlTW91c2VDb29yZHMoe2NsaWVudFgsIGNsaWVudFl9OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gIG1vdXNlQ29vcmRzID0ge2NsaWVudFgsIGNsaWVudFl9O1xufVxuXG5mdW5jdGlvbiBhZGRNb3VzZUNvb3Jkc0xpc3RlbmVyKGRvYzogRG9jdW1lbnQpOiB2b2lkIHtcbiAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0b3JlTW91c2VDb29yZHMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVNb3VzZUNvb3Jkc0xpc3RlbmVyKGRvYzogRG9jdW1lbnQpOiB2b2lkIHtcbiAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0b3JlTW91c2VDb29yZHMpO1xufVxuXG5jb25zdCBmb2xsb3dDdXJzb3I6IEZvbGxvd0N1cnNvciA9IHtcbiAgbmFtZTogJ2ZvbGxvd0N1cnNvcicsXG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGZuKGluc3RhbmNlKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gaW5zdGFuY2UucmVmZXJlbmNlO1xuICAgIGNvbnN0IGRvYyA9IGdldE93bmVyRG9jdW1lbnQoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpO1xuXG4gICAgbGV0IGlzSW50ZXJuYWxVcGRhdGUgPSBmYWxzZTtcbiAgICBsZXQgd2FzRm9jdXNFdmVudCA9IGZhbHNlO1xuICAgIGxldCBpc1VubW91bnRlZCA9IHRydWU7XG4gICAgbGV0IHByZXZQcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNJbml0aWFsQmVoYXZpb3IoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IgPT09ICdpbml0aWFsJyAmJiBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnNldEdldFJlZmVyZW5jZUNsaWVudFJlY3QoKTogdm9pZCB7XG4gICAgICBpc0ludGVybmFsVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGluc3RhbmNlLnNldFByb3BzKHtnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBudWxsfSk7XG4gICAgICBpc0ludGVybmFsVXBkYXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgIC8vIElmIHRoZSBpbnN0YW5jZSBpcyBpbnRlcmFjdGl2ZSwgYXZvaWQgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHVubGVzcyBpdCdzXG4gICAgICAvLyBvdmVyIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICAgICAgY29uc3QgaXNDdXJzb3JPdmVyUmVmZXJlbmNlID0gZXZlbnQudGFyZ2V0XG4gICAgICAgID8gcmVmZXJlbmNlLmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKVxuICAgICAgICA6IHRydWU7XG4gICAgICBjb25zdCB7Zm9sbG93Q3Vyc29yfSA9IGluc3RhbmNlLnByb3BzO1xuICAgICAgY29uc3Qge2NsaWVudFgsIGNsaWVudFl9ID0gZXZlbnQ7XG5cbiAgICAgIGNvbnN0IHJlY3QgPSByZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVggPSBjbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgICAgY29uc3QgcmVsYXRpdmVZID0gY2xpZW50WSAtIHJlY3QudG9wO1xuXG4gICAgICBpZiAoaXNDdXJzb3JPdmVyUmVmZXJlbmNlIHx8ICFpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIHVubmVlZGVkIERPTVJlY3QgcHJvcGVydGllc1xuICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3QoKSB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBsZXQgeCA9IGNsaWVudFg7XG4gICAgICAgICAgICBsZXQgeSA9IGNsaWVudFk7XG5cbiAgICAgICAgICAgIGlmIChmb2xsb3dDdXJzb3IgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgICB4ID0gcmVjdC5sZWZ0ICsgcmVsYXRpdmVYO1xuICAgICAgICAgICAgICB5ID0gcmVjdC50b3AgKyByZWxhdGl2ZVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IGZvbGxvd0N1cnNvciA9PT0gJ2hvcml6b250YWwnID8gcmVjdC50b3AgOiB5O1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBmb2xsb3dDdXJzb3IgPT09ICd2ZXJ0aWNhbCcgPyByZWN0LnJpZ2h0IDogeDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGZvbGxvd0N1cnNvciA9PT0gJ2hvcml6b250YWwnID8gcmVjdC5ib3R0b20gOiB5O1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGZvbGxvd0N1cnNvciA9PT0gJ3ZlcnRpY2FsJyA/IHJlY3QubGVmdCA6IHg7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHdpZHRoOiByaWdodCAtIGxlZnQsXG4gICAgICAgICAgICAgIGhlaWdodDogYm90dG9tIC0gdG9wLFxuICAgICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IpIHtcbiAgICAgICAgYWN0aXZlSW5zdGFuY2VzLnB1c2goe2luc3RhbmNlLCBkb2N9KTtcbiAgICAgICAgYWRkTW91c2VDb29yZHNMaXN0ZW5lcihkb2MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBhY3RpdmVJbnN0YW5jZXMgPSBhY3RpdmVJbnN0YW5jZXMuZmlsdGVyKFxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5pbnN0YW5jZSAhPT0gaW5zdGFuY2VcbiAgICAgICk7XG5cbiAgICAgIGlmIChhY3RpdmVJbnN0YW5jZXMuZmlsdGVyKChkYXRhKSA9PiBkYXRhLmRvYyA9PT0gZG9jKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTW91c2VDb29yZHNMaXN0ZW5lcihkb2MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvbkNyZWF0ZTogY3JlYXRlLFxuICAgICAgb25EZXN0cm95OiBkZXN0cm95LFxuICAgICAgb25CZWZvcmVVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIHByZXZQcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuICAgICAgfSxcbiAgICAgIG9uQWZ0ZXJVcGRhdGUoXywge2ZvbGxvd0N1cnNvcn0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzSW50ZXJuYWxVcGRhdGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9sbG93Q3Vyc29yICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBwcmV2UHJvcHMuZm9sbG93Q3Vyc29yICE9PSBmb2xsb3dDdXJzb3JcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGVzdHJveSgpO1xuXG4gICAgICAgICAgaWYgKGZvbGxvd0N1cnNvcikge1xuICAgICAgICAgICAgY3JlYXRlKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkICYmXG4gICAgICAgICAgICAgICF3YXNGb2N1c0V2ZW50ICYmXG4gICAgICAgICAgICAgICFnZXRJc0luaXRpYWxCZWhhdmlvcigpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYWRkTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIHVuc2V0R2V0UmVmZXJlbmNlQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uTW91bnQoKTogdm9pZCB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IgJiYgIXdhc0ZvY3VzRXZlbnQpIHtcbiAgICAgICAgICBpZiAoaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgIG9uTW91c2VNb3ZlKG1vdXNlQ29vcmRzIGFzIE1vdXNlRXZlbnQpO1xuICAgICAgICAgICAgaXNVbm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWdldElzSW5pdGlhbEJlaGF2aW9yKCkpIHtcbiAgICAgICAgICAgIGFkZExpc3RlbmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25UcmlnZ2VyKF8sIGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChpc01vdXNlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgbW91c2VDb29yZHMgPSB7Y2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WX07XG4gICAgICAgIH1cbiAgICAgICAgd2FzRm9jdXNFdmVudCA9IGV2ZW50LnR5cGUgPT09ICdmb2N1cyc7XG4gICAgICB9LFxuICAgICAgb25IaWRkZW4oKTogdm9pZCB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IpIHtcbiAgICAgICAgICB1bnNldEdldFJlZmVyZW5jZUNsaWVudFJlY3QoKTtcbiAgICAgICAgICByZW1vdmVMaXN0ZW5lcigpO1xuICAgICAgICAgIGlzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9sbG93Q3Vyc29yO1xuIiwgImltcG9ydCB7TW9kaWZpZXIsIFBsYWNlbWVudH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuaW1wb3J0IHtpc01vdXNlRXZlbnR9IGZyb20gJy4uL2RvbS11dGlscyc7XG5pbXBvcnQge0Jhc2VQbGFjZW1lbnQsIElubGluZVBvc2l0aW9uaW5nLCBQcm9wc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthcnJheUZyb20sIGdldEJhc2VQbGFjZW1lbnR9IGZyb20gJy4uL3V0aWxzJztcblxuZnVuY3Rpb24gZ2V0UHJvcHMocHJvcHM6IFByb3BzLCBtb2RpZmllcjogTW9kaWZpZXI8YW55LCBhbnk+KTogUGFydGlhbDxQcm9wcz4ge1xuICByZXR1cm4ge1xuICAgIHBvcHBlck9wdGlvbnM6IHtcbiAgICAgIC4uLnByb3BzLnBvcHBlck9wdGlvbnMsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgLi4uKHByb3BzLnBvcHBlck9wdGlvbnM/Lm1vZGlmaWVycyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICh7bmFtZX0pID0+IG5hbWUgIT09IG1vZGlmaWVyLm5hbWVcbiAgICAgICAgKSxcbiAgICAgICAgbW9kaWZpZXIsXG4gICAgICBdLFxuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGlubGluZVBvc2l0aW9uaW5nOiBJbmxpbmVQb3NpdGlvbmluZyA9IHtcbiAgbmFtZTogJ2lubGluZVBvc2l0aW9uaW5nJyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm4oaW5zdGFuY2UpIHtcbiAgICBjb25zdCB7cmVmZXJlbmNlfSA9IGluc3RhbmNlO1xuXG4gICAgZnVuY3Rpb24gaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhaW5zdGFuY2UucHJvcHMuaW5saW5lUG9zaXRpb25pbmc7XG4gICAgfVxuXG4gICAgbGV0IHBsYWNlbWVudDogUGxhY2VtZW50O1xuICAgIGxldCBjdXJzb3JSZWN0SW5kZXggPSAtMTtcbiAgICBsZXQgaXNJbnRlcm5hbFVwZGF0ZSA9IGZhbHNlO1xuICAgIGxldCB0cmllZFBsYWNlbWVudHM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGNvbnN0IG1vZGlmaWVyOiBNb2RpZmllcjxcbiAgICAgICd0aXBweUlubGluZVBvc2l0aW9uaW5nJyxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgPiA9IHtcbiAgICAgIG5hbWU6ICd0aXBweUlubGluZVBvc2l0aW9uaW5nJyxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2FmdGVyV3JpdGUnLFxuICAgICAgZm4oe3N0YXRlfSkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICBpZiAodHJpZWRQbGFjZW1lbnRzLmluZGV4T2Yoc3RhdGUucGxhY2VtZW50KSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRyaWVkUGxhY2VtZW50cyA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBsYWNlbWVudCAhPT0gc3RhdGUucGxhY2VtZW50ICYmXG4gICAgICAgICAgICB0cmllZFBsYWNlbWVudHMuaW5kZXhPZihzdGF0ZS5wbGFjZW1lbnQpID09PSAtMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdHJpZWRQbGFjZW1lbnRzLnB1c2goc3RhdGUucGxhY2VtZW50KTtcbiAgICAgICAgICAgIGluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIHVubmVlZGVkIERPTVJlY3QgcHJvcGVydGllc1xuICAgICAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiAoKSA9PlxuICAgICAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Qoc3RhdGUucGxhY2VtZW50KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBsYWNlbWVudCA9IHN0YXRlLnBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdChwbGFjZW1lbnQ6IFBsYWNlbWVudCk6IFBhcnRpYWw8RE9NUmVjdD4ge1xuICAgICAgcmV0dXJuIGdldElubGluZUJvdW5kaW5nQ2xpZW50UmVjdChcbiAgICAgICAgZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpLFxuICAgICAgICByZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIGFycmF5RnJvbShyZWZlcmVuY2UuZ2V0Q2xpZW50UmVjdHMoKSksXG4gICAgICAgIGN1cnNvclJlY3RJbmRleFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRJbnRlcm5hbFByb3BzKHBhcnRpYWxQcm9wczogUGFydGlhbDxQcm9wcz4pOiB2b2lkIHtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSB0cnVlO1xuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMocGFydGlhbFByb3BzKTtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRNb2RpZmllcigpOiB2b2lkIHtcbiAgICAgIGlmICghaXNJbnRlcm5hbFVwZGF0ZSkge1xuICAgICAgICBzZXRJbnRlcm5hbFByb3BzKGdldFByb3BzKGluc3RhbmNlLnByb3BzLCBtb2RpZmllcikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvbkNyZWF0ZTogYWRkTW9kaWZpZXIsXG4gICAgICBvbkFmdGVyVXBkYXRlOiBhZGRNb2RpZmllcixcbiAgICAgIG9uVHJpZ2dlcihfLCBldmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgIGNvbnN0IHJlY3RzID0gYXJyYXlGcm9tKGluc3RhbmNlLnJlZmVyZW5jZS5nZXRDbGllbnRSZWN0cygpKTtcbiAgICAgICAgICBjb25zdCBjdXJzb3JSZWN0ID0gcmVjdHMuZmluZChcbiAgICAgICAgICAgIChyZWN0KSA9PlxuICAgICAgICAgICAgICByZWN0LmxlZnQgLSAyIDw9IGV2ZW50LmNsaWVudFggJiZcbiAgICAgICAgICAgICAgcmVjdC5yaWdodCArIDIgPj0gZXZlbnQuY2xpZW50WCAmJlxuICAgICAgICAgICAgICByZWN0LnRvcCAtIDIgPD0gZXZlbnQuY2xpZW50WSAmJlxuICAgICAgICAgICAgICByZWN0LmJvdHRvbSArIDIgPj0gZXZlbnQuY2xpZW50WVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSByZWN0cy5pbmRleE9mKGN1cnNvclJlY3QpO1xuICAgICAgICAgIGN1cnNvclJlY3RJbmRleCA9IGluZGV4ID4gLTEgPyBpbmRleCA6IGN1cnNvclJlY3RJbmRleDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uSGlkZGVuKCk6IHZvaWQge1xuICAgICAgICBjdXJzb3JSZWN0SW5kZXggPSAtMTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZVBvc2l0aW9uaW5nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5saW5lQm91bmRpbmdDbGllbnRSZWN0KFxuICBjdXJyZW50QmFzZVBsYWNlbWVudDogQmFzZVBsYWNlbWVudCB8IG51bGwsXG4gIGJvdW5kaW5nUmVjdDogRE9NUmVjdCxcbiAgY2xpZW50UmVjdHM6IERPTVJlY3RbXSxcbiAgY3Vyc29yUmVjdEluZGV4OiBudW1iZXJcbik6IHtcbiAgdG9wOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG4gIHJpZ2h0OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufSB7XG4gIC8vIE5vdCBhbiBpbmxpbmUgZWxlbWVudCwgb3IgcGxhY2VtZW50IGlzIG5vdCB5ZXQga25vd25cbiAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA8IDIgfHwgY3VycmVudEJhc2VQbGFjZW1lbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gYm91bmRpbmdSZWN0O1xuICB9XG5cbiAgLy8gVGhlcmUgYXJlIHR3byByZWN0cyBhbmQgdGhleSBhcmUgZGlzam9pbmVkXG4gIGlmIChcbiAgICBjbGllbnRSZWN0cy5sZW5ndGggPT09IDIgJiZcbiAgICBjdXJzb3JSZWN0SW5kZXggPj0gMCAmJlxuICAgIGNsaWVudFJlY3RzWzBdLmxlZnQgPiBjbGllbnRSZWN0c1sxXS5yaWdodFxuICApIHtcbiAgICByZXR1cm4gY2xpZW50UmVjdHNbY3Vyc29yUmVjdEluZGV4XSB8fCBib3VuZGluZ1JlY3Q7XG4gIH1cblxuICBzd2l0Y2ggKGN1cnJlbnRCYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICBjb25zdCBmaXJzdFJlY3QgPSBjbGllbnRSZWN0c1swXTtcbiAgICAgIGNvbnN0IGxhc3RSZWN0ID0gY2xpZW50UmVjdHNbY2xpZW50UmVjdHMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBpc1RvcCA9IGN1cnJlbnRCYXNlUGxhY2VtZW50ID09PSAndG9wJztcblxuICAgICAgY29uc3QgdG9wID0gZmlyc3RSZWN0LnRvcDtcbiAgICAgIGNvbnN0IGJvdHRvbSA9IGxhc3RSZWN0LmJvdHRvbTtcbiAgICAgIGNvbnN0IGxlZnQgPSBpc1RvcCA/IGZpcnN0UmVjdC5sZWZ0IDogbGFzdFJlY3QubGVmdDtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gaXNUb3AgPyBmaXJzdFJlY3QucmlnaHQgOiBsYXN0UmVjdC5yaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuXG4gICAgICByZXR1cm4ge3RvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgd2lkdGgsIGhlaWdodH07XG4gICAgfVxuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0Jzoge1xuICAgICAgY29uc3QgbWluTGVmdCA9IE1hdGgubWluKC4uLmNsaWVudFJlY3RzLm1hcCgocmVjdHMpID0+IHJlY3RzLmxlZnQpKTtcbiAgICAgIGNvbnN0IG1heFJpZ2h0ID0gTWF0aC5tYXgoLi4uY2xpZW50UmVjdHMubWFwKChyZWN0cykgPT4gcmVjdHMucmlnaHQpKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVSZWN0cyA9IGNsaWVudFJlY3RzLmZpbHRlcigocmVjdCkgPT5cbiAgICAgICAgY3VycmVudEJhc2VQbGFjZW1lbnQgPT09ICdsZWZ0J1xuICAgICAgICAgID8gcmVjdC5sZWZ0ID09PSBtaW5MZWZ0XG4gICAgICAgICAgOiByZWN0LnJpZ2h0ID09PSBtYXhSaWdodFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdG9wID0gbWVhc3VyZVJlY3RzWzBdLnRvcDtcbiAgICAgIGNvbnN0IGJvdHRvbSA9IG1lYXN1cmVSZWN0c1ttZWFzdXJlUmVjdHMubGVuZ3RoIC0gMV0uYm90dG9tO1xuICAgICAgY29uc3QgbGVmdCA9IG1pbkxlZnQ7XG4gICAgICBjb25zdCByaWdodCA9IG1heFJpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG5cbiAgICAgIHJldHVybiB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCB3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1ZpcnR1YWxFbGVtZW50fSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5pbXBvcnQge1JlZmVyZW5jZUVsZW1lbnQsIFN0aWNreX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBzdGlja3k6IFN0aWNreSA9IHtcbiAgbmFtZTogJ3N0aWNreScsXG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGZuKGluc3RhbmNlKSB7XG4gICAgY29uc3Qge3JlZmVyZW5jZSwgcG9wcGVyfSA9IGluc3RhbmNlO1xuXG4gICAgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKCk6IFJlZmVyZW5jZUVsZW1lbnQgfCBWaXJ0dWFsRWxlbWVudCB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucG9wcGVySW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZS5zdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2VcbiAgICAgICAgOiByZWZlcmVuY2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hvdWxkQ2hlY2sodmFsdWU6ICdyZWZlcmVuY2UnIHwgJ3BvcHBlcicpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9wcy5zdGlja3kgPT09IHRydWUgfHwgaW5zdGFuY2UucHJvcHMuc3RpY2t5ID09PSB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgcHJldlJlZlJlY3Q6IENsaWVudFJlY3QgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcHJldlBvcFJlY3Q6IENsaWVudFJlY3QgfCBudWxsID0gbnVsbDtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFJlZlJlY3QgPSBzaG91bGRDaGVjaygncmVmZXJlbmNlJylcbiAgICAgICAgPyBnZXRSZWZlcmVuY2UoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBjdXJyZW50UG9wUmVjdCA9IHNob3VsZENoZWNrKCdwb3BwZXInKVxuICAgICAgICA/IHBvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKGN1cnJlbnRSZWZSZWN0ICYmIGFyZVJlY3RzRGlmZmVyZW50KHByZXZSZWZSZWN0LCBjdXJyZW50UmVmUmVjdCkpIHx8XG4gICAgICAgIChjdXJyZW50UG9wUmVjdCAmJiBhcmVSZWN0c0RpZmZlcmVudChwcmV2UG9wUmVjdCwgY3VycmVudFBvcFJlY3QpKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZSkge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlckluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZSZWZSZWN0ID0gY3VycmVudFJlZlJlY3Q7XG4gICAgICBwcmV2UG9wUmVjdCA9IGN1cnJlbnRQb3BSZWN0O1xuXG4gICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGVQb3NpdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9uTW91bnQoKTogdm9pZCB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5zdGlja3kpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzdGlja3k7XG5cbmZ1bmN0aW9uIGFyZVJlY3RzRGlmZmVyZW50KFxuICByZWN0QTogQ2xpZW50UmVjdCB8IG51bGwsXG4gIHJlY3RCOiBDbGllbnRSZWN0IHwgbnVsbFxuKTogYm9vbGVhbiB7XG4gIGlmIChyZWN0QSAmJiByZWN0Qikge1xuICAgIHJldHVybiAoXG4gICAgICByZWN0QS50b3AgIT09IHJlY3RCLnRvcCB8fFxuICAgICAgcmVjdEEucmlnaHQgIT09IHJlY3RCLnJpZ2h0IHx8XG4gICAgICByZWN0QS5ib3R0b20gIT09IHJlY3RCLmJvdHRvbSB8fFxuICAgICAgcmVjdEEubGVmdCAhPT0gcmVjdEIubGVmdFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICJpbXBvcnQgdGlwcHkgZnJvbSAnLi4vc3JjJztcbmltcG9ydCB7cmVuZGVyfSBmcm9tICcuLi9zcmMvdGVtcGxhdGUnO1xuXG50aXBweS5zZXREZWZhdWx0UHJvcHMoe3JlbmRlcn0pO1xuXG5leHBvcnQge2RlZmF1bHQsIGhpZGVBbGx9IGZyb20gJy4uL3NyYyc7XG5leHBvcnQge2RlZmF1bHQgYXMgY3JlYXRlU2luZ2xldG9ufSBmcm9tICcuLi9zcmMvYWRkb25zL2NyZWF0ZVNpbmdsZXRvbic7XG5leHBvcnQge2RlZmF1bHQgYXMgZGVsZWdhdGV9IGZyb20gJy4uL3NyYy9hZGRvbnMvZGVsZWdhdGUnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFuaW1hdGVGaWxsfSBmcm9tICcuLi9zcmMvcGx1Z2lucy9hbmltYXRlRmlsbCc7XG5leHBvcnQge2RlZmF1bHQgYXMgZm9sbG93Q3Vyc29yfSBmcm9tICcuLi9zcmMvcGx1Z2lucy9mb2xsb3dDdXJzb3InO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGlubGluZVBvc2l0aW9uaW5nfSBmcm9tICcuLi9zcmMvcGx1Z2lucy9pbmxpbmVQb3NpdGlvbmluZyc7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RpY2t5fSBmcm9tICcuLi9zcmMvcGx1Z2lucy9zdGlja3knO1xuZXhwb3J0IHtST1VORF9BUlJPVyBhcyByb3VuZEFycm93fSBmcm9tICcuLi9zcmMvY29uc3RhbnRzJztcbiIsICJpbXBvcnQge1BsdWdpbiwgUGx1Z2luS2V5fSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHRpcHB5IGZyb20gJ3RpcHB5LmpzJ1xuaW1wb3J0IHtcbiAgICBFZGl0b3IsIGlzTm9kZVNlbGVjdGlvbiwgaXNUZXh0U2VsZWN0aW9uLCBwb3NUb0RPTVJlY3QsXG59IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuXG5leHBvcnQgY2xhc3MgQnViYmxlTWVudVZpZXcge1xuXG4gICAgc2hvdWxkU2hvdyA9ICh7dmlldywgc3RhdGUsIGZyb20sIHRvfSkgPT4ge1xuICAgICAgICBjb25zdCB7ZG9jLCBzZWxlY3Rpb259ID0gc3RhdGVcbiAgICAgICAgY29uc3Qge2VtcHR5fSA9IHNlbGVjdGlvblxuXG4gICAgICAgIC8vIFNvbWV0aW1lIGNoZWNrIGZvciBgZW1wdHlgIGlzIG5vdCBlbm91Z2guXG4gICAgICAgIC8vIERvdWJsZWNsaWNrIGFuIGVtcHR5IHBhcmFncmFwaCByZXR1cm5zIGEgbm9kZSBzaXplIG9mIDIuXG4gICAgICAgIC8vIFNvIHdlIGNoZWNrIGFsc28gZm9yIGFuIGVtcHR5IHRleHQgc2l6ZS5cbiAgICAgICAgY29uc3QgaXNFbXB0eVRleHRCbG9jayA9ICFkb2MudGV4dEJldHdlZW4oZnJvbSwgdG8pLmxlbmd0aCAmJiBpc1RleHRTZWxlY3Rpb24oc3RhdGUuc2VsZWN0aW9uKVxuXG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgb24gYSBlbGVtZW50IGluc2lkZSB0aGUgYnViYmxlIG1lbnUgdGhlIGVkaXRvciBcImJsdXJcIiBldmVudFxuICAgICAgICAvLyBpcyBjYWxsZWQgYW5kIHRoZSBidWJibGUgbWVudSBpdGVtIGlzIGZvY3Vzc2VkLiBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkXG4gICAgICAgIC8vIGNvbnNpZGVyIHRoZSBtZW51IGFzIHBhcnQgb2YgdGhlIGVkaXRvciBhbmQga2VlcCBzaG93aW5nIHRoZSBtZW51XG4gICAgICAgIGNvbnN0IGlzQ2hpbGRPZk1lbnUgPSB0aGlzLmVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcblxuICAgICAgICBjb25zdCBoYXNFZGl0b3JGb2N1cyA9IHZpZXcuaGFzRm9jdXMoKSB8fCBpc0NoaWxkT2ZNZW51XG5cbiAgICAgICAgcmV0dXJuICEoIWhhc0VkaXRvckZvY3VzIHx8IGVtcHR5IHx8IGlzRW1wdHlUZXh0QmxvY2sgfHwgIXRoaXMuZWRpdG9yLmlzRWRpdGFibGUpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHtlZGl0b3IsIGVsZW1lbnQsIHZpZXcsIHRpcHB5T3B0aW9ucyA9IHt9LCB1cGRhdGVEZWxheSA9IDI1MCwgc2hvdWxkU2hvd30pIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3JcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgICAgIHRoaXMudXBkYXRlRGVsYXkgPSB1cGRhdGVEZWxheVxuXG4gICAgICAgIGlmIChzaG91bGRTaG93KSB7XG4gICAgICAgICAgICB0aGlzLnNob3VsZFNob3cgPSBzaG91bGRTaG93XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5tb3VzZWRvd25IYW5kbGVyLCB7Y2FwdHVyZTogdHJ1ZX0pXG4gICAgICAgIHRoaXMudmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5kcmFnc3RhcnRIYW5kbGVyKVxuICAgICAgICB0aGlzLmVkaXRvci5vbignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JsdXInLCB0aGlzLmJsdXJIYW5kbGVyKVxuICAgICAgICB0aGlzLnRpcHB5T3B0aW9ucyA9IHRpcHB5T3B0aW9uc1xuICAgICAgICAvLyBEZXRhY2hlcyBtZW51IGNvbnRlbnQgZnJvbSBpdHMgY3VycmVudCBwYXJlbnRcbiAgICAgICAgLy8gdGhpcy5lbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbidcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgIH1cblxuICAgIG1vdXNlZG93bkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJldmVudEhpZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgZHJhZ3N0YXJ0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICB9XG5cbiAgICBmb2N1c0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIHdlIHVzZSBgc2V0VGltZW91dGAgdG8gbWFrZSBzdXJlIGBzZWxlY3Rpb25gIGlzIGFscmVhZHkgdXBkYXRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlKHRoaXMuZWRpdG9yLnZpZXcpKVxuICAgIH1cblxuICAgIGJsdXJIYW5kbGVyID0gKHtldmVudH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudEhpZGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmVudEhpZGUgPSBmYWxzZVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudD8ucmVsYXRlZFRhcmdldCAmJiB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZT8uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICB9XG5cbiAgICB0aXBweUJsdXJIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuYmx1ckhhbmRsZXIoe2V2ZW50fSlcbiAgICB9XG5cbiAgICBjcmVhdGVUb29sdGlwKCkge1xuICAgICAgICBjb25zdCB7ZWxlbWVudDogZWRpdG9yRWxlbWVudH0gPSB0aGlzLmVkaXRvci5vcHRpb25zXG4gICAgICAgIGNvbnN0IGVkaXRvcklzQXR0YWNoZWQgPSAhIWVkaXRvckVsZW1lbnQucGFyZW50RWxlbWVudFxuXG4gICAgICAgIGlmICh0aGlzLnRpcHB5IHx8ICFlZGl0b3JJc0F0dGFjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGlwcHkgPSB0aXBweShlZGl0b3JFbGVtZW50LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IG51bGwsXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6ICdtYW51YWwnLFxuICAgICAgICAgICAgcGxhY2VtZW50OiAndG9wJyxcbiAgICAgICAgICAgIGhpZGVPbkNsaWNrOiAndG9nZ2xlJyxcbiAgICAgICAgICAgIC4uLnRoaXMudGlwcHlPcHRpb25zLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIG1heWJlIHdlIGhhdmUgdG8gaGlkZSB0aXBweSBvbiBpdHMgb3duIGJsdXIgZXZlbnQgYXMgd2VsbFxuICAgICAgICBpZiAodGhpcy50aXBweS5wb3BwZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgKHRoaXMudGlwcHkucG9wcGVyLmZpcnN0Q2hpbGQpLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnRpcHB5Qmx1ckhhbmRsZXIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUodmlldywgb2xkU3RhdGUpIHtcbiAgICAgICAgY29uc3Qge3N0YXRlfSA9IHZpZXdcbiAgICAgICAgY29uc3QgaGFzVmFsaWRTZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb24uJGZyb20ucG9zICE9PSBzdGF0ZS5zZWxlY3Rpb24uJHRvLnBvc1xuXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZURlbGF5ID4gMCAmJiBoYXNWYWxpZFNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEZWJvdW5jZWRVcGRhdGUodmlldywgb2xkU3RhdGUpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNoYW5nZWQgPSAhb2xkU3RhdGU/LnNlbGVjdGlvbi5lcSh2aWV3LnN0YXRlLnNlbGVjdGlvbilcbiAgICAgICAgY29uc3QgZG9jQ2hhbmdlZCA9ICFvbGRTdGF0ZT8uZG9jLmVxKHZpZXcuc3RhdGUuZG9jKVxuXG4gICAgICAgIHRoaXMudXBkYXRlSGFuZGxlcih2aWV3LCBzZWxlY3Rpb25DaGFuZ2VkLCBkb2NDaGFuZ2VkLCBvbGRTdGF0ZSlcbiAgICB9XG5cbiAgICBoYW5kbGVEZWJvdW5jZWRVcGRhdGUgPSAodmlldywgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uQ2hhbmdlZCA9ICFvbGRTdGF0ZT8uc2VsZWN0aW9uLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uKVxuICAgICAgICBjb25zdCBkb2NDaGFuZ2VkID0gIW9sZFN0YXRlPy5kb2MuZXEodmlldy5zdGF0ZS5kb2MpXG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb25DaGFuZ2VkICYmICFkb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZURlYm91bmNlVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZURlYm91bmNlVGltZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZURlYm91bmNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhhbmRsZXIodmlldywgc2VsZWN0aW9uQ2hhbmdlZCwgZG9jQ2hhbmdlZCwgb2xkU3RhdGUpXG4gICAgICAgIH0sIHRoaXMudXBkYXRlRGVsYXkpXG4gICAgfVxuXG4gICAgdXBkYXRlSGFuZGxlciA9ICh2aWV3LCBzZWxlY3Rpb25DaGFuZ2VkLCBkb2NDaGFuZ2VkLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB7c3RhdGUsIGNvbXBvc2luZ30gPSB2aWV3XG4gICAgICAgIGNvbnN0IHtzZWxlY3Rpb259ID0gc3RhdGVcblxuICAgICAgICBjb25zdCBpc1NhbWUgPSAhc2VsZWN0aW9uQ2hhbmdlZCAmJiAhZG9jQ2hhbmdlZFxuXG4gICAgICAgIGlmIChjb21wb3NpbmcgfHwgaXNTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcCgpXG5cbiAgICAgICAgLy8gc3VwcG9ydCBmb3IgQ2VsbFNlbGVjdGlvbnNcbiAgICAgICAgY29uc3Qge3Jhbmdlc30gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgZnJvbSA9IE1hdGgubWluKC4uLnJhbmdlcy5tYXAocmFuZ2UgPT4gcmFuZ2UuJGZyb20ucG9zKSlcbiAgICAgICAgY29uc3QgdG8gPSBNYXRoLm1heCguLi5yYW5nZXMubWFwKHJhbmdlID0+IHJhbmdlLiR0by5wb3MpKVxuXG4gICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSB0aGlzLnNob3VsZFNob3c/Lih7XG4gICAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgdmlldyxcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgb2xkU3RhdGUsXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG8sXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFzaG91bGRTaG93KSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uJGFuY2hvci5wb3MgIT09IG9sZFN0YXRlPy5zZWxlY3Rpb24uJGFuY2hvci5wb3MpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHZpZXcsIHN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGlwcHk/LnNldFByb3BzKHtcbiAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy50aXBweU9wdGlvbnM/LmdldFJlZmVyZW5jZUNsaWVudFJlY3RcbiAgICAgICAgICAgICAgICB8fCAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb2RlU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gdmlldy5ub2RlRE9NKGZyb20pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVWaWV3V3JhcHBlciA9IG5vZGUuZGF0YXNldC5ub2RlVmlld1dyYXBwZXIgPyBub2RlIDogbm9kZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1ub2RlLXZpZXctd3JhcHBlcl0nKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZpZXdXcmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVWaWV3V3JhcHBlci5maXJzdENoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NUb0RPTVJlY3QodmlldywgZnJvbSwgdG8pXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5zaG93KClcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnXG4gICAgICAgIHRoaXMudGlwcHk/LnNob3coKVxuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJ1xuICAgICAgICB0aGlzLnRpcHB5Py5oaWRlKClcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy50aXBweT8ucG9wcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICh0aGlzLnRpcHB5LnBvcHBlci5maXJzdENoaWxkKS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdibHVyJyxcbiAgICAgICAgICAgICAgICB0aGlzLnRpcHB5Qmx1ckhhbmRsZXIsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXBweT8uZGVzdHJveSgpXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm1vdXNlZG93bkhhbmRsZXIsIHtjYXB0dXJlOiB0cnVlfSlcbiAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmRyYWdzdGFydEhhbmRsZXIpXG4gICAgICAgIHRoaXMuZWRpdG9yLm9mZignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub2ZmKCdibHVyJywgdGhpcy5ibHVySGFuZGxlcilcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBCdWJibGVNZW51UGx1Z2luID0gKG9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAgICAgIGtleTogdHlwZW9mIG9wdGlvbnMucGx1Z2luS2V5ID09PSAnc3RyaW5nJyA/IG5ldyBQbHVnaW5LZXkob3B0aW9ucy5wbHVnaW5LZXkpIDogb3B0aW9ucy5wbHVnaW5LZXksXG4gICAgICAgIHZpZXc6IHZpZXcgPT4gbmV3IEJ1YmJsZU1lbnVWaWV3KHt2aWV3LCAuLi5vcHRpb25zfSksXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCJcblxuaW1wb3J0IHsgQnViYmxlTWVudVBsdWdpbiB9IGZyb20gXCIuLi9wbHVnaW5zL0J1YmJsZU1lbnVQbHVnaW5cIlxuXG5leHBvcnQgY29uc3QgQnViYmxlTWVudSA9IEV4dGVuc2lvbi5jcmVhdGUoe1xuICAgIG5hbWU6IFwiYnViYmxlTWVudVwiLFxuXG4gICAgYWRkT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICB0aXBweU9wdGlvbnM6IHt9LFxuICAgICAgICAgICAgcGx1Z2luS2V5OiBcImJ1YmJsZU1lbnVcIixcbiAgICAgICAgICAgIHVwZGF0ZURlbGF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzaG91bGRTaG93OiBudWxsXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIEJ1YmJsZU1lbnVQbHVnaW4oe1xuICAgICAgICAgICAgICAgIHBsdWdpbktleTogdGhpcy5vcHRpb25zLnBsdWdpbktleSxcbiAgICAgICAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMub3B0aW9ucy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczogdGhpcy5vcHRpb25zLnRpcHB5T3B0aW9ucyxcbiAgICAgICAgICAgICAgICB1cGRhdGVEZWxheTogdGhpcy5vcHRpb25zLnVwZGF0ZURlbGF5LFxuICAgICAgICAgICAgICAgIHNob3VsZFNob3c6IHRoaXMub3B0aW9ucy5zaG91bGRTaG93XG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfVxufSkiLCAiaW1wb3J0IHsgRWRpdG9yLCBwb3NUb0RPTVJlY3QgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBQbHVnaW4sIFBsdWdpbktleSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgdGlwcHkgZnJvbSAndGlwcHkuanMnXG5cbmV4cG9ydCBjbGFzcyBGbG9hdGluZ01lbnVWaWV3IHtcblxuICAgIHNob3VsZFNob3cgPSAoeyB2aWV3LCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBzdGF0ZVxuICAgICAgICBjb25zdCB7ICRhbmNob3IsIGVtcHR5IH0gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaXNSb290RGVwdGggPSAkYW5jaG9yLmRlcHRoID09PSAxXG4gICAgICAgIGNvbnN0IGlzRW1wdHlUZXh0QmxvY2sgPSAkYW5jaG9yLnBhcmVudC5pc1RleHRibG9jayAmJiAhJGFuY2hvci5wYXJlbnQudHlwZS5zcGVjLmNvZGUgJiYgISRhbmNob3IucGFyZW50LnRleHRDb250ZW50XG5cbiAgICAgICAgcmV0dXJuICEoIXZpZXcuaGFzRm9jdXMoKVxuICAgICAgICAgICAgfHwgIWVtcHR5XG4gICAgICAgICAgICB8fCAhaXNSb290RGVwdGhcbiAgICAgICAgICAgIHx8ICFpc0VtcHR5VGV4dEJsb2NrXG4gICAgICAgICAgICB8fCAhdGhpcy5lZGl0b3IuaXNFZGl0YWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoeyBlZGl0b3IsIGVsZW1lbnQsIHZpZXcsIHRpcHB5T3B0aW9ucyA9IHt9LCBzaG91bGRTaG93IH0pIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3JcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3XG5cbiAgICAgICAgaWYgKHNob3VsZFNob3cpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkU2hvdyA9IHNob3VsZFNob3dcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm1vdXNlZG93bkhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KVxuICAgICAgICB0aGlzLmVkaXRvci5vbignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JsdXInLCB0aGlzLmJsdXJIYW5kbGVyKVxuICAgICAgICB0aGlzLnRpcHB5T3B0aW9ucyA9IHRpcHB5T3B0aW9uc1xuICAgICAgICAvLyBEZXRhY2hlcyBtZW51IGNvbnRlbnQgZnJvbSBpdHMgY3VycmVudCBwYXJlbnRcbiAgICAgICAgLy8gdGhpcy5lbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbidcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgIH1cblxuICAgIG1vdXNlZG93bkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJldmVudEhpZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgZm9jdXNIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAvLyB3ZSB1c2UgYHNldFRpbWVvdXRgIHRvIG1ha2Ugc3VyZSBgc2VsZWN0aW9uYCBpcyBhbHJlYWR5IHVwZGF0ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZSh0aGlzLmVkaXRvci52aWV3KSlcbiAgICB9XG5cbiAgICBibHVySGFuZGxlciA9ICh7IGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudEhpZGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmVudEhpZGUgPSBmYWxzZVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudD8ucmVsYXRlZFRhcmdldCAmJiB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZT8uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICB9XG5cbiAgICB0aXBweUJsdXJIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuYmx1ckhhbmRsZXIoeyBldmVudCB9KVxuICAgIH1cblxuICAgIGNyZWF0ZVRvb2x0aXAoKSB7XG4gICAgICAgIGNvbnN0IHsgZWxlbWVudDogZWRpdG9yRWxlbWVudCB9ID0gdGhpcy5lZGl0b3Iub3B0aW9uc1xuICAgICAgICBjb25zdCBlZGl0b3JJc0F0dGFjaGVkID0gISFlZGl0b3JFbGVtZW50LnBhcmVudEVsZW1lbnRcblxuICAgICAgICBpZiAodGhpcy50aXBweSB8fCAhZWRpdG9ySXNBdHRhY2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpcHB5ID0gdGlwcHkoZWRpdG9yRWxlbWVudCwge1xuICAgICAgICAgICAgZHVyYXRpb246IDAsXG4gICAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBudWxsLFxuICAgICAgICAgICAgY29udGVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB0cmlnZ2VyOiAnbWFudWFsJyxcbiAgICAgICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgICAgICAgICAgIGhpZGVPbkNsaWNrOiAndG9nZ2xlJyxcbiAgICAgICAgICAgIC4uLnRoaXMudGlwcHlPcHRpb25zLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIG1heWJlIHdlIGhhdmUgdG8gaGlkZSB0aXBweSBvbiBpdHMgb3duIGJsdXIgZXZlbnQgYXMgd2VsbFxuICAgICAgICBpZiAodGhpcy50aXBweS5wb3BwZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgKHRoaXMudGlwcHkucG9wcGVyLmZpcnN0Q2hpbGQpLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnRpcHB5Qmx1ckhhbmRsZXIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUodmlldywgb2xkU3RhdGUpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdmlld1xuICAgICAgICBjb25zdCB7IGRvYywgc2VsZWN0aW9uIH0gPSBzdGF0ZVxuICAgICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaXNTYW1lID0gb2xkU3RhdGUgJiYgb2xkU3RhdGUuZG9jLmVxKGRvYykgJiYgb2xkU3RhdGUuc2VsZWN0aW9uLmVxKHNlbGVjdGlvbilcblxuICAgICAgICBpZiAoaXNTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcCgpXG5cbiAgICAgICAgY29uc3Qgc2hvdWxkU2hvdyA9IHRoaXMuc2hvdWxkU2hvdz8uKHtcbiAgICAgICAgICAgIGVkaXRvcjogdGhpcy5lZGl0b3IsXG4gICAgICAgICAgICB2aWV3LFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBvbGRTdGF0ZSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIXNob3VsZFNob3cpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpXG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aXBweT8uc2V0UHJvcHMoe1xuICAgICAgICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDpcbiAgICAgICAgICAgICAgICB0aGlzLnRpcHB5T3B0aW9ucz8uZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCB8fCAoKCkgPT4gcG9zVG9ET01SZWN0KHZpZXcsIGZyb20sIHRvKSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5zaG93KClcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnXG4gICAgICAgIHRoaXMudGlwcHk/LnNob3coKVxuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMudGlwcHk/LmhpZGUoKVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnRpcHB5Py5wb3BwZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgKHRoaXMudGlwcHkucG9wcGVyLmZpcnN0Q2hpbGQpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ2JsdXInLFxuICAgICAgICAgICAgICAgIHRoaXMudGlwcHlCbHVySGFuZGxlcixcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpcHB5Py5kZXN0cm95KClcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2Vkb3duSGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuZWRpdG9yLm9mZignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub2ZmKCdibHVyJywgdGhpcy5ibHVySGFuZGxlcilcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBGbG9hdGluZ01lbnVQbHVnaW4gPSAob3B0aW9ucykgPT4ge1xuICAgIHJldHVybiBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OlxuICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMucGx1Z2luS2V5ID09PSAnc3RyaW5nJyA/IG5ldyBQbHVnaW5LZXkob3B0aW9ucy5wbHVnaW5LZXkpIDogb3B0aW9ucy5wbHVnaW5LZXksXG4gICAgICAgIHZpZXc6IHZpZXcgPT4gbmV3IEZsb2F0aW5nTWVudVZpZXcoeyB2aWV3LCAuLi5vcHRpb25zIH0pLFxuICAgIH0pXG59IiwgImltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuaW1wb3J0IHsgRmxvYXRpbmdNZW51UGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2lucy9GbG9hdGluZ01lbnVQbHVnaW4nXG5cbmV4cG9ydCBjb25zdCBGbG9hdGluZ01lbnUgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgICBuYW1lOiAnZmxvYXRpbmdNZW51JyxcblxuICAgIGFkZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgdGlwcHlPcHRpb25zOiB7fSxcbiAgICAgICAgICAgIHBsdWdpbktleTogJ2Zsb2F0aW5nTWVudScsXG4gICAgICAgICAgICBzaG91bGRTaG93OiBudWxsLFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgRmxvYXRpbmdNZW51UGx1Z2luKHtcbiAgICAgICAgICAgICAgICBwbHVnaW5LZXk6IHRoaXMub3B0aW9ucy5wbHVnaW5LZXksXG4gICAgICAgICAgICAgICAgZWRpdG9yOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLm9wdGlvbnMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICB0aXBweU9wdGlvbnM6IHRoaXMub3B0aW9ucy50aXBweU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvdzogdGhpcy5vcHRpb25zLnNob3VsZFNob3csXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgIH0sXG59KSIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlQnVpbGRlckNvbHVtbihjb2xUeXBlLCBjb2xTcGFuLCBjb2xDb250ZW50ID0gbnVsbCkge1xuICBpZiAoY29sQ29udGVudCkge1xuICAgIHJldHVybiBjb2xUeXBlLmNyZWF0ZUNoZWNrZWQoeydkYXRhLWNvbC1zcGFuJzogY29sU3Bhbn0sIGNvbENvbnRlbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNvbFR5cGUuY3JlYXRlQW5kRmlsbCh7J2RhdGEtY29sLXNwYW4nOiBjb2xTcGFufSk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGdldEdyaWRCdWlsZGVyTm9kZVR5cGVzKHNjaGVtYSkge1xuICBpZiAoc2NoZW1hLmNhY2hlZC5ncmlkQnVpbGRlck5vZGVUeXBlcykge1xuICAgIHJldHVybiBzY2hlbWEuY2FjaGVkLmdyaWRCdWlsZGVyTm9kZVR5cGVzO1xuICB9XG5cbiAgY29uc3Qgcm9sZXMgPSB7fTtcblxuICBPYmplY3Qua2V5cyhzY2hlbWEubm9kZXMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBjb25zdCBub2RlVHlwZSA9IHNjaGVtYS5ub2Rlc1t0eXBlXTtcblxuICAgIGlmIChub2RlVHlwZS5zcGVjLmdyaWRCdWlsZGVyUm9sZSkge1xuICAgICAgcm9sZXNbbm9kZVR5cGUuc3BlYy5ncmlkQnVpbGRlclJvbGVdID0gbm9kZVR5cGU7XG4gICAgfVxuICB9KTtcblxuICBzY2hlbWEuY2FjaGVkLmdyaWRCdWlsZGVyTm9kZVR5cGVzID0gcm9sZXM7XG5cbiAgcmV0dXJuIHJvbGVzO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUJ1aWxkZXJDb2x1bW4gfSBmcm9tIFwiLi9jcmVhdGVCdWlsZGVyQ29sdW1uXCI7XG5pbXBvcnQgeyBnZXRHcmlkQnVpbGRlck5vZGVUeXBlcyB9IGZyb20gXCIuL2dldEdyaWRCdWlsZGVyTm9kZVR5cGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHcmlkQnVpbGRlcihzY2hlbWEsIGNvbHNDb3VudCwgdHlwZSwgc3RhY2tBdCwgYXN5bW1ldHJpY0xlZnQsIGFzeW1tZXRyaWNSaWdodCwgY29sQ29udGVudCkge1xuICBjb25zdCB0eXBlcyA9IGdldEdyaWRCdWlsZGVyTm9kZVR5cGVzKHNjaGVtYSk7XG4gIGNvbnN0IGNvbHMgPSBbXTtcblxuICBpZiAodHlwZSA9PT0gJ2FzeW1tZXRyaWMnKSB7XG4gICAgY29scy5wdXNoKGNyZWF0ZUJ1aWxkZXJDb2x1bW4odHlwZXMuYnVpbGRlckNvbHVtbiwgYXN5bW1ldHJpY0xlZnQsIGNvbENvbnRlbnQpKTtcbiAgICBjb2xzLnB1c2goY3JlYXRlQnVpbGRlckNvbHVtbih0eXBlcy5idWlsZGVyQ29sdW1uLCBhc3ltbWV0cmljUmlnaHQsIGNvbENvbnRlbnQpKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sc0NvdW50OyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjb2wgPSBjcmVhdGVCdWlsZGVyQ29sdW1uKHR5cGVzLmJ1aWxkZXJDb2x1bW4sIG51bGwsIGNvbENvbnRlbnQpO1xuXG4gICAgICBpZiAoY29sKSB7XG4gICAgICAgIGNvbHMucHVzaChjb2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0eXBlcy5ncmlkQnVpbGRlci5jcmVhdGVDaGVja2VkKHsgJ2RhdGEtY29scyc6IGNvbHNDb3VudCwgJ2RhdGEtdHlwZSc6IHR5cGUsICdkYXRhLXN0YWNrLWF0Jzogc3RhY2tBdCB9LCBjb2xzKTtcbn1cbiIsICJpbXBvcnQgeyBjYWxsT3JSZXR1cm4sIGdldEV4dGVuc2lvbkZpZWxkLCBOb2RlLCBtZXJnZUF0dHJpYnV0ZXMsIGZpbmRQYXJlbnROb2RlLCBmaW5kQ2hpbGRyZW4gfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBUZXh0U2VsZWN0aW9uIH0gZnJvbSBcIkB0aXB0YXAvcG0vc3RhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUdyaWRCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3JlYXRlR3JpZEJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IEdyaWRCdWlsZGVyID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcImdyaWRCdWlsZGVyXCIsXG5cbiAgZ3JvdXA6IFwiYmxvY2tcIixcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgYWxsb3dHYXBDdXJzb3I6IGZhbHNlLFxuXG4gIGNvbnRlbnQ6IFwiZ3JpZEJ1aWxkZXJDb2x1bW4rXCIsXG5cbiAgZ3JpZEJ1aWxkZXJSb2xlOiBcImdyaWRCdWlsZGVyXCIsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY2xhc3M6IFwiZmlsYW1lbnQtdGlwdGFwLWdyaWQtYnVpbGRlclwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkYXRhLXR5cGUnOiB7XG4gICAgICAgIGRlZmF1bHQ6IFwicmVzcG9uc2l2ZVwiLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHlwZVwiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1jb2xzJzoge1xuICAgICAgICBkZWZhdWx0OiAyLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY29sc1wiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1zdGFjay1hdCc6IHtcbiAgICAgICAgZGVmYXVsdDogJ21kJyxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YWNrLWF0XCIpLFxuICAgICAgfSxcbiAgICAgICdzdHlsZSc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSxcbiAgICAgICAgcmVuZGVySFRNTDogKGF0dHJpYnV0ZXMpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3R5bGU6IGBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgke2F0dHJpYnV0ZXNbJ2RhdGEtY29scyddfSwgMWZyKTtgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBnZXRBdHRyczogKG5vZGUpID0+IG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmlsYW1lbnQtdGlwdGFwLWdyaWQtYnVpbGRlclwiKSAmJiBudWxsLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnNlcnRHcmlkQnVpbGRlcjpcbiAgICAgICAgKHsgY29scyA9IDMsIHR5cGUgPSBcInJlc3BvbnNpdmVcIiwgc3RhY2tBdCwgYXN5bW1ldHJpY0xlZnQgPSBudWxsLCBhc3ltbWV0cmljUmlnaHQgPSBudWxsIH0gPSB7fSkgPT5cbiAgICAgICAgKHsgdHIsIGRpc3BhdGNoLCBlZGl0b3IgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBjcmVhdGVHcmlkQnVpbGRlcihlZGl0b3Iuc2NoZW1hLCBjb2xzLCB0eXBlLCBzdGFja0F0LGFzeW1tZXRyaWNMZWZ0LCBhc3ltbWV0cmljUmlnaHQpO1xuXG4gICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0ci5zZWxlY3Rpb24uYW5jaG9yICsgMTtcblxuICAgICAgICAgICAgdHIucmVwbGFjZVNlbGVjdGlvbldpdGgobm9kZSlcbiAgICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgICAgICAgLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUob2Zmc2V0KSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH07XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiTW9kLUFsdC1HXCI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmluc2VydEdyaWRCdWlsZGVyKCksXG4gICAgfTtcbiAgfSxcblxuICBleHRlbmROb2RlU2NoZW1hKGV4dGVuc2lvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBncmlkQnVpbGRlclJvbGU6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZChleHRlbnNpb24sIFwiZ3JpZEJ1aWxkZXJSb2xlXCIsIGNvbnRleHQpKSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgR3JpZEJ1aWxkZXJDb2x1bW4gPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZ3JpZEJ1aWxkZXJDb2x1bW5cIixcbiAgY29udGVudDogXCJibG9jaytcIixcbiAgZ3JpZEJ1aWxkZXJSb2xlOiBcImJ1aWxkZXJDb2x1bW5cIixcbiAgaXNvbGF0aW5nOiB0cnVlLFxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtZ3JpZC1idWlsZGVyX19jb2x1bW5cIixcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2RhdGEtY29sLXNwYW4nOiB7XG4gICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jb2wtc3BhblwiKSxcbiAgICAgIH0sXG4gICAgICAnc3R5bGUnOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIiksXG4gICAgICAgIHJlbmRlckhUTUw6IChhdHRyaWJ1dGVzKSA9PiB7XG4gICAgICAgICAgbGV0IGNvbHNwYW4gPSBhdHRyaWJ1dGVzWydkYXRhLWNvbC1zcGFuJ107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0eWxlOiBgZ3JpZC1jb2x1bW46IHNwYW4gJHtjb2xzcGFufTtgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgZ2V0QXR0cnM6IChub2RlKSA9PiBub2RlLmNsYXNzTGlzdC5jb250YWlucyhcImZpbGFtZW50LXRpcHRhcC1ncmlkLWJ1aWxkZXJfX2NvbHVtblwiKSAmJiBudWxsLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJkaXZcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJ1xuXG5leHBvcnQgY29uc3QgRHJhZ0FuZERyb3BFeHRlbnNpb24gPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgICBuYW1lOiAnZHJhZ0FuZERyb3AnLFxuICAgIGFkZFByb3NlTWlycm9yUGx1Z2lucyhibGEpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZURyb3AodmlldywgZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQpIHJldHVybiBmYWxzZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdmlldy5wb3NBdENvb3Jkcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2Jsb2NrJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdnZWQtYmxvY2snLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2Jsb2NrJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ21lcmdlVGFnJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdnZWQtbWVyZ2UtdGFnJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ21lcmdlVGFnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgIH0sXG59KVxuIiwgImltcG9ydCB7bWVyZ2VBdHRyaWJ1dGVzLCBOb2RlfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IFRpcHRhcEJsb2NrID0gTm9kZS5jcmVhdGUoe1xuICAgIG5hbWU6ICd0aXB0YXBCbG9jaycsXG4gICAgZ3JvdXA6ICdibG9jaycsXG4gICAgYXRvbTogdHJ1ZSxcbiAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICBpc29sYXRpbmc6IHRydWUsXG4gICAgYWxsb3dHYXBDdXJzb3I6IHRydWUsXG4gICAgaW5saW5lOiBmYWxzZSxcbiAgICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJldmlldzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXByZXZpZXcnKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIGF0dHJpYnV0ZXMucHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1wcmV2aWV3JzogYXR0cmlidXRlcy5wcmV2aWV3XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdGVQYXRoOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUtcGF0aCcpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlcy5zdGF0ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtc3RhdGUtcGF0aCc6IGF0dHJpYnV0ZXMuc3RhdGVQYXRoXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIGF0dHJpYnV0ZXMudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS10eXBlJzogYXR0cmlidXRlcy50eXBlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlcy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1sYWJlbCc6IGF0dHJpYnV0ZXMubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0YScpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhLWRhdGEnOiBKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGVzLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgfSxcbiAgICBwYXJzZUhUTUwoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGFnOiAndGlwdGFwLWJsb2NrJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICAgICAgcmV0dXJuIFsndGlwdGFwLWJsb2NrJywgbWVyZ2VBdHRyaWJ1dGVzKEhUTUxBdHRyaWJ1dGVzKV1cbiAgICB9LFxuICAgIGFkZE5vZGVWaWV3KCkge1xuICAgICAgICByZXR1cm4gKHtub2RlfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnXG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LmFkZCgndGlwdGFwLWJsb2NrLXdyYXBwZXInKVxuXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHR5cGVvZiBub2RlLmF0dHJzLmRhdGEgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShub2RlLmF0dHJzLmRhdGEpXG4gICAgICAgICAgICAgICAgOiBub2RlLmF0dHJzLmRhdGFcblxuICAgICAgICAgICAgZG9tLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHgtZGF0YT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dPcHRpb25zQnV0dG9uOiAke2RhdGEgPT09ICdbXScgPyAnZmFsc2UnIDogJ3RydWUnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5TZXR0aW5ncygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRkaXNwYXRjaCgnb3Blbi1ibG9jay1zZXR0aW5ncycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXFxgJHtub2RlLmF0dHJzLnR5cGV9XFxgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IFxcYCR7bm9kZS5hdHRycy5zdGF0ZVBhdGh9XFxgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAke2RhdGF9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQmxvY2soKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZGlzcGF0Y2goJ2RlbGV0ZS1ibG9jaycpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpcHRhcC1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWluLWhlaWdodDogM3JlbTtcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpcHRhcC1ibG9jay1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0aXB0YXAtYmxvY2stdGl0bGVcIj4ke25vZGUuYXR0cnMubGFiZWx9PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgeC1zaG93PVwiISBkaXNhYmxlZFwiIGNsYXNzPVwidGlwdGFwLWJsb2NrLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHgtc2hvdz1cInNob3dPcHRpb25zQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIHgtb246Y2xpY2s9XCJvcGVuU2V0dGluZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInctNCBoLTRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTcuODQgMS44MDRBMSAxIDAgMDE4LjgyIDFoMi4zNmExIDEgMCAwMS45OC44MDRsLjMzMSAxLjY1MmE2Ljk5MyA2Ljk5MyAwIDAxMS45MjkgMS4xMTVsMS41OTgtLjU0YTEgMSAwIDAxMS4xODYuNDQ3bDEuMTggMi4wNDRhMSAxIDAgMDEtLjIwNSAxLjI1MWwtMS4yNjcgMS4xMTNhNy4wNDcgNy4wNDcgMCAwMTAgMi4yMjhsMS4yNjcgMS4xMTNhMSAxIDAgMDEuMjA2IDEuMjVsLTEuMTggMi4wNDVhMSAxIDAgMDEtMS4xODcuNDQ3bC0xLjU5OC0uNTRhNi45OTMgNi45OTMgMCAwMS0xLjkyOSAxLjExNWwtLjMzIDEuNjUyYTEgMSAwIDAxLS45OC44MDRIOC44MmExIDEgMCAwMS0uOTgtLjgwNGwtLjMzMS0xLjY1MmE2Ljk5MyA2Ljk5MyAwIDAxLTEuOTI5LTEuMTE1bC0xLjU5OC41NGExIDEgMCAwMS0xLjE4Ni0uNDQ3bC0xLjE4LTIuMDQ0YTEgMSAwIDAxLjIwNS0xLjI1MWwxLjI2Ny0xLjExNGE3LjA1IDcuMDUgMCAwMTAtMi4yMjdMMS44MjEgNy43NzNhMSAxIDAgMDEtLjIwNi0xLjI1bDEuMTgtMi4wNDVhMSAxIDAgMDExLjE4Ny0uNDQ3bDEuNTk4LjU0QTYuOTkzIDYuOTkzIDAgMDE3LjUxIDMuNDU2bC4zMy0xLjY1MnpNMTAgMTNhMyAzIDAgMTAwLTYgMyAzIDAgMDAwIDZ6XCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHgtb246Y2xpY2s9XCJkZWxldGVCbG9jaygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTQgaC00XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04Ljc1IDFBMi43NSAyLjc1IDAgMDA2IDMuNzV2LjQ0M2MtLjc5NS4wNzctMS41ODQuMTc2LTIuMzY1LjI5OGEuNzUuNzUgMCAxMC4yMyAxLjQ4MmwuMTQ5LS4wMjIuODQxIDEwLjUxOEEyLjc1IDIuNzUgMCAwMDcuNTk2IDE5aDQuODA3YTIuNzUgMi43NSAwIDAwMi43NDItMi41M2wuODQxLTEwLjUyLjE0OS4wMjNhLjc1Ljc1IDAgMDAuMjMtMS40ODJBNDEuMDMgNDEuMDMgMCAwMDE0IDQuMTkzVjMuNzVBMi43NSAyLjc1IDAgMDAxMS4yNSAxaC0yLjV6TTEwIDRjLjg0IDAgMS42NzMuMDI1IDIuNS4wNzVWMy43NWMwLS42OS0uNTYtMS4yNS0xLjI1LTEuMjVoLTIuNWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjV2LjMyNUM4LjMyNyA0LjAyNSA5LjE2IDQgMTAgNHpNOC41OCA3LjcyYS43NS43NSAwIDAwLTEuNS4wNmwuMyA3LjVhLjc1Ljc1IDAgMTAxLjUtLjA2bC0uMy03LjV6bTQuMzQuMDZhLjc1Ljc1IDAgMTAtMS41LS4wNmwtLjMgNy41YS43NS43NSAwIDEwMS41LjA2bC4zLTcuNXpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke25vZGUuYXR0cnMucHJldmlld31cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgYWRkQ29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnNlcnRCbG9jazogKGF0dHJpYnV0ZXMpID0+ICh7IGNoYWluLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoYWluID0gY2hhaW4oKVxuXG4gICAgICAgICAgICAgICAgaWYgKCEgW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYXR0cmlidXRlcy5jb29yZGluYXRlcz8ucG9zKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KHsgZnJvbTogYXR0cmlidXRlcy5jb29yZGluYXRlcy5wb3MsIHRvOiBhdHRyaWJ1dGVzLmNvb3JkaW5hdGVzLnBvcyB9LCB7IHR5cGU6IHRoaXMubmFtZSwgYXR0cnM6IGF0dHJpYnV0ZXMgfSlcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENoYWluLnNldFRleHRTZWxlY3Rpb24oYXR0cmlidXRlcy5jb29yZGluYXRlcy5wb3MpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgICAgICAgICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzZWxlY3Rpb25cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pXG5cbiAgICAgICAgICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdG8ucGFyZW50T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0Q29udGVudEF0KE1hdGgubWF4KCR0by5wb3MgLSAxLCAwKSwgeyB0eXBlOiAncGFyYWdyYXBoJyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnRDb250ZW50QXQoeyBmcm9tOiAkZnJvbS5wb3MsIHRvOiAkdG8ucG9zIH0sIHsgdHlwZTogdGhpcy5uYW1lLCBhdHRyczogYXR0cmlidXRlcyB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENoYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5vZGUoeyB0eXBlOiAncGFyYWdyYXBoJyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnRDb250ZW50QXQoeyBmcm9tOiAkZnJvbS5wb3MsIHRvOiAkdG8ucG9zIH0sIHsgdHlwZTogdGhpcy5uYW1lLCBhdHRyczogYXR0cmlidXRlcyB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDaGFpbi5zZXRUZXh0U2VsZWN0aW9uKCR0by5wb3MgKyAxKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdG8ucGFyZW50T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KE1hdGgubWF4KCR0by5wb3MgLSAxLCAwKSwgeyB0eXBlOiB0aGlzLm5hbWUsIGF0dHJzOiBhdHRyaWJ1dGVzIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KHsgZnJvbTogcmFuZ2Uuc3RhcnQsIHRvOiByYW5nZS5lbmQgfSwgeyB0eXBlOiB0aGlzLm5hbWUsIGF0dHJzOiBhdHRyaWJ1dGVzIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENoYWluLnNldFRleHRTZWxlY3Rpb24ocmFuZ2UuZW5kKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGVCbG9jazogKGF0dHJpYnV0ZXMpID0+ICh7IGNoYWluLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgICAgICAgICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKVxuXG4gICAgICAgICAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhaW4gPSBjaGFpbigpXG5cbiAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KHsgZnJvbTogcmFuZ2Uuc3RhcnQsIHRvOiByYW5nZS5lbmQgfSwgeyB0eXBlOiB0aGlzLm5hbWUsIGF0dHJzOiBhdHRyaWJ1dGVzIH0pXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENoYWluLmZvY3VzKHJhbmdlLmVuZCArIDEpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtb3ZlQmxvY2s6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZHMuZGVsZXRlU2VsZWN0aW9uKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59KVxuIiwgImltcG9ydCB7IGVzY2FwZUZvclJlZ0V4LCBSYW5nZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IFJlc29sdmVkUG9zIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuZXhwb3J0IGludGVyZmFjZSBUcmlnZ2VyIHtcbiAgY2hhcjogc3RyaW5nXG4gIGFsbG93U3BhY2VzOiBib29sZWFuXG4gIGFsbG93ZWRQcmVmaXhlczogc3RyaW5nW10gfCBudWxsXG4gIHN0YXJ0T2ZMaW5lOiBib29sZWFuXG4gICRwb3NpdGlvbjogUmVzb2x2ZWRQb3Ncbn1cblxuZXhwb3J0IHR5cGUgU3VnZ2VzdGlvbk1hdGNoID0ge1xuICByYW5nZTogUmFuZ2VcbiAgcXVlcnk6IHN0cmluZ1xuICB0ZXh0OiBzdHJpbmdcbn0gfCBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU3VnZ2VzdGlvbk1hdGNoKGNvbmZpZzogVHJpZ2dlcik6IFN1Z2dlc3Rpb25NYXRjaCB7XG4gIGNvbnN0IHtcbiAgICBjaGFyLCBhbGxvd1NwYWNlcywgYWxsb3dlZFByZWZpeGVzLCBzdGFydE9mTGluZSwgJHBvc2l0aW9uLFxuICB9ID0gY29uZmlnXG5cbiAgY29uc3QgZXNjYXBlZENoYXIgPSBlc2NhcGVGb3JSZWdFeChjaGFyKVxuICBjb25zdCBzdWZmaXggPSBuZXcgUmVnRXhwKGBcXFxccyR7ZXNjYXBlZENoYXJ9JGApXG4gIGNvbnN0IHByZWZpeCA9IHN0YXJ0T2ZMaW5lID8gJ14nIDogJydcbiAgY29uc3QgcmVnZXhwID0gYWxsb3dTcGFjZXNcbiAgICA/IG5ldyBSZWdFeHAoYCR7cHJlZml4fSR7ZXNjYXBlZENoYXJ9Lio/KD89XFxcXHMke2VzY2FwZWRDaGFyfXwkKWAsICdnbScpXG4gICAgOiBuZXcgUmVnRXhwKGAke3ByZWZpeH0oPzpeKT8ke2VzY2FwZWRDaGFyfVteXFxcXHMke2VzY2FwZWRDaGFyfV0qYCwgJ2dtJylcblxuICBjb25zdCB0ZXh0ID0gJHBvc2l0aW9uLm5vZGVCZWZvcmU/LmlzVGV4dCAmJiAkcG9zaXRpb24ubm9kZUJlZm9yZS50ZXh0XG5cbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHRleHRGcm9tID0gJHBvc2l0aW9uLnBvcyAtIHRleHQubGVuZ3RoXG4gIGNvbnN0IG1hdGNoID0gQXJyYXkuZnJvbSh0ZXh0Lm1hdGNoQWxsKHJlZ2V4cCkpLnBvcCgpXG5cbiAgaWYgKCFtYXRjaCB8fCBtYXRjaC5pbnB1dCA9PT0gdW5kZWZpbmVkIHx8IG1hdGNoLmluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gSmF2YVNjcmlwdCBkb2Vzbid0IGhhdmUgbG9va2JlaGluZHMuIFRoaXMgaGFja3MgYSBjaGVjayB0aGF0IGZpcnN0IGNoYXJhY3RlclxuICAvLyBpcyBhIHNwYWNlIG9yIHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICBjb25zdCBtYXRjaFByZWZpeCA9IG1hdGNoLmlucHV0LnNsaWNlKE1hdGgubWF4KDAsIG1hdGNoLmluZGV4IC0gMSksIG1hdGNoLmluZGV4KVxuICBjb25zdCBtYXRjaFByZWZpeElzQWxsb3dlZCA9IG5ldyBSZWdFeHAoYF5bJHthbGxvd2VkUHJlZml4ZXM/LmpvaW4oJycpfVxcMF0/JGApLnRlc3QobWF0Y2hQcmVmaXgpXG5cbiAgaWYgKGFsbG93ZWRQcmVmaXhlcyAhPT0gbnVsbCAmJiAhbWF0Y2hQcmVmaXhJc0FsbG93ZWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBtYXRjaCBpbiB0aGUgZG9jdW1lbnRcbiAgY29uc3QgZnJvbSA9IHRleHRGcm9tICsgbWF0Y2guaW5kZXhcbiAgbGV0IHRvID0gZnJvbSArIG1hdGNoWzBdLmxlbmd0aFxuXG4gIC8vIEVkZ2UgY2FzZSBoYW5kbGluZzsgaWYgc3BhY2VzIGFyZSBhbGxvd2VkIGFuZCB3ZSdyZSBkaXJlY3RseSBpbiBiZXR3ZWVuXG4gIC8vIHR3byB0cmlnZ2Vyc1xuICBpZiAoYWxsb3dTcGFjZXMgJiYgc3VmZml4LnRlc3QodGV4dC5zbGljZSh0byAtIDEsIHRvICsgMSkpKSB7XG4gICAgbWF0Y2hbMF0gKz0gJyAnXG4gICAgdG8gKz0gMVxuICB9XG5cbiAgLy8gSWYgdGhlICRwb3NpdGlvbiBpcyBsb2NhdGVkIHdpdGhpbiB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcsIHJldHVybiB0aGF0IHJhbmdlXG4gIGlmIChmcm9tIDwgJHBvc2l0aW9uLnBvcyAmJiB0byA+PSAkcG9zaXRpb24ucG9zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIGZyb20sXG4gICAgICAgIHRvLFxuICAgICAgfSxcbiAgICAgIHF1ZXJ5OiBtYXRjaFswXS5zbGljZShjaGFyLmxlbmd0aCksXG4gICAgICB0ZXh0OiBtYXRjaFswXSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB7IEVkaXRvciwgUmFuZ2UgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSwgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCwgRWRpdG9yVmlldyB9IGZyb20gJ0B0aXB0YXAvcG0vdmlldydcblxuaW1wb3J0IHsgZmluZFN1Z2dlc3Rpb25NYXRjaCB9IGZyb20gJy4vZmluZFN1Z2dlc3Rpb25NYXRjaC5qcydcblxuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uT3B0aW9uczxJID0gYW55PiB7XG4gIHBsdWdpbktleT86IFBsdWdpbktleVxuICBlZGl0b3I6IEVkaXRvclxuICBjaGFyPzogc3RyaW5nXG4gIGFsbG93U3BhY2VzPzogYm9vbGVhblxuICBhbGxvd2VkUHJlZml4ZXM/OiBzdHJpbmdbXSB8IG51bGxcbiAgc3RhcnRPZkxpbmU/OiBib29sZWFuXG4gIGRlY29yYXRpb25UYWc/OiBzdHJpbmdcbiAgZGVjb3JhdGlvbkNsYXNzPzogc3RyaW5nXG4gIGNvbW1hbmQ/OiAocHJvcHM6IHsgZWRpdG9yOiBFZGl0b3I7IHJhbmdlOiBSYW5nZTsgcHJvcHM6IEkgfSkgPT4gdm9pZFxuICBpdGVtcz86IChwcm9wczogeyBxdWVyeTogc3RyaW5nOyBlZGl0b3I6IEVkaXRvciB9KSA9PiBJW10gfCBQcm9taXNlPElbXT5cbiAgcmVuZGVyPzogKCkgPT4ge1xuICAgIG9uQmVmb3JlU3RhcnQ/OiAocHJvcHM6IFN1Z2dlc3Rpb25Qcm9wczxJPikgPT4gdm9pZFxuICAgIG9uU3RhcnQ/OiAocHJvcHM6IFN1Z2dlc3Rpb25Qcm9wczxJPikgPT4gdm9pZFxuICAgIG9uQmVmb3JlVXBkYXRlPzogKHByb3BzOiBTdWdnZXN0aW9uUHJvcHM8ST4pID0+IHZvaWRcbiAgICBvblVwZGF0ZT86IChwcm9wczogU3VnZ2VzdGlvblByb3BzPEk+KSA9PiB2b2lkXG4gICAgb25FeGl0PzogKHByb3BzOiBTdWdnZXN0aW9uUHJvcHM8ST4pID0+IHZvaWRcbiAgICBvbktleURvd24/OiAocHJvcHM6IFN1Z2dlc3Rpb25LZXlEb3duUHJvcHMpID0+IGJvb2xlYW5cbiAgfVxuICBhbGxvdz86IChwcm9wczogeyBlZGl0b3I6IEVkaXRvcjsgc3RhdGU6IEVkaXRvclN0YXRlOyByYW5nZTogUmFuZ2UgfSkgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Z2dlc3Rpb25Qcm9wczxJID0gYW55PiB7XG4gIGVkaXRvcjogRWRpdG9yXG4gIHJhbmdlOiBSYW5nZVxuICBxdWVyeTogc3RyaW5nXG4gIHRleHQ6IHN0cmluZ1xuICBpdGVtczogSVtdXG4gIGNvbW1hbmQ6IChwcm9wczogSSkgPT4gdm9pZFxuICBkZWNvcmF0aW9uTm9kZTogRWxlbWVudCB8IG51bGxcbiAgY2xpZW50UmVjdD86ICgoKSA9PiBET01SZWN0IHwgbnVsbCkgfCBudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdGlvbktleURvd25Qcm9wcyB7XG4gIHZpZXc6IEVkaXRvclZpZXdcbiAgZXZlbnQ6IEtleWJvYXJkRXZlbnRcbiAgcmFuZ2U6IFJhbmdlXG59XG5cbmV4cG9ydCBjb25zdCBTdWdnZXN0aW9uUGx1Z2luS2V5ID0gbmV3IFBsdWdpbktleSgnc3VnZ2VzdGlvbicpXG5cbmV4cG9ydCBmdW5jdGlvbiBTdWdnZXN0aW9uPEkgPSBhbnk+KHtcbiAgcGx1Z2luS2V5ID0gU3VnZ2VzdGlvblBsdWdpbktleSxcbiAgZWRpdG9yLFxuICBjaGFyID0gJ0AnLFxuICBhbGxvd1NwYWNlcyA9IGZhbHNlLFxuICBhbGxvd2VkUHJlZml4ZXMgPSBbJyAnXSxcbiAgc3RhcnRPZkxpbmUgPSBmYWxzZSxcbiAgZGVjb3JhdGlvblRhZyA9ICdzcGFuJyxcbiAgZGVjb3JhdGlvbkNsYXNzID0gJ3N1Z2dlc3Rpb24nLFxuICBjb21tYW5kID0gKCkgPT4gbnVsbCxcbiAgaXRlbXMgPSAoKSA9PiBbXSxcbiAgcmVuZGVyID0gKCkgPT4gKHt9KSxcbiAgYWxsb3cgPSAoKSA9PiB0cnVlLFxufTogU3VnZ2VzdGlvbk9wdGlvbnM8ST4pIHtcbiAgbGV0IHByb3BzOiBTdWdnZXN0aW9uUHJvcHM8ST4gfCB1bmRlZmluZWRcbiAgY29uc3QgcmVuZGVyZXIgPSByZW5kZXI/LigpXG5cbiAgY29uc3QgcGx1Z2luOiBQbHVnaW48YW55PiA9IG5ldyBQbHVnaW4oe1xuICAgIGtleTogcGx1Z2luS2V5LFxuXG4gICAgdmlldygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZTogYXN5bmMgKHZpZXcsIHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmtleT8uZ2V0U3RhdGUocHJldlN0YXRlKVxuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmtleT8uZ2V0U3RhdGUodmlldy5zdGF0ZSlcblxuICAgICAgICAgIC8vIFNlZSBob3cgdGhlIHN0YXRlIGNoYW5nZWRcbiAgICAgICAgICBjb25zdCBtb3ZlZCA9IHByZXYuYWN0aXZlICYmIG5leHQuYWN0aXZlICYmIHByZXYucmFuZ2UuZnJvbSAhPT0gbmV4dC5yYW5nZS5mcm9tXG4gICAgICAgICAgY29uc3Qgc3RhcnRlZCA9ICFwcmV2LmFjdGl2ZSAmJiBuZXh0LmFjdGl2ZVxuICAgICAgICAgIGNvbnN0IHN0b3BwZWQgPSBwcmV2LmFjdGl2ZSAmJiAhbmV4dC5hY3RpdmVcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gIXN0YXJ0ZWQgJiYgIXN0b3BwZWQgJiYgcHJldi5xdWVyeSAhPT0gbmV4dC5xdWVyeVxuICAgICAgICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gc3RhcnRlZCB8fCBtb3ZlZFxuICAgICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IGNoYW5nZWQgJiYgIW1vdmVkXG4gICAgICAgICAgY29uc3QgaGFuZGxlRXhpdCA9IHN0b3BwZWQgfHwgbW92ZWRcblxuICAgICAgICAgIC8vIENhbmNlbCB3aGVuIHN1Z2dlc3Rpb24gaXNuJ3QgYWN0aXZlXG4gICAgICAgICAgaWYgKCFoYW5kbGVTdGFydCAmJiAhaGFuZGxlQ2hhbmdlICYmICFoYW5kbGVFeGl0KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IGhhbmRsZUV4aXQgJiYgIWhhbmRsZVN0YXJ0ID8gcHJldiA6IG5leHRcbiAgICAgICAgICBjb25zdCBkZWNvcmF0aW9uTm9kZSA9IHZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICBgW2RhdGEtZGVjb3JhdGlvbi1pZD1cIiR7c3RhdGUuZGVjb3JhdGlvbklkfVwiXWAsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgcHJvcHMgPSB7XG4gICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICByYW5nZTogc3RhdGUucmFuZ2UsXG4gICAgICAgICAgICBxdWVyeTogc3RhdGUucXVlcnksXG4gICAgICAgICAgICB0ZXh0OiBzdGF0ZS50ZXh0LFxuICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgY29tbWFuZDogY29tbWFuZFByb3BzID0+IHtcbiAgICAgICAgICAgICAgY29tbWFuZCh7XG4gICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBzdGF0ZS5yYW5nZSxcbiAgICAgICAgICAgICAgICBwcm9wczogY29tbWFuZFByb3BzLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlY29yYXRpb25Ob2RlLFxuICAgICAgICAgICAgLy8gdmlydHVhbCBub2RlIGZvciBwb3BwZXIuanMgb3IgdGlwcHkuanNcbiAgICAgICAgICAgIC8vIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIHBvcHVwcyB3aXRob3V0IGEgRE9NIG5vZGVcbiAgICAgICAgICAgIGNsaWVudFJlY3Q6IGRlY29yYXRpb25Ob2RlXG4gICAgICAgICAgICAgID8gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgYGl0ZW1zYCBjYW4gYmUgYXN5bmNocm91bm91cyB3ZeKAmWxsIHNlYXJjaCBmb3IgdGhlIGN1cnJlbnQgZGVjb3JhdGlvbiBub2RlXG4gICAgICAgICAgICAgICAgICBjb25zdCB7IGRlY29yYXRpb25JZCB9ID0gdGhpcy5rZXk/LmdldFN0YXRlKGVkaXRvci5zdGF0ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZWNvcmF0aW9uTm9kZSA9IHZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICBgW2RhdGEtZGVjb3JhdGlvbi1pZD1cIiR7ZGVjb3JhdGlvbklkfVwiXWAsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZWNvcmF0aW9uTm9kZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgfHwgbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFuZGxlU3RhcnQpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyPy5vbkJlZm9yZVN0YXJ0Py4ocHJvcHMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhbmRsZUNoYW5nZSkge1xuICAgICAgICAgICAgcmVuZGVyZXI/Lm9uQmVmb3JlVXBkYXRlPy4ocHJvcHMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhbmRsZUNoYW5nZSB8fCBoYW5kbGVTdGFydCkge1xuICAgICAgICAgICAgcHJvcHMuaXRlbXMgPSBhd2FpdCBpdGVtcyh7XG4gICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgcXVlcnk6IHN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFuZGxlRXhpdCkge1xuICAgICAgICAgICAgcmVuZGVyZXI/Lm9uRXhpdD8uKHByb3BzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYW5kbGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyPy5vblVwZGF0ZT8uKHByb3BzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYW5kbGVTdGFydCkge1xuICAgICAgICAgICAgcmVuZGVyZXI/Lm9uU3RhcnQ/Lihwcm9wcylcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbmRlcmVyPy5vbkV4aXQ/Lihwcm9wcylcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RhdGU6IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbidzIGludGVybmFsIHN0YXRlLlxuICAgICAgaW5pdCgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGU6IHtcbiAgICAgICAgICBhY3RpdmU6IGJvb2xlYW5cbiAgICAgICAgICByYW5nZTogUmFuZ2VcbiAgICAgICAgICBxdWVyeTogbnVsbCB8IHN0cmluZ1xuICAgICAgICAgIHRleHQ6IG51bGwgfCBzdHJpbmdcbiAgICAgICAgICBjb21wb3Npbmc6IGJvb2xlYW5cbiAgICAgICAgICBkZWNvcmF0aW9uSWQ/OiBzdHJpbmcgfCBudWxsXG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgIHRvOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcXVlcnk6IG51bGwsXG4gICAgICAgICAgdGV4dDogbnVsbCxcbiAgICAgICAgICBjb21wb3Npbmc6IGZhbHNlLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICB9LFxuXG4gICAgICAvLyBBcHBseSBjaGFuZ2VzIHRvIHRoZSBwbHVnaW4gc3RhdGUgZnJvbSBhIHZpZXcgdHJhbnNhY3Rpb24uXG4gICAgICBhcHBseSh0cmFuc2FjdGlvbiwgcHJldiwgb2xkU3RhdGUsIHN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHsgaXNFZGl0YWJsZSB9ID0gZWRpdG9yXG4gICAgICAgIGNvbnN0IHsgY29tcG9zaW5nIH0gPSBlZGl0b3Iudmlld1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgeyBlbXB0eSwgZnJvbSB9ID0gc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IG5leHQgPSB7IC4uLnByZXYgfVxuXG4gICAgICAgIG5leHQuY29tcG9zaW5nID0gY29tcG9zaW5nXG5cbiAgICAgICAgLy8gV2UgY2FuIG9ubHkgYmUgc3VnZ2VzdGluZyBpZiB0aGUgdmlldyBpcyBlZGl0YWJsZSwgYW5kOlxuICAgICAgICAvLyAgICogdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBvclxuICAgICAgICAvLyAgICogYSBjb21wb3NpdGlvbiBpcyBhY3RpdmUgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3VlYmVyZG9zaXMvdGlwdGFwL2lzc3Vlcy8xNDQ5KVxuICAgICAgICBpZiAoaXNFZGl0YWJsZSAmJiAoZW1wdHkgfHwgZWRpdG9yLnZpZXcuY29tcG9zaW5nKSkge1xuICAgICAgICAgIC8vIFJlc2V0IGFjdGl2ZSBzdGF0ZSBpZiB3ZSBqdXN0IGxlZnQgdGhlIHByZXZpb3VzIHN1Z2dlc3Rpb24gcmFuZ2VcbiAgICAgICAgICBpZiAoKGZyb20gPCBwcmV2LnJhbmdlLmZyb20gfHwgZnJvbSA+IHByZXYucmFuZ2UudG8pICYmICFjb21wb3NpbmcgJiYgIXByZXYuY29tcG9zaW5nKSB7XG4gICAgICAgICAgICBuZXh0LmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGFnYWluc3Qgd2hlcmUgb3VyIGN1cnNvciBjdXJyZW50bHkgaXNcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IGZpbmRTdWdnZXN0aW9uTWF0Y2goe1xuICAgICAgICAgICAgY2hhcixcbiAgICAgICAgICAgIGFsbG93U3BhY2VzLFxuICAgICAgICAgICAgYWxsb3dlZFByZWZpeGVzLFxuICAgICAgICAgICAgc3RhcnRPZkxpbmUsXG4gICAgICAgICAgICAkcG9zaXRpb246IHNlbGVjdGlvbi4kZnJvbSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGRlY29yYXRpb25JZCA9IGBpZF8ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYpfWBcblxuICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbWF0Y2gsIHVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSB0byBzaG93IGl0XG4gICAgICAgICAgaWYgKG1hdGNoICYmIGFsbG93KHsgZWRpdG9yLCBzdGF0ZSwgcmFuZ2U6IG1hdGNoLnJhbmdlIH0pKSB7XG4gICAgICAgICAgICBuZXh0LmFjdGl2ZSA9IHRydWVcbiAgICAgICAgICAgIG5leHQuZGVjb3JhdGlvbklkID0gcHJldi5kZWNvcmF0aW9uSWQgPyBwcmV2LmRlY29yYXRpb25JZCA6IGRlY29yYXRpb25JZFxuICAgICAgICAgICAgbmV4dC5yYW5nZSA9IG1hdGNoLnJhbmdlXG4gICAgICAgICAgICBuZXh0LnF1ZXJ5ID0gbWF0Y2gucXVlcnlcbiAgICAgICAgICAgIG5leHQudGV4dCA9IG1hdGNoLnRleHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0LmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgdG8gZW1wdHkgdGhlIHJhbmdlIGlmIHN1Z2dlc3Rpb24gaXMgaW5hY3RpdmVcbiAgICAgICAgaWYgKCFuZXh0LmFjdGl2ZSkge1xuICAgICAgICAgIG5leHQuZGVjb3JhdGlvbklkID0gbnVsbFxuICAgICAgICAgIG5leHQucmFuZ2UgPSB7IGZyb206IDAsIHRvOiAwIH1cbiAgICAgICAgICBuZXh0LnF1ZXJ5ID0gbnVsbFxuICAgICAgICAgIG5leHQudGV4dCA9IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBwcm9wczoge1xuICAgICAgLy8gQ2FsbCB0aGUga2V5ZG93biBob29rIGlmIHN1Z2dlc3Rpb24gaXMgYWN0aXZlLlxuICAgICAgaGFuZGxlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgICAgICBjb25zdCB7IGFjdGl2ZSwgcmFuZ2UgfSA9IHBsdWdpbi5nZXRTdGF0ZSh2aWV3LnN0YXRlKVxuXG4gICAgICAgIGlmICghYWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZXI/Lm9uS2V5RG93bj8uKHsgdmlldywgZXZlbnQsIHJhbmdlIH0pIHx8IGZhbHNlXG4gICAgICB9LFxuXG4gICAgICAvLyBTZXR1cCBkZWNvcmF0b3Igb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgc3VnZ2VzdGlvbi5cbiAgICAgIGRlY29yYXRpb25zKHN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHsgYWN0aXZlLCByYW5nZSwgZGVjb3JhdGlvbklkIH0gPSBwbHVnaW4uZ2V0U3RhdGUoc3RhdGUpXG5cbiAgICAgICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuY3JlYXRlKHN0YXRlLmRvYywgW1xuICAgICAgICAgIERlY29yYXRpb24uaW5saW5lKHJhbmdlLmZyb20sIHJhbmdlLnRvLCB7XG4gICAgICAgICAgICBub2RlTmFtZTogZGVjb3JhdGlvblRhZyxcbiAgICAgICAgICAgIGNsYXNzOiBkZWNvcmF0aW9uQ2xhc3MsXG4gICAgICAgICAgICAnZGF0YS1kZWNvcmF0aW9uLWlkJzogZGVjb3JhdGlvbklkLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdKVxuICAgICAgfSxcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybiBwbHVnaW5cbn1cbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IFN1Z2dlc3Rpb24gZnJvbSAnQHRpcHRhcC9zdWdnZXN0aW9uJ1xuaW1wb3J0IHRpcHB5IGZyb20gXCJ0aXBweS5qc1wiO1xuXG5leHBvcnQgY29uc3QgTWVyZ2VUYWdQbHVnaW5LZXkgPSBuZXcgUGx1Z2luS2V5KCdtZXJnZVRhZycpXG5cbmV4cG9ydCBjb25zdCBNZXJnZVRhZyA9IE5vZGUuY3JlYXRlKHtcbiAgICBuYW1lOiAnbWVyZ2VUYWcnLFxuXG4gICAgZ3JvdXA6ICdpbmxpbmUnLFxuXG4gICAgaW5saW5lOiB0cnVlLFxuXG4gICAgc2VsZWN0YWJsZTogZmFsc2UsXG5cbiAgICBhdG9tOiB0cnVlLFxuXG4gICAgYWRkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1pZCc6IGF0dHJpYnV0ZXMuaWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhZzogYHNwYW5bZGF0YS10eXBlPScke3RoaXMubmFtZX0nXWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0sXG5cbiAgICByZW5kZXJIVE1MKHsgbm9kZSwgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgICAgbWVyZ2VBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgIHsgJ2RhdGEtdHlwZSc6IHRoaXMubmFtZSB9LFxuICAgICAgICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYHt7ICR7bm9kZS5hdHRycy5pZH0gfX1gLFxuICAgICAgICBdXG4gICAgfSxcblxuICAgIHJlbmRlclRleHQoeyBub2RlIH0pIHtcbiAgICAgICAgcmV0dXJuIGB7eyAke25vZGUuYXR0cnMuaWR9IH19YFxuICAgIH0sXG5cbiAgICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEJhY2tzcGFjZTogKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5jb21tYW5kcy5jb21tYW5kKCh7IHRyLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc01lcmdlVGFnID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZW1wdHksIGFuY2hvciB9ID0gc2VsZWN0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGFuY2hvciAtIDEsIGFuY2hvciwgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5uYW1lID09PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01lcmdlVGFnID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLmluc2VydFRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7eycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICsgbm9kZS5ub2RlU2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc01lcmdlVGFnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRDb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc2VydE1lcmdlVGFnOiAoYXR0cmlidXRlcykgPT4gKHsgY2hhaW4sIHN0YXRlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhaW4gPSBjaGFpbigpXG5cbiAgICAgICAgICAgICAgICBpZiAoISBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhhdHRyaWJ1dGVzLmNvb3JkaW5hdGVzPy5wb3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFpbi5pbnNlcnRDb250ZW50QXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGZyb206IGF0dHJpYnV0ZXMuY29vcmRpbmF0ZXMucG9zLCB0bzogYXR0cmlidXRlcy5jb29yZGluYXRlcy5wb3MgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IHRoaXMubmFtZSwgYXR0cnM6IHsgaWQ6IGF0dHJpYnV0ZXMudGFnIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICd0ZXh0JywgdGV4dDogJyAnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDaGFpblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgU3VnZ2VzdGlvbih7XG4gICAgICAgICAgICAgICAgZWRpdG9yOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgICAgICBjaGFyOiAne3snLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiAoeyBxdWVyeSB9KSA9PiB0aGlzLm9wdGlvbnMubWVyZ2VUYWdzLmZpbHRlcihpdGVtID0+IGl0ZW0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKS5zbGljZSgwLCA1KSxcbiAgICAgICAgICAgICAgICBwbHVnaW5LZXk6IE1lcmdlVGFnUGx1Z2luS2V5LFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICh7IGVkaXRvciwgcmFuZ2UsIHByb3BzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUFmdGVyID0gZWRpdG9yLnZpZXcuc3RhdGUuc2VsZWN0aW9uLiR0by5ub2RlQWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVTcGFjZSA9IG5vZGVBZnRlcj8udGV4dD8uc3RhcnRzV2l0aCgnICcpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlU3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnRvICs9IDFcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNoYWluKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0Q29udGVudEF0KHJhbmdlLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiBwcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJ1bigpXG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpPy5jb2xsYXBzZVRvRW5kKClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFsbG93OiAoeyBzdGF0ZSwgcmFuZ2UgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCAkZnJvbSA9IHN0YXRlLmRvYy5yZXNvbHZlKHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzdGF0ZS5zY2hlbWEubm9kZXNbdGhpcy5uYW1lXVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvdyA9ICEhJGZyb20ucGFyZW50LnR5cGUuY29udGVudE1hdGNoLm1hdGNoVHlwZSh0eXBlKVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVuZGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVwXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQ6IChwcm9wcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuY2xpZW50UmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LWRhdGE9XCJ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogWycke3Byb3BzLml0ZW1zLmpvaW4oJ1xcJywgXFwnJyl9J10sXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4OiAwLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVyZ2UtdGFncy1rZXktZG93bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IHRoaXMub25LZXlEb3duKGV2ZW50LmRldGFpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucGFyZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lcmdlLXRhZ3MtdXBkYXRlLWl0ZW1zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCkgPT4gKGl0ZW1zID0gZXZlbnQuZGV0YWlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gKCh0aGlzLnNlbGVjdGVkSW5kZXggKyB0aGlzLml0ZW1zLmxlbmd0aCkgLSAxKSAlIHRoaXMuaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9ICh0aGlzLnNlbGVjdGVkSW5kZXggKyAxKSAlIHRoaXMuaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRJbmRleCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0SXRlbTogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW2luZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsLnBhcmVudEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21lcmdlLXRhZ3Mtc2VsZWN0JywgeyBkZXRhaWw6IHsgaXRlbSB9IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGlwcHktY29udGVudC1wLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgeC1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGl0ZW1zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LXRleHQ9XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC1vbjpjbGljaz1cInNlbGVjdEl0ZW0oaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyAnYmctcHJpbWFyeS01MDAnOiBpbmRleCA9PT0gc2VsZWN0ZWRJbmRleCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayB3LWZ1bGwgdGV4dC1sZWZ0IHJvdW5kZWQgcHgtMiBweS0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWVyZ2UtdGFncy1zZWxlY3QnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuY29tbWFuZCh7IGlkOiBldmVudC5kZXRhaWwuaXRlbSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwID0gdGlwcHkoJ2JvZHknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IHByb3BzLmNsaWVudFJlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAoKSA9PiBkb2N1bWVudC5ib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93SFRNTDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd09uQ3JlYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbS1zdGFydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZShwcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwWzBdLmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBbMF0uc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdtZXJnZS10YWdzLXVwZGF0ZS1pdGVtcycsIHsgZGV0YWlsOiBwcm9wcy5pdGVtcyB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBvbktleURvd24ocHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21lcmdlLXRhZ3Mta2V5LWRvd24nLCB7IGRldGFpbDogcHJvcHMuZXZlbnQgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgb25FeGl0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwWzBdLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn0pXG4iLCAiaW1wb3J0IHtFeHRlbnNpb259IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGNvbnN0IENsYXNzRXh0ZW5zaW9uID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gICAgbmFtZTogJ2NsYXNzRXh0ZW5zaW9uJyxcblxuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2xpbmsnLFxuICAgICAgICAgICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgICAgICAgICAnbGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAnYnVsbGV0TGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdvcmRlcmVkTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZScsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUhlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZVJvdycsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUNlbGwnLFxuICAgICAgICAgICAgICAgICAgICAndGV4dFN0eWxlJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGF0dHJpYnV0ZXMuY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfVxufSkiLCAiaW1wb3J0IHtFeHRlbnNpb259IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGNvbnN0IElkRXh0ZW5zaW9uID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gICAgbmFtZTogJ2lkRXh0ZW5zaW9uJyxcblxuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAnbGluaycsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhdHRyaWJ1dGVzLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgIH1cbn0pXG4iLCAiaW1wb3J0IHtFeHRlbnNpb259IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGNvbnN0IFN0eWxlRXh0ZW5zaW9uID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gICAgbmFtZTogJ3N0eWxlRXh0ZW5zaW9uJyxcblxuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2xpbmsnLFxuICAgICAgICAgICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgICAgICAgICAnbGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAnYnVsbGV0TGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdvcmRlcmVkTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZScsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUhlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZVJvdycsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUNlbGwnLFxuICAgICAgICAgICAgICAgICAgICAndGV4dFN0eWxlJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5zdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IGF0dHJpYnV0ZXMuc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfVxufSkiLCAiLypcbkxhbmd1YWdlOiBDKytcbkNhdGVnb3J5OiBjb21tb24sIHN5c3RlbVxuV2Vic2l0ZTogaHR0cHM6Ly9pc29jcHAub3JnXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gY1BsdXNQbHVzKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICAvLyBhZGRlZCBmb3IgaGlzdG9yaWMgcmVhc29ucyBiZWNhdXNlIGBobGpzLkNfTElORV9DT01NRU5UX01PREVgIGRvZXNcbiAgLy8gbm90IGluY2x1ZGUgc3VjaCBzdXBwb3J0IG5vciBjYW4gd2UgYmUgc3VyZSBhbGwgdGhlIGdyYW1tYXJzIGRlcGVuZGluZ1xuICAvLyBvbiBpdCB3b3VsZCBkZXNpcmUgdGhpcyBiZWhhdmlvclxuICBjb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gaGxqcy5DT01NRU5UKCcvLycsICckJywgeyBjb250YWluczogWyB7IGJlZ2luOiAvXFxcXFxcbi8gfSBdIH0pO1xuICBjb25zdCBERUNMVFlQRV9BVVRPX1JFID0gJ2RlY2x0eXBlXFxcXChhdXRvXFxcXCknO1xuICBjb25zdCBOQU1FU1BBQ0VfUkUgPSAnW2EtekEtWl9dXFxcXHcqOjonO1xuICBjb25zdCBURU1QTEFURV9BUkdVTUVOVF9SRSA9ICc8W148Pl0rPic7XG4gIGNvbnN0IEZVTkNUSU9OX1RZUEVfUkUgPSAnKD8hc3RydWN0KSgnXG4gICAgKyBERUNMVFlQRV9BVVRPX1JFICsgJ3wnXG4gICAgKyByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpXG4gICAgKyAnW2EtekEtWl9dXFxcXHcqJyArIHJlZ2V4Lm9wdGlvbmFsKFRFTVBMQVRFX0FSR1VNRU5UX1JFKVxuICArICcpJztcblxuICBjb25zdCBDUFBfUFJJTUlUSVZFX1RZUEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgIGJlZ2luOiAnXFxcXGJbYS16XFxcXGRfXSpfdFxcXFxiJ1xuICB9O1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9lc2NhcGVcbiAgLy8gXFxcXCBcXHggXFx4RkYgXFx1MjgzNyBcXHUwMDMyMzc0NyBcXDM3NFxuICBjb25zdCBDSEFSQUNURVJfRVNDQVBFUyA9ICdcXFxcXFxcXCh4WzAtOUEtRmEtZl17Mn18dVswLTlBLUZhLWZdezQsOH18WzAtN117M318XFxcXFMpJztcbiAgY29uc3QgU1RSSU5HUyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnKHU4P3xVfEwpP1wiJyxcbiAgICAgICAgZW5kOiAnXCInLFxuICAgICAgICBpbGxlZ2FsOiAnXFxcXG4nLFxuICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICcodTg/fFV8TCk/XFwnKCcgKyBDSEFSQUNURVJfRVNDQVBFUyArICd8LiknLFxuICAgICAgICBlbmQ6ICdcXCcnLFxuICAgICAgICBpbGxlZ2FsOiAnLidcbiAgICAgIH0sXG4gICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgYmVnaW46IC8oPzp1OD98VXxMKT9SXCIoW14oKVxcXFwgXXswLDE2fSlcXCgvLFxuICAgICAgICBlbmQ6IC9cXCkoW14oKVxcXFwgXXswLDE2fSlcIi9cbiAgICAgIH0pXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IE5VTUJFUlMgPSB7XG4gICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogJ1xcXFxiKDBiWzAxXFwnXSspJyB9LFxuICAgICAgeyBiZWdpbjogJygtPylcXFxcYihbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoKGxsfExMfGx8TCkodXxVKT98KHV8VSkobGx8TEx8bHxMKT98ZnxGfGJ8QiknIH0sXG4gICAgICB7IGJlZ2luOiAnKC0/KShcXFxcYjBbeFhdW2EtZkEtRjAtOVxcJ10rfChcXFxcYltcXFxcZFxcJ10rKFxcXFwuW1xcXFxkXFwnXSopP3xcXFxcLltcXFxcZFxcJ10rKShbZUVdWy0rXT9bXFxcXGRcXCddKyk/KScgfVxuICAgIF0sXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgUFJFUFJPQ0VTU09SID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAvI1xccypbYS16XStcXGIvLFxuICAgIGVuZDogLyQvLFxuICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6XG4gICAgICAgICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSAnXG4gICAgICAgICsgJ3ByYWdtYSBfUHJhZ21hIGlmZGVmIGlmbmRlZiBpbmNsdWRlJyB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxcXFxcbi8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIGhsanMuaW5oZXJpdChTVFJJTkdTLCB7IGNsYXNzTmFtZTogJ3N0cmluZycgfSksXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIGJlZ2luOiAvPC4qPz4vXG4gICAgICB9LFxuICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgVElUTEVfTU9ERSA9IHtcbiAgICBjbGFzc05hbWU6ICd0aXRsZScsXG4gICAgYmVnaW46IHJlZ2V4Lm9wdGlvbmFsKE5BTUVTUEFDRV9SRSkgKyBobGpzLklERU5UX1JFLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX1RJVExFID0gcmVnZXgub3B0aW9uYWwoTkFNRVNQQUNFX1JFKSArIGhsanMuSURFTlRfUkUgKyAnXFxcXHMqXFxcXCgnO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX0tFWVdPUkRTID0gW1xuICAgICdhbGlnbmFzJyxcbiAgICAnYWxpZ25vZicsXG4gICAgJ2FuZCcsXG4gICAgJ2FuZF9lcScsXG4gICAgJ2FzbScsXG4gICAgJ2F0b21pY19jYW5jZWwnLFxuICAgICdhdG9taWNfY29tbWl0JyxcbiAgICAnYXRvbWljX25vZXhjZXB0JyxcbiAgICAnYXV0bycsXG4gICAgJ2JpdGFuZCcsXG4gICAgJ2JpdG9yJyxcbiAgICAnYnJlYWsnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvX2F3YWl0JyxcbiAgICAnY29fcmV0dXJuJyxcbiAgICAnY29feWllbGQnLFxuICAgICdjb21wbCcsXG4gICAgJ2NvbmNlcHQnLFxuICAgICdjb25zdF9jYXN0fDEwJyxcbiAgICAnY29uc3RldmFsJyxcbiAgICAnY29uc3RleHByJyxcbiAgICAnY29uc3Rpbml0JyxcbiAgICAnY29udGludWUnLFxuICAgICdkZWNsdHlwZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdkZWxldGUnLFxuICAgICdkbycsXG4gICAgJ2R5bmFtaWNfY2FzdHwxMCcsXG4gICAgJ2Vsc2UnLFxuICAgICdlbnVtJyxcbiAgICAnZXhwbGljaXQnLFxuICAgICdleHBvcnQnLFxuICAgICdleHRlcm4nLFxuICAgICdmYWxzZScsXG4gICAgJ2ZpbmFsJyxcbiAgICAnZm9yJyxcbiAgICAnZnJpZW5kJyxcbiAgICAnZ290bycsXG4gICAgJ2lmJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW5saW5lJyxcbiAgICAnbW9kdWxlJyxcbiAgICAnbXV0YWJsZScsXG4gICAgJ25hbWVzcGFjZScsXG4gICAgJ25ldycsXG4gICAgJ25vZXhjZXB0JyxcbiAgICAnbm90JyxcbiAgICAnbm90X2VxJyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ29wZXJhdG9yJyxcbiAgICAnb3InLFxuICAgICdvcl9lcScsXG4gICAgJ292ZXJyaWRlJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3JlZmxleHByJyxcbiAgICAncmVnaXN0ZXInLFxuICAgICdyZWludGVycHJldF9jYXN0fDEwJyxcbiAgICAncmVxdWlyZXMnLFxuICAgICdyZXR1cm4nLFxuICAgICdzaXplb2YnLFxuICAgICdzdGF0aWNfYXNzZXJ0JyxcbiAgICAnc3RhdGljX2Nhc3R8MTAnLFxuICAgICdzdHJ1Y3QnLFxuICAgICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLFxuICAgICd0ZW1wbGF0ZScsXG4gICAgJ3RoaXMnLFxuICAgICd0aHJlYWRfbG9jYWwnLFxuICAgICd0aHJvdycsXG4gICAgJ3RyYW5zYWN0aW9uX3NhZmUnLFxuICAgICd0cmFuc2FjdGlvbl9zYWZlX2R5bmFtaWMnLFxuICAgICd0cnVlJyxcbiAgICAndHJ5JyxcbiAgICAndHlwZWRlZicsXG4gICAgJ3R5cGVpZCcsXG4gICAgJ3R5cGVuYW1lJyxcbiAgICAndW5pb24nLFxuICAgICd1c2luZycsXG4gICAgJ3ZpcnR1YWwnLFxuICAgICd2b2xhdGlsZScsXG4gICAgJ3doaWxlJyxcbiAgICAneG9yJyxcbiAgICAneG9yX2VxJ1xuICBdO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX1RZUEVTID0gW1xuICAgICdib29sJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXIxNl90JyxcbiAgICAnY2hhcjMyX3QnLFxuICAgICdjaGFyOF90JyxcbiAgICAnZG91YmxlJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdsb25nJyxcbiAgICAnc2hvcnQnLFxuICAgICd2b2lkJyxcbiAgICAnd2NoYXJfdCcsXG4gICAgJ3Vuc2lnbmVkJyxcbiAgICAnc2lnbmVkJyxcbiAgICAnY29uc3QnLFxuICAgICdzdGF0aWMnXG4gIF07XG5cbiAgY29uc3QgVFlQRV9ISU5UUyA9IFtcbiAgICAnYW55JyxcbiAgICAnYXV0b19wdHInLFxuICAgICdiYXJyaWVyJyxcbiAgICAnYmluYXJ5X3NlbWFwaG9yZScsXG4gICAgJ2JpdHNldCcsXG4gICAgJ2NvbXBsZXgnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGUnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGVfYW55JyxcbiAgICAnY291bnRpbmdfc2VtYXBob3JlJyxcbiAgICAnZGVxdWUnLFxuICAgICdmYWxzZV90eXBlJyxcbiAgICAnZnV0dXJlJyxcbiAgICAnaW1hZ2luYXJ5JyxcbiAgICAnaW5pdGlhbGl6ZXJfbGlzdCcsXG4gICAgJ2lzdHJpbmdzdHJlYW0nLFxuICAgICdqdGhyZWFkJyxcbiAgICAnbGF0Y2gnLFxuICAgICdsb2NrX2d1YXJkJyxcbiAgICAnbXVsdGltYXAnLFxuICAgICdtdWx0aXNldCcsXG4gICAgJ211dGV4JyxcbiAgICAnb3B0aW9uYWwnLFxuICAgICdvc3RyaW5nc3RyZWFtJyxcbiAgICAncGFja2FnZWRfdGFzaycsXG4gICAgJ3BhaXInLFxuICAgICdwcm9taXNlJyxcbiAgICAncHJpb3JpdHlfcXVldWUnLFxuICAgICdxdWV1ZScsXG4gICAgJ3JlY3Vyc2l2ZV9tdXRleCcsXG4gICAgJ3JlY3Vyc2l2ZV90aW1lZF9tdXRleCcsXG4gICAgJ3Njb3BlZF9sb2NrJyxcbiAgICAnc2V0JyxcbiAgICAnc2hhcmVkX2Z1dHVyZScsXG4gICAgJ3NoYXJlZF9sb2NrJyxcbiAgICAnc2hhcmVkX211dGV4JyxcbiAgICAnc2hhcmVkX3RpbWVkX211dGV4JyxcbiAgICAnc2hhcmVkX3B0cicsXG4gICAgJ3N0YWNrJyxcbiAgICAnc3RyaW5nX3ZpZXcnLFxuICAgICdzdHJpbmdzdHJlYW0nLFxuICAgICd0aW1lZF9tdXRleCcsXG4gICAgJ3RocmVhZCcsXG4gICAgJ3RydWVfdHlwZScsXG4gICAgJ3R1cGxlJyxcbiAgICAndW5pcXVlX2xvY2snLFxuICAgICd1bmlxdWVfcHRyJyxcbiAgICAndW5vcmRlcmVkX21hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aW1hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aXNldCcsXG4gICAgJ3Vub3JkZXJlZF9zZXQnLFxuICAgICd2YXJpYW50JyxcbiAgICAndmVjdG9yJyxcbiAgICAnd2Vha19wdHInLFxuICAgICd3c3RyaW5nJyxcbiAgICAnd3N0cmluZ192aWV3J1xuICBdO1xuXG4gIGNvbnN0IEZVTkNUSU9OX0hJTlRTID0gW1xuICAgICdhYm9ydCcsXG4gICAgJ2FicycsXG4gICAgJ2Fjb3MnLFxuICAgICdhcHBseScsXG4gICAgJ2FzX2NvbnN0JyxcbiAgICAnYXNpbicsXG4gICAgJ2F0YW4nLFxuICAgICdhdGFuMicsXG4gICAgJ2NhbGxvYycsXG4gICAgJ2NlaWwnLFxuICAgICdjZXJyJyxcbiAgICAnY2luJyxcbiAgICAnY2xvZycsXG4gICAgJ2NvcycsXG4gICAgJ2Nvc2gnLFxuICAgICdjb3V0JyxcbiAgICAnZGVjbHZhbCcsXG4gICAgJ2VuZGwnLFxuICAgICdleGNoYW5nZScsXG4gICAgJ2V4aXQnLFxuICAgICdleHAnLFxuICAgICdmYWJzJyxcbiAgICAnZmxvb3InLFxuICAgICdmbW9kJyxcbiAgICAnZm9yd2FyZCcsXG4gICAgJ2ZwcmludGYnLFxuICAgICdmcHV0cycsXG4gICAgJ2ZyZWUnLFxuICAgICdmcmV4cCcsXG4gICAgJ2ZzY2FuZicsXG4gICAgJ2Z1dHVyZScsXG4gICAgJ2ludm9rZScsXG4gICAgJ2lzYWxudW0nLFxuICAgICdpc2FscGhhJyxcbiAgICAnaXNjbnRybCcsXG4gICAgJ2lzZGlnaXQnLFxuICAgICdpc2dyYXBoJyxcbiAgICAnaXNsb3dlcicsXG4gICAgJ2lzcHJpbnQnLFxuICAgICdpc3B1bmN0JyxcbiAgICAnaXNzcGFjZScsXG4gICAgJ2lzdXBwZXInLFxuICAgICdpc3hkaWdpdCcsXG4gICAgJ2xhYnMnLFxuICAgICdsYXVuZGVyJyxcbiAgICAnbGRleHAnLFxuICAgICdsb2cnLFxuICAgICdsb2cxMCcsXG4gICAgJ21ha2VfcGFpcicsXG4gICAgJ21ha2Vfc2hhcmVkJyxcbiAgICAnbWFrZV9zaGFyZWRfZm9yX292ZXJ3cml0ZScsXG4gICAgJ21ha2VfdHVwbGUnLFxuICAgICdtYWtlX3VuaXF1ZScsXG4gICAgJ21hbGxvYycsXG4gICAgJ21lbWNocicsXG4gICAgJ21lbWNtcCcsXG4gICAgJ21lbWNweScsXG4gICAgJ21lbXNldCcsXG4gICAgJ21vZGYnLFxuICAgICdtb3ZlJyxcbiAgICAncG93JyxcbiAgICAncHJpbnRmJyxcbiAgICAncHV0Y2hhcicsXG4gICAgJ3B1dHMnLFxuICAgICdyZWFsbG9jJyxcbiAgICAnc2NhbmYnLFxuICAgICdzaW4nLFxuICAgICdzaW5oJyxcbiAgICAnc25wcmludGYnLFxuICAgICdzcHJpbnRmJyxcbiAgICAnc3FydCcsXG4gICAgJ3NzY2FuZicsXG4gICAgJ3N0ZCcsXG4gICAgJ3N0ZGVycicsXG4gICAgJ3N0ZGluJyxcbiAgICAnc3Rkb3V0JyxcbiAgICAnc3RyY2F0JyxcbiAgICAnc3RyY2hyJyxcbiAgICAnc3RyY21wJyxcbiAgICAnc3RyY3B5JyxcbiAgICAnc3RyY3NwbicsXG4gICAgJ3N0cmxlbicsXG4gICAgJ3N0cm5jYXQnLFxuICAgICdzdHJuY21wJyxcbiAgICAnc3RybmNweScsXG4gICAgJ3N0cnBicmsnLFxuICAgICdzdHJyY2hyJyxcbiAgICAnc3Ryc3BuJyxcbiAgICAnc3Ryc3RyJyxcbiAgICAnc3dhcCcsXG4gICAgJ3RhbicsXG4gICAgJ3RhbmgnLFxuICAgICd0ZXJtaW5hdGUnLFxuICAgICd0b191bmRlcmx5aW5nJyxcbiAgICAndG9sb3dlcicsXG4gICAgJ3RvdXBwZXInLFxuICAgICd2ZnByaW50ZicsXG4gICAgJ3Zpc2l0JyxcbiAgICAndnByaW50ZicsXG4gICAgJ3ZzcHJpbnRmJ1xuICBdO1xuXG4gIGNvbnN0IExJVEVSQUxTID0gW1xuICAgICdOVUxMJyxcbiAgICAnZmFsc2UnLFxuICAgICdudWxsb3B0JyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ3RydWUnXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2tleXdvcmRcbiAgY29uc3QgQlVJTFRfSU4gPSBbICdfUHJhZ21hJyBdO1xuXG4gIGNvbnN0IENQUF9LRVlXT1JEUyA9IHtcbiAgICB0eXBlOiBSRVNFUlZFRF9UWVBFUyxcbiAgICBrZXl3b3JkOiBSRVNFUlZFRF9LRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU4sXG4gICAgX3R5cGVfaGludHM6IFRZUEVfSElOVFNcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ESVNQQVRDSCA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbi5kaXNwYXRjaCcsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAvLyBPbmx5IGZvciByZWxldmFuY2UsIG5vdCBoaWdobGlnaHRpbmcuXG4gICAgICBfaGludDogRlVOQ1RJT05fSElOVFMgfSxcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1xcYi8sXG4gICAgICAvKD8hZGVjbHR5cGUpLyxcbiAgICAgIC8oPyFpZikvLFxuICAgICAgLyg/IWZvcikvLFxuICAgICAgLyg/IXN3aXRjaCkvLFxuICAgICAgLyg/IXdoaWxlKS8sXG4gICAgICBobGpzLklERU5UX1JFLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC8oPFtePD5dKz58KVxccypcXCgvKSlcbiAgfTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRBSU5TID0gW1xuICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgIFBSRVBST0NFU1NPUixcbiAgICBDUFBfUFJJTUlUSVZFX1RZUEVTLFxuICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBOVU1CRVJTLFxuICAgIFNUUklOR1NcbiAgXTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRFWFQgPSB7XG4gICAgLy8gVGhpcyBtb2RlIGNvdmVycyBleHByZXNzaW9uIGNvbnRleHQgd2hlcmUgd2UgY2FuJ3QgZXhwZWN0IGEgZnVuY3Rpb25cbiAgICAvLyBkZWZpbml0aW9uIGFuZCBzaG91bGRuJ3QgaGlnaGxpZ2h0IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBvbmU6XG4gICAgLy8gYHJldHVybiBzb21lKClgLCBgZWxzZSBpZigpYCwgYCh4KnN1bSgxLCAyKSlgXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC89LyxcbiAgICAgICAgZW5kOiAvOy9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25ldyB0aHJvdyByZXR1cm4gZWxzZScsXG4gICAgICAgIGVuZDogLzsvXG4gICAgICB9XG4gICAgXSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBFWFBSRVNTSU9OX0NPTlRBSU5TLmNvbmNhdChbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IEVYUFJFU1NJT05fQ09OVEFJTlMuY29uY2F0KFsgJ3NlbGYnIF0pLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdKSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgYmVnaW46ICcoJyArIEZVTkNUSU9OX1RZUEVfUkUgKyAnW1xcXFwqJlxcXFxzXSspKycgKyBGVU5DVElPTl9USVRMRSxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBlbmQ6IC9bezs9XS8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC9bXlxcd1xcc1xcKiY6PD4uXS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgICBiZWdpbjogREVDTFRZUEVfQVVUT19SRSxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogRlVOQ1RJT05fVElUTEUsXG4gICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICBjb250YWluczogWyBUSVRMRV9NT0RFIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIGxvb2stYmVoaW5kIG9uIHRoZSBiZWxvdyBydWxlXG4gICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZ3JhYmJpbmcgdGhlIGZpbmFsIDogaW4gYSA6OiBwYWlyXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOjovLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICAvLyBpbml0aWFsaXplcnNcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC86LyxcbiAgICAgICAgZW5kc1dpdGhQYXJlbnQ6IHRydWUsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICBOVU1CRVJTXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAvLyBhbGxvdyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLCBlLmcuOlxuICAgICAgLy8gZXh0ZXJuIHZvaWQgZihpbnQpLCBnKGNoYXIpO1xuICAgICAge1xuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIG1hdGNoOiAvLC9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBTVFJJTkdTLFxuICAgICAgICAgIE5VTUJFUlMsXG4gICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFUyxcbiAgICAgICAgICAvLyBDb3VudCBtYXRjaGluZyBwYXJlbnRoZXNlcy5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgICdzZWxmJyxcbiAgICAgICAgICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICAgICAgTlVNQkVSUyxcbiAgICAgICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFU1xuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIENQUF9QUklNSVRJVkVfVFlQRVMsXG4gICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIFBSRVBST0NFU1NPUlxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdDKysnLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdjYycsXG4gICAgICAnYysrJyxcbiAgICAgICdoKysnLFxuICAgICAgJ2hwcCcsXG4gICAgICAnaGgnLFxuICAgICAgJ2h4eCcsXG4gICAgICAnY3h4J1xuICAgIF0sXG4gICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNsYXNzTmFtZUFsaWFzZXM6IHsgJ2Z1bmN0aW9uLmRpc3BhdGNoJzogJ2J1aWx0X2luJyB9LFxuICAgIGNvbnRhaW5zOiBbXS5jb25jYXQoXG4gICAgICBFWFBSRVNTSU9OX0NPTlRFWFQsXG4gICAgICBGVU5DVElPTl9ERUNMQVJBVElPTixcbiAgICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgICAgRVhQUkVTU0lPTl9DT05UQUlOUyxcbiAgICAgIFtcbiAgICAgICAgUFJFUFJPQ0VTU09SLFxuICAgICAgICB7IC8vIGNvbnRhaW5lcnM6IGllLCBgdmVjdG9yIDxpbnQ+IHJvb21zICg5KTtgXG4gICAgICAgICAgYmVnaW46ICdcXFxcYihkZXF1ZXxsaXN0fHF1ZXVlfHByaW9yaXR5X3F1ZXVlfHBhaXJ8c3RhY2t8dmVjdG9yfG1hcHxzZXR8Yml0c2V0fG11bHRpc2V0fG11bHRpbWFwfHVub3JkZXJlZF9tYXB8dW5vcmRlcmVkX3NldHx1bm9yZGVyZWRfbXVsdGlzZXR8dW5vcmRlcmVkX211bHRpbWFwfGFycmF5fHR1cGxlfG9wdGlvbmFsfHZhcmlhbnR8ZnVuY3Rpb24pXFxcXHMqPCg/ITwpJyxcbiAgICAgICAgICBlbmQ6ICc+JyxcbiAgICAgICAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgICBDUFBfUFJJTUlUSVZFX1RZUEVTXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46IGhsanMuSURFTlRfUkUgKyAnOjonLFxuICAgICAgICAgIGtleXdvcmRzOiBDUFBfS0VZV09SRFNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgICAvLyBleHRyYSBjb21wbGV4aXR5IHRvIGRlYWwgd2l0aCBgZW51bSBjbGFzc2AgYW5kIGBlbnVtIHN0cnVjdGBcbiAgICAgICAgICAgIC9cXGIoPzplbnVtKD86XFxzKyg/OmNsYXNzfHN0cnVjdCkpP3xjbGFzc3xzdHJ1Y3R8dW5pb24pLyxcbiAgICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICAgIC9cXHcrL1xuICAgICAgICAgIF0sXG4gICAgICAgICAgY2xhc3NOYW1lOiB7XG4gICAgICAgICAgICAxOiAna2V5d29yZCcsXG4gICAgICAgICAgICAzOiAndGl0bGUuY2xhc3MnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdKVxuICB9O1xufVxuXG4vKlxuTGFuZ3VhZ2U6IEFyZHVpbm9cbkF1dGhvcjogU3RlZmFuaWEgTWVsbGFpIDxzLm1lbGxhaUBhcmR1aW5vLmNjPlxuRGVzY3JpcHRpb246IFRoZSBBcmR1aW5vXHUwMEFFIExhbmd1YWdlIGlzIGEgc3VwZXJzZXQgb2YgQysrLiBUaGlzIHJ1bGVzIGFyZSBkZXNpZ25lZCB0byBoaWdobGlnaHQgdGhlIEFyZHVpbm9cdTAwQUUgc291cmNlIGNvZGUuIEZvciBpbmZvIGFib3V0IGxhbmd1YWdlIHNlZSBodHRwOi8vd3d3LmFyZHVpbm8uY2MuXG5XZWJzaXRlOiBodHRwczovL3d3dy5hcmR1aW5vLmNjXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gYXJkdWlubyhobGpzKSB7XG4gIGNvbnN0IEFSRFVJTk9fS1cgPSB7XG4gICAgdHlwZTogW1xuICAgICAgXCJib29sZWFuXCIsXG4gICAgICBcImJ5dGVcIixcbiAgICAgIFwid29yZFwiLFxuICAgICAgXCJTdHJpbmdcIlxuICAgIF0sXG4gICAgYnVpbHRfaW46IFtcbiAgICAgIFwiS2V5Ym9hcmRDb250cm9sbGVyXCIsXG4gICAgICBcIk1vdXNlQ29udHJvbGxlclwiLFxuICAgICAgXCJTb2Z0d2FyZVNlcmlhbFwiLFxuICAgICAgXCJFdGhlcm5ldFNlcnZlclwiLFxuICAgICAgXCJFdGhlcm5ldENsaWVudFwiLFxuICAgICAgXCJMaXF1aWRDcnlzdGFsXCIsXG4gICAgICBcIlJvYm90Q29udHJvbFwiLFxuICAgICAgXCJHU01Wb2ljZUNhbGxcIixcbiAgICAgIFwiRXRoZXJuZXRVRFBcIixcbiAgICAgIFwiRXNwbG9yYVRGVFwiLFxuICAgICAgXCJIdHRwQ2xpZW50XCIsXG4gICAgICBcIlJvYm90TW90b3JcIixcbiAgICAgIFwiV2lGaUNsaWVudFwiLFxuICAgICAgXCJHU01TY2FubmVyXCIsXG4gICAgICBcIkZpbGVTeXN0ZW1cIixcbiAgICAgIFwiU2NoZWR1bGVyXCIsXG4gICAgICBcIkdTTVNlcnZlclwiLFxuICAgICAgXCJZdW5DbGllbnRcIixcbiAgICAgIFwiWXVuU2VydmVyXCIsXG4gICAgICBcIklQQWRkcmVzc1wiLFxuICAgICAgXCJHU01DbGllbnRcIixcbiAgICAgIFwiR1NNTW9kZW1cIixcbiAgICAgIFwiS2V5Ym9hcmRcIixcbiAgICAgIFwiRXRoZXJuZXRcIixcbiAgICAgIFwiQ29uc29sZVwiLFxuICAgICAgXCJHU01CYW5kXCIsXG4gICAgICBcIkVzcGxvcmFcIixcbiAgICAgIFwiU3RlcHBlclwiLFxuICAgICAgXCJQcm9jZXNzXCIsXG4gICAgICBcIldpRmlVRFBcIixcbiAgICAgIFwiR1NNX1NNU1wiLFxuICAgICAgXCJNYWlsYm94XCIsXG4gICAgICBcIlVTQkhvc3RcIixcbiAgICAgIFwiRmlybWF0YVwiLFxuICAgICAgXCJQSW1hZ2VcIixcbiAgICAgIFwiQ2xpZW50XCIsXG4gICAgICBcIlNlcnZlclwiLFxuICAgICAgXCJHU01QSU5cIixcbiAgICAgIFwiRmlsZUlPXCIsXG4gICAgICBcIkJyaWRnZVwiLFxuICAgICAgXCJTZXJpYWxcIixcbiAgICAgIFwiRUVQUk9NXCIsXG4gICAgICBcIlN0cmVhbVwiLFxuICAgICAgXCJNb3VzZVwiLFxuICAgICAgXCJBdWRpb1wiLFxuICAgICAgXCJTZXJ2b1wiLFxuICAgICAgXCJGaWxlXCIsXG4gICAgICBcIlRhc2tcIixcbiAgICAgIFwiR1BSU1wiLFxuICAgICAgXCJXaUZpXCIsXG4gICAgICBcIldpcmVcIixcbiAgICAgIFwiVEZUXCIsXG4gICAgICBcIkdTTVwiLFxuICAgICAgXCJTUElcIixcbiAgICAgIFwiU0RcIlxuICAgIF0sXG4gICAgX2hpbnRzOiBbXG4gICAgICBcInNldHVwXCIsXG4gICAgICBcImxvb3BcIixcbiAgICAgIFwicnVuU2hlbGxDb21tYW5kQXN5bmNocm9ub3VzbHlcIixcbiAgICAgIFwiYW5hbG9nV3JpdGVSZXNvbHV0aW9uXCIsXG4gICAgICBcInJldHJpZXZlQ2FsbGluZ051bWJlclwiLFxuICAgICAgXCJwcmludEZpcm13YXJlVmVyc2lvblwiLFxuICAgICAgXCJhbmFsb2dSZWFkUmVzb2x1dGlvblwiLFxuICAgICAgXCJzZW5kRGlnaXRhbFBvcnRQYWlyXCIsXG4gICAgICBcIm5vTGlzdGVuT25Mb2NhbGhvc3RcIixcbiAgICAgIFwicmVhZEpveXN0aWNrQnV0dG9uXCIsXG4gICAgICBcInNldEZpcm13YXJlVmVyc2lvblwiLFxuICAgICAgXCJyZWFkSm95c3RpY2tTd2l0Y2hcIixcbiAgICAgIFwic2Nyb2xsRGlzcGxheVJpZ2h0XCIsXG4gICAgICBcImdldFZvaWNlQ2FsbFN0YXR1c1wiLFxuICAgICAgXCJzY3JvbGxEaXNwbGF5TGVmdFwiLFxuICAgICAgXCJ3cml0ZU1pY3Jvc2Vjb25kc1wiLFxuICAgICAgXCJkZWxheU1pY3Jvc2Vjb25kc1wiLFxuICAgICAgXCJiZWdpblRyYW5zbWlzc2lvblwiLFxuICAgICAgXCJnZXRTaWduYWxTdHJlbmd0aFwiLFxuICAgICAgXCJydW5Bc3luY2hyb25vdXNseVwiLFxuICAgICAgXCJnZXRBc3luY2hyb25vdXNseVwiLFxuICAgICAgXCJsaXN0ZW5PbkxvY2FsaG9zdFwiLFxuICAgICAgXCJnZXRDdXJyZW50Q2FycmllclwiLFxuICAgICAgXCJyZWFkQWNjZWxlcm9tZXRlclwiLFxuICAgICAgXCJtZXNzYWdlQXZhaWxhYmxlXCIsXG4gICAgICBcInNlbmREaWdpdGFsUG9ydHNcIixcbiAgICAgIFwibGluZUZvbGxvd0NvbmZpZ1wiLFxuICAgICAgXCJjb3VudHJ5TmFtZVdyaXRlXCIsXG4gICAgICBcInJ1blNoZWxsQ29tbWFuZFwiLFxuICAgICAgXCJyZWFkU3RyaW5nVW50aWxcIixcbiAgICAgIFwicmV3aW5kRGlyZWN0b3J5XCIsXG4gICAgICBcInJlYWRUZW1wZXJhdHVyZVwiLFxuICAgICAgXCJzZXRDbG9ja0RpdmlkZXJcIixcbiAgICAgIFwicmVhZExpZ2h0U2Vuc29yXCIsXG4gICAgICBcImVuZFRyYW5zbWlzc2lvblwiLFxuICAgICAgXCJhbmFsb2dSZWZlcmVuY2VcIixcbiAgICAgIFwiZGV0YWNoSW50ZXJydXB0XCIsXG4gICAgICBcImNvdW50cnlOYW1lUmVhZFwiLFxuICAgICAgXCJhdHRhY2hJbnRlcnJ1cHRcIixcbiAgICAgIFwiZW5jcnlwdGlvblR5cGVcIixcbiAgICAgIFwicmVhZEJ5dGVzVW50aWxcIixcbiAgICAgIFwicm9ib3ROYW1lV3JpdGVcIixcbiAgICAgIFwicmVhZE1pY3JvcGhvbmVcIixcbiAgICAgIFwicm9ib3ROYW1lUmVhZFwiLFxuICAgICAgXCJjaXR5TmFtZVdyaXRlXCIsXG4gICAgICBcInVzZXJOYW1lV3JpdGVcIixcbiAgICAgIFwicmVhZEpveXN0aWNrWVwiLFxuICAgICAgXCJyZWFkSm95c3RpY2tYXCIsXG4gICAgICBcIm1vdXNlUmVsZWFzZWRcIixcbiAgICAgIFwib3Blbk5leHRGaWxlXCIsXG4gICAgICBcInNjYW5OZXR3b3Jrc1wiLFxuICAgICAgXCJub0ludGVycnVwdHNcIixcbiAgICAgIFwiZGlnaXRhbFdyaXRlXCIsXG4gICAgICBcImJlZ2luU3BlYWtlclwiLFxuICAgICAgXCJtb3VzZVByZXNzZWRcIixcbiAgICAgIFwiaXNBY3Rpb25Eb25lXCIsXG4gICAgICBcIm1vdXNlRHJhZ2dlZFwiLFxuICAgICAgXCJkaXNwbGF5TG9nb3NcIixcbiAgICAgIFwibm9BdXRvc2Nyb2xsXCIsXG4gICAgICBcImFkZFBhcmFtZXRlclwiLFxuICAgICAgXCJyZW1vdGVOdW1iZXJcIixcbiAgICAgIFwiZ2V0TW9kaWZpZXJzXCIsXG4gICAgICBcImtleWJvYXJkUmVhZFwiLFxuICAgICAgXCJ1c2VyTmFtZVJlYWRcIixcbiAgICAgIFwid2FpdENvbnRpbnVlXCIsXG4gICAgICBcInByb2Nlc3NJbnB1dFwiLFxuICAgICAgXCJwYXJzZUNvbW1hbmRcIixcbiAgICAgIFwicHJpbnRWZXJzaW9uXCIsXG4gICAgICBcInJlYWROZXR3b3Jrc1wiLFxuICAgICAgXCJ3cml0ZU1lc3NhZ2VcIixcbiAgICAgIFwiYmxpbmtWZXJzaW9uXCIsXG4gICAgICBcImNpdHlOYW1lUmVhZFwiLFxuICAgICAgXCJyZWFkTWVzc2FnZVwiLFxuICAgICAgXCJzZXREYXRhTW9kZVwiLFxuICAgICAgXCJwYXJzZVBhY2tldFwiLFxuICAgICAgXCJpc0xpc3RlbmluZ1wiLFxuICAgICAgXCJzZXRCaXRPcmRlclwiLFxuICAgICAgXCJiZWdpblBhY2tldFwiLFxuICAgICAgXCJpc0RpcmVjdG9yeVwiLFxuICAgICAgXCJtb3RvcnNXcml0ZVwiLFxuICAgICAgXCJkcmF3Q29tcGFzc1wiLFxuICAgICAgXCJkaWdpdGFsUmVhZFwiLFxuICAgICAgXCJjbGVhclNjcmVlblwiLFxuICAgICAgXCJzZXJpYWxFdmVudFwiLFxuICAgICAgXCJyaWdodFRvTGVmdFwiLFxuICAgICAgXCJzZXRUZXh0U2l6ZVwiLFxuICAgICAgXCJsZWZ0VG9SaWdodFwiLFxuICAgICAgXCJyZXF1ZXN0RnJvbVwiLFxuICAgICAgXCJrZXlSZWxlYXNlZFwiLFxuICAgICAgXCJjb21wYXNzUmVhZFwiLFxuICAgICAgXCJhbmFsb2dXcml0ZVwiLFxuICAgICAgXCJpbnRlcnJ1cHRzXCIsXG4gICAgICBcIldpRmlTZXJ2ZXJcIixcbiAgICAgIFwiZGlzY29ubmVjdFwiLFxuICAgICAgXCJwbGF5TWVsb2R5XCIsXG4gICAgICBcInBhcnNlRmxvYXRcIixcbiAgICAgIFwiYXV0b3Njcm9sbFwiLFxuICAgICAgXCJnZXRQSU5Vc2VkXCIsXG4gICAgICBcInNldFBJTlVzZWRcIixcbiAgICAgIFwic2V0VGltZW91dFwiLFxuICAgICAgXCJzZW5kQW5hbG9nXCIsXG4gICAgICBcInJlYWRTbGlkZXJcIixcbiAgICAgIFwiYW5hbG9nUmVhZFwiLFxuICAgICAgXCJiZWdpbldyaXRlXCIsXG4gICAgICBcImNyZWF0ZUNoYXJcIixcbiAgICAgIFwibW90b3JzU3RvcFwiLFxuICAgICAgXCJrZXlQcmVzc2VkXCIsXG4gICAgICBcInRlbXBvV3JpdGVcIixcbiAgICAgIFwicmVhZEJ1dHRvblwiLFxuICAgICAgXCJzdWJuZXRNYXNrXCIsXG4gICAgICBcImRlYnVnUHJpbnRcIixcbiAgICAgIFwibWFjQWRkcmVzc1wiLFxuICAgICAgXCJ3cml0ZUdyZWVuXCIsXG4gICAgICBcInJhbmRvbVNlZWRcIixcbiAgICAgIFwiYXR0YWNoR1BSU1wiLFxuICAgICAgXCJyZWFkU3RyaW5nXCIsXG4gICAgICBcInNlbmRTdHJpbmdcIixcbiAgICAgIFwicmVtb3RlUG9ydFwiLFxuICAgICAgXCJyZWxlYXNlQWxsXCIsXG4gICAgICBcIm1vdXNlTW92ZWRcIixcbiAgICAgIFwiYmFja2dyb3VuZFwiLFxuICAgICAgXCJnZXRYQ2hhbmdlXCIsXG4gICAgICBcImdldFlDaGFuZ2VcIixcbiAgICAgIFwiYW5zd2VyQ2FsbFwiLFxuICAgICAgXCJnZXRSZXN1bHRcIixcbiAgICAgIFwidm9pY2VDYWxsXCIsXG4gICAgICBcImVuZFBhY2tldFwiLFxuICAgICAgXCJjb25zdHJhaW5cIixcbiAgICAgIFwiZ2V0U29ja2V0XCIsXG4gICAgICBcIndyaXRlSlNPTlwiLFxuICAgICAgXCJnZXRCdXR0b25cIixcbiAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICBcImNvbm5lY3RlZFwiLFxuICAgICAgXCJmaW5kVW50aWxcIixcbiAgICAgIFwicmVhZEJ5dGVzXCIsXG4gICAgICBcImV4aXRWYWx1ZVwiLFxuICAgICAgXCJyZWFkR3JlZW5cIixcbiAgICAgIFwid3JpdGVCbHVlXCIsXG4gICAgICBcInN0YXJ0TG9vcFwiLFxuICAgICAgXCJJUEFkZHJlc3NcIixcbiAgICAgIFwiaXNQcmVzc2VkXCIsXG4gICAgICBcInNlbmRTeXNleFwiLFxuICAgICAgXCJwYXVzZU1vZGVcIixcbiAgICAgIFwiZ2F0ZXdheUlQXCIsXG4gICAgICBcInNldEN1cnNvclwiLFxuICAgICAgXCJnZXRPZW1LZXlcIixcbiAgICAgIFwidHVuZVdyaXRlXCIsXG4gICAgICBcIm5vRGlzcGxheVwiLFxuICAgICAgXCJsb2FkSW1hZ2VcIixcbiAgICAgIFwic3dpdGNoUElOXCIsXG4gICAgICBcIm9uUmVxdWVzdFwiLFxuICAgICAgXCJvblJlY2VpdmVcIixcbiAgICAgIFwiY2hhbmdlUElOXCIsXG4gICAgICBcInBsYXlGaWxlXCIsXG4gICAgICBcIm5vQnVmZmVyXCIsXG4gICAgICBcInBhcnNlSW50XCIsXG4gICAgICBcIm92ZXJmbG93XCIsXG4gICAgICBcImNoZWNrUElOXCIsXG4gICAgICBcImtub2JSZWFkXCIsXG4gICAgICBcImJlZ2luVEZUXCIsXG4gICAgICBcImJpdENsZWFyXCIsXG4gICAgICBcInVwZGF0ZUlSXCIsXG4gICAgICBcImJpdFdyaXRlXCIsXG4gICAgICBcInBvc2l0aW9uXCIsXG4gICAgICBcIndyaXRlUkdCXCIsXG4gICAgICBcImhpZ2hCeXRlXCIsXG4gICAgICBcIndyaXRlUmVkXCIsXG4gICAgICBcInNldFNwZWVkXCIsXG4gICAgICBcInJlYWRCbHVlXCIsXG4gICAgICBcIm5vU3Ryb2tlXCIsXG4gICAgICBcInJlbW90ZUlQXCIsXG4gICAgICBcInRyYW5zZmVyXCIsXG4gICAgICBcInNodXRkb3duXCIsXG4gICAgICBcImhhbmdDYWxsXCIsXG4gICAgICBcImJlZ2luU01TXCIsXG4gICAgICBcImVuZFdyaXRlXCIsXG4gICAgICBcImF0dGFjaGVkXCIsXG4gICAgICBcIm1haW50YWluXCIsXG4gICAgICBcIm5vQ3Vyc29yXCIsXG4gICAgICBcImNoZWNrUmVnXCIsXG4gICAgICBcImNoZWNrUFVLXCIsXG4gICAgICBcInNoaWZ0T3V0XCIsXG4gICAgICBcImlzVmFsaWRcIixcbiAgICAgIFwic2hpZnRJblwiLFxuICAgICAgXCJwdWxzZUluXCIsXG4gICAgICBcImNvbm5lY3RcIixcbiAgICAgIFwicHJpbnRsblwiLFxuICAgICAgXCJsb2NhbElQXCIsXG4gICAgICBcInBpbk1vZGVcIixcbiAgICAgIFwiZ2V0SU1FSVwiLFxuICAgICAgXCJkaXNwbGF5XCIsXG4gICAgICBcIm5vQmxpbmtcIixcbiAgICAgIFwicHJvY2Vzc1wiLFxuICAgICAgXCJnZXRCYW5kXCIsXG4gICAgICBcInJ1bm5pbmdcIixcbiAgICAgIFwiYmVnaW5TRFwiLFxuICAgICAgXCJkcmF3Qk1QXCIsXG4gICAgICBcImxvd0J5dGVcIixcbiAgICAgIFwic2V0QmFuZFwiLFxuICAgICAgXCJyZWxlYXNlXCIsXG4gICAgICBcImJpdFJlYWRcIixcbiAgICAgIFwicHJlcGFyZVwiLFxuICAgICAgXCJwb2ludFRvXCIsXG4gICAgICBcInJlYWRSZWRcIixcbiAgICAgIFwic2V0TW9kZVwiLFxuICAgICAgXCJub0ZpbGxcIixcbiAgICAgIFwicmVtb3ZlXCIsXG4gICAgICBcImxpc3RlblwiLFxuICAgICAgXCJzdHJva2VcIixcbiAgICAgIFwiZGV0YWNoXCIsXG4gICAgICBcImF0dGFjaFwiLFxuICAgICAgXCJub1RvbmVcIixcbiAgICAgIFwiZXhpc3RzXCIsXG4gICAgICBcImJ1ZmZlclwiLFxuICAgICAgXCJoZWlnaHRcIixcbiAgICAgIFwiYml0U2V0XCIsXG4gICAgICBcImNpcmNsZVwiLFxuICAgICAgXCJjb25maWdcIixcbiAgICAgIFwiY3Vyc29yXCIsXG4gICAgICBcInJhbmRvbVwiLFxuICAgICAgXCJJUnJlYWRcIixcbiAgICAgIFwic2V0RE5TXCIsXG4gICAgICBcImVuZFNNU1wiLFxuICAgICAgXCJnZXRLZXlcIixcbiAgICAgIFwibWljcm9zXCIsXG4gICAgICBcIm1pbGxpc1wiLFxuICAgICAgXCJiZWdpblwiLFxuICAgICAgXCJwcmludFwiLFxuICAgICAgXCJ3cml0ZVwiLFxuICAgICAgXCJyZWFkeVwiLFxuICAgICAgXCJmbHVzaFwiLFxuICAgICAgXCJ3aWR0aFwiLFxuICAgICAgXCJpc1BJTlwiLFxuICAgICAgXCJibGlua1wiLFxuICAgICAgXCJjbGVhclwiLFxuICAgICAgXCJwcmVzc1wiLFxuICAgICAgXCJta2RpclwiLFxuICAgICAgXCJybWRpclwiLFxuICAgICAgXCJjbG9zZVwiLFxuICAgICAgXCJwb2ludFwiLFxuICAgICAgXCJ5aWVsZFwiLFxuICAgICAgXCJpbWFnZVwiLFxuICAgICAgXCJCU1NJRFwiLFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgXCJkZWxheVwiLFxuICAgICAgXCJyZWFkXCIsXG4gICAgICBcInRleHRcIixcbiAgICAgIFwibW92ZVwiLFxuICAgICAgXCJwZWVrXCIsXG4gICAgICBcImJlZXBcIixcbiAgICAgIFwicmVjdFwiLFxuICAgICAgXCJsaW5lXCIsXG4gICAgICBcIm9wZW5cIixcbiAgICAgIFwic2Vla1wiLFxuICAgICAgXCJmaWxsXCIsXG4gICAgICBcInNpemVcIixcbiAgICAgIFwidHVyblwiLFxuICAgICAgXCJzdG9wXCIsXG4gICAgICBcImhvbWVcIixcbiAgICAgIFwiZmluZFwiLFxuICAgICAgXCJzdGVwXCIsXG4gICAgICBcInRvbmVcIixcbiAgICAgIFwic3FydFwiLFxuICAgICAgXCJSU1NJXCIsXG4gICAgICBcIlNTSURcIixcbiAgICAgIFwiZW5kXCIsXG4gICAgICBcImJpdFwiLFxuICAgICAgXCJ0YW5cIixcbiAgICAgIFwiY29zXCIsXG4gICAgICBcInNpblwiLFxuICAgICAgXCJwb3dcIixcbiAgICAgIFwibWFwXCIsXG4gICAgICBcImFic1wiLFxuICAgICAgXCJtYXhcIixcbiAgICAgIFwibWluXCIsXG4gICAgICBcImdldFwiLFxuICAgICAgXCJydW5cIixcbiAgICAgIFwicHV0XCJcbiAgICBdLFxuICAgIGxpdGVyYWw6IFtcbiAgICAgIFwiRElHSVRBTF9NRVNTQUdFXCIsXG4gICAgICBcIkZJUk1BVEFfU1RSSU5HXCIsXG4gICAgICBcIkFOQUxPR19NRVNTQUdFXCIsXG4gICAgICBcIlJFUE9SVF9ESUdJVEFMXCIsXG4gICAgICBcIlJFUE9SVF9BTkFMT0dcIixcbiAgICAgIFwiSU5QVVRfUFVMTFVQXCIsXG4gICAgICBcIlNFVF9QSU5fTU9ERVwiLFxuICAgICAgXCJJTlRFUk5BTDJWNTZcIixcbiAgICAgIFwiU1lTVEVNX1JFU0VUXCIsXG4gICAgICBcIkxFRF9CVUlMVElOXCIsXG4gICAgICBcIklOVEVSTkFMMVYxXCIsXG4gICAgICBcIlNZU0VYX1NUQVJUXCIsXG4gICAgICBcIklOVEVSTkFMXCIsXG4gICAgICBcIkVYVEVSTkFMXCIsXG4gICAgICBcIkRFRkFVTFRcIixcbiAgICAgIFwiT1VUUFVUXCIsXG4gICAgICBcIklOUFVUXCIsXG4gICAgICBcIkhJR0hcIixcbiAgICAgIFwiTE9XXCJcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgQVJEVUlOTyA9IGNQbHVzUGx1cyhobGpzKTtcblxuICBjb25zdCBrd3MgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsYW55Pn0gKi8gKEFSRFVJTk8ua2V5d29yZHMpO1xuXG4gIGt3cy50eXBlID0gW1xuICAgIC4uLmt3cy50eXBlLFxuICAgIC4uLkFSRFVJTk9fS1cudHlwZVxuICBdO1xuICBrd3MubGl0ZXJhbCA9IFtcbiAgICAuLi5rd3MubGl0ZXJhbCxcbiAgICAuLi5BUkRVSU5PX0tXLmxpdGVyYWxcbiAgXTtcbiAga3dzLmJ1aWx0X2luID0gW1xuICAgIC4uLmt3cy5idWlsdF9pbixcbiAgICAuLi5BUkRVSU5PX0tXLmJ1aWx0X2luXG4gIF07XG4gIGt3cy5faGludHMgPSBBUkRVSU5PX0tXLl9oaW50cztcblxuICBBUkRVSU5PLm5hbWUgPSAnQXJkdWlubyc7XG4gIEFSRFVJTk8uYWxpYXNlcyA9IFsgJ2lubycgXTtcbiAgQVJEVUlOTy5zdXBlcnNldE9mID0gXCJjcHBcIjtcblxuICByZXR1cm4gQVJEVUlOTztcbn1cblxuZXhwb3J0IHsgYXJkdWlubyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBCYXNoXG5BdXRob3I6IHZhaCA8dmFodGVuYmVyZ0BnbWFpbC5jb20+XG5Db250cmlidXRyb3JzOiBCZW5qYW1pbiBQYW5uZWxsIDxjb250YWN0QHNpZXJyYXNvZnR3b3Jrcy5jb20+XG5XZWJzaXRlOiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2Jhc2gvXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gYmFzaChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgVkFSID0ge307XG4gIGNvbnN0IEJSQUNFRF9WQVIgPSB7XG4gICAgYmVnaW46IC9cXCRcXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIFwic2VsZlwiLFxuICAgICAge1xuICAgICAgICBiZWdpbjogLzotLyxcbiAgICAgICAgY29udGFpbnM6IFsgVkFSIF1cbiAgICAgIH0gLy8gZGVmYXVsdCB2YWx1ZXNcbiAgICBdXG4gIH07XG4gIE9iamVjdC5hc3NpZ24oVkFSLCB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiByZWdleC5jb25jYXQoL1xcJFtcXHdcXGQjQF1bXFx3XFxkX10qLyxcbiAgICAgICAgLy8gbmVnYXRpdmUgbG9vay1haGVhZCB0cmllcyB0byBhdm9pZCBtYXRjaGluZyBwYXR0ZXJucyB0aGF0IGFyZSBub3RcbiAgICAgICAgLy8gUGVybCBhdCBhbGwgbGlrZSAkaWRlbnQkLCBAaWRlbnRALCBldGMuXG4gICAgICAgIGAoPyFbXFxcXHdcXFxcZF0pKD8hWyRdKWApIH0sXG4gICAgICBCUkFDRURfVkFSXG4gICAgXVxuICB9KTtcblxuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46IC9cXCRcXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgfTtcbiAgY29uc3QgSEVSRV9ET0MgPSB7XG4gICAgYmVnaW46IC88PC0/XFxzKig/PVxcdyspLyxcbiAgICBzdGFydHM6IHsgY29udGFpbnM6IFtcbiAgICAgIGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgICAgICBiZWdpbjogLyhcXHcrKS8sXG4gICAgICAgIGVuZDogLyhcXHcrKS8sXG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZydcbiAgICAgIH0pXG4gICAgXSB9XG4gIH07XG4gIGNvbnN0IFFVT1RFX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXCIvLFxuICAgIGVuZDogL1wiLyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgVkFSLFxuICAgICAgU1VCU1RcbiAgICBdXG4gIH07XG4gIFNVQlNULmNvbnRhaW5zLnB1c2goUVVPVEVfU1RSSU5HKTtcbiAgY29uc3QgRVNDQVBFRF9RVU9URSA9IHtcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIGJlZ2luOiAvXFxcXFwiL1xuXG4gIH07XG4gIGNvbnN0IEFQT1NfU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgYmVnaW46IC8nLyxcbiAgICBlbmQ6IC8nL1xuICB9O1xuICBjb25zdCBBUklUSE1FVElDID0ge1xuICAgIGJlZ2luOiAvXFwkP1xcKFxcKC8sXG4gICAgZW5kOiAvXFwpXFwpLyxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcZCsjWzAtOWEtZl0rLyxcbiAgICAgICAgY2xhc3NOYW1lOiBcIm51bWJlclwiXG4gICAgICB9LFxuICAgICAgaGxqcy5OVU1CRVJfTU9ERSxcbiAgICAgIFZBUlxuICAgIF1cbiAgfTtcbiAgY29uc3QgU0hfTElLRV9TSEVMTFMgPSBbXG4gICAgXCJmaXNoXCIsXG4gICAgXCJiYXNoXCIsXG4gICAgXCJ6c2hcIixcbiAgICBcInNoXCIsXG4gICAgXCJjc2hcIixcbiAgICBcImtzaFwiLFxuICAgIFwidGNzaFwiLFxuICAgIFwiZGFzaFwiLFxuICAgIFwic2NzaFwiLFxuICBdO1xuICBjb25zdCBLTk9XTl9TSEVCQU5HID0gaGxqcy5TSEVCQU5HKHtcbiAgICBiaW5hcnk6IGAoJHtTSF9MSUtFX1NIRUxMUy5qb2luKFwifFwiKX0pYCxcbiAgICByZWxldmFuY2U6IDEwXG4gIH0pO1xuICBjb25zdCBGVU5DVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgYmVnaW46IC9cXHdbXFx3XFxkX10qXFxzKlxcKFxccypcXClcXHMqXFx7LyxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBjb250YWluczogWyBobGpzLmluaGVyaXQoaGxqcy5USVRMRV9NT0RFLCB7IGJlZ2luOiAvXFx3W1xcd1xcZF9dKi8gfSkgXSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBLRVlXT1JEUyA9IFtcbiAgICBcImlmXCIsXG4gICAgXCJ0aGVuXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbGlmXCIsXG4gICAgXCJmaVwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJ3aGlsZVwiLFxuICAgIFwidW50aWxcIixcbiAgICBcImluXCIsXG4gICAgXCJkb1wiLFxuICAgIFwiZG9uZVwiLFxuICAgIFwiY2FzZVwiLFxuICAgIFwiZXNhY1wiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcInNlbGVjdFwiXG4gIF07XG5cbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiXG4gIF07XG5cbiAgLy8gdG8gY29uc3VtZSBwYXRocyB0byBwcmV2ZW50IGtleXdvcmQgbWF0Y2hlcyBpbnNpZGUgdGhlbVxuICBjb25zdCBQQVRIX01PREUgPSB7IG1hdGNoOiAvKFxcL1thLXouXy1dKykrLyB9O1xuXG4gIC8vIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9odG1sX25vZGUvU2hlbGwtQnVpbHRpbi1Db21tYW5kcy5odG1sXG4gIGNvbnN0IFNIRUxMX0JVSUxUX0lOUyA9IFtcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjZFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImV2YWxcIixcbiAgICBcImV4ZWNcIixcbiAgICBcImV4aXRcIixcbiAgICBcImV4cG9ydFwiLFxuICAgIFwiZ2V0b3B0c1wiLFxuICAgIFwiaGFzaFwiLFxuICAgIFwicHdkXCIsXG4gICAgXCJyZWFkb25seVwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzaGlmdFwiLFxuICAgIFwidGVzdFwiLFxuICAgIFwidGltZXNcIixcbiAgICBcInRyYXBcIixcbiAgICBcInVtYXNrXCIsXG4gICAgXCJ1bnNldFwiXG4gIF07XG5cbiAgY29uc3QgQkFTSF9CVUlMVF9JTlMgPSBbXG4gICAgXCJhbGlhc1wiLFxuICAgIFwiYmluZFwiLFxuICAgIFwiYnVpbHRpblwiLFxuICAgIFwiY2FsbGVyXCIsXG4gICAgXCJjb21tYW5kXCIsXG4gICAgXCJkZWNsYXJlXCIsXG4gICAgXCJlY2hvXCIsXG4gICAgXCJlbmFibGVcIixcbiAgICBcImhlbHBcIixcbiAgICBcImxldFwiLFxuICAgIFwibG9jYWxcIixcbiAgICBcImxvZ291dFwiLFxuICAgIFwibWFwZmlsZVwiLFxuICAgIFwicHJpbnRmXCIsXG4gICAgXCJyZWFkXCIsXG4gICAgXCJyZWFkYXJyYXlcIixcbiAgICBcInNvdXJjZVwiLFxuICAgIFwidHlwZVwiLFxuICAgIFwidHlwZXNldFwiLFxuICAgIFwidWxpbWl0XCIsXG4gICAgXCJ1bmFsaWFzXCJcbiAgXTtcblxuICBjb25zdCBaU0hfQlVJTFRfSU5TID0gW1xuICAgIFwiYXV0b2xvYWRcIixcbiAgICBcImJnXCIsXG4gICAgXCJiaW5ka2V5XCIsXG4gICAgXCJieWVcIixcbiAgICBcImNhcFwiLFxuICAgIFwiY2hkaXJcIixcbiAgICBcImNsb25lXCIsXG4gICAgXCJjb21wYXJndW1lbnRzXCIsXG4gICAgXCJjb21wY2FsbFwiLFxuICAgIFwiY29tcGN0bFwiLFxuICAgIFwiY29tcGRlc2NyaWJlXCIsXG4gICAgXCJjb21wZmlsZXNcIixcbiAgICBcImNvbXBncm91cHNcIixcbiAgICBcImNvbXBxdW90ZVwiLFxuICAgIFwiY29tcHRhZ3NcIixcbiAgICBcImNvbXB0cnlcIixcbiAgICBcImNvbXB2YWx1ZXNcIixcbiAgICBcImRpcnNcIixcbiAgICBcImRpc2FibGVcIixcbiAgICBcImRpc293blwiLFxuICAgIFwiZWNob3RjXCIsXG4gICAgXCJlY2hvdGlcIixcbiAgICBcImVtdWxhdGVcIixcbiAgICBcImZjXCIsXG4gICAgXCJmZ1wiLFxuICAgIFwiZmxvYXRcIixcbiAgICBcImZ1bmN0aW9uc1wiLFxuICAgIFwiZ2V0Y2FwXCIsXG4gICAgXCJnZXRsblwiLFxuICAgIFwiaGlzdG9yeVwiLFxuICAgIFwiaW50ZWdlclwiLFxuICAgIFwiam9ic1wiLFxuICAgIFwia2lsbFwiLFxuICAgIFwibGltaXRcIixcbiAgICBcImxvZ1wiLFxuICAgIFwibm9nbG9iXCIsXG4gICAgXCJwb3BkXCIsXG4gICAgXCJwcmludFwiLFxuICAgIFwicHVzaGRcIixcbiAgICBcInB1c2hsblwiLFxuICAgIFwicmVoYXNoXCIsXG4gICAgXCJzY2hlZFwiLFxuICAgIFwic2V0Y2FwXCIsXG4gICAgXCJzZXRvcHRcIixcbiAgICBcInN0YXRcIixcbiAgICBcInN1c3BlbmRcIixcbiAgICBcInR0eWN0bFwiLFxuICAgIFwidW5mdW5jdGlvblwiLFxuICAgIFwidW5oYXNoXCIsXG4gICAgXCJ1bmxpbWl0XCIsXG4gICAgXCJ1bnNldG9wdFwiLFxuICAgIFwidmFyZWRcIixcbiAgICBcIndhaXRcIixcbiAgICBcIndoZW5jZVwiLFxuICAgIFwid2hlcmVcIixcbiAgICBcIndoaWNoXCIsXG4gICAgXCJ6Y29tcGlsZVwiLFxuICAgIFwiemZvcm1hdFwiLFxuICAgIFwiemZ0cFwiLFxuICAgIFwiemxlXCIsXG4gICAgXCJ6bW9kbG9hZFwiLFxuICAgIFwienBhcnNlb3B0c1wiLFxuICAgIFwienByb2ZcIixcbiAgICBcInpwdHlcIixcbiAgICBcInpyZWdleHBhcnNlXCIsXG4gICAgXCJ6c29ja2V0XCIsXG4gICAgXCJ6c3R5bGVcIixcbiAgICBcInp0Y3BcIlxuICBdO1xuXG4gIGNvbnN0IEdOVV9DT1JFX1VUSUxTID0gW1xuICAgIFwiY2hjb25cIixcbiAgICBcImNoZ3JwXCIsXG4gICAgXCJjaG93blwiLFxuICAgIFwiY2htb2RcIixcbiAgICBcImNwXCIsXG4gICAgXCJkZFwiLFxuICAgIFwiZGZcIixcbiAgICBcImRpclwiLFxuICAgIFwiZGlyY29sb3JzXCIsXG4gICAgXCJsblwiLFxuICAgIFwibHNcIixcbiAgICBcIm1rZGlyXCIsXG4gICAgXCJta2ZpZm9cIixcbiAgICBcIm1rbm9kXCIsXG4gICAgXCJta3RlbXBcIixcbiAgICBcIm12XCIsXG4gICAgXCJyZWFscGF0aFwiLFxuICAgIFwicm1cIixcbiAgICBcInJtZGlyXCIsXG4gICAgXCJzaHJlZFwiLFxuICAgIFwic3luY1wiLFxuICAgIFwidG91Y2hcIixcbiAgICBcInRydW5jYXRlXCIsXG4gICAgXCJ2ZGlyXCIsXG4gICAgXCJiMnN1bVwiLFxuICAgIFwiYmFzZTMyXCIsXG4gICAgXCJiYXNlNjRcIixcbiAgICBcImNhdFwiLFxuICAgIFwiY2tzdW1cIixcbiAgICBcImNvbW1cIixcbiAgICBcImNzcGxpdFwiLFxuICAgIFwiY3V0XCIsXG4gICAgXCJleHBhbmRcIixcbiAgICBcImZtdFwiLFxuICAgIFwiZm9sZFwiLFxuICAgIFwiaGVhZFwiLFxuICAgIFwiam9pblwiLFxuICAgIFwibWQ1c3VtXCIsXG4gICAgXCJubFwiLFxuICAgIFwibnVtZm10XCIsXG4gICAgXCJvZFwiLFxuICAgIFwicGFzdGVcIixcbiAgICBcInB0eFwiLFxuICAgIFwicHJcIixcbiAgICBcInNoYTFzdW1cIixcbiAgICBcInNoYTIyNHN1bVwiLFxuICAgIFwic2hhMjU2c3VtXCIsXG4gICAgXCJzaGEzODRzdW1cIixcbiAgICBcInNoYTUxMnN1bVwiLFxuICAgIFwic2h1ZlwiLFxuICAgIFwic29ydFwiLFxuICAgIFwic3BsaXRcIixcbiAgICBcInN1bVwiLFxuICAgIFwidGFjXCIsXG4gICAgXCJ0YWlsXCIsXG4gICAgXCJ0clwiLFxuICAgIFwidHNvcnRcIixcbiAgICBcInVuZXhwYW5kXCIsXG4gICAgXCJ1bmlxXCIsXG4gICAgXCJ3Y1wiLFxuICAgIFwiYXJjaFwiLFxuICAgIFwiYmFzZW5hbWVcIixcbiAgICBcImNocm9vdFwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiZGlybmFtZVwiLFxuICAgIFwiZHVcIixcbiAgICBcImVjaG9cIixcbiAgICBcImVudlwiLFxuICAgIFwiZXhwclwiLFxuICAgIFwiZmFjdG9yXCIsXG4gICAgLy8gXCJmYWxzZVwiLCAvLyBrZXl3b3JkIGxpdGVyYWwgYWxyZWFkeVxuICAgIFwiZ3JvdXBzXCIsXG4gICAgXCJob3N0aWRcIixcbiAgICBcImlkXCIsXG4gICAgXCJsaW5rXCIsXG4gICAgXCJsb2duYW1lXCIsXG4gICAgXCJuaWNlXCIsXG4gICAgXCJub2h1cFwiLFxuICAgIFwibnByb2NcIixcbiAgICBcInBhdGhjaGtcIixcbiAgICBcInBpbmt5XCIsXG4gICAgXCJwcmludGVudlwiLFxuICAgIFwicHJpbnRmXCIsXG4gICAgXCJwd2RcIixcbiAgICBcInJlYWRsaW5rXCIsXG4gICAgXCJydW5jb25cIixcbiAgICBcInNlcVwiLFxuICAgIFwic2xlZXBcIixcbiAgICBcInN0YXRcIixcbiAgICBcInN0ZGJ1ZlwiLFxuICAgIFwic3R0eVwiLFxuICAgIFwidGVlXCIsXG4gICAgXCJ0ZXN0XCIsXG4gICAgXCJ0aW1lb3V0XCIsXG4gICAgLy8gXCJ0cnVlXCIsIC8vIGtleXdvcmQgbGl0ZXJhbCBhbHJlYWR5XG4gICAgXCJ0dHlcIixcbiAgICBcInVuYW1lXCIsXG4gICAgXCJ1bmxpbmtcIixcbiAgICBcInVwdGltZVwiLFxuICAgIFwidXNlcnNcIixcbiAgICBcIndob1wiLFxuICAgIFwid2hvYW1pXCIsXG4gICAgXCJ5ZXNcIlxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0Jhc2gnLFxuICAgIGFsaWFzZXM6IFsgJ3NoJyBdLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogL1xcYlthLXpdW2EtejAtOS5fLV0rXFxiLyxcbiAgICAgIGtleXdvcmQ6IEtFWVdPUkRTLFxuICAgICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgICBidWlsdF9pbjogW1xuICAgICAgICAuLi5TSEVMTF9CVUlMVF9JTlMsXG4gICAgICAgIC4uLkJBU0hfQlVJTFRfSU5TLFxuICAgICAgICAvLyBTaGVsbCBtb2RpZmllcnNcbiAgICAgICAgXCJzZXRcIixcbiAgICAgICAgXCJzaG9wdFwiLFxuICAgICAgICAuLi5aU0hfQlVJTFRfSU5TLFxuICAgICAgICAuLi5HTlVfQ09SRV9VVElMU1xuICAgICAgXVxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEtOT1dOX1NIRUJBTkcsIC8vIHRvIGNhdGNoIGtub3duIHNoZWxscyBhbmQgYm9vc3QgcmVsZXZhbmN5XG4gICAgICBobGpzLlNIRUJBTkcoKSwgLy8gdG8gY2F0Y2ggdW5rbm93biBzaGVsbHMgYnV0IHN0aWxsIGhpZ2hsaWdodCB0aGUgc2hlYmFuZ1xuICAgICAgRlVOQ1RJT04sXG4gICAgICBBUklUSE1FVElDLFxuICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERSxcbiAgICAgIEhFUkVfRE9DLFxuICAgICAgUEFUSF9NT0RFLFxuICAgICAgUVVPVEVfU1RSSU5HLFxuICAgICAgRVNDQVBFRF9RVU9URSxcbiAgICAgIEFQT1NfU1RSSU5HLFxuICAgICAgVkFSXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBiYXNoIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IENcbkNhdGVnb3J5OiBjb21tb24sIHN5c3RlbVxuV2Vic2l0ZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ18ocHJvZ3JhbW1pbmdfbGFuZ3VhZ2UpXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gYyhobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLy8gYWRkZWQgZm9yIGhpc3RvcmljIHJlYXNvbnMgYmVjYXVzZSBgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFYCBkb2VzXG4gIC8vIG5vdCBpbmNsdWRlIHN1Y2ggc3VwcG9ydCBub3IgY2FuIHdlIGJlIHN1cmUgYWxsIHRoZSBncmFtbWFycyBkZXBlbmRpbmdcbiAgLy8gb24gaXQgd291bGQgZGVzaXJlIHRoaXMgYmVoYXZpb3JcbiAgY29uc3QgQ19MSU5FX0NPTU1FTlRfTU9ERSA9IGhsanMuQ09NTUVOVCgnLy8nLCAnJCcsIHsgY29udGFpbnM6IFsgeyBiZWdpbjogL1xcXFxcXG4vIH0gXSB9KTtcbiAgY29uc3QgREVDTFRZUEVfQVVUT19SRSA9ICdkZWNsdHlwZVxcXFwoYXV0b1xcXFwpJztcbiAgY29uc3QgTkFNRVNQQUNFX1JFID0gJ1thLXpBLVpfXVxcXFx3Kjo6JztcbiAgY29uc3QgVEVNUExBVEVfQVJHVU1FTlRfUkUgPSAnPFtePD5dKz4nO1xuICBjb25zdCBGVU5DVElPTl9UWVBFX1JFID0gJygnXG4gICAgKyBERUNMVFlQRV9BVVRPX1JFICsgJ3wnXG4gICAgKyByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpXG4gICAgKyAnW2EtekEtWl9dXFxcXHcqJyArIHJlZ2V4Lm9wdGlvbmFsKFRFTVBMQVRFX0FSR1VNRU5UX1JFKVxuICArICcpJztcblxuXG4gIGNvbnN0IFRZUEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiAnXFxcXGJbYS16XFxcXGRfXSpfdFxcXFxiJyB9LFxuICAgICAgeyBtYXRjaDogL1xcYmF0b21pY19bYS16XXszLDZ9XFxiLyB9XG4gICAgXVxuXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2VzY2FwZVxuICAvLyBcXFxcIFxceCBcXHhGRiBcXHUyODM3IFxcdTAwMzIzNzQ3IFxcMzc0XG4gIGNvbnN0IENIQVJBQ1RFUl9FU0NBUEVTID0gJ1xcXFxcXFxcKHhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NCw4fXxbMC03XXszfXxcXFxcUyknO1xuICBjb25zdCBTVFJJTkdTID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICcodTg/fFV8TCk/XCInLFxuICAgICAgICBlbmQ6ICdcIicsXG4gICAgICAgIGlsbGVnYWw6ICdcXFxcbicsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJyh1OD98VXxMKT9cXCcoJyArIENIQVJBQ1RFUl9FU0NBUEVTICsgXCJ8LilcIixcbiAgICAgICAgZW5kOiAnXFwnJyxcbiAgICAgICAgaWxsZWdhbDogJy4nXG4gICAgICB9LFxuICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgIGJlZ2luOiAvKD86dTg/fFV8TCk/UlwiKFteKClcXFxcIF17MCwxNn0pXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpKFteKClcXFxcIF17MCwxNn0pXCIvXG4gICAgICB9KVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBOVU1CRVJTID0ge1xuICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgYmVnaW46ICdcXFxcYigwYlswMVxcJ10rKScgfSxcbiAgICAgIHsgYmVnaW46ICcoLT8pXFxcXGIoW1xcXFxkXFwnXSsoXFxcXC5bXFxcXGRcXCddKik/fFxcXFwuW1xcXFxkXFwnXSspKChsbHxMTHxsfEwpKHV8VSk/fCh1fFUpKGxsfExMfGx8TCk/fGZ8RnxifEIpJyB9LFxuICAgICAgeyBiZWdpbjogJygtPykoXFxcXGIwW3hYXVthLWZBLUYwLTlcXCddK3woXFxcXGJbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoW2VFXVstK10/W1xcXFxkXFwnXSspPyknIH1cbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IFBSRVBST0NFU1NPUiA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBiZWdpbjogLyNcXHMqW2Etel0rXFxiLyxcbiAgICBlbmQ6IC8kLyxcbiAgICBrZXl3b3JkczogeyBrZXl3b3JkOlxuICAgICAgICAnaWYgZWxzZSBlbGlmIGVuZGlmIGRlZmluZSB1bmRlZiB3YXJuaW5nIGVycm9yIGxpbmUgJ1xuICAgICAgICArICdwcmFnbWEgX1ByYWdtYSBpZmRlZiBpZm5kZWYgaW5jbHVkZScgfSxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcXFxcXG4vLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICBobGpzLmluaGVyaXQoU1RSSU5HUywgeyBjbGFzc05hbWU6ICdzdHJpbmcnIH0pLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICBiZWdpbjogLzwuKj8+L1xuICAgICAgfSxcbiAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IFRJVExFX01PREUgPSB7XG4gICAgY2xhc3NOYW1lOiAndGl0bGUnLFxuICAgIGJlZ2luOiByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpICsgaGxqcy5JREVOVF9SRSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9USVRMRSA9IHJlZ2V4Lm9wdGlvbmFsKE5BTUVTUEFDRV9SRSkgKyBobGpzLklERU5UX1JFICsgJ1xcXFxzKlxcXFwoJztcblxuICBjb25zdCBDX0tFWVdPUkRTID0gW1xuICAgIFwiYXNtXCIsXG4gICAgXCJhdXRvXCIsXG4gICAgXCJicmVha1wiLFxuICAgIFwiY2FzZVwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImRlZmF1bHRcIixcbiAgICBcImRvXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsXG4gICAgXCJleHRlcm5cIixcbiAgICBcImZvclwiLFxuICAgIFwiZm9ydHJhblwiLFxuICAgIFwiZ290b1wiLFxuICAgIFwiaWZcIixcbiAgICBcImlubGluZVwiLFxuICAgIFwicmVnaXN0ZXJcIixcbiAgICBcInJlc3RyaWN0XCIsXG4gICAgXCJyZXR1cm5cIixcbiAgICBcInNpemVvZlwiLFxuICAgIFwic3RydWN0XCIsXG4gICAgXCJzd2l0Y2hcIixcbiAgICBcInR5cGVkZWZcIixcbiAgICBcInVuaW9uXCIsXG4gICAgXCJ2b2xhdGlsZVwiLFxuICAgIFwid2hpbGVcIixcbiAgICBcIl9BbGlnbmFzXCIsXG4gICAgXCJfQWxpZ25vZlwiLFxuICAgIFwiX0F0b21pY1wiLFxuICAgIFwiX0dlbmVyaWNcIixcbiAgICBcIl9Ob3JldHVyblwiLFxuICAgIFwiX1N0YXRpY19hc3NlcnRcIixcbiAgICBcIl9UaHJlYWRfbG9jYWxcIixcbiAgICAvLyBhbGlhc2VzXG4gICAgXCJhbGlnbmFzXCIsXG4gICAgXCJhbGlnbm9mXCIsXG4gICAgXCJub3JldHVyblwiLFxuICAgIFwic3RhdGljX2Fzc2VydFwiLFxuICAgIFwidGhyZWFkX2xvY2FsXCIsXG4gICAgLy8gbm90IGEgQyBrZXl3b3JkIGJ1dCBpcywgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcywgdHJlYXRlZCBleGFjdGx5IGxpa2Ugb25lLlxuICAgIFwiX1ByYWdtYVwiXG4gIF07XG5cbiAgY29uc3QgQ19UWVBFUyA9IFtcbiAgICBcImZsb2F0XCIsXG4gICAgXCJkb3VibGVcIixcbiAgICBcInNpZ25lZFwiLFxuICAgIFwidW5zaWduZWRcIixcbiAgICBcImludFwiLFxuICAgIFwic2hvcnRcIixcbiAgICBcImxvbmdcIixcbiAgICBcImNoYXJcIixcbiAgICBcInZvaWRcIixcbiAgICBcIl9Cb29sXCIsXG4gICAgXCJfQ29tcGxleFwiLFxuICAgIFwiX0ltYWdpbmFyeVwiLFxuICAgIFwiX0RlY2ltYWwzMlwiLFxuICAgIFwiX0RlY2ltYWw2NFwiLFxuICAgIFwiX0RlY2ltYWwxMjhcIixcbiAgICAvLyBtb2RpZmllcnNcbiAgICBcImNvbnN0XCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICAvLyBhbGlhc2VzXG4gICAgXCJjb21wbGV4XCIsXG4gICAgXCJib29sXCIsXG4gICAgXCJpbWFnaW5hcnlcIlxuICBdO1xuXG4gIGNvbnN0IEtFWVdPUkRTID0ge1xuICAgIGtleXdvcmQ6IENfS0VZV09SRFMsXG4gICAgdHlwZTogQ19UWVBFUyxcbiAgICBsaXRlcmFsOiAndHJ1ZSBmYWxzZSBOVUxMJyxcbiAgICAvLyBUT0RPOiBhcHBseSBoaW50aW5nIHdvcmsgc2ltaWxhciB0byB3aGF0IHdhcyBkb25lIGluIGNwcC5qc1xuICAgIGJ1aWx0X2luOiAnc3RkIHN0cmluZyB3c3RyaW5nIGNpbiBjb3V0IGNlcnIgY2xvZyBzdGRpbiBzdGRvdXQgc3RkZXJyIHN0cmluZ3N0cmVhbSBpc3RyaW5nc3RyZWFtIG9zdHJpbmdzdHJlYW0gJ1xuICAgICAgKyAnYXV0b19wdHIgZGVxdWUgbGlzdCBxdWV1ZSBzdGFjayB2ZWN0b3IgbWFwIHNldCBwYWlyIGJpdHNldCBtdWx0aXNldCBtdWx0aW1hcCB1bm9yZGVyZWRfc2V0ICdcbiAgICAgICsgJ3Vub3JkZXJlZF9tYXAgdW5vcmRlcmVkX211bHRpc2V0IHVub3JkZXJlZF9tdWx0aW1hcCBwcmlvcml0eV9xdWV1ZSBtYWtlX3BhaXIgYXJyYXkgc2hhcmVkX3B0ciBhYm9ydCB0ZXJtaW5hdGUgYWJzIGFjb3MgJ1xuICAgICAgKyAnYXNpbiBhdGFuMiBhdGFuIGNhbGxvYyBjZWlsIGNvc2ggY29zIGV4aXQgZXhwIGZhYnMgZmxvb3IgZm1vZCBmcHJpbnRmIGZwdXRzIGZyZWUgZnJleHAgJ1xuICAgICAgKyAnZnNjYW5mIGZ1dHVyZSBpc2FsbnVtIGlzYWxwaGEgaXNjbnRybCBpc2RpZ2l0IGlzZ3JhcGggaXNsb3dlciBpc3ByaW50IGlzcHVuY3QgaXNzcGFjZSBpc3VwcGVyICdcbiAgICAgICsgJ2lzeGRpZ2l0IHRvbG93ZXIgdG91cHBlciBsYWJzIGxkZXhwIGxvZzEwIGxvZyBtYWxsb2MgcmVhbGxvYyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1zZXQgbW9kZiBwb3cgJ1xuICAgICAgKyAncHJpbnRmIHB1dGNoYXIgcHV0cyBzY2FuZiBzaW5oIHNpbiBzbnByaW50ZiBzcHJpbnRmIHNxcnQgc3NjYW5mIHN0cmNhdCBzdHJjaHIgc3RyY21wICdcbiAgICAgICsgJ3N0cmNweSBzdHJjc3BuIHN0cmxlbiBzdHJuY2F0IHN0cm5jbXAgc3RybmNweSBzdHJwYnJrIHN0cnJjaHIgc3Ryc3BuIHN0cnN0ciB0YW5oIHRhbiAnXG4gICAgICArICd2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIGVuZGwgaW5pdGlhbGl6ZXJfbGlzdCB1bmlxdWVfcHRyJyxcbiAgfTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRBSU5TID0gW1xuICAgIFBSRVBST0NFU1NPUixcbiAgICBUWVBFUyxcbiAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgTlVNQkVSUyxcbiAgICBTVFJJTkdTXG4gIF07XG5cbiAgY29uc3QgRVhQUkVTU0lPTl9DT05URVhUID0ge1xuICAgIC8vIFRoaXMgbW9kZSBjb3ZlcnMgZXhwcmVzc2lvbiBjb250ZXh0IHdoZXJlIHdlIGNhbid0IGV4cGVjdCBhIGZ1bmN0aW9uXG4gICAgLy8gZGVmaW5pdGlvbiBhbmQgc2hvdWxkbid0IGhpZ2hsaWdodCBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2Ugb25lOlxuICAgIC8vIGByZXR1cm4gc29tZSgpYCwgYGVsc2UgaWYoKWAsIGAoeCpzdW0oMSwgMikpYFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPS8sXG4gICAgICAgIGVuZDogLzsvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICduZXcgdGhyb3cgcmV0dXJuIGVsc2UnLFxuICAgICAgICBlbmQ6IC87L1xuICAgICAgfVxuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBFWFBSRVNTSU9OX0NPTlRBSU5TLmNvbmNhdChbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICBjb250YWluczogRVhQUkVTU0lPTl9DT05UQUlOUy5jb25jYXQoWyAnc2VsZicgXSksXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfVxuICAgIF0pLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX0RFQ0xBUkFUSU9OID0ge1xuICAgIGJlZ2luOiAnKCcgKyBGVU5DVElPTl9UWVBFX1JFICsgJ1tcXFxcKiZcXFxcc10rKSsnICsgRlVOQ1RJT05fVElUTEUsXG4gICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgZW5kOiAvW3s7PV0vLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC9bXlxcd1xcc1xcKiY6PD4uXS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgICBiZWdpbjogREVDTFRZUEVfQVVUT19SRSxcbiAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBGVU5DVElPTl9USVRMRSxcbiAgICAgICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuaW5oZXJpdChUSVRMRV9NT0RFLCB7IGNsYXNzTmFtZTogXCJ0aXRsZS5mdW5jdGlvblwiIH0pIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIC8vIGFsbG93IGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMsIGUuZy46XG4gICAgICAvLyBleHRlcm4gdm9pZCBmKGludCksIGcoY2hhcik7XG4gICAgICB7XG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgbWF0Y2g6IC8sL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICBOVU1CRVJTLFxuICAgICAgICAgIFRZUEVTLFxuICAgICAgICAgIC8vIENvdW50IG1hdGNoaW5nIHBhcmVudGhlc2VzLlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICAgICAgICAgIFNUUklOR1MsXG4gICAgICAgICAgICAgIE5VTUJFUlMsXG4gICAgICAgICAgICAgIFRZUEVTXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgVFlQRVMsXG4gICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIFBSRVBST0NFU1NPUlxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiQ1wiLFxuICAgIGFsaWFzZXM6IFsgJ2gnIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIC8vIFVudGlsIGRpZmZlcmVudGlhdGlvbnMgYXJlIGFkZGVkIGJldHdlZW4gYGNgIGFuZCBgY3BwYCwgYGNgIHdpbGxcbiAgICAvLyBub3QgYmUgYXV0by1kZXRlY3RlZCB0byBhdm9pZCBhdXRvLWRldGVjdCBjb25mbGljdHMgYmV0d2VlbiBDIGFuZCBDKytcbiAgICBkaXNhYmxlQXV0b2RldGVjdDogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNvbnRhaW5zOiBbXS5jb25jYXQoXG4gICAgICBFWFBSRVNTSU9OX0NPTlRFWFQsXG4gICAgICBGVU5DVElPTl9ERUNMQVJBVElPTixcbiAgICAgIEVYUFJFU1NJT05fQ09OVEFJTlMsXG4gICAgICBbXG4gICAgICAgIFBSRVBST0NFU1NPUixcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiBobGpzLklERU5UX1JFICsgJzo6JyxcbiAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2NsYXNzJyxcbiAgICAgICAgICBiZWdpbktleXdvcmRzOiAnZW51bSBjbGFzcyBzdHJ1Y3QgdW5pb24nLFxuICAgICAgICAgIGVuZDogL1t7Ozo8Pj1dLyxcbiAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgeyBiZWdpbktleXdvcmRzOiBcImZpbmFsIGNsYXNzIHN0cnVjdFwiIH0sXG4gICAgICAgICAgICBobGpzLlRJVExFX01PREVcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0pLFxuICAgIGV4cG9ydHM6IHtcbiAgICAgIHByZXByb2Nlc3NvcjogUFJFUFJPQ0VTU09SLFxuICAgICAgc3RyaW5nczogU1RSSU5HUyxcbiAgICAgIGtleXdvcmRzOiBLRVlXT1JEU1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IHsgYyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBDKytcbkNhdGVnb3J5OiBjb21tb24sIHN5c3RlbVxuV2Vic2l0ZTogaHR0cHM6Ly9pc29jcHAub3JnXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gY3BwKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICAvLyBhZGRlZCBmb3IgaGlzdG9yaWMgcmVhc29ucyBiZWNhdXNlIGBobGpzLkNfTElORV9DT01NRU5UX01PREVgIGRvZXNcbiAgLy8gbm90IGluY2x1ZGUgc3VjaCBzdXBwb3J0IG5vciBjYW4gd2UgYmUgc3VyZSBhbGwgdGhlIGdyYW1tYXJzIGRlcGVuZGluZ1xuICAvLyBvbiBpdCB3b3VsZCBkZXNpcmUgdGhpcyBiZWhhdmlvclxuICBjb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gaGxqcy5DT01NRU5UKCcvLycsICckJywgeyBjb250YWluczogWyB7IGJlZ2luOiAvXFxcXFxcbi8gfSBdIH0pO1xuICBjb25zdCBERUNMVFlQRV9BVVRPX1JFID0gJ2RlY2x0eXBlXFxcXChhdXRvXFxcXCknO1xuICBjb25zdCBOQU1FU1BBQ0VfUkUgPSAnW2EtekEtWl9dXFxcXHcqOjonO1xuICBjb25zdCBURU1QTEFURV9BUkdVTUVOVF9SRSA9ICc8W148Pl0rPic7XG4gIGNvbnN0IEZVTkNUSU9OX1RZUEVfUkUgPSAnKD8hc3RydWN0KSgnXG4gICAgKyBERUNMVFlQRV9BVVRPX1JFICsgJ3wnXG4gICAgKyByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpXG4gICAgKyAnW2EtekEtWl9dXFxcXHcqJyArIHJlZ2V4Lm9wdGlvbmFsKFRFTVBMQVRFX0FSR1VNRU5UX1JFKVxuICArICcpJztcblxuICBjb25zdCBDUFBfUFJJTUlUSVZFX1RZUEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgIGJlZ2luOiAnXFxcXGJbYS16XFxcXGRfXSpfdFxcXFxiJ1xuICB9O1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9lc2NhcGVcbiAgLy8gXFxcXCBcXHggXFx4RkYgXFx1MjgzNyBcXHUwMDMyMzc0NyBcXDM3NFxuICBjb25zdCBDSEFSQUNURVJfRVNDQVBFUyA9ICdcXFxcXFxcXCh4WzAtOUEtRmEtZl17Mn18dVswLTlBLUZhLWZdezQsOH18WzAtN117M318XFxcXFMpJztcbiAgY29uc3QgU1RSSU5HUyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnKHU4P3xVfEwpP1wiJyxcbiAgICAgICAgZW5kOiAnXCInLFxuICAgICAgICBpbGxlZ2FsOiAnXFxcXG4nLFxuICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICcodTg/fFV8TCk/XFwnKCcgKyBDSEFSQUNURVJfRVNDQVBFUyArICd8LiknLFxuICAgICAgICBlbmQ6ICdcXCcnLFxuICAgICAgICBpbGxlZ2FsOiAnLidcbiAgICAgIH0sXG4gICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgYmVnaW46IC8oPzp1OD98VXxMKT9SXCIoW14oKVxcXFwgXXswLDE2fSlcXCgvLFxuICAgICAgICBlbmQ6IC9cXCkoW14oKVxcXFwgXXswLDE2fSlcIi9cbiAgICAgIH0pXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IE5VTUJFUlMgPSB7XG4gICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogJ1xcXFxiKDBiWzAxXFwnXSspJyB9LFxuICAgICAgeyBiZWdpbjogJygtPylcXFxcYihbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoKGxsfExMfGx8TCkodXxVKT98KHV8VSkobGx8TEx8bHxMKT98ZnxGfGJ8QiknIH0sXG4gICAgICB7IGJlZ2luOiAnKC0/KShcXFxcYjBbeFhdW2EtZkEtRjAtOVxcJ10rfChcXFxcYltcXFxcZFxcJ10rKFxcXFwuW1xcXFxkXFwnXSopP3xcXFxcLltcXFxcZFxcJ10rKShbZUVdWy0rXT9bXFxcXGRcXCddKyk/KScgfVxuICAgIF0sXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgUFJFUFJPQ0VTU09SID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAvI1xccypbYS16XStcXGIvLFxuICAgIGVuZDogLyQvLFxuICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6XG4gICAgICAgICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSAnXG4gICAgICAgICsgJ3ByYWdtYSBfUHJhZ21hIGlmZGVmIGlmbmRlZiBpbmNsdWRlJyB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxcXFxcbi8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIGhsanMuaW5oZXJpdChTVFJJTkdTLCB7IGNsYXNzTmFtZTogJ3N0cmluZycgfSksXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIGJlZ2luOiAvPC4qPz4vXG4gICAgICB9LFxuICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgVElUTEVfTU9ERSA9IHtcbiAgICBjbGFzc05hbWU6ICd0aXRsZScsXG4gICAgYmVnaW46IHJlZ2V4Lm9wdGlvbmFsKE5BTUVTUEFDRV9SRSkgKyBobGpzLklERU5UX1JFLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX1RJVExFID0gcmVnZXgub3B0aW9uYWwoTkFNRVNQQUNFX1JFKSArIGhsanMuSURFTlRfUkUgKyAnXFxcXHMqXFxcXCgnO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX0tFWVdPUkRTID0gW1xuICAgICdhbGlnbmFzJyxcbiAgICAnYWxpZ25vZicsXG4gICAgJ2FuZCcsXG4gICAgJ2FuZF9lcScsXG4gICAgJ2FzbScsXG4gICAgJ2F0b21pY19jYW5jZWwnLFxuICAgICdhdG9taWNfY29tbWl0JyxcbiAgICAnYXRvbWljX25vZXhjZXB0JyxcbiAgICAnYXV0bycsXG4gICAgJ2JpdGFuZCcsXG4gICAgJ2JpdG9yJyxcbiAgICAnYnJlYWsnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvX2F3YWl0JyxcbiAgICAnY29fcmV0dXJuJyxcbiAgICAnY29feWllbGQnLFxuICAgICdjb21wbCcsXG4gICAgJ2NvbmNlcHQnLFxuICAgICdjb25zdF9jYXN0fDEwJyxcbiAgICAnY29uc3RldmFsJyxcbiAgICAnY29uc3RleHByJyxcbiAgICAnY29uc3Rpbml0JyxcbiAgICAnY29udGludWUnLFxuICAgICdkZWNsdHlwZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdkZWxldGUnLFxuICAgICdkbycsXG4gICAgJ2R5bmFtaWNfY2FzdHwxMCcsXG4gICAgJ2Vsc2UnLFxuICAgICdlbnVtJyxcbiAgICAnZXhwbGljaXQnLFxuICAgICdleHBvcnQnLFxuICAgICdleHRlcm4nLFxuICAgICdmYWxzZScsXG4gICAgJ2ZpbmFsJyxcbiAgICAnZm9yJyxcbiAgICAnZnJpZW5kJyxcbiAgICAnZ290bycsXG4gICAgJ2lmJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW5saW5lJyxcbiAgICAnbW9kdWxlJyxcbiAgICAnbXV0YWJsZScsXG4gICAgJ25hbWVzcGFjZScsXG4gICAgJ25ldycsXG4gICAgJ25vZXhjZXB0JyxcbiAgICAnbm90JyxcbiAgICAnbm90X2VxJyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ29wZXJhdG9yJyxcbiAgICAnb3InLFxuICAgICdvcl9lcScsXG4gICAgJ292ZXJyaWRlJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3JlZmxleHByJyxcbiAgICAncmVnaXN0ZXInLFxuICAgICdyZWludGVycHJldF9jYXN0fDEwJyxcbiAgICAncmVxdWlyZXMnLFxuICAgICdyZXR1cm4nLFxuICAgICdzaXplb2YnLFxuICAgICdzdGF0aWNfYXNzZXJ0JyxcbiAgICAnc3RhdGljX2Nhc3R8MTAnLFxuICAgICdzdHJ1Y3QnLFxuICAgICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLFxuICAgICd0ZW1wbGF0ZScsXG4gICAgJ3RoaXMnLFxuICAgICd0aHJlYWRfbG9jYWwnLFxuICAgICd0aHJvdycsXG4gICAgJ3RyYW5zYWN0aW9uX3NhZmUnLFxuICAgICd0cmFuc2FjdGlvbl9zYWZlX2R5bmFtaWMnLFxuICAgICd0cnVlJyxcbiAgICAndHJ5JyxcbiAgICAndHlwZWRlZicsXG4gICAgJ3R5cGVpZCcsXG4gICAgJ3R5cGVuYW1lJyxcbiAgICAndW5pb24nLFxuICAgICd1c2luZycsXG4gICAgJ3ZpcnR1YWwnLFxuICAgICd2b2xhdGlsZScsXG4gICAgJ3doaWxlJyxcbiAgICAneG9yJyxcbiAgICAneG9yX2VxJ1xuICBdO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX1RZUEVTID0gW1xuICAgICdib29sJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXIxNl90JyxcbiAgICAnY2hhcjMyX3QnLFxuICAgICdjaGFyOF90JyxcbiAgICAnZG91YmxlJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdsb25nJyxcbiAgICAnc2hvcnQnLFxuICAgICd2b2lkJyxcbiAgICAnd2NoYXJfdCcsXG4gICAgJ3Vuc2lnbmVkJyxcbiAgICAnc2lnbmVkJyxcbiAgICAnY29uc3QnLFxuICAgICdzdGF0aWMnXG4gIF07XG5cbiAgY29uc3QgVFlQRV9ISU5UUyA9IFtcbiAgICAnYW55JyxcbiAgICAnYXV0b19wdHInLFxuICAgICdiYXJyaWVyJyxcbiAgICAnYmluYXJ5X3NlbWFwaG9yZScsXG4gICAgJ2JpdHNldCcsXG4gICAgJ2NvbXBsZXgnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGUnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGVfYW55JyxcbiAgICAnY291bnRpbmdfc2VtYXBob3JlJyxcbiAgICAnZGVxdWUnLFxuICAgICdmYWxzZV90eXBlJyxcbiAgICAnZnV0dXJlJyxcbiAgICAnaW1hZ2luYXJ5JyxcbiAgICAnaW5pdGlhbGl6ZXJfbGlzdCcsXG4gICAgJ2lzdHJpbmdzdHJlYW0nLFxuICAgICdqdGhyZWFkJyxcbiAgICAnbGF0Y2gnLFxuICAgICdsb2NrX2d1YXJkJyxcbiAgICAnbXVsdGltYXAnLFxuICAgICdtdWx0aXNldCcsXG4gICAgJ211dGV4JyxcbiAgICAnb3B0aW9uYWwnLFxuICAgICdvc3RyaW5nc3RyZWFtJyxcbiAgICAncGFja2FnZWRfdGFzaycsXG4gICAgJ3BhaXInLFxuICAgICdwcm9taXNlJyxcbiAgICAncHJpb3JpdHlfcXVldWUnLFxuICAgICdxdWV1ZScsXG4gICAgJ3JlY3Vyc2l2ZV9tdXRleCcsXG4gICAgJ3JlY3Vyc2l2ZV90aW1lZF9tdXRleCcsXG4gICAgJ3Njb3BlZF9sb2NrJyxcbiAgICAnc2V0JyxcbiAgICAnc2hhcmVkX2Z1dHVyZScsXG4gICAgJ3NoYXJlZF9sb2NrJyxcbiAgICAnc2hhcmVkX211dGV4JyxcbiAgICAnc2hhcmVkX3RpbWVkX211dGV4JyxcbiAgICAnc2hhcmVkX3B0cicsXG4gICAgJ3N0YWNrJyxcbiAgICAnc3RyaW5nX3ZpZXcnLFxuICAgICdzdHJpbmdzdHJlYW0nLFxuICAgICd0aW1lZF9tdXRleCcsXG4gICAgJ3RocmVhZCcsXG4gICAgJ3RydWVfdHlwZScsXG4gICAgJ3R1cGxlJyxcbiAgICAndW5pcXVlX2xvY2snLFxuICAgICd1bmlxdWVfcHRyJyxcbiAgICAndW5vcmRlcmVkX21hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aW1hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aXNldCcsXG4gICAgJ3Vub3JkZXJlZF9zZXQnLFxuICAgICd2YXJpYW50JyxcbiAgICAndmVjdG9yJyxcbiAgICAnd2Vha19wdHInLFxuICAgICd3c3RyaW5nJyxcbiAgICAnd3N0cmluZ192aWV3J1xuICBdO1xuXG4gIGNvbnN0IEZVTkNUSU9OX0hJTlRTID0gW1xuICAgICdhYm9ydCcsXG4gICAgJ2FicycsXG4gICAgJ2Fjb3MnLFxuICAgICdhcHBseScsXG4gICAgJ2FzX2NvbnN0JyxcbiAgICAnYXNpbicsXG4gICAgJ2F0YW4nLFxuICAgICdhdGFuMicsXG4gICAgJ2NhbGxvYycsXG4gICAgJ2NlaWwnLFxuICAgICdjZXJyJyxcbiAgICAnY2luJyxcbiAgICAnY2xvZycsXG4gICAgJ2NvcycsXG4gICAgJ2Nvc2gnLFxuICAgICdjb3V0JyxcbiAgICAnZGVjbHZhbCcsXG4gICAgJ2VuZGwnLFxuICAgICdleGNoYW5nZScsXG4gICAgJ2V4aXQnLFxuICAgICdleHAnLFxuICAgICdmYWJzJyxcbiAgICAnZmxvb3InLFxuICAgICdmbW9kJyxcbiAgICAnZm9yd2FyZCcsXG4gICAgJ2ZwcmludGYnLFxuICAgICdmcHV0cycsXG4gICAgJ2ZyZWUnLFxuICAgICdmcmV4cCcsXG4gICAgJ2ZzY2FuZicsXG4gICAgJ2Z1dHVyZScsXG4gICAgJ2ludm9rZScsXG4gICAgJ2lzYWxudW0nLFxuICAgICdpc2FscGhhJyxcbiAgICAnaXNjbnRybCcsXG4gICAgJ2lzZGlnaXQnLFxuICAgICdpc2dyYXBoJyxcbiAgICAnaXNsb3dlcicsXG4gICAgJ2lzcHJpbnQnLFxuICAgICdpc3B1bmN0JyxcbiAgICAnaXNzcGFjZScsXG4gICAgJ2lzdXBwZXInLFxuICAgICdpc3hkaWdpdCcsXG4gICAgJ2xhYnMnLFxuICAgICdsYXVuZGVyJyxcbiAgICAnbGRleHAnLFxuICAgICdsb2cnLFxuICAgICdsb2cxMCcsXG4gICAgJ21ha2VfcGFpcicsXG4gICAgJ21ha2Vfc2hhcmVkJyxcbiAgICAnbWFrZV9zaGFyZWRfZm9yX292ZXJ3cml0ZScsXG4gICAgJ21ha2VfdHVwbGUnLFxuICAgICdtYWtlX3VuaXF1ZScsXG4gICAgJ21hbGxvYycsXG4gICAgJ21lbWNocicsXG4gICAgJ21lbWNtcCcsXG4gICAgJ21lbWNweScsXG4gICAgJ21lbXNldCcsXG4gICAgJ21vZGYnLFxuICAgICdtb3ZlJyxcbiAgICAncG93JyxcbiAgICAncHJpbnRmJyxcbiAgICAncHV0Y2hhcicsXG4gICAgJ3B1dHMnLFxuICAgICdyZWFsbG9jJyxcbiAgICAnc2NhbmYnLFxuICAgICdzaW4nLFxuICAgICdzaW5oJyxcbiAgICAnc25wcmludGYnLFxuICAgICdzcHJpbnRmJyxcbiAgICAnc3FydCcsXG4gICAgJ3NzY2FuZicsXG4gICAgJ3N0ZCcsXG4gICAgJ3N0ZGVycicsXG4gICAgJ3N0ZGluJyxcbiAgICAnc3Rkb3V0JyxcbiAgICAnc3RyY2F0JyxcbiAgICAnc3RyY2hyJyxcbiAgICAnc3RyY21wJyxcbiAgICAnc3RyY3B5JyxcbiAgICAnc3RyY3NwbicsXG4gICAgJ3N0cmxlbicsXG4gICAgJ3N0cm5jYXQnLFxuICAgICdzdHJuY21wJyxcbiAgICAnc3RybmNweScsXG4gICAgJ3N0cnBicmsnLFxuICAgICdzdHJyY2hyJyxcbiAgICAnc3Ryc3BuJyxcbiAgICAnc3Ryc3RyJyxcbiAgICAnc3dhcCcsXG4gICAgJ3RhbicsXG4gICAgJ3RhbmgnLFxuICAgICd0ZXJtaW5hdGUnLFxuICAgICd0b191bmRlcmx5aW5nJyxcbiAgICAndG9sb3dlcicsXG4gICAgJ3RvdXBwZXInLFxuICAgICd2ZnByaW50ZicsXG4gICAgJ3Zpc2l0JyxcbiAgICAndnByaW50ZicsXG4gICAgJ3ZzcHJpbnRmJ1xuICBdO1xuXG4gIGNvbnN0IExJVEVSQUxTID0gW1xuICAgICdOVUxMJyxcbiAgICAnZmFsc2UnLFxuICAgICdudWxsb3B0JyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ3RydWUnXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2tleXdvcmRcbiAgY29uc3QgQlVJTFRfSU4gPSBbICdfUHJhZ21hJyBdO1xuXG4gIGNvbnN0IENQUF9LRVlXT1JEUyA9IHtcbiAgICB0eXBlOiBSRVNFUlZFRF9UWVBFUyxcbiAgICBrZXl3b3JkOiBSRVNFUlZFRF9LRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU4sXG4gICAgX3R5cGVfaGludHM6IFRZUEVfSElOVFNcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ESVNQQVRDSCA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbi5kaXNwYXRjaCcsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAvLyBPbmx5IGZvciByZWxldmFuY2UsIG5vdCBoaWdobGlnaHRpbmcuXG4gICAgICBfaGludDogRlVOQ1RJT05fSElOVFMgfSxcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1xcYi8sXG4gICAgICAvKD8hZGVjbHR5cGUpLyxcbiAgICAgIC8oPyFpZikvLFxuICAgICAgLyg/IWZvcikvLFxuICAgICAgLyg/IXN3aXRjaCkvLFxuICAgICAgLyg/IXdoaWxlKS8sXG4gICAgICBobGpzLklERU5UX1JFLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC8oPFtePD5dKz58KVxccypcXCgvKSlcbiAgfTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRBSU5TID0gW1xuICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgIFBSRVBST0NFU1NPUixcbiAgICBDUFBfUFJJTUlUSVZFX1RZUEVTLFxuICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBOVU1CRVJTLFxuICAgIFNUUklOR1NcbiAgXTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRFWFQgPSB7XG4gICAgLy8gVGhpcyBtb2RlIGNvdmVycyBleHByZXNzaW9uIGNvbnRleHQgd2hlcmUgd2UgY2FuJ3QgZXhwZWN0IGEgZnVuY3Rpb25cbiAgICAvLyBkZWZpbml0aW9uIGFuZCBzaG91bGRuJ3QgaGlnaGxpZ2h0IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBvbmU6XG4gICAgLy8gYHJldHVybiBzb21lKClgLCBgZWxzZSBpZigpYCwgYCh4KnN1bSgxLCAyKSlgXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC89LyxcbiAgICAgICAgZW5kOiAvOy9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25ldyB0aHJvdyByZXR1cm4gZWxzZScsXG4gICAgICAgIGVuZDogLzsvXG4gICAgICB9XG4gICAgXSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBFWFBSRVNTSU9OX0NPTlRBSU5TLmNvbmNhdChbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IEVYUFJFU1NJT05fQ09OVEFJTlMuY29uY2F0KFsgJ3NlbGYnIF0pLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdKSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgYmVnaW46ICcoJyArIEZVTkNUSU9OX1RZUEVfUkUgKyAnW1xcXFwqJlxcXFxzXSspKycgKyBGVU5DVElPTl9USVRMRSxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBlbmQ6IC9bezs9XS8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC9bXlxcd1xcc1xcKiY6PD4uXS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgICBiZWdpbjogREVDTFRZUEVfQVVUT19SRSxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogRlVOQ1RJT05fVElUTEUsXG4gICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICBjb250YWluczogWyBUSVRMRV9NT0RFIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIGxvb2stYmVoaW5kIG9uIHRoZSBiZWxvdyBydWxlXG4gICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZ3JhYmJpbmcgdGhlIGZpbmFsIDogaW4gYSA6OiBwYWlyXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOjovLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICAvLyBpbml0aWFsaXplcnNcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC86LyxcbiAgICAgICAgZW5kc1dpdGhQYXJlbnQ6IHRydWUsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICBOVU1CRVJTXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAvLyBhbGxvdyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLCBlLmcuOlxuICAgICAgLy8gZXh0ZXJuIHZvaWQgZihpbnQpLCBnKGNoYXIpO1xuICAgICAge1xuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIG1hdGNoOiAvLC9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBTVFJJTkdTLFxuICAgICAgICAgIE5VTUJFUlMsXG4gICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFUyxcbiAgICAgICAgICAvLyBDb3VudCBtYXRjaGluZyBwYXJlbnRoZXNlcy5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgICdzZWxmJyxcbiAgICAgICAgICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICAgICAgTlVNQkVSUyxcbiAgICAgICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFU1xuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIENQUF9QUklNSVRJVkVfVFlQRVMsXG4gICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIFBSRVBST0NFU1NPUlxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdDKysnLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdjYycsXG4gICAgICAnYysrJyxcbiAgICAgICdoKysnLFxuICAgICAgJ2hwcCcsXG4gICAgICAnaGgnLFxuICAgICAgJ2h4eCcsXG4gICAgICAnY3h4J1xuICAgIF0sXG4gICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNsYXNzTmFtZUFsaWFzZXM6IHsgJ2Z1bmN0aW9uLmRpc3BhdGNoJzogJ2J1aWx0X2luJyB9LFxuICAgIGNvbnRhaW5zOiBbXS5jb25jYXQoXG4gICAgICBFWFBSRVNTSU9OX0NPTlRFWFQsXG4gICAgICBGVU5DVElPTl9ERUNMQVJBVElPTixcbiAgICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgICAgRVhQUkVTU0lPTl9DT05UQUlOUyxcbiAgICAgIFtcbiAgICAgICAgUFJFUFJPQ0VTU09SLFxuICAgICAgICB7IC8vIGNvbnRhaW5lcnM6IGllLCBgdmVjdG9yIDxpbnQ+IHJvb21zICg5KTtgXG4gICAgICAgICAgYmVnaW46ICdcXFxcYihkZXF1ZXxsaXN0fHF1ZXVlfHByaW9yaXR5X3F1ZXVlfHBhaXJ8c3RhY2t8dmVjdG9yfG1hcHxzZXR8Yml0c2V0fG11bHRpc2V0fG11bHRpbWFwfHVub3JkZXJlZF9tYXB8dW5vcmRlcmVkX3NldHx1bm9yZGVyZWRfbXVsdGlzZXR8dW5vcmRlcmVkX211bHRpbWFwfGFycmF5fHR1cGxlfG9wdGlvbmFsfHZhcmlhbnR8ZnVuY3Rpb24pXFxcXHMqPCg/ITwpJyxcbiAgICAgICAgICBlbmQ6ICc+JyxcbiAgICAgICAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgICBDUFBfUFJJTUlUSVZFX1RZUEVTXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46IGhsanMuSURFTlRfUkUgKyAnOjonLFxuICAgICAgICAgIGtleXdvcmRzOiBDUFBfS0VZV09SRFNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgICAvLyBleHRyYSBjb21wbGV4aXR5IHRvIGRlYWwgd2l0aCBgZW51bSBjbGFzc2AgYW5kIGBlbnVtIHN0cnVjdGBcbiAgICAgICAgICAgIC9cXGIoPzplbnVtKD86XFxzKyg/OmNsYXNzfHN0cnVjdCkpP3xjbGFzc3xzdHJ1Y3R8dW5pb24pLyxcbiAgICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICAgIC9cXHcrL1xuICAgICAgICAgIF0sXG4gICAgICAgICAgY2xhc3NOYW1lOiB7XG4gICAgICAgICAgICAxOiAna2V5d29yZCcsXG4gICAgICAgICAgICAzOiAndGl0bGUuY2xhc3MnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdKVxuICB9O1xufVxuXG5leHBvcnQgeyBjcHAgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogQyNcbkF1dGhvcjogSmFzb24gRGlhbW9uZCA8amFzb25AZGlhbW9uZC5uYW1lPlxuQ29udHJpYnV0b3I6IE5pY29sYXMgTExPQkVSQSA8bmxsb2JlcmFAZ21haWwuY29tPiwgUGlldGVyIFZhbnRvcnJlIDxwaWV0ZXJ2YW50b3JyZUBnbWFpbC5jb20+LCBEYXZpZCBQaW5lIDxkYXZpZC5waW5lQG1pY3Jvc29mdC5jb20+XG5XZWJzaXRlOiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9kb3RuZXQvY3NoYXJwL1xuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIGNzaGFycChobGpzKSB7XG4gIGNvbnN0IEJVSUxUX0lOX0tFWVdPUkRTID0gW1xuICAgICdib29sJyxcbiAgICAnYnl0ZScsXG4gICAgJ2NoYXInLFxuICAgICdkZWNpbWFsJyxcbiAgICAnZGVsZWdhdGUnLFxuICAgICdkb3VibGUnLFxuICAgICdkeW5hbWljJyxcbiAgICAnZW51bScsXG4gICAgJ2Zsb2F0JyxcbiAgICAnaW50JyxcbiAgICAnbG9uZycsXG4gICAgJ25pbnQnLFxuICAgICdudWludCcsXG4gICAgJ29iamVjdCcsXG4gICAgJ3NieXRlJyxcbiAgICAnc2hvcnQnLFxuICAgICdzdHJpbmcnLFxuICAgICd1bG9uZycsXG4gICAgJ3VpbnQnLFxuICAgICd1c2hvcnQnXG4gIF07XG4gIGNvbnN0IEZVTkNUSU9OX01PRElGSUVSUyA9IFtcbiAgICAncHVibGljJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3N0YXRpYycsXG4gICAgJ2ludGVybmFsJyxcbiAgICAncHJvdGVjdGVkJyxcbiAgICAnYWJzdHJhY3QnLFxuICAgICdhc3luYycsXG4gICAgJ2V4dGVybicsXG4gICAgJ292ZXJyaWRlJyxcbiAgICAndW5zYWZlJyxcbiAgICAndmlydHVhbCcsXG4gICAgJ25ldycsXG4gICAgJ3NlYWxlZCcsXG4gICAgJ3BhcnRpYWwnXG4gIF07XG4gIGNvbnN0IExJVEVSQUxfS0VZV09SRFMgPSBbXG4gICAgJ2RlZmF1bHQnLFxuICAgICdmYWxzZScsXG4gICAgJ251bGwnLFxuICAgICd0cnVlJ1xuICBdO1xuICBjb25zdCBOT1JNQUxfS0VZV09SRFMgPSBbXG4gICAgJ2Fic3RyYWN0JyxcbiAgICAnYXMnLFxuICAgICdiYXNlJyxcbiAgICAnYnJlYWsnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvbnN0JyxcbiAgICAnY29udGludWUnLFxuICAgICdkbycsXG4gICAgJ2Vsc2UnLFxuICAgICdldmVudCcsXG4gICAgJ2V4cGxpY2l0JyxcbiAgICAnZXh0ZXJuJyxcbiAgICAnZmluYWxseScsXG4gICAgJ2ZpeGVkJyxcbiAgICAnZm9yJyxcbiAgICAnZm9yZWFjaCcsXG4gICAgJ2dvdG8nLFxuICAgICdpZicsXG4gICAgJ2ltcGxpY2l0JyxcbiAgICAnaW4nLFxuICAgICdpbnRlcmZhY2UnLFxuICAgICdpbnRlcm5hbCcsXG4gICAgJ2lzJyxcbiAgICAnbG9jaycsXG4gICAgJ25hbWVzcGFjZScsXG4gICAgJ25ldycsXG4gICAgJ29wZXJhdG9yJyxcbiAgICAnb3V0JyxcbiAgICAnb3ZlcnJpZGUnLFxuICAgICdwYXJhbXMnLFxuICAgICdwcml2YXRlJyxcbiAgICAncHJvdGVjdGVkJyxcbiAgICAncHVibGljJyxcbiAgICAncmVhZG9ubHknLFxuICAgICdyZWNvcmQnLFxuICAgICdyZWYnLFxuICAgICdyZXR1cm4nLFxuICAgICdzY29wZWQnLFxuICAgICdzZWFsZWQnLFxuICAgICdzaXplb2YnLFxuICAgICdzdGFja2FsbG9jJyxcbiAgICAnc3RhdGljJyxcbiAgICAnc3RydWN0JyxcbiAgICAnc3dpdGNoJyxcbiAgICAndGhpcycsXG4gICAgJ3Rocm93JyxcbiAgICAndHJ5JyxcbiAgICAndHlwZW9mJyxcbiAgICAndW5jaGVja2VkJyxcbiAgICAndW5zYWZlJyxcbiAgICAndXNpbmcnLFxuICAgICd2aXJ0dWFsJyxcbiAgICAndm9pZCcsXG4gICAgJ3ZvbGF0aWxlJyxcbiAgICAnd2hpbGUnXG4gIF07XG4gIGNvbnN0IENPTlRFWFRVQUxfS0VZV09SRFMgPSBbXG4gICAgJ2FkZCcsXG4gICAgJ2FsaWFzJyxcbiAgICAnYW5kJyxcbiAgICAnYXNjZW5kaW5nJyxcbiAgICAnYXN5bmMnLFxuICAgICdhd2FpdCcsXG4gICAgJ2J5JyxcbiAgICAnZGVzY2VuZGluZycsXG4gICAgJ2VxdWFscycsXG4gICAgJ2Zyb20nLFxuICAgICdnZXQnLFxuICAgICdnbG9iYWwnLFxuICAgICdncm91cCcsXG4gICAgJ2luaXQnLFxuICAgICdpbnRvJyxcbiAgICAnam9pbicsXG4gICAgJ2xldCcsXG4gICAgJ25hbWVvZicsXG4gICAgJ25vdCcsXG4gICAgJ25vdG51bGwnLFxuICAgICdvbicsXG4gICAgJ29yJyxcbiAgICAnb3JkZXJieScsXG4gICAgJ3BhcnRpYWwnLFxuICAgICdyZW1vdmUnLFxuICAgICdzZWxlY3QnLFxuICAgICdzZXQnLFxuICAgICd1bm1hbmFnZWQnLFxuICAgICd2YWx1ZXwwJyxcbiAgICAndmFyJyxcbiAgICAnd2hlbicsXG4gICAgJ3doZXJlJyxcbiAgICAnd2l0aCcsXG4gICAgJ3lpZWxkJ1xuICBdO1xuXG4gIGNvbnN0IEtFWVdPUkRTID0ge1xuICAgIGtleXdvcmQ6IE5PUk1BTF9LRVlXT1JEUy5jb25jYXQoQ09OVEVYVFVBTF9LRVlXT1JEUyksXG4gICAgYnVpbHRfaW46IEJVSUxUX0lOX0tFWVdPUkRTLFxuICAgIGxpdGVyYWw6IExJVEVSQUxfS0VZV09SRFNcbiAgfTtcbiAgY29uc3QgVElUTEVfTU9ERSA9IGhsanMuaW5oZXJpdChobGpzLlRJVExFX01PREUsIHsgYmVnaW46ICdbYS16QS1aXShcXFxcLj9cXFxcdykqJyB9KTtcbiAgY29uc3QgTlVNQkVSUyA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiAnXFxcXGIoMGJbMDFcXCddKyknIH0sXG4gICAgICB7IGJlZ2luOiAnKC0/KVxcXFxiKFtcXFxcZFxcJ10rKFxcXFwuW1xcXFxkXFwnXSopP3xcXFxcLltcXFxcZFxcJ10rKSh1fFV8bHxMfHVsfFVMfGZ8RnxifEIpJyB9LFxuICAgICAgeyBiZWdpbjogJygtPykoXFxcXGIwW3hYXVthLWZBLUYwLTlcXCddK3woXFxcXGJbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoW2VFXVstK10/W1xcXFxkXFwnXSspPyknIH1cbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuICBjb25zdCBWRVJCQVRJTV9TVFJJTkcgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBiZWdpbjogJ0BcIicsXG4gICAgZW5kOiAnXCInLFxuICAgIGNvbnRhaW5zOiBbIHsgYmVnaW46ICdcIlwiJyB9IF1cbiAgfTtcbiAgY29uc3QgVkVSQkFUSU1fU1RSSU5HX05PX0xGID0gaGxqcy5pbmhlcml0KFZFUkJBVElNX1NUUklORywgeyBpbGxlZ2FsOiAvXFxuLyB9KTtcbiAgY29uc3QgU1VCU1QgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3Vic3QnLFxuICAgIGJlZ2luOiAvXFx7LyxcbiAgICBlbmQ6IC9cXH0vLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEU1xuICB9O1xuICBjb25zdCBTVUJTVF9OT19MRiA9IGhsanMuaW5oZXJpdChTVUJTVCwgeyBpbGxlZ2FsOiAvXFxuLyB9KTtcbiAgY29uc3QgSU5URVJQT0xBVEVEX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXFwkXCIvLFxuICAgIGVuZDogJ1wiJyxcbiAgICBpbGxlZ2FsOiAvXFxuLyxcbiAgICBjb250YWluczogW1xuICAgICAgeyBiZWdpbjogL1xce1xcey8gfSxcbiAgICAgIHsgYmVnaW46IC9cXH1cXH0vIH0sXG4gICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICBTVUJTVF9OT19MRlxuICAgIF1cbiAgfTtcbiAgY29uc3QgSU5URVJQT0xBVEVEX1ZFUkJBVElNX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXFwkQFwiLyxcbiAgICBlbmQ6ICdcIicsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgYmVnaW46IC9cXHtcXHsvIH0sXG4gICAgICB7IGJlZ2luOiAvXFx9XFx9LyB9LFxuICAgICAgeyBiZWdpbjogJ1wiXCInIH0sXG4gICAgICBTVUJTVFxuICAgIF1cbiAgfTtcbiAgY29uc3QgSU5URVJQT0xBVEVEX1ZFUkJBVElNX1NUUklOR19OT19MRiA9IGhsanMuaW5oZXJpdChJTlRFUlBPTEFURURfVkVSQkFUSU1fU1RSSU5HLCB7XG4gICAgaWxsZWdhbDogL1xcbi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgYmVnaW46IC9cXHtcXHsvIH0sXG4gICAgICB7IGJlZ2luOiAvXFx9XFx9LyB9LFxuICAgICAgeyBiZWdpbjogJ1wiXCInIH0sXG4gICAgICBTVUJTVF9OT19MRlxuICAgIF1cbiAgfSk7XG4gIFNVQlNULmNvbnRhaW5zID0gW1xuICAgIElOVEVSUE9MQVRFRF9WRVJCQVRJTV9TVFJJTkcsXG4gICAgSU5URVJQT0xBVEVEX1NUUklORyxcbiAgICBWRVJCQVRJTV9TVFJJTkcsXG4gICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgTlVNQkVSUyxcbiAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gIF07XG4gIFNVQlNUX05PX0xGLmNvbnRhaW5zID0gW1xuICAgIElOVEVSUE9MQVRFRF9WRVJCQVRJTV9TVFJJTkdfTk9fTEYsXG4gICAgSU5URVJQT0xBVEVEX1NUUklORyxcbiAgICBWRVJCQVRJTV9TVFJJTkdfTk9fTEYsXG4gICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgTlVNQkVSUyxcbiAgICBobGpzLmluaGVyaXQoaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSwgeyBpbGxlZ2FsOiAvXFxuLyB9KVxuICBdO1xuICBjb25zdCBTVFJJTkcgPSB7IHZhcmlhbnRzOiBbXG4gICAgSU5URVJQT0xBVEVEX1ZFUkJBVElNX1NUUklORyxcbiAgICBJTlRFUlBPTEFURURfU1RSSU5HLFxuICAgIFZFUkJBVElNX1NUUklORyxcbiAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICBdIH07XG5cbiAgY29uc3QgR0VORVJJQ19NT0RJRklFUiA9IHtcbiAgICBiZWdpbjogXCI8XCIsXG4gICAgZW5kOiBcIj5cIixcbiAgICBjb250YWluczogW1xuICAgICAgeyBiZWdpbktleXdvcmRzOiBcImluIG91dFwiIH0sXG4gICAgICBUSVRMRV9NT0RFXG4gICAgXVxuICB9O1xuICBjb25zdCBUWVBFX0lERU5UX1JFID0gaGxqcy5JREVOVF9SRSArICcoPCcgKyBobGpzLklERU5UX1JFICsgJyhcXFxccyosXFxcXHMqJyArIGhsanMuSURFTlRfUkUgKyAnKSo+KT8oXFxcXFtcXFxcXSk/JztcbiAgY29uc3QgQVRfSURFTlRJRklFUiA9IHtcbiAgICAvLyBwcmV2ZW50cyBleHByZXNzaW9ucyBsaWtlIGBAY2xhc3NgIGZyb20gaW5jb3JyZWN0IGZsYWdnaW5nXG4gICAgLy8gYGNsYXNzYCBhcyBhIGtleXdvcmRcbiAgICBiZWdpbjogXCJAXCIgKyBobGpzLklERU5UX1JFLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0MjJyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAnY3MnLFxuICAgICAgJ2MjJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC86Oi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgJy8vLycsXG4gICAgICAgICckJyxcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYmVnaW46ICcvLy8nLFxuICAgICAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGJlZ2luOiAnPCEtLXwtLT4nIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYmVnaW46ICc8Lz8nLFxuICAgICAgICAgICAgICAgICAgZW5kOiAnPidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICAgICAgYmVnaW46ICcjJyxcbiAgICAgICAgZW5kOiAnJCcsXG4gICAgICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6ICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSByZWdpb24gZW5kcmVnaW9uIHByYWdtYSBjaGVja3N1bScgfVxuICAgICAgfSxcbiAgICAgIFNUUklORyxcbiAgICAgIE5VTUJFUlMsXG4gICAgICB7XG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICdjbGFzcyBpbnRlcmZhY2UnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGVuZDogL1t7Oz1dLyxcbiAgICAgICAgaWxsZWdhbDogL1teXFxzOixdLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7IGJlZ2luS2V5d29yZHM6IFwid2hlcmUgY2xhc3NcIiB9LFxuICAgICAgICAgIFRJVExFX01PREUsXG4gICAgICAgICAgR0VORVJJQ19NT0RJRklFUixcbiAgICAgICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbktleXdvcmRzOiAnbmFtZXNwYWNlJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBlbmQ6IC9bezs9XS8sXG4gICAgICAgIGlsbGVnYWw6IC9bXlxcczpdLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBUSVRMRV9NT0RFLFxuICAgICAgICAgIGhsanMuQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICdyZWNvcmQnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGVuZDogL1t7Oz1dLyxcbiAgICAgICAgaWxsZWdhbDogL1teXFxzOl0vLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIFRJVExFX01PREUsXG4gICAgICAgICAgR0VORVJJQ19NT0RJRklFUixcbiAgICAgICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBbQXR0cmlidXRlcyhcIlwiKV1cbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAnXlxcXFxzKlxcXFxbKD89W1xcXFx3XSknLFxuICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgIGVuZDogJ1xcXFxdJyxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgYmVnaW46IC9cIi8sXG4gICAgICAgICAgICBlbmQ6IC9cIi9cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIEV4cHJlc3Npb24ga2V5d29yZHMgcHJldmVudCAna2V5d29yZCBOYW1lKC4uLiknIGZyb20gYmVpbmdcbiAgICAgICAgLy8gcmVjb2duaXplZCBhcyBhIGZ1bmN0aW9uIGRlZmluaXRpb25cbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25ldyByZXR1cm4gdGhyb3cgYXdhaXQgZWxzZScsXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnZnVuY3Rpb24nLFxuICAgICAgICBiZWdpbjogJygnICsgVFlQRV9JREVOVF9SRSArICdcXFxccyspKycgKyBobGpzLklERU5UX1JFICsgJ1xcXFxzKig8W149XSs+XFxcXHMqKT9cXFxcKCcsXG4gICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICBlbmQ6IC9cXHMqW3s7PV0vLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgLy8gcHJldmVudHMgdGhlc2UgZnJvbSBiZWluZyBoaWdobGlnaHRlZCBgdGl0bGVgXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW5LZXl3b3JkczogRlVOQ1RJT05fTU9ESUZJRVJTLmpvaW4oXCIgXCIpLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogaGxqcy5JREVOVF9SRSArICdcXFxccyooPFtePV0rPlxcXFxzKik/XFxcXCgnLFxuICAgICAgICAgICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICBobGpzLlRJVExFX01PREUsXG4gICAgICAgICAgICAgIEdFTkVSSUNfTU9ESUZJRVJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgbWF0Y2g6IC9cXChcXCkvIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgU1RSSU5HLFxuICAgICAgICAgICAgICBOVU1CRVJTLFxuICAgICAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgQVRfSURFTlRJRklFUlxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgY3NoYXJwIGFzIGRlZmF1bHQgfTtcbiIsICJjb25zdCBNT0RFUyA9IChobGpzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgSU1QT1JUQU5UOiB7XG4gICAgICBzY29wZTogJ21ldGEnLFxuICAgICAgYmVnaW46ICchaW1wb3J0YW50J1xuICAgIH0sXG4gICAgQkxPQ0tfQ09NTUVOVDogaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBIRVhDT0xPUjoge1xuICAgICAgc2NvcGU6ICdudW1iZXInLFxuICAgICAgYmVnaW46IC8jKChbMC05YS1mQS1GXXszLDR9KXwoKFswLTlhLWZBLUZdezJ9KXszLDR9KSlcXGIvXG4gICAgfSxcbiAgICBGVU5DVElPTl9ESVNQQVRDSDoge1xuICAgICAgY2xhc3NOYW1lOiBcImJ1aWx0X2luXCIsXG4gICAgICBiZWdpbjogL1tcXHctXSsoPz1cXCgpL1xuICAgIH0sXG4gICAgQVRUUklCVVRFX1NFTEVDVE9SX01PREU6IHtcbiAgICAgIHNjb3BlOiAnc2VsZWN0b3ItYXR0cicsXG4gICAgICBiZWdpbjogL1xcWy8sXG4gICAgICBlbmQ6IC9cXF0vLFxuICAgICAgaWxsZWdhbDogJyQnLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICBobGpzLlFVT1RFX1NUUklOR19NT0RFXG4gICAgICBdXG4gICAgfSxcbiAgICBDU1NfTlVNQkVSX01PREU6IHtcbiAgICAgIHNjb3BlOiAnbnVtYmVyJyxcbiAgICAgIGJlZ2luOiBobGpzLk5VTUJFUl9SRSArICcoJyArXG4gICAgICAgICclfGVtfGV4fGNofHJlbScgK1xuICAgICAgICAnfHZ3fHZofHZtaW58dm1heCcgK1xuICAgICAgICAnfGNtfG1tfGlufHB0fHBjfHB4JyArXG4gICAgICAgICd8ZGVnfGdyYWR8cmFkfHR1cm4nICtcbiAgICAgICAgJ3xzfG1zJyArXG4gICAgICAgICd8SHp8a0h6JyArXG4gICAgICAgICd8ZHBpfGRwY218ZHBweCcgK1xuICAgICAgICAnKT8nLFxuICAgICAgcmVsZXZhbmNlOiAwXG4gICAgfSxcbiAgICBDU1NfVkFSSUFCTEU6IHtcbiAgICAgIGNsYXNzTmFtZTogXCJhdHRyXCIsXG4gICAgICBiZWdpbjogLy0tW0EtWmEtel1bQS1aYS16MC05Xy1dKi9cbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBUQUdTID0gW1xuICAnYScsXG4gICdhYmJyJyxcbiAgJ2FkZHJlc3MnLFxuICAnYXJ0aWNsZScsXG4gICdhc2lkZScsXG4gICdhdWRpbycsXG4gICdiJyxcbiAgJ2Jsb2NrcXVvdGUnLFxuICAnYm9keScsXG4gICdidXR0b24nLFxuICAnY2FudmFzJyxcbiAgJ2NhcHRpb24nLFxuICAnY2l0ZScsXG4gICdjb2RlJyxcbiAgJ2RkJyxcbiAgJ2RlbCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RmbicsXG4gICdkaXYnLFxuICAnZGwnLFxuICAnZHQnLFxuICAnZW0nLFxuICAnZmllbGRzZXQnLFxuICAnZmlnY2FwdGlvbicsXG4gICdmaWd1cmUnLFxuICAnZm9vdGVyJyxcbiAgJ2Zvcm0nLFxuICAnaDEnLFxuICAnaDInLFxuICAnaDMnLFxuICAnaDQnLFxuICAnaDUnLFxuICAnaDYnLFxuICAnaGVhZGVyJyxcbiAgJ2hncm91cCcsXG4gICdodG1sJyxcbiAgJ2knLFxuICAnaWZyYW1lJyxcbiAgJ2ltZycsXG4gICdpbnB1dCcsXG4gICdpbnMnLFxuICAna2JkJyxcbiAgJ2xhYmVsJyxcbiAgJ2xlZ2VuZCcsXG4gICdsaScsXG4gICdtYWluJyxcbiAgJ21hcmsnLFxuICAnbWVudScsXG4gICduYXYnLFxuICAnb2JqZWN0JyxcbiAgJ29sJyxcbiAgJ3AnLFxuICAncScsXG4gICdxdW90ZScsXG4gICdzYW1wJyxcbiAgJ3NlY3Rpb24nLFxuICAnc3BhbicsXG4gICdzdHJvbmcnLFxuICAnc3VtbWFyeScsXG4gICdzdXAnLFxuICAndGFibGUnLFxuICAndGJvZHknLFxuICAndGQnLFxuICAndGV4dGFyZWEnLFxuICAndGZvb3QnLFxuICAndGgnLFxuICAndGhlYWQnLFxuICAndGltZScsXG4gICd0cicsXG4gICd1bCcsXG4gICd2YXInLFxuICAndmlkZW8nXG5dO1xuXG5jb25zdCBNRURJQV9GRUFUVVJFUyA9IFtcbiAgJ2FueS1ob3ZlcicsXG4gICdhbnktcG9pbnRlcicsXG4gICdhc3BlY3QtcmF0aW8nLFxuICAnY29sb3InLFxuICAnY29sb3ItZ2FtdXQnLFxuICAnY29sb3ItaW5kZXgnLFxuICAnZGV2aWNlLWFzcGVjdC1yYXRpbycsXG4gICdkZXZpY2UtaGVpZ2h0JyxcbiAgJ2RldmljZS13aWR0aCcsXG4gICdkaXNwbGF5LW1vZGUnLFxuICAnZm9yY2VkLWNvbG9ycycsXG4gICdncmlkJyxcbiAgJ2hlaWdodCcsXG4gICdob3ZlcicsXG4gICdpbnZlcnRlZC1jb2xvcnMnLFxuICAnbW9ub2Nocm9tZScsXG4gICdvcmllbnRhdGlvbicsXG4gICdvdmVyZmxvdy1ibG9jaycsXG4gICdvdmVyZmxvdy1pbmxpbmUnLFxuICAncG9pbnRlcicsXG4gICdwcmVmZXJzLWNvbG9yLXNjaGVtZScsXG4gICdwcmVmZXJzLWNvbnRyYXN0JyxcbiAgJ3ByZWZlcnMtcmVkdWNlZC1tb3Rpb24nLFxuICAncHJlZmVycy1yZWR1Y2VkLXRyYW5zcGFyZW5jeScsXG4gICdyZXNvbHV0aW9uJyxcbiAgJ3NjYW4nLFxuICAnc2NyaXB0aW5nJyxcbiAgJ3VwZGF0ZScsXG4gICd3aWR0aCcsXG4gIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgc29sdXRpb24/XG4gICdtaW4td2lkdGgnLFxuICAnbWF4LXdpZHRoJyxcbiAgJ21pbi1oZWlnaHQnLFxuICAnbWF4LWhlaWdodCdcbl07XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Qc2V1ZG8tY2xhc3Nlc1xuY29uc3QgUFNFVURPX0NMQVNTRVMgPSBbXG4gICdhY3RpdmUnLFxuICAnYW55LWxpbmsnLFxuICAnYmxhbmsnLFxuICAnY2hlY2tlZCcsXG4gICdjdXJyZW50JyxcbiAgJ2RlZmF1bHQnLFxuICAnZGVmaW5lZCcsXG4gICdkaXInLCAvLyBkaXIoKVxuICAnZGlzYWJsZWQnLFxuICAnZHJvcCcsXG4gICdlbXB0eScsXG4gICdlbmFibGVkJyxcbiAgJ2ZpcnN0JyxcbiAgJ2ZpcnN0LWNoaWxkJyxcbiAgJ2ZpcnN0LW9mLXR5cGUnLFxuICAnZnVsbHNjcmVlbicsXG4gICdmdXR1cmUnLFxuICAnZm9jdXMnLFxuICAnZm9jdXMtdmlzaWJsZScsXG4gICdmb2N1cy13aXRoaW4nLFxuICAnaGFzJywgLy8gaGFzKClcbiAgJ2hvc3QnLCAvLyBob3N0IG9yIGhvc3QoKVxuICAnaG9zdC1jb250ZXh0JywgLy8gaG9zdC1jb250ZXh0KClcbiAgJ2hvdmVyJyxcbiAgJ2luZGV0ZXJtaW5hdGUnLFxuICAnaW4tcmFuZ2UnLFxuICAnaW52YWxpZCcsXG4gICdpcycsIC8vIGlzKClcbiAgJ2xhbmcnLCAvLyBsYW5nKClcbiAgJ2xhc3QtY2hpbGQnLFxuICAnbGFzdC1vZi10eXBlJyxcbiAgJ2xlZnQnLFxuICAnbGluaycsXG4gICdsb2NhbC1saW5rJyxcbiAgJ25vdCcsIC8vIG5vdCgpXG4gICdudGgtY2hpbGQnLCAvLyBudGgtY2hpbGQoKVxuICAnbnRoLWNvbCcsIC8vIG50aC1jb2woKVxuICAnbnRoLWxhc3QtY2hpbGQnLCAvLyBudGgtbGFzdC1jaGlsZCgpXG4gICdudGgtbGFzdC1jb2wnLCAvLyBudGgtbGFzdC1jb2woKVxuICAnbnRoLWxhc3Qtb2YtdHlwZScsIC8vbnRoLWxhc3Qtb2YtdHlwZSgpXG4gICdudGgtb2YtdHlwZScsIC8vbnRoLW9mLXR5cGUoKVxuICAnb25seS1jaGlsZCcsXG4gICdvbmx5LW9mLXR5cGUnLFxuICAnb3B0aW9uYWwnLFxuICAnb3V0LW9mLXJhbmdlJyxcbiAgJ3Bhc3QnLFxuICAncGxhY2Vob2xkZXItc2hvd24nLFxuICAncmVhZC1vbmx5JyxcbiAgJ3JlYWQtd3JpdGUnLFxuICAncmVxdWlyZWQnLFxuICAncmlnaHQnLFxuICAncm9vdCcsXG4gICdzY29wZScsXG4gICd0YXJnZXQnLFxuICAndGFyZ2V0LXdpdGhpbicsXG4gICd1c2VyLWludmFsaWQnLFxuICAndmFsaWQnLFxuICAndmlzaXRlZCcsXG4gICd3aGVyZScgLy8gd2hlcmUoKVxuXTtcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1BzZXVkby1lbGVtZW50c1xuY29uc3QgUFNFVURPX0VMRU1FTlRTID0gW1xuICAnYWZ0ZXInLFxuICAnYmFja2Ryb3AnLFxuICAnYmVmb3JlJyxcbiAgJ2N1ZScsXG4gICdjdWUtcmVnaW9uJyxcbiAgJ2ZpcnN0LWxldHRlcicsXG4gICdmaXJzdC1saW5lJyxcbiAgJ2dyYW1tYXItZXJyb3InLFxuICAnbWFya2VyJyxcbiAgJ3BhcnQnLFxuICAncGxhY2Vob2xkZXInLFxuICAnc2VsZWN0aW9uJyxcbiAgJ3Nsb3R0ZWQnLFxuICAnc3BlbGxpbmctZXJyb3InXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVTID0gW1xuICAnYWxpZ24tY29udGVudCcsXG4gICdhbGlnbi1pdGVtcycsXG4gICdhbGlnbi1zZWxmJyxcbiAgJ2FsbCcsXG4gICdhbmltYXRpb24nLFxuICAnYW5pbWF0aW9uLWRlbGF5JyxcbiAgJ2FuaW1hdGlvbi1kaXJlY3Rpb24nLFxuICAnYW5pbWF0aW9uLWR1cmF0aW9uJyxcbiAgJ2FuaW1hdGlvbi1maWxsLW1vZGUnLFxuICAnYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCcsXG4gICdhbmltYXRpb24tbmFtZScsXG4gICdhbmltYXRpb24tcGxheS1zdGF0ZScsXG4gICdhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgJ2JhY2tmYWNlLXZpc2liaWxpdHknLFxuICAnYmFja2dyb3VuZCcsXG4gICdiYWNrZ3JvdW5kLWF0dGFjaG1lbnQnLFxuICAnYmFja2dyb3VuZC1ibGVuZC1tb2RlJyxcbiAgJ2JhY2tncm91bmQtY2xpcCcsXG4gICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgJ2JhY2tncm91bmQtaW1hZ2UnLFxuICAnYmFja2dyb3VuZC1vcmlnaW4nLFxuICAnYmFja2dyb3VuZC1wb3NpdGlvbicsXG4gICdiYWNrZ3JvdW5kLXJlcGVhdCcsXG4gICdiYWNrZ3JvdW5kLXNpemUnLFxuICAnYmxvY2stc2l6ZScsXG4gICdib3JkZXInLFxuICAnYm9yZGVyLWJsb2NrJyxcbiAgJ2JvcmRlci1ibG9jay1jb2xvcicsXG4gICdib3JkZXItYmxvY2stZW5kJyxcbiAgJ2JvcmRlci1ibG9jay1lbmQtY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLWVuZC1zdHlsZScsXG4gICdib3JkZXItYmxvY2stZW5kLXdpZHRoJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydCcsXG4gICdib3JkZXItYmxvY2stc3RhcnQtY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLXN0YXJ0LXN0eWxlJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydC13aWR0aCcsXG4gICdib3JkZXItYmxvY2stc3R5bGUnLFxuICAnYm9yZGVyLWJsb2NrLXdpZHRoJyxcbiAgJ2JvcmRlci1ib3R0b20nLFxuICAnYm9yZGVyLWJvdHRvbS1jb2xvcicsXG4gICdib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJyxcbiAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJyxcbiAgJ2JvcmRlci1ib3R0b20tc3R5bGUnLFxuICAnYm9yZGVyLWJvdHRvbS13aWR0aCcsXG4gICdib3JkZXItY29sbGFwc2UnLFxuICAnYm9yZGVyLWNvbG9yJyxcbiAgJ2JvcmRlci1pbWFnZScsXG4gICdib3JkZXItaW1hZ2Utb3V0c2V0JyxcbiAgJ2JvcmRlci1pbWFnZS1yZXBlYXQnLFxuICAnYm9yZGVyLWltYWdlLXNsaWNlJyxcbiAgJ2JvcmRlci1pbWFnZS1zb3VyY2UnLFxuICAnYm9yZGVyLWltYWdlLXdpZHRoJyxcbiAgJ2JvcmRlci1pbmxpbmUnLFxuICAnYm9yZGVyLWlubGluZS1jb2xvcicsXG4gICdib3JkZXItaW5saW5lLWVuZCcsXG4gICdib3JkZXItaW5saW5lLWVuZC1jb2xvcicsXG4gICdib3JkZXItaW5saW5lLWVuZC1zdHlsZScsXG4gICdib3JkZXItaW5saW5lLWVuZC13aWR0aCcsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0JyxcbiAgJ2JvcmRlci1pbmxpbmUtc3RhcnQtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1zdGFydC1zdHlsZScsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0LXdpZHRoJyxcbiAgJ2JvcmRlci1pbmxpbmUtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS13aWR0aCcsXG4gICdib3JkZXItbGVmdCcsXG4gICdib3JkZXItbGVmdC1jb2xvcicsXG4gICdib3JkZXItbGVmdC1zdHlsZScsXG4gICdib3JkZXItbGVmdC13aWR0aCcsXG4gICdib3JkZXItcmFkaXVzJyxcbiAgJ2JvcmRlci1yaWdodCcsXG4gICdib3JkZXItcmlnaHQtY29sb3InLFxuICAnYm9yZGVyLXJpZ2h0LXN0eWxlJyxcbiAgJ2JvcmRlci1yaWdodC13aWR0aCcsXG4gICdib3JkZXItc3BhY2luZycsXG4gICdib3JkZXItc3R5bGUnLFxuICAnYm9yZGVyLXRvcCcsXG4gICdib3JkZXItdG9wLWNvbG9yJyxcbiAgJ2JvcmRlci10b3AtbGVmdC1yYWRpdXMnLFxuICAnYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMnLFxuICAnYm9yZGVyLXRvcC1zdHlsZScsXG4gICdib3JkZXItdG9wLXdpZHRoJyxcbiAgJ2JvcmRlci13aWR0aCcsXG4gICdib3R0b20nLFxuICAnYm94LWRlY29yYXRpb24tYnJlYWsnLFxuICAnYm94LXNoYWRvdycsXG4gICdib3gtc2l6aW5nJyxcbiAgJ2JyZWFrLWFmdGVyJyxcbiAgJ2JyZWFrLWJlZm9yZScsXG4gICdicmVhay1pbnNpZGUnLFxuICAnY2FwdGlvbi1zaWRlJyxcbiAgJ2NhcmV0LWNvbG9yJyxcbiAgJ2NsZWFyJyxcbiAgJ2NsaXAnLFxuICAnY2xpcC1wYXRoJyxcbiAgJ2NsaXAtcnVsZScsXG4gICdjb2xvcicsXG4gICdjb2x1bW4tY291bnQnLFxuICAnY29sdW1uLWZpbGwnLFxuICAnY29sdW1uLWdhcCcsXG4gICdjb2x1bW4tcnVsZScsXG4gICdjb2x1bW4tcnVsZS1jb2xvcicsXG4gICdjb2x1bW4tcnVsZS1zdHlsZScsXG4gICdjb2x1bW4tcnVsZS13aWR0aCcsXG4gICdjb2x1bW4tc3BhbicsXG4gICdjb2x1bW4td2lkdGgnLFxuICAnY29sdW1ucycsXG4gICdjb250YWluJyxcbiAgJ2NvbnRlbnQnLFxuICAnY29udGVudC12aXNpYmlsaXR5JyxcbiAgJ2NvdW50ZXItaW5jcmVtZW50JyxcbiAgJ2NvdW50ZXItcmVzZXQnLFxuICAnY3VlJyxcbiAgJ2N1ZS1hZnRlcicsXG4gICdjdWUtYmVmb3JlJyxcbiAgJ2N1cnNvcicsXG4gICdkaXJlY3Rpb24nLFxuICAnZGlzcGxheScsXG4gICdlbXB0eS1jZWxscycsXG4gICdmaWx0ZXInLFxuICAnZmxleCcsXG4gICdmbGV4LWJhc2lzJyxcbiAgJ2ZsZXgtZGlyZWN0aW9uJyxcbiAgJ2ZsZXgtZmxvdycsXG4gICdmbGV4LWdyb3cnLFxuICAnZmxleC1zaHJpbmsnLFxuICAnZmxleC13cmFwJyxcbiAgJ2Zsb2F0JyxcbiAgJ2Zsb3cnLFxuICAnZm9udCcsXG4gICdmb250LWRpc3BsYXknLFxuICAnZm9udC1mYW1pbHknLFxuICAnZm9udC1mZWF0dXJlLXNldHRpbmdzJyxcbiAgJ2ZvbnQta2VybmluZycsXG4gICdmb250LWxhbmd1YWdlLW92ZXJyaWRlJyxcbiAgJ2ZvbnQtc2l6ZScsXG4gICdmb250LXNpemUtYWRqdXN0JyxcbiAgJ2ZvbnQtc21vb3RoaW5nJyxcbiAgJ2ZvbnQtc3RyZXRjaCcsXG4gICdmb250LXN0eWxlJyxcbiAgJ2ZvbnQtc3ludGhlc2lzJyxcbiAgJ2ZvbnQtdmFyaWFudCcsXG4gICdmb250LXZhcmlhbnQtY2FwcycsXG4gICdmb250LXZhcmlhbnQtZWFzdC1hc2lhbicsXG4gICdmb250LXZhcmlhbnQtbGlnYXR1cmVzJyxcbiAgJ2ZvbnQtdmFyaWFudC1udW1lcmljJyxcbiAgJ2ZvbnQtdmFyaWFudC1wb3NpdGlvbicsXG4gICdmb250LXZhcmlhdGlvbi1zZXR0aW5ncycsXG4gICdmb250LXdlaWdodCcsXG4gICdnYXAnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLFxuICAnZ3JpZCcsXG4gICdncmlkLWFyZWEnLFxuICAnZ3JpZC1hdXRvLWNvbHVtbnMnLFxuICAnZ3JpZC1hdXRvLWZsb3cnLFxuICAnZ3JpZC1hdXRvLXJvd3MnLFxuICAnZ3JpZC1jb2x1bW4nLFxuICAnZ3JpZC1jb2x1bW4tZW5kJyxcbiAgJ2dyaWQtY29sdW1uLXN0YXJ0JyxcbiAgJ2dyaWQtZ2FwJyxcbiAgJ2dyaWQtcm93JyxcbiAgJ2dyaWQtcm93LWVuZCcsXG4gICdncmlkLXJvdy1zdGFydCcsXG4gICdncmlkLXRlbXBsYXRlJyxcbiAgJ2dyaWQtdGVtcGxhdGUtYXJlYXMnLFxuICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJyxcbiAgJ2dyaWQtdGVtcGxhdGUtcm93cycsXG4gICdoYW5naW5nLXB1bmN0dWF0aW9uJyxcbiAgJ2hlaWdodCcsXG4gICdoeXBoZW5zJyxcbiAgJ2ljb24nLFxuICAnaW1hZ2Utb3JpZW50YXRpb24nLFxuICAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgJ2ltYWdlLXJlc29sdXRpb24nLFxuICAnaW1lLW1vZGUnLFxuICAnaW5saW5lLXNpemUnLFxuICAnaXNvbGF0aW9uJyxcbiAgJ2p1c3RpZnktY29udGVudCcsXG4gICdsZWZ0JyxcbiAgJ2xldHRlci1zcGFjaW5nJyxcbiAgJ2xpbmUtYnJlYWsnLFxuICAnbGluZS1oZWlnaHQnLFxuICAnbGlzdC1zdHlsZScsXG4gICdsaXN0LXN0eWxlLWltYWdlJyxcbiAgJ2xpc3Qtc3R5bGUtcG9zaXRpb24nLFxuICAnbGlzdC1zdHlsZS10eXBlJyxcbiAgJ21hcmdpbicsXG4gICdtYXJnaW4tYmxvY2snLFxuICAnbWFyZ2luLWJsb2NrLWVuZCcsXG4gICdtYXJnaW4tYmxvY2stc3RhcnQnLFxuICAnbWFyZ2luLWJvdHRvbScsXG4gICdtYXJnaW4taW5saW5lJyxcbiAgJ21hcmdpbi1pbmxpbmUtZW5kJyxcbiAgJ21hcmdpbi1pbmxpbmUtc3RhcnQnLFxuICAnbWFyZ2luLWxlZnQnLFxuICAnbWFyZ2luLXJpZ2h0JyxcbiAgJ21hcmdpbi10b3AnLFxuICAnbWFya3MnLFxuICAnbWFzaycsXG4gICdtYXNrLWJvcmRlcicsXG4gICdtYXNrLWJvcmRlci1tb2RlJyxcbiAgJ21hc2stYm9yZGVyLW91dHNldCcsXG4gICdtYXNrLWJvcmRlci1yZXBlYXQnLFxuICAnbWFzay1ib3JkZXItc2xpY2UnLFxuICAnbWFzay1ib3JkZXItc291cmNlJyxcbiAgJ21hc2stYm9yZGVyLXdpZHRoJyxcbiAgJ21hc2stY2xpcCcsXG4gICdtYXNrLWNvbXBvc2l0ZScsXG4gICdtYXNrLWltYWdlJyxcbiAgJ21hc2stbW9kZScsXG4gICdtYXNrLW9yaWdpbicsXG4gICdtYXNrLXBvc2l0aW9uJyxcbiAgJ21hc2stcmVwZWF0JyxcbiAgJ21hc2stc2l6ZScsXG4gICdtYXNrLXR5cGUnLFxuICAnbWF4LWJsb2NrLXNpemUnLFxuICAnbWF4LWhlaWdodCcsXG4gICdtYXgtaW5saW5lLXNpemUnLFxuICAnbWF4LXdpZHRoJyxcbiAgJ21pbi1ibG9jay1zaXplJyxcbiAgJ21pbi1oZWlnaHQnLFxuICAnbWluLWlubGluZS1zaXplJyxcbiAgJ21pbi13aWR0aCcsXG4gICdtaXgtYmxlbmQtbW9kZScsXG4gICduYXYtZG93bicsXG4gICduYXYtaW5kZXgnLFxuICAnbmF2LWxlZnQnLFxuICAnbmF2LXJpZ2h0JyxcbiAgJ25hdi11cCcsXG4gICdub25lJyxcbiAgJ25vcm1hbCcsXG4gICdvYmplY3QtZml0JyxcbiAgJ29iamVjdC1wb3NpdGlvbicsXG4gICdvcGFjaXR5JyxcbiAgJ29yZGVyJyxcbiAgJ29ycGhhbnMnLFxuICAnb3V0bGluZScsXG4gICdvdXRsaW5lLWNvbG9yJyxcbiAgJ291dGxpbmUtb2Zmc2V0JyxcbiAgJ291dGxpbmUtc3R5bGUnLFxuICAnb3V0bGluZS13aWR0aCcsXG4gICdvdmVyZmxvdycsXG4gICdvdmVyZmxvdy13cmFwJyxcbiAgJ292ZXJmbG93LXgnLFxuICAnb3ZlcmZsb3cteScsXG4gICdwYWRkaW5nJyxcbiAgJ3BhZGRpbmctYmxvY2snLFxuICAncGFkZGluZy1ibG9jay1lbmQnLFxuICAncGFkZGluZy1ibG9jay1zdGFydCcsXG4gICdwYWRkaW5nLWJvdHRvbScsXG4gICdwYWRkaW5nLWlubGluZScsXG4gICdwYWRkaW5nLWlubGluZS1lbmQnLFxuICAncGFkZGluZy1pbmxpbmUtc3RhcnQnLFxuICAncGFkZGluZy1sZWZ0JyxcbiAgJ3BhZGRpbmctcmlnaHQnLFxuICAncGFkZGluZy10b3AnLFxuICAncGFnZS1icmVhay1hZnRlcicsXG4gICdwYWdlLWJyZWFrLWJlZm9yZScsXG4gICdwYWdlLWJyZWFrLWluc2lkZScsXG4gICdwYXVzZScsXG4gICdwYXVzZS1hZnRlcicsXG4gICdwYXVzZS1iZWZvcmUnLFxuICAncGVyc3BlY3RpdmUnLFxuICAncGVyc3BlY3RpdmUtb3JpZ2luJyxcbiAgJ3BvaW50ZXItZXZlbnRzJyxcbiAgJ3Bvc2l0aW9uJyxcbiAgJ3F1b3RlcycsXG4gICdyZXNpemUnLFxuICAncmVzdCcsXG4gICdyZXN0LWFmdGVyJyxcbiAgJ3Jlc3QtYmVmb3JlJyxcbiAgJ3JpZ2h0JyxcbiAgJ3Jvdy1nYXAnLFxuICAnc2Nyb2xsLW1hcmdpbicsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrJyxcbiAgJ3Njcm9sbC1tYXJnaW4tYmxvY2stZW5kJyxcbiAgJ3Njcm9sbC1tYXJnaW4tYmxvY2stc3RhcnQnLFxuICAnc2Nyb2xsLW1hcmdpbi1ib3R0b20nLFxuICAnc2Nyb2xsLW1hcmdpbi1pbmxpbmUnLFxuICAnc2Nyb2xsLW1hcmdpbi1pbmxpbmUtZW5kJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lLXN0YXJ0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tbGVmdCcsXG4gICdzY3JvbGwtbWFyZ2luLXJpZ2h0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tdG9wJyxcbiAgJ3Njcm9sbC1wYWRkaW5nJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWJsb2NrJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWJsb2NrLWVuZCcsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jay1zdGFydCcsXG4gICdzY3JvbGwtcGFkZGluZy1ib3R0b20nLFxuICAnc2Nyb2xsLXBhZGRpbmctaW5saW5lJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZS1lbmQnLFxuICAnc2Nyb2xsLXBhZGRpbmctaW5saW5lLXN0YXJ0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWxlZnQnLFxuICAnc2Nyb2xsLXBhZGRpbmctcmlnaHQnLFxuICAnc2Nyb2xsLXBhZGRpbmctdG9wJyxcbiAgJ3Njcm9sbC1zbmFwLWFsaWduJyxcbiAgJ3Njcm9sbC1zbmFwLXN0b3AnLFxuICAnc2Nyb2xsLXNuYXAtdHlwZScsXG4gICdzY3JvbGxiYXItY29sb3InLFxuICAnc2Nyb2xsYmFyLWd1dHRlcicsXG4gICdzY3JvbGxiYXItd2lkdGgnLFxuICAnc2hhcGUtaW1hZ2UtdGhyZXNob2xkJyxcbiAgJ3NoYXBlLW1hcmdpbicsXG4gICdzaGFwZS1vdXRzaWRlJyxcbiAgJ3NwZWFrJyxcbiAgJ3NwZWFrLWFzJyxcbiAgJ3NyYycsIC8vIEBmb250LWZhY2VcbiAgJ3RhYi1zaXplJyxcbiAgJ3RhYmxlLWxheW91dCcsXG4gICd0ZXh0LWFsaWduJyxcbiAgJ3RleHQtYWxpZ24tYWxsJyxcbiAgJ3RleHQtYWxpZ24tbGFzdCcsXG4gICd0ZXh0LWNvbWJpbmUtdXByaWdodCcsXG4gICd0ZXh0LWRlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uLWNvbG9yJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1saW5lJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1zdHlsZScsXG4gICd0ZXh0LWVtcGhhc2lzJyxcbiAgJ3RleHQtZW1waGFzaXMtY29sb3InLFxuICAndGV4dC1lbXBoYXNpcy1wb3NpdGlvbicsXG4gICd0ZXh0LWVtcGhhc2lzLXN0eWxlJyxcbiAgJ3RleHQtaW5kZW50JyxcbiAgJ3RleHQtanVzdGlmeScsXG4gICd0ZXh0LW9yaWVudGF0aW9uJyxcbiAgJ3RleHQtb3ZlcmZsb3cnLFxuICAndGV4dC1yZW5kZXJpbmcnLFxuICAndGV4dC1zaGFkb3cnLFxuICAndGV4dC10cmFuc2Zvcm0nLFxuICAndGV4dC11bmRlcmxpbmUtcG9zaXRpb24nLFxuICAndG9wJyxcbiAgJ3RyYW5zZm9ybScsXG4gICd0cmFuc2Zvcm0tYm94JyxcbiAgJ3RyYW5zZm9ybS1vcmlnaW4nLFxuICAndHJhbnNmb3JtLXN0eWxlJyxcbiAgJ3RyYW5zaXRpb24nLFxuICAndHJhbnNpdGlvbi1kZWxheScsXG4gICd0cmFuc2l0aW9uLWR1cmF0aW9uJyxcbiAgJ3RyYW5zaXRpb24tcHJvcGVydHknLFxuICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLFxuICAndW5pY29kZS1iaWRpJyxcbiAgJ3ZlcnRpY2FsLWFsaWduJyxcbiAgJ3Zpc2liaWxpdHknLFxuICAndm9pY2UtYmFsYW5jZScsXG4gICd2b2ljZS1kdXJhdGlvbicsXG4gICd2b2ljZS1mYW1pbHknLFxuICAndm9pY2UtcGl0Y2gnLFxuICAndm9pY2UtcmFuZ2UnLFxuICAndm9pY2UtcmF0ZScsXG4gICd2b2ljZS1zdHJlc3MnLFxuICAndm9pY2Utdm9sdW1lJyxcbiAgJ3doaXRlLXNwYWNlJyxcbiAgJ3dpZG93cycsXG4gICd3aWR0aCcsXG4gICd3aWxsLWNoYW5nZScsXG4gICd3b3JkLWJyZWFrJyxcbiAgJ3dvcmQtc3BhY2luZycsXG4gICd3b3JkLXdyYXAnLFxuICAnd3JpdGluZy1tb2RlJyxcbiAgJ3otaW5kZXgnXG4gIC8vIHJldmVyc2UgbWFrZXMgc3VyZSBsb25nZXIgYXR0cmlidXRlcyBgZm9udC13ZWlnaHRgIGFyZSBtYXRjaGVkIGZ1bGx5XG4gIC8vIGluc3RlYWQgb2YgZ2V0dGluZyBmYWxzZSBwb3NpdGl2ZXMgb24gc2F5IGBmb250YFxuXS5yZXZlcnNlKCk7XG5cbi8qXG5MYW5ndWFnZTogQ1NTXG5DYXRlZ29yeTogY29tbW9uLCBjc3MsIHdlYlxuV2Vic2l0ZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gY3NzKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBtb2RlcyA9IE1PREVTKGhsanMpO1xuICBjb25zdCBWRU5ET1JfUFJFRklYID0geyBiZWdpbjogLy0od2Via2l0fG1venxtc3xvKS0oPz1bYS16XSkvIH07XG4gIGNvbnN0IEFUX01PRElGSUVSUyA9IFwiYW5kIG9yIG5vdCBvbmx5XCI7XG4gIGNvbnN0IEFUX1BST1BFUlRZX1JFID0gL0AtP1xcd1tcXHddKigtXFx3KykqLzsgLy8gQC13ZWJraXQta2V5ZnJhbWVzXG4gIGNvbnN0IElERU5UX1JFID0gJ1thLXpBLVotXVthLXpBLVowLTlfLV0qJztcbiAgY29uc3QgU1RSSU5HUyA9IFtcbiAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0NTUycsXG4gICAgY2FzZV9pbnNlbnNpdGl2ZTogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAvWz18J1xcJF0vLFxuICAgIGtleXdvcmRzOiB7IGtleWZyYW1lUG9zaXRpb246IFwiZnJvbSB0b1wiIH0sXG4gICAgY2xhc3NOYW1lQWxpYXNlczoge1xuICAgICAgLy8gZm9yIHZpc3VhbCBjb250aW51aXR5IHdpdGggYHRhZyB7fWAgYW5kIGJlY2F1c2Ugd2VcbiAgICAgIC8vIGRvbid0IGhhdmUgYSBncmVhdCBjbGFzcyBmb3IgdGhpcz9cbiAgICAgIGtleWZyYW1lUG9zaXRpb246IFwic2VsZWN0b3ItdGFnXCIgfSxcbiAgICBjb250YWluczogW1xuICAgICAgbW9kZXMuQkxPQ0tfQ09NTUVOVCxcbiAgICAgIFZFTkRPUl9QUkVGSVgsXG4gICAgICAvLyB0byByZWNvZ25pemUga2V5ZnJhbWUgNDAlIGV0YyB3aGljaCBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygb3VyXG4gICAgICAvLyBhdHRyaWJ1dGUgdmFsdWUgbW9kZVxuICAgICAgbW9kZXMuQ1NTX05VTUJFUl9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1pZCcsXG4gICAgICAgIGJlZ2luOiAvI1tBLVphLXowLTlfLV0rLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1jbGFzcycsXG4gICAgICAgIGJlZ2luOiAnXFxcXC4nICsgSURFTlRfUkUsXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIG1vZGVzLkFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1wc2V1ZG8nLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHsgYmVnaW46ICc6KCcgKyBQU0VVRE9fQ0xBU1NFUy5qb2luKCd8JykgKyAnKScgfSxcbiAgICAgICAgICB7IGJlZ2luOiAnOig6KT8oJyArIFBTRVVET19FTEVNRU5UUy5qb2luKCd8JykgKyAnKScgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gd2UgbWF5IGFjdHVhbGx5IG5lZWQgdGhpcyAoMTIvMjAyMClcbiAgICAgIC8vIHsgLy8gcHNldWRvLXNlbGVjdG9yIHBhcmFtc1xuICAgICAgLy8gICBiZWdpbjogL1xcKC8sXG4gICAgICAvLyAgIGVuZDogL1xcKS8sXG4gICAgICAvLyAgIGNvbnRhaW5zOiBbIGhsanMuQ1NTX05VTUJFUl9NT0RFIF1cbiAgICAgIC8vIH0sXG4gICAgICBtb2Rlcy5DU1NfVkFSSUFCTEUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2F0dHJpYnV0ZScsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIEFUVFJJQlVURVMuam9pbignfCcpICsgJylcXFxcYidcbiAgICAgIH0sXG4gICAgICAvLyBhdHRyaWJ1dGUgdmFsdWVzXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOi8sXG4gICAgICAgIGVuZDogL1s7fXtdLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBtb2Rlcy5CTE9DS19DT01NRU5ULFxuICAgICAgICAgIG1vZGVzLkhFWENPTE9SLFxuICAgICAgICAgIG1vZGVzLklNUE9SVEFOVCxcbiAgICAgICAgICBtb2Rlcy5DU1NfTlVNQkVSX01PREUsXG4gICAgICAgICAgLi4uU1RSSU5HUyxcbiAgICAgICAgICAvLyBuZWVkZWQgdG8gaGlnaGxpZ2h0IHRoZXNlIGFzIHN0cmluZ3MgYW5kIHRvIGF2b2lkIGlzc3VlcyB3aXRoXG4gICAgICAgICAgLy8gaWxsZWdhbCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgaW5zaWRlIHVybHMgdGhhdCB3b3VsZCB0aWdnZXIgdGhlXG4gICAgICAgICAgLy8gbGFuZ3VhZ2VzIGlsbGVnYWwgc3RhY2tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogLyh1cmx8ZGF0YS11cmkpXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsIC8vIGZyb20ga2V5d29yZHNcbiAgICAgICAgICAgIGtleXdvcmRzOiB7IGJ1aWx0X2luOiBcInVybCBkYXRhLXVyaVwiIH0sXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICAuLi5TVFJJTkdTLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIC8vIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBgKWAgYXMgaW4gYHVybCgpYCB3aWxsIGJlIHRoZSBzdGFydFxuICAgICAgICAgICAgICAgIC8vIG9mIGEgc3RyaW5nLCB3aGljaCBlbmRzIHdpdGggYClgIChmcm9tIHRoZSBwYXJlbnQgbW9kZSlcbiAgICAgICAgICAgICAgICBiZWdpbjogL1teKV0vLFxuICAgICAgICAgICAgICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9kZXMuRlVOQ1RJT05fRElTUEFUQ0hcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IHJlZ2V4Lmxvb2thaGVhZCgvQC8pLFxuICAgICAgICBlbmQ6ICdbeztdJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBpbGxlZ2FsOiAvOi8sIC8vIGJyZWFrIG9uIExlc3MgdmFyaWFibGVzIEB2YXI6IC4uLlxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2tleXdvcmQnLFxuICAgICAgICAgICAgYmVnaW46IEFUX1BST1BFUlRZX1JFXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xccy8sXG4gICAgICAgICAgICBlbmRzV2l0aFBhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgICBrZXl3b3Jkczoge1xuICAgICAgICAgICAgICAkcGF0dGVybjogL1thLXotXSsvLFxuICAgICAgICAgICAgICBrZXl3b3JkOiBBVF9NT0RJRklFUlMsXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZTogTUVESUFfRkVBVFVSRVMuam9pbihcIiBcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVnaW46IC9bYS16LV0rKD89OikvLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJhdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAuLi5TVFJJTkdTLFxuICAgICAgICAgICAgICBtb2Rlcy5DU1NfTlVNQkVSX01PREVcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXRhZycsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIFRBR1Muam9pbignfCcpICsgJylcXFxcYidcbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IGNzcyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBEaWZmXG5EZXNjcmlwdGlvbjogVW5pZmllZCBhbmQgY29udGV4dCBkaWZmXG5BdXRob3I6IFZhc2lseSBQb2xvdm55b3YgPHZhc3RAd2hpdGVhbnRzLm5ldD5cbldlYnNpdGU6IGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZGlmZnV0aWxzL1xuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIGRpZmYoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0RpZmYnLFxuICAgIGFsaWFzZXM6IFsgJ3BhdGNoJyBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICByZWxldmFuY2U6IDEwLFxuICAgICAgICBtYXRjaDogcmVnZXguZWl0aGVyKFxuICAgICAgICAgIC9eQEAgKy1cXGQrLFxcZCsgK1xcK1xcZCssXFxkKyArQEAvLFxuICAgICAgICAgIC9eXFwqXFwqXFwqICtcXGQrLFxcZCsgK1xcKlxcKlxcKlxcKiQvLFxuICAgICAgICAgIC9eLS0tICtcXGQrLFxcZCsgKy0tLS0kL1xuICAgICAgICApXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdjb21tZW50JyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogcmVnZXguZWl0aGVyKFxuICAgICAgICAgICAgICAvSW5kZXg6IC8sXG4gICAgICAgICAgICAgIC9eaW5kZXgvLFxuICAgICAgICAgICAgICAvPXszLH0vLFxuICAgICAgICAgICAgICAvXi17M30vLFxuICAgICAgICAgICAgICAvXlxcKnszfSAvLFxuICAgICAgICAgICAgICAvXlxcK3szfS8sXG4gICAgICAgICAgICAgIC9eZGlmZiAtLWdpdC9cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbmQ6IC8kL1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtYXRjaDogL15cXCp7MTV9JC8gfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdhZGRpdGlvbicsXG4gICAgICAgIGJlZ2luOiAvXlxcKy8sXG4gICAgICAgIGVuZDogLyQvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdkZWxldGlvbicsXG4gICAgICAgIGJlZ2luOiAvXi0vLFxuICAgICAgICBlbmQ6IC8kL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnYWRkaXRpb24nLFxuICAgICAgICBiZWdpbjogL14hLyxcbiAgICAgICAgZW5kOiAvJC9cbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IGRpZmYgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogR29cbkF1dGhvcjogU3RlcGhhbiBLb3VudHNvIGFrYSBTdGVwTGcgPHN0ZXBsZ0BnbWFpbC5jb20+XG5Db250cmlidXRvcnM6IEV2Z2VueSBTdGVwYW5pc2NoZXYgPGltYm9sa0BnbWFpbC5jb20+XG5EZXNjcmlwdGlvbjogR29vZ2xlIGdvIGxhbmd1YWdlIChnb2xhbmcpLiBGb3IgaW5mbyBhYm91dCBsYW5ndWFnZVxuV2Vic2l0ZTogaHR0cDovL2dvbGFuZy5vcmcvXG5DYXRlZ29yeTogY29tbW9uLCBzeXN0ZW1cbiovXG5cbmZ1bmN0aW9uIGdvKGhsanMpIHtcbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwiaW90YVwiLFxuICAgIFwibmlsXCJcbiAgXTtcbiAgY29uc3QgQlVJTFRfSU5TID0gW1xuICAgIFwiYXBwZW5kXCIsXG4gICAgXCJjYXBcIixcbiAgICBcImNsb3NlXCIsXG4gICAgXCJjb21wbGV4XCIsXG4gICAgXCJjb3B5XCIsXG4gICAgXCJpbWFnXCIsXG4gICAgXCJsZW5cIixcbiAgICBcIm1ha2VcIixcbiAgICBcIm5ld1wiLFxuICAgIFwicGFuaWNcIixcbiAgICBcInByaW50XCIsXG4gICAgXCJwcmludGxuXCIsXG4gICAgXCJyZWFsXCIsXG4gICAgXCJyZWNvdmVyXCIsXG4gICAgXCJkZWxldGVcIlxuICBdO1xuICBjb25zdCBUWVBFUyA9IFtcbiAgICBcImJvb2xcIixcbiAgICBcImJ5dGVcIixcbiAgICBcImNvbXBsZXg2NFwiLFxuICAgIFwiY29tcGxleDEyOFwiLFxuICAgIFwiZXJyb3JcIixcbiAgICBcImZsb2F0MzJcIixcbiAgICBcImZsb2F0NjRcIixcbiAgICBcImludDhcIixcbiAgICBcImludDE2XCIsXG4gICAgXCJpbnQzMlwiLFxuICAgIFwiaW50NjRcIixcbiAgICBcInN0cmluZ1wiLFxuICAgIFwidWludDhcIixcbiAgICBcInVpbnQxNlwiLFxuICAgIFwidWludDMyXCIsXG4gICAgXCJ1aW50NjRcIixcbiAgICBcImludFwiLFxuICAgIFwidWludFwiLFxuICAgIFwidWludHB0clwiLFxuICAgIFwicnVuZVwiXG4gIF07XG4gIGNvbnN0IEtXUyA9IFtcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjYXNlXCIsXG4gICAgXCJjaGFuXCIsXG4gICAgXCJjb25zdFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImRlZmF1bHRcIixcbiAgICBcImRlZmVyXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJmYWxsdGhyb3VnaFwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJmdW5jXCIsXG4gICAgXCJnb1wiLFxuICAgIFwiZ290b1wiLFxuICAgIFwiaWZcIixcbiAgICBcImltcG9ydFwiLFxuICAgIFwiaW50ZXJmYWNlXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInBhY2thZ2VcIixcbiAgICBcInJhbmdlXCIsXG4gICAgXCJyZXR1cm5cIixcbiAgICBcInNlbGVjdFwiLFxuICAgIFwic3RydWN0XCIsXG4gICAgXCJzd2l0Y2hcIixcbiAgICBcInR5cGVcIixcbiAgICBcInZhclwiLFxuICBdO1xuICBjb25zdCBLRVlXT1JEUyA9IHtcbiAgICBrZXl3b3JkOiBLV1MsXG4gICAgdHlwZTogVFlQRVMsXG4gICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgYnVpbHRfaW46IEJVSUxUX0lOU1xuICB9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdHbycsXG4gICAgYWxpYXNlczogWyAnZ29sYW5nJyBdLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnYCcsXG4gICAgICAgICAgICBlbmQ6ICdgJ1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogaGxqcy5DX05VTUJFUl9SRSArICdbaV0nLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBobGpzLkNfTlVNQkVSX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHsgYmVnaW46IC86PS8gLy8gcmVsZXZhbmNlIGJvb3N0ZXJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ2Z1bmMnLFxuICAgICAgICBlbmQ6ICdcXFxccyooXFxcXHt8JCknLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIGhsanMuVElUTEVfTU9ERSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdwYXJhbXMnLFxuICAgICAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgICAgICBpbGxlZ2FsOiAvW1wiJ10vXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBnbyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbiBMYW5ndWFnZTogR3JhcGhRTFxuIEF1dGhvcjogSm9obiBGb3N0ZXIgKEdIIGpmOTkwKSwgYW5kIG90aGVyc1xuIERlc2NyaXB0aW9uOiBHcmFwaFFMIGlzIGEgcXVlcnkgbGFuZ3VhZ2UgZm9yIEFQSXNcbiBDYXRlZ29yeTogd2ViLCBjb21tb25cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBncmFwaHFsKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBHUUxfTkFNRSA9IC9bX0EtWmEtel1bXzAtOUEtWmEtel0qLztcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcIkdyYXBoUUxcIixcbiAgICBhbGlhc2VzOiBbIFwiZ3FsXCIgXSxcbiAgICBjYXNlX2luc2Vuc2l0aXZlOiB0cnVlLFxuICAgIGRpc2FibGVBdXRvZGV0ZWN0OiBmYWxzZSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAga2V5d29yZDogW1xuICAgICAgICBcInF1ZXJ5XCIsXG4gICAgICAgIFwibXV0YXRpb25cIixcbiAgICAgICAgXCJzdWJzY3JpcHRpb25cIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgXCJzY2hlbWFcIixcbiAgICAgICAgXCJkaXJlY3RpdmVcIixcbiAgICAgICAgXCJpbnRlcmZhY2VcIixcbiAgICAgICAgXCJ1bmlvblwiLFxuICAgICAgICBcInNjYWxhclwiLFxuICAgICAgICBcImZyYWdtZW50XCIsXG4gICAgICAgIFwiZW51bVwiLFxuICAgICAgICBcIm9uXCJcbiAgICAgIF0sXG4gICAgICBsaXRlcmFsOiBbXG4gICAgICAgIFwidHJ1ZVwiLFxuICAgICAgICBcImZhbHNlXCIsXG4gICAgICAgIFwibnVsbFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICBobGpzLk5VTUJFUl9NT0RFLFxuICAgICAge1xuICAgICAgICBzY29wZTogXCJwdW5jdHVhdGlvblwiLFxuICAgICAgICBtYXRjaDogL1suXXszfS8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IFwicHVuY3R1YXRpb25cIixcbiAgICAgICAgYmVnaW46IC9bXFwhXFwoXFwpXFw6XFw9XFxbXFxdXFx7XFx8XFx9XXsxfS8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IFwidmFyaWFibGVcIixcbiAgICAgICAgYmVnaW46IC9cXCQvLFxuICAgICAgICBlbmQ6IC9cXFcvLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiBcIm1ldGFcIixcbiAgICAgICAgbWF0Y2g6IC9AXFx3Ky8sXG4gICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiBcInN5bWJvbFwiLFxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KEdRTF9OQU1FLCByZWdleC5sb29rYWhlYWQoL1xccyo6LykpLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdLFxuICAgIGlsbGVnYWw6IFtcbiAgICAgIC9bOzwnXS8sXG4gICAgICAvQkVHSU4vXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBncmFwaHFsIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFRPTUwsIGFsc28gSU5JXG5EZXNjcmlwdGlvbjogVE9NTCBhaW1zIHRvIGJlIGEgbWluaW1hbCBjb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0IHRoYXQncyBlYXN5IHRvIHJlYWQgZHVlIHRvIG9idmlvdXMgc2VtYW50aWNzLlxuQ29udHJpYnV0b3JzOiBHdWlsbGF1bWUgR29tZXogPGd1aWxsYXVtZTEuZ29tZXpAZ21haWwuY29tPlxuQ2F0ZWdvcnk6IGNvbW1vbiwgY29uZmlnXG5XZWJzaXRlOiBodHRwczovL2dpdGh1Yi5jb20vdG9tbC1sYW5nL3RvbWxcbiovXG5cbmZ1bmN0aW9uIGluaShobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgTlVNQkVSUyA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogLyhbKy1dKyk/W1xcZF0rX1tcXGRfXSsvIH0sXG4gICAgICB7IGJlZ2luOiBobGpzLk5VTUJFUl9SRSB9XG4gICAgXVxuICB9O1xuICBjb25zdCBDT01NRU5UUyA9IGhsanMuQ09NTUVOVCgpO1xuICBDT01NRU5UUy52YXJpYW50cyA9IFtcbiAgICB7XG4gICAgICBiZWdpbjogLzsvLFxuICAgICAgZW5kOiAvJC9cbiAgICB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiAvIy8sXG4gICAgICBlbmQ6IC8kL1xuICAgIH1cbiAgXTtcbiAgY29uc3QgVkFSSUFCTEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogL1xcJFtcXHdcXGRcIl1bXFx3XFxkX10qLyB9LFxuICAgICAgeyBiZWdpbjogL1xcJFxceyguKj8pXFx9LyB9XG4gICAgXVxuICB9O1xuICBjb25zdCBMSVRFUkFMUyA9IHtcbiAgICBjbGFzc05hbWU6ICdsaXRlcmFsJyxcbiAgICBiZWdpbjogL1xcYm9ufG9mZnx0cnVlfGZhbHNlfHllc3xub1xcYi9cbiAgfTtcbiAgY29uc3QgU1RSSU5HUyA9IHtcbiAgICBjbGFzc05hbWU6IFwic3RyaW5nXCIsXG4gICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF0sXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFwiJycnXCIsXG4gICAgICAgIGVuZDogXCInJydcIixcbiAgICAgICAgcmVsZXZhbmNlOiAxMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdcIlwiXCInLFxuICAgICAgICBlbmQ6ICdcIlwiXCInLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJ1wiJyxcbiAgICAgICAgZW5kOiAnXCInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogXCInXCIsXG4gICAgICAgIGVuZDogXCInXCJcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IEFSUkFZID0ge1xuICAgIGJlZ2luOiAvXFxbLyxcbiAgICBlbmQ6IC9cXF0vLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBDT01NRU5UUyxcbiAgICAgIExJVEVSQUxTLFxuICAgICAgVkFSSUFCTEVTLFxuICAgICAgU1RSSU5HUyxcbiAgICAgIE5VTUJFUlMsXG4gICAgICAnc2VsZidcbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEJBUkVfS0VZID0gL1tBLVphLXowLTlfLV0rLztcbiAgY29uc3QgUVVPVEVEX0tFWV9ET1VCTEVfUVVPVEUgPSAvXCIoXFxcXFwifFteXCJdKSpcIi87XG4gIGNvbnN0IFFVT1RFRF9LRVlfU0lOR0xFX1FVT1RFID0gLydbXiddKicvO1xuICBjb25zdCBBTllfS0VZID0gcmVnZXguZWl0aGVyKFxuICAgIEJBUkVfS0VZLCBRVU9URURfS0VZX0RPVUJMRV9RVU9URSwgUVVPVEVEX0tFWV9TSU5HTEVfUVVPVEVcbiAgKTtcbiAgY29uc3QgRE9UVEVEX0tFWSA9IHJlZ2V4LmNvbmNhdChcbiAgICBBTllfS0VZLCAnKFxcXFxzKlxcXFwuXFxcXHMqJywgQU5ZX0tFWSwgJykqJyxcbiAgICByZWdleC5sb29rYWhlYWQoL1xccyo9XFxzKlteI1xcc10vKVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1RPTUwsIGFsc28gSU5JJyxcbiAgICBhbGlhc2VzOiBbICd0b21sJyBdLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgaWxsZWdhbDogL1xcUy8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIENPTU1FTlRTLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWN0aW9uJyxcbiAgICAgICAgYmVnaW46IC9cXFsrLyxcbiAgICAgICAgZW5kOiAvXFxdKy9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBET1RURURfS0VZLFxuICAgICAgICBjbGFzc05hbWU6ICdhdHRyJyxcbiAgICAgICAgc3RhcnRzOiB7XG4gICAgICAgICAgZW5kOiAvJC8sXG4gICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgIENPTU1FTlRTLFxuICAgICAgICAgICAgQVJSQVksXG4gICAgICAgICAgICBMSVRFUkFMUyxcbiAgICAgICAgICAgIFZBUklBQkxFUyxcbiAgICAgICAgICAgIFNUUklOR1MsXG4gICAgICAgICAgICBOVU1CRVJTXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBpbmkgYXMgZGVmYXVsdCB9O1xuIiwgIi8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxNS9odG1sL2pscy0zLmh0bWwjamxzLTMuMTBcbnZhciBkZWNpbWFsRGlnaXRzID0gJ1swLTldKF8qWzAtOV0pKic7XG52YXIgZnJhYyA9IGBcXFxcLigke2RlY2ltYWxEaWdpdHN9KWA7XG52YXIgaGV4RGlnaXRzID0gJ1swLTlhLWZBLUZdKF8qWzAtOWEtZkEtRl0pKic7XG52YXIgTlVNRVJJQyA9IHtcbiAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgdmFyaWFudHM6IFtcbiAgICAvLyBEZWNpbWFsRmxvYXRpbmdQb2ludExpdGVyYWxcbiAgICAvLyBpbmNsdWRpbmcgRXhwb25lbnRQYXJ0XG4gICAgeyBiZWdpbjogYChcXFxcYigke2RlY2ltYWxEaWdpdHN9KSgoJHtmcmFjfSl8XFxcXC4pP3woJHtmcmFjfSkpYCArXG4gICAgICBgW2VFXVsrLV0/KCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdP1xcXFxiYCB9LFxuICAgIC8vIGV4Y2x1ZGluZyBFeHBvbmVudFBhcnRcbiAgICB7IGJlZ2luOiBgXFxcXGIoJHtkZWNpbWFsRGlnaXRzfSkoKCR7ZnJhY30pW2ZGZERdP1xcXFxifFxcXFwuKFtmRmREXVxcXFxiKT8pYCB9LFxuICAgIHsgYmVnaW46IGAoJHtmcmFjfSlbZkZkRF0/XFxcXGJgIH0sXG4gICAgeyBiZWdpbjogYFxcXFxiKCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdXFxcXGJgIH0sXG5cbiAgICAvLyBIZXhhZGVjaW1hbEZsb2F0aW5nUG9pbnRMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oKCR7aGV4RGlnaXRzfSlcXFxcLj98KCR7aGV4RGlnaXRzfSk/XFxcXC4oJHtoZXhEaWdpdHN9KSlgICtcbiAgICAgIGBbcFBdWystXT8oJHtkZWNpbWFsRGlnaXRzfSlbZkZkRF0/XFxcXGJgIH0sXG5cbiAgICAvLyBEZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIoMHxbMS05XShfKlswLTldKSopW2xMXT9cXFxcYicgfSxcblxuICAgIC8vIEhleEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oJHtoZXhEaWdpdHN9KVtsTF0/XFxcXGJgIH0sXG5cbiAgICAvLyBPY3RhbEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogJ1xcXFxiMChfKlswLTddKSpbbExdP1xcXFxiJyB9LFxuXG4gICAgLy8gQmluYXJ5SW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIwW2JCXVswMV0oXypbMDFdKSpbbExdP1xcXFxiJyB9LFxuICBdLFxuICByZWxldmFuY2U6IDBcbn07XG5cbi8qXG5MYW5ndWFnZTogSmF2YVxuQXV0aG9yOiBWc2V2b2xvZCBTb2xvdnlvdiA8dnNldm9sb2Quc29sb3Z5b3ZAZ21haWwuY29tPlxuQ2F0ZWdvcnk6IGNvbW1vbiwgZW50ZXJwcmlzZVxuV2Vic2l0ZTogaHR0cHM6Ly93d3cuamF2YS5jb20vXG4qL1xuXG4vKipcbiAqIEFsbG93cyByZWN1cnNpdmUgcmVnZXggZXhwcmVzc2lvbnMgdG8gYSBnaXZlbiBkZXB0aFxuICpcbiAqIGllOiByZWN1clJlZ2V4KFwiKGFiY35+filcIiwgL35+fi9nLCAyKSBiZWNvbWVzOlxuICogKGFiYyhhYmMoYWJjKSkpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlXG4gKiBAcGFyYW0ge1JlZ0V4cH0gc3Vic3RpdHV0aW9uIChzaG91bGQgYmUgYSBnIG1vZGUgcmVnZXgpXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9YGBcbiAqL1xuZnVuY3Rpb24gcmVjdXJSZWdleChyZSwgc3Vic3RpdHV0aW9uLCBkZXB0aCkge1xuICBpZiAoZGVwdGggPT09IC0xKSByZXR1cm4gXCJcIjtcblxuICByZXR1cm4gcmUucmVwbGFjZShzdWJzdGl0dXRpb24sIF8gPT4ge1xuICAgIHJldHVybiByZWN1clJlZ2V4KHJlLCBzdWJzdGl0dXRpb24sIGRlcHRoIC0gMSk7XG4gIH0pO1xufVxuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gamF2YShobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgSkFWQV9JREVOVF9SRSA9ICdbXFx1MDBDMC1cXHUwMkI4YS16QS1aXyRdW1xcdTAwQzAtXFx1MDJCOGEtekEtWl8kMC05XSonO1xuICBjb25zdCBHRU5FUklDX0lERU5UX1JFID0gSkFWQV9JREVOVF9SRVxuICAgICsgcmVjdXJSZWdleCgnKD86PCcgKyBKQVZBX0lERU5UX1JFICsgJ35+fig/OlxcXFxzKixcXFxccyonICsgSkFWQV9JREVOVF9SRSArICd+fn4pKj4pPycsIC9+fn4vZywgMik7XG4gIGNvbnN0IE1BSU5fS0VZV09SRFMgPSBbXG4gICAgJ3N5bmNocm9uaXplZCcsXG4gICAgJ2Fic3RyYWN0JyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3ZhcicsXG4gICAgJ3N0YXRpYycsXG4gICAgJ2lmJyxcbiAgICAnY29uc3QgJyxcbiAgICAnZm9yJyxcbiAgICAnd2hpbGUnLFxuICAgICdzdHJpY3RmcCcsXG4gICAgJ2ZpbmFsbHknLFxuICAgICdwcm90ZWN0ZWQnLFxuICAgICdpbXBvcnQnLFxuICAgICduYXRpdmUnLFxuICAgICdmaW5hbCcsXG4gICAgJ3ZvaWQnLFxuICAgICdlbnVtJyxcbiAgICAnZWxzZScsXG4gICAgJ2JyZWFrJyxcbiAgICAndHJhbnNpZW50JyxcbiAgICAnY2F0Y2gnLFxuICAgICdpbnN0YW5jZW9mJyxcbiAgICAndm9sYXRpbGUnLFxuICAgICdjYXNlJyxcbiAgICAnYXNzZXJ0JyxcbiAgICAncGFja2FnZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdwdWJsaWMnLFxuICAgICd0cnknLFxuICAgICdzd2l0Y2gnLFxuICAgICdjb250aW51ZScsXG4gICAgJ3Rocm93cycsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3ByaXZhdGUnLFxuICAgICdtb2R1bGUnLFxuICAgICdyZXF1aXJlcycsXG4gICAgJ2V4cG9ydHMnLFxuICAgICdkbycsXG4gICAgJ3NlYWxlZCcsXG4gICAgJ3lpZWxkJyxcbiAgICAncGVybWl0cydcbiAgXTtcblxuICBjb25zdCBCVUlMVF9JTlMgPSBbXG4gICAgJ3N1cGVyJyxcbiAgICAndGhpcydcbiAgXTtcblxuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICAnZmFsc2UnLFxuICAgICd0cnVlJyxcbiAgICAnbnVsbCdcbiAgXTtcblxuICBjb25zdCBUWVBFUyA9IFtcbiAgICAnY2hhcicsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdsb25nJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdieXRlJyxcbiAgICAnc2hvcnQnLFxuICAgICdkb3VibGUnXG4gIF07XG5cbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAga2V5d29yZDogTUFJTl9LRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICB0eXBlOiBUWVBFUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TXG4gIH07XG5cbiAgY29uc3QgQU5OT1RBVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBiZWdpbjogJ0AnICsgSkFWQV9JREVOVF9SRSxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgIGNvbnRhaW5zOiBbIFwic2VsZlwiIF0gLy8gYWxsb3cgbmVzdGVkICgpIGluc2lkZSBvdXIgYW5ub3RhdGlvblxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgUEFSQU1TID0ge1xuICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgYmVnaW46IC9cXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogWyBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFIF0sXG4gICAgZW5kc1BhcmVudDogdHJ1ZVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0phdmEnLFxuICAgIGFsaWFzZXM6IFsgJ2pzcCcgXSxcbiAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgaWxsZWdhbDogLzxcXC98Iy8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgJy9cXFxcKlxcXFwqJyxcbiAgICAgICAgJ1xcXFwqLycsXG4gICAgICAgIHtcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gZWF0IHVwIEAncyBpbiBlbWFpbHMgdG8gcHJldmVudCB0aGVtIHRvIGJlIHJlY29nbml6ZWQgYXMgZG9jdGFnc1xuICAgICAgICAgICAgICBiZWdpbjogL1xcdytALyxcbiAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6ICdkb2N0YWcnLFxuICAgICAgICAgICAgICBiZWdpbjogJ0BbQS1aYS16XSsnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgLy8gcmVsZXZhbmNlIGJvb3N0XG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvaW1wb3J0IGphdmFcXC5bYS16XStcXC4vLFxuICAgICAgICBrZXl3b3JkczogXCJpbXBvcnRcIixcbiAgICAgICAgcmVsZXZhbmNlOiAyXG4gICAgICB9LFxuICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cIlwiXCIvLFxuICAgICAgICBlbmQ6IC9cIlwiXCIvLFxuICAgICAgICBjbGFzc05hbWU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSBdXG4gICAgICB9LFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvXFxiKD86Y2xhc3N8aW50ZXJmYWNlfGVudW18ZXh0ZW5kc3xpbXBsZW1lbnRzfG5ldykvLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBKQVZBX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidGl0bGUuY2xhc3NcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBFeGNlcHRpb25zIGZvciBoeXBoZW5hdGVkIGtleXdvcmRzXG4gICAgICAgIG1hdGNoOiAvbm9uLXNlYWxlZC8sXG4gICAgICAgIHNjb3BlOiBcImtleXdvcmRcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICByZWdleC5jb25jYXQoLyg/IWVsc2UpLywgSkFWQV9JREVOVF9SRSksXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIEpBVkFfSURFTlRfUkUsXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIC89KD8hPSkvXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwidHlwZVwiLFxuICAgICAgICAgIDM6IFwidmFyaWFibGVcIixcbiAgICAgICAgICA1OiBcIm9wZXJhdG9yXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvcmVjb3JkLyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgSkFWQV9JREVOVF9SRVxuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBQQVJBTVMsXG4gICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gRXhwcmVzc2lvbiBrZXl3b3JkcyBwcmV2ZW50ICdrZXl3b3JkIE5hbWUoLi4uKScgZnJvbSBiZWluZ1xuICAgICAgICAvLyByZWNvZ25pemVkIGFzIGEgZnVuY3Rpb24gZGVmaW5pdGlvblxuICAgICAgICBiZWdpbktleXdvcmRzOiAnbmV3IHRocm93IHJldHVybiBlbHNlJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogW1xuICAgICAgICAgICcoPzonICsgR0VORVJJQ19JREVOVF9SRSArICdcXFxccyspJyxcbiAgICAgICAgICBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUsXG4gICAgICAgICAgL1xccyooPz1cXCgpL1xuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHsgMjogXCJ0aXRsZS5mdW5jdGlvblwiIH0sXG4gICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdwYXJhbXMnLFxuICAgICAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgIEFOTk9UQVRJT04sXG4gICAgICAgICAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgICAgICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgICAgICAgICAgTlVNRVJJQyxcbiAgICAgICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIE5VTUVSSUMsXG4gICAgICBBTk5PVEFUSU9OXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBqYXZhIGFzIGRlZmF1bHQgfTtcbiIsICJjb25zdCBJREVOVF9SRSA9ICdbQS1aYS16JF9dWzAtOUEtWmEteiRfXSonO1xuY29uc3QgS0VZV09SRFMgPSBbXG4gIFwiYXNcIiwgLy8gZm9yIGV4cG9ydHNcbiAgXCJpblwiLFxuICBcIm9mXCIsXG4gIFwiaWZcIixcbiAgXCJmb3JcIixcbiAgXCJ3aGlsZVwiLFxuICBcImZpbmFsbHlcIixcbiAgXCJ2YXJcIixcbiAgXCJuZXdcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcImRvXCIsXG4gIFwicmV0dXJuXCIsXG4gIFwidm9pZFwiLFxuICBcImVsc2VcIixcbiAgXCJicmVha1wiLFxuICBcImNhdGNoXCIsXG4gIFwiaW5zdGFuY2VvZlwiLFxuICBcIndpdGhcIixcbiAgXCJ0aHJvd1wiLFxuICBcImNhc2VcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwidHJ5XCIsXG4gIFwic3dpdGNoXCIsXG4gIFwiY29udGludWVcIixcbiAgXCJ0eXBlb2ZcIixcbiAgXCJkZWxldGVcIixcbiAgXCJsZXRcIixcbiAgXCJ5aWVsZFwiLFxuICBcImNvbnN0XCIsXG4gIFwiY2xhc3NcIixcbiAgLy8gSlMgaGFuZGxlcyB0aGVzZSB3aXRoIGEgc3BlY2lhbCBydWxlXG4gIC8vIFwiZ2V0XCIsXG4gIC8vIFwic2V0XCIsXG4gIFwiZGVidWdnZXJcIixcbiAgXCJhc3luY1wiLFxuICBcImF3YWl0XCIsXG4gIFwic3RhdGljXCIsXG4gIFwiaW1wb3J0XCIsXG4gIFwiZnJvbVwiLFxuICBcImV4cG9ydFwiLFxuICBcImV4dGVuZHNcIlxuXTtcbmNvbnN0IExJVEVSQUxTID0gW1xuICBcInRydWVcIixcbiAgXCJmYWxzZVwiLFxuICBcIm51bGxcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJOYU5cIixcbiAgXCJJbmZpbml0eVwiXG5dO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0c1xuY29uc3QgVFlQRVMgPSBbXG4gIC8vIEZ1bmRhbWVudGFsIG9iamVjdHNcbiAgXCJPYmplY3RcIixcbiAgXCJGdW5jdGlvblwiLFxuICBcIkJvb2xlYW5cIixcbiAgXCJTeW1ib2xcIixcbiAgLy8gbnVtYmVycyBhbmQgZGF0ZXNcbiAgXCJNYXRoXCIsXG4gIFwiRGF0ZVwiLFxuICBcIk51bWJlclwiLFxuICBcIkJpZ0ludFwiLFxuICAvLyB0ZXh0XG4gIFwiU3RyaW5nXCIsXG4gIFwiUmVnRXhwXCIsXG4gIC8vIEluZGV4ZWQgY29sbGVjdGlvbnNcbiAgXCJBcnJheVwiLFxuICBcIkZsb2F0MzJBcnJheVwiLFxuICBcIkZsb2F0NjRBcnJheVwiLFxuICBcIkludDhBcnJheVwiLFxuICBcIlVpbnQ4QXJyYXlcIixcbiAgXCJVaW50OENsYW1wZWRBcnJheVwiLFxuICBcIkludDE2QXJyYXlcIixcbiAgXCJJbnQzMkFycmF5XCIsXG4gIFwiVWludDE2QXJyYXlcIixcbiAgXCJVaW50MzJBcnJheVwiLFxuICBcIkJpZ0ludDY0QXJyYXlcIixcbiAgXCJCaWdVaW50NjRBcnJheVwiLFxuICAvLyBLZXllZCBjb2xsZWN0aW9uc1xuICBcIlNldFwiLFxuICBcIk1hcFwiLFxuICBcIldlYWtTZXRcIixcbiAgXCJXZWFrTWFwXCIsXG4gIC8vIFN0cnVjdHVyZWQgZGF0YVxuICBcIkFycmF5QnVmZmVyXCIsXG4gIFwiU2hhcmVkQXJyYXlCdWZmZXJcIixcbiAgXCJBdG9taWNzXCIsXG4gIFwiRGF0YVZpZXdcIixcbiAgXCJKU09OXCIsXG4gIC8vIENvbnRyb2wgYWJzdHJhY3Rpb24gb2JqZWN0c1xuICBcIlByb21pc2VcIixcbiAgXCJHZW5lcmF0b3JcIixcbiAgXCJHZW5lcmF0b3JGdW5jdGlvblwiLFxuICBcIkFzeW5jRnVuY3Rpb25cIixcbiAgLy8gUmVmbGVjdGlvblxuICBcIlJlZmxlY3RcIixcbiAgXCJQcm94eVwiLFxuICAvLyBJbnRlcm5hdGlvbmFsaXphdGlvblxuICBcIkludGxcIixcbiAgLy8gV2ViQXNzZW1ibHlcbiAgXCJXZWJBc3NlbWJseVwiXG5dO1xuXG5jb25zdCBFUlJPUl9UWVBFUyA9IFtcbiAgXCJFcnJvclwiLFxuICBcIkV2YWxFcnJvclwiLFxuICBcIkludGVybmFsRXJyb3JcIixcbiAgXCJSYW5nZUVycm9yXCIsXG4gIFwiUmVmZXJlbmNlRXJyb3JcIixcbiAgXCJTeW50YXhFcnJvclwiLFxuICBcIlR5cGVFcnJvclwiLFxuICBcIlVSSUVycm9yXCJcbl07XG5cbmNvbnN0IEJVSUxUX0lOX0dMT0JBTFMgPSBbXG4gIFwic2V0SW50ZXJ2YWxcIixcbiAgXCJzZXRUaW1lb3V0XCIsXG4gIFwiY2xlYXJJbnRlcnZhbFwiLFxuICBcImNsZWFyVGltZW91dFwiLFxuXG4gIFwicmVxdWlyZVwiLFxuICBcImV4cG9ydHNcIixcblxuICBcImV2YWxcIixcbiAgXCJpc0Zpbml0ZVwiLFxuICBcImlzTmFOXCIsXG4gIFwicGFyc2VGbG9hdFwiLFxuICBcInBhcnNlSW50XCIsXG4gIFwiZGVjb2RlVVJJXCIsXG4gIFwiZGVjb2RlVVJJQ29tcG9uZW50XCIsXG4gIFwiZW5jb2RlVVJJXCIsXG4gIFwiZW5jb2RlVVJJQ29tcG9uZW50XCIsXG4gIFwiZXNjYXBlXCIsXG4gIFwidW5lc2NhcGVcIlxuXTtcblxuY29uc3QgQlVJTFRfSU5fVkFSSUFCTEVTID0gW1xuICBcImFyZ3VtZW50c1wiLFxuICBcInRoaXNcIixcbiAgXCJzdXBlclwiLFxuICBcImNvbnNvbGVcIixcbiAgXCJ3aW5kb3dcIixcbiAgXCJkb2N1bWVudFwiLFxuICBcImxvY2FsU3RvcmFnZVwiLFxuICBcInNlc3Npb25TdG9yYWdlXCIsXG4gIFwibW9kdWxlXCIsXG4gIFwiZ2xvYmFsXCIgLy8gTm9kZS5qc1xuXTtcblxuY29uc3QgQlVJTFRfSU5TID0gW10uY29uY2F0KFxuICBCVUlMVF9JTl9HTE9CQUxTLFxuICBUWVBFUyxcbiAgRVJST1JfVFlQRVNcbik7XG5cbi8qXG5MYW5ndWFnZTogSmF2YVNjcmlwdFxuRGVzY3JpcHRpb246IEphdmFTY3JpcHQgKEpTKSBpcyBhIGxpZ2h0d2VpZ2h0LCBpbnRlcnByZXRlZCwgb3IganVzdC1pbi10aW1lIGNvbXBpbGVkIHByb2dyYW1taW5nIGxhbmd1YWdlIHdpdGggZmlyc3QtY2xhc3MgZnVuY3Rpb25zLlxuQ2F0ZWdvcnk6IGNvbW1vbiwgc2NyaXB0aW5nLCB3ZWJcbldlYnNpdGU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHRcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBqYXZhc2NyaXB0KGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICAvKipcbiAgICogVGFrZXMgYSBzdHJpbmcgbGlrZSBcIjxCb29nZXJcIiBhbmQgY2hlY2tzIHRvIHNlZVxuICAgKiBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIFwiPC9Cb29nZXJcIiBsYXRlciBpbiB0aGVcbiAgICogY29udGVudC5cbiAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICAgKiBAcGFyYW0ge3thZnRlcjpudW1iZXJ9fSBwYXJhbTFcbiAgICovXG4gIGNvbnN0IGhhc0Nsb3NpbmdUYWcgPSAobWF0Y2gsIHsgYWZ0ZXIgfSkgPT4ge1xuICAgIGNvbnN0IHRhZyA9IFwiPC9cIiArIG1hdGNoWzBdLnNsaWNlKDEpO1xuICAgIGNvbnN0IHBvcyA9IG1hdGNoLmlucHV0LmluZGV4T2YodGFnLCBhZnRlcik7XG4gICAgcmV0dXJuIHBvcyAhPT0gLTE7XG4gIH07XG5cbiAgY29uc3QgSURFTlRfUkUkMSA9IElERU5UX1JFO1xuICBjb25zdCBGUkFHTUVOVCA9IHtcbiAgICBiZWdpbjogJzw+JyxcbiAgICBlbmQ6ICc8Lz4nXG4gIH07XG4gIC8vIHRvIGF2b2lkIHNvbWUgc3BlY2lhbCBjYXNlcyBpbnNpZGUgaXNUcnVseU9wZW5pbmdUYWdcbiAgY29uc3QgWE1MX1NFTEZfQ0xPU0lORyA9IC88W0EtWmEtejAtOVxcXFwuXzotXStcXHMqXFwvPi87XG4gIGNvbnN0IFhNTF9UQUcgPSB7XG4gICAgYmVnaW46IC88W0EtWmEtejAtOVxcXFwuXzotXSsvLFxuICAgIGVuZDogL1xcL1tBLVphLXowLTlcXFxcLl86LV0rPnxcXC8+LyxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JlZ0V4cE1hdGNoQXJyYXl9IG1hdGNoXG4gICAgICogQHBhcmFtIHtDYWxsYmFja1Jlc3BvbnNlfSByZXNwb25zZVxuICAgICAqL1xuICAgIGlzVHJ1bHlPcGVuaW5nVGFnOiAobWF0Y2gsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBhZnRlck1hdGNoSW5kZXggPSBtYXRjaFswXS5sZW5ndGggKyBtYXRjaC5pbmRleDtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2guaW5wdXRbYWZ0ZXJNYXRjaEluZGV4XTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gSFRNTCBzaG91bGQgbm90IGluY2x1ZGUgYW5vdGhlciByYXcgYDxgIGluc2lkZSBhIHRhZ1xuICAgICAgICAvLyBuZXN0ZWQgdHlwZT9cbiAgICAgICAgLy8gYDxBcnJheTxBcnJheTxudW1iZXI+PmAsIGV0Yy5cbiAgICAgICAgbmV4dENoYXIgPT09IFwiPFwiIHx8XG4gICAgICAgIC8vIHRoZSAsIGdpdmVzIGF3YXkgdGhhdCB0aGlzIGlzIG5vdCBIVE1MXG4gICAgICAgIC8vIGA8VCwgQSBleHRlbmRzIGtleW9mIFQsIFY+YFxuICAgICAgICBuZXh0Q2hhciA9PT0gXCIsXCJcbiAgICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYDxzb21ldGhpbmc+YFxuICAgICAgLy8gUXVpdGUgcG9zc2libHkgYSB0YWcsIGxldHMgbG9vayBmb3IgYSBtYXRjaGluZyBjbG9zaW5nIHRhZy4uLlxuICAgICAgaWYgKG5leHRDaGFyID09PSBcIj5cIikge1xuICAgICAgICAvLyBpZiB3ZSBjYW5ub3QgZmluZCBhIG1hdGNoaW5nIGNsb3NpbmcgdGFnLCB0aGVuIHdlXG4gICAgICAgIC8vIHdpbGwgaWdub3JlIGl0XG4gICAgICAgIGlmICghaGFzQ2xvc2luZ1RhZyhtYXRjaCwgeyBhZnRlcjogYWZ0ZXJNYXRjaEluZGV4IH0pKSB7XG4gICAgICAgICAgcmVzcG9uc2UuaWdub3JlTWF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBgPGJsYWggLz5gIChzZWxmLWNsb3NpbmcpXG4gICAgICAvLyBoYW5kbGVkIGJ5IHNpbXBsZVNlbGZDbG9zaW5nIHJ1bGVcblxuICAgICAgbGV0IG07XG4gICAgICBjb25zdCBhZnRlck1hdGNoID0gbWF0Y2guaW5wdXQuc3Vic3RyaW5nKGFmdGVyTWF0Y2hJbmRleCk7XG5cbiAgICAgIC8vIHNvbWUgbW9yZSB0ZW1wbGF0ZSB0eXBpbmcgc3R1ZmZcbiAgICAgIC8vICA8VCA9IGFueT4oa2V5Pzogc3RyaW5nKSA9PiBNb2RpZnk8XG4gICAgICBpZiAoKG0gPSBhZnRlck1hdGNoLm1hdGNoKC9eXFxzKj0vKSkpIHtcbiAgICAgICAgcmVzcG9uc2UuaWdub3JlTWF0Y2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBgPEZyb20gZXh0ZW5kcyBzdHJpbmc+YFxuICAgICAgLy8gdGVjaG5pY2FsbHkgdGhpcyBjb3VsZCBiZSBIVE1MLCBidXQgaXQgc21lbGxzIGxpa2UgYSB0eXBlXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIHVnaCwgYnV0IGFkZGVkIHNwZWNpZmljYWxseSBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzI3NlxuICAgICAgaWYgKChtID0gYWZ0ZXJNYXRjaC5tYXRjaCgvXlxccytleHRlbmRzXFxzKy8pKSkge1xuICAgICAgICBpZiAobS5pbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtcmV0dXJuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBLRVlXT1JEUyQxID0ge1xuICAgICRwYXR0ZXJuOiBJREVOVF9SRSxcbiAgICBrZXl3b3JkOiBLRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TLFxuICAgIFwidmFyaWFibGUubGFuZ3VhZ2VcIjogQlVJTFRfSU5fVkFSSUFCTEVTXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1saXRlcmFscy1udW1lcmljLWxpdGVyYWxzXG4gIGNvbnN0IGRlY2ltYWxEaWdpdHMgPSAnWzAtOV0oXz9bMC05XSkqJztcbiAgY29uc3QgZnJhYyA9IGBcXFxcLigke2RlY2ltYWxEaWdpdHN9KWA7XG4gIC8vIERlY2ltYWxJbnRlZ2VyTGl0ZXJhbCwgaW5jbHVkaW5nIEFubmV4IEIgTm9uT2N0YWxEZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZGRpdGlvbmFsLXN5bnRheC1udW1lcmljLWxpdGVyYWxzXG4gIGNvbnN0IGRlY2ltYWxJbnRlZ2VyID0gYDB8WzEtOV0oXz9bMC05XSkqfDBbMC03XSpbODldWzAtOV0qYDtcbiAgY29uc3QgTlVNQkVSID0ge1xuICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIC8vIERlY2ltYWxMaXRlcmFsXG4gICAgICB7IGJlZ2luOiBgKFxcXFxiKCR7ZGVjaW1hbEludGVnZXJ9KSgoJHtmcmFjfSl8XFxcXC4pP3woJHtmcmFjfSkpYCArXG4gICAgICAgIGBbZUVdWystXT8oJHtkZWNpbWFsRGlnaXRzfSlcXFxcYmAgfSxcbiAgICAgIHsgYmVnaW46IGBcXFxcYigke2RlY2ltYWxJbnRlZ2VyfSlcXFxcYigoJHtmcmFjfSlcXFxcYnxcXFxcLik/fCgke2ZyYWN9KVxcXFxiYCB9LFxuXG4gICAgICAvLyBEZWNpbWFsQmlnSW50ZWdlckxpdGVyYWxcbiAgICAgIHsgYmVnaW46IGBcXFxcYigwfFsxLTldKF8/WzAtOV0pKiluXFxcXGJgIH0sXG5cbiAgICAgIC8vIE5vbkRlY2ltYWxJbnRlZ2VyTGl0ZXJhbFxuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbeFhdWzAtOWEtZkEtRl0oXz9bMC05YS1mQS1GXSkqbj9cXFxcYlwiIH0sXG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFtiQl1bMC0xXShfP1swLTFdKSpuP1xcXFxiXCIgfSxcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwW29PXVswLTddKF8/WzAtN10pKm4/XFxcXGJcIiB9LFxuXG4gICAgICAvLyBMZWdhY3lPY3RhbEludGVnZXJMaXRlcmFsIChkb2VzIG5vdCBpbmNsdWRlIHVuZGVyc2NvcmUgc2VwYXJhdG9ycylcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWRkaXRpb25hbC1zeW50YXgtbnVtZXJpYy1saXRlcmFsc1xuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbMC03XStuP1xcXFxiXCIgfSxcbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IFNVQlNUID0ge1xuICAgIGNsYXNzTmFtZTogJ3N1YnN0JyxcbiAgICBiZWdpbjogJ1xcXFwkXFxcXHsnLFxuICAgIGVuZDogJ1xcXFx9JyxcbiAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICBjb250YWluczogW10gLy8gZGVmaW5lZCBsYXRlclxuICB9O1xuICBjb25zdCBIVE1MX1RFTVBMQVRFID0ge1xuICAgIGJlZ2luOiAnaHRtbGAnLFxuICAgIGVuZDogJycsXG4gICAgc3RhcnRzOiB7XG4gICAgICBlbmQ6ICdgJyxcbiAgICAgIHJldHVybkVuZDogZmFsc2UsXG4gICAgICBjb250YWluczogW1xuICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgIFNVQlNUXG4gICAgICBdLFxuICAgICAgc3ViTGFuZ3VhZ2U6ICd4bWwnXG4gICAgfVxuICB9O1xuICBjb25zdCBDU1NfVEVNUExBVEUgPSB7XG4gICAgYmVnaW46ICdjc3NgJyxcbiAgICBlbmQ6ICcnLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnYCcsXG4gICAgICByZXR1cm5FbmQ6IGZhbHNlLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICBTVUJTVFxuICAgICAgXSxcbiAgICAgIHN1Ykxhbmd1YWdlOiAnY3NzJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgR1JBUEhRTF9URU1QTEFURSA9IHtcbiAgICBiZWdpbjogJ2dxbGAnLFxuICAgIGVuZDogJycsXG4gICAgc3RhcnRzOiB7XG4gICAgICBlbmQ6ICdgJyxcbiAgICAgIHJldHVybkVuZDogZmFsc2UsXG4gICAgICBjb250YWluczogW1xuICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgIFNVQlNUXG4gICAgICBdLFxuICAgICAgc3ViTGFuZ3VhZ2U6ICdncmFwaHFsJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgVEVNUExBVEVfU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgYmVnaW46ICdgJyxcbiAgICBlbmQ6ICdgJyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgU1VCU1RcbiAgICBdXG4gIH07XG4gIGNvbnN0IEpTRE9DX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoXG4gICAgL1xcL1xcKlxcKig/IVxcLykvLFxuICAgICdcXFxcKi8nLFxuICAgIHtcbiAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBiZWdpbjogJyg/PUBbQS1aYS16XSspJyxcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnZG9jdGFnJyxcbiAgICAgICAgICAgICAgYmVnaW46ICdAW0EtWmEtel0rJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICAgICAgICAgIGJlZ2luOiAnXFxcXHsnLFxuICAgICAgICAgICAgICBlbmQ6ICdcXFxcfScsXG4gICAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgICAgICAgIGV4Y2x1ZGVCZWdpbjogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6ICd2YXJpYWJsZScsXG4gICAgICAgICAgICAgIGJlZ2luOiBJREVOVF9SRSQxICsgJyg/PVxcXFxzKigtKXwkKScsXG4gICAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGVhdCBzcGFjZXMgKG5vdCBuZXdsaW5lcykgc28gd2UgY2FuIGZpbmRcbiAgICAgICAgICAgIC8vIHR5cGVzIG9yIHZhcmlhYmxlc1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBiZWdpbjogLyg/PVteXFxuXSlcXHMvLFxuICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gICk7XG4gIGNvbnN0IENPTU1FTlQgPSB7XG4gICAgY2xhc3NOYW1lOiBcImNvbW1lbnRcIixcbiAgICB2YXJpYW50czogW1xuICAgICAgSlNET0NfQ09NTUVOVCxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREVcbiAgICBdXG4gIH07XG4gIGNvbnN0IFNVQlNUX0lOVEVSTkFMUyA9IFtcbiAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICBIVE1MX1RFTVBMQVRFLFxuICAgIENTU19URU1QTEFURSxcbiAgICBHUkFQSFFMX1RFTVBMQVRFLFxuICAgIFRFTVBMQVRFX1NUUklORyxcbiAgICAvLyBTa2lwIG51bWJlcnMgd2hlbiB0aGV5IGFyZSBwYXJ0IG9mIGEgdmFyaWFibGUgbmFtZVxuICAgIHsgbWF0Y2g6IC9cXCRcXGQrLyB9LFxuICAgIE5VTUJFUixcbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsOlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8zMjg4XG4gICAgLy8gaGxqcy5SRUdFWFBfTU9ERVxuICBdO1xuICBTVUJTVC5jb250YWlucyA9IFNVQlNUX0lOVEVSTkFMU1xuICAgIC5jb25jYXQoe1xuICAgICAgLy8gd2UgbmVlZCB0byBwYWlyIHVwIHt9IGluc2lkZSBvdXIgc3Vic3QgdG8gcHJldmVudFxuICAgICAgLy8gaXQgZnJvbSBlbmRpbmcgdG9vIGVhcmx5IGJ5IG1hdGNoaW5nIGFub3RoZXIgfVxuICAgICAgYmVnaW46IC9cXHsvLFxuICAgICAgZW5kOiAvXFx9LyxcbiAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgXCJzZWxmXCJcbiAgICAgIF0uY29uY2F0KFNVQlNUX0lOVEVSTkFMUylcbiAgICB9KTtcbiAgY29uc3QgU1VCU1RfQU5EX0NPTU1FTlRTID0gW10uY29uY2F0KENPTU1FTlQsIFNVQlNULmNvbnRhaW5zKTtcbiAgY29uc3QgUEFSQU1TX0NPTlRBSU5TID0gU1VCU1RfQU5EX0NPTU1FTlRTLmNvbmNhdChbXG4gICAgLy8gZWF0IHJlY3Vyc2l2ZSBwYXJlbnMgaW4gc3ViIGV4cHJlc3Npb25zXG4gICAge1xuICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgZW5kOiAvXFwpLyxcbiAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgICAgY29udGFpbnM6IFtcInNlbGZcIl0uY29uY2F0KFNVQlNUX0FORF9DT01NRU5UUylcbiAgICB9XG4gIF0pO1xuICBjb25zdCBQQVJBTVMgPSB7XG4gICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICBjb250YWluczogUEFSQU1TX0NPTlRBSU5TXG4gIH07XG5cbiAgLy8gRVM2IGNsYXNzZXNcbiAgY29uc3QgQ0xBU1NfT1JfRVhURU5EUyA9IHtcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gY2xhc3MgQ2FyIGV4dGVuZHMgdmVoaWNsZVxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9jbGFzcy8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIElERU5UX1JFJDEsXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIC9leHRlbmRzLyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgcmVnZXguY29uY2F0KElERU5UX1JFJDEsIFwiKFwiLCByZWdleC5jb25jYXQoL1xcLi8sIElERU5UX1JFJDEpLCBcIikqXCIpXG4gICAgICAgIF0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5jbGFzc1wiLFxuICAgICAgICAgIDU6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDc6IFwidGl0bGUuY2xhc3MuaW5oZXJpdGVkXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGNsYXNzIENhclxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9jbGFzcy8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIElERU5UX1JFJDFcbiAgICAgICAgXSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgIF1cbiAgfTtcblxuICBjb25zdCBDTEFTU19SRUZFUkVOQ0UgPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOlxuICAgIHJlZ2V4LmVpdGhlcihcbiAgICAgIC8vIEhhcmQgY29kZWQgZXhjZXB0aW9uc1xuICAgICAgL1xcYkpTT04vLFxuICAgICAgLy8gRmxvYXQzMkFycmF5LCBPdXRUXG4gICAgICAvXFxiW0EtWl1bYS16XSsoW0EtWl1bYS16XSp8XFxkKSovLFxuICAgICAgLy8gQ1NTRmFjdG9yeSwgQ1NTRmFjdG9yeVRcbiAgICAgIC9cXGJbQS1aXXsyLH0oW0EtWl1bYS16XSt8XFxkKSsoW0EtWl1bYS16XSopKi8sXG4gICAgICAvLyBGUHMsIEZQc1RcbiAgICAgIC9cXGJbQS1aXXsyLH1bYS16XSsoW0EtWl1bYS16XSt8XFxkKSooW0EtWl1bYS16XSopKi8sXG4gICAgICAvLyBQXG4gICAgICAvLyBzaW5nbGUgbGV0dGVycyBhcmUgbm90IGhpZ2hsaWdodGVkXG4gICAgICAvLyBCTEFIXG4gICAgICAvLyB0aGlzIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFVQUEVSX0NBU0VfQ09OU1RBTlQgaW5zdGVhZFxuICAgICksXG4gICAgY2xhc3NOYW1lOiBcInRpdGxlLmNsYXNzXCIsXG4gICAga2V5d29yZHM6IHtcbiAgICAgIF86IFtcbiAgICAgICAgLy8gc2Ugd2Ugc3RpbGwgZ2V0IHJlbGV2YW5jZSBjcmVkaXQgZm9yIEpTIGxpYnJhcnkgY2xhc3Nlc1xuICAgICAgICAuLi5UWVBFUyxcbiAgICAgICAgLi4uRVJST1JfVFlQRVNcbiAgICAgIF1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgVVNFX1NUUklDVCA9IHtcbiAgICBsYWJlbDogXCJ1c2Vfc3RyaWN0XCIsXG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgcmVsZXZhbmNlOiAxMCxcbiAgICBiZWdpbjogL15cXHMqWydcIl11c2UgKHN0cmljdHxhc20pWydcIl0vXG4gIH07XG5cbiAgY29uc3QgRlVOQ1RJT05fREVGSU5JVElPTiA9IHtcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9mdW5jdGlvbi8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIElERU5UX1JFJDEsXG4gICAgICAgICAgLyg/PVxccypcXCgpL1xuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gYW5vbnltb3VzIGZ1bmN0aW9uXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgL2Z1bmN0aW9uLyxcbiAgICAgICAgICAvXFxzKig/PVxcKCkvXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlLmZ1bmN0aW9uXCJcbiAgICB9LFxuICAgIGxhYmVsOiBcImZ1bmMuZGVmXCIsXG4gICAgY29udGFpbnM6IFsgUEFSQU1TIF0sXG4gICAgaWxsZWdhbDogLyUvXG4gIH07XG5cbiAgY29uc3QgVVBQRVJfQ0FTRV9DT05TVEFOVCA9IHtcbiAgICByZWxldmFuY2U6IDAsXG4gICAgbWF0Y2g6IC9cXGJbQS1aXVtBLVpfMC05XStcXGIvLFxuICAgIGNsYXNzTmFtZTogXCJ2YXJpYWJsZS5jb25zdGFudFwiXG4gIH07XG5cbiAgZnVuY3Rpb24gbm9uZU9mKGxpc3QpIHtcbiAgICByZXR1cm4gcmVnZXguY29uY2F0KFwiKD8hXCIsIGxpc3Quam9pbihcInxcIiksIFwiKVwiKTtcbiAgfVxuXG4gIGNvbnN0IEZVTkNUSU9OX0NBTEwgPSB7XG4gICAgbWF0Y2g6IHJlZ2V4LmNvbmNhdChcbiAgICAgIC9cXGIvLFxuICAgICAgbm9uZU9mKFtcbiAgICAgICAgLi4uQlVJTFRfSU5fR0xPQkFMUyxcbiAgICAgICAgXCJzdXBlclwiLFxuICAgICAgICBcImltcG9ydFwiXG4gICAgICBdKSxcbiAgICAgIElERU5UX1JFJDEsIHJlZ2V4Lmxvb2thaGVhZCgvXFwoLykpLFxuICAgIGNsYXNzTmFtZTogXCJ0aXRsZS5mdW5jdGlvblwiLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IFBST1BFUlRZX0FDQ0VTUyA9IHtcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KC9cXC4vLCByZWdleC5sb29rYWhlYWQoXG4gICAgICByZWdleC5jb25jYXQoSURFTlRfUkUkMSwgLyg/IVswLTlBLVphLXokXyhdKS8pXG4gICAgKSksXG4gICAgZW5kOiBJREVOVF9SRSQxLFxuICAgIGV4Y2x1ZGVCZWdpbjogdHJ1ZSxcbiAgICBrZXl3b3JkczogXCJwcm90b3R5cGVcIixcbiAgICBjbGFzc05hbWU6IFwicHJvcGVydHlcIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBHRVRURVJfT1JfU0VUVEVSID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvZ2V0fHNldC8sXG4gICAgICAvXFxzKy8sXG4gICAgICBJREVOVF9SRSQxLFxuICAgICAgLyg/PVxcKCkvXG4gICAgXSxcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgfSxcbiAgICBjb250YWluczogW1xuICAgICAgeyAvLyBlYXQgdG8gYXZvaWQgZW1wdHkgcGFyYW1zXG4gICAgICAgIGJlZ2luOiAvXFwoXFwpL1xuICAgICAgfSxcbiAgICAgIFBBUkFNU1xuICAgIF1cbiAgfTtcblxuICBjb25zdCBGVU5DX0xFQURfSU5fUkUgPSAnKFxcXFwoJyArXG4gICAgJ1teKCldKihcXFxcKCcgK1xuICAgICdbXigpXSooXFxcXCgnICtcbiAgICAnW14oKV0qJyArXG4gICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAnXFxcXClbXigpXSopKicgK1xuICAgICdcXFxcKXwnICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFICsgJylcXFxccyo9Pic7XG5cbiAgY29uc3QgRlVOQ1RJT05fVkFSSUFCTEUgPSB7XG4gICAgbWF0Y2g6IFtcbiAgICAgIC9jb25zdHx2YXJ8bGV0LywgL1xccysvLFxuICAgICAgSURFTlRfUkUkMSwgL1xccyovLFxuICAgICAgLz1cXHMqLyxcbiAgICAgIC8oYXN5bmNcXHMqKT8vLCAvLyBhc3luYyBpcyBvcHRpb25hbFxuICAgICAgcmVnZXgubG9va2FoZWFkKEZVTkNfTEVBRF9JTl9SRSlcbiAgICBdLFxuICAgIGtleXdvcmRzOiBcImFzeW5jXCIsXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIFBBUkFNU1xuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdKYXZhU2NyaXB0JyxcbiAgICBhbGlhc2VzOiBbJ2pzJywgJ2pzeCcsICdtanMnLCAnY2pzJ10sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTJDEsXG4gICAgLy8gdGhpcyB3aWxsIGJlIGV4dGVuZGVkIGJ5IFR5cGVTY3JpcHRcbiAgICBleHBvcnRzOiB7IFBBUkFNU19DT05UQUlOUywgQ0xBU1NfUkVGRVJFTkNFIH0sXG4gICAgaWxsZWdhbDogLyMoPyFbJF9BLXpdKS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuU0hFQkFORyh7XG4gICAgICAgIGxhYmVsOiBcInNoZWJhbmdcIixcbiAgICAgICAgYmluYXJ5OiBcIm5vZGVcIixcbiAgICAgICAgcmVsZXZhbmNlOiA1XG4gICAgICB9KSxcbiAgICAgIFVTRV9TVFJJQ1QsXG4gICAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgICBobGpzLlFVT1RFX1NUUklOR19NT0RFLFxuICAgICAgSFRNTF9URU1QTEFURSxcbiAgICAgIENTU19URU1QTEFURSxcbiAgICAgIEdSQVBIUUxfVEVNUExBVEUsXG4gICAgICBURU1QTEFURV9TVFJJTkcsXG4gICAgICBDT01NRU5ULFxuICAgICAgLy8gU2tpcCBudW1iZXJzIHdoZW4gdGhleSBhcmUgcGFydCBvZiBhIHZhcmlhYmxlIG5hbWVcbiAgICAgIHsgbWF0Y2g6IC9cXCRcXGQrLyB9LFxuICAgICAgTlVNQkVSLFxuICAgICAgQ0xBU1NfUkVGRVJFTkNFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdhdHRyJyxcbiAgICAgICAgYmVnaW46IElERU5UX1JFJDEgKyByZWdleC5sb29rYWhlYWQoJzonKSxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgRlVOQ1RJT05fVkFSSUFCTEUsXG4gICAgICB7IC8vIFwidmFsdWVcIiBjb250YWluZXJcbiAgICAgICAgYmVnaW46ICcoJyArIGhsanMuUkVfU1RBUlRFUlNfUkUgKyAnfFxcXFxiKGNhc2V8cmV0dXJufHRocm93KVxcXFxiKVxcXFxzKicsXG4gICAgICAgIGtleXdvcmRzOiAncmV0dXJuIHRocm93IGNhc2UnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgQ09NTUVOVCxcbiAgICAgICAgICBobGpzLlJFR0VYUF9NT0RFLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY291bnQgdGhlIHBhcmVucyB0byBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcnJlY3QgYm91bmRpbmcgKCApIGJlZm9yZSB0aGUgPT4uICBUaGVyZSBjb3VsZCBiZSBhbnkgbnVtYmVyIG9mXG4gICAgICAgICAgICAvLyBzdWItZXhwcmVzc2lvbnMgaW5zaWRlIGFsc28gc3Vycm91bmRlZCBieSBwYXJlbnMuXG4gICAgICAgICAgICBiZWdpbjogRlVOQ19MRUFEX0lOX1JFLFxuICAgICAgICAgICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgICAgICAgICBlbmQ6ICdcXFxccyo9PicsXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBiZWdpbjogaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgICAgICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46IC9cXChcXHMqXFwpLyxcbiAgICAgICAgICAgICAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgICAgICAgICAgICAgICAgICBjb250YWluczogUEFSQU1TX0NPTlRBSU5TXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IC8vIGNvdWxkIGJlIGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgcGFyYW1zIHRvIGEgZnVuY3Rpb24gY2FsbFxuICAgICAgICAgICAgYmVnaW46IC8sLyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF0Y2g6IC9cXHMrLyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyAvLyBKU1hcbiAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgIHsgYmVnaW46IEZSQUdNRU5ULmJlZ2luLCBlbmQ6IEZSQUdNRU5ULmVuZCB9LFxuICAgICAgICAgICAgICB7IG1hdGNoOiBYTUxfU0VMRl9DTE9TSU5HIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiZWdpbjogWE1MX1RBRy5iZWdpbixcbiAgICAgICAgICAgICAgICAvLyB3ZSBjYXJlZnVsbHkgY2hlY2sgdGhlIG9wZW5pbmcgdGFnIHRvIHNlZSBpZiBpdCB0cnVseVxuICAgICAgICAgICAgICAgIC8vIGlzIGEgdGFnIGFuZCBub3QgYSBmYWxzZSBwb3NpdGl2ZVxuICAgICAgICAgICAgICAgICdvbjpiZWdpbic6IFhNTF9UQUcuaXNUcnVseU9wZW5pbmdUYWcsXG4gICAgICAgICAgICAgICAgZW5kOiBYTUxfVEFHLmVuZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc3ViTGFuZ3VhZ2U6ICd4bWwnLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJlZ2luOiBYTUxfVEFHLmJlZ2luLFxuICAgICAgICAgICAgICAgIGVuZDogWE1MX1RBRy5lbmQsXG4gICAgICAgICAgICAgICAgc2tpcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250YWluczogWydzZWxmJ11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBGVU5DVElPTl9ERUZJTklUSU9OLFxuICAgICAge1xuICAgICAgICAvLyBwcmV2ZW50IHRoaXMgZnJvbSBnZXR0aW5nIHN3YWxsb3dlZCB1cCBieSBmdW5jdGlvblxuICAgICAgICAvLyBzaW5jZSB0aGV5IGFwcGVhciBcImZ1bmN0aW9uIGxpa2VcIlxuICAgICAgICBiZWdpbktleXdvcmRzOiBcIndoaWxlIGlmIHN3aXRjaCBjYXRjaCBmb3JcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBjb3VudCB0aGUgcGFyZW5zIHRvIG1ha2Ugc3VyZSB3ZSBhY3R1YWxseSBoYXZlIHRoZSBjb3JyZWN0XG4gICAgICAgIC8vIGJvdW5kaW5nICggKS4gIFRoZXJlIGNvdWxkIGJlIGFueSBudW1iZXIgb2Ygc3ViLWV4cHJlc3Npb25zIGluc2lkZVxuICAgICAgICAvLyBhbHNvIHN1cnJvdW5kZWQgYnkgcGFyZW5zLlxuICAgICAgICBiZWdpbjogJ1xcXFxiKD8hZnVuY3Rpb24pJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArXG4gICAgICAgICAgJ1xcXFwoJyArIC8vIGZpcnN0IHBhcmVuc1xuICAgICAgICAgICdbXigpXSooXFxcXCgnICtcbiAgICAgICAgICAgICdbXigpXSooXFxcXCgnICtcbiAgICAgICAgICAgICAgJ1teKCldKicgK1xuICAgICAgICAgICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAgICAgICAnXFxcXClbXigpXSopKicgK1xuICAgICAgICAgICdcXFxcKVxcXFxzKlxcXFx7JywgLy8gZW5kIHBhcmVuc1xuICAgICAgICByZXR1cm5CZWdpbjp0cnVlLFxuICAgICAgICBsYWJlbDogXCJmdW5jLmRlZlwiLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIFBBUkFNUyxcbiAgICAgICAgICBobGpzLmluaGVyaXQoaGxqcy5USVRMRV9NT0RFLCB7IGJlZ2luOiBJREVOVF9SRSQxLCBjbGFzc05hbWU6IFwidGl0bGUuZnVuY3Rpb25cIiB9KVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gY2F0Y2ggLi4uIHNvIGl0IHdvbid0IHRyaWdnZXIgdGhlIHByb3BlcnR5IHJ1bGUgYmVsb3dcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IC9cXC5cXC5cXC4vLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICBQUk9QRVJUWV9BQ0NFU1MsXG4gICAgICAvLyBoYWNrOiBwcmV2ZW50cyBkZXRlY3Rpb24gb2Yga2V5d29yZHMgaW4gc29tZSBjaXJjdW1zdGFuY2VzXG4gICAgICAvLyAua2V5d29yZCgpXG4gICAgICAvLyAka2V5d29yZCA9IHhcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICdcXFxcJCcgKyBJREVOVF9SRSQxLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiBbIC9cXGJjb25zdHJ1Y3Rvcig/PVxccypcXCgpLyBdLFxuICAgICAgICBjbGFzc05hbWU6IHsgMTogXCJ0aXRsZS5mdW5jdGlvblwiIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbIFBBUkFNUyBdXG4gICAgICB9LFxuICAgICAgRlVOQ1RJT05fQ0FMTCxcbiAgICAgIFVQUEVSX0NBU0VfQ09OU1RBTlQsXG4gICAgICBDTEFTU19PUl9FWFRFTkRTLFxuICAgICAgR0VUVEVSX09SX1NFVFRFUixcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IC9cXCRbKC5dLyAvLyByZWxldmFuY2UgYm9vc3RlciBmb3IgYSBwYXR0ZXJuIGNvbW1vbiB0byBKUyBsaWJzOiBgJChzb21ldGhpbmcpYCBhbmQgYCQuc29tZXRoaW5nYFxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgamF2YXNjcmlwdCBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBKU09OXG5EZXNjcmlwdGlvbjogSlNPTiAoSmF2YVNjcmlwdCBPYmplY3QgTm90YXRpb24pIGlzIGEgbGlnaHR3ZWlnaHQgZGF0YS1pbnRlcmNoYW5nZSBmb3JtYXQuXG5BdXRob3I6IEl2YW4gU2FnYWxhZXYgPG1hbmlhY0Bzb2Z0d2FyZW1hbmlhY3Mub3JnPlxuV2Vic2l0ZTogaHR0cDovL3d3dy5qc29uLm9yZ1xuQ2F0ZWdvcnk6IGNvbW1vbiwgcHJvdG9jb2xzLCB3ZWJcbiovXG5cbmZ1bmN0aW9uIGpzb24oaGxqcykge1xuICBjb25zdCBBVFRSSUJVVEUgPSB7XG4gICAgY2xhc3NOYW1lOiAnYXR0cicsXG4gICAgYmVnaW46IC9cIihcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKD89XFxzKjopLyxcbiAgICByZWxldmFuY2U6IDEuMDFcbiAgfTtcbiAgY29uc3QgUFVOQ1RVQVRJT04gPSB7XG4gICAgbWF0Y2g6IC9be31bXFxdLDpdLyxcbiAgICBjbGFzc05hbWU6IFwicHVuY3R1YXRpb25cIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwibnVsbFwiXG4gIF07XG4gIC8vIE5PVEU6IG5vcm1hbGx5IHdlIHdvdWxkIHJlbHkgb24gYGtleXdvcmRzYCBmb3IgdGhpcyBidXQgdXNpbmcgYSBtb2RlIGhlcmUgYWxsb3dzIHVzXG4gIC8vIC0gdG8gdXNlIHRoZSB2ZXJ5IHRpZ2h0IGBpbGxlZ2FsOiBcXFNgIHJ1bGUgbGF0ZXIgdG8gZmxhZyBhbnkgb3RoZXIgY2hhcmFjdGVyXG4gIC8vIC0gYXMgaWxsZWdhbCBpbmRpY2F0aW5nIHRoYXQgZGVzcGl0ZSBsb29raW5nIGxpa2UgSlNPTiB3ZSBkbyBub3QgdHJ1bHkgaGF2ZVxuICAvLyAtIEpTT04gYW5kIHRodXMgaW1wcm92ZSBmYWxzZS1wb3NpdGl2ZWx5IGdyZWF0bHkgc2luY2UgSlNPTiB3aWxsIHRyeSBhbmQgY2xhaW1cbiAgLy8gLSBhbGwgc29ydHMgb2YgSlNPTiBsb29raW5nIHN0dWZmXG4gIGNvbnN0IExJVEVSQUxTX01PREUgPSB7XG4gICAgc2NvcGU6IFwibGl0ZXJhbFwiLFxuICAgIGJlZ2luS2V5d29yZHM6IExJVEVSQUxTLmpvaW4oXCIgXCIpLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0pTT04nLFxuICAgIGtleXdvcmRzOntcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEFUVFJJQlVURSxcbiAgICAgIFBVTkNUVUFUSU9OLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIExJVEVSQUxTX01PREUsXG4gICAgICBobGpzLkNfTlVNQkVSX01PREUsXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgXSxcbiAgICBpbGxlZ2FsOiAnXFxcXFMnXG4gIH07XG59XG5cbmV4cG9ydCB7IGpzb24gYXMgZGVmYXVsdCB9O1xuIiwgIi8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxNS9odG1sL2pscy0zLmh0bWwjamxzLTMuMTBcbnZhciBkZWNpbWFsRGlnaXRzID0gJ1swLTldKF8qWzAtOV0pKic7XG52YXIgZnJhYyA9IGBcXFxcLigke2RlY2ltYWxEaWdpdHN9KWA7XG52YXIgaGV4RGlnaXRzID0gJ1swLTlhLWZBLUZdKF8qWzAtOWEtZkEtRl0pKic7XG52YXIgTlVNRVJJQyA9IHtcbiAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgdmFyaWFudHM6IFtcbiAgICAvLyBEZWNpbWFsRmxvYXRpbmdQb2ludExpdGVyYWxcbiAgICAvLyBpbmNsdWRpbmcgRXhwb25lbnRQYXJ0XG4gICAgeyBiZWdpbjogYChcXFxcYigke2RlY2ltYWxEaWdpdHN9KSgoJHtmcmFjfSl8XFxcXC4pP3woJHtmcmFjfSkpYCArXG4gICAgICBgW2VFXVsrLV0/KCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdP1xcXFxiYCB9LFxuICAgIC8vIGV4Y2x1ZGluZyBFeHBvbmVudFBhcnRcbiAgICB7IGJlZ2luOiBgXFxcXGIoJHtkZWNpbWFsRGlnaXRzfSkoKCR7ZnJhY30pW2ZGZERdP1xcXFxifFxcXFwuKFtmRmREXVxcXFxiKT8pYCB9LFxuICAgIHsgYmVnaW46IGAoJHtmcmFjfSlbZkZkRF0/XFxcXGJgIH0sXG4gICAgeyBiZWdpbjogYFxcXFxiKCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdXFxcXGJgIH0sXG5cbiAgICAvLyBIZXhhZGVjaW1hbEZsb2F0aW5nUG9pbnRMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oKCR7aGV4RGlnaXRzfSlcXFxcLj98KCR7aGV4RGlnaXRzfSk/XFxcXC4oJHtoZXhEaWdpdHN9KSlgICtcbiAgICAgIGBbcFBdWystXT8oJHtkZWNpbWFsRGlnaXRzfSlbZkZkRF0/XFxcXGJgIH0sXG5cbiAgICAvLyBEZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIoMHxbMS05XShfKlswLTldKSopW2xMXT9cXFxcYicgfSxcblxuICAgIC8vIEhleEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oJHtoZXhEaWdpdHN9KVtsTF0/XFxcXGJgIH0sXG5cbiAgICAvLyBPY3RhbEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogJ1xcXFxiMChfKlswLTddKSpbbExdP1xcXFxiJyB9LFxuXG4gICAgLy8gQmluYXJ5SW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIwW2JCXVswMV0oXypbMDFdKSpbbExdP1xcXFxiJyB9LFxuICBdLFxuICByZWxldmFuY2U6IDBcbn07XG5cbi8qXG4gTGFuZ3VhZ2U6IEtvdGxpblxuIERlc2NyaXB0aW9uOiBLb3RsaW4gaXMgYW4gT1NTIHN0YXRpY2FsbHkgdHlwZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhhdCB0YXJnZXRzIHRoZSBKVk0sIEFuZHJvaWQsIEphdmFTY3JpcHQgYW5kIE5hdGl2ZS5cbiBBdXRob3I6IFNlcmdleSBNYXNoa292IDxjeTZlckduMG1AZ21haWwuY29tPlxuIFdlYnNpdGU6IGh0dHBzOi8va290bGlubGFuZy5vcmdcbiBDYXRlZ29yeTogY29tbW9uXG4gKi9cblxuZnVuY3Rpb24ga290bGluKGhsanMpIHtcbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAga2V5d29yZDpcbiAgICAgICdhYnN0cmFjdCBhcyB2YWwgdmFyIHZhcmFyZyBnZXQgc2V0IGNsYXNzIG9iamVjdCBvcGVuIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBub2lubGluZSAnXG4gICAgICArICdjcm9zc2lubGluZSBkeW5hbWljIGZpbmFsIGVudW0gaWYgZWxzZSBkbyB3aGlsZSBmb3Igd2hlbiB0aHJvdyB0cnkgY2F0Y2ggZmluYWxseSAnXG4gICAgICArICdpbXBvcnQgcGFja2FnZSBpcyBpbiBmdW4gb3ZlcnJpZGUgY29tcGFuaW9uIHJlaWZpZWQgaW5saW5lIGxhdGVpbml0IGluaXQgJ1xuICAgICAgKyAnaW50ZXJmYWNlIGFubm90YXRpb24gZGF0YSBzZWFsZWQgaW50ZXJuYWwgaW5maXggb3BlcmF0b3Igb3V0IGJ5IGNvbnN0cnVjdG9yIHN1cGVyICdcbiAgICAgICsgJ3RhaWxyZWMgd2hlcmUgY29uc3QgaW5uZXIgc3VzcGVuZCB0eXBlYWxpYXMgZXh0ZXJuYWwgZXhwZWN0IGFjdHVhbCcsXG4gICAgYnVpbHRfaW46XG4gICAgICAnQnl0ZSBTaG9ydCBDaGFyIEludCBMb25nIEJvb2xlYW4gRmxvYXQgRG91YmxlIFZvaWQgVW5pdCBOb3RoaW5nJyxcbiAgICBsaXRlcmFsOlxuICAgICAgJ3RydWUgZmFsc2UgbnVsbCdcbiAgfTtcbiAgY29uc3QgS0VZV09SRFNfV0lUSF9MQUJFTCA9IHtcbiAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICBiZWdpbjogL1xcYihicmVha3xjb250aW51ZXxyZXR1cm58dGhpcylcXGIvLFxuICAgIHN0YXJ0czogeyBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgICBiZWdpbjogL0BcXHcrL1xuICAgICAgfVxuICAgIF0gfVxuICB9O1xuICBjb25zdCBMQUJFTCA9IHtcbiAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgIGJlZ2luOiBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgKyAnQCdcbiAgfTtcblxuICAvLyBmb3Igc3RyaW5nIHRlbXBsYXRlc1xuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46IC9cXCRcXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFsgaGxqcy5DX05VTUJFUl9NT0RFIF1cbiAgfTtcbiAgY29uc3QgVkFSSUFCTEUgPSB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIGJlZ2luOiAnXFxcXCQnICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gIH07XG4gIGNvbnN0IFNUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnXCJcIlwiJyxcbiAgICAgICAgZW5kOiAnXCJcIlwiKD89W15cIl0pJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBWQVJJQUJMRSxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gQ2FuJ3QgdXNlIGJ1aWx0LWluIG1vZGVzIGVhc2lseSwgYXMgd2Ugd2FudCB0byB1c2UgU1RSSU5HIGluIHRoZSBtZXRhXG4gICAgICAvLyBjb250ZXh0IGFzICdtZXRhLXN0cmluZycgYW5kIHRoZXJlJ3Mgbm8gc3ludGF4IHRvIHJlbW92ZSBleHBsaWNpdGx5IHNldFxuICAgICAgLy8gY2xhc3NOYW1lcyBpbiBidWlsdC1pbiBtb2Rlcy5cbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdcXCcnLFxuICAgICAgICBlbmQ6ICdcXCcnLFxuICAgICAgICBpbGxlZ2FsOiAvXFxuLyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnXCInLFxuICAgICAgICBlbmQ6ICdcIicsXG4gICAgICAgIGlsbGVnYWw6IC9cXG4vLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgICAgICBWQVJJQUJMRSxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBTVUJTVC5jb250YWlucy5wdXNoKFNUUklORyk7XG5cbiAgY29uc3QgQU5OT1RBVElPTl9VU0VfU0lURSA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBiZWdpbjogJ0AoPzpmaWxlfHByb3BlcnR5fGZpZWxkfGdldHxzZXR8cmVjZWl2ZXJ8cGFyYW18c2V0cGFyYW18ZGVsZWdhdGUpXFxcXHMqOig/OlxcXFxzKicgKyBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgKyAnKT8nXG4gIH07XG4gIGNvbnN0IEFOTk9UQVRJT04gPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgYmVnaW46ICdAJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5pbmhlcml0KFNUUklORywgeyBjbGFzc05hbWU6ICdzdHJpbmcnIH0pLFxuICAgICAgICAgIFwic2VsZlwiXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy9kb2NzL3JlZmVyZW5jZS93aGF0c25ldzExLmh0bWwjdW5kZXJzY29yZXMtaW4tbnVtZXJpYy1saXRlcmFsc1xuICAvLyBBY2NvcmRpbmcgdG8gdGhlIGRvYyBhYm92ZSwgdGhlIG51bWJlciBtb2RlIG9mIGtvdGxpbiBpcyB0aGUgc2FtZSBhcyBqYXZhIDgsXG4gIC8vIHNvIHRoZSBjb2RlIGJlbG93IGlzIGNvcGllZCBmcm9tIGphdmEuanNcbiAgY29uc3QgS09UTElOX05VTUJFUl9NT0RFID0gTlVNRVJJQztcbiAgY29uc3QgS09UTElOX05FU1RFRF9DT01NRU5UID0gaGxqcy5DT01NRU5UKFxuICAgICcvXFxcXConLCAnXFxcXCovJyxcbiAgICB7IGNvbnRhaW5zOiBbIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUgXSB9XG4gICk7XG4gIGNvbnN0IEtPVExJTl9QQVJFTl9UWVBFID0geyB2YXJpYW50czogW1xuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRVxuICAgIH0sXG4gICAge1xuICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgZW5kOiAvXFwpLyxcbiAgICAgIGNvbnRhaW5zOiBbXSAvLyBkZWZpbmVkIGxhdGVyXG4gICAgfVxuICBdIH07XG4gIGNvbnN0IEtPVExJTl9QQVJFTl9UWVBFMiA9IEtPVExJTl9QQVJFTl9UWVBFO1xuICBLT1RMSU5fUEFSRU5fVFlQRTIudmFyaWFudHNbMV0uY29udGFpbnMgPSBbIEtPVExJTl9QQVJFTl9UWVBFIF07XG4gIEtPVExJTl9QQVJFTl9UWVBFLnZhcmlhbnRzWzFdLmNvbnRhaW5zID0gWyBLT1RMSU5fUEFSRU5fVFlQRTIgXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdLb3RsaW4nLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdrdCcsXG4gICAgICAna3RzJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNPTU1FTlQoXG4gICAgICAgICcvXFxcXCpcXFxcKicsXG4gICAgICAgICdcXFxcKi8nLFxuICAgICAgICB7XG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICAgICAgICAgIGJlZ2luOiAnQFtBLVphLXpdKydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBLT1RMSU5fTkVTVEVEX0NPTU1FTlQsXG4gICAgICBLRVlXT1JEU19XSVRIX0xBQkVMLFxuICAgICAgTEFCRUwsXG4gICAgICBBTk5PVEFUSU9OX1VTRV9TSVRFLFxuICAgICAgQU5OT1RBVElPTixcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnZnVuY3Rpb24nLFxuICAgICAgICBiZWdpbktleXdvcmRzOiAnZnVuJyxcbiAgICAgICAgZW5kOiAnWyhdfCQnLFxuICAgICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICByZWxldmFuY2U6IDUsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICdcXFxccypcXFxcKCcsXG4gICAgICAgICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbIGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFIF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgICAgICAgICAgYmVnaW46IC88LyxcbiAgICAgICAgICAgIGVuZDogLz4vLFxuICAgICAgICAgICAga2V5d29yZHM6ICdyZWlmaWVkJyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICBlbmRzUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJlZ2luOiAvOi8sXG4gICAgICAgICAgICAgICAgZW5kOiAvWz0sXFwvXS8sXG4gICAgICAgICAgICAgICAgZW5kc1dpdGhQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgICAgIEtPVExJTl9QQVJFTl9UWVBFLFxuICAgICAgICAgICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgICAgICAgICAgS09UTElOX05FU1RFRF9DT01NRU5UXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgICAgICBLT1RMSU5fTkVTVEVEX0NPTU1FTlQsXG4gICAgICAgICAgICAgIEFOTk9UQVRJT05fVVNFX1NJVEUsXG4gICAgICAgICAgICAgIEFOTk9UQVRJT04sXG4gICAgICAgICAgICAgIFNUUklORyxcbiAgICAgICAgICAgICAgaGxqcy5DX05VTUJFUl9NT0RFXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBLT1RMSU5fTkVTVEVEX0NPTU1FTlRcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvY2xhc3N8aW50ZXJmYWNlfHRyYWl0LyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGJlZ2luU2NvcGU6IHtcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfSxcbiAgICAgICAga2V5d29yZHM6ICdjbGFzcyBpbnRlcmZhY2UgdHJhaXQnLFxuICAgICAgICBlbmQ6IC9bOlxceyhdfCQvLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBpbGxlZ2FsOiAnZXh0ZW5kcyBpbXBsZW1lbnRzJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7IGJlZ2luS2V5d29yZHM6ICdwdWJsaWMgcHJvdGVjdGVkIGludGVybmFsIHByaXZhdGUgY29uc3RydWN0b3InIH0sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX1RJVExFX01PREUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICAgICAgICBiZWdpbjogLzwvLFxuICAgICAgICAgICAgZW5kOiAvPi8sXG4gICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgICAgICAgIGJlZ2luOiAvWyw6XVxccyovLFxuICAgICAgICAgICAgZW5kOiAvWzxcXCgsKXtcXHNdfCQvLFxuICAgICAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgcmV0dXJuRW5kOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBBTk5PVEFUSU9OX1VTRV9TSVRFLFxuICAgICAgICAgIEFOTk9UQVRJT05cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIFNUUklORyxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiBcIl4jIS91c3IvYmluL2VudlwiLFxuICAgICAgICBlbmQ6ICckJyxcbiAgICAgICAgaWxsZWdhbDogJ1xcbidcbiAgICAgIH0sXG4gICAgICBLT1RMSU5fTlVNQkVSX01PREVcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IGtvdGxpbiBhcyBkZWZhdWx0IH07XG4iLCAiY29uc3QgTU9ERVMgPSAoaGxqcykgPT4ge1xuICByZXR1cm4ge1xuICAgIElNUE9SVEFOVDoge1xuICAgICAgc2NvcGU6ICdtZXRhJyxcbiAgICAgIGJlZ2luOiAnIWltcG9ydGFudCdcbiAgICB9LFxuICAgIEJMT0NLX0NPTU1FTlQ6IGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgSEVYQ09MT1I6IHtcbiAgICAgIHNjb3BlOiAnbnVtYmVyJyxcbiAgICAgIGJlZ2luOiAvIygoWzAtOWEtZkEtRl17Myw0fSl8KChbMC05YS1mQS1GXXsyfSl7Myw0fSkpXFxiL1xuICAgIH0sXG4gICAgRlVOQ1RJT05fRElTUEFUQ0g6IHtcbiAgICAgIGNsYXNzTmFtZTogXCJidWlsdF9pblwiLFxuICAgICAgYmVnaW46IC9bXFx3LV0rKD89XFwoKS9cbiAgICB9LFxuICAgIEFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ3NlbGVjdG9yLWF0dHInLFxuICAgICAgYmVnaW46IC9cXFsvLFxuICAgICAgZW5kOiAvXFxdLyxcbiAgICAgIGlsbGVnYWw6ICckJyxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICAgICAgXVxuICAgIH0sXG4gICAgQ1NTX05VTUJFUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogaGxqcy5OVU1CRVJfUkUgKyAnKCcgK1xuICAgICAgICAnJXxlbXxleHxjaHxyZW0nICtcbiAgICAgICAgJ3x2d3x2aHx2bWlufHZtYXgnICtcbiAgICAgICAgJ3xjbXxtbXxpbnxwdHxwY3xweCcgK1xuICAgICAgICAnfGRlZ3xncmFkfHJhZHx0dXJuJyArXG4gICAgICAgICd8c3xtcycgK1xuICAgICAgICAnfEh6fGtIeicgK1xuICAgICAgICAnfGRwaXxkcGNtfGRwcHgnICtcbiAgICAgICAgJyk/JyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgQ1NTX1ZBUklBQkxFOiB7XG4gICAgICBjbGFzc05hbWU6IFwiYXR0clwiLFxuICAgICAgYmVnaW46IC8tLVtBLVphLXpdW0EtWmEtejAtOV8tXSovXG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgVEFHUyA9IFtcbiAgJ2EnLFxuICAnYWJicicsXG4gICdhZGRyZXNzJyxcbiAgJ2FydGljbGUnLFxuICAnYXNpZGUnLFxuICAnYXVkaW8nLFxuICAnYicsXG4gICdibG9ja3F1b3RlJyxcbiAgJ2JvZHknLFxuICAnYnV0dG9uJyxcbiAgJ2NhbnZhcycsXG4gICdjYXB0aW9uJyxcbiAgJ2NpdGUnLFxuICAnY29kZScsXG4gICdkZCcsXG4gICdkZWwnLFxuICAnZGV0YWlscycsXG4gICdkZm4nLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2VtJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWRlcicsXG4gICdoZ3JvdXAnLFxuICAnaHRtbCcsXG4gICdpJyxcbiAgJ2lmcmFtZScsXG4gICdpbWcnLFxuICAnaW5wdXQnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdsYWJlbCcsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbWFpbicsXG4gICdtYXJrJyxcbiAgJ21lbnUnLFxuICAnbmF2JyxcbiAgJ29iamVjdCcsXG4gICdvbCcsXG4gICdwJyxcbiAgJ3EnLFxuICAncXVvdGUnLFxuICAnc2FtcCcsXG4gICdzZWN0aW9uJyxcbiAgJ3NwYW4nLFxuICAnc3Ryb25nJyxcbiAgJ3N1bW1hcnknLFxuICAnc3VwJyxcbiAgJ3RhYmxlJyxcbiAgJ3Rib2R5JyxcbiAgJ3RkJyxcbiAgJ3RleHRhcmVhJyxcbiAgJ3Rmb290JyxcbiAgJ3RoJyxcbiAgJ3RoZWFkJyxcbiAgJ3RpbWUnLFxuICAndHInLFxuICAndWwnLFxuICAndmFyJyxcbiAgJ3ZpZGVvJ1xuXTtcblxuY29uc3QgTUVESUFfRkVBVFVSRVMgPSBbXG4gICdhbnktaG92ZXInLFxuICAnYW55LXBvaW50ZXInLFxuICAnYXNwZWN0LXJhdGlvJyxcbiAgJ2NvbG9yJyxcbiAgJ2NvbG9yLWdhbXV0JyxcbiAgJ2NvbG9yLWluZGV4JyxcbiAgJ2RldmljZS1hc3BlY3QtcmF0aW8nLFxuICAnZGV2aWNlLWhlaWdodCcsXG4gICdkZXZpY2Utd2lkdGgnLFxuICAnZGlzcGxheS1tb2RlJyxcbiAgJ2ZvcmNlZC1jb2xvcnMnLFxuICAnZ3JpZCcsXG4gICdoZWlnaHQnLFxuICAnaG92ZXInLFxuICAnaW52ZXJ0ZWQtY29sb3JzJyxcbiAgJ21vbm9jaHJvbWUnLFxuICAnb3JpZW50YXRpb24nLFxuICAnb3ZlcmZsb3ctYmxvY2snLFxuICAnb3ZlcmZsb3ctaW5saW5lJyxcbiAgJ3BvaW50ZXInLFxuICAncHJlZmVycy1jb2xvci1zY2hlbWUnLFxuICAncHJlZmVycy1jb250cmFzdCcsXG4gICdwcmVmZXJzLXJlZHVjZWQtbW90aW9uJyxcbiAgJ3ByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3knLFxuICAncmVzb2x1dGlvbicsXG4gICdzY2FuJyxcbiAgJ3NjcmlwdGluZycsXG4gICd1cGRhdGUnLFxuICAnd2lkdGgnLFxuICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uP1xuICAnbWluLXdpZHRoJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21heC1oZWlnaHQnXG5dO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvUHNldWRvLWNsYXNzZXNcbmNvbnN0IFBTRVVET19DTEFTU0VTID0gW1xuICAnYWN0aXZlJyxcbiAgJ2FueS1saW5rJyxcbiAgJ2JsYW5rJyxcbiAgJ2NoZWNrZWQnLFxuICAnY3VycmVudCcsXG4gICdkZWZhdWx0JyxcbiAgJ2RlZmluZWQnLFxuICAnZGlyJywgLy8gZGlyKClcbiAgJ2Rpc2FibGVkJyxcbiAgJ2Ryb3AnLFxuICAnZW1wdHknLFxuICAnZW5hYmxlZCcsXG4gICdmaXJzdCcsXG4gICdmaXJzdC1jaGlsZCcsXG4gICdmaXJzdC1vZi10eXBlJyxcbiAgJ2Z1bGxzY3JlZW4nLFxuICAnZnV0dXJlJyxcbiAgJ2ZvY3VzJyxcbiAgJ2ZvY3VzLXZpc2libGUnLFxuICAnZm9jdXMtd2l0aGluJyxcbiAgJ2hhcycsIC8vIGhhcygpXG4gICdob3N0JywgLy8gaG9zdCBvciBob3N0KClcbiAgJ2hvc3QtY29udGV4dCcsIC8vIGhvc3QtY29udGV4dCgpXG4gICdob3ZlcicsXG4gICdpbmRldGVybWluYXRlJyxcbiAgJ2luLXJhbmdlJyxcbiAgJ2ludmFsaWQnLFxuICAnaXMnLCAvLyBpcygpXG4gICdsYW5nJywgLy8gbGFuZygpXG4gICdsYXN0LWNoaWxkJyxcbiAgJ2xhc3Qtb2YtdHlwZScsXG4gICdsZWZ0JyxcbiAgJ2xpbmsnLFxuICAnbG9jYWwtbGluaycsXG4gICdub3QnLCAvLyBub3QoKVxuICAnbnRoLWNoaWxkJywgLy8gbnRoLWNoaWxkKClcbiAgJ250aC1jb2wnLCAvLyBudGgtY29sKClcbiAgJ250aC1sYXN0LWNoaWxkJywgLy8gbnRoLWxhc3QtY2hpbGQoKVxuICAnbnRoLWxhc3QtY29sJywgLy8gbnRoLWxhc3QtY29sKClcbiAgJ250aC1sYXN0LW9mLXR5cGUnLCAvL250aC1sYXN0LW9mLXR5cGUoKVxuICAnbnRoLW9mLXR5cGUnLCAvL250aC1vZi10eXBlKClcbiAgJ29ubHktY2hpbGQnLFxuICAnb25seS1vZi10eXBlJyxcbiAgJ29wdGlvbmFsJyxcbiAgJ291dC1vZi1yYW5nZScsXG4gICdwYXN0JyxcbiAgJ3BsYWNlaG9sZGVyLXNob3duJyxcbiAgJ3JlYWQtb25seScsXG4gICdyZWFkLXdyaXRlJyxcbiAgJ3JlcXVpcmVkJyxcbiAgJ3JpZ2h0JyxcbiAgJ3Jvb3QnLFxuICAnc2NvcGUnLFxuICAndGFyZ2V0JyxcbiAgJ3RhcmdldC13aXRoaW4nLFxuICAndXNlci1pbnZhbGlkJyxcbiAgJ3ZhbGlkJyxcbiAgJ3Zpc2l0ZWQnLFxuICAnd2hlcmUnIC8vIHdoZXJlKClcbl07XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Qc2V1ZG8tZWxlbWVudHNcbmNvbnN0IFBTRVVET19FTEVNRU5UUyA9IFtcbiAgJ2FmdGVyJyxcbiAgJ2JhY2tkcm9wJyxcbiAgJ2JlZm9yZScsXG4gICdjdWUnLFxuICAnY3VlLXJlZ2lvbicsXG4gICdmaXJzdC1sZXR0ZXInLFxuICAnZmlyc3QtbGluZScsXG4gICdncmFtbWFyLWVycm9yJyxcbiAgJ21hcmtlcicsXG4gICdwYXJ0JyxcbiAgJ3BsYWNlaG9sZGVyJyxcbiAgJ3NlbGVjdGlvbicsXG4gICdzbG90dGVkJyxcbiAgJ3NwZWxsaW5nLWVycm9yJ1xuXTtcblxuY29uc3QgQVRUUklCVVRFUyA9IFtcbiAgJ2FsaWduLWNvbnRlbnQnLFxuICAnYWxpZ24taXRlbXMnLFxuICAnYWxpZ24tc2VsZicsXG4gICdhbGwnLFxuICAnYW5pbWF0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kZWxheScsXG4gICdhbmltYXRpb24tZGlyZWN0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kdXJhdGlvbicsXG4gICdhbmltYXRpb24tZmlsbC1tb2RlJyxcbiAgJ2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQnLFxuICAnYW5pbWF0aW9uLW5hbWUnLFxuICAnYW5pbWF0aW9uLXBsYXktc3RhdGUnLFxuICAnYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbicsXG4gICdiYWNrZmFjZS12aXNpYmlsaXR5JyxcbiAgJ2JhY2tncm91bmQnLFxuICAnYmFja2dyb3VuZC1hdHRhY2htZW50JyxcbiAgJ2JhY2tncm91bmQtYmxlbmQtbW9kZScsXG4gICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICdiYWNrZ3JvdW5kLWltYWdlJyxcbiAgJ2JhY2tncm91bmQtb3JpZ2luJyxcbiAgJ2JhY2tncm91bmQtcG9zaXRpb24nLFxuICAnYmFja2dyb3VuZC1yZXBlYXQnLFxuICAnYmFja2dyb3VuZC1zaXplJyxcbiAgJ2Jsb2NrLXNpemUnLFxuICAnYm9yZGVyJyxcbiAgJ2JvcmRlci1ibG9jaycsXG4gICdib3JkZXItYmxvY2stY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLWVuZCcsXG4gICdib3JkZXItYmxvY2stZW5kLWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWJsb2NrLWVuZC13aWR0aCcsXG4gICdib3JkZXItYmxvY2stc3RhcnQnLFxuICAnYm9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydC1zdHlsZScsXG4gICdib3JkZXItYmxvY2stc3RhcnQtd2lkdGgnLFxuICAnYm9yZGVyLWJsb2NrLXN0eWxlJyxcbiAgJ2JvcmRlci1ibG9jay13aWR0aCcsXG4gICdib3JkZXItYm90dG9tJyxcbiAgJ2JvcmRlci1ib3R0b20tY29sb3InLFxuICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXN0eWxlJyxcbiAgJ2JvcmRlci1ib3R0b20td2lkdGgnLFxuICAnYm9yZGVyLWNvbGxhcHNlJyxcbiAgJ2JvcmRlci1jb2xvcicsXG4gICdib3JkZXItaW1hZ2UnLFxuICAnYm9yZGVyLWltYWdlLW91dHNldCcsXG4gICdib3JkZXItaW1hZ2UtcmVwZWF0JyxcbiAgJ2JvcmRlci1pbWFnZS1zbGljZScsXG4gICdib3JkZXItaW1hZ2Utc291cmNlJyxcbiAgJ2JvcmRlci1pbWFnZS13aWR0aCcsXG4gICdib3JkZXItaW5saW5lJyxcbiAgJ2JvcmRlci1pbmxpbmUtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtd2lkdGgnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydCcsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1pbmxpbmUtc3RhcnQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydC13aWR0aCcsXG4gICdib3JkZXItaW5saW5lLXN0eWxlJyxcbiAgJ2JvcmRlci1pbmxpbmUtd2lkdGgnLFxuICAnYm9yZGVyLWxlZnQnLFxuICAnYm9yZGVyLWxlZnQtY29sb3InLFxuICAnYm9yZGVyLWxlZnQtc3R5bGUnLFxuICAnYm9yZGVyLWxlZnQtd2lkdGgnLFxuICAnYm9yZGVyLXJhZGl1cycsXG4gICdib3JkZXItcmlnaHQnLFxuICAnYm9yZGVyLXJpZ2h0LWNvbG9yJyxcbiAgJ2JvcmRlci1yaWdodC1zdHlsZScsXG4gICdib3JkZXItcmlnaHQtd2lkdGgnLFxuICAnYm9yZGVyLXNwYWNpbmcnLFxuICAnYm9yZGVyLXN0eWxlJyxcbiAgJ2JvcmRlci10b3AnLFxuICAnYm9yZGVyLXRvcC1jb2xvcicsXG4gICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3Atc3R5bGUnLFxuICAnYm9yZGVyLXRvcC13aWR0aCcsXG4gICdib3JkZXItd2lkdGgnLFxuICAnYm90dG9tJyxcbiAgJ2JveC1kZWNvcmF0aW9uLWJyZWFrJyxcbiAgJ2JveC1zaGFkb3cnLFxuICAnYm94LXNpemluZycsXG4gICdicmVhay1hZnRlcicsXG4gICdicmVhay1iZWZvcmUnLFxuICAnYnJlYWstaW5zaWRlJyxcbiAgJ2NhcHRpb24tc2lkZScsXG4gICdjYXJldC1jb2xvcicsXG4gICdjbGVhcicsXG4gICdjbGlwJyxcbiAgJ2NsaXAtcGF0aCcsXG4gICdjbGlwLXJ1bGUnLFxuICAnY29sb3InLFxuICAnY29sdW1uLWNvdW50JyxcbiAgJ2NvbHVtbi1maWxsJyxcbiAgJ2NvbHVtbi1nYXAnLFxuICAnY29sdW1uLXJ1bGUnLFxuICAnY29sdW1uLXJ1bGUtY29sb3InLFxuICAnY29sdW1uLXJ1bGUtc3R5bGUnLFxuICAnY29sdW1uLXJ1bGUtd2lkdGgnLFxuICAnY29sdW1uLXNwYW4nLFxuICAnY29sdW1uLXdpZHRoJyxcbiAgJ2NvbHVtbnMnLFxuICAnY29udGFpbicsXG4gICdjb250ZW50JyxcbiAgJ2NvbnRlbnQtdmlzaWJpbGl0eScsXG4gICdjb3VudGVyLWluY3JlbWVudCcsXG4gICdjb3VudGVyLXJlc2V0JyxcbiAgJ2N1ZScsXG4gICdjdWUtYWZ0ZXInLFxuICAnY3VlLWJlZm9yZScsXG4gICdjdXJzb3InLFxuICAnZGlyZWN0aW9uJyxcbiAgJ2Rpc3BsYXknLFxuICAnZW1wdHktY2VsbHMnLFxuICAnZmlsdGVyJyxcbiAgJ2ZsZXgnLFxuICAnZmxleC1iYXNpcycsXG4gICdmbGV4LWRpcmVjdGlvbicsXG4gICdmbGV4LWZsb3cnLFxuICAnZmxleC1ncm93JyxcbiAgJ2ZsZXgtc2hyaW5rJyxcbiAgJ2ZsZXgtd3JhcCcsXG4gICdmbG9hdCcsXG4gICdmbG93JyxcbiAgJ2ZvbnQnLFxuICAnZm9udC1kaXNwbGF5JyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2ZvbnQtZmVhdHVyZS1zZXR0aW5ncycsXG4gICdmb250LWtlcm5pbmcnLFxuICAnZm9udC1sYW5ndWFnZS1vdmVycmlkZScsXG4gICdmb250LXNpemUnLFxuICAnZm9udC1zaXplLWFkanVzdCcsXG4gICdmb250LXNtb290aGluZycsXG4gICdmb250LXN0cmV0Y2gnLFxuICAnZm9udC1zdHlsZScsXG4gICdmb250LXN5bnRoZXNpcycsXG4gICdmb250LXZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50LWNhcHMnLFxuICAnZm9udC12YXJpYW50LWVhc3QtYXNpYW4nLFxuICAnZm9udC12YXJpYW50LWxpZ2F0dXJlcycsXG4gICdmb250LXZhcmlhbnQtbnVtZXJpYycsXG4gICdmb250LXZhcmlhbnQtcG9zaXRpb24nLFxuICAnZm9udC12YXJpYXRpb24tc2V0dGluZ3MnLFxuICAnZm9udC13ZWlnaHQnLFxuICAnZ2FwJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJyxcbiAgJ2dyaWQnLFxuICAnZ3JpZC1hcmVhJyxcbiAgJ2dyaWQtYXV0by1jb2x1bW5zJyxcbiAgJ2dyaWQtYXV0by1mbG93JyxcbiAgJ2dyaWQtYXV0by1yb3dzJyxcbiAgJ2dyaWQtY29sdW1uJyxcbiAgJ2dyaWQtY29sdW1uLWVuZCcsXG4gICdncmlkLWNvbHVtbi1zdGFydCcsXG4gICdncmlkLWdhcCcsXG4gICdncmlkLXJvdycsXG4gICdncmlkLXJvdy1lbmQnLFxuICAnZ3JpZC1yb3ctc3RhcnQnLFxuICAnZ3JpZC10ZW1wbGF0ZScsXG4gICdncmlkLXRlbXBsYXRlLWFyZWFzJyxcbiAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsXG4gICdncmlkLXRlbXBsYXRlLXJvd3MnLFxuICAnaGFuZ2luZy1wdW5jdHVhdGlvbicsXG4gICdoZWlnaHQnLFxuICAnaHlwaGVucycsXG4gICdpY29uJyxcbiAgJ2ltYWdlLW9yaWVudGF0aW9uJyxcbiAgJ2ltYWdlLXJlbmRlcmluZycsXG4gICdpbWFnZS1yZXNvbHV0aW9uJyxcbiAgJ2ltZS1tb2RlJyxcbiAgJ2lubGluZS1zaXplJyxcbiAgJ2lzb2xhdGlvbicsXG4gICdqdXN0aWZ5LWNvbnRlbnQnLFxuICAnbGVmdCcsXG4gICdsZXR0ZXItc3BhY2luZycsXG4gICdsaW5lLWJyZWFrJyxcbiAgJ2xpbmUtaGVpZ2h0JyxcbiAgJ2xpc3Qtc3R5bGUnLFxuICAnbGlzdC1zdHlsZS1pbWFnZScsXG4gICdsaXN0LXN0eWxlLXBvc2l0aW9uJyxcbiAgJ2xpc3Qtc3R5bGUtdHlwZScsXG4gICdtYXJnaW4nLFxuICAnbWFyZ2luLWJsb2NrJyxcbiAgJ21hcmdpbi1ibG9jay1lbmQnLFxuICAnbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ21hcmdpbi1ib3R0b20nLFxuICAnbWFyZ2luLWlubGluZScsXG4gICdtYXJnaW4taW5saW5lLWVuZCcsXG4gICdtYXJnaW4taW5saW5lLXN0YXJ0JyxcbiAgJ21hcmdpbi1sZWZ0JyxcbiAgJ21hcmdpbi1yaWdodCcsXG4gICdtYXJnaW4tdG9wJyxcbiAgJ21hcmtzJyxcbiAgJ21hc2snLFxuICAnbWFzay1ib3JkZXInLFxuICAnbWFzay1ib3JkZXItbW9kZScsXG4gICdtYXNrLWJvcmRlci1vdXRzZXQnLFxuICAnbWFzay1ib3JkZXItcmVwZWF0JyxcbiAgJ21hc2stYm9yZGVyLXNsaWNlJyxcbiAgJ21hc2stYm9yZGVyLXNvdXJjZScsXG4gICdtYXNrLWJvcmRlci13aWR0aCcsXG4gICdtYXNrLWNsaXAnLFxuICAnbWFzay1jb21wb3NpdGUnLFxuICAnbWFzay1pbWFnZScsXG4gICdtYXNrLW1vZGUnLFxuICAnbWFzay1vcmlnaW4nLFxuICAnbWFzay1wb3NpdGlvbicsXG4gICdtYXNrLXJlcGVhdCcsXG4gICdtYXNrLXNpemUnLFxuICAnbWFzay10eXBlJyxcbiAgJ21heC1ibG9jay1zaXplJyxcbiAgJ21heC1oZWlnaHQnLFxuICAnbWF4LWlubGluZS1zaXplJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4tYmxvY2stc2l6ZScsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21pbi1pbmxpbmUtc2l6ZScsXG4gICdtaW4td2lkdGgnLFxuICAnbWl4LWJsZW5kLW1vZGUnLFxuICAnbmF2LWRvd24nLFxuICAnbmF2LWluZGV4JyxcbiAgJ25hdi1sZWZ0JyxcbiAgJ25hdi1yaWdodCcsXG4gICduYXYtdXAnLFxuICAnbm9uZScsXG4gICdub3JtYWwnLFxuICAnb2JqZWN0LWZpdCcsXG4gICdvYmplY3QtcG9zaXRpb24nLFxuICAnb3BhY2l0eScsXG4gICdvcmRlcicsXG4gICdvcnBoYW5zJyxcbiAgJ291dGxpbmUnLFxuICAnb3V0bGluZS1jb2xvcicsXG4gICdvdXRsaW5lLW9mZnNldCcsXG4gICdvdXRsaW5lLXN0eWxlJyxcbiAgJ291dGxpbmUtd2lkdGgnLFxuICAnb3ZlcmZsb3cnLFxuICAnb3ZlcmZsb3ctd3JhcCcsXG4gICdvdmVyZmxvdy14JyxcbiAgJ292ZXJmbG93LXknLFxuICAncGFkZGluZycsXG4gICdwYWRkaW5nLWJsb2NrJyxcbiAgJ3BhZGRpbmctYmxvY2stZW5kJyxcbiAgJ3BhZGRpbmctYmxvY2stc3RhcnQnLFxuICAncGFkZGluZy1ib3R0b20nLFxuICAncGFkZGluZy1pbmxpbmUnLFxuICAncGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3BhZGRpbmctaW5saW5lLXN0YXJ0JyxcbiAgJ3BhZGRpbmctbGVmdCcsXG4gICdwYWRkaW5nLXJpZ2h0JyxcbiAgJ3BhZGRpbmctdG9wJyxcbiAgJ3BhZ2UtYnJlYWstYWZ0ZXInLFxuICAncGFnZS1icmVhay1iZWZvcmUnLFxuICAncGFnZS1icmVhay1pbnNpZGUnLFxuICAncGF1c2UnLFxuICAncGF1c2UtYWZ0ZXInLFxuICAncGF1c2UtYmVmb3JlJyxcbiAgJ3BlcnNwZWN0aXZlJyxcbiAgJ3BlcnNwZWN0aXZlLW9yaWdpbicsXG4gICdwb2ludGVyLWV2ZW50cycsXG4gICdwb3NpdGlvbicsXG4gICdxdW90ZXMnLFxuICAncmVzaXplJyxcbiAgJ3Jlc3QnLFxuICAncmVzdC1hZnRlcicsXG4gICdyZXN0LWJlZm9yZScsXG4gICdyaWdodCcsXG4gICdyb3ctZ2FwJyxcbiAgJ3Njcm9sbC1tYXJnaW4nLFxuICAnc2Nyb2xsLW1hcmdpbi1ibG9jaycsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tYm90dG9tJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtbWFyZ2luLWxlZnQnLFxuICAnc2Nyb2xsLW1hcmdpbi1yaWdodCcsXG4gICdzY3JvbGwtbWFyZ2luLXRvcCcsXG4gICdzY3JvbGwtcGFkZGluZycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jaycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jay1lbmQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYmxvY2stc3RhcnQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYm90dG9tJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZScsXG4gICdzY3JvbGwtcGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtcGFkZGluZy1sZWZ0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXJpZ2h0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXRvcCcsXG4gICdzY3JvbGwtc25hcC1hbGlnbicsXG4gICdzY3JvbGwtc25hcC1zdG9wJyxcbiAgJ3Njcm9sbC1zbmFwLXR5cGUnLFxuICAnc2Nyb2xsYmFyLWNvbG9yJyxcbiAgJ3Njcm9sbGJhci1ndXR0ZXInLFxuICAnc2Nyb2xsYmFyLXdpZHRoJyxcbiAgJ3NoYXBlLWltYWdlLXRocmVzaG9sZCcsXG4gICdzaGFwZS1tYXJnaW4nLFxuICAnc2hhcGUtb3V0c2lkZScsXG4gICdzcGVhaycsXG4gICdzcGVhay1hcycsXG4gICdzcmMnLCAvLyBAZm9udC1mYWNlXG4gICd0YWItc2l6ZScsXG4gICd0YWJsZS1sYXlvdXQnLFxuICAndGV4dC1hbGlnbicsXG4gICd0ZXh0LWFsaWduLWFsbCcsXG4gICd0ZXh0LWFsaWduLWxhc3QnLFxuICAndGV4dC1jb21iaW5lLXVwcmlnaHQnLFxuICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1jb2xvcicsXG4gICd0ZXh0LWRlY29yYXRpb24tbGluZScsXG4gICd0ZXh0LWRlY29yYXRpb24tc3R5bGUnLFxuICAndGV4dC1lbXBoYXNpcycsXG4gICd0ZXh0LWVtcGhhc2lzLWNvbG9yJyxcbiAgJ3RleHQtZW1waGFzaXMtcG9zaXRpb24nLFxuICAndGV4dC1lbXBoYXNpcy1zdHlsZScsXG4gICd0ZXh0LWluZGVudCcsXG4gICd0ZXh0LWp1c3RpZnknLFxuICAndGV4dC1vcmllbnRhdGlvbicsXG4gICd0ZXh0LW92ZXJmbG93JyxcbiAgJ3RleHQtcmVuZGVyaW5nJyxcbiAgJ3RleHQtc2hhZG93JyxcbiAgJ3RleHQtdHJhbnNmb3JtJyxcbiAgJ3RleHQtdW5kZXJsaW5lLXBvc2l0aW9uJyxcbiAgJ3RvcCcsXG4gICd0cmFuc2Zvcm0nLFxuICAndHJhbnNmb3JtLWJveCcsXG4gICd0cmFuc2Zvcm0tb3JpZ2luJyxcbiAgJ3RyYW5zZm9ybS1zdHlsZScsXG4gICd0cmFuc2l0aW9uJyxcbiAgJ3RyYW5zaXRpb24tZGVsYXknLFxuICAndHJhbnNpdGlvbi1kdXJhdGlvbicsXG4gICd0cmFuc2l0aW9uLXByb3BlcnR5JyxcbiAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgJ3VuaWNvZGUtYmlkaScsXG4gICd2ZXJ0aWNhbC1hbGlnbicsXG4gICd2aXNpYmlsaXR5JyxcbiAgJ3ZvaWNlLWJhbGFuY2UnLFxuICAndm9pY2UtZHVyYXRpb24nLFxuICAndm9pY2UtZmFtaWx5JyxcbiAgJ3ZvaWNlLXBpdGNoJyxcbiAgJ3ZvaWNlLXJhbmdlJyxcbiAgJ3ZvaWNlLXJhdGUnLFxuICAndm9pY2Utc3RyZXNzJyxcbiAgJ3ZvaWNlLXZvbHVtZScsXG4gICd3aGl0ZS1zcGFjZScsXG4gICd3aWRvd3MnLFxuICAnd2lkdGgnLFxuICAnd2lsbC1jaGFuZ2UnLFxuICAnd29yZC1icmVhaycsXG4gICd3b3JkLXNwYWNpbmcnLFxuICAnd29yZC13cmFwJyxcbiAgJ3dyaXRpbmctbW9kZScsXG4gICd6LWluZGV4J1xuICAvLyByZXZlcnNlIG1ha2VzIHN1cmUgbG9uZ2VyIGF0dHJpYnV0ZXMgYGZvbnQtd2VpZ2h0YCBhcmUgbWF0Y2hlZCBmdWxseVxuICAvLyBpbnN0ZWFkIG9mIGdldHRpbmcgZmFsc2UgcG9zaXRpdmVzIG9uIHNheSBgZm9udGBcbl0ucmV2ZXJzZSgpO1xuXG4vLyBzb21lIGdyYW1tYXJzIHVzZSB0aGVtIGFsbCBhcyBhIHNpbmdsZSBncm91cFxuY29uc3QgUFNFVURPX1NFTEVDVE9SUyA9IFBTRVVET19DTEFTU0VTLmNvbmNhdChQU0VVRE9fRUxFTUVOVFMpO1xuXG4vKlxuTGFuZ3VhZ2U6IExlc3NcbkRlc2NyaXB0aW9uOiBJdCdzIENTUywgd2l0aCBqdXN0IGEgbGl0dGxlIG1vcmUuXG5BdXRob3I6ICAgTWF4IE1pa2hhaWxvdiA8c2V2ZW4ucGhhc2VzLm1heEBnbWFpbC5jb20+XG5XZWJzaXRlOiBodHRwOi8vbGVzc2Nzcy5vcmdcbkNhdGVnb3J5OiBjb21tb24sIGNzcywgd2ViXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gbGVzcyhobGpzKSB7XG4gIGNvbnN0IG1vZGVzID0gTU9ERVMoaGxqcyk7XG4gIGNvbnN0IFBTRVVET19TRUxFQ1RPUlMkMSA9IFBTRVVET19TRUxFQ1RPUlM7XG5cbiAgY29uc3QgQVRfTU9ESUZJRVJTID0gXCJhbmQgb3Igbm90IG9ubHlcIjtcbiAgY29uc3QgSURFTlRfUkUgPSAnW1xcXFx3LV0rJzsgLy8geWVzLCBMZXNzIGlkZW50aWZpZXJzIG1heSBiZWdpbiB3aXRoIGEgZGlnaXRcbiAgY29uc3QgSU5URVJQX0lERU5UX1JFID0gJygnICsgSURFTlRfUkUgKyAnfEBcXFxceycgKyBJREVOVF9SRSArICdcXFxcfSknO1xuXG4gIC8qIEdlbmVyaWMgTW9kZXMgKi9cblxuICBjb25zdCBSVUxFUyA9IFtdOyBjb25zdCBWQUxVRV9NT0RFUyA9IFtdOyAvLyBmb3J3YXJkIGRlZi4gZm9yIHJlY3Vyc2l2ZSBtb2Rlc1xuXG4gIGNvbnN0IFNUUklOR19NT0RFID0gZnVuY3Rpb24oYykge1xuICAgIHJldHVybiB7XG4gICAgLy8gTGVzcyBzdHJpbmdzIGFyZSBub3QgbXVsdGlsaW5lIChhbHNvIGluY2x1ZGUgJ34nIGZvciBtb3JlIGNvbnNpc3RlbnQgY29sb3Jpbmcgb2YgXCJlc2NhcGVkXCIgc3RyaW5ncylcbiAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICBiZWdpbjogJ34/JyArIGMgKyAnLio/JyArIGNcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IElERU5UX01PREUgPSBmdW5jdGlvbihuYW1lLCBiZWdpbiwgcmVsZXZhbmNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogbmFtZSxcbiAgICAgIGJlZ2luOiBiZWdpbixcbiAgICAgIHJlbGV2YW5jZTogcmVsZXZhbmNlXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBBVF9LRVlXT1JEUyA9IHtcbiAgICAkcGF0dGVybjogL1thLXotXSsvLFxuICAgIGtleXdvcmQ6IEFUX01PRElGSUVSUyxcbiAgICBhdHRyaWJ1dGU6IE1FRElBX0ZFQVRVUkVTLmpvaW4oXCIgXCIpXG4gIH07XG5cbiAgY29uc3QgUEFSRU5TX01PREUgPSB7XG4gICAgLy8gdXNlZCBvbmx5IHRvIHByb3Blcmx5IGJhbGFuY2UgbmVzdGVkIHBhcmVucyBpbnNpZGUgbWl4aW4gY2FsbCwgZGVmLiBhcmcgbGlzdFxuICAgIGJlZ2luOiAnXFxcXCgnLFxuICAgIGVuZDogJ1xcXFwpJyxcbiAgICBjb250YWluczogVkFMVUVfTU9ERVMsXG4gICAga2V5d29yZHM6IEFUX0tFWVdPUkRTLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIC8vIGdlbmVyaWMgTGVzcyBoaWdobGlnaHRlciAodXNlZCBhbG1vc3QgZXZlcnl3aGVyZSBleGNlcHQgc2VsZWN0b3JzKTpcbiAgVkFMVUVfTU9ERVMucHVzaChcbiAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBTVFJJTkdfTU9ERShcIidcIiksXG4gICAgU1RSSU5HX01PREUoJ1wiJyksXG4gICAgbW9kZXMuQ1NTX05VTUJFUl9NT0RFLCAvLyBmaXhtZTogaXQgZG9lcyBub3QgaW5jbHVkZSBkb3QgZm9yIG51bWJlcnMgbGlrZSAuNWVtIDooXG4gICAge1xuICAgICAgYmVnaW46ICcodXJsfGRhdGEtdXJpKVxcXFwoJyxcbiAgICAgIHN0YXJ0czoge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICBlbmQ6ICdbXFxcXClcXFxcbl0nLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9XG4gICAgfSxcbiAgICBtb2Rlcy5IRVhDT0xPUixcbiAgICBQQVJFTlNfTU9ERSxcbiAgICBJREVOVF9NT0RFKCd2YXJpYWJsZScsICdAQD8nICsgSURFTlRfUkUsIDEwKSxcbiAgICBJREVOVF9NT0RFKCd2YXJpYWJsZScsICdAXFxcXHsnICsgSURFTlRfUkUgKyAnXFxcXH0nKSxcbiAgICBJREVOVF9NT0RFKCdidWlsdF9pbicsICd+P2BbXmBdKj9gJyksIC8vIGlubGluZSBqYXZhc2NyaXB0IChvciB3aGF0ZXZlciBob3N0IGxhbmd1YWdlKSAqbXVsdGlsaW5lKiBzdHJpbmdcbiAgICB7IC8vIEBtZWRpYSBmZWF0dXJlcyAoaXRcdTIwMTlzIGhlcmUgdG8gbm90IGR1cGxpY2F0ZSB0aGluZ3MgaW4gQVRfUlVMRV9NT0RFIHdpdGggZXh0cmEgUEFSRU5TX01PREUgb3ZlcnJpZGluZyk6XG4gICAgICBjbGFzc05hbWU6ICdhdHRyaWJ1dGUnLFxuICAgICAgYmVnaW46IElERU5UX1JFICsgJ1xcXFxzKjonLFxuICAgICAgZW5kOiAnOicsXG4gICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgICB9LFxuICAgIG1vZGVzLklNUE9SVEFOVCxcbiAgICB7IGJlZ2luS2V5d29yZHM6ICdhbmQgbm90JyB9LFxuICAgIG1vZGVzLkZVTkNUSU9OX0RJU1BBVENIXG4gICk7XG5cbiAgY29uc3QgVkFMVUVfV0lUSF9SVUxFU0VUUyA9IFZBTFVFX01PREVTLmNvbmNhdCh7XG4gICAgYmVnaW46IC9cXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFJVTEVTXG4gIH0pO1xuXG4gIGNvbnN0IE1JWElOX0dVQVJEX01PREUgPSB7XG4gICAgYmVnaW5LZXl3b3JkczogJ3doZW4nLFxuICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgIGNvbnRhaW5zOiBbIHsgYmVnaW5LZXl3b3JkczogJ2FuZCBub3QnIH0gXS5jb25jYXQoVkFMVUVfTU9ERVMpIC8vIHVzaW5nIHRoaXMgZm9ybSB0byBvdmVycmlkZSBWQUxVRVx1MjAxOXMgJ2Z1bmN0aW9uJyBtYXRjaFxuICB9O1xuXG4gIC8qIFJ1bGUtTGV2ZWwgTW9kZXMgKi9cblxuICBjb25zdCBSVUxFX01PREUgPSB7XG4gICAgYmVnaW46IElOVEVSUF9JREVOVF9SRSArICdcXFxccyo6JyxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBlbmQ6IC9bO31dLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgYmVnaW46IC8tKHdlYmtpdHxtb3p8bXN8byktLyB9LFxuICAgICAgbW9kZXMuQ1NTX1ZBUklBQkxFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdhdHRyaWJ1dGUnLFxuICAgICAgICBiZWdpbjogJ1xcXFxiKCcgKyBBVFRSSUJVVEVTLmpvaW4oJ3wnKSArICcpXFxcXGInLFxuICAgICAgICBlbmQ6IC8oPz06KS8sXG4gICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgICAgICAgIGlsbGVnYWw6ICdbPD0kXScsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIGNvbnRhaW5zOiBWQUxVRV9NT0RFU1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IEFUX1JVTEVfTU9ERSA9IHtcbiAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICBiZWdpbjogJ0AoaW1wb3J0fG1lZGlhfGNoYXJzZXR8Zm9udC1mYWNlfCgtW2Etel0rLSk/a2V5ZnJhbWVzfHN1cHBvcnRzfGRvY3VtZW50fG5hbWVzcGFjZXxwYWdlfHZpZXdwb3J0fGhvc3QpXFxcXGInLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnWzt7fV0nLFxuICAgICAga2V5d29yZHM6IEFUX0tFWVdPUkRTLFxuICAgICAgcmV0dXJuRW5kOiB0cnVlLFxuICAgICAgY29udGFpbnM6IFZBTFVFX01PREVTLFxuICAgICAgcmVsZXZhbmNlOiAwXG4gICAgfVxuICB9O1xuXG4gIC8vIHZhcmlhYmxlIGRlZmluaXRpb25zIGFuZCBjYWxsc1xuICBjb25zdCBWQVJfUlVMRV9NT0RFID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gdXNpbmcgbW9yZSBzdHJpY3QgcGF0dGVybiBmb3IgaGlnaGVyIHJlbGV2YW5jZSB0byBpbmNyZWFzZSBjaGFuY2VzIG9mIExlc3MgZGV0ZWN0aW9uLlxuICAgICAgLy8gdGhpcyBpcyAqdGhlIG9ubHkqIExlc3Mgc3BlY2lmaWMgc3RhdGVtZW50IHVzZWQgaW4gbW9zdCBvZiB0aGUgc291cmNlcywgc28uLi5cbiAgICAgIC8vICh3ZVx1MjAxOWxsIHN0aWxsIG9mdGVuIGxvb3NlIHRvIHRoZSBjc3MtcGFyc2VyIHVubGVzcyB0aGVyZSdzICcvLycgY29tbWVudCxcbiAgICAgIC8vIHNpbXBseSBiZWNhdXNlIDEgdmFyaWFibGUganVzdCBjYW4ndCBiZWF0IDk5IHByb3BlcnRpZXMgOilcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdAJyArIElERU5UX1JFICsgJ1xcXFxzKjonLFxuICAgICAgICByZWxldmFuY2U6IDE1XG4gICAgICB9LFxuICAgICAgeyBiZWdpbjogJ0AnICsgSURFTlRfUkUgfVxuICAgIF0sXG4gICAgc3RhcnRzOiB7XG4gICAgICBlbmQ6ICdbO31dJyxcbiAgICAgIHJldHVybkVuZDogdHJ1ZSxcbiAgICAgIGNvbnRhaW5zOiBWQUxVRV9XSVRIX1JVTEVTRVRTXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFNFTEVDVE9SX01PREUgPSB7XG4gICAgLy8gZmlyc3QgcGFyc2UgdW5hbWJpZ3VvdXMgc2VsZWN0b3JzIChpLmUuIHRob3NlIG5vdCBzdGFydGluZyB3aXRoIHRhZylcbiAgICAvLyB0aGVuIGZhbGwgaW50byB0aGUgc2NhcnkgbG9va2FoZWFkLWRpc2NyaW1pbmF0b3IgdmFyaWFudC5cbiAgICAvLyB0aGlzIG1vZGUgYWxzbyBoYW5kbGVzIG1peGluIGRlZmluaXRpb25zIGFuZCBjYWxsc1xuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnW1xcXFwuIzomXFxcXFs+XScsXG4gICAgICAgIGVuZDogJ1s7e31dJyAvLyBtaXhpbiBjYWxscyBlbmQgd2l0aCAnOydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBJTlRFUlBfSURFTlRfUkUsXG4gICAgICAgIGVuZDogL1xcey9cbiAgICAgIH1cbiAgICBdLFxuICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgIHJldHVybkVuZDogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAnWzw9XFwnJFwiXScsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAgTUlYSU5fR1VBUkRfTU9ERSxcbiAgICAgIElERU5UX01PREUoJ2tleXdvcmQnLCAnYWxsXFxcXGInKSxcbiAgICAgIElERU5UX01PREUoJ3ZhcmlhYmxlJywgJ0BcXFxceycgKyBJREVOVF9SRSArICdcXFxcfScpLCAvLyBvdGhlcndpc2UgaXRcdTIwMTlzIGlkZW50aWZpZWQgYXMgdGFnXG4gICAgICBcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdcXFxcYignICsgVEFHUy5qb2luKCd8JykgKyAnKVxcXFxiJyxcbiAgICAgICAgY2xhc3NOYW1lOiAnc2VsZWN0b3ItdGFnJ1xuICAgICAgfSxcbiAgICAgIG1vZGVzLkNTU19OVU1CRVJfTU9ERSxcbiAgICAgIElERU5UX01PREUoJ3NlbGVjdG9yLXRhZycsIElOVEVSUF9JREVOVF9SRSwgMCksXG4gICAgICBJREVOVF9NT0RFKCdzZWxlY3Rvci1pZCcsICcjJyArIElOVEVSUF9JREVOVF9SRSksXG4gICAgICBJREVOVF9NT0RFKCdzZWxlY3Rvci1jbGFzcycsICdcXFxcLicgKyBJTlRFUlBfSURFTlRfUkUsIDApLFxuICAgICAgSURFTlRfTU9ERSgnc2VsZWN0b3ItdGFnJywgJyYnLCAwKSxcbiAgICAgIG1vZGVzLkFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1wc2V1ZG8nLFxuICAgICAgICBiZWdpbjogJzooJyArIFBTRVVET19DTEFTU0VTLmpvaW4oJ3wnKSArICcpJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnc2VsZWN0b3ItcHNldWRvJyxcbiAgICAgICAgYmVnaW46ICc6KDopPygnICsgUFNFVURPX0VMRU1FTlRTLmpvaW4oJ3wnKSArICcpJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGNvbnRhaW5zOiBWQUxVRV9XSVRIX1JVTEVTRVRTXG4gICAgICB9LCAvLyBhcmd1bWVudCBsaXN0IG9mIHBhcmFtZXRyaWMgbWl4aW5zXG4gICAgICB7IGJlZ2luOiAnIWltcG9ydGFudCcgfSwgLy8gZWF0ICFpbXBvcnRhbnQgYWZ0ZXIgbWl4aW4gY2FsbCBvciBpdCB3aWxsIGJlIGNvbG9yZWQgYXMgdGFnXG4gICAgICBtb2Rlcy5GVU5DVElPTl9ESVNQQVRDSFxuICAgIF1cbiAgfTtcblxuICBjb25zdCBQU0VVRE9fU0VMRUNUT1JfTU9ERSA9IHtcbiAgICBiZWdpbjogSURFTlRfUkUgKyAnOig6KT8nICsgYCgke1BTRVVET19TRUxFQ1RPUlMkMS5qb2luKCd8Jyl9KWAsXG4gICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgY29udGFpbnM6IFsgU0VMRUNUT1JfTU9ERSBdXG4gIH07XG5cbiAgUlVMRVMucHVzaChcbiAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBBVF9SVUxFX01PREUsXG4gICAgVkFSX1JVTEVfTU9ERSxcbiAgICBQU0VVRE9fU0VMRUNUT1JfTU9ERSxcbiAgICBSVUxFX01PREUsXG4gICAgU0VMRUNUT1JfTU9ERSxcbiAgICBNSVhJTl9HVUFSRF9NT0RFLFxuICAgIG1vZGVzLkZVTkNUSU9OX0RJU1BBVENIXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGVzcycsXG4gICAgY2FzZV9pbnNlbnNpdGl2ZTogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAnWz0+XFwnLzwoJFwiXScsXG4gICAgY29udGFpbnM6IFJVTEVTXG4gIH07XG59XG5cbmV4cG9ydCB7IGxlc3MgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogTHVhXG5EZXNjcmlwdGlvbjogTHVhIGlzIGEgcG93ZXJmdWwsIGVmZmljaWVudCwgbGlnaHR3ZWlnaHQsIGVtYmVkZGFibGUgc2NyaXB0aW5nIGxhbmd1YWdlLlxuQXV0aG9yOiBBbmRyZXcgRmVkb3JvdiA8ZG1tZHJzQG1haWwucnU+XG5DYXRlZ29yeTogY29tbW9uLCBzY3JpcHRpbmdcbldlYnNpdGU6IGh0dHBzOi8vd3d3Lmx1YS5vcmdcbiovXG5cbmZ1bmN0aW9uIGx1YShobGpzKSB7XG4gIGNvbnN0IE9QRU5JTkdfTE9OR19CUkFDS0VUID0gJ1xcXFxbPSpcXFxcWyc7XG4gIGNvbnN0IENMT1NJTkdfTE9OR19CUkFDS0VUID0gJ1xcXFxdPSpcXFxcXSc7XG4gIGNvbnN0IExPTkdfQlJBQ0tFVFMgPSB7XG4gICAgYmVnaW46IE9QRU5JTkdfTE9OR19CUkFDS0VULFxuICAgIGVuZDogQ0xPU0lOR19MT05HX0JSQUNLRVQsXG4gICAgY29udGFpbnM6IFsgJ3NlbGYnIF1cbiAgfTtcbiAgY29uc3QgQ09NTUVOVFMgPSBbXG4gICAgaGxqcy5DT01NRU5UKCctLSg/IScgKyBPUEVOSU5HX0xPTkdfQlJBQ0tFVCArICcpJywgJyQnKSxcbiAgICBobGpzLkNPTU1FTlQoXG4gICAgICAnLS0nICsgT1BFTklOR19MT05HX0JSQUNLRVQsXG4gICAgICBDTE9TSU5HX0xPTkdfQlJBQ0tFVCxcbiAgICAgIHtcbiAgICAgICAgY29udGFpbnM6IFsgTE9OR19CUkFDS0VUUyBdLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9XG4gICAgKVxuICBdO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdMdWEnLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgICAgbGl0ZXJhbDogXCJ0cnVlIGZhbHNlIG5pbFwiLFxuICAgICAga2V5d29yZDogXCJhbmQgYnJlYWsgZG8gZWxzZSBlbHNlaWYgZW5kIGZvciBnb3RvIGlmIGluIGxvY2FsIG5vdCBvciByZXBlYXQgcmV0dXJuIHRoZW4gdW50aWwgd2hpbGVcIixcbiAgICAgIGJ1aWx0X2luOlxuICAgICAgICAvLyBNZXRhdGFncyBhbmQgZ2xvYmFsczpcbiAgICAgICAgJ19HIF9FTlYgX1ZFUlNJT04gX19pbmRleCBfX25ld2luZGV4IF9fbW9kZSBfX2NhbGwgX19tZXRhdGFibGUgX190b3N0cmluZyBfX2xlbiAnXG4gICAgICAgICsgJ19fZ2MgX19hZGQgX19zdWIgX19tdWwgX19kaXYgX19tb2QgX19wb3cgX19jb25jYXQgX191bm0gX19lcSBfX2x0IF9fbGUgYXNzZXJ0ICdcbiAgICAgICAgLy8gU3RhbmRhcmQgbWV0aG9kcyBhbmQgcHJvcGVydGllczpcbiAgICAgICAgKyAnY29sbGVjdGdhcmJhZ2UgZG9maWxlIGVycm9yIGdldGZlbnYgZ2V0bWV0YXRhYmxlIGlwYWlycyBsb2FkIGxvYWRmaWxlIGxvYWRzdHJpbmcgJ1xuICAgICAgICArICdtb2R1bGUgbmV4dCBwYWlycyBwY2FsbCBwcmludCByYXdlcXVhbCByYXdnZXQgcmF3c2V0IHJlcXVpcmUgc2VsZWN0IHNldGZlbnYgJ1xuICAgICAgICArICdzZXRtZXRhdGFibGUgdG9udW1iZXIgdG9zdHJpbmcgdHlwZSB1bnBhY2sgeHBjYWxsIGFyZyBzZWxmICdcbiAgICAgICAgLy8gTGlicmFyeSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIChvbmUgbGluZSBwZXIgbGlicmFyeSk6XG4gICAgICAgICsgJ2Nvcm91dGluZSByZXN1bWUgeWllbGQgc3RhdHVzIHdyYXAgY3JlYXRlIHJ1bm5pbmcgZGVidWcgZ2V0dXB2YWx1ZSAnXG4gICAgICAgICsgJ2RlYnVnIHNldGhvb2sgZ2V0bWV0YXRhYmxlIGdldGhvb2sgc2V0bWV0YXRhYmxlIHNldGxvY2FsIHRyYWNlYmFjayBzZXRmZW52IGdldGluZm8gc2V0dXB2YWx1ZSBnZXRsb2NhbCBnZXRyZWdpc3RyeSBnZXRmZW52ICdcbiAgICAgICAgKyAnaW8gbGluZXMgd3JpdGUgY2xvc2UgZmx1c2ggb3BlbiBvdXRwdXQgdHlwZSByZWFkIHN0ZGVyciBzdGRpbiBpbnB1dCBzdGRvdXQgcG9wZW4gdG1wZmlsZSAnXG4gICAgICAgICsgJ21hdGggbG9nIG1heCBhY29zIGh1Z2UgbGRleHAgcGkgY29zIHRhbmggcG93IGRlZyB0YW4gY29zaCBzaW5oIHJhbmRvbSByYW5kb21zZWVkIGZyZXhwIGNlaWwgZmxvb3IgcmFkIGFicyBzcXJ0IG1vZGYgYXNpbiBtaW4gbW9kIGZtb2QgbG9nMTAgYXRhbjIgZXhwIHNpbiBhdGFuICdcbiAgICAgICAgKyAnb3MgZXhpdCBzZXRsb2NhbGUgZGF0ZSBnZXRlbnYgZGlmZnRpbWUgcmVtb3ZlIHRpbWUgY2xvY2sgdG1wbmFtZSByZW5hbWUgZXhlY3V0ZSBwYWNrYWdlIHByZWxvYWQgbG9hZGxpYiBsb2FkZWQgbG9hZGVycyBjcGF0aCBjb25maWcgcGF0aCBzZWVhbGwgJ1xuICAgICAgICArICdzdHJpbmcgc3ViIHVwcGVyIGxlbiBnZmluZCByZXAgZmluZCBtYXRjaCBjaGFyIGR1bXAgZ21hdGNoIHJldmVyc2UgYnl0ZSBmb3JtYXQgZ3N1YiBsb3dlciAnXG4gICAgICAgICsgJ3RhYmxlIHNldG4gaW5zZXJ0IGdldG4gZm9yZWFjaGkgbWF4biBmb3JlYWNoIGNvbmNhdCBzb3J0IHJlbW92ZSdcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBDT01NRU5UUy5jb25jYXQoW1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICdmdW5jdGlvbicsXG4gICAgICAgIGVuZDogJ1xcXFwpJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBobGpzLmluaGVyaXQoaGxqcy5USVRMRV9NT0RFLCB7IGJlZ2luOiAnKFtfYS16QS1aXVxcXFx3KlxcXFwuKSooW19hLXpBLVpdXFxcXHcqOik/W19hLXpBLVpdXFxcXHcqJyB9KSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdwYXJhbXMnLFxuICAgICAgICAgICAgYmVnaW46ICdcXFxcKCcsXG4gICAgICAgICAgICBlbmRzV2l0aFBhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBDT01NRU5UU1xuICAgICAgICAgIH1cbiAgICAgICAgXS5jb25jYXQoQ09NTUVOVFMpXG4gICAgICB9LFxuICAgICAgaGxqcy5DX05VTUJFUl9NT0RFLFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICAgICAgYmVnaW46IE9QRU5JTkdfTE9OR19CUkFDS0VULFxuICAgICAgICBlbmQ6IENMT1NJTkdfTE9OR19CUkFDS0VULFxuICAgICAgICBjb250YWluczogWyBMT05HX0JSQUNLRVRTIF0sXG4gICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgfVxuICAgIF0pXG4gIH07XG59XG5cbmV4cG9ydCB7IGx1YSBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBNYWtlZmlsZVxuQXV0aG9yOiBJdmFuIFNhZ2FsYWV2IDxtYW5pYWNAc29mdHdhcmVtYW5pYWNzLm9yZz5cbkNvbnRyaWJ1dG9yczogSm9cdTAwRUJsIFBvcnF1ZXQgPGpvZWxAcG9ycXVldC5vcmc+XG5XZWJzaXRlOiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL21ha2UvbWFudWFsL2h0bWxfbm9kZS9JbnRyb2R1Y3Rpb24uaHRtbFxuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuZnVuY3Rpb24gbWFrZWZpbGUoaGxqcykge1xuICAvKiBWYXJpYWJsZXM6IHNpbXBsZSAoZWcgJCh2YXIpKSBhbmQgc3BlY2lhbCAoZWcgJEApICovXG4gIGNvbnN0IFZBUklBQkxFID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogJ1xcXFwkXFxcXCgnICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFICsgJ1xcXFwpJyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgICAgIH0sXG4gICAgICB7IGJlZ2luOiAvXFwkW0AlPD9cXF5cXCtcXCpdLyB9XG4gICAgXVxuICB9O1xuICAvKiBRdW90ZWQgc3RyaW5nIHdpdGggdmFyaWFibGVzIGluc2lkZSAqL1xuICBjb25zdCBRVU9URV9TVFJJTkcgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBiZWdpbjogL1wiLyxcbiAgICBlbmQ6IC9cIi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgIFZBUklBQkxFXG4gICAgXVxuICB9O1xuICAvKiBGdW5jdGlvbjogJChmdW5jIGFyZywuLi4pICovXG4gIGNvbnN0IEZVTkMgPSB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIGJlZ2luOiAvXFwkXFwoW1xcdy1dK1xccy8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICBrZXl3b3JkczogeyBidWlsdF9pbjpcbiAgICAgICAgJ3N1YnN0IHBhdHN1YnN0IHN0cmlwIGZpbmRzdHJpbmcgZmlsdGVyIGZpbHRlci1vdXQgc29ydCAnXG4gICAgICAgICsgJ3dvcmQgd29yZGxpc3QgZmlyc3R3b3JkIGxhc3R3b3JkIGRpciBub3RkaXIgc3VmZml4IGJhc2VuYW1lICdcbiAgICAgICAgKyAnYWRkc3VmZml4IGFkZHByZWZpeCBqb2luIHdpbGRjYXJkIHJlYWxwYXRoIGFic3BhdGggZXJyb3Igd2FybmluZyAnXG4gICAgICAgICsgJ3NoZWxsIG9yaWdpbiBmbGF2b3IgZm9yZWFjaCBpZiBvciBhbmQgY2FsbCBldmFsIGZpbGUgdmFsdWUnIH0sXG4gICAgY29udGFpbnM6IFsgVkFSSUFCTEUgXVxuICB9O1xuICAvKiBWYXJpYWJsZSBhc3NpZ25tZW50ICovXG4gIGNvbnN0IEFTU0lHTk1FTlQgPSB7IGJlZ2luOiAnXicgKyBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgKyAnXFxcXHMqKD89WzorP10/PSknIH07XG4gIC8qIE1ldGEgdGFyZ2V0cyAoLlBIT05ZKSAqL1xuICBjb25zdCBNRVRBID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAvXlxcLlBIT05ZOi8sXG4gICAgZW5kOiAvJC8sXG4gICAga2V5d29yZHM6IHtcbiAgICAgICRwYXR0ZXJuOiAvW1xcLlxcd10rLyxcbiAgICAgIGtleXdvcmQ6ICcuUEhPTlknXG4gICAgfVxuICB9O1xuICAvKiBUYXJnZXRzICovXG4gIGNvbnN0IFRBUkdFVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzZWN0aW9uJyxcbiAgICBiZWdpbjogL15bXlxcc10rOi8sXG4gICAgZW5kOiAvJC8sXG4gICAgY29udGFpbnM6IFsgVkFSSUFCTEUgXVxuICB9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdNYWtlZmlsZScsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ21rJyxcbiAgICAgICdtYWsnLFxuICAgICAgJ21ha2UnLFxuICAgIF0sXG4gICAga2V5d29yZHM6IHtcbiAgICAgICRwYXR0ZXJuOiAvW1xcdy1dKy8sXG4gICAgICBrZXl3b3JkOiAnZGVmaW5lIGVuZGVmIHVuZGVmaW5lIGlmZGVmIGlmbmRlZiBpZmVxIGlmbmVxIGVsc2UgZW5kaWYgJ1xuICAgICAgKyAnaW5jbHVkZSAtaW5jbHVkZSBzaW5jbHVkZSBvdmVycmlkZSBleHBvcnQgdW5leHBvcnQgcHJpdmF0ZSB2cGF0aCdcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkhBU0hfQ09NTUVOVF9NT0RFLFxuICAgICAgVkFSSUFCTEUsXG4gICAgICBRVU9URV9TVFJJTkcsXG4gICAgICBGVU5DLFxuICAgICAgQVNTSUdOTUVOVCxcbiAgICAgIE1FVEEsXG4gICAgICBUQVJHRVRcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IG1ha2VmaWxlIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IE1hcmtkb3duXG5SZXF1aXJlczogeG1sLmpzXG5BdXRob3I6IEpvaG4gQ3JlcGV6emkgPGpvaG4uY3JlcGV6emlAZ21haWwuY29tPlxuV2Vic2l0ZTogaHR0cHM6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vXG5DYXRlZ29yeTogY29tbW9uLCBtYXJrdXBcbiovXG5cbmZ1bmN0aW9uIG1hcmtkb3duKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBJTkxJTkVfSFRNTCA9IHtcbiAgICBiZWdpbjogLzxcXC8/W0EtWmEtel9dLyxcbiAgICBlbmQ6ICc+JyxcbiAgICBzdWJMYW5ndWFnZTogJ3htbCcsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG4gIGNvbnN0IEhPUklaT05UQUxfUlVMRSA9IHtcbiAgICBiZWdpbjogJ15bLVxcXFwqXXszLH0nLFxuICAgIGVuZDogJyQnXG4gIH07XG4gIGNvbnN0IENPREUgPSB7XG4gICAgY2xhc3NOYW1lOiAnY29kZScsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIC8vIFRPRE86IGZpeCB0byBhbGxvdyB0aGVzZSB0byB3b3JrIHdpdGggc3VibGFuZ3VhZ2UgYWxzb1xuICAgICAgeyBiZWdpbjogJyhgezMsfSlbXmBdKC58XFxcXG4pKj9cXFxcMWAqWyBdKicgfSxcbiAgICAgIHsgYmVnaW46ICcofnszLH0pW15+XSgufFxcXFxuKSo/XFxcXDF+KlsgXSonIH0sXG4gICAgICAvLyBuZWVkZWQgdG8gYWxsb3cgbWFya2Rvd24gYXMgYSBzdWJsYW5ndWFnZSB0byB3b3JrXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnYGBgJyxcbiAgICAgICAgZW5kOiAnYGBgK1sgXSokJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICd+fn4nLFxuICAgICAgICBlbmQ6ICd+fn4rWyBdKiQnXG4gICAgICB9LFxuICAgICAgeyBiZWdpbjogJ2AuKz9gJyB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJyg/PV4oIHs0fXxcXFxcdCkpJyxcbiAgICAgICAgLy8gdXNlIGNvbnRhaW5zIHRvIGdvYmJsZSB1cCBtdWx0aXBsZSBsaW5lcyB0byBhbGxvdyB0aGUgYmxvY2sgdG8gYmUgd2hhdGV2ZXIgc2l6ZVxuICAgICAgICAvLyBidXQgb25seSBoYXZlIGEgc2luZ2xlIG9wZW4vY2xvc2UgdGFnIHZzIG9uZSBwZXIgbGluZVxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnXiggezR9fFxcXFx0KScsXG4gICAgICAgICAgICBlbmQ6ICcoXFxcXG4pJCdcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgTElTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdidWxsZXQnLFxuICAgIGJlZ2luOiAnXlsgXFx0XSooWyorLV18KFxcXFxkK1xcXFwuKSkoPz1cXFxccyspJyxcbiAgICBlbmQ6ICdcXFxccysnLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgfTtcbiAgY29uc3QgTElOS19SRUZFUkVOQ0UgPSB7XG4gICAgYmVnaW46IC9eXFxbW15cXG5dK1xcXTovLFxuICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N5bWJvbCcsXG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXFxdLyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdsaW5rJyxcbiAgICAgICAgYmVnaW46IC86XFxzKi8sXG4gICAgICAgIGVuZDogLyQvLFxuICAgICAgICBleGNsdWRlQmVnaW46IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IFVSTF9TQ0hFTUUgPSAvW0EtWmEtel1bQS1aYS16MC05Ky4tXSovO1xuICBjb25zdCBMSU5LID0ge1xuICAgIHZhcmlhbnRzOiBbXG4gICAgICAvLyB0b28gbXVjaCBsaWtlIG5lc3RlZCBhcnJheSBhY2Nlc3MgaW4gc28gbWFueSBsYW5ndWFnZXNcbiAgICAgIC8vIHRvIGhhdmUgYW55IHJlYWwgcmVsZXZhbmNlXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLis/XFxdXFxbLio/XFxdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgLy8gcG9wdWxhciBpbnRlcm5ldCBVUkxzXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLis/XFxdXFwoKChkYXRhfGphdmFzY3JpcHR8bWFpbHRvKTp8KD86aHR0cHxmdHApcz86XFwvXFwvKS4qP1xcKS8sXG4gICAgICAgIHJlbGV2YW5jZTogMlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvXFxbLis/XFxdXFwoLywgVVJMX1NDSEVNRSwgLzpcXC9cXC8uKj9cXCkvKSxcbiAgICAgICAgcmVsZXZhbmNlOiAyXG4gICAgICB9LFxuICAgICAgLy8gcmVsYXRpdmUgdXJsc1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcWy4rP1xcXVxcKFsuLz8mI10uKj9cXCkvLFxuICAgICAgICByZWxldmFuY2U6IDFcbiAgICAgIH0sXG4gICAgICAvLyB3aGF0ZXZlciBlbHNlLCBsb3dlciByZWxldmFuY2UgKG1pZ2h0IG5vdCBiZSBhIGxpbmsgYXQgYWxsKVxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcWy4qP1xcXVxcKC4qP1xcKS8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfVxuICAgIF0sXG4gICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgLy8gZW1wdHkgc3RyaW5ncyBmb3IgYWx0IG9yIGxpbmsgdGV4dFxuICAgICAgICBtYXRjaDogL1xcWyg/PVxcXSkvIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgYmVnaW46ICdcXFxcWycsXG4gICAgICAgIGVuZDogJ1xcXFxdJyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICByZXR1cm5FbmQ6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2xpbmsnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGJlZ2luOiAnXFxcXF1cXFxcKCcsXG4gICAgICAgIGVuZDogJ1xcXFwpJyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGJlZ2luOiAnXFxcXF1cXFxcWycsXG4gICAgICAgIGVuZDogJ1xcXFxdJyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBCT0xEID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cm9uZycsXG4gICAgY29udGFpbnM6IFtdLCAvLyBkZWZpbmVkIGxhdGVyXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9fezJ9KD8hXFxzKS8sXG4gICAgICAgIGVuZDogL197Mn0vXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKnsyfSg/IVxccykvLFxuICAgICAgICBlbmQ6IC9cXCp7Mn0vXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBJVEFMSUMgPSB7XG4gICAgY2xhc3NOYW1lOiAnZW1waGFzaXMnLFxuICAgIGNvbnRhaW5zOiBbXSwgLy8gZGVmaW5lZCBsYXRlclxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwqKD8hWypcXHNdKS8sXG4gICAgICAgIGVuZDogL1xcKi9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXyg/IVtfXFxzXSkvLFxuICAgICAgICBlbmQ6IC9fLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9XG4gICAgXVxuICB9O1xuXG4gIC8vIDMgbGV2ZWwgZGVlcCBuZXN0aW5nIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgaXQgd291bGQgY3JlYXRlIGNvbmZ1c2lvblxuICAvLyBpbiBjYXNlcyBsaWtlIGAqKip0ZXN0aW5nKioqYCBiZWNhdXNlIHdoZXJlIHdlIGRvbid0IGtub3cgaWYgdGhlIGxhc3RcbiAgLy8gYCoqKmAgaXMgc3RhcnRpbmcgYSBuZXcgYm9sZC9pdGFsaWMgb3IgZmluaXNoaW5nIHRoZSBsYXN0IG9uZVxuICBjb25zdCBCT0xEX1dJVEhPVVRfSVRBTElDID0gaGxqcy5pbmhlcml0KEJPTEQsIHsgY29udGFpbnM6IFtdIH0pO1xuICBjb25zdCBJVEFMSUNfV0lUSE9VVF9CT0xEID0gaGxqcy5pbmhlcml0KElUQUxJQywgeyBjb250YWluczogW10gfSk7XG4gIEJPTEQuY29udGFpbnMucHVzaChJVEFMSUNfV0lUSE9VVF9CT0xEKTtcbiAgSVRBTElDLmNvbnRhaW5zLnB1c2goQk9MRF9XSVRIT1VUX0lUQUxJQyk7XG5cbiAgbGV0IENPTlRBSU5BQkxFID0gW1xuICAgIElOTElORV9IVE1MLFxuICAgIExJTktcbiAgXTtcblxuICBbXG4gICAgQk9MRCxcbiAgICBJVEFMSUMsXG4gICAgQk9MRF9XSVRIT1VUX0lUQUxJQyxcbiAgICBJVEFMSUNfV0lUSE9VVF9CT0xEXG4gIF0uZm9yRWFjaChtID0+IHtcbiAgICBtLmNvbnRhaW5zID0gbS5jb250YWlucy5jb25jYXQoQ09OVEFJTkFCTEUpO1xuICB9KTtcblxuICBDT05UQUlOQUJMRSA9IENPTlRBSU5BQkxFLmNvbmNhdChCT0xELCBJVEFMSUMpO1xuXG4gIGNvbnN0IEhFQURFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdzZWN0aW9uJyxcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogJ14jezEsNn0nLFxuICAgICAgICBlbmQ6ICckJyxcbiAgICAgICAgY29udGFpbnM6IENPTlRBSU5BQkxFXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJyg/PV4uKz9cXFxcbls9LV17Mix9JCknLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHsgYmVnaW46ICdeWz0tXSokJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnXicsXG4gICAgICAgICAgICBlbmQ6IFwiXFxcXG5cIixcbiAgICAgICAgICAgIGNvbnRhaW5zOiBDT05UQUlOQUJMRVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBCTE9DS1FVT1RFID0ge1xuICAgIGNsYXNzTmFtZTogJ3F1b3RlJyxcbiAgICBiZWdpbjogJ14+XFxcXHMrJyxcbiAgICBjb250YWluczogQ09OVEFJTkFCTEUsXG4gICAgZW5kOiAnJCdcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdNYXJrZG93bicsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ21kJyxcbiAgICAgICdta2Rvd24nLFxuICAgICAgJ21rZCdcbiAgICBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBIRUFERVIsXG4gICAgICBJTkxJTkVfSFRNTCxcbiAgICAgIExJU1QsXG4gICAgICBCT0xELFxuICAgICAgSVRBTElDLFxuICAgICAgQkxPQ0tRVU9URSxcbiAgICAgIENPREUsXG4gICAgICBIT1JJWk9OVEFMX1JVTEUsXG4gICAgICBMSU5LLFxuICAgICAgTElOS19SRUZFUkVOQ0VcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IG1hcmtkb3duIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IE9iamVjdGl2ZS1DXG5BdXRob3I6IFZhbGVyaWkgSGlvcmEgPHZhbGVyaWkuaGlvcmFAZ21haWwuY29tPlxuQ29udHJpYnV0b3JzOiBBbmdlbCBHLiBPbGxvcXVpIDxhbmdlbGdhcmNpYS5tYWlsQGdtYWlsLmNvbT4sIE1hdHQgRGllcGhvdXNlIDxtYXR0QGRpZXBob3VzZS5jb20+LCBBbmRyZXcgRmFybWVyIDxhaGZhcm1lckBnbWFpbC5jb20+LCBNaW5oIE5ndXlcdTFFQzVuIDxteG5AMWVjNS5vcmc+XG5XZWJzaXRlOiBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9vYmplY3RpdmVjXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG5mdW5jdGlvbiBvYmplY3RpdmVjKGhsanMpIHtcbiAgY29uc3QgQVBJX0NMQVNTID0ge1xuICAgIGNsYXNzTmFtZTogJ2J1aWx0X2luJyxcbiAgICBiZWdpbjogJ1xcXFxiKEFWfENBfENGfENHfENJfENMfENNfENOfENUfE1LfE1QfE1US3xNVEx8TlN8U0NOfFNLfFVJfFdLfFhDKVxcXFx3KydcbiAgfTtcbiAgY29uc3QgSURFTlRJRklFUl9SRSA9IC9bYS16QS1aQF1bYS16QS1aMC05X10qLztcbiAgY29uc3QgVFlQRVMgPSBbXG4gICAgXCJpbnRcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJjaGFyXCIsXG4gICAgXCJ1bnNpZ25lZFwiLFxuICAgIFwic2lnbmVkXCIsXG4gICAgXCJzaG9ydFwiLFxuICAgIFwibG9uZ1wiLFxuICAgIFwiZG91YmxlXCIsXG4gICAgXCJ3Y2hhcl90XCIsXG4gICAgXCJ1bmljaGFyXCIsXG4gICAgXCJ2b2lkXCIsXG4gICAgXCJib29sXCIsXG4gICAgXCJCT09MXCIsXG4gICAgXCJpZHwwXCIsXG4gICAgXCJfQm9vbFwiXG4gIF07XG4gIGNvbnN0IEtXUyA9IFtcbiAgICBcIndoaWxlXCIsXG4gICAgXCJleHBvcnRcIixcbiAgICBcInNpemVvZlwiLFxuICAgIFwidHlwZWRlZlwiLFxuICAgIFwiY29uc3RcIixcbiAgICBcInN0cnVjdFwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJ1bmlvblwiLFxuICAgIFwidm9sYXRpbGVcIixcbiAgICBcInN0YXRpY1wiLFxuICAgIFwibXV0YWJsZVwiLFxuICAgIFwiaWZcIixcbiAgICBcImRvXCIsXG4gICAgXCJyZXR1cm5cIixcbiAgICBcImdvdG9cIixcbiAgICBcImVudW1cIixcbiAgICBcImVsc2VcIixcbiAgICBcImJyZWFrXCIsXG4gICAgXCJleHRlcm5cIixcbiAgICBcImFzbVwiLFxuICAgIFwiY2FzZVwiLFxuICAgIFwiZGVmYXVsdFwiLFxuICAgIFwicmVnaXN0ZXJcIixcbiAgICBcImV4cGxpY2l0XCIsXG4gICAgXCJ0eXBlbmFtZVwiLFxuICAgIFwic3dpdGNoXCIsXG4gICAgXCJjb250aW51ZVwiLFxuICAgIFwiaW5saW5lXCIsXG4gICAgXCJyZWFkb25seVwiLFxuICAgIFwiYXNzaWduXCIsXG4gICAgXCJyZWFkd3JpdGVcIixcbiAgICBcInNlbGZcIixcbiAgICBcIkBzeW5jaHJvbml6ZWRcIixcbiAgICBcImlkXCIsXG4gICAgXCJ0eXBlb2ZcIixcbiAgICBcIm5vbmF0b21pY1wiLFxuICAgIFwiSUJPdXRsZXRcIixcbiAgICBcIklCQWN0aW9uXCIsXG4gICAgXCJzdHJvbmdcIixcbiAgICBcIndlYWtcIixcbiAgICBcImNvcHlcIixcbiAgICBcImluXCIsXG4gICAgXCJvdXRcIixcbiAgICBcImlub3V0XCIsXG4gICAgXCJieWNvcHlcIixcbiAgICBcImJ5cmVmXCIsXG4gICAgXCJvbmV3YXlcIixcbiAgICBcIl9fc3Ryb25nXCIsXG4gICAgXCJfX3dlYWtcIixcbiAgICBcIl9fYmxvY2tcIixcbiAgICBcIl9fYXV0b3JlbGVhc2luZ1wiLFxuICAgIFwiQHByaXZhdGVcIixcbiAgICBcIkBwcm90ZWN0ZWRcIixcbiAgICBcIkBwdWJsaWNcIixcbiAgICBcIkB0cnlcIixcbiAgICBcIkBwcm9wZXJ0eVwiLFxuICAgIFwiQGVuZFwiLFxuICAgIFwiQHRocm93XCIsXG4gICAgXCJAY2F0Y2hcIixcbiAgICBcIkBmaW5hbGx5XCIsXG4gICAgXCJAYXV0b3JlbGVhc2Vwb29sXCIsXG4gICAgXCJAc3ludGhlc2l6ZVwiLFxuICAgIFwiQGR5bmFtaWNcIixcbiAgICBcIkBzZWxlY3RvclwiLFxuICAgIFwiQG9wdGlvbmFsXCIsXG4gICAgXCJAcmVxdWlyZWRcIixcbiAgICBcIkBlbmNvZGVcIixcbiAgICBcIkBwYWNrYWdlXCIsXG4gICAgXCJAaW1wb3J0XCIsXG4gICAgXCJAZGVmc1wiLFxuICAgIFwiQGNvbXBhdGliaWxpdHlfYWxpYXNcIixcbiAgICBcIl9fYnJpZGdlXCIsXG4gICAgXCJfX2JyaWRnZV90cmFuc2ZlclwiLFxuICAgIFwiX19icmlkZ2VfcmV0YWluZWRcIixcbiAgICBcIl9fYnJpZGdlX3JldGFpblwiLFxuICAgIFwiX19jb3ZhcmlhbnRcIixcbiAgICBcIl9fY29udHJhdmFyaWFudFwiLFxuICAgIFwiX19raW5kb2ZcIixcbiAgICBcIl9Ob25udWxsXCIsXG4gICAgXCJfTnVsbGFibGVcIixcbiAgICBcIl9OdWxsX3Vuc3BlY2lmaWVkXCIsXG4gICAgXCJfX0ZVTkNUSU9OX19cIixcbiAgICBcIl9fUFJFVFRZX0ZVTkNUSU9OX19cIixcbiAgICBcIl9fYXR0cmlidXRlX19cIixcbiAgICBcImdldHRlclwiLFxuICAgIFwic2V0dGVyXCIsXG4gICAgXCJyZXRhaW5cIixcbiAgICBcInVuc2FmZV91bnJldGFpbmVkXCIsXG4gICAgXCJub25udWxsXCIsXG4gICAgXCJudWxsYWJsZVwiLFxuICAgIFwibnVsbF91bnNwZWNpZmllZFwiLFxuICAgIFwibnVsbF9yZXNldHRhYmxlXCIsXG4gICAgXCJjbGFzc1wiLFxuICAgIFwiaW5zdGFuY2V0eXBlXCIsXG4gICAgXCJOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSXCIsXG4gICAgXCJOU19VTkFWQUlMQUJMRVwiLFxuICAgIFwiTlNfUkVRVUlSRVNfU1VQRVJcIixcbiAgICBcIk5TX1JFVFVSTlNfSU5ORVJfUE9JTlRFUlwiLFxuICAgIFwiTlNfSU5MSU5FXCIsXG4gICAgXCJOU19BVkFJTEFCTEVcIixcbiAgICBcIk5TX0RFUFJFQ0FURURcIixcbiAgICBcIk5TX0VOVU1cIixcbiAgICBcIk5TX09QVElPTlNcIixcbiAgICBcIk5TX1NXSUZUX1VOQVZBSUxBQkxFXCIsXG4gICAgXCJOU19BU1NVTUVfTk9OTlVMTF9CRUdJTlwiLFxuICAgIFwiTlNfQVNTVU1FX05PTk5VTExfRU5EXCIsXG4gICAgXCJOU19SRUZJTkVEX0ZPUl9TV0lGVFwiLFxuICAgIFwiTlNfU1dJRlRfTkFNRVwiLFxuICAgIFwiTlNfU1dJRlRfTk9USFJPV1wiLFxuICAgIFwiTlNfRFVSSU5HXCIsXG4gICAgXCJOU19IQU5ETEVSXCIsXG4gICAgXCJOU19FTkRIQU5ETEVSXCIsXG4gICAgXCJOU19WQUxVRVJFVFVSTlwiLFxuICAgIFwiTlNfVk9JRFJFVFVSTlwiXG4gIF07XG4gIGNvbnN0IExJVEVSQUxTID0gW1xuICAgIFwiZmFsc2VcIixcbiAgICBcInRydWVcIixcbiAgICBcIkZBTFNFXCIsXG4gICAgXCJUUlVFXCIsXG4gICAgXCJuaWxcIixcbiAgICBcIllFU1wiLFxuICAgIFwiTk9cIixcbiAgICBcIk5VTExcIlxuICBdO1xuICBjb25zdCBCVUlMVF9JTlMgPSBbXG4gICAgXCJkaXNwYXRjaF9vbmNlX3RcIixcbiAgICBcImRpc3BhdGNoX3F1ZXVlX3RcIixcbiAgICBcImRpc3BhdGNoX3N5bmNcIixcbiAgICBcImRpc3BhdGNoX2FzeW5jXCIsXG4gICAgXCJkaXNwYXRjaF9vbmNlXCJcbiAgXTtcbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAgXCJ2YXJpYWJsZS5sYW5ndWFnZVwiOiBbXG4gICAgICBcInRoaXNcIixcbiAgICAgIFwic3VwZXJcIlxuICAgIF0sXG4gICAgJHBhdHRlcm46IElERU5USUZJRVJfUkUsXG4gICAga2V5d29yZDogS1dTLFxuICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgIGJ1aWx0X2luOiBCVUlMVF9JTlMsXG4gICAgdHlwZTogVFlQRVNcbiAgfTtcbiAgY29uc3QgQ0xBU1NfS0VZV09SRFMgPSB7XG4gICAgJHBhdHRlcm46IElERU5USUZJRVJfUkUsXG4gICAga2V5d29yZDogW1xuICAgICAgXCJAaW50ZXJmYWNlXCIsXG4gICAgICBcIkBjbGFzc1wiLFxuICAgICAgXCJAcHJvdG9jb2xcIixcbiAgICAgIFwiQGltcGxlbWVudGF0aW9uXCJcbiAgICBdXG4gIH07XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ09iamVjdGl2ZS1DJyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAnbW0nLFxuICAgICAgJ29iamMnLFxuICAgICAgJ29iai1jJyxcbiAgICAgICdvYmotYysrJyxcbiAgICAgICdvYmplY3RpdmUtYysrJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6ICc8LycsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEFQSV9DTEFTUyxcbiAgICAgIGhsanMuQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfTlVNQkVSX01PREUsXG4gICAgICBobGpzLlFVT1RFX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnQFwiJyxcbiAgICAgICAgICAgIGVuZDogJ1wiJyxcbiAgICAgICAgICAgIGlsbGVnYWw6ICdcXFxcbicsXG4gICAgICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAvI1xccypbYS16XStcXGIvLFxuICAgICAgICBlbmQ6IC8kLyxcbiAgICAgICAga2V5d29yZHM6IHsga2V5d29yZDpcbiAgICAgICAgICAgICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSAnXG4gICAgICAgICAgICArICdwcmFnbWEgaWZkZWYgaWZuZGVmIGluY2x1ZGUnIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46IC9cXFxcXFxuLyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHsgY2xhc3NOYW1lOiAnc3RyaW5nJyB9KSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgYmVnaW46IC88Lio/Pi8sXG4gICAgICAgICAgICBlbmQ6IC8kLyxcbiAgICAgICAgICAgIGlsbGVnYWw6ICdcXFxcbidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhsanMuQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2NsYXNzJyxcbiAgICAgICAgYmVnaW46ICcoJyArIENMQVNTX0tFWVdPUkRTLmtleXdvcmQuam9pbignfCcpICsgJylcXFxcYicsXG4gICAgICAgIGVuZDogLyhcXHt8JCkvLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogQ0xBU1NfS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnXFxcXC4nICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IG9iamVjdGl2ZWMgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogUGVybFxuQXV0aG9yOiBQZXRlciBMZW9ub3YgPGdvanBlZ0B5YW5kZXgucnU+XG5XZWJzaXRlOiBodHRwczovL3d3dy5wZXJsLm9yZ1xuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIHBlcmwoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIGNvbnN0IEtFWVdPUkRTID0gW1xuICAgICdhYnMnLFxuICAgICdhY2NlcHQnLFxuICAgICdhbGFybScsXG4gICAgJ2FuZCcsXG4gICAgJ2F0YW4yJyxcbiAgICAnYmluZCcsXG4gICAgJ2Jpbm1vZGUnLFxuICAgICdibGVzcycsXG4gICAgJ2JyZWFrJyxcbiAgICAnY2FsbGVyJyxcbiAgICAnY2hkaXInLFxuICAgICdjaG1vZCcsXG4gICAgJ2Nob21wJyxcbiAgICAnY2hvcCcsXG4gICAgJ2Nob3duJyxcbiAgICAnY2hyJyxcbiAgICAnY2hyb290JyxcbiAgICAnY2xvc2UnLFxuICAgICdjbG9zZWRpcicsXG4gICAgJ2Nvbm5lY3QnLFxuICAgICdjb250aW51ZScsXG4gICAgJ2NvcycsXG4gICAgJ2NyeXB0JyxcbiAgICAnZGJtY2xvc2UnLFxuICAgICdkYm1vcGVuJyxcbiAgICAnZGVmaW5lZCcsXG4gICAgJ2RlbGV0ZScsXG4gICAgJ2RpZScsXG4gICAgJ2RvJyxcbiAgICAnZHVtcCcsXG4gICAgJ2VhY2gnLFxuICAgICdlbHNlJyxcbiAgICAnZWxzaWYnLFxuICAgICdlbmRncmVudCcsXG4gICAgJ2VuZGhvc3RlbnQnLFxuICAgICdlbmRuZXRlbnQnLFxuICAgICdlbmRwcm90b2VudCcsXG4gICAgJ2VuZHB3ZW50JyxcbiAgICAnZW5kc2VydmVudCcsXG4gICAgJ2VvZicsXG4gICAgJ2V2YWwnLFxuICAgICdleGVjJyxcbiAgICAnZXhpc3RzJyxcbiAgICAnZXhpdCcsXG4gICAgJ2V4cCcsXG4gICAgJ2ZjbnRsJyxcbiAgICAnZmlsZW5vJyxcbiAgICAnZmxvY2snLFxuICAgICdmb3InLFxuICAgICdmb3JlYWNoJyxcbiAgICAnZm9yaycsXG4gICAgJ2Zvcm1hdCcsXG4gICAgJ2Zvcm1saW5lJyxcbiAgICAnZ2V0YycsXG4gICAgJ2dldGdyZW50JyxcbiAgICAnZ2V0Z3JnaWQnLFxuICAgICdnZXRncm5hbScsXG4gICAgJ2dldGhvc3RieWFkZHInLFxuICAgICdnZXRob3N0YnluYW1lJyxcbiAgICAnZ2V0aG9zdGVudCcsXG4gICAgJ2dldGxvZ2luJyxcbiAgICAnZ2V0bmV0YnlhZGRyJyxcbiAgICAnZ2V0bmV0YnluYW1lJyxcbiAgICAnZ2V0bmV0ZW50JyxcbiAgICAnZ2V0cGVlcm5hbWUnLFxuICAgICdnZXRwZ3JwJyxcbiAgICAnZ2V0cHJpb3JpdHknLFxuICAgICdnZXRwcm90b2J5bmFtZScsXG4gICAgJ2dldHByb3RvYnludW1iZXInLFxuICAgICdnZXRwcm90b2VudCcsXG4gICAgJ2dldHB3ZW50JyxcbiAgICAnZ2V0cHduYW0nLFxuICAgICdnZXRwd3VpZCcsXG4gICAgJ2dldHNlcnZieW5hbWUnLFxuICAgICdnZXRzZXJ2Ynlwb3J0JyxcbiAgICAnZ2V0c2VydmVudCcsXG4gICAgJ2dldHNvY2tuYW1lJyxcbiAgICAnZ2V0c29ja29wdCcsXG4gICAgJ2dpdmVuJyxcbiAgICAnZ2xvYicsXG4gICAgJ2dtdGltZScsXG4gICAgJ2dvdG8nLFxuICAgICdncmVwJyxcbiAgICAnZ3QnLFxuICAgICdoZXgnLFxuICAgICdpZicsXG4gICAgJ2luZGV4JyxcbiAgICAnaW50JyxcbiAgICAnaW9jdGwnLFxuICAgICdqb2luJyxcbiAgICAna2V5cycsXG4gICAgJ2tpbGwnLFxuICAgICdsYXN0JyxcbiAgICAnbGMnLFxuICAgICdsY2ZpcnN0JyxcbiAgICAnbGVuZ3RoJyxcbiAgICAnbGluaycsXG4gICAgJ2xpc3RlbicsXG4gICAgJ2xvY2FsJyxcbiAgICAnbG9jYWx0aW1lJyxcbiAgICAnbG9nJyxcbiAgICAnbHN0YXQnLFxuICAgICdsdCcsXG4gICAgJ21hJyxcbiAgICAnbWFwJyxcbiAgICAnbWtkaXInLFxuICAgICdtc2djdGwnLFxuICAgICdtc2dnZXQnLFxuICAgICdtc2dyY3YnLFxuICAgICdtc2dzbmQnLFxuICAgICdteScsXG4gICAgJ25lJyxcbiAgICAnbmV4dCcsXG4gICAgJ25vJyxcbiAgICAnbm90JyxcbiAgICAnb2N0JyxcbiAgICAnb3BlbicsXG4gICAgJ29wZW5kaXInLFxuICAgICdvcicsXG4gICAgJ29yZCcsXG4gICAgJ291cicsXG4gICAgJ3BhY2snLFxuICAgICdwYWNrYWdlJyxcbiAgICAncGlwZScsXG4gICAgJ3BvcCcsXG4gICAgJ3BvcycsXG4gICAgJ3ByaW50JyxcbiAgICAncHJpbnRmJyxcbiAgICAncHJvdG90eXBlJyxcbiAgICAncHVzaCcsXG4gICAgJ3F8MCcsXG4gICAgJ3FxJyxcbiAgICAncXVvdGVtZXRhJyxcbiAgICAncXcnLFxuICAgICdxeCcsXG4gICAgJ3JhbmQnLFxuICAgICdyZWFkJyxcbiAgICAncmVhZGRpcicsXG4gICAgJ3JlYWRsaW5lJyxcbiAgICAncmVhZGxpbmsnLFxuICAgICdyZWFkcGlwZScsXG4gICAgJ3JlY3YnLFxuICAgICdyZWRvJyxcbiAgICAncmVmJyxcbiAgICAncmVuYW1lJyxcbiAgICAncmVxdWlyZScsXG4gICAgJ3Jlc2V0JyxcbiAgICAncmV0dXJuJyxcbiAgICAncmV2ZXJzZScsXG4gICAgJ3Jld2luZGRpcicsXG4gICAgJ3JpbmRleCcsXG4gICAgJ3JtZGlyJyxcbiAgICAnc2F5JyxcbiAgICAnc2NhbGFyJyxcbiAgICAnc2VlaycsXG4gICAgJ3NlZWtkaXInLFxuICAgICdzZWxlY3QnLFxuICAgICdzZW1jdGwnLFxuICAgICdzZW1nZXQnLFxuICAgICdzZW1vcCcsXG4gICAgJ3NlbmQnLFxuICAgICdzZXRncmVudCcsXG4gICAgJ3NldGhvc3RlbnQnLFxuICAgICdzZXRuZXRlbnQnLFxuICAgICdzZXRwZ3JwJyxcbiAgICAnc2V0cHJpb3JpdHknLFxuICAgICdzZXRwcm90b2VudCcsXG4gICAgJ3NldHB3ZW50JyxcbiAgICAnc2V0c2VydmVudCcsXG4gICAgJ3NldHNvY2tvcHQnLFxuICAgICdzaGlmdCcsXG4gICAgJ3NobWN0bCcsXG4gICAgJ3NobWdldCcsXG4gICAgJ3NobXJlYWQnLFxuICAgICdzaG13cml0ZScsXG4gICAgJ3NodXRkb3duJyxcbiAgICAnc2luJyxcbiAgICAnc2xlZXAnLFxuICAgICdzb2NrZXQnLFxuICAgICdzb2NrZXRwYWlyJyxcbiAgICAnc29ydCcsXG4gICAgJ3NwbGljZScsXG4gICAgJ3NwbGl0JyxcbiAgICAnc3ByaW50ZicsXG4gICAgJ3NxcnQnLFxuICAgICdzcmFuZCcsXG4gICAgJ3N0YXQnLFxuICAgICdzdGF0ZScsXG4gICAgJ3N0dWR5JyxcbiAgICAnc3ViJyxcbiAgICAnc3Vic3RyJyxcbiAgICAnc3ltbGluaycsXG4gICAgJ3N5c2NhbGwnLFxuICAgICdzeXNvcGVuJyxcbiAgICAnc3lzcmVhZCcsXG4gICAgJ3N5c3NlZWsnLFxuICAgICdzeXN0ZW0nLFxuICAgICdzeXN3cml0ZScsXG4gICAgJ3RlbGwnLFxuICAgICd0ZWxsZGlyJyxcbiAgICAndGllJyxcbiAgICAndGllZCcsXG4gICAgJ3RpbWUnLFxuICAgICd0aW1lcycsXG4gICAgJ3RyJyxcbiAgICAndHJ1bmNhdGUnLFxuICAgICd1YycsXG4gICAgJ3VjZmlyc3QnLFxuICAgICd1bWFzaycsXG4gICAgJ3VuZGVmJyxcbiAgICAndW5sZXNzJyxcbiAgICAndW5saW5rJyxcbiAgICAndW5wYWNrJyxcbiAgICAndW5zaGlmdCcsXG4gICAgJ3VudGllJyxcbiAgICAndW50aWwnLFxuICAgICd1c2UnLFxuICAgICd1dGltZScsXG4gICAgJ3ZhbHVlcycsXG4gICAgJ3ZlYycsXG4gICAgJ3dhaXQnLFxuICAgICd3YWl0cGlkJyxcbiAgICAnd2FudGFycmF5JyxcbiAgICAnd2FybicsXG4gICAgJ3doZW4nLFxuICAgICd3aGlsZScsXG4gICAgJ3dyaXRlJyxcbiAgICAneHwwJyxcbiAgICAneG9yJyxcbiAgICAneXwwJ1xuICBdO1xuXG4gIC8vIGh0dHBzOi8vcGVybGRvYy5wZXJsLm9yZy9wZXJscmUjTW9kaWZpZXJzXG4gIGNvbnN0IFJFR0VYX01PRElGSUVSUyA9IC9bZHVhbHhtc2lwbmdyXXswLDEyfS87IC8vIGFhIGFuZCB4eCBhcmUgdmFsaWQsIG1ha2luZyBtYXggbGVuZ3RoIDEyXG4gIGNvbnN0IFBFUkxfS0VZV09SRFMgPSB7XG4gICAgJHBhdHRlcm46IC9bXFx3Ll0rLyxcbiAgICBrZXl3b3JkOiBLRVlXT1JEUy5qb2luKFwiIFwiKVxuICB9O1xuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46ICdbJEBdXFxcXHsnLFxuICAgIGVuZDogJ1xcXFx9JyxcbiAgICBrZXl3b3JkczogUEVSTF9LRVlXT1JEU1xuICB9O1xuICBjb25zdCBNRVRIT0QgPSB7XG4gICAgYmVnaW46IC8tPlxcey8sXG4gICAgZW5kOiAvXFx9L1xuICAgIC8vIGNvbnRhaW5zIGRlZmluZWQgbGF0ZXJcbiAgfTtcbiAgY29uc3QgVkFSID0geyB2YXJpYW50czogW1xuICAgIHsgYmVnaW46IC9cXCRcXGQvIH0sXG4gICAgeyBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1skJUBdKFxcXlxcd1xcYnwjXFx3Kyg6OlxcdyspKnxcXHtcXHcrXFx9fFxcdysoOjpcXHcqKSopLyxcbiAgICAgIC8vIG5lZ2F0aXZlIGxvb2stYWhlYWQgdHJpZXMgdG8gYXZvaWQgbWF0Y2hpbmcgcGF0dGVybnMgdGhhdCBhcmUgbm90XG4gICAgICAvLyBQZXJsIGF0IGFsbCBsaWtlICRpZGVudCQsIEBpZGVudEAsIGV0Yy5cbiAgICAgIGAoPyFbQS1aYS16XSkoPyFbQCQlXSlgXG4gICAgKSB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiAvWyQlQF1bXlxcc1xcd3tdLyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH1cbiAgXSB9O1xuICBjb25zdCBTVFJJTkdfQ09OVEFJTlMgPSBbXG4gICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgIFNVQlNULFxuICAgIFZBUlxuICBdO1xuICBjb25zdCBSRUdFWF9ERUxJTVMgPSBbXG4gICAgLyEvLFxuICAgIC9cXC8vLFxuICAgIC9cXHwvLFxuICAgIC9cXD8vLFxuICAgIC8nLyxcbiAgICAvXCIvLCAvLyB2YWxpZCBidXQgaW5mcmVxdWVudCBhbmQgd2VpcmRcbiAgICAvIy8gLy8gdmFsaWQgYnV0IGluZnJlcXVlbnQgYW5kIHdlaXJkXG4gIF07XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IG9wZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8UmVnRXhwfSBjbG9zZVxuICAgKi9cbiAgY29uc3QgUEFJUkVEX0RPVUJMRV9SRSA9IChwcmVmaXgsIG9wZW4sIGNsb3NlID0gJ1xcXFwxJykgPT4ge1xuICAgIGNvbnN0IG1pZGRsZSA9IChjbG9zZSA9PT0gJ1xcXFwxJylcbiAgICAgID8gY2xvc2VcbiAgICAgIDogcmVnZXguY29uY2F0KGNsb3NlLCBvcGVuKTtcbiAgICByZXR1cm4gcmVnZXguY29uY2F0KFxuICAgICAgcmVnZXguY29uY2F0KFwiKD86XCIsIHByZWZpeCwgXCIpXCIpLFxuICAgICAgb3BlbixcbiAgICAgIC8oPzpcXFxcLnxbXlxcXFxcXC9dKSo/LyxcbiAgICAgIG1pZGRsZSxcbiAgICAgIC8oPzpcXFxcLnxbXlxcXFxcXC9dKSo/LyxcbiAgICAgIGNsb3NlLFxuICAgICAgUkVHRVhfTU9ESUZJRVJTXG4gICAgKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gb3BlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IGNsb3NlXG4gICAqL1xuICBjb25zdCBQQUlSRURfUkUgPSAocHJlZml4LCBvcGVuLCBjbG9zZSkgPT4ge1xuICAgIHJldHVybiByZWdleC5jb25jYXQoXG4gICAgICByZWdleC5jb25jYXQoXCIoPzpcIiwgcHJlZml4LCBcIilcIiksXG4gICAgICBvcGVuLFxuICAgICAgLyg/OlxcXFwufFteXFxcXFxcL10pKj8vLFxuICAgICAgY2xvc2UsXG4gICAgICBSRUdFWF9NT0RJRklFUlNcbiAgICApO1xuICB9O1xuICBjb25zdCBQRVJMX0RFRkFVTFRfQ09OVEFJTlMgPSBbXG4gICAgVkFSLFxuICAgIGhsanMuSEFTSF9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DT01NRU5UKFxuICAgICAgL149XFx3LyxcbiAgICAgIC89Y3V0LyxcbiAgICAgIHsgZW5kc1dpdGhQYXJlbnQ6IHRydWUgfVxuICAgICksXG4gICAgTUVUSE9ELFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICBjb250YWluczogU1RSSU5HX0NPTlRBSU5TLFxuICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAncVtxd3hyXT9cXFxccypcXFxcKCcsXG4gICAgICAgICAgZW5kOiAnXFxcXCknLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdxW3F3eHJdP1xcXFxzKlxcXFxbJyxcbiAgICAgICAgICBlbmQ6ICdcXFxcXScsXG4gICAgICAgICAgcmVsZXZhbmNlOiA1XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBiZWdpbjogJ3FbcXd4cl0/XFxcXHMqXFxcXHsnLFxuICAgICAgICAgIGVuZDogJ1xcXFx9JyxcbiAgICAgICAgICByZWxldmFuY2U6IDVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAncVtxd3hyXT9cXFxccypcXFxcfCcsXG4gICAgICAgICAgZW5kOiAnXFxcXHwnLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdxW3F3eHJdP1xcXFxzKjwnLFxuICAgICAgICAgIGVuZDogJz4nLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdxd1xcXFxzK3EnLFxuICAgICAgICAgIGVuZDogJ3EnLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdcXCcnLFxuICAgICAgICAgIGVuZDogJ1xcJycsXG4gICAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAnXCInLFxuICAgICAgICAgIGVuZDogJ1wiJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdgJyxcbiAgICAgICAgICBlbmQ6ICdgJyxcbiAgICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46IC9cXHtcXHcrXFx9LyxcbiAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAnLT9cXFxcdytcXFxccyo9PicsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogJyhcXFxcYjBbMC03X10rKXwoXFxcXGIweFswLTlhLWZBLUZfXSspfChcXFxcYlsxLTldWzAtOV9dKihcXFxcLlswLTlfXSspPyl8WzBfXVxcXFxiJyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgeyAvLyByZWdleHAgY29udGFpbmVyXG4gICAgICBiZWdpbjogJyhcXFxcL1xcXFwvfCcgKyBobGpzLlJFX1NUQVJURVJTX1JFICsgJ3xcXFxcYihzcGxpdHxyZXR1cm58cHJpbnR8cmV2ZXJzZXxncmVwKVxcXFxiKVxcXFxzKicsXG4gICAgICBrZXl3b3JkczogJ3NwbGl0IHJldHVybiBwcmludCByZXZlcnNlIGdyZXAnLFxuICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3JlZ2V4cCcsXG4gICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgIC8vIGFsbG93IG1hdGNoaW5nIGNvbW1vbiBkZWxpbWl0ZXJzXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfRE9VQkxFX1JFKFwic3x0cnx5XCIsIHJlZ2V4LmVpdGhlciguLi5SRUdFWF9ERUxJTVMsIHsgY2FwdHVyZTogdHJ1ZSB9KSkgfSxcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIHBhaXJlZCBkZWxtaXNcbiAgICAgICAgICAgIHsgYmVnaW46IFBBSVJFRF9ET1VCTEVfUkUoXCJzfHRyfHlcIiwgXCJcXFxcKFwiLCBcIlxcXFwpXCIpIH0sXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfRE9VQkxFX1JFKFwic3x0cnx5XCIsIFwiXFxcXFtcIiwgXCJcXFxcXVwiKSB9LFxuICAgICAgICAgICAgeyBiZWdpbjogUEFJUkVEX0RPVUJMRV9SRShcInN8dHJ8eVwiLCBcIlxcXFx7XCIsIFwiXFxcXH1cIikgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVsZXZhbmNlOiAyXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZWdleHAnLFxuICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIGNvdWxkIGJlIGEgY29tbWVudCBpbiBtYW55IGxhbmd1YWdlcyBzbyBkbyBub3QgY291bnRcbiAgICAgICAgICAgICAgLy8gYXMgcmVsZXZhbnRcbiAgICAgICAgICAgICAgYmVnaW46IC8obXxxcilcXC9cXC8vLFxuICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBwcmVmaXggaXMgb3B0aW9uYWwgd2l0aCAvcmVnZXgvXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfUkUoXCIoPzptfHFyKT9cIiwgL1xcLy8sIC9cXC8vKSB9LFxuICAgICAgICAgICAgLy8gYWxsb3cgbWF0Y2hpbmcgY29tbW9uIGRlbGltaXRlcnNcbiAgICAgICAgICAgIHsgYmVnaW46IFBBSVJFRF9SRShcIm18cXJcIiwgcmVnZXguZWl0aGVyKC4uLlJFR0VYX0RFTElNUywgeyBjYXB0dXJlOiB0cnVlIH0pLCAvXFwxLykgfSxcbiAgICAgICAgICAgIC8vIGFsbG93IGNvbW1vbiBwYWlyZWQgZGVsbWluc1xuICAgICAgICAgICAgeyBiZWdpbjogUEFJUkVEX1JFKFwibXxxclwiLCAvXFwoLywgL1xcKS8pIH0sXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfUkUoXCJtfHFyXCIsIC9cXFsvLCAvXFxdLykgfSxcbiAgICAgICAgICAgIHsgYmVnaW46IFBBSVJFRF9SRShcIm18cXJcIiwgL1xcey8sIC9cXH0vKSB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgICBiZWdpbktleXdvcmRzOiAnc3ViJyxcbiAgICAgIGVuZDogJyhcXFxccypcXFxcKC4qP1xcXFwpKT9bO3tdJyxcbiAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICByZWxldmFuY2U6IDUsXG4gICAgICBjb250YWluczogWyBobGpzLlRJVExFX01PREUgXVxuICAgIH0sXG4gICAge1xuICAgICAgYmVnaW46ICctXFxcXHdcXFxcYicsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiBcIl5fX0RBVEFfXyRcIixcbiAgICAgIGVuZDogXCJeX19FTkRfXyRcIixcbiAgICAgIHN1Ykxhbmd1YWdlOiAnbW9qb2xpY2lvdXMnLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiBcIl5AQC4qXCIsXG4gICAgICAgICAgZW5kOiBcIiRcIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiY29tbWVudFwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIF07XG4gIFNVQlNULmNvbnRhaW5zID0gUEVSTF9ERUZBVUxUX0NPTlRBSU5TO1xuICBNRVRIT0QuY29udGFpbnMgPSBQRVJMX0RFRkFVTFRfQ09OVEFJTlM7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnUGVybCcsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ3BsJyxcbiAgICAgICdwbSdcbiAgICBdLFxuICAgIGtleXdvcmRzOiBQRVJMX0tFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBQRVJMX0RFRkFVTFRfQ09OVEFJTlNcbiAgfTtcbn1cblxuZXhwb3J0IHsgcGVybCBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBQSFBcbkF1dGhvcjogVmljdG9yIEthcmFtemluIDxWaWN0b3IuS2FyYW16aW5AZW50ZXJyYS1pbmMuY29tPlxuQ29udHJpYnV0b3JzOiBFdmdlbnkgU3RlcGFuaXNjaGV2IDxpbWJvbGtAZ21haWwuY29tPiwgSXZhbiBTYWdhbGFldiA8bWFuaWFjQHNvZnR3YXJlbWFuaWFjcy5vcmc+XG5XZWJzaXRlOiBodHRwczovL3d3dy5waHAubmV0XG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG4vKipcbiAqIEBwYXJhbSB7SExKU0FwaX0gaGxqc1xuICogQHJldHVybnMge0xhbmd1YWdlRGV0YWlsfVxuICogKi9cbmZ1bmN0aW9uIHBocChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLy8gbmVnYXRpdmUgbG9vay1haGVhZCB0cmllcyB0byBhdm9pZCBtYXRjaGluZyBwYXR0ZXJucyB0aGF0IGFyZSBub3RcbiAgLy8gUGVybCBhdCBhbGwgbGlrZSAkaWRlbnQkLCBAaWRlbnRALCBldGMuXG4gIGNvbnN0IE5PVF9QRVJMX0VUQyA9IC8oPyFbQS1aYS16MC05XSkoPyFbJF0pLztcbiAgY29uc3QgSURFTlRfUkUgPSByZWdleC5jb25jYXQoXG4gICAgL1thLXpBLVpfXFx4N2YtXFx4ZmZdW2EtekEtWjAtOV9cXHg3Zi1cXHhmZl0qLyxcbiAgICBOT1RfUEVSTF9FVEMpO1xuICAvLyBXaWxsIG5vdCBkZXRlY3QgY2FtZWxDYXNlIGNsYXNzZXNcbiAgY29uc3QgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdChcbiAgICAvKFxcXFw/W0EtWl1bYS16MC05X1xceDdmLVxceGZmXSt8XFxcXD9bQS1aXSsoPz1bQS1aXVthLXowLTlfXFx4N2YtXFx4ZmZdKSl7MSx9LyxcbiAgICBOT1RfUEVSTF9FVEMpO1xuICBjb25zdCBWQVJJQUJMRSA9IHtcbiAgICBzY29wZTogJ3ZhcmlhYmxlJyxcbiAgICBtYXRjaDogJ1xcXFwkKycgKyBJREVOVF9SRSxcbiAgfTtcbiAgY29uc3QgUFJFUFJPQ0VTU09SID0ge1xuICAgIHNjb3BlOiAnbWV0YScsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgYmVnaW46IC88XFw/cGhwLywgcmVsZXZhbmNlOiAxMCB9LCAvLyBib29zdCBmb3Igb2J2aW91cyBQSFBcbiAgICAgIHsgYmVnaW46IC88XFw/PS8gfSxcbiAgICAgIC8vIGxlc3MgcmVsZXZhbnQgcGVyIFBTUi0xIHdoaWNoIHNheXMgbm90IHRvIHVzZSBzaG9ydC10YWdzXG4gICAgICB7IGJlZ2luOiAvPFxcPy8sIHJlbGV2YW5jZTogMC4xIH0sXG4gICAgICB7IGJlZ2luOiAvXFw/Pi8gfSAvLyBlbmQgcGhwIHRhZ1xuICAgIF1cbiAgfTtcbiAgY29uc3QgU1VCU1QgPSB7XG4gICAgc2NvcGU6ICdzdWJzdCcsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgYmVnaW46IC9cXCRcXHcrLyB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xce1xcJC8sXG4gICAgICAgIGVuZDogL1xcfS9cbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IFNJTkdMRV9RVU9URUQgPSBobGpzLmluaGVyaXQoaGxqcy5BUE9TX1NUUklOR19NT0RFLCB7IGlsbGVnYWw6IG51bGwsIH0pO1xuICBjb25zdCBET1VCTEVfUVVPVEVEID0gaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHtcbiAgICBpbGxlZ2FsOiBudWxsLFxuICAgIGNvbnRhaW5zOiBobGpzLlFVT1RFX1NUUklOR19NT0RFLmNvbnRhaW5zLmNvbmNhdChTVUJTVCksXG4gIH0pO1xuXG4gIGNvbnN0IEhFUkVET0MgPSB7XG4gICAgYmVnaW46IC88PDxbIFxcdF0qKD86KFxcdyspfFwiKFxcdyspXCIpXFxuLyxcbiAgICBlbmQ6IC9bIFxcdF0qKFxcdyspXFxiLyxcbiAgICBjb250YWluczogaGxqcy5RVU9URV9TVFJJTkdfTU9ERS5jb250YWlucy5jb25jYXQoU1VCU1QpLFxuICAgICdvbjpiZWdpbic6IChtLCByZXNwKSA9PiB7IHJlc3AuZGF0YS5fYmVnaW5NYXRjaCA9IG1bMV0gfHwgbVsyXTsgfSxcbiAgICAnb246ZW5kJzogKG0sIHJlc3ApID0+IHsgaWYgKHJlc3AuZGF0YS5fYmVnaW5NYXRjaCAhPT0gbVsxXSkgcmVzcC5pZ25vcmVNYXRjaCgpOyB9LFxuICB9O1xuXG4gIGNvbnN0IE5PV0RPQyA9IGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgIGJlZ2luOiAvPDw8WyBcXHRdKicoXFx3KyknXFxuLyxcbiAgICBlbmQ6IC9bIFxcdF0qKFxcdyspXFxiLyxcbiAgfSk7XG4gIC8vIGxpc3Qgb2YgdmFsaWQgd2hpdGVzcGFjZXMgYmVjYXVzZSBub24tYnJlYWtpbmcgc3BhY2UgbWlnaHQgYmUgcGFydCBvZiBhIElERU5UX1JFXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAnWyBcXHRcXG5dJztcbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIHNjb3BlOiAnc3RyaW5nJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgRE9VQkxFX1FVT1RFRCxcbiAgICAgIFNJTkdMRV9RVU9URUQsXG4gICAgICBIRVJFRE9DLFxuICAgICAgTk9XRE9DXG4gICAgXVxuICB9O1xuICBjb25zdCBOVU1CRVIgPSB7XG4gICAgc2NvcGU6ICdudW1iZXInLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiBgXFxcXGIwW2JCXVswMV0rKD86X1swMV0rKSpcXFxcYmAgfSwgLy8gQmluYXJ5IHcvIHVuZGVyc2NvcmUgc3VwcG9ydFxuICAgICAgeyBiZWdpbjogYFxcXFxiMFtvT11bMC03XSsoPzpfWzAtN10rKSpcXFxcYmAgfSwgLy8gT2N0YWxzIHcvIHVuZGVyc2NvcmUgc3VwcG9ydFxuICAgICAgeyBiZWdpbjogYFxcXFxiMFt4WF1bXFxcXGRhLWZBLUZdKyg/Ol9bXFxcXGRhLWZBLUZdKykqXFxcXGJgIH0sIC8vIEhleCB3LyB1bmRlcnNjb3JlIHN1cHBvcnRcbiAgICAgIC8vIERlY2ltYWxzIHcvIHVuZGVyc2NvcmUgc3VwcG9ydCwgd2l0aCBvcHRpb25hbCBmcmFnbWVudHMgYW5kIHNjaWVudGlmaWMgZXhwb25lbnQgKGUpIHN1ZmZpeC5cbiAgICAgIHsgYmVnaW46IGAoPzpcXFxcYlxcXFxkKyg/Ol9cXFxcZCspKihcXFxcLig/OlxcXFxkKyg/Ol9cXFxcZCspKikpP3xcXFxcQlxcXFwuXFxcXGQrKSg/OltlRV1bKy1dP1xcXFxkKyk/YCB9XG4gICAgXSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJmYWxzZVwiLFxuICAgIFwibnVsbFwiLFxuICAgIFwidHJ1ZVwiXG4gIF07XG4gIGNvbnN0IEtXUyA9IFtcbiAgICAvLyBNYWdpYyBjb25zdGFudHM6XG4gICAgLy8gPGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLmNvbnN0YW50cy5wcmVkZWZpbmVkLnBocD5cbiAgICBcIl9fQ0xBU1NfX1wiLFxuICAgIFwiX19ESVJfX1wiLFxuICAgIFwiX19GSUxFX19cIixcbiAgICBcIl9fRlVOQ1RJT05fX1wiLFxuICAgIFwiX19DT01QSUxFUl9IQUxUX09GRlNFVF9fXCIsXG4gICAgXCJfX0xJTkVfX1wiLFxuICAgIFwiX19NRVRIT0RfX1wiLFxuICAgIFwiX19OQU1FU1BBQ0VfX1wiLFxuICAgIFwiX19UUkFJVF9fXCIsXG4gICAgLy8gRnVuY3Rpb24gdGhhdCBsb29rIGxpa2UgbGFuZ3VhZ2UgY29uc3RydWN0IG9yIGxhbmd1YWdlIGNvbnN0cnVjdCB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbjpcbiAgICAvLyBMaXN0IG9mIGtleXdvcmRzIHRoYXQgbWF5IG5vdCByZXF1aXJlIHBhcmVudGhlc2lzXG4gICAgXCJkaWVcIixcbiAgICBcImVjaG9cIixcbiAgICBcImV4aXRcIixcbiAgICBcImluY2x1ZGVcIixcbiAgICBcImluY2x1ZGVfb25jZVwiLFxuICAgIFwicHJpbnRcIixcbiAgICBcInJlcXVpcmVcIixcbiAgICBcInJlcXVpcmVfb25jZVwiLFxuICAgIC8vIFRoZXNlIGFyZSBub3QgbGFuZ3VhZ2UgY29uc3RydWN0IChmdW5jdGlvbikgYnV0IG9wZXJhdGUgb24gdGhlIGN1cnJlbnRseS1leGVjdXRpbmcgZnVuY3Rpb24gYW5kIGNhbiBhY2Nlc3MgdGhlIGN1cnJlbnQgc3ltYm9sIHRhYmxlXG4gICAgLy8gJ2NvbXBhY3QgZXh0cmFjdCBmdW5jX2dldF9hcmcgZnVuY19nZXRfYXJncyBmdW5jX251bV9hcmdzIGdldF9jYWxsZWRfY2xhc3MgZ2V0X3BhcmVudF9jbGFzcyAnICtcbiAgICAvLyBPdGhlciBrZXl3b3JkczpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwPlxuICAgIC8vIDxodHRwczovL3d3dy5waHAubmV0L21hbnVhbC9lbi9sYW5ndWFnZS50eXBlcy50eXBlLWp1Z2dsaW5nLnBocD5cbiAgICBcImFycmF5XCIsXG4gICAgXCJhYnN0cmFjdFwiLFxuICAgIFwiYW5kXCIsXG4gICAgXCJhc1wiLFxuICAgIFwiYmluYXJ5XCIsXG4gICAgXCJib29sXCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJicmVha1wiLFxuICAgIFwiY2FsbGFibGVcIixcbiAgICBcImNhc2VcIixcbiAgICBcImNhdGNoXCIsXG4gICAgXCJjbGFzc1wiLFxuICAgIFwiY2xvbmVcIixcbiAgICBcImNvbnN0XCIsXG4gICAgXCJjb250aW51ZVwiLFxuICAgIFwiZGVjbGFyZVwiLFxuICAgIFwiZGVmYXVsdFwiLFxuICAgIFwiZG9cIixcbiAgICBcImRvdWJsZVwiLFxuICAgIFwiZWxzZVwiLFxuICAgIFwiZWxzZWlmXCIsXG4gICAgXCJlbXB0eVwiLFxuICAgIFwiZW5kZGVjbGFyZVwiLFxuICAgIFwiZW5kZm9yXCIsXG4gICAgXCJlbmRmb3JlYWNoXCIsXG4gICAgXCJlbmRpZlwiLFxuICAgIFwiZW5kc3dpdGNoXCIsXG4gICAgXCJlbmR3aGlsZVwiLFxuICAgIFwiZW51bVwiLFxuICAgIFwiZXZhbFwiLFxuICAgIFwiZXh0ZW5kc1wiLFxuICAgIFwiZmluYWxcIixcbiAgICBcImZpbmFsbHlcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJmb3JcIixcbiAgICBcImZvcmVhY2hcIixcbiAgICBcImZyb21cIixcbiAgICBcImdsb2JhbFwiLFxuICAgIFwiZ290b1wiLFxuICAgIFwiaWZcIixcbiAgICBcImltcGxlbWVudHNcIixcbiAgICBcImluc3RhbmNlb2ZcIixcbiAgICBcImluc3RlYWRvZlwiLFxuICAgIFwiaW50XCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJpbnRlcmZhY2VcIixcbiAgICBcImlzc2V0XCIsXG4gICAgXCJpdGVyYWJsZVwiLFxuICAgIFwibGlzdFwiLFxuICAgIFwibWF0Y2h8MFwiLFxuICAgIFwibWl4ZWRcIixcbiAgICBcIm5ld1wiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwib3JcIixcbiAgICBcInByaXZhdGVcIixcbiAgICBcInByb3RlY3RlZFwiLFxuICAgIFwicHVibGljXCIsXG4gICAgXCJyZWFkb25seVwiLFxuICAgIFwicmVhbFwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzdHJpbmdcIixcbiAgICBcInN3aXRjaFwiLFxuICAgIFwidGhyb3dcIixcbiAgICBcInRyYWl0XCIsXG4gICAgXCJ0cnlcIixcbiAgICBcInVuc2V0XCIsXG4gICAgXCJ1c2VcIixcbiAgICBcInZhclwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwid2hpbGVcIixcbiAgICBcInhvclwiLFxuICAgIFwieWllbGRcIlxuICBdO1xuXG4gIGNvbnN0IEJVSUxUX0lOUyA9IFtcbiAgICAvLyBTdGFuZGFyZCBQSFAgbGlicmFyeTpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5zcGwucGhwPlxuICAgIFwiRXJyb3J8MFwiLFxuICAgIFwiQXBwZW5kSXRlcmF0b3JcIixcbiAgICBcIkFyZ3VtZW50Q291bnRFcnJvclwiLFxuICAgIFwiQXJpdGhtZXRpY0Vycm9yXCIsXG4gICAgXCJBcnJheUl0ZXJhdG9yXCIsXG4gICAgXCJBcnJheU9iamVjdFwiLFxuICAgIFwiQXNzZXJ0aW9uRXJyb3JcIixcbiAgICBcIkJhZEZ1bmN0aW9uQ2FsbEV4Y2VwdGlvblwiLFxuICAgIFwiQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvblwiLFxuICAgIFwiQ2FjaGluZ0l0ZXJhdG9yXCIsXG4gICAgXCJDYWxsYmFja0ZpbHRlckl0ZXJhdG9yXCIsXG4gICAgXCJDb21waWxlRXJyb3JcIixcbiAgICBcIkNvdW50YWJsZVwiLFxuICAgIFwiRGlyZWN0b3J5SXRlcmF0b3JcIixcbiAgICBcIkRpdmlzaW9uQnlaZXJvRXJyb3JcIixcbiAgICBcIkRvbWFpbkV4Y2VwdGlvblwiLFxuICAgIFwiRW1wdHlJdGVyYXRvclwiLFxuICAgIFwiRXJyb3JFeGNlcHRpb25cIixcbiAgICBcIkV4Y2VwdGlvblwiLFxuICAgIFwiRmlsZXN5c3RlbUl0ZXJhdG9yXCIsXG4gICAgXCJGaWx0ZXJJdGVyYXRvclwiLFxuICAgIFwiR2xvYkl0ZXJhdG9yXCIsXG4gICAgXCJJbmZpbml0ZUl0ZXJhdG9yXCIsXG4gICAgXCJJbnZhbGlkQXJndW1lbnRFeGNlcHRpb25cIixcbiAgICBcIkl0ZXJhdG9ySXRlcmF0b3JcIixcbiAgICBcIkxlbmd0aEV4Y2VwdGlvblwiLFxuICAgIFwiTGltaXRJdGVyYXRvclwiLFxuICAgIFwiTG9naWNFeGNlcHRpb25cIixcbiAgICBcIk11bHRpcGxlSXRlcmF0b3JcIixcbiAgICBcIk5vUmV3aW5kSXRlcmF0b3JcIixcbiAgICBcIk91dE9mQm91bmRzRXhjZXB0aW9uXCIsXG4gICAgXCJPdXRPZlJhbmdlRXhjZXB0aW9uXCIsXG4gICAgXCJPdXRlckl0ZXJhdG9yXCIsXG4gICAgXCJPdmVyZmxvd0V4Y2VwdGlvblwiLFxuICAgIFwiUGFyZW50SXRlcmF0b3JcIixcbiAgICBcIlBhcnNlRXJyb3JcIixcbiAgICBcIlJhbmdlRXhjZXB0aW9uXCIsXG4gICAgXCJSZWN1cnNpdmVBcnJheUl0ZXJhdG9yXCIsXG4gICAgXCJSZWN1cnNpdmVDYWNoaW5nSXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZUNhbGxiYWNrRmlsdGVySXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yXCIsXG4gICAgXCJSZWN1cnNpdmVGaWx0ZXJJdGVyYXRvclwiLFxuICAgIFwiUmVjdXJzaXZlSXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZVJlZ2V4SXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZVRyZWVJdGVyYXRvclwiLFxuICAgIFwiUmVnZXhJdGVyYXRvclwiLFxuICAgIFwiUnVudGltZUV4Y2VwdGlvblwiLFxuICAgIFwiU2Vla2FibGVJdGVyYXRvclwiLFxuICAgIFwiU3BsRG91Ymx5TGlua2VkTGlzdFwiLFxuICAgIFwiU3BsRmlsZUluZm9cIixcbiAgICBcIlNwbEZpbGVPYmplY3RcIixcbiAgICBcIlNwbEZpeGVkQXJyYXlcIixcbiAgICBcIlNwbEhlYXBcIixcbiAgICBcIlNwbE1heEhlYXBcIixcbiAgICBcIlNwbE1pbkhlYXBcIixcbiAgICBcIlNwbE9iamVjdFN0b3JhZ2VcIixcbiAgICBcIlNwbE9ic2VydmVyXCIsXG4gICAgXCJTcGxQcmlvcml0eVF1ZXVlXCIsXG4gICAgXCJTcGxRdWV1ZVwiLFxuICAgIFwiU3BsU3RhY2tcIixcbiAgICBcIlNwbFN1YmplY3RcIixcbiAgICBcIlNwbFRlbXBGaWxlT2JqZWN0XCIsXG4gICAgXCJUeXBlRXJyb3JcIixcbiAgICBcIlVuZGVyZmxvd0V4Y2VwdGlvblwiLFxuICAgIFwiVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uXCIsXG4gICAgXCJVbmhhbmRsZWRNYXRjaEVycm9yXCIsXG4gICAgLy8gUmVzZXJ2ZWQgaW50ZXJmYWNlczpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQuaW50ZXJmYWNlcy5waHA+XG4gICAgXCJBcnJheUFjY2Vzc1wiLFxuICAgIFwiQmFja2VkRW51bVwiLFxuICAgIFwiQ2xvc3VyZVwiLFxuICAgIFwiRmliZXJcIixcbiAgICBcIkdlbmVyYXRvclwiLFxuICAgIFwiSXRlcmF0b3JcIixcbiAgICBcIkl0ZXJhdG9yQWdncmVnYXRlXCIsXG4gICAgXCJTZXJpYWxpemFibGVcIixcbiAgICBcIlN0cmluZ2FibGVcIixcbiAgICBcIlRocm93YWJsZVwiLFxuICAgIFwiVHJhdmVyc2FibGVcIixcbiAgICBcIlVuaXRFbnVtXCIsXG4gICAgXCJXZWFrUmVmZXJlbmNlXCIsXG4gICAgXCJXZWFrTWFwXCIsXG4gICAgLy8gUmVzZXJ2ZWQgY2xhc3NlczpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQuY2xhc3Nlcy5waHA+XG4gICAgXCJEaXJlY3RvcnlcIixcbiAgICBcIl9fUEhQX0luY29tcGxldGVfQ2xhc3NcIixcbiAgICBcInBhcmVudFwiLFxuICAgIFwicGhwX3VzZXJfZmlsdGVyXCIsXG4gICAgXCJzZWxmXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICBcInN0ZENsYXNzXCJcbiAgXTtcblxuICAvKiogRHVhbC1jYXNlIGtleXdvcmRzXG4gICAqXG4gICAqIFtcInRoZW5cIixcIkZJTEVcIl0gPT5cbiAgICogICAgIFtcInRoZW5cIiwgXCJUSEVOXCIsIFwiRklMRVwiLCBcImZpbGVcIl1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gaXRlbXMgKi9cbiAgY29uc3QgZHVhbENhc2UgPSAoaXRlbXMpID0+IHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgICBpZiAoaXRlbS50b0xvd2VyQ2FzZSgpID09PSBpdGVtKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0udG9VcHBlckNhc2UoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChpdGVtLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAga2V5d29yZDogS1dTLFxuICAgIGxpdGVyYWw6IGR1YWxDYXNlKExJVEVSQUxTKSxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TLFxuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBpdGVtcyAqL1xuICBjb25zdCBub3JtYWxpemVLZXl3b3JkcyA9IChpdGVtcykgPT4ge1xuICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gaXRlbS5yZXBsYWNlKC9cXHxcXGQrJC8sIFwiXCIpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IENPTlNUUlVDVE9SX0NBTEwgPSB7IHZhcmlhbnRzOiBbXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgL25ldy8sXG4gICAgICAgIHJlZ2V4LmNvbmNhdChXSElURVNQQUNFLCBcIitcIiksXG4gICAgICAgIC8vIHRvIHByZXZlbnQgYnVpbHQgaW5zIGZyb20gYmVpbmcgY29uZnVzZWQgYXMgdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGNhbGxcbiAgICAgICAgcmVnZXguY29uY2F0KFwiKD8hXCIsIG5vcm1hbGl6ZUtleXdvcmRzKEJVSUxUX0lOUykuam9pbihcIlxcXFxifFwiKSwgXCJcXFxcYilcIiksXG4gICAgICAgIFBBU0NBTF9DQVNFX0NMQVNTX05BTUVfUkUsXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHtcbiAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgIDQ6IFwidGl0bGUuY2xhc3NcIixcbiAgICAgIH0sXG4gICAgfVxuICBdIH07XG5cbiAgY29uc3QgQ09OU1RBTlRfUkVGRVJFTkNFID0gcmVnZXguY29uY2F0KElERU5UX1JFLCBcIlxcXFxiKD8hXFxcXCgpXCIpO1xuXG4gIGNvbnN0IExFRlRfQU5EX1JJR0hUX1NJREVfT0ZfRE9VQkxFX0NPTE9OID0geyB2YXJpYW50czogW1xuICAgIHtcbiAgICAgIG1hdGNoOiBbXG4gICAgICAgIHJlZ2V4LmNvbmNhdChcbiAgICAgICAgICAvOjovLFxuICAgICAgICAgIHJlZ2V4Lmxvb2thaGVhZCgvKD8hY2xhc3NcXGIpLylcbiAgICAgICAgKSxcbiAgICAgICAgQ09OU1RBTlRfUkVGRVJFTkNFLFxuICAgICAgXSxcbiAgICAgIHNjb3BlOiB7IDI6IFwidmFyaWFibGUuY29uc3RhbnRcIiwgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1hdGNoOiBbXG4gICAgICAgIC86Oi8sXG4gICAgICAgIC9jbGFzcy8sXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHsgMjogXCJ2YXJpYWJsZS5sYW5ndWFnZVwiLCB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSxcbiAgICAgICAgcmVnZXguY29uY2F0KFxuICAgICAgICAgIC86Oi8sXG4gICAgICAgICAgcmVnZXgubG9va2FoZWFkKC8oPyFjbGFzc1xcYikvKVxuICAgICAgICApLFxuICAgICAgICBDT05TVEFOVF9SRUZFUkVOQ0UsXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHtcbiAgICAgICAgMTogXCJ0aXRsZS5jbGFzc1wiLFxuICAgICAgICAzOiBcInZhcmlhYmxlLmNvbnN0YW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSxcbiAgICAgICAgcmVnZXguY29uY2F0KFxuICAgICAgICAgIFwiOjpcIixcbiAgICAgICAgICByZWdleC5sb29rYWhlYWQoLyg/IWNsYXNzXFxiKS8pXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHsgMTogXCJ0aXRsZS5jbGFzc1wiLCB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSxcbiAgICAgICAgLzo6LyxcbiAgICAgICAgL2NsYXNzLyxcbiAgICAgIF0sXG4gICAgICBzY29wZToge1xuICAgICAgICAxOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICAgIDM6IFwidmFyaWFibGUubGFuZ3VhZ2VcIixcbiAgICAgIH0sXG4gICAgfVxuICBdIH07XG5cbiAgY29uc3QgTkFNRURfQVJHVU1FTlQgPSB7XG4gICAgc2NvcGU6ICdhdHRyJyxcbiAgICBtYXRjaDogcmVnZXguY29uY2F0KElERU5UX1JFLCByZWdleC5sb29rYWhlYWQoJzonKSwgcmVnZXgubG9va2FoZWFkKC8oPyE6OikvKSksXG4gIH07XG4gIGNvbnN0IFBBUkFNU19NT0RFID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIE5BTUVEX0FSR1VNRU5ULFxuICAgICAgVkFSSUFCTEUsXG4gICAgICBMRUZUX0FORF9SSUdIVF9TSURFX09GX0RPVUJMRV9DT0xPTixcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICBTVFJJTkcsXG4gICAgICBOVU1CRVIsXG4gICAgICBDT05TVFJVQ1RPUl9DQUxMLFxuICAgIF0sXG4gIH07XG4gIGNvbnN0IEZVTkNUSU9OX0lOVk9LRSA9IHtcbiAgICByZWxldmFuY2U6IDAsXG4gICAgbWF0Y2g6IFtcbiAgICAgIC9cXGIvLFxuICAgICAgLy8gdG8gcHJldmVudCBrZXl3b3JkcyBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgcmVnZXguY29uY2F0KFwiKD8hZm5cXFxcYnxmdW5jdGlvblxcXFxifFwiLCBub3JtYWxpemVLZXl3b3JkcyhLV1MpLmpvaW4oXCJcXFxcYnxcIiksIFwifFwiLCBub3JtYWxpemVLZXl3b3JkcyhCVUlMVF9JTlMpLmpvaW4oXCJcXFxcYnxcIiksIFwiXFxcXGIpXCIpLFxuICAgICAgSURFTlRfUkUsXG4gICAgICByZWdleC5jb25jYXQoV0hJVEVTUEFDRSwgXCIqXCIpLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC8oPz1cXCgpLylcbiAgICBdLFxuICAgIHNjb3BlOiB7IDM6IFwidGl0bGUuZnVuY3Rpb24uaW52b2tlXCIsIH0sXG4gICAgY29udGFpbnM6IFsgUEFSQU1TX01PREUgXVxuICB9O1xuICBQQVJBTVNfTU9ERS5jb250YWlucy5wdXNoKEZVTkNUSU9OX0lOVk9LRSk7XG5cbiAgY29uc3QgQVRUUklCVVRFX0NPTlRBSU5TID0gW1xuICAgIE5BTUVEX0FSR1VNRU5ULFxuICAgIExFRlRfQU5EX1JJR0hUX1NJREVfT0ZfRE9VQkxFX0NPTE9OLFxuICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgU1RSSU5HLFxuICAgIE5VTUJFUixcbiAgICBDT05TVFJVQ1RPUl9DQUxMLFxuICBdO1xuXG4gIGNvbnN0IEFUVFJJQlVURVMgPSB7XG4gICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvI1xcW1xccyovLCBQQVNDQUxfQ0FTRV9DTEFTU19OQU1FX1JFKSxcbiAgICBiZWdpblNjb3BlOiBcIm1ldGFcIixcbiAgICBlbmQ6IC9dLyxcbiAgICBlbmRTY29wZTogXCJtZXRhXCIsXG4gICAga2V5d29yZHM6IHtcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgICAga2V5d29yZDogW1xuICAgICAgICAnbmV3JyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgIF1cbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXS8sXG4gICAgICAgIGtleXdvcmRzOiB7XG4gICAgICAgICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgICAgICAga2V5d29yZDogW1xuICAgICAgICAgICAgJ25ldycsXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgLi4uQVRUUklCVVRFX0NPTlRBSU5TLFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLi4uQVRUUklCVVRFX0NPTlRBSU5TLFxuICAgICAge1xuICAgICAgICBzY29wZTogJ21ldGEnLFxuICAgICAgICBtYXRjaDogUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRVxuICAgICAgfVxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNhc2VfaW5zZW5zaXRpdmU6IGZhbHNlLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBjb250YWluczogW1xuICAgICAgQVRUUklCVVRFUyxcbiAgICAgIGhsanMuSEFTSF9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNPTU1FTlQoJy8vJywgJyQnKSxcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgJy9cXFxcKicsXG4gICAgICAgICdcXFxcKi8nLFxuICAgICAgICB7IGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6ICdkb2N0YWcnLFxuICAgICAgICAgICAgbWF0Y2g6ICdAW0EtWmEtel0rJ1xuICAgICAgICAgIH1cbiAgICAgICAgXSB9XG4gICAgICApLFxuICAgICAge1xuICAgICAgICBtYXRjaDogL19faGFsdF9jb21waWxlclxcKFxcKTsvLFxuICAgICAgICBrZXl3b3JkczogJ19faGFsdF9jb21waWxlcicsXG4gICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgIHNjb3BlOiBcImNvbW1lbnRcIixcbiAgICAgICAgICBlbmQ6IGhsanMuTUFUQ0hfTk9USElOR19SRSxcbiAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtYXRjaDogL1xcPz4vLFxuICAgICAgICAgICAgICBzY29wZTogXCJtZXRhXCIsXG4gICAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBQUkVQUk9DRVNTT1IsXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAndmFyaWFibGUubGFuZ3VhZ2UnLFxuICAgICAgICBtYXRjaDogL1xcJHRoaXNcXGIvXG4gICAgICB9LFxuICAgICAgVkFSSUFCTEUsXG4gICAgICBGVU5DVElPTl9JTlZPS0UsXG4gICAgICBMRUZUX0FORF9SSUdIVF9TSURFX09GX0RPVUJMRV9DT0xPTixcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY29uc3QvLFxuICAgICAgICAgIC9cXHMvLFxuICAgICAgICAgIElERU5UX1JFLFxuICAgICAgICBdLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidmFyaWFibGUuY29uc3RhbnRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBDT05TVFJVQ1RPUl9DQUxMLFxuICAgICAge1xuICAgICAgICBzY29wZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBiZWdpbktleXdvcmRzOiAnZm4gZnVuY3Rpb24nLFxuICAgICAgICBlbmQ6IC9bO3tdLyxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgaWxsZWdhbDogJ1skJVxcXFxbXScsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgeyBiZWdpbktleXdvcmRzOiAndXNlJywgfSxcbiAgICAgICAgICBobGpzLlVOREVSU0NPUkVfVElUTEVfTU9ERSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogJz0+JywgLy8gTm8gbWFya3VwLCBqdXN0IGEgcmVsZXZhbmNlIGJvb3N0ZXJcbiAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjb3BlOiAncGFyYW1zJyxcbiAgICAgICAgICAgIGJlZ2luOiAnXFxcXCgnLFxuICAgICAgICAgICAgZW5kOiAnXFxcXCknLFxuICAgICAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgICdzZWxmJyxcbiAgICAgICAgICAgICAgVkFSSUFCTEUsXG4gICAgICAgICAgICAgIExFRlRfQU5EX1JJR0hUX1NJREVfT0ZfRE9VQkxFX0NPTE9OLFxuICAgICAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgICAgICBTVFJJTkcsXG4gICAgICAgICAgICAgIE5VTUJFUlxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAnY2xhc3MnLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luS2V5d29yZHM6IFwiZW51bVwiLFxuICAgICAgICAgICAgaWxsZWdhbDogL1soJFwiXS9cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luS2V5d29yZHM6IFwiY2xhc3MgaW50ZXJmYWNlIHRyYWl0XCIsXG4gICAgICAgICAgICBpbGxlZ2FsOiAvWzooJFwiXS9cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgZW5kOiAvXFx7LyxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7IGJlZ2luS2V5d29yZHM6ICdleHRlbmRzIGltcGxlbWVudHMnIH0sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX1RJVExFX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIC8vIGJvdGggdXNlIGFuZCBuYW1lc3BhY2Ugc3RpbGwgdXNlIFwib2xkIHN0eWxlXCIgcnVsZXMgKHZzIG11bHRpLW1hdGNoKVxuICAgICAgLy8gYmVjYXVzZSB0aGUgbmFtZXNwYWNlIG5hbWUgY2FuIGluY2x1ZGUgYFxcYCBhbmQgd2Ugc3RpbGwgd2FudCBlYWNoXG4gICAgICAvLyBlbGVtZW50IHRvIGJlIHRyZWF0ZWQgYXMgaXRzIG93biAqaW5kaXZpZHVhbCogdGl0bGVcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25hbWVzcGFjZScsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgZW5kOiAnOycsXG4gICAgICAgIGlsbGVnYWw6IC9bLiddLyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5pbmhlcml0KGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFLCB7IHNjb3BlOiBcInRpdGxlLmNsYXNzXCIgfSkgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ3VzZScsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgZW5kOiAnOycsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgLy8gVE9ETzogdGl0bGUuZnVuY3Rpb24gdnMgdGl0bGUuY2xhc3NcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXRjaDogL1xcYihhc3xjb25zdHxmdW5jdGlvbilcXGIvLFxuICAgICAgICAgICAgc2NvcGU6IFwia2V5d29yZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBUT0RPOiBjb3VsZCBiZSB0aXRsZS5jbGFzcyBvciB0aXRsZS5mdW5jdGlvblxuICAgICAgICAgIGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBTVFJJTkcsXG4gICAgICBOVU1CRVIsXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBwaHAgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogUEhQIFRlbXBsYXRlXG5SZXF1aXJlczogeG1sLmpzLCBwaHAuanNcbkF1dGhvcjogSm9zaCBHb2ViZWwgPGhlbGxvQGpvc2hnb2ViZWwuY29tPlxuV2Vic2l0ZTogaHR0cHM6Ly93d3cucGhwLm5ldFxuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuZnVuY3Rpb24gcGhwVGVtcGxhdGUoaGxqcykge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiUEhQIHRlbXBsYXRlXCIsXG4gICAgc3ViTGFuZ3VhZ2U6ICd4bWwnLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPFxcPyhwaHB8PSk/LyxcbiAgICAgICAgZW5kOiAvXFw/Pi8sXG4gICAgICAgIHN1Ykxhbmd1YWdlOiAncGhwJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRoZSBwaHAgY2xvc2luZyB0YWcgPz4gdG8gY2xvc2UgdGhlIFBIUCBibG9jayB3aGVuXG4gICAgICAgICAgLy8gaW5zaWRlIGFueSBvZiB0aGUgZm9sbG93aW5nIGJsb2NrczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogJy9cXFxcKicsXG4gICAgICAgICAgICBlbmQ6ICdcXFxcKi8nLFxuICAgICAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46ICdiXCInLFxuICAgICAgICAgICAgZW5kOiAnXCInLFxuICAgICAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46ICdiXFwnJyxcbiAgICAgICAgICAgIGVuZDogJ1xcJycsXG4gICAgICAgICAgICBza2lwOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBobGpzLmluaGVyaXQoaGxqcy5BUE9TX1NUUklOR19NT0RFLCB7XG4gICAgICAgICAgICBpbGxlZ2FsOiBudWxsLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBudWxsLFxuICAgICAgICAgICAgY29udGFpbnM6IG51bGwsXG4gICAgICAgICAgICBza2lwOiB0cnVlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHtcbiAgICAgICAgICAgIGlsbGVnYWw6IG51bGwsXG4gICAgICAgICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgICAgICAgICBjb250YWluczogbnVsbCxcbiAgICAgICAgICAgIHNraXA6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBwaHBUZW1wbGF0ZSBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBQbGFpbiB0ZXh0XG5BdXRob3I6IEVnb3IgUm9nb3YgKGUucm9nb3ZAcG9zdGdyZXNwcm8ucnUpXG5EZXNjcmlwdGlvbjogUGxhaW4gdGV4dCB3aXRob3V0IGFueSBoaWdobGlnaHRpbmcuXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG5mdW5jdGlvbiBwbGFpbnRleHQoaGxqcykge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdQbGFpbiB0ZXh0JyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAndGV4dCcsXG4gICAgICAndHh0J1xuICAgIF0sXG4gICAgZGlzYWJsZUF1dG9kZXRlY3Q6IHRydWVcbiAgfTtcbn1cblxuZXhwb3J0IHsgcGxhaW50ZXh0IGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFB5dGhvblxuRGVzY3JpcHRpb246IFB5dGhvbiBpcyBhbiBpbnRlcnByZXRlZCwgb2JqZWN0LW9yaWVudGVkLCBoaWdoLWxldmVsIHByb2dyYW1taW5nIGxhbmd1YWdlIHdpdGggZHluYW1pYyBzZW1hbnRpY3MuXG5XZWJzaXRlOiBodHRwczovL3d3dy5weXRob24ub3JnXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG5mdW5jdGlvbiBweXRob24oaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIGNvbnN0IElERU5UX1JFID0gL1tcXHB7WElEX1N0YXJ0fV9dXFxwe1hJRF9Db250aW51ZX0qL3U7XG4gIGNvbnN0IFJFU0VSVkVEX1dPUkRTID0gW1xuICAgICdhbmQnLFxuICAgICdhcycsXG4gICAgJ2Fzc2VydCcsXG4gICAgJ2FzeW5jJyxcbiAgICAnYXdhaXQnLFxuICAgICdicmVhaycsXG4gICAgJ2Nhc2UnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvbnRpbnVlJyxcbiAgICAnZGVmJyxcbiAgICAnZGVsJyxcbiAgICAnZWxpZicsXG4gICAgJ2Vsc2UnLFxuICAgICdleGNlcHQnLFxuICAgICdmaW5hbGx5JyxcbiAgICAnZm9yJyxcbiAgICAnZnJvbScsXG4gICAgJ2dsb2JhbCcsXG4gICAgJ2lmJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW4nLFxuICAgICdpcycsXG4gICAgJ2xhbWJkYScsXG4gICAgJ21hdGNoJyxcbiAgICAnbm9ubG9jYWx8MTAnLFxuICAgICdub3QnLFxuICAgICdvcicsXG4gICAgJ3Bhc3MnLFxuICAgICdyYWlzZScsXG4gICAgJ3JldHVybicsXG4gICAgJ3RyeScsXG4gICAgJ3doaWxlJyxcbiAgICAnd2l0aCcsXG4gICAgJ3lpZWxkJ1xuICBdO1xuXG4gIGNvbnN0IEJVSUxUX0lOUyA9IFtcbiAgICAnX19pbXBvcnRfXycsXG4gICAgJ2FicycsXG4gICAgJ2FsbCcsXG4gICAgJ2FueScsXG4gICAgJ2FzY2lpJyxcbiAgICAnYmluJyxcbiAgICAnYm9vbCcsXG4gICAgJ2JyZWFrcG9pbnQnLFxuICAgICdieXRlYXJyYXknLFxuICAgICdieXRlcycsXG4gICAgJ2NhbGxhYmxlJyxcbiAgICAnY2hyJyxcbiAgICAnY2xhc3NtZXRob2QnLFxuICAgICdjb21waWxlJyxcbiAgICAnY29tcGxleCcsXG4gICAgJ2RlbGF0dHInLFxuICAgICdkaWN0JyxcbiAgICAnZGlyJyxcbiAgICAnZGl2bW9kJyxcbiAgICAnZW51bWVyYXRlJyxcbiAgICAnZXZhbCcsXG4gICAgJ2V4ZWMnLFxuICAgICdmaWx0ZXInLFxuICAgICdmbG9hdCcsXG4gICAgJ2Zvcm1hdCcsXG4gICAgJ2Zyb3plbnNldCcsXG4gICAgJ2dldGF0dHInLFxuICAgICdnbG9iYWxzJyxcbiAgICAnaGFzYXR0cicsXG4gICAgJ2hhc2gnLFxuICAgICdoZWxwJyxcbiAgICAnaGV4JyxcbiAgICAnaWQnLFxuICAgICdpbnB1dCcsXG4gICAgJ2ludCcsXG4gICAgJ2lzaW5zdGFuY2UnLFxuICAgICdpc3N1YmNsYXNzJyxcbiAgICAnaXRlcicsXG4gICAgJ2xlbicsXG4gICAgJ2xpc3QnLFxuICAgICdsb2NhbHMnLFxuICAgICdtYXAnLFxuICAgICdtYXgnLFxuICAgICdtZW1vcnl2aWV3JyxcbiAgICAnbWluJyxcbiAgICAnbmV4dCcsXG4gICAgJ29iamVjdCcsXG4gICAgJ29jdCcsXG4gICAgJ29wZW4nLFxuICAgICdvcmQnLFxuICAgICdwb3cnLFxuICAgICdwcmludCcsXG4gICAgJ3Byb3BlcnR5JyxcbiAgICAncmFuZ2UnLFxuICAgICdyZXByJyxcbiAgICAncmV2ZXJzZWQnLFxuICAgICdyb3VuZCcsXG4gICAgJ3NldCcsXG4gICAgJ3NldGF0dHInLFxuICAgICdzbGljZScsXG4gICAgJ3NvcnRlZCcsXG4gICAgJ3N0YXRpY21ldGhvZCcsXG4gICAgJ3N0cicsXG4gICAgJ3N1bScsXG4gICAgJ3N1cGVyJyxcbiAgICAndHVwbGUnLFxuICAgICd0eXBlJyxcbiAgICAndmFycycsXG4gICAgJ3ppcCdcbiAgXTtcblxuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICAnX19kZWJ1Z19fJyxcbiAgICAnRWxsaXBzaXMnLFxuICAgICdGYWxzZScsXG4gICAgJ05vbmUnLFxuICAgICdOb3RJbXBsZW1lbnRlZCcsXG4gICAgJ1RydWUnXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3R5cGluZy5odG1sXG4gIC8vIFRPRE86IENvdWxkIHRoZXNlIGJlIHN1cHBsZW1lbnRlZCBieSBhIENhbWVsQ2FzZSBtYXRjaGVyIGluIGNlcnRhaW5cbiAgLy8gY29udGV4dHMsIGxlYXZpbmcgdGhlc2UgcmVtYWluaW5nIG9ubHkgZm9yIHJlbGV2YW5jZSBoaW50aW5nP1xuICBjb25zdCBUWVBFUyA9IFtcbiAgICBcIkFueVwiLFxuICAgIFwiQ2FsbGFibGVcIixcbiAgICBcIkNvcm91dGluZVwiLFxuICAgIFwiRGljdFwiLFxuICAgIFwiTGlzdFwiLFxuICAgIFwiTGl0ZXJhbFwiLFxuICAgIFwiR2VuZXJpY1wiLFxuICAgIFwiT3B0aW9uYWxcIixcbiAgICBcIlNlcXVlbmNlXCIsXG4gICAgXCJTZXRcIixcbiAgICBcIlR1cGxlXCIsXG4gICAgXCJUeXBlXCIsXG4gICAgXCJVbmlvblwiXG4gIF07XG5cbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAgJHBhdHRlcm46IC9bQS1aYS16XVxcdyt8X19cXHcrX18vLFxuICAgIGtleXdvcmQ6IFJFU0VSVkVEX1dPUkRTLFxuICAgIGJ1aWx0X2luOiBCVUlMVF9JTlMsXG4gICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgdHlwZTogVFlQRVNcbiAgfTtcblxuICBjb25zdCBQUk9NUFQgPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgYmVnaW46IC9eKD4+PnxcXC5cXC5cXC4pIC9cbiAgfTtcblxuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46IC9cXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC8jL1xuICB9O1xuXG4gIGNvbnN0IExJVEVSQUxfQlJBQ0tFVCA9IHtcbiAgICBiZWdpbjogL1xce1xcey8sXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF0sXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW3VVXXxbYkJdfFtyUl18W2JCXVtyUl18W3JSXVtiQl0pPycnJy8sXG4gICAgICAgIGVuZDogLycnJy8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgIFBST01QVFxuICAgICAgICBdLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbdVVdfFtiQl18W3JSXXxbYkJdW3JSXXxbclJdW2JCXSk/XCJcIlwiLyxcbiAgICAgICAgZW5kOiAvXCJcIlwiLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgICAgUFJPTVBUXG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMTBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvKFtmRl1bclJdfFtyUl1bZkZdfFtmRl0pJycnLyxcbiAgICAgICAgZW5kOiAvJycnLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgICAgUFJPTVBULFxuICAgICAgICAgIExJVEVSQUxfQlJBQ0tFVCxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbZkZdW3JSXXxbclJdW2ZGXXxbZkZdKVwiXCJcIi8sXG4gICAgICAgIGVuZDogL1wiXCJcIi8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgIFBST01QVCxcbiAgICAgICAgICBMSVRFUkFMX0JSQUNLRVQsXG4gICAgICAgICAgU1VCU1RcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW3VVXXxbclJdKScvLFxuICAgICAgICBlbmQ6IC8nLyxcbiAgICAgICAgcmVsZXZhbmNlOiAxMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW3VVXXxbclJdKVwiLyxcbiAgICAgICAgZW5kOiAvXCIvLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbYkJdfFtiQl1bclJdfFtyUl1bYkJdKScvLFxuICAgICAgICBlbmQ6IC8nL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW2JCXXxbYkJdW3JSXXxbclJdW2JCXSlcIi8sXG4gICAgICAgIGVuZDogL1wiL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW2ZGXVtyUl18W3JSXVtmRl18W2ZGXSknLyxcbiAgICAgICAgZW5kOiAvJy8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgIExJVEVSQUxfQlJBQ0tFVCxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbZkZdW3JSXXxbclJdW2ZGXXxbZkZdKVwiLyxcbiAgICAgICAgZW5kOiAvXCIvLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgICAgICBMSVRFUkFMX0JSQUNLRVQsXG4gICAgICAgICAgU1VCU1RcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREVcbiAgICBdXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjbnVtZXJpYy1saXRlcmFsc1xuICBjb25zdCBkaWdpdHBhcnQgPSAnWzAtOV0oXz9bMC05XSkqJztcbiAgY29uc3QgcG9pbnRmbG9hdCA9IGAoXFxcXGIoJHtkaWdpdHBhcnR9KSk/XFxcXC4oJHtkaWdpdHBhcnR9KXxcXFxcYigke2RpZ2l0cGFydH0pXFxcXC5gO1xuICAvLyBXaGl0ZXNwYWNlIGFmdGVyIGEgbnVtYmVyIChvciBhbnkgbGV4aWNhbCB0b2tlbikgaXMgbmVlZGVkIG9ubHkgaWYgaXRzIGFic2VuY2VcbiAgLy8gd291bGQgY2hhbmdlIHRoZSB0b2tlbml6YXRpb25cbiAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjd2hpdGVzcGFjZS1iZXR3ZWVuLXRva2Vuc1xuICAvLyBXZSBkZXZpYXRlIHNsaWdodGx5LCByZXF1aXJpbmcgYSB3b3JkIGJvdW5kYXJ5IG9yIGEga2V5d29yZFxuICAvLyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcmVjb2duaXppbmcgKnByZWZpeGVzKiAoZS5nLiwgYDBgIGluIGAweDQxYCBvciBgMDhgIG9yIGAwX18xYClcbiAgY29uc3QgbG9va2FoZWFkID0gYFxcXFxifCR7UkVTRVJWRURfV09SRFMuam9pbignfCcpfWA7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gZXhwb25lbnRmbG9hdCwgcG9pbnRmbG9hdFxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjZmxvYXRpbmctcG9pbnQtbGl0ZXJhbHNcbiAgICAgIC8vIG9wdGlvbmFsbHkgaW1hZ2luYXJ5XG4gICAgICAvLyBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjkvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMuaHRtbCNpbWFnaW5hcnktbGl0ZXJhbHNcbiAgICAgIC8vIE5vdGU6IG5vIGxlYWRpbmcgXFxiIGJlY2F1c2UgZmxvYXRzIGNhbiBzdGFydCB3aXRoIGEgZGVjaW1hbCBwb2ludFxuICAgICAgLy8gYW5kIHdlIGRvbid0IHdhbnQgdG8gbWlzaGFuZGxlIGUuZy4gYGZuKC41KWAsXG4gICAgICAvLyBubyB0cmFpbGluZyBcXGIgZm9yIHBvaW50ZmxvYXQgYmVjYXVzZSBpdCBjYW4gZW5kIHdpdGggYSBkZWNpbWFsIHBvaW50XG4gICAgICAvLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBtaXNoYW5kbGUgZS5nLiBgMC4uaGV4KClgOyB0aGlzIHNob3VsZCBiZSBzYWZlXG4gICAgICAvLyBiZWNhdXNlIGJvdGggTVVTVCBjb250YWluIGEgZGVjaW1hbCBwb2ludCBhbmQgc28gY2Fubm90IGJlIGNvbmZ1c2VkIHdpdGhcbiAgICAgIC8vIHRoZSBpbnRlcmlvciBwYXJ0IG9mIGFuIGlkZW50aWZpZXJcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IGAoXFxcXGIoJHtkaWdpdHBhcnR9KXwoJHtwb2ludGZsb2F0fSkpW2VFXVsrLV0/KCR7ZGlnaXRwYXJ0fSlbakpdPyg/PSR7bG9va2FoZWFkfSlgXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogYCgke3BvaW50ZmxvYXR9KVtqSl0/YFxuICAgICAgfSxcblxuICAgICAgLy8gZGVjaW50ZWdlciwgYmluaW50ZWdlciwgb2N0aW50ZWdlciwgaGV4aW50ZWdlclxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjaW50ZWdlci1saXRlcmFsc1xuICAgICAgLy8gb3B0aW9uYWxseSBcImxvbmdcIiBpbiBQeXRob24gMlxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi43L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjaW50ZWdlci1hbmQtbG9uZy1pbnRlZ2VyLWxpdGVyYWxzXG4gICAgICAvLyBkZWNpbnRlZ2VyIGlzIG9wdGlvbmFsbHkgaW1hZ2luYXJ5XG4gICAgICAvLyBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjkvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMuaHRtbCNpbWFnaW5hcnktbGl0ZXJhbHNcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IGBcXFxcYihbMS05XShfP1swLTldKSp8MCsoXz8wKSopW2xMakpdPyg/PSR7bG9va2FoZWFkfSlgXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogYFxcXFxiMFtiQl0oXz9bMDFdKStbbExdPyg/PSR7bG9va2FoZWFkfSlgXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogYFxcXFxiMFtvT10oXz9bMC03XSkrW2xMXT8oPz0ke2xvb2thaGVhZH0pYFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IGBcXFxcYjBbeFhdKF8/WzAtOWEtZkEtRl0pK1tsTF0/KD89JHtsb29rYWhlYWR9KWBcbiAgICAgIH0sXG5cbiAgICAgIC8vIGltYWdudW1iZXIgKGRpZ2l0cGFydC1iYXNlZClcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMuOS9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5odG1sI2ltYWdpbmFyeS1saXRlcmFsc1xuICAgICAge1xuICAgICAgICBiZWdpbjogYFxcXFxiKCR7ZGlnaXRwYXJ0fSlbakpdKD89JHtsb29rYWhlYWR9KWBcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IENPTU1FTlRfVFlQRSA9IHtcbiAgICBjbGFzc05hbWU6IFwiY29tbWVudFwiLFxuICAgIGJlZ2luOiByZWdleC5sb29rYWhlYWQoLyMgdHlwZTovKSxcbiAgICBlbmQ6IC8kLyxcbiAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gcHJldmVudCBrZXl3b3JkcyBmcm9tIGNvbG9yaW5nIGB0eXBlYFxuICAgICAgICBiZWdpbjogLyMgdHlwZTovXG4gICAgICB9LFxuICAgICAgLy8gY29tbWVudCB3aXRoaW4gYSBkYXRhdHlwZSBjb21tZW50IGluY2x1ZGVzIG5vIGtleXdvcmRzXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvIy8sXG4gICAgICAgIGVuZDogL1xcYlxcQi8sXG4gICAgICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBQQVJBTVMgPSB7XG4gICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gRXhjbHVkZSBwYXJhbXMgaW4gZnVuY3Rpb25zIHdpdGhvdXQgcGFyYW1zXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIixcbiAgICAgICAgYmVnaW46IC9cXChcXHMqXFwpLyxcbiAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgUFJPTVBULFxuICAgICAgICAgIE5VTUJFUixcbiAgICAgICAgICBTVFJJTkcsXG4gICAgICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBTVUJTVC5jb250YWlucyA9IFtcbiAgICBTVFJJTkcsXG4gICAgTlVNQkVSLFxuICAgIFBST01QVFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1B5dGhvbicsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ3B5JyxcbiAgICAgICdneXAnLFxuICAgICAgJ2lweXRob24nXG4gICAgXSxcbiAgICB1bmljb2RlUmVnZXg6IHRydWUsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC8oPFxcL3xcXD8pfD0+LyxcbiAgICBjb250YWluczogW1xuICAgICAgUFJPTVBULFxuICAgICAgTlVNQkVSLFxuICAgICAge1xuICAgICAgICAvLyB2ZXJ5IGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAgIGJlZ2luOiAvXFxic2VsZlxcYi9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGVhdCBcImlmXCIgcHJpb3IgdG8gc3RyaW5nIHNvIHRoYXQgaXQgd29uJ3QgYWNjaWRlbnRhbGx5IGJlXG4gICAgICAgIC8vIGxhYmVsZWQgYXMgYW4gZi1zdHJpbmdcbiAgICAgICAgYmVnaW5LZXl3b3JkczogXCJpZlwiLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICBTVFJJTkcsXG4gICAgICBDT01NRU5UX1RZUEUsXG4gICAgICBobGpzLkhBU0hfQ09NTUVOVF9NT0RFLFxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9cXGJkZWYvLCAvXFxzKy8sXG4gICAgICAgICAgSURFTlRfUkUsXG4gICAgICAgIF0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbIFBBUkFNUyBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgICAgIC9cXGJjbGFzcy8sIC9cXHMrLyxcbiAgICAgICAgICAgICAgSURFTlRfUkUsIC9cXHMqLyxcbiAgICAgICAgICAgICAgL1xcKFxccyovLCBJREVOVF9SRSwvXFxzKlxcKS9cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICAvXFxiY2xhc3MvLCAvXFxzKy8sXG4gICAgICAgICAgICAgIElERU5UX1JFXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICAgICAgNjogXCJ0aXRsZS5jbGFzcy5pbmhlcml0ZWRcIixcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAvXltcXHQgXSpALyxcbiAgICAgICAgZW5kOiAvKD89Iyl8JC8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgTlVNQkVSLFxuICAgICAgICAgIFBBUkFNUyxcbiAgICAgICAgICBTVFJJTkdcbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgcHl0aG9uIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFB5dGhvbiBSRVBMXG5SZXF1aXJlczogcHl0aG9uLmpzXG5BdXRob3I6IEpvc2ggR29lYmVsIDxoZWxsb0Bqb3NoZ29lYmVsLmNvbT5cbkNhdGVnb3J5OiBjb21tb25cbiovXG5cbmZ1bmN0aW9uIHB5dGhvblJlcGwoaGxqcykge1xuICByZXR1cm4ge1xuICAgIGFsaWFzZXM6IFsgJ3B5Y29uJyBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEucHJvbXB0JyxcbiAgICAgICAgc3RhcnRzOiB7XG4gICAgICAgICAgLy8gYSBzcGFjZSBzZXBhcmF0ZXMgdGhlIFJFUEwgcHJlZml4IGZyb20gdGhlIGFjdHVhbCBjb2RlXG4gICAgICAgICAgLy8gdGhpcyBpcyBwdXJlbHkgZm9yIGNsZWFuZXIgSFRNTCBvdXRwdXRcbiAgICAgICAgICBlbmQ6IC8gfCQvLFxuICAgICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgICAgZW5kOiAnJCcsXG4gICAgICAgICAgICBzdWJMYW5ndWFnZTogJ3B5dGhvbidcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgeyBiZWdpbjogL14+Pj4oPz1bIF18JCkvIH0sXG4gICAgICAgICAgeyBiZWdpbjogL15cXC5cXC5cXC4oPz1bIF18JCkvIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgcHl0aG9uUmVwbCBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBSXG5EZXNjcmlwdGlvbjogUiBpcyBhIGZyZWUgc29mdHdhcmUgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZyBhbmQgZ3JhcGhpY3MuXG5BdXRob3I6IEpvZSBDaGVuZyA8am9lQHJzdHVkaW8ub3JnPlxuQ29udHJpYnV0b3JzOiBLb25yYWQgUnVkb2xwaCA8a29ucmFkLnJ1ZG9scGhAZ21haWwuY29tPlxuV2Vic2l0ZTogaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZ1xuQ2F0ZWdvcnk6IGNvbW1vbixzY2llbnRpZmljXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gcihobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLy8gSWRlbnRpZmllcnMgaW4gUiBjYW5ub3Qgc3RhcnQgd2l0aCBgX2AsIGJ1dCB0aGV5IGNhbiBzdGFydCB3aXRoIGAuYCBpZiBpdFxuICAvLyBpcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBkaWdpdC5cbiAgLy8gUiBhbHNvIHN1cHBvcnRzIHF1b3RlZCBpZGVudGlmaWVycywgd2hpY2ggYXJlIG5lYXItYXJiaXRyYXJ5IHNlcXVlbmNlc1xuICAvLyBkZWxpbWl0ZWQgYnkgYmFja3RpY2tzIChgXHUyMDI2YCksIHdoaWNoIG1heSBjb250YWluIGVzY2FwZSBzZXF1ZW5jZXMuIFRoZXNlIGFyZVxuICAvLyBoYW5kbGVkIGluIGEgc2VwYXJhdGUgbW9kZS4gU2VlIGB0ZXN0L21hcmt1cC9yL25hbWVzLnR4dGAgZm9yIGV4YW1wbGVzLlxuICAvLyBGSVhNRTogU3VwcG9ydCBVbmljb2RlIGlkZW50aWZpZXJzLlxuICBjb25zdCBJREVOVF9SRSA9IC8oPzooPzpbYS16QS1aXXxcXC5bLl9hLXpBLVpdKVsuX2EtekEtWjAtOV0qKXxcXC4oPyFcXGQpLztcbiAgY29uc3QgTlVNQkVSX1RZUEVTX1JFID0gcmVnZXguZWl0aGVyKFxuICAgIC8vIFNwZWNpYWwgY2FzZTogb25seSBoZXhhZGVjaW1hbCBiaW5hcnkgcG93ZXJzIGNhbiBjb250YWluIGZyYWN0aW9uc1xuICAgIC8wW3hYXVswLTlhLWZBLUZdK1xcLlswLTlhLWZBLUZdKltwUF1bKy1dP1xcZCtpPy8sXG4gICAgLy8gSGV4YWRlY2ltYWwgbnVtYmVycyB3aXRob3V0IGZyYWN0aW9uIGFuZCBvcHRpb25hbCBiaW5hcnkgcG93ZXJcbiAgICAvMFt4WF1bMC05YS1mQS1GXSsoPzpbcFBdWystXT9cXGQrKT9bTGldPy8sXG4gICAgLy8gRGVjaW1hbCBudW1iZXJzXG4gICAgLyg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpbZUVdWystXT9cXGQrKT9bTGldPy9cbiAgKTtcbiAgY29uc3QgT1BFUkFUT1JTX1JFID0gL1s9ITw+Ol09fFxcfFxcfHwmJnw6Ojo/fDwtfDw8LXwtPj58LT58XFx8PnxbLSsqXFwvPyEkJnw6PD0+QF5+XXxcXCpcXCovO1xuICBjb25zdCBQVU5DVFVBVElPTl9SRSA9IHJlZ2V4LmVpdGhlcihcbiAgICAvWygpXS8sXG4gICAgL1t7fV0vLFxuICAgIC9cXFtcXFsvLFxuICAgIC9bW1xcXV0vLFxuICAgIC9cXFxcLyxcbiAgICAvLC9cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSJyxcblxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogSURFTlRfUkUsXG4gICAgICBrZXl3b3JkOlxuICAgICAgICAnZnVuY3Rpb24gaWYgaW4gYnJlYWsgbmV4dCByZXBlYXQgZWxzZSBmb3Igd2hpbGUnLFxuICAgICAgbGl0ZXJhbDpcbiAgICAgICAgJ05VTEwgTkEgVFJVRSBGQUxTRSBJbmYgTmFOIE5BX2ludGVnZXJffDEwIE5BX3JlYWxffDEwICdcbiAgICAgICAgKyAnTkFfY2hhcmFjdGVyX3wxMCBOQV9jb21wbGV4X3wxMCcsXG4gICAgICBidWlsdF9pbjpcbiAgICAgICAgLy8gQnVpbHRpbiBjb25zdGFudHNcbiAgICAgICAgJ0xFVFRFUlMgbGV0dGVycyBtb250aC5hYmIgbW9udGgubmFtZSBwaSBUIEYgJ1xuICAgICAgICAvLyBQcmltaXRpdmUgZnVuY3Rpb25zXG4gICAgICAgIC8vIFRoZXNlIGFyZSBhbGwgdGhlIGZ1bmN0aW9ucyBpbiBgYmFzZWAgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMgYVxuICAgICAgICAvLyBgLlByaW1pdGl2ZWAsIG1pbnVzIHRob3NlIGZ1bmN0aW9ucyB0aGF0IGFyZSBhbHNvIGtleXdvcmRzLlxuICAgICAgICArICdhYnMgYWNvcyBhY29zaCBhbGwgYW55IGFueU5BIEFyZyBhcy5jYWxsIGFzLmNoYXJhY3RlciAnXG4gICAgICAgICsgJ2FzLmNvbXBsZXggYXMuZG91YmxlIGFzLmVudmlyb25tZW50IGFzLmludGVnZXIgYXMubG9naWNhbCAnXG4gICAgICAgICsgJ2FzLm51bGwuZGVmYXVsdCBhcy5udW1lcmljIGFzLnJhdyBhc2luIGFzaW5oIGF0YW4gYXRhbmggYXR0ciAnXG4gICAgICAgICsgJ2F0dHJpYnV0ZXMgYmFzZWVudiBicm93c2VyIGMgY2FsbCBjZWlsaW5nIGNsYXNzIENvbmogY29zIGNvc2ggJ1xuICAgICAgICArICdjb3NwaSBjdW1tYXggY3VtbWluIGN1bXByb2QgY3Vtc3VtIGRpZ2FtbWEgZGltIGRpbW5hbWVzICdcbiAgICAgICAgKyAnZW1wdHllbnYgZXhwIGV4cHJlc3Npb24gZmxvb3IgZm9yY2VBbmRDYWxsIGdhbW1hIGdjLnRpbWUgJ1xuICAgICAgICArICdnbG9iYWxlbnYgSW0gaW50ZXJhY3RpdmUgaW52aXNpYmxlIGlzLmFycmF5IGlzLmF0b21pYyBpcy5jYWxsICdcbiAgICAgICAgKyAnaXMuY2hhcmFjdGVyIGlzLmNvbXBsZXggaXMuZG91YmxlIGlzLmVudmlyb25tZW50IGlzLmV4cHJlc3Npb24gJ1xuICAgICAgICArICdpcy5maW5pdGUgaXMuZnVuY3Rpb24gaXMuaW5maW5pdGUgaXMuaW50ZWdlciBpcy5sYW5ndWFnZSAnXG4gICAgICAgICsgJ2lzLmxpc3QgaXMubG9naWNhbCBpcy5tYXRyaXggaXMubmEgaXMubmFtZSBpcy5uYW4gaXMubnVsbCAnXG4gICAgICAgICsgJ2lzLm51bWVyaWMgaXMub2JqZWN0IGlzLnBhaXJsaXN0IGlzLnJhdyBpcy5yZWN1cnNpdmUgaXMuc2luZ2xlICdcbiAgICAgICAgKyAnaXMuc3ltYm9sIGxhenlMb2FkREJmZXRjaCBsZW5ndGggbGdhbW1hIGxpc3QgbG9nIG1heCBtaW4gJ1xuICAgICAgICArICdtaXNzaW5nIE1vZCBuYW1lcyBuYXJncyBuemNoYXIgb2xkQ2xhc3Mgb24uZXhpdCBwb3MudG8uZW52ICdcbiAgICAgICAgKyAncHJvYy50aW1lIHByb2QgcXVvdGUgcmFuZ2UgUmUgcmVwIHJldHJhY2VtZW0gcmV0dXJuIHJvdW5kICdcbiAgICAgICAgKyAnc2VxX2Fsb25nIHNlcV9sZW4gc2VxLmludCBzaWduIHNpZ25pZiBzaW4gc2luaCBzaW5waSBzcXJ0ICdcbiAgICAgICAgKyAnc3RhbmRhcmRHZW5lcmljIHN1YnN0aXR1dGUgc3VtIHN3aXRjaCB0YW4gdGFuaCB0YW5waSB0cmFjZW1lbSAnXG4gICAgICAgICsgJ3RyaWdhbW1hIHRydW5jIHVuY2xhc3MgdW50cmFjZW1lbSBVc2VNZXRob2QgeHRmcm0nLFxuICAgIH0sXG5cbiAgICBjb250YWluczogW1xuICAgICAgLy8gUm94eWdlbiBjb21tZW50c1xuICAgICAgaGxqcy5DT01NRU5UKFxuICAgICAgICAvIycvLFxuICAgICAgICAvJC8sXG4gICAgICAgIHsgY29udGFpbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYEBleGFtcGxlc2Agc2VwYXJhdGVseSB0byBjYXVzZSBhbGwgc3Vic2VxdWVudCBjb2RlXG4gICAgICAgICAgICAvLyB1bnRpbCB0aGUgbmV4dCBgQGAtdGFnIG9uIGl0cyBvd24gbGluZSB0byBiZSBrZXB0IGFzLWlzLFxuICAgICAgICAgICAgLy8gcHJldmVudGluZyBoaWdobGlnaHRpbmcuIFRoaXMgY29kZSBpcyBleGFtcGxlIFIgY29kZSwgc28gbmVzdGVkXG4gICAgICAgICAgICAvLyBkb2N0YWdzIHNob3VsZG5cdTIwMTl0IGJlIHRyZWF0ZWQgYXMgc3VjaC4gU2VlXG4gICAgICAgICAgICAvLyBgdGVzdC9tYXJrdXAvci9yb3h5Z2VuLnR4dGAgZm9yIGFuIGV4YW1wbGUuXG4gICAgICAgICAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgICAgICAgICBtYXRjaDogL0BleGFtcGxlcy8sXG4gICAgICAgICAgICBzdGFydHM6IHtcbiAgICAgICAgICAgICAgZW5kOiByZWdleC5sb29rYWhlYWQocmVnZXguZWl0aGVyKFxuICAgICAgICAgICAgICAgIC8vIGVuZCBpZiBhbm90aGVyIGRvYyBjb21tZW50XG4gICAgICAgICAgICAgICAgL1xcbl4jJ1xccyooPz1AW2EtekEtWl0rKS8sXG4gICAgICAgICAgICAgICAgLy8gb3IgYSBsaW5lIHdpdGggbm8gY29tbWVudFxuICAgICAgICAgICAgICAgIC9cXG5eKD8hIycpL1xuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgZW5kc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGBAcGFyYW1gIHRvIGhpZ2hsaWdodCB0aGUgcGFyYW1ldGVyIG5hbWUgZm9sbG93aW5nXG4gICAgICAgICAgICAvLyBhZnRlci5cbiAgICAgICAgICAgIHNjb3BlOiAnZG9jdGFnJyxcbiAgICAgICAgICAgIGJlZ2luOiAnQHBhcmFtJyxcbiAgICAgICAgICAgIGVuZDogLyQvLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNjb3BlOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAgICB7IG1hdGNoOiBJREVOVF9SRSB9LFxuICAgICAgICAgICAgICAgICAgeyBtYXRjaDogL2AoPzpcXFxcLnxbXmBcXFxcXSkrYC8gfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZW5kc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgICAgICAgICBtYXRjaDogL0BbYS16QS1aXSsvXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY29wZTogJ2tleXdvcmQnLFxuICAgICAgICAgICAgbWF0Y2g6IC9cXFxcW2EtekEtWl0rL1xuICAgICAgICAgIH1cbiAgICAgICAgXSB9XG4gICAgICApLFxuXG4gICAgICBobGpzLkhBU0hfQ09NTUVOVF9NT0RFLFxuXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAnc3RyaW5nJyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF0sXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgICAgICBiZWdpbjogL1tyUl1cIigtKilcXCgvLFxuICAgICAgICAgICAgZW5kOiAvXFwpKC0qKVwiL1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgICAgICAgICAgYmVnaW46IC9bclJdXCIoLSopXFx7LyxcbiAgICAgICAgICAgIGVuZDogL1xcfSgtKilcIi9cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgICAgIGJlZ2luOiAvW3JSXVwiKC0qKVxcWy8sXG4gICAgICAgICAgICBlbmQ6IC9cXF0oLSopXCIvXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgICAgICBiZWdpbjogL1tyUl0nKC0qKVxcKC8sXG4gICAgICAgICAgICBlbmQ6IC9cXCkoLSopJy9cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgICAgIGJlZ2luOiAvW3JSXScoLSopXFx7LyxcbiAgICAgICAgICAgIGVuZDogL1xcfSgtKiknL1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgICAgICAgICAgYmVnaW46IC9bclJdJygtKilcXFsvLFxuICAgICAgICAgICAgZW5kOiAvXFxdKC0qKScvXG4gICAgICAgICAgfSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46ICdcIicsXG4gICAgICAgICAgICBlbmQ6ICdcIicsXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiBcIidcIixcbiAgICAgICAgICAgIGVuZDogXCInXCIsXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICB9LFxuXG4gICAgICAvLyBNYXRjaGluZyBudW1iZXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBwdW5jdHVhdGlvbiBhbmQgb3BlcmF0b3JzIGlzXG4gICAgICAvLyB0cmlja3kgc2luY2Ugd2UgbmVlZCB0byBsb29rIGF0IHRoZSBjaGFyYWN0ZXIgYWhlYWQgb2YgYSBudW1iZXIgdG9cbiAgICAgIC8vIGVuc3VyZSB0aGUgbnVtYmVyIGlzIG5vdCBwYXJ0IG9mIGFuIGlkZW50aWZpZXIsIGFuZCB3ZSBjYW5ub3QgdXNlXG4gICAgICAvLyBuZWdhdGl2ZSBsb29rLWJlaGluZCBhc3NlcnRpb25zLiBTbyBpbnN0ZWFkIHdlIGV4cGxpY2l0bHkgaGFuZGxlIGFsbFxuICAgICAgLy8gcG9zc2libGUgY29tYmluYXRpb25zIG9mIChvcGVyYXRvcnxwdW5jdHVhdGlvbiksIG51bWJlci5cbiAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBuZWdhdGl2ZSBsb29rLWJlaGluZCB3aGVuIGF2YWlsYWJsZVxuICAgICAgLy8geyBiZWdpbjogLyg/PCFbYS16QS1aMC05Ll9dKTBbeFhdWzAtOWEtZkEtRl0rXFwuWzAtOWEtZkEtRl0qW3BQXVsrLV0/XFxkK2k/LyB9LFxuICAgICAgLy8geyBiZWdpbjogLyg/PCFbYS16QS1aMC05Ll9dKTBbeFhdWzAtOWEtZkEtRl0rKFtwUF1bKy1dP1xcZCspP1tMaV0/LyB9LFxuICAgICAgLy8geyBiZWdpbjogLyg/PCFbYS16QS1aMC05Ll9dKShcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWystXT9cXGQrKT9bTGldPy8gfVxuICAgICAge1xuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgMTogJ29wZXJhdG9yJyxcbiAgICAgICAgICAgICAgMjogJ251bWJlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICBPUEVSQVRPUlNfUkUsXG4gICAgICAgICAgICAgIE5VTUJFUl9UWVBFU19SRVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgMTogJ29wZXJhdG9yJyxcbiAgICAgICAgICAgICAgMjogJ251bWJlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICAvJVteJV0qJS8sXG4gICAgICAgICAgICAgIE5VTUJFUl9UWVBFU19SRVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgMTogJ3B1bmN0dWF0aW9uJyxcbiAgICAgICAgICAgICAgMjogJ251bWJlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICBQVU5DVFVBVElPTl9SRSxcbiAgICAgICAgICAgICAgTlVNQkVSX1RZUEVTX1JFXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY29wZTogeyAyOiAnbnVtYmVyJyB9LFxuICAgICAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAgICAgL1teYS16QS1aMC05Ll9dfF4vLCAvLyBub3QgcGFydCBvZiBhbiBpZGVudGlmaWVyLCBvciBzdGFydCBvZiBkb2N1bWVudFxuICAgICAgICAgICAgICBOVU1CRVJfVFlQRVNfUkVcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG5cbiAgICAgIC8vIE9wZXJhdG9ycy9wdW5jdHVhdGlvbiB3aGVuIHRoZXkncmUgbm90IGRpcmVjdGx5IGZvbGxvd2VkIGJ5IG51bWJlcnNcbiAgICAgIHtcbiAgICAgICAgLy8gUmVsZXZhbmNlIGJvb3N0IGZvciB0aGUgbW9zdCBjb21tb24gYXNzaWdubWVudCBmb3JtLlxuICAgICAgICBzY29wZTogeyAzOiAnb3BlcmF0b3InIH0sXG4gICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgSURFTlRfUkUsXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIC88LS8sXG4gICAgICAgICAgL1xccysvXG4gICAgICAgIF1cbiAgICAgIH0sXG5cbiAgICAgIHtcbiAgICAgICAgc2NvcGU6ICdvcGVyYXRvcicsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7IG1hdGNoOiBPUEVSQVRPUlNfUkUgfSxcbiAgICAgICAgICB7IG1hdGNoOiAvJVteJV0qJS8gfVxuICAgICAgICBdXG4gICAgICB9LFxuXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAncHVuY3R1YXRpb24nLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIG1hdGNoOiBQVU5DVFVBVElPTl9SRVxuICAgICAgfSxcblxuICAgICAge1xuICAgICAgICAvLyBFc2NhcGVkIGlkZW50aWZpZXJcbiAgICAgICAgYmVnaW46ICdgJyxcbiAgICAgICAgZW5kOiAnYCcsXG4gICAgICAgIGNvbnRhaW5zOiBbIHsgYmVnaW46IC9cXFxcLi8gfSBdXG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyByIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFJ1YnlcbkRlc2NyaXB0aW9uOiBSdWJ5IGlzIGEgZHluYW1pYywgb3BlbiBzb3VyY2UgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugd2l0aCBhIGZvY3VzIG9uIHNpbXBsaWNpdHkgYW5kIHByb2R1Y3Rpdml0eS5cbldlYnNpdGU6IGh0dHBzOi8vd3d3LnJ1YnktbGFuZy5vcmcvXG5BdXRob3I6IEFudG9uIEtvdmFseW92IDxhbnRvbkBrb3ZhbHlvdi5uZXQ+XG5Db250cmlidXRvcnM6IFBldGVyIExlb25vdiA8Z29qcGVnQHlhbmRleC5ydT4sIFZhc2lseSBQb2xvdm55b3YgPHZhc3RAd2hpdGVhbnRzLm5ldD4sIExvcmVuIFNlZ2FsIDxsc2VnYWxAc29lbi5jYT4sIFBhc2NhbCBIdXJuaSA8cGhpQHJ1YnktcmVhY3RpdmUub3JnPiwgQ2VkcmljIFNvaHJhdWVyIDxzb2hyYXVlckBnb29nbGVtYWlsLmNvbT5cbkNhdGVnb3J5OiBjb21tb25cbiovXG5cbmZ1bmN0aW9uIHJ1YnkoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIGNvbnN0IFJVQllfTUVUSE9EX1JFID0gJyhbYS16QS1aX11cXFxcdypbIT89XT98Wy0rfl1AfDw8fD4+fD1+fD09PT98PD0+fFs8Pl09P3xcXFxcKlxcXFwqfFstLyslXiYqfmB8XXxcXFxcW1xcXFxdPT8pJztcbiAgLy8gVE9ETzogbW92ZSBjb25jZXB0cyBsaWtlIENBTUVMX0NBU0UgaW50byBgbW9kZXMuanNgXG4gIGNvbnN0IENMQVNTX05BTUVfUkUgPSByZWdleC5laXRoZXIoXG4gICAgL1xcYihbQS1aXStbYS16MC05XSspKy8sXG4gICAgLy8gZW5kcyBpbiBjYXBzXG4gICAgL1xcYihbQS1aXStbYS16MC05XSspK1tBLVpdKy8sXG4gIClcbiAgO1xuICBjb25zdCBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFID0gcmVnZXguY29uY2F0KENMQVNTX05BTUVfUkUsIC8oOjpcXHcrKSovKTtcbiAgLy8gdmVyeSBwb3B1bGFyIHJ1YnkgYnVpbHQtaW5zIHRoYXQgb25lIG1pZ2h0IGV2ZW4gYXNzdW1lXG4gIC8vIGFyZSBhY3R1YWwga2V5d29yZHMgKGRlc3BpdGUgdGhhdCBub3QgYmVpbmcgdGhlIGNhc2UpXG4gIGNvbnN0IFBTRVVET19LV1MgPSBbXG4gICAgXCJpbmNsdWRlXCIsXG4gICAgXCJleHRlbmRcIixcbiAgICBcInByZXBlbmRcIixcbiAgICBcInB1YmxpY1wiLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJvdGVjdGVkXCIsXG4gICAgXCJyYWlzZVwiLFxuICAgIFwidGhyb3dcIlxuICBdO1xuICBjb25zdCBSVUJZX0tFWVdPUkRTID0ge1xuICAgIFwidmFyaWFibGUuY29uc3RhbnRcIjogW1xuICAgICAgXCJfX0ZJTEVfX1wiLFxuICAgICAgXCJfX0xJTkVfX1wiLFxuICAgICAgXCJfX0VOQ09ESU5HX19cIlxuICAgIF0sXG4gICAgXCJ2YXJpYWJsZS5sYW5ndWFnZVwiOiBbXG4gICAgICBcInNlbGZcIixcbiAgICAgIFwic3VwZXJcIixcbiAgICBdLFxuICAgIGtleXdvcmQ6IFtcbiAgICAgIFwiYWxpYXNcIixcbiAgICAgIFwiYW5kXCIsXG4gICAgICBcImJlZ2luXCIsXG4gICAgICBcIkJFR0lOXCIsXG4gICAgICBcImJyZWFrXCIsXG4gICAgICBcImNhc2VcIixcbiAgICAgIFwiY2xhc3NcIixcbiAgICAgIFwiZGVmaW5lZFwiLFxuICAgICAgXCJkb1wiLFxuICAgICAgXCJlbHNlXCIsXG4gICAgICBcImVsc2lmXCIsXG4gICAgICBcImVuZFwiLFxuICAgICAgXCJFTkRcIixcbiAgICAgIFwiZW5zdXJlXCIsXG4gICAgICBcImZvclwiLFxuICAgICAgXCJpZlwiLFxuICAgICAgXCJpblwiLFxuICAgICAgXCJtb2R1bGVcIixcbiAgICAgIFwibmV4dFwiLFxuICAgICAgXCJub3RcIixcbiAgICAgIFwib3JcIixcbiAgICAgIFwicmVkb1wiLFxuICAgICAgXCJyZXF1aXJlXCIsXG4gICAgICBcInJlc2N1ZVwiLFxuICAgICAgXCJyZXRyeVwiLFxuICAgICAgXCJyZXR1cm5cIixcbiAgICAgIFwidGhlblwiLFxuICAgICAgXCJ1bmRlZlwiLFxuICAgICAgXCJ1bmxlc3NcIixcbiAgICAgIFwidW50aWxcIixcbiAgICAgIFwid2hlblwiLFxuICAgICAgXCJ3aGlsZVwiLFxuICAgICAgXCJ5aWVsZFwiLFxuICAgICAgLi4uUFNFVURPX0tXU1xuICAgIF0sXG4gICAgYnVpbHRfaW46IFtcbiAgICAgIFwicHJvY1wiLFxuICAgICAgXCJsYW1iZGFcIixcbiAgICAgIFwiYXR0cl9hY2Nlc3NvclwiLFxuICAgICAgXCJhdHRyX3JlYWRlclwiLFxuICAgICAgXCJhdHRyX3dyaXRlclwiLFxuICAgICAgXCJkZWZpbmVfbWV0aG9kXCIsXG4gICAgICBcInByaXZhdGVfY29uc3RhbnRcIixcbiAgICAgIFwibW9kdWxlX2Z1bmN0aW9uXCJcbiAgICBdLFxuICAgIGxpdGVyYWw6IFtcbiAgICAgIFwidHJ1ZVwiLFxuICAgICAgXCJmYWxzZVwiLFxuICAgICAgXCJuaWxcIlxuICAgIF1cbiAgfTtcbiAgY29uc3QgWUFSRE9DVEFHID0ge1xuICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgYmVnaW46ICdAW0EtWmEtel0rJ1xuICB9O1xuICBjb25zdCBJUkJfT0JKRUNUID0ge1xuICAgIGJlZ2luOiAnIzwnLFxuICAgIGVuZDogJz4nXG4gIH07XG4gIGNvbnN0IENPTU1FTlRfTU9ERVMgPSBbXG4gICAgaGxqcy5DT01NRU5UKFxuICAgICAgJyMnLFxuICAgICAgJyQnLFxuICAgICAgeyBjb250YWluczogWyBZQVJET0NUQUcgXSB9XG4gICAgKSxcbiAgICBobGpzLkNPTU1FTlQoXG4gICAgICAnXj1iZWdpbicsXG4gICAgICAnXj1lbmQnLFxuICAgICAge1xuICAgICAgICBjb250YWluczogWyBZQVJET0NUQUcgXSxcbiAgICAgICAgcmVsZXZhbmNlOiAxMFxuICAgICAgfVxuICAgICksXG4gICAgaGxqcy5DT01NRU5UKCdeX19FTkRfXycsIGhsanMuTUFUQ0hfTk9USElOR19SRSlcbiAgXTtcbiAgY29uc3QgU1VCU1QgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3Vic3QnLFxuICAgIGJlZ2luOiAvI1xcey8sXG4gICAgZW5kOiAvXFx9LyxcbiAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEU1xuICB9O1xuICBjb25zdCBTVFJJTkcgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgU1VCU1RcbiAgICBdLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJy8sXG4gICAgICAgIGVuZDogLycvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1wiLyxcbiAgICAgICAgZW5kOiAvXCIvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL2AvLFxuICAgICAgICBlbmQ6IC9gL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8lW3FRd1d4XT9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyVbcVF3V3hdP1xcWy8sXG4gICAgICAgIGVuZDogL1xcXS9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJVtxUXdXeF0/XFx7LyxcbiAgICAgICAgZW5kOiAvXFx9L1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8lW3FRd1d4XT88LyxcbiAgICAgICAgZW5kOiAvPi9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJVtxUXdXeF0/XFwvLyxcbiAgICAgICAgZW5kOiAvXFwvL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8lW3FRd1d4XT8lLyxcbiAgICAgICAgZW5kOiAvJS9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJVtxUXdXeF0/LS8sXG4gICAgICAgIGVuZDogLy0vXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyVbcVF3V3hdP1xcfC8sXG4gICAgICAgIGVuZDogL1xcfC9cbiAgICAgIH0sXG4gICAgICAvLyBpbiB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zLCBcXEIgaW4gdGhlIGJlZ2lubmluZyBzdXBwcmVzc2VzIHJlY29nbml0aW9uIG9mID8tc2VxdWVuY2VzXG4gICAgICAvLyB3aGVyZSA/IGlzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIHByZWNlZGluZyBpZGVudGlmaWVyLCBhcyBpbjogYGZ1bmM/NGBcbiAgICAgIHsgYmVnaW46IC9cXEJcXD8oXFxcXFxcZHsxLDN9KS8gfSxcbiAgICAgIHsgYmVnaW46IC9cXEJcXD8oXFxcXHhbQS1GYS1mMC05XXsxLDJ9KS8gfSxcbiAgICAgIHsgYmVnaW46IC9cXEJcXD8oXFxcXHVcXHs/W0EtRmEtZjAtOV17MSw2fVxcfT8pLyB9LFxuICAgICAgeyBiZWdpbjogL1xcQlxcPyhcXFxcTS1cXFxcQy18XFxcXE0tXFxcXGN8XFxcXGNcXFxcTS18XFxcXE0tfFxcXFxDLVxcXFxNLSlbXFx4MjAtXFx4N2VdLyB9LFxuICAgICAgeyBiZWdpbjogL1xcQlxcP1xcXFwoY3xDLSlbXFx4MjAtXFx4N2VdLyB9LFxuICAgICAgeyBiZWdpbjogL1xcQlxcP1xcXFw/XFxTLyB9LFxuICAgICAgLy8gaGVyZWRvY3NcbiAgICAgIHtcbiAgICAgICAgLy8gdGhpcyBndWFyZCBtYWtlcyBzdXJlIHRoYXQgd2UgaGF2ZSBhbiBlbnRpcmUgaGVyZWRvYyBhbmQgbm90IGEgZmFsc2VcbiAgICAgICAgLy8gcG9zaXRpdmUgKGF1dG8tZGV0ZWN0LCBldGMuKVxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgICAgIC88PFstfl0/Jz8vLFxuICAgICAgICAgIHJlZ2V4Lmxvb2thaGVhZCgvKFxcdyspKD89XFxXKVteXFxuXSpcXG4oPzpbXlxcbl0qXFxuKSo/XFxzKlxcMVxcYi8pXG4gICAgICAgICksXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgICAgICBiZWdpbjogLyhcXHcrKS8sXG4gICAgICAgICAgICBlbmQ6IC8oXFx3KykvLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgICAgICBTVUJTVFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH07XG5cbiAgLy8gUnVieSBzeW50YXggaXMgdW5kZXJkb2N1bWVudGVkLCBidXQgdGhpcyBncmFtbWFyIHNlZW1zIHRvIGJlIGFjY3VyYXRlXG4gIC8vIGFzIG9mIHZlcnNpb24gMi43LjIgKGNvbmZpcm1lZCB3aXRoIChpcmIgYW5kIGBSaXBwZXIuc2V4cCguLi4pYClcbiAgLy8gaHR0cHM6Ly9kb2NzLnJ1YnktbGFuZy5vcmcvZW4vMi43LjAvZG9jL3N5bnRheC9saXRlcmFsc19yZG9jLmh0bWwjbGFiZWwtTnVtYmVyc1xuICBjb25zdCBkZWNpbWFsID0gJ1sxLTldKF8/WzAtOV0pKnwwJztcbiAgY29uc3QgZGlnaXRzID0gJ1swLTldKF8/WzAtOV0pKic7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gZGVjaW1hbCBpbnRlZ2VyL2Zsb2F0LCBvcHRpb25hbGx5IGV4cG9uZW50aWFsIG9yIHJhdGlvbmFsLCBvcHRpb25hbGx5IGltYWdpbmFyeVxuICAgICAgeyBiZWdpbjogYFxcXFxiKCR7ZGVjaW1hbH0pKFxcXFwuKCR7ZGlnaXRzfSkpPyhbZUVdWystXT8oJHtkaWdpdHN9KXxyKT9pP1xcXFxiYCB9LFxuXG4gICAgICAvLyBleHBsaWNpdCBkZWNpbWFsL2JpbmFyeS9vY3RhbC9oZXhhZGVjaW1hbCBpbnRlZ2VyLFxuICAgICAgLy8gb3B0aW9uYWxseSByYXRpb25hbCBhbmQvb3IgaW1hZ2luYXJ5XG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFtkRF1bMC05XShfP1swLTldKSpyP2k/XFxcXGJcIiB9LFxuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbYkJdWzAtMV0oXz9bMC0xXSkqcj9pP1xcXFxiXCIgfSxcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwW29PXVswLTddKF8/WzAtN10pKnI/aT9cXFxcYlwiIH0sXG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFt4WF1bMC05YS1mQS1GXShfP1swLTlhLWZBLUZdKSpyP2k/XFxcXGJcIiB9LFxuXG4gICAgICAvLyAwLXByZWZpeGVkIGltcGxpY2l0IG9jdGFsIGludGVnZXIsIG9wdGlvbmFsbHkgcmF0aW9uYWwgYW5kL29yIGltYWdpbmFyeVxuICAgICAgeyBiZWdpbjogXCJcXFxcYjAoXz9bMC03XSkrcj9pP1xcXFxiXCIgfVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBQQVJBTVMgPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IC9cXChcXCkvLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC8oPz1cXCkpLyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBlbmRzUGFyZW50OiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEUyxcbiAgICAgIH1cbiAgICBdXG4gIH07XG5cbiAgY29uc3QgSU5DTFVERV9FWFRFTkQgPSB7XG4gICAgbWF0Y2g6IFtcbiAgICAgIC8oaW5jbHVkZXxleHRlbmQpXFxzKy8sXG4gICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFXG4gICAgXSxcbiAgICBzY29wZToge1xuICAgICAgMjogXCJ0aXRsZS5jbGFzc1wiXG4gICAgfSxcbiAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEU1xuICB9O1xuXG4gIGNvbnN0IENMQVNTX0RFRklOSVRJT04gPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY2xhc3NcXHMrLyxcbiAgICAgICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFLFxuICAgICAgICAgIC9cXHMrPFxccysvLFxuICAgICAgICAgIENMQVNTX05BTUVfV0lUSF9OQU1FU1BBQ0VfUkVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvXFxiKGNsYXNzfG1vZHVsZSlcXHMrLyxcbiAgICAgICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdLFxuICAgIHNjb3BlOiB7XG4gICAgICAyOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICA0OiBcInRpdGxlLmNsYXNzLmluaGVyaXRlZFwiXG4gICAgfSxcbiAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEU1xuICB9O1xuXG4gIGNvbnN0IFVQUEVSX0NBU0VfQ09OU1RBTlQgPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOiAvXFxiW0EtWl1bQS1aXzAtOV0rXFxiLyxcbiAgICBjbGFzc05hbWU6IFwidmFyaWFibGUuY29uc3RhbnRcIlxuICB9O1xuXG4gIGNvbnN0IE1FVEhPRF9ERUZJTklUSU9OID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvZGVmLywgL1xccysvLFxuICAgICAgUlVCWV9NRVRIT0RfUkVcbiAgICBdLFxuICAgIHNjb3BlOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIFBBUkFNU1xuICAgIF1cbiAgfTtcblxuICBjb25zdCBPQkpFQ1RfQ1JFQVRJT04gPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOiBbXG4gICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFLFxuICAgICAgL1xcLm5ld1suIChdL1xuICAgIF0sXG4gICAgc2NvcGU6IHtcbiAgICAgIDE6IFwidGl0bGUuY2xhc3NcIlxuICAgIH1cbiAgfTtcblxuICAvLyBDYW1lbENhc2VcbiAgY29uc3QgQ0xBU1NfUkVGRVJFTkNFID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBtYXRjaDogQ0xBU1NfTkFNRV9SRSxcbiAgICBzY29wZTogXCJ0aXRsZS5jbGFzc1wiXG4gIH07XG5cbiAgY29uc3QgUlVCWV9ERUZBVUxUX0NPTlRBSU5TID0gW1xuICAgIFNUUklORyxcbiAgICBDTEFTU19ERUZJTklUSU9OLFxuICAgIElOQ0xVREVfRVhURU5ELFxuICAgIE9CSkVDVF9DUkVBVElPTixcbiAgICBVUFBFUl9DQVNFX0NPTlNUQU5ULFxuICAgIENMQVNTX1JFRkVSRU5DRSxcbiAgICBNRVRIT0RfREVGSU5JVElPTixcbiAgICB7XG4gICAgICAvLyBzd2FsbG93IG5hbWVzcGFjZSBxdWFsaWZpZXJzIGJlZm9yZSBzeW1ib2xzXG4gICAgICBiZWdpbjogaGxqcy5JREVOVF9SRSArICc6OicgfSxcbiAgICB7XG4gICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICcoIXxcXFxcPyk/OicsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3N5bWJvbCcsXG4gICAgICBiZWdpbjogJzooPyFcXFxccyknLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgU1RSSU5HLFxuICAgICAgICB7IGJlZ2luOiBSVUJZX01FVEhPRF9SRSB9XG4gICAgICBdLFxuICAgICAgcmVsZXZhbmNlOiAwXG4gICAgfSxcbiAgICBOVU1CRVIsXG4gICAge1xuICAgICAgLy8gbmVnYXRpdmUtbG9vayBmb3J3YXJkIGF0dGVtcHRzIHRvIHByZXZlbnQgZmFsc2UgbWF0Y2hlcyBsaWtlOlxuICAgICAgLy8gQGlkZW50QCBvciAkaWRlbnQkIHRoYXQgbWlnaHQgaW5kaWNhdGUgdGhpcyBpcyBub3QgcnVieSBhdCBhbGxcbiAgICAgIGNsYXNzTmFtZTogXCJ2YXJpYWJsZVwiLFxuICAgICAgYmVnaW46ICcoXFxcXCRcXFxcVyl8KChcXFxcJHxAQD8pKFxcXFx3KykpKD89W15AJD9dKScgKyBgKD8hW0EtWmEtel0pKD8hW0AkPyddKWBcbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICBiZWdpbjogL1xcfC8sXG4gICAgICBlbmQ6IC9cXHwvLFxuICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgIHJlbGV2YW5jZTogMCwgLy8gdGhpcyBjb3VsZCBiZSBhIGxvdCBvZiB0aGluZ3MgKGluIG90aGVyIGxhbmd1YWdlcykgb3RoZXIgdGhhbiBwYXJhbXNcbiAgICAgIGtleXdvcmRzOiBSVUJZX0tFWVdPUkRTXG4gICAgfSxcbiAgICB7IC8vIHJlZ2V4cCBjb250YWluZXJcbiAgICAgIGJlZ2luOiAnKCcgKyBobGpzLlJFX1NUQVJURVJTX1JFICsgJ3x1bmxlc3MpXFxcXHMqJyxcbiAgICAgIGtleXdvcmRzOiAndW5sZXNzJyxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZWdleHAnLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgICAgICBTVUJTVFxuICAgICAgICAgIF0sXG4gICAgICAgICAgaWxsZWdhbDogL1xcbi8sXG4gICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYmVnaW46ICcvJyxcbiAgICAgICAgICAgICAgZW5kOiAnL1thLXpdKidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJlZ2luOiAvJXJcXHsvLFxuICAgICAgICAgICAgICBlbmQ6IC9cXH1bYS16XSovXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBiZWdpbjogJyVyXFxcXCgnLFxuICAgICAgICAgICAgICBlbmQ6ICdcXFxcKVthLXpdKidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJlZ2luOiAnJXIhJyxcbiAgICAgICAgICAgICAgZW5kOiAnIVthLXpdKidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJlZ2luOiAnJXJcXFxcWycsXG4gICAgICAgICAgICAgIGVuZDogJ1xcXFxdW2Etel0qJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXS5jb25jYXQoSVJCX09CSkVDVCwgQ09NTUVOVF9NT0RFUyksXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9XG4gIF0uY29uY2F0KElSQl9PQkpFQ1QsIENPTU1FTlRfTU9ERVMpO1xuXG4gIFNVQlNULmNvbnRhaW5zID0gUlVCWV9ERUZBVUxUX0NPTlRBSU5TO1xuICBQQVJBTVMuY29udGFpbnMgPSBSVUJZX0RFRkFVTFRfQ09OVEFJTlM7XG5cbiAgLy8gPj5cbiAgLy8gPz5cbiAgY29uc3QgU0lNUExFX1BST01QVCA9IFwiWz4/XT5cIjtcbiAgLy8gaXJiKG1haW4pOjAwMTowPlxuICBjb25zdCBERUZBVUxUX1BST01QVCA9IFwiW1xcXFx3I10rXFxcXChcXFxcdytcXFxcKTpcXFxcZCs6XFxcXGQrWz4qXVwiO1xuICBjb25zdCBSVk1fUFJPTVBUID0gXCIoXFxcXHcrLSk/XFxcXGQrXFxcXC5cXFxcZCtcXFxcLlxcXFxkKyhwXFxcXGQrKT9bXlxcXFxkXVtePl0rPlwiO1xuXG4gIGNvbnN0IElSQl9ERUZBVUxUID0gW1xuICAgIHtcbiAgICAgIGJlZ2luOiAvXlxccyo9Pi8sXG4gICAgICBzdGFydHM6IHtcbiAgICAgICAgZW5kOiAnJCcsXG4gICAgICAgIGNvbnRhaW5zOiBSVUJZX0RFRkFVTFRfQ09OVEFJTlNcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ21ldGEucHJvbXB0JyxcbiAgICAgIGJlZ2luOiAnXignICsgU0lNUExFX1BST01QVCArIFwifFwiICsgREVGQVVMVF9QUk9NUFQgKyAnfCcgKyBSVk1fUFJPTVBUICsgJykoPz1bIF0pJyxcbiAgICAgIHN0YXJ0czoge1xuICAgICAgICBlbmQ6ICckJyxcbiAgICAgICAga2V5d29yZHM6IFJVQllfS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBSVUJZX0RFRkFVTFRfQ09OVEFJTlNcbiAgICAgIH1cbiAgICB9XG4gIF07XG5cbiAgQ09NTUVOVF9NT0RFUy51bnNoaWZ0KElSQl9PQkpFQ1QpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1J1YnknLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdyYicsXG4gICAgICAnZ2Vtc3BlYycsXG4gICAgICAncG9kc3BlYycsXG4gICAgICAndGhvcicsXG4gICAgICAnaXJiJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IFJVQllfS0VZV09SRFMsXG4gICAgaWxsZWdhbDogL1xcL1xcKi8sXG4gICAgY29udGFpbnM6IFsgaGxqcy5TSEVCQU5HKHsgYmluYXJ5OiBcInJ1YnlcIiB9KSBdXG4gICAgICAuY29uY2F0KElSQl9ERUZBVUxUKVxuICAgICAgLmNvbmNhdChDT01NRU5UX01PREVTKVxuICAgICAgLmNvbmNhdChSVUJZX0RFRkFVTFRfQ09OVEFJTlMpXG4gIH07XG59XG5cbmV4cG9ydCB7IHJ1YnkgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogUnVzdFxuQXV0aG9yOiBBbmRyZXkgVmxhc292c2tpa2ggPGFuZHJleS52bGFzb3Zza2lraEBnbWFpbC5jb20+XG5Db250cmlidXRvcnM6IFJvbWFuIFNobWF0b3YgPHJvbWFuc2htYXRvdkBnbWFpbC5jb20+LCBLYXNwZXIgQW5kZXJzZW4gPGttYV91bnRydXN0ZWRAcHJvdG9ubWFpbC5jb20+XG5XZWJzaXRlOiBodHRwczovL3d3dy5ydXN0LWxhbmcub3JnXG5DYXRlZ29yeTogY29tbW9uLCBzeXN0ZW1cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBydXN0KGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBGVU5DVElPTl9JTlZPS0UgPSB7XG4gICAgY2xhc3NOYW1lOiBcInRpdGxlLmZ1bmN0aW9uLmludm9rZVwiLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1xcYi8sXG4gICAgICAvKD8hbGV0XFxiKS8sXG4gICAgICBobGpzLklERU5UX1JFLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC9cXHMqXFwoLykpXG4gIH07XG4gIGNvbnN0IE5VTUJFUl9TVUZGSVggPSAnKFt1aV0oOHwxNnwzMnw2NHwxMjh8c2l6ZSl8ZigzMnw2NCkpXFw/JztcbiAgY29uc3QgS0VZV09SRFMgPSBbXG4gICAgXCJhYnN0cmFjdFwiLFxuICAgIFwiYXNcIixcbiAgICBcImFzeW5jXCIsXG4gICAgXCJhd2FpdFwiLFxuICAgIFwiYmVjb21lXCIsXG4gICAgXCJib3hcIixcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjb25zdFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImNyYXRlXCIsXG4gICAgXCJkb1wiLFxuICAgIFwiZHluXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsXG4gICAgXCJleHRlcm5cIixcbiAgICBcImZhbHNlXCIsXG4gICAgXCJmaW5hbFwiLFxuICAgIFwiZm5cIixcbiAgICBcImZvclwiLFxuICAgIFwiaWZcIixcbiAgICBcImltcGxcIixcbiAgICBcImluXCIsXG4gICAgXCJsZXRcIixcbiAgICBcImxvb3BcIixcbiAgICBcIm1hY3JvXCIsXG4gICAgXCJtYXRjaFwiLFxuICAgIFwibW9kXCIsXG4gICAgXCJtb3ZlXCIsXG4gICAgXCJtdXRcIixcbiAgICBcIm92ZXJyaWRlXCIsXG4gICAgXCJwcml2XCIsXG4gICAgXCJwdWJcIixcbiAgICBcInJlZlwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzZWxmXCIsXG4gICAgXCJTZWxmXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICBcInN0cnVjdFwiLFxuICAgIFwic3VwZXJcIixcbiAgICBcInRyYWl0XCIsXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJ0cnlcIixcbiAgICBcInR5cGVcIixcbiAgICBcInR5cGVvZlwiLFxuICAgIFwidW5zYWZlXCIsXG4gICAgXCJ1bnNpemVkXCIsXG4gICAgXCJ1c2VcIixcbiAgICBcInZpcnR1YWxcIixcbiAgICBcIndoZXJlXCIsXG4gICAgXCJ3aGlsZVwiLFxuICAgIFwieWllbGRcIlxuICBdO1xuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICBcInRydWVcIixcbiAgICBcImZhbHNlXCIsXG4gICAgXCJTb21lXCIsXG4gICAgXCJOb25lXCIsXG4gICAgXCJPa1wiLFxuICAgIFwiRXJyXCJcbiAgXTtcbiAgY29uc3QgQlVJTFRJTlMgPSBbXG4gICAgLy8gZnVuY3Rpb25zXG4gICAgJ2Ryb3AgJyxcbiAgICAvLyB0cmFpdHNcbiAgICBcIkNvcHlcIixcbiAgICBcIlNlbmRcIixcbiAgICBcIlNpemVkXCIsXG4gICAgXCJTeW5jXCIsXG4gICAgXCJEcm9wXCIsXG4gICAgXCJGblwiLFxuICAgIFwiRm5NdXRcIixcbiAgICBcIkZuT25jZVwiLFxuICAgIFwiVG9Pd25lZFwiLFxuICAgIFwiQ2xvbmVcIixcbiAgICBcIkRlYnVnXCIsXG4gICAgXCJQYXJ0aWFsRXFcIixcbiAgICBcIlBhcnRpYWxPcmRcIixcbiAgICBcIkVxXCIsXG4gICAgXCJPcmRcIixcbiAgICBcIkFzUmVmXCIsXG4gICAgXCJBc011dFwiLFxuICAgIFwiSW50b1wiLFxuICAgIFwiRnJvbVwiLFxuICAgIFwiRGVmYXVsdFwiLFxuICAgIFwiSXRlcmF0b3JcIixcbiAgICBcIkV4dGVuZFwiLFxuICAgIFwiSW50b0l0ZXJhdG9yXCIsXG4gICAgXCJEb3VibGVFbmRlZEl0ZXJhdG9yXCIsXG4gICAgXCJFeGFjdFNpemVJdGVyYXRvclwiLFxuICAgIFwiU2xpY2VDb25jYXRFeHRcIixcbiAgICBcIlRvU3RyaW5nXCIsXG4gICAgLy8gbWFjcm9zXG4gICAgXCJhc3NlcnQhXCIsXG4gICAgXCJhc3NlcnRfZXEhXCIsXG4gICAgXCJiaXRmbGFncyFcIixcbiAgICBcImJ5dGVzIVwiLFxuICAgIFwiY2ZnIVwiLFxuICAgIFwiY29sIVwiLFxuICAgIFwiY29uY2F0IVwiLFxuICAgIFwiY29uY2F0X2lkZW50cyFcIixcbiAgICBcImRlYnVnX2Fzc2VydCFcIixcbiAgICBcImRlYnVnX2Fzc2VydF9lcSFcIixcbiAgICBcImVudiFcIixcbiAgICBcInBhbmljIVwiLFxuICAgIFwiZmlsZSFcIixcbiAgICBcImZvcm1hdCFcIixcbiAgICBcImZvcm1hdF9hcmdzIVwiLFxuICAgIFwiaW5jbHVkZV9ieXRlcyFcIixcbiAgICBcImluY2x1ZGVfc3RyIVwiLFxuICAgIFwibGluZSFcIixcbiAgICBcImxvY2FsX2RhdGFfa2V5IVwiLFxuICAgIFwibW9kdWxlX3BhdGghXCIsXG4gICAgXCJvcHRpb25fZW52IVwiLFxuICAgIFwicHJpbnQhXCIsXG4gICAgXCJwcmludGxuIVwiLFxuICAgIFwic2VsZWN0IVwiLFxuICAgIFwic3RyaW5naWZ5IVwiLFxuICAgIFwidHJ5IVwiLFxuICAgIFwidW5pbXBsZW1lbnRlZCFcIixcbiAgICBcInVucmVhY2hhYmxlIVwiLFxuICAgIFwidmVjIVwiLFxuICAgIFwid3JpdGUhXCIsXG4gICAgXCJ3cml0ZWxuIVwiLFxuICAgIFwibWFjcm9fcnVsZXMhXCIsXG4gICAgXCJhc3NlcnRfbmUhXCIsXG4gICAgXCJkZWJ1Z19hc3NlcnRfbmUhXCJcbiAgXTtcbiAgY29uc3QgVFlQRVMgPSBbXG4gICAgXCJpOFwiLFxuICAgIFwiaTE2XCIsXG4gICAgXCJpMzJcIixcbiAgICBcImk2NFwiLFxuICAgIFwiaTEyOFwiLFxuICAgIFwiaXNpemVcIixcbiAgICBcInU4XCIsXG4gICAgXCJ1MTZcIixcbiAgICBcInUzMlwiLFxuICAgIFwidTY0XCIsXG4gICAgXCJ1MTI4XCIsXG4gICAgXCJ1c2l6ZVwiLFxuICAgIFwiZjMyXCIsXG4gICAgXCJmNjRcIixcbiAgICBcInN0clwiLFxuICAgIFwiY2hhclwiLFxuICAgIFwiYm9vbFwiLFxuICAgIFwiQm94XCIsXG4gICAgXCJPcHRpb25cIixcbiAgICBcIlJlc3VsdFwiLFxuICAgIFwiU3RyaW5nXCIsXG4gICAgXCJWZWNcIlxuICBdO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSdXN0JyxcbiAgICBhbGlhc2VzOiBbICdycycgXSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAgJHBhdHRlcm46IGhsanMuSURFTlRfUkUgKyAnIT8nLFxuICAgICAgdHlwZTogVFlQRVMsXG4gICAgICBrZXl3b3JkOiBLRVlXT1JEUyxcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgICAgYnVpbHRfaW46IEJVSUxUSU5TXG4gICAgfSxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNPTU1FTlQoJy9cXFxcKicsICdcXFxcKi8nLCB7IGNvbnRhaW5zOiBbICdzZWxmJyBdIH0pLFxuICAgICAgaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHtcbiAgICAgICAgYmVnaW46IC9iP1wiLyxcbiAgICAgICAgaWxsZWdhbDogbnVsbFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgeyBiZWdpbjogL2I/cigjKilcIigufFxcbikqP1wiXFwxKD8hIykvIH0sXG4gICAgICAgICAgeyBiZWdpbjogL2I/J1xcXFw/KHhcXHd7Mn18dVxcd3s0fXxVXFx3ezh9fC4pJy8gfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgICBiZWdpbjogLydbYS16QS1aX11bYS16QS1aMC05X10qL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7IGJlZ2luOiAnXFxcXGIwYihbMDFfXSspJyArIE5VTUJFUl9TVUZGSVggfSxcbiAgICAgICAgICB7IGJlZ2luOiAnXFxcXGIwbyhbMC03X10rKScgKyBOVU1CRVJfU1VGRklYIH0sXG4gICAgICAgICAgeyBiZWdpbjogJ1xcXFxiMHgoW0EtRmEtZjAtOV9dKyknICsgTlVNQkVSX1NVRkZJWCB9LFxuICAgICAgICAgIHsgYmVnaW46ICdcXFxcYihcXFxcZFtcXFxcZF9dKihcXFxcLlswLTlfXSspPyhbZUVdWystXT9bMC05X10rKT8pJ1xuICAgICAgICAgICAgICAgICAgICsgTlVNQkVSX1NVRkZJWCB9XG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvZm4vLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBobGpzLlVOREVSU0NPUkVfSURFTlRfUkVcbiAgICAgICAgXSxcbiAgICAgICAgY2xhc3NOYW1lOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICBiZWdpbjogJyMhP1xcXFxbJyxcbiAgICAgICAgZW5kOiAnXFxcXF0nLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgICAgICBiZWdpbjogL1wiLyxcbiAgICAgICAgICAgIGVuZDogL1wiL1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvbGV0LyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgLyg/Om11dFxccyspPy8sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDQ6IFwidmFyaWFibGVcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gbXVzdCBjb21lIGJlZm9yZSBpbXBsL2ZvciBydWxlIGxhdGVyXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBbXG4gICAgICAgICAgL2Zvci8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgL2luL1xuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInZhcmlhYmxlXCIsXG4gICAgICAgICAgNTogXCJrZXl3b3JkXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvdHlwZS8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRVxuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvKD86dHJhaXR8ZW51bXxzdHJ1Y3R8dW5pb258aW1wbHxmb3IpLyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidGl0bGUuY2xhc3NcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogaGxqcy5JREVOVF9SRSArICc6OicsXG4gICAgICAgIGtleXdvcmRzOiB7XG4gICAgICAgICAga2V5d29yZDogXCJTZWxmXCIsXG4gICAgICAgICAgYnVpbHRfaW46IEJVSUxUSU5TLFxuICAgICAgICAgIHR5cGU6IFRZUEVTXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJwdW5jdHVhdGlvblwiLFxuICAgICAgICBiZWdpbjogJy0+J1xuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX0lOVk9LRVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgcnVzdCBhcyBkZWZhdWx0IH07XG4iLCAiY29uc3QgTU9ERVMgPSAoaGxqcykgPT4ge1xuICByZXR1cm4ge1xuICAgIElNUE9SVEFOVDoge1xuICAgICAgc2NvcGU6ICdtZXRhJyxcbiAgICAgIGJlZ2luOiAnIWltcG9ydGFudCdcbiAgICB9LFxuICAgIEJMT0NLX0NPTU1FTlQ6IGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgSEVYQ09MT1I6IHtcbiAgICAgIHNjb3BlOiAnbnVtYmVyJyxcbiAgICAgIGJlZ2luOiAvIygoWzAtOWEtZkEtRl17Myw0fSl8KChbMC05YS1mQS1GXXsyfSl7Myw0fSkpXFxiL1xuICAgIH0sXG4gICAgRlVOQ1RJT05fRElTUEFUQ0g6IHtcbiAgICAgIGNsYXNzTmFtZTogXCJidWlsdF9pblwiLFxuICAgICAgYmVnaW46IC9bXFx3LV0rKD89XFwoKS9cbiAgICB9LFxuICAgIEFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ3NlbGVjdG9yLWF0dHInLFxuICAgICAgYmVnaW46IC9cXFsvLFxuICAgICAgZW5kOiAvXFxdLyxcbiAgICAgIGlsbGVnYWw6ICckJyxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICAgICAgXVxuICAgIH0sXG4gICAgQ1NTX05VTUJFUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogaGxqcy5OVU1CRVJfUkUgKyAnKCcgK1xuICAgICAgICAnJXxlbXxleHxjaHxyZW0nICtcbiAgICAgICAgJ3x2d3x2aHx2bWlufHZtYXgnICtcbiAgICAgICAgJ3xjbXxtbXxpbnxwdHxwY3xweCcgK1xuICAgICAgICAnfGRlZ3xncmFkfHJhZHx0dXJuJyArXG4gICAgICAgICd8c3xtcycgK1xuICAgICAgICAnfEh6fGtIeicgK1xuICAgICAgICAnfGRwaXxkcGNtfGRwcHgnICtcbiAgICAgICAgJyk/JyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgQ1NTX1ZBUklBQkxFOiB7XG4gICAgICBjbGFzc05hbWU6IFwiYXR0clwiLFxuICAgICAgYmVnaW46IC8tLVtBLVphLXpdW0EtWmEtejAtOV8tXSovXG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgVEFHUyA9IFtcbiAgJ2EnLFxuICAnYWJicicsXG4gICdhZGRyZXNzJyxcbiAgJ2FydGljbGUnLFxuICAnYXNpZGUnLFxuICAnYXVkaW8nLFxuICAnYicsXG4gICdibG9ja3F1b3RlJyxcbiAgJ2JvZHknLFxuICAnYnV0dG9uJyxcbiAgJ2NhbnZhcycsXG4gICdjYXB0aW9uJyxcbiAgJ2NpdGUnLFxuICAnY29kZScsXG4gICdkZCcsXG4gICdkZWwnLFxuICAnZGV0YWlscycsXG4gICdkZm4nLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2VtJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWRlcicsXG4gICdoZ3JvdXAnLFxuICAnaHRtbCcsXG4gICdpJyxcbiAgJ2lmcmFtZScsXG4gICdpbWcnLFxuICAnaW5wdXQnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdsYWJlbCcsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbWFpbicsXG4gICdtYXJrJyxcbiAgJ21lbnUnLFxuICAnbmF2JyxcbiAgJ29iamVjdCcsXG4gICdvbCcsXG4gICdwJyxcbiAgJ3EnLFxuICAncXVvdGUnLFxuICAnc2FtcCcsXG4gICdzZWN0aW9uJyxcbiAgJ3NwYW4nLFxuICAnc3Ryb25nJyxcbiAgJ3N1bW1hcnknLFxuICAnc3VwJyxcbiAgJ3RhYmxlJyxcbiAgJ3Rib2R5JyxcbiAgJ3RkJyxcbiAgJ3RleHRhcmVhJyxcbiAgJ3Rmb290JyxcbiAgJ3RoJyxcbiAgJ3RoZWFkJyxcbiAgJ3RpbWUnLFxuICAndHInLFxuICAndWwnLFxuICAndmFyJyxcbiAgJ3ZpZGVvJ1xuXTtcblxuY29uc3QgTUVESUFfRkVBVFVSRVMgPSBbXG4gICdhbnktaG92ZXInLFxuICAnYW55LXBvaW50ZXInLFxuICAnYXNwZWN0LXJhdGlvJyxcbiAgJ2NvbG9yJyxcbiAgJ2NvbG9yLWdhbXV0JyxcbiAgJ2NvbG9yLWluZGV4JyxcbiAgJ2RldmljZS1hc3BlY3QtcmF0aW8nLFxuICAnZGV2aWNlLWhlaWdodCcsXG4gICdkZXZpY2Utd2lkdGgnLFxuICAnZGlzcGxheS1tb2RlJyxcbiAgJ2ZvcmNlZC1jb2xvcnMnLFxuICAnZ3JpZCcsXG4gICdoZWlnaHQnLFxuICAnaG92ZXInLFxuICAnaW52ZXJ0ZWQtY29sb3JzJyxcbiAgJ21vbm9jaHJvbWUnLFxuICAnb3JpZW50YXRpb24nLFxuICAnb3ZlcmZsb3ctYmxvY2snLFxuICAnb3ZlcmZsb3ctaW5saW5lJyxcbiAgJ3BvaW50ZXInLFxuICAncHJlZmVycy1jb2xvci1zY2hlbWUnLFxuICAncHJlZmVycy1jb250cmFzdCcsXG4gICdwcmVmZXJzLXJlZHVjZWQtbW90aW9uJyxcbiAgJ3ByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3knLFxuICAncmVzb2x1dGlvbicsXG4gICdzY2FuJyxcbiAgJ3NjcmlwdGluZycsXG4gICd1cGRhdGUnLFxuICAnd2lkdGgnLFxuICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uP1xuICAnbWluLXdpZHRoJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21heC1oZWlnaHQnXG5dO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvUHNldWRvLWNsYXNzZXNcbmNvbnN0IFBTRVVET19DTEFTU0VTID0gW1xuICAnYWN0aXZlJyxcbiAgJ2FueS1saW5rJyxcbiAgJ2JsYW5rJyxcbiAgJ2NoZWNrZWQnLFxuICAnY3VycmVudCcsXG4gICdkZWZhdWx0JyxcbiAgJ2RlZmluZWQnLFxuICAnZGlyJywgLy8gZGlyKClcbiAgJ2Rpc2FibGVkJyxcbiAgJ2Ryb3AnLFxuICAnZW1wdHknLFxuICAnZW5hYmxlZCcsXG4gICdmaXJzdCcsXG4gICdmaXJzdC1jaGlsZCcsXG4gICdmaXJzdC1vZi10eXBlJyxcbiAgJ2Z1bGxzY3JlZW4nLFxuICAnZnV0dXJlJyxcbiAgJ2ZvY3VzJyxcbiAgJ2ZvY3VzLXZpc2libGUnLFxuICAnZm9jdXMtd2l0aGluJyxcbiAgJ2hhcycsIC8vIGhhcygpXG4gICdob3N0JywgLy8gaG9zdCBvciBob3N0KClcbiAgJ2hvc3QtY29udGV4dCcsIC8vIGhvc3QtY29udGV4dCgpXG4gICdob3ZlcicsXG4gICdpbmRldGVybWluYXRlJyxcbiAgJ2luLXJhbmdlJyxcbiAgJ2ludmFsaWQnLFxuICAnaXMnLCAvLyBpcygpXG4gICdsYW5nJywgLy8gbGFuZygpXG4gICdsYXN0LWNoaWxkJyxcbiAgJ2xhc3Qtb2YtdHlwZScsXG4gICdsZWZ0JyxcbiAgJ2xpbmsnLFxuICAnbG9jYWwtbGluaycsXG4gICdub3QnLCAvLyBub3QoKVxuICAnbnRoLWNoaWxkJywgLy8gbnRoLWNoaWxkKClcbiAgJ250aC1jb2wnLCAvLyBudGgtY29sKClcbiAgJ250aC1sYXN0LWNoaWxkJywgLy8gbnRoLWxhc3QtY2hpbGQoKVxuICAnbnRoLWxhc3QtY29sJywgLy8gbnRoLWxhc3QtY29sKClcbiAgJ250aC1sYXN0LW9mLXR5cGUnLCAvL250aC1sYXN0LW9mLXR5cGUoKVxuICAnbnRoLW9mLXR5cGUnLCAvL250aC1vZi10eXBlKClcbiAgJ29ubHktY2hpbGQnLFxuICAnb25seS1vZi10eXBlJyxcbiAgJ29wdGlvbmFsJyxcbiAgJ291dC1vZi1yYW5nZScsXG4gICdwYXN0JyxcbiAgJ3BsYWNlaG9sZGVyLXNob3duJyxcbiAgJ3JlYWQtb25seScsXG4gICdyZWFkLXdyaXRlJyxcbiAgJ3JlcXVpcmVkJyxcbiAgJ3JpZ2h0JyxcbiAgJ3Jvb3QnLFxuICAnc2NvcGUnLFxuICAndGFyZ2V0JyxcbiAgJ3RhcmdldC13aXRoaW4nLFxuICAndXNlci1pbnZhbGlkJyxcbiAgJ3ZhbGlkJyxcbiAgJ3Zpc2l0ZWQnLFxuICAnd2hlcmUnIC8vIHdoZXJlKClcbl07XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Qc2V1ZG8tZWxlbWVudHNcbmNvbnN0IFBTRVVET19FTEVNRU5UUyA9IFtcbiAgJ2FmdGVyJyxcbiAgJ2JhY2tkcm9wJyxcbiAgJ2JlZm9yZScsXG4gICdjdWUnLFxuICAnY3VlLXJlZ2lvbicsXG4gICdmaXJzdC1sZXR0ZXInLFxuICAnZmlyc3QtbGluZScsXG4gICdncmFtbWFyLWVycm9yJyxcbiAgJ21hcmtlcicsXG4gICdwYXJ0JyxcbiAgJ3BsYWNlaG9sZGVyJyxcbiAgJ3NlbGVjdGlvbicsXG4gICdzbG90dGVkJyxcbiAgJ3NwZWxsaW5nLWVycm9yJ1xuXTtcblxuY29uc3QgQVRUUklCVVRFUyA9IFtcbiAgJ2FsaWduLWNvbnRlbnQnLFxuICAnYWxpZ24taXRlbXMnLFxuICAnYWxpZ24tc2VsZicsXG4gICdhbGwnLFxuICAnYW5pbWF0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kZWxheScsXG4gICdhbmltYXRpb24tZGlyZWN0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kdXJhdGlvbicsXG4gICdhbmltYXRpb24tZmlsbC1tb2RlJyxcbiAgJ2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQnLFxuICAnYW5pbWF0aW9uLW5hbWUnLFxuICAnYW5pbWF0aW9uLXBsYXktc3RhdGUnLFxuICAnYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbicsXG4gICdiYWNrZmFjZS12aXNpYmlsaXR5JyxcbiAgJ2JhY2tncm91bmQnLFxuICAnYmFja2dyb3VuZC1hdHRhY2htZW50JyxcbiAgJ2JhY2tncm91bmQtYmxlbmQtbW9kZScsXG4gICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICdiYWNrZ3JvdW5kLWltYWdlJyxcbiAgJ2JhY2tncm91bmQtb3JpZ2luJyxcbiAgJ2JhY2tncm91bmQtcG9zaXRpb24nLFxuICAnYmFja2dyb3VuZC1yZXBlYXQnLFxuICAnYmFja2dyb3VuZC1zaXplJyxcbiAgJ2Jsb2NrLXNpemUnLFxuICAnYm9yZGVyJyxcbiAgJ2JvcmRlci1ibG9jaycsXG4gICdib3JkZXItYmxvY2stY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLWVuZCcsXG4gICdib3JkZXItYmxvY2stZW5kLWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWJsb2NrLWVuZC13aWR0aCcsXG4gICdib3JkZXItYmxvY2stc3RhcnQnLFxuICAnYm9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydC1zdHlsZScsXG4gICdib3JkZXItYmxvY2stc3RhcnQtd2lkdGgnLFxuICAnYm9yZGVyLWJsb2NrLXN0eWxlJyxcbiAgJ2JvcmRlci1ibG9jay13aWR0aCcsXG4gICdib3JkZXItYm90dG9tJyxcbiAgJ2JvcmRlci1ib3R0b20tY29sb3InLFxuICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXN0eWxlJyxcbiAgJ2JvcmRlci1ib3R0b20td2lkdGgnLFxuICAnYm9yZGVyLWNvbGxhcHNlJyxcbiAgJ2JvcmRlci1jb2xvcicsXG4gICdib3JkZXItaW1hZ2UnLFxuICAnYm9yZGVyLWltYWdlLW91dHNldCcsXG4gICdib3JkZXItaW1hZ2UtcmVwZWF0JyxcbiAgJ2JvcmRlci1pbWFnZS1zbGljZScsXG4gICdib3JkZXItaW1hZ2Utc291cmNlJyxcbiAgJ2JvcmRlci1pbWFnZS13aWR0aCcsXG4gICdib3JkZXItaW5saW5lJyxcbiAgJ2JvcmRlci1pbmxpbmUtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtd2lkdGgnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydCcsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1pbmxpbmUtc3RhcnQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydC13aWR0aCcsXG4gICdib3JkZXItaW5saW5lLXN0eWxlJyxcbiAgJ2JvcmRlci1pbmxpbmUtd2lkdGgnLFxuICAnYm9yZGVyLWxlZnQnLFxuICAnYm9yZGVyLWxlZnQtY29sb3InLFxuICAnYm9yZGVyLWxlZnQtc3R5bGUnLFxuICAnYm9yZGVyLWxlZnQtd2lkdGgnLFxuICAnYm9yZGVyLXJhZGl1cycsXG4gICdib3JkZXItcmlnaHQnLFxuICAnYm9yZGVyLXJpZ2h0LWNvbG9yJyxcbiAgJ2JvcmRlci1yaWdodC1zdHlsZScsXG4gICdib3JkZXItcmlnaHQtd2lkdGgnLFxuICAnYm9yZGVyLXNwYWNpbmcnLFxuICAnYm9yZGVyLXN0eWxlJyxcbiAgJ2JvcmRlci10b3AnLFxuICAnYm9yZGVyLXRvcC1jb2xvcicsXG4gICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3Atc3R5bGUnLFxuICAnYm9yZGVyLXRvcC13aWR0aCcsXG4gICdib3JkZXItd2lkdGgnLFxuICAnYm90dG9tJyxcbiAgJ2JveC1kZWNvcmF0aW9uLWJyZWFrJyxcbiAgJ2JveC1zaGFkb3cnLFxuICAnYm94LXNpemluZycsXG4gICdicmVhay1hZnRlcicsXG4gICdicmVhay1iZWZvcmUnLFxuICAnYnJlYWstaW5zaWRlJyxcbiAgJ2NhcHRpb24tc2lkZScsXG4gICdjYXJldC1jb2xvcicsXG4gICdjbGVhcicsXG4gICdjbGlwJyxcbiAgJ2NsaXAtcGF0aCcsXG4gICdjbGlwLXJ1bGUnLFxuICAnY29sb3InLFxuICAnY29sdW1uLWNvdW50JyxcbiAgJ2NvbHVtbi1maWxsJyxcbiAgJ2NvbHVtbi1nYXAnLFxuICAnY29sdW1uLXJ1bGUnLFxuICAnY29sdW1uLXJ1bGUtY29sb3InLFxuICAnY29sdW1uLXJ1bGUtc3R5bGUnLFxuICAnY29sdW1uLXJ1bGUtd2lkdGgnLFxuICAnY29sdW1uLXNwYW4nLFxuICAnY29sdW1uLXdpZHRoJyxcbiAgJ2NvbHVtbnMnLFxuICAnY29udGFpbicsXG4gICdjb250ZW50JyxcbiAgJ2NvbnRlbnQtdmlzaWJpbGl0eScsXG4gICdjb3VudGVyLWluY3JlbWVudCcsXG4gICdjb3VudGVyLXJlc2V0JyxcbiAgJ2N1ZScsXG4gICdjdWUtYWZ0ZXInLFxuICAnY3VlLWJlZm9yZScsXG4gICdjdXJzb3InLFxuICAnZGlyZWN0aW9uJyxcbiAgJ2Rpc3BsYXknLFxuICAnZW1wdHktY2VsbHMnLFxuICAnZmlsdGVyJyxcbiAgJ2ZsZXgnLFxuICAnZmxleC1iYXNpcycsXG4gICdmbGV4LWRpcmVjdGlvbicsXG4gICdmbGV4LWZsb3cnLFxuICAnZmxleC1ncm93JyxcbiAgJ2ZsZXgtc2hyaW5rJyxcbiAgJ2ZsZXgtd3JhcCcsXG4gICdmbG9hdCcsXG4gICdmbG93JyxcbiAgJ2ZvbnQnLFxuICAnZm9udC1kaXNwbGF5JyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2ZvbnQtZmVhdHVyZS1zZXR0aW5ncycsXG4gICdmb250LWtlcm5pbmcnLFxuICAnZm9udC1sYW5ndWFnZS1vdmVycmlkZScsXG4gICdmb250LXNpemUnLFxuICAnZm9udC1zaXplLWFkanVzdCcsXG4gICdmb250LXNtb290aGluZycsXG4gICdmb250LXN0cmV0Y2gnLFxuICAnZm9udC1zdHlsZScsXG4gICdmb250LXN5bnRoZXNpcycsXG4gICdmb250LXZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50LWNhcHMnLFxuICAnZm9udC12YXJpYW50LWVhc3QtYXNpYW4nLFxuICAnZm9udC12YXJpYW50LWxpZ2F0dXJlcycsXG4gICdmb250LXZhcmlhbnQtbnVtZXJpYycsXG4gICdmb250LXZhcmlhbnQtcG9zaXRpb24nLFxuICAnZm9udC12YXJpYXRpb24tc2V0dGluZ3MnLFxuICAnZm9udC13ZWlnaHQnLFxuICAnZ2FwJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJyxcbiAgJ2dyaWQnLFxuICAnZ3JpZC1hcmVhJyxcbiAgJ2dyaWQtYXV0by1jb2x1bW5zJyxcbiAgJ2dyaWQtYXV0by1mbG93JyxcbiAgJ2dyaWQtYXV0by1yb3dzJyxcbiAgJ2dyaWQtY29sdW1uJyxcbiAgJ2dyaWQtY29sdW1uLWVuZCcsXG4gICdncmlkLWNvbHVtbi1zdGFydCcsXG4gICdncmlkLWdhcCcsXG4gICdncmlkLXJvdycsXG4gICdncmlkLXJvdy1lbmQnLFxuICAnZ3JpZC1yb3ctc3RhcnQnLFxuICAnZ3JpZC10ZW1wbGF0ZScsXG4gICdncmlkLXRlbXBsYXRlLWFyZWFzJyxcbiAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsXG4gICdncmlkLXRlbXBsYXRlLXJvd3MnLFxuICAnaGFuZ2luZy1wdW5jdHVhdGlvbicsXG4gICdoZWlnaHQnLFxuICAnaHlwaGVucycsXG4gICdpY29uJyxcbiAgJ2ltYWdlLW9yaWVudGF0aW9uJyxcbiAgJ2ltYWdlLXJlbmRlcmluZycsXG4gICdpbWFnZS1yZXNvbHV0aW9uJyxcbiAgJ2ltZS1tb2RlJyxcbiAgJ2lubGluZS1zaXplJyxcbiAgJ2lzb2xhdGlvbicsXG4gICdqdXN0aWZ5LWNvbnRlbnQnLFxuICAnbGVmdCcsXG4gICdsZXR0ZXItc3BhY2luZycsXG4gICdsaW5lLWJyZWFrJyxcbiAgJ2xpbmUtaGVpZ2h0JyxcbiAgJ2xpc3Qtc3R5bGUnLFxuICAnbGlzdC1zdHlsZS1pbWFnZScsXG4gICdsaXN0LXN0eWxlLXBvc2l0aW9uJyxcbiAgJ2xpc3Qtc3R5bGUtdHlwZScsXG4gICdtYXJnaW4nLFxuICAnbWFyZ2luLWJsb2NrJyxcbiAgJ21hcmdpbi1ibG9jay1lbmQnLFxuICAnbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ21hcmdpbi1ib3R0b20nLFxuICAnbWFyZ2luLWlubGluZScsXG4gICdtYXJnaW4taW5saW5lLWVuZCcsXG4gICdtYXJnaW4taW5saW5lLXN0YXJ0JyxcbiAgJ21hcmdpbi1sZWZ0JyxcbiAgJ21hcmdpbi1yaWdodCcsXG4gICdtYXJnaW4tdG9wJyxcbiAgJ21hcmtzJyxcbiAgJ21hc2snLFxuICAnbWFzay1ib3JkZXInLFxuICAnbWFzay1ib3JkZXItbW9kZScsXG4gICdtYXNrLWJvcmRlci1vdXRzZXQnLFxuICAnbWFzay1ib3JkZXItcmVwZWF0JyxcbiAgJ21hc2stYm9yZGVyLXNsaWNlJyxcbiAgJ21hc2stYm9yZGVyLXNvdXJjZScsXG4gICdtYXNrLWJvcmRlci13aWR0aCcsXG4gICdtYXNrLWNsaXAnLFxuICAnbWFzay1jb21wb3NpdGUnLFxuICAnbWFzay1pbWFnZScsXG4gICdtYXNrLW1vZGUnLFxuICAnbWFzay1vcmlnaW4nLFxuICAnbWFzay1wb3NpdGlvbicsXG4gICdtYXNrLXJlcGVhdCcsXG4gICdtYXNrLXNpemUnLFxuICAnbWFzay10eXBlJyxcbiAgJ21heC1ibG9jay1zaXplJyxcbiAgJ21heC1oZWlnaHQnLFxuICAnbWF4LWlubGluZS1zaXplJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4tYmxvY2stc2l6ZScsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21pbi1pbmxpbmUtc2l6ZScsXG4gICdtaW4td2lkdGgnLFxuICAnbWl4LWJsZW5kLW1vZGUnLFxuICAnbmF2LWRvd24nLFxuICAnbmF2LWluZGV4JyxcbiAgJ25hdi1sZWZ0JyxcbiAgJ25hdi1yaWdodCcsXG4gICduYXYtdXAnLFxuICAnbm9uZScsXG4gICdub3JtYWwnLFxuICAnb2JqZWN0LWZpdCcsXG4gICdvYmplY3QtcG9zaXRpb24nLFxuICAnb3BhY2l0eScsXG4gICdvcmRlcicsXG4gICdvcnBoYW5zJyxcbiAgJ291dGxpbmUnLFxuICAnb3V0bGluZS1jb2xvcicsXG4gICdvdXRsaW5lLW9mZnNldCcsXG4gICdvdXRsaW5lLXN0eWxlJyxcbiAgJ291dGxpbmUtd2lkdGgnLFxuICAnb3ZlcmZsb3cnLFxuICAnb3ZlcmZsb3ctd3JhcCcsXG4gICdvdmVyZmxvdy14JyxcbiAgJ292ZXJmbG93LXknLFxuICAncGFkZGluZycsXG4gICdwYWRkaW5nLWJsb2NrJyxcbiAgJ3BhZGRpbmctYmxvY2stZW5kJyxcbiAgJ3BhZGRpbmctYmxvY2stc3RhcnQnLFxuICAncGFkZGluZy1ib3R0b20nLFxuICAncGFkZGluZy1pbmxpbmUnLFxuICAncGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3BhZGRpbmctaW5saW5lLXN0YXJ0JyxcbiAgJ3BhZGRpbmctbGVmdCcsXG4gICdwYWRkaW5nLXJpZ2h0JyxcbiAgJ3BhZGRpbmctdG9wJyxcbiAgJ3BhZ2UtYnJlYWstYWZ0ZXInLFxuICAncGFnZS1icmVhay1iZWZvcmUnLFxuICAncGFnZS1icmVhay1pbnNpZGUnLFxuICAncGF1c2UnLFxuICAncGF1c2UtYWZ0ZXInLFxuICAncGF1c2UtYmVmb3JlJyxcbiAgJ3BlcnNwZWN0aXZlJyxcbiAgJ3BlcnNwZWN0aXZlLW9yaWdpbicsXG4gICdwb2ludGVyLWV2ZW50cycsXG4gICdwb3NpdGlvbicsXG4gICdxdW90ZXMnLFxuICAncmVzaXplJyxcbiAgJ3Jlc3QnLFxuICAncmVzdC1hZnRlcicsXG4gICdyZXN0LWJlZm9yZScsXG4gICdyaWdodCcsXG4gICdyb3ctZ2FwJyxcbiAgJ3Njcm9sbC1tYXJnaW4nLFxuICAnc2Nyb2xsLW1hcmdpbi1ibG9jaycsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tYm90dG9tJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtbWFyZ2luLWxlZnQnLFxuICAnc2Nyb2xsLW1hcmdpbi1yaWdodCcsXG4gICdzY3JvbGwtbWFyZ2luLXRvcCcsXG4gICdzY3JvbGwtcGFkZGluZycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jaycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jay1lbmQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYmxvY2stc3RhcnQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYm90dG9tJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZScsXG4gICdzY3JvbGwtcGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtcGFkZGluZy1sZWZ0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXJpZ2h0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXRvcCcsXG4gICdzY3JvbGwtc25hcC1hbGlnbicsXG4gICdzY3JvbGwtc25hcC1zdG9wJyxcbiAgJ3Njcm9sbC1zbmFwLXR5cGUnLFxuICAnc2Nyb2xsYmFyLWNvbG9yJyxcbiAgJ3Njcm9sbGJhci1ndXR0ZXInLFxuICAnc2Nyb2xsYmFyLXdpZHRoJyxcbiAgJ3NoYXBlLWltYWdlLXRocmVzaG9sZCcsXG4gICdzaGFwZS1tYXJnaW4nLFxuICAnc2hhcGUtb3V0c2lkZScsXG4gICdzcGVhaycsXG4gICdzcGVhay1hcycsXG4gICdzcmMnLCAvLyBAZm9udC1mYWNlXG4gICd0YWItc2l6ZScsXG4gICd0YWJsZS1sYXlvdXQnLFxuICAndGV4dC1hbGlnbicsXG4gICd0ZXh0LWFsaWduLWFsbCcsXG4gICd0ZXh0LWFsaWduLWxhc3QnLFxuICAndGV4dC1jb21iaW5lLXVwcmlnaHQnLFxuICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1jb2xvcicsXG4gICd0ZXh0LWRlY29yYXRpb24tbGluZScsXG4gICd0ZXh0LWRlY29yYXRpb24tc3R5bGUnLFxuICAndGV4dC1lbXBoYXNpcycsXG4gICd0ZXh0LWVtcGhhc2lzLWNvbG9yJyxcbiAgJ3RleHQtZW1waGFzaXMtcG9zaXRpb24nLFxuICAndGV4dC1lbXBoYXNpcy1zdHlsZScsXG4gICd0ZXh0LWluZGVudCcsXG4gICd0ZXh0LWp1c3RpZnknLFxuICAndGV4dC1vcmllbnRhdGlvbicsXG4gICd0ZXh0LW92ZXJmbG93JyxcbiAgJ3RleHQtcmVuZGVyaW5nJyxcbiAgJ3RleHQtc2hhZG93JyxcbiAgJ3RleHQtdHJhbnNmb3JtJyxcbiAgJ3RleHQtdW5kZXJsaW5lLXBvc2l0aW9uJyxcbiAgJ3RvcCcsXG4gICd0cmFuc2Zvcm0nLFxuICAndHJhbnNmb3JtLWJveCcsXG4gICd0cmFuc2Zvcm0tb3JpZ2luJyxcbiAgJ3RyYW5zZm9ybS1zdHlsZScsXG4gICd0cmFuc2l0aW9uJyxcbiAgJ3RyYW5zaXRpb24tZGVsYXknLFxuICAndHJhbnNpdGlvbi1kdXJhdGlvbicsXG4gICd0cmFuc2l0aW9uLXByb3BlcnR5JyxcbiAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgJ3VuaWNvZGUtYmlkaScsXG4gICd2ZXJ0aWNhbC1hbGlnbicsXG4gICd2aXNpYmlsaXR5JyxcbiAgJ3ZvaWNlLWJhbGFuY2UnLFxuICAndm9pY2UtZHVyYXRpb24nLFxuICAndm9pY2UtZmFtaWx5JyxcbiAgJ3ZvaWNlLXBpdGNoJyxcbiAgJ3ZvaWNlLXJhbmdlJyxcbiAgJ3ZvaWNlLXJhdGUnLFxuICAndm9pY2Utc3RyZXNzJyxcbiAgJ3ZvaWNlLXZvbHVtZScsXG4gICd3aGl0ZS1zcGFjZScsXG4gICd3aWRvd3MnLFxuICAnd2lkdGgnLFxuICAnd2lsbC1jaGFuZ2UnLFxuICAnd29yZC1icmVhaycsXG4gICd3b3JkLXNwYWNpbmcnLFxuICAnd29yZC13cmFwJyxcbiAgJ3dyaXRpbmctbW9kZScsXG4gICd6LWluZGV4J1xuICAvLyByZXZlcnNlIG1ha2VzIHN1cmUgbG9uZ2VyIGF0dHJpYnV0ZXMgYGZvbnQtd2VpZ2h0YCBhcmUgbWF0Y2hlZCBmdWxseVxuICAvLyBpbnN0ZWFkIG9mIGdldHRpbmcgZmFsc2UgcG9zaXRpdmVzIG9uIHNheSBgZm9udGBcbl0ucmV2ZXJzZSgpO1xuXG4vKlxuTGFuZ3VhZ2U6IFNDU1NcbkRlc2NyaXB0aW9uOiBTY3NzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgc3ludGF4IG9mIENTUy5cbkF1dGhvcjogS3VydCBFbWNoIDxrdXJ0QGt1cnRlbWNoLmNvbT5cbldlYnNpdGU6IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbVxuQ2F0ZWdvcnk6IGNvbW1vbiwgY3NzLCB3ZWJcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBzY3NzKGhsanMpIHtcbiAgY29uc3QgbW9kZXMgPSBNT0RFUyhobGpzKTtcbiAgY29uc3QgUFNFVURPX0VMRU1FTlRTJDEgPSBQU0VVRE9fRUxFTUVOVFM7XG4gIGNvbnN0IFBTRVVET19DTEFTU0VTJDEgPSBQU0VVRE9fQ0xBU1NFUztcblxuICBjb25zdCBBVF9JREVOVElGSUVSID0gJ0BbYS16LV0rJzsgLy8gQGZvbnQtZmFjZVxuICBjb25zdCBBVF9NT0RJRklFUlMgPSBcImFuZCBvciBub3Qgb25seVwiO1xuICBjb25zdCBJREVOVF9SRSA9ICdbYS16QS1aLV1bYS16QS1aMC05Xy1dKic7XG4gIGNvbnN0IFZBUklBQkxFID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICBiZWdpbjogJyhcXFxcJCcgKyBJREVOVF9SRSArICcpXFxcXGInLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1NDU1MnLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgaWxsZWdhbDogJ1s9L3xcXCddJyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIC8vIHRvIHJlY29nbml6ZSBrZXlmcmFtZSA0MCUgZXRjIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiBvdXJcbiAgICAgIC8vIGF0dHJpYnV0ZSB2YWx1ZSBtb2RlXG4gICAgICBtb2Rlcy5DU1NfTlVNQkVSX01PREUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLWlkJyxcbiAgICAgICAgYmVnaW46ICcjW0EtWmEtejAtOV8tXSsnLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLWNsYXNzJyxcbiAgICAgICAgYmVnaW46ICdcXFxcLltBLVphLXowLTlfLV0rJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgbW9kZXMuQVRUUklCVVRFX1NFTEVDVE9SX01PREUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXRhZycsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIFRBR1Muam9pbignfCcpICsgJylcXFxcYicsXG4gICAgICAgIC8vIHdhcyB0aGVyZSwgYmVmb3JlLCBidXQgd2h5P1xuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXBzZXVkbycsXG4gICAgICAgIGJlZ2luOiAnOignICsgUFNFVURPX0NMQVNTRVMkMS5qb2luKCd8JykgKyAnKSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXBzZXVkbycsXG4gICAgICAgIGJlZ2luOiAnOig6KT8oJyArIFBTRVVET19FTEVNRU5UUyQxLmpvaW4oJ3wnKSArICcpJ1xuICAgICAgfSxcbiAgICAgIFZBUklBQkxFLFxuICAgICAgeyAvLyBwc2V1ZG8tc2VsZWN0b3IgcGFyYW1zXG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgY29udGFpbnM6IFsgbW9kZXMuQ1NTX05VTUJFUl9NT0RFIF1cbiAgICAgIH0sXG4gICAgICBtb2Rlcy5DU1NfVkFSSUFCTEUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2F0dHJpYnV0ZScsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIEFUVFJJQlVURVMuam9pbignfCcpICsgJylcXFxcYidcbiAgICAgIH0sXG4gICAgICB7IGJlZ2luOiAnXFxcXGIod2hpdGVzcGFjZXx3YWl0fHctcmVzaXplfHZpc2libGV8dmVydGljYWwtdGV4dHx2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x1cHBlcmNhc2V8dXBwZXItcm9tYW58dXBwZXItYWxwaGF8dW5kZXJsaW5lfHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHR8dGV4dC10b3B8dGV4dC1ib3R0b218dGItcmx8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHxzdy1yZXNpemV8c3VwZXJ8c3RyaWN0fHN0YXRpY3xzcXVhcmV8c29saWR8c21hbGwtY2Fwc3xzZXBhcmF0ZXxzZS1yZXNpemV8c2Nyb2xsfHMtcmVzaXplfHJ0bHxyb3ctcmVzaXplfHJpZGdlfHJpZ2h0fHJlcGVhdHxyZXBlYXQteXxyZXBlYXQteHxyZWxhdGl2ZXxwcm9ncmVzc3xwb2ludGVyfG92ZXJsaW5lfG91dHNpZGV8b3V0c2V0fG9ibGlxdWV8bm93cmFwfG5vdC1hbGxvd2VkfG5vcm1hbHxub25lfG53LXJlc2l6ZXxuby1yZXBlYXR8bm8tZHJvcHxuZXdzcGFwZXJ8bmUtcmVzaXplfG4tcmVzaXplfG1vdmV8bWlkZGxlfG1lZGl1bXxsdHJ8bHItdGJ8bG93ZXJjYXNlfGxvd2VyLXJvbWFufGxvd2VyLWFscGhhfGxvb3NlfGxpc3QtaXRlbXxsaW5lfGxpbmUtdGhyb3VnaHxsaW5lLWVkZ2V8bGlnaHRlcnxsZWZ0fGtlZXAtYWxsfGp1c3RpZnl8aXRhbGljfGludGVyLXdvcmR8aW50ZXItaWRlb2dyYXBofGluc2lkZXxpbnNldHxpbmxpbmV8aW5saW5lLWJsb2NrfGluaGVyaXR8aW5hY3RpdmV8aWRlb2dyYXBoLXNwYWNlfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3xpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtYWxwaGF8aG9yaXpvbnRhbHxoaWRkZW58aGVscHxoYW5kfGdyb292ZXxmaXhlZHxlbGxpcHNpc3xlLXJlc2l6ZXxkb3VibGV8ZG90dGVkfGRpc3RyaWJ1dGV8ZGlzdHJpYnV0ZS1zcGFjZXxkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLWFsbC1saW5lc3xkaXNjfGRpc2FibGVkfGRlZmF1bHR8ZGVjaW1hbHxkYXNoZWR8Y3Jvc3NoYWlyfGNvbGxhcHNlfGNvbC1yZXNpemV8Y2lyY2xlfGNoYXJ8Y2VudGVyfGNhcGl0YWxpemV8YnJlYWstd29yZHxicmVhay1hbGx8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8YmlkaS1vdmVycmlkZXxiZWxvd3xiYXNlbGluZXxhdXRvfGFsd2F5c3xhbGwtc2Nyb2xsfGFic29sdXRlfHRhYmxlfHRhYmxlLWNlbGwpXFxcXGInIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOi8sXG4gICAgICAgIGVuZDogL1s7fXtdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIG1vZGVzLkJMT0NLX0NPTU1FTlQsXG4gICAgICAgICAgVkFSSUFCTEUsXG4gICAgICAgICAgbW9kZXMuSEVYQ09MT1IsXG4gICAgICAgICAgbW9kZXMuQ1NTX05VTUJFUl9NT0RFLFxuICAgICAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICAgIG1vZGVzLklNUE9SVEFOVCxcbiAgICAgICAgICBtb2Rlcy5GVU5DVElPTl9ESVNQQVRDSFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gbWF0Y2hpbmcgdGhlc2UgaGVyZSBhbGxvd3MgdXMgdG8gdHJlYXQgdGhlbSBtb3JlIGxpa2UgcmVndWxhciBDU1NcbiAgICAgIC8vIHJ1bGVzIHNvIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUge30gZ2V0cyByZWd1bGFyIHJ1bGUgaGlnaGxpZ2h0aW5nLFxuICAgICAgLy8gd2hpY2ggaXMgd2hhdCB3ZSB3YW50IGZvciBwYWdlIGFuZCBmb250LWZhY2VcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdAKHBhZ2V8Zm9udC1mYWNlKScsXG4gICAgICAgIGtleXdvcmRzOiB7XG4gICAgICAgICAgJHBhdHRlcm46IEFUX0lERU5USUZJRVIsXG4gICAgICAgICAga2V5d29yZDogJ0BwYWdlIEBmb250LWZhY2UnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnQCcsXG4gICAgICAgIGVuZDogJ1t7O10nLFxuICAgICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgICAga2V5d29yZHM6IHtcbiAgICAgICAgICAkcGF0dGVybjogL1thLXotXSsvLFxuICAgICAgICAgIGtleXdvcmQ6IEFUX01PRElGSUVSUyxcbiAgICAgICAgICBhdHRyaWJ1dGU6IE1FRElBX0ZFQVRVUkVTLmpvaW4oXCIgXCIpXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46IEFUX0lERU5USUZJRVIsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwia2V5d29yZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1thLXotXSsoPz06KS8sXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiYXR0cmlidXRlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFZBUklBQkxFLFxuICAgICAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICAgIG1vZGVzLkhFWENPTE9SLFxuICAgICAgICAgIG1vZGVzLkNTU19OVU1CRVJfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgbW9kZXMuRlVOQ1RJT05fRElTUEFUQ0hcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IHNjc3MgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogU2hlbGwgU2Vzc2lvblxuUmVxdWlyZXM6IGJhc2guanNcbkF1dGhvcjogVFNVWVVTQVRPIEtpdHN1bmUgPG1ha2UuanVzdC5vbkBnbWFpbC5jb20+XG5DYXRlZ29yeTogY29tbW9uXG5BdWRpdDogMjAyMFxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIHNoZWxsKGhsanMpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnU2hlbGwgU2Vzc2lvbicsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ2NvbnNvbGUnLFxuICAgICAgJ3NoZWxsc2Vzc2lvbidcbiAgICBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEucHJvbXB0JyxcbiAgICAgICAgLy8gV2UgY2Fubm90IGFkZCBcXHMgKHNwYWNlcykgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvdGhlcndpc2UgaXQgd2lsbCBiZSB0b28gYnJvYWQgYW5kIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHQuXG4gICAgICAgIC8vIEZvciBpbnN0YW5jZSwgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBpdCB3b3VsZCBtYXRjaCBcImVjaG8gL3BhdGgvdG8vaG9tZSA+XCIgYXMgYSBwcm9tcHQ6XG4gICAgICAgIC8vIGVjaG8gL3BhdGgvdG8vaG9tZSA+IHQuZXhlXG4gICAgICAgIGJlZ2luOiAvXlxcc3swLDN9Wy9+XFx3XFxkW1xcXSgpQC1dKls+JSQjXVsgXT8vLFxuICAgICAgICBzdGFydHM6IHtcbiAgICAgICAgICBlbmQ6IC9bXlxcXFxdKD89XFxzKiQpLyxcbiAgICAgICAgICBzdWJMYW5ndWFnZTogJ2Jhc2gnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IHNoZWxsIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuIExhbmd1YWdlOiBTUUxcbiBXZWJzaXRlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUUxcbiBDYXRlZ29yeTogY29tbW9uLCBkYXRhYmFzZVxuICovXG5cbi8qXG5cbkdvYWxzOlxuXG5TUUwgaXMgaW50ZW5kZWQgdG8gaGlnaGxpZ2h0IGJhc2ljL2NvbW1vbiBTUUwga2V5d29yZHMgYW5kIGV4cHJlc3Npb25zXG5cbi0gSWYgcHJldHR5IG11Y2ggZXZlcnkgc2luZ2xlIFNRTCBzZXJ2ZXIgaW5jbHVkZXMgc3VwcG9ydHMsIHRoZW4gaXQncyBhIGNhbmlkYXRlLlxuLSBJdCBpcyBOT1QgaW50ZW5kZWQgdG8gaW5jbHVkZSB0b25zIG9mIHZlbmRvciBzcGVjaWZpYyBrZXl3b3JkcyAoT3JhY2xlLCBNeVNRTCxcbiAgUG9zdGdyZVNRTCkgYWx0aG91Z2ggdGhlIGxpc3Qgb2YgZGF0YSB0eXBlcyBpcyBwdXJwb3NlbHkgYSBiaXQgbW9yZSBleHBhbnNpdmUuXG4tIEZvciBtb3JlIHNwZWNpZmljIFNRTCBncmFtbWFycyBwbGVhc2Ugc2VlOlxuICAtIFBvc3RncmVTUUwgYW5kIFBML3BnU1FMIC0gY29yZVxuICAtIFQtU1FMIC0gaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodGpzLXRzcWxcbiAgLSBzcWxfbW9yZSAoY29yZSlcblxuICovXG5cbmZ1bmN0aW9uIHNxbChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgQ09NTUVOVF9NT0RFID0gaGxqcy5DT01NRU5UKCctLScsICckJyk7XG4gIGNvbnN0IFNUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJy8sXG4gICAgICAgIGVuZDogLycvLFxuICAgICAgICBjb250YWluczogWyB7IGJlZ2luOiAvJycvIH0gXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgUVVPVEVEX0lERU5USUZJRVIgPSB7XG4gICAgYmVnaW46IC9cIi8sXG4gICAgZW5kOiAvXCIvLFxuICAgIGNvbnRhaW5zOiBbIHsgYmVnaW46IC9cIlwiLyB9IF1cbiAgfTtcblxuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICBcInRydWVcIixcbiAgICBcImZhbHNlXCIsXG4gICAgLy8gTm90IHN1cmUgaXQncyBjb3JyZWN0IHRvIGNhbGwgTlVMTCBsaXRlcmFsLCBhbmQgY2xhdXNlcyBsaWtlIElTIFtOT1RdIE5VTEwgbG9vayBzdHJhbmdlIHRoYXQgd2F5LlxuICAgIC8vIFwibnVsbFwiLFxuICAgIFwidW5rbm93blwiXG4gIF07XG5cbiAgY29uc3QgTVVMVElfV09SRF9UWVBFUyA9IFtcbiAgICBcImRvdWJsZSBwcmVjaXNpb25cIixcbiAgICBcImxhcmdlIG9iamVjdFwiLFxuICAgIFwid2l0aCB0aW1lem9uZVwiLFxuICAgIFwid2l0aG91dCB0aW1lem9uZVwiXG4gIF07XG5cbiAgY29uc3QgVFlQRVMgPSBbXG4gICAgJ2JpZ2ludCcsXG4gICAgJ2JpbmFyeScsXG4gICAgJ2Jsb2InLFxuICAgICdib29sZWFuJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXJhY3RlcicsXG4gICAgJ2Nsb2InLFxuICAgICdkYXRlJyxcbiAgICAnZGVjJyxcbiAgICAnZGVjZmxvYXQnLFxuICAgICdkZWNpbWFsJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdpbnRlZ2VyJyxcbiAgICAnaW50ZXJ2YWwnLFxuICAgICduY2hhcicsXG4gICAgJ25jbG9iJyxcbiAgICAnbmF0aW9uYWwnLFxuICAgICdudW1lcmljJyxcbiAgICAncmVhbCcsXG4gICAgJ3JvdycsXG4gICAgJ3NtYWxsaW50JyxcbiAgICAndGltZScsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3ZhcmNoYXInLFxuICAgICd2YXJ5aW5nJywgLy8gbW9kaWZpZXIgKGNoYXJhY3RlciB2YXJ5aW5nKVxuICAgICd2YXJiaW5hcnknXG4gIF07XG5cbiAgY29uc3QgTk9OX1JFU0VSVkVEX1dPUkRTID0gW1xuICAgIFwiYWRkXCIsXG4gICAgXCJhc2NcIixcbiAgICBcImNvbGxhdGlvblwiLFxuICAgIFwiZGVzY1wiLFxuICAgIFwiZmluYWxcIixcbiAgICBcImZpcnN0XCIsXG4gICAgXCJsYXN0XCIsXG4gICAgXCJ2aWV3XCJcbiAgXTtcblxuICAvLyBodHRwczovL2pha2V3aGVhdC5naXRodWIuaW8vc3FsLW92ZXJ2aWV3L3NxbC0yMDE2LWZvdW5kYXRpb24tZ3JhbW1hci5odG1sI3Jlc2VydmVkLXdvcmRcbiAgY29uc3QgUkVTRVJWRURfV09SRFMgPSBbXG4gICAgXCJhYnNcIixcbiAgICBcImFjb3NcIixcbiAgICBcImFsbFwiLFxuICAgIFwiYWxsb2NhdGVcIixcbiAgICBcImFsdGVyXCIsXG4gICAgXCJhbmRcIixcbiAgICBcImFueVwiLFxuICAgIFwiYXJlXCIsXG4gICAgXCJhcnJheVwiLFxuICAgIFwiYXJyYXlfYWdnXCIsXG4gICAgXCJhcnJheV9tYXhfY2FyZGluYWxpdHlcIixcbiAgICBcImFzXCIsXG4gICAgXCJhc2Vuc2l0aXZlXCIsXG4gICAgXCJhc2luXCIsXG4gICAgXCJhc3ltbWV0cmljXCIsXG4gICAgXCJhdFwiLFxuICAgIFwiYXRhblwiLFxuICAgIFwiYXRvbWljXCIsXG4gICAgXCJhdXRob3JpemF0aW9uXCIsXG4gICAgXCJhdmdcIixcbiAgICBcImJlZ2luXCIsXG4gICAgXCJiZWdpbl9mcmFtZVwiLFxuICAgIFwiYmVnaW5fcGFydGl0aW9uXCIsXG4gICAgXCJiZXR3ZWVuXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcImJpbmFyeVwiLFxuICAgIFwiYmxvYlwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwiYm90aFwiLFxuICAgIFwiYnlcIixcbiAgICBcImNhbGxcIixcbiAgICBcImNhbGxlZFwiLFxuICAgIFwiY2FyZGluYWxpdHlcIixcbiAgICBcImNhc2NhZGVkXCIsXG4gICAgXCJjYXNlXCIsXG4gICAgXCJjYXN0XCIsXG4gICAgXCJjZWlsXCIsXG4gICAgXCJjZWlsaW5nXCIsXG4gICAgXCJjaGFyXCIsXG4gICAgXCJjaGFyX2xlbmd0aFwiLFxuICAgIFwiY2hhcmFjdGVyXCIsXG4gICAgXCJjaGFyYWN0ZXJfbGVuZ3RoXCIsXG4gICAgXCJjaGVja1wiLFxuICAgIFwiY2xhc3NpZmllclwiLFxuICAgIFwiY2xvYlwiLFxuICAgIFwiY2xvc2VcIixcbiAgICBcImNvYWxlc2NlXCIsXG4gICAgXCJjb2xsYXRlXCIsXG4gICAgXCJjb2xsZWN0XCIsXG4gICAgXCJjb2x1bW5cIixcbiAgICBcImNvbW1pdFwiLFxuICAgIFwiY29uZGl0aW9uXCIsXG4gICAgXCJjb25uZWN0XCIsXG4gICAgXCJjb25zdHJhaW50XCIsXG4gICAgXCJjb250YWluc1wiLFxuICAgIFwiY29udmVydFwiLFxuICAgIFwiY29weVwiLFxuICAgIFwiY29yclwiLFxuICAgIFwiY29ycmVzcG9uZGluZ1wiLFxuICAgIFwiY29zXCIsXG4gICAgXCJjb3NoXCIsXG4gICAgXCJjb3VudFwiLFxuICAgIFwiY292YXJfcG9wXCIsXG4gICAgXCJjb3Zhcl9zYW1wXCIsXG4gICAgXCJjcmVhdGVcIixcbiAgICBcImNyb3NzXCIsXG4gICAgXCJjdWJlXCIsXG4gICAgXCJjdW1lX2Rpc3RcIixcbiAgICBcImN1cnJlbnRcIixcbiAgICBcImN1cnJlbnRfY2F0YWxvZ1wiLFxuICAgIFwiY3VycmVudF9kYXRlXCIsXG4gICAgXCJjdXJyZW50X2RlZmF1bHRfdHJhbnNmb3JtX2dyb3VwXCIsXG4gICAgXCJjdXJyZW50X3BhdGhcIixcbiAgICBcImN1cnJlbnRfcm9sZVwiLFxuICAgIFwiY3VycmVudF9yb3dcIixcbiAgICBcImN1cnJlbnRfc2NoZW1hXCIsXG4gICAgXCJjdXJyZW50X3RpbWVcIixcbiAgICBcImN1cnJlbnRfdGltZXN0YW1wXCIsXG4gICAgXCJjdXJyZW50X3BhdGhcIixcbiAgICBcImN1cnJlbnRfcm9sZVwiLFxuICAgIFwiY3VycmVudF90cmFuc2Zvcm1fZ3JvdXBfZm9yX3R5cGVcIixcbiAgICBcImN1cnJlbnRfdXNlclwiLFxuICAgIFwiY3Vyc29yXCIsXG4gICAgXCJjeWNsZVwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiZGF5XCIsXG4gICAgXCJkZWFsbG9jYXRlXCIsXG4gICAgXCJkZWNcIixcbiAgICBcImRlY2ltYWxcIixcbiAgICBcImRlY2Zsb2F0XCIsXG4gICAgXCJkZWNsYXJlXCIsXG4gICAgXCJkZWZhdWx0XCIsXG4gICAgXCJkZWZpbmVcIixcbiAgICBcImRlbGV0ZVwiLFxuICAgIFwiZGVuc2VfcmFua1wiLFxuICAgIFwiZGVyZWZcIixcbiAgICBcImRlc2NyaWJlXCIsXG4gICAgXCJkZXRlcm1pbmlzdGljXCIsXG4gICAgXCJkaXNjb25uZWN0XCIsXG4gICAgXCJkaXN0aW5jdFwiLFxuICAgIFwiZG91YmxlXCIsXG4gICAgXCJkcm9wXCIsXG4gICAgXCJkeW5hbWljXCIsXG4gICAgXCJlYWNoXCIsXG4gICAgXCJlbGVtZW50XCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbXB0eVwiLFxuICAgIFwiZW5kXCIsXG4gICAgXCJlbmRfZnJhbWVcIixcbiAgICBcImVuZF9wYXJ0aXRpb25cIixcbiAgICBcImVuZC1leGVjXCIsXG4gICAgXCJlcXVhbHNcIixcbiAgICBcImVzY2FwZVwiLFxuICAgIFwiZXZlcnlcIixcbiAgICBcImV4Y2VwdFwiLFxuICAgIFwiZXhlY1wiLFxuICAgIFwiZXhlY3V0ZVwiLFxuICAgIFwiZXhpc3RzXCIsXG4gICAgXCJleHBcIixcbiAgICBcImV4dGVybmFsXCIsXG4gICAgXCJleHRyYWN0XCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwiZmV0Y2hcIixcbiAgICBcImZpbHRlclwiLFxuICAgIFwiZmlyc3RfdmFsdWVcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJmbG9vclwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJmb3JlaWduXCIsXG4gICAgXCJmcmFtZV9yb3dcIixcbiAgICBcImZyZWVcIixcbiAgICBcImZyb21cIixcbiAgICBcImZ1bGxcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJmdXNpb25cIixcbiAgICBcImdldFwiLFxuICAgIFwiZ2xvYmFsXCIsXG4gICAgXCJncmFudFwiLFxuICAgIFwiZ3JvdXBcIixcbiAgICBcImdyb3VwaW5nXCIsXG4gICAgXCJncm91cHNcIixcbiAgICBcImhhdmluZ1wiLFxuICAgIFwiaG9sZFwiLFxuICAgIFwiaG91clwiLFxuICAgIFwiaWRlbnRpdHlcIixcbiAgICBcImluXCIsXG4gICAgXCJpbmRpY2F0b3JcIixcbiAgICBcImluaXRpYWxcIixcbiAgICBcImlubmVyXCIsXG4gICAgXCJpbm91dFwiLFxuICAgIFwiaW5zZW5zaXRpdmVcIixcbiAgICBcImluc2VydFwiLFxuICAgIFwiaW50XCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJpbnRlcnNlY3RcIixcbiAgICBcImludGVyc2VjdGlvblwiLFxuICAgIFwiaW50ZXJ2YWxcIixcbiAgICBcImludG9cIixcbiAgICBcImlzXCIsXG4gICAgXCJqb2luXCIsXG4gICAgXCJqc29uX2FycmF5XCIsXG4gICAgXCJqc29uX2FycmF5YWdnXCIsXG4gICAgXCJqc29uX2V4aXN0c1wiLFxuICAgIFwianNvbl9vYmplY3RcIixcbiAgICBcImpzb25fb2JqZWN0YWdnXCIsXG4gICAgXCJqc29uX3F1ZXJ5XCIsXG4gICAgXCJqc29uX3RhYmxlXCIsXG4gICAgXCJqc29uX3RhYmxlX3ByaW1pdGl2ZVwiLFxuICAgIFwianNvbl92YWx1ZVwiLFxuICAgIFwibGFnXCIsXG4gICAgXCJsYW5ndWFnZVwiLFxuICAgIFwibGFyZ2VcIixcbiAgICBcImxhc3RfdmFsdWVcIixcbiAgICBcImxhdGVyYWxcIixcbiAgICBcImxlYWRcIixcbiAgICBcImxlYWRpbmdcIixcbiAgICBcImxlZnRcIixcbiAgICBcImxpa2VcIixcbiAgICBcImxpa2VfcmVnZXhcIixcbiAgICBcImxpc3RhZ2dcIixcbiAgICBcImxuXCIsXG4gICAgXCJsb2NhbFwiLFxuICAgIFwibG9jYWx0aW1lXCIsXG4gICAgXCJsb2NhbHRpbWVzdGFtcFwiLFxuICAgIFwibG9nXCIsXG4gICAgXCJsb2cxMFwiLFxuICAgIFwibG93ZXJcIixcbiAgICBcIm1hdGNoXCIsXG4gICAgXCJtYXRjaF9udW1iZXJcIixcbiAgICBcIm1hdGNoX3JlY29nbml6ZVwiLFxuICAgIFwibWF0Y2hlc1wiLFxuICAgIFwibWF4XCIsXG4gICAgXCJtZW1iZXJcIixcbiAgICBcIm1lcmdlXCIsXG4gICAgXCJtZXRob2RcIixcbiAgICBcIm1pblwiLFxuICAgIFwibWludXRlXCIsXG4gICAgXCJtb2RcIixcbiAgICBcIm1vZGlmaWVzXCIsXG4gICAgXCJtb2R1bGVcIixcbiAgICBcIm1vbnRoXCIsXG4gICAgXCJtdWx0aXNldFwiLFxuICAgIFwibmF0aW9uYWxcIixcbiAgICBcIm5hdHVyYWxcIixcbiAgICBcIm5jaGFyXCIsXG4gICAgXCJuY2xvYlwiLFxuICAgIFwibmV3XCIsXG4gICAgXCJub1wiLFxuICAgIFwibm9uZVwiLFxuICAgIFwibm9ybWFsaXplXCIsXG4gICAgXCJub3RcIixcbiAgICBcIm50aF92YWx1ZVwiLFxuICAgIFwibnRpbGVcIixcbiAgICBcIm51bGxcIixcbiAgICBcIm51bGxpZlwiLFxuICAgIFwibnVtZXJpY1wiLFxuICAgIFwib2N0ZXRfbGVuZ3RoXCIsXG4gICAgXCJvY2N1cnJlbmNlc19yZWdleFwiLFxuICAgIFwib2ZcIixcbiAgICBcIm9mZnNldFwiLFxuICAgIFwib2xkXCIsXG4gICAgXCJvbWl0XCIsXG4gICAgXCJvblwiLFxuICAgIFwib25lXCIsXG4gICAgXCJvbmx5XCIsXG4gICAgXCJvcGVuXCIsXG4gICAgXCJvclwiLFxuICAgIFwib3JkZXJcIixcbiAgICBcIm91dFwiLFxuICAgIFwib3V0ZXJcIixcbiAgICBcIm92ZXJcIixcbiAgICBcIm92ZXJsYXBzXCIsXG4gICAgXCJvdmVybGF5XCIsXG4gICAgXCJwYXJhbWV0ZXJcIixcbiAgICBcInBhcnRpdGlvblwiLFxuICAgIFwicGF0dGVyblwiLFxuICAgIFwicGVyXCIsXG4gICAgXCJwZXJjZW50XCIsXG4gICAgXCJwZXJjZW50X3JhbmtcIixcbiAgICBcInBlcmNlbnRpbGVfY29udFwiLFxuICAgIFwicGVyY2VudGlsZV9kaXNjXCIsXG4gICAgXCJwZXJpb2RcIixcbiAgICBcInBvcnRpb25cIixcbiAgICBcInBvc2l0aW9uXCIsXG4gICAgXCJwb3NpdGlvbl9yZWdleFwiLFxuICAgIFwicG93ZXJcIixcbiAgICBcInByZWNlZGVzXCIsXG4gICAgXCJwcmVjaXNpb25cIixcbiAgICBcInByZXBhcmVcIixcbiAgICBcInByaW1hcnlcIixcbiAgICBcInByb2NlZHVyZVwiLFxuICAgIFwicHRmXCIsXG4gICAgXCJyYW5nZVwiLFxuICAgIFwicmFua1wiLFxuICAgIFwicmVhZHNcIixcbiAgICBcInJlYWxcIixcbiAgICBcInJlY3Vyc2l2ZVwiLFxuICAgIFwicmVmXCIsXG4gICAgXCJyZWZlcmVuY2VzXCIsXG4gICAgXCJyZWZlcmVuY2luZ1wiLFxuICAgIFwicmVncl9hdmd4XCIsXG4gICAgXCJyZWdyX2F2Z3lcIixcbiAgICBcInJlZ3JfY291bnRcIixcbiAgICBcInJlZ3JfaW50ZXJjZXB0XCIsXG4gICAgXCJyZWdyX3IyXCIsXG4gICAgXCJyZWdyX3Nsb3BlXCIsXG4gICAgXCJyZWdyX3N4eFwiLFxuICAgIFwicmVncl9zeHlcIixcbiAgICBcInJlZ3Jfc3l5XCIsXG4gICAgXCJyZWxlYXNlXCIsXG4gICAgXCJyZXN1bHRcIixcbiAgICBcInJldHVyblwiLFxuICAgIFwicmV0dXJuc1wiLFxuICAgIFwicmV2b2tlXCIsXG4gICAgXCJyaWdodFwiLFxuICAgIFwicm9sbGJhY2tcIixcbiAgICBcInJvbGx1cFwiLFxuICAgIFwicm93XCIsXG4gICAgXCJyb3dfbnVtYmVyXCIsXG4gICAgXCJyb3dzXCIsXG4gICAgXCJydW5uaW5nXCIsXG4gICAgXCJzYXZlcG9pbnRcIixcbiAgICBcInNjb3BlXCIsXG4gICAgXCJzY3JvbGxcIixcbiAgICBcInNlYXJjaFwiLFxuICAgIFwic2Vjb25kXCIsXG4gICAgXCJzZWVrXCIsXG4gICAgXCJzZWxlY3RcIixcbiAgICBcInNlbnNpdGl2ZVwiLFxuICAgIFwic2Vzc2lvbl91c2VyXCIsXG4gICAgXCJzZXRcIixcbiAgICBcInNob3dcIixcbiAgICBcInNpbWlsYXJcIixcbiAgICBcInNpblwiLFxuICAgIFwic2luaFwiLFxuICAgIFwic2tpcFwiLFxuICAgIFwic21hbGxpbnRcIixcbiAgICBcInNvbWVcIixcbiAgICBcInNwZWNpZmljXCIsXG4gICAgXCJzcGVjaWZpY3R5cGVcIixcbiAgICBcInNxbFwiLFxuICAgIFwic3FsZXhjZXB0aW9uXCIsXG4gICAgXCJzcWxzdGF0ZVwiLFxuICAgIFwic3Fsd2FybmluZ1wiLFxuICAgIFwic3FydFwiLFxuICAgIFwic3RhcnRcIixcbiAgICBcInN0YXRpY1wiLFxuICAgIFwic3RkZGV2X3BvcFwiLFxuICAgIFwic3RkZGV2X3NhbXBcIixcbiAgICBcInN1Ym11bHRpc2V0XCIsXG4gICAgXCJzdWJzZXRcIixcbiAgICBcInN1YnN0cmluZ1wiLFxuICAgIFwic3Vic3RyaW5nX3JlZ2V4XCIsXG4gICAgXCJzdWNjZWVkc1wiLFxuICAgIFwic3VtXCIsXG4gICAgXCJzeW1tZXRyaWNcIixcbiAgICBcInN5c3RlbVwiLFxuICAgIFwic3lzdGVtX3RpbWVcIixcbiAgICBcInN5c3RlbV91c2VyXCIsXG4gICAgXCJ0YWJsZVwiLFxuICAgIFwidGFibGVzYW1wbGVcIixcbiAgICBcInRhblwiLFxuICAgIFwidGFuaFwiLFxuICAgIFwidGhlblwiLFxuICAgIFwidGltZVwiLFxuICAgIFwidGltZXN0YW1wXCIsXG4gICAgXCJ0aW1lem9uZV9ob3VyXCIsXG4gICAgXCJ0aW1lem9uZV9taW51dGVcIixcbiAgICBcInRvXCIsXG4gICAgXCJ0cmFpbGluZ1wiLFxuICAgIFwidHJhbnNsYXRlXCIsXG4gICAgXCJ0cmFuc2xhdGVfcmVnZXhcIixcbiAgICBcInRyYW5zbGF0aW9uXCIsXG4gICAgXCJ0cmVhdFwiLFxuICAgIFwidHJpZ2dlclwiLFxuICAgIFwidHJpbVwiLFxuICAgIFwidHJpbV9hcnJheVwiLFxuICAgIFwidHJ1ZVwiLFxuICAgIFwidHJ1bmNhdGVcIixcbiAgICBcInVlc2NhcGVcIixcbiAgICBcInVuaW9uXCIsXG4gICAgXCJ1bmlxdWVcIixcbiAgICBcInVua25vd25cIixcbiAgICBcInVubmVzdFwiLFxuICAgIFwidXBkYXRlXCIsXG4gICAgXCJ1cHBlclwiLFxuICAgIFwidXNlclwiLFxuICAgIFwidXNpbmdcIixcbiAgICBcInZhbHVlXCIsXG4gICAgXCJ2YWx1ZXNcIixcbiAgICBcInZhbHVlX29mXCIsXG4gICAgXCJ2YXJfcG9wXCIsXG4gICAgXCJ2YXJfc2FtcFwiLFxuICAgIFwidmFyYmluYXJ5XCIsXG4gICAgXCJ2YXJjaGFyXCIsXG4gICAgXCJ2YXJ5aW5nXCIsXG4gICAgXCJ2ZXJzaW9uaW5nXCIsXG4gICAgXCJ3aGVuXCIsXG4gICAgXCJ3aGVuZXZlclwiLFxuICAgIFwid2hlcmVcIixcbiAgICBcIndpZHRoX2J1Y2tldFwiLFxuICAgIFwid2luZG93XCIsXG4gICAgXCJ3aXRoXCIsXG4gICAgXCJ3aXRoaW5cIixcbiAgICBcIndpdGhvdXRcIixcbiAgICBcInllYXJcIixcbiAgXTtcblxuICAvLyB0aGVzZSBhcmUgcmVzZXJ2ZWQgd29yZHMgd2UgaGF2ZSBpZGVudGlmaWVkIHRvIGJlIGZ1bmN0aW9uc1xuICAvLyBhbmQgc2hvdWxkIG9ubHkgYmUgaGlnaGxpZ2h0ZWQgaW4gYSBkaXNwYXRjaC1saWtlIGNvbnRleHRcbiAgLy8gaWUsIGFycmF5X2FnZyguLi4pLCBldGMuXG4gIGNvbnN0IFJFU0VSVkVEX0ZVTkNUSU9OUyA9IFtcbiAgICBcImFic1wiLFxuICAgIFwiYWNvc1wiLFxuICAgIFwiYXJyYXlfYWdnXCIsXG4gICAgXCJhc2luXCIsXG4gICAgXCJhdGFuXCIsXG4gICAgXCJhdmdcIixcbiAgICBcImNhc3RcIixcbiAgICBcImNlaWxcIixcbiAgICBcImNlaWxpbmdcIixcbiAgICBcImNvYWxlc2NlXCIsXG4gICAgXCJjb3JyXCIsXG4gICAgXCJjb3NcIixcbiAgICBcImNvc2hcIixcbiAgICBcImNvdW50XCIsXG4gICAgXCJjb3Zhcl9wb3BcIixcbiAgICBcImNvdmFyX3NhbXBcIixcbiAgICBcImN1bWVfZGlzdFwiLFxuICAgIFwiZGVuc2VfcmFua1wiLFxuICAgIFwiZGVyZWZcIixcbiAgICBcImVsZW1lbnRcIixcbiAgICBcImV4cFwiLFxuICAgIFwiZXh0cmFjdFwiLFxuICAgIFwiZmlyc3RfdmFsdWVcIixcbiAgICBcImZsb29yXCIsXG4gICAgXCJqc29uX2FycmF5XCIsXG4gICAgXCJqc29uX2FycmF5YWdnXCIsXG4gICAgXCJqc29uX2V4aXN0c1wiLFxuICAgIFwianNvbl9vYmplY3RcIixcbiAgICBcImpzb25fb2JqZWN0YWdnXCIsXG4gICAgXCJqc29uX3F1ZXJ5XCIsXG4gICAgXCJqc29uX3RhYmxlXCIsXG4gICAgXCJqc29uX3RhYmxlX3ByaW1pdGl2ZVwiLFxuICAgIFwianNvbl92YWx1ZVwiLFxuICAgIFwibGFnXCIsXG4gICAgXCJsYXN0X3ZhbHVlXCIsXG4gICAgXCJsZWFkXCIsXG4gICAgXCJsaXN0YWdnXCIsXG4gICAgXCJsblwiLFxuICAgIFwibG9nXCIsXG4gICAgXCJsb2cxMFwiLFxuICAgIFwibG93ZXJcIixcbiAgICBcIm1heFwiLFxuICAgIFwibWluXCIsXG4gICAgXCJtb2RcIixcbiAgICBcIm50aF92YWx1ZVwiLFxuICAgIFwibnRpbGVcIixcbiAgICBcIm51bGxpZlwiLFxuICAgIFwicGVyY2VudF9yYW5rXCIsXG4gICAgXCJwZXJjZW50aWxlX2NvbnRcIixcbiAgICBcInBlcmNlbnRpbGVfZGlzY1wiLFxuICAgIFwicG9zaXRpb25cIixcbiAgICBcInBvc2l0aW9uX3JlZ2V4XCIsXG4gICAgXCJwb3dlclwiLFxuICAgIFwicmFua1wiLFxuICAgIFwicmVncl9hdmd4XCIsXG4gICAgXCJyZWdyX2F2Z3lcIixcbiAgICBcInJlZ3JfY291bnRcIixcbiAgICBcInJlZ3JfaW50ZXJjZXB0XCIsXG4gICAgXCJyZWdyX3IyXCIsXG4gICAgXCJyZWdyX3Nsb3BlXCIsXG4gICAgXCJyZWdyX3N4eFwiLFxuICAgIFwicmVncl9zeHlcIixcbiAgICBcInJlZ3Jfc3l5XCIsXG4gICAgXCJyb3dfbnVtYmVyXCIsXG4gICAgXCJzaW5cIixcbiAgICBcInNpbmhcIixcbiAgICBcInNxcnRcIixcbiAgICBcInN0ZGRldl9wb3BcIixcbiAgICBcInN0ZGRldl9zYW1wXCIsXG4gICAgXCJzdWJzdHJpbmdcIixcbiAgICBcInN1YnN0cmluZ19yZWdleFwiLFxuICAgIFwic3VtXCIsXG4gICAgXCJ0YW5cIixcbiAgICBcInRhbmhcIixcbiAgICBcInRyYW5zbGF0ZVwiLFxuICAgIFwidHJhbnNsYXRlX3JlZ2V4XCIsXG4gICAgXCJ0cmVhdFwiLFxuICAgIFwidHJpbVwiLFxuICAgIFwidHJpbV9hcnJheVwiLFxuICAgIFwidW5uZXN0XCIsXG4gICAgXCJ1cHBlclwiLFxuICAgIFwidmFsdWVfb2ZcIixcbiAgICBcInZhcl9wb3BcIixcbiAgICBcInZhcl9zYW1wXCIsXG4gICAgXCJ3aWR0aF9idWNrZXRcIixcbiAgXTtcblxuICAvLyB0aGVzZSBmdW5jdGlvbnMgY2FuXG4gIGNvbnN0IFBPU1NJQkxFX1dJVEhPVVRfUEFSRU5TID0gW1xuICAgIFwiY3VycmVudF9jYXRhbG9nXCIsXG4gICAgXCJjdXJyZW50X2RhdGVcIixcbiAgICBcImN1cnJlbnRfZGVmYXVsdF90cmFuc2Zvcm1fZ3JvdXBcIixcbiAgICBcImN1cnJlbnRfcGF0aFwiLFxuICAgIFwiY3VycmVudF9yb2xlXCIsXG4gICAgXCJjdXJyZW50X3NjaGVtYVwiLFxuICAgIFwiY3VycmVudF90cmFuc2Zvcm1fZ3JvdXBfZm9yX3R5cGVcIixcbiAgICBcImN1cnJlbnRfdXNlclwiLFxuICAgIFwic2Vzc2lvbl91c2VyXCIsXG4gICAgXCJzeXN0ZW1fdGltZVwiLFxuICAgIFwic3lzdGVtX3VzZXJcIixcbiAgICBcImN1cnJlbnRfdGltZVwiLFxuICAgIFwibG9jYWx0aW1lXCIsXG4gICAgXCJjdXJyZW50X3RpbWVzdGFtcFwiLFxuICAgIFwibG9jYWx0aW1lc3RhbXBcIlxuICBdO1xuXG4gIC8vIHRob3NlIGV4aXN0IHRvIGJvb3N0IHJlbGV2YW5jZSBtYWtpbmcgdGhlc2UgdmVyeVxuICAvLyBcIlNRTCBsaWtlXCIga2V5d29yZCBjb21ib3Mgd29ydGggKzEgZXh0cmEgcmVsZXZhbmNlXG4gIGNvbnN0IENPTUJPUyA9IFtcbiAgICBcImNyZWF0ZSB0YWJsZVwiLFxuICAgIFwiaW5zZXJ0IGludG9cIixcbiAgICBcInByaW1hcnkga2V5XCIsXG4gICAgXCJmb3JlaWduIGtleVwiLFxuICAgIFwibm90IG51bGxcIixcbiAgICBcImFsdGVyIHRhYmxlXCIsXG4gICAgXCJhZGQgY29uc3RyYWludFwiLFxuICAgIFwiZ3JvdXBpbmcgc2V0c1wiLFxuICAgIFwib24gb3ZlcmZsb3dcIixcbiAgICBcImNoYXJhY3RlciBzZXRcIixcbiAgICBcInJlc3BlY3QgbnVsbHNcIixcbiAgICBcImlnbm9yZSBudWxsc1wiLFxuICAgIFwibnVsbHMgZmlyc3RcIixcbiAgICBcIm51bGxzIGxhc3RcIixcbiAgICBcImRlcHRoIGZpcnN0XCIsXG4gICAgXCJicmVhZHRoIGZpcnN0XCJcbiAgXTtcblxuICBjb25zdCBGVU5DVElPTlMgPSBSRVNFUlZFRF9GVU5DVElPTlM7XG5cbiAgY29uc3QgS0VZV09SRFMgPSBbXG4gICAgLi4uUkVTRVJWRURfV09SRFMsXG4gICAgLi4uTk9OX1JFU0VSVkVEX1dPUkRTXG4gIF0uZmlsdGVyKChrZXl3b3JkKSA9PiB7XG4gICAgcmV0dXJuICFSRVNFUlZFRF9GVU5DVElPTlMuaW5jbHVkZXMoa2V5d29yZCk7XG4gIH0pO1xuXG4gIGNvbnN0IFZBUklBQkxFID0ge1xuICAgIGNsYXNzTmFtZTogXCJ2YXJpYWJsZVwiLFxuICAgIGJlZ2luOiAvQFthLXowLTldW2EtejAtOV9dKi8sXG4gIH07XG5cbiAgY29uc3QgT1BFUkFUT1IgPSB7XG4gICAgY2xhc3NOYW1lOiBcIm9wZXJhdG9yXCIsXG4gICAgYmVnaW46IC9bLSsqLz0lXn5dfCYmP3xcXHxcXHw/fCE9P3w8KD86PT4/fDx8Pik/fD5bPj1dPy8sXG4gICAgcmVsZXZhbmNlOiAwLFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX0NBTEwgPSB7XG4gICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvXFxiLywgcmVnZXguZWl0aGVyKC4uLkZVTkNUSU9OUyksIC9cXHMqXFwoLyksXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGtleXdvcmRzOiB7IGJ1aWx0X2luOiBGVU5DVElPTlMgfVxuICB9O1xuXG4gIC8vIGtleXdvcmRzIHdpdGggbGVzcyB0aGFuIDMgbGV0dGVycyBhcmUgcmVkdWNlZCBpbiByZWxldmFuY3lcbiAgZnVuY3Rpb24gcmVkdWNlUmVsZXZhbmN5KGxpc3QsIHtcbiAgICBleGNlcHRpb25zLCB3aGVuXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHF1YWxpZnlGbiA9IHdoZW47XG4gICAgZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnMgfHwgW107XG4gICAgcmV0dXJuIGxpc3QubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5tYXRjaCgvXFx8XFxkKyQvKSB8fCBleGNlcHRpb25zLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSBlbHNlIGlmIChxdWFsaWZ5Rm4oaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIGAke2l0ZW19fDBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdTUUwnLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgLy8gZG9lcyBub3QgaW5jbHVkZSB7fSBvciBIVE1MIHRhZ3MgYDwvYFxuICAgIGlsbGVnYWw6IC9be31dfDxcXC8vLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogL1xcYltcXHdcXC5dKy8sXG4gICAgICBrZXl3b3JkOlxuICAgICAgICByZWR1Y2VSZWxldmFuY3koS0VZV09SRFMsIHsgd2hlbjogKHgpID0+IHgubGVuZ3RoIDwgMyB9KSxcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgICAgdHlwZTogVFlQRVMsXG4gICAgICBidWlsdF9pbjogUE9TU0lCTEVfV0lUSE9VVF9QQVJFTlNcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiByZWdleC5laXRoZXIoLi4uQ09NQk9TKSxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBrZXl3b3Jkczoge1xuICAgICAgICAgICRwYXR0ZXJuOiAvW1xcd1xcLl0rLyxcbiAgICAgICAgICBrZXl3b3JkOiBLRVlXT1JEUy5jb25jYXQoQ09NQk9TKSxcbiAgICAgICAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICAgICAgICB0eXBlOiBUWVBFU1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInR5cGVcIixcbiAgICAgICAgYmVnaW46IHJlZ2V4LmVpdGhlciguLi5NVUxUSV9XT1JEX1RZUEVTKVxuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX0NBTEwsXG4gICAgICBWQVJJQUJMRSxcbiAgICAgIFNUUklORyxcbiAgICAgIFFVT1RFRF9JREVOVElGSUVSLFxuICAgICAgaGxqcy5DX05VTUJFUl9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIENPTU1FTlRfTU9ERSxcbiAgICAgIE9QRVJBVE9SXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBzcWwgYXMgZGVmYXVsdCB9O1xuIiwgIi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICogKi9cblxuLyoqXG4gKiBAcGFyYW0ge1JlZ0V4cCB8IHN0cmluZyB9IHJlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBzb3VyY2UocmUpIHtcbiAgaWYgKCFyZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgcmUgPT09IFwic3RyaW5nXCIpIHJldHVybiByZTtcblxuICByZXR1cm4gcmUuc291cmNlO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGxvb2thaGVhZChyZSkge1xuICByZXR1cm4gY29uY2F0KCcoPz0nLCByZSwgJyknKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLihSZWdFeHAgfCBzdHJpbmcpIH0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29uY2F0KC4uLmFyZ3MpIHtcbiAgY29uc3Qgam9pbmVkID0gYXJncy5tYXAoKHgpID0+IHNvdXJjZSh4KSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBBcnJheTxzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3Q+IH0gYXJnc1xuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncykge1xuICBjb25zdCBvcHRzID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcgJiYgb3B0cy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgYXJncy5zcGxpY2UoYXJncy5sZW5ndGggLSAxLCAxKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHsge2NhcHR1cmU/OiBib29sZWFufSB9IFJlZ2V4RWl0aGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIEFueSBvZiB0aGUgcGFzc2VkIGV4cHJlc3NzaW9ucyBtYXkgbWF0Y2hcbiAqXG4gKiBDcmVhdGVzIGEgaHVnZSB0aGlzIHwgdGhpcyB8IHRoYXQgfCB0aGF0IG1hdGNoXG4gKiBAcGFyYW0geyhSZWdFeHAgfCBzdHJpbmcpW10gfCBbLi4uKFJlZ0V4cCB8IHN0cmluZylbXSwgUmVnZXhFaXRoZXJPcHRpb25zXX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZWl0aGVyKC4uLmFyZ3MpIHtcbiAgLyoqIEB0eXBlIHsgb2JqZWN0ICYge2NhcHR1cmU/OiBib29sZWFufSB9ICAqL1xuICBjb25zdCBvcHRzID0gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncyk7XG4gIGNvbnN0IGpvaW5lZCA9ICcoJ1xuICAgICsgKG9wdHMuY2FwdHVyZSA/IFwiXCIgOiBcIj86XCIpXG4gICAgKyBhcmdzLm1hcCgoeCkgPT4gc291cmNlKHgpKS5qb2luKFwifFwiKSArIFwiKVwiO1xuICByZXR1cm4gam9pbmVkO1xufVxuXG5jb25zdCBrZXl3b3JkV3JhcHBlciA9IGtleXdvcmQgPT4gY29uY2F0KFxuICAvXFxiLyxcbiAga2V5d29yZCxcbiAgL1xcdyQvLnRlc3Qoa2V5d29yZCkgPyAvXFxiLyA6IC9cXEIvXG4pO1xuXG4vLyBLZXl3b3JkcyB0aGF0IHJlcXVpcmUgYSBsZWFkaW5nIGRvdC5cbmNvbnN0IGRvdEtleXdvcmRzID0gW1xuICAnUHJvdG9jb2wnLCAvLyBjb250ZXh0dWFsXG4gICdUeXBlJyAvLyBjb250ZXh0dWFsXG5dLm1hcChrZXl3b3JkV3JhcHBlcik7XG5cbi8vIEtleXdvcmRzIHRoYXQgbWF5IGhhdmUgYSBsZWFkaW5nIGRvdC5cbmNvbnN0IG9wdGlvbmFsRG90S2V5d29yZHMgPSBbXG4gICdpbml0JyxcbiAgJ3NlbGYnXG5dLm1hcChrZXl3b3JkV3JhcHBlcik7XG5cbi8vIHNob3VsZCByZWdpc3RlciBhcyBrZXl3b3JkLCBub3QgdHlwZVxuY29uc3Qga2V5d29yZFR5cGVzID0gW1xuICAnQW55JyxcbiAgJ1NlbGYnXG5dO1xuXG4vLyBSZWd1bGFyIGtleXdvcmRzIGFuZCBsaXRlcmFscy5cbmNvbnN0IGtleXdvcmRzID0gW1xuICAvLyBzdHJpbmdzIGJlbG93IHdpbGwgYmUgZmVkIGludG8gdGhlIHJlZ3VsYXIgYGtleXdvcmRzYCBlbmdpbmUgd2hpbGUgcmVnZXhcbiAgLy8gd2lsbCByZXN1bHQgaW4gYWRkaXRpb25hbCBtb2RlcyBiZWluZyBjcmVhdGVkIHRvIHNjYW4gZm9yIHRob3NlIGtleXdvcmRzIHRvXG4gIC8vIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHJ1bGVzXG4gICdhY3RvcicsXG4gICdhbnknLCAvLyBjb250ZXh0dWFsXG4gICdhc3NvY2lhdGVkdHlwZScsXG4gICdhc3luYycsXG4gICdhd2FpdCcsXG4gIC9hc1xcPy8sIC8vIG9wZXJhdG9yXG4gIC9hcyEvLCAvLyBvcGVyYXRvclxuICAnYXMnLCAvLyBvcGVyYXRvclxuICAnYnJlYWsnLFxuICAnY2FzZScsXG4gICdjYXRjaCcsXG4gICdjbGFzcycsXG4gICdjb250aW51ZScsXG4gICdjb252ZW5pZW5jZScsIC8vIGNvbnRleHR1YWxcbiAgJ2RlZmF1bHQnLFxuICAnZGVmZXInLFxuICAnZGVpbml0JyxcbiAgJ2RpZFNldCcsIC8vIGNvbnRleHR1YWxcbiAgJ2Rpc3RyaWJ1dGVkJyxcbiAgJ2RvJyxcbiAgJ2R5bmFtaWMnLCAvLyBjb250ZXh0dWFsXG4gICdlbHNlJyxcbiAgJ2VudW0nLFxuICAnZXh0ZW5zaW9uJyxcbiAgJ2ZhbGx0aHJvdWdoJyxcbiAgL2ZpbGVwcml2YXRlXFwoc2V0XFwpLyxcbiAgJ2ZpbGVwcml2YXRlJyxcbiAgJ2ZpbmFsJywgLy8gY29udGV4dHVhbFxuICAnZm9yJyxcbiAgJ2Z1bmMnLFxuICAnZ2V0JywgLy8gY29udGV4dHVhbFxuICAnZ3VhcmQnLFxuICAnaWYnLFxuICAnaW1wb3J0JyxcbiAgJ2luZGlyZWN0JywgLy8gY29udGV4dHVhbFxuICAnaW5maXgnLCAvLyBjb250ZXh0dWFsXG4gIC9pbml0XFw/LyxcbiAgL2luaXQhLyxcbiAgJ2lub3V0JyxcbiAgL2ludGVybmFsXFwoc2V0XFwpLyxcbiAgJ2ludGVybmFsJyxcbiAgJ2luJyxcbiAgJ2lzJywgLy8gb3BlcmF0b3JcbiAgJ2lzb2xhdGVkJywgLy8gY29udGV4dHVhbFxuICAnbm9uaXNvbGF0ZWQnLCAvLyBjb250ZXh0dWFsXG4gICdsYXp5JywgLy8gY29udGV4dHVhbFxuICAnbGV0JyxcbiAgJ211dGF0aW5nJywgLy8gY29udGV4dHVhbFxuICAnbm9ubXV0YXRpbmcnLCAvLyBjb250ZXh0dWFsXG4gIC9vcGVuXFwoc2V0XFwpLywgLy8gY29udGV4dHVhbFxuICAnb3BlbicsIC8vIGNvbnRleHR1YWxcbiAgJ29wZXJhdG9yJyxcbiAgJ29wdGlvbmFsJywgLy8gY29udGV4dHVhbFxuICAnb3ZlcnJpZGUnLCAvLyBjb250ZXh0dWFsXG4gICdwb3N0Zml4JywgLy8gY29udGV4dHVhbFxuICAncHJlY2VkZW5jZWdyb3VwJyxcbiAgJ3ByZWZpeCcsIC8vIGNvbnRleHR1YWxcbiAgL3ByaXZhdGVcXChzZXRcXCkvLFxuICAncHJpdmF0ZScsXG4gICdwcm90b2NvbCcsXG4gIC9wdWJsaWNcXChzZXRcXCkvLFxuICAncHVibGljJyxcbiAgJ3JlcGVhdCcsXG4gICdyZXF1aXJlZCcsIC8vIGNvbnRleHR1YWxcbiAgJ3JldGhyb3dzJyxcbiAgJ3JldHVybicsXG4gICdzZXQnLCAvLyBjb250ZXh0dWFsXG4gICdzb21lJywgLy8gY29udGV4dHVhbFxuICAnc3RhdGljJyxcbiAgJ3N0cnVjdCcsXG4gICdzdWJzY3JpcHQnLFxuICAnc3VwZXInLFxuICAnc3dpdGNoJyxcbiAgJ3Rocm93cycsXG4gICd0aHJvdycsXG4gIC90cnlcXD8vLCAvLyBvcGVyYXRvclxuICAvdHJ5IS8sIC8vIG9wZXJhdG9yXG4gICd0cnknLCAvLyBvcGVyYXRvclxuICAndHlwZWFsaWFzJyxcbiAgL3Vub3duZWRcXChzYWZlXFwpLywgLy8gY29udGV4dHVhbFxuICAvdW5vd25lZFxcKHVuc2FmZVxcKS8sIC8vIGNvbnRleHR1YWxcbiAgJ3Vub3duZWQnLCAvLyBjb250ZXh0dWFsXG4gICd2YXInLFxuICAnd2VhaycsIC8vIGNvbnRleHR1YWxcbiAgJ3doZXJlJyxcbiAgJ3doaWxlJyxcbiAgJ3dpbGxTZXQnIC8vIGNvbnRleHR1YWxcbl07XG5cbi8vIE5PVEU6IENvbnRleHR1YWwga2V5d29yZHMgYXJlIHJlc2VydmVkIG9ubHkgaW4gc3BlY2lmaWMgY29udGV4dHMuXG4vLyBJZGVhbGx5LCB0aGVzZSBzaG91bGQgYmUgbWF0Y2hlZCB1c2luZyBtb2RlcyB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMuXG5cbi8vIExpdGVyYWxzLlxuY29uc3QgbGl0ZXJhbHMgPSBbXG4gICdmYWxzZScsXG4gICduaWwnLFxuICAndHJ1ZSdcbl07XG5cbi8vIEtleXdvcmRzIHVzZWQgaW4gcHJlY2VkZW5jZSBncm91cHMuXG5jb25zdCBwcmVjZWRlbmNlZ3JvdXBLZXl3b3JkcyA9IFtcbiAgJ2Fzc2lnbm1lbnQnLFxuICAnYXNzb2NpYXRpdml0eScsXG4gICdoaWdoZXJUaGFuJyxcbiAgJ2xlZnQnLFxuICAnbG93ZXJUaGFuJyxcbiAgJ25vbmUnLFxuICAncmlnaHQnXG5dO1xuXG4vLyBLZXl3b3JkcyB0aGF0IHN0YXJ0IHdpdGggYSBudW1iZXIgc2lnbiAoIykuXG4vLyAjKHVuKWF2YWlsYWJsZSBpcyBoYW5kbGVkIHNlcGFyYXRlbHkuXG5jb25zdCBudW1iZXJTaWduS2V5d29yZHMgPSBbXG4gICcjY29sb3JMaXRlcmFsJyxcbiAgJyNjb2x1bW4nLFxuICAnI2Rzb2hhbmRsZScsXG4gICcjZWxzZScsXG4gICcjZWxzZWlmJyxcbiAgJyNlbmRpZicsXG4gICcjZXJyb3InLFxuICAnI2ZpbGUnLFxuICAnI2ZpbGVJRCcsXG4gICcjZmlsZUxpdGVyYWwnLFxuICAnI2ZpbGVQYXRoJyxcbiAgJyNmdW5jdGlvbicsXG4gICcjaWYnLFxuICAnI2ltYWdlTGl0ZXJhbCcsXG4gICcja2V5UGF0aCcsXG4gICcjbGluZScsXG4gICcjc2VsZWN0b3InLFxuICAnI3NvdXJjZUxvY2F0aW9uJyxcbiAgJyN3YXJuX3VucXVhbGlmaWVkX2FjY2VzcycsXG4gICcjd2FybmluZydcbl07XG5cbi8vIEdsb2JhbCBmdW5jdGlvbnMgaW4gdGhlIFN0YW5kYXJkIExpYnJhcnkuXG5jb25zdCBidWlsdElucyA9IFtcbiAgJ2FicycsXG4gICdhbGwnLFxuICAnYW55JyxcbiAgJ2Fzc2VydCcsXG4gICdhc3NlcnRpb25GYWlsdXJlJyxcbiAgJ2RlYnVnUHJpbnQnLFxuICAnZHVtcCcsXG4gICdmYXRhbEVycm9yJyxcbiAgJ2dldFZhTGlzdCcsXG4gICdpc0tub3duVW5pcXVlbHlSZWZlcmVuY2VkJyxcbiAgJ21heCcsXG4gICdtaW4nLFxuICAnbnVtZXJpY0Nhc3QnLFxuICAncG9pbnR3aXNlTWF4JyxcbiAgJ3BvaW50d2lzZU1pbicsXG4gICdwcmVjb25kaXRpb24nLFxuICAncHJlY29uZGl0aW9uRmFpbHVyZScsXG4gICdwcmludCcsXG4gICdyZWFkTGluZScsXG4gICdyZXBlYXRFbGVtZW50JyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ3N0cmlkZScsXG4gICdzd2FwJyxcbiAgJ3N3aWZ0X3VuYm94RnJvbVN3aWZ0VmFsdWVXaXRoVHlwZScsXG4gICd0cmFuc2NvZGUnLFxuICAndHlwZScsXG4gICd1bnNhZmVCaXRDYXN0JyxcbiAgJ3Vuc2FmZURvd25jYXN0JyxcbiAgJ3dpdGhFeHRlbmRlZExpZmV0aW1lJyxcbiAgJ3dpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcicsXG4gICd3aXRoVW5zYWZlUG9pbnRlcicsXG4gICd3aXRoVmFMaXN0JyxcbiAgJ3dpdGhvdXRBY3R1YWxseUVzY2FwaW5nJyxcbiAgJ3ppcCdcbl07XG5cbi8vIFZhbGlkIGZpcnN0IGNoYXJhY3RlcnMgZm9yIG9wZXJhdG9ycy5cbmNvbnN0IG9wZXJhdG9ySGVhZCA9IGVpdGhlcihcbiAgL1svPVxcLSshKiU8PiZ8Xn4/XS8sXG4gIC9bXFx1MDBBMS1cXHUwMEE3XS8sXG4gIC9bXFx1MDBBOVxcdTAwQUJdLyxcbiAgL1tcXHUwMEFDXFx1MDBBRV0vLFxuICAvW1xcdTAwQjBcXHUwMEIxXS8sXG4gIC9bXFx1MDBCNlxcdTAwQkJcXHUwMEJGXFx1MDBEN1xcdTAwRjddLyxcbiAgL1tcXHUyMDE2LVxcdTIwMTddLyxcbiAgL1tcXHUyMDIwLVxcdTIwMjddLyxcbiAgL1tcXHUyMDMwLVxcdTIwM0VdLyxcbiAgL1tcXHUyMDQxLVxcdTIwNTNdLyxcbiAgL1tcXHUyMDU1LVxcdTIwNUVdLyxcbiAgL1tcXHUyMTkwLVxcdTIzRkZdLyxcbiAgL1tcXHUyNTAwLVxcdTI3NzVdLyxcbiAgL1tcXHUyNzk0LVxcdTJCRkZdLyxcbiAgL1tcXHUyRTAwLVxcdTJFN0ZdLyxcbiAgL1tcXHUzMDAxLVxcdTMwMDNdLyxcbiAgL1tcXHUzMDA4LVxcdTMwMjBdLyxcbiAgL1tcXHUzMDMwXS9cbik7XG5cbi8vIFZhbGlkIGNoYXJhY3RlcnMgZm9yIG9wZXJhdG9ycy5cbmNvbnN0IG9wZXJhdG9yQ2hhcmFjdGVyID0gZWl0aGVyKFxuICBvcGVyYXRvckhlYWQsXG4gIC9bXFx1MDMwMC1cXHUwMzZGXS8sXG4gIC9bXFx1MURDMC1cXHUxREZGXS8sXG4gIC9bXFx1MjBEMC1cXHUyMEZGXS8sXG4gIC9bXFx1RkUwMC1cXHVGRTBGXS8sXG4gIC9bXFx1RkUyMC1cXHVGRTJGXS9cbiAgLy8gVE9ETzogVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSBhbHNvIGFsbG93ZWQsIGJ1dCB0aGUgcmVnZXggaXNuJ3Qgc3VwcG9ydGVkIHlldC5cbiAgLy8gL1tcXHV7RTAxMDB9LVxcdXtFMDFFRn1dL3Vcbik7XG5cbi8vIFZhbGlkIG9wZXJhdG9yLlxuY29uc3Qgb3BlcmF0b3IgPSBjb25jYXQob3BlcmF0b3JIZWFkLCBvcGVyYXRvckNoYXJhY3RlciwgJyonKTtcblxuLy8gVmFsaWQgZmlyc3QgY2hhcmFjdGVycyBmb3IgaWRlbnRpZmllcnMuXG5jb25zdCBpZGVudGlmaWVySGVhZCA9IGVpdGhlcihcbiAgL1thLXpBLVpfXS8sXG4gIC9bXFx1MDBBOFxcdTAwQUFcXHUwMEFEXFx1MDBBRlxcdTAwQjItXFx1MDBCNVxcdTAwQjctXFx1MDBCQV0vLFxuICAvW1xcdTAwQkMtXFx1MDBCRVxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDBGRl0vLFxuICAvW1xcdTAxMDAtXFx1MDJGRlxcdTAzNzAtXFx1MTY3RlxcdTE2ODEtXFx1MTgwRFxcdTE4MEYtXFx1MURCRl0vLFxuICAvW1xcdTFFMDAtXFx1MUZGRl0vLFxuICAvW1xcdTIwMEItXFx1MjAwRFxcdTIwMkEtXFx1MjAyRVxcdTIwM0YtXFx1MjA0MFxcdTIwNTRcXHUyMDYwLVxcdTIwNkZdLyxcbiAgL1tcXHUyMDcwLVxcdTIwQ0ZcXHUyMTAwLVxcdTIxOEZcXHUyNDYwLVxcdTI0RkZcXHUyNzc2LVxcdTI3OTNdLyxcbiAgL1tcXHUyQzAwLVxcdTJERkZcXHUyRTgwLVxcdTJGRkZdLyxcbiAgL1tcXHUzMDA0LVxcdTMwMDdcXHUzMDIxLVxcdTMwMkZcXHUzMDMxLVxcdTMwM0ZcXHUzMDQwLVxcdUQ3RkZdLyxcbiAgL1tcXHVGOTAwLVxcdUZEM0RcXHVGRDQwLVxcdUZEQ0ZcXHVGREYwLVxcdUZFMUZcXHVGRTMwLVxcdUZFNDRdLyxcbiAgL1tcXHVGRTQ3LVxcdUZFRkVcXHVGRjAwLVxcdUZGRkRdLyAvLyBTaG91bGQgYmUgL1tcXHVGRTQ3LVxcdUZGRkRdLywgYnV0IHdlIGhhdmUgdG8gZXhjbHVkZSBGRUZGLlxuICAvLyBUaGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFsc28gYWxsb3dlZCwgYnV0IHRoZSByZWdleGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0LlxuICAvLyAvW1xcdXsxMDAwMH0tXFx1ezFGRkZEfVxcdXsyMDAwMC1cXHV7MkZGRkR9XFx1ezMwMDAwfS1cXHV7M0ZGRkR9XFx1ezQwMDAwfS1cXHV7NEZGRkR9XS91LFxuICAvLyAvW1xcdXs1MDAwMH0tXFx1ezVGRkZEfVxcdXs2MDAwMC1cXHV7NkZGRkR9XFx1ezcwMDAwfS1cXHV7N0ZGRkR9XFx1ezgwMDAwfS1cXHV7OEZGRkR9XS91LFxuICAvLyAvW1xcdXs5MDAwMH0tXFx1ezlGRkZEfVxcdXtBMDAwMC1cXHV7QUZGRkR9XFx1e0IwMDAwfS1cXHV7QkZGRkR9XFx1e0MwMDAwfS1cXHV7Q0ZGRkR9XS91LFxuICAvLyAvW1xcdXtEMDAwMH0tXFx1e0RGRkZEfVxcdXtFMDAwMC1cXHV7RUZGRkR9XS91XG4pO1xuXG4vLyBWYWxpZCBjaGFyYWN0ZXJzIGZvciBpZGVudGlmaWVycy5cbmNvbnN0IGlkZW50aWZpZXJDaGFyYWN0ZXIgPSBlaXRoZXIoXG4gIGlkZW50aWZpZXJIZWFkLFxuICAvXFxkLyxcbiAgL1tcXHUwMzAwLVxcdTAzNkZcXHUxREMwLVxcdTFERkZcXHUyMEQwLVxcdTIwRkZcXHVGRTIwLVxcdUZFMkZdL1xuKTtcblxuLy8gVmFsaWQgaWRlbnRpZmllci5cbmNvbnN0IGlkZW50aWZpZXIgPSBjb25jYXQoaWRlbnRpZmllckhlYWQsIGlkZW50aWZpZXJDaGFyYWN0ZXIsICcqJyk7XG5cbi8vIFZhbGlkIHR5cGUgaWRlbnRpZmllci5cbmNvbnN0IHR5cGVJZGVudGlmaWVyID0gY29uY2F0KC9bQS1aXS8sIGlkZW50aWZpZXJDaGFyYWN0ZXIsICcqJyk7XG5cbi8vIEJ1aWx0LWluIGF0dHJpYnV0ZXMsIHdoaWNoIGFyZSBoaWdobGlnaHRlZCBhcyBrZXl3b3Jkcy5cbi8vIEBhdmFpbGFibGUgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5LlxuY29uc3Qga2V5d29yZEF0dHJpYnV0ZXMgPSBbXG4gICdhdXRvY2xvc3VyZScsXG4gIGNvbmNhdCgvY29udmVudGlvblxcKC8sIGVpdGhlcignc3dpZnQnLCAnYmxvY2snLCAnYycpLCAvXFwpLyksXG4gICdkaXNjYXJkYWJsZVJlc3VsdCcsXG4gICdkeW5hbWljQ2FsbGFibGUnLFxuICAnZHluYW1pY01lbWJlckxvb2t1cCcsXG4gICdlc2NhcGluZycsXG4gICdmcm96ZW4nLFxuICAnR0tJbnNwZWN0YWJsZScsXG4gICdJQkFjdGlvbicsXG4gICdJQkRlc2lnbmFibGUnLFxuICAnSUJJbnNwZWN0YWJsZScsXG4gICdJQk91dGxldCcsXG4gICdJQlNlZ3VlQWN0aW9uJyxcbiAgJ2lubGluYWJsZScsXG4gICdtYWluJyxcbiAgJ25vbm9iamMnLFxuICAnTlNBcHBsaWNhdGlvbk1haW4nLFxuICAnTlNDb3B5aW5nJyxcbiAgJ05TTWFuYWdlZCcsXG4gIGNvbmNhdCgvb2JqY1xcKC8sIGlkZW50aWZpZXIsIC9cXCkvKSxcbiAgJ29iamMnLFxuICAnb2JqY01lbWJlcnMnLFxuICAncHJvcGVydHlXcmFwcGVyJyxcbiAgJ3JlcXVpcmVzX3N0b3JlZF9wcm9wZXJ0eV9pbml0cycsXG4gICdyZXN1bHRCdWlsZGVyJyxcbiAgJ3Rlc3RhYmxlJyxcbiAgJ1VJQXBwbGljYXRpb25NYWluJyxcbiAgJ3Vua25vd24nLFxuICAndXNhYmxlRnJvbUlubGluZSdcbl07XG5cbi8vIENvbnRleHR1YWwga2V5d29yZHMgdXNlZCBpbiBAYXZhaWxhYmxlIGFuZCAjKHVuKWF2YWlsYWJsZS5cbmNvbnN0IGF2YWlsYWJpbGl0eUtleXdvcmRzID0gW1xuICAnaU9TJyxcbiAgJ2lPU0FwcGxpY2F0aW9uRXh0ZW5zaW9uJyxcbiAgJ21hY09TJyxcbiAgJ21hY09TQXBwbGljYXRpb25FeHRlbnNpb24nLFxuICAnbWFjQ2F0YWx5c3QnLFxuICAnbWFjQ2F0YWx5c3RBcHBsaWNhdGlvbkV4dGVuc2lvbicsXG4gICd3YXRjaE9TJyxcbiAgJ3dhdGNoT1NBcHBsaWNhdGlvbkV4dGVuc2lvbicsXG4gICd0dk9TJyxcbiAgJ3R2T1NBcHBsaWNhdGlvbkV4dGVuc2lvbicsXG4gICdzd2lmdCdcbl07XG5cbi8qXG5MYW5ndWFnZTogU3dpZnRcbkRlc2NyaXB0aW9uOiBTd2lmdCBpcyBhIGdlbmVyYWwtcHVycG9zZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBidWlsdCB1c2luZyBhIG1vZGVybiBhcHByb2FjaCB0byBzYWZldHksIHBlcmZvcm1hbmNlLCBhbmQgc29mdHdhcmUgZGVzaWduIHBhdHRlcm5zLlxuQXV0aG9yOiBTdGV2ZW4gVmFuIEltcGUgPHN0ZXZlbi52YW5pbXBlQGljbG91ZC5jb20+XG5Db250cmlidXRvcnM6IENocmlzIEVpZGhvZiA8Y2hyaXNAZWlkaG9mLm5sPiwgTmF0ZSBDb29rIDxuYXRlY29va0BnbWFpbC5jb20+LCBBbGV4YW5kZXIgTGljaHRlciA8bWFubmlMQGdteC5uZXQ+LCBSaWNoYXJkIEdpYnNvbiA8Z2lic29uMDQyQGdpdGh1Yj5cbldlYnNpdGU6IGh0dHBzOi8vc3dpZnQub3JnXG5DYXRlZ29yeTogY29tbW9uLCBzeXN0ZW1cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBzd2lmdChobGpzKSB7XG4gIGNvbnN0IFdISVRFU1BBQ0UgPSB7XG4gICAgbWF0Y2g6IC9cXHMrLyxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9MZXhpY2FsU3RydWN0dXJlLmh0bWwjSUQ0MTFcbiAgY29uc3QgQkxPQ0tfQ09NTUVOVCA9IGhsanMuQ09NTUVOVChcbiAgICAnL1xcXFwqJyxcbiAgICAnXFxcXCovJyxcbiAgICB7IGNvbnRhaW5zOiBbICdzZWxmJyBdIH1cbiAgKTtcbiAgY29uc3QgQ09NTUVOVFMgPSBbXG4gICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgIEJMT0NLX0NPTU1FTlRcbiAgXTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0xleGljYWxTdHJ1Y3R1cmUuaHRtbCNJRDQxM1xuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL3p6U3VtbWFyeU9mVGhlR3JhbW1hci5odG1sXG4gIGNvbnN0IERPVF9LRVlXT1JEID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvXFwuLyxcbiAgICAgIGVpdGhlciguLi5kb3RLZXl3b3JkcywgLi4ub3B0aW9uYWxEb3RLZXl3b3JkcylcbiAgICBdLFxuICAgIGNsYXNzTmFtZTogeyAyOiBcImtleXdvcmRcIiB9XG4gIH07XG4gIGNvbnN0IEtFWVdPUkRfR1VBUkQgPSB7XG4gICAgLy8gQ29uc3VtZSAua2V5d29yZCB0byBwcmV2ZW50IGhpZ2hsaWdodGluZyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGFzIGtleXdvcmRzLlxuICAgIG1hdGNoOiBjb25jYXQoL1xcLi8sIGVpdGhlciguLi5rZXl3b3JkcykpLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuICBjb25zdCBQTEFJTl9LRVlXT1JEUyA9IGtleXdvcmRzXG4gICAgLmZpbHRlcihrdyA9PiB0eXBlb2Yga3cgPT09ICdzdHJpbmcnKVxuICAgIC5jb25jYXQoWyBcIl98MFwiIF0pOyAvLyBzZWVtcyBjb21tb24sIHNvIDAgcmVsZXZhbmNlXG4gIGNvbnN0IFJFR0VYX0tFWVdPUkRTID0ga2V5d29yZHNcbiAgICAuZmlsdGVyKGt3ID0+IHR5cGVvZiBrdyAhPT0gJ3N0cmluZycpIC8vIGZpbmQgcmVnZXhcbiAgICAuY29uY2F0KGtleXdvcmRUeXBlcylcbiAgICAubWFwKGtleXdvcmRXcmFwcGVyKTtcbiAgY29uc3QgS0VZV09SRCA9IHsgdmFyaWFudHM6IFtcbiAgICB7XG4gICAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICAgIG1hdGNoOiBlaXRoZXIoLi4uUkVHRVhfS0VZV09SRFMsIC4uLm9wdGlvbmFsRG90S2V5d29yZHMpXG4gICAgfVxuICBdIH07XG4gIC8vIGZpbmQgYWxsIHRoZSByZWd1bGFyIGtleXdvcmRzXG4gIGNvbnN0IEtFWVdPUkRTID0ge1xuICAgICRwYXR0ZXJuOiBlaXRoZXIoXG4gICAgICAvXFxiXFx3Ky8sIC8vIHJlZ3VsYXIga2V5d29yZHNcbiAgICAgIC8jXFx3Ky8gLy8gbnVtYmVyIGtleXdvcmRzXG4gICAgKSxcbiAgICBrZXl3b3JkOiBQTEFJTl9LRVlXT1JEU1xuICAgICAgLmNvbmNhdChudW1iZXJTaWduS2V5d29yZHMpLFxuICAgIGxpdGVyYWw6IGxpdGVyYWxzXG4gIH07XG4gIGNvbnN0IEtFWVdPUkRfTU9ERVMgPSBbXG4gICAgRE9UX0tFWVdPUkQsXG4gICAgS0VZV09SRF9HVUFSRCxcbiAgICBLRVlXT1JEXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGxlL3N3aWZ0L3RyZWUvbWFpbi9zdGRsaWIvcHVibGljL2NvcmVcbiAgY29uc3QgQlVJTFRfSU5fR1VBUkQgPSB7XG4gICAgLy8gQ29uc3VtZSAuYnVpbHRfaW4gdG8gcHJldmVudCBoaWdobGlnaHRpbmcgcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cbiAgICBtYXRjaDogY29uY2F0KC9cXC4vLCBlaXRoZXIoLi4uYnVpbHRJbnMpKSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgQlVJTFRfSU4gPSB7XG4gICAgY2xhc3NOYW1lOiAnYnVpbHRfaW4nLFxuICAgIG1hdGNoOiBjb25jYXQoL1xcYi8sIGVpdGhlciguLi5idWlsdElucyksIC8oPz1cXCgpLylcbiAgfTtcbiAgY29uc3QgQlVJTFRfSU5TID0gW1xuICAgIEJVSUxUX0lOX0dVQVJELFxuICAgIEJVSUxUX0lOXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9MZXhpY2FsU3RydWN0dXJlLmh0bWwjSUQ0MThcbiAgY29uc3QgT1BFUkFUT1JfR1VBUkQgPSB7XG4gICAgLy8gUHJldmVudCAtPiBmcm9tIGJlaW5nIGhpZ2hsaWdodGluZyBhcyBhbiBvcGVyYXRvci5cbiAgICBtYXRjaDogLy0+LyxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgT1BFUkFUT1IgPSB7XG4gICAgY2xhc3NOYW1lOiAnb3BlcmF0b3InLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBtYXRjaDogb3BlcmF0b3IgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gZG90LW9wZXJhdG9yOiBvbmx5IG9wZXJhdG9ycyB0aGF0IHN0YXJ0IHdpdGggYSBkb3QgYXJlIGFsbG93ZWQgdG8gdXNlIGRvdHMgYXNcbiAgICAgICAgLy8gY2hhcmFjdGVycyAoLi4uLCAuLi48LCAuKiwgZXRjKS4gU28gdGhlcmUgcnVsZSBoZXJlIGlzOiBhIGRvdCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZVxuICAgICAgICAvLyBjaGFyYWN0ZXJzIHRoYXQgbWF5IGFsc28gaW5jbHVkZSBkb3RzLlxuICAgICAgICBtYXRjaDogYFxcXFwuKFxcXFwufCR7b3BlcmF0b3JDaGFyYWN0ZXJ9KStgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IE9QRVJBVE9SUyA9IFtcbiAgICBPUEVSQVRPUl9HVUFSRCxcbiAgICBPUEVSQVRPUlxuICBdO1xuXG4gIC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9SZWZlcmVuY2VNYW51YWwvTGV4aWNhbFN0cnVjdHVyZS5odG1sI2dyYW1tYXJfbnVtZXJpYy1saXRlcmFsXG4gIC8vIFRPRE86IFVwZGF0ZSBmb3IgbGVhZGluZyBgLWAgYWZ0ZXIgbG9va2JlaGluZCBpcyBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICBjb25zdCBkZWNpbWFsRGlnaXRzID0gJyhbMC05XV8qKSsnO1xuICBjb25zdCBoZXhEaWdpdHMgPSAnKFswLTlhLWZBLUZdXyopKyc7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gZGVjaW1hbCBmbG9hdGluZy1wb2ludC1saXRlcmFsIChzdWJzdW1lcyBkZWNpbWFsLWxpdGVyYWwpXG4gICAgICB7IG1hdGNoOiBgXFxcXGIoJHtkZWNpbWFsRGlnaXRzfSkoXFxcXC4oJHtkZWNpbWFsRGlnaXRzfSkpP2AgKyBgKFtlRV1bKy1dPygke2RlY2ltYWxEaWdpdHN9KSk/XFxcXGJgIH0sXG4gICAgICAvLyBoZXhhZGVjaW1hbCBmbG9hdGluZy1wb2ludC1saXRlcmFsIChzdWJzdW1lcyBoZXhhZGVjaW1hbC1saXRlcmFsKVxuICAgICAgeyBtYXRjaDogYFxcXFxiMHgoJHtoZXhEaWdpdHN9KShcXFxcLigke2hleERpZ2l0c30pKT9gICsgYChbcFBdWystXT8oJHtkZWNpbWFsRGlnaXRzfSkpP1xcXFxiYCB9LFxuICAgICAgLy8gb2N0YWwtbGl0ZXJhbFxuICAgICAgeyBtYXRjaDogL1xcYjBvKFswLTddXyopK1xcYi8gfSxcbiAgICAgIC8vIGJpbmFyeS1saXRlcmFsXG4gICAgICB7IG1hdGNoOiAvXFxiMGIoWzAxXV8qKStcXGIvIH1cbiAgICBdXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9MZXhpY2FsU3RydWN0dXJlLmh0bWwjZ3JhbW1hcl9zdHJpbmctbGl0ZXJhbFxuICBjb25zdCBFU0NBUEVEX0NIQVJBQ1RFUiA9IChyYXdEZWxpbWl0ZXIgPSBcIlwiKSA9PiAoe1xuICAgIGNsYXNzTmFtZTogJ3N1YnN0JyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBtYXRjaDogY29uY2F0KC9cXFxcLywgcmF3RGVsaW1pdGVyLCAvWzBcXFxcdG5yXCInXS8pIH0sXG4gICAgICB7IG1hdGNoOiBjb25jYXQoL1xcXFwvLCByYXdEZWxpbWl0ZXIsIC91XFx7WzAtOWEtZkEtRl17MSw4fVxcfS8pIH1cbiAgICBdXG4gIH0pO1xuICBjb25zdCBFU0NBUEVEX05FV0xJTkUgPSAocmF3RGVsaW1pdGVyID0gXCJcIikgPT4gKHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgbWF0Y2g6IGNvbmNhdCgvXFxcXC8sIHJhd0RlbGltaXRlciwgL1tcXHQgXSooPzpbXFxyXFxuXXxcXHJcXG4pLylcbiAgfSk7XG4gIGNvbnN0IElOVEVSUE9MQVRJT04gPSAocmF3RGVsaW1pdGVyID0gXCJcIikgPT4gKHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgbGFiZWw6IFwiaW50ZXJwb2xcIixcbiAgICBiZWdpbjogY29uY2F0KC9cXFxcLywgcmF3RGVsaW1pdGVyLCAvXFwoLyksXG4gICAgZW5kOiAvXFwpL1xuICB9KTtcbiAgY29uc3QgTVVMVElMSU5FX1NUUklORyA9IChyYXdEZWxpbWl0ZXIgPSBcIlwiKSA9PiAoe1xuICAgIGJlZ2luOiBjb25jYXQocmF3RGVsaW1pdGVyLCAvXCJcIlwiLyksXG4gICAgZW5kOiBjb25jYXQoL1wiXCJcIi8sIHJhd0RlbGltaXRlciksXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEVTQ0FQRURfQ0hBUkFDVEVSKHJhd0RlbGltaXRlciksXG4gICAgICBFU0NBUEVEX05FV0xJTkUocmF3RGVsaW1pdGVyKSxcbiAgICAgIElOVEVSUE9MQVRJT04ocmF3RGVsaW1pdGVyKVxuICAgIF1cbiAgfSk7XG4gIGNvbnN0IFNJTkdMRV9MSU5FX1NUUklORyA9IChyYXdEZWxpbWl0ZXIgPSBcIlwiKSA9PiAoe1xuICAgIGJlZ2luOiBjb25jYXQocmF3RGVsaW1pdGVyLCAvXCIvKSxcbiAgICBlbmQ6IGNvbmNhdCgvXCIvLCByYXdEZWxpbWl0ZXIpLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBFU0NBUEVEX0NIQVJBQ1RFUihyYXdEZWxpbWl0ZXIpLFxuICAgICAgSU5URVJQT0xBVElPTihyYXdEZWxpbWl0ZXIpXG4gICAgXVxuICB9KTtcbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIE1VTFRJTElORV9TVFJJTkcoKSxcbiAgICAgIE1VTFRJTElORV9TVFJJTkcoXCIjXCIpLFxuICAgICAgTVVMVElMSU5FX1NUUklORyhcIiMjXCIpLFxuICAgICAgTVVMVElMSU5FX1NUUklORyhcIiMjI1wiKSxcbiAgICAgIFNJTkdMRV9MSU5FX1NUUklORygpLFxuICAgICAgU0lOR0xFX0xJTkVfU1RSSU5HKFwiI1wiKSxcbiAgICAgIFNJTkdMRV9MSU5FX1NUUklORyhcIiMjXCIpLFxuICAgICAgU0lOR0xFX0xJTkVfU1RSSU5HKFwiIyMjXCIpXG4gICAgXVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9SZWZlcmVuY2VNYW51YWwvTGV4aWNhbFN0cnVjdHVyZS5odG1sI0lENDEyXG4gIGNvbnN0IFFVT1RFRF9JREVOVElGSUVSID0geyBtYXRjaDogY29uY2F0KC9gLywgaWRlbnRpZmllciwgL2AvKSB9O1xuICBjb25zdCBJTVBMSUNJVF9QQVJBTUVURVIgPSB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIG1hdGNoOiAvXFwkXFxkKy9cbiAgfTtcbiAgY29uc3QgUFJPUEVSVFlfV1JBUFBFUl9QUk9KRUNUSU9OID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICBtYXRjaDogYFxcXFwkJHtpZGVudGlmaWVyQ2hhcmFjdGVyfStgXG4gIH07XG4gIGNvbnN0IElERU5USUZJRVJTID0gW1xuICAgIFFVT1RFRF9JREVOVElGSUVSLFxuICAgIElNUExJQ0lUX1BBUkFNRVRFUixcbiAgICBQUk9QRVJUWV9XUkFQUEVSX1BST0pFQ1RJT05cbiAgXTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0F0dHJpYnV0ZXMuaHRtbFxuICBjb25zdCBBVkFJTEFCTEVfQVRUUklCVVRFID0ge1xuICAgIG1hdGNoOiAvKEB8Iyh1bik/KWF2YWlsYWJsZS8sXG4gICAgY2xhc3NOYW1lOiBcImtleXdvcmRcIixcbiAgICBzdGFydHM6IHsgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICBrZXl3b3JkczogYXZhaWxhYmlsaXR5S2V5d29yZHMsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgLi4uT1BFUkFUT1JTLFxuICAgICAgICAgIE5VTUJFUixcbiAgICAgICAgICBTVFJJTkdcbiAgICAgICAgXVxuICAgICAgfVxuICAgIF0gfVxuICB9O1xuICBjb25zdCBLRVlXT1JEX0FUVFJJQlVURSA9IHtcbiAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICBtYXRjaDogY29uY2F0KC9ALywgZWl0aGVyKC4uLmtleXdvcmRBdHRyaWJ1dGVzKSlcbiAgfTtcbiAgY29uc3QgVVNFUl9ERUZJTkVEX0FUVFJJQlVURSA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBtYXRjaDogY29uY2F0KC9ALywgaWRlbnRpZmllcilcbiAgfTtcbiAgY29uc3QgQVRUUklCVVRFUyA9IFtcbiAgICBBVkFJTEFCTEVfQVRUUklCVVRFLFxuICAgIEtFWVdPUkRfQVRUUklCVVRFLFxuICAgIFVTRVJfREVGSU5FRF9BVFRSSUJVVEVcbiAgXTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL1R5cGVzLmh0bWxcbiAgY29uc3QgVFlQRSA9IHtcbiAgICBtYXRjaDogbG9va2FoZWFkKC9cXGJbQS1aXS8pLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogW1xuICAgICAgeyAvLyBDb21tb24gQXBwbGUgZnJhbWV3b3JrcywgZm9yIHJlbGV2YW5jZSBib29zdFxuICAgICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgICAgbWF0Y2g6IGNvbmNhdCgvKEFWfENBfENGfENHfENJfENMfENNfENOfENUfE1LfE1QfE1US3xNVEx8TlN8U0NOfFNLfFVJfFdLfFhDKS8sIGlkZW50aWZpZXJDaGFyYWN0ZXIsICcrJylcbiAgICAgIH0sXG4gICAgICB7IC8vIFR5cGUgaWRlbnRpZmllclxuICAgICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgICAgbWF0Y2g6IHR5cGVJZGVudGlmaWVyLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7IC8vIE9wdGlvbmFsIHR5cGVcbiAgICAgICAgbWF0Y2g6IC9bPyFdKy8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHsgLy8gVmFyaWFkaWMgcGFyYW1ldGVyXG4gICAgICAgIG1hdGNoOiAvXFwuXFwuXFwuLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgeyAvLyBQcm90b2NvbCBjb21wb3NpdGlvblxuICAgICAgICBtYXRjaDogY29uY2F0KC9cXHMrJlxccysvLCBsb29rYWhlYWQodHlwZUlkZW50aWZpZXIpKSxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBHRU5FUklDX0FSR1VNRU5UUyA9IHtcbiAgICBiZWdpbjogLzwvLFxuICAgIGVuZDogLz4vLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBjb250YWluczogW1xuICAgICAgLi4uQ09NTUVOVFMsXG4gICAgICAuLi5LRVlXT1JEX01PREVTLFxuICAgICAgLi4uQVRUUklCVVRFUyxcbiAgICAgIE9QRVJBVE9SX0dVQVJELFxuICAgICAgVFlQRVxuICAgIF1cbiAgfTtcbiAgVFlQRS5jb250YWlucy5wdXNoKEdFTkVSSUNfQVJHVU1FTlRTKTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0V4cHJlc3Npb25zLmh0bWwjSUQ1NTJcbiAgLy8gUHJldmVudHMgZWxlbWVudCBuYW1lcyBmcm9tIGJlaW5nIGhpZ2hsaWdodGVkIGFzIGtleXdvcmRzLlxuICBjb25zdCBUVVBMRV9FTEVNRU5UX05BTUUgPSB7XG4gICAgbWF0Y2g6IGNvbmNhdChpZGVudGlmaWVyLCAvXFxzKjovKSxcbiAgICBrZXl3b3JkczogXCJffDBcIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgLy8gTWF0Y2hlcyB0dXBsZXMgYXMgd2VsbCBhcyB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgYSBmdW5jdGlvbiB0eXBlLlxuICBjb25zdCBUVVBMRSA9IHtcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICAnc2VsZicsXG4gICAgICBUVVBMRV9FTEVNRU5UX05BTUUsXG4gICAgICAuLi5DT01NRU5UUyxcbiAgICAgIC4uLktFWVdPUkRfTU9ERVMsXG4gICAgICAuLi5CVUlMVF9JTlMsXG4gICAgICAuLi5PUEVSQVRPUlMsXG4gICAgICBOVU1CRVIsXG4gICAgICBTVFJJTkcsXG4gICAgICAuLi5JREVOVElGSUVSUyxcbiAgICAgIC4uLkFUVFJJQlVURVMsXG4gICAgICBUWVBFXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IEdFTkVSSUNfUEFSQU1FVEVSUyA9IHtcbiAgICBiZWdpbjogLzwvLFxuICAgIGVuZDogLz4vLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICAuLi5DT01NRU5UUyxcbiAgICAgIFRZUEVcbiAgICBdXG4gIH07XG4gIGNvbnN0IEZVTkNUSU9OX1BBUkFNRVRFUl9OQU1FID0ge1xuICAgIGJlZ2luOiBlaXRoZXIoXG4gICAgICBsb29rYWhlYWQoY29uY2F0KGlkZW50aWZpZXIsIC9cXHMqOi8pKSxcbiAgICAgIGxvb2thaGVhZChjb25jYXQoaWRlbnRpZmllciwgL1xccysvLCBpZGVudGlmaWVyLCAvXFxzKjovKSlcbiAgICApLFxuICAgIGVuZDogLzovLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICAgICAgbWF0Y2g6IC9cXGJfXFxiL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgbWF0Y2g6IGlkZW50aWZpZXJcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IEZVTkNUSU9OX1BBUkFNRVRFUlMgPSB7XG4gICAgYmVnaW46IC9cXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBGVU5DVElPTl9QQVJBTUVURVJfTkFNRSxcbiAgICAgIC4uLkNPTU1FTlRTLFxuICAgICAgLi4uS0VZV09SRF9NT0RFUyxcbiAgICAgIC4uLk9QRVJBVE9SUyxcbiAgICAgIE5VTUJFUixcbiAgICAgIFNUUklORyxcbiAgICAgIC4uLkFUVFJJQlVURVMsXG4gICAgICBUWVBFLFxuICAgICAgVFVQTEVcbiAgICBdLFxuICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgaWxsZWdhbDogL1tcIiddL1xuICB9O1xuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0RlY2xhcmF0aW9ucy5odG1sI0lEMzYyXG4gIGNvbnN0IEZVTkNUSU9OID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvZnVuYy8sXG4gICAgICAvXFxzKy8sXG4gICAgICBlaXRoZXIoUVVPVEVEX0lERU5USUZJRVIubWF0Y2gsIGlkZW50aWZpZXIsIG9wZXJhdG9yKVxuICAgIF0sXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEdFTkVSSUNfUEFSQU1FVEVSUyxcbiAgICAgIEZVTkNUSU9OX1BBUkFNRVRFUlMsXG4gICAgICBXSElURVNQQUNFXG4gICAgXSxcbiAgICBpbGxlZ2FsOiBbXG4gICAgICAvXFxbLyxcbiAgICAgIC8lL1xuICAgIF1cbiAgfTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0RlY2xhcmF0aW9ucy5odG1sI0lEMzc1XG4gIC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9SZWZlcmVuY2VNYW51YWwvRGVjbGFyYXRpb25zLmh0bWwjSUQzNzlcbiAgY29uc3QgSU5JVF9TVUJTQ1JJUFQgPSB7XG4gICAgbWF0Y2g6IFtcbiAgICAgIC9cXGIoPzpzdWJzY3JpcHR8aW5pdFs/IV0/KS8sXG4gICAgICAvXFxzKig/PVs8KF0pLyxcbiAgICBdLFxuICAgIGNsYXNzTmFtZTogeyAxOiBcImtleXdvcmRcIiB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBHRU5FUklDX1BBUkFNRVRFUlMsXG4gICAgICBGVU5DVElPTl9QQVJBTUVURVJTLFxuICAgICAgV0hJVEVTUEFDRVxuICAgIF0sXG4gICAgaWxsZWdhbDogL1xcW3wlL1xuICB9O1xuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0RlY2xhcmF0aW9ucy5odG1sI0lEMzgwXG4gIGNvbnN0IE9QRVJBVE9SX0RFQ0xBUkFUSU9OID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvb3BlcmF0b3IvLFxuICAgICAgL1xccysvLFxuICAgICAgb3BlcmF0b3JcbiAgICBdLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlXCJcbiAgICB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9EZWNsYXJhdGlvbnMuaHRtbCNJRDU1MFxuICBjb25zdCBQUkVDRURFTkNFR1JPVVAgPSB7XG4gICAgYmVnaW46IFtcbiAgICAgIC9wcmVjZWRlbmNlZ3JvdXAvLFxuICAgICAgL1xccysvLFxuICAgICAgdHlwZUlkZW50aWZpZXJcbiAgICBdLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlXCJcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbIFRZUEUgXSxcbiAgICBrZXl3b3JkczogW1xuICAgICAgLi4ucHJlY2VkZW5jZWdyb3VwS2V5d29yZHMsXG4gICAgICAuLi5saXRlcmFsc1xuICAgIF0sXG4gICAgZW5kOiAvfS9cbiAgfTtcblxuICAvLyBBZGQgc3VwcG9ydGVkIHN1Ym1vZGVzIHRvIHN0cmluZyBpbnRlcnBvbGF0aW9uLlxuICBmb3IgKGNvbnN0IHZhcmlhbnQgb2YgU1RSSU5HLnZhcmlhbnRzKSB7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IHZhcmlhbnQuY29udGFpbnMuZmluZChtb2RlID0+IG1vZGUubGFiZWwgPT09IFwiaW50ZXJwb2xcIik7XG4gICAgLy8gVE9ETzogSW50ZXJwb2xhdGlvbiBjYW4gY29udGFpbiBhbnkgZXhwcmVzc2lvbiwgc28gdGhlcmUncyByb29tIGZvciBpbXByb3ZlbWVudCBoZXJlLlxuICAgIGludGVycG9sYXRpb24ua2V5d29yZHMgPSBLRVlXT1JEUztcbiAgICBjb25zdCBzdWJtb2RlcyA9IFtcbiAgICAgIC4uLktFWVdPUkRfTU9ERVMsXG4gICAgICAuLi5CVUlMVF9JTlMsXG4gICAgICAuLi5PUEVSQVRPUlMsXG4gICAgICBOVU1CRVIsXG4gICAgICBTVFJJTkcsXG4gICAgICAuLi5JREVOVElGSUVSU1xuICAgIF07XG4gICAgaW50ZXJwb2xhdGlvbi5jb250YWlucyA9IFtcbiAgICAgIC4uLnN1Ym1vZGVzLFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgJ3NlbGYnLFxuICAgICAgICAgIC4uLnN1Ym1vZGVzXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnU3dpZnQnLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBjb250YWluczogW1xuICAgICAgLi4uQ09NTUVOVFMsXG4gICAgICBGVU5DVElPTixcbiAgICAgIElOSVRfU1VCU0NSSVBULFxuICAgICAge1xuICAgICAgICBiZWdpbktleXdvcmRzOiAnc3RydWN0IHByb3RvY29sIGNsYXNzIGV4dGVuc2lvbiBlbnVtIGFjdG9yJyxcbiAgICAgICAgZW5kOiAnXFxcXHsnLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuVElUTEVfTU9ERSwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICAgICAgICBiZWdpbjogL1tBLVphLXokX11bXFx1MDBDMC1cXHUwMkI4MC05QS1aYS16JF9dKi9cbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5LRVlXT1JEX01PREVTXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBPUEVSQVRPUl9ERUNMQVJBVElPTixcbiAgICAgIFBSRUNFREVOQ0VHUk9VUCxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ2ltcG9ydCcsXG4gICAgICAgIGVuZDogLyQvLFxuICAgICAgICBjb250YWluczogWyAuLi5DT01NRU5UUyBdLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICAuLi5LRVlXT1JEX01PREVTLFxuICAgICAgLi4uQlVJTFRfSU5TLFxuICAgICAgLi4uT1BFUkFUT1JTLFxuICAgICAgTlVNQkVSLFxuICAgICAgU1RSSU5HLFxuICAgICAgLi4uSURFTlRJRklFUlMsXG4gICAgICAuLi5BVFRSSUJVVEVTLFxuICAgICAgVFlQRSxcbiAgICAgIFRVUExFXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBzd2lmdCBhcyBkZWZhdWx0IH07XG4iLCAiY29uc3QgSURFTlRfUkUgPSAnW0EtWmEteiRfXVswLTlBLVphLXokX10qJztcbmNvbnN0IEtFWVdPUkRTID0gW1xuICBcImFzXCIsIC8vIGZvciBleHBvcnRzXG4gIFwiaW5cIixcbiAgXCJvZlwiLFxuICBcImlmXCIsXG4gIFwiZm9yXCIsXG4gIFwid2hpbGVcIixcbiAgXCJmaW5hbGx5XCIsXG4gIFwidmFyXCIsXG4gIFwibmV3XCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJkb1wiLFxuICBcInJldHVyblwiLFxuICBcInZvaWRcIixcbiAgXCJlbHNlXCIsXG4gIFwiYnJlYWtcIixcbiAgXCJjYXRjaFwiLFxuICBcImluc3RhbmNlb2ZcIixcbiAgXCJ3aXRoXCIsXG4gIFwidGhyb3dcIixcbiAgXCJjYXNlXCIsXG4gIFwiZGVmYXVsdFwiLFxuICBcInRyeVwiLFxuICBcInN3aXRjaFwiLFxuICBcImNvbnRpbnVlXCIsXG4gIFwidHlwZW9mXCIsXG4gIFwiZGVsZXRlXCIsXG4gIFwibGV0XCIsXG4gIFwieWllbGRcIixcbiAgXCJjb25zdFwiLFxuICBcImNsYXNzXCIsXG4gIC8vIEpTIGhhbmRsZXMgdGhlc2Ugd2l0aCBhIHNwZWNpYWwgcnVsZVxuICAvLyBcImdldFwiLFxuICAvLyBcInNldFwiLFxuICBcImRlYnVnZ2VyXCIsXG4gIFwiYXN5bmNcIixcbiAgXCJhd2FpdFwiLFxuICBcInN0YXRpY1wiLFxuICBcImltcG9ydFwiLFxuICBcImZyb21cIixcbiAgXCJleHBvcnRcIixcbiAgXCJleHRlbmRzXCJcbl07XG5jb25zdCBMSVRFUkFMUyA9IFtcbiAgXCJ0cnVlXCIsXG4gIFwiZmFsc2VcIixcbiAgXCJudWxsXCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwiTmFOXCIsXG4gIFwiSW5maW5pdHlcIlxuXTtcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHNcbmNvbnN0IFRZUEVTID0gW1xuICAvLyBGdW5kYW1lbnRhbCBvYmplY3RzXG4gIFwiT2JqZWN0XCIsXG4gIFwiRnVuY3Rpb25cIixcbiAgXCJCb29sZWFuXCIsXG4gIFwiU3ltYm9sXCIsXG4gIC8vIG51bWJlcnMgYW5kIGRhdGVzXG4gIFwiTWF0aFwiLFxuICBcIkRhdGVcIixcbiAgXCJOdW1iZXJcIixcbiAgXCJCaWdJbnRcIixcbiAgLy8gdGV4dFxuICBcIlN0cmluZ1wiLFxuICBcIlJlZ0V4cFwiLFxuICAvLyBJbmRleGVkIGNvbGxlY3Rpb25zXG4gIFwiQXJyYXlcIixcbiAgXCJGbG9hdDMyQXJyYXlcIixcbiAgXCJGbG9hdDY0QXJyYXlcIixcbiAgXCJJbnQ4QXJyYXlcIixcbiAgXCJVaW50OEFycmF5XCIsXG4gIFwiVWludDhDbGFtcGVkQXJyYXlcIixcbiAgXCJJbnQxNkFycmF5XCIsXG4gIFwiSW50MzJBcnJheVwiLFxuICBcIlVpbnQxNkFycmF5XCIsXG4gIFwiVWludDMyQXJyYXlcIixcbiAgXCJCaWdJbnQ2NEFycmF5XCIsXG4gIFwiQmlnVWludDY0QXJyYXlcIixcbiAgLy8gS2V5ZWQgY29sbGVjdGlvbnNcbiAgXCJTZXRcIixcbiAgXCJNYXBcIixcbiAgXCJXZWFrU2V0XCIsXG4gIFwiV2Vha01hcFwiLFxuICAvLyBTdHJ1Y3R1cmVkIGRhdGFcbiAgXCJBcnJheUJ1ZmZlclwiLFxuICBcIlNoYXJlZEFycmF5QnVmZmVyXCIsXG4gIFwiQXRvbWljc1wiLFxuICBcIkRhdGFWaWV3XCIsXG4gIFwiSlNPTlwiLFxuICAvLyBDb250cm9sIGFic3RyYWN0aW9uIG9iamVjdHNcbiAgXCJQcm9taXNlXCIsXG4gIFwiR2VuZXJhdG9yXCIsXG4gIFwiR2VuZXJhdG9yRnVuY3Rpb25cIixcbiAgXCJBc3luY0Z1bmN0aW9uXCIsXG4gIC8vIFJlZmxlY3Rpb25cbiAgXCJSZWZsZWN0XCIsXG4gIFwiUHJveHlcIixcbiAgLy8gSW50ZXJuYXRpb25hbGl6YXRpb25cbiAgXCJJbnRsXCIsXG4gIC8vIFdlYkFzc2VtYmx5XG4gIFwiV2ViQXNzZW1ibHlcIlxuXTtcblxuY29uc3QgRVJST1JfVFlQRVMgPSBbXG4gIFwiRXJyb3JcIixcbiAgXCJFdmFsRXJyb3JcIixcbiAgXCJJbnRlcm5hbEVycm9yXCIsXG4gIFwiUmFuZ2VFcnJvclwiLFxuICBcIlJlZmVyZW5jZUVycm9yXCIsXG4gIFwiU3ludGF4RXJyb3JcIixcbiAgXCJUeXBlRXJyb3JcIixcbiAgXCJVUklFcnJvclwiXG5dO1xuXG5jb25zdCBCVUlMVF9JTl9HTE9CQUxTID0gW1xuICBcInNldEludGVydmFsXCIsXG4gIFwic2V0VGltZW91dFwiLFxuICBcImNsZWFySW50ZXJ2YWxcIixcbiAgXCJjbGVhclRpbWVvdXRcIixcblxuICBcInJlcXVpcmVcIixcbiAgXCJleHBvcnRzXCIsXG5cbiAgXCJldmFsXCIsXG4gIFwiaXNGaW5pdGVcIixcbiAgXCJpc05hTlwiLFxuICBcInBhcnNlRmxvYXRcIixcbiAgXCJwYXJzZUludFwiLFxuICBcImRlY29kZVVSSVwiLFxuICBcImRlY29kZVVSSUNvbXBvbmVudFwiLFxuICBcImVuY29kZVVSSVwiLFxuICBcImVuY29kZVVSSUNvbXBvbmVudFwiLFxuICBcImVzY2FwZVwiLFxuICBcInVuZXNjYXBlXCJcbl07XG5cbmNvbnN0IEJVSUxUX0lOX1ZBUklBQkxFUyA9IFtcbiAgXCJhcmd1bWVudHNcIixcbiAgXCJ0aGlzXCIsXG4gIFwic3VwZXJcIixcbiAgXCJjb25zb2xlXCIsXG4gIFwid2luZG93XCIsXG4gIFwiZG9jdW1lbnRcIixcbiAgXCJsb2NhbFN0b3JhZ2VcIixcbiAgXCJzZXNzaW9uU3RvcmFnZVwiLFxuICBcIm1vZHVsZVwiLFxuICBcImdsb2JhbFwiIC8vIE5vZGUuanNcbl07XG5cbmNvbnN0IEJVSUxUX0lOUyA9IFtdLmNvbmNhdChcbiAgQlVJTFRfSU5fR0xPQkFMUyxcbiAgVFlQRVMsXG4gIEVSUk9SX1RZUEVTXG4pO1xuXG4vKlxuTGFuZ3VhZ2U6IEphdmFTY3JpcHRcbkRlc2NyaXB0aW9uOiBKYXZhU2NyaXB0IChKUykgaXMgYSBsaWdodHdlaWdodCwgaW50ZXJwcmV0ZWQsIG9yIGp1c3QtaW4tdGltZSBjb21waWxlZCBwcm9ncmFtbWluZyBsYW5ndWFnZSB3aXRoIGZpcnN0LWNsYXNzIGZ1bmN0aW9ucy5cbkNhdGVnb3J5OiBjb21tb24sIHNjcmlwdGluZywgd2ViXG5XZWJzaXRlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0XG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gamF2YXNjcmlwdChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RyaW5nIGxpa2UgXCI8Qm9vZ2VyXCIgYW5kIGNoZWNrcyB0byBzZWVcbiAgICogaWYgd2UgY2FuIGZpbmQgYSBtYXRjaGluZyBcIjwvQm9vZ2VyXCIgbGF0ZXIgaW4gdGhlXG4gICAqIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2hcbiAgICogQHBhcmFtIHt7YWZ0ZXI6bnVtYmVyfX0gcGFyYW0xXG4gICAqL1xuICBjb25zdCBoYXNDbG9zaW5nVGFnID0gKG1hdGNoLCB7IGFmdGVyIH0pID0+IHtcbiAgICBjb25zdCB0YWcgPSBcIjwvXCIgKyBtYXRjaFswXS5zbGljZSgxKTtcbiAgICBjb25zdCBwb3MgPSBtYXRjaC5pbnB1dC5pbmRleE9mKHRhZywgYWZ0ZXIpO1xuICAgIHJldHVybiBwb3MgIT09IC0xO1xuICB9O1xuXG4gIGNvbnN0IElERU5UX1JFJDEgPSBJREVOVF9SRTtcbiAgY29uc3QgRlJBR01FTlQgPSB7XG4gICAgYmVnaW46ICc8PicsXG4gICAgZW5kOiAnPC8+J1xuICB9O1xuICAvLyB0byBhdm9pZCBzb21lIHNwZWNpYWwgY2FzZXMgaW5zaWRlIGlzVHJ1bHlPcGVuaW5nVGFnXG4gIGNvbnN0IFhNTF9TRUxGX0NMT1NJTkcgPSAvPFtBLVphLXowLTlcXFxcLl86LV0rXFxzKlxcLz4vO1xuICBjb25zdCBYTUxfVEFHID0ge1xuICAgIGJlZ2luOiAvPFtBLVphLXowLTlcXFxcLl86LV0rLyxcbiAgICBlbmQ6IC9cXC9bQS1aYS16MC05XFxcXC5fOi1dKz58XFwvPi8sXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICAgICAqIEBwYXJhbSB7Q2FsbGJhY2tSZXNwb25zZX0gcmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc1RydWx5T3BlbmluZ1RhZzogKG1hdGNoLCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgYWZ0ZXJNYXRjaEluZGV4ID0gbWF0Y2hbMF0ubGVuZ3RoICsgbWF0Y2guaW5kZXg7XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IG1hdGNoLmlucHV0W2FmdGVyTWF0Y2hJbmRleF07XG4gICAgICBpZiAoXG4gICAgICAgIC8vIEhUTUwgc2hvdWxkIG5vdCBpbmNsdWRlIGFub3RoZXIgcmF3IGA8YCBpbnNpZGUgYSB0YWdcbiAgICAgICAgLy8gbmVzdGVkIHR5cGU/XG4gICAgICAgIC8vIGA8QXJyYXk8QXJyYXk8bnVtYmVyPj5gLCBldGMuXG4gICAgICAgIG5leHRDaGFyID09PSBcIjxcIiB8fFxuICAgICAgICAvLyB0aGUgLCBnaXZlcyBhd2F5IHRoYXQgdGhpcyBpcyBub3QgSFRNTFxuICAgICAgICAvLyBgPFQsIEEgZXh0ZW5kcyBrZXlvZiBULCBWPmBcbiAgICAgICAgbmV4dENoYXIgPT09IFwiLFwiXG4gICAgICAgICkge1xuICAgICAgICByZXNwb25zZS5pZ25vcmVNYXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGA8c29tZXRoaW5nPmBcbiAgICAgIC8vIFF1aXRlIHBvc3NpYmx5IGEgdGFnLCBsZXRzIGxvb2sgZm9yIGEgbWF0Y2hpbmcgY2xvc2luZyB0YWcuLi5cbiAgICAgIGlmIChuZXh0Q2hhciA9PT0gXCI+XCIpIHtcbiAgICAgICAgLy8gaWYgd2UgY2Fubm90IGZpbmQgYSBtYXRjaGluZyBjbG9zaW5nIHRhZywgdGhlbiB3ZVxuICAgICAgICAvLyB3aWxsIGlnbm9yZSBpdFxuICAgICAgICBpZiAoIWhhc0Nsb3NpbmdUYWcobWF0Y2gsIHsgYWZ0ZXI6IGFmdGVyTWF0Y2hJbmRleCB9KSkge1xuICAgICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYDxibGFoIC8+YCAoc2VsZi1jbG9zaW5nKVxuICAgICAgLy8gaGFuZGxlZCBieSBzaW1wbGVTZWxmQ2xvc2luZyBydWxlXG5cbiAgICAgIGxldCBtO1xuICAgICAgY29uc3QgYWZ0ZXJNYXRjaCA9IG1hdGNoLmlucHV0LnN1YnN0cmluZyhhZnRlck1hdGNoSW5kZXgpO1xuXG4gICAgICAvLyBzb21lIG1vcmUgdGVtcGxhdGUgdHlwaW5nIHN0dWZmXG4gICAgICAvLyAgPFQgPSBhbnk+KGtleT86IHN0cmluZykgPT4gTW9kaWZ5PFxuICAgICAgaWYgKChtID0gYWZ0ZXJNYXRjaC5tYXRjaCgvXlxccyo9LykpKSB7XG4gICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYDxGcm9tIGV4dGVuZHMgc3RyaW5nPmBcbiAgICAgIC8vIHRlY2huaWNhbGx5IHRoaXMgY291bGQgYmUgSFRNTCwgYnV0IGl0IHNtZWxscyBsaWtlIGEgdHlwZVxuICAgICAgLy8gTk9URTogVGhpcyBpcyB1Z2gsIGJ1dCBhZGRlZCBzcGVjaWZpY2FsbHkgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzMyNzZcbiAgICAgIGlmICgobSA9IGFmdGVyTWF0Y2gubWF0Y2goL15cXHMrZXh0ZW5kc1xccysvKSkpIHtcbiAgICAgICAgaWYgKG0uaW5kZXggPT09IDApIHtcbiAgICAgICAgICByZXNwb25zZS5pZ25vcmVNYXRjaCgpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLXJldHVyblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgS0VZV09SRFMkMSA9IHtcbiAgICAkcGF0dGVybjogSURFTlRfUkUsXG4gICAga2V5d29yZDogS0VZV09SRFMsXG4gICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgYnVpbHRfaW46IEJVSUxUX0lOUyxcbiAgICBcInZhcmlhYmxlLmxhbmd1YWdlXCI6IEJVSUxUX0lOX1ZBUklBQkxFU1xuICB9O1xuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtbnVtZXJpYy1saXRlcmFsc1xuICBjb25zdCBkZWNpbWFsRGlnaXRzID0gJ1swLTldKF8/WzAtOV0pKic7XG4gIGNvbnN0IGZyYWMgPSBgXFxcXC4oJHtkZWNpbWFsRGlnaXRzfSlgO1xuICAvLyBEZWNpbWFsSW50ZWdlckxpdGVyYWwsIGluY2x1ZGluZyBBbm5leCBCIE5vbk9jdGFsRGVjaW1hbEludGVnZXJMaXRlcmFsXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWRkaXRpb25hbC1zeW50YXgtbnVtZXJpYy1saXRlcmFsc1xuICBjb25zdCBkZWNpbWFsSW50ZWdlciA9IGAwfFsxLTldKF8/WzAtOV0pKnwwWzAtN10qWzg5XVswLTldKmA7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICAvLyBEZWNpbWFsTGl0ZXJhbFxuICAgICAgeyBiZWdpbjogYChcXFxcYigke2RlY2ltYWxJbnRlZ2VyfSkoKCR7ZnJhY30pfFxcXFwuKT98KCR7ZnJhY30pKWAgK1xuICAgICAgICBgW2VFXVsrLV0/KCR7ZGVjaW1hbERpZ2l0c30pXFxcXGJgIH0sXG4gICAgICB7IGJlZ2luOiBgXFxcXGIoJHtkZWNpbWFsSW50ZWdlcn0pXFxcXGIoKCR7ZnJhY30pXFxcXGJ8XFxcXC4pP3woJHtmcmFjfSlcXFxcYmAgfSxcblxuICAgICAgLy8gRGVjaW1hbEJpZ0ludGVnZXJMaXRlcmFsXG4gICAgICB7IGJlZ2luOiBgXFxcXGIoMHxbMS05XShfP1swLTldKSopblxcXFxiYCB9LFxuXG4gICAgICAvLyBOb25EZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwW3hYXVswLTlhLWZBLUZdKF8/WzAtOWEtZkEtRl0pKm4/XFxcXGJcIiB9LFxuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbYkJdWzAtMV0oXz9bMC0xXSkqbj9cXFxcYlwiIH0sXG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFtvT11bMC03XShfP1swLTddKSpuP1xcXFxiXCIgfSxcblxuICAgICAgLy8gTGVnYWN5T2N0YWxJbnRlZ2VyTGl0ZXJhbCAoZG9lcyBub3QgaW5jbHVkZSB1bmRlcnNjb3JlIHNlcGFyYXRvcnMpXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFkZGl0aW9uYWwtc3ludGF4LW51bWVyaWMtbGl0ZXJhbHNcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwWzAtN10rbj9cXFxcYlwiIH0sXG4gICAgXSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46ICdcXFxcJFxcXFx7JyxcbiAgICBlbmQ6ICdcXFxcfScsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTJDEsXG4gICAgY29udGFpbnM6IFtdIC8vIGRlZmluZWQgbGF0ZXJcbiAgfTtcbiAgY29uc3QgSFRNTF9URU1QTEFURSA9IHtcbiAgICBiZWdpbjogJ2h0bWxgJyxcbiAgICBlbmQ6ICcnLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnYCcsXG4gICAgICByZXR1cm5FbmQ6IGZhbHNlLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICBTVUJTVFxuICAgICAgXSxcbiAgICAgIHN1Ykxhbmd1YWdlOiAneG1sJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgQ1NTX1RFTVBMQVRFID0ge1xuICAgIGJlZ2luOiAnY3NzYCcsXG4gICAgZW5kOiAnJyxcbiAgICBzdGFydHM6IHtcbiAgICAgIGVuZDogJ2AnLFxuICAgICAgcmV0dXJuRW5kOiBmYWxzZSxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgICAgU1VCU1RcbiAgICAgIF0sXG4gICAgICBzdWJMYW5ndWFnZTogJ2NzcydcbiAgICB9XG4gIH07XG4gIGNvbnN0IEdSQVBIUUxfVEVNUExBVEUgPSB7XG4gICAgYmVnaW46ICdncWxgJyxcbiAgICBlbmQ6ICcnLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnYCcsXG4gICAgICByZXR1cm5FbmQ6IGZhbHNlLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICBTVUJTVFxuICAgICAgXSxcbiAgICAgIHN1Ykxhbmd1YWdlOiAnZ3JhcGhxbCdcbiAgICB9XG4gIH07XG4gIGNvbnN0IFRFTVBMQVRFX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAnYCcsXG4gICAgZW5kOiAnYCcsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgIFNVQlNUXG4gICAgXVxuICB9O1xuICBjb25zdCBKU0RPQ19DT01NRU5UID0gaGxqcy5DT01NRU5UKFxuICAgIC9cXC9cXCpcXCooPyFcXC8pLyxcbiAgICAnXFxcXCovJyxcbiAgICB7XG4gICAgICByZWxldmFuY2U6IDAsXG4gICAgICBjb250YWluczogW1xuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICcoPz1AW0EtWmEtel0rKScsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICAgICAgICAgIGJlZ2luOiAnQFtBLVphLXpdKydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgICAgICAgICAgICBiZWdpbjogJ1xcXFx7JyxcbiAgICAgICAgICAgICAgZW5kOiAnXFxcXH0nLFxuICAgICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICBiZWdpbjogSURFTlRfUkUkMSArICcoPz1cXFxccyooLSl8JCknLFxuICAgICAgICAgICAgICBlbmRzUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBlYXQgc3BhY2VzIChub3QgbmV3bGluZXMpIHNvIHdlIGNhbiBmaW5kXG4gICAgICAgICAgICAvLyB0eXBlcyBvciB2YXJpYWJsZXNcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYmVnaW46IC8oPz1bXlxcbl0pXFxzLyxcbiAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICApO1xuICBjb25zdCBDT01NRU5UID0ge1xuICAgIGNsYXNzTmFtZTogXCJjb21tZW50XCIsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIEpTRE9DX0NPTU1FTlQsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFXG4gICAgXVxuICB9O1xuICBjb25zdCBTVUJTVF9JTlRFUk5BTFMgPSBbXG4gICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgSFRNTF9URU1QTEFURSxcbiAgICBDU1NfVEVNUExBVEUsXG4gICAgR1JBUEhRTF9URU1QTEFURSxcbiAgICBURU1QTEFURV9TVFJJTkcsXG4gICAgLy8gU2tpcCBudW1iZXJzIHdoZW4gdGhleSBhcmUgcGFydCBvZiBhIHZhcmlhYmxlIG5hbWVcbiAgICB7IG1hdGNoOiAvXFwkXFxkKy8gfSxcbiAgICBOVU1CRVIsXG4gICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbDpcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzI4OFxuICAgIC8vIGhsanMuUkVHRVhQX01PREVcbiAgXTtcbiAgU1VCU1QuY29udGFpbnMgPSBTVUJTVF9JTlRFUk5BTFNcbiAgICAuY29uY2F0KHtcbiAgICAgIC8vIHdlIG5lZWQgdG8gcGFpciB1cCB7fSBpbnNpZGUgb3VyIHN1YnN0IHRvIHByZXZlbnRcbiAgICAgIC8vIGl0IGZyb20gZW5kaW5nIHRvbyBlYXJseSBieSBtYXRjaGluZyBhbm90aGVyIH1cbiAgICAgIGJlZ2luOiAvXFx7LyxcbiAgICAgIGVuZDogL1xcfS8sXG4gICAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIFwic2VsZlwiXG4gICAgICBdLmNvbmNhdChTVUJTVF9JTlRFUk5BTFMpXG4gICAgfSk7XG4gIGNvbnN0IFNVQlNUX0FORF9DT01NRU5UUyA9IFtdLmNvbmNhdChDT01NRU5ULCBTVUJTVC5jb250YWlucyk7XG4gIGNvbnN0IFBBUkFNU19DT05UQUlOUyA9IFNVQlNUX0FORF9DT01NRU5UUy5jb25jYXQoW1xuICAgIC8vIGVhdCByZWN1cnNpdmUgcGFyZW5zIGluIHN1YiBleHByZXNzaW9uc1xuICAgIHtcbiAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgIGVuZDogL1xcKS8sXG4gICAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICAgIGNvbnRhaW5zOiBbXCJzZWxmXCJdLmNvbmNhdChTVUJTVF9BTkRfQ09NTUVOVFMpXG4gICAgfVxuICBdKTtcbiAgY29uc3QgUEFSQU1TID0ge1xuICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgYmVnaW46IC9cXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTJDEsXG4gICAgY29udGFpbnM6IFBBUkFNU19DT05UQUlOU1xuICB9O1xuXG4gIC8vIEVTNiBjbGFzc2VzXG4gIGNvbnN0IENMQVNTX09SX0VYVEVORFMgPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIC8vIGNsYXNzIENhciBleHRlbmRzIHZlaGljbGVcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY2xhc3MvLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBJREVOVF9SRSQxLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICAvZXh0ZW5kcy8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIHJlZ2V4LmNvbmNhdChJREVOVF9SRSQxLCBcIihcIiwgcmVnZXguY29uY2F0KC9cXC4vLCBJREVOVF9SRSQxKSwgXCIpKlwiKVxuICAgICAgICBdLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidGl0bGUuY2xhc3NcIixcbiAgICAgICAgICA1OiBcImtleXdvcmRcIixcbiAgICAgICAgICA3OiBcInRpdGxlLmNsYXNzLmluaGVyaXRlZFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBjbGFzcyBDYXJcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY2xhc3MvLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBJREVOVF9SRSQxXG4gICAgICAgIF0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5jbGFzc1wiXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICBdXG4gIH07XG5cbiAgY29uc3QgQ0xBU1NfUkVGRVJFTkNFID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBtYXRjaDpcbiAgICByZWdleC5laXRoZXIoXG4gICAgICAvLyBIYXJkIGNvZGVkIGV4Y2VwdGlvbnNcbiAgICAgIC9cXGJKU09OLyxcbiAgICAgIC8vIEZsb2F0MzJBcnJheSwgT3V0VFxuICAgICAgL1xcYltBLVpdW2Etel0rKFtBLVpdW2Etel0qfFxcZCkqLyxcbiAgICAgIC8vIENTU0ZhY3RvcnksIENTU0ZhY3RvcnlUXG4gICAgICAvXFxiW0EtWl17Mix9KFtBLVpdW2Etel0rfFxcZCkrKFtBLVpdW2Etel0qKSovLFxuICAgICAgLy8gRlBzLCBGUHNUXG4gICAgICAvXFxiW0EtWl17Mix9W2Etel0rKFtBLVpdW2Etel0rfFxcZCkqKFtBLVpdW2Etel0qKSovLFxuICAgICAgLy8gUFxuICAgICAgLy8gc2luZ2xlIGxldHRlcnMgYXJlIG5vdCBoaWdobGlnaHRlZFxuICAgICAgLy8gQkxBSFxuICAgICAgLy8gdGhpcyB3aWxsIGJlIGZsYWdnZWQgYXMgYSBVUFBFUl9DQVNFX0NPTlNUQU5UIGluc3RlYWRcbiAgICApLFxuICAgIGNsYXNzTmFtZTogXCJ0aXRsZS5jbGFzc1wiLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICBfOiBbXG4gICAgICAgIC8vIHNlIHdlIHN0aWxsIGdldCByZWxldmFuY2UgY3JlZGl0IGZvciBKUyBsaWJyYXJ5IGNsYXNzZXNcbiAgICAgICAgLi4uVFlQRVMsXG4gICAgICAgIC4uLkVSUk9SX1RZUEVTXG4gICAgICBdXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFVTRV9TVFJJQ1QgPSB7XG4gICAgbGFiZWw6IFwidXNlX3N0cmljdFwiLFxuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIHJlbGV2YW5jZTogMTAsXG4gICAgYmVnaW46IC9eXFxzKlsnXCJddXNlIChzdHJpY3R8YXNtKVsnXCJdL1xuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX0RFRklOSVRJT04gPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvZnVuY3Rpb24vLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBJREVOVF9SRSQxLFxuICAgICAgICAgIC8oPz1cXHMqXFwoKS9cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIC8vIGFub255bW91cyBmdW5jdGlvblxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9mdW5jdGlvbi8sXG4gICAgICAgICAgL1xccyooPz1cXCgpL1xuICAgICAgICBdXG4gICAgICB9XG4gICAgXSxcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgfSxcbiAgICBsYWJlbDogXCJmdW5jLmRlZlwiLFxuICAgIGNvbnRhaW5zOiBbIFBBUkFNUyBdLFxuICAgIGlsbGVnYWw6IC8lL1xuICB9O1xuXG4gIGNvbnN0IFVQUEVSX0NBU0VfQ09OU1RBTlQgPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOiAvXFxiW0EtWl1bQS1aXzAtOV0rXFxiLyxcbiAgICBjbGFzc05hbWU6IFwidmFyaWFibGUuY29uc3RhbnRcIlxuICB9O1xuXG4gIGZ1bmN0aW9uIG5vbmVPZihsaXN0KSB7XG4gICAgcmV0dXJuIHJlZ2V4LmNvbmNhdChcIig/IVwiLCBsaXN0LmpvaW4oXCJ8XCIpLCBcIilcIik7XG4gIH1cblxuICBjb25zdCBGVU5DVElPTl9DQUxMID0ge1xuICAgIG1hdGNoOiByZWdleC5jb25jYXQoXG4gICAgICAvXFxiLyxcbiAgICAgIG5vbmVPZihbXG4gICAgICAgIC4uLkJVSUxUX0lOX0dMT0JBTFMsXG4gICAgICAgIFwic3VwZXJcIixcbiAgICAgICAgXCJpbXBvcnRcIlxuICAgICAgXSksXG4gICAgICBJREVOVF9SRSQxLCByZWdleC5sb29rYWhlYWQoL1xcKC8pKSxcbiAgICBjbGFzc05hbWU6IFwidGl0bGUuZnVuY3Rpb25cIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBQUk9QRVJUWV9BQ0NFU1MgPSB7XG4gICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvXFwuLywgcmVnZXgubG9va2FoZWFkKFxuICAgICAgcmVnZXguY29uY2F0KElERU5UX1JFJDEsIC8oPyFbMC05QS1aYS16JF8oXSkvKVxuICAgICkpLFxuICAgIGVuZDogSURFTlRfUkUkMSxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAga2V5d29yZHM6IFwicHJvdG90eXBlXCIsXG4gICAgY2xhc3NOYW1lOiBcInByb3BlcnR5XCIsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgR0VUVEVSX09SX1NFVFRFUiA9IHtcbiAgICBtYXRjaDogW1xuICAgICAgL2dldHxzZXQvLFxuICAgICAgL1xccysvLFxuICAgICAgSURFTlRfUkUkMSxcbiAgICAgIC8oPz1cXCgpL1xuICAgIF0sXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gZWF0IHRvIGF2b2lkIGVtcHR5IHBhcmFtc1xuICAgICAgICBiZWdpbjogL1xcKFxcKS9cbiAgICAgIH0sXG4gICAgICBQQVJBTVNcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgRlVOQ19MRUFEX0lOX1JFID0gJyhcXFxcKCcgK1xuICAgICdbXigpXSooXFxcXCgnICtcbiAgICAnW14oKV0qKFxcXFwoJyArXG4gICAgJ1teKCldKicgK1xuICAgICdcXFxcKVteKCldKikqJyArXG4gICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAnXFxcXCl8JyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICcpXFxcXHMqPT4nO1xuXG4gIGNvbnN0IEZVTkNUSU9OX1ZBUklBQkxFID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvY29uc3R8dmFyfGxldC8sIC9cXHMrLyxcbiAgICAgIElERU5UX1JFJDEsIC9cXHMqLyxcbiAgICAgIC89XFxzKi8sXG4gICAgICAvKGFzeW5jXFxzKik/LywgLy8gYXN5bmMgaXMgb3B0aW9uYWxcbiAgICAgIHJlZ2V4Lmxvb2thaGVhZChGVU5DX0xFQURfSU5fUkUpXG4gICAgXSxcbiAgICBrZXl3b3JkczogXCJhc3luY1wiLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlLmZ1bmN0aW9uXCJcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBQQVJBTVNcbiAgICBdXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnSmF2YVNjcmlwdCcsXG4gICAgYWxpYXNlczogWydqcycsICdqc3gnLCAnbWpzJywgJ2NqcyddLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgIC8vIHRoaXMgd2lsbCBiZSBleHRlbmRlZCBieSBUeXBlU2NyaXB0XG4gICAgZXhwb3J0czogeyBQQVJBTVNfQ09OVEFJTlMsIENMQVNTX1JFRkVSRU5DRSB9LFxuICAgIGlsbGVnYWw6IC8jKD8hWyRfQS16XSkvLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLlNIRUJBTkcoe1xuICAgICAgICBsYWJlbDogXCJzaGViYW5nXCIsXG4gICAgICAgIGJpbmFyeTogXCJub2RlXCIsXG4gICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgfSksXG4gICAgICBVU0VfU1RSSUNULFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIEhUTUxfVEVNUExBVEUsXG4gICAgICBDU1NfVEVNUExBVEUsXG4gICAgICBHUkFQSFFMX1RFTVBMQVRFLFxuICAgICAgVEVNUExBVEVfU1RSSU5HLFxuICAgICAgQ09NTUVOVCxcbiAgICAgIC8vIFNraXAgbnVtYmVycyB3aGVuIHRoZXkgYXJlIHBhcnQgb2YgYSB2YXJpYWJsZSBuYW1lXG4gICAgICB7IG1hdGNoOiAvXFwkXFxkKy8gfSxcbiAgICAgIE5VTUJFUixcbiAgICAgIENMQVNTX1JFRkVSRU5DRSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnYXR0cicsXG4gICAgICAgIGJlZ2luOiBJREVOVF9SRSQxICsgcmVnZXgubG9va2FoZWFkKCc6JyksXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX1ZBUklBQkxFLFxuICAgICAgeyAvLyBcInZhbHVlXCIgY29udGFpbmVyXG4gICAgICAgIGJlZ2luOiAnKCcgKyBobGpzLlJFX1NUQVJURVJTX1JFICsgJ3xcXFxcYihjYXNlfHJldHVybnx0aHJvdylcXFxcYilcXFxccyonLFxuICAgICAgICBrZXl3b3JkczogJ3JldHVybiB0aHJvdyBjYXNlJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIENPTU1FTlQsXG4gICAgICAgICAgaGxqcy5SRUdFWFBfTU9ERSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNvdW50IHRoZSBwYXJlbnMgdG8gbWFrZSBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgdGhlXG4gICAgICAgICAgICAvLyBjb3JyZWN0IGJvdW5kaW5nICggKSBiZWZvcmUgdGhlID0+LiAgVGhlcmUgY291bGQgYmUgYW55IG51bWJlciBvZlxuICAgICAgICAgICAgLy8gc3ViLWV4cHJlc3Npb25zIGluc2lkZSBhbHNvIHN1cnJvdW5kZWQgYnkgcGFyZW5zLlxuICAgICAgICAgICAgYmVnaW46IEZVTkNfTEVBRF9JTl9SRSxcbiAgICAgICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgZW5kOiAnXFxcXHMqPT4nLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICAgICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgICAgICAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luOiAvXFwoXFxzKlxcKS8sXG4gICAgICAgICAgICAgICAgICAgIHNraXA6IHRydWVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbnM6IFBBUkFNU19DT05UQUlOU1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyAvLyBjb3VsZCBiZSBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIHBhcmFtcyB0byBhIGZ1bmN0aW9uIGNhbGxcbiAgICAgICAgICAgIGJlZ2luOiAvLC8sXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hdGNoOiAvXFxzKy8sXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgLy8gSlNYXG4gICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICB7IGJlZ2luOiBGUkFHTUVOVC5iZWdpbiwgZW5kOiBGUkFHTUVOVC5lbmQgfSxcbiAgICAgICAgICAgICAgeyBtYXRjaDogWE1MX1NFTEZfQ0xPU0lORyB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVnaW46IFhNTF9UQUcuYmVnaW4sXG4gICAgICAgICAgICAgICAgLy8gd2UgY2FyZWZ1bGx5IGNoZWNrIHRoZSBvcGVuaW5nIHRhZyB0byBzZWUgaWYgaXQgdHJ1bHlcbiAgICAgICAgICAgICAgICAvLyBpcyBhIHRhZyBhbmQgbm90IGEgZmFsc2UgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICAnb246YmVnaW4nOiBYTUxfVEFHLmlzVHJ1bHlPcGVuaW5nVGFnLFxuICAgICAgICAgICAgICAgIGVuZDogWE1MX1RBRy5lbmRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHN1Ykxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiZWdpbjogWE1MX1RBRy5iZWdpbixcbiAgICAgICAgICAgICAgICBlbmQ6IFhNTF9UQUcuZW5kLFxuICAgICAgICAgICAgICAgIHNraXA6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IFsnc2VsZiddXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgRlVOQ1RJT05fREVGSU5JVElPTixcbiAgICAgIHtcbiAgICAgICAgLy8gcHJldmVudCB0aGlzIGZyb20gZ2V0dGluZyBzd2FsbG93ZWQgdXAgYnkgZnVuY3Rpb25cbiAgICAgICAgLy8gc2luY2UgdGhleSBhcHBlYXIgXCJmdW5jdGlvbiBsaWtlXCJcbiAgICAgICAgYmVnaW5LZXl3b3JkczogXCJ3aGlsZSBpZiBzd2l0Y2ggY2F0Y2ggZm9yXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIHdlIGhhdmUgdG8gY291bnQgdGhlIHBhcmVucyB0byBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSB0aGUgY29ycmVjdFxuICAgICAgICAvLyBib3VuZGluZyAoICkuICBUaGVyZSBjb3VsZCBiZSBhbnkgbnVtYmVyIG9mIHN1Yi1leHByZXNzaW9ucyBpbnNpZGVcbiAgICAgICAgLy8gYWxzbyBzdXJyb3VuZGVkIGJ5IHBhcmVucy5cbiAgICAgICAgYmVnaW46ICdcXFxcYig/IWZ1bmN0aW9uKScgKyBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgK1xuICAgICAgICAgICdcXFxcKCcgKyAvLyBmaXJzdCBwYXJlbnNcbiAgICAgICAgICAnW14oKV0qKFxcXFwoJyArXG4gICAgICAgICAgICAnW14oKV0qKFxcXFwoJyArXG4gICAgICAgICAgICAgICdbXigpXSonICtcbiAgICAgICAgICAgICdcXFxcKVteKCldKikqJyArXG4gICAgICAgICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAgICAgICAnXFxcXClcXFxccypcXFxceycsIC8vIGVuZCBwYXJlbnNcbiAgICAgICAgcmV0dXJuQmVnaW46dHJ1ZSxcbiAgICAgICAgbGFiZWw6IFwiZnVuYy5kZWZcIixcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBQQVJBTVMsXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuVElUTEVfTU9ERSwgeyBiZWdpbjogSURFTlRfUkUkMSwgY2xhc3NOYW1lOiBcInRpdGxlLmZ1bmN0aW9uXCIgfSlcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIC8vIGNhdGNoIC4uLiBzbyBpdCB3b24ndCB0cmlnZ2VyIHRoZSBwcm9wZXJ0eSBydWxlIGJlbG93XG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAvXFwuXFwuXFwuLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgUFJPUEVSVFlfQUNDRVNTLFxuICAgICAgLy8gaGFjazogcHJldmVudHMgZGV0ZWN0aW9uIG9mIGtleXdvcmRzIGluIHNvbWUgY2lyY3Vtc3RhbmNlc1xuICAgICAgLy8gLmtleXdvcmQoKVxuICAgICAgLy8gJGtleXdvcmQgPSB4XG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAnXFxcXCQnICsgSURFTlRfUkUkMSxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogWyAvXFxiY29uc3RydWN0b3IoPz1cXHMqXFwoKS8gXSxcbiAgICAgICAgY2xhc3NOYW1lOiB7IDE6IFwidGl0bGUuZnVuY3Rpb25cIiB9LFxuICAgICAgICBjb250YWluczogWyBQQVJBTVMgXVxuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX0NBTEwsXG4gICAgICBVUFBFUl9DQVNFX0NPTlNUQU5ULFxuICAgICAgQ0xBU1NfT1JfRVhURU5EUyxcbiAgICAgIEdFVFRFUl9PUl9TRVRURVIsXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAvXFwkWyguXS8gLy8gcmVsZXZhbmNlIGJvb3N0ZXIgZm9yIGEgcGF0dGVybiBjb21tb24gdG8gSlMgbGliczogYCQoc29tZXRoaW5nKWAgYW5kIGAkLnNvbWV0aGluZ2BcbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbi8qXG5MYW5ndWFnZTogVHlwZVNjcmlwdFxuQXV0aG9yOiBQYW51IEhvcnNtYWxhaHRpIDxwYW51LmhvcnNtYWxhaHRpQGlraS5maT5cbkNvbnRyaWJ1dG9yczogSWtlIEt1IDxkZW1wZmlAeWFob28uY29tPlxuRGVzY3JpcHRpb246IFR5cGVTY3JpcHQgaXMgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgSmF2YVNjcmlwdFxuV2Vic2l0ZTogaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnXG5DYXRlZ29yeTogY29tbW9uLCBzY3JpcHRpbmdcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiB0eXBlc2NyaXB0KGhsanMpIHtcbiAgY29uc3QgdHNMYW5ndWFnZSA9IGphdmFzY3JpcHQoaGxqcyk7XG5cbiAgY29uc3QgSURFTlRfUkUkMSA9IElERU5UX1JFO1xuICBjb25zdCBUWVBFUyA9IFtcbiAgICBcImFueVwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwiYmlnaW50XCIsXG4gICAgXCJ1bmtub3duXCJcbiAgXTtcbiAgY29uc3QgTkFNRVNQQUNFID0ge1xuICAgIGJlZ2luS2V5d29yZHM6ICduYW1lc3BhY2UnLFxuICAgIGVuZDogL1xcey8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBjb250YWluczogWyB0c0xhbmd1YWdlLmV4cG9ydHMuQ0xBU1NfUkVGRVJFTkNFIF1cbiAgfTtcbiAgY29uc3QgSU5URVJGQUNFID0ge1xuICAgIGJlZ2luS2V5d29yZHM6ICdpbnRlcmZhY2UnLFxuICAgIGVuZDogL1xcey8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAga2V5d29yZDogJ2ludGVyZmFjZSBleHRlbmRzJyxcbiAgICAgIGJ1aWx0X2luOiBUWVBFU1xuICAgIH0sXG4gICAgY29udGFpbnM6IFsgdHNMYW5ndWFnZS5leHBvcnRzLkNMQVNTX1JFRkVSRU5DRSBdXG4gIH07XG4gIGNvbnN0IFVTRV9TVFJJQ1QgPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgcmVsZXZhbmNlOiAxMCxcbiAgICBiZWdpbjogL15cXHMqWydcIl11c2Ugc3RyaWN0WydcIl0vXG4gIH07XG4gIGNvbnN0IFRTX1NQRUNJRklDX0tFWVdPUkRTID0gW1xuICAgIFwidHlwZVwiLFxuICAgIFwibmFtZXNwYWNlXCIsXG4gICAgXCJpbnRlcmZhY2VcIixcbiAgICBcInB1YmxpY1wiLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJvdGVjdGVkXCIsXG4gICAgXCJpbXBsZW1lbnRzXCIsXG4gICAgXCJkZWNsYXJlXCIsXG4gICAgXCJhYnN0cmFjdFwiLFxuICAgIFwicmVhZG9ubHlcIixcbiAgICBcImVudW1cIixcbiAgICBcIm92ZXJyaWRlXCJcbiAgXTtcbiAgY29uc3QgS0VZV09SRFMkMSA9IHtcbiAgICAkcGF0dGVybjogSURFTlRfUkUsXG4gICAga2V5d29yZDogS0VZV09SRFMuY29uY2F0KFRTX1NQRUNJRklDX0tFWVdPUkRTKSxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TLmNvbmNhdChUWVBFUyksXG4gICAgXCJ2YXJpYWJsZS5sYW5ndWFnZVwiOiBCVUlMVF9JTl9WQVJJQUJMRVNcbiAgfTtcbiAgY29uc3QgREVDT1JBVE9SID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAnQCcgKyBJREVOVF9SRSQxLFxuICB9O1xuXG4gIGNvbnN0IHN3YXBNb2RlID0gKG1vZGUsIGxhYmVsLCByZXBsYWNlbWVudCkgPT4ge1xuICAgIGNvbnN0IGluZHggPSBtb2RlLmNvbnRhaW5zLmZpbmRJbmRleChtID0+IG0ubGFiZWwgPT09IGxhYmVsKTtcbiAgICBpZiAoaW5keCA9PT0gLTEpIHsgdGhyb3cgbmV3IEVycm9yKFwiY2FuIG5vdCBmaW5kIG1vZGUgdG8gcmVwbGFjZVwiKTsgfVxuXG4gICAgbW9kZS5jb250YWlucy5zcGxpY2UoaW5keCwgMSwgcmVwbGFjZW1lbnQpO1xuICB9O1xuXG5cbiAgLy8gdGhpcyBzaG91bGQgdXBkYXRlIGFueXdoZXJlIGtleXdvcmRzIGlzIHVzZWQgc2luY2VcbiAgLy8gaXQgd2lsbCBiZSB0aGUgc2FtZSBhY3R1YWwgSlMgb2JqZWN0XG4gIE9iamVjdC5hc3NpZ24odHNMYW5ndWFnZS5rZXl3b3JkcywgS0VZV09SRFMkMSk7XG5cbiAgdHNMYW5ndWFnZS5leHBvcnRzLlBBUkFNU19DT05UQUlOUy5wdXNoKERFQ09SQVRPUik7XG4gIHRzTGFuZ3VhZ2UuY29udGFpbnMgPSB0c0xhbmd1YWdlLmNvbnRhaW5zLmNvbmNhdChbXG4gICAgREVDT1JBVE9SLFxuICAgIE5BTUVTUEFDRSxcbiAgICBJTlRFUkZBQ0UsXG4gIF0pO1xuXG4gIC8vIFRTIGdldHMgYSBzaW1wbGVyIHNoZWJhbmcgcnVsZSB0aGFuIEpTXG4gIHN3YXBNb2RlKHRzTGFuZ3VhZ2UsIFwic2hlYmFuZ1wiLCBobGpzLlNIRUJBTkcoKSk7XG4gIC8vIEpTIHVzZSBzdHJpY3QgcnVsZSBwdXJwb3NlbHkgZXhjbHVkZXMgYGFzbWAgd2hpY2ggbWFrZXMgbm8gc2Vuc2VcbiAgc3dhcE1vZGUodHNMYW5ndWFnZSwgXCJ1c2Vfc3RyaWN0XCIsIFVTRV9TVFJJQ1QpO1xuXG4gIGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gPSB0c0xhbmd1YWdlLmNvbnRhaW5zLmZpbmQobSA9PiBtLmxhYmVsID09PSBcImZ1bmMuZGVmXCIpO1xuICBmdW5jdGlvbkRlY2xhcmF0aW9uLnJlbGV2YW5jZSA9IDA7IC8vICgpID0+IHt9IGlzIG1vcmUgdHlwaWNhbCBpbiBUeXBlU2NyaXB0XG5cbiAgT2JqZWN0LmFzc2lnbih0c0xhbmd1YWdlLCB7XG4gICAgbmFtZTogJ1R5cGVTY3JpcHQnLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICd0cycsXG4gICAgICAndHN4JyxcbiAgICAgICdtdHMnLFxuICAgICAgJ2N0cydcbiAgICBdXG4gIH0pO1xuXG4gIHJldHVybiB0c0xhbmd1YWdlO1xufVxuXG5leHBvcnQgeyB0eXBlc2NyaXB0IGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFZpc3VhbCBCYXNpYyAuTkVUXG5EZXNjcmlwdGlvbjogVmlzdWFsIEJhc2ljIC5ORVQgKFZCLk5FVCkgaXMgYSBtdWx0aS1wYXJhZGlnbSwgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nIGxhbmd1YWdlLCBpbXBsZW1lbnRlZCBvbiB0aGUgLk5FVCBGcmFtZXdvcmsuXG5BdXRob3JzOiBQb3JlbiBDaGlhbmcgPHJlbi5jaGlhbmdAZ21haWwuY29tPiwgSmFuIFBpbHplclxuV2Vic2l0ZTogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZG90bmV0L3Zpc3VhbC1iYXNpYy9nZXR0aW5nLXN0YXJ0ZWRcbkNhdGVnb3J5OiBjb21tb25cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiB2Ym5ldChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLyoqXG4gICAqIENoYXJhY3RlciBMaXRlcmFsXG4gICAqIEVpdGhlciBhIHNpbmdsZSBjaGFyYWN0ZXIgKFwiYVwiQykgb3IgYW4gZXNjYXBlZCBkb3VibGUgcXVvdGUgKFwiXCJcIlwiQykuXG4gICAqL1xuICBjb25zdCBDSEFSQUNURVIgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBiZWdpbjogL1wiKFwiXCJ8W14vbl0pXCJDXFxiL1xuICB9O1xuXG4gIGNvbnN0IFNUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXCIvLFxuICAgIGVuZDogL1wiLyxcbiAgICBpbGxlZ2FsOiAvXFxuLyxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICAvLyBkb3VibGUgcXVvdGUgZXNjYXBlXG4gICAgICAgIGJlZ2luOiAvXCJcIi8gfVxuICAgIF1cbiAgfTtcblxuICAvKiogRGF0ZSBMaXRlcmFscyBjb25zaXN0IG9mIGEgZGF0ZSwgYSB0aW1lLCBvciBib3RoIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLCBzdXJyb3VuZGVkIGJ5ICMgKi9cbiAgY29uc3QgTU1fRERfWVlZWSA9IC9cXGR7MSwyfVxcL1xcZHsxLDJ9XFwvXFxkezR9LztcbiAgY29uc3QgWVlZWV9NTV9ERCA9IC9cXGR7NH0tXFxkezEsMn0tXFxkezEsMn0vO1xuICBjb25zdCBUSU1FXzEySCA9IC8oXFxkfDFbMDEyXSkoOlxcZCspezAsMn0gKihBTXxQTSkvO1xuICBjb25zdCBUSU1FXzI0SCA9IC9cXGR7MSwyfSg6XFxkezEsMn0pezEsMn0vO1xuICBjb25zdCBEQVRFID0ge1xuICAgIGNsYXNzTmFtZTogJ2xpdGVyYWwnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIC8vICNZWVlZLU1NLUREIyAoSVNPLURhdGUpIG9yICNNL0QvWVlZWSMgKFVTLURhdGUpXG4gICAgICAgIGJlZ2luOiByZWdleC5jb25jYXQoLyMgKi8sIHJlZ2V4LmVpdGhlcihZWVlZX01NX0RELCBNTV9ERF9ZWVlZKSwgLyAqIy8pIH0sXG4gICAgICB7XG4gICAgICAgIC8vICNIOm1tWzpzc10jICgyNGggVGltZSlcbiAgICAgICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvIyAqLywgVElNRV8yNEgsIC8gKiMvKSB9LFxuICAgICAge1xuICAgICAgICAvLyAjaFs6bW1bOnNzXV0gQSMgKDEyaCBUaW1lKVxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KC8jICovLCBUSU1FXzEySCwgLyAqIy8pIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGRhdGUgcGx1cyB0aW1lXG4gICAgICAgIGJlZ2luOiByZWdleC5jb25jYXQoXG4gICAgICAgICAgLyMgKi8sXG4gICAgICAgICAgcmVnZXguZWl0aGVyKFlZWVlfTU1fREQsIE1NX0REX1lZWVkpLFxuICAgICAgICAgIC8gKy8sXG4gICAgICAgICAgcmVnZXguZWl0aGVyKFRJTUVfMTJILCBUSU1FXzI0SCksXG4gICAgICAgICAgLyAqIy9cbiAgICAgICAgKSB9XG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICAvLyBGbG9hdFxuICAgICAgICBiZWdpbjogL1xcYlxcZFtcXGRfXSooKFxcLltcXGRfXSsoRVsrLV0/W1xcZF9dKyk/KXwoRVsrLV0/W1xcZF9dKykpW1JGREAhI10/LyB9LFxuICAgICAge1xuICAgICAgICAvLyBJbnRlZ2VyIChiYXNlIDEwKVxuICAgICAgICBiZWdpbjogL1xcYlxcZFtcXGRfXSooKFU/W1NJTF0pfFslJl0pPy8gfSxcbiAgICAgIHtcbiAgICAgICAgLy8gSW50ZWdlciAoYmFzZSAxNilcbiAgICAgICAgYmVnaW46IC8mSFtcXGRBLUZfXSsoKFU/W1NJTF0pfFslJl0pPy8gfSxcbiAgICAgIHtcbiAgICAgICAgLy8gSW50ZWdlciAoYmFzZSA4KVxuICAgICAgICBiZWdpbjogLyZPWzAtN19dKygoVT9bU0lMXSl8WyUmXSk/LyB9LFxuICAgICAge1xuICAgICAgICAvLyBJbnRlZ2VyIChiYXNlIDIpXG4gICAgICAgIGJlZ2luOiAvJkJbMDFfXSsoKFU/W1NJTF0pfFslJl0pPy8gfVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBMQUJFTCA9IHtcbiAgICBjbGFzc05hbWU6ICdsYWJlbCcsXG4gICAgYmVnaW46IC9eXFx3KzovXG4gIH07XG5cbiAgY29uc3QgRE9DX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoLycnJy8sIC8kLywgeyBjb250YWluczogW1xuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICBiZWdpbjogLzxcXC8/LyxcbiAgICAgIGVuZDogLz4vXG4gICAgfVxuICBdIH0pO1xuXG4gIGNvbnN0IENPTU1FTlQgPSBobGpzLkNPTU1FTlQobnVsbCwgLyQvLCB7IHZhcmlhbnRzOiBbXG4gICAgeyBiZWdpbjogLycvIH0sXG4gICAge1xuICAgICAgLy8gVE9ETzogVXNlIG11bHRpLWNsYXNzIGZvciBsZWFkaW5nIHNwYWNlc1xuICAgICAgYmVnaW46IC8oW1xcdCBdfF4pUkVNKD89XFxzKS8gfVxuICBdIH0pO1xuXG4gIGNvbnN0IERJUkVDVElWRVMgPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgLy8gVE9ETzogVXNlIG11bHRpLWNsYXNzIGZvciBpbmRlbnRhdGlvbiBvbmNlIGF2YWlsYWJsZVxuICAgIGJlZ2luOiAvW1xcdCBdKiMoY29uc3R8ZGlzYWJsZXxlbHNlfGVsc2VpZnxlbmFibGV8ZW5kfGV4dGVybmFsc291cmNlfGlmfHJlZ2lvbilcXGIvLFxuICAgIGVuZDogLyQvLFxuICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6XG4gICAgICAgICdjb25zdCBkaXNhYmxlIGVsc2UgZWxzZWlmIGVuYWJsZSBlbmQgZXh0ZXJuYWxzb3VyY2UgaWYgcmVnaW9uIHRoZW4nIH0sXG4gICAgY29udGFpbnM6IFsgQ09NTUVOVCBdXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVmlzdWFsIEJhc2ljIC5ORVQnLFxuICAgIGFsaWFzZXM6IFsgJ3ZiJyBdLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgY2xhc3NOYW1lQWxpYXNlczogeyBsYWJlbDogJ3N5bWJvbCcgfSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAga2V5d29yZDpcbiAgICAgICAgJ2FkZGhhbmRsZXIgYWxpYXMgYWdncmVnYXRlIGFuc2kgYXMgYXN5bmMgYXNzZW1ibHkgYXV0byBiaW5hcnkgYnkgYnlyZWYgYnl2YWwgJyAvKiBhLWIgKi9cbiAgICAgICAgKyAnY2FsbCBjYXNlIGNhdGNoIGNsYXNzIGNvbXBhcmUgY29uc3QgY29udGludWUgY3VzdG9tIGRlY2xhcmUgZGVmYXVsdCBkZWxlZ2F0ZSBkaW0gZGlzdGluY3QgZG8gJyAvKiBjLWQgKi9cbiAgICAgICAgKyAnZWFjaCBlcXVhbHMgZWxzZSBlbHNlaWYgZW5kIGVudW0gZXJhc2UgZXJyb3IgZXZlbnQgZXhpdCBleHBsaWNpdCBmaW5hbGx5IGZvciBmcmllbmQgZnJvbSBmdW5jdGlvbiAnIC8qIGUtZiAqL1xuICAgICAgICArICdnZXQgZ2xvYmFsIGdvdG8gZ3JvdXAgaGFuZGxlcyBpZiBpbXBsZW1lbnRzIGltcG9ydHMgaW4gaW5oZXJpdHMgaW50ZXJmYWNlIGludG8gaXRlcmF0b3IgJyAvKiBnLWkgKi9cbiAgICAgICAgKyAnam9pbiBrZXkgbGV0IGxpYiBsb29wIG1lIG1pZCBtb2R1bGUgbXVzdGluaGVyaXQgbXVzdG92ZXJyaWRlIG15YmFzZSBteWNsYXNzICcgLyogai1tICovXG4gICAgICAgICsgJ25hbWVzcGFjZSBuYXJyb3dpbmcgbmV3IG5leHQgbm90aW5oZXJpdGFibGUgbm90b3ZlcnJpZGFibGUgJyAvKiBuICovXG4gICAgICAgICsgJ29mIG9mZiBvbiBvcGVyYXRvciBvcHRpb24gb3B0aW9uYWwgb3JkZXIgb3ZlcmxvYWRzIG92ZXJyaWRhYmxlIG92ZXJyaWRlcyAnIC8qIG8gKi9cbiAgICAgICAgKyAncGFyYW1hcnJheSBwYXJ0aWFsIHByZXNlcnZlIHByaXZhdGUgcHJvcGVydHkgcHJvdGVjdGVkIHB1YmxpYyAnIC8qIHAgKi9cbiAgICAgICAgKyAncmFpc2VldmVudCByZWFkb25seSByZWRpbSByZW1vdmVoYW5kbGVyIHJlc3VtZSByZXR1cm4gJyAvKiByICovXG4gICAgICAgICsgJ3NlbGVjdCBzZXQgc2hhZG93cyBzaGFyZWQgc2tpcCBzdGF0aWMgc3RlcCBzdG9wIHN0cnVjdHVyZSBzdHJpY3Qgc3ViIHN5bmNsb2NrICcgLyogcyAqL1xuICAgICAgICArICd0YWtlIHRleHQgdGhlbiB0aHJvdyB0byB0cnkgdW5pY29kZSB1bnRpbCB1c2luZyB3aGVuIHdoZXJlIHdoaWxlIHdpZGVuaW5nIHdpdGggd2l0aGV2ZW50cyB3cml0ZW9ubHkgeWllbGQnIC8qIHQteSAqLyxcbiAgICAgIGJ1aWx0X2luOlxuICAgICAgICAvLyBPcGVyYXRvcnMgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZG90bmV0L3Zpc3VhbC1iYXNpYy9sYW5ndWFnZS1yZWZlcmVuY2Uvb3BlcmF0b3JzXG4gICAgICAgICdhZGRyZXNzb2YgYW5kIGFuZGFsc28gYXdhaXQgZGlyZWN0Y2FzdCBnZXR0eXBlIGdldHhtbG5hbWVzcGFjZSBpcyBpc2ZhbHNlIGlzbm90IGlzdHJ1ZSBsaWtlIG1vZCBuYW1lb2YgbmV3IG5vdCBvciBvcmVsc2UgdHJ5Y2FzdCB0eXBlb2YgeG9yICdcbiAgICAgICAgLy8gVHlwZSBDb252ZXJzaW9uIEZ1bmN0aW9ucyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9kb3RuZXQvdmlzdWFsLWJhc2ljL2xhbmd1YWdlLXJlZmVyZW5jZS9mdW5jdGlvbnMvdHlwZS1jb252ZXJzaW9uLWZ1bmN0aW9uc1xuICAgICAgICArICdjYm9vbCBjYnl0ZSBjY2hhciBjZGF0ZSBjZGJsIGNkZWMgY2ludCBjbG5nIGNvYmogY3NieXRlIGNzaG9ydCBjc25nIGNzdHIgY3VpbnQgY3VsbmcgY3VzaG9ydCcsXG4gICAgICB0eXBlOlxuICAgICAgICAvLyBEYXRhIHR5cGVzIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2RvdG5ldC92aXN1YWwtYmFzaWMvbGFuZ3VhZ2UtcmVmZXJlbmNlL2RhdGEtdHlwZXNcbiAgICAgICAgJ2Jvb2xlYW4gYnl0ZSBjaGFyIGRhdGUgZGVjaW1hbCBkb3VibGUgaW50ZWdlciBsb25nIG9iamVjdCBzYnl0ZSBzaG9ydCBzaW5nbGUgc3RyaW5nIHVpbnRlZ2VyIHVsb25nIHVzaG9ydCcsXG4gICAgICBsaXRlcmFsOiAndHJ1ZSBmYWxzZSBub3RoaW5nJ1xuICAgIH0sXG4gICAgaWxsZWdhbDpcbiAgICAgICcvL3xcXFxce3xcXFxcfXxlbmRpZnxnb3N1Ynx2YXJpYW50fHdlbmR8XlxcXFwkICcgLyogcmVzZXJ2ZWQgZGVwcmVjYXRlZCBrZXl3b3JkcyAqLyxcbiAgICBjb250YWluczogW1xuICAgICAgQ0hBUkFDVEVSLFxuICAgICAgU1RSSU5HLFxuICAgICAgREFURSxcbiAgICAgIE5VTUJFUixcbiAgICAgIExBQkVMLFxuICAgICAgRE9DX0NPTU1FTlQsXG4gICAgICBDT01NRU5ULFxuICAgICAgRElSRUNUSVZFU1xuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgdmJuZXQgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogV2ViQXNzZW1ibHlcbldlYnNpdGU6IGh0dHBzOi8vd2ViYXNzZW1ibHkub3JnXG5EZXNjcmlwdGlvbjogIFdhc20gaXMgZGVzaWduZWQgYXMgYSBwb3J0YWJsZSBjb21waWxhdGlvbiB0YXJnZXQgZm9yIHByb2dyYW1taW5nIGxhbmd1YWdlcywgZW5hYmxpbmcgZGVwbG95bWVudCBvbiB0aGUgd2ViIGZvciBjbGllbnQgYW5kIHNlcnZlciBhcHBsaWNhdGlvbnMuXG5DYXRlZ29yeTogd2ViLCBjb21tb25cbkF1ZGl0OiAyMDIwXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gd2FzbShobGpzKSB7XG4gIGhsanMucmVnZXg7XG4gIGNvbnN0IEJMT0NLX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoL1xcKDsvLCAvO1xcKS8pO1xuICBCTE9DS19DT01NRU5ULmNvbnRhaW5zLnB1c2goXCJzZWxmXCIpO1xuICBjb25zdCBMSU5FX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoLzs7LywgLyQvKTtcblxuICBjb25zdCBLV1MgPSBbXG4gICAgXCJhbnlmdW5jXCIsXG4gICAgXCJibG9ja1wiLFxuICAgIFwiYnJcIixcbiAgICBcImJyX2lmXCIsXG4gICAgXCJicl90YWJsZVwiLFxuICAgIFwiY2FsbFwiLFxuICAgIFwiY2FsbF9pbmRpcmVjdFwiLFxuICAgIFwiZGF0YVwiLFxuICAgIFwiZHJvcFwiLFxuICAgIFwiZWxlbVwiLFxuICAgIFwiZWxzZVwiLFxuICAgIFwiZW5kXCIsXG4gICAgXCJleHBvcnRcIixcbiAgICBcImZ1bmNcIixcbiAgICBcImdsb2JhbC5nZXRcIixcbiAgICBcImdsb2JhbC5zZXRcIixcbiAgICBcImxvY2FsLmdldFwiLFxuICAgIFwibG9jYWwuc2V0XCIsXG4gICAgXCJsb2NhbC50ZWVcIixcbiAgICBcImdldF9nbG9iYWxcIixcbiAgICBcImdldF9sb2NhbFwiLFxuICAgIFwiZ2xvYmFsXCIsXG4gICAgXCJpZlwiLFxuICAgIFwiaW1wb3J0XCIsXG4gICAgXCJsb2NhbFwiLFxuICAgIFwibG9vcFwiLFxuICAgIFwibWVtb3J5XCIsXG4gICAgXCJtZW1vcnkuZ3Jvd1wiLFxuICAgIFwibWVtb3J5LnNpemVcIixcbiAgICBcIm1vZHVsZVwiLFxuICAgIFwibXV0XCIsXG4gICAgXCJub3BcIixcbiAgICBcIm9mZnNldFwiLFxuICAgIFwicGFyYW1cIixcbiAgICBcInJlc3VsdFwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzZWxlY3RcIixcbiAgICBcInNldF9nbG9iYWxcIixcbiAgICBcInNldF9sb2NhbFwiLFxuICAgIFwic3RhcnRcIixcbiAgICBcInRhYmxlXCIsXG4gICAgXCJ0ZWVfbG9jYWxcIixcbiAgICBcInRoZW5cIixcbiAgICBcInR5cGVcIixcbiAgICBcInVucmVhY2hhYmxlXCJcbiAgXTtcblxuICBjb25zdCBGVU5DVElPTl9SRUZFUkVOQ0UgPSB7XG4gICAgYmVnaW46IFtcbiAgICAgIC8oPzpmdW5jfGNhbGx8Y2FsbF9pbmRpcmVjdCkvLFxuICAgICAgL1xccysvLFxuICAgICAgL1xcJFteXFxzKV0rL1xuICAgIF0sXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH1cbiAgfTtcblxuICBjb25zdCBBUkdVTUVOVCA9IHtcbiAgICBjbGFzc05hbWU6IFwidmFyaWFibGVcIixcbiAgICBiZWdpbjogL1xcJFtcXHdfXSsvXG4gIH07XG5cbiAgY29uc3QgUEFSRU5TID0ge1xuICAgIG1hdGNoOiAvKFxcKCg/ITspfFxcKSkrLyxcbiAgICBjbGFzc05hbWU6IFwicHVuY3R1YXRpb25cIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBOVU1CRVIgPSB7XG4gICAgY2xhc3NOYW1lOiBcIm51bWJlclwiLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICAvLyBib3Jyb3dlZCBmcm9tIFByaXNtLCBUT0RPOiBzcGxpdCBvdXQgaW50byB2YXJpYW50c1xuICAgIG1hdGNoOiAvWystXT9cXGIoPzpcXGQoPzpfP1xcZCkqKD86XFwuXFxkKD86Xz9cXGQpKik/KD86W2VFXVsrLV0/XFxkKD86Xz9cXGQpKik/fDB4W1xcZGEtZkEtRl0oPzpfP1tcXGRhLWZBLUZdKSooPzpcXC5bXFxkYS1mQS1GXSg/Ol8/W1xcZGEtZkEtRF0pKik/KD86W3BQXVsrLV0/XFxkKD86Xz9cXGQpKik/KVxcYnxcXGJpbmZcXGJ8XFxibmFuKD86OjB4W1xcZGEtZkEtRl0oPzpfP1tcXGRhLWZBLURdKSopP1xcYi9cbiAgfTtcblxuICBjb25zdCBUWVBFID0ge1xuICAgIC8vIGxvb2stYWhlYWQgcHJldmVudHMgdXMgZnJvbSBnb2JibGluZyB1cCBvcGNvZGVzXG4gICAgbWF0Y2g6IC8oaTMyfGk2NHxmMzJ8ZjY0KSg/IVxcLikvLFxuICAgIGNsYXNzTmFtZTogXCJ0eXBlXCJcbiAgfTtcblxuICBjb25zdCBNQVRIX09QRVJBVElPTlMgPSB7XG4gICAgY2xhc3NOYW1lOiBcImtleXdvcmRcIixcbiAgICAvLyBib3Jyb3dlZCBmcm9tIFByaXNtLCBUT0RPOiBzcGxpdCBvdXQgaW50byB2YXJpYW50c1xuICAgIG1hdGNoOiAvXFxiKGYzMnxmNjR8aTMyfGk2NCkoPzpcXC4oPzphYnN8YWRkfGFuZHxjZWlsfGNsenxjb25zdHxjb252ZXJ0X1tzdV1cXC9pKD86MzJ8NjQpfGNvcHlzaWdufGN0enxkZW1vdGVcXC9mNjR8ZGl2KD86X1tzdV0pP3xlcXo/fGV4dGVuZF9bc3VdXFwvaTMyfGZsb29yfGdlKD86X1tzdV0pP3xndCg/Ol9bc3VdKT98bGUoPzpfW3N1XSk/fGxvYWQoPzooPzo4fDE2fDMyKV9bc3VdKT98bHQoPzpfW3N1XSk/fG1heHxtaW58bXVsfG5lYXJlc3R8bmVnP3xvcnxwb3BjbnR8cHJvbW90ZVxcL2YzMnxyZWludGVycHJldFxcL1tmaV0oPzozMnw2NCl8cmVtX1tzdV18cm90W2xyXXxzaGx8c2hyX1tzdV18c3RvcmUoPzo4fDE2fDMyKT98c3FydHxzdWJ8dHJ1bmMoPzpfW3N1XVxcL2YoPzozMnw2NCkpP3x3cmFwXFwvaTY0fHhvcikpXFxiL1xuICB9O1xuXG4gIGNvbnN0IE9GRlNFVF9BTElHTiA9IHtcbiAgICBtYXRjaDogW1xuICAgICAgLyg/Om9mZnNldHxhbGlnbikvLFxuICAgICAgL1xccyovLFxuICAgICAgLz0vXG4gICAgXSxcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgMzogXCJvcGVyYXRvclwiXG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1dlYkFzc2VtYmx5JyxcbiAgICBrZXl3b3Jkczoge1xuICAgICAgJHBhdHRlcm46IC9bXFx3Ll0rLyxcbiAgICAgIGtleXdvcmQ6IEtXU1xuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIExJTkVfQ09NTUVOVCxcbiAgICAgIEJMT0NLX0NPTU1FTlQsXG4gICAgICBPRkZTRVRfQUxJR04sXG4gICAgICBBUkdVTUVOVCxcbiAgICAgIFBBUkVOUyxcbiAgICAgIEZVTkNUSU9OX1JFRkVSRU5DRSxcbiAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICBUWVBFLFxuICAgICAgTUFUSF9PUEVSQVRJT05TLFxuICAgICAgTlVNQkVSXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyB3YXNtIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IEhUTUwsIFhNTFxuV2Vic2l0ZTogaHR0cHM6Ly93d3cudzMub3JnL1hNTC9cbkNhdGVnb3J5OiBjb21tb24sIHdlYlxuQXVkaXQ6IDIwMjBcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiB4bWwoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIC8vIFhNTCBuYW1lcyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbGV0dGVyczogaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbC8jTlQtTmFtZUNoYXJcbiAgLy8gT1RIRVJfTkFNRV9DSEFSUyA9IC9bOlxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXS87XG4gIC8vIEVsZW1lbnQgbmFtZXMgc3RhcnQgd2l0aCBOQU1FX1NUQVJUX0NIQVIgZm9sbG93ZWQgYnkgb3B0aW9uYWwgb3RoZXIgVW5pY29kZSBsZXR0ZXJzLCBBU0NJSSBkaWdpdHMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBhbmQgcGVyaW9kc1xuICAvLyBjb25zdCBUQUdfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdCgvW0EtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdLywgcmVnZXgub3B0aW9uYWwoL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKjovKSwgL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKi8pOztcbiAgLy8gY29uc3QgWE1MX0lERU5UX1JFID0gL1tBLVpfYS16OlxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSsvO1xuICAvLyBjb25zdCBUQUdfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdCgvW0EtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdLywgcmVnZXgub3B0aW9uYWwoL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKjovKSwgL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKi8pO1xuICAvLyBob3dldmVyLCB0byBjYXRlciBmb3IgcGVyZm9ybWFuY2UgYW5kIG1vcmUgVW5pY29kZSBzdXBwb3J0IHJlbHkgc2ltcGx5IG9uIHRoZSBVbmljb2RlIGxldHRlciBjbGFzc1xuICBjb25zdCBUQUdfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdCgvW1xccHtMfV9dL3UsIHJlZ2V4Lm9wdGlvbmFsKC9bXFxwe0x9MC05Xy4tXSo6L3UpLCAvW1xccHtMfTAtOV8uLV0qL3UpO1xuICBjb25zdCBYTUxfSURFTlRfUkUgPSAvW1xccHtMfTAtOS5fOi1dKy91O1xuICBjb25zdCBYTUxfRU5USVRJRVMgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3ltYm9sJyxcbiAgICBiZWdpbjogLyZbYS16XSs7fCYjWzAtOV0rO3wmI3hbYS1mMC05XSs7L1xuICB9O1xuICBjb25zdCBYTUxfTUVUQV9LRVlXT1JEUyA9IHtcbiAgICBiZWdpbjogL1xccy8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAna2V5d29yZCcsXG4gICAgICAgIGJlZ2luOiAvIz9bYS16X11bYS16MS05Xy1dKy8sXG4gICAgICAgIGlsbGVnYWw6IC9cXG4vXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBYTUxfTUVUQV9QQVJfS0VZV09SRFMgPSBobGpzLmluaGVyaXQoWE1MX01FVEFfS0VZV09SRFMsIHtcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpL1xuICB9KTtcbiAgY29uc3QgQVBPU19NRVRBX1NUUklOR19NT0RFID0gaGxqcy5pbmhlcml0KGhsanMuQVBPU19TVFJJTkdfTU9ERSwgeyBjbGFzc05hbWU6ICdzdHJpbmcnIH0pO1xuICBjb25zdCBRVU9URV9NRVRBX1NUUklOR19NT0RFID0gaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHsgY2xhc3NOYW1lOiAnc3RyaW5nJyB9KTtcbiAgY29uc3QgVEFHX0lOVEVSTkFMUyA9IHtcbiAgICBlbmRzV2l0aFBhcmVudDogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAvPC8sXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2F0dHInLFxuICAgICAgICBiZWdpbjogWE1MX0lERU5UX1JFLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPVxccyovLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVnaW46IC9cIi8sXG4gICAgICAgICAgICAgICAgZW5kOiAvXCIvLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5zOiBbIFhNTF9FTlRJVElFUyBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiZWdpbjogLycvLFxuICAgICAgICAgICAgICAgIGVuZDogLycvLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5zOiBbIFhNTF9FTlRJVElFUyBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgYmVnaW46IC9bXlxcc1wiJz08PmBdKy8gfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnSFRNTCwgWE1MJyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAnaHRtbCcsXG4gICAgICAneGh0bWwnLFxuICAgICAgJ3JzcycsXG4gICAgICAnYXRvbScsXG4gICAgICAneGpiJyxcbiAgICAgICd4c2QnLFxuICAgICAgJ3hzbCcsXG4gICAgICAncGxpc3QnLFxuICAgICAgJ3dzZicsXG4gICAgICAnc3ZnJ1xuICAgIF0sXG4gICAgY2FzZV9pbnNlbnNpdGl2ZTogdHJ1ZSxcbiAgICB1bmljb2RlUmVnZXg6IHRydWUsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAvPCFbYS16XS8sXG4gICAgICAgIGVuZDogLz4vLFxuICAgICAgICByZWxldmFuY2U6IDEwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIFhNTF9NRVRBX0tFWVdPUkRTLFxuICAgICAgICAgIFFVT1RFX01FVEFfU1RSSU5HX01PREUsXG4gICAgICAgICAgQVBPU19NRVRBX1NUUklOR19NT0RFLFxuICAgICAgICAgIFhNTF9NRVRBX1BBUl9LRVlXT1JEUyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xcWy8sXG4gICAgICAgICAgICBlbmQ6IC9cXF0vLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICAgICAgICAgIGJlZ2luOiAvPCFbYS16XS8sXG4gICAgICAgICAgICAgICAgZW5kOiAvPi8sXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgICAgIFhNTF9NRVRBX0tFWVdPUkRTLFxuICAgICAgICAgICAgICAgICAgWE1MX01FVEFfUEFSX0tFWVdPUkRTLFxuICAgICAgICAgICAgICAgICAgUVVPVEVfTUVUQV9TVFJJTkdfTU9ERSxcbiAgICAgICAgICAgICAgICAgIEFQT1NfTUVUQV9TVFJJTkdfTU9ERVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgLzwhLS0vLFxuICAgICAgICAvLS0+LyxcbiAgICAgICAgeyByZWxldmFuY2U6IDEwIH1cbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPCFcXFtDREFUQVxcWy8sXG4gICAgICAgIGVuZDogL1xcXVxcXT4vLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAgWE1MX0VOVElUSUVTLFxuICAgICAgLy8geG1sIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICBlbmQ6IC9cXD8+LyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogLzxcXD94bWwvLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAxMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgIFFVT1RFX01FVEFfU1RSSU5HX01PREVcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAvPFxcP1thLXpdW2EtejAtOV0rLyxcbiAgICAgICAgICB9XG4gICAgICAgIF1cblxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgLypcbiAgICAgICAgVGhlIGxvb2thaGVhZCBwYXR0ZXJuICg/PS4uLikgZW5zdXJlcyB0aGF0ICdiZWdpbicgb25seSBtYXRjaGVzXG4gICAgICAgICc8c3R5bGUnIGFzIGEgc2luZ2xlIHdvcmQsIGZvbGxvd2VkIGJ5IGEgd2hpdGVzcGFjZSBvciBhblxuICAgICAgICBlbmRpbmcgYnJhY2tldC5cbiAgICAgICAgKi9cbiAgICAgICAgYmVnaW46IC88c3R5bGUoPz1cXHN8PikvLFxuICAgICAgICBlbmQ6IC8+LyxcbiAgICAgICAga2V5d29yZHM6IHsgbmFtZTogJ3N0eWxlJyB9LFxuICAgICAgICBjb250YWluczogWyBUQUdfSU5URVJOQUxTIF0sXG4gICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgIGVuZDogLzxcXC9zdHlsZT4vLFxuICAgICAgICAgIHJldHVybkVuZDogdHJ1ZSxcbiAgICAgICAgICBzdWJMYW5ndWFnZTogW1xuICAgICAgICAgICAgJ2NzcycsXG4gICAgICAgICAgICAneG1sJ1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgLy8gU2VlIHRoZSBjb21tZW50IGluIHRoZSA8c3R5bGUgdGFnIGFib3V0IHRoZSBsb29rYWhlYWQgcGF0dGVyblxuICAgICAgICBiZWdpbjogLzxzY3JpcHQoPz1cXHN8PikvLFxuICAgICAgICBlbmQ6IC8+LyxcbiAgICAgICAga2V5d29yZHM6IHsgbmFtZTogJ3NjcmlwdCcgfSxcbiAgICAgICAgY29udGFpbnM6IFsgVEFHX0lOVEVSTkFMUyBdLFxuICAgICAgICBzdGFydHM6IHtcbiAgICAgICAgICBlbmQ6IC88XFwvc2NyaXB0Pi8sXG4gICAgICAgICAgcmV0dXJuRW5kOiB0cnVlLFxuICAgICAgICAgIHN1Ykxhbmd1YWdlOiBbXG4gICAgICAgICAgICAnamF2YXNjcmlwdCcsXG4gICAgICAgICAgICAnaGFuZGxlYmFycycsXG4gICAgICAgICAgICAneG1sJ1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIHdlIG5lZWQgdGhpcyBmb3Igbm93IGZvciBqU1hcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgYmVnaW46IC88Pnw8XFwvPi9cbiAgICAgIH0sXG4gICAgICAvLyBvcGVuIHRhZ1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICd0YWcnLFxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgICAgIC88LyxcbiAgICAgICAgICByZWdleC5sb29rYWhlYWQocmVnZXguY29uY2F0KFxuICAgICAgICAgICAgVEFHX05BTUVfUkUsXG4gICAgICAgICAgICAvLyA8dGFnLz5cbiAgICAgICAgICAgIC8vIDx0YWc+XG4gICAgICAgICAgICAvLyA8dGFnIC4uLlxuICAgICAgICAgICAgcmVnZXguZWl0aGVyKC9cXC8+LywgLz4vLCAvXFxzLylcbiAgICAgICAgICApKVxuICAgICAgICApLFxuICAgICAgICBlbmQ6IC9cXC8/Pi8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAnbmFtZScsXG4gICAgICAgICAgICBiZWdpbjogVEFHX05BTUVfUkUsXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgICBzdGFydHM6IFRBR19JTlRFUk5BTFNcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAvLyBjbG9zZSB0YWdcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgYmVnaW46IHJlZ2V4LmNvbmNhdChcbiAgICAgICAgICAvPFxcLy8sXG4gICAgICAgICAgcmVnZXgubG9va2FoZWFkKHJlZ2V4LmNvbmNhdChcbiAgICAgICAgICAgIFRBR19OQU1FX1JFLCAvPi9cbiAgICAgICAgICApKVxuICAgICAgICApLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ25hbWUnLFxuICAgICAgICAgICAgYmVnaW46IFRBR19OQU1FX1JFLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogLz4vLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgICAgZW5kc1BhcmVudDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgeG1sIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFlBTUxcbkRlc2NyaXB0aW9uOiBZZXQgQW5vdGhlciBNYXJrZG93biBMYW5ndWFnZVxuQXV0aG9yOiBTdGVmYW4gV2llbmVydCA8c3R3aWVuZXJ0QGdtYWlsLmNvbT5cbkNvbnRyaWJ1dG9yczogQ2FybCBCYXh0ZXIgPGNhcmxAY2JheC50ZWNoPlxuUmVxdWlyZXM6IHJ1YnkuanNcbldlYnNpdGU6IGh0dHBzOi8veWFtbC5vcmdcbkNhdGVnb3J5OiBjb21tb24sIGNvbmZpZ1xuKi9cbmZ1bmN0aW9uIHlhbWwoaGxqcykge1xuICBjb25zdCBMSVRFUkFMUyA9ICd0cnVlIGZhbHNlIHllcyBubyBudWxsJztcblxuICAvLyBZQU1MIHNwZWMgYWxsb3dzIG5vbi1yZXNlcnZlZCBVUkkgY2hhcmFjdGVycyBpbiB0YWdzLlxuICBjb25zdCBVUklfQ0hBUkFDVEVSUyA9ICdbXFxcXHcjOy8/OkAmPSskLC5+KlxcJygpW1xcXFxdXSsnO1xuXG4gIC8vIERlZmluZSBrZXlzIGFzIHN0YXJ0aW5nIHdpdGggYSB3b3JkIGNoYXJhY3RlclxuICAvLyAuLi5jb250YWluaW5nIHdvcmQgY2hhcnMsIHNwYWNlcywgY29sb25zLCBmb3J3YXJkLXNsYXNoZXMsIGh5cGhlbnMgYW5kIHBlcmlvZHNcbiAgLy8gLi4uYW5kIGVuZGluZyB3aXRoIGEgY29sb24gZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgYSBzcGFjZSwgdGFiIG9yIG5ld2xpbmUuXG4gIC8vIFRoZSBZQU1MIHNwZWMgYWxsb3dzIGZvciBtdWNoIG1vcmUgdGhhbiB0aGlzLCBidXQgdGhpcyBjb3ZlcnMgbW9zdCB1c2UtY2FzZXMuXG4gIGNvbnN0IEtFWSA9IHtcbiAgICBjbGFzc05hbWU6ICdhdHRyJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogJ1xcXFx3W1xcXFx3IDpcXFxcLy4tXSo6KD89WyBcXHRdfCQpJyB9LFxuICAgICAgeyAvLyBkb3VibGUgcXVvdGVkIGtleXNcbiAgICAgICAgYmVnaW46ICdcIlxcXFx3W1xcXFx3IDpcXFxcLy4tXSpcIjooPz1bIFxcdF18JCknIH0sXG4gICAgICB7IC8vIHNpbmdsZSBxdW90ZWQga2V5c1xuICAgICAgICBiZWdpbjogJ1xcJ1xcXFx3W1xcXFx3IDpcXFxcLy4tXSpcXCc6KD89WyBcXHRdfCQpJyB9XG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IFRFTVBMQVRFX1ZBUklBQkxFUyA9IHtcbiAgICBjbGFzc05hbWU6ICd0ZW1wbGF0ZS12YXJpYWJsZScsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgLy8gamluamEgdGVtcGxhdGVzIEFuc2libGVcbiAgICAgICAgYmVnaW46IC9cXHtcXHsvLFxuICAgICAgICBlbmQ6IC9cXH1cXH0vXG4gICAgICB9LFxuICAgICAgeyAvLyBSdWJ5IGkxOG5cbiAgICAgICAgYmVnaW46IC8lXFx7LyxcbiAgICAgICAgZW5kOiAvXFx9L1xuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJy8sXG4gICAgICAgIGVuZDogLycvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1wiLyxcbiAgICAgICAgZW5kOiAvXCIvXG4gICAgICB9LFxuICAgICAgeyBiZWdpbjogL1xcUysvIH1cbiAgICBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICBURU1QTEFURV9WQVJJQUJMRVNcbiAgICBdXG4gIH07XG5cbiAgLy8gU3RyaW5ncyBpbnNpZGUgb2YgdmFsdWUgY29udGFpbmVycyAob2JqZWN0cykgY2FuJ3QgY29udGFpbiBicmFjZXMsXG4gIC8vIGJyYWNrZXRzLCBvciBjb21tYXNcbiAgY29uc3QgQ09OVEFJTkVSX1NUUklORyA9IGhsanMuaW5oZXJpdChTVFJJTkcsIHsgdmFyaWFudHM6IFtcbiAgICB7XG4gICAgICBiZWdpbjogLycvLFxuICAgICAgZW5kOiAvJy9cbiAgICB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiAvXCIvLFxuICAgICAgZW5kOiAvXCIvXG4gICAgfSxcbiAgICB7IGJlZ2luOiAvW15cXHMse31bXFxdXSsvIH1cbiAgXSB9KTtcblxuICBjb25zdCBEQVRFX1JFID0gJ1swLTldezR9KC1bMC05XVswLTldKXswLDJ9JztcbiAgY29uc3QgVElNRV9SRSA9ICcoW1R0IFxcXFx0XVswLTldWzAtOV0/KDpbMC05XVswLTldKXsyfSk/JztcbiAgY29uc3QgRlJBQ1RJT05fUkUgPSAnKFxcXFwuWzAtOV0qKT8nO1xuICBjb25zdCBaT05FX1JFID0gJyhbIFxcXFx0XSkqKFp8Wy0rXVswLTldWzAtOV0/KDpbMC05XVswLTldKT8pPyc7XG4gIGNvbnN0IFRJTUVTVEFNUCA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIGJlZ2luOiAnXFxcXGInICsgREFURV9SRSArIFRJTUVfUkUgKyBGUkFDVElPTl9SRSArIFpPTkVfUkUgKyAnXFxcXGInXG4gIH07XG5cbiAgY29uc3QgVkFMVUVfQ09OVEFJTkVSID0ge1xuICAgIGVuZDogJywnLFxuICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAga2V5d29yZHM6IExJVEVSQUxTLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuICBjb25zdCBPQkpFQ1QgPSB7XG4gICAgYmVnaW46IC9cXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFsgVkFMVUVfQ09OVEFJTkVSIF0sXG4gICAgaWxsZWdhbDogJ1xcXFxuJyxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgQVJSQVkgPSB7XG4gICAgYmVnaW46ICdcXFxcWycsXG4gICAgZW5kOiAnXFxcXF0nLFxuICAgIGNvbnRhaW5zOiBbIFZBTFVFX0NPTlRBSU5FUiBdLFxuICAgIGlsbGVnYWw6ICdcXFxcbicsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgTU9ERVMgPSBbXG4gICAgS0VZLFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgYmVnaW46ICdeLS0tXFxcXHMqJCcsXG4gICAgICByZWxldmFuY2U6IDEwXG4gICAgfSxcbiAgICB7IC8vIG11bHRpIGxpbmUgc3RyaW5nXG4gICAgICAvLyBCbG9ja3Mgc3RhcnQgd2l0aCBhIHwgb3IgPiBmb2xsb3dlZCBieSBhIG5ld2xpbmVcbiAgICAgIC8vXG4gICAgICAvLyBJbmRlbnRhdGlvbiBvZiBzdWJzZXF1ZW50IGxpbmVzIG11c3QgYmUgdGhlIHNhbWUgdG9cbiAgICAgIC8vIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgYmxvY2tcbiAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICBiZWdpbjogJ1tcXFxcfD5dKFsxLTldP1srLV0pP1sgXSpcXFxcbiggKylbXiBdW15cXFxcbl0qXFxcXG4oXFxcXDJbXlxcXFxuXStcXFxcbj8pKidcbiAgICB9LFxuICAgIHsgLy8gUnVieS9SYWlscyBlcmJcbiAgICAgIGJlZ2luOiAnPCVbJT0tXT8nLFxuICAgICAgZW5kOiAnWyUtXT8lPicsXG4gICAgICBzdWJMYW5ndWFnZTogJ3J1YnknLFxuICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgeyAvLyBuYW1lZCB0YWdzXG4gICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgIGJlZ2luOiAnIVxcXFx3KyEnICsgVVJJX0NIQVJBQ1RFUlNcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8veWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjc4NDA2NFxuICAgIHsgLy8gdmVyYmF0aW0gdGFnc1xuICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICBiZWdpbjogJyE8JyArIFVSSV9DSEFSQUNURVJTICsgXCI+XCJcbiAgICB9LFxuICAgIHsgLy8gcHJpbWFyeSB0YWdzXG4gICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgIGJlZ2luOiAnIScgKyBVUklfQ0hBUkFDVEVSU1xuICAgIH0sXG4gICAgeyAvLyBzZWNvbmRhcnkgdGFnc1xuICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICBiZWdpbjogJyEhJyArIFVSSV9DSEFSQUNURVJTXG4gICAgfSxcbiAgICB7IC8vIGZyYWdtZW50IGlkICZyZWZcbiAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgYmVnaW46ICcmJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICckJ1xuICAgIH0sXG4gICAgeyAvLyBmcmFnbWVudCByZWZlcmVuY2UgKnJlZlxuICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICBiZWdpbjogJ1xcXFwqJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICckJ1xuICAgIH0sXG4gICAgeyAvLyBhcnJheSBsaXN0aW5nXG4gICAgICBjbGFzc05hbWU6ICdidWxsZXQnLFxuICAgICAgLy8gVE9ETzogcmVtb3ZlIHwkIGhhY2sgd2hlbiB3ZSBoYXZlIHByb3BlciBsb29rLWFoZWFkIHN1cHBvcnRcbiAgICAgIGJlZ2luOiAnLSg/PVsgXXwkKScsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIGhsanMuSEFTSF9DT01NRU5UX01PREUsXG4gICAge1xuICAgICAgYmVnaW5LZXl3b3JkczogTElURVJBTFMsXG4gICAgICBrZXl3b3JkczogeyBsaXRlcmFsOiBMSVRFUkFMUyB9XG4gICAgfSxcbiAgICBUSU1FU1RBTVAsXG4gICAgLy8gbnVtYmVycyBhcmUgYW55IHZhbGlkIEMtc3R5bGUgbnVtYmVyIHRoYXRcbiAgICAvLyBzaXQgaXNvbGF0ZWQgZnJvbSBvdGhlciB3b3Jkc1xuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogaGxqcy5DX05VTUJFUl9SRSArICdcXFxcYicsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIE9CSkVDVCxcbiAgICBBUlJBWSxcbiAgICBTVFJJTkdcbiAgXTtcblxuICBjb25zdCBWQUxVRV9NT0RFUyA9IFsgLi4uTU9ERVMgXTtcbiAgVkFMVUVfTU9ERVMucG9wKCk7XG4gIFZBTFVFX01PREVTLnB1c2goQ09OVEFJTkVSX1NUUklORyk7XG4gIFZBTFVFX0NPTlRBSU5FUi5jb250YWlucyA9IFZBTFVFX01PREVTO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1lBTUwnLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgYWxpYXNlczogWyAneW1sJyBdLFxuICAgIGNvbnRhaW5zOiBNT0RFU1xuICB9O1xufVxuXG5leHBvcnQgeyB5YW1sIGFzIGRlZmF1bHQgfTtcbiIsICIvLyBodHRwczovL25vZGVqcy5vcmcvYXBpL3BhY2thZ2VzLmh0bWwjcGFja2FnZXNfd3JpdGluZ19kdWFsX3BhY2thZ2VzX3doaWxlX2F2b2lkaW5nX29yX21pbmltaXppbmdfaGF6YXJkc1xuaW1wb3J0IEhpZ2hsaWdodEpTIGZyb20gJy4uL2xpYi9jb3JlLmpzJztcbmV4cG9ydCB7IEhpZ2hsaWdodEpTIH07XG5leHBvcnQgZGVmYXVsdCBIaWdobGlnaHRKUztcbiIsICIvLyBAdHMtZXhwZWN0LWVycm9yXG5pbXBvcnQgZm9ybWF0dGVyIGZyb20gJ2Zvcm1hdCdcblxuZXhwb3J0IGNvbnN0IGZhdWx0ID0gT2JqZWN0LmFzc2lnbihjcmVhdGUoRXJyb3IpLCB7XG4gIGV2YWw6IGNyZWF0ZShFdmFsRXJyb3IpLFxuICByYW5nZTogY3JlYXRlKFJhbmdlRXJyb3IpLFxuICByZWZlcmVuY2U6IGNyZWF0ZShSZWZlcmVuY2VFcnJvciksXG4gIHN5bnRheDogY3JlYXRlKFN5bnRheEVycm9yKSxcbiAgdHlwZTogY3JlYXRlKFR5cGVFcnJvciksXG4gIHVyaTogY3JlYXRlKFVSSUVycm9yKVxufSlcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYEVDb25zdHJ1Y3RvcmAsIHdpdGggdGhlIGZvcm1hdHRlZCBgZm9ybWF0YCBhcyBhIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSB7RXJyb3J9IEZhdWx0XG4gKiBAdGVtcGxhdGUge25ldyAocmVhc29uOiBzdHJpbmcpID0+IEZhdWx0fSBDbGFzc1xuICogQHBhcmFtIHtDbGFzc30gQ29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShDb25zdHJ1Y3Rvcikge1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICBGb3JtYXR0ZWRFcnJvci5kaXNwbGF5TmFtZSA9IENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IENvbnN0cnVjdG9yLm5hbWVcblxuICByZXR1cm4gRm9ybWF0dGVkRXJyb3JcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVycm9yIHdpdGggYSBwcmludGYtbGlrZSBmb3JtYXR0ZWQgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gW2Zvcm1hdF1cbiAgICogICBUZW1wbGF0ZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7Li4udW5rbm93bn0gdmFsdWVzXG4gICAqICAgVmFsdWVzIHRvIHJlbmRlciBpbiBgZm9ybWF0YC5cbiAgICogQHJldHVybnMge0ZhdWx0fVxuICAgKi9cbiAgZnVuY3Rpb24gRm9ybWF0dGVkRXJyb3IoZm9ybWF0LCAuLi52YWx1ZXMpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBjb25zdCByZWFzb24gPSBmb3JtYXQgPyBmb3JtYXR0ZXIoZm9ybWF0LCAuLi52YWx1ZXMpIDogZm9ybWF0XG4gICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihyZWFzb24pXG4gIH1cbn1cbiIsICIvKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2hhc3QnKS5UZXh0fSBUZXh0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5IaWdobGlnaHRSZXN1bHR9IEhpZ2hsaWdodFJlc3VsdFxuICogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU09wdGlvbnN9IEhpZ2hsaWdodE9wdGlvbnNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkxhbmd1YWdlRm59IEhpZ2hsaWdodFN5bnRheFxuICogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuRW1pdHRlcn0gSGlnaGxpZ2h0RW1pdHRlclxuICpcbiAqIEB0eXBlZGVmIHt7dHlwZTogJ2VsZW1lbnQnLCB0YWdOYW1lOiAnc3BhbicsIHByb3BlcnRpZXM6IHtjbGFzc05hbWU6IEFycmF5PHN0cmluZz59LCBjaGlsZHJlbjogQXJyYXk8U3BhbnxUZXh0Pn19IFNwYW5cbiAqIEB0eXBlZGVmIHt7dHlwZTogJ3Jvb3QnLCBkYXRhOiB7bGFuZ3VhZ2U6IHN0cmluZ3xudWxsLCByZWxldmFuY2U6IG51bWJlcn0sIGNoaWxkcmVuOiBBcnJheTxTcGFufFRleHQ+fX0gUm9vdFxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dHJhT3B0aW9uc1xuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmc+fSBbc3Vic2V0XVxuICogICBMaXN0IG9mIGFsbG93ZWQgbGFuZ3VhZ2VzLCBkZWZhdWx0cyB0byBhbGwgcmVnaXN0ZXJlZCBsYW5ndWFnZXMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gT3B0aW9uc1xuICogICBDb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcmVmaXg9J2hsanMtJ11cbiAqICAgQ2xhc3MgcHJlZml4LlxuICpcbiAqIEB0eXBlZGVmIHtPcHRpb25zICYgRXh0cmFPcHRpb25zfSBBdXRvT3B0aW9uc1xuICovXG5cbmltcG9ydCBoaWdoIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvY29yZSdcbmltcG9ydCB7ZmF1bHR9IGZyb20gJ2ZhdWx0J1xuXG5jb25zdCBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eVxuXG5jb25zdCBkZWZhdWx0UHJlZml4ID0gJ2hsanMtJ1xuXG4vKipcbiAqIEhpZ2hsaWdodCBgdmFsdWVgIChjb2RlKSBhcyBgbGFuZ3VhZ2VgIChuYW1lKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcbiAqICAgUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogICBDb2RlIHRvIGhpZ2hsaWdodC5cbiAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnM9e31dXG4gKiAgIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7Um9vdH1cbiAqICAgQSBoYXN0IGBSb290YCBub2RlLlxuICovXG5mdW5jdGlvbiBoaWdobGlnaHQobGFuZ3VhZ2UsIHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IHByZWZpeCA9IG9wdGlvbnMucHJlZml4XG5cbiAgaWYgKHR5cGVvZiBsYW5ndWFnZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBmYXVsdCgnRXhwZWN0ZWQgYHN0cmluZ2AgZm9yIG5hbWUsIGdvdCBgJXNgJywgbGFuZ3VhZ2UpXG4gIH1cblxuICBpZiAoIWhpZ2guZ2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpKSB7XG4gICAgdGhyb3cgZmF1bHQoJ1Vua25vd24gbGFuZ3VhZ2U6IGAlc2AgaXMgbm90IHJlZ2lzdGVyZWQnLCBsYW5ndWFnZSlcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgZmF1bHQoJ0V4cGVjdGVkIGBzdHJpbmdgIGZvciB2YWx1ZSwgZ290IGAlc2AnLCB2YWx1ZSlcbiAgfVxuXG4gIGlmIChwcmVmaXggPT09IG51bGwgfHwgcHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICBwcmVmaXggPSBkZWZhdWx0UHJlZml4XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yOiBUeXBlcyBvdXQgb2YgZGF0ZS5cbiAgLy8gU2VlOiA8aHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzYyMSNpc3N1ZWNvbW1lbnQtMTUyODg0MTg4OD5cbiAgaGlnaC5jb25maWd1cmUoe19fZW1pdHRlcjogSGFzdEVtaXR0ZXIsIGNsYXNzUHJlZml4OiBwcmVmaXh9KVxuXG4gIGNvbnN0IHJlc3VsdCA9IC8qKiBAdHlwZSB7SGlnaGxpZ2h0UmVzdWx0ICYge19lbWl0dGVyOiBIYXN0RW1pdHRlcn19ICovIChcbiAgICBoaWdoLmhpZ2hsaWdodCh2YWx1ZSwge2xhbmd1YWdlLCBpZ25vcmVJbGxlZ2FsczogdHJ1ZX0pXG4gIClcblxuICBoaWdoLmNvbmZpZ3VyZSh7fSlcblxuICAvLyBgaGlnaGxpZ2h0LmpzYCBzZWVtcyB0byB1c2UgdGhpcyAoY3VycmVudGx5KSBmb3IgYnJva2VuIGdyYW1tYXJzLCBzbyBsZXRcdTIwMTlzXG4gIC8vIGtlZXAgaXQgaW4gdGhlcmUganVzdCB0byBiZSBzdXJlLlxuICAvKiBjOCBpZ25vcmUgbmV4dCAzICovXG4gIGlmIChyZXN1bHQuZXJyb3JSYWlzZWQpIHtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3JSYWlzZWRcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBsYW5ndWFnZWAgaXMgYWx3YXlzIGRlZmluZWQgaW4gYGhpZ2hsaWdodGAuXG4gIHJlc3VsdC5fZW1pdHRlci5yb290LmRhdGEubGFuZ3VhZ2UgPSByZXN1bHQubGFuZ3VhZ2VcbiAgcmVzdWx0Ll9lbWl0dGVyLnJvb3QuZGF0YS5yZWxldmFuY2UgPSByZXN1bHQucmVsZXZhbmNlXG5cbiAgcmV0dXJuIHJlc3VsdC5fZW1pdHRlci5yb290XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGB2YWx1ZWAgKGNvZGUpIGFuZCBndWVzcyBpdHMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiAgIENvZGUgdG8gaGlnaGxpZ2h0LlxuICogQHBhcmFtIHtBdXRvT3B0aW9uc30gW29wdGlvbnM9e31dXG4gKiAgIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7Um9vdH1cbiAqICAgQSBoYXN0IGBSb290YCBub2RlLlxuICovXG5mdW5jdGlvbiBoaWdobGlnaHRBdXRvKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qgc3Vic2V0ID0gb3B0aW9ucy5zdWJzZXQgfHwgaGlnaC5saXN0TGFuZ3VhZ2VzKClcbiAgbGV0IHByZWZpeCA9IG9wdGlvbnMucHJlZml4XG4gIGxldCBpbmRleCA9IC0xXG4gIC8qKiBAdHlwZSB7Um9vdH0gKi9cbiAgbGV0IHJlc3VsdCA9IHtcbiAgICB0eXBlOiAncm9vdCcsXG4gICAgZGF0YToge2xhbmd1YWdlOiBudWxsLCByZWxldmFuY2U6IDB9LFxuICAgIGNoaWxkcmVuOiBbXVxuICB9XG5cbiAgaWYgKHByZWZpeCA9PT0gbnVsbCB8fCBwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgIHByZWZpeCA9IGRlZmF1bHRQcmVmaXhcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgZmF1bHQoJ0V4cGVjdGVkIGBzdHJpbmdgIGZvciB2YWx1ZSwgZ290IGAlc2AnLCB2YWx1ZSlcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgc3Vic2V0Lmxlbmd0aCkge1xuICAgIGNvbnN0IG5hbWUgPSBzdWJzZXRbaW5kZXhdXG5cbiAgICBpZiAoIWhpZ2guZ2V0TGFuZ3VhZ2UobmFtZSkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBjdXJyZW50ID0gaGlnaGxpZ2h0KG5hbWUsIHZhbHVlLCBvcHRpb25zKVxuXG4gICAgaWYgKGN1cnJlbnQuZGF0YS5yZWxldmFuY2UgPiByZXN1bHQuZGF0YS5yZWxldmFuY2UpIHJlc3VsdCA9IGN1cnJlbnRcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGxhbmd1YWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuICogICBQcm9ncmFtbWluZyBsYW5ndWFnZSBuYW1lLlxuICogQHBhcmFtIHtIaWdobGlnaHRTeW50YXh9IHN5bnRheFxuICogICBgaGlnaGxpZ2h0LmpzYCBsYW5ndWFnZSBzeW50YXguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZSwgc3ludGF4KSB7XG4gIGhpZ2gucmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZSwgc3ludGF4KVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGFsaWFzZXMgZm9yIGFscmVhZHkgcmVnaXN0ZXJlZCBsYW5ndWFnZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nfEFycmF5PHN0cmluZz4+fSBsYW5ndWFnZVxuICogICBQcm9ncmFtbWluZyBsYW5ndWFnZSBuYW1lIG9yIGEgbWFwIG9mIGBsYW5ndWFnZWBzIHRvIGBhbGlhc2BlcyBvciBgbGlzdGBzXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBbYWxpYXNdXG4gKiAgIE5ldyBhbGlhc2VzIGZvciB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcmVnaXN0ZXJBbGlhcyA9XG4gIC8qKlxuICAgKiBAdHlwZSB7KFxuICAgKiAgICgobGFuZ3VhZ2U6IHN0cmluZywgYWxpYXM6IHN0cmluZ3xBcnJheTxzdHJpbmc+KSA9PiB2b2lkKSAmXG4gICAqICAgKChhbGlhc2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8QXJyYXk8c3RyaW5nPj4pID0+IHZvaWQpXG4gICAqICl9XG4gICAqL1xuICAoXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nfEFycmF5PHN0cmluZz4+fSBsYW5ndWFnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz59IFthbGlhc11cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiAobGFuZ3VhZ2UsIGFsaWFzKSB7XG4gICAgICBpZiAodHlwZW9mIGxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBzaG91bGQgYmUgYSBzdHJpbmcgaW4gdGhpcyBvdmVybG9hZC5cbiAgICAgICAgaGlnaC5yZWdpc3RlckFsaWFzZXMoYWxpYXMsIHtsYW5ndWFnZU5hbWU6IGxhbmd1YWdlfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICBsZXQga2V5XG5cbiAgICAgICAgZm9yIChrZXkgaW4gbGFuZ3VhZ2UpIHtcbiAgICAgICAgICBpZiAob3duLmNhbGwobGFuZ3VhZ2UsIGtleSkpIHtcbiAgICAgICAgICAgIGhpZ2gucmVnaXN0ZXJBbGlhc2VzKGxhbmd1YWdlW2tleV0sIHtsYW5ndWFnZU5hbWU6IGtleX0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICApXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhbiBgYWxpYXNgIG9yIGBsYW5ndWFnZWAgaXMgcmVnaXN0ZXJlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWxpYXNPckxhbmd1YWdlXG4gKiAgIE5hbWUgb2YgYSByZWdpc3RlcmVkIGxhbmd1YWdlIG9yIGFsaWFzLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiAgIFdoZXRoZXIgYGFsaWFzT3JsYW5ndWFnZWAgaXMgcmVnaXN0ZXJlZC5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJlZChhbGlhc09yTGFuZ3VhZ2UpIHtcbiAgcmV0dXJuIEJvb2xlYW4oaGlnaC5nZXRMYW5ndWFnZShhbGlhc09yTGFuZ3VhZ2UpKVxufVxuXG4vKipcbiAqIExpc3QgcmVnaXN0ZXJlZCBsYW5ndWFnZXMuXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59XG4gKiAgIE5hbWVzIG9mIHJlZ2lzdGVyZWQgbGFuZ3VhZ2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RMYW5ndWFnZXMoKSB7XG4gIHJldHVybiBoaWdoLmxpc3RMYW5ndWFnZXMoKVxufVxuXG4vKiogQHR5cGUge0hpZ2hsaWdodEVtaXR0ZXJ9ICovXG5jbGFzcyBIYXN0RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0hpZ2hsaWdodE9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAvKiogQHR5cGUge0hpZ2hsaWdodE9wdGlvbnN9ICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIC8qKiBAdHlwZSB7Um9vdH0gKi9cbiAgICB0aGlzLnJvb3QgPSB7XG4gICAgICB0eXBlOiAncm9vdCcsXG4gICAgICBkYXRhOiB7bGFuZ3VhZ2U6IG51bGwsIHJlbGV2YW5jZTogMH0sXG4gICAgICBjaGlsZHJlbjogW11cbiAgICB9XG4gICAgLyoqIEB0eXBlIHtbUm9vdCwgLi4uQXJyYXk8U3Bhbj5dfSAqL1xuICAgIHRoaXMuc3RhY2sgPSBbdGhpcy5yb290XVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKi9cbiAgYWRkVGV4dCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHJldHVyblxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGNvbnN0IHRhaWwgPSBjdXJyZW50LmNoaWxkcmVuW2N1cnJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMV1cblxuICAgIGlmICh0YWlsICYmIHRhaWwudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICB0YWlsLnZhbHVlICs9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnQuY2hpbGRyZW4ucHVzaCh7dHlwZTogJ3RleHQnLCB2YWx1ZX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gcmF3TmFtZVxuICAgKi9cbiAgc3RhcnRTY29wZShyYXdOYW1lKSB7XG4gICAgdGhpcy5vcGVuTm9kZShTdHJpbmcocmF3TmFtZSkpXG4gIH1cblxuICAvKipcbiAgICovXG4gIGVuZFNjb3BlKCkge1xuICAgIHRoaXMuY2xvc2VOb2RlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hhc3RFbWl0dGVyfSBvdGhlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgX19hZGRTdWJsYW5ndWFnZShvdGhlciwgbmFtZSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICBjb25zdCByZXN1bHRzID0gb3RoZXIucm9vdC5jaGlsZHJlblxuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGN1cnJlbnQuY2hpbGRyZW4ucHVzaCh7XG4gICAgICAgIHR5cGU6ICdlbGVtZW50JyxcbiAgICAgICAgdGFnTmFtZTogJ3NwYW4nLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7Y2xhc3NOYW1lOiBbbmFtZV19LFxuICAgICAgICBjaGlsZHJlbjogcmVzdWx0c1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC5jaGlsZHJlbi5wdXNoKC4uLnJlc3VsdHMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBvcGVuTm9kZShuYW1lKSB7XG4gICAgLy8gRmlyc3QgXHUyMDFDY2xhc3NcdTIwMUQgZ2V0cyB0aGUgcHJlZml4LiBSZXN0IGdldHMgYSByZXBlYXRlZCB1bmRlcnNjb3JlIHN1ZmZpeC5cbiAgICAvLyBTZWU6IDxodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2NvbW1pdC81MTgwNmFhPlxuICAgIC8vIFNlZTogPGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vbG93bGlnaHQvaXNzdWVzLzQzPlxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IG5hbWVcbiAgICAgIC5zcGxpdCgnLicpXG4gICAgICAubWFwKChkLCBpKSA9PiAoaSA/IGQgKyAnXycucmVwZWF0KGkpIDogdGhpcy5vcHRpb25zLmNsYXNzUHJlZml4ICsgZCkpXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIC8qKiBAdHlwZSB7U3Bhbn0gKi9cbiAgICBjb25zdCBjaGlsZCA9IHtcbiAgICAgIHR5cGU6ICdlbGVtZW50JyxcbiAgICAgIHRhZ05hbWU6ICdzcGFuJyxcbiAgICAgIHByb3BlcnRpZXM6IHtjbGFzc05hbWV9LFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfVxuXG4gICAgY3VycmVudC5jaGlsZHJlbi5wdXNoKGNoaWxkKVxuICAgIHRoaXMuc3RhY2sucHVzaChjaGlsZClcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgY2xvc2VOb2RlKCkge1xuICAgIHRoaXMuc3RhY2sucG9wKClcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgZmluYWxpemUoKSB7fVxuXG4gIC8qKlxuICAgKi9cbiAgdG9IVE1MKCkge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb3dsaWdodCA9IHtcbiAgaGlnaGxpZ2h0LFxuICBoaWdobGlnaHRBdXRvLFxuICByZWdpc3Rlckxhbmd1YWdlLFxuICByZWdpc3RlcmVkLFxuICBsaXN0TGFuZ3VhZ2VzLFxuICByZWdpc3RlckFsaWFzXG59XG4iLCAiLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhpcyByZWdpc3RlcnMgdHlwZXMgZm9yIHRoZSBsYW5ndWFnZSBmaWxlcy5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvdHlwZXMvaW5kZXguanMnKX0gRG9Ob3RUb2NoSXRSZWdpc3RlcnNMYW5ndWFnZUZpbGVzICovXG5cbmltcG9ydCBhcmR1aW5vIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2FyZHVpbm8nXG5pbXBvcnQgYmFzaCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9iYXNoJ1xuaW1wb3J0IGMgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvYydcbmltcG9ydCBjcHAgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvY3BwJ1xuaW1wb3J0IGNzaGFycCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9jc2hhcnAnXG5pbXBvcnQgY3NzIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2NzcydcbmltcG9ydCBkaWZmIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2RpZmYnXG5pbXBvcnQgZ28gZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvZ28nXG5pbXBvcnQgZ3JhcGhxbCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9ncmFwaHFsJ1xuaW1wb3J0IGluaSBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9pbmknXG5pbXBvcnQgamF2YSBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9qYXZhJ1xuaW1wb3J0IGphdmFzY3JpcHQgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvamF2YXNjcmlwdCdcbmltcG9ydCBqc29uIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2pzb24nXG5pbXBvcnQga290bGluIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2tvdGxpbidcbmltcG9ydCBsZXNzIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2xlc3MnXG5pbXBvcnQgbHVhIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2x1YSdcbmltcG9ydCBtYWtlZmlsZSBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9tYWtlZmlsZSdcbmltcG9ydCBtYXJrZG93biBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9tYXJrZG93bidcbmltcG9ydCBvYmplY3RpdmVjIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL29iamVjdGl2ZWMnXG5pbXBvcnQgcGVybCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9wZXJsJ1xuaW1wb3J0IHBocCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9waHAnXG5pbXBvcnQgcGhwVGVtcGxhdGUgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvcGhwLXRlbXBsYXRlJ1xuaW1wb3J0IHBsYWludGV4dCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9wbGFpbnRleHQnXG5pbXBvcnQgcHl0aG9uIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3B5dGhvbidcbmltcG9ydCBweXRob25SZXBsIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3B5dGhvbi1yZXBsJ1xuaW1wb3J0IHIgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvcidcbmltcG9ydCBydWJ5IGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3J1YnknXG5pbXBvcnQgcnVzdCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9ydXN0J1xuaW1wb3J0IHNjc3MgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvc2NzcydcbmltcG9ydCBzaGVsbCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9zaGVsbCdcbmltcG9ydCBzcWwgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvc3FsJ1xuaW1wb3J0IHN3aWZ0IGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3N3aWZ0J1xuaW1wb3J0IHR5cGVzY3JpcHQgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvdHlwZXNjcmlwdCdcbmltcG9ydCB2Ym5ldCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy92Ym5ldCdcbmltcG9ydCB3YXNtIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3dhc20nXG5pbXBvcnQgeG1sIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3htbCdcbmltcG9ydCB5YW1sIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3lhbWwnXG5pbXBvcnQge2xvd2xpZ2h0fSBmcm9tICcuL2NvcmUuanMnXG5cbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2FyZHVpbm8nLCBhcmR1aW5vKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnYmFzaCcsIGJhc2gpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdjJywgYylcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2NwcCcsIGNwcClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2NzaGFycCcsIGNzaGFycClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2NzcycsIGNzcylcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2RpZmYnLCBkaWZmKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnZ28nLCBnbylcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2dyYXBocWwnLCBncmFwaHFsKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnaW5pJywgaW5pKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnamF2YScsIGphdmEpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdqYXZhc2NyaXB0JywgamF2YXNjcmlwdClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2pzb24nLCBqc29uKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgna290bGluJywga290bGluKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnbGVzcycsIGxlc3MpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdsdWEnLCBsdWEpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdtYWtlZmlsZScsIG1ha2VmaWxlKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnbWFya2Rvd24nLCBtYXJrZG93bilcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ29iamVjdGl2ZWMnLCBvYmplY3RpdmVjKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgncGVybCcsIHBlcmwpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdwaHAnLCBwaHApXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdwaHAtdGVtcGxhdGUnLCBwaHBUZW1wbGF0ZSlcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3BsYWludGV4dCcsIHBsYWludGV4dClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3B5dGhvbicsIHB5dGhvbilcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3B5dGhvbi1yZXBsJywgcHl0aG9uUmVwbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3InLCByKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgncnVieScsIHJ1YnkpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdydXN0JywgcnVzdClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3Njc3MnLCBzY3NzKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnc2hlbGwnLCBzaGVsbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3NxbCcsIHNxbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3N3aWZ0Jywgc3dpZnQpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCd0eXBlc2NyaXB0JywgdHlwZXNjcmlwdClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3ZibmV0JywgdmJuZXQpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCd3YXNtJywgd2FzbSlcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3htbCcsIHhtbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3lhbWwnLCB5YW1sKVxuXG5leHBvcnQge2xvd2xpZ2h0fSBmcm9tICcuL2NvcmUuanMnXG4iLCAiLy8gQ2xhbXBzIGEgdmFsdWUgYmV0d2VlbiBhbiB1cHBlciBhbmQgbG93ZXIgYm91bmQuXG4vLyBXZSB1c2UgdGVybmFyeSBvcGVyYXRvcnMgYmVjYXVzZSBpdCBtYWtlcyB0aGUgbWluaWZpZWQgY29kZVxuLy8gMiB0aW1lcyBzaG9ydGVyIHRoZW4gYE1hdGgubWluKE1hdGgubWF4KGEsYiksYylgXG5leHBvcnQgY29uc3QgY2xhbXAgPSAobnVtYmVyOiBudW1iZXIsIG1pbiA9IDAsIG1heCA9IDEpOiBudW1iZXIgPT4ge1xuICByZXR1cm4gbnVtYmVyID4gbWF4ID8gbWF4IDogbnVtYmVyIDwgbWluID8gbWluIDogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IHJvdW5kID0gKG51bWJlcjogbnVtYmVyLCBkaWdpdHMgPSAwLCBiYXNlID0gTWF0aC5wb3coMTAsIGRpZ2l0cykpOiBudW1iZXIgPT4ge1xuICByZXR1cm4gTWF0aC5yb3VuZChiYXNlICogbnVtYmVyKSAvIGJhc2U7XG59O1xuIiwgImltcG9ydCB7IFJnYmFDb2xvciwgUmdiQ29sb3IsIEhzbGFDb2xvciwgSHNsQ29sb3IsIEhzdmFDb2xvciwgSHN2Q29sb3IgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4vbWF0aC5qcyc7XG5cbi8qKlxuICogVmFsaWQgQ1NTIDxhbmdsZT4gdW5pdHMuXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYW5nbGVcbiAqL1xuY29uc3QgYW5nbGVVbml0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgZ3JhZDogMzYwIC8gNDAwLFxuICB0dXJuOiAzNjAsXG4gIHJhZDogMzYwIC8gKE1hdGguUEkgKiAyKVxufTtcblxuZXhwb3J0IGNvbnN0IGhleFRvSHN2YSA9IChoZXg6IHN0cmluZyk6IEhzdmFDb2xvciA9PiByZ2JhVG9Ic3ZhKGhleFRvUmdiYShoZXgpKTtcblxuZXhwb3J0IGNvbnN0IGhleFRvUmdiYSA9IChoZXg6IHN0cmluZyk6IFJnYmFDb2xvciA9PiB7XG4gIGlmIChoZXhbMF0gPT09ICcjJykgaGV4ID0gaGV4LnN1YnN0cmluZygxKTtcblxuICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQoaGV4WzBdICsgaGV4WzBdLCAxNiksXG4gICAgICBnOiBwYXJzZUludChoZXhbMV0gKyBoZXhbMV0sIDE2KSxcbiAgICAgIGI6IHBhcnNlSW50KGhleFsyXSArIGhleFsyXSwgMTYpLFxuICAgICAgYTogaGV4Lmxlbmd0aCA9PT0gNCA/IHJvdW5kKHBhcnNlSW50KGhleFszXSArIGhleFszXSwgMTYpIC8gMjU1LCAyKSA6IDFcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByOiBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNiksXG4gICAgZzogcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpLFxuICAgIGI6IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KSxcbiAgICBhOiBoZXgubGVuZ3RoID09PSA4ID8gcm91bmQocGFyc2VJbnQoaGV4LnN1YnN0cmluZyg2LCA4KSwgMTYpIC8gMjU1LCAyKSA6IDFcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUh1ZSA9ICh2YWx1ZTogc3RyaW5nLCB1bml0ID0gJ2RlZycpOiBudW1iZXIgPT4ge1xuICByZXR1cm4gTnVtYmVyKHZhbHVlKSAqIChhbmdsZVVuaXRzW3VuaXRdIHx8IDEpO1xufTtcblxuZXhwb3J0IGNvbnN0IGhzbGFTdHJpbmdUb0hzdmEgPSAoaHNsU3RyaW5nOiBzdHJpbmcpOiBIc3ZhQ29sb3IgPT4ge1xuICBjb25zdCBtYXRjaGVyID1cbiAgICAvaHNsYT9cXCg/XFxzKigtP1xcZCpcXC4/XFxkKykoZGVnfHJhZHxncmFkfHR1cm4pP1ssXFxzXSsoLT9cXGQqXFwuP1xcZCspJT9bLFxcc10rKC0/XFxkKlxcLj9cXGQrKSU/LD9cXHMqWy9cXHNdKigtP1xcZCpcXC4/XFxkKyk/KCUpP1xccypcXCk/L2k7XG4gIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5leGVjKGhzbFN0cmluZyk7XG5cbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHsgaDogMCwgczogMCwgdjogMCwgYTogMSB9O1xuXG4gIHJldHVybiBoc2xhVG9Ic3ZhKHtcbiAgICBoOiBwYXJzZUh1ZShtYXRjaFsxXSwgbWF0Y2hbMl0pLFxuICAgIHM6IE51bWJlcihtYXRjaFszXSksXG4gICAgbDogTnVtYmVyKG1hdGNoWzRdKSxcbiAgICBhOiBtYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IE51bWJlcihtYXRjaFs1XSkgLyAobWF0Y2hbNl0gPyAxMDAgOiAxKVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoc2xTdHJpbmdUb0hzdmEgPSBoc2xhU3RyaW5nVG9Ic3ZhO1xuXG5leHBvcnQgY29uc3QgaHNsYVRvSHN2YSA9ICh7IGgsIHMsIGwsIGEgfTogSHNsYUNvbG9yKTogSHN2YUNvbG9yID0+IHtcbiAgcyAqPSAobCA8IDUwID8gbCA6IDEwMCAtIGwpIC8gMTAwO1xuXG4gIHJldHVybiB7XG4gICAgaDogaCxcbiAgICBzOiBzID4gMCA/ICgoMiAqIHMpIC8gKGwgKyBzKSkgKiAxMDAgOiAwLFxuICAgIHY6IGwgKyBzLFxuICAgIGFcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZhVG9IZXggPSAoaHN2YTogSHN2YUNvbG9yKTogc3RyaW5nID0+IHJnYmFUb0hleChoc3ZhVG9SZ2JhKGhzdmEpKTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzbGEgPSAoeyBoLCBzLCB2LCBhIH06IEhzdmFDb2xvcik6IEhzbGFDb2xvciA9PiB7XG4gIGNvbnN0IGhoID0gKCgyMDAgLSBzKSAqIHYpIC8gMTAwO1xuXG4gIHJldHVybiB7XG4gICAgaDogcm91bmQoaCksXG4gICAgczogcm91bmQoaGggPiAwICYmIGhoIDwgMjAwID8gKChzICogdikgLyAxMDAgLyAoaGggPD0gMTAwID8gaGggOiAyMDAgLSBoaCkpICogMTAwIDogMCksXG4gICAgbDogcm91bmQoaGggLyAyKSxcbiAgICBhOiByb3VuZChhLCAyKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzdlN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IGgsIHMsIHYgfSA9IHJvdW5kSHN2YShoc3ZhKTtcbiAgcmV0dXJuIGBoc3YoJHtofSwgJHtzfSUsICR7dn0lKWA7XG59O1xuXG5leHBvcnQgY29uc3QgaHN2YVRvSHN2YVN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IGgsIHMsIHYsIGEgfSA9IHJvdW5kSHN2YShoc3ZhKTtcbiAgcmV0dXJuIGBoc3ZhKCR7aH0sICR7c30lLCAke3Z9JSwgJHthfSlgO1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzbFN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IGgsIHMsIGwgfSA9IGhzdmFUb0hzbGEoaHN2YSk7XG4gIHJldHVybiBgaHNsKCR7aH0sICR7c30lLCAke2x9JSlgO1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzbGFTdHJpbmcgPSAoaHN2YTogSHN2YUNvbG9yKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeyBoLCBzLCBsLCBhIH0gPSBoc3ZhVG9Ic2xhKGhzdmEpO1xuICByZXR1cm4gYGhzbGEoJHtofSwgJHtzfSUsICR7bH0lLCAke2F9KWA7XG59O1xuXG5leHBvcnQgY29uc3QgaHN2YVRvUmdiYSA9ICh7IGgsIHMsIHYsIGEgfTogSHN2YUNvbG9yKTogUmdiYUNvbG9yID0+IHtcbiAgaCA9IChoIC8gMzYwKSAqIDY7XG4gIHMgPSBzIC8gMTAwO1xuICB2ID0gdiAvIDEwMDtcblxuICBjb25zdCBoaCA9IE1hdGguZmxvb3IoaCksXG4gICAgYiA9IHYgKiAoMSAtIHMpLFxuICAgIGMgPSB2ICogKDEgLSAoaCAtIGhoKSAqIHMpLFxuICAgIGQgPSB2ICogKDEgLSAoMSAtIGggKyBoaCkgKiBzKSxcbiAgICBtb2R1bGUgPSBoaCAlIDY7XG5cbiAgcmV0dXJuIHtcbiAgICByOiByb3VuZChbdiwgYywgYiwgYiwgZCwgdl1bbW9kdWxlXSAqIDI1NSksXG4gICAgZzogcm91bmQoW2QsIHYsIHYsIGMsIGIsIGJdW21vZHVsZV0gKiAyNTUpLFxuICAgIGI6IHJvdW5kKFtiLCBiLCBkLCB2LCB2LCBjXVttb2R1bGVdICogMjU1KSxcbiAgICBhOiByb3VuZChhLCAyKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb1JnYlN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHIsIGcsIGIgfSA9IGhzdmFUb1JnYmEoaHN2YSk7XG4gIHJldHVybiBgcmdiKCR7cn0sICR7Z30sICR7Yn0pYDtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZhVG9SZ2JhU3RyaW5nID0gKGhzdmE6IEhzdmFDb2xvcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gaHN2YVRvUmdiYShoc3ZhKTtcbiAgcmV0dXJuIGByZ2JhKCR7cn0sICR7Z30sICR7Yn0sICR7YX0pYDtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZhU3RyaW5nVG9Ic3ZhID0gKGhzdlN0cmluZzogc3RyaW5nKTogSHN2YUNvbG9yID0+IHtcbiAgY29uc3QgbWF0Y2hlciA9XG4gICAgL2hzdmE/XFwoP1xccyooLT9cXGQqXFwuP1xcZCspKGRlZ3xyYWR8Z3JhZHx0dXJuKT9bLFxcc10rKC0/XFxkKlxcLj9cXGQrKSU/WyxcXHNdKygtP1xcZCpcXC4/XFxkKyklPyw/XFxzKlsvXFxzXSooLT9cXGQqXFwuP1xcZCspPyglKT9cXHMqXFwpPy9pO1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIuZXhlYyhoc3ZTdHJpbmcpO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiB7IGg6IDAsIHM6IDAsIHY6IDAsIGE6IDEgfTtcblxuICByZXR1cm4gcm91bmRIc3ZhKHtcbiAgICBoOiBwYXJzZUh1ZShtYXRjaFsxXSwgbWF0Y2hbMl0pLFxuICAgIHM6IE51bWJlcihtYXRjaFszXSksXG4gICAgdjogTnVtYmVyKG1hdGNoWzRdKSxcbiAgICBhOiBtYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IE51bWJlcihtYXRjaFs1XSkgLyAobWF0Y2hbNl0gPyAxMDAgOiAxKVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZTdHJpbmdUb0hzdmEgPSBoc3ZhU3RyaW5nVG9Ic3ZhO1xuXG5leHBvcnQgY29uc3QgcmdiYVN0cmluZ1RvSHN2YSA9IChyZ2JhU3RyaW5nOiBzdHJpbmcpOiBIc3ZhQ29sb3IgPT4ge1xuICBjb25zdCBtYXRjaGVyID1cbiAgICAvcmdiYT9cXCg/XFxzKigtP1xcZCpcXC4/XFxkKykoJSk/WyxcXHNdKygtP1xcZCpcXC4/XFxkKykoJSk/WyxcXHNdKygtP1xcZCpcXC4/XFxkKykoJSk/LD9cXHMqWy9cXHNdKigtP1xcZCpcXC4/XFxkKyk/KCUpP1xccypcXCk/L2k7XG4gIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5leGVjKHJnYmFTdHJpbmcpO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiB7IGg6IDAsIHM6IDAsIHY6IDAsIGE6IDEgfTtcblxuICByZXR1cm4gcmdiYVRvSHN2YSh7XG4gICAgcjogTnVtYmVyKG1hdGNoWzFdKSAvIChtYXRjaFsyXSA/IDEwMCAvIDI1NSA6IDEpLFxuICAgIGc6IE51bWJlcihtYXRjaFszXSkgLyAobWF0Y2hbNF0gPyAxMDAgLyAyNTUgOiAxKSxcbiAgICBiOiBOdW1iZXIobWF0Y2hbNV0pIC8gKG1hdGNoWzZdID8gMTAwIC8gMjU1IDogMSksXG4gICAgYTogbWF0Y2hbN10gPT09IHVuZGVmaW5lZCA/IDEgOiBOdW1iZXIobWF0Y2hbN10pIC8gKG1hdGNoWzhdID8gMTAwIDogMSlcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmdiU3RyaW5nVG9Ic3ZhID0gcmdiYVN0cmluZ1RvSHN2YTtcblxuY29uc3QgZm9ybWF0ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGhleCA9IG51bWJlci50b1N0cmluZygxNik7XG4gIHJldHVybiBoZXgubGVuZ3RoIDwgMiA/ICcwJyArIGhleCA6IGhleDtcbn07XG5cbmV4cG9ydCBjb25zdCByZ2JhVG9IZXggPSAoeyByLCBnLCBiLCBhIH06IFJnYmFDb2xvcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGFscGhhSGV4ID0gYSA8IDEgPyBmb3JtYXQocm91bmQoYSAqIDI1NSkpIDogJyc7XG4gIHJldHVybiAnIycgKyBmb3JtYXQocikgKyBmb3JtYXQoZykgKyBmb3JtYXQoYikgKyBhbHBoYUhleDtcbn07XG5cbmV4cG9ydCBjb25zdCByZ2JhVG9Ic3ZhID0gKHsgciwgZywgYiwgYSB9OiBSZ2JhQ29sb3IpOiBIc3ZhQ29sb3IgPT4ge1xuICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgY29uc3QgZGVsdGEgPSBtYXggLSBNYXRoLm1pbihyLCBnLCBiKTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3QgaGggPSBkZWx0YVxuICAgID8gbWF4ID09PSByXG4gICAgICA/IChnIC0gYikgLyBkZWx0YVxuICAgICAgOiBtYXggPT09IGdcbiAgICAgICAgPyAyICsgKGIgLSByKSAvIGRlbHRhXG4gICAgICAgIDogNCArIChyIC0gZykgLyBkZWx0YVxuICAgIDogMDtcblxuICByZXR1cm4ge1xuICAgIGg6IHJvdW5kKDYwICogKGhoIDwgMCA/IGhoICsgNiA6IGhoKSksXG4gICAgczogcm91bmQobWF4ID8gKGRlbHRhIC8gbWF4KSAqIDEwMCA6IDApLFxuICAgIHY6IHJvdW5kKChtYXggLyAyNTUpICogMTAwKSxcbiAgICBhXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3Qgcm91bmRIc3ZhID0gKGhzdmE6IEhzdmFDb2xvcik6IEhzdmFDb2xvciA9PiAoe1xuICBoOiByb3VuZChoc3ZhLmgpLFxuICBzOiByb3VuZChoc3ZhLnMpLFxuICB2OiByb3VuZChoc3ZhLnYpLFxuICBhOiByb3VuZChoc3ZhLmEsIDIpXG59KTtcblxuZXhwb3J0IGNvbnN0IHJnYmFUb1JnYiA9ICh7IHIsIGcsIGIgfTogUmdiYUNvbG9yKTogUmdiQ29sb3IgPT4gKHsgciwgZywgYiB9KTtcblxuZXhwb3J0IGNvbnN0IGhzbGFUb0hzbCA9ICh7IGgsIHMsIGwgfTogSHNsYUNvbG9yKTogSHNsQ29sb3IgPT4gKHsgaCwgcywgbCB9KTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzdiA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBIc3ZDb2xvciA9PiB7XG4gIGNvbnN0IHsgaCwgcywgdiB9ID0gcm91bmRIc3ZhKGhzdmEpO1xuICByZXR1cm4geyBoLCBzLCB2IH07XG59O1xuIiwgImltcG9ydCB7IGhleFRvUmdiYSB9IGZyb20gJy4vY29udmVydC5qcyc7XG5pbXBvcnQgdHlwZSB7IE9iamVjdENvbG9yIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb2xvck9iamVjdHMgPSAoZmlyc3Q6IE9iamVjdENvbG9yLCBzZWNvbmQ6IE9iamVjdENvbG9yKTogYm9vbGVhbiA9PiB7XG4gIGlmIChmaXJzdCA9PT0gc2Vjb25kKSByZXR1cm4gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gZmlyc3QpIHtcbiAgICAvLyBUaGUgZm9sbG93aW5nIGFsbG93cyBmb3IgYSB0eXBlLXNhZmUgY2FsbGluZyBvZiB0aGlzIGZ1bmN0aW9uIChmaXJzdCAmIHNlY29uZCBoYXZlIHRvIGJlIEhTTCwgSFNWLCBvciBSR0IpXG4gICAgLy8gd2l0aCB0eXBlLXVuc2FmZSBpdGVyYXRpbmcgb3ZlciBvYmplY3Qga2V5cy4gVFMgZG9lcyBub3QgYWxsb3cgdGhpcyB3aXRob3V0IGFuIGluZGV4IChgW2tleTogc3RyaW5nXTogbnVtYmVyYClcbiAgICAvLyBvbiBhbiBvYmplY3QgdG8gZGVmaW5lIGhvdyBpdGVyYXRpb24gaXMgbm9ybWFsbHkgZG9uZS4gVG8gZW5zdXJlIGV4dHJhIGtleXMgYXJlIG5vdCBhbGxvd2VkIG9uIG91ciB0eXBlcyxcbiAgICAvLyB3ZSBtdXN0IGNhc3Qgb3VyIG9iamVjdCB0byB1bmtub3duIChhcyBSR0IgZGVtYW5kcyBgcmAgYmUgYSBrZXksIHdoaWxlIGBSZWNvcmQ8c3RyaW5nLCB4PmAgZG9lcyBub3QgY2FyZSBpZlxuICAgIC8vIHRoZXJlIGlzIG9yIG5vdCksIGFuZCB0aGVuIGFzIGEgdHlwZSBUUyBjYW4gaXRlcmF0ZSBvdmVyLlxuICAgIGlmIChcbiAgICAgIChmaXJzdCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3Byb3BdICE9PVxuICAgICAgKHNlY29uZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3Byb3BdXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb2xvclN0cmluZyA9IChmaXJzdDogc3RyaW5nLCBzZWNvbmQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZmlyc3QucmVwbGFjZSgvXFxzL2csICcnKSA9PT0gc2Vjb25kLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZXF1YWxIZXggPSAoZmlyc3Q6IHN0cmluZywgc2Vjb25kOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGZpcnN0LnRvTG93ZXJDYXNlKCkgPT09IHNlY29uZC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBUbyBjb21wYXJlIGNvbG9ycyBsaWtlIGAjRkZGYCBhbmQgYGZmZmZmZmAgd2UgY29udmVydCB0aGVtIGludG8gUkdCIG9iamVjdHNcbiAgcmV0dXJuIGVxdWFsQ29sb3JPYmplY3RzKGhleFRvUmdiYShmaXJzdCksIGhleFRvUmdiYShzZWNvbmQpKTtcbn07XG4iLCAiY29uc3QgY2FjaGU6IFJlY29yZDxzdHJpbmcsIEhUTUxUZW1wbGF0ZUVsZW1lbnQ+ID0ge307XG5cbmV4cG9ydCBjb25zdCB0cGwgPSAoaHRtbDogc3RyaW5nKTogSFRNTFRlbXBsYXRlRWxlbWVudCA9PiB7XG4gIGxldCB0ZW1wbGF0ZSA9IGNhY2hlW2h0bWxdO1xuICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgY2FjaGVbaHRtbF0gPSB0ZW1wbGF0ZTtcbiAgfVxuICByZXR1cm4gdGVtcGxhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgZmlyZSA9ICh0YXJnZXQ6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkID0+IHtcbiAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50KHR5cGUsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBkZXRhaWxcbiAgICB9KVxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEhzdmFDb2xvciB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGZpcmUsIHRwbCB9IGZyb20gJy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL3V0aWxzL21hdGguanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9mZnNldCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5sZXQgaGFzVG91Y2hlZCA9IGZhbHNlO1xuXG4vLyBDaGVjayBpZiBhbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IHRvdWNoXG5jb25zdCBpc1RvdWNoID0gKGU6IEV2ZW50KTogZSBpcyBUb3VjaEV2ZW50ID0+ICd0b3VjaGVzJyBpbiBlO1xuXG4vLyBQcmV2ZW50IG1vYmlsZSBicm93c2VycyBmcm9tIGhhbmRsaW5nIG1vdXNlIGV2ZW50cyAoY29uZmxpY3Rpbmcgd2l0aCB0b3VjaCBvbmVzKS5cbi8vIElmIHdlIGRldGVjdGVkIGEgdG91Y2ggaW50ZXJhY3Rpb24gYmVmb3JlLCB3ZSBwcmVmZXIgcmVhY3RpbmcgdG8gdG91Y2ggZXZlbnRzIG9ubHkuXG5jb25zdCBpc1ZhbGlkID0gKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4gPT4ge1xuICBpZiAoaGFzVG91Y2hlZCAmJiAhaXNUb3VjaChldmVudCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFoYXNUb3VjaGVkKSBoYXNUb3VjaGVkID0gaXNUb3VjaChldmVudCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgcG9pbnRlck1vdmUgPSAodGFyZ2V0OiBTbGlkZXIsIGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICBjb25zdCBwb2ludGVyID0gaXNUb3VjaChldmVudCkgPyBldmVudC50b3VjaGVzWzBdIDogKGV2ZW50IGFzIE1vdXNlRXZlbnQpO1xuICBjb25zdCByZWN0ID0gdGFyZ2V0LmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGZpcmUoXG4gICAgdGFyZ2V0LmVsLFxuICAgICdtb3ZlJyxcbiAgICB0YXJnZXQuZ2V0TW92ZSh7XG4gICAgICB4OiBjbGFtcCgocG9pbnRlci5wYWdlWCAtIChyZWN0LmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQpKSAvIHJlY3Qud2lkdGgpLFxuICAgICAgeTogY2xhbXAoKHBvaW50ZXIucGFnZVkgLSAocmVjdC50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQpKSAvIHJlY3QuaGVpZ2h0KVxuICAgIH0pXG4gICk7XG59O1xuXG5jb25zdCBrZXlNb3ZlID0gKHRhcmdldDogU2xpZGVyLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAvLyBXZSB1c2UgYGtleUNvZGVgIGluc3RlYWQgb2YgYGtleWAgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsaWJyYXJ5LlxuICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgLy8gSWdub3JlIGFsbCBrZXlzIGV4Y2VwdCBhcnJvdyBvbmVzLCBQYWdlIFVwLCBQYWdlIERvd24sIEhvbWUgYW5kIEVuZC5cbiAgaWYgKGtleUNvZGUgPiA0MCB8fCAodGFyZ2V0Lnh5ICYmIGtleUNvZGUgPCAzNykgfHwga2V5Q29kZSA8IDMzKSByZXR1cm47XG4gIC8vIERvIG5vdCBzY3JvbGwgcGFnZSBieSBrZXlzIHdoZW4gY29sb3IgcGlja2VyIGVsZW1lbnQgaGFzIGZvY3VzLlxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBTZW5kIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgcGFyZW50IGNvbXBvbmVudC5cbiAgZmlyZShcbiAgICB0YXJnZXQuZWwsXG4gICAgJ21vdmUnLFxuICAgIHRhcmdldC5nZXRNb3ZlKFxuICAgICAge1xuICAgICAgICB4OlxuICAgICAgICAgIGtleUNvZGUgPT09IDM5IC8vIEFycm93IFJpZ2h0XG4gICAgICAgICAgICA/IDAuMDFcbiAgICAgICAgICAgIDoga2V5Q29kZSA9PT0gMzcgLy8gQXJyb3cgTGVmdFxuICAgICAgICAgICAgPyAtMC4wMVxuICAgICAgICAgICAgOiBrZXlDb2RlID09PSAzNCAvLyBQYWdlIERvd25cbiAgICAgICAgICAgID8gMC4wNVxuICAgICAgICAgICAgOiBrZXlDb2RlID09PSAzMyAvLyBQYWdlIFVwXG4gICAgICAgICAgICA/IC0wLjA1XG4gICAgICAgICAgICA6IGtleUNvZGUgPT09IDM1IC8vIEVuZFxuICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICA6IGtleUNvZGUgPT09IDM2IC8vIEhvbWVcbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogMCxcbiAgICAgICAgeTpcbiAgICAgICAgICBrZXlDb2RlID09PSA0MCAvLyBBcnJvdyBkb3duXG4gICAgICAgICAgICA/IDAuMDFcbiAgICAgICAgICAgIDoga2V5Q29kZSA9PT0gMzggLy8gQXJyb3cgVXBcbiAgICAgICAgICAgID8gLTAuMDFcbiAgICAgICAgICAgIDogMFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApXG4gICk7XG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2xpZGVyIHtcbiAgZGVjbGFyZSBub2RlczogSFRNTEVsZW1lbnRbXTtcblxuICBkZWNsYXJlIGVsOiBIVE1MRWxlbWVudDtcblxuICBkZWNsYXJlIHh5OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IFNoYWRvd1Jvb3QsIHBhcnQ6IHN0cmluZywgYXJpYTogc3RyaW5nLCB4eTogYm9vbGVhbikge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdHBsKFxuICAgICAgYDxkaXYgcm9sZT1cInNsaWRlclwiIHRhYmluZGV4PVwiMFwiIHBhcnQ9XCIke3BhcnR9XCIgJHthcmlhfT48ZGl2IHBhcnQ9XCIke3BhcnR9LXBvaW50ZXJcIj48L2Rpdj48L2Rpdj5gXG4gICAgKTtcbiAgICByb290LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgIGNvbnN0IGVsID0gcm9vdC5xdWVyeVNlbGVjdG9yKGBbcGFydD0ke3BhcnR9XWApIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcyk7XG4gICAgdGhpcy5lbCA9IGVsO1xuXG4gICAgdGhpcy54eSA9IHh5O1xuICAgIHRoaXMubm9kZXMgPSBbZWwuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCwgZWxdO1xuICB9XG5cbiAgc2V0IGRyYWdnaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgY29uc3QgdG9nZ2xlRXZlbnQgPSBzdGF0ZSA/IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgOiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgIHRvZ2dsZUV2ZW50KGhhc1RvdWNoZWQgPyAndG91Y2htb3ZlJyA6ICdtb3VzZW1vdmUnLCB0aGlzKTtcbiAgICB0b2dnbGVFdmVudChoYXNUb3VjaGVkID8gJ3RvdWNoZW5kJyA6ICdtb3VzZXVwJywgdGhpcyk7XG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gZXZlbnQuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duIGZvciBsZWZ0IGJ1dHRvbiBhY3RpdmF0aW9uXG4gICAgICAgIGlmICghaXNWYWxpZChldmVudCkgfHwgKCFoYXNUb3VjaGVkICYmIChldmVudCBhcyBNb3VzZUV2ZW50KS5idXR0b24gIT0gMCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5lbC5mb2N1cygpO1xuICAgICAgICBwb2ludGVyTW92ZSh0aGlzLCBldmVudCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBwb2ludGVyTW92ZSh0aGlzLCBldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgICAga2V5TW92ZSh0aGlzLCBldmVudCBhcyBLZXlib2FyZEV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgYWJzdHJhY3QgZ2V0TW92ZShvZmZzZXQ6IE9mZnNldCwga2V5PzogYm9vbGVhbik6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cbiAgYWJzdHJhY3QgdXBkYXRlKGhzdmE6IEhzdmFDb2xvcik6IHZvaWQ7XG5cbiAgc3R5bGUoc3R5bGVzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIHN0eWxlcy5mb3JFYWNoKChzdHlsZSwgaSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIGluIHN0eWxlKSB7XG4gICAgICAgIHRoaXMubm9kZXNbaV0uc3R5bGUuc2V0UHJvcGVydHkocCwgc3R5bGVbcF0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgU2xpZGVyLCBPZmZzZXQgfSBmcm9tICcuL3NsaWRlci5qcyc7XG5pbXBvcnQgeyBoc3ZhVG9Ic2xTdHJpbmcgfSBmcm9tICcuLi91dGlscy9jb252ZXJ0LmpzJztcbmltcG9ydCB7IGNsYW1wLCByb3VuZCB9IGZyb20gJy4uL3V0aWxzL21hdGguanMnO1xuaW1wb3J0IHR5cGUgeyBIc3ZhQ29sb3IgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBIdWUgZXh0ZW5kcyBTbGlkZXIge1xuICBkZWNsYXJlIGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBTaGFkb3dSb290KSB7XG4gICAgc3VwZXIocm9vdCwgJ2h1ZScsICdhcmlhLWxhYmVsPVwiSHVlXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMzYwXCInLCBmYWxzZSk7XG4gIH1cblxuICB1cGRhdGUoeyBoIH06IEhzdmFDb2xvcik6IHZvaWQge1xuICAgIHRoaXMuaCA9IGg7XG4gICAgdGhpcy5zdHlsZShbXG4gICAgICB7XG4gICAgICAgIGxlZnQ6IGAkeyhoIC8gMzYwKSAqIDEwMH0lYCxcbiAgICAgICAgY29sb3I6IGhzdmFUb0hzbFN0cmluZyh7IGgsIHM6IDEwMCwgdjogMTAwLCBhOiAxIH0pXG4gICAgICB9XG4gICAgXSk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCBgJHtyb3VuZChoKX1gKTtcbiAgfVxuXG4gIGdldE1vdmUob2Zmc2V0OiBPZmZzZXQsIGtleT86IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcbiAgICAvLyBIdWUgbWVhc3VyZWQgaW4gZGVncmVlcyBvZiB0aGUgY29sb3IgY2lyY2xlIHJhbmdpbmcgZnJvbSAwIHRvIDM2MFxuICAgIHJldHVybiB7IGg6IGtleSA/IGNsYW1wKHRoaXMuaCArIG9mZnNldC54ICogMzYwLCAwLCAzNjApIDogMzYwICogb2Zmc2V0LnggfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFNsaWRlciwgT2Zmc2V0IH0gZnJvbSAnLi9zbGlkZXIuanMnO1xuaW1wb3J0IHsgaHN2YVRvSHNsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvY29udmVydC5qcyc7XG5pbXBvcnQgeyBjbGFtcCwgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJztcbmltcG9ydCB0eXBlIHsgSHN2YUNvbG9yIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgU2F0dXJhdGlvbiBleHRlbmRzIFNsaWRlciB7XG4gIGRlY2xhcmUgaHN2YTogSHN2YUNvbG9yO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICBzdXBlcihyb290LCAnc2F0dXJhdGlvbicsICdhcmlhLWxhYmVsPVwiQ29sb3JcIicsIHRydWUpO1xuICB9XG5cbiAgdXBkYXRlKGhzdmE6IEhzdmFDb2xvcik6IHZvaWQge1xuICAgIHRoaXMuaHN2YSA9IGhzdmE7XG4gICAgdGhpcy5zdHlsZShbXG4gICAgICB7XG4gICAgICAgIHRvcDogYCR7MTAwIC0gaHN2YS52fSVgLFxuICAgICAgICBsZWZ0OiBgJHtoc3ZhLnN9JWAsXG4gICAgICAgIGNvbG9yOiBoc3ZhVG9Ic2xTdHJpbmcoaHN2YSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogaHN2YVRvSHNsU3RyaW5nKHsgaDogaHN2YS5oLCBzOiAxMDAsIHY6IDEwMCwgYTogMSB9KVxuICAgICAgfVxuICAgIF0pO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFxuICAgICAgJ2FyaWEtdmFsdWV0ZXh0JyxcbiAgICAgIGBTYXR1cmF0aW9uICR7cm91bmQoaHN2YS5zKX0lLCBCcmlnaHRuZXNzICR7cm91bmQoaHN2YS52KX0lYFxuICAgICk7XG4gIH1cblxuICBnZXRNb3ZlKG9mZnNldDogT2Zmc2V0LCBrZXk/OiBib29sZWFuKTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB7XG4gICAgLy8gU2F0dXJhdGlvbiBhbmQgYnJpZ2h0bmVzcyBhbHdheXMgZml0IGludG8gWzAsIDEwMF0gcmFuZ2VcbiAgICByZXR1cm4ge1xuICAgICAgczoga2V5ID8gY2xhbXAodGhpcy5oc3ZhLnMgKyBvZmZzZXQueCAqIDEwMCwgMCwgMTAwKSA6IG9mZnNldC54ICogMTAwLFxuICAgICAgdjoga2V5ID8gY2xhbXAodGhpcy5oc3ZhLnYgLSBvZmZzZXQueSAqIDEwMCwgMCwgMTAwKSA6IE1hdGgucm91bmQoMTAwIC0gb2Zmc2V0LnkgKiAxMDApXG4gICAgfTtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGA6aG9zdHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjIwMHB4O2hlaWdodDoyMDBweDt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH06aG9zdChbaGlkZGVuXSl7ZGlzcGxheTpub25lIWltcG9ydGFudH1bcm9sZT1zbGlkZXJde3Bvc2l0aW9uOnJlbGF0aXZlO3RvdWNoLWFjdGlvbjpub25lO3VzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO291dGxpbmU6MH1bcm9sZT1zbGlkZXJdOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgOHB4IDhweH1bcGFydCQ9cG9pbnRlcl17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2Rpc3BsYXk6ZmxleDtwbGFjZS1jb250ZW50OmNlbnRlciBjZW50ZXI7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MnB4IHNvbGlkICNmZmY7Ym9yZGVyLXJhZGl1czo1MCU7Ym94LXNoYWRvdzowIDJweCA0cHggcmdiYSgwLDAsMCwuMil9W3BhcnQkPXBvaW50ZXJdOjphZnRlcntjb250ZW50OlwiXCI7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9W3JvbGU9c2xpZGVyXTpmb2N1cyBbcGFydCQ9cG9pbnRlcl17dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDEuMSl9YDtcbiIsICJleHBvcnQgZGVmYXVsdCBgW3BhcnQ9aHVlXXtmbGV4OjAgMCAyNHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJlZCAwLCNmZjAgMTclLCMwZjAgMzMlLCMwZmYgNTAlLCMwMGYgNjclLCNmMGYgODMlLHJlZCAxMDAlKX1bcGFydD1odWUtcG9pbnRlcl17dG9wOjUwJTt6LWluZGV4OjJ9YDtcbiIsICJleHBvcnQgZGVmYXVsdCBgW3BhcnQ9c2F0dXJhdGlvbl17ZmxleC1ncm93OjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MTJweCBzb2xpZCAjMDAwO2JvcmRlci1yYWRpdXM6OHB4IDhweCAwIDA7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gdG9wLCMwMDAsdHJhbnNwYXJlbnQpLGxpbmVhci1ncmFkaWVudCh0byByaWdodCwjZmZmLHJnYmEoMjU1LDI1NSwyNTUsMCkpO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4IHJnYmEoMCwwLDAsLjA1KX1bcGFydD1zYXR1cmF0aW9uLXBvaW50ZXJde3otaW5kZXg6M31gO1xuIiwgImltcG9ydCB7IGVxdWFsQ29sb3JPYmplY3RzIH0gZnJvbSAnLi4vdXRpbHMvY29tcGFyZS5qcyc7XG5pbXBvcnQgeyBmaXJlLCB0cGwgfSBmcm9tICcuLi91dGlscy9kb20uanMnO1xuaW1wb3J0IHR5cGUgeyBBbnlDb2xvciwgQ29sb3JNb2RlbCwgSHN2YUNvbG9yIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSHVlIH0gZnJvbSAnLi9odWUuanMnO1xuaW1wb3J0IHsgU2F0dXJhdGlvbiB9IGZyb20gJy4vc2F0dXJhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFNsaWRlciB9IGZyb20gJy4vc2xpZGVyLmpzJztcbmltcG9ydCBjc3MgZnJvbSAnLi4vc3R5bGVzL2NvbG9yLXBpY2tlci5qcyc7XG5pbXBvcnQgaHVlQ3NzIGZyb20gJy4uL3N0eWxlcy9odWUuanMnO1xuaW1wb3J0IHNhdHVyYXRpb25Dc3MgZnJvbSAnLi4vc3R5bGVzL3NhdHVyYXRpb24uanMnO1xuXG5jb25zdCAkaXNTYW1lID0gU3ltYm9sKCdzYW1lJyk7XG5jb25zdCAkY29sb3IgPSBTeW1ib2woJ2NvbG9yJyk7XG5jb25zdCAkaHN2YSA9IFN5bWJvbCgnaHN2YScpO1xuY29uc3QgJHVwZGF0ZSA9IFN5bWJvbCgndXBkYXRlJyk7XG5jb25zdCAkcGFydHMgPSBTeW1ib2woJ3BhcnRzJyk7XG5cbmV4cG9ydCBjb25zdCAkY3NzID0gU3ltYm9sKCdjc3MnKTtcbmV4cG9ydCBjb25zdCAkc2xpZGVycyA9IFN5bWJvbCgnc2xpZGVycycpO1xuXG5leHBvcnQgdHlwZSBTbGlkZXJzID0gQXJyYXk8bmV3IChyb290OiBTaGFkb3dSb290KSA9PiBTbGlkZXI+O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sb3JQaWNrZXI8QyBleHRlbmRzIEFueUNvbG9yPiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2NvbG9yJ107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IFskY3NzXSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtjc3MsIGh1ZUNzcywgc2F0dXJhdGlvbkNzc107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IFskc2xpZGVyc10oKTogU2xpZGVycyB7XG4gICAgcmV0dXJuIFtTYXR1cmF0aW9uLCBIdWVdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjb2xvck1vZGVsKCk6IENvbG9yTW9kZWw8Qz47XG5cbiAgcHJpdmF0ZSBkZWNsYXJlIFskaHN2YV06IEhzdmFDb2xvcjtcblxuICBwcml2YXRlIGRlY2xhcmUgWyRjb2xvcl06IEM7XG5cbiAgcHJpdmF0ZSBkZWNsYXJlIFskcGFydHNdOiBTbGlkZXJbXTtcblxuICBnZXQgY29sb3IoKTogQyB7XG4gICAgcmV0dXJuIHRoaXNbJGNvbG9yXTtcbiAgfVxuXG4gIHNldCBjb2xvcihuZXdDb2xvcjogQykge1xuICAgIGlmICghdGhpc1skaXNTYW1lXShuZXdDb2xvcikpIHtcbiAgICAgIGNvbnN0IG5ld0hzdmEgPSB0aGlzLmNvbG9yTW9kZWwudG9Ic3ZhKG5ld0NvbG9yKTtcbiAgICAgIHRoaXNbJHVwZGF0ZV0obmV3SHN2YSk7XG4gICAgICB0aGlzWyRjb2xvcl0gPSBuZXdDb2xvcjtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdHBsKGA8c3R5bGU+JHt0aGlzWyRjc3NdLmpvaW4oJycpfTwvc3R5bGU+YCk7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgIHJvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignbW92ZScsIHRoaXMpO1xuICAgIHRoaXNbJHBhcnRzXSA9IHRoaXNbJHNsaWRlcnNdLm1hcCgoc2xpZGVyKSA9PiBuZXcgc2xpZGVyKHJvb3QpKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIEEgdXNlciBtYXkgc2V0IGEgcHJvcGVydHkgb24gYW4gX2luc3RhbmNlXyBvZiBhbiBlbGVtZW50LFxuICAgIC8vIGJlZm9yZSBpdHMgcHJvdG90eXBlIGhhcyBiZWVuIGNvbm5lY3RlZCB0byB0aGlzIGNsYXNzLlxuICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIHJ1biBpdCB0aHJvdWdoIHRoZSBwcm9wZXIgY2xhc3Mgc2V0dGVyLlxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb2xvcicpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29sb3I7XG4gICAgICBkZWxldGUgdGhpc1snY29sb3InIGFzIGtleW9mIHRoaXNdO1xuICAgICAgdGhpcy5jb2xvciA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuY29sb3IpIHtcbiAgICAgIHRoaXMuY29sb3IgPSB0aGlzLmNvbG9yTW9kZWwuZGVmYXVsdENvbG9yO1xuICAgIH1cbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhfYXR0cjogc3RyaW5nLCBfb2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yTW9kZWwuZnJvbUF0dHIobmV3VmFsKTtcbiAgICBpZiAoIXRoaXNbJGlzU2FtZV0oY29sb3IpKSB7XG4gICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgLy8gTWVyZ2UgdGhlIGN1cnJlbnQgSFNWIGNvbG9yIG9iamVjdCB3aXRoIHVwZGF0ZWQgcGFyYW1zLlxuICAgIGNvbnN0IG9sZEhzdmEgPSB0aGlzWyRoc3ZhXTtcbiAgICBjb25zdCBuZXdIc3ZhID0geyAuLi5vbGRIc3ZhLCAuLi5ldmVudC5kZXRhaWwgfTtcbiAgICB0aGlzWyR1cGRhdGVdKG5ld0hzdmEpO1xuICAgIGxldCBuZXdDb2xvcjtcbiAgICBpZiAoXG4gICAgICAhZXF1YWxDb2xvck9iamVjdHMobmV3SHN2YSwgb2xkSHN2YSkgJiZcbiAgICAgICF0aGlzWyRpc1NhbWVdKChuZXdDb2xvciA9IHRoaXMuY29sb3JNb2RlbC5mcm9tSHN2YShuZXdIc3ZhKSkpXG4gICAgKSB7XG4gICAgICB0aGlzWyRjb2xvcl0gPSBuZXdDb2xvcjtcbiAgICAgIGZpcmUodGhpcywgJ2NvbG9yLWNoYW5nZWQnLCB7IHZhbHVlOiBuZXdDb2xvciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIFskaXNTYW1lXShjb2xvcjogQyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbG9yICYmIHRoaXMuY29sb3JNb2RlbC5lcXVhbChjb2xvciwgdGhpcy5jb2xvcik7XG4gIH1cblxuICBwcml2YXRlIFskdXBkYXRlXShoc3ZhOiBIc3ZhQ29sb3IpOiB2b2lkIHtcbiAgICB0aGlzWyRoc3ZhXSA9IGhzdmE7XG4gICAgdGhpc1skcGFydHNdLmZvckVhY2goKHBhcnQpID0+IHBhcnQudXBkYXRlKGhzdmEpKTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29sb3JNb2RlbCwgQ29sb3JQaWNrZXJFdmVudExpc3RlbmVyLCBDb2xvclBpY2tlckV2ZW50TWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbG9yLXBpY2tlci5qcyc7XG5pbXBvcnQgeyBoZXhUb0hzdmEsIGhzdmFUb0hleCB9IGZyb20gJy4uL3V0aWxzL2NvbnZlcnQuanMnO1xuaW1wb3J0IHsgZXF1YWxIZXggfSBmcm9tICcuLi91dGlscy9jb21wYXJlLmpzJztcblxuY29uc3QgY29sb3JNb2RlbDogQ29sb3JNb2RlbDxzdHJpbmc+ID0ge1xuICBkZWZhdWx0Q29sb3I6ICcjMDAwJyxcbiAgdG9Ic3ZhOiBoZXhUb0hzdmEsXG4gIGZyb21Ic3ZhOiAoeyBoLCBzLCB2IH0pID0+IGhzdmFUb0hleCh7IGgsIHMsIHYsIGE6IDEgfSksXG4gIGVxdWFsOiBlcXVhbEhleCxcbiAgZnJvbUF0dHI6IChjb2xvcikgPT4gY29sb3Jcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGV4QmFzZSB7XG4gIGFkZEV2ZW50TGlzdGVuZXI8VCBleHRlbmRzIGtleW9mIENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPj4oXG4gICAgdHlwZTogVCxcbiAgICBsaXN0ZW5lcjogQ29sb3JQaWNrZXJFdmVudExpc3RlbmVyPENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPltUXT4sXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuICApOiB2b2lkO1xuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI8VCBleHRlbmRzIGtleW9mIENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPj4oXG4gICAgdHlwZTogVCxcbiAgICBsaXN0ZW5lcjogQ29sb3JQaWNrZXJFdmVudExpc3RlbmVyPENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPltUXT4sXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9uc1xuICApOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgSGV4QmFzZSBleHRlbmRzIENvbG9yUGlja2VyPHN0cmluZz4ge1xuICBwcm90ZWN0ZWQgZ2V0IGNvbG9yTW9kZWwoKTogQ29sb3JNb2RlbDxzdHJpbmc+IHtcbiAgICByZXR1cm4gY29sb3JNb2RlbDtcbiAgfVxufVxuIiwgImltcG9ydCB7RWRpdG9yLCBnZXRIVE1MRnJvbUZyYWdtZW50LCBpc0FjdGl2ZX0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IEJsb2NrcXVvdGUgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWJsb2NrcXVvdGVcIjtcbmltcG9ydCBCb2xkIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1ib2xkXCI7XG5pbXBvcnQgQnVsbGV0TGlzdCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tYnVsbGV0LWxpc3RcIjtcbmltcG9ydCBDb2RlIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1jb2RlXCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWNvbG9yXCI7XG5pbXBvcnQgRG9jdW1lbnQgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWRvY3VtZW50XCI7XG5pbXBvcnQgRHJvcGN1cnNvciBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tZHJvcGN1cnNvclwiO1xuaW1wb3J0IEdhcGN1cnNvciBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tZ2FwY3Vyc29yXCI7XG5pbXBvcnQgSGFyZEJyZWFrIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1oYXJkLWJyZWFrXCI7XG5pbXBvcnQgSGVhZGluZyBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24taGVhZGluZ1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWhpc3RvcnlcIjtcbmltcG9ydCBIb3Jpem9udGFsUnVsZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24taG9yaXpvbnRhbC1ydWxlXCI7XG5pbXBvcnQgSXRhbGljIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1pdGFsaWNcIjtcbmltcG9ydCBMaXN0SXRlbSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tbGlzdC1pdGVtXCI7XG5pbXBvcnQgT3JkZXJlZExpc3QgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLW9yZGVyZWQtbGlzdFwiO1xuaW1wb3J0IFBhcmFncmFwaCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tcGFyYWdyYXBoXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLXBsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU3RyaWtlIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1zdHJpa2VcIjtcbmltcG9ydCBTdWJzY3JpcHQgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLXN1YnNjcmlwdFwiO1xuaW1wb3J0IFN1cGVyc2NyaXB0IGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1zdXBlcnNjcmlwdFwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi10YWJsZVwiO1xuaW1wb3J0IFRhYmxlQ2VsbCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGFibGUtY2VsbFwiO1xuaW1wb3J0IFRhYmxlSGVhZGVyIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1oZWFkZXJcIjtcbmltcG9ydCBUYWJsZVJvdyBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGFibGUtcm93XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGV4dFwiO1xuaW1wb3J0IFRleHRTdHlsZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGV4dC1zdHlsZVwiO1xuaW1wb3J0IFVuZGVybGluZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lXCI7XG5pbXBvcnQgSGlnaGxpZ2h0IGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1oaWdobGlnaHRcIjtcbmltcG9ydCB7XG4gICAgQ2hlY2tlZExpc3QsXG4gICAgTGVhZCxcbiAgICBDdXN0b21MaW5rLFxuICAgIEN1c3RvbUltYWdlLFxuICAgIEN1c3RvbVRleHRBbGlnbixcbiAgICBTbWFsbCxcbiAgICBHcmlkLFxuICAgIEdyaWRDb2x1bW4sXG4gICAgR3JpZEJ1aWxkZXIsXG4gICAgR3JpZEJ1aWxkZXJDb2x1bW4sXG4gICAgTWVyZ2VUYWcsXG4gICAgWW91dHViZSxcbiAgICBWaW1lbyxcbiAgICBEZXRhaWxzLFxuICAgIERldGFpbHNTdW1tYXJ5LFxuICAgIERldGFpbHNDb250ZW50LFxuICAgIEN1c3RvbUNvZGVCbG9ja0xvd2xpZ2h0LFxuICAgIEh1cmRsZSxcbiAgICBCdWJibGVNZW51LFxuICAgIEZsb2F0aW5nTWVudSxcbiAgICBWaWRlbyxcbiAgICBUaXB0YXBCbG9jayxcbiAgICBEcmFnQW5kRHJvcEV4dGVuc2lvbixcbiAgICBDbGFzc0V4dGVuc2lvbixcbiAgICBJZEV4dGVuc2lvbixcbiAgICBTdHlsZUV4dGVuc2lvbixcbn0gZnJvbSBcIi4vZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHtsb3dsaWdodH0gZnJvbSBcImxvd2xpZ2h0L2xpYi9jb21tb25cIjtcbmltcG9ydCB7IEhleEJhc2UgfSBmcm9tICd2YW5pbGxhLWNvbG9yZnVsL2xpYi9lbnRyeXBvaW50cy9oZXgnO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJsb2Rhc2hcIjtcblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd0aXB0YXAtaGV4LWNvbG9yLXBpY2tlcicsIEhleEJhc2UpO1xuXG5sZXQgY29yZUV4dGVuc2lvbnMgPSB7XG4gICAgYmxvY2txdW90ZTogW0Jsb2NrcXVvdGVdLFxuICAgIGJvbGQ6IFtCb2xkXSxcbiAgICAnYnVsbGV0LWxpc3QnOiBbQnVsbGV0TGlzdF0sXG4gICAgJ2NoZWNrZWQtbGlzdCc6IFtDaGVja2VkTGlzdF0sXG4gICAgY29kZTogW0NvZGVdLFxuICAgICdjb2RlLWJsb2NrJzogW0N1c3RvbUNvZGVCbG9ja0xvd2xpZ2h0LmNvbmZpZ3VyZSh7XG4gICAgICAgIGxvd2xpZ2h0LFxuICAgICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICAgICAgY2xhc3M6IFwiaGxqc1wiLFxuICAgICAgICB9LFxuICAgIH0pXSxcbiAgICBjb2xvcjogW0NvbG9yXSxcbiAgICBkZXRhaWxzOiBbRGV0YWlscywgRGV0YWlsc1N1bW1hcnksIERldGFpbHNDb250ZW50XSxcbiAgICBncmlkOiBbR3JpZCwgR3JpZENvbHVtbl0sXG4gICAgJ2dyaWQtYnVpbGRlcic6IFtHcmlkQnVpbGRlciwgR3JpZEJ1aWxkZXJDb2x1bW5dLFxuICAgIGhlYWRpbmc6IFtIZWFkaW5nLmNvbmZpZ3VyZSh7bGV2ZWxzOiBbMSwgMiwgMywgNCwgNSwgNl19KV0sXG4gICAgaGlnaGxpZ2h0OiBbSGlnaGxpZ2h0XSxcbiAgICBocjogW0hvcml6b250YWxSdWxlXSxcbiAgICBodXJkbGU6IFtIdXJkbGVdLFxuICAgIGl0YWxpYzogW0l0YWxpY10sXG4gICAgbGVhZDogW0xlYWRdLFxuICAgIGxpbms6IFtDdXN0b21MaW5rLmNvbmZpZ3VyZSh7XG4gICAgICAgIG9wZW5PbkNsaWNrOiBmYWxzZSxcbiAgICAgICAgYXV0b2xpbms6IGZhbHNlLFxuICAgICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICAgICAgcmVsOiBudWxsLFxuICAgICAgICAgICAgaHJlZmxhbmc6IG51bGwsXG4gICAgICAgICAgICBjbGFzczogbnVsbCxcbiAgICAgICAgfSxcbiAgICB9KV0sXG4gICAgbWVkaWE6IFtDdXN0b21JbWFnZS5jb25maWd1cmUoe2lubGluZTogdHJ1ZX0pXSxcbiAgICBvZW1iZWQ6IFtZb3V0dWJlLCBWaW1lbywgVmlkZW9dLFxuICAgICdvcmRlcmVkLWxpc3QnOiBbT3JkZXJlZExpc3RdLFxuICAgIHNtYWxsOiBbU21hbGxdLFxuICAgIHN0cmlrZTogW1N0cmlrZV0sXG4gICAgc3Vic2NyaXB0OiBbU3Vic2NyaXB0XSxcbiAgICBzdXBlcnNjcmlwdDogW1N1cGVyc2NyaXB0XSxcbiAgICB0YWJsZTogW1RhYmxlLmNvbmZpZ3VyZSh7cmVzaXphYmxlOiB0cnVlfSksIFRhYmxlSGVhZGVyLCBUYWJsZUNlbGwsIFRhYmxlUm93XSxcbiAgICB1bmRlcmxpbmU6IFtVbmRlcmxpbmVdLFxufTtcblxubGV0IGN1c3RvbUV4dGVuc2lvbnMgPSB3aW5kb3cuVGlwdGFwRWRpdG9yRXh0ZW5zaW9ucyB8fCB7fTtcbmxldCBlZGl0b3JFeHRlbnNpb25zID0gey4uLmNvcmVFeHRlbnNpb25zLCAuLi5jdXN0b21FeHRlbnNpb25zfTtcblxuY29uc3QgbG9jYWxlU3dpdGNoZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0aXZlTG9jYWxlJyk7XG5pZiAobG9jYWxlU3dpdGNoZXIpIHtcbiAgICBsb2NhbGVTd2l0Y2hlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvY2FsZUNoYW5nZSA9IG5ldyBDdXN0b21FdmVudCgnbG9jYWxlQ2hhbmdlJywgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHsgbG9jYWxlOiBsb2NhbGVTd2l0Y2hlci52YWx1ZSB9IH0pO1xuICAgICAgICBsb2NhbGVTd2l0Y2hlci5kaXNwYXRjaEV2ZW50KGxvY2FsZUNoYW5nZSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRpcHRhcCh7XG4gICBzdGF0ZSxcbiAgIHN0YXRlUGF0aCxcbiAgIHRvb2xzID0gW10sXG4gICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgbG9jYWxlID0gJ2VuJyxcbiAgIGZsb2F0aW5nTWVudVRvb2xzID0gW10sXG4gICBwbGFjZWhvbGRlciA9IG51bGwsXG4gICBtZXJnZVRhZ3MgPSBbXSxcbn0pIHtcbiAgICBsZXQgZWRpdG9ycyA9IHdpbmRvdy5maWxhbWVudFRpcHRhcEVkaXRvcnMgfHwge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgbW9kYWxJZDogbnVsbCxcbiAgICAgICAgdG9vbHM6IHRvb2xzLFxuICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgIHN0YXRlUGF0aDogc3RhdGVQYXRoLFxuICAgICAgICBmdWxsU2NyZWVuTW9kZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICBmbG9hdGluZ01lbnVUb29sczogZmxvYXRpbmdNZW51VG9vbHMsXG4gICAgICAgIGdldEV4dGVuc2lvbnMoaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvb2xzID0gdGhpcy50b29scy5tYXAoKHRvb2wpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvb2wgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b29sO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0b29sLmlkO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IGV4dHMgPSBbXG4gICAgICAgICAgICAgICAgRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgVGV4dCxcbiAgICAgICAgICAgICAgICBQYXJhZ3JhcGgsXG4gICAgICAgICAgICAgICAgRHJvcGN1cnNvcixcbiAgICAgICAgICAgICAgICBHYXBjdXJzb3IsXG4gICAgICAgICAgICAgICAgSGFyZEJyZWFrLFxuICAgICAgICAgICAgICAgIEhpc3RvcnksXG4gICAgICAgICAgICAgICAgVGV4dFN0eWxlLFxuICAgICAgICAgICAgICAgIFRpcHRhcEJsb2NrLFxuICAgICAgICAgICAgICAgIERyYWdBbmREcm9wRXh0ZW5zaW9uLFxuICAgICAgICAgICAgICAgIENsYXNzRXh0ZW5zaW9uLFxuICAgICAgICAgICAgICAgIElkRXh0ZW5zaW9uLFxuICAgICAgICAgICAgICAgIFN0eWxlRXh0ZW5zaW9uLFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyICYmICghIGRpc2FibGVkKSkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChQbGFjZWhvbGRlci5jb25maWd1cmUoeyBwbGFjZWhvbGRlciB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0b29scy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZWRpdG9yRXh0ZW5zaW9ucyk7XG4gICAgICAgICAgICAgICAgbGV0IGFsaWdubWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZXMgPSBbJ3BhcmFncmFwaCddO1xuXG4gICAgICAgICAgICAgICAgZXh0cy5wdXNoKEJ1YmJsZU1lbnUuY29uZmlndXJlKHtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luS2V5OiBgZGVmYXVsdEJ1YmJsZU1lbnUke2lkfWAsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuJHJlZnMuZGVmYXVsdEJ1YmJsZU1lbnUsXG4gICAgICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IFs1MDAsMF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFNob3c6ICh7c3RhdGUsIGZyb20sIHRvfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPT09IHRvIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmUoc3RhdGUsICdsaW5rJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ3RhYmxlJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ2ltYWdlJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ29lbWJlZCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmUoc3RhdGUsICd2aW1lbycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmUoc3RhdGUsICd5b3V0dWJlJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ3ZpZGVvJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ3RpcHRhcEJsb2NrJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbG9hdGluZ01lbnVUb29scy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cy5wdXNoKEZsb2F0aW5nTWVudS5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luS2V5OiBgZGVmYXVsdEZsb2F0aW5nTWVudSR7aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuJHJlZnMuZGVmYXVsdEZsb2F0aW5nTWVudSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBbNTAwLDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb2F0aW5nTWVudVRvb2xzLmZvckVhY2goKHRvb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHRvb2xzLmluY2x1ZGVzKHRvb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG9vbHMuZm9yRWFjaCgodG9vbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5cy5pbmNsdWRlcyh0b29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRXh0ZW5zaW9uc1t0b29sXS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFsnb3JkZXJlZC1saXN0JywgJ2J1bGxldC1saXN0JywgJ2NoZWNrZWQtbGlzdCddLmluY2x1ZGVzKHRvb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHMucHVzaChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4dHMuaW5jbHVkZXMoTGlzdEl0ZW0pKSBleHRzLnB1c2goTGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRzLnB1c2goQnViYmxlTWVudS5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbktleTogYHRhYmxlQnViYmxlTWVudSR7aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLiRyZWZzLnRhYmxlQnViYmxlTWVudSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBweU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IFs1MDAsMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRTaG93OiAoe3N0YXRlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBY3RpdmUoc3RhdGUsICd0YWJsZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2wgPT09ICdsaW5rJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cy5wdXNoKEJ1YmJsZU1lbnUuY29uZmlndXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5LZXk6IGBsaW5rQnViYmxlTWVudSR7aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLiRyZWZzLmxpbmtCdWJibGVNZW51LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogWzUwMCwwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNob3c6ICh7c3RhdGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0FjdGl2ZShzdGF0ZSwnbGluaycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cy5wdXNoKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbJ2FsaWduLWxlZnQnLCAnYWxpZ24tcmlnaHQnLCAnYWxpZ24tY2VudGVyJywgJ2FsaWduLWp1c3RpZnknXS5pbmNsdWRlcyh0b29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSBcImFsaWduLWxlZnRcIikgYWxpZ25tZW50cy5wdXNoKCdzdGFydCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSBcImFsaWduLWNlbnRlclwiKSBhbGlnbm1lbnRzLnB1c2goJ2NlbnRlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSBcImFsaWduLXJpZ2h0XCIpIGFsaWdubWVudHMucHVzaCgnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2wgPT09IFwiYWxpZ24tanVzdGlmeVwiKSBhbGlnbm1lbnRzLnB1c2goJ2p1c3RpZnknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9vbHMuaW5jbHVkZXMoXCJoZWFkaW5nXCIpKSB0eXBlcy5wdXNoKCdoZWFkaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1RleHRBbGlnbiA9IGV4dHMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAndGV4dEFsaWduJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYXNUZXh0QWxpZ24gPT09IFwidW5kZWZpbmVkXCIpIGV4dHMucHVzaChDdXN0b21UZXh0QWxpZ24uY29uZmlndXJlKHt0eXBlcywgYWxpZ25tZW50c30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtZXJnZVRhZ3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChNZXJnZVRhZy5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgICAgICBtZXJnZVRhZ3MsXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleHRzO1xuICAgICAgICB9LFxuICAgICAgICBpbml0OiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRFZGl0b3IodGhpcy5zdGF0ZSk7XG5cbiAgICAgICAgICAgIHRoaXMubW9kYWxJZCA9IHRoaXMuJGVsLmNsb3Nlc3QoJ1t4LXJlZj1cIm1vZGFsQ29udGFpbmVyXCJdJyk/LmdldEF0dHJpYnV0ZSgnd2lyZTprZXknKTtcblxuICAgICAgICAgICAgd2luZG93LmZpbGFtZW50VGlwdGFwRWRpdG9ycyA9IGVkaXRvcnM7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQgJiYgKGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImRhdGEteW91dHViZS12aWRlb1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkYXRhLXZpbWVvLXZpZGVvXCIpKSB8fFxuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkYXRhLW5hdGl2ZS12aWRlb1wiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5maXJzdENoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImFsbFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9jYWxlQ2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBldmVudC5kZXRhaWwubG9jYWxlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBzb3J0YWJsZUVsID0gdGhpcy4kZWwucGFyZW50RWxlbWVudC5jbG9zZXN0KFwiW3gtc29ydGFibGVdXCIpO1xuICAgICAgICAgICAgaWYgKHNvcnRhYmxlRWwpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuU29ydGFibGUudXRpbHMub24oc29ydGFibGVFbCwgXCJzdGFydFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlZGl0b3JzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpcHRhcC13cmFwcGVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgZWRpdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5feF9kYXRhU3RhY2tbMF0uZWRpdG9yKCkuc2V0RWRpdGFibGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLl94X2RhdGFTdGFja1swXS5lZGl0b3IoKS5vcHRpb25zLmVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cuU29ydGFibGUudXRpbHMub24oc29ydGFibGVFbCwgXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWRpdG9ycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aXB0YXAtd3JhcHBlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvcnMuZm9yRWFjaChmdW5jdGlvbiAoZWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuX3hfZGF0YVN0YWNrWzBdLmVkaXRvcigpLnNldEVkaXRhYmxlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLl94X2RhdGFTdGFja1swXS5lZGl0b3IoKS5vcHRpb25zLmVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy4kd2F0Y2goJ3N0YXRlJywgKG5ld1N0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcigpLmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEVkaXRvcihuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCEgaXNFcXVhbChvbGRTdGF0ZSwgdGhpcy5lZGl0b3IoKS5zdGF0ZS5kb2MudG9KU09OKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRWRpdG9yQ29udGVudChuZXdTdGF0ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuZGVzdHJveSgpO1xuICAgICAgICB9LFxuICAgICAgICBlZGl0b3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gZWRpdG9yc1t0aGlzLnN0YXRlUGF0aF07XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRFZGl0b3IoY29udGVudCkge1xuICAgICAgICAgICAgaWYgKGVkaXRvcnNbdGhpcy5zdGF0ZVBhdGhdKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZWRpdG9yKCkuZ2V0SlNPTigpO1xuICAgICAgICAgICAgICAgIGVkaXRvcnNbdGhpcy5zdGF0ZVBhdGhdLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZWRpdG9yc1t0aGlzLnN0YXRlUGF0aF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIGVkaXRvcnNbdGhpcy5zdGF0ZVBhdGhdID0gbmV3IEVkaXRvcih7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy4kcmVmcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZ2V0RXh0ZW5zaW9ucyh0aGlzLnN0YXRlUGF0aCksXG4gICAgICAgICAgICAgICAgZWRpdGFibGU6ICF0aGlzLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgZWRpdG9yUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFzdGUodmlldywgZXZlbnQsIHNsaWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGljZS5jb250ZW50LmRlc2NlbmRhbnRzKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUubmFtZSA9PT0gJ3RpcHRhcEJsb2NrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJzLnN0YXRlUGF0aCA9IF90aGlzLnN0YXRlUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJzLmRhdGEgPSBKU09OLnBhcnNlKG5vZGUuYXR0cnMuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25VcGRhdGUoe2VkaXRvcn0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3RhdGUgPSBlZGl0b3IuaXNFbXB0eSA/IG51bGwgOiBlZGl0b3IuZ2V0SlNPTigpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb25VcGRhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkJsdXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkZvY3VzKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRWRpdG9yQ29udGVudChjb250ZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IoKS5pc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2Zyb20sIHRvfSA9IHRoaXMuZWRpdG9yKCkuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY29tbWFuZHMuc2V0Q29udGVudChjb250ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5zZXRUZXh0U2VsZWN0aW9uKHtmcm9tLCB0b30pLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWZyZXNoRWRpdG9yQ29udGVudCgpIHtcbiAgICAgICAgICAgIC8vIFVzaW5nICRuZXh0VGljayB0byBkZWxheSB0aGUgVUkgdXBkYXRlIGFmdGVyIHRoZSBlbnRhbmdsZWQgc3RhdGUgdXBkYXRlcy5cbiAgICAgICAgICAgIC8vIFRoaXMgbWF0dGVycyB3aGVuIHRoZSBtZXRob2QgaXMgdHJpZ2dlcmVkIGFzIHBhcnQgb2YgYSBiYXRjaGVkIHJlcXVlc3QuXG4gICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLnVwZGF0ZUVkaXRvckNvbnRlbnQodGhpcy5zdGF0ZSkpO1xuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRDb250ZW50KGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCAhPT0gdGhpcy5zdGF0ZVBhdGgpIHJldHVyblxuXG4gICAgICAgICAgICBzd2l0Y2goZXZlbnQuZGV0YWlsLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYSc6IHRoaXMuaW5zZXJ0TWVkaWEoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW8nOiB0aGlzLmluc2VydFZpZGVvKGV2ZW50KTsgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmsnOiB0aGlzLmluc2VydExpbmsoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnc291cmNlJzogdGhpcy5pbnNlcnRTb3VyY2UoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnZ3JpZCc6IHRoaXMuaW5zZXJ0R3JpZEJ1aWxkZXIoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRNZWRpYShldmVudCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQuZGV0YWlsLm1lZGlhKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbC5tZWRpYS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU1lZGlhSW5zZXJ0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVNZWRpYUluc2VydChldmVudC5kZXRhaWwubWVkaWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBleGVjdXRlTWVkaWFJbnNlcnQobWVkaWEgPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISBtZWRpYSB8fCBtZWRpYT8udXJsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBtZWRpYT8udXJsIHx8IG1lZGlhPy5zcmM7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VUeXBlcyA9IFsnanBnJywgJ2pwZWcnLCAnc3ZnJywgJ3BuZycsICd3ZWJwJ107XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC8uKlxcLihbYS16QS1aXSopXFw/Py87XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHNyYyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwgJiYgaW1hZ2VUeXBlcy5pbmNsdWRlcyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNoYWluKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogbWVkaWE/LmFsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbWVkaWE/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBtZWRpYT8ud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBtZWRpYT8uaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenk6IG1lZGlhPy5sYXp5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ydW4oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5leHRlbmRNYXJrUmFuZ2UoJ2xpbmsnKS5zZXRMaW5rKHsgaHJlZjogc3JjIH0pLmluc2VydENvbnRlbnQobWVkaWE/LmxpbmtfdGV4dCkucnVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRWaWRlbyhldmVudCkge1xuICAgICAgICAgICAgbGV0IHZpZGVvID0gZXZlbnQuZGV0YWlsLnZpZGVvO1xuXG4gICAgICAgICAgICBpZiAoISB2aWRlbyB8fCB2aWRlby51cmwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb21tb25PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHNyYzogdmlkZW8udXJsLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB2aWRlby5yZXNwb25zaXZlID8gdmlkZW8ud2lkdGggKiAxMDAgOiB2aWRlby53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHZpZGVvLnJlc3BvbnNpdmUgPyB2aWRlby5oZWlnaHQgKiAxMDAgOiB2aWRlby5oZWlnaHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2l2ZTogdmlkZW8ucmVzcG9uc2l2ZSA/PyB0cnVlLFxuICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IHZpZGVvLndpZHRoLFxuICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC1oZWlnaHQnOiB2aWRlby5oZWlnaHQsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2aWRlby51cmwuaW5jbHVkZXMoJ3lvdXR1YmUnKSB8fCB2aWRlby51cmwuaW5jbHVkZXMoJ3lvdXR1LmJlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5zZXRZb3V0dWJlVmlkZW8oe1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sczogdmlkZW8ueW91dHViZV9vcHRpb25zLmluY2x1ZGVzKCdjb250cm9scycpLFxuICAgICAgICAgICAgICAgICAgICBub2Nvb2tpZTogdmlkZW8ueW91dHViZV9vcHRpb25zLmluY2x1ZGVzKCdub2Nvb2tpZScpLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdmlkZW8uc3RhcnRfYXQgPz8gMCxcbiAgICAgICAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW8udXJsLmluY2x1ZGVzKCd2aW1lbycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jaGFpbigpLmZvY3VzKCkuc2V0VmltZW9WaWRlbyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbW1vbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5OiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdhdXRvcGxheScpLFxuICAgICAgICAgICAgICAgICAgICBsb29wOiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdsb29wJyksXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdzaG93X3RpdGxlJyksXG4gICAgICAgICAgICAgICAgICAgIGJ5bGluZTogdmlkZW8udmltZW9fb3B0aW9ucy5pbmNsdWRlcygnYnlsaW5lJyksXG4gICAgICAgICAgICAgICAgICAgIHBvcnRyYWl0OiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdwb3J0cmFpdCcpLFxuICAgICAgICAgICAgICAgIH0pLnJ1bigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5zZXRWaWRlbyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbW1vbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5OiB2aWRlby5uYXRpdmVfb3B0aW9ucy5pbmNsdWRlcygnYXV0b3BsYXknKSxcbiAgICAgICAgICAgICAgICAgICAgbG9vcDogdmlkZW8ubmF0aXZlX29wdGlvbnMuaW5jbHVkZXMoJ2xvb3AnKSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHM6IHZpZGVvLm5hdGl2ZV9vcHRpb25zLmluY2x1ZGVzKCdjb250cm9scycpLFxuICAgICAgICAgICAgICAgIH0pLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRMaW5rKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGV2ZW50LmRldGFpbDtcblxuICAgICAgICAgICAgaWYgKGxpbmsuaHJlZiA9PT0gbnVsbCAmJiBsaW5rLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluay5ocmVmID09PSAnJyAmJiBsaW5rLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnNldExpbmsoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lZGl0b3IoKVxuICAgICAgICAgICAgICAgIC5jaGFpbigpXG4gICAgICAgICAgICAgICAgLmZvY3VzKClcbiAgICAgICAgICAgICAgICAuZXh0ZW5kTWFya1JhbmdlKCdsaW5rJylcbiAgICAgICAgICAgICAgICAuc2V0TGluayh7XG4gICAgICAgICAgICAgICAgICAgIGhyZWY6IGxpbmsuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGxpbmsuaWQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBsaW5rLnRhcmdldCA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICBocmVmbGFuZzogbGluay5ocmVmbGFuZyA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZWw6IGxpbmsucmVsID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlZmVycmVycG9saWN5OiBsaW5rLnJlZmVycmVycG9saWN5ID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGFzX2J1dHRvbjogbGluay5hc19idXR0b24gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uX3RoZW1lOiBsaW5rLmJ1dHRvbl90aGVtZSA/PyBudWxsLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNlbGVjdFRleHRibG9ja0VuZCgpXG4gICAgICAgICAgICAgICAgLnJ1bigpO1xuICAgICAgICB9LFxuICAgICAgICB1bnNldExpbmsoKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3IoKS5jaGFpbigpLmZvY3VzKCkuZXh0ZW5kTWFya1JhbmdlKCdsaW5rJykudW5zZXRMaW5rKCkuc2VsZWN0VGV4dGJsb2NrRW5kKCkucnVuKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNvdXJjZShldmVudCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFZGl0b3JDb250ZW50KGV2ZW50LmRldGFpbC5zb3VyY2UpO1xuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRHcmlkQnVpbGRlcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGdyaWQgPSBldmVudC5kZXRhaWwuZGF0YTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gJ3Jlc3BvbnNpdmUnO1xuICAgICAgICAgICAgY29uc3QgYXN5bW1ldHJpY0xlZnQgPSBwYXJzZUludChncmlkLmFzeW1tZXRyaWNfbGVmdCkgPz8gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGFzeW1tZXRyaWNSaWdodCA9IHBhcnNlSW50KGdyaWQuYXN5bW1ldHJpY19yaWdodCkgPz8gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGdyaWQuZml4ZWQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ2ZpeGVkJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyaWQuYXN5bW1ldHJpYykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnYXN5bW1ldHJpYyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY2hhaW4oKS5mb2N1cygpLmluc2VydEdyaWRCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBjb2xzOiBncmlkLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBzdGFja0F0OiBncmlkLnN0YWNrX2F0LFxuICAgICAgICAgICAgICAgIGFzeW1tZXRyaWNMZWZ0LFxuICAgICAgICAgICAgICAgIGFzeW1tZXRyaWNSaWdodFxuICAgICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydEJsb2NrKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCAhPT0gdGhpcy5zdGF0ZVBhdGgpIHJldHVyblxuXG4gICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNvbW1hbmRzLmluc2VydEJsb2NrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBldmVudC5kZXRhaWwudHlwZSxcbiAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IGV2ZW50LmRldGFpbC5zdGF0ZVBhdGgsXG4gICAgICAgICAgICAgICAgZGF0YTogZXZlbnQuZGV0YWlsLmRhdGEsXG4gICAgICAgICAgICAgICAgcHJldmlldzogZXZlbnQuZGV0YWlsLnByZXZpZXcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGV2ZW50LmRldGFpbC5sYWJlbCxcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlczogZXZlbnQuZGV0YWlsLmNvb3JkaW5hdGVzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghIHRoaXMuZWRpdG9yKCkuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jb21tYW5kcy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRNZXJnZVRhZyhldmVudCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jb21tYW5kcy5pbnNlcnRNZXJnZVRhZyh7XG4gICAgICAgICAgICAgICAgdGFnOiBldmVudC5kZXRhaWwudGFnLFxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBldmVudC5kZXRhaWwuY29vcmRpbmF0ZXMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCEgdGhpcy5lZGl0b3IoKS5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNvbW1hbmRzLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9wZW5CbG9ja1NldHRpbmdzKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCAhPT0gdGhpcy5zdGF0ZVBhdGgpIHJldHVyblxuXG4gICAgICAgICAgICB0aGlzLiR3aXJlLmRpc3BhdGNoRm9ybUV2ZW50KFwidGlwdGFwOjp1cGRhdGVCbG9ja1wiLCB0aGlzLnN0YXRlUGF0aCwgZXZlbnQuZGV0YWlsKTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlQmxvY2soZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kZXRhaWwuc3RhdGVQYXRoICE9PSB0aGlzLnN0YXRlUGF0aCkgcmV0dXJuXG5cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY29tbWFuZHMudXBkYXRlQmxvY2soe1xuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRldGFpbC50eXBlLFxuICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCxcbiAgICAgICAgICAgICAgICBkYXRhOiBldmVudC5kZXRhaWwuZGF0YSxcbiAgICAgICAgICAgICAgICBwcmV2aWV3OiBldmVudC5kZXRhaWwucHJldmlldyxcbiAgICAgICAgICAgICAgICBsYWJlbDogZXZlbnQuZGV0YWlsLmxhYmVsLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghIHRoaXMuZWRpdG9yKCkuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jb21tYW5kcy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkZWxldGVCbG9jaygpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY29tbWFuZHMucmVtb3ZlQmxvY2soKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFFQSxhQUFTQSxZQUFXLEtBQUs7QUFDdkIsVUFBSSxlQUFlLEtBQUs7QUFDdEIsWUFBSSxRQUNGLElBQUksU0FDSixJQUFJLE1BQ0YsV0FBWTtBQUNWLGdCQUFNLElBQUksTUFBTSxrQkFBa0I7QUFBQSxRQUNwQztBQUFBLE1BQ04sV0FBVyxlQUFlLEtBQUs7QUFDN0IsWUFBSSxNQUNGLElBQUksUUFDSixJQUFJLFNBQ0YsV0FBWTtBQUNWLGdCQUFNLElBQUksTUFBTSxrQkFBa0I7QUFBQSxRQUNwQztBQUFBLE1BQ047QUFHQSxhQUFPLE9BQU8sR0FBRztBQUVq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QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUMxRSxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDMUUsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQ2hELFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDbkMsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQ3RCLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUN0QixRQUFRO0FBQUE7QUFBQSxRQUVSLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFN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QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFDUDtBQUVPLElBQUksUUFBUTtBQUFBLEVBQ2pCLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNM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QSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUdBLFFBQU0saUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhO0FBQUEsSUFDakI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxpQkFBaUI7QUFBQSxJQUNyQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNQyxZQUFXO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBR0EsUUFBTSxXQUFXLENBQUUsU0FBVTtBQUU3QixRQUFNLGVBQWU7QUFBQSxJQUNuQixNQUFNO0FBQUEsSUFD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QTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVUsVUFBVSxJQUFJO0FBRTlCLFFBQU07QUFBQTtBQUFBLElBQXlDLFFBQVE7QUFBQTtBQUV2RCxNQUFJLE9BQU87QUFBQSxJQUNULEdBQUcsSUFBSTtBQUFBLElBQ1AsR0FBRyxXQUFXO0FBQUEsRUFDaEI7QUFDQSxNQUFJLFVBQVU7QUFBQSxJQUNaLEdBQUcsSUFBSTtBQUFBLElBQ1AsR0FBRyxXQUFXO0FBQUEsRUFDaEI7QUFD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QyxZQUFXO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBR0EsUUFBTSxZQUFZLEVBQUUsT0FBTyxpQkFBaUI7QUFHNUMsUUFBTSxrQkFBa0I7QUFBQSxJQUN0QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0saUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGdCQUFnQjtBQUFBLElBQ3BCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGlCQUFpQjtBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxJQUVBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sU0FBUyxDQUFFLElBQUs7QUFBQSxJQUNoQixVQUFVO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixTQUFTRDtBQUFBLE1BQ1QsU0FBU0M7QUFBQSxNQUNULFVBQVU7QUFBQSxRQUNSLEdBQUc7QUFBQSxRQUNILEdBQUc7QUFBQTtBQUFBLFFBRUg7QUFBQSxRQUNBO0FBQUEsUUFDQSxHQUFHO0FBQUEsUUFDSCxHQUFHO0FBQUEsTUFDTDtBQUFBLElBQ0Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSO0FBQUE7QUFBQSxNQUNBLEtBQUssUUFBUTtBQUFBO0FBQUEsTUFDYjtBQUFBLE1BQ0E7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QUMzWEEsU0FBUyxFQUFFLE1B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QUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFHQSxRQUFNLGlCQUFpQjtBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYTtBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0saUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTUMsWUFBVztBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUdBLFFBQU0sV0FBVyxDQUFFLFNBQVU7QUFFN0IsUUFBTSxlQUFlO0FBQUEsSUFDbkIsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsU0FBU0E7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmO0FBRUEsUUFBTSxvQkFBb0I7QUFBQSxJQUN4QixXQUFXO0FBQUEsSUFDWCxXQUFXO0FBQUEsSUFDWCxVQUFVO0FBQUE7QUFBQSxNQUVSLE9BQU87QUFBQSxJQUFlO0FBQUEsSUFDeEIsT0FBTyxNQUFNO0FBQUEsTUFDWDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxLQUFLO0FBQUEsTUFDTCxNQUFNLFVBQVUsa0JBQWtCO0FBQUEsSUFBQztBQUFBLEVBQ3ZDO0FBRUEsUUFBTSxzQkFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQUY7QUFBQSxJQUNBLEtBQUs7QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSXpCLFVBQVU7QUFBQSxNQUNSO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUCxLQUFLO0FBQUEsTUFDUDtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU87QUFBQSxRQUNQLEtBQUs7QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLFFBQ0UsZUFBZTtBQUFBLFFBQ2YsS0FBSztBQUFBLE1BQ1A7QUFBQSxJQUNGO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixVQUFVLG9CQUFvQixPQUFPO0FBQUEsTUFDbkM7QUFBQSxRQUNFLE9BQU87QUFBQSxRQUNQLEtBQUs7QUFBQSxRQUNMLFVBQVU7QUFBQSxRQUNWLFVBQVUsb0JBQW9CLE9BQU8sQ0FBRSxNQUFPLENBQUM7QUFBQSxRQUMvQyxXQUFXO0FBQUEsTUFDYjtBQUFBLElBQ0YsQ0FBQztBQUFBLElBQ0QsV0FBVztBQUFBLEVBQ2I7QUFFQSxRQUFNLHVCQUF1QjtBQUFBLElBQzNCLFdBQVc7QUFBQSxJQUNYLE9BQU8sTUFBTSxtQkFBbUIsaUJBQWlCO0FBQUEsSUFDakQsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLElBQ0wsWUFBWTtBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLE1BQ1I7QUFBQTtBQUFBLFFBQ0UsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBLFFBQ1YsV0FBVztBQUFBLE1BQ2I7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUCxhQUFhO0FBQUEsUUFDYixVQUFVLENBQUVDLFdBQVc7QUFBQSxRQUN2QixXQUFXO0FBQUEsTUFDYjtBQUFBO0FBQUE7QUFBQSxNQUdBO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUCxXQUFXO0FBQUEsTUFDYjtBQUFBO0FBQUEsTUFFQTtBQUFBLFFBQ0UsT0FBTztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsUUFDaEIsVUFBVTtBQUFBLFVBQ1I7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQTtBQUFBO0FBQUEsTUFHQTtBQUFBLFFBQ0UsV0FBVztBQUFBLFFBQ1gsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBO0FBQUEsUUFDRSxXQUFXO0FBQUEsUUFDWCxPQUFPO0FBQUEsUUFDUCxLQUFLO0FBQUEsUUFDTCxVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxVQUFVO0FBQUEsVUFDUkQ7QUFBQSxVQUNBLEtBQUs7QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQTtBQUFBLFVBRUE7QUFBQSxZQUNFLE9BQU87QUFBQSxZQUNQLEtBQUs7QUFBQSxZQUNMLFVBQVU7QUFBQSxZQUNWLFdBQVc7QUFBQSxZQUNYLFVBQVU7QUFBQSxjQUNSO0FBQUEsY0FDQUE7QUFBQSxjQUNBLEtBQUs7QUFBQSxjQUNMO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0FBO0FBQUEsTUFDQSxLQUFLO0FBQUEsTUFDTDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLE1BQ1A7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixTQUFTO0FBQUEsSUFDVCxrQkFBa0IsRUFBRSxxQkFBcUIsV0FBVztBQUFBLElBQ3BELFVBQVUsQ0FBQyxFQUFFO0FBQUEsTUFDWDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxRQUNFO0FBQUEsUUFDQTtBQUFBO0FBQUEsVUFDRSxPQUFPO0FBQUEsVUFDUCxLQUFLO0FBQUEsVUFDTCxVQUFVO0FBQUEsVUFDVixVQUFVO0FBQUEsWUFDUjtBQUFBLFlBQ0E7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE9BQU8sS0FBSyxXQUFXO0FBQUEsVUFDdkIsVUFBVTtBQUFBLFFBQ1o7QUFBQSxRQUNBO0FBQUEsVUFDRSxPQUFPO0FBQUE7QUFBQSxZQUVMO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGO0FBQUEsVUFDQSxXQUFXO0FBQUEsWUFDVCxHQUFHO0FBQUEsWUFDSCxHQUFHO0FBQUEsVUFDTDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFBQztBQUFBLEVBQ0w7QUFDRjs7O0FDNWlCQSxTQUFTLE9BQU8sTUFBTTtBQUNwQixRQUFNLG9CQUFvQjtBQUFBLElBQ3hCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLHFCQUFxQjtBQUFBLElBQ3pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTSxtQkFBbUI7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLGtCQUFrQjtBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTSxzQkFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFD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QUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFFQSxJQUFNLGlCQUFpQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR0EsSUFBTSxpQkFBaUI7QUFBQSxFQUNyQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQ0Y7QUFHQSxJQUFNLGtCQUFrQjtBQUFBLEVBQ3RCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBRUEsSUFBTSxhQUFhO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtB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QUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsU0FBUTtBQUFBLElBQ1o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0sTUFBTTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsWUFBVztBQUFBLElBQ2YsU0FBUztBQUFBLElBQ1QsTUFBTUQ7QUFBQSxJQUNOLFNBQVNGO0FBQUEsSUFDVCxVQUFVQztBQUFBLEVBQ1o7QUFDQSxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixTQUFTLENBQUUsUUFBUztBQUFBLElBQ3BCLFVBQVVFO0FBQUEsSUFDVixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsTUFDUixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTDtBQUFBLFFBQ0UsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFVBQ1IsS0FBSztBQUFBLFVBQ0ws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Y0FDUjtBQUFBLGNBQ0EsS0FBSztBQUFBLGNBQ0wsS0FBSztBQUFBLGNBQ0w7QUFBQSxjQUNBLEtBQUs7QUFBQSxZQUNQO0FBQUEsVUFDRjtBQUFBLFVBQ0EsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFFBQ1A7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QUM3UkEsSUFBTUMsWUFBVztBQUNqQixJQUFNLFdBQVc7QUFBQSxFQUNmO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxJQUFNLFdBQVc7QUFBQSxFQUNmO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU0sUUFBUTtBQUFBO0FBQUEsRUFFWjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBRUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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QSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUVBLElBQU1DLGtCQUFpQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR0EsSUFBTUMsa0JBQWlCO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUNGO0FBR0EsSUFBTUMsbUJBQWtCO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFFQSxJQUFNQyxjQUFhO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFHRixFQUFFLFFBQVE7QUFHVixJQUFNLG1CQUFtQkYsZ0JBQWUs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LFVBQVU7QUFBQSxNQUNSO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjs7O0FDdE9BLFNBQVMsV0FBVyxNQUFNO0FBQ3hCLFFBQU0sWUFBWTtBQUFBLElBQ2hCLFdBQVc7QUFBQSxJQUNYLE9BQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTUUsU0FBUTtBQUFBLElBQ1o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLE1BQU07QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsWUFBVztBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU1DLGFBQVk7QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsWUFBVztBQUFBLElBQ2YscUJBQXFCO0FBQUEsTUFDbkI7QUFB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QUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUdBLFFBQU0sa0JBQWtCO0FBQ3hCLFFBQU0sZ0JBQWdCO0FBQUEsSUFDcEIs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QUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTUMsYUFBWTtBQUFBO0FBQUE7QUFBQSxJQUdoQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFB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QUFNLFdBQVc7QUFBQTtBQUFBLElBRWY7QUFBQTtBQUFBLElBRUE7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNQyxTQUFRO0FBQUEsSUFDWjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixTQUFTLENBQUUsSUFBSztBQUFBLElBQ2hCLFVBQVU7QUFBQSxNQUNSLFVBQVUsS0FBSyxXQUFXO0FBQUEsTUFDMUIsTUFBTUE7QUFBQSxNQUNOLFNBQVNGO0FBQUEsTUFDVCxTQUFTQztBQUFBLE1BQ1QsVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxNQUNSLEtBQUs7QUFBQSxNQUNMLEtBQUssUUFBUSxRQUFRLFFBQVEsRUFBRSxVQUFVLENBQUUsTUFBTyxFQUFFLENBQUM7QUFBQSxNQUNyRCxLQUFLLFFBQVEsS0FBSyxtQkFBbUI7QUFBQSxRQUNuQyxPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQUEsTUFDRDtBQUFBLFFBQ0UsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFVBQ1IsRUFBRSxPQUFPLDJCQUEyQjtBQUFBLFVBQ3BDLEVBQUUsT0FBTyxrQ0FBa0M7QUFBQSxRQUM3QztBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsUUFDRSxXQUFXO0FBQUEsUUFDWCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0E7QUFBQSxRQUNFLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxVQUNSLEVBQUUsT0FBTyxrQkFBa0IsY0FBYztBQUFBLFVBQ3pDLEVBQUUsT0FBTyxtQkFBbUIsY0FBYztBQUFBLFVBQzFDLEVBQUUsT0FBTyx5QkFBeUIsY0FBYztBQUFBLFVBQ2hELEVBQUUsT0FBTyxvREFDRSxjQUFjO0FBQUEsUUFDM0I7QUFBQSxRQUNBLFdBQVc7QUFBQSxNQUNiO0FBQUEsTUFDQTtBQUFBLFFBQ0UsT0FBTztBQUFBLFVBQ0w7QUFBQSxVQUNBO0FBQUEsVUFDQSxLQUFLO0FBQUEsUUFDUDtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1QsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFFBQ0w7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLFFBQ0UsV0FBVztBQUFBLFFBQ1gsT0FBTztBQUFBLFFBQ1AsS0FBSztBQUFBLFFBQ0wsVUFBVTtBQUFBLFVBQ1I7QUFBQSxZQUNFLFdBQVc7QUFBQSxZQUNYLE9BQU87QUFBQSxZQUNQLEtBQUs7QUFBQSxVQUNQO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPO0FBQUEsVUFDTDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxLQUFLO0FBQUEsUUFDUDtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1QsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFFBQ0w7QUFBQSxNQUNGO0FBQUE7QUFBQSxNQUVBO0FBQUEsUUFDRSxPQUFPO0FBQUEsVUFDTDtBQUFBLFVBQ0E7QUFBQSxVQUNBLEtBQUs7QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxRQUNMO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU87QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFVBQ0EsS0FBSztBQUFBLFFBQ1A7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxRQUNMO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU87QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFVBQ0EsS0FBSztBQUFBLFFBQ1A7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxRQUNMO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU8sS0FBSyxXQUFXO0FBQUEsUUFDdkIsVUFBVTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsTUFBTUM7QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLFdBQVc7QUFBQSxRQUNYLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQzdTQSxJQUFNQyxTQUFRLENBQUMsU0FBUztBQUN0QixTQUFPO0FBQUEsSUFDTCxXQUFXO0FBQUEsTUFDVCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsZUFBZSxLQUFLO0FBQUEsSUFDcEIsVUFBVTtBQUFBLE1BQ1IsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLG1CQUFtQjtBQUFBLE1BQ2pCLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSx5QkFBeUI7QUFBQSxNQUN2QixPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxLQUFLO0FBQUEsTUFDTCxTQUFTO0FBQUEsTUFDVCxVQUFVO0FBQUEsUUFDUixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLE1BQ2YsT0FBTztBQUFBLE1BQ1AsT0FBTyxLQUFLLFlBQVk7QUFBQSxNQVN4QixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFNQyxRQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFFQSxJQUFNQyxrQkFBaUI7QUFBQSxFQUNyQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBRUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU1DLGtCQUFpQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFDRjtBQUdBLElBQU1DLG1CQUFrQjtBQUFBLEVBQ3RCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBRUEsSUFBTUMsY0FBYTtBQUFBLEVBQ2pCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FB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QTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUtBLFFBQU0scUJBQXFCO0FBQUEsSUFDekI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBR0EsUUFBTSwwQkFBMEI7QUFB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QSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFDRjtBQU1BLElBQU0sV0FBVztBQUFBLEVBQ2Y7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR0EsSUFBTSwwQkFBMEI7QUFBQSxFQUM5QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBSUEsSUFBTSxxQkFBcUI7QUFBQSxFQUN6QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU0sV0FBVztBQUFBLEVBQ2Y7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU0sZUFBZUU7QUFBQSxFQUNuQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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QUFBLEVBSUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxJQUFNQyxZQUFXO0FBQUEsRUFDZjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFHQSxJQUFNQyxTQUFRO0FBQUE7QUFBQSxFQUVaO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBRUE7QUFBQTtBQUFBLEVBRUE7QUFDRjtBQUVBLElBQU1DLGVBQWM7QUFBQSxFQUNsQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUVBLElBQU1DLG9CQUFtQjtBQUFBLEVBQ3ZCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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TUFDakM7QUFBQSxJQUNKO0FBQUEsSUFDQSxrQkFBa0IsT0FBTztBQUNyQixVQUFJLE1BQU0sT0FBTyxjQUFjLEtBQUs7QUFBVztBQUUvQyxXQUFLLE1BQU0sa0JBQWtCLHVCQUF1QixLQUFLLFdBQVcsTUFBTSxNQUFNO0FBQUEsSUFDcEY7QUFBQSxJQUNBLFlBQVksT0FBTztBQUNmLFVBQUksTUFBTSxPQUFPLGNBQWMsS0FBSztBQUFXO0FBRS9DLFdBQUssT0FBTyxFQUFFLFNBQVMsWUFBWTtBQUFBLFFBQy9CLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDbkIsV0FBVyxNQUFNLE9BQU87QUFBQSxRQUN4QixNQUFNLE1BQU0sT0FBTztBQUFBLFFBQ25CLFNBQVMsTUFBTSxPQUFPO0FBQUEsUUFDdEIsT0FBTyxNQUFNLE9BQU87QUFBQSxNQUN4QixDQUFDO0FBRUQsVUFBSSxDQUFFLEtBQUssT0FBTyxFQUFFLFdBQVc7QUFDM0IsYUFBSyxPQUFPLEVBQUUsU0FBUyxNQUFNO0FBQUEsTUFDakM7QUFBQSxJQUNKO0FBQUEsSUFDQSxjQUFjO0FBQ1YsV0FBSyxPQUFPLEVBQUUsU0FBUyxZQUFZO0FBQUEsSUFDdkM7QUFBQSxFQUNKO0FBQ0o7IiwKICAibmFtZXMiOiBbImRlZXBGcmVlemUiLCAiUmVzcG9uc2UiLCAiZXNjYXBlSFRNTCIsICJpbmhlcml0JDEiLCAiU1BBTl9DTE9TRSIsICJlbWl0c1dyYXBwaW5nVGFncyIsICJzY29wZVRvQ1NTQ2xhc3MiLCAiSFRNTFJlbmRlcmVyIiwgIm5ld05vZGUiLCAiVG9rZW5UcmVlIiwgIlRva2VuVHJlZUVtaXR0ZXIiLCAic291cmNlIiwgImxvb2thaGVhZCIsICJjb25jYXQiLCAiYW55TnVtYmVyT2ZUaW1lcyIsICJvcHRpb25hbCIsICJzdHJpcE9wdGlvbnNGcm9tQXJncyIsICJlaXRoZXIiLCAiY291bnRNYXRjaEdyb3VwcyIsICJzdGFydHNXaXRoIiwgIkJBQ0tSRUZfUkUiLCAiX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyIsICJvZmZzZXQiLCAiTUFUQ0hfTk9USElOR19SRSIsICJJREVOVF9SRSIsICJVTkRFUlNDT1JFX0lERU5UX1JFIiwgIk5VTUJFUl9SRSIsICJDX05VTUJFUl9SRSIsICJCSU5BUllfTlVNQkVSX1JFIiwgIlJFX1NUQVJURVJTX1JFIiwgIlNIRUJBTkciLCAiQkFDS1NMQVNIX0VTQ0FQRSIsICJBUE9TX1NUUklOR19NT0RFIiwgIlFVT1RFX1NUUklOR19NT0RFIiwgIlBIUkFTQUxfV09SRFNfTU9ERSIsICJDT01NRU5UIiwgImVuZCIsICJDX0xJTkVfQ09NTUVOVF9NT0RFIiwgIkNfQkxPQ0tfQ09NTUVOVF9NT0RFIiwgIkhBU0hfQ09NTUVOVF9NT0RFIiwgIk5VTUJFUl9NT0RFIiwgIkNfTlVNQkVSX01PREUiLCAiQklOQVJZX05VTUJFUl9NT0RFIiwgIlJFR0VYUF9NT0RFIiwgIlRJVExFX01PREUiLCAiVU5ERVJTQ09SRV9USVRMRV9NT0RFIiwgIk1FVEhPRF9HVUFSRCIsICJFTkRfU0FNRV9BU19CRUdJTiIsICJNT0RFUyIsICJza2lwSWZIYXNQcmVjZWRpbmdEb3QiLCAic2NvcGVDbGFzc05hbWUiLCAiYmVnaW5LZXl3b3JkcyIsICJjb21waWxlSWxsZWdhbCIsICJjb21waWxlTWF0Y2giLCAiY29tcGlsZVJlbGV2YW5jZSIsICJiZWZvcmVNYXRjaEV4dCIsICJDT01NT05fS0VZV09SRFMiLCAiREVGQVVMVF9LRVlXT1JEX1NDT1BFIiwgImNvbXBpbGVLZXl3b3JkcyIsICJzY29wZU5hbWUiLCAic2NvcmVGb3JLZXl3b3JkIiwgImNvbW1vbktleXdvcmQiLCAic2VlbkRlcHJlY2F0aW9ucyIsICJlcnJvciIsICJ3YXJuIiwgImRlcHJlY2F0ZWQiLCAidmVyc2lvbiIsICJNdWx0aUNsYXNzRXJyb3IiLCAicmVtYXBTY29wZU5hbWVzIiwgImJlZ2luTXVsdGlDbGFzcyIsICJlbmRNdWx0aUNsYXNzIiwgInNjb3BlU3VnYXIiLCAiTXVsdGlDbGFzcyIsICJjb21waWxlTGFuZ3VhZ2UiLCAiZ2xvYmFsIiwgImkiLCAiYyIsICJleHBhbmRPckNsb25lTW9kZSIsICJkZXBlbmRlbmN5T25QYXJlbnQiLCAiSFRNTEluamVjdGlvbkVycm9yIiwgImVzY2FwZSIsICJpbmhlcml0IiwgIk5PX01BVENIIiwgIk1BWF9LRVlXT1JEX0hJVFMiLCAiSExKUyIsICJoaWdobGlnaHQiLCAiZmlyZSIsICJ0b3AiLCAicmVzdWx0IiwgImhpZ2hsaWdodEF1dG8iLCAibWF4IiwgInBsYWludGV4dCIsICJyZWdpc3Rlckxhbmd1YWdlIiwgImxpc3RMYW5ndWFnZXMiLCAiZm9ybWF0IiwgImMiLCAidW5kZWZpbmVkIiwgImFwcGx5IiwgIm9mZnNldCIsICJjb2xsZWN0aW9uIiwgImNhY2hlIiwgIm1hcCIsICJzdHJpbmdUb0FycmF5IiwgInJ1bkluQ29udGV4dCIsICJBcnJheSIsICJEYXRlIiwgIkVycm9yIiwgIkZ1bmN0aW9uIiwgIk1hdGgiLCAiT2JqZWN0IiwgIlJlZ0V4cCIsICJTdHJpbmciLCAiVHlwZUVycm9yIiwgImhhc093blByb3BlcnR5IiwgImlkQ291bnRlciIsICJCdWZmZXIiLCAiU3ltYm9sIiwgIlVpbnQ4QXJyYXkiLCAiTWFwIiwgIlByb21pc2UiLCAiU2V0IiwgIldlYWtNYXAiLCAicmVzdWx0IiwgInN0YXJ0IiwgImVuZCIsICJpdGVyYXRlZSIsICJzaXplIiwgInZhbHVlcyIsICJpc1R5cGUiLCAic291cmNlIiwgImtleXMiLCAiZ2V0IiwgImtleSIsICJzZXRUaW1lb3V0IiwgImluY2x1ZGVzIiwgImlzRnVuY3Rpb24iLCAib2JqZWN0IiwgImlzUGxhaW5PYmplY3QiLCAiaW5kZXhPZiIsICJzZXQiLCAiY2xlYXJUaW1lb3V0IiwgIm9yZGVyIiwgImZuIiwgImluZGV4IiwgImFyeSIsICJvcGVyYXRvciIsICJub29wIiwgIm90aFZhbHVlIiwgInRyYW5zZm9ybSIsICJyZWZlcmVuY2UiLCAiY29uY2F0IiwgImpvaW4iLCAic2xpY2UiLCAicGFyZW50IiwgImNsb25lIiwgImZpbmQiLCAiZm9yRWFjaCIsICJiaW5kIiwgImRlYm91bmNlIiwgImZsaXAiLCAid3JhcCIsICJpc0VsZW1lbnQiLCAiaXNFbXB0eSIsICJpc0VxdWFsIiwgImlzTnVtYmVyIiwgImlzUmVnRXhwIiwgImFzc2lnbiIsICJjcmVhdGUiLCAiZGVmYXVsdHMiLCAiY2xhbXAiLCAiZXNjYXBlIiwgInBhcnNlSW50IiwgInJlcGxhY2UiLCAic3BsaXQiLCAic3RhcnRzV2l0aCIsICJtYXRjaGVzIiwgImNoYWluIiwgIm1heCIsICJtaW4iLCAicm91bmQiLCAidmFsdWUiLCAiZm91bmQiLCAic2VsZiIsICJtYXAiLCAiZnJvbSIsICJlbmQiLCAic3RhcnQiLCAiZmlyc3QiLCAiY29weSIsICJmb3VuZCIsICJyb3VuZCIsICJvZmZzZXQiLCAianNvbiIsICJzbGljZSIsICJtYWluIiwgImRvYyIsICJiYXNlIiwgImkiLCAibWluIiwgIm1heCIsICJ0eXBlIiwgIm5mYSIsICJlZGdlIiwgImV4cHIiLCAibm9kZSIsICJzdGF0ZXMiLCAiZGVmYXVsdHMiLCAibWFyayIsICJyIiwgInN0eWxlIiwgIndyYXAiLCAidG9wIiwgInNwYWNlIiwgIm9mZnNldCIsICJkaWZmIiwgInN0YXJ0IiwgImVuZCIsICJkZWwiLCAiZnJvbSIsICJtYXAiLCAianNvbiIsICJkb2MiLCAic2xpY2UiLCAicGFyZW50IiwgInRyIiwgImZvdW5kIiwgInN0eWxlIiwgIm5ld05vZGUiLCAiYmFzZSIsICJpbmRleCIsICJqb2luYWJsZSIsICJmaXJzdCIsICJ3cmFwIiwgIm1hdGNoZXMiLCAidG9wIiwgIm1hdGNoIiwgInR5cGUiLCAiY2xvc2UiLCAiVHJhbnNmb3JtRXJyb3IiLCAidHIiLCAiZnJvbSIsICJmb3VuZCIsICJkb2MiLCAianNvbiIsICJtYXAiLCAiZW5kIiwgInNsaWNlIiwgInNlbGYiLCAiZnJvbSIsICJvZmZzZXQiLCAiZG9jIiwgInRvcCIsICJsZWZ0IiwgImZpcnN0IiwgIm5ld05vZGUiLCAiZW5kIiwgImVudGVyIiwgImJhc2UiLCAic2VsZiIsICJ3cmFwIiwgImNvcHkiLCAic3RhcnQiLCAiZm91bmQiLCAicHJlTWF0Y2giLCAibWF0Y2hlcyIsICJlbXB0eSIsICJ0ciIsICJzbGljZSIsICJkb20iLCAiZXZlbnQiLCAiaGFuZGxlcnMiLCAiY3V0IiwgIk5vZGVUeXBlIiwgInIiLCAiaSIsICJvbGRPZmZzZXQiLCAicmVhZCIsICJmaW5kIiwgImFuY2hvciIsICJzZWwiLCAiZnJvbSIsICJmb3VuZCIsICJwcm9wIiwgIm9mZnNldCIsICJ0ciIsICJtYWMiLCAiaWUiLCAibWFjIiwgInNoaWZ0IiwgIm1hcCIsICJjb3B5IiwgInRyIiwgImVtcHR5IiwgInRyIiwgImxpZnQiLCAiZmlyc3QiLCAiZW5kIiwgIndyYXAiLCAidHIiLCAic2V0QmxvY2tUeXBlIiwgImZyb20iLCAiY29tbWFuZHMiLCAibWFjIiwgIndyYXAiLCAidHIiLCAiZm91bmQiLCAiZmlyc3QiLCAidHIiLCAiZW5kIiwgInN0YXJ0IiwgInNsaWNlIiwgImRvYyIsICJ0ciIsICJjb21tYW5kIiwgInJ1biIsICJmbiIsICJleHRlbnNpb25zIiwgIl9hIiwgImZpbmQiLCAiZnJvbSIsICJjb21tYW5kcyIsICJtYXRjaGVzIiwgImhhbmRsZXJzIiwgInN0YXJ0IiwgImVuZCIsICJvbkNyZWF0ZSIsICJvbkRlc3Ryb3kiLCAiTWFyayIsICJzb3VyY2UiLCAicmFuZ2UiLCAiY3JlYXRlUGFyYWdyYXBoTmVhciIsICJvcmlnaW5hbENyZWF0ZVBhcmFncmFwaE5lYXIiLCAiZGVsZXRlUmFuZ2UiLCAiZGVsZXRlU2VsZWN0aW9uIiwgIm9yaWdpbmFsRGVsZXRlU2VsZWN0aW9uIiwgImV4aXRDb2RlIiwgIm9yaWdpbmFsRXhpdENvZGUiLCAia2V5cyIsICJtaW4iLCAibWF4IiwgImVycm9yIiwgInNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kIiwgIm1hcCIsICJqb2luVXAiLCAib3JpZ2luYWxKb2luVXAiLCAiam9pbkRvd24iLCAib3JpZ2luYWxKb2luRG93biIsICJqb2luQmFja3dhcmQiLCAib3JpZ2luYWxKb2luQmFja3dhcmQiLCAiam9pbkZvcndhcmQiLCAib3JpZ2luYWxKb2luRm9yd2FyZCIsICJub3JtYWxpemVLZXlOYW1lIiwgInNoaWZ0IiwgImVtcHR5IiwgImxpZnQiLCAiaXNBY3RpdmUiLCAib3JpZ2luYWxMaWZ0IiwgImxpZnRFbXB0eUJsb2NrIiwgIm9yaWdpbmFsTGlmdEVtcHR5QmxvY2siLCAibGlmdExpc3RJdGVtIiwgIm9yaWdpbmFsTGlmdExpc3RJdGVtIiwgIm5ld2xpbmVJbkNvZGUiLCAib3JpZ2luYWxOZXdsaW5lSW5Db2RlIiwgInNlbGVjdEFsbCIsICJzZWxlY3ROb2RlQmFja3dhcmQiLCAib3JpZ2luYWxTZWxlY3ROb2RlQmFja3dhcmQiLCAic2VsZWN0Tm9kZUZvcndhcmQiLCAib3JpZ2luYWxTZWxlY3ROb2RlRm9yd2FyZCIsICJzZWxlY3RQYXJlbnROb2RlIiwgIm9yaWdpbmFsU2VsZWN0UGFyZW50Tm9kZSIsICJzZWxlY3RUZXh0YmxvY2tFbmQiLCAib3JpZ2luYWxTZWxlY3RUZXh0YmxvY2tFbmQiLCAic2VsZWN0VGV4dGJsb2NrU3RhcnQiLCAib3JpZ2luYWxTZWxlY3RUZXh0YmxvY2tTdGFydCIsICJkb2N1bWVudCIsICJkZWZhdWx0QmxvY2tBdCIsICJnZXRUZXh0IiwgImZyb20iLCAibm9kZSIsICJmcm9tIiwgImRvYyIsICJlbXB0eSIsICJmcm9tIiwgInJhbmdlIiwgImV4dGVuc2lvbnMiLCAiZnJvbSIsICJzdGFydCIsICJlbmQiLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgInRyIiwgImVtcHR5IiwgImNvbW1hbmRzIiwgInNldEJsb2NrVHlwZSIsICJkb2MiLCAic2lua0xpc3RJdGVtIiwgIm9yaWdpbmFsU2lua0xpc3RJdGVtIiwgInNwbGl0QmxvY2siLCAiZGVmYXVsdEJsb2NrQXQiLCAiZmlyc3QiLCAid3JhcCIsICJuZXdOZXh0VHlwZUF0dHJpYnV0ZXMiLCAibmV4dFR5cGUiLCAiaXNBY3RpdmUiLCAid3JhcEluIiwgIm9yaWdpbmFsV3JhcEluIiwgIndyYXBJbkxpc3QiLCAib3JpZ2luYWxXcmFwSW5MaXN0IiwgImlzRW1wdHkiLCAic3R5bGUiLCAiY29yZUV4dGVuc2lvbnMiLCAiZm4iLCAiZm9jdXMiLCAiYmx1ciIsICJnZXRUZXh0IiwgIm5ld05vZGUiLCAib2Zmc2V0IiwgInRyIiwgIk1hcmsiLCAicmVtb3ZlTWFyayIsICJOb2RlIiwgInRyIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiTWFyayIsICJjb21tYW5kcyIsICJOb2RlIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiaW5wdXRSZWdleCIsICJpbnB1dFJlZ2V4IiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiVGV4dFN0eWxlIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiTm9kZSIsICJ0b3AiLCAicmVjdCIsICJkb2MiLCAianNvbiIsICJ0ciIsICJOb2RlIiwgImNvbW1hbmRzIiwgInRyIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiUm9wZVNlcXVlbmNlIiwgImZyb20iLCAiZm9yRWFjaCIsICJMZWFmIiwgInN0YXJ0IiwgIkFwcGVuZCIsICJsZWZ0IiwgInJpZ2h0IiwgImFwcGVuZElubmVyIiwgImRpc3RfZGVmYXVsdCIsICJlbmQiLCAibWFwIiwgImZyb20iLCAic3RhcnQiLCAiZGlzdF9kZWZhdWx0IiwgImhpc3RvcnkiLCAidHIiLCAicmVkbyIsICJ0ciIsICJjb21tYW5kIiwgIk5vZGUiLCAidHIiLCAic3RhcklucHV0UmVnZXgiLCAic3RhclBhc3RlUmVnZXgiLCAidW5kZXJzY29yZUlucHV0UmVnZXgiLCAidW5kZXJzY29yZVBhc3RlUmVnZXgiLCAiTWFyayIsICJjb21tYW5kcyIsICJMaXN0SXRlbSIsICJOb2RlIiwgIkxpc3RJdGVtIiwgIk5vZGUiLCAiVGV4dFN0eWxlIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiaW5wdXRSZWdleCIsICJzdGFydCIsICJOb2RlIiwgImNvbW1hbmRzIiwgImRvYyIsICJpc0VtcHR5IiwgImlucHV0UmVnZXgiLCAicGFzdGVSZWdleCIsICJNYXJrIiwgInN0eWxlIiwgImNvbW1hbmRzIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiTWFyayIsICJjb21tYW5kcyIsICJjYWNoZSIsICJtYXAiLCAibGVmdCIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgInN0YXJ0IiwgIm1hcCIsICJkb2MiLCAiZnJvbSIsICJ0ciIsICJqc29uIiwgIm5vcm1hbGl6ZSIsICJzdGFydCIsICJvZmZzZXQiLCAiZmlyc3QiLCAiZW5kIiwgInNsaWNlIiwgImxlZnQiLCAicmlnaHQiLCAiciIsICJlbXB0eSIsICJzb3VyY2UiLCAic3RhcnQyIiwgInRvcCIsICJmb3VuZCIsICJib3R0b20iLCAiaGFuZGxlS2V5RG93biIsICJhcnJvdyIsICJoYW5kbGVUcmlwbGVDbGljayIsICJjb3B5IiwgImMiLCAiVGFibGVWaWV3IiwgIk5vZGUiLCAidHIiLCAib2Zmc2V0IiwgIk5vZGUiLCAiTm9kZSIsICJOb2RlIiwgIk5vZGUiLCAiTWFyayIsICJzdHlsZSIsICJjb21tYW5kcyIsICJpbnB1dFJlZ2V4IiwgInBhc3RlUmVnZXgiLCAiTWFyayIsICJjb21tYW5kcyIsICJOb2RlIiwgImNvbW1hbmRzIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiYyIsICJuZXh0U3RhdGUiLCAicnVuJDEiLCAic3RhcnQiLCAiYyIsICJmaXJzdCIsICJvcGVyYXRvciIsICJzY2hlbWUiLCAiVGV4dCIsICJydW4iLCAic3RhcnQiLCAiVGV4dCIsICJzY2hlbWUiLCAicnVuIiwgInJ1biQxIiwgInRyIiwgInNsaWNlIiwgImVtcHR5IiwgIk1hcmsiLCAiaW5wdXRSZWdleCIsICJOb2RlIiwgImNvbW1hbmRzIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiTm9kZSIsICJ0ciIsICJvZmZzZXQiLCAiTm9kZSIsICJtYXRjaGVzIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAibWF0Y2hlcyIsICJOb2RlIiwgImNvbW1hbmRzIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiTm9kZSIsICJzbGljZSIsICJmcm9tIiwgImVtcHR5IiwgInRyIiwgIk5vZGUiLCAiTm9kZSIsICJlbXB0eSIsICJub2RlIiwgImRlZmF1bHRCbG9ja0F0IiwgInRyIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiZW1wdHkiLCAidHIiLCAiZG9jIiwgIm9mZnNldCIsICJlbmQiLCAic2NvcGVOYW1lIiwgIndhcm4iLCAidmVyc2lvbiIsICJnbG9iYWwiLCAiaSIsICJjIiwgImhpZ2hsaWdodCIsICJmaXJlIiwgInRvcCIsICJyZXN1bHQiLCAiaGlnaGxpZ2h0QXV0byIsICJtYXgiLCAicGxhaW50ZXh0IiwgInJlZ2lzdGVyTGFuZ3VhZ2UiLCAibGlzdExhbmd1YWdlcyIsICJkb2MiLCAibG93bGlnaHQiLCAiZnJvbSIsICJpc0Z1bmN0aW9uIiwgImZyb20iLCAiTm9kZSIsICJjb21tYW5kcyIsICJjb21tYW5kcyIsICJzdHlsZSIsICJuYW1lIiwgImNsaWVudFJlY3QiLCAiY2xpZW50UmVjdCIsICJnZXRDb21wdXRlZFN0eWxlIiwgImdldENvbXB1dGVkU3R5bGUiLCAiY3NzIiwgIndpbmRvdyIsICJtaW4iLCAibWF4IiwgImtleXMiLCAidG9QYWRkaW5nT2JqZWN0IiwgImFycm93IiwgInBvcHBlck9mZnNldHMiLCAibWluIiwgIm1heCIsICJvZmZzZXQiLCAiZWZmZWN0IiwgInBvcHBlciIsICJnZXRDb21wdXRlZFN0eWxlIiwgImVmZmVjdCIsICJ3aW5kb3ciLCAiaGFzaCIsICJnZXRDb21wdXRlZFN0eWxlIiwgImdldENvbXB1dGVkU3R5bGUiLCAiY2xpcHBpbmdQYXJlbnRzIiwgImdldENvbXB1dGVkU3R5bGUiLCAicmVmZXJlbmNlIiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgInBsYWNlbWVudHMiLCAicGxhY2VtZW50IiwgInBsYWNlbWVudHMiLCAicGxhY2VtZW50IiwgIl9sb29wIiwgIl9pIiwgImNoZWNrcyIsICJvZmZzZXQiLCAicG9wcGVyT2Zmc2V0cyIsICJvZmZzZXQiLCAibWluIiwgIm1heCIsICJtb2RpZmllcnMiLCAibWFwIiwgImZuIiwgIm1vZGlmaWVycyIsICJtZXJnZWQiLCAiZGVmYXVsdE1vZGlmaWVycyIsICJjcmVhdGVQb3BwZXIiLCAicmVmZXJlbmNlIiwgInBvcHBlciIsICJvcHRpb25zIiwgImZuIiwgInN0YXRlIiwgImVmZmVjdCIsICJub29wRm4iLCAiQk9YX0NMQVNTIiwgIkNPTlRFTlRfQ0xBU1MiLCAiQkFDS0RST1BfQ0xBU1MiLCAiQVJST1dfQ0xBU1MiLCAiU1ZHX0FSUk9XX0NMQVNTIiwgIlRPVUNIX09QVElPTlMiLCAicGFzc2l2ZSIsICJjYXB0dXJlIiwgIlRJUFBZX0RFRkFVTFRfQVBQRU5EX1RPIiwgImRvY3VtZW50IiwgImJvZHkiLCAiaGFzT3duUHJvcGVydHkiLCAib2JqIiwgImtleSIsICJjYWxsIiwgImdldFZhbHVlQXRJbmRleE9yUmV0dXJuIiwgInZhbHVlIiwgImluZGV4IiwgImRlZmF1bHRWYWx1ZSIsICJBcnJheSIsICJpc0FycmF5IiwgInYiLCAiaXNUeXBlIiwgInR5cGUiLCAic3RyIiwgInRvU3RyaW5nIiwgImluZGV4T2YiLCAiaW52b2tlV2l0aEFyZ3NPclJldHVybiIsICJhcmdzIiwgImRlYm91bmNlIiwgImZuIiwgIm1zIiwgInRpbWVvdXQiLCAiYXJnIiwgImNsZWFyVGltZW91dCIsICJzZXRUaW1lb3V0IiwgInJlbW92ZVByb3BlcnRpZXMiLCAia2V5cyIsICJjbG9uZSIsICJmb3JFYWNoIiwgInNwbGl0QnlTcGFjZXMiLCAic3BsaXQiLCAiZmlsdGVyIiwgIkJvb2xlYW4iLCAibm9ybWFsaXplVG9BcnJheSIsICJjb25jYXQiLCAicHVzaElmVW5pcXVlIiwgImFyciIsICJwdXNoIiwgInVuaXF1ZSIsICJpdGVtIiwgImdldEJhc2VQbGFjZW1lbnQiLCAicGxhY2VtZW50IiwgImFycmF5RnJvbSIsICJzbGljZSIsICJyZW1vdmVVbmRlZmluZWRQcm9wcyIsICJPYmplY3QiLCAicmVkdWNlIiwgImFjYyIsICJ1bmRlZmluZWQiLCAiZGl2IiwgImNyZWF0ZUVsZW1lbnQiLCAiaXNFbGVtZW50IiwgInNvbWUiLCAiaXNOb2RlTGlzdCIsICJpc01vdXNlRXZlbnQiLCAiaXNSZWZlcmVuY2VFbGVtZW50IiwgIl90aXBweSIsICJyZWZlcmVuY2UiLCAiZ2V0QXJyYXlPZkVsZW1lbnRzIiwgInF1ZXJ5U2VsZWN0b3JBbGwiLCAic2V0VHJhbnNpdGlvbkR1cmF0aW9uIiwgImVscyIsICJlbCIsICJzdHlsZSIsICJ0cmFuc2l0aW9uRHVyYXRpb24iLCAic2V0VmlzaWJpbGl0eVN0YXRlIiwgInN0YXRlIiwgInNldEF0dHJpYnV0ZSIsICJnZXRPd25lckRvY3VtZW50IiwgImVsZW1lbnRPckVsZW1lbnRzIiwgImVsZW1lbnQiLCAib3duZXJEb2N1bWVudCIsICJpc0N1cnNvck91dHNpZGVJbnRlcmFjdGl2ZUJvcmRlciIsICJwb3BwZXJUcmVlRGF0YSIsICJldmVudCIsICJjbGllbnRYIiwgImNsaWVudFkiLCAiZXZlcnkiLCAicG9wcGVyUmVjdCIsICJwb3BwZXJTdGF0ZSIsICJwcm9wcyIsICJpbnRlcmFjdGl2ZUJvcmRlciIsICJiYXNlUGxhY2VtZW50IiwgIm9mZnNldERhdGEiLCAibW9kaWZpZXJzRGF0YSIsICJvZmZzZXQiLCAidG9wRGlzdGFuY2UiLCAidG9wIiwgInkiLCAiYm90dG9tRGlzdGFuY2UiLCAiYm90dG9tIiwgImxlZnREaXN0YW5jZSIsICJsZWZ0IiwgIngiLCAicmlnaHREaXN0YW5jZSIsICJyaWdodCIsICJleGNlZWRzVG9wIiwgImV4Y2VlZHNCb3R0b20iLCAiZXhjZWVkc0xlZnQiLCAiZXhjZWVkc1JpZ2h0IiwgInVwZGF0ZVRyYW5zaXRpb25FbmRMaXN0ZW5lciIsICJib3giLCAiYWN0aW9uIiwgImxpc3RlbmVyIiwgIm1ldGhvZCIsICJhY3R1YWxDb250YWlucyIsICJwYXJlbnQiLCAiY2hpbGQiLCAidGFyZ2V0IiwgImNvbnRhaW5zIiwgImdldFJvb3ROb2RlIiwgImhvc3QiLCAiY3VycmVudElucHV0IiwgImlzVG91Y2giLCAibGFzdE1vdXNlTW92ZVRpbWUiLCAib25Eb2N1bWVudFRvdWNoU3RhcnQiLCAid2luZG93IiwgInBlcmZvcm1hbmNlIiwgImFkZEV2ZW50TGlzdGVuZXIiLCAib25Eb2N1bWVudE1vdXNlTW92ZSIsICJub3ciLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJvbldpbmRvd0JsdXIiLCAiYWN0aXZlRWxlbWVudCIsICJpbnN0YW5jZSIsICJibHVyIiwgImlzVmlzaWJsZSIsICJiaW5kR2xvYmFsRXZlbnRMaXN0ZW5lcnMiLCAiaXNCcm93c2VyIiwgImlzSUUxMSIsICJtc0NyeXB0byIsICJjcmVhdGVNZW1vcnlMZWFrV2FybmluZyIsICJ0eHQiLCAiam9pbiIsICJjbGVhbiIsICJzcGFjZXNBbmRUYWJzIiwgImxpbmVTdGFydFdpdGhTcGFjZXMiLCAicmVwbGFjZSIsICJ0cmltIiwgImdldERldk1lc3NhZ2UiLCAibWVzc2FnZSIsICJnZXRGb3JtYXR0ZWRNZXNzYWdlIiwgInZpc2l0ZWRNZXNzYWdlcyIsICJyZXNldFZpc2l0ZWRNZXNzYWdlcyIsICJTZXQiLCAid2FybldoZW4iLCAiY29uZGl0aW9uIiwgImhhcyIsICJhZGQiLCAiY29uc29sZSIsICJ3YXJuIiwgImVycm9yV2hlbiIsICJlcnJvciIsICJ2YWxpZGF0ZVRhcmdldHMiLCAidGFyZ2V0cyIsICJkaWRQYXNzRmFsc3lWYWx1ZSIsICJkaWRQYXNzUGxhaW5PYmplY3QiLCAicHJvdG90eXBlIiwgIlN0cmluZyIsICJwbHVnaW5Qcm9wcyIsICJhbmltYXRlRmlsbCIsICJmb2xsb3dDdXJzb3IiLCAiaW5saW5lUG9zaXRpb25pbmciLCAic3RpY2t5IiwgInJlbmRlclByb3BzIiwgImFsbG93SFRNTCIsICJhbmltYXRpb24iLCAiYXJyb3ciLCAiY29udGVudCIsICJpbmVydGlhIiwgIm1heFdpZHRoIiwgInJvbGUiLCAidGhlbWUiLCAiekluZGV4IiwgImRlZmF1bHRQcm9wcyIsICJhcHBlbmRUbyIsICJhcmlhIiwgImV4cGFuZGVkIiwgImRlbGF5IiwgImR1cmF0aW9uIiwgImdldFJlZmVyZW5jZUNsaWVudFJlY3QiLCAiaGlkZU9uQ2xpY2siLCAiaWdub3JlQXR0cmlidXRlcyIsICJpbnRlcmFjdGl2ZSIsICJpbnRlcmFjdGl2ZURlYm91bmNlIiwgIm1vdmVUcmFuc2l0aW9uIiwgIm9uQWZ0ZXJVcGRhdGUiLCAib25CZWZvcmVVcGRhdGUiLCAib25DcmVhdGUiLCAib25EZXN0cm95IiwgIm9uSGlkZGVuIiwgIm9uSGlkZSIsICJvbk1vdW50IiwgIm9uU2hvdyIsICJvblNob3duIiwgIm9uVHJpZ2dlciIsICJvblVudHJpZ2dlciIsICJvbkNsaWNrT3V0c2lkZSIsICJwbHVnaW5zIiwgInBvcHBlck9wdGlvbnMiLCAicmVuZGVyIiwgInNob3dPbkNyZWF0ZSIsICJ0b3VjaCIsICJ0cmlnZ2VyIiwgInRyaWdnZXJUYXJnZXQiLCAiZGVmYXVsdEtleXMiLCAic2V0RGVmYXVsdFByb3BzIiwgInBhcnRpYWxQcm9wcyIsICJ2YWxpZGF0ZVByb3BzIiwgImdldEV4dGVuZGVkUGFzc2VkUHJvcHMiLCAicGFzc2VkUHJvcHMiLCAicGx1Z2luIiwgIm5hbWUiLCAiZ2V0RGF0YUF0dHJpYnV0ZVByb3BzIiwgInByb3BLZXlzIiwgInZhbHVlQXNTdHJpbmciLCAiZ2V0QXR0cmlidXRlIiwgIkpTT04iLCAicGFyc2UiLCAiZSIsICJldmFsdWF0ZVByb3BzIiwgIm91dCIsICJwcm9wIiwgIm5vblBsdWdpblByb3BzIiwgImRpZFBhc3NVbmtub3duUHJvcCIsICJsZW5ndGgiLCAiaW5uZXJIVE1MIiwgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwgImh0bWwiLCAiY3JlYXRlQXJyb3dFbGVtZW50IiwgImNsYXNzTmFtZSIsICJhcHBlbmRDaGlsZCIsICJzZXRDb250ZW50IiwgInRleHRDb250ZW50IiwgImdldENoaWxkcmVuIiwgInBvcHBlciIsICJmaXJzdEVsZW1lbnRDaGlsZCIsICJib3hDaGlsZHJlbiIsICJjaGlsZHJlbiIsICJmaW5kIiwgIm5vZGUiLCAiY2xhc3NMaXN0IiwgImJhY2tkcm9wIiwgIm9uVXBkYXRlIiwgInByZXZQcm9wcyIsICJuZXh0UHJvcHMiLCAicmVtb3ZlQXR0cmlidXRlIiwgInJlbW92ZUNoaWxkIiwgIiQkdGlwcHkiLCAiaWRDb3VudGVyIiwgIm1vdXNlTW92ZUxpc3RlbmVycyIsICJtb3VudGVkSW5zdGFuY2VzIiwgImNyZWF0ZVRpcHB5IiwgInNob3dUaW1lb3V0IiwgImhpZGVUaW1lb3V0IiwgInNjaGVkdWxlSGlkZUFuaW1hdGlvbkZyYW1lIiwgImlzVmlzaWJsZUZyb21DbGljayIsICJkaWRIaWRlRHVlVG9Eb2N1bWVudE1vdXNlRG93biIsICJkaWRUb3VjaE1vdmUiLCAiaWdub3JlT25GaXJzdFVwZGF0ZSIsICJsYXN0VHJpZ2dlckV2ZW50IiwgImN1cnJlbnRUcmFuc2l0aW9uRW5kTGlzdGVuZXIiLCAib25GaXJzdFVwZGF0ZSIsICJsaXN0ZW5lcnMiLCAiZGVib3VuY2VkT25Nb3VzZU1vdmUiLCAib25Nb3VzZU1vdmUiLCAiY3VycmVudFRhcmdldCIsICJpZCIsICJwb3BwZXJJbnN0YW5jZSIsICJpc0VuYWJsZWQiLCAiaXNEZXN0cm95ZWQiLCAiaXNNb3VudGVkIiwgImlzU2hvd24iLCAiY2xlYXJEZWxheVRpbWVvdXRzIiwgInNldFByb3BzIiwgInNob3ciLCAiaGlkZSIsICJoaWRlV2l0aEludGVyYWN0aXZpdHkiLCAiZW5hYmxlIiwgImRpc2FibGUiLCAidW5tb3VudCIsICJkZXN0cm95IiwgInBsdWdpbnNIb29rcyIsICJtYXAiLCAiaGFzQXJpYUV4cGFuZGVkIiwgImhhc0F0dHJpYnV0ZSIsICJhZGRMaXN0ZW5lcnMiLCAiaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlIiwgImhhbmRsZVN0eWxlcyIsICJpbnZva2VIb29rIiwgInNjaGVkdWxlU2hvdyIsICJnZXREb2N1bWVudCIsICJnZXROb3JtYWxpemVkVG91Y2hTZXR0aW5ncyIsICJnZXRJc0N1c3RvbVRvdWNoQmVoYXZpb3IiLCAiZ2V0SXNEZWZhdWx0UmVuZGVyRm4iLCAiZ2V0Q3VycmVudFRhcmdldCIsICJwYXJlbnROb2RlIiwgImdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuIiwgImdldERlbGF5IiwgImlzU2hvdyIsICJmcm9tSGlkZSIsICJwb2ludGVyRXZlbnRzIiwgImhvb2siLCAic2hvdWxkSW52b2tlUHJvcHNIb29rIiwgInBsdWdpbkhvb2tzIiwgImhhbmRsZUFyaWFDb250ZW50QXR0cmlidXRlIiwgImF0dHIiLCAibm9kZXMiLCAiY3VycmVudFZhbHVlIiwgIm5leHRWYWx1ZSIsICJjbGVhbnVwSW50ZXJhY3RpdmVNb3VzZUxpc3RlbmVycyIsICJvbkRvY3VtZW50UHJlc3MiLCAiYWN0dWFsVGFyZ2V0IiwgImNvbXBvc2VkUGF0aCIsICJyZW1vdmVEb2N1bWVudFByZXNzIiwgIm9uVG91Y2hNb3ZlIiwgIm9uVG91Y2hTdGFydCIsICJhZGREb2N1bWVudFByZXNzIiwgImRvYyIsICJvblRyYW5zaXRpb25lZE91dCIsICJjYWxsYmFjayIsICJvblRyYW5zaXRpb25FbmQiLCAib25UcmFuc2l0aW9uZWRJbiIsICJvbiIsICJldmVudFR5cGUiLCAiaGFuZGxlciIsICJvcHRpb25zIiwgIm9uTW91c2VMZWF2ZSIsICJvbkJsdXJPckZvY3VzT3V0IiwgInJlbW92ZUxpc3RlbmVycyIsICJzaG91bGRTY2hlZHVsZUNsaWNrSGlkZSIsICJpc0V2ZW50TGlzdGVuZXJTdG9wcGVkIiwgIndhc0ZvY3VzZWQiLCAic2NoZWR1bGVIaWRlIiwgImlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyIiwgImdldE5lc3RlZFBvcHBlclRyZWUiLCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgInNob3VsZEJhaWwiLCAicmVsYXRlZFRhcmdldCIsICJjcmVhdGVQb3BwZXJJbnN0YW5jZSIsICJkZXN0cm95UG9wcGVySW5zdGFuY2UiLCAiY29tcHV0ZWRSZWZlcmVuY2UiLCAiY29udGV4dEVsZW1lbnQiLCAidGlwcHlNb2RpZmllciIsICJlbmFibGVkIiwgInBoYXNlIiwgInJlcXVpcmVzIiwgImF0dHJpYnV0ZXMiLCAibW9kaWZpZXJzIiwgInBhZGRpbmciLCAiYWRhcHRpdmUiLCAiY3JlYXRlUG9wcGVyIiwgIm1vdW50IiwgIm5leHRFbGVtZW50U2libGluZyIsICJ0b3VjaFZhbHVlIiwgInRvdWNoRGVsYXkiLCAicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwgImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwgIm5lc3RlZFBvcHBlciIsICJmb3JjZVVwZGF0ZSIsICJpc0FscmVhZHlWaXNpYmxlIiwgImlzRGlzYWJsZWQiLCAiaXNUb3VjaEFuZFRvdWNoRGlzYWJsZWQiLCAidmlzaWJpbGl0eSIsICJ0cmFuc2l0aW9uIiwgIm9mZnNldEhlaWdodCIsICJpc0FscmVhZHlIaWRkZW4iLCAiaSIsICJ0aXBweSIsICJvcHRpb25hbFByb3BzIiwgImVsZW1lbnRzIiwgImlzU2luZ2xlQ29udGVudEVsZW1lbnQiLCAiaXNNb3JlVGhhbk9uZVJlZmVyZW5jZUVsZW1lbnQiLCAiaW5zdGFuY2VzIiwgImFwcGx5U3R5bGVzTW9kaWZpZXIiLCAiYXBwbHlTdHlsZXMiLCAiZWZmZWN0IiwgInN0YXRlIiwgImluaXRpYWxTdHlsZXMiLCAicG9wcGVyIiwgInBvc2l0aW9uIiwgIm9wdGlvbnMiLCAic3RyYXRlZ3kiLCAibGVmdCIsICJ0b3AiLCAibWFyZ2luIiwgImFycm93IiwgInJlZmVyZW5jZSIsICJPYmplY3QiLCAiYXNzaWduIiwgImVsZW1lbnRzIiwgInN0eWxlIiwgInN0eWxlcyIsICJ0aXBweSIsICJzZXREZWZhdWx0UHJvcHMiLCAicmVuZGVyIiwgImZyb20iLCAiZG9jIiwgImVtcHR5IiwgImVtcHR5IiwgImRvYyIsICJmcm9tIiwgIk5vZGUiLCAidHIiLCAib2Zmc2V0IiwgIk5vZGUiLCAiTm9kZSIsICJjb21tYW5kcyIsICJmcm9tIiwgImNvbW1hbmQiLCAicmVuZGVyIiwgIl9hIiwgImVtcHR5IiwgIk5vZGUiLCAidHIiLCAiZW1wdHkiLCAiQ19MSU5FX0NPTU1FTlRfTU9ERSIsICJUSVRMRV9NT0RFIiwgIkxJVEVSQUxTIiwgIktFWVdPUkRTIiwgIkxJVEVSQUxTIiwgIkNfTElORV9DT01NRU5UX01PREUiLCAiVFlQRVMiLCAiVElUTEVfTU9ERSIsICJLRVlXT1JEUyIsICJDX0xJTkVfQ09NTUVOVF9NT0RFIiwgIlRJVExFX01PREUiLCAiTElURVJBTFMiLCAiS0VZV09SRFMiLCAiVElUTEVfTU9ERSIsICJNT0RFUyIsICJJREVOVF9SRSIsICJMSVRFUkFMUyIsICJCVUlMVF9JTlMiLCAiVFlQRVMiLCAiS0VZV09SRFMiLCAiTElURVJBTFMiLCAiQlVJTFRfSU5TIiwgIkxJVEVSQUxTIiwgIlRZUEVTIiwgIktFWVdPUkRTIiwgIklERU5UX1JFIiwgImRlY2ltYWxEaWdpdHMiLCAiZnJhYyIsICJDT01NRU5UIiwgIkxJVEVSQUxTIiwgImRlY2ltYWxEaWdpdHMiLCAiZnJhYyIsICJoZXhEaWdpdHMiLCAiTlVNRVJJQyIsICJLRVlXT1JEUyIsICJNT0RFUyIsICJUQUdTIiwgIk1FRElBX0ZFQVRVUkVTIiwgIlBTRVVET19DTEFTU0VTIiwgIlBTRVVET19FTEVNRU5UUyIsICJBVFRSSUJVVEVTIiwgIklERU5UX1JFIiwgImMiLCAiVFlQRVMiLCAiTElURVJBTFMiLCAiQlVJTFRfSU5TIiwgIktFWVdPUkRTIiwgIktFWVdPUkRTIiwgImNsb3NlIiwgIklERU5UX1JFIiwgIkxJVEVSQUxTIiwgIkJVSUxUX0lOUyIsICJLRVlXT1JEUyIsICJBVFRSSUJVVEVTIiwgIklERU5UX1JFIiwgIkJVSUxUX0lOUyIsICJMSVRFUkFMUyIsICJUWVBFUyIsICJLRVlXT1JEUyIsICJsb29rYWhlYWQiLCAiSURFTlRfUkUiLCAiS0VZV09SRFMiLCAiTElURVJBTFMiLCAiVFlQRVMiLCAiTU9ERVMiLCAiVEFHUyIsICJNRURJQV9GRUFUVVJFUyIsICJQU0VVRE9fQ0xBU1NFUyIsICJQU0VVRE9fRUxFTUVOVFMiLCAiQVRUUklCVVRFUyIsICJJREVOVF9SRSIsICJMSVRFUkFMUyIsICJUWVBFUyIsICJLRVlXT1JEUyIsICJzb3VyY2UiLCAibG9va2FoZWFkIiwgImNvbmNhdCIsICJzdHJpcE9wdGlvbnNGcm9tQXJncyIsICJlaXRoZXIiLCAiS0VZV09SRFMiLCAiQlVJTFRfSU5TIiwgImRlY2ltYWxEaWdpdHMiLCAiaGV4RGlnaXRzIiwgIkFUVFJJQlVURVMiLCAiSURFTlRfUkUiLCAiS0VZV09SRFMiLCAiTElURVJBTFMiLCAiVFlQRVMiLCAiRVJST1JfVFlQRVMiLCAiQlVJTFRfSU5fR0xPQkFMUyIsICJCVUlMVF9JTl9WQVJJQUJMRVMiLCAiQlVJTFRfSU5TIiwgImphdmFzY3JpcHQiLCAiZGVjaW1hbERpZ2l0cyIsICJmcmFjIiwgIkNPTU1FTlQiLCAiQ09NTUVOVCIsICJMSVRFUkFMUyIsICJNT0RFUyIsICJpbXBvcnRfY29yZSIsICJIaWdobGlnaHRKUyIsICJmb3JtYXQiLCAiZm9ybWF0dGVyIiwgImhpZ2hsaWdodCIsICJyZWdpc3RlcmVkIiwgIm1pbiIsICJtYXgiLCAicm91bmQiLCAiYmFzZSIsICJyb3VuZCIsICJyb3VuZCIsICJjIiwgInJvdW5kIiwgInIiLCAicm91bmQiLCAibWF4IiwgImZpcnN0IiwgImZpcnN0IiwgInN0eWxlIiwgInJvdW5kIiwgIm9mZnNldCIsICJyb3VuZCIsICJvZmZzZXQiLCAidG9vbHMiLCAiVGV4dFN0eWxlIiwgImtleXMiLCAic3RhdGUiLCAiZnJvbSIsICJMaXN0SXRlbSIsICJlZGl0b3JzIiwgInNsaWNlIl0KfQo= diff --git a/resources/js/plugin.js b/resources/js/plugin.js index 7e43133..b6065d5 100644 --- a/resources/js/plugin.js +++ b/resources/js/plugin.js @@ -128,6 +128,7 @@ export default function tiptap({ return { id: null, + modalId: null, tools: tools, state: state, statePath: statePath, @@ -266,13 +267,10 @@ export default function tiptap({ return exts; }, init: async function () { - - if (editors[this.statePath]) { - editors[this.statePath].destroy(); - } - this.initEditor(this.state); + this.modalId = this.$el.closest('[x-ref="modalContainer"]')?.getAttribute('wire:key'); + window.filamentTiptapEditors = editors; document.addEventListener("dblclick", function (e) { @@ -332,6 +330,12 @@ export default function tiptap({ return editors[this.statePath]; }, initEditor(content) { + if (editors[this.statePath]) { + content = this.editor().getJSON(); + editors[this.statePath].destroy(); + delete editors[this.statePath]; + } + let _this = this; editors[this.statePath] = new Editor({ From 9aadcccdb7b6dad3bba6e9ac58f9a73a59c1de59 Mon Sep 17 00:00:00 2001 From: Adam Weston Date: Sat, 6 Apr 2024 15:35:00 -0400 Subject: [PATCH 2/2] working nested form component actions --- package-lock.json | 1942 +- resources/dist/filament-tiptap-editor.css | 1000 +- resources/dist/filament-tiptap-editor.js | 48941 +------------------- resources/js/extensions/TiptapBlock.js | 4 +- resources/js/plugin.js | 54 +- resources/views/tiptap-editor.blade.php | 1 + src/Actions/GridBuilderAction.php | 2 +- src/Actions/LinkAction.php | 2 +- src/Actions/MediaAction.php | 2 +- src/Actions/OEmbedAction.php | 2 +- src/Actions/SourceAction.php | 2 +- src/TiptapEditor.php | 4 +- 12 files changed, 1340 insertions(+), 50616 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f6a022..bd4922d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,10 +90,26 @@ "filament-purge": "filament-purge.js" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", - "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -107,9 +123,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", - "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -123,9 +139,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", - "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -139,9 +155,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", - "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -155,9 +171,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", - "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -171,9 +187,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", - "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -187,9 +203,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", - "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -203,9 +219,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", - "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -219,9 +235,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", - "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -235,9 +251,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", - "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -251,9 +267,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", - "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -267,9 +283,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", - "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -283,9 +299,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", - "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -299,9 +315,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", - "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -315,9 +331,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", - "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -331,9 +347,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", - "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -347,9 +363,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", - "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -363,9 +379,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", - "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -379,9 +395,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", - "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -395,9 +411,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", - "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -411,9 +427,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", - "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -427,9 +443,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", - "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -442,33 +458,50 @@ "node": ">=12" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -481,9 +514,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -525,6 +558,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -541,36 +584,6 @@ "integrity": "sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==", "dev": true }, - "node_modules/@remirror/core-helpers": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@remirror/core-helpers/-/core-helpers-3.0.0.tgz", - "integrity": "sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==", - "dev": true, - "dependencies": { - "@remirror/core-constants": "^2.0.2", - "@remirror/types": "^1.0.1", - "@types/object.omit": "^3.0.0", - "@types/object.pick": "^1.3.2", - "@types/throttle-debounce": "^2.1.0", - "case-anything": "^2.1.13", - "dash-get": "^1.0.2", - "deepmerge": "^4.3.1", - "fast-deep-equal": "^3.1.3", - "make-error": "^1.3.6", - "object.omit": "^3.0.0", - "object.pick": "^1.3.0", - "throttle-debounce": "^3.0.1" - } - }, - "node_modules/@remirror/types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@remirror/types/-/types-1.0.1.tgz", - "integrity": "sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==", - "dev": true, - "dependencies": { - "type-fest": "^2.19.0" - } - }, "node_modules/@tailwindcss/forms": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", @@ -584,9 +597,9 @@ } }, "node_modules/@tailwindcss/typography": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", - "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.12.tgz", + "integrity": "sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==", "dev": true, "dependencies": { "lodash.castarray": "^4.4.0", @@ -599,9 +612,9 @@ } }, "node_modules/@tiptap/core": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.1.13.tgz", - "integrity": "sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.2.6.tgz", + "integrity": "sha512-v7S7RhQhTXQo9KSk2jM/jJlTd3clU2FsJA3Omjz7GbgYtPSy67qSiaTbH/tWq12GzDHbKymx+oQnKmyx+yPucA==", "dev": true, "funding": { "type": "github", @@ -612,9 +625,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.1.13.tgz", - "integrity": "sha512-oe6wSQACmODugoP9XH3Ouffjy4BsOBWfTC+dETHNCG6ZED6ShHN3CB9Vr7EwwRgmm2WLaKAjMO1sVumwH+Z1rg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.2.6.tgz", + "integrity": "sha512-Qoq4Tl4wyEGfuBrMFth5hWP1SroJtgDYPnyzAZeLiGzF3Yxtu7FFqjGtD1/Bos9ftnFVCAj+nIXnuKsM1YUaGg==", "dev": true, "funding": { "type": "github", @@ -625,9 +638,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.1.13.tgz", - "integrity": "sha512-6cHsQTh/rUiG4jkbJer3vk7g60I5tBwEBSGpdxmEHh83RsvevD8+n92PjA24hYYte5RNlATB011E1wu8PVhSvw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.2.6.tgz", + "integrity": "sha512-PI/jNH7rmi6hBvWy/z+3KUTYqeaDXBUjidM74gWP6OLV28HTJ5SkIPCriYe4u2j2Wc/nk3gPxs4/hPOAu/YiXA==", "dev": true, "funding": { "type": "github", @@ -638,9 +651,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.13.tgz", - "integrity": "sha512-Hm7e1GX3AI6lfaUmr6WqsS9MMyXIzCkhh+VQi6K8jj4Q4s8kY4KPoAyD/c3v9pZ/dieUtm2TfqrOCkbHzsJQBg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.2.6.tgz", + "integrity": "sha512-nRWxbgkInhdGUL+e6iISgALcWh8A1PxeVB66w7yYZHS/WoZO0DXdXYT/BWb/XmEJ8r6B4c9SDZRklCiXT8dSXw==", "dev": true, "dependencies": { "tippy.js": "^6.3.7" @@ -655,9 +668,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.13.tgz", - "integrity": "sha512-NkWlQ5bLPUlcROj6G/d4oqAxMf3j3wfndGOPp0z8OoXJtVbVoXl/aMSlLbVgE6n8r6CS8MYxKhXNxrb7Ll2foA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.2.6.tgz", + "integrity": "sha512-bSrmYlWfj/bXXoBMVB+gCTlsficVVzWi1jcAjAn+qNAENkhampmlFIUG4DiKGYtn18ZoTbyLgQGDMCO3SBdeDQ==", "dev": true, "funding": { "type": "github", @@ -668,9 +681,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.1.13.tgz", - "integrity": "sha512-f5fLYlSgliVVa44vd7lQGvo49+peC+Z2H0Fn84TKNCH7tkNZzouoJsHYn0/enLaQ9Sq+24YPfqulfiwlxyiT8w==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.2.6.tgz", + "integrity": "sha512-UGsSFvVWrWWWQFU4atk+b/qeewTLadOZG/BHZXQDloyP5eJ1SkgUVy9nv3y2cT8QWRbvF6sxkV+SdFoWnvaG3Q==", "dev": true, "funding": { "type": "github", @@ -681,9 +694,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.1.13.tgz", - "integrity": "sha512-E3tweNExPOV+t1ODKX0MDVsS0aeHGWc1ECt+uyp6XwzsN0bdF2A5+pttQqM7sTcMnQkVACGFbn9wDeLRRcfyQg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.2.6.tgz", + "integrity": "sha512-834gVybNyI4nY6NINqnOosFPa4WKylMQTraEY2KhUH2XU1mh0Ni7EgyK10dfZvOUj90OjaxZtXkyZrZ89RTxog==", "dev": true, "peer": true, "funding": { @@ -696,9 +709,9 @@ } }, "node_modules/@tiptap/extension-code-block-lowlight": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.1.13.tgz", - "integrity": "sha512-PlU0lzAEbUGqPykl7fYqlAiY7/zFRtQExsbrpi2kctSIzxC+jgMM4vEpWxLS4jZEXl7jVHvBRH6lRNINDHWmQA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.2.6.tgz", + "integrity": "sha512-W/8C5nIwgGLvxjc+PfnCcWkfrUuJsIKjyZGXmq1hVXTTVA9eVGbS7m1YB/fsYTEg1ccwoM2JjKO9yuKCeR2xiQ==", "dev": true, "funding": { "type": "github", @@ -711,9 +724,9 @@ } }, "node_modules/@tiptap/extension-color": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.1.13.tgz", - "integrity": "sha512-T3tJXCIfFxzIlGOhvbPVIZa3y36YZRPYIo2TKsgkTz8LiMob6hRXXNFjsrFDp2Fnu3DrBzyvrorsW7767s4eYg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.2.6.tgz", + "integrity": "sha512-lQPr1b76pEptYN8DIOOMJ9Ik2S5KdoX61RyIPmQft5H/Viw/qhPZEqcyIu/rJqXSwHpArwbTJlXVXw1KQw2YvQ==", "dev": true, "funding": { "type": "github", @@ -725,9 +738,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.1.13.tgz", - "integrity": "sha512-wLwiTWsVmZTGIE5duTcHRmW4ulVxNW4nmgfpk95+mPn1iKyNGtrVhGWleLhBlTj+DWXDtcfNWZgqZkZNzhkqYQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.2.6.tgz", + "integrity": "sha512-yT9m5Oo9U/xAypcylaLiDE8qmVd3SCZSc8s5lqyC1OW+psb1oC0d14+TgKetO2s8K2wAbW2DxYG3yoxWffGYsQ==", "dev": true, "funding": { "type": "github", @@ -738,9 +751,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.13.tgz", - "integrity": "sha512-NAyJi4BJxH7vl/2LNS1X0ndwFKjEtX+cRgshXCnMyh7qNpIRW6Plczapc/W1OiMncOEhZJfpZfkRSfwG01FWFg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.2.6.tgz", + "integrity": "sha512-mCeIbbfe4rl8CuxVQvT7iYSKGVX/ls1LOwALwlHJz5Uw5l3VknAJdjEmHt6hNFdHu162JivL02Il0QYQ8BZwvA==", "dev": true, "funding": { "type": "github", @@ -752,9 +765,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.13.tgz", - "integrity": "sha512-9Oz7pk1Nts2+EyY+rYfnREGbLzQ5UFazAvRhF6zAJdvyuDmAYm0Jp6s0GoTrpV0/dJEISoFaNpPdMJOb9EBNRw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.2.6.tgz", + "integrity": "sha512-6ONKC6Dx8zCc5YffXpnQ9FxGRoUp5Jm9mOO3losgiDFhdJqaO7SCk1ziOiD7enoWqIc2shZh8ADnqttCfnFVFQ==", "dev": true, "dependencies": { "tippy.js": "^6.3.7" @@ -769,9 +782,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.13.tgz", - "integrity": "sha512-Cl5apsoTcyPPCgE3ThufxQxZ1wyqqh+9uxUN9VF9AbeTkid6oPZvKXwaILf6AFnkSy+SuKrb9kZD2iaezxpzXw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.2.6.tgz", + "integrity": "sha512-HDYu+FmL9V+khsiT5904Dy2qG6KrAvnXEjZk1+vVul0TabnQvl2rqHjTxmev3P1rOYTgePmaWXazxAWFIvbMBQ==", "dev": true, "funding": { "type": "github", @@ -783,9 +796,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.1.13.tgz", - "integrity": "sha512-TGkMzMQayuKg+vN4du0x1ahEItBLcCT1jdWeRsjdM8gHfzbPLdo4PQhVsvm1I0xaZmbJZelhnVsUwRZcIu1WNA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.2.6.tgz", + "integrity": "sha512-gwavC76sn26XQLyDaDtf28KIcbhMYPP+C5pkbRvAhVSckQB3Ebz3GRttVbm/jp+Uifp3bmoQEzISGCONEdKQoQ==", "dev": true, "funding": { "type": "github", @@ -796,9 +809,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.1.13.tgz", - "integrity": "sha512-PEmc19QLmlVUTiHWoF0hpgNTNPNU0nlaFmMKskzO+cx5Df4xvHmv/UqoIwp7/UFbPMkfVJT1ozQU7oD1IWn9Hg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.2.6.tgz", + "integrity": "sha512-XOmY+uezm42xSO1ero2bRBMdQxWytpxLJS+2shK0QogZ3sDplnfWfP5KV9Z2juXjTdPgPWG0ZaHzIIaLquEcfA==", "dev": true, "funding": { "type": "github", @@ -809,9 +822,9 @@ } }, "node_modules/@tiptap/extension-highlight": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.1.13.tgz", - "integrity": "sha512-ZivjJma5WwPYcG0rpnynVDGis32OGdtpTwETEb+2OOjZBCBlyYQ4tcRk5gS3nzBAjLl/Qu84VVbawLhHXB6few==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.2.6.tgz", + "integrity": "sha512-FUwLjW+g2l2t8bSmneBDPR2/LUDOdebiKTPjMBM1E+Qno4gnpGIHKPZCYg++ZTWyuxzjP7saXTEQ6SMw32B7jw==", "dev": true, "funding": { "type": "github", @@ -822,9 +835,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.1.13.tgz", - "integrity": "sha512-1ouitThGTBUObqw250aDwGLMNESBH5PRXIGybsCFO1bktdmWtEw7m72WY41EuX2BH8iKJpcYPerl3HfY1vmCNw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.2.6.tgz", + "integrity": "sha512-c2Aeozc+pHcpqghLjXRX/tGU/C+Gp6hApUWPXdhZw5Y/ARj6ZRwx2/ym2K8MOrJ36/W7gc7Xyxd9ZbG7m7pcjA==", "dev": true, "funding": { "type": "github", @@ -836,9 +849,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.13.tgz", - "integrity": "sha512-7OgjgNqZXvBejgULNdMSma2M1nzv4bbZG+FT5XMFZmEOxR9IB1x/RzChjPdeicff2ZK2sfhMBc4Y9femF5XkUg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.2.6.tgz", + "integrity": "sha512-zyLU+Xlk8y3yBCblE8pFwqAP2Rju1csyAu45hi3NCJ6HDGQGdjy8oh+Xa8y2kTPxRNMZARxqB+vCiEoW3YZn2A==", "dev": true, "funding": { "type": "github", @@ -850,9 +863,9 @@ } }, "node_modules/@tiptap/extension-image": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.1.13.tgz", - "integrity": "sha512-7oVAos+BU4KR/zQsfltrd8hgIxKxyxZ19dhwb1BJI2Nt3Mnx+yFPRlRSehID6RT9dYqgW4UW5d6vh/3HQcYYYw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.2.6.tgz", + "integrity": "sha512-MoDVjvi0AgYYSY9QR3ff2TOKk9IVVfh+BInmLCrwejSE2q8N3p/vSI+N1GKLEfW9mqn1zdI95ev17Z12Avwv7A==", "dev": true, "funding": { "type": "github", @@ -863,9 +876,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.1.13.tgz", - "integrity": "sha512-HyDJfuDn5hzwGKZiANcvgz6wcum6bEgb4wmJnfej8XanTMJatNVv63TVxCJ10dSc9KGpPVcIkg6W8/joNXIEbw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.2.6.tgz", + "integrity": "sha512-wB+Y6p2gbc1f2hKYeGNXRQ7P2xi3+JzD3PjSyC9Ss/yyujZhxSOtxBF0nzFXdI+7nmN0Qm4inwPDU/DVrIPb+A==", "dev": true, "funding": { "type": "github", @@ -876,9 +889,9 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.1.13.tgz", - "integrity": "sha512-wuGMf3zRtMHhMrKm9l6Tft5M2N21Z0UP1dZ5t1IlOAvOeYV2QZ5UynwFryxGKLO0NslCBLF/4b/HAdNXbfXWUA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.2.6.tgz", + "integrity": "sha512-Jj0oXSfQ8gZlzzwd669B8sEKBkoK8xV31Lu55tRv9PKHSU6p9CUqBuxY8qR+cquCtO28f3u0cdl5o4HzeIUL5A==", "dev": true, "dependencies": { "linkifyjs": "^4.1.0" @@ -893,9 +906,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.1.13.tgz", - "integrity": "sha512-6e8iiCWXOiJTl1XOwVW2tc0YG18h70HUtEHFCx2m5HspOGFKsFEaSS3qYxOheM9HxlmQeDt8mTtqftRjEFRxPQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.2.6.tgz", + "integrity": "sha512-3xig1q0jtOyV49TkAbvxBoOJdNypwq6vLYerfblhj6dK+hIIZUM33S+SmGl2+QaB25VwyeSHjiCvrJjB9PKWHQ==", "dev": true, "funding": { "type": "github", @@ -906,9 +919,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.13.tgz", - "integrity": "sha512-UO4ZAL5Vrr1WwER5VjgmeNIWHpqy9cnIRo1En07gZ0OWTjs1eITPcu+4TCn1ZG6DhoFvAQzE5DTxxdhIotg+qw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.2.6.tgz", + "integrity": "sha512-h4HOv+TAMnoueh3CzUY2/Pp2n8eCdEQtKSfiMtHSO3NTTSlst0XEvq+3Z4K81F+ni3baXc+JUALP5dRVpI4apQ==", "dev": true, "funding": { "type": "github", @@ -919,9 +932,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.1.13.tgz", - "integrity": "sha512-cEoZBJrsQn69FPpUMePXG/ltGXtqKISgypj70PEHXt5meKDjpmMVSY4/8cXvFYEYsI9GvIwyAK0OrfAHiSoROA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.2.6.tgz", + "integrity": "sha512-M2rM3pfzziUb7xS9x2dANCokO89okbqg5IqU4VPkZhk0Mfq9czyCatt58TYkAsE3ccsGhdTYtFBTDeKBtsHUqg==", "dev": true, "funding": { "type": "github", @@ -932,9 +945,9 @@ } }, "node_modules/@tiptap/extension-placeholder": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.1.13.tgz", - "integrity": "sha512-vIY7y7UbqsrAW/y8bDE9eRenbQEU16kNHB5Wri8RU1YiUZpkPgdXP/pLqyjIIq95SwP/vdTIHjHoQ77VLRl1hA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.2.6.tgz", + "integrity": "sha512-eHPadx48gneDD8bTZeRnG4hOvRvctBPY5JlA03QQIoarrbmqsyv3zZSW8smBsRai9kwbXLhytdEFGruTKV9PjQ==", "dev": true, "funding": { "type": "github", @@ -946,9 +959,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.1.13.tgz", - "integrity": "sha512-VN6zlaCNCbyJUCDyBFxavw19XmQ4LkCh8n20M8huNqW77lDGXA2A7UcWLHaNBpqAijBRu9mWI8l4Bftyf2fcAw==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.2.6.tgz", + "integrity": "sha512-0fRh0SwPgqi+ZKD2NpRrmIAHdsgf27ddEUfvlIuFG5b9zqFa6pRZGpXW/6LyBwU0+0bkjW8/Wg3otyaRGjvZGw==", "dev": true, "funding": { "type": "github", @@ -959,9 +972,9 @@ } }, "node_modules/@tiptap/extension-subscript": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.1.13.tgz", - "integrity": "sha512-+kqK0P669Dsl/7IPSQNM/bN35Er45MKtHn8eQmudcLpFmBTsL6DlxG/080/Lqr49a6OLcefQfLaENz+QQVfBag==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.2.6.tgz", + "integrity": "sha512-nwRhuwI3xD3kmCT6nahQZ3DcBJLBKv9051h+dvuYYV+bGAC1tHGkjER9A9/z0yUV/PFqzxK7h41Xfarwb1IjMA==", "dev": true, "funding": { "type": "github", @@ -972,9 +985,9 @@ } }, "node_modules/@tiptap/extension-superscript": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.1.13.tgz", - "integrity": "sha512-wZr9Ls7YYvzbVInBqqpQkn+/YwG3b78Rg3U1TldCcbg0IprwFyPsFHvu0NZnqYEG4MHhaF3F1sZRtPdZ0hDy8g==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.2.6.tgz", + "integrity": "sha512-RWhsJL+Tq5KYztjJJMKZPFHQGwPDAqcI2W4jVmgsDzhpE6trE8jChRe2Gy/c2kzCA5rfjMLCOXdkVPAwK/tZ6Q==", "dev": true, "funding": { "type": "github", @@ -985,9 +998,9 @@ } }, "node_modules/@tiptap/extension-table": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-2.1.13.tgz", - "integrity": "sha512-yMWt2LqotOsWJhLwFNo8fyTwJNLPtnk+eCUxKLlMXP23mJ/lpF+jvTihhHVVic5GqV9vLYZFU2Tn+5k/Vd5P1w==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-2.2.6.tgz", + "integrity": "sha512-O26Uj/A9AR8QJZvjSaTCI6Jpuc7MD8ul0vjqJ9EKulzMaAJbiOJidcBPr7rhVxAIRrXQz+DQW+zFbZvTj5i5mQ==", "dev": true, "funding": { "type": "github", @@ -999,9 +1012,9 @@ } }, "node_modules/@tiptap/extension-table-cell": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.1.13.tgz", - "integrity": "sha512-30pyVt2PxGAk8jmsXKxDheql8K/xIRA9FiDo++kS2Kr6Y7I42/kNPQttJ2W+Q1JdRJvedNfQtziQfKWDRLLCNA==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.2.6.tgz", + "integrity": "sha512-i/O27W0O2Bp+txeYUz8thZJaIHTb8BvPseYENiYBs9qOjpwiqXgQXVa5wTAm93GtHoK2ifs50a/xp2CIDTYsgw==", "dev": true, "funding": { "type": "github", @@ -1012,9 +1025,9 @@ } }, "node_modules/@tiptap/extension-table-header": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.1.13.tgz", - "integrity": "sha512-FwIV5iso5kmpu01QyvrPCjJqZfqxRTjtjMsDyut2uIgx9v5TXk0V5XvMWobx435ANIDJoGTYCMRlIqcgtyqwAQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.2.6.tgz", + "integrity": "sha512-1IFGBVV/wJwO7aM8u6gN90OmT35ulJoNFQEssoxrx8g+tj+mZy5vXq2JGPqFg7AVjIpek1DJrzzcXGnbtXS57w==", "dev": true, "funding": { "type": "github", @@ -1025,9 +1038,9 @@ } }, "node_modules/@tiptap/extension-table-row": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.1.13.tgz", - "integrity": "sha512-27Mb9/oYbiLd+/BUFMhQzRIqMd2Z5j1BZMYsktwtDG8vGdYVlaW257UVaoNR9TmiXyIzd3Dh1mOil8G35+HRHg==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.2.6.tgz", + "integrity": "sha512-sUTpzzR6zR6iFLXszK4qak0/qd8Gjz9/mnj9sdRJhXtVT+VPssU0iVBMyIfn01nnoUzMPpakcO1Vd5dSJNhoVg==", "dev": true, "funding": { "type": "github", @@ -1038,9 +1051,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.1.13.tgz", - "integrity": "sha512-zzsTTvu5U67a8WjImi6DrmpX2Q/onLSaj+LRWPh36A1Pz2WaxW5asZgaS+xWCnR+UrozlCALWa01r7uv69jq0w==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.2.6.tgz", + "integrity": "sha512-wVpo0I/2tJsBK/2yNZfRXOsThOfHCdTY+FDNO/USx9MCJaJ3LPs3H1AuGO549zNmZgkD+1MqcZqrYt9n4i03cw==", "dev": true, "funding": { "type": "github", @@ -1051,9 +1064,9 @@ } }, "node_modules/@tiptap/extension-text-align": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.1.13.tgz", - "integrity": "sha512-ZmbGpi5FHGsWyzt+8DceXERr/Vwxhjpm2VKWZyFTVz8uNJVj+/ou196JQJZqxbp5VtKkS7UYujaO++G5eflb0Q==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.2.6.tgz", + "integrity": "sha512-6vVK46e2NsVE4mz9dAmgYbsnJM93ukcbcQ0huCiPryM6uAg2OIfJw6X7Ha4Rdo6ee0xpNENmP8hG1wd+9b4Pyg==", "dev": true, "funding": { "type": "github", @@ -1064,9 +1077,9 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.1.13.tgz", - "integrity": "sha512-K9/pNHxpZKQoc++crxrsppVUSeHv8YevfY2FkJ4YMaekGcX+q4BRrHR0tOfii4izAUPJF2L0/PexLQaWXtAY1w==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.2.6.tgz", + "integrity": "sha512-EVR/CN9vi0w/n57n7QYHVA3NK5pgh3f82qJT1z6kAOzRzRPhrWt9/gXXuv6EnRNqS7Nke0v5+TVFd9bHd4Vpzw==", "dev": true, "funding": { "type": "github", @@ -1077,9 +1090,9 @@ } }, "node_modules/@tiptap/extension-underline": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.1.13.tgz", - "integrity": "sha512-z0CNKPjcvU8TrUSTui1voM7owssyXE9WvEGhIZMHzWwlx2ZXY2/L5+Hh33X/LzSKB9OGf/g1HAuHxrPcYxFuAQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.2.6.tgz", + "integrity": "sha512-RaYEWuBHS6VQ2KXk+pP2b3xDN4vxmTb7+CF84mumR+CJUK4uAx01IDBUof+h/a4Sa58suNLQ6eHY33NmxPppnQ==", "dev": true, "funding": { "type": "github", @@ -1090,29 +1103,29 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.1.13.tgz", - "integrity": "sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==", - "dev": true, - "dependencies": { - "prosemirror-changeset": "^2.2.0", - "prosemirror-collab": "^1.3.0", - "prosemirror-commands": "^1.3.1", - "prosemirror-dropcursor": "^1.5.0", - "prosemirror-gapcursor": "^1.3.1", - "prosemirror-history": "^1.3.0", - "prosemirror-inputrules": "^1.2.0", - "prosemirror-keymap": "^1.2.0", - "prosemirror-markdown": "^1.10.1", - "prosemirror-menu": "^1.2.1", - "prosemirror-model": "^1.18.1", - "prosemirror-schema-basic": "^1.2.0", - "prosemirror-schema-list": "^1.2.2", - "prosemirror-state": "^1.4.1", - "prosemirror-tables": "^1.3.0", - "prosemirror-trailing-node": "^2.0.2", - "prosemirror-transform": "^1.7.0", - "prosemirror-view": "^1.28.2" + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.2.6.tgz", + "integrity": "sha512-gSKJtsaMLiYNwcAdwgnlTVM9zHiHy6/WgJvXFmIoOnUgvMN10Bbr+KO5hoffwgLCCSpIWw6qJoVKMpHBexLm0w==", + "dev": true, + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.5.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.3.2", + "prosemirror-inputrules": "^1.3.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.12.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.19.4", + "prosemirror-schema-basic": "^1.2.2", + "prosemirror-schema-list": "^1.3.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.3.5", + "prosemirror-trailing-node": "^2.0.7", + "prosemirror-transform": "^1.8.0", + "prosemirror-view": "^1.32.7" }, "funding": { "type": "github", @@ -1120,9 +1133,9 @@ } }, "node_modules/@tiptap/suggestion": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.1.13.tgz", - "integrity": "sha512-Y05TsiXTFAJ5SrfoV+21MAxig5UNbY0AVa03lQlh/yicTRPpIc6hgZzblB0uxDSYoj6+kaHE4MIZvPvhUD8BJQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-2.2.6.tgz", + "integrity": "sha512-/pooAwvUkUB1gKxe4AHAvaNpAvL3FsZrIBJKYR0PF6BNROOHiu4IZY0Zy27ea4vmj72pYrMVlTmeYtSGPzrICg==", "dev": true, "funding": { "type": "github", @@ -1134,32 +1147,14 @@ } }, "node_modules/@types/hast": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", - "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "dev": true, "dependencies": { "@types/unist": "^2" } }, - "node_modules/@types/object.omit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/object.omit/-/object.omit-3.0.3.tgz", - "integrity": "sha512-xrq4bQTBGYY2cw+gV4PzoG2Lv3L0pjZ1uXStRRDQoATOYW1lCsFQHhQ+OkPhIcQoqLjAq7gYif7D14Qaa6Zbew==", - "dev": true - }, - "node_modules/@types/object.pick": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/object.pick/-/object.pick-1.3.4.tgz", - "integrity": "sha512-5PjwB0uP2XDp3nt5u5NJAG2DORHIRClPzWT/TTZhJ2Ekwe8M5bA9tvPdi9NO/n2uvu2/ictat8kgqvLfcIE1SA==", - "dev": true - }, - "node_modules/@types/throttle-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", - "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", - "dev": true - }, "node_modules/@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", @@ -1182,9 +1177,9 @@ "dev": true }, "node_modules/alpinejs": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.13.3.tgz", - "integrity": "sha512-WZ6WQjkAOl+WdW/jukzNHq9zHFDNKmkk/x6WF7WdyNDD6woinrfXCVsZXm0galjbco+pEpYmJLtwlZwcOfIVdg==", + "version": "3.13.8", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.13.8.tgz", + "integrity": "sha512-XolbBJryCndomtaHd/KHQjQeD/L72FJxy/YhLLFD4Lr7zzGcpcbg+UgXteMR2pYg1KhRUr6V4O3GfN1zJAmRWw==", "dev": true, "dependencies": { "@vue/reactivity": "~3.1.1" @@ -1246,30 +1241,34 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -1286,9 +1285,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -1305,9 +1304,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -1323,10 +1322,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1335,12 +1337,12 @@ } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1372,12 +1374,15 @@ ] }, "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -1414,9 +1419,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -1433,8 +1438,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -1470,14 +1475,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1493,9 +1503,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "version": "1.0.30001606", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", + "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", "dev": true, "funding": [ { @@ -1512,18 +1522,6 @@ } ] }, - "node_modules/case-anything": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", - "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", - "dev": true, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -1537,16 +1535,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1559,6 +1551,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -1700,19 +1695,55 @@ "node": ">=4" } }, - "node_modules/dash-get": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dash-get/-/dash-get-1.0.2.tgz", - "integrity": "sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==", - "dev": true + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/defaults": { @@ -1728,17 +1759,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -1779,16 +1813,28 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { - "version": "1.4.602", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.602.tgz", - "integrity": "sha512-TZdkh+47iRPDtFH9+vuOU7uaZftA7PBDQkk+Tny/gLrYgflyooAk/bHvmK7MSTvQoPKLvy702PC4RiS/6Ffdxw==", + "version": "1.4.729", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz", + "integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" @@ -1807,50 +1853,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -1859,15 +1912,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -1891,9 +1977,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", - "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -1903,34 +1989,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.8", - "@esbuild/android-arm64": "0.19.8", - "@esbuild/android-x64": "0.19.8", - "@esbuild/darwin-arm64": "0.19.8", - "@esbuild/darwin-x64": "0.19.8", - "@esbuild/freebsd-arm64": "0.19.8", - "@esbuild/freebsd-x64": "0.19.8", - "@esbuild/linux-arm": "0.19.8", - "@esbuild/linux-arm64": "0.19.8", - "@esbuild/linux-ia32": "0.19.8", - "@esbuild/linux-loong64": "0.19.8", - "@esbuild/linux-mips64el": "0.19.8", - "@esbuild/linux-ppc64": "0.19.8", - "@esbuild/linux-riscv64": "0.19.8", - "@esbuild/linux-s390x": "0.19.8", - "@esbuild/linux-x64": "0.19.8", - "@esbuild/netbsd-x64": "0.19.8", - "@esbuild/openbsd-x64": "0.19.8", - "@esbuild/sunos-x64": "0.19.8", - "@esbuild/win32-arm64": "0.19.8", - "@esbuild/win32-ia32": "0.19.8", - "@esbuild/win32-x64": "0.19.8" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -1948,12 +2035,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -1983,9 +2064,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2017,9 +2098,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -2045,6 +2126,93 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/foreground-child/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -2081,12 +2249,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2138,28 +2300,33 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -2169,20 +2336,22 @@ } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2200,6 +2369,30 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", @@ -2252,21 +2445,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -2288,12 +2481,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -2303,9 +2496,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -2349,16 +2542,6 @@ } ] }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2366,12 +2549,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -2380,14 +2563,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2463,13 +2648,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -2478,16 +2663,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { @@ -2499,6 +2687,15 @@ "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, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2524,9 +2721,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -2559,18 +2756,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -2588,12 +2773,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2630,12 +2818,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -2680,13 +2868,22 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jiti": { @@ -2720,12 +2917,12 @@ "dev": true }, "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/linkifyjs": { @@ -2822,26 +3019,30 @@ "node": ">=12.0.0" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } }, "node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/mdn-data": { @@ -2851,9 +3052,9 @@ "dev": true }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "node_modules/memorystream": { @@ -2938,6 +3139,15 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -3111,39 +3321,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.omit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", - "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", - "dev": true, - "dependencies": { - "is-extendable": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -3201,15 +3378,6 @@ "node": ">=4" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -3225,6 +3393,22 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -3294,10 +3478,19 @@ "node": ">= 6" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -3316,7 +3509,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3394,12 +3587,15 @@ } }, "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/postcss-nested": { @@ -3422,9 +3618,9 @@ } }, "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -3469,9 +3665,9 @@ } }, "node_modules/prettier-plugin-blade": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/prettier-plugin-blade/-/prettier-plugin-blade-1.6.16.tgz", - "integrity": "sha512-wYGOUDJK29BrikP0gbOT0bmII3wh1F/RPiXn9+Y7IiiMlF5S/raV77iYMadTDMOTXyyEgdxgIs2ic3sr6Aw0fw==", + "version": "1.6.19", + "resolved": "https://registry.npmjs.org/prettier-plugin-blade/-/prettier-plugin-blade-1.6.19.tgz", + "integrity": "sha512-0UZNCZwusNGw/sJLabfhlbbQ8c1SYyTMQuqFyhjYx53DABHSE0gfddGeW0LLH9hAj3gFoGsfcOeUW9KTMuHQaA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -3545,9 +3741,9 @@ } }, "node_modules/prosemirror-history": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.2.tgz", - "integrity": "sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.0.tgz", + "integrity": "sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ==", "dev": true, "dependencies": { "prosemirror-state": "^1.2.2", @@ -3557,9 +3753,9 @@ } }, "node_modules/prosemirror-inputrules": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.3.0.tgz", - "integrity": "sha512-z1GRP2vhh5CihYMQYsJSa1cOwXb3SYxALXOIfAkX8nZserARtl9LiL+CEl+T+OFIsXc3mJIHKhbsmRzC0HDAXA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", "dev": true, "dependencies": { "prosemirror-state": "^1.0.0", @@ -3577,12 +3773,12 @@ } }, "node_modules/prosemirror-markdown": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.11.2.tgz", - "integrity": "sha512-Eu5g4WPiCdqDTGhdSsG9N6ZjACQRYrsAkrF9KYfdMaCmjIApH75aVncsWYOJvEk2i1B3i8jZppv3J/tnuHGiUQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz", + "integrity": "sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==", "dev": true, "dependencies": { - "markdown-it": "^13.0.1", + "markdown-it": "^14.0.0", "prosemirror-model": "^1.0.0" } }, @@ -3599,9 +3795,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.3.tgz", - "integrity": "sha512-tgSnwN7BS7/UM0sSARcW+IQryx2vODKX4MI7xpqY2X+iaepJdKBPc7I4aACIsDV/LTaTjt12Z56MhDr9LsyuZQ==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.4.tgz", + "integrity": "sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==", "dev": true, "dependencies": { "orderedmap": "^2.0.0" @@ -3639,9 +3835,9 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.5.tgz", - "integrity": "sha512-JSZ2cCNlApu/ObAhdPyotrjBe2cimniniTpz60YXzbL0kZ+47nEYk2LWbfKU2lKpBkUNquta2PjteoNi4YCluQ==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz", + "integrity": "sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA==", "dev": true, "dependencies": { "prosemirror-keymap": "^1.1.2", @@ -3652,13 +3848,12 @@ } }, "node_modules/prosemirror-trailing-node": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.7.tgz", - "integrity": "sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz", + "integrity": "sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA==", "dev": true, "dependencies": { "@remirror/core-constants": "^2.0.2", - "@remirror/core-helpers": "^3.0.0", "escape-string-regexp": "^4.0.0" }, "peerDependencies": { @@ -3677,9 +3872,9 @@ } }, "node_modules/prosemirror-view": { - "version": "1.32.5", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.32.5.tgz", - "integrity": "sha512-OZ8JSytiOr1mlxu8XSPJSNMn3sQrycbP12Peubwsnq9xiyQk4F58u9wOPJYSXXG/uOXZQNSAITRnScZPdjEh+A==", + "version": "1.33.3", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.3.tgz", + "integrity": "sha512-P4Ao/bc4OrU/2yLIf8dL4lJaEtjLR3QjIvQHgJYp2jUS7kYM4bSR6okbBjkqzOs/FwUon6UGjTLdKMnPL1MZqw==", "dev": true, "dependencies": { "prosemirror-model": "^1.16.0", @@ -3693,6 +3888,15 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3763,14 +3967,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -3852,13 +4057,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -3890,15 +4095,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3913,29 +4121,32 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3972,14 +4183,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3992,9 +4207,9 @@ "dev": true }, "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.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4011,9 +4226,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -4027,9 +4242,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/stdin-discarder": { @@ -4056,15 +4271,75 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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 + }, + "node_modules/string-width-cjs/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.padend": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", - "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4074,14 +4349,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4091,28 +4367,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4133,6 +4412,28 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/strip-ansi-cjs": { + "name": "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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -4143,14 +4444,14 @@ } }, "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -4161,7 +4462,7 @@ "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/supports-color": { @@ -4189,9 +4490,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", - "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -4202,7 +4503,7 @@ "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -4226,9 +4527,9 @@ } }, "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -4259,15 +4560,6 @@ "node": ">=0.8" } }, - "node_modules/throttle-debounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", @@ -4295,42 +4587,31 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -4340,16 +4621,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -4359,23 +4641,29 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "node_modules/unbox-primitive": { @@ -4489,16 +4777,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4507,17 +4795,135 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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 + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } diff --git a/resources/dist/filament-tiptap-editor.css b/resources/dist/filament-tiptap-editor.css index 436bad3..0969763 100644 --- a/resources/dist/filament-tiptap-editor.css +++ b/resources/dist/filament-tiptap-editor.css @@ -1,999 +1 @@ -/* - -Night Owl for highlight.js (c) Carl Baxter - -An adaptation of Sarah Drasner's Night Owl VS Code Theme -https://github.com/sdras/night-owl-vscode-theme - -Copyright (c) 2018 Sarah Drasner - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -.tiptap-editor .ProseMirror .hljs { - background: rgba(var(--gray-800), 1); - color: #d6deeb; - padding: 0.5rem 1rem; - border-radius: 0.5rem; - font-size: 0.875rem; - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace, monospace; -} - -/* General Purpose */ - -.tiptap-editor .ProseMirror .hljs-keyword { - color: #c792ea; -} - -.tiptap-editor .ProseMirror .hljs-built_in { - color: #addb67; -} - -.tiptap-editor .ProseMirror .hljs-type { - color: #82aaff; -} - -.tiptap-editor .ProseMirror .hljs-literal { - color: #ff5874; -} - -.tiptap-editor .ProseMirror .hljs-number { - color: #F78C6C; -} - -.tiptap-editor .ProseMirror .hljs-regexp { - color: #5ca7e4; -} - -.tiptap-editor .ProseMirror .hljs-string { - color: #ecc48d; -} - -.tiptap-editor .ProseMirror .hljs-subst { - color: #d3423e; -} - -.tiptap-editor .ProseMirror .hljs-symbol { - color: #82aaff; -} - -.tiptap-editor .ProseMirror .hljs-class { - color: #ffcb8b; -} - -.tiptap-editor .ProseMirror .hljs-function { - color: #82AAFF; -} - -.tiptap-editor .ProseMirror .hljs-title { - color: #DCDCAA; -} - -.tiptap-editor .ProseMirror .hljs-params { - color: #7fdbca; -} - -/* Meta */ - -.tiptap-editor .ProseMirror .hljs-comment { - color: #637777; -} - -.tiptap-editor .ProseMirror .hljs-doctag { - color: #7fdbca; -} - -.tiptap-editor .ProseMirror .hljs-meta { - color: #82aaff; -} - -.tiptap-editor .ProseMirror .hljs-meta .hljs-keyword { - color: #82aaff; -} - -.tiptap-editor .ProseMirror .hljs-meta .hljs-string { - color: #ecc48d; -} - -/* Tags, attributes, config */ - -.tiptap-editor .ProseMirror .hljs-section { - color: #82b1ff; -} - -.tiptap-editor .ProseMirror .hljs-tag, - .tiptap-editor .ProseMirror .hljs-name { - color: #7fdbca; -} - -.tiptap-editor .ProseMirror .hljs-attr { - color: #7fdbca; -} - -.tiptap-editor .ProseMirror .hljs-attribute { - color: #80cbc4; -} - -.tiptap-editor .ProseMirror .hljs-variable { - color: #addb67; -} - -/* Markup */ - -.tiptap-editor .ProseMirror .hljs-bullet { - color: #d9f5dd; -} - -.tiptap-editor .ProseMirror .hljs-code { - color: #80CBC4; -} - -.tiptap-editor .ProseMirror .hljs-emphasis { - color: #c792ea; - font-style: italic; -} - -.tiptap-editor .ProseMirror .hljs-strong { - color: #addb67; - font-weight: bold; -} - -.tiptap-editor .ProseMirror .hljs-formula { - color: #c792ea; -} - -.tiptap-editor .ProseMirror .hljs-link { - color: #ff869a; -} - -.tiptap-editor .ProseMirror .hljs-quote { - color: #697098; -} - -/* CSS */ - -.tiptap-editor .ProseMirror .hljs-selector-tag { - color: #ff6363; -} - -.tiptap-editor .ProseMirror .hljs-selector-id { - color: #fad430; -} - -.tiptap-editor .ProseMirror .hljs-selector-class { - color: #addb67; -} - -.tiptap-editor .ProseMirror .hljs-selector-attr, - .tiptap-editor .ProseMirror .hljs-selector-pseudo { - color: #c792ea; -} - -/* Templates */ - -.tiptap-editor .ProseMirror .hljs-template-tag { - color: #c792ea; -} - -.tiptap-editor .ProseMirror .hljs-template-variable { - color: #addb67; -} - -/* diff */ - -.tiptap-editor .ProseMirror .hljs-addition { - color: #addb67ff; - font-style: italic; -} - -.tiptap-editor .ProseMirror .hljs-deletion { - color: #EF535090; - font-style: italic; -} - -[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn { - height: 100%; -} - -[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div { - height: 100%; -} - -[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div .fi-fo-field-wrp { - height: 100%; -} - -[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div .fi-fo-field-wrp > div { - height: 100%; - grid-template-rows: auto 1fr; -} - -[wire\:key*="filament_tiptap_source"] .fi-fo-component-ctn > div .fi-fo-field-wrp > div textarea { - height: 100% !important; -} - -.tiptap-wrapper.tiptap-fullscreen { - position: fixed; - top: 0; - left: 0; - bottom: 0; - right: 0; - z-index: 40; - display: flex; - flex-direction: column; - height: 100%; -} - -.tiptap-wrapper.tiptap-fullscreen .tiptap-toolbar { - border-radius: 0; -} - -.tiptap-wrapper.tiptap-fullscreen .tiptap-prosemirror-wrapper { - max-height: 100%; - padding-block-end: 3rem; -} - -.tiptap-editor .tiptap-content { - display: flex; - flex-direction: column; -} - -.tiptap-prosemirror-wrapper.prosemirror-w-sm { - padding: 0 max(1rem, calc((100% - 24rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-md { - padding: 0 max(1rem, calc((100% - 28rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-lg { - padding: 0 max(1rem, calc((100% - 32rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-xl { - padding: 0 max(1rem, calc((100% - 36rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-2xl { - padding: 0 max(1rem, calc((100% - 42rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-3xl { - padding: 0 max(1rem, calc((100% - 48rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-4xl { - padding: 0 max(1rem, calc((100% - 56rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-5xl { - padding: 0 max(1rem, calc((100% - 64rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-6xl { - padding: 0 max(1rem, calc((100% - 72rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-7xl { - padding: 0 max(1rem, calc((100% - 80rem) / 2)); -} - -.tiptap-prosemirror-wrapper.prosemirror-w-none { - padding: 0 1rem; -} - -.tiptap-editor .ProseMirror { - border-bottom-left-radius: 0.375rem; - border-bottom-right-radius: 0.375rem; - flex: 1 1 0; - padding-block: 1rem; - margin-inline: auto; - position: relative; - width: 100%; - color: #000; -} - -.tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode { - outline-style: dashed; - outline-width: 2px; - outline-offset: 2px; - outline-color: rgba(var(--gray-700), 1); -} - -:is(.dark .tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode) { - outline-color: rgba(var(--gray-300), 1); -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper { - overflow: hidden; - border-radius: 0.375rem; - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-100), var(--tw-bg-opacity)); -} - -:is(.dark .tiptap-editor .ProseMirror .tiptap-block-wrapper) { - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-800), var(--tw-bg-opacity)); -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading { - display: flex; - align-items: center; - justify-content: space-between; - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-200), var(--tw-bg-opacity)); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.75rem; - padding-right: 0.75rem; - line-height: 1; - --tw-text-opacity: 1; - color: rgba(var(--gray-900), var(--tw-text-opacity)); -} - -:is(.dark .tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading) { - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-950), var(--tw-bg-opacity)); - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading .tiptap-block-title { - font-size: 0.875rem; - line-height: 1.25rem; - font-weight: 700; - text-transform: uppercase; - opacity: 0.8; -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions { - display: flex; - align-items: center; - gap: 0.5rem; -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button { - opacity: 0.75; -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:hover { - --tw-text-opacity: 1; - color: rgba(var(--primary-500), var(--tw-text-opacity)); - opacity: 1; -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:focus { - --tw-text-opacity: 1; - color: rgba(var(--primary-500), var(--tw-text-opacity)); - opacity: 1; -} - -.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .preview { - padding: 1rem; -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle { - width: 100%; - max-width: 100vw; - padding-block: 1rem; - background-color: rgba(var(--gray-800), 1); - position: relative; -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle::before, - .tiptap-editor .ProseMirror .filament-tiptap-hurdle::after { - content: ''; - position: absolute; - display: block; - width: 100%; - top: 0; - bottom: 0; - background-color: inherit; -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle::before { - left: -100%; -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle::after { - right: -100%; -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="gray_light"] { - color: rgba(var(--gray-900), 1); - background-color: rgba(var(--gray-300), 1); -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="gray"] { - color: white; - background-color: rgba(var(--gray-500), 1); -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="gray_dark"] { - color: white; - background-color: rgba(var(--gray-800), 1); -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="primary"] { - color: rgba(var(--gray-900), 1); - background-color: rgba(var(--primary-500), 1); -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="secondary"] { - color: rgba(var(--gray-900), 1); - background-color: rgba(var(--warning-500), 1); -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="tertiary"] { - color: white; - background-color: rgba(var(--success-500), 1); -} - -.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color="accent"] { - color: white; - background-color: rgba(var(--danger-500), 1); -} - -.tiptap-editor .ProseMirror.ProseMirror-focused { - outline: none; -} - -.tiptap-editor .ProseMirror > * + * { - margin-block-start: 1rem; -} - -.tiptap-editor .ProseMirror > * + h1, - .tiptap-editor .ProseMirror > * + h2, - .tiptap-editor .ProseMirror > * + h3, - .tiptap-editor .ProseMirror > * + h4, - .tiptap-editor .ProseMirror > * + h5, - .tiptap-editor .ProseMirror > * + h6 { - margin-block-start: 2rem; -} - -.tiptap-editor .ProseMirror img { - display: inline-block; -} - -.tiptap-editor .ProseMirror h1, - .tiptap-editor .ProseMirror h2, - .tiptap-editor .ProseMirror h3, - .tiptap-editor .ProseMirror h4, - .tiptap-editor .ProseMirror h5, - .tiptap-editor .ProseMirror h6 { - font-weight: bold; -} - -.tiptap-editor .ProseMirror h1 { - font-size: 1.75rem; - line-height: 1.1; -} - -.tiptap-editor .ProseMirror h2 { - font-size: 1.5rem; - line-height: 1.1; -} - -.tiptap-editor .ProseMirror h3 { - font-size: 1.25rem; - line-height: 1.25; -} - -.tiptap-editor .ProseMirror h4 { - font-size: 1.125rem; -} - -.tiptap-editor .ProseMirror .lead { - font-size: 1.375rem; - line-height: 1.3; -} - -.tiptap-editor .ProseMirror small { - font-size: 0.75rem; -} - -.tiptap-editor .ProseMirror ul > :not([hidden]) ~ :not([hidden]), - .tiptap-editor .ProseMirror ol > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); -} - -.tiptap-editor .ProseMirror ul, - .tiptap-editor .ProseMirror ol { - padding-inline-start: 1rem; - margin-inline-start: 1rem; -} - -.tiptap-editor .ProseMirror ul { - list-style: disc; -} - -.tiptap-editor .ProseMirror ol { - list-style: decimal; -} - -.tiptap-editor .ProseMirror ul.checked-list { - list-style-type: none; - margin-inline-start: 0; -} - -.tiptap-editor .ProseMirror ul.checked-list li { - display: flex; - align-items: baseline; - gap: 0.375em; -} - -.tiptap-editor .ProseMirror ul.checked-list li::before { - content: '✓'; - width: 1.25rem; - height: 1.25rem; - flex-shrink: 0; -} - -.tiptap-editor .ProseMirror blockquote { - border-left: 0.25rem solid rgba(var(--gray-400), 1); - padding-inline-start: 0.5rem; - margin-inline-start: 1rem; - font-size: 1.25rem; -} - -.tiptap-editor .ProseMirror hr { - border-color: rgba(var(--gray-400), 1); -} - -.tiptap-editor .ProseMirror a { - color: #2563eb; - text-decoration: underline; -} - -.tiptap-editor .ProseMirror a[id] { - color: #000; - text-decoration: none; -} - -.tiptap-editor .ProseMirror a[id]::before { - content: '# '; - color: rgba(var(--gray-500), 1); - opacity: 50; -} - -.tiptap-editor .ProseMirror a[data-as-button="true"] { - background-color: rgba(var(--gray-900), 1); - color: white !important; - text-decoration: none; - display: inline-block; - border-radius: 0.375rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1.25rem; - padding-right: 1.25rem; -} - -.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="primary"] { - background-color: rgba(var(--primary-600), 1); -} - -.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="secondary"] { - background-color: rgba(var(--warning-600), 1); -} - -.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="tertiary"] { - background-color: rgba(var(--success-600), 1); -} - -.tiptap-editor .ProseMirror a[data-as-button="true"][data-as-button-theme="accent"] { - background-color: rgba(var(--danger-600), 1); -} - -.tiptap-editor .ProseMirror sup { - font-size: 65%; -} - -.tiptap-editor .ProseMirror img { - border: dashed 2px transparent; -} - -.tiptap-editor .ProseMirror img.ProseMirror-selectednode { - border-radius: 0.25rem; - outline-offset: 2px; - outline: rgba(var(--gray-900), 1) dashed 2px; -} - -.tiptap-editor .ProseMirror table { - border-collapse: collapse; - margin: 0; - overflow: hidden; - table-layout: fixed; - width: 100%; - position: relative; -} - -.tiptap-editor .ProseMirror table td, - .tiptap-editor .ProseMirror table th { - border: 1px solid rgba(var(--gray-400), 1); - min-width: 1em; - padding: 3px 5px; - vertical-align: top; - background-clip: padding-box -} - -.tiptap-editor .ProseMirror table td > *, - .tiptap-editor .ProseMirror table th > * { - margin-bottom: 0; -} - -.tiptap-editor .ProseMirror table th { - background-color: rgba(var(--gray-200), 1); - color: rgba(var(--gray-700), 1); - font-weight: 700; - text-align: left; -} - -.tiptap-editor .ProseMirror table .selectedCell { - position: relative; -} - -.tiptap-editor .ProseMirror table .selectedCell:after { - background: rgba(200, 200, 255, 0.4); - content: ""; - left: 0; - right: 0; - top: 0; - bottom: 0; - pointer-events: none; - position: absolute; - z-index: 2; -} - -.tiptap-editor .ProseMirror table .column-resize-handle { - background-color: #adf; - bottom: -2px; - position: absolute; - right: -2px; - pointer-events: none; - top: 0; - width: 4px; -} - -.tiptap-editor .ProseMirror table p { - margin: 0; -} - -.tiptap-editor .ProseMirror .tableWrapper { - padding: 1rem 0; - overflow-x: auto; -} - -.tiptap-editor .ProseMirror .resize-cursor { - cursor: col-resize; -} - -.tiptap-editor .ProseMirror pre { - padding: .75rem 1rem; - border-radius: .25rem; - font-size: .875rem; -} - -.tiptap-editor .ProseMirror code { - background-color: rgba(var(--gray-300), 1); - border-radius: 0.25rem; - padding-inline: 0.25rem; -} - -.tiptap-editor .ProseMirror pre.hljs code { - background-color: transparent; -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid, - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder { - display: grid; - gap: 1rem; - box-sizing: border-box; -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column, - .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column, - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column, - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column { - box-sizing: border-box; - border-style: dashed; - border-width: 1px; - border-color: rgba(var(--gray-400), 1); - padding: 0.5rem; - border-radius: 0.25rem; -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column > * + *, .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column > * + *, .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column > * + *, .tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column > * + * { - margin-block-start: 1rem; -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode, .tiptap-editor .ProseMirror .filament-tiptap-grid-builder.ProseMirror-selectednode { - border-radius: 0.25rem; - outline-offset: 2px; - outline: rgba(var(--gray-900), 1) dashed 2px; -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid[type^="asymetric"] { - grid-template-columns: 1fr; - grid-template-rows: auto; -} - -@media (max-width: 640px) { - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="sm"] { - grid-template-columns: 1fr !important; - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="sm"] .filament-tiptap-grid-builder__column { - grid-column: span 1 !important; - } -} - -@media (max-width: 768px) { - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="md"] { - grid-template-columns: 1fr !important; - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="md"] .filament-tiptap-grid-builder__column { - grid-column: span 1 !important; - } -} - -@media (max-width: 1024px) { - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="lg"] { - grid-template-columns: 1fr !important; - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at="lg"] .filament-tiptap-grid-builder__column { - grid-column: span 1 !important; - } -} - -@media (min-width: 768px) { - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-right-thirds"] { - grid-template-columns: 1fr 2fr - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-left-thirds"] { - grid-template-columns: 2fr 1fr - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-right-fourths"] { - grid-template-columns: 1fr 3fr - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="asymetric-left-fourths"] { - grid-template-columns: 3fr 1fr - } -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"] { - grid-template-columns: 1fr; - grid-template-rows: auto; -} - -@media (min-width: 768px) { - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="2"] { - grid-template-columns: repeat(2, 1fr) - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="3"] { - grid-template-columns: repeat(3, 1fr) - } - - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="4"] { - grid-template-columns: repeat(2, 1fr) - } -} - -@media (min-width: 1024px) { - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="4"] { - grid-template-columns: repeat(4, 1fr) - } -} - -@media (min-width: 768px) { - .tiptap-editor .ProseMirror .filament-tiptap-grid[type="responsive"][cols="5"] { - grid-template-columns: repeat(5, 1fr) - } -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="2"] { - grid-template-columns: repeat(2, 1fr); -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="3"] { - grid-template-columns: repeat(3, 1fr); -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="4"] { - grid-template-columns: repeat(4, 1fr); -} - -.tiptap-editor .ProseMirror .filament-tiptap-grid[type="fixed"][cols="5"] { - grid-template-columns: repeat(5, 1fr); -} - -.tiptap-editor .ProseMirror [data-youtube-video], - .tiptap-editor .ProseMirror [data-vimeo-video], - .tiptap-editor .ProseMirror [data-native-video] { - border: dashed 1px transparent; -} - -.tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode, .tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode, .tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode { - border-radius: 0.25rem; - outline-offset: 2px; - outline: rgba(var(--gray-900), 1) dashed 2px; -} - -.tiptap-editor .ProseMirror [data-youtube-video] iframe, - .tiptap-editor .ProseMirror [data-youtube-video] video, - .tiptap-editor .ProseMirror [data-vimeo-video] iframe, - .tiptap-editor .ProseMirror [data-vimeo-video] video, - .tiptap-editor .ProseMirror [data-native-video] iframe, - .tiptap-editor .ProseMirror [data-native-video] video { - pointer-events: none; -} - -.tiptap-editor .ProseMirror div[data-type="details"] { - box-sizing: border-box; - border-style: dashed; - border-width: 1px; - border-color: rgba(var(--gray-400), 1); - border-radius: 0.25rem; - position: relative; -} - -.tiptap-editor .ProseMirror div[data-type="details"] button { - position: absolute; - z-index: 1; - top: 0.125rem; - right: 0.25rem; - color: rgba(var(--gray-400), 1); -} - -.tiptap-editor .ProseMirror div[data-type="details"] summary { - padding: 0.375rem 0.5rem; - font-weight: 700; - border-bottom-style: solid; - border-bottom-width: 1px; - border-bottom-color: rgba(var(--gray-200), 1); -} - -.tiptap-editor .ProseMirror div[data-type="details"] summary::marker { - content: ""; - display: none; -} - -.tiptap-editor .ProseMirror div[data-type="details"] div[data-type="details-content"] { - padding: 0.5rem; - height: auto; -} - -.tiptap-editor .ProseMirror div[data-type="details"] div[data-type="details-content"] > * + * { - margin-block-start: 1rem; -} - -.dark .tiptap-editor .ProseMirror { - color: rgba(var(--gray-200), 1); -} - -.dark .tiptap-editor .ProseMirror blockquote { - border-left-color: rgba(var(--gray-500), 1); -} - -.dark .tiptap-editor .ProseMirror hr { - border-color: rgba(var(--gray-500), 1); -} - -.dark .tiptap-editor .ProseMirror a { - color: #60a5fa; -} - -.dark .tiptap-editor .ProseMirror a[id] { - color: rgba(var(--gray-200), 1); -} - -.dark .tiptap-editor .ProseMirror code { - background-color: rgba(var(--gray-800), 1); -} - -.dark .tiptap-editor .ProseMirror table td, - .dark .tiptap-editor .ProseMirror table th { - border-color: rgba(var(--gray-600), 1); -} - -.dark .tiptap-editor .ProseMirror table th { - background-color: rgba(var(--gray-800), 1); - color: rgba(var(--gray-100), 1); -} - -.dark .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column { - border-color: rgba(var(--gray-500), 1); -} - -.dark .tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode { - outline-color: rgba(var(--gray-400), 1); -} - -.dark .tiptap-editor .ProseMirror img.ProseMirror-selectednode { - outline-color: rgba(var(--gray-400), 1); -} - -.dark .tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode, .dark .tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode, .dark .tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode { - outline-color: rgba(var(--gray-400), 1); -} - -.dark .tiptap-editor .ProseMirror div[data-type="details"] { - box-sizing: border-box; - border-color: rgba(var(--gray-500), 1); - border-radius: 0.25rem; - position: relative; -} - -.dark .tiptap-editor .ProseMirror div[data-type="details"] summary { - border-bottom-color: rgba(var(--gray-500), 1); -} - -.dark .tiptap-editor .ProseMirror-focused .ProseMirror-gapcursor:after { - border-top: 1px solid white; -} - -.filament-tiptap-editor-source-modal textarea { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace monospace; -} - -.tiptap-editor p.is-editor-empty:first-child::before { - content: attr(data-placeholder); - float: left; - height: 0; - pointer-events: none; - --tw-text-opacity: 1; - color: rgba(var(--gray-400), var(--tw-text-opacity)); -} - -:is(.dark .tiptap-editor p.is-editor-empty:first-child)::before { - --tw-text-opacity: 1; - color: rgba(var(--gray-500), var(--tw-text-opacity)); -} - -.tippy-content-p-0 { - margin-left: -0.5rem; - margin-right: -0.5rem; - margin-top: -0.25rem; - margin-bottom: -0.25rem; -} - -span[data-type="mergeTag"] { - margin-left: 0.25rem; - margin-right: 0.25rem; - border-radius: 0.25rem; - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-100), var(--tw-bg-opacity)); - padding-left: 0.5rem; - padding-right: 0.5rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -:is(.dark span[data-type="mergeTag"]) { - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-800), var(--tw-bg-opacity)); -} +.tiptap-editor .ProseMirror .hljs{background:rgba(var(--gray-800),1);color:#d6deeb;padding:.5rem 1rem;border-radius:.5rem;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace,monospace}.tiptap-editor .ProseMirror .hljs-keyword{color:#c792ea}.tiptap-editor .ProseMirror .hljs-built_in{color:#addb67}.tiptap-editor .ProseMirror .hljs-type{color:#82aaff}.tiptap-editor .ProseMirror .hljs-literal{color:#ff5874}.tiptap-editor .ProseMirror .hljs-number{color:#f78c6c}.tiptap-editor .ProseMirror .hljs-regexp{color:#5ca7e4}.tiptap-editor .ProseMirror .hljs-string{color:#ecc48d}.tiptap-editor .ProseMirror .hljs-subst{color:#d3423e}.tiptap-editor .ProseMirror .hljs-symbol{color:#82aaff}.tiptap-editor .ProseMirror .hljs-class{color:#ffcb8b}.tiptap-editor .ProseMirror .hljs-function{color:#82aaff}.tiptap-editor .ProseMirror .hljs-title{color:#dcdcaa}.tiptap-editor .ProseMirror .hljs-params{color:#7fdbca}.tiptap-editor .ProseMirror .hljs-comment{color:#637777}.tiptap-editor .ProseMirror .hljs-doctag{color:#7fdbca}.tiptap-editor .ProseMirror .hljs-meta,.tiptap-editor .ProseMirror .hljs-meta .hljs-keyword{color:#82aaff}.tiptap-editor .ProseMirror .hljs-meta .hljs-string{color:#ecc48d}.tiptap-editor .ProseMirror .hljs-section{color:#82b1ff}.tiptap-editor .ProseMirror .hljs-attr,.tiptap-editor .ProseMirror .hljs-name,.tiptap-editor .ProseMirror .hljs-tag{color:#7fdbca}.tiptap-editor .ProseMirror .hljs-attribute{color:#80cbc4}.tiptap-editor .ProseMirror .hljs-variable{color:#addb67}.tiptap-editor .ProseMirror .hljs-bullet{color:#d9f5dd}.tiptap-editor .ProseMirror .hljs-code{color:#80cbc4}.tiptap-editor .ProseMirror .hljs-emphasis{color:#c792ea;font-style:italic}.tiptap-editor .ProseMirror .hljs-strong{color:#addb67;font-weight:700}.tiptap-editor .ProseMirror .hljs-formula{color:#c792ea}.tiptap-editor .ProseMirror .hljs-link{color:#ff869a}.tiptap-editor .ProseMirror .hljs-quote{color:#697098}.tiptap-editor .ProseMirror .hljs-selector-tag{color:#ff6363}.tiptap-editor .ProseMirror .hljs-selector-id{color:#fad430}.tiptap-editor .ProseMirror .hljs-selector-class{color:#addb67}.tiptap-editor .ProseMirror .hljs-selector-attr,.tiptap-editor .ProseMirror .hljs-selector-pseudo,.tiptap-editor .ProseMirror .hljs-template-tag{color:#c792ea}.tiptap-editor .ProseMirror .hljs-template-variable{color:#addb67}.tiptap-editor .ProseMirror .hljs-addition{color:#addb67;font-style:italic}.tiptap-editor .ProseMirror .hljs-deletion{color:#ef535090;font-style:italic}[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn,[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div,[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div .fi-fo-field-wrp{height:100%}[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div .fi-fo-field-wrp>div{height:100%;grid-template-rows:auto 1fr}[wire\:key*=filament_tiptap_source] .fi-fo-component-ctn>div .fi-fo-field-wrp>div textarea{height:100%!important}.tiptap-wrapper.tiptap-fullscreen{position:fixed;top:0;left:0;bottom:0;right:0;z-index:40;display:flex;flex-direction:column;height:100%}.tiptap-wrapper.tiptap-fullscreen .tiptap-toolbar{border-radius:0}.tiptap-wrapper.tiptap-fullscreen .tiptap-prosemirror-wrapper{max-height:100%;padding-block-end:3rem}.tiptap-editor .tiptap-content{display:flex;flex-direction:column}.tiptap-prosemirror-wrapper.prosemirror-w-sm{padding:0 max(1rem,calc(50% - 12rem))}.tiptap-prosemirror-wrapper.prosemirror-w-md{padding:0 max(1rem,calc(50% - 14rem))}.tiptap-prosemirror-wrapper.prosemirror-w-lg{padding:0 max(1rem,calc(50% - 16rem))}.tiptap-prosemirror-wrapper.prosemirror-w-xl{padding:0 max(1rem,calc(50% - 18rem))}.tiptap-prosemirror-wrapper.prosemirror-w-2xl{padding:0 max(1rem,calc(50% - 21rem))}.tiptap-prosemirror-wrapper.prosemirror-w-3xl{padding:0 max(1rem,calc(50% - 24rem))}.tiptap-prosemirror-wrapper.prosemirror-w-4xl{padding:0 max(1rem,calc(50% - 28rem))}.tiptap-prosemirror-wrapper.prosemirror-w-5xl{padding:0 max(1rem,calc(50% - 32rem))}.tiptap-prosemirror-wrapper.prosemirror-w-6xl{padding:0 max(1rem,calc(50% - 36rem))}.tiptap-prosemirror-wrapper.prosemirror-w-7xl{padding:0 max(1rem,calc(50% - 40rem))}.tiptap-prosemirror-wrapper.prosemirror-w-none{padding:0 1rem}.tiptap-editor .ProseMirror{border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;flex:1 1 0;padding-block:1rem;margin-inline:auto;position:relative;width:100%;color:#000}.tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode{outline-style:dashed;outline-width:2px;outline-offset:2px;outline-color:rgba(var(--gray-700),1)}.tiptap-editor .ProseMirror.ProseMirror-focused .ProseMirror-selectednode:is(.dark *){outline-color:rgba(var(--gray-300),1)}.tiptap-editor .ProseMirror .tiptap-block-wrapper{overflow:hidden;border-radius:.375rem;--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity))}.tiptap-editor .ProseMirror .tiptap-block-wrapper:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading{display:flex;align-items:center;justify-content:space-between;--tw-bg-opacity:1;background-color:rgba(var(--gray-200),var(--tw-bg-opacity));padding:.25rem .75rem;line-height:1;--tw-text-opacity:1;color:rgba(var(--gray-900),var(--tw-text-opacity))}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-950),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-heading .tiptap-block-title{font-size:.875rem;line-height:1.25rem;font-weight:700;text-transform:uppercase;opacity:.8}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions{display:flex;align-items:center;gap:.5rem}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button{opacity:.75}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:focus,.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .tiptap-block-actions button:hover{--tw-text-opacity:1;color:rgba(var(--primary-500),var(--tw-text-opacity));opacity:1}.tiptap-editor .ProseMirror .tiptap-block-wrapper .tiptap-block .preview{padding:1rem}.tiptap-editor .ProseMirror .filament-tiptap-hurdle{width:100%;max-width:100vw;padding-block:1rem;background-color:rgba(var(--gray-800),1);position:relative}.tiptap-editor .ProseMirror .filament-tiptap-hurdle:after,.tiptap-editor .ProseMirror .filament-tiptap-hurdle:before{content:"";position:absolute;display:block;width:100%;top:0;bottom:0;background-color:inherit}.tiptap-editor .ProseMirror .filament-tiptap-hurdle:before{left:-100%}.tiptap-editor .ProseMirror .filament-tiptap-hurdle:after{right:-100%}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=gray_light]{color:rgba(var(--gray-900),1);background-color:rgba(var(--gray-300),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=gray]{color:#fff;background-color:rgba(var(--gray-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=gray_dark]{color:#fff;background-color:rgba(var(--gray-800),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=primary]{color:rgba(var(--gray-900),1);background-color:rgba(var(--primary-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=secondary]{color:rgba(var(--gray-900),1);background-color:rgba(var(--warning-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=tertiary]{color:#fff;background-color:rgba(var(--success-500),1)}.tiptap-editor .ProseMirror .filament-tiptap-hurdle[data-color=accent]{color:#fff;background-color:rgba(var(--danger-500),1)}.tiptap-editor .ProseMirror.ProseMirror-focused{outline:none}.tiptap-editor .ProseMirror>*+*{margin-block-start:1rem}.tiptap-editor .ProseMirror>*+h1,.tiptap-editor .ProseMirror>*+h2,.tiptap-editor .ProseMirror>*+h3,.tiptap-editor .ProseMirror>*+h4,.tiptap-editor .ProseMirror>*+h5,.tiptap-editor .ProseMirror>*+h6{margin-block-start:2rem}.tiptap-editor .ProseMirror img{display:inline-block}.tiptap-editor .ProseMirror h1,.tiptap-editor .ProseMirror h2,.tiptap-editor .ProseMirror h3,.tiptap-editor .ProseMirror h4,.tiptap-editor .ProseMirror h5,.tiptap-editor .ProseMirror h6{font-weight:700}.tiptap-editor .ProseMirror h1{font-size:1.75rem;line-height:1.1}.tiptap-editor .ProseMirror h2{font-size:1.5rem;line-height:1.1}.tiptap-editor .ProseMirror h3{font-size:1.25rem;line-height:1.25}.tiptap-editor .ProseMirror h4{font-size:1.125rem}.tiptap-editor .ProseMirror .lead{font-size:1.375rem;line-height:1.3}.tiptap-editor .ProseMirror small{font-size:.75rem}.tiptap-editor .ProseMirror ol>:not([hidden])~:not([hidden]),.tiptap-editor .ProseMirror ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.tiptap-editor .ProseMirror ol,.tiptap-editor .ProseMirror ul{padding-inline-start:1rem;margin-inline-start:1rem}.tiptap-editor .ProseMirror ul{list-style:disc}.tiptap-editor .ProseMirror ol{list-style:decimal}.tiptap-editor .ProseMirror ul.checked-list{list-style-type:none;margin-inline-start:0}.tiptap-editor .ProseMirror ul.checked-list li{display:flex;align-items:baseline;gap:.375em}.tiptap-editor .ProseMirror ul.checked-list li:before{content:"✓";width:1.25rem;height:1.25rem;flex-shrink:0}.tiptap-editor .ProseMirror blockquote{border-left:.25rem solid rgba(var(--gray-400),1);padding-inline-start:.5rem;margin-inline-start:1rem;font-size:1.25rem}.tiptap-editor .ProseMirror hr{border-color:rgba(var(--gray-400),1)}.tiptap-editor .ProseMirror a{color:#2563eb;text-decoration:underline}.tiptap-editor .ProseMirror a[id]{color:#000;text-decoration:none}.tiptap-editor .ProseMirror a[id]:before{content:"# ";color:rgba(var(--gray-500),1);opacity:1}.tiptap-editor .ProseMirror a[data-as-button=true]{background-color:rgba(var(--gray-900),1);color:#fff!important;text-decoration:none;display:inline-block;border-radius:.375rem;padding:.5rem 1.25rem}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=primary]{background-color:rgba(var(--primary-600),1)}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=secondary]{background-color:rgba(var(--warning-600),1)}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=tertiary]{background-color:rgba(var(--success-600),1)}.tiptap-editor .ProseMirror a[data-as-button=true][data-as-button-theme=accent]{background-color:rgba(var(--danger-600),1)}.tiptap-editor .ProseMirror sup{font-size:65%}.tiptap-editor .ProseMirror img{border:2px dashed #0000}.tiptap-editor .ProseMirror img.ProseMirror-selectednode{border-radius:.25rem;outline-offset:2px;outline:rgba(var(--gray-900),1) dashed 2px}.tiptap-editor .ProseMirror table{border-collapse:collapse;margin:0;overflow:hidden;table-layout:fixed;width:100%;position:relative}.tiptap-editor .ProseMirror table td,.tiptap-editor .ProseMirror table th{border:1px solid rgba(var(--gray-400),1);min-width:1em;padding:3px 5px;vertical-align:top;background-clip:padding-box}.tiptap-editor .ProseMirror table td>*,.tiptap-editor .ProseMirror table th>*{margin-bottom:0}.tiptap-editor .ProseMirror table th{background-color:rgba(var(--gray-200),1);color:rgba(var(--gray-700),1);font-weight:700;text-align:left}.tiptap-editor .ProseMirror table .selectedCell{position:relative}.tiptap-editor .ProseMirror table .selectedCell:after{background:#c8c8ff66;content:"";left:0;right:0;top:0;bottom:0;pointer-events:none;position:absolute;z-index:2}.tiptap-editor .ProseMirror table .column-resize-handle{background-color:#adf;bottom:-2px;position:absolute;right:-2px;pointer-events:none;top:0;width:4px}.tiptap-editor .ProseMirror table p{margin:0}.tiptap-editor .ProseMirror .tableWrapper{padding:1rem 0;overflow-x:auto}.tiptap-editor .ProseMirror .resize-cursor{cursor:col-resize}.tiptap-editor .ProseMirror pre{padding:.75rem 1rem;border-radius:.25rem;font-size:.875rem}.tiptap-editor .ProseMirror code{background-color:rgba(var(--gray-300),1);border-radius:.25rem;padding-inline:.25rem}.tiptap-editor .ProseMirror pre.hljs code{background-color:initial}.tiptap-editor .ProseMirror .filament-tiptap-grid,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder{display:grid;gap:1rem;box-sizing:border-box}.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column,.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column{box-sizing:border-box;border-style:dashed;border-width:1px;border-color:rgba(var(--gray-400),1);padding:.5rem;border-radius:.25rem}.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid-builder__column>*+*,.tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column>*+*,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid-builder__column>*+*,.tiptap-editor .ProseMirror .filament-tiptap-grid-builder .filament-tiptap-grid__column>*+*{margin-block-start:1rem}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder.ProseMirror-selectednode,.tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode{border-radius:.25rem;outline-offset:2px;outline:rgba(var(--gray-900),1) dashed 2px}.tiptap-editor .ProseMirror .filament-tiptap-grid[type^=asymetric]{grid-template-columns:1fr;grid-template-rows:auto}@media (max-width:640px){.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=sm]{grid-template-columns:1fr!important}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=sm] .filament-tiptap-grid-builder__column{grid-column:span 1!important}}@media (max-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=md]{grid-template-columns:1fr!important}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=md] .filament-tiptap-grid-builder__column{grid-column:span 1!important}}@media (max-width:1024px){.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=lg]{grid-template-columns:1fr!important}.tiptap-editor .ProseMirror .filament-tiptap-grid-builder[data-stack-at=lg] .filament-tiptap-grid-builder__column{grid-column:span 1!important}}@media (min-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-right-thirds]{grid-template-columns:1fr 2fr}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-left-thirds]{grid-template-columns:2fr 1fr}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-right-fourths]{grid-template-columns:1fr 3fr}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=asymetric-left-fourths]{grid-template-columns:3fr 1fr}}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive]{grid-template-columns:1fr;grid-template-rows:auto}@media (min-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="2"]{grid-template-columns:repeat(2,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="3"]{grid-template-columns:repeat(3,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="4"]{grid-template-columns:repeat(2,1fr)}}@media (min-width:1024px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="4"]{grid-template-columns:repeat(4,1fr)}}@media (min-width:768px){.tiptap-editor .ProseMirror .filament-tiptap-grid[type=responsive][cols="5"]{grid-template-columns:repeat(5,1fr)}}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="2"]{grid-template-columns:repeat(2,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="3"]{grid-template-columns:repeat(3,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="4"]{grid-template-columns:repeat(4,1fr)}.tiptap-editor .ProseMirror .filament-tiptap-grid[type=fixed][cols="5"]{grid-template-columns:repeat(5,1fr)}.tiptap-editor .ProseMirror [data-native-video],.tiptap-editor .ProseMirror [data-vimeo-video],.tiptap-editor .ProseMirror [data-youtube-video]{border:1px dashed #0000}.tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode,.tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode,.tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode{border-radius:.25rem;outline-offset:2px;outline:rgba(var(--gray-900),1) dashed 2px}.tiptap-editor .ProseMirror [data-native-video] iframe,.tiptap-editor .ProseMirror [data-native-video] video,.tiptap-editor .ProseMirror [data-vimeo-video] iframe,.tiptap-editor .ProseMirror [data-vimeo-video] video,.tiptap-editor .ProseMirror [data-youtube-video] iframe,.tiptap-editor .ProseMirror [data-youtube-video] video{pointer-events:none}.tiptap-editor .ProseMirror div[data-type=details]{box-sizing:border-box;border-style:dashed;border-width:1px;border-color:rgba(var(--gray-400),1);border-radius:.25rem;position:relative}.tiptap-editor .ProseMirror div[data-type=details] button{position:absolute;z-index:1;top:.125rem;right:.25rem;color:rgba(var(--gray-400),1)}.tiptap-editor .ProseMirror div[data-type=details] summary{padding:.375rem .5rem;font-weight:700;border-bottom:1px solid rgba(var(--gray-200),1)}.tiptap-editor .ProseMirror div[data-type=details] summary::marker{content:"";display:none}.tiptap-editor .ProseMirror div[data-type=details] div[data-type=details-content]{padding:.5rem;height:auto}.tiptap-editor .ProseMirror div[data-type=details] div[data-type=details-content]>*+*{margin-block-start:1rem}.dark .tiptap-editor .ProseMirror{color:rgba(var(--gray-200),1)}.dark .tiptap-editor .ProseMirror blockquote{border-left-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror hr{border-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror a{color:#60a5fa}.dark .tiptap-editor .ProseMirror a[id]{color:rgba(var(--gray-200),1)}.dark .tiptap-editor .ProseMirror code{background-color:rgba(var(--gray-800),1)}.dark .tiptap-editor .ProseMirror table td,.dark .tiptap-editor .ProseMirror table th{border-color:rgba(var(--gray-600),1)}.dark .tiptap-editor .ProseMirror table th{background-color:rgba(var(--gray-800),1);color:rgba(var(--gray-100),1)}.dark .tiptap-editor .ProseMirror .filament-tiptap-grid .filament-tiptap-grid__column{border-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror .filament-tiptap-grid.ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror [data-native-video].ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror [data-vimeo-video].ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror [data-youtube-video].ProseMirror-selectednode,.dark .tiptap-editor .ProseMirror img.ProseMirror-selectednode{outline-color:rgba(var(--gray-400),1)}.dark .tiptap-editor .ProseMirror div[data-type=details]{box-sizing:border-box;border-color:rgba(var(--gray-500),1);border-radius:.25rem;position:relative}.dark .tiptap-editor .ProseMirror div[data-type=details] summary{border-bottom-color:rgba(var(--gray-500),1)}.dark .tiptap-editor .ProseMirror-focused .ProseMirror-gapcursor:after{border-top:1px solid #fff}.filament-tiptap-editor-source-modal textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace monospace}.tiptap-editor p.is-editor-empty:first-child:before{content:attr(data-placeholder);float:left;height:0;pointer-events:none;--tw-text-opacity:1;color:rgba(var(--gray-400),var(--tw-text-opacity))}.tiptap-editor p.is-editor-empty:first-child:is(.dark *):before{--tw-text-opacity:1;color:rgba(var(--gray-500),var(--tw-text-opacity))}.tippy-content-p-0{margin:-.25rem -.5rem}span[data-type=mergeTag]{margin-left:.25rem;margin-right:.25rem;border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--gray-100),var(--tw-bg-opacity));padding:.25rem .5rem}span[data-type=mergeTag]:is(.dark *){--tw-bg-opacity:1;background-color:rgba(var(--gray-800),var(--tw-bg-opacity))} \ No newline at end of file diff --git a/resources/dist/filament-tiptap-editor.js b/resources/dist/filament-tiptap-editor.js index 3c27913..5d5c686 100644 --- a/resources/dist/filament-tiptap-editor.js +++ b/resources/dist/filament-tiptap-editor.js @@ -1,34962 +1,128 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __copyProps = (to, from2, except, desc) => { - if (from2 && typeof from2 === "object" || typeof from2 === "function") { - for (let key of __getOwnPropNames(from2)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __publicField = (obj, key, value) => { - __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - return value; -}; - -// node_modules/lowlight/node_modules/highlight.js/lib/core.js -var require_core = __commonJS({ - "node_modules/lowlight/node_modules/highlight.js/lib/core.js"(exports, module) { - function deepFreeze2(obj) { - if (obj instanceof Map) { - obj.clear = obj.delete = obj.set = function() { - throw new Error("map is read-only"); - }; - } else if (obj instanceof Set) { - obj.add = obj.clear = obj.delete = function() { - throw new Error("set is read-only"); - }; - } - Object.freeze(obj); - Object.getOwnPropertyNames(obj).forEach((name) => { - const prop = obj[name]; - const type = typeof prop; - if ((type === "object" || type === "function") && !Object.isFrozen(prop)) { - deepFreeze2(prop); - } - }); - return obj; - } - var Response2 = class { - /** - * @param {CompiledMode} mode - */ - constructor(mode) { - if (mode.data === void 0) - mode.data = {}; - this.data = mode.data; - this.isMatchIgnored = false; - } - ignoreMatch() { - this.isMatchIgnored = true; - } - }; - function escapeHTML2(value) { - return value.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); - } - function inherit$12(original, ...objects) { - const result = /* @__PURE__ */ Object.create(null); - for (const key in original) { - result[key] = original[key]; - } - objects.forEach(function(obj) { - for (const key in obj) { - result[key] = obj[key]; - } - }); - return ( - /** @type {T} */ - result - ); - } - var SPAN_CLOSE2 = "
"; - var emitsWrappingTags2 = (node) => { - return !!node.scope; - }; - var scopeToCSSClass2 = (name, { prefix }) => { - if (name.startsWith("language:")) { - return name.replace("language:", "language-"); - } - if (name.includes(".")) { - const pieces = name.split("."); - return [ - `${prefix}${pieces.shift()}`, - ...pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`) - ].join(" "); - } - return `${prefix}${name}`; - }; - var HTMLRenderer2 = class { - /** - * Creates a new HTMLRenderer - * - * @param {Tree} parseTree - the parse tree (must support `walk` API) - * @param {{classPrefix: string}} options - */ - constructor(parseTree, options) { - this.buffer = ""; - this.classPrefix = options.classPrefix; - parseTree.walk(this); - } - /** - * Adds texts to the output stream - * - * @param {string} text */ - addText(text) { - this.buffer += escapeHTML2(text); - } - /** - * Adds a node open to the output stream (if needed) - * - * @param {Node} node */ - openNode(node) { - if (!emitsWrappingTags2(node)) - return; - const className = scopeToCSSClass2( - node.scope, - { prefix: this.classPrefix } - ); - this.span(className); - } - /** - * Adds a node close to the output stream (if needed) - * - * @param {Node} node */ - closeNode(node) { - if (!emitsWrappingTags2(node)) - return; - this.buffer += SPAN_CLOSE2; - } - /** - * returns the accumulated buffer - */ - value() { - return this.buffer; - } - // helpers - /** - * Builds a span element - * - * @param {string} className */ - span(className) { - this.buffer += ``; - } - }; - var newNode2 = (opts = {}) => { - const result = { children: [] }; - Object.assign(result, opts); - return result; - }; - var TokenTree2 = class _TokenTree { - constructor() { - this.rootNode = newNode2(); - this.stack = [this.rootNode]; - } - get top() { - return this.stack[this.stack.length - 1]; - } - get root() { - return this.rootNode; - } - /** @param {Node} node */ - add(node) { - this.top.children.push(node); - } - /** @param {string} scope */ - openNode(scope) { - const node = newNode2({ scope }); - this.add(node); - this.stack.push(node); - } - closeNode() { - if (this.stack.length > 1) { - return this.stack.pop(); - } - return void 0; - } - closeAllNodes() { - while (this.closeNode()) - ; - } - toJSON() { - return JSON.stringify(this.rootNode, null, 4); - } - /** - * @typedef { import("./html_renderer").Renderer } Renderer - * @param {Renderer} builder - */ - walk(builder) { - return this.constructor._walk(builder, this.rootNode); - } - /** - * @param {Renderer} builder - * @param {Node} node - */ - static _walk(builder, node) { - if (typeof node === "string") { - builder.addText(node); - } else if (node.children) { - builder.openNode(node); - node.children.forEach((child) => this._walk(builder, child)); - builder.closeNode(node); - } - return builder; - } - /** - * @param {Node} node - */ - static _collapse(node) { - if (typeof node === "string") - return; - if (!node.children) - return; - if (node.children.every((el) => typeof el === "string")) { - node.children = [node.children.join("")]; - } else { - node.children.forEach((child) => { - _TokenTree._collapse(child); - }); - } - } - }; - var TokenTreeEmitter2 = class extends TokenTree2 { - /** - * @param {*} options - */ - constructor(options) { - super(); - this.options = options; - } - /** - * @param {string} text - */ - addText(text) { - if (text === "") { - return; - } - this.add(text); - } - /** @param {string} scope */ - startScope(scope) { - this.openNode(scope); - } - endScope() { - this.closeNode(); - } - /** - * @param {Emitter & {root: DataNode}} emitter - * @param {string} name - */ - __addSublanguage(emitter, name) { - const node = emitter.root; - if (name) - node.scope = `language:${name}`; - this.add(node); - } - toHTML() { - const renderer = new HTMLRenderer2(this, this.options); - return renderer.value(); - } - finalize() { - this.closeAllNodes(); - return true; - } - }; - function source3(re) { - if (!re) - return null; - if (typeof re === "string") - return re; - return re.source; - } - function lookahead3(re) { - return concat3("(?=", re, ")"); - } - function anyNumberOfTimes2(re) { - return concat3("(?:", re, ")*"); - } - function optional2(re) { - return concat3("(?:", re, ")?"); - } - function concat3(...args) { - const joined = args.map((x) => source3(x)).join(""); - return joined; - } - function stripOptionsFromArgs3(args) { - const opts = args[args.length - 1]; - if (typeof opts === "object" && opts.constructor === Object) { - args.splice(args.length - 1, 1); - return opts; - } else { - return {}; - } - } - function either3(...args) { - const opts = stripOptionsFromArgs3(args); - const joined = "(" + (opts.capture ? "" : "?:") + args.map((x) => source3(x)).join("|") + ")"; - return joined; - } - function countMatchGroups2(re) { - return new RegExp(re.toString() + "|").exec("").length - 1; - } - function startsWith2(re, lexeme) { - const match = re && re.exec(lexeme); - return match && match.index === 0; - } - var BACKREF_RE2 = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; - function _rewriteBackreferences2(regexps, { joinWith }) { - let numCaptures = 0; - return regexps.map((regex) => { - numCaptures += 1; - const offset2 = numCaptures; - let re = source3(regex); - let out = ""; - while (re.length > 0) { - const match = BACKREF_RE2.exec(re); - if (!match) { - out += re; - break; - } - out += re.substring(0, match.index); - re = re.substring(match.index + match[0].length); - if (match[0][0] === "\\" && match[1]) { - out += "\\" + String(Number(match[1]) + offset2); - } else { - out += match[0]; - if (match[0] === "(") { - numCaptures++; - } - } - } - return out; - }).map((re) => `(${re})`).join(joinWith); - } - var MATCH_NOTHING_RE2 = /\b\B/; - var IDENT_RE4 = "[a-zA-Z]\\w*"; - var UNDERSCORE_IDENT_RE2 = "[a-zA-Z_]\\w*"; - var NUMBER_RE2 = "\\b\\d+(\\.\\d+)?"; - var C_NUMBER_RE2 = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)"; - var BINARY_NUMBER_RE2 = "\\b(0b[01]+)"; - var RE_STARTERS_RE2 = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~"; - var SHEBANG2 = (opts = {}) => { - const beginShebang = /^#![ ]*\//; - if (opts.binary) { - opts.begin = concat3( - beginShebang, - /.*\b/, - opts.binary, - /\b.*/ - ); - } - return inherit$12({ - scope: "meta", - begin: beginShebang, - end: /$/, - relevance: 0, - /** @type {ModeCallback} */ - "on:begin": (m, resp) => { - if (m.index !== 0) - resp.ignoreMatch(); - } - }, opts); - }; - var BACKSLASH_ESCAPE2 = { - begin: "\\\\[\\s\\S]", - relevance: 0 - }; - var APOS_STRING_MODE2 = { - scope: "string", - begin: "'", - end: "'", - illegal: "\\n", - contains: [BACKSLASH_ESCAPE2] - }; - var QUOTE_STRING_MODE2 = { - scope: "string", - begin: '"', - end: '"', - illegal: "\\n", - contains: [BACKSLASH_ESCAPE2] - }; - var PHRASAL_WORDS_MODE2 = { - begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ - }; - var COMMENT2 = function(begin, end2, modeOptions = {}) { - const mode = inherit$12( - { - scope: "comment", - begin, - end: end2, - contains: [] - }, - modeOptions - ); - mode.contains.push({ - scope: "doctag", - // hack to avoid the space from being included. the space is necessary to - // match here to prevent the plain text rule below from gobbling up doctags - begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", - end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, - excludeBegin: true, - relevance: 0 - }); - const ENGLISH_WORD = either3( - // list of common 1 and 2 letter words in English - "I", - "a", - "is", - "so", - "us", - "to", - "at", - "if", - "in", - "it", - "on", - // note: this is not an exhaustive list of contractions, just popular ones - /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, - // contractions - can't we'd they're let's, etc - /[A-Za-z]+[-][a-z]+/, - // `no-way`, etc. - /[A-Za-z][a-z]{2,}/ - // allow capitalized words at beginning of sentences - ); - mode.contains.push( - { - // TODO: how to include ", (, ) without breaking grammars that use these for - // comment delimiters? - // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ - // --- - // this tries to find sequences of 3 english words in a row (without any - // "programming" type syntax) this gives us a strong signal that we've - // TRULY found a comment - vs perhaps scanning with the wrong language. - // It's possible to find something that LOOKS like the start of the - // comment - but then if there is no readable text - good chance it is a - // false match and not a comment. - // - // for a visual example please see: - // https://github.com/highlightjs/highlight.js/issues/2827 - begin: concat3( - /[ ]+/, - // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ - "(", - ENGLISH_WORD, - /[.]?[:]?([.][ ]|[ ])/, - "){3}" - ) - // look for 3 words in a row - } - ); - return mode; - }; - var C_LINE_COMMENT_MODE2 = COMMENT2("//", "$"); - var C_BLOCK_COMMENT_MODE2 = COMMENT2("/\\*", "\\*/"); - var HASH_COMMENT_MODE2 = COMMENT2("#", "$"); - var NUMBER_MODE2 = { - scope: "number", - begin: NUMBER_RE2, - relevance: 0 - }; - var C_NUMBER_MODE2 = { - scope: "number", - begin: C_NUMBER_RE2, - relevance: 0 - }; - var BINARY_NUMBER_MODE2 = { - scope: "number", - begin: BINARY_NUMBER_RE2, - relevance: 0 - }; - var REGEXP_MODE2 = { - // this outer rule makes sure we actually have a WHOLE regex and not simply - // an expression such as: - // - // 3 / something - // - // (which will then blow up when regex's `illegal` sees the newline) - begin: /(?=\/[^/\n]*\/)/, - contains: [{ - scope: "regexp", - begin: /\//, - end: /\/[gimuy]*/, - illegal: /\n/, - contains: [ - BACKSLASH_ESCAPE2, - { - begin: /\[/, - end: /\]/, - relevance: 0, - contains: [BACKSLASH_ESCAPE2] - } - ] - }] - }; - var TITLE_MODE2 = { - scope: "title", - begin: IDENT_RE4, - relevance: 0 - }; - var UNDERSCORE_TITLE_MODE2 = { - scope: "title", - begin: UNDERSCORE_IDENT_RE2, - relevance: 0 - }; - var METHOD_GUARD2 = { - // excludes method names from keyword processing - begin: "\\.\\s*" + UNDERSCORE_IDENT_RE2, - relevance: 0 - }; - var END_SAME_AS_BEGIN2 = function(mode) { - return Object.assign( - mode, - { - /** @type {ModeCallback} */ - "on:begin": (m, resp) => { - resp.data._beginMatch = m[1]; - }, - /** @type {ModeCallback} */ - "on:end": (m, resp) => { - if (resp.data._beginMatch !== m[1]) - resp.ignoreMatch(); - } - } - ); - }; - var MODES5 = /* @__PURE__ */ Object.freeze({ - __proto__: null, - MATCH_NOTHING_RE: MATCH_NOTHING_RE2, - IDENT_RE: IDENT_RE4, - UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE2, - NUMBER_RE: NUMBER_RE2, - C_NUMBER_RE: C_NUMBER_RE2, - BINARY_NUMBER_RE: BINARY_NUMBER_RE2, - RE_STARTERS_RE: RE_STARTERS_RE2, - SHEBANG: SHEBANG2, - BACKSLASH_ESCAPE: BACKSLASH_ESCAPE2, - APOS_STRING_MODE: APOS_STRING_MODE2, - QUOTE_STRING_MODE: QUOTE_STRING_MODE2, - PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE2, - COMMENT: COMMENT2, - C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE2, - C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE2, - HASH_COMMENT_MODE: HASH_COMMENT_MODE2, - NUMBER_MODE: NUMBER_MODE2, - C_NUMBER_MODE: C_NUMBER_MODE2, - BINARY_NUMBER_MODE: BINARY_NUMBER_MODE2, - REGEXP_MODE: REGEXP_MODE2, - TITLE_MODE: TITLE_MODE2, - UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE2, - METHOD_GUARD: METHOD_GUARD2, - END_SAME_AS_BEGIN: END_SAME_AS_BEGIN2 - }); - function skipIfHasPrecedingDot2(match, response) { - const before = match.input[match.index - 1]; - if (before === ".") { - response.ignoreMatch(); - } - } - function scopeClassName2(mode, _parent) { - if (mode.className !== void 0) { - mode.scope = mode.className; - delete mode.className; - } - } - function beginKeywords2(mode, parent) { - if (!parent) - return; - if (!mode.beginKeywords) - return; - mode.begin = "\\b(" + mode.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)"; - mode.__beforeBegin = skipIfHasPrecedingDot2; - mode.keywords = mode.keywords || mode.beginKeywords; - delete mode.beginKeywords; - if (mode.relevance === void 0) - mode.relevance = 0; - } - function compileIllegal2(mode, _parent) { - if (!Array.isArray(mode.illegal)) - return; - mode.illegal = either3(...mode.illegal); - } - function compileMatch2(mode, _parent) { - if (!mode.match) - return; - if (mode.begin || mode.end) - throw new Error("begin & end are not supported with match"); - mode.begin = mode.match; - delete mode.match; - } - function compileRelevance2(mode, _parent) { - if (mode.relevance === void 0) - mode.relevance = 1; - } - var beforeMatchExt2 = (mode, parent) => { - if (!mode.beforeMatch) - return; - if (mode.starts) - throw new Error("beforeMatch cannot be used with starts"); - const originalMode = Object.assign({}, mode); - Object.keys(mode).forEach((key) => { - delete mode[key]; - }); - mode.keywords = originalMode.keywords; - mode.begin = concat3(originalMode.beforeMatch, lookahead3(originalMode.begin)); - mode.starts = { - relevance: 0, - contains: [ - Object.assign(originalMode, { endsParent: true }) - ] - }; - mode.relevance = 0; - delete originalMode.beforeMatch; - }; - var COMMON_KEYWORDS2 = [ - "of", - "and", - "for", - "in", - "not", - "or", - "if", - "then", - "parent", - // common variable name - "list", - // common variable name - "value" - // common variable name - ]; - var DEFAULT_KEYWORD_SCOPE2 = "keyword"; - function compileKeywords2(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE2) { - const compiledKeywords = /* @__PURE__ */ Object.create(null); - if (typeof rawKeywords === "string") { - compileList(scopeName, rawKeywords.split(" ")); - } else if (Array.isArray(rawKeywords)) { - compileList(scopeName, rawKeywords); - } else { - Object.keys(rawKeywords).forEach(function(scopeName2) { - Object.assign( - compiledKeywords, - compileKeywords2(rawKeywords[scopeName2], caseInsensitive, scopeName2) - ); - }); - } - return compiledKeywords; - function compileList(scopeName2, keywordList) { - if (caseInsensitive) { - keywordList = keywordList.map((x) => x.toLowerCase()); - } - keywordList.forEach(function(keyword) { - const pair = keyword.split("|"); - compiledKeywords[pair[0]] = [scopeName2, scoreForKeyword2(pair[0], pair[1])]; - }); - } - } - function scoreForKeyword2(keyword, providedScore) { - if (providedScore) { - return Number(providedScore); - } - return commonKeyword2(keyword) ? 0 : 1; - } - function commonKeyword2(keyword) { - return COMMON_KEYWORDS2.includes(keyword.toLowerCase()); - } - var seenDeprecations2 = {}; - var error2 = (message) => { - console.error(message); - }; - var warn3 = (message, ...args) => { - console.log(`WARN: ${message}`, ...args); - }; - var deprecated2 = (version3, message) => { - if (seenDeprecations2[`${version3}/${message}`]) - return; - console.log(`Deprecated as of ${version3}. ${message}`); - seenDeprecations2[`${version3}/${message}`] = true; - }; - var MultiClassError2 = new Error(); - function remapScopeNames2(mode, regexes, { key }) { - let offset2 = 0; - const scopeNames = mode[key]; - const emit = {}; - const positions = {}; - for (let i = 1; i <= regexes.length; i++) { - positions[i + offset2] = scopeNames[i]; - emit[i + offset2] = true; - offset2 += countMatchGroups2(regexes[i - 1]); - } - mode[key] = positions; - mode[key]._emit = emit; - mode[key]._multi = true; - } - function beginMultiClass2(mode) { - if (!Array.isArray(mode.begin)) - return; - if (mode.skip || mode.excludeBegin || mode.returnBegin) { - error2("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); - throw MultiClassError2; - } - if (typeof mode.beginScope !== "object" || mode.beginScope === null) { - error2("beginScope must be object"); - throw MultiClassError2; - } - remapScopeNames2(mode, mode.begin, { key: "beginScope" }); - mode.begin = _rewriteBackreferences2(mode.begin, { joinWith: "" }); - } - function endMultiClass2(mode) { - if (!Array.isArray(mode.end)) - return; - if (mode.skip || mode.excludeEnd || mode.returnEnd) { - error2("skip, excludeEnd, returnEnd not compatible with endScope: {}"); - throw MultiClassError2; - } - if (typeof mode.endScope !== "object" || mode.endScope === null) { - error2("endScope must be object"); - throw MultiClassError2; - } - remapScopeNames2(mode, mode.end, { key: "endScope" }); - mode.end = _rewriteBackreferences2(mode.end, { joinWith: "" }); - } - function scopeSugar2(mode) { - if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { - mode.beginScope = mode.scope; - delete mode.scope; - } - } - function MultiClass2(mode) { - scopeSugar2(mode); - if (typeof mode.beginScope === "string") { - mode.beginScope = { _wrap: mode.beginScope }; - } - if (typeof mode.endScope === "string") { - mode.endScope = { _wrap: mode.endScope }; - } - beginMultiClass2(mode); - endMultiClass2(mode); - } - function compileLanguage2(language) { - function langRe(value, global2) { - return new RegExp( - source3(value), - "m" + (language.case_insensitive ? "i" : "") + (language.unicodeRegex ? "u" : "") + (global2 ? "g" : "") - ); - } - class MultiRegex { - constructor() { - this.matchIndexes = {}; - this.regexes = []; - this.matchAt = 1; - this.position = 0; - } - // @ts-ignore - addRule(re, opts) { - opts.position = this.position++; - this.matchIndexes[this.matchAt] = opts; - this.regexes.push([opts, re]); - this.matchAt += countMatchGroups2(re) + 1; - } - compile() { - if (this.regexes.length === 0) { - this.exec = () => null; - } - const terminators = this.regexes.map((el) => el[1]); - this.matcherRe = langRe(_rewriteBackreferences2(terminators, { joinWith: "|" }), true); - this.lastIndex = 0; - } - /** @param {string} s */ - exec(s) { - this.matcherRe.lastIndex = this.lastIndex; - const match = this.matcherRe.exec(s); - if (!match) { - return null; - } - const i = match.findIndex((el, i2) => i2 > 0 && el !== void 0); - const matchData = this.matchIndexes[i]; - match.splice(0, i); - return Object.assign(match, matchData); - } - } - class ResumableMultiRegex { - constructor() { - this.rules = []; - this.multiRegexes = []; - this.count = 0; - this.lastIndex = 0; - this.regexIndex = 0; - } - // @ts-ignore - getMatcher(index) { - if (this.multiRegexes[index]) - return this.multiRegexes[index]; - const matcher = new MultiRegex(); - this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); - matcher.compile(); - this.multiRegexes[index] = matcher; - return matcher; - } - resumingScanAtSamePosition() { - return this.regexIndex !== 0; - } - considerAll() { - this.regexIndex = 0; - } - // @ts-ignore - addRule(re, opts) { - this.rules.push([re, opts]); - if (opts.type === "begin") - this.count++; - } - /** @param {string} s */ - exec(s) { - const m = this.getMatcher(this.regexIndex); - m.lastIndex = this.lastIndex; - let result = m.exec(s); - if (this.resumingScanAtSamePosition()) { - if (result && result.index === this.lastIndex) - ; - else { - const m2 = this.getMatcher(0); - m2.lastIndex = this.lastIndex + 1; - result = m2.exec(s); - } - } - if (result) { - this.regexIndex += result.position + 1; - if (this.regexIndex === this.count) { - this.considerAll(); - } - } - return result; - } - } - function buildModeRegex(mode) { - const mm = new ResumableMultiRegex(); - mode.contains.forEach((term) => mm.addRule(term.begin, { rule: term, type: "begin" })); - if (mode.terminatorEnd) { - mm.addRule(mode.terminatorEnd, { type: "end" }); - } - if (mode.illegal) { - mm.addRule(mode.illegal, { type: "illegal" }); - } - return mm; - } - function compileMode(mode, parent) { - const cmode = ( - /** @type CompiledMode */ - mode - ); - if (mode.isCompiled) - return cmode; - [ - scopeClassName2, - // do this early so compiler extensions generally don't have to worry about - // the distinction between match/begin - compileMatch2, - MultiClass2, - beforeMatchExt2 - ].forEach((ext) => ext(mode, parent)); - language.compilerExtensions.forEach((ext) => ext(mode, parent)); - mode.__beforeBegin = null; - [ - beginKeywords2, - // do this later so compiler extensions that come earlier have access to the - // raw array if they wanted to perhaps manipulate it, etc. - compileIllegal2, - // default to 1 relevance if not specified - compileRelevance2 - ].forEach((ext) => ext(mode, parent)); - mode.isCompiled = true; - let keywordPattern = null; - if (typeof mode.keywords === "object" && mode.keywords.$pattern) { - mode.keywords = Object.assign({}, mode.keywords); - keywordPattern = mode.keywords.$pattern; - delete mode.keywords.$pattern; - } - keywordPattern = keywordPattern || /\w+/; - if (mode.keywords) { - mode.keywords = compileKeywords2(mode.keywords, language.case_insensitive); - } - cmode.keywordPatternRe = langRe(keywordPattern, true); - if (parent) { - if (!mode.begin) - mode.begin = /\B|\b/; - cmode.beginRe = langRe(cmode.begin); - if (!mode.end && !mode.endsWithParent) - mode.end = /\B|\b/; - if (mode.end) - cmode.endRe = langRe(cmode.end); - cmode.terminatorEnd = source3(cmode.end) || ""; - if (mode.endsWithParent && parent.terminatorEnd) { - cmode.terminatorEnd += (mode.end ? "|" : "") + parent.terminatorEnd; - } - } - if (mode.illegal) - cmode.illegalRe = langRe( - /** @type {RegExp | string} */ - mode.illegal - ); - if (!mode.contains) - mode.contains = []; - mode.contains = [].concat(...mode.contains.map(function(c2) { - return expandOrCloneMode2(c2 === "self" ? mode : c2); - })); - mode.contains.forEach(function(c2) { - compileMode( - /** @type Mode */ - c2, - cmode - ); - }); - if (mode.starts) { - compileMode(mode.starts, parent); - } - cmode.matcher = buildModeRegex(cmode); - return cmode; - } - if (!language.compilerExtensions) - language.compilerExtensions = []; - if (language.contains && language.contains.includes("self")) { - throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); - } - language.classNameAliases = inherit$12(language.classNameAliases || {}); - return compileMode( - /** @type Mode */ - language - ); - } - function dependencyOnParent2(mode) { - if (!mode) - return false; - return mode.endsWithParent || dependencyOnParent2(mode.starts); - } - function expandOrCloneMode2(mode) { - if (mode.variants && !mode.cachedVariants) { - mode.cachedVariants = mode.variants.map(function(variant) { - return inherit$12(mode, { variants: null }, variant); - }); - } - if (mode.cachedVariants) { - return mode.cachedVariants; - } - if (dependencyOnParent2(mode)) { - return inherit$12(mode, { starts: mode.starts ? inherit$12(mode.starts) : null }); - } - if (Object.isFrozen(mode)) { - return inherit$12(mode); - } - return mode; - } - var version2 = "11.8.0"; - var HTMLInjectionError2 = class extends Error { - constructor(reason, html) { - super(reason); - this.name = "HTMLInjectionError"; - this.html = html; - } - }; - var escape2 = escapeHTML2; - var inherit2 = inherit$12; - var NO_MATCH2 = Symbol("nomatch"); - var MAX_KEYWORD_HITS2 = 7; - var HLJS2 = function(hljs) { - const languages = /* @__PURE__ */ Object.create(null); - const aliases = /* @__PURE__ */ Object.create(null); - const plugins = []; - let SAFE_MODE = true; - const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; - const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: "Plain text", contains: [] }; - let options = { - ignoreUnescapedHTML: false, - throwUnescapedHTML: false, - noHighlightRe: /^(no-?highlight)$/i, - languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, - classPrefix: "hljs-", - cssSelector: "pre code", - languages: null, - // beta configuration options, subject to change, welcome to discuss - // https://github.com/highlightjs/highlight.js/issues/1086 - __emitter: TokenTreeEmitter2 - }; - function shouldNotHighlight(languageName) { - return options.noHighlightRe.test(languageName); - } - function blockLanguage(block) { - let classes = block.className + " "; - classes += block.parentNode ? block.parentNode.className : ""; - const match = options.languageDetectRe.exec(classes); - if (match) { - const language = getLanguage(match[1]); - if (!language) { - warn3(LANGUAGE_NOT_FOUND.replace("{}", match[1])); - warn3("Falling back to no-highlight mode for this block.", block); - } - return language ? match[1] : "no-highlight"; - } - return classes.split(/\s+/).find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); - } - function highlight4(codeOrLanguageName, optionsOrCode, ignoreIllegals) { - let code = ""; - let languageName = ""; - if (typeof optionsOrCode === "object") { - code = codeOrLanguageName; - ignoreIllegals = optionsOrCode.ignoreIllegals; - languageName = optionsOrCode.language; - } else { - deprecated2("10.7.0", "highlight(lang, code, ...args) has been deprecated."); - deprecated2("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); - languageName = codeOrLanguageName; - code = optionsOrCode; - } - if (ignoreIllegals === void 0) { - ignoreIllegals = true; - } - const context = { - code, - language: languageName - }; - fire2("before:highlight", context); - const result = context.result ? context.result : _highlight(context.language, context.code, ignoreIllegals); - result.code = context.code; - fire2("after:highlight", result); - return result; - } - function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { - const keywordHits = /* @__PURE__ */ Object.create(null); - function keywordData(mode, matchText) { - return mode.keywords[matchText]; - } - function processKeywords() { - if (!top2.keywords) { - emitter.addText(modeBuffer); - return; - } - let lastIndex = 0; - top2.keywordPatternRe.lastIndex = 0; - let match = top2.keywordPatternRe.exec(modeBuffer); - let buf = ""; - while (match) { - buf += modeBuffer.substring(lastIndex, match.index); - const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; - const data = keywordData(top2, word); - if (data) { - const [kind, keywordRelevance] = data; - emitter.addText(buf); - buf = ""; - keywordHits[word] = (keywordHits[word] || 0) + 1; - if (keywordHits[word] <= MAX_KEYWORD_HITS2) - relevance += keywordRelevance; - if (kind.startsWith("_")) { - buf += match[0]; - } else { - const cssClass = language.classNameAliases[kind] || kind; - emitKeyword(match[0], cssClass); - } - } else { - buf += match[0]; - } - lastIndex = top2.keywordPatternRe.lastIndex; - match = top2.keywordPatternRe.exec(modeBuffer); - } - buf += modeBuffer.substring(lastIndex); - emitter.addText(buf); - } - function processSubLanguage() { - if (modeBuffer === "") - return; - let result2 = null; - if (typeof top2.subLanguage === "string") { - if (!languages[top2.subLanguage]) { - emitter.addText(modeBuffer); - return; - } - result2 = _highlight(top2.subLanguage, modeBuffer, true, continuations[top2.subLanguage]); - continuations[top2.subLanguage] = /** @type {CompiledMode} */ - result2._top; - } else { - result2 = highlightAuto2(modeBuffer, top2.subLanguage.length ? top2.subLanguage : null); - } - if (top2.relevance > 0) { - relevance += result2.relevance; - } - emitter.__addSublanguage(result2._emitter, result2.language); - } - function processBuffer() { - if (top2.subLanguage != null) { - processSubLanguage(); - } else { - processKeywords(); - } - modeBuffer = ""; - } - function emitKeyword(keyword, scope) { - if (keyword === "") - return; - emitter.startScope(scope); - emitter.addText(keyword); - emitter.endScope(); - } - function emitMultiClass(scope, match) { - let i = 1; - const max2 = match.length - 1; - while (i <= max2) { - if (!scope._emit[i]) { - i++; - continue; - } - const klass = language.classNameAliases[scope[i]] || scope[i]; - const text = match[i]; - if (klass) { - emitKeyword(text, klass); - } else { - modeBuffer = text; - processKeywords(); - modeBuffer = ""; - } - i++; - } - } - function startNewMode(mode, match) { - if (mode.scope && typeof mode.scope === "string") { - emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); - } - if (mode.beginScope) { - if (mode.beginScope._wrap) { - emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); - modeBuffer = ""; - } else if (mode.beginScope._multi) { - emitMultiClass(mode.beginScope, match); - modeBuffer = ""; - } - } - top2 = Object.create(mode, { parent: { value: top2 } }); - return top2; - } - function endOfMode(mode, match, matchPlusRemainder) { - let matched = startsWith2(mode.endRe, matchPlusRemainder); - if (matched) { - if (mode["on:end"]) { - const resp = new Response2(mode); - mode["on:end"](match, resp); - if (resp.isMatchIgnored) - matched = false; - } - if (matched) { - while (mode.endsParent && mode.parent) { - mode = mode.parent; - } - return mode; - } - } - if (mode.endsWithParent) { - return endOfMode(mode.parent, match, matchPlusRemainder); - } - } - function doIgnore(lexeme) { - if (top2.matcher.regexIndex === 0) { - modeBuffer += lexeme[0]; - return 1; - } else { - resumeScanAtSamePosition = true; - return 0; - } - } - function doBeginMatch(match) { - const lexeme = match[0]; - const newMode = match.rule; - const resp = new Response2(newMode); - const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; - for (const cb of beforeCallbacks) { - if (!cb) - continue; - cb(match, resp); - if (resp.isMatchIgnored) - return doIgnore(lexeme); - } - if (newMode.skip) { - modeBuffer += lexeme; - } else { - if (newMode.excludeBegin) { - modeBuffer += lexeme; - } - processBuffer(); - if (!newMode.returnBegin && !newMode.excludeBegin) { - modeBuffer = lexeme; - } - } - startNewMode(newMode, match); - return newMode.returnBegin ? 0 : lexeme.length; - } - function doEndMatch(match) { - const lexeme = match[0]; - const matchPlusRemainder = codeToHighlight.substring(match.index); - const endMode = endOfMode(top2, match, matchPlusRemainder); - if (!endMode) { - return NO_MATCH2; - } - const origin = top2; - if (top2.endScope && top2.endScope._wrap) { - processBuffer(); - emitKeyword(lexeme, top2.endScope._wrap); - } else if (top2.endScope && top2.endScope._multi) { - processBuffer(); - emitMultiClass(top2.endScope, match); - } else if (origin.skip) { - modeBuffer += lexeme; - } else { - if (!(origin.returnEnd || origin.excludeEnd)) { - modeBuffer += lexeme; - } - processBuffer(); - if (origin.excludeEnd) { - modeBuffer = lexeme; - } - } - do { - if (top2.scope) { - emitter.closeNode(); - } - if (!top2.skip && !top2.subLanguage) { - relevance += top2.relevance; - } - top2 = top2.parent; - } while (top2 !== endMode.parent); - if (endMode.starts) { - startNewMode(endMode.starts, match); - } - return origin.returnEnd ? 0 : lexeme.length; - } - function processContinuations() { - const list = []; - for (let current = top2; current !== language; current = current.parent) { - if (current.scope) { - list.unshift(current.scope); - } - } - list.forEach((item) => emitter.openNode(item)); - } - let lastMatch = {}; - function processLexeme(textBeforeMatch, match) { - const lexeme = match && match[0]; - modeBuffer += textBeforeMatch; - if (lexeme == null) { - processBuffer(); - return 0; - } - if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { - modeBuffer += codeToHighlight.slice(match.index, match.index + 1); - if (!SAFE_MODE) { - const err = new Error(`0 width match regex (${languageName})`); - err.languageName = languageName; - err.badRule = lastMatch.rule; - throw err; - } - return 1; - } - lastMatch = match; - if (match.type === "begin") { - return doBeginMatch(match); - } else if (match.type === "illegal" && !ignoreIllegals) { - const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top2.scope || "") + '"'); - err.mode = top2; - throw err; - } else if (match.type === "end") { - const processed = doEndMatch(match); - if (processed !== NO_MATCH2) { - return processed; - } - } - if (match.type === "illegal" && lexeme === "") { - return 1; - } - if (iterations > 1e5 && iterations > match.index * 3) { - const err = new Error("potential infinite loop, way more iterations than matches"); - throw err; - } - modeBuffer += lexeme; - return lexeme.length; - } - const language = getLanguage(languageName); - if (!language) { - error2(LANGUAGE_NOT_FOUND.replace("{}", languageName)); - throw new Error('Unknown language: "' + languageName + '"'); - } - const md = compileLanguage2(language); - let result = ""; - let top2 = continuation || md; - const continuations = {}; - const emitter = new options.__emitter(options); - processContinuations(); - let modeBuffer = ""; - let relevance = 0; - let index = 0; - let iterations = 0; - let resumeScanAtSamePosition = false; - try { - if (!language.__emitTokens) { - top2.matcher.considerAll(); - for (; ; ) { - iterations++; - if (resumeScanAtSamePosition) { - resumeScanAtSamePosition = false; - } else { - top2.matcher.considerAll(); - } - top2.matcher.lastIndex = index; - const match = top2.matcher.exec(codeToHighlight); - if (!match) - break; - const beforeMatch = codeToHighlight.substring(index, match.index); - const processedCount = processLexeme(beforeMatch, match); - index = match.index + processedCount; - } - processLexeme(codeToHighlight.substring(index)); - } else { - language.__emitTokens(codeToHighlight, emitter); - } - emitter.finalize(); - result = emitter.toHTML(); - return { - language: languageName, - value: result, - relevance, - illegal: false, - _emitter: emitter, - _top: top2 - }; - } catch (err) { - if (err.message && err.message.includes("Illegal")) { - return { - language: languageName, - value: escape2(codeToHighlight), - illegal: true, - relevance: 0, - _illegalBy: { - message: err.message, - index, - context: codeToHighlight.slice(index - 100, index + 100), - mode: err.mode, - resultSoFar: result - }, - _emitter: emitter - }; - } else if (SAFE_MODE) { - return { - language: languageName, - value: escape2(codeToHighlight), - illegal: false, - relevance: 0, - errorRaised: err, - _emitter: emitter, - _top: top2 - }; - } else { - throw err; - } - } - } - function justTextHighlightResult(code) { - const result = { - value: escape2(code), - illegal: false, - relevance: 0, - _top: PLAINTEXT_LANGUAGE, - _emitter: new options.__emitter(options) - }; - result._emitter.addText(code); - return result; - } - function highlightAuto2(code, languageSubset) { - languageSubset = languageSubset || options.languages || Object.keys(languages); - const plaintext2 = justTextHighlightResult(code); - const results = languageSubset.filter(getLanguage).filter(autoDetection).map( - (name) => _highlight(name, code, false) - ); - results.unshift(plaintext2); - const sorted = results.sort((a, b) => { - if (a.relevance !== b.relevance) - return b.relevance - a.relevance; - if (a.language && b.language) { - if (getLanguage(a.language).supersetOf === b.language) { - return 1; - } else if (getLanguage(b.language).supersetOf === a.language) { - return -1; - } - } - return 0; - }); - const [best, secondBest] = sorted; - const result = best; - result.secondBest = secondBest; - return result; - } - function updateClassName(element, currentLang, resultLang) { - const language = currentLang && aliases[currentLang] || resultLang; - element.classList.add("hljs"); - element.classList.add(`language-${language}`); - } - function highlightElement(element) { - let node = null; - const language = blockLanguage(element); - if (shouldNotHighlight(language)) - return; - fire2( - "before:highlightElement", - { el: element, language } - ); - if (element.children.length > 0) { - if (!options.ignoreUnescapedHTML) { - console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); - console.warn("https://github.com/highlightjs/highlight.js/wiki/security"); - console.warn("The element with unescaped HTML:"); - console.warn(element); - } - if (options.throwUnescapedHTML) { - const err = new HTMLInjectionError2( - "One of your code blocks includes unescaped HTML.", - element.innerHTML - ); - throw err; - } - } - node = element; - const text = node.textContent; - const result = language ? highlight4(text, { language, ignoreIllegals: true }) : highlightAuto2(text); - element.innerHTML = result.value; - updateClassName(element, language, result.language); - element.result = { - language: result.language, - // TODO: remove with version 11.0 - re: result.relevance, - relevance: result.relevance - }; - if (result.secondBest) { - element.secondBest = { - language: result.secondBest.language, - relevance: result.secondBest.relevance - }; - } - fire2("after:highlightElement", { el: element, result, text }); - } - function configure(userOptions) { - options = inherit2(options, userOptions); - } - const initHighlighting = () => { - highlightAll(); - deprecated2("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); - }; - function initHighlightingOnLoad() { - highlightAll(); - deprecated2("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); - } - let wantsHighlight = false; - function highlightAll() { - if (document.readyState === "loading") { - wantsHighlight = true; - return; - } - const blocks = document.querySelectorAll(options.cssSelector); - blocks.forEach(highlightElement); - } - function boot() { - if (wantsHighlight) - highlightAll(); - } - if (typeof window !== "undefined" && window.addEventListener) { - window.addEventListener("DOMContentLoaded", boot, false); - } - function registerLanguage2(languageName, languageDefinition) { - let lang = null; - try { - lang = languageDefinition(hljs); - } catch (error$1) { - error2("Language definition for '{}' could not be registered.".replace("{}", languageName)); - if (!SAFE_MODE) { - throw error$1; - } else { - error2(error$1); - } - lang = PLAINTEXT_LANGUAGE; - } - if (!lang.name) - lang.name = languageName; - languages[languageName] = lang; - lang.rawDefinition = languageDefinition.bind(null, hljs); - if (lang.aliases) { - registerAliases(lang.aliases, { languageName }); - } - } - function unregisterLanguage(languageName) { - delete languages[languageName]; - for (const alias of Object.keys(aliases)) { - if (aliases[alias] === languageName) { - delete aliases[alias]; - } - } - } - function listLanguages2() { - return Object.keys(languages); - } - function getLanguage(name) { - name = (name || "").toLowerCase(); - return languages[name] || languages[aliases[name]]; - } - function registerAliases(aliasList, { languageName }) { - if (typeof aliasList === "string") { - aliasList = [aliasList]; - } - aliasList.forEach((alias) => { - aliases[alias.toLowerCase()] = languageName; - }); - } - function autoDetection(name) { - const lang = getLanguage(name); - return lang && !lang.disableAutodetect; - } - function upgradePluginAPI(plugin) { - if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { - plugin["before:highlightElement"] = (data) => { - plugin["before:highlightBlock"]( - Object.assign({ block: data.el }, data) - ); - }; - } - if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { - plugin["after:highlightElement"] = (data) => { - plugin["after:highlightBlock"]( - Object.assign({ block: data.el }, data) - ); - }; - } - } - function addPlugin(plugin) { - upgradePluginAPI(plugin); - plugins.push(plugin); - } - function removePlugin(plugin) { - const index = plugins.indexOf(plugin); - if (index !== -1) { - plugins.splice(index, 1); - } - } - function fire2(event, args) { - const cb = event; - plugins.forEach(function(plugin) { - if (plugin[cb]) { - plugin[cb](args); - } - }); - } - function deprecateHighlightBlock(el) { - deprecated2("10.7.0", "highlightBlock will be removed entirely in v12.0"); - deprecated2("10.7.0", "Please use highlightElement now."); - return highlightElement(el); - } - Object.assign(hljs, { - highlight: highlight4, - highlightAuto: highlightAuto2, - highlightAll, - highlightElement, - // TODO: Remove with v12 API - highlightBlock: deprecateHighlightBlock, - configure, - initHighlighting, - initHighlightingOnLoad, - registerLanguage: registerLanguage2, - unregisterLanguage, - listLanguages: listLanguages2, - getLanguage, - registerAliases, - autoDetection, - inherit: inherit2, - addPlugin, - removePlugin - }); - hljs.debugMode = function() { - SAFE_MODE = false; - }; - hljs.safeMode = function() { - SAFE_MODE = true; - }; - hljs.versionString = version2; - hljs.regex = { - concat: concat3, - lookahead: lookahead3, - either: either3, - optional: optional2, - anyNumberOfTimes: anyNumberOfTimes2 - }; - for (const key in MODES5) { - if (typeof MODES5[key] === "object") { - deepFreeze2(MODES5[key]); - } - } - Object.assign(hljs, MODES5); - return hljs; - }; - var highlight3 = HLJS2({}); - highlight3.newInstance = () => HLJS2({}); - module.exports = highlight3; - highlight3.HighlightJS = highlight3; - highlight3.default = highlight3; - } -}); - -// node_modules/format/format.js -var require_format = __commonJS({ - "node_modules/format/format.js"(exports, module) { - (function() { - var namespace; - if (typeof module !== "undefined") { - namespace = module.exports = format2; - } else { - namespace = function() { - return this || (1, eval)("this"); - }(); - } - namespace.format = format2; - namespace.vsprintf = vsprintf; - if (typeof console !== "undefined" && typeof console.log === "function") { - namespace.printf = printf; - } - function printf() { - console.log(format2.apply(null, arguments)); - } - function vsprintf(fmt, replacements) { - return format2.apply(null, [fmt].concat(replacements)); - } - function format2(fmt) { - var argIndex = 1, args = [].slice.call(arguments), i = 0, n = fmt.length, result = "", c2, escaped = false, arg, tmp, leadingZero = false, precision, nextArg = function() { - return args[argIndex++]; - }, slurpNumber = function() { - var digits = ""; - while (/\d/.test(fmt[i])) { - digits += fmt[i++]; - c2 = fmt[i]; - } - return digits.length > 0 ? parseInt(digits) : null; - }; - for (; i < n; ++i) { - c2 = fmt[i]; - if (escaped) { - escaped = false; - if (c2 == ".") { - leadingZero = false; - c2 = fmt[++i]; - } else if (c2 == "0" && fmt[i + 1] == ".") { - leadingZero = true; - i += 2; - c2 = fmt[i]; - } else { - leadingZero = true; - } - precision = slurpNumber(); - switch (c2) { - case "b": - result += parseInt(nextArg(), 10).toString(2); - break; - case "c": - arg = nextArg(); - if (typeof arg === "string" || arg instanceof String) - result += arg; - else - result += String.fromCharCode(parseInt(arg, 10)); - break; - case "d": - result += parseInt(nextArg(), 10); - break; - case "f": - tmp = String(parseFloat(nextArg()).toFixed(precision || 6)); - result += leadingZero ? tmp : tmp.replace(/^0/, ""); - break; - case "j": - result += JSON.stringify(nextArg()); - break; - case "o": - result += "0" + parseInt(nextArg(), 10).toString(8); - break; - case "s": - result += nextArg(); - break; - case "x": - result += "0x" + parseInt(nextArg(), 10).toString(16); - break; - case "X": - result += "0x" + parseInt(nextArg(), 10).toString(16).toUpperCase(); - break; - default: - result += c2; - break; - } - } else if (c2 === "%") { - escaped = true; - } else { - result += c2; - } - } - return result; - } - })(); - } -}); - -// node_modules/lodash/lodash.js -var require_lodash = __commonJS({ - "node_modules/lodash/lodash.js"(exports, module) { - (function() { - var undefined2; - var VERSION = "4.17.21"; - var LARGE_ARRAY_SIZE = 200; - var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`"; - var HASH_UNDEFINED = "__lodash_hash_undefined__"; - var MAX_MEMOIZE_SIZE = 500; - var PLACEHOLDER = "__lodash_placeholder__"; - var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; - var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2; - var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512; - var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "..."; - var HOT_COUNT = 800, HOT_SPAN = 16; - var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3; - var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN = 0 / 0; - var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; - var wrapFlags = [ - ["ary", WRAP_ARY_FLAG], - ["bind", WRAP_BIND_FLAG], - ["bindKey", WRAP_BIND_KEY_FLAG], - ["curry", WRAP_CURRY_FLAG], - ["curryRight", WRAP_CURRY_RIGHT_FLAG], - ["flip", WRAP_FLIP_FLAG], - ["partial", WRAP_PARTIAL_FLAG], - ["partialRight", WRAP_PARTIAL_RIGHT_FLAG], - ["rearg", WRAP_REARG_FLAG] - ]; - var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", undefinedTag = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]"; - var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]"; - var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; - var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml = /[&<>"']/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source); - var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; - var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; - var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); - var reTrimStart = /^\s+/; - var reWhitespace = /\s/; - var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /; - var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; - var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; - var reEscapeChar = /\\(\\)?/g; - var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; - var reFlags = /\w*$/; - var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - var reIsBinary = /^0b[01]+$/i; - var reIsHostCtor = /^\[object .+?Constructor\]$/; - var reIsOctal = /^0o[0-7]+$/i; - var reIsUint = /^(?:0|[1-9]\d*)$/; - var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; - var reNoMatch = /($^)/; - var reUnescapedString = /['\n\r\u2028\u2029\\]/g; - var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; - var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d"; - var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")"; - var reApos = RegExp(rsApos, "g"); - var reComboMark = RegExp(rsCombo, "g"); - var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g"); - var reUnicodeWord = RegExp([ - rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")", - rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")", - rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower, - rsUpper + "+" + rsOptContrUpper, - rsOrdUpper, - rsOrdLower, - rsDigits, - rsEmoji - ].join("|"), "g"); - var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]"); - var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; - var contextProps = [ - "Array", - "Buffer", - "DataView", - "Date", - "Error", - "Float32Array", - "Float64Array", - "Function", - "Int8Array", - "Int16Array", - "Int32Array", - "Map", - "Math", - "Object", - "Promise", - "RegExp", - "Set", - "String", - "Symbol", - "TypeError", - "Uint8Array", - "Uint8ClampedArray", - "Uint16Array", - "Uint32Array", - "WeakMap", - "_", - "clearTimeout", - "isFinite", - "parseInt", - "setTimeout" - ]; - var templateCounter = -1; - var typedArrayTags = {}; - typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; - typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; - var cloneableTags = {}; - cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; - cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; - var deburredLetters = { - // Latin-1 Supplement block. - "\xC0": "A", - "\xC1": "A", - "\xC2": "A", - "\xC3": "A", - "\xC4": "A", - "\xC5": "A", - "\xE0": "a", - "\xE1": "a", - "\xE2": "a", - "\xE3": "a", - "\xE4": "a", - "\xE5": "a", - "\xC7": "C", - "\xE7": "c", - "\xD0": "D", - "\xF0": "d", - "\xC8": "E", - "\xC9": "E", - "\xCA": "E", - "\xCB": "E", - "\xE8": "e", - "\xE9": "e", - "\xEA": "e", - "\xEB": "e", - "\xCC": "I", - "\xCD": "I", - "\xCE": "I", - "\xCF": "I", - "\xEC": "i", - "\xED": "i", - "\xEE": "i", - "\xEF": "i", - "\xD1": "N", - "\xF1": "n", - "\xD2": "O", - "\xD3": "O", - "\xD4": "O", - "\xD5": "O", - "\xD6": "O", - "\xD8": "O", - "\xF2": "o", - "\xF3": "o", - "\xF4": "o", - "\xF5": "o", - "\xF6": "o", - "\xF8": "o", - "\xD9": "U", - "\xDA": "U", - "\xDB": "U", - "\xDC": "U", - "\xF9": "u", - "\xFA": "u", - "\xFB": "u", - "\xFC": "u", - "\xDD": "Y", - "\xFD": "y", - "\xFF": "y", - "\xC6": "Ae", - "\xE6": "ae", - "\xDE": "Th", - "\xFE": "th", - "\xDF": "ss", - // Latin Extended-A block. - "\u0100": "A", - "\u0102": "A", - "\u0104": "A", - "\u0101": "a", - "\u0103": "a", - "\u0105": "a", - "\u0106": "C", - "\u0108": "C", - "\u010A": "C", - "\u010C": "C", - "\u0107": "c", - "\u0109": "c", - "\u010B": "c", - "\u010D": "c", - "\u010E": "D", - "\u0110": "D", - "\u010F": "d", - "\u0111": "d", - "\u0112": "E", - "\u0114": "E", - "\u0116": "E", - "\u0118": "E", - "\u011A": "E", - "\u0113": "e", - "\u0115": "e", - "\u0117": "e", - "\u0119": "e", - "\u011B": "e", - "\u011C": "G", - "\u011E": "G", - "\u0120": "G", - "\u0122": "G", - "\u011D": "g", - "\u011F": "g", - "\u0121": "g", - "\u0123": "g", - "\u0124": "H", - "\u0126": "H", - "\u0125": "h", - "\u0127": "h", - "\u0128": "I", - "\u012A": "I", - "\u012C": "I", - "\u012E": "I", - "\u0130": "I", - "\u0129": "i", - "\u012B": "i", - "\u012D": "i", - "\u012F": "i", - "\u0131": "i", - "\u0134": "J", - "\u0135": "j", - "\u0136": "K", - "\u0137": "k", - "\u0138": "k", - "\u0139": "L", - "\u013B": "L", - "\u013D": "L", - "\u013F": "L", - "\u0141": "L", - "\u013A": "l", - "\u013C": "l", - "\u013E": "l", - "\u0140": "l", - "\u0142": "l", - "\u0143": "N", - "\u0145": "N", - "\u0147": "N", - "\u014A": "N", - "\u0144": "n", - "\u0146": "n", - "\u0148": "n", - "\u014B": "n", - "\u014C": "O", - "\u014E": "O", - "\u0150": "O", - "\u014D": "o", - "\u014F": "o", - "\u0151": "o", - "\u0154": "R", - "\u0156": "R", - "\u0158": "R", - "\u0155": "r", - "\u0157": "r", - "\u0159": "r", - "\u015A": "S", - "\u015C": "S", - "\u015E": "S", - "\u0160": "S", - "\u015B": "s", - "\u015D": "s", - "\u015F": "s", - "\u0161": "s", - "\u0162": "T", - "\u0164": "T", - "\u0166": "T", - "\u0163": "t", - "\u0165": "t", - "\u0167": "t", - "\u0168": "U", - "\u016A": "U", - "\u016C": "U", - "\u016E": "U", - "\u0170": "U", - "\u0172": "U", - "\u0169": "u", - "\u016B": "u", - "\u016D": "u", - "\u016F": "u", - "\u0171": "u", - "\u0173": "u", - "\u0174": "W", - "\u0175": "w", - "\u0176": "Y", - "\u0177": "y", - "\u0178": "Y", - "\u0179": "Z", - "\u017B": "Z", - "\u017D": "Z", - "\u017A": "z", - "\u017C": "z", - "\u017E": "z", - "\u0132": "IJ", - "\u0133": "ij", - "\u0152": "Oe", - "\u0153": "oe", - "\u0149": "'n", - "\u017F": "s" - }; - var htmlEscapes = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'" - }; - var htmlUnescapes = { - "&": "&", - "<": "<", - ">": ">", - """: '"', - "'": "'" - }; - var stringEscapes = { - "\\": "\\", - "'": "'", - "\n": "n", - "\r": "r", - "\u2028": "u2028", - "\u2029": "u2029" - }; - var freeParseFloat = parseFloat, freeParseInt = parseInt; - var freeGlobal = typeof global == "object" && global && global.Object === Object && global; - var freeSelf = typeof self == "object" && self && self.Object === Object && self; - var root = freeGlobal || freeSelf || Function("return this")(); - var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports; - var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module; - var moduleExports = freeModule && freeModule.exports === freeExports; - var freeProcess = moduleExports && freeGlobal.process; - var nodeUtil = function() { - try { - var types = freeModule && freeModule.require && freeModule.require("util").types; - if (types) { - return types; - } - return freeProcess && freeProcess.binding && freeProcess.binding("util"); - } catch (e) { - } - }(); - var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; - function apply2(func, thisArg, args) { - switch (args.length) { - case 0: - return func.call(thisArg); - case 1: - return func.call(thisArg, args[0]); - case 2: - return func.call(thisArg, args[0], args[1]); - case 3: - return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); - } - function arrayAggregator(array, setter, iteratee, accumulator) { - var index = -1, length = array == null ? 0 : array.length; - while (++index < length) { - var value = array[index]; - setter(accumulator, value, iteratee(value), array); - } - return accumulator; - } - function arrayEach(array, iteratee) { - var index = -1, length = array == null ? 0 : array.length; - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; - } - } - return array; - } - function arrayEachRight(array, iteratee) { - var length = array == null ? 0 : array.length; - while (length--) { - if (iteratee(array[length], length, array) === false) { - break; - } - } - return array; - } - function arrayEvery(array, predicate) { - var index = -1, length = array == null ? 0 : array.length; - while (++index < length) { - if (!predicate(array[index], index, array)) { - return false; - } - } - return true; - } - function arrayFilter(array, predicate) { - var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result[resIndex++] = value; - } - } - return result; - } - function arrayIncludes(array, value) { - var length = array == null ? 0 : array.length; - return !!length && baseIndexOf(array, value, 0) > -1; - } - function arrayIncludesWith(array, value, comparator) { - var index = -1, length = array == null ? 0 : array.length; - while (++index < length) { - if (comparator(value, array[index])) { - return true; - } - } - return false; - } - function arrayMap(array, iteratee) { - var index = -1, length = array == null ? 0 : array.length, result = Array(length); - while (++index < length) { - result[index] = iteratee(array[index], index, array); - } - return result; - } - function arrayPush(array, values) { - var index = -1, length = values.length, offset2 = array.length; - while (++index < length) { - array[offset2 + index] = values[index]; - } - return array; - } - function arrayReduce(array, iteratee, accumulator, initAccum) { - var index = -1, length = array == null ? 0 : array.length; - if (initAccum && length) { - accumulator = array[++index]; - } - while (++index < length) { - accumulator = iteratee(accumulator, array[index], index, array); - } - return accumulator; - } - function arrayReduceRight(array, iteratee, accumulator, initAccum) { - var length = array == null ? 0 : array.length; - if (initAccum && length) { - accumulator = array[--length]; - } - while (length--) { - accumulator = iteratee(accumulator, array[length], length, array); - } - return accumulator; - } - function arraySome(array, predicate) { - var index = -1, length = array == null ? 0 : array.length; - while (++index < length) { - if (predicate(array[index], index, array)) { - return true; - } - } - return false; - } - var asciiSize = baseProperty("length"); - function asciiToArray(string) { - return string.split(""); - } - function asciiWords(string) { - return string.match(reAsciiWord) || []; - } - function baseFindKey(collection, predicate, eachFunc) { - var result; - eachFunc(collection, function(value, key, collection2) { - if (predicate(value, key, collection2)) { - result = key; - return false; - } - }); - return result; - } - function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, index = fromIndex + (fromRight ? 1 : -1); - while (fromRight ? index-- : ++index < length) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; - } - function baseIndexOf(array, value, fromIndex) { - return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); - } - function baseIndexOfWith(array, value, fromIndex, comparator) { - var index = fromIndex - 1, length = array.length; - while (++index < length) { - if (comparator(array[index], value)) { - return index; - } - } - return -1; - } - function baseIsNaN(value) { - return value !== value; - } - function baseMean(array, iteratee) { - var length = array == null ? 0 : array.length; - return length ? baseSum(array, iteratee) / length : NAN; - } - function baseProperty(key) { - return function(object) { - return object == null ? undefined2 : object[key]; - }; - } - function basePropertyOf(object) { - return function(key) { - return object == null ? undefined2 : object[key]; - }; - } - function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { - eachFunc(collection, function(value, index, collection2) { - accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection2); - }); - return accumulator; - } - function baseSortBy(array, comparer) { - var length = array.length; - array.sort(comparer); - while (length--) { - array[length] = array[length].value; - } - return array; - } - function baseSum(array, iteratee) { - var result, index = -1, length = array.length; - while (++index < length) { - var current = iteratee(array[index]); - if (current !== undefined2) { - result = result === undefined2 ? current : result + current; - } - } - return result; - } - function baseTimes(n, iteratee) { - var index = -1, result = Array(n); - while (++index < n) { - result[index] = iteratee(index); - } - return result; - } - function baseToPairs(object, props) { - return arrayMap(props, function(key) { - return [key, object[key]]; - }); - } - function baseTrim(string) { - return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string; - } - function baseUnary(func) { - return function(value) { - return func(value); - }; - } - function baseValues(object, props) { - return arrayMap(props, function(key) { - return object[key]; - }); - } - function cacheHas(cache2, key) { - return cache2.has(key); - } - function charsStartIndex(strSymbols, chrSymbols) { - var index = -1, length = strSymbols.length; - while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) { - } - return index; - } - function charsEndIndex(strSymbols, chrSymbols) { - var index = strSymbols.length; - while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) { - } - return index; - } - function countHolders(array, placeholder) { - var length = array.length, result = 0; - while (length--) { - if (array[length] === placeholder) { - ++result; - } - } - return result; - } - var deburrLetter = basePropertyOf(deburredLetters); - var escapeHtmlChar = basePropertyOf(htmlEscapes); - function escapeStringChar(chr) { - return "\\" + stringEscapes[chr]; - } - function getValue(object, key) { - return object == null ? undefined2 : object[key]; - } - function hasUnicode(string) { - return reHasUnicode.test(string); - } - function hasUnicodeWord(string) { - return reHasUnicodeWord.test(string); - } - function iteratorToArray(iterator) { - var data, result = []; - while (!(data = iterator.next()).done) { - result.push(data.value); - } - return result; - } - function mapToArray(map2) { - var index = -1, result = Array(map2.size); - map2.forEach(function(value, key) { - result[++index] = [key, value]; - }); - return result; - } - function overArg(func, transform) { - return function(arg) { - return func(transform(arg)); - }; - } - function replaceHolders(array, placeholder) { - var index = -1, length = array.length, resIndex = 0, result = []; - while (++index < length) { - var value = array[index]; - if (value === placeholder || value === PLACEHOLDER) { - array[index] = PLACEHOLDER; - result[resIndex++] = index; - } - } - return result; - } - function setToArray(set) { - var index = -1, result = Array(set.size); - set.forEach(function(value) { - result[++index] = value; - }); - return result; - } - function setToPairs(set) { - var index = -1, result = Array(set.size); - set.forEach(function(value) { - result[++index] = [value, value]; - }); - return result; - } - function strictIndexOf(array, value, fromIndex) { - var index = fromIndex - 1, length = array.length; - while (++index < length) { - if (array[index] === value) { - return index; - } - } - return -1; - } - function strictLastIndexOf(array, value, fromIndex) { - var index = fromIndex + 1; - while (index--) { - if (array[index] === value) { - return index; - } - } - return index; - } - function stringSize(string) { - return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); - } - function stringToArray2(string) { - return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); - } - function trimmedEndIndex(string) { - var index = string.length; - while (index-- && reWhitespace.test(string.charAt(index))) { - } - return index; - } - var unescapeHtmlChar = basePropertyOf(htmlUnescapes); - function unicodeSize(string) { - var result = reUnicode.lastIndex = 0; - while (reUnicode.test(string)) { - ++result; - } - return result; - } - function unicodeToArray(string) { - return string.match(reUnicode) || []; - } - function unicodeWords(string) { - return string.match(reUnicodeWord) || []; - } - var runInContext = function runInContext2(context) { - context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); - var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError; - var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto = Object2.prototype; - var coreJsData = context["__core-js_shared__"]; - var funcToString = funcProto.toString; - var hasOwnProperty2 = objectProto.hasOwnProperty; - var idCounter2 = 0; - var maskSrcKey = function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); - return uid ? "Symbol(src)_1." + uid : ""; - }(); - var nativeObjectToString = objectProto.toString; - var objectCtorString = funcToString.call(Object2); - var oldDash = root._; - var reIsNative = RegExp2( - "^" + funcToString.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$" - ); - var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2; - var defineProperty = function() { - try { - var func = getNative(Object2, "defineProperty"); - func({}, "", {}); - return func; - } catch (e) { - } - }(); - var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; - var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse; - var DataView = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap2 = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create"); - var metaMap = WeakMap2 && new WeakMap2(); - var realNames = {}; - var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap2); - var symbolProto = Symbol2 ? Symbol2.prototype : undefined2, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined2, symbolToString = symbolProto ? symbolProto.toString : undefined2; - function lodash(value) { - if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { - if (value instanceof LodashWrapper) { - return value; - } - if (hasOwnProperty2.call(value, "__wrapped__")) { - return wrapperClone(value); - } - } - return new LodashWrapper(value); - } - var baseCreate = /* @__PURE__ */ function() { - function object() { - } - return function(proto) { - if (!isObject(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result2 = new object(); - object.prototype = undefined2; - return result2; - }; - }(); - function baseLodash() { - } - function LodashWrapper(value, chainAll) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__chain__ = !!chainAll; - this.__index__ = 0; - this.__values__ = undefined2; - } - lodash.templateSettings = { - /** - * Used to detect `data` property values to be HTML-escaped. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - "escape": reEscape, - /** - * Used to detect code to be evaluated. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - "evaluate": reEvaluate, - /** - * Used to detect `data` property values to inject. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - "interpolate": reInterpolate, - /** - * Used to reference the data object in the template text. - * - * @memberOf _.templateSettings - * @type {string} - */ - "variable": "", - /** - * Used to import variables into the compiled template. - * - * @memberOf _.templateSettings - * @type {Object} - */ - "imports": { - /** - * A reference to the `lodash` function. - * - * @memberOf _.templateSettings.imports - * @type {Function} - */ - "_": lodash - } - }; - lodash.prototype = baseLodash.prototype; - lodash.prototype.constructor = lodash; - LodashWrapper.prototype = baseCreate(baseLodash.prototype); - LodashWrapper.prototype.constructor = LodashWrapper; - function LazyWrapper(value) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__dir__ = 1; - this.__filtered__ = false; - this.__iteratees__ = []; - this.__takeCount__ = MAX_ARRAY_LENGTH; - this.__views__ = []; - } - function lazyClone() { - var result2 = new LazyWrapper(this.__wrapped__); - result2.__actions__ = copyArray(this.__actions__); - result2.__dir__ = this.__dir__; - result2.__filtered__ = this.__filtered__; - result2.__iteratees__ = copyArray(this.__iteratees__); - result2.__takeCount__ = this.__takeCount__; - result2.__views__ = copyArray(this.__views__); - return result2; - } - function lazyReverse() { - if (this.__filtered__) { - var result2 = new LazyWrapper(this); - result2.__dir__ = -1; - result2.__filtered__ = true; - } else { - result2 = this.clone(); - result2.__dir__ *= -1; - } - return result2; - } - function lazyValue() { - var array = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray(array), isRight = dir < 0, arrLength = isArr ? array.length : 0, view = getView(0, arrLength, this.__views__), start2 = view.start, end2 = view.end, length = end2 - start2, index = isRight ? end2 : start2 - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin(length, this.__takeCount__); - if (!isArr || !isRight && arrLength == length && takeCount == length) { - return baseWrapperValue(array, this.__actions__); - } - var result2 = []; - outer: - while (length-- && resIndex < takeCount) { - index += dir; - var iterIndex = -1, value = array[index]; - while (++iterIndex < iterLength) { - var data = iteratees[iterIndex], iteratee2 = data.iteratee, type = data.type, computed = iteratee2(value); - if (type == LAZY_MAP_FLAG) { - value = computed; - } else if (!computed) { - if (type == LAZY_FILTER_FLAG) { - continue outer; - } else { - break outer; - } - } - } - result2[resIndex++] = value; - } - return result2; - } - LazyWrapper.prototype = baseCreate(baseLodash.prototype); - LazyWrapper.prototype.constructor = LazyWrapper; - function Hash(entries) { - var index = -1, length = entries == null ? 0 : entries.length; - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; - this.size = 0; - } - function hashDelete(key) { - var result2 = this.has(key) && delete this.__data__[key]; - this.size -= result2 ? 1 : 0; - return result2; - } - function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result2 = data[key]; - return result2 === HASH_UNDEFINED ? undefined2 : result2; - } - return hasOwnProperty2.call(data, key) ? data[key] : undefined2; - } - function hashHas(key) { - var data = this.__data__; - return nativeCreate ? data[key] !== undefined2 : hasOwnProperty2.call(data, key); - } - function hashSet(key, value) { - var data = this.__data__; - this.size += this.has(key) ? 0 : 1; - data[key] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value; - return this; - } - Hash.prototype.clear = hashClear; - Hash.prototype["delete"] = hashDelete; - Hash.prototype.get = hashGet; - Hash.prototype.has = hashHas; - Hash.prototype.set = hashSet; - function ListCache(entries) { - var index = -1, length = entries == null ? 0 : entries.length; - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - function listCacheClear() { - this.__data__ = []; - this.size = 0; - } - function listCacheDelete(key) { - var data = this.__data__, index = assocIndexOf(data, key); - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - --this.size; - return true; - } - function listCacheGet(key) { - var data = this.__data__, index = assocIndexOf(data, key); - return index < 0 ? undefined2 : data[index][1]; - } - function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; - } - function listCacheSet(key, value) { - var data = this.__data__, index = assocIndexOf(data, key); - if (index < 0) { - ++this.size; - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; - } - ListCache.prototype.clear = listCacheClear; - ListCache.prototype["delete"] = listCacheDelete; - ListCache.prototype.get = listCacheGet; - ListCache.prototype.has = listCacheHas; - ListCache.prototype.set = listCacheSet; - function MapCache(entries) { - var index = -1, length = entries == null ? 0 : entries.length; - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - function mapCacheClear() { - this.size = 0; - this.__data__ = { - "hash": new Hash(), - "map": new (Map2 || ListCache)(), - "string": new Hash() - }; - } - function mapCacheDelete(key) { - var result2 = getMapData(this, key)["delete"](key); - this.size -= result2 ? 1 : 0; - return result2; - } - function mapCacheGet(key) { - return getMapData(this, key).get(key); - } - function mapCacheHas(key) { - return getMapData(this, key).has(key); - } - function mapCacheSet(key, value) { - var data = getMapData(this, key), size2 = data.size; - data.set(key, value); - this.size += data.size == size2 ? 0 : 1; - return this; - } - MapCache.prototype.clear = mapCacheClear; - MapCache.prototype["delete"] = mapCacheDelete; - MapCache.prototype.get = mapCacheGet; - MapCache.prototype.has = mapCacheHas; - MapCache.prototype.set = mapCacheSet; - function SetCache(values2) { - var index = -1, length = values2 == null ? 0 : values2.length; - this.__data__ = new MapCache(); - while (++index < length) { - this.add(values2[index]); - } - } - function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED); - return this; - } - function setCacheHas(value) { - return this.__data__.has(value); - } - SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; - SetCache.prototype.has = setCacheHas; - function Stack(entries) { - var data = this.__data__ = new ListCache(entries); - this.size = data.size; - } - function stackClear() { - this.__data__ = new ListCache(); - this.size = 0; - } - function stackDelete(key) { - var data = this.__data__, result2 = data["delete"](key); - this.size = data.size; - return result2; - } - function stackGet(key) { - return this.__data__.get(key); - } - function stackHas(key) { - return this.__data__.has(key); - } - function stackSet(key, value) { - var data = this.__data__; - if (data instanceof ListCache) { - var pairs = data.__data__; - if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) { - pairs.push([key, value]); - this.size = ++data.size; - return this; - } - data = this.__data__ = new MapCache(pairs); - } - data.set(key, value); - this.size = data.size; - return this; - } - Stack.prototype.clear = stackClear; - Stack.prototype["delete"] = stackDelete; - Stack.prototype.get = stackGet; - Stack.prototype.has = stackHas; - Stack.prototype.set = stackSet; - function arrayLikeKeys(value, inherited) { - var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType2 = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType2, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length; - for (var key in value) { - if ((inherited || hasOwnProperty2.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode. - (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers. - isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays. - isType2 && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties. - isIndex(key, length)))) { - result2.push(key); - } - } - return result2; - } - function arraySample(array) { - var length = array.length; - return length ? array[baseRandom(0, length - 1)] : undefined2; - } - function arraySampleSize(array, n) { - return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); - } - function arrayShuffle(array) { - return shuffleSelf(copyArray(array)); - } - function assignMergeValue(object, key, value) { - if (value !== undefined2 && !eq(object[key], value) || value === undefined2 && !(key in object)) { - baseAssignValue(object, key, value); - } - } - function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty2.call(object, key) && eq(objValue, value)) || value === undefined2 && !(key in object)) { - baseAssignValue(object, key, value); - } - } - function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } - } - return -1; - } - function baseAggregator(collection, setter, iteratee2, accumulator) { - baseEach(collection, function(value, key, collection2) { - setter(accumulator, value, iteratee2(value), collection2); - }); - return accumulator; - } - function baseAssign(object, source3) { - return object && copyObject(source3, keys2(source3), object); - } - function baseAssignIn(object, source3) { - return object && copyObject(source3, keysIn(source3), object); - } - function baseAssignValue(object, key, value) { - if (key == "__proto__" && defineProperty) { - defineProperty(object, key, { - "configurable": true, - "enumerable": true, - "value": value, - "writable": true - }); - } else { - object[key] = value; - } - } - function baseAt(object, paths) { - var index = -1, length = paths.length, result2 = Array2(length), skip = object == null; - while (++index < length) { - result2[index] = skip ? undefined2 : get2(object, paths[index]); - } - return result2; - } - function baseClamp(number, lower, upper) { - if (number === number) { - if (upper !== undefined2) { - number = number <= upper ? number : upper; - } - if (lower !== undefined2) { - number = number >= lower ? number : lower; - } - } - return number; - } - function baseClone(value, bitmask, customizer, key, object, stack) { - var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG; - if (customizer) { - result2 = object ? customizer(value, key, object, stack) : customizer(value); - } - if (result2 !== undefined2) { - return result2; - } - if (!isObject(value)) { - return value; - } - var isArr = isArray(value); - if (isArr) { - result2 = initCloneArray(value); - if (!isDeep) { - return copyArray(value, result2); - } - } else { - var tag = getTag(value), isFunc = tag == funcTag || tag == genTag; - if (isBuffer(value)) { - return cloneBuffer(value, isDeep); - } - if (tag == objectTag || tag == argsTag || isFunc && !object) { - result2 = isFlat || isFunc ? {} : initCloneObject(value); - if (!isDeep) { - return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value)); - } - } else { - if (!cloneableTags[tag]) { - return object ? value : {}; - } - result2 = initCloneByTag(value, tag, isDeep); - } - } - stack || (stack = new Stack()); - var stacked = stack.get(value); - if (stacked) { - return stacked; - } - stack.set(value, result2); - if (isSet(value)) { - value.forEach(function(subValue) { - result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); - }); - } else if (isMap(value)) { - value.forEach(function(subValue, key2) { - result2.set(key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); - }); - } - var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys2; - var props = isArr ? undefined2 : keysFunc(value); - arrayEach(props || value, function(subValue, key2) { - if (props) { - key2 = subValue; - subValue = value[key2]; - } - assignValue(result2, key2, baseClone(subValue, bitmask, customizer, key2, value, stack)); - }); - return result2; - } - function baseConforms(source3) { - var props = keys2(source3); - return function(object) { - return baseConformsTo(object, source3, props); - }; - } - function baseConformsTo(object, source3, props) { - var length = props.length; - if (object == null) { - return !length; - } - object = Object2(object); - while (length--) { - var key = props[length], predicate = source3[key], value = object[key]; - if (value === undefined2 && !(key in object) || !predicate(value)) { - return false; - } - } - return true; - } - function baseDelay(func, wait, args) { - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - return setTimeout2(function() { - func.apply(undefined2, args); - }, wait); - } - function baseDifference(array, values2, iteratee2, comparator) { - var index = -1, includes2 = arrayIncludes, isCommon = true, length = array.length, result2 = [], valuesLength = values2.length; - if (!length) { - return result2; - } - if (iteratee2) { - values2 = arrayMap(values2, baseUnary(iteratee2)); - } - if (comparator) { - includes2 = arrayIncludesWith; - isCommon = false; - } else if (values2.length >= LARGE_ARRAY_SIZE) { - includes2 = cacheHas; - isCommon = false; - values2 = new SetCache(values2); - } - outer: - while (++index < length) { - var value = array[index], computed = iteratee2 == null ? value : iteratee2(value); - value = comparator || value !== 0 ? value : 0; - if (isCommon && computed === computed) { - var valuesIndex = valuesLength; - while (valuesIndex--) { - if (values2[valuesIndex] === computed) { - continue outer; - } - } - result2.push(value); - } else if (!includes2(values2, computed, comparator)) { - result2.push(value); - } - } - return result2; - } - var baseEach = createBaseEach(baseForOwn); - var baseEachRight = createBaseEach(baseForOwnRight, true); - function baseEvery(collection, predicate) { - var result2 = true; - baseEach(collection, function(value, index, collection2) { - result2 = !!predicate(value, index, collection2); - return result2; - }); - return result2; - } - function baseExtremum(array, iteratee2, comparator) { - var index = -1, length = array.length; - while (++index < length) { - var value = array[index], current = iteratee2(value); - if (current != null && (computed === undefined2 ? current === current && !isSymbol(current) : comparator(current, computed))) { - var computed = current, result2 = value; - } - } - return result2; - } - function baseFill(array, value, start2, end2) { - var length = array.length; - start2 = toInteger(start2); - if (start2 < 0) { - start2 = -start2 > length ? 0 : length + start2; - } - end2 = end2 === undefined2 || end2 > length ? length : toInteger(end2); - if (end2 < 0) { - end2 += length; - } - end2 = start2 > end2 ? 0 : toLength(end2); - while (start2 < end2) { - array[start2++] = value; - } - return array; - } - function baseFilter(collection, predicate) { - var result2 = []; - baseEach(collection, function(value, index, collection2) { - if (predicate(value, index, collection2)) { - result2.push(value); - } - }); - return result2; - } - function baseFlatten(array, depth, predicate, isStrict, result2) { - var index = -1, length = array.length; - predicate || (predicate = isFlattenable); - result2 || (result2 = []); - while (++index < length) { - var value = array[index]; - if (depth > 0 && predicate(value)) { - if (depth > 1) { - baseFlatten(value, depth - 1, predicate, isStrict, result2); - } else { - arrayPush(result2, value); - } - } else if (!isStrict) { - result2[result2.length] = value; - } - } - return result2; - } - var baseFor = createBaseFor(); - var baseForRight = createBaseFor(true); - function baseForOwn(object, iteratee2) { - return object && baseFor(object, iteratee2, keys2); - } - function baseForOwnRight(object, iteratee2) { - return object && baseForRight(object, iteratee2, keys2); - } - function baseFunctions(object, props) { - return arrayFilter(props, function(key) { - return isFunction3(object[key]); - }); - } - function baseGet(object, path) { - path = castPath(path, object); - var index = 0, length = path.length; - while (object != null && index < length) { - object = object[toKey(path[index++])]; - } - return index && index == length ? object : undefined2; - } - function baseGetAllKeys(object, keysFunc, symbolsFunc) { - var result2 = keysFunc(object); - return isArray(object) ? result2 : arrayPush(result2, symbolsFunc(object)); - } - function baseGetTag(value) { - if (value == null) { - return value === undefined2 ? undefinedTag : nullTag; - } - return symToStringTag && symToStringTag in Object2(value) ? getRawTag(value) : objectToString(value); - } - function baseGt(value, other) { - return value > other; - } - function baseHas(object, key) { - return object != null && hasOwnProperty2.call(object, key); - } - function baseHasIn(object, key) { - return object != null && key in Object2(object); - } - function baseInRange(number, start2, end2) { - return number >= nativeMin(start2, end2) && number < nativeMax(start2, end2); - } - function baseIntersection(arrays, iteratee2, comparator) { - var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = []; - while (othIndex--) { - var array = arrays[othIndex]; - if (othIndex && iteratee2) { - array = arrayMap(array, baseUnary(iteratee2)); - } - maxLength = nativeMin(array.length, maxLength); - caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined2; - } - array = arrays[0]; - var index = -1, seen = caches[0]; - outer: - while (++index < length && result2.length < maxLength) { - var value = array[index], computed = iteratee2 ? iteratee2(value) : value; - value = comparator || value !== 0 ? value : 0; - if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) { - othIndex = othLength; - while (--othIndex) { - var cache2 = caches[othIndex]; - if (!(cache2 ? cacheHas(cache2, computed) : includes2(arrays[othIndex], computed, comparator))) { - continue outer; - } - } - if (seen) { - seen.push(computed); - } - result2.push(value); - } - } - return result2; - } - function baseInverter(object, setter, iteratee2, accumulator) { - baseForOwn(object, function(value, key, object2) { - setter(accumulator, iteratee2(value), key, object2); - }); - return accumulator; - } - function baseInvoke(object, path, args) { - path = castPath(path, object); - object = parent(object, path); - var func = object == null ? object : object[toKey(last(path))]; - return func == null ? undefined2 : apply2(func, object, args); - } - function baseIsArguments(value) { - return isObjectLike(value) && baseGetTag(value) == argsTag; - } - function baseIsArrayBuffer(value) { - return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; - } - function baseIsDate(value) { - return isObjectLike(value) && baseGetTag(value) == dateTag; - } - function baseIsEqual(value, other, bitmask, customizer, stack) { - if (value === other) { - return true; - } - if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) { - return value !== value && other !== other; - } - return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); - } - function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { - var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other); - objTag = objTag == argsTag ? objectTag : objTag; - othTag = othTag == argsTag ? objectTag : othTag; - var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag; - if (isSameTag && isBuffer(object)) { - if (!isBuffer(other)) { - return false; - } - objIsArr = true; - objIsObj = false; - } - if (isSameTag && !objIsObj) { - stack || (stack = new Stack()); - return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); - } - if (!(bitmask & COMPARE_PARTIAL_FLAG)) { - var objIsWrapped = objIsObj && hasOwnProperty2.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty2.call(other, "__wrapped__"); - if (objIsWrapped || othIsWrapped) { - var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other; - stack || (stack = new Stack()); - return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); - } - } - if (!isSameTag) { - return false; - } - stack || (stack = new Stack()); - return equalObjects(object, other, bitmask, customizer, equalFunc, stack); - } - function baseIsMap(value) { - return isObjectLike(value) && getTag(value) == mapTag; - } - function baseIsMatch(object, source3, matchData, customizer) { - var index = matchData.length, length = index, noCustomizer = !customizer; - if (object == null) { - return !length; - } - object = Object2(object); - while (index--) { - var data = matchData[index]; - if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) { - return false; - } - } - while (++index < length) { - data = matchData[index]; - var key = data[0], objValue = object[key], srcValue = data[1]; - if (noCustomizer && data[2]) { - if (objValue === undefined2 && !(key in object)) { - return false; - } - } else { - var stack = new Stack(); - if (customizer) { - var result2 = customizer(objValue, srcValue, key, object, source3, stack); - } - if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) { - return false; - } - } - } - return true; - } - function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; - } - var pattern = isFunction3(value) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); - } - function baseIsRegExp(value) { - return isObjectLike(value) && baseGetTag(value) == regexpTag; - } - function baseIsSet(value) { - return isObjectLike(value) && getTag(value) == setTag; - } - function baseIsTypedArray(value) { - return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; - } - function baseIteratee(value) { - if (typeof value == "function") { - return value; - } - if (value == null) { - return identity; - } - if (typeof value == "object") { - return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value); - } - return property(value); - } - function baseKeys(object) { - if (!isPrototype(object)) { - return nativeKeys(object); - } - var result2 = []; - for (var key in Object2(object)) { - if (hasOwnProperty2.call(object, key) && key != "constructor") { - result2.push(key); - } - } - return result2; - } - function baseKeysIn(object) { - if (!isObject(object)) { - return nativeKeysIn(object); - } - var isProto = isPrototype(object), result2 = []; - for (var key in object) { - if (!(key == "constructor" && (isProto || !hasOwnProperty2.call(object, key)))) { - result2.push(key); - } - } - return result2; - } - function baseLt(value, other) { - return value < other; - } - function baseMap(collection, iteratee2) { - var index = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : []; - baseEach(collection, function(value, key, collection2) { - result2[++index] = iteratee2(value, key, collection2); - }); - return result2; - } - function baseMatches(source3) { - var matchData = getMatchData(source3); - if (matchData.length == 1 && matchData[0][2]) { - return matchesStrictComparable(matchData[0][0], matchData[0][1]); - } - return function(object) { - return object === source3 || baseIsMatch(object, source3, matchData); - }; - } - function baseMatchesProperty(path, srcValue) { - if (isKey(path) && isStrictComparable(srcValue)) { - return matchesStrictComparable(toKey(path), srcValue); - } - return function(object) { - var objValue = get2(object, path); - return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); - }; - } - function baseMerge(object, source3, srcIndex, customizer, stack) { - if (object === source3) { - return; - } - baseFor(source3, function(srcValue, key) { - stack || (stack = new Stack()); - if (isObject(srcValue)) { - baseMergeDeep(object, source3, key, srcIndex, baseMerge, customizer, stack); - } else { - var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source3, stack) : undefined2; - if (newValue === undefined2) { - newValue = srcValue; - } - assignMergeValue(object, key, newValue); - } - }, keysIn); - } - function baseMergeDeep(object, source3, key, srcIndex, mergeFunc, customizer, stack) { - var objValue = safeGet(object, key), srcValue = safeGet(source3, key), stacked = stack.get(srcValue); - if (stacked) { - assignMergeValue(object, key, stacked); - return; - } - var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source3, stack) : undefined2; - var isCommon = newValue === undefined2; - if (isCommon) { - var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); - newValue = srcValue; - if (isArr || isBuff || isTyped) { - if (isArray(objValue)) { - newValue = objValue; - } else if (isArrayLikeObject(objValue)) { - newValue = copyArray(objValue); - } else if (isBuff) { - isCommon = false; - newValue = cloneBuffer(srcValue, true); - } else if (isTyped) { - isCommon = false; - newValue = cloneTypedArray(srcValue, true); - } else { - newValue = []; - } - } else if (isPlainObject2(srcValue) || isArguments(srcValue)) { - newValue = objValue; - if (isArguments(objValue)) { - newValue = toPlainObject(objValue); - } else if (!isObject(objValue) || isFunction3(objValue)) { - newValue = initCloneObject(srcValue); - } - } else { - isCommon = false; - } - } - if (isCommon) { - stack.set(srcValue, newValue); - mergeFunc(newValue, srcValue, srcIndex, customizer, stack); - stack["delete"](srcValue); - } - assignMergeValue(object, key, newValue); - } - function baseNth(array, n) { - var length = array.length; - if (!length) { - return; - } - n += n < 0 ? length : 0; - return isIndex(n, length) ? array[n] : undefined2; - } - function baseOrderBy(collection, iteratees, orders) { - if (iteratees.length) { - iteratees = arrayMap(iteratees, function(iteratee2) { - if (isArray(iteratee2)) { - return function(value) { - return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2); - }; - } - return iteratee2; - }); - } else { - iteratees = [identity]; - } - var index = -1; - iteratees = arrayMap(iteratees, baseUnary(getIteratee())); - var result2 = baseMap(collection, function(value, key, collection2) { - var criteria = arrayMap(iteratees, function(iteratee2) { - return iteratee2(value); - }); - return { "criteria": criteria, "index": ++index, "value": value }; - }); - return baseSortBy(result2, function(object, other) { - return compareMultiple(object, other, orders); - }); - } - function basePick(object, paths) { - return basePickBy(object, paths, function(value, path) { - return hasIn(object, path); - }); - } - function basePickBy(object, paths, predicate) { - var index = -1, length = paths.length, result2 = {}; - while (++index < length) { - var path = paths[index], value = baseGet(object, path); - if (predicate(value, path)) { - baseSet(result2, castPath(path, object), value); - } - } - return result2; - } - function basePropertyDeep(path) { - return function(object) { - return baseGet(object, path); - }; - } - function basePullAll(array, values2, iteratee2, comparator) { - var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values2.length, seen = array; - if (array === values2) { - values2 = copyArray(values2); - } - if (iteratee2) { - seen = arrayMap(array, baseUnary(iteratee2)); - } - while (++index < length) { - var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value; - while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) { - if (seen !== array) { - splice.call(seen, fromIndex, 1); - } - splice.call(array, fromIndex, 1); - } - } - return array; - } - function basePullAt(array, indexes) { - var length = array ? indexes.length : 0, lastIndex = length - 1; - while (length--) { - var index = indexes[length]; - if (length == lastIndex || index !== previous) { - var previous = index; - if (isIndex(index)) { - splice.call(array, index, 1); - } else { - baseUnset(array, index); - } - } - } - return array; - } - function baseRandom(lower, upper) { - return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); - } - function baseRange(start2, end2, step, fromRight) { - var index = -1, length = nativeMax(nativeCeil((end2 - start2) / (step || 1)), 0), result2 = Array2(length); - while (length--) { - result2[fromRight ? length : ++index] = start2; - start2 += step; - } - return result2; - } - function baseRepeat(string, n) { - var result2 = ""; - if (!string || n < 1 || n > MAX_SAFE_INTEGER) { - return result2; - } - do { - if (n % 2) { - result2 += string; - } - n = nativeFloor(n / 2); - if (n) { - string += string; - } - } while (n); - return result2; - } - function baseRest(func, start2) { - return setToString(overRest(func, start2, identity), func + ""); - } - function baseSample(collection) { - return arraySample(values(collection)); - } - function baseSampleSize(collection, n) { - var array = values(collection); - return shuffleSelf(array, baseClamp(n, 0, array.length)); - } - function baseSet(object, path, value, customizer) { - if (!isObject(object)) { - return object; - } - path = castPath(path, object); - var index = -1, length = path.length, lastIndex = length - 1, nested = object; - while (nested != null && ++index < length) { - var key = toKey(path[index]), newValue = value; - if (key === "__proto__" || key === "constructor" || key === "prototype") { - return object; - } - if (index != lastIndex) { - var objValue = nested[key]; - newValue = customizer ? customizer(objValue, key, nested) : undefined2; - if (newValue === undefined2) { - newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}; - } - } - assignValue(nested, key, newValue); - nested = nested[key]; - } - return object; - } - var baseSetData = !metaMap ? identity : function(func, data) { - metaMap.set(func, data); - return func; - }; - var baseSetToString = !defineProperty ? identity : function(func, string) { - return defineProperty(func, "toString", { - "configurable": true, - "enumerable": false, - "value": constant(string), - "writable": true - }); - }; - function baseShuffle(collection) { - return shuffleSelf(values(collection)); - } - function baseSlice(array, start2, end2) { - var index = -1, length = array.length; - if (start2 < 0) { - start2 = -start2 > length ? 0 : length + start2; - } - end2 = end2 > length ? length : end2; - if (end2 < 0) { - end2 += length; - } - length = start2 > end2 ? 0 : end2 - start2 >>> 0; - start2 >>>= 0; - var result2 = Array2(length); - while (++index < length) { - result2[index] = array[index + start2]; - } - return result2; - } - function baseSome(collection, predicate) { - var result2; - baseEach(collection, function(value, index, collection2) { - result2 = predicate(value, index, collection2); - return !result2; - }); - return !!result2; - } - function baseSortedIndex(array, value, retHighest) { - var low = 0, high = array == null ? low : array.length; - if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) { - while (low < high) { - var mid = low + high >>> 1, computed = array[mid]; - if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) { - low = mid + 1; - } else { - high = mid; - } - } - return high; - } - return baseSortedIndexBy(array, value, identity, retHighest); - } - function baseSortedIndexBy(array, value, iteratee2, retHighest) { - var low = 0, high = array == null ? 0 : array.length; - if (high === 0) { - return 0; - } - value = iteratee2(value); - var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol(value), valIsUndefined = value === undefined2; - while (low < high) { - var mid = nativeFloor((low + high) / 2), computed = iteratee2(array[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol(computed); - if (valIsNaN) { - var setLow = retHighest || othIsReflexive; - } else if (valIsUndefined) { - setLow = othIsReflexive && (retHighest || othIsDefined); - } else if (valIsNull) { - setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); - } else if (valIsSymbol) { - setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); - } else if (othIsNull || othIsSymbol) { - setLow = false; - } else { - setLow = retHighest ? computed <= value : computed < value; - } - if (setLow) { - low = mid + 1; - } else { - high = mid; - } - } - return nativeMin(high, MAX_ARRAY_INDEX); - } - function baseSortedUniq(array, iteratee2) { - var index = -1, length = array.length, resIndex = 0, result2 = []; - while (++index < length) { - var value = array[index], computed = iteratee2 ? iteratee2(value) : value; - if (!index || !eq(computed, seen)) { - var seen = computed; - result2[resIndex++] = value === 0 ? 0 : value; - } - } - return result2; - } - function baseToNumber(value) { - if (typeof value == "number") { - return value; - } - if (isSymbol(value)) { - return NAN; - } - return +value; - } - function baseToString(value) { - if (typeof value == "string") { - return value; - } - if (isArray(value)) { - return arrayMap(value, baseToString) + ""; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ""; - } - var result2 = value + ""; - return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; - } - function baseUniq(array, iteratee2, comparator) { - var index = -1, includes2 = arrayIncludes, length = array.length, isCommon = true, result2 = [], seen = result2; - if (comparator) { - isCommon = false; - includes2 = arrayIncludesWith; - } else if (length >= LARGE_ARRAY_SIZE) { - var set2 = iteratee2 ? null : createSet(array); - if (set2) { - return setToArray(set2); - } - isCommon = false; - includes2 = cacheHas; - seen = new SetCache(); - } else { - seen = iteratee2 ? [] : result2; - } - outer: - while (++index < length) { - var value = array[index], computed = iteratee2 ? iteratee2(value) : value; - value = comparator || value !== 0 ? value : 0; - if (isCommon && computed === computed) { - var seenIndex = seen.length; - while (seenIndex--) { - if (seen[seenIndex] === computed) { - continue outer; - } - } - if (iteratee2) { - seen.push(computed); - } - result2.push(value); - } else if (!includes2(seen, computed, comparator)) { - if (seen !== result2) { - seen.push(computed); - } - result2.push(value); - } - } - return result2; - } - function baseUnset(object, path) { - path = castPath(path, object); - object = parent(object, path); - return object == null || delete object[toKey(last(path))]; - } - function baseUpdate(object, path, updater, customizer) { - return baseSet(object, path, updater(baseGet(object, path)), customizer); - } - function baseWhile(array, predicate, isDrop, fromRight) { - var length = array.length, index = fromRight ? length : -1; - while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) { - } - return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index); - } - function baseWrapperValue(value, actions) { - var result2 = value; - if (result2 instanceof LazyWrapper) { - result2 = result2.value(); - } - return arrayReduce(actions, function(result3, action) { - return action.func.apply(action.thisArg, arrayPush([result3], action.args)); - }, result2); - } - function baseXor(arrays, iteratee2, comparator) { - var length = arrays.length; - if (length < 2) { - return length ? baseUniq(arrays[0]) : []; - } - var index = -1, result2 = Array2(length); - while (++index < length) { - var array = arrays[index], othIndex = -1; - while (++othIndex < length) { - if (othIndex != index) { - result2[index] = baseDifference(result2[index] || array, arrays[othIndex], iteratee2, comparator); - } - } - } - return baseUniq(baseFlatten(result2, 1), iteratee2, comparator); - } - function baseZipObject(props, values2, assignFunc) { - var index = -1, length = props.length, valsLength = values2.length, result2 = {}; - while (++index < length) { - var value = index < valsLength ? values2[index] : undefined2; - assignFunc(result2, props[index], value); - } - return result2; - } - function castArrayLikeObject(value) { - return isArrayLikeObject(value) ? value : []; - } - function castFunction(value) { - return typeof value == "function" ? value : identity; - } - function castPath(value, object) { - if (isArray(value)) { - return value; - } - return isKey(value, object) ? [value] : stringToPath(toString(value)); - } - var castRest = baseRest; - function castSlice(array, start2, end2) { - var length = array.length; - end2 = end2 === undefined2 ? length : end2; - return !start2 && end2 >= length ? array : baseSlice(array, start2, end2); - } - var clearTimeout2 = ctxClearTimeout || function(id) { - return root.clearTimeout(id); - }; - function cloneBuffer(buffer, isDeep) { - if (isDeep) { - return buffer.slice(); - } - var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); - buffer.copy(result2); - return result2; - } - function cloneArrayBuffer(arrayBuffer) { - var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength); - new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer)); - return result2; - } - function cloneDataView(dataView, isDeep) { - var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; - return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); - } - function cloneRegExp(regexp) { - var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp)); - result2.lastIndex = regexp.lastIndex; - return result2; - } - function cloneSymbol(symbol) { - return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {}; - } - function cloneTypedArray(typedArray, isDeep) { - var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; - return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); - } - function compareAscending(value, other) { - if (value !== other) { - var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value); - var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other); - if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) { - return 1; - } - if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) { - return -1; - } - } - return 0; - } - function compareMultiple(object, other, orders) { - var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length; - while (++index < length) { - var result2 = compareAscending(objCriteria[index], othCriteria[index]); - if (result2) { - if (index >= ordersLength) { - return result2; - } - var order2 = orders[index]; - return result2 * (order2 == "desc" ? -1 : 1); - } - } - return object.index - other.index; - } - function composeArgs(args, partials, holders, isCurried) { - var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried; - while (++leftIndex < leftLength) { - result2[leftIndex] = partials[leftIndex]; - } - while (++argsIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result2[holders[argsIndex]] = args[argsIndex]; - } - } - while (rangeLength--) { - result2[leftIndex++] = args[argsIndex++]; - } - return result2; - } - function composeArgsRight(args, partials, holders, isCurried) { - var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried; - while (++argsIndex < rangeLength) { - result2[argsIndex] = args[argsIndex]; - } - var offset2 = argsIndex; - while (++rightIndex < rightLength) { - result2[offset2 + rightIndex] = partials[rightIndex]; - } - while (++holdersIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result2[offset2 + holders[holdersIndex]] = args[argsIndex++]; - } - } - return result2; - } - function copyArray(source3, array) { - var index = -1, length = source3.length; - array || (array = Array2(length)); - while (++index < length) { - array[index] = source3[index]; - } - return array; - } - function copyObject(source3, props, object, customizer) { - var isNew = !object; - object || (object = {}); - var index = -1, length = props.length; - while (++index < length) { - var key = props[index]; - var newValue = customizer ? customizer(object[key], source3[key], key, object, source3) : undefined2; - if (newValue === undefined2) { - newValue = source3[key]; - } - if (isNew) { - baseAssignValue(object, key, newValue); - } else { - assignValue(object, key, newValue); - } - } - return object; - } - function copySymbols(source3, object) { - return copyObject(source3, getSymbols(source3), object); - } - function copySymbolsIn(source3, object) { - return copyObject(source3, getSymbolsIn(source3), object); - } - function createAggregator(setter, initializer) { - return function(collection, iteratee2) { - var func = isArray(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {}; - return func(collection, setter, getIteratee(iteratee2, 2), accumulator); - }; - } - function createAssigner(assigner) { - return baseRest(function(object, sources) { - var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2; - customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2; - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - customizer = length < 3 ? undefined2 : customizer; - length = 1; - } - object = Object2(object); - while (++index < length) { - var source3 = sources[index]; - if (source3) { - assigner(object, source3, index, customizer); - } - } - return object; - }); - } - function createBaseEach(eachFunc, fromRight) { - return function(collection, iteratee2) { - if (collection == null) { - return collection; - } - if (!isArrayLike(collection)) { - return eachFunc(collection, iteratee2); - } - var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection); - while (fromRight ? index-- : ++index < length) { - if (iteratee2(iterable[index], index, iterable) === false) { - break; - } - } - return collection; - }; - } - function createBaseFor(fromRight) { - return function(object, iteratee2, keysFunc) { - var index = -1, iterable = Object2(object), props = keysFunc(object), length = props.length; - while (length--) { - var key = props[fromRight ? length : ++index]; - if (iteratee2(iterable[key], key, iterable) === false) { - break; - } - } - return object; - }; - } - function createBind(func, bitmask, thisArg) { - var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); - function wrapper() { - var fn2 = this && this !== root && this instanceof wrapper ? Ctor : func; - return fn2.apply(isBind ? thisArg : this, arguments); - } - return wrapper; - } - function createCaseFirst(methodName) { - return function(string) { - string = toString(string); - var strSymbols = hasUnicode(string) ? stringToArray2(string) : undefined2; - var chr = strSymbols ? strSymbols[0] : string.charAt(0); - var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1); - return chr[methodName]() + trailing; - }; - } - function createCompounder(callback) { - return function(string) { - return arrayReduce(words(deburr(string).replace(reApos, "")), callback, ""); - }; - } - function createCtor(Ctor) { - return function() { - var args = arguments; - switch (args.length) { - case 0: - return new Ctor(); - case 1: - return new Ctor(args[0]); - case 2: - return new Ctor(args[0], args[1]); - case 3: - return new Ctor(args[0], args[1], args[2]); - case 4: - return new Ctor(args[0], args[1], args[2], args[3]); - case 5: - return new Ctor(args[0], args[1], args[2], args[3], args[4]); - case 6: - return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); - case 7: - return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); - } - var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args); - return isObject(result2) ? result2 : thisBinding; - }; - } - function createCurry(func, bitmask, arity) { - var Ctor = createCtor(func); - function wrapper() { - var length = arguments.length, args = Array2(length), index = length, placeholder = getHolder(wrapper); - while (index--) { - args[index] = arguments[index]; - } - var holders = length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder ? [] : replaceHolders(args, placeholder); - length -= holders.length; - if (length < arity) { - return createRecurry( - func, - bitmask, - createHybrid, - wrapper.placeholder, - undefined2, - args, - holders, - undefined2, - undefined2, - arity - length - ); - } - var fn2 = this && this !== root && this instanceof wrapper ? Ctor : func; - return apply2(fn2, this, args); - } - return wrapper; - } - function createFind(findIndexFunc) { - return function(collection, predicate, fromIndex) { - var iterable = Object2(collection); - if (!isArrayLike(collection)) { - var iteratee2 = getIteratee(predicate, 3); - collection = keys2(collection); - predicate = function(key) { - return iteratee2(iterable[key], key, iterable); - }; - } - var index = findIndexFunc(collection, predicate, fromIndex); - return index > -1 ? iterable[iteratee2 ? collection[index] : index] : undefined2; - }; - } - function createFlow(fromRight) { - return flatRest(function(funcs) { - var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru; - if (fromRight) { - funcs.reverse(); - } - while (index--) { - var func = funcs[index]; - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - if (prereq && !wrapper && getFuncName(func) == "wrapper") { - var wrapper = new LodashWrapper([], true); - } - } - index = wrapper ? index : length; - while (++index < length) { - func = funcs[index]; - var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2; - if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) { - wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); - } else { - wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func); - } - } - return function() { - var args = arguments, value = args[0]; - if (wrapper && args.length == 1 && isArray(value)) { - return wrapper.plant(value).value(); - } - var index2 = 0, result2 = length ? funcs[index2].apply(this, args) : value; - while (++index2 < length) { - result2 = funcs[index2].call(this, result2); - } - return result2; - }; - }); - } - function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) { - var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func); - function wrapper() { - var length = arguments.length, args = Array2(length), index = length; - while (index--) { - args[index] = arguments[index]; - } - if (isCurried) { - var placeholder = getHolder(wrapper), holdersCount = countHolders(args, placeholder); - } - if (partials) { - args = composeArgs(args, partials, holders, isCurried); - } - if (partialsRight) { - args = composeArgsRight(args, partialsRight, holdersRight, isCurried); - } - length -= holdersCount; - if (isCurried && length < arity) { - var newHolders = replaceHolders(args, placeholder); - return createRecurry( - func, - bitmask, - createHybrid, - wrapper.placeholder, - thisArg, - args, - newHolders, - argPos, - ary2, - arity - length - ); - } - var thisBinding = isBind ? thisArg : this, fn2 = isBindKey ? thisBinding[func] : func; - length = args.length; - if (argPos) { - args = reorder(args, argPos); - } else if (isFlip && length > 1) { - args.reverse(); - } - if (isAry && ary2 < length) { - args.length = ary2; - } - if (this && this !== root && this instanceof wrapper) { - fn2 = Ctor || createCtor(fn2); - } - return fn2.apply(thisBinding, args); - } - return wrapper; - } - function createInverter(setter, toIteratee) { - return function(object, iteratee2) { - return baseInverter(object, setter, toIteratee(iteratee2), {}); - }; - } - function createMathOperation(operator2, defaultValue) { - return function(value, other) { - var result2; - if (value === undefined2 && other === undefined2) { - return defaultValue; - } - if (value !== undefined2) { - result2 = value; - } - if (other !== undefined2) { - if (result2 === undefined2) { - return other; - } - if (typeof value == "string" || typeof other == "string") { - value = baseToString(value); - other = baseToString(other); - } else { - value = baseToNumber(value); - other = baseToNumber(other); - } - result2 = operator2(value, other); - } - return result2; - }; - } - function createOver(arrayFunc) { - return flatRest(function(iteratees) { - iteratees = arrayMap(iteratees, baseUnary(getIteratee())); - return baseRest(function(args) { - var thisArg = this; - return arrayFunc(iteratees, function(iteratee2) { - return apply2(iteratee2, thisArg, args); - }); - }); - }); - } - function createPadding(length, chars) { - chars = chars === undefined2 ? " " : baseToString(chars); - var charsLength = chars.length; - if (charsLength < 2) { - return charsLength ? baseRepeat(chars, length) : chars; - } - var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars))); - return hasUnicode(chars) ? castSlice(stringToArray2(result2), 0, length).join("") : result2.slice(0, length); - } - function createPartial(func, bitmask, thisArg, partials) { - var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func); - function wrapper() { - var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn2 = this && this !== root && this instanceof wrapper ? Ctor : func; - while (++leftIndex < leftLength) { - args[leftIndex] = partials[leftIndex]; - } - while (argsLength--) { - args[leftIndex++] = arguments[++argsIndex]; - } - return apply2(fn2, isBind ? thisArg : this, args); - } - return wrapper; - } - function createRange(fromRight) { - return function(start2, end2, step) { - if (step && typeof step != "number" && isIterateeCall(start2, end2, step)) { - end2 = step = undefined2; - } - start2 = toFinite(start2); - if (end2 === undefined2) { - end2 = start2; - start2 = 0; - } else { - end2 = toFinite(end2); - } - step = step === undefined2 ? start2 < end2 ? 1 : -1 : toFinite(step); - return baseRange(start2, end2, step, fromRight); - }; - } - function createRelationalOperation(operator2) { - return function(value, other) { - if (!(typeof value == "string" && typeof other == "string")) { - value = toNumber(value); - other = toNumber(other); - } - return operator2(value, other); - }; - } - function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary2, arity) { - var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials; - bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG; - bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); - if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { - bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); - } - var newData = [ - func, - bitmask, - thisArg, - newPartials, - newHolders, - newPartialsRight, - newHoldersRight, - argPos, - ary2, - arity - ]; - var result2 = wrapFunc.apply(undefined2, newData); - if (isLaziable(func)) { - setData(result2, newData); - } - result2.placeholder = placeholder; - return setWrapToString(result2, func, bitmask); - } - function createRound(methodName) { - var func = Math2[methodName]; - return function(number, precision) { - number = toNumber(number); - precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); - if (precision && nativeIsFinite(number)) { - var pair = (toString(number) + "e").split("e"), value = func(pair[0] + "e" + (+pair[1] + precision)); - pair = (toString(value) + "e").split("e"); - return +(pair[0] + "e" + (+pair[1] - precision)); - } - return func(number); - }; - } - var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY) ? noop2 : function(values2) { - return new Set2(values2); - }; - function createToPairs(keysFunc) { - return function(object) { - var tag = getTag(object); - if (tag == mapTag) { - return mapToArray(object); - } - if (tag == setTag) { - return setToPairs(object); - } - return baseToPairs(object, keysFunc(object)); - }; - } - function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) { - var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; - if (!isBindKey && typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - var length = partials ? partials.length : 0; - if (!length) { - bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); - partials = holders = undefined2; - } - ary2 = ary2 === undefined2 ? ary2 : nativeMax(toInteger(ary2), 0); - arity = arity === undefined2 ? arity : toInteger(arity); - length -= holders ? holders.length : 0; - if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { - var partialsRight = partials, holdersRight = holders; - partials = holders = undefined2; - } - var data = isBindKey ? undefined2 : getData(func); - var newData = [ - func, - bitmask, - thisArg, - partials, - holders, - partialsRight, - holdersRight, - argPos, - ary2, - arity - ]; - if (data) { - mergeData(newData, data); - } - func = newData[0]; - bitmask = newData[1]; - thisArg = newData[2]; - partials = newData[3]; - holders = newData[4]; - arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0); - if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { - bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); - } - if (!bitmask || bitmask == WRAP_BIND_FLAG) { - var result2 = createBind(func, bitmask, thisArg); - } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { - result2 = createCurry(func, bitmask, arity); - } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { - result2 = createPartial(func, bitmask, thisArg, partials); - } else { - result2 = createHybrid.apply(undefined2, newData); - } - var setter = data ? baseSetData : setData; - return setWrapToString(setter(result2, newData), func, bitmask); - } - function customDefaultsAssignIn(objValue, srcValue, key, object) { - if (objValue === undefined2 || eq(objValue, objectProto[key]) && !hasOwnProperty2.call(object, key)) { - return srcValue; - } - return objValue; - } - function customDefaultsMerge(objValue, srcValue, key, object, source3, stack) { - if (isObject(objValue) && isObject(srcValue)) { - stack.set(srcValue, objValue); - baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack); - stack["delete"](srcValue); - } - return objValue; - } - function customOmitClone(value) { - return isPlainObject2(value) ? undefined2 : value; - } - function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length; - if (arrLength != othLength && !(isPartial && othLength > arrLength)) { - return false; - } - var arrStacked = stack.get(array); - var othStacked = stack.get(other); - if (arrStacked && othStacked) { - return arrStacked == other && othStacked == array; - } - var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2; - stack.set(array, other); - stack.set(other, array); - while (++index < arrLength) { - var arrValue = array[index], othValue = other[index]; - if (customizer) { - var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack); - } - if (compared !== undefined2) { - if (compared) { - continue; - } - result2 = false; - break; - } - if (seen) { - if (!arraySome(other, function(othValue2, othIndex) { - if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) { - return seen.push(othIndex); - } - })) { - result2 = false; - break; - } - } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { - result2 = false; - break; - } - } - stack["delete"](array); - stack["delete"](other); - return result2; - } - function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { - switch (tag) { - case dataViewTag: - if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) { - return false; - } - object = object.buffer; - other = other.buffer; - case arrayBufferTag: - if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) { - return false; - } - return true; - case boolTag: - case dateTag: - case numberTag: - return eq(+object, +other); - case errorTag: - return object.name == other.name && object.message == other.message; - case regexpTag: - case stringTag: - return object == other + ""; - case mapTag: - var convert = mapToArray; - case setTag: - var isPartial = bitmask & COMPARE_PARTIAL_FLAG; - convert || (convert = setToArray); - if (object.size != other.size && !isPartial) { - return false; - } - var stacked = stack.get(object); - if (stacked) { - return stacked == other; - } - bitmask |= COMPARE_UNORDERED_FLAG; - stack.set(object, other); - var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); - stack["delete"](object); - return result2; - case symbolTag: - if (symbolValueOf) { - return symbolValueOf.call(object) == symbolValueOf.call(other); - } - } - return false; - } - function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length; - if (objLength != othLength && !isPartial) { - return false; - } - var index = objLength; - while (index--) { - var key = objProps[index]; - if (!(isPartial ? key in other : hasOwnProperty2.call(other, key))) { - return false; - } - } - var objStacked = stack.get(object); - var othStacked = stack.get(other); - if (objStacked && othStacked) { - return objStacked == other && othStacked == object; - } - var result2 = true; - stack.set(object, other); - stack.set(other, object); - var skipCtor = isPartial; - while (++index < objLength) { - key = objProps[index]; - var objValue = object[key], othValue = other[key]; - if (customizer) { - var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack); - } - if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) { - result2 = false; - break; - } - skipCtor || (skipCtor = key == "constructor"); - } - if (result2 && !skipCtor) { - var objCtor = object.constructor, othCtor = other.constructor; - if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) { - result2 = false; - } - } - stack["delete"](object); - stack["delete"](other); - return result2; - } - function flatRest(func) { - return setToString(overRest(func, undefined2, flatten), func + ""); - } - function getAllKeys(object) { - return baseGetAllKeys(object, keys2, getSymbols); - } - function getAllKeysIn(object) { - return baseGetAllKeys(object, keysIn, getSymbolsIn); - } - var getData = !metaMap ? noop2 : function(func) { - return metaMap.get(func); - }; - function getFuncName(func) { - var result2 = func.name + "", array = realNames[result2], length = hasOwnProperty2.call(realNames, result2) ? array.length : 0; - while (length--) { - var data = array[length], otherFunc = data.func; - if (otherFunc == null || otherFunc == func) { - return data.name; - } - } - return result2; - } - function getHolder(func) { - var object = hasOwnProperty2.call(lodash, "placeholder") ? lodash : func; - return object.placeholder; - } - function getIteratee() { - var result2 = lodash.iteratee || iteratee; - result2 = result2 === iteratee ? baseIteratee : result2; - return arguments.length ? result2(arguments[0], arguments[1]) : result2; - } - function getMapData(map3, key) { - var data = map3.__data__; - return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; - } - function getMatchData(object) { - var result2 = keys2(object), length = result2.length; - while (length--) { - var key = result2[length], value = object[key]; - result2[length] = [key, value, isStrictComparable(value)]; - } - return result2; - } - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined2; - } - function getRawTag(value) { - var isOwn = hasOwnProperty2.call(value, symToStringTag), tag = value[symToStringTag]; - try { - value[symToStringTag] = undefined2; - var unmasked = true; - } catch (e) { - } - var result2 = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; - } - } - return result2; - } - var getSymbols = !nativeGetSymbols ? stubArray : function(object) { - if (object == null) { - return []; - } - object = Object2(object); - return arrayFilter(nativeGetSymbols(object), function(symbol) { - return propertyIsEnumerable.call(object, symbol); - }); - }; - var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { - var result2 = []; - while (object) { - arrayPush(result2, getSymbols(object)); - object = getPrototype(object); - } - return result2; - }; - var getTag = baseGetTag; - if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap2 && getTag(new WeakMap2()) != weakMapTag) { - getTag = function(value) { - var result2 = baseGetTag(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : ""; - if (ctorString) { - switch (ctorString) { - case dataViewCtorString: - return dataViewTag; - case mapCtorString: - return mapTag; - case promiseCtorString: - return promiseTag; - case setCtorString: - return setTag; - case weakMapCtorString: - return weakMapTag; - } - } - return result2; - }; - } - function getView(start2, end2, transforms) { - var index = -1, length = transforms.length; - while (++index < length) { - var data = transforms[index], size2 = data.size; - switch (data.type) { - case "drop": - start2 += size2; - break; - case "dropRight": - end2 -= size2; - break; - case "take": - end2 = nativeMin(end2, start2 + size2); - break; - case "takeRight": - start2 = nativeMax(start2, end2 - size2); - break; - } - } - return { "start": start2, "end": end2 }; - } - function getWrapDetails(source3) { - var match = source3.match(reWrapDetails); - return match ? match[1].split(reSplitDetails) : []; - } - function hasPath(object, path, hasFunc) { - path = castPath(path, object); - var index = -1, length = path.length, result2 = false; - while (++index < length) { - var key = toKey(path[index]); - if (!(result2 = object != null && hasFunc(object, key))) { - break; - } - object = object[key]; - } - if (result2 || ++index != length) { - return result2; - } - length = object == null ? 0 : object.length; - return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); - } - function initCloneArray(array) { - var length = array.length, result2 = new array.constructor(length); - if (length && typeof array[0] == "string" && hasOwnProperty2.call(array, "index")) { - result2.index = array.index; - result2.input = array.input; - } - return result2; - } - function initCloneObject(object) { - return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {}; - } - function initCloneByTag(object, tag, isDeep) { - var Ctor = object.constructor; - switch (tag) { - case arrayBufferTag: - return cloneArrayBuffer(object); - case boolTag: - case dateTag: - return new Ctor(+object); - case dataViewTag: - return cloneDataView(object, isDeep); - case float32Tag: - case float64Tag: - case int8Tag: - case int16Tag: - case int32Tag: - case uint8Tag: - case uint8ClampedTag: - case uint16Tag: - case uint32Tag: - return cloneTypedArray(object, isDeep); - case mapTag: - return new Ctor(); - case numberTag: - case stringTag: - return new Ctor(object); - case regexpTag: - return cloneRegExp(object); - case setTag: - return new Ctor(); - case symbolTag: - return cloneSymbol(object); - } - } - function insertWrapDetails(source3, details) { - var length = details.length; - if (!length) { - return source3; - } - var lastIndex = length - 1; - details[lastIndex] = (length > 1 ? "& " : "") + details[lastIndex]; - details = details.join(length > 2 ? ", " : " "); - return source3.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n"); - } - function isFlattenable(value) { - return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); - } - function isIndex(value, length) { - var type = typeof value; - length = length == null ? MAX_SAFE_INTEGER : length; - return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); - } - function isIterateeCall(value, index, object) { - if (!isObject(object)) { - return false; - } - var type = typeof index; - if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && index in object) { - return eq(object[index], value); - } - return false; - } - function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) { - return true; - } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object); - } - function isKeyable(value) { - var type = typeof value; - return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null; - } - function isLaziable(func) { - var funcName = getFuncName(func), other = lodash[funcName]; - if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) { - return false; - } - if (func === other) { - return true; - } - var data = getData(other); - return !!data && func === data[0]; - } - function isMasked(func) { - return !!maskSrcKey && maskSrcKey in func; - } - var isMaskable = coreJsData ? isFunction3 : stubFalse; - function isPrototype(value) { - var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto; - return value === proto; - } - function isStrictComparable(value) { - return value === value && !isObject(value); - } - function matchesStrictComparable(key, srcValue) { - return function(object) { - if (object == null) { - return false; - } - return object[key] === srcValue && (srcValue !== undefined2 || key in Object2(object)); - }; - } - function memoizeCapped(func) { - var result2 = memoize(func, function(key) { - if (cache2.size === MAX_MEMOIZE_SIZE) { - cache2.clear(); - } - return key; - }); - var cache2 = result2.cache; - return result2; - } - function mergeData(data, source3) { - var bitmask = data[1], srcBitmask = source3[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); - var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source3[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source3[7].length <= source3[8] && bitmask == WRAP_CURRY_FLAG; - if (!(isCommon || isCombo)) { - return data; - } - if (srcBitmask & WRAP_BIND_FLAG) { - data[2] = source3[2]; - newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; - } - var value = source3[3]; - if (value) { - var partials = data[3]; - data[3] = partials ? composeArgs(partials, value, source3[4]) : value; - data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source3[4]; - } - value = source3[5]; - if (value) { - partials = data[5]; - data[5] = partials ? composeArgsRight(partials, value, source3[6]) : value; - data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source3[6]; - } - value = source3[7]; - if (value) { - data[7] = value; - } - if (srcBitmask & WRAP_ARY_FLAG) { - data[8] = data[8] == null ? source3[8] : nativeMin(data[8], source3[8]); - } - if (data[9] == null) { - data[9] = source3[9]; - } - data[0] = source3[0]; - data[1] = newBitmask; - return data; - } - function nativeKeysIn(object) { - var result2 = []; - if (object != null) { - for (var key in Object2(object)) { - result2.push(key); - } - } - return result2; - } - function objectToString(value) { - return nativeObjectToString.call(value); - } - function overRest(func, start2, transform2) { - start2 = nativeMax(start2 === undefined2 ? func.length - 1 : start2, 0); - return function() { - var args = arguments, index = -1, length = nativeMax(args.length - start2, 0), array = Array2(length); - while (++index < length) { - array[index] = args[start2 + index]; - } - index = -1; - var otherArgs = Array2(start2 + 1); - while (++index < start2) { - otherArgs[index] = args[index]; - } - otherArgs[start2] = transform2(array); - return apply2(func, this, otherArgs); - }; - } - function parent(object, path) { - return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); - } - function reorder(array, indexes) { - var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array); - while (length--) { - var index = indexes[length]; - array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined2; - } - return array; - } - function safeGet(object, key) { - if (key === "constructor" && typeof object[key] === "function") { - return; - } - if (key == "__proto__") { - return; - } - return object[key]; - } - var setData = shortOut(baseSetData); - var setTimeout2 = ctxSetTimeout || function(func, wait) { - return root.setTimeout(func, wait); - }; - var setToString = shortOut(baseSetToString); - function setWrapToString(wrapper, reference2, bitmask) { - var source3 = reference2 + ""; - return setToString(wrapper, insertWrapDetails(source3, updateWrapDetails(getWrapDetails(source3), bitmask))); - } - function shortOut(func) { - var count = 0, lastCalled = 0; - return function() { - var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); - lastCalled = stamp; - if (remaining > 0) { - if (++count >= HOT_COUNT) { - return arguments[0]; - } - } else { - count = 0; - } - return func.apply(undefined2, arguments); - }; - } - function shuffleSelf(array, size2) { - var index = -1, length = array.length, lastIndex = length - 1; - size2 = size2 === undefined2 ? length : size2; - while (++index < size2) { - var rand = baseRandom(index, lastIndex), value = array[rand]; - array[rand] = array[index]; - array[index] = value; - } - array.length = size2; - return array; - } - var stringToPath = memoizeCapped(function(string) { - var result2 = []; - if (string.charCodeAt(0) === 46) { - result2.push(""); - } - string.replace(rePropName, function(match, number, quote, subString) { - result2.push(quote ? subString.replace(reEscapeChar, "$1") : number || match); - }); - return result2; - }); - function toKey(value) { - if (typeof value == "string" || isSymbol(value)) { - return value; - } - var result2 = value + ""; - return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2; - } - function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) { - } - try { - return func + ""; - } catch (e) { - } - } - return ""; - } - function updateWrapDetails(details, bitmask) { - arrayEach(wrapFlags, function(pair) { - var value = "_." + pair[0]; - if (bitmask & pair[1] && !arrayIncludes(details, value)) { - details.push(value); - } - }); - return details.sort(); - } - function wrapperClone(wrapper) { - if (wrapper instanceof LazyWrapper) { - return wrapper.clone(); - } - var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); - result2.__actions__ = copyArray(wrapper.__actions__); - result2.__index__ = wrapper.__index__; - result2.__values__ = wrapper.__values__; - return result2; - } - function chunk(array, size2, guard) { - if (guard ? isIterateeCall(array, size2, guard) : size2 === undefined2) { - size2 = 1; - } else { - size2 = nativeMax(toInteger(size2), 0); - } - var length = array == null ? 0 : array.length; - if (!length || size2 < 1) { - return []; - } - var index = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2)); - while (index < length) { - result2[resIndex++] = baseSlice(array, index, index += size2); - } - return result2; - } - function compact(array) { - var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result2 = []; - while (++index < length) { - var value = array[index]; - if (value) { - result2[resIndex++] = value; - } - } - return result2; - } - function concat3() { - var length = arguments.length; - if (!length) { - return []; - } - var args = Array2(length - 1), array = arguments[0], index = length; - while (index--) { - args[index - 1] = arguments[index]; - } - return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); - } - var difference = baseRest(function(array, values2) { - return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true)) : []; - }); - var differenceBy = baseRest(function(array, values2) { - var iteratee2 = last(values2); - if (isArrayLikeObject(iteratee2)) { - iteratee2 = undefined2; - } - return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : []; - }); - var differenceWith = baseRest(function(array, values2) { - var comparator = last(values2); - if (isArrayLikeObject(comparator)) { - comparator = undefined2; - } - return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : []; - }); - function drop(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = guard || n === undefined2 ? 1 : toInteger(n); - return baseSlice(array, n < 0 ? 0 : n, length); - } - function dropRight(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = guard || n === undefined2 ? 1 : toInteger(n); - n = length - n; - return baseSlice(array, 0, n < 0 ? 0 : n); - } - function dropRightWhile(array, predicate) { - return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : []; - } - function dropWhile(array, predicate) { - return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : []; - } - function fill(array, value, start2, end2) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - if (start2 && typeof start2 != "number" && isIterateeCall(array, value, start2)) { - start2 = 0; - end2 = length; - } - return baseFill(array, value, start2, end2); - } - function findIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); - } - return baseFindIndex(array, getIteratee(predicate, 3), index); - } - function findLastIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = length - 1; - if (fromIndex !== undefined2) { - index = toInteger(fromIndex); - index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); - } - return baseFindIndex(array, getIteratee(predicate, 3), index, true); - } - function flatten(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, 1) : []; - } - function flattenDeep(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, INFINITY) : []; - } - function flattenDepth(array, depth) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - depth = depth === undefined2 ? 1 : toInteger(depth); - return baseFlatten(array, depth); - } - function fromPairs(pairs) { - var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {}; - while (++index < length) { - var pair = pairs[index]; - result2[pair[0]] = pair[1]; - } - return result2; - } - function head(array) { - return array && array.length ? array[0] : undefined2; - } - function indexOf(array, value, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); - } - return baseIndexOf(array, value, index); - } - function initial(array) { - var length = array == null ? 0 : array.length; - return length ? baseSlice(array, 0, -1) : []; - } - var intersection = baseRest(function(arrays) { - var mapped = arrayMap(arrays, castArrayLikeObject); - return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : []; - }); - var intersectionBy = baseRest(function(arrays) { - var iteratee2 = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); - if (iteratee2 === last(mapped)) { - iteratee2 = undefined2; - } else { - mapped.pop(); - } - return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : []; - }); - var intersectionWith = baseRest(function(arrays) { - var comparator = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject); - comparator = typeof comparator == "function" ? comparator : undefined2; - if (comparator) { - mapped.pop(); - } - return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : []; - }); - function join2(array, separator) { - return array == null ? "" : nativeJoin.call(array, separator); - } - function last(array) { - var length = array == null ? 0 : array.length; - return length ? array[length - 1] : undefined2; - } - function lastIndexOf(array, value, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = length; - if (fromIndex !== undefined2) { - index = toInteger(fromIndex); - index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); - } - return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true); - } - function nth(array, n) { - return array && array.length ? baseNth(array, toInteger(n)) : undefined2; - } - var pull = baseRest(pullAll); - function pullAll(array, values2) { - return array && array.length && values2 && values2.length ? basePullAll(array, values2) : array; - } - function pullAllBy(array, values2, iteratee2) { - return array && array.length && values2 && values2.length ? basePullAll(array, values2, getIteratee(iteratee2, 2)) : array; - } - function pullAllWith(array, values2, comparator) { - return array && array.length && values2 && values2.length ? basePullAll(array, values2, undefined2, comparator) : array; - } - var pullAt = flatRest(function(array, indexes) { - var length = array == null ? 0 : array.length, result2 = baseAt(array, indexes); - basePullAt(array, arrayMap(indexes, function(index) { - return isIndex(index, length) ? +index : index; - }).sort(compareAscending)); - return result2; - }); - function remove(array, predicate) { - var result2 = []; - if (!(array && array.length)) { - return result2; - } - var index = -1, indexes = [], length = array.length; - predicate = getIteratee(predicate, 3); - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result2.push(value); - indexes.push(index); - } - } - basePullAt(array, indexes); - return result2; - } - function reverse(array) { - return array == null ? array : nativeReverse.call(array); - } - function slice2(array, start2, end2) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - if (end2 && typeof end2 != "number" && isIterateeCall(array, start2, end2)) { - start2 = 0; - end2 = length; - } else { - start2 = start2 == null ? 0 : toInteger(start2); - end2 = end2 === undefined2 ? length : toInteger(end2); - } - return baseSlice(array, start2, end2); - } - function sortedIndex(array, value) { - return baseSortedIndex(array, value); - } - function sortedIndexBy(array, value, iteratee2) { - return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2)); - } - function sortedIndexOf(array, value) { - var length = array == null ? 0 : array.length; - if (length) { - var index = baseSortedIndex(array, value); - if (index < length && eq(array[index], value)) { - return index; - } - } - return -1; - } - function sortedLastIndex(array, value) { - return baseSortedIndex(array, value, true); - } - function sortedLastIndexBy(array, value, iteratee2) { - return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2), true); - } - function sortedLastIndexOf(array, value) { - var length = array == null ? 0 : array.length; - if (length) { - var index = baseSortedIndex(array, value, true) - 1; - if (eq(array[index], value)) { - return index; - } - } - return -1; - } - function sortedUniq(array) { - return array && array.length ? baseSortedUniq(array) : []; - } - function sortedUniqBy(array, iteratee2) { - return array && array.length ? baseSortedUniq(array, getIteratee(iteratee2, 2)) : []; - } - function tail(array) { - var length = array == null ? 0 : array.length; - return length ? baseSlice(array, 1, length) : []; - } - function take(array, n, guard) { - if (!(array && array.length)) { - return []; - } - n = guard || n === undefined2 ? 1 : toInteger(n); - return baseSlice(array, 0, n < 0 ? 0 : n); - } - function takeRight(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = guard || n === undefined2 ? 1 : toInteger(n); - n = length - n; - return baseSlice(array, n < 0 ? 0 : n, length); - } - function takeRightWhile(array, predicate) { - return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : []; - } - function takeWhile(array, predicate) { - return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : []; - } - var union = baseRest(function(arrays) { - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); - }); - var unionBy = baseRest(function(arrays) { - var iteratee2 = last(arrays); - if (isArrayLikeObject(iteratee2)) { - iteratee2 = undefined2; - } - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)); - }); - var unionWith = baseRest(function(arrays) { - var comparator = last(arrays); - comparator = typeof comparator == "function" ? comparator : undefined2; - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator); - }); - function uniq(array) { - return array && array.length ? baseUniq(array) : []; - } - function uniqBy(array, iteratee2) { - return array && array.length ? baseUniq(array, getIteratee(iteratee2, 2)) : []; - } - function uniqWith(array, comparator) { - comparator = typeof comparator == "function" ? comparator : undefined2; - return array && array.length ? baseUniq(array, undefined2, comparator) : []; - } - function unzip(array) { - if (!(array && array.length)) { - return []; - } - var length = 0; - array = arrayFilter(array, function(group) { - if (isArrayLikeObject(group)) { - length = nativeMax(group.length, length); - return true; - } - }); - return baseTimes(length, function(index) { - return arrayMap(array, baseProperty(index)); - }); - } - function unzipWith(array, iteratee2) { - if (!(array && array.length)) { - return []; - } - var result2 = unzip(array); - if (iteratee2 == null) { - return result2; - } - return arrayMap(result2, function(group) { - return apply2(iteratee2, undefined2, group); - }); - } - var without = baseRest(function(array, values2) { - return isArrayLikeObject(array) ? baseDifference(array, values2) : []; - }); - var xor = baseRest(function(arrays) { - return baseXor(arrayFilter(arrays, isArrayLikeObject)); - }); - var xorBy = baseRest(function(arrays) { - var iteratee2 = last(arrays); - if (isArrayLikeObject(iteratee2)) { - iteratee2 = undefined2; - } - return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2)); - }); - var xorWith = baseRest(function(arrays) { - var comparator = last(arrays); - comparator = typeof comparator == "function" ? comparator : undefined2; - return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator); - }); - var zip = baseRest(unzip); - function zipObject(props, values2) { - return baseZipObject(props || [], values2 || [], assignValue); - } - function zipObjectDeep(props, values2) { - return baseZipObject(props || [], values2 || [], baseSet); - } - var zipWith = baseRest(function(arrays) { - var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2; - iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2; - return unzipWith(arrays, iteratee2); - }); - function chain(value) { - var result2 = lodash(value); - result2.__chain__ = true; - return result2; - } - function tap(value, interceptor) { - interceptor(value); - return value; - } - function thru(value, interceptor) { - return interceptor(value); - } - var wrapperAt = flatRest(function(paths) { - var length = paths.length, start2 = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) { - return baseAt(object, paths); - }; - if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start2)) { - return this.thru(interceptor); - } - value = value.slice(start2, +start2 + (length ? 1 : 0)); - value.__actions__.push({ - "func": thru, - "args": [interceptor], - "thisArg": undefined2 - }); - return new LodashWrapper(value, this.__chain__).thru(function(array) { - if (length && !array.length) { - array.push(undefined2); - } - return array; - }); - }); - function wrapperChain() { - return chain(this); - } - function wrapperCommit() { - return new LodashWrapper(this.value(), this.__chain__); - } - function wrapperNext() { - if (this.__values__ === undefined2) { - this.__values__ = toArray(this.value()); - } - var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++]; - return { "done": done, "value": value }; - } - function wrapperToIterator() { - return this; - } - function wrapperPlant(value) { - var result2, parent2 = this; - while (parent2 instanceof baseLodash) { - var clone2 = wrapperClone(parent2); - clone2.__index__ = 0; - clone2.__values__ = undefined2; - if (result2) { - previous.__wrapped__ = clone2; - } else { - result2 = clone2; - } - var previous = clone2; - parent2 = parent2.__wrapped__; - } - previous.__wrapped__ = value; - return result2; - } - function wrapperReverse() { - var value = this.__wrapped__; - if (value instanceof LazyWrapper) { - var wrapped = value; - if (this.__actions__.length) { - wrapped = new LazyWrapper(this); - } - wrapped = wrapped.reverse(); - wrapped.__actions__.push({ - "func": thru, - "args": [reverse], - "thisArg": undefined2 - }); - return new LodashWrapper(wrapped, this.__chain__); - } - return this.thru(reverse); - } - function wrapperValue() { - return baseWrapperValue(this.__wrapped__, this.__actions__); - } - var countBy = createAggregator(function(result2, value, key) { - if (hasOwnProperty2.call(result2, key)) { - ++result2[key]; - } else { - baseAssignValue(result2, key, 1); - } - }); - function every(collection, predicate, guard) { - var func = isArray(collection) ? arrayEvery : baseEvery; - if (guard && isIterateeCall(collection, predicate, guard)) { - predicate = undefined2; - } - return func(collection, getIteratee(predicate, 3)); - } - function filter(collection, predicate) { - var func = isArray(collection) ? arrayFilter : baseFilter; - return func(collection, getIteratee(predicate, 3)); - } - var find2 = createFind(findIndex); - var findLast = createFind(findLastIndex); - function flatMap(collection, iteratee2) { - return baseFlatten(map2(collection, iteratee2), 1); - } - function flatMapDeep(collection, iteratee2) { - return baseFlatten(map2(collection, iteratee2), INFINITY); - } - function flatMapDepth(collection, iteratee2, depth) { - depth = depth === undefined2 ? 1 : toInteger(depth); - return baseFlatten(map2(collection, iteratee2), depth); - } - function forEach3(collection, iteratee2) { - var func = isArray(collection) ? arrayEach : baseEach; - return func(collection, getIteratee(iteratee2, 3)); - } - function forEachRight(collection, iteratee2) { - var func = isArray(collection) ? arrayEachRight : baseEachRight; - return func(collection, getIteratee(iteratee2, 3)); - } - var groupBy = createAggregator(function(result2, value, key) { - if (hasOwnProperty2.call(result2, key)) { - result2[key].push(value); - } else { - baseAssignValue(result2, key, [value]); - } - }); - function includes(collection, value, fromIndex, guard) { - collection = isArrayLike(collection) ? collection : values(collection); - fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; - var length = collection.length; - if (fromIndex < 0) { - fromIndex = nativeMax(length + fromIndex, 0); - } - return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1; - } - var invokeMap = baseRest(function(collection, path, args) { - var index = -1, isFunc = typeof path == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : []; - baseEach(collection, function(value) { - result2[++index] = isFunc ? apply2(path, value, args) : baseInvoke(value, path, args); - }); - return result2; - }); - var keyBy = createAggregator(function(result2, value, key) { - baseAssignValue(result2, key, value); - }); - function map2(collection, iteratee2) { - var func = isArray(collection) ? arrayMap : baseMap; - return func(collection, getIteratee(iteratee2, 3)); - } - function orderBy(collection, iteratees, orders, guard) { - if (collection == null) { - return []; - } - if (!isArray(iteratees)) { - iteratees = iteratees == null ? [] : [iteratees]; - } - orders = guard ? undefined2 : orders; - if (!isArray(orders)) { - orders = orders == null ? [] : [orders]; - } - return baseOrderBy(collection, iteratees, orders); - } - var partition = createAggregator(function(result2, value, key) { - result2[key ? 0 : 1].push(value); - }, function() { - return [[], []]; - }); - function reduce(collection, iteratee2, accumulator) { - var func = isArray(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3; - return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach); - } - function reduceRight(collection, iteratee2, accumulator) { - var func = isArray(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3; - return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight); - } - function reject(collection, predicate) { - var func = isArray(collection) ? arrayFilter : baseFilter; - return func(collection, negate(getIteratee(predicate, 3))); - } - function sample(collection) { - var func = isArray(collection) ? arraySample : baseSample; - return func(collection); - } - function sampleSize(collection, n, guard) { - if (guard ? isIterateeCall(collection, n, guard) : n === undefined2) { - n = 1; - } else { - n = toInteger(n); - } - var func = isArray(collection) ? arraySampleSize : baseSampleSize; - return func(collection, n); - } - function shuffle(collection) { - var func = isArray(collection) ? arrayShuffle : baseShuffle; - return func(collection); - } - function size(collection) { - if (collection == null) { - return 0; - } - if (isArrayLike(collection)) { - return isString(collection) ? stringSize(collection) : collection.length; - } - var tag = getTag(collection); - if (tag == mapTag || tag == setTag) { - return collection.size; - } - return baseKeys(collection).length; - } - function some(collection, predicate, guard) { - var func = isArray(collection) ? arraySome : baseSome; - if (guard && isIterateeCall(collection, predicate, guard)) { - predicate = undefined2; - } - return func(collection, getIteratee(predicate, 3)); - } - var sortBy = baseRest(function(collection, iteratees) { - if (collection == null) { - return []; - } - var length = iteratees.length; - if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { - iteratees = []; - } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { - iteratees = [iteratees[0]]; - } - return baseOrderBy(collection, baseFlatten(iteratees, 1), []); - }); - var now = ctxNow || function() { - return root.Date.now(); - }; - function after(n, func) { - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - n = toInteger(n); - return function() { - if (--n < 1) { - return func.apply(this, arguments); - } - }; - } - function ary(func, n, guard) { - n = guard ? undefined2 : n; - n = func && n == null ? func.length : n; - return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n); - } - function before(n, func) { - var result2; - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - n = toInteger(n); - return function() { - if (--n > 0) { - result2 = func.apply(this, arguments); - } - if (n <= 1) { - func = undefined2; - } - return result2; - }; - } - var bind2 = baseRest(function(func, thisArg, partials) { - var bitmask = WRAP_BIND_FLAG; - if (partials.length) { - var holders = replaceHolders(partials, getHolder(bind2)); - bitmask |= WRAP_PARTIAL_FLAG; - } - return createWrap(func, bitmask, thisArg, partials, holders); - }); - var bindKey = baseRest(function(object, key, partials) { - var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; - if (partials.length) { - var holders = replaceHolders(partials, getHolder(bindKey)); - bitmask |= WRAP_PARTIAL_FLAG; - } - return createWrap(key, bitmask, object, partials, holders); - }); - function curry(func, arity, guard) { - arity = guard ? undefined2 : arity; - var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); - result2.placeholder = curry.placeholder; - return result2; - } - function curryRight(func, arity, guard) { - arity = guard ? undefined2 : arity; - var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity); - result2.placeholder = curryRight.placeholder; - return result2; - } - function debounce3(func, wait, options) { - var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true; - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject(options)) { - leading = !!options.leading; - maxing = "maxWait" in options; - maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; - trailing = "trailing" in options ? !!options.trailing : trailing; - } - function invokeFunc(time) { - var args = lastArgs, thisArg = lastThis; - lastArgs = lastThis = undefined2; - lastInvokeTime = time; - result2 = func.apply(thisArg, args); - return result2; - } - function leadingEdge(time) { - lastInvokeTime = time; - timerId = setTimeout2(timerExpired, wait); - return leading ? invokeFunc(time) : result2; - } - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall; - return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; - } - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime; - return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; - } - function timerExpired() { - var time = now(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - timerId = setTimeout2(timerExpired, remainingWait(time)); - } - function trailingEdge(time) { - timerId = undefined2; - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined2; - return result2; - } - function cancel() { - if (timerId !== undefined2) { - clearTimeout2(timerId); - } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined2; - } - function flush() { - return timerId === undefined2 ? result2 : trailingEdge(now()); - } - function debounced() { - var time = now(), isInvoking = shouldInvoke(time); - lastArgs = arguments; - lastThis = this; - lastCallTime = time; - if (isInvoking) { - if (timerId === undefined2) { - return leadingEdge(lastCallTime); - } - if (maxing) { - clearTimeout2(timerId); - timerId = setTimeout2(timerExpired, wait); - return invokeFunc(lastCallTime); - } - } - if (timerId === undefined2) { - timerId = setTimeout2(timerExpired, wait); - } - return result2; - } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; - } - var defer = baseRest(function(func, args) { - return baseDelay(func, 1, args); - }); - var delay = baseRest(function(func, wait, args) { - return baseDelay(func, toNumber(wait) || 0, args); - }); - function flip2(func) { - return createWrap(func, WRAP_FLIP_FLAG); - } - function memoize(func, resolver) { - if (typeof func != "function" || resolver != null && typeof resolver != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - var memoized = function() { - var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache2 = memoized.cache; - if (cache2.has(key)) { - return cache2.get(key); - } - var result2 = func.apply(this, args); - memoized.cache = cache2.set(key, result2) || cache2; - return result2; - }; - memoized.cache = new (memoize.Cache || MapCache)(); - return memoized; - } - memoize.Cache = MapCache; - function negate(predicate) { - if (typeof predicate != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - return function() { - var args = arguments; - switch (args.length) { - case 0: - return !predicate.call(this); - case 1: - return !predicate.call(this, args[0]); - case 2: - return !predicate.call(this, args[0], args[1]); - case 3: - return !predicate.call(this, args[0], args[1], args[2]); - } - return !predicate.apply(this, args); - }; - } - function once(func) { - return before(2, func); - } - var overArgs = castRest(function(func, transforms) { - transforms = transforms.length == 1 && isArray(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); - var funcsLength = transforms.length; - return baseRest(function(args) { - var index = -1, length = nativeMin(args.length, funcsLength); - while (++index < length) { - args[index] = transforms[index].call(this, args[index]); - } - return apply2(func, this, args); - }); - }); - var partial = baseRest(function(func, partials) { - var holders = replaceHolders(partials, getHolder(partial)); - return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders); - }); - var partialRight = baseRest(function(func, partials) { - var holders = replaceHolders(partials, getHolder(partialRight)); - return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders); - }); - var rearg = flatRest(function(func, indexes) { - return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes); - }); - function rest(func, start2) { - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - start2 = start2 === undefined2 ? start2 : toInteger(start2); - return baseRest(func, start2); - } - function spread(func, start2) { - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - start2 = start2 == null ? 0 : nativeMax(toInteger(start2), 0); - return baseRest(function(args) { - var array = args[start2], otherArgs = castSlice(args, 0, start2); - if (array) { - arrayPush(otherArgs, array); - } - return apply2(func, this, otherArgs); - }); - } - function throttle(func, wait, options) { - var leading = true, trailing = true; - if (typeof func != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - if (isObject(options)) { - leading = "leading" in options ? !!options.leading : leading; - trailing = "trailing" in options ? !!options.trailing : trailing; - } - return debounce3(func, wait, { - "leading": leading, - "maxWait": wait, - "trailing": trailing - }); - } - function unary(func) { - return ary(func, 1); - } - function wrap2(value, wrapper) { - return partial(castFunction(wrapper), value); - } - function castArray() { - if (!arguments.length) { - return []; - } - var value = arguments[0]; - return isArray(value) ? value : [value]; - } - function clone(value) { - return baseClone(value, CLONE_SYMBOLS_FLAG); - } - function cloneWith(value, customizer) { - customizer = typeof customizer == "function" ? customizer : undefined2; - return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); - } - function cloneDeep(value) { - return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); - } - function cloneDeepWith(value, customizer) { - customizer = typeof customizer == "function" ? customizer : undefined2; - return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); - } - function conformsTo(object, source3) { - return source3 == null || baseConformsTo(object, source3, keys2(source3)); - } - function eq(value, other) { - return value === other || value !== value && other !== other; - } - var gt = createRelationalOperation(baseGt); - var gte = createRelationalOperation(function(value, other) { - return value >= other; - }); - var isArguments = baseIsArguments(/* @__PURE__ */ function() { - return arguments; - }()) ? baseIsArguments : function(value) { - return isObjectLike(value) && hasOwnProperty2.call(value, "callee") && !propertyIsEnumerable.call(value, "callee"); - }; - var isArray = Array2.isArray; - var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; - function isArrayLike(value) { - return value != null && isLength(value.length) && !isFunction3(value); - } - function isArrayLikeObject(value) { - return isObjectLike(value) && isArrayLike(value); - } - function isBoolean(value) { - return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag; - } - var isBuffer = nativeIsBuffer || stubFalse; - var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; - function isElement3(value) { - return isObjectLike(value) && value.nodeType === 1 && !isPlainObject2(value); - } - function isEmpty2(value) { - if (value == null) { - return true; - } - if (isArrayLike(value) && (isArray(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) { - return !value.length; - } - var tag = getTag(value); - if (tag == mapTag || tag == setTag) { - return !value.size; - } - if (isPrototype(value)) { - return !baseKeys(value).length; - } - for (var key in value) { - if (hasOwnProperty2.call(value, key)) { - return false; - } - } - return true; - } - function isEqual2(value, other) { - return baseIsEqual(value, other); - } - function isEqualWith(value, other, customizer) { - customizer = typeof customizer == "function" ? customizer : undefined2; - var result2 = customizer ? customizer(value, other) : undefined2; - return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2; - } - function isError(value) { - if (!isObjectLike(value)) { - return false; - } - var tag = baseGetTag(value); - return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject2(value); - } - function isFinite(value) { - return typeof value == "number" && nativeIsFinite(value); - } - function isFunction3(value) { - if (!isObject(value)) { - return false; - } - var tag = baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; - } - function isInteger(value) { - return typeof value == "number" && value == toInteger(value); - } - function isLength(value) { - return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; - } - function isObject(value) { - var type = typeof value; - return value != null && (type == "object" || type == "function"); - } - function isObjectLike(value) { - return value != null && typeof value == "object"; - } - var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; - function isMatch(object, source3) { - return object === source3 || baseIsMatch(object, source3, getMatchData(source3)); - } - function isMatchWith(object, source3, customizer) { - customizer = typeof customizer == "function" ? customizer : undefined2; - return baseIsMatch(object, source3, getMatchData(source3), customizer); - } - function isNaN(value) { - return isNumber2(value) && value != +value; - } - function isNative(value) { - if (isMaskable(value)) { - throw new Error2(CORE_ERROR_TEXT); - } - return baseIsNative(value); - } - function isNull(value) { - return value === null; - } - function isNil(value) { - return value == null; - } - function isNumber2(value) { - return typeof value == "number" || isObjectLike(value) && baseGetTag(value) == numberTag; - } - function isPlainObject2(value) { - if (!isObjectLike(value) || baseGetTag(value) != objectTag) { - return false; - } - var proto = getPrototype(value); - if (proto === null) { - return true; - } - var Ctor = hasOwnProperty2.call(proto, "constructor") && proto.constructor; - return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; - } - var isRegExp2 = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; - function isSafeInteger(value) { - return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; - } - var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; - function isString(value) { - return typeof value == "string" || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag; - } - function isSymbol(value) { - return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag; - } - var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; - function isUndefined(value) { - return value === undefined2; - } - function isWeakMap(value) { - return isObjectLike(value) && getTag(value) == weakMapTag; - } - function isWeakSet(value) { - return isObjectLike(value) && baseGetTag(value) == weakSetTag; - } - var lt = createRelationalOperation(baseLt); - var lte = createRelationalOperation(function(value, other) { - return value <= other; - }); - function toArray(value) { - if (!value) { - return []; - } - if (isArrayLike(value)) { - return isString(value) ? stringToArray2(value) : copyArray(value); - } - if (symIterator && value[symIterator]) { - return iteratorToArray(value[symIterator]()); - } - var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values; - return func(value); - } - function toFinite(value) { - if (!value) { - return value === 0 ? value : 0; - } - value = toNumber(value); - if (value === INFINITY || value === -INFINITY) { - var sign = value < 0 ? -1 : 1; - return sign * MAX_INTEGER; - } - return value === value ? value : 0; - } - function toInteger(value) { - var result2 = toFinite(value), remainder = result2 % 1; - return result2 === result2 ? remainder ? result2 - remainder : result2 : 0; - } - function toLength(value) { - return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; - } - function toNumber(value) { - if (typeof value == "number") { - return value; - } - if (isSymbol(value)) { - return NAN; - } - if (isObject(value)) { - var other = typeof value.valueOf == "function" ? value.valueOf() : value; - value = isObject(other) ? other + "" : other; - } - if (typeof value != "string") { - return value === 0 ? value : +value; - } - value = baseTrim(value); - var isBinary = reIsBinary.test(value); - return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value; - } - function toPlainObject(value) { - return copyObject(value, keysIn(value)); - } - function toSafeInteger(value) { - return value ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0; - } - function toString(value) { - return value == null ? "" : baseToString(value); - } - var assign2 = createAssigner(function(object, source3) { - if (isPrototype(source3) || isArrayLike(source3)) { - copyObject(source3, keys2(source3), object); - return; - } - for (var key in source3) { - if (hasOwnProperty2.call(source3, key)) { - assignValue(object, key, source3[key]); - } - } - }); - var assignIn = createAssigner(function(object, source3) { - copyObject(source3, keysIn(source3), object); - }); - var assignInWith = createAssigner(function(object, source3, srcIndex, customizer) { - copyObject(source3, keysIn(source3), object, customizer); - }); - var assignWith = createAssigner(function(object, source3, srcIndex, customizer) { - copyObject(source3, keys2(source3), object, customizer); - }); - var at = flatRest(baseAt); - function create2(prototype, properties) { - var result2 = baseCreate(prototype); - return properties == null ? result2 : baseAssign(result2, properties); - } - var defaults2 = baseRest(function(object, sources) { - object = Object2(object); - var index = -1; - var length = sources.length; - var guard = length > 2 ? sources[2] : undefined2; - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - length = 1; - } - while (++index < length) { - var source3 = sources[index]; - var props = keysIn(source3); - var propsIndex = -1; - var propsLength = props.length; - while (++propsIndex < propsLength) { - var key = props[propsIndex]; - var value = object[key]; - if (value === undefined2 || eq(value, objectProto[key]) && !hasOwnProperty2.call(object, key)) { - object[key] = source3[key]; - } - } - } - return object; - }); - var defaultsDeep = baseRest(function(args) { - args.push(undefined2, customDefaultsMerge); - return apply2(mergeWith, undefined2, args); - }); - function findKey(object, predicate) { - return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); - } - function findLastKey(object, predicate) { - return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); - } - function forIn(object, iteratee2) { - return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn); - } - function forInRight(object, iteratee2) { - return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn); - } - function forOwn(object, iteratee2) { - return object && baseForOwn(object, getIteratee(iteratee2, 3)); - } - function forOwnRight(object, iteratee2) { - return object && baseForOwnRight(object, getIteratee(iteratee2, 3)); - } - function functions(object) { - return object == null ? [] : baseFunctions(object, keys2(object)); - } - function functionsIn(object) { - return object == null ? [] : baseFunctions(object, keysIn(object)); - } - function get2(object, path, defaultValue) { - var result2 = object == null ? undefined2 : baseGet(object, path); - return result2 === undefined2 ? defaultValue : result2; - } - function has(object, path) { - return object != null && hasPath(object, path, baseHas); - } - function hasIn(object, path) { - return object != null && hasPath(object, path, baseHasIn); - } - var invert = createInverter(function(result2, value, key) { - if (value != null && typeof value.toString != "function") { - value = nativeObjectToString.call(value); - } - result2[value] = key; - }, constant(identity)); - var invertBy = createInverter(function(result2, value, key) { - if (value != null && typeof value.toString != "function") { - value = nativeObjectToString.call(value); - } - if (hasOwnProperty2.call(result2, value)) { - result2[value].push(key); - } else { - result2[value] = [key]; - } - }, getIteratee); - var invoke = baseRest(baseInvoke); - function keys2(object) { - return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); - } - function keysIn(object) { - return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); - } - function mapKeys(object, iteratee2) { - var result2 = {}; - iteratee2 = getIteratee(iteratee2, 3); - baseForOwn(object, function(value, key, object2) { - baseAssignValue(result2, iteratee2(value, key, object2), value); - }); - return result2; - } - function mapValues(object, iteratee2) { - var result2 = {}; - iteratee2 = getIteratee(iteratee2, 3); - baseForOwn(object, function(value, key, object2) { - baseAssignValue(result2, key, iteratee2(value, key, object2)); - }); - return result2; - } - var merge = createAssigner(function(object, source3, srcIndex) { - baseMerge(object, source3, srcIndex); - }); - var mergeWith = createAssigner(function(object, source3, srcIndex, customizer) { - baseMerge(object, source3, srcIndex, customizer); - }); - var omit = flatRest(function(object, paths) { - var result2 = {}; - if (object == null) { - return result2; - } - var isDeep = false; - paths = arrayMap(paths, function(path) { - path = castPath(path, object); - isDeep || (isDeep = path.length > 1); - return path; - }); - copyObject(object, getAllKeysIn(object), result2); - if (isDeep) { - result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); - } - var length = paths.length; - while (length--) { - baseUnset(result2, paths[length]); - } - return result2; - }); - function omitBy(object, predicate) { - return pickBy(object, negate(getIteratee(predicate))); - } - var pick = flatRest(function(object, paths) { - return object == null ? {} : basePick(object, paths); - }); - function pickBy(object, predicate) { - if (object == null) { - return {}; - } - var props = arrayMap(getAllKeysIn(object), function(prop) { - return [prop]; - }); - predicate = getIteratee(predicate); - return basePickBy(object, props, function(value, path) { - return predicate(value, path[0]); - }); - } - function result(object, path, defaultValue) { - path = castPath(path, object); - var index = -1, length = path.length; - if (!length) { - length = 1; - object = undefined2; - } - while (++index < length) { - var value = object == null ? undefined2 : object[toKey(path[index])]; - if (value === undefined2) { - index = length; - value = defaultValue; - } - object = isFunction3(value) ? value.call(object) : value; - } - return object; - } - function set(object, path, value) { - return object == null ? object : baseSet(object, path, value); - } - function setWith(object, path, value, customizer) { - customizer = typeof customizer == "function" ? customizer : undefined2; - return object == null ? object : baseSet(object, path, value, customizer); - } - var toPairs = createToPairs(keys2); - var toPairsIn = createToPairs(keysIn); - function transform(object, iteratee2, accumulator) { - var isArr = isArray(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object); - iteratee2 = getIteratee(iteratee2, 4); - if (accumulator == null) { - var Ctor = object && object.constructor; - if (isArrLike) { - accumulator = isArr ? new Ctor() : []; - } else if (isObject(object)) { - accumulator = isFunction3(Ctor) ? baseCreate(getPrototype(object)) : {}; - } else { - accumulator = {}; - } - } - (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object2) { - return iteratee2(accumulator, value, index, object2); - }); - return accumulator; - } - function unset(object, path) { - return object == null ? true : baseUnset(object, path); - } - function update(object, path, updater) { - return object == null ? object : baseUpdate(object, path, castFunction(updater)); - } - function updateWith(object, path, updater, customizer) { - customizer = typeof customizer == "function" ? customizer : undefined2; - return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); - } - function values(object) { - return object == null ? [] : baseValues(object, keys2(object)); - } - function valuesIn(object) { - return object == null ? [] : baseValues(object, keysIn(object)); - } - function clamp2(number, lower, upper) { - if (upper === undefined2) { - upper = lower; - lower = undefined2; - } - if (upper !== undefined2) { - upper = toNumber(upper); - upper = upper === upper ? upper : 0; - } - if (lower !== undefined2) { - lower = toNumber(lower); - lower = lower === lower ? lower : 0; - } - return baseClamp(toNumber(number), lower, upper); - } - function inRange(number, start2, end2) { - start2 = toFinite(start2); - if (end2 === undefined2) { - end2 = start2; - start2 = 0; - } else { - end2 = toFinite(end2); - } - number = toNumber(number); - return baseInRange(number, start2, end2); - } - function random(lower, upper, floating) { - if (floating && typeof floating != "boolean" && isIterateeCall(lower, upper, floating)) { - upper = floating = undefined2; - } - if (floating === undefined2) { - if (typeof upper == "boolean") { - floating = upper; - upper = undefined2; - } else if (typeof lower == "boolean") { - floating = lower; - lower = undefined2; - } - } - if (lower === undefined2 && upper === undefined2) { - lower = 0; - upper = 1; - } else { - lower = toFinite(lower); - if (upper === undefined2) { - upper = lower; - lower = 0; - } else { - upper = toFinite(upper); - } - } - if (lower > upper) { - var temp = lower; - lower = upper; - upper = temp; - } - if (floating || lower % 1 || upper % 1) { - var rand = nativeRandom(); - return nativeMin(lower + rand * (upper - lower + freeParseFloat("1e-" + ((rand + "").length - 1))), upper); - } - return baseRandom(lower, upper); - } - var camelCase = createCompounder(function(result2, word, index) { - word = word.toLowerCase(); - return result2 + (index ? capitalize(word) : word); - }); - function capitalize(string) { - return upperFirst(toString(string).toLowerCase()); - } - function deburr(string) { - string = toString(string); - return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ""); - } - function endsWith(string, target, position) { - string = toString(string); - target = baseToString(target); - var length = string.length; - position = position === undefined2 ? length : baseClamp(toInteger(position), 0, length); - var end2 = position; - position -= target.length; - return position >= 0 && string.slice(position, end2) == target; - } - function escape2(string) { - string = toString(string); - return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string; - } - function escapeRegExp(string) { - string = toString(string); - return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string; - } - var kebabCase = createCompounder(function(result2, word, index) { - return result2 + (index ? "-" : "") + word.toLowerCase(); - }); - var lowerCase = createCompounder(function(result2, word, index) { - return result2 + (index ? " " : "") + word.toLowerCase(); - }); - var lowerFirst = createCaseFirst("toLowerCase"); - function pad(string, length, chars) { - string = toString(string); - length = toInteger(length); - var strLength = length ? stringSize(string) : 0; - if (!length || strLength >= length) { - return string; - } - var mid = (length - strLength) / 2; - return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars); - } - function padEnd(string, length, chars) { - string = toString(string); - length = toInteger(length); - var strLength = length ? stringSize(string) : 0; - return length && strLength < length ? string + createPadding(length - strLength, chars) : string; - } - function padStart(string, length, chars) { - string = toString(string); - length = toInteger(length); - var strLength = length ? stringSize(string) : 0; - return length && strLength < length ? createPadding(length - strLength, chars) + string : string; - } - function parseInt2(string, radix, guard) { - if (guard || radix == null) { - radix = 0; - } else if (radix) { - radix = +radix; - } - return nativeParseInt(toString(string).replace(reTrimStart, ""), radix || 0); - } - function repeat(string, n, guard) { - if (guard ? isIterateeCall(string, n, guard) : n === undefined2) { - n = 1; - } else { - n = toInteger(n); - } - return baseRepeat(toString(string), n); - } - function replace2() { - var args = arguments, string = toString(args[0]); - return args.length < 3 ? string : string.replace(args[1], args[2]); - } - var snakeCase = createCompounder(function(result2, word, index) { - return result2 + (index ? "_" : "") + word.toLowerCase(); - }); - function split2(string, separator, limit) { - if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) { - separator = limit = undefined2; - } - limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0; - if (!limit) { - return []; - } - string = toString(string); - if (string && (typeof separator == "string" || separator != null && !isRegExp2(separator))) { - separator = baseToString(separator); - if (!separator && hasUnicode(string)) { - return castSlice(stringToArray2(string), 0, limit); - } - } - return string.split(separator, limit); - } - var startCase = createCompounder(function(result2, word, index) { - return result2 + (index ? " " : "") + upperFirst(word); - }); - function startsWith2(string, target, position) { - string = toString(string); - position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length); - target = baseToString(target); - return string.slice(position, position + target.length) == target; - } - function template(string, options, guard) { - var settings = lodash.templateSettings; - if (guard && isIterateeCall(string, options, guard)) { - options = undefined2; - } - string = toString(string); - options = assignInWith({}, options, settings, customDefaultsAssignIn); - var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys2(imports), importsValues = baseValues(imports, importsKeys); - var isEscaping, isEvaluating, index = 0, interpolate = options.interpolate || reNoMatch, source3 = "__p += '"; - var reDelimiters = RegExp2( - (options.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options.evaluate || reNoMatch).source + "|$", - "g" - ); - var sourceURL = "//# sourceURL=" + (hasOwnProperty2.call(options, "sourceURL") ? (options.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n"; - string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset2) { - interpolateValue || (interpolateValue = esTemplateValue); - source3 += string.slice(index, offset2).replace(reUnescapedString, escapeStringChar); - if (escapeValue) { - isEscaping = true; - source3 += "' +\n__e(" + escapeValue + ") +\n'"; - } - if (evaluateValue) { - isEvaluating = true; - source3 += "';\n" + evaluateValue + ";\n__p += '"; - } - if (interpolateValue) { - source3 += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'"; - } - index = offset2 + match.length; - return match; - }); - source3 += "';\n"; - var variable = hasOwnProperty2.call(options, "variable") && options.variable; - if (!variable) { - source3 = "with (obj) {\n" + source3 + "\n}\n"; - } else if (reForbiddenIdentifierChars.test(variable)) { - throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT); - } - source3 = (isEvaluating ? source3.replace(reEmptyStringLeading, "") : source3).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;"); - source3 = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source3 + "return __p\n}"; - var result2 = attempt(function() { - return Function2(importsKeys, sourceURL + "return " + source3).apply(undefined2, importsValues); - }); - result2.source = source3; - if (isError(result2)) { - throw result2; - } - return result2; - } - function toLower(value) { - return toString(value).toLowerCase(); - } - function toUpper(value) { - return toString(value).toUpperCase(); - } - function trim(string, chars, guard) { - string = toString(string); - if (string && (guard || chars === undefined2)) { - return baseTrim(string); - } - if (!string || !(chars = baseToString(chars))) { - return string; - } - var strSymbols = stringToArray2(string), chrSymbols = stringToArray2(chars), start2 = charsStartIndex(strSymbols, chrSymbols), end2 = charsEndIndex(strSymbols, chrSymbols) + 1; - return castSlice(strSymbols, start2, end2).join(""); - } - function trimEnd(string, chars, guard) { - string = toString(string); - if (string && (guard || chars === undefined2)) { - return string.slice(0, trimmedEndIndex(string) + 1); - } - if (!string || !(chars = baseToString(chars))) { - return string; - } - var strSymbols = stringToArray2(string), end2 = charsEndIndex(strSymbols, stringToArray2(chars)) + 1; - return castSlice(strSymbols, 0, end2).join(""); - } - function trimStart(string, chars, guard) { - string = toString(string); - if (string && (guard || chars === undefined2)) { - return string.replace(reTrimStart, ""); - } - if (!string || !(chars = baseToString(chars))) { - return string; - } - var strSymbols = stringToArray2(string), start2 = charsStartIndex(strSymbols, stringToArray2(chars)); - return castSlice(strSymbols, start2).join(""); - } - function truncate(string, options) { - var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION; - if (isObject(options)) { - var separator = "separator" in options ? options.separator : separator; - length = "length" in options ? toInteger(options.length) : length; - omission = "omission" in options ? baseToString(options.omission) : omission; - } - string = toString(string); - var strLength = string.length; - if (hasUnicode(string)) { - var strSymbols = stringToArray2(string); - strLength = strSymbols.length; - } - if (length >= strLength) { - return string; - } - var end2 = length - stringSize(omission); - if (end2 < 1) { - return omission; - } - var result2 = strSymbols ? castSlice(strSymbols, 0, end2).join("") : string.slice(0, end2); - if (separator === undefined2) { - return result2 + omission; - } - if (strSymbols) { - end2 += result2.length - end2; - } - if (isRegExp2(separator)) { - if (string.slice(end2).search(separator)) { - var match, substring = result2; - if (!separator.global) { - separator = RegExp2(separator.source, toString(reFlags.exec(separator)) + "g"); - } - separator.lastIndex = 0; - while (match = separator.exec(substring)) { - var newEnd = match.index; - } - result2 = result2.slice(0, newEnd === undefined2 ? end2 : newEnd); - } - } else if (string.indexOf(baseToString(separator), end2) != end2) { - var index = result2.lastIndexOf(separator); - if (index > -1) { - result2 = result2.slice(0, index); - } - } - return result2 + omission; - } - function unescape(string) { - string = toString(string); - return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string; - } - var upperCase = createCompounder(function(result2, word, index) { - return result2 + (index ? " " : "") + word.toUpperCase(); - }); - var upperFirst = createCaseFirst("toUpperCase"); - function words(string, pattern, guard) { - string = toString(string); - pattern = guard ? undefined2 : pattern; - if (pattern === undefined2) { - return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); - } - return string.match(pattern) || []; - } - var attempt = baseRest(function(func, args) { - try { - return apply2(func, undefined2, args); - } catch (e) { - return isError(e) ? e : new Error2(e); - } - }); - var bindAll = flatRest(function(object, methodNames) { - arrayEach(methodNames, function(key) { - key = toKey(key); - baseAssignValue(object, key, bind2(object[key], object)); - }); - return object; - }); - function cond(pairs) { - var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee(); - pairs = !length ? [] : arrayMap(pairs, function(pair) { - if (typeof pair[1] != "function") { - throw new TypeError2(FUNC_ERROR_TEXT); - } - return [toIteratee(pair[0]), pair[1]]; - }); - return baseRest(function(args) { - var index = -1; - while (++index < length) { - var pair = pairs[index]; - if (apply2(pair[0], this, args)) { - return apply2(pair[1], this, args); - } - } - }); - } - function conforms(source3) { - return baseConforms(baseClone(source3, CLONE_DEEP_FLAG)); - } - function constant(value) { - return function() { - return value; - }; - } - function defaultTo(value, defaultValue) { - return value == null || value !== value ? defaultValue : value; - } - var flow = createFlow(); - var flowRight = createFlow(true); - function identity(value) { - return value; - } - function iteratee(func) { - return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG)); - } - function matches2(source3) { - return baseMatches(baseClone(source3, CLONE_DEEP_FLAG)); - } - function matchesProperty(path, srcValue) { - return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG)); - } - var method = baseRest(function(path, args) { - return function(object) { - return baseInvoke(object, path, args); - }; - }); - var methodOf = baseRest(function(object, args) { - return function(path) { - return baseInvoke(object, path, args); - }; - }); - function mixin(object, source3, options) { - var props = keys2(source3), methodNames = baseFunctions(source3, props); - if (options == null && !(isObject(source3) && (methodNames.length || !props.length))) { - options = source3; - source3 = object; - object = this; - methodNames = baseFunctions(source3, keys2(source3)); - } - var chain2 = !(isObject(options) && "chain" in options) || !!options.chain, isFunc = isFunction3(object); - arrayEach(methodNames, function(methodName) { - var func = source3[methodName]; - object[methodName] = func; - if (isFunc) { - object.prototype[methodName] = function() { - var chainAll = this.__chain__; - if (chain2 || chainAll) { - var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__); - actions.push({ "func": func, "args": arguments, "thisArg": object }); - result2.__chain__ = chainAll; - return result2; - } - return func.apply(object, arrayPush([this.value()], arguments)); - }; - } - }); - return object; - } - function noConflict() { - if (root._ === this) { - root._ = oldDash; - } - return this; - } - function noop2() { - } - function nthArg(n) { - n = toInteger(n); - return baseRest(function(args) { - return baseNth(args, n); - }); - } - var over = createOver(arrayMap); - var overEvery = createOver(arrayEvery); - var overSome = createOver(arraySome); - function property(path) { - return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); - } - function propertyOf(object) { - return function(path) { - return object == null ? undefined2 : baseGet(object, path); - }; - } - var range = createRange(); - var rangeRight = createRange(true); - function stubArray() { - return []; - } - function stubFalse() { - return false; - } - function stubObject() { - return {}; - } - function stubString() { - return ""; - } - function stubTrue() { - return true; - } - function times(n, iteratee2) { - n = toInteger(n); - if (n < 1 || n > MAX_SAFE_INTEGER) { - return []; - } - var index = MAX_ARRAY_LENGTH, length = nativeMin(n, MAX_ARRAY_LENGTH); - iteratee2 = getIteratee(iteratee2); - n -= MAX_ARRAY_LENGTH; - var result2 = baseTimes(length, iteratee2); - while (++index < n) { - iteratee2(index); - } - return result2; - } - function toPath(value) { - if (isArray(value)) { - return arrayMap(value, toKey); - } - return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); - } - function uniqueId(prefix) { - var id = ++idCounter2; - return toString(prefix) + id; - } - var add = createMathOperation(function(augend, addend) { - return augend + addend; - }, 0); - var ceil = createRound("ceil"); - var divide = createMathOperation(function(dividend, divisor) { - return dividend / divisor; - }, 1); - var floor = createRound("floor"); - function max2(array) { - return array && array.length ? baseExtremum(array, identity, baseGt) : undefined2; - } - function maxBy(array, iteratee2) { - return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseGt) : undefined2; - } - function mean(array) { - return baseMean(array, identity); - } - function meanBy(array, iteratee2) { - return baseMean(array, getIteratee(iteratee2, 2)); - } - function min2(array) { - return array && array.length ? baseExtremum(array, identity, baseLt) : undefined2; - } - function minBy(array, iteratee2) { - return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseLt) : undefined2; - } - var multiply = createMathOperation(function(multiplier, multiplicand) { - return multiplier * multiplicand; - }, 1); - var round3 = createRound("round"); - var subtract = createMathOperation(function(minuend, subtrahend) { - return minuend - subtrahend; - }, 0); - function sum(array) { - return array && array.length ? baseSum(array, identity) : 0; - } - function sumBy(array, iteratee2) { - return array && array.length ? baseSum(array, getIteratee(iteratee2, 2)) : 0; - } - lodash.after = after; - lodash.ary = ary; - lodash.assign = assign2; - lodash.assignIn = assignIn; - lodash.assignInWith = assignInWith; - lodash.assignWith = assignWith; - lodash.at = at; - lodash.before = before; - lodash.bind = bind2; - lodash.bindAll = bindAll; - lodash.bindKey = bindKey; - lodash.castArray = castArray; - lodash.chain = chain; - lodash.chunk = chunk; - lodash.compact = compact; - lodash.concat = concat3; - lodash.cond = cond; - lodash.conforms = conforms; - lodash.constant = constant; - lodash.countBy = countBy; - lodash.create = create2; - lodash.curry = curry; - lodash.curryRight = curryRight; - lodash.debounce = debounce3; - lodash.defaults = defaults2; - lodash.defaultsDeep = defaultsDeep; - lodash.defer = defer; - lodash.delay = delay; - lodash.difference = difference; - lodash.differenceBy = differenceBy; - lodash.differenceWith = differenceWith; - lodash.drop = drop; - lodash.dropRight = dropRight; - lodash.dropRightWhile = dropRightWhile; - lodash.dropWhile = dropWhile; - lodash.fill = fill; - lodash.filter = filter; - lodash.flatMap = flatMap; - lodash.flatMapDeep = flatMapDeep; - lodash.flatMapDepth = flatMapDepth; - lodash.flatten = flatten; - lodash.flattenDeep = flattenDeep; - lodash.flattenDepth = flattenDepth; - lodash.flip = flip2; - lodash.flow = flow; - lodash.flowRight = flowRight; - lodash.fromPairs = fromPairs; - lodash.functions = functions; - lodash.functionsIn = functionsIn; - lodash.groupBy = groupBy; - lodash.initial = initial; - lodash.intersection = intersection; - lodash.intersectionBy = intersectionBy; - lodash.intersectionWith = intersectionWith; - lodash.invert = invert; - lodash.invertBy = invertBy; - lodash.invokeMap = invokeMap; - lodash.iteratee = iteratee; - lodash.keyBy = keyBy; - lodash.keys = keys2; - lodash.keysIn = keysIn; - lodash.map = map2; - lodash.mapKeys = mapKeys; - lodash.mapValues = mapValues; - lodash.matches = matches2; - lodash.matchesProperty = matchesProperty; - lodash.memoize = memoize; - lodash.merge = merge; - lodash.mergeWith = mergeWith; - lodash.method = method; - lodash.methodOf = methodOf; - lodash.mixin = mixin; - lodash.negate = negate; - lodash.nthArg = nthArg; - lodash.omit = omit; - lodash.omitBy = omitBy; - lodash.once = once; - lodash.orderBy = orderBy; - lodash.over = over; - lodash.overArgs = overArgs; - lodash.overEvery = overEvery; - lodash.overSome = overSome; - lodash.partial = partial; - lodash.partialRight = partialRight; - lodash.partition = partition; - lodash.pick = pick; - lodash.pickBy = pickBy; - lodash.property = property; - lodash.propertyOf = propertyOf; - lodash.pull = pull; - lodash.pullAll = pullAll; - lodash.pullAllBy = pullAllBy; - lodash.pullAllWith = pullAllWith; - lodash.pullAt = pullAt; - lodash.range = range; - lodash.rangeRight = rangeRight; - lodash.rearg = rearg; - lodash.reject = reject; - lodash.remove = remove; - lodash.rest = rest; - lodash.reverse = reverse; - lodash.sampleSize = sampleSize; - lodash.set = set; - lodash.setWith = setWith; - lodash.shuffle = shuffle; - lodash.slice = slice2; - lodash.sortBy = sortBy; - lodash.sortedUniq = sortedUniq; - lodash.sortedUniqBy = sortedUniqBy; - lodash.split = split2; - lodash.spread = spread; - lodash.tail = tail; - lodash.take = take; - lodash.takeRight = takeRight; - lodash.takeRightWhile = takeRightWhile; - lodash.takeWhile = takeWhile; - lodash.tap = tap; - lodash.throttle = throttle; - lodash.thru = thru; - lodash.toArray = toArray; - lodash.toPairs = toPairs; - lodash.toPairsIn = toPairsIn; - lodash.toPath = toPath; - lodash.toPlainObject = toPlainObject; - lodash.transform = transform; - lodash.unary = unary; - lodash.union = union; - lodash.unionBy = unionBy; - lodash.unionWith = unionWith; - lodash.uniq = uniq; - lodash.uniqBy = uniqBy; - lodash.uniqWith = uniqWith; - lodash.unset = unset; - lodash.unzip = unzip; - lodash.unzipWith = unzipWith; - lodash.update = update; - lodash.updateWith = updateWith; - lodash.values = values; - lodash.valuesIn = valuesIn; - lodash.without = without; - lodash.words = words; - lodash.wrap = wrap2; - lodash.xor = xor; - lodash.xorBy = xorBy; - lodash.xorWith = xorWith; - lodash.zip = zip; - lodash.zipObject = zipObject; - lodash.zipObjectDeep = zipObjectDeep; - lodash.zipWith = zipWith; - lodash.entries = toPairs; - lodash.entriesIn = toPairsIn; - lodash.extend = assignIn; - lodash.extendWith = assignInWith; - mixin(lodash, lodash); - lodash.add = add; - lodash.attempt = attempt; - lodash.camelCase = camelCase; - lodash.capitalize = capitalize; - lodash.ceil = ceil; - lodash.clamp = clamp2; - lodash.clone = clone; - lodash.cloneDeep = cloneDeep; - lodash.cloneDeepWith = cloneDeepWith; - lodash.cloneWith = cloneWith; - lodash.conformsTo = conformsTo; - lodash.deburr = deburr; - lodash.defaultTo = defaultTo; - lodash.divide = divide; - lodash.endsWith = endsWith; - lodash.eq = eq; - lodash.escape = escape2; - lodash.escapeRegExp = escapeRegExp; - lodash.every = every; - lodash.find = find2; - lodash.findIndex = findIndex; - lodash.findKey = findKey; - lodash.findLast = findLast; - lodash.findLastIndex = findLastIndex; - lodash.findLastKey = findLastKey; - lodash.floor = floor; - lodash.forEach = forEach3; - lodash.forEachRight = forEachRight; - lodash.forIn = forIn; - lodash.forInRight = forInRight; - lodash.forOwn = forOwn; - lodash.forOwnRight = forOwnRight; - lodash.get = get2; - lodash.gt = gt; - lodash.gte = gte; - lodash.has = has; - lodash.hasIn = hasIn; - lodash.head = head; - lodash.identity = identity; - lodash.includes = includes; - lodash.indexOf = indexOf; - lodash.inRange = inRange; - lodash.invoke = invoke; - lodash.isArguments = isArguments; - lodash.isArray = isArray; - lodash.isArrayBuffer = isArrayBuffer; - lodash.isArrayLike = isArrayLike; - lodash.isArrayLikeObject = isArrayLikeObject; - lodash.isBoolean = isBoolean; - lodash.isBuffer = isBuffer; - lodash.isDate = isDate; - lodash.isElement = isElement3; - lodash.isEmpty = isEmpty2; - lodash.isEqual = isEqual2; - lodash.isEqualWith = isEqualWith; - lodash.isError = isError; - lodash.isFinite = isFinite; - lodash.isFunction = isFunction3; - lodash.isInteger = isInteger; - lodash.isLength = isLength; - lodash.isMap = isMap; - lodash.isMatch = isMatch; - lodash.isMatchWith = isMatchWith; - lodash.isNaN = isNaN; - lodash.isNative = isNative; - lodash.isNil = isNil; - lodash.isNull = isNull; - lodash.isNumber = isNumber2; - lodash.isObject = isObject; - lodash.isObjectLike = isObjectLike; - lodash.isPlainObject = isPlainObject2; - lodash.isRegExp = isRegExp2; - lodash.isSafeInteger = isSafeInteger; - lodash.isSet = isSet; - lodash.isString = isString; - lodash.isSymbol = isSymbol; - lodash.isTypedArray = isTypedArray; - lodash.isUndefined = isUndefined; - lodash.isWeakMap = isWeakMap; - lodash.isWeakSet = isWeakSet; - lodash.join = join2; - lodash.kebabCase = kebabCase; - lodash.last = last; - lodash.lastIndexOf = lastIndexOf; - lodash.lowerCase = lowerCase; - lodash.lowerFirst = lowerFirst; - lodash.lt = lt; - lodash.lte = lte; - lodash.max = max2; - lodash.maxBy = maxBy; - lodash.mean = mean; - lodash.meanBy = meanBy; - lodash.min = min2; - lodash.minBy = minBy; - lodash.stubArray = stubArray; - lodash.stubFalse = stubFalse; - lodash.stubObject = stubObject; - lodash.stubString = stubString; - lodash.stubTrue = stubTrue; - lodash.multiply = multiply; - lodash.nth = nth; - lodash.noConflict = noConflict; - lodash.noop = noop2; - lodash.now = now; - lodash.pad = pad; - lodash.padEnd = padEnd; - lodash.padStart = padStart; - lodash.parseInt = parseInt2; - lodash.random = random; - lodash.reduce = reduce; - lodash.reduceRight = reduceRight; - lodash.repeat = repeat; - lodash.replace = replace2; - lodash.result = result; - lodash.round = round3; - lodash.runInContext = runInContext2; - lodash.sample = sample; - lodash.size = size; - lodash.snakeCase = snakeCase; - lodash.some = some; - lodash.sortedIndex = sortedIndex; - lodash.sortedIndexBy = sortedIndexBy; - lodash.sortedIndexOf = sortedIndexOf; - lodash.sortedLastIndex = sortedLastIndex; - lodash.sortedLastIndexBy = sortedLastIndexBy; - lodash.sortedLastIndexOf = sortedLastIndexOf; - lodash.startCase = startCase; - lodash.startsWith = startsWith2; - lodash.subtract = subtract; - lodash.sum = sum; - lodash.sumBy = sumBy; - lodash.template = template; - lodash.times = times; - lodash.toFinite = toFinite; - lodash.toInteger = toInteger; - lodash.toLength = toLength; - lodash.toLower = toLower; - lodash.toNumber = toNumber; - lodash.toSafeInteger = toSafeInteger; - lodash.toString = toString; - lodash.toUpper = toUpper; - lodash.trim = trim; - lodash.trimEnd = trimEnd; - lodash.trimStart = trimStart; - lodash.truncate = truncate; - lodash.unescape = unescape; - lodash.uniqueId = uniqueId; - lodash.upperCase = upperCase; - lodash.upperFirst = upperFirst; - lodash.each = forEach3; - lodash.eachRight = forEachRight; - lodash.first = head; - mixin(lodash, function() { - var source3 = {}; - baseForOwn(lodash, function(func, methodName) { - if (!hasOwnProperty2.call(lodash.prototype, methodName)) { - source3[methodName] = func; - } - }); - return source3; - }(), { "chain": false }); - lodash.VERSION = VERSION; - arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) { - lodash[methodName].placeholder = lodash; - }); - arrayEach(["drop", "take"], function(methodName, index) { - LazyWrapper.prototype[methodName] = function(n) { - n = n === undefined2 ? 1 : nativeMax(toInteger(n), 0); - var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone(); - if (result2.__filtered__) { - result2.__takeCount__ = nativeMin(n, result2.__takeCount__); - } else { - result2.__views__.push({ - "size": nativeMin(n, MAX_ARRAY_LENGTH), - "type": methodName + (result2.__dir__ < 0 ? "Right" : "") - }); - } - return result2; - }; - LazyWrapper.prototype[methodName + "Right"] = function(n) { - return this.reverse()[methodName](n).reverse(); - }; - }); - arrayEach(["filter", "map", "takeWhile"], function(methodName, index) { - var type = index + 1, isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG; - LazyWrapper.prototype[methodName] = function(iteratee2) { - var result2 = this.clone(); - result2.__iteratees__.push({ - "iteratee": getIteratee(iteratee2, 3), - "type": type - }); - result2.__filtered__ = result2.__filtered__ || isFilter; - return result2; - }; - }); - arrayEach(["head", "last"], function(methodName, index) { - var takeName = "take" + (index ? "Right" : ""); - LazyWrapper.prototype[methodName] = function() { - return this[takeName](1).value()[0]; - }; - }); - arrayEach(["initial", "tail"], function(methodName, index) { - var dropName = "drop" + (index ? "" : "Right"); - LazyWrapper.prototype[methodName] = function() { - return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1); - }; - }); - LazyWrapper.prototype.compact = function() { - return this.filter(identity); - }; - LazyWrapper.prototype.find = function(predicate) { - return this.filter(predicate).head(); - }; - LazyWrapper.prototype.findLast = function(predicate) { - return this.reverse().find(predicate); - }; - LazyWrapper.prototype.invokeMap = baseRest(function(path, args) { - if (typeof path == "function") { - return new LazyWrapper(this); - } - return this.map(function(value) { - return baseInvoke(value, path, args); - }); - }); - LazyWrapper.prototype.reject = function(predicate) { - return this.filter(negate(getIteratee(predicate))); - }; - LazyWrapper.prototype.slice = function(start2, end2) { - start2 = toInteger(start2); - var result2 = this; - if (result2.__filtered__ && (start2 > 0 || end2 < 0)) { - return new LazyWrapper(result2); - } - if (start2 < 0) { - result2 = result2.takeRight(-start2); - } else if (start2) { - result2 = result2.drop(start2); - } - if (end2 !== undefined2) { - end2 = toInteger(end2); - result2 = end2 < 0 ? result2.dropRight(-end2) : result2.take(end2 - start2); - } - return result2; - }; - LazyWrapper.prototype.takeRightWhile = function(predicate) { - return this.reverse().takeWhile(predicate).reverse(); - }; - LazyWrapper.prototype.toArray = function() { - return this.take(MAX_ARRAY_LENGTH); - }; - baseForOwn(LazyWrapper.prototype, function(func, methodName) { - var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName); - if (!lodashFunc) { - return; - } - lodash.prototype[methodName] = function() { - var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray(value); - var interceptor = function(value2) { - var result3 = lodashFunc.apply(lodash, arrayPush([value2], args)); - return isTaker && chainAll ? result3[0] : result3; - }; - if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) { - isLazy = useLazy = false; - } - var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid; - if (!retUnwrapped && useLazy) { - value = onlyLazy ? value : new LazyWrapper(this); - var result2 = func.apply(value, args); - result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 }); - return new LodashWrapper(result2, chainAll); - } - if (isUnwrapped && onlyLazy) { - return func.apply(this, args); - } - result2 = this.thru(interceptor); - return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2; - }; - }); - arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) { - var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName); - lodash.prototype[methodName] = function() { - var args = arguments; - if (retUnwrapped && !this.__chain__) { - var value = this.value(); - return func.apply(isArray(value) ? value : [], args); - } - return this[chainName](function(value2) { - return func.apply(isArray(value2) ? value2 : [], args); - }); - }; - }); - baseForOwn(LazyWrapper.prototype, function(func, methodName) { - var lodashFunc = lodash[methodName]; - if (lodashFunc) { - var key = lodashFunc.name + ""; - if (!hasOwnProperty2.call(realNames, key)) { - realNames[key] = []; - } - realNames[key].push({ "name": methodName, "func": lodashFunc }); - } - }); - realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{ - "name": "wrapper", - "func": undefined2 - }]; - LazyWrapper.prototype.clone = lazyClone; - LazyWrapper.prototype.reverse = lazyReverse; - LazyWrapper.prototype.value = lazyValue; - lodash.prototype.at = wrapperAt; - lodash.prototype.chain = wrapperChain; - lodash.prototype.commit = wrapperCommit; - lodash.prototype.next = wrapperNext; - lodash.prototype.plant = wrapperPlant; - lodash.prototype.reverse = wrapperReverse; - lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; - lodash.prototype.first = lodash.prototype.head; - if (symIterator) { - lodash.prototype[symIterator] = wrapperToIterator; - } - return lodash; - }; - var _ = runInContext(); - if (typeof define == "function" && typeof define.amd == "object" && define.amd) { - root._ = _; - define(function() { - return _; - }); - } else if (freeModule) { - (freeModule.exports = _)._ = _; - freeExports._ = _; - } else { - root._ = _; - } - }).call(exports); - } -}); - -// node_modules/orderedmap/dist/index.js -function OrderedMap(content) { - this.content = content; -} -OrderedMap.prototype = { - constructor: OrderedMap, - find: function(key) { - for (var i = 0; i < this.content.length; i += 2) - if (this.content[i] === key) - return i; - return -1; - }, - // :: (string) → ?any - // Retrieve the value stored under `key`, or return undefined when - // no such key exists. - get: function(key) { - var found2 = this.find(key); - return found2 == -1 ? void 0 : this.content[found2 + 1]; - }, - // :: (string, any, ?string) → OrderedMap - // Create a new map by replacing the value of `key` with a new - // value, or adding a binding to the end of the map. If `newKey` is - // given, the key of the binding will be replaced with that key. - update: function(key, value, newKey) { - var self2 = newKey && newKey != key ? this.remove(newKey) : this; - var found2 = self2.find(key), content = self2.content.slice(); - if (found2 == -1) { - content.push(newKey || key, value); - } else { - content[found2 + 1] = value; - if (newKey) - content[found2] = newKey; - } - return new OrderedMap(content); - }, - // :: (string) → OrderedMap - // Return a map with the given key removed, if it existed. - remove: function(key) { - var found2 = this.find(key); - if (found2 == -1) - return this; - var content = this.content.slice(); - content.splice(found2, 2); - return new OrderedMap(content); - }, - // :: (string, any) → OrderedMap - // Add a new key to the start of the map. - addToStart: function(key, value) { - return new OrderedMap([key, value].concat(this.remove(key).content)); - }, - // :: (string, any) → OrderedMap - // Add a new key to the end of the map. - addToEnd: function(key, value) { - var content = this.remove(key).content.slice(); - content.push(key, value); - return new OrderedMap(content); - }, - // :: (string, string, any) → OrderedMap - // Add a key after the given key. If `place` is not found, the new - // key is added to the end. - addBefore: function(place, key, value) { - var without = this.remove(key), content = without.content.slice(); - var found2 = without.find(place); - content.splice(found2 == -1 ? content.length : found2, 0, key, value); - return new OrderedMap(content); - }, - // :: ((key: string, value: any)) - // Call the given function for each key/value pair in the map, in - // order. - forEach: function(f) { - for (var i = 0; i < this.content.length; i += 2) - f(this.content[i], this.content[i + 1]); - }, - // :: (union) → OrderedMap - // Create a new map by prepending the keys in this map that don't - // appear in `map` before the keys in `map`. - prepend: function(map2) { - map2 = OrderedMap.from(map2); - if (!map2.size) - return this; - return new OrderedMap(map2.content.concat(this.subtract(map2).content)); - }, - // :: (union) → OrderedMap - // Create a new map by appending the keys in this map that don't - // appear in `map` after the keys in `map`. - append: function(map2) { - map2 = OrderedMap.from(map2); - if (!map2.size) - return this; - return new OrderedMap(this.subtract(map2).content.concat(map2.content)); - }, - // :: (union) → OrderedMap - // Create a map containing all the keys in this map that don't - // appear in `map`. - subtract: function(map2) { - var result = this; - map2 = OrderedMap.from(map2); - for (var i = 0; i < map2.content.length; i += 2) - result = result.remove(map2.content[i]); - return result; - }, - // :: () → Object - // Turn ordered map into a plain object. - toObject: function() { - var result = {}; - this.forEach(function(key, value) { - result[key] = value; - }); - return result; - }, - // :: number - // The amount of keys in this map. - get size() { - return this.content.length >> 1; - } -}; -OrderedMap.from = function(value) { - if (value instanceof OrderedMap) - return value; - var content = []; - if (value) - for (var prop in value) - content.push(prop, value[prop]); - return new OrderedMap(content); -}; -var dist_default = OrderedMap; - -// node_modules/prosemirror-model/dist/index.js -function findDiffStart(a, b, pos) { - for (let i = 0; ; i++) { - if (i == a.childCount || i == b.childCount) - return a.childCount == b.childCount ? null : pos; - let childA = a.child(i), childB = b.child(i); - if (childA == childB) { - pos += childA.nodeSize; - continue; - } - if (!childA.sameMarkup(childB)) - return pos; - if (childA.isText && childA.text != childB.text) { - for (let j = 0; childA.text[j] == childB.text[j]; j++) - pos++; - return pos; - } - if (childA.content.size || childB.content.size) { - let inner = findDiffStart(childA.content, childB.content, pos + 1); - if (inner != null) - return inner; - } - pos += childA.nodeSize; - } -} -function findDiffEnd(a, b, posA, posB) { - for (let iA = a.childCount, iB = b.childCount; ; ) { - if (iA == 0 || iB == 0) - return iA == iB ? null : { a: posA, b: posB }; - let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize; - if (childA == childB) { - posA -= size; - posB -= size; - continue; - } - if (!childA.sameMarkup(childB)) - return { a: posA, b: posB }; - if (childA.isText && childA.text != childB.text) { - let same = 0, minSize = Math.min(childA.text.length, childB.text.length); - while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) { - same++; - posA--; - posB--; - } - return { a: posA, b: posB }; - } - if (childA.content.size || childB.content.size) { - let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1); - if (inner) - return inner; - } - posA -= size; - posB -= size; - } -} -var Fragment = class _Fragment { - /** - @internal - */ - constructor(content, size) { - this.content = content; - this.size = size || 0; - if (size == null) - for (let i = 0; i < content.length; i++) - this.size += content[i].nodeSize; - } - /** - Invoke a callback for all descendant nodes between the given two - positions (relative to start of this fragment). Doesn't descend - into a node when the callback returns `false`. - */ - nodesBetween(from2, to, f, nodeStart = 0, parent) { - for (let i = 0, pos = 0; pos < to; i++) { - let child = this.content[i], end2 = pos + child.nodeSize; - if (end2 > from2 && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) { - let start2 = pos + 1; - child.nodesBetween(Math.max(0, from2 - start2), Math.min(child.content.size, to - start2), f, nodeStart + start2); - } - pos = end2; - } - } - /** - Call the given callback for every descendant node. `pos` will be - relative to the start of the fragment. The callback may return - `false` to prevent traversal of a given node's children. - */ - descendants(f) { - this.nodesBetween(0, this.size, f); - } - /** - Extract the text between `from` and `to`. See the same method on - [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween). - */ - textBetween(from2, to, blockSeparator, leafText) { - let text = "", separated = true; - this.nodesBetween(from2, to, (node, pos) => { - if (node.isText) { - text += node.text.slice(Math.max(from2, pos) - pos, to - pos); - separated = !blockSeparator; - } else if (node.isLeaf) { - if (leafText) { - text += typeof leafText === "function" ? leafText(node) : leafText; - } else if (node.type.spec.leafText) { - text += node.type.spec.leafText(node); - } - separated = !blockSeparator; - } else if (!separated && node.isBlock) { - text += blockSeparator; - separated = true; - } - }, 0); - return text; - } - /** - Create a new fragment containing the combined content of this - fragment and the other. - */ - append(other) { - if (!other.size) - return this; - if (!this.size) - return other; - let last = this.lastChild, first2 = other.firstChild, content = this.content.slice(), i = 0; - if (last.isText && last.sameMarkup(first2)) { - content[content.length - 1] = last.withText(last.text + first2.text); - i = 1; - } - for (; i < other.content.length; i++) - content.push(other.content[i]); - return new _Fragment(content, this.size + other.size); - } - /** - Cut out the sub-fragment between the two given positions. - */ - cut(from2, to = this.size) { - if (from2 == 0 && to == this.size) - return this; - let result = [], size = 0; - if (to > from2) - for (let i = 0, pos = 0; pos < to; i++) { - let child = this.content[i], end2 = pos + child.nodeSize; - if (end2 > from2) { - if (pos < from2 || end2 > to) { - if (child.isText) - child = child.cut(Math.max(0, from2 - pos), Math.min(child.text.length, to - pos)); - else - child = child.cut(Math.max(0, from2 - pos - 1), Math.min(child.content.size, to - pos - 1)); - } - result.push(child); - size += child.nodeSize; - } - pos = end2; - } - return new _Fragment(result, size); - } - /** - @internal - */ - cutByIndex(from2, to) { - if (from2 == to) - return _Fragment.empty; - if (from2 == 0 && to == this.content.length) - return this; - return new _Fragment(this.content.slice(from2, to)); - } - /** - Create a new fragment in which the node at the given index is - replaced by the given node. - */ - replaceChild(index, node) { - let current = this.content[index]; - if (current == node) - return this; - let copy2 = this.content.slice(); - let size = this.size + node.nodeSize - current.nodeSize; - copy2[index] = node; - return new _Fragment(copy2, size); - } - /** - Create a new fragment by prepending the given node to this - fragment. - */ - addToStart(node) { - return new _Fragment([node].concat(this.content), this.size + node.nodeSize); - } - /** - Create a new fragment by appending the given node to this - fragment. - */ - addToEnd(node) { - return new _Fragment(this.content.concat(node), this.size + node.nodeSize); - } - /** - Compare this fragment to another one. - */ - eq(other) { - if (this.content.length != other.content.length) - return false; - for (let i = 0; i < this.content.length; i++) - if (!this.content[i].eq(other.content[i])) - return false; - return true; - } - /** - The first child of the fragment, or `null` if it is empty. - */ - get firstChild() { - return this.content.length ? this.content[0] : null; - } - /** - The last child of the fragment, or `null` if it is empty. - */ - get lastChild() { - return this.content.length ? this.content[this.content.length - 1] : null; - } - /** - The number of child nodes in this fragment. - */ - get childCount() { - return this.content.length; - } - /** - Get the child node at the given index. Raise an error when the - index is out of range. - */ - child(index) { - let found2 = this.content[index]; - if (!found2) - throw new RangeError("Index " + index + " out of range for " + this); - return found2; - } - /** - Get the child node at the given index, if it exists. - */ - maybeChild(index) { - return this.content[index] || null; - } - /** - Call `f` for every child node, passing the node, its offset - into this parent node, and its index. - */ - forEach(f) { - for (let i = 0, p = 0; i < this.content.length; i++) { - let child = this.content[i]; - f(child, p, i); - p += child.nodeSize; - } - } - /** - Find the first position at which this fragment and another - fragment differ, or `null` if they are the same. - */ - findDiffStart(other, pos = 0) { - return findDiffStart(this, other, pos); - } - /** - Find the first position, searching from the end, at which this - fragment and the given fragment differ, or `null` if they are - the same. Since this position will not be the same in both - nodes, an object with two separate positions is returned. - */ - findDiffEnd(other, pos = this.size, otherPos = other.size) { - return findDiffEnd(this, other, pos, otherPos); - } - /** - Find the index and inner offset corresponding to a given relative - position in this fragment. The result object will be reused - (overwritten) the next time the function is called. (Not public.) - */ - findIndex(pos, round3 = -1) { - if (pos == 0) - return retIndex(0, pos); - if (pos == this.size) - return retIndex(this.content.length, pos); - if (pos > this.size || pos < 0) - throw new RangeError(`Position ${pos} outside of fragment (${this})`); - for (let i = 0, curPos = 0; ; i++) { - let cur = this.child(i), end2 = curPos + cur.nodeSize; - if (end2 >= pos) { - if (end2 == pos || round3 > 0) - return retIndex(i + 1, end2); - return retIndex(i, curPos); - } - curPos = end2; - } - } - /** - Return a debugging string that describes this fragment. - */ - toString() { - return "<" + this.toStringInner() + ">"; - } - /** - @internal - */ - toStringInner() { - return this.content.join(", "); - } - /** - Create a JSON-serializeable representation of this fragment. - */ - toJSON() { - return this.content.length ? this.content.map((n) => n.toJSON()) : null; - } - /** - Deserialize a fragment from its JSON representation. - */ - static fromJSON(schema, value) { - if (!value) - return _Fragment.empty; - if (!Array.isArray(value)) - throw new RangeError("Invalid input for Fragment.fromJSON"); - return new _Fragment(value.map(schema.nodeFromJSON)); - } - /** - Build a fragment from an array of nodes. Ensures that adjacent - text nodes with the same marks are joined together. - */ - static fromArray(array) { - if (!array.length) - return _Fragment.empty; - let joined, size = 0; - for (let i = 0; i < array.length; i++) { - let node = array[i]; - size += node.nodeSize; - if (i && node.isText && array[i - 1].sameMarkup(node)) { - if (!joined) - joined = array.slice(0, i); - joined[joined.length - 1] = node.withText(joined[joined.length - 1].text + node.text); - } else if (joined) { - joined.push(node); - } - } - return new _Fragment(joined || array, size); - } - /** - Create a fragment from something that can be interpreted as a - set of nodes. For `null`, it returns the empty fragment. For a - fragment, the fragment itself. For a node or array of nodes, a - fragment containing those nodes. - */ - static from(nodes) { - if (!nodes) - return _Fragment.empty; - if (nodes instanceof _Fragment) - return nodes; - if (Array.isArray(nodes)) - return this.fromArray(nodes); - if (nodes.attrs) - return new _Fragment([nodes], nodes.nodeSize); - throw new RangeError("Can not convert " + nodes + " to a Fragment" + (nodes.nodesBetween ? " (looks like multiple versions of prosemirror-model were loaded)" : "")); - } -}; -Fragment.empty = new Fragment([], 0); -var found = { index: 0, offset: 0 }; -function retIndex(index, offset2) { - found.index = index; - found.offset = offset2; - return found; -} -function compareDeep(a, b) { - if (a === b) - return true; - if (!(a && typeof a == "object") || !(b && typeof b == "object")) - return false; - let array = Array.isArray(a); - if (Array.isArray(b) != array) - return false; - if (array) { - if (a.length != b.length) - return false; - for (let i = 0; i < a.length; i++) - if (!compareDeep(a[i], b[i])) - return false; - } else { - for (let p in a) - if (!(p in b) || !compareDeep(a[p], b[p])) - return false; - for (let p in b) - if (!(p in a)) - return false; - } - return true; -} -var Mark = class _Mark { - /** - @internal - */ - constructor(type, attrs) { - this.type = type; - this.attrs = attrs; - } - /** - Given a set of marks, create a new set which contains this one as - well, in the right position. If this mark is already in the set, - the set itself is returned. If any marks that are set to be - [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present, - those are replaced by this one. - */ - addToSet(set) { - let copy2, placed = false; - for (let i = 0; i < set.length; i++) { - let other = set[i]; - if (this.eq(other)) - return set; - if (this.type.excludes(other.type)) { - if (!copy2) - copy2 = set.slice(0, i); - } else if (other.type.excludes(this.type)) { - return set; - } else { - if (!placed && other.type.rank > this.type.rank) { - if (!copy2) - copy2 = set.slice(0, i); - copy2.push(this); - placed = true; - } - if (copy2) - copy2.push(other); - } - } - if (!copy2) - copy2 = set.slice(); - if (!placed) - copy2.push(this); - return copy2; - } - /** - Remove this mark from the given set, returning a new set. If this - mark is not in the set, the set itself is returned. - */ - removeFromSet(set) { - for (let i = 0; i < set.length; i++) - if (this.eq(set[i])) - return set.slice(0, i).concat(set.slice(i + 1)); - return set; - } - /** - Test whether this mark is in the given set of marks. - */ - isInSet(set) { - for (let i = 0; i < set.length; i++) - if (this.eq(set[i])) - return true; - return false; - } - /** - Test whether this mark has the same type and attributes as - another mark. - */ - eq(other) { - return this == other || this.type == other.type && compareDeep(this.attrs, other.attrs); - } - /** - Convert this mark to a JSON-serializeable representation. - */ - toJSON() { - let obj = { type: this.type.name }; - for (let _ in this.attrs) { - obj.attrs = this.attrs; - break; - } - return obj; - } - /** - Deserialize a mark from JSON. - */ - static fromJSON(schema, json2) { - if (!json2) - throw new RangeError("Invalid input for Mark.fromJSON"); - let type = schema.marks[json2.type]; - if (!type) - throw new RangeError(`There is no mark type ${json2.type} in this schema`); - return type.create(json2.attrs); - } - /** - Test whether two sets of marks are identical. - */ - static sameSet(a, b) { - if (a == b) - return true; - if (a.length != b.length) - return false; - for (let i = 0; i < a.length; i++) - if (!a[i].eq(b[i])) - return false; - return true; - } - /** - Create a properly sorted mark set from null, a single mark, or an - unsorted array of marks. - */ - static setFrom(marks) { - if (!marks || Array.isArray(marks) && marks.length == 0) - return _Mark.none; - if (marks instanceof _Mark) - return [marks]; - let copy2 = marks.slice(); - copy2.sort((a, b) => a.type.rank - b.type.rank); - return copy2; - } -}; -Mark.none = []; -var ReplaceError = class extends Error { -}; -var Slice = class _Slice { - /** - Create a slice. When specifying a non-zero open depth, you must - make sure that there are nodes of at least that depth at the - appropriate side of the fragment—i.e. if the fragment is an - empty paragraph node, `openStart` and `openEnd` can't be greater - than 1. - - It is not necessary for the content of open nodes to conform to - the schema's content constraints, though it should be a valid - start/end/middle for such a node, depending on which sides are - open. - */ - constructor(content, openStart, openEnd) { - this.content = content; - this.openStart = openStart; - this.openEnd = openEnd; - } - /** - The size this slice would add when inserted into a document. - */ - get size() { - return this.content.size - this.openStart - this.openEnd; - } - /** - @internal - */ - insertAt(pos, fragment) { - let content = insertInto(this.content, pos + this.openStart, fragment); - return content && new _Slice(content, this.openStart, this.openEnd); - } - /** - @internal - */ - removeBetween(from2, to) { - return new _Slice(removeRange(this.content, from2 + this.openStart, to + this.openStart), this.openStart, this.openEnd); - } - /** - Tests whether this slice is equal to another slice. - */ - eq(other) { - return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd; - } - /** - @internal - */ - toString() { - return this.content + "(" + this.openStart + "," + this.openEnd + ")"; - } - /** - Convert a slice to a JSON-serializable representation. - */ - toJSON() { - if (!this.content.size) - return null; - let json2 = { content: this.content.toJSON() }; - if (this.openStart > 0) - json2.openStart = this.openStart; - if (this.openEnd > 0) - json2.openEnd = this.openEnd; - return json2; - } - /** - Deserialize a slice from its JSON representation. - */ - static fromJSON(schema, json2) { - if (!json2) - return _Slice.empty; - let openStart = json2.openStart || 0, openEnd = json2.openEnd || 0; - if (typeof openStart != "number" || typeof openEnd != "number") - throw new RangeError("Invalid input for Slice.fromJSON"); - return new _Slice(Fragment.fromJSON(schema, json2.content), openStart, openEnd); - } - /** - Create a slice from a fragment by taking the maximum possible - open value on both side of the fragment. - */ - static maxOpen(fragment, openIsolating = true) { - let openStart = 0, openEnd = 0; - for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild) - openStart++; - for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild) - openEnd++; - return new _Slice(fragment, openStart, openEnd); - } -}; -Slice.empty = new Slice(Fragment.empty, 0, 0); -function removeRange(content, from2, to) { - let { index, offset: offset2 } = content.findIndex(from2), child = content.maybeChild(index); - let { index: indexTo, offset: offsetTo } = content.findIndex(to); - if (offset2 == from2 || child.isText) { - if (offsetTo != to && !content.child(indexTo).isText) - throw new RangeError("Removing non-flat range"); - return content.cut(0, from2).append(content.cut(to)); - } - if (index != indexTo) - throw new RangeError("Removing non-flat range"); - return content.replaceChild(index, child.copy(removeRange(child.content, from2 - offset2 - 1, to - offset2 - 1))); -} -function insertInto(content, dist, insert, parent) { - let { index, offset: offset2 } = content.findIndex(dist), child = content.maybeChild(index); - if (offset2 == dist || child.isText) { - if (parent && !parent.canReplace(index, index, insert)) - return null; - return content.cut(0, dist).append(insert).append(content.cut(dist)); - } - let inner = insertInto(child.content, dist - offset2 - 1, insert); - return inner && content.replaceChild(index, child.copy(inner)); -} -function replace($from, $to, slice2) { - if (slice2.openStart > $from.depth) - throw new ReplaceError("Inserted content deeper than insertion position"); - if ($from.depth - slice2.openStart != $to.depth - slice2.openEnd) - throw new ReplaceError("Inconsistent open depths"); - return replaceOuter($from, $to, slice2, 0); -} -function replaceOuter($from, $to, slice2, depth) { - let index = $from.index(depth), node = $from.node(depth); - if (index == $to.index(depth) && depth < $from.depth - slice2.openStart) { - let inner = replaceOuter($from, $to, slice2, depth + 1); - return node.copy(node.content.replaceChild(index, inner)); - } else if (!slice2.content.size) { - return close(node, replaceTwoWay($from, $to, depth)); - } else if (!slice2.openStart && !slice2.openEnd && $from.depth == depth && $to.depth == depth) { - let parent = $from.parent, content = parent.content; - return close(parent, content.cut(0, $from.parentOffset).append(slice2.content).append(content.cut($to.parentOffset))); - } else { - let { start: start2, end: end2 } = prepareSliceForReplace(slice2, $from); - return close(node, replaceThreeWay($from, start2, end2, $to, depth)); - } -} -function checkJoin(main2, sub) { - if (!sub.type.compatibleContent(main2.type)) - throw new ReplaceError("Cannot join " + sub.type.name + " onto " + main2.type.name); -} -function joinable($before, $after, depth) { - let node = $before.node(depth); - checkJoin(node, $after.node(depth)); - return node; -} -function addNode(child, target) { - let last = target.length - 1; - if (last >= 0 && child.isText && child.sameMarkup(target[last])) - target[last] = child.withText(target[last].text + child.text); - else - target.push(child); -} -function addRange($start, $end, depth, target) { - let node = ($end || $start).node(depth); - let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount; - if ($start) { - startIndex = $start.index(depth); - if ($start.depth > depth) { - startIndex++; - } else if ($start.textOffset) { - addNode($start.nodeAfter, target); - startIndex++; - } - } - for (let i = startIndex; i < endIndex; i++) - addNode(node.child(i), target); - if ($end && $end.depth == depth && $end.textOffset) - addNode($end.nodeBefore, target); -} -function close(node, content) { - node.type.checkContent(content); - return node.copy(content); -} -function replaceThreeWay($from, $start, $end, $to, depth) { - let openStart = $from.depth > depth && joinable($from, $start, depth + 1); - let openEnd = $to.depth > depth && joinable($end, $to, depth + 1); - let content = []; - addRange(null, $from, depth, content); - if (openStart && openEnd && $start.index(depth) == $end.index(depth)) { - checkJoin(openStart, openEnd); - addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content); - } else { - if (openStart) - addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content); - addRange($start, $end, depth, content); - if (openEnd) - addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content); - } - addRange($to, null, depth, content); - return new Fragment(content); -} -function replaceTwoWay($from, $to, depth) { - let content = []; - addRange(null, $from, depth, content); - if ($from.depth > depth) { - let type = joinable($from, $to, depth + 1); - addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content); - } - addRange($to, null, depth, content); - return new Fragment(content); -} -function prepareSliceForReplace(slice2, $along) { - let extra = $along.depth - slice2.openStart, parent = $along.node(extra); - let node = parent.copy(slice2.content); - for (let i = extra - 1; i >= 0; i--) - node = $along.node(i).copy(Fragment.from(node)); - return { - start: node.resolveNoCache(slice2.openStart + extra), - end: node.resolveNoCache(node.content.size - slice2.openEnd - extra) - }; -} -var ResolvedPos = class _ResolvedPos { - /** - @internal - */ - constructor(pos, path, parentOffset) { - this.pos = pos; - this.path = path; - this.parentOffset = parentOffset; - this.depth = path.length / 3 - 1; - } - /** - @internal - */ - resolveDepth(val) { - if (val == null) - return this.depth; - if (val < 0) - return this.depth + val; - return val; - } - /** - The parent node that the position points into. Note that even if - a position points into a text node, that node is not considered - the parent—text nodes are ‘flat’ in this model, and have no content. - */ - get parent() { - return this.node(this.depth); - } - /** - The root node in which the position was resolved. - */ - get doc() { - return this.node(0); - } - /** - The ancestor node at the given level. `p.node(p.depth)` is the - same as `p.parent`. - */ - node(depth) { - return this.path[this.resolveDepth(depth) * 3]; - } - /** - The index into the ancestor at the given level. If this points - at the 3rd node in the 2nd paragraph on the top level, for - example, `p.index(0)` is 1 and `p.index(1)` is 2. - */ - index(depth) { - return this.path[this.resolveDepth(depth) * 3 + 1]; - } - /** - The index pointing after this position into the ancestor at the - given level. - */ - indexAfter(depth) { - depth = this.resolveDepth(depth); - return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1); - } - /** - The (absolute) position at the start of the node at the given - level. - */ - start(depth) { - depth = this.resolveDepth(depth); - return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1; - } - /** - The (absolute) position at the end of the node at the given - level. - */ - end(depth) { - depth = this.resolveDepth(depth); - return this.start(depth) + this.node(depth).content.size; - } - /** - The (absolute) position directly before the wrapping node at the - given level, or, when `depth` is `this.depth + 1`, the original - position. - */ - before(depth) { - depth = this.resolveDepth(depth); - if (!depth) - throw new RangeError("There is no position before the top-level node"); - return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1]; - } - /** - The (absolute) position directly after the wrapping node at the - given level, or the original position when `depth` is `this.depth + 1`. - */ - after(depth) { - depth = this.resolveDepth(depth); - if (!depth) - throw new RangeError("There is no position after the top-level node"); - return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize; - } - /** - When this position points into a text node, this returns the - distance between the position and the start of the text node. - Will be zero for positions that point between nodes. - */ - get textOffset() { - return this.pos - this.path[this.path.length - 1]; - } - /** - Get the node directly after the position, if any. If the position - points into a text node, only the part of that node after the - position is returned. - */ - get nodeAfter() { - let parent = this.parent, index = this.index(this.depth); - if (index == parent.childCount) - return null; - let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index); - return dOff ? parent.child(index).cut(dOff) : child; - } - /** - Get the node directly before the position, if any. If the - position points into a text node, only the part of that node - before the position is returned. - */ - get nodeBefore() { - let index = this.index(this.depth); - let dOff = this.pos - this.path[this.path.length - 1]; - if (dOff) - return this.parent.child(index).cut(0, dOff); - return index == 0 ? null : this.parent.child(index - 1); - } - /** - Get the position at the given index in the parent node at the - given depth (which defaults to `this.depth`). - */ - posAtIndex(index, depth) { - depth = this.resolveDepth(depth); - let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1; - for (let i = 0; i < index; i++) - pos += node.child(i).nodeSize; - return pos; - } - /** - Get the marks at this position, factoring in the surrounding - marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the - position is at the start of a non-empty node, the marks of the - node after it (if any) are returned. - */ - marks() { - let parent = this.parent, index = this.index(); - if (parent.content.size == 0) - return Mark.none; - if (this.textOffset) - return parent.child(index).marks; - let main2 = parent.maybeChild(index - 1), other = parent.maybeChild(index); - if (!main2) { - let tmp = main2; - main2 = other; - other = tmp; - } - let marks = main2.marks; - for (var i = 0; i < marks.length; i++) - if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks))) - marks = marks[i--].removeFromSet(marks); - return marks; - } - /** - Get the marks after the current position, if any, except those - that are non-inclusive and not present at position `$end`. This - is mostly useful for getting the set of marks to preserve after a - deletion. Will return `null` if this position is at the end of - its parent node or its parent node isn't a textblock (in which - case no marks should be preserved). - */ - marksAcross($end) { - let after = this.parent.maybeChild(this.index()); - if (!after || !after.isInline) - return null; - let marks = after.marks, next = $end.parent.maybeChild($end.index()); - for (var i = 0; i < marks.length; i++) - if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks))) - marks = marks[i--].removeFromSet(marks); - return marks; - } - /** - The depth up to which this position and the given (non-resolved) - position share the same parent nodes. - */ - sharedDepth(pos) { - for (let depth = this.depth; depth > 0; depth--) - if (this.start(depth) <= pos && this.end(depth) >= pos) - return depth; - return 0; - } - /** - Returns a range based on the place where this position and the - given position diverge around block content. If both point into - the same textblock, for example, a range around that textblock - will be returned. If they point into different blocks, the range - around those blocks in their shared ancestor is returned. You can - pass in an optional predicate that will be called with a parent - node to see if a range into that parent is acceptable. - */ - blockRange(other = this, pred) { - if (other.pos < this.pos) - return other.blockRange(this); - for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--) - if (other.pos <= this.end(d) && (!pred || pred(this.node(d)))) - return new NodeRange(this, other, d); - return null; - } - /** - Query whether the given position shares the same parent node. - */ - sameParent(other) { - return this.pos - this.parentOffset == other.pos - other.parentOffset; - } - /** - Return the greater of this and the given position. - */ - max(other) { - return other.pos > this.pos ? other : this; - } - /** - Return the smaller of this and the given position. - */ - min(other) { - return other.pos < this.pos ? other : this; - } - /** - @internal - */ - toString() { - let str = ""; - for (let i = 1; i <= this.depth; i++) - str += (str ? "/" : "") + this.node(i).type.name + "_" + this.index(i - 1); - return str + ":" + this.parentOffset; - } - /** - @internal - */ - static resolve(doc3, pos) { - if (!(pos >= 0 && pos <= doc3.content.size)) - throw new RangeError("Position " + pos + " out of range"); - let path = []; - let start2 = 0, parentOffset = pos; - for (let node = doc3; ; ) { - let { index, offset: offset2 } = node.content.findIndex(parentOffset); - let rem = parentOffset - offset2; - path.push(node, index, start2 + offset2); - if (!rem) - break; - node = node.child(index); - if (node.isText) - break; - parentOffset = rem - 1; - start2 += offset2 + 1; - } - return new _ResolvedPos(pos, path, parentOffset); - } - /** - @internal - */ - static resolveCached(doc3, pos) { - for (let i = 0; i < resolveCache.length; i++) { - let cached = resolveCache[i]; - if (cached.pos == pos && cached.doc == doc3) - return cached; - } - let result = resolveCache[resolveCachePos] = _ResolvedPos.resolve(doc3, pos); - resolveCachePos = (resolveCachePos + 1) % resolveCacheSize; - return result; - } -}; -var resolveCache = []; -var resolveCachePos = 0; -var resolveCacheSize = 12; -var NodeRange = class { - /** - Construct a node range. `$from` and `$to` should point into the - same node until at least the given `depth`, since a node range - denotes an adjacent set of nodes in a single parent node. - */ - constructor($from, $to, depth) { - this.$from = $from; - this.$to = $to; - this.depth = depth; - } - /** - The position at the start of the range. - */ - get start() { - return this.$from.before(this.depth + 1); - } - /** - The position at the end of the range. - */ - get end() { - return this.$to.after(this.depth + 1); - } - /** - The parent node that the range points into. - */ - get parent() { - return this.$from.node(this.depth); - } - /** - The start index of the range in the parent node. - */ - get startIndex() { - return this.$from.index(this.depth); - } - /** - The end index of the range in the parent node. - */ - get endIndex() { - return this.$to.indexAfter(this.depth); - } -}; -var emptyAttrs = /* @__PURE__ */ Object.create(null); -var Node = class _Node { - /** - @internal - */ - constructor(type, attrs, content, marks = Mark.none) { - this.type = type; - this.attrs = attrs; - this.marks = marks; - this.content = content || Fragment.empty; - } - /** - The size of this node, as defined by the integer-based [indexing - scheme](/docs/guide/#doc.indexing). For text nodes, this is the - amount of characters. For other leaf nodes, it is one. For - non-leaf nodes, it is the size of the content plus two (the - start and end token). - */ - get nodeSize() { - return this.isLeaf ? 1 : 2 + this.content.size; - } - /** - The number of children that the node has. - */ - get childCount() { - return this.content.childCount; - } - /** - Get the child node at the given index. Raises an error when the - index is out of range. - */ - child(index) { - return this.content.child(index); - } - /** - Get the child node at the given index, if it exists. - */ - maybeChild(index) { - return this.content.maybeChild(index); - } - /** - Call `f` for every child node, passing the node, its offset - into this parent node, and its index. - */ - forEach(f) { - this.content.forEach(f); - } - /** - Invoke a callback for all descendant nodes recursively between - the given two positions that are relative to start of this - node's content. The callback is invoked with the node, its - position relative to the original node (method receiver), - its parent node, and its child index. When the callback returns - false for a given node, that node's children will not be - recursed over. The last parameter can be used to specify a - starting position to count from. - */ - nodesBetween(from2, to, f, startPos = 0) { - this.content.nodesBetween(from2, to, f, startPos, this); - } - /** - Call the given callback for every descendant node. Doesn't - descend into a node when the callback returns `false`. - */ - descendants(f) { - this.nodesBetween(0, this.content.size, f); - } - /** - Concatenates all the text nodes found in this fragment and its - children. - */ - get textContent() { - return this.isLeaf && this.type.spec.leafText ? this.type.spec.leafText(this) : this.textBetween(0, this.content.size, ""); - } - /** - Get all text between positions `from` and `to`. When - `blockSeparator` is given, it will be inserted to separate text - from different block nodes. If `leafText` is given, it'll be - inserted for every non-text leaf node encountered, otherwise - [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec^leafText) will be used. - */ - textBetween(from2, to, blockSeparator, leafText) { - return this.content.textBetween(from2, to, blockSeparator, leafText); - } - /** - Returns this node's first child, or `null` if there are no - children. - */ - get firstChild() { - return this.content.firstChild; - } - /** - Returns this node's last child, or `null` if there are no - children. - */ - get lastChild() { - return this.content.lastChild; - } - /** - Test whether two nodes represent the same piece of document. - */ - eq(other) { - return this == other || this.sameMarkup(other) && this.content.eq(other.content); - } - /** - Compare the markup (type, attributes, and marks) of this node to - those of another. Returns `true` if both have the same markup. - */ - sameMarkup(other) { - return this.hasMarkup(other.type, other.attrs, other.marks); - } - /** - Check whether this node's markup correspond to the given type, - attributes, and marks. - */ - hasMarkup(type, attrs, marks) { - return this.type == type && compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) && Mark.sameSet(this.marks, marks || Mark.none); - } - /** - Create a new node with the same markup as this node, containing - the given content (or empty, if no content is given). - */ - copy(content = null) { - if (content == this.content) - return this; - return new _Node(this.type, this.attrs, content, this.marks); - } - /** - Create a copy of this node, with the given set of marks instead - of the node's own marks. - */ - mark(marks) { - return marks == this.marks ? this : new _Node(this.type, this.attrs, this.content, marks); - } - /** - Create a copy of this node with only the content between the - given positions. If `to` is not given, it defaults to the end of - the node. - */ - cut(from2, to = this.content.size) { - if (from2 == 0 && to == this.content.size) - return this; - return this.copy(this.content.cut(from2, to)); - } - /** - Cut out the part of the document between the given positions, and - return it as a `Slice` object. - */ - slice(from2, to = this.content.size, includeParents = false) { - if (from2 == to) - return Slice.empty; - let $from = this.resolve(from2), $to = this.resolve(to); - let depth = includeParents ? 0 : $from.sharedDepth(to); - let start2 = $from.start(depth), node = $from.node(depth); - let content = node.content.cut($from.pos - start2, $to.pos - start2); - return new Slice(content, $from.depth - depth, $to.depth - depth); - } - /** - Replace the part of the document between the given positions with - the given slice. The slice must 'fit', meaning its open sides - must be able to connect to the surrounding content, and its - content nodes must be valid children for the node they are placed - into. If any of this is violated, an error of type - [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown. - */ - replace(from2, to, slice2) { - return replace(this.resolve(from2), this.resolve(to), slice2); - } - /** - Find the node directly after the given position. - */ - nodeAt(pos) { - for (let node = this; ; ) { - let { index, offset: offset2 } = node.content.findIndex(pos); - node = node.maybeChild(index); - if (!node) - return null; - if (offset2 == pos || node.isText) - return node; - pos -= offset2 + 1; - } - } - /** - Find the (direct) child node after the given offset, if any, - and return it along with its index and offset relative to this - node. - */ - childAfter(pos) { - let { index, offset: offset2 } = this.content.findIndex(pos); - return { node: this.content.maybeChild(index), index, offset: offset2 }; - } - /** - Find the (direct) child node before the given offset, if any, - and return it along with its index and offset relative to this - node. - */ - childBefore(pos) { - if (pos == 0) - return { node: null, index: 0, offset: 0 }; - let { index, offset: offset2 } = this.content.findIndex(pos); - if (offset2 < pos) - return { node: this.content.child(index), index, offset: offset2 }; - let node = this.content.child(index - 1); - return { node, index: index - 1, offset: offset2 - node.nodeSize }; - } - /** - Resolve the given position in the document, returning an - [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context. - */ - resolve(pos) { - return ResolvedPos.resolveCached(this, pos); - } - /** - @internal - */ - resolveNoCache(pos) { - return ResolvedPos.resolve(this, pos); - } - /** - Test whether a given mark or mark type occurs in this document - between the two given positions. - */ - rangeHasMark(from2, to, type) { - let found2 = false; - if (to > from2) - this.nodesBetween(from2, to, (node) => { - if (type.isInSet(node.marks)) - found2 = true; - return !found2; - }); - return found2; - } - /** - True when this is a block (non-inline node) - */ - get isBlock() { - return this.type.isBlock; - } - /** - True when this is a textblock node, a block node with inline - content. - */ - get isTextblock() { - return this.type.isTextblock; - } - /** - True when this node allows inline content. - */ - get inlineContent() { - return this.type.inlineContent; - } - /** - True when this is an inline node (a text node or a node that can - appear among text). - */ - get isInline() { - return this.type.isInline; - } - /** - True when this is a text node. - */ - get isText() { - return this.type.isText; - } - /** - True when this is a leaf node. - */ - get isLeaf() { - return this.type.isLeaf; - } - /** - True when this is an atom, i.e. when it does not have directly - editable content. This is usually the same as `isLeaf`, but can - be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom) - on a node's spec (typically used when the node is displayed as - an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)). - */ - get isAtom() { - return this.type.isAtom; - } - /** - Return a string representation of this node for debugging - purposes. - */ - toString() { - if (this.type.spec.toDebugString) - return this.type.spec.toDebugString(this); - let name = this.type.name; - if (this.content.size) - name += "(" + this.content.toStringInner() + ")"; - return wrapMarks(this.marks, name); - } - /** - Get the content match in this node at the given index. - */ - contentMatchAt(index) { - let match = this.type.contentMatch.matchFragment(this.content, 0, index); - if (!match) - throw new Error("Called contentMatchAt on a node with invalid content"); - return match; - } - /** - Test whether replacing the range between `from` and `to` (by - child index) with the given replacement fragment (which defaults - to the empty fragment) would leave the node's content valid. You - can optionally pass `start` and `end` indices into the - replacement fragment. - */ - canReplace(from2, to, replacement = Fragment.empty, start2 = 0, end2 = replacement.childCount) { - let one = this.contentMatchAt(from2).matchFragment(replacement, start2, end2); - let two = one && one.matchFragment(this.content, to); - if (!two || !two.validEnd) - return false; - for (let i = start2; i < end2; i++) - if (!this.type.allowsMarks(replacement.child(i).marks)) - return false; - return true; - } - /** - Test whether replacing the range `from` to `to` (by index) with - a node of the given type would leave the node's content valid. - */ - canReplaceWith(from2, to, type, marks) { - if (marks && !this.type.allowsMarks(marks)) - return false; - let start2 = this.contentMatchAt(from2).matchType(type); - let end2 = start2 && start2.matchFragment(this.content, to); - return end2 ? end2.validEnd : false; - } - /** - Test whether the given node's content could be appended to this - node. If that node is empty, this will only return true if there - is at least one node type that can appear in both nodes (to avoid - merging completely incompatible nodes). - */ - canAppend(other) { - if (other.content.size) - return this.canReplace(this.childCount, this.childCount, other.content); - else - return this.type.compatibleContent(other.type); - } - /** - Check whether this node and its descendants conform to the - schema, and raise error when they do not. - */ - check() { - this.type.checkContent(this.content); - let copy2 = Mark.none; - for (let i = 0; i < this.marks.length; i++) - copy2 = this.marks[i].addToSet(copy2); - if (!Mark.sameSet(copy2, this.marks)) - throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map((m) => m.type.name)}`); - this.content.forEach((node) => node.check()); - } - /** - Return a JSON-serializeable representation of this node. - */ - toJSON() { - let obj = { type: this.type.name }; - for (let _ in this.attrs) { - obj.attrs = this.attrs; - break; - } - if (this.content.size) - obj.content = this.content.toJSON(); - if (this.marks.length) - obj.marks = this.marks.map((n) => n.toJSON()); - return obj; - } - /** - Deserialize a node from its JSON representation. - */ - static fromJSON(schema, json2) { - if (!json2) - throw new RangeError("Invalid input for Node.fromJSON"); - let marks = null; - if (json2.marks) { - if (!Array.isArray(json2.marks)) - throw new RangeError("Invalid mark data for Node.fromJSON"); - marks = json2.marks.map(schema.markFromJSON); - } - if (json2.type == "text") { - if (typeof json2.text != "string") - throw new RangeError("Invalid text node in JSON"); - return schema.text(json2.text, marks); - } - let content = Fragment.fromJSON(schema, json2.content); - return schema.nodeType(json2.type).create(json2.attrs, content, marks); - } -}; -Node.prototype.text = void 0; -var TextNode = class _TextNode extends Node { - /** - @internal - */ - constructor(type, attrs, content, marks) { - super(type, attrs, null, marks); - if (!content) - throw new RangeError("Empty text nodes are not allowed"); - this.text = content; - } - toString() { - if (this.type.spec.toDebugString) - return this.type.spec.toDebugString(this); - return wrapMarks(this.marks, JSON.stringify(this.text)); - } - get textContent() { - return this.text; - } - textBetween(from2, to) { - return this.text.slice(from2, to); - } - get nodeSize() { - return this.text.length; - } - mark(marks) { - return marks == this.marks ? this : new _TextNode(this.type, this.attrs, this.text, marks); - } - withText(text) { - if (text == this.text) - return this; - return new _TextNode(this.type, this.attrs, text, this.marks); - } - cut(from2 = 0, to = this.text.length) { - if (from2 == 0 && to == this.text.length) - return this; - return this.withText(this.text.slice(from2, to)); - } - eq(other) { - return this.sameMarkup(other) && this.text == other.text; - } - toJSON() { - let base2 = super.toJSON(); - base2.text = this.text; - return base2; - } -}; -function wrapMarks(marks, str) { - for (let i = marks.length - 1; i >= 0; i--) - str = marks[i].type.name + "(" + str + ")"; - return str; -} -var ContentMatch = class _ContentMatch { - /** - @internal - */ - constructor(validEnd) { - this.validEnd = validEnd; - this.next = []; - this.wrapCache = []; - } - /** - @internal - */ - static parse(string, nodeTypes) { - let stream = new TokenStream(string, nodeTypes); - if (stream.next == null) - return _ContentMatch.empty; - let expr = parseExpr(stream); - if (stream.next) - stream.err("Unexpected trailing text"); - let match = dfa(nfa(expr)); - checkForDeadEnds(match, stream); - return match; - } - /** - Match a node type, returning a match after that node if - successful. - */ - matchType(type) { - for (let i = 0; i < this.next.length; i++) - if (this.next[i].type == type) - return this.next[i].next; - return null; - } - /** - Try to match a fragment. Returns the resulting match when - successful. - */ - matchFragment(frag, start2 = 0, end2 = frag.childCount) { - let cur = this; - for (let i = start2; cur && i < end2; i++) - cur = cur.matchType(frag.child(i).type); - return cur; - } - /** - @internal - */ - get inlineContent() { - return this.next.length != 0 && this.next[0].type.isInline; - } - /** - Get the first matching node type at this match position that can - be generated. - */ - get defaultType() { - for (let i = 0; i < this.next.length; i++) { - let { type } = this.next[i]; - if (!(type.isText || type.hasRequiredAttrs())) - return type; - } - return null; - } - /** - @internal - */ - compatible(other) { - for (let i = 0; i < this.next.length; i++) - for (let j = 0; j < other.next.length; j++) - if (this.next[i].type == other.next[j].type) - return true; - return false; - } - /** - Try to match the given fragment, and if that fails, see if it can - be made to match by inserting nodes in front of it. When - successful, return a fragment of inserted nodes (which may be - empty if nothing had to be inserted). When `toEnd` is true, only - return a fragment if the resulting match goes to the end of the - content expression. - */ - fillBefore(after, toEnd = false, startIndex = 0) { - let seen = [this]; - function search(match, types) { - let finished = match.matchFragment(after, startIndex); - if (finished && (!toEnd || finished.validEnd)) - return Fragment.from(types.map((tp) => tp.createAndFill())); - for (let i = 0; i < match.next.length; i++) { - let { type, next } = match.next[i]; - if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) { - seen.push(next); - let found2 = search(next, types.concat(type)); - if (found2) - return found2; - } - } - return null; - } - return search(this, []); - } - /** - Find a set of wrapping node types that would allow a node of the - given type to appear at this position. The result may be empty - (when it fits directly) and will be null when no such wrapping - exists. - */ - findWrapping(target) { - for (let i = 0; i < this.wrapCache.length; i += 2) - if (this.wrapCache[i] == target) - return this.wrapCache[i + 1]; - let computed = this.computeWrapping(target); - this.wrapCache.push(target, computed); - return computed; - } - /** - @internal - */ - computeWrapping(target) { - let seen = /* @__PURE__ */ Object.create(null), active = [{ match: this, type: null, via: null }]; - while (active.length) { - let current = active.shift(), match = current.match; - if (match.matchType(target)) { - let result = []; - for (let obj = current; obj.type; obj = obj.via) - result.push(obj.type); - return result.reverse(); - } - for (let i = 0; i < match.next.length; i++) { - let { type, next } = match.next[i]; - if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) { - active.push({ match: type.contentMatch, type, via: current }); - seen[type.name] = true; - } - } - } - return null; - } - /** - The number of outgoing edges this node has in the finite - automaton that describes the content expression. - */ - get edgeCount() { - return this.next.length; - } - /** - Get the _n_​th outgoing edge from this node in the finite - automaton that describes the content expression. - */ - edge(n) { - if (n >= this.next.length) - throw new RangeError(`There's no ${n}th edge in this content match`); - return this.next[n]; - } - /** - @internal - */ - toString() { - let seen = []; - function scan(m) { - seen.push(m); - for (let i = 0; i < m.next.length; i++) - if (seen.indexOf(m.next[i].next) == -1) - scan(m.next[i].next); - } - scan(this); - return seen.map((m, i) => { - let out = i + (m.validEnd ? "*" : " ") + " "; - for (let i2 = 0; i2 < m.next.length; i2++) - out += (i2 ? ", " : "") + m.next[i2].type.name + "->" + seen.indexOf(m.next[i2].next); - return out; - }).join("\n"); - } -}; -ContentMatch.empty = new ContentMatch(true); -var TokenStream = class { - constructor(string, nodeTypes) { - this.string = string; - this.nodeTypes = nodeTypes; - this.inline = null; - this.pos = 0; - this.tokens = string.split(/\s*(?=\b|\W|$)/); - if (this.tokens[this.tokens.length - 1] == "") - this.tokens.pop(); - if (this.tokens[0] == "") - this.tokens.shift(); - } - get next() { - return this.tokens[this.pos]; - } - eat(tok) { - return this.next == tok && (this.pos++ || true); - } - err(str) { - throw new SyntaxError(str + " (in content expression '" + this.string + "')"); - } -}; -function parseExpr(stream) { - let exprs = []; - do { - exprs.push(parseExprSeq(stream)); - } while (stream.eat("|")); - return exprs.length == 1 ? exprs[0] : { type: "choice", exprs }; -} -function parseExprSeq(stream) { - let exprs = []; - do { - exprs.push(parseExprSubscript(stream)); - } while (stream.next && stream.next != ")" && stream.next != "|"); - return exprs.length == 1 ? exprs[0] : { type: "seq", exprs }; -} -function parseExprSubscript(stream) { - let expr = parseExprAtom(stream); - for (; ; ) { - if (stream.eat("+")) - expr = { type: "plus", expr }; - else if (stream.eat("*")) - expr = { type: "star", expr }; - else if (stream.eat("?")) - expr = { type: "opt", expr }; - else if (stream.eat("{")) - expr = parseExprRange(stream, expr); - else - break; - } - return expr; -} -function parseNum(stream) { - if (/\D/.test(stream.next)) - stream.err("Expected number, got '" + stream.next + "'"); - let result = Number(stream.next); - stream.pos++; - return result; -} -function parseExprRange(stream, expr) { - let min2 = parseNum(stream), max2 = min2; - if (stream.eat(",")) { - if (stream.next != "}") - max2 = parseNum(stream); - else - max2 = -1; - } - if (!stream.eat("}")) - stream.err("Unclosed braced range"); - return { type: "range", min: min2, max: max2, expr }; -} -function resolveName(stream, name) { - let types = stream.nodeTypes, type = types[name]; - if (type) - return [type]; - let result = []; - for (let typeName in types) { - let type2 = types[typeName]; - if (type2.groups.indexOf(name) > -1) - result.push(type2); - } - if (result.length == 0) - stream.err("No node type or group '" + name + "' found"); - return result; -} -function parseExprAtom(stream) { - if (stream.eat("(")) { - let expr = parseExpr(stream); - if (!stream.eat(")")) - stream.err("Missing closing paren"); - return expr; - } else if (!/\W/.test(stream.next)) { - let exprs = resolveName(stream, stream.next).map((type) => { - if (stream.inline == null) - stream.inline = type.isInline; - else if (stream.inline != type.isInline) - stream.err("Mixing inline and block content"); - return { type: "name", value: type }; - }); - stream.pos++; - return exprs.length == 1 ? exprs[0] : { type: "choice", exprs }; - } else { - stream.err("Unexpected token '" + stream.next + "'"); - } -} -function nfa(expr) { - let nfa2 = [[]]; - connect(compile(expr, 0), node()); - return nfa2; - function node() { - return nfa2.push([]) - 1; - } - function edge(from2, to, term) { - let edge2 = { term, to }; - nfa2[from2].push(edge2); - return edge2; - } - function connect(edges, to) { - edges.forEach((edge2) => edge2.to = to); - } - function compile(expr2, from2) { - if (expr2.type == "choice") { - return expr2.exprs.reduce((out, expr3) => out.concat(compile(expr3, from2)), []); - } else if (expr2.type == "seq") { - for (let i = 0; ; i++) { - let next = compile(expr2.exprs[i], from2); - if (i == expr2.exprs.length - 1) - return next; - connect(next, from2 = node()); - } - } else if (expr2.type == "star") { - let loop = node(); - edge(from2, loop); - connect(compile(expr2.expr, loop), loop); - return [edge(loop)]; - } else if (expr2.type == "plus") { - let loop = node(); - connect(compile(expr2.expr, from2), loop); - connect(compile(expr2.expr, loop), loop); - return [edge(loop)]; - } else if (expr2.type == "opt") { - return [edge(from2)].concat(compile(expr2.expr, from2)); - } else if (expr2.type == "range") { - let cur = from2; - for (let i = 0; i < expr2.min; i++) { - let next = node(); - connect(compile(expr2.expr, cur), next); - cur = next; - } - if (expr2.max == -1) { - connect(compile(expr2.expr, cur), cur); - } else { - for (let i = expr2.min; i < expr2.max; i++) { - let next = node(); - edge(cur, next); - connect(compile(expr2.expr, cur), next); - cur = next; - } - } - return [edge(cur)]; - } else if (expr2.type == "name") { - return [edge(from2, void 0, expr2.value)]; - } else { - throw new Error("Unknown expr type"); - } - } -} -function cmp(a, b) { - return b - a; -} -function nullFrom(nfa2, node) { - let result = []; - scan(node); - return result.sort(cmp); - function scan(node2) { - let edges = nfa2[node2]; - if (edges.length == 1 && !edges[0].term) - return scan(edges[0].to); - result.push(node2); - for (let i = 0; i < edges.length; i++) { - let { term, to } = edges[i]; - if (!term && result.indexOf(to) == -1) - scan(to); - } - } -} -function dfa(nfa2) { - let labeled = /* @__PURE__ */ Object.create(null); - return explore(nullFrom(nfa2, 0)); - function explore(states) { - let out = []; - states.forEach((node) => { - nfa2[node].forEach(({ term, to }) => { - if (!term) - return; - let set; - for (let i = 0; i < out.length; i++) - if (out[i][0] == term) - set = out[i][1]; - nullFrom(nfa2, to).forEach((node2) => { - if (!set) - out.push([term, set = []]); - if (set.indexOf(node2) == -1) - set.push(node2); - }); - }); - }); - let state = labeled[states.join(",")] = new ContentMatch(states.indexOf(nfa2.length - 1) > -1); - for (let i = 0; i < out.length; i++) { - let states2 = out[i][1].sort(cmp); - state.next.push({ type: out[i][0], next: labeled[states2.join(",")] || explore(states2) }); - } - return state; - } -} -function checkForDeadEnds(match, stream) { - for (let i = 0, work = [match]; i < work.length; i++) { - let state = work[i], dead = !state.validEnd, nodes = []; - for (let j = 0; j < state.next.length; j++) { - let { type, next } = state.next[j]; - nodes.push(type.name); - if (dead && !(type.isText || type.hasRequiredAttrs())) - dead = false; - if (work.indexOf(next) == -1) - work.push(next); - } - if (dead) - stream.err("Only non-generatable nodes (" + nodes.join(", ") + ") in a required position (see https://prosemirror.net/docs/guide/#generatable)"); - } -} -function defaultAttrs(attrs) { - let defaults2 = /* @__PURE__ */ Object.create(null); - for (let attrName in attrs) { - let attr = attrs[attrName]; - if (!attr.hasDefault) - return null; - defaults2[attrName] = attr.default; - } - return defaults2; -} -function computeAttrs(attrs, value) { - let built = /* @__PURE__ */ Object.create(null); - for (let name in attrs) { - let given = value && value[name]; - if (given === void 0) { - let attr = attrs[name]; - if (attr.hasDefault) - given = attr.default; - else - throw new RangeError("No value supplied for attribute " + name); - } - built[name] = given; - } - return built; -} -function initAttrs(attrs) { - let result = /* @__PURE__ */ Object.create(null); - if (attrs) - for (let name in attrs) - result[name] = new Attribute(attrs[name]); - return result; -} -var NodeType = class _NodeType { - /** - @internal - */ - constructor(name, schema, spec) { - this.name = name; - this.schema = schema; - this.spec = spec; - this.markSet = null; - this.groups = spec.group ? spec.group.split(" ") : []; - this.attrs = initAttrs(spec.attrs); - this.defaultAttrs = defaultAttrs(this.attrs); - this.contentMatch = null; - this.inlineContent = null; - this.isBlock = !(spec.inline || name == "text"); - this.isText = name == "text"; - } - /** - True if this is an inline type. - */ - get isInline() { - return !this.isBlock; - } - /** - True if this is a textblock type, a block that contains inline - content. - */ - get isTextblock() { - return this.isBlock && this.inlineContent; - } - /** - True for node types that allow no content. - */ - get isLeaf() { - return this.contentMatch == ContentMatch.empty; - } - /** - True when this node is an atom, i.e. when it does not have - directly editable content. - */ - get isAtom() { - return this.isLeaf || !!this.spec.atom; - } - /** - The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option. - */ - get whitespace() { - return this.spec.whitespace || (this.spec.code ? "pre" : "normal"); - } - /** - Tells you whether this node type has any required attributes. - */ - hasRequiredAttrs() { - for (let n in this.attrs) - if (this.attrs[n].isRequired) - return true; - return false; - } - /** - Indicates whether this node allows some of the same content as - the given node type. - */ - compatibleContent(other) { - return this == other || this.contentMatch.compatible(other.contentMatch); - } - /** - @internal - */ - computeAttrs(attrs) { - if (!attrs && this.defaultAttrs) - return this.defaultAttrs; - else - return computeAttrs(this.attrs, attrs); - } - /** - Create a `Node` of this type. The given attributes are - checked and defaulted (you can pass `null` to use the type's - defaults entirely, if no required attributes exist). `content` - may be a `Fragment`, a node, an array of nodes, or - `null`. Similarly `marks` may be `null` to default to the empty - set of marks. - */ - create(attrs = null, content, marks) { - if (this.isText) - throw new Error("NodeType.create can't construct text nodes"); - return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks)); - } - /** - Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content - against the node type's content restrictions, and throw an error - if it doesn't match. - */ - createChecked(attrs = null, content, marks) { - content = Fragment.from(content); - this.checkContent(content); - return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks)); - } - /** - Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is - necessary to add nodes to the start or end of the given fragment - to make it fit the node. If no fitting wrapping can be found, - return null. Note that, due to the fact that required nodes can - always be created, this will always succeed if you pass null or - `Fragment.empty` as content. - */ - createAndFill(attrs = null, content, marks) { - attrs = this.computeAttrs(attrs); - content = Fragment.from(content); - if (content.size) { - let before = this.contentMatch.fillBefore(content); - if (!before) - return null; - content = before.append(content); - } - let matched = this.contentMatch.matchFragment(content); - let after = matched && matched.fillBefore(Fragment.empty, true); - if (!after) - return null; - return new Node(this, attrs, content.append(after), Mark.setFrom(marks)); - } - /** - Returns true if the given fragment is valid content for this node - type with the given attributes. - */ - validContent(content) { - let result = this.contentMatch.matchFragment(content); - if (!result || !result.validEnd) - return false; - for (let i = 0; i < content.childCount; i++) - if (!this.allowsMarks(content.child(i).marks)) - return false; - return true; - } - /** - Throws a RangeError if the given fragment is not valid content for this - node type. - @internal - */ - checkContent(content) { - if (!this.validContent(content)) - throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`); - } - /** - Check whether the given mark type is allowed in this node. - */ - allowsMarkType(markType) { - return this.markSet == null || this.markSet.indexOf(markType) > -1; - } - /** - Test whether the given set of marks are allowed in this node. - */ - allowsMarks(marks) { - if (this.markSet == null) - return true; - for (let i = 0; i < marks.length; i++) - if (!this.allowsMarkType(marks[i].type)) - return false; - return true; - } - /** - Removes the marks that are not allowed in this node from the given set. - */ - allowedMarks(marks) { - if (this.markSet == null) - return marks; - let copy2; - for (let i = 0; i < marks.length; i++) { - if (!this.allowsMarkType(marks[i].type)) { - if (!copy2) - copy2 = marks.slice(0, i); - } else if (copy2) { - copy2.push(marks[i]); - } - } - return !copy2 ? marks : copy2.length ? copy2 : Mark.none; - } - /** - @internal - */ - static compile(nodes, schema) { - let result = /* @__PURE__ */ Object.create(null); - nodes.forEach((name, spec) => result[name] = new _NodeType(name, schema, spec)); - let topType = schema.spec.topNode || "doc"; - if (!result[topType]) - throw new RangeError("Schema is missing its top node type ('" + topType + "')"); - if (!result.text) - throw new RangeError("Every schema needs a 'text' type"); - for (let _ in result.text.attrs) - throw new RangeError("The text node type should not have attributes"); - return result; - } -}; -var Attribute = class { - constructor(options) { - this.hasDefault = Object.prototype.hasOwnProperty.call(options, "default"); - this.default = options.default; - } - get isRequired() { - return !this.hasDefault; - } -}; -var MarkType = class _MarkType { - /** - @internal - */ - constructor(name, rank, schema, spec) { - this.name = name; - this.rank = rank; - this.schema = schema; - this.spec = spec; - this.attrs = initAttrs(spec.attrs); - this.excluded = null; - let defaults2 = defaultAttrs(this.attrs); - this.instance = defaults2 ? new Mark(this, defaults2) : null; - } - /** - Create a mark of this type. `attrs` may be `null` or an object - containing only some of the mark's attributes. The others, if - they have defaults, will be added. - */ - create(attrs = null) { - if (!attrs && this.instance) - return this.instance; - return new Mark(this, computeAttrs(this.attrs, attrs)); - } - /** - @internal - */ - static compile(marks, schema) { - let result = /* @__PURE__ */ Object.create(null), rank = 0; - marks.forEach((name, spec) => result[name] = new _MarkType(name, rank++, schema, spec)); - return result; - } - /** - When there is a mark of this type in the given set, a new set - without it is returned. Otherwise, the input set is returned. - */ - removeFromSet(set) { - for (var i = 0; i < set.length; i++) - if (set[i].type == this) { - set = set.slice(0, i).concat(set.slice(i + 1)); - i--; - } - return set; - } - /** - Tests whether there is a mark of this type in the given set. - */ - isInSet(set) { - for (let i = 0; i < set.length; i++) - if (set[i].type == this) - return set[i]; - } - /** - Queries whether a given mark type is - [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one. - */ - excludes(other) { - return this.excluded.indexOf(other) > -1; - } -}; -var Schema = class { - /** - Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec). - */ - constructor(spec) { - this.cached = /* @__PURE__ */ Object.create(null); - let instanceSpec = this.spec = {}; - for (let prop in spec) - instanceSpec[prop] = spec[prop]; - instanceSpec.nodes = dist_default.from(spec.nodes), instanceSpec.marks = dist_default.from(spec.marks || {}), this.nodes = NodeType.compile(this.spec.nodes, this); - this.marks = MarkType.compile(this.spec.marks, this); - let contentExprCache = /* @__PURE__ */ Object.create(null); - for (let prop in this.nodes) { - if (prop in this.marks) - throw new RangeError(prop + " can not be both a node and a mark"); - let type = this.nodes[prop], contentExpr = type.spec.content || "", markExpr = type.spec.marks; - type.contentMatch = contentExprCache[contentExpr] || (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes)); - type.inlineContent = type.contentMatch.inlineContent; - type.markSet = markExpr == "_" ? null : markExpr ? gatherMarks(this, markExpr.split(" ")) : markExpr == "" || !type.inlineContent ? [] : null; - } - for (let prop in this.marks) { - let type = this.marks[prop], excl = type.spec.excludes; - type.excluded = excl == null ? [type] : excl == "" ? [] : gatherMarks(this, excl.split(" ")); - } - this.nodeFromJSON = this.nodeFromJSON.bind(this); - this.markFromJSON = this.markFromJSON.bind(this); - this.topNodeType = this.nodes[this.spec.topNode || "doc"]; - this.cached.wrappings = /* @__PURE__ */ Object.create(null); - } - /** - Create a node in this schema. The `type` may be a string or a - `NodeType` instance. Attributes will be extended with defaults, - `content` may be a `Fragment`, `null`, a `Node`, or an array of - nodes. - */ - node(type, attrs = null, content, marks) { - if (typeof type == "string") - type = this.nodeType(type); - else if (!(type instanceof NodeType)) - throw new RangeError("Invalid node type: " + type); - else if (type.schema != this) - throw new RangeError("Node type from different schema used (" + type.name + ")"); - return type.createChecked(attrs, content, marks); - } - /** - Create a text node in the schema. Empty text nodes are not - allowed. - */ - text(text, marks) { - let type = this.nodes.text; - return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks)); - } - /** - Create a mark with the given type and attributes. - */ - mark(type, attrs) { - if (typeof type == "string") - type = this.marks[type]; - return type.create(attrs); - } - /** - Deserialize a node from its JSON representation. This method is - bound. - */ - nodeFromJSON(json2) { - return Node.fromJSON(this, json2); - } - /** - Deserialize a mark from its JSON representation. This method is - bound. - */ - markFromJSON(json2) { - return Mark.fromJSON(this, json2); - } - /** - @internal - */ - nodeType(name) { - let found2 = this.nodes[name]; - if (!found2) - throw new RangeError("Unknown node type: " + name); - return found2; - } -}; -function gatherMarks(schema, marks) { - let found2 = []; - for (let i = 0; i < marks.length; i++) { - let name = marks[i], mark = schema.marks[name], ok = mark; - if (mark) { - found2.push(mark); - } else { - for (let prop in schema.marks) { - let mark2 = schema.marks[prop]; - if (name == "_" || mark2.spec.group && mark2.spec.group.split(" ").indexOf(name) > -1) - found2.push(ok = mark2); - } - } - if (!ok) - throw new SyntaxError("Unknown mark type: '" + marks[i] + "'"); - } - return found2; -} -var DOMParser = class _DOMParser { - /** - Create a parser that targets the given schema, using the given - parsing rules. - */ - constructor(schema, rules) { - this.schema = schema; - this.rules = rules; - this.tags = []; - this.styles = []; - rules.forEach((rule) => { - if (rule.tag) - this.tags.push(rule); - else if (rule.style) - this.styles.push(rule); - }); - this.normalizeLists = !this.tags.some((r2) => { - if (!/^(ul|ol)\b/.test(r2.tag) || !r2.node) - return false; - let node = schema.nodes[r2.node]; - return node.contentMatch.matchType(node); - }); - } - /** - Parse a document from the content of a DOM node. - */ - parse(dom, options = {}) { - let context = new ParseContext(this, options, false); - context.addAll(dom, options.from, options.to); - return context.finish(); - } - /** - Parses the content of the given DOM node, like - [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of - options. But unlike that method, which produces a whole node, - this one returns a slice that is open at the sides, meaning that - the schema constraints aren't applied to the start of nodes to - the left of the input and the end of nodes at the end. - */ - parseSlice(dom, options = {}) { - let context = new ParseContext(this, options, true); - context.addAll(dom, options.from, options.to); - return Slice.maxOpen(context.finish()); - } - /** - @internal - */ - matchTag(dom, context, after) { - for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) { - let rule = this.tags[i]; - if (matches(dom, rule.tag) && (rule.namespace === void 0 || dom.namespaceURI == rule.namespace) && (!rule.context || context.matchesContext(rule.context))) { - if (rule.getAttrs) { - let result = rule.getAttrs(dom); - if (result === false) - continue; - rule.attrs = result || void 0; - } - return rule; - } - } - } - /** - @internal - */ - matchStyle(prop, value, context, after) { - for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) { - let rule = this.styles[i], style2 = rule.style; - if (style2.indexOf(prop) != 0 || rule.context && !context.matchesContext(rule.context) || // Test that the style string either precisely matches the prop, - // or has an '=' sign after the prop, followed by the given - // value. - style2.length > prop.length && (style2.charCodeAt(prop.length) != 61 || style2.slice(prop.length + 1) != value)) - continue; - if (rule.getAttrs) { - let result = rule.getAttrs(value); - if (result === false) - continue; - rule.attrs = result || void 0; - } - return rule; - } - } - /** - @internal - */ - static schemaRules(schema) { - let result = []; - function insert(rule) { - let priority = rule.priority == null ? 50 : rule.priority, i = 0; - for (; i < result.length; i++) { - let next = result[i], nextPriority = next.priority == null ? 50 : next.priority; - if (nextPriority < priority) - break; - } - result.splice(i, 0, rule); - } - for (let name in schema.marks) { - let rules = schema.marks[name].spec.parseDOM; - if (rules) - rules.forEach((rule) => { - insert(rule = copy(rule)); - if (!(rule.mark || rule.ignore || rule.clearMark)) - rule.mark = name; - }); - } - for (let name in schema.nodes) { - let rules = schema.nodes[name].spec.parseDOM; - if (rules) - rules.forEach((rule) => { - insert(rule = copy(rule)); - if (!(rule.node || rule.ignore || rule.mark)) - rule.node = name; - }); - } - return result; - } - /** - Construct a DOM parser using the parsing rules listed in a - schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by - [priority](https://prosemirror.net/docs/ref/#model.ParseRule.priority). - */ - static fromSchema(schema) { - return schema.cached.domParser || (schema.cached.domParser = new _DOMParser(schema, _DOMParser.schemaRules(schema))); - } -}; -var blockTags = { - address: true, - article: true, - aside: true, - blockquote: true, - canvas: true, - dd: true, - div: true, - dl: true, - fieldset: true, - figcaption: true, - figure: true, - footer: true, - form: true, - h1: true, - h2: true, - h3: true, - h4: true, - h5: true, - h6: true, - header: true, - hgroup: true, - hr: true, - li: true, - noscript: true, - ol: true, - output: true, - p: true, - pre: true, - section: true, - table: true, - tfoot: true, - ul: true -}; -var ignoreTags = { - head: true, - noscript: true, - object: true, - script: true, - style: true, - title: true -}; -var listTags = { ol: true, ul: true }; -var OPT_PRESERVE_WS = 1; -var OPT_PRESERVE_WS_FULL = 2; -var OPT_OPEN_LEFT = 4; -function wsOptionsFor(type, preserveWhitespace, base2) { - if (preserveWhitespace != null) - return (preserveWhitespace ? OPT_PRESERVE_WS : 0) | (preserveWhitespace === "full" ? OPT_PRESERVE_WS_FULL : 0); - return type && type.whitespace == "pre" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base2 & ~OPT_OPEN_LEFT; -} -var NodeContext = class { - constructor(type, attrs, marks, pendingMarks, solid, match, options) { - this.type = type; - this.attrs = attrs; - this.marks = marks; - this.pendingMarks = pendingMarks; - this.solid = solid; - this.options = options; - this.content = []; - this.activeMarks = Mark.none; - this.stashMarks = []; - this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch); - } - findWrapping(node) { - if (!this.match) { - if (!this.type) - return []; - let fill = this.type.contentMatch.fillBefore(Fragment.from(node)); - if (fill) { - this.match = this.type.contentMatch.matchFragment(fill); - } else { - let start2 = this.type.contentMatch, wrap2; - if (wrap2 = start2.findWrapping(node.type)) { - this.match = start2; - return wrap2; - } else { - return null; - } - } - } - return this.match.findWrapping(node.type); - } - finish(openEnd) { - if (!(this.options & OPT_PRESERVE_WS)) { - let last = this.content[this.content.length - 1], m; - if (last && last.isText && (m = /[ \t\r\n\u000c]+$/.exec(last.text))) { - let text = last; - if (last.text.length == m[0].length) - this.content.pop(); - else - this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length)); - } - } - let content = Fragment.from(this.content); - if (!openEnd && this.match) - content = content.append(this.match.fillBefore(Fragment.empty, true)); - return this.type ? this.type.create(this.attrs, content, this.marks) : content; - } - popFromStashMark(mark) { - for (let i = this.stashMarks.length - 1; i >= 0; i--) - if (mark.eq(this.stashMarks[i])) - return this.stashMarks.splice(i, 1)[0]; - } - applyPending(nextType) { - for (let i = 0, pending = this.pendingMarks; i < pending.length; i++) { - let mark = pending[i]; - if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) && !mark.isInSet(this.activeMarks)) { - this.activeMarks = mark.addToSet(this.activeMarks); - this.pendingMarks = mark.removeFromSet(this.pendingMarks); - } - } - } - inlineContext(node) { - if (this.type) - return this.type.inlineContent; - if (this.content.length) - return this.content[0].isInline; - return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase()); - } -}; -var ParseContext = class { - constructor(parser, options, isOpen) { - this.parser = parser; - this.options = options; - this.isOpen = isOpen; - this.open = 0; - let topNode = options.topNode, topContext; - let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0); - if (topNode) - topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions); - else if (isOpen) - topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions); - else - topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions); - this.nodes = [topContext]; - this.find = options.findPositions; - this.needsBlock = false; - } - get top() { - return this.nodes[this.open]; - } - // Add a DOM node to the content. Text is inserted as text node, - // otherwise, the node is passed to `addElement` or, if it has a - // `style` attribute, `addElementWithStyles`. - addDOM(dom) { - if (dom.nodeType == 3) - this.addTextNode(dom); - else if (dom.nodeType == 1) - this.addElement(dom); - } - withStyleRules(dom, f) { - let style2 = dom.getAttribute("style"); - if (!style2) - return f(); - let marks = this.readStyles(parseStyles(style2)); - if (!marks) - return; - let [addMarks, removeMarks] = marks, top2 = this.top; - for (let i = 0; i < removeMarks.length; i++) - this.removePendingMark(removeMarks[i], top2); - for (let i = 0; i < addMarks.length; i++) - this.addPendingMark(addMarks[i]); - f(); - for (let i = 0; i < addMarks.length; i++) - this.removePendingMark(addMarks[i], top2); - for (let i = 0; i < removeMarks.length; i++) - this.addPendingMark(removeMarks[i]); - } - addTextNode(dom) { - let value = dom.nodeValue; - let top2 = this.top; - if (top2.options & OPT_PRESERVE_WS_FULL || top2.inlineContext(dom) || /[^ \t\r\n\u000c]/.test(value)) { - if (!(top2.options & OPT_PRESERVE_WS)) { - value = value.replace(/[ \t\r\n\u000c]+/g, " "); - if (/^[ \t\r\n\u000c]/.test(value) && this.open == this.nodes.length - 1) { - let nodeBefore = top2.content[top2.content.length - 1]; - let domNodeBefore = dom.previousSibling; - if (!nodeBefore || domNodeBefore && domNodeBefore.nodeName == "BR" || nodeBefore.isText && /[ \t\r\n\u000c]$/.test(nodeBefore.text)) - value = value.slice(1); - } - } else if (!(top2.options & OPT_PRESERVE_WS_FULL)) { - value = value.replace(/\r?\n|\r/g, " "); - } else { - value = value.replace(/\r\n?/g, "\n"); - } - if (value) - this.insertNode(this.parser.schema.text(value)); - this.findInText(dom); - } else { - this.findInside(dom); - } - } - // Try to find a handler for the given tag and use that to parse. If - // none is found, the element's content nodes are added directly. - addElement(dom, matchAfter) { - let name = dom.nodeName.toLowerCase(), ruleID; - if (listTags.hasOwnProperty(name) && this.parser.normalizeLists) - normalizeList(dom); - let rule = this.options.ruleFromNode && this.options.ruleFromNode(dom) || (ruleID = this.parser.matchTag(dom, this, matchAfter)); - if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) { - this.findInside(dom); - this.ignoreFallback(dom); - } else if (!rule || rule.skip || rule.closeParent) { - if (rule && rule.closeParent) - this.open = Math.max(0, this.open - 1); - else if (rule && rule.skip.nodeType) - dom = rule.skip; - let sync, top2 = this.top, oldNeedsBlock = this.needsBlock; - if (blockTags.hasOwnProperty(name)) { - if (top2.content.length && top2.content[0].isInline && this.open) { - this.open--; - top2 = this.top; - } - sync = true; - if (!top2.type) - this.needsBlock = true; - } else if (!dom.firstChild) { - this.leafFallback(dom); - return; - } - if (rule && rule.skip) - this.addAll(dom); - else - this.withStyleRules(dom, () => this.addAll(dom)); - if (sync) - this.sync(top2); - this.needsBlock = oldNeedsBlock; - } else { - this.withStyleRules(dom, () => { - this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : void 0); - }); - } - } - // Called for leaf DOM nodes that would otherwise be ignored - leafFallback(dom) { - if (dom.nodeName == "BR" && this.top.type && this.top.type.inlineContent) - this.addTextNode(dom.ownerDocument.createTextNode("\n")); - } - // Called for ignored nodes - ignoreFallback(dom) { - if (dom.nodeName == "BR" && (!this.top.type || !this.top.type.inlineContent)) - this.findPlace(this.parser.schema.text("-")); - } - // Run any style parser associated with the node's styles. Either - // return an array of marks, or null to indicate some of the styles - // had a rule with `ignore` set. - readStyles(styles) { - let add = Mark.none, remove = Mark.none; - for (let i = 0; i < styles.length; i += 2) { - for (let after = void 0; ; ) { - let rule = this.parser.matchStyle(styles[i], styles[i + 1], this, after); - if (!rule) - break; - if (rule.ignore) - return null; - if (rule.clearMark) { - this.top.pendingMarks.concat(this.top.activeMarks).forEach((m) => { - if (rule.clearMark(m)) - remove = m.addToSet(remove); - }); - } else { - add = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(add); - } - if (rule.consuming === false) - after = rule; - else - break; - } - } - return [add, remove]; - } - // Look up a handler for the given node. If none are found, return - // false. Otherwise, apply it, use its return value to drive the way - // the node's content is wrapped, and return true. - addElementByRule(dom, rule, continueAfter) { - let sync, nodeType, mark; - if (rule.node) { - nodeType = this.parser.schema.nodes[rule.node]; - if (!nodeType.isLeaf) { - sync = this.enter(nodeType, rule.attrs || null, rule.preserveWhitespace); - } else if (!this.insertNode(nodeType.create(rule.attrs))) { - this.leafFallback(dom); - } - } else { - let markType = this.parser.schema.marks[rule.mark]; - mark = markType.create(rule.attrs); - this.addPendingMark(mark); - } - let startIn = this.top; - if (nodeType && nodeType.isLeaf) { - this.findInside(dom); - } else if (continueAfter) { - this.addElement(dom, continueAfter); - } else if (rule.getContent) { - this.findInside(dom); - rule.getContent(dom, this.parser.schema).forEach((node) => this.insertNode(node)); - } else { - let contentDOM = dom; - if (typeof rule.contentElement == "string") - contentDOM = dom.querySelector(rule.contentElement); - else if (typeof rule.contentElement == "function") - contentDOM = rule.contentElement(dom); - else if (rule.contentElement) - contentDOM = rule.contentElement; - this.findAround(dom, contentDOM, true); - this.addAll(contentDOM); - } - if (sync && this.sync(startIn)) - this.open--; - if (mark) - this.removePendingMark(mark, startIn); - } - // Add all child nodes between `startIndex` and `endIndex` (or the - // whole node, if not given). If `sync` is passed, use it to - // synchronize after every block element. - addAll(parent, startIndex, endIndex) { - let index = startIndex || 0; - for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end2 = endIndex == null ? null : parent.childNodes[endIndex]; dom != end2; dom = dom.nextSibling, ++index) { - this.findAtPoint(parent, index); - this.addDOM(dom); - } - this.findAtPoint(parent, index); - } - // Try to find a way to fit the given node type into the current - // context. May add intermediate wrappers and/or leave non-solid - // nodes that we're in. - findPlace(node) { - let route, sync; - for (let depth = this.open; depth >= 0; depth--) { - let cx = this.nodes[depth]; - let found2 = cx.findWrapping(node); - if (found2 && (!route || route.length > found2.length)) { - route = found2; - sync = cx; - if (!found2.length) - break; - } - if (cx.solid) - break; - } - if (!route) - return false; - this.sync(sync); - for (let i = 0; i < route.length; i++) - this.enterInner(route[i], null, false); - return true; - } - // Try to insert the given node, adjusting the context when needed. - insertNode(node) { - if (node.isInline && this.needsBlock && !this.top.type) { - let block = this.textblockFromContext(); - if (block) - this.enterInner(block); - } - if (this.findPlace(node)) { - this.closeExtra(); - let top2 = this.top; - top2.applyPending(node.type); - if (top2.match) - top2.match = top2.match.matchType(node.type); - let marks = top2.activeMarks; - for (let i = 0; i < node.marks.length; i++) - if (!top2.type || top2.type.allowsMarkType(node.marks[i].type)) - marks = node.marks[i].addToSet(marks); - top2.content.push(node.mark(marks)); - return true; - } - return false; - } - // Try to start a node of the given type, adjusting the context when - // necessary. - enter(type, attrs, preserveWS) { - let ok = this.findPlace(type.create(attrs)); - if (ok) - this.enterInner(type, attrs, true, preserveWS); - return ok; - } - // Open a node of the given type - enterInner(type, attrs = null, solid = false, preserveWS) { - this.closeExtra(); - let top2 = this.top; - top2.applyPending(type); - top2.match = top2.match && top2.match.matchType(type); - let options = wsOptionsFor(type, preserveWS, top2.options); - if (top2.options & OPT_OPEN_LEFT && top2.content.length == 0) - options |= OPT_OPEN_LEFT; - this.nodes.push(new NodeContext(type, attrs, top2.activeMarks, top2.pendingMarks, solid, null, options)); - this.open++; - } - // Make sure all nodes above this.open are finished and added to - // their parents - closeExtra(openEnd = false) { - let i = this.nodes.length - 1; - if (i > this.open) { - for (; i > this.open; i--) - this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd)); - this.nodes.length = this.open + 1; - } - } - finish() { - this.open = 0; - this.closeExtra(this.isOpen); - return this.nodes[0].finish(this.isOpen || this.options.topOpen); - } - sync(to) { - for (let i = this.open; i >= 0; i--) - if (this.nodes[i] == to) { - this.open = i; - return true; - } - return false; - } - get currentPos() { - this.closeExtra(); - let pos = 0; - for (let i = this.open; i >= 0; i--) { - let content = this.nodes[i].content; - for (let j = content.length - 1; j >= 0; j--) - pos += content[j].nodeSize; - if (i) - pos++; - } - return pos; - } - findAtPoint(parent, offset2) { - if (this.find) - for (let i = 0; i < this.find.length; i++) { - if (this.find[i].node == parent && this.find[i].offset == offset2) - this.find[i].pos = this.currentPos; - } - } - findInside(parent) { - if (this.find) - for (let i = 0; i < this.find.length; i++) { - if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) - this.find[i].pos = this.currentPos; - } - } - findAround(parent, content, before) { - if (parent != content && this.find) - for (let i = 0; i < this.find.length; i++) { - if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) { - let pos = content.compareDocumentPosition(this.find[i].node); - if (pos & (before ? 2 : 4)) - this.find[i].pos = this.currentPos; - } - } - } - findInText(textNode) { - if (this.find) - for (let i = 0; i < this.find.length; i++) { - if (this.find[i].node == textNode) - this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset); - } - } - // Determines whether the given context string matches this context. - matchesContext(context) { - if (context.indexOf("|") > -1) - return context.split(/\s*\|\s*/).some(this.matchesContext, this); - let parts = context.split("/"); - let option = this.options.context; - let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type); - let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1); - let match = (i, depth) => { - for (; i >= 0; i--) { - let part = parts[i]; - if (part == "") { - if (i == parts.length - 1 || i == 0) - continue; - for (; depth >= minDepth; depth--) - if (match(i - 1, depth)) - return true; - return false; - } else { - let next = depth > 0 || depth == 0 && useRoot ? this.nodes[depth].type : option && depth >= minDepth ? option.node(depth - minDepth).type : null; - if (!next || next.name != part && next.groups.indexOf(part) == -1) - return false; - depth--; - } - } - return true; - }; - return match(parts.length - 1, this.open); - } - textblockFromContext() { - let $context = this.options.context; - if ($context) - for (let d = $context.depth; d >= 0; d--) { - let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType; - if (deflt && deflt.isTextblock && deflt.defaultAttrs) - return deflt; - } - for (let name in this.parser.schema.nodes) { - let type = this.parser.schema.nodes[name]; - if (type.isTextblock && type.defaultAttrs) - return type; - } - } - addPendingMark(mark) { - let found2 = findSameMarkInSet(mark, this.top.pendingMarks); - if (found2) - this.top.stashMarks.push(found2); - this.top.pendingMarks = mark.addToSet(this.top.pendingMarks); - } - removePendingMark(mark, upto) { - for (let depth = this.open; depth >= 0; depth--) { - let level = this.nodes[depth]; - let found2 = level.pendingMarks.lastIndexOf(mark); - if (found2 > -1) { - level.pendingMarks = mark.removeFromSet(level.pendingMarks); - } else { - level.activeMarks = mark.removeFromSet(level.activeMarks); - let stashMark = level.popFromStashMark(mark); - if (stashMark && level.type && level.type.allowsMarkType(stashMark.type)) - level.activeMarks = stashMark.addToSet(level.activeMarks); - } - if (level == upto) - break; - } - } -}; -function normalizeList(dom) { - for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) { - let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null; - if (name && listTags.hasOwnProperty(name) && prevItem) { - prevItem.appendChild(child); - child = prevItem; - } else if (name == "li") { - prevItem = child; - } else if (name) { - prevItem = null; - } - } -} -function matches(dom, selector) { - return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector); -} -function parseStyles(style2) { - let re = /\s*([\w-]+)\s*:\s*([^;]+)/g, m, result = []; - while (m = re.exec(style2)) - result.push(m[1], m[2].trim()); - return result; -} -function copy(obj) { - let copy2 = {}; - for (let prop in obj) - copy2[prop] = obj[prop]; - return copy2; -} -function markMayApply(markType, nodeType) { - let nodes = nodeType.schema.nodes; - for (let name in nodes) { - let parent = nodes[name]; - if (!parent.allowsMarkType(markType)) - continue; - let seen = [], scan = (match) => { - seen.push(match); - for (let i = 0; i < match.edgeCount; i++) { - let { type, next } = match.edge(i); - if (type == nodeType) - return true; - if (seen.indexOf(next) < 0 && scan(next)) - return true; - } - }; - if (scan(parent.contentMatch)) - return true; - } -} -function findSameMarkInSet(mark, set) { - for (let i = 0; i < set.length; i++) { - if (mark.eq(set[i])) - return set[i]; - } -} -var DOMSerializer = class _DOMSerializer { - /** - Create a serializer. `nodes` should map node names to functions - that take a node and return a description of the corresponding - DOM. `marks` does the same for mark names, but also gets an - argument that tells it whether the mark's content is block or - inline content (for typical use, it'll always be inline). A mark - serializer may be `null` to indicate that marks of that type - should not be serialized. - */ - constructor(nodes, marks) { - this.nodes = nodes; - this.marks = marks; - } - /** - Serialize the content of this fragment to a DOM fragment. When - not in the browser, the `document` option, containing a DOM - document, should be passed so that the serializer can create - nodes. - */ - serializeFragment(fragment, options = {}, target) { - if (!target) - target = doc(options).createDocumentFragment(); - let top2 = target, active = []; - fragment.forEach((node) => { - if (active.length || node.marks.length) { - let keep = 0, rendered = 0; - while (keep < active.length && rendered < node.marks.length) { - let next = node.marks[rendered]; - if (!this.marks[next.type.name]) { - rendered++; - continue; - } - if (!next.eq(active[keep][0]) || next.type.spec.spanning === false) - break; - keep++; - rendered++; - } - while (keep < active.length) - top2 = active.pop()[1]; - while (rendered < node.marks.length) { - let add = node.marks[rendered++]; - let markDOM = this.serializeMark(add, node.isInline, options); - if (markDOM) { - active.push([add, top2]); - top2.appendChild(markDOM.dom); - top2 = markDOM.contentDOM || markDOM.dom; - } - } - } - top2.appendChild(this.serializeNodeInner(node, options)); - }); - return target; - } - /** - @internal - */ - serializeNodeInner(node, options) { - let { dom, contentDOM } = _DOMSerializer.renderSpec(doc(options), this.nodes[node.type.name](node)); - if (contentDOM) { - if (node.isLeaf) - throw new RangeError("Content hole not allowed in a leaf node spec"); - this.serializeFragment(node.content, options, contentDOM); - } - return dom; - } - /** - Serialize this node to a DOM node. This can be useful when you - need to serialize a part of a document, as opposed to the whole - document. To serialize a whole document, use - [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on - its [content](https://prosemirror.net/docs/ref/#model.Node.content). - */ - serializeNode(node, options = {}) { - let dom = this.serializeNodeInner(node, options); - for (let i = node.marks.length - 1; i >= 0; i--) { - let wrap2 = this.serializeMark(node.marks[i], node.isInline, options); - if (wrap2) { - (wrap2.contentDOM || wrap2.dom).appendChild(dom); - dom = wrap2.dom; - } - } - return dom; - } - /** - @internal - */ - serializeMark(mark, inline, options = {}) { - let toDOM = this.marks[mark.type.name]; - return toDOM && _DOMSerializer.renderSpec(doc(options), toDOM(mark, inline)); - } - /** - Render an [output spec](https://prosemirror.net/docs/ref/#model.DOMOutputSpec) to a DOM node. If - the spec has a hole (zero) in it, `contentDOM` will point at the - node with the hole. - */ - static renderSpec(doc3, structure, xmlNS = null) { - if (typeof structure == "string") - return { dom: doc3.createTextNode(structure) }; - if (structure.nodeType != null) - return { dom: structure }; - if (structure.dom && structure.dom.nodeType != null) - return structure; - let tagName = structure[0], space = tagName.indexOf(" "); - if (space > 0) { - xmlNS = tagName.slice(0, space); - tagName = tagName.slice(space + 1); - } - let contentDOM; - let dom = xmlNS ? doc3.createElementNS(xmlNS, tagName) : doc3.createElement(tagName); - let attrs = structure[1], start2 = 1; - if (attrs && typeof attrs == "object" && attrs.nodeType == null && !Array.isArray(attrs)) { - start2 = 2; - for (let name in attrs) - if (attrs[name] != null) { - let space2 = name.indexOf(" "); - if (space2 > 0) - dom.setAttributeNS(name.slice(0, space2), name.slice(space2 + 1), attrs[name]); - else - dom.setAttribute(name, attrs[name]); - } - } - for (let i = start2; i < structure.length; i++) { - let child = structure[i]; - if (child === 0) { - if (i < structure.length - 1 || i > start2) - throw new RangeError("Content hole must be the only child of its parent node"); - return { dom, contentDOM: dom }; - } else { - let { dom: inner, contentDOM: innerContent } = _DOMSerializer.renderSpec(doc3, child, xmlNS); - dom.appendChild(inner); - if (innerContent) { - if (contentDOM) - throw new RangeError("Multiple content holes"); - contentDOM = innerContent; - } - } - } - return { dom, contentDOM }; - } - /** - Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM) - properties in a schema's node and mark specs. - */ - static fromSchema(schema) { - return schema.cached.domSerializer || (schema.cached.domSerializer = new _DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema))); - } - /** - Gather the serializers in a schema's node specs into an object. - This can be useful as a base to build a custom serializer from. - */ - static nodesFromSchema(schema) { - let result = gatherToDOM(schema.nodes); - if (!result.text) - result.text = (node) => node.text; - return result; - } - /** - Gather the serializers in a schema's mark specs into an object. - */ - static marksFromSchema(schema) { - return gatherToDOM(schema.marks); - } -}; -function gatherToDOM(obj) { - let result = {}; - for (let name in obj) { - let toDOM = obj[name].spec.toDOM; - if (toDOM) - result[name] = toDOM; - } - return result; -} -function doc(options) { - return options.document || window.document; -} - -// node_modules/prosemirror-transform/dist/index.js -var lower16 = 65535; -var factor16 = Math.pow(2, 16); -function makeRecover(index, offset2) { - return index + offset2 * factor16; -} -function recoverIndex(value) { - return value & lower16; -} -function recoverOffset(value) { - return (value - (value & lower16)) / factor16; -} -var DEL_BEFORE = 1; -var DEL_AFTER = 2; -var DEL_ACROSS = 4; -var DEL_SIDE = 8; -var MapResult = class { - /** - @internal - */ - constructor(pos, delInfo, recover) { - this.pos = pos; - this.delInfo = delInfo; - this.recover = recover; - } - /** - Tells you whether the position was deleted, that is, whether the - step removed the token on the side queried (via the `assoc`) - argument from the document. - */ - get deleted() { - return (this.delInfo & DEL_SIDE) > 0; - } - /** - Tells you whether the token before the mapped position was deleted. - */ - get deletedBefore() { - return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; - } - /** - True when the token after the mapped position was deleted. - */ - get deletedAfter() { - return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; - } - /** - Tells whether any of the steps mapped through deletes across the - position (including both the token before and after the - position). - */ - get deletedAcross() { - return (this.delInfo & DEL_ACROSS) > 0; - } -}; -var StepMap = class _StepMap { - /** - Create a position map. The modifications to the document are - represented as an array of numbers, in which each group of three - represents a modified chunk as `[start, oldSize, newSize]`. - */ - constructor(ranges, inverted = false) { - this.ranges = ranges; - this.inverted = inverted; - if (!ranges.length && _StepMap.empty) - return _StepMap.empty; - } - /** - @internal - */ - recover(value) { - let diff2 = 0, index = recoverIndex(value); - if (!this.inverted) - for (let i = 0; i < index; i++) - diff2 += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1]; - return this.ranges[index * 3] + diff2 + recoverOffset(value); - } - mapResult(pos, assoc = 1) { - return this._map(pos, assoc, false); - } - map(pos, assoc = 1) { - return this._map(pos, assoc, true); - } - /** - @internal - */ - _map(pos, assoc, simple) { - let diff2 = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2; - for (let i = 0; i < this.ranges.length; i += 3) { - let start2 = this.ranges[i] - (this.inverted ? diff2 : 0); - if (start2 > pos) - break; - let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end2 = start2 + oldSize; - if (pos <= end2) { - let side = !oldSize ? assoc : pos == start2 ? -1 : pos == end2 ? 1 : assoc; - let result = start2 + diff2 + (side < 0 ? 0 : newSize); - if (simple) - return result; - let recover = pos == (assoc < 0 ? start2 : end2) ? null : makeRecover(i / 3, pos - start2); - let del2 = pos == start2 ? DEL_AFTER : pos == end2 ? DEL_BEFORE : DEL_ACROSS; - if (assoc < 0 ? pos != start2 : pos != end2) - del2 |= DEL_SIDE; - return new MapResult(result, del2, recover); - } - diff2 += newSize - oldSize; - } - return simple ? pos + diff2 : new MapResult(pos + diff2, 0, null); - } - /** - @internal - */ - touches(pos, recover) { - let diff2 = 0, index = recoverIndex(recover); - let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2; - for (let i = 0; i < this.ranges.length; i += 3) { - let start2 = this.ranges[i] - (this.inverted ? diff2 : 0); - if (start2 > pos) - break; - let oldSize = this.ranges[i + oldIndex], end2 = start2 + oldSize; - if (pos <= end2 && i == index * 3) - return true; - diff2 += this.ranges[i + newIndex] - oldSize; - } - return false; - } - /** - Calls the given function on each of the changed ranges included in - this map. - */ - forEach(f) { - let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2; - for (let i = 0, diff2 = 0; i < this.ranges.length; i += 3) { - let start2 = this.ranges[i], oldStart = start2 - (this.inverted ? diff2 : 0), newStart = start2 + (this.inverted ? 0 : diff2); - let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex]; - f(oldStart, oldStart + oldSize, newStart, newStart + newSize); - diff2 += newSize - oldSize; - } - } - /** - Create an inverted version of this map. The result can be used to - map positions in the post-step document to the pre-step document. - */ - invert() { - return new _StepMap(this.ranges, !this.inverted); - } - /** - @internal - */ - toString() { - return (this.inverted ? "-" : "") + JSON.stringify(this.ranges); - } - /** - Create a map that moves all positions by offset `n` (which may be - negative). This can be useful when applying steps meant for a - sub-document to a larger document, or vice-versa. - */ - static offset(n) { - return n == 0 ? _StepMap.empty : new _StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]); - } -}; -StepMap.empty = new StepMap([]); -var Mapping = class _Mapping { - /** - Create a new mapping with the given position maps. - */ - constructor(maps = [], mirror, from2 = 0, to = maps.length) { - this.maps = maps; - this.mirror = mirror; - this.from = from2; - this.to = to; - } - /** - Create a mapping that maps only through a part of this one. - */ - slice(from2 = 0, to = this.maps.length) { - return new _Mapping(this.maps, this.mirror, from2, to); - } - /** - @internal - */ - copy() { - return new _Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to); - } - /** - Add a step map to the end of this mapping. If `mirrors` is - given, it should be the index of the step map that is the mirror - image of this one. - */ - appendMap(map2, mirrors) { - this.to = this.maps.push(map2); - if (mirrors != null) - this.setMirror(this.maps.length - 1, mirrors); - } - /** - Add all the step maps in a given mapping to this one (preserving - mirroring information). - */ - appendMapping(mapping) { - for (let i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) { - let mirr = mapping.getMirror(i); - this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : void 0); - } - } - /** - Finds the offset of the step map that mirrors the map at the - given offset, in this mapping (as per the second argument to - `appendMap`). - */ - getMirror(n) { - if (this.mirror) { - for (let i = 0; i < this.mirror.length; i++) - if (this.mirror[i] == n) - return this.mirror[i + (i % 2 ? -1 : 1)]; - } - } - /** - @internal - */ - setMirror(n, m) { - if (!this.mirror) - this.mirror = []; - this.mirror.push(n, m); - } - /** - Append the inverse of the given mapping to this one. - */ - appendMappingInverted(mapping) { - for (let i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) { - let mirr = mapping.getMirror(i); - this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : void 0); - } - } - /** - Create an inverted version of this mapping. - */ - invert() { - let inverse = new _Mapping(); - inverse.appendMappingInverted(this); - return inverse; - } - /** - Map a position through this mapping. - */ - map(pos, assoc = 1) { - if (this.mirror) - return this._map(pos, assoc, true); - for (let i = this.from; i < this.to; i++) - pos = this.maps[i].map(pos, assoc); - return pos; - } - /** - Map a position through this mapping, returning a mapping - result. - */ - mapResult(pos, assoc = 1) { - return this._map(pos, assoc, false); - } - /** - @internal - */ - _map(pos, assoc, simple) { - let delInfo = 0; - for (let i = this.from; i < this.to; i++) { - let map2 = this.maps[i], result = map2.mapResult(pos, assoc); - if (result.recover != null) { - let corr = this.getMirror(i); - if (corr != null && corr > i && corr < this.to) { - i = corr; - pos = this.maps[corr].recover(result.recover); - continue; - } - } - delInfo |= result.delInfo; - pos = result.pos; - } - return simple ? pos : new MapResult(pos, delInfo, null); - } -}; -var stepsByID = /* @__PURE__ */ Object.create(null); -var Step = class { - /** - Get the step map that represents the changes made by this step, - and which can be used to transform between positions in the old - and the new document. - */ - getMap() { - return StepMap.empty; - } - /** - Try to merge this step with another one, to be applied directly - after it. Returns the merged step when possible, null if the - steps can't be merged. - */ - merge(other) { - return null; - } - /** - Deserialize a step from its JSON representation. Will call - through to the step class' own implementation of this method. - */ - static fromJSON(schema, json2) { - if (!json2 || !json2.stepType) - throw new RangeError("Invalid input for Step.fromJSON"); - let type = stepsByID[json2.stepType]; - if (!type) - throw new RangeError(`No step type ${json2.stepType} defined`); - return type.fromJSON(schema, json2); - } - /** - To be able to serialize steps to JSON, each step needs a string - ID to attach to its JSON representation. Use this method to - register an ID for your step classes. Try to pick something - that's unlikely to clash with steps from other modules. - */ - static jsonID(id, stepClass) { - if (id in stepsByID) - throw new RangeError("Duplicate use of step JSON ID " + id); - stepsByID[id] = stepClass; - stepClass.prototype.jsonID = id; - return stepClass; - } -}; -var StepResult = class _StepResult { - /** - @internal - */ - constructor(doc3, failed) { - this.doc = doc3; - this.failed = failed; - } - /** - Create a successful step result. - */ - static ok(doc3) { - return new _StepResult(doc3, null); - } - /** - Create a failed step result. - */ - static fail(message) { - return new _StepResult(null, message); - } - /** - Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given - arguments. Create a successful result if it succeeds, and a - failed one if it throws a `ReplaceError`. - */ - static fromReplace(doc3, from2, to, slice2) { - try { - return _StepResult.ok(doc3.replace(from2, to, slice2)); - } catch (e) { - if (e instanceof ReplaceError) - return _StepResult.fail(e.message); - throw e; - } - } -}; -function mapFragment(fragment, f, parent) { - let mapped = []; - for (let i = 0; i < fragment.childCount; i++) { - let child = fragment.child(i); - if (child.content.size) - child = child.copy(mapFragment(child.content, f, child)); - if (child.isInline) - child = f(child, parent, i); - mapped.push(child); - } - return Fragment.fromArray(mapped); -} -var AddMarkStep = class _AddMarkStep extends Step { - /** - Create a mark step. - */ - constructor(from2, to, mark) { - super(); - this.from = from2; - this.to = to; - this.mark = mark; - } - apply(doc3) { - let oldSlice = doc3.slice(this.from, this.to), $from = doc3.resolve(this.from); - let parent = $from.node($from.sharedDepth(this.to)); - let slice2 = new Slice(mapFragment(oldSlice.content, (node, parent2) => { - if (!node.isAtom || !parent2.type.allowsMarkType(this.mark.type)) - return node; - return node.mark(this.mark.addToSet(node.marks)); - }, parent), oldSlice.openStart, oldSlice.openEnd); - return StepResult.fromReplace(doc3, this.from, this.to, slice2); - } - invert() { - return new RemoveMarkStep(this.from, this.to, this.mark); - } - map(mapping) { - let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); - if (from2.deleted && to.deleted || from2.pos >= to.pos) - return null; - return new _AddMarkStep(from2.pos, to.pos, this.mark); - } - merge(other) { - if (other instanceof _AddMarkStep && other.mark.eq(this.mark) && this.from <= other.to && this.to >= other.from) - return new _AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark); - return null; - } - toJSON() { - return { - stepType: "addMark", - mark: this.mark.toJSON(), - from: this.from, - to: this.to - }; - } - /** - @internal - */ - static fromJSON(schema, json2) { - if (typeof json2.from != "number" || typeof json2.to != "number") - throw new RangeError("Invalid input for AddMarkStep.fromJSON"); - return new _AddMarkStep(json2.from, json2.to, schema.markFromJSON(json2.mark)); - } -}; -Step.jsonID("addMark", AddMarkStep); -var RemoveMarkStep = class _RemoveMarkStep extends Step { - /** - Create a mark-removing step. - */ - constructor(from2, to, mark) { - super(); - this.from = from2; - this.to = to; - this.mark = mark; - } - apply(doc3) { - let oldSlice = doc3.slice(this.from, this.to); - let slice2 = new Slice(mapFragment(oldSlice.content, (node) => { - return node.mark(this.mark.removeFromSet(node.marks)); - }, doc3), oldSlice.openStart, oldSlice.openEnd); - return StepResult.fromReplace(doc3, this.from, this.to, slice2); - } - invert() { - return new AddMarkStep(this.from, this.to, this.mark); - } - map(mapping) { - let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); - if (from2.deleted && to.deleted || from2.pos >= to.pos) - return null; - return new _RemoveMarkStep(from2.pos, to.pos, this.mark); - } - merge(other) { - if (other instanceof _RemoveMarkStep && other.mark.eq(this.mark) && this.from <= other.to && this.to >= other.from) - return new _RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark); - return null; - } - toJSON() { - return { - stepType: "removeMark", - mark: this.mark.toJSON(), - from: this.from, - to: this.to - }; - } - /** - @internal - */ - static fromJSON(schema, json2) { - if (typeof json2.from != "number" || typeof json2.to != "number") - throw new RangeError("Invalid input for RemoveMarkStep.fromJSON"); - return new _RemoveMarkStep(json2.from, json2.to, schema.markFromJSON(json2.mark)); - } -}; -Step.jsonID("removeMark", RemoveMarkStep); -var AddNodeMarkStep = class _AddNodeMarkStep extends Step { - /** - Create a node mark step. - */ - constructor(pos, mark) { - super(); - this.pos = pos; - this.mark = mark; - } - apply(doc3) { - let node = doc3.nodeAt(this.pos); - if (!node) - return StepResult.fail("No node at mark step's position"); - let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks)); - return StepResult.fromReplace(doc3, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1)); - } - invert(doc3) { - let node = doc3.nodeAt(this.pos); - if (node) { - let newSet = this.mark.addToSet(node.marks); - if (newSet.length == node.marks.length) { - for (let i = 0; i < node.marks.length; i++) - if (!node.marks[i].isInSet(newSet)) - return new _AddNodeMarkStep(this.pos, node.marks[i]); - return new _AddNodeMarkStep(this.pos, this.mark); - } - } - return new RemoveNodeMarkStep(this.pos, this.mark); - } - map(mapping) { - let pos = mapping.mapResult(this.pos, 1); - return pos.deletedAfter ? null : new _AddNodeMarkStep(pos.pos, this.mark); - } - toJSON() { - return { stepType: "addNodeMark", pos: this.pos, mark: this.mark.toJSON() }; - } - /** - @internal - */ - static fromJSON(schema, json2) { - if (typeof json2.pos != "number") - throw new RangeError("Invalid input for AddNodeMarkStep.fromJSON"); - return new _AddNodeMarkStep(json2.pos, schema.markFromJSON(json2.mark)); - } -}; -Step.jsonID("addNodeMark", AddNodeMarkStep); -var RemoveNodeMarkStep = class _RemoveNodeMarkStep extends Step { - /** - Create a mark-removing step. - */ - constructor(pos, mark) { - super(); - this.pos = pos; - this.mark = mark; - } - apply(doc3) { - let node = doc3.nodeAt(this.pos); - if (!node) - return StepResult.fail("No node at mark step's position"); - let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks)); - return StepResult.fromReplace(doc3, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1)); - } - invert(doc3) { - let node = doc3.nodeAt(this.pos); - if (!node || !this.mark.isInSet(node.marks)) - return this; - return new AddNodeMarkStep(this.pos, this.mark); - } - map(mapping) { - let pos = mapping.mapResult(this.pos, 1); - return pos.deletedAfter ? null : new _RemoveNodeMarkStep(pos.pos, this.mark); - } - toJSON() { - return { stepType: "removeNodeMark", pos: this.pos, mark: this.mark.toJSON() }; - } - /** - @internal - */ - static fromJSON(schema, json2) { - if (typeof json2.pos != "number") - throw new RangeError("Invalid input for RemoveNodeMarkStep.fromJSON"); - return new _RemoveNodeMarkStep(json2.pos, schema.markFromJSON(json2.mark)); - } -}; -Step.jsonID("removeNodeMark", RemoveNodeMarkStep); -var ReplaceStep = class _ReplaceStep extends Step { - /** - The given `slice` should fit the 'gap' between `from` and - `to`—the depths must line up, and the surrounding nodes must be - able to be joined with the open sides of the slice. When - `structure` is true, the step will fail if the content between - from and to is not just a sequence of closing and then opening - tokens (this is to guard against rebased replace steps - overwriting something they weren't supposed to). - */ - constructor(from2, to, slice2, structure = false) { - super(); - this.from = from2; - this.to = to; - this.slice = slice2; - this.structure = structure; - } - apply(doc3) { - if (this.structure && contentBetween(doc3, this.from, this.to)) - return StepResult.fail("Structure replace would overwrite content"); - return StepResult.fromReplace(doc3, this.from, this.to, this.slice); - } - getMap() { - return new StepMap([this.from, this.to - this.from, this.slice.size]); - } - invert(doc3) { - return new _ReplaceStep(this.from, this.from + this.slice.size, doc3.slice(this.from, this.to)); - } - map(mapping) { - let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); - if (from2.deletedAcross && to.deletedAcross) - return null; - return new _ReplaceStep(from2.pos, Math.max(from2.pos, to.pos), this.slice); - } - merge(other) { - if (!(other instanceof _ReplaceStep) || other.structure || this.structure) - return null; - if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) { - let slice2 = this.slice.size + other.slice.size == 0 ? Slice.empty : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd); - return new _ReplaceStep(this.from, this.to + (other.to - other.from), slice2, this.structure); - } else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) { - let slice2 = this.slice.size + other.slice.size == 0 ? Slice.empty : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd); - return new _ReplaceStep(other.from, this.to, slice2, this.structure); - } else { - return null; - } - } - toJSON() { - let json2 = { stepType: "replace", from: this.from, to: this.to }; - if (this.slice.size) - json2.slice = this.slice.toJSON(); - if (this.structure) - json2.structure = true; - return json2; - } - /** - @internal - */ - static fromJSON(schema, json2) { - if (typeof json2.from != "number" || typeof json2.to != "number") - throw new RangeError("Invalid input for ReplaceStep.fromJSON"); - return new _ReplaceStep(json2.from, json2.to, Slice.fromJSON(schema, json2.slice), !!json2.structure); - } -}; -Step.jsonID("replace", ReplaceStep); -var ReplaceAroundStep = class _ReplaceAroundStep extends Step { - /** - Create a replace-around step with the given range and gap. - `insert` should be the point in the slice into which the content - of the gap should be moved. `structure` has the same meaning as - it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class. - */ - constructor(from2, to, gapFrom, gapTo, slice2, insert, structure = false) { - super(); - this.from = from2; - this.to = to; - this.gapFrom = gapFrom; - this.gapTo = gapTo; - this.slice = slice2; - this.insert = insert; - this.structure = structure; - } - apply(doc3) { - if (this.structure && (contentBetween(doc3, this.from, this.gapFrom) || contentBetween(doc3, this.gapTo, this.to))) - return StepResult.fail("Structure gap-replace would overwrite content"); - let gap = doc3.slice(this.gapFrom, this.gapTo); - if (gap.openStart || gap.openEnd) - return StepResult.fail("Gap is not a flat range"); - let inserted = this.slice.insertAt(this.insert, gap.content); - if (!inserted) - return StepResult.fail("Content does not fit in gap"); - return StepResult.fromReplace(doc3, this.from, this.to, inserted); - } - getMap() { - return new StepMap([ - this.from, - this.gapFrom - this.from, - this.insert, - this.gapTo, - this.to - this.gapTo, - this.slice.size - this.insert - ]); - } - invert(doc3) { - let gap = this.gapTo - this.gapFrom; - return new _ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc3.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure); - } - map(mapping) { - let from2 = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1); - let gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1); - if (from2.deletedAcross && to.deletedAcross || gapFrom < from2.pos || gapTo > to.pos) - return null; - return new _ReplaceAroundStep(from2.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure); - } - toJSON() { - let json2 = { - stepType: "replaceAround", - from: this.from, - to: this.to, - gapFrom: this.gapFrom, - gapTo: this.gapTo, - insert: this.insert - }; - if (this.slice.size) - json2.slice = this.slice.toJSON(); - if (this.structure) - json2.structure = true; - return json2; - } - /** - @internal - */ - static fromJSON(schema, json2) { - if (typeof json2.from != "number" || typeof json2.to != "number" || typeof json2.gapFrom != "number" || typeof json2.gapTo != "number" || typeof json2.insert != "number") - throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON"); - return new _ReplaceAroundStep(json2.from, json2.to, json2.gapFrom, json2.gapTo, Slice.fromJSON(schema, json2.slice), json2.insert, !!json2.structure); - } -}; -Step.jsonID("replaceAround", ReplaceAroundStep); -function contentBetween(doc3, from2, to) { - let $from = doc3.resolve(from2), dist = to - from2, depth = $from.depth; - while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) { - depth--; - dist--; - } - if (dist > 0) { - let next = $from.node(depth).maybeChild($from.indexAfter(depth)); - while (dist > 0) { - if (!next || next.isLeaf) - return true; - next = next.firstChild; - dist--; - } - } - return false; -} -function addMark(tr2, from2, to, mark) { - let removed = [], added = []; - let removing, adding; - tr2.doc.nodesBetween(from2, to, (node, pos, parent) => { - if (!node.isInline) - return; - let marks = node.marks; - if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) { - let start2 = Math.max(pos, from2), end2 = Math.min(pos + node.nodeSize, to); - let newSet = mark.addToSet(marks); - for (let i = 0; i < marks.length; i++) { - if (!marks[i].isInSet(newSet)) { - if (removing && removing.to == start2 && removing.mark.eq(marks[i])) - removing.to = end2; - else - removed.push(removing = new RemoveMarkStep(start2, end2, marks[i])); - } - } - if (adding && adding.to == start2) - adding.to = end2; - else - added.push(adding = new AddMarkStep(start2, end2, mark)); - } - }); - removed.forEach((s) => tr2.step(s)); - added.forEach((s) => tr2.step(s)); -} -function removeMark(tr2, from2, to, mark) { - let matched = [], step = 0; - tr2.doc.nodesBetween(from2, to, (node, pos) => { - if (!node.isInline) - return; - step++; - let toRemove = null; - if (mark instanceof MarkType) { - let set = node.marks, found2; - while (found2 = mark.isInSet(set)) { - (toRemove || (toRemove = [])).push(found2); - set = found2.removeFromSet(set); - } - } else if (mark) { - if (mark.isInSet(node.marks)) - toRemove = [mark]; - } else { - toRemove = node.marks; - } - if (toRemove && toRemove.length) { - let end2 = Math.min(pos + node.nodeSize, to); - for (let i = 0; i < toRemove.length; i++) { - let style2 = toRemove[i], found2; - for (let j = 0; j < matched.length; j++) { - let m = matched[j]; - if (m.step == step - 1 && style2.eq(matched[j].style)) - found2 = m; - } - if (found2) { - found2.to = end2; - found2.step = step; - } else { - matched.push({ style: style2, from: Math.max(pos, from2), to: end2, step }); - } - } - } - }); - matched.forEach((m) => tr2.step(new RemoveMarkStep(m.from, m.to, m.style))); -} -function clearIncompatible(tr2, pos, parentType, match = parentType.contentMatch) { - let node = tr2.doc.nodeAt(pos); - let replSteps = [], cur = pos + 1; - for (let i = 0; i < node.childCount; i++) { - let child = node.child(i), end2 = cur + child.nodeSize; - let allowed = match.matchType(child.type); - if (!allowed) { - replSteps.push(new ReplaceStep(cur, end2, Slice.empty)); - } else { - match = allowed; - for (let j = 0; j < child.marks.length; j++) - if (!parentType.allowsMarkType(child.marks[j].type)) - tr2.step(new RemoveMarkStep(cur, end2, child.marks[j])); - if (child.isText && !parentType.spec.code) { - let m, newline = /\r?\n|\r/g, slice2; - while (m = newline.exec(child.text)) { - if (!slice2) - slice2 = new Slice(Fragment.from(parentType.schema.text(" ", parentType.allowedMarks(child.marks))), 0, 0); - replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice2)); - } - } - } - cur = end2; - } - if (!match.validEnd) { - let fill = match.fillBefore(Fragment.empty, true); - tr2.replace(cur, cur, new Slice(fill, 0, 0)); - } - for (let i = replSteps.length - 1; i >= 0; i--) - tr2.step(replSteps[i]); -} -function canCut(node, start2, end2) { - return (start2 == 0 || node.canReplace(start2, node.childCount)) && (end2 == node.childCount || node.canReplace(0, end2)); -} -function liftTarget(range) { - let parent = range.parent; - let content = parent.content.cutByIndex(range.startIndex, range.endIndex); - for (let depth = range.depth; ; --depth) { - let node = range.$from.node(depth); - let index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth); - if (depth < range.depth && node.canReplace(index, endIndex, content)) - return depth; - if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex)) - break; - } - return null; -} -function lift(tr2, range, target) { - let { $from, $to, depth } = range; - let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1); - let start2 = gapStart, end2 = gapEnd; - let before = Fragment.empty, openStart = 0; - for (let d = depth, splitting = false; d > target; d--) - if (splitting || $from.index(d) > 0) { - splitting = true; - before = Fragment.from($from.node(d).copy(before)); - openStart++; - } else { - start2--; - } - let after = Fragment.empty, openEnd = 0; - for (let d = depth, splitting = false; d > target; d--) - if (splitting || $to.after(d + 1) < $to.end(d)) { - splitting = true; - after = Fragment.from($to.node(d).copy(after)); - openEnd++; - } else { - end2++; - } - tr2.step(new ReplaceAroundStep(start2, end2, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true)); -} -function findWrapping(range, nodeType, attrs = null, innerRange = range) { - let around = findWrappingOutside(range, nodeType); - let inner = around && findWrappingInside(innerRange, nodeType); - if (!inner) - return null; - return around.map(withAttrs).concat({ type: nodeType, attrs }).concat(inner.map(withAttrs)); -} -function withAttrs(type) { - return { type, attrs: null }; -} -function findWrappingOutside(range, type) { - let { parent, startIndex, endIndex } = range; - let around = parent.contentMatchAt(startIndex).findWrapping(type); - if (!around) - return null; - let outer = around.length ? around[0] : type; - return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null; -} -function findWrappingInside(range, type) { - let { parent, startIndex, endIndex } = range; - let inner = parent.child(startIndex); - let inside = type.contentMatch.findWrapping(inner.type); - if (!inside) - return null; - let lastType = inside.length ? inside[inside.length - 1] : type; - let innerMatch = lastType.contentMatch; - for (let i = startIndex; innerMatch && i < endIndex; i++) - innerMatch = innerMatch.matchType(parent.child(i).type); - if (!innerMatch || !innerMatch.validEnd) - return null; - return inside; -} -function wrap(tr2, range, wrappers) { - let content = Fragment.empty; - for (let i = wrappers.length - 1; i >= 0; i--) { - if (content.size) { - let match = wrappers[i].type.contentMatch.matchFragment(content); - if (!match || !match.validEnd) - throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper"); - } - content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); - } - let start2 = range.start, end2 = range.end; - tr2.step(new ReplaceAroundStep(start2, end2, start2, end2, new Slice(content, 0, 0), wrappers.length, true)); -} -function setBlockType(tr2, from2, to, type, attrs) { - if (!type.isTextblock) - throw new RangeError("Type given to setBlockType should be a textblock"); - let mapFrom = tr2.steps.length; - tr2.doc.nodesBetween(from2, to, (node, pos) => { - if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(tr2.doc, tr2.mapping.slice(mapFrom).map(pos), type)) { - tr2.clearIncompatible(tr2.mapping.slice(mapFrom).map(pos, 1), type); - let mapping = tr2.mapping.slice(mapFrom); - let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1); - tr2.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true)); - return false; - } - }); -} -function canChangeType(doc3, pos, type) { - let $pos = doc3.resolve(pos), index = $pos.index(); - return $pos.parent.canReplaceWith(index, index + 1, type); -} -function setNodeMarkup(tr2, pos, type, attrs, marks) { - let node = tr2.doc.nodeAt(pos); - if (!node) - throw new RangeError("No node at given position"); - if (!type) - type = node.type; - let newNode2 = type.create(attrs, null, marks || node.marks); - if (node.isLeaf) - return tr2.replaceWith(pos, pos + node.nodeSize, newNode2); - if (!type.validContent(node.content)) - throw new RangeError("Invalid content for node type " + type.name); - tr2.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode2), 0, 0), 1, true)); -} -function canSplit(doc3, pos, depth = 1, typesAfter) { - let $pos = doc3.resolve(pos), base2 = $pos.depth - depth; - let innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent; - if (base2 < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) - return false; - for (let d = $pos.depth - 1, i = depth - 2; d > base2; d--, i--) { - let node = $pos.node(d), index2 = $pos.index(d); - if (node.type.spec.isolating) - return false; - let rest = node.content.cutByIndex(index2, node.childCount); - let overrideChild = typesAfter && typesAfter[i + 1]; - if (overrideChild) - rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs)); - let after = typesAfter && typesAfter[i] || node; - if (!node.canReplace(index2 + 1, node.childCount) || !after.type.validContent(rest)) - return false; - } - let index = $pos.indexAfter(base2); - let baseType = typesAfter && typesAfter[0]; - return $pos.node(base2).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base2 + 1).type); -} -function split(tr2, pos, depth = 1, typesAfter) { - let $pos = tr2.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty; - for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) { - before = Fragment.from($pos.node(d).copy(before)); - let typeAfter = typesAfter && typesAfter[i]; - after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after)); - } - tr2.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true)); -} -function canJoin(doc3, pos) { - let $pos = doc3.resolve(pos), index = $pos.index(); - return joinable2($pos.nodeBefore, $pos.nodeAfter) && $pos.parent.canReplace(index, index + 1); -} -function joinable2(a, b) { - return !!(a && b && !a.isLeaf && a.canAppend(b)); -} -function joinPoint(doc3, pos, dir = -1) { - let $pos = doc3.resolve(pos); - for (let d = $pos.depth; ; d--) { - let before, after, index = $pos.index(d); - if (d == $pos.depth) { - before = $pos.nodeBefore; - after = $pos.nodeAfter; - } else if (dir > 0) { - before = $pos.node(d + 1); - index++; - after = $pos.node(d).maybeChild(index); - } else { - before = $pos.node(d).maybeChild(index - 1); - after = $pos.node(d + 1); - } - if (before && !before.isTextblock && joinable2(before, after) && $pos.node(d).canReplace(index, index + 1)) - return pos; - if (d == 0) - break; - pos = dir < 0 ? $pos.before(d) : $pos.after(d); - } -} -function join(tr2, pos, depth) { - let step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true); - tr2.step(step); -} -function insertPoint(doc3, pos, nodeType) { - let $pos = doc3.resolve(pos); - if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType)) - return pos; - if ($pos.parentOffset == 0) - for (let d = $pos.depth - 1; d >= 0; d--) { - let index = $pos.index(d); - if ($pos.node(d).canReplaceWith(index, index, nodeType)) - return $pos.before(d + 1); - if (index > 0) - return null; - } - if ($pos.parentOffset == $pos.parent.content.size) - for (let d = $pos.depth - 1; d >= 0; d--) { - let index = $pos.indexAfter(d); - if ($pos.node(d).canReplaceWith(index, index, nodeType)) - return $pos.after(d + 1); - if (index < $pos.node(d).childCount) - return null; - } - return null; -} -function dropPoint(doc3, pos, slice2) { - let $pos = doc3.resolve(pos); - if (!slice2.content.size) - return pos; - let content = slice2.content; - for (let i = 0; i < slice2.openStart; i++) - content = content.firstChild.content; - for (let pass = 1; pass <= (slice2.openStart == 0 && slice2.size ? 2 : 1); pass++) { - for (let d = $pos.depth; d >= 0; d--) { - let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1; - let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0); - let parent = $pos.node(d), fits = false; - if (pass == 1) { - fits = parent.canReplace(insertPos, insertPos, content); - } else { - let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type); - fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]); - } - if (fits) - return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1); - } - } - return null; -} -function replaceStep(doc3, from2, to = from2, slice2 = Slice.empty) { - if (from2 == to && !slice2.size) - return null; - let $from = doc3.resolve(from2), $to = doc3.resolve(to); - if (fitsTrivially($from, $to, slice2)) - return new ReplaceStep(from2, to, slice2); - return new Fitter($from, $to, slice2).fit(); -} -function fitsTrivially($from, $to, slice2) { - return !slice2.openStart && !slice2.openEnd && $from.start() == $to.start() && $from.parent.canReplace($from.index(), $to.index(), slice2.content); -} -var Fitter = class { - constructor($from, $to, unplaced) { - this.$from = $from; - this.$to = $to; - this.unplaced = unplaced; - this.frontier = []; - this.placed = Fragment.empty; - for (let i = 0; i <= $from.depth; i++) { - let node = $from.node(i); - this.frontier.push({ - type: node.type, - match: node.contentMatchAt($from.indexAfter(i)) - }); - } - for (let i = $from.depth; i > 0; i--) - this.placed = Fragment.from($from.node(i).copy(this.placed)); - } - get depth() { - return this.frontier.length - 1; - } - fit() { - while (this.unplaced.size) { - let fit = this.findFittable(); - if (fit) - this.placeNodes(fit); - else - this.openMore() || this.dropNode(); - } - let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth; - let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline)); - if (!$to) - return null; - let content = this.placed, openStart = $from.depth, openEnd = $to.depth; - while (openStart && openEnd && content.childCount == 1) { - content = content.firstChild.content; - openStart--; - openEnd--; - } - let slice2 = new Slice(content, openStart, openEnd); - if (moveInline > -1) - return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice2, placedSize); - if (slice2.size || $from.pos != this.$to.pos) - return new ReplaceStep($from.pos, $to.pos, slice2); - return null; - } - // Find a position on the start spine of `this.unplaced` that has - // content that can be moved somewhere on the frontier. Returns two - // depths, one for the slice and one for the frontier. - findFittable() { - let startDepth = this.unplaced.openStart; - for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) { - let node = cur.firstChild; - if (cur.childCount > 1) - openEnd = 0; - if (node.type.spec.isolating && openEnd <= d) { - startDepth = d; - break; - } - cur = node.content; - } - for (let pass = 1; pass <= 2; pass++) { - for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) { - let fragment, parent = null; - if (sliceDepth) { - parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild; - fragment = parent.content; - } else { - fragment = this.unplaced.content; - } - let first2 = fragment.firstChild; - for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) { - let { type, match } = this.frontier[frontierDepth], wrap2, inject = null; - if (pass == 1 && (first2 ? match.matchType(first2.type) || (inject = match.fillBefore(Fragment.from(first2), false)) : parent && type.compatibleContent(parent.type))) - return { sliceDepth, frontierDepth, parent, inject }; - else if (pass == 2 && first2 && (wrap2 = match.findWrapping(first2.type))) - return { sliceDepth, frontierDepth, parent, wrap: wrap2 }; - if (parent && match.matchType(parent.type)) - break; - } - } - } - } - openMore() { - let { content, openStart, openEnd } = this.unplaced; - let inner = contentAt(content, openStart); - if (!inner.childCount || inner.firstChild.isLeaf) - return false; - this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0)); - return true; - } - dropNode() { - let { content, openStart, openEnd } = this.unplaced; - let inner = contentAt(content, openStart); - if (inner.childCount <= 1 && openStart > 0) { - let openAtEnd = content.size - openStart <= openStart + inner.size; - this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd); - } else { - this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd); - } - } - // Move content from the unplaced slice at `sliceDepth` to the - // frontier node at `frontierDepth`. Close that frontier node when - // applicable. - placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap: wrap2 }) { - while (this.depth > frontierDepth) - this.closeFrontierNode(); - if (wrap2) - for (let i = 0; i < wrap2.length; i++) - this.openFrontierNode(wrap2[i]); - let slice2 = this.unplaced, fragment = parent ? parent.content : slice2.content; - let openStart = slice2.openStart - sliceDepth; - let taken = 0, add = []; - let { match, type } = this.frontier[frontierDepth]; - if (inject) { - for (let i = 0; i < inject.childCount; i++) - add.push(inject.child(i)); - match = match.matchFragment(inject); - } - let openEndCount = fragment.size + sliceDepth - (slice2.content.size - slice2.openEnd); - while (taken < fragment.childCount) { - let next = fragment.child(taken), matches2 = match.matchType(next.type); - if (!matches2) - break; - taken++; - if (taken > 1 || openStart == 0 || next.content.size) { - match = matches2; - add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1)); - } - } - let toEnd = taken == fragment.childCount; - if (!toEnd) - openEndCount = -1; - this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add)); - this.frontier[frontierDepth].match = match; - if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1) - this.closeFrontierNode(); - for (let i = 0, cur = fragment; i < openEndCount; i++) { - let node = cur.lastChild; - this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) }); - cur = node.content; - } - this.unplaced = !toEnd ? new Slice(dropFromFragment(slice2.content, sliceDepth, taken), slice2.openStart, slice2.openEnd) : sliceDepth == 0 ? Slice.empty : new Slice(dropFromFragment(slice2.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice2.openEnd : sliceDepth - 1); - } - mustMoveInline() { - if (!this.$to.parent.isTextblock) - return -1; - let top2 = this.frontier[this.depth], level; - if (!top2.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top2.type, top2.match, false) || this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth) - return -1; - let { depth } = this.$to, after = this.$to.after(depth); - while (depth > 1 && after == this.$to.end(--depth)) - ++after; - return after; - } - findCloseLevel($to) { - scan: - for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) { - let { match, type } = this.frontier[i]; - let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1)); - let fit = contentAfterFits($to, i, type, match, dropInner); - if (!fit) - continue; - for (let d = i - 1; d >= 0; d--) { - let { match: match2, type: type2 } = this.frontier[d]; - let matches2 = contentAfterFits($to, d, type2, match2, true); - if (!matches2 || matches2.childCount) - continue scan; - } - return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to }; - } - } - close($to) { - let close2 = this.findCloseLevel($to); - if (!close2) - return null; - while (this.depth > close2.depth) - this.closeFrontierNode(); - if (close2.fit.childCount) - this.placed = addToFragment(this.placed, close2.depth, close2.fit); - $to = close2.move; - for (let d = close2.depth + 1; d <= $to.depth; d++) { - let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d)); - this.openFrontierNode(node.type, node.attrs, add); - } - return $to; - } - openFrontierNode(type, attrs = null, content) { - let top2 = this.frontier[this.depth]; - top2.match = top2.match.matchType(type); - this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content))); - this.frontier.push({ type, match: type.contentMatch }); - } - closeFrontierNode() { - let open = this.frontier.pop(); - let add = open.match.fillBefore(Fragment.empty, true); - if (add.childCount) - this.placed = addToFragment(this.placed, this.frontier.length, add); - } -}; -function dropFromFragment(fragment, depth, count) { - if (depth == 0) - return fragment.cutByIndex(count, fragment.childCount); - return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count))); -} -function addToFragment(fragment, depth, content) { - if (depth == 0) - return fragment.append(content); - return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content))); -} -function contentAt(fragment, depth) { - for (let i = 0; i < depth; i++) - fragment = fragment.firstChild.content; - return fragment; -} -function closeNodeStart(node, openStart, openEnd) { - if (openStart <= 0) - return node; - let frag = node.content; - if (openStart > 1) - frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0)); - if (openStart > 0) { - frag = node.type.contentMatch.fillBefore(frag).append(frag); - if (openEnd <= 0) - frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true)); - } - return node.copy(frag); -} -function contentAfterFits($to, depth, type, match, open) { - let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth); - if (index == node.childCount && !type.compatibleContent(node.type)) - return null; - let fit = match.fillBefore(node.content, true, index); - return fit && !invalidMarks(type, node.content, index) ? fit : null; -} -function invalidMarks(type, fragment, start2) { - for (let i = start2; i < fragment.childCount; i++) - if (!type.allowsMarks(fragment.child(i).marks)) - return true; - return false; -} -function definesContent(type) { - return type.spec.defining || type.spec.definingForContent; -} -function replaceRange(tr2, from2, to, slice2) { - if (!slice2.size) - return tr2.deleteRange(from2, to); - let $from = tr2.doc.resolve(from2), $to = tr2.doc.resolve(to); - if (fitsTrivially($from, $to, slice2)) - return tr2.step(new ReplaceStep(from2, to, slice2)); - let targetDepths = coveredDepths($from, tr2.doc.resolve(to)); - if (targetDepths[targetDepths.length - 1] == 0) - targetDepths.pop(); - let preferredTarget = -($from.depth + 1); - targetDepths.unshift(preferredTarget); - for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) { - let spec = $from.node(d).type.spec; - if (spec.defining || spec.definingAsContext || spec.isolating) - break; - if (targetDepths.indexOf(d) > -1) - preferredTarget = d; - else if ($from.before(d) == pos) - targetDepths.splice(1, 0, -d); - } - let preferredTargetIndex = targetDepths.indexOf(preferredTarget); - let leftNodes = [], preferredDepth = slice2.openStart; - for (let content = slice2.content, i = 0; ; i++) { - let node = content.firstChild; - leftNodes.push(node); - if (i == slice2.openStart) - break; - content = node.content; - } - for (let d = preferredDepth - 1; d >= 0; d--) { - let leftNode = leftNodes[d], def = definesContent(leftNode.type); - if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1))) - preferredDepth = d; - else if (def || !leftNode.type.isTextblock) - break; - } - for (let j = slice2.openStart; j >= 0; j--) { - let openDepth = (j + preferredDepth + 1) % (slice2.openStart + 1); - let insert = leftNodes[openDepth]; - if (!insert) - continue; - for (let i = 0; i < targetDepths.length; i++) { - let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true; - if (targetDepth < 0) { - expand = false; - targetDepth = -targetDepth; - } - let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1); - if (parent.canReplaceWith(index, index, insert.type, insert.marks)) - return tr2.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice2.content, 0, slice2.openStart, openDepth), openDepth, slice2.openEnd)); - } - } - let startSteps = tr2.steps.length; - for (let i = targetDepths.length - 1; i >= 0; i--) { - tr2.replace(from2, to, slice2); - if (tr2.steps.length > startSteps) - break; - let depth = targetDepths[i]; - if (depth < 0) - continue; - from2 = $from.before(depth); - to = $to.after(depth); - } -} -function closeFragment(fragment, depth, oldOpen, newOpen, parent) { - if (depth < oldOpen) { - let first2 = fragment.firstChild; - fragment = fragment.replaceChild(0, first2.copy(closeFragment(first2.content, depth + 1, oldOpen, newOpen, first2))); - } - if (depth > newOpen) { - let match = parent.contentMatchAt(0); - let start2 = match.fillBefore(fragment).append(fragment); - fragment = start2.append(match.matchFragment(start2).fillBefore(Fragment.empty, true)); - } - return fragment; -} -function replaceRangeWith(tr2, from2, to, node) { - if (!node.isInline && from2 == to && tr2.doc.resolve(from2).parent.content.size) { - let point = insertPoint(tr2.doc, from2, node.type); - if (point != null) - from2 = to = point; - } - tr2.replaceRange(from2, to, new Slice(Fragment.from(node), 0, 0)); -} -function deleteRange(tr2, from2, to) { - let $from = tr2.doc.resolve(from2), $to = tr2.doc.resolve(to); - let covered = coveredDepths($from, $to); - for (let i = 0; i < covered.length; i++) { - let depth = covered[i], last = i == covered.length - 1; - if (last && depth == 0 || $from.node(depth).type.contentMatch.validEnd) - return tr2.delete($from.start(depth), $to.end(depth)); - if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1)))) - return tr2.delete($from.before(depth), $to.after(depth)); - } - for (let d = 1; d <= $from.depth && d <= $to.depth; d++) { - if (from2 - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d) - return tr2.delete($from.before(d), to); - } - tr2.delete(from2, to); -} -function coveredDepths($from, $to) { - let result = [], minDepth = Math.min($from.depth, $to.depth); - for (let d = minDepth; d >= 0; d--) { - let start2 = $from.start(d); - if (start2 < $from.pos - ($from.depth - d) || $to.end(d) > $to.pos + ($to.depth - d) || $from.node(d).type.spec.isolating || $to.node(d).type.spec.isolating) - break; - if (start2 == $to.start(d) || d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent && d && $to.start(d - 1) == start2 - 1) - result.push(d); - } - return result; -} -var AttrStep = class _AttrStep extends Step { - /** - Construct an attribute step. - */ - constructor(pos, attr, value) { - super(); - this.pos = pos; - this.attr = attr; - this.value = value; - } - apply(doc3) { - let node = doc3.nodeAt(this.pos); - if (!node) - return StepResult.fail("No node at attribute step's position"); - let attrs = /* @__PURE__ */ Object.create(null); - for (let name in node.attrs) - attrs[name] = node.attrs[name]; - attrs[this.attr] = this.value; - let updated = node.type.create(attrs, null, node.marks); - return StepResult.fromReplace(doc3, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1)); - } - getMap() { - return StepMap.empty; - } - invert(doc3) { - return new _AttrStep(this.pos, this.attr, doc3.nodeAt(this.pos).attrs[this.attr]); - } - map(mapping) { - let pos = mapping.mapResult(this.pos, 1); - return pos.deletedAfter ? null : new _AttrStep(pos.pos, this.attr, this.value); - } - toJSON() { - return { stepType: "attr", pos: this.pos, attr: this.attr, value: this.value }; - } - static fromJSON(schema, json2) { - if (typeof json2.pos != "number" || typeof json2.attr != "string") - throw new RangeError("Invalid input for AttrStep.fromJSON"); - return new _AttrStep(json2.pos, json2.attr, json2.value); - } -}; -Step.jsonID("attr", AttrStep); -var DocAttrStep = class _DocAttrStep extends Step { - /** - Construct an attribute step. - */ - constructor(attr, value) { - super(); - this.attr = attr; - this.value = value; - } - apply(doc3) { - let attrs = /* @__PURE__ */ Object.create(null); - for (let name in doc3.attrs) - attrs[name] = doc3.attrs[name]; - attrs[this.attr] = this.value; - let updated = doc3.type.create(attrs, doc3.content, doc3.marks); - return StepResult.ok(updated); - } - getMap() { - return StepMap.empty; - } - invert(doc3) { - return new _DocAttrStep(this.attr, doc3.attrs[this.attr]); - } - map(mapping) { - return this; - } - toJSON() { - return { stepType: "docAttr", attr: this.attr, value: this.value }; - } - static fromJSON(schema, json2) { - if (typeof json2.attr != "string") - throw new RangeError("Invalid input for DocAttrStep.fromJSON"); - return new _DocAttrStep(json2.attr, json2.value); - } -}; -Step.jsonID("docAttr", DocAttrStep); -var TransformError = class extends Error { -}; -TransformError = function TransformError2(message) { - let err = Error.call(this, message); - err.__proto__ = TransformError2.prototype; - return err; -}; -TransformError.prototype = Object.create(Error.prototype); -TransformError.prototype.constructor = TransformError; -TransformError.prototype.name = "TransformError"; -var Transform = class { - /** - Create a transform that starts with the given document. - */ - constructor(doc3) { - this.doc = doc3; - this.steps = []; - this.docs = []; - this.mapping = new Mapping(); - } - /** - The starting document. - */ - get before() { - return this.docs.length ? this.docs[0] : this.doc; - } - /** - Apply a new step in this transform, saving the result. Throws an - error when the step fails. - */ - step(step) { - let result = this.maybeStep(step); - if (result.failed) - throw new TransformError(result.failed); - return this; - } - /** - Try to apply a step in this transformation, ignoring it if it - fails. Returns the step result. - */ - maybeStep(step) { - let result = step.apply(this.doc); - if (!result.failed) - this.addStep(step, result.doc); - return result; - } - /** - True when the document has been changed (when there are any - steps). - */ - get docChanged() { - return this.steps.length > 0; - } - /** - @internal - */ - addStep(step, doc3) { - this.docs.push(this.doc); - this.steps.push(step); - this.mapping.appendMap(step.getMap()); - this.doc = doc3; - } - /** - Replace the part of the document between `from` and `to` with the - given `slice`. - */ - replace(from2, to = from2, slice2 = Slice.empty) { - let step = replaceStep(this.doc, from2, to, slice2); - if (step) - this.step(step); - return this; - } - /** - Replace the given range with the given content, which may be a - fragment, node, or array of nodes. - */ - replaceWith(from2, to, content) { - return this.replace(from2, to, new Slice(Fragment.from(content), 0, 0)); - } - /** - Delete the content between the given positions. - */ - delete(from2, to) { - return this.replace(from2, to, Slice.empty); - } - /** - Insert the given content at the given position. - */ - insert(pos, content) { - return this.replaceWith(pos, pos, content); - } - /** - Replace a range of the document with a given slice, using - `from`, `to`, and the slice's - [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather - than fixed start and end points. This method may grow the - replaced area or close open nodes in the slice in order to get a - fit that is more in line with WYSIWYG expectations, by dropping - fully covered parent nodes of the replaced region when they are - marked [non-defining as - context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an - open parent node from the slice that _is_ marked as [defining - its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent). - - This is the method, for example, to handle paste. The similar - [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more - primitive tool which will _not_ move the start and end of its given - range, and is useful in situations where you need more precise - control over what happens. - */ - replaceRange(from2, to, slice2) { - replaceRange(this, from2, to, slice2); - return this; - } - /** - Replace the given range with a node, but use `from` and `to` as - hints, rather than precise positions. When from and to are the same - and are at the start or end of a parent node in which the given - node doesn't fit, this method may _move_ them out towards a parent - that does allow the given node to be placed. When the given range - completely covers a parent node, this method may completely replace - that parent node. - */ - replaceRangeWith(from2, to, node) { - replaceRangeWith(this, from2, to, node); - return this; - } - /** - Delete the given range, expanding it to cover fully covered - parent nodes until a valid replace is found. - */ - deleteRange(from2, to) { - deleteRange(this, from2, to); - return this; - } - /** - Split the content in the given range off from its parent, if there - is sibling content before or after it, and move it up the tree to - the depth specified by `target`. You'll probably want to use - [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make - sure the lift is valid. - */ - lift(range, target) { - lift(this, range, target); - return this; - } - /** - Join the blocks around the given position. If depth is 2, their - last and first siblings are also joined, and so on. - */ - join(pos, depth = 1) { - join(this, pos, depth); - return this; - } - /** - Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers. - The wrappers are assumed to be valid in this position, and should - probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping). - */ - wrap(range, wrappers) { - wrap(this, range, wrappers); - return this; - } - /** - Set the type of all textblocks (partly) between `from` and `to` to - the given node type with the given attributes. - */ - setBlockType(from2, to = from2, type, attrs = null) { - setBlockType(this, from2, to, type, attrs); - return this; - } - /** - Change the type, attributes, and/or marks of the node at `pos`. - When `type` isn't given, the existing node type is preserved, - */ - setNodeMarkup(pos, type, attrs = null, marks) { - setNodeMarkup(this, pos, type, attrs, marks); - return this; - } - /** - Set a single attribute on a given node to a new value. - The `pos` addresses the document content. Use `setDocAttribute` - to set attributes on the document itself. - */ - setNodeAttribute(pos, attr, value) { - this.step(new AttrStep(pos, attr, value)); - return this; - } - /** - Set a single attribute on the document to a new value. - */ - setDocAttribute(attr, value) { - this.step(new DocAttrStep(attr, value)); - return this; - } - /** - Add a mark to the node at position `pos`. - */ - addNodeMark(pos, mark) { - this.step(new AddNodeMarkStep(pos, mark)); - return this; - } - /** - Remove a mark (or a mark of the given type) from the node at - position `pos`. - */ - removeNodeMark(pos, mark) { - if (!(mark instanceof Mark)) { - let node = this.doc.nodeAt(pos); - if (!node) - throw new RangeError("No node at position " + pos); - mark = mark.isInSet(node.marks); - if (!mark) - return this; - } - this.step(new RemoveNodeMarkStep(pos, mark)); - return this; - } - /** - Split the node at the given position, and optionally, if `depth` is - greater than one, any number of nodes above that. By default, the - parts split off will inherit the node type of the original node. - This can be changed by passing an array of types and attributes to - use after the split. - */ - split(pos, depth = 1, typesAfter) { - split(this, pos, depth, typesAfter); - return this; - } - /** - Add the given mark to the inline content between `from` and `to`. - */ - addMark(from2, to, mark) { - addMark(this, from2, to, mark); - return this; - } - /** - Remove marks from inline nodes between `from` and `to`. When - `mark` is a single mark, remove precisely that mark. When it is - a mark type, remove all marks of that type. When it is null, - remove all marks of any type. - */ - removeMark(from2, to, mark) { - removeMark(this, from2, to, mark); - return this; - } - /** - Removes all marks and nodes from the content of the node at - `pos` that don't match the given new parent node type. Accepts - an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as - third argument. - */ - clearIncompatible(pos, parentType, match) { - clearIncompatible(this, pos, parentType, match); - return this; - } -}; - -// node_modules/prosemirror-state/dist/index.js -var classesById = /* @__PURE__ */ Object.create(null); -var Selection = class { - /** - Initialize a selection with the head and anchor and ranges. If no - ranges are given, constructs a single range across `$anchor` and - `$head`. - */ - constructor($anchor, $head, ranges) { - this.$anchor = $anchor; - this.$head = $head; - this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))]; - } - /** - The selection's anchor, as an unresolved position. - */ - get anchor() { - return this.$anchor.pos; - } - /** - The selection's head. - */ - get head() { - return this.$head.pos; - } - /** - The lower bound of the selection's main range. - */ - get from() { - return this.$from.pos; - } - /** - The upper bound of the selection's main range. - */ - get to() { - return this.$to.pos; - } - /** - The resolved lower bound of the selection's main range. - */ - get $from() { - return this.ranges[0].$from; - } - /** - The resolved upper bound of the selection's main range. - */ - get $to() { - return this.ranges[0].$to; - } - /** - Indicates whether the selection contains any content. - */ - get empty() { - let ranges = this.ranges; - for (let i = 0; i < ranges.length; i++) - if (ranges[i].$from.pos != ranges[i].$to.pos) - return false; - return true; - } - /** - Get the content of this selection as a slice. - */ - content() { - return this.$from.doc.slice(this.from, this.to, true); - } - /** - Replace the selection with a slice or, if no slice is given, - delete the selection. Will append to the given transaction. - */ - replace(tr2, content = Slice.empty) { - let lastNode = content.content.lastChild, lastParent = null; - for (let i = 0; i < content.openEnd; i++) { - lastParent = lastNode; - lastNode = lastNode.lastChild; - } - let mapFrom = tr2.steps.length, ranges = this.ranges; - for (let i = 0; i < ranges.length; i++) { - let { $from, $to } = ranges[i], mapping = tr2.mapping.slice(mapFrom); - tr2.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content); - if (i == 0) - selectionToInsertionEnd(tr2, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1); - } - } - /** - Replace the selection with the given node, appending the changes - to the given transaction. - */ - replaceWith(tr2, node) { - let mapFrom = tr2.steps.length, ranges = this.ranges; - for (let i = 0; i < ranges.length; i++) { - let { $from, $to } = ranges[i], mapping = tr2.mapping.slice(mapFrom); - let from2 = mapping.map($from.pos), to = mapping.map($to.pos); - if (i) { - tr2.deleteRange(from2, to); - } else { - tr2.replaceRangeWith(from2, to, node); - selectionToInsertionEnd(tr2, mapFrom, node.isInline ? -1 : 1); - } - } - } - /** - Find a valid cursor or leaf node selection starting at the given - position and searching back if `dir` is negative, and forward if - positive. When `textOnly` is true, only consider cursor - selections. Will return null when no valid selection position is - found. - */ - static findFrom($pos, dir, textOnly = false) { - let inner = $pos.parent.inlineContent ? new TextSelection($pos) : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly); - if (inner) - return inner; - for (let depth = $pos.depth - 1; depth >= 0; depth--) { - let found2 = dir < 0 ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly) : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly); - if (found2) - return found2; - } - return null; - } - /** - Find a valid cursor or leaf node selection near the given - position. Searches forward first by default, but if `bias` is - negative, it will search backwards first. - */ - static near($pos, bias = 1) { - return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0)); - } - /** - Find the cursor or leaf node selection closest to the start of - the given document. Will return an - [`AllSelection`](https://prosemirror.net/docs/ref/#state.AllSelection) if no valid position - exists. - */ - static atStart(doc3) { - return findSelectionIn(doc3, doc3, 0, 0, 1) || new AllSelection(doc3); - } - /** - Find the cursor or leaf node selection closest to the end of the - given document. - */ - static atEnd(doc3) { - return findSelectionIn(doc3, doc3, doc3.content.size, doc3.childCount, -1) || new AllSelection(doc3); - } - /** - Deserialize the JSON representation of a selection. Must be - implemented for custom classes (as a static class method). - */ - static fromJSON(doc3, json2) { - if (!json2 || !json2.type) - throw new RangeError("Invalid input for Selection.fromJSON"); - let cls = classesById[json2.type]; - if (!cls) - throw new RangeError(`No selection type ${json2.type} defined`); - return cls.fromJSON(doc3, json2); - } - /** - To be able to deserialize selections from JSON, custom selection - classes must register themselves with an ID string, so that they - can be disambiguated. Try to pick something that's unlikely to - clash with classes from other modules. - */ - static jsonID(id, selectionClass) { - if (id in classesById) - throw new RangeError("Duplicate use of selection JSON ID " + id); - classesById[id] = selectionClass; - selectionClass.prototype.jsonID = id; - return selectionClass; - } - /** - Get a [bookmark](https://prosemirror.net/docs/ref/#state.SelectionBookmark) for this selection, - which is a value that can be mapped without having access to a - current document, and later resolved to a real selection for a - given document again. (This is used mostly by the history to - track and restore old selections.) The default implementation of - this method just converts the selection to a text selection and - returns the bookmark for that. - */ - getBookmark() { - return TextSelection.between(this.$anchor, this.$head).getBookmark(); - } -}; -Selection.prototype.visible = true; -var SelectionRange = class { - /** - Create a range. - */ - constructor($from, $to) { - this.$from = $from; - this.$to = $to; - } -}; -var warnedAboutTextSelection = false; -function checkTextSelection($pos) { - if (!warnedAboutTextSelection && !$pos.parent.inlineContent) { - warnedAboutTextSelection = true; - console["warn"]("TextSelection endpoint not pointing into a node with inline content (" + $pos.parent.type.name + ")"); - } -} -var TextSelection = class _TextSelection extends Selection { - /** - Construct a text selection between the given points. - */ - constructor($anchor, $head = $anchor) { - checkTextSelection($anchor); - checkTextSelection($head); - super($anchor, $head); - } - /** - Returns a resolved position if this is a cursor selection (an - empty text selection), and null otherwise. - */ - get $cursor() { - return this.$anchor.pos == this.$head.pos ? this.$head : null; - } - map(doc3, mapping) { - let $head = doc3.resolve(mapping.map(this.head)); - if (!$head.parent.inlineContent) - return Selection.near($head); - let $anchor = doc3.resolve(mapping.map(this.anchor)); - return new _TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head); - } - replace(tr2, content = Slice.empty) { - super.replace(tr2, content); - if (content == Slice.empty) { - let marks = this.$from.marksAcross(this.$to); - if (marks) - tr2.ensureMarks(marks); - } - } - eq(other) { - return other instanceof _TextSelection && other.anchor == this.anchor && other.head == this.head; - } - getBookmark() { - return new TextBookmark(this.anchor, this.head); - } - toJSON() { - return { type: "text", anchor: this.anchor, head: this.head }; - } - /** - @internal - */ - static fromJSON(doc3, json2) { - if (typeof json2.anchor != "number" || typeof json2.head != "number") - throw new RangeError("Invalid input for TextSelection.fromJSON"); - return new _TextSelection(doc3.resolve(json2.anchor), doc3.resolve(json2.head)); - } - /** - Create a text selection from non-resolved positions. - */ - static create(doc3, anchor, head = anchor) { - let $anchor = doc3.resolve(anchor); - return new this($anchor, head == anchor ? $anchor : doc3.resolve(head)); - } - /** - Return a text selection that spans the given positions or, if - they aren't text positions, find a text selection near them. - `bias` determines whether the method searches forward (default) - or backwards (negative number) first. Will fall back to calling - [`Selection.near`](https://prosemirror.net/docs/ref/#state.Selection^near) when the document - doesn't contain a valid text position. - */ - static between($anchor, $head, bias) { - let dPos = $anchor.pos - $head.pos; - if (!bias || dPos) - bias = dPos >= 0 ? 1 : -1; - if (!$head.parent.inlineContent) { - let found2 = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true); - if (found2) - $head = found2.$head; - else - return Selection.near($head, bias); - } - if (!$anchor.parent.inlineContent) { - if (dPos == 0) { - $anchor = $head; - } else { - $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor; - if ($anchor.pos < $head.pos != dPos < 0) - $anchor = $head; - } - } - return new _TextSelection($anchor, $head); - } -}; -Selection.jsonID("text", TextSelection); -var TextBookmark = class _TextBookmark { - constructor(anchor, head) { - this.anchor = anchor; - this.head = head; - } - map(mapping) { - return new _TextBookmark(mapping.map(this.anchor), mapping.map(this.head)); - } - resolve(doc3) { - return TextSelection.between(doc3.resolve(this.anchor), doc3.resolve(this.head)); - } -}; -var NodeSelection = class _NodeSelection extends Selection { - /** - Create a node selection. Does not verify the validity of its - argument. - */ - constructor($pos) { - let node = $pos.nodeAfter; - let $end = $pos.node(0).resolve($pos.pos + node.nodeSize); - super($pos, $end); - this.node = node; - } - map(doc3, mapping) { - let { deleted, pos } = mapping.mapResult(this.anchor); - let $pos = doc3.resolve(pos); - if (deleted) - return Selection.near($pos); - return new _NodeSelection($pos); - } - content() { - return new Slice(Fragment.from(this.node), 0, 0); - } - eq(other) { - return other instanceof _NodeSelection && other.anchor == this.anchor; - } - toJSON() { - return { type: "node", anchor: this.anchor }; - } - getBookmark() { - return new NodeBookmark(this.anchor); - } - /** - @internal - */ - static fromJSON(doc3, json2) { - if (typeof json2.anchor != "number") - throw new RangeError("Invalid input for NodeSelection.fromJSON"); - return new _NodeSelection(doc3.resolve(json2.anchor)); - } - /** - Create a node selection from non-resolved positions. - */ - static create(doc3, from2) { - return new _NodeSelection(doc3.resolve(from2)); - } - /** - Determines whether the given node may be selected as a node - selection. - */ - static isSelectable(node) { - return !node.isText && node.type.spec.selectable !== false; - } -}; -NodeSelection.prototype.visible = false; -Selection.jsonID("node", NodeSelection); -var NodeBookmark = class _NodeBookmark { - constructor(anchor) { - this.anchor = anchor; - } - map(mapping) { - let { deleted, pos } = mapping.mapResult(this.anchor); - return deleted ? new TextBookmark(pos, pos) : new _NodeBookmark(pos); - } - resolve(doc3) { - let $pos = doc3.resolve(this.anchor), node = $pos.nodeAfter; - if (node && NodeSelection.isSelectable(node)) - return new NodeSelection($pos); - return Selection.near($pos); - } -}; -var AllSelection = class _AllSelection extends Selection { - /** - Create an all-selection over the given document. - */ - constructor(doc3) { - super(doc3.resolve(0), doc3.resolve(doc3.content.size)); - } - replace(tr2, content = Slice.empty) { - if (content == Slice.empty) { - tr2.delete(0, tr2.doc.content.size); - let sel = Selection.atStart(tr2.doc); - if (!sel.eq(tr2.selection)) - tr2.setSelection(sel); - } else { - super.replace(tr2, content); - } - } - toJSON() { - return { type: "all" }; - } - /** - @internal - */ - static fromJSON(doc3) { - return new _AllSelection(doc3); - } - map(doc3) { - return new _AllSelection(doc3); - } - eq(other) { - return other instanceof _AllSelection; - } - getBookmark() { - return AllBookmark; - } -}; -Selection.jsonID("all", AllSelection); -var AllBookmark = { - map() { - return this; - }, - resolve(doc3) { - return new AllSelection(doc3); - } -}; -function findSelectionIn(doc3, node, pos, index, dir, text = false) { - if (node.inlineContent) - return TextSelection.create(doc3, pos); - for (let i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) { - let child = node.child(i); - if (!child.isAtom) { - let inner = findSelectionIn(doc3, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text); - if (inner) - return inner; - } else if (!text && NodeSelection.isSelectable(child)) { - return NodeSelection.create(doc3, pos - (dir < 0 ? child.nodeSize : 0)); - } - pos += child.nodeSize * dir; - } - return null; -} -function selectionToInsertionEnd(tr2, startLen, bias) { - let last = tr2.steps.length - 1; - if (last < startLen) - return; - let step = tr2.steps[last]; - if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) - return; - let map2 = tr2.mapping.maps[last], end2; - map2.forEach((_from, _to, _newFrom, newTo) => { - if (end2 == null) - end2 = newTo; - }); - tr2.setSelection(Selection.near(tr2.doc.resolve(end2), bias)); -} -var UPDATED_SEL = 1; -var UPDATED_MARKS = 2; -var UPDATED_SCROLL = 4; -var Transaction = class extends Transform { - /** - @internal - */ - constructor(state) { - super(state.doc); - this.curSelectionFor = 0; - this.updated = 0; - this.meta = /* @__PURE__ */ Object.create(null); - this.time = Date.now(); - this.curSelection = state.selection; - this.storedMarks = state.storedMarks; - } - /** - The transaction's current selection. This defaults to the editor - selection [mapped](https://prosemirror.net/docs/ref/#state.Selection.map) through the steps in the - transaction, but can be overwritten with - [`setSelection`](https://prosemirror.net/docs/ref/#state.Transaction.setSelection). - */ - get selection() { - if (this.curSelectionFor < this.steps.length) { - this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor)); - this.curSelectionFor = this.steps.length; - } - return this.curSelection; - } - /** - Update the transaction's current selection. Will determine the - selection that the editor gets when the transaction is applied. - */ - setSelection(selection) { - if (selection.$from.doc != this.doc) - throw new RangeError("Selection passed to setSelection must point at the current document"); - this.curSelection = selection; - this.curSelectionFor = this.steps.length; - this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS; - this.storedMarks = null; - return this; - } - /** - Whether the selection was explicitly updated by this transaction. - */ - get selectionSet() { - return (this.updated & UPDATED_SEL) > 0; - } - /** - Set the current stored marks. - */ - setStoredMarks(marks) { - this.storedMarks = marks; - this.updated |= UPDATED_MARKS; - return this; - } - /** - Make sure the current stored marks or, if that is null, the marks - at the selection, match the given set of marks. Does nothing if - this is already the case. - */ - ensureMarks(marks) { - if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks)) - this.setStoredMarks(marks); - return this; - } - /** - Add a mark to the set of stored marks. - */ - addStoredMark(mark) { - return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks())); - } - /** - Remove a mark or mark type from the set of stored marks. - */ - removeStoredMark(mark) { - return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks())); - } - /** - Whether the stored marks were explicitly set for this transaction. - */ - get storedMarksSet() { - return (this.updated & UPDATED_MARKS) > 0; - } - /** - @internal - */ - addStep(step, doc3) { - super.addStep(step, doc3); - this.updated = this.updated & ~UPDATED_MARKS; - this.storedMarks = null; - } - /** - Update the timestamp for the transaction. - */ - setTime(time) { - this.time = time; - return this; - } - /** - Replace the current selection with the given slice. - */ - replaceSelection(slice2) { - this.selection.replace(this, slice2); - return this; - } - /** - Replace the selection with the given node. When `inheritMarks` is - true and the content is inline, it inherits the marks from the - place where it is inserted. - */ - replaceSelectionWith(node, inheritMarks = true) { - let selection = this.selection; - if (inheritMarks) - node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : selection.$from.marksAcross(selection.$to) || Mark.none)); - selection.replaceWith(this, node); - return this; - } - /** - Delete the selection. - */ - deleteSelection() { - this.selection.replace(this); - return this; - } - /** - Replace the given range, or the selection if no range is given, - with a text node containing the given string. - */ - insertText(text, from2, to) { - let schema = this.doc.type.schema; - if (from2 == null) { - if (!text) - return this.deleteSelection(); - return this.replaceSelectionWith(schema.text(text), true); - } else { - if (to == null) - to = from2; - to = to == null ? from2 : to; - if (!text) - return this.deleteRange(from2, to); - let marks = this.storedMarks; - if (!marks) { - let $from = this.doc.resolve(from2); - marks = to == from2 ? $from.marks() : $from.marksAcross(this.doc.resolve(to)); - } - this.replaceRangeWith(from2, to, schema.text(text, marks)); - if (!this.selection.empty) - this.setSelection(Selection.near(this.selection.$to)); - return this; - } - } - /** - Store a metadata property in this transaction, keyed either by - name or by plugin. - */ - setMeta(key, value) { - this.meta[typeof key == "string" ? key : key.key] = value; - return this; - } - /** - Retrieve a metadata property for a given name or plugin. - */ - getMeta(key) { - return this.meta[typeof key == "string" ? key : key.key]; - } - /** - Returns true if this transaction doesn't contain any metadata, - and can thus safely be extended. - */ - get isGeneric() { - for (let _ in this.meta) - return false; - return true; - } - /** - Indicate that the editor should scroll the selection into view - when updated to the state produced by this transaction. - */ - scrollIntoView() { - this.updated |= UPDATED_SCROLL; - return this; - } - /** - True when this transaction has had `scrollIntoView` called on it. - */ - get scrolledIntoView() { - return (this.updated & UPDATED_SCROLL) > 0; - } -}; -function bind(f, self2) { - return !self2 || !f ? f : f.bind(self2); -} -var FieldDesc = class { - constructor(name, desc, self2) { - this.name = name; - this.init = bind(desc.init, self2); - this.apply = bind(desc.apply, self2); - } -}; -var baseFields = [ - new FieldDesc("doc", { - init(config) { - return config.doc || config.schema.topNodeType.createAndFill(); - }, - apply(tr2) { - return tr2.doc; - } - }), - new FieldDesc("selection", { - init(config, instance) { - return config.selection || Selection.atStart(instance.doc); - }, - apply(tr2) { - return tr2.selection; - } - }), - new FieldDesc("storedMarks", { - init(config) { - return config.storedMarks || null; - }, - apply(tr2, _marks, _old, state) { - return state.selection.$cursor ? tr2.storedMarks : null; - } - }), - new FieldDesc("scrollToSelection", { - init() { - return 0; - }, - apply(tr2, prev) { - return tr2.scrolledIntoView ? prev + 1 : prev; - } - }) -]; -var Configuration = class { - constructor(schema, plugins) { - this.schema = schema; - this.plugins = []; - this.pluginsByKey = /* @__PURE__ */ Object.create(null); - this.fields = baseFields.slice(); - if (plugins) - plugins.forEach((plugin) => { - if (this.pluginsByKey[plugin.key]) - throw new RangeError("Adding different instances of a keyed plugin (" + plugin.key + ")"); - this.plugins.push(plugin); - this.pluginsByKey[plugin.key] = plugin; - if (plugin.spec.state) - this.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin)); - }); - } -}; -var EditorState = class _EditorState { - /** - @internal - */ - constructor(config) { - this.config = config; - } - /** - The schema of the state's document. - */ - get schema() { - return this.config.schema; - } - /** - The plugins that are active in this state. - */ - get plugins() { - return this.config.plugins; - } - /** - Apply the given transaction to produce a new state. - */ - apply(tr2) { - return this.applyTransaction(tr2).state; - } - /** - @internal - */ - filterTransaction(tr2, ignore = -1) { - for (let i = 0; i < this.config.plugins.length; i++) - if (i != ignore) { - let plugin = this.config.plugins[i]; - if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr2, this)) - return false; - } - return true; - } - /** - Verbose variant of [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) that - returns the precise transactions that were applied (which might - be influenced by the [transaction - hooks](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) of - plugins) along with the new state. - */ - applyTransaction(rootTr) { - if (!this.filterTransaction(rootTr)) - return { state: this, transactions: [] }; - let trs = [rootTr], newState = this.applyInner(rootTr), seen = null; - for (; ; ) { - let haveNew = false; - for (let i = 0; i < this.config.plugins.length; i++) { - let plugin = this.config.plugins[i]; - if (plugin.spec.appendTransaction) { - let n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this; - let tr2 = n < trs.length && plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState); - if (tr2 && newState.filterTransaction(tr2, i)) { - tr2.setMeta("appendedTransaction", rootTr); - if (!seen) { - seen = []; - for (let j = 0; j < this.config.plugins.length; j++) - seen.push(j < i ? { state: newState, n: trs.length } : { state: this, n: 0 }); - } - trs.push(tr2); - newState = newState.applyInner(tr2); - haveNew = true; - } - if (seen) - seen[i] = { state: newState, n: trs.length }; - } - } - if (!haveNew) - return { state: newState, transactions: trs }; - } - } - /** - @internal - */ - applyInner(tr2) { - if (!tr2.before.eq(this.doc)) - throw new RangeError("Applying a mismatched transaction"); - let newInstance = new _EditorState(this.config), fields = this.config.fields; - for (let i = 0; i < fields.length; i++) { - let field = fields[i]; - newInstance[field.name] = field.apply(tr2, this[field.name], this, newInstance); - } - return newInstance; - } - /** - Start a [transaction](https://prosemirror.net/docs/ref/#state.Transaction) from this state. - */ - get tr() { - return new Transaction(this); - } - /** - Create a new state. - */ - static create(config) { - let $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins); - let instance = new _EditorState($config); - for (let i = 0; i < $config.fields.length; i++) - instance[$config.fields[i].name] = $config.fields[i].init(config, instance); - return instance; - } - /** - Create a new state based on this one, but with an adjusted set - of active plugins. State fields that exist in both sets of - plugins are kept unchanged. Those that no longer exist are - dropped, and those that are new are initialized using their - [`init`](https://prosemirror.net/docs/ref/#state.StateField.init) method, passing in the new - configuration object.. - */ - reconfigure(config) { - let $config = new Configuration(this.schema, config.plugins); - let fields = $config.fields, instance = new _EditorState($config); - for (let i = 0; i < fields.length; i++) { - let name = fields[i].name; - instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance); - } - return instance; - } - /** - Serialize this state to JSON. If you want to serialize the state - of plugins, pass an object mapping property names to use in the - resulting JSON object to plugin objects. The argument may also be - a string or number, in which case it is ignored, to support the - way `JSON.stringify` calls `toString` methods. - */ - toJSON(pluginFields) { - let result = { doc: this.doc.toJSON(), selection: this.selection.toJSON() }; - if (this.storedMarks) - result.storedMarks = this.storedMarks.map((m) => m.toJSON()); - if (pluginFields && typeof pluginFields == "object") - for (let prop in pluginFields) { - if (prop == "doc" || prop == "selection") - throw new RangeError("The JSON fields `doc` and `selection` are reserved"); - let plugin = pluginFields[prop], state = plugin.spec.state; - if (state && state.toJSON) - result[prop] = state.toJSON.call(plugin, this[plugin.key]); - } - return result; - } - /** - Deserialize a JSON representation of a state. `config` should - have at least a `schema` field, and should contain array of - plugins to initialize the state with. `pluginFields` can be used - to deserialize the state of plugins, by associating plugin - instances with the property names they use in the JSON object. - */ - static fromJSON(config, json2, pluginFields) { - if (!json2) - throw new RangeError("Invalid input for EditorState.fromJSON"); - if (!config.schema) - throw new RangeError("Required config field 'schema' missing"); - let $config = new Configuration(config.schema, config.plugins); - let instance = new _EditorState($config); - $config.fields.forEach((field) => { - if (field.name == "doc") { - instance.doc = Node.fromJSON(config.schema, json2.doc); - } else if (field.name == "selection") { - instance.selection = Selection.fromJSON(instance.doc, json2.selection); - } else if (field.name == "storedMarks") { - if (json2.storedMarks) - instance.storedMarks = json2.storedMarks.map(config.schema.markFromJSON); - } else { - if (pluginFields) - for (let prop in pluginFields) { - let plugin = pluginFields[prop], state = plugin.spec.state; - if (plugin.key == field.name && state && state.fromJSON && Object.prototype.hasOwnProperty.call(json2, prop)) { - instance[field.name] = state.fromJSON.call(plugin, config, json2[prop], instance); - return; - } - } - instance[field.name] = field.init(config, instance); - } - }); - return instance; - } -}; -function bindProps(obj, self2, target) { - for (let prop in obj) { - let val = obj[prop]; - if (val instanceof Function) - val = val.bind(self2); - else if (prop == "handleDOMEvents") - val = bindProps(val, self2, {}); - target[prop] = val; - } - return target; -} -var Plugin = class { - /** - Create a plugin. - */ - constructor(spec) { - this.spec = spec; - this.props = {}; - if (spec.props) - bindProps(spec.props, this, this.props); - this.key = spec.key ? spec.key.key : createKey("plugin"); - } - /** - Extract the plugin's state field from an editor state. - */ - getState(state) { - return state[this.key]; - } -}; -var keys = /* @__PURE__ */ Object.create(null); -function createKey(name) { - if (name in keys) - return name + "$" + ++keys[name]; - keys[name] = 0; - return name + "$"; -} -var PluginKey = class { - /** - Create a plugin key. - */ - constructor(name = "key") { - this.key = createKey(name); - } - /** - Get the active plugin with this key, if any, from an editor - state. - */ - get(state) { - return state.config.pluginsByKey[this.key]; - } - /** - Get the plugin's state from an editor state. - */ - getState(state) { - return state[this.key]; - } -}; - -// node_modules/prosemirror-view/dist/index.js -var domIndex = function(node) { - for (var index = 0; ; index++) { - node = node.previousSibling; - if (!node) - return index; - } -}; -var parentNode = function(node) { - let parent = node.assignedSlot || node.parentNode; - return parent && parent.nodeType == 11 ? parent.host : parent; -}; -var reusedRange = null; -var textRange = function(node, from2, to) { - let range = reusedRange || (reusedRange = document.createRange()); - range.setEnd(node, to == null ? node.nodeValue.length : to); - range.setStart(node, from2 || 0); - return range; -}; -var isEquivalentPosition = function(node, off, targetNode, targetOff) { - return targetNode && (scanFor(node, off, targetNode, targetOff, -1) || scanFor(node, off, targetNode, targetOff, 1)); -}; -var atomElements = /^(img|br|input|textarea|hr)$/i; -function scanFor(node, off, targetNode, targetOff, dir) { - for (; ; ) { - if (node == targetNode && off == targetOff) - return true; - if (off == (dir < 0 ? 0 : nodeSize(node))) { - let parent = node.parentNode; - if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == "false") - return false; - off = domIndex(node) + (dir < 0 ? 0 : 1); - node = parent; - } else if (node.nodeType == 1) { - node = node.childNodes[off + (dir < 0 ? -1 : 0)]; - if (node.contentEditable == "false") - return false; - off = dir < 0 ? nodeSize(node) : 0; - } else { - return false; - } - } -} -function nodeSize(node) { - return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length; -} -function isOnEdge(node, offset2, parent) { - for (let atStart = offset2 == 0, atEnd = offset2 == nodeSize(node); atStart || atEnd; ) { - if (node == parent) - return true; - let index = domIndex(node); - node = node.parentNode; - if (!node) - return false; - atStart = atStart && index == 0; - atEnd = atEnd && index == nodeSize(node); - } -} -function hasBlockDesc(dom) { - let desc; - for (let cur = dom; cur; cur = cur.parentNode) - if (desc = cur.pmViewDesc) - break; - return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom); -} -var selectionCollapsed = function(domSel) { - return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset); -}; -function keyEvent(keyCode, key) { - let event = document.createEvent("Event"); - event.initEvent("keydown", true, true); - event.keyCode = keyCode; - event.key = event.code = key; - return event; -} -function deepActiveElement(doc3) { - let elt = doc3.activeElement; - while (elt && elt.shadowRoot) - elt = elt.shadowRoot.activeElement; - return elt; -} -function caretFromPoint(doc3, x, y) { - if (doc3.caretPositionFromPoint) { - try { - let pos = doc3.caretPositionFromPoint(x, y); - if (pos) - return { node: pos.offsetNode, offset: pos.offset }; - } catch (_) { - } - } - if (doc3.caretRangeFromPoint) { - let range = doc3.caretRangeFromPoint(x, y); - if (range) - return { node: range.startContainer, offset: range.startOffset }; - } -} -var nav = typeof navigator != "undefined" ? navigator : null; -var doc2 = typeof document != "undefined" ? document : null; -var agent = nav && nav.userAgent || ""; -var ie_edge = /Edge\/(\d+)/.exec(agent); -var ie_upto10 = /MSIE \d/.exec(agent); -var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(agent); -var ie = !!(ie_upto10 || ie_11up || ie_edge); -var ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0; -var gecko = !ie && /gecko\/(\d+)/i.test(agent); -gecko && +(/Firefox\/(\d+)/.exec(agent) || [0, 0])[1]; -var _chrome = !ie && /Chrome\/(\d+)/.exec(agent); -var chrome = !!_chrome; -var chrome_version = _chrome ? +_chrome[1] : 0; -var safari = !ie && !!nav && /Apple Computer/.test(nav.vendor); -var ios = safari && (/Mobile\/\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2); -var mac = ios || (nav ? /Mac/.test(nav.platform) : false); -var windows = nav ? /Win/.test(nav.platform) : false; -var android = /Android \d/.test(agent); -var webkit = !!doc2 && "webkitFontSmoothing" in doc2.documentElement.style; -var webkit_version = webkit ? +(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0; -function windowRect(doc3) { - return { - left: 0, - right: doc3.documentElement.clientWidth, - top: 0, - bottom: doc3.documentElement.clientHeight - }; -} -function getSide(value, side) { - return typeof value == "number" ? value : value[side]; -} -function clientRect(node) { - let rect = node.getBoundingClientRect(); - let scaleX = rect.width / node.offsetWidth || 1; - let scaleY = rect.height / node.offsetHeight || 1; - return { - left: rect.left, - right: rect.left + node.clientWidth * scaleX, - top: rect.top, - bottom: rect.top + node.clientHeight * scaleY - }; -} -function scrollRectIntoView(view, rect, startDOM) { - let scrollThreshold = view.someProp("scrollThreshold") || 0, scrollMargin = view.someProp("scrollMargin") || 5; - let doc3 = view.dom.ownerDocument; - for (let parent = startDOM || view.dom; ; parent = parentNode(parent)) { - if (!parent) - break; - if (parent.nodeType != 1) - continue; - let elt = parent; - let atTop = elt == doc3.body; - let bounding = atTop ? windowRect(doc3) : clientRect(elt); - let moveX = 0, moveY = 0; - if (rect.top < bounding.top + getSide(scrollThreshold, "top")) - moveY = -(bounding.top - rect.top + getSide(scrollMargin, "top")); - else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, "bottom")) - moveY = rect.bottom - rect.top > bounding.bottom - bounding.top ? rect.top + getSide(scrollMargin, "top") - bounding.top : rect.bottom - bounding.bottom + getSide(scrollMargin, "bottom"); - if (rect.left < bounding.left + getSide(scrollThreshold, "left")) - moveX = -(bounding.left - rect.left + getSide(scrollMargin, "left")); - else if (rect.right > bounding.right - getSide(scrollThreshold, "right")) - moveX = rect.right - bounding.right + getSide(scrollMargin, "right"); - if (moveX || moveY) { - if (atTop) { - doc3.defaultView.scrollBy(moveX, moveY); - } else { - let startX = elt.scrollLeft, startY = elt.scrollTop; - if (moveY) - elt.scrollTop += moveY; - if (moveX) - elt.scrollLeft += moveX; - let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY; - rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY }; - } - } - if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent).position)) - break; - } -} -function storeScrollPos(view) { - let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top); - let refDOM, refTop; - for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) { - let dom = view.root.elementFromPoint(x, y); - if (!dom || dom == view.dom || !view.dom.contains(dom)) - continue; - let localRect = dom.getBoundingClientRect(); - if (localRect.top >= startY - 20) { - refDOM = dom; - refTop = localRect.top; - break; - } - } - return { refDOM, refTop, stack: scrollStack(view.dom) }; -} -function scrollStack(dom) { - let stack = [], doc3 = dom.ownerDocument; - for (let cur = dom; cur; cur = parentNode(cur)) { - stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft }); - if (dom == doc3) - break; - } - return stack; -} -function resetScrollPos({ refDOM, refTop, stack }) { - let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0; - restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop); -} -function restoreScrollStack(stack, dTop) { - for (let i = 0; i < stack.length; i++) { - let { dom, top: top2, left: left2 } = stack[i]; - if (dom.scrollTop != top2 + dTop) - dom.scrollTop = top2 + dTop; - if (dom.scrollLeft != left2) - dom.scrollLeft = left2; - } -} -var preventScrollSupported = null; -function focusPreventScroll(dom) { - if (dom.setActive) - return dom.setActive(); - if (preventScrollSupported) - return dom.focus(preventScrollSupported); - let stored = scrollStack(dom); - dom.focus(preventScrollSupported == null ? { - get preventScroll() { - preventScrollSupported = { preventScroll: true }; - return true; - } - } : void 0); - if (!preventScrollSupported) { - preventScrollSupported = false; - restoreScrollStack(stored, 0); - } -} -function findOffsetInNode(node, coords) { - let closest, dxClosest = 2e8, coordsClosest, offset2 = 0; - let rowBot = coords.top, rowTop = coords.top; - let firstBelow, coordsBelow; - for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) { - let rects; - if (child.nodeType == 1) - rects = child.getClientRects(); - else if (child.nodeType == 3) - rects = textRange(child).getClientRects(); - else - continue; - for (let i = 0; i < rects.length; i++) { - let rect = rects[i]; - if (rect.top <= rowBot && rect.bottom >= rowTop) { - rowBot = Math.max(rect.bottom, rowBot); - rowTop = Math.min(rect.top, rowTop); - let dx = rect.left > coords.left ? rect.left - coords.left : rect.right < coords.left ? coords.left - rect.right : 0; - if (dx < dxClosest) { - closest = child; - dxClosest = dx; - coordsClosest = dx && closest.nodeType == 3 ? { - left: rect.right < coords.left ? rect.right : rect.left, - top: coords.top - } : coords; - if (child.nodeType == 1 && dx) - offset2 = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0); - continue; - } - } else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) { - firstBelow = child; - coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top }; - } - if (!closest && (coords.left >= rect.right && coords.top >= rect.top || coords.left >= rect.left && coords.top >= rect.bottom)) - offset2 = childIndex + 1; - } - } - if (!closest && firstBelow) { - closest = firstBelow; - coordsClosest = coordsBelow; - dxClosest = 0; - } - if (closest && closest.nodeType == 3) - return findOffsetInText(closest, coordsClosest); - if (!closest || dxClosest && closest.nodeType == 1) - return { node, offset: offset2 }; - return findOffsetInNode(closest, coordsClosest); -} -function findOffsetInText(node, coords) { - let len = node.nodeValue.length; - let range = document.createRange(); - for (let i = 0; i < len; i++) { - range.setEnd(node, i + 1); - range.setStart(node, i); - let rect = singleRect(range, 1); - if (rect.top == rect.bottom) - continue; - if (inRect(coords, rect)) - return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) }; - } - return { node, offset: 0 }; -} -function inRect(coords, rect) { - return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 && coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1; -} -function targetKludge(dom, coords) { - let parent = dom.parentNode; - if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left) - return parent; - return dom; -} -function posFromElement(view, elt, coords) { - let { node, offset: offset2 } = findOffsetInNode(elt, coords), bias = -1; - if (node.nodeType == 1 && !node.firstChild) { - let rect = node.getBoundingClientRect(); - bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1; - } - return view.docView.posFromDOM(node, offset2, bias); -} -function posFromCaret(view, node, offset2, coords) { - let outsideBlock = -1; - for (let cur = node, sawBlock = false; ; ) { - if (cur == view.dom) - break; - let desc = view.docView.nearestDesc(cur, true); - if (!desc) - return null; - if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent && !sawBlock || !desc.contentDOM)) { - let rect = desc.dom.getBoundingClientRect(); - if (desc.node.isBlock && desc.parent && !sawBlock) { - sawBlock = true; - if (rect.left > coords.left || rect.top > coords.top) - outsideBlock = desc.posBefore; - else if (rect.right < coords.left || rect.bottom < coords.top) - outsideBlock = desc.posAfter; - } - if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) { - let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2 : coords.left < (rect.left + rect.right) / 2; - return before ? desc.posBefore : desc.posAfter; - } - } - cur = desc.dom.parentNode; - } - return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset2, -1); -} -function elementFromPoint(element, coords, box) { - let len = element.childNodes.length; - if (len && box.top < box.bottom) { - for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI; ; ) { - let child = element.childNodes[i]; - if (child.nodeType == 1) { - let rects = child.getClientRects(); - for (let j = 0; j < rects.length; j++) { - let rect = rects[j]; - if (inRect(coords, rect)) - return elementFromPoint(child, coords, rect); - } - } - if ((i = (i + 1) % len) == startI) - break; - } - } - return element; -} -function posAtCoords(view, coords) { - let doc3 = view.dom.ownerDocument, node, offset2 = 0; - let caret = caretFromPoint(doc3, coords.left, coords.top); - if (caret) - ({ node, offset: offset2 } = caret); - let elt = (view.root.elementFromPoint ? view.root : doc3).elementFromPoint(coords.left, coords.top); - let pos; - if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) { - let box = view.dom.getBoundingClientRect(); - if (!inRect(coords, box)) - return null; - elt = elementFromPoint(view.dom, coords, box); - if (!elt) - return null; - } - if (safari) { - for (let p = elt; node && p; p = parentNode(p)) - if (p.draggable) - node = void 0; - } - elt = targetKludge(elt, coords); - if (node) { - if (gecko && node.nodeType == 1) { - offset2 = Math.min(offset2, node.childNodes.length); - if (offset2 < node.childNodes.length) { - let next = node.childNodes[offset2], box; - if (next.nodeName == "IMG" && (box = next.getBoundingClientRect()).right <= coords.left && box.bottom > coords.top) - offset2++; - } - } - let prev; - if (webkit && offset2 && node.nodeType == 1 && (prev = node.childNodes[offset2 - 1]).nodeType == 1 && prev.contentEditable == "false" && prev.getBoundingClientRect().top >= coords.top) - offset2--; - if (node == view.dom && offset2 == node.childNodes.length - 1 && node.lastChild.nodeType == 1 && coords.top > node.lastChild.getBoundingClientRect().bottom) - pos = view.state.doc.content.size; - else if (offset2 == 0 || node.nodeType != 1 || node.childNodes[offset2 - 1].nodeName != "BR") - pos = posFromCaret(view, node, offset2, coords); - } - if (pos == null) - pos = posFromElement(view, elt, coords); - let desc = view.docView.nearestDesc(elt, true); - return { pos, inside: desc ? desc.posAtStart - desc.border : -1 }; -} -function nonZero(rect) { - return rect.top < rect.bottom || rect.left < rect.right; -} -function singleRect(target, bias) { - let rects = target.getClientRects(); - if (rects.length) { - let first2 = rects[bias < 0 ? 0 : rects.length - 1]; - if (nonZero(first2)) - return first2; - } - return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect(); -} -var BIDI = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; -function coordsAtPos(view, pos, side) { - let { node, offset: offset2, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1); - let supportEmptyRange = webkit || gecko; - if (node.nodeType == 3) { - if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset2 : offset2 == node.nodeValue.length))) { - let rect = singleRect(textRange(node, offset2, offset2), side); - if (gecko && offset2 && /\s/.test(node.nodeValue[offset2 - 1]) && offset2 < node.nodeValue.length) { - let rectBefore = singleRect(textRange(node, offset2 - 1, offset2 - 1), -1); - if (rectBefore.top == rect.top) { - let rectAfter = singleRect(textRange(node, offset2, offset2 + 1), -1); - if (rectAfter.top != rect.top) - return flattenV(rectAfter, rectAfter.left < rectBefore.left); - } - } - return rect; - } else { - let from2 = offset2, to = offset2, takeSide = side < 0 ? 1 : -1; - if (side < 0 && !offset2) { - to++; - takeSide = -1; - } else if (side >= 0 && offset2 == node.nodeValue.length) { - from2--; - takeSide = 1; - } else if (side < 0) { - from2--; - } else { - to++; - } - return flattenV(singleRect(textRange(node, from2, to), takeSide), takeSide < 0); - } - } - let $dom = view.state.doc.resolve(pos - (atom || 0)); - if (!$dom.parent.inlineContent) { - if (atom == null && offset2 && (side < 0 || offset2 == nodeSize(node))) { - let before = node.childNodes[offset2 - 1]; - if (before.nodeType == 1) - return flattenH(before.getBoundingClientRect(), false); - } - if (atom == null && offset2 < nodeSize(node)) { - let after = node.childNodes[offset2]; - if (after.nodeType == 1) - return flattenH(after.getBoundingClientRect(), true); - } - return flattenH(node.getBoundingClientRect(), side >= 0); - } - if (atom == null && offset2 && (side < 0 || offset2 == nodeSize(node))) { - let before = node.childNodes[offset2 - 1]; - let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1)) : before.nodeType == 1 && (before.nodeName != "BR" || !before.nextSibling) ? before : null; - if (target) - return flattenV(singleRect(target, 1), false); - } - if (atom == null && offset2 < nodeSize(node)) { - let after = node.childNodes[offset2]; - while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords) - after = after.nextSibling; - let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, supportEmptyRange ? 0 : 1) : after.nodeType == 1 ? after : null; - if (target) - return flattenV(singleRect(target, -1), true); - } - return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0); -} -function flattenV(rect, left2) { - if (rect.width == 0) - return rect; - let x = left2 ? rect.left : rect.right; - return { top: rect.top, bottom: rect.bottom, left: x, right: x }; -} -function flattenH(rect, top2) { - if (rect.height == 0) - return rect; - let y = top2 ? rect.top : rect.bottom; - return { top: y, bottom: y, left: rect.left, right: rect.right }; -} -function withFlushedState(view, state, f) { - let viewState = view.state, active = view.root.activeElement; - if (viewState != state) - view.updateState(state); - if (active != view.dom) - view.focus(); - try { - return f(); - } finally { - if (viewState != state) - view.updateState(viewState); - if (active != view.dom && active) - active.focus(); - } -} -function endOfTextblockVertical(view, state, dir) { - let sel = state.selection; - let $pos = dir == "up" ? sel.$from : sel.$to; - return withFlushedState(view, state, () => { - let { node: dom } = view.docView.domFromPos($pos.pos, dir == "up" ? -1 : 1); - for (; ; ) { - let nearest = view.docView.nearestDesc(dom, true); - if (!nearest) - break; - if (nearest.node.isBlock) { - dom = nearest.contentDOM || nearest.dom; - break; - } - dom = nearest.dom.parentNode; - } - let coords = coordsAtPos(view, $pos.pos, 1); - for (let child = dom.firstChild; child; child = child.nextSibling) { - let boxes; - if (child.nodeType == 1) - boxes = child.getClientRects(); - else if (child.nodeType == 3) - boxes = textRange(child, 0, child.nodeValue.length).getClientRects(); - else - continue; - for (let i = 0; i < boxes.length; i++) { - let box = boxes[i]; - if (box.bottom > box.top + 1 && (dir == "up" ? coords.top - box.top > (box.bottom - coords.top) * 2 : box.bottom - coords.bottom > (coords.bottom - box.top) * 2)) - return false; - } - } - return true; - }); -} -var maybeRTL = /[\u0590-\u08ac]/; -function endOfTextblockHorizontal(view, state, dir) { - let { $head } = state.selection; - if (!$head.parent.isTextblock) - return false; - let offset2 = $head.parentOffset, atStart = !offset2, atEnd = offset2 == $head.parent.content.size; - let sel = view.domSelection(); - if (!maybeRTL.test($head.parent.textContent) || !sel.modify) - return dir == "left" || dir == "backward" ? atStart : atEnd; - return withFlushedState(view, state, () => { - let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange(); - let oldBidiLevel = sel.caretBidiLevel; - sel.modify("move", dir, "character"); - let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom; - let { focusNode: newNode2, focusOffset: newOff } = view.domSelectionRange(); - let result = newNode2 && !parentDOM.contains(newNode2.nodeType == 1 ? newNode2 : newNode2.parentNode) || oldNode == newNode2 && oldOff == newOff; - try { - sel.collapse(anchorNode, anchorOffset); - if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend) - sel.extend(oldNode, oldOff); - } catch (_) { - } - if (oldBidiLevel != null) - sel.caretBidiLevel = oldBidiLevel; - return result; - }); -} -var cachedState = null; -var cachedDir = null; -var cachedResult = false; -function endOfTextblock(view, state, dir) { - if (cachedState == state && cachedDir == dir) - return cachedResult; - cachedState = state; - cachedDir = dir; - return cachedResult = dir == "up" || dir == "down" ? endOfTextblockVertical(view, state, dir) : endOfTextblockHorizontal(view, state, dir); -} -var NOT_DIRTY = 0; -var CHILD_DIRTY = 1; -var CONTENT_DIRTY = 2; -var NODE_DIRTY = 3; -var ViewDesc = class { - constructor(parent, children, dom, contentDOM) { - this.parent = parent; - this.children = children; - this.dom = dom; - this.contentDOM = contentDOM; - this.dirty = NOT_DIRTY; - dom.pmViewDesc = this; - } - // Used to check whether a given description corresponds to a - // widget/mark/node. - matchesWidget(widget) { - return false; - } - matchesMark(mark) { - return false; - } - matchesNode(node, outerDeco, innerDeco) { - return false; - } - matchesHack(nodeName) { - return false; - } - // When parsing in-editor content (in domchange.js), we allow - // descriptions to determine the parse rules that should be used to - // parse them. - parseRule() { - return null; - } - // Used by the editor's event handler to ignore events that come - // from certain descs. - stopEvent(event) { - return false; - } - // The size of the content represented by this desc. - get size() { - let size = 0; - for (let i = 0; i < this.children.length; i++) - size += this.children[i].size; - return size; - } - // For block nodes, this represents the space taken up by their - // start/end tokens. - get border() { - return 0; - } - destroy() { - this.parent = void 0; - if (this.dom.pmViewDesc == this) - this.dom.pmViewDesc = void 0; - for (let i = 0; i < this.children.length; i++) - this.children[i].destroy(); - } - posBeforeChild(child) { - for (let i = 0, pos = this.posAtStart; ; i++) { - let cur = this.children[i]; - if (cur == child) - return pos; - pos += cur.size; - } - } - get posBefore() { - return this.parent.posBeforeChild(this); - } - get posAtStart() { - return this.parent ? this.parent.posBeforeChild(this) + this.border : 0; - } - get posAfter() { - return this.posBefore + this.size; - } - get posAtEnd() { - return this.posAtStart + this.size - 2 * this.border; - } - localPosFromDOM(dom, offset2, bias) { - if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) { - if (bias < 0) { - let domBefore, desc; - if (dom == this.contentDOM) { - domBefore = dom.childNodes[offset2 - 1]; - } else { - while (dom.parentNode != this.contentDOM) - dom = dom.parentNode; - domBefore = dom.previousSibling; - } - while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this)) - domBefore = domBefore.previousSibling; - return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart; - } else { - let domAfter, desc; - if (dom == this.contentDOM) { - domAfter = dom.childNodes[offset2]; - } else { - while (dom.parentNode != this.contentDOM) - dom = dom.parentNode; - domAfter = dom.nextSibling; - } - while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this)) - domAfter = domAfter.nextSibling; - return domAfter ? this.posBeforeChild(desc) : this.posAtEnd; - } - } - let atEnd; - if (dom == this.dom && this.contentDOM) { - atEnd = offset2 > domIndex(this.contentDOM); - } else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) { - atEnd = dom.compareDocumentPosition(this.contentDOM) & 2; - } else if (this.dom.firstChild) { - if (offset2 == 0) - for (let search = dom; ; search = search.parentNode) { - if (search == this.dom) { - atEnd = false; - break; - } - if (search.previousSibling) - break; - } - if (atEnd == null && offset2 == dom.childNodes.length) - for (let search = dom; ; search = search.parentNode) { - if (search == this.dom) { - atEnd = true; - break; - } - if (search.nextSibling) - break; - } - } - return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart; - } - nearestDesc(dom, onlyNodes = false) { - for (let first2 = true, cur = dom; cur; cur = cur.parentNode) { - let desc = this.getDesc(cur), nodeDOM; - if (desc && (!onlyNodes || desc.node)) { - if (first2 && (nodeDOM = desc.nodeDOM) && !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom)) - first2 = false; - else - return desc; - } - } - } - getDesc(dom) { - let desc = dom.pmViewDesc; - for (let cur = desc; cur; cur = cur.parent) - if (cur == this) - return desc; - } - posFromDOM(dom, offset2, bias) { - for (let scan = dom; scan; scan = scan.parentNode) { - let desc = this.getDesc(scan); - if (desc) - return desc.localPosFromDOM(dom, offset2, bias); - } - return -1; - } - // Find the desc for the node after the given pos, if any. (When a - // parent node overrode rendering, there might not be one.) - descAt(pos) { - for (let i = 0, offset2 = 0; i < this.children.length; i++) { - let child = this.children[i], end2 = offset2 + child.size; - if (offset2 == pos && end2 != offset2) { - while (!child.border && child.children.length) - child = child.children[0]; - return child; - } - if (pos < end2) - return child.descAt(pos - offset2 - child.border); - offset2 = end2; - } - } - domFromPos(pos, side) { - if (!this.contentDOM) - return { node: this.dom, offset: 0, atom: pos + 1 }; - let i = 0, offset2 = 0; - for (let curPos = 0; i < this.children.length; i++) { - let child = this.children[i], end2 = curPos + child.size; - if (end2 > pos || child instanceof TrailingHackViewDesc) { - offset2 = pos - curPos; - break; - } - curPos = end2; - } - if (offset2) - return this.children[i].domFromPos(offset2 - this.children[i].border, side); - for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { - } - if (side <= 0) { - let prev, enter2 = true; - for (; ; i--, enter2 = false) { - prev = i ? this.children[i - 1] : null; - if (!prev || prev.dom.parentNode == this.contentDOM) - break; - } - if (prev && side && enter2 && !prev.border && !prev.domAtom) - return prev.domFromPos(prev.size, side); - return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 }; - } else { - let next, enter2 = true; - for (; ; i++, enter2 = false) { - next = i < this.children.length ? this.children[i] : null; - if (!next || next.dom.parentNode == this.contentDOM) - break; - } - if (next && enter2 && !next.border && !next.domAtom) - return next.domFromPos(0, side); - return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length }; - } - } - // Used to find a DOM range in a single parent for a given changed - // range. - parseRange(from2, to, base2 = 0) { - if (this.children.length == 0) - return { node: this.contentDOM, from: from2, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length }; - let fromOffset = -1, toOffset = -1; - for (let offset2 = base2, i = 0; ; i++) { - let child = this.children[i], end2 = offset2 + child.size; - if (fromOffset == -1 && from2 <= end2) { - let childBase = offset2 + child.border; - if (from2 >= childBase && to <= end2 - child.border && child.node && child.contentDOM && this.contentDOM.contains(child.contentDOM)) - return child.parseRange(from2, to, childBase); - from2 = offset2; - for (let j = i; j > 0; j--) { - let prev = this.children[j - 1]; - if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) { - fromOffset = domIndex(prev.dom) + 1; - break; - } - from2 -= prev.size; - } - if (fromOffset == -1) - fromOffset = 0; - } - if (fromOffset > -1 && (end2 > to || i == this.children.length - 1)) { - to = end2; - for (let j = i + 1; j < this.children.length; j++) { - let next = this.children[j]; - if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) { - toOffset = domIndex(next.dom); - break; - } - to += next.size; - } - if (toOffset == -1) - toOffset = this.contentDOM.childNodes.length; - break; - } - offset2 = end2; - } - return { node: this.contentDOM, from: from2, to, fromOffset, toOffset }; - } - emptyChildAt(side) { - if (this.border || !this.contentDOM || !this.children.length) - return false; - let child = this.children[side < 0 ? 0 : this.children.length - 1]; - return child.size == 0 || child.emptyChildAt(side); - } - domAfterPos(pos) { - let { node, offset: offset2 } = this.domFromPos(pos, 0); - if (node.nodeType != 1 || offset2 == node.childNodes.length) - throw new RangeError("No node after pos " + pos); - return node.childNodes[offset2]; - } - // View descs are responsible for setting any selection that falls - // entirely inside of them, so that custom implementations can do - // custom things with the selection. Note that this falls apart when - // a selection starts in such a node and ends in another, in which - // case we just use whatever domFromPos produces as a best effort. - setSelection(anchor, head, root, force = false) { - let from2 = Math.min(anchor, head), to = Math.max(anchor, head); - for (let i = 0, offset2 = 0; i < this.children.length; i++) { - let child = this.children[i], end2 = offset2 + child.size; - if (from2 > offset2 && to < end2) - return child.setSelection(anchor - offset2 - child.border, head - offset2 - child.border, root, force); - offset2 = end2; - } - let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1); - let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1); - let domSel = root.getSelection(); - let brKludge = false; - if ((gecko || safari) && anchor == head) { - let { node, offset: offset2 } = anchorDOM; - if (node.nodeType == 3) { - brKludge = !!(offset2 && node.nodeValue[offset2 - 1] == "\n"); - if (brKludge && offset2 == node.nodeValue.length) { - for (let scan = node, after; scan; scan = scan.parentNode) { - if (after = scan.nextSibling) { - if (after.nodeName == "BR") - anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 }; - break; - } - let desc = scan.pmViewDesc; - if (desc && desc.node && desc.node.isBlock) - break; - } - } - } else { - let prev = node.childNodes[offset2 - 1]; - brKludge = prev && (prev.nodeName == "BR" || prev.contentEditable == "false"); - } - } - if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) { - let after = domSel.focusNode.childNodes[domSel.focusOffset]; - if (after && after.contentEditable == "false") - force = true; - } - if (!(force || brKludge && safari) && isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) && isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset)) - return; - let domSelExtended = false; - if ((domSel.extend || anchor == head) && !brKludge) { - domSel.collapse(anchorDOM.node, anchorDOM.offset); - try { - if (anchor != head) - domSel.extend(headDOM.node, headDOM.offset); - domSelExtended = true; - } catch (_) { - } - } - if (!domSelExtended) { - if (anchor > head) { - let tmp = anchorDOM; - anchorDOM = headDOM; - headDOM = tmp; - } - let range = document.createRange(); - range.setEnd(headDOM.node, headDOM.offset); - range.setStart(anchorDOM.node, anchorDOM.offset); - domSel.removeAllRanges(); - domSel.addRange(range); - } - } - ignoreMutation(mutation) { - return !this.contentDOM && mutation.type != "selection"; - } - get contentLost() { - return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM); - } - // Remove a subtree of the element tree that has been touched - // by a DOM change, so that the next update will redraw it. - markDirty(from2, to) { - for (let offset2 = 0, i = 0; i < this.children.length; i++) { - let child = this.children[i], end2 = offset2 + child.size; - if (offset2 == end2 ? from2 <= end2 && to >= offset2 : from2 < end2 && to > offset2) { - let startInside = offset2 + child.border, endInside = end2 - child.border; - if (from2 >= startInside && to <= endInside) { - this.dirty = from2 == offset2 || to == end2 ? CONTENT_DIRTY : CHILD_DIRTY; - if (from2 == startInside && to == endInside && (child.contentLost || child.dom.parentNode != this.contentDOM)) - child.dirty = NODE_DIRTY; - else - child.markDirty(from2 - startInside, to - startInside); - return; - } else { - child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length ? CONTENT_DIRTY : NODE_DIRTY; - } - } - offset2 = end2; - } - this.dirty = CONTENT_DIRTY; - } - markParentsDirty() { - let level = 1; - for (let node = this.parent; node; node = node.parent, level++) { - let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY; - if (node.dirty < dirty) - node.dirty = dirty; - } - } - get domAtom() { - return false; - } - get ignoreForCoords() { - return false; - } -}; -var WidgetViewDesc = class extends ViewDesc { - constructor(parent, widget, view, pos) { - let self2, dom = widget.type.toDOM; - if (typeof dom == "function") - dom = dom(view, () => { - if (!self2) - return pos; - if (self2.parent) - return self2.parent.posBeforeChild(self2); - }); - if (!widget.type.spec.raw) { - if (dom.nodeType != 1) { - let wrap2 = document.createElement("span"); - wrap2.appendChild(dom); - dom = wrap2; - } - dom.contentEditable = "false"; - dom.classList.add("ProseMirror-widget"); - } - super(parent, [], dom, null); - this.widget = widget; - this.widget = widget; - self2 = this; - } - matchesWidget(widget) { - return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type); - } - parseRule() { - return { ignore: true }; - } - stopEvent(event) { - let stop = this.widget.spec.stopEvent; - return stop ? stop(event) : false; - } - ignoreMutation(mutation) { - return mutation.type != "selection" || this.widget.spec.ignoreSelection; - } - destroy() { - this.widget.type.destroy(this.dom); - super.destroy(); - } - get domAtom() { - return true; - } - get side() { - return this.widget.type.side; - } -}; -var CompositionViewDesc = class extends ViewDesc { - constructor(parent, dom, textDOM, text) { - super(parent, [], dom, null); - this.textDOM = textDOM; - this.text = text; - } - get size() { - return this.text.length; - } - localPosFromDOM(dom, offset2) { - if (dom != this.textDOM) - return this.posAtStart + (offset2 ? this.size : 0); - return this.posAtStart + offset2; - } - domFromPos(pos) { - return { node: this.textDOM, offset: pos }; - } - ignoreMutation(mut) { - return mut.type === "characterData" && mut.target.nodeValue == mut.oldValue; - } -}; -var MarkViewDesc = class _MarkViewDesc extends ViewDesc { - constructor(parent, mark, dom, contentDOM) { - super(parent, [], dom, contentDOM); - this.mark = mark; - } - static create(parent, mark, inline, view) { - let custom = view.nodeViews[mark.type.name]; - let spec = custom && custom(mark, view, inline); - if (!spec || !spec.dom) - spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline)); - return new _MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom); - } - parseRule() { - if (this.dirty & NODE_DIRTY || this.mark.type.spec.reparseInView) - return null; - return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM }; - } - matchesMark(mark) { - return this.dirty != NODE_DIRTY && this.mark.eq(mark); - } - markDirty(from2, to) { - super.markDirty(from2, to); - if (this.dirty != NOT_DIRTY) { - let parent = this.parent; - while (!parent.node) - parent = parent.parent; - if (parent.dirty < this.dirty) - parent.dirty = this.dirty; - this.dirty = NOT_DIRTY; - } - } - slice(from2, to, view) { - let copy2 = _MarkViewDesc.create(this.parent, this.mark, true, view); - let nodes = this.children, size = this.size; - if (to < size) - nodes = replaceNodes(nodes, to, size, view); - if (from2 > 0) - nodes = replaceNodes(nodes, 0, from2, view); - for (let i = 0; i < nodes.length; i++) - nodes[i].parent = copy2; - copy2.children = nodes; - return copy2; - } -}; -var NodeViewDesc = class _NodeViewDesc extends ViewDesc { - constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) { - super(parent, [], dom, contentDOM); - this.node = node; - this.outerDeco = outerDeco; - this.innerDeco = innerDeco; - this.nodeDOM = nodeDOM; - } - // By default, a node is rendered using the `toDOM` method from the - // node type spec. But client code can use the `nodeViews` spec to - // supply a custom node view, which can influence various aspects of - // the way the node works. - // - // (Using subclassing for this was intentionally decided against, - // since it'd require exposing a whole slew of finicky - // implementation details to the user code that they probably will - // never need.) - static create(parent, node, outerDeco, innerDeco, view, pos) { - let custom = view.nodeViews[node.type.name], descObj; - let spec = custom && custom(node, view, () => { - if (!descObj) - return pos; - if (descObj.parent) - return descObj.parent.posBeforeChild(descObj); - }, outerDeco, innerDeco); - let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM; - if (node.isText) { - if (!dom) - dom = document.createTextNode(node.text); - else if (dom.nodeType != 3) - throw new RangeError("Text must be rendered as a DOM text node"); - } else if (!dom) { - ({ dom, contentDOM } = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node))); - } - if (!contentDOM && !node.isText && dom.nodeName != "BR") { - if (!dom.hasAttribute("contenteditable")) - dom.contentEditable = "false"; - if (node.type.spec.draggable) - dom.draggable = true; - } - let nodeDOM = dom; - dom = applyOuterDeco(dom, outerDeco, node); - if (spec) - return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1); - else if (node.isText) - return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view); - else - return new _NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1); - } - parseRule() { - if (this.node.type.spec.reparseInView) - return null; - let rule = { node: this.node.type.name, attrs: this.node.attrs }; - if (this.node.type.whitespace == "pre") - rule.preserveWhitespace = "full"; - if (!this.contentDOM) { - rule.getContent = () => this.node.content; - } else if (!this.contentLost) { - rule.contentElement = this.contentDOM; - } else { - for (let i = this.children.length - 1; i >= 0; i--) { - let child = this.children[i]; - if (this.dom.contains(child.dom.parentNode)) { - rule.contentElement = child.dom.parentNode; - break; - } - } - if (!rule.contentElement) - rule.getContent = () => Fragment.empty; - } - return rule; - } - matchesNode(node, outerDeco, innerDeco) { - return this.dirty == NOT_DIRTY && node.eq(this.node) && sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco); - } - get size() { - return this.node.nodeSize; - } - get border() { - return this.node.isLeaf ? 0 : 1; - } - // Syncs `this.children` to match `this.node.content` and the local - // decorations, possibly introducing nesting for marks. Then, in a - // separate step, syncs the DOM inside `this.contentDOM` to - // `this.children`. - updateChildren(view, pos) { - let inline = this.node.inlineContent, off = pos; - let composition = view.composing ? this.localCompositionInfo(view, pos) : null; - let localComposition = composition && composition.pos > -1 ? composition : null; - let compositionInChild = composition && composition.pos < 0; - let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view); - iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => { - if (widget.spec.marks) - updater.syncToMarks(widget.spec.marks, inline, view); - else if (widget.type.side >= 0 && !insideNode) - updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view); - updater.placeWidget(widget, view, off); - }, (child, outerDeco, innerDeco, i) => { - updater.syncToMarks(child.marks, inline, view); - let compIndex; - if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) - ; - else if (compositionInChild && view.state.selection.from > off && view.state.selection.to < off + child.nodeSize && (compIndex = updater.findIndexWithChild(composition.node)) > -1 && updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) - ; - else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) - ; - else { - updater.addNode(child, outerDeco, innerDeco, view, off); - } - off += child.nodeSize; - }); - updater.syncToMarks([], inline, view); - if (this.node.isTextblock) - updater.addTextblockHacks(); - updater.destroyRest(); - if (updater.changed || this.dirty == CONTENT_DIRTY) { - if (localComposition) - this.protectLocalComposition(view, localComposition); - renderDescs(this.contentDOM, this.children, view); - if (ios) - iosHacks(this.dom); - } - } - localCompositionInfo(view, pos) { - let { from: from2, to } = view.state.selection; - if (!(view.state.selection instanceof TextSelection) || from2 < pos || to > pos + this.node.content.size) - return null; - let sel = view.domSelectionRange(); - let textNode = nearbyTextNode(sel.focusNode, sel.focusOffset); - if (!textNode || !this.dom.contains(textNode.parentNode)) - return null; - if (this.node.inlineContent) { - let text = textNode.nodeValue; - let textPos = findTextInFragment(this.node.content, text, from2 - pos, to - pos); - return textPos < 0 ? null : { node: textNode, pos: textPos, text }; - } else { - return { node: textNode, pos: -1, text: "" }; - } - } - protectLocalComposition(view, { node, pos, text }) { - if (this.getDesc(node)) - return; - let topNode = node; - for (; ; topNode = topNode.parentNode) { - if (topNode.parentNode == this.contentDOM) - break; - while (topNode.previousSibling) - topNode.parentNode.removeChild(topNode.previousSibling); - while (topNode.nextSibling) - topNode.parentNode.removeChild(topNode.nextSibling); - if (topNode.pmViewDesc) - topNode.pmViewDesc = void 0; - } - let desc = new CompositionViewDesc(this, topNode, node, text); - view.input.compositionNodes.push(desc); - this.children = replaceNodes(this.children, pos, pos + text.length, view, desc); - } - // If this desc must be updated to match the given node decoration, - // do so and return true. - update(node, outerDeco, innerDeco, view) { - if (this.dirty == NODE_DIRTY || !node.sameMarkup(this.node)) - return false; - this.updateInner(node, outerDeco, innerDeco, view); - return true; - } - updateInner(node, outerDeco, innerDeco, view) { - this.updateOuterDeco(outerDeco); - this.node = node; - this.innerDeco = innerDeco; - if (this.contentDOM) - this.updateChildren(view, this.posAtStart); - this.dirty = NOT_DIRTY; - } - updateOuterDeco(outerDeco) { - if (sameOuterDeco(outerDeco, this.outerDeco)) - return; - let needsWrap = this.nodeDOM.nodeType != 1; - let oldDOM = this.dom; - this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap)); - if (this.dom != oldDOM) { - oldDOM.pmViewDesc = void 0; - this.dom.pmViewDesc = this; - } - this.outerDeco = outerDeco; - } - // Mark this node as being the selected node. - selectNode() { - if (this.nodeDOM.nodeType == 1) - this.nodeDOM.classList.add("ProseMirror-selectednode"); - if (this.contentDOM || !this.node.type.spec.draggable) - this.dom.draggable = true; - } - // Remove selected node marking from this node. - deselectNode() { - if (this.nodeDOM.nodeType == 1) - this.nodeDOM.classList.remove("ProseMirror-selectednode"); - if (this.contentDOM || !this.node.type.spec.draggable) - this.dom.removeAttribute("draggable"); - } - get domAtom() { - return this.node.isAtom; - } -}; -function docViewDesc(doc3, outerDeco, innerDeco, dom, view) { - applyOuterDeco(dom, outerDeco, doc3); - let docView = new NodeViewDesc(void 0, doc3, outerDeco, innerDeco, dom, dom, dom, view, 0); - if (docView.contentDOM) - docView.updateChildren(view, 0); - return docView; -} -var TextViewDesc = class _TextViewDesc extends NodeViewDesc { - constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) { - super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0); - } - parseRule() { - let skip = this.nodeDOM.parentNode; - while (skip && skip != this.dom && !skip.pmIsDeco) - skip = skip.parentNode; - return { skip: skip || true }; - } - update(node, outerDeco, innerDeco, view) { - if (this.dirty == NODE_DIRTY || this.dirty != NOT_DIRTY && !this.inParent() || !node.sameMarkup(this.node)) - return false; - this.updateOuterDeco(outerDeco); - if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) { - this.nodeDOM.nodeValue = node.text; - if (view.trackWrites == this.nodeDOM) - view.trackWrites = null; - } - this.node = node; - this.dirty = NOT_DIRTY; - return true; - } - inParent() { - let parentDOM = this.parent.contentDOM; - for (let n = this.nodeDOM; n; n = n.parentNode) - if (n == parentDOM) - return true; - return false; - } - domFromPos(pos) { - return { node: this.nodeDOM, offset: pos }; - } - localPosFromDOM(dom, offset2, bias) { - if (dom == this.nodeDOM) - return this.posAtStart + Math.min(offset2, this.node.text.length); - return super.localPosFromDOM(dom, offset2, bias); - } - ignoreMutation(mutation) { - return mutation.type != "characterData" && mutation.type != "selection"; - } - slice(from2, to, view) { - let node = this.node.cut(from2, to), dom = document.createTextNode(node.text); - return new _TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view); - } - markDirty(from2, to) { - super.markDirty(from2, to); - if (this.dom != this.nodeDOM && (from2 == 0 || to == this.nodeDOM.nodeValue.length)) - this.dirty = NODE_DIRTY; - } - get domAtom() { - return false; - } -}; -var TrailingHackViewDesc = class extends ViewDesc { - parseRule() { - return { ignore: true }; - } - matchesHack(nodeName) { - return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; - } - get domAtom() { - return true; - } - get ignoreForCoords() { - return this.dom.nodeName == "IMG"; - } -}; -var CustomNodeViewDesc = class extends NodeViewDesc { - constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) { - super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos); - this.spec = spec; - } - // A custom `update` method gets to decide whether the update goes - // through. If it does, and there's a `contentDOM` node, our logic - // updates the children. - update(node, outerDeco, innerDeco, view) { - if (this.dirty == NODE_DIRTY) - return false; - if (this.spec.update) { - let result = this.spec.update(node, outerDeco, innerDeco); - if (result) - this.updateInner(node, outerDeco, innerDeco, view); - return result; - } else if (!this.contentDOM && !node.isLeaf) { - return false; - } else { - return super.update(node, outerDeco, innerDeco, view); - } - } - selectNode() { - this.spec.selectNode ? this.spec.selectNode() : super.selectNode(); - } - deselectNode() { - this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode(); - } - setSelection(anchor, head, root, force) { - this.spec.setSelection ? this.spec.setSelection(anchor, head, root) : super.setSelection(anchor, head, root, force); - } - destroy() { - if (this.spec.destroy) - this.spec.destroy(); - super.destroy(); - } - stopEvent(event) { - return this.spec.stopEvent ? this.spec.stopEvent(event) : false; - } - ignoreMutation(mutation) { - return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation); - } -}; -function renderDescs(parentDOM, descs, view) { - let dom = parentDOM.firstChild, written = false; - for (let i = 0; i < descs.length; i++) { - let desc = descs[i], childDOM = desc.dom; - if (childDOM.parentNode == parentDOM) { - while (childDOM != dom) { - dom = rm(dom); - written = true; - } - dom = dom.nextSibling; - } else { - written = true; - parentDOM.insertBefore(childDOM, dom); - } - if (desc instanceof MarkViewDesc) { - let pos = dom ? dom.previousSibling : parentDOM.lastChild; - renderDescs(desc.contentDOM, desc.children, view); - dom = pos ? pos.nextSibling : parentDOM.firstChild; - } - } - while (dom) { - dom = rm(dom); - written = true; - } - if (written && view.trackWrites == parentDOM) - view.trackWrites = null; -} -var OuterDecoLevel = function(nodeName) { - if (nodeName) - this.nodeName = nodeName; -}; -OuterDecoLevel.prototype = /* @__PURE__ */ Object.create(null); -var noDeco = [new OuterDecoLevel()]; -function computeOuterDeco(outerDeco, node, needsWrap) { - if (outerDeco.length == 0) - return noDeco; - let top2 = needsWrap ? noDeco[0] : new OuterDecoLevel(), result = [top2]; - for (let i = 0; i < outerDeco.length; i++) { - let attrs = outerDeco[i].type.attrs; - if (!attrs) - continue; - if (attrs.nodeName) - result.push(top2 = new OuterDecoLevel(attrs.nodeName)); - for (let name in attrs) { - let val = attrs[name]; - if (val == null) - continue; - if (needsWrap && result.length == 1) - result.push(top2 = new OuterDecoLevel(node.isInline ? "span" : "div")); - if (name == "class") - top2.class = (top2.class ? top2.class + " " : "") + val; - else if (name == "style") - top2.style = (top2.style ? top2.style + ";" : "") + val; - else if (name != "nodeName") - top2[name] = val; - } - } - return result; -} -function patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) { - if (prevComputed == noDeco && curComputed == noDeco) - return nodeDOM; - let curDOM = nodeDOM; - for (let i = 0; i < curComputed.length; i++) { - let deco = curComputed[i], prev = prevComputed[i]; - if (i) { - let parent; - if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM && (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) { - curDOM = parent; - } else { - parent = document.createElement(deco.nodeName); - parent.pmIsDeco = true; - parent.appendChild(curDOM); - prev = noDeco[0]; - curDOM = parent; - } - } - patchAttributes(curDOM, prev || noDeco[0], deco); - } - return curDOM; -} -function patchAttributes(dom, prev, cur) { - for (let name in prev) - if (name != "class" && name != "style" && name != "nodeName" && !(name in cur)) - dom.removeAttribute(name); - for (let name in cur) - if (name != "class" && name != "style" && name != "nodeName" && cur[name] != prev[name]) - dom.setAttribute(name, cur[name]); - if (prev.class != cur.class) { - let prevList = prev.class ? prev.class.split(" ").filter(Boolean) : []; - let curList = cur.class ? cur.class.split(" ").filter(Boolean) : []; - for (let i = 0; i < prevList.length; i++) - if (curList.indexOf(prevList[i]) == -1) - dom.classList.remove(prevList[i]); - for (let i = 0; i < curList.length; i++) - if (prevList.indexOf(curList[i]) == -1) - dom.classList.add(curList[i]); - if (dom.classList.length == 0) - dom.removeAttribute("class"); - } - if (prev.style != cur.style) { - if (prev.style) { - let prop = /\s*([\w\-\xa1-\uffff]+)\s*:(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*'|\(.*?\)|[^;])*/g, m; - while (m = prop.exec(prev.style)) - dom.style.removeProperty(m[1]); - } - if (cur.style) - dom.style.cssText += cur.style; - } -} -function applyOuterDeco(dom, deco, node) { - return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1)); -} -function sameOuterDeco(a, b) { - if (a.length != b.length) - return false; - for (let i = 0; i < a.length; i++) - if (!a[i].type.eq(b[i].type)) - return false; - return true; -} -function rm(dom) { - let next = dom.nextSibling; - dom.parentNode.removeChild(dom); - return next; -} -var ViewTreeUpdater = class { - constructor(top2, lock, view) { - this.lock = lock; - this.view = view; - this.index = 0; - this.stack = []; - this.changed = false; - this.top = top2; - this.preMatch = preMatch(top2.node.content, top2); - } - // Destroy and remove the children between the given indices in - // `this.top`. - destroyBetween(start2, end2) { - if (start2 == end2) - return; - for (let i = start2; i < end2; i++) - this.top.children[i].destroy(); - this.top.children.splice(start2, end2 - start2); - this.changed = true; - } - // Destroy all remaining children in `this.top`. - destroyRest() { - this.destroyBetween(this.index, this.top.children.length); - } - // Sync the current stack of mark descs with the given array of - // marks, reusing existing mark descs when possible. - syncToMarks(marks, inline, view) { - let keep = 0, depth = this.stack.length >> 1; - let maxKeep = Math.min(depth, marks.length); - while (keep < maxKeep && (keep == depth - 1 ? this.top : this.stack[keep + 1 << 1]).matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false) - keep++; - while (keep < depth) { - this.destroyRest(); - this.top.dirty = NOT_DIRTY; - this.index = this.stack.pop(); - this.top = this.stack.pop(); - depth--; - } - while (depth < marks.length) { - this.stack.push(this.top, this.index + 1); - let found2 = -1; - for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) { - let next = this.top.children[i]; - if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) { - found2 = i; - break; - } - } - if (found2 > -1) { - if (found2 > this.index) { - this.changed = true; - this.destroyBetween(this.index, found2); - } - this.top = this.top.children[this.index]; - } else { - let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view); - this.top.children.splice(this.index, 0, markDesc); - this.top = markDesc; - this.changed = true; - } - this.index = 0; - depth++; - } - } - // Try to find a node desc matching the given data. Skip over it and - // return true when successful. - findNodeMatch(node, outerDeco, innerDeco, index) { - let found2 = -1, targetDesc; - if (index >= this.preMatch.index && (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top && targetDesc.matchesNode(node, outerDeco, innerDeco)) { - found2 = this.top.children.indexOf(targetDesc, this.index); - } else { - for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) { - let child = this.top.children[i]; - if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) { - found2 = i; - break; - } - } - } - if (found2 < 0) - return false; - this.destroyBetween(this.index, found2); - this.index++; - return true; - } - updateNodeAt(node, outerDeco, innerDeco, index, view) { - let child = this.top.children[index]; - if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM) - child.dirty = CONTENT_DIRTY; - if (!child.update(node, outerDeco, innerDeco, view)) - return false; - this.destroyBetween(this.index, index); - this.index++; - return true; - } - findIndexWithChild(domNode) { - for (; ; ) { - let parent = domNode.parentNode; - if (!parent) - return -1; - if (parent == this.top.contentDOM) { - let desc = domNode.pmViewDesc; - if (desc) - for (let i = this.index; i < this.top.children.length; i++) { - if (this.top.children[i] == desc) - return i; - } - return -1; - } - domNode = parent; - } - } - // Try to update the next node, if any, to the given data. Checks - // pre-matches to avoid overwriting nodes that could still be used. - updateNextNode(node, outerDeco, innerDeco, view, index, pos) { - for (let i = this.index; i < this.top.children.length; i++) { - let next = this.top.children[i]; - if (next instanceof NodeViewDesc) { - let preMatch2 = this.preMatch.matched.get(next); - if (preMatch2 != null && preMatch2 != index) - return false; - let nextDOM = next.dom, updated; - let locked = this.isLocked(nextDOM) && !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text && next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco)); - if (!locked && next.update(node, outerDeco, innerDeco, view)) { - this.destroyBetween(this.index, i); - if (next.dom != nextDOM) - this.changed = true; - this.index++; - return true; - } else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) { - this.top.children[this.index] = updated; - if (updated.contentDOM) { - updated.dirty = CONTENT_DIRTY; - updated.updateChildren(view, pos + 1); - updated.dirty = NOT_DIRTY; - } - this.changed = true; - this.index++; - return true; - } - break; - } - } - return false; - } - // When a node with content is replaced by a different node with - // identical content, move over its children. - recreateWrapper(next, node, outerDeco, innerDeco, view, pos) { - if (next.dirty || node.isAtom || !next.children.length || !next.node.content.eq(node.content)) - return null; - let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos); - if (wrapper.contentDOM) { - wrapper.children = next.children; - next.children = []; - for (let ch of wrapper.children) - ch.parent = wrapper; - } - next.destroy(); - return wrapper; - } - // Insert the node as a newly created node desc. - addNode(node, outerDeco, innerDeco, view, pos) { - let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos); - if (desc.contentDOM) - desc.updateChildren(view, pos + 1); - this.top.children.splice(this.index++, 0, desc); - this.changed = true; - } - placeWidget(widget, view, pos) { - let next = this.index < this.top.children.length ? this.top.children[this.index] : null; - if (next && next.matchesWidget(widget) && (widget == next.widget || !next.widget.type.toDOM.parentNode)) { - this.index++; - } else { - let desc = new WidgetViewDesc(this.top, widget, view, pos); - this.top.children.splice(this.index++, 0, desc); - this.changed = true; - } - } - // Make sure a textblock looks and behaves correctly in - // contentEditable. - addTextblockHacks() { - let lastChild = this.top.children[this.index - 1], parent = this.top; - while (lastChild instanceof MarkViewDesc) { - parent = lastChild; - lastChild = parent.children[parent.children.length - 1]; - } - if (!lastChild || // Empty textblock - !(lastChild instanceof TextViewDesc) || /\n$/.test(lastChild.node.text) || this.view.requiresGeckoHackNode && /\s$/.test(lastChild.node.text)) { - if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == "false") - this.addHackNode("IMG", parent); - this.addHackNode("BR", this.top); - } - } - addHackNode(nodeName, parent) { - if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) { - this.index++; - } else { - let dom = document.createElement(nodeName); - if (nodeName == "IMG") { - dom.className = "ProseMirror-separator"; - dom.alt = ""; - } - if (nodeName == "BR") - dom.className = "ProseMirror-trailingBreak"; - let hack = new TrailingHackViewDesc(this.top, [], dom, null); - if (parent != this.top) - parent.children.push(hack); - else - parent.children.splice(this.index++, 0, hack); - this.changed = true; - } - } - isLocked(node) { - return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode)); - } -}; -function preMatch(frag, parentDesc) { - let curDesc = parentDesc, descI = curDesc.children.length; - let fI = frag.childCount, matched = /* @__PURE__ */ new Map(), matches2 = []; - outer: - while (fI > 0) { - let desc; - for (; ; ) { - if (descI) { - let next = curDesc.children[descI - 1]; - if (next instanceof MarkViewDesc) { - curDesc = next; - descI = next.children.length; - } else { - desc = next; - descI--; - break; - } - } else if (curDesc == parentDesc) { - break outer; - } else { - descI = curDesc.parent.children.indexOf(curDesc); - curDesc = curDesc.parent; - } - } - let node = desc.node; - if (!node) - continue; - if (node != frag.child(fI - 1)) - break; - --fI; - matched.set(desc, fI); - matches2.push(desc); - } - return { index: fI, matched, matches: matches2.reverse() }; -} -function compareSide(a, b) { - return a.type.side - b.type.side; -} -function iterDeco(parent, deco, onWidget, onNode) { - let locals = deco.locals(parent), offset2 = 0; - if (locals.length == 0) { - for (let i = 0; i < parent.childCount; i++) { - let child = parent.child(i); - onNode(child, locals, deco.forChild(offset2, child), i); - offset2 += child.nodeSize; - } - return; - } - let decoIndex = 0, active = [], restNode = null; - for (let parentIndex = 0; ; ) { - let widget, widgets; - while (decoIndex < locals.length && locals[decoIndex].to == offset2) { - let next = locals[decoIndex++]; - if (next.widget) { - if (!widget) - widget = next; - else - (widgets || (widgets = [widget])).push(next); - } - } - if (widget) { - if (widgets) { - widgets.sort(compareSide); - for (let i = 0; i < widgets.length; i++) - onWidget(widgets[i], parentIndex, !!restNode); - } else { - onWidget(widget, parentIndex, !!restNode); - } - } - let child, index; - if (restNode) { - index = -1; - child = restNode; - restNode = null; - } else if (parentIndex < parent.childCount) { - index = parentIndex; - child = parent.child(parentIndex++); - } else { - break; - } - for (let i = 0; i < active.length; i++) - if (active[i].to <= offset2) - active.splice(i--, 1); - while (decoIndex < locals.length && locals[decoIndex].from <= offset2 && locals[decoIndex].to > offset2) - active.push(locals[decoIndex++]); - let end2 = offset2 + child.nodeSize; - if (child.isText) { - let cutAt = end2; - if (decoIndex < locals.length && locals[decoIndex].from < cutAt) - cutAt = locals[decoIndex].from; - for (let i = 0; i < active.length; i++) - if (active[i].to < cutAt) - cutAt = active[i].to; - if (cutAt < end2) { - restNode = child.cut(cutAt - offset2); - child = child.cut(0, cutAt - offset2); - end2 = cutAt; - index = -1; - } - } - let outerDeco = child.isInline && !child.isLeaf ? active.filter((d) => !d.inline) : active.slice(); - onNode(child, outerDeco, deco.forChild(offset2, child), index); - offset2 = end2; - } -} -function iosHacks(dom) { - if (dom.nodeName == "UL" || dom.nodeName == "OL") { - let oldCSS = dom.style.cssText; - dom.style.cssText = oldCSS + "; list-style: square !important"; - window.getComputedStyle(dom).listStyle; - dom.style.cssText = oldCSS; - } -} -function nearbyTextNode(node, offset2) { - for (; ; ) { - if (node.nodeType == 3) - return node; - if (node.nodeType == 1 && offset2 > 0) { - if (node.childNodes.length > offset2 && node.childNodes[offset2].nodeType == 3) - return node.childNodes[offset2]; - node = node.childNodes[offset2 - 1]; - offset2 = nodeSize(node); - } else if (node.nodeType == 1 && offset2 < node.childNodes.length) { - node = node.childNodes[offset2]; - offset2 = 0; - } else { - return null; - } - } -} -function findTextInFragment(frag, text, from2, to) { - for (let i = 0, pos = 0; i < frag.childCount && pos <= to; ) { - let child = frag.child(i++), childStart = pos; - pos += child.nodeSize; - if (!child.isText) - continue; - let str = child.text; - while (i < frag.childCount) { - let next = frag.child(i++); - pos += next.nodeSize; - if (!next.isText) - break; - str += next.text; - } - if (pos >= from2) { - if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text) - return to - text.length; - let found2 = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1; - if (found2 >= 0 && found2 + text.length + childStart >= from2) - return childStart + found2; - if (from2 == to && str.length >= to + text.length - childStart && str.slice(to - childStart, to - childStart + text.length) == text) - return to; - } - } - return -1; -} -function replaceNodes(nodes, from2, to, view, replacement) { - let result = []; - for (let i = 0, off = 0; i < nodes.length; i++) { - let child = nodes[i], start2 = off, end2 = off += child.size; - if (start2 >= to || end2 <= from2) { - result.push(child); - } else { - if (start2 < from2) - result.push(child.slice(0, from2 - start2, view)); - if (replacement) { - result.push(replacement); - replacement = void 0; - } - if (end2 > to) - result.push(child.slice(to - start2, child.size, view)); - } - } - return result; -} -function selectionFromDOM(view, origin = null) { - let domSel = view.domSelectionRange(), doc3 = view.state.doc; - if (!domSel.focusNode) - return null; - let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0; - let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1); - if (head < 0) - return null; - let $head = doc3.resolve(head), $anchor, selection; - if (selectionCollapsed(domSel)) { - $anchor = $head; - while (nearestDesc && !nearestDesc.node) - nearestDesc = nearestDesc.parent; - let nearestDescNode = nearestDesc.node; - if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) { - let pos = nearestDesc.posBefore; - selection = new NodeSelection(head == pos ? $head : doc3.resolve(pos)); - } - } else { - let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1); - if (anchor < 0) - return null; - $anchor = doc3.resolve(anchor); - } - if (!selection) { - let bias = origin == "pointer" || view.state.selection.head < $head.pos && !inWidget ? 1 : -1; - selection = selectionBetween(view, $anchor, $head, bias); - } - return selection; -} -function editorOwnsSelection(view) { - return view.editable ? view.hasFocus() : hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom); -} -function selectionToDOM(view, force = false) { - let sel = view.state.selection; - syncNodeSelection(view, sel); - if (!editorOwnsSelection(view)) - return; - if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) { - let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection; - if (domSel.anchorNode && curSel.anchorNode && isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) { - view.input.mouseDown.delayedSelectionSync = true; - view.domObserver.setCurSelection(); - return; - } - } - view.domObserver.disconnectSelection(); - if (view.cursorWrapper) { - selectCursorWrapper(view); - } else { - let { anchor, head } = sel, resetEditableFrom, resetEditableTo; - if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) { - if (!sel.$from.parent.inlineContent) - resetEditableFrom = temporarilyEditableNear(view, sel.from); - if (!sel.empty && !sel.$from.parent.inlineContent) - resetEditableTo = temporarilyEditableNear(view, sel.to); - } - view.docView.setSelection(anchor, head, view.root, force); - if (brokenSelectBetweenUneditable) { - if (resetEditableFrom) - resetEditable(resetEditableFrom); - if (resetEditableTo) - resetEditable(resetEditableTo); - } - if (sel.visible) { - view.dom.classList.remove("ProseMirror-hideselection"); - } else { - view.dom.classList.add("ProseMirror-hideselection"); - if ("onselectionchange" in document) - removeClassOnSelectionChange(view); - } - } - view.domObserver.setCurSelection(); - view.domObserver.connectSelection(); -} -var brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63; -function temporarilyEditableNear(view, pos) { - let { node, offset: offset2 } = view.docView.domFromPos(pos, 0); - let after = offset2 < node.childNodes.length ? node.childNodes[offset2] : null; - let before = offset2 ? node.childNodes[offset2 - 1] : null; - if (safari && after && after.contentEditable == "false") - return setEditable(after); - if ((!after || after.contentEditable == "false") && (!before || before.contentEditable == "false")) { - if (after) - return setEditable(after); - else if (before) - return setEditable(before); - } -} -function setEditable(element) { - element.contentEditable = "true"; - if (safari && element.draggable) { - element.draggable = false; - element.wasDraggable = true; - } - return element; -} -function resetEditable(element) { - element.contentEditable = "false"; - if (element.wasDraggable) { - element.draggable = true; - element.wasDraggable = null; - } -} -function removeClassOnSelectionChange(view) { - let doc3 = view.dom.ownerDocument; - doc3.removeEventListener("selectionchange", view.input.hideSelectionGuard); - let domSel = view.domSelectionRange(); - let node = domSel.anchorNode, offset2 = domSel.anchorOffset; - doc3.addEventListener("selectionchange", view.input.hideSelectionGuard = () => { - if (domSel.anchorNode != node || domSel.anchorOffset != offset2) { - doc3.removeEventListener("selectionchange", view.input.hideSelectionGuard); - setTimeout(() => { - if (!editorOwnsSelection(view) || view.state.selection.visible) - view.dom.classList.remove("ProseMirror-hideselection"); - }, 20); - } - }); -} -function selectCursorWrapper(view) { - let domSel = view.domSelection(), range = document.createRange(); - let node = view.cursorWrapper.dom, img = node.nodeName == "IMG"; - if (img) - range.setEnd(node.parentNode, domIndex(node) + 1); - else - range.setEnd(node, 0); - range.collapse(false); - domSel.removeAllRanges(); - domSel.addRange(range); - if (!img && !view.state.selection.visible && ie && ie_version <= 11) { - node.disabled = true; - node.disabled = false; - } -} -function syncNodeSelection(view, sel) { - if (sel instanceof NodeSelection) { - let desc = view.docView.descAt(sel.from); - if (desc != view.lastSelectedViewDesc) { - clearNodeSelection(view); - if (desc) - desc.selectNode(); - view.lastSelectedViewDesc = desc; - } - } else { - clearNodeSelection(view); - } -} -function clearNodeSelection(view) { - if (view.lastSelectedViewDesc) { - if (view.lastSelectedViewDesc.parent) - view.lastSelectedViewDesc.deselectNode(); - view.lastSelectedViewDesc = void 0; - } -} -function selectionBetween(view, $anchor, $head, bias) { - return view.someProp("createSelectionBetween", (f) => f(view, $anchor, $head)) || TextSelection.between($anchor, $head, bias); -} -function hasFocusAndSelection(view) { - if (view.editable && !view.hasFocus()) - return false; - return hasSelection(view); -} -function hasSelection(view) { - let sel = view.domSelectionRange(); - if (!sel.anchorNode) - return false; - try { - return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) && (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode)); - } catch (_) { - return false; - } -} -function anchorInRightPlace(view) { - let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0); - let domSel = view.domSelectionRange(); - return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset); -} -function moveSelectionBlock(state, dir) { - let { $anchor, $head } = state.selection; - let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head); - let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null; - return $start && Selection.findFrom($start, dir); -} -function apply(view, sel) { - view.dispatch(view.state.tr.setSelection(sel).scrollIntoView()); - return true; -} -function selectHorizontally(view, dir, mods) { - let sel = view.state.selection; - if (sel instanceof TextSelection) { - if (mods.indexOf("s") > -1) { - let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter; - if (!node || node.isText || !node.isLeaf) - return false; - let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1)); - return apply(view, new TextSelection(sel.$anchor, $newHead)); - } else if (!sel.empty) { - return false; - } else if (view.endOfTextblock(dir > 0 ? "forward" : "backward")) { - let next = moveSelectionBlock(view.state, dir); - if (next && next instanceof NodeSelection) - return apply(view, next); - return false; - } else if (!(mac && mods.indexOf("m") > -1)) { - let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc; - if (!node || node.isText) - return false; - let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos; - if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM)) - return false; - if (NodeSelection.isSelectable(node)) { - return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head)); - } else if (webkit) { - return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize))); - } else { - return false; - } - } - } else if (sel instanceof NodeSelection && sel.node.isInline) { - return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from)); - } else { - let next = moveSelectionBlock(view.state, dir); - if (next) - return apply(view, next); - return false; - } -} -function nodeLen(node) { - return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length; -} -function isIgnorable(dom, dir) { - let desc = dom.pmViewDesc; - return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != "BR"); -} -function skipIgnoredNodes(view, dir) { - return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view); -} -function skipIgnoredNodesBefore(view) { - let sel = view.domSelectionRange(); - let node = sel.focusNode, offset2 = sel.focusOffset; - if (!node) - return; - let moveNode, moveOffset, force = false; - if (gecko && node.nodeType == 1 && offset2 < nodeLen(node) && isIgnorable(node.childNodes[offset2], -1)) - force = true; - for (; ; ) { - if (offset2 > 0) { - if (node.nodeType != 1) { - break; - } else { - let before = node.childNodes[offset2 - 1]; - if (isIgnorable(before, -1)) { - moveNode = node; - moveOffset = --offset2; - } else if (before.nodeType == 3) { - node = before; - offset2 = node.nodeValue.length; - } else - break; - } - } else if (isBlockNode(node)) { - break; - } else { - let prev = node.previousSibling; - while (prev && isIgnorable(prev, -1)) { - moveNode = node.parentNode; - moveOffset = domIndex(prev); - prev = prev.previousSibling; - } - if (!prev) { - node = node.parentNode; - if (node == view.dom) - break; - offset2 = 0; - } else { - node = prev; - offset2 = nodeLen(node); - } - } - } - if (force) - setSelFocus(view, node, offset2); - else if (moveNode) - setSelFocus(view, moveNode, moveOffset); -} -function skipIgnoredNodesAfter(view) { - let sel = view.domSelectionRange(); - let node = sel.focusNode, offset2 = sel.focusOffset; - if (!node) - return; - let len = nodeLen(node); - let moveNode, moveOffset; - for (; ; ) { - if (offset2 < len) { - if (node.nodeType != 1) - break; - let after = node.childNodes[offset2]; - if (isIgnorable(after, 1)) { - moveNode = node; - moveOffset = ++offset2; - } else - break; - } else if (isBlockNode(node)) { - break; - } else { - let next = node.nextSibling; - while (next && isIgnorable(next, 1)) { - moveNode = next.parentNode; - moveOffset = domIndex(next) + 1; - next = next.nextSibling; - } - if (!next) { - node = node.parentNode; - if (node == view.dom) - break; - offset2 = len = 0; - } else { - node = next; - offset2 = 0; - len = nodeLen(node); - } - } - } - if (moveNode) - setSelFocus(view, moveNode, moveOffset); -} -function isBlockNode(dom) { - let desc = dom.pmViewDesc; - return desc && desc.node && desc.node.isBlock; -} -function textNodeAfter(node, offset2) { - while (node && offset2 == node.childNodes.length && !hasBlockDesc(node)) { - offset2 = domIndex(node) + 1; - node = node.parentNode; - } - while (node && offset2 < node.childNodes.length) { - let next = node.childNodes[offset2]; - if (next.nodeType == 3) - return next; - if (next.nodeType == 1 && next.contentEditable == "false") - break; - node = next; - offset2 = 0; - } -} -function textNodeBefore(node, offset2) { - while (node && !offset2 && !hasBlockDesc(node)) { - offset2 = domIndex(node); - node = node.parentNode; - } - while (node && offset2) { - let next = node.childNodes[offset2 - 1]; - if (next.nodeType == 3) - return next; - if (next.nodeType == 1 && next.contentEditable == "false") - break; - node = next; - offset2 = node.childNodes.length; - } -} -function setSelFocus(view, node, offset2) { - if (node.nodeType != 3) { - let before, after; - if (after = textNodeAfter(node, offset2)) { - node = after; - offset2 = 0; - } else if (before = textNodeBefore(node, offset2)) { - node = before; - offset2 = before.nodeValue.length; - } - } - let sel = view.domSelection(); - if (selectionCollapsed(sel)) { - let range = document.createRange(); - range.setEnd(node, offset2); - range.setStart(node, offset2); - sel.removeAllRanges(); - sel.addRange(range); - } else if (sel.extend) { - sel.extend(node, offset2); - } - view.domObserver.setCurSelection(); - let { state } = view; - setTimeout(() => { - if (view.state == state) - selectionToDOM(view); - }, 50); -} -function findDirection(view, pos) { - let $pos = view.state.doc.resolve(pos); - if (!(chrome || windows) && $pos.parent.inlineContent) { - let coords = view.coordsAtPos(pos); - if (pos > $pos.start()) { - let before = view.coordsAtPos(pos - 1); - let mid = (before.top + before.bottom) / 2; - if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1) - return before.left < coords.left ? "ltr" : "rtl"; - } - if (pos < $pos.end()) { - let after = view.coordsAtPos(pos + 1); - let mid = (after.top + after.bottom) / 2; - if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1) - return after.left > coords.left ? "ltr" : "rtl"; - } - } - let computed = getComputedStyle(view.dom).direction; - return computed == "rtl" ? "rtl" : "ltr"; -} -function selectVertically(view, dir, mods) { - let sel = view.state.selection; - if (sel instanceof TextSelection && !sel.empty || mods.indexOf("s") > -1) - return false; - if (mac && mods.indexOf("m") > -1) - return false; - let { $from, $to } = sel; - if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? "up" : "down")) { - let next = moveSelectionBlock(view.state, dir); - if (next && next instanceof NodeSelection) - return apply(view, next); - } - if (!$from.parent.inlineContent) { - let side = dir < 0 ? $from : $to; - let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir); - return beyond ? apply(view, beyond) : false; - } - return false; -} -function stopNativeHorizontalDelete(view, dir) { - if (!(view.state.selection instanceof TextSelection)) - return true; - let { $head, $anchor, empty: empty2 } = view.state.selection; - if (!$head.sameParent($anchor)) - return true; - if (!empty2) - return false; - if (view.endOfTextblock(dir > 0 ? "forward" : "backward")) - return true; - let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter); - if (nextNode && !nextNode.isText) { - let tr2 = view.state.tr; - if (dir < 0) - tr2.delete($head.pos - nextNode.nodeSize, $head.pos); - else - tr2.delete($head.pos, $head.pos + nextNode.nodeSize); - view.dispatch(tr2); - return true; - } - return false; -} -function switchEditable(view, node, state) { - view.domObserver.stop(); - node.contentEditable = state; - view.domObserver.start(); -} -function safariDownArrowBug(view) { - if (!safari || view.state.selection.$head.parentOffset > 0) - return false; - let { focusNode, focusOffset } = view.domSelectionRange(); - if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 && focusNode.firstChild && focusNode.firstChild.contentEditable == "false") { - let child = focusNode.firstChild; - switchEditable(view, child, "true"); - setTimeout(() => switchEditable(view, child, "false"), 20); - } - return false; -} -function getMods(event) { - let result = ""; - if (event.ctrlKey) - result += "c"; - if (event.metaKey) - result += "m"; - if (event.altKey) - result += "a"; - if (event.shiftKey) - result += "s"; - return result; -} -function captureKeyDown(view, event) { - let code = event.keyCode, mods = getMods(event); - if (code == 8 || mac && code == 72 && mods == "c") { - return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1); - } else if (code == 46 && !event.shiftKey || mac && code == 68 && mods == "c") { - return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1); - } else if (code == 13 || code == 27) { - return true; - } else if (code == 37 || mac && code == 66 && mods == "c") { - let dir = code == 37 ? findDirection(view, view.state.selection.from) == "ltr" ? -1 : 1 : -1; - return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir); - } else if (code == 39 || mac && code == 70 && mods == "c") { - let dir = code == 39 ? findDirection(view, view.state.selection.from) == "ltr" ? 1 : -1 : 1; - return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir); - } else if (code == 38 || mac && code == 80 && mods == "c") { - return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1); - } else if (code == 40 || mac && code == 78 && mods == "c") { - return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1); - } else if (mods == (mac ? "m" : "c") && (code == 66 || code == 73 || code == 89 || code == 90)) { - return true; - } - return false; -} -function serializeForClipboard(view, slice2) { - view.someProp("transformCopied", (f) => { - slice2 = f(slice2, view); - }); - let context = [], { content, openStart, openEnd } = slice2; - while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) { - openStart--; - openEnd--; - let node = content.firstChild; - context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null); - content = node.content; - } - let serializer = view.someProp("clipboardSerializer") || DOMSerializer.fromSchema(view.state.schema); - let doc3 = detachedDoc(), wrap2 = doc3.createElement("div"); - wrap2.appendChild(serializer.serializeFragment(content, { document: doc3 })); - let firstChild = wrap2.firstChild, needsWrap, wrappers = 0; - while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) { - for (let i = needsWrap.length - 1; i >= 0; i--) { - let wrapper = doc3.createElement(needsWrap[i]); - while (wrap2.firstChild) - wrapper.appendChild(wrap2.firstChild); - wrap2.appendChild(wrapper); - wrappers++; - } - firstChild = wrap2.firstChild; - } - if (firstChild && firstChild.nodeType == 1) - firstChild.setAttribute("data-pm-slice", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : ""} ${JSON.stringify(context)}`); - let text = view.someProp("clipboardTextSerializer", (f) => f(slice2, view)) || slice2.content.textBetween(0, slice2.content.size, "\n\n"); - return { dom: wrap2, text }; -} -function parseFromClipboard(view, text, html, plainText, $context) { - let inCode = $context.parent.type.spec.code; - let dom, slice2; - if (!html && !text) - return null; - let asText = text && (plainText || inCode || !html); - if (asText) { - view.someProp("transformPastedText", (f) => { - text = f(text, inCode || plainText, view); - }); - if (inCode) - return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\r\n?/g, "\n"))), 0, 0) : Slice.empty; - let parsed = view.someProp("clipboardTextParser", (f) => f(text, $context, plainText, view)); - if (parsed) { - slice2 = parsed; - } else { - let marks = $context.marks(); - let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema); - dom = document.createElement("div"); - text.split(/(?:\r\n?|\n)+/).forEach((block) => { - let p = dom.appendChild(document.createElement("p")); - if (block) - p.appendChild(serializer.serializeNode(schema.text(block, marks))); - }); - } - } else { - view.someProp("transformPastedHTML", (f) => { - html = f(html, view); - }); - dom = readHTML(html); - if (webkit) - restoreReplacedSpaces(dom); - } - let contextNode = dom && dom.querySelector("[data-pm-slice]"); - let sliceData = contextNode && /^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(contextNode.getAttribute("data-pm-slice") || ""); - if (sliceData && sliceData[3]) - for (let i = +sliceData[3]; i > 0; i--) { - let child = dom.firstChild; - while (child && child.nodeType != 1) - child = child.nextSibling; - if (!child) - break; - dom = child; - } - if (!slice2) { - let parser = view.someProp("clipboardParser") || view.someProp("domParser") || DOMParser.fromSchema(view.state.schema); - slice2 = parser.parseSlice(dom, { - preserveWhitespace: !!(asText || sliceData), - context: $context, - ruleFromNode(dom2) { - if (dom2.nodeName == "BR" && !dom2.nextSibling && dom2.parentNode && !inlineParents.test(dom2.parentNode.nodeName)) - return { ignore: true }; - return null; - } - }); - } - if (sliceData) { - slice2 = addContext(closeSlice(slice2, +sliceData[1], +sliceData[2]), sliceData[4]); - } else { - slice2 = Slice.maxOpen(normalizeSiblings(slice2.content, $context), true); - if (slice2.openStart || slice2.openEnd) { - let openStart = 0, openEnd = 0; - for (let node = slice2.content.firstChild; openStart < slice2.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { - } - for (let node = slice2.content.lastChild; openEnd < slice2.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { - } - slice2 = closeSlice(slice2, openStart, openEnd); - } - } - view.someProp("transformPasted", (f) => { - slice2 = f(slice2, view); - }); - return slice2; -} -var inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i; -function normalizeSiblings(fragment, $context) { - if (fragment.childCount < 2) - return fragment; - for (let d = $context.depth; d >= 0; d--) { - let parent = $context.node(d); - let match = parent.contentMatchAt($context.index(d)); - let lastWrap, result = []; - fragment.forEach((node) => { - if (!result) - return; - let wrap2 = match.findWrapping(node.type), inLast; - if (!wrap2) - return result = null; - if (inLast = result.length && lastWrap.length && addToSibling(wrap2, lastWrap, node, result[result.length - 1], 0)) { - result[result.length - 1] = inLast; - } else { - if (result.length) - result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length); - let wrapped = withWrappers(node, wrap2); - result.push(wrapped); - match = match.matchType(wrapped.type); - lastWrap = wrap2; - } - }); - if (result) - return Fragment.from(result); - } - return fragment; -} -function withWrappers(node, wrap2, from2 = 0) { - for (let i = wrap2.length - 1; i >= from2; i--) - node = wrap2[i].create(null, Fragment.from(node)); - return node; -} -function addToSibling(wrap2, lastWrap, node, sibling, depth) { - if (depth < wrap2.length && depth < lastWrap.length && wrap2[depth] == lastWrap[depth]) { - let inner = addToSibling(wrap2, lastWrap, node, sibling.lastChild, depth + 1); - if (inner) - return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner)); - let match = sibling.contentMatchAt(sibling.childCount); - if (match.matchType(depth == wrap2.length - 1 ? node.type : wrap2[depth + 1])) - return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap2, depth + 1)))); - } -} -function closeRight(node, depth) { - if (depth == 0) - return node; - let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1)); - let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true); - return node.copy(fragment.append(fill)); -} -function closeRange(fragment, side, from2, to, depth, openEnd) { - let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content; - if (fragment.childCount > 1) - openEnd = 0; - if (depth < to - 1) - inner = closeRange(inner, side, from2, to, depth + 1, openEnd); - if (depth >= from2) - inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner) : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true)); - return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner)); -} -function closeSlice(slice2, openStart, openEnd) { - if (openStart < slice2.openStart) - slice2 = new Slice(closeRange(slice2.content, -1, openStart, slice2.openStart, 0, slice2.openEnd), openStart, slice2.openEnd); - if (openEnd < slice2.openEnd) - slice2 = new Slice(closeRange(slice2.content, 1, openEnd, slice2.openEnd, 0, 0), slice2.openStart, openEnd); - return slice2; -} -var wrapMap = { - thead: ["table"], - tbody: ["table"], - tfoot: ["table"], - caption: ["table"], - colgroup: ["table"], - col: ["table", "colgroup"], - tr: ["table", "tbody"], - td: ["table", "tbody", "tr"], - th: ["table", "tbody", "tr"] -}; -var _detachedDoc = null; -function detachedDoc() { - return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument("title")); -} -function readHTML(html) { - let metas = /^(\s*]*>)*/.exec(html); - if (metas) - html = html.slice(metas[0].length); - let elt = detachedDoc().createElement("div"); - let firstTag = /<([a-z][^>\s]+)/i.exec(html), wrap2; - if (wrap2 = firstTag && wrapMap[firstTag[1].toLowerCase()]) - html = wrap2.map((n) => "<" + n + ">").join("") + html + wrap2.map((n) => "").reverse().join(""); - elt.innerHTML = html; - if (wrap2) - for (let i = 0; i < wrap2.length; i++) - elt = elt.querySelector(wrap2[i]) || elt; - return elt; -} -function restoreReplacedSpaces(dom) { - let nodes = dom.querySelectorAll(chrome ? "span:not([class]):not([style])" : "span.Apple-converted-space"); - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i]; - if (node.childNodes.length == 1 && node.textContent == "\xA0" && node.parentNode) - node.parentNode.replaceChild(dom.ownerDocument.createTextNode(" "), node); - } -} -function addContext(slice2, context) { - if (!slice2.size) - return slice2; - let schema = slice2.content.firstChild.type.schema, array; - try { - array = JSON.parse(context); - } catch (e) { - return slice2; - } - let { content, openStart, openEnd } = slice2; - for (let i = array.length - 2; i >= 0; i -= 2) { - let type = schema.nodes[array[i]]; - if (!type || type.hasRequiredAttrs()) - break; - content = Fragment.from(type.create(array[i + 1], content)); - openStart++; - openEnd++; - } - return new Slice(content, openStart, openEnd); -} -var handlers = {}; -var editHandlers = {}; -var passiveHandlers = { touchstart: true, touchmove: true }; -var InputState = class { - constructor() { - this.shiftKey = false; - this.mouseDown = null; - this.lastKeyCode = null; - this.lastKeyCodeTime = 0; - this.lastClick = { time: 0, x: 0, y: 0, type: "" }; - this.lastSelectionOrigin = null; - this.lastSelectionTime = 0; - this.lastIOSEnter = 0; - this.lastIOSEnterFallbackTimeout = -1; - this.lastFocus = 0; - this.lastTouch = 0; - this.lastAndroidDelete = 0; - this.composing = false; - this.composingTimeout = -1; - this.compositionNodes = []; - this.compositionEndedAt = -2e8; - this.compositionID = 1; - this.compositionPendingChanges = 0; - this.domChangeCount = 0; - this.eventHandlers = /* @__PURE__ */ Object.create(null); - this.hideSelectionGuard = null; - } -}; -function initInput(view) { - for (let event in handlers) { - let handler = handlers[event]; - view.dom.addEventListener(event, view.input.eventHandlers[event] = (event2) => { - if (eventBelongsToView(view, event2) && !runCustomHandler(view, event2) && (view.editable || !(event2.type in editHandlers))) - handler(view, event2); - }, passiveHandlers[event] ? { passive: true } : void 0); - } - if (safari) - view.dom.addEventListener("input", () => null); - ensureListeners(view); -} -function setSelectionOrigin(view, origin) { - view.input.lastSelectionOrigin = origin; - view.input.lastSelectionTime = Date.now(); -} -function destroyInput(view) { - view.domObserver.stop(); - for (let type in view.input.eventHandlers) - view.dom.removeEventListener(type, view.input.eventHandlers[type]); - clearTimeout(view.input.composingTimeout); - clearTimeout(view.input.lastIOSEnterFallbackTimeout); -} -function ensureListeners(view) { - view.someProp("handleDOMEvents", (currentHandlers) => { - for (let type in currentHandlers) - if (!view.input.eventHandlers[type]) - view.dom.addEventListener(type, view.input.eventHandlers[type] = (event) => runCustomHandler(view, event)); - }); -} -function runCustomHandler(view, event) { - return view.someProp("handleDOMEvents", (handlers2) => { - let handler = handlers2[event.type]; - return handler ? handler(view, event) || event.defaultPrevented : false; - }); -} -function eventBelongsToView(view, event) { - if (!event.bubbles) - return true; - if (event.defaultPrevented) - return false; - for (let node = event.target; node != view.dom; node = node.parentNode) - if (!node || node.nodeType == 11 || node.pmViewDesc && node.pmViewDesc.stopEvent(event)) - return false; - return true; -} -function dispatchEvent(view, event) { - if (!runCustomHandler(view, event) && handlers[event.type] && (view.editable || !(event.type in editHandlers))) - handlers[event.type](view, event); -} -editHandlers.keydown = (view, _event) => { - let event = _event; - view.input.shiftKey = event.keyCode == 16 || event.shiftKey; - if (inOrNearComposition(view, event)) - return; - view.input.lastKeyCode = event.keyCode; - view.input.lastKeyCodeTime = Date.now(); - if (android && chrome && event.keyCode == 13) - return; - if (event.keyCode != 229) - view.domObserver.forceFlush(); - if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) { - let now = Date.now(); - view.input.lastIOSEnter = now; - view.input.lastIOSEnterFallbackTimeout = setTimeout(() => { - if (view.input.lastIOSEnter == now) { - view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter"))); - view.input.lastIOSEnter = 0; - } - }, 200); - } else if (view.someProp("handleKeyDown", (f) => f(view, event)) || captureKeyDown(view, event)) { - event.preventDefault(); - } else { - setSelectionOrigin(view, "key"); - } -}; -editHandlers.keyup = (view, event) => { - if (event.keyCode == 16) - view.input.shiftKey = false; -}; -editHandlers.keypress = (view, _event) => { - let event = _event; - if (inOrNearComposition(view, event) || !event.charCode || event.ctrlKey && !event.altKey || mac && event.metaKey) - return; - if (view.someProp("handleKeyPress", (f) => f(view, event))) { - event.preventDefault(); - return; - } - let sel = view.state.selection; - if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) { - let text = String.fromCharCode(event.charCode); - if (!/[\r\n]/.test(text) && !view.someProp("handleTextInput", (f) => f(view, sel.$from.pos, sel.$to.pos, text))) - view.dispatch(view.state.tr.insertText(text).scrollIntoView()); - event.preventDefault(); - } -}; -function eventCoords(event) { - return { left: event.clientX, top: event.clientY }; -} -function isNear(event, click) { - let dx = click.x - event.clientX, dy = click.y - event.clientY; - return dx * dx + dy * dy < 100; -} -function runHandlerOnContext(view, propName, pos, inside, event) { - if (inside == -1) - return false; - let $pos = view.state.doc.resolve(inside); - for (let i = $pos.depth + 1; i > 0; i--) { - if (view.someProp(propName, (f) => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true) : f(view, pos, $pos.node(i), $pos.before(i), event, false))) - return true; - } - return false; -} -function updateSelection(view, selection, origin) { - if (!view.focused) - view.focus(); - let tr2 = view.state.tr.setSelection(selection); - if (origin == "pointer") - tr2.setMeta("pointer", true); - view.dispatch(tr2); -} -function selectClickedLeaf(view, inside) { - if (inside == -1) - return false; - let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter; - if (node && node.isAtom && NodeSelection.isSelectable(node)) { - updateSelection(view, new NodeSelection($pos), "pointer"); - return true; - } - return false; -} -function selectClickedNode(view, inside) { - if (inside == -1) - return false; - let sel = view.state.selection, selectedNode, selectAt; - if (sel instanceof NodeSelection) - selectedNode = sel.node; - let $pos = view.state.doc.resolve(inside); - for (let i = $pos.depth + 1; i > 0; i--) { - let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i); - if (NodeSelection.isSelectable(node)) { - if (selectedNode && sel.$from.depth > 0 && i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos) - selectAt = $pos.before(sel.$from.depth); - else - selectAt = $pos.before(i); - break; - } - } - if (selectAt != null) { - updateSelection(view, NodeSelection.create(view.state.doc, selectAt), "pointer"); - return true; - } else { - return false; - } -} -function handleSingleClick(view, pos, inside, event, selectNode) { - return runHandlerOnContext(view, "handleClickOn", pos, inside, event) || view.someProp("handleClick", (f) => f(view, pos, event)) || (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside)); -} -function handleDoubleClick(view, pos, inside, event) { - return runHandlerOnContext(view, "handleDoubleClickOn", pos, inside, event) || view.someProp("handleDoubleClick", (f) => f(view, pos, event)); -} -function handleTripleClick(view, pos, inside, event) { - return runHandlerOnContext(view, "handleTripleClickOn", pos, inside, event) || view.someProp("handleTripleClick", (f) => f(view, pos, event)) || defaultTripleClick(view, inside, event); -} -function defaultTripleClick(view, inside, event) { - if (event.button != 0) - return false; - let doc3 = view.state.doc; - if (inside == -1) { - if (doc3.inlineContent) { - updateSelection(view, TextSelection.create(doc3, 0, doc3.content.size), "pointer"); - return true; - } - return false; - } - let $pos = doc3.resolve(inside); - for (let i = $pos.depth + 1; i > 0; i--) { - let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i); - let nodePos = $pos.before(i); - if (node.inlineContent) - updateSelection(view, TextSelection.create(doc3, nodePos + 1, nodePos + 1 + node.content.size), "pointer"); - else if (NodeSelection.isSelectable(node)) - updateSelection(view, NodeSelection.create(doc3, nodePos), "pointer"); - else - continue; - return true; - } -} -function forceDOMFlush(view) { - return endComposition(view); -} -var selectNodeModifier = mac ? "metaKey" : "ctrlKey"; -handlers.mousedown = (view, _event) => { - let event = _event; - view.input.shiftKey = event.shiftKey; - let flushed = forceDOMFlush(view); - let now = Date.now(), type = "singleClick"; - if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier]) { - if (view.input.lastClick.type == "singleClick") - type = "doubleClick"; - else if (view.input.lastClick.type == "doubleClick") - type = "tripleClick"; - } - view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type }; - let pos = view.posAtCoords(eventCoords(event)); - if (!pos) - return; - if (type == "singleClick") { - if (view.input.mouseDown) - view.input.mouseDown.done(); - view.input.mouseDown = new MouseDown(view, pos, event, !!flushed); - } else if ((type == "doubleClick" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) { - event.preventDefault(); - } else { - setSelectionOrigin(view, "pointer"); - } -}; -var MouseDown = class { - constructor(view, pos, event, flushed) { - this.view = view; - this.pos = pos; - this.event = event; - this.flushed = flushed; - this.delayedSelectionSync = false; - this.mightDrag = null; - this.startDoc = view.state.doc; - this.selectNode = !!event[selectNodeModifier]; - this.allowDefault = event.shiftKey; - let targetNode, targetPos; - if (pos.inside > -1) { - targetNode = view.state.doc.nodeAt(pos.inside); - targetPos = pos.inside; - } else { - let $pos = view.state.doc.resolve(pos.pos); - targetNode = $pos.parent; - targetPos = $pos.depth ? $pos.before() : 0; - } - const target = flushed ? null : event.target; - const targetDesc = target ? view.docView.nearestDesc(target, true) : null; - this.target = targetDesc ? targetDesc.dom : null; - let { selection } = view.state; - if (event.button == 0 && targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false || selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos) - this.mightDrag = { - node: targetNode, - pos: targetPos, - addAttr: !!(this.target && !this.target.draggable), - setUneditable: !!(this.target && gecko && !this.target.hasAttribute("contentEditable")) - }; - if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) { - this.view.domObserver.stop(); - if (this.mightDrag.addAttr) - this.target.draggable = true; - if (this.mightDrag.setUneditable) - setTimeout(() => { - if (this.view.input.mouseDown == this) - this.target.setAttribute("contentEditable", "false"); - }, 20); - this.view.domObserver.start(); - } - view.root.addEventListener("mouseup", this.up = this.up.bind(this)); - view.root.addEventListener("mousemove", this.move = this.move.bind(this)); - setSelectionOrigin(view, "pointer"); - } - done() { - this.view.root.removeEventListener("mouseup", this.up); - this.view.root.removeEventListener("mousemove", this.move); - if (this.mightDrag && this.target) { - this.view.domObserver.stop(); - if (this.mightDrag.addAttr) - this.target.removeAttribute("draggable"); - if (this.mightDrag.setUneditable) - this.target.removeAttribute("contentEditable"); - this.view.domObserver.start(); - } - if (this.delayedSelectionSync) - setTimeout(() => selectionToDOM(this.view)); - this.view.input.mouseDown = null; - } - up(event) { - this.done(); - if (!this.view.dom.contains(event.target)) - return; - let pos = this.pos; - if (this.view.state.doc != this.startDoc) - pos = this.view.posAtCoords(eventCoords(event)); - this.updateAllowDefault(event); - if (this.allowDefault || !pos) { - setSelectionOrigin(this.view, "pointer"); - } else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) { - event.preventDefault(); - } else if (event.button == 0 && (this.flushed || // Safari ignores clicks on draggable elements - safari && this.mightDrag && !this.mightDrag.node.isAtom || // Chrome will sometimes treat a node selection as a - // cursor, but still report that the node is selected - // when asked through getSelection. You'll then get a - // situation where clicking at the point where that - // (hidden) cursor is doesn't change the selection, and - // thus doesn't get a reaction from ProseMirror. This - // works around that. - chrome && !this.view.state.selection.visible && Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2)) { - updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), "pointer"); - event.preventDefault(); - } else { - setSelectionOrigin(this.view, "pointer"); - } - } - move(event) { - this.updateAllowDefault(event); - setSelectionOrigin(this.view, "pointer"); - if (event.buttons == 0) - this.done(); - } - updateAllowDefault(event) { - if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 || Math.abs(this.event.y - event.clientY) > 4)) - this.allowDefault = true; - } -}; -handlers.touchstart = (view) => { - view.input.lastTouch = Date.now(); - forceDOMFlush(view); - setSelectionOrigin(view, "pointer"); -}; -handlers.touchmove = (view) => { - view.input.lastTouch = Date.now(); - setSelectionOrigin(view, "pointer"); -}; -handlers.contextmenu = (view) => forceDOMFlush(view); -function inOrNearComposition(view, event) { - if (view.composing) - return true; - if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) { - view.input.compositionEndedAt = -2e8; - return true; - } - return false; -} -var timeoutComposition = android ? 5e3 : -1; -editHandlers.compositionstart = editHandlers.compositionupdate = (view) => { - if (!view.composing) { - view.domObserver.flush(); - let { state } = view, $pos = state.selection.$from; - if (state.selection.empty && (state.storedMarks || !$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some((m) => m.type.spec.inclusive === false))) { - view.markCursor = view.state.storedMarks || $pos.marks(); - endComposition(view, true); - view.markCursor = null; - } else { - endComposition(view); - if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) { - let sel = view.domSelectionRange(); - for (let node = sel.focusNode, offset2 = sel.focusOffset; node && node.nodeType == 1 && offset2 != 0; ) { - let before = offset2 < 0 ? node.lastChild : node.childNodes[offset2 - 1]; - if (!before) - break; - if (before.nodeType == 3) { - view.domSelection().collapse(before, before.nodeValue.length); - break; - } else { - node = before; - offset2 = -1; - } - } - } - } - view.input.composing = true; - } - scheduleComposeEnd(view, timeoutComposition); -}; -editHandlers.compositionend = (view, event) => { - if (view.composing) { - view.input.composing = false; - view.input.compositionEndedAt = event.timeStamp; - view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0; - if (view.input.compositionPendingChanges) - Promise.resolve().then(() => view.domObserver.flush()); - view.input.compositionID++; - scheduleComposeEnd(view, 20); - } -}; -function scheduleComposeEnd(view, delay) { - clearTimeout(view.input.composingTimeout); - if (delay > -1) - view.input.composingTimeout = setTimeout(() => endComposition(view), delay); -} -function clearComposition(view) { - if (view.composing) { - view.input.composing = false; - view.input.compositionEndedAt = timestampFromCustomEvent(); - } - while (view.input.compositionNodes.length > 0) - view.input.compositionNodes.pop().markParentsDirty(); -} -function timestampFromCustomEvent() { - let event = document.createEvent("Event"); - event.initEvent("event", true, true); - return event.timeStamp; -} -function endComposition(view, forceUpdate = false) { - if (android && view.domObserver.flushingSoon >= 0) - return; - view.domObserver.forceFlush(); - clearComposition(view); - if (forceUpdate || view.docView && view.docView.dirty) { - let sel = selectionFromDOM(view); - if (sel && !sel.eq(view.state.selection)) - view.dispatch(view.state.tr.setSelection(sel)); - else - view.updateState(view.state); - return true; - } - return false; -} -function captureCopy(view, dom) { - if (!view.dom.parentNode) - return; - let wrap2 = view.dom.parentNode.appendChild(document.createElement("div")); - wrap2.appendChild(dom); - wrap2.style.cssText = "position: fixed; left: -10000px; top: 10px"; - let sel = getSelection(), range = document.createRange(); - range.selectNodeContents(dom); - view.dom.blur(); - sel.removeAllRanges(); - sel.addRange(range); - setTimeout(() => { - if (wrap2.parentNode) - wrap2.parentNode.removeChild(wrap2); - view.focus(); - }, 50); -} -var brokenClipboardAPI = ie && ie_version < 15 || ios && webkit_version < 604; -handlers.copy = editHandlers.cut = (view, _event) => { - let event = _event; - let sel = view.state.selection, cut2 = event.type == "cut"; - if (sel.empty) - return; - let data = brokenClipboardAPI ? null : event.clipboardData; - let slice2 = sel.content(), { dom, text } = serializeForClipboard(view, slice2); - if (data) { - event.preventDefault(); - data.clearData(); - data.setData("text/html", dom.innerHTML); - data.setData("text/plain", text); - } else { - captureCopy(view, dom); - } - if (cut2) - view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent", "cut")); -}; -function sliceSingleNode(slice2) { - return slice2.openStart == 0 && slice2.openEnd == 0 && slice2.content.childCount == 1 ? slice2.content.firstChild : null; -} -function capturePaste(view, event) { - if (!view.dom.parentNode) - return; - let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code; - let target = view.dom.parentNode.appendChild(document.createElement(plainText ? "textarea" : "div")); - if (!plainText) - target.contentEditable = "true"; - target.style.cssText = "position: fixed; left: -10000px; top: 10px"; - target.focus(); - let plain = view.input.shiftKey && view.input.lastKeyCode != 45; - setTimeout(() => { - view.focus(); - if (target.parentNode) - target.parentNode.removeChild(target); - if (plainText) - doPaste(view, target.value, null, plain, event); - else - doPaste(view, target.textContent, target.innerHTML, plain, event); - }, 50); -} -function doPaste(view, text, html, preferPlain, event) { - let slice2 = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from); - if (view.someProp("handlePaste", (f) => f(view, event, slice2 || Slice.empty))) - return true; - if (!slice2) - return false; - let singleNode = sliceSingleNode(slice2); - let tr2 = singleNode ? view.state.tr.replaceSelectionWith(singleNode, preferPlain) : view.state.tr.replaceSelection(slice2); - view.dispatch(tr2.scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste")); - return true; -} -function getText(clipboardData) { - let text = clipboardData.getData("text/plain") || clipboardData.getData("Text"); - if (text) - return text; - let uris = clipboardData.getData("text/uri-list"); - return uris ? uris.replace(/\r?\n/g, " ") : ""; -} -editHandlers.paste = (view, _event) => { - let event = _event; - if (view.composing && !android) - return; - let data = brokenClipboardAPI ? null : event.clipboardData; - let plain = view.input.shiftKey && view.input.lastKeyCode != 45; - if (data && doPaste(view, getText(data), data.getData("text/html"), plain, event)) - event.preventDefault(); - else - capturePaste(view, event); -}; -var Dragging = class { - constructor(slice2, move, node) { - this.slice = slice2; - this.move = move; - this.node = node; - } -}; -var dragCopyModifier = mac ? "altKey" : "ctrlKey"; -handlers.dragstart = (view, _event) => { - let event = _event; - let mouseDown = view.input.mouseDown; - if (mouseDown) - mouseDown.done(); - if (!event.dataTransfer) - return; - let sel = view.state.selection; - let pos = sel.empty ? null : view.posAtCoords(eventCoords(event)); - let node; - if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) - ; - else if (mouseDown && mouseDown.mightDrag) { - node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos); - } else if (event.target && event.target.nodeType == 1) { - let desc = view.docView.nearestDesc(event.target, true); - if (desc && desc.node.type.spec.draggable && desc != view.docView) - node = NodeSelection.create(view.state.doc, desc.posBefore); - } - let slice2 = (node || view.state.selection).content(), { dom, text } = serializeForClipboard(view, slice2); - event.dataTransfer.clearData(); - event.dataTransfer.setData(brokenClipboardAPI ? "Text" : "text/html", dom.innerHTML); - event.dataTransfer.effectAllowed = "copyMove"; - if (!brokenClipboardAPI) - event.dataTransfer.setData("text/plain", text); - view.dragging = new Dragging(slice2, !event[dragCopyModifier], node); -}; -handlers.dragend = (view) => { - let dragging = view.dragging; - window.setTimeout(() => { - if (view.dragging == dragging) - view.dragging = null; - }, 50); -}; -editHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault(); -editHandlers.drop = (view, _event) => { - let event = _event; - let dragging = view.dragging; - view.dragging = null; - if (!event.dataTransfer) - return; - let eventPos = view.posAtCoords(eventCoords(event)); - if (!eventPos) - return; - let $mouse = view.state.doc.resolve(eventPos.pos); - let slice2 = dragging && dragging.slice; - if (slice2) { - view.someProp("transformPasted", (f) => { - slice2 = f(slice2, view); - }); - } else { - slice2 = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse); - } - let move = !!(dragging && !event[dragCopyModifier]); - if (view.someProp("handleDrop", (f) => f(view, event, slice2 || Slice.empty, move))) { - event.preventDefault(); - return; - } - if (!slice2) - return; - event.preventDefault(); - let insertPos = slice2 ? dropPoint(view.state.doc, $mouse.pos, slice2) : $mouse.pos; - if (insertPos == null) - insertPos = $mouse.pos; - let tr2 = view.state.tr; - if (move) { - let { node } = dragging; - if (node) - node.replace(tr2); - else - tr2.deleteSelection(); - } - let pos = tr2.mapping.map(insertPos); - let isNode = slice2.openStart == 0 && slice2.openEnd == 0 && slice2.content.childCount == 1; - let beforeInsert = tr2.doc; - if (isNode) - tr2.replaceRangeWith(pos, pos, slice2.content.firstChild); - else - tr2.replaceRange(pos, pos, slice2); - if (tr2.doc.eq(beforeInsert)) - return; - let $pos = tr2.doc.resolve(pos); - if (isNode && NodeSelection.isSelectable(slice2.content.firstChild) && $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice2.content.firstChild)) { - tr2.setSelection(new NodeSelection($pos)); - } else { - let end2 = tr2.mapping.map(insertPos); - tr2.mapping.maps[tr2.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end2 = newTo); - tr2.setSelection(selectionBetween(view, $pos, tr2.doc.resolve(end2))); - } - view.focus(); - view.dispatch(tr2.setMeta("uiEvent", "drop")); -}; -handlers.focus = (view) => { - view.input.lastFocus = Date.now(); - if (!view.focused) { - view.domObserver.stop(); - view.dom.classList.add("ProseMirror-focused"); - view.domObserver.start(); - view.focused = true; - setTimeout(() => { - if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange())) - selectionToDOM(view); - }, 20); - } -}; -handlers.blur = (view, _event) => { - let event = _event; - if (view.focused) { - view.domObserver.stop(); - view.dom.classList.remove("ProseMirror-focused"); - view.domObserver.start(); - if (event.relatedTarget && view.dom.contains(event.relatedTarget)) - view.domObserver.currentSelection.clear(); - view.focused = false; - } -}; -handlers.beforeinput = (view, _event) => { - let event = _event; - if (chrome && android && event.inputType == "deleteContentBackward") { - view.domObserver.flushSoon(); - let { domChangeCount } = view.input; - setTimeout(() => { - if (view.input.domChangeCount != domChangeCount) - return; - view.dom.blur(); - view.focus(); - if (view.someProp("handleKeyDown", (f) => f(view, keyEvent(8, "Backspace")))) - return; - let { $cursor } = view.state.selection; - if ($cursor && $cursor.pos > 0) - view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView()); - }, 50); - } -}; -for (let prop in editHandlers) - handlers[prop] = editHandlers[prop]; -function compareObjs(a, b) { - if (a == b) - return true; - for (let p in a) - if (a[p] !== b[p]) - return false; - for (let p in b) - if (!(p in a)) - return false; - return true; -} -var WidgetType = class _WidgetType { - constructor(toDOM, spec) { - this.toDOM = toDOM; - this.spec = spec || noSpec; - this.side = this.spec.side || 0; - } - map(mapping, span, offset2, oldOffset) { - let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1); - return deleted ? null : new Decoration(pos - offset2, pos - offset2, this); - } - valid() { - return true; - } - eq(other) { - return this == other || other instanceof _WidgetType && (this.spec.key && this.spec.key == other.spec.key || this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)); - } - destroy(node) { - if (this.spec.destroy) - this.spec.destroy(node); - } -}; -var InlineType = class _InlineType { - constructor(attrs, spec) { - this.attrs = attrs; - this.spec = spec || noSpec; - } - map(mapping, span, offset2, oldOffset) { - let from2 = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset2; - let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset2; - return from2 >= to ? null : new Decoration(from2, to, this); - } - valid(_, span) { - return span.from < span.to; - } - eq(other) { - return this == other || other instanceof _InlineType && compareObjs(this.attrs, other.attrs) && compareObjs(this.spec, other.spec); - } - static is(span) { - return span.type instanceof _InlineType; - } - destroy() { - } -}; -var NodeType2 = class _NodeType { - constructor(attrs, spec) { - this.attrs = attrs; - this.spec = spec || noSpec; - } - map(mapping, span, offset2, oldOffset) { - let from2 = mapping.mapResult(span.from + oldOffset, 1); - if (from2.deleted) - return null; - let to = mapping.mapResult(span.to + oldOffset, -1); - if (to.deleted || to.pos <= from2.pos) - return null; - return new Decoration(from2.pos - offset2, to.pos - offset2, this); - } - valid(node, span) { - let { index, offset: offset2 } = node.content.findIndex(span.from), child; - return offset2 == span.from && !(child = node.child(index)).isText && offset2 + child.nodeSize == span.to; - } - eq(other) { - return this == other || other instanceof _NodeType && compareObjs(this.attrs, other.attrs) && compareObjs(this.spec, other.spec); - } - destroy() { - } -}; -var Decoration = class _Decoration { - /** - @internal - */ - constructor(from2, to, type) { - this.from = from2; - this.to = to; - this.type = type; - } - /** - @internal - */ - copy(from2, to) { - return new _Decoration(from2, to, this.type); - } - /** - @internal - */ - eq(other, offset2 = 0) { - return this.type.eq(other.type) && this.from + offset2 == other.from && this.to + offset2 == other.to; - } - /** - @internal - */ - map(mapping, offset2, oldOffset) { - return this.type.map(mapping, this, offset2, oldOffset); - } - /** - Creates a widget decoration, which is a DOM node that's shown in - the document at the given position. It is recommended that you - delay rendering the widget by passing a function that will be - called when the widget is actually drawn in a view, but you can - also directly pass a DOM node. `getPos` can be used to find the - widget's current document position. - */ - static widget(pos, toDOM, spec) { - return new _Decoration(pos, pos, new WidgetType(toDOM, spec)); - } - /** - Creates an inline decoration, which adds the given attributes to - each inline node between `from` and `to`. - */ - static inline(from2, to, attrs, spec) { - return new _Decoration(from2, to, new InlineType(attrs, spec)); - } - /** - Creates a node decoration. `from` and `to` should point precisely - before and after a node in the document. That node, and only that - node, will receive the given attributes. - */ - static node(from2, to, attrs, spec) { - return new _Decoration(from2, to, new NodeType2(attrs, spec)); - } - /** - The spec provided when creating this decoration. Can be useful - if you've stored extra information in that object. - */ - get spec() { - return this.type.spec; - } - /** - @internal - */ - get inline() { - return this.type instanceof InlineType; - } - /** - @internal - */ - get widget() { - return this.type instanceof WidgetType; - } -}; -var none = []; -var noSpec = {}; -var DecorationSet = class _DecorationSet { - /** - @internal - */ - constructor(local, children) { - this.local = local.length ? local : none; - this.children = children.length ? children : none; - } - /** - Create a set of decorations, using the structure of the given - document. This will consume (modify) the `decorations` array, so - you must make a copy if you want need to preserve that. - */ - static create(doc3, decorations) { - return decorations.length ? buildTree(decorations, doc3, 0, noSpec) : empty; - } - /** - Find all decorations in this set which touch the given range - (including decorations that start or end directly at the - boundaries) and match the given predicate on their spec. When - `start` and `end` are omitted, all decorations in the set are - considered. When `predicate` isn't given, all decorations are - assumed to match. - */ - find(start2, end2, predicate) { - let result = []; - this.findInner(start2 == null ? 0 : start2, end2 == null ? 1e9 : end2, result, 0, predicate); - return result; - } - findInner(start2, end2, result, offset2, predicate) { - for (let i = 0; i < this.local.length; i++) { - let span = this.local[i]; - if (span.from <= end2 && span.to >= start2 && (!predicate || predicate(span.spec))) - result.push(span.copy(span.from + offset2, span.to + offset2)); - } - for (let i = 0; i < this.children.length; i += 3) { - if (this.children[i] < end2 && this.children[i + 1] > start2) { - let childOff = this.children[i] + 1; - this.children[i + 2].findInner(start2 - childOff, end2 - childOff, result, offset2 + childOff, predicate); - } - } - } - /** - Map the set of decorations in response to a change in the - document. - */ - map(mapping, doc3, options) { - if (this == empty || mapping.maps.length == 0) - return this; - return this.mapInner(mapping, doc3, 0, 0, options || noSpec); - } - /** - @internal - */ - mapInner(mapping, node, offset2, oldOffset, options) { - let newLocal; - for (let i = 0; i < this.local.length; i++) { - let mapped = this.local[i].map(mapping, offset2, oldOffset); - if (mapped && mapped.type.valid(node, mapped)) - (newLocal || (newLocal = [])).push(mapped); - else if (options.onRemove) - options.onRemove(this.local[i].spec); - } - if (this.children.length) - return mapChildren(this.children, newLocal || [], mapping, node, offset2, oldOffset, options); - else - return newLocal ? new _DecorationSet(newLocal.sort(byPos), none) : empty; - } - /** - Add the given array of decorations to the ones in the set, - producing a new set. Consumes the `decorations` array. Needs - access to the current document to create the appropriate tree - structure. - */ - add(doc3, decorations) { - if (!decorations.length) - return this; - if (this == empty) - return _DecorationSet.create(doc3, decorations); - return this.addInner(doc3, decorations, 0); - } - addInner(doc3, decorations, offset2) { - let children, childIndex = 0; - doc3.forEach((childNode, childOffset) => { - let baseOffset = childOffset + offset2, found2; - if (!(found2 = takeSpansForNode(decorations, childNode, baseOffset))) - return; - if (!children) - children = this.children.slice(); - while (childIndex < children.length && children[childIndex] < childOffset) - childIndex += 3; - if (children[childIndex] == childOffset) - children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found2, baseOffset + 1); - else - children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found2, childNode, baseOffset + 1, noSpec)); - childIndex += 3; - }); - let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset2); - for (let i = 0; i < local.length; i++) - if (!local[i].type.valid(doc3, local[i])) - local.splice(i--, 1); - return new _DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children); - } - /** - Create a new set that contains the decorations in this set, minus - the ones in the given array. - */ - remove(decorations) { - if (decorations.length == 0 || this == empty) - return this; - return this.removeInner(decorations, 0); - } - removeInner(decorations, offset2) { - let children = this.children, local = this.local; - for (let i = 0; i < children.length; i += 3) { - let found2; - let from2 = children[i] + offset2, to = children[i + 1] + offset2; - for (let j = 0, span; j < decorations.length; j++) - if (span = decorations[j]) { - if (span.from > from2 && span.to < to) { - decorations[j] = null; - (found2 || (found2 = [])).push(span); - } - } - if (!found2) - continue; - if (children == this.children) - children = this.children.slice(); - let removed = children[i + 2].removeInner(found2, from2 + 1); - if (removed != empty) { - children[i + 2] = removed; - } else { - children.splice(i, 3); - i -= 3; - } - } - if (local.length) { - for (let i = 0, span; i < decorations.length; i++) - if (span = decorations[i]) { - for (let j = 0; j < local.length; j++) - if (local[j].eq(span, offset2)) { - if (local == this.local) - local = this.local.slice(); - local.splice(j--, 1); - } - } - } - if (children == this.children && local == this.local) - return this; - return local.length || children.length ? new _DecorationSet(local, children) : empty; - } - /** - @internal - */ - forChild(offset2, node) { - if (this == empty) - return this; - if (node.isLeaf) - return _DecorationSet.empty; - let child, local; - for (let i = 0; i < this.children.length; i += 3) - if (this.children[i] >= offset2) { - if (this.children[i] == offset2) - child = this.children[i + 2]; - break; - } - let start2 = offset2 + 1, end2 = start2 + node.content.size; - for (let i = 0; i < this.local.length; i++) { - let dec = this.local[i]; - if (dec.from < end2 && dec.to > start2 && dec.type instanceof InlineType) { - let from2 = Math.max(start2, dec.from) - start2, to = Math.min(end2, dec.to) - start2; - if (from2 < to) - (local || (local = [])).push(dec.copy(from2, to)); - } - } - if (local) { - let localSet = new _DecorationSet(local.sort(byPos), none); - return child ? new DecorationGroup([localSet, child]) : localSet; - } - return child || empty; - } - /** - @internal - */ - eq(other) { - if (this == other) - return true; - if (!(other instanceof _DecorationSet) || this.local.length != other.local.length || this.children.length != other.children.length) - return false; - for (let i = 0; i < this.local.length; i++) - if (!this.local[i].eq(other.local[i])) - return false; - for (let i = 0; i < this.children.length; i += 3) - if (this.children[i] != other.children[i] || this.children[i + 1] != other.children[i + 1] || !this.children[i + 2].eq(other.children[i + 2])) - return false; - return true; - } - /** - @internal - */ - locals(node) { - return removeOverlap(this.localsInner(node)); - } - /** - @internal - */ - localsInner(node) { - if (this == empty) - return none; - if (node.inlineContent || !this.local.some(InlineType.is)) - return this.local; - let result = []; - for (let i = 0; i < this.local.length; i++) { - if (!(this.local[i].type instanceof InlineType)) - result.push(this.local[i]); - } - return result; - } -}; -DecorationSet.empty = new DecorationSet([], []); -DecorationSet.removeOverlap = removeOverlap; -var empty = DecorationSet.empty; -var DecorationGroup = class _DecorationGroup { - constructor(members) { - this.members = members; - } - map(mapping, doc3) { - const mappedDecos = this.members.map((member) => member.map(mapping, doc3, noSpec)); - return _DecorationGroup.from(mappedDecos); - } - forChild(offset2, child) { - if (child.isLeaf) - return DecorationSet.empty; - let found2 = []; - for (let i = 0; i < this.members.length; i++) { - let result = this.members[i].forChild(offset2, child); - if (result == empty) - continue; - if (result instanceof _DecorationGroup) - found2 = found2.concat(result.members); - else - found2.push(result); - } - return _DecorationGroup.from(found2); - } - eq(other) { - if (!(other instanceof _DecorationGroup) || other.members.length != this.members.length) - return false; - for (let i = 0; i < this.members.length; i++) - if (!this.members[i].eq(other.members[i])) - return false; - return true; - } - locals(node) { - let result, sorted = true; - for (let i = 0; i < this.members.length; i++) { - let locals = this.members[i].localsInner(node); - if (!locals.length) - continue; - if (!result) { - result = locals; - } else { - if (sorted) { - result = result.slice(); - sorted = false; - } - for (let j = 0; j < locals.length; j++) - result.push(locals[j]); - } - } - return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none; - } - // Create a group for the given array of decoration sets, or return - // a single set when possible. - static from(members) { - switch (members.length) { - case 0: - return empty; - case 1: - return members[0]; - default: - return new _DecorationGroup(members.every((m) => m instanceof DecorationSet) ? members : members.reduce((r2, m) => r2.concat(m instanceof DecorationSet ? m : m.members), [])); - } - } -}; -function mapChildren(oldChildren, newLocal, mapping, node, offset2, oldOffset, options) { - let children = oldChildren.slice(); - for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) { - let moved = 0; - mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => { - let dSize = newEnd - newStart - (oldEnd - oldStart); - for (let i2 = 0; i2 < children.length; i2 += 3) { - let end2 = children[i2 + 1]; - if (end2 < 0 || oldStart > end2 + baseOffset - moved) - continue; - let start2 = children[i2] + baseOffset - moved; - if (oldEnd >= start2) { - children[i2 + 1] = oldStart <= start2 ? -2 : -1; - } else if (oldStart >= baseOffset && dSize) { - children[i2] += dSize; - children[i2 + 1] += dSize; - } - } - moved += dSize; - }); - baseOffset = mapping.maps[i].map(baseOffset, -1); - } - let mustRebuild = false; - for (let i = 0; i < children.length; i += 3) - if (children[i + 1] < 0) { - if (children[i + 1] == -2) { - mustRebuild = true; - children[i + 1] = -1; - continue; - } - let from2 = mapping.map(oldChildren[i] + oldOffset), fromLocal = from2 - offset2; - if (fromLocal < 0 || fromLocal >= node.content.size) { - mustRebuild = true; - continue; - } - let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset2; - let { index, offset: childOffset } = node.content.findIndex(fromLocal); - let childNode = node.maybeChild(index); - if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) { - let mapped = children[i + 2].mapInner(mapping, childNode, from2 + 1, oldChildren[i] + oldOffset + 1, options); - if (mapped != empty) { - children[i] = fromLocal; - children[i + 1] = toLocal; - children[i + 2] = mapped; - } else { - children[i + 1] = -2; - mustRebuild = true; - } - } else { - mustRebuild = true; - } - } - if (mustRebuild) { - let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset2, oldOffset, options); - let built = buildTree(decorations, node, 0, options); - newLocal = built.local; - for (let i = 0; i < children.length; i += 3) - if (children[i + 1] < 0) { - children.splice(i, 3); - i -= 3; - } - for (let i = 0, j = 0; i < built.children.length; i += 3) { - let from2 = built.children[i]; - while (j < children.length && children[j] < from2) - j += 3; - children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]); - } - } - return new DecorationSet(newLocal.sort(byPos), children); -} -function moveSpans(spans, offset2) { - if (!offset2 || !spans.length) - return spans; - let result = []; - for (let i = 0; i < spans.length; i++) { - let span = spans[i]; - result.push(new Decoration(span.from + offset2, span.to + offset2, span.type)); - } - return result; -} -function mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset2, oldOffset, options) { - function gather(set, oldOffset2) { - for (let i = 0; i < set.local.length; i++) { - let mapped = set.local[i].map(mapping, offset2, oldOffset2); - if (mapped) - decorations.push(mapped); - else if (options.onRemove) - options.onRemove(set.local[i].spec); - } - for (let i = 0; i < set.children.length; i += 3) - gather(set.children[i + 2], set.children[i] + oldOffset2 + 1); - } - for (let i = 0; i < children.length; i += 3) - if (children[i + 1] == -1) - gather(children[i + 2], oldChildren[i] + oldOffset + 1); - return decorations; -} -function takeSpansForNode(spans, node, offset2) { - if (node.isLeaf) - return null; - let end2 = offset2 + node.nodeSize, found2 = null; - for (let i = 0, span; i < spans.length; i++) { - if ((span = spans[i]) && span.from > offset2 && span.to < end2) { - (found2 || (found2 = [])).push(span); - spans[i] = null; - } - } - return found2; -} -function withoutNulls(array) { - let result = []; - for (let i = 0; i < array.length; i++) - if (array[i] != null) - result.push(array[i]); - return result; -} -function buildTree(spans, node, offset2, options) { - let children = [], hasNulls = false; - node.forEach((childNode, localStart) => { - let found2 = takeSpansForNode(spans, childNode, localStart + offset2); - if (found2) { - hasNulls = true; - let subtree = buildTree(found2, childNode, offset2 + localStart + 1, options); - if (subtree != empty) - children.push(localStart, localStart + childNode.nodeSize, subtree); - } - }); - let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset2).sort(byPos); - for (let i = 0; i < locals.length; i++) - if (!locals[i].type.valid(node, locals[i])) { - if (options.onRemove) - options.onRemove(locals[i].spec); - locals.splice(i--, 1); - } - return locals.length || children.length ? new DecorationSet(locals, children) : empty; -} -function byPos(a, b) { - return a.from - b.from || a.to - b.to; -} -function removeOverlap(spans) { - let working = spans; - for (let i = 0; i < working.length - 1; i++) { - let span = working[i]; - if (span.from != span.to) - for (let j = i + 1; j < working.length; j++) { - let next = working[j]; - if (next.from == span.from) { - if (next.to != span.to) { - if (working == spans) - working = spans.slice(); - working[j] = next.copy(next.from, span.to); - insertAhead(working, j + 1, next.copy(span.to, next.to)); - } - continue; - } else { - if (next.from < span.to) { - if (working == spans) - working = spans.slice(); - working[i] = span.copy(span.from, next.from); - insertAhead(working, j, span.copy(next.from, span.to)); - } - break; - } - } - } - return working; -} -function insertAhead(array, i, deco) { - while (i < array.length && byPos(deco, array[i]) > 0) - i++; - array.splice(i, 0, deco); -} -function viewDecorations(view) { - let found2 = []; - view.someProp("decorations", (f) => { - let result = f(view.state); - if (result && result != empty) - found2.push(result); - }); - if (view.cursorWrapper) - found2.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco])); - return DecorationGroup.from(found2); -} -var observeOptions = { - childList: true, - characterData: true, - characterDataOldValue: true, - attributes: true, - attributeOldValue: true, - subtree: true -}; -var useCharData = ie && ie_version <= 11; -var SelectionState = class { - constructor() { - this.anchorNode = null; - this.anchorOffset = 0; - this.focusNode = null; - this.focusOffset = 0; - } - set(sel) { - this.anchorNode = sel.anchorNode; - this.anchorOffset = sel.anchorOffset; - this.focusNode = sel.focusNode; - this.focusOffset = sel.focusOffset; - } - clear() { - this.anchorNode = this.focusNode = null; - } - eq(sel) { - return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset && sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset; - } -}; -var DOMObserver = class { - constructor(view, handleDOMChange) { - this.view = view; - this.handleDOMChange = handleDOMChange; - this.queue = []; - this.flushingSoon = -1; - this.observer = null; - this.currentSelection = new SelectionState(); - this.onCharData = null; - this.suppressingSelectionUpdates = false; - this.observer = window.MutationObserver && new window.MutationObserver((mutations) => { - for (let i = 0; i < mutations.length; i++) - this.queue.push(mutations[i]); - if (ie && ie_version <= 11 && mutations.some((m) => m.type == "childList" && m.removedNodes.length || m.type == "characterData" && m.oldValue.length > m.target.nodeValue.length)) - this.flushSoon(); - else - this.flush(); - }); - if (useCharData) { - this.onCharData = (e) => { - this.queue.push({ target: e.target, type: "characterData", oldValue: e.prevValue }); - this.flushSoon(); - }; - } - this.onSelectionChange = this.onSelectionChange.bind(this); - } - flushSoon() { - if (this.flushingSoon < 0) - this.flushingSoon = window.setTimeout(() => { - this.flushingSoon = -1; - this.flush(); - }, 20); - } - forceFlush() { - if (this.flushingSoon > -1) { - window.clearTimeout(this.flushingSoon); - this.flushingSoon = -1; - this.flush(); - } - } - start() { - if (this.observer) { - this.observer.takeRecords(); - this.observer.observe(this.view.dom, observeOptions); - } - if (this.onCharData) - this.view.dom.addEventListener("DOMCharacterDataModified", this.onCharData); - this.connectSelection(); - } - stop() { - if (this.observer) { - let take = this.observer.takeRecords(); - if (take.length) { - for (let i = 0; i < take.length; i++) - this.queue.push(take[i]); - window.setTimeout(() => this.flush(), 20); - } - this.observer.disconnect(); - } - if (this.onCharData) - this.view.dom.removeEventListener("DOMCharacterDataModified", this.onCharData); - this.disconnectSelection(); - } - connectSelection() { - this.view.dom.ownerDocument.addEventListener("selectionchange", this.onSelectionChange); - } - disconnectSelection() { - this.view.dom.ownerDocument.removeEventListener("selectionchange", this.onSelectionChange); - } - suppressSelectionUpdates() { - this.suppressingSelectionUpdates = true; - setTimeout(() => this.suppressingSelectionUpdates = false, 50); - } - onSelectionChange() { - if (!hasFocusAndSelection(this.view)) - return; - if (this.suppressingSelectionUpdates) - return selectionToDOM(this.view); - if (ie && ie_version <= 11 && !this.view.state.selection.empty) { - let sel = this.view.domSelectionRange(); - if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset)) - return this.flushSoon(); - } - this.flush(); - } - setCurSelection() { - this.currentSelection.set(this.view.domSelectionRange()); - } - ignoreSelectionChange(sel) { - if (!sel.focusNode) - return true; - let ancestors = /* @__PURE__ */ new Set(), container; - for (let scan = sel.focusNode; scan; scan = parentNode(scan)) - ancestors.add(scan); - for (let scan = sel.anchorNode; scan; scan = parentNode(scan)) - if (ancestors.has(scan)) { - container = scan; - break; - } - let desc = container && this.view.docView.nearestDesc(container); - if (desc && desc.ignoreMutation({ - type: "selection", - target: container.nodeType == 3 ? container.parentNode : container - })) { - this.setCurSelection(); - return true; - } - } - pendingRecords() { - if (this.observer) - for (let mut of this.observer.takeRecords()) - this.queue.push(mut); - return this.queue; - } - flush() { - let { view } = this; - if (!view.docView || this.flushingSoon > -1) - return; - let mutations = this.pendingRecords(); - if (mutations.length) - this.queue = []; - let sel = view.domSelectionRange(); - let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel); - let from2 = -1, to = -1, typeOver = false, added = []; - if (view.editable) { - for (let i = 0; i < mutations.length; i++) { - let result = this.registerMutation(mutations[i], added); - if (result) { - from2 = from2 < 0 ? result.from : Math.min(result.from, from2); - to = to < 0 ? result.to : Math.max(result.to, to); - if (result.typeOver) - typeOver = true; - } - } - } - if (gecko && added.length > 1) { - let brs = added.filter((n) => n.nodeName == "BR"); - if (brs.length == 2) { - let a = brs[0], b = brs[1]; - if (a.parentNode && a.parentNode.parentNode == b.parentNode) - b.remove(); - else - a.remove(); - } - } - let readSel = null; - if (from2 < 0 && newSel && view.input.lastFocus > Date.now() - 200 && Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 && selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) && readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) { - view.input.lastFocus = 0; - selectionToDOM(view); - this.currentSelection.set(sel); - view.scrollToSelection(); - } else if (from2 > -1 || newSel) { - if (from2 > -1) { - view.docView.markDirty(from2, to); - checkCSS(view); - } - this.handleDOMChange(from2, to, typeOver, added); - if (view.docView && view.docView.dirty) - view.updateState(view.state); - else if (!this.currentSelection.eq(sel)) - selectionToDOM(view); - this.currentSelection.set(sel); - } - } - registerMutation(mut, added) { - if (added.indexOf(mut.target) > -1) - return null; - let desc = this.view.docView.nearestDesc(mut.target); - if (mut.type == "attributes" && (desc == this.view.docView || mut.attributeName == "contenteditable" || // Firefox sometimes fires spurious events for null/empty styles - mut.attributeName == "style" && !mut.oldValue && !mut.target.getAttribute("style"))) - return null; - if (!desc || desc.ignoreMutation(mut)) - return null; - if (mut.type == "childList") { - for (let i = 0; i < mut.addedNodes.length; i++) - added.push(mut.addedNodes[i]); - if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target)) - return { from: desc.posBefore, to: desc.posAfter }; - let prev = mut.previousSibling, next = mut.nextSibling; - if (ie && ie_version <= 11 && mut.addedNodes.length) { - for (let i = 0; i < mut.addedNodes.length; i++) { - let { previousSibling, nextSibling } = mut.addedNodes[i]; - if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0) - prev = previousSibling; - if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0) - next = nextSibling; - } - } - let fromOffset = prev && prev.parentNode == mut.target ? domIndex(prev) + 1 : 0; - let from2 = desc.localPosFromDOM(mut.target, fromOffset, -1); - let toOffset = next && next.parentNode == mut.target ? domIndex(next) : mut.target.childNodes.length; - let to = desc.localPosFromDOM(mut.target, toOffset, 1); - return { from: from2, to }; - } else if (mut.type == "attributes") { - return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border }; - } else { - return { - from: desc.posAtStart, - to: desc.posAtEnd, - // An event was generated for a text change that didn't change - // any text. Mark the dom change to fall back to assuming the - // selection was typed over with an identical value if it can't - // find another change. - typeOver: mut.target.nodeValue == mut.oldValue - }; - } - } -}; -var cssChecked = /* @__PURE__ */ new WeakMap(); -var cssCheckWarned = false; -function checkCSS(view) { - if (cssChecked.has(view)) - return; - cssChecked.set(view, null); - if (["normal", "nowrap", "pre-line"].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) { - view.requiresGeckoHackNode = gecko; - if (cssCheckWarned) - return; - console["warn"]("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package."); - cssCheckWarned = true; - } -} -function safariShadowSelectionRange(view) { - let found2; - function read2(event) { - event.preventDefault(); - event.stopImmediatePropagation(); - found2 = event.getTargetRanges()[0]; - } - view.dom.addEventListener("beforeinput", read2, true); - document.execCommand("indent"); - view.dom.removeEventListener("beforeinput", read2, true); - let anchorNode = found2.startContainer, anchorOffset = found2.startOffset; - let focusNode = found2.endContainer, focusOffset = found2.endOffset; - let currentAnchor = view.domAtPos(view.state.selection.anchor); - if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset)) - [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset]; - return { anchorNode, anchorOffset, focusNode, focusOffset }; -} -function parseBetween(view, from_, to_) { - let { node: parent, fromOffset, toOffset, from: from2, to } = view.docView.parseRange(from_, to_); - let domSel = view.domSelectionRange(); - let find2; - let anchor = domSel.anchorNode; - if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) { - find2 = [{ node: anchor, offset: domSel.anchorOffset }]; - if (!selectionCollapsed(domSel)) - find2.push({ node: domSel.focusNode, offset: domSel.focusOffset }); - } - if (chrome && view.input.lastKeyCode === 8) { - for (let off = toOffset; off > fromOffset; off--) { - let node = parent.childNodes[off - 1], desc = node.pmViewDesc; - if (node.nodeName == "BR" && !desc) { - toOffset = off; - break; - } - if (!desc || desc.size) - break; - } - } - let startDoc = view.state.doc; - let parser = view.someProp("domParser") || DOMParser.fromSchema(view.state.schema); - let $from = startDoc.resolve(from2); - let sel = null, doc3 = parser.parse(parent, { - topNode: $from.parent, - topMatch: $from.parent.contentMatchAt($from.index()), - topOpen: true, - from: fromOffset, - to: toOffset, - preserveWhitespace: $from.parent.type.whitespace == "pre" ? "full" : true, - findPositions: find2, - ruleFromNode, - context: $from - }); - if (find2 && find2[0].pos != null) { - let anchor2 = find2[0].pos, head = find2[1] && find2[1].pos; - if (head == null) - head = anchor2; - sel = { anchor: anchor2 + from2, head: head + from2 }; - } - return { doc: doc3, sel, from: from2, to }; -} -function ruleFromNode(dom) { - let desc = dom.pmViewDesc; - if (desc) { - return desc.parseRule(); - } else if (dom.nodeName == "BR" && dom.parentNode) { - if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) { - let skip = document.createElement("div"); - skip.appendChild(document.createElement("li")); - return { skip }; - } else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) { - return { ignore: true }; - } - } else if (dom.nodeName == "IMG" && dom.getAttribute("mark-placeholder")) { - return { ignore: true }; - } - return null; -} -var isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i; -function readDOMChange(view, from2, to, typeOver, addedNodes) { - let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0); - view.input.compositionPendingChanges = 0; - if (from2 < 0) { - let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null; - let newSel = selectionFromDOM(view, origin); - if (newSel && !view.state.selection.eq(newSel)) { - if (chrome && android && view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime && view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter")))) - return; - let tr3 = view.state.tr.setSelection(newSel); - if (origin == "pointer") - tr3.setMeta("pointer", true); - else if (origin == "key") - tr3.scrollIntoView(); - if (compositionID) - tr3.setMeta("composition", compositionID); - view.dispatch(tr3); - } - return; - } - let $before = view.state.doc.resolve(from2); - let shared = $before.sharedDepth(to); - from2 = $before.before(shared + 1); - to = view.state.doc.resolve(to).after(shared + 1); - let sel = view.state.selection; - let parse = parseBetween(view, from2, to); - let doc3 = view.state.doc, compare = doc3.slice(parse.from, parse.to); - let preferredPos, preferredSide; - if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) { - preferredPos = view.state.selection.to; - preferredSide = "end"; - } else { - preferredPos = view.state.selection.from; - preferredSide = "start"; - } - view.input.lastKeyCode = null; - let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide); - if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) && addedNodes.some((n) => n.nodeType == 1 && !isInline.test(n.nodeName)) && (!change || change.endA >= change.endB) && view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter")))) { - view.input.lastIOSEnter = 0; - return; - } - if (!change) { - if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) && !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) { - change = { start: sel.from, endA: sel.to, endB: sel.to }; - } else { - if (parse.sel) { - let sel2 = resolveSelection(view, view.state.doc, parse.sel); - if (sel2 && !sel2.eq(view.state.selection)) { - let tr3 = view.state.tr.setSelection(sel2); - if (compositionID) - tr3.setMeta("composition", compositionID); - view.dispatch(tr3); - } - } - return; - } - } - if (chrome && view.cursorWrapper && parse.sel && parse.sel.anchor == view.cursorWrapper.deco.from && parse.sel.head == parse.sel.anchor) { - let size = change.endB - change.start; - parse.sel = { anchor: parse.sel.anchor + size, head: parse.sel.anchor + size }; - } - view.input.domChangeCount++; - if (view.state.selection.from < view.state.selection.to && change.start == change.endB && view.state.selection instanceof TextSelection) { - if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 && view.state.selection.from >= parse.from) { - change.start = view.state.selection.from; - } else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 && view.state.selection.to <= parse.to) { - change.endB += view.state.selection.to - change.endA; - change.endA = view.state.selection.to; - } - } - if (ie && ie_version <= 11 && change.endB == change.start + 1 && change.endA == change.start && change.start > parse.from && parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == " \xA0") { - change.start--; - change.endA--; - change.endB--; - } - let $from = parse.doc.resolveNoCache(change.start - parse.from); - let $to = parse.doc.resolveNoCache(change.endB - parse.from); - let $fromA = doc3.resolve(change.start); - let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA; - let nextSel; - if ((ios && view.input.lastIOSEnter > Date.now() - 225 && (!inlineChange || addedNodes.some((n) => n.nodeName == "DIV" || n.nodeName == "P")) || !inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) && (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", (f) => f(view, keyEvent(13, "Enter")))) { - view.input.lastIOSEnter = 0; - return; - } - if (view.state.selection.anchor > change.start && looksLikeJoin(doc3, change.start, change.endA, $from, $to) && view.someProp("handleKeyDown", (f) => f(view, keyEvent(8, "Backspace")))) { - if (android && chrome) - view.domObserver.suppressSelectionUpdates(); - return; - } - if (chrome && android && change.endB == change.start) - view.input.lastAndroidDelete = Date.now(); - if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth && parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) { - change.endB -= 2; - $to = parse.doc.resolveNoCache(change.endB - parse.from); - setTimeout(() => { - view.someProp("handleKeyDown", function(f) { - return f(view, keyEvent(13, "Enter")); - }); - }, 20); - } - let chFrom = change.start, chTo = change.endA; - let tr2, storedMarks, markChange; - if (inlineChange) { - if ($from.pos == $to.pos) { - if (ie && ie_version <= 11 && $from.parentOffset == 0) { - view.domObserver.suppressSelectionUpdates(); - setTimeout(() => selectionToDOM(view), 20); - } - tr2 = view.state.tr.delete(chFrom, chTo); - storedMarks = doc3.resolve(change.start).marksAcross(doc3.resolve(change.endA)); - } else if ( - // Adding or removing a mark - change.endA == change.endB && (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start()))) - ) { - tr2 = view.state.tr; - if (markChange.type == "add") - tr2.addMark(chFrom, chTo, markChange.mark); - else - tr2.removeMark(chFrom, chTo, markChange.mark); - } else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) { - let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset); - if (view.someProp("handleTextInput", (f) => f(view, chFrom, chTo, text))) - return; - tr2 = view.state.tr.insertText(text, chFrom, chTo); - } - } - if (!tr2) - tr2 = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from)); - if (parse.sel) { - let sel2 = resolveSelection(view, tr2.doc, parse.sel); - if (sel2 && !(chrome && android && view.composing && sel2.empty && (change.start != change.endB || view.input.lastAndroidDelete < Date.now() - 100) && (sel2.head == chFrom || sel2.head == tr2.mapping.map(chTo) - 1) || ie && sel2.empty && sel2.head == chFrom)) - tr2.setSelection(sel2); - } - if (storedMarks) - tr2.ensureMarks(storedMarks); - if (compositionID) - tr2.setMeta("composition", compositionID); - view.dispatch(tr2.scrollIntoView()); -} -function resolveSelection(view, doc3, parsedSel) { - if (Math.max(parsedSel.anchor, parsedSel.head) > doc3.content.size) - return null; - return selectionBetween(view, doc3.resolve(parsedSel.anchor), doc3.resolve(parsedSel.head)); -} -function isMarkChange(cur, prev) { - let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks; - let added = curMarks, removed = prevMarks, type, mark, update; - for (let i = 0; i < prevMarks.length; i++) - added = prevMarks[i].removeFromSet(added); - for (let i = 0; i < curMarks.length; i++) - removed = curMarks[i].removeFromSet(removed); - if (added.length == 1 && removed.length == 0) { - mark = added[0]; - type = "add"; - update = (node) => node.mark(mark.addToSet(node.marks)); - } else if (added.length == 0 && removed.length == 1) { - mark = removed[0]; - type = "remove"; - update = (node) => node.mark(mark.removeFromSet(node.marks)); - } else { - return null; - } - let updated = []; - for (let i = 0; i < prev.childCount; i++) - updated.push(update(prev.child(i))); - if (Fragment.from(updated).eq(cur)) - return { mark, type }; -} -function looksLikeJoin(old, start2, end2, $newStart, $newEnd) { - if (!$newStart.parent.isTextblock || // The content must have shrunk - end2 - start2 <= $newEnd.pos - $newStart.pos || // newEnd must point directly at or after the end of the block that newStart points into - skipClosingAndOpening($newStart, true, false) < $newEnd.pos) - return false; - let $start = old.resolve(start2); - if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock) - return false; - let $next = old.resolve(skipClosingAndOpening($start, true, true)); - if (!$next.parent.isTextblock || $next.pos > end2 || skipClosingAndOpening($next, true, false) < end2) - return false; - return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content); -} -function skipClosingAndOpening($pos, fromEnd, mayOpen) { - let depth = $pos.depth, end2 = fromEnd ? $pos.end() : $pos.pos; - while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) { - depth--; - end2++; - fromEnd = false; - } - if (mayOpen) { - let next = $pos.node(depth).maybeChild($pos.indexAfter(depth)); - while (next && !next.isLeaf) { - next = next.firstChild; - end2++; - } - } - return end2; -} -function findDiff(a, b, pos, preferredPos, preferredSide) { - let start2 = a.findDiffStart(b, pos); - if (start2 == null) - return null; - let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size); - if (preferredSide == "end") { - let adjust = Math.max(0, start2 - Math.min(endA, endB)); - preferredPos -= endA + adjust - start2; - } - if (endA < start2 && a.size < b.size) { - let move = preferredPos <= start2 && preferredPos >= endA ? start2 - preferredPos : 0; - start2 -= move; - if (start2 && start2 < b.size && isSurrogatePair(b.textBetween(start2 - 1, start2 + 1))) - start2 += move ? 1 : -1; - endB = start2 + (endB - endA); - endA = start2; - } else if (endB < start2) { - let move = preferredPos <= start2 && preferredPos >= endB ? start2 - preferredPos : 0; - start2 -= move; - if (start2 && start2 < a.size && isSurrogatePair(a.textBetween(start2 - 1, start2 + 1))) - start2 += move ? 1 : -1; - endA = start2 + (endA - endB); - endB = start2; - } - return { start: start2, endA, endB }; -} -function isSurrogatePair(str) { - if (str.length != 2) - return false; - let a = str.charCodeAt(0), b = str.charCodeAt(1); - return a >= 56320 && a <= 57343 && b >= 55296 && b <= 56319; -} -var EditorView = class { - /** - Create a view. `place` may be a DOM node that the editor should - be appended to, a function that will place it into the document, - or an object whose `mount` property holds the node to use as the - document container. If it is `null`, the editor will not be - added to the document. - */ - constructor(place, props) { - this._root = null; - this.focused = false; - this.trackWrites = null; - this.mounted = false; - this.markCursor = null; - this.cursorWrapper = null; - this.lastSelectedViewDesc = void 0; - this.input = new InputState(); - this.prevDirectPlugins = []; - this.pluginViews = []; - this.requiresGeckoHackNode = false; - this.dragging = null; - this._props = props; - this.state = props.state; - this.directPlugins = props.plugins || []; - this.directPlugins.forEach(checkStateComponent); - this.dispatch = this.dispatch.bind(this); - this.dom = place && place.mount || document.createElement("div"); - if (place) { - if (place.appendChild) - place.appendChild(this.dom); - else if (typeof place == "function") - place(this.dom); - else if (place.mount) - this.mounted = true; - } - this.editable = getEditable(this); - updateCursorWrapper(this); - this.nodeViews = buildNodeViews(this); - this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this); - this.domObserver = new DOMObserver(this, (from2, to, typeOver, added) => readDOMChange(this, from2, to, typeOver, added)); - this.domObserver.start(); - initInput(this); - this.updatePluginViews(); - } - /** - Holds `true` when a - [composition](https://w3c.github.io/uievents/#events-compositionevents) - is active. - */ - get composing() { - return this.input.composing; - } - /** - The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps). - */ - get props() { - if (this._props.state != this.state) { - let prev = this._props; - this._props = {}; - for (let name in prev) - this._props[name] = prev[name]; - this._props.state = this.state; - } - return this._props; - } - /** - Update the view's props. Will immediately cause an update to - the DOM. - */ - update(props) { - if (props.handleDOMEvents != this._props.handleDOMEvents) - ensureListeners(this); - let prevProps = this._props; - this._props = props; - if (props.plugins) { - props.plugins.forEach(checkStateComponent); - this.directPlugins = props.plugins; - } - this.updateStateInner(props.state, prevProps); - } - /** - Update the view by updating existing props object with the object - given as argument. Equivalent to `view.update(Object.assign({}, - view.props, props))`. - */ - setProps(props) { - let updated = {}; - for (let name in this._props) - updated[name] = this._props[name]; - updated.state = this.state; - for (let name in props) - updated[name] = props[name]; - this.update(updated); - } - /** - Update the editor's `state` prop, without touching any of the - other props. - */ - updateState(state) { - this.updateStateInner(state, this._props); - } - updateStateInner(state, prevProps) { - var _a; - let prev = this.state, redraw = false, updateSel = false; - if (state.storedMarks && this.composing) { - clearComposition(this); - updateSel = true; - } - this.state = state; - let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins; - if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) { - let nodeViews = buildNodeViews(this); - if (changedNodeViews(nodeViews, this.nodeViews)) { - this.nodeViews = nodeViews; - redraw = true; - } - } - if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) { - ensureListeners(this); - } - this.editable = getEditable(this); - updateCursorWrapper(this); - let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this); - let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? "reset" : state.scrollToSelection > prev.scrollToSelection ? "to selection" : "preserve"; - let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco); - if (updateDoc || !state.selection.eq(prev.selection)) - updateSel = true; - let oldScrollPos = scroll == "preserve" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this); - if (updateSel) { - this.domObserver.stop(); - let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing && !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection); - if (updateDoc) { - let chromeKludge = chrome ? this.trackWrites = this.domSelectionRange().focusNode : null; - if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) { - this.docView.updateOuterDeco([]); - this.docView.destroy(); - this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this); - } - if (chromeKludge && !this.trackWrites) - forceSelUpdate = true; - } - if (forceSelUpdate || !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) && anchorInRightPlace(this))) { - selectionToDOM(this, forceSelUpdate); - } else { - syncNodeSelection(this, state.selection); - this.domObserver.setCurSelection(); - } - this.domObserver.start(); - } - this.updatePluginViews(prev); - if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc)) - this.updateDraggedNode(this.dragging, prev); - if (scroll == "reset") { - this.dom.scrollTop = 0; - } else if (scroll == "to selection") { - this.scrollToSelection(); - } else if (oldScrollPos) { - resetScrollPos(oldScrollPos); - } - } - /** - @internal - */ - scrollToSelection() { - let startDOM = this.domSelectionRange().focusNode; - if (this.someProp("handleScrollToSelection", (f) => f(this))) - ; - else if (this.state.selection instanceof NodeSelection) { - let target = this.docView.domAfterPos(this.state.selection.from); - if (target.nodeType == 1) - scrollRectIntoView(this, target.getBoundingClientRect(), startDOM); - } else { - scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM); - } - } - destroyPluginViews() { - let view; - while (view = this.pluginViews.pop()) - if (view.destroy) - view.destroy(); - } - updatePluginViews(prevState) { - if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) { - this.prevDirectPlugins = this.directPlugins; - this.destroyPluginViews(); - for (let i = 0; i < this.directPlugins.length; i++) { - let plugin = this.directPlugins[i]; - if (plugin.spec.view) - this.pluginViews.push(plugin.spec.view(this)); - } - for (let i = 0; i < this.state.plugins.length; i++) { - let plugin = this.state.plugins[i]; - if (plugin.spec.view) - this.pluginViews.push(plugin.spec.view(this)); - } - } else { - for (let i = 0; i < this.pluginViews.length; i++) { - let pluginView = this.pluginViews[i]; - if (pluginView.update) - pluginView.update(this, prevState); - } - } - } - updateDraggedNode(dragging, prev) { - let sel = dragging.node, found2 = -1; - if (this.state.doc.nodeAt(sel.from) == sel.node) { - found2 = sel.from; - } else { - let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size); - let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos); - if (moved == sel.node) - found2 = movedPos; - } - this.dragging = new Dragging(dragging.slice, dragging.move, found2 < 0 ? void 0 : NodeSelection.create(this.state.doc, found2)); - } - someProp(propName, f) { - let prop = this._props && this._props[propName], value; - if (prop != null && (value = f ? f(prop) : prop)) - return value; - for (let i = 0; i < this.directPlugins.length; i++) { - let prop2 = this.directPlugins[i].props[propName]; - if (prop2 != null && (value = f ? f(prop2) : prop2)) - return value; - } - let plugins = this.state.plugins; - if (plugins) - for (let i = 0; i < plugins.length; i++) { - let prop2 = plugins[i].props[propName]; - if (prop2 != null && (value = f ? f(prop2) : prop2)) - return value; - } - } - /** - Query whether the view has focus. - */ - hasFocus() { - if (ie) { - let node = this.root.activeElement; - if (node == this.dom) - return true; - if (!node || !this.dom.contains(node)) - return false; - while (node && this.dom != node && this.dom.contains(node)) { - if (node.contentEditable == "false") - return false; - node = node.parentElement; - } - return true; - } - return this.root.activeElement == this.dom; - } - /** - Focus the editor. - */ - focus() { - this.domObserver.stop(); - if (this.editable) - focusPreventScroll(this.dom); - selectionToDOM(this); - this.domObserver.start(); - } - /** - Get the document root in which the editor exists. This will - usually be the top-level `document`, but might be a [shadow - DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM) - root if the editor is inside one. - */ - get root() { - let cached = this._root; - if (cached == null) - for (let search = this.dom.parentNode; search; search = search.parentNode) { - if (search.nodeType == 9 || search.nodeType == 11 && search.host) { - if (!search.getSelection) - Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection(); - return this._root = search; - } - } - return cached || document; - } - /** - When an existing editor view is moved to a new document or - shadow tree, call this to make it recompute its root. - */ - updateRoot() { - this._root = null; - } - /** - Given a pair of viewport coordinates, return the document - position that corresponds to them. May return null if the given - coordinates aren't inside of the editor. When an object is - returned, its `pos` property is the position nearest to the - coordinates, and its `inside` property holds the position of the - inner node that the position falls inside of, or -1 if it is at - the top level, not in any node. - */ - posAtCoords(coords) { - return posAtCoords(this, coords); - } - /** - Returns the viewport rectangle at a given document position. - `left` and `right` will be the same number, as this returns a - flat cursor-ish rectangle. If the position is between two things - that aren't directly adjacent, `side` determines which element - is used. When < 0, the element before the position is used, - otherwise the element after. - */ - coordsAtPos(pos, side = 1) { - return coordsAtPos(this, pos, side); - } - /** - Find the DOM position that corresponds to the given document - position. When `side` is negative, find the position as close as - possible to the content before the position. When positive, - prefer positions close to the content after the position. When - zero, prefer as shallow a position as possible. - - Note that you should **not** mutate the editor's internal DOM, - only inspect it (and even that is usually not necessary). - */ - domAtPos(pos, side = 0) { - return this.docView.domFromPos(pos, side); - } - /** - Find the DOM node that represents the document node after the - given position. May return `null` when the position doesn't point - in front of a node or if the node is inside an opaque node view. - - This is intended to be able to call things like - `getBoundingClientRect` on that DOM node. Do **not** mutate the - editor DOM directly, or add styling this way, since that will be - immediately overriden by the editor as it redraws the node. - */ - nodeDOM(pos) { - let desc = this.docView.descAt(pos); - return desc ? desc.nodeDOM : null; - } - /** - Find the document position that corresponds to a given DOM - position. (Whenever possible, it is preferable to inspect the - document structure directly, rather than poking around in the - DOM, but sometimes—for example when interpreting an event - target—you don't have a choice.) - - The `bias` parameter can be used to influence which side of a DOM - node to use when the position is inside a leaf node. - */ - posAtDOM(node, offset2, bias = -1) { - let pos = this.docView.posFromDOM(node, offset2, bias); - if (pos == null) - throw new RangeError("DOM position not inside the editor"); - return pos; - } - /** - Find out whether the selection is at the end of a textblock when - moving in a given direction. When, for example, given `"left"`, - it will return true if moving left from the current cursor - position would leave that position's parent textblock. Will apply - to the view's current state by default, but it is possible to - pass a different state. - */ - endOfTextblock(dir, state) { - return endOfTextblock(this, state || this.state, dir); - } - /** - Run the editor's paste logic with the given HTML string. The - `event`, if given, will be passed to the - [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook. - */ - pasteHTML(html, event) { - return doPaste(this, "", html, false, event || new ClipboardEvent("paste")); - } - /** - Run the editor's paste logic with the given plain-text input. - */ - pasteText(text, event) { - return doPaste(this, text, null, true, event || new ClipboardEvent("paste")); - } - /** - Removes the editor from the DOM and destroys all [node - views](https://prosemirror.net/docs/ref/#view.NodeView). - */ - destroy() { - if (!this.docView) - return; - destroyInput(this); - this.destroyPluginViews(); - if (this.mounted) { - this.docView.update(this.state.doc, [], viewDecorations(this), this); - this.dom.textContent = ""; - } else if (this.dom.parentNode) { - this.dom.parentNode.removeChild(this.dom); - } - this.docView.destroy(); - this.docView = null; - } - /** - This is true when the view has been - [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be - used anymore). - */ - get isDestroyed() { - return this.docView == null; - } - /** - Used for testing. - */ - dispatchEvent(event) { - return dispatchEvent(this, event); - } - /** - Dispatch a transaction. Will call - [`dispatchTransaction`](https://prosemirror.net/docs/ref/#view.DirectEditorProps.dispatchTransaction) - when given, and otherwise defaults to applying the transaction to - the current state and calling - [`updateState`](https://prosemirror.net/docs/ref/#view.EditorView.updateState) with the result. - This method is bound to the view instance, so that it can be - easily passed around. - */ - dispatch(tr2) { - let dispatchTransaction = this._props.dispatchTransaction; - if (dispatchTransaction) - dispatchTransaction.call(this, tr2); - else - this.updateState(this.state.apply(tr2)); - } - /** - @internal - */ - domSelectionRange() { - return safari && this.root.nodeType === 11 && deepActiveElement(this.dom.ownerDocument) == this.dom ? safariShadowSelectionRange(this) : this.domSelection(); - } - /** - @internal - */ - domSelection() { - return this.root.getSelection(); - } -}; -function computeDocDeco(view) { - let attrs = /* @__PURE__ */ Object.create(null); - attrs.class = "ProseMirror"; - attrs.contenteditable = String(view.editable); - view.someProp("attributes", (value) => { - if (typeof value == "function") - value = value(view.state); - if (value) - for (let attr in value) { - if (attr == "class") - attrs.class += " " + value[attr]; - else if (attr == "style") - attrs.style = (attrs.style ? attrs.style + ";" : "") + value[attr]; - else if (!attrs[attr] && attr != "contenteditable" && attr != "nodeName") - attrs[attr] = String(value[attr]); - } - }); - if (!attrs.translate) - attrs.translate = "no"; - return [Decoration.node(0, view.state.doc.content.size, attrs)]; -} -function updateCursorWrapper(view) { - if (view.markCursor) { - let dom = document.createElement("img"); - dom.className = "ProseMirror-separator"; - dom.setAttribute("mark-placeholder", "true"); - dom.setAttribute("alt", ""); - view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.head, dom, { raw: true, marks: view.markCursor }) }; - } else { - view.cursorWrapper = null; - } -} -function getEditable(view) { - return !view.someProp("editable", (value) => value(view.state) === false); -} -function selectionContextChanged(sel1, sel2) { - let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head)); - return sel1.$anchor.start(depth) != sel2.$anchor.start(depth); -} -function buildNodeViews(view) { - let result = /* @__PURE__ */ Object.create(null); - function add(obj) { - for (let prop in obj) - if (!Object.prototype.hasOwnProperty.call(result, prop)) - result[prop] = obj[prop]; - } - view.someProp("nodeViews", add); - view.someProp("markViews", add); - return result; -} -function changedNodeViews(a, b) { - let nA = 0, nB = 0; - for (let prop in a) { - if (a[prop] != b[prop]) - return true; - nA++; - } - for (let _ in b) - nB++; - return nA != nB; -} -function checkStateComponent(plugin) { - if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction) - throw new RangeError("Plugins passed directly to the view must not have a state component"); -} - -// node_modules/w3c-keyname/index.js -var base = { - 8: "Backspace", - 9: "Tab", - 10: "Enter", - 12: "NumLock", - 13: "Enter", - 16: "Shift", - 17: "Control", - 18: "Alt", - 20: "CapsLock", - 27: "Escape", - 32: " ", - 33: "PageUp", - 34: "PageDown", - 35: "End", - 36: "Home", - 37: "ArrowLeft", - 38: "ArrowUp", - 39: "ArrowRight", - 40: "ArrowDown", - 44: "PrintScreen", - 45: "Insert", - 46: "Delete", - 59: ";", - 61: "=", - 91: "Meta", - 92: "Meta", - 106: "*", - 107: "+", - 108: ",", - 109: "-", - 110: ".", - 111: "/", - 144: "NumLock", - 145: "ScrollLock", - 160: "Shift", - 161: "Shift", - 162: "Control", - 163: "Control", - 164: "Alt", - 165: "Alt", - 173: "-", - 186: ";", - 187: "=", - 188: ",", - 189: "-", - 190: ".", - 191: "/", - 192: "`", - 219: "[", - 220: "\\", - 221: "]", - 222: "'" -}; -var shift = { - 48: ")", - 49: "!", - 50: "@", - 51: "#", - 52: "$", - 53: "%", - 54: "^", - 55: "&", - 56: "*", - 57: "(", - 59: ":", - 61: "+", - 173: "_", - 186: ":", - 187: "+", - 188: "<", - 189: "_", - 190: ">", - 191: "?", - 192: "~", - 219: "{", - 220: "|", - 221: "}", - 222: '"' -}; -var mac2 = typeof navigator != "undefined" && /Mac/.test(navigator.platform); -var ie2 = typeof navigator != "undefined" && /MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent); -for (i = 0; i < 10; i++) - base[48 + i] = base[96 + i] = String(i); -var i; -for (i = 1; i <= 24; i++) - base[i + 111] = "F" + i; -var i; -for (i = 65; i <= 90; i++) { - base[i] = String.fromCharCode(i + 32); - shift[i] = String.fromCharCode(i); -} -var i; -for (code in base) - if (!shift.hasOwnProperty(code)) - shift[code] = base[code]; -var code; -function keyName(event) { - var ignoreKey = mac2 && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey || ie2 && event.shiftKey && event.key && event.key.length == 1 || event.key == "Unidentified"; - var name = !ignoreKey && event.key || (event.shiftKey ? shift : base)[event.keyCode] || event.key || "Unidentified"; - if (name == "Esc") - name = "Escape"; - if (name == "Del") - name = "Delete"; - if (name == "Left") - name = "ArrowLeft"; - if (name == "Up") - name = "ArrowUp"; - if (name == "Right") - name = "ArrowRight"; - if (name == "Down") - name = "ArrowDown"; - return name; -} - -// node_modules/prosemirror-keymap/dist/index.js -var mac3 = typeof navigator != "undefined" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : false; -function normalizeKeyName(name) { - let parts = name.split(/-(?!$)/), result = parts[parts.length - 1]; - if (result == "Space") - result = " "; - let alt, ctrl, shift2, meta; - for (let i = 0; i < parts.length - 1; i++) { - let mod = parts[i]; - if (/^(cmd|meta|m)$/i.test(mod)) - meta = true; - else if (/^a(lt)?$/i.test(mod)) - alt = true; - else if (/^(c|ctrl|control)$/i.test(mod)) - ctrl = true; - else if (/^s(hift)?$/i.test(mod)) - shift2 = true; - else if (/^mod$/i.test(mod)) { - if (mac3) - meta = true; - else - ctrl = true; - } else - throw new Error("Unrecognized modifier name: " + mod); - } - if (alt) - result = "Alt-" + result; - if (ctrl) - result = "Ctrl-" + result; - if (meta) - result = "Meta-" + result; - if (shift2) - result = "Shift-" + result; - return result; -} -function normalize(map2) { - let copy2 = /* @__PURE__ */ Object.create(null); - for (let prop in map2) - copy2[normalizeKeyName(prop)] = map2[prop]; - return copy2; -} -function modifiers(name, event, shift2 = true) { - if (event.altKey) - name = "Alt-" + name; - if (event.ctrlKey) - name = "Ctrl-" + name; - if (event.metaKey) - name = "Meta-" + name; - if (shift2 && event.shiftKey) - name = "Shift-" + name; - return name; -} -function keymap(bindings) { - return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } }); -} -function keydownHandler(bindings) { - let map2 = normalize(bindings); - return function(view, event) { - let name = keyName(event), baseName, direct = map2[modifiers(name, event)]; - if (direct && direct(view.state, view.dispatch, view)) - return true; - if (name.length == 1 && name != " ") { - if (event.shiftKey) { - let noShift = map2[modifiers(name, event, false)]; - if (noShift && noShift(view.state, view.dispatch, view)) - return true; - } - if ((event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) && (baseName = base[event.keyCode]) && baseName != name) { - let fromCode = map2[modifiers(baseName, event)]; - if (fromCode && fromCode(view.state, view.dispatch, view)) - return true; - } - } - return false; - }; -} - -// node_modules/prosemirror-commands/dist/index.js -var deleteSelection = (state, dispatch) => { - if (state.selection.empty) - return false; - if (dispatch) - dispatch(state.tr.deleteSelection().scrollIntoView()); - return true; -}; -function atBlockStart(state, view) { - let { $cursor } = state.selection; - if (!$cursor || (view ? !view.endOfTextblock("backward", state) : $cursor.parentOffset > 0)) - return null; - return $cursor; -} -var joinBackward = (state, dispatch, view) => { - let $cursor = atBlockStart(state, view); - if (!$cursor) - return false; - let $cut = findCutBefore($cursor); - if (!$cut) { - let range = $cursor.blockRange(), target = range && liftTarget(range); - if (target == null) - return false; - if (dispatch) - dispatch(state.tr.lift(range, target).scrollIntoView()); - return true; - } - let before = $cut.nodeBefore; - if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch)) - return true; - if ($cursor.parent.content.size == 0 && (textblockAt(before, "end") || NodeSelection.isSelectable(before))) { - let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty); - if (delStep && delStep.slice.size < delStep.to - delStep.from) { - if (dispatch) { - let tr2 = state.tr.step(delStep); - tr2.setSelection(textblockAt(before, "end") ? Selection.findFrom(tr2.doc.resolve(tr2.mapping.map($cut.pos, -1)), -1) : NodeSelection.create(tr2.doc, $cut.pos - before.nodeSize)); - dispatch(tr2.scrollIntoView()); - } - return true; - } - } - if (before.isAtom && $cut.depth == $cursor.depth - 1) { - if (dispatch) - dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView()); - return true; - } - return false; -}; -function textblockAt(node, side, only = false) { - for (let scan = node; scan; scan = side == "start" ? scan.firstChild : scan.lastChild) { - if (scan.isTextblock) - return true; - if (only && scan.childCount != 1) - return false; - } - return false; -} -var selectNodeBackward = (state, dispatch, view) => { - let { $head, empty: empty2 } = state.selection, $cut = $head; - if (!empty2) - return false; - if ($head.parent.isTextblock) { - if (view ? !view.endOfTextblock("backward", state) : $head.parentOffset > 0) - return false; - $cut = findCutBefore($head); - } - let node = $cut && $cut.nodeBefore; - if (!node || !NodeSelection.isSelectable(node)) - return false; - if (dispatch) - dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView()); - return true; -}; -function findCutBefore($pos) { - if (!$pos.parent.type.spec.isolating) - for (let i = $pos.depth - 1; i >= 0; i--) { - if ($pos.index(i) > 0) - return $pos.doc.resolve($pos.before(i + 1)); - if ($pos.node(i).type.spec.isolating) - break; - } - return null; -} -function atBlockEnd(state, view) { - let { $cursor } = state.selection; - if (!$cursor || (view ? !view.endOfTextblock("forward", state) : $cursor.parentOffset < $cursor.parent.content.size)) - return null; - return $cursor; -} -var joinForward = (state, dispatch, view) => { - let $cursor = atBlockEnd(state, view); - if (!$cursor) - return false; - let $cut = findCutAfter($cursor); - if (!$cut) - return false; - let after = $cut.nodeAfter; - if (deleteBarrier(state, $cut, dispatch)) - return true; - if ($cursor.parent.content.size == 0 && (textblockAt(after, "start") || NodeSelection.isSelectable(after))) { - let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty); - if (delStep && delStep.slice.size < delStep.to - delStep.from) { - if (dispatch) { - let tr2 = state.tr.step(delStep); - tr2.setSelection(textblockAt(after, "start") ? Selection.findFrom(tr2.doc.resolve(tr2.mapping.map($cut.pos)), 1) : NodeSelection.create(tr2.doc, tr2.mapping.map($cut.pos))); - dispatch(tr2.scrollIntoView()); - } - return true; - } - } - if (after.isAtom && $cut.depth == $cursor.depth - 1) { - if (dispatch) - dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView()); - return true; - } - return false; -}; -var selectNodeForward = (state, dispatch, view) => { - let { $head, empty: empty2 } = state.selection, $cut = $head; - if (!empty2) - return false; - if ($head.parent.isTextblock) { - if (view ? !view.endOfTextblock("forward", state) : $head.parentOffset < $head.parent.content.size) - return false; - $cut = findCutAfter($head); - } - let node = $cut && $cut.nodeAfter; - if (!node || !NodeSelection.isSelectable(node)) - return false; - if (dispatch) - dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView()); - return true; -}; -function findCutAfter($pos) { - if (!$pos.parent.type.spec.isolating) - for (let i = $pos.depth - 1; i >= 0; i--) { - let parent = $pos.node(i); - if ($pos.index(i) + 1 < parent.childCount) - return $pos.doc.resolve($pos.after(i + 1)); - if (parent.type.spec.isolating) - break; - } - return null; -} -var joinUp = (state, dispatch) => { - let sel = state.selection, nodeSel = sel instanceof NodeSelection, point; - if (nodeSel) { - if (sel.node.isTextblock || !canJoin(state.doc, sel.from)) - return false; - point = sel.from; - } else { - point = joinPoint(state.doc, sel.from, -1); - if (point == null) - return false; - } - if (dispatch) { - let tr2 = state.tr.join(point); - if (nodeSel) - tr2.setSelection(NodeSelection.create(tr2.doc, point - state.doc.resolve(point).nodeBefore.nodeSize)); - dispatch(tr2.scrollIntoView()); - } - return true; -}; -var joinDown = (state, dispatch) => { - let sel = state.selection, point; - if (sel instanceof NodeSelection) { - if (sel.node.isTextblock || !canJoin(state.doc, sel.to)) - return false; - point = sel.to; - } else { - point = joinPoint(state.doc, sel.to, 1); - if (point == null) - return false; - } - if (dispatch) - dispatch(state.tr.join(point).scrollIntoView()); - return true; -}; -var lift2 = (state, dispatch) => { - let { $from, $to } = state.selection; - let range = $from.blockRange($to), target = range && liftTarget(range); - if (target == null) - return false; - if (dispatch) - dispatch(state.tr.lift(range, target).scrollIntoView()); - return true; -}; -var newlineInCode = (state, dispatch) => { - let { $head, $anchor } = state.selection; - if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) - return false; - if (dispatch) - dispatch(state.tr.insertText("\n").scrollIntoView()); - return true; -}; -function defaultBlockAt(match) { - for (let i = 0; i < match.edgeCount; i++) { - let { type } = match.edge(i); - if (type.isTextblock && !type.hasRequiredAttrs()) - return type; - } - return null; -} -var exitCode = (state, dispatch) => { - let { $head, $anchor } = state.selection; - if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) - return false; - let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after)); - if (!type || !above.canReplaceWith(after, after, type)) - return false; - if (dispatch) { - let pos = $head.after(), tr2 = state.tr.replaceWith(pos, pos, type.createAndFill()); - tr2.setSelection(Selection.near(tr2.doc.resolve(pos), 1)); - dispatch(tr2.scrollIntoView()); - } - return true; -}; -var createParagraphNear = (state, dispatch) => { - let sel = state.selection, { $from, $to } = sel; - if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent) - return false; - let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter())); - if (!type || !type.isTextblock) - return false; - if (dispatch) { - let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos; - let tr2 = state.tr.insert(side, type.createAndFill()); - tr2.setSelection(TextSelection.create(tr2.doc, side + 1)); - dispatch(tr2.scrollIntoView()); - } - return true; -}; -var liftEmptyBlock = (state, dispatch) => { - let { $cursor } = state.selection; - if (!$cursor || $cursor.parent.content.size) - return false; - if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) { - let before = $cursor.before(); - if (canSplit(state.doc, before)) { - if (dispatch) - dispatch(state.tr.split(before).scrollIntoView()); - return true; - } - } - let range = $cursor.blockRange(), target = range && liftTarget(range); - if (target == null) - return false; - if (dispatch) - dispatch(state.tr.lift(range, target).scrollIntoView()); - return true; -}; -function splitBlockAs(splitNode) { - return (state, dispatch) => { - let { $from, $to } = state.selection; - if (state.selection instanceof NodeSelection && state.selection.node.isBlock) { - if (!$from.parentOffset || !canSplit(state.doc, $from.pos)) - return false; - if (dispatch) - dispatch(state.tr.split($from.pos).scrollIntoView()); - return true; - } - if (!$from.parent.isBlock) - return false; - if (dispatch) { - let atEnd = $to.parentOffset == $to.parent.content.size; - let tr2 = state.tr; - if (state.selection instanceof TextSelection || state.selection instanceof AllSelection) - tr2.deleteSelection(); - let deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1))); - let splitType = splitNode && splitNode($to.parent, atEnd); - let types = splitType ? [splitType] : atEnd && deflt ? [{ type: deflt }] : void 0; - let can = canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, types); - if (!types && !can && canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : void 0)) { - if (deflt) - types = [{ type: deflt }]; - can = true; - } - if (can) { - tr2.split(tr2.mapping.map($from.pos), 1, types); - if (!atEnd && !$from.parentOffset && $from.parent.type != deflt) { - let first2 = tr2.mapping.map($from.before()), $first = tr2.doc.resolve(first2); - if (deflt && $from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) - tr2.setNodeMarkup(tr2.mapping.map($from.before()), deflt); - } - } - dispatch(tr2.scrollIntoView()); - } - return true; - }; -} -var splitBlock = splitBlockAs(); -var selectParentNode = (state, dispatch) => { - let { $from, to } = state.selection, pos; - let same = $from.sharedDepth(to); - if (same == 0) - return false; - pos = $from.before(same); - if (dispatch) - dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos))); - return true; -}; -var selectAll = (state, dispatch) => { - if (dispatch) - dispatch(state.tr.setSelection(new AllSelection(state.doc))); - return true; -}; -function joinMaybeClear(state, $pos, dispatch) { - let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index(); - if (!before || !after || !before.type.compatibleContent(after.type)) - return false; - if (!before.content.size && $pos.parent.canReplace(index - 1, index)) { - if (dispatch) - dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView()); - return true; - } - if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos))) - return false; - if (dispatch) - dispatch(state.tr.clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount)).join($pos.pos).scrollIntoView()); - return true; -} -function deleteBarrier(state, $cut, dispatch) { - let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match; - if (before.type.spec.isolating || after.type.spec.isolating) - return false; - if (joinMaybeClear(state, $cut, dispatch)) - return true; - let canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1); - if (canDelAfter && (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) && match.matchType(conn[0] || after.type).validEnd) { - if (dispatch) { - let end2 = $cut.pos + after.nodeSize, wrap2 = Fragment.empty; - for (let i = conn.length - 1; i >= 0; i--) - wrap2 = Fragment.from(conn[i].create(null, wrap2)); - wrap2 = Fragment.from(before.copy(wrap2)); - let tr2 = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end2, $cut.pos, end2, new Slice(wrap2, 1, 0), conn.length, true)); - let joinAt = end2 + 2 * conn.length; - if (canJoin(tr2.doc, joinAt)) - tr2.join(joinAt); - dispatch(tr2.scrollIntoView()); - } - return true; - } - let selAfter = Selection.findFrom($cut, 1); - let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range); - if (target != null && target >= $cut.depth) { - if (dispatch) - dispatch(state.tr.lift(range, target).scrollIntoView()); - return true; - } - if (canDelAfter && textblockAt(after, "start", true) && textblockAt(before, "end")) { - let at = before, wrap2 = []; - for (; ; ) { - wrap2.push(at); - if (at.isTextblock) - break; - at = at.lastChild; - } - let afterText = after, afterDepth = 1; - for (; !afterText.isTextblock; afterText = afterText.firstChild) - afterDepth++; - if (at.canReplace(at.childCount, at.childCount, afterText.content)) { - if (dispatch) { - let end2 = Fragment.empty; - for (let i = wrap2.length - 1; i >= 0; i--) - end2 = Fragment.from(wrap2[i].copy(end2)); - let tr2 = state.tr.step(new ReplaceAroundStep($cut.pos - wrap2.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end2, wrap2.length, 0), 0, true)); - dispatch(tr2.scrollIntoView()); - } - return true; - } - } - return false; -} -function selectTextblockSide(side) { - return function(state, dispatch) { - let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to; - let depth = $pos.depth; - while ($pos.node(depth).isInline) { - if (!depth) - return false; - depth--; - } - if (!$pos.node(depth).isTextblock) - return false; - if (dispatch) - dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth)))); - return true; - }; -} -var selectTextblockStart = selectTextblockSide(-1); -var selectTextblockEnd = selectTextblockSide(1); -function wrapIn(nodeType, attrs = null) { - return function(state, dispatch) { - let { $from, $to } = state.selection; - let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs); - if (!wrapping) - return false; - if (dispatch) - dispatch(state.tr.wrap(range, wrapping).scrollIntoView()); - return true; - }; -} -function setBlockType2(nodeType, attrs = null) { - return function(state, dispatch) { - let applicable = false; - for (let i = 0; i < state.selection.ranges.length && !applicable; i++) { - let { $from: { pos: from2 }, $to: { pos: to } } = state.selection.ranges[i]; - state.doc.nodesBetween(from2, to, (node, pos) => { - if (applicable) - return false; - if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) - return; - if (node.type == nodeType) { - applicable = true; - } else { - let $pos = state.doc.resolve(pos), index = $pos.index(); - applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType); - } - }); - } - if (!applicable) - return false; - if (dispatch) { - let tr2 = state.tr; - for (let i = 0; i < state.selection.ranges.length; i++) { - let { $from: { pos: from2 }, $to: { pos: to } } = state.selection.ranges[i]; - tr2.setBlockType(from2, to, nodeType, attrs); - } - dispatch(tr2.scrollIntoView()); - } - return true; - }; -} -function chainCommands(...commands2) { - return function(state, dispatch, view) { - for (let i = 0; i < commands2.length; i++) - if (commands2[i](state, dispatch, view)) - return true; - return false; - }; -} -var backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward); -var del = chainCommands(deleteSelection, joinForward, selectNodeForward); -var pcBaseKeymap = { - "Enter": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock), - "Mod-Enter": exitCode, - "Backspace": backspace, - "Mod-Backspace": backspace, - "Shift-Backspace": backspace, - "Delete": del, - "Mod-Delete": del, - "Mod-a": selectAll -}; -var macBaseKeymap = { - "Ctrl-h": pcBaseKeymap["Backspace"], - "Alt-Backspace": pcBaseKeymap["Mod-Backspace"], - "Ctrl-d": pcBaseKeymap["Delete"], - "Ctrl-Alt-Backspace": pcBaseKeymap["Mod-Delete"], - "Alt-Delete": pcBaseKeymap["Mod-Delete"], - "Alt-d": pcBaseKeymap["Mod-Delete"], - "Ctrl-a": selectTextblockStart, - "Ctrl-e": selectTextblockEnd -}; -for (let key in pcBaseKeymap) - macBaseKeymap[key] = pcBaseKeymap[key]; -var mac4 = typeof navigator != "undefined" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : typeof os != "undefined" && os.platform ? os.platform() == "darwin" : false; - -// node_modules/prosemirror-schema-list/dist/index.js -function wrapInList(listType, attrs = null) { - return function(state, dispatch) { - let { $from, $to } = state.selection; - let range = $from.blockRange($to), doJoin = false, outerRange = range; - if (!range) - return false; - if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) { - if ($from.index(range.depth - 1) == 0) - return false; - let $insert = state.doc.resolve(range.start - 2); - outerRange = new NodeRange($insert, $insert, range.depth); - if (range.endIndex < range.parent.childCount) - range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth); - doJoin = true; - } - let wrap2 = findWrapping(outerRange, listType, attrs, range); - if (!wrap2) - return false; - if (dispatch) - dispatch(doWrapInList(state.tr, range, wrap2, doJoin, listType).scrollIntoView()); - return true; - }; -} -function doWrapInList(tr2, range, wrappers, joinBefore, listType) { - let content = Fragment.empty; - for (let i = wrappers.length - 1; i >= 0; i--) - content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content)); - tr2.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end, new Slice(content, 0, 0), wrappers.length, true)); - let found2 = 0; - for (let i = 0; i < wrappers.length; i++) - if (wrappers[i].type == listType) - found2 = i + 1; - let splitDepth = wrappers.length - found2; - let splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent; - for (let i = range.startIndex, e = range.endIndex, first2 = true; i < e; i++, first2 = false) { - if (!first2 && canSplit(tr2.doc, splitPos, splitDepth)) { - tr2.split(splitPos, splitDepth); - splitPos += 2 * splitDepth; - } - splitPos += parent.child(i).nodeSize; - } - return tr2; -} -function liftListItem(itemType) { - return function(state, dispatch) { - let { $from, $to } = state.selection; - let range = $from.blockRange($to, (node) => node.childCount > 0 && node.firstChild.type == itemType); - if (!range) - return false; - if (!dispatch) - return true; - if ($from.node(range.depth - 1).type == itemType) - return liftToOuterList(state, dispatch, itemType, range); - else - return liftOutOfList(state, dispatch, range); - }; -} -function liftToOuterList(state, dispatch, itemType, range) { - let tr2 = state.tr, end2 = range.end, endOfList = range.$to.end(range.depth); - if (end2 < endOfList) { - tr2.step(new ReplaceAroundStep(end2 - 1, endOfList, end2, endOfList, new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true)); - range = new NodeRange(tr2.doc.resolve(range.$from.pos), tr2.doc.resolve(endOfList), range.depth); - } - const target = liftTarget(range); - if (target == null) - return false; - tr2.lift(range, target); - let after = tr2.mapping.map(end2, -1) - 1; - if (canJoin(tr2.doc, after)) - tr2.join(after); - dispatch(tr2.scrollIntoView()); - return true; -} -function liftOutOfList(state, dispatch, range) { - let tr2 = state.tr, list = range.parent; - for (let pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) { - pos -= list.child(i).nodeSize; - tr2.delete(pos - 1, pos + 1); - } - let $start = tr2.doc.resolve(range.start), item = $start.nodeAfter; - if (tr2.mapping.map(range.end) != range.start + $start.nodeAfter.nodeSize) - return false; - let atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount; - let parent = $start.node(-1), indexBefore = $start.index(-1); - if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1, item.content.append(atEnd ? Fragment.empty : Fragment.from(list)))) - return false; - let start2 = $start.pos, end2 = start2 + item.nodeSize; - tr2.step(new ReplaceAroundStep(start2 - (atStart ? 1 : 0), end2 + (atEnd ? 1 : 0), start2 + 1, end2 - 1, new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))).append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))), atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1)); - dispatch(tr2.scrollIntoView()); - return true; -} -function sinkListItem(itemType) { - return function(state, dispatch) { - let { $from, $to } = state.selection; - let range = $from.blockRange($to, (node) => node.childCount > 0 && node.firstChild.type == itemType); - if (!range) - return false; - let startIndex = range.startIndex; - if (startIndex == 0) - return false; - let parent = range.parent, nodeBefore = parent.child(startIndex - 1); - if (nodeBefore.type != itemType) - return false; - if (dispatch) { - let nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type; - let inner = Fragment.from(nestedBefore ? itemType.create() : null); - let slice2 = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))), nestedBefore ? 3 : 1, 0); - let before = range.start, after = range.end; - dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after, before, after, slice2, 1, true)).scrollIntoView()); - } - return true; - }; -} - -// node_modules/@tiptap/core/dist/index.js -function createChainableState(config) { - const { state, transaction } = config; - let { selection } = transaction; - let { doc: doc3 } = transaction; - let { storedMarks } = transaction; - return { - ...state, - apply: state.apply.bind(state), - applyTransaction: state.applyTransaction.bind(state), - filterTransaction: state.filterTransaction, - plugins: state.plugins, - schema: state.schema, - reconfigure: state.reconfigure.bind(state), - toJSON: state.toJSON.bind(state), - get storedMarks() { - return storedMarks; - }, - get selection() { - return selection; - }, - get doc() { - return doc3; - }, - get tr() { - selection = transaction.selection; - doc3 = transaction.doc; - storedMarks = transaction.storedMarks; - return transaction; - } - }; -} -var CommandManager = class { - constructor(props) { - this.editor = props.editor; - this.rawCommands = this.editor.extensionManager.commands; - this.customState = props.state; - } - get hasCustomState() { - return !!this.customState; - } - get state() { - return this.customState || this.editor.state; - } - get commands() { - const { rawCommands, editor, state } = this; - const { view } = editor; - const { tr: tr2 } = state; - const props = this.buildProps(tr2); - return Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { - const method = (...args) => { - const callback = command2(...args)(props); - if (!tr2.getMeta("preventDispatch") && !this.hasCustomState) { - view.dispatch(tr2); - } - return callback; - }; - return [name, method]; - })); - } - get chain() { - return () => this.createChain(); - } - get can() { - return () => this.createCan(); - } - createChain(startTr, shouldDispatch = true) { - const { rawCommands, editor, state } = this; - const { view } = editor; - const callbacks = []; - const hasStartTransaction = !!startTr; - const tr2 = startTr || state.tr; - const run3 = () => { - if (!hasStartTransaction && shouldDispatch && !tr2.getMeta("preventDispatch") && !this.hasCustomState) { - view.dispatch(tr2); - } - return callbacks.every((callback) => callback === true); - }; - const chain = { - ...Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { - const chainedCommand = (...args) => { - const props = this.buildProps(tr2, shouldDispatch); - const callback = command2(...args)(props); - callbacks.push(callback); - return chain; - }; - return [name, chainedCommand]; - })), - run: run3 - }; - return chain; - } - createCan(startTr) { - const { rawCommands, state } = this; - const dispatch = false; - const tr2 = startTr || state.tr; - const props = this.buildProps(tr2, dispatch); - const formattedCommands = Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { - return [name, (...args) => command2(...args)({ ...props, dispatch: void 0 })]; - })); - return { - ...formattedCommands, - chain: () => this.createChain(tr2, dispatch) - }; - } - buildProps(tr2, shouldDispatch = true) { - const { rawCommands, editor, state } = this; - const { view } = editor; - const props = { - tr: tr2, - editor, - view, - state: createChainableState({ - state, - transaction: tr2 - }), - dispatch: shouldDispatch ? () => void 0 : void 0, - chain: () => this.createChain(tr2, shouldDispatch), - can: () => this.createCan(tr2), - get commands() { - return Object.fromEntries(Object.entries(rawCommands).map(([name, command2]) => { - return [name, (...args) => command2(...args)(props)]; - })); - } - }; - return props; - } -}; -var EventEmitter = class { - constructor() { - this.callbacks = {}; - } - on(event, fn2) { - if (!this.callbacks[event]) { - this.callbacks[event] = []; - } - this.callbacks[event].push(fn2); - return this; - } - emit(event, ...args) { - const callbacks = this.callbacks[event]; - if (callbacks) { - callbacks.forEach((callback) => callback.apply(this, args)); - } - return this; - } - off(event, fn2) { - const callbacks = this.callbacks[event]; - if (callbacks) { - if (fn2) { - this.callbacks[event] = callbacks.filter((callback) => callback !== fn2); - } else { - delete this.callbacks[event]; - } - } - return this; - } - removeAllListeners() { - this.callbacks = {}; - } -}; -function getExtensionField(extension, field, context) { - if (extension.config[field] === void 0 && extension.parent) { - return getExtensionField(extension.parent, field, context); - } - if (typeof extension.config[field] === "function") { - const value = extension.config[field].bind({ - ...context, - parent: extension.parent ? getExtensionField(extension.parent, field, context) : null - }); - return value; - } - return extension.config[field]; -} -function splitExtensions(extensions2) { - const baseExtensions = extensions2.filter((extension) => extension.type === "extension"); - const nodeExtensions = extensions2.filter((extension) => extension.type === "node"); - const markExtensions = extensions2.filter((extension) => extension.type === "mark"); - return { - baseExtensions, - nodeExtensions, - markExtensions - }; -} -function getAttributesFromExtensions(extensions2) { - const extensionAttributes = []; - const { nodeExtensions, markExtensions } = splitExtensions(extensions2); - const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions]; - const defaultAttribute = { - default: null, - rendered: true, - renderHTML: null, - parseHTML: null, - keepOnSplit: true, - isRequired: false - }; - extensions2.forEach((extension) => { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - const addGlobalAttributes = getExtensionField(extension, "addGlobalAttributes", context); - if (!addGlobalAttributes) { - return; - } - const globalAttributes = addGlobalAttributes(); - globalAttributes.forEach((globalAttribute) => { - globalAttribute.types.forEach((type) => { - Object.entries(globalAttribute.attributes).forEach(([name, attribute]) => { - extensionAttributes.push({ - type, - name, - attribute: { - ...defaultAttribute, - ...attribute - } - }); - }); - }); - }); - }); - nodeAndMarkExtensions.forEach((extension) => { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - const addAttributes = getExtensionField(extension, "addAttributes", context); - if (!addAttributes) { - return; - } - const attributes = addAttributes(); - Object.entries(attributes).forEach(([name, attribute]) => { - const mergedAttr = { - ...defaultAttribute, - ...attribute - }; - if (typeof (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === "function") { - mergedAttr.default = mergedAttr.default(); - } - if ((mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.isRequired) && (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === void 0) { - delete mergedAttr.default; - } - extensionAttributes.push({ - type: extension.name, - name, - attribute: mergedAttr - }); - }); - }); - return extensionAttributes; -} -function getNodeType(nameOrType, schema) { - if (typeof nameOrType === "string") { - if (!schema.nodes[nameOrType]) { - throw Error(`There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`); - } - return schema.nodes[nameOrType]; - } - return nameOrType; -} -function mergeAttributes(...objects) { - return objects.filter((item) => !!item).reduce((items, item) => { - const mergedAttributes = { ...items }; - Object.entries(item).forEach(([key, value]) => { - const exists = mergedAttributes[key]; - if (!exists) { - mergedAttributes[key] = value; - return; - } - if (key === "class") { - const valueClasses = value ? value.split(" ") : []; - const existingClasses = mergedAttributes[key] ? mergedAttributes[key].split(" ") : []; - const insertClasses = valueClasses.filter((valueClass) => !existingClasses.includes(valueClass)); - mergedAttributes[key] = [...existingClasses, ...insertClasses].join(" "); - } else if (key === "style") { - mergedAttributes[key] = [mergedAttributes[key], value].join("; "); - } else { - mergedAttributes[key] = value; - } - }); - return mergedAttributes; - }, {}); -} -function getRenderedAttributes(nodeOrMark, extensionAttributes) { - return extensionAttributes.filter((item) => item.attribute.rendered).map((item) => { - if (!item.attribute.renderHTML) { - return { - [item.name]: nodeOrMark.attrs[item.name] - }; - } - return item.attribute.renderHTML(nodeOrMark.attrs) || {}; - }).reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {}); -} -function isFunction(value) { - return typeof value === "function"; -} -function callOrReturn(value, context = void 0, ...props) { - if (isFunction(value)) { - if (context) { - return value.bind(context)(...props); - } - return value(...props); - } - return value; -} -function isEmptyObject(value = {}) { - return Object.keys(value).length === 0 && value.constructor === Object; -} -function fromString(value) { - if (typeof value !== "string") { - return value; - } - if (value.match(/^[+-]?(?:\d*\.)?\d+$/)) { - return Number(value); - } - if (value === "true") { - return true; - } - if (value === "false") { - return false; - } - return value; -} -function injectExtensionAttributesToParseRule(parseRule, extensionAttributes) { - if (parseRule.style) { - return parseRule; - } - return { - ...parseRule, - getAttrs: (node) => { - const oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs; - if (oldAttributes === false) { - return false; - } - const newAttributes = extensionAttributes.reduce((items, item) => { - const value = item.attribute.parseHTML ? item.attribute.parseHTML(node) : fromString(node.getAttribute(item.name)); - if (value === null || value === void 0) { - return items; - } - return { - ...items, - [item.name]: value - }; - }, {}); - return { ...oldAttributes, ...newAttributes }; - } - }; -} -function cleanUpSchemaItem(data) { - return Object.fromEntries( - // @ts-ignore - Object.entries(data).filter(([key, value]) => { - if (key === "attrs" && isEmptyObject(value)) { - return false; - } - return value !== null && value !== void 0; - }) - ); -} -function getSchemaByResolvedExtensions(extensions2, editor) { - var _a; - const allAttributes = getAttributesFromExtensions(extensions2); - const { nodeExtensions, markExtensions } = splitExtensions(extensions2); - const topNode = (_a = nodeExtensions.find((extension) => getExtensionField(extension, "topNode"))) === null || _a === void 0 ? void 0 : _a.name; - const nodes = Object.fromEntries(nodeExtensions.map((extension) => { - const extensionAttributes = allAttributes.filter((attribute) => attribute.type === extension.name); - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage, - editor - }; - const extraNodeFields = extensions2.reduce((fields, e) => { - const extendNodeSchema = getExtensionField(e, "extendNodeSchema", context); - return { - ...fields, - ...extendNodeSchema ? extendNodeSchema(extension) : {} - }; - }, {}); - const schema = cleanUpSchemaItem({ - ...extraNodeFields, - content: callOrReturn(getExtensionField(extension, "content", context)), - marks: callOrReturn(getExtensionField(extension, "marks", context)), - group: callOrReturn(getExtensionField(extension, "group", context)), - inline: callOrReturn(getExtensionField(extension, "inline", context)), - atom: callOrReturn(getExtensionField(extension, "atom", context)), - selectable: callOrReturn(getExtensionField(extension, "selectable", context)), - draggable: callOrReturn(getExtensionField(extension, "draggable", context)), - code: callOrReturn(getExtensionField(extension, "code", context)), - defining: callOrReturn(getExtensionField(extension, "defining", context)), - isolating: callOrReturn(getExtensionField(extension, "isolating", context)), - attrs: Object.fromEntries(extensionAttributes.map((extensionAttribute) => { - var _a2; - return [extensionAttribute.name, { default: (_a2 = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a2 === void 0 ? void 0 : _a2.default }]; - })) - }); - const parseHTML = callOrReturn(getExtensionField(extension, "parseHTML", context)); - if (parseHTML) { - schema.parseDOM = parseHTML.map((parseRule) => injectExtensionAttributesToParseRule(parseRule, extensionAttributes)); - } - const renderHTML = getExtensionField(extension, "renderHTML", context); - if (renderHTML) { - schema.toDOM = (node) => renderHTML({ - node, - HTMLAttributes: getRenderedAttributes(node, extensionAttributes) - }); - } - const renderText = getExtensionField(extension, "renderText", context); - if (renderText) { - schema.toText = renderText; - } - return [extension.name, schema]; - })); - const marks = Object.fromEntries(markExtensions.map((extension) => { - const extensionAttributes = allAttributes.filter((attribute) => attribute.type === extension.name); - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage, - editor - }; - const extraMarkFields = extensions2.reduce((fields, e) => { - const extendMarkSchema = getExtensionField(e, "extendMarkSchema", context); - return { - ...fields, - ...extendMarkSchema ? extendMarkSchema(extension) : {} - }; - }, {}); - const schema = cleanUpSchemaItem({ - ...extraMarkFields, - inclusive: callOrReturn(getExtensionField(extension, "inclusive", context)), - excludes: callOrReturn(getExtensionField(extension, "excludes", context)), - group: callOrReturn(getExtensionField(extension, "group", context)), - spanning: callOrReturn(getExtensionField(extension, "spanning", context)), - code: callOrReturn(getExtensionField(extension, "code", context)), - attrs: Object.fromEntries(extensionAttributes.map((extensionAttribute) => { - var _a2; - return [extensionAttribute.name, { default: (_a2 = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a2 === void 0 ? void 0 : _a2.default }]; - })) - }); - const parseHTML = callOrReturn(getExtensionField(extension, "parseHTML", context)); - if (parseHTML) { - schema.parseDOM = parseHTML.map((parseRule) => injectExtensionAttributesToParseRule(parseRule, extensionAttributes)); - } - const renderHTML = getExtensionField(extension, "renderHTML", context); - if (renderHTML) { - schema.toDOM = (mark) => renderHTML({ - mark, - HTMLAttributes: getRenderedAttributes(mark, extensionAttributes) - }); - } - return [extension.name, schema]; - })); - return new Schema({ - topNode, - nodes, - marks - }); -} -function getSchemaTypeByName(name, schema) { - return schema.nodes[name] || schema.marks[name] || null; -} -function isExtensionRulesEnabled(extension, enabled) { - if (Array.isArray(enabled)) { - return enabled.some((enabledExtension) => { - const name = typeof enabledExtension === "string" ? enabledExtension : enabledExtension.name; - return name === extension.name; - }); - } - return enabled; -} -var getTextContentFromNodes = ($from, maxMatch = 500) => { - let textBefore = ""; - const sliceEndPos = $from.parentOffset; - $from.parent.nodesBetween(Math.max(0, sliceEndPos - maxMatch), sliceEndPos, (node, pos, parent, index) => { - var _a, _b; - const chunk = ((_b = (_a = node.type.spec).toText) === null || _b === void 0 ? void 0 : _b.call(_a, { - node, - pos, - parent, - index - })) || node.textContent || "%leaf%"; - textBefore += chunk.slice(0, Math.max(0, sliceEndPos - pos)); - }); - return textBefore; -}; -function isRegExp(value) { - return Object.prototype.toString.call(value) === "[object RegExp]"; -} -var InputRule = class { - constructor(config) { - this.find = config.find; - this.handler = config.handler; - } -}; -var inputRuleMatcherHandler = (text, find2) => { - if (isRegExp(find2)) { - return find2.exec(text); - } - const inputRuleMatch = find2(text); - if (!inputRuleMatch) { - return null; - } - const result = [inputRuleMatch.text]; - result.index = inputRuleMatch.index; - result.input = text; - result.data = inputRuleMatch.data; - if (inputRuleMatch.replaceWith) { - if (!inputRuleMatch.text.includes(inputRuleMatch.replaceWith)) { - console.warn('[tiptap warn]: "inputRuleMatch.replaceWith" must be part of "inputRuleMatch.text".'); - } - result.push(inputRuleMatch.replaceWith); - } - return result; -}; -function run$1(config) { - var _a; - const { editor, from: from2, to, text, rules, plugin } = config; - const { view } = editor; - if (view.composing) { - return false; - } - const $from = view.state.doc.resolve(from2); - if ( - // check for code node - $from.parent.type.spec.code || !!((_a = $from.nodeBefore || $from.nodeAfter) === null || _a === void 0 ? void 0 : _a.marks.find((mark) => mark.type.spec.code)) - ) { - return false; - } - let matched = false; - const textBefore = getTextContentFromNodes($from) + text; - rules.forEach((rule) => { - if (matched) { - return; - } - const match = inputRuleMatcherHandler(textBefore, rule.find); - if (!match) { - return; - } - const tr2 = view.state.tr; - const state = createChainableState({ - state: view.state, - transaction: tr2 - }); - const range = { - from: from2 - (match[0].length - text.length), - to - }; - const { commands: commands2, chain, can } = new CommandManager({ - editor, - state - }); - const handler = rule.handler({ - state, - range, - match, - commands: commands2, - chain, - can - }); - if (handler === null || !tr2.steps.length) { - return; - } - tr2.setMeta(plugin, { - transform: tr2, - from: from2, - to, - text - }); - view.dispatch(tr2); - matched = true; - }); - return matched; -} -function inputRulesPlugin(props) { - const { editor, rules } = props; - const plugin = new Plugin({ - state: { - init() { - return null; - }, - apply(tr2, prev) { - const stored = tr2.getMeta(plugin); - if (stored) { - return stored; - } - return tr2.selectionSet || tr2.docChanged ? null : prev; - } - }, - props: { - handleTextInput(view, from2, to, text) { - return run$1({ - editor, - from: from2, - to, - text, - rules, - plugin - }); - }, - handleDOMEvents: { - compositionend: (view) => { - setTimeout(() => { - const { $cursor } = view.state.selection; - if ($cursor) { - run$1({ - editor, - from: $cursor.pos, - to: $cursor.pos, - text: "", - rules, - plugin - }); - } - }); - return false; - } - }, - // add support for input rules to trigger on enter - // this is useful for example for code blocks - handleKeyDown(view, event) { - if (event.key !== "Enter") { - return false; - } - const { $cursor } = view.state.selection; - if ($cursor) { - return run$1({ - editor, - from: $cursor.pos, - to: $cursor.pos, - text: "\n", - rules, - plugin - }); - } - return false; - } - }, - // @ts-ignore - isInputRules: true - }); - return plugin; -} -function isNumber(value) { - return typeof value === "number"; -} -var PasteRule = class { - constructor(config) { - this.find = config.find; - this.handler = config.handler; - } -}; -var pasteRuleMatcherHandler = (text, find2) => { - if (isRegExp(find2)) { - return [...text.matchAll(find2)]; - } - const matches2 = find2(text); - if (!matches2) { - return []; - } - return matches2.map((pasteRuleMatch) => { - const result = [pasteRuleMatch.text]; - result.index = pasteRuleMatch.index; - result.input = text; - result.data = pasteRuleMatch.data; - if (pasteRuleMatch.replaceWith) { - if (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) { - console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".'); - } - result.push(pasteRuleMatch.replaceWith); - } - return result; - }); -}; -function run(config) { - const { editor, state, from: from2, to, rule, pasteEvent, dropEvent } = config; - const { commands: commands2, chain, can } = new CommandManager({ - editor, - state - }); - const handlers2 = []; - state.doc.nodesBetween(from2, to, (node, pos) => { - if (!node.isTextblock || node.type.spec.code) { - return; - } - const resolvedFrom = Math.max(from2, pos); - const resolvedTo = Math.min(to, pos + node.content.size); - const textToMatch = node.textBetween(resolvedFrom - pos, resolvedTo - pos, void 0, "\uFFFC"); - const matches2 = pasteRuleMatcherHandler(textToMatch, rule.find); - matches2.forEach((match) => { - if (match.index === void 0) { - return; - } - const start2 = resolvedFrom + match.index + 1; - const end2 = start2 + match[0].length; - const range = { - from: state.tr.mapping.map(start2), - to: state.tr.mapping.map(end2) - }; - const handler = rule.handler({ - state, - range, - match, - commands: commands2, - chain, - can, - pasteEvent, - dropEvent - }); - handlers2.push(handler); - }); - }); - const success = handlers2.every((handler) => handler !== null); - return success; -} -function pasteRulesPlugin(props) { - const { editor, rules } = props; - let dragSourceElement = null; - let isPastedFromProseMirror = false; - let isDroppedFromProseMirror = false; - let pasteEvent = new ClipboardEvent("paste"); - let dropEvent = new DragEvent("drop"); - const plugins = rules.map((rule) => { - return new Plugin({ - // we register a global drag handler to track the current drag source element - view(view) { - const handleDragstart = (event) => { - var _a; - dragSourceElement = ((_a = view.dom.parentElement) === null || _a === void 0 ? void 0 : _a.contains(event.target)) ? view.dom.parentElement : null; - }; - window.addEventListener("dragstart", handleDragstart); - return { - destroy() { - window.removeEventListener("dragstart", handleDragstart); - } - }; - }, - props: { - handleDOMEvents: { - drop: (view, event) => { - isDroppedFromProseMirror = dragSourceElement === view.dom.parentElement; - dropEvent = event; - return false; - }, - paste: (_view, event) => { - var _a; - const html = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData("text/html"); - pasteEvent = event; - isPastedFromProseMirror = !!(html === null || html === void 0 ? void 0 : html.includes("data-pm-slice")); - return false; - } - } - }, - appendTransaction: (transactions, oldState, state) => { - const transaction = transactions[0]; - const isPaste = transaction.getMeta("uiEvent") === "paste" && !isPastedFromProseMirror; - const isDrop = transaction.getMeta("uiEvent") === "drop" && !isDroppedFromProseMirror; - if (!isPaste && !isDrop) { - return; - } - const from2 = oldState.doc.content.findDiffStart(state.doc.content); - const to = oldState.doc.content.findDiffEnd(state.doc.content); - if (!isNumber(from2) || !to || from2 === to.b) { - return; - } - const tr2 = state.tr; - const chainableState = createChainableState({ - state, - transaction: tr2 - }); - const handler = run({ - editor, - state: chainableState, - from: Math.max(from2 - 1, 0), - to: to.b - 1, - rule, - pasteEvent, - dropEvent - }); - if (!handler || !tr2.steps.length) { - return; - } - dropEvent = new DragEvent("drop"); - pasteEvent = new ClipboardEvent("paste"); - return tr2; - } - }); - }); - return plugins; -} -function findDuplicates(items) { - const filtered = items.filter((el, index) => items.indexOf(el) !== index); - return [...new Set(filtered)]; -} -var ExtensionManager = class _ExtensionManager { - constructor(extensions2, editor) { - this.splittableMarks = []; - this.editor = editor; - this.extensions = _ExtensionManager.resolve(extensions2); - this.schema = getSchemaByResolvedExtensions(this.extensions, editor); - this.extensions.forEach((extension) => { - var _a; - this.editor.extensionStorage[extension.name] = extension.storage; - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage, - editor: this.editor, - type: getSchemaTypeByName(extension.name, this.schema) - }; - if (extension.type === "mark") { - const keepOnSplit = (_a = callOrReturn(getExtensionField(extension, "keepOnSplit", context))) !== null && _a !== void 0 ? _a : true; - if (keepOnSplit) { - this.splittableMarks.push(extension.name); - } - } - const onBeforeCreate = getExtensionField(extension, "onBeforeCreate", context); - if (onBeforeCreate) { - this.editor.on("beforeCreate", onBeforeCreate); - } - const onCreate2 = getExtensionField(extension, "onCreate", context); - if (onCreate2) { - this.editor.on("create", onCreate2); - } - const onUpdate = getExtensionField(extension, "onUpdate", context); - if (onUpdate) { - this.editor.on("update", onUpdate); - } - const onSelectionUpdate = getExtensionField(extension, "onSelectionUpdate", context); - if (onSelectionUpdate) { - this.editor.on("selectionUpdate", onSelectionUpdate); - } - const onTransaction = getExtensionField(extension, "onTransaction", context); - if (onTransaction) { - this.editor.on("transaction", onTransaction); - } - const onFocus = getExtensionField(extension, "onFocus", context); - if (onFocus) { - this.editor.on("focus", onFocus); - } - const onBlur = getExtensionField(extension, "onBlur", context); - if (onBlur) { - this.editor.on("blur", onBlur); - } - const onDestroy2 = getExtensionField(extension, "onDestroy", context); - if (onDestroy2) { - this.editor.on("destroy", onDestroy2); - } - }); - } - static resolve(extensions2) { - const resolvedExtensions = _ExtensionManager.sort(_ExtensionManager.flatten(extensions2)); - const duplicatedNames = findDuplicates(resolvedExtensions.map((extension) => extension.name)); - if (duplicatedNames.length) { - console.warn(`[tiptap warn]: Duplicate extension names found: [${duplicatedNames.map((item) => `'${item}'`).join(", ")}]. This can lead to issues.`); - } - return resolvedExtensions; - } - static flatten(extensions2) { - return extensions2.map((extension) => { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - const addExtensions = getExtensionField(extension, "addExtensions", context); - if (addExtensions) { - return [extension, ...this.flatten(addExtensions())]; - } - return extension; - }).flat(10); - } - static sort(extensions2) { - const defaultPriority = 100; - return extensions2.sort((a, b) => { - const priorityA = getExtensionField(a, "priority") || defaultPriority; - const priorityB = getExtensionField(b, "priority") || defaultPriority; - if (priorityA > priorityB) { - return -1; - } - if (priorityA < priorityB) { - return 1; - } - return 0; - }); - } - get commands() { - return this.extensions.reduce((commands2, extension) => { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage, - editor: this.editor, - type: getSchemaTypeByName(extension.name, this.schema) - }; - const addCommands = getExtensionField(extension, "addCommands", context); - if (!addCommands) { - return commands2; - } - return { - ...commands2, - ...addCommands() - }; - }, {}); - } - get plugins() { - const { editor } = this; - const extensions2 = _ExtensionManager.sort([...this.extensions].reverse()); - const inputRules = []; - const pasteRules = []; - const allPlugins = extensions2.map((extension) => { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage, - editor, - type: getSchemaTypeByName(extension.name, this.schema) - }; - const plugins = []; - const addKeyboardShortcuts = getExtensionField(extension, "addKeyboardShortcuts", context); - let defaultBindings = {}; - if (extension.type === "mark" && extension.config.exitable) { - defaultBindings.ArrowRight = () => Mark2.handleExit({ editor, mark: extension }); - } - if (addKeyboardShortcuts) { - const bindings = Object.fromEntries(Object.entries(addKeyboardShortcuts()).map(([shortcut, method]) => { - return [shortcut, () => method({ editor })]; - })); - defaultBindings = { ...defaultBindings, ...bindings }; - } - const keyMapPlugin = keymap(defaultBindings); - plugins.push(keyMapPlugin); - const addInputRules = getExtensionField(extension, "addInputRules", context); - if (isExtensionRulesEnabled(extension, editor.options.enableInputRules) && addInputRules) { - inputRules.push(...addInputRules()); - } - const addPasteRules = getExtensionField(extension, "addPasteRules", context); - if (isExtensionRulesEnabled(extension, editor.options.enablePasteRules) && addPasteRules) { - pasteRules.push(...addPasteRules()); - } - const addProseMirrorPlugins = getExtensionField(extension, "addProseMirrorPlugins", context); - if (addProseMirrorPlugins) { - const proseMirrorPlugins = addProseMirrorPlugins(); - plugins.push(...proseMirrorPlugins); - } - return plugins; - }).flat(); - return [ - inputRulesPlugin({ - editor, - rules: inputRules - }), - ...pasteRulesPlugin({ - editor, - rules: pasteRules - }), - ...allPlugins - ]; - } - get attributes() { - return getAttributesFromExtensions(this.extensions); - } - get nodeViews() { - const { editor } = this; - const { nodeExtensions } = splitExtensions(this.extensions); - return Object.fromEntries(nodeExtensions.filter((extension) => !!getExtensionField(extension, "addNodeView")).map((extension) => { - const extensionAttributes = this.attributes.filter((attribute) => attribute.type === extension.name); - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage, - editor, - type: getNodeType(extension.name, this.schema) - }; - const addNodeView = getExtensionField(extension, "addNodeView", context); - if (!addNodeView) { - return []; - } - const nodeview = (node, view, getPos, decorations) => { - const HTMLAttributes = getRenderedAttributes(node, extensionAttributes); - return addNodeView()({ - editor, - node, - getPos, - decorations, - HTMLAttributes, - extension - }); - }; - return [extension.name, nodeview]; - })); - } -}; -function getType(value) { - return Object.prototype.toString.call(value).slice(8, -1); -} -function isPlainObject(value) { - if (getType(value) !== "Object") { - return false; - } - return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype; -} -function mergeDeep(target, source3) { - const output = { ...target }; - if (isPlainObject(target) && isPlainObject(source3)) { - Object.keys(source3).forEach((key) => { - if (isPlainObject(source3[key])) { - if (!(key in target)) { - Object.assign(output, { [key]: source3[key] }); - } else { - output[key] = mergeDeep(target[key], source3[key]); - } - } else { - Object.assign(output, { [key]: source3[key] }); - } - }); - } - return output; -} -var Extension = class _Extension { - constructor(config = {}) { - this.type = "extension"; - this.name = "extension"; - this.parent = null; - this.child = null; - this.config = { - name: this.name, - defaultOptions: {} - }; - this.config = { - ...this.config, - ...config - }; - this.name = this.config.name; - if (config.defaultOptions) { - console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`); - } - this.options = this.config.defaultOptions; - if (this.config.addOptions) { - this.options = callOrReturn(getExtensionField(this, "addOptions", { - name: this.name - })); - } - this.storage = callOrReturn(getExtensionField(this, "addStorage", { - name: this.name, - options: this.options - })) || {}; - } - static create(config = {}) { - return new _Extension(config); - } - configure(options = {}) { - const extension = this.extend(); - extension.options = mergeDeep(this.options, options); - extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { - name: extension.name, - options: extension.options - })); - return extension; - } - extend(extendedConfig = {}) { - const extension = new _Extension(extendedConfig); - extension.parent = this; - this.child = extension; - extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name; - if (extendedConfig.defaultOptions) { - console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`); - } - extension.options = callOrReturn(getExtensionField(extension, "addOptions", { - name: extension.name - })); - extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { - name: extension.name, - options: extension.options - })); - return extension; - } -}; -function getTextBetween(startNode, range, options) { - const { from: from2, to } = range; - const { blockSeparator = "\n\n", textSerializers = {} } = options || {}; - let text = ""; - let separated = true; - startNode.nodesBetween(from2, to, (node, pos, parent, index) => { - var _a; - const textSerializer = textSerializers === null || textSerializers === void 0 ? void 0 : textSerializers[node.type.name]; - if (textSerializer) { - if (node.isBlock && !separated) { - text += blockSeparator; - separated = true; - } - if (parent) { - text += textSerializer({ - node, - pos, - parent, - index, - range - }); - } - } else if (node.isText) { - text += (_a = node === null || node === void 0 ? void 0 : node.text) === null || _a === void 0 ? void 0 : _a.slice(Math.max(from2, pos) - pos, to - pos); - separated = false; - } else if (node.isBlock && !separated) { - text += blockSeparator; - separated = true; - } - }); - return text; -} -function getTextSerializersFromSchema(schema) { - return Object.fromEntries(Object.entries(schema.nodes).filter(([, node]) => node.spec.toText).map(([name, node]) => [name, node.spec.toText])); -} -var ClipboardTextSerializer = Extension.create({ - name: "clipboardTextSerializer", - addProseMirrorPlugins() { - return [ - new Plugin({ - key: new PluginKey("clipboardTextSerializer"), - props: { - clipboardTextSerializer: () => { - const { editor } = this; - const { state, schema } = editor; - const { doc: doc3, selection } = state; - const { ranges } = selection; - const from2 = Math.min(...ranges.map((range2) => range2.$from.pos)); - const to = Math.max(...ranges.map((range2) => range2.$to.pos)); - const textSerializers = getTextSerializersFromSchema(schema); - const range = { from: from2, to }; - return getTextBetween(doc3, range, { - textSerializers - }); - } - } - }) - ]; - } -}); -var blur = () => ({ editor, view }) => { - requestAnimationFrame(() => { - var _a; - if (!editor.isDestroyed) { - view.dom.blur(); - (_a = window === null || window === void 0 ? void 0 : window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges(); - } - }); - return true; -}; -var clearContent = (emitUpdate = false) => ({ commands: commands2 }) => { - return commands2.setContent("", emitUpdate); -}; -var clearNodes = () => ({ state, tr: tr2, dispatch }) => { - const { selection } = tr2; - const { ranges } = selection; - if (!dispatch) { - return true; - } - ranges.forEach(({ $from, $to }) => { - state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => { - if (node.type.isText) { - return; - } - const { doc: doc3, mapping } = tr2; - const $mappedFrom = doc3.resolve(mapping.map(pos)); - const $mappedTo = doc3.resolve(mapping.map(pos + node.nodeSize)); - const nodeRange = $mappedFrom.blockRange($mappedTo); - if (!nodeRange) { - return; - } - const targetLiftDepth = liftTarget(nodeRange); - if (node.type.isTextblock) { - const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index()); - tr2.setNodeMarkup(nodeRange.start, defaultType); - } - if (targetLiftDepth || targetLiftDepth === 0) { - tr2.lift(nodeRange, targetLiftDepth); - } - }); - }); - return true; -}; -var command = (fn2) => (props) => { - return fn2(props); -}; -var createParagraphNear2 = () => ({ state, dispatch }) => { - return createParagraphNear(state, dispatch); -}; -var cut = (originRange, targetPos) => ({ editor, tr: tr2 }) => { - const { state } = editor; - const contentSlice = state.doc.slice(originRange.from, originRange.to); - tr2.deleteRange(originRange.from, originRange.to); - const newPos = tr2.mapping.map(targetPos); - tr2.insert(newPos, contentSlice.content); - tr2.setSelection(new TextSelection(tr2.doc.resolve(newPos - 1))); - return true; -}; -var deleteCurrentNode = () => ({ tr: tr2, dispatch }) => { - const { selection } = tr2; - const currentNode = selection.$anchor.node(); - if (currentNode.content.size > 0) { - return false; - } - const $pos = tr2.selection.$anchor; - for (let depth = $pos.depth; depth > 0; depth -= 1) { - const node = $pos.node(depth); - if (node.type === currentNode.type) { - if (dispatch) { - const from2 = $pos.before(depth); - const to = $pos.after(depth); - tr2.delete(from2, to).scrollIntoView(); - } - return true; - } - } - return false; -}; -var deleteNode = (typeOrName) => ({ tr: tr2, state, dispatch }) => { - const type = getNodeType(typeOrName, state.schema); - const $pos = tr2.selection.$anchor; - for (let depth = $pos.depth; depth > 0; depth -= 1) { - const node = $pos.node(depth); - if (node.type === type) { - if (dispatch) { - const from2 = $pos.before(depth); - const to = $pos.after(depth); - tr2.delete(from2, to).scrollIntoView(); - } - return true; - } - } - return false; -}; -var deleteRange2 = (range) => ({ tr: tr2, dispatch }) => { - const { from: from2, to } = range; - if (dispatch) { - tr2.delete(from2, to); - } - return true; -}; -var deleteSelection2 = () => ({ state, dispatch }) => { - return deleteSelection(state, dispatch); -}; -var enter = () => ({ commands: commands2 }) => { - return commands2.keyboardShortcut("Enter"); -}; -var exitCode2 = () => ({ state, dispatch }) => { - return exitCode(state, dispatch); -}; -function objectIncludes(object1, object2, options = { strict: true }) { - const keys2 = Object.keys(object2); - if (!keys2.length) { - return true; - } - return keys2.every((key) => { - if (options.strict) { - return object2[key] === object1[key]; - } - if (isRegExp(object2[key])) { - return object2[key].test(object1[key]); - } - return object2[key] === object1[key]; - }); -} -function findMarkInSet(marks, type, attributes = {}) { - return marks.find((item) => { - return item.type === type && objectIncludes(item.attrs, attributes); - }); -} -function isMarkInSet(marks, type, attributes = {}) { - return !!findMarkInSet(marks, type, attributes); -} -function getMarkRange($pos, type, attributes = {}) { - if (!$pos || !type) { - return; - } - let start2 = $pos.parent.childAfter($pos.parentOffset); - if ($pos.parentOffset === start2.offset && start2.offset !== 0) { - start2 = $pos.parent.childBefore($pos.parentOffset); - } - if (!start2.node) { - return; - } - const mark = findMarkInSet([...start2.node.marks], type, attributes); - if (!mark) { - return; - } - let startIndex = start2.index; - let startPos = $pos.start() + start2.offset; - let endIndex = startIndex + 1; - let endPos = startPos + start2.node.nodeSize; - findMarkInSet([...start2.node.marks], type, attributes); - while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) { - startIndex -= 1; - startPos -= $pos.parent.child(startIndex).nodeSize; - } - while (endIndex < $pos.parent.childCount && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)) { - endPos += $pos.parent.child(endIndex).nodeSize; - endIndex += 1; - } - return { - from: startPos, - to: endPos - }; -} -function getMarkType(nameOrType, schema) { - if (typeof nameOrType === "string") { - if (!schema.marks[nameOrType]) { - throw Error(`There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`); - } - return schema.marks[nameOrType]; - } - return nameOrType; -} -var extendMarkRange = (typeOrName, attributes = {}) => ({ tr: tr2, state, dispatch }) => { - const type = getMarkType(typeOrName, state.schema); - const { doc: doc3, selection } = tr2; - const { $from, from: from2, to } = selection; - if (dispatch) { - const range = getMarkRange($from, type, attributes); - if (range && range.from <= from2 && range.to >= to) { - const newSelection = TextSelection.create(doc3, range.from, range.to); - tr2.setSelection(newSelection); - } - } - return true; -}; -var first = (commands2) => (props) => { - const items = typeof commands2 === "function" ? commands2(props) : commands2; - for (let i = 0; i < items.length; i += 1) { - if (items[i](props)) { - return true; - } - } - return false; -}; -function isTextSelection(value) { - return value instanceof TextSelection; -} -function minMax(value = 0, min2 = 0, max2 = 0) { - return Math.min(Math.max(value, min2), max2); -} -function resolveFocusPosition(doc3, position = null) { - if (!position) { - return null; - } - const selectionAtStart = Selection.atStart(doc3); - const selectionAtEnd = Selection.atEnd(doc3); - if (position === "start" || position === true) { - return selectionAtStart; - } - if (position === "end") { - return selectionAtEnd; - } - const minPos = selectionAtStart.from; - const maxPos = selectionAtEnd.to; - if (position === "all") { - return TextSelection.create(doc3, minMax(0, minPos, maxPos), minMax(doc3.content.size, minPos, maxPos)); - } - return TextSelection.create(doc3, minMax(position, minPos, maxPos), minMax(position, minPos, maxPos)); -} -function isiOS() { - return [ - "iPad Simulator", - "iPhone Simulator", - "iPod Simulator", - "iPad", - "iPhone", - "iPod" - ].includes(navigator.platform) || navigator.userAgent.includes("Mac") && "ontouchend" in document; -} -var focus = (position = null, options = {}) => ({ editor, view, tr: tr2, dispatch }) => { - options = { - scrollIntoView: true, - ...options - }; - const delayedFocus = () => { - if (isiOS()) { - view.dom.focus(); - } - requestAnimationFrame(() => { - if (!editor.isDestroyed) { - view.focus(); - if (options === null || options === void 0 ? void 0 : options.scrollIntoView) { - editor.commands.scrollIntoView(); - } - } - }); - }; - if (view.hasFocus() && position === null || position === false) { - return true; - } - if (dispatch && position === null && !isTextSelection(editor.state.selection)) { - delayedFocus(); - return true; - } - const selection = resolveFocusPosition(tr2.doc, position) || editor.state.selection; - const isSameSelection = editor.state.selection.eq(selection); - if (dispatch) { - if (!isSameSelection) { - tr2.setSelection(selection); - } - if (isSameSelection && tr2.storedMarks) { - tr2.setStoredMarks(tr2.storedMarks); - } - delayedFocus(); - } - return true; -}; -var forEach = (items, fn2) => (props) => { - return items.every((item, index) => fn2(item, { ...props, index })); -}; -var insertContent = (value, options) => ({ tr: tr2, commands: commands2 }) => { - return commands2.insertContentAt({ from: tr2.selection.from, to: tr2.selection.to }, value, options); -}; -function elementFromString(value) { - const wrappedValue = `${value}`; - return new window.DOMParser().parseFromString(wrappedValue, "text/html").body; -} -function createNodeFromContent(content, schema, options) { - options = { - slice: true, - parseOptions: {}, - ...options - }; - if (typeof content === "object" && content !== null) { - try { - if (Array.isArray(content) && content.length > 0) { - return Fragment.fromArray(content.map((item) => schema.nodeFromJSON(item))); - } - return schema.nodeFromJSON(content); - } catch (error2) { - console.warn("[tiptap warn]: Invalid content.", "Passed value:", content, "Error:", error2); - return createNodeFromContent("", schema, options); - } - } - if (typeof content === "string") { - const parser = DOMParser.fromSchema(schema); - return options.slice ? parser.parseSlice(elementFromString(content), options.parseOptions).content : parser.parse(elementFromString(content), options.parseOptions); - } - return createNodeFromContent("", schema, options); -} -function selectionToInsertionEnd2(tr2, startLen, bias) { - const last = tr2.steps.length - 1; - if (last < startLen) { - return; - } - const step = tr2.steps[last]; - if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) { - return; - } - const map2 = tr2.mapping.maps[last]; - let end2 = 0; - map2.forEach((_from, _to, _newFrom, newTo) => { - if (end2 === 0) { - end2 = newTo; - } - }); - tr2.setSelection(Selection.near(tr2.doc.resolve(end2), bias)); -} -var isFragment = (nodeOrFragment) => { - return nodeOrFragment.toString().startsWith("<"); -}; -var insertContentAt = (position, value, options) => ({ tr: tr2, dispatch, editor }) => { - if (dispatch) { - options = { - parseOptions: {}, - updateSelection: true, - ...options - }; - const content = createNodeFromContent(value, editor.schema, { - parseOptions: { - preserveWhitespace: "full", - ...options.parseOptions - } - }); - if (content.toString() === "<>") { - return true; - } - let { from: from2, to } = typeof position === "number" ? { from: position, to: position } : { from: position.from, to: position.to }; - let isOnlyTextContent = true; - let isOnlyBlockContent = true; - const nodes = isFragment(content) ? content : [content]; - nodes.forEach((node) => { - node.check(); - isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false; - isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false; - }); - if (from2 === to && isOnlyBlockContent) { - const { parent } = tr2.doc.resolve(from2); - const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount; - if (isEmptyTextBlock) { - from2 -= 1; - to += 1; - } - } - if (isOnlyTextContent) { - if (Array.isArray(value)) { - tr2.insertText(value.map((v) => v.text || "").join(""), from2, to); - } else if (typeof value === "object" && !!value && !!value.text) { - tr2.insertText(value.text, from2, to); - } else { - tr2.insertText(value, from2, to); - } - } else { - tr2.replaceWith(from2, to, content); - } - if (options.updateSelection) { - selectionToInsertionEnd2(tr2, tr2.steps.length - 1, -1); - } - } - return true; -}; -var joinUp2 = () => ({ state, dispatch }) => { - return joinUp(state, dispatch); -}; -var joinDown2 = () => ({ state, dispatch }) => { - return joinDown(state, dispatch); -}; -var joinBackward2 = () => ({ state, dispatch }) => { - return joinBackward(state, dispatch); -}; -var joinForward2 = () => ({ state, dispatch }) => { - return joinForward(state, dispatch); -}; -var joinItemBackward = () => ({ tr: tr2, state, dispatch }) => { - try { - const point = joinPoint(state.doc, state.selection.$from.pos, -1); - if (point === null || point === void 0) { - return false; - } - tr2.join(point, 2); - if (dispatch) { - dispatch(tr2); - } - return true; - } catch { - return false; - } -}; -var joinItemForward = () => ({ state, dispatch, tr: tr2 }) => { - try { - const point = joinPoint(state.doc, state.selection.$from.pos, 1); - if (point === null || point === void 0) { - return false; - } - tr2.join(point, 2); - if (dispatch) { - dispatch(tr2); - } - return true; - } catch (e) { - return false; - } -}; -function isMacOS() { - return typeof navigator !== "undefined" ? /Mac/.test(navigator.platform) : false; -} -function normalizeKeyName2(name) { - const parts = name.split(/-(?!$)/); - let result = parts[parts.length - 1]; - if (result === "Space") { - result = " "; - } - let alt; - let ctrl; - let shift2; - let meta; - for (let i = 0; i < parts.length - 1; i += 1) { - const mod = parts[i]; - if (/^(cmd|meta|m)$/i.test(mod)) { - meta = true; - } else if (/^a(lt)?$/i.test(mod)) { - alt = true; - } else if (/^(c|ctrl|control)$/i.test(mod)) { - ctrl = true; - } else if (/^s(hift)?$/i.test(mod)) { - shift2 = true; - } else if (/^mod$/i.test(mod)) { - if (isiOS() || isMacOS()) { - meta = true; - } else { - ctrl = true; - } - } else { - throw new Error(`Unrecognized modifier name: ${mod}`); - } - } - if (alt) { - result = `Alt-${result}`; - } - if (ctrl) { - result = `Ctrl-${result}`; - } - if (meta) { - result = `Meta-${result}`; - } - if (shift2) { - result = `Shift-${result}`; - } - return result; -} -var keyboardShortcut = (name) => ({ editor, view, tr: tr2, dispatch }) => { - const keys2 = normalizeKeyName2(name).split(/-(?!$)/); - const key = keys2.find((item) => !["Alt", "Ctrl", "Meta", "Shift"].includes(item)); - const event = new KeyboardEvent("keydown", { - key: key === "Space" ? " " : key, - altKey: keys2.includes("Alt"), - ctrlKey: keys2.includes("Ctrl"), - metaKey: keys2.includes("Meta"), - shiftKey: keys2.includes("Shift"), - bubbles: true, - cancelable: true - }); - const capturedTransaction = editor.captureTransaction(() => { - view.someProp("handleKeyDown", (f) => f(view, event)); - }); - capturedTransaction === null || capturedTransaction === void 0 ? void 0 : capturedTransaction.steps.forEach((step) => { - const newStep = step.map(tr2.mapping); - if (newStep && dispatch) { - tr2.maybeStep(newStep); - } - }); - return true; -}; -function isNodeActive(state, typeOrName, attributes = {}) { - const { from: from2, to, empty: empty2 } = state.selection; - const type = typeOrName ? getNodeType(typeOrName, state.schema) : null; - const nodeRanges = []; - state.doc.nodesBetween(from2, to, (node, pos) => { - if (node.isText) { - return; - } - const relativeFrom = Math.max(from2, pos); - const relativeTo = Math.min(to, pos + node.nodeSize); - nodeRanges.push({ - node, - from: relativeFrom, - to: relativeTo - }); - }); - const selectionRange = to - from2; - const matchedNodeRanges = nodeRanges.filter((nodeRange) => { - if (!type) { - return true; - } - return type.name === nodeRange.node.type.name; - }).filter((nodeRange) => objectIncludes(nodeRange.node.attrs, attributes, { strict: false })); - if (empty2) { - return !!matchedNodeRanges.length; - } - const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0); - return range >= selectionRange; -} -var lift3 = (typeOrName, attributes = {}) => ({ state, dispatch }) => { - const type = getNodeType(typeOrName, state.schema); - const isActive2 = isNodeActive(state, type, attributes); - if (!isActive2) { - return false; - } - return lift2(state, dispatch); -}; -var liftEmptyBlock2 = () => ({ state, dispatch }) => { - return liftEmptyBlock(state, dispatch); -}; -var liftListItem2 = (typeOrName) => ({ state, dispatch }) => { - const type = getNodeType(typeOrName, state.schema); - return liftListItem(type)(state, dispatch); -}; -var newlineInCode2 = () => ({ state, dispatch }) => { - return newlineInCode(state, dispatch); -}; -function getSchemaTypeNameByName(name, schema) { - if (schema.nodes[name]) { - return "node"; - } - if (schema.marks[name]) { - return "mark"; - } - return null; -} -function deleteProps(obj, propOrProps) { - const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps; - return Object.keys(obj).reduce((newObj, prop) => { - if (!props.includes(prop)) { - newObj[prop] = obj[prop]; - } - return newObj; - }, {}); -} -var resetAttributes = (typeOrName, attributes) => ({ tr: tr2, state, dispatch }) => { - let nodeType = null; - let markType = null; - const schemaType = getSchemaTypeNameByName(typeof typeOrName === "string" ? typeOrName : typeOrName.name, state.schema); - if (!schemaType) { - return false; - } - if (schemaType === "node") { - nodeType = getNodeType(typeOrName, state.schema); - } - if (schemaType === "mark") { - markType = getMarkType(typeOrName, state.schema); - } - if (dispatch) { - tr2.selection.ranges.forEach((range) => { - state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => { - if (nodeType && nodeType === node.type) { - tr2.setNodeMarkup(pos, void 0, deleteProps(node.attrs, attributes)); - } - if (markType && node.marks.length) { - node.marks.forEach((mark) => { - if (markType === mark.type) { - tr2.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes))); - } - }); - } - }); - }); - } - return true; -}; -var scrollIntoView = () => ({ tr: tr2, dispatch }) => { - if (dispatch) { - tr2.scrollIntoView(); - } - return true; -}; -var selectAll2 = () => ({ tr: tr2, commands: commands2 }) => { - return commands2.setTextSelection({ - from: 0, - to: tr2.doc.content.size - }); -}; -var selectNodeBackward2 = () => ({ state, dispatch }) => { - return selectNodeBackward(state, dispatch); -}; -var selectNodeForward2 = () => ({ state, dispatch }) => { - return selectNodeForward(state, dispatch); -}; -var selectParentNode2 = () => ({ state, dispatch }) => { - return selectParentNode(state, dispatch); -}; -var selectTextblockEnd2 = () => ({ state, dispatch }) => { - return selectTextblockEnd(state, dispatch); -}; -var selectTextblockStart2 = () => ({ state, dispatch }) => { - return selectTextblockStart(state, dispatch); -}; -function createDocument(content, schema, parseOptions = {}) { - return createNodeFromContent(content, schema, { slice: false, parseOptions }); -} -var setContent = (content, emitUpdate = false, parseOptions = {}) => ({ tr: tr2, editor, dispatch }) => { - const { doc: doc3 } = tr2; - const document2 = createDocument(content, editor.schema, parseOptions); - if (dispatch) { - tr2.replaceWith(0, doc3.content.size, document2).setMeta("preventUpdate", !emitUpdate); - } - return true; -}; -function getMarkAttributes(state, typeOrName) { - const type = getMarkType(typeOrName, state.schema); - const { from: from2, to, empty: empty2 } = state.selection; - const marks = []; - if (empty2) { - if (state.storedMarks) { - marks.push(...state.storedMarks); - } - marks.push(...state.selection.$head.marks()); - } else { - state.doc.nodesBetween(from2, to, (node) => { - marks.push(...node.marks); - }); - } - const mark = marks.find((markItem) => markItem.type.name === type.name); - if (!mark) { - return {}; - } - return { ...mark.attrs }; -} -function combineTransactionSteps(oldDoc, transactions) { - const transform = new Transform(oldDoc); - transactions.forEach((transaction) => { - transaction.steps.forEach((step) => { - transform.step(step); - }); - }); - return transform; -} -function defaultBlockAt2(match) { - for (let i = 0; i < match.edgeCount; i += 1) { - const { type } = match.edge(i); - if (type.isTextblock && !type.hasRequiredAttrs()) { - return type; - } - } - return null; -} -function findChildren(node, predicate) { - const nodesWithPos = []; - node.descendants((child, pos) => { - if (predicate(child)) { - nodesWithPos.push({ - node: child, - pos - }); - } - }); - return nodesWithPos; -} -function findChildrenInRange(node, range, predicate) { - const nodesWithPos = []; - node.nodesBetween(range.from, range.to, (child, pos) => { - if (predicate(child)) { - nodesWithPos.push({ - node: child, - pos - }); - } - }); - return nodesWithPos; -} -function findParentNodeClosestToPos($pos, predicate) { - for (let i = $pos.depth; i > 0; i -= 1) { - const node = $pos.node(i); - if (predicate(node)) { - return { - pos: i > 0 ? $pos.before(i) : 0, - start: $pos.start(i), - depth: i, - node - }; - } - } -} -function findParentNode(predicate) { - return (selection) => findParentNodeClosestToPos(selection.$from, predicate); -} -function getHTMLFromFragment(fragment, schema) { - const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment); - const temporaryDocument = document.implementation.createHTMLDocument(); - const container = temporaryDocument.createElement("div"); - container.appendChild(documentFragment); - return container.innerHTML; -} -function getText2(node, options) { - const range = { - from: 0, - to: node.content.size - }; - return getTextBetween(node, range, options); -} -function getNodeAttributes(state, typeOrName) { - const type = getNodeType(typeOrName, state.schema); - const { from: from2, to } = state.selection; - const nodes = []; - state.doc.nodesBetween(from2, to, (node2) => { - nodes.push(node2); - }); - const node = nodes.reverse().find((nodeItem) => nodeItem.type.name === type.name); - if (!node) { - return {}; - } - return { ...node.attrs }; -} -function getAttributes(state, typeOrName) { - const schemaType = getSchemaTypeNameByName(typeof typeOrName === "string" ? typeOrName : typeOrName.name, state.schema); - if (schemaType === "node") { - return getNodeAttributes(state, typeOrName); - } - if (schemaType === "mark") { - return getMarkAttributes(state, typeOrName); - } - return {}; -} -function removeDuplicates(array, by = JSON.stringify) { - const seen = {}; - return array.filter((item) => { - const key = by(item); - return Object.prototype.hasOwnProperty.call(seen, key) ? false : seen[key] = true; - }); -} -function simplifyChangedRanges(changes) { - const uniqueChanges = removeDuplicates(changes); - return uniqueChanges.length === 1 ? uniqueChanges : uniqueChanges.filter((change, index) => { - const rest = uniqueChanges.filter((_, i) => i !== index); - return !rest.some((otherChange) => { - return change.oldRange.from >= otherChange.oldRange.from && change.oldRange.to <= otherChange.oldRange.to && change.newRange.from >= otherChange.newRange.from && change.newRange.to <= otherChange.newRange.to; - }); - }); -} -function getChangedRanges(transform) { - const { mapping, steps } = transform; - const changes = []; - mapping.maps.forEach((stepMap, index) => { - const ranges = []; - if (!stepMap.ranges.length) { - const { from: from2, to } = steps[index]; - if (from2 === void 0 || to === void 0) { - return; - } - ranges.push({ from: from2, to }); - } else { - stepMap.forEach((from2, to) => { - ranges.push({ from: from2, to }); - }); - } - ranges.forEach(({ from: from2, to }) => { - const newStart = mapping.slice(index).map(from2, -1); - const newEnd = mapping.slice(index).map(to); - const oldStart = mapping.invert().map(newStart, -1); - const oldEnd = mapping.invert().map(newEnd); - changes.push({ - oldRange: { - from: oldStart, - to: oldEnd - }, - newRange: { - from: newStart, - to: newEnd - } - }); - }); - }); - return simplifyChangedRanges(changes); -} -function getMarksBetween(from2, to, doc3) { - const marks = []; - if (from2 === to) { - doc3.resolve(from2).marks().forEach((mark) => { - const $pos = doc3.resolve(from2 - 1); - const range = getMarkRange($pos, mark.type); - if (!range) { - return; - } - marks.push({ - mark, - ...range - }); - }); - } else { - doc3.nodesBetween(from2, to, (node, pos) => { - marks.push(...node.marks.map((mark) => ({ - from: pos, - to: pos + node.nodeSize, - mark - }))); - }); - } - return marks; -} -function getSplittedAttributes(extensionAttributes, typeName, attributes) { - return Object.fromEntries(Object.entries(attributes).filter(([name]) => { - const extensionAttribute = extensionAttributes.find((item) => { - return item.type === typeName && item.name === name; - }); - if (!extensionAttribute) { - return false; - } - return extensionAttribute.attribute.keepOnSplit; - })); -} -function isMarkActive(state, typeOrName, attributes = {}) { - const { empty: empty2, ranges } = state.selection; - const type = typeOrName ? getMarkType(typeOrName, state.schema) : null; - if (empty2) { - return !!(state.storedMarks || state.selection.$from.marks()).filter((mark) => { - if (!type) { - return true; - } - return type.name === mark.type.name; - }).find((mark) => objectIncludes(mark.attrs, attributes, { strict: false })); - } - let selectionRange = 0; - const markRanges = []; - ranges.forEach(({ $from, $to }) => { - const from2 = $from.pos; - const to = $to.pos; - state.doc.nodesBetween(from2, to, (node, pos) => { - if (!node.isText && !node.marks.length) { - return; - } - const relativeFrom = Math.max(from2, pos); - const relativeTo = Math.min(to, pos + node.nodeSize); - const range2 = relativeTo - relativeFrom; - selectionRange += range2; - markRanges.push(...node.marks.map((mark) => ({ - mark, - from: relativeFrom, - to: relativeTo - }))); - }); - }); - if (selectionRange === 0) { - return false; - } - const matchedRange = markRanges.filter((markRange) => { - if (!type) { - return true; - } - return type.name === markRange.mark.type.name; - }).filter((markRange) => objectIncludes(markRange.mark.attrs, attributes, { strict: false })).reduce((sum, markRange) => sum + markRange.to - markRange.from, 0); - const excludedRange = markRanges.filter((markRange) => { - if (!type) { - return true; - } - return markRange.mark.type !== type && markRange.mark.type.excludes(type); - }).reduce((sum, markRange) => sum + markRange.to - markRange.from, 0); - const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange; - return range >= selectionRange; -} -function isActive(state, name, attributes = {}) { - if (!name) { - return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes); - } - const schemaType = getSchemaTypeNameByName(name, state.schema); - if (schemaType === "node") { - return isNodeActive(state, name, attributes); - } - if (schemaType === "mark") { - return isMarkActive(state, name, attributes); - } - return false; -} -function isList(name, extensions2) { - const { nodeExtensions } = splitExtensions(extensions2); - const extension = nodeExtensions.find((item) => item.name === name); - if (!extension) { - return false; - } - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - const group = callOrReturn(getExtensionField(extension, "group", context)); - if (typeof group !== "string") { - return false; - } - return group.split(" ").includes("list"); -} -function isNodeEmpty(node) { - var _a; - const defaultContent = (_a = node.type.createAndFill()) === null || _a === void 0 ? void 0 : _a.toJSON(); - const content = node.toJSON(); - return JSON.stringify(defaultContent) === JSON.stringify(content); -} -function isNodeSelection(value) { - return value instanceof NodeSelection; -} -function posToDOMRect(view, from2, to) { - const minPos = 0; - const maxPos = view.state.doc.content.size; - const resolvedFrom = minMax(from2, minPos, maxPos); - const resolvedEnd = minMax(to, minPos, maxPos); - const start2 = view.coordsAtPos(resolvedFrom); - const end2 = view.coordsAtPos(resolvedEnd, -1); - const top2 = Math.min(start2.top, end2.top); - const bottom2 = Math.max(start2.bottom, end2.bottom); - const left2 = Math.min(start2.left, end2.left); - const right2 = Math.max(start2.right, end2.right); - const width = right2 - left2; - const height = bottom2 - top2; - const x = left2; - const y = top2; - const data = { - top: top2, - bottom: bottom2, - left: left2, - right: right2, - width, - height, - x, - y - }; - return { - ...data, - toJSON: () => data - }; -} -function canSetMark(state, tr2, newMarkType) { - var _a; - const { selection } = tr2; - let cursor = null; - if (isTextSelection(selection)) { - cursor = selection.$cursor; - } - if (cursor) { - const currentMarks = (_a = state.storedMarks) !== null && _a !== void 0 ? _a : cursor.marks(); - return !!newMarkType.isInSet(currentMarks) || !currentMarks.some((mark) => mark.type.excludes(newMarkType)); - } - const { ranges } = selection; - return ranges.some(({ $from, $to }) => { - let someNodeSupportsMark = $from.depth === 0 ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType) : false; - state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => { - if (someNodeSupportsMark) { - return false; - } - if (node.isInline) { - const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType); - const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks) || !node.marks.some((otherMark) => otherMark.type.excludes(newMarkType)); - someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType; - } - return !someNodeSupportsMark; - }); - return someNodeSupportsMark; - }); -} -var setMark = (typeOrName, attributes = {}) => ({ tr: tr2, state, dispatch }) => { - const { selection } = tr2; - const { empty: empty2, ranges } = selection; - const type = getMarkType(typeOrName, state.schema); - if (dispatch) { - if (empty2) { - const oldAttributes = getMarkAttributes(state, type); - tr2.addStoredMark(type.create({ - ...oldAttributes, - ...attributes - })); - } else { - ranges.forEach((range) => { - const from2 = range.$from.pos; - const to = range.$to.pos; - state.doc.nodesBetween(from2, to, (node, pos) => { - const trimmedFrom = Math.max(pos, from2); - const trimmedTo = Math.min(pos + node.nodeSize, to); - const someHasMark = node.marks.find((mark) => mark.type === type); - if (someHasMark) { - node.marks.forEach((mark) => { - if (type === mark.type) { - tr2.addMark(trimmedFrom, trimmedTo, type.create({ - ...mark.attrs, - ...attributes - })); - } - }); - } else { - tr2.addMark(trimmedFrom, trimmedTo, type.create(attributes)); - } - }); - }); - } - } - return canSetMark(state, tr2, type); -}; -var setMeta = (key, value) => ({ tr: tr2 }) => { - tr2.setMeta(key, value); - return true; -}; -var setNode = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => { - const type = getNodeType(typeOrName, state.schema); - if (!type.isTextblock) { - console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'); - return false; - } - return chain().command(({ commands: commands2 }) => { - const canSetBlock = setBlockType2(type, attributes)(state); - if (canSetBlock) { - return true; - } - return commands2.clearNodes(); - }).command(({ state: updatedState }) => { - return setBlockType2(type, attributes)(updatedState, dispatch); - }).run(); -}; -var setNodeSelection = (position) => ({ tr: tr2, dispatch }) => { - if (dispatch) { - const { doc: doc3 } = tr2; - const from2 = minMax(position, 0, doc3.content.size); - const selection = NodeSelection.create(doc3, from2); - tr2.setSelection(selection); - } - return true; -}; -var setTextSelection = (position) => ({ tr: tr2, dispatch }) => { - if (dispatch) { - const { doc: doc3 } = tr2; - const { from: from2, to } = typeof position === "number" ? { from: position, to: position } : position; - const minPos = TextSelection.atStart(doc3).from; - const maxPos = TextSelection.atEnd(doc3).to; - const resolvedFrom = minMax(from2, minPos, maxPos); - const resolvedEnd = minMax(to, minPos, maxPos); - const selection = TextSelection.create(doc3, resolvedFrom, resolvedEnd); - tr2.setSelection(selection); - } - return true; -}; -var sinkListItem2 = (typeOrName) => ({ state, dispatch }) => { - const type = getNodeType(typeOrName, state.schema); - return sinkListItem(type)(state, dispatch); -}; -function ensureMarks(state, splittableMarks) { - const marks = state.storedMarks || state.selection.$to.parentOffset && state.selection.$from.marks(); - if (marks) { - const filteredMarks = marks.filter((mark) => splittableMarks === null || splittableMarks === void 0 ? void 0 : splittableMarks.includes(mark.type.name)); - state.tr.ensureMarks(filteredMarks); - } -} -var splitBlock2 = ({ keepMarks = true } = {}) => ({ tr: tr2, state, dispatch, editor }) => { - const { selection, doc: doc3 } = tr2; - const { $from, $to } = selection; - const extensionAttributes = editor.extensionManager.attributes; - const newAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs); - if (selection instanceof NodeSelection && selection.node.isBlock) { - if (!$from.parentOffset || !canSplit(doc3, $from.pos)) { - return false; - } - if (dispatch) { - if (keepMarks) { - ensureMarks(state, editor.extensionManager.splittableMarks); - } - tr2.split($from.pos).scrollIntoView(); - } - return true; - } - if (!$from.parent.isBlock) { - return false; - } - if (dispatch) { - const atEnd = $to.parentOffset === $to.parent.content.size; - if (selection instanceof TextSelection) { - tr2.deleteSelection(); - } - const deflt = $from.depth === 0 ? void 0 : defaultBlockAt2($from.node(-1).contentMatchAt($from.indexAfter(-1))); - let types = atEnd && deflt ? [ - { - type: deflt, - attrs: newAttributes - } - ] : void 0; - let can = canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, types); - if (!types && !can && canSplit(tr2.doc, tr2.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : void 0)) { - can = true; - types = deflt ? [ - { - type: deflt, - attrs: newAttributes - } - ] : void 0; - } - if (can) { - tr2.split(tr2.mapping.map($from.pos), 1, types); - if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) { - const first2 = tr2.mapping.map($from.before()); - const $first = tr2.doc.resolve(first2); - if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) { - tr2.setNodeMarkup(tr2.mapping.map($from.before()), deflt); - } - } - } - if (keepMarks) { - ensureMarks(state, editor.extensionManager.splittableMarks); - } - tr2.scrollIntoView(); - } - return true; -}; -var splitListItem = (typeOrName) => ({ tr: tr2, state, dispatch, editor }) => { - var _a; - const type = getNodeType(typeOrName, state.schema); - const { $from, $to } = state.selection; - const node = state.selection.node; - if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) { - return false; - } - const grandParent = $from.node(-1); - if (grandParent.type !== type) { - return false; - } - const extensionAttributes = editor.extensionManager.attributes; - if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) { - if ($from.depth === 2 || $from.node(-3).type !== type || $from.index(-2) !== $from.node(-2).childCount - 1) { - return false; - } - if (dispatch) { - let wrap2 = Fragment.empty; - const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3; - for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) { - wrap2 = Fragment.from($from.node(d).copy(wrap2)); - } - const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3; - const newNextTypeAttributes2 = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs); - const nextType2 = ((_a = type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.createAndFill(newNextTypeAttributes2)) || void 0; - wrap2 = wrap2.append(Fragment.from(type.createAndFill(null, nextType2) || void 0)); - const start2 = $from.before($from.depth - (depthBefore - 1)); - tr2.replace(start2, $from.after(-depthAfter), new Slice(wrap2, 4 - depthBefore, 0)); - let sel = -1; - tr2.doc.nodesBetween(start2, tr2.doc.content.size, (n, pos) => { - if (sel > -1) { - return false; - } - if (n.isTextblock && n.content.size === 0) { - sel = pos + 1; - } - }); - if (sel > -1) { - tr2.setSelection(TextSelection.near(tr2.doc.resolve(sel))); - } - tr2.scrollIntoView(); - } - return true; - } - const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null; - const newTypeAttributes = getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs); - const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs); - tr2.delete($from.pos, $to.pos); - const types = nextType ? [ - { type, attrs: newTypeAttributes }, - { type: nextType, attrs: newNextTypeAttributes } - ] : [{ type, attrs: newTypeAttributes }]; - if (!canSplit(tr2.doc, $from.pos, 2)) { - return false; - } - if (dispatch) { - const { selection, storedMarks } = state; - const { splittableMarks } = editor.extensionManager; - const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); - tr2.split($from.pos, 2, types).scrollIntoView(); - if (!marks || !dispatch) { - return true; - } - const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); - tr2.ensureMarks(filteredMarks); - } - return true; -}; -var joinListBackwards = (tr2, listType) => { - const list = findParentNode((node) => node.type === listType)(tr2.selection); - if (!list) { - return true; - } - const before = tr2.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth); - if (before === void 0) { - return true; - } - const nodeBefore = tr2.doc.nodeAt(before); - const canJoinBackwards = list.node.type === (nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.type) && canJoin(tr2.doc, list.pos); - if (!canJoinBackwards) { - return true; - } - tr2.join(list.pos); - return true; -}; -var joinListForwards = (tr2, listType) => { - const list = findParentNode((node) => node.type === listType)(tr2.selection); - if (!list) { - return true; - } - const after = tr2.doc.resolve(list.start).after(list.depth); - if (after === void 0) { - return true; - } - const nodeAfter = tr2.doc.nodeAt(after); - const canJoinForwards = list.node.type === (nodeAfter === null || nodeAfter === void 0 ? void 0 : nodeAfter.type) && canJoin(tr2.doc, after); - if (!canJoinForwards) { - return true; - } - tr2.join(after); - return true; -}; -var toggleList = (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) => ({ editor, tr: tr2, state, dispatch, chain, commands: commands2, can }) => { - const { extensions: extensions2, splittableMarks } = editor.extensionManager; - const listType = getNodeType(listTypeOrName, state.schema); - const itemType = getNodeType(itemTypeOrName, state.schema); - const { selection, storedMarks } = state; - const { $from, $to } = selection; - const range = $from.blockRange($to); - const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); - if (!range) { - return false; - } - const parentList = findParentNode((node) => isList(node.type.name, extensions2))(selection); - if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) { - if (parentList.node.type === listType) { - return commands2.liftListItem(itemType); - } - if (isList(parentList.node.type.name, extensions2) && listType.validContent(parentList.node.content) && dispatch) { - return chain().command(() => { - tr2.setNodeMarkup(parentList.pos, listType); - return true; - }).command(() => joinListBackwards(tr2, listType)).command(() => joinListForwards(tr2, listType)).run(); - } - } - if (!keepMarks || !marks || !dispatch) { - return chain().command(() => { - const canWrapInList = can().wrapInList(listType, attributes); - if (canWrapInList) { - return true; - } - return commands2.clearNodes(); - }).wrapInList(listType, attributes).command(() => joinListBackwards(tr2, listType)).command(() => joinListForwards(tr2, listType)).run(); - } - return chain().command(() => { - const canWrapInList = can().wrapInList(listType, attributes); - const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); - tr2.ensureMarks(filteredMarks); - if (canWrapInList) { - return true; - } - return commands2.clearNodes(); - }).wrapInList(listType, attributes).command(() => joinListBackwards(tr2, listType)).command(() => joinListForwards(tr2, listType)).run(); -}; -var toggleMark = (typeOrName, attributes = {}, options = {}) => ({ state, commands: commands2 }) => { - const { extendEmptyMarkRange = false } = options; - const type = getMarkType(typeOrName, state.schema); - const isActive2 = isMarkActive(state, type, attributes); - if (isActive2) { - return commands2.unsetMark(type, { extendEmptyMarkRange }); - } - return commands2.setMark(type, attributes); -}; -var toggleNode = (typeOrName, toggleTypeOrName, attributes = {}) => ({ state, commands: commands2 }) => { - const type = getNodeType(typeOrName, state.schema); - const toggleType = getNodeType(toggleTypeOrName, state.schema); - const isActive2 = isNodeActive(state, type, attributes); - if (isActive2) { - return commands2.setNode(toggleType); - } - return commands2.setNode(type, attributes); -}; -var toggleWrap = (typeOrName, attributes = {}) => ({ state, commands: commands2 }) => { - const type = getNodeType(typeOrName, state.schema); - const isActive2 = isNodeActive(state, type, attributes); - if (isActive2) { - return commands2.lift(type); - } - return commands2.wrapIn(type, attributes); -}; -var undoInputRule = () => ({ state, dispatch }) => { - const plugins = state.plugins; - for (let i = 0; i < plugins.length; i += 1) { - const plugin = plugins[i]; - let undoable; - if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) { - if (dispatch) { - const tr2 = state.tr; - const toUndo = undoable.transform; - for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) { - tr2.step(toUndo.steps[j].invert(toUndo.docs[j])); - } - if (undoable.text) { - const marks = tr2.doc.resolve(undoable.from).marks(); - tr2.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks)); - } else { - tr2.delete(undoable.from, undoable.to); - } - } - return true; - } - } - return false; -}; -var unsetAllMarks = () => ({ tr: tr2, dispatch }) => { - const { selection } = tr2; - const { empty: empty2, ranges } = selection; - if (empty2) { - return true; - } - if (dispatch) { - ranges.forEach((range) => { - tr2.removeMark(range.$from.pos, range.$to.pos); - }); - } - return true; -}; -var unsetMark = (typeOrName, options = {}) => ({ tr: tr2, state, dispatch }) => { - var _a; - const { extendEmptyMarkRange = false } = options; - const { selection } = tr2; - const type = getMarkType(typeOrName, state.schema); - const { $from, empty: empty2, ranges } = selection; - if (!dispatch) { - return true; - } - if (empty2 && extendEmptyMarkRange) { - let { from: from2, to } = selection; - const attrs = (_a = $from.marks().find((mark) => mark.type === type)) === null || _a === void 0 ? void 0 : _a.attrs; - const range = getMarkRange($from, type, attrs); - if (range) { - from2 = range.from; - to = range.to; - } - tr2.removeMark(from2, to, type); - } else { - ranges.forEach((range) => { - tr2.removeMark(range.$from.pos, range.$to.pos, type); - }); - } - tr2.removeStoredMark(type); - return true; -}; -var updateAttributes = (typeOrName, attributes = {}) => ({ tr: tr2, state, dispatch }) => { - let nodeType = null; - let markType = null; - const schemaType = getSchemaTypeNameByName(typeof typeOrName === "string" ? typeOrName : typeOrName.name, state.schema); - if (!schemaType) { - return false; - } - if (schemaType === "node") { - nodeType = getNodeType(typeOrName, state.schema); - } - if (schemaType === "mark") { - markType = getMarkType(typeOrName, state.schema); - } - if (dispatch) { - tr2.selection.ranges.forEach((range) => { - const from2 = range.$from.pos; - const to = range.$to.pos; - state.doc.nodesBetween(from2, to, (node, pos) => { - if (nodeType && nodeType === node.type) { - tr2.setNodeMarkup(pos, void 0, { - ...node.attrs, - ...attributes - }); - } - if (markType && node.marks.length) { - node.marks.forEach((mark) => { - if (markType === mark.type) { - const trimmedFrom = Math.max(pos, from2); - const trimmedTo = Math.min(pos + node.nodeSize, to); - tr2.addMark(trimmedFrom, trimmedTo, markType.create({ - ...mark.attrs, - ...attributes - })); - } - }); - } - }); - }); - } - return true; -}; -var wrapIn2 = (typeOrName, attributes = {}) => ({ state, dispatch }) => { - const type = getNodeType(typeOrName, state.schema); - return wrapIn(type, attributes)(state, dispatch); -}; -var wrapInList2 = (typeOrName, attributes = {}) => ({ state, dispatch }) => { - const type = getNodeType(typeOrName, state.schema); - return wrapInList(type, attributes)(state, dispatch); -}; -var commands = /* @__PURE__ */ Object.freeze({ - __proto__: null, - blur, - clearContent, - clearNodes, - command, - createParagraphNear: createParagraphNear2, - cut, - deleteCurrentNode, - deleteNode, - deleteRange: deleteRange2, - deleteSelection: deleteSelection2, - enter, - exitCode: exitCode2, - extendMarkRange, - first, - focus, - forEach, - insertContent, - insertContentAt, - joinUp: joinUp2, - joinDown: joinDown2, - joinBackward: joinBackward2, - joinForward: joinForward2, - joinItemBackward, - joinItemForward, - keyboardShortcut, - lift: lift3, - liftEmptyBlock: liftEmptyBlock2, - liftListItem: liftListItem2, - newlineInCode: newlineInCode2, - resetAttributes, - scrollIntoView, - selectAll: selectAll2, - selectNodeBackward: selectNodeBackward2, - selectNodeForward: selectNodeForward2, - selectParentNode: selectParentNode2, - selectTextblockEnd: selectTextblockEnd2, - selectTextblockStart: selectTextblockStart2, - setContent, - setMark, - setMeta, - setNode, - setNodeSelection, - setTextSelection, - sinkListItem: sinkListItem2, - splitBlock: splitBlock2, - splitListItem, - toggleList, - toggleMark, - toggleNode, - toggleWrap, - undoInputRule, - unsetAllMarks, - unsetMark, - updateAttributes, - wrapIn: wrapIn2, - wrapInList: wrapInList2 -}); -var Commands = Extension.create({ - name: "commands", - addCommands() { - return { - ...commands - }; - } -}); -var Editable = Extension.create({ - name: "editable", - addProseMirrorPlugins() { - return [ - new Plugin({ - key: new PluginKey("editable"), - props: { - editable: () => this.editor.options.editable - } - }) - ]; - } -}); -var FocusEvents = Extension.create({ - name: "focusEvents", - addProseMirrorPlugins() { - const { editor } = this; - return [ - new Plugin({ - key: new PluginKey("focusEvents"), - props: { - handleDOMEvents: { - focus: (view, event) => { - editor.isFocused = true; - const transaction = editor.state.tr.setMeta("focus", { event }).setMeta("addToHistory", false); - view.dispatch(transaction); - return false; - }, - blur: (view, event) => { - editor.isFocused = false; - const transaction = editor.state.tr.setMeta("blur", { event }).setMeta("addToHistory", false); - view.dispatch(transaction); - return false; - } - } - } - }) - ]; - } -}); -var Keymap = Extension.create({ - name: "keymap", - addKeyboardShortcuts() { - const handleBackspace = () => this.editor.commands.first(({ commands: commands2 }) => [ - () => commands2.undoInputRule(), - // maybe convert first text block node to default node - () => commands2.command(({ tr: tr2 }) => { - const { selection, doc: doc3 } = tr2; - const { empty: empty2, $anchor } = selection; - const { pos, parent } = $anchor; - const $parentPos = $anchor.parent.isTextblock ? tr2.doc.resolve(pos - 1) : $anchor; - const parentIsIsolating = $parentPos.parent.type.spec.isolating; - const parentPos = $anchor.pos - $anchor.parentOffset; - const isAtStart = parentIsIsolating && $parentPos.parent.childCount === 1 ? parentPos === $anchor.pos : Selection.atStart(doc3).from === pos; - if (!empty2 || !isAtStart || !parent.type.isTextblock || parent.textContent.length) { - return false; - } - return commands2.clearNodes(); - }), - () => commands2.deleteSelection(), - () => commands2.joinBackward(), - () => commands2.selectNodeBackward() - ]); - const handleDelete = () => this.editor.commands.first(({ commands: commands2 }) => [ - () => commands2.deleteSelection(), - () => commands2.deleteCurrentNode(), - () => commands2.joinForward(), - () => commands2.selectNodeForward() - ]); - const handleEnter = () => this.editor.commands.first(({ commands: commands2 }) => [ - () => commands2.newlineInCode(), - () => commands2.createParagraphNear(), - () => commands2.liftEmptyBlock(), - () => commands2.splitBlock() - ]); - const baseKeymap = { - Enter: handleEnter, - "Mod-Enter": () => this.editor.commands.exitCode(), - Backspace: handleBackspace, - "Mod-Backspace": handleBackspace, - "Shift-Backspace": handleBackspace, - Delete: handleDelete, - "Mod-Delete": handleDelete, - "Mod-a": () => this.editor.commands.selectAll() - }; - const pcKeymap = { - ...baseKeymap - }; - const macKeymap = { - ...baseKeymap, - "Ctrl-h": handleBackspace, - "Alt-Backspace": handleBackspace, - "Ctrl-d": handleDelete, - "Ctrl-Alt-Backspace": handleDelete, - "Alt-Delete": handleDelete, - "Alt-d": handleDelete, - "Ctrl-a": () => this.editor.commands.selectTextblockStart(), - "Ctrl-e": () => this.editor.commands.selectTextblockEnd() - }; - if (isiOS() || isMacOS()) { - return macKeymap; - } - return pcKeymap; - }, - addProseMirrorPlugins() { - return [ - // With this plugin we check if the whole document was selected and deleted. - // In this case we will additionally call `clearNodes()` to convert e.g. a heading - // to a paragraph if necessary. - // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well - // with many other commands. - new Plugin({ - key: new PluginKey("clearDocument"), - appendTransaction: (transactions, oldState, newState) => { - const docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc); - if (!docChanges) { - return; - } - const { empty: empty2, from: from2, to } = oldState.selection; - const allFrom = Selection.atStart(oldState.doc).from; - const allEnd = Selection.atEnd(oldState.doc).to; - const allWasSelected = from2 === allFrom && to === allEnd; - if (empty2 || !allWasSelected) { - return; - } - const isEmpty2 = newState.doc.textBetween(0, newState.doc.content.size, " ", " ").length === 0; - if (!isEmpty2) { - return; - } - const tr2 = newState.tr; - const state = createChainableState({ - state: newState, - transaction: tr2 - }); - const { commands: commands2 } = new CommandManager({ - editor: this.editor, - state - }); - commands2.clearNodes(); - if (!tr2.steps.length) { - return; - } - return tr2; - } - }) - ]; - } -}); -var Tabindex = Extension.create({ - name: "tabindex", - addProseMirrorPlugins() { - return [ - new Plugin({ - key: new PluginKey("tabindex"), - props: { - attributes: this.editor.isEditable ? { tabindex: "0" } : {} - } - }) - ]; - } -}); -var extensions = /* @__PURE__ */ Object.freeze({ - __proto__: null, - ClipboardTextSerializer, - Commands, - Editable, - FocusEvents, - Keymap, - Tabindex -}); -var style = `.ProseMirror { - position: relative; -} - -.ProseMirror { - word-wrap: break-word; - white-space: pre-wrap; - white-space: break-spaces; - -webkit-font-variant-ligatures: none; - font-variant-ligatures: none; - font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ -} - -.ProseMirror [contenteditable="false"] { - white-space: normal; -} - -.ProseMirror [contenteditable="false"] [contenteditable="true"] { - white-space: pre-wrap; -} - -.ProseMirror pre { - white-space: pre-wrap; -} - -img.ProseMirror-separator { - display: inline !important; - border: none !important; - margin: 0 !important; - width: 1px !important; - height: 1px !important; -} - -.ProseMirror-gapcursor { - display: none; - pointer-events: none; - position: absolute; - margin: 0; -} - -.ProseMirror-gapcursor:after { - content: ""; - display: block; - position: absolute; - top: -2px; - width: 20px; - border-top: 1px solid black; - animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; -} - -@keyframes ProseMirror-cursor-blink { - to { - visibility: hidden; - } -} - -.ProseMirror-hideselection *::selection { - background: transparent; -} - -.ProseMirror-hideselection *::-moz-selection { - background: transparent; -} - -.ProseMirror-hideselection * { - caret-color: transparent; -} - -.ProseMirror-focused .ProseMirror-gapcursor { - display: block; -} - -.tippy-box[data-animation=fade][data-state=hidden] { - opacity: 0 -}`; -function createStyleTag(style2, nonce, suffix) { - const tiptapStyleTag = document.querySelector(`style[data-tiptap-style${suffix ? `-${suffix}` : ""}]`); - if (tiptapStyleTag !== null) { - return tiptapStyleTag; - } - const styleNode = document.createElement("style"); - if (nonce) { - styleNode.setAttribute("nonce", nonce); - } - styleNode.setAttribute(`data-tiptap-style${suffix ? `-${suffix}` : ""}`, ""); - styleNode.innerHTML = style2; - document.getElementsByTagName("head")[0].appendChild(styleNode); - return styleNode; -} -var Editor = class extends EventEmitter { - constructor(options = {}) { - super(); - this.isFocused = false; - this.extensionStorage = {}; - this.options = { - element: document.createElement("div"), - content: "", - injectCSS: true, - injectNonce: void 0, - extensions: [], - autofocus: false, - editable: true, - editorProps: {}, - parseOptions: {}, - enableInputRules: true, - enablePasteRules: true, - enableCoreExtensions: true, - onBeforeCreate: () => null, - onCreate: () => null, - onUpdate: () => null, - onSelectionUpdate: () => null, - onTransaction: () => null, - onFocus: () => null, - onBlur: () => null, - onDestroy: () => null - }; - this.isCapturingTransaction = false; - this.capturedTransaction = null; - this.setOptions(options); - this.createExtensionManager(); - this.createCommandManager(); - this.createSchema(); - this.on("beforeCreate", this.options.onBeforeCreate); - this.emit("beforeCreate", { editor: this }); - this.createView(); - this.injectCSS(); - this.on("create", this.options.onCreate); - this.on("update", this.options.onUpdate); - this.on("selectionUpdate", this.options.onSelectionUpdate); - this.on("transaction", this.options.onTransaction); - this.on("focus", this.options.onFocus); - this.on("blur", this.options.onBlur); - this.on("destroy", this.options.onDestroy); - window.setTimeout(() => { - if (this.isDestroyed) { - return; - } - this.commands.focus(this.options.autofocus); - this.emit("create", { editor: this }); - }, 0); - } - /** - * Returns the editor storage. - */ - get storage() { - return this.extensionStorage; - } - /** - * An object of all registered commands. - */ - get commands() { - return this.commandManager.commands; - } - /** - * Create a command chain to call multiple commands at once. - */ - chain() { - return this.commandManager.chain(); - } - /** - * Check if a command or a command chain can be executed. Without executing it. - */ - can() { - return this.commandManager.can(); - } - /** - * Inject CSS styles. - */ - injectCSS() { - if (this.options.injectCSS && document) { - this.css = createStyleTag(style, this.options.injectNonce); - } - } - /** - * Update editor options. - * - * @param options A list of options - */ - setOptions(options = {}) { - this.options = { - ...this.options, - ...options - }; - if (!this.view || !this.state || this.isDestroyed) { - return; - } - if (this.options.editorProps) { - this.view.setProps(this.options.editorProps); - } - this.view.updateState(this.state); - } - /** - * Update editable state of the editor. - */ - setEditable(editable, emitUpdate = true) { - this.setOptions({ editable }); - if (emitUpdate) { - this.emit("update", { editor: this, transaction: this.state.tr }); - } - } - /** - * Returns whether the editor is editable. - */ - get isEditable() { - return this.options.editable && this.view && this.view.editable; - } - /** - * Returns the editor state. - */ - get state() { - return this.view.state; - } - /** - * Register a ProseMirror plugin. - * - * @param plugin A ProseMirror plugin - * @param handlePlugins Control how to merge the plugin into the existing plugins. - */ - registerPlugin(plugin, handlePlugins) { - const plugins = isFunction(handlePlugins) ? handlePlugins(plugin, [...this.state.plugins]) : [...this.state.plugins, plugin]; - const state = this.state.reconfigure({ plugins }); - this.view.updateState(state); - } - /** - * Unregister a ProseMirror plugin. - * - * @param nameOrPluginKey The plugins name - */ - unregisterPlugin(nameOrPluginKey) { - if (this.isDestroyed) { - return; - } - const name = typeof nameOrPluginKey === "string" ? `${nameOrPluginKey}$` : nameOrPluginKey.key; - const state = this.state.reconfigure({ - // @ts-ignore - plugins: this.state.plugins.filter((plugin) => !plugin.key.startsWith(name)) - }); - this.view.updateState(state); - } - /** - * Creates an extension manager. - */ - createExtensionManager() { - const coreExtensions2 = this.options.enableCoreExtensions ? Object.values(extensions) : []; - const allExtensions = [...coreExtensions2, ...this.options.extensions].filter((extension) => { - return ["extension", "node", "mark"].includes(extension === null || extension === void 0 ? void 0 : extension.type); - }); - this.extensionManager = new ExtensionManager(allExtensions, this); - } - /** - * Creates an command manager. - */ - createCommandManager() { - this.commandManager = new CommandManager({ - editor: this - }); - } - /** - * Creates a ProseMirror schema. - */ - createSchema() { - this.schema = this.extensionManager.schema; - } - /** - * Creates a ProseMirror view. - */ - createView() { - const doc3 = createDocument(this.options.content, this.schema, this.options.parseOptions); - const selection = resolveFocusPosition(doc3, this.options.autofocus); - this.view = new EditorView(this.options.element, { - ...this.options.editorProps, - dispatchTransaction: this.dispatchTransaction.bind(this), - state: EditorState.create({ - doc: doc3, - selection: selection || void 0 - }) - }); - const newState = this.state.reconfigure({ - plugins: this.extensionManager.plugins - }); - this.view.updateState(newState); - this.createNodeViews(); - this.prependClass(); - const dom = this.view.dom; - dom.editor = this; - } - /** - * Creates all node views. - */ - createNodeViews() { - this.view.setProps({ - nodeViews: this.extensionManager.nodeViews - }); - } - /** - * Prepend class name to element. - */ - prependClass() { - this.view.dom.className = `tiptap ${this.view.dom.className}`; - } - captureTransaction(fn2) { - this.isCapturingTransaction = true; - fn2(); - this.isCapturingTransaction = false; - const tr2 = this.capturedTransaction; - this.capturedTransaction = null; - return tr2; - } - /** - * The callback over which to send transactions (state updates) produced by the view. - * - * @param transaction An editor state transaction - */ - dispatchTransaction(transaction) { - if (this.view.isDestroyed) { - return; - } - if (this.isCapturingTransaction) { - if (!this.capturedTransaction) { - this.capturedTransaction = transaction; - return; - } - transaction.steps.forEach((step) => { - var _a; - return (_a = this.capturedTransaction) === null || _a === void 0 ? void 0 : _a.step(step); - }); - return; - } - const state = this.state.apply(transaction); - const selectionHasChanged = !this.state.selection.eq(state.selection); - this.view.updateState(state); - this.emit("transaction", { - editor: this, - transaction - }); - if (selectionHasChanged) { - this.emit("selectionUpdate", { - editor: this, - transaction - }); - } - const focus2 = transaction.getMeta("focus"); - const blur2 = transaction.getMeta("blur"); - if (focus2) { - this.emit("focus", { - editor: this, - event: focus2.event, - transaction - }); - } - if (blur2) { - this.emit("blur", { - editor: this, - event: blur2.event, - transaction - }); - } - if (!transaction.docChanged || transaction.getMeta("preventUpdate")) { - return; - } - this.emit("update", { - editor: this, - transaction - }); - } - /** - * Get attributes of the currently selected node or mark. - */ - getAttributes(nameOrType) { - return getAttributes(this.state, nameOrType); - } - isActive(nameOrAttributes, attributesOrUndefined) { - const name = typeof nameOrAttributes === "string" ? nameOrAttributes : null; - const attributes = typeof nameOrAttributes === "string" ? attributesOrUndefined : nameOrAttributes; - return isActive(this.state, name, attributes); - } - /** - * Get the document as JSON. - */ - getJSON() { - return this.state.doc.toJSON(); - } - /** - * Get the document as HTML. - */ - getHTML() { - return getHTMLFromFragment(this.state.doc.content, this.schema); - } - /** - * Get the document as text. - */ - getText(options) { - const { blockSeparator = "\n\n", textSerializers = {} } = options || {}; - return getText2(this.state.doc, { - blockSeparator, - textSerializers: { - ...getTextSerializersFromSchema(this.schema), - ...textSerializers - } - }); - } - /** - * Check if there is no content. - */ - get isEmpty() { - return isNodeEmpty(this.state.doc); - } - /** - * Get the number of characters for the current document. - * - * @deprecated - */ - getCharacterCount() { - console.warn('[tiptap warn]: "editor.getCharacterCount()" is deprecated. Please use "editor.storage.characterCount.characters()" instead.'); - return this.state.doc.content.size - 2; - } - /** - * Destroy the editor. - */ - destroy() { - this.emit("destroy"); - if (this.view) { - this.view.destroy(); - } - this.removeAllListeners(); - } - /** - * Check if the editor is already destroyed. - */ - get isDestroyed() { - var _a; - return !((_a = this.view) === null || _a === void 0 ? void 0 : _a.docView); - } -}; -function markInputRule(config) { - return new InputRule({ - find: config.find, - handler: ({ state, range, match }) => { - const attributes = callOrReturn(config.getAttributes, void 0, match); - if (attributes === false || attributes === null) { - return null; - } - const { tr: tr2 } = state; - const captureGroup = match[match.length - 1]; - const fullMatch = match[0]; - if (captureGroup) { - const startSpaces = fullMatch.search(/\S/); - const textStart = range.from + fullMatch.indexOf(captureGroup); - const textEnd = textStart + captureGroup.length; - const excludedMarks = getMarksBetween(range.from, range.to, state.doc).filter((item) => { - const excluded = item.mark.type.excluded; - return excluded.find((type) => type === config.type && type !== item.mark.type); - }).filter((item) => item.to > textStart); - if (excludedMarks.length) { - return null; - } - if (textEnd < range.to) { - tr2.delete(textEnd, range.to); - } - if (textStart > range.from) { - tr2.delete(range.from + startSpaces, textStart); - } - const markEnd = range.from + startSpaces + captureGroup.length; - tr2.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {})); - tr2.removeStoredMark(config.type); - } - } - }); -} -function nodeInputRule(config) { - return new InputRule({ - find: config.find, - handler: ({ state, range, match }) => { - const attributes = callOrReturn(config.getAttributes, void 0, match) || {}; - const { tr: tr2 } = state; - const start2 = range.from; - let end2 = range.to; - const newNode2 = config.type.create(attributes); - if (match[1]) { - const offset2 = match[0].lastIndexOf(match[1]); - let matchStart = start2 + offset2; - if (matchStart > end2) { - matchStart = end2; - } else { - end2 = matchStart + match[1].length; - } - const lastChar = match[0][match[0].length - 1]; - tr2.insertText(lastChar, start2 + match[0].length - 1); - tr2.replaceWith(matchStart, end2, newNode2); - } else if (match[0]) { - tr2.insert(start2 - 1, config.type.create(attributes)).delete(tr2.mapping.map(start2), tr2.mapping.map(end2)); - } - tr2.scrollIntoView(); - } - }); -} -function textblockTypeInputRule(config) { - return new InputRule({ - find: config.find, - handler: ({ state, range, match }) => { - const $start = state.doc.resolve(range.from); - const attributes = callOrReturn(config.getAttributes, void 0, match) || {}; - if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), config.type)) { - return null; - } - state.tr.delete(range.from, range.to).setBlockType(range.from, range.from, config.type, attributes); - } - }); -} -function wrappingInputRule(config) { - return new InputRule({ - find: config.find, - handler: ({ state, range, match, chain }) => { - const attributes = callOrReturn(config.getAttributes, void 0, match) || {}; - const tr2 = state.tr.delete(range.from, range.to); - const $start = tr2.doc.resolve(range.from); - const blockRange = $start.blockRange(); - const wrapping = blockRange && findWrapping(blockRange, config.type, attributes); - if (!wrapping) { - return null; - } - tr2.wrap(blockRange, wrapping); - if (config.keepMarks && config.editor) { - const { selection, storedMarks } = state; - const { splittableMarks } = config.editor.extensionManager; - const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); - if (marks) { - const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); - tr2.ensureMarks(filteredMarks); - } - } - if (config.keepAttributes) { - const nodeType = config.type.name === "bulletList" || config.type.name === "orderedList" ? "listItem" : "taskList"; - chain().updateAttributes(nodeType, attributes).run(); - } - const before = tr2.doc.resolve(range.from - 1).nodeBefore; - if (before && before.type === config.type && canJoin(tr2.doc, range.from - 1) && (!config.joinPredicate || config.joinPredicate(match, before))) { - tr2.join(range.from - 1); - } - } - }); -} -var Mark2 = class _Mark { - constructor(config = {}) { - this.type = "mark"; - this.name = "mark"; - this.parent = null; - this.child = null; - this.config = { - name: this.name, - defaultOptions: {} - }; - this.config = { - ...this.config, - ...config - }; - this.name = this.config.name; - if (config.defaultOptions) { - console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`); - } - this.options = this.config.defaultOptions; - if (this.config.addOptions) { - this.options = callOrReturn(getExtensionField(this, "addOptions", { - name: this.name - })); - } - this.storage = callOrReturn(getExtensionField(this, "addStorage", { - name: this.name, - options: this.options - })) || {}; - } - static create(config = {}) { - return new _Mark(config); - } - configure(options = {}) { - const extension = this.extend(); - extension.options = mergeDeep(this.options, options); - extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { - name: extension.name, - options: extension.options - })); - return extension; - } - extend(extendedConfig = {}) { - const extension = new _Mark(extendedConfig); - extension.parent = this; - this.child = extension; - extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name; - if (extendedConfig.defaultOptions) { - console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`); - } - extension.options = callOrReturn(getExtensionField(extension, "addOptions", { - name: extension.name - })); - extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { - name: extension.name, - options: extension.options - })); - return extension; - } - static handleExit({ editor, mark }) { - const { tr: tr2 } = editor.state; - const currentPos = editor.state.selection.$from; - const isAtEnd = currentPos.pos === currentPos.end(); - if (isAtEnd) { - const currentMarks = currentPos.marks(); - const isInMark = !!currentMarks.find((m) => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name); - if (!isInMark) { - return false; - } - const removeMark2 = currentMarks.find((m) => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name); - if (removeMark2) { - tr2.removeStoredMark(removeMark2); - } - tr2.insertText(" ", currentPos.pos); - editor.view.dispatch(tr2); - return true; - } - return false; - } -}; -var Node2 = class _Node { - constructor(config = {}) { - this.type = "node"; - this.name = "node"; - this.parent = null; - this.child = null; - this.config = { - name: this.name, - defaultOptions: {} - }; - this.config = { - ...this.config, - ...config - }; - this.name = this.config.name; - if (config.defaultOptions) { - console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`); - } - this.options = this.config.defaultOptions; - if (this.config.addOptions) { - this.options = callOrReturn(getExtensionField(this, "addOptions", { - name: this.name - })); - } - this.storage = callOrReturn(getExtensionField(this, "addStorage", { - name: this.name, - options: this.options - })) || {}; - } - static create(config = {}) { - return new _Node(config); - } - configure(options = {}) { - const extension = this.extend(); - extension.options = mergeDeep(this.options, options); - extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { - name: extension.name, - options: extension.options - })); - return extension; - } - extend(extendedConfig = {}) { - const extension = new _Node(extendedConfig); - extension.parent = this; - this.child = extension; - extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name; - if (extendedConfig.defaultOptions) { - console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${extension.name}".`); - } - extension.options = callOrReturn(getExtensionField(extension, "addOptions", { - name: extension.name - })); - extension.storage = callOrReturn(getExtensionField(extension, "addStorage", { - name: extension.name, - options: extension.options - })); - return extension; - } -}; -function markPasteRule(config) { - return new PasteRule({ - find: config.find, - handler: ({ state, range, match, pasteEvent }) => { - const attributes = callOrReturn(config.getAttributes, void 0, match, pasteEvent); - if (attributes === false || attributes === null) { - return null; - } - const { tr: tr2 } = state; - const captureGroup = match[match.length - 1]; - const fullMatch = match[0]; - let markEnd = range.to; - if (captureGroup) { - const startSpaces = fullMatch.search(/\S/); - const textStart = range.from + fullMatch.indexOf(captureGroup); - const textEnd = textStart + captureGroup.length; - const excludedMarks = getMarksBetween(range.from, range.to, state.doc).filter((item) => { - const excluded = item.mark.type.excluded; - return excluded.find((type) => type === config.type && type !== item.mark.type); - }).filter((item) => item.to > textStart); - if (excludedMarks.length) { - return null; - } - if (textEnd < range.to) { - tr2.delete(textEnd, range.to); - } - if (textStart > range.from) { - tr2.delete(range.from + startSpaces, textStart); - } - markEnd = range.from + startSpaces + captureGroup.length; - tr2.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {})); - tr2.removeStoredMark(config.type); - } - } - }); -} -function escapeForRegEx(string) { - return string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); -} - -// node_modules/@tiptap/extension-blockquote/dist/index.js -var inputRegex = /^\s*>\s$/; -var Blockquote = Node2.create({ - name: "blockquote", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - content: "block+", - group: "block", - defining: true, - parseHTML() { - return [ - { tag: "blockquote" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["blockquote", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setBlockquote: () => ({ commands: commands2 }) => { - return commands2.wrapIn(this.name); - }, - toggleBlockquote: () => ({ commands: commands2 }) => { - return commands2.toggleWrap(this.name); - }, - unsetBlockquote: () => ({ commands: commands2 }) => { - return commands2.lift(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Shift-b": () => this.editor.commands.toggleBlockquote() - }; - }, - addInputRules() { - return [ - wrappingInputRule({ - find: inputRegex, - type: this.type - }) - ]; - } -}); - -// node_modules/@tiptap/extension-bold/dist/index.js -var starInputRegex = /(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))$/; -var starPasteRegex = /(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))/g; -var underscoreInputRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))$/; -var underscorePasteRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))/g; -var Bold = Mark2.create({ - name: "bold", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "strong" - }, - { - tag: "b", - getAttrs: (node) => node.style.fontWeight !== "normal" && null - }, - { - style: "font-weight", - getAttrs: (value) => /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["strong", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setBold: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleBold: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetBold: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-b": () => this.editor.commands.toggleBold(), - "Mod-B": () => this.editor.commands.toggleBold() - }; - }, - addInputRules() { - return [ - markInputRule({ - find: starInputRegex, - type: this.type - }), - markInputRule({ - find: underscoreInputRegex, - type: this.type - }) - ]; - }, - addPasteRules() { - return [ - markPasteRule({ - find: starPasteRegex, - type: this.type - }), - markPasteRule({ - find: underscorePasteRegex, - type: this.type - }) - ]; - } -}); - -// node_modules/@tiptap/extension-bullet-list/dist/index.js -var ListItem = Node2.create({ - name: "listItem", - addOptions() { - return { - HTMLAttributes: {}, - bulletListTypeName: "bulletList", - orderedListTypeName: "orderedList" - }; - }, - content: "paragraph block*", - defining: true, - parseHTML() { - return [ - { - tag: "li" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addKeyboardShortcuts() { - return { - Enter: () => this.editor.commands.splitListItem(this.name), - Tab: () => this.editor.commands.sinkListItem(this.name), - "Shift-Tab": () => this.editor.commands.liftListItem(this.name) - }; - } -}); -var TextStyle = Mark2.create({ - name: "textStyle", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "span", - getAttrs: (element) => { - const hasStyles = element.hasAttribute("style"); - if (!hasStyles) { - return false; - } - return {}; - } - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - removeEmptyTextStyle: () => ({ state, commands: commands2 }) => { - const attributes = getMarkAttributes(state, this.type); - const hasStyles = Object.entries(attributes).some(([, value]) => !!value); - if (hasStyles) { - return true; - } - return commands2.unsetMark(this.name); - } - }; - } -}); -var inputRegex2 = /^\s*([-+*])\s$/; -var BulletList = Node2.create({ - name: "bulletList", - addOptions() { - return { - itemTypeName: "listItem", - HTMLAttributes: {}, - keepMarks: false, - keepAttributes: false - }; - }, - group: "block list", - content() { - return `${this.options.itemTypeName}+`; - }, - parseHTML() { - return [ - { tag: "ul" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["ul", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - toggleBulletList: () => ({ commands: commands2, chain }) => { - if (this.options.keepAttributes) { - return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem.name, this.editor.getAttributes(TextStyle.name)).run(); - } - return commands2.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Shift-8": () => this.editor.commands.toggleBulletList() - }; - }, - addInputRules() { - let inputRule = wrappingInputRule({ - find: inputRegex2, - type: this.type - }); - if (this.options.keepMarks || this.options.keepAttributes) { - inputRule = wrappingInputRule({ - find: inputRegex2, - type: this.type, - keepMarks: this.options.keepMarks, - keepAttributes: this.options.keepAttributes, - getAttributes: () => { - return this.editor.getAttributes(TextStyle.name); - }, - editor: this.editor - }); - } - return [ - inputRule - ]; - } -}); - -// node_modules/@tiptap/extension-code/dist/index.js -var inputRegex3 = /(?:^|\s)((?:`)((?:[^`]+))(?:`))$/; -var pasteRegex = /(?:^|\s)((?:`)((?:[^`]+))(?:`))/g; -var Code = Mark2.create({ - name: "code", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - excludes: "_", - code: true, - exitable: true, - parseHTML() { - return [ - { tag: "code" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["code", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setCode: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleCode: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetCode: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-e": () => this.editor.commands.toggleCode() - }; - }, - addInputRules() { - return [ - markInputRule({ - find: inputRegex3, - type: this.type - }) - ]; - }, - addPasteRules() { - return [ - markPasteRule({ - find: pasteRegex, - type: this.type - }) - ]; - } -}); - -// node_modules/@tiptap/extension-text-style/dist/index.js -var TextStyle2 = Mark2.create({ - name: "textStyle", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "span", - getAttrs: (element) => { - const hasStyles = element.hasAttribute("style"); - if (!hasStyles) { - return false; - } - return {}; - } - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - removeEmptyTextStyle: () => ({ state, commands: commands2 }) => { - const attributes = getMarkAttributes(state, this.type); - const hasStyles = Object.entries(attributes).some(([, value]) => !!value); - if (hasStyles) { - return true; - } - return commands2.unsetMark(this.name); - } - }; - } -}); - -// node_modules/@tiptap/extension-color/dist/index.js -var Color = Extension.create({ - name: "color", - addOptions() { - return { - types: ["textStyle"] - }; - }, - addGlobalAttributes() { - return [ - { - types: this.options.types, - attributes: { - color: { - default: null, - parseHTML: (element) => { - var _a; - return (_a = element.style.color) === null || _a === void 0 ? void 0 : _a.replace(/['"]+/g, ""); - }, - renderHTML: (attributes) => { - if (!attributes.color) { - return {}; - } - return { - style: `color: ${attributes.color}` - }; - } - } - } - } - ]; - }, - addCommands() { - return { - setColor: (color) => ({ chain }) => { - return chain().setMark("textStyle", { color }).run(); - }, - unsetColor: () => ({ chain }) => { - return chain().setMark("textStyle", { color: null }).removeEmptyTextStyle().run(); - } - }; - } -}); - -// node_modules/@tiptap/extension-document/dist/index.js -var Document = Node2.create({ - name: "doc", - topNode: true, - content: "block+" -}); - -// node_modules/prosemirror-dropcursor/dist/index.js -function dropCursor(options = {}) { - return new Plugin({ - view(editorView) { - return new DropCursorView(editorView, options); - } - }); -} -var DropCursorView = class { - constructor(editorView, options) { - var _a; - this.editorView = editorView; - this.cursorPos = null; - this.element = null; - this.timeout = -1; - this.width = (_a = options.width) !== null && _a !== void 0 ? _a : 1; - this.color = options.color === false ? void 0 : options.color || "black"; - this.class = options.class; - this.handlers = ["dragover", "dragend", "drop", "dragleave"].map((name) => { - let handler = (e) => { - this[name](e); - }; - editorView.dom.addEventListener(name, handler); - return { name, handler }; - }); - } - destroy() { - this.handlers.forEach(({ name, handler }) => this.editorView.dom.removeEventListener(name, handler)); - } - update(editorView, prevState) { - if (this.cursorPos != null && prevState.doc != editorView.state.doc) { - if (this.cursorPos > editorView.state.doc.content.size) - this.setCursor(null); - else - this.updateOverlay(); - } - } - setCursor(pos) { - if (pos == this.cursorPos) - return; - this.cursorPos = pos; - if (pos == null) { - this.element.parentNode.removeChild(this.element); - this.element = null; - } else { - this.updateOverlay(); - } - } - updateOverlay() { - let $pos = this.editorView.state.doc.resolve(this.cursorPos); - let isBlock = !$pos.parent.inlineContent, rect; - if (isBlock) { - let before = $pos.nodeBefore, after = $pos.nodeAfter; - if (before || after) { - let node = this.editorView.nodeDOM(this.cursorPos - (before ? before.nodeSize : 0)); - if (node) { - let nodeRect = node.getBoundingClientRect(); - let top2 = before ? nodeRect.bottom : nodeRect.top; - if (before && after) - top2 = (top2 + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2; - rect = { left: nodeRect.left, right: nodeRect.right, top: top2 - this.width / 2, bottom: top2 + this.width / 2 }; - } - } - } - if (!rect) { - let coords = this.editorView.coordsAtPos(this.cursorPos); - rect = { left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom }; - } - let parent = this.editorView.dom.offsetParent; - if (!this.element) { - this.element = parent.appendChild(document.createElement("div")); - if (this.class) - this.element.className = this.class; - this.element.style.cssText = "position: absolute; z-index: 50; pointer-events: none;"; - if (this.color) { - this.element.style.backgroundColor = this.color; - } - } - this.element.classList.toggle("prosemirror-dropcursor-block", isBlock); - this.element.classList.toggle("prosemirror-dropcursor-inline", !isBlock); - let parentLeft, parentTop; - if (!parent || parent == document.body && getComputedStyle(parent).position == "static") { - parentLeft = -pageXOffset; - parentTop = -pageYOffset; - } else { - let rect2 = parent.getBoundingClientRect(); - parentLeft = rect2.left - parent.scrollLeft; - parentTop = rect2.top - parent.scrollTop; - } - this.element.style.left = rect.left - parentLeft + "px"; - this.element.style.top = rect.top - parentTop + "px"; - this.element.style.width = rect.right - rect.left + "px"; - this.element.style.height = rect.bottom - rect.top + "px"; - } - scheduleRemoval(timeout) { - clearTimeout(this.timeout); - this.timeout = setTimeout(() => this.setCursor(null), timeout); - } - dragover(event) { - if (!this.editorView.editable) - return; - let pos = this.editorView.posAtCoords({ left: event.clientX, top: event.clientY }); - let node = pos && pos.inside >= 0 && this.editorView.state.doc.nodeAt(pos.inside); - let disableDropCursor = node && node.type.spec.disableDropCursor; - let disabled = typeof disableDropCursor == "function" ? disableDropCursor(this.editorView, pos, event) : disableDropCursor; - if (pos && !disabled) { - let target = pos.pos; - if (this.editorView.dragging && this.editorView.dragging.slice) { - let point = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice); - if (point != null) - target = point; - } - this.setCursor(target); - this.scheduleRemoval(5e3); - } - } - dragend() { - this.scheduleRemoval(20); - } - drop() { - this.scheduleRemoval(20); - } - dragleave(event) { - if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget)) - this.setCursor(null); - } -}; - -// node_modules/@tiptap/extension-dropcursor/dist/index.js -var Dropcursor = Extension.create({ - name: "dropCursor", - addOptions() { - return { - color: "currentColor", - width: 1, - class: void 0 - }; - }, - addProseMirrorPlugins() { - return [ - dropCursor(this.options) - ]; - } -}); - -// node_modules/prosemirror-gapcursor/dist/index.js -var GapCursor = class _GapCursor extends Selection { - /** - Create a gap cursor. - */ - constructor($pos) { - super($pos, $pos); - } - map(doc3, mapping) { - let $pos = doc3.resolve(mapping.map(this.head)); - return _GapCursor.valid($pos) ? new _GapCursor($pos) : Selection.near($pos); - } - content() { - return Slice.empty; - } - eq(other) { - return other instanceof _GapCursor && other.head == this.head; - } - toJSON() { - return { type: "gapcursor", pos: this.head }; - } - /** - @internal - */ - static fromJSON(doc3, json2) { - if (typeof json2.pos != "number") - throw new RangeError("Invalid input for GapCursor.fromJSON"); - return new _GapCursor(doc3.resolve(json2.pos)); - } - /** - @internal - */ - getBookmark() { - return new GapBookmark(this.anchor); - } - /** - @internal - */ - static valid($pos) { - let parent = $pos.parent; - if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) - return false; - let override = parent.type.spec.allowGapCursor; - if (override != null) - return override; - let deflt = parent.contentMatchAt($pos.index()).defaultType; - return deflt && deflt.isTextblock; - } - /** - @internal - */ - static findGapCursorFrom($pos, dir, mustMove = false) { - search: - for (; ; ) { - if (!mustMove && _GapCursor.valid($pos)) - return $pos; - let pos = $pos.pos, next = null; - for (let d = $pos.depth; ; d--) { - let parent = $pos.node(d); - if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) { - next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1); - break; - } else if (d == 0) { - return null; - } - pos += dir; - let $cur = $pos.doc.resolve(pos); - if (_GapCursor.valid($cur)) - return $cur; - } - for (; ; ) { - let inside = dir > 0 ? next.firstChild : next.lastChild; - if (!inside) { - if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) { - $pos = $pos.doc.resolve(pos + next.nodeSize * dir); - mustMove = false; - continue search; - } - break; - } - next = inside; - pos += dir; - let $cur = $pos.doc.resolve(pos); - if (_GapCursor.valid($cur)) - return $cur; - } - return null; - } - } -}; -GapCursor.prototype.visible = false; -GapCursor.findFrom = GapCursor.findGapCursorFrom; -Selection.jsonID("gapcursor", GapCursor); -var GapBookmark = class _GapBookmark { - constructor(pos) { - this.pos = pos; - } - map(mapping) { - return new _GapBookmark(mapping.map(this.pos)); - } - resolve(doc3) { - let $pos = doc3.resolve(this.pos); - return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos); - } -}; -function closedBefore($pos) { - for (let d = $pos.depth; d >= 0; d--) { - let index = $pos.index(d), parent = $pos.node(d); - if (index == 0) { - if (parent.type.spec.isolating) - return true; - continue; - } - for (let before = parent.child(index - 1); ; before = before.lastChild) { - if (before.childCount == 0 && !before.inlineContent || before.isAtom || before.type.spec.isolating) - return true; - if (before.inlineContent) - return false; - } - } - return true; -} -function closedAfter($pos) { - for (let d = $pos.depth; d >= 0; d--) { - let index = $pos.indexAfter(d), parent = $pos.node(d); - if (index == parent.childCount) { - if (parent.type.spec.isolating) - return true; - continue; - } - for (let after = parent.child(index); ; after = after.firstChild) { - if (after.childCount == 0 && !after.inlineContent || after.isAtom || after.type.spec.isolating) - return true; - if (after.inlineContent) - return false; - } - } - return true; -} -function gapCursor() { - return new Plugin({ - props: { - decorations: drawGapCursor, - createSelectionBetween(_view, $anchor, $head) { - return $anchor.pos == $head.pos && GapCursor.valid($head) ? new GapCursor($head) : null; - }, - handleClick, - handleKeyDown, - handleDOMEvents: { beforeinput } - } - }); -} -var handleKeyDown = keydownHandler({ - "ArrowLeft": arrow("horiz", -1), - "ArrowRight": arrow("horiz", 1), - "ArrowUp": arrow("vert", -1), - "ArrowDown": arrow("vert", 1) -}); -function arrow(axis, dir) { - const dirStr = axis == "vert" ? dir > 0 ? "down" : "up" : dir > 0 ? "right" : "left"; - return function(state, dispatch, view) { - let sel = state.selection; - let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty; - if (sel instanceof TextSelection) { - if (!view.endOfTextblock(dirStr) || $start.depth == 0) - return false; - mustMove = false; - $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before()); - } - let $found = GapCursor.findGapCursorFrom($start, dir, mustMove); - if (!$found) - return false; - if (dispatch) - dispatch(state.tr.setSelection(new GapCursor($found))); - return true; - }; -} -function handleClick(view, pos, event) { - if (!view || !view.editable) - return false; - let $pos = view.state.doc.resolve(pos); - if (!GapCursor.valid($pos)) - return false; - let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY }); - if (clickPos && clickPos.inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside))) - return false; - view.dispatch(view.state.tr.setSelection(new GapCursor($pos))); - return true; -} -function beforeinput(view, event) { - if (event.inputType != "insertCompositionText" || !(view.state.selection instanceof GapCursor)) - return false; - let { $from } = view.state.selection; - let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text); - if (!insert) - return false; - let frag = Fragment.empty; - for (let i = insert.length - 1; i >= 0; i--) - frag = Fragment.from(insert[i].createAndFill(null, frag)); - let tr2 = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0)); - tr2.setSelection(TextSelection.near(tr2.doc.resolve($from.pos + 1))); - view.dispatch(tr2); - return false; -} -function drawGapCursor(state) { - if (!(state.selection instanceof GapCursor)) - return null; - let node = document.createElement("div"); - node.className = "ProseMirror-gapcursor"; - return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, { key: "gapcursor" })]); -} - -// node_modules/@tiptap/extension-gapcursor/dist/index.js -var Gapcursor = Extension.create({ - name: "gapCursor", - addProseMirrorPlugins() { - return [ - gapCursor() - ]; - }, - extendNodeSchema(extension) { - var _a; - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - return { - allowGapCursor: (_a = callOrReturn(getExtensionField(extension, "allowGapCursor", context))) !== null && _a !== void 0 ? _a : null - }; - } -}); - -// node_modules/@tiptap/extension-hard-break/dist/index.js -var HardBreak = Node2.create({ - name: "hardBreak", - addOptions() { - return { - keepMarks: true, - HTMLAttributes: {} - }; - }, - inline: true, - group: "inline", - selectable: false, - parseHTML() { - return [ - { tag: "br" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["br", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; - }, - renderText() { - return "\n"; - }, - addCommands() { - return { - setHardBreak: () => ({ commands: commands2, chain, state, editor }) => { - return commands2.first([ - () => commands2.exitCode(), - () => commands2.command(() => { - const { selection, storedMarks } = state; - if (selection.$from.parent.type.spec.isolating) { - return false; - } - const { keepMarks } = this.options; - const { splittableMarks } = editor.extensionManager; - const marks = storedMarks || selection.$to.parentOffset && selection.$from.marks(); - return chain().insertContent({ type: this.name }).command(({ tr: tr2, dispatch }) => { - if (dispatch && marks && keepMarks) { - const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name)); - tr2.ensureMarks(filteredMarks); - } - return true; - }).run(); - }) - ]); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Enter": () => this.editor.commands.setHardBreak(), - "Shift-Enter": () => this.editor.commands.setHardBreak() - }; - } -}); - -// node_modules/@tiptap/extension-heading/dist/index.js -var Heading = Node2.create({ - name: "heading", - addOptions() { - return { - levels: [1, 2, 3, 4, 5, 6], - HTMLAttributes: {} - }; - }, - content: "inline*", - group: "block", - defining: true, - addAttributes() { - return { - level: { - default: 1, - rendered: false - } - }; - }, - parseHTML() { - return this.options.levels.map((level) => ({ - tag: `h${level}`, - attrs: { level } - })); - }, - renderHTML({ node, HTMLAttributes }) { - const hasLevel = this.options.levels.includes(node.attrs.level); - const level = hasLevel ? node.attrs.level : this.options.levels[0]; - return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setHeading: (attributes) => ({ commands: commands2 }) => { - if (!this.options.levels.includes(attributes.level)) { - return false; - } - return commands2.setNode(this.name, attributes); - }, - toggleHeading: (attributes) => ({ commands: commands2 }) => { - if (!this.options.levels.includes(attributes.level)) { - return false; - } - return commands2.toggleNode(this.name, "paragraph", attributes); - } - }; - }, - addKeyboardShortcuts() { - return this.options.levels.reduce((items, level) => ({ - ...items, - ...{ - [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }) - } - }), {}); - }, - addInputRules() { - return this.options.levels.map((level) => { - return textblockTypeInputRule({ - find: new RegExp(`^(#{1,${level}})\\s$`), - type: this.type, - getAttributes: { - level - } - }); - }); - } -}); - -// node_modules/rope-sequence/dist/index.js -var GOOD_LEAF_SIZE = 200; -var RopeSequence = function RopeSequence2() { -}; -RopeSequence.prototype.append = function append(other) { - if (!other.length) { - return this; - } - other = RopeSequence.from(other); - return !this.length && other || other.length < GOOD_LEAF_SIZE && this.leafAppend(other) || this.length < GOOD_LEAF_SIZE && other.leafPrepend(this) || this.appendInner(other); -}; -RopeSequence.prototype.prepend = function prepend(other) { - if (!other.length) { - return this; - } - return RopeSequence.from(other).append(this); -}; -RopeSequence.prototype.appendInner = function appendInner(other) { - return new Append(this, other); -}; -RopeSequence.prototype.slice = function slice(from2, to) { - if (from2 === void 0) - from2 = 0; - if (to === void 0) - to = this.length; - if (from2 >= to) { - return RopeSequence.empty; - } - return this.sliceInner(Math.max(0, from2), Math.min(this.length, to)); -}; -RopeSequence.prototype.get = function get(i) { - if (i < 0 || i >= this.length) { - return void 0; - } - return this.getInner(i); -}; -RopeSequence.prototype.forEach = function forEach2(f, from2, to) { - if (from2 === void 0) - from2 = 0; - if (to === void 0) - to = this.length; - if (from2 <= to) { - this.forEachInner(f, from2, to, 0); - } else { - this.forEachInvertedInner(f, from2, to, 0); - } -}; -RopeSequence.prototype.map = function map(f, from2, to) { - if (from2 === void 0) - from2 = 0; - if (to === void 0) - to = this.length; - var result = []; - this.forEach(function(elt, i) { - return result.push(f(elt, i)); - }, from2, to); - return result; -}; -RopeSequence.from = function from(values) { - if (values instanceof RopeSequence) { - return values; - } - return values && values.length ? new Leaf(values) : RopeSequence.empty; -}; -var Leaf = /* @__PURE__ */ function(RopeSequence3) { - function Leaf2(values) { - RopeSequence3.call(this); - this.values = values; - } - if (RopeSequence3) - Leaf2.__proto__ = RopeSequence3; - Leaf2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype); - Leaf2.prototype.constructor = Leaf2; - var prototypeAccessors = { length: { configurable: true }, depth: { configurable: true } }; - Leaf2.prototype.flatten = function flatten() { - return this.values; - }; - Leaf2.prototype.sliceInner = function sliceInner(from2, to) { - if (from2 == 0 && to == this.length) { - return this; - } - return new Leaf2(this.values.slice(from2, to)); - }; - Leaf2.prototype.getInner = function getInner(i) { - return this.values[i]; - }; - Leaf2.prototype.forEachInner = function forEachInner(f, from2, to, start2) { - for (var i = from2; i < to; i++) { - if (f(this.values[i], start2 + i) === false) { - return false; - } - } - }; - Leaf2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) { - for (var i = from2 - 1; i >= to; i--) { - if (f(this.values[i], start2 + i) === false) { - return false; - } - } - }; - Leaf2.prototype.leafAppend = function leafAppend(other) { - if (this.length + other.length <= GOOD_LEAF_SIZE) { - return new Leaf2(this.values.concat(other.flatten())); - } - }; - Leaf2.prototype.leafPrepend = function leafPrepend(other) { - if (this.length + other.length <= GOOD_LEAF_SIZE) { - return new Leaf2(other.flatten().concat(this.values)); - } - }; - prototypeAccessors.length.get = function() { - return this.values.length; - }; - prototypeAccessors.depth.get = function() { - return 0; - }; - Object.defineProperties(Leaf2.prototype, prototypeAccessors); - return Leaf2; -}(RopeSequence); -RopeSequence.empty = new Leaf([]); -var Append = /* @__PURE__ */ function(RopeSequence3) { - function Append2(left2, right2) { - RopeSequence3.call(this); - this.left = left2; - this.right = right2; - this.length = left2.length + right2.length; - this.depth = Math.max(left2.depth, right2.depth) + 1; - } - if (RopeSequence3) - Append2.__proto__ = RopeSequence3; - Append2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype); - Append2.prototype.constructor = Append2; - Append2.prototype.flatten = function flatten() { - return this.left.flatten().concat(this.right.flatten()); - }; - Append2.prototype.getInner = function getInner(i) { - return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length); - }; - Append2.prototype.forEachInner = function forEachInner(f, from2, to, start2) { - var leftLen = this.left.length; - if (from2 < leftLen && this.left.forEachInner(f, from2, Math.min(to, leftLen), start2) === false) { - return false; - } - if (to > leftLen && this.right.forEachInner(f, Math.max(from2 - leftLen, 0), Math.min(this.length, to) - leftLen, start2 + leftLen) === false) { - return false; - } - }; - Append2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) { - var leftLen = this.left.length; - if (from2 > leftLen && this.right.forEachInvertedInner(f, from2 - leftLen, Math.max(to, leftLen) - leftLen, start2 + leftLen) === false) { - return false; - } - if (to < leftLen && this.left.forEachInvertedInner(f, Math.min(from2, leftLen), to, start2) === false) { - return false; - } - }; - Append2.prototype.sliceInner = function sliceInner(from2, to) { - if (from2 == 0 && to == this.length) { - return this; - } - var leftLen = this.left.length; - if (to <= leftLen) { - return this.left.slice(from2, to); - } - if (from2 >= leftLen) { - return this.right.slice(from2 - leftLen, to - leftLen); - } - return this.left.slice(from2, leftLen).append(this.right.slice(0, to - leftLen)); - }; - Append2.prototype.leafAppend = function leafAppend(other) { - var inner = this.right.leafAppend(other); - if (inner) { - return new Append2(this.left, inner); - } - }; - Append2.prototype.leafPrepend = function leafPrepend(other) { - var inner = this.left.leafPrepend(other); - if (inner) { - return new Append2(inner, this.right); - } - }; - Append2.prototype.appendInner = function appendInner2(other) { - if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1) { - return new Append2(this.left, new Append2(this.right, other)); - } - return new Append2(this, other); - }; - return Append2; -}(RopeSequence); -var dist_default2 = RopeSequence; - -// node_modules/prosemirror-history/dist/index.js -var max_empty_items = 500; -var Branch = class _Branch { - constructor(items, eventCount) { - this.items = items; - this.eventCount = eventCount; - } - // Pop the latest event off the branch's history and apply it - // to a document transform. - popEvent(state, preserveItems) { - if (this.eventCount == 0) - return null; - let end2 = this.items.length; - for (; ; end2--) { - let next = this.items.get(end2 - 1); - if (next.selection) { - --end2; - break; - } - } - let remap, mapFrom; - if (preserveItems) { - remap = this.remapping(end2, this.items.length); - mapFrom = remap.maps.length; - } - let transform = state.tr; - let selection, remaining; - let addAfter = [], addBefore = []; - this.items.forEach((item, i) => { - if (!item.step) { - if (!remap) { - remap = this.remapping(end2, i + 1); - mapFrom = remap.maps.length; - } - mapFrom--; - addBefore.push(item); - return; - } - if (remap) { - addBefore.push(new Item(item.map)); - let step = item.step.map(remap.slice(mapFrom)), map2; - if (step && transform.maybeStep(step).doc) { - map2 = transform.mapping.maps[transform.mapping.maps.length - 1]; - addAfter.push(new Item(map2, void 0, void 0, addAfter.length + addBefore.length)); - } - mapFrom--; - if (map2) - remap.appendMap(map2, mapFrom); - } else { - transform.maybeStep(item.step); - } - if (item.selection) { - selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection; - remaining = new _Branch(this.items.slice(0, end2).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1); - return false; - } - }, this.items.length, 0); - return { remaining, transform, selection }; - } - // Create a new branch with the given transform added. - addTransform(transform, selection, histOptions, preserveItems) { - let newItems = [], eventCount = this.eventCount; - let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null; - for (let i = 0; i < transform.steps.length; i++) { - let step = transform.steps[i].invert(transform.docs[i]); - let item = new Item(transform.mapping.maps[i], step, selection), merged; - if (merged = lastItem && lastItem.merge(item)) { - item = merged; - if (i) - newItems.pop(); - else - oldItems = oldItems.slice(0, oldItems.length - 1); - } - newItems.push(item); - if (selection) { - eventCount++; - selection = void 0; - } - if (!preserveItems) - lastItem = item; - } - let overflow = eventCount - histOptions.depth; - if (overflow > DEPTH_OVERFLOW) { - oldItems = cutOffEvents(oldItems, overflow); - eventCount -= overflow; - } - return new _Branch(oldItems.append(newItems), eventCount); - } - remapping(from2, to) { - let maps = new Mapping(); - this.items.forEach((item, i) => { - let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from2 ? maps.maps.length - item.mirrorOffset : void 0; - maps.appendMap(item.map, mirrorPos); - }, from2, to); - return maps; - } - addMaps(array) { - if (this.eventCount == 0) - return this; - return new _Branch(this.items.append(array.map((map2) => new Item(map2))), this.eventCount); - } - // When the collab module receives remote changes, the history has - // to know about those, so that it can adjust the steps that were - // rebased on top of the remote changes, and include the position - // maps for the remote changes in its array of items. - rebased(rebasedTransform, rebasedCount) { - if (!this.eventCount) - return this; - let rebasedItems = [], start2 = Math.max(0, this.items.length - rebasedCount); - let mapping = rebasedTransform.mapping; - let newUntil = rebasedTransform.steps.length; - let eventCount = this.eventCount; - this.items.forEach((item) => { - if (item.selection) - eventCount--; - }, start2); - let iRebased = rebasedCount; - this.items.forEach((item) => { - let pos = mapping.getMirror(--iRebased); - if (pos == null) - return; - newUntil = Math.min(newUntil, pos); - let map2 = mapping.maps[pos]; - if (item.step) { - let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]); - let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos)); - if (selection) - eventCount++; - rebasedItems.push(new Item(map2, step, selection)); - } else { - rebasedItems.push(new Item(map2)); - } - }, start2); - let newMaps = []; - for (let i = rebasedCount; i < newUntil; i++) - newMaps.push(new Item(mapping.maps[i])); - let items = this.items.slice(0, start2).append(newMaps).append(rebasedItems); - let branch = new _Branch(items, eventCount); - if (branch.emptyItemCount() > max_empty_items) - branch = branch.compress(this.items.length - rebasedItems.length); - return branch; - } - emptyItemCount() { - let count = 0; - this.items.forEach((item) => { - if (!item.step) - count++; - }); - return count; - } - // Compressing a branch means rewriting it to push the air (map-only - // items) out. During collaboration, these naturally accumulate - // because each remote change adds one. The `upto` argument is used - // to ensure that only the items below a given level are compressed, - // because `rebased` relies on a clean, untouched set of items in - // order to associate old items with rebased steps. - compress(upto = this.items.length) { - let remap = this.remapping(0, upto), mapFrom = remap.maps.length; - let items = [], events = 0; - this.items.forEach((item, i) => { - if (i >= upto) { - items.push(item); - if (item.selection) - events++; - } else if (item.step) { - let step = item.step.map(remap.slice(mapFrom)), map2 = step && step.getMap(); - mapFrom--; - if (map2) - remap.appendMap(map2, mapFrom); - if (step) { - let selection = item.selection && item.selection.map(remap.slice(mapFrom)); - if (selection) - events++; - let newItem = new Item(map2.invert(), step, selection), merged, last = items.length - 1; - if (merged = items.length && items[last].merge(newItem)) - items[last] = merged; - else - items.push(newItem); - } - } else if (item.map) { - mapFrom--; - } - }, this.items.length, 0); - return new _Branch(dist_default2.from(items.reverse()), events); - } -}; -Branch.empty = new Branch(dist_default2.empty, 0); -function cutOffEvents(items, n) { - let cutPoint; - items.forEach((item, i) => { - if (item.selection && n-- == 0) { - cutPoint = i; - return false; - } - }); - return items.slice(cutPoint); -} -var Item = class _Item { - constructor(map2, step, selection, mirrorOffset) { - this.map = map2; - this.step = step; - this.selection = selection; - this.mirrorOffset = mirrorOffset; - } - merge(other) { - if (this.step && other.step && !other.selection) { - let step = other.step.merge(this.step); - if (step) - return new _Item(step.getMap().invert(), step, this.selection); - } - } -}; -var HistoryState = class { - constructor(done, undone, prevRanges, prevTime, prevComposition) { - this.done = done; - this.undone = undone; - this.prevRanges = prevRanges; - this.prevTime = prevTime; - this.prevComposition = prevComposition; - } -}; -var DEPTH_OVERFLOW = 20; -function applyTransaction(history2, state, tr2, options) { - let historyTr = tr2.getMeta(historyKey), rebased; - if (historyTr) - return historyTr.historyState; - if (tr2.getMeta(closeHistoryKey)) - history2 = new HistoryState(history2.done, history2.undone, null, 0, -1); - let appended = tr2.getMeta("appendedTransaction"); - if (tr2.steps.length == 0) { - return history2; - } else if (appended && appended.getMeta(historyKey)) { - if (appended.getMeta(historyKey).redo) - return new HistoryState(history2.done.addTransform(tr2, void 0, options, mustPreserveItems(state)), history2.undone, rangesFor(tr2.mapping.maps[tr2.steps.length - 1]), history2.prevTime, history2.prevComposition); - else - return new HistoryState(history2.done, history2.undone.addTransform(tr2, void 0, options, mustPreserveItems(state)), null, history2.prevTime, history2.prevComposition); - } else if (tr2.getMeta("addToHistory") !== false && !(appended && appended.getMeta("addToHistory") === false)) { - let composition = tr2.getMeta("composition"); - let newGroup = history2.prevTime == 0 || !appended && history2.prevComposition != composition && (history2.prevTime < (tr2.time || 0) - options.newGroupDelay || !isAdjacentTo(tr2, history2.prevRanges)); - let prevRanges = appended ? mapRanges(history2.prevRanges, tr2.mapping) : rangesFor(tr2.mapping.maps[tr2.steps.length - 1]); - return new HistoryState(history2.done.addTransform(tr2, newGroup ? state.selection.getBookmark() : void 0, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr2.time, composition == null ? history2.prevComposition : composition); - } else if (rebased = tr2.getMeta("rebased")) { - return new HistoryState(history2.done.rebased(tr2, rebased), history2.undone.rebased(tr2, rebased), mapRanges(history2.prevRanges, tr2.mapping), history2.prevTime, history2.prevComposition); - } else { - return new HistoryState(history2.done.addMaps(tr2.mapping.maps), history2.undone.addMaps(tr2.mapping.maps), mapRanges(history2.prevRanges, tr2.mapping), history2.prevTime, history2.prevComposition); - } -} -function isAdjacentTo(transform, prevRanges) { - if (!prevRanges) - return false; - if (!transform.docChanged) - return true; - let adjacent = false; - transform.mapping.maps[0].forEach((start2, end2) => { - for (let i = 0; i < prevRanges.length; i += 2) - if (start2 <= prevRanges[i + 1] && end2 >= prevRanges[i]) - adjacent = true; - }); - return adjacent; -} -function rangesFor(map2) { - let result = []; - map2.forEach((_from, _to, from2, to) => result.push(from2, to)); - return result; -} -function mapRanges(ranges, mapping) { - if (!ranges) - return null; - let result = []; - for (let i = 0; i < ranges.length; i += 2) { - let from2 = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1); - if (from2 <= to) - result.push(from2, to); - } - return result; -} -function histTransaction(history2, state, dispatch, redo2) { - let preserveItems = mustPreserveItems(state); - let histOptions = historyKey.get(state).spec.config; - let pop = (redo2 ? history2.undone : history2.done).popEvent(state, preserveItems); - if (!pop) - return; - let selection = pop.selection.resolve(pop.transform.doc); - let added = (redo2 ? history2.done : history2.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems); - let newHist = new HistoryState(redo2 ? added : pop.remaining, redo2 ? pop.remaining : added, null, 0, -1); - dispatch(pop.transform.setSelection(selection).setMeta(historyKey, { redo: redo2, historyState: newHist }).scrollIntoView()); -} -var cachedPreserveItems = false; -var cachedPreserveItemsPlugins = null; -function mustPreserveItems(state) { - let plugins = state.plugins; - if (cachedPreserveItemsPlugins != plugins) { - cachedPreserveItems = false; - cachedPreserveItemsPlugins = plugins; - for (let i = 0; i < plugins.length; i++) - if (plugins[i].spec.historyPreserveItems) { - cachedPreserveItems = true; - break; - } - } - return cachedPreserveItems; -} -var historyKey = new PluginKey("history"); -var closeHistoryKey = new PluginKey("closeHistory"); -function history(config = {}) { - config = { - depth: config.depth || 100, - newGroupDelay: config.newGroupDelay || 500 - }; - return new Plugin({ - key: historyKey, - state: { - init() { - return new HistoryState(Branch.empty, Branch.empty, null, 0, -1); - }, - apply(tr2, hist, state) { - return applyTransaction(hist, state, tr2, config); - } - }, - config, - props: { - handleDOMEvents: { - beforeinput(view, e) { - let inputType = e.inputType; - let command2 = inputType == "historyUndo" ? undo : inputType == "historyRedo" ? redo : null; - if (!command2) - return false; - e.preventDefault(); - return command2(view.state, view.dispatch); - } - } - } - }); -} -var undo = (state, dispatch) => { - let hist = historyKey.getState(state); - if (!hist || hist.done.eventCount == 0) - return false; - if (dispatch) - histTransaction(hist, state, dispatch, false); - return true; -}; -var redo = (state, dispatch) => { - let hist = historyKey.getState(state); - if (!hist || hist.undone.eventCount == 0) - return false; - if (dispatch) - histTransaction(hist, state, dispatch, true); - return true; -}; - -// node_modules/@tiptap/extension-history/dist/index.js -var History = Extension.create({ - name: "history", - addOptions() { - return { - depth: 100, - newGroupDelay: 500 - }; - }, - addCommands() { - return { - undo: () => ({ state, dispatch }) => { - return undo(state, dispatch); - }, - redo: () => ({ state, dispatch }) => { - return redo(state, dispatch); - } - }; - }, - addProseMirrorPlugins() { - return [ - history(this.options) - ]; - }, - addKeyboardShortcuts() { - return { - "Mod-z": () => this.editor.commands.undo(), - "Mod-Z": () => this.editor.commands.undo(), - "Mod-y": () => this.editor.commands.redo(), - "Mod-Y": () => this.editor.commands.redo(), - "Shift-Mod-z": () => this.editor.commands.redo(), - "Shift-Mod-Z": () => this.editor.commands.redo(), - // Russian keyboard layouts - "Mod-\u044F": () => this.editor.commands.undo(), - "Shift-Mod-\u044F": () => this.editor.commands.redo() - }; - } -}); - -// node_modules/@tiptap/extension-horizontal-rule/dist/index.js -var HorizontalRule = Node2.create({ - name: "horizontalRule", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - group: "block", - parseHTML() { - return [{ tag: "hr" }]; - }, - renderHTML({ HTMLAttributes }) { - return ["hr", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; - }, - addCommands() { - return { - setHorizontalRule: () => ({ chain, state }) => { - const { $to: $originTo } = state.selection; - const currentChain = chain(); - if ($originTo.parentOffset === 0) { - currentChain.insertContentAt(Math.max($originTo.pos - 2, 0), { type: this.name }); - } else { - currentChain.insertContent({ type: this.name }); - } - return currentChain.command(({ tr: tr2, dispatch }) => { - var _a; - if (dispatch) { - const { $to } = tr2.selection; - const posAfter = $to.end(); - if ($to.nodeAfter) { - if ($to.nodeAfter.isTextblock) { - tr2.setSelection(TextSelection.create(tr2.doc, $to.pos + 1)); - } else if ($to.nodeAfter.isBlock) { - tr2.setSelection(NodeSelection.create(tr2.doc, $to.pos)); - } else { - tr2.setSelection(TextSelection.create(tr2.doc, $to.pos)); - } - } else { - const node = (_a = $to.parent.type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.create(); - if (node) { - tr2.insert(posAfter, node); - tr2.setSelection(TextSelection.create(tr2.doc, posAfter + 1)); - } - } - tr2.scrollIntoView(); - } - return true; - }).run(); - } - }; - }, - addInputRules() { - return [ - nodeInputRule({ - find: /^(?:---|—-|___\s|\*\*\*\s)$/, - type: this.type - }) - ]; - } -}); - -// node_modules/@tiptap/extension-italic/dist/index.js -var starInputRegex2 = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))$/; -var starPasteRegex2 = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))/g; -var underscoreInputRegex2 = /(?:^|\s)((?:_)((?:[^_]+))(?:_))$/; -var underscorePasteRegex2 = /(?:^|\s)((?:_)((?:[^_]+))(?:_))/g; -var Italic = Mark2.create({ - name: "italic", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "em" - }, - { - tag: "i", - getAttrs: (node) => node.style.fontStyle !== "normal" && null - }, - { - style: "font-style=italic" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["em", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setItalic: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleItalic: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetItalic: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-i": () => this.editor.commands.toggleItalic(), - "Mod-I": () => this.editor.commands.toggleItalic() - }; - }, - addInputRules() { - return [ - markInputRule({ - find: starInputRegex2, - type: this.type - }), - markInputRule({ - find: underscoreInputRegex2, - type: this.type - }) - ]; - }, - addPasteRules() { - return [ - markPasteRule({ - find: starPasteRegex2, - type: this.type - }), - markPasteRule({ - find: underscorePasteRegex2, - type: this.type - }) - ]; - } -}); - -// node_modules/@tiptap/extension-list-item/dist/index.js -var ListItem2 = Node2.create({ - name: "listItem", - addOptions() { - return { - HTMLAttributes: {}, - bulletListTypeName: "bulletList", - orderedListTypeName: "orderedList" - }; - }, - content: "paragraph block*", - defining: true, - parseHTML() { - return [ - { - tag: "li" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addKeyboardShortcuts() { - return { - Enter: () => this.editor.commands.splitListItem(this.name), - Tab: () => this.editor.commands.sinkListItem(this.name), - "Shift-Tab": () => this.editor.commands.liftListItem(this.name) - }; - } -}); - -// node_modules/@tiptap/extension-ordered-list/dist/index.js -var ListItem3 = Node2.create({ - name: "listItem", - addOptions() { - return { - HTMLAttributes: {}, - bulletListTypeName: "bulletList", - orderedListTypeName: "orderedList" - }; - }, - content: "paragraph block*", - defining: true, - parseHTML() { - return [ - { - tag: "li" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["li", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addKeyboardShortcuts() { - return { - Enter: () => this.editor.commands.splitListItem(this.name), - Tab: () => this.editor.commands.sinkListItem(this.name), - "Shift-Tab": () => this.editor.commands.liftListItem(this.name) - }; - } -}); -var TextStyle3 = Mark2.create({ - name: "textStyle", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "span", - getAttrs: (element) => { - const hasStyles = element.hasAttribute("style"); - if (!hasStyles) { - return false; - } - return {}; - } - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["span", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - removeEmptyTextStyle: () => ({ state, commands: commands2 }) => { - const attributes = getMarkAttributes(state, this.type); - const hasStyles = Object.entries(attributes).some(([, value]) => !!value); - if (hasStyles) { - return true; - } - return commands2.unsetMark(this.name); - } - }; - } -}); -var inputRegex4 = /^(\d+)\.\s$/; -var OrderedList = Node2.create({ - name: "orderedList", - addOptions() { - return { - itemTypeName: "listItem", - HTMLAttributes: {}, - keepMarks: false, - keepAttributes: false - }; - }, - group: "block list", - content() { - return `${this.options.itemTypeName}+`; - }, - addAttributes() { - return { - start: { - default: 1, - parseHTML: (element) => { - return element.hasAttribute("start") ? parseInt(element.getAttribute("start") || "", 10) : 1; - } - } - }; - }, - parseHTML() { - return [ - { - tag: "ol" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - const { start: start2, ...attributesWithoutStart } = HTMLAttributes; - return start2 === 1 ? ["ol", mergeAttributes(this.options.HTMLAttributes, attributesWithoutStart), 0] : ["ol", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - toggleOrderedList: () => ({ commands: commands2, chain }) => { - if (this.options.keepAttributes) { - return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem3.name, this.editor.getAttributes(TextStyle3.name)).run(); - } - return commands2.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Shift-7": () => this.editor.commands.toggleOrderedList() - }; - }, - addInputRules() { - let inputRule = wrappingInputRule({ - find: inputRegex4, - type: this.type, - getAttributes: (match) => ({ start: +match[1] }), - joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1] - }); - if (this.options.keepMarks || this.options.keepAttributes) { - inputRule = wrappingInputRule({ - find: inputRegex4, - type: this.type, - keepMarks: this.options.keepMarks, - keepAttributes: this.options.keepAttributes, - getAttributes: (match) => ({ start: +match[1], ...this.editor.getAttributes(TextStyle3.name) }), - joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1], - editor: this.editor - }); - } - return [ - inputRule - ]; - } -}); - -// node_modules/@tiptap/extension-paragraph/dist/index.js -var Paragraph = Node2.create({ - name: "paragraph", - priority: 1e3, - addOptions() { - return { - HTMLAttributes: {} - }; - }, - group: "block", - content: "inline*", - parseHTML() { - return [ - { tag: "p" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["p", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setParagraph: () => ({ commands: commands2 }) => { - return commands2.setNode(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Alt-0": () => this.editor.commands.setParagraph() - }; - } -}); - -// node_modules/@tiptap/extension-placeholder/dist/index.js -var Placeholder = Extension.create({ - name: "placeholder", - addOptions() { - return { - emptyEditorClass: "is-editor-empty", - emptyNodeClass: "is-empty", - placeholder: "Write something \u2026", - showOnlyWhenEditable: true, - showOnlyCurrent: true, - includeChildren: false - }; - }, - addProseMirrorPlugins() { - return [ - new Plugin({ - key: new PluginKey("placeholder"), - props: { - decorations: ({ doc: doc3, selection }) => { - const active = this.editor.isEditable || !this.options.showOnlyWhenEditable; - const { anchor } = selection; - const decorations = []; - if (!active) { - return null; - } - const emptyDocInstance = doc3.type.createAndFill(); - const isEditorEmpty = (emptyDocInstance === null || emptyDocInstance === void 0 ? void 0 : emptyDocInstance.sameMarkup(doc3)) && emptyDocInstance.content.findDiffStart(doc3.content) === null; - doc3.descendants((node, pos) => { - const hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize; - const isEmpty2 = !node.isLeaf && !node.childCount; - if ((hasAnchor || !this.options.showOnlyCurrent) && isEmpty2) { - const classes = [this.options.emptyNodeClass]; - if (isEditorEmpty) { - classes.push(this.options.emptyEditorClass); - } - const decoration = Decoration.node(pos, pos + node.nodeSize, { - class: classes.join(" "), - "data-placeholder": typeof this.options.placeholder === "function" ? this.options.placeholder({ - editor: this.editor, - node, - pos, - hasAnchor - }) : this.options.placeholder - }); - decorations.push(decoration); - } - return this.options.includeChildren; - }); - return DecorationSet.create(doc3, decorations); - } - } - }) - ]; - } -}); - -// node_modules/@tiptap/extension-strike/dist/index.js -var inputRegex5 = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))$/; -var pasteRegex2 = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))/g; -var Strike = Mark2.create({ - name: "strike", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "s" - }, - { - tag: "del" - }, - { - tag: "strike" - }, - { - style: "text-decoration", - consuming: false, - getAttrs: (style2) => style2.includes("line-through") ? {} : false - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["s", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setStrike: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleStrike: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetStrike: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - const shortcuts = {}; - if (isMacOS()) { - shortcuts["Mod-Shift-s"] = () => this.editor.commands.toggleStrike(); - } else { - shortcuts["Ctrl-Shift-s"] = () => this.editor.commands.toggleStrike(); - } - return shortcuts; - }, - addInputRules() { - return [ - markInputRule({ - find: inputRegex5, - type: this.type - }) - ]; - }, - addPasteRules() { - return [ - markPasteRule({ - find: pasteRegex2, - type: this.type - }) - ]; - } -}); - -// node_modules/@tiptap/extension-subscript/dist/index.js -var Subscript = Mark2.create({ - name: "subscript", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "sub" - }, - { - style: "vertical-align", - getAttrs(value) { - if (value !== "sub") { - return false; - } - return null; - } - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["sub", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setSubscript: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleSubscript: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetSubscript: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-,": () => this.editor.commands.toggleSubscript() - }; - } -}); - -// node_modules/@tiptap/extension-superscript/dist/index.js -var Superscript = Mark2.create({ - name: "superscript", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "sup" - }, - { - style: "vertical-align", - getAttrs(value) { - if (value !== "super") { - return false; - } - return null; - } - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["sup", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setSuperscript: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleSuperscript: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetSuperscript: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-.": () => this.editor.commands.toggleSuperscript() - }; - } -}); - -// node_modules/prosemirror-tables/dist/index.js -var readFromCache; -var addToCache; -if (typeof WeakMap != "undefined") { - let cache2 = /* @__PURE__ */ new WeakMap(); - readFromCache = (key) => cache2.get(key); - addToCache = (key, value) => { - cache2.set(key, value); - return value; - }; -} else { - const cache2 = []; - const cacheSize = 10; - let cachePos = 0; - readFromCache = (key) => { - for (let i = 0; i < cache2.length; i += 2) - if (cache2[i] == key) - return cache2[i + 1]; - }; - addToCache = (key, value) => { - if (cachePos == cacheSize) - cachePos = 0; - cache2[cachePos++] = key; - return cache2[cachePos++] = value; - }; -} -var TableMap = class { - constructor(width, height, map2, problems) { - this.width = width; - this.height = height; - this.map = map2; - this.problems = problems; - } - // Find the dimensions of the cell at the given position. - findCell(pos) { - for (let i = 0; i < this.map.length; i++) { - const curPos = this.map[i]; - if (curPos != pos) - continue; - const left2 = i % this.width; - const top2 = i / this.width | 0; - let right2 = left2 + 1; - let bottom2 = top2 + 1; - for (let j = 1; right2 < this.width && this.map[i + j] == curPos; j++) { - right2++; - } - for (let j = 1; bottom2 < this.height && this.map[i + this.width * j] == curPos; j++) { - bottom2++; - } - return { left: left2, top: top2, right: right2, bottom: bottom2 }; - } - throw new RangeError(`No cell with offset ${pos} found`); - } - // Find the left side of the cell at the given position. - colCount(pos) { - for (let i = 0; i < this.map.length; i++) { - if (this.map[i] == pos) { - return i % this.width; - } - } - throw new RangeError(`No cell with offset ${pos} found`); - } - // Find the next cell in the given direction, starting from the cell - // at `pos`, if any. - nextCell(pos, axis, dir) { - const { left: left2, right: right2, top: top2, bottom: bottom2 } = this.findCell(pos); - if (axis == "horiz") { - if (dir < 0 ? left2 == 0 : right2 == this.width) - return null; - return this.map[top2 * this.width + (dir < 0 ? left2 - 1 : right2)]; - } else { - if (dir < 0 ? top2 == 0 : bottom2 == this.height) - return null; - return this.map[left2 + this.width * (dir < 0 ? top2 - 1 : bottom2)]; - } - } - // Get the rectangle spanning the two given cells. - rectBetween(a, b) { - const { - left: leftA, - right: rightA, - top: topA, - bottom: bottomA - } = this.findCell(a); - const { - left: leftB, - right: rightB, - top: topB, - bottom: bottomB - } = this.findCell(b); - return { - left: Math.min(leftA, leftB), - top: Math.min(topA, topB), - right: Math.max(rightA, rightB), - bottom: Math.max(bottomA, bottomB) - }; - } - // Return the position of all cells that have the top left corner in - // the given rectangle. - cellsInRect(rect) { - const result = []; - const seen = {}; - for (let row = rect.top; row < rect.bottom; row++) { - for (let col = rect.left; col < rect.right; col++) { - const index = row * this.width + col; - const pos = this.map[index]; - if (seen[pos]) - continue; - seen[pos] = true; - if (col == rect.left && col && this.map[index - 1] == pos || row == rect.top && row && this.map[index - this.width] == pos) { - continue; - } - result.push(pos); - } - } - return result; - } - // Return the position at which the cell at the given row and column - // starts, or would start, if a cell started there. - positionAt(row, col, table) { - for (let i = 0, rowStart = 0; ; i++) { - const rowEnd = rowStart + table.child(i).nodeSize; - if (i == row) { - let index = col + row * this.width; - const rowEndIndex = (row + 1) * this.width; - while (index < rowEndIndex && this.map[index] < rowStart) - index++; - return index == rowEndIndex ? rowEnd - 1 : this.map[index]; - } - rowStart = rowEnd; - } - } - // Find the table map for the given table node. - static get(table) { - return readFromCache(table) || addToCache(table, computeMap(table)); - } -}; -function computeMap(table) { - if (table.type.spec.tableRole != "table") - throw new RangeError("Not a table node: " + table.type.name); - const width = findWidth(table), height = table.childCount; - const map2 = []; - let mapPos = 0; - let problems = null; - const colWidths = []; - for (let i = 0, e = width * height; i < e; i++) - map2[i] = 0; - for (let row = 0, pos = 0; row < height; row++) { - const rowNode = table.child(row); - pos++; - for (let i = 0; ; i++) { - while (mapPos < map2.length && map2[mapPos] != 0) - mapPos++; - if (i == rowNode.childCount) - break; - const cellNode = rowNode.child(i); - const { colspan, rowspan, colwidth } = cellNode.attrs; - for (let h = 0; h < rowspan; h++) { - if (h + row >= height) { - (problems || (problems = [])).push({ - type: "overlong_rowspan", - pos, - n: rowspan - h - }); - break; - } - const start2 = mapPos + h * width; - for (let w = 0; w < colspan; w++) { - if (map2[start2 + w] == 0) - map2[start2 + w] = pos; - else - (problems || (problems = [])).push({ - type: "collision", - row, - pos, - n: colspan - w - }); - const colW = colwidth && colwidth[w]; - if (colW) { - const widthIndex = (start2 + w) % width * 2, prev = colWidths[widthIndex]; - if (prev == null || prev != colW && colWidths[widthIndex + 1] == 1) { - colWidths[widthIndex] = colW; - colWidths[widthIndex + 1] = 1; - } else if (prev == colW) { - colWidths[widthIndex + 1]++; - } - } - } - } - mapPos += colspan; - pos += cellNode.nodeSize; - } - const expectedPos = (row + 1) * width; - let missing = 0; - while (mapPos < expectedPos) - if (map2[mapPos++] == 0) - missing++; - if (missing) - (problems || (problems = [])).push({ type: "missing", row, n: missing }); - pos++; - } - const tableMap = new TableMap(width, height, map2, problems); - let badWidths = false; - for (let i = 0; !badWidths && i < colWidths.length; i += 2) - if (colWidths[i] != null && colWidths[i + 1] < height) - badWidths = true; - if (badWidths) - findBadColWidths(tableMap, colWidths, table); - return tableMap; -} -function findWidth(table) { - let width = -1; - let hasRowSpan = false; - for (let row = 0; row < table.childCount; row++) { - const rowNode = table.child(row); - let rowWidth = 0; - if (hasRowSpan) - for (let j = 0; j < row; j++) { - const prevRow = table.child(j); - for (let i = 0; i < prevRow.childCount; i++) { - const cell = prevRow.child(i); - if (j + cell.attrs.rowspan > row) - rowWidth += cell.attrs.colspan; - } - } - for (let i = 0; i < rowNode.childCount; i++) { - const cell = rowNode.child(i); - rowWidth += cell.attrs.colspan; - if (cell.attrs.rowspan > 1) - hasRowSpan = true; - } - if (width == -1) - width = rowWidth; - else if (width != rowWidth) - width = Math.max(width, rowWidth); - } - return width; -} -function findBadColWidths(map2, colWidths, table) { - if (!map2.problems) - map2.problems = []; - const seen = {}; - for (let i = 0; i < map2.map.length; i++) { - const pos = map2.map[i]; - if (seen[pos]) - continue; - seen[pos] = true; - const node = table.nodeAt(pos); - if (!node) { - throw new RangeError(`No cell with offset ${pos} found`); - } - let updated = null; - const attrs = node.attrs; - for (let j = 0; j < attrs.colspan; j++) { - const col = (i + j) % map2.width; - const colWidth = colWidths[col * 2]; - if (colWidth != null && (!attrs.colwidth || attrs.colwidth[j] != colWidth)) - (updated || (updated = freshColWidth(attrs)))[j] = colWidth; - } - if (updated) - map2.problems.unshift({ - type: "colwidth mismatch", - pos, - colwidth: updated - }); - } -} -function freshColWidth(attrs) { - if (attrs.colwidth) - return attrs.colwidth.slice(); - const result = []; - for (let i = 0; i < attrs.colspan; i++) - result.push(0); - return result; -} -function tableNodeTypes(schema) { - let result = schema.cached.tableNodeTypes; - if (!result) { - result = schema.cached.tableNodeTypes = {}; - for (const name in schema.nodes) { - const type = schema.nodes[name], role = type.spec.tableRole; - if (role) - result[role] = type; - } - } - return result; -} -var tableEditingKey = new PluginKey("selectingCells"); -function cellAround($pos) { - for (let d = $pos.depth - 1; d > 0; d--) - if ($pos.node(d).type.spec.tableRole == "row") - return $pos.node(0).resolve($pos.before(d + 1)); - return null; -} -function cellWrapping($pos) { - for (let d = $pos.depth; d > 0; d--) { - const role = $pos.node(d).type.spec.tableRole; - if (role === "cell" || role === "header_cell") - return $pos.node(d); - } - return null; -} -function isInTable(state) { - const $head = state.selection.$head; - for (let d = $head.depth; d > 0; d--) - if ($head.node(d).type.spec.tableRole == "row") - return true; - return false; -} -function selectionCell(state) { - const sel = state.selection; - if ("$anchorCell" in sel && sel.$anchorCell) { - return sel.$anchorCell.pos > sel.$headCell.pos ? sel.$anchorCell : sel.$headCell; - } else if ("node" in sel && sel.node && sel.node.type.spec.tableRole == "cell") { - return sel.$anchor; - } - const $cell = cellAround(sel.$head) || cellNear(sel.$head); - if ($cell) { - return $cell; - } - throw new RangeError(`No cell found around position ${sel.head}`); -} -function cellNear($pos) { - for (let after = $pos.nodeAfter, pos = $pos.pos; after; after = after.firstChild, pos++) { - const role = after.type.spec.tableRole; - if (role == "cell" || role == "header_cell") - return $pos.doc.resolve(pos); - } - for (let before = $pos.nodeBefore, pos = $pos.pos; before; before = before.lastChild, pos--) { - const role = before.type.spec.tableRole; - if (role == "cell" || role == "header_cell") - return $pos.doc.resolve(pos - before.nodeSize); - } -} -function pointsAtCell($pos) { - return $pos.parent.type.spec.tableRole == "row" && !!$pos.nodeAfter; -} -function moveCellForward($pos) { - return $pos.node(0).resolve($pos.pos + $pos.nodeAfter.nodeSize); -} -function inSameTable($cellA, $cellB) { - return $cellA.depth == $cellB.depth && $cellA.pos >= $cellB.start(-1) && $cellA.pos <= $cellB.end(-1); -} -function nextCell($pos, axis, dir) { - const table = $pos.node(-1); - const map2 = TableMap.get(table); - const tableStart = $pos.start(-1); - const moved = map2.nextCell($pos.pos - tableStart, axis, dir); - return moved == null ? null : $pos.node(0).resolve(tableStart + moved); -} -function removeColSpan(attrs, pos, n = 1) { - const result = { ...attrs, colspan: attrs.colspan - n }; - if (result.colwidth) { - result.colwidth = result.colwidth.slice(); - result.colwidth.splice(pos, n); - if (!result.colwidth.some((w) => w > 0)) - result.colwidth = null; - } - return result; -} -function addColSpan(attrs, pos, n = 1) { - const result = { ...attrs, colspan: attrs.colspan + n }; - if (result.colwidth) { - result.colwidth = result.colwidth.slice(); - for (let i = 0; i < n; i++) - result.colwidth.splice(pos, 0, 0); - } - return result; -} -function columnIsHeader(map2, table, col) { - const headerCell = tableNodeTypes(table.type.schema).header_cell; - for (let row = 0; row < map2.height; row++) - if (table.nodeAt(map2.map[col + row * map2.width]).type != headerCell) - return false; - return true; -} -var CellSelection = class _CellSelection extends Selection { - // A table selection is identified by its anchor and head cells. The - // positions given to this constructor should point _before_ two - // cells in the same table. They may be the same, to select a single - // cell. - constructor($anchorCell, $headCell = $anchorCell) { - const table = $anchorCell.node(-1); - const map2 = TableMap.get(table); - const tableStart = $anchorCell.start(-1); - const rect = map2.rectBetween( - $anchorCell.pos - tableStart, - $headCell.pos - tableStart - ); - const doc3 = $anchorCell.node(0); - const cells = map2.cellsInRect(rect).filter((p) => p != $headCell.pos - tableStart); - cells.unshift($headCell.pos - tableStart); - const ranges = cells.map((pos) => { - const cell = table.nodeAt(pos); - if (!cell) { - throw RangeError(`No cell with offset ${pos} found`); - } - const from2 = tableStart + pos + 1; - return new SelectionRange( - doc3.resolve(from2), - doc3.resolve(from2 + cell.content.size) - ); - }); - super(ranges[0].$from, ranges[0].$to, ranges); - this.$anchorCell = $anchorCell; - this.$headCell = $headCell; - } - map(doc3, mapping) { - const $anchorCell = doc3.resolve(mapping.map(this.$anchorCell.pos)); - const $headCell = doc3.resolve(mapping.map(this.$headCell.pos)); - if (pointsAtCell($anchorCell) && pointsAtCell($headCell) && inSameTable($anchorCell, $headCell)) { - const tableChanged = this.$anchorCell.node(-1) != $anchorCell.node(-1); - if (tableChanged && this.isRowSelection()) - return _CellSelection.rowSelection($anchorCell, $headCell); - else if (tableChanged && this.isColSelection()) - return _CellSelection.colSelection($anchorCell, $headCell); - else - return new _CellSelection($anchorCell, $headCell); - } - return TextSelection.between($anchorCell, $headCell); - } - // Returns a rectangular slice of table rows containing the selected - // cells. - content() { - const table = this.$anchorCell.node(-1); - const map2 = TableMap.get(table); - const tableStart = this.$anchorCell.start(-1); - const rect = map2.rectBetween( - this.$anchorCell.pos - tableStart, - this.$headCell.pos - tableStart - ); - const seen = {}; - const rows = []; - for (let row = rect.top; row < rect.bottom; row++) { - const rowContent = []; - for (let index = row * map2.width + rect.left, col = rect.left; col < rect.right; col++, index++) { - const pos = map2.map[index]; - if (seen[pos]) - continue; - seen[pos] = true; - const cellRect = map2.findCell(pos); - let cell = table.nodeAt(pos); - if (!cell) { - throw RangeError(`No cell with offset ${pos} found`); - } - const extraLeft = rect.left - cellRect.left; - const extraRight = cellRect.right - rect.right; - if (extraLeft > 0 || extraRight > 0) { - let attrs = cell.attrs; - if (extraLeft > 0) { - attrs = removeColSpan(attrs, 0, extraLeft); - } - if (extraRight > 0) { - attrs = removeColSpan( - attrs, - attrs.colspan - extraRight, - extraRight - ); - } - if (cellRect.left < rect.left) { - cell = cell.type.createAndFill(attrs); - if (!cell) { - throw RangeError( - `Could not create cell with attrs ${JSON.stringify(attrs)}` - ); - } - } else { - cell = cell.type.create(attrs, cell.content); - } - } - if (cellRect.top < rect.top || cellRect.bottom > rect.bottom) { - const attrs = { - ...cell.attrs, - rowspan: Math.min(cellRect.bottom, rect.bottom) - Math.max(cellRect.top, rect.top) - }; - if (cellRect.top < rect.top) { - cell = cell.type.createAndFill(attrs); - } else { - cell = cell.type.create(attrs, cell.content); - } - } - rowContent.push(cell); - } - rows.push(table.child(row).copy(Fragment.from(rowContent))); - } - const fragment = this.isColSelection() && this.isRowSelection() ? table : rows; - return new Slice(Fragment.from(fragment), 1, 1); - } - replace(tr2, content = Slice.empty) { - const mapFrom = tr2.steps.length, ranges = this.ranges; - for (let i = 0; i < ranges.length; i++) { - const { $from, $to } = ranges[i], mapping = tr2.mapping.slice(mapFrom); - tr2.replace( - mapping.map($from.pos), - mapping.map($to.pos), - i ? Slice.empty : content - ); - } - const sel = Selection.findFrom( - tr2.doc.resolve(tr2.mapping.slice(mapFrom).map(this.to)), - -1 - ); - if (sel) - tr2.setSelection(sel); - } - replaceWith(tr2, node) { - this.replace(tr2, new Slice(Fragment.from(node), 0, 0)); - } - forEachCell(f) { - const table = this.$anchorCell.node(-1); - const map2 = TableMap.get(table); - const tableStart = this.$anchorCell.start(-1); - const cells = map2.cellsInRect( - map2.rectBetween( - this.$anchorCell.pos - tableStart, - this.$headCell.pos - tableStart - ) - ); - for (let i = 0; i < cells.length; i++) { - f(table.nodeAt(cells[i]), tableStart + cells[i]); - } - } - // True if this selection goes all the way from the top to the - // bottom of the table. - isColSelection() { - const anchorTop = this.$anchorCell.index(-1); - const headTop = this.$headCell.index(-1); - if (Math.min(anchorTop, headTop) > 0) - return false; - const anchorBottom = anchorTop + this.$anchorCell.nodeAfter.attrs.rowspan; - const headBottom = headTop + this.$headCell.nodeAfter.attrs.rowspan; - return Math.max(anchorBottom, headBottom) == this.$headCell.node(-1).childCount; - } - // Returns the smallest column selection that covers the given anchor - // and head cell. - static colSelection($anchorCell, $headCell = $anchorCell) { - const table = $anchorCell.node(-1); - const map2 = TableMap.get(table); - const tableStart = $anchorCell.start(-1); - const anchorRect = map2.findCell($anchorCell.pos - tableStart); - const headRect = map2.findCell($headCell.pos - tableStart); - const doc3 = $anchorCell.node(0); - if (anchorRect.top <= headRect.top) { - if (anchorRect.top > 0) - $anchorCell = doc3.resolve(tableStart + map2.map[anchorRect.left]); - if (headRect.bottom < map2.height) - $headCell = doc3.resolve( - tableStart + map2.map[map2.width * (map2.height - 1) + headRect.right - 1] - ); - } else { - if (headRect.top > 0) - $headCell = doc3.resolve(tableStart + map2.map[headRect.left]); - if (anchorRect.bottom < map2.height) - $anchorCell = doc3.resolve( - tableStart + map2.map[map2.width * (map2.height - 1) + anchorRect.right - 1] - ); - } - return new _CellSelection($anchorCell, $headCell); - } - // True if this selection goes all the way from the left to the - // right of the table. - isRowSelection() { - const table = this.$anchorCell.node(-1); - const map2 = TableMap.get(table); - const tableStart = this.$anchorCell.start(-1); - const anchorLeft = map2.colCount(this.$anchorCell.pos - tableStart); - const headLeft = map2.colCount(this.$headCell.pos - tableStart); - if (Math.min(anchorLeft, headLeft) > 0) - return false; - const anchorRight = anchorLeft + this.$anchorCell.nodeAfter.attrs.colspan; - const headRight = headLeft + this.$headCell.nodeAfter.attrs.colspan; - return Math.max(anchorRight, headRight) == map2.width; - } - eq(other) { - return other instanceof _CellSelection && other.$anchorCell.pos == this.$anchorCell.pos && other.$headCell.pos == this.$headCell.pos; - } - // Returns the smallest row selection that covers the given anchor - // and head cell. - static rowSelection($anchorCell, $headCell = $anchorCell) { - const table = $anchorCell.node(-1); - const map2 = TableMap.get(table); - const tableStart = $anchorCell.start(-1); - const anchorRect = map2.findCell($anchorCell.pos - tableStart); - const headRect = map2.findCell($headCell.pos - tableStart); - const doc3 = $anchorCell.node(0); - if (anchorRect.left <= headRect.left) { - if (anchorRect.left > 0) - $anchorCell = doc3.resolve( - tableStart + map2.map[anchorRect.top * map2.width] - ); - if (headRect.right < map2.width) - $headCell = doc3.resolve( - tableStart + map2.map[map2.width * (headRect.top + 1) - 1] - ); - } else { - if (headRect.left > 0) - $headCell = doc3.resolve(tableStart + map2.map[headRect.top * map2.width]); - if (anchorRect.right < map2.width) - $anchorCell = doc3.resolve( - tableStart + map2.map[map2.width * (anchorRect.top + 1) - 1] - ); - } - return new _CellSelection($anchorCell, $headCell); - } - toJSON() { - return { - type: "cell", - anchor: this.$anchorCell.pos, - head: this.$headCell.pos - }; - } - static fromJSON(doc3, json2) { - return new _CellSelection(doc3.resolve(json2.anchor), doc3.resolve(json2.head)); - } - static create(doc3, anchorCell, headCell = anchorCell) { - return new _CellSelection(doc3.resolve(anchorCell), doc3.resolve(headCell)); - } - getBookmark() { - return new CellBookmark(this.$anchorCell.pos, this.$headCell.pos); - } -}; -CellSelection.prototype.visible = false; -Selection.jsonID("cell", CellSelection); -var CellBookmark = class _CellBookmark { - constructor(anchor, head) { - this.anchor = anchor; - this.head = head; - } - map(mapping) { - return new _CellBookmark(mapping.map(this.anchor), mapping.map(this.head)); - } - resolve(doc3) { - const $anchorCell = doc3.resolve(this.anchor), $headCell = doc3.resolve(this.head); - if ($anchorCell.parent.type.spec.tableRole == "row" && $headCell.parent.type.spec.tableRole == "row" && $anchorCell.index() < $anchorCell.parent.childCount && $headCell.index() < $headCell.parent.childCount && inSameTable($anchorCell, $headCell)) - return new CellSelection($anchorCell, $headCell); - else - return Selection.near($headCell, 1); - } -}; -function drawCellSelection(state) { - if (!(state.selection instanceof CellSelection)) - return null; - const cells = []; - state.selection.forEachCell((node, pos) => { - cells.push( - Decoration.node(pos, pos + node.nodeSize, { class: "selectedCell" }) - ); - }); - return DecorationSet.create(state.doc, cells); -} -function isCellBoundarySelection({ $from, $to }) { - if ($from.pos == $to.pos || $from.pos < $from.pos - 6) - return false; - let afterFrom = $from.pos; - let beforeTo = $to.pos; - let depth = $from.depth; - for (; depth >= 0; depth--, afterFrom++) - if ($from.after(depth + 1) < $from.end(depth)) - break; - for (let d = $to.depth; d >= 0; d--, beforeTo--) - if ($to.before(d + 1) > $to.start(d)) - break; - return afterFrom == beforeTo && /row|table/.test($from.node(depth).type.spec.tableRole); -} -function isTextSelectionAcrossCells({ $from, $to }) { - let fromCellBoundaryNode; - let toCellBoundaryNode; - for (let i = $from.depth; i > 0; i--) { - const node = $from.node(i); - if (node.type.spec.tableRole === "cell" || node.type.spec.tableRole === "header_cell") { - fromCellBoundaryNode = node; - break; - } - } - for (let i = $to.depth; i > 0; i--) { - const node = $to.node(i); - if (node.type.spec.tableRole === "cell" || node.type.spec.tableRole === "header_cell") { - toCellBoundaryNode = node; - break; - } - } - return fromCellBoundaryNode !== toCellBoundaryNode && $to.parentOffset === 0; -} -function normalizeSelection(state, tr2, allowTableNodeSelection) { - const sel = (tr2 || state).selection; - const doc3 = (tr2 || state).doc; - let normalize2; - let role; - if (sel instanceof NodeSelection && (role = sel.node.type.spec.tableRole)) { - if (role == "cell" || role == "header_cell") { - normalize2 = CellSelection.create(doc3, sel.from); - } else if (role == "row") { - const $cell = doc3.resolve(sel.from + 1); - normalize2 = CellSelection.rowSelection($cell, $cell); - } else if (!allowTableNodeSelection) { - const map2 = TableMap.get(sel.node); - const start2 = sel.from + 1; - const lastCell = start2 + map2.map[map2.width * map2.height - 1]; - normalize2 = CellSelection.create(doc3, start2 + 1, lastCell); - } - } else if (sel instanceof TextSelection && isCellBoundarySelection(sel)) { - normalize2 = TextSelection.create(doc3, sel.from); - } else if (sel instanceof TextSelection && isTextSelectionAcrossCells(sel)) { - normalize2 = TextSelection.create(doc3, sel.$from.start(), sel.$from.end()); - } - if (normalize2) - (tr2 || (tr2 = state.tr)).setSelection(normalize2); - return tr2; -} -var fixTablesKey = new PluginKey("fix-tables"); -function changedDescendants(old, cur, offset2, f) { - const oldSize = old.childCount, curSize = cur.childCount; - outer: - for (let i = 0, j = 0; i < curSize; i++) { - const child = cur.child(i); - for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) { - if (old.child(scan) == child) { - j = scan + 1; - offset2 += child.nodeSize; - continue outer; - } - } - f(child, offset2); - if (j < oldSize && old.child(j).sameMarkup(child)) - changedDescendants(old.child(j), child, offset2 + 1, f); - else - child.nodesBetween(0, child.content.size, f, offset2 + 1); - offset2 += child.nodeSize; - } -} -function fixTables(state, oldState) { - let tr2; - const check = (node, pos) => { - if (node.type.spec.tableRole == "table") - tr2 = fixTable(state, node, pos, tr2); - }; - if (!oldState) - state.doc.descendants(check); - else if (oldState.doc != state.doc) - changedDescendants(oldState.doc, state.doc, 0, check); - return tr2; -} -function fixTable(state, table, tablePos, tr2) { - const map2 = TableMap.get(table); - if (!map2.problems) - return tr2; - if (!tr2) - tr2 = state.tr; - const mustAdd = []; - for (let i = 0; i < map2.height; i++) - mustAdd.push(0); - for (let i = 0; i < map2.problems.length; i++) { - const prob = map2.problems[i]; - if (prob.type == "collision") { - const cell = table.nodeAt(prob.pos); - if (!cell) - continue; - const attrs = cell.attrs; - for (let j = 0; j < attrs.rowspan; j++) - mustAdd[prob.row + j] += prob.n; - tr2.setNodeMarkup( - tr2.mapping.map(tablePos + 1 + prob.pos), - null, - removeColSpan(attrs, attrs.colspan - prob.n, prob.n) - ); - } else if (prob.type == "missing") { - mustAdd[prob.row] += prob.n; - } else if (prob.type == "overlong_rowspan") { - const cell = table.nodeAt(prob.pos); - if (!cell) - continue; - tr2.setNodeMarkup(tr2.mapping.map(tablePos + 1 + prob.pos), null, { - ...cell.attrs, - rowspan: cell.attrs.rowspan - prob.n - }); - } else if (prob.type == "colwidth mismatch") { - const cell = table.nodeAt(prob.pos); - if (!cell) - continue; - tr2.setNodeMarkup(tr2.mapping.map(tablePos + 1 + prob.pos), null, { - ...cell.attrs, - colwidth: prob.colwidth - }); - } - } - let first2, last; - for (let i = 0; i < mustAdd.length; i++) - if (mustAdd[i]) { - if (first2 == null) - first2 = i; - last = i; - } - for (let i = 0, pos = tablePos + 1; i < map2.height; i++) { - const row = table.child(i); - const end2 = pos + row.nodeSize; - const add = mustAdd[i]; - if (add > 0) { - let role = "cell"; - if (row.firstChild) { - role = row.firstChild.type.spec.tableRole; - } - const nodes = []; - for (let j = 0; j < add; j++) { - const node = tableNodeTypes(state.schema)[role].createAndFill(); - if (node) - nodes.push(node); - } - const side = (i == 0 || first2 == i - 1) && last == i ? pos + 1 : end2 - 1; - tr2.insert(tr2.mapping.map(side), nodes); - } - pos = end2; - } - return tr2.setMeta(fixTablesKey, { fixTables: true }); -} -function pastedCells(slice2) { - if (!slice2.size) - return null; - let { content, openStart, openEnd } = slice2; - while (content.childCount == 1 && (openStart > 0 && openEnd > 0 || content.child(0).type.spec.tableRole == "table")) { - openStart--; - openEnd--; - content = content.child(0).content; - } - const first2 = content.child(0); - const role = first2.type.spec.tableRole; - const schema = first2.type.schema, rows = []; - if (role == "row") { - for (let i = 0; i < content.childCount; i++) { - let cells = content.child(i).content; - const left2 = i ? 0 : Math.max(0, openStart - 1); - const right2 = i < content.childCount - 1 ? 0 : Math.max(0, openEnd - 1); - if (left2 || right2) - cells = fitSlice( - tableNodeTypes(schema).row, - new Slice(cells, left2, right2) - ).content; - rows.push(cells); - } - } else if (role == "cell" || role == "header_cell") { - rows.push( - openStart || openEnd ? fitSlice( - tableNodeTypes(schema).row, - new Slice(content, openStart, openEnd) - ).content : content - ); - } else { - return null; - } - return ensureRectangular(schema, rows); -} -function ensureRectangular(schema, rows) { - const widths = []; - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - for (let j = row.childCount - 1; j >= 0; j--) { - const { rowspan, colspan } = row.child(j).attrs; - for (let r2 = i; r2 < i + rowspan; r2++) - widths[r2] = (widths[r2] || 0) + colspan; - } - } - let width = 0; - for (let r2 = 0; r2 < widths.length; r2++) - width = Math.max(width, widths[r2]); - for (let r2 = 0; r2 < widths.length; r2++) { - if (r2 >= rows.length) - rows.push(Fragment.empty); - if (widths[r2] < width) { - const empty2 = tableNodeTypes(schema).cell.createAndFill(); - const cells = []; - for (let i = widths[r2]; i < width; i++) { - cells.push(empty2); - } - rows[r2] = rows[r2].append(Fragment.from(cells)); - } - } - return { height: rows.length, width, rows }; -} -function fitSlice(nodeType, slice2) { - const node = nodeType.createAndFill(); - const tr2 = new Transform(node).replace(0, node.content.size, slice2); - return tr2.doc; -} -function clipCells({ width, height, rows }, newWidth, newHeight) { - if (width != newWidth) { - const added = []; - const newRows = []; - for (let row = 0; row < rows.length; row++) { - const frag = rows[row], cells = []; - for (let col = added[row] || 0, i = 0; col < newWidth; i++) { - let cell = frag.child(i % frag.childCount); - if (col + cell.attrs.colspan > newWidth) - cell = cell.type.createChecked( - removeColSpan( - cell.attrs, - cell.attrs.colspan, - col + cell.attrs.colspan - newWidth - ), - cell.content - ); - cells.push(cell); - col += cell.attrs.colspan; - for (let j = 1; j < cell.attrs.rowspan; j++) - added[row + j] = (added[row + j] || 0) + cell.attrs.colspan; - } - newRows.push(Fragment.from(cells)); - } - rows = newRows; - width = newWidth; - } - if (height != newHeight) { - const newRows = []; - for (let row = 0, i = 0; row < newHeight; row++, i++) { - const cells = [], source3 = rows[i % height]; - for (let j = 0; j < source3.childCount; j++) { - let cell = source3.child(j); - if (row + cell.attrs.rowspan > newHeight) - cell = cell.type.create( - { - ...cell.attrs, - rowspan: Math.max(1, newHeight - cell.attrs.rowspan) - }, - cell.content - ); - cells.push(cell); - } - newRows.push(Fragment.from(cells)); - } - rows = newRows; - height = newHeight; - } - return { width, height, rows }; -} -function growTable(tr2, map2, table, start2, width, height, mapFrom) { - const schema = tr2.doc.type.schema; - const types = tableNodeTypes(schema); - let empty2; - let emptyHead; - if (width > map2.width) { - for (let row = 0, rowEnd = 0; row < map2.height; row++) { - const rowNode = table.child(row); - rowEnd += rowNode.nodeSize; - const cells = []; - let add; - if (rowNode.lastChild == null || rowNode.lastChild.type == types.cell) - add = empty2 || (empty2 = types.cell.createAndFill()); - else - add = emptyHead || (emptyHead = types.header_cell.createAndFill()); - for (let i = map2.width; i < width; i++) - cells.push(add); - tr2.insert(tr2.mapping.slice(mapFrom).map(rowEnd - 1 + start2), cells); - } - } - if (height > map2.height) { - const cells = []; - for (let i = 0, start22 = (map2.height - 1) * map2.width; i < Math.max(map2.width, width); i++) { - const header = i >= map2.width ? false : table.nodeAt(map2.map[start22 + i]).type == types.header_cell; - cells.push( - header ? emptyHead || (emptyHead = types.header_cell.createAndFill()) : empty2 || (empty2 = types.cell.createAndFill()) - ); - } - const emptyRow = types.row.create(null, Fragment.from(cells)), rows = []; - for (let i = map2.height; i < height; i++) - rows.push(emptyRow); - tr2.insert(tr2.mapping.slice(mapFrom).map(start2 + table.nodeSize - 2), rows); - } - return !!(empty2 || emptyHead); -} -function isolateHorizontal(tr2, map2, table, start2, left2, right2, top2, mapFrom) { - if (top2 == 0 || top2 == map2.height) - return false; - let found2 = false; - for (let col = left2; col < right2; col++) { - const index = top2 * map2.width + col, pos = map2.map[index]; - if (map2.map[index - map2.width] == pos) { - found2 = true; - const cell = table.nodeAt(pos); - const { top: cellTop, left: cellLeft } = map2.findCell(pos); - tr2.setNodeMarkup(tr2.mapping.slice(mapFrom).map(pos + start2), null, { - ...cell.attrs, - rowspan: top2 - cellTop - }); - tr2.insert( - tr2.mapping.slice(mapFrom).map(map2.positionAt(top2, cellLeft, table)), - cell.type.createAndFill({ - ...cell.attrs, - rowspan: cellTop + cell.attrs.rowspan - top2 - }) - ); - col += cell.attrs.colspan - 1; - } - } - return found2; -} -function isolateVertical(tr2, map2, table, start2, top2, bottom2, left2, mapFrom) { - if (left2 == 0 || left2 == map2.width) - return false; - let found2 = false; - for (let row = top2; row < bottom2; row++) { - const index = row * map2.width + left2, pos = map2.map[index]; - if (map2.map[index - 1] == pos) { - found2 = true; - const cell = table.nodeAt(pos); - const cellLeft = map2.colCount(pos); - const updatePos = tr2.mapping.slice(mapFrom).map(pos + start2); - tr2.setNodeMarkup( - updatePos, - null, - removeColSpan( - cell.attrs, - left2 - cellLeft, - cell.attrs.colspan - (left2 - cellLeft) - ) - ); - tr2.insert( - updatePos + cell.nodeSize, - cell.type.createAndFill( - removeColSpan(cell.attrs, 0, left2 - cellLeft) - ) - ); - row += cell.attrs.rowspan - 1; - } - } - return found2; -} -function insertCells(state, dispatch, tableStart, rect, cells) { - let table = tableStart ? state.doc.nodeAt(tableStart - 1) : state.doc; - if (!table) { - throw new Error("No table found"); - } - let map2 = TableMap.get(table); - const { top: top2, left: left2 } = rect; - const right2 = left2 + cells.width, bottom2 = top2 + cells.height; - const tr2 = state.tr; - let mapFrom = 0; - function recomp() { - table = tableStart ? tr2.doc.nodeAt(tableStart - 1) : tr2.doc; - if (!table) { - throw new Error("No table found"); - } - map2 = TableMap.get(table); - mapFrom = tr2.mapping.maps.length; - } - if (growTable(tr2, map2, table, tableStart, right2, bottom2, mapFrom)) - recomp(); - if (isolateHorizontal(tr2, map2, table, tableStart, left2, right2, top2, mapFrom)) - recomp(); - if (isolateHorizontal(tr2, map2, table, tableStart, left2, right2, bottom2, mapFrom)) - recomp(); - if (isolateVertical(tr2, map2, table, tableStart, top2, bottom2, left2, mapFrom)) - recomp(); - if (isolateVertical(tr2, map2, table, tableStart, top2, bottom2, right2, mapFrom)) - recomp(); - for (let row = top2; row < bottom2; row++) { - const from2 = map2.positionAt(row, left2, table), to = map2.positionAt(row, right2, table); - tr2.replace( - tr2.mapping.slice(mapFrom).map(from2 + tableStart), - tr2.mapping.slice(mapFrom).map(to + tableStart), - new Slice(cells.rows[row - top2], 0, 0) - ); - } - recomp(); - tr2.setSelection( - new CellSelection( - tr2.doc.resolve(tableStart + map2.positionAt(top2, left2, table)), - tr2.doc.resolve(tableStart + map2.positionAt(bottom2 - 1, right2 - 1, table)) - ) - ); - dispatch(tr2); -} -var handleKeyDown2 = keydownHandler({ - ArrowLeft: arrow2("horiz", -1), - ArrowRight: arrow2("horiz", 1), - ArrowUp: arrow2("vert", -1), - ArrowDown: arrow2("vert", 1), - "Shift-ArrowLeft": shiftArrow("horiz", -1), - "Shift-ArrowRight": shiftArrow("horiz", 1), - "Shift-ArrowUp": shiftArrow("vert", -1), - "Shift-ArrowDown": shiftArrow("vert", 1), - Backspace: deleteCellSelection, - "Mod-Backspace": deleteCellSelection, - Delete: deleteCellSelection, - "Mod-Delete": deleteCellSelection -}); -function maybeSetSelection(state, dispatch, selection) { - if (selection.eq(state.selection)) - return false; - if (dispatch) - dispatch(state.tr.setSelection(selection).scrollIntoView()); - return true; -} -function arrow2(axis, dir) { - return (state, dispatch, view) => { - if (!view) - return false; - const sel = state.selection; - if (sel instanceof CellSelection) { - return maybeSetSelection( - state, - dispatch, - Selection.near(sel.$headCell, dir) - ); - } - if (axis != "horiz" && !sel.empty) - return false; - const end2 = atEndOfCell(view, axis, dir); - if (end2 == null) - return false; - if (axis == "horiz") { - return maybeSetSelection( - state, - dispatch, - Selection.near(state.doc.resolve(sel.head + dir), dir) - ); - } else { - const $cell = state.doc.resolve(end2); - const $next = nextCell($cell, axis, dir); - let newSel; - if ($next) - newSel = Selection.near($next, 1); - else if (dir < 0) - newSel = Selection.near(state.doc.resolve($cell.before(-1)), -1); - else - newSel = Selection.near(state.doc.resolve($cell.after(-1)), 1); - return maybeSetSelection(state, dispatch, newSel); - } - }; -} -function shiftArrow(axis, dir) { - return (state, dispatch, view) => { - if (!view) - return false; - const sel = state.selection; - let cellSel; - if (sel instanceof CellSelection) { - cellSel = sel; - } else { - const end2 = atEndOfCell(view, axis, dir); - if (end2 == null) - return false; - cellSel = new CellSelection(state.doc.resolve(end2)); - } - const $head = nextCell(cellSel.$headCell, axis, dir); - if (!$head) - return false; - return maybeSetSelection( - state, - dispatch, - new CellSelection(cellSel.$anchorCell, $head) - ); - }; -} -function deleteCellSelection(state, dispatch) { - const sel = state.selection; - if (!(sel instanceof CellSelection)) - return false; - if (dispatch) { - const tr2 = state.tr; - const baseContent = tableNodeTypes(state.schema).cell.createAndFill().content; - sel.forEachCell((cell, pos) => { - if (!cell.content.eq(baseContent)) - tr2.replace( - tr2.mapping.map(pos + 1), - tr2.mapping.map(pos + cell.nodeSize - 1), - new Slice(baseContent, 0, 0) - ); - }); - if (tr2.docChanged) - dispatch(tr2); - } - return true; -} -function handleTripleClick2(view, pos) { - const doc3 = view.state.doc, $cell = cellAround(doc3.resolve(pos)); - if (!$cell) - return false; - view.dispatch(view.state.tr.setSelection(new CellSelection($cell))); - return true; -} -function handlePaste(view, _, slice2) { - if (!isInTable(view.state)) - return false; - let cells = pastedCells(slice2); - const sel = view.state.selection; - if (sel instanceof CellSelection) { - if (!cells) - cells = { - width: 1, - height: 1, - rows: [ - Fragment.from( - fitSlice(tableNodeTypes(view.state.schema).cell, slice2) - ) - ] - }; - const table = sel.$anchorCell.node(-1); - const start2 = sel.$anchorCell.start(-1); - const rect = TableMap.get(table).rectBetween( - sel.$anchorCell.pos - start2, - sel.$headCell.pos - start2 - ); - cells = clipCells(cells, rect.right - rect.left, rect.bottom - rect.top); - insertCells(view.state, view.dispatch, start2, rect, cells); - return true; - } else if (cells) { - const $cell = selectionCell(view.state); - const start2 = $cell.start(-1); - insertCells( - view.state, - view.dispatch, - start2, - TableMap.get($cell.node(-1)).findCell($cell.pos - start2), - cells - ); - return true; - } else { - return false; - } -} -function handleMouseDown(view, startEvent) { - var _a; - if (startEvent.ctrlKey || startEvent.metaKey) - return; - const startDOMCell = domInCell(view, startEvent.target); - let $anchor; - if (startEvent.shiftKey && view.state.selection instanceof CellSelection) { - setCellSelection(view.state.selection.$anchorCell, startEvent); - startEvent.preventDefault(); - } else if (startEvent.shiftKey && startDOMCell && ($anchor = cellAround(view.state.selection.$anchor)) != null && ((_a = cellUnderMouse(view, startEvent)) == null ? void 0 : _a.pos) != $anchor.pos) { - setCellSelection($anchor, startEvent); - startEvent.preventDefault(); - } else if (!startDOMCell) { - return; - } - function setCellSelection($anchor2, event) { - let $head = cellUnderMouse(view, event); - const starting = tableEditingKey.getState(view.state) == null; - if (!$head || !inSameTable($anchor2, $head)) { - if (starting) - $head = $anchor2; - else - return; - } - const selection = new CellSelection($anchor2, $head); - if (starting || !view.state.selection.eq(selection)) { - const tr2 = view.state.tr.setSelection(selection); - if (starting) - tr2.setMeta(tableEditingKey, $anchor2.pos); - view.dispatch(tr2); - } - } - function stop() { - view.root.removeEventListener("mouseup", stop); - view.root.removeEventListener("dragstart", stop); - view.root.removeEventListener("mousemove", move); - if (tableEditingKey.getState(view.state) != null) - view.dispatch(view.state.tr.setMeta(tableEditingKey, -1)); - } - function move(_event) { - const event = _event; - const anchor = tableEditingKey.getState(view.state); - let $anchor2; - if (anchor != null) { - $anchor2 = view.state.doc.resolve(anchor); - } else if (domInCell(view, event.target) != startDOMCell) { - $anchor2 = cellUnderMouse(view, startEvent); - if (!$anchor2) - return stop(); - } - if ($anchor2) - setCellSelection($anchor2, event); - } - view.root.addEventListener("mouseup", stop); - view.root.addEventListener("dragstart", stop); - view.root.addEventListener("mousemove", move); -} -function atEndOfCell(view, axis, dir) { - if (!(view.state.selection instanceof TextSelection)) - return null; - const { $head } = view.state.selection; - for (let d = $head.depth - 1; d >= 0; d--) { - const parent = $head.node(d), index = dir < 0 ? $head.index(d) : $head.indexAfter(d); - if (index != (dir < 0 ? 0 : parent.childCount)) - return null; - if (parent.type.spec.tableRole == "cell" || parent.type.spec.tableRole == "header_cell") { - const cellPos = $head.before(d); - const dirStr = axis == "vert" ? dir > 0 ? "down" : "up" : dir > 0 ? "right" : "left"; - return view.endOfTextblock(dirStr) ? cellPos : null; - } - } - return null; -} -function domInCell(view, dom) { - for (; dom && dom != view.dom; dom = dom.parentNode) { - if (dom.nodeName == "TD" || dom.nodeName == "TH") { - return dom; - } - } - return null; -} -function cellUnderMouse(view, event) { - const mousePos = view.posAtCoords({ - left: event.clientX, - top: event.clientY - }); - if (!mousePos) - return null; - return mousePos ? cellAround(view.state.doc.resolve(mousePos.pos)) : null; -} -var TableView = class { - constructor(node, cellMinWidth) { - this.node = node; - this.cellMinWidth = cellMinWidth; - this.dom = document.createElement("div"); - this.dom.className = "tableWrapper"; - this.table = this.dom.appendChild(document.createElement("table")); - this.colgroup = this.table.appendChild(document.createElement("colgroup")); - updateColumnsOnResize(node, this.colgroup, this.table, cellMinWidth); - this.contentDOM = this.table.appendChild(document.createElement("tbody")); - } - update(node) { - if (node.type != this.node.type) - return false; - this.node = node; - updateColumnsOnResize(node, this.colgroup, this.table, this.cellMinWidth); - return true; - } - ignoreMutation(record) { - return record.type == "attributes" && (record.target == this.table || this.colgroup.contains(record.target)); - } -}; -function updateColumnsOnResize(node, colgroup, table, cellMinWidth, overrideCol, overrideValue) { - var _a; - let totalWidth = 0; - let fixedWidth = true; - let nextDOM = colgroup.firstChild; - const row = node.firstChild; - if (!row) - return; - for (let i = 0, col = 0; i < row.childCount; i++) { - const { colspan, colwidth } = row.child(i).attrs; - for (let j = 0; j < colspan; j++, col++) { - const hasWidth = overrideCol == col ? overrideValue : colwidth && colwidth[j]; - const cssWidth = hasWidth ? hasWidth + "px" : ""; - totalWidth += hasWidth || cellMinWidth; - if (!hasWidth) - fixedWidth = false; - if (!nextDOM) { - colgroup.appendChild(document.createElement("col")).style.width = cssWidth; - } else { - if (nextDOM.style.width != cssWidth) - nextDOM.style.width = cssWidth; - nextDOM = nextDOM.nextSibling; - } - } - } - while (nextDOM) { - const after = nextDOM.nextSibling; - (_a = nextDOM.parentNode) == null ? void 0 : _a.removeChild(nextDOM); - nextDOM = after; - } - if (fixedWidth) { - table.style.width = totalWidth + "px"; - table.style.minWidth = ""; - } else { - table.style.width = ""; - table.style.minWidth = totalWidth + "px"; - } -} -var columnResizingPluginKey = new PluginKey( - "tableColumnResizing" -); -function columnResizing({ - handleWidth = 5, - cellMinWidth = 25, - View = TableView, - lastColumnResizable = true -} = {}) { - const plugin = new Plugin({ - key: columnResizingPluginKey, - state: { - init(_, state) { - plugin.spec.props.nodeViews[tableNodeTypes(state.schema).table.name] = (node, view) => new View(node, cellMinWidth, view); - return new ResizeState(-1, false); - }, - apply(tr2, prev) { - return prev.apply(tr2); - } - }, - props: { - attributes: (state) => { - const pluginState = columnResizingPluginKey.getState(state); - return pluginState && pluginState.activeHandle > -1 ? { class: "resize-cursor" } : {}; - }, - handleDOMEvents: { - mousemove: (view, event) => { - handleMouseMove( - view, - event, - handleWidth, - cellMinWidth, - lastColumnResizable - ); - }, - mouseleave: (view) => { - handleMouseLeave(view); - }, - mousedown: (view, event) => { - handleMouseDown2(view, event, cellMinWidth); - } - }, - decorations: (state) => { - const pluginState = columnResizingPluginKey.getState(state); - if (pluginState && pluginState.activeHandle > -1) { - return handleDecorations(state, pluginState.activeHandle); - } - }, - nodeViews: {} - } - }); - return plugin; -} -var ResizeState = class _ResizeState { - constructor(activeHandle, dragging) { - this.activeHandle = activeHandle; - this.dragging = dragging; - } - apply(tr2) { - const state = this; - const action = tr2.getMeta(columnResizingPluginKey); - if (action && action.setHandle != null) - return new _ResizeState(action.setHandle, false); - if (action && action.setDragging !== void 0) - return new _ResizeState(state.activeHandle, action.setDragging); - if (state.activeHandle > -1 && tr2.docChanged) { - let handle = tr2.mapping.map(state.activeHandle, -1); - if (!pointsAtCell(tr2.doc.resolve(handle))) { - handle = -1; - } - return new _ResizeState(handle, state.dragging); - } - return state; - } -}; -function handleMouseMove(view, event, handleWidth, cellMinWidth, lastColumnResizable) { - const pluginState = columnResizingPluginKey.getState(view.state); - if (!pluginState) - return; - if (!pluginState.dragging) { - const target = domCellAround(event.target); - let cell = -1; - if (target) { - const { left: left2, right: right2 } = target.getBoundingClientRect(); - if (event.clientX - left2 <= handleWidth) - cell = edgeCell(view, event, "left", handleWidth); - else if (right2 - event.clientX <= handleWidth) - cell = edgeCell(view, event, "right", handleWidth); - } - if (cell != pluginState.activeHandle) { - if (!lastColumnResizable && cell !== -1) { - const $cell = view.state.doc.resolve(cell); - const table = $cell.node(-1); - const map2 = TableMap.get(table); - const tableStart = $cell.start(-1); - const col = map2.colCount($cell.pos - tableStart) + $cell.nodeAfter.attrs.colspan - 1; - if (col == map2.width - 1) { - return; - } - } - updateHandle(view, cell); - } - } -} -function handleMouseLeave(view) { - const pluginState = columnResizingPluginKey.getState(view.state); - if (pluginState && pluginState.activeHandle > -1 && !pluginState.dragging) - updateHandle(view, -1); -} -function handleMouseDown2(view, event, cellMinWidth) { - const pluginState = columnResizingPluginKey.getState(view.state); - if (!pluginState || pluginState.activeHandle == -1 || pluginState.dragging) - return false; - const cell = view.state.doc.nodeAt(pluginState.activeHandle); - const width = currentColWidth(view, pluginState.activeHandle, cell.attrs); - view.dispatch( - view.state.tr.setMeta(columnResizingPluginKey, { - setDragging: { startX: event.clientX, startWidth: width } - }) - ); - function finish(event2) { - window.removeEventListener("mouseup", finish); - window.removeEventListener("mousemove", move); - const pluginState2 = columnResizingPluginKey.getState(view.state); - if (pluginState2 == null ? void 0 : pluginState2.dragging) { - updateColumnWidth( - view, - pluginState2.activeHandle, - draggedWidth(pluginState2.dragging, event2, cellMinWidth) - ); - view.dispatch( - view.state.tr.setMeta(columnResizingPluginKey, { setDragging: null }) - ); - } - } - function move(event2) { - if (!event2.which) - return finish(event2); - const pluginState2 = columnResizingPluginKey.getState(view.state); - if (!pluginState2) - return; - if (pluginState2.dragging) { - const dragged = draggedWidth(pluginState2.dragging, event2, cellMinWidth); - displayColumnWidth(view, pluginState2.activeHandle, dragged, cellMinWidth); - } - } - window.addEventListener("mouseup", finish); - window.addEventListener("mousemove", move); - event.preventDefault(); - return true; -} -function currentColWidth(view, cellPos, { colspan, colwidth }) { - const width = colwidth && colwidth[colwidth.length - 1]; - if (width) - return width; - const dom = view.domAtPos(cellPos); - const node = dom.node.childNodes[dom.offset]; - let domWidth = node.offsetWidth, parts = colspan; - if (colwidth) { - for (let i = 0; i < colspan; i++) - if (colwidth[i]) { - domWidth -= colwidth[i]; - parts--; - } - } - return domWidth / parts; -} -function domCellAround(target) { - while (target && target.nodeName != "TD" && target.nodeName != "TH") - target = target.classList && target.classList.contains("ProseMirror") ? null : target.parentNode; - return target; -} -function edgeCell(view, event, side, handleWidth) { - const offset2 = side == "right" ? -handleWidth : handleWidth; - const found2 = view.posAtCoords({ - left: event.clientX + offset2, - top: event.clientY - }); - if (!found2) - return -1; - const { pos } = found2; - const $cell = cellAround(view.state.doc.resolve(pos)); - if (!$cell) - return -1; - if (side == "right") - return $cell.pos; - const map2 = TableMap.get($cell.node(-1)), start2 = $cell.start(-1); - const index = map2.map.indexOf($cell.pos - start2); - return index % map2.width == 0 ? -1 : start2 + map2.map[index - 1]; -} -function draggedWidth(dragging, event, cellMinWidth) { - const offset2 = event.clientX - dragging.startX; - return Math.max(cellMinWidth, dragging.startWidth + offset2); -} -function updateHandle(view, value) { - view.dispatch( - view.state.tr.setMeta(columnResizingPluginKey, { setHandle: value }) - ); -} -function updateColumnWidth(view, cell, width) { - const $cell = view.state.doc.resolve(cell); - const table = $cell.node(-1), map2 = TableMap.get(table), start2 = $cell.start(-1); - const col = map2.colCount($cell.pos - start2) + $cell.nodeAfter.attrs.colspan - 1; - const tr2 = view.state.tr; - for (let row = 0; row < map2.height; row++) { - const mapIndex = row * map2.width + col; - if (row && map2.map[mapIndex] == map2.map[mapIndex - map2.width]) - continue; - const pos = map2.map[mapIndex]; - const attrs = table.nodeAt(pos).attrs; - const index = attrs.colspan == 1 ? 0 : col - map2.colCount(pos); - if (attrs.colwidth && attrs.colwidth[index] == width) - continue; - const colwidth = attrs.colwidth ? attrs.colwidth.slice() : zeroes(attrs.colspan); - colwidth[index] = width; - tr2.setNodeMarkup(start2 + pos, null, { ...attrs, colwidth }); - } - if (tr2.docChanged) - view.dispatch(tr2); -} -function displayColumnWidth(view, cell, width, cellMinWidth) { - const $cell = view.state.doc.resolve(cell); - const table = $cell.node(-1), start2 = $cell.start(-1); - const col = TableMap.get(table).colCount($cell.pos - start2) + $cell.nodeAfter.attrs.colspan - 1; - let dom = view.domAtPos($cell.start(-1)).node; - while (dom && dom.nodeName != "TABLE") { - dom = dom.parentNode; - } - if (!dom) - return; - updateColumnsOnResize( - table, - dom.firstChild, - dom, - cellMinWidth, - col, - width - ); -} -function zeroes(n) { - return Array(n).fill(0); -} -function handleDecorations(state, cell) { - const decorations = []; - const $cell = state.doc.resolve(cell); - const table = $cell.node(-1); - if (!table) { - return DecorationSet.empty; - } - const map2 = TableMap.get(table); - const start2 = $cell.start(-1); - const col = map2.colCount($cell.pos - start2) + $cell.nodeAfter.attrs.colspan; - for (let row = 0; row < map2.height; row++) { - const index = col + row * map2.width - 1; - if ((col == map2.width || map2.map[index] != map2.map[index + 1]) && (row == 0 || map2.map[index] != map2.map[index - map2.width])) { - const cellPos = map2.map[index]; - const pos = start2 + cellPos + table.nodeAt(cellPos).nodeSize - 1; - const dom = document.createElement("div"); - dom.className = "column-resize-handle"; - decorations.push(Decoration.widget(pos, dom)); - } - } - return DecorationSet.create(state.doc, decorations); -} -function selectedRect(state) { - const sel = state.selection; - const $pos = selectionCell(state); - const table = $pos.node(-1); - const tableStart = $pos.start(-1); - const map2 = TableMap.get(table); - const rect = sel instanceof CellSelection ? map2.rectBetween( - sel.$anchorCell.pos - tableStart, - sel.$headCell.pos - tableStart - ) : map2.findCell($pos.pos - tableStart); - return { ...rect, tableStart, map: map2, table }; -} -function addColumn(tr2, { map: map2, tableStart, table }, col) { - let refColumn = col > 0 ? -1 : 0; - if (columnIsHeader(map2, table, col + refColumn)) { - refColumn = col == 0 || col == map2.width ? null : 0; - } - for (let row = 0; row < map2.height; row++) { - const index = row * map2.width + col; - if (col > 0 && col < map2.width && map2.map[index - 1] == map2.map[index]) { - const pos = map2.map[index]; - const cell = table.nodeAt(pos); - tr2.setNodeMarkup( - tr2.mapping.map(tableStart + pos), - null, - addColSpan(cell.attrs, col - map2.colCount(pos)) - ); - row += cell.attrs.rowspan - 1; - } else { - const type = refColumn == null ? tableNodeTypes(table.type.schema).cell : table.nodeAt(map2.map[index + refColumn]).type; - const pos = map2.positionAt(row, col, table); - tr2.insert(tr2.mapping.map(tableStart + pos), type.createAndFill()); - } - } - return tr2; -} -function addColumnBefore(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const rect = selectedRect(state); - dispatch(addColumn(state.tr, rect, rect.left)); - } - return true; -} -function addColumnAfter(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const rect = selectedRect(state); - dispatch(addColumn(state.tr, rect, rect.right)); - } - return true; -} -function removeColumn(tr2, { map: map2, table, tableStart }, col) { - const mapStart = tr2.mapping.maps.length; - for (let row = 0; row < map2.height; ) { - const index = row * map2.width + col; - const pos = map2.map[index]; - const cell = table.nodeAt(pos); - const attrs = cell.attrs; - if (col > 0 && map2.map[index - 1] == pos || col < map2.width - 1 && map2.map[index + 1] == pos) { - tr2.setNodeMarkup( - tr2.mapping.slice(mapStart).map(tableStart + pos), - null, - removeColSpan(attrs, col - map2.colCount(pos)) - ); - } else { - const start2 = tr2.mapping.slice(mapStart).map(tableStart + pos); - tr2.delete(start2, start2 + cell.nodeSize); - } - row += attrs.rowspan; - } -} -function deleteColumn(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const rect = selectedRect(state); - const tr2 = state.tr; - if (rect.left == 0 && rect.right == rect.map.width) - return false; - for (let i = rect.right - 1; ; i--) { - removeColumn(tr2, rect, i); - if (i == rect.left) - break; - const table = rect.tableStart ? tr2.doc.nodeAt(rect.tableStart - 1) : tr2.doc; - if (!table) { - throw RangeError("No table found"); - } - rect.table = table; - rect.map = TableMap.get(table); - } - dispatch(tr2); - } - return true; -} -function rowIsHeader(map2, table, row) { - var _a; - const headerCell = tableNodeTypes(table.type.schema).header_cell; - for (let col = 0; col < map2.width; col++) - if (((_a = table.nodeAt(map2.map[col + row * map2.width])) == null ? void 0 : _a.type) != headerCell) - return false; - return true; -} -function addRow(tr2, { map: map2, tableStart, table }, row) { - var _a; - let rowPos = tableStart; - for (let i = 0; i < row; i++) - rowPos += table.child(i).nodeSize; - const cells = []; - let refRow = row > 0 ? -1 : 0; - if (rowIsHeader(map2, table, row + refRow)) - refRow = row == 0 || row == map2.height ? null : 0; - for (let col = 0, index = map2.width * row; col < map2.width; col++, index++) { - if (row > 0 && row < map2.height && map2.map[index] == map2.map[index - map2.width]) { - const pos = map2.map[index]; - const attrs = table.nodeAt(pos).attrs; - tr2.setNodeMarkup(tableStart + pos, null, { - ...attrs, - rowspan: attrs.rowspan + 1 - }); - col += attrs.colspan - 1; - } else { - const type = refRow == null ? tableNodeTypes(table.type.schema).cell : (_a = table.nodeAt(map2.map[index + refRow * map2.width])) == null ? void 0 : _a.type; - const node = type == null ? void 0 : type.createAndFill(); - if (node) - cells.push(node); - } - } - tr2.insert(rowPos, tableNodeTypes(table.type.schema).row.create(null, cells)); - return tr2; -} -function addRowBefore(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const rect = selectedRect(state); - dispatch(addRow(state.tr, rect, rect.top)); - } - return true; -} -function addRowAfter(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const rect = selectedRect(state); - dispatch(addRow(state.tr, rect, rect.bottom)); - } - return true; -} -function removeRow(tr2, { map: map2, table, tableStart }, row) { - let rowPos = 0; - for (let i = 0; i < row; i++) - rowPos += table.child(i).nodeSize; - const nextRow = rowPos + table.child(row).nodeSize; - const mapFrom = tr2.mapping.maps.length; - tr2.delete(rowPos + tableStart, nextRow + tableStart); - const seen = /* @__PURE__ */ new Set(); - for (let col = 0, index = row * map2.width; col < map2.width; col++, index++) { - const pos = map2.map[index]; - if (seen.has(pos)) - continue; - seen.add(pos); - if (row > 0 && pos == map2.map[index - map2.width]) { - const attrs = table.nodeAt(pos).attrs; - tr2.setNodeMarkup(tr2.mapping.slice(mapFrom).map(pos + tableStart), null, { - ...attrs, - rowspan: attrs.rowspan - 1 - }); - col += attrs.colspan - 1; - } else if (row < map2.height && pos == map2.map[index + map2.width]) { - const cell = table.nodeAt(pos); - const attrs = cell.attrs; - const copy2 = cell.type.create( - { ...attrs, rowspan: cell.attrs.rowspan - 1 }, - cell.content - ); - const newPos = map2.positionAt(row + 1, col, table); - tr2.insert(tr2.mapping.slice(mapFrom).map(tableStart + newPos), copy2); - col += attrs.colspan - 1; - } - } -} -function deleteRow(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const rect = selectedRect(state), tr2 = state.tr; - if (rect.top == 0 && rect.bottom == rect.map.height) - return false; - for (let i = rect.bottom - 1; ; i--) { - removeRow(tr2, rect, i); - if (i == rect.top) - break; - const table = rect.tableStart ? tr2.doc.nodeAt(rect.tableStart - 1) : tr2.doc; - if (!table) { - throw RangeError("No table found"); - } - rect.table = table; - rect.map = TableMap.get(rect.table); - } - dispatch(tr2); - } - return true; -} -function isEmpty(cell) { - const c2 = cell.content; - return c2.childCount == 1 && c2.child(0).isTextblock && c2.child(0).childCount == 0; -} -function cellsOverlapRectangle({ width, height, map: map2 }, rect) { - let indexTop = rect.top * width + rect.left, indexLeft = indexTop; - let indexBottom = (rect.bottom - 1) * width + rect.left, indexRight = indexTop + (rect.right - rect.left - 1); - for (let i = rect.top; i < rect.bottom; i++) { - if (rect.left > 0 && map2[indexLeft] == map2[indexLeft - 1] || rect.right < width && map2[indexRight] == map2[indexRight + 1]) - return true; - indexLeft += width; - indexRight += width; - } - for (let i = rect.left; i < rect.right; i++) { - if (rect.top > 0 && map2[indexTop] == map2[indexTop - width] || rect.bottom < height && map2[indexBottom] == map2[indexBottom + width]) - return true; - indexTop++; - indexBottom++; - } - return false; -} -function mergeCells(state, dispatch) { - const sel = state.selection; - if (!(sel instanceof CellSelection) || sel.$anchorCell.pos == sel.$headCell.pos) - return false; - const rect = selectedRect(state), { map: map2 } = rect; - if (cellsOverlapRectangle(map2, rect)) - return false; - if (dispatch) { - const tr2 = state.tr; - const seen = {}; - let content = Fragment.empty; - let mergedPos; - let mergedCell; - for (let row = rect.top; row < rect.bottom; row++) { - for (let col = rect.left; col < rect.right; col++) { - const cellPos = map2.map[row * map2.width + col]; - const cell = rect.table.nodeAt(cellPos); - if (seen[cellPos] || !cell) - continue; - seen[cellPos] = true; - if (mergedPos == null) { - mergedPos = cellPos; - mergedCell = cell; - } else { - if (!isEmpty(cell)) - content = content.append(cell.content); - const mapped = tr2.mapping.map(cellPos + rect.tableStart); - tr2.delete(mapped, mapped + cell.nodeSize); - } - } - } - if (mergedPos == null || mergedCell == null) { - return true; - } - tr2.setNodeMarkup(mergedPos + rect.tableStart, null, { - ...addColSpan( - mergedCell.attrs, - mergedCell.attrs.colspan, - rect.right - rect.left - mergedCell.attrs.colspan - ), - rowspan: rect.bottom - rect.top - }); - if (content.size) { - const end2 = mergedPos + 1 + mergedCell.content.size; - const start2 = isEmpty(mergedCell) ? mergedPos + 1 : end2; - tr2.replaceWith(start2 + rect.tableStart, end2 + rect.tableStart, content); - } - tr2.setSelection( - new CellSelection(tr2.doc.resolve(mergedPos + rect.tableStart)) - ); - dispatch(tr2); - } - return true; -} -function splitCell(state, dispatch) { - const nodeTypes = tableNodeTypes(state.schema); - return splitCellWithType(({ node }) => { - return nodeTypes[node.type.spec.tableRole]; - })(state, dispatch); -} -function splitCellWithType(getCellType) { - return (state, dispatch) => { - var _a; - const sel = state.selection; - let cellNode; - let cellPos; - if (!(sel instanceof CellSelection)) { - cellNode = cellWrapping(sel.$from); - if (!cellNode) - return false; - cellPos = (_a = cellAround(sel.$from)) == null ? void 0 : _a.pos; - } else { - if (sel.$anchorCell.pos != sel.$headCell.pos) - return false; - cellNode = sel.$anchorCell.nodeAfter; - cellPos = sel.$anchorCell.pos; - } - if (cellNode == null || cellPos == null) { - return false; - } - if (cellNode.attrs.colspan == 1 && cellNode.attrs.rowspan == 1) { - return false; - } - if (dispatch) { - let baseAttrs = cellNode.attrs; - const attrs = []; - const colwidth = baseAttrs.colwidth; - if (baseAttrs.rowspan > 1) - baseAttrs = { ...baseAttrs, rowspan: 1 }; - if (baseAttrs.colspan > 1) - baseAttrs = { ...baseAttrs, colspan: 1 }; - const rect = selectedRect(state), tr2 = state.tr; - for (let i = 0; i < rect.right - rect.left; i++) - attrs.push( - colwidth ? { - ...baseAttrs, - colwidth: colwidth && colwidth[i] ? [colwidth[i]] : null - } : baseAttrs - ); - let lastCell; - for (let row = rect.top; row < rect.bottom; row++) { - let pos = rect.map.positionAt(row, rect.left, rect.table); - if (row == rect.top) - pos += cellNode.nodeSize; - for (let col = rect.left, i = 0; col < rect.right; col++, i++) { - if (col == rect.left && row == rect.top) - continue; - tr2.insert( - lastCell = tr2.mapping.map(pos + rect.tableStart, 1), - getCellType({ node: cellNode, row, col }).createAndFill(attrs[i]) - ); - } - } - tr2.setNodeMarkup( - cellPos, - getCellType({ node: cellNode, row: rect.top, col: rect.left }), - attrs[0] - ); - if (sel instanceof CellSelection) - tr2.setSelection( - new CellSelection( - tr2.doc.resolve(sel.$anchorCell.pos), - lastCell ? tr2.doc.resolve(lastCell) : void 0 - ) - ); - dispatch(tr2); - } - return true; - }; -} -function setCellAttr(name, value) { - return function(state, dispatch) { - if (!isInTable(state)) - return false; - const $cell = selectionCell(state); - if ($cell.nodeAfter.attrs[name] === value) - return false; - if (dispatch) { - const tr2 = state.tr; - if (state.selection instanceof CellSelection) - state.selection.forEachCell((node, pos) => { - if (node.attrs[name] !== value) - tr2.setNodeMarkup(pos, null, { - ...node.attrs, - [name]: value - }); - }); - else - tr2.setNodeMarkup($cell.pos, null, { - ...$cell.nodeAfter.attrs, - [name]: value - }); - dispatch(tr2); - } - return true; - }; -} -function deprecated_toggleHeader(type) { - return function(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const types = tableNodeTypes(state.schema); - const rect = selectedRect(state), tr2 = state.tr; - const cells = rect.map.cellsInRect( - type == "column" ? { - left: rect.left, - top: 0, - right: rect.right, - bottom: rect.map.height - } : type == "row" ? { - left: 0, - top: rect.top, - right: rect.map.width, - bottom: rect.bottom - } : rect - ); - const nodes = cells.map((pos) => rect.table.nodeAt(pos)); - for (let i = 0; i < cells.length; i++) - if (nodes[i].type == types.header_cell) - tr2.setNodeMarkup( - rect.tableStart + cells[i], - types.cell, - nodes[i].attrs - ); - if (tr2.steps.length == 0) - for (let i = 0; i < cells.length; i++) - tr2.setNodeMarkup( - rect.tableStart + cells[i], - types.header_cell, - nodes[i].attrs - ); - dispatch(tr2); - } - return true; - }; -} -function isHeaderEnabledByType(type, rect, types) { - const cellPositions = rect.map.cellsInRect({ - left: 0, - top: 0, - right: type == "row" ? rect.map.width : 1, - bottom: type == "column" ? rect.map.height : 1 - }); - for (let i = 0; i < cellPositions.length; i++) { - const cell = rect.table.nodeAt(cellPositions[i]); - if (cell && cell.type !== types.header_cell) { - return false; - } - } - return true; -} -function toggleHeader(type, options) { - options = options || { useDeprecatedLogic: false }; - if (options.useDeprecatedLogic) - return deprecated_toggleHeader(type); - return function(state, dispatch) { - if (!isInTable(state)) - return false; - if (dispatch) { - const types = tableNodeTypes(state.schema); - const rect = selectedRect(state), tr2 = state.tr; - const isHeaderRowEnabled = isHeaderEnabledByType("row", rect, types); - const isHeaderColumnEnabled = isHeaderEnabledByType( - "column", - rect, - types - ); - const isHeaderEnabled = type === "column" ? isHeaderRowEnabled : type === "row" ? isHeaderColumnEnabled : false; - const selectionStartsAt = isHeaderEnabled ? 1 : 0; - const cellsRect = type == "column" ? { - left: 0, - top: selectionStartsAt, - right: 1, - bottom: rect.map.height - } : type == "row" ? { - left: selectionStartsAt, - top: 0, - right: rect.map.width, - bottom: 1 - } : rect; - const newType = type == "column" ? isHeaderColumnEnabled ? types.cell : types.header_cell : type == "row" ? isHeaderRowEnabled ? types.cell : types.header_cell : types.cell; - rect.map.cellsInRect(cellsRect).forEach((relativeCellPos) => { - const cellPos = relativeCellPos + rect.tableStart; - const cell = tr2.doc.nodeAt(cellPos); - if (cell) { - tr2.setNodeMarkup(cellPos, newType, cell.attrs); - } - }); - dispatch(tr2); - } - return true; - }; -} -var toggleHeaderRow = toggleHeader("row", { - useDeprecatedLogic: true -}); -var toggleHeaderColumn = toggleHeader("column", { - useDeprecatedLogic: true -}); -var toggleHeaderCell = toggleHeader("cell", { - useDeprecatedLogic: true -}); -function findNextCell($cell, dir) { - if (dir < 0) { - const before = $cell.nodeBefore; - if (before) - return $cell.pos - before.nodeSize; - for (let row = $cell.index(-1) - 1, rowEnd = $cell.before(); row >= 0; row--) { - const rowNode = $cell.node(-1).child(row); - const lastChild = rowNode.lastChild; - if (lastChild) { - return rowEnd - 1 - lastChild.nodeSize; - } - rowEnd -= rowNode.nodeSize; - } - } else { - if ($cell.index() < $cell.parent.childCount - 1) { - return $cell.pos + $cell.nodeAfter.nodeSize; - } - const table = $cell.node(-1); - for (let row = $cell.indexAfter(-1), rowStart = $cell.after(); row < table.childCount; row++) { - const rowNode = table.child(row); - if (rowNode.childCount) - return rowStart + 1; - rowStart += rowNode.nodeSize; - } - } - return null; -} -function goToNextCell(direction) { - return function(state, dispatch) { - if (!isInTable(state)) - return false; - const cell = findNextCell(selectionCell(state), direction); - if (cell == null) - return false; - if (dispatch) { - const $cell = state.doc.resolve(cell); - dispatch( - state.tr.setSelection(TextSelection.between($cell, moveCellForward($cell))).scrollIntoView() - ); - } - return true; - }; -} -function deleteTable(state, dispatch) { - const $pos = state.selection.$anchor; - for (let d = $pos.depth; d > 0; d--) { - const node = $pos.node(d); - if (node.type.spec.tableRole == "table") { - if (dispatch) - dispatch( - state.tr.delete($pos.before(d), $pos.after(d)).scrollIntoView() - ); - return true; - } - } - return false; -} -function tableEditing({ - allowTableNodeSelection = false -} = {}) { - return new Plugin({ - key: tableEditingKey, - // This piece of state is used to remember when a mouse-drag - // cell-selection is happening, so that it can continue even as - // transactions (which might move its anchor cell) come in. - state: { - init() { - return null; - }, - apply(tr2, cur) { - const set = tr2.getMeta(tableEditingKey); - if (set != null) - return set == -1 ? null : set; - if (cur == null || !tr2.docChanged) - return cur; - const { deleted, pos } = tr2.mapping.mapResult(cur); - return deleted ? null : pos; - } - }, - props: { - decorations: drawCellSelection, - handleDOMEvents: { - mousedown: handleMouseDown - }, - createSelectionBetween(view) { - return tableEditingKey.getState(view.state) != null ? view.state.selection : null; - }, - handleTripleClick: handleTripleClick2, - handleKeyDown: handleKeyDown2, - handlePaste - }, - appendTransaction(_, oldState, state) { - return normalizeSelection( - state, - fixTables(state, oldState), - allowTableNodeSelection - ); - } - }); -} - -// node_modules/@tiptap/extension-table/dist/index.js -function updateColumns(node, colgroup, table, cellMinWidth, overrideCol, overrideValue) { - let totalWidth = 0; - let fixedWidth = true; - let nextDOM = colgroup.firstChild; - const row = node.firstChild; - for (let i = 0, col = 0; i < row.childCount; i += 1) { - const { colspan, colwidth } = row.child(i).attrs; - for (let j = 0; j < colspan; j += 1, col += 1) { - const hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j]; - const cssWidth = hasWidth ? `${hasWidth}px` : ""; - totalWidth += hasWidth || cellMinWidth; - if (!hasWidth) { - fixedWidth = false; - } - if (!nextDOM) { - colgroup.appendChild(document.createElement("col")).style.width = cssWidth; - } else { - if (nextDOM.style.width !== cssWidth) { - nextDOM.style.width = cssWidth; - } - nextDOM = nextDOM.nextSibling; - } - } - } - while (nextDOM) { - const after = nextDOM.nextSibling; - nextDOM.parentNode.removeChild(nextDOM); - nextDOM = after; - } - if (fixedWidth) { - table.style.width = `${totalWidth}px`; - table.style.minWidth = ""; - } else { - table.style.width = ""; - table.style.minWidth = `${totalWidth}px`; - } -} -var TableView2 = class { - constructor(node, cellMinWidth) { - this.node = node; - this.cellMinWidth = cellMinWidth; - this.dom = document.createElement("div"); - this.dom.className = "tableWrapper"; - this.table = this.dom.appendChild(document.createElement("table")); - this.colgroup = this.table.appendChild(document.createElement("colgroup")); - updateColumns(node, this.colgroup, this.table, cellMinWidth); - this.contentDOM = this.table.appendChild(document.createElement("tbody")); - } - update(node) { - if (node.type !== this.node.type) { - return false; - } - this.node = node; - updateColumns(node, this.colgroup, this.table, this.cellMinWidth); - return true; - } - ignoreMutation(mutation) { - return mutation.type === "attributes" && (mutation.target === this.table || this.colgroup.contains(mutation.target)); - } -}; -function createCell(cellType, cellContent) { - if (cellContent) { - return cellType.createChecked(null, cellContent); - } - return cellType.createAndFill(); -} -function getTableNodeTypes(schema) { - if (schema.cached.tableNodeTypes) { - return schema.cached.tableNodeTypes; - } - const roles = {}; - Object.keys(schema.nodes).forEach((type) => { - const nodeType = schema.nodes[type]; - if (nodeType.spec.tableRole) { - roles[nodeType.spec.tableRole] = nodeType; - } - }); - schema.cached.tableNodeTypes = roles; - return roles; -} -function createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) { - const types = getTableNodeTypes(schema); - const headerCells = []; - const cells = []; - for (let index = 0; index < colsCount; index += 1) { - const cell = createCell(types.cell, cellContent); - if (cell) { - cells.push(cell); - } - if (withHeaderRow) { - const headerCell = createCell(types.header_cell, cellContent); - if (headerCell) { - headerCells.push(headerCell); - } - } - } - const rows = []; - for (let index = 0; index < rowsCount; index += 1) { - rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells)); - } - return types.table.createChecked(null, rows); -} -function isCellSelection(value) { - return value instanceof CellSelection; -} -var deleteTableWhenAllCellsSelected = ({ editor }) => { - const { selection } = editor.state; - if (!isCellSelection(selection)) { - return false; - } - let cellCount = 0; - const table = findParentNodeClosestToPos(selection.ranges[0].$from, (node) => { - return node.type.name === "table"; - }); - table === null || table === void 0 ? void 0 : table.node.descendants((node) => { - if (node.type.name === "table") { - return false; - } - if (["tableCell", "tableHeader"].includes(node.type.name)) { - cellCount += 1; - } - }); - const allCellsSelected = cellCount === selection.ranges.length; - if (!allCellsSelected) { - return false; - } - editor.commands.deleteTable(); - return true; -}; -var Table = Node2.create({ - name: "table", - // @ts-ignore - addOptions() { - return { - HTMLAttributes: {}, - resizable: false, - handleWidth: 5, - cellMinWidth: 25, - // TODO: fix - View: TableView2, - lastColumnResizable: true, - allowTableNodeSelection: false - }; - }, - content: "tableRow+", - tableRole: "table", - isolating: true, - group: "block", - parseHTML() { - return [{ tag: "table" }]; - }, - renderHTML({ HTMLAttributes }) { - return ["table", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), ["tbody", 0]]; - }, - addCommands() { - return { - insertTable: ({ rows = 3, cols = 3, withHeaderRow = true } = {}) => ({ tr: tr2, dispatch, editor }) => { - const node = createTable(editor.schema, rows, cols, withHeaderRow); - if (dispatch) { - const offset2 = tr2.selection.anchor + 1; - tr2.replaceSelectionWith(node).scrollIntoView().setSelection(TextSelection.near(tr2.doc.resolve(offset2))); - } - return true; - }, - addColumnBefore: () => ({ state, dispatch }) => { - return addColumnBefore(state, dispatch); - }, - addColumnAfter: () => ({ state, dispatch }) => { - return addColumnAfter(state, dispatch); - }, - deleteColumn: () => ({ state, dispatch }) => { - return deleteColumn(state, dispatch); - }, - addRowBefore: () => ({ state, dispatch }) => { - return addRowBefore(state, dispatch); - }, - addRowAfter: () => ({ state, dispatch }) => { - return addRowAfter(state, dispatch); - }, - deleteRow: () => ({ state, dispatch }) => { - return deleteRow(state, dispatch); - }, - deleteTable: () => ({ state, dispatch }) => { - return deleteTable(state, dispatch); - }, - mergeCells: () => ({ state, dispatch }) => { - return mergeCells(state, dispatch); - }, - splitCell: () => ({ state, dispatch }) => { - return splitCell(state, dispatch); - }, - toggleHeaderColumn: () => ({ state, dispatch }) => { - return toggleHeader("column")(state, dispatch); - }, - toggleHeaderRow: () => ({ state, dispatch }) => { - return toggleHeader("row")(state, dispatch); - }, - toggleHeaderCell: () => ({ state, dispatch }) => { - return toggleHeaderCell(state, dispatch); - }, - mergeOrSplit: () => ({ state, dispatch }) => { - if (mergeCells(state, dispatch)) { - return true; - } - return splitCell(state, dispatch); - }, - setCellAttribute: (name, value) => ({ state, dispatch }) => { - return setCellAttr(name, value)(state, dispatch); - }, - goToNextCell: () => ({ state, dispatch }) => { - return goToNextCell(1)(state, dispatch); - }, - goToPreviousCell: () => ({ state, dispatch }) => { - return goToNextCell(-1)(state, dispatch); - }, - fixTables: () => ({ state, dispatch }) => { - if (dispatch) { - fixTables(state); - } - return true; - }, - setCellSelection: (position) => ({ tr: tr2, dispatch }) => { - if (dispatch) { - const selection = CellSelection.create(tr2.doc, position.anchorCell, position.headCell); - tr2.setSelection(selection); - } - return true; - } - }; - }, - addKeyboardShortcuts() { - return { - Tab: () => { - if (this.editor.commands.goToNextCell()) { - return true; - } - if (!this.editor.can().addRowAfter()) { - return false; - } - return this.editor.chain().addRowAfter().goToNextCell().run(); - }, - "Shift-Tab": () => this.editor.commands.goToPreviousCell(), - Backspace: deleteTableWhenAllCellsSelected, - "Mod-Backspace": deleteTableWhenAllCellsSelected, - Delete: deleteTableWhenAllCellsSelected, - "Mod-Delete": deleteTableWhenAllCellsSelected - }; - }, - addProseMirrorPlugins() { - const isResizable = this.options.resizable && this.editor.isEditable; - return [ - ...isResizable ? [ - columnResizing({ - handleWidth: this.options.handleWidth, - cellMinWidth: this.options.cellMinWidth, - // @ts-ignore (incorrect type) - View: this.options.View, - // TODO: PR for @types/prosemirror-tables - // @ts-ignore (incorrect type) - lastColumnResizable: this.options.lastColumnResizable - }) - ] : [], - tableEditing({ - allowTableNodeSelection: this.options.allowTableNodeSelection - }) - ]; - }, - extendNodeSchema(extension) { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - return { - tableRole: callOrReturn(getExtensionField(extension, "tableRole", context)) - }; - } -}); - -// node_modules/@tiptap/extension-table-cell/dist/index.js -var TableCell = Node2.create({ - name: "tableCell", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - content: "block+", - addAttributes() { - return { - colspan: { - default: 1 - }, - rowspan: { - default: 1 - }, - colwidth: { - default: null, - parseHTML: (element) => { - const colwidth = element.getAttribute("colwidth"); - const value = colwidth ? [parseInt(colwidth, 10)] : null; - return value; - } - } - }; - }, - tableRole: "cell", - isolating: true, - parseHTML() { - return [ - { tag: "td" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["td", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - } -}); - -// node_modules/@tiptap/extension-table-header/dist/index.js -var TableHeader = Node2.create({ - name: "tableHeader", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - content: "block+", - addAttributes() { - return { - colspan: { - default: 1 - }, - rowspan: { - default: 1 - }, - colwidth: { - default: null, - parseHTML: (element) => { - const colwidth = element.getAttribute("colwidth"); - const value = colwidth ? [parseInt(colwidth, 10)] : null; - return value; - } - } - }; - }, - tableRole: "header_cell", - isolating: true, - parseHTML() { - return [ - { tag: "th" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["th", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - } -}); - -// node_modules/@tiptap/extension-table-row/dist/index.js -var TableRow = Node2.create({ - name: "tableRow", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - content: "(tableCell | tableHeader)*", - tableRole: "row", - parseHTML() { - return [ - { tag: "tr" } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["tr", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - } -}); - -// node_modules/@tiptap/extension-text/dist/index.js -var Text = Node2.create({ - name: "text", - group: "inline" -}); - -// node_modules/@tiptap/extension-underline/dist/index.js -var Underline = Mark2.create({ - name: "underline", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "u" - }, - { - style: "text-decoration", - consuming: false, - getAttrs: (style2) => style2.includes("underline") ? {} : false - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["u", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setUnderline: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleUnderline: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetUnderline: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-u": () => this.editor.commands.toggleUnderline(), - "Mod-U": () => this.editor.commands.toggleUnderline() - }; - } -}); - -// node_modules/@tiptap/extension-highlight/dist/index.js -var inputRegex6 = /(?:^|\s)((?:==)((?:[^~=]+))(?:==))$/; -var pasteRegex3 = /(?:^|\s)((?:==)((?:[^~=]+))(?:==))/g; -var Highlight = Mark2.create({ - name: "highlight", - addOptions() { - return { - multicolor: false, - HTMLAttributes: {} - }; - }, - addAttributes() { - if (!this.options.multicolor) { - return {}; - } - return { - color: { - default: null, - parseHTML: (element) => element.getAttribute("data-color") || element.style.backgroundColor, - renderHTML: (attributes) => { - if (!attributes.color) { - return {}; - } - return { - "data-color": attributes.color, - style: `background-color: ${attributes.color}; color: inherit` - }; - } - } - }; - }, - parseHTML() { - return [ - { - tag: "mark" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["mark", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setHighlight: (attributes) => ({ commands: commands2 }) => { - return commands2.setMark(this.name, attributes); - }, - toggleHighlight: (attributes) => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name, attributes); - }, - unsetHighlight: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Shift-h": () => this.editor.commands.toggleHighlight() - }; - }, - addInputRules() { - return [ - markInputRule({ - find: inputRegex6, - type: this.type - }) - ]; - }, - addPasteRules() { - return [ - markPasteRule({ - find: pasteRegex3, - type: this.type - }) - ]; - } -}); - -// resources/js/extensions/CheckedList.js -var CheckedList = Node2.create({ - name: "checkedList", - priority: 50, - addOptions() { - return { - itemTypeName: "listItem", - HTMLAttributes: { - class: "checked-list" - } - }; - }, - group: "block list", - content() { - return `${this.options.itemTypeName}+`; - }, - parseHTML() { - return [{ tag: "ul", getAttrs: (element) => element.classList.contains("checked-list"), priority: 1e3 }]; - }, - renderHTML({ HTMLAttributes }) { - return ["ul", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - toggleCheckedList: () => ({ commands: commands2 }) => { - return commands2.toggleList(this.name, this.options.itemTypeName); - } - }; - } -}); - -// resources/js/extensions/Lead.js -var Lead = Node2.create({ - name: "lead", - group: "block", - content: "block+", - addOptions() { - return { - HTMLAttributes: { - class: "lead" - } - }; - }, - parseHTML() { - return [ - { - tag: "div", - getAttrs: (element) => element.classList.contains("lead") - } - ]; - }, - renderHTML({ node, HTMLAttributes }) { - return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - toggleLead: () => ({ commands: commands2 }) => { - return commands2.toggleWrap(this.name); - } - }; - } -}); - -// node_modules/linkifyjs/dist/linkify.es.js -var encodedTlds = "aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4vianca6w0s2x0a2z0ure5ba0by2idu3namex3narepublic11d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2ntley5rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0cast4mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dabur3d1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0ardian6cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6logistics9properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3ncaster6d0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2psy3ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2tura4vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9dnavy5lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0america6xi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0a1b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp2w2ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4finity6ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2"; -var encodedUtlds = "\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2"; -var assign = (target, properties) => { - for (const key in properties) { - target[key] = properties[key]; - } - return target; -}; -var numeric = "numeric"; -var ascii = "ascii"; -var alpha = "alpha"; -var asciinumeric = "asciinumeric"; -var alphanumeric = "alphanumeric"; -var domain = "domain"; -var emoji = "emoji"; -var scheme = "scheme"; -var slashscheme = "slashscheme"; -var whitespace = "whitespace"; -function registerGroup(name, groups) { - if (!(name in groups)) { - groups[name] = []; - } - return groups[name]; -} -function addToGroups(t, flags, groups) { - if (flags[numeric]) { - flags[asciinumeric] = true; - flags[alphanumeric] = true; - } - if (flags[ascii]) { - flags[asciinumeric] = true; - flags[alpha] = true; - } - if (flags[asciinumeric]) { - flags[alphanumeric] = true; - } - if (flags[alpha]) { - flags[alphanumeric] = true; - } - if (flags[alphanumeric]) { - flags[domain] = true; - } - if (flags[emoji]) { - flags[domain] = true; - } - for (const k in flags) { - const group = registerGroup(k, groups); - if (group.indexOf(t) < 0) { - group.push(t); - } - } -} -function flagsForToken(t, groups) { - const result = {}; - for (const c2 in groups) { - if (groups[c2].indexOf(t) >= 0) { - result[c2] = true; - } - } - return result; -} -function State(token) { - if (token === void 0) { - token = null; - } - this.j = {}; - this.jr = []; - this.jd = null; - this.t = token; -} -State.groups = {}; -State.prototype = { - accepts() { - return !!this.t; - }, - /** - * Follow an existing transition from the given input to the next state. - * Does not mutate. - * @param {string} input character or token type to transition on - * @returns {?State} the next state, if any - */ - go(input) { - const state = this; - const nextState = state.j[input]; - if (nextState) { - return nextState; - } - for (let i = 0; i < state.jr.length; i++) { - const regex = state.jr[i][0]; - const nextState2 = state.jr[i][1]; - if (nextState2 && regex.test(input)) { - return nextState2; - } - } - return state.jd; - }, - /** - * Whether the state has a transition for the given input. Set the second - * argument to true to only look for an exact match (and not a default or - * regular-expression-based transition) - * @param {string} input - * @param {boolean} exactOnly - */ - has(input, exactOnly) { - if (exactOnly === void 0) { - exactOnly = false; - } - return exactOnly ? input in this.j : !!this.go(input); - }, - /** - * Short for "transition all"; create a transition from the array of items - * in the given list to the same final resulting state. - * @param {string | string[]} inputs Group of inputs to transition on - * @param {Transition | State} [next] Transition options - * @param {Flags} [flags] Collections flags to add token to - * @param {Collections} [groups] Master list of token groups - */ - ta(inputs, next, flags, groups) { - for (let i = 0; i < inputs.length; i++) { - this.tt(inputs[i], next, flags, groups); - } - }, - /** - * Short for "take regexp transition"; defines a transition for this state - * when it encounters a token which matches the given regular expression - * @param {RegExp} regexp Regular expression transition (populate first) - * @param {T | State} [next] Transition options - * @param {Flags} [flags] Collections flags to add token to - * @param {Collections} [groups] Master list of token groups - * @returns {State} taken after the given input - */ - tr(regexp, next, flags, groups) { - groups = groups || State.groups; - let nextState; - if (next && next.j) { - nextState = next; - } else { - nextState = new State(next); - if (flags && groups) { - addToGroups(next, flags, groups); - } - } - this.jr.push([regexp, nextState]); - return nextState; - }, - /** - * Short for "take transitions", will take as many sequential transitions as - * the length of the given input and returns the - * resulting final state. - * @param {string | string[]} input - * @param {T | State} [next] Transition options - * @param {Flags} [flags] Collections flags to add token to - * @param {Collections} [groups] Master list of token groups - * @returns {State} taken after the given input - */ - ts(input, next, flags, groups) { - let state = this; - const len = input.length; - if (!len) { - return state; - } - for (let i = 0; i < len - 1; i++) { - state = state.tt(input[i]); - } - return state.tt(input[len - 1], next, flags, groups); - }, - /** - * Short for "take transition", this is a method for building/working with - * state machines. - * - * If a state already exists for the given input, returns it. - * - * If a token is specified, that state will emit that token when reached by - * the linkify engine. - * - * If no state exists, it will be initialized with some default transitions - * that resemble existing default transitions. - * - * If a state is given for the second argument, that state will be - * transitioned to on the given input regardless of what that input - * previously did. - * - * Specify a token group flags to define groups that this token belongs to. - * The token will be added to corresponding entires in the given groups - * object. - * - * @param {string} input character, token type to transition on - * @param {T | State} [next] Transition options - * @param {Flags} [flags] Collections flags to add token to - * @param {Collections} [groups] Master list of groups - * @returns {State} taken after the given input - */ - tt(input, next, flags, groups) { - groups = groups || State.groups; - const state = this; - if (next && next.j) { - state.j[input] = next; - return next; - } - const t = next; - let nextState, templateState = state.go(input); - if (templateState) { - nextState = new State(); - assign(nextState.j, templateState.j); - nextState.jr.push.apply(nextState.jr, templateState.jr); - nextState.jd = templateState.jd; - nextState.t = templateState.t; - } else { - nextState = new State(); - } - if (t) { - if (groups) { - if (nextState.t && typeof nextState.t === "string") { - const allFlags = assign(flagsForToken(nextState.t, groups), flags); - addToGroups(t, allFlags, groups); - } else if (flags) { - addToGroups(t, flags, groups); - } - } - nextState.t = t; - } - state.j[input] = nextState; - return nextState; - } -}; -var ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups); -var tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups); -var ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups); -var tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups); -var WORD = "WORD"; -var UWORD = "UWORD"; -var LOCALHOST = "LOCALHOST"; -var TLD = "TLD"; -var UTLD = "UTLD"; -var SCHEME = "SCHEME"; -var SLASH_SCHEME = "SLASH_SCHEME"; -var NUM = "NUM"; -var WS = "WS"; -var NL$1 = "NL"; -var OPENBRACE = "OPENBRACE"; -var CLOSEBRACE = "CLOSEBRACE"; -var OPENBRACKET = "OPENBRACKET"; -var CLOSEBRACKET = "CLOSEBRACKET"; -var OPENPAREN = "OPENPAREN"; -var CLOSEPAREN = "CLOSEPAREN"; -var OPENANGLEBRACKET = "OPENANGLEBRACKET"; -var CLOSEANGLEBRACKET = "CLOSEANGLEBRACKET"; -var FULLWIDTHLEFTPAREN = "FULLWIDTHLEFTPAREN"; -var FULLWIDTHRIGHTPAREN = "FULLWIDTHRIGHTPAREN"; -var LEFTCORNERBRACKET = "LEFTCORNERBRACKET"; -var RIGHTCORNERBRACKET = "RIGHTCORNERBRACKET"; -var LEFTWHITECORNERBRACKET = "LEFTWHITECORNERBRACKET"; -var RIGHTWHITECORNERBRACKET = "RIGHTWHITECORNERBRACKET"; -var FULLWIDTHLESSTHAN = "FULLWIDTHLESSTHAN"; -var FULLWIDTHGREATERTHAN = "FULLWIDTHGREATERTHAN"; -var AMPERSAND = "AMPERSAND"; -var APOSTROPHE = "APOSTROPHE"; -var ASTERISK = "ASTERISK"; -var AT = "AT"; -var BACKSLASH = "BACKSLASH"; -var BACKTICK = "BACKTICK"; -var CARET = "CARET"; -var COLON = "COLON"; -var COMMA = "COMMA"; -var DOLLAR = "DOLLAR"; -var DOT = "DOT"; -var EQUALS = "EQUALS"; -var EXCLAMATION = "EXCLAMATION"; -var HYPHEN = "HYPHEN"; -var PERCENT = "PERCENT"; -var PIPE = "PIPE"; -var PLUS = "PLUS"; -var POUND = "POUND"; -var QUERY = "QUERY"; -var QUOTE = "QUOTE"; -var SEMI = "SEMI"; -var SLASH = "SLASH"; -var TILDE = "TILDE"; -var UNDERSCORE = "UNDERSCORE"; -var EMOJI$1 = "EMOJI"; -var SYM = "SYM"; -var tk = /* @__PURE__ */ Object.freeze({ - __proto__: null, - WORD, - UWORD, - LOCALHOST, - TLD, - UTLD, - SCHEME, - SLASH_SCHEME, - NUM, - WS, - NL: NL$1, - OPENBRACE, - CLOSEBRACE, - OPENBRACKET, - CLOSEBRACKET, - OPENPAREN, - CLOSEPAREN, - OPENANGLEBRACKET, - CLOSEANGLEBRACKET, - FULLWIDTHLEFTPAREN, - FULLWIDTHRIGHTPAREN, - LEFTCORNERBRACKET, - RIGHTCORNERBRACKET, - LEFTWHITECORNERBRACKET, - RIGHTWHITECORNERBRACKET, - FULLWIDTHLESSTHAN, - FULLWIDTHGREATERTHAN, - AMPERSAND, - APOSTROPHE, - ASTERISK, - AT, - BACKSLASH, - BACKTICK, - CARET, - COLON, - COMMA, - DOLLAR, - DOT, - EQUALS, - EXCLAMATION, - HYPHEN, - PERCENT, - PIPE, - PLUS, - POUND, - QUERY, - QUOTE, - SEMI, - SLASH, - TILDE, - UNDERSCORE, - EMOJI: EMOJI$1, - SYM -}); -var ASCII_LETTER = /[a-z]/; -var LETTER = /\p{L}/u; -var EMOJI = /\p{Emoji}/u; -var DIGIT = /\d/; -var SPACE = /\s/; -var NL = "\n"; -var EMOJI_VARIATION = "\uFE0F"; -var EMOJI_JOINER = "\u200D"; -var tlds = null; -var utlds = null; -function init$2(customSchemes) { - if (customSchemes === void 0) { - customSchemes = []; - } - const groups = {}; - State.groups = groups; - const Start = new State(); - if (tlds == null) { - tlds = decodeTlds(encodedTlds); - } - if (utlds == null) { - utlds = decodeTlds(encodedUtlds); - } - tt(Start, "'", APOSTROPHE); - tt(Start, "{", OPENBRACE); - tt(Start, "}", CLOSEBRACE); - tt(Start, "[", OPENBRACKET); - tt(Start, "]", CLOSEBRACKET); - tt(Start, "(", OPENPAREN); - tt(Start, ")", CLOSEPAREN); - tt(Start, "<", OPENANGLEBRACKET); - tt(Start, ">", CLOSEANGLEBRACKET); - tt(Start, "\uFF08", FULLWIDTHLEFTPAREN); - tt(Start, "\uFF09", FULLWIDTHRIGHTPAREN); - tt(Start, "\u300C", LEFTCORNERBRACKET); - tt(Start, "\u300D", RIGHTCORNERBRACKET); - tt(Start, "\u300E", LEFTWHITECORNERBRACKET); - tt(Start, "\u300F", RIGHTWHITECORNERBRACKET); - tt(Start, "\uFF1C", FULLWIDTHLESSTHAN); - tt(Start, "\uFF1E", FULLWIDTHGREATERTHAN); - tt(Start, "&", AMPERSAND); - tt(Start, "*", ASTERISK); - tt(Start, "@", AT); - tt(Start, "`", BACKTICK); - tt(Start, "^", CARET); - tt(Start, ":", COLON); - tt(Start, ",", COMMA); - tt(Start, "$", DOLLAR); - tt(Start, ".", DOT); - tt(Start, "=", EQUALS); - tt(Start, "!", EXCLAMATION); - tt(Start, "-", HYPHEN); - tt(Start, "%", PERCENT); - tt(Start, "|", PIPE); - tt(Start, "+", PLUS); - tt(Start, "#", POUND); - tt(Start, "?", QUERY); - tt(Start, '"', QUOTE); - tt(Start, "/", SLASH); - tt(Start, ";", SEMI); - tt(Start, "~", TILDE); - tt(Start, "_", UNDERSCORE); - tt(Start, "\\", BACKSLASH); - const Num = tr(Start, DIGIT, NUM, { - [numeric]: true - }); - tr(Num, DIGIT, Num); - const Word = tr(Start, ASCII_LETTER, WORD, { - [ascii]: true - }); - tr(Word, ASCII_LETTER, Word); - const UWord = tr(Start, LETTER, UWORD, { - [alpha]: true - }); - tr(UWord, ASCII_LETTER); - tr(UWord, LETTER, UWord); - const Ws = tr(Start, SPACE, WS, { - [whitespace]: true - }); - tt(Start, NL, NL$1, { - [whitespace]: true - }); - tt(Ws, NL); - tr(Ws, SPACE, Ws); - const Emoji = tr(Start, EMOJI, EMOJI$1, { - [emoji]: true - }); - tr(Emoji, EMOJI, Emoji); - tt(Emoji, EMOJI_VARIATION, Emoji); - const EmojiJoiner = tt(Emoji, EMOJI_JOINER); - tr(EmojiJoiner, EMOJI, Emoji); - const wordjr = [[ASCII_LETTER, Word]]; - const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord]]; - for (let i = 0; i < tlds.length; i++) { - fastts(Start, tlds[i], TLD, WORD, wordjr); - } - for (let i = 0; i < utlds.length; i++) { - fastts(Start, utlds[i], UTLD, UWORD, uwordjr); - } - addToGroups(TLD, { - tld: true, - ascii: true - }, groups); - addToGroups(UTLD, { - utld: true, - alpha: true - }, groups); - fastts(Start, "file", SCHEME, WORD, wordjr); - fastts(Start, "mailto", SCHEME, WORD, wordjr); - fastts(Start, "http", SLASH_SCHEME, WORD, wordjr); - fastts(Start, "https", SLASH_SCHEME, WORD, wordjr); - fastts(Start, "ftp", SLASH_SCHEME, WORD, wordjr); - fastts(Start, "ftps", SLASH_SCHEME, WORD, wordjr); - addToGroups(SCHEME, { - scheme: true, - ascii: true - }, groups); - addToGroups(SLASH_SCHEME, { - slashscheme: true, - ascii: true - }, groups); - customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1); - for (let i = 0; i < customSchemes.length; i++) { - const sch = customSchemes[i][0]; - const optionalSlashSlash = customSchemes[i][1]; - const flags = optionalSlashSlash ? { - [scheme]: true - } : { - [slashscheme]: true - }; - if (sch.indexOf("-") >= 0) { - flags[domain] = true; - } else if (!ASCII_LETTER.test(sch)) { - flags[numeric] = true; - } else if (DIGIT.test(sch)) { - flags[asciinumeric] = true; - } else { - flags[ascii] = true; - } - ts(Start, sch, sch, flags); - } - ts(Start, "localhost", LOCALHOST, { - ascii: true - }); - Start.jd = new State(SYM); - return { - start: Start, - tokens: assign({ - groups - }, tk) - }; -} -function run$12(start2, str) { - const iterable = stringToArray(str.replace(/[A-Z]/g, (c2) => c2.toLowerCase())); - const charCount = iterable.length; - const tokens = []; - let cursor = 0; - let charCursor = 0; - while (charCursor < charCount) { - let state = start2; - let nextState = null; - let tokenLength = 0; - let latestAccepting = null; - let sinceAccepts = -1; - let charsSinceAccepts = -1; - while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) { - state = nextState; - if (state.accepts()) { - sinceAccepts = 0; - charsSinceAccepts = 0; - latestAccepting = state; - } else if (sinceAccepts >= 0) { - sinceAccepts += iterable[charCursor].length; - charsSinceAccepts++; - } - tokenLength += iterable[charCursor].length; - cursor += iterable[charCursor].length; - charCursor++; - } - cursor -= sinceAccepts; - charCursor -= charsSinceAccepts; - tokenLength -= sinceAccepts; - tokens.push({ - t: latestAccepting.t, - // token type/name - v: str.slice(cursor - tokenLength, cursor), - // string value - s: cursor - tokenLength, - // start index - e: cursor - // end index (excluding) - }); - } - return tokens; -} -function stringToArray(str) { - const result = []; - const len = str.length; - let index = 0; - while (index < len) { - let first2 = str.charCodeAt(index); - let second; - let char = first2 < 55296 || first2 > 56319 || index + 1 === len || (second = str.charCodeAt(index + 1)) < 56320 || second > 57343 ? str[index] : str.slice(index, index + 2); - result.push(char); - index += char.length; - } - return result; -} -function fastts(state, input, t, defaultt, jr) { - let next; - const len = input.length; - for (let i = 0; i < len - 1; i++) { - const char = input[i]; - if (state.j[char]) { - next = state.j[char]; - } else { - next = new State(defaultt); - next.jr = jr.slice(); - state.j[char] = next; - } - state = next; - } - next = new State(t); - next.jr = jr.slice(); - state.j[input[len - 1]] = next; - return next; -} -function decodeTlds(encoded) { - const words = []; - const stack = []; - let i = 0; - let digits = "0123456789"; - while (i < encoded.length) { - let popDigitCount = 0; - while (digits.indexOf(encoded[i + popDigitCount]) >= 0) { - popDigitCount++; - } - if (popDigitCount > 0) { - words.push(stack.join("")); - for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) { - stack.pop(); - } - i += popDigitCount; - } else { - stack.push(encoded[i]); - i++; - } - } - return words; -} -var defaults = { - defaultProtocol: "http", - events: null, - format: noop, - formatHref: noop, - nl2br: false, - tagName: "a", - target: null, - rel: null, - validate: true, - truncate: Infinity, - className: null, - attributes: null, - ignoreTags: [], - render: null -}; -function Options(opts, defaultRender) { - if (defaultRender === void 0) { - defaultRender = null; - } - let o = assign({}, defaults); - if (opts) { - o = assign(o, opts instanceof Options ? opts.o : opts); - } - const ignoredTags = o.ignoreTags; - const uppercaseIgnoredTags = []; - for (let i = 0; i < ignoredTags.length; i++) { - uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase()); - } - this.o = o; - if (defaultRender) { - this.defaultRender = defaultRender; - } - this.ignoreTags = uppercaseIgnoredTags; -} -Options.prototype = { - o: defaults, - /** - * @type string[] - */ - ignoreTags: [], - /** - * @param {IntermediateRepresentation} ir - * @returns {any} - */ - defaultRender(ir) { - return ir; - }, - /** - * Returns true or false based on whether a token should be displayed as a - * link based on the user options. - * @param {MultiToken} token - * @returns {boolean} - */ - check(token) { - return this.get("validate", token.toString(), token); - }, - // Private methods - /** - * Resolve an option's value based on the value of the option and the given - * params. If operator and token are specified and the target option is - * callable, automatically calls the function with the given argument. - * @template {keyof Opts} K - * @param {K} key Name of option to use - * @param {string} [operator] will be passed to the target option if it's a - * function. If not specified, RAW function value gets returned - * @param {MultiToken} [token] The token from linkify.tokenize - * @returns {Opts[K] | any} - */ - get(key, operator2, token) { - const isCallable = operator2 != null; - let option = this.o[key]; - if (!option) { - return option; - } - if (typeof option === "object") { - option = token.t in option ? option[token.t] : defaults[key]; - if (typeof option === "function" && isCallable) { - option = option(operator2, token); - } - } else if (typeof option === "function" && isCallable) { - option = option(operator2, token.t, token); - } - return option; - }, - /** - * @template {keyof Opts} L - * @param {L} key Name of options object to use - * @param {string} [operator] - * @param {MultiToken} [token] - * @returns {Opts[L] | any} - */ - getObj(key, operator2, token) { - let obj = this.o[key]; - if (typeof obj === "function" && operator2 != null) { - obj = obj(operator2, token.t, token); - } - return obj; - }, - /** - * Convert the given token to a rendered element that may be added to the - * calling-interface's DOM - * @param {MultiToken} token Token to render to an HTML element - * @returns {any} Render result; e.g., HTML string, DOM element, React - * Component, etc. - */ - render(token) { - const ir = token.render(this); - const renderFn = this.get("render", null, token) || this.defaultRender; - return renderFn(ir, token.t, token); - } -}; -function noop(val) { - return val; -} -function MultiToken(value, tokens) { - this.t = "token"; - this.v = value; - this.tk = tokens; -} -MultiToken.prototype = { - isLink: false, - /** - * Return the string this token represents. - * @return {string} - */ - toString() { - return this.v; - }, - /** - * What should the value for this token be in the `href` HTML attribute? - * Returns the `.toString` value by default. - * @param {string} [scheme] - * @return {string} - */ - toHref(scheme2) { - return this.toString(); - }, - /** - * @param {Options} options Formatting options - * @returns {string} - */ - toFormattedString(options) { - const val = this.toString(); - const truncate = options.get("truncate", val, this); - const formatted = options.get("format", val, this); - return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + "\u2026" : formatted; - }, - /** - * - * @param {Options} options - * @returns {string} - */ - toFormattedHref(options) { - return options.get("formatHref", this.toHref(options.get("defaultProtocol")), this); - }, - /** - * The start index of this token in the original input string - * @returns {number} - */ - startIndex() { - return this.tk[0].s; - }, - /** - * The end index of this token in the original input string (up to this - * index but not including it) - * @returns {number} - */ - endIndex() { - return this.tk[this.tk.length - 1].e; - }, - /** - Returns an object of relevant values for this token, which includes keys - * type - Kind of token ('url', 'email', etc.) - * value - Original text - * href - The value that should be added to the anchor tag's href - attribute - @method toObject - @param {string} [protocol] `'http'` by default - */ - toObject(protocol) { - if (protocol === void 0) { - protocol = defaults.defaultProtocol; - } - return { - type: this.t, - value: this.toString(), - isLink: this.isLink, - href: this.toHref(protocol), - start: this.startIndex(), - end: this.endIndex() - }; - }, - /** - * - * @param {Options} options Formatting option - */ - toFormattedObject(options) { - return { - type: this.t, - value: this.toFormattedString(options), - isLink: this.isLink, - href: this.toFormattedHref(options), - start: this.startIndex(), - end: this.endIndex() - }; - }, - /** - * Whether this token should be rendered as a link according to the given options - * @param {Options} options - * @returns {boolean} - */ - validate(options) { - return options.get("validate", this.toString(), this); - }, - /** - * Return an object that represents how this link should be rendered. - * @param {Options} options Formattinng options - */ - render(options) { - const token = this; - const href = this.toHref(options.get("defaultProtocol")); - const formattedHref = options.get("formatHref", href, this); - const tagName = options.get("tagName", href, token); - const content = this.toFormattedString(options); - const attributes = {}; - const className = options.get("className", href, token); - const target = options.get("target", href, token); - const rel = options.get("rel", href, token); - const attrs = options.getObj("attributes", href, token); - const eventListeners = options.getObj("events", href, token); - attributes.href = formattedHref; - if (className) { - attributes.class = className; - } - if (target) { - attributes.target = target; - } - if (rel) { - attributes.rel = rel; - } - if (attrs) { - assign(attributes, attrs); - } - return { - tagName, - attributes, - content, - eventListeners - }; - } -}; -function createTokenClass(type, props) { - class Token extends MultiToken { - constructor(value, tokens) { - super(value, tokens); - this.t = type; - } - } - for (const p in props) { - Token.prototype[p] = props[p]; - } - Token.t = type; - return Token; -} -var Email = createTokenClass("email", { - isLink: true, - toHref() { - return "mailto:" + this.toString(); - } -}); -var Text2 = createTokenClass("text"); -var Nl = createTokenClass("nl"); -var Url = createTokenClass("url", { - isLink: true, - /** - Lowercases relevant parts of the domain and adds the protocol if - required. Note that this will not escape unsafe HTML characters in the - URL. - @param {string} [scheme] default scheme (e.g., 'https') - @return {string} the full href - */ - toHref(scheme2) { - if (scheme2 === void 0) { - scheme2 = defaults.defaultProtocol; - } - return this.hasProtocol() ? this.v : `${scheme2}://${this.v}`; - }, - /** - * Check whether this URL token has a protocol - * @return {boolean} - */ - hasProtocol() { - const tokens = this.tk; - return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON; - } -}); -var makeState = (arg) => new State(arg); -function init$1(_ref) { - let { - groups - } = _ref; - const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]); - const qsNonAccepting = [APOSTROPHE, COLON, COMMA, DOT, EXCLAMATION, QUERY, QUOTE, SEMI, OPENANGLEBRACKET, CLOSEANGLEBRACKET, OPENBRACE, CLOSEBRACE, CLOSEBRACKET, OPENBRACKET, OPENPAREN, CLOSEPAREN, FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN, LEFTCORNERBRACKET, RIGHTCORNERBRACKET, LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET, FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN]; - const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, OPENBRACE, CLOSEBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE]; - const Start = makeState(); - const Localpart = tt(Start, TILDE); - ta(Localpart, localpartAccepting, Localpart); - ta(Localpart, groups.domain, Localpart); - const Domain = makeState(), Scheme = makeState(), SlashScheme = makeState(); - ta(Start, groups.domain, Domain); - ta(Start, groups.scheme, Scheme); - ta(Start, groups.slashscheme, SlashScheme); - ta(Domain, localpartAccepting, Localpart); - ta(Domain, groups.domain, Domain); - const LocalpartAt = tt(Domain, AT); - tt(Localpart, AT, LocalpartAt); - tt(Scheme, AT, LocalpartAt); - tt(SlashScheme, AT, LocalpartAt); - const LocalpartDot = tt(Localpart, DOT); - ta(LocalpartDot, localpartAccepting, Localpart); - ta(LocalpartDot, groups.domain, Localpart); - const EmailDomain = makeState(); - ta(LocalpartAt, groups.domain, EmailDomain); - ta(EmailDomain, groups.domain, EmailDomain); - const EmailDomainDot = tt(EmailDomain, DOT); - ta(EmailDomainDot, groups.domain, EmailDomain); - const Email$1 = makeState(Email); - ta(EmailDomainDot, groups.tld, Email$1); - ta(EmailDomainDot, groups.utld, Email$1); - tt(LocalpartAt, LOCALHOST, Email$1); - const EmailDomainHyphen = tt(EmailDomain, HYPHEN); - ta(EmailDomainHyphen, groups.domain, EmailDomain); - ta(Email$1, groups.domain, EmailDomain); - tt(Email$1, DOT, EmailDomainDot); - tt(Email$1, HYPHEN, EmailDomainHyphen); - const EmailColon = tt(Email$1, COLON); - ta(EmailColon, groups.numeric, Email); - const DomainHyphen = tt(Domain, HYPHEN); - const DomainDot = tt(Domain, DOT); - ta(DomainHyphen, groups.domain, Domain); - ta(DomainDot, localpartAccepting, Localpart); - ta(DomainDot, groups.domain, Domain); - const DomainDotTld = makeState(Url); - ta(DomainDot, groups.tld, DomainDotTld); - ta(DomainDot, groups.utld, DomainDotTld); - ta(DomainDotTld, groups.domain, Domain); - ta(DomainDotTld, localpartAccepting, Localpart); - tt(DomainDotTld, DOT, DomainDot); - tt(DomainDotTld, HYPHEN, DomainHyphen); - tt(DomainDotTld, AT, LocalpartAt); - const DomainDotTldColon = tt(DomainDotTld, COLON); - const DomainDotTldColonPort = makeState(Url); - ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort); - const Url$1 = makeState(Url); - const UrlNonaccept = makeState(); - ta(Url$1, qsAccepting, Url$1); - ta(Url$1, qsNonAccepting, UrlNonaccept); - ta(UrlNonaccept, qsAccepting, Url$1); - ta(UrlNonaccept, qsNonAccepting, UrlNonaccept); - tt(DomainDotTld, SLASH, Url$1); - tt(DomainDotTldColonPort, SLASH, Url$1); - const SchemeColon = tt(Scheme, COLON); - const SlashSchemeColon = tt(SlashScheme, COLON); - const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH); - const UriPrefix = tt(SlashSchemeColonSlash, SLASH); - ta(Scheme, groups.domain, Domain); - tt(Scheme, DOT, DomainDot); - tt(Scheme, HYPHEN, DomainHyphen); - ta(SlashScheme, groups.domain, Domain); - tt(SlashScheme, DOT, DomainDot); - tt(SlashScheme, HYPHEN, DomainHyphen); - ta(SchemeColon, groups.domain, Url$1); - tt(SchemeColon, SLASH, Url$1); - ta(UriPrefix, groups.domain, Url$1); - ta(UriPrefix, qsAccepting, Url$1); - tt(UriPrefix, SLASH, Url$1); - const bracketPairs = [ - [OPENBRACE, CLOSEBRACE], - // {} - [OPENBRACKET, CLOSEBRACKET], - // [] - [OPENPAREN, CLOSEPAREN], - // () - [OPENANGLEBRACKET, CLOSEANGLEBRACKET], - // <> - [FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN], - // () - [LEFTCORNERBRACKET, RIGHTCORNERBRACKET], - // 「」 - [LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET], - // 『』 - [FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN] - // <> - ]; - for (let i = 0; i < bracketPairs.length; i++) { - const [OPEN, CLOSE] = bracketPairs[i]; - const UrlOpen = tt(Url$1, OPEN); - tt(UrlNonaccept, OPEN, UrlOpen); - tt(UrlOpen, CLOSE, Url$1); - const UrlOpenQ = makeState(Url); - ta(UrlOpen, qsAccepting, UrlOpenQ); - const UrlOpenSyms = makeState(); - ta(UrlOpen, qsNonAccepting); - ta(UrlOpenQ, qsAccepting, UrlOpenQ); - ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms); - ta(UrlOpenSyms, qsAccepting, UrlOpenQ); - ta(UrlOpenSyms, qsNonAccepting, UrlOpenSyms); - tt(UrlOpenQ, CLOSE, Url$1); - tt(UrlOpenSyms, CLOSE, Url$1); - } - tt(Start, LOCALHOST, DomainDotTld); - tt(Start, NL$1, Nl); - return { - start: Start, - tokens: tk - }; -} -function run2(start2, input, tokens) { - let len = tokens.length; - let cursor = 0; - let multis = []; - let textTokens = []; - while (cursor < len) { - let state = start2; - let secondState = null; - let nextState = null; - let multiLength = 0; - let latestAccepting = null; - let sinceAccepts = -1; - while (cursor < len && !(secondState = state.go(tokens[cursor].t))) { - textTokens.push(tokens[cursor++]); - } - while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) { - secondState = null; - state = nextState; - if (state.accepts()) { - sinceAccepts = 0; - latestAccepting = state; - } else if (sinceAccepts >= 0) { - sinceAccepts++; - } - cursor++; - multiLength++; - } - if (sinceAccepts < 0) { - cursor -= multiLength; - if (cursor < len) { - textTokens.push(tokens[cursor]); - cursor++; - } - } else { - if (textTokens.length > 0) { - multis.push(initMultiToken(Text2, input, textTokens)); - textTokens = []; - } - cursor -= sinceAccepts; - multiLength -= sinceAccepts; - const Multi = latestAccepting.t; - const subtokens = tokens.slice(cursor - multiLength, cursor); - multis.push(initMultiToken(Multi, input, subtokens)); - } - } - if (textTokens.length > 0) { - multis.push(initMultiToken(Text2, input, textTokens)); - } - return multis; -} -function initMultiToken(Multi, input, tokens) { - const startIdx = tokens[0].s; - const endIdx = tokens[tokens.length - 1].e; - const value = input.slice(startIdx, endIdx); - return new Multi(value, tokens); -} -var warn = typeof console !== "undefined" && console && console.warn || (() => { -}); -var warnAdvice = "until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time."; -var INIT = { - scanner: null, - parser: null, - tokenQueue: [], - pluginQueue: [], - customSchemes: [], - initialized: false -}; -function reset() { - State.groups = {}; - INIT.scanner = null; - INIT.parser = null; - INIT.tokenQueue = []; - INIT.pluginQueue = []; - INIT.customSchemes = []; - INIT.initialized = false; -} -function registerCustomProtocol(scheme2, optionalSlashSlash) { - if (optionalSlashSlash === void 0) { - optionalSlashSlash = false; - } - if (INIT.initialized) { - warn(`linkifyjs: already initialized - will not register custom scheme "${scheme2}" ${warnAdvice}`); - } - if (!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(scheme2)) { - throw new Error(`linkifyjs: incorrect scheme format. -1. Must only contain digits, lowercase ASCII letters or "-" -2. Cannot start or end with "-" -3. "-" cannot repeat`); - } - INIT.customSchemes.push([scheme2, optionalSlashSlash]); -} -function init() { - INIT.scanner = init$2(INIT.customSchemes); - for (let i = 0; i < INIT.tokenQueue.length; i++) { - INIT.tokenQueue[i][1]({ - scanner: INIT.scanner - }); - } - INIT.parser = init$1(INIT.scanner.tokens); - for (let i = 0; i < INIT.pluginQueue.length; i++) { - INIT.pluginQueue[i][1]({ - scanner: INIT.scanner, - parser: INIT.parser - }); - } - INIT.initialized = true; -} -function tokenize(str) { - if (!INIT.initialized) { - init(); - } - return run2(INIT.parser.start, str, run$12(INIT.scanner.start, str)); -} -function find(str, type, opts) { - if (type === void 0) { - type = null; - } - if (opts === void 0) { - opts = null; - } - if (type && typeof type === "object") { - if (opts) { - throw Error(`linkifyjs: Invalid link type ${type}; must be a string`); - } - opts = type; - type = null; - } - const options = new Options(opts); - const tokens = tokenize(str); - const filtered = []; - for (let i = 0; i < tokens.length; i++) { - const token = tokens[i]; - if (token.isLink && (!type || token.t === type) && options.check(token)) { - filtered.push(token.toFormattedObject(options)); - } - } - return filtered; -} - -// node_modules/@tiptap/extension-link/dist/index.js -function autolink(options) { - return new Plugin({ - key: new PluginKey("autolink"), - appendTransaction: (transactions, oldState, newState) => { - const docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc); - const preventAutolink = transactions.some((transaction) => transaction.getMeta("preventAutolink")); - if (!docChanges || preventAutolink) { - return; - } - const { tr: tr2 } = newState; - const transform = combineTransactionSteps(oldState.doc, [...transactions]); - const changes = getChangedRanges(transform); - changes.forEach(({ newRange }) => { - const nodesInChangedRanges = findChildrenInRange(newState.doc, newRange, (node) => node.isTextblock); - let textBlock; - let textBeforeWhitespace; - if (nodesInChangedRanges.length > 1) { - textBlock = nodesInChangedRanges[0]; - textBeforeWhitespace = newState.doc.textBetween(textBlock.pos, textBlock.pos + textBlock.node.nodeSize, void 0, " "); - } else if (nodesInChangedRanges.length && newState.doc.textBetween(newRange.from, newRange.to, " ", " ").endsWith(" ")) { - textBlock = nodesInChangedRanges[0]; - textBeforeWhitespace = newState.doc.textBetween(textBlock.pos, newRange.to, void 0, " "); - } - if (textBlock && textBeforeWhitespace) { - const wordsBeforeWhitespace = textBeforeWhitespace.split(" ").filter((s) => s !== ""); - if (wordsBeforeWhitespace.length <= 0) { - return false; - } - const lastWordBeforeSpace = wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1]; - const lastWordAndBlockOffset = textBlock.pos + textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace); - if (!lastWordBeforeSpace) { - return false; - } - find(lastWordBeforeSpace).filter((link) => link.isLink).map((link) => ({ - ...link, - from: lastWordAndBlockOffset + link.start + 1, - to: lastWordAndBlockOffset + link.end + 1 - })).filter((link) => { - if (!newState.schema.marks.code) { - return true; - } - return !newState.doc.rangeHasMark(link.from, link.to, newState.schema.marks.code); - }).filter((link) => { - if (options.validate) { - return options.validate(link.value); - } - return true; - }).forEach((link) => { - if (getMarksBetween(link.from, link.to, newState.doc).some((item) => item.mark.type === options.type)) { - return; - } - tr2.addMark(link.from, link.to, options.type.create({ - href: link.href - })); - }); - } - }); - if (!tr2.steps.length) { - return; - } - return tr2; - } - }); -} -function clickHandler(options) { - return new Plugin({ - key: new PluginKey("handleClickLink"), - props: { - handleClick: (view, pos, event) => { - var _a, _b; - if (event.button !== 0) { - return false; - } - const eventTarget = event.target; - if (eventTarget.nodeName !== "A") { - return false; - } - const attrs = getAttributes(view.state, options.type.name); - const link = event.target; - const href = (_a = link === null || link === void 0 ? void 0 : link.href) !== null && _a !== void 0 ? _a : attrs.href; - const target = (_b = link === null || link === void 0 ? void 0 : link.target) !== null && _b !== void 0 ? _b : attrs.target; - if (link && href) { - if (view.editable) { - window.open(href, target); - } - return true; - } - return false; - } - } - }); -} -function pasteHandler(options) { - return new Plugin({ - key: new PluginKey("handlePasteLink"), - props: { - handlePaste: (view, event, slice2) => { - var _a; - const { state } = view; - const { selection } = state; - const { empty: empty2 } = selection; - if (empty2) { - return false; - } - let textContent = ""; - slice2.content.forEach((node) => { - textContent += node.textContent; - }); - const link = find(textContent).find((item) => item.isLink && item.value === textContent); - if (!textContent || !link) { - return false; - } - const html = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData("text/html"); - const hrefRegex = /href="([^"]*)"/; - const existingLink = html === null || html === void 0 ? void 0 : html.match(hrefRegex); - const url = existingLink ? existingLink[1] : link.href; - options.editor.commands.setMark(options.type, { - href: url - }); - return true; - } - } - }); -} -var Link = Mark2.create({ - name: "link", - priority: 1e3, - keepOnSplit: false, - onCreate() { - this.options.protocols.forEach((protocol) => { - if (typeof protocol === "string") { - registerCustomProtocol(protocol); - return; - } - registerCustomProtocol(protocol.scheme, protocol.optionalSlashes); - }); - }, - onDestroy() { - reset(); - }, - inclusive() { - return this.options.autolink; - }, - addOptions() { - return { - openOnClick: true, - linkOnPaste: true, - autolink: true, - protocols: [], - HTMLAttributes: { - target: "_blank", - rel: "noopener noreferrer nofollow", - class: null - }, - validate: void 0 - }; - }, - addAttributes() { - return { - href: { - default: null - }, - target: { - default: this.options.HTMLAttributes.target - }, - rel: { - default: this.options.HTMLAttributes.rel - }, - class: { - default: this.options.HTMLAttributes.class - } - }; - }, - parseHTML() { - return [{ tag: 'a[href]:not([href *= "javascript:" i])' }]; - }, - renderHTML({ HTMLAttributes }) { - var _a; - if ((_a = HTMLAttributes.href) === null || _a === void 0 ? void 0 : _a.startsWith("javascript:")) { - return ["a", mergeAttributes(this.options.HTMLAttributes, { ...HTMLAttributes, href: "" }), 0]; - } - return ["a", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setLink: (attributes) => ({ chain }) => { - return chain().setMark(this.name, attributes).setMeta("preventAutolink", true).run(); - }, - toggleLink: (attributes) => ({ chain }) => { - return chain().toggleMark(this.name, attributes, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run(); - }, - unsetLink: () => ({ chain }) => { - return chain().unsetMark(this.name, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run(); - } - }; - }, - addPasteRules() { - return [ - markPasteRule({ - find: (text) => find(text).filter((link) => { - if (this.options.validate) { - return this.options.validate(link.value); - } - return true; - }).filter((link) => link.isLink).map((link) => ({ - text: link.value, - index: link.start, - data: link - })), - type: this.type, - getAttributes: (match, pasteEvent) => { - var _a, _b; - const html = (_a = pasteEvent === null || pasteEvent === void 0 ? void 0 : pasteEvent.clipboardData) === null || _a === void 0 ? void 0 : _a.getData("text/html"); - const hrefRegex = /href="([^"]*)"/; - const existingLink = html === null || html === void 0 ? void 0 : html.match(hrefRegex); - if (existingLink) { - return { - href: existingLink[1] - }; - } - return { - href: (_b = match.data) === null || _b === void 0 ? void 0 : _b.href - }; - } - }) - ]; - }, - addProseMirrorPlugins() { - const plugins = []; - if (this.options.autolink) { - plugins.push(autolink({ - type: this.type, - validate: this.options.validate - })); - } - if (this.options.openOnClick) { - plugins.push(clickHandler({ - type: this.type - })); - } - if (this.options.linkOnPaste) { - plugins.push(pasteHandler({ - editor: this.editor, - type: this.type - })); - } - return plugins; - } -}); - -// resources/js/extensions/Link.js -var CustomLink = Link.extend({ - addOptions() { - return { - openOnClick: true, - linkOnPaste: true, - autolink: true, - protocols: [], - HTMLAttributes: {}, - validate: void 0 - }; - }, - addAttributes() { - return { - href: { - default: null - }, - id: { - default: null - }, - target: { - default: this.options.HTMLAttributes.target - }, - hreflang: { - default: null - }, - rel: { - default: null - }, - referrerpolicy: { - default: null - }, - class: { - default: null - }, - as_button: { - default: null, - parseHTML: (element) => element.getAttribute("data-as-button"), - renderHTML: (attributes) => { - return { - "data-as-button": attributes.as_button - }; - } - }, - button_theme: { - default: null, - parseHTML: (element) => element.getAttribute("data-as-button-theme"), - renderHTML: (attributes) => { - return { - "data-as-button-theme": attributes.button_theme - }; - } - } - }; - } -}); - -// node_modules/@tiptap/extension-image/dist/index.js -var inputRegex7 = /(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/; -var Image = Node2.create({ - name: "image", - addOptions() { - return { - inline: false, - allowBase64: false, - HTMLAttributes: {} - }; - }, - inline() { - return this.options.inline; - }, - group() { - return this.options.inline ? "inline" : "block"; - }, - draggable: true, - addAttributes() { - return { - src: { - default: null - }, - alt: { - default: null - }, - title: { - default: null - } - }; - }, - parseHTML() { - return [ - { - tag: this.options.allowBase64 ? "img[src]" : 'img[src]:not([src^="data:"])' - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["img", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)]; - }, - addCommands() { - return { - setImage: (options) => ({ commands: commands2 }) => { - return commands2.insertContent({ - type: this.name, - attrs: options - }); - } - }; - }, - addInputRules() { - return [ - nodeInputRule({ - find: inputRegex7, - type: this.type, - getAttributes: (match) => { - const [, , alt, src, title] = match; - return { src, alt, title }; - } - }) - ]; - } -}); - -// resources/js/extensions/Image.js -var CustomImage = Image.extend({ - addAttributes() { - return { - src: { - default: null - }, - alt: { - default: null - }, - title: { - default: null - }, - width: { - default: null - }, - height: { - default: null - }, - lazy: { - default: null, - parseHTML: (element) => element.getAttribute("loading") === "lazy" ? element.getAttribute("data-lazy") : null, - renderHTML: (attributes) => { - if (attributes.lazy) { - return { - "data-lazy": attributes.lazy, - "loading": "lazy" - }; - } - } - } - }; - } -}); - -// resources/js/extensions/Paragraph.js -var CustomParagraph = Paragraph.extend({ - addAttributes() { - return { - class: { - default: null - } - }; - } -}); - -// resources/js/extensions/Small.js -var Small = Mark2.create({ - name: "small", - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "small" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["small", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setSmall: () => ({ commands: commands2 }) => { - return commands2.setMark(this.name); - }, - toggleSmall: () => ({ commands: commands2 }) => { - return commands2.toggleMark(this.name); - }, - unsetSmall: () => ({ commands: commands2 }) => { - return commands2.unsetMark(this.name); - } - }; - } -}); - -// resources/js/extensions/Grid/utils/createColumn.js -function createColumn(colType, colContent = null) { - if (colContent) { - return colType.createChecked(null, colContent); - } - return colType.createAndFill(); -} - -// resources/js/extensions/Grid/utils/getGridNodeTypes.js -function getGridNodeTypes(schema) { - if (schema.cached.gridNodeTypes) { - return schema.cached.gridNodeTypes; - } - const roles = {}; - Object.keys(schema.nodes).forEach((type) => { - const nodeType = schema.nodes[type]; - if (nodeType.spec.gridRole) { - roles[nodeType.spec.gridRole] = nodeType; - } - }); - schema.cached.gridNodeTypes = roles; - return roles; -} - -// resources/js/extensions/Grid/utils/createGrid.js -function createGrid(schema, colsCount, type, colContent) { - const types = getGridNodeTypes(schema); - const cols = []; - for (let index = 0; index < colsCount; index += 1) { - const col = createColumn(types.column, colContent); - if (col) { - cols.push(col); - } - } - return types.grid.createChecked({ cols: colsCount, type }, cols); -} - -// resources/js/extensions/Grid/Grid.js -var Grid = Node2.create({ - name: "grid", - group: "block", - defining: true, - isolating: true, - allowGapCursor: false, - content: "gridColumn+", - gridRole: "grid", - addOptions() { - return { - HTMLAttributes: { - class: "filament-tiptap-grid" - } - }; - }, - addAttributes() { - return { - type: { - default: "responsive", - parseHTML: (element) => element.getAttribute("type") - }, - cols: { - default: 2, - parseHTML: (element) => element.getAttribute("cols") - } - }; - }, - parseHTML() { - return [ - { - tag: "div", - getAttrs: (node) => node.classList.contains("filament-tiptap-grid") && null - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - insertGrid: ({ cols = 3, type = "responsive" } = {}) => ({ tr: tr2, dispatch, editor }) => { - const node = createGrid(editor.schema, cols, type); - if (dispatch) { - const offset2 = tr2.selection.anchor + 1; - tr2.replaceSelectionWith(node).scrollIntoView().setSelection(TextSelection.near(tr2.doc.resolve(offset2))); - } - return true; - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Alt-G": () => this.editor.commands.insertGrid() - }; - }, - extendNodeSchema(extension) { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - return { - gridRole: callOrReturn(getExtensionField(extension, "gridRole", context)) - }; - } -}); - -// resources/js/extensions/Grid/GridColumn.js -var GridColumn = Node2.create({ - name: "gridColumn", - content: "block+", - gridRole: "column", - isolating: true, - addOptions() { - return { - HTMLAttributes: { - class: "filament-tiptap-grid__column" - } - }; - }, - parseHTML() { - return [ - { - tag: "div", - getAttrs: (node) => node.classList.contains("filament-tiptap-grid__column") && null - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - } -}); - -// resources/js/extensions/Youtube/utils.js -var isValidYoutubeUrl = (url) => { - return url.match(/(youtube\.com|youtu\.be)(.+)?$/); -}; -var getYoutubeEmbedUrl = (nocookie = false) => { - return nocookie ? "https://www.youtube-nocookie.com/embed/" : "https://www.youtube.com/embed/"; -}; -var getEmbedURLFromYoutubeURL = (options) => { - const { url, controls, nocookie, startAt } = options; - if (url.includes("/embed/")) { - return url; - } - if (url.includes("youtu.be")) { - const id = url.split("/").pop(); - if (!id) { - return null; - } - return `${getYoutubeEmbedUrl(nocookie)}${id}`; - } - const videoIdRegex = /v=([-\w]+)/gm; - const matches2 = videoIdRegex.exec(url); - if (!matches2 || !matches2[1]) { - return null; - } - let outputUrl = `${getYoutubeEmbedUrl(nocookie)}${matches2[1]}`; - const params = []; - if (!controls) { - params.push("controls=0"); - } else { - params.push("controls=1"); - } - if (startAt) { - params.push(`start=${startAt}`); - } - if (params.length) { - outputUrl += `?${params.join("&")}`; - } - return outputUrl; -}; - -// resources/js/extensions/Youtube/Youtube.js -var Youtube = Node2.create({ - name: "youtube", - selectable: true, - draggable: true, - atom: true, - addOptions() { - return { - inline: false, - HTMLAttributes: {}, - width: 640, - height: 480 - }; - }, - inline() { - return this.options.inline; - }, - group() { - return this.options.inline ? "inline" : "block"; - }, - addAttributes() { - return { - style: { - default: null, - parseHTML: (element) => element.getAttribute("style") - }, - src: { - default: null - }, - width: { - default: this.options.width, - parseHTML: (element) => element.getAttribute("width") - }, - height: { - default: this.options.height, - parseHTML: (element) => element.getAttribute("height") - }, - responsive: { - default: true, - parseHTML: (element) => element.classList.contains("responsive") ?? false - }, - start: { - default: 0 - }, - controls: { - default: true - }, - nocookie: { - default: false - }, - "data-aspect-width": { - default: null, - parseHTML: (element) => element.getAttribute("data-aspect-width") - }, - "data-aspect-height": { - default: null, - parseHTML: (element) => element.getAttribute("data-aspect-height") - } - }; - }, - parseHTML() { - return [ - { - tag: "div[data-youtube-video] iframe" - } - ]; - }, - addCommands() { - return { - setYoutubeVideo: (options) => ({ commands: commands2 }) => { - if (!isValidYoutubeUrl(options.src)) { - return false; - } - const embedUrl = getEmbedURLFromYoutubeURL({ - url: options.src, - controls: options.controls, - nocookie: options.nocookie, - startAt: options.start || 0 - }); - return commands2.insertContent({ - type: this.name, - attrs: { - ...options, - src: embedUrl - } - }); - } - }; - }, - renderHTML({ HTMLAttributes }) { - const embedUrl = getEmbedURLFromYoutubeURL({ - url: HTMLAttributes.src, - controls: HTMLAttributes.controls, - nocookie: HTMLAttributes.nocookie, - startAt: HTMLAttributes.start || 0 - }); - return [ - "div", - { - "data-youtube-video": "", - class: HTMLAttributes.responsive ? "responsive" : null - }, - [ - "iframe", - { - src: embedUrl, - width: HTMLAttributes.width, - height: HTMLAttributes.height, - allowfullscreen: this.options.allowFullscreen, - style: HTMLAttributes.responsive ? `aspect-ratio: ${HTMLAttributes["data-aspect-width"]} / ${HTMLAttributes["data-aspect-height"]}; width: 100%; height: auto;` : null, - "data-aspect-width": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-width"] : null, - "data-aspect-height": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-height"] : null - } - ] - ]; - } -}); - -// resources/js/extensions/Vimeo/utils.js -var isValidVimeoUrl = (url) => { - return url.match(/(vimeo\.com)(.+)?$/); -}; -var getEmbedURLFromVimeoURL = (options) => { - const { url, autoplay, loop, title, byline, portrait } = options; - if (url.includes("/video/")) { - return url; - } - const videoIdRegex = /\.com\/([0-9]+)/gm; - const matches2 = videoIdRegex.exec(url); - if (!matches2 || !matches2[1]) { - return null; - } - let outputUrl = `https://player.vimeo.com/video/${matches2[1]}`; - const params = [`autoplay=${autoplay}`, `loop=${loop}`, `title=${title}`, `byline=${byline}`, `portrait=${portrait}`]; - outputUrl += `?${params.join("&")}`; - return outputUrl; -}; - -// resources/js/extensions/Vimeo/Vimeo.js -var Vimeo = Node2.create({ - name: "vimeo", - selectable: true, - draggable: true, - atom: true, - addOptions() { - return { - inline: false, - HTMLAttributes: {}, - allowFullscreen: true, - width: 640, - height: 480 - }; - }, - inline() { - return this.options.inline; - }, - group() { - return this.options.inline ? "inline" : "block"; - }, - addAttributes() { - return { - style: { - default: null, - parseHTML: (element) => element.getAttribute("style") - }, - src: { - default: null - }, - width: { - default: this.options.width, - parseHTML: (element) => element.getAttribute("width") - }, - height: { - default: this.options.height, - parseHTML: (element) => element.getAttribute("height") - }, - autoplay: { - default: 0 - }, - loop: { - default: 0 - }, - title: { - default: 0 - }, - byline: { - default: 0 - }, - portrait: { - default: 0 - }, - responsive: { - default: true, - parseHTML: (element) => element.classList.contains("responsive") ?? false - }, - "data-aspect-width": { - default: null, - parseHTML: (element) => element.getAttribute("data-aspect-width") - }, - "data-aspect-height": { - default: null, - parseHTML: (element) => element.getAttribute("data-aspect-height") - } - }; - }, - parseHTML() { - return [ - { - tag: "div[data-vimeo-video] iframe" - } - ]; - }, - addCommands() { - return { - setVimeoVideo: (options) => ({ commands: commands2 }) => { - if (!isValidVimeoUrl(options.src)) { - return false; - } - const embedUrl = getEmbedURLFromVimeoURL({ - url: options.src, - autoplay: options?.autoplay || 0, - loop: options?.loop || 0, - title: options?.title || 0, - byline: options?.byline || 0, - portrait: options?.portrait || 0 - }); - return commands2.insertContent({ - type: this.name, - attrs: { - ...options, - src: embedUrl - } - }); - } - }; - }, - renderHTML({ HTMLAttributes }) { - const embedUrl = getEmbedURLFromVimeoURL({ - url: HTMLAttributes.src, - autoplay: HTMLAttributes?.autoplay || 0, - loop: HTMLAttributes?.loop || 0, - title: HTMLAttributes?.title || 0, - byline: HTMLAttributes?.byline || 0, - portrait: HTMLAttributes?.portrait || 0 - }); - return [ - "div", - { "data-vimeo-video": "", class: HTMLAttributes.responsive ? "responsive" : null }, - [ - "iframe", - { - src: embedUrl, - width: HTMLAttributes.width, - height: HTMLAttributes.height, - allowfullscreen: this.options.allowfullscreen, - frameborder: 0, - allow: "autoplay; fullscreen; picture-in-picture", - style: HTMLAttributes.responsive ? `aspect-ratio: ${HTMLAttributes["data-aspect-width"]} / ${HTMLAttributes["data-aspect-height"]}; width: 100%; height: auto;` : null, - "data-aspect-width": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-width"] : null, - "data-aspect-height": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-height"] : null - } - ] - ]; - } -}); - -// resources/js/extensions/Video.js -var Video = Node2.create({ - name: "video", - selectable: true, - draggable: true, - atom: true, - inline() { - return this.options.inline; - }, - group() { - return this.options.inline ? "inline" : "block"; - }, - addOptions() { - return { - inline: false, - HTMLAttributes: { - autoplay: null, - controls: null, - loop: null - }, - width: 640, - height: 480 - }; - }, - addAttributes() { - return { - style: { - default: null, - parseHTML: (element) => element.getAttribute("style") - }, - responsive: { - default: true, - parseHTML: (element) => element.classList.contains("responsive") ?? false - }, - src: { - default: null - }, - width: { - default: this.options.width, - parseHTML: (element) => element.getAttribute("width") - }, - height: { - default: this.options.height, - parseHTML: (element) => element.getAttribute("height") - }, - autoplay: { - default: null, - parseHTML: (element) => element.getAttribute("autoplay") - }, - controls: { - default: null, - parseHTML: (element) => element.getAttribute("controls") - }, - loop: { - default: null, - parseHTML: (element) => element.getAttribute("loop") - }, - "data-aspect-width": { - default: null, - parseHTML: (element) => element.getAttribute("data-aspect-width") - }, - "data-aspect-height": { - default: null, - parseHTML: (element) => element.getAttribute("data-aspect-height") - } - }; - }, - parseHTML() { - return [ - { - tag: "div[data-native-video] video" - } - ]; - }, - addCommands() { - return { - setVideo: (options) => ({ commands: commands2 }) => { - return commands2.insertContent({ - type: this.name, - attrs: options - }); - } - }; - }, - renderHTML({ HTMLAttributes }) { - return [ - "div", - { "data-native-video": "", class: HTMLAttributes.responsive ? "responsive" : null }, - [ - "video", - { - src: HTMLAttributes.src, - width: HTMLAttributes.width, - height: HTMLAttributes.height, - autoplay: HTMLAttributes.autoplay ? "true" : null, - controls: HTMLAttributes.controls ? "true" : null, - loop: HTMLAttributes.loop ? "true" : null, - style: HTMLAttributes.responsive ? `aspect-ratio: ${HTMLAttributes["data-aspect-width"]} / ${HTMLAttributes["data-aspect-height"]}; width: 100%; height: auto;` : null, - "data-aspect-width": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-width"] : null, - "data-aspect-height": HTMLAttributes.responsive ? HTMLAttributes["data-aspect-height"] : null - } - ] - ]; - } -}); - -// resources/js/extensions/Details/Details.js -var Details = Node2.create({ - name: "details", - content: "detailsSummary detailsContent", - group: "block", - defining: true, - isolating: true, - allowGapCursor: false, - addOptions() { - return { - HTMLAttributes: {} - }; - }, - addAttributes() { - return {}; - }, - parseHTML() { - return [ - { - tag: "details" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["details", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addNodeView() { - return ({ editor, getPos, node, HTMLAttributes }) => { - const dom = document.createElement("div"); - const content = document.createElement("div"); - const attributes = mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { - "data-type": this.name - }); - Object.entries(attributes).forEach(([key, value]) => dom.setAttribute(key, value)); - return { - dom, - contentDOM: dom, - ignoreMutation(mutation) { - if (mutation.type === "selection") { - return false; - } - return !dom.contains(mutation.target) || dom === mutation.target; - }, - update: (updatedNode) => { - if (updatedNode.type !== this.type) { - return false; - } - return true; - } - }; - }; - }, - addCommands() { - return { - setDetails: () => ({ state, chain }) => { - var _a; - const { schema, selection } = state; - const { $from, $to } = selection; - const range = $from.blockRange($to); - if (!range) { - return false; - } - const slice2 = state.doc.slice(range.start, range.end); - const match = schema.nodes.detailsContent.contentMatch.matchFragment(slice2.content); - if (!match) { - return false; - } - const content = ((_a = slice2.toJSON()) === null || _a === void 0 ? void 0 : _a.content) || []; - return chain().insertContentAt({ from: range.start, to: range.end }, { type: this.name, content: [{ type: "detailsSummary" }, { type: "detailsContent", content }] }).setTextSelection(range.start + 2).run(); - }, - unsetDetails: () => ({ state, chain }) => { - const { selection, schema } = state; - const details = findParentNode((node) => node.type === this.type)(selection); - if (!details) { - return false; - } - const detailsSummaries = findChildren(details.node, (node) => node.type === schema.nodes.detailsSummary); - const detailsContents = findChildren(details.node, (node) => node.type === schema.nodes.detailsContent); - if (!detailsSummaries.length || !detailsContents.length) { - return false; - } - const detailsSummary = detailsSummaries[0]; - const detailsContent = detailsContents[0]; - const from2 = details.pos; - const $from = state.doc.resolve(from2); - const to = from2 + details.node.nodeSize; - const range = { from: from2, to }; - const content = detailsContent.node.content.toJSON() || []; - const defaultTypeForSummary = $from.parent.type.contentMatch.defaultType; - const summaryContent = defaultTypeForSummary === null || defaultTypeForSummary === void 0 ? void 0 : defaultTypeForSummary.create(null, detailsSummary.node.content).toJSON(); - const mergedContent = [summaryContent, ...content]; - return chain().insertContentAt(range, mergedContent).setTextSelection(from2 + 1).run(); - } - }; - }, - addKeyboardShortcuts() { - return { - Backspace: () => { - const { schema, selection } = this.editor.state; - const { empty: empty2, $anchor } = selection; - if (!empty2 || $anchor.parent.type !== schema.nodes.detailsSummary) { - return false; - } - if ($anchor.parentOffset !== 0) { - return this.editor.commands.command(({ tr: tr2 }) => { - const from2 = $anchor.pos - 1; - const to = $anchor.pos; - tr2.delete(from2, to); - return true; - }); - } - return this.editor.commands.unsetDetails(); - } - }; - } -}); - -// resources/js/extensions/Details/DetailsSummary.js -var DetailsSummary = Node2.create({ - name: "detailsSummary", - content: "text*", - defining: true, - selectable: false, - isolating: true, - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: "summary" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["summary", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - } -}); - -// resources/js/extensions/Details/DetailsContent.js -var DetailsContent = Node2.create({ - name: "detailsContent", - content: "block+", - defining: true, - selectable: false, - addOptions() { - return { - HTMLAttributes: {} - }; - }, - parseHTML() { - return [ - { - tag: `div[data-type="details-content"]` - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { "data-type": "details-content" }), 0]; - }, - addKeyboardShortcuts() { - return { - // allows double enter to exit content node - Enter: ({ editor }) => { - const { state, view } = editor; - const { selection } = state; - const { $from, empty: empty2 } = selection; - const detailsContent = findParentNode((node2) => node2.type === this.type)(selection); - if (!empty2 || !detailsContent || !detailsContent.node.childCount) { - return false; - } - const fromIndex = $from.index(detailsContent.depth); - const { childCount } = detailsContent.node; - const isAtEnd = childCount === fromIndex + 1; - if (!isAtEnd) { - return false; - } - const defaultChildType = detailsContent.node.type.contentMatch.defaultType; - const defaultChildNode = defaultChildType === null || defaultChildType === void 0 ? void 0 : defaultChildType.createAndFill(); - if (!defaultChildNode) { - return false; - } - const $childPos = state.doc.resolve(detailsContent.pos + 1); - const lastChildIndex = childCount - 1; - const lastChildNode = detailsContent.node.child(lastChildIndex); - const lastChildPos = $childPos.posAtIndex(lastChildIndex, detailsContent.depth); - const lastChildNodeIsEmpty = lastChildNode.eq(defaultChildNode); - if (!lastChildNodeIsEmpty) { - return false; - } - const above = $from.node(-3); - if (!above) { - return false; - } - const after = $from.indexAfter(-3); - const type = defaultBlockAt2(above.contentMatchAt(after)); - if (!type || !above.canReplaceWith(after, after, type)) { - return false; - } - const node = type.createAndFill(); - if (!node) { - return false; - } - const { tr: tr2 } = state; - const pos = $from.after(-2); - tr2.replaceWith(pos, pos, node); - const $pos = tr2.doc.resolve(pos); - const newSelection = Selection.near($pos, 1); - tr2.setSelection(newSelection); - const deleteFrom = lastChildPos; - const deleteTo = lastChildPos + lastChildNode.nodeSize; - tr2.delete(deleteFrom, deleteTo); - tr2.scrollIntoView(); - view.dispatch(tr2); - return true; - } - }; - } -}); - -// node_modules/@tiptap/extension-code-block/dist/index.js -var backtickInputRegex = /^```([a-z]+)?[\s\n]$/; -var tildeInputRegex = /^~~~([a-z]+)?[\s\n]$/; -var CodeBlock = Node2.create({ - name: "codeBlock", - addOptions() { - return { - languageClassPrefix: "language-", - exitOnTripleEnter: true, - exitOnArrowDown: true, - HTMLAttributes: {} - }; - }, - content: "text*", - marks: "", - group: "block", - code: true, - defining: true, - addAttributes() { - return { - language: { - default: null, - parseHTML: (element) => { - var _a; - const { languageClassPrefix } = this.options; - const classNames = [...((_a = element.firstElementChild) === null || _a === void 0 ? void 0 : _a.classList) || []]; - const languages = classNames.filter((className) => className.startsWith(languageClassPrefix)).map((className) => className.replace(languageClassPrefix, "")); - const language = languages[0]; - if (!language) { - return null; - } - return language; - }, - rendered: false - } - }; - }, - parseHTML() { - return [ - { - tag: "pre", - preserveWhitespace: "full" - } - ]; - }, - renderHTML({ node, HTMLAttributes }) { - return [ - "pre", - mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), - [ - "code", - { - class: node.attrs.language ? this.options.languageClassPrefix + node.attrs.language : null - }, - 0 - ] - ]; - }, - addCommands() { - return { - setCodeBlock: (attributes) => ({ commands: commands2 }) => { - return commands2.setNode(this.name, attributes); - }, - toggleCodeBlock: (attributes) => ({ commands: commands2 }) => { - return commands2.toggleNode(this.name, "paragraph", attributes); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Alt-c": () => this.editor.commands.toggleCodeBlock(), - // remove code block when at start of document or code block is empty - Backspace: () => { - const { empty: empty2, $anchor } = this.editor.state.selection; - const isAtStart = $anchor.pos === 1; - if (!empty2 || $anchor.parent.type.name !== this.name) { - return false; - } - if (isAtStart || !$anchor.parent.textContent.length) { - return this.editor.commands.clearNodes(); - } - return false; - }, - // exit node on triple enter - Enter: ({ editor }) => { - if (!this.options.exitOnTripleEnter) { - return false; - } - const { state } = editor; - const { selection } = state; - const { $from, empty: empty2 } = selection; - if (!empty2 || $from.parent.type !== this.type) { - return false; - } - const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2; - const endsWithDoubleNewline = $from.parent.textContent.endsWith("\n\n"); - if (!isAtEnd || !endsWithDoubleNewline) { - return false; - } - return editor.chain().command(({ tr: tr2 }) => { - tr2.delete($from.pos - 2, $from.pos); - return true; - }).exitCode().run(); - }, - // exit node on arrow down - ArrowDown: ({ editor }) => { - if (!this.options.exitOnArrowDown) { - return false; - } - const { state } = editor; - const { selection, doc: doc3 } = state; - const { $from, empty: empty2 } = selection; - if (!empty2 || $from.parent.type !== this.type) { - return false; - } - const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2; - if (!isAtEnd) { - return false; - } - const after = $from.after(); - if (after === void 0) { - return false; - } - const nodeAfter = doc3.nodeAt(after); - if (nodeAfter) { - return false; - } - return editor.commands.exitCode(); - } - }; - }, - addInputRules() { - return [ - textblockTypeInputRule({ - find: backtickInputRegex, - type: this.type, - getAttributes: (match) => ({ - language: match[1] - }) - }), - textblockTypeInputRule({ - find: tildeInputRegex, - type: this.type, - getAttributes: (match) => ({ - language: match[1] - }) - }) - ]; - }, - addProseMirrorPlugins() { - return [ - // this plugin creates a code block for pasted content from VS Code - // we can also detect the copied code language - new Plugin({ - key: new PluginKey("codeBlockVSCodeHandler"), - props: { - handlePaste: (view, event) => { - if (!event.clipboardData) { - return false; - } - if (this.editor.isActive(this.type.name)) { - return false; - } - const text = event.clipboardData.getData("text/plain"); - const vscode = event.clipboardData.getData("vscode-editor-data"); - const vscodeData = vscode ? JSON.parse(vscode) : void 0; - const language = vscodeData === null || vscodeData === void 0 ? void 0 : vscodeData.mode; - if (!text || !language) { - return false; - } - const { tr: tr2 } = view.state; - tr2.replaceSelectionWith(this.type.create({ language })); - tr2.setSelection(TextSelection.near(tr2.doc.resolve(Math.max(0, tr2.selection.from - 2)))); - tr2.insertText(text.replace(/\r\n?/g, "\n")); - tr2.setMeta("paste", true); - view.dispatch(tr2); - return true; - } - } - }) - ]; - } -}); - -// node_modules/@tiptap/extension-code-block-lowlight/dist/index.js -var deepFreezeEs6 = { exports: {} }; -function deepFreeze(obj) { - if (obj instanceof Map) { - obj.clear = obj.delete = obj.set = function() { - throw new Error("map is read-only"); - }; - } else if (obj instanceof Set) { - obj.add = obj.clear = obj.delete = function() { - throw new Error("set is read-only"); - }; - } - Object.freeze(obj); - Object.getOwnPropertyNames(obj).forEach(function(name) { - var prop = obj[name]; - if (typeof prop == "object" && !Object.isFrozen(prop)) { - deepFreeze(prop); - } - }); - return obj; -} -deepFreezeEs6.exports = deepFreeze; -deepFreezeEs6.exports.default = deepFreeze; -var Response = class { - /** - * @param {CompiledMode} mode - */ - constructor(mode) { - if (mode.data === void 0) - mode.data = {}; - this.data = mode.data; - this.isMatchIgnored = false; - } - ignoreMatch() { - this.isMatchIgnored = true; - } -}; -function escapeHTML(value) { - return value.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); -} -function inherit$1(original, ...objects) { - const result = /* @__PURE__ */ Object.create(null); - for (const key in original) { - result[key] = original[key]; - } - objects.forEach(function(obj) { - for (const key in obj) { - result[key] = obj[key]; - } - }); - return ( - /** @type {T} */ - result - ); -} -var SPAN_CLOSE = ""; -var emitsWrappingTags = (node) => { - return !!node.scope || node.sublanguage && node.language; -}; -var scopeToCSSClass = (name, { prefix }) => { - if (name.includes(".")) { - const pieces = name.split("."); - return [ - `${prefix}${pieces.shift()}`, - ...pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`) - ].join(" "); - } - return `${prefix}${name}`; -}; -var HTMLRenderer = class { - /** - * Creates a new HTMLRenderer - * - * @param {Tree} parseTree - the parse tree (must support `walk` API) - * @param {{classPrefix: string}} options - */ - constructor(parseTree, options) { - this.buffer = ""; - this.classPrefix = options.classPrefix; - parseTree.walk(this); - } - /** - * Adds texts to the output stream - * - * @param {string} text */ - addText(text) { - this.buffer += escapeHTML(text); - } - /** - * Adds a node open to the output stream (if needed) - * - * @param {Node} node */ - openNode(node) { - if (!emitsWrappingTags(node)) - return; - let className = ""; - if (node.sublanguage) { - className = `language-${node.language}`; - } else { - className = scopeToCSSClass(node.scope, { prefix: this.classPrefix }); - } - this.span(className); - } - /** - * Adds a node close to the output stream (if needed) - * - * @param {Node} node */ - closeNode(node) { - if (!emitsWrappingTags(node)) - return; - this.buffer += SPAN_CLOSE; - } - /** - * returns the accumulated buffer - */ - value() { - return this.buffer; - } - // helpers - /** - * Builds a span element - * - * @param {string} className */ - span(className) { - this.buffer += ``; - } -}; -var newNode = (opts = {}) => { - const result = { children: [] }; - Object.assign(result, opts); - return result; -}; -var TokenTree = class _TokenTree { - constructor() { - this.rootNode = newNode(); - this.stack = [this.rootNode]; - } - get top() { - return this.stack[this.stack.length - 1]; - } - get root() { - return this.rootNode; - } - /** @param {Node} node */ - add(node) { - this.top.children.push(node); - } - /** @param {string} scope */ - openNode(scope) { - const node = newNode({ scope }); - this.add(node); - this.stack.push(node); - } - closeNode() { - if (this.stack.length > 1) { - return this.stack.pop(); - } - return void 0; - } - closeAllNodes() { - while (this.closeNode()) - ; - } - toJSON() { - return JSON.stringify(this.rootNode, null, 4); - } - /** - * @typedef { import("./html_renderer").Renderer } Renderer - * @param {Renderer} builder - */ - walk(builder) { - return this.constructor._walk(builder, this.rootNode); - } - /** - * @param {Renderer} builder - * @param {Node} node - */ - static _walk(builder, node) { - if (typeof node === "string") { - builder.addText(node); - } else if (node.children) { - builder.openNode(node); - node.children.forEach((child) => this._walk(builder, child)); - builder.closeNode(node); - } - return builder; - } - /** - * @param {Node} node - */ - static _collapse(node) { - if (typeof node === "string") - return; - if (!node.children) - return; - if (node.children.every((el) => typeof el === "string")) { - node.children = [node.children.join("")]; - } else { - node.children.forEach((child) => { - _TokenTree._collapse(child); - }); - } - } -}; -var TokenTreeEmitter = class extends TokenTree { - /** - * @param {*} options - */ - constructor(options) { - super(); - this.options = options; - } - /** - * @param {string} text - * @param {string} scope - */ - addKeyword(text, scope) { - if (text === "") { - return; - } - this.openNode(scope); - this.addText(text); - this.closeNode(); - } - /** - * @param {string} text - */ - addText(text) { - if (text === "") { - return; - } - this.add(text); - } - /** - * @param {Emitter & {root: DataNode}} emitter - * @param {string} name - */ - addSublanguage(emitter, name) { - const node = emitter.root; - node.sublanguage = true; - node.language = name; - this.add(node); - } - toHTML() { - const renderer = new HTMLRenderer(this, this.options); - return renderer.value(); - } - finalize() { - return true; - } -}; -function source(re) { - if (!re) - return null; - if (typeof re === "string") - return re; - return re.source; -} -function lookahead(re) { - return concat("(?=", re, ")"); -} -function anyNumberOfTimes(re) { - return concat("(?:", re, ")*"); -} -function optional(re) { - return concat("(?:", re, ")?"); -} -function concat(...args) { - const joined = args.map((x) => source(x)).join(""); - return joined; -} -function stripOptionsFromArgs(args) { - const opts = args[args.length - 1]; - if (typeof opts === "object" && opts.constructor === Object) { - args.splice(args.length - 1, 1); - return opts; - } else { - return {}; - } -} -function either(...args) { - const opts = stripOptionsFromArgs(args); - const joined = "(" + (opts.capture ? "" : "?:") + args.map((x) => source(x)).join("|") + ")"; - return joined; -} -function countMatchGroups(re) { - return new RegExp(re.toString() + "|").exec("").length - 1; -} -function startsWith(re, lexeme) { - const match = re && re.exec(lexeme); - return match && match.index === 0; -} -var BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; -function _rewriteBackreferences(regexps, { joinWith }) { - let numCaptures = 0; - return regexps.map((regex) => { - numCaptures += 1; - const offset2 = numCaptures; - let re = source(regex); - let out = ""; - while (re.length > 0) { - const match = BACKREF_RE.exec(re); - if (!match) { - out += re; - break; - } - out += re.substring(0, match.index); - re = re.substring(match.index + match[0].length); - if (match[0][0] === "\\" && match[1]) { - out += "\\" + String(Number(match[1]) + offset2); - } else { - out += match[0]; - if (match[0] === "(") { - numCaptures++; - } - } - } - return out; - }).map((re) => `(${re})`).join(joinWith); -} -var MATCH_NOTHING_RE = /\b\B/; -var IDENT_RE = "[a-zA-Z]\\w*"; -var UNDERSCORE_IDENT_RE = "[a-zA-Z_]\\w*"; -var NUMBER_RE = "\\b\\d+(\\.\\d+)?"; -var C_NUMBER_RE = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)"; -var BINARY_NUMBER_RE = "\\b(0b[01]+)"; -var RE_STARTERS_RE = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~"; -var SHEBANG = (opts = {}) => { - const beginShebang = /^#![ ]*\//; - if (opts.binary) { - opts.begin = concat( - beginShebang, - /.*\b/, - opts.binary, - /\b.*/ - ); - } - return inherit$1({ - scope: "meta", - begin: beginShebang, - end: /$/, - relevance: 0, - /** @type {ModeCallback} */ - "on:begin": (m, resp) => { - if (m.index !== 0) - resp.ignoreMatch(); - } - }, opts); -}; -var BACKSLASH_ESCAPE = { - begin: "\\\\[\\s\\S]", - relevance: 0 -}; -var APOS_STRING_MODE = { - scope: "string", - begin: "'", - end: "'", - illegal: "\\n", - contains: [BACKSLASH_ESCAPE] -}; -var QUOTE_STRING_MODE = { - scope: "string", - begin: '"', - end: '"', - illegal: "\\n", - contains: [BACKSLASH_ESCAPE] -}; -var PHRASAL_WORDS_MODE = { - begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ -}; -var COMMENT = function(begin, end2, modeOptions = {}) { - const mode = inherit$1( - { - scope: "comment", - begin, - end: end2, - contains: [] - }, - modeOptions - ); - mode.contains.push({ - scope: "doctag", - // hack to avoid the space from being included. the space is necessary to - // match here to prevent the plain text rule below from gobbling up doctags - begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", - end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, - excludeBegin: true, - relevance: 0 - }); - const ENGLISH_WORD = either( - // list of common 1 and 2 letter words in English - "I", - "a", - "is", - "so", - "us", - "to", - "at", - "if", - "in", - "it", - "on", - // note: this is not an exhaustive list of contractions, just popular ones - /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, - // contractions - can't we'd they're let's, etc - /[A-Za-z]+[-][a-z]+/, - // `no-way`, etc. - /[A-Za-z][a-z]{2,}/ - // allow capitalized words at beginning of sentences - ); - mode.contains.push( - { - // TODO: how to include ", (, ) without breaking grammars that use these for - // comment delimiters? - // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ - // --- - // this tries to find sequences of 3 english words in a row (without any - // "programming" type syntax) this gives us a strong signal that we've - // TRULY found a comment - vs perhaps scanning with the wrong language. - // It's possible to find something that LOOKS like the start of the - // comment - but then if there is no readable text - good chance it is a - // false match and not a comment. - // - // for a visual example please see: - // https://github.com/highlightjs/highlight.js/issues/2827 - begin: concat( - /[ ]+/, - // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ - "(", - ENGLISH_WORD, - /[.]?[:]?([.][ ]|[ ])/, - "){3}" - ) - // look for 3 words in a row - } - ); - return mode; -}; -var C_LINE_COMMENT_MODE = COMMENT("//", "$"); -var C_BLOCK_COMMENT_MODE = COMMENT("/\\*", "\\*/"); -var HASH_COMMENT_MODE = COMMENT("#", "$"); -var NUMBER_MODE = { - scope: "number", - begin: NUMBER_RE, - relevance: 0 -}; -var C_NUMBER_MODE = { - scope: "number", - begin: C_NUMBER_RE, - relevance: 0 -}; -var BINARY_NUMBER_MODE = { - scope: "number", - begin: BINARY_NUMBER_RE, - relevance: 0 -}; -var REGEXP_MODE = { - // this outer rule makes sure we actually have a WHOLE regex and not simply - // an expression such as: - // - // 3 / something - // - // (which will then blow up when regex's `illegal` sees the newline) - begin: /(?=\/[^/\n]*\/)/, - contains: [{ - scope: "regexp", - begin: /\//, - end: /\/[gimuy]*/, - illegal: /\n/, - contains: [ - BACKSLASH_ESCAPE, - { - begin: /\[/, - end: /\]/, - relevance: 0, - contains: [BACKSLASH_ESCAPE] - } - ] - }] -}; -var TITLE_MODE = { - scope: "title", - begin: IDENT_RE, - relevance: 0 -}; -var UNDERSCORE_TITLE_MODE = { - scope: "title", - begin: UNDERSCORE_IDENT_RE, - relevance: 0 -}; -var METHOD_GUARD = { - // excludes method names from keyword processing - begin: "\\.\\s*" + UNDERSCORE_IDENT_RE, - relevance: 0 -}; -var END_SAME_AS_BEGIN = function(mode) { - return Object.assign( - mode, - { - /** @type {ModeCallback} */ - "on:begin": (m, resp) => { - resp.data._beginMatch = m[1]; - }, - /** @type {ModeCallback} */ - "on:end": (m, resp) => { - if (resp.data._beginMatch !== m[1]) - resp.ignoreMatch(); - } - } - ); -}; -var MODES = /* @__PURE__ */ Object.freeze({ - __proto__: null, - MATCH_NOTHING_RE, - IDENT_RE, - UNDERSCORE_IDENT_RE, - NUMBER_RE, - C_NUMBER_RE, - BINARY_NUMBER_RE, - RE_STARTERS_RE, - SHEBANG, - BACKSLASH_ESCAPE, - APOS_STRING_MODE, - QUOTE_STRING_MODE, - PHRASAL_WORDS_MODE, - COMMENT, - C_LINE_COMMENT_MODE, - C_BLOCK_COMMENT_MODE, - HASH_COMMENT_MODE, - NUMBER_MODE, - C_NUMBER_MODE, - BINARY_NUMBER_MODE, - REGEXP_MODE, - TITLE_MODE, - UNDERSCORE_TITLE_MODE, - METHOD_GUARD, - END_SAME_AS_BEGIN -}); -function skipIfHasPrecedingDot(match, response) { - const before = match.input[match.index - 1]; - if (before === ".") { - response.ignoreMatch(); - } -} -function scopeClassName(mode, _parent) { - if (mode.className !== void 0) { - mode.scope = mode.className; - delete mode.className; - } -} -function beginKeywords(mode, parent) { - if (!parent) - return; - if (!mode.beginKeywords) - return; - mode.begin = "\\b(" + mode.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)"; - mode.__beforeBegin = skipIfHasPrecedingDot; - mode.keywords = mode.keywords || mode.beginKeywords; - delete mode.beginKeywords; - if (mode.relevance === void 0) - mode.relevance = 0; -} -function compileIllegal(mode, _parent) { - if (!Array.isArray(mode.illegal)) - return; - mode.illegal = either(...mode.illegal); -} -function compileMatch(mode, _parent) { - if (!mode.match) - return; - if (mode.begin || mode.end) - throw new Error("begin & end are not supported with match"); - mode.begin = mode.match; - delete mode.match; -} -function compileRelevance(mode, _parent) { - if (mode.relevance === void 0) - mode.relevance = 1; -} -var beforeMatchExt = (mode, parent) => { - if (!mode.beforeMatch) - return; - if (mode.starts) - throw new Error("beforeMatch cannot be used with starts"); - const originalMode = Object.assign({}, mode); - Object.keys(mode).forEach((key) => { - delete mode[key]; - }); - mode.keywords = originalMode.keywords; - mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin)); - mode.starts = { - relevance: 0, - contains: [ - Object.assign(originalMode, { endsParent: true }) - ] - }; - mode.relevance = 0; - delete originalMode.beforeMatch; -}; -var COMMON_KEYWORDS = [ - "of", - "and", - "for", - "in", - "not", - "or", - "if", - "then", - "parent", - // common variable name - "list", - // common variable name - "value" - // common variable name -]; -var DEFAULT_KEYWORD_SCOPE = "keyword"; -function compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) { - const compiledKeywords = /* @__PURE__ */ Object.create(null); - if (typeof rawKeywords === "string") { - compileList(scopeName, rawKeywords.split(" ")); - } else if (Array.isArray(rawKeywords)) { - compileList(scopeName, rawKeywords); - } else { - Object.keys(rawKeywords).forEach(function(scopeName2) { - Object.assign( - compiledKeywords, - compileKeywords(rawKeywords[scopeName2], caseInsensitive, scopeName2) - ); - }); - } - return compiledKeywords; - function compileList(scopeName2, keywordList) { - if (caseInsensitive) { - keywordList = keywordList.map((x) => x.toLowerCase()); - } - keywordList.forEach(function(keyword) { - const pair = keyword.split("|"); - compiledKeywords[pair[0]] = [scopeName2, scoreForKeyword(pair[0], pair[1])]; - }); - } -} -function scoreForKeyword(keyword, providedScore) { - if (providedScore) { - return Number(providedScore); - } - return commonKeyword(keyword) ? 0 : 1; -} -function commonKeyword(keyword) { - return COMMON_KEYWORDS.includes(keyword.toLowerCase()); -} -var seenDeprecations = {}; -var error = (message) => { - console.error(message); -}; -var warn2 = (message, ...args) => { - console.log(`WARN: ${message}`, ...args); -}; -var deprecated = (version2, message) => { - if (seenDeprecations[`${version2}/${message}`]) - return; - console.log(`Deprecated as of ${version2}. ${message}`); - seenDeprecations[`${version2}/${message}`] = true; -}; -var MultiClassError = new Error(); -function remapScopeNames(mode, regexes, { key }) { - let offset2 = 0; - const scopeNames = mode[key]; - const emit = {}; - const positions = {}; - for (let i = 1; i <= regexes.length; i++) { - positions[i + offset2] = scopeNames[i]; - emit[i + offset2] = true; - offset2 += countMatchGroups(regexes[i - 1]); - } - mode[key] = positions; - mode[key]._emit = emit; - mode[key]._multi = true; -} -function beginMultiClass(mode) { - if (!Array.isArray(mode.begin)) - return; - if (mode.skip || mode.excludeBegin || mode.returnBegin) { - error("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); - throw MultiClassError; - } - if (typeof mode.beginScope !== "object" || mode.beginScope === null) { - error("beginScope must be object"); - throw MultiClassError; - } - remapScopeNames(mode, mode.begin, { key: "beginScope" }); - mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" }); -} -function endMultiClass(mode) { - if (!Array.isArray(mode.end)) - return; - if (mode.skip || mode.excludeEnd || mode.returnEnd) { - error("skip, excludeEnd, returnEnd not compatible with endScope: {}"); - throw MultiClassError; - } - if (typeof mode.endScope !== "object" || mode.endScope === null) { - error("endScope must be object"); - throw MultiClassError; - } - remapScopeNames(mode, mode.end, { key: "endScope" }); - mode.end = _rewriteBackreferences(mode.end, { joinWith: "" }); -} -function scopeSugar(mode) { - if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { - mode.beginScope = mode.scope; - delete mode.scope; - } -} -function MultiClass(mode) { - scopeSugar(mode); - if (typeof mode.beginScope === "string") { - mode.beginScope = { _wrap: mode.beginScope }; - } - if (typeof mode.endScope === "string") { - mode.endScope = { _wrap: mode.endScope }; - } - beginMultiClass(mode); - endMultiClass(mode); -} -function compileLanguage(language) { - function langRe(value, global2) { - return new RegExp( - source(value), - "m" + (language.case_insensitive ? "i" : "") + (language.unicodeRegex ? "u" : "") + (global2 ? "g" : "") - ); - } - class MultiRegex { - constructor() { - this.matchIndexes = {}; - this.regexes = []; - this.matchAt = 1; - this.position = 0; - } - // @ts-ignore - addRule(re, opts) { - opts.position = this.position++; - this.matchIndexes[this.matchAt] = opts; - this.regexes.push([opts, re]); - this.matchAt += countMatchGroups(re) + 1; - } - compile() { - if (this.regexes.length === 0) { - this.exec = () => null; - } - const terminators = this.regexes.map((el) => el[1]); - this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: "|" }), true); - this.lastIndex = 0; - } - /** @param {string} s */ - exec(s) { - this.matcherRe.lastIndex = this.lastIndex; - const match = this.matcherRe.exec(s); - if (!match) { - return null; - } - const i = match.findIndex((el, i2) => i2 > 0 && el !== void 0); - const matchData = this.matchIndexes[i]; - match.splice(0, i); - return Object.assign(match, matchData); - } - } - class ResumableMultiRegex { - constructor() { - this.rules = []; - this.multiRegexes = []; - this.count = 0; - this.lastIndex = 0; - this.regexIndex = 0; - } - // @ts-ignore - getMatcher(index) { - if (this.multiRegexes[index]) - return this.multiRegexes[index]; - const matcher = new MultiRegex(); - this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); - matcher.compile(); - this.multiRegexes[index] = matcher; - return matcher; - } - resumingScanAtSamePosition() { - return this.regexIndex !== 0; - } - considerAll() { - this.regexIndex = 0; - } - // @ts-ignore - addRule(re, opts) { - this.rules.push([re, opts]); - if (opts.type === "begin") - this.count++; - } - /** @param {string} s */ - exec(s) { - const m = this.getMatcher(this.regexIndex); - m.lastIndex = this.lastIndex; - let result = m.exec(s); - if (this.resumingScanAtSamePosition()) { - if (result && result.index === this.lastIndex) - ; - else { - const m2 = this.getMatcher(0); - m2.lastIndex = this.lastIndex + 1; - result = m2.exec(s); - } - } - if (result) { - this.regexIndex += result.position + 1; - if (this.regexIndex === this.count) { - this.considerAll(); - } - } - return result; - } - } - function buildModeRegex(mode) { - const mm = new ResumableMultiRegex(); - mode.contains.forEach((term) => mm.addRule(term.begin, { rule: term, type: "begin" })); - if (mode.terminatorEnd) { - mm.addRule(mode.terminatorEnd, { type: "end" }); - } - if (mode.illegal) { - mm.addRule(mode.illegal, { type: "illegal" }); - } - return mm; - } - function compileMode(mode, parent) { - const cmode = ( - /** @type CompiledMode */ - mode - ); - if (mode.isCompiled) - return cmode; - [ - scopeClassName, - // do this early so compiler extensions generally don't have to worry about - // the distinction between match/begin - compileMatch, - MultiClass, - beforeMatchExt - ].forEach((ext) => ext(mode, parent)); - language.compilerExtensions.forEach((ext) => ext(mode, parent)); - mode.__beforeBegin = null; - [ - beginKeywords, - // do this later so compiler extensions that come earlier have access to the - // raw array if they wanted to perhaps manipulate it, etc. - compileIllegal, - // default to 1 relevance if not specified - compileRelevance - ].forEach((ext) => ext(mode, parent)); - mode.isCompiled = true; - let keywordPattern = null; - if (typeof mode.keywords === "object" && mode.keywords.$pattern) { - mode.keywords = Object.assign({}, mode.keywords); - keywordPattern = mode.keywords.$pattern; - delete mode.keywords.$pattern; - } - keywordPattern = keywordPattern || /\w+/; - if (mode.keywords) { - mode.keywords = compileKeywords(mode.keywords, language.case_insensitive); - } - cmode.keywordPatternRe = langRe(keywordPattern, true); - if (parent) { - if (!mode.begin) - mode.begin = /\B|\b/; - cmode.beginRe = langRe(cmode.begin); - if (!mode.end && !mode.endsWithParent) - mode.end = /\B|\b/; - if (mode.end) - cmode.endRe = langRe(cmode.end); - cmode.terminatorEnd = source(cmode.end) || ""; - if (mode.endsWithParent && parent.terminatorEnd) { - cmode.terminatorEnd += (mode.end ? "|" : "") + parent.terminatorEnd; - } - } - if (mode.illegal) - cmode.illegalRe = langRe( - /** @type {RegExp | string} */ - mode.illegal - ); - if (!mode.contains) - mode.contains = []; - mode.contains = [].concat(...mode.contains.map(function(c2) { - return expandOrCloneMode(c2 === "self" ? mode : c2); - })); - mode.contains.forEach(function(c2) { - compileMode( - /** @type Mode */ - c2, - cmode - ); - }); - if (mode.starts) { - compileMode(mode.starts, parent); - } - cmode.matcher = buildModeRegex(cmode); - return cmode; - } - if (!language.compilerExtensions) - language.compilerExtensions = []; - if (language.contains && language.contains.includes("self")) { - throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); - } - language.classNameAliases = inherit$1(language.classNameAliases || {}); - return compileMode( - /** @type Mode */ - language - ); -} -function dependencyOnParent(mode) { - if (!mode) - return false; - return mode.endsWithParent || dependencyOnParent(mode.starts); -} -function expandOrCloneMode(mode) { - if (mode.variants && !mode.cachedVariants) { - mode.cachedVariants = mode.variants.map(function(variant) { - return inherit$1(mode, { variants: null }, variant); - }); - } - if (mode.cachedVariants) { - return mode.cachedVariants; - } - if (dependencyOnParent(mode)) { - return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null }); - } - if (Object.isFrozen(mode)) { - return inherit$1(mode); - } - return mode; -} -var version = "11.6.0"; -var HTMLInjectionError = class extends Error { - constructor(reason, html) { - super(reason); - this.name = "HTMLInjectionError"; - this.html = html; - } -}; -var escape = escapeHTML; -var inherit = inherit$1; -var NO_MATCH = Symbol("nomatch"); -var MAX_KEYWORD_HITS = 7; -var HLJS = function(hljs) { - const languages = /* @__PURE__ */ Object.create(null); - const aliases = /* @__PURE__ */ Object.create(null); - const plugins = []; - let SAFE_MODE = true; - const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; - const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: "Plain text", contains: [] }; - let options = { - ignoreUnescapedHTML: false, - throwUnescapedHTML: false, - noHighlightRe: /^(no-?highlight)$/i, - languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, - classPrefix: "hljs-", - cssSelector: "pre code", - languages: null, - // beta configuration options, subject to change, welcome to discuss - // https://github.com/highlightjs/highlight.js/issues/1086 - __emitter: TokenTreeEmitter - }; - function shouldNotHighlight(languageName) { - return options.noHighlightRe.test(languageName); - } - function blockLanguage(block) { - let classes = block.className + " "; - classes += block.parentNode ? block.parentNode.className : ""; - const match = options.languageDetectRe.exec(classes); - if (match) { - const language = getLanguage(match[1]); - if (!language) { - warn2(LANGUAGE_NOT_FOUND.replace("{}", match[1])); - warn2("Falling back to no-highlight mode for this block.", block); - } - return language ? match[1] : "no-highlight"; - } - return classes.split(/\s+/).find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); - } - function highlight3(codeOrLanguageName, optionsOrCode, ignoreIllegals) { - let code = ""; - let languageName = ""; - if (typeof optionsOrCode === "object") { - code = codeOrLanguageName; - ignoreIllegals = optionsOrCode.ignoreIllegals; - languageName = optionsOrCode.language; - } else { - deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated."); - deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); - languageName = codeOrLanguageName; - code = optionsOrCode; - } - if (ignoreIllegals === void 0) { - ignoreIllegals = true; - } - const context = { - code, - language: languageName - }; - fire2("before:highlight", context); - const result = context.result ? context.result : _highlight(context.language, context.code, ignoreIllegals); - result.code = context.code; - fire2("after:highlight", result); - return result; - } - function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { - const keywordHits = /* @__PURE__ */ Object.create(null); - function keywordData(mode, matchText) { - return mode.keywords[matchText]; - } - function processKeywords() { - if (!top2.keywords) { - emitter.addText(modeBuffer); - return; - } - let lastIndex = 0; - top2.keywordPatternRe.lastIndex = 0; - let match = top2.keywordPatternRe.exec(modeBuffer); - let buf = ""; - while (match) { - buf += modeBuffer.substring(lastIndex, match.index); - const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; - const data = keywordData(top2, word); - if (data) { - const [kind, keywordRelevance] = data; - emitter.addText(buf); - buf = ""; - keywordHits[word] = (keywordHits[word] || 0) + 1; - if (keywordHits[word] <= MAX_KEYWORD_HITS) - relevance += keywordRelevance; - if (kind.startsWith("_")) { - buf += match[0]; - } else { - const cssClass = language.classNameAliases[kind] || kind; - emitter.addKeyword(match[0], cssClass); - } - } else { - buf += match[0]; - } - lastIndex = top2.keywordPatternRe.lastIndex; - match = top2.keywordPatternRe.exec(modeBuffer); - } - buf += modeBuffer.substring(lastIndex); - emitter.addText(buf); - } - function processSubLanguage() { - if (modeBuffer === "") - return; - let result2 = null; - if (typeof top2.subLanguage === "string") { - if (!languages[top2.subLanguage]) { - emitter.addText(modeBuffer); - return; - } - result2 = _highlight(top2.subLanguage, modeBuffer, true, continuations[top2.subLanguage]); - continuations[top2.subLanguage] = /** @type {CompiledMode} */ - result2._top; - } else { - result2 = highlightAuto2(modeBuffer, top2.subLanguage.length ? top2.subLanguage : null); - } - if (top2.relevance > 0) { - relevance += result2.relevance; - } - emitter.addSublanguage(result2._emitter, result2.language); - } - function processBuffer() { - if (top2.subLanguage != null) { - processSubLanguage(); - } else { - processKeywords(); - } - modeBuffer = ""; - } - function emitMultiClass(scope, match) { - let i = 1; - const max2 = match.length - 1; - while (i <= max2) { - if (!scope._emit[i]) { - i++; - continue; - } - const klass = language.classNameAliases[scope[i]] || scope[i]; - const text = match[i]; - if (klass) { - emitter.addKeyword(text, klass); - } else { - modeBuffer = text; - processKeywords(); - modeBuffer = ""; - } - i++; - } - } - function startNewMode(mode, match) { - if (mode.scope && typeof mode.scope === "string") { - emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); - } - if (mode.beginScope) { - if (mode.beginScope._wrap) { - emitter.addKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); - modeBuffer = ""; - } else if (mode.beginScope._multi) { - emitMultiClass(mode.beginScope, match); - modeBuffer = ""; - } - } - top2 = Object.create(mode, { parent: { value: top2 } }); - return top2; - } - function endOfMode(mode, match, matchPlusRemainder) { - let matched = startsWith(mode.endRe, matchPlusRemainder); - if (matched) { - if (mode["on:end"]) { - const resp = new Response(mode); - mode["on:end"](match, resp); - if (resp.isMatchIgnored) - matched = false; - } - if (matched) { - while (mode.endsParent && mode.parent) { - mode = mode.parent; - } - return mode; - } - } - if (mode.endsWithParent) { - return endOfMode(mode.parent, match, matchPlusRemainder); - } - } - function doIgnore(lexeme) { - if (top2.matcher.regexIndex === 0) { - modeBuffer += lexeme[0]; - return 1; - } else { - resumeScanAtSamePosition = true; - return 0; - } - } - function doBeginMatch(match) { - const lexeme = match[0]; - const newMode = match.rule; - const resp = new Response(newMode); - const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; - for (const cb of beforeCallbacks) { - if (!cb) - continue; - cb(match, resp); - if (resp.isMatchIgnored) - return doIgnore(lexeme); - } - if (newMode.skip) { - modeBuffer += lexeme; - } else { - if (newMode.excludeBegin) { - modeBuffer += lexeme; - } - processBuffer(); - if (!newMode.returnBegin && !newMode.excludeBegin) { - modeBuffer = lexeme; - } - } - startNewMode(newMode, match); - return newMode.returnBegin ? 0 : lexeme.length; - } - function doEndMatch(match) { - const lexeme = match[0]; - const matchPlusRemainder = codeToHighlight.substring(match.index); - const endMode = endOfMode(top2, match, matchPlusRemainder); - if (!endMode) { - return NO_MATCH; - } - const origin = top2; - if (top2.endScope && top2.endScope._wrap) { - processBuffer(); - emitter.addKeyword(lexeme, top2.endScope._wrap); - } else if (top2.endScope && top2.endScope._multi) { - processBuffer(); - emitMultiClass(top2.endScope, match); - } else if (origin.skip) { - modeBuffer += lexeme; - } else { - if (!(origin.returnEnd || origin.excludeEnd)) { - modeBuffer += lexeme; - } - processBuffer(); - if (origin.excludeEnd) { - modeBuffer = lexeme; - } - } - do { - if (top2.scope) { - emitter.closeNode(); - } - if (!top2.skip && !top2.subLanguage) { - relevance += top2.relevance; - } - top2 = top2.parent; - } while (top2 !== endMode.parent); - if (endMode.starts) { - startNewMode(endMode.starts, match); - } - return origin.returnEnd ? 0 : lexeme.length; - } - function processContinuations() { - const list = []; - for (let current = top2; current !== language; current = current.parent) { - if (current.scope) { - list.unshift(current.scope); - } - } - list.forEach((item) => emitter.openNode(item)); - } - let lastMatch = {}; - function processLexeme(textBeforeMatch, match) { - const lexeme = match && match[0]; - modeBuffer += textBeforeMatch; - if (lexeme == null) { - processBuffer(); - return 0; - } - if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { - modeBuffer += codeToHighlight.slice(match.index, match.index + 1); - if (!SAFE_MODE) { - const err = new Error(`0 width match regex (${languageName})`); - err.languageName = languageName; - err.badRule = lastMatch.rule; - throw err; - } - return 1; - } - lastMatch = match; - if (match.type === "begin") { - return doBeginMatch(match); - } else if (match.type === "illegal" && !ignoreIllegals) { - const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top2.scope || "") + '"'); - err.mode = top2; - throw err; - } else if (match.type === "end") { - const processed = doEndMatch(match); - if (processed !== NO_MATCH) { - return processed; - } - } - if (match.type === "illegal" && lexeme === "") { - return 1; - } - if (iterations > 1e5 && iterations > match.index * 3) { - const err = new Error("potential infinite loop, way more iterations than matches"); - throw err; - } - modeBuffer += lexeme; - return lexeme.length; - } - const language = getLanguage(languageName); - if (!language) { - error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); - throw new Error('Unknown language: "' + languageName + '"'); - } - const md = compileLanguage(language); - let result = ""; - let top2 = continuation || md; - const continuations = {}; - const emitter = new options.__emitter(options); - processContinuations(); - let modeBuffer = ""; - let relevance = 0; - let index = 0; - let iterations = 0; - let resumeScanAtSamePosition = false; - try { - top2.matcher.considerAll(); - for (; ; ) { - iterations++; - if (resumeScanAtSamePosition) { - resumeScanAtSamePosition = false; - } else { - top2.matcher.considerAll(); - } - top2.matcher.lastIndex = index; - const match = top2.matcher.exec(codeToHighlight); - if (!match) - break; - const beforeMatch = codeToHighlight.substring(index, match.index); - const processedCount = processLexeme(beforeMatch, match); - index = match.index + processedCount; - } - processLexeme(codeToHighlight.substring(index)); - emitter.closeAllNodes(); - emitter.finalize(); - result = emitter.toHTML(); - return { - language: languageName, - value: result, - relevance, - illegal: false, - _emitter: emitter, - _top: top2 - }; - } catch (err) { - if (err.message && err.message.includes("Illegal")) { - return { - language: languageName, - value: escape(codeToHighlight), - illegal: true, - relevance: 0, - _illegalBy: { - message: err.message, - index, - context: codeToHighlight.slice(index - 100, index + 100), - mode: err.mode, - resultSoFar: result - }, - _emitter: emitter - }; - } else if (SAFE_MODE) { - return { - language: languageName, - value: escape(codeToHighlight), - illegal: false, - relevance: 0, - errorRaised: err, - _emitter: emitter, - _top: top2 - }; - } else { - throw err; - } - } - } - function justTextHighlightResult(code) { - const result = { - value: escape(code), - illegal: false, - relevance: 0, - _top: PLAINTEXT_LANGUAGE, - _emitter: new options.__emitter(options) - }; - result._emitter.addText(code); - return result; - } - function highlightAuto2(code, languageSubset) { - languageSubset = languageSubset || options.languages || Object.keys(languages); - const plaintext2 = justTextHighlightResult(code); - const results = languageSubset.filter(getLanguage).filter(autoDetection).map( - (name) => _highlight(name, code, false) - ); - results.unshift(plaintext2); - const sorted = results.sort((a, b) => { - if (a.relevance !== b.relevance) - return b.relevance - a.relevance; - if (a.language && b.language) { - if (getLanguage(a.language).supersetOf === b.language) { - return 1; - } else if (getLanguage(b.language).supersetOf === a.language) { - return -1; - } - } - return 0; - }); - const [best, secondBest] = sorted; - const result = best; - result.secondBest = secondBest; - return result; - } - function updateClassName(element, currentLang, resultLang) { - const language = currentLang && aliases[currentLang] || resultLang; - element.classList.add("hljs"); - element.classList.add(`language-${language}`); - } - function highlightElement(element) { - let node = null; - const language = blockLanguage(element); - if (shouldNotHighlight(language)) - return; - fire2( - "before:highlightElement", - { el: element, language } - ); - if (element.children.length > 0) { - if (!options.ignoreUnescapedHTML) { - console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); - console.warn("https://github.com/highlightjs/highlight.js/wiki/security"); - console.warn("The element with unescaped HTML:"); - console.warn(element); - } - if (options.throwUnescapedHTML) { - const err = new HTMLInjectionError( - "One of your code blocks includes unescaped HTML.", - element.innerHTML - ); - throw err; - } - } - node = element; - const text = node.textContent; - const result = language ? highlight3(text, { language, ignoreIllegals: true }) : highlightAuto2(text); - element.innerHTML = result.value; - updateClassName(element, language, result.language); - element.result = { - language: result.language, - // TODO: remove with version 11.0 - re: result.relevance, - relevance: result.relevance - }; - if (result.secondBest) { - element.secondBest = { - language: result.secondBest.language, - relevance: result.secondBest.relevance - }; - } - fire2("after:highlightElement", { el: element, result, text }); - } - function configure(userOptions) { - options = inherit(options, userOptions); - } - const initHighlighting = () => { - highlightAll(); - deprecated("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); - }; - function initHighlightingOnLoad() { - highlightAll(); - deprecated("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); - } - let wantsHighlight = false; - function highlightAll() { - if (document.readyState === "loading") { - wantsHighlight = true; - return; - } - const blocks = document.querySelectorAll(options.cssSelector); - blocks.forEach(highlightElement); - } - function boot() { - if (wantsHighlight) - highlightAll(); - } - if (typeof window !== "undefined" && window.addEventListener) { - window.addEventListener("DOMContentLoaded", boot, false); - } - function registerLanguage2(languageName, languageDefinition) { - let lang = null; - try { - lang = languageDefinition(hljs); - } catch (error$1) { - error("Language definition for '{}' could not be registered.".replace("{}", languageName)); - if (!SAFE_MODE) { - throw error$1; - } else { - error(error$1); - } - lang = PLAINTEXT_LANGUAGE; - } - if (!lang.name) - lang.name = languageName; - languages[languageName] = lang; - lang.rawDefinition = languageDefinition.bind(null, hljs); - if (lang.aliases) { - registerAliases(lang.aliases, { languageName }); - } - } - function unregisterLanguage(languageName) { - delete languages[languageName]; - for (const alias of Object.keys(aliases)) { - if (aliases[alias] === languageName) { - delete aliases[alias]; - } - } - } - function listLanguages2() { - return Object.keys(languages); - } - function getLanguage(name) { - name = (name || "").toLowerCase(); - return languages[name] || languages[aliases[name]]; - } - function registerAliases(aliasList, { languageName }) { - if (typeof aliasList === "string") { - aliasList = [aliasList]; - } - aliasList.forEach((alias) => { - aliases[alias.toLowerCase()] = languageName; - }); - } - function autoDetection(name) { - const lang = getLanguage(name); - return lang && !lang.disableAutodetect; - } - function upgradePluginAPI(plugin) { - if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { - plugin["before:highlightElement"] = (data) => { - plugin["before:highlightBlock"]( - Object.assign({ block: data.el }, data) - ); - }; - } - if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { - plugin["after:highlightElement"] = (data) => { - plugin["after:highlightBlock"]( - Object.assign({ block: data.el }, data) - ); - }; - } - } - function addPlugin(plugin) { - upgradePluginAPI(plugin); - plugins.push(plugin); - } - function fire2(event, args) { - const cb = event; - plugins.forEach(function(plugin) { - if (plugin[cb]) { - plugin[cb](args); - } - }); - } - function deprecateHighlightBlock(el) { - deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0"); - deprecated("10.7.0", "Please use highlightElement now."); - return highlightElement(el); - } - Object.assign(hljs, { - highlight: highlight3, - highlightAuto: highlightAuto2, - highlightAll, - highlightElement, - // TODO: Remove with v12 API - highlightBlock: deprecateHighlightBlock, - configure, - initHighlighting, - initHighlightingOnLoad, - registerLanguage: registerLanguage2, - unregisterLanguage, - listLanguages: listLanguages2, - getLanguage, - registerAliases, - autoDetection, - inherit, - addPlugin - }); - hljs.debugMode = function() { - SAFE_MODE = false; - }; - hljs.safeMode = function() { - SAFE_MODE = true; - }; - hljs.versionString = version; - hljs.regex = { - concat, - lookahead, - either, - optional, - anyNumberOfTimes - }; - for (const key in MODES) { - if (typeof MODES[key] === "object") { - deepFreezeEs6.exports(MODES[key]); - } - } - Object.assign(hljs, MODES); - return hljs; -}; -var highlight = HLJS({}); -var core = highlight; -highlight.HighlightJS = highlight; -highlight.default = highlight; -var HighlightJS = core; -function parseNodes(nodes, className = []) { - return nodes.map((node) => { - const classes = [...className, ...node.properties ? node.properties.className : []]; - if (node.children) { - return parseNodes(node.children, classes); - } - return { - text: node.value, - classes - }; - }).flat(); -} -function getHighlightNodes(result) { - return result.value || result.children || []; -} -function registered(aliasOrLanguage) { - return Boolean(HighlightJS.getLanguage(aliasOrLanguage)); -} -function getDecorations({ doc: doc3, name, lowlight: lowlight2, defaultLanguage }) { - const decorations = []; - findChildren(doc3, (node) => node.type.name === name).forEach((block) => { - let from2 = block.pos + 1; - const language = block.node.attrs.language || defaultLanguage; - const languages = lowlight2.listLanguages(); - const nodes = language && (languages.includes(language) || registered(language)) ? getHighlightNodes(lowlight2.highlight(language, block.node.textContent)) : getHighlightNodes(lowlight2.highlightAuto(block.node.textContent)); - parseNodes(nodes).forEach((node) => { - const to = from2 + node.text.length; - if (node.classes.length) { - const decoration = Decoration.inline(from2, to, { - class: node.classes.join(" ") - }); - decorations.push(decoration); - } - from2 = to; - }); - }); - return DecorationSet.create(doc3, decorations); -} -function isFunction2(param) { - return typeof param === "function"; -} -function LowlightPlugin({ name, lowlight: lowlight2, defaultLanguage }) { - if (!["highlight", "highlightAuto", "listLanguages"].every((api) => isFunction2(lowlight2[api]))) { - throw Error("You should provide an instance of lowlight to use the code-block-lowlight extension"); - } - const lowlightPlugin = new Plugin({ - key: new PluginKey("lowlight"), - state: { - init: (_, { doc: doc3 }) => getDecorations({ - doc: doc3, - name, - lowlight: lowlight2, - defaultLanguage - }), - apply: (transaction, decorationSet, oldState, newState) => { - const oldNodeName = oldState.selection.$head.parent.type.name; - const newNodeName = newState.selection.$head.parent.type.name; - const oldNodes = findChildren(oldState.doc, (node) => node.type.name === name); - const newNodes = findChildren(newState.doc, (node) => node.type.name === name); - if (transaction.docChanged && ([oldNodeName, newNodeName].includes(name) || newNodes.length !== oldNodes.length || transaction.steps.some((step) => { - return ( - // @ts-ignore - step.from !== void 0 && step.to !== void 0 && oldNodes.some((node) => { - return ( - // @ts-ignore - node.pos >= step.from && node.pos + node.node.nodeSize <= step.to - ); - }) - ); - }))) { - return getDecorations({ - doc: transaction.doc, - name, - lowlight: lowlight2, - defaultLanguage - }); - } - return decorationSet.map(transaction.mapping, transaction.doc); - } - }, - props: { - decorations(state) { - return lowlightPlugin.getState(state); - } - } - }); - return lowlightPlugin; -} -var CodeBlockLowlight = CodeBlock.extend({ - addOptions() { - var _a; - return { - ...(_a = this.parent) === null || _a === void 0 ? void 0 : _a.call(this), - lowlight: {}, - defaultLanguage: null - }; - }, - addProseMirrorPlugins() { - var _a; - return [ - ...((_a = this.parent) === null || _a === void 0 ? void 0 : _a.call(this)) || [], - LowlightPlugin({ - name: this.name, - lowlight: this.options.lowlight, - defaultLanguage: this.options.defaultLanguage - }) - ]; - } -}); - -// resources/js/extensions/CodeBlock.js -var CustomCodeBlockLowlight = CodeBlockLowlight.extend({ - addKeyboardShortcuts() { - return { - ...this.parent?.(), - ArrowDown: () => { - const state = this.editor.state; - const { from: from2, to } = state.selection; - if (from2 > 1 && from2 === to) { - let inCodeBlock = false; - state.doc.nodesBetween(from2 - 1, to - 1, (node) => { - if (node.type.name === "codeBlock") - inCodeBlock = true; - }); - let nothingOnRight = true; - state.doc.nodesBetween(from2 + 1, to + 1, (node) => { - if (node) - nothingOnRight = false; - }); - if (inCodeBlock && nothingOnRight) { - return this.editor.commands.setHardBreak(); - } - } - return false; - } - }; - } -}); - -// resources/js/extensions/Hurdle.js -var Hurdle = Node2.create({ - name: "hurdle", - group: "block", - content: "block+", - addOptions() { - return { - colors: ["gray_light", "gray", "gray_dark", "primary", "secondary", "tertiary", "accent"], - HTMLAttributes: { - class: "filament-tiptap-hurdle" - } - }; - }, - addAttributes() { - return { - color: { - default: "gray", - parseHTML: (element) => element.getAttribute("data-color"), - renderHTML: (attributes) => { - return { - "data-color": attributes.color - }; - } - } - }; - }, - parseHTML() { - return [ - { - tag: "div", - getAttrs: (element) => element.classList.contains("filament-tiptap-hurdle") - } - ]; - }, - renderHTML({ node, HTMLAttributes }) { - return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - setHurdle: (attributes) => ({ commands: commands2 }) => { - if (!this.options.colors.includes(attributes.color)) { - return false; - } - return commands2.toggleWrap(this.name, attributes); - } - }; - } -}); - -// resources/js/extensions/CustomTextAlign.js -var CustomTextAlign = Extension.create({ - name: "textAlign", - addOptions() { - return { - types: [], - alignments: ["start", "center", "end", "justify"], - defaultAlignment: "start" - }; - }, - addGlobalAttributes() { - return [ - { - types: this.options.types, - attributes: { - textAlign: { - default: this.options.defaultAlignment, - parseHTML: (element) => element.style.textAlign || this.options.defaultAlignment, - renderHTML: (attributes) => { - if (attributes.textAlign === this.options.defaultAlignment) { - return {}; - } - return { style: `text-align: ${attributes.textAlign}` }; - } - } - } - } - ]; - }, - addCommands() { - return { - setTextAlign: (alignment) => ({ commands: commands2 }) => { - if (!this.options.alignments.includes(alignment)) { - return false; - } - return this.options.types.every((type) => commands2.updateAttributes(type, { textAlign: alignment })); - }, - unsetTextAlign: () => ({ commands: commands2 }) => { - return this.options.types.every((type) => commands2.resetAttributes(type, "textAlign")); - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Shift-l": () => this.editor.commands.setTextAlign("start"), - "Mod-Shift-e": () => this.editor.commands.setTextAlign("center"), - "Mod-Shift-r": () => this.editor.commands.setTextAlign("end"), - "Mod-Shift-j": () => this.editor.commands.setTextAlign("justify") - }; - } -}); - -// node_modules/@popperjs/core/lib/enums.js -var top = "top"; -var bottom = "bottom"; -var right = "right"; -var left = "left"; -var auto = "auto"; -var basePlacements = [top, bottom, right, left]; -var start = "start"; -var end = "end"; -var clippingParents = "clippingParents"; -var viewport = "viewport"; -var popper = "popper"; -var reference = "reference"; -var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { - return acc.concat([placement + "-" + start, placement + "-" + end]); -}, []); -var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { - return acc.concat([placement, placement + "-" + start, placement + "-" + end]); -}, []); -var beforeRead = "beforeRead"; -var read = "read"; -var afterRead = "afterRead"; -var beforeMain = "beforeMain"; -var main = "main"; -var afterMain = "afterMain"; -var beforeWrite = "beforeWrite"; -var write = "write"; -var afterWrite = "afterWrite"; -var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; - -// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js -function getNodeName(element) { - return element ? (element.nodeName || "").toLowerCase() : null; -} - -// node_modules/@popperjs/core/lib/dom-utils/getWindow.js -function getWindow(node) { - if (node == null) { - return window; - } - if (node.toString() !== "[object Window]") { - var ownerDocument = node.ownerDocument; - return ownerDocument ? ownerDocument.defaultView || window : window; - } - return node; -} - -// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js -function isElement(node) { - var OwnElement = getWindow(node).Element; - return node instanceof OwnElement || node instanceof Element; -} -function isHTMLElement(node) { - var OwnElement = getWindow(node).HTMLElement; - return node instanceof OwnElement || node instanceof HTMLElement; -} -function isShadowRoot(node) { - if (typeof ShadowRoot === "undefined") { - return false; - } - var OwnElement = getWindow(node).ShadowRoot; - return node instanceof OwnElement || node instanceof ShadowRoot; -} - -// node_modules/@popperjs/core/lib/modifiers/applyStyles.js -function applyStyles(_ref) { - var state = _ref.state; - Object.keys(state.elements).forEach(function(name) { - var style2 = state.styles[name] || {}; - var attributes = state.attributes[name] || {}; - var element = state.elements[name]; - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } - Object.assign(element.style, style2); - Object.keys(attributes).forEach(function(name2) { - var value = attributes[name2]; - if (value === false) { - element.removeAttribute(name2); - } else { - element.setAttribute(name2, value === true ? "" : value); - } - }); - }); -} -function effect(_ref2) { - var state = _ref2.state; - var initialStyles = { - popper: { - position: state.options.strategy, - left: "0", - top: "0", - margin: "0" - }, - arrow: { - position: "absolute" - }, - reference: {} - }; - Object.assign(state.elements.popper.style, initialStyles.popper); - state.styles = initialStyles; - if (state.elements.arrow) { - Object.assign(state.elements.arrow.style, initialStyles.arrow); - } - return function() { - Object.keys(state.elements).forEach(function(name) { - var element = state.elements[name]; - var attributes = state.attributes[name] || {}; - var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); - var style2 = styleProperties.reduce(function(style3, property) { - style3[property] = ""; - return style3; - }, {}); - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } - Object.assign(element.style, style2); - Object.keys(attributes).forEach(function(attribute) { - element.removeAttribute(attribute); - }); - }); - }; -} -var applyStyles_default = { - name: "applyStyles", - enabled: true, - phase: "write", - fn: applyStyles, - effect, - requires: ["computeStyles"] -}; - -// node_modules/@popperjs/core/lib/utils/getBasePlacement.js -function getBasePlacement(placement) { - return placement.split("-")[0]; -} - -// node_modules/@popperjs/core/lib/utils/math.js -var max = Math.max; -var min = Math.min; -var round = Math.round; - -// node_modules/@popperjs/core/lib/utils/userAgent.js -function getUAString() { - var uaData = navigator.userAgentData; - if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) { - return uaData.brands.map(function(item) { - return item.brand + "/" + item.version; - }).join(" "); - } - return navigator.userAgent; -} - -// node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js -function isLayoutViewport() { - return !/^((?!chrome|android).)*safari/i.test(getUAString()); -} - -// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js -function getBoundingClientRect(element, includeScale, isFixedStrategy) { - if (includeScale === void 0) { - includeScale = false; - } - if (isFixedStrategy === void 0) { - isFixedStrategy = false; - } - var clientRect2 = element.getBoundingClientRect(); - var scaleX = 1; - var scaleY = 1; - if (includeScale && isHTMLElement(element)) { - scaleX = element.offsetWidth > 0 ? round(clientRect2.width) / element.offsetWidth || 1 : 1; - scaleY = element.offsetHeight > 0 ? round(clientRect2.height) / element.offsetHeight || 1 : 1; - } - var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport; - var addVisualOffsets = !isLayoutViewport() && isFixedStrategy; - var x = (clientRect2.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX; - var y = (clientRect2.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY; - var width = clientRect2.width / scaleX; - var height = clientRect2.height / scaleY; - return { - width, - height, - top: y, - right: x + width, - bottom: y + height, - left: x, - x, - y - }; -} - -// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js -function getLayoutRect(element) { - var clientRect2 = getBoundingClientRect(element); - var width = element.offsetWidth; - var height = element.offsetHeight; - if (Math.abs(clientRect2.width - width) <= 1) { - width = clientRect2.width; - } - if (Math.abs(clientRect2.height - height) <= 1) { - height = clientRect2.height; - } - return { - x: element.offsetLeft, - y: element.offsetTop, - width, - height - }; -} - -// node_modules/@popperjs/core/lib/dom-utils/contains.js -function contains(parent, child) { - var rootNode = child.getRootNode && child.getRootNode(); - if (parent.contains(child)) { - return true; - } else if (rootNode && isShadowRoot(rootNode)) { - var next = child; - do { - if (next && parent.isSameNode(next)) { - return true; - } - next = next.parentNode || next.host; - } while (next); - } - return false; -} - -// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js -function getComputedStyle2(element) { - return getWindow(element).getComputedStyle(element); -} - -// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js -function isTableElement(element) { - return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; -} - -// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js -function getDocumentElement(element) { - return ((isElement(element) ? element.ownerDocument : ( - // $FlowFixMe[prop-missing] - element.document - )) || window.document).documentElement; -} - -// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js -function getParentNode(element) { - if (getNodeName(element) === "html") { - return element; - } - return ( - // this is a quicker (but less type safe) way to save quite some bytes from the bundle - // $FlowFixMe[incompatible-return] - // $FlowFixMe[prop-missing] - element.assignedSlot || // step into the shadow DOM of the parent of a slotted node - element.parentNode || // DOM Element detected - (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected - // $FlowFixMe[incompatible-call]: HTMLElement is a Node - getDocumentElement(element) - ); -} - -// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js -function getTrueOffsetParent(element) { - if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 - getComputedStyle2(element).position === "fixed") { - return null; - } - return element.offsetParent; -} -function getContainingBlock(element) { - var isFirefox = /firefox/i.test(getUAString()); - var isIE = /Trident/i.test(getUAString()); - if (isIE && isHTMLElement(element)) { - var elementCss = getComputedStyle2(element); - if (elementCss.position === "fixed") { - return null; - } - } - var currentNode = getParentNode(element); - if (isShadowRoot(currentNode)) { - currentNode = currentNode.host; - } - while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { - var css2 = getComputedStyle2(currentNode); - if (css2.transform !== "none" || css2.perspective !== "none" || css2.contain === "paint" || ["transform", "perspective"].indexOf(css2.willChange) !== -1 || isFirefox && css2.willChange === "filter" || isFirefox && css2.filter && css2.filter !== "none") { - return currentNode; - } else { - currentNode = currentNode.parentNode; - } - } - return null; -} -function getOffsetParent(element) { - var window2 = getWindow(element); - var offsetParent = getTrueOffsetParent(element); - while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") { - offsetParent = getTrueOffsetParent(offsetParent); - } - if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) { - return window2; - } - return offsetParent || getContainingBlock(element) || window2; -} - -// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js -function getMainAxisFromPlacement(placement) { - return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; -} - -// node_modules/@popperjs/core/lib/utils/within.js -function within(min2, value, max2) { - return max(min2, min(value, max2)); -} -function withinMaxClamp(min2, value, max2) { - var v = within(min2, value, max2); - return v > max2 ? max2 : v; -} - -// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js -function getFreshSideObject() { - return { - top: 0, - right: 0, - bottom: 0, - left: 0 - }; -} - -// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js -function mergePaddingObject(paddingObject) { - return Object.assign({}, getFreshSideObject(), paddingObject); -} - -// node_modules/@popperjs/core/lib/utils/expandToHashMap.js -function expandToHashMap(value, keys2) { - return keys2.reduce(function(hashMap, key) { - hashMap[key] = value; - return hashMap; - }, {}); -} - -// node_modules/@popperjs/core/lib/modifiers/arrow.js -var toPaddingObject = function toPaddingObject2(padding, state) { - padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { - placement: state.placement - })) : padding; - return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); -}; -function arrow3(_ref) { - var _state$modifiersData$; - var state = _ref.state, name = _ref.name, options = _ref.options; - var arrowElement = state.elements.arrow; - var popperOffsets2 = state.modifiersData.popperOffsets; - var basePlacement = getBasePlacement(state.placement); - var axis = getMainAxisFromPlacement(basePlacement); - var isVertical = [left, right].indexOf(basePlacement) >= 0; - var len = isVertical ? "height" : "width"; - if (!arrowElement || !popperOffsets2) { - return; - } - var paddingObject = toPaddingObject(options.padding, state); - var arrowRect = getLayoutRect(arrowElement); - var minProp = axis === "y" ? top : left; - var maxProp = axis === "y" ? bottom : right; - var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; - var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; - var arrowOffsetParent = getOffsetParent(arrowElement); - var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; - var centerToReference = endDiff / 2 - startDiff / 2; - var min2 = paddingObject[minProp]; - var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; - var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; - var offset2 = within(min2, center, max2); - var axisProp = axis; - state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); -} -function effect2(_ref2) { - var state = _ref2.state, options = _ref2.options; - var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; - if (arrowElement == null) { - return; - } - if (typeof arrowElement === "string") { - arrowElement = state.elements.popper.querySelector(arrowElement); - if (!arrowElement) { - return; - } - } - if (!contains(state.elements.popper, arrowElement)) { - return; - } - state.elements.arrow = arrowElement; -} -var arrow_default = { - name: "arrow", - enabled: true, - phase: "main", - fn: arrow3, - effect: effect2, - requires: ["popperOffsets"], - requiresIfExists: ["preventOverflow"] -}; - -// node_modules/@popperjs/core/lib/utils/getVariation.js -function getVariation(placement) { - return placement.split("-")[1]; -} - -// node_modules/@popperjs/core/lib/modifiers/computeStyles.js -var unsetSides = { - top: "auto", - right: "auto", - bottom: "auto", - left: "auto" -}; -function roundOffsetsByDPR(_ref, win) { - var x = _ref.x, y = _ref.y; - var dpr = win.devicePixelRatio || 1; - return { - x: round(x * dpr) / dpr || 0, - y: round(y * dpr) / dpr || 0 - }; -} -function mapToStyles(_ref2) { - var _Object$assign2; - var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; - var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; - var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ - x, - y - }) : { - x, - y - }; - x = _ref3.x; - y = _ref3.y; - var hasX = offsets.hasOwnProperty("x"); - var hasY = offsets.hasOwnProperty("y"); - var sideX = left; - var sideY = top; - var win = window; - if (adaptive) { - var offsetParent = getOffsetParent(popper2); - var heightProp = "clientHeight"; - var widthProp = "clientWidth"; - if (offsetParent === getWindow(popper2)) { - offsetParent = getDocumentElement(popper2); - if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") { - heightProp = "scrollHeight"; - widthProp = "scrollWidth"; - } - } - offsetParent = offsetParent; - if (placement === top || (placement === left || placement === right) && variation === end) { - sideY = bottom; - var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : ( - // $FlowFixMe[prop-missing] - offsetParent[heightProp] - ); - y -= offsetY - popperRect.height; - y *= gpuAcceleration ? 1 : -1; - } - if (placement === left || (placement === top || placement === bottom) && variation === end) { - sideX = right; - var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : ( - // $FlowFixMe[prop-missing] - offsetParent[widthProp] - ); - x -= offsetX - popperRect.width; - x *= gpuAcceleration ? 1 : -1; - } - } - var commonStyles = Object.assign({ - position - }, adaptive && unsetSides); - var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ - x, - y - }, getWindow(popper2)) : { - x, - y - }; - x = _ref4.x; - y = _ref4.y; - if (gpuAcceleration) { - var _Object$assign; - return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); - } - return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2)); -} -function computeStyles(_ref5) { - var state = _ref5.state, options = _ref5.options; - var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; - var commonStyles = { - placement: getBasePlacement(state.placement), - variation: getVariation(state.placement), - popper: state.elements.popper, - popperRect: state.rects.popper, - gpuAcceleration, - isFixed: state.options.strategy === "fixed" - }; - if (state.modifiersData.popperOffsets != null) { - state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.popperOffsets, - position: state.options.strategy, - adaptive, - roundOffsets - }))); - } - if (state.modifiersData.arrow != null) { - state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.arrow, - position: "absolute", - adaptive: false, - roundOffsets - }))); - } - state.attributes.popper = Object.assign({}, state.attributes.popper, { - "data-popper-placement": state.placement - }); -} -var computeStyles_default = { - name: "computeStyles", - enabled: true, - phase: "beforeWrite", - fn: computeStyles, - data: {} -}; - -// node_modules/@popperjs/core/lib/modifiers/eventListeners.js -var passive = { - passive: true -}; -function effect3(_ref) { - var state = _ref.state, instance = _ref.instance, options = _ref.options; - var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; - var window2 = getWindow(state.elements.popper); - var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); - if (scroll) { - scrollParents.forEach(function(scrollParent) { - scrollParent.addEventListener("scroll", instance.update, passive); - }); - } - if (resize) { - window2.addEventListener("resize", instance.update, passive); - } - return function() { - if (scroll) { - scrollParents.forEach(function(scrollParent) { - scrollParent.removeEventListener("scroll", instance.update, passive); - }); - } - if (resize) { - window2.removeEventListener("resize", instance.update, passive); - } - }; -} -var eventListeners_default = { - name: "eventListeners", - enabled: true, - phase: "write", - fn: function fn() { - }, - effect: effect3, - data: {} -}; - -// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js -var hash = { - left: "right", - right: "left", - bottom: "top", - top: "bottom" -}; -function getOppositePlacement(placement) { - return placement.replace(/left|right|bottom|top/g, function(matched) { - return hash[matched]; - }); -} - -// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js -var hash2 = { - start: "end", - end: "start" -}; -function getOppositeVariationPlacement(placement) { - return placement.replace(/start|end/g, function(matched) { - return hash2[matched]; - }); -} - -// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js -function getWindowScroll(node) { - var win = getWindow(node); - var scrollLeft = win.pageXOffset; - var scrollTop = win.pageYOffset; - return { - scrollLeft, - scrollTop - }; -} - -// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js -function getWindowScrollBarX(element) { - return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; -} - -// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js -function getViewportRect(element, strategy) { - var win = getWindow(element); - var html = getDocumentElement(element); - var visualViewport = win.visualViewport; - var width = html.clientWidth; - var height = html.clientHeight; - var x = 0; - var y = 0; - if (visualViewport) { - width = visualViewport.width; - height = visualViewport.height; - var layoutViewport = isLayoutViewport(); - if (layoutViewport || !layoutViewport && strategy === "fixed") { - x = visualViewport.offsetLeft; - y = visualViewport.offsetTop; - } - } - return { - width, - height, - x: x + getWindowScrollBarX(element), - y - }; -} - -// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js -function getDocumentRect(element) { - var _element$ownerDocumen; - var html = getDocumentElement(element); - var winScroll = getWindowScroll(element); - var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; - var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); - var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); - var x = -winScroll.scrollLeft + getWindowScrollBarX(element); - var y = -winScroll.scrollTop; - if (getComputedStyle2(body || html).direction === "rtl") { - x += max(html.clientWidth, body ? body.clientWidth : 0) - width; - } - return { - width, - height, - x, - y - }; -} - -// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js -function isScrollParent(element) { - var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; - return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); -} - -// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js -function getScrollParent(node) { - if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { - return node.ownerDocument.body; - } - if (isHTMLElement(node) && isScrollParent(node)) { - return node; - } - return getScrollParent(getParentNode(node)); -} - -// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js -function listScrollParents(element, list) { - var _element$ownerDocumen; - if (list === void 0) { - list = []; - } - var scrollParent = getScrollParent(element); - var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); - var win = getWindow(scrollParent); - var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; - var updatedList = list.concat(target); - return isBody ? updatedList : ( - // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here - updatedList.concat(listScrollParents(getParentNode(target))) - ); -} - -// node_modules/@popperjs/core/lib/utils/rectToClientRect.js -function rectToClientRect(rect) { - return Object.assign({}, rect, { - left: rect.x, - top: rect.y, - right: rect.x + rect.width, - bottom: rect.y + rect.height - }); -} - -// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js -function getInnerBoundingClientRect(element, strategy) { - var rect = getBoundingClientRect(element, false, strategy === "fixed"); - rect.top = rect.top + element.clientTop; - rect.left = rect.left + element.clientLeft; - rect.bottom = rect.top + element.clientHeight; - rect.right = rect.left + element.clientWidth; - rect.width = element.clientWidth; - rect.height = element.clientHeight; - rect.x = rect.left; - rect.y = rect.top; - return rect; -} -function getClientRectFromMixedType(element, clippingParent, strategy) { - return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element))); -} -function getClippingParents(element) { - var clippingParents2 = listScrollParents(getParentNode(element)); - var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0; - var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; - if (!isElement(clipperElement)) { - return []; - } - return clippingParents2.filter(function(clippingParent) { - return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; - }); -} -function getClippingRect(element, boundary, rootBoundary, strategy) { - var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); - var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); - var firstClippingParent = clippingParents2[0]; - var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { - var rect = getClientRectFromMixedType(element, clippingParent, strategy); - accRect.top = max(rect.top, accRect.top); - accRect.right = min(rect.right, accRect.right); - accRect.bottom = min(rect.bottom, accRect.bottom); - accRect.left = max(rect.left, accRect.left); - return accRect; - }, getClientRectFromMixedType(element, firstClippingParent, strategy)); - clippingRect.width = clippingRect.right - clippingRect.left; - clippingRect.height = clippingRect.bottom - clippingRect.top; - clippingRect.x = clippingRect.left; - clippingRect.y = clippingRect.top; - return clippingRect; -} - -// node_modules/@popperjs/core/lib/utils/computeOffsets.js -function computeOffsets(_ref) { - var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; - var basePlacement = placement ? getBasePlacement(placement) : null; - var variation = placement ? getVariation(placement) : null; - var commonX = reference2.x + reference2.width / 2 - element.width / 2; - var commonY = reference2.y + reference2.height / 2 - element.height / 2; - var offsets; - switch (basePlacement) { - case top: - offsets = { - x: commonX, - y: reference2.y - element.height - }; - break; - case bottom: - offsets = { - x: commonX, - y: reference2.y + reference2.height - }; - break; - case right: - offsets = { - x: reference2.x + reference2.width, - y: commonY - }; - break; - case left: - offsets = { - x: reference2.x - element.width, - y: commonY - }; - break; - default: - offsets = { - x: reference2.x, - y: reference2.y - }; - } - var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; - if (mainAxis != null) { - var len = mainAxis === "y" ? "height" : "width"; - switch (variation) { - case start: - offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); - break; - case end: - offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); - break; - default: - } - } - return offsets; -} - -// node_modules/@popperjs/core/lib/utils/detectOverflow.js -function detectOverflow(state, options) { - if (options === void 0) { - options = {}; - } - var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; - var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); - var altContext = elementContext === popper ? reference : popper; - var popperRect = state.rects.popper; - var element = state.elements[altBoundary ? altContext : elementContext]; - var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy); - var referenceClientRect = getBoundingClientRect(state.elements.reference); - var popperOffsets2 = computeOffsets({ - reference: referenceClientRect, - element: popperRect, - strategy: "absolute", - placement - }); - var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); - var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; - var overflowOffsets = { - top: clippingClientRect.top - elementClientRect.top + paddingObject.top, - bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, - left: clippingClientRect.left - elementClientRect.left + paddingObject.left, - right: elementClientRect.right - clippingClientRect.right + paddingObject.right - }; - var offsetData = state.modifiersData.offset; - if (elementContext === popper && offsetData) { - var offset2 = offsetData[placement]; - Object.keys(overflowOffsets).forEach(function(key) { - var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; - var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; - overflowOffsets[key] += offset2[axis] * multiply; - }); - } - return overflowOffsets; -} - -// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js -function computeAutoPlacement(state, options) { - if (options === void 0) { - options = {}; - } - var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; - var variation = getVariation(placement); - var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { - return getVariation(placement2) === variation; - }) : basePlacements; - var allowedPlacements = placements2.filter(function(placement2) { - return allowedAutoPlacements.indexOf(placement2) >= 0; - }); - if (allowedPlacements.length === 0) { - allowedPlacements = placements2; - } - var overflows = allowedPlacements.reduce(function(acc, placement2) { - acc[placement2] = detectOverflow(state, { - placement: placement2, - boundary, - rootBoundary, - padding - })[getBasePlacement(placement2)]; - return acc; - }, {}); - return Object.keys(overflows).sort(function(a, b) { - return overflows[a] - overflows[b]; - }); -} - -// node_modules/@popperjs/core/lib/modifiers/flip.js -function getExpandedFallbackPlacements(placement) { - if (getBasePlacement(placement) === auto) { - return []; - } - var oppositePlacement = getOppositePlacement(placement); - return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; -} -function flip(_ref) { - var state = _ref.state, options = _ref.options, name = _ref.name; - if (state.modifiersData[name]._skip) { - return; - } - var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; - var preferredPlacement = state.options.placement; - var basePlacement = getBasePlacement(preferredPlacement); - var isBasePlacement = basePlacement === preferredPlacement; - var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); - var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { - return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { - placement: placement2, - boundary, - rootBoundary, - padding, - flipVariations, - allowedAutoPlacements - }) : placement2); - }, []); - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var checksMap = /* @__PURE__ */ new Map(); - var makeFallbackChecks = true; - var firstFittingPlacement = placements2[0]; - for (var i = 0; i < placements2.length; i++) { - var placement = placements2[i]; - var _basePlacement = getBasePlacement(placement); - var isStartVariation = getVariation(placement) === start; - var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; - var len = isVertical ? "width" : "height"; - var overflow = detectOverflow(state, { - placement, - boundary, - rootBoundary, - altBoundary, - padding - }); - var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; - if (referenceRect[len] > popperRect[len]) { - mainVariationSide = getOppositePlacement(mainVariationSide); - } - var altVariationSide = getOppositePlacement(mainVariationSide); - var checks = []; - if (checkMainAxis) { - checks.push(overflow[_basePlacement] <= 0); - } - if (checkAltAxis) { - checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); - } - if (checks.every(function(check) { - return check; - })) { - firstFittingPlacement = placement; - makeFallbackChecks = false; - break; - } - checksMap.set(placement, checks); - } - if (makeFallbackChecks) { - var numberOfChecks = flipVariations ? 3 : 1; - var _loop = function _loop2(_i2) { - var fittingPlacement = placements2.find(function(placement2) { - var checks2 = checksMap.get(placement2); - if (checks2) { - return checks2.slice(0, _i2).every(function(check) { - return check; - }); - } - }); - if (fittingPlacement) { - firstFittingPlacement = fittingPlacement; - return "break"; - } - }; - for (var _i = numberOfChecks; _i > 0; _i--) { - var _ret = _loop(_i); - if (_ret === "break") - break; - } - } - if (state.placement !== firstFittingPlacement) { - state.modifiersData[name]._skip = true; - state.placement = firstFittingPlacement; - state.reset = true; - } -} -var flip_default = { - name: "flip", - enabled: true, - phase: "main", - fn: flip, - requiresIfExists: ["offset"], - data: { - _skip: false - } -}; - -// node_modules/@popperjs/core/lib/modifiers/hide.js -function getSideOffsets(overflow, rect, preventedOffsets) { - if (preventedOffsets === void 0) { - preventedOffsets = { - x: 0, - y: 0 - }; - } - return { - top: overflow.top - rect.height - preventedOffsets.y, - right: overflow.right - rect.width + preventedOffsets.x, - bottom: overflow.bottom - rect.height + preventedOffsets.y, - left: overflow.left - rect.width - preventedOffsets.x - }; -} -function isAnySideFullyClipped(overflow) { - return [top, right, bottom, left].some(function(side) { - return overflow[side] >= 0; - }); -} -function hide(_ref) { - var state = _ref.state, name = _ref.name; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var preventedOffsets = state.modifiersData.preventOverflow; - var referenceOverflow = detectOverflow(state, { - elementContext: "reference" - }); - var popperAltOverflow = detectOverflow(state, { - altBoundary: true - }); - var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); - var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); - var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); - var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); - state.modifiersData[name] = { - referenceClippingOffsets, - popperEscapeOffsets, - isReferenceHidden, - hasPopperEscaped - }; - state.attributes.popper = Object.assign({}, state.attributes.popper, { - "data-popper-reference-hidden": isReferenceHidden, - "data-popper-escaped": hasPopperEscaped - }); -} -var hide_default = { - name: "hide", - enabled: true, - phase: "main", - requiresIfExists: ["preventOverflow"], - fn: hide -}; - -// node_modules/@popperjs/core/lib/modifiers/offset.js -function distanceAndSkiddingToXY(placement, rects, offset2) { - var basePlacement = getBasePlacement(placement); - var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; - var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { - placement - })) : offset2, skidding = _ref[0], distance = _ref[1]; - skidding = skidding || 0; - distance = (distance || 0) * invertDistance; - return [left, right].indexOf(basePlacement) >= 0 ? { - x: distance, - y: skidding - } : { - x: skidding, - y: distance - }; -} -function offset(_ref2) { - var state = _ref2.state, options = _ref2.options, name = _ref2.name; - var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; - var data = placements.reduce(function(acc, placement) { - acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); - return acc; - }, {}); - var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; - if (state.modifiersData.popperOffsets != null) { - state.modifiersData.popperOffsets.x += x; - state.modifiersData.popperOffsets.y += y; - } - state.modifiersData[name] = data; -} -var offset_default = { - name: "offset", - enabled: true, - phase: "main", - requires: ["popperOffsets"], - fn: offset -}; - -// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js -function popperOffsets(_ref) { - var state = _ref.state, name = _ref.name; - state.modifiersData[name] = computeOffsets({ - reference: state.rects.reference, - element: state.rects.popper, - strategy: "absolute", - placement: state.placement - }); -} -var popperOffsets_default = { - name: "popperOffsets", - enabled: true, - phase: "read", - fn: popperOffsets, - data: {} -}; - -// node_modules/@popperjs/core/lib/utils/getAltAxis.js -function getAltAxis(axis) { - return axis === "x" ? "y" : "x"; -} - -// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js -function preventOverflow(_ref) { - var state = _ref.state, options = _ref.options, name = _ref.name; - var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; - var overflow = detectOverflow(state, { - boundary, - rootBoundary, - padding, - altBoundary - }); - var basePlacement = getBasePlacement(state.placement); - var variation = getVariation(state.placement); - var isBasePlacement = !variation; - var mainAxis = getMainAxisFromPlacement(basePlacement); - var altAxis = getAltAxis(mainAxis); - var popperOffsets2 = state.modifiersData.popperOffsets; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { - placement: state.placement - })) : tetherOffset; - var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { - mainAxis: tetherOffsetValue, - altAxis: tetherOffsetValue - } : Object.assign({ - mainAxis: 0, - altAxis: 0 - }, tetherOffsetValue); - var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; - var data = { - x: 0, - y: 0 - }; - if (!popperOffsets2) { - return; - } - if (checkMainAxis) { - var _offsetModifierState$; - var mainSide = mainAxis === "y" ? top : left; - var altSide = mainAxis === "y" ? bottom : right; - var len = mainAxis === "y" ? "height" : "width"; - var offset2 = popperOffsets2[mainAxis]; - var min2 = offset2 + overflow[mainSide]; - var max2 = offset2 - overflow[altSide]; - var additive = tether ? -popperRect[len] / 2 : 0; - var minLen = variation === start ? referenceRect[len] : popperRect[len]; - var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; - var arrowElement = state.elements.arrow; - var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { - width: 0, - height: 0 - }; - var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); - var arrowPaddingMin = arrowPaddingObject[mainSide]; - var arrowPaddingMax = arrowPaddingObject[altSide]; - var arrowLen = within(0, referenceRect[len], arrowRect[len]); - var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; - var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; - var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); - var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; - var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; - var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; - var tetherMax = offset2 + maxOffset - offsetModifierValue; - var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2); - popperOffsets2[mainAxis] = preventedOffset; - data[mainAxis] = preventedOffset - offset2; - } - if (checkAltAxis) { - var _offsetModifierState$2; - var _mainSide = mainAxis === "x" ? top : left; - var _altSide = mainAxis === "x" ? bottom : right; - var _offset = popperOffsets2[altAxis]; - var _len = altAxis === "y" ? "height" : "width"; - var _min = _offset + overflow[_mainSide]; - var _max = _offset - overflow[_altSide]; - var isOriginSide = [top, left].indexOf(basePlacement) !== -1; - var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; - var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; - var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; - var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); - popperOffsets2[altAxis] = _preventedOffset; - data[altAxis] = _preventedOffset - _offset; - } - state.modifiersData[name] = data; -} -var preventOverflow_default = { - name: "preventOverflow", - enabled: true, - phase: "main", - fn: preventOverflow, - requiresIfExists: ["offset"] -}; - -// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js -function getHTMLElementScroll(element) { - return { - scrollLeft: element.scrollLeft, - scrollTop: element.scrollTop - }; -} - -// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js -function getNodeScroll(node) { - if (node === getWindow(node) || !isHTMLElement(node)) { - return getWindowScroll(node); - } else { - return getHTMLElementScroll(node); - } -} - -// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js -function isElementScaled(element) { - var rect = element.getBoundingClientRect(); - var scaleX = round(rect.width) / element.offsetWidth || 1; - var scaleY = round(rect.height) / element.offsetHeight || 1; - return scaleX !== 1 || scaleY !== 1; -} -function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { - if (isFixed === void 0) { - isFixed = false; - } - var isOffsetParentAnElement = isHTMLElement(offsetParent); - var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); - var documentElement = getDocumentElement(offsetParent); - var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed); - var scroll = { - scrollLeft: 0, - scrollTop: 0 - }; - var offsets = { - x: 0, - y: 0 - }; - if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { - if (getNodeName(offsetParent) !== "body" || // https://github.com/popperjs/popper-core/issues/1078 - isScrollParent(documentElement)) { - scroll = getNodeScroll(offsetParent); - } - if (isHTMLElement(offsetParent)) { - offsets = getBoundingClientRect(offsetParent, true); - offsets.x += offsetParent.clientLeft; - offsets.y += offsetParent.clientTop; - } else if (documentElement) { - offsets.x = getWindowScrollBarX(documentElement); - } - } - return { - x: rect.left + scroll.scrollLeft - offsets.x, - y: rect.top + scroll.scrollTop - offsets.y, - width: rect.width, - height: rect.height - }; -} - -// node_modules/@popperjs/core/lib/utils/orderModifiers.js -function order(modifiers2) { - var map2 = /* @__PURE__ */ new Map(); - var visited = /* @__PURE__ */ new Set(); - var result = []; - modifiers2.forEach(function(modifier) { - map2.set(modifier.name, modifier); - }); - function sort(modifier) { - visited.add(modifier.name); - var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); - requires.forEach(function(dep) { - if (!visited.has(dep)) { - var depModifier = map2.get(dep); - if (depModifier) { - sort(depModifier); - } - } - }); - result.push(modifier); - } - modifiers2.forEach(function(modifier) { - if (!visited.has(modifier.name)) { - sort(modifier); - } - }); - return result; -} -function orderModifiers(modifiers2) { - var orderedModifiers = order(modifiers2); - return modifierPhases.reduce(function(acc, phase) { - return acc.concat(orderedModifiers.filter(function(modifier) { - return modifier.phase === phase; - })); - }, []); -} - -// node_modules/@popperjs/core/lib/utils/debounce.js -function debounce(fn2) { - var pending; - return function() { - if (!pending) { - pending = new Promise(function(resolve) { - Promise.resolve().then(function() { - pending = void 0; - resolve(fn2()); - }); - }); - } - return pending; - }; -} - -// node_modules/@popperjs/core/lib/utils/mergeByName.js -function mergeByName(modifiers2) { - var merged = modifiers2.reduce(function(merged2, current) { - var existing = merged2[current.name]; - merged2[current.name] = existing ? Object.assign({}, existing, current, { - options: Object.assign({}, existing.options, current.options), - data: Object.assign({}, existing.data, current.data) - }) : current; - return merged2; - }, {}); - return Object.keys(merged).map(function(key) { - return merged[key]; - }); -} - -// node_modules/@popperjs/core/lib/createPopper.js -var DEFAULT_OPTIONS = { - placement: "bottom", - modifiers: [], - strategy: "absolute" -}; -function areValidElements() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return !args.some(function(element) { - return !(element && typeof element.getBoundingClientRect === "function"); - }); -} -function popperGenerator(generatorOptions) { - if (generatorOptions === void 0) { - generatorOptions = {}; - } - var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; - return function createPopper2(reference2, popper2, options) { - if (options === void 0) { - options = defaultOptions; - } - var state = { - placement: "bottom", - orderedModifiers: [], - options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), - modifiersData: {}, - elements: { - reference: reference2, - popper: popper2 - }, - attributes: {}, - styles: {} - }; - var effectCleanupFns = []; - var isDestroyed = false; - var instance = { - state, - setOptions: function setOptions(setOptionsAction) { - var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; - cleanupModifierEffects(); - state.options = Object.assign({}, defaultOptions, state.options, options2); - state.scrollParents = { - reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], - popper: listScrollParents(popper2) - }; - var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); - state.orderedModifiers = orderedModifiers.filter(function(m) { - return m.enabled; - }); - runModifierEffects(); - return instance.update(); - }, - // Sync update – it will always be executed, even if not necessary. This - // is useful for low frequency updates where sync behavior simplifies the - // logic. - // For high frequency updates (e.g. `resize` and `scroll` events), always - // prefer the async Popper#update method - forceUpdate: function forceUpdate() { - if (isDestroyed) { - return; - } - var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; - if (!areValidElements(reference3, popper3)) { - return; - } - state.rects = { - reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), - popper: getLayoutRect(popper3) - }; - state.reset = false; - state.placement = state.options.placement; - state.orderedModifiers.forEach(function(modifier) { - return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); - }); - for (var index = 0; index < state.orderedModifiers.length; index++) { - if (state.reset === true) { - state.reset = false; - index = -1; - continue; - } - var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; - if (typeof fn2 === "function") { - state = fn2({ - state, - options: _options, - name, - instance - }) || state; - } - } - }, - // Async and optimistically optimized update – it will not be executed if - // not necessary (debounced to run at most once-per-tick) - update: debounce(function() { - return new Promise(function(resolve) { - instance.forceUpdate(); - resolve(state); - }); - }), - destroy: function destroy() { - cleanupModifierEffects(); - isDestroyed = true; - } - }; - if (!areValidElements(reference2, popper2)) { - return instance; - } - instance.setOptions(options).then(function(state2) { - if (!isDestroyed && options.onFirstUpdate) { - options.onFirstUpdate(state2); - } - }); - function runModifierEffects() { - state.orderedModifiers.forEach(function(_ref) { - var name = _ref.name, _ref$options = _ref.options, options2 = _ref$options === void 0 ? {} : _ref$options, effect5 = _ref.effect; - if (typeof effect5 === "function") { - var cleanupFn = effect5({ - state, - name, - instance, - options: options2 - }); - var noopFn = function noopFn2() { - }; - effectCleanupFns.push(cleanupFn || noopFn); - } - }); - } - function cleanupModifierEffects() { - effectCleanupFns.forEach(function(fn2) { - return fn2(); - }); - effectCleanupFns = []; - } - return instance; - }; -} - -// node_modules/@popperjs/core/lib/popper.js -var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default]; -var createPopper = /* @__PURE__ */ popperGenerator({ - defaultModifiers -}); - -// node_modules/tippy.js/dist/tippy.esm.js -var BOX_CLASS = "tippy-box"; -var CONTENT_CLASS = "tippy-content"; -var BACKDROP_CLASS = "tippy-backdrop"; -var ARROW_CLASS = "tippy-arrow"; -var SVG_ARROW_CLASS = "tippy-svg-arrow"; -var TOUCH_OPTIONS = { - passive: true, - capture: true -}; -var TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO2() { - return document.body; -}; -function hasOwnProperty(obj, key) { - return {}.hasOwnProperty.call(obj, key); -} -function getValueAtIndexOrReturn(value, index, defaultValue) { - if (Array.isArray(value)) { - var v = value[index]; - return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v; - } - return value; -} -function isType(value, type) { - var str = {}.toString.call(value); - return str.indexOf("[object") === 0 && str.indexOf(type + "]") > -1; -} -function invokeWithArgsOrReturn(value, args) { - return typeof value === "function" ? value.apply(void 0, args) : value; -} -function debounce2(fn2, ms) { - if (ms === 0) { - return fn2; - } - var timeout; - return function(arg) { - clearTimeout(timeout); - timeout = setTimeout(function() { - fn2(arg); - }, ms); - }; -} -function removeProperties(obj, keys2) { - var clone = Object.assign({}, obj); - keys2.forEach(function(key) { - delete clone[key]; - }); - return clone; -} -function splitBySpaces(value) { - return value.split(/\s+/).filter(Boolean); -} -function normalizeToArray(value) { - return [].concat(value); -} -function pushIfUnique(arr, value) { - if (arr.indexOf(value) === -1) { - arr.push(value); - } -} -function unique(arr) { - return arr.filter(function(item, index) { - return arr.indexOf(item) === index; - }); -} -function getBasePlacement2(placement) { - return placement.split("-")[0]; -} -function arrayFrom(value) { - return [].slice.call(value); -} -function removeUndefinedProps(obj) { - return Object.keys(obj).reduce(function(acc, key) { - if (obj[key] !== void 0) { - acc[key] = obj[key]; - } - return acc; - }, {}); -} -function div() { - return document.createElement("div"); -} -function isElement2(value) { - return ["Element", "Fragment"].some(function(type) { - return isType(value, type); - }); -} -function isNodeList(value) { - return isType(value, "NodeList"); -} -function isMouseEvent(value) { - return isType(value, "MouseEvent"); -} -function isReferenceElement(value) { - return !!(value && value._tippy && value._tippy.reference === value); -} -function getArrayOfElements(value) { - if (isElement2(value)) { - return [value]; - } - if (isNodeList(value)) { - return arrayFrom(value); - } - if (Array.isArray(value)) { - return value; - } - return arrayFrom(document.querySelectorAll(value)); -} -function setTransitionDuration(els, value) { - els.forEach(function(el) { - if (el) { - el.style.transitionDuration = value + "ms"; - } - }); -} -function setVisibilityState(els, state) { - els.forEach(function(el) { - if (el) { - el.setAttribute("data-state", state); - } - }); -} -function getOwnerDocument(elementOrElements) { - var _element$ownerDocumen; - var _normalizeToArray = normalizeToArray(elementOrElements), element = _normalizeToArray[0]; - return element != null && (_element$ownerDocumen = element.ownerDocument) != null && _element$ownerDocumen.body ? element.ownerDocument : document; -} -function isCursorOutsideInteractiveBorder(popperTreeData, event) { - var clientX = event.clientX, clientY = event.clientY; - return popperTreeData.every(function(_ref) { - var popperRect = _ref.popperRect, popperState = _ref.popperState, props = _ref.props; - var interactiveBorder = props.interactiveBorder; - var basePlacement = getBasePlacement2(popperState.placement); - var offsetData = popperState.modifiersData.offset; - if (!offsetData) { - return true; - } - var topDistance = basePlacement === "bottom" ? offsetData.top.y : 0; - var bottomDistance = basePlacement === "top" ? offsetData.bottom.y : 0; - var leftDistance = basePlacement === "right" ? offsetData.left.x : 0; - var rightDistance = basePlacement === "left" ? offsetData.right.x : 0; - var exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder; - var exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder; - var exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder; - var exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder; - return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight; - }); -} -function updateTransitionEndListener(box, action, listener) { - var method = action + "EventListener"; - ["transitionend", "webkitTransitionEnd"].forEach(function(event) { - box[method](event, listener); - }); -} -function actualContains(parent, child) { - var target = child; - while (target) { - var _target$getRootNode; - if (parent.contains(target)) { - return true; - } - target = target.getRootNode == null ? void 0 : (_target$getRootNode = target.getRootNode()) == null ? void 0 : _target$getRootNode.host; - } - return false; -} -var currentInput = { - isTouch: false -}; -var lastMouseMoveTime = 0; -function onDocumentTouchStart() { - if (currentInput.isTouch) { - return; - } - currentInput.isTouch = true; - if (window.performance) { - document.addEventListener("mousemove", onDocumentMouseMove); - } -} -function onDocumentMouseMove() { - var now = performance.now(); - if (now - lastMouseMoveTime < 20) { - currentInput.isTouch = false; - document.removeEventListener("mousemove", onDocumentMouseMove); - } - lastMouseMoveTime = now; -} -function onWindowBlur() { - var activeElement = document.activeElement; - if (isReferenceElement(activeElement)) { - var instance = activeElement._tippy; - if (activeElement.blur && !instance.state.isVisible) { - activeElement.blur(); - } - } -} -function bindGlobalEventListeners() { - document.addEventListener("touchstart", onDocumentTouchStart, TOUCH_OPTIONS); - window.addEventListener("blur", onWindowBlur); -} -var isBrowser = typeof window !== "undefined" && typeof document !== "undefined"; -var isIE11 = isBrowser ? ( - // @ts-ignore - !!window.msCrypto -) : false; -function createMemoryLeakWarning(method) { - var txt = method === "destroy" ? "n already-" : " "; - return [method + "() was called on a" + txt + "destroyed instance. This is a no-op but", "indicates a potential memory leak."].join(" "); -} -function clean(value) { - var spacesAndTabs = /[ \t]{2,}/g; - var lineStartWithSpaces = /^[ \t]*/gm; - return value.replace(spacesAndTabs, " ").replace(lineStartWithSpaces, "").trim(); -} -function getDevMessage(message) { - return clean("\n %ctippy.js\n\n %c" + clean(message) + "\n\n %c\u{1F477}\u200D This is a development-only message. It will be removed in production.\n "); -} -function getFormattedMessage(message) { - return [ - getDevMessage(message), - // title - "color: #00C584; font-size: 1.3em; font-weight: bold;", - // message - "line-height: 1.5", - // footer - "color: #a6a095;" - ]; -} -var visitedMessages; -if (true) { - resetVisitedMessages(); -} -function resetVisitedMessages() { - visitedMessages = /* @__PURE__ */ new Set(); -} -function warnWhen(condition, message) { - if (condition && !visitedMessages.has(message)) { - var _console; - visitedMessages.add(message); - (_console = console).warn.apply(_console, getFormattedMessage(message)); - } -} -function errorWhen(condition, message) { - if (condition && !visitedMessages.has(message)) { - var _console2; - visitedMessages.add(message); - (_console2 = console).error.apply(_console2, getFormattedMessage(message)); - } -} -function validateTargets(targets) { - var didPassFalsyValue = !targets; - var didPassPlainObject = Object.prototype.toString.call(targets) === "[object Object]" && !targets.addEventListener; - errorWhen(didPassFalsyValue, ["tippy() was passed", "`" + String(targets) + "`", "as its targets (first) argument. Valid types are: String, Element,", "Element[], or NodeList."].join(" ")); - errorWhen(didPassPlainObject, ["tippy() was passed a plain object which is not supported as an argument", "for virtual positioning. Use props.getReferenceClientRect instead."].join(" ")); -} -var pluginProps = { - animateFill: false, - followCursor: false, - inlinePositioning: false, - sticky: false -}; -var renderProps = { - allowHTML: false, - animation: "fade", - arrow: true, - content: "", - inertia: false, - maxWidth: 350, - role: "tooltip", - theme: "", - zIndex: 9999 -}; -var defaultProps = Object.assign({ - appendTo: TIPPY_DEFAULT_APPEND_TO, - aria: { - content: "auto", - expanded: "auto" - }, - delay: 0, - duration: [300, 250], - getReferenceClientRect: null, - hideOnClick: true, - ignoreAttributes: false, - interactive: false, - interactiveBorder: 2, - interactiveDebounce: 0, - moveTransition: "", - offset: [0, 10], - onAfterUpdate: function onAfterUpdate() { - }, - onBeforeUpdate: function onBeforeUpdate() { - }, - onCreate: function onCreate() { - }, - onDestroy: function onDestroy() { - }, - onHidden: function onHidden() { - }, - onHide: function onHide() { - }, - onMount: function onMount() { - }, - onShow: function onShow() { - }, - onShown: function onShown() { - }, - onTrigger: function onTrigger() { - }, - onUntrigger: function onUntrigger() { - }, - onClickOutside: function onClickOutside() { - }, - placement: "top", - plugins: [], - popperOptions: {}, - render: null, - showOnCreate: false, - touch: true, - trigger: "mouseenter focus", - triggerTarget: null -}, pluginProps, renderProps); -var defaultKeys = Object.keys(defaultProps); -var setDefaultProps = function setDefaultProps2(partialProps) { - if (true) { - validateProps(partialProps, []); - } - var keys2 = Object.keys(partialProps); - keys2.forEach(function(key) { - defaultProps[key] = partialProps[key]; - }); -}; -function getExtendedPassedProps(passedProps) { - var plugins = passedProps.plugins || []; - var pluginProps2 = plugins.reduce(function(acc, plugin) { - var name = plugin.name, defaultValue = plugin.defaultValue; - if (name) { - var _name; - acc[name] = passedProps[name] !== void 0 ? passedProps[name] : (_name = defaultProps[name]) != null ? _name : defaultValue; - } - return acc; - }, {}); - return Object.assign({}, passedProps, pluginProps2); -} -function getDataAttributeProps(reference2, plugins) { - var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, { - plugins - }))) : defaultKeys; - var props = propKeys.reduce(function(acc, key) { - var valueAsString = (reference2.getAttribute("data-tippy-" + key) || "").trim(); - if (!valueAsString) { - return acc; - } - if (key === "content") { - acc[key] = valueAsString; - } else { - try { - acc[key] = JSON.parse(valueAsString); - } catch (e) { - acc[key] = valueAsString; - } - } - return acc; - }, {}); - return props; -} -function evaluateProps(reference2, props) { - var out = Object.assign({}, props, { - content: invokeWithArgsOrReturn(props.content, [reference2]) - }, props.ignoreAttributes ? {} : getDataAttributeProps(reference2, props.plugins)); - out.aria = Object.assign({}, defaultProps.aria, out.aria); - out.aria = { - expanded: out.aria.expanded === "auto" ? props.interactive : out.aria.expanded, - content: out.aria.content === "auto" ? props.interactive ? null : "describedby" : out.aria.content - }; - return out; -} -function validateProps(partialProps, plugins) { - if (partialProps === void 0) { - partialProps = {}; - } - if (plugins === void 0) { - plugins = []; - } - var keys2 = Object.keys(partialProps); - keys2.forEach(function(prop) { - var nonPluginProps = removeProperties(defaultProps, Object.keys(pluginProps)); - var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop); - if (didPassUnknownProp) { - didPassUnknownProp = plugins.filter(function(plugin) { - return plugin.name === prop; - }).length === 0; - } - warnWhen(didPassUnknownProp, ["`" + prop + "`", "is not a valid prop. You may have spelled it incorrectly, or if it's", "a plugin, forgot to pass it in an array as props.plugins.", "\n\n", "All props: https://atomiks.github.io/tippyjs/v6/all-props/\n", "Plugins: https://atomiks.github.io/tippyjs/v6/plugins/"].join(" ")); - }); -} -var innerHTML = function innerHTML2() { - return "innerHTML"; -}; -function dangerouslySetInnerHTML(element, html) { - element[innerHTML()] = html; -} -function createArrowElement(value) { - var arrow4 = div(); - if (value === true) { - arrow4.className = ARROW_CLASS; - } else { - arrow4.className = SVG_ARROW_CLASS; - if (isElement2(value)) { - arrow4.appendChild(value); - } else { - dangerouslySetInnerHTML(arrow4, value); - } - } - return arrow4; -} -function setContent2(content, props) { - if (isElement2(props.content)) { - dangerouslySetInnerHTML(content, ""); - content.appendChild(props.content); - } else if (typeof props.content !== "function") { - if (props.allowHTML) { - dangerouslySetInnerHTML(content, props.content); - } else { - content.textContent = props.content; - } - } -} -function getChildren(popper2) { - var box = popper2.firstElementChild; - var boxChildren = arrayFrom(box.children); - return { - box, - content: boxChildren.find(function(node) { - return node.classList.contains(CONTENT_CLASS); - }), - arrow: boxChildren.find(function(node) { - return node.classList.contains(ARROW_CLASS) || node.classList.contains(SVG_ARROW_CLASS); - }), - backdrop: boxChildren.find(function(node) { - return node.classList.contains(BACKDROP_CLASS); - }) - }; -} -function render(instance) { - var popper2 = div(); - var box = div(); - box.className = BOX_CLASS; - box.setAttribute("data-state", "hidden"); - box.setAttribute("tabindex", "-1"); - var content = div(); - content.className = CONTENT_CLASS; - content.setAttribute("data-state", "hidden"); - setContent2(content, instance.props); - popper2.appendChild(box); - box.appendChild(content); - onUpdate(instance.props, instance.props); - function onUpdate(prevProps, nextProps) { - var _getChildren = getChildren(popper2), box2 = _getChildren.box, content2 = _getChildren.content, arrow4 = _getChildren.arrow; - if (nextProps.theme) { - box2.setAttribute("data-theme", nextProps.theme); - } else { - box2.removeAttribute("data-theme"); - } - if (typeof nextProps.animation === "string") { - box2.setAttribute("data-animation", nextProps.animation); - } else { - box2.removeAttribute("data-animation"); - } - if (nextProps.inertia) { - box2.setAttribute("data-inertia", ""); - } else { - box2.removeAttribute("data-inertia"); - } - box2.style.maxWidth = typeof nextProps.maxWidth === "number" ? nextProps.maxWidth + "px" : nextProps.maxWidth; - if (nextProps.role) { - box2.setAttribute("role", nextProps.role); - } else { - box2.removeAttribute("role"); - } - if (prevProps.content !== nextProps.content || prevProps.allowHTML !== nextProps.allowHTML) { - setContent2(content2, instance.props); - } - if (nextProps.arrow) { - if (!arrow4) { - box2.appendChild(createArrowElement(nextProps.arrow)); - } else if (prevProps.arrow !== nextProps.arrow) { - box2.removeChild(arrow4); - box2.appendChild(createArrowElement(nextProps.arrow)); - } - } else if (arrow4) { - box2.removeChild(arrow4); - } - } - return { - popper: popper2, - onUpdate - }; -} -render.$$tippy = true; -var idCounter = 1; -var mouseMoveListeners = []; -var mountedInstances = []; -function createTippy(reference2, passedProps) { - var props = evaluateProps(reference2, Object.assign({}, defaultProps, getExtendedPassedProps(removeUndefinedProps(passedProps)))); - var showTimeout; - var hideTimeout; - var scheduleHideAnimationFrame; - var isVisibleFromClick = false; - var didHideDueToDocumentMouseDown = false; - var didTouchMove = false; - var ignoreOnFirstUpdate = false; - var lastTriggerEvent; - var currentTransitionEndListener; - var onFirstUpdate; - var listeners = []; - var debouncedOnMouseMove = debounce2(onMouseMove, props.interactiveDebounce); - var currentTarget; - var id = idCounter++; - var popperInstance = null; - var plugins = unique(props.plugins); - var state = { - // Is the instance currently enabled? - isEnabled: true, - // Is the tippy currently showing and not transitioning out? - isVisible: false, - // Has the instance been destroyed? - isDestroyed: false, - // Is the tippy currently mounted to the DOM? - isMounted: false, - // Has the tippy finished transitioning in? - isShown: false - }; - var instance = { - // properties - id, - reference: reference2, - popper: div(), - popperInstance, - props, - state, - plugins, - // methods - clearDelayTimeouts, - setProps, - setContent: setContent3, - show, - hide: hide2, - hideWithInteractivity, - enable, - disable, - unmount, - destroy - }; - if (!props.render) { - if (true) { - errorWhen(true, "render() function has not been supplied."); - } - return instance; - } - var _props$render = props.render(instance), popper2 = _props$render.popper, onUpdate = _props$render.onUpdate; - popper2.setAttribute("data-tippy-root", ""); - popper2.id = "tippy-" + instance.id; - instance.popper = popper2; - reference2._tippy = instance; - popper2._tippy = instance; - var pluginsHooks = plugins.map(function(plugin) { - return plugin.fn(instance); - }); - var hasAriaExpanded = reference2.hasAttribute("aria-expanded"); - addListeners(); - handleAriaExpandedAttribute(); - handleStyles(); - invokeHook("onCreate", [instance]); - if (props.showOnCreate) { - scheduleShow(); - } - popper2.addEventListener("mouseenter", function() { - if (instance.props.interactive && instance.state.isVisible) { - instance.clearDelayTimeouts(); - } - }); - popper2.addEventListener("mouseleave", function() { - if (instance.props.interactive && instance.props.trigger.indexOf("mouseenter") >= 0) { - getDocument().addEventListener("mousemove", debouncedOnMouseMove); - } - }); - return instance; - function getNormalizedTouchSettings() { - var touch = instance.props.touch; - return Array.isArray(touch) ? touch : [touch, 0]; - } - function getIsCustomTouchBehavior() { - return getNormalizedTouchSettings()[0] === "hold"; - } - function getIsDefaultRenderFn() { - var _instance$props$rende; - return !!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy); - } - function getCurrentTarget() { - return currentTarget || reference2; - } - function getDocument() { - var parent = getCurrentTarget().parentNode; - return parent ? getOwnerDocument(parent) : document; - } - function getDefaultTemplateChildren() { - return getChildren(popper2); - } - function getDelay(isShow) { - if (instance.state.isMounted && !instance.state.isVisible || currentInput.isTouch || lastTriggerEvent && lastTriggerEvent.type === "focus") { - return 0; - } - return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay); - } - function handleStyles(fromHide) { - if (fromHide === void 0) { - fromHide = false; - } - popper2.style.pointerEvents = instance.props.interactive && !fromHide ? "" : "none"; - popper2.style.zIndex = "" + instance.props.zIndex; - } - function invokeHook(hook, args, shouldInvokePropsHook) { - if (shouldInvokePropsHook === void 0) { - shouldInvokePropsHook = true; - } - pluginsHooks.forEach(function(pluginHooks) { - if (pluginHooks[hook]) { - pluginHooks[hook].apply(pluginHooks, args); - } - }); - if (shouldInvokePropsHook) { - var _instance$props; - (_instance$props = instance.props)[hook].apply(_instance$props, args); - } - } - function handleAriaContentAttribute() { - var aria = instance.props.aria; - if (!aria.content) { - return; - } - var attr = "aria-" + aria.content; - var id2 = popper2.id; - var nodes = normalizeToArray(instance.props.triggerTarget || reference2); - nodes.forEach(function(node) { - var currentValue = node.getAttribute(attr); - if (instance.state.isVisible) { - node.setAttribute(attr, currentValue ? currentValue + " " + id2 : id2); - } else { - var nextValue = currentValue && currentValue.replace(id2, "").trim(); - if (nextValue) { - node.setAttribute(attr, nextValue); - } else { - node.removeAttribute(attr); - } - } - }); - } - function handleAriaExpandedAttribute() { - if (hasAriaExpanded || !instance.props.aria.expanded) { - return; - } - var nodes = normalizeToArray(instance.props.triggerTarget || reference2); - nodes.forEach(function(node) { - if (instance.props.interactive) { - node.setAttribute("aria-expanded", instance.state.isVisible && node === getCurrentTarget() ? "true" : "false"); - } else { - node.removeAttribute("aria-expanded"); - } - }); - } - function cleanupInteractiveMouseListeners() { - getDocument().removeEventListener("mousemove", debouncedOnMouseMove); - mouseMoveListeners = mouseMoveListeners.filter(function(listener) { - return listener !== debouncedOnMouseMove; - }); - } - function onDocumentPress(event) { - if (currentInput.isTouch) { - if (didTouchMove || event.type === "mousedown") { - return; - } - } - var actualTarget = event.composedPath && event.composedPath()[0] || event.target; - if (instance.props.interactive && actualContains(popper2, actualTarget)) { - return; - } - if (normalizeToArray(instance.props.triggerTarget || reference2).some(function(el) { - return actualContains(el, actualTarget); - })) { - if (currentInput.isTouch) { - return; - } - if (instance.state.isVisible && instance.props.trigger.indexOf("click") >= 0) { - return; - } - } else { - invokeHook("onClickOutside", [instance, event]); - } - if (instance.props.hideOnClick === true) { - instance.clearDelayTimeouts(); - instance.hide(); - didHideDueToDocumentMouseDown = true; - setTimeout(function() { - didHideDueToDocumentMouseDown = false; - }); - if (!instance.state.isMounted) { - removeDocumentPress(); - } - } - } - function onTouchMove() { - didTouchMove = true; - } - function onTouchStart() { - didTouchMove = false; - } - function addDocumentPress() { - var doc3 = getDocument(); - doc3.addEventListener("mousedown", onDocumentPress, true); - doc3.addEventListener("touchend", onDocumentPress, TOUCH_OPTIONS); - doc3.addEventListener("touchstart", onTouchStart, TOUCH_OPTIONS); - doc3.addEventListener("touchmove", onTouchMove, TOUCH_OPTIONS); - } - function removeDocumentPress() { - var doc3 = getDocument(); - doc3.removeEventListener("mousedown", onDocumentPress, true); - doc3.removeEventListener("touchend", onDocumentPress, TOUCH_OPTIONS); - doc3.removeEventListener("touchstart", onTouchStart, TOUCH_OPTIONS); - doc3.removeEventListener("touchmove", onTouchMove, TOUCH_OPTIONS); - } - function onTransitionedOut(duration, callback) { - onTransitionEnd(duration, function() { - if (!instance.state.isVisible && popper2.parentNode && popper2.parentNode.contains(popper2)) { - callback(); - } - }); - } - function onTransitionedIn(duration, callback) { - onTransitionEnd(duration, callback); - } - function onTransitionEnd(duration, callback) { - var box = getDefaultTemplateChildren().box; - function listener(event) { - if (event.target === box) { - updateTransitionEndListener(box, "remove", listener); - callback(); - } - } - if (duration === 0) { - return callback(); - } - updateTransitionEndListener(box, "remove", currentTransitionEndListener); - updateTransitionEndListener(box, "add", listener); - currentTransitionEndListener = listener; - } - function on(eventType, handler, options) { - if (options === void 0) { - options = false; - } - var nodes = normalizeToArray(instance.props.triggerTarget || reference2); - nodes.forEach(function(node) { - node.addEventListener(eventType, handler, options); - listeners.push({ - node, - eventType, - handler, - options - }); - }); - } - function addListeners() { - if (getIsCustomTouchBehavior()) { - on("touchstart", onTrigger2, { - passive: true - }); - on("touchend", onMouseLeave, { - passive: true - }); - } - splitBySpaces(instance.props.trigger).forEach(function(eventType) { - if (eventType === "manual") { - return; - } - on(eventType, onTrigger2); - switch (eventType) { - case "mouseenter": - on("mouseleave", onMouseLeave); - break; - case "focus": - on(isIE11 ? "focusout" : "blur", onBlurOrFocusOut); - break; - case "focusin": - on("focusout", onBlurOrFocusOut); - break; - } - }); - } - function removeListeners() { - listeners.forEach(function(_ref) { - var node = _ref.node, eventType = _ref.eventType, handler = _ref.handler, options = _ref.options; - node.removeEventListener(eventType, handler, options); - }); - listeners = []; - } - function onTrigger2(event) { - var _lastTriggerEvent; - var shouldScheduleClickHide = false; - if (!instance.state.isEnabled || isEventListenerStopped(event) || didHideDueToDocumentMouseDown) { - return; - } - var wasFocused = ((_lastTriggerEvent = lastTriggerEvent) == null ? void 0 : _lastTriggerEvent.type) === "focus"; - lastTriggerEvent = event; - currentTarget = event.currentTarget; - handleAriaExpandedAttribute(); - if (!instance.state.isVisible && isMouseEvent(event)) { - mouseMoveListeners.forEach(function(listener) { - return listener(event); - }); - } - if (event.type === "click" && (instance.props.trigger.indexOf("mouseenter") < 0 || isVisibleFromClick) && instance.props.hideOnClick !== false && instance.state.isVisible) { - shouldScheduleClickHide = true; - } else { - scheduleShow(event); - } - if (event.type === "click") { - isVisibleFromClick = !shouldScheduleClickHide; - } - if (shouldScheduleClickHide && !wasFocused) { - scheduleHide(event); - } - } - function onMouseMove(event) { - var target = event.target; - var isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper2.contains(target); - if (event.type === "mousemove" && isCursorOverReferenceOrPopper) { - return; - } - var popperTreeData = getNestedPopperTree().concat(popper2).map(function(popper3) { - var _instance$popperInsta; - var instance2 = popper3._tippy; - var state2 = (_instance$popperInsta = instance2.popperInstance) == null ? void 0 : _instance$popperInsta.state; - if (state2) { - return { - popperRect: popper3.getBoundingClientRect(), - popperState: state2, - props - }; - } - return null; - }).filter(Boolean); - if (isCursorOutsideInteractiveBorder(popperTreeData, event)) { - cleanupInteractiveMouseListeners(); - scheduleHide(event); - } - } - function onMouseLeave(event) { - var shouldBail = isEventListenerStopped(event) || instance.props.trigger.indexOf("click") >= 0 && isVisibleFromClick; - if (shouldBail) { - return; - } - if (instance.props.interactive) { - instance.hideWithInteractivity(event); - return; - } - scheduleHide(event); - } - function onBlurOrFocusOut(event) { - if (instance.props.trigger.indexOf("focusin") < 0 && event.target !== getCurrentTarget()) { - return; - } - if (instance.props.interactive && event.relatedTarget && popper2.contains(event.relatedTarget)) { - return; - } - scheduleHide(event); - } - function isEventListenerStopped(event) { - return currentInput.isTouch ? getIsCustomTouchBehavior() !== event.type.indexOf("touch") >= 0 : false; - } - function createPopperInstance() { - destroyPopperInstance(); - var _instance$props2 = instance.props, popperOptions = _instance$props2.popperOptions, placement = _instance$props2.placement, offset2 = _instance$props2.offset, getReferenceClientRect = _instance$props2.getReferenceClientRect, moveTransition = _instance$props2.moveTransition; - var arrow4 = getIsDefaultRenderFn() ? getChildren(popper2).arrow : null; - var computedReference = getReferenceClientRect ? { - getBoundingClientRect: getReferenceClientRect, - contextElement: getReferenceClientRect.contextElement || getCurrentTarget() - } : reference2; - var tippyModifier = { - name: "$$tippy", - enabled: true, - phase: "beforeWrite", - requires: ["computeStyles"], - fn: function fn2(_ref2) { - var state2 = _ref2.state; - if (getIsDefaultRenderFn()) { - var _getDefaultTemplateCh = getDefaultTemplateChildren(), box = _getDefaultTemplateCh.box; - ["placement", "reference-hidden", "escaped"].forEach(function(attr) { - if (attr === "placement") { - box.setAttribute("data-placement", state2.placement); - } else { - if (state2.attributes.popper["data-popper-" + attr]) { - box.setAttribute("data-" + attr, ""); - } else { - box.removeAttribute("data-" + attr); - } - } - }); - state2.attributes.popper = {}; - } - } - }; - var modifiers2 = [{ - name: "offset", - options: { - offset: offset2 - } - }, { - name: "preventOverflow", - options: { - padding: { - top: 2, - bottom: 2, - left: 5, - right: 5 - } - } - }, { - name: "flip", - options: { - padding: 5 - } - }, { - name: "computeStyles", - options: { - adaptive: !moveTransition - } - }, tippyModifier]; - if (getIsDefaultRenderFn() && arrow4) { - modifiers2.push({ - name: "arrow", - options: { - element: arrow4, - padding: 3 - } - }); - } - modifiers2.push.apply(modifiers2, (popperOptions == null ? void 0 : popperOptions.modifiers) || []); - instance.popperInstance = createPopper(computedReference, popper2, Object.assign({}, popperOptions, { - placement, - onFirstUpdate, - modifiers: modifiers2 - })); - } - function destroyPopperInstance() { - if (instance.popperInstance) { - instance.popperInstance.destroy(); - instance.popperInstance = null; - } - } - function mount() { - var appendTo = instance.props.appendTo; - var parentNode2; - var node = getCurrentTarget(); - if (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO || appendTo === "parent") { - parentNode2 = node.parentNode; - } else { - parentNode2 = invokeWithArgsOrReturn(appendTo, [node]); - } - if (!parentNode2.contains(popper2)) { - parentNode2.appendChild(popper2); - } - instance.state.isMounted = true; - createPopperInstance(); - if (true) { - warnWhen(instance.props.interactive && appendTo === defaultProps.appendTo && node.nextElementSibling !== popper2, ["Interactive tippy element may not be accessible via keyboard", "navigation because it is not directly after the reference element", "in the DOM source order.", "\n\n", "Using a wrapper
or tag around the reference element", "solves this by creating a new parentNode context.", "\n\n", "Specifying `appendTo: document.body` silences this warning, but it", "assumes you are using a focus management solution to handle", "keyboard navigation.", "\n\n", "See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity"].join(" ")); - } - } - function getNestedPopperTree() { - return arrayFrom(popper2.querySelectorAll("[data-tippy-root]")); - } - function scheduleShow(event) { - instance.clearDelayTimeouts(); - if (event) { - invokeHook("onTrigger", [instance, event]); - } - addDocumentPress(); - var delay = getDelay(true); - var _getNormalizedTouchSe = getNormalizedTouchSettings(), touchValue = _getNormalizedTouchSe[0], touchDelay = _getNormalizedTouchSe[1]; - if (currentInput.isTouch && touchValue === "hold" && touchDelay) { - delay = touchDelay; - } - if (delay) { - showTimeout = setTimeout(function() { - instance.show(); - }, delay); - } else { - instance.show(); - } - } - function scheduleHide(event) { - instance.clearDelayTimeouts(); - invokeHook("onUntrigger", [instance, event]); - if (!instance.state.isVisible) { - removeDocumentPress(); - return; - } - if (instance.props.trigger.indexOf("mouseenter") >= 0 && instance.props.trigger.indexOf("click") >= 0 && ["mouseleave", "mousemove"].indexOf(event.type) >= 0 && isVisibleFromClick) { - return; - } - var delay = getDelay(false); - if (delay) { - hideTimeout = setTimeout(function() { - if (instance.state.isVisible) { - instance.hide(); - } - }, delay); - } else { - scheduleHideAnimationFrame = requestAnimationFrame(function() { - instance.hide(); - }); - } - } - function enable() { - instance.state.isEnabled = true; - } - function disable() { - instance.hide(); - instance.state.isEnabled = false; - } - function clearDelayTimeouts() { - clearTimeout(showTimeout); - clearTimeout(hideTimeout); - cancelAnimationFrame(scheduleHideAnimationFrame); - } - function setProps(partialProps) { - if (true) { - warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("setProps")); - } - if (instance.state.isDestroyed) { - return; - } - invokeHook("onBeforeUpdate", [instance, partialProps]); - removeListeners(); - var prevProps = instance.props; - var nextProps = evaluateProps(reference2, Object.assign({}, prevProps, removeUndefinedProps(partialProps), { - ignoreAttributes: true - })); - instance.props = nextProps; - addListeners(); - if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) { - cleanupInteractiveMouseListeners(); - debouncedOnMouseMove = debounce2(onMouseMove, nextProps.interactiveDebounce); - } - if (prevProps.triggerTarget && !nextProps.triggerTarget) { - normalizeToArray(prevProps.triggerTarget).forEach(function(node) { - node.removeAttribute("aria-expanded"); - }); - } else if (nextProps.triggerTarget) { - reference2.removeAttribute("aria-expanded"); - } - handleAriaExpandedAttribute(); - handleStyles(); - if (onUpdate) { - onUpdate(prevProps, nextProps); - } - if (instance.popperInstance) { - createPopperInstance(); - getNestedPopperTree().forEach(function(nestedPopper) { - requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate); - }); - } - invokeHook("onAfterUpdate", [instance, partialProps]); - } - function setContent3(content) { - instance.setProps({ - content - }); - } - function show() { - if (true) { - warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("show")); - } - var isAlreadyVisible = instance.state.isVisible; - var isDestroyed = instance.state.isDestroyed; - var isDisabled = !instance.state.isEnabled; - var isTouchAndTouchDisabled = currentInput.isTouch && !instance.props.touch; - var duration = getValueAtIndexOrReturn(instance.props.duration, 0, defaultProps.duration); - if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) { - return; - } - if (getCurrentTarget().hasAttribute("disabled")) { - return; - } - invokeHook("onShow", [instance], false); - if (instance.props.onShow(instance) === false) { - return; - } - instance.state.isVisible = true; - if (getIsDefaultRenderFn()) { - popper2.style.visibility = "visible"; - } - handleStyles(); - addDocumentPress(); - if (!instance.state.isMounted) { - popper2.style.transition = "none"; - } - if (getIsDefaultRenderFn()) { - var _getDefaultTemplateCh2 = getDefaultTemplateChildren(), box = _getDefaultTemplateCh2.box, content = _getDefaultTemplateCh2.content; - setTransitionDuration([box, content], 0); - } - onFirstUpdate = function onFirstUpdate2() { - var _instance$popperInsta2; - if (!instance.state.isVisible || ignoreOnFirstUpdate) { - return; - } - ignoreOnFirstUpdate = true; - void popper2.offsetHeight; - popper2.style.transition = instance.props.moveTransition; - if (getIsDefaultRenderFn() && instance.props.animation) { - var _getDefaultTemplateCh3 = getDefaultTemplateChildren(), _box = _getDefaultTemplateCh3.box, _content = _getDefaultTemplateCh3.content; - setTransitionDuration([_box, _content], duration); - setVisibilityState([_box, _content], "visible"); - } - handleAriaContentAttribute(); - handleAriaExpandedAttribute(); - pushIfUnique(mountedInstances, instance); - (_instance$popperInsta2 = instance.popperInstance) == null ? void 0 : _instance$popperInsta2.forceUpdate(); - invokeHook("onMount", [instance]); - if (instance.props.animation && getIsDefaultRenderFn()) { - onTransitionedIn(duration, function() { - instance.state.isShown = true; - invokeHook("onShown", [instance]); - }); - } - }; - mount(); - } - function hide2() { - if (true) { - warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("hide")); - } - var isAlreadyHidden = !instance.state.isVisible; - var isDestroyed = instance.state.isDestroyed; - var isDisabled = !instance.state.isEnabled; - var duration = getValueAtIndexOrReturn(instance.props.duration, 1, defaultProps.duration); - if (isAlreadyHidden || isDestroyed || isDisabled) { - return; - } - invokeHook("onHide", [instance], false); - if (instance.props.onHide(instance) === false) { - return; - } - instance.state.isVisible = false; - instance.state.isShown = false; - ignoreOnFirstUpdate = false; - isVisibleFromClick = false; - if (getIsDefaultRenderFn()) { - popper2.style.visibility = "hidden"; - } - cleanupInteractiveMouseListeners(); - removeDocumentPress(); - handleStyles(true); - if (getIsDefaultRenderFn()) { - var _getDefaultTemplateCh4 = getDefaultTemplateChildren(), box = _getDefaultTemplateCh4.box, content = _getDefaultTemplateCh4.content; - if (instance.props.animation) { - setTransitionDuration([box, content], duration); - setVisibilityState([box, content], "hidden"); - } - } - handleAriaContentAttribute(); - handleAriaExpandedAttribute(); - if (instance.props.animation) { - if (getIsDefaultRenderFn()) { - onTransitionedOut(duration, instance.unmount); - } - } else { - instance.unmount(); - } - } - function hideWithInteractivity(event) { - if (true) { - warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("hideWithInteractivity")); - } - getDocument().addEventListener("mousemove", debouncedOnMouseMove); - pushIfUnique(mouseMoveListeners, debouncedOnMouseMove); - debouncedOnMouseMove(event); - } - function unmount() { - if (true) { - warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("unmount")); - } - if (instance.state.isVisible) { - instance.hide(); - } - if (!instance.state.isMounted) { - return; - } - destroyPopperInstance(); - getNestedPopperTree().forEach(function(nestedPopper) { - nestedPopper._tippy.unmount(); - }); - if (popper2.parentNode) { - popper2.parentNode.removeChild(popper2); - } - mountedInstances = mountedInstances.filter(function(i) { - return i !== instance; - }); - instance.state.isMounted = false; - invokeHook("onHidden", [instance]); - } - function destroy() { - if (true) { - warnWhen(instance.state.isDestroyed, createMemoryLeakWarning("destroy")); - } - if (instance.state.isDestroyed) { - return; - } - instance.clearDelayTimeouts(); - instance.unmount(); - removeListeners(); - delete reference2._tippy; - instance.state.isDestroyed = true; - invokeHook("onDestroy", [instance]); - } +var WN=Object.create;var Gd=Object.defineProperty;var KN=Object.getOwnPropertyDescriptor;var VN=Object.getOwnPropertyNames;var GN=Object.getPrototypeOf,qN=Object.prototype.hasOwnProperty;var YN=(t,e,n)=>e in t?Gd(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var qd=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var JN=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of VN(e))!qN.call(t,i)&&i!==n&&Gd(t,i,{get:()=>e[i],enumerable:!(r=KN(e,i))||r.enumerable});return t};var Yd=(t,e,n)=>(n=t!=null?WN(GN(t)):{},JN(e||!t||!t.__esModule?Gd(n,"default",{value:t,enumerable:!0}):n,t));var dn=(t,e,n)=>(YN(t,typeof e!="symbol"?e+"":e,n),n);var Q_=qd((Q4,j_)=>{function z_(t){return t instanceof Map?t.clear=t.delete=t.set=function(){throw new Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=function(){throw new Error("set is read-only")}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach(e=>{let n=t[e],r=typeof n;(r==="object"||r==="function")&&!Object.isFrozen(n)&&z_(n)}),t}var xu=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function $_(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function Ti(t,...e){let n=Object.create(null);for(let r in t)n[r]=t[r];return e.forEach(function(r){for(let i in r)n[i]=r[i]}),n}var AF="",L_=t=>!!t.scope,NF=(t,{prefix:e})=>{if(t.startsWith("language:"))return t.replace("language:","language-");if(t.includes(".")){let n=t.split(".");return[`${e}${n.shift()}`,...n.map((r,i)=>`${r}${"_".repeat(i+1)}`)].join(" ")}return`${e}${t}`},Sm=class{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=$_(e)}openNode(e){if(!L_(e))return;let n=NF(e.scope,{prefix:this.classPrefix});this.span(n)}closeNode(e){L_(e)&&(this.buffer+=AF)}value(){return this.buffer}span(e){this.buffer+=``}},D_=(t={})=>{let e={children:[]};return Object.assign(e,t),e},Tm=class t{constructor(){this.rootNode=D_(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let n=D_({scope:e});this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return typeof n=="string"?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(r=>this._walk(e,r)),e.closeNode(n)),e}static _collapse(e){typeof e!="string"&&e.children&&(e.children.every(n=>typeof n=="string")?e.children=[e.children.join("")]:e.children.forEach(n=>{t._collapse(n)}))}},Mm=class extends Tm{constructor(e){super(),this.options=e}addText(e){e!==""&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,n){let r=e.root;n&&(r.scope=`language:${n}`),this.add(r)}toHTML(){return new Sm(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}};function wa(t){return t?typeof t=="string"?t:t.source:null}function U_(t){return Eo("(?=",t,")")}function OF(t){return Eo("(?:",t,")*")}function RF(t){return Eo("(?:",t,")?")}function Eo(...t){return t.map(n=>wa(n)).join("")}function IF(t){let e=t[t.length-1];return typeof e=="object"&&e.constructor===Object?(t.splice(t.length-1,1),e):{}}function km(...t){return"("+(IF(t).capture?"":"?:")+t.map(r=>wa(r)).join("|")+")"}function W_(t){return new RegExp(t.toString()+"|").exec("").length-1}function LF(t,e){let n=t&&t.exec(e);return n&&n.index===0}var DF=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function Am(t,{joinWith:e}){let n=0;return t.map(r=>{n+=1;let i=n,o=wa(r),s="";for(;o.length>0;){let l=DF.exec(o);if(!l){s+=o;break}s+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),l[0][0]==="\\"&&l[1]?s+="\\"+String(Number(l[1])+i):(s+=l[0],l[0]==="("&&n++)}return s}).map(r=>`(${r})`).join(e)}var PF=/\b\B/,K_="[a-zA-Z]\\w*",Nm="[a-zA-Z_]\\w*",V_="\\b\\d+(\\.\\d+)?",G_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",q_="\\b(0b[01]+)",BF="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",FF=(t={})=>{let e=/^#![ ]*\//;return t.binary&&(t.begin=Eo(e,/.*\b/,t.binary,/\b.*/)),Ti({scope:"meta",begin:e,end:/$/,relevance:0,"on:begin":(n,r)=>{n.index!==0&&r.ignoreMatch()}},t)},xa={begin:"\\\\[\\s\\S]",relevance:0},HF={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[xa]},zF={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[xa]},$F={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},Su=function(t,e,n={}){let r=Ti({scope:"comment",begin:t,end:e,contains:[]},n);r.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=km("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:Eo(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),r},UF=Su("//","$"),WF=Su("/\\*","\\*/"),KF=Su("#","$"),VF={scope:"number",begin:V_,relevance:0},GF={scope:"number",begin:G_,relevance:0},qF={scope:"number",begin:q_,relevance:0},YF={begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[xa,{begin:/\[/,end:/\]/,relevance:0,contains:[xa]}]}]},JF={scope:"title",begin:K_,relevance:0},XF={scope:"title",begin:Nm,relevance:0},ZF={begin:"\\.\\s*"+Nm,relevance:0},jF=function(t){return Object.assign(t,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})},wu=Object.freeze({__proto__:null,MATCH_NOTHING_RE:PF,IDENT_RE:K_,UNDERSCORE_IDENT_RE:Nm,NUMBER_RE:V_,C_NUMBER_RE:G_,BINARY_NUMBER_RE:q_,RE_STARTERS_RE:BF,SHEBANG:FF,BACKSLASH_ESCAPE:xa,APOS_STRING_MODE:HF,QUOTE_STRING_MODE:zF,PHRASAL_WORDS_MODE:$F,COMMENT:Su,C_LINE_COMMENT_MODE:UF,C_BLOCK_COMMENT_MODE:WF,HASH_COMMENT_MODE:KF,NUMBER_MODE:VF,C_NUMBER_MODE:GF,BINARY_NUMBER_MODE:qF,REGEXP_MODE:YF,TITLE_MODE:JF,UNDERSCORE_TITLE_MODE:XF,METHOD_GUARD:ZF,END_SAME_AS_BEGIN:jF});function QF(t,e){t.input[t.index-1]==="."&&e.ignoreMatch()}function eH(t,e){t.className!==void 0&&(t.scope=t.className,delete t.className)}function tH(t,e){e&&t.beginKeywords&&(t.begin="\\b("+t.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",t.__beforeBegin=QF,t.keywords=t.keywords||t.beginKeywords,delete t.beginKeywords,t.relevance===void 0&&(t.relevance=0))}function nH(t,e){Array.isArray(t.illegal)&&(t.illegal=km(...t.illegal))}function rH(t,e){if(t.match){if(t.begin||t.end)throw new Error("begin & end are not supported with match");t.begin=t.match,delete t.match}}function iH(t,e){t.relevance===void 0&&(t.relevance=1)}var oH=(t,e)=>{if(!t.beforeMatch)return;if(t.starts)throw new Error("beforeMatch cannot be used with starts");let n=Object.assign({},t);Object.keys(t).forEach(r=>{delete t[r]}),t.keywords=n.keywords,t.begin=Eo(n.beforeMatch,U_(n.begin)),t.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},t.relevance=0,delete n.beforeMatch},sH=["of","and","for","in","not","or","if","then","parent","list","value"],aH="keyword";function Y_(t,e,n=aH){let r=Object.create(null);return typeof t=="string"?i(n,t.split(" ")):Array.isArray(t)?i(n,t):Object.keys(t).forEach(function(o){Object.assign(r,Y_(t[o],e,o))}),r;function i(o,s){e&&(s=s.map(l=>l.toLowerCase())),s.forEach(function(l){let u=l.split("|");r[u[0]]=[o,lH(u[0],u[1])]})}}function lH(t,e){return e?Number(e):cH(t)?0:1}function cH(t){return sH.includes(t.toLowerCase())}var P_={},yo=t=>{console.error(t)},B_=(t,...e)=>{console.log(`WARN: ${t}`,...e)},us=(t,e)=>{P_[`${t}/${e}`]||(console.log(`Deprecated as of ${t}. ${e}`),P_[`${t}/${e}`]=!0)},_u=new Error;function J_(t,e,{key:n}){let r=0,i=t[n],o={},s={};for(let l=1;l<=e.length;l++)s[l+r]=i[l],o[l+r]=!0,r+=W_(e[l-1]);t[n]=s,t[n]._emit=o,t[n]._multi=!0}function uH(t){if(Array.isArray(t.begin)){if(t.skip||t.excludeBegin||t.returnBegin)throw yo("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),_u;if(typeof t.beginScope!="object"||t.beginScope===null)throw yo("beginScope must be object"),_u;J_(t,t.begin,{key:"beginScope"}),t.begin=Am(t.begin,{joinWith:""})}}function dH(t){if(Array.isArray(t.end)){if(t.skip||t.excludeEnd||t.returnEnd)throw yo("skip, excludeEnd, returnEnd not compatible with endScope: {}"),_u;if(typeof t.endScope!="object"||t.endScope===null)throw yo("endScope must be object"),_u;J_(t,t.end,{key:"endScope"}),t.end=Am(t.end,{joinWith:""})}}function fH(t){t.scope&&typeof t.scope=="object"&&t.scope!==null&&(t.beginScope=t.scope,delete t.scope)}function pH(t){fH(t),typeof t.beginScope=="string"&&(t.beginScope={_wrap:t.beginScope}),typeof t.endScope=="string"&&(t.endScope={_wrap:t.endScope}),uH(t),dH(t)}function hH(t){function e(s,l){return new RegExp(wa(s),"m"+(t.case_insensitive?"i":"")+(t.unicodeRegex?"u":"")+(l?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(l,u){u.position=this.position++,this.matchIndexes[this.matchAt]=u,this.regexes.push([u,l]),this.matchAt+=W_(l)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let l=this.regexes.map(u=>u[1]);this.matcherRe=e(Am(l,{joinWith:"|"}),!0),this.lastIndex=0}exec(l){this.matcherRe.lastIndex=this.lastIndex;let u=this.matcherRe.exec(l);if(!u)return null;let d=u.findIndex((h,m)=>m>0&&h!==void 0),f=this.matchIndexes[d];return u.splice(0,d),Object.assign(u,f)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(l){if(this.multiRegexes[l])return this.multiRegexes[l];let u=new n;return this.rules.slice(l).forEach(([d,f])=>u.addRule(d,f)),u.compile(),this.multiRegexes[l]=u,u}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(l,u){this.rules.push([l,u]),u.type==="begin"&&this.count++}exec(l){let u=this.getMatcher(this.regexIndex);u.lastIndex=this.lastIndex;let d=u.exec(l);if(this.resumingScanAtSamePosition()&&!(d&&d.index===this.lastIndex)){let f=this.getMatcher(0);f.lastIndex=this.lastIndex+1,d=f.exec(l)}return d&&(this.regexIndex+=d.position+1,this.regexIndex===this.count&&this.considerAll()),d}}function i(s){let l=new r;return s.contains.forEach(u=>l.addRule(u.begin,{rule:u,type:"begin"})),s.terminatorEnd&&l.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&l.addRule(s.illegal,{type:"illegal"}),l}function o(s,l){let u=s;if(s.isCompiled)return u;[eH,rH,pH,oH].forEach(f=>f(s,l)),t.compilerExtensions.forEach(f=>f(s,l)),s.__beforeBegin=null,[tH,nH,iH].forEach(f=>f(s,l)),s.isCompiled=!0;let d=null;return typeof s.keywords=="object"&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords),d=s.keywords.$pattern,delete s.keywords.$pattern),d=d||/\w+/,s.keywords&&(s.keywords=Y_(s.keywords,t.case_insensitive)),u.keywordPatternRe=e(d,!0),l&&(s.begin||(s.begin=/\B|\b/),u.beginRe=e(u.begin),!s.end&&!s.endsWithParent&&(s.end=/\B|\b/),s.end&&(u.endRe=e(u.end)),u.terminatorEnd=wa(u.end)||"",s.endsWithParent&&l.terminatorEnd&&(u.terminatorEnd+=(s.end?"|":"")+l.terminatorEnd)),s.illegal&&(u.illegalRe=e(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map(function(f){return mH(f==="self"?s:f)})),s.contains.forEach(function(f){o(f,u)}),s.starts&&o(s.starts,l),u.matcher=i(u),u}if(t.compilerExtensions||(t.compilerExtensions=[]),t.contains&&t.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return t.classNameAliases=Ti(t.classNameAliases||{}),o(t)}function X_(t){return t?t.endsWithParent||X_(t.starts):!1}function mH(t){return t.variants&&!t.cachedVariants&&(t.cachedVariants=t.variants.map(function(e){return Ti(t,{variants:null},e)})),t.cachedVariants?t.cachedVariants:X_(t)?Ti(t,{starts:t.starts?Ti(t.starts):null}):Object.isFrozen(t)?Ti(t):t}var gH="11.8.0",Cm=class extends Error{constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}},_m=$_,F_=Ti,H_=Symbol("nomatch"),bH=7,Z_=function(t){let e=Object.create(null),n=Object.create(null),r=[],i=!0,o="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:Mm};function u(N){return l.noHighlightRe.test(N)}function d(N){let R=N.className+" ";R+=N.parentNode?N.parentNode.className:"";let V=l.languageDetectRe.exec(R);if(V){let Q=$(V[1]);return Q||(B_(o.replace("{}",V[1])),B_("Falling back to no-highlight mode for this block.",N)),Q?V[1]:"no-highlight"}return R.split(/\s+/).find(Q=>u(Q)||$(Q))}function f(N,R,V){let Q="",he="";typeof R=="object"?(Q=N,V=R.ignoreIllegals,he=R.language):(us("10.7.0","highlight(lang, code, ...args) has been deprecated."),us("10.7.0",`Please use highlight(code, options) instead. +https://github.com/highlightjs/highlight.js/issues/2277`),he=N,Q=R),V===void 0&&(V=!0);let xe={code:Q,language:he};Ee("before:highlight",xe);let $e=xe.result?xe.result:h(xe.language,xe.code,V);return $e.code=xe.code,Ee("after:highlight",$e),$e}function h(N,R,V,Q){let he=Object.create(null);function xe(H,q){return H.keywords[q]}function $e(){if(!ee.keywords){We.addText(Oe);return}let H=0;ee.keywordPatternRe.lastIndex=0;let q=ee.keywordPatternRe.exec(Oe),ue="";for(;q;){ue+=Oe.substring(H,q.index);let Ce=ft.case_insensitive?q[0].toLowerCase():q[0],ct=xe(ee,Ce);if(ct){let[Vt,Ci]=ct;if(We.addText(ue),ue="",he[Ce]=(he[Ce]||0)+1,he[Ce]<=bH&&(mt+=Ci),Vt.startsWith("_"))ue+=q[0];else{let B=ft.classNameAliases[Vt]||Vt;Xe(q[0],B)}}else ue+=q[0];H=ee.keywordPatternRe.lastIndex,q=ee.keywordPatternRe.exec(Oe)}ue+=Oe.substring(H),We.addText(ue)}function Ue(){if(Oe==="")return;let H=null;if(typeof ee.subLanguage=="string"){if(!e[ee.subLanguage]){We.addText(Oe);return}H=h(ee.subLanguage,Oe,!0,ke[ee.subLanguage]),ke[ee.subLanguage]=H._top}else H=b(Oe,ee.subLanguage.length?ee.subLanguage:null);ee.relevance>0&&(mt+=H.relevance),We.__addSublanguage(H._emitter,H.language)}function He(){ee.subLanguage!=null?Ue():$e(),Oe=""}function Xe(H,q){H!==""&&(We.startScope(q),We.addText(H),We.endScope())}function xt(H,q){let ue=1,Ce=q.length-1;for(;ue<=Ce;){if(!H._emit[ue]){ue++;continue}let ct=ft.classNameAliases[H[ue]]||H[ue],Vt=q[ue];ct?Xe(Vt,ct):(Oe=Vt,$e(),Oe=""),ue++}}function Pt(H,q){return H.scope&&typeof H.scope=="string"&&We.openNode(ft.classNameAliases[H.scope]||H.scope),H.beginScope&&(H.beginScope._wrap?(Xe(Oe,ft.classNameAliases[H.beginScope._wrap]||H.beginScope._wrap),Oe=""):H.beginScope._multi&&(xt(H.beginScope,q),Oe="")),ee=Object.create(H,{parent:{value:ee}}),ee}function Le(H,q,ue){let Ce=LF(H.endRe,ue);if(Ce){if(H["on:end"]){let ct=new xu(H);H["on:end"](q,ct),ct.isMatchIgnored&&(Ce=!1)}if(Ce){for(;H.endsParent&&H.parent;)H=H.parent;return H}}if(H.endsWithParent)return Le(H.parent,q,ue)}function _t(H){return ee.matcher.regexIndex===0?(Oe+=H[0],1):(ne=!0,0)}function Zt(H){let q=H[0],ue=H.rule,Ce=new xu(ue),ct=[ue.__beforeBegin,ue["on:begin"]];for(let Vt of ct)if(Vt&&(Vt(H,Ce),Ce.isMatchIgnored))return _t(q);return ue.skip?Oe+=q:(ue.excludeBegin&&(Oe+=q),He(),!ue.returnBegin&&!ue.excludeBegin&&(Oe=q)),Pt(ue,H),ue.returnBegin?0:q.length}function st(H){let q=H[0],ue=R.substring(H.index),Ce=Le(ee,H,ue);if(!Ce)return H_;let ct=ee;ee.endScope&&ee.endScope._wrap?(He(),Xe(q,ee.endScope._wrap)):ee.endScope&&ee.endScope._multi?(He(),xt(ee.endScope,H)):ct.skip?Oe+=q:(ct.returnEnd||ct.excludeEnd||(Oe+=q),He(),ct.excludeEnd&&(Oe=q));do ee.scope&&We.closeNode(),!ee.skip&&!ee.subLanguage&&(mt+=ee.relevance),ee=ee.parent;while(ee!==Ce.parent);return Ce.starts&&Pt(Ce.starts,H),ct.returnEnd?0:q.length}function jt(){let H=[];for(let q=ee;q!==ft;q=q.parent)q.scope&&H.unshift(q.scope);H.forEach(q=>We.openNode(q))}let St={};function Nt(H,q){let ue=q&&q[0];if(Oe+=H,ue==null)return He(),0;if(St.type==="begin"&&q.type==="end"&&St.index===q.index&&ue===""){if(Oe+=R.slice(q.index,q.index+1),!i){let Ce=new Error(`0 width match regex (${N})`);throw Ce.languageName=N,Ce.badRule=St.rule,Ce}return 1}if(St=q,q.type==="begin")return Zt(q);if(q.type==="illegal"&&!V){let Ce=new Error('Illegal lexeme "'+ue+'" for mode "'+(ee.scope||"")+'"');throw Ce.mode=ee,Ce}else if(q.type==="end"){let Ce=st(q);if(Ce!==H_)return Ce}if(q.type==="illegal"&&ue==="")return 1;if(J>1e5&&J>q.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Oe+=ue,ue.length}let ft=$(N);if(!ft)throw yo(o.replace("{}",N)),new Error('Unknown language: "'+N+'"');let be=hH(ft),Kt="",ee=Q||be,ke={},We=new l.__emitter(l);jt();let Oe="",mt=0,Ot=0,J=0,ne=!1;try{if(ft.__emitTokens)ft.__emitTokens(R,We);else{for(ee.matcher.considerAll();;){J++,ne?ne=!1:ee.matcher.considerAll(),ee.matcher.lastIndex=Ot;let H=ee.matcher.exec(R);if(!H)break;let q=R.substring(Ot,H.index),ue=Nt(q,H);Ot=H.index+ue}Nt(R.substring(Ot))}return We.finalize(),Kt=We.toHTML(),{language:N,value:Kt,relevance:mt,illegal:!1,_emitter:We,_top:ee}}catch(H){if(H.message&&H.message.includes("Illegal"))return{language:N,value:_m(R),illegal:!0,relevance:0,_illegalBy:{message:H.message,index:Ot,context:R.slice(Ot-100,Ot+100),mode:H.mode,resultSoFar:Kt},_emitter:We};if(i)return{language:N,value:_m(R),illegal:!1,relevance:0,errorRaised:H,_emitter:We,_top:ee};throw H}}function m(N){let R={value:_m(N),illegal:!1,relevance:0,_top:s,_emitter:new l.__emitter(l)};return R._emitter.addText(N),R}function b(N,R){R=R||l.languages||Object.keys(e);let V=m(N),Q=R.filter($).filter(me).map(He=>h(He,N,!1));Q.unshift(V);let he=Q.sort((He,Xe)=>{if(He.relevance!==Xe.relevance)return Xe.relevance-He.relevance;if(He.language&&Xe.language){if($(He.language).supersetOf===Xe.language)return 1;if($(Xe.language).supersetOf===He.language)return-1}return 0}),[xe,$e]=he,Ue=xe;return Ue.secondBest=$e,Ue}function y(N,R,V){let Q=R&&n[R]||V;N.classList.add("hljs"),N.classList.add(`language-${Q}`)}function v(N){let R=null,V=d(N);if(u(V))return;if(Ee("before:highlightElement",{el:N,language:V}),N.children.length>0&&(l.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(N)),l.throwUnescapedHTML))throw new Cm("One of your code blocks includes unescaped HTML.",N.innerHTML);R=N;let Q=R.textContent,he=V?f(Q,{language:V,ignoreIllegals:!0}):b(Q);N.innerHTML=he.value,y(N,V,he.language),N.result={language:he.language,re:he.relevance,relevance:he.relevance},he.secondBest&&(N.secondBest={language:he.secondBest.language,relevance:he.secondBest.relevance}),Ee("after:highlightElement",{el:N,result:he,text:Q})}function x(N){l=F_(l,N)}let S=()=>{T(),us("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function D(){T(),us("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let L=!1;function T(){if(document.readyState==="loading"){L=!0;return}document.querySelectorAll(l.cssSelector).forEach(v)}function z(){L&&T()}typeof window<"u"&&window.addEventListener&&window.addEventListener("DOMContentLoaded",z,!1);function O(N,R){let V=null;try{V=R(t)}catch(Q){if(yo("Language definition for '{}' could not be registered.".replace("{}",N)),i)yo(Q);else throw Q;V=s}V.name||(V.name=N),e[N]=V,V.rawDefinition=R.bind(null,t),V.aliases&&oe(V.aliases,{languageName:N})}function Y(N){delete e[N];for(let R of Object.keys(n))n[R]===N&&delete n[R]}function ie(){return Object.keys(e)}function $(N){return N=(N||"").toLowerCase(),e[N]||e[n[N]]}function oe(N,{languageName:R}){typeof N=="string"&&(N=[N]),N.forEach(V=>{n[V.toLowerCase()]=R})}function me(N){let R=$(N);return R&&!R.disableAutodetect}function Te(N){N["before:highlightBlock"]&&!N["before:highlightElement"]&&(N["before:highlightElement"]=R=>{N["before:highlightBlock"](Object.assign({block:R.el},R))}),N["after:highlightBlock"]&&!N["after:highlightElement"]&&(N["after:highlightElement"]=R=>{N["after:highlightBlock"](Object.assign({block:R.el},R))})}function ge(N){Te(N),r.push(N)}function Me(N){let R=r.indexOf(N);R!==-1&&r.splice(R,1)}function Ee(N,R){let V=N;r.forEach(function(Q){Q[V]&&Q[V](R)})}function P(N){return us("10.7.0","highlightBlock will be removed entirely in v12.0"),us("10.7.0","Please use highlightElement now."),v(N)}Object.assign(t,{highlight:f,highlightAuto:b,highlightAll:T,highlightElement:v,highlightBlock:P,configure:x,initHighlighting:S,initHighlightingOnLoad:D,registerLanguage:O,unregisterLanguage:Y,listLanguages:ie,getLanguage:$,registerAliases:oe,autoDetection:me,inherit:F_,addPlugin:ge,removePlugin:Me}),t.debugMode=function(){i=!1},t.safeMode=function(){i=!0},t.versionString=gH,t.regex={concat:Eo,lookahead:U_,either:km,optional:RF,anyNumberOfTimes:OF};for(let N in wu)typeof wu[N]=="object"&&z_(wu[N]);return Object.assign(t,wu),t},ds=Z_({});ds.newInstance=()=>Z_({});j_.exports=ds;ds.HighlightJS=ds;ds.default=ds});var tS=qd((tq,Om)=>{(function(){var t;typeof Om<"u"?t=Om.exports=r:t=function(){return this||(0,eval)("this")}(),t.format=r,t.vsprintf=n,typeof console<"u"&&typeof console.log=="function"&&(t.printf=e);function e(){console.log(r.apply(null,arguments))}function n(i,o){return r.apply(null,[i].concat(o))}function r(i){for(var o=1,s=[].slice.call(arguments),l=0,u=i.length,d="",f,h=!1,m,b,y=!1,v,x=function(){return s[o++]},S=function(){for(var D="";/\d/.test(i[l]);)D+=i[l++],f=i[l];return D.length>0?parseInt(D):null};l{(function(){var t,e="4.17.21",n=200,r="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",i="Expected a function",o="Invalid `variable` option passed into `_.template`",s="__lodash_hash_undefined__",l=500,u="__lodash_placeholder__",d=1,f=2,h=4,m=1,b=2,y=1,v=2,x=4,S=8,D=16,L=32,T=64,z=128,O=256,Y=512,ie=30,$="...",oe=800,me=16,Te=1,ge=2,Me=3,Ee=1/0,P=9007199254740991,N=17976931348623157e292,R=NaN,V=4294967295,Q=V-1,he=V>>>1,xe=[["ary",z],["bind",y],["bindKey",v],["curry",S],["curryRight",D],["flip",Y],["partial",L],["partialRight",T],["rearg",O]],$e="[object Arguments]",Ue="[object Array]",He="[object AsyncFunction]",Xe="[object Boolean]",xt="[object Date]",Pt="[object DOMException]",Le="[object Error]",_t="[object Function]",Zt="[object GeneratorFunction]",st="[object Map]",jt="[object Number]",St="[object Null]",Nt="[object Object]",ft="[object Promise]",be="[object Proxy]",Kt="[object RegExp]",ee="[object Set]",ke="[object String]",We="[object Symbol]",Oe="[object Undefined]",mt="[object WeakMap]",Ot="[object WeakSet]",J="[object ArrayBuffer]",ne="[object DataView]",H="[object Float32Array]",q="[object Float64Array]",ue="[object Int8Array]",Ce="[object Int16Array]",ct="[object Int32Array]",Vt="[object Uint8Array]",Ci="[object Uint8ClampedArray]",B="[object Uint16Array]",le="[object Uint32Array]",_e=/\b__p \+= '';/g,Ze=/\b(__p \+=) '' \+/g,Ve=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Bt=/&(?:amp|lt|gt|quot|#39);/g,an=/[&<>"']/g,Yr=RegExp(Bt.source),Ca=RegExp(an.source),Sr=/<%-([\s\S]+?)%>/g,ms=/<%([\s\S]+?)%>/g,ki=/<%=([\s\S]+?)%>/g,Jr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Lu=/^\w*$/,gs=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Xr=/[\\^$.*+?()[\]{}|]/g,vS=RegExp(Xr.source),Du=/^\s+/,wS=/\s/,xS=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,_S=/\{\n\/\* \[wrapped with (.+)\] \*/,SS=/,? & /,TS=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,MS=/[()=,{}\[\]\/\s]/,CS=/\\(\\)?/g,kS=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Bm=/\w*$/,AS=/^[-+]0x[0-9a-f]+$/i,NS=/^0b[01]+$/i,OS=/^\[object .+?Constructor\]$/,RS=/^0o[0-7]+$/i,IS=/^(?:0|[1-9]\d*)$/,LS=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ka=/($^)/,DS=/['\n\r\u2028\u2029\\]/g,Aa="\\ud800-\\udfff",PS="\\u0300-\\u036f",BS="\\ufe20-\\ufe2f",FS="\\u20d0-\\u20ff",Fm=PS+BS+FS,Hm="\\u2700-\\u27bf",zm="a-z\\xdf-\\xf6\\xf8-\\xff",HS="\\xac\\xb1\\xd7\\xf7",zS="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",$S="\\u2000-\\u206f",US=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",$m="A-Z\\xc0-\\xd6\\xd8-\\xde",Um="\\ufe0e\\ufe0f",Wm=HS+zS+$S+US,Pu="['\u2019]",WS="["+Aa+"]",Km="["+Wm+"]",Na="["+Fm+"]",Vm="\\d+",KS="["+Hm+"]",Gm="["+zm+"]",qm="[^"+Aa+Wm+Vm+Hm+zm+$m+"]",Bu="\\ud83c[\\udffb-\\udfff]",VS="(?:"+Na+"|"+Bu+")",Ym="[^"+Aa+"]",Fu="(?:\\ud83c[\\udde6-\\uddff]){2}",Hu="[\\ud800-\\udbff][\\udc00-\\udfff]",wo="["+$m+"]",Jm="\\u200d",Xm="(?:"+Gm+"|"+qm+")",GS="(?:"+wo+"|"+qm+")",Zm="(?:"+Pu+"(?:d|ll|m|re|s|t|ve))?",jm="(?:"+Pu+"(?:D|LL|M|RE|S|T|VE))?",Qm=VS+"?",eg="["+Um+"]?",qS="(?:"+Jm+"(?:"+[Ym,Fu,Hu].join("|")+")"+eg+Qm+")*",YS="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",JS="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",tg=eg+Qm+qS,XS="(?:"+[KS,Fu,Hu].join("|")+")"+tg,ZS="(?:"+[Ym+Na+"?",Na,Fu,Hu,WS].join("|")+")",jS=RegExp(Pu,"g"),QS=RegExp(Na,"g"),zu=RegExp(Bu+"(?="+Bu+")|"+ZS+tg,"g"),eT=RegExp([wo+"?"+Gm+"+"+Zm+"(?="+[Km,wo,"$"].join("|")+")",GS+"+"+jm+"(?="+[Km,wo+Xm,"$"].join("|")+")",wo+"?"+Xm+"+"+Zm,wo+"+"+jm,JS,YS,Vm,XS].join("|"),"g"),tT=RegExp("["+Jm+Aa+Fm+Um+"]"),nT=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,rT=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],iT=-1,at={};at[H]=at[q]=at[ue]=at[Ce]=at[ct]=at[Vt]=at[Ci]=at[B]=at[le]=!0,at[$e]=at[Ue]=at[J]=at[Xe]=at[ne]=at[xt]=at[Le]=at[_t]=at[st]=at[jt]=at[Nt]=at[Kt]=at[ee]=at[ke]=at[mt]=!1;var it={};it[$e]=it[Ue]=it[J]=it[ne]=it[Xe]=it[xt]=it[H]=it[q]=it[ue]=it[Ce]=it[ct]=it[st]=it[jt]=it[Nt]=it[Kt]=it[ee]=it[ke]=it[We]=it[Vt]=it[Ci]=it[B]=it[le]=!0,it[Le]=it[_t]=it[mt]=!1;var oT={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},sT={"&":"&","<":"<",">":">",'"':""","'":"'"},aT={"&":"&","<":"<",">":">",""":'"',"'":"'"},lT={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},cT=parseFloat,uT=parseInt,ng=typeof global=="object"&&global&&global.Object===Object&&global,dT=typeof self=="object"&&self&&self.Object===Object&&self,Ft=ng||dT||Function("return this")(),$u=typeof hs=="object"&&hs&&!hs.nodeType&&hs,Ai=$u&&typeof Ma=="object"&&Ma&&!Ma.nodeType&&Ma,rg=Ai&&Ai.exports===$u,Uu=rg&&ng.process,Rn=function(){try{var k=Ai&&Ai.require&&Ai.require("util").types;return k||Uu&&Uu.binding&&Uu.binding("util")}catch{}}(),ig=Rn&&Rn.isArrayBuffer,og=Rn&&Rn.isDate,sg=Rn&&Rn.isMap,ag=Rn&&Rn.isRegExp,lg=Rn&&Rn.isSet,cg=Rn&&Rn.isTypedArray;function Tn(k,F,I){switch(I.length){case 0:return k.call(F);case 1:return k.call(F,I[0]);case 2:return k.call(F,I[0],I[1]);case 3:return k.call(F,I[0],I[1],I[2])}return k.apply(F,I)}function fT(k,F,I,se){for(var Ae=-1,je=k==null?0:k.length;++Ae-1}function Wu(k,F,I){for(var se=-1,Ae=k==null?0:k.length;++se-1;);return I}function bg(k,F){for(var I=k.length;I--&&xo(F,k[I],0)>-1;);return I}function wT(k,F){for(var I=k.length,se=0;I--;)k[I]===F&&++se;return se}var xT=qu(oT),_T=qu(sT);function ST(k){return"\\"+lT[k]}function TT(k,F){return k==null?t:k[F]}function _o(k){return tT.test(k)}function MT(k){return nT.test(k)}function CT(k){for(var F,I=[];!(F=k.next()).done;)I.push(F.value);return I}function Zu(k){var F=-1,I=Array(k.size);return k.forEach(function(se,Ae){I[++F]=[Ae,se]}),I}function yg(k,F){return function(I){return k(F(I))}}function Qr(k,F){for(var I=-1,se=k.length,Ae=0,je=[];++I-1}function h1(a,c){var p=this.__data__,g=Ya(p,a);return g<0?(++this.size,p.push([a,c])):p[g][1]=c,this}Tr.prototype.clear=u1,Tr.prototype.delete=d1,Tr.prototype.get=f1,Tr.prototype.has=p1,Tr.prototype.set=h1;function Mr(a){var c=-1,p=a==null?0:a.length;for(this.clear();++c=c?a:c)),a}function Pn(a,c,p,g,E,_){var M,C=c&d,A=c&f,U=c&h;if(p&&(M=E?p(a,g,E,_):p(a)),M!==t)return M;if(!pt(a))return a;var W=Ne(a);if(W){if(M=yM(a),!C)return bn(a,M)}else{var G=en(a),te=G==_t||G==Zt;if(si(a))return eb(a,C);if(G==Nt||G==$e||te&&!E){if(M=A||te?{}:Eb(a),!C)return A?aM(a,N1(M,a)):sM(a,Ng(M,a))}else{if(!it[G])return E?a:{};M=EM(a,G,C)}}_||(_=new Qn);var de=_.get(a);if(de)return de;_.set(a,M),Yb(a)?a.forEach(function(we){M.add(Pn(we,c,p,we,a,_))}):Gb(a)&&a.forEach(function(we,ze){M.set(ze,Pn(we,c,p,ze,a,_))});var ve=U?A?_d:xd:A?En:Ht,De=W?t:ve(a);return In(De||a,function(we,ze){De&&(ze=we,we=a[ze]),_s(M,ze,Pn(we,c,p,ze,a,_))}),M}function O1(a){var c=Ht(a);return function(p){return Og(p,a,c)}}function Og(a,c,p){var g=p.length;if(a==null)return!g;for(a=nt(a);g--;){var E=p[g],_=c[E],M=a[E];if(M===t&&!(E in a)||!_(M))return!1}return!0}function Rg(a,c,p){if(typeof a!="function")throw new Ln(i);return Ns(function(){a.apply(t,p)},c)}function Ss(a,c,p,g){var E=-1,_=Oa,M=!0,C=a.length,A=[],U=c.length;if(!C)return A;p&&(c=ut(c,Mn(p))),g?(_=Wu,M=!1):c.length>=n&&(_=bs,M=!1,c=new Ri(c));e:for(;++EE?0:E+p),g=g===t||g>E?E:Re(g),g<0&&(g+=E),g=p>g?0:Xb(g);p0&&p(C)?c>1?Gt(C,c-1,p,g,E):jr(E,C):g||(E[E.length]=C)}return E}var id=sb(),Dg=sb(!0);function dr(a,c){return a&&id(a,c,Ht)}function od(a,c){return a&&Dg(a,c,Ht)}function Xa(a,c){return Zr(c,function(p){return Or(a[p])})}function Li(a,c){c=ii(c,a);for(var p=0,g=c.length;a!=null&&pc}function L1(a,c){return a!=null&&et.call(a,c)}function D1(a,c){return a!=null&&c in nt(a)}function P1(a,c,p){return a>=Qt(c,p)&&a=120&&W.length>=120)?new Ri(M&&W):t}W=a[0];var G=-1,te=C[0];e:for(;++G-1;)C!==a&&$a.call(C,A,1),$a.call(a,A,1);return a}function Gg(a,c){for(var p=a?c.length:0,g=p-1;p--;){var E=c[p];if(p==g||E!==_){var _=E;Nr(E)?$a.call(a,E,1):md(a,E)}}return a}function fd(a,c){return a+Ka(Mg()*(c-a+1))}function J1(a,c,p,g){for(var E=-1,_=It(Wa((c-a)/(p||1)),0),M=I(_);_--;)M[g?_:++E]=a,a+=p;return M}function pd(a,c){var p="";if(!a||c<1||c>P)return p;do c%2&&(p+=a),c=Ka(c/2),c&&(a+=a);while(c);return p}function Fe(a,c){return Nd(xb(a,c,vn),a+"")}function X1(a){return Ag(Io(a))}function Z1(a,c){var p=Io(a);return al(p,Ii(c,0,p.length))}function Cs(a,c,p,g){if(!pt(a))return a;c=ii(c,a);for(var E=-1,_=c.length,M=_-1,C=a;C!=null&&++E<_;){var A=pr(c[E]),U=p;if(A==="__proto__"||A==="constructor"||A==="prototype")return a;if(E!=M){var W=C[A];U=g?g(W,A,C):t,U===t&&(U=pt(W)?W:Nr(c[E+1])?[]:{})}_s(C,A,U),C=C[A]}return a}var qg=Va?function(a,c){return Va.set(a,c),a}:vn,j1=Ua?function(a,c){return Ua(a,"toString",{configurable:!0,enumerable:!1,value:zd(c),writable:!0})}:vn;function Q1(a){return al(Io(a))}function Bn(a,c,p){var g=-1,E=a.length;c<0&&(c=-c>E?0:E+c),p=p>E?E:p,p<0&&(p+=E),E=c>p?0:p-c>>>0,c>>>=0;for(var _=I(E);++g>>1,M=a[_];M!==null&&!kn(M)&&(p?M<=c:M=n){var U=c?null:dM(a);if(U)return Ia(U);M=!1,E=bs,A=new Ri}else A=c?[]:C;e:for(;++g<_;){var W=a[g],G=c?c(W):W;if(W=p||W!==0?W:0,M&&G===G){for(var te=A.length;te--;)if(A[te]===G)continue e;c&&A.push(G),C.push(W)}else E(A,G,p)||(A!==C&&A.push(G),C.push(W))}return C}function md(a,c){return c=ii(c,a),a=_b(a,c),a==null||delete a[pr(Fn(c))]}function Xg(a,c,p,g){return Cs(a,c,p(Li(a,c)),g)}function Qa(a,c,p,g){for(var E=a.length,_=g?E:-1;(g?_--:++_=g?a:Bn(a,c,p)}var Qg=UT||function(a){return Ft.clearTimeout(a)};function eb(a,c){if(c)return a.slice();var p=a.length,g=wg?wg(p):new a.constructor(p);return a.copy(g),g}function Ed(a){var c=new a.constructor(a.byteLength);return new Ha(c).set(new Ha(a)),c}function nM(a,c){var p=c?Ed(a.buffer):a.buffer;return new a.constructor(p,a.byteOffset,a.byteLength)}function rM(a){var c=new a.constructor(a.source,Bm.exec(a));return c.lastIndex=a.lastIndex,c}function iM(a){return xs?nt(xs.call(a)):{}}function tb(a,c){var p=c?Ed(a.buffer):a.buffer;return new a.constructor(p,a.byteOffset,a.length)}function nb(a,c){if(a!==c){var p=a!==t,g=a===null,E=a===a,_=kn(a),M=c!==t,C=c===null,A=c===c,U=kn(c);if(!C&&!U&&!_&&a>c||_&&M&&A&&!C&&!U||g&&M&&A||!p&&A||!E)return 1;if(!g&&!_&&!U&&a=C)return A;var U=p[g];return A*(U=="desc"?-1:1)}}return a.index-c.index}function rb(a,c,p,g){for(var E=-1,_=a.length,M=p.length,C=-1,A=c.length,U=It(_-M,0),W=I(A+U),G=!g;++C1?p[E-1]:t,M=E>2?p[2]:t;for(_=a.length>3&&typeof _=="function"?(E--,_):t,M&&cn(p[0],p[1],M)&&(_=E<3?t:_,E=1),c=nt(c);++g-1?E[_?c[M]:M]:t}}function cb(a){return Ar(function(c){var p=c.length,g=p,E=Dn.prototype.thru;for(a&&c.reverse();g--;){var _=c[g];if(typeof _!="function")throw new Ln(i);if(E&&!M&&ol(_)=="wrapper")var M=new Dn([],!0)}for(g=M?g:p;++g1&&Ge.reverse(),W&&AC))return!1;var U=_.get(a),W=_.get(c);if(U&&W)return U==c&&W==a;var G=-1,te=!0,de=p&b?new Ri:t;for(_.set(a,c),_.set(c,a);++G1?"& ":"")+c[g],c=c.join(p>2?", ":" "),a.replace(xS,`{ +/* [wrapped with `+c+`] */ +`)}function wM(a){return Ne(a)||Bi(a)||!!(Sg&&a&&a[Sg])}function Nr(a,c){var p=typeof a;return c=c??P,!!c&&(p=="number"||p!="symbol"&&IS.test(a))&&a>-1&&a%1==0&&a0){if(++c>=oe)return arguments[0]}else c=0;return a.apply(t,arguments)}}function al(a,c){var p=-1,g=a.length,E=g-1;for(c=c===t?g:c;++p1?a[c-1]:t;return p=typeof p=="function"?(a.pop(),p):t,Lb(a,p)});function Db(a){var c=w(a);return c.__chain__=!0,c}function RC(a,c){return c(a),a}function ll(a,c){return c(a)}var IC=Ar(function(a){var c=a.length,p=c?a[0]:0,g=this.__wrapped__,E=function(_){return rd(_,a)};return c>1||this.__actions__.length||!(g instanceof Ke)||!Nr(p)?this.thru(E):(g=g.slice(p,+p+(c?1:0)),g.__actions__.push({func:ll,args:[E],thisArg:t}),new Dn(g,this.__chain__).thru(function(_){return c&&!_.length&&_.push(t),_}))});function LC(){return Db(this)}function DC(){return new Dn(this.value(),this.__chain__)}function PC(){this.__values__===t&&(this.__values__=Jb(this.value()));var a=this.__index__>=this.__values__.length,c=a?t:this.__values__[this.__index__++];return{done:a,value:c}}function BC(){return this}function FC(a){for(var c,p=this;p instanceof qa;){var g=kb(p);g.__index__=0,g.__values__=t,c?E.__wrapped__=g:c=g;var E=g;p=p.__wrapped__}return E.__wrapped__=a,c}function HC(){var a=this.__wrapped__;if(a instanceof Ke){var c=a;return this.__actions__.length&&(c=new Ke(this)),c=c.reverse(),c.__actions__.push({func:ll,args:[Od],thisArg:t}),new Dn(c,this.__chain__)}return this.thru(Od)}function zC(){return Zg(this.__wrapped__,this.__actions__)}var $C=el(function(a,c,p){et.call(a,p)?++a[p]:Cr(a,p,1)});function UC(a,c,p){var g=Ne(a)?ug:R1;return p&&cn(a,c,p)&&(c=t),g(a,ye(c,3))}function WC(a,c){var p=Ne(a)?Zr:Lg;return p(a,ye(c,3))}var KC=lb(Ab),VC=lb(Nb);function GC(a,c){return Gt(cl(a,c),1)}function qC(a,c){return Gt(cl(a,c),Ee)}function YC(a,c,p){return p=p===t?1:Re(p),Gt(cl(a,c),p)}function Pb(a,c){var p=Ne(a)?In:ni;return p(a,ye(c,3))}function Bb(a,c){var p=Ne(a)?pT:Ig;return p(a,ye(c,3))}var JC=el(function(a,c,p){et.call(a,p)?a[p].push(c):Cr(a,p,[c])});function XC(a,c,p,g){a=yn(a)?a:Io(a),p=p&&!g?Re(p):0;var E=a.length;return p<0&&(p=It(E+p,0)),hl(a)?p<=E&&a.indexOf(c,p)>-1:!!E&&xo(a,c,p)>-1}var ZC=Fe(function(a,c,p){var g=-1,E=typeof c=="function",_=yn(a)?I(a.length):[];return ni(a,function(M){_[++g]=E?Tn(c,M,p):Ts(M,c,p)}),_}),jC=el(function(a,c,p){Cr(a,p,c)});function cl(a,c){var p=Ne(a)?ut:zg;return p(a,ye(c,3))}function QC(a,c,p,g){return a==null?[]:(Ne(c)||(c=c==null?[]:[c]),p=g?t:p,Ne(p)||(p=p==null?[]:[p]),Kg(a,c,p))}var ek=el(function(a,c,p){a[p?0:1].push(c)},function(){return[[],[]]});function tk(a,c,p){var g=Ne(a)?Ku:hg,E=arguments.length<3;return g(a,ye(c,4),p,E,ni)}function nk(a,c,p){var g=Ne(a)?hT:hg,E=arguments.length<3;return g(a,ye(c,4),p,E,Ig)}function rk(a,c){var p=Ne(a)?Zr:Lg;return p(a,fl(ye(c,3)))}function ik(a){var c=Ne(a)?Ag:X1;return c(a)}function ok(a,c,p){(p?cn(a,c,p):c===t)?c=1:c=Re(c);var g=Ne(a)?C1:Z1;return g(a,c)}function sk(a){var c=Ne(a)?k1:Q1;return c(a)}function ak(a){if(a==null)return 0;if(yn(a))return hl(a)?So(a):a.length;var c=en(a);return c==st||c==ee?a.size:cd(a).length}function lk(a,c,p){var g=Ne(a)?Vu:eM;return p&&cn(a,c,p)&&(c=t),g(a,ye(c,3))}var ck=Fe(function(a,c){if(a==null)return[];var p=c.length;return p>1&&cn(a,c[0],c[1])?c=[]:p>2&&cn(c[0],c[1],c[2])&&(c=[c[0]]),Kg(a,Gt(c,1),[])}),ul=WT||function(){return Ft.Date.now()};function uk(a,c){if(typeof c!="function")throw new Ln(i);return a=Re(a),function(){if(--a<1)return c.apply(this,arguments)}}function Fb(a,c,p){return c=p?t:c,c=a&&c==null?a.length:c,kr(a,z,t,t,t,t,c)}function Hb(a,c){var p;if(typeof c!="function")throw new Ln(i);return a=Re(a),function(){return--a>0&&(p=c.apply(this,arguments)),a<=1&&(c=t),p}}var Id=Fe(function(a,c,p){var g=y;if(p.length){var E=Qr(p,Oo(Id));g|=L}return kr(a,g,c,p,E)}),zb=Fe(function(a,c,p){var g=y|v;if(p.length){var E=Qr(p,Oo(zb));g|=L}return kr(c,g,a,p,E)});function $b(a,c,p){c=p?t:c;var g=kr(a,S,t,t,t,t,t,c);return g.placeholder=$b.placeholder,g}function Ub(a,c,p){c=p?t:c;var g=kr(a,D,t,t,t,t,t,c);return g.placeholder=Ub.placeholder,g}function Wb(a,c,p){var g,E,_,M,C,A,U=0,W=!1,G=!1,te=!0;if(typeof a!="function")throw new Ln(i);c=Hn(c)||0,pt(p)&&(W=!!p.leading,G="maxWait"in p,_=G?It(Hn(p.maxWait)||0,c):_,te="trailing"in p?!!p.trailing:te);function de(vt){var tr=g,Ir=E;return g=E=t,U=vt,M=a.apply(Ir,tr),M}function ve(vt){return U=vt,C=Ns(ze,c),W?de(vt):M}function De(vt){var tr=vt-A,Ir=vt-U,ly=c-tr;return G?Qt(ly,_-Ir):ly}function we(vt){var tr=vt-A,Ir=vt-U;return A===t||tr>=c||tr<0||G&&Ir>=_}function ze(){var vt=ul();if(we(vt))return Ge(vt);C=Ns(ze,De(vt))}function Ge(vt){return C=t,te&&g?de(vt):(g=E=t,M)}function An(){C!==t&&Qg(C),U=0,g=A=E=C=t}function un(){return C===t?M:Ge(ul())}function Nn(){var vt=ul(),tr=we(vt);if(g=arguments,E=this,A=vt,tr){if(C===t)return ve(A);if(G)return Qg(C),C=Ns(ze,c),de(A)}return C===t&&(C=Ns(ze,c)),M}return Nn.cancel=An,Nn.flush=un,Nn}var dk=Fe(function(a,c){return Rg(a,1,c)}),fk=Fe(function(a,c,p){return Rg(a,Hn(c)||0,p)});function pk(a){return kr(a,Y)}function dl(a,c){if(typeof a!="function"||c!=null&&typeof c!="function")throw new Ln(i);var p=function(){var g=arguments,E=c?c.apply(this,g):g[0],_=p.cache;if(_.has(E))return _.get(E);var M=a.apply(this,g);return p.cache=_.set(E,M)||_,M};return p.cache=new(dl.Cache||Mr),p}dl.Cache=Mr;function fl(a){if(typeof a!="function")throw new Ln(i);return function(){var c=arguments;switch(c.length){case 0:return!a.call(this);case 1:return!a.call(this,c[0]);case 2:return!a.call(this,c[0],c[1]);case 3:return!a.call(this,c[0],c[1],c[2])}return!a.apply(this,c)}}function hk(a){return Hb(2,a)}var mk=tM(function(a,c){c=c.length==1&&Ne(c[0])?ut(c[0],Mn(ye())):ut(Gt(c,1),Mn(ye()));var p=c.length;return Fe(function(g){for(var E=-1,_=Qt(g.length,p);++E<_;)g[E]=c[E].call(this,g[E]);return Tn(a,this,g)})}),Ld=Fe(function(a,c){var p=Qr(c,Oo(Ld));return kr(a,L,t,c,p)}),Kb=Fe(function(a,c){var p=Qr(c,Oo(Kb));return kr(a,T,t,c,p)}),gk=Ar(function(a,c){return kr(a,O,t,t,t,c)});function bk(a,c){if(typeof a!="function")throw new Ln(i);return c=c===t?c:Re(c),Fe(a,c)}function yk(a,c){if(typeof a!="function")throw new Ln(i);return c=c==null?0:It(Re(c),0),Fe(function(p){var g=p[c],E=oi(p,0,c);return g&&jr(E,g),Tn(a,this,E)})}function Ek(a,c,p){var g=!0,E=!0;if(typeof a!="function")throw new Ln(i);return pt(p)&&(g="leading"in p?!!p.leading:g,E="trailing"in p?!!p.trailing:E),Wb(a,c,{leading:g,maxWait:c,trailing:E})}function vk(a){return Fb(a,1)}function wk(a,c){return Ld(yd(c),a)}function xk(){if(!arguments.length)return[];var a=arguments[0];return Ne(a)?a:[a]}function _k(a){return Pn(a,h)}function Sk(a,c){return c=typeof c=="function"?c:t,Pn(a,h,c)}function Tk(a){return Pn(a,d|h)}function Mk(a,c){return c=typeof c=="function"?c:t,Pn(a,d|h,c)}function Ck(a,c){return c==null||Og(a,c,Ht(c))}function er(a,c){return a===c||a!==a&&c!==c}var kk=il(sd),Ak=il(function(a,c){return a>=c}),Bi=Bg(function(){return arguments}())?Bg:function(a){return gt(a)&&et.call(a,"callee")&&!_g.call(a,"callee")},Ne=I.isArray,Nk=ig?Mn(ig):F1;function yn(a){return a!=null&&pl(a.length)&&!Or(a)}function Et(a){return gt(a)&&yn(a)}function Ok(a){return a===!0||a===!1||gt(a)&&ln(a)==Xe}var si=VT||Vd,Rk=og?Mn(og):H1;function Ik(a){return gt(a)&&a.nodeType===1&&!Os(a)}function Lk(a){if(a==null)return!0;if(yn(a)&&(Ne(a)||typeof a=="string"||typeof a.splice=="function"||si(a)||Ro(a)||Bi(a)))return!a.length;var c=en(a);if(c==st||c==ee)return!a.size;if(As(a))return!cd(a).length;for(var p in a)if(et.call(a,p))return!1;return!0}function Dk(a,c){return Ms(a,c)}function Pk(a,c,p){p=typeof p=="function"?p:t;var g=p?p(a,c):t;return g===t?Ms(a,c,t,p):!!g}function Dd(a){if(!gt(a))return!1;var c=ln(a);return c==Le||c==Pt||typeof a.message=="string"&&typeof a.name=="string"&&!Os(a)}function Bk(a){return typeof a=="number"&&Tg(a)}function Or(a){if(!pt(a))return!1;var c=ln(a);return c==_t||c==Zt||c==He||c==be}function Vb(a){return typeof a=="number"&&a==Re(a)}function pl(a){return typeof a=="number"&&a>-1&&a%1==0&&a<=P}function pt(a){var c=typeof a;return a!=null&&(c=="object"||c=="function")}function gt(a){return a!=null&&typeof a=="object"}var Gb=sg?Mn(sg):$1;function Fk(a,c){return a===c||ld(a,c,Td(c))}function Hk(a,c,p){return p=typeof p=="function"?p:t,ld(a,c,Td(c),p)}function zk(a){return qb(a)&&a!=+a}function $k(a){if(SM(a))throw new Ae(r);return Fg(a)}function Uk(a){return a===null}function Wk(a){return a==null}function qb(a){return typeof a=="number"||gt(a)&&ln(a)==jt}function Os(a){if(!gt(a)||ln(a)!=Nt)return!1;var c=za(a);if(c===null)return!0;var p=et.call(c,"constructor")&&c.constructor;return typeof p=="function"&&p instanceof p&&Pa.call(p)==HT}var Pd=ag?Mn(ag):U1;function Kk(a){return Vb(a)&&a>=-P&&a<=P}var Yb=lg?Mn(lg):W1;function hl(a){return typeof a=="string"||!Ne(a)&>(a)&&ln(a)==ke}function kn(a){return typeof a=="symbol"||gt(a)&&ln(a)==We}var Ro=cg?Mn(cg):K1;function Vk(a){return a===t}function Gk(a){return gt(a)&&en(a)==mt}function qk(a){return gt(a)&&ln(a)==Ot}var Yk=il(ud),Jk=il(function(a,c){return a<=c});function Jb(a){if(!a)return[];if(yn(a))return hl(a)?jn(a):bn(a);if(ys&&a[ys])return CT(a[ys]());var c=en(a),p=c==st?Zu:c==ee?Ia:Io;return p(a)}function Rr(a){if(!a)return a===0?a:0;if(a=Hn(a),a===Ee||a===-Ee){var c=a<0?-1:1;return c*N}return a===a?a:0}function Re(a){var c=Rr(a),p=c%1;return c===c?p?c-p:c:0}function Xb(a){return a?Ii(Re(a),0,V):0}function Hn(a){if(typeof a=="number")return a;if(kn(a))return R;if(pt(a)){var c=typeof a.valueOf=="function"?a.valueOf():a;a=pt(c)?c+"":c}if(typeof a!="string")return a===0?a:+a;a=mg(a);var p=NS.test(a);return p||RS.test(a)?uT(a.slice(2),p?2:8):AS.test(a)?R:+a}function Zb(a){return fr(a,En(a))}function Xk(a){return a?Ii(Re(a),-P,P):a===0?a:0}function Qe(a){return a==null?"":Cn(a)}var Zk=Ao(function(a,c){if(As(c)||yn(c)){fr(c,Ht(c),a);return}for(var p in c)et.call(c,p)&&_s(a,p,c[p])}),jb=Ao(function(a,c){fr(c,En(c),a)}),ml=Ao(function(a,c,p,g){fr(c,En(c),a,g)}),jk=Ao(function(a,c,p,g){fr(c,Ht(c),a,g)}),Qk=Ar(rd);function eA(a,c){var p=ko(a);return c==null?p:Ng(p,c)}var tA=Fe(function(a,c){a=nt(a);var p=-1,g=c.length,E=g>2?c[2]:t;for(E&&cn(c[0],c[1],E)&&(g=1);++p1),_}),fr(a,_d(a),p),g&&(p=Pn(p,d|f|h,fM));for(var E=c.length;E--;)md(p,c[E]);return p});function EA(a,c){return ey(a,fl(ye(c)))}var vA=Ar(function(a,c){return a==null?{}:q1(a,c)});function ey(a,c){if(a==null)return{};var p=ut(_d(a),function(g){return[g]});return c=ye(c),Vg(a,p,function(g,E){return c(g,E[0])})}function wA(a,c,p){c=ii(c,a);var g=-1,E=c.length;for(E||(E=1,a=t);++gc){var g=a;a=c,c=g}if(p||a%1||c%1){var E=Mg();return Qt(a+E*(c-a+cT("1e-"+((E+"").length-1))),c)}return fd(a,c)}var RA=No(function(a,c,p){return c=c.toLowerCase(),a+(p?ry(c):c)});function ry(a){return Hd(Qe(a).toLowerCase())}function iy(a){return a=Qe(a),a&&a.replace(LS,xT).replace(QS,"")}function IA(a,c,p){a=Qe(a),c=Cn(c);var g=a.length;p=p===t?g:Ii(Re(p),0,g);var E=p;return p-=c.length,p>=0&&a.slice(p,E)==c}function LA(a){return a=Qe(a),a&&Ca.test(a)?a.replace(an,_T):a}function DA(a){return a=Qe(a),a&&vS.test(a)?a.replace(Xr,"\\$&"):a}var PA=No(function(a,c,p){return a+(p?"-":"")+c.toLowerCase()}),BA=No(function(a,c,p){return a+(p?" ":"")+c.toLowerCase()}),FA=ab("toLowerCase");function HA(a,c,p){a=Qe(a),c=Re(c);var g=c?So(a):0;if(!c||g>=c)return a;var E=(c-g)/2;return rl(Ka(E),p)+a+rl(Wa(E),p)}function zA(a,c,p){a=Qe(a),c=Re(c);var g=c?So(a):0;return c&&g>>0,p?(a=Qe(a),a&&(typeof c=="string"||c!=null&&!Pd(c))&&(c=Cn(c),!c&&_o(a))?oi(jn(a),0,p):a.split(c,p)):[]}var qA=No(function(a,c,p){return a+(p?" ":"")+Hd(c)});function YA(a,c,p){return a=Qe(a),p=p==null?0:Ii(Re(p),0,a.length),c=Cn(c),a.slice(p,p+c.length)==c}function JA(a,c,p){var g=w.templateSettings;p&&cn(a,c,p)&&(c=t),a=Qe(a),c=ml({},c,g,hb);var E=ml({},c.imports,g.imports,hb),_=Ht(E),M=Xu(E,_),C,A,U=0,W=c.interpolate||ka,G="__p += '",te=ju((c.escape||ka).source+"|"+W.source+"|"+(W===ki?kS:ka).source+"|"+(c.evaluate||ka).source+"|$","g"),de="//# sourceURL="+(et.call(c,"sourceURL")?(c.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++iT+"]")+` +`;a.replace(te,function(we,ze,Ge,An,un,Nn){return Ge||(Ge=An),G+=a.slice(U,Nn).replace(DS,ST),ze&&(C=!0,G+=`' + +__e(`+ze+`) + +'`),un&&(A=!0,G+=`'; +`+un+`; +__p += '`),Ge&&(G+=`' + +((__t = (`+Ge+`)) == null ? '' : __t) + +'`),U=Nn+we.length,we}),G+=`'; +`;var ve=et.call(c,"variable")&&c.variable;if(!ve)G=`with (obj) { +`+G+` +} +`;else if(MS.test(ve))throw new Ae(o);G=(A?G.replace(_e,""):G).replace(Ze,"$1").replace(Ve,"$1;"),G="function("+(ve||"obj")+`) { +`+(ve?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(C?", __e = _.escape":"")+(A?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+G+`return __p +}`;var De=sy(function(){return je(_,de+"return "+G).apply(t,M)});if(De.source=G,Dd(De))throw De;return De}function XA(a){return Qe(a).toLowerCase()}function ZA(a){return Qe(a).toUpperCase()}function jA(a,c,p){if(a=Qe(a),a&&(p||c===t))return mg(a);if(!a||!(c=Cn(c)))return a;var g=jn(a),E=jn(c),_=gg(g,E),M=bg(g,E)+1;return oi(g,_,M).join("")}function QA(a,c,p){if(a=Qe(a),a&&(p||c===t))return a.slice(0,Eg(a)+1);if(!a||!(c=Cn(c)))return a;var g=jn(a),E=bg(g,jn(c))+1;return oi(g,0,E).join("")}function eN(a,c,p){if(a=Qe(a),a&&(p||c===t))return a.replace(Du,"");if(!a||!(c=Cn(c)))return a;var g=jn(a),E=gg(g,jn(c));return oi(g,E).join("")}function tN(a,c){var p=ie,g=$;if(pt(c)){var E="separator"in c?c.separator:E;p="length"in c?Re(c.length):p,g="omission"in c?Cn(c.omission):g}a=Qe(a);var _=a.length;if(_o(a)){var M=jn(a);_=M.length}if(p>=_)return a;var C=p-So(g);if(C<1)return g;var A=M?oi(M,0,C).join(""):a.slice(0,C);if(E===t)return A+g;if(M&&(C+=A.length-C),Pd(E)){if(a.slice(C).search(E)){var U,W=A;for(E.global||(E=ju(E.source,Qe(Bm.exec(E))+"g")),E.lastIndex=0;U=E.exec(W);)var G=U.index;A=A.slice(0,G===t?C:G)}}else if(a.indexOf(Cn(E),C)!=C){var te=A.lastIndexOf(E);te>-1&&(A=A.slice(0,te))}return A+g}function nN(a){return a=Qe(a),a&&Yr.test(a)?a.replace(Bt,OT):a}var rN=No(function(a,c,p){return a+(p?" ":"")+c.toUpperCase()}),Hd=ab("toUpperCase");function oy(a,c,p){return a=Qe(a),c=p?t:c,c===t?MT(a)?LT(a):bT(a):a.match(c)||[]}var sy=Fe(function(a,c){try{return Tn(a,t,c)}catch(p){return Dd(p)?p:new Ae(p)}}),iN=Ar(function(a,c){return In(c,function(p){p=pr(p),Cr(a,p,Id(a[p],a))}),a});function oN(a){var c=a==null?0:a.length,p=ye();return a=c?ut(a,function(g){if(typeof g[1]!="function")throw new Ln(i);return[p(g[0]),g[1]]}):[],Fe(function(g){for(var E=-1;++EP)return[];var p=V,g=Qt(a,V);c=ye(c),a-=V;for(var E=Ju(g,c);++p0||c<0)?new Ke(p):(a<0?p=p.takeRight(-a):a&&(p=p.drop(a)),c!==t&&(c=Re(c),p=c<0?p.dropRight(-c):p.take(c-a)),p)},Ke.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},Ke.prototype.toArray=function(){return this.take(V)},dr(Ke.prototype,function(a,c){var p=/^(?:filter|find|map|reject)|While$/.test(c),g=/^(?:head|last)$/.test(c),E=w[g?"take"+(c=="last"?"Right":""):c],_=g||/^find/.test(c);E&&(w.prototype[c]=function(){var M=this.__wrapped__,C=g?[1]:arguments,A=M instanceof Ke,U=C[0],W=A||Ne(M),G=function(ze){var Ge=E.apply(w,jr([ze],C));return g&&te?Ge[0]:Ge};W&&p&&typeof U=="function"&&U.length!=1&&(A=W=!1);var te=this.__chain__,de=!!this.__actions__.length,ve=_&&!te,De=A&&!de;if(!_&&W){M=De?M:new Ke(this);var we=a.apply(M,C);return we.__actions__.push({func:ll,args:[G],thisArg:t}),new Dn(we,te)}return ve&&De?a.apply(this,C):(we=this.thru(G),ve?g?we.value()[0]:we.value():we)})}),In(["pop","push","shift","sort","splice","unshift"],function(a){var c=La[a],p=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",g=/^(?:pop|shift)$/.test(a);w.prototype[a]=function(){var E=arguments;if(g&&!this.__chain__){var _=this.value();return c.apply(Ne(_)?_:[],E)}return this[p](function(M){return c.apply(Ne(M)?M:[],E)})}}),dr(Ke.prototype,function(a,c){var p=w[c];if(p){var g=p.name+"";et.call(Co,g)||(Co[g]=[]),Co[g].push({name:c,func:p})}}),Co[tl(t,v).name]=[{name:"wrapper",func:t}],Ke.prototype.clone=n1,Ke.prototype.reverse=r1,Ke.prototype.value=i1,w.prototype.at=IC,w.prototype.chain=LC,w.prototype.commit=DC,w.prototype.next=PC,w.prototype.plant=FC,w.prototype.reverse=HC,w.prototype.toJSON=w.prototype.valueOf=w.prototype.value=zC,w.prototype.first=w.prototype.head,ys&&(w.prototype[ys]=BC),w},ei=DT();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Ft._=ei,define(function(){return ei})):Ai?((Ai.exports=ei)._=ei,$u._=ei):Ft._=ei}).call(hs)});function tn(t){this.content=t}tn.prototype={constructor:tn,find:function(t){for(var e=0;e>1}};tn.from=function(t){if(t instanceof tn)return t;var e=[];if(t)for(var n in t)e.push(n,t[n]);return new tn(e)};var Jd=tn;function my(t,e,n){for(let r=0;;r++){if(r==t.childCount||r==e.childCount)return t.childCount==e.childCount?null:n;let i=t.child(r),o=e.child(r);if(i==o){n+=i.nodeSize;continue}if(!i.sameMarkup(o))return n;if(i.isText&&i.text!=o.text){for(let s=0;i.text[s]==o.text[s];s++)n++;return n}if(i.content.size||o.content.size){let s=my(i.content,o.content,n+1);if(s!=null)return s}n+=i.nodeSize}}function gy(t,e,n,r){for(let i=t.childCount,o=e.childCount;;){if(i==0||o==0)return i==o?null:{a:n,b:r};let s=t.child(--i),l=e.child(--o),u=s.nodeSize;if(s==l){n-=u,r-=u;continue}if(!s.sameMarkup(l))return{a:n,b:r};if(s.isText&&s.text!=l.text){let d=0,f=Math.min(s.text.length,l.text.length);for(;de&&r(u,i+l,o||null,s)!==!1&&u.content.size){let f=l+1;u.nodesBetween(Math.max(0,e-f),Math.min(u.content.size,n-f),r,i+f)}l=d}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,n,r,i){let o="",s=!0;return this.nodesBetween(e,n,(l,u)=>{let d=l.isText?l.text.slice(Math.max(e,u)-u,n-u):l.isLeaf?i?typeof i=="function"?i(l):i:l.type.spec.leafText?l.type.spec.leafText(l):"":"";l.isBlock&&(l.isLeaf&&d||l.isTextblock)&&r&&(s?s=!1:o+=r),o+=d},0),o}append(e){if(!e.size)return this;if(!this.size)return e;let n=this.lastChild,r=e.firstChild,i=this.content.slice(),o=0;for(n.isText&&n.sameMarkup(r)&&(i[i.length-1]=n.withText(n.text+r.text),o=1);oe)for(let o=0,s=0;se&&((sn)&&(l.isText?l=l.cut(Math.max(0,e-s),Math.min(l.text.length,n-s)):l=l.cut(Math.max(0,e-s-1),Math.min(l.content.size,n-s-1))),r.push(l),i+=l.nodeSize),s=u}return new t(r,i)}cutByIndex(e,n){return e==n?t.empty:e==0&&n==this.content.length?this:new t(this.content.slice(e,n))}replaceChild(e,n){let r=this.content[e];if(r==n)return this;let i=this.content.slice(),o=this.size+n.nodeSize-r.nodeSize;return i[e]=n,new t(i,o)}addToStart(e){return new t([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new t(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let n=0;nthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let r=0,i=0;;r++){let o=this.child(r),s=i+o.nodeSize;if(s>=e)return s==e||n>0?gl(r+1,s):gl(r,i);i=s}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map(e=>e.toJSON()):null}static fromJSON(e,n){if(!n)return t.empty;if(!Array.isArray(n))throw new RangeError("Invalid input for Fragment.fromJSON");return new t(n.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return t.empty;let n,r=0;for(let i=0;ithis.type.rank&&(n||(n=e.slice(0,i)),n.push(this),r=!0),n&&n.push(o)}}return n||(n=e.slice()),r||n.push(this),n}removeFromSet(e){for(let n=0;nr.type.rank-i.type.rank),n}};Ye.none=[];var zi=class extends Error{},X=class t{constructor(e,n,r){this.content=e,this.openStart=n,this.openEnd=r}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,n){let r=yy(this.content,e+this.openStart,n);return r&&new t(r,this.openStart,this.openEnd)}removeBetween(e,n){return new t(by(this.content,e+this.openStart,n+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,n){if(!n)return t.empty;let r=n.openStart||0,i=n.openEnd||0;if(typeof r!="number"||typeof i!="number")throw new RangeError("Invalid input for Slice.fromJSON");return new t(K.fromJSON(e,n.content),r,i)}static maxOpen(e,n=!0){let r=0,i=0;for(let o=e.firstChild;o&&!o.isLeaf&&(n||!o.type.spec.isolating);o=o.firstChild)r++;for(let o=e.lastChild;o&&!o.isLeaf&&(n||!o.type.spec.isolating);o=o.lastChild)i++;return new t(e,r,i)}};X.empty=new X(K.empty,0,0);function by(t,e,n){let{index:r,offset:i}=t.findIndex(e),o=t.maybeChild(r),{index:s,offset:l}=t.findIndex(n);if(i==e||o.isText){if(l!=n&&!t.child(s).isText)throw new RangeError("Removing non-flat range");return t.cut(0,e).append(t.cut(n))}if(r!=s)throw new RangeError("Removing non-flat range");return t.replaceChild(r,o.copy(by(o.content,e-i-1,n-i-1)))}function yy(t,e,n,r){let{index:i,offset:o}=t.findIndex(e),s=t.maybeChild(i);if(o==e||s.isText)return r&&!r.canReplace(i,i,n)?null:t.cut(0,e).append(n).append(t.cut(e));let l=yy(s.content,e-o-1,n);return l&&t.replaceChild(i,s.copy(l))}function XN(t,e,n){if(n.openStart>t.depth)throw new zi("Inserted content deeper than insertion position");if(t.depth-n.openStart!=e.depth-n.openEnd)throw new zi("Inconsistent open depths");return Ey(t,e,n,0)}function Ey(t,e,n,r){let i=t.index(r),o=t.node(r);if(i==e.index(r)&&r=0&&t.isText&&t.sameMarkup(e[n])?e[n]=t.withText(e[n].text+t.text):e.push(t)}function Rs(t,e,n,r){let i=(e||t).node(n),o=0,s=e?e.index(n):i.childCount;t&&(o=t.index(n),t.depth>n?o++:t.textOffset&&(Fi(t.nodeAfter,r),o++));for(let l=o;li&&ef(t,e,i+1),s=r.depth>i&&ef(n,r,i+1),l=[];return Rs(null,t,i,l),o&&s&&e.index(i)==n.index(i)?(vy(o,s),Fi(Hi(o,wy(t,e,n,r,i+1)),l)):(o&&Fi(Hi(o,yl(t,e,i+1)),l),Rs(e,n,i,l),s&&Fi(Hi(s,yl(n,r,i+1)),l)),Rs(r,null,i,l),new K(l)}function yl(t,e,n){let r=[];if(Rs(null,t,n,r),t.depth>n){let i=ef(t,e,n+1);Fi(Hi(i,yl(t,e,n+1)),r)}return Rs(e,null,n,r),new K(r)}function ZN(t,e){let n=e.depth-t.openStart,i=e.node(n).copy(t.content);for(let o=n-1;o>=0;o--)i=e.node(o).copy(K.from(i));return{start:i.resolveNoCache(t.openStart+n),end:i.resolveNoCache(i.content.size-t.openEnd-n)}}var El=class t{constructor(e,n,r){this.pos=e,this.path=n,this.parentOffset=r,this.depth=n.length/3-1}resolveDepth(e){return e==null?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[this.resolveDepth(e)*3]}index(e){return this.path[this.resolveDepth(e)*3+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e==this.depth&&!this.textOffset?0:1)}start(e){return e=this.resolveDepth(e),e==0?0:this.path[e*3-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]}after(e){if(e=this.resolveDepth(e),!e)throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[e*3-1]+this.path[e*3].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,n=this.index(this.depth);if(n==e.childCount)return null;let r=this.pos-this.path[this.path.length-1],i=e.child(n);return r?e.child(n).cut(r):i}get nodeBefore(){let e=this.index(this.depth),n=this.pos-this.path[this.path.length-1];return n?this.parent.child(e).cut(0,n):e==0?null:this.parent.child(e-1)}posAtIndex(e,n){n=this.resolveDepth(n);let r=this.path[n*3],i=n==0?0:this.path[n*3-1]+1;for(let o=0;o0;n--)if(this.start(n)<=e&&this.end(n)>=e)return n;return 0}blockRange(e=this,n){if(e.pos=0;r--)if(e.pos<=this.end(r)&&(!n||n(this.node(r))))return new $i(this,e,r);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&n<=e.content.size))throw new RangeError("Position "+n+" out of range");let r=[],i=0,o=n;for(let s=e;;){let{index:l,offset:u}=s.content.findIndex(o),d=o-u;if(r.push(s,l,i+u),!d||(s=s.child(l),s.isText))break;o=d-1,i+=u+1}return new t(n,r,o)}static resolveCached(e,n){for(let i=0;ie&&this.nodesBetween(e,n,o=>(r.isInSet(o.marks)&&(i=!0),!i)),i}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),xy(this.marks,e)}contentMatchAt(e){let n=this.type.contentMatch.matchFragment(this.content,0,e);if(!n)throw new Error("Called contentMatchAt on a node with invalid content");return n}canReplace(e,n,r=K.empty,i=0,o=r.childCount){let s=this.contentMatchAt(e).matchFragment(r,i,o),l=s&&s.matchFragment(this.content,n);if(!l||!l.validEnd)return!1;for(let u=i;un.type.name)}`);this.content.forEach(n=>n.check())}toJSON(){let e={type:this.type.name};for(let n in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map(n=>n.toJSON())),e}static fromJSON(e,n){if(!n)throw new RangeError("Invalid input for Node.fromJSON");let r=null;if(n.marks){if(!Array.isArray(n.marks))throw new RangeError("Invalid mark data for Node.fromJSON");r=n.marks.map(e.markFromJSON)}if(n.type=="text"){if(typeof n.text!="string")throw new RangeError("Invalid text node in JSON");return e.text(n.text,r)}let i=K.fromJSON(e,n.content);return e.nodeType(n.type).create(n.attrs,i,r)}};nr.prototype.text=void 0;var tf=class t extends nr{constructor(e,n,r,i){if(super(e,n,null,i),!r)throw new RangeError("Empty text nodes are not allowed");this.text=r}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):xy(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,n){return this.text.slice(e,n)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new t(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new t(this.type,this.attrs,e,this.marks)}cut(e=0,n=this.text.length){return e==0&&n==this.text.length?this:this.withText(this.text.slice(e,n))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}};function xy(t,e){for(let n=t.length-1;n>=0;n--)e=t[n].type.name+"("+e+")";return e}var Ui=class t{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,n){let r=new nf(e,n);if(r.next==null)return t.empty;let i=_y(r);r.next&&r.err("Unexpected trailing text");let o=sO(oO(i));return aO(o,r),o}matchType(e){for(let n=0;nd.createAndFill()));for(let d=0;d=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];function n(r){e.push(r);for(let i=0;i{let o=i+(r.validEnd?"*":" ")+" ";for(let s=0;s"+e.indexOf(r.next[s].next);return o}).join(` +`)}};Ui.empty=new Ui(!0);var nf=class{constructor(e,n){this.string=e,this.nodeTypes=n,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),this.tokens[this.tokens.length-1]==""&&this.tokens.pop(),this.tokens[0]==""&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}};function _y(t){let e=[];do e.push(eO(t));while(t.eat("|"));return e.length==1?e[0]:{type:"choice",exprs:e}}function eO(t){let e=[];do e.push(tO(t));while(t.next&&t.next!=")"&&t.next!="|");return e.length==1?e[0]:{type:"seq",exprs:e}}function tO(t){let e=iO(t);for(;;)if(t.eat("+"))e={type:"plus",expr:e};else if(t.eat("*"))e={type:"star",expr:e};else if(t.eat("?"))e={type:"opt",expr:e};else if(t.eat("{"))e=nO(t,e);else break;return e}function cy(t){/\D/.test(t.next)&&t.err("Expected number, got '"+t.next+"'");let e=Number(t.next);return t.pos++,e}function nO(t,e){let n=cy(t),r=n;return t.eat(",")&&(t.next!="}"?r=cy(t):r=-1),t.eat("}")||t.err("Unclosed braced range"),{type:"range",min:n,max:r,expr:e}}function rO(t,e){let n=t.nodeTypes,r=n[e];if(r)return[r];let i=[];for(let o in n){let s=n[o];s.groups.indexOf(e)>-1&&i.push(s)}return i.length==0&&t.err("No node type or group '"+e+"' found"),i}function iO(t){if(t.eat("(")){let e=_y(t);return t.eat(")")||t.err("Missing closing paren"),e}else if(/\W/.test(t.next))t.err("Unexpected token '"+t.next+"'");else{let e=rO(t,t.next).map(n=>(t.inline==null?t.inline=n.isInline:t.inline!=n.isInline&&t.err("Mixing inline and block content"),{type:"name",value:n}));return t.pos++,e.length==1?e[0]:{type:"choice",exprs:e}}}function oO(t){let e=[[]];return i(o(t,0),n()),e;function n(){return e.push([])-1}function r(s,l,u){let d={term:u,to:l};return e[s].push(d),d}function i(s,l){s.forEach(u=>u.to=l)}function o(s,l){if(s.type=="choice")return s.exprs.reduce((u,d)=>u.concat(o(d,l)),[]);if(s.type=="seq")for(let u=0;;u++){let d=o(s.exprs[u],l);if(u==s.exprs.length-1)return d;i(d,l=n())}else if(s.type=="star"){let u=n();return r(l,u),i(o(s.expr,u),u),[r(u)]}else if(s.type=="plus"){let u=n();return i(o(s.expr,l),u),i(o(s.expr,u),u),[r(u)]}else{if(s.type=="opt")return[r(l)].concat(o(s.expr,l));if(s.type=="range"){let u=l;for(let d=0;d{t[s].forEach(({term:l,to:u})=>{if(!l)return;let d;for(let f=0;f{d||i.push([l,d=[]]),d.indexOf(f)==-1&&d.push(f)})})});let o=e[r.join(",")]=new Ui(r.indexOf(t.length-1)>-1);for(let s=0;s-1}allowsMarks(e){if(this.markSet==null)return!0;for(let n=0;nr[o]=new t(o,n,s));let i=n.spec.topNode||"doc";if(!r[i])throw new RangeError("Schema is missing its top node type ('"+i+"')");if(!r.text)throw new RangeError("Every schema needs a 'text' type");for(let o in r.text.attrs)throw new RangeError("The text node type should not have attributes");return r}},rf=class{constructor(e){this.hasDefault=Object.prototype.hasOwnProperty.call(e,"default"),this.default=e.default}get isRequired(){return!this.hasDefault}},Ls=class t{constructor(e,n,r,i){this.name=e,this.rank=n,this.schema=r,this.spec=i,this.attrs=Cy(i.attrs),this.excluded=null;let o=Ty(this.attrs);this.instance=o?new Ye(this,o):null}create(e=null){return!e&&this.instance?this.instance:new Ye(this,My(this.attrs,e))}static compile(e,n){let r=Object.create(null),i=0;return e.forEach((o,s)=>r[o]=new t(o,i++,n,s)),r}removeFromSet(e){for(var n=0;n-1}},wl=class{constructor(e){this.cached=Object.create(null);let n=this.spec={};for(let i in e)n[i]=e[i];n.nodes=Jd.from(e.nodes),n.marks=Jd.from(e.marks||{}),this.nodes=vl.compile(this.spec.nodes,this),this.marks=Ls.compile(this.spec.marks,this);let r=Object.create(null);for(let i in this.nodes){if(i in this.marks)throw new RangeError(i+" can not be both a node and a mark");let o=this.nodes[i],s=o.spec.content||"",l=o.spec.marks;o.contentMatch=r[s]||(r[s]=Ui.parse(s,this.nodes)),o.inlineContent=o.contentMatch.inlineContent,o.markSet=l=="_"?null:l?dy(this,l.split(" ")):l==""||!o.inlineContent?[]:null}for(let i in this.marks){let o=this.marks[i],s=o.spec.excludes;o.excluded=s==null?[o]:s==""?[]:dy(this,s.split(" "))}this.nodeFromJSON=this.nodeFromJSON.bind(this),this.markFromJSON=this.markFromJSON.bind(this),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,n=null,r,i){if(typeof e=="string")e=this.nodeType(e);else if(e instanceof vl){if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}else throw new RangeError("Invalid node type: "+e);return e.createChecked(n,r,i)}text(e,n){let r=this.nodes.text;return new tf(r,r.defaultAttrs,e,Ye.setFrom(n))}mark(e,n){return typeof e=="string"&&(e=this.marks[e]),e.create(n)}nodeFromJSON(e){return nr.fromJSON(this,e)}markFromJSON(e){return Ye.fromJSON(this,e)}nodeType(e){let n=this.nodes[e];if(!n)throw new RangeError("Unknown node type: "+e);return n}};function dy(t,e){let n=[];for(let r=0;r-1)&&n.push(s=u)}if(!s)throw new SyntaxError("Unknown mark type: '"+e[r]+"'")}return n}var Wi=class t{constructor(e,n){this.schema=e,this.rules=n,this.tags=[],this.styles=[],n.forEach(r=>{r.tag?this.tags.push(r):r.style&&this.styles.push(r)}),this.normalizeLists=!this.tags.some(r=>{if(!/^(ul|ol)\b/.test(r.tag)||!r.node)return!1;let i=e.nodes[r.node];return i.contentMatch.matchType(i)})}parse(e,n={}){let r=new Sl(this,n,!1);return r.addAll(e,n.from,n.to),r.finish()}parseSlice(e,n={}){let r=new Sl(this,n,!0);return r.addAll(e,n.from,n.to),X.maxOpen(r.finish())}matchTag(e,n,r){for(let i=r?this.tags.indexOf(r)+1:0;ie.length&&(l.charCodeAt(e.length)!=61||l.slice(e.length+1)!=n))){if(s.getAttrs){let u=s.getAttrs(n);if(u===!1)continue;s.attrs=u||void 0}return s}}}static schemaRules(e){let n=[];function r(i){let o=i.priority==null?50:i.priority,s=0;for(;s{r(s=py(s)),s.mark||s.ignore||s.clearMark||(s.mark=i)})}for(let i in e.nodes){let o=e.nodes[i].spec.parseDOM;o&&o.forEach(s=>{r(s=py(s)),s.node||s.ignore||s.mark||(s.node=i)})}return n}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new t(e,t.schemaRules(e)))}},ky={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},lO={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},Ay={ol:!0,ul:!0},xl=1,_l=2,Is=4;function fy(t,e,n){return e!=null?(e?xl:0)|(e==="full"?_l:0):t&&t.whitespace=="pre"?xl|_l:n&~Is}var Lo=class{constructor(e,n,r,i,o,s,l){this.type=e,this.attrs=n,this.marks=r,this.pendingMarks=i,this.solid=o,this.options=l,this.content=[],this.activeMarks=Ye.none,this.stashMarks=[],this.match=s||(l&Is?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let n=this.type.contentMatch.fillBefore(K.from(e));if(n)this.match=this.type.contentMatch.matchFragment(n);else{let r=this.type.contentMatch,i;return(i=r.findWrapping(e.type))?(this.match=r,i):null}}return this.match.findWrapping(e.type)}finish(e){if(!(this.options&xl)){let r=this.content[this.content.length-1],i;if(r&&r.isText&&(i=/[ \t\r\n\u000c]+$/.exec(r.text))){let o=r;r.text.length==i[0].length?this.content.pop():this.content[this.content.length-1]=o.withText(o.text.slice(0,o.text.length-i[0].length))}}let n=K.from(this.content);return!e&&this.match&&(n=n.append(this.match.fillBefore(K.empty,!0))),this.type?this.type.create(this.attrs,n,this.marks):n}popFromStashMark(e){for(let n=this.stashMarks.length-1;n>=0;n--)if(e.eq(this.stashMarks[n]))return this.stashMarks.splice(n,1)[0]}applyPending(e){for(let n=0,r=this.pendingMarks;nthis.addAll(e)),s&&this.sync(l),this.needsBlock=u}else this.withStyleRules(e,()=>{this.addElementByRule(e,o,o.consuming===!1?i:void 0)})}leafFallback(e){e.nodeName=="BR"&&this.top.type&&this.top.type.inlineContent&&this.addTextNode(e.ownerDocument.createTextNode(` +`))}ignoreFallback(e){e.nodeName=="BR"&&(!this.top.type||!this.top.type.inlineContent)&&this.findPlace(this.parser.schema.text("-"))}readStyles(e){let n=Ye.none,r=Ye.none;for(let i=0;i{s.clearMark(l)&&(r=l.addToSet(r))}):n=this.parser.schema.marks[s.mark].create(s.attrs).addToSet(n),s.consuming===!1)o=s;else break}return[n,r]}addElementByRule(e,n,r){let i,o,s;n.node?(o=this.parser.schema.nodes[n.node],o.isLeaf?this.insertNode(o.create(n.attrs))||this.leafFallback(e):i=this.enter(o,n.attrs||null,n.preserveWhitespace)):(s=this.parser.schema.marks[n.mark].create(n.attrs),this.addPendingMark(s));let l=this.top;if(o&&o.isLeaf)this.findInside(e);else if(r)this.addElement(e,r);else if(n.getContent)this.findInside(e),n.getContent(e,this.parser.schema).forEach(u=>this.insertNode(u));else{let u=e;typeof n.contentElement=="string"?u=e.querySelector(n.contentElement):typeof n.contentElement=="function"?u=n.contentElement(e):n.contentElement&&(u=n.contentElement),this.findAround(e,u,!0),this.addAll(u)}i&&this.sync(l)&&this.open--,s&&this.removePendingMark(s,l)}addAll(e,n,r){let i=n||0;for(let o=n?e.childNodes[n]:e.firstChild,s=r==null?null:e.childNodes[r];o!=s;o=o.nextSibling,++i)this.findAtPoint(e,i),this.addDOM(o);this.findAtPoint(e,i)}findPlace(e){let n,r;for(let i=this.open;i>=0;i--){let o=this.nodes[i],s=o.findWrapping(e);if(s&&(!n||n.length>s.length)&&(n=s,r=o,!s.length)||o.solid)break}if(!n)return!1;this.sync(r);for(let i=0;ithis.open){for(;n>this.open;n--)this.nodes[n-1].content.push(this.nodes[n].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(this.isOpen||this.options.topOpen)}sync(e){for(let n=this.open;n>=0;n--)if(this.nodes[n]==e)return this.open=n,!0;return!1}get currentPos(){this.closeExtra();let e=0;for(let n=this.open;n>=0;n--){let r=this.nodes[n].content;for(let i=r.length-1;i>=0;i--)e+=r[i].nodeSize;n&&e++}return e}findAtPoint(e,n){if(this.find)for(let r=0;r-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let n=e.split("/"),r=this.options.context,i=!this.isOpen&&(!r||r.parent.type==this.nodes[0].type),o=-(r?r.depth+1:0)+(i?0:1),s=(l,u)=>{for(;l>=0;l--){let d=n[l];if(d==""){if(l==n.length-1||l==0)continue;for(;u>=o;u--)if(s(l-1,u))return!0;return!1}else{let f=u>0||u==0&&i?this.nodes[u].type:r&&u>=o?r.node(u-o).type:null;if(!f||f.name!=d&&f.groups.indexOf(d)==-1)return!1;u--}}return!0};return s(n.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let n=e.depth;n>=0;n--){let r=e.node(n).contentMatchAt(e.indexAfter(n)).defaultType;if(r&&r.isTextblock&&r.defaultAttrs)return r}for(let n in this.parser.schema.nodes){let r=this.parser.schema.nodes[n];if(r.isTextblock&&r.defaultAttrs)return r}}addPendingMark(e){let n=pO(e,this.top.pendingMarks);n&&this.top.stashMarks.push(n),this.top.pendingMarks=e.addToSet(this.top.pendingMarks)}removePendingMark(e,n){for(let r=this.open;r>=0;r--){let i=this.nodes[r];if(i.pendingMarks.lastIndexOf(e)>-1)i.pendingMarks=e.removeFromSet(i.pendingMarks);else{i.activeMarks=e.removeFromSet(i.activeMarks);let s=i.popFromStashMark(e);s&&i.type&&i.type.allowsMarkType(s.type)&&(i.activeMarks=s.addToSet(i.activeMarks))}if(i==n)break}}};function cO(t){for(let e=t.firstChild,n=null;e;e=e.nextSibling){let r=e.nodeType==1?e.nodeName.toLowerCase():null;r&&Ay.hasOwnProperty(r)&&n?(n.appendChild(e),e=n):r=="li"?n=e:r&&(n=null)}}function uO(t,e){return(t.matches||t.msMatchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector).call(t,e)}function dO(t){let e=/\s*([\w-]+)\s*:\s*([^;]+)/g,n,r=[];for(;n=e.exec(t);)r.push(n[1],n[2].trim());return r}function py(t){let e={};for(let n in t)e[n]=t[n];return e}function fO(t,e){let n=e.schema.nodes;for(let r in n){let i=n[r];if(!i.allowsMarkType(t))continue;let o=[],s=l=>{o.push(l);for(let u=0;u{if(o.length||s.marks.length){let l=0,u=0;for(;l=0;i--){let o=this.serializeMark(e.marks[i],e.isInline,n);o&&((o.contentDOM||o.dom).appendChild(r),r=o.dom)}return r}serializeMark(e,n,r={}){let i=this.marks[e.type.name];return i&&t.renderSpec(Qd(r),i(e,n))}static renderSpec(e,n,r=null){if(typeof n=="string")return{dom:e.createTextNode(n)};if(n.nodeType!=null)return{dom:n};if(n.dom&&n.dom.nodeType!=null)return n;let i=n[0],o=i.indexOf(" ");o>0&&(r=i.slice(0,o),i=i.slice(o+1));let s,l=r?e.createElementNS(r,i):e.createElement(i),u=n[1],d=1;if(u&&typeof u=="object"&&u.nodeType==null&&!Array.isArray(u)){d=2;for(let f in u)if(u[f]!=null){let h=f.indexOf(" ");h>0?l.setAttributeNS(f.slice(0,h),f.slice(h+1),u[f]):l.setAttribute(f,u[f])}}for(let f=d;fd)throw new RangeError("Content hole must be the only child of its parent node");return{dom:l,contentDOM:l}}else{let{dom:m,contentDOM:b}=t.renderSpec(e,h,r);if(l.appendChild(m),b){if(s)throw new RangeError("Multiple content holes");s=b}}}return{dom:l,contentDOM:s}}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new t(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let n=hy(e.nodes);return n.text||(n.text=r=>r.text),n}static marksFromSchema(e){return hy(e.marks)}};function hy(t){let e={};for(let n in t){let r=t[n].spec.toDOM;r&&(e[n]=r)}return e}function Qd(t){return t.document||window.document}var Ry=65535,Iy=Math.pow(2,16);function hO(t,e){return t+e*Iy}function Ny(t){return t&Ry}function mO(t){return(t-(t&Ry))/Iy}var Ly=1,Dy=2,Tl=4,Py=8,Bs=class{constructor(e,n,r){this.pos=e,this.delInfo=n,this.recover=r}get deleted(){return(this.delInfo&Py)>0}get deletedBefore(){return(this.delInfo&(Ly|Tl))>0}get deletedAfter(){return(this.delInfo&(Dy|Tl))>0}get deletedAcross(){return(this.delInfo&Tl)>0}},Dr=class t{constructor(e,n=!1){if(this.ranges=e,this.inverted=n,!e.length&&t.empty)return t.empty}recover(e){let n=0,r=Ny(e);if(!this.inverted)for(let i=0;ie)break;let d=this.ranges[l+o],f=this.ranges[l+s],h=u+d;if(e<=h){let m=d?e==u?-1:e==h?1:n:n,b=u+i+(m<0?0:f);if(r)return b;let y=e==(n<0?u:h)?null:hO(l/3,e-u),v=e==u?Dy:e==h?Ly:Tl;return(n<0?e!=u:e!=h)&&(v|=Py),new Bs(b,v,y)}i+=f-d}return r?e+i:new Bs(e+i,0,null)}touches(e,n){let r=0,i=Ny(n),o=this.inverted?2:1,s=this.inverted?1:2;for(let l=0;le)break;let d=this.ranges[l+o],f=u+d;if(e<=f&&l==i*3)return!0;r+=this.ranges[l+s]-d}return!1}forEach(e){let n=this.inverted?2:1,r=this.inverted?1:2;for(let i=0,o=0;i=0;n--){let i=e.getMirror(n);this.appendMap(e.maps[n].invert(),i!=null&&i>n?r-i-1:void 0)}}invert(){let e=new t;return e.appendMappingInverted(this),e}map(e,n=1){if(this.mirror)return this._map(e,n,!0);for(let r=this.from;ro&&u!s.isAtom||!l.type.allowsMarkType(this.mark.type)?s:s.mark(this.mark.addToSet(s.marks)),i),n.openStart,n.openEnd);return qt.fromReplace(e,this.from,this.to,o)}invert(){return new Ki(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};zt.jsonID("addMark",Hs);var Ki=class t extends zt{constructor(e,n,r){super(),this.from=e,this.to=n,this.mark=r}apply(e){let n=e.slice(this.from,this.to),r=new X(uf(n.content,i=>i.mark(this.mark.removeFromSet(i.marks)),e),n.openStart,n.openEnd);return qt.fromReplace(e,this.from,this.to,r)}invert(){return new Hs(this.from,this.to,this.mark)}map(e){let n=e.mapResult(this.from,1),r=e.mapResult(this.to,-1);return n.deleted&&r.deleted||n.pos>=r.pos?null:new t(n.pos,r.pos,this.mark)}merge(e){return e instanceof t&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new t(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number")throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new t(n.from,n.to,e.markFromJSON(n.mark))}};zt.jsonID("removeMark",Ki);var zs=class t extends zt{constructor(e,n){super(),this.pos=e,this.mark=n}apply(e){let n=e.nodeAt(this.pos);if(!n)return qt.fail("No node at mark step's position");let r=n.type.create(n.attrs,null,this.mark.addToSet(n.marks));return qt.fromReplace(e,this.pos,this.pos+1,new X(K.from(r),0,n.isLeaf?0:1))}invert(e){let n=e.nodeAt(this.pos);if(n){let r=this.mark.addToSet(n.marks);if(r.length==n.marks.length){for(let i=0;ir.pos?null:new t(n.pos,r.pos,i,o,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,n){if(typeof n.from!="number"||typeof n.to!="number"||typeof n.gapFrom!="number"||typeof n.gapTo!="number"||typeof n.insert!="number")throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new t(n.from,n.to,n.gapFrom,n.gapTo,X.fromJSON(e,n.slice),n.insert,!!n.structure)}};zt.jsonID("replaceAround",Tt);function lf(t,e,n){let r=t.resolve(e),i=n-e,o=r.depth;for(;i>0&&o>0&&r.indexAfter(o)==r.node(o).childCount;)o--,i--;if(i>0){let s=r.node(o).maybeChild(r.indexAfter(o));for(;i>0;){if(!s||s.isLeaf)return!0;s=s.firstChild,i--}}return!1}function gO(t,e,n,r){let i=[],o=[],s,l;t.doc.nodesBetween(e,n,(u,d,f)=>{if(!u.isInline)return;let h=u.marks;if(!r.isInSet(h)&&f.type.allowsMarkType(r.type)){let m=Math.max(d,e),b=Math.min(d+u.nodeSize,n),y=r.addToSet(h);for(let v=0;vt.step(u)),o.forEach(u=>t.step(u))}function bO(t,e,n,r){let i=[],o=0;t.doc.nodesBetween(e,n,(s,l)=>{if(!s.isInline)return;o++;let u=null;if(r instanceof Ls){let d=s.marks,f;for(;f=r.isInSet(d);)(u||(u=[])).push(f),d=f.removeFromSet(d)}else r?r.isInSet(s.marks)&&(u=[r]):u=s.marks;if(u&&u.length){let d=Math.min(l+s.nodeSize,n);for(let f=0;ft.step(new Ki(s.from,s.to,s.style)))}function yO(t,e,n,r=n.contentMatch){let i=t.doc.nodeAt(e),o=[],s=e+1;for(let l=0;l=0;l--)t.step(o[l])}function EO(t,e,n){return(e==0||t.canReplace(e,t.childCount))&&(n==t.childCount||t.canReplace(0,n))}function Pr(t){let n=t.parent.content.cutByIndex(t.startIndex,t.endIndex);for(let r=t.depth;;--r){let i=t.$from.node(r),o=t.$from.index(r),s=t.$to.indexAfter(r);if(rn;y--)v||r.index(y)>0?(v=!0,f=K.from(r.node(y).copy(f)),h++):u--;let m=K.empty,b=0;for(let y=o,v=!1;y>n;y--)v||i.after(y+1)=0;s--){if(r.size){let l=n[s].type.contentMatch.matchFragment(r);if(!l||!l.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}r=K.from(n[s].type.create(n[s].attrs,r))}let i=e.start,o=e.end;t.step(new Tt(i,o,i,o,new X(r,0,0),n.length,!0))}function SO(t,e,n,r,i){if(!r.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let o=t.steps.length;t.doc.nodesBetween(e,n,(s,l)=>{if(s.isTextblock&&!s.hasMarkup(r,i)&&TO(t.doc,t.mapping.slice(o).map(l),r)){t.clearIncompatible(t.mapping.slice(o).map(l,1),r);let u=t.mapping.slice(o),d=u.map(l,1),f=u.map(l+s.nodeSize,1);return t.step(new Tt(d,f,d+1,f-1,new X(K.from(r.create(i,null,s.marks)),0,0),1,!0)),!1}})}function TO(t,e,n){let r=t.resolve(e),i=r.index();return r.parent.canReplaceWith(i,i+1,n)}function MO(t,e,n,r,i){let o=t.doc.nodeAt(e);if(!o)throw new RangeError("No node at given position");n||(n=o.type);let s=n.create(r,null,i||o.marks);if(o.isLeaf)return t.replaceWith(e,e+o.nodeSize,s);if(!n.validContent(o.content))throw new RangeError("Invalid content for node type "+n.name);t.step(new Tt(e,e+o.nodeSize,e+1,e+o.nodeSize-1,new X(K.from(s),0,0),1,!0))}function zn(t,e,n=1,r){let i=t.resolve(e),o=i.depth-n,s=r&&r[r.length-1]||i.parent;if(o<0||i.parent.type.spec.isolating||!i.parent.canReplace(i.index(),i.parent.childCount)||!s.type.validContent(i.parent.content.cutByIndex(i.index(),i.parent.childCount)))return!1;for(let d=i.depth-1,f=n-2;d>o;d--,f--){let h=i.node(d),m=i.index(d);if(h.type.spec.isolating)return!1;let b=h.content.cutByIndex(m,h.childCount),y=r&&r[f+1];y&&(b=b.replaceChild(0,y.type.create(y.attrs)));let v=r&&r[f]||h;if(!h.canReplace(m+1,h.childCount)||!v.type.validContent(b))return!1}let l=i.indexAfter(o),u=r&&r[0];return i.node(o).canReplaceWith(l,l,u?u.type:i.node(o+1).type)}function CO(t,e,n=1,r){let i=t.doc.resolve(e),o=K.empty,s=K.empty;for(let l=i.depth,u=i.depth-n,d=n-1;l>u;l--,d--){o=K.from(i.node(l).copy(o));let f=r&&r[d];s=K.from(f?f.type.create(f.attrs,s):i.node(l).copy(s))}t.step(new nn(e,e,new X(o.append(s),n,n),!0))}function rr(t,e){let n=t.resolve(e),r=n.index();return By(n.nodeBefore,n.nodeAfter)&&n.parent.canReplace(r,r+1)}function By(t,e){return!!(t&&e&&!t.isLeaf&&t.canAppend(e))}function Bo(t,e,n=-1){let r=t.resolve(e);for(let i=r.depth;;i--){let o,s,l=r.index(i);if(i==r.depth?(o=r.nodeBefore,s=r.nodeAfter):n>0?(o=r.node(i+1),l++,s=r.node(i).maybeChild(l)):(o=r.node(i).maybeChild(l-1),s=r.node(i+1)),o&&!o.isTextblock&&By(o,s)&&r.node(i).canReplace(l,l+1))return e;if(i==0)break;e=n<0?r.before(i):r.after(i)}}function kO(t,e,n){let r=new nn(e-n,e+n,X.empty,!0);t.step(r)}function AO(t,e,n){let r=t.resolve(e);if(r.parent.canReplaceWith(r.index(),r.index(),n))return e;if(r.parentOffset==0)for(let i=r.depth-1;i>=0;i--){let o=r.index(i);if(r.node(i).canReplaceWith(o,o,n))return r.before(i+1);if(o>0)return null}if(r.parentOffset==r.parent.content.size)for(let i=r.depth-1;i>=0;i--){let o=r.indexAfter(i);if(r.node(i).canReplaceWith(o,o,n))return r.after(i+1);if(o=0;s--){let l=s==r.depth?0:r.pos<=(r.start(s+1)+r.end(s+1))/2?-1:1,u=r.index(s)+(l>0?1:0),d=r.node(s),f=!1;if(o==1)f=d.canReplace(u,u,i);else{let h=d.contentMatchAt(u).findWrapping(i.firstChild.type);f=h&&d.canReplaceWith(u,u,h[0])}if(f)return l==0?r.pos:l<0?r.before(s+1):r.after(s+1)}return null}function Us(t,e,n=e,r=X.empty){if(e==n&&!r.size)return null;let i=t.resolve(e),o=t.resolve(n);return Fy(i,o,r)?new nn(e,n,r):new cf(i,o,r).fit()}function Fy(t,e,n){return!n.openStart&&!n.openEnd&&t.start()==e.start()&&t.parent.canReplace(t.index(),e.index(),n.content)}var cf=class{constructor(e,n,r){this.$from=e,this.$to=n,this.unplaced=r,this.frontier=[],this.placed=K.empty;for(let i=0;i<=e.depth;i++){let o=e.node(i);this.frontier.push({type:o.type,match:o.contentMatchAt(e.indexAfter(i))})}for(let i=e.depth;i>0;i--)this.placed=K.from(e.node(i).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let d=this.findFittable();d?this.placeNodes(d):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),n=this.placed.size-this.depth-this.$from.depth,r=this.$from,i=this.close(e<0?this.$to:r.doc.resolve(e));if(!i)return null;let o=this.placed,s=r.depth,l=i.depth;for(;s&&l&&o.childCount==1;)o=o.firstChild.content,s--,l--;let u=new X(o,s,l);return e>-1?new Tt(r.pos,e,this.$to.pos,this.$to.end(),u,n):u.size||r.pos!=this.$to.pos?new nn(r.pos,i.pos,u):null}findFittable(){let e=this.unplaced.openStart;for(let n=this.unplaced.content,r=0,i=this.unplaced.openEnd;r1&&(i=0),o.type.spec.isolating&&i<=r){e=r;break}n=o.content}for(let n=1;n<=2;n++)for(let r=n==1?e:this.unplaced.openStart;r>=0;r--){let i,o=null;r?(o=sf(this.unplaced.content,r-1).firstChild,i=o.content):i=this.unplaced.content;let s=i.firstChild;for(let l=this.depth;l>=0;l--){let{type:u,match:d}=this.frontier[l],f,h=null;if(n==1&&(s?d.matchType(s.type)||(h=d.fillBefore(K.from(s),!1)):o&&u.compatibleContent(o.type)))return{sliceDepth:r,frontierDepth:l,parent:o,inject:h};if(n==2&&s&&(f=d.findWrapping(s.type)))return{sliceDepth:r,frontierDepth:l,parent:o,wrap:f};if(o&&d.matchType(o.type))break}}}openMore(){let{content:e,openStart:n,openEnd:r}=this.unplaced,i=sf(e,n);return!i.childCount||i.firstChild.isLeaf?!1:(this.unplaced=new X(e,n+1,Math.max(r,i.size+n>=e.size-r?n+1:0)),!0)}dropNode(){let{content:e,openStart:n,openEnd:r}=this.unplaced,i=sf(e,n);if(i.childCount<=1&&n>0){let o=e.size-n<=n+i.size;this.unplaced=new X(Ds(e,n-1,1),n-1,o?n-1:r)}else this.unplaced=new X(Ds(e,n,1),n,r)}placeNodes({sliceDepth:e,frontierDepth:n,parent:r,inject:i,wrap:o}){for(;this.depth>n;)this.closeFrontierNode();if(o)for(let v=0;v1||u==0||v.content.size)&&(h=x,f.push(Hy(v.mark(m.allowedMarks(v.marks)),d==1?u:0,d==l.childCount?b:-1)))}let y=d==l.childCount;y||(b=-1),this.placed=Ps(this.placed,n,K.from(f)),this.frontier[n].match=h,y&&b<0&&r&&r.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let v=0,x=l;v1&&i==this.$to.end(--r);)++i;return i}findCloseLevel(e){e:for(let n=Math.min(this.depth,e.depth);n>=0;n--){let{match:r,type:i}=this.frontier[n],o=n=0;l--){let{match:u,type:d}=this.frontier[l],f=af(e,l,d,u,!0);if(!f||f.childCount)continue e}return{depth:n,fit:s,move:o?e.doc.resolve(e.after(n+1)):e}}}}close(e){let n=this.findCloseLevel(e);if(!n)return null;for(;this.depth>n.depth;)this.closeFrontierNode();n.fit.childCount&&(this.placed=Ps(this.placed,n.depth,n.fit)),e=n.move;for(let r=n.depth+1;r<=e.depth;r++){let i=e.node(r),o=i.type.contentMatch.fillBefore(i.content,!0,e.index(r));this.openFrontierNode(i.type,i.attrs,o)}return e}openFrontierNode(e,n=null,r){let i=this.frontier[this.depth];i.match=i.match.matchType(e),this.placed=Ps(this.placed,this.depth,K.from(e.create(n,r))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let n=this.frontier.pop().match.fillBefore(K.empty,!0);n.childCount&&(this.placed=Ps(this.placed,this.frontier.length,n))}};function Ds(t,e,n){return e==0?t.cutByIndex(n,t.childCount):t.replaceChild(0,t.firstChild.copy(Ds(t.firstChild.content,e-1,n)))}function Ps(t,e,n){return e==0?t.append(n):t.replaceChild(t.childCount-1,t.lastChild.copy(Ps(t.lastChild.content,e-1,n)))}function sf(t,e){for(let n=0;n1&&(r=r.replaceChild(0,Hy(r.firstChild,e-1,r.childCount==1?n-1:0))),e>0&&(r=t.type.contentMatch.fillBefore(r).append(r),n<=0&&(r=r.append(t.type.contentMatch.matchFragment(r).fillBefore(K.empty,!0)))),t.copy(r)}function af(t,e,n,r,i){let o=t.node(e),s=i?t.indexAfter(e):t.index(e);if(s==o.childCount&&!n.compatibleContent(o.type))return null;let l=r.fillBefore(o.content,!0,s);return l&&!NO(n,o.content,s)?l:null}function NO(t,e,n){for(let r=n;r0;m--,b--){let y=i.node(m).type.spec;if(y.defining||y.definingAsContext||y.isolating)break;s.indexOf(m)>-1?l=m:i.before(m)==b&&s.splice(1,0,-m)}let u=s.indexOf(l),d=[],f=r.openStart;for(let m=r.content,b=0;;b++){let y=m.firstChild;if(d.push(y),b==r.openStart)break;m=y.content}for(let m=f-1;m>=0;m--){let b=d[m],y=OO(b.type);if(y&&!b.sameMarkup(i.node(Math.abs(l)-1)))f=m;else if(y||!b.type.isTextblock)break}for(let m=r.openStart;m>=0;m--){let b=(m+f+1)%(r.openStart+1),y=d[b];if(y)for(let v=0;v=0&&(t.replace(e,n,r),!(t.steps.length>h));m--){let b=s[m];b<0||(e=i.before(b),n=o.after(b))}}function zy(t,e,n,r,i){if(er){let o=i.contentMatchAt(0),s=o.fillBefore(t).append(t);t=s.append(o.matchFragment(s).fillBefore(K.empty,!0))}return t}function IO(t,e,n,r){if(!r.isInline&&e==n&&t.doc.resolve(e).parent.content.size){let i=AO(t.doc,e,r.type);i!=null&&(e=n=i)}t.replaceRange(e,n,new X(K.from(r),0,0))}function LO(t,e,n){let r=t.doc.resolve(e),i=t.doc.resolve(n),o=$y(r,i);for(let s=0;s0&&(u||r.node(l-1).canReplace(r.index(l-1),i.indexAfter(l-1))))return t.delete(r.before(l),i.after(l))}for(let s=1;s<=r.depth&&s<=i.depth;s++)if(e-r.start(s)==r.depth-s&&n>r.end(s)&&i.end(s)-n!=i.depth-s)return t.delete(r.before(s),n);t.delete(e,n)}function $y(t,e){let n=[],r=Math.min(t.depth,e.depth);for(let i=r;i>=0;i--){let o=t.start(i);if(oe.pos+(e.depth-i)||t.node(i).type.spec.isolating||e.node(i).type.spec.isolating)break;(o==e.start(i)||i==t.depth&&i==e.depth&&t.parent.inlineContent&&e.parent.inlineContent&&i&&e.start(i-1)==o-1)&&n.push(i)}return n}var Ml=class t extends zt{constructor(e,n,r){super(),this.pos=e,this.attr=n,this.value=r}apply(e){let n=e.nodeAt(this.pos);if(!n)return qt.fail("No node at attribute step's position");let r=Object.create(null);for(let o in n.attrs)r[o]=n.attrs[o];r[this.attr]=this.value;let i=n.type.create(r,null,n.marks);return qt.fromReplace(e,this.pos,this.pos+1,new X(K.from(i),0,n.isLeaf?0:1))}getMap(){return Dr.empty}invert(e){return new t(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let n=e.mapResult(this.pos,1);return n.deletedAfter?null:new t(n.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.pos!="number"||typeof n.attr!="string")throw new RangeError("Invalid input for AttrStep.fromJSON");return new t(n.pos,n.attr,n.value)}};zt.jsonID("attr",Ml);var Cl=class t extends zt{constructor(e,n){super(),this.attr=e,this.value=n}apply(e){let n=Object.create(null);for(let i in e.attrs)n[i]=e.attrs[i];n[this.attr]=this.value;let r=e.type.create(n,e.content,e.marks);return qt.ok(r)}getMap(){return Dr.empty}invert(e){return new t(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,n){if(typeof n.attr!="string")throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new t(n.attr,n.value)}};zt.jsonID("docAttr",Cl);var Do=class extends Error{};Do=function t(e){let n=Error.call(this,e);return n.__proto__=t.prototype,n};Do.prototype=Object.create(Error.prototype);Do.prototype.constructor=Do;Do.prototype.name="TransformError";var ai=class{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new Fs}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let n=this.maybeStep(e);if(n.failed)throw new Do(n.failed);return this}maybeStep(e){let n=e.apply(this.doc);return n.failed||this.addStep(e,n.doc),n}get docChanged(){return this.steps.length>0}addStep(e,n){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=n}replace(e,n=e,r=X.empty){let i=Us(this.doc,e,n,r);return i&&this.step(i),this}replaceWith(e,n,r){return this.replace(e,n,new X(K.from(r),0,0))}delete(e,n){return this.replace(e,n,X.empty)}insert(e,n){return this.replaceWith(e,e,n)}replaceRange(e,n,r){return RO(this,e,n,r),this}replaceRangeWith(e,n,r){return IO(this,e,n,r),this}deleteRange(e,n){return LO(this,e,n),this}lift(e,n){return vO(this,e,n),this}join(e,n=1){return kO(this,e,n),this}wrap(e,n){return _O(this,e,n),this}setBlockType(e,n=e,r,i=null){return SO(this,e,n,r,i),this}setNodeMarkup(e,n,r=null,i){return MO(this,e,n,r,i),this}setNodeAttribute(e,n,r){return this.step(new Ml(e,n,r)),this}setDocAttribute(e,n){return this.step(new Cl(e,n)),this}addNodeMark(e,n){return this.step(new zs(e,n)),this}removeNodeMark(e,n){if(!(n instanceof Ye)){let r=this.doc.nodeAt(e);if(!r)throw new RangeError("No node at position "+e);if(n=n.isInSet(r.marks),!n)return this}return this.step(new $s(e,n)),this}split(e,n=1,r){return CO(this,e,n,r),this}addMark(e,n,r){return gO(this,e,n,r),this}removeMark(e,n,r){return bO(this,e,n,r),this}clearIncompatible(e,n,r){return yO(this,e,n,r),this}};var df=Object.create(null),fe=class{constructor(e,n,r){this.$anchor=e,this.$head=n,this.ranges=r||[new Ks(e.min(n),e.max(n))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let n=0;n=0;o--){let s=n<0?Fo(e.node(0),e.node(o),e.before(o+1),e.index(o),n,r):Fo(e.node(0),e.node(o),e.after(o+1),e.index(o)+1,n,r);if(s)return s}return null}static near(e,n=1){return this.findFrom(e,n)||this.findFrom(e,-n)||new On(e.node(0))}static atStart(e){return Fo(e,e,0,0,1)||new On(e)}static atEnd(e){return Fo(e,e,e.content.size,e.childCount,-1)||new On(e)}static fromJSON(e,n){if(!n||!n.type)throw new RangeError("Invalid input for Selection.fromJSON");let r=df[n.type];if(!r)throw new RangeError(`No selection type ${n.type} defined`);return r.fromJSON(e,n)}static jsonID(e,n){if(e in df)throw new RangeError("Duplicate use of selection JSON ID "+e);return df[e]=n,n.prototype.jsonID=e,n}getBookmark(){return ce.between(this.$anchor,this.$head).getBookmark()}};fe.prototype.visible=!0;var Ks=class{constructor(e,n){this.$from=e,this.$to=n}},Uy=!1;function Wy(t){!Uy&&!t.parent.inlineContent&&(Uy=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+t.parent.type.name+")"))}var ce=class t extends fe{constructor(e,n=e){Wy(e),Wy(n),super(e,n)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,n){let r=e.resolve(n.map(this.head));if(!r.parent.inlineContent)return fe.near(r);let i=e.resolve(n.map(this.anchor));return new t(i.parent.inlineContent?i:r,r)}replace(e,n=X.empty){if(super.replace(e,n),n==X.empty){let r=this.$from.marksAcross(this.$to);r&&e.ensureMarks(r)}}eq(e){return e instanceof t&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new Nl(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,n){if(typeof n.anchor!="number"||typeof n.head!="number")throw new RangeError("Invalid input for TextSelection.fromJSON");return new t(e.resolve(n.anchor),e.resolve(n.head))}static create(e,n,r=n){let i=e.resolve(n);return new this(i,r==n?i:e.resolve(r))}static between(e,n,r){let i=e.pos-n.pos;if((!r||i)&&(r=i>=0?1:-1),!n.parent.inlineContent){let o=fe.findFrom(n,r,!0)||fe.findFrom(n,-r,!0);if(o)n=o.$head;else return fe.near(n,r)}return e.parent.inlineContent||(i==0?e=n:(e=(fe.findFrom(e,-r,!0)||fe.findFrom(e,r,!0)).$anchor,e.pos0?0:1);i>0?s=0;s+=i){let l=e.child(s);if(l.isAtom){if(!o&&pe.isSelectable(l))return pe.create(t,n-(i<0?l.nodeSize:0))}else{let u=Fo(t,l,n+i,i<0?l.childCount:0,i,o);if(u)return u}n+=l.nodeSize*i}return null}function Ky(t,e,n){let r=t.steps.length-1;if(r{s==null&&(s=f)}),t.setSelection(fe.near(t.doc.resolve(s),n))}var Vy=1,Al=2,Gy=4,hf=class extends ai{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=Al,this}ensureMarks(e){return Ye.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(this.updated&Al)>0}addStep(e,n){super.addStep(e,n),this.updated=this.updated&~Al,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,n=!0){let r=this.selection;return n&&(e=e.mark(this.storedMarks||(r.empty?r.$from.marks():r.$from.marksAcross(r.$to)||Ye.none))),r.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,n,r){let i=this.doc.type.schema;if(n==null)return e?this.replaceSelectionWith(i.text(e),!0):this.deleteSelection();{if(r==null&&(r=n),r=r??n,!e)return this.deleteRange(n,r);let o=this.storedMarks;if(!o){let s=this.doc.resolve(n);o=r==n?s.marks():s.marksAcross(this.doc.resolve(r))}return this.replaceRangeWith(n,r,i.text(e,o)),this.selection.empty||this.setSelection(fe.near(this.selection.$to)),this}}setMeta(e,n){return this.meta[typeof e=="string"?e:e.key]=n,this}getMeta(e){return this.meta[typeof e=="string"?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=Gy,this}get scrolledIntoView(){return(this.updated&Gy)>0}};function qy(t,e){return!e||!t?t:t.bind(e)}var Vi=class{constructor(e,n,r){this.name=e,this.init=qy(n.init,r),this.apply=qy(n.apply,r)}},PO=[new Vi("doc",{init(t){return t.doc||t.schema.topNodeType.createAndFill()},apply(t){return t.doc}}),new Vi("selection",{init(t,e){return t.selection||fe.atStart(e.doc)},apply(t){return t.selection}}),new Vi("storedMarks",{init(t){return t.storedMarks||null},apply(t,e,n,r){return r.selection.$cursor?t.storedMarks:null}}),new Vi("scrollToSelection",{init(){return 0},apply(t,e){return t.scrolledIntoView?e+1:e}})],Ws=class{constructor(e,n){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=PO.slice(),n&&n.forEach(r=>{if(this.pluginsByKey[r.key])throw new RangeError("Adding different instances of a keyed plugin ("+r.key+")");this.plugins.push(r),this.pluginsByKey[r.key]=r,r.spec.state&&this.fields.push(new Vi(r.key,r.spec.state,r))})}},Ol=class t{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,n=-1){for(let r=0;rr.toJSON())),e&&typeof e=="object")for(let r in e){if(r=="doc"||r=="selection")throw new RangeError("The JSON fields `doc` and `selection` are reserved");let i=e[r],o=i.spec.state;o&&o.toJSON&&(n[r]=o.toJSON.call(i,this[i.key]))}return n}static fromJSON(e,n,r){if(!n)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let i=new Ws(e.schema,e.plugins),o=new t(i);return i.fields.forEach(s=>{if(s.name=="doc")o.doc=nr.fromJSON(e.schema,n.doc);else if(s.name=="selection")o.selection=fe.fromJSON(o.doc,n.selection);else if(s.name=="storedMarks")n.storedMarks&&(o.storedMarks=n.storedMarks.map(e.schema.markFromJSON));else{if(r)for(let l in r){let u=r[l],d=u.spec.state;if(u.key==s.name&&d&&d.fromJSON&&Object.prototype.hasOwnProperty.call(n,l)){o[s.name]=d.fromJSON.call(u,e,n[l],o);return}}o[s.name]=s.init(e,o)}}),o}};function Yy(t,e,n){for(let r in t){let i=t[r];i instanceof Function?i=i.bind(e):r=="handleDOMEvents"&&(i=Yy(i,e,{})),n[r]=i}return n}var Pe=class{constructor(e){this.spec=e,this.props={},e.props&&Yy(e.props,this,this.props),this.key=e.key?e.key.key:Jy("plugin")}getState(e){return e[this.key]}},ff=Object.create(null);function Jy(t){return t in ff?t+"$"+ ++ff[t]:(ff[t]=0,t+"$")}var qe=class{constructor(e="key"){this.key=Jy(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}};var Yt=function(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e},Ys=function(t){let e=t.assignedSlot||t.parentNode;return e&&e.nodeType==11?e.host:e},Ef=null,Fr=function(t,e,n){let r=Ef||(Ef=document.createRange());return r.setEnd(t,n??t.nodeValue.length),r.setStart(t,e||0),r},BO=function(){Ef=null},ji=function(t,e,n,r){return n&&(Xy(t,e,n,r,-1)||Xy(t,e,n,r,1))},FO=/^(img|br|input|textarea|hr)$/i;function Xy(t,e,n,r,i){for(;;){if(t==n&&e==r)return!0;if(e==(i<0?0:hr(t))){let o=t.parentNode;if(!o||o.nodeType!=1||js(t)||FO.test(t.nodeName)||t.contentEditable=="false")return!1;e=Yt(t)+(i<0?0:1),t=o}else if(t.nodeType==1){if(t=t.childNodes[e+(i<0?-1:0)],t.contentEditable=="false")return!1;e=i<0?hr(t):0}else return!1}}function hr(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function HO(t,e){for(;;){if(t.nodeType==3&&e)return t;if(t.nodeType==1&&e>0){if(t.contentEditable=="false")return null;t=t.childNodes[e-1],e=hr(t)}else if(t.parentNode&&!js(t))e=Yt(t),t=t.parentNode;else return null}}function zO(t,e){for(;;){if(t.nodeType==3&&e2),$n=Wo||(mr?/Mac/.test(mr.platform):!1),VO=mr?/Win/.test(mr.platform):!1,ir=/Android \d/.test(pi),Qs=!!Zy&&"webkitFontSmoothing"in Zy.documentElement.style,GO=Qs?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function qO(t){let e=t.defaultView&&t.defaultView.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.documentElement.clientWidth,top:0,bottom:t.documentElement.clientHeight}}function Br(t,e){return typeof t=="number"?t:t[e]}function YO(t){let e=t.getBoundingClientRect(),n=e.width/t.offsetWidth||1,r=e.height/t.offsetHeight||1;return{left:e.left,right:e.left+t.clientWidth*n,top:e.top,bottom:e.top+t.clientHeight*r}}function jy(t,e,n){let r=t.someProp("scrollThreshold")||0,i=t.someProp("scrollMargin")||5,o=t.dom.ownerDocument;for(let s=n||t.dom;s;s=Ys(s)){if(s.nodeType!=1)continue;let l=s,u=l==o.body,d=u?qO(o):YO(l),f=0,h=0;if(e.topd.bottom-Br(r,"bottom")&&(h=e.bottom-e.top>d.bottom-d.top?e.top+Br(i,"top")-d.top:e.bottom-d.bottom+Br(i,"bottom")),e.leftd.right-Br(r,"right")&&(f=e.right-d.right+Br(i,"right")),f||h)if(u)o.defaultView.scrollBy(f,h);else{let m=l.scrollLeft,b=l.scrollTop;h&&(l.scrollTop+=h),f&&(l.scrollLeft+=f);let y=l.scrollLeft-m,v=l.scrollTop-b;e={left:e.left-y,top:e.top-v,right:e.right-y,bottom:e.bottom-v}}if(u||/^(fixed|sticky)$/.test(getComputedStyle(s).position))break}}function JO(t){let e=t.dom.getBoundingClientRect(),n=Math.max(0,e.top),r,i;for(let o=(e.left+e.right)/2,s=n+1;s=n-20){r=l,i=u.top;break}}return{refDOM:r,refTop:i,stack:A0(t.dom)}}function A0(t){let e=[],n=t.ownerDocument;for(let r=t;r&&(e.push({dom:r,top:r.scrollTop,left:r.scrollLeft}),t!=n);r=Ys(r));return e}function XO({refDOM:t,refTop:e,stack:n}){let r=t?t.getBoundingClientRect().top:0;N0(n,r==0?0:r-e)}function N0(t,e){for(let n=0;n=l){s=Math.max(y.bottom,s),l=Math.min(y.top,l);let v=y.left>e.left?y.left-e.left:y.right=(y.left+y.right)/2?1:0));continue}}else y.top>e.top&&!u&&y.left<=e.left&&y.right>=e.left&&(u=f,d={left:Math.max(y.left,Math.min(y.right,e.left)),top:y.top});!n&&(e.left>=y.right&&e.top>=y.top||e.left>=y.left&&e.top>=y.bottom)&&(o=h+1)}}return!n&&u&&(n=u,i=d,r=0),n&&n.nodeType==3?jO(n,i):!n||r&&n.nodeType==1?{node:t,offset:o}:O0(n,i)}function jO(t,e){let n=t.nodeValue.length,r=document.createRange();for(let i=0;i=(o.left+o.right)/2?1:0)}}return{node:t,offset:0}}function Ff(t,e){return t.left>=e.left-1&&t.left<=e.right+1&&t.top>=e.top-1&&t.top<=e.bottom+1}function QO(t,e){let n=t.parentNode;return n&&/^li$/i.test(n.nodeName)&&e.left(s.left+s.right)/2?1:-1}return t.docView.posFromDOM(r,i,o)}function tR(t,e,n,r){let i=-1;for(let o=e,s=!1;o!=t.dom;){let l=t.docView.nearestDesc(o,!0);if(!l)return null;if(l.dom.nodeType==1&&(l.node.isBlock&&l.parent&&!s||!l.contentDOM)){let u=l.dom.getBoundingClientRect();if(l.node.isBlock&&l.parent&&!s&&(s=!0,u.left>r.left||u.top>r.top?i=l.posBefore:(u.right-1?i:t.docView.posFromDOM(e,n,-1)}function R0(t,e,n){let r=t.childNodes.length;if(r&&n.tope.top&&i++}let d;Qs&&i&&r.nodeType==1&&(d=r.childNodes[i-1]).nodeType==1&&d.contentEditable=="false"&&d.getBoundingClientRect().top>=e.top&&i--,r==t.dom&&i==r.childNodes.length-1&&r.lastChild.nodeType==1&&e.top>r.lastChild.getBoundingClientRect().bottom?l=t.state.doc.content.size:(i==0||r.nodeType!=1||r.childNodes[i-1].nodeName!="BR")&&(l=tR(t,r,i,e))}l==null&&(l=eR(t,s,e));let u=t.docView.nearestDesc(s,!0);return{pos:l,inside:u?u.posAtStart-u.border:-1}}function Qy(t){return t.top=0&&i==r.nodeValue.length?(u--,f=1):n<0?u--:d++,Vs(li(Fr(r,u,d),f),f<0)}if(!t.state.doc.resolve(e-(o||0)).parent.inlineContent){if(o==null&&i&&(n<0||i==hr(r))){let u=r.childNodes[i-1];if(u.nodeType==1)return mf(u.getBoundingClientRect(),!1)}if(o==null&&i=0)}if(o==null&&i&&(n<0||i==hr(r))){let u=r.childNodes[i-1],d=u.nodeType==3?Fr(u,hr(u)-(s?0:1)):u.nodeType==1&&(u.nodeName!="BR"||!u.nextSibling)?u:null;if(d)return Vs(li(d,1),!1)}if(o==null&&i=0)}function Vs(t,e){if(t.width==0)return t;let n=e?t.left:t.right;return{top:t.top,bottom:t.bottom,left:n,right:n}}function mf(t,e){if(t.height==0)return t;let n=e?t.top:t.bottom;return{top:n,bottom:n,left:t.left,right:t.right}}function L0(t,e,n){let r=t.state,i=t.root.activeElement;r!=e&&t.updateState(e),i!=t.dom&&t.focus();try{return n()}finally{r!=e&&t.updateState(r),i!=t.dom&&i&&i.focus()}}function iR(t,e,n){let r=e.selection,i=n=="up"?r.$from:r.$to;return L0(t,e,()=>{let{node:o}=t.docView.domFromPos(i.pos,n=="up"?-1:1);for(;;){let l=t.docView.nearestDesc(o,!0);if(!l)break;if(l.node.isBlock){o=l.contentDOM||l.dom;break}o=l.dom.parentNode}let s=I0(t,i.pos,1);for(let l=o.firstChild;l;l=l.nextSibling){let u;if(l.nodeType==1)u=l.getClientRects();else if(l.nodeType==3)u=Fr(l,0,l.nodeValue.length).getClientRects();else continue;for(let d=0;df.top+1&&(n=="up"?s.top-f.top>(f.bottom-s.top)*2:f.bottom-s.bottom>(s.bottom-f.top)*2))return!1}}return!0})}var oR=/[\u0590-\u08ac]/;function sR(t,e,n){let{$head:r}=e.selection;if(!r.parent.isTextblock)return!1;let i=r.parentOffset,o=!i,s=i==r.parent.content.size,l=t.domSelection();return!oR.test(r.parent.textContent)||!l.modify?n=="left"||n=="backward"?o:s:L0(t,e,()=>{let{focusNode:u,focusOffset:d,anchorNode:f,anchorOffset:h}=t.domSelectionRange(),m=l.caretBidiLevel;l.modify("move",n,"character");let b=r.depth?t.docView.domAfterPos(r.before()):t.dom,{focusNode:y,focusOffset:v}=t.domSelectionRange(),x=y&&!b.contains(y.nodeType==1?y:y.parentNode)||u==y&&d==v;try{l.collapse(f,h),u&&(u!=f||d!=h)&&l.extend&&l.extend(u,d)}catch{}return m!=null&&(l.caretBidiLevel=m),x})}var e0=null,t0=null,n0=!1;function aR(t,e,n){return e0==e&&t0==n?n0:(e0=e,t0=n,n0=n=="up"||n=="down"?iR(t,e,n):sR(t,e,n))}var Un=0,r0=1,qi=2,gr=3,Qi=class{constructor(e,n,r,i){this.parent=e,this.children=n,this.dom=r,this.contentDOM=i,this.dirty=Un,r.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,n,r){return!1}matchesHack(e){return!1}parseRule(){return null}stopEvent(e){return!1}get size(){let e=0;for(let n=0;nYt(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))i=e.compareDocumentPosition(this.contentDOM)&2;else if(this.dom.firstChild){if(n==0)for(let o=e;;o=o.parentNode){if(o==this.dom){i=!1;break}if(o.previousSibling)break}if(i==null&&n==e.childNodes.length)for(let o=e;;o=o.parentNode){if(o==this.dom){i=!0;break}if(o.nextSibling)break}}return i??r>0?this.posAtEnd:this.posAtStart}nearestDesc(e,n=!1){for(let r=!0,i=e;i;i=i.parentNode){let o=this.getDesc(i),s;if(o&&(!n||o.node))if(r&&(s=o.nodeDOM)&&!(s.nodeType==1?s.contains(e.nodeType==1?e:e.parentNode):s==e))r=!1;else return o}}getDesc(e){let n=e.pmViewDesc;for(let r=n;r;r=r.parent)if(r==this)return n}posFromDOM(e,n,r){for(let i=e;i;i=i.parentNode){let o=this.getDesc(i);if(o)return o.localPosFromDOM(e,n,r)}return-1}descAt(e){for(let n=0,r=0;ne||s instanceof Ll){i=e-o;break}o=l}if(i)return this.children[r].domFromPos(i-this.children[r].border,n);for(let o;r&&!(o=this.children[r-1]).size&&o instanceof Rl&&o.side>=0;r--);if(n<=0){let o,s=!0;for(;o=r?this.children[r-1]:null,!(!o||o.dom.parentNode==this.contentDOM);r--,s=!1);return o&&n&&s&&!o.border&&!o.domAtom?o.domFromPos(o.size,n):{node:this.contentDOM,offset:o?Yt(o.dom)+1:0}}else{let o,s=!0;for(;o=r=f&&n<=d-u.border&&u.node&&u.contentDOM&&this.contentDOM.contains(u.contentDOM))return u.parseRange(e,n,f);e=s;for(let h=l;h>0;h--){let m=this.children[h-1];if(m.size&&m.dom.parentNode==this.contentDOM&&!m.emptyChildAt(1)){i=Yt(m.dom)+1;break}e-=m.size}i==-1&&(i=0)}if(i>-1&&(d>n||l==this.children.length-1)){n=d;for(let f=l+1;fb&&sn){let b=l;l=u,u=b}let m=document.createRange();m.setEnd(u.node,u.offset),m.setStart(l.node,l.offset),d.removeAllRanges(),d.addRange(m)}}ignoreMutation(e){return!this.contentDOM&&e.type!="selection"}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,n){for(let r=0,i=0;i=r:er){let l=r+o.border,u=s-o.border;if(e>=l&&n<=u){this.dirty=e==r||n==s?qi:r0,e==l&&n==u&&(o.contentLost||o.dom.parentNode!=this.contentDOM)?o.dirty=gr:o.markDirty(e-l,n-l);return}else o.dirty=o.dom==o.contentDOM&&o.dom.parentNode==this.contentDOM&&!o.children.length?qi:gr}r=s}this.dirty=qi}markParentsDirty(){let e=1;for(let n=this.parent;n;n=n.parent,e++){let r=e==1?qi:r0;n.dirty{if(!o)return i;if(o.parent)return o.parent.posBeforeChild(o)})),!n.type.spec.raw){if(s.nodeType!=1){let l=document.createElement("span");l.appendChild(s),s=l}s.contentEditable="false",s.classList.add("ProseMirror-widget")}super(e,[],s,null),this.widget=n,this.widget=n,o=this}matchesWidget(e){return this.dirty==Un&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let n=this.widget.spec.stopEvent;return n?n(e):!1}ignoreMutation(e){return e.type!="selection"||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get side(){return this.widget.type.side}},_f=class extends Qi{constructor(e,n,r,i){super(e,[],n,null),this.textDOM=r,this.text=i}get size(){return this.text.length}localPosFromDOM(e,n){return e!=this.textDOM?this.posAtStart+(n?this.size:0):this.posAtStart+n}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return e.type==="characterData"&&e.target.nodeValue==e.oldValue}},Ko=class t extends Qi{constructor(e,n,r,i){super(e,[],r,i),this.mark=n}static create(e,n,r,i){let o=i.nodeViews[n.type.name],s=o&&o(n,i,r);return(!s||!s.dom)&&(s=Lr.renderSpec(document,n.type.spec.toDOM(n,r))),new t(e,n,s.dom,s.contentDOM||s.dom)}parseRule(){return this.dirty&gr||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return this.dirty!=gr&&this.mark.eq(e)}markDirty(e,n){if(super.markDirty(e,n),this.dirty!=Un){let r=this.parent;for(;!r.node;)r=r.parent;r.dirty0&&(o=kf(o,0,e,r));for(let l=0;l{if(!u)return s;if(u.parent)return u.parent.posBeforeChild(u)},r,i),f=d&&d.dom,h=d&&d.contentDOM;if(n.isText){if(!f)f=document.createTextNode(n.text);else if(f.nodeType!=3)throw new RangeError("Text must be rendered as a DOM text node")}else f||({dom:f,contentDOM:h}=Lr.renderSpec(document,n.type.spec.toDOM(n)));!h&&!n.isText&&f.nodeName!="BR"&&(f.hasAttribute("contenteditable")||(f.contentEditable="false"),n.type.spec.draggable&&(f.draggable=!0));let m=f;return f=B0(f,r,n),d?u=new Sf(e,n,r,i,f,h||null,m,d,o,s+1):n.isText?new Il(e,n,r,i,f,m,o):new t(e,n,r,i,f,h||null,m,o,s+1)}parseRule(){if(this.node.type.spec.reparseInView)return null;let e={node:this.node.type.name,attrs:this.node.attrs};if(this.node.type.whitespace=="pre"&&(e.preserveWhitespace="full"),!this.contentDOM)e.getContent=()=>this.node.content;else if(!this.contentLost)e.contentElement=this.contentDOM;else{for(let n=this.children.length-1;n>=0;n--){let r=this.children[n];if(this.dom.contains(r.dom.parentNode)){e.contentElement=r.dom.parentNode;break}}e.contentElement||(e.getContent=()=>K.empty)}return e}matchesNode(e,n,r){return this.dirty==Un&&e.eq(this.node)&&Mf(n,this.outerDeco)&&r.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,n){let r=this.node.inlineContent,i=n,o=e.composing?this.localCompositionInfo(e,n):null,s=o&&o.pos>-1?o:null,l=o&&o.pos<0,u=new Cf(this,s&&s.node,e);dR(this.node,this.innerDeco,(d,f,h)=>{d.spec.marks?u.syncToMarks(d.spec.marks,r,e):d.type.side>=0&&!h&&u.syncToMarks(f==this.node.childCount?Ye.none:this.node.child(f).marks,r,e),u.placeWidget(d,e,i)},(d,f,h,m)=>{u.syncToMarks(d.marks,r,e);let b;u.findNodeMatch(d,f,h,m)||l&&e.state.selection.from>i&&e.state.selection.to-1&&u.updateNodeAt(d,f,h,b,e)||u.updateNextNode(d,f,h,e,m,i)||u.addNode(d,f,h,e,i),i+=d.nodeSize}),u.syncToMarks([],r,e),this.node.isTextblock&&u.addTextblockHacks(),u.destroyRest(),(u.changed||this.dirty==qi)&&(s&&this.protectLocalComposition(e,s),D0(this.contentDOM,this.children,e),Wo&&fR(this.dom))}localCompositionInfo(e,n){let{from:r,to:i}=e.state.selection;if(!(e.state.selection instanceof ce)||rn+this.node.content.size)return null;let o=e.input.compositionNode;if(!o||!this.dom.contains(o.parentNode))return null;if(this.node.inlineContent){let s=o.nodeValue,l=pR(this.node.content,s,r-n,i-n);return l<0?null:{node:o,pos:l,text:s}}else return{node:o,pos:-1,text:""}}protectLocalComposition(e,{node:n,pos:r,text:i}){if(this.getDesc(n))return;let o=n;for(;o.parentNode!=this.contentDOM;o=o.parentNode){for(;o.previousSibling;)o.parentNode.removeChild(o.previousSibling);for(;o.nextSibling;)o.parentNode.removeChild(o.nextSibling);o.pmViewDesc&&(o.pmViewDesc=void 0)}let s=new _f(this,o,n,i);e.input.compositionNodes.push(s),this.children=kf(this.children,r,r+i.length,e,s)}update(e,n,r,i){return this.dirty==gr||!e.sameMarkup(this.node)?!1:(this.updateInner(e,n,r,i),!0)}updateInner(e,n,r,i){this.updateOuterDeco(n),this.node=e,this.innerDeco=r,this.contentDOM&&this.updateChildren(i,this.posAtStart),this.dirty=Un}updateOuterDeco(e){if(Mf(e,this.outerDeco))return;let n=this.nodeDOM.nodeType!=1,r=this.dom;this.dom=P0(this.dom,this.nodeDOM,Tf(this.outerDeco,this.node,n),Tf(e,this.node,n)),this.dom!=r&&(r.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){this.nodeDOM.nodeType==1&&this.nodeDOM.classList.add("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&(this.dom.draggable=!0)}deselectNode(){this.nodeDOM.nodeType==1&&this.nodeDOM.classList.remove("ProseMirror-selectednode"),(this.contentDOM||!this.node.type.spec.draggable)&&this.dom.removeAttribute("draggable")}get domAtom(){return this.node.isAtom}};function i0(t,e,n,r,i){B0(r,e,t);let o=new fi(void 0,t,e,n,r,r,r,i,0);return o.contentDOM&&o.updateChildren(i,0),o}var Il=class t extends fi{constructor(e,n,r,i,o,s,l){super(e,n,r,i,o,null,s,l,0)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,n,r,i){return this.dirty==gr||this.dirty!=Un&&!this.inParent()||!e.sameMarkup(this.node)?!1:(this.updateOuterDeco(n),(this.dirty!=Un||e.text!=this.node.text)&&e.text!=this.nodeDOM.nodeValue&&(this.nodeDOM.nodeValue=e.text,i.trackWrites==this.nodeDOM&&(i.trackWrites=null)),this.node=e,this.dirty=Un,!0)}inParent(){let e=this.parent.contentDOM;for(let n=this.nodeDOM;n;n=n.parentNode)if(n==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,n,r){return e==this.nodeDOM?this.posAtStart+Math.min(n,this.node.text.length):super.localPosFromDOM(e,n,r)}ignoreMutation(e){return e.type!="characterData"&&e.type!="selection"}slice(e,n,r){let i=this.node.cut(e,n),o=document.createTextNode(i.text);return new t(this.parent,i,this.outerDeco,this.innerDeco,o,o,r)}markDirty(e,n){super.markDirty(e,n),this.dom!=this.nodeDOM&&(e==0||n==this.nodeDOM.nodeValue.length)&&(this.dirty=gr)}get domAtom(){return!1}isText(e){return this.node.text==e}},Ll=class extends Qi{parseRule(){return{ignore:!0}}matchesHack(e){return this.dirty==Un&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return this.dom.nodeName=="IMG"}},Sf=class extends fi{constructor(e,n,r,i,o,s,l,u,d,f){super(e,n,r,i,o,s,l,d,f),this.spec=u}update(e,n,r,i){if(this.dirty==gr)return!1;if(this.spec.update){let o=this.spec.update(e,n,r);return o&&this.updateInner(e,n,r,i),o}else return!this.contentDOM&&!e.isLeaf?!1:super.update(e,n,r,i)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,n,r,i){this.spec.setSelection?this.spec.setSelection(e,n,r):super.setSelection(e,n,r,i)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return this.spec.stopEvent?this.spec.stopEvent(e):!1}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}};function D0(t,e,n){let r=t.firstChild,i=!1;for(let o=0;o>1,s=Math.min(o,e.length);for(;i-1)l>this.index&&(this.changed=!0,this.destroyBetween(this.index,l)),this.top=this.top.children[this.index];else{let u=Ko.create(this.top,e[o],n,r);this.top.children.splice(this.index,0,u),this.top=u,this.changed=!0}this.index=0,o++}}findNodeMatch(e,n,r,i){let o=-1,s;if(i>=this.preMatch.index&&(s=this.preMatch.matches[i-this.preMatch.index]).parent==this.top&&s.matchesNode(e,n,r))o=this.top.children.indexOf(s,this.index);else for(let l=this.index,u=Math.min(this.top.children.length,l+5);l0;){let l;for(;;)if(r){let d=n.children[r-1];if(d instanceof Ko)n=d,r=d.children.length;else{l=d,r--;break}}else{if(n==e)break e;r=n.parent.children.indexOf(n),n=n.parent}let u=l.node;if(u){if(u!=t.child(i-1))break;--i,o.set(l,i),s.push(l)}}return{index:i,matched:o,matches:s.reverse()}}function uR(t,e){return t.type.side-e.type.side}function dR(t,e,n,r){let i=e.locals(t),o=0;if(i.length==0){for(let d=0;do;)l.push(i[s++]);let y=o+m.nodeSize;if(m.isText){let x=y;s!x.inline):l.slice();r(m,v,e.forChild(o,m),b),o=y}}function fR(t){if(t.nodeName=="UL"||t.nodeName=="OL"){let e=t.style.cssText;t.style.cssText=e+"; list-style: square !important",window.getComputedStyle(t).listStyle,t.style.cssText=e}}function pR(t,e,n,r){for(let i=0,o=0;i=n){if(o>=r&&u.slice(r-e.length-l,r-l)==e)return r-e.length;let d=l=0&&d+e.length+l>=n)return l+d;if(n==r&&u.length>=r+e.length-l&&u.slice(r-l,r-l+e.length)==e)return r}}return-1}function kf(t,e,n,r,i){let o=[];for(let s=0,l=0;s=n||f<=e?o.push(u):(dn&&o.push(u.slice(n-d,u.size,r)))}return o}function Hf(t,e=null){let n=t.domSelectionRange(),r=t.state.doc;if(!n.focusNode)return null;let i=t.docView.nearestDesc(n.focusNode),o=i&&i.size==0,s=t.docView.posFromDOM(n.focusNode,n.focusOffset,1);if(s<0)return null;let l=r.resolve(s),u,d;if(Ul(n)){for(u=l;i&&!i.node;)i=i.parent;let f=i.node;if(i&&f.isAtom&&pe.isSelectable(f)&&i.parent&&!(f.isInline&&$O(n.focusNode,n.focusOffset,i.dom))){let h=i.posBefore;d=new pe(s==h?l:r.resolve(h))}}else{let f=t.docView.posFromDOM(n.anchorNode,n.anchorOffset,1);if(f<0)return null;u=r.resolve(f)}if(!d){let f=e=="pointer"||t.state.selection.head{(n.anchorNode!=r||n.anchorOffset!=i)&&(e.removeEventListener("selectionchange",t.input.hideSelectionGuard),setTimeout(()=>{(!F0(t)||t.state.selection.visible)&&t.dom.classList.remove("ProseMirror-hideselection")},20))})}function mR(t){let e=t.domSelection(),n=document.createRange(),r=t.cursorWrapper.dom,i=r.nodeName=="IMG";i?n.setEnd(r.parentNode,Yt(r)+1):n.setEnd(r,0),n.collapse(!1),e.removeAllRanges(),e.addRange(n),!i&&!t.state.selection.visible&&wn&&di<=11&&(r.disabled=!0,r.disabled=!1)}function H0(t,e){if(e instanceof pe){let n=t.docView.descAt(e.from);n!=t.lastSelectedViewDesc&&(c0(t),n&&n.selectNode(),t.lastSelectedViewDesc=n)}else c0(t)}function c0(t){t.lastSelectedViewDesc&&(t.lastSelectedViewDesc.parent&&t.lastSelectedViewDesc.deselectNode(),t.lastSelectedViewDesc=void 0)}function zf(t,e,n,r){return t.someProp("createSelectionBetween",i=>i(t,e,n))||ce.between(e,n,r)}function u0(t){return t.editable&&!t.hasFocus()?!1:z0(t)}function z0(t){let e=t.domSelectionRange();if(!e.anchorNode)return!1;try{return t.dom.contains(e.anchorNode.nodeType==3?e.anchorNode.parentNode:e.anchorNode)&&(t.editable||t.dom.contains(e.focusNode.nodeType==3?e.focusNode.parentNode:e.focusNode))}catch{return!1}}function gR(t){let e=t.docView.domFromPos(t.state.selection.anchor,0),n=t.domSelectionRange();return ji(e.node,e.offset,n.anchorNode,n.anchorOffset)}function Af(t,e){let{$anchor:n,$head:r}=t.selection,i=e>0?n.max(r):n.min(r),o=i.parent.inlineContent?i.depth?t.doc.resolve(e>0?i.after():i.before()):null:i;return o&&fe.findFrom(o,e)}function ci(t,e){return t.dispatch(t.state.tr.setSelection(e).scrollIntoView()),!0}function d0(t,e,n){let r=t.state.selection;if(r instanceof ce)if(n.indexOf("s")>-1){let{$head:i}=r,o=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter;if(!o||o.isText||!o.isLeaf)return!1;let s=t.state.doc.resolve(i.pos+o.nodeSize*(e<0?-1:1));return ci(t,new ce(r.$anchor,s))}else if(r.empty){if(t.endOfTextblock(e>0?"forward":"backward")){let i=Af(t.state,e);return i&&i instanceof pe?ci(t,i):!1}else if(!($n&&n.indexOf("m")>-1)){let i=r.$head,o=i.textOffset?null:e<0?i.nodeBefore:i.nodeAfter,s;if(!o||o.isText)return!1;let l=e<0?i.pos-o.nodeSize:i.pos;return o.isAtom||(s=t.docView.descAt(l))&&!s.contentDOM?pe.isSelectable(o)?ci(t,new pe(e<0?t.state.doc.resolve(i.pos-o.nodeSize):i)):Qs?ci(t,new ce(t.state.doc.resolve(e<0?l:l+o.nodeSize))):!1:!1}}else return!1;else{if(r instanceof pe&&r.node.isInline)return ci(t,new ce(e>0?r.$to:r.$from));{let i=Af(t.state,e);return i?ci(t,i):!1}}}function Dl(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function qs(t,e){let n=t.pmViewDesc;return n&&n.size==0&&(e<0||t.nextSibling||t.nodeName!="BR")}function zo(t,e){return e<0?bR(t):yR(t)}function bR(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let i,o,s=!1;for(or&&n.nodeType==1&&r0){if(n.nodeType!=1)break;{let l=n.childNodes[r-1];if(qs(l,-1))i=n,o=--r;else if(l.nodeType==3)n=l,r=n.nodeValue.length;else break}}else{if($0(n))break;{let l=n.previousSibling;for(;l&&qs(l,-1);)i=n.parentNode,o=Yt(l),l=l.previousSibling;if(l)n=l,r=Dl(n);else{if(n=n.parentNode,n==t.dom)break;r=0}}}s?Nf(t,n,r):i&&Nf(t,i,o)}function yR(t){let e=t.domSelectionRange(),n=e.focusNode,r=e.focusOffset;if(!n)return;let i=Dl(n),o,s;for(;;)if(r{t.state==i&&Hr(t)},50)}function f0(t,e){let n=t.state.doc.resolve(e);if(!(fn||VO)&&n.parent.inlineContent){let i=t.coordsAtPos(e);if(e>n.start()){let o=t.coordsAtPos(e-1),s=(o.top+o.bottom)/2;if(s>i.top&&s1)return o.lefti.top&&s1)return o.left>i.left?"ltr":"rtl"}}return getComputedStyle(t.dom).direction=="rtl"?"rtl":"ltr"}function p0(t,e,n){let r=t.state.selection;if(r instanceof ce&&!r.empty||n.indexOf("s")>-1||$n&&n.indexOf("m")>-1)return!1;let{$from:i,$to:o}=r;if(!i.parent.inlineContent||t.endOfTextblock(e<0?"up":"down")){let s=Af(t.state,e);if(s&&s instanceof pe)return ci(t,s)}if(!i.parent.inlineContent){let s=e<0?i:o,l=r instanceof On?fe.near(s,e):fe.findFrom(s,e);return l?ci(t,l):!1}return!1}function h0(t,e){if(!(t.state.selection instanceof ce))return!0;let{$head:n,$anchor:r,empty:i}=t.state.selection;if(!n.sameParent(r))return!0;if(!i)return!1;if(t.endOfTextblock(e>0?"forward":"backward"))return!0;let o=!n.textOffset&&(e<0?n.nodeBefore:n.nodeAfter);if(o&&!o.isText){let s=t.state.tr;return e<0?s.delete(n.pos-o.nodeSize,n.pos):s.delete(n.pos,n.pos+o.nodeSize),t.dispatch(s),!0}return!1}function m0(t,e,n){t.domObserver.stop(),e.contentEditable=n,t.domObserver.start()}function wR(t){if(!pn||t.state.selection.$head.parentOffset>0)return!1;let{focusNode:e,focusOffset:n}=t.domSelectionRange();if(e&&e.nodeType==1&&n==0&&e.firstChild&&e.firstChild.contentEditable=="false"){let r=e.firstChild;m0(t,r,"true"),setTimeout(()=>m0(t,r,"false"),20)}return!1}function xR(t){let e="";return t.ctrlKey&&(e+="c"),t.metaKey&&(e+="m"),t.altKey&&(e+="a"),t.shiftKey&&(e+="s"),e}function _R(t,e){let n=e.keyCode,r=xR(e);if(n==8||$n&&n==72&&r=="c")return h0(t,-1)||zo(t,-1);if(n==46&&!e.shiftKey||$n&&n==68&&r=="c")return h0(t,1)||zo(t,1);if(n==13||n==27)return!0;if(n==37||$n&&n==66&&r=="c"){let i=n==37?f0(t,t.state.selection.from)=="ltr"?-1:1:-1;return d0(t,i,r)||zo(t,i)}else if(n==39||$n&&n==70&&r=="c"){let i=n==39?f0(t,t.state.selection.from)=="ltr"?1:-1:1;return d0(t,i,r)||zo(t,i)}else{if(n==38||$n&&n==80&&r=="c")return p0(t,-1,r)||zo(t,-1);if(n==40||$n&&n==78&&r=="c")return wR(t)||p0(t,1,r)||zo(t,1);if(r==($n?"m":"c")&&(n==66||n==73||n==89||n==90))return!0}return!1}function U0(t,e){t.someProp("transformCopied",b=>{e=b(e,t)});let n=[],{content:r,openStart:i,openEnd:o}=e;for(;i>1&&o>1&&r.childCount==1&&r.firstChild.childCount==1;){i--,o--;let b=r.firstChild;n.push(b.type.name,b.attrs!=b.type.defaultAttrs?b.attrs:null),r=b.content}let s=t.someProp("clipboardSerializer")||Lr.fromSchema(t.state.schema),l=Y0(),u=l.createElement("div");u.appendChild(s.serializeFragment(r,{document:l}));let d=u.firstChild,f,h=0;for(;d&&d.nodeType==1&&(f=q0[d.nodeName.toLowerCase()]);){for(let b=f.length-1;b>=0;b--){let y=l.createElement(f[b]);for(;u.firstChild;)y.appendChild(u.firstChild);u.appendChild(y),h++}d=u.firstChild}d&&d.nodeType==1&&d.setAttribute("data-pm-slice",`${i} ${o}${h?` -${h}`:""} ${JSON.stringify(n)}`);let m=t.someProp("clipboardTextSerializer",b=>b(e,t))||e.content.textBetween(0,e.content.size,` + +`);return{dom:u,text:m}}function W0(t,e,n,r,i){let o=i.parent.type.spec.code,s,l;if(!n&&!e)return null;let u=e&&(r||o||!n);if(u){if(t.someProp("transformPastedText",m=>{e=m(e,o||r,t)}),o)return e?new X(K.from(t.state.schema.text(e.replace(/\r\n?/g,` +`))),0,0):X.empty;let h=t.someProp("clipboardTextParser",m=>m(e,i,r,t));if(h)l=h;else{let m=i.marks(),{schema:b}=t.state,y=Lr.fromSchema(b);s=document.createElement("div"),e.split(/(?:\r\n?|\n)+/).forEach(v=>{let x=s.appendChild(document.createElement("p"));v&&x.appendChild(y.serializeNode(b.text(v,m)))})}}else t.someProp("transformPastedHTML",h=>{n=h(n,t)}),s=MR(n),Qs&&CR(s);let d=s&&s.querySelector("[data-pm-slice]"),f=d&&/^(\d+) (\d+)(?: -(\d+))? (.*)/.exec(d.getAttribute("data-pm-slice")||"");if(f&&f[3])for(let h=+f[3];h>0;h--){let m=s.firstChild;for(;m&&m.nodeType!=1;)m=m.nextSibling;if(!m)break;s=m}if(l||(l=(t.someProp("clipboardParser")||t.someProp("domParser")||Wi.fromSchema(t.state.schema)).parseSlice(s,{preserveWhitespace:!!(u||f),context:i,ruleFromNode(m){return m.nodeName=="BR"&&!m.nextSibling&&m.parentNode&&!SR.test(m.parentNode.nodeName)?{ignore:!0}:null}})),f)l=kR(g0(l,+f[1],+f[2]),f[4]);else if(l=X.maxOpen(TR(l.content,i),!0),l.openStart||l.openEnd){let h=0,m=0;for(let b=l.content.firstChild;h{l=h(l,t)}),l}var SR=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function TR(t,e){if(t.childCount<2)return t;for(let n=e.depth;n>=0;n--){let i=e.node(n).contentMatchAt(e.index(n)),o,s=[];if(t.forEach(l=>{if(!s)return;let u=i.findWrapping(l.type),d;if(!u)return s=null;if(d=s.length&&o.length&&V0(u,o,l,s[s.length-1],0))s[s.length-1]=d;else{s.length&&(s[s.length-1]=G0(s[s.length-1],o.length));let f=K0(l,u);s.push(f),i=i.matchType(f.type),o=u}}),s)return K.from(s)}return t}function K0(t,e,n=0){for(let r=e.length-1;r>=n;r--)t=e[r].create(null,K.from(t));return t}function V0(t,e,n,r,i){if(i1&&(o=0),i=n&&(l=e<0?s.contentMatchAt(0).fillBefore(l,o<=i).append(l):l.append(s.contentMatchAt(s.childCount).fillBefore(K.empty,!0))),t.replaceChild(e<0?0:t.childCount-1,s.copy(l))}function g0(t,e,n){return e]*>)*/.exec(t);e&&(t=t.slice(e[0].length));let n=Y0().createElement("div"),r=/<([a-z][^>\s]+)/i.exec(t),i;if((i=r&&q0[r[1].toLowerCase()])&&(t=i.map(o=>"<"+o+">").join("")+t+i.map(o=>"").reverse().join("")),n.innerHTML=t,i)for(let o=0;o=0;l-=2){let u=n.nodes[r[l]];if(!u||u.hasRequiredAttrs())break;i=K.from(u.create(r[l+1],i)),o++,s++}return new X(i,o,s)}var hn={},mn={},AR={touchstart:!0,touchmove:!0},Rf=class{constructor(){this.shiftKey=!1,this.mouseDown=null,this.lastKeyCode=null,this.lastKeyCodeTime=0,this.lastClick={time:0,x:0,y:0,type:""},this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastIOSEnter=0,this.lastIOSEnterFallbackTimeout=-1,this.lastFocus=0,this.lastTouch=0,this.lastAndroidDelete=0,this.composing=!1,this.compositionNode=null,this.composingTimeout=-1,this.compositionNodes=[],this.compositionEndedAt=-2e8,this.compositionID=1,this.compositionPendingChanges=0,this.domChangeCount=0,this.eventHandlers=Object.create(null),this.hideSelectionGuard=null}};function NR(t){for(let e in hn){let n=hn[e];t.dom.addEventListener(e,t.input.eventHandlers[e]=r=>{RR(t,r)&&!$f(t,r)&&(t.editable||!(r.type in mn))&&n(t,r)},AR[e]?{passive:!0}:void 0)}pn&&t.dom.addEventListener("input",()=>null),If(t)}function ui(t,e){t.input.lastSelectionOrigin=e,t.input.lastSelectionTime=Date.now()}function OR(t){t.domObserver.stop();for(let e in t.input.eventHandlers)t.dom.removeEventListener(e,t.input.eventHandlers[e]);clearTimeout(t.input.composingTimeout),clearTimeout(t.input.lastIOSEnterFallbackTimeout)}function If(t){t.someProp("handleDOMEvents",e=>{for(let n in e)t.input.eventHandlers[n]||t.dom.addEventListener(n,t.input.eventHandlers[n]=r=>$f(t,r))})}function $f(t,e){return t.someProp("handleDOMEvents",n=>{let r=n[e.type];return r?r(t,e)||e.defaultPrevented:!1})}function RR(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let n=e.target;n!=t.dom;n=n.parentNode)if(!n||n.nodeType==11||n.pmViewDesc&&n.pmViewDesc.stopEvent(e))return!1;return!0}function IR(t,e){!$f(t,e)&&hn[e.type]&&(t.editable||!(e.type in mn))&&hn[e.type](t,e)}mn.keydown=(t,e)=>{let n=e;if(t.input.shiftKey=n.keyCode==16||n.shiftKey,!X0(t,n)&&(t.input.lastKeyCode=n.keyCode,t.input.lastKeyCodeTime=Date.now(),!(ir&&fn&&n.keyCode==13)))if(n.keyCode!=229&&t.domObserver.forceFlush(),Wo&&n.keyCode==13&&!n.ctrlKey&&!n.altKey&&!n.metaKey){let r=Date.now();t.input.lastIOSEnter=r,t.input.lastIOSEnterFallbackTimeout=setTimeout(()=>{t.input.lastIOSEnter==r&&(t.someProp("handleKeyDown",i=>i(t,Gi(13,"Enter"))),t.input.lastIOSEnter=0)},200)}else t.someProp("handleKeyDown",r=>r(t,n))||_R(t,n)?n.preventDefault():ui(t,"key")};mn.keyup=(t,e)=>{e.keyCode==16&&(t.input.shiftKey=!1)};mn.keypress=(t,e)=>{let n=e;if(X0(t,n)||!n.charCode||n.ctrlKey&&!n.altKey||$n&&n.metaKey)return;if(t.someProp("handleKeyPress",i=>i(t,n))){n.preventDefault();return}let r=t.state.selection;if(!(r instanceof ce)||!r.$from.sameParent(r.$to)){let i=String.fromCharCode(n.charCode);!/[\r\n]/.test(i)&&!t.someProp("handleTextInput",o=>o(t,r.$from.pos,r.$to.pos,i))&&t.dispatch(t.state.tr.insertText(i).scrollIntoView()),n.preventDefault()}};function Wl(t){return{left:t.clientX,top:t.clientY}}function LR(t,e){let n=e.x-t.clientX,r=e.y-t.clientY;return n*n+r*r<100}function Uf(t,e,n,r,i){if(r==-1)return!1;let o=t.state.doc.resolve(r);for(let s=o.depth+1;s>0;s--)if(t.someProp(e,l=>s>o.depth?l(t,n,o.nodeAfter,o.before(s),i,!0):l(t,n,o.node(s),o.before(s),i,!1)))return!0;return!1}function Uo(t,e,n){t.focused||t.focus();let r=t.state.tr.setSelection(e);n=="pointer"&&r.setMeta("pointer",!0),t.dispatch(r)}function DR(t,e){if(e==-1)return!1;let n=t.state.doc.resolve(e),r=n.nodeAfter;return r&&r.isAtom&&pe.isSelectable(r)?(Uo(t,new pe(n),"pointer"),!0):!1}function PR(t,e){if(e==-1)return!1;let n=t.state.selection,r,i;n instanceof pe&&(r=n.node);let o=t.state.doc.resolve(e);for(let s=o.depth+1;s>0;s--){let l=s>o.depth?o.nodeAfter:o.node(s);if(pe.isSelectable(l)){r&&n.$from.depth>0&&s>=n.$from.depth&&o.before(n.$from.depth+1)==n.$from.pos?i=o.before(n.$from.depth):i=o.before(s);break}}return i!=null?(Uo(t,pe.create(t.state.doc,i),"pointer"),!0):!1}function BR(t,e,n,r,i){return Uf(t,"handleClickOn",e,n,r)||t.someProp("handleClick",o=>o(t,e,r))||(i?PR(t,n):DR(t,n))}function FR(t,e,n,r){return Uf(t,"handleDoubleClickOn",e,n,r)||t.someProp("handleDoubleClick",i=>i(t,e,r))}function HR(t,e,n,r){return Uf(t,"handleTripleClickOn",e,n,r)||t.someProp("handleTripleClick",i=>i(t,e,r))||zR(t,n,r)}function zR(t,e,n){if(n.button!=0)return!1;let r=t.state.doc;if(e==-1)return r.inlineContent?(Uo(t,ce.create(r,0,r.content.size),"pointer"),!0):!1;let i=r.resolve(e);for(let o=i.depth+1;o>0;o--){let s=o>i.depth?i.nodeAfter:i.node(o),l=i.before(o);if(s.inlineContent)Uo(t,ce.create(r,l+1,l+1+s.content.size),"pointer");else if(pe.isSelectable(s))Uo(t,pe.create(r,l),"pointer");else continue;return!0}}function Wf(t){return Pl(t)}var J0=$n?"metaKey":"ctrlKey";hn.mousedown=(t,e)=>{let n=e;t.input.shiftKey=n.shiftKey;let r=Wf(t),i=Date.now(),o="singleClick";i-t.input.lastClick.time<500&&LR(n,t.input.lastClick)&&!n[J0]&&(t.input.lastClick.type=="singleClick"?o="doubleClick":t.input.lastClick.type=="doubleClick"&&(o="tripleClick")),t.input.lastClick={time:i,x:n.clientX,y:n.clientY,type:o};let s=t.posAtCoords(Wl(n));s&&(o=="singleClick"?(t.input.mouseDown&&t.input.mouseDown.done(),t.input.mouseDown=new Lf(t,s,n,!!r)):(o=="doubleClick"?FR:HR)(t,s.pos,s.inside,n)?n.preventDefault():ui(t,"pointer"))};var Lf=class{constructor(e,n,r,i){this.view=e,this.pos=n,this.event=r,this.flushed=i,this.delayedSelectionSync=!1,this.mightDrag=null,this.startDoc=e.state.doc,this.selectNode=!!r[J0],this.allowDefault=r.shiftKey;let o,s;if(n.inside>-1)o=e.state.doc.nodeAt(n.inside),s=n.inside;else{let f=e.state.doc.resolve(n.pos);o=f.parent,s=f.depth?f.before():0}let l=i?null:r.target,u=l?e.docView.nearestDesc(l,!0):null;this.target=u?u.dom:null;let{selection:d}=e.state;(r.button==0&&o.type.spec.draggable&&o.type.spec.selectable!==!1||d instanceof pe&&d.from<=s&&d.to>s)&&(this.mightDrag={node:o,pos:s,addAttr:!!(this.target&&!this.target.draggable),setUneditable:!!(this.target&&or&&!this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout(()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")},20),this.view.domObserver.start()),e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this)),ui(e,"pointer")}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout(()=>Hr(this.view)),this.view.input.mouseDown=null}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let n=this.pos;this.view.state.doc!=this.startDoc&&(n=this.view.posAtCoords(Wl(e))),this.updateAllowDefault(e),this.allowDefault||!n?ui(this.view,"pointer"):BR(this.view,n.pos,n.inside,e,this.selectNode)?e.preventDefault():e.button==0&&(this.flushed||pn&&this.mightDrag&&!this.mightDrag.node.isAtom||fn&&!this.view.state.selection.visible&&Math.min(Math.abs(n.pos-this.view.state.selection.from),Math.abs(n.pos-this.view.state.selection.to))<=2)?(Uo(this.view,fe.near(this.view.state.doc.resolve(n.pos)),"pointer"),e.preventDefault()):ui(this.view,"pointer")}move(e){this.updateAllowDefault(e),ui(this.view,"pointer"),e.buttons==0&&this.done()}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}};hn.touchstart=t=>{t.input.lastTouch=Date.now(),Wf(t),ui(t,"pointer")};hn.touchmove=t=>{t.input.lastTouch=Date.now(),ui(t,"pointer")};hn.contextmenu=t=>Wf(t);function X0(t,e){return t.composing?!0:pn&&Math.abs(e.timeStamp-t.input.compositionEndedAt)<500?(t.input.compositionEndedAt=-2e8,!0):!1}var $R=ir?5e3:-1;mn.compositionstart=mn.compositionupdate=t=>{if(!t.composing){t.domObserver.flush();let{state:e}=t,n=e.selection.$from;if(e.selection.empty&&(e.storedMarks||!n.textOffset&&n.parentOffset&&n.nodeBefore.marks.some(r=>r.type.spec.inclusive===!1)))t.markCursor=t.state.storedMarks||n.marks(),Pl(t,!0),t.markCursor=null;else if(Pl(t),or&&e.selection.empty&&n.parentOffset&&!n.textOffset&&n.nodeBefore.marks.length){let r=t.domSelectionRange();for(let i=r.focusNode,o=r.focusOffset;i&&i.nodeType==1&&o!=0;){let s=o<0?i.lastChild:i.childNodes[o-1];if(!s)break;if(s.nodeType==3){t.domSelection().collapse(s,s.nodeValue.length);break}else i=s,o=-1}}t.input.composing=!0}Z0(t,$R)};mn.compositionend=(t,e)=>{t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=e.timeStamp,t.input.compositionPendingChanges=t.domObserver.pendingRecords().length?t.input.compositionID:0,t.input.compositionNode=null,t.input.compositionPendingChanges&&Promise.resolve().then(()=>t.domObserver.flush()),t.input.compositionID++,Z0(t,20))};function Z0(t,e){clearTimeout(t.input.composingTimeout),e>-1&&(t.input.composingTimeout=setTimeout(()=>Pl(t),e))}function j0(t){for(t.composing&&(t.input.composing=!1,t.input.compositionEndedAt=WR());t.input.compositionNodes.length>0;)t.input.compositionNodes.pop().markParentsDirty()}function UR(t){let e=t.domSelectionRange();if(!e.focusNode)return null;let n=HO(e.focusNode,e.focusOffset),r=zO(e.focusNode,e.focusOffset);if(n&&r&&n!=r){let i=r.pmViewDesc;if(!i||!i.isText(r.nodeValue))return r;if(t.input.compositionNode==r){let o=n.pmViewDesc;if(!(!o||!o.isText(n.nodeValue)))return r}}return n}function WR(){let t=document.createEvent("Event");return t.initEvent("event",!0,!0),t.timeStamp}function Pl(t,e=!1){if(!(ir&&t.domObserver.flushingSoon>=0)){if(t.domObserver.forceFlush(),j0(t),e||t.docView&&t.docView.dirty){let n=Hf(t);return n&&!n.eq(t.state.selection)?t.dispatch(t.state.tr.setSelection(n)):t.updateState(t.state),!0}return!1}}function KR(t,e){if(!t.dom.parentNode)return;let n=t.dom.parentNode.appendChild(document.createElement("div"));n.appendChild(e),n.style.cssText="position: fixed; left: -10000px; top: 10px";let r=getSelection(),i=document.createRange();i.selectNodeContents(e),t.dom.blur(),r.removeAllRanges(),r.addRange(i),setTimeout(()=>{n.parentNode&&n.parentNode.removeChild(n),t.focus()},50)}var Js=wn&&di<15||Wo&&GO<604;hn.copy=mn.cut=(t,e)=>{let n=e,r=t.state.selection,i=n.type=="cut";if(r.empty)return;let o=Js?null:n.clipboardData,s=r.content(),{dom:l,text:u}=U0(t,s);o?(n.preventDefault(),o.clearData(),o.setData("text/html",l.innerHTML),o.setData("text/plain",u)):KR(t,l),i&&t.dispatch(t.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))};function VR(t){return t.openStart==0&&t.openEnd==0&&t.content.childCount==1?t.content.firstChild:null}function GR(t,e){if(!t.dom.parentNode)return;let n=t.input.shiftKey||t.state.selection.$from.parent.type.spec.code,r=t.dom.parentNode.appendChild(document.createElement(n?"textarea":"div"));n||(r.contentEditable="true"),r.style.cssText="position: fixed; left: -10000px; top: 10px",r.focus();let i=t.input.shiftKey&&t.input.lastKeyCode!=45;setTimeout(()=>{t.focus(),r.parentNode&&r.parentNode.removeChild(r),n?Xs(t,r.value,null,i,e):Xs(t,r.textContent,r.innerHTML,i,e)},50)}function Xs(t,e,n,r,i){let o=W0(t,e,n,r,t.state.selection.$from);if(t.someProp("handlePaste",u=>u(t,i,o||X.empty)))return!0;if(!o)return!1;let s=VR(o),l=s?t.state.tr.replaceSelectionWith(s,r):t.state.tr.replaceSelection(o);return t.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function Q0(t){let e=t.getData("text/plain")||t.getData("Text");if(e)return e;let n=t.getData("text/uri-list");return n?n.replace(/\r?\n/g," "):""}mn.paste=(t,e)=>{let n=e;if(t.composing&&!ir)return;let r=Js?null:n.clipboardData,i=t.input.shiftKey&&t.input.lastKeyCode!=45;r&&Xs(t,Q0(r),r.getData("text/html"),i,n)?n.preventDefault():GR(t,n)};var Bl=class{constructor(e,n,r){this.slice=e,this.move=n,this.node=r}},eE=$n?"altKey":"ctrlKey";hn.dragstart=(t,e)=>{let n=e,r=t.input.mouseDown;if(r&&r.done(),!n.dataTransfer)return;let i=t.state.selection,o=i.empty?null:t.posAtCoords(Wl(n)),s;if(!(o&&o.pos>=i.from&&o.pos<=(i instanceof pe?i.to-1:i.to))){if(r&&r.mightDrag)s=pe.create(t.state.doc,r.mightDrag.pos);else if(n.target&&n.target.nodeType==1){let f=t.docView.nearestDesc(n.target,!0);f&&f.node.type.spec.draggable&&f!=t.docView&&(s=pe.create(t.state.doc,f.posBefore))}}let l=(s||t.state.selection).content(),{dom:u,text:d}=U0(t,l);n.dataTransfer.clearData(),n.dataTransfer.setData(Js?"Text":"text/html",u.innerHTML),n.dataTransfer.effectAllowed="copyMove",Js||n.dataTransfer.setData("text/plain",d),t.dragging=new Bl(l,!n[eE],s)};hn.dragend=t=>{let e=t.dragging;window.setTimeout(()=>{t.dragging==e&&(t.dragging=null)},50)};mn.dragover=mn.dragenter=(t,e)=>e.preventDefault();mn.drop=(t,e)=>{let n=e,r=t.dragging;if(t.dragging=null,!n.dataTransfer)return;let i=t.posAtCoords(Wl(n));if(!i)return;let o=t.state.doc.resolve(i.pos),s=r&&r.slice;s?t.someProp("transformPasted",y=>{s=y(s,t)}):s=W0(t,Q0(n.dataTransfer),Js?null:n.dataTransfer.getData("text/html"),!1,o);let l=!!(r&&!n[eE]);if(t.someProp("handleDrop",y=>y(t,n,s||X.empty,l))){n.preventDefault();return}if(!s)return;n.preventDefault();let u=s?kl(t.state.doc,o.pos,s):o.pos;u==null&&(u=o.pos);let d=t.state.tr;if(l){let{node:y}=r;y?y.replace(d):d.deleteSelection()}let f=d.mapping.map(u),h=s.openStart==0&&s.openEnd==0&&s.content.childCount==1,m=d.doc;if(h?d.replaceRangeWith(f,f,s.content.firstChild):d.replaceRange(f,f,s),d.doc.eq(m))return;let b=d.doc.resolve(f);if(h&&pe.isSelectable(s.content.firstChild)&&b.nodeAfter&&b.nodeAfter.sameMarkup(s.content.firstChild))d.setSelection(new pe(b));else{let y=d.mapping.map(u);d.mapping.maps[d.mapping.maps.length-1].forEach((v,x,S,D)=>y=D),d.setSelection(zf(t,b,d.doc.resolve(y)))}t.focus(),t.dispatch(d.setMeta("uiEvent","drop"))};hn.focus=t=>{t.input.lastFocus=Date.now(),t.focused||(t.domObserver.stop(),t.dom.classList.add("ProseMirror-focused"),t.domObserver.start(),t.focused=!0,setTimeout(()=>{t.docView&&t.hasFocus()&&!t.domObserver.currentSelection.eq(t.domSelectionRange())&&Hr(t)},20))};hn.blur=(t,e)=>{let n=e;t.focused&&(t.domObserver.stop(),t.dom.classList.remove("ProseMirror-focused"),t.domObserver.start(),n.relatedTarget&&t.dom.contains(n.relatedTarget)&&t.domObserver.currentSelection.clear(),t.focused=!1)};hn.beforeinput=(t,e)=>{if(fn&&ir&&e.inputType=="deleteContentBackward"){t.domObserver.flushSoon();let{domChangeCount:r}=t.input;setTimeout(()=>{if(t.input.domChangeCount!=r||(t.dom.blur(),t.focus(),t.someProp("handleKeyDown",o=>o(t,Gi(8,"Backspace")))))return;let{$cursor:i}=t.state.selection;i&&i.pos>0&&t.dispatch(t.state.tr.delete(i.pos-1,i.pos).scrollIntoView())},50)}};for(let t in mn)hn[t]=mn[t];function Zs(t,e){if(t==e)return!0;for(let n in t)if(t[n]!==e[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}var Fl=class t{constructor(e,n){this.toDOM=e,this.spec=n||Xi,this.side=this.spec.side||0}map(e,n,r,i){let{pos:o,deleted:s}=e.mapResult(n.from+i,this.side<0?-1:1);return s?null:new Mt(o-r,o-r,this)}valid(){return!0}eq(e){return this==e||e instanceof t&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&Zs(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}},Ji=class t{constructor(e,n){this.attrs=e,this.spec=n||Xi}map(e,n,r,i){let o=e.map(n.from+i,this.spec.inclusiveStart?-1:1)-r,s=e.map(n.to+i,this.spec.inclusiveEnd?1:-1)-r;return o>=s?null:new Mt(o,s,this)}valid(e,n){return n.from=e&&(!o||o(l.spec))&&r.push(l.copy(l.from+i,l.to+i))}for(let s=0;se){let l=this.children[s]+1;this.children[s+2].findInner(e-l,n-l,r,i+l,o)}}map(e,n,r){return this==rn||e.maps.length==0?this:this.mapInner(e,n,0,0,r||Xi)}mapInner(e,n,r,i,o){let s;for(let l=0;l{let d=u+r,f;if(f=nE(n,l,d)){for(i||(i=this.children.slice());ol&&h.to=e){this.children[l]==e&&(r=this.children[l+2]);break}let o=e+1,s=o+n.content.size;for(let l=0;lo&&u.type instanceof Ji){let d=Math.max(o,u.from)-o,f=Math.min(s,u.to)-o;di.map(e,n,Xi));return t.from(r)}forChild(e,n){if(n.isLeaf)return lt.empty;let r=[];for(let i=0;in instanceof lt)?e:e.reduce((n,r)=>n.concat(r instanceof lt?r:r.members),[]))}}};function qR(t,e,n,r,i,o,s){let l=t.slice();for(let d=0,f=o;d{let x=v-y-(b-m);for(let S=0;SD+f-h)continue;let L=l[S]+f-h;b>=L?l[S+1]=m<=L?-2:-1:m>=f&&x&&(l[S]+=x,l[S+1]+=x)}h+=x}),f=n.maps[d].map(f,-1)}let u=!1;for(let d=0;d=r.content.size){u=!0;continue}let m=n.map(t[d+1]+o,-1),b=m-i,{index:y,offset:v}=r.content.findIndex(h),x=r.maybeChild(y);if(x&&v==h&&v+x.nodeSize==b){let S=l[d+2].mapInner(n,x,f+1,t[d]+o+1,s);S!=rn?(l[d]=h,l[d+1]=b,l[d+2]=S):(l[d+1]=-2,u=!0)}else u=!0}if(u){let d=YR(l,t,e,n,i,o,s),f=zl(d,r,0,s);e=f.local;for(let h=0;hn&&s.to{let d=nE(t,l,u+n);if(d){o=!0;let f=zl(d,l,n+u+1,r);f!=rn&&i.push(u,u+l.nodeSize,f)}});let s=tE(o?rE(t):t,-n).sort(Zi);for(let l=0;l0;)e++;t.splice(e,0,n)}function bf(t){let e=[];return t.someProp("decorations",n=>{let r=n(t.state);r&&r!=rn&&e.push(r)}),t.cursorWrapper&&e.push(lt.create(t.state.doc,[t.cursorWrapper.deco])),Hl.from(e)}var JR={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},XR=wn&&di<=11,Pf=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}},Bf=class{constructor(e,n){this.view=e,this.handleDOMChange=n,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new Pf,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.observer=window.MutationObserver&&new window.MutationObserver(r=>{for(let i=0;ii.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),XR&&(this.onCharData=r=>{this.queue.push({target:r.target,type:"characterData",oldValue:r.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout(()=>{this.flushingSoon=-1,this.flush()},20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,JR)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let n=0;nthis.flush(),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout(()=>this.suppressingSelectionUpdates=!1,50)}onSelectionChange(){if(u0(this.view)){if(this.suppressingSelectionUpdates)return Hr(this.view);if(wn&&di<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&ji(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let n=new Set,r;for(let o=e.focusNode;o;o=Ys(o))n.add(o);for(let o=e.anchorNode;o;o=Ys(o))if(n.has(o)){r=o;break}let i=r&&this.view.docView.nearestDesc(r);if(i&&i.ignoreMutation({type:"selection",target:r.nodeType==3?r.parentNode:r}))return this.setCurSelection(),!0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let n=this.pendingRecords();n.length&&(this.queue=[]);let r=e.domSelectionRange(),i=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(r)&&u0(e)&&!this.ignoreSelectionChange(r),o=-1,s=-1,l=!1,u=[];if(e.editable)for(let f=0;f1){let f=u.filter(h=>h.nodeName=="BR");if(f.length==2){let h=f[0],m=f[1];h.parentNode&&h.parentNode.parentNode==m.parentNode?m.remove():h.remove()}}let d=null;o<0&&i&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||i)&&(o>-1&&(e.docView.markDirty(o,s),ZR(e)),this.handleDOMChange(o,s,l,u),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(r)||Hr(e),this.currentSelection.set(r))}registerMutation(e,n){if(n.indexOf(e.target)>-1)return null;let r=this.view.docView.nearestDesc(e.target);if(e.type=="attributes"&&(r==this.view.docView||e.attributeName=="contenteditable"||e.attributeName=="style"&&!e.oldValue&&!e.target.getAttribute("style"))||!r||r.ignoreMutation(e))return null;if(e.type=="childList"){for(let f=0;fi;x--){let S=r.childNodes[x-1],D=S.pmViewDesc;if(S.nodeName=="BR"&&!D){o=x;break}if(!D||D.size)break}let h=t.state.doc,m=t.someProp("domParser")||Wi.fromSchema(t.state.schema),b=h.resolve(s),y=null,v=m.parse(r,{topNode:b.parent,topMatch:b.parent.contentMatchAt(b.index()),topOpen:!0,from:i,to:o,preserveWhitespace:b.parent.type.whitespace=="pre"?"full":!0,findPositions:d,ruleFromNode:eI,context:b});if(d&&d[0].pos!=null){let x=d[0].pos,S=d[1]&&d[1].pos;S==null&&(S=x),y={anchor:x+s,head:S+s}}return{doc:v,sel:y,from:s,to:l}}function eI(t){let e=t.pmViewDesc;if(e)return e.parseRule();if(t.nodeName=="BR"&&t.parentNode){if(pn&&/^(ul|ol)$/i.test(t.parentNode.nodeName)){let n=document.createElement("div");return n.appendChild(document.createElement("li")),{skip:n}}else if(t.parentNode.lastChild==t||pn&&/^(tr|table)$/i.test(t.parentNode.nodeName))return{ignore:!0}}else if(t.nodeName=="IMG"&&t.getAttribute("mark-placeholder"))return{ignore:!0};return null}var tI=/^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;function nI(t,e,n,r,i){let o=t.input.compositionPendingChanges||(t.composing?t.input.compositionID:0);if(t.input.compositionPendingChanges=0,e<0){let $=t.input.lastSelectionTime>Date.now()-50?t.input.lastSelectionOrigin:null,oe=Hf(t,$);if(oe&&!t.state.selection.eq(oe)){if(fn&&ir&&t.input.lastKeyCode===13&&Date.now()-100Te(t,Gi(13,"Enter"))))return;let me=t.state.tr.setSelection(oe);$=="pointer"?me.setMeta("pointer",!0):$=="key"&&me.scrollIntoView(),o&&me.setMeta("composition",o),t.dispatch(me)}return}let s=t.state.doc.resolve(e),l=s.sharedDepth(n);e=s.before(l+1),n=t.state.doc.resolve(n).after(l+1);let u=t.state.selection,d=QR(t,e,n),f=t.state.doc,h=f.slice(d.from,d.to),m,b;t.input.lastKeyCode===8&&Date.now()-100Date.now()-225||ir)&&i.some($=>$.nodeType==1&&!tI.test($.nodeName))&&(!y||y.endA>=y.endB)&&t.someProp("handleKeyDown",$=>$(t,Gi(13,"Enter")))){t.input.lastIOSEnter=0;return}if(!y)if(r&&u instanceof ce&&!u.empty&&u.$head.sameParent(u.$anchor)&&!t.composing&&!(d.sel&&d.sel.anchor!=d.sel.head))y={start:u.from,endA:u.to,endB:u.to};else{if(d.sel){let $=w0(t,t.state.doc,d.sel);if($&&!$.eq(t.state.selection)){let oe=t.state.tr.setSelection($);o&&oe.setMeta("composition",o),t.dispatch(oe)}}return}t.input.domChangeCount++,t.state.selection.fromt.state.selection.from&&y.start<=t.state.selection.from+2&&t.state.selection.from>=d.from?y.start=t.state.selection.from:y.endA=t.state.selection.to-2&&t.state.selection.to<=d.to&&(y.endB+=t.state.selection.to-y.endA,y.endA=t.state.selection.to)),wn&&di<=11&&y.endB==y.start+1&&y.endA==y.start&&y.start>d.from&&d.doc.textBetween(y.start-d.from-1,y.start-d.from+1)==" \xA0"&&(y.start--,y.endA--,y.endB--);let v=d.doc.resolveNoCache(y.start-d.from),x=d.doc.resolveNoCache(y.endB-d.from),S=f.resolve(y.start),D=v.sameParent(x)&&v.parent.inlineContent&&S.end()>=y.endA,L;if((Wo&&t.input.lastIOSEnter>Date.now()-225&&(!D||i.some($=>$.nodeName=="DIV"||$.nodeName=="P"))||!D&&v.pos$(t,Gi(13,"Enter")))){t.input.lastIOSEnter=0;return}if(t.state.selection.anchor>y.start&&iI(f,y.start,y.endA,v,x)&&t.someProp("handleKeyDown",$=>$(t,Gi(8,"Backspace")))){ir&&fn&&t.domObserver.suppressSelectionUpdates();return}fn&&ir&&y.endB==y.start&&(t.input.lastAndroidDelete=Date.now()),ir&&!D&&v.start()!=x.start()&&x.parentOffset==0&&v.depth==x.depth&&d.sel&&d.sel.anchor==d.sel.head&&d.sel.head==y.endA&&(y.endB-=2,x=d.doc.resolveNoCache(y.endB-d.from),setTimeout(()=>{t.someProp("handleKeyDown",function($){return $(t,Gi(13,"Enter"))})},20));let T=y.start,z=y.endA,O,Y,ie;if(D){if(v.pos==x.pos)wn&&di<=11&&v.parentOffset==0&&(t.domObserver.suppressSelectionUpdates(),setTimeout(()=>Hr(t),20)),O=t.state.tr.delete(T,z),Y=f.resolve(y.start).marksAcross(f.resolve(y.endA));else if(y.endA==y.endB&&(ie=rI(v.parent.content.cut(v.parentOffset,x.parentOffset),S.parent.content.cut(S.parentOffset,y.endA-S.start()))))O=t.state.tr,ie.type=="add"?O.addMark(T,z,ie.mark):O.removeMark(T,z,ie.mark);else if(v.parent.child(v.index()).isText&&v.index()==x.index()-(x.textOffset?0:1)){let $=v.parent.textBetween(v.parentOffset,x.parentOffset);if(t.someProp("handleTextInput",oe=>oe(t,T,z,$)))return;O=t.state.tr.insertText($,T,z)}}if(O||(O=t.state.tr.replace(T,z,d.doc.slice(y.start-d.from,y.endB-d.from))),d.sel){let $=w0(t,O.doc,d.sel);$&&!(fn&&ir&&t.composing&&$.empty&&(y.start!=y.endB||t.input.lastAndroidDeletee.content.size?null:zf(t,e.resolve(n.anchor),e.resolve(n.head))}function rI(t,e){let n=t.firstChild.marks,r=e.firstChild.marks,i=n,o=r,s,l,u;for(let f=0;ff.mark(l.addToSet(f.marks));else if(i.length==0&&o.length==1)l=o[0],s="remove",u=f=>f.mark(l.removeFromSet(f.marks));else return null;let d=[];for(let f=0;fn||yf(s,!0,!1)0&&(e||t.indexAfter(r)==t.node(r).childCount);)r--,i++,e=!1;if(n){let o=t.node(r).maybeChild(t.indexAfter(r));for(;o&&!o.isLeaf;)o=o.firstChild,i++}return i}function oI(t,e,n,r,i){let o=t.findDiffStart(e,n);if(o==null)return null;let{a:s,b:l}=t.findDiffEnd(e,n+t.size,n+e.size);if(i=="end"){let u=Math.max(0,o-Math.min(s,l));r-=s+u-o}if(s=s?o-r:0;o-=u,o&&o=l?o-r:0;o-=u,o&&o=56320&&e<=57343&&n>=55296&&n<=56319}var $l=class{constructor(e,n){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new Rf,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=n,this.state=n.state,this.directPlugins=n.plugins||[],this.directPlugins.forEach(C0),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):typeof e=="function"?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=T0(this),S0(this),this.nodeViews=M0(this),this.docView=i0(this.state.doc,_0(this),bf(this),this.dom,this),this.domObserver=new Bf(this,(r,i,o,s)=>nI(this,r,i,o,s)),this.domObserver.start(),NR(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let n in e)this._props[n]=e[n];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&If(this);let n=this._props;this._props=e,e.plugins&&(e.plugins.forEach(C0),this.directPlugins=e.plugins),this.updateStateInner(e.state,n)}setProps(e){let n={};for(let r in this._props)n[r]=this._props[r];n.state=this.state;for(let r in e)n[r]=e[r];this.update(n)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,n){var r;let i=this.state,o=!1,s=!1;e.storedMarks&&this.composing&&(j0(this),s=!0),this.state=e;let l=i.plugins!=e.plugins||this._props.plugins!=n.plugins;if(l||this._props.plugins!=n.plugins||this._props.nodeViews!=n.nodeViews){let b=M0(this);aI(b,this.nodeViews)&&(this.nodeViews=b,o=!0)}(l||n.handleDOMEvents!=this._props.handleDOMEvents)&&If(this),this.editable=T0(this),S0(this);let u=bf(this),d=_0(this),f=i.plugins!=e.plugins&&!i.doc.eq(e.doc)?"reset":e.scrollToSelection>i.scrollToSelection?"to selection":"preserve",h=o||!this.docView.matchesNode(e.doc,d,u);(h||!e.selection.eq(i.selection))&&(s=!0);let m=f=="preserve"&&s&&this.dom.style.overflowAnchor==null&&JO(this);if(s){this.domObserver.stop();let b=h&&(wn||fn)&&!this.composing&&!i.selection.empty&&!e.selection.empty&&sI(i.selection,e.selection);if(h){let y=fn?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=UR(this)),(o||!this.docView.update(e.doc,d,u,this))&&(this.docView.updateOuterDeco(d),this.docView.destroy(),this.docView=i0(e.doc,d,u,this.dom,this)),y&&!this.trackWrites&&(b=!0)}b||!(this.input.mouseDown&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&gR(this))?Hr(this,b):(H0(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(i),!((r=this.dragging)===null||r===void 0)&&r.node&&!i.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,i),f=="reset"?this.dom.scrollTop=0:f=="to selection"?this.scrollToSelection():m&&XO(m)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(!this.someProp("handleScrollToSelection",n=>n(this)))if(this.state.selection instanceof pe){let n=this.docView.domAfterPos(this.state.selection.from);n.nodeType==1&&jy(this,n.getBoundingClientRect(),e)}else jy(this,this.coordsAtPos(this.state.selection.head,1),e)}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(!e||e.plugins!=this.state.plugins||this.directPlugins!=this.prevDirectPlugins){this.prevDirectPlugins=this.directPlugins,this.destroyPluginViews();for(let n=0;n0&&this.state.doc.nodeAt(o))==r.node&&(i=o)}this.dragging=new Bl(e.slice,e.move,i<0?void 0:pe.create(this.state.doc,i))}someProp(e,n){let r=this._props&&this._props[e],i;if(r!=null&&(i=n?n(r):r))return i;for(let s=0;sn.ownerDocument.getSelection()),this._root=n}return e||document}updateRoot(){this._root=null}posAtCoords(e){return nR(this,e)}coordsAtPos(e,n=1){return I0(this,e,n)}domAtPos(e,n=0){return this.docView.domFromPos(e,n)}nodeDOM(e){let n=this.docView.descAt(e);return n?n.nodeDOM:null}posAtDOM(e,n,r=-1){let i=this.docView.posFromDOM(e,n,r);if(i==null)throw new RangeError("DOM position not inside the editor");return i}endOfTextblock(e,n){return aR(this,n||this.state,e)}pasteHTML(e,n){return Xs(this,"",e,!1,n||new ClipboardEvent("paste"))}pasteText(e,n){return Xs(this,e,null,!0,n||new ClipboardEvent("paste"))}destroy(){this.docView&&(OR(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],bf(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,BO())}get isDestroyed(){return this.docView==null}dispatchEvent(e){return IR(this,e)}dispatch(e){let n=this._props.dispatchTransaction;n?n.call(this,e):this.updateState(this.state.apply(e))}domSelectionRange(){return pn&&this.root.nodeType===11&&UO(this.dom.ownerDocument)==this.dom?jR(this):this.domSelection()}domSelection(){return this.root.getSelection()}};function _0(t){let e=Object.create(null);return e.class="ProseMirror",e.contenteditable=String(t.editable),t.someProp("attributes",n=>{if(typeof n=="function"&&(n=n(t.state)),n)for(let r in n)r=="class"?e.class+=" "+n[r]:r=="style"?e.style=(e.style?e.style+";":"")+n[r]:!e[r]&&r!="contenteditable"&&r!="nodeName"&&(e[r]=String(n[r]))}),e.translate||(e.translate="no"),[Mt.node(0,t.state.doc.content.size,e)]}function S0(t){if(t.markCursor){let e=document.createElement("img");e.className="ProseMirror-separator",e.setAttribute("mark-placeholder","true"),e.setAttribute("alt",""),t.cursorWrapper={dom:e,deco:Mt.widget(t.state.selection.head,e,{raw:!0,marks:t.markCursor})}}else t.cursorWrapper=null}function T0(t){return!t.someProp("editable",e=>e(t.state)===!1)}function sI(t,e){let n=Math.min(t.$anchor.sharedDepth(t.head),e.$anchor.sharedDepth(e.head));return t.$anchor.start(n)!=e.$anchor.start(n)}function M0(t){let e=Object.create(null);function n(r){for(let i in r)Object.prototype.hasOwnProperty.call(e,i)||(e[i]=r[i])}return t.someProp("nodeViews",n),t.someProp("markViews",n),e}function aI(t,e){let n=0,r=0;for(let i in t){if(t[i]!=e[i])return!0;n++}for(let i in e)r++;return n!=r}function C0(t){if(t.spec.state||t.spec.filterTransaction||t.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var zr={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},Vl={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},lI=typeof navigator<"u"&&/Mac/.test(navigator.platform),cI=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(Ct=0;Ct<10;Ct++)zr[48+Ct]=zr[96+Ct]=String(Ct);var Ct;for(Ct=1;Ct<=24;Ct++)zr[Ct+111]="F"+Ct;var Ct;for(Ct=65;Ct<=90;Ct++)zr[Ct]=String.fromCharCode(Ct+32),Vl[Ct]=String.fromCharCode(Ct);var Ct;for(Kl in zr)Vl.hasOwnProperty(Kl)||(Vl[Kl]=zr[Kl]);var Kl;function iE(t){var e=lI&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||cI&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",n=!e&&t.key||(t.shiftKey?Vl:zr)[t.keyCode]||t.key||"Unidentified";return n=="Esc"&&(n="Escape"),n=="Del"&&(n="Delete"),n=="Left"&&(n="ArrowLeft"),n=="Up"&&(n="ArrowUp"),n=="Right"&&(n="ArrowRight"),n=="Down"&&(n="ArrowDown"),n}var uI=typeof navigator<"u"?/Mac|iP(hone|[oa]d)/.test(navigator.platform):!1;function dI(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n=="Space"&&(n=" ");let r,i,o,s;for(let l=0;l127)&&(o=zr[r.keyCode])&&o!=i){let l=e[Vf(o,r)];if(l&&l(n.state,n.dispatch,n))return!0}}return!1}}var Gl=(t,e)=>t.selection.empty?!1:(e&&e(t.tr.deleteSelection().scrollIntoView()),!0);function aE(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("backward",t):n.parentOffset>0)?null:n}var qf=(t,e,n)=>{let r=aE(t,n);if(!r)return!1;let i=Jf(r);if(!i){let s=r.blockRange(),l=s&&Pr(s);return l==null?!1:(e&&e(t.tr.lift(s,l).scrollIntoView()),!0)}let o=i.nodeBefore;if(!o.type.spec.isolating&&gE(t,i,e))return!0;if(r.parent.content.size==0&&(Vo(o,"end")||pe.isSelectable(o))){let s=Us(t.doc,r.before(),r.after(),X.empty);if(s&&s.slice.size{let r=aE(t,n);if(!r)return!1;let i=Jf(r);return i?uE(t,i,e):!1},cE=(t,e,n)=>{let r=dE(t,n);if(!r)return!1;let i=jf(r);return i?uE(t,i,e):!1};function uE(t,e,n){let r=e.nodeBefore,i=r,o=e.pos-1;for(;!i.isTextblock;o--){if(i.type.spec.isolating)return!1;let f=i.lastChild;if(!f)return!1;i=f}let s=e.nodeAfter,l=s,u=e.pos+1;for(;!l.isTextblock;u++){if(l.type.spec.isolating)return!1;let f=l.firstChild;if(!f)return!1;l=f}let d=Us(t.doc,o,u,X.empty);if(!d||d.from!=o||d instanceof nn&&d.slice.size>=u-o)return!1;if(n){let f=t.tr.step(d);f.setSelection(ce.create(f.doc,o)),n(f.scrollIntoView())}return!0}function Vo(t,e,n=!1){for(let r=t;r;r=e=="start"?r.firstChild:r.lastChild){if(r.isTextblock)return!0;if(n&&r.childCount!=1)return!1}return!1}var Yf=(t,e,n)=>{let{$head:r,empty:i}=t.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("backward",t):r.parentOffset>0)return!1;o=Jf(r)}let s=o&&o.nodeBefore;return!s||!pe.isSelectable(s)?!1:(e&&e(t.tr.setSelection(pe.create(t.doc,o.pos-s.nodeSize)).scrollIntoView()),!0)};function Jf(t){if(!t.parent.type.spec.isolating)for(let e=t.depth-1;e>=0;e--){if(t.index(e)>0)return t.doc.resolve(t.before(e+1));if(t.node(e).type.spec.isolating)break}return null}function dE(t,e){let{$cursor:n}=t.selection;return!n||(e?!e.endOfTextblock("forward",t):n.parentOffset{let r=dE(t,n);if(!r)return!1;let i=jf(r);if(!i)return!1;let o=i.nodeAfter;if(gE(t,i,e))return!0;if(r.parent.content.size==0&&(Vo(o,"start")||pe.isSelectable(o))){let s=Us(t.doc,r.before(),r.after(),X.empty);if(s&&s.slice.size{let{$head:r,empty:i}=t.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("forward",t):r.parentOffset=0;e--){let n=t.node(e);if(t.index(e)+1{let n=t.selection,r=n instanceof pe,i;if(r){if(n.node.isTextblock||!rr(t.doc,n.from))return!1;i=n.from}else if(i=Bo(t.doc,n.from,-1),i==null)return!1;if(e){let o=t.tr.join(i);r&&o.setSelection(pe.create(o.doc,i-t.doc.resolve(i).nodeBefore.nodeSize)),e(o.scrollIntoView())}return!0},pE=(t,e)=>{let n=t.selection,r;if(n instanceof pe){if(n.node.isTextblock||!rr(t.doc,n.to))return!1;r=n.to}else if(r=Bo(t.doc,n.to,1),r==null)return!1;return e&&e(t.tr.join(r).scrollIntoView()),!0},hE=(t,e)=>{let{$from:n,$to:r}=t.selection,i=n.blockRange(r),o=i&&Pr(i);return o==null?!1:(e&&e(t.tr.lift(i,o).scrollIntoView()),!0)},Qf=(t,e)=>{let{$head:n,$anchor:r}=t.selection;return!n.parent.type.spec.code||!n.sameParent(r)?!1:(e&&e(t.tr.insertText(` +`).scrollIntoView()),!0)};function ep(t){for(let e=0;e{let{$head:n,$anchor:r}=t.selection;if(!n.parent.type.spec.code||!n.sameParent(r))return!1;let i=n.node(-1),o=n.indexAfter(-1),s=ep(i.contentMatchAt(o));if(!s||!i.canReplaceWith(o,o,s))return!1;if(e){let l=n.after(),u=t.tr.replaceWith(l,l,s.createAndFill());u.setSelection(fe.near(u.doc.resolve(l),1)),e(u.scrollIntoView())}return!0},np=(t,e)=>{let n=t.selection,{$from:r,$to:i}=n;if(n instanceof On||r.parent.inlineContent||i.parent.inlineContent)return!1;let o=ep(i.parent.contentMatchAt(i.indexAfter()));if(!o||!o.isTextblock)return!1;if(e){let s=(!r.parentOffset&&i.index(){let{$cursor:n}=t.selection;if(!n||n.parent.content.size)return!1;if(n.depth>1&&n.after()!=n.end(-1)){let o=n.before();if(zn(t.doc,o))return e&&e(t.tr.split(o).scrollIntoView()),!0}let r=n.blockRange(),i=r&&Pr(r);return i==null?!1:(e&&e(t.tr.lift(r,i).scrollIntoView()),!0)};function pI(t){return(e,n)=>{let{$from:r,$to:i}=e.selection;if(e.selection instanceof pe&&e.selection.node.isBlock)return!r.parentOffset||!zn(e.doc,r.pos)?!1:(n&&n(e.tr.split(r.pos).scrollIntoView()),!0);if(!r.parent.isBlock)return!1;if(n){let o=i.parentOffset==i.parent.content.size,s=e.tr;(e.selection instanceof ce||e.selection instanceof On)&&s.deleteSelection();let l=r.depth==0?null:ep(r.node(-1).contentMatchAt(r.indexAfter(-1))),u=t&&t(i.parent,o),d=u?[u]:o&&l?[{type:l}]:void 0,f=zn(s.doc,s.mapping.map(r.pos),1,d);if(!d&&!f&&zn(s.doc,s.mapping.map(r.pos),1,l?[{type:l}]:void 0)&&(l&&(d=[{type:l}]),f=!0),f&&(s.split(s.mapping.map(r.pos),1,d),!o&&!r.parentOffset&&r.parent.type!=l)){let h=s.mapping.map(r.before()),m=s.doc.resolve(h);l&&r.node(-1).canReplaceWith(m.index(),m.index()+1,l)&&s.setNodeMarkup(s.mapping.map(r.before()),l)}n(s.scrollIntoView())}return!0}}var hI=pI();var mE=(t,e)=>{let{$from:n,to:r}=t.selection,i,o=n.sharedDepth(r);return o==0?!1:(i=n.before(o),e&&e(t.tr.setSelection(pe.create(t.doc,i))),!0)},mI=(t,e)=>(e&&e(t.tr.setSelection(new On(t.doc))),!0);function gI(t,e,n){let r=e.nodeBefore,i=e.nodeAfter,o=e.index();return!r||!i||!r.type.compatibleContent(i.type)?!1:!r.content.size&&e.parent.canReplace(o-1,o)?(n&&n(t.tr.delete(e.pos-r.nodeSize,e.pos).scrollIntoView()),!0):!e.parent.canReplace(o,o+1)||!(i.isTextblock||rr(t.doc,e.pos))?!1:(n&&n(t.tr.clearIncompatible(e.pos,r.type,r.contentMatchAt(r.childCount)).join(e.pos).scrollIntoView()),!0)}function gE(t,e,n){let r=e.nodeBefore,i=e.nodeAfter,o,s;if(r.type.spec.isolating||i.type.spec.isolating)return!1;if(gI(t,e,n))return!0;let l=e.parent.canReplace(e.index(),e.index()+1);if(l&&(o=(s=r.contentMatchAt(r.childCount)).findWrapping(i.type))&&s.matchType(o[0]||i.type).validEnd){if(n){let h=e.pos+i.nodeSize,m=K.empty;for(let v=o.length-1;v>=0;v--)m=K.from(o[v].create(null,m));m=K.from(r.copy(m));let b=t.tr.step(new Tt(e.pos-1,h,e.pos,h,new X(m,1,0),o.length,!0)),y=h+2*o.length;rr(b.doc,y)&&b.join(y),n(b.scrollIntoView())}return!0}let u=fe.findFrom(e,1),d=u&&u.$from.blockRange(u.$to),f=d&&Pr(d);if(f!=null&&f>=e.depth)return n&&n(t.tr.lift(d,f).scrollIntoView()),!0;if(l&&Vo(i,"start",!0)&&Vo(r,"end")){let h=r,m=[];for(;m.push(h),!h.isTextblock;)h=h.lastChild;let b=i,y=1;for(;!b.isTextblock;b=b.firstChild)y++;if(h.canReplace(h.childCount,h.childCount,b.content)){if(n){let v=K.empty;for(let S=m.length-1;S>=0;S--)v=K.from(m[S].copy(v));let x=t.tr.step(new Tt(e.pos-m.length,e.pos+i.nodeSize,e.pos+y,e.pos+i.nodeSize-y,new X(v,m.length,0),0,!0));n(x.scrollIntoView())}return!0}}return!1}function bE(t){return function(e,n){let r=e.selection,i=t<0?r.$from:r.$to,o=i.depth;for(;i.node(o).isInline;){if(!o)return!1;o--}return i.node(o).isTextblock?(n&&n(e.tr.setSelection(ce.create(e.doc,t<0?i.start(o):i.end(o)))),!0):!1}}var ip=bE(-1),op=bE(1);function yE(t,e=null){return function(n,r){let{$from:i,$to:o}=n.selection,s=i.blockRange(o),l=s&&Po(s,t,e);return l?(r&&r(n.tr.wrap(s,l).scrollIntoView()),!0):!1}}function sp(t,e=null){return function(n,r){let i=!1;for(let o=0;o{if(i)return!1;if(!(!u.isTextblock||u.hasMarkup(t,e)))if(u.type==t)i=!0;else{let f=n.doc.resolve(d),h=f.index();i=f.parent.canReplaceWith(h,h+1,t)}})}if(!i)return!1;if(r){let o=n.tr;for(let s=0;s=2&&i.node(s.depth-1).type.compatibleContent(t)&&s.startIndex==0){if(i.index(s.depth-1)==0)return!1;let f=n.doc.resolve(s.start-2);u=new $i(f,f,s.depth),s.endIndex=0;f--)o=K.from(n[f].type.create(n[f].attrs,o));t.step(new Tt(e.start-(r?2:0),e.end,e.start,e.end,new X(o,0,0),n.length,!0));let s=0;for(let f=0;fs.childCount>0&&s.firstChild.type==t);return o?n?r.node(o.depth-1).type==t?EI(e,n,t,o):vI(e,n,o):!0:!1}}function EI(t,e,n,r){let i=t.tr,o=r.end,s=r.$to.end(r.depth);ov;y--)b-=i.child(y).nodeSize,r.delete(b-1,b+1);let o=r.doc.resolve(n.start),s=o.nodeAfter;if(r.mapping.map(n.end)!=n.start+o.nodeAfter.nodeSize)return!1;let l=n.startIndex==0,u=n.endIndex==i.childCount,d=o.node(-1),f=o.index(-1);if(!d.canReplace(f+(l?0:1),f+1,s.content.append(u?K.empty:K.from(i))))return!1;let h=o.pos,m=h+s.nodeSize;return r.step(new Tt(h-(l?1:0),m+(u?1:0),h+1,m-1,new X((l?K.empty:K.from(i.copy(K.empty))).append(u?K.empty:K.from(i.copy(K.empty))),l?0:1,u?0:1),l?0:1)),e(r.scrollIntoView()),!0}function wE(t){return function(e,n){let{$from:r,$to:i}=e.selection,o=r.blockRange(i,d=>d.childCount>0&&d.firstChild.type==t);if(!o)return!1;let s=o.startIndex;if(s==0)return!1;let l=o.parent,u=l.child(s-1);if(u.type!=t)return!1;if(n){let d=u.lastChild&&u.lastChild.type==l.type,f=K.from(d?t.create():null),h=new X(K.from(t.create(null,K.from(l.type.create(null,f)))),d?3:1,0),m=o.start,b=o.end;n(e.tr.step(new Tt(m-(d?3:1),b,m,b,h,1,!0)).scrollIntoView())}return!0}}function Zl(t){let{state:e,transaction:n}=t,{selection:r}=n,{doc:i}=n,{storedMarks:o}=n;return{...e,apply:e.apply.bind(e),applyTransaction:e.applyTransaction.bind(e),plugins:e.plugins,schema:e.schema,reconfigure:e.reconfigure.bind(e),toJSON:e.toJSON.bind(e),get storedMarks(){return o},get selection(){return r},get doc(){return i},get tr(){return r=n.selection,i=n.doc,o=n.storedMarks,n}}}var Go=class{constructor(e){this.editor=e.editor,this.rawCommands=this.editor.extensionManager.commands,this.customState=e.state}get hasCustomState(){return!!this.customState}get state(){return this.customState||this.editor.state}get commands(){let{rawCommands:e,editor:n,state:r}=this,{view:i}=n,{tr:o}=r,s=this.buildProps(o);return Object.fromEntries(Object.entries(e).map(([l,u])=>[l,(...f)=>{let h=u(...f)(s);return!o.getMeta("preventDispatch")&&!this.hasCustomState&&i.dispatch(o),h}]))}get chain(){return()=>this.createChain()}get can(){return()=>this.createCan()}createChain(e,n=!0){let{rawCommands:r,editor:i,state:o}=this,{view:s}=i,l=[],u=!!e,d=e||o.tr,f=()=>(!u&&n&&!d.getMeta("preventDispatch")&&!this.hasCustomState&&s.dispatch(d),l.every(m=>m===!0)),h={...Object.fromEntries(Object.entries(r).map(([m,b])=>[m,(...v)=>{let x=this.buildProps(d,n),S=b(...v)(x);return l.push(S),h}])),run:f};return h}createCan(e){let{rawCommands:n,state:r}=this,i=!1,o=e||r.tr,s=this.buildProps(o,i);return{...Object.fromEntries(Object.entries(n).map(([u,d])=>[u,(...f)=>d(...f)({...s,dispatch:void 0})])),chain:()=>this.createChain(o,i)}}buildProps(e,n=!0){let{rawCommands:r,editor:i,state:o}=this,{view:s}=i,l={tr:e,editor:i,view:s,state:Zl({state:o,transaction:e}),dispatch:n?()=>{}:void 0,chain:()=>this.createChain(e,n),can:()=>this.createCan(e),get commands(){return Object.fromEntries(Object.entries(r).map(([u,d])=>[u,(...f)=>d(...f)(l)]))}};return l}},pp=class{constructor(){this.callbacks={}}on(e,n){return this.callbacks[e]||(this.callbacks[e]=[]),this.callbacks[e].push(n),this}emit(e,...n){let r=this.callbacks[e];return r&&r.forEach(i=>i.apply(this,n)),this}off(e,n){let r=this.callbacks[e];return r&&(n?this.callbacks[e]=r.filter(i=>i!==n):delete this.callbacks[e]),this}removeAllListeners(){this.callbacks={}}};function re(t,e,n){return t.config[e]===void 0&&t.parent?re(t.parent,e,n):typeof t.config[e]=="function"?t.config[e].bind({...n,parent:t.parent?re(t.parent,e,n):null}):t.config[e]}function jl(t){let e=t.filter(i=>i.type==="extension"),n=t.filter(i=>i.type==="node"),r=t.filter(i=>i.type==="mark");return{baseExtensions:e,nodeExtensions:n,markExtensions:r}}function AE(t){let e=[],{nodeExtensions:n,markExtensions:r}=jl(t),i=[...n,...r],o={default:null,rendered:!0,renderHTML:null,parseHTML:null,keepOnSplit:!0,isRequired:!1};return t.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage},u=re(s,"addGlobalAttributes",l);if(!u)return;u().forEach(f=>{f.types.forEach(h=>{Object.entries(f.attributes).forEach(([m,b])=>{e.push({type:h,name:m,attribute:{...o,...b}})})})})}),i.forEach(s=>{let l={name:s.name,options:s.options,storage:s.storage},u=re(s,"addAttributes",l);if(!u)return;let d=u();Object.entries(d).forEach(([f,h])=>{let m={...o,...h};typeof m?.default=="function"&&(m.default=m.default()),m?.isRequired&&m?.default===void 0&&delete m.default,e.push({type:s.name,name:f,attribute:m})})}),e}function $t(t,e){if(typeof t=="string"){if(!e.nodes[t])throw Error(`There is no node type named '${t}'. Maybe you forgot to add the extension?`);return e.nodes[t]}return t}function Z(...t){return t.filter(e=>!!e).reduce((e,n)=>{let r={...e};return Object.entries(n).forEach(([i,o])=>{if(!r[i]){r[i]=o;return}if(i==="class"){let l=o?o.split(" "):[],u=r[i]?r[i].split(" "):[],d=l.filter(f=>!u.includes(f));r[i]=[...u,...d].join(" ")}else i==="style"?r[i]=[r[i],o].join("; "):r[i]=o}),r},{})}function hp(t,e){return e.filter(n=>n.attribute.rendered).map(n=>n.attribute.renderHTML?n.attribute.renderHTML(t.attrs)||{}:{[n.name]:t.attrs[n.name]}).reduce((n,r)=>Z(n,r),{})}function NE(t){return typeof t=="function"}function Se(t,e=void 0,...n){return NE(t)?e?t.bind(e)(...n):t(...n):t}function wI(t={}){return Object.keys(t).length===0&&t.constructor===Object}function xI(t){return typeof t!="string"?t:t.match(/^[+-]?(?:\d*\.)?\d+$/)?Number(t):t==="true"?!0:t==="false"?!1:t}function xE(t,e){return t.style?t:{...t,getAttrs:n=>{let r=t.getAttrs?t.getAttrs(n):t.attrs;if(r===!1)return!1;let i=e.reduce((o,s)=>{let l=s.attribute.parseHTML?s.attribute.parseHTML(n):xI(n.getAttribute(s.name));return l==null?o:{...o,[s.name]:l}},{});return{...r,...i}}}}function _E(t){return Object.fromEntries(Object.entries(t).filter(([e,n])=>e==="attrs"&&wI(n)?!1:n!=null))}function _I(t,e){var n;let r=AE(t),{nodeExtensions:i,markExtensions:o}=jl(t),s=(n=i.find(d=>re(d,"topNode")))===null||n===void 0?void 0:n.name,l=Object.fromEntries(i.map(d=>{let f=r.filter(S=>S.type===d.name),h={name:d.name,options:d.options,storage:d.storage,editor:e},m=t.reduce((S,D)=>{let L=re(D,"extendNodeSchema",h);return{...S,...L?L(d):{}}},{}),b=_E({...m,content:Se(re(d,"content",h)),marks:Se(re(d,"marks",h)),group:Se(re(d,"group",h)),inline:Se(re(d,"inline",h)),atom:Se(re(d,"atom",h)),selectable:Se(re(d,"selectable",h)),draggable:Se(re(d,"draggable",h)),code:Se(re(d,"code",h)),defining:Se(re(d,"defining",h)),isolating:Se(re(d,"isolating",h)),attrs:Object.fromEntries(f.map(S=>{var D;return[S.name,{default:(D=S?.attribute)===null||D===void 0?void 0:D.default}]}))}),y=Se(re(d,"parseHTML",h));y&&(b.parseDOM=y.map(S=>xE(S,f)));let v=re(d,"renderHTML",h);v&&(b.toDOM=S=>v({node:S,HTMLAttributes:hp(S,f)}));let x=re(d,"renderText",h);return x&&(b.toText=x),[d.name,b]})),u=Object.fromEntries(o.map(d=>{let f=r.filter(x=>x.type===d.name),h={name:d.name,options:d.options,storage:d.storage,editor:e},m=t.reduce((x,S)=>{let D=re(S,"extendMarkSchema",h);return{...x,...D?D(d):{}}},{}),b=_E({...m,inclusive:Se(re(d,"inclusive",h)),excludes:Se(re(d,"excludes",h)),group:Se(re(d,"group",h)),spanning:Se(re(d,"spanning",h)),code:Se(re(d,"code",h)),attrs:Object.fromEntries(f.map(x=>{var S;return[x.name,{default:(S=x?.attribute)===null||S===void 0?void 0:S.default}]}))}),y=Se(re(d,"parseHTML",h));y&&(b.parseDOM=y.map(x=>xE(x,f)));let v=re(d,"renderHTML",h);return v&&(b.toDOM=x=>v({mark:x,HTMLAttributes:hp(x,f)})),[d.name,b]}));return new wl({topNode:s,nodes:l,marks:u})}function lp(t,e){return e.nodes[t]||e.marks[t]||null}function SE(t,e){return Array.isArray(e)?e.some(n=>(typeof n=="string"?n:n.name)===t.name):e}var SI=(t,e=500)=>{let n="",r=t.parentOffset;return t.parent.nodesBetween(Math.max(0,r-e),r,(i,o,s,l)=>{var u,d;let f=((d=(u=i.type.spec).toText)===null||d===void 0?void 0:d.call(u,{node:i,pos:o,parent:s,index:l}))||i.textContent||"%leaf%";n+=f.slice(0,Math.max(0,r-o))}),n};function vp(t){return Object.prototype.toString.call(t)==="[object RegExp]"}var qo=class{constructor(e){this.find=e.find,this.handler=e.handler}},TI=(t,e)=>{if(vp(e))return e.exec(t);let n=e(t);if(!n)return null;let r=[n.text];return r.index=n.index,r.input=t,r.data=n.data,n.replaceWith&&(n.text.includes(n.replaceWith)||console.warn('[tiptap warn]: "inputRuleMatch.replaceWith" must be part of "inputRuleMatch.text".'),r.push(n.replaceWith)),r};function cp(t){var e;let{editor:n,from:r,to:i,text:o,rules:s,plugin:l}=t,{view:u}=n;if(u.composing)return!1;let d=u.state.doc.resolve(r);if(d.parent.type.spec.code||!((e=d.nodeBefore||d.nodeAfter)===null||e===void 0)&&e.marks.find(m=>m.type.spec.code))return!1;let f=!1,h=SI(d)+o;return s.forEach(m=>{if(f)return;let b=TI(h,m.find);if(!b)return;let y=u.state.tr,v=Zl({state:u.state,transaction:y}),x={from:r-(b[0].length-o.length),to:i},{commands:S,chain:D,can:L}=new Go({editor:n,state:v});m.handler({state:v,range:x,match:b,commands:S,chain:D,can:L})===null||!y.steps.length||(y.setMeta(l,{transform:y,from:r,to:i,text:o}),u.dispatch(y),f=!0)}),f}function MI(t){let{editor:e,rules:n}=t,r=new Pe({state:{init(){return null},apply(i,o){let s=i.getMeta(r);return s||(i.selectionSet||i.docChanged?null:o)}},props:{handleTextInput(i,o,s,l){return cp({editor:e,from:o,to:s,text:l,rules:n,plugin:r})},handleDOMEvents:{compositionend:i=>(setTimeout(()=>{let{$cursor:o}=i.state.selection;o&&cp({editor:e,from:o.pos,to:o.pos,text:"",rules:n,plugin:r})}),!1)},handleKeyDown(i,o){if(o.key!=="Enter")return!1;let{$cursor:s}=i.state.selection;return s?cp({editor:e,from:s.pos,to:s.pos,text:` +`,rules:n,plugin:r}):!1}},isInputRules:!0});return r}function CI(t){return typeof t=="number"}var mp=class{constructor(e){this.find=e.find,this.handler=e.handler}},kI=(t,e,n)=>{if(vp(e))return[...t.matchAll(e)];let r=e(t,n);return r?r.map(i=>{let o=[i.text];return o.index=i.index,o.input=t,o.data=i.data,i.replaceWith&&(i.text.includes(i.replaceWith)||console.warn('[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".'),o.push(i.replaceWith)),o}):[]};function AI(t){let{editor:e,state:n,from:r,to:i,rule:o,pasteEvent:s,dropEvent:l}=t,{commands:u,chain:d,can:f}=new Go({editor:e,state:n}),h=[];return n.doc.nodesBetween(r,i,(b,y)=>{if(!b.isTextblock||b.type.spec.code)return;let v=Math.max(r,y),x=Math.min(i,y+b.content.size),S=b.textBetween(v-y,x-y,void 0,"\uFFFC");kI(S,o.find,s).forEach(L=>{if(L.index===void 0)return;let T=v+L.index+1,z=T+L[0].length,O={from:n.tr.mapping.map(T),to:n.tr.mapping.map(z)},Y=o.handler({state:n,range:O,match:L,commands:u,chain:d,can:f,pasteEvent:s,dropEvent:l});h.push(Y)})}),h.every(b=>b!==null)}function NI(t){let{editor:e,rules:n}=t,r=null,i=!1,o=!1,s=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,l=typeof DragEvent<"u"?new DragEvent("drop"):null;return n.map(d=>new Pe({view(f){let h=m=>{var b;r=!((b=f.dom.parentElement)===null||b===void 0)&&b.contains(m.target)?f.dom.parentElement:null};return window.addEventListener("dragstart",h),{destroy(){window.removeEventListener("dragstart",h)}}},props:{handleDOMEvents:{drop:(f,h)=>(o=r===f.dom.parentElement,l=h,!1),paste:(f,h)=>{var m;let b=(m=h.clipboardData)===null||m===void 0?void 0:m.getData("text/html");return s=h,i=!!b?.includes("data-pm-slice"),!1}}},appendTransaction:(f,h,m)=>{let b=f[0],y=b.getMeta("uiEvent")==="paste"&&!i,v=b.getMeta("uiEvent")==="drop"&&!o;if(!y&&!v)return;let x=h.doc.content.findDiffStart(m.doc.content),S=h.doc.content.findDiffEnd(m.doc.content);if(!CI(x)||!S||x===S.b)return;let D=m.tr,L=Zl({state:m,transaction:D});if(!(!AI({editor:e,state:L,from:Math.max(x-1,0),to:S.b-1,rule:d,pasteEvent:s,dropEvent:l})||!D.steps.length))return l=typeof DragEvent<"u"?new DragEvent("drop"):null,s=typeof ClipboardEvent<"u"?new ClipboardEvent("paste"):null,D}}))}function OI(t){let e=t.filter((n,r)=>t.indexOf(n)!==r);return[...new Set(e)]}var gp=class t{constructor(e,n){this.splittableMarks=[],this.editor=n,this.extensions=t.resolve(e),this.schema=_I(this.extensions,n),this.extensions.forEach(r=>{var i;this.editor.extensionStorage[r.name]=r.storage;let o={name:r.name,options:r.options,storage:r.storage,editor:this.editor,type:lp(r.name,this.schema)};r.type==="mark"&&(!((i=Se(re(r,"keepOnSplit",o)))!==null&&i!==void 0)||i)&&this.splittableMarks.push(r.name);let s=re(r,"onBeforeCreate",o);s&&this.editor.on("beforeCreate",s);let l=re(r,"onCreate",o);l&&this.editor.on("create",l);let u=re(r,"onUpdate",o);u&&this.editor.on("update",u);let d=re(r,"onSelectionUpdate",o);d&&this.editor.on("selectionUpdate",d);let f=re(r,"onTransaction",o);f&&this.editor.on("transaction",f);let h=re(r,"onFocus",o);h&&this.editor.on("focus",h);let m=re(r,"onBlur",o);m&&this.editor.on("blur",m);let b=re(r,"onDestroy",o);b&&this.editor.on("destroy",b)})}static resolve(e){let n=t.sort(t.flatten(e)),r=OI(n.map(i=>i.name));return r.length&&console.warn(`[tiptap warn]: Duplicate extension names found: [${r.map(i=>`'${i}'`).join(", ")}]. This can lead to issues.`),n}static flatten(e){return e.map(n=>{let r={name:n.name,options:n.options,storage:n.storage},i=re(n,"addExtensions",r);return i?[n,...this.flatten(i())]:n}).flat(10)}static sort(e){return e.sort((r,i)=>{let o=re(r,"priority")||100,s=re(i,"priority")||100;return o>s?-1:o{let r={name:n.name,options:n.options,storage:n.storage,editor:this.editor,type:lp(n.name,this.schema)},i=re(n,"addCommands",r);return i?{...e,...i()}:e},{})}get plugins(){let{editor:e}=this,n=t.sort([...this.extensions].reverse()),r=[],i=[],o=n.map(s=>{let l={name:s.name,options:s.options,storage:s.storage,editor:e,type:lp(s.name,this.schema)},u=[],d=re(s,"addKeyboardShortcuts",l),f={};if(s.type==="mark"&&s.config.exitable&&(f.ArrowRight=()=>tt.handleExit({editor:e,mark:s})),d){let v=Object.fromEntries(Object.entries(d()).map(([x,S])=>[x,()=>S({editor:e})]));f={...f,...v}}let h=oE(f);u.push(h);let m=re(s,"addInputRules",l);SE(s,e.options.enableInputRules)&&m&&r.push(...m());let b=re(s,"addPasteRules",l);SE(s,e.options.enablePasteRules)&&b&&i.push(...b());let y=re(s,"addProseMirrorPlugins",l);if(y){let v=y();u.push(...v)}return u}).flat();return[MI({editor:e,rules:r}),...NI({editor:e,rules:i}),...o]}get attributes(){return AE(this.extensions)}get nodeViews(){let{editor:e}=this,{nodeExtensions:n}=jl(this.extensions);return Object.fromEntries(n.filter(r=>!!re(r,"addNodeView")).map(r=>{let i=this.attributes.filter(u=>u.type===r.name),o={name:r.name,options:r.options,storage:r.storage,editor:e,type:$t(r.name,this.schema)},s=re(r,"addNodeView",o);if(!s)return[];let l=(u,d,f,h)=>{let m=hp(u,i);return s()({editor:e,node:u,getPos:f,decorations:h,HTMLAttributes:m,extension:r})};return[r.name,l]}))}};function RI(t){return Object.prototype.toString.call(t).slice(8,-1)}function up(t){return RI(t)!=="Object"?!1:t.constructor===Object&&Object.getPrototypeOf(t)===Object.prototype}function Ql(t,e){let n={...t};return up(t)&&up(e)&&Object.keys(e).forEach(r=>{up(e[r])?r in t?n[r]=Ql(t[r],e[r]):Object.assign(n,{[r]:e[r]}):Object.assign(n,{[r]:e[r]})}),n}var Je=class t{constructor(e={}){this.type="extension",this.name="extension",this.parent=null,this.child=null,this.config={name:this.name,defaultOptions:{}},this.config={...this.config,...e},this.name=this.config.name,e.defaultOptions&&Object.keys(e.defaultOptions).length>0&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`),this.options=this.config.defaultOptions,this.config.addOptions&&(this.options=Se(re(this,"addOptions",{name:this.name}))),this.storage=Se(re(this,"addStorage",{name:this.name,options:this.options}))||{}}static create(e={}){return new t(e)}configure(e={}){let n=this.extend();return n.options=Ql(this.options,e),n.storage=Se(re(n,"addStorage",{name:n.name,options:n.options})),n}extend(e={}){let n=new t({...this.config,...e});return n.parent=this,this.child=n,n.name=e.name?e.name:n.parent.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`),n.options=Se(re(n,"addOptions",{name:n.name})),n.storage=Se(re(n,"addStorage",{name:n.name,options:n.options})),n}};function OE(t,e,n){let{from:r,to:i}=e,{blockSeparator:o=` + +`,textSerializers:s={}}=n||{},l="",u=!0;return t.nodesBetween(r,i,(d,f,h,m)=>{var b;let y=s?.[d.type.name];if(y)return d.isBlock&&!u&&(l+=o,u=!0),h&&(l+=y({node:d,pos:f,parent:h,index:m,range:e})),!1;d.isText?(l+=(b=d?.text)===null||b===void 0?void 0:b.slice(Math.max(r,f)-f,i-f),u=!1):d.isBlock&&!u&&(l+=o,u=!0)}),l}function RE(t){return Object.fromEntries(Object.entries(t.nodes).filter(([,e])=>e.spec.toText).map(([e,n])=>[e,n.spec.toText]))}var II=Je.create({name:"clipboardTextSerializer",addProseMirrorPlugins(){return[new Pe({key:new qe("clipboardTextSerializer"),props:{clipboardTextSerializer:()=>{let{editor:t}=this,{state:e,schema:n}=t,{doc:r,selection:i}=e,{ranges:o}=i,s=Math.min(...o.map(f=>f.$from.pos)),l=Math.max(...o.map(f=>f.$to.pos)),u=RE(n);return OE(r,{from:s,to:l},{textSerializers:u})}}})]}}),LI=()=>({editor:t,view:e})=>(requestAnimationFrame(()=>{var n;t.isDestroyed||(e.dom.blur(),(n=window?.getSelection())===null||n===void 0||n.removeAllRanges())}),!0),DI=(t=!1)=>({commands:e})=>e.setContent("",t),PI=()=>({state:t,tr:e,dispatch:n})=>{let{selection:r}=e,{ranges:i}=r;return n&&i.forEach(({$from:o,$to:s})=>{t.doc.nodesBetween(o.pos,s.pos,(l,u)=>{if(l.type.isText)return;let{doc:d,mapping:f}=e,h=d.resolve(f.map(u)),m=d.resolve(f.map(u+l.nodeSize)),b=h.blockRange(m);if(!b)return;let y=Pr(b);if(l.type.isTextblock){let{defaultType:v}=h.parent.contentMatchAt(h.index());e.setNodeMarkup(b.start,v)}(y||y===0)&&e.lift(b,y)})}),!0},BI=t=>e=>t(e),FI=()=>({state:t,dispatch:e})=>np(t,e),HI=(t,e)=>({editor:n,tr:r})=>{let{state:i}=n,o=i.doc.slice(t.from,t.to);r.deleteRange(t.from,t.to);let s=r.mapping.map(e);return r.insert(s,o.content),r.setSelection(new ce(r.doc.resolve(s-1))),!0},zI=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,r=n.$anchor.node();if(r.content.size>0)return!1;let i=t.selection.$anchor;for(let o=i.depth;o>0;o-=1)if(i.node(o).type===r.type){if(e){let l=i.before(o),u=i.after(o);t.delete(l,u).scrollIntoView()}return!0}return!1},$I=t=>({tr:e,state:n,dispatch:r})=>{let i=$t(t,n.schema),o=e.selection.$anchor;for(let s=o.depth;s>0;s-=1)if(o.node(s).type===i){if(r){let u=o.before(s),d=o.after(s);e.delete(u,d).scrollIntoView()}return!0}return!1},UI=t=>({tr:e,dispatch:n})=>{let{from:r,to:i}=t;return n&&e.delete(r,i),!0},WI=()=>({state:t,dispatch:e})=>Gl(t,e),KI=()=>({commands:t})=>t.keyboardShortcut("Enter"),VI=()=>({state:t,dispatch:e})=>tp(t,e);function Yl(t,e,n={strict:!0}){let r=Object.keys(e);return r.length?r.every(i=>n.strict?e[i]===t[i]:vp(e[i])?e[i].test(t[i]):e[i]===t[i]):!0}function bp(t,e,n={}){return t.find(r=>r.type===e&&Yl(r.attrs,n))}function GI(t,e,n={}){return!!bp(t,e,n)}function wp(t,e,n={}){if(!t||!e)return;let r=t.parent.childAfter(t.parentOffset);if(t.parentOffset===r.offset&&r.offset!==0&&(r=t.parent.childBefore(t.parentOffset)),!r.node)return;let i=bp([...r.node.marks],e,n);if(!i)return;let o=r.index,s=t.start()+r.offset,l=o+1,u=s+r.node.nodeSize;for(bp([...r.node.marks],e,n);o>0&&i.isInSet(t.parent.child(o-1).marks);)o-=1,s-=t.parent.child(o).nodeSize;for(;l({tr:n,state:r,dispatch:i})=>{let o=mi(t,r.schema),{doc:s,selection:l}=n,{$from:u,from:d,to:f}=l;if(i){let h=wp(u,o,e);if(h&&h.from<=d&&h.to>=f){let m=ce.create(s,h.from,h.to);n.setSelection(m)}}return!0},YI=t=>e=>{let n=typeof t=="function"?t(e):t;for(let r=0;r({editor:n,view:r,tr:i,dispatch:o})=>{e={scrollIntoView:!0,...e};let s=()=>{xp()&&r.dom.focus(),requestAnimationFrame(()=>{n.isDestroyed||(r.focus(),e?.scrollIntoView&&n.commands.scrollIntoView())})};if(r.hasFocus()&&t===null||t===!1)return!0;if(o&&t===null&&!ec(n.state.selection))return s(),!0;let l=IE(i.doc,t)||n.state.selection,u=n.state.selection.eq(l);return o&&(u||i.setSelection(l),u&&i.storedMarks&&i.setStoredMarks(i.storedMarks),s()),!0},XI=(t,e)=>n=>t.every((r,i)=>e(r,{...n,index:i})),ZI=(t,e)=>({tr:n,commands:r})=>r.insertContentAt({from:n.selection.from,to:n.selection.to},t,e),LE=t=>{let e=t.childNodes;for(let n=e.length-1;n>=0;n-=1){let r=e[n];r.nodeType===3&&r.nodeValue&&/^(\n\s\s|\n)$/.test(r.nodeValue)?t.removeChild(r):r.nodeType===1&&LE(r)}return t};function TE(t){let e=`${t}`,n=new window.DOMParser().parseFromString(e,"text/html").body;return LE(n)}function Jl(t,e,n){if(n={slice:!0,parseOptions:{},...n},typeof t=="object"&&t!==null)try{return Array.isArray(t)&&t.length>0?K.fromArray(t.map(r=>e.nodeFromJSON(r))):e.nodeFromJSON(t)}catch(r){return console.warn("[tiptap warn]: Invalid content.","Passed value:",t,"Error:",r),Jl("",e,n)}if(typeof t=="string"){let r=Wi.fromSchema(e);return n.slice?r.parseSlice(TE(t),n.parseOptions).content:r.parse(TE(t),n.parseOptions)}return Jl("",e,n)}function jI(t,e,n){let r=t.steps.length-1;if(r{s===0&&(s=f)}),t.setSelection(fe.near(t.doc.resolve(s),n))}var QI=t=>t.toString().startsWith("<"),eL=(t,e,n)=>({tr:r,dispatch:i,editor:o})=>{if(i){n={parseOptions:{},updateSelection:!0,...n};let s=Jl(e,o.schema,{parseOptions:{preserveWhitespace:"full",...n.parseOptions}});if(s.toString()==="<>")return!0;let{from:l,to:u}=typeof t=="number"?{from:t,to:t}:{from:t.from,to:t.to},d=!0,f=!0;if((QI(s)?s:[s]).forEach(m=>{m.check(),d=d?m.isText&&m.marks.length===0:!1,f=f?m.isBlock:!1}),l===u&&f){let{parent:m}=r.doc.resolve(l);m.isTextblock&&!m.type.spec.code&&!m.childCount&&(l-=1,u+=1)}d?Array.isArray(e)?r.insertText(e.map(m=>m.text||"").join(""),l,u):typeof e=="object"&&e&&e.text?r.insertText(e.text,l,u):r.insertText(e,l,u):r.replaceWith(l,u,s),n.updateSelection&&jI(r,r.steps.length-1,-1)}return!0},tL=()=>({state:t,dispatch:e})=>fE(t,e),nL=()=>({state:t,dispatch:e})=>pE(t,e),rL=()=>({state:t,dispatch:e})=>qf(t,e),iL=()=>({state:t,dispatch:e})=>Xf(t,e),oL=()=>({tr:t,state:e,dispatch:n})=>{try{let r=Bo(e.doc,e.selection.$from.pos,-1);return r==null?!1:(t.join(r,2),n&&n(t),!0)}catch{return!1}},sL=()=>({state:t,dispatch:e,tr:n})=>{try{let r=Bo(t.doc,t.selection.$from.pos,1);return r==null?!1:(n.join(r,2),e&&e(n),!0)}catch{return!1}},aL=()=>({state:t,dispatch:e})=>lE(t,e),lL=()=>({state:t,dispatch:e})=>cE(t,e);function tc(){return typeof navigator<"u"?/Mac/.test(navigator.platform):!1}function cL(t){let e=t.split(/-(?!$)/),n=e[e.length-1];n==="Space"&&(n=" ");let r,i,o,s;for(let l=0;l({editor:e,view:n,tr:r,dispatch:i})=>{let o=cL(t).split(/-(?!$)/),s=o.find(d=>!["Alt","Ctrl","Meta","Shift"].includes(d)),l=new KeyboardEvent("keydown",{key:s==="Space"?" ":s,altKey:o.includes("Alt"),ctrlKey:o.includes("Ctrl"),metaKey:o.includes("Meta"),shiftKey:o.includes("Shift"),bubbles:!0,cancelable:!0}),u=e.captureTransaction(()=>{n.someProp("handleKeyDown",d=>d(n,l))});return u?.steps.forEach(d=>{let f=d.map(r.mapping);f&&i&&r.maybeStep(f)}),!0};function ta(t,e,n={}){let{from:r,to:i,empty:o}=t.selection,s=e?$t(e,t.schema):null,l=[];t.doc.nodesBetween(r,i,(h,m)=>{if(h.isText)return;let b=Math.max(r,m),y=Math.min(i,m+h.nodeSize);l.push({node:h,from:b,to:y})});let u=i-r,d=l.filter(h=>s?s.name===h.node.type.name:!0).filter(h=>Yl(h.node.attrs,n,{strict:!1}));return o?!!d.length:d.reduce((h,m)=>h+m.to-m.from,0)>=u}var dL=(t,e={})=>({state:n,dispatch:r})=>{let i=$t(t,n.schema);return ta(n,i,e)?hE(n,r):!1},fL=()=>({state:t,dispatch:e})=>rp(t,e),pL=t=>({state:e,dispatch:n})=>{let r=$t(t,e.schema);return vE(r)(e,n)},hL=()=>({state:t,dispatch:e})=>Qf(t,e);function nc(t,e){return e.nodes[t]?"node":e.marks[t]?"mark":null}function ME(t,e){let n=typeof e=="string"?[e]:e;return Object.keys(t).reduce((r,i)=>(n.includes(i)||(r[i]=t[i]),r),{})}var mL=(t,e)=>({tr:n,state:r,dispatch:i})=>{let o=null,s=null,l=nc(typeof t=="string"?t:t.name,r.schema);return l?(l==="node"&&(o=$t(t,r.schema)),l==="mark"&&(s=mi(t,r.schema)),i&&n.selection.ranges.forEach(u=>{r.doc.nodesBetween(u.$from.pos,u.$to.pos,(d,f)=>{o&&o===d.type&&n.setNodeMarkup(f,void 0,ME(d.attrs,e)),s&&d.marks.length&&d.marks.forEach(h=>{s===h.type&&n.addMark(f,f+d.nodeSize,s.create(ME(h.attrs,e)))})})}),!0):!1},gL=()=>({tr:t,dispatch:e})=>(e&&t.scrollIntoView(),!0),bL=()=>({tr:t,commands:e})=>e.setTextSelection({from:0,to:t.doc.content.size}),yL=()=>({state:t,dispatch:e})=>Yf(t,e),EL=()=>({state:t,dispatch:e})=>Zf(t,e),vL=()=>({state:t,dispatch:e})=>mE(t,e),wL=()=>({state:t,dispatch:e})=>op(t,e),xL=()=>({state:t,dispatch:e})=>ip(t,e);function DE(t,e,n={}){return Jl(t,e,{slice:!1,parseOptions:n})}var _L=(t,e=!1,n={})=>({tr:r,editor:i,dispatch:o})=>{let{doc:s}=r,l=DE(t,i.schema,n);return o&&r.replaceWith(0,s.content.size,l).setMeta("preventUpdate",!e),!0};function gi(t,e){let n=mi(e,t.schema),{from:r,to:i,empty:o}=t.selection,s=[];o?(t.storedMarks&&s.push(...t.storedMarks),s.push(...t.selection.$head.marks())):t.doc.nodesBetween(r,i,u=>{s.push(...u.marks)});let l=s.find(u=>u.type.name===n.name);return l?{...l.attrs}:{}}function PE(t,e){let n=new ai(t);return e.forEach(r=>{r.steps.forEach(i=>{n.step(i)})}),n}function _p(t){for(let e=0;e{e(r)&&n.push({node:r,pos:i})}),n}function BE(t,e,n){let r=[];return t.nodesBetween(e.from,e.to,(i,o)=>{n(i)&&r.push({node:i,pos:o})}),r}function Sp(t,e){for(let n=t.depth;n>0;n-=1){let r=t.node(n);if(e(r))return{pos:n>0?t.before(n):0,start:t.start(n),depth:n,node:r}}}function to(t){return e=>Sp(e.$from,t)}function SL(t,e){let n=Lr.fromSchema(e).serializeFragment(t),i=document.implementation.createHTMLDocument().createElement("div");return i.appendChild(n),i.innerHTML}function TL(t,e){let n={from:0,to:t.content.size};return OE(t,n,e)}function ML(t,e){let n=$t(e,t.schema),{from:r,to:i}=t.selection,o=[];t.doc.nodesBetween(r,i,l=>{o.push(l)});let s=o.reverse().find(l=>l.type.name===n.name);return s?{...s.attrs}:{}}function Tp(t,e){let n=nc(typeof e=="string"?e:e.name,t.schema);return n==="node"?ML(t,e):n==="mark"?gi(t,e):{}}function CL(t,e=JSON.stringify){let n={};return t.filter(r=>{let i=e(r);return Object.prototype.hasOwnProperty.call(n,i)?!1:n[i]=!0})}function kL(t){let e=CL(t);return e.length===1?e:e.filter((n,r)=>!e.filter((o,s)=>s!==r).some(o=>n.oldRange.from>=o.oldRange.from&&n.oldRange.to<=o.oldRange.to&&n.newRange.from>=o.newRange.from&&n.newRange.to<=o.newRange.to))}function FE(t){let{mapping:e,steps:n}=t,r=[];return e.maps.forEach((i,o)=>{let s=[];if(i.ranges.length)i.forEach((l,u)=>{s.push({from:l,to:u})});else{let{from:l,to:u}=n[o];if(l===void 0||u===void 0)return;s.push({from:l,to:u})}s.forEach(({from:l,to:u})=>{let d=e.slice(o).map(l,-1),f=e.slice(o).map(u),h=e.invert().map(d,-1),m=e.invert().map(f);r.push({oldRange:{from:h,to:m},newRange:{from:d,to:f}})})}),kL(r)}function rc(t,e,n){let r=[];return t===e?n.resolve(t).marks().forEach(i=>{let o=n.resolve(t-1),s=wp(o,i.type);s&&r.push({mark:i,...s})}):n.nodesBetween(t,e,(i,o)=>{!i||i?.nodeSize===void 0||r.push(...i.marks.map(s=>({from:o,to:o+i.nodeSize,mark:s})))}),r}function ql(t,e,n){return Object.fromEntries(Object.entries(n).filter(([r])=>{let i=t.find(o=>o.type===e&&o.name===r);return i?i.attribute.keepOnSplit:!1}))}function yp(t,e,n={}){let{empty:r,ranges:i}=t.selection,o=e?mi(e,t.schema):null;if(r)return!!(t.storedMarks||t.selection.$from.marks()).filter(h=>o?o.name===h.type.name:!0).find(h=>Yl(h.attrs,n,{strict:!1}));let s=0,l=[];if(i.forEach(({$from:h,$to:m})=>{let b=h.pos,y=m.pos;t.doc.nodesBetween(b,y,(v,x)=>{if(!v.isText&&!v.marks.length)return;let S=Math.max(b,x),D=Math.min(y,x+v.nodeSize),L=D-S;s+=L,l.push(...v.marks.map(T=>({mark:T,from:S,to:D})))})}),s===0)return!1;let u=l.filter(h=>o?o.name===h.mark.type.name:!0).filter(h=>Yl(h.mark.attrs,n,{strict:!1})).reduce((h,m)=>h+m.to-m.from,0),d=l.filter(h=>o?h.mark.type!==o&&h.mark.type.excludes(o):!0).reduce((h,m)=>h+m.to-m.from,0);return(u>0?u+d:u)>=s}function Wn(t,e,n={}){if(!e)return ta(t,null,n)||yp(t,null,n);let r=nc(e,t.schema);return r==="node"?ta(t,e,n):r==="mark"?yp(t,e,n):!1}function CE(t,e){let{nodeExtensions:n}=jl(e),r=n.find(s=>s.name===t);if(!r)return!1;let i={name:r.name,options:r.options,storage:r.storage},o=Se(re(r,"group",i));return typeof o!="string"?!1:o.split(" ").includes("list")}function AL(t){var e;let n=(e=t.type.createAndFill())===null||e===void 0?void 0:e.toJSON(),r=t.toJSON();return JSON.stringify(n)===JSON.stringify(r)}function HE(t){return t instanceof pe}function ic(t,e,n){let i=t.state.doc.content.size,o=$r(e,0,i),s=$r(n,0,i),l=t.coordsAtPos(o),u=t.coordsAtPos(s,-1),d=Math.min(l.top,u.top),f=Math.max(l.bottom,u.bottom),h=Math.min(l.left,u.left),m=Math.max(l.right,u.right),b=m-h,y=f-d,S={top:d,bottom:f,left:h,right:m,width:b,height:y,x:h,y:d};return{...S,toJSON:()=>S}}function NL(t,e,n){var r;let{selection:i}=e,o=null;if(ec(i)&&(o=i.$cursor),o){let l=(r=t.storedMarks)!==null&&r!==void 0?r:o.marks();return!!n.isInSet(l)||!l.some(u=>u.type.excludes(n))}let{ranges:s}=i;return s.some(({$from:l,$to:u})=>{let d=l.depth===0?t.doc.inlineContent&&t.doc.type.allowsMarkType(n):!1;return t.doc.nodesBetween(l.pos,u.pos,(f,h,m)=>{if(d)return!1;if(f.isInline){let b=!m||m.type.allowsMarkType(n),y=!!n.isInSet(f.marks)||!f.marks.some(v=>v.type.excludes(n));d=b&&y}return!d}),d})}var OL=(t,e={})=>({tr:n,state:r,dispatch:i})=>{let{selection:o}=n,{empty:s,ranges:l}=o,u=mi(t,r.schema);if(i)if(s){let d=gi(r,u);n.addStoredMark(u.create({...d,...e}))}else l.forEach(d=>{let f=d.$from.pos,h=d.$to.pos;r.doc.nodesBetween(f,h,(m,b)=>{let y=Math.max(b,f),v=Math.min(b+m.nodeSize,h);m.marks.find(S=>S.type===u)?m.marks.forEach(S=>{u===S.type&&n.addMark(y,v,u.create({...S.attrs,...e}))}):n.addMark(y,v,u.create(e))})});return NL(r,n,u)},RL=(t,e)=>({tr:n})=>(n.setMeta(t,e),!0),IL=(t,e={})=>({state:n,dispatch:r,chain:i})=>{let o=$t(t,n.schema);return o.isTextblock?i().command(({commands:s})=>sp(o,e)(n)?!0:s.clearNodes()).command(({state:s})=>sp(o,e)(s,r)).run():(console.warn('[tiptap warn]: Currently "setNode()" only supports text block nodes.'),!1)},LL=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,i=$r(t,0,r.content.size),o=pe.create(r,i);e.setSelection(o)}return!0},DL=t=>({tr:e,dispatch:n})=>{if(n){let{doc:r}=e,{from:i,to:o}=typeof t=="number"?{from:t,to:t}:t,s=ce.atStart(r).from,l=ce.atEnd(r).to,u=$r(i,s,l),d=$r(o,s,l),f=ce.create(r,u,d);e.setSelection(f)}return!0},PL=t=>({state:e,dispatch:n})=>{let r=$t(t,e.schema);return wE(r)(e,n)};function kE(t,e){let n=t.storedMarks||t.selection.$to.parentOffset&&t.selection.$from.marks();if(n){let r=n.filter(i=>e?.includes(i.type.name));t.tr.ensureMarks(r)}}var BL=({keepMarks:t=!0}={})=>({tr:e,state:n,dispatch:r,editor:i})=>{let{selection:o,doc:s}=e,{$from:l,$to:u}=o,d=i.extensionManager.attributes,f=ql(d,l.node().type.name,l.node().attrs);if(o instanceof pe&&o.node.isBlock)return!l.parentOffset||!zn(s,l.pos)?!1:(r&&(t&&kE(n,i.extensionManager.splittableMarks),e.split(l.pos).scrollIntoView()),!0);if(!l.parent.isBlock)return!1;if(r){let h=u.parentOffset===u.parent.content.size;o instanceof ce&&e.deleteSelection();let m=l.depth===0?void 0:_p(l.node(-1).contentMatchAt(l.indexAfter(-1))),b=h&&m?[{type:m,attrs:f}]:void 0,y=zn(e.doc,e.mapping.map(l.pos),1,b);if(!b&&!y&&zn(e.doc,e.mapping.map(l.pos),1,m?[{type:m}]:void 0)&&(y=!0,b=m?[{type:m,attrs:f}]:void 0),y&&(e.split(e.mapping.map(l.pos),1,b),m&&!h&&!l.parentOffset&&l.parent.type!==m)){let v=e.mapping.map(l.before()),x=e.doc.resolve(v);l.node(-1).canReplaceWith(x.index(),x.index()+1,m)&&e.setNodeMarkup(e.mapping.map(l.before()),m)}t&&kE(n,i.extensionManager.splittableMarks),e.scrollIntoView()}return!0},FL=t=>({tr:e,state:n,dispatch:r,editor:i})=>{var o;let s=$t(t,n.schema),{$from:l,$to:u}=n.selection,d=n.selection.node;if(d&&d.isBlock||l.depth<2||!l.sameParent(u))return!1;let f=l.node(-1);if(f.type!==s)return!1;let h=i.extensionManager.attributes;if(l.parent.content.size===0&&l.node(-1).childCount===l.indexAfter(-1)){if(l.depth===2||l.node(-3).type!==s||l.index(-2)!==l.node(-2).childCount-1)return!1;if(r){let x=K.empty,S=l.index(-1)?1:l.index(-2)?2:3;for(let Y=l.depth-S;Y>=l.depth-3;Y-=1)x=K.from(l.node(Y).copy(x));let D=l.indexAfter(-1){if(O>-1)return!1;Y.isTextblock&&Y.content.size===0&&(O=ie+1)}),O>-1&&e.setSelection(ce.near(e.doc.resolve(O))),e.scrollIntoView()}return!0}let m=u.pos===l.end()?f.contentMatchAt(0).defaultType:null,b=ql(h,f.type.name,f.attrs),y=ql(h,l.node().type.name,l.node().attrs);e.delete(l.pos,u.pos);let v=m?[{type:s,attrs:b},{type:m,attrs:y}]:[{type:s,attrs:b}];if(!zn(e.doc,l.pos,2))return!1;if(r){let{selection:x,storedMarks:S}=n,{splittableMarks:D}=i.extensionManager,L=S||x.$to.parentOffset&&x.$from.marks();if(e.split(l.pos,2,v).scrollIntoView(),!L||!r)return!0;let T=L.filter(z=>D.includes(z.type.name));e.ensureMarks(T)}return!0},dp=(t,e)=>{let n=to(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(Math.max(0,n.pos-1)).before(n.depth);if(r===void 0)return!0;let i=t.doc.nodeAt(r);return n.node.type===i?.type&&rr(t.doc,n.pos)&&t.join(n.pos),!0},fp=(t,e)=>{let n=to(s=>s.type===e)(t.selection);if(!n)return!0;let r=t.doc.resolve(n.start).after(n.depth);if(r===void 0)return!0;let i=t.doc.nodeAt(r);return n.node.type===i?.type&&rr(t.doc,r)&&t.join(r),!0},HL=(t,e,n,r={})=>({editor:i,tr:o,state:s,dispatch:l,chain:u,commands:d,can:f})=>{let{extensions:h,splittableMarks:m}=i.extensionManager,b=$t(t,s.schema),y=$t(e,s.schema),{selection:v,storedMarks:x}=s,{$from:S,$to:D}=v,L=S.blockRange(D),T=x||v.$to.parentOffset&&v.$from.marks();if(!L)return!1;let z=to(O=>CE(O.type.name,h))(v);if(L.depth>=1&&z&&L.depth-z.depth<=1){if(z.node.type===b)return d.liftListItem(y);if(CE(z.node.type.name,h)&&b.validContent(z.node.content)&&l)return u().command(()=>(o.setNodeMarkup(z.pos,b),!0)).command(()=>dp(o,b)).command(()=>fp(o,b)).run()}return!n||!T||!l?u().command(()=>f().wrapInList(b,r)?!0:d.clearNodes()).wrapInList(b,r).command(()=>dp(o,b)).command(()=>fp(o,b)).run():u().command(()=>{let O=f().wrapInList(b,r),Y=T.filter(ie=>m.includes(ie.type.name));return o.ensureMarks(Y),O?!0:d.clearNodes()}).wrapInList(b,r).command(()=>dp(o,b)).command(()=>fp(o,b)).run()},zL=(t,e={},n={})=>({state:r,commands:i})=>{let{extendEmptyMarkRange:o=!1}=n,s=mi(t,r.schema);return yp(r,s,e)?i.unsetMark(s,{extendEmptyMarkRange:o}):i.setMark(s,e)},$L=(t,e,n={})=>({state:r,commands:i})=>{let o=$t(t,r.schema),s=$t(e,r.schema);return ta(r,o,n)?i.setNode(s):i.setNode(o,n)},UL=(t,e={})=>({state:n,commands:r})=>{let i=$t(t,n.schema);return ta(n,i,e)?r.lift(i):r.wrapIn(i,e)},WL=()=>({state:t,dispatch:e})=>{let n=t.plugins;for(let r=0;r=0;u-=1)s.step(l.steps[u].invert(l.docs[u]));if(o.text){let u=s.doc.resolve(o.from).marks();s.replaceWith(o.from,o.to,t.schema.text(o.text,u))}else s.delete(o.from,o.to)}return!0}}return!1},KL=()=>({tr:t,dispatch:e})=>{let{selection:n}=t,{empty:r,ranges:i}=n;return r||e&&i.forEach(o=>{t.removeMark(o.$from.pos,o.$to.pos)}),!0},VL=(t,e={})=>({tr:n,state:r,dispatch:i})=>{var o;let{extendEmptyMarkRange:s=!1}=e,{selection:l}=n,u=mi(t,r.schema),{$from:d,empty:f,ranges:h}=l;if(!i)return!0;if(f&&s){let{from:m,to:b}=l,y=(o=d.marks().find(x=>x.type===u))===null||o===void 0?void 0:o.attrs,v=wp(d,u,y);v&&(m=v.from,b=v.to),n.removeMark(m,b,u)}else h.forEach(m=>{n.removeMark(m.$from.pos,m.$to.pos,u)});return n.removeStoredMark(u),!0},GL=(t,e={})=>({tr:n,state:r,dispatch:i})=>{let o=null,s=null,l=nc(typeof t=="string"?t:t.name,r.schema);return l?(l==="node"&&(o=$t(t,r.schema)),l==="mark"&&(s=mi(t,r.schema)),i&&n.selection.ranges.forEach(u=>{let d=u.$from.pos,f=u.$to.pos;r.doc.nodesBetween(d,f,(h,m)=>{o&&o===h.type&&n.setNodeMarkup(m,void 0,{...h.attrs,...e}),s&&h.marks.length&&h.marks.forEach(b=>{if(s===b.type){let y=Math.max(m,d),v=Math.min(m+h.nodeSize,f);n.addMark(y,v,s.create({...b.attrs,...e}))}})})}),!0):!1},qL=(t,e={})=>({state:n,dispatch:r})=>{let i=$t(t,n.schema);return yE(i,e)(n,r)},YL=(t,e={})=>({state:n,dispatch:r})=>{let i=$t(t,n.schema);return EE(i,e)(n,r)},JL=Object.freeze({__proto__:null,blur:LI,clearContent:DI,clearNodes:PI,command:BI,createParagraphNear:FI,cut:HI,deleteCurrentNode:zI,deleteNode:$I,deleteRange:UI,deleteSelection:WI,enter:KI,exitCode:VI,extendMarkRange:qI,first:YI,focus:JI,forEach:XI,insertContent:ZI,insertContentAt:eL,joinUp:tL,joinDown:nL,joinBackward:rL,joinForward:iL,joinItemBackward:oL,joinItemForward:sL,joinTextblockBackward:aL,joinTextblockForward:lL,keyboardShortcut:uL,lift:dL,liftEmptyBlock:fL,liftListItem:pL,newlineInCode:hL,resetAttributes:mL,scrollIntoView:gL,selectAll:bL,selectNodeBackward:yL,selectNodeForward:EL,selectParentNode:vL,selectTextblockEnd:wL,selectTextblockStart:xL,setContent:_L,setMark:OL,setMeta:RL,setNode:IL,setNodeSelection:LL,setTextSelection:DL,sinkListItem:PL,splitBlock:BL,splitListItem:FL,toggleList:HL,toggleMark:zL,toggleNode:$L,toggleWrap:UL,undoInputRule:WL,unsetAllMarks:KL,unsetMark:VL,updateAttributes:GL,wrapIn:qL,wrapInList:YL}),XL=Je.create({name:"commands",addCommands(){return{...JL}}}),ZL=Je.create({name:"editable",addProseMirrorPlugins(){return[new Pe({key:new qe("editable"),props:{editable:()=>this.editor.options.editable}})]}}),jL=Je.create({name:"focusEvents",addProseMirrorPlugins(){let{editor:t}=this;return[new Pe({key:new qe("focusEvents"),props:{handleDOMEvents:{focus:(e,n)=>{t.isFocused=!0;let r=t.state.tr.setMeta("focus",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1},blur:(e,n)=>{t.isFocused=!1;let r=t.state.tr.setMeta("blur",{event:n}).setMeta("addToHistory",!1);return e.dispatch(r),!1}}}})]}}),QL=Je.create({name:"keymap",addKeyboardShortcuts(){let t=()=>this.editor.commands.first(({commands:s})=>[()=>s.undoInputRule(),()=>s.command(({tr:l})=>{let{selection:u,doc:d}=l,{empty:f,$anchor:h}=u,{pos:m,parent:b}=h,y=h.parent.isTextblock&&m>0?l.doc.resolve(m-1):h,v=y.parent.type.spec.isolating,x=h.pos-h.parentOffset,S=v&&y.parent.childCount===1?x===h.pos:fe.atStart(d).from===m;return!f||!S||!b.type.isTextblock||b.textContent.length?!1:s.clearNodes()}),()=>s.deleteSelection(),()=>s.joinBackward(),()=>s.selectNodeBackward()]),e=()=>this.editor.commands.first(({commands:s})=>[()=>s.deleteSelection(),()=>s.deleteCurrentNode(),()=>s.joinForward(),()=>s.selectNodeForward()]),r={Enter:()=>this.editor.commands.first(({commands:s})=>[()=>s.newlineInCode(),()=>s.createParagraphNear(),()=>s.liftEmptyBlock(),()=>s.splitBlock()]),"Mod-Enter":()=>this.editor.commands.exitCode(),Backspace:t,"Mod-Backspace":t,"Shift-Backspace":t,Delete:e,"Mod-Delete":e,"Mod-a":()=>this.editor.commands.selectAll()},i={...r},o={...r,"Ctrl-h":t,"Alt-Backspace":t,"Ctrl-d":e,"Ctrl-Alt-Backspace":e,"Alt-Delete":e,"Alt-d":e,"Ctrl-a":()=>this.editor.commands.selectTextblockStart(),"Ctrl-e":()=>this.editor.commands.selectTextblockEnd()};return xp()||tc()?o:i},addProseMirrorPlugins(){return[new Pe({key:new qe("clearDocument"),appendTransaction:(t,e,n)=>{if(!(t.some(y=>y.docChanged)&&!e.doc.eq(n.doc)))return;let{empty:i,from:o,to:s}=e.selection,l=fe.atStart(e.doc).from,u=fe.atEnd(e.doc).to;if(i||!(o===l&&s===u)||!(n.doc.textBetween(0,n.doc.content.size," "," ").length===0))return;let h=n.tr,m=Zl({state:n,transaction:h}),{commands:b}=new Go({editor:this.editor,state:m});if(b.clearNodes(),!!h.steps.length)return h}})]}}),eD=Je.create({name:"tabindex",addProseMirrorPlugins(){return[new Pe({key:new qe("tabindex"),props:{attributes:this.editor.isEditable?{tabindex:"0"}:{}}})]}}),tD=Object.freeze({__proto__:null,ClipboardTextSerializer:II,Commands:XL,Editable:ZL,FocusEvents:jL,Keymap:QL,Tabindex:eD}),Ep=class t{constructor(e,n,r=!1,i=null){this.currentNode=null,this.actualDepth=null,this.isBlock=r,this.resolvedPos=e,this.editor=n,this.currentNode=i}get name(){return this.node.type.name}get node(){return this.currentNode||this.resolvedPos.node()}get element(){return this.editor.view.domAtPos(this.pos).node}get depth(){var e;return(e=this.actualDepth)!==null&&e!==void 0?e:this.resolvedPos.depth}get pos(){return this.resolvedPos.pos}get content(){return this.node.content}set content(e){let n=this.from,r=this.to;if(this.isBlock){if(this.content.size===0){console.error(`You can\u2019t set content on a block node. Tried to set content on ${this.name} at ${this.pos}`);return}n=this.from+1,r=this.to-1}this.editor.commands.insertContentAt({from:n,to:r},e)}get attributes(){return this.node.attrs}get textContent(){return this.node.textContent}get size(){return this.node.nodeSize}get from(){return this.isBlock?this.pos:this.resolvedPos.start(this.resolvedPos.depth)}get range(){return{from:this.from,to:this.to}}get to(){return this.isBlock?this.pos+this.size:this.resolvedPos.end(this.resolvedPos.depth)+(this.node.isText?0:1)}get parent(){if(this.depth===0)return null;let e=this.resolvedPos.start(this.resolvedPos.depth-1),n=this.resolvedPos.doc.resolve(e);return new t(n,this.editor)}get before(){let e=this.resolvedPos.doc.resolve(this.from-(this.isBlock?1:2));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.from-3)),new t(e,this.editor)}get after(){let e=this.resolvedPos.doc.resolve(this.to+(this.isBlock?2:1));return e.depth!==this.depth&&(e=this.resolvedPos.doc.resolve(this.to+3)),new t(e,this.editor)}get children(){let e=[];return this.node.content.forEach((n,r)=>{let i=n.isBlock&&!n.isTextblock,o=this.pos+r+(i?0:1),s=this.resolvedPos.doc.resolve(o);if(!i&&s.depth<=this.depth)return;let l=new t(s,this.editor,i,i?n:null);i&&(l.actualDepth=this.depth+1),e.push(new t(s,this.editor,i,i?n:null))}),e}get firstChild(){return this.children[0]||null}get lastChild(){let e=this.children;return e[e.length-1]||null}closest(e,n={}){let r=null,i=this.parent;for(;i&&!r;){if(i.node.type.name===e)if(Object.keys(n).length>0){let o=i.node.attrs,s=Object.keys(n);for(let l=0;l{if(o.node.type.name===e){if(Object.keys(n).length>0){let s=o.node.attrs,l=Object.keys(n);for(let u=0;u 1; - warnWhen(isSingleContentElement && isMoreThanOneReferenceElement, ["tippy() was passed an Element as the `content` prop, but more than", "one tippy instance was created by this invocation. This means the", "content element will only be appended to the last tippy instance.", "\n\n", "Instead, pass the .innerHTML of the element, or use a function that", "returns a cloned version of the element instead.", "\n\n", "1) content: element.innerHTML\n", "2) content: () => element.cloneNode(true)"].join(" ")); - } - var instances = elements.reduce(function(acc, reference2) { - var instance = reference2 && createTippy(reference2, passedProps); - if (instance) { - acc.push(instance); - } - return acc; - }, []); - return isElement2(targets) ? instances[0] : instances; + +.ProseMirror { + word-wrap: break-word; + white-space: pre-wrap; + white-space: break-spaces; + -webkit-font-variant-ligatures: none; + font-variant-ligatures: none; + font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */ } -tippy.defaultProps = defaultProps; -tippy.setDefaultProps = setDefaultProps; -tippy.currentInput = currentInput; -var applyStylesModifier = Object.assign({}, applyStyles_default, { - effect: function effect4(_ref) { - var state = _ref.state; - var initialStyles = { - popper: { - position: state.options.strategy, - left: "0", - top: "0", - margin: "0" - }, - arrow: { - position: "absolute" - }, - reference: {} - }; - Object.assign(state.elements.popper.style, initialStyles.popper); - state.styles = initialStyles; - if (state.elements.arrow) { - Object.assign(state.elements.arrow.style, initialStyles.arrow); - } - } -}); -tippy.setDefaultProps({ - render -}); -var tippy_esm_default = tippy; -// resources/js/plugins/BubbleMenuPlugin.js -var BubbleMenuView = class { - constructor({ editor, element, view, tippyOptions = {}, updateDelay = 250, shouldShow }) { - __publicField(this, "shouldShow", ({ view, state, from: from2, to }) => { - const { doc: doc3, selection } = state; - const { empty: empty2 } = selection; - const isEmptyTextBlock = !doc3.textBetween(from2, to).length && isTextSelection(state.selection); - const isChildOfMenu = this.element.contains(document.activeElement); - const hasEditorFocus = view.hasFocus() || isChildOfMenu; - return !(!hasEditorFocus || empty2 || isEmptyTextBlock || !this.editor.isEditable); - }); - __publicField(this, "mousedownHandler", () => { - this.preventHide = true; - }); - __publicField(this, "dragstartHandler", () => { - this.hide(); - }); - __publicField(this, "focusHandler", () => { - setTimeout(() => this.update(this.editor.view)); - }); - __publicField(this, "blurHandler", ({ event }) => { - if (this.preventHide) { - this.preventHide = false; - return; - } - if (event?.relatedTarget && this.element.parentNode?.contains(event.relatedTarget)) { - return; - } - this.hide(); - }); - __publicField(this, "tippyBlurHandler", (event) => { - this.blurHandler({ event }); - }); - __publicField(this, "handleDebouncedUpdate", (view, oldState) => { - const selectionChanged = !oldState?.selection.eq(view.state.selection); - const docChanged = !oldState?.doc.eq(view.state.doc); - if (!selectionChanged && !docChanged) { - return; - } - if (this.updateDebounceTimer) { - clearTimeout(this.updateDebounceTimer); - } - this.updateDebounceTimer = window.setTimeout(() => { - this.updateHandler(view, selectionChanged, docChanged, oldState); - }, this.updateDelay); - }); - __publicField(this, "updateHandler", (view, selectionChanged, docChanged, oldState) => { - const { state, composing } = view; - const { selection } = state; - const isSame = !selectionChanged && !docChanged; - if (composing || isSame) { - return; - } - this.createTooltip(); - const { ranges } = selection; - const from2 = Math.min(...ranges.map((range) => range.$from.pos)); - const to = Math.max(...ranges.map((range) => range.$to.pos)); - const shouldShow = this.shouldShow?.({ - editor: this.editor, - view, - state, - oldState, - from: from2, - to - }); - if (!shouldShow) { - this.hide(); - return; - } - if (state.selection.$anchor.pos !== oldState?.selection.$anchor.pos) { - this.update(view, state); - } - this.tippy?.setProps({ - getReferenceClientRect: this.tippyOptions?.getReferenceClientRect || (() => { - if (isNodeSelection(state.selection)) { - let node = view.nodeDOM(from2); - const nodeViewWrapper = node.dataset.nodeViewWrapper ? node : node.querySelector("[data-node-view-wrapper]"); - if (nodeViewWrapper) { - node = nodeViewWrapper.firstChild; - } - if (node) { - return node.getBoundingClientRect(); - } - } - return posToDOMRect(view, from2, to); - }) - }); - this.show(); - }); - this.editor = editor; - this.element = element; - this.view = view; - this.updateDelay = updateDelay; - if (shouldShow) { - this.shouldShow = shouldShow; - } - this.element.addEventListener("mousedown", this.mousedownHandler, { capture: true }); - this.view.dom.addEventListener("dragstart", this.dragstartHandler); - this.editor.on("focus", this.focusHandler); - this.editor.on("blur", this.blurHandler); - this.tippyOptions = tippyOptions; - this.element.style.visibility = "hidden"; - this.element.style.position = "absolute"; - } - createTooltip() { - const { element: editorElement } = this.editor.options; - const editorIsAttached = !!editorElement.parentElement; - if (this.tippy || !editorIsAttached) { - return; - } - this.tippy = tippy_esm_default(editorElement, { - duration: 0, - getReferenceClientRect: null, - content: this.element, - interactive: true, - trigger: "manual", - placement: "top", - hideOnClick: "toggle", - ...this.tippyOptions - }); - if (this.tippy.popper.firstChild) { - this.tippy.popper.firstChild.addEventListener("blur", this.tippyBlurHandler); - } - } - update(view, oldState) { - const { state } = view; - const hasValidSelection = state.selection.$from.pos !== state.selection.$to.pos; - if (this.updateDelay > 0 && hasValidSelection) { - this.handleDebouncedUpdate(view, oldState); - return; - } - const selectionChanged = !oldState?.selection.eq(view.state.selection); - const docChanged = !oldState?.doc.eq(view.state.doc); - this.updateHandler(view, selectionChanged, docChanged, oldState); - } - show() { - this.element.style.position = "relative"; - this.element.style.visibility = "visible"; - this.tippy?.show(); - } - hide() { - this.element.style.position = "absolute"; - this.element.style.visibility = "hidden"; - this.tippy?.hide(); - } - destroy() { - if (this.tippy?.popper.firstChild) { - this.tippy.popper.firstChild.removeEventListener( - "blur", - this.tippyBlurHandler - ); - } - this.tippy?.destroy(); - this.element.removeEventListener("mousedown", this.mousedownHandler, { capture: true }); - this.view.dom.removeEventListener("dragstart", this.dragstartHandler); - this.editor.off("focus", this.focusHandler); - this.editor.off("blur", this.blurHandler); - } -}; -var BubbleMenuPlugin = (options) => { - return new Plugin({ - key: typeof options.pluginKey === "string" ? new PluginKey(options.pluginKey) : options.pluginKey, - view: (view) => new BubbleMenuView({ view, ...options }) - }); -}; +.ProseMirror [contenteditable="false"] { + white-space: normal; +} -// resources/js/extensions/BubbleMenu.js -var BubbleMenu = Extension.create({ - name: "bubbleMenu", - addOptions() { - return { - element: null, - tippyOptions: {}, - pluginKey: "bubbleMenu", - updateDelay: void 0, - shouldShow: null - }; - }, - addProseMirrorPlugins() { - if (!this.options.element) { - return []; - } - return [ - BubbleMenuPlugin({ - pluginKey: this.options.pluginKey, - editor: this.editor, - element: this.options.element, - tippyOptions: this.options.tippyOptions, - updateDelay: this.options.updateDelay, - shouldShow: this.options.shouldShow - }) - ]; - } -}); +.ProseMirror [contenteditable="false"] [contenteditable="true"] { + white-space: pre-wrap; +} -// resources/js/plugins/FloatingMenuPlugin.js -var FloatingMenuView = class { - constructor({ editor, element, view, tippyOptions = {}, shouldShow }) { - __publicField(this, "shouldShow", ({ view, state }) => { - const { selection } = state; - const { $anchor, empty: empty2 } = selection; - const isRootDepth = $anchor.depth === 1; - const isEmptyTextBlock = $anchor.parent.isTextblock && !$anchor.parent.type.spec.code && !$anchor.parent.textContent; - return !(!view.hasFocus() || !empty2 || !isRootDepth || !isEmptyTextBlock || !this.editor.isEditable); - }); - __publicField(this, "mousedownHandler", () => { - this.preventHide = true; - }); - __publicField(this, "focusHandler", () => { - setTimeout(() => this.update(this.editor.view)); - }); - __publicField(this, "blurHandler", ({ event }) => { - if (this.preventHide) { - this.preventHide = false; - return; - } - if (event?.relatedTarget && this.element.parentNode?.contains(event.relatedTarget)) { - return; - } - this.hide(); - }); - __publicField(this, "tippyBlurHandler", (event) => { - this.blurHandler({ event }); - }); - this.editor = editor; - this.element = element; - this.view = view; - if (shouldShow) { - this.shouldShow = shouldShow; - } - this.element.addEventListener("mousedown", this.mousedownHandler, { capture: true }); - this.editor.on("focus", this.focusHandler); - this.editor.on("blur", this.blurHandler); - this.tippyOptions = tippyOptions; - this.element.style.visibility = "hidden"; - this.element.style.position = "absolute"; - } - createTooltip() { - const { element: editorElement } = this.editor.options; - const editorIsAttached = !!editorElement.parentElement; - if (this.tippy || !editorIsAttached) { - return; - } - this.tippy = tippy_esm_default(editorElement, { - duration: 0, - getReferenceClientRect: null, - content: this.element, - interactive: true, - trigger: "manual", - placement: "right", - hideOnClick: "toggle", - ...this.tippyOptions - }); - if (this.tippy.popper.firstChild) { - this.tippy.popper.firstChild.addEventListener("blur", this.tippyBlurHandler); - } - } - update(view, oldState) { - const { state } = view; - const { doc: doc3, selection } = state; - const { from: from2, to } = selection; - const isSame = oldState && oldState.doc.eq(doc3) && oldState.selection.eq(selection); - if (isSame) { - return; - } - this.createTooltip(); - const shouldShow = this.shouldShow?.({ - editor: this.editor, - view, - state, - oldState - }); - if (!shouldShow) { - this.hide(); - return; - } - this.tippy?.setProps({ - getReferenceClientRect: this.tippyOptions?.getReferenceClientRect || (() => posToDOMRect(view, from2, to)) - }); - this.show(); - } - show() { - this.element.style.position = "relative"; - this.element.style.visibility = "visible"; - this.tippy?.show(); - } - hide() { - this.tippy?.hide(); - } - destroy() { - if (this.tippy?.popper.firstChild) { - this.tippy.popper.firstChild.removeEventListener( - "blur", - this.tippyBlurHandler - ); - } - this.tippy?.destroy(); - this.element.removeEventListener("mousedown", this.mousedownHandler, { capture: true }); - this.editor.off("focus", this.focusHandler); - this.editor.off("blur", this.blurHandler); - } -}; -var FloatingMenuPlugin = (options) => { - return new Plugin({ - key: typeof options.pluginKey === "string" ? new PluginKey(options.pluginKey) : options.pluginKey, - view: (view) => new FloatingMenuView({ view, ...options }) - }); -}; +.ProseMirror pre { + white-space: pre-wrap; +} -// resources/js/extensions/FloatingMenu.js -var FloatingMenu = Extension.create({ - name: "floatingMenu", - addOptions() { - return { - element: null, - tippyOptions: {}, - pluginKey: "floatingMenu", - shouldShow: null - }; - }, - addProseMirrorPlugins() { - if (!this.options.element) { - return []; - } - return [ - FloatingMenuPlugin({ - pluginKey: this.options.pluginKey, - editor: this.editor, - element: this.options.element, - tippyOptions: this.options.tippyOptions, - shouldShow: this.options.shouldShow - }) - ]; - } -}); +img.ProseMirror-separator { + display: inline !important; + border: none !important; + margin: 0 !important; + width: 1px !important; + height: 1px !important; +} -// resources/js/extensions/GridBuilder/utils/createBuilderColumn.js -function createBuilderColumn(colType, colSpan, colContent = null) { - if (colContent) { - return colType.createChecked({ "data-col-span": colSpan }, colContent); - } - return colType.createAndFill({ "data-col-span": colSpan }); +.ProseMirror-gapcursor { + display: none; + pointer-events: none; + position: absolute; + margin: 0; } -// resources/js/extensions/GridBuilder/utils/getGridBuilderNodeTypes.js -function getGridBuilderNodeTypes(schema) { - if (schema.cached.gridBuilderNodeTypes) { - return schema.cached.gridBuilderNodeTypes; - } - const roles = {}; - Object.keys(schema.nodes).forEach((type) => { - const nodeType = schema.nodes[type]; - if (nodeType.spec.gridBuilderRole) { - roles[nodeType.spec.gridBuilderRole] = nodeType; - } - }); - schema.cached.gridBuilderNodeTypes = roles; - return roles; +.ProseMirror-gapcursor:after { + content: ""; + display: block; + position: absolute; + top: -2px; + width: 20px; + border-top: 1px solid black; + animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; } -// resources/js/extensions/GridBuilder/utils/createGridBuilder.js -function createGridBuilder(schema, colsCount, type, stackAt, asymmetricLeft, asymmetricRight, colContent) { - const types = getGridBuilderNodeTypes(schema); - const cols = []; - if (type === "asymmetric") { - cols.push(createBuilderColumn(types.builderColumn, asymmetricLeft, colContent)); - cols.push(createBuilderColumn(types.builderColumn, asymmetricRight, colContent)); - } else { - for (let index = 0; index < colsCount; index += 1) { - const col = createBuilderColumn(types.builderColumn, null, colContent); - if (col) { - cols.push(col); - } - } +@keyframes ProseMirror-cursor-blink { + to { + visibility: hidden; } - return types.gridBuilder.createChecked({ "data-cols": colsCount, "data-type": type, "data-stack-at": stackAt }, cols); } -// resources/js/extensions/GridBuilder/GridBuilder.js -var GridBuilder = Node2.create({ - name: "gridBuilder", - group: "block", - defining: true, - isolating: true, - allowGapCursor: false, - content: "gridBuilderColumn+", - gridBuilderRole: "gridBuilder", - addOptions() { - return { - HTMLAttributes: { - class: "filament-tiptap-grid-builder" - } - }; - }, - addAttributes() { - return { - "data-type": { - default: "responsive", - parseHTML: (element) => element.getAttribute("data-type") - }, - "data-cols": { - default: 2, - parseHTML: (element) => element.getAttribute("data-cols") - }, - "data-stack-at": { - default: "md", - parseHTML: (element) => element.getAttribute("data-stack-at") - }, - "style": { - default: null, - parseHTML: (element) => element.getAttribute("style"), - renderHTML: (attributes) => { - return { - style: `grid-template-columns: repeat(${attributes["data-cols"]}, 1fr);` - }; - } - } - }; - }, - parseHTML() { - return [ - { - tag: "div", - getAttrs: (node) => node.classList.contains("filament-tiptap-grid-builder") && null - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - }, - addCommands() { - return { - insertGridBuilder: ({ cols = 3, type = "responsive", stackAt, asymmetricLeft = null, asymmetricRight = null } = {}) => ({ tr: tr2, dispatch, editor }) => { - const node = createGridBuilder(editor.schema, cols, type, stackAt, asymmetricLeft, asymmetricRight); - if (dispatch) { - const offset2 = tr2.selection.anchor + 1; - tr2.replaceSelectionWith(node).scrollIntoView().setSelection(TextSelection.near(tr2.doc.resolve(offset2))); - } - return true; - } - }; - }, - addKeyboardShortcuts() { - return { - "Mod-Alt-G": () => this.editor.commands.insertGridBuilder() - }; - }, - extendNodeSchema(extension) { - const context = { - name: extension.name, - options: extension.options, - storage: extension.storage - }; - return { - gridBuilderRole: callOrReturn(getExtensionField(extension, "gridBuilderRole", context)) - }; - } -}); +.ProseMirror-hideselection *::selection { + background: transparent; +} -// resources/js/extensions/GridBuilder/GridBuilderColumn.js -var GridBuilderColumn = Node2.create({ - name: "gridBuilderColumn", - content: "block+", - gridBuilderRole: "builderColumn", - isolating: true, - addOptions() { - return { - HTMLAttributes: { - class: "filament-tiptap-grid-builder__column" - } - }; - }, - addAttributes() { - return { - "data-col-span": { - default: 1, - parseHTML: (element) => element.getAttribute("data-col-span") - }, - "style": { - default: null, - parseHTML: (element) => element.getAttribute("style"), - renderHTML: (attributes) => { - let colspan = attributes["data-col-span"]; - return { - style: `grid-column: span ${colspan};` - }; - } - } - }; - }, - parseHTML() { - return [ - { - tag: "div", - getAttrs: (node) => node.classList.contains("filament-tiptap-grid-builder__column") && null - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["div", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; - } -}); +.ProseMirror-hideselection *::-moz-selection { + background: transparent; +} -// resources/js/extensions/DragAndDrop.js -var DragAndDropExtension = Extension.create({ - name: "dragAndDrop", - addProseMirrorPlugins(bla) { - return [ - new Plugin({ - props: { - handleDrop(view, event) { - if (!event) - return false; - event.preventDefault(); - const coordinates = view.posAtCoords({ - left: event.clientX, - top: event.clientY - }); - if (event.dataTransfer.getData("block")) { - event.target.dispatchEvent(new CustomEvent("dragged-block", { - detail: { - type: event.dataTransfer.getData("block"), - coordinates - }, - bubbles: true - })); - return false; - } - if (event.dataTransfer.getData("mergeTag")) { - event.target.dispatchEvent(new CustomEvent("dragged-merge-tag", { - detail: { - tag: event.dataTransfer.getData("mergeTag"), - coordinates - }, - bubbles: true - })); - return false; - } - return false; - } - } - }) - ]; - } -}); +.ProseMirror-hideselection * { + caret-color: transparent; +} + +.ProseMirror-focused .ProseMirror-gapcursor { + display: block; +} + +.tippy-box[data-animation=fade][data-state=hidden] { + opacity: 0 +}`;function rD(t,e,n){let r=document.querySelector(`style[data-tiptap-style${n?`-${n}`:""}]`);if(r!==null)return r;let i=document.createElement("style");return e&&i.setAttribute("nonce",e),i.setAttribute(`data-tiptap-style${n?`-${n}`:""}`,""),i.innerHTML=t,document.getElementsByTagName("head")[0].appendChild(i),i}var Xl=class extends pp{constructor(e={}){super(),this.isFocused=!1,this.extensionStorage={},this.options={element:document.createElement("div"),content:"",injectCSS:!0,injectNonce:void 0,extensions:[],autofocus:!1,editable:!0,editorProps:{},parseOptions:{},enableInputRules:!0,enablePasteRules:!0,enableCoreExtensions:!0,onBeforeCreate:()=>null,onCreate:()=>null,onUpdate:()=>null,onSelectionUpdate:()=>null,onTransaction:()=>null,onFocus:()=>null,onBlur:()=>null,onDestroy:()=>null},this.isCapturingTransaction=!1,this.capturedTransaction=null,this.setOptions(e),this.createExtensionManager(),this.createCommandManager(),this.createSchema(),this.on("beforeCreate",this.options.onBeforeCreate),this.emit("beforeCreate",{editor:this}),this.createView(),this.injectCSS(),this.on("create",this.options.onCreate),this.on("update",this.options.onUpdate),this.on("selectionUpdate",this.options.onSelectionUpdate),this.on("transaction",this.options.onTransaction),this.on("focus",this.options.onFocus),this.on("blur",this.options.onBlur),this.on("destroy",this.options.onDestroy),window.setTimeout(()=>{this.isDestroyed||(this.commands.focus(this.options.autofocus),this.emit("create",{editor:this}))},0)}get storage(){return this.extensionStorage}get commands(){return this.commandManager.commands}chain(){return this.commandManager.chain()}can(){return this.commandManager.can()}injectCSS(){this.options.injectCSS&&document&&(this.css=rD(nD,this.options.injectNonce))}setOptions(e={}){this.options={...this.options,...e},!(!this.view||!this.state||this.isDestroyed)&&(this.options.editorProps&&this.view.setProps(this.options.editorProps),this.view.updateState(this.state))}setEditable(e,n=!0){this.setOptions({editable:e}),n&&this.emit("update",{editor:this,transaction:this.state.tr})}get isEditable(){return this.options.editable&&this.view&&this.view.editable}get state(){return this.view.state}registerPlugin(e,n){let r=NE(n)?n(e,[...this.state.plugins]):[...this.state.plugins,e],i=this.state.reconfigure({plugins:r});this.view.updateState(i)}unregisterPlugin(e){if(this.isDestroyed)return;let n=typeof e=="string"?`${e}$`:e.key,r=this.state.reconfigure({plugins:this.state.plugins.filter(i=>!i.key.startsWith(n))});this.view.updateState(r)}createExtensionManager(){let n=[...this.options.enableCoreExtensions?Object.values(tD):[],...this.options.extensions].filter(r=>["extension","node","mark"].includes(r?.type));this.extensionManager=new gp(n,this)}createCommandManager(){this.commandManager=new Go({editor:this})}createSchema(){this.schema=this.extensionManager.schema}createView(){let e=DE(this.options.content,this.schema,this.options.parseOptions),n=IE(e,this.options.autofocus);this.view=new $l(this.options.element,{...this.options.editorProps,dispatchTransaction:this.dispatchTransaction.bind(this),state:Ol.create({doc:e,selection:n||void 0})});let r=this.state.reconfigure({plugins:this.extensionManager.plugins});this.view.updateState(r),this.createNodeViews(),this.prependClass();let i=this.view.dom;i.editor=this}createNodeViews(){this.view.setProps({nodeViews:this.extensionManager.nodeViews})}prependClass(){this.view.dom.className=`tiptap ${this.view.dom.className}`}captureTransaction(e){this.isCapturingTransaction=!0,e(),this.isCapturingTransaction=!1;let n=this.capturedTransaction;return this.capturedTransaction=null,n}dispatchTransaction(e){if(this.view.isDestroyed)return;if(this.isCapturingTransaction){if(!this.capturedTransaction){this.capturedTransaction=e;return}e.steps.forEach(s=>{var l;return(l=this.capturedTransaction)===null||l===void 0?void 0:l.step(s)});return}let n=this.state.apply(e),r=!this.state.selection.eq(n.selection);this.view.updateState(n),this.emit("transaction",{editor:this,transaction:e}),r&&this.emit("selectionUpdate",{editor:this,transaction:e});let i=e.getMeta("focus"),o=e.getMeta("blur");i&&this.emit("focus",{editor:this,event:i.event,transaction:e}),o&&this.emit("blur",{editor:this,event:o.event,transaction:e}),!(!e.docChanged||e.getMeta("preventUpdate"))&&this.emit("update",{editor:this,transaction:e})}getAttributes(e){return Tp(this.state,e)}isActive(e,n){let r=typeof e=="string"?e:null,i=typeof e=="string"?n:e;return Wn(this.state,r,i)}getJSON(){return this.state.doc.toJSON()}getHTML(){return SL(this.state.doc.content,this.schema)}getText(e){let{blockSeparator:n=` -// resources/js/extensions/TiptapBlock.js -var TiptapBlock = Node2.create({ - name: "tiptapBlock", - group: "block", - atom: true, - defining: true, - draggable: true, - selectable: true, - isolating: true, - allowGapCursor: true, - inline: false, - addAttributes() { - return { - preview: { - default: null, - parseHTML: (element) => { - return element.getAttribute("data-preview"); - }, - renderHTML: (attributes) => { - if (!attributes.preview) { - return null; - } - return { - "data-preview": attributes.preview - }; - } - }, - statePath: { - default: null, - parseHTML: (element) => { - return element.getAttribute("data-state-path"); - }, - renderHTML: (attributes) => { - if (!attributes.statePath) { - return null; - } - return { - "data-state-path": attributes.statePath - }; - } - }, - type: { - default: null, - parseHTML: (element) => { - return element.getAttribute("data-type"); - }, - renderHTML: (attributes) => { - if (!attributes.type) { - return null; - } - return { - "data-type": attributes.type - }; - } - }, - label: { - default: null, - parseHTML: (element) => { - return element.getAttribute("data-label"); - }, - renderHTML: (attributes) => { - if (!attributes.label) { - return null; - } - return { - "data-label": attributes.label - }; - } - }, - data: { - default: null, - parseHTML: (element) => { - return element.getAttribute("data-data"); - }, - renderHTML: (attributes) => { - if (!attributes.data) { - return null; - } - return { - "data-data": JSON.stringify(attributes.data) - }; - } - } - }; - }, - parseHTML() { - return [ - { - tag: "tiptap-block" - } - ]; - }, - renderHTML({ HTMLAttributes }) { - return ["tiptap-block", mergeAttributes(HTMLAttributes)]; - }, - addNodeView() { - return ({ node }) => { - const dom = document.createElement("div"); - dom.contentEditable = "false"; - dom.classList.add("tiptap-block-wrapper"); - let data = typeof node.attrs.data === "object" ? JSON.stringify(node.attrs.data) : node.attrs.data; - dom.innerHTML = ` +`,textSerializers:r={}}=e||{};return TL(this.state.doc,{blockSeparator:n,textSerializers:{...RE(this.schema),...r}})}get isEmpty(){return AL(this.state.doc)}getCharacterCount(){return console.warn('[tiptap warn]: "editor.getCharacterCount()" is deprecated. Please use "editor.storage.characterCount.characters()" instead.'),this.state.doc.content.size-2}destroy(){this.emit("destroy"),this.view&&this.view.destroy(),this.removeAllListeners()}get isDestroyed(){var e;return!(!((e=this.view)===null||e===void 0)&&e.docView)}$node(e,n){var r;return((r=this.$doc)===null||r===void 0?void 0:r.querySelector(e,n))||null}$nodes(e,n){var r;return((r=this.$doc)===null||r===void 0?void 0:r.querySelectorAll(e,n))||null}$pos(e){let n=this.state.doc.resolve(e);return new Ep(n,this)}get $doc(){return this.$pos(0)}};function Kn(t){return new qo({find:t.find,handler:({state:e,range:n,match:r})=>{let i=Se(t.getAttributes,void 0,r);if(i===!1||i===null)return null;let{tr:o}=e,s=r[r.length-1],l=r[0];if(s){let u=l.search(/\S/),d=n.from+l.indexOf(s),f=d+s.length;if(rc(n.from,n.to,e.doc).filter(b=>b.mark.type.excluded.find(v=>v===t.type&&v!==b.mark.type)).filter(b=>b.to>d).length)return null;fn.from&&o.delete(n.from+u,d);let m=n.from+u+s.length;o.addMark(n.from+u,m,t.type.create(i||{})),o.removeStoredMark(t.type)}}})}function oc(t){return new qo({find:t.find,handler:({state:e,range:n,match:r})=>{let i=Se(t.getAttributes,void 0,r)||{},{tr:o}=e,s=n.from,l=n.to,u=t.type.create(i);if(r[1]){let d=r[0].lastIndexOf(r[1]),f=s+d;f>l?f=l:l=f+r[1].length;let h=r[0][r[0].length-1];o.insertText(h,s+r[0].length-1),o.replaceWith(f,l,u)}else r[0]&&o.insert(s-1,t.type.create(i)).delete(o.mapping.map(s),o.mapping.map(l));o.scrollIntoView()}})}function na(t){return new qo({find:t.find,handler:({state:e,range:n,match:r})=>{let i=e.doc.resolve(n.from),o=Se(t.getAttributes,void 0,r)||{};if(!i.node(-1).canReplaceWith(i.index(-1),i.indexAfter(-1),t.type))return null;e.tr.delete(n.from,n.to).setBlockType(n.from,n.from,t.type,o)}})}function bi(t){return new qo({find:t.find,handler:({state:e,range:n,match:r,chain:i})=>{let o=Se(t.getAttributes,void 0,r)||{},s=e.tr.delete(n.from,n.to),u=s.doc.resolve(n.from).blockRange(),d=u&&Po(u,t.type,o);if(!d)return null;if(s.wrap(u,d),t.keepMarks&&t.editor){let{selection:h,storedMarks:m}=e,{splittableMarks:b}=t.editor.extensionManager,y=m||h.$to.parentOffset&&h.$from.marks();if(y){let v=y.filter(x=>b.includes(x.type.name));s.ensureMarks(v)}}if(t.keepAttributes){let h=t.type.name==="bulletList"||t.type.name==="orderedList"?"listItem":"taskList";i().updateAttributes(h,o).run()}let f=s.doc.resolve(n.from-1).nodeBefore;f&&f.type===t.type&&rr(s.doc,n.from-1)&&(!t.joinPredicate||t.joinPredicate(r,f))&&s.join(n.from-1)}})}var tt=class t{constructor(e={}){this.type="mark",this.name="mark",this.parent=null,this.child=null,this.config={name:this.name,defaultOptions:{}},this.config={...this.config,...e},this.name=this.config.name,e.defaultOptions&&Object.keys(e.defaultOptions).length>0&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`),this.options=this.config.defaultOptions,this.config.addOptions&&(this.options=Se(re(this,"addOptions",{name:this.name}))),this.storage=Se(re(this,"addStorage",{name:this.name,options:this.options}))||{}}static create(e={}){return new t(e)}configure(e={}){let n=this.extend();return n.options=Ql(this.options,e),n.storage=Se(re(n,"addStorage",{name:n.name,options:n.options})),n}extend(e={}){let n=new t({...this.config,...e});return n.parent=this,this.child=n,n.name=e.name?e.name:n.parent.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`),n.options=Se(re(n,"addOptions",{name:n.name})),n.storage=Se(re(n,"addStorage",{name:n.name,options:n.options})),n}static handleExit({editor:e,mark:n}){let{tr:r}=e.state,i=e.state.selection.$from;if(i.pos===i.end()){let s=i.marks();if(!!!s.find(d=>d?.type.name===n.name))return!1;let u=s.find(d=>d?.type.name===n.name);return u&&r.removeStoredMark(u),r.insertText(" ",i.pos),e.view.dispatch(r),!0}return!1}},ae=class t{constructor(e={}){this.type="node",this.name="node",this.parent=null,this.child=null,this.config={name:this.name,defaultOptions:{}},this.config={...this.config,...e},this.name=this.config.name,e.defaultOptions&&Object.keys(e.defaultOptions).length>0&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${this.name}".`),this.options=this.config.defaultOptions,this.config.addOptions&&(this.options=Se(re(this,"addOptions",{name:this.name}))),this.storage=Se(re(this,"addStorage",{name:this.name,options:this.options}))||{}}static create(e={}){return new t(e)}configure(e={}){let n=this.extend();return n.options=Ql(this.options,e),n.storage=Se(re(n,"addStorage",{name:n.name,options:n.options})),n}extend(e={}){let n=new t({...this.config,...e});return n.parent=this,this.child=n,n.name=e.name?e.name:n.parent.name,e.defaultOptions&&console.warn(`[tiptap warn]: BREAKING CHANGE: "defaultOptions" is deprecated. Please use "addOptions" instead. Found in extension: "${n.name}".`),n.options=Se(re(n,"addOptions",{name:n.name})),n.storage=Se(re(n,"addStorage",{name:n.name,options:n.options})),n}};function xn(t){return new mp({find:t.find,handler:({state:e,range:n,match:r,pasteEvent:i})=>{let o=Se(t.getAttributes,void 0,r,i);if(o===!1||o===null)return null;let{tr:s}=e,l=r[r.length-1],u=r[0],d=n.to;if(l){let f=u.search(/\S/),h=n.from+u.indexOf(l),m=h+l.length;if(rc(n.from,n.to,e.doc).filter(y=>y.mark.type.excluded.find(x=>x===t.type&&x!==y.mark.type)).filter(y=>y.to>h).length)return null;mn.from&&s.delete(n.from+f,h),d=n.from+f+l.length,s.addMark(n.from+f,d,t.type.create(o||{})),s.removeStoredMark(t.type)}}})}function zE(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}var iD=/^\s*>\s$/,$E=ae.create({name:"blockquote",addOptions(){return{HTMLAttributes:{}}},content:"block+",group:"block",defining:!0,parseHTML(){return[{tag:"blockquote"}]},renderHTML({HTMLAttributes:t}){return["blockquote",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setBlockquote:()=>({commands:t})=>t.wrapIn(this.name),toggleBlockquote:()=>({commands:t})=>t.toggleWrap(this.name),unsetBlockquote:()=>({commands:t})=>t.lift(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-b":()=>this.editor.commands.toggleBlockquote()}},addInputRules(){return[bi({find:iD,type:this.type})]}});var oD=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))$/,sD=/(?:^|\s)(\*\*(?!\s+\*\*)((?:[^*]+))\*\*(?!\s+\*\*))/g,aD=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))$/,lD=/(?:^|\s)(__(?!\s+__)((?:[^_]+))__(?!\s+__))/g,UE=tt.create({name:"bold",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"strong"},{tag:"b",getAttrs:t=>t.style.fontWeight!=="normal"&&null},{style:"font-weight",getAttrs:t=>/^(bold(er)?|[5-9]\d{2,})$/.test(t)&&null}]},renderHTML({HTMLAttributes:t}){return["strong",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setBold:()=>({commands:t})=>t.setMark(this.name),toggleBold:()=>({commands:t})=>t.toggleMark(this.name),unsetBold:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-b":()=>this.editor.commands.toggleBold(),"Mod-B":()=>this.editor.commands.toggleBold()}},addInputRules(){return[Kn({find:oD,type:this.type}),Kn({find:aD,type:this.type})]},addPasteRules(){return[xn({find:sD,type:this.type}),xn({find:lD,type:this.type})]}});var cD=ae.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",Z(this.options.HTMLAttributes,t),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}}),WE=tt.create({name:"textStyle",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.hasAttribute("style")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["span",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{removeEmptyTextStyle:()=>({state:t,commands:e})=>{let n=gi(t,this.type);return Object.entries(n).some(([,i])=>!!i)?!0:e.unsetMark(this.name)}}}}),KE=/^\s*([-+*])\s$/,VE=ae.create({name:"bulletList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:"ul"}]},renderHTML({HTMLAttributes:t}){return["ul",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleBulletList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(cD.name,this.editor.getAttributes(WE.name)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-8":()=>this.editor.commands.toggleBulletList()}},addInputRules(){let t=bi({find:KE,type:this.type});return(this.options.keepMarks||this.options.keepAttributes)&&(t=bi({find:KE,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:()=>this.editor.getAttributes(WE.name),editor:this.editor})),[t]}});var uD=/(?:^|\s)(`(?!\s+`)((?:[^`]+))`(?!\s+`))$/,dD=/(?:^|\s)(`(?!\s+`)((?:[^`]+))`(?!\s+`))/g,GE=tt.create({name:"code",addOptions(){return{HTMLAttributes:{}}},excludes:"_",code:!0,exitable:!0,parseHTML(){return[{tag:"code"}]},renderHTML({HTMLAttributes:t}){return["code",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setCode:()=>({commands:t})=>t.setMark(this.name),toggleCode:()=>({commands:t})=>t.toggleMark(this.name),unsetCode:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-e":()=>this.editor.commands.toggleCode()}},addInputRules(){return[Kn({find:uD,type:this.type})]},addPasteRules(){return[xn({find:dD,type:this.type})]}});var qE=tt.create({name:"textStyle",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.hasAttribute("style")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["span",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{removeEmptyTextStyle:()=>({state:t,commands:e})=>{let n=gi(t,this.type);return Object.entries(n).some(([,i])=>!!i)?!0:e.unsetMark(this.name)}}}});var YE=Je.create({name:"color",addOptions(){return{types:["textStyle"]}},addGlobalAttributes(){return[{types:this.options.types,attributes:{color:{default:null,parseHTML:t=>{var e;return(e=t.style.color)===null||e===void 0?void 0:e.replace(/['"]+/g,"")},renderHTML:t=>t.color?{style:`color: ${t.color}`}:{}}}}]},addCommands(){return{setColor:t=>({chain:e})=>e().setMark("textStyle",{color:t}).run(),unsetColor:()=>({chain:t})=>t().setMark("textStyle",{color:null}).removeEmptyTextStyle().run()}}});var JE=ae.create({name:"doc",topNode:!0,content:"block+"});function XE(t={}){return new Pe({view(e){return new Mp(e,t)}})}var Mp=class{constructor(e,n){var r;this.editorView=e,this.cursorPos=null,this.element=null,this.timeout=-1,this.width=(r=n.width)!==null&&r!==void 0?r:1,this.color=n.color===!1?void 0:n.color||"black",this.class=n.class,this.handlers=["dragover","dragend","drop","dragleave"].map(i=>{let o=s=>{this[i](s)};return e.dom.addEventListener(i,o),{name:i,handler:o}})}destroy(){this.handlers.forEach(({name:e,handler:n})=>this.editorView.dom.removeEventListener(e,n))}update(e,n){this.cursorPos!=null&&n.doc!=e.state.doc&&(this.cursorPos>e.state.doc.content.size?this.setCursor(null):this.updateOverlay())}setCursor(e){e!=this.cursorPos&&(this.cursorPos=e,e==null?(this.element.parentNode.removeChild(this.element),this.element=null):this.updateOverlay())}updateOverlay(){let e=this.editorView.state.doc.resolve(this.cursorPos),n=!e.parent.inlineContent,r;if(n){let l=e.nodeBefore,u=e.nodeAfter;if(l||u){let d=this.editorView.nodeDOM(this.cursorPos-(l?l.nodeSize:0));if(d){let f=d.getBoundingClientRect(),h=l?f.bottom:f.top;l&&u&&(h=(h+this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top)/2),r={left:f.left,right:f.right,top:h-this.width/2,bottom:h+this.width/2}}}}if(!r){let l=this.editorView.coordsAtPos(this.cursorPos);r={left:l.left-this.width/2,right:l.left+this.width/2,top:l.top,bottom:l.bottom}}let i=this.editorView.dom.offsetParent;this.element||(this.element=i.appendChild(document.createElement("div")),this.class&&(this.element.className=this.class),this.element.style.cssText="position: absolute; z-index: 50; pointer-events: none;",this.color&&(this.element.style.backgroundColor=this.color)),this.element.classList.toggle("prosemirror-dropcursor-block",n),this.element.classList.toggle("prosemirror-dropcursor-inline",!n);let o,s;if(!i||i==document.body&&getComputedStyle(i).position=="static")o=-pageXOffset,s=-pageYOffset;else{let l=i.getBoundingClientRect();o=l.left-i.scrollLeft,s=l.top-i.scrollTop}this.element.style.left=r.left-o+"px",this.element.style.top=r.top-s+"px",this.element.style.width=r.right-r.left+"px",this.element.style.height=r.bottom-r.top+"px"}scheduleRemoval(e){clearTimeout(this.timeout),this.timeout=setTimeout(()=>this.setCursor(null),e)}dragover(e){if(!this.editorView.editable)return;let n=this.editorView.posAtCoords({left:e.clientX,top:e.clientY}),r=n&&n.inside>=0&&this.editorView.state.doc.nodeAt(n.inside),i=r&&r.type.spec.disableDropCursor,o=typeof i=="function"?i(this.editorView,n,e):i;if(n&&!o){let s=n.pos;if(this.editorView.dragging&&this.editorView.dragging.slice){let l=kl(this.editorView.state.doc,s,this.editorView.dragging.slice);l!=null&&(s=l)}this.setCursor(s),this.scheduleRemoval(5e3)}}dragend(){this.scheduleRemoval(20)}drop(){this.scheduleRemoval(20)}dragleave(e){(e.target==this.editorView.dom||!this.editorView.dom.contains(e.relatedTarget))&&this.setCursor(null)}};var ZE=Je.create({name:"dropCursor",addOptions(){return{color:"currentColor",width:1,class:void 0}},addProseMirrorPlugins(){return[XE(this.options)]}});var on=class t extends fe{constructor(e){super(e,e)}map(e,n){let r=e.resolve(n.map(this.head));return t.valid(r)?new t(r):fe.near(r)}content(){return X.empty}eq(e){return e instanceof t&&e.head==this.head}toJSON(){return{type:"gapcursor",pos:this.head}}static fromJSON(e,n){if(typeof n.pos!="number")throw new RangeError("Invalid input for GapCursor.fromJSON");return new t(e.resolve(n.pos))}getBookmark(){return new Cp(this.anchor)}static valid(e){let n=e.parent;if(n.isTextblock||!fD(e)||!pD(e))return!1;let r=n.type.spec.allowGapCursor;if(r!=null)return r;let i=n.contentMatchAt(e.index()).defaultType;return i&&i.isTextblock}static findGapCursorFrom(e,n,r=!1){e:for(;;){if(!r&&t.valid(e))return e;let i=e.pos,o=null;for(let s=e.depth;;s--){let l=e.node(s);if(n>0?e.indexAfter(s)0){o=l.child(n>0?e.indexAfter(s):e.index(s)-1);break}else if(s==0)return null;i+=n;let u=e.doc.resolve(i);if(t.valid(u))return u}for(;;){let s=n>0?o.firstChild:o.lastChild;if(!s){if(o.isAtom&&!o.isText&&!pe.isSelectable(o)){e=e.doc.resolve(i+o.nodeSize*n),r=!1;continue e}break}o=s,i+=n;let l=e.doc.resolve(i);if(t.valid(l))return l}return null}}};on.prototype.visible=!1;on.findFrom=on.findGapCursorFrom;fe.jsonID("gapcursor",on);var Cp=class t{constructor(e){this.pos=e}map(e){return new t(e.map(this.pos))}resolve(e){let n=e.resolve(this.pos);return on.valid(n)?new on(n):fe.near(n)}};function fD(t){for(let e=t.depth;e>=0;e--){let n=t.index(e),r=t.node(e);if(n==0){if(r.type.spec.isolating)return!0;continue}for(let i=r.child(n-1);;i=i.lastChild){if(i.childCount==0&&!i.inlineContent||i.isAtom||i.type.spec.isolating)return!0;if(i.inlineContent)return!1}}return!0}function pD(t){for(let e=t.depth;e>=0;e--){let n=t.indexAfter(e),r=t.node(e);if(n==r.childCount){if(r.type.spec.isolating)return!0;continue}for(let i=r.child(n);;i=i.firstChild){if(i.childCount==0&&!i.inlineContent||i.isAtom||i.type.spec.isolating)return!0;if(i.inlineContent)return!1}}return!0}function jE(){return new Pe({props:{decorations:bD,createSelectionBetween(t,e,n){return e.pos==n.pos&&on.valid(n)?new on(n):null},handleClick:mD,handleKeyDown:hD,handleDOMEvents:{beforeinput:gD}}})}var hD=ea({ArrowLeft:sc("horiz",-1),ArrowRight:sc("horiz",1),ArrowUp:sc("vert",-1),ArrowDown:sc("vert",1)});function sc(t,e){let n=t=="vert"?e>0?"down":"up":e>0?"right":"left";return function(r,i,o){let s=r.selection,l=e>0?s.$to:s.$from,u=s.empty;if(s instanceof ce){if(!o.endOfTextblock(n)||l.depth==0)return!1;u=!1,l=r.doc.resolve(e>0?l.after():l.before())}let d=on.findGapCursorFrom(l,e,u);return d?(i&&i(r.tr.setSelection(new on(d))),!0):!1}}function mD(t,e,n){if(!t||!t.editable)return!1;let r=t.state.doc.resolve(e);if(!on.valid(r))return!1;let i=t.posAtCoords({left:n.clientX,top:n.clientY});return i&&i.inside>-1&&pe.isSelectable(t.state.doc.nodeAt(i.inside))?!1:(t.dispatch(t.state.tr.setSelection(new on(r))),!0)}function gD(t,e){if(e.inputType!="insertCompositionText"||!(t.state.selection instanceof on))return!1;let{$from:n}=t.state.selection,r=n.parent.contentMatchAt(n.index()).findWrapping(t.state.schema.nodes.text);if(!r)return!1;let i=K.empty;for(let s=r.length-1;s>=0;s--)i=K.from(r[s].createAndFill(null,i));let o=t.state.tr.replace(n.pos,n.pos,new X(i,0,0));return o.setSelection(ce.near(o.doc.resolve(n.pos+1))),t.dispatch(o),!1}function bD(t){if(!(t.selection instanceof on))return null;let e=document.createElement("div");return e.className="ProseMirror-gapcursor",lt.create(t.doc,[Mt.widget(t.selection.head,e,{key:"gapcursor"})])}var QE=Je.create({name:"gapCursor",addProseMirrorPlugins(){return[jE()]},extendNodeSchema(t){var e;let n={name:t.name,options:t.options,storage:t.storage};return{allowGapCursor:(e=Se(re(t,"allowGapCursor",n)))!==null&&e!==void 0?e:null}}});var ev=ae.create({name:"hardBreak",addOptions(){return{keepMarks:!0,HTMLAttributes:{}}},inline:!0,group:"inline",selectable:!1,parseHTML(){return[{tag:"br"}]},renderHTML({HTMLAttributes:t}){return["br",Z(this.options.HTMLAttributes,t)]},renderText(){return` +`},addCommands(){return{setHardBreak:()=>({commands:t,chain:e,state:n,editor:r})=>t.first([()=>t.exitCode(),()=>t.command(()=>{let{selection:i,storedMarks:o}=n;if(i.$from.parent.type.spec.isolating)return!1;let{keepMarks:s}=this.options,{splittableMarks:l}=r.extensionManager,u=o||i.$to.parentOffset&&i.$from.marks();return e().insertContent({type:this.name}).command(({tr:d,dispatch:f})=>{if(f&&u&&s){let h=u.filter(m=>l.includes(m.type.name));d.ensureMarks(h)}return!0}).run()})])}},addKeyboardShortcuts(){return{"Mod-Enter":()=>this.editor.commands.setHardBreak(),"Shift-Enter":()=>this.editor.commands.setHardBreak()}}});var tv=ae.create({name:"heading",addOptions(){return{levels:[1,2,3,4,5,6],HTMLAttributes:{}}},content:"inline*",group:"block",defining:!0,addAttributes(){return{level:{default:1,rendered:!1}}},parseHTML(){return this.options.levels.map(t=>({tag:`h${t}`,attrs:{level:t}}))},renderHTML({node:t,HTMLAttributes:e}){return[`h${this.options.levels.includes(t.attrs.level)?t.attrs.level:this.options.levels[0]}`,Z(this.options.HTMLAttributes,e),0]},addCommands(){return{setHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.setNode(this.name,t):!1,toggleHeading:t=>({commands:e})=>this.options.levels.includes(t.level)?e.toggleNode(this.name,"paragraph",t):!1}},addKeyboardShortcuts(){return this.options.levels.reduce((t,e)=>({...t,[`Mod-Alt-${e}`]:()=>this.editor.commands.toggleHeading({level:e})}),{})},addInputRules(){return this.options.levels.map(t=>na({find:new RegExp(`^(#{1,${t}})\\s$`),type:this.type,getAttributes:{level:t}}))}});var ac=200,Jt=function(){};Jt.prototype.append=function(e){return e.length?(e=Jt.from(e),!this.length&&e||e.length=n?Jt.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,n))};Jt.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)};Jt.prototype.forEach=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length),n<=r?this.forEachInner(e,n,r,0):this.forEachInvertedInner(e,n,r,0)};Jt.prototype.map=function(e,n,r){n===void 0&&(n=0),r===void 0&&(r=this.length);var i=[];return this.forEach(function(o,s){return i.push(e(o,s))},n,r),i};Jt.from=function(e){return e instanceof Jt?e:e&&e.length?new nv(e):Jt.empty};var nv=function(t){function e(r){t.call(this),this.values=r}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={length:{configurable:!0},depth:{configurable:!0}};return e.prototype.flatten=function(){return this.values},e.prototype.sliceInner=function(i,o){return i==0&&o==this.length?this:new e(this.values.slice(i,o))},e.prototype.getInner=function(i){return this.values[i]},e.prototype.forEachInner=function(i,o,s,l){for(var u=o;u=s;u--)if(i(this.values[u],l+u)===!1)return!1},e.prototype.leafAppend=function(i){if(this.length+i.length<=ac)return new e(this.values.concat(i.flatten()))},e.prototype.leafPrepend=function(i){if(this.length+i.length<=ac)return new e(i.flatten().concat(this.values))},n.length.get=function(){return this.values.length},n.depth.get=function(){return 0},Object.defineProperties(e.prototype,n),e}(Jt);Jt.empty=new nv([]);var yD=function(t){function e(n,r){t.call(this),this.left=n,this.right=r,this.length=n.length+r.length,this.depth=Math.max(n.depth,r.depth)+1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},e.prototype.getInner=function(r){return rl&&this.right.forEachInner(r,Math.max(i-l,0),Math.min(this.length,o)-l,s+l)===!1)return!1},e.prototype.forEachInvertedInner=function(r,i,o,s){var l=this.left.length;if(i>l&&this.right.forEachInvertedInner(r,i-l,Math.max(o,l)-l,s+l)===!1||o=o?this.right.slice(r-o,i-o):this.left.slice(r,o).append(this.right.slice(0,i-o))},e.prototype.leafAppend=function(r){var i=this.right.leafAppend(r);if(i)return new e(this.left,i)},e.prototype.leafPrepend=function(r){var i=this.left.leafPrepend(r);if(i)return new e(i,this.right)},e.prototype.appendInner=function(r){return this.left.depth>=Math.max(this.right.depth,r.depth)+1?new e(this.left,new e(this.right,r)):new e(this,r)},e}(Jt),kp=Jt;var ED=500,ro=class t{constructor(e,n){this.items=e,this.eventCount=n}popEvent(e,n){if(this.eventCount==0)return null;let r=this.items.length;for(;;r--)if(this.items.get(r-1).selection){--r;break}let i,o;n&&(i=this.remapping(r,this.items.length),o=i.maps.length);let s=e.tr,l,u,d=[],f=[];return this.items.forEach((h,m)=>{if(!h.step){i||(i=this.remapping(r,m+1),o=i.maps.length),o--,f.push(h);return}if(i){f.push(new br(h.map));let b=h.step.map(i.slice(o)),y;b&&s.maybeStep(b).doc&&(y=s.mapping.maps[s.mapping.maps.length-1],d.push(new br(y,void 0,void 0,d.length+f.length))),o--,y&&i.appendMap(y,o)}else s.maybeStep(h.step);if(h.selection)return l=i?h.selection.map(i.slice(o)):h.selection,u=new t(this.items.slice(0,r).append(f.reverse().concat(d)),this.eventCount-1),!1},this.items.length,0),{remaining:u,transform:s,selection:l}}addTransform(e,n,r,i){let o=[],s=this.eventCount,l=this.items,u=!i&&l.length?l.get(l.length-1):null;for(let f=0;fwD&&(l=vD(l,d),s-=d),new t(l.append(o),s)}remapping(e,n){let r=new Fs;return this.items.forEach((i,o)=>{let s=i.mirrorOffset!=null&&o-i.mirrorOffset>=e?r.maps.length-i.mirrorOffset:void 0;r.appendMap(i.map,s)},e,n),r}addMaps(e){return this.eventCount==0?this:new t(this.items.append(e.map(n=>new br(n))),this.eventCount)}rebased(e,n){if(!this.eventCount)return this;let r=[],i=Math.max(0,this.items.length-n),o=e.mapping,s=e.steps.length,l=this.eventCount;this.items.forEach(m=>{m.selection&&l--},i);let u=n;this.items.forEach(m=>{let b=o.getMirror(--u);if(b==null)return;s=Math.min(s,b);let y=o.maps[b];if(m.step){let v=e.steps[b].invert(e.docs[b]),x=m.selection&&m.selection.map(o.slice(u+1,b));x&&l++,r.push(new br(y,v,x))}else r.push(new br(y))},i);let d=[];for(let m=n;mED&&(h=h.compress(this.items.length-r.length)),h}emptyItemCount(){let e=0;return this.items.forEach(n=>{n.step||e++}),e}compress(e=this.items.length){let n=this.remapping(0,e),r=n.maps.length,i=[],o=0;return this.items.forEach((s,l)=>{if(l>=e)i.push(s),s.selection&&o++;else if(s.step){let u=s.step.map(n.slice(r)),d=u&&u.getMap();if(r--,d&&n.appendMap(d,r),u){let f=s.selection&&s.selection.map(n.slice(r));f&&o++;let h=new br(d.invert(),u,f),m,b=i.length-1;(m=i.length&&i[b].merge(h))?i[b]=m:i.push(h)}}else s.map&&r--},this.items.length,0),new t(kp.from(i.reverse()),o)}};ro.empty=new ro(kp.empty,0);function vD(t,e){let n;return t.forEach((r,i)=>{if(r.selection&&e--==0)return n=i,!1}),t.slice(n)}var br=class t{constructor(e,n,r,i){this.map=e,this.step=n,this.selection=r,this.mirrorOffset=i}merge(e){if(this.step&&e.step&&!e.selection){let n=e.step.merge(this.step);if(n)return new t(n.getMap().invert(),n,this.selection)}}},yr=class{constructor(e,n,r,i,o){this.done=e,this.undone=n,this.prevRanges=r,this.prevTime=i,this.prevComposition=o}},wD=20;function xD(t,e,n,r){let i=n.getMeta(no),o;if(i)return i.historyState;n.getMeta(TD)&&(t=new yr(t.done,t.undone,null,0,-1));let s=n.getMeta("appendedTransaction");if(n.steps.length==0)return t;if(s&&s.getMeta(no))return s.getMeta(no).redo?new yr(t.done.addTransform(n,void 0,r,lc(e)),t.undone,rv(n.mapping.maps[n.steps.length-1]),t.prevTime,t.prevComposition):new yr(t.done,t.undone.addTransform(n,void 0,r,lc(e)),null,t.prevTime,t.prevComposition);if(n.getMeta("addToHistory")!==!1&&!(s&&s.getMeta("addToHistory")===!1)){let l=n.getMeta("composition"),u=t.prevTime==0||!s&&t.prevComposition!=l&&(t.prevTime<(n.time||0)-r.newGroupDelay||!_D(n,t.prevRanges)),d=s?Ap(t.prevRanges,n.mapping):rv(n.mapping.maps[n.steps.length-1]);return new yr(t.done.addTransform(n,u?e.selection.getBookmark():void 0,r,lc(e)),ro.empty,d,n.time,l??t.prevComposition)}else return(o=n.getMeta("rebased"))?new yr(t.done.rebased(n,o),t.undone.rebased(n,o),Ap(t.prevRanges,n.mapping),t.prevTime,t.prevComposition):new yr(t.done.addMaps(n.mapping.maps),t.undone.addMaps(n.mapping.maps),Ap(t.prevRanges,n.mapping),t.prevTime,t.prevComposition)}function _D(t,e){if(!e)return!1;if(!t.docChanged)return!0;let n=!1;return t.mapping.maps[0].forEach((r,i)=>{for(let o=0;o=e[o]&&(n=!0)}),n}function rv(t){let e=[];return t.forEach((n,r,i,o)=>e.push(i,o)),e}function Ap(t,e){if(!t)return null;let n=[];for(let r=0;r{let i=no.getState(n);if(!i||(t?i.undone:i.done).eventCount==0)return!1;if(r){let o=SD(i,n,t);o&&r(e?o.scrollIntoView():o)}return!0}}var Op=cc(!1,!0),Rp=cc(!0,!0),m$=cc(!1,!1),g$=cc(!0,!1);var sv=Je.create({name:"history",addOptions(){return{depth:100,newGroupDelay:500}},addCommands(){return{undo:()=>({state:t,dispatch:e})=>Op(t,e),redo:()=>({state:t,dispatch:e})=>Rp(t,e)}},addProseMirrorPlugins(){return[ov(this.options)]},addKeyboardShortcuts(){return{"Mod-z":()=>this.editor.commands.undo(),"Shift-Mod-z":()=>this.editor.commands.redo(),"Mod-y":()=>this.editor.commands.redo(),"Mod-\u044F":()=>this.editor.commands.undo(),"Shift-Mod-\u044F":()=>this.editor.commands.redo()}}});var av=ae.create({name:"horizontalRule",addOptions(){return{HTMLAttributes:{}}},group:"block",parseHTML(){return[{tag:"hr"}]},renderHTML({HTMLAttributes:t}){return["hr",Z(this.options.HTMLAttributes,t)]},addCommands(){return{setHorizontalRule:()=>({chain:t,state:e})=>{let{$to:n}=e.selection,r=t();return n.parentOffset===0?r.insertContentAt(Math.max(n.pos-2,0),{type:this.name}):r.insertContent({type:this.name}),r.command(({tr:i,dispatch:o})=>{var s;if(o){let{$to:l}=i.selection,u=l.end();if(l.nodeAfter)l.nodeAfter.isTextblock?i.setSelection(ce.create(i.doc,l.pos+1)):l.nodeAfter.isBlock?i.setSelection(pe.create(i.doc,l.pos)):i.setSelection(ce.create(i.doc,l.pos));else{let d=(s=l.parent.type.contentMatch.defaultType)===null||s===void 0?void 0:s.create();d&&(i.insert(u,d),i.setSelection(ce.create(i.doc,u+1)))}i.scrollIntoView()}return!0}).run()}}},addInputRules(){return[oc({find:/^(?:---|—-|___\s|\*\*\*\s)$/,type:this.type})]}});var MD=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))$/,CD=/(?:^|\s)(\*(?!\s+\*)((?:[^*]+))\*(?!\s+\*))/g,kD=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))$/,AD=/(?:^|\s)(_(?!\s+_)((?:[^_]+))_(?!\s+_))/g,lv=tt.create({name:"italic",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"em"},{tag:"i",getAttrs:t=>t.style.fontStyle!=="normal"&&null},{style:"font-style=italic"}]},renderHTML({HTMLAttributes:t}){return["em",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setItalic:()=>({commands:t})=>t.setMark(this.name),toggleItalic:()=>({commands:t})=>t.toggleMark(this.name),unsetItalic:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-i":()=>this.editor.commands.toggleItalic(),"Mod-I":()=>this.editor.commands.toggleItalic()}},addInputRules(){return[Kn({find:MD,type:this.type}),Kn({find:kD,type:this.type})]},addPasteRules(){return[xn({find:CD,type:this.type}),xn({find:AD,type:this.type})]}});var Ip=ae.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",Z(this.options.HTMLAttributes,t),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}});var ND=ae.create({name:"listItem",addOptions(){return{HTMLAttributes:{},bulletListTypeName:"bulletList",orderedListTypeName:"orderedList"}},content:"paragraph block*",defining:!0,parseHTML(){return[{tag:"li"}]},renderHTML({HTMLAttributes:t}){return["li",Z(this.options.HTMLAttributes,t),0]},addKeyboardShortcuts(){return{Enter:()=>this.editor.commands.splitListItem(this.name),Tab:()=>this.editor.commands.sinkListItem(this.name),"Shift-Tab":()=>this.editor.commands.liftListItem(this.name)}}}),cv=tt.create({name:"textStyle",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"span",getAttrs:t=>t.hasAttribute("style")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["span",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{removeEmptyTextStyle:()=>({state:t,commands:e})=>{let n=gi(t,this.type);return Object.entries(n).some(([,i])=>!!i)?!0:e.unsetMark(this.name)}}}}),uv=/^(\d+)\.\s$/,dv=ae.create({name:"orderedList",addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{},keepMarks:!1,keepAttributes:!1}},group:"block list",content(){return`${this.options.itemTypeName}+`},addAttributes(){return{start:{default:1,parseHTML:t=>t.hasAttribute("start")?parseInt(t.getAttribute("start")||"",10):1}}},parseHTML(){return[{tag:"ol"}]},renderHTML({HTMLAttributes:t}){let{start:e,...n}=t;return e===1?["ol",Z(this.options.HTMLAttributes,n),0]:["ol",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleOrderedList:()=>({commands:t,chain:e})=>this.options.keepAttributes?e().toggleList(this.name,this.options.itemTypeName,this.options.keepMarks).updateAttributes(ND.name,this.editor.getAttributes(cv.name)).run():t.toggleList(this.name,this.options.itemTypeName,this.options.keepMarks)}},addKeyboardShortcuts(){return{"Mod-Shift-7":()=>this.editor.commands.toggleOrderedList()}},addInputRules(){let t=bi({find:uv,type:this.type,getAttributes:e=>({start:+e[1]}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1]});return(this.options.keepMarks||this.options.keepAttributes)&&(t=bi({find:uv,type:this.type,keepMarks:this.options.keepMarks,keepAttributes:this.options.keepAttributes,getAttributes:e=>({start:+e[1],...this.editor.getAttributes(cv.name)}),joinPredicate:(e,n)=>n.childCount+n.attrs.start===+e[1],editor:this.editor})),[t]}});var uc=ae.create({name:"paragraph",priority:1e3,addOptions(){return{HTMLAttributes:{}}},group:"block",content:"inline*",parseHTML(){return[{tag:"p"}]},renderHTML({HTMLAttributes:t}){return["p",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setParagraph:()=>({commands:t})=>t.setNode(this.name)}},addKeyboardShortcuts(){return{"Mod-Alt-0":()=>this.editor.commands.setParagraph()}}});var fv=Je.create({name:"placeholder",addOptions(){return{emptyEditorClass:"is-editor-empty",emptyNodeClass:"is-empty",placeholder:"Write something \u2026",showOnlyWhenEditable:!0,considerAnyAsEmpty:!1,showOnlyCurrent:!0,includeChildren:!1}},addProseMirrorPlugins(){return[new Pe({key:new qe("placeholder"),props:{decorations:({doc:t,selection:e})=>{var n;let r=this.editor.isEditable||!this.options.showOnlyWhenEditable,{anchor:i}=e,o=[];if(!r)return null;let{firstChild:s}=t.content,l=s&&s.type.isLeaf,u=s&&s.isAtom,d=this.options.considerAnyAsEmpty?!0:s&&s.type.name===((n=t.type.contentMatch.defaultType)===null||n===void 0?void 0:n.name),f=t.content.childCount<=1&&s&&d&&s.nodeSize<=2&&(!l||!u);return t.descendants((h,m)=>{let b=i>=m&&i<=m+h.nodeSize,y=!h.isLeaf&&!h.childCount;if((b||!this.options.showOnlyCurrent)&&y){let v=[this.options.emptyNodeClass];f&&v.push(this.options.emptyEditorClass);let x=Mt.node(m,m+h.nodeSize,{class:v.join(" "),"data-placeholder":typeof this.options.placeholder=="function"?this.options.placeholder({editor:this.editor,node:h,pos:m,hasAnchor:b}):this.options.placeholder});o.push(x)}return this.options.includeChildren}),lt.create(t,o)}}})]}});var OD=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))$/,RD=/(?:^|\s)(~~(?!\s+~~)((?:[^~]+))~~(?!\s+~~))/g,pv=tt.create({name:"strike",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"s"},{tag:"del"},{tag:"strike"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("line-through")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["s",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setStrike:()=>({commands:t})=>t.setMark(this.name),toggleStrike:()=>({commands:t})=>t.toggleMark(this.name),unsetStrike:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){let t={};return tc()?t["Mod-Shift-s"]=()=>this.editor.commands.toggleStrike():t["Ctrl-Shift-s"]=()=>this.editor.commands.toggleStrike(),t},addInputRules(){return[Kn({find:OD,type:this.type})]},addPasteRules(){return[xn({find:RD,type:this.type})]}});var hv=tt.create({name:"subscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sub"},{style:"vertical-align",getAttrs(t){return t!=="sub"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sub",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setSubscript:()=>({commands:t})=>t.setMark(this.name),toggleSubscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSubscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-,":()=>this.editor.commands.toggleSubscript()}}});var mv=tt.create({name:"superscript",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"sup"},{style:"vertical-align",getAttrs(t){return t!=="super"?!1:null}}]},renderHTML({HTMLAttributes:t}){return["sup",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setSuperscript:()=>({commands:t})=>t.setMark(this.name),toggleSuperscript:()=>({commands:t})=>t.toggleMark(this.name),unsetSuperscript:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-.":()=>this.editor.commands.toggleSuperscript()}}});var Dp,Pp;if(typeof WeakMap<"u"){let t=new WeakMap;Dp=e=>t.get(e),Pp=(e,n)=>(t.set(e,n),n)}else{let t=[],n=0;Dp=r=>{for(let i=0;i(n==10&&(n=0),t[n++]=r,t[n++]=i)}var bt=class{constructor(t,e,n,r){this.width=t,this.height=e,this.map=n,this.problems=r}findCell(t){for(let e=0;e=n){(o||(o=[])).push({type:"overlong_rowspan",pos:f,n:S-L});break}let T=i+L*e;for(let z=0;zr&&(o+=d.attrs.colspan)}}for(let s=0;s1&&(n=!0)}e==-1?e=o:e!=o&&(e=Math.max(e,o))}return e}function DD(t,e,n){t.problems||(t.problems=[]);let r={};for(let i=0;i0;e--)if(t.node(e).type.spec.tableRole=="row")return t.node(0).resolve(t.before(e+1));return null}function BD(t){for(let e=t.depth;e>0;e--){let n=t.node(e).type.spec.tableRole;if(n==="cell"||n==="header_cell")return t.node(e)}return null}function sr(t){let e=t.selection.$head;for(let n=e.depth;n>0;n--)if(e.node(n).type.spec.tableRole=="row")return!0;return!1}function gc(t){let e=t.selection;if("$anchorCell"in e&&e.$anchorCell)return e.$anchorCell.pos>e.$headCell.pos?e.$anchorCell:e.$headCell;if("node"in e&&e.node&&e.node.type.spec.tableRole=="cell")return e.$anchor;let n=Yo(e.$head)||FD(e.$head);if(n)return n;throw new RangeError(`No cell found around position ${e.head}`)}function FD(t){for(let e=t.nodeAfter,n=t.pos;e;e=e.firstChild,n++){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n)}for(let e=t.nodeBefore,n=t.pos;e;e=e.lastChild,n--){let r=e.type.spec.tableRole;if(r=="cell"||r=="header_cell")return t.doc.resolve(n-e.nodeSize)}}function Bp(t){return t.parent.type.spec.tableRole=="row"&&!!t.nodeAfter}function HD(t){return t.node(0).resolve(t.pos+t.nodeAfter.nodeSize)}function zp(t,e){return t.depth==e.depth&&t.pos>=e.start(-1)&&t.pos<=e.end(-1)}function Sv(t,e,n){let r=t.node(-1),i=bt.get(r),o=t.start(-1),s=i.nextCell(t.pos-o,e,n);return s==null?null:t.node(0).resolve(o+s)}function io(t,e,n=1){let r={...t,colspan:t.colspan-n};return r.colwidth&&(r.colwidth=r.colwidth.slice(),r.colwidth.splice(e,n),r.colwidth.some(i=>i>0)||(r.colwidth=null)),r}function Tv(t,e,n=1){let r={...t,colspan:t.colspan+n};if(r.colwidth){r.colwidth=r.colwidth.slice();for(let i=0;if!=n.pos-o);u.unshift(n.pos-o);let d=u.map(f=>{let h=r.nodeAt(f);if(!h)throw RangeError(`No cell with offset ${f} found`);let m=o+f+1;return new Ks(l.resolve(m),l.resolve(m+h.content.size))});super(d[0].$from,d[0].$to,d),this.$anchorCell=e,this.$headCell=n}map(e,n){let r=e.resolve(n.map(this.$anchorCell.pos)),i=e.resolve(n.map(this.$headCell.pos));if(Bp(r)&&Bp(i)&&zp(r,i)){let o=this.$anchorCell.node(-1)!=r.node(-1);return o&&this.isRowSelection()?Ur.rowSelection(r,i):o&&this.isColSelection()?Ur.colSelection(r,i):new Ur(r,i)}return ce.between(r,i)}content(){let e=this.$anchorCell.node(-1),n=bt.get(e),r=this.$anchorCell.start(-1),i=n.rectBetween(this.$anchorCell.pos-r,this.$headCell.pos-r),o={},s=[];for(let u=i.top;u0||x>0){let S=y.attrs;if(v>0&&(S=io(S,0,v)),x>0&&(S=io(S,S.colspan-x,x)),b.lefti.bottom){let S={...y.attrs,rowspan:Math.min(b.bottom,i.bottom)-Math.max(b.top,i.top)};b.top0)return!1;let r=e+this.$anchorCell.nodeAfter.attrs.rowspan,i=n+this.$headCell.nodeAfter.attrs.rowspan;return Math.max(r,i)==this.$headCell.node(-1).childCount}static colSelection(e,n=e){let r=e.node(-1),i=bt.get(r),o=e.start(-1),s=i.findCell(e.pos-o),l=i.findCell(n.pos-o),u=e.node(0);return s.top<=l.top?(s.top>0&&(e=u.resolve(o+i.map[s.left])),l.bottom0&&(n=u.resolve(o+i.map[l.left])),s.bottom0)return!1;let s=i+this.$anchorCell.nodeAfter.attrs.colspan,l=o+this.$headCell.nodeAfter.attrs.colspan;return Math.max(s,l)==n.width}eq(e){return e instanceof Ur&&e.$anchorCell.pos==this.$anchorCell.pos&&e.$headCell.pos==this.$headCell.pos}static rowSelection(e,n=e){let r=e.node(-1),i=bt.get(r),o=e.start(-1),s=i.findCell(e.pos-o),l=i.findCell(n.pos-o),u=e.node(0);return s.left<=l.left?(s.left>0&&(e=u.resolve(o+i.map[s.top*i.width])),l.right0&&(n=u.resolve(o+i.map[l.top*i.width])),s.right{e.push(Mt.node(r,r+n.nodeSize,{class:"selectedCell"}))}),lt.create(t.doc,e)}function WD({$from:t,$to:e}){if(t.pos==e.pos||t.pos=0&&!(t.after(i+1)=0&&!(e.before(o+1)>e.start(o));o--,r--);return n==r&&/row|table/.test(t.node(i).type.spec.tableRole)}function KD({$from:t,$to:e}){let n,r;for(let i=t.depth;i>0;i--){let o=t.node(i);if(o.type.spec.tableRole==="cell"||o.type.spec.tableRole==="header_cell"){n=o;break}}for(let i=e.depth;i>0;i--){let o=e.node(i);if(o.type.spec.tableRole==="cell"||o.type.spec.tableRole==="header_cell"){r=o;break}}return n!==r&&e.parentOffset===0}function VD(t,e,n){let r=(e||t).selection,i=(e||t).doc,o,s;if(r instanceof pe&&(s=r.node.type.spec.tableRole)){if(s=="cell"||s=="header_cell")o=rt.create(i,r.from);else if(s=="row"){let l=i.resolve(r.from+1);o=rt.rowSelection(l,l)}else if(!n){let l=bt.get(r.node),u=r.from+1,d=u+l.map[l.width*l.height-1];o=rt.create(i,u+1,d)}}else r instanceof ce&&WD(r)?o=ce.create(i,r.from):r instanceof ce&&KD(r)&&(o=ce.create(i,r.$from.start(),r.$from.end()));return o&&(e||(e=t.tr)).setSelection(o),e}var GD=new qe("fix-tables");function Cv(t,e,n,r){let i=t.childCount,o=e.childCount;e:for(let s=0,l=0;s{i.type.spec.tableRole=="table"&&(n=qD(t,i,o,n))};return e?e.doc!=t.doc&&Cv(e.doc,t.doc,0,r):t.doc.descendants(r),n}function qD(t,e,n,r){let i=bt.get(e);if(!i.problems)return r;r||(r=t.tr);let o=[];for(let u=0;u0){let b="cell";f.firstChild&&(b=f.firstChild.type.spec.tableRole);let y=[];for(let x=0;x0&&r>0||e.child(0).type.spec.tableRole=="table");)n--,r--,e=e.child(0).content;let i=e.child(0),o=i.type.spec.tableRole,s=i.type.schema,l=[];if(o=="row")for(let u=0;u=0;s--){let{rowspan:l,colspan:u}=o.child(s).attrs;for(let d=i;d=e.length&&e.push(K.empty),n[i]r&&(m=m.type.createChecked(io(m.attrs,m.attrs.colspan,f+m.attrs.colspan-r),m.content)),d.push(m),f+=m.attrs.colspan;for(let b=1;bi&&(h=h.type.create({...h.attrs,rowspan:Math.max(1,i-h.attrs.rowspan)},h.content)),u.push(h)}o.push(K.from(u))}n=o,e=i}return{width:t,height:e,rows:n}}function ZD(t,e,n,r,i,o,s){let l=t.doc.type.schema,u=sn(l),d,f;if(i>e.width)for(let h=0,m=0;he.height){let h=[];for(let y=0,v=(e.height-1)*e.width;y=e.width?!1:n.nodeAt(e.map[v+y]).type==u.header_cell;h.push(x?f||(f=u.header_cell.createAndFill()):d||(d=u.cell.createAndFill()))}let m=u.row.create(null,K.from(h)),b=[];for(let y=e.height;y{if(!i)return!1;let o=n.selection;if(o instanceof rt)return hc(n,r,fe.near(o.$headCell,e));if(t!="horiz"&&!o.empty)return!1;let s=kv(i,t,e);if(s==null)return!1;if(t=="horiz")return hc(n,r,fe.near(n.doc.resolve(o.head+e),e));{let l=n.doc.resolve(s),u=Sv(l,t,e),d;return u?d=fe.near(u,1):e<0?d=fe.near(n.doc.resolve(l.before(-1)),-1):d=fe.near(n.doc.resolve(l.after(-1)),1),hc(n,r,d)}}}function fc(t,e){return(n,r,i)=>{if(!i)return!1;let o=n.selection,s;if(o instanceof rt)s=o;else{let u=kv(i,t,e);if(u==null)return!1;s=new rt(n.doc.resolve(u))}let l=Sv(s.$headCell,t,e);return l?hc(n,r,new rt(s.$anchorCell,l)):!1}}function pc(t,e){let n=t.selection;if(!(n instanceof rt))return!1;if(e){let r=t.tr,i=sn(t.schema).cell.createAndFill().content;n.forEachCell((o,s)=>{o.content.eq(i)||r.replace(r.mapping.map(s+1),r.mapping.map(s+o.nodeSize-1),new X(i,0,0))}),r.docChanged&&e(r)}return!0}function QD(t,e){let n=t.state.doc,r=Yo(n.resolve(e));return r?(t.dispatch(t.state.tr.setSelection(new rt(r))),!0):!1}function eP(t,e,n){if(!sr(t.state))return!1;let r=YD(n),i=t.state.selection;if(i instanceof rt){r||(r={width:1,height:1,rows:[K.from(Fp(sn(t.state.schema).cell,n))]});let o=i.$anchorCell.node(-1),s=i.$anchorCell.start(-1),l=bt.get(o).rectBetween(i.$anchorCell.pos-s,i.$headCell.pos-s);return r=XD(r,l.right-l.left,l.bottom-l.top),yv(t.state,t.dispatch,s,l,r),!0}else if(r){let o=gc(t.state),s=o.start(-1);return yv(t.state,t.dispatch,s,bt.get(o.node(-1)).findCell(o.pos-s),r),!0}else return!1}function tP(t,e){var n;if(e.ctrlKey||e.metaKey)return;let r=Ev(t,e.target),i;if(e.shiftKey&&t.state.selection instanceof rt)o(t.state.selection.$anchorCell,e),e.preventDefault();else if(e.shiftKey&&r&&(i=Yo(t.state.selection.$anchor))!=null&&((n=Lp(t,e))==null?void 0:n.pos)!=i.pos)o(i,e),e.preventDefault();else if(!r)return;function o(u,d){let f=Lp(t,d),h=yi.getState(t.state)==null;if(!f||!zp(u,f))if(h)f=u;else return;let m=new rt(u,f);if(h||!t.state.selection.eq(m)){let b=t.state.tr.setSelection(m);h&&b.setMeta(yi,u.pos),t.dispatch(b)}}function s(){t.root.removeEventListener("mouseup",s),t.root.removeEventListener("dragstart",s),t.root.removeEventListener("mousemove",l),yi.getState(t.state)!=null&&t.dispatch(t.state.tr.setMeta(yi,-1))}function l(u){let d=u,f=yi.getState(t.state),h;if(f!=null)h=t.state.doc.resolve(f);else if(Ev(t,d.target)!=r&&(h=Lp(t,e),!h))return s();h&&o(h,d)}t.root.addEventListener("mouseup",s),t.root.addEventListener("dragstart",s),t.root.addEventListener("mousemove",l)}function kv(t,e,n){if(!(t.state.selection instanceof ce))return null;let{$head:r}=t.state.selection;for(let i=r.depth-1;i>=0;i--){let o=r.node(i);if((n<0?r.index(i):r.indexAfter(i))!=(n<0?0:o.childCount))return null;if(o.type.spec.tableRole=="cell"||o.type.spec.tableRole=="header_cell"){let l=r.before(i),u=e=="vert"?n>0?"down":"up":n>0?"right":"left";return t.endOfTextblock(u)?l:null}}return null}function Ev(t,e){for(;e&&e!=t.dom;e=e.parentNode)if(e.nodeName=="TD"||e.nodeName=="TH")return e;return null}function Lp(t,e){let n=t.posAtCoords({left:e.clientX,top:e.clientY});return n&&n?Yo(t.state.doc.resolve(n.pos)):null}var nP=class{constructor(t,e){this.node=t,this.cellMinWidth=e,this.dom=document.createElement("div"),this.dom.className="tableWrapper",this.table=this.dom.appendChild(document.createElement("table")),this.colgroup=this.table.appendChild(document.createElement("colgroup")),Hp(t,this.colgroup,this.table,e),this.contentDOM=this.table.appendChild(document.createElement("tbody"))}update(t){return t.type!=this.node.type?!1:(this.node=t,Hp(t,this.colgroup,this.table,this.cellMinWidth),!0)}ignoreMutation(t){return t.type=="attributes"&&(t.target==this.table||this.colgroup.contains(t.target))}};function Hp(t,e,n,r,i,o){var s;let l=0,u=!0,d=e.firstChild,f=t.firstChild;if(f){for(let h=0,m=0;hnew n(l,e,u),new rP(-1,!1)},apply(o,s){return s.apply(o)}},props:{attributes:o=>{let s=Vn.getState(o);return s&&s.activeHandle>-1?{class:"resize-cursor"}:{}},handleDOMEvents:{mousemove:(o,s)=>{iP(o,s,t,e,r)},mouseleave:o=>{oP(o)},mousedown:(o,s)=>{sP(o,s,e)}},decorations:o=>{let s=Vn.getState(o);if(s&&s.activeHandle>-1)return fP(o,s.activeHandle)},nodeViews:{}}});return i}var rP=class mc{constructor(e,n){this.activeHandle=e,this.dragging=n}apply(e){let n=this,r=e.getMeta(Vn);if(r&&r.setHandle!=null)return new mc(r.setHandle,!1);if(r&&r.setDragging!==void 0)return new mc(n.activeHandle,r.setDragging);if(n.activeHandle>-1&&e.docChanged){let i=e.mapping.map(n.activeHandle,-1);return Bp(e.doc.resolve(i))||(i=-1),new mc(i,n.dragging)}return n}};function iP(t,e,n,r,i){let o=Vn.getState(t.state);if(o&&!o.dragging){let s=lP(e.target),l=-1;if(s){let{left:u,right:d}=s.getBoundingClientRect();e.clientX-u<=n?l=vv(t,e,"left",n):d-e.clientX<=n&&(l=vv(t,e,"right",n))}if(l!=o.activeHandle){if(!i&&l!==-1){let u=t.state.doc.resolve(l),d=u.node(-1),f=bt.get(d),h=u.start(-1);if(f.colCount(u.pos-h)+u.nodeAfter.attrs.colspan-1==f.width-1)return}Nv(t,l)}}}function oP(t){let e=Vn.getState(t.state);e&&e.activeHandle>-1&&!e.dragging&&Nv(t,-1)}function sP(t,e,n){var r;let i=(r=t.dom.ownerDocument.defaultView)!=null?r:window,o=Vn.getState(t.state);if(!o||o.activeHandle==-1||o.dragging)return!1;let s=t.state.doc.nodeAt(o.activeHandle),l=aP(t,o.activeHandle,s.attrs);t.dispatch(t.state.tr.setMeta(Vn,{setDragging:{startX:e.clientX,startWidth:l}}));function u(f){i.removeEventListener("mouseup",u),i.removeEventListener("mousemove",d);let h=Vn.getState(t.state);h?.dragging&&(cP(t,h.activeHandle,wv(h.dragging,f,n)),t.dispatch(t.state.tr.setMeta(Vn,{setDragging:null})))}function d(f){if(!f.which)return u(f);let h=Vn.getState(t.state);if(h&&h.dragging){let m=wv(h.dragging,f,n);uP(t,h.activeHandle,m,n)}}return i.addEventListener("mouseup",u),i.addEventListener("mousemove",d),e.preventDefault(),!0}function aP(t,e,{colspan:n,colwidth:r}){let i=r&&r[r.length-1];if(i)return i;let o=t.domAtPos(e),l=o.node.childNodes[o.offset].offsetWidth,u=n;if(r)for(let d=0;d0?-1:0;zD(e,r,i+o)&&(o=i==0||i==e.width?null:0);for(let s=0;s0&&i0&&e.map[l-1]==u||i0?-1:0;hP(e,r,i+u)&&(u=i==0||i==e.height?null:0);for(let d=0,f=e.width*i;d0&&i0&&h==e.map[f-e.width]){let m=n.nodeAt(h).attrs;t.setNodeMarkup(t.mapping.slice(l).map(h+r),null,{...m,rowspan:m.rowspan-1}),d+=m.colspan-1}else if(i0&&n[o]==n[o-1]||r.right0&&n[i]==n[i-t]||r.bottomn[r.type.spec.tableRole])(t,e)}function bP(t){return(e,n)=>{var r;let i=e.selection,o,s;if(i instanceof rt){if(i.$anchorCell.pos!=i.$headCell.pos)return!1;o=i.$anchorCell.nodeAfter,s=i.$anchorCell.pos}else{if(o=BD(i.$from),!o)return!1;s=(r=Yo(i.$from))==null?void 0:r.pos}if(o==null||s==null||o.attrs.colspan==1&&o.attrs.rowspan==1)return!1;if(n){let l=o.attrs,u=[],d=l.colwidth;l.rowspan>1&&(l={...l,rowspan:1}),l.colspan>1&&(l={...l,colspan:1});let f=Er(e),h=e.tr;for(let b=0;b{s.attrs[t]!==e&&o.setNodeMarkup(l,null,{...s.attrs,[t]:e})}):o.setNodeMarkup(i.pos,null,{...i.nodeAfter.attrs,[t]:e}),r(o)}return!0}}function yP(t){return function(e,n){if(!sr(e))return!1;if(n){let r=sn(e.schema),i=Er(e),o=e.tr,s=i.map.cellsInRect(t=="column"?{left:i.left,top:0,right:i.right,bottom:i.map.height}:t=="row"?{left:0,top:i.top,right:i.map.width,bottom:i.bottom}:i),l=s.map(u=>i.table.nodeAt(u));for(let u=0;u{let y=b+o.tableStart,v=s.doc.nodeAt(y);v&&s.setNodeMarkup(y,m,v.attrs)}),r(s)}return!0}}var oU=Jo("row",{useDeprecatedLogic:!0}),sU=Jo("column",{useDeprecatedLogic:!0}),zv=Jo("cell",{useDeprecatedLogic:!0});function EP(t,e){if(e<0){let n=t.nodeBefore;if(n)return t.pos-n.nodeSize;for(let r=t.index(-1)-1,i=t.before();r>=0;r--){let o=t.node(-1).child(r),s=o.lastChild;if(s)return i-1-s.nodeSize;i-=o.nodeSize}}else{if(t.index()0;r--)if(n.node(r).type.spec.tableRole=="table")return e&&e(t.tr.delete(n.before(r),n.after(r)).scrollIntoView()),!0;return!1}function Uv({allowTableNodeSelection:t=!1}={}){return new Pe({key:yi,state:{init(){return null},apply(e,n){let r=e.getMeta(yi);if(r!=null)return r==-1?null:r;if(n==null||!e.docChanged)return n;let{deleted:i,pos:o}=e.mapping.mapResult(n);return i?null:o}},props:{decorations:UD,handleDOMEvents:{mousedown:tP},createSelectionBetween(e){return yi.getState(e.state)!=null?e.state.selection:null},handleTripleClick:QD,handleKeyDown:jD,handlePaste:eP},appendTransaction(e,n,r){return VD(r,$p(r,n),t)}})}function Wv(t,e,n,r,i,o){let s=0,l=!0,u=e.firstChild,d=t.firstChild;for(let f=0,h=0;f{let r=t.nodes[n];r.spec.tableRole&&(e[r.spec.tableRole]=r)}),t.cached.tableNodeTypes=e,e}function xP(t,e,n,r,i){let o=wP(t),s=[],l=[];for(let d=0;d{let{selection:e}=t.state;if(!_P(e))return!1;let n=0,r=Sp(e.ranges[0].$from,o=>o.type.name==="table");return r?.node.descendants(o=>{if(o.type.name==="table")return!1;["tableCell","tableHeader"].includes(o.type.name)&&(n+=1)}),n===e.ranges.length?(t.commands.deleteTable(),!0):!1},Vv=ae.create({name:"table",addOptions(){return{HTMLAttributes:{},resizable:!1,handleWidth:5,cellMinWidth:25,View:Vp,lastColumnResizable:!0,allowTableNodeSelection:!1}},content:"tableRow+",tableRole:"table",isolating:!0,group:"block",parseHTML(){return[{tag:"table"}]},renderHTML({node:t,HTMLAttributes:e}){let{colgroup:n,tableWidth:r,tableMinWidth:i}=vP(t,this.options.cellMinWidth);return["table",Z(this.options.HTMLAttributes,e,{style:r?`width: ${r}`:`minWidth: ${i}`}),n,["tbody",0]]},addCommands(){return{insertTable:({rows:t=3,cols:e=3,withHeaderRow:n=!0}={})=>({tr:r,dispatch:i,editor:o})=>{let s=xP(o.schema,t,e,n);if(i){let l=r.selection.anchor+1;r.replaceSelectionWith(s).scrollIntoView().setSelection(ce.near(r.doc.resolve(l)))}return!0},addColumnBefore:()=>({state:t,dispatch:e})=>Rv(t,e),addColumnAfter:()=>({state:t,dispatch:e})=>Iv(t,e),deleteColumn:()=>({state:t,dispatch:e})=>Lv(t,e),addRowBefore:()=>({state:t,dispatch:e})=>Pv(t,e),addRowAfter:()=>({state:t,dispatch:e})=>Bv(t,e),deleteRow:()=>({state:t,dispatch:e})=>Fv(t,e),deleteTable:()=>({state:t,dispatch:e})=>$v(t,e),mergeCells:()=>({state:t,dispatch:e})=>Up(t,e),splitCell:()=>({state:t,dispatch:e})=>Wp(t,e),toggleHeaderColumn:()=>({state:t,dispatch:e})=>Jo("column")(t,e),toggleHeaderRow:()=>({state:t,dispatch:e})=>Jo("row")(t,e),toggleHeaderCell:()=>({state:t,dispatch:e})=>zv(t,e),mergeOrSplit:()=>({state:t,dispatch:e})=>Up(t,e)?!0:Wp(t,e),setCellAttribute:(t,e)=>({state:n,dispatch:r})=>Hv(t,e)(n,r),goToNextCell:()=>({state:t,dispatch:e})=>Kp(1)(t,e),goToPreviousCell:()=>({state:t,dispatch:e})=>Kp(-1)(t,e),fixTables:()=>({state:t,dispatch:e})=>(e&&$p(t),!0),setCellSelection:t=>({tr:e,dispatch:n})=>{if(n){let r=rt.create(e.doc,t.anchorCell,t.headCell);e.setSelection(r)}return!0}}},addKeyboardShortcuts(){return{Tab:()=>this.editor.commands.goToNextCell()?!0:this.editor.can().addRowAfter()?this.editor.chain().addRowAfter().goToNextCell().run():!1,"Shift-Tab":()=>this.editor.commands.goToPreviousCell(),Backspace:bc,"Mod-Backspace":bc,Delete:bc,"Mod-Delete":bc}},addProseMirrorPlugins(){return[...this.options.resizable&&this.editor.isEditable?[Av({handleWidth:this.options.handleWidth,cellMinWidth:this.options.cellMinWidth,View:this.options.View,lastColumnResizable:this.options.lastColumnResizable})]:[],Uv({allowTableNodeSelection:this.options.allowTableNodeSelection})]},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{tableRole:Se(re(t,"tableRole",e))}}});var Gv=ae.create({name:"tableCell",addOptions(){return{HTMLAttributes:{}}},content:"block+",addAttributes(){return{colspan:{default:1},rowspan:{default:1},colwidth:{default:null,parseHTML:t=>{let e=t.getAttribute("colwidth");return e?[parseInt(e,10)]:null}}}},tableRole:"cell",isolating:!0,parseHTML(){return[{tag:"td"}]},renderHTML({HTMLAttributes:t}){return["td",Z(this.options.HTMLAttributes,t),0]}});var qv=ae.create({name:"tableHeader",addOptions(){return{HTMLAttributes:{}}},content:"block+",addAttributes(){return{colspan:{default:1},rowspan:{default:1},colwidth:{default:null,parseHTML:t=>{let e=t.getAttribute("colwidth");return e?[parseInt(e,10)]:null}}}},tableRole:"header_cell",isolating:!0,parseHTML(){return[{tag:"th"}]},renderHTML({HTMLAttributes:t}){return["th",Z(this.options.HTMLAttributes,t),0]}});var Yv=ae.create({name:"tableRow",addOptions(){return{HTMLAttributes:{}}},content:"(tableCell | tableHeader)*",tableRole:"row",parseHTML(){return[{tag:"tr"}]},renderHTML({HTMLAttributes:t}){return["tr",Z(this.options.HTMLAttributes,t),0]}});var Jv=ae.create({name:"text",group:"inline"});var Xv=tt.create({name:"underline",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"u"},{style:"text-decoration",consuming:!1,getAttrs:t=>t.includes("underline")?{}:!1}]},renderHTML({HTMLAttributes:t}){return["u",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setUnderline:()=>({commands:t})=>t.setMark(this.name),toggleUnderline:()=>({commands:t})=>t.toggleMark(this.name),unsetUnderline:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-u":()=>this.editor.commands.toggleUnderline(),"Mod-U":()=>this.editor.commands.toggleUnderline()}}});var SP=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))$/,TP=/(?:^|\s)(==(?!\s+==)((?:[^=]+))==(?!\s+==))/g,Zv=tt.create({name:"highlight",addOptions(){return{multicolor:!1,HTMLAttributes:{}}},addAttributes(){return this.options.multicolor?{color:{default:null,parseHTML:t=>t.getAttribute("data-color")||t.style.backgroundColor,renderHTML:t=>t.color?{"data-color":t.color,style:`background-color: ${t.color}; color: inherit`}:{}}}:{}},parseHTML(){return[{tag:"mark"}]},renderHTML({HTMLAttributes:t}){return["mark",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setHighlight:t=>({commands:e})=>e.setMark(this.name,t),toggleHighlight:t=>({commands:e})=>e.toggleMark(this.name,t),unsetHighlight:()=>({commands:t})=>t.unsetMark(this.name)}},addKeyboardShortcuts(){return{"Mod-Shift-h":()=>this.editor.commands.toggleHighlight()}},addInputRules(){return[Kn({find:SP,type:this.type})]},addPasteRules(){return[xn({find:TP,type:this.type})]}});var Gp=ae.create({name:"checkedList",priority:50,addOptions(){return{itemTypeName:"listItem",HTMLAttributes:{class:"checked-list"}}},group:"block list",content(){return`${this.options.itemTypeName}+`},parseHTML(){return[{tag:"ul",getAttrs:t=>t.classList.contains("checked-list"),priority:1e3}]},renderHTML({HTMLAttributes:t}){return["ul",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{toggleCheckedList:()=>({commands:t})=>t.toggleList(this.name,this.options.itemTypeName)}}});var qp=ae.create({name:"lead",group:"block",content:"block+",addOptions(){return{HTMLAttributes:{class:"lead"}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("lead")}]},renderHTML({node:t,HTMLAttributes:e}){return["div",Z(this.options.HTMLAttributes,e),0]},addCommands(){return{toggleLead:()=>({commands:t})=>t.toggleWrap(this.name)}}});var MP="aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4vianca6w0s2x0a2z0ure5ba0by2idu3namex3narepublic11d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2ntley5rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0cast4mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dabur3d1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0ardian6cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6logistics9properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3ncaster6d0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2psy3ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2tura4vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9dnavy5lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0america6xi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0a1b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp2w2ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5m\xF6gensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4finity6ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2",CP="\u03B5\u03BB1\u03C52\u0431\u04331\u0435\u043B3\u0434\u0435\u0442\u04384\u0435\u044E2\u043A\u0430\u0442\u043E\u043B\u0438\u043A6\u043E\u043C3\u043C\u043A\u04342\u043E\u043D1\u0441\u043A\u0432\u04306\u043E\u043D\u043B\u0430\u0439\u043D5\u0440\u04333\u0440\u0443\u04412\u04442\u0441\u0430\u0439\u04423\u0440\u04313\u0443\u043A\u04403\u049B\u0430\u04373\u0570\u0561\u05753\u05D9\u05E9\u05E8\u05D0\u05DC5\u05E7\u05D5\u05DD3\u0627\u0628\u0648\u0638\u0628\u064A5\u0631\u0627\u0645\u0643\u06485\u0644\u0627\u0631\u062F\u06464\u0628\u062D\u0631\u064A\u06465\u062C\u0632\u0627\u0626\u06315\u0633\u0639\u0648\u062F\u064A\u06296\u0639\u0644\u064A\u0627\u06465\u0645\u063A\u0631\u06285\u0645\u0627\u0631\u0627\u062A5\u06CC\u0631\u0627\u06465\u0628\u0627\u0631\u062A2\u0632\u0627\u06314\u064A\u062A\u06433\u06BE\u0627\u0631\u062A5\u062A\u0648\u0646\u06334\u0633\u0648\u062F\u0627\u06463\u0631\u064A\u06295\u0634\u0628\u0643\u06294\u0639\u0631\u0627\u06422\u06282\u0645\u0627\u06464\u0641\u0644\u0633\u0637\u064A\u06466\u0642\u0637\u06313\u0643\u0627\u062B\u0648\u0644\u064A\u06436\u0648\u06453\u0645\u0635\u06312\u0644\u064A\u0633\u064A\u06275\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u06277\u0642\u06394\u0647\u0645\u0631\u0627\u06475\u067E\u0627\u06A9\u0633\u062A\u0627\u06467\u0680\u0627\u0631\u062A4\u0915\u0949\u092E3\u0928\u0947\u091F3\u092D\u093E\u0930\u09240\u092E\u094D3\u094B\u09245\u0938\u0902\u0917\u0920\u09285\u09AC\u09BE\u0982\u09B2\u09BE5\u09AD\u09BE\u09B0\u09A42\u09F0\u09A44\u0A2D\u0A3E\u0A30\u0A244\u0AAD\u0ABE\u0AB0\u0AA44\u0B2D\u0B3E\u0B30\u0B244\u0B87\u0BA8\u0BCD\u0BA4\u0BBF\u0BAF\u0BBE6\u0BB2\u0B99\u0BCD\u0B95\u0BC86\u0B9A\u0BBF\u0B99\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0BC2\u0BB0\u0BCD11\u0C2D\u0C3E\u0C30\u0C24\u0C4D5\u0CAD\u0CBE\u0CB0\u0CA44\u0D2D\u0D3E\u0D30\u0D24\u0D025\u0DBD\u0D82\u0D9A\u0DCF4\u0E04\u0E2D\u0E213\u0E44\u0E17\u0E223\u0EA5\u0EB2\u0EA73\u10D2\u10D42\u307F\u3093\u306A3\u30A2\u30DE\u30BE\u30F34\u30AF\u30E9\u30A6\u30C94\u30B0\u30FC\u30B0\u30EB4\u30B3\u30E02\u30B9\u30C8\u30A23\u30BB\u30FC\u30EB3\u30D5\u30A1\u30C3\u30B7\u30E7\u30F36\u30DD\u30A4\u30F3\u30C84\u4E16\u754C2\u4E2D\u4FE11\u56FD1\u570B1\u6587\u7F513\u4E9A\u9A6C\u900A3\u4F01\u4E1A2\u4F5B\u5C712\u4FE1\u606F2\u5065\u5EB72\u516B\u53662\u516C\u53F81\u76CA2\u53F0\u6E7E1\u70632\u5546\u57CE1\u5E971\u68072\u5609\u91CC0\u5927\u9152\u5E975\u5728\u7EBF2\u5927\u62FF2\u5929\u4E3B\u65593\u5A31\u4E502\u5BB6\u96FB2\u5E7F\u4E1C2\u5FAE\u535A2\u6148\u55842\u6211\u7231\u4F603\u624B\u673A2\u62DB\u80582\u653F\u52A11\u5E9C2\u65B0\u52A0\u57612\u95FB2\u65F6\u5C1A2\u66F8\u7C4D2\u673A\u67842\u6DE1\u9A6C\u95213\u6E38\u620F2\u6FB3\u95802\u70B9\u770B2\u79FB\u52A82\u7EC4\u7EC7\u673A\u67844\u7F51\u57401\u5E971\u7AD91\u7EDC2\u8054\u901A2\u8C37\u6B4C2\u8D2D\u72692\u901A\u8CA92\u96C6\u56E22\u96FB\u8A0A\u76C8\u79D14\u98DE\u5229\u6D663\u98DF\u54C12\u9910\u53852\u9999\u683C\u91CC\u62C93\u6E2F2\uB2F7\uB1371\uCEF42\uC0BC\uC1312\uD55C\uAD6D2",jo=(t,e)=>{for(let n in e)t[n]=e[n];return t},jp="numeric",Qp="ascii",eh="alpha",xc="asciinumeric",yc="alphanumeric",th="domain",sw="emoji",kP="scheme",AP="slashscheme",jv="whitespace";function NP(t,e){return t in e||(e[t]=[]),e[t]}function oo(t,e,n){e[jp]&&(e[xc]=!0,e[yc]=!0),e[Qp]&&(e[xc]=!0,e[eh]=!0),e[xc]&&(e[yc]=!0),e[eh]&&(e[yc]=!0),e[yc]&&(e[th]=!0),e[sw]&&(e[th]=!0);for(let r in e){let i=NP(r,n);i.indexOf(t)<0&&i.push(t)}}function OP(t,e){let n={};for(let r in e)e[r].indexOf(t)>=0&&(n[r]=!0);return n}function _n(t){t===void 0&&(t=null),this.j={},this.jr=[],this.jd=null,this.t=t}_n.groups={};_n.prototype={accepts(){return!!this.t},go(t){let e=this,n=e.j[t];if(n)return n;for(let r=0;rt.ta(e,n,r,i),Gn=(t,e,n,r,i)=>t.tr(e,n,r,i),Qv=(t,e,n,r,i)=>t.ts(e,n,r,i),j=(t,e,n,r,i)=>t.tt(e,n,r,i),Wr="WORD",nh="UWORD",sa="LOCALHOST",rh="TLD",ih="UTLD",_c="SCHEME",Zo="SLASH_SCHEME",oh="NUM",aw="WS",sh="NL",ra="OPENBRACE",ia="CLOSEBRACE",Sc="OPENBRACKET",Tc="CLOSEBRACKET",Mc="OPENPAREN",Cc="CLOSEPAREN",kc="OPENANGLEBRACKET",Ac="CLOSEANGLEBRACKET",Nc="FULLWIDTHLEFTPAREN",Oc="FULLWIDTHRIGHTPAREN",Rc="LEFTCORNERBRACKET",Ic="RIGHTCORNERBRACKET",Lc="LEFTWHITECORNERBRACKET",Dc="RIGHTWHITECORNERBRACKET",Pc="FULLWIDTHLESSTHAN",Bc="FULLWIDTHGREATERTHAN",Fc="AMPERSAND",Hc="APOSTROPHE",zc="ASTERISK",vi="AT",$c="BACKSLASH",Uc="BACKTICK",Wc="CARET",wi="COLON",ah="COMMA",Kc="DOLLAR",vr="DOT",Vc="EQUALS",lh="EXCLAMATION",wr="HYPHEN",Gc="PERCENT",qc="PIPE",Yc="PLUS",Jc="POUND",Xc="QUERY",ch="QUOTE",uh="SEMI",xr="SLASH",oa="TILDE",Zc="UNDERSCORE",lw="EMOJI",jc="SYM",cw=Object.freeze({__proto__:null,WORD:Wr,UWORD:nh,LOCALHOST:sa,TLD:rh,UTLD:ih,SCHEME:_c,SLASH_SCHEME:Zo,NUM:oh,WS:aw,NL:sh,OPENBRACE:ra,CLOSEBRACE:ia,OPENBRACKET:Sc,CLOSEBRACKET:Tc,OPENPAREN:Mc,CLOSEPAREN:Cc,OPENANGLEBRACKET:kc,CLOSEANGLEBRACKET:Ac,FULLWIDTHLEFTPAREN:Nc,FULLWIDTHRIGHTPAREN:Oc,LEFTCORNERBRACKET:Rc,RIGHTCORNERBRACKET:Ic,LEFTWHITECORNERBRACKET:Lc,RIGHTWHITECORNERBRACKET:Dc,FULLWIDTHLESSTHAN:Pc,FULLWIDTHGREATERTHAN:Bc,AMPERSAND:Fc,APOSTROPHE:Hc,ASTERISK:zc,AT:vi,BACKSLASH:$c,BACKTICK:Uc,CARET:Wc,COLON:wi,COMMA:ah,DOLLAR:Kc,DOT:vr,EQUALS:Vc,EXCLAMATION:lh,HYPHEN:wr,PERCENT:Gc,PIPE:qc,PLUS:Yc,POUND:Jc,QUERY:Xc,QUOTE:ch,SEMI:uh,SLASH:xr,TILDE:oa,UNDERSCORE:Zc,EMOJI:lw,SYM:jc}),Xo=/[a-z]/,Yp=/\p{L}/u,Jp=/\p{Emoji}/u;var Xp=/\d/,ew=/\s/;var tw=` +`,RP="\uFE0F",IP="\u200D",Ec=null,vc=null;function LP(t){t===void 0&&(t=[]);let e={};_n.groups=e;let n=new _n;Ec==null&&(Ec=nw(MP)),vc==null&&(vc=nw(CP)),j(n,"'",Hc),j(n,"{",ra),j(n,"}",ia),j(n,"[",Sc),j(n,"]",Tc),j(n,"(",Mc),j(n,")",Cc),j(n,"<",kc),j(n,">",Ac),j(n,"\uFF08",Nc),j(n,"\uFF09",Oc),j(n,"\u300C",Rc),j(n,"\u300D",Ic),j(n,"\u300E",Lc),j(n,"\u300F",Dc),j(n,"\uFF1C",Pc),j(n,"\uFF1E",Bc),j(n,"&",Fc),j(n,"*",zc),j(n,"@",vi),j(n,"`",Uc),j(n,"^",Wc),j(n,":",wi),j(n,",",ah),j(n,"$",Kc),j(n,".",vr),j(n,"=",Vc),j(n,"!",lh),j(n,"-",wr),j(n,"%",Gc),j(n,"|",qc),j(n,"+",Yc),j(n,"#",Jc),j(n,"?",Xc),j(n,'"',ch),j(n,"/",xr),j(n,";",uh),j(n,"~",oa),j(n,"_",Zc),j(n,"\\",$c);let r=Gn(n,Xp,oh,{[jp]:!0});Gn(r,Xp,r);let i=Gn(n,Xo,Wr,{[Qp]:!0});Gn(i,Xo,i);let o=Gn(n,Yp,nh,{[eh]:!0});Gn(o,Xo),Gn(o,Yp,o);let s=Gn(n,ew,aw,{[jv]:!0});j(n,tw,sh,{[jv]:!0}),j(s,tw),Gn(s,ew,s);let l=Gn(n,Jp,lw,{[sw]:!0});Gn(l,Jp,l),j(l,RP,l);let u=j(l,IP);Gn(u,Jp,l);let d=[[Xo,i]],f=[[Xo,null],[Yp,o]];for(let h=0;hh[0]>m[0]?1:-1);for(let h=0;h=0?y[th]=!0:Xo.test(m)?Xp.test(m)?y[xc]=!0:y[Qp]=!0:y[jp]=!0,Qv(n,m,m,y)}return Qv(n,"localhost",sa,{ascii:!0}),n.jd=new _n(jc),{start:n,tokens:jo({groups:e},cw)}}function DP(t,e){let n=PP(e.replace(/[A-Z]/g,l=>l.toLowerCase())),r=n.length,i=[],o=0,s=0;for(;s=0&&(h+=n[s].length,m++),d+=n[s].length,o+=n[s].length,s++;o-=h,s-=m,d-=h,i.push({t:f.t,v:e.slice(o-d,o),s:o-d,e:o})}return i}function PP(t){let e=[],n=t.length,r=0;for(;r56319||r+1===n||(o=t.charCodeAt(r+1))<56320||o>57343?t[r]:t.slice(r,r+2);e.push(s),r+=s.length}return e}function Ei(t,e,n,r,i){let o,s=e.length;for(let l=0;l=0;)o++;if(o>0){e.push(n.join(""));for(let s=parseInt(t.substring(r,r+o),10);s>0;s--)n.pop();r+=o}else n.push(t[r]),r++}return e}var aa={defaultProtocol:"http",events:null,format:rw,formatHref:rw,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function dh(t,e){e===void 0&&(e=null);let n=jo({},aa);t&&(n=jo(n,t instanceof dh?t.o:t));let r=n.ignoreTags,i=[];for(let o=0;on?r.substring(0,n)+"\u2026":r},toFormattedHref(t){return t.get("formatHref",this.toHref(t.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(t){return t===void 0&&(t=aa.defaultProtocol),{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(t),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(t){return{type:this.t,value:this.toFormattedString(t),isLink:this.isLink,href:this.toFormattedHref(t),start:this.startIndex(),end:this.endIndex()}},validate(t){return t.get("validate",this.toString(),this)},render(t){let e=this,n=this.toHref(t.get("defaultProtocol")),r=t.get("formatHref",n,this),i=t.get("tagName",n,e),o=this.toFormattedString(t),s={},l=t.get("className",n,e),u=t.get("target",n,e),d=t.get("rel",n,e),f=t.getObj("attributes",n,e),h=t.getObj("events",n,e);return s.href=r,l&&(s.class=l),u&&(s.target=u),d&&(s.rel=d),f&&jo(s,f),{tagName:i,attributes:s,content:o,eventListeners:h}}};function Qc(t,e){class n extends uw{constructor(i,o){super(i,o),this.t=t}}for(let r in e)n.prototype[r]=e[r];return n.t=t,n}var iw=Qc("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),ow=Qc("text"),BP=Qc("nl"),wc=Qc("url",{isLink:!0,toHref(t){return t===void 0&&(t=aa.defaultProtocol),this.hasProtocol()?this.v:`${t}://${this.v}`},hasProtocol(){let t=this.tk;return t.length>=2&&t[0].t!==sa&&t[1].t===wi}});var qn=t=>new _n(t);function FP(t){let{groups:e}=t,n=e.domain.concat([Fc,zc,vi,$c,Uc,Wc,Kc,Vc,wr,oh,Gc,qc,Yc,Jc,xr,jc,oa,Zc]),r=[Hc,wi,ah,vr,lh,Xc,ch,uh,kc,Ac,ra,ia,Tc,Sc,Mc,Cc,Nc,Oc,Rc,Ic,Lc,Dc,Pc,Bc],i=[Fc,Hc,zc,$c,Uc,Wc,Kc,Vc,wr,ra,ia,Gc,qc,Yc,Jc,Xc,xr,jc,oa,Zc],o=qn(),s=j(o,oa);Be(s,i,s),Be(s,e.domain,s);let l=qn(),u=qn(),d=qn();Be(o,e.domain,l),Be(o,e.scheme,u),Be(o,e.slashscheme,d),Be(l,i,s),Be(l,e.domain,l);let f=j(l,vi);j(s,vi,f),j(u,vi,f),j(d,vi,f);let h=j(s,vr);Be(h,i,s),Be(h,e.domain,s);let m=qn();Be(f,e.domain,m),Be(m,e.domain,m);let b=j(m,vr);Be(b,e.domain,m);let y=qn(iw);Be(b,e.tld,y),Be(b,e.utld,y),j(f,sa,y);let v=j(m,wr);Be(v,e.domain,m),Be(y,e.domain,m),j(y,vr,b),j(y,wr,v);let x=j(y,wi);Be(x,e.numeric,iw);let S=j(l,wr),D=j(l,vr);Be(S,e.domain,l),Be(D,i,s),Be(D,e.domain,l);let L=qn(wc);Be(D,e.tld,L),Be(D,e.utld,L),Be(L,e.domain,l),Be(L,i,s),j(L,vr,D),j(L,wr,S),j(L,vi,f);let T=j(L,wi),z=qn(wc);Be(T,e.numeric,z);let O=qn(wc),Y=qn();Be(O,n,O),Be(O,r,Y),Be(Y,n,O),Be(Y,r,Y),j(L,xr,O),j(z,xr,O);let ie=j(u,wi),$=j(d,wi),oe=j($,xr),me=j(oe,xr);Be(u,e.domain,l),j(u,vr,D),j(u,wr,S),Be(d,e.domain,l),j(d,vr,D),j(d,wr,S),Be(ie,e.domain,O),j(ie,xr,O),Be(me,e.domain,O),Be(me,n,O),j(me,xr,O);let Te=[[ra,ia],[Sc,Tc],[Mc,Cc],[kc,Ac],[Nc,Oc],[Rc,Ic],[Lc,Dc],[Pc,Bc]];for(let ge=0;ge=0&&m++,i++,f++;if(m<0)i-=f,i0&&(o.push(Zp(ow,e,s)),s=[]),i-=m,f-=m;let b=h.t,y=n.slice(i-f,i);o.push(Zp(b,e,y))}}return s.length>0&&o.push(Zp(ow,e,s)),o}function Zp(t,e,n){let r=n[0].s,i=n[n.length-1].e,o=e.slice(r,i);return new t(o,n)}var zP=typeof console<"u"&&console&&console.warn||(()=>{}),$P="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",ht={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function dw(){_n.groups={},ht.scanner=null,ht.parser=null,ht.tokenQueue=[],ht.pluginQueue=[],ht.customSchemes=[],ht.initialized=!1}function fh(t,e){if(e===void 0&&(e=!1),ht.initialized&&zP(`linkifyjs: already initialized - will not register custom scheme "${t}" ${$P}`),!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(t))throw new Error(`linkifyjs: incorrect scheme format. +1. Must only contain digits, lowercase ASCII letters or "-" +2. Cannot start or end with "-" +3. "-" cannot repeat`);ht.customSchemes.push([t,e])}function UP(){ht.scanner=LP(ht.customSchemes);for(let t=0;t{let i=e.some(d=>d.docChanged)&&!n.doc.eq(r.doc),o=e.some(d=>d.getMeta("preventAutolink"));if(!i||o)return;let{tr:s}=r,l=PE(n.doc,[...e]);if(FE(l).forEach(({newRange:d})=>{let f=BE(r.doc,d,b=>b.isTextblock),h,m;if(f.length>1?(h=f[0],m=r.doc.textBetween(h.pos,h.pos+h.node.nodeSize,void 0," ")):f.length&&r.doc.textBetween(d.from,d.to," "," ").endsWith(" ")&&(h=f[0],m=r.doc.textBetween(h.pos,d.to,void 0," ")),h&&m){let b=m.split(" ").filter(S=>S!=="");if(b.length<=0)return!1;let y=b[b.length-1],v=h.pos+m.lastIndexOf(y);if(!y)return!1;let x=ph(y).map(S=>S.toObject());if(!WP(x))return!1;x.filter(S=>S.isLink).map(S=>({...S,from:v+S.start+1,to:v+S.end+1})).filter(S=>r.schema.marks.code?!r.doc.rangeHasMark(S.from,S.to,r.schema.marks.code):!0).filter(S=>t.validate?t.validate(S.value):!0).forEach(S=>{rc(S.from,S.to,r.doc).some(D=>D.mark.type===t.type)||s.addMark(S.from,S.to,t.type.create({href:S.href}))})}}),!!s.steps.length)return s}})}function VP(t){return new Pe({key:new qe("handleClickLink"),props:{handleClick:(e,n,r)=>{var i,o;if(r.button!==0)return!1;let s=r.target,l=[];for(;s.nodeName!=="DIV";)l.push(s),s=s.parentNode;if(!l.find(m=>m.nodeName==="A"))return!1;let u=Tp(e.state,t.type.name),d=r.target,f=(i=d?.href)!==null&&i!==void 0?i:u.href,h=(o=d?.target)!==null&&o!==void 0?o:u.target;return d&&f?(window.open(f,h),!0):!1}}})}function GP(t){return new Pe({key:new qe("handlePasteLink"),props:{handlePaste:(e,n,r)=>{let{state:i}=e,{selection:o}=i,{empty:s}=o;if(s)return!1;let l="";r.content.forEach(d=>{l+=d.textContent});let u=hh(l).find(d=>d.isLink&&d.value===l);return!l||!u?!1:(t.editor.commands.setMark(t.type,{href:u.href}),!0)}}})}var fw=tt.create({name:"link",priority:1e3,keepOnSplit:!1,onCreate(){this.options.protocols.forEach(t=>{if(typeof t=="string"){fh(t);return}fh(t.scheme,t.optionalSlashes)})},onDestroy(){dw()},inclusive(){return this.options.autolink},addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],HTMLAttributes:{target:"_blank",rel:"noopener noreferrer nofollow",class:null},validate:void 0}},addAttributes(){return{href:{default:null},target:{default:this.options.HTMLAttributes.target},rel:{default:this.options.HTMLAttributes.rel},class:{default:this.options.HTMLAttributes.class}}},parseHTML(){return[{tag:'a[href]:not([href *= "javascript:" i])'}]},renderHTML({HTMLAttributes:t}){var e;return!((e=t.href)===null||e===void 0)&&e.startsWith("javascript:")?["a",Z(this.options.HTMLAttributes,{...t,href:""}),0]:["a",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setLink:t=>({chain:e})=>e().setMark(this.name,t).setMeta("preventAutolink",!0).run(),toggleLink:t=>({chain:e})=>e().toggleMark(this.name,t,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run(),unsetLink:()=>({chain:t})=>t().unsetMark(this.name,{extendEmptyMarkRange:!0}).setMeta("preventAutolink",!0).run()}},addPasteRules(){return[xn({find:t=>{let e=[];if(t){let n=hh(t).filter(r=>r.isLink);n.length&&n.forEach(r=>e.push({text:r.value,data:{href:r.href},index:r.start}))}return e},type:this.type,getAttributes:t=>{var e;return{href:(e=t.data)===null||e===void 0?void 0:e.href}}})]},addProseMirrorPlugins(){let t=[];return this.options.autolink&&t.push(KP({type:this.type,validate:this.options.validate})),this.options.openOnClick&&t.push(VP({type:this.type})),this.options.linkOnPaste&&t.push(GP({editor:this.editor,type:this.type})),t}});var mh=fw.extend({addOptions(){return{openOnClick:!0,linkOnPaste:!0,autolink:!0,protocols:[],HTMLAttributes:{},validate:void 0}},addAttributes(){return{href:{default:null},id:{default:null},target:{default:this.options.HTMLAttributes.target},hreflang:{default:null},rel:{default:null},referrerpolicy:{default:null},class:{default:null},as_button:{default:null,parseHTML:t=>t.getAttribute("data-as-button"),renderHTML:t=>({"data-as-button":t.as_button})},button_theme:{default:null,parseHTML:t=>t.getAttribute("data-as-button-theme"),renderHTML:t=>({"data-as-button-theme":t.button_theme})}}}});var qP=/(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/,pw=ae.create({name:"image",addOptions(){return{inline:!1,allowBase64:!1,HTMLAttributes:{}}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},draggable:!0,addAttributes(){return{src:{default:null},alt:{default:null},title:{default:null}}},parseHTML(){return[{tag:this.options.allowBase64?"img[src]":'img[src]:not([src^="data:"])'}]},renderHTML({HTMLAttributes:t}){return["img",Z(this.options.HTMLAttributes,t)]},addCommands(){return{setImage:t=>({commands:e})=>e.insertContent({type:this.name,attrs:t})}},addInputRules(){return[oc({find:qP,type:this.type,getAttributes:t=>{let[,,e,n,r]=t;return{src:n,alt:e,title:r}}})]}});var gh=pw.extend({addAttributes(){return{src:{default:null},alt:{default:null},title:{default:null},width:{default:null},height:{default:null},lazy:{default:null,parseHTML:t=>t.getAttribute("loading")==="lazy"?t.getAttribute("data-lazy"):null,renderHTML:t=>{if(t.lazy)return{"data-lazy":t.lazy,loading:"lazy"}}}}}});var YP=uc.extend({addAttributes(){return{class:{default:null}}}});var bh=tt.create({name:"small",addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"small"}]},renderHTML({HTMLAttributes:t}){return["small",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{setSmall:()=>({commands:t})=>t.setMark(this.name),toggleSmall:()=>({commands:t})=>t.toggleMark(this.name),unsetSmall:()=>({commands:t})=>t.unsetMark(this.name)}}});function hw(t,e=null){return e?t.createChecked(null,e):t.createAndFill()}function mw(t){if(t.cached.gridNodeTypes)return t.cached.gridNodeTypes;let e={};return Object.keys(t.nodes).forEach(n=>{let r=t.nodes[n];r.spec.gridRole&&(e[r.spec.gridRole]=r)}),t.cached.gridNodeTypes=e,e}function gw(t,e,n,r){let i=mw(t),o=[];for(let s=0;st.getAttribute("type")},cols:{default:2,parseHTML:t=>t.getAttribute("cols")}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid")&&null}]},renderHTML({HTMLAttributes:t}){return["div",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{insertGrid:({cols:t=3,type:e="responsive"}={})=>({tr:n,dispatch:r,editor:i})=>{let o=gw(i.schema,t,e);if(r){let s=n.selection.anchor+1;n.replaceSelectionWith(o).scrollIntoView().setSelection(ce.near(n.doc.resolve(s)))}return!0}}},addKeyboardShortcuts(){return{"Mod-Alt-G":()=>this.editor.commands.insertGrid()}},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{gridRole:Se(re(t,"gridRole",e))}}});var Eh=ae.create({name:"gridColumn",content:"block+",gridRole:"column",isolating:!0,addOptions(){return{HTMLAttributes:{class:"filament-tiptap-grid__column"}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid__column")&&null}]},renderHTML({HTMLAttributes:t}){return["div",Z(this.options.HTMLAttributes,t),0]}});var yw=t=>t.match(/(youtube\.com|youtu\.be)(.+)?$/),bw=(t=!1)=>t?"https://www.youtube-nocookie.com/embed/":"https://www.youtube.com/embed/",vh=t=>{let{url:e,controls:n,nocookie:r,startAt:i}=t;if(e.includes("/embed/"))return e;if(e.includes("youtu.be")){let d=e.split("/").pop();return d?`${bw(r)}${d}`:null}let s=/v=([-\w]+)/gm.exec(e);if(!s||!s[1])return null;let l=`${bw(r)}${s[1]}`,u=[];return n?u.push("controls=1"):u.push("controls=0"),i&&u.push(`start=${i}`),u.length&&(l+=`?${u.join("&")}`),l};var wh=ae.create({name:"youtube",selectable:!0,draggable:!0,atom:!0,addOptions(){return{inline:!1,HTMLAttributes:{},width:640,height:480}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},addAttributes(){return{style:{default:null,parseHTML:t=>t.getAttribute("style")},src:{default:null},width:{default:this.options.width,parseHTML:t=>t.getAttribute("width")},height:{default:this.options.height,parseHTML:t=>t.getAttribute("height")},responsive:{default:!0,parseHTML:t=>t.classList.contains("responsive")??!1},start:{default:0},controls:{default:!0},nocookie:{default:!1},"data-aspect-width":{default:null,parseHTML:t=>t.getAttribute("data-aspect-width")},"data-aspect-height":{default:null,parseHTML:t=>t.getAttribute("data-aspect-height")}}},parseHTML(){return[{tag:"div[data-youtube-video] iframe"}]},addCommands(){return{setYoutubeVideo:t=>({commands:e})=>{if(!yw(t.src))return!1;let n=vh({url:t.src,controls:t.controls,nocookie:t.nocookie,startAt:t.start||0});return e.insertContent({type:this.name,attrs:{...t,src:n}})}}},renderHTML({HTMLAttributes:t}){let e=vh({url:t.src,controls:t.controls,nocookie:t.nocookie,startAt:t.start||0});return["div",{"data-youtube-video":"",class:t.responsive?"responsive":null},["iframe",{src:e,width:t.width,height:t.height,allowfullscreen:this.options.allowFullscreen,style:t.responsive?`aspect-ratio: ${t["data-aspect-width"]} / ${t["data-aspect-height"]}; width: 100%; height: auto;`:null,"data-aspect-width":t.responsive?t["data-aspect-width"]:null,"data-aspect-height":t.responsive?t["data-aspect-height"]:null}]]}});var Ew=t=>t.match(/(vimeo\.com)(.+)?$/),xh=t=>{let{url:e,autoplay:n,loop:r,title:i,byline:o,portrait:s}=t;if(e.includes("/video/"))return e;let u=/\.com\/([0-9]+)/gm.exec(e);if(!u||!u[1])return null;let d=`https://player.vimeo.com/video/${u[1]}`,f=[`autoplay=${n}`,`loop=${r}`,`title=${i}`,`byline=${o}`,`portrait=${s}`];return d+=`?${f.join("&")}`,d};var _h=ae.create({name:"vimeo",selectable:!0,draggable:!0,atom:!0,addOptions(){return{inline:!1,HTMLAttributes:{},allowFullscreen:!0,width:640,height:480}},inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},addAttributes(){return{style:{default:null,parseHTML:t=>t.getAttribute("style")},src:{default:null},width:{default:this.options.width,parseHTML:t=>t.getAttribute("width")},height:{default:this.options.height,parseHTML:t=>t.getAttribute("height")},autoplay:{default:0},loop:{default:0},title:{default:0},byline:{default:0},portrait:{default:0},responsive:{default:!0,parseHTML:t=>t.classList.contains("responsive")??!1},"data-aspect-width":{default:null,parseHTML:t=>t.getAttribute("data-aspect-width")},"data-aspect-height":{default:null,parseHTML:t=>t.getAttribute("data-aspect-height")}}},parseHTML(){return[{tag:"div[data-vimeo-video] iframe"}]},addCommands(){return{setVimeoVideo:t=>({commands:e})=>{if(!Ew(t.src))return!1;let n=xh({url:t.src,autoplay:t?.autoplay||0,loop:t?.loop||0,title:t?.title||0,byline:t?.byline||0,portrait:t?.portrait||0});return e.insertContent({type:this.name,attrs:{...t,src:n}})}}},renderHTML({HTMLAttributes:t}){let e=xh({url:t.src,autoplay:t?.autoplay||0,loop:t?.loop||0,title:t?.title||0,byline:t?.byline||0,portrait:t?.portrait||0});return["div",{"data-vimeo-video":"",class:t.responsive?"responsive":null},["iframe",{src:e,width:t.width,height:t.height,allowfullscreen:this.options.allowfullscreen,frameborder:0,allow:"autoplay; fullscreen; picture-in-picture",style:t.responsive?`aspect-ratio: ${t["data-aspect-width"]} / ${t["data-aspect-height"]}; width: 100%; height: auto;`:null,"data-aspect-width":t.responsive?t["data-aspect-width"]:null,"data-aspect-height":t.responsive?t["data-aspect-height"]:null}]]}});var Sh=ae.create({name:"video",selectable:!0,draggable:!0,atom:!0,inline(){return this.options.inline},group(){return this.options.inline?"inline":"block"},addOptions(){return{inline:!1,HTMLAttributes:{autoplay:null,controls:null,loop:null},width:640,height:480}},addAttributes(){return{style:{default:null,parseHTML:t=>t.getAttribute("style")},responsive:{default:!0,parseHTML:t=>t.classList.contains("responsive")??!1},src:{default:null},width:{default:this.options.width,parseHTML:t=>t.getAttribute("width")},height:{default:this.options.height,parseHTML:t=>t.getAttribute("height")},autoplay:{default:null,parseHTML:t=>t.getAttribute("autoplay")},controls:{default:null,parseHTML:t=>t.getAttribute("controls")},loop:{default:null,parseHTML:t=>t.getAttribute("loop")},"data-aspect-width":{default:null,parseHTML:t=>t.getAttribute("data-aspect-width")},"data-aspect-height":{default:null,parseHTML:t=>t.getAttribute("data-aspect-height")}}},parseHTML(){return[{tag:"div[data-native-video] video"}]},addCommands(){return{setVideo:t=>({commands:e})=>e.insertContent({type:this.name,attrs:t})}},renderHTML({HTMLAttributes:t}){return["div",{"data-native-video":"",class:t.responsive?"responsive":null},["video",{src:t.src,width:t.width,height:t.height,autoplay:t.autoplay?"true":null,controls:t.controls?"true":null,loop:t.loop?"true":null,style:t.responsive?`aspect-ratio: ${t["data-aspect-width"]} / ${t["data-aspect-height"]}; width: 100%; height: auto;`:null,"data-aspect-width":t.responsive?t["data-aspect-width"]:null,"data-aspect-height":t.responsive?t["data-aspect-height"]:null}]]}});var Th=ae.create({name:"details",content:"detailsSummary detailsContent",group:"block",defining:!0,isolating:!0,allowGapCursor:!1,addOptions(){return{HTMLAttributes:{}}},addAttributes(){return{}},parseHTML(){return[{tag:"details"}]},renderHTML({HTMLAttributes:t}){return["details",Z(this.options.HTMLAttributes,t),0]},addNodeView(){return({editor:t,getPos:e,node:n,HTMLAttributes:r})=>{let i=document.createElement("div"),o=document.createElement("div"),s=Z(this.options.HTMLAttributes,r,{"data-type":this.name});return Object.entries(s).forEach(([l,u])=>i.setAttribute(l,u)),{dom:i,contentDOM:i,ignoreMutation(l){return l.type==="selection"?!1:!i.contains(l.target)||i===l.target},update:l=>l.type===this.type}}},addCommands(){return{setDetails:()=>({state:t,chain:e})=>{var n;let{schema:r,selection:i}=t,{$from:o,$to:s}=i,l=o.blockRange(s);if(!l)return!1;let u=t.doc.slice(l.start,l.end);if(!r.nodes.detailsContent.contentMatch.matchFragment(u.content))return!1;let f=((n=u.toJSON())===null||n===void 0?void 0:n.content)||[];return e().insertContentAt({from:l.start,to:l.end},{type:this.name,content:[{type:"detailsSummary"},{type:"detailsContent",content:f}]}).setTextSelection(l.start+2).run()},unsetDetails:()=>({state:t,chain:e})=>{let{selection:n,schema:r}=t,i=to(S=>S.type===this.type)(n);if(!i)return!1;let o=eo(i.node,S=>S.type===r.nodes.detailsSummary),s=eo(i.node,S=>S.type===r.nodes.detailsContent);if(!o.length||!s.length)return!1;let l=o[0],u=s[0],d=i.pos,f=t.doc.resolve(d),h=d+i.node.nodeSize,m={from:d,to:h},b=u.node.content.toJSON()||[],y=f.parent.type.contentMatch.defaultType,x=[y?.create(null,l.node.content).toJSON(),...b];return e().insertContentAt(m,x).setTextSelection(d+1).run()}}},addKeyboardShortcuts(){return{Backspace:()=>{let{schema:t,selection:e}=this.editor.state,{empty:n,$anchor:r}=e;return!n||r.parent.type!==t.nodes.detailsSummary?!1:r.parentOffset!==0?this.editor.commands.command(({tr:i})=>{let o=r.pos-1,s=r.pos;return i.delete(o,s),!0}):this.editor.commands.unsetDetails()}}}});var Mh=ae.create({name:"detailsSummary",content:"text*",defining:!0,selectable:!1,isolating:!0,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:"summary"}]},renderHTML({HTMLAttributes:t}){return["summary",Z(this.options.HTMLAttributes,t),0]}});var Ch=ae.create({name:"detailsContent",content:"block+",defining:!0,selectable:!1,addOptions(){return{HTMLAttributes:{}}},parseHTML(){return[{tag:'div[data-type="details-content"]'}]},renderHTML({HTMLAttributes:t}){return["div",Z(this.options.HTMLAttributes,t,{"data-type":"details-content"}),0]},addKeyboardShortcuts(){return{Enter:({editor:t})=>{let{state:e,view:n}=t,{selection:r}=e,{$from:i,empty:o}=r,s=to(me=>me.type===this.type)(r);if(!o||!s||!s.node.childCount)return!1;let l=i.index(s.depth),{childCount:u}=s.node;if(!(u===l+1))return!1;let f=s.node.type.contentMatch.defaultType,h=f?.createAndFill();if(!h)return!1;let m=e.doc.resolve(s.pos+1),b=u-1,y=s.node.child(b),v=m.posAtIndex(b,s.depth);if(!y.eq(h))return!1;let S=i.node(-3);if(!S)return!1;let D=i.indexAfter(-3),L=_p(S.contentMatchAt(D));if(!L||!S.canReplaceWith(D,D,L))return!1;let T=L.createAndFill();if(!T)return!1;let{tr:z}=e,O=i.after(-2);z.replaceWith(O,O,T);let Y=z.doc.resolve(O),ie=fe.near(Y,1);z.setSelection(ie);let $=v,oe=v+y.nodeSize;return z.delete($,oe),z.scrollIntoView(),n.dispatch(z),!0}}}});var JP=/^```([a-z]+)?[\s\n]$/,XP=/^~~~([a-z]+)?[\s\n]$/,vw=ae.create({name:"codeBlock",addOptions(){return{languageClassPrefix:"language-",exitOnTripleEnter:!0,exitOnArrowDown:!0,HTMLAttributes:{}}},content:"text*",marks:"",group:"block",code:!0,defining:!0,addAttributes(){return{language:{default:null,parseHTML:t=>{var e;let{languageClassPrefix:n}=this.options,o=[...((e=t.firstElementChild)===null||e===void 0?void 0:e.classList)||[]].filter(s=>s.startsWith(n)).map(s=>s.replace(n,""))[0];return o||null},rendered:!1}}},parseHTML(){return[{tag:"pre",preserveWhitespace:"full"}]},renderHTML({node:t,HTMLAttributes:e}){return["pre",Z(this.options.HTMLAttributes,e),["code",{class:t.attrs.language?this.options.languageClassPrefix+t.attrs.language:null},0]]},addCommands(){return{setCodeBlock:t=>({commands:e})=>e.setNode(this.name,t),toggleCodeBlock:t=>({commands:e})=>e.toggleNode(this.name,"paragraph",t)}},addKeyboardShortcuts(){return{"Mod-Alt-c":()=>this.editor.commands.toggleCodeBlock(),Backspace:()=>{let{empty:t,$anchor:e}=this.editor.state.selection,n=e.pos===1;return!t||e.parent.type.name!==this.name?!1:n||!e.parent.textContent.length?this.editor.commands.clearNodes():!1},Enter:({editor:t})=>{if(!this.options.exitOnTripleEnter)return!1;let{state:e}=t,{selection:n}=e,{$from:r,empty:i}=n;if(!i||r.parent.type!==this.type)return!1;let o=r.parentOffset===r.parent.nodeSize-2,s=r.parent.textContent.endsWith(` + +`);return!o||!s?!1:t.chain().command(({tr:l})=>(l.delete(r.pos-2,r.pos),!0)).exitCode().run()},ArrowDown:({editor:t})=>{if(!this.options.exitOnArrowDown)return!1;let{state:e}=t,{selection:n,doc:r}=e,{$from:i,empty:o}=n;if(!o||i.parent.type!==this.type||!(i.parentOffset===i.parent.nodeSize-2))return!1;let l=i.after();return l===void 0||r.nodeAt(l)?!1:t.commands.exitCode()}}},addInputRules(){return[na({find:JP,type:this.type,getAttributes:t=>({language:t[1]})}),na({find:XP,type:this.type,getAttributes:t=>({language:t[1]})})]},addProseMirrorPlugins(){return[new Pe({key:new qe("codeBlockVSCodeHandler"),props:{handlePaste:(t,e)=>{if(!e.clipboardData||this.editor.isActive(this.type.name))return!1;let n=e.clipboardData.getData("text/plain"),r=e.clipboardData.getData("vscode-editor-data"),i=r?JSON.parse(r):void 0,o=i?.mode;if(!n||!o)return!1;let{tr:s}=t.state;return s.replaceSelectionWith(this.type.create({language:o})),s.setSelection(ce.near(s.doc.resolve(Math.max(0,s.selection.from-2)))),s.insertText(n.replace(/\r\n?/g,` +`)),s.setMeta("paste",!0),t.dispatch(s),!0}}})]}});var Ih={exports:{}};function Lh(t){return t instanceof Map?t.clear=t.delete=t.set=function(){throw new Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=function(){throw new Error("set is read-only")}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach(function(e){var n=t[e];typeof n=="object"&&!Object.isFrozen(n)&&Lh(n)}),t}Ih.exports=Lh;Ih.exports.default=Lh;var tu=class{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function Aw(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function xi(t,...e){let n=Object.create(null);for(let r in t)n[r]=t[r];return e.forEach(function(r){for(let i in r)n[i]=r[i]}),n}var ZP="",ww=t=>!!t.scope||t.sublanguage&&t.language,jP=(t,{prefix:e})=>{if(t.includes(".")){let n=t.split(".");return[`${e}${n.shift()}`,...n.map((r,i)=>`${r}${"_".repeat(i+1)}`)].join(" ")}return`${e}${t}`},Ah=class{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=Aw(e)}openNode(e){if(!ww(e))return;let n="";e.sublanguage?n=`language-${e.language}`:n=jP(e.scope,{prefix:this.classPrefix}),this.span(n)}closeNode(e){ww(e)&&(this.buffer+=ZP)}value(){return this.buffer}span(e){this.buffer+=``}},xw=(t={})=>{let e={children:[]};return Object.assign(e,t),e},Nh=class t{constructor(){this.rootNode=xw(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let n=xw({scope:e});this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return typeof n=="string"?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(r=>this._walk(e,r)),e.closeNode(n)),e}static _collapse(e){typeof e!="string"&&e.children&&(e.children.every(n=>typeof n=="string")?e.children=[e.children.join("")]:e.children.forEach(n=>{t._collapse(n)}))}},Oh=class extends Nh{constructor(e){super(),this.options=e}addKeyword(e,n){e!==""&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){e!==""&&this.add(e)}addSublanguage(e,n){let r=e.root;r.sublanguage=!0,r.language=n,this.add(r)}toHTML(){return new Ah(this,this.options).value()}finalize(){return!0}};function la(t){return t?typeof t=="string"?t:t.source:null}function Nw(t){return ao("(?=",t,")")}function QP(t){return ao("(?:",t,")*")}function eB(t){return ao("(?:",t,")?")}function ao(...t){return t.map(n=>la(n)).join("")}function tB(t){let e=t[t.length-1];return typeof e=="object"&&e.constructor===Object?(t.splice(t.length-1,1),e):{}}function Dh(...t){return"("+(tB(t).capture?"":"?:")+t.map(r=>la(r)).join("|")+")"}function Ow(t){return new RegExp(t.toString()+"|").exec("").length-1}function nB(t,e){let n=t&&t.exec(e);return n&&n.index===0}var rB=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function Ph(t,{joinWith:e}){let n=0;return t.map(r=>{n+=1;let i=n,o=la(r),s="";for(;o.length>0;){let l=rB.exec(o);if(!l){s+=o;break}s+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),l[0][0]==="\\"&&l[1]?s+="\\"+String(Number(l[1])+i):(s+=l[0],l[0]==="("&&n++)}return s}).map(r=>`(${r})`).join(e)}var iB=/\b\B/,Rw="[a-zA-Z]\\w*",Bh="[a-zA-Z_]\\w*",Iw="\\b\\d+(\\.\\d+)?",Lw="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",Dw="\\b(0b[01]+)",oB="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",sB=(t={})=>{let e=/^#![ ]*\//;return t.binary&&(t.begin=ao(e,/.*\b/,t.binary,/\b.*/)),xi({scope:"meta",begin:e,end:/$/,relevance:0,"on:begin":(n,r)=>{n.index!==0&&r.ignoreMatch()}},t)},ca={begin:"\\\\[\\s\\S]",relevance:0},aB={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[ca]},lB={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[ca]},cB={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},ru=function(t,e,n={}){let r=xi({scope:"comment",begin:t,end:e,contains:[]},n);r.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=Dh("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:ao(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),r},uB=ru("//","$"),dB=ru("/\\*","\\*/"),fB=ru("#","$"),pB={scope:"number",begin:Iw,relevance:0},hB={scope:"number",begin:Lw,relevance:0},mB={scope:"number",begin:Dw,relevance:0},gB={begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[ca,{begin:/\[/,end:/\]/,relevance:0,contains:[ca]}]}]},bB={scope:"title",begin:Rw,relevance:0},yB={scope:"title",begin:Bh,relevance:0},EB={begin:"\\.\\s*"+Bh,relevance:0},vB=function(t){return Object.assign(t,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})},eu=Object.freeze({__proto__:null,MATCH_NOTHING_RE:iB,IDENT_RE:Rw,UNDERSCORE_IDENT_RE:Bh,NUMBER_RE:Iw,C_NUMBER_RE:Lw,BINARY_NUMBER_RE:Dw,RE_STARTERS_RE:oB,SHEBANG:sB,BACKSLASH_ESCAPE:ca,APOS_STRING_MODE:aB,QUOTE_STRING_MODE:lB,PHRASAL_WORDS_MODE:cB,COMMENT:ru,C_LINE_COMMENT_MODE:uB,C_BLOCK_COMMENT_MODE:dB,HASH_COMMENT_MODE:fB,NUMBER_MODE:pB,C_NUMBER_MODE:hB,BINARY_NUMBER_MODE:mB,REGEXP_MODE:gB,TITLE_MODE:bB,UNDERSCORE_TITLE_MODE:yB,METHOD_GUARD:EB,END_SAME_AS_BEGIN:vB});function wB(t,e){t.input[t.index-1]==="."&&e.ignoreMatch()}function xB(t,e){t.className!==void 0&&(t.scope=t.className,delete t.className)}function _B(t,e){e&&t.beginKeywords&&(t.begin="\\b("+t.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",t.__beforeBegin=wB,t.keywords=t.keywords||t.beginKeywords,delete t.beginKeywords,t.relevance===void 0&&(t.relevance=0))}function SB(t,e){Array.isArray(t.illegal)&&(t.illegal=Dh(...t.illegal))}function TB(t,e){if(t.match){if(t.begin||t.end)throw new Error("begin & end are not supported with match");t.begin=t.match,delete t.match}}function MB(t,e){t.relevance===void 0&&(t.relevance=1)}var CB=(t,e)=>{if(!t.beforeMatch)return;if(t.starts)throw new Error("beforeMatch cannot be used with starts");let n=Object.assign({},t);Object.keys(t).forEach(r=>{delete t[r]}),t.keywords=n.keywords,t.begin=ao(n.beforeMatch,Nw(n.begin)),t.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},t.relevance=0,delete n.beforeMatch},kB=["of","and","for","in","not","or","if","then","parent","list","value"],AB="keyword";function Pw(t,e,n=AB){let r=Object.create(null);return typeof t=="string"?i(n,t.split(" ")):Array.isArray(t)?i(n,t):Object.keys(t).forEach(function(o){Object.assign(r,Pw(t[o],e,o))}),r;function i(o,s){e&&(s=s.map(l=>l.toLowerCase())),s.forEach(function(l){let u=l.split("|");r[u[0]]=[o,NB(u[0],u[1])]})}}function NB(t,e){return e?Number(e):OB(t)?0:1}function OB(t){return kB.includes(t.toLowerCase())}var _w={},so=t=>{console.error(t)},Sw=(t,...e)=>{console.log(`WARN: ${t}`,...e)},Qo=(t,e)=>{_w[`${t}/${e}`]||(console.log(`Deprecated as of ${t}. ${e}`),_w[`${t}/${e}`]=!0)},nu=new Error;function Bw(t,e,{key:n}){let r=0,i=t[n],o={},s={};for(let l=1;l<=e.length;l++)s[l+r]=i[l],o[l+r]=!0,r+=Ow(e[l-1]);t[n]=s,t[n]._emit=o,t[n]._multi=!0}function RB(t){if(Array.isArray(t.begin)){if(t.skip||t.excludeBegin||t.returnBegin)throw so("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),nu;if(typeof t.beginScope!="object"||t.beginScope===null)throw so("beginScope must be object"),nu;Bw(t,t.begin,{key:"beginScope"}),t.begin=Ph(t.begin,{joinWith:""})}}function IB(t){if(Array.isArray(t.end)){if(t.skip||t.excludeEnd||t.returnEnd)throw so("skip, excludeEnd, returnEnd not compatible with endScope: {}"),nu;if(typeof t.endScope!="object"||t.endScope===null)throw so("endScope must be object"),nu;Bw(t,t.end,{key:"endScope"}),t.end=Ph(t.end,{joinWith:""})}}function LB(t){t.scope&&typeof t.scope=="object"&&t.scope!==null&&(t.beginScope=t.scope,delete t.scope)}function DB(t){LB(t),typeof t.beginScope=="string"&&(t.beginScope={_wrap:t.beginScope}),typeof t.endScope=="string"&&(t.endScope={_wrap:t.endScope}),RB(t),IB(t)}function PB(t){function e(s,l){return new RegExp(la(s),"m"+(t.case_insensitive?"i":"")+(t.unicodeRegex?"u":"")+(l?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(l,u){u.position=this.position++,this.matchIndexes[this.matchAt]=u,this.regexes.push([u,l]),this.matchAt+=Ow(l)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);let l=this.regexes.map(u=>u[1]);this.matcherRe=e(Ph(l,{joinWith:"|"}),!0),this.lastIndex=0}exec(l){this.matcherRe.lastIndex=this.lastIndex;let u=this.matcherRe.exec(l);if(!u)return null;let d=u.findIndex((h,m)=>m>0&&h!==void 0),f=this.matchIndexes[d];return u.splice(0,d),Object.assign(u,f)}}class r{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(l){if(this.multiRegexes[l])return this.multiRegexes[l];let u=new n;return this.rules.slice(l).forEach(([d,f])=>u.addRule(d,f)),u.compile(),this.multiRegexes[l]=u,u}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(l,u){this.rules.push([l,u]),u.type==="begin"&&this.count++}exec(l){let u=this.getMatcher(this.regexIndex);u.lastIndex=this.lastIndex;let d=u.exec(l);if(this.resumingScanAtSamePosition()&&!(d&&d.index===this.lastIndex)){let f=this.getMatcher(0);f.lastIndex=this.lastIndex+1,d=f.exec(l)}return d&&(this.regexIndex+=d.position+1,this.regexIndex===this.count&&this.considerAll()),d}}function i(s){let l=new r;return s.contains.forEach(u=>l.addRule(u.begin,{rule:u,type:"begin"})),s.terminatorEnd&&l.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&l.addRule(s.illegal,{type:"illegal"}),l}function o(s,l){let u=s;if(s.isCompiled)return u;[xB,TB,DB,CB].forEach(f=>f(s,l)),t.compilerExtensions.forEach(f=>f(s,l)),s.__beforeBegin=null,[_B,SB,MB].forEach(f=>f(s,l)),s.isCompiled=!0;let d=null;return typeof s.keywords=="object"&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords),d=s.keywords.$pattern,delete s.keywords.$pattern),d=d||/\w+/,s.keywords&&(s.keywords=Pw(s.keywords,t.case_insensitive)),u.keywordPatternRe=e(d,!0),l&&(s.begin||(s.begin=/\B|\b/),u.beginRe=e(u.begin),!s.end&&!s.endsWithParent&&(s.end=/\B|\b/),s.end&&(u.endRe=e(u.end)),u.terminatorEnd=la(u.end)||"",s.endsWithParent&&l.terminatorEnd&&(u.terminatorEnd+=(s.end?"|":"")+l.terminatorEnd)),s.illegal&&(u.illegalRe=e(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map(function(f){return BB(f==="self"?s:f)})),s.contains.forEach(function(f){o(f,u)}),s.starts&&o(s.starts,l),u.matcher=i(u),u}if(t.compilerExtensions||(t.compilerExtensions=[]),t.contains&&t.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return t.classNameAliases=xi(t.classNameAliases||{}),o(t)}function Fw(t){return t?t.endsWithParent||Fw(t.starts):!1}function BB(t){return t.variants&&!t.cachedVariants&&(t.cachedVariants=t.variants.map(function(e){return xi(t,{variants:null},e)})),t.cachedVariants?t.cachedVariants:Fw(t)?xi(t,{starts:t.starts?xi(t.starts):null}):Object.isFrozen(t)?xi(t):t}var FB="11.6.0",Rh=class extends Error{constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}},kh=Aw,Tw=xi,Mw=Symbol("nomatch"),HB=7,zB=function(t){let e=Object.create(null),n=Object.create(null),r=[],i=!0,o="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]},l={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:Oh};function u(P){return l.noHighlightRe.test(P)}function d(P){let N=P.className+" ";N+=P.parentNode?P.parentNode.className:"";let R=l.languageDetectRe.exec(N);if(R){let V=$(R[1]);return V||(Sw(o.replace("{}",R[1])),Sw("Falling back to no-highlight mode for this block.",P)),V?R[1]:"no-highlight"}return N.split(/\s+/).find(V=>u(V)||$(V))}function f(P,N,R){let V="",Q="";typeof N=="object"?(V=P,R=N.ignoreIllegals,Q=N.language):(Qo("10.7.0","highlight(lang, code, ...args) has been deprecated."),Qo("10.7.0",`Please use highlight(code, options) instead. +https://github.com/highlightjs/highlight.js/issues/2277`),Q=P,V=N),R===void 0&&(R=!0);let he={code:V,language:Q};Me("before:highlight",he);let xe=he.result?he.result:h(he.language,he.code,R);return xe.code=he.code,Me("after:highlight",xe),xe}function h(P,N,R,V){let Q=Object.create(null);function he(J,ne){return J.keywords[ne]}function xe(){if(!be.keywords){ee.addText(ke);return}let J=0;be.keywordPatternRe.lastIndex=0;let ne=be.keywordPatternRe.exec(ke),H="";for(;ne;){H+=ke.substring(J,ne.index);let q=St.case_insensitive?ne[0].toLowerCase():ne[0],ue=he(be,q);if(ue){let[Ce,ct]=ue;if(ee.addText(H),H="",Q[q]=(Q[q]||0)+1,Q[q]<=HB&&(We+=ct),Ce.startsWith("_"))H+=ne[0];else{let Vt=St.classNameAliases[Ce]||Ce;ee.addKeyword(ne[0],Vt)}}else H+=ne[0];J=be.keywordPatternRe.lastIndex,ne=be.keywordPatternRe.exec(ke)}H+=ke.substring(J),ee.addText(H)}function $e(){if(ke==="")return;let J=null;if(typeof be.subLanguage=="string"){if(!e[be.subLanguage]){ee.addText(ke);return}J=h(be.subLanguage,ke,!0,Kt[be.subLanguage]),Kt[be.subLanguage]=J._top}else J=b(ke,be.subLanguage.length?be.subLanguage:null);be.relevance>0&&(We+=J.relevance),ee.addSublanguage(J._emitter,J.language)}function Ue(){be.subLanguage!=null?$e():xe(),ke=""}function He(J,ne){let H=1,q=ne.length-1;for(;H<=q;){if(!J._emit[H]){H++;continue}let ue=St.classNameAliases[J[H]]||J[H],Ce=ne[H];ue?ee.addKeyword(Ce,ue):(ke=Ce,xe(),ke=""),H++}}function Xe(J,ne){return J.scope&&typeof J.scope=="string"&&ee.openNode(St.classNameAliases[J.scope]||J.scope),J.beginScope&&(J.beginScope._wrap?(ee.addKeyword(ke,St.classNameAliases[J.beginScope._wrap]||J.beginScope._wrap),ke=""):J.beginScope._multi&&(He(J.beginScope,ne),ke="")),be=Object.create(J,{parent:{value:be}}),be}function xt(J,ne,H){let q=nB(J.endRe,H);if(q){if(J["on:end"]){let ue=new tu(J);J["on:end"](ne,ue),ue.isMatchIgnored&&(q=!1)}if(q){for(;J.endsParent&&J.parent;)J=J.parent;return J}}if(J.endsWithParent)return xt(J.parent,ne,H)}function Pt(J){return be.matcher.regexIndex===0?(ke+=J[0],1):(Ot=!0,0)}function Le(J){let ne=J[0],H=J.rule,q=new tu(H),ue=[H.__beforeBegin,H["on:begin"]];for(let Ce of ue)if(Ce&&(Ce(J,q),q.isMatchIgnored))return Pt(ne);return H.skip?ke+=ne:(H.excludeBegin&&(ke+=ne),Ue(),!H.returnBegin&&!H.excludeBegin&&(ke=ne)),Xe(H,J),H.returnBegin?0:ne.length}function _t(J){let ne=J[0],H=N.substring(J.index),q=xt(be,J,H);if(!q)return Mw;let ue=be;be.endScope&&be.endScope._wrap?(Ue(),ee.addKeyword(ne,be.endScope._wrap)):be.endScope&&be.endScope._multi?(Ue(),He(be.endScope,J)):ue.skip?ke+=ne:(ue.returnEnd||ue.excludeEnd||(ke+=ne),Ue(),ue.excludeEnd&&(ke=ne));do be.scope&&ee.closeNode(),!be.skip&&!be.subLanguage&&(We+=be.relevance),be=be.parent;while(be!==q.parent);return q.starts&&Xe(q.starts,J),ue.returnEnd?0:ne.length}function Zt(){let J=[];for(let ne=be;ne!==St;ne=ne.parent)ne.scope&&J.unshift(ne.scope);J.forEach(ne=>ee.openNode(ne))}let st={};function jt(J,ne){let H=ne&&ne[0];if(ke+=J,H==null)return Ue(),0;if(st.type==="begin"&&ne.type==="end"&&st.index===ne.index&&H===""){if(ke+=N.slice(ne.index,ne.index+1),!i){let q=new Error(`0 width match regex (${P})`);throw q.languageName=P,q.badRule=st.rule,q}return 1}if(st=ne,ne.type==="begin")return Le(ne);if(ne.type==="illegal"&&!R){let q=new Error('Illegal lexeme "'+H+'" for mode "'+(be.scope||"")+'"');throw q.mode=be,q}else if(ne.type==="end"){let q=_t(ne);if(q!==Mw)return q}if(ne.type==="illegal"&&H==="")return 1;if(mt>1e5&&mt>ne.index*3)throw new Error("potential infinite loop, way more iterations than matches");return ke+=H,H.length}let St=$(P);if(!St)throw so(o.replace("{}",P)),new Error('Unknown language: "'+P+'"');let Nt=PB(St),ft="",be=V||Nt,Kt={},ee=new l.__emitter(l);Zt();let ke="",We=0,Oe=0,mt=0,Ot=!1;try{for(be.matcher.considerAll();;){mt++,Ot?Ot=!1:be.matcher.considerAll(),be.matcher.lastIndex=Oe;let J=be.matcher.exec(N);if(!J)break;let ne=N.substring(Oe,J.index),H=jt(ne,J);Oe=J.index+H}return jt(N.substring(Oe)),ee.closeAllNodes(),ee.finalize(),ft=ee.toHTML(),{language:P,value:ft,relevance:We,illegal:!1,_emitter:ee,_top:be}}catch(J){if(J.message&&J.message.includes("Illegal"))return{language:P,value:kh(N),illegal:!0,relevance:0,_illegalBy:{message:J.message,index:Oe,context:N.slice(Oe-100,Oe+100),mode:J.mode,resultSoFar:ft},_emitter:ee};if(i)return{language:P,value:kh(N),illegal:!1,relevance:0,errorRaised:J,_emitter:ee,_top:be};throw J}}function m(P){let N={value:kh(P),illegal:!1,relevance:0,_top:s,_emitter:new l.__emitter(l)};return N._emitter.addText(P),N}function b(P,N){N=N||l.languages||Object.keys(e);let R=m(P),V=N.filter($).filter(me).map(Ue=>h(Ue,P,!1));V.unshift(R);let Q=V.sort((Ue,He)=>{if(Ue.relevance!==He.relevance)return He.relevance-Ue.relevance;if(Ue.language&&He.language){if($(Ue.language).supersetOf===He.language)return 1;if($(He.language).supersetOf===Ue.language)return-1}return 0}),[he,xe]=Q,$e=he;return $e.secondBest=xe,$e}function y(P,N,R){let V=N&&n[N]||R;P.classList.add("hljs"),P.classList.add(`language-${V}`)}function v(P){let N=null,R=d(P);if(u(R))return;if(Me("before:highlightElement",{el:P,language:R}),P.children.length>0&&(l.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(P)),l.throwUnescapedHTML))throw new Rh("One of your code blocks includes unescaped HTML.",P.innerHTML);N=P;let V=N.textContent,Q=R?f(V,{language:R,ignoreIllegals:!0}):b(V);P.innerHTML=Q.value,y(P,R,Q.language),P.result={language:Q.language,re:Q.relevance,relevance:Q.relevance},Q.secondBest&&(P.secondBest={language:Q.secondBest.language,relevance:Q.secondBest.relevance}),Me("after:highlightElement",{el:P,result:Q,text:V})}function x(P){l=Tw(l,P)}let S=()=>{T(),Qo("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function D(){T(),Qo("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let L=!1;function T(){if(document.readyState==="loading"){L=!0;return}document.querySelectorAll(l.cssSelector).forEach(v)}function z(){L&&T()}typeof window<"u"&&window.addEventListener&&window.addEventListener("DOMContentLoaded",z,!1);function O(P,N){let R=null;try{R=N(t)}catch(V){if(so("Language definition for '{}' could not be registered.".replace("{}",P)),i)so(V);else throw V;R=s}R.name||(R.name=P),e[P]=R,R.rawDefinition=N.bind(null,t),R.aliases&&oe(R.aliases,{languageName:P})}function Y(P){delete e[P];for(let N of Object.keys(n))n[N]===P&&delete n[N]}function ie(){return Object.keys(e)}function $(P){return P=(P||"").toLowerCase(),e[P]||e[n[P]]}function oe(P,{languageName:N}){typeof P=="string"&&(P=[P]),P.forEach(R=>{n[R.toLowerCase()]=N})}function me(P){let N=$(P);return N&&!N.disableAutodetect}function Te(P){P["before:highlightBlock"]&&!P["before:highlightElement"]&&(P["before:highlightElement"]=N=>{P["before:highlightBlock"](Object.assign({block:N.el},N))}),P["after:highlightBlock"]&&!P["after:highlightElement"]&&(P["after:highlightElement"]=N=>{P["after:highlightBlock"](Object.assign({block:N.el},N))})}function ge(P){Te(P),r.push(P)}function Me(P,N){let R=P;r.forEach(function(V){V[R]&&V[R](N)})}function Ee(P){return Qo("10.7.0","highlightBlock will be removed entirely in v12.0"),Qo("10.7.0","Please use highlightElement now."),v(P)}Object.assign(t,{highlight:f,highlightAuto:b,highlightAll:T,highlightElement:v,highlightBlock:Ee,configure:x,initHighlighting:S,initHighlightingOnLoad:D,registerLanguage:O,unregisterLanguage:Y,listLanguages:ie,getLanguage:$,registerAliases:oe,autoDetection:me,inherit:Tw,addPlugin:ge}),t.debugMode=function(){i=!1},t.safeMode=function(){i=!0},t.versionString=FB,t.regex={concat:ao,lookahead:Nw,either:Dh,optional:eB,anyNumberOfTimes:QP};for(let P in eu)typeof eu[P]=="object"&&Ih.exports(eu[P]);return Object.assign(t,eu),t},ua=zB({}),$B=ua;ua.HighlightJS=ua;ua.default=ua;var UB=$B;function Hw(t,e=[]){return t.map(n=>{let r=[...e,...n.properties?n.properties.className:[]];return n.children?Hw(n.children,r):{text:n.value,classes:r}}).flat()}function Cw(t){return t.value||t.children||[]}function WB(t){return!!UB.getLanguage(t)}function kw({doc:t,name:e,lowlight:n,defaultLanguage:r}){let i=[];return eo(t,o=>o.type.name===e).forEach(o=>{let s=o.pos+1,l=o.node.attrs.language||r,u=n.listLanguages(),d=l&&(u.includes(l)||WB(l))?Cw(n.highlight(l,o.node.textContent)):Cw(n.highlightAuto(o.node.textContent));Hw(d).forEach(f=>{let h=s+f.text.length;if(f.classes.length){let m=Mt.inline(s,h,{class:f.classes.join(" ")});i.push(m)}s=h})}),lt.create(t,i)}function KB(t){return typeof t=="function"}function VB({name:t,lowlight:e,defaultLanguage:n}){if(!["highlight","highlightAuto","listLanguages"].every(i=>KB(e[i])))throw Error("You should provide an instance of lowlight to use the code-block-lowlight extension");let r=new Pe({key:new qe("lowlight"),state:{init:(i,{doc:o})=>kw({doc:o,name:t,lowlight:e,defaultLanguage:n}),apply:(i,o,s,l)=>{let u=s.selection.$head.parent.type.name,d=l.selection.$head.parent.type.name,f=eo(s.doc,m=>m.type.name===t),h=eo(l.doc,m=>m.type.name===t);return i.docChanged&&([u,d].includes(t)||h.length!==f.length||i.steps.some(m=>m.from!==void 0&&m.to!==void 0&&f.some(b=>b.pos>=m.from&&b.pos+b.node.nodeSize<=m.to)))?kw({doc:i.doc,name:t,lowlight:e,defaultLanguage:n}):o.map(i.mapping,i.doc)}},props:{decorations(i){return r.getState(i)}}});return r}var zw=vw.extend({addOptions(){var t;return{...(t=this.parent)===null||t===void 0?void 0:t.call(this),lowlight:{},defaultLanguage:null}},addProseMirrorPlugins(){var t;return[...((t=this.parent)===null||t===void 0?void 0:t.call(this))||[],VB({name:this.name,lowlight:this.options.lowlight,defaultLanguage:this.options.defaultLanguage})]}});var Fh=zw.extend({addKeyboardShortcuts(){return{...this.parent?.(),ArrowDown:()=>{let t=this.editor.state,{from:e,to:n}=t.selection;if(e>1&&e===n){let r=!1;t.doc.nodesBetween(e-1,n-1,o=>{o.type.name==="codeBlock"&&(r=!0)});let i=!0;if(t.doc.nodesBetween(e+1,n+1,o=>{o&&(i=!1)}),r&&i)return this.editor.commands.setHardBreak()}return!1}}}});var Hh=ae.create({name:"hurdle",group:"block",content:"block+",addOptions(){return{colors:["gray_light","gray","gray_dark","primary","secondary","tertiary","accent"],HTMLAttributes:{class:"filament-tiptap-hurdle"}}},addAttributes(){return{color:{default:"gray",parseHTML:t=>t.getAttribute("data-color"),renderHTML:t=>({"data-color":t.color})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-hurdle")}]},renderHTML({node:t,HTMLAttributes:e}){return["div",Z(this.options.HTMLAttributes,e),0]},addCommands(){return{setHurdle:t=>({commands:e})=>this.options.colors.includes(t.color)?e.toggleWrap(this.name,t):!1}}});var zh=Je.create({name:"textAlign",addOptions(){return{types:[],alignments:["start","center","end","justify"],defaultAlignment:"start"}},addGlobalAttributes(){return[{types:this.options.types,attributes:{textAlign:{default:this.options.defaultAlignment,parseHTML:t=>t.style.textAlign||this.options.defaultAlignment,renderHTML:t=>t.textAlign===this.options.defaultAlignment?{}:{style:`text-align: ${t.textAlign}`}}}}]},addCommands(){return{setTextAlign:t=>({commands:e})=>this.options.alignments.includes(t)?this.options.types.every(n=>e.updateAttributes(n,{textAlign:t})):!1,unsetTextAlign:()=>({commands:t})=>this.options.types.every(e=>t.resetAttributes(e,"textAlign"))}},addKeyboardShortcuts(){return{"Mod-Shift-l":()=>this.editor.commands.setTextAlign("start"),"Mod-Shift-e":()=>this.editor.commands.setTextAlign("center"),"Mod-Shift-r":()=>this.editor.commands.setTextAlign("end"),"Mod-Shift-j":()=>this.editor.commands.setTextAlign("justify")}}});var yt="top",Lt="bottom",kt="right",wt="left",iu="auto",_i=[yt,Lt,kt,wt],Kr="start",lo="end",$w="clippingParents",ou="viewport",es="popper",Uw="reference",$h=_i.reduce(function(t,e){return t.concat([e+"-"+Kr,e+"-"+lo])},[]),su=[].concat(_i,[iu]).reduce(function(t,e){return t.concat([e,e+"-"+Kr,e+"-"+lo])},[]),GB="beforeRead",qB="read",YB="afterRead",JB="beforeMain",XB="main",ZB="afterMain",jB="beforeWrite",QB="write",e2="afterWrite",Ww=[GB,qB,YB,JB,XB,ZB,jB,QB,e2];function Ut(t){return t?(t.nodeName||"").toLowerCase():null}function dt(t){if(t==null)return window;if(t.toString()!=="[object Window]"){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Yn(t){var e=dt(t).Element;return t instanceof e||t instanceof Element}function Dt(t){var e=dt(t).HTMLElement;return t instanceof e||t instanceof HTMLElement}function ts(t){if(typeof ShadowRoot>"u")return!1;var e=dt(t).ShadowRoot;return t instanceof e||t instanceof ShadowRoot}function t2(t){var e=t.state;Object.keys(e.elements).forEach(function(n){var r=e.styles[n]||{},i=e.attributes[n]||{},o=e.elements[n];!Dt(o)||!Ut(o)||(Object.assign(o.style,r),Object.keys(i).forEach(function(s){var l=i[s];l===!1?o.removeAttribute(s):o.setAttribute(s,l===!0?"":l)}))})}function n2(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow),function(){Object.keys(e.elements).forEach(function(r){var i=e.elements[r],o=e.attributes[r]||{},s=Object.keys(e.styles.hasOwnProperty(r)?e.styles[r]:n[r]),l=s.reduce(function(u,d){return u[d]="",u},{});!Dt(i)||!Ut(i)||(Object.assign(i.style,l),Object.keys(o).forEach(function(u){i.removeAttribute(u)}))})}}var da={name:"applyStyles",enabled:!0,phase:"write",fn:t2,effect:n2,requires:["computeStyles"]};function Wt(t){return t.split("-")[0]}var ar=Math.max,co=Math.min,Vr=Math.round;function ns(){var t=navigator.userAgentData;return t!=null&&t.brands&&Array.isArray(t.brands)?t.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function fa(){return!/^((?!chrome|android).)*safari/i.test(ns())}function Jn(t,e,n){e===void 0&&(e=!1),n===void 0&&(n=!1);var r=t.getBoundingClientRect(),i=1,o=1;e&&Dt(t)&&(i=t.offsetWidth>0&&Vr(r.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Vr(r.height)/t.offsetHeight||1);var s=Yn(t)?dt(t):window,l=s.visualViewport,u=!fa()&&n,d=(r.left+(u&&l?l.offsetLeft:0))/i,f=(r.top+(u&&l?l.offsetTop:0))/o,h=r.width/i,m=r.height/o;return{width:h,height:m,top:f,right:d+h,bottom:f+m,left:d,x:d,y:f}}function uo(t){var e=Jn(t),n=t.offsetWidth,r=t.offsetHeight;return Math.abs(e.width-n)<=1&&(n=e.width),Math.abs(e.height-r)<=1&&(r=e.height),{x:t.offsetLeft,y:t.offsetTop,width:n,height:r}}function pa(t,e){var n=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(n&&ts(n)){var r=e;do{if(r&&t.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function gn(t){return dt(t).getComputedStyle(t)}function Uh(t){return["table","td","th"].indexOf(Ut(t))>=0}function Xt(t){return((Yn(t)?t.ownerDocument:t.document)||window.document).documentElement}function Gr(t){return Ut(t)==="html"?t:t.assignedSlot||t.parentNode||(ts(t)?t.host:null)||Xt(t)}function Kw(t){return!Dt(t)||gn(t).position==="fixed"?null:t.offsetParent}function r2(t){var e=/firefox/i.test(ns()),n=/Trident/i.test(ns());if(n&&Dt(t)){var r=gn(t);if(r.position==="fixed")return null}var i=Gr(t);for(ts(i)&&(i=i.host);Dt(i)&&["html","body"].indexOf(Ut(i))<0;){var o=gn(i);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||e&&o.willChange==="filter"||e&&o.filter&&o.filter!=="none")return i;i=i.parentNode}return null}function lr(t){for(var e=dt(t),n=Kw(t);n&&Uh(n)&&gn(n).position==="static";)n=Kw(n);return n&&(Ut(n)==="html"||Ut(n)==="body"&&gn(n).position==="static")?e:n||r2(t)||e}function fo(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function po(t,e,n){return ar(t,co(e,n))}function Vw(t,e,n){var r=po(t,e,n);return r>n?n:r}function ha(){return{top:0,right:0,bottom:0,left:0}}function ma(t){return Object.assign({},ha(),t)}function ga(t,e){return e.reduce(function(n,r){return n[r]=t,n},{})}var i2=function(e,n){return e=typeof e=="function"?e(Object.assign({},n.rects,{placement:n.placement})):e,ma(typeof e!="number"?e:ga(e,_i))};function o2(t){var e,n=t.state,r=t.name,i=t.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,l=Wt(n.placement),u=fo(l),d=[wt,kt].indexOf(l)>=0,f=d?"height":"width";if(!(!o||!s)){var h=i2(i.padding,n),m=uo(o),b=u==="y"?yt:wt,y=u==="y"?Lt:kt,v=n.rects.reference[f]+n.rects.reference[u]-s[u]-n.rects.popper[f],x=s[u]-n.rects.reference[u],S=lr(o),D=S?u==="y"?S.clientHeight||0:S.clientWidth||0:0,L=v/2-x/2,T=h[b],z=D-m[f]-h[y],O=D/2-m[f]/2+L,Y=po(T,O,z),ie=u;n.modifiersData[r]=(e={},e[ie]=Y,e.centerOffset=Y-O,e)}}function s2(t){var e=t.state,n=t.options,r=n.element,i=r===void 0?"[data-popper-arrow]":r;i!=null&&(typeof i=="string"&&(i=e.elements.popper.querySelector(i),!i)||pa(e.elements.popper,i)&&(e.elements.arrow=i))}var Gw={name:"arrow",enabled:!0,phase:"main",fn:o2,effect:s2,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Xn(t){return t.split("-")[1]}var a2={top:"auto",right:"auto",bottom:"auto",left:"auto"};function l2(t,e){var n=t.x,r=t.y,i=e.devicePixelRatio||1;return{x:Vr(n*i)/i||0,y:Vr(r*i)/i||0}}function qw(t){var e,n=t.popper,r=t.popperRect,i=t.placement,o=t.variation,s=t.offsets,l=t.position,u=t.gpuAcceleration,d=t.adaptive,f=t.roundOffsets,h=t.isFixed,m=s.x,b=m===void 0?0:m,y=s.y,v=y===void 0?0:y,x=typeof f=="function"?f({x:b,y:v}):{x:b,y:v};b=x.x,v=x.y;var S=s.hasOwnProperty("x"),D=s.hasOwnProperty("y"),L=wt,T=yt,z=window;if(d){var O=lr(n),Y="clientHeight",ie="clientWidth";if(O===dt(n)&&(O=Xt(n),gn(O).position!=="static"&&l==="absolute"&&(Y="scrollHeight",ie="scrollWidth")),O=O,i===yt||(i===wt||i===kt)&&o===lo){T=Lt;var $=h&&O===z&&z.visualViewport?z.visualViewport.height:O[Y];v-=$-r.height,v*=u?1:-1}if(i===wt||(i===yt||i===Lt)&&o===lo){L=kt;var oe=h&&O===z&&z.visualViewport?z.visualViewport.width:O[ie];b-=oe-r.width,b*=u?1:-1}}var me=Object.assign({position:l},d&&a2),Te=f===!0?l2({x:b,y:v},dt(n)):{x:b,y:v};if(b=Te.x,v=Te.y,u){var ge;return Object.assign({},me,(ge={},ge[T]=D?"0":"",ge[L]=S?"0":"",ge.transform=(z.devicePixelRatio||1)<=1?"translate("+b+"px, "+v+"px)":"translate3d("+b+"px, "+v+"px, 0)",ge))}return Object.assign({},me,(e={},e[T]=D?v+"px":"",e[L]=S?b+"px":"",e.transform="",e))}function c2(t){var e=t.state,n=t.options,r=n.gpuAcceleration,i=r===void 0?!0:r,o=n.adaptive,s=o===void 0?!0:o,l=n.roundOffsets,u=l===void 0?!0:l,d={placement:Wt(e.placement),variation:Xn(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:i,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,qw(Object.assign({},d,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:u})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,qw(Object.assign({},d,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:u})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var Yw={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:c2,data:{}};var au={passive:!0};function u2(t){var e=t.state,n=t.instance,r=t.options,i=r.scroll,o=i===void 0?!0:i,s=r.resize,l=s===void 0?!0:s,u=dt(e.elements.popper),d=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&d.forEach(function(f){f.addEventListener("scroll",n.update,au)}),l&&u.addEventListener("resize",n.update,au),function(){o&&d.forEach(function(f){f.removeEventListener("scroll",n.update,au)}),l&&u.removeEventListener("resize",n.update,au)}}var Jw={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:u2,data:{}};var d2={left:"right",right:"left",bottom:"top",top:"bottom"};function rs(t){return t.replace(/left|right|bottom|top/g,function(e){return d2[e]})}var f2={start:"end",end:"start"};function lu(t){return t.replace(/start|end/g,function(e){return f2[e]})}function ho(t){var e=dt(t),n=e.pageXOffset,r=e.pageYOffset;return{scrollLeft:n,scrollTop:r}}function mo(t){return Jn(Xt(t)).left+ho(t).scrollLeft}function Wh(t,e){var n=dt(t),r=Xt(t),i=n.visualViewport,o=r.clientWidth,s=r.clientHeight,l=0,u=0;if(i){o=i.width,s=i.height;var d=fa();(d||!d&&e==="fixed")&&(l=i.offsetLeft,u=i.offsetTop)}return{width:o,height:s,x:l+mo(t),y:u}}function Kh(t){var e,n=Xt(t),r=ho(t),i=(e=t.ownerDocument)==null?void 0:e.body,o=ar(n.scrollWidth,n.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),s=ar(n.scrollHeight,n.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),l=-r.scrollLeft+mo(t),u=-r.scrollTop;return gn(i||n).direction==="rtl"&&(l+=ar(n.clientWidth,i?i.clientWidth:0)-o),{width:o,height:s,x:l,y:u}}function go(t){var e=gn(t),n=e.overflow,r=e.overflowX,i=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function cu(t){return["html","body","#document"].indexOf(Ut(t))>=0?t.ownerDocument.body:Dt(t)&&go(t)?t:cu(Gr(t))}function Si(t,e){var n;e===void 0&&(e=[]);var r=cu(t),i=r===((n=t.ownerDocument)==null?void 0:n.body),o=dt(r),s=i?[o].concat(o.visualViewport||[],go(r)?r:[]):r,l=e.concat(s);return i?l:l.concat(Si(Gr(s)))}function is(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function p2(t,e){var n=Jn(t,!1,e==="fixed");return n.top=n.top+t.clientTop,n.left=n.left+t.clientLeft,n.bottom=n.top+t.clientHeight,n.right=n.left+t.clientWidth,n.width=t.clientWidth,n.height=t.clientHeight,n.x=n.left,n.y=n.top,n}function Xw(t,e,n){return e===ou?is(Wh(t,n)):Yn(e)?p2(e,n):is(Kh(Xt(t)))}function h2(t){var e=Si(Gr(t)),n=["absolute","fixed"].indexOf(gn(t).position)>=0,r=n&&Dt(t)?lr(t):t;return Yn(r)?e.filter(function(i){return Yn(i)&&pa(i,r)&&Ut(i)!=="body"}):[]}function Vh(t,e,n,r){var i=e==="clippingParents"?h2(t):[].concat(e),o=[].concat(i,[n]),s=o[0],l=o.reduce(function(u,d){var f=Xw(t,d,r);return u.top=ar(f.top,u.top),u.right=co(f.right,u.right),u.bottom=co(f.bottom,u.bottom),u.left=ar(f.left,u.left),u},Xw(t,s,r));return l.width=l.right-l.left,l.height=l.bottom-l.top,l.x=l.left,l.y=l.top,l}function ba(t){var e=t.reference,n=t.element,r=t.placement,i=r?Wt(r):null,o=r?Xn(r):null,s=e.x+e.width/2-n.width/2,l=e.y+e.height/2-n.height/2,u;switch(i){case yt:u={x:s,y:e.y-n.height};break;case Lt:u={x:s,y:e.y+e.height};break;case kt:u={x:e.x+e.width,y:l};break;case wt:u={x:e.x-n.width,y:l};break;default:u={x:e.x,y:e.y}}var d=i?fo(i):null;if(d!=null){var f=d==="y"?"height":"width";switch(o){case Kr:u[d]=u[d]-(e[f]/2-n[f]/2);break;case lo:u[d]=u[d]+(e[f]/2-n[f]/2);break;default:}}return u}function cr(t,e){e===void 0&&(e={});var n=e,r=n.placement,i=r===void 0?t.placement:r,o=n.strategy,s=o===void 0?t.strategy:o,l=n.boundary,u=l===void 0?$w:l,d=n.rootBoundary,f=d===void 0?ou:d,h=n.elementContext,m=h===void 0?es:h,b=n.altBoundary,y=b===void 0?!1:b,v=n.padding,x=v===void 0?0:v,S=ma(typeof x!="number"?x:ga(x,_i)),D=m===es?Uw:es,L=t.rects.popper,T=t.elements[y?D:m],z=Vh(Yn(T)?T:T.contextElement||Xt(t.elements.popper),u,f,s),O=Jn(t.elements.reference),Y=ba({reference:O,element:L,strategy:"absolute",placement:i}),ie=is(Object.assign({},L,Y)),$=m===es?ie:O,oe={top:z.top-$.top+S.top,bottom:$.bottom-z.bottom+S.bottom,left:z.left-$.left+S.left,right:$.right-z.right+S.right},me=t.modifiersData.offset;if(m===es&&me){var Te=me[i];Object.keys(oe).forEach(function(ge){var Me=[kt,Lt].indexOf(ge)>=0?1:-1,Ee=[yt,Lt].indexOf(ge)>=0?"y":"x";oe[ge]+=Te[Ee]*Me})}return oe}function Gh(t,e){e===void 0&&(e={});var n=e,r=n.placement,i=n.boundary,o=n.rootBoundary,s=n.padding,l=n.flipVariations,u=n.allowedAutoPlacements,d=u===void 0?su:u,f=Xn(r),h=f?l?$h:$h.filter(function(y){return Xn(y)===f}):_i,m=h.filter(function(y){return d.indexOf(y)>=0});m.length===0&&(m=h);var b=m.reduce(function(y,v){return y[v]=cr(t,{placement:v,boundary:i,rootBoundary:o,padding:s})[Wt(v)],y},{});return Object.keys(b).sort(function(y,v){return b[y]-b[v]})}function m2(t){if(Wt(t)===iu)return[];var e=rs(t);return[lu(t),e,lu(e)]}function g2(t){var e=t.state,n=t.options,r=t.name;if(!e.modifiersData[r]._skip){for(var i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,l=s===void 0?!0:s,u=n.fallbackPlacements,d=n.padding,f=n.boundary,h=n.rootBoundary,m=n.altBoundary,b=n.flipVariations,y=b===void 0?!0:b,v=n.allowedAutoPlacements,x=e.options.placement,S=Wt(x),D=S===x,L=u||(D||!y?[rs(x)]:m2(x)),T=[x].concat(L).reduce(function(Ue,He){return Ue.concat(Wt(He)===iu?Gh(e,{placement:He,boundary:f,rootBoundary:h,padding:d,flipVariations:y,allowedAutoPlacements:v}):He)},[]),z=e.rects.reference,O=e.rects.popper,Y=new Map,ie=!0,$=T[0],oe=0;oe=0,Ee=Me?"width":"height",P=cr(e,{placement:me,boundary:f,rootBoundary:h,altBoundary:m,padding:d}),N=Me?ge?kt:wt:ge?Lt:yt;z[Ee]>O[Ee]&&(N=rs(N));var R=rs(N),V=[];if(o&&V.push(P[Te]<=0),l&&V.push(P[N]<=0,P[R]<=0),V.every(function(Ue){return Ue})){$=me,ie=!1;break}Y.set(me,V)}if(ie)for(var Q=y?3:1,he=function(He){var Xe=T.find(function(xt){var Pt=Y.get(xt);if(Pt)return Pt.slice(0,He).every(function(Le){return Le})});if(Xe)return $=Xe,"break"},xe=Q;xe>0;xe--){var $e=he(xe);if($e==="break")break}e.placement!==$&&(e.modifiersData[r]._skip=!0,e.placement=$,e.reset=!0)}}var Zw={name:"flip",enabled:!0,phase:"main",fn:g2,requiresIfExists:["offset"],data:{_skip:!1}};function jw(t,e,n){return n===void 0&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function Qw(t){return[yt,kt,Lt,wt].some(function(e){return t[e]>=0})}function b2(t){var e=t.state,n=t.name,r=e.rects.reference,i=e.rects.popper,o=e.modifiersData.preventOverflow,s=cr(e,{elementContext:"reference"}),l=cr(e,{altBoundary:!0}),u=jw(s,r),d=jw(l,i,o),f=Qw(u),h=Qw(d);e.modifiersData[n]={referenceClippingOffsets:u,popperEscapeOffsets:d,isReferenceHidden:f,hasPopperEscaped:h},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":f,"data-popper-escaped":h})}var ex={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:b2};function y2(t,e,n){var r=Wt(t),i=[wt,yt].indexOf(r)>=0?-1:1,o=typeof n=="function"?n(Object.assign({},e,{placement:t})):n,s=o[0],l=o[1];return s=s||0,l=(l||0)*i,[wt,kt].indexOf(r)>=0?{x:l,y:s}:{x:s,y:l}}function E2(t){var e=t.state,n=t.options,r=t.name,i=n.offset,o=i===void 0?[0,0]:i,s=su.reduce(function(f,h){return f[h]=y2(h,e.rects,o),f},{}),l=s[e.placement],u=l.x,d=l.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=d),e.modifiersData[r]=s}var tx={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:E2};function v2(t){var e=t.state,n=t.name;e.modifiersData[n]=ba({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var nx={name:"popperOffsets",enabled:!0,phase:"read",fn:v2,data:{}};function qh(t){return t==="x"?"y":"x"}function w2(t){var e=t.state,n=t.options,r=t.name,i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,l=s===void 0?!1:s,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.padding,m=n.tether,b=m===void 0?!0:m,y=n.tetherOffset,v=y===void 0?0:y,x=cr(e,{boundary:u,rootBoundary:d,padding:h,altBoundary:f}),S=Wt(e.placement),D=Xn(e.placement),L=!D,T=fo(S),z=qh(T),O=e.modifiersData.popperOffsets,Y=e.rects.reference,ie=e.rects.popper,$=typeof v=="function"?v(Object.assign({},e.rects,{placement:e.placement})):v,oe=typeof $=="number"?{mainAxis:$,altAxis:$}:Object.assign({mainAxis:0,altAxis:0},$),me=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,Te={x:0,y:0};if(O){if(o){var ge,Me=T==="y"?yt:wt,Ee=T==="y"?Lt:kt,P=T==="y"?"height":"width",N=O[T],R=N+x[Me],V=N-x[Ee],Q=b?-ie[P]/2:0,he=D===Kr?Y[P]:ie[P],xe=D===Kr?-ie[P]:-Y[P],$e=e.elements.arrow,Ue=b&&$e?uo($e):{width:0,height:0},He=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:ha(),Xe=He[Me],xt=He[Ee],Pt=po(0,Y[P],Ue[P]),Le=L?Y[P]/2-Q-Pt-Xe-oe.mainAxis:he-Pt-Xe-oe.mainAxis,_t=L?-Y[P]/2+Q+Pt+xt+oe.mainAxis:xe+Pt+xt+oe.mainAxis,Zt=e.elements.arrow&&lr(e.elements.arrow),st=Zt?T==="y"?Zt.clientTop||0:Zt.clientLeft||0:0,jt=(ge=me?.[T])!=null?ge:0,St=N+Le-jt-st,Nt=N+_t-jt,ft=po(b?co(R,St):R,N,b?ar(V,Nt):V);O[T]=ft,Te[T]=ft-N}if(l){var be,Kt=T==="x"?yt:wt,ee=T==="x"?Lt:kt,ke=O[z],We=z==="y"?"height":"width",Oe=ke+x[Kt],mt=ke-x[ee],Ot=[yt,wt].indexOf(S)!==-1,J=(be=me?.[z])!=null?be:0,ne=Ot?Oe:ke-Y[We]-ie[We]-J+oe.altAxis,H=Ot?ke+Y[We]+ie[We]-J-oe.altAxis:mt,q=b&&Ot?Vw(ne,ke,H):po(b?ne:Oe,ke,b?H:mt);O[z]=q,Te[z]=q-ke}e.modifiersData[r]=Te}}var rx={name:"preventOverflow",enabled:!0,phase:"main",fn:w2,requiresIfExists:["offset"]};function Yh(t){return{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}}function Jh(t){return t===dt(t)||!Dt(t)?ho(t):Yh(t)}function x2(t){var e=t.getBoundingClientRect(),n=Vr(e.width)/t.offsetWidth||1,r=Vr(e.height)/t.offsetHeight||1;return n!==1||r!==1}function Xh(t,e,n){n===void 0&&(n=!1);var r=Dt(e),i=Dt(e)&&x2(e),o=Xt(e),s=Jn(t,i,n),l={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(r||!r&&!n)&&((Ut(e)!=="body"||go(o))&&(l=Jh(e)),Dt(e)?(u=Jn(e,!0),u.x+=e.clientLeft,u.y+=e.clientTop):o&&(u.x=mo(o))),{x:s.left+l.scrollLeft-u.x,y:s.top+l.scrollTop-u.y,width:s.width,height:s.height}}function _2(t){var e=new Map,n=new Set,r=[];t.forEach(function(o){e.set(o.name,o)});function i(o){n.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(l){if(!n.has(l)){var u=e.get(l);u&&i(u)}}),r.push(o)}return t.forEach(function(o){n.has(o.name)||i(o)}),r}function Zh(t){var e=_2(t);return Ww.reduce(function(n,r){return n.concat(e.filter(function(i){return i.phase===r}))},[])}function jh(t){var e;return function(){return e||(e=new Promise(function(n){Promise.resolve().then(function(){e=void 0,n(t())})})),e}}function Qh(t){var e=t.reduce(function(n,r){var i=n[r.name];return n[r.name]=i?Object.assign({},i,r,{options:Object.assign({},i.options,r.options),data:Object.assign({},i.data,r.data)}):r,n},{});return Object.keys(e).map(function(n){return e[n]})}var ix={placement:"bottom",modifiers:[],strategy:"absolute"};function ox(){for(var t=arguments.length,e=new Array(t),n=0;n-1}function vx(t,e){return typeof t=="function"?t.apply(void 0,e):t}function ax(t,e){if(e===0)return t;var n;return function(r){clearTimeout(n),n=setTimeout(function(){t(r)},e)}}function C2(t){return t.split(/\s+/).filter(Boolean)}function ss(t){return[].concat(t)}function lx(t,e){t.indexOf(e)===-1&&t.push(e)}function k2(t){return t.filter(function(e,n){return t.indexOf(e)===n})}function A2(t){return t.split("-")[0]}function du(t){return[].slice.call(t)}function cx(t){return Object.keys(t).reduce(function(e,n){return t[n]!==void 0&&(e[n]=t[n]),e},{})}function ya(){return document.createElement("div")}function fu(t){return["Element","Fragment"].some(function(e){return am(t,e)})}function N2(t){return am(t,"NodeList")}function O2(t){return am(t,"MouseEvent")}function R2(t){return!!(t&&t._tippy&&t._tippy.reference===t)}function I2(t){return fu(t)?[t]:N2(t)?du(t):Array.isArray(t)?t:du(document.querySelectorAll(t))}function nm(t,e){t.forEach(function(n){n&&(n.style.transitionDuration=e+"ms")})}function ux(t,e){t.forEach(function(n){n&&n.setAttribute("data-state",e)})}function L2(t){var e,n=ss(t),r=n[0];return r!=null&&(e=r.ownerDocument)!=null&&e.body?r.ownerDocument:document}function D2(t,e){var n=e.clientX,r=e.clientY;return t.every(function(i){var o=i.popperRect,s=i.popperState,l=i.props,u=l.interactiveBorder,d=A2(s.placement),f=s.modifiersData.offset;if(!f)return!0;var h=d==="bottom"?f.top.y:0,m=d==="top"?f.bottom.y:0,b=d==="right"?f.left.x:0,y=d==="left"?f.right.x:0,v=o.top-r+h>u,x=r-o.bottom-m>u,S=o.left-n+b>u,D=n-o.right-y>u;return v||x||S||D})}function rm(t,e,n){var r=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach(function(i){t[r](i,n)})}function dx(t,e){for(var n=e;n;){var r;if(t.contains(n))return!0;n=n.getRootNode==null||(r=n.getRootNode())==null?void 0:r.host}return!1}var _r={isTouch:!1},fx=0;function P2(){_r.isTouch||(_r.isTouch=!0,window.performance&&document.addEventListener("mousemove",wx))}function wx(){var t=performance.now();t-fx<20&&(_r.isTouch=!1,document.removeEventListener("mousemove",wx)),fx=t}function B2(){var t=document.activeElement;if(R2(t)){var e=t._tippy;t.blur&&!e.state.isVisible&&t.blur()}}function F2(){document.addEventListener("touchstart",P2,bo),window.addEventListener("blur",B2)}var H2=typeof window<"u"&&typeof document<"u",z2=H2?!!window.msCrypto:!1;var $2={animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},U2={allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999},ur=Object.assign({appendTo:Ex,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},$2,U2),W2=Object.keys(ur),K2=function(e){var n=Object.keys(e);n.forEach(function(r){ur[r]=e[r]})};function xx(t){var e=t.plugins||[],n=e.reduce(function(r,i){var o=i.name,s=i.defaultValue;if(o){var l;r[o]=t[o]!==void 0?t[o]:(l=ur[o])!=null?l:s}return r},{});return Object.assign({},t,n)}function V2(t,e){var n=e?Object.keys(xx(Object.assign({},ur,{plugins:e}))):W2,r=n.reduce(function(i,o){var s=(t.getAttribute("data-tippy-"+o)||"").trim();if(!s)return i;if(o==="content")i[o]=s;else try{i[o]=JSON.parse(s)}catch{i[o]=s}return i},{});return r}function px(t,e){var n=Object.assign({},e,{content:vx(e.content,[t])},e.ignoreAttributes?{}:V2(t,e.plugins));return n.aria=Object.assign({},ur.aria,n.aria),n.aria={expanded:n.aria.expanded==="auto"?e.interactive:n.aria.expanded,content:n.aria.content==="auto"?e.interactive?null:"describedby":n.aria.content},n}var G2=function(){return"innerHTML"};function om(t,e){t[G2()]=e}function hx(t){var e=ya();return t===!0?e.className=bx:(e.className=yx,fu(t)?e.appendChild(t):om(e,t)),e}function mx(t,e){fu(e.content)?(om(t,""),t.appendChild(e.content)):typeof e.content!="function"&&(e.allowHTML?om(t,e.content):t.textContent=e.content)}function sm(t){var e=t.firstElementChild,n=du(e.children);return{box:e,content:n.find(function(r){return r.classList.contains(gx)}),arrow:n.find(function(r){return r.classList.contains(bx)||r.classList.contains(yx)}),backdrop:n.find(function(r){return r.classList.contains(M2)})}}function _x(t){var e=ya(),n=ya();n.className=T2,n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=ya();r.className=gx,r.setAttribute("data-state","hidden"),mx(r,t.props),e.appendChild(n),n.appendChild(r),i(t.props,t.props);function i(o,s){var l=sm(e),u=l.box,d=l.content,f=l.arrow;s.theme?u.setAttribute("data-theme",s.theme):u.removeAttribute("data-theme"),typeof s.animation=="string"?u.setAttribute("data-animation",s.animation):u.removeAttribute("data-animation"),s.inertia?u.setAttribute("data-inertia",""):u.removeAttribute("data-inertia"),u.style.maxWidth=typeof s.maxWidth=="number"?s.maxWidth+"px":s.maxWidth,s.role?u.setAttribute("role",s.role):u.removeAttribute("role"),(o.content!==s.content||o.allowHTML!==s.allowHTML)&&mx(d,t.props),s.arrow?f?o.arrow!==s.arrow&&(u.removeChild(f),u.appendChild(hx(s.arrow))):u.appendChild(hx(s.arrow)):f&&u.removeChild(f)}return{popper:e,onUpdate:i}}_x.$$tippy=!0;var q2=1,uu=[],im=[];function Y2(t,e){var n=px(t,Object.assign({},ur,xx(cx(e)))),r,i,o,s=!1,l=!1,u=!1,d=!1,f,h,m,b=[],y=ax(St,n.interactiveDebounce),v,x=q2++,S=null,D=k2(n.plugins),L={isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},T={id:x,reference:t,popper:ya(),popperInstance:S,props:n,state:L,plugins:D,clearDelayTimeouts:ne,setProps:H,setContent:q,show:ue,hide:Ce,hideWithInteractivity:ct,enable:Ot,disable:J,unmount:Vt,destroy:Ci};if(!n.render)return T;var z=n.render(T),O=z.popper,Y=z.onUpdate;O.setAttribute("data-tippy-root",""),O.id="tippy-"+T.id,T.popper=O,t._tippy=T,O._tippy=T;var ie=D.map(function(B){return B.fn(T)}),$=t.hasAttribute("aria-expanded");return Zt(),Q(),N(),R("onCreate",[T]),n.showOnCreate&&Oe(),O.addEventListener("mouseenter",function(){T.props.interactive&&T.state.isVisible&&T.clearDelayTimeouts()}),O.addEventListener("mouseleave",function(){T.props.interactive&&T.props.trigger.indexOf("mouseenter")>=0&&Me().addEventListener("mousemove",y)}),T;function oe(){var B=T.props.touch;return Array.isArray(B)?B:[B,0]}function me(){return oe()[0]==="hold"}function Te(){var B;return!!((B=T.props.render)!=null&&B.$$tippy)}function ge(){return v||t}function Me(){var B=ge().parentNode;return B?L2(B):document}function Ee(){return sm(O)}function P(B){return T.state.isMounted&&!T.state.isVisible||_r.isTouch||f&&f.type==="focus"?0:tm(T.props.delay,B?0:1,ur.delay)}function N(B){B===void 0&&(B=!1),O.style.pointerEvents=T.props.interactive&&!B?"":"none",O.style.zIndex=""+T.props.zIndex}function R(B,le,_e){if(_e===void 0&&(_e=!0),ie.forEach(function(Ve){Ve[B]&&Ve[B].apply(Ve,le)}),_e){var Ze;(Ze=T.props)[B].apply(Ze,le)}}function V(){var B=T.props.aria;if(B.content){var le="aria-"+B.content,_e=O.id,Ze=ss(T.props.triggerTarget||t);Ze.forEach(function(Ve){var Bt=Ve.getAttribute(le);if(T.state.isVisible)Ve.setAttribute(le,Bt?Bt+" "+_e:_e);else{var an=Bt&&Bt.replace(_e,"").trim();an?Ve.setAttribute(le,an):Ve.removeAttribute(le)}})}}function Q(){if(!($||!T.props.aria.expanded)){var B=ss(T.props.triggerTarget||t);B.forEach(function(le){T.props.interactive?le.setAttribute("aria-expanded",T.state.isVisible&&le===ge()?"true":"false"):le.removeAttribute("aria-expanded")})}}function he(){Me().removeEventListener("mousemove",y),uu=uu.filter(function(B){return B!==y})}function xe(B){if(!(_r.isTouch&&(u||B.type==="mousedown"))){var le=B.composedPath&&B.composedPath()[0]||B.target;if(!(T.props.interactive&&dx(O,le))){if(ss(T.props.triggerTarget||t).some(function(_e){return dx(_e,le)})){if(_r.isTouch||T.state.isVisible&&T.props.trigger.indexOf("click")>=0)return}else R("onClickOutside",[T,B]);T.props.hideOnClick===!0&&(T.clearDelayTimeouts(),T.hide(),l=!0,setTimeout(function(){l=!1}),T.state.isMounted||Xe())}}}function $e(){u=!0}function Ue(){u=!1}function He(){var B=Me();B.addEventListener("mousedown",xe,!0),B.addEventListener("touchend",xe,bo),B.addEventListener("touchstart",Ue,bo),B.addEventListener("touchmove",$e,bo)}function Xe(){var B=Me();B.removeEventListener("mousedown",xe,!0),B.removeEventListener("touchend",xe,bo),B.removeEventListener("touchstart",Ue,bo),B.removeEventListener("touchmove",$e,bo)}function xt(B,le){Le(B,function(){!T.state.isVisible&&O.parentNode&&O.parentNode.contains(O)&&le()})}function Pt(B,le){Le(B,le)}function Le(B,le){var _e=Ee().box;function Ze(Ve){Ve.target===_e&&(rm(_e,"remove",Ze),le())}if(B===0)return le();rm(_e,"remove",h),rm(_e,"add",Ze),h=Ze}function _t(B,le,_e){_e===void 0&&(_e=!1);var Ze=ss(T.props.triggerTarget||t);Ze.forEach(function(Ve){Ve.addEventListener(B,le,_e),b.push({node:Ve,eventType:B,handler:le,options:_e})})}function Zt(){me()&&(_t("touchstart",jt,{passive:!0}),_t("touchend",Nt,{passive:!0})),C2(T.props.trigger).forEach(function(B){if(B!=="manual")switch(_t(B,jt),B){case"mouseenter":_t("mouseleave",Nt);break;case"focus":_t(z2?"focusout":"blur",ft);break;case"focusin":_t("focusout",ft);break}})}function st(){b.forEach(function(B){var le=B.node,_e=B.eventType,Ze=B.handler,Ve=B.options;le.removeEventListener(_e,Ze,Ve)}),b=[]}function jt(B){var le,_e=!1;if(!(!T.state.isEnabled||be(B)||l)){var Ze=((le=f)==null?void 0:le.type)==="focus";f=B,v=B.currentTarget,Q(),!T.state.isVisible&&O2(B)&&uu.forEach(function(Ve){return Ve(B)}),B.type==="click"&&(T.props.trigger.indexOf("mouseenter")<0||s)&&T.props.hideOnClick!==!1&&T.state.isVisible?_e=!0:Oe(B),B.type==="click"&&(s=!_e),_e&&!Ze&&mt(B)}}function St(B){var le=B.target,_e=ge().contains(le)||O.contains(le);if(!(B.type==="mousemove"&&_e)){var Ze=We().concat(O).map(function(Ve){var Bt,an=Ve._tippy,Yr=(Bt=an.popperInstance)==null?void 0:Bt.state;return Yr?{popperRect:Ve.getBoundingClientRect(),popperState:Yr,props:n}:null}).filter(Boolean);D2(Ze,B)&&(he(),mt(B))}}function Nt(B){var le=be(B)||T.props.trigger.indexOf("click")>=0&&s;if(!le){if(T.props.interactive){T.hideWithInteractivity(B);return}mt(B)}}function ft(B){T.props.trigger.indexOf("focusin")<0&&B.target!==ge()||T.props.interactive&&B.relatedTarget&&O.contains(B.relatedTarget)||mt(B)}function be(B){return _r.isTouch?me()!==B.type.indexOf("touch")>=0:!1}function Kt(){ee();var B=T.props,le=B.popperOptions,_e=B.placement,Ze=B.offset,Ve=B.getReferenceClientRect,Bt=B.moveTransition,an=Te()?sm(O).arrow:null,Yr=Ve?{getBoundingClientRect:Ve,contextElement:Ve.contextElement||ge()}:t,Ca={name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(ki){var Jr=ki.state;if(Te()){var Lu=Ee(),gs=Lu.box;["placement","reference-hidden","escaped"].forEach(function(Xr){Xr==="placement"?gs.setAttribute("data-placement",Jr.placement):Jr.attributes.popper["data-popper-"+Xr]?gs.setAttribute("data-"+Xr,""):gs.removeAttribute("data-"+Xr)}),Jr.attributes.popper={}}}},Sr=[{name:"offset",options:{offset:Ze}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!Bt}},Ca];Te()&&an&&Sr.push({name:"arrow",options:{element:an,padding:3}}),Sr.push.apply(Sr,le?.modifiers||[]),T.popperInstance=em(Yr,O,Object.assign({},le,{placement:_e,onFirstUpdate:m,modifiers:Sr}))}function ee(){T.popperInstance&&(T.popperInstance.destroy(),T.popperInstance=null)}function ke(){var B=T.props.appendTo,le,_e=ge();T.props.interactive&&B===Ex||B==="parent"?le=_e.parentNode:le=vx(B,[_e]),le.contains(O)||le.appendChild(O),T.state.isMounted=!0,Kt()}function We(){return du(O.querySelectorAll("[data-tippy-root]"))}function Oe(B){T.clearDelayTimeouts(),B&&R("onTrigger",[T,B]),He();var le=P(!0),_e=oe(),Ze=_e[0],Ve=_e[1];_r.isTouch&&Ze==="hold"&&Ve&&(le=Ve),le?r=setTimeout(function(){T.show()},le):T.show()}function mt(B){if(T.clearDelayTimeouts(),R("onUntrigger",[T,B]),!T.state.isVisible){Xe();return}if(!(T.props.trigger.indexOf("mouseenter")>=0&&T.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(B.type)>=0&&s)){var le=P(!1);le?i=setTimeout(function(){T.state.isVisible&&T.hide()},le):o=requestAnimationFrame(function(){T.hide()})}}function Ot(){T.state.isEnabled=!0}function J(){T.hide(),T.state.isEnabled=!1}function ne(){clearTimeout(r),clearTimeout(i),cancelAnimationFrame(o)}function H(B){if(!T.state.isDestroyed){R("onBeforeUpdate",[T,B]),st();var le=T.props,_e=px(t,Object.assign({},le,cx(B),{ignoreAttributes:!0}));T.props=_e,Zt(),le.interactiveDebounce!==_e.interactiveDebounce&&(he(),y=ax(St,_e.interactiveDebounce)),le.triggerTarget&&!_e.triggerTarget?ss(le.triggerTarget).forEach(function(Ze){Ze.removeAttribute("aria-expanded")}):_e.triggerTarget&&t.removeAttribute("aria-expanded"),Q(),N(),Y&&Y(le,_e),T.popperInstance&&(Kt(),We().forEach(function(Ze){requestAnimationFrame(Ze._tippy.popperInstance.forceUpdate)})),R("onAfterUpdate",[T,B])}}function q(B){T.setProps({content:B})}function ue(){var B=T.state.isVisible,le=T.state.isDestroyed,_e=!T.state.isEnabled,Ze=_r.isTouch&&!T.props.touch,Ve=tm(T.props.duration,0,ur.duration);if(!(B||le||_e||Ze)&&!ge().hasAttribute("disabled")&&(R("onShow",[T],!1),T.props.onShow(T)!==!1)){if(T.state.isVisible=!0,Te()&&(O.style.visibility="visible"),N(),He(),T.state.isMounted||(O.style.transition="none"),Te()){var Bt=Ee(),an=Bt.box,Yr=Bt.content;nm([an,Yr],0)}m=function(){var Sr;if(!(!T.state.isVisible||d)){if(d=!0,O.offsetHeight,O.style.transition=T.props.moveTransition,Te()&&T.props.animation){var ms=Ee(),ki=ms.box,Jr=ms.content;nm([ki,Jr],Ve),ux([ki,Jr],"visible")}V(),Q(),lx(im,T),(Sr=T.popperInstance)==null||Sr.forceUpdate(),R("onMount",[T]),T.props.animation&&Te()&&Pt(Ve,function(){T.state.isShown=!0,R("onShown",[T])})}},ke()}}function Ce(){var B=!T.state.isVisible,le=T.state.isDestroyed,_e=!T.state.isEnabled,Ze=tm(T.props.duration,1,ur.duration);if(!(B||le||_e)&&(R("onHide",[T],!1),T.props.onHide(T)!==!1)){if(T.state.isVisible=!1,T.state.isShown=!1,d=!1,s=!1,Te()&&(O.style.visibility="hidden"),he(),Xe(),N(!0),Te()){var Ve=Ee(),Bt=Ve.box,an=Ve.content;T.props.animation&&(nm([Bt,an],Ze),ux([Bt,an],"hidden"))}V(),Q(),T.props.animation?Te()&&xt(Ze,T.unmount):T.unmount()}}function ct(B){Me().addEventListener("mousemove",y),lx(uu,y),y(B)}function Vt(){T.state.isVisible&&T.hide(),T.state.isMounted&&(ee(),We().forEach(function(B){B._tippy.unmount()}),O.parentNode&&O.parentNode.removeChild(O),im=im.filter(function(B){return B!==T}),T.state.isMounted=!1,R("onHidden",[T]))}function Ci(){T.state.isDestroyed||(T.clearDelayTimeouts(),T.unmount(),st(),delete t._tippy,T.state.isDestroyed=!0,R("onDestroy",[T]))}}function Ea(t,e){e===void 0&&(e={});var n=ur.plugins.concat(e.plugins||[]);F2();var r=Object.assign({},e,{plugins:n}),i=I2(t);if(0)var o,s;var l=i.reduce(function(u,d){var f=d&&Y2(d,r);return f&&u.push(f),u},[]);return fu(t)?l[0]:l}Ea.defaultProps=ur;Ea.setDefaultProps=K2;Ea.currentInput=_r;var WV=Object.assign({},da,{effect:function(e){var n=e.state,r={popper:{position:n.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(n.elements.popper.style,r.popper),n.styles=r,n.elements.arrow&&Object.assign(n.elements.arrow.style,r.arrow)}});Ea.setDefaultProps({render:_x});var as=Ea;var lm=class{constructor({editor:e,element:n,view:r,tippyOptions:i={},updateDelay:o=250,shouldShow:s}){dn(this,"shouldShow",({view:e,state:n,from:r,to:i})=>{let{doc:o,selection:s}=n,{empty:l}=s,u=!o.textBetween(r,i).length&&ec(n.selection),d=this.element.contains(document.activeElement);return!(!(e.hasFocus()||d)||l||u||!this.editor.isEditable)});dn(this,"mousedownHandler",()=>{this.preventHide=!0});dn(this,"dragstartHandler",()=>{this.hide()});dn(this,"focusHandler",()=>{setTimeout(()=>this.update(this.editor.view))});dn(this,"blurHandler",({event:e})=>{if(this.preventHide){this.preventHide=!1;return}e?.relatedTarget&&this.element.parentNode?.contains(e.relatedTarget)||this.hide()});dn(this,"tippyBlurHandler",e=>{this.blurHandler({event:e})});dn(this,"handleDebouncedUpdate",(e,n)=>{let r=!n?.selection.eq(e.state.selection),i=!n?.doc.eq(e.state.doc);!r&&!i||(this.updateDebounceTimer&&clearTimeout(this.updateDebounceTimer),this.updateDebounceTimer=window.setTimeout(()=>{this.updateHandler(e,r,i,n)},this.updateDelay))});dn(this,"updateHandler",(e,n,r,i)=>{let{state:o,composing:s}=e,{selection:l}=o;if(s||!n&&!r)return;this.createTooltip();let{ranges:d}=l,f=Math.min(...d.map(b=>b.$from.pos)),h=Math.max(...d.map(b=>b.$to.pos));if(!this.shouldShow?.({editor:this.editor,view:e,state:o,oldState:i,from:f,to:h})){this.hide();return}o.selection.$anchor.pos!==i?.selection.$anchor.pos&&this.update(e,o),this.tippy?.setProps({getReferenceClientRect:this.tippyOptions?.getReferenceClientRect||(()=>{if(HE(o.selection)){let b=e.nodeDOM(f),y=b.dataset.nodeViewWrapper?b:b.querySelector("[data-node-view-wrapper]");if(y&&(b=y.firstChild),b)return b.getBoundingClientRect()}return ic(e,f,h)})}),this.show()});this.editor=e,this.element=n,this.view=r,this.updateDelay=o,s&&(this.shouldShow=s),this.element.addEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.addEventListener("dragstart",this.dragstartHandler),this.editor.on("focus",this.focusHandler),this.editor.on("blur",this.blurHandler),this.tippyOptions=i,this.element.style.visibility="hidden",this.element.style.position="absolute"}createTooltip(){let{element:e}=this.editor.options,n=!!e.parentElement;this.tippy||!n||(this.tippy=as(e,{duration:0,getReferenceClientRect:null,content:this.element,interactive:!0,trigger:"manual",placement:"top",hideOnClick:"toggle",...this.tippyOptions}),this.tippy.popper.firstChild&&this.tippy.popper.firstChild.addEventListener("blur",this.tippyBlurHandler))}update(e,n){let{state:r}=e,i=r.selection.$from.pos!==r.selection.$to.pos;if(this.updateDelay>0&&i){this.handleDebouncedUpdate(e,n);return}let o=!n?.selection.eq(e.state.selection),s=!n?.doc.eq(e.state.doc);this.updateHandler(e,o,s,n)}show(){this.element.style.position="relative",this.element.style.visibility="visible",this.tippy?.show()}hide(){this.element.style.position="absolute",this.element.style.visibility="hidden",this.tippy?.hide()}destroy(){this.tippy?.popper.firstChild&&this.tippy.popper.firstChild.removeEventListener("blur",this.tippyBlurHandler),this.tippy?.destroy(),this.element.removeEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.view.dom.removeEventListener("dragstart",this.dragstartHandler),this.editor.off("focus",this.focusHandler),this.editor.off("blur",this.blurHandler)}},Sx=t=>new Pe({key:typeof t.pluginKey=="string"?new qe(t.pluginKey):t.pluginKey,view:e=>new lm({view:e,...t})});var va=Je.create({name:"bubbleMenu",addOptions(){return{element:null,tippyOptions:{},pluginKey:"bubbleMenu",updateDelay:void 0,shouldShow:null}},addProseMirrorPlugins(){return this.options.element?[Sx({pluginKey:this.options.pluginKey,editor:this.editor,element:this.options.element,tippyOptions:this.options.tippyOptions,updateDelay:this.options.updateDelay,shouldShow:this.options.shouldShow})]:[]}});var cm=class{constructor({editor:e,element:n,view:r,tippyOptions:i={},shouldShow:o}){dn(this,"shouldShow",({view:e,state:n})=>{let{selection:r}=n,{$anchor:i,empty:o}=r,s=i.depth===1,l=i.parent.isTextblock&&!i.parent.type.spec.code&&!i.parent.textContent;return!(!e.hasFocus()||!o||!s||!l||!this.editor.isEditable)});dn(this,"mousedownHandler",()=>{this.preventHide=!0});dn(this,"focusHandler",()=>{setTimeout(()=>this.update(this.editor.view))});dn(this,"blurHandler",({event:e})=>{if(this.preventHide){this.preventHide=!1;return}e?.relatedTarget&&this.element.parentNode?.contains(e.relatedTarget)||this.hide()});dn(this,"tippyBlurHandler",e=>{this.blurHandler({event:e})});this.editor=e,this.element=n,this.view=r,o&&(this.shouldShow=o),this.element.addEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.editor.on("focus",this.focusHandler),this.editor.on("blur",this.blurHandler),this.tippyOptions=i,this.element.style.visibility="hidden",this.element.style.position="absolute"}createTooltip(){let{element:e}=this.editor.options,n=!!e.parentElement;this.tippy||!n||(this.tippy=as(e,{duration:0,getReferenceClientRect:null,content:this.element,interactive:!0,trigger:"manual",placement:"right",hideOnClick:"toggle",...this.tippyOptions}),this.tippy.popper.firstChild&&this.tippy.popper.firstChild.addEventListener("blur",this.tippyBlurHandler))}update(e,n){let{state:r}=e,{doc:i,selection:o}=r,{from:s,to:l}=o;if(n&&n.doc.eq(i)&&n.selection.eq(o))return;if(this.createTooltip(),!this.shouldShow?.({editor:this.editor,view:e,state:r,oldState:n})){this.hide();return}this.tippy?.setProps({getReferenceClientRect:this.tippyOptions?.getReferenceClientRect||(()=>ic(e,s,l))}),this.show()}show(){this.element.style.position="relative",this.element.style.visibility="visible",this.tippy?.show()}hide(){this.tippy?.hide()}destroy(){this.tippy?.popper.firstChild&&this.tippy.popper.firstChild.removeEventListener("blur",this.tippyBlurHandler),this.tippy?.destroy(),this.element.removeEventListener("mousedown",this.mousedownHandler,{capture:!0}),this.editor.off("focus",this.focusHandler),this.editor.off("blur",this.blurHandler)}},Tx=t=>new Pe({key:typeof t.pluginKey=="string"?new qe(t.pluginKey):t.pluginKey,view:e=>new cm({view:e,...t})});var um=Je.create({name:"floatingMenu",addOptions(){return{element:null,tippyOptions:{},pluginKey:"floatingMenu",shouldShow:null}},addProseMirrorPlugins(){return this.options.element?[Tx({pluginKey:this.options.pluginKey,editor:this.editor,element:this.options.element,tippyOptions:this.options.tippyOptions,shouldShow:this.options.shouldShow})]:[]}});function pu(t,e,n=null){return n?t.createChecked({"data-col-span":e},n):t.createAndFill({"data-col-span":e})}function Mx(t){if(t.cached.gridBuilderNodeTypes)return t.cached.gridBuilderNodeTypes;let e={};return Object.keys(t.nodes).forEach(n=>{let r=t.nodes[n];r.spec.gridBuilderRole&&(e[r.spec.gridBuilderRole]=r)}),t.cached.gridBuilderNodeTypes=e,e}function Cx(t,e,n,r,i,o,s){let l=Mx(t),u=[];if(n==="asymmetric")u.push(pu(l.builderColumn,i,s)),u.push(pu(l.builderColumn,o,s));else for(let d=0;dt.getAttribute("data-type")},"data-cols":{default:2,parseHTML:t=>t.getAttribute("data-cols")},"data-stack-at":{default:"md",parseHTML:t=>t.getAttribute("data-stack-at")},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-template-columns: repeat(${t["data-cols"]}, 1fr);`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid-builder")&&null}]},renderHTML({HTMLAttributes:t}){return["div",Z(this.options.HTMLAttributes,t),0]},addCommands(){return{insertGridBuilder:({cols:t=3,type:e="responsive",stackAt:n,asymmetricLeft:r=null,asymmetricRight:i=null}={})=>({tr:o,dispatch:s,editor:l})=>{let u=Cx(l.schema,t,e,n,r,i);if(s){let d=o.selection.anchor+1;o.replaceSelectionWith(u).scrollIntoView().setSelection(ce.near(o.doc.resolve(d)))}return!0}}},addKeyboardShortcuts(){return{"Mod-Alt-G":()=>this.editor.commands.insertGridBuilder()}},extendNodeSchema(t){let e={name:t.name,options:t.options,storage:t.storage};return{gridBuilderRole:Se(re(t,"gridBuilderRole",e))}}});var fm=ae.create({name:"gridBuilderColumn",content:"block+",gridBuilderRole:"builderColumn",isolating:!0,addOptions(){return{HTMLAttributes:{class:"filament-tiptap-grid-builder__column"}}},addAttributes(){return{"data-col-span":{default:1,parseHTML:t=>t.getAttribute("data-col-span")},style:{default:null,parseHTML:t=>t.getAttribute("style"),renderHTML:t=>({style:`grid-column: span ${t["data-col-span"]};`})}}},parseHTML(){return[{tag:"div",getAttrs:t=>t.classList.contains("filament-tiptap-grid-builder__column")&&null}]},renderHTML({HTMLAttributes:t}){return["div",Z(this.options.HTMLAttributes,t),0]}});var pm=Je.create({name:"dragAndDrop",addProseMirrorPlugins(t){return[new Pe({props:{handleDrop(e,n){if(!n)return!1;n.preventDefault();let r=e.posAtCoords({left:n.clientX,top:n.clientY});return n.dataTransfer.getData("block")?(n.target.dispatchEvent(new CustomEvent("dragged-block",{detail:{type:n.dataTransfer.getData("block"),coordinates:r},bubbles:!0})),!1):(n.dataTransfer.getData("mergeTag")&&n.target.dispatchEvent(new CustomEvent("dragged-merge-tag",{detail:{tag:n.dataTransfer.getData("mergeTag"),coordinates:r},bubbles:!0})),!1)}}})]}});var hm=ae.create({name:"tiptapBlock",group:"block",atom:!0,defining:!0,draggable:!0,selectable:!0,isolating:!0,allowGapCursor:!0,inline:!1,addAttributes(){return{preview:{default:null,parseHTML:t=>t.getAttribute("data-preview"),renderHTML:t=>t.preview?{"data-preview":t.preview}:null},statePath:{default:null,parseHTML:t=>t.getAttribute("data-state-path"),renderHTML:t=>t.statePath?{"data-state-path":t.statePath}:null},type:{default:null,parseHTML:t=>t.getAttribute("data-type"),renderHTML:t=>t.type?{"data-type":t.type}:null},label:{default:null,parseHTML:t=>t.getAttribute("data-label"),renderHTML:t=>t.label?{"data-label":t.label}:null},data:{default:null,parseHTML:t=>t.getAttribute("data-data"),renderHTML:t=>t.data?{"data-data":JSON.stringify(t.data)}:null}}},parseHTML(){return[{tag:"tiptap-block"}]},renderHTML({HTMLAttributes:t}){return["tiptap-block",Z(t)]},addNodeView(){return({node:t})=>{let e=document.createElement("div");e.contentEditable="false",e.classList.add("tiptap-block-wrapper");let n=typeof t.attrs.data=="object"?JSON.stringify(t.attrs.data):t.attrs.data;return e.innerHTML=`
-

${node.attrs.label}

+

${t.attrs.label}

- ${node.attrs.preview} + ${t.attrs.preview}
- `; - return { - dom - }; - }; - }, - addCommands() { - return { - insertBlock: (attributes) => ({ chain, state }) => { - const currentChain = chain(); - if (![null, void 0].includes(attributes.coordinates?.pos)) { - currentChain.insertContentAt({ from: attributes.coordinates.pos, to: attributes.coordinates.pos }, { type: this.name, attrs: attributes }); - return currentChain.setTextSelection(attributes.coordinates.pos); - } - const { selection } = state; - const { $from, $to } = selection; - const range = $from.blockRange($to); - if (!range) { - if ($to.parentOffset === 0) { - currentChain.insertContentAt(Math.max($to.pos - 1, 0), { type: "paragraph" }).insertContentAt({ from: $from.pos, to: $to.pos }, { type: this.name, attrs: attributes }); - } else { - currentChain.setNode({ type: "paragraph" }).insertContentAt({ from: $from.pos, to: $to.pos }, { type: this.name, attrs: attributes }); - } - return currentChain.setTextSelection($to.pos + 1); - } else { - if ($to.parentOffset === 0) { - currentChain.insertContentAt(Math.max($to.pos - 1, 0), { type: this.name, attrs: attributes }); - } else { - currentChain.insertContentAt({ from: range.start, to: range.end }, { type: this.name, attrs: attributes }); - } - return currentChain.setTextSelection(range.end); - } - }, - updateBlock: (attributes) => ({ chain, state }) => { - const { selection } = state; - const { $from, $to } = selection; - const range = $from.blockRange($to); - if (!range) { - return false; - } - const currentChain = chain(); - currentChain.insertContentAt({ from: range.start, to: range.end }, { type: this.name, attrs: attributes }); - return currentChain.focus(range.end + 1); - }, - removeBlock: () => ({ commands: commands2 }) => { - return commands2.deleteSelection(); - } - }; - } -}); - -// node_modules/@tiptap/suggestion/dist/index.js -function findSuggestionMatch(config) { - var _a; - const { char, allowSpaces, allowedPrefixes, startOfLine, $position } = config; - const escapedChar = escapeForRegEx(char); - const suffix = new RegExp(`\\s${escapedChar}$`); - const prefix = startOfLine ? "^" : ""; - const regexp = allowSpaces ? new RegExp(`${prefix}${escapedChar}.*?(?=\\s${escapedChar}|$)`, "gm") : new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${escapedChar}]*`, "gm"); - const text = ((_a = $position.nodeBefore) === null || _a === void 0 ? void 0 : _a.isText) && $position.nodeBefore.text; - if (!text) { - return null; - } - const textFrom = $position.pos - text.length; - const match = Array.from(text.matchAll(regexp)).pop(); - if (!match || match.input === void 0 || match.index === void 0) { - return null; - } - const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index); - const matchPrefixIsAllowed = new RegExp(`^[${allowedPrefixes === null || allowedPrefixes === void 0 ? void 0 : allowedPrefixes.join("")}\0]?$`).test(matchPrefix); - if (allowedPrefixes !== null && !matchPrefixIsAllowed) { - return null; - } - const from2 = textFrom + match.index; - let to = from2 + match[0].length; - if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) { - match[0] += " "; - to += 1; - } - if (from2 < $position.pos && to >= $position.pos) { - return { - range: { - from: from2, - to - }, - query: match[0].slice(char.length), - text: match[0] - }; - } - return null; -} -var SuggestionPluginKey = new PluginKey("suggestion"); -function Suggestion({ pluginKey = SuggestionPluginKey, editor, char = "@", allowSpaces = false, allowedPrefixes = [" "], startOfLine = false, decorationTag = "span", decorationClass = "suggestion", command: command2 = () => null, items = () => [], render: render2 = () => ({}), allow = () => true }) { - let props; - const renderer = render2 === null || render2 === void 0 ? void 0 : render2(); - const plugin = new Plugin({ - key: pluginKey, - view() { - return { - update: async (view, prevState) => { - var _a, _b, _c, _d, _e, _f, _g; - const prev = (_a = this.key) === null || _a === void 0 ? void 0 : _a.getState(prevState); - const next = (_b = this.key) === null || _b === void 0 ? void 0 : _b.getState(view.state); - const moved = prev.active && next.active && prev.range.from !== next.range.from; - const started = !prev.active && next.active; - const stopped = prev.active && !next.active; - const changed = !started && !stopped && prev.query !== next.query; - const handleStart = started || moved; - const handleChange = changed && !moved; - const handleExit = stopped || moved; - if (!handleStart && !handleChange && !handleExit) { - return; - } - const state = handleExit && !handleStart ? prev : next; - const decorationNode = view.dom.querySelector(`[data-decoration-id="${state.decorationId}"]`); - props = { - editor, - range: state.range, - query: state.query, - text: state.text, - items: [], - command: (commandProps) => { - command2({ - editor, - range: state.range, - props: commandProps - }); - }, - decorationNode, - // virtual node for popper.js or tippy.js - // this can be used for building popups without a DOM node - clientRect: decorationNode ? () => { - var _a2; - const { decorationId } = (_a2 = this.key) === null || _a2 === void 0 ? void 0 : _a2.getState(editor.state); - const currentDecorationNode = view.dom.querySelector(`[data-decoration-id="${decorationId}"]`); - return (currentDecorationNode === null || currentDecorationNode === void 0 ? void 0 : currentDecorationNode.getBoundingClientRect()) || null; - } : null - }; - if (handleStart) { - (_c = renderer === null || renderer === void 0 ? void 0 : renderer.onBeforeStart) === null || _c === void 0 ? void 0 : _c.call(renderer, props); - } - if (handleChange) { - (_d = renderer === null || renderer === void 0 ? void 0 : renderer.onBeforeUpdate) === null || _d === void 0 ? void 0 : _d.call(renderer, props); - } - if (handleChange || handleStart) { - props.items = await items({ - editor, - query: state.query - }); - } - if (handleExit) { - (_e = renderer === null || renderer === void 0 ? void 0 : renderer.onExit) === null || _e === void 0 ? void 0 : _e.call(renderer, props); - } - if (handleChange) { - (_f = renderer === null || renderer === void 0 ? void 0 : renderer.onUpdate) === null || _f === void 0 ? void 0 : _f.call(renderer, props); - } - if (handleStart) { - (_g = renderer === null || renderer === void 0 ? void 0 : renderer.onStart) === null || _g === void 0 ? void 0 : _g.call(renderer, props); - } - }, - destroy: () => { - var _a; - if (!props) { - return; - } - (_a = renderer === null || renderer === void 0 ? void 0 : renderer.onExit) === null || _a === void 0 ? void 0 : _a.call(renderer, props); - } - }; - }, - state: { - // Initialize the plugin's internal state. - init() { - const state = { - active: false, - range: { - from: 0, - to: 0 - }, - query: null, - text: null, - composing: false - }; - return state; - }, - // Apply changes to the plugin state from a view transaction. - apply(transaction, prev, oldState, state) { - const { isEditable } = editor; - const { composing } = editor.view; - const { selection } = transaction; - const { empty: empty2, from: from2 } = selection; - const next = { ...prev }; - next.composing = composing; - if (isEditable && (empty2 || editor.view.composing)) { - if ((from2 < prev.range.from || from2 > prev.range.to) && !composing && !prev.composing) { - next.active = false; - } - const match = findSuggestionMatch({ - char, - allowSpaces, - allowedPrefixes, - startOfLine, - $position: selection.$from - }); - const decorationId = `id_${Math.floor(Math.random() * 4294967295)}`; - if (match && allow({ editor, state, range: match.range })) { - next.active = true; - next.decorationId = prev.decorationId ? prev.decorationId : decorationId; - next.range = match.range; - next.query = match.query; - next.text = match.text; - } else { - next.active = false; - } - } else { - next.active = false; - } - if (!next.active) { - next.decorationId = null; - next.range = { from: 0, to: 0 }; - next.query = null; - next.text = null; - } - return next; - } - }, - props: { - // Call the keydown hook if suggestion is active. - handleKeyDown(view, event) { - var _a; - const { active, range } = plugin.getState(view.state); - if (!active) { - return false; - } - return ((_a = renderer === null || renderer === void 0 ? void 0 : renderer.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(renderer, { view, event, range })) || false; - }, - // Setup decorator on the currently active suggestion. - decorations(state) { - const { active, range, decorationId } = plugin.getState(state); - if (!active) { - return null; - } - return DecorationSet.create(state.doc, [ - Decoration.inline(range.from, range.to, { - nodeName: decorationTag, - class: decorationClass, - "data-decoration-id": decorationId - }) - ]); - } - } - }); - return plugin; -} - -// resources/js/extensions/MergeTag.js -var MergeTagPluginKey = new PluginKey("mergeTag"); -var MergeTag = Node2.create({ - name: "mergeTag", - group: "inline", - inline: true, - selectable: false, - atom: true, - addAttributes() { - return { - id: { - default: null, - parseHTML: (element) => element.getAttribute("data-id"), - renderHTML: (attributes) => { - if (!attributes.id) { - return {}; - } - return { - "data-id": attributes.id - }; - } - } - }; - }, - parseHTML() { - return [ - { - tag: `span[data-type='${this.name}']` - } - ]; - }, - renderHTML({ node, HTMLAttributes }) { - return [ - "span", - mergeAttributes( - { "data-type": this.name }, - HTMLAttributes - ), - `{{ ${node.attrs.id} }}` - ]; - }, - renderText({ node }) { - return `{{ ${node.attrs.id} }}`; - }, - addKeyboardShortcuts() { - return { - Backspace: () => this.editor.commands.command(({ tr: tr2, state }) => { - let isMergeTag = false; - const { selection } = state; - const { empty: empty2, anchor } = selection; - if (!empty2) { - return false; - } - state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => { - if (node.type.name === this.name) { - isMergeTag = true; - tr2.insertText( - "{{", - pos, - pos + node.nodeSize - ); - return false; - } - }); - return isMergeTag; - }) - }; - }, - addCommands() { - return { - insertMergeTag: (attributes) => ({ chain, state }) => { - const currentChain = chain(); - if (![null, void 0].includes(attributes.coordinates?.pos)) { - currentChain.insertContentAt( - { from: attributes.coordinates.pos, to: attributes.coordinates.pos }, - [ - { type: this.name, attrs: { id: attributes.tag } }, - { type: "text", text: " " } - ] - ); - return currentChain; - } - } - }; - }, - addProseMirrorPlugins() { - return [ - Suggestion({ - editor: this.editor, - char: "{{", - items: ({ query }) => this.options.mergeTags.filter((item) => item.toLowerCase().startsWith(query.toLowerCase())).slice(0, 5), - pluginKey: MergeTagPluginKey, - command: ({ editor, range, props }) => { - const nodeAfter = editor.view.state.selection.$to.nodeAfter; - const overrideSpace = nodeAfter?.text?.startsWith(" "); - if (overrideSpace) { - range.to += 1; - } - editor.chain().focus().insertContentAt(range, [ - { - type: this.name, - attrs: props - }, - { - type: "text", - text: " " - } - ]).run(); - window.getSelection()?.collapseToEnd(); - }, - allow: ({ state, range }) => { - const $from = state.doc.resolve(range.from); - const type = state.schema.nodes[this.name]; - const allow = !!$from.parent.type.contentMatch.matchType(type); - return allow; - }, - render: () => { - let component; - let popup; - return { - onStart: (props) => { - if (!props.clientRect) { - return; - } - const html = ` + `,{dom:e}}},addCommands(){return{insertBlock:t=>({chain:e,state:n})=>{let r=e();if(![null,void 0].includes(t.coordinates?.pos))return r.insertContentAt({from:t.coordinates.pos,to:t.coordinates.pos},{type:this.name,attrs:t}),r.setTextSelection(t.coordinates.pos);let{selection:i}=n,{$from:o,$to:s}=i,l=o.blockRange(s);return l?(s.parentOffset===0?r.insertContentAt(Math.max(s.pos-1,0),{type:this.name,attrs:t}):r.insertContentAt({from:l.start,to:l.end},{type:this.name,attrs:t}),r.setTextSelection(l.end)):(s.parentOffset===0?r.insertContentAt(Math.max(s.pos-1,0),{type:"paragraph"}).insertContentAt({from:o.pos,to:s.pos},{type:this.name,attrs:t}):r.setNode({type:"paragraph"}).insertContentAt({from:o.pos,to:s.pos},{type:this.name,attrs:t}),r.setTextSelection(s.pos+1))},updateBlock:t=>({chain:e,state:n})=>{let{selection:r}=n,{$from:i,$to:o}=r,s=i.blockRange(o),l=e();return s?(l.insertContentAt({from:s.start,to:s.end},{type:this.name,attrs:t}),l.focus(s.end+1)):(l.insertContentAt({from:i.pos,to:i.pos+1},{type:this.name,attrs:t}),!1)},removeBlock:()=>({commands:t})=>t.deleteSelection()}}});function J2(t){var e;let{char:n,allowSpaces:r,allowedPrefixes:i,startOfLine:o,$position:s}=t,l=zE(n),u=new RegExp(`\\s${l}$`),d=o?"^":"",f=r?new RegExp(`${d}${l}.*?(?=\\s${l}|$)`,"gm"):new RegExp(`${d}(?:^)?${l}[^\\s${l}]*`,"gm"),h=((e=s.nodeBefore)===null||e===void 0?void 0:e.isText)&&s.nodeBefore.text;if(!h)return null;let m=s.pos-h.length,b=Array.from(h.matchAll(f)).pop();if(!b||b.input===void 0||b.index===void 0)return null;let y=b.input.slice(Math.max(0,b.index-1),b.index),v=new RegExp(`^[${i?.join("")}\0]?$`).test(y);if(i!==null&&!v)return null;let x=m+b.index,S=x+b[0].length;return r&&u.test(h.slice(S-1,S+1))&&(b[0]+=" ",S+=1),x=s.pos?{range:{from:x,to:S},query:b[0].slice(n.length),text:b[0]}:null}var X2=new qe("suggestion");function kx({pluginKey:t=X2,editor:e,char:n="@",allowSpaces:r=!1,allowedPrefixes:i=[" "],startOfLine:o=!1,decorationTag:s="span",decorationClass:l="suggestion",command:u=()=>null,items:d=()=>[],render:f=()=>({}),allow:h=()=>!0,findSuggestionMatch:m=J2}){let b,y=f?.(),v=new Pe({key:t,view(){return{update:async(x,S)=>{var D,L,T,z,O,Y,ie;let $=(D=this.key)===null||D===void 0?void 0:D.getState(S),oe=(L=this.key)===null||L===void 0?void 0:L.getState(x.state),me=$.active&&oe.active&&$.range.from!==oe.range.from,Te=!$.active&&oe.active,ge=$.active&&!oe.active,Me=!Te&&!ge&&$.query!==oe.query,Ee=Te||me,P=Me&&!me,N=ge||me;if(!Ee&&!P&&!N)return;let R=N&&!Ee?$:oe,V=x.dom.querySelector(`[data-decoration-id="${R.decorationId}"]`);b={editor:e,range:R.range,query:R.query,text:R.text,items:[],command:Q=>{u({editor:e,range:R.range,props:Q})},decorationNode:V,clientRect:V?()=>{var Q;let{decorationId:he}=(Q=this.key)===null||Q===void 0?void 0:Q.getState(e.state),xe=x.dom.querySelector(`[data-decoration-id="${he}"]`);return xe?.getBoundingClientRect()||null}:null},Ee&&((T=y?.onBeforeStart)===null||T===void 0||T.call(y,b)),P&&((z=y?.onBeforeUpdate)===null||z===void 0||z.call(y,b)),(P||Ee)&&(b.items=await d({editor:e,query:R.query})),N&&((O=y?.onExit)===null||O===void 0||O.call(y,b)),P&&((Y=y?.onUpdate)===null||Y===void 0||Y.call(y,b)),Ee&&((ie=y?.onStart)===null||ie===void 0||ie.call(y,b))},destroy:()=>{var x;b&&((x=y?.onExit)===null||x===void 0||x.call(y,b))}}},state:{init(){return{active:!1,range:{from:0,to:0},query:null,text:null,composing:!1}},apply(x,S,D,L){let{isEditable:T}=e,{composing:z}=e.view,{selection:O}=x,{empty:Y,from:ie}=O,$={...S};if($.composing=z,T&&(Y||e.view.composing)){(ieS.range.to)&&!z&&!S.composing&&($.active=!1);let oe=m({char:n,allowSpaces:r,allowedPrefixes:i,startOfLine:o,$position:O.$from}),me=`id_${Math.floor(Math.random()*4294967295)}`;oe&&h({editor:e,state:L,range:oe.range})?($.active=!0,$.decorationId=S.decorationId?S.decorationId:me,$.range=oe.range,$.query=oe.query,$.text=oe.text):$.active=!1}else $.active=!1;return $.active||($.decorationId=null,$.range={from:0,to:0},$.query=null,$.text=null),$}},props:{handleKeyDown(x,S){var D;let{active:L,range:T}=v.getState(x.state);return L&&((D=y?.onKeyDown)===null||D===void 0?void 0:D.call(y,{view:x,event:S,range:T}))||!1},decorations(x){let{active:S,range:D,decorationId:L}=v.getState(x);return S?lt.create(x.doc,[Mt.inline(D.from,D.to,{nodeName:s,class:l,"data-decoration-id":L})]):null}}});return v}var Z2=new qe("mergeTag"),mm=ae.create({name:"mergeTag",group:"inline",inline:!0,selectable:!1,atom:!0,addAttributes(){return{id:{default:null,parseHTML:t=>t.getAttribute("data-id"),renderHTML:t=>t.id?{"data-id":t.id}:{}}}},parseHTML(){return[{tag:`span[data-type='${this.name}']`}]},renderHTML({node:t,HTMLAttributes:e}){return["span",Z({"data-type":this.name},e),`{{ ${t.attrs.id} }}`]},renderText({node:t}){return`{{ ${t.attrs.id} }}`},addKeyboardShortcuts(){return{Backspace:()=>this.editor.commands.command(({tr:t,state:e})=>{let n=!1,{selection:r}=e,{empty:i,anchor:o}=r;return i?(e.doc.nodesBetween(o-1,o,(s,l)=>{if(s.type.name===this.name)return n=!0,t.insertText("{{",l,l+s.nodeSize),!1}),n):!1})}},addCommands(){return{insertMergeTag:t=>({chain:e,state:n})=>{let r=e();if(![null,void 0].includes(t.coordinates?.pos))return r.insertContentAt({from:t.coordinates.pos,to:t.coordinates.pos},[{type:this.name,attrs:{id:t.tag}},{type:"text",text:" "}]),r}}},addProseMirrorPlugins(){return[kx({editor:this.editor,char:"{{",items:({query:t})=>this.options.mergeTags.filter(e=>e.toLowerCase().startsWith(t.toLowerCase())).slice(0,5),pluginKey:Z2,command:({editor:t,range:e,props:n})=>{t.view.state.selection.$to.nodeAfter?.text?.startsWith(" ")&&(e.to+=1),t.chain().focus().insertContentAt(e,[{type:this.name,attrs:n},{type:"text",text:" "}]).run(),window.getSelection()?.collapseToEnd()},allow:({state:t,range:e})=>{let n=t.doc.resolve(e.from),r=t.schema.nodes[this.name];return!!n.parent.type.contentMatch.matchType(r)},render:()=>{let t,e;return{onStart:n=>{if(!n.clientRect)return;let r=`
- `; - component = document.createElement("div"); - component.innerHTML = html; - component.addEventListener("merge-tags-select", (event) => { - props.command({ id: event.detail.item }); - }); - popup = tippy_esm_default("body", { - getReferenceClientRect: props.clientRect, - appendTo: () => document.body, - content: component, - allowHTML: true, - showOnCreate: true, - interactive: true, - trigger: "manual", - placement: "bottom-start" - }); - }, - onUpdate(props) { - if (!props.items.length) { - popup[0].hide(); - return; - } - popup[0].show(); - component.dispatchEvent(new CustomEvent("merge-tags-update-items", { detail: props.items })); - }, - onKeyDown(props) { - component.dispatchEvent(new CustomEvent("merge-tags-key-down", { detail: props.event })); - }, - onExit() { - popup[0].destroy(); - } - }; - } - }) - ]; - } -}); - -// resources/js/extensions/ClassExtension.js -var ClassExtension = Extension.create({ - name: "classExtension", - addGlobalAttributes() { - return [ - { - types: [ - "heading", - "paragraph", - "link", - "image", - "listItem", - "bulletList", - "orderedList", - "table", - "tableHeader", - "tableRow", - "tableCell", - "textStyle" - ], - attributes: { - class: { - default: null, - parseHTML: (element) => element.getAttribute("class") ?? null, - renderHTML: (attributes) => { - if (!attributes.class) { - return null; - } - return { - class: attributes.class - }; - } - } - } - } - ]; - } -}); - -// resources/js/extensions/IdExtension.js -var IdExtension = Extension.create({ - name: "idExtension", - addGlobalAttributes() { - return [ - { - types: [ - "heading", - "link" - ], - attributes: { - id: { - default: null, - parseHTML: (element) => element.getAttribute("id") ?? null, - renderHTML: (attributes) => { - if (!attributes.id) { - return null; - } - return { - id: attributes.id - }; - } - } - } - } - ]; - } -}); - -// resources/js/extensions/StyleExtension.js -var StyleExtension = Extension.create({ - name: "styleExtension", - addGlobalAttributes() { - return [ - { - types: [ - "heading", - "paragraph", - "link", - "image", - "listItem", - "bulletList", - "orderedList", - "table", - "tableHeader", - "tableRow", - "tableCell", - "textStyle" - ], - attributes: { - style: { - default: null, - parseHTML: (element) => element.getAttribute("style") ?? null, - renderHTML: (attributes) => { - if (!attributes.style) { - return null; - } - return { - style: attributes.style - }; - } - } - } - } - ]; - } -}); - -// node_modules/lowlight/node_modules/highlight.js/es/languages/arduino.js -function cPlusPlus(hljs) { - const regex = hljs.regex; - const C_LINE_COMMENT_MODE2 = hljs.COMMENT("//", "$", { contains: [{ begin: /\\\n/ }] }); - const DECLTYPE_AUTO_RE = "decltype\\(auto\\)"; - const NAMESPACE_RE = "[a-zA-Z_]\\w*::"; - const TEMPLATE_ARGUMENT_RE = "<[^<>]+>"; - const FUNCTION_TYPE_RE = "(?!struct)(" + DECLTYPE_AUTO_RE + "|" + regex.optional(NAMESPACE_RE) + "[a-zA-Z_]\\w*" + regex.optional(TEMPLATE_ARGUMENT_RE) + ")"; - const CPP_PRIMITIVE_TYPES = { - className: "type", - begin: "\\b[a-z\\d_]*_t\\b" - }; - const CHARACTER_ESCAPES = "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"; - const STRINGS = { - className: "string", - variants: [ - { - begin: '(u8?|U|L)?"', - end: '"', - illegal: "\\n", - contains: [hljs.BACKSLASH_ESCAPE] - }, - { - begin: "(u8?|U|L)?'(" + CHARACTER_ESCAPES + "|.)", - end: "'", - illegal: "." - }, - hljs.END_SAME_AS_BEGIN({ - begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, - end: /\)([^()\\ ]{0,16})"/ - }) - ] - }; - const NUMBERS = { - className: "number", - variants: [ - { begin: "\\b(0b[01']+)" }, - { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" }, - { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } - ], - relevance: 0 - }; - const PREPROCESSOR = { - className: "meta", - begin: /#\s*[a-z]+\b/, - end: /$/, - keywords: { keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" }, - contains: [ - { - begin: /\\\n/, - relevance: 0 - }, - hljs.inherit(STRINGS, { className: "string" }), - { - className: "string", - begin: /<.*?>/ - }, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE - ] - }; - const TITLE_MODE2 = { - className: "title", - begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, - relevance: 0 - }; - const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + "\\s*\\("; - const RESERVED_KEYWORDS = [ - "alignas", - "alignof", - "and", - "and_eq", - "asm", - "atomic_cancel", - "atomic_commit", - "atomic_noexcept", - "auto", - "bitand", - "bitor", - "break", - "case", - "catch", - "class", - "co_await", - "co_return", - "co_yield", - "compl", - "concept", - "const_cast|10", - "consteval", - "constexpr", - "constinit", - "continue", - "decltype", - "default", - "delete", - "do", - "dynamic_cast|10", - "else", - "enum", - "explicit", - "export", - "extern", - "false", - "final", - "for", - "friend", - "goto", - "if", - "import", - "inline", - "module", - "mutable", - "namespace", - "new", - "noexcept", - "not", - "not_eq", - "nullptr", - "operator", - "or", - "or_eq", - "override", - "private", - "protected", - "public", - "reflexpr", - "register", - "reinterpret_cast|10", - "requires", - "return", - "sizeof", - "static_assert", - "static_cast|10", - "struct", - "switch", - "synchronized", - "template", - "this", - "thread_local", - "throw", - "transaction_safe", - "transaction_safe_dynamic", - "true", - "try", - "typedef", - "typeid", - "typename", - "union", - "using", - "virtual", - "volatile", - "while", - "xor", - "xor_eq" - ]; - const RESERVED_TYPES = [ - "bool", - "char", - "char16_t", - "char32_t", - "char8_t", - "double", - "float", - "int", - "long", - "short", - "void", - "wchar_t", - "unsigned", - "signed", - "const", - "static" - ]; - const TYPE_HINTS = [ - "any", - "auto_ptr", - "barrier", - "binary_semaphore", - "bitset", - "complex", - "condition_variable", - "condition_variable_any", - "counting_semaphore", - "deque", - "false_type", - "future", - "imaginary", - "initializer_list", - "istringstream", - "jthread", - "latch", - "lock_guard", - "multimap", - "multiset", - "mutex", - "optional", - "ostringstream", - "packaged_task", - "pair", - "promise", - "priority_queue", - "queue", - "recursive_mutex", - "recursive_timed_mutex", - "scoped_lock", - "set", - "shared_future", - "shared_lock", - "shared_mutex", - "shared_timed_mutex", - "shared_ptr", - "stack", - "string_view", - "stringstream", - "timed_mutex", - "thread", - "true_type", - "tuple", - "unique_lock", - "unique_ptr", - "unordered_map", - "unordered_multimap", - "unordered_multiset", - "unordered_set", - "variant", - "vector", - "weak_ptr", - "wstring", - "wstring_view" - ]; - const FUNCTION_HINTS = [ - "abort", - "abs", - "acos", - "apply", - "as_const", - "asin", - "atan", - "atan2", - "calloc", - "ceil", - "cerr", - "cin", - "clog", - "cos", - "cosh", - "cout", - "declval", - "endl", - "exchange", - "exit", - "exp", - "fabs", - "floor", - "fmod", - "forward", - "fprintf", - "fputs", - "free", - "frexp", - "fscanf", - "future", - "invoke", - "isalnum", - "isalpha", - "iscntrl", - "isdigit", - "isgraph", - "islower", - "isprint", - "ispunct", - "isspace", - "isupper", - "isxdigit", - "labs", - "launder", - "ldexp", - "log", - "log10", - "make_pair", - "make_shared", - "make_shared_for_overwrite", - "make_tuple", - "make_unique", - "malloc", - "memchr", - "memcmp", - "memcpy", - "memset", - "modf", - "move", - "pow", - "printf", - "putchar", - "puts", - "realloc", - "scanf", - "sin", - "sinh", - "snprintf", - "sprintf", - "sqrt", - "sscanf", - "std", - "stderr", - "stdin", - "stdout", - "strcat", - "strchr", - "strcmp", - "strcpy", - "strcspn", - "strlen", - "strncat", - "strncmp", - "strncpy", - "strpbrk", - "strrchr", - "strspn", - "strstr", - "swap", - "tan", - "tanh", - "terminate", - "to_underlying", - "tolower", - "toupper", - "vfprintf", - "visit", - "vprintf", - "vsprintf" - ]; - const LITERALS3 = [ - "NULL", - "false", - "nullopt", - "nullptr", - "true" - ]; - const BUILT_IN = ["_Pragma"]; - const CPP_KEYWORDS = { - type: RESERVED_TYPES, - keyword: RESERVED_KEYWORDS, - literal: LITERALS3, - built_in: BUILT_IN, - _type_hints: TYPE_HINTS - }; - const FUNCTION_DISPATCH = { - className: "function.dispatch", - relevance: 0, - keywords: { - // Only for relevance, not highlighting. - _hint: FUNCTION_HINTS - }, - begin: regex.concat( - /\b/, - /(?!decltype)/, - /(?!if)/, - /(?!for)/, - /(?!switch)/, - /(?!while)/, - hljs.IDENT_RE, - regex.lookahead(/(<[^<>]+>|)\s*\(/) - ) - }; - const EXPRESSION_CONTAINS = [ - FUNCTION_DISPATCH, - PREPROCESSOR, - CPP_PRIMITIVE_TYPES, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - NUMBERS, - STRINGS - ]; - const EXPRESSION_CONTEXT = { - // This mode covers expression context where we can't expect a function - // definition and shouldn't highlight anything that looks like one: - // `return some()`, `else if()`, `(x*sum(1, 2))` - variants: [ - { - begin: /=/, - end: /;/ - }, - { - begin: /\(/, - end: /\)/ - }, - { - beginKeywords: "new throw return else", - end: /;/ - } - ], - keywords: CPP_KEYWORDS, - contains: EXPRESSION_CONTAINS.concat([ - { - begin: /\(/, - end: /\)/, - keywords: CPP_KEYWORDS, - contains: EXPRESSION_CONTAINS.concat(["self"]), - relevance: 0 - } - ]), - relevance: 0 - }; - const FUNCTION_DECLARATION = { - className: "function", - begin: "(" + FUNCTION_TYPE_RE + "[\\*&\\s]+)+" + FUNCTION_TITLE, - returnBegin: true, - end: /[{;=]/, - excludeEnd: true, - keywords: CPP_KEYWORDS, - illegal: /[^\w\s\*&:<>.]/, - contains: [ - { - // to prevent it from being confused as the function title - begin: DECLTYPE_AUTO_RE, - keywords: CPP_KEYWORDS, - relevance: 0 - }, - { - begin: FUNCTION_TITLE, - returnBegin: true, - contains: [TITLE_MODE2], - relevance: 0 - }, - // needed because we do not have look-behind on the below rule - // to prevent it from grabbing the final : in a :: pair - { - begin: /::/, - relevance: 0 - }, - // initializers - { - begin: /:/, - endsWithParent: true, - contains: [ - STRINGS, - NUMBERS - ] - }, - // allow for multiple declarations, e.g.: - // extern void f(int), g(char); - { - relevance: 0, - match: /,/ - }, - { - className: "params", - begin: /\(/, - end: /\)/, - keywords: CPP_KEYWORDS, - relevance: 0, - contains: [ - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - STRINGS, - NUMBERS, - CPP_PRIMITIVE_TYPES, - // Count matching parentheses. - { - begin: /\(/, - end: /\)/, - keywords: CPP_KEYWORDS, - relevance: 0, - contains: [ - "self", - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - STRINGS, - NUMBERS, - CPP_PRIMITIVE_TYPES - ] - } - ] - }, - CPP_PRIMITIVE_TYPES, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - PREPROCESSOR - ] - }; - return { - name: "C++", - aliases: [ - "cc", - "c++", - "h++", - "hpp", - "hh", - "hxx", - "cxx" - ], - keywords: CPP_KEYWORDS, - illegal: " rooms (9);` - begin: "\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function)\\s*<(?!<)", - end: ">", - keywords: CPP_KEYWORDS, - contains: [ - "self", - CPP_PRIMITIVE_TYPES - ] - }, - { - begin: hljs.IDENT_RE + "::", - keywords: CPP_KEYWORDS - }, - { - match: [ - // extra complexity to deal with `enum class` and `enum struct` - /\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/, - /\s+/, - /\w+/ - ], - className: { - 1: "keyword", - 3: "title.class" - } - } - ] - ) - }; -} -function arduino(hljs) { - const ARDUINO_KW = { - type: [ - "boolean", - "byte", - "word", - "String" - ], - built_in: [ - "KeyboardController", - "MouseController", - "SoftwareSerial", - "EthernetServer", - "EthernetClient", - "LiquidCrystal", - "RobotControl", - "GSMVoiceCall", - "EthernetUDP", - "EsploraTFT", - "HttpClient", - "RobotMotor", - "WiFiClient", - "GSMScanner", - "FileSystem", - "Scheduler", - "GSMServer", - "YunClient", - "YunServer", - "IPAddress", - "GSMClient", - "GSMModem", - "Keyboard", - "Ethernet", - "Console", - "GSMBand", - "Esplora", - "Stepper", - "Process", - "WiFiUDP", - "GSM_SMS", - "Mailbox", - "USBHost", - "Firmata", - "PImage", - "Client", - "Server", - "GSMPIN", - "FileIO", - "Bridge", - "Serial", - "EEPROM", - "Stream", - "Mouse", - "Audio", - "Servo", - "File", - "Task", - "GPRS", - "WiFi", - "Wire", - "TFT", - "GSM", - "SPI", - "SD" - ], - _hints: [ - "setup", - "loop", - "runShellCommandAsynchronously", - "analogWriteResolution", - "retrieveCallingNumber", - "printFirmwareVersion", - "analogReadResolution", - "sendDigitalPortPair", - "noListenOnLocalhost", - "readJoystickButton", - "setFirmwareVersion", - "readJoystickSwitch", - "scrollDisplayRight", - "getVoiceCallStatus", - "scrollDisplayLeft", - "writeMicroseconds", - "delayMicroseconds", - "beginTransmission", - "getSignalStrength", - "runAsynchronously", - "getAsynchronously", - "listenOnLocalhost", - "getCurrentCarrier", - "readAccelerometer", - "messageAvailable", - "sendDigitalPorts", - "lineFollowConfig", - "countryNameWrite", - "runShellCommand", - "readStringUntil", - "rewindDirectory", - "readTemperature", - "setClockDivider", - "readLightSensor", - "endTransmission", - "analogReference", - "detachInterrupt", - "countryNameRead", - "attachInterrupt", - "encryptionType", - "readBytesUntil", - "robotNameWrite", - "readMicrophone", - "robotNameRead", - "cityNameWrite", - "userNameWrite", - "readJoystickY", - "readJoystickX", - "mouseReleased", - "openNextFile", - "scanNetworks", - "noInterrupts", - "digitalWrite", - "beginSpeaker", - "mousePressed", - "isActionDone", - "mouseDragged", - "displayLogos", - "noAutoscroll", - "addParameter", - "remoteNumber", - "getModifiers", - "keyboardRead", - "userNameRead", - "waitContinue", - "processInput", - "parseCommand", - "printVersion", - "readNetworks", - "writeMessage", - "blinkVersion", - "cityNameRead", - "readMessage", - "setDataMode", - "parsePacket", - "isListening", - "setBitOrder", - "beginPacket", - "isDirectory", - "motorsWrite", - "drawCompass", - "digitalRead", - "clearScreen", - "serialEvent", - "rightToLeft", - "setTextSize", - "leftToRight", - "requestFrom", - "keyReleased", - "compassRead", - "analogWrite", - "interrupts", - "WiFiServer", - "disconnect", - "playMelody", - "parseFloat", - "autoscroll", - "getPINUsed", - "setPINUsed", - "setTimeout", - "sendAnalog", - "readSlider", - "analogRead", - "beginWrite", - "createChar", - "motorsStop", - "keyPressed", - "tempoWrite", - "readButton", - "subnetMask", - "debugPrint", - "macAddress", - "writeGreen", - "randomSeed", - "attachGPRS", - "readString", - "sendString", - "remotePort", - "releaseAll", - "mouseMoved", - "background", - "getXChange", - "getYChange", - "answerCall", - "getResult", - "voiceCall", - "endPacket", - "constrain", - "getSocket", - "writeJSON", - "getButton", - "available", - "connected", - "findUntil", - "readBytes", - "exitValue", - "readGreen", - "writeBlue", - "startLoop", - "IPAddress", - "isPressed", - "sendSysex", - "pauseMode", - "gatewayIP", - "setCursor", - "getOemKey", - "tuneWrite", - "noDisplay", - "loadImage", - "switchPIN", - "onRequest", - "onReceive", - "changePIN", - "playFile", - "noBuffer", - "parseInt", - "overflow", - "checkPIN", - "knobRead", - "beginTFT", - "bitClear", - "updateIR", - "bitWrite", - "position", - "writeRGB", - "highByte", - "writeRed", - "setSpeed", - "readBlue", - "noStroke", - "remoteIP", - "transfer", - "shutdown", - "hangCall", - "beginSMS", - "endWrite", - "attached", - "maintain", - "noCursor", - "checkReg", - "checkPUK", - "shiftOut", - "isValid", - "shiftIn", - "pulseIn", - "connect", - "println", - "localIP", - "pinMode", - "getIMEI", - "display", - "noBlink", - "process", - "getBand", - "running", - "beginSD", - "drawBMP", - "lowByte", - "setBand", - "release", - "bitRead", - "prepare", - "pointTo", - "readRed", - "setMode", - "noFill", - "remove", - "listen", - "stroke", - "detach", - "attach", - "noTone", - "exists", - "buffer", - "height", - "bitSet", - "circle", - "config", - "cursor", - "random", - "IRread", - "setDNS", - "endSMS", - "getKey", - "micros", - "millis", - "begin", - "print", - "write", - "ready", - "flush", - "width", - "isPIN", - "blink", - "clear", - "press", - "mkdir", - "rmdir", - "close", - "point", - "yield", - "image", - "BSSID", - "click", - "delay", - "read", - "text", - "move", - "peek", - "beep", - "rect", - "line", - "open", - "seek", - "fill", - "size", - "turn", - "stop", - "home", - "find", - "step", - "tone", - "sqrt", - "RSSI", - "SSID", - "end", - "bit", - "tan", - "cos", - "sin", - "pow", - "map", - "abs", - "max", - "min", - "get", - "run", - "put" - ], - literal: [ - "DIGITAL_MESSAGE", - "FIRMATA_STRING", - "ANALOG_MESSAGE", - "REPORT_DIGITAL", - "REPORT_ANALOG", - "INPUT_PULLUP", - "SET_PIN_MODE", - "INTERNAL2V56", - "SYSTEM_RESET", - "LED_BUILTIN", - "INTERNAL1V1", - "SYSEX_START", - "INTERNAL", - "EXTERNAL", - "DEFAULT", - "OUTPUT", - "INPUT", - "HIGH", - "LOW" - ] - }; - const ARDUINO = cPlusPlus(hljs); - const kws = ( - /** @type {Record} */ - ARDUINO.keywords - ); - kws.type = [ - ...kws.type, - ...ARDUINO_KW.type - ]; - kws.literal = [ - ...kws.literal, - ...ARDUINO_KW.literal - ]; - kws.built_in = [ - ...kws.built_in, - ...ARDUINO_KW.built_in - ]; - kws._hints = ARDUINO_KW._hints; - ARDUINO.name = "Arduino"; - ARDUINO.aliases = ["ino"]; - ARDUINO.supersetOf = "cpp"; - return ARDUINO; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/bash.js -function bash(hljs) { - const regex = hljs.regex; - const VAR = {}; - const BRACED_VAR = { - begin: /\$\{/, - end: /\}/, - contains: [ - "self", - { - begin: /:-/, - contains: [VAR] - } - // default values - ] - }; - Object.assign(VAR, { - className: "variable", - variants: [ - { begin: regex.concat( - /\$[\w\d#@][\w\d_]*/, - // negative look-ahead tries to avoid matching patterns that are not - // Perl at all like $ident$, @ident@, etc. - `(?![\\w\\d])(?![$])` - ) }, - BRACED_VAR - ] - }); - const SUBST = { - className: "subst", - begin: /\$\(/, - end: /\)/, - contains: [hljs.BACKSLASH_ESCAPE] - }; - const HERE_DOC = { - begin: /<<-?\s*(?=\w+)/, - starts: { contains: [ - hljs.END_SAME_AS_BEGIN({ - begin: /(\w+)/, - end: /(\w+)/, - className: "string" - }) - ] } - }; - const QUOTE_STRING = { - className: "string", - begin: /"/, - end: /"/, - contains: [ - hljs.BACKSLASH_ESCAPE, - VAR, - SUBST - ] - }; - SUBST.contains.push(QUOTE_STRING); - const ESCAPED_QUOTE = { - className: "", - begin: /\\"/ - }; - const APOS_STRING = { - className: "string", - begin: /'/, - end: /'/ - }; - const ARITHMETIC = { - begin: /\$?\(\(/, - end: /\)\)/, - contains: [ - { - begin: /\d+#[0-9a-f]+/, - className: "number" - }, - hljs.NUMBER_MODE, - VAR - ] - }; - const SH_LIKE_SHELLS = [ - "fish", - "bash", - "zsh", - "sh", - "csh", - "ksh", - "tcsh", - "dash", - "scsh" - ]; - const KNOWN_SHEBANG = hljs.SHEBANG({ - binary: `(${SH_LIKE_SHELLS.join("|")})`, - relevance: 10 - }); - const FUNCTION = { - className: "function", - begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, - returnBegin: true, - contains: [hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ })], - relevance: 0 - }; - const KEYWORDS3 = [ - "if", - "then", - "else", - "elif", - "fi", - "for", - "while", - "until", - "in", - "do", - "done", - "case", - "esac", - "function", - "select" - ]; - const LITERALS3 = [ - "true", - "false" - ]; - const PATH_MODE = { match: /(\/[a-z._-]+)+/ }; - const SHELL_BUILT_INS = [ - "break", - "cd", - "continue", - "eval", - "exec", - "exit", - "export", - "getopts", - "hash", - "pwd", - "readonly", - "return", - "shift", - "test", - "times", - "trap", - "umask", - "unset" - ]; - const BASH_BUILT_INS = [ - "alias", - "bind", - "builtin", - "caller", - "command", - "declare", - "echo", - "enable", - "help", - "let", - "local", - "logout", - "mapfile", - "printf", - "read", - "readarray", - "source", - "type", - "typeset", - "ulimit", - "unalias" - ]; - const ZSH_BUILT_INS = [ - "autoload", - "bg", - "bindkey", - "bye", - "cap", - "chdir", - "clone", - "comparguments", - "compcall", - "compctl", - "compdescribe", - "compfiles", - "compgroups", - "compquote", - "comptags", - "comptry", - "compvalues", - "dirs", - "disable", - "disown", - "echotc", - "echoti", - "emulate", - "fc", - "fg", - "float", - "functions", - "getcap", - "getln", - "history", - "integer", - "jobs", - "kill", - "limit", - "log", - "noglob", - "popd", - "print", - "pushd", - "pushln", - "rehash", - "sched", - "setcap", - "setopt", - "stat", - "suspend", - "ttyctl", - "unfunction", - "unhash", - "unlimit", - "unsetopt", - "vared", - "wait", - "whence", - "where", - "which", - "zcompile", - "zformat", - "zftp", - "zle", - "zmodload", - "zparseopts", - "zprof", - "zpty", - "zregexparse", - "zsocket", - "zstyle", - "ztcp" - ]; - const GNU_CORE_UTILS = [ - "chcon", - "chgrp", - "chown", - "chmod", - "cp", - "dd", - "df", - "dir", - "dircolors", - "ln", - "ls", - "mkdir", - "mkfifo", - "mknod", - "mktemp", - "mv", - "realpath", - "rm", - "rmdir", - "shred", - "sync", - "touch", - "truncate", - "vdir", - "b2sum", - "base32", - "base64", - "cat", - "cksum", - "comm", - "csplit", - "cut", - "expand", - "fmt", - "fold", - "head", - "join", - "md5sum", - "nl", - "numfmt", - "od", - "paste", - "ptx", - "pr", - "sha1sum", - "sha224sum", - "sha256sum", - "sha384sum", - "sha512sum", - "shuf", - "sort", - "split", - "sum", - "tac", - "tail", - "tr", - "tsort", - "unexpand", - "uniq", - "wc", - "arch", - "basename", - "chroot", - "date", - "dirname", - "du", - "echo", - "env", - "expr", - "factor", - // "false", // keyword literal already - "groups", - "hostid", - "id", - "link", - "logname", - "nice", - "nohup", - "nproc", - "pathchk", - "pinky", - "printenv", - "printf", - "pwd", - "readlink", - "runcon", - "seq", - "sleep", - "stat", - "stdbuf", - "stty", - "tee", - "test", - "timeout", - // "true", // keyword literal already - "tty", - "uname", - "unlink", - "uptime", - "users", - "who", - "whoami", - "yes" - ]; - return { - name: "Bash", - aliases: ["sh"], - keywords: { - $pattern: /\b[a-z][a-z0-9._-]+\b/, - keyword: KEYWORDS3, - literal: LITERALS3, - built_in: [ - ...SHELL_BUILT_INS, - ...BASH_BUILT_INS, - // Shell modifiers - "set", - "shopt", - ...ZSH_BUILT_INS, - ...GNU_CORE_UTILS - ] - }, - contains: [ - KNOWN_SHEBANG, - // to catch known shells and boost relevancy - hljs.SHEBANG(), - // to catch unknown shells but still highlight the shebang - FUNCTION, - ARITHMETIC, - hljs.HASH_COMMENT_MODE, - HERE_DOC, - PATH_MODE, - QUOTE_STRING, - ESCAPED_QUOTE, - APOS_STRING, - VAR - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/c.js -function c(hljs) { - const regex = hljs.regex; - const C_LINE_COMMENT_MODE2 = hljs.COMMENT("//", "$", { contains: [{ begin: /\\\n/ }] }); - const DECLTYPE_AUTO_RE = "decltype\\(auto\\)"; - const NAMESPACE_RE = "[a-zA-Z_]\\w*::"; - const TEMPLATE_ARGUMENT_RE = "<[^<>]+>"; - const FUNCTION_TYPE_RE = "(" + DECLTYPE_AUTO_RE + "|" + regex.optional(NAMESPACE_RE) + "[a-zA-Z_]\\w*" + regex.optional(TEMPLATE_ARGUMENT_RE) + ")"; - const TYPES3 = { - className: "type", - variants: [ - { begin: "\\b[a-z\\d_]*_t\\b" }, - { match: /\batomic_[a-z]{3,6}\b/ } - ] - }; - const CHARACTER_ESCAPES = "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"; - const STRINGS = { - className: "string", - variants: [ - { - begin: '(u8?|U|L)?"', - end: '"', - illegal: "\\n", - contains: [hljs.BACKSLASH_ESCAPE] - }, - { - begin: "(u8?|U|L)?'(" + CHARACTER_ESCAPES + "|.)", - end: "'", - illegal: "." - }, - hljs.END_SAME_AS_BEGIN({ - begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, - end: /\)([^()\\ ]{0,16})"/ - }) - ] - }; - const NUMBERS = { - className: "number", - variants: [ - { begin: "\\b(0b[01']+)" }, - { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" }, - { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } - ], - relevance: 0 - }; - const PREPROCESSOR = { - className: "meta", - begin: /#\s*[a-z]+\b/, - end: /$/, - keywords: { keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" }, - contains: [ - { - begin: /\\\n/, - relevance: 0 - }, - hljs.inherit(STRINGS, { className: "string" }), - { - className: "string", - begin: /<.*?>/ - }, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE - ] - }; - const TITLE_MODE2 = { - className: "title", - begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, - relevance: 0 - }; - const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + "\\s*\\("; - const C_KEYWORDS = [ - "asm", - "auto", - "break", - "case", - "continue", - "default", - "do", - "else", - "enum", - "extern", - "for", - "fortran", - "goto", - "if", - "inline", - "register", - "restrict", - "return", - "sizeof", - "struct", - "switch", - "typedef", - "union", - "volatile", - "while", - "_Alignas", - "_Alignof", - "_Atomic", - "_Generic", - "_Noreturn", - "_Static_assert", - "_Thread_local", - // aliases - "alignas", - "alignof", - "noreturn", - "static_assert", - "thread_local", - // not a C keyword but is, for all intents and purposes, treated exactly like one. - "_Pragma" - ]; - const C_TYPES = [ - "float", - "double", - "signed", - "unsigned", - "int", - "short", - "long", - "char", - "void", - "_Bool", - "_Complex", - "_Imaginary", - "_Decimal32", - "_Decimal64", - "_Decimal128", - // modifiers - "const", - "static", - // aliases - "complex", - "bool", - "imaginary" - ]; - const KEYWORDS3 = { - keyword: C_KEYWORDS, - type: C_TYPES, - literal: "true false NULL", - // TODO: apply hinting work similar to what was done in cpp.js - built_in: "std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" - }; - const EXPRESSION_CONTAINS = [ - PREPROCESSOR, - TYPES3, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - NUMBERS, - STRINGS - ]; - const EXPRESSION_CONTEXT = { - // This mode covers expression context where we can't expect a function - // definition and shouldn't highlight anything that looks like one: - // `return some()`, `else if()`, `(x*sum(1, 2))` - variants: [ - { - begin: /=/, - end: /;/ - }, - { - begin: /\(/, - end: /\)/ - }, - { - beginKeywords: "new throw return else", - end: /;/ - } - ], - keywords: KEYWORDS3, - contains: EXPRESSION_CONTAINS.concat([ - { - begin: /\(/, - end: /\)/, - keywords: KEYWORDS3, - contains: EXPRESSION_CONTAINS.concat(["self"]), - relevance: 0 - } - ]), - relevance: 0 - }; - const FUNCTION_DECLARATION = { - begin: "(" + FUNCTION_TYPE_RE + "[\\*&\\s]+)+" + FUNCTION_TITLE, - returnBegin: true, - end: /[{;=]/, - excludeEnd: true, - keywords: KEYWORDS3, - illegal: /[^\w\s\*&:<>.]/, - contains: [ - { - // to prevent it from being confused as the function title - begin: DECLTYPE_AUTO_RE, - keywords: KEYWORDS3, - relevance: 0 - }, - { - begin: FUNCTION_TITLE, - returnBegin: true, - contains: [hljs.inherit(TITLE_MODE2, { className: "title.function" })], - relevance: 0 - }, - // allow for multiple declarations, e.g.: - // extern void f(int), g(char); - { - relevance: 0, - match: /,/ - }, - { - className: "params", - begin: /\(/, - end: /\)/, - keywords: KEYWORDS3, - relevance: 0, - contains: [ - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - STRINGS, - NUMBERS, - TYPES3, - // Count matching parentheses. - { - begin: /\(/, - end: /\)/, - keywords: KEYWORDS3, - relevance: 0, - contains: [ - "self", - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - STRINGS, - NUMBERS, - TYPES3 - ] - } - ] - }, - TYPES3, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - PREPROCESSOR - ] - }; - return { - name: "C", - aliases: ["h"], - keywords: KEYWORDS3, - // Until differentiations are added between `c` and `cpp`, `c` will - // not be auto-detected to avoid auto-detect conflicts between C and C++ - disableAutodetect: true, - illegal: "=]/, - contains: [ - { beginKeywords: "final class struct" }, - hljs.TITLE_MODE - ] - } - ] - ), - exports: { - preprocessor: PREPROCESSOR, - strings: STRINGS, - keywords: KEYWORDS3 - } - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/cpp.js -function cpp(hljs) { - const regex = hljs.regex; - const C_LINE_COMMENT_MODE2 = hljs.COMMENT("//", "$", { contains: [{ begin: /\\\n/ }] }); - const DECLTYPE_AUTO_RE = "decltype\\(auto\\)"; - const NAMESPACE_RE = "[a-zA-Z_]\\w*::"; - const TEMPLATE_ARGUMENT_RE = "<[^<>]+>"; - const FUNCTION_TYPE_RE = "(?!struct)(" + DECLTYPE_AUTO_RE + "|" + regex.optional(NAMESPACE_RE) + "[a-zA-Z_]\\w*" + regex.optional(TEMPLATE_ARGUMENT_RE) + ")"; - const CPP_PRIMITIVE_TYPES = { - className: "type", - begin: "\\b[a-z\\d_]*_t\\b" - }; - const CHARACTER_ESCAPES = "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"; - const STRINGS = { - className: "string", - variants: [ - { - begin: '(u8?|U|L)?"', - end: '"', - illegal: "\\n", - contains: [hljs.BACKSLASH_ESCAPE] - }, - { - begin: "(u8?|U|L)?'(" + CHARACTER_ESCAPES + "|.)", - end: "'", - illegal: "." - }, - hljs.END_SAME_AS_BEGIN({ - begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, - end: /\)([^()\\ ]{0,16})"/ - }) - ] - }; - const NUMBERS = { - className: "number", - variants: [ - { begin: "\\b(0b[01']+)" }, - { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" }, - { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } - ], - relevance: 0 - }; - const PREPROCESSOR = { - className: "meta", - begin: /#\s*[a-z]+\b/, - end: /$/, - keywords: { keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" }, - contains: [ - { - begin: /\\\n/, - relevance: 0 - }, - hljs.inherit(STRINGS, { className: "string" }), - { - className: "string", - begin: /<.*?>/ - }, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE - ] - }; - const TITLE_MODE2 = { - className: "title", - begin: regex.optional(NAMESPACE_RE) + hljs.IDENT_RE, - relevance: 0 - }; - const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs.IDENT_RE + "\\s*\\("; - const RESERVED_KEYWORDS = [ - "alignas", - "alignof", - "and", - "and_eq", - "asm", - "atomic_cancel", - "atomic_commit", - "atomic_noexcept", - "auto", - "bitand", - "bitor", - "break", - "case", - "catch", - "class", - "co_await", - "co_return", - "co_yield", - "compl", - "concept", - "const_cast|10", - "consteval", - "constexpr", - "constinit", - "continue", - "decltype", - "default", - "delete", - "do", - "dynamic_cast|10", - "else", - "enum", - "explicit", - "export", - "extern", - "false", - "final", - "for", - "friend", - "goto", - "if", - "import", - "inline", - "module", - "mutable", - "namespace", - "new", - "noexcept", - "not", - "not_eq", - "nullptr", - "operator", - "or", - "or_eq", - "override", - "private", - "protected", - "public", - "reflexpr", - "register", - "reinterpret_cast|10", - "requires", - "return", - "sizeof", - "static_assert", - "static_cast|10", - "struct", - "switch", - "synchronized", - "template", - "this", - "thread_local", - "throw", - "transaction_safe", - "transaction_safe_dynamic", - "true", - "try", - "typedef", - "typeid", - "typename", - "union", - "using", - "virtual", - "volatile", - "while", - "xor", - "xor_eq" - ]; - const RESERVED_TYPES = [ - "bool", - "char", - "char16_t", - "char32_t", - "char8_t", - "double", - "float", - "int", - "long", - "short", - "void", - "wchar_t", - "unsigned", - "signed", - "const", - "static" - ]; - const TYPE_HINTS = [ - "any", - "auto_ptr", - "barrier", - "binary_semaphore", - "bitset", - "complex", - "condition_variable", - "condition_variable_any", - "counting_semaphore", - "deque", - "false_type", - "future", - "imaginary", - "initializer_list", - "istringstream", - "jthread", - "latch", - "lock_guard", - "multimap", - "multiset", - "mutex", - "optional", - "ostringstream", - "packaged_task", - "pair", - "promise", - "priority_queue", - "queue", - "recursive_mutex", - "recursive_timed_mutex", - "scoped_lock", - "set", - "shared_future", - "shared_lock", - "shared_mutex", - "shared_timed_mutex", - "shared_ptr", - "stack", - "string_view", - "stringstream", - "timed_mutex", - "thread", - "true_type", - "tuple", - "unique_lock", - "unique_ptr", - "unordered_map", - "unordered_multimap", - "unordered_multiset", - "unordered_set", - "variant", - "vector", - "weak_ptr", - "wstring", - "wstring_view" - ]; - const FUNCTION_HINTS = [ - "abort", - "abs", - "acos", - "apply", - "as_const", - "asin", - "atan", - "atan2", - "calloc", - "ceil", - "cerr", - "cin", - "clog", - "cos", - "cosh", - "cout", - "declval", - "endl", - "exchange", - "exit", - "exp", - "fabs", - "floor", - "fmod", - "forward", - "fprintf", - "fputs", - "free", - "frexp", - "fscanf", - "future", - "invoke", - "isalnum", - "isalpha", - "iscntrl", - "isdigit", - "isgraph", - "islower", - "isprint", - "ispunct", - "isspace", - "isupper", - "isxdigit", - "labs", - "launder", - "ldexp", - "log", - "log10", - "make_pair", - "make_shared", - "make_shared_for_overwrite", - "make_tuple", - "make_unique", - "malloc", - "memchr", - "memcmp", - "memcpy", - "memset", - "modf", - "move", - "pow", - "printf", - "putchar", - "puts", - "realloc", - "scanf", - "sin", - "sinh", - "snprintf", - "sprintf", - "sqrt", - "sscanf", - "std", - "stderr", - "stdin", - "stdout", - "strcat", - "strchr", - "strcmp", - "strcpy", - "strcspn", - "strlen", - "strncat", - "strncmp", - "strncpy", - "strpbrk", - "strrchr", - "strspn", - "strstr", - "swap", - "tan", - "tanh", - "terminate", - "to_underlying", - "tolower", - "toupper", - "vfprintf", - "visit", - "vprintf", - "vsprintf" - ]; - const LITERALS3 = [ - "NULL", - "false", - "nullopt", - "nullptr", - "true" - ]; - const BUILT_IN = ["_Pragma"]; - const CPP_KEYWORDS = { - type: RESERVED_TYPES, - keyword: RESERVED_KEYWORDS, - literal: LITERALS3, - built_in: BUILT_IN, - _type_hints: TYPE_HINTS - }; - const FUNCTION_DISPATCH = { - className: "function.dispatch", - relevance: 0, - keywords: { - // Only for relevance, not highlighting. - _hint: FUNCTION_HINTS - }, - begin: regex.concat( - /\b/, - /(?!decltype)/, - /(?!if)/, - /(?!for)/, - /(?!switch)/, - /(?!while)/, - hljs.IDENT_RE, - regex.lookahead(/(<[^<>]+>|)\s*\(/) - ) - }; - const EXPRESSION_CONTAINS = [ - FUNCTION_DISPATCH, - PREPROCESSOR, - CPP_PRIMITIVE_TYPES, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - NUMBERS, - STRINGS - ]; - const EXPRESSION_CONTEXT = { - // This mode covers expression context where we can't expect a function - // definition and shouldn't highlight anything that looks like one: - // `return some()`, `else if()`, `(x*sum(1, 2))` - variants: [ - { - begin: /=/, - end: /;/ - }, - { - begin: /\(/, - end: /\)/ - }, - { - beginKeywords: "new throw return else", - end: /;/ - } - ], - keywords: CPP_KEYWORDS, - contains: EXPRESSION_CONTAINS.concat([ - { - begin: /\(/, - end: /\)/, - keywords: CPP_KEYWORDS, - contains: EXPRESSION_CONTAINS.concat(["self"]), - relevance: 0 - } - ]), - relevance: 0 - }; - const FUNCTION_DECLARATION = { - className: "function", - begin: "(" + FUNCTION_TYPE_RE + "[\\*&\\s]+)+" + FUNCTION_TITLE, - returnBegin: true, - end: /[{;=]/, - excludeEnd: true, - keywords: CPP_KEYWORDS, - illegal: /[^\w\s\*&:<>.]/, - contains: [ - { - // to prevent it from being confused as the function title - begin: DECLTYPE_AUTO_RE, - keywords: CPP_KEYWORDS, - relevance: 0 - }, - { - begin: FUNCTION_TITLE, - returnBegin: true, - contains: [TITLE_MODE2], - relevance: 0 - }, - // needed because we do not have look-behind on the below rule - // to prevent it from grabbing the final : in a :: pair - { - begin: /::/, - relevance: 0 - }, - // initializers - { - begin: /:/, - endsWithParent: true, - contains: [ - STRINGS, - NUMBERS - ] - }, - // allow for multiple declarations, e.g.: - // extern void f(int), g(char); - { - relevance: 0, - match: /,/ - }, - { - className: "params", - begin: /\(/, - end: /\)/, - keywords: CPP_KEYWORDS, - relevance: 0, - contains: [ - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - STRINGS, - NUMBERS, - CPP_PRIMITIVE_TYPES, - // Count matching parentheses. - { - begin: /\(/, - end: /\)/, - keywords: CPP_KEYWORDS, - relevance: 0, - contains: [ - "self", - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - STRINGS, - NUMBERS, - CPP_PRIMITIVE_TYPES - ] - } - ] - }, - CPP_PRIMITIVE_TYPES, - C_LINE_COMMENT_MODE2, - hljs.C_BLOCK_COMMENT_MODE, - PREPROCESSOR - ] - }; - return { - name: "C++", - aliases: [ - "cc", - "c++", - "h++", - "hpp", - "hh", - "hxx", - "cxx" - ], - keywords: CPP_KEYWORDS, - illegal: " rooms (9);` - begin: "\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function)\\s*<(?!<)", - end: ">", - keywords: CPP_KEYWORDS, - contains: [ - "self", - CPP_PRIMITIVE_TYPES - ] - }, - { - begin: hljs.IDENT_RE + "::", - keywords: CPP_KEYWORDS - }, - { - match: [ - // extra complexity to deal with `enum class` and `enum struct` - /\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/, - /\s+/, - /\w+/ - ], - className: { - 1: "keyword", - 3: "title.class" - } - } - ] - ) - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/csharp.js -function csharp(hljs) { - const BUILT_IN_KEYWORDS = [ - "bool", - "byte", - "char", - "decimal", - "delegate", - "double", - "dynamic", - "enum", - "float", - "int", - "long", - "nint", - "nuint", - "object", - "sbyte", - "short", - "string", - "ulong", - "uint", - "ushort" - ]; - const FUNCTION_MODIFIERS = [ - "public", - "private", - "protected", - "static", - "internal", - "protected", - "abstract", - "async", - "extern", - "override", - "unsafe", - "virtual", - "new", - "sealed", - "partial" - ]; - const LITERAL_KEYWORDS = [ - "default", - "false", - "null", - "true" - ]; - const NORMAL_KEYWORDS = [ - "abstract", - "as", - "base", - "break", - "case", - "catch", - "class", - "const", - "continue", - "do", - "else", - "event", - "explicit", - "extern", - "finally", - "fixed", - "for", - "foreach", - "goto", - "if", - "implicit", - "in", - "interface", - "internal", - "is", - "lock", - "namespace", - "new", - "operator", - "out", - "override", - "params", - "private", - "protected", - "public", - "readonly", - "record", - "ref", - "return", - "scoped", - "sealed", - "sizeof", - "stackalloc", - "static", - "struct", - "switch", - "this", - "throw", - "try", - "typeof", - "unchecked", - "unsafe", - "using", - "virtual", - "void", - "volatile", - "while" - ]; - const CONTEXTUAL_KEYWORDS = [ - "add", - "alias", - "and", - "ascending", - "async", - "await", - "by", - "descending", - "equals", - "from", - "get", - "global", - "group", - "init", - "into", - "join", - "let", - "nameof", - "not", - "notnull", - "on", - "or", - "orderby", - "partial", - "remove", - "select", - "set", - "unmanaged", - "value|0", - "var", - "when", - "where", - "with", - "yield" - ]; - const KEYWORDS3 = { - keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS), - built_in: BUILT_IN_KEYWORDS, - literal: LITERAL_KEYWORDS - }; - const TITLE_MODE2 = hljs.inherit(hljs.TITLE_MODE, { begin: "[a-zA-Z](\\.?\\w)*" }); - const NUMBERS = { - className: "number", - variants: [ - { begin: "\\b(0b[01']+)" }, - { begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)" }, - { begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" } - ], - relevance: 0 - }; - const VERBATIM_STRING = { - className: "string", - begin: '@"', - end: '"', - contains: [{ begin: '""' }] - }; - const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\n/ }); - const SUBST = { - className: "subst", - begin: /\{/, - end: /\}/, - keywords: KEYWORDS3 - }; - const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\n/ }); - const INTERPOLATED_STRING = { - className: "string", - begin: /\$"/, - end: '"', - illegal: /\n/, - contains: [ - { begin: /\{\{/ }, - { begin: /\}\}/ }, - hljs.BACKSLASH_ESCAPE, - SUBST_NO_LF - ] - }; - const INTERPOLATED_VERBATIM_STRING = { - className: "string", - begin: /\$@"/, - end: '"', - contains: [ - { begin: /\{\{/ }, - { begin: /\}\}/ }, - { begin: '""' }, - SUBST - ] - }; - const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, { - illegal: /\n/, - contains: [ - { begin: /\{\{/ }, - { begin: /\}\}/ }, - { begin: '""' }, - SUBST_NO_LF - ] - }); - SUBST.contains = [ - INTERPOLATED_VERBATIM_STRING, - INTERPOLATED_STRING, - VERBATIM_STRING, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - NUMBERS, - hljs.C_BLOCK_COMMENT_MODE - ]; - SUBST_NO_LF.contains = [ - INTERPOLATED_VERBATIM_STRING_NO_LF, - INTERPOLATED_STRING, - VERBATIM_STRING_NO_LF, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - NUMBERS, - hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\n/ }) - ]; - const STRING = { variants: [ - INTERPOLATED_VERBATIM_STRING, - INTERPOLATED_STRING, - VERBATIM_STRING, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE - ] }; - const GENERIC_MODIFIER = { - begin: "<", - end: ">", - contains: [ - { beginKeywords: "in out" }, - TITLE_MODE2 - ] - }; - const TYPE_IDENT_RE = hljs.IDENT_RE + "(<" + hljs.IDENT_RE + "(\\s*,\\s*" + hljs.IDENT_RE + ")*>)?(\\[\\])?"; - const AT_IDENTIFIER = { - // prevents expressions like `@class` from incorrect flagging - // `class` as a keyword - begin: "@" + hljs.IDENT_RE, - relevance: 0 - }; - return { - name: "C#", - aliases: [ - "cs", - "c#" - ], - keywords: KEYWORDS3, - illegal: /::/, - contains: [ - hljs.COMMENT( - "///", - "$", - { - returnBegin: true, - contains: [ - { - className: "doctag", - variants: [ - { - begin: "///", - relevance: 0 - }, - { begin: "" }, - { - begin: "" - } - ] - } - ] - } - ), - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE, - { - className: "meta", - begin: "#", - end: "$", - keywords: { keyword: "if else elif endif define undef warning error line region endregion pragma checksum" } - }, - STRING, - NUMBERS, - { - beginKeywords: "class interface", - relevance: 0, - end: /[{;=]/, - illegal: /[^\s:,]/, - contains: [ - { beginKeywords: "where class" }, - TITLE_MODE2, - GENERIC_MODIFIER, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - { - beginKeywords: "namespace", - relevance: 0, - end: /[{;=]/, - illegal: /[^\s:]/, - contains: [ - TITLE_MODE2, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - { - beginKeywords: "record", - relevance: 0, - end: /[{;=]/, - illegal: /[^\s:]/, - contains: [ - TITLE_MODE2, - GENERIC_MODIFIER, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - { - // [Attributes("")] - className: "meta", - begin: "^\\s*\\[(?=[\\w])", - excludeBegin: true, - end: "\\]", - excludeEnd: true, - contains: [ - { - className: "string", - begin: /"/, - end: /"/ - } - ] - }, - { - // Expression keywords prevent 'keyword Name(...)' from being - // recognized as a function definition - beginKeywords: "new return throw await else", - relevance: 0 - }, - { - className: "function", - begin: "(" + TYPE_IDENT_RE + "\\s+)+" + hljs.IDENT_RE + "\\s*(<[^=]+>\\s*)?\\(", - returnBegin: true, - end: /\s*[{;=]/, - excludeEnd: true, - keywords: KEYWORDS3, - contains: [ - // prevents these from being highlighted `title` - { - beginKeywords: FUNCTION_MODIFIERS.join(" "), - relevance: 0 - }, - { - begin: hljs.IDENT_RE + "\\s*(<[^=]+>\\s*)?\\(", - returnBegin: true, - contains: [ - hljs.TITLE_MODE, - GENERIC_MODIFIER - ], - relevance: 0 - }, - { match: /\(\)/ }, - { - className: "params", - begin: /\(/, - end: /\)/, - excludeBegin: true, - excludeEnd: true, - keywords: KEYWORDS3, - relevance: 0, - contains: [ - STRING, - NUMBERS, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - AT_IDENTIFIER - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/css.js -var MODES2 = (hljs) => { - return { - IMPORTANT: { - scope: "meta", - begin: "!important" - }, - BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, - HEXCOLOR: { - scope: "number", - begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ - }, - FUNCTION_DISPATCH: { - className: "built_in", - begin: /[\w-]+(?=\()/ - }, - ATTRIBUTE_SELECTOR_MODE: { - scope: "selector-attr", - begin: /\[/, - end: /\]/, - illegal: "$", - contains: [ - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE - ] - }, - CSS_NUMBER_MODE: { - scope: "number", - begin: hljs.NUMBER_RE + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", - relevance: 0 - }, - CSS_VARIABLE: { - className: "attr", - begin: /--[A-Za-z][A-Za-z0-9_-]*/ - } - }; -}; -var TAGS = [ - "a", - "abbr", - "address", - "article", - "aside", - "audio", - "b", - "blockquote", - "body", - "button", - "canvas", - "caption", - "cite", - "code", - "dd", - "del", - "details", - "dfn", - "div", - "dl", - "dt", - "em", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "header", - "hgroup", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "label", - "legend", - "li", - "main", - "mark", - "menu", - "nav", - "object", - "ol", - "p", - "q", - "quote", - "samp", - "section", - "span", - "strong", - "summary", - "sup", - "table", - "tbody", - "td", - "textarea", - "tfoot", - "th", - "thead", - "time", - "tr", - "ul", - "var", - "video" -]; -var MEDIA_FEATURES = [ - "any-hover", - "any-pointer", - "aspect-ratio", - "color", - "color-gamut", - "color-index", - "device-aspect-ratio", - "device-height", - "device-width", - "display-mode", - "forced-colors", - "grid", - "height", - "hover", - "inverted-colors", - "monochrome", - "orientation", - "overflow-block", - "overflow-inline", - "pointer", - "prefers-color-scheme", - "prefers-contrast", - "prefers-reduced-motion", - "prefers-reduced-transparency", - "resolution", - "scan", - "scripting", - "update", - "width", - // TODO: find a better solution? - "min-width", - "max-width", - "min-height", - "max-height" -]; -var PSEUDO_CLASSES = [ - "active", - "any-link", - "blank", - "checked", - "current", - "default", - "defined", - "dir", - // dir() - "disabled", - "drop", - "empty", - "enabled", - "first", - "first-child", - "first-of-type", - "fullscreen", - "future", - "focus", - "focus-visible", - "focus-within", - "has", - // has() - "host", - // host or host() - "host-context", - // host-context() - "hover", - "indeterminate", - "in-range", - "invalid", - "is", - // is() - "lang", - // lang() - "last-child", - "last-of-type", - "left", - "link", - "local-link", - "not", - // not() - "nth-child", - // nth-child() - "nth-col", - // nth-col() - "nth-last-child", - // nth-last-child() - "nth-last-col", - // nth-last-col() - "nth-last-of-type", - //nth-last-of-type() - "nth-of-type", - //nth-of-type() - "only-child", - "only-of-type", - "optional", - "out-of-range", - "past", - "placeholder-shown", - "read-only", - "read-write", - "required", - "right", - "root", - "scope", - "target", - "target-within", - "user-invalid", - "valid", - "visited", - "where" - // where() -]; -var PSEUDO_ELEMENTS = [ - "after", - "backdrop", - "before", - "cue", - "cue-region", - "first-letter", - "first-line", - "grammar-error", - "marker", - "part", - "placeholder", - "selection", - "slotted", - "spelling-error" -]; -var ATTRIBUTES = [ - "align-content", - "align-items", - "align-self", - "all", - "animation", - "animation-delay", - "animation-direction", - "animation-duration", - "animation-fill-mode", - "animation-iteration-count", - "animation-name", - "animation-play-state", - "animation-timing-function", - "backface-visibility", - "background", - "background-attachment", - "background-blend-mode", - "background-clip", - "background-color", - "background-image", - "background-origin", - "background-position", - "background-repeat", - "background-size", - "block-size", - "border", - "border-block", - "border-block-color", - "border-block-end", - "border-block-end-color", - "border-block-end-style", - "border-block-end-width", - "border-block-start", - "border-block-start-color", - "border-block-start-style", - "border-block-start-width", - "border-block-style", - "border-block-width", - "border-bottom", - "border-bottom-color", - "border-bottom-left-radius", - "border-bottom-right-radius", - "border-bottom-style", - "border-bottom-width", - "border-collapse", - "border-color", - "border-image", - "border-image-outset", - "border-image-repeat", - "border-image-slice", - "border-image-source", - "border-image-width", - "border-inline", - "border-inline-color", - "border-inline-end", - "border-inline-end-color", - "border-inline-end-style", - "border-inline-end-width", - "border-inline-start", - "border-inline-start-color", - "border-inline-start-style", - "border-inline-start-width", - "border-inline-style", - "border-inline-width", - "border-left", - "border-left-color", - "border-left-style", - "border-left-width", - "border-radius", - "border-right", - "border-right-color", - "border-right-style", - "border-right-width", - "border-spacing", - "border-style", - "border-top", - "border-top-color", - "border-top-left-radius", - "border-top-right-radius", - "border-top-style", - "border-top-width", - "border-width", - "bottom", - "box-decoration-break", - "box-shadow", - "box-sizing", - "break-after", - "break-before", - "break-inside", - "caption-side", - "caret-color", - "clear", - "clip", - "clip-path", - "clip-rule", - "color", - "column-count", - "column-fill", - "column-gap", - "column-rule", - "column-rule-color", - "column-rule-style", - "column-rule-width", - "column-span", - "column-width", - "columns", - "contain", - "content", - "content-visibility", - "counter-increment", - "counter-reset", - "cue", - "cue-after", - "cue-before", - "cursor", - "direction", - "display", - "empty-cells", - "filter", - "flex", - "flex-basis", - "flex-direction", - "flex-flow", - "flex-grow", - "flex-shrink", - "flex-wrap", - "float", - "flow", - "font", - "font-display", - "font-family", - "font-feature-settings", - "font-kerning", - "font-language-override", - "font-size", - "font-size-adjust", - "font-smoothing", - "font-stretch", - "font-style", - "font-synthesis", - "font-variant", - "font-variant-caps", - "font-variant-east-asian", - "font-variant-ligatures", - "font-variant-numeric", - "font-variant-position", - "font-variation-settings", - "font-weight", - "gap", - "glyph-orientation-vertical", - "grid", - "grid-area", - "grid-auto-columns", - "grid-auto-flow", - "grid-auto-rows", - "grid-column", - "grid-column-end", - "grid-column-start", - "grid-gap", - "grid-row", - "grid-row-end", - "grid-row-start", - "grid-template", - "grid-template-areas", - "grid-template-columns", - "grid-template-rows", - "hanging-punctuation", - "height", - "hyphens", - "icon", - "image-orientation", - "image-rendering", - "image-resolution", - "ime-mode", - "inline-size", - "isolation", - "justify-content", - "left", - "letter-spacing", - "line-break", - "line-height", - "list-style", - "list-style-image", - "list-style-position", - "list-style-type", - "margin", - "margin-block", - "margin-block-end", - "margin-block-start", - "margin-bottom", - "margin-inline", - "margin-inline-end", - "margin-inline-start", - "margin-left", - "margin-right", - "margin-top", - "marks", - "mask", - "mask-border", - "mask-border-mode", - "mask-border-outset", - "mask-border-repeat", - "mask-border-slice", - "mask-border-source", - "mask-border-width", - "mask-clip", - "mask-composite", - "mask-image", - "mask-mode", - "mask-origin", - "mask-position", - "mask-repeat", - "mask-size", - "mask-type", - "max-block-size", - "max-height", - "max-inline-size", - "max-width", - "min-block-size", - "min-height", - "min-inline-size", - "min-width", - "mix-blend-mode", - "nav-down", - "nav-index", - "nav-left", - "nav-right", - "nav-up", - "none", - "normal", - "object-fit", - "object-position", - "opacity", - "order", - "orphans", - "outline", - "outline-color", - "outline-offset", - "outline-style", - "outline-width", - "overflow", - "overflow-wrap", - "overflow-x", - "overflow-y", - "padding", - "padding-block", - "padding-block-end", - "padding-block-start", - "padding-bottom", - "padding-inline", - "padding-inline-end", - "padding-inline-start", - "padding-left", - "padding-right", - "padding-top", - "page-break-after", - "page-break-before", - "page-break-inside", - "pause", - "pause-after", - "pause-before", - "perspective", - "perspective-origin", - "pointer-events", - "position", - "quotes", - "resize", - "rest", - "rest-after", - "rest-before", - "right", - "row-gap", - "scroll-margin", - "scroll-margin-block", - "scroll-margin-block-end", - "scroll-margin-block-start", - "scroll-margin-bottom", - "scroll-margin-inline", - "scroll-margin-inline-end", - "scroll-margin-inline-start", - "scroll-margin-left", - "scroll-margin-right", - "scroll-margin-top", - "scroll-padding", - "scroll-padding-block", - "scroll-padding-block-end", - "scroll-padding-block-start", - "scroll-padding-bottom", - "scroll-padding-inline", - "scroll-padding-inline-end", - "scroll-padding-inline-start", - "scroll-padding-left", - "scroll-padding-right", - "scroll-padding-top", - "scroll-snap-align", - "scroll-snap-stop", - "scroll-snap-type", - "scrollbar-color", - "scrollbar-gutter", - "scrollbar-width", - "shape-image-threshold", - "shape-margin", - "shape-outside", - "speak", - "speak-as", - "src", - // @font-face - "tab-size", - "table-layout", - "text-align", - "text-align-all", - "text-align-last", - "text-combine-upright", - "text-decoration", - "text-decoration-color", - "text-decoration-line", - "text-decoration-style", - "text-emphasis", - "text-emphasis-color", - "text-emphasis-position", - "text-emphasis-style", - "text-indent", - "text-justify", - "text-orientation", - "text-overflow", - "text-rendering", - "text-shadow", - "text-transform", - "text-underline-position", - "top", - "transform", - "transform-box", - "transform-origin", - "transform-style", - "transition", - "transition-delay", - "transition-duration", - "transition-property", - "transition-timing-function", - "unicode-bidi", - "vertical-align", - "visibility", - "voice-balance", - "voice-duration", - "voice-family", - "voice-pitch", - "voice-range", - "voice-rate", - "voice-stress", - "voice-volume", - "white-space", - "widows", - "width", - "will-change", - "word-break", - "word-spacing", - "word-wrap", - "writing-mode", - "z-index" - // reverse makes sure longer attributes `font-weight` are matched fully - // instead of getting false positives on say `font` -].reverse(); -function css(hljs) { - const regex = hljs.regex; - const modes = MODES2(hljs); - const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ }; - const AT_MODIFIERS = "and or not only"; - const AT_PROPERTY_RE = /@-?\w[\w]*(-\w+)*/; - const IDENT_RE4 = "[a-zA-Z-][a-zA-Z0-9_-]*"; - const STRINGS = [ - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE - ]; - return { - name: "CSS", - case_insensitive: true, - illegal: /[=|'\$]/, - keywords: { keyframePosition: "from to" }, - classNameAliases: { - // for visual continuity with `tag {}` and because we - // don't have a great class for this? - keyframePosition: "selector-tag" - }, - contains: [ - modes.BLOCK_COMMENT, - VENDOR_PREFIX, - // to recognize keyframe 40% etc which are outside the scope of our - // attribute value mode - modes.CSS_NUMBER_MODE, - { - className: "selector-id", - begin: /#[A-Za-z0-9_-]+/, - relevance: 0 - }, - { - className: "selector-class", - begin: "\\." + IDENT_RE4, - relevance: 0 - }, - modes.ATTRIBUTE_SELECTOR_MODE, - { - className: "selector-pseudo", - variants: [ - { begin: ":(" + PSEUDO_CLASSES.join("|") + ")" }, - { begin: ":(:)?(" + PSEUDO_ELEMENTS.join("|") + ")" } - ] - }, - // we may actually need this (12/2020) - // { // pseudo-selector params - // begin: /\(/, - // end: /\)/, - // contains: [ hljs.CSS_NUMBER_MODE ] - // }, - modes.CSS_VARIABLE, - { - className: "attribute", - begin: "\\b(" + ATTRIBUTES.join("|") + ")\\b" - }, - // attribute values - { - begin: /:/, - end: /[;}{]/, - contains: [ - modes.BLOCK_COMMENT, - modes.HEXCOLOR, - modes.IMPORTANT, - modes.CSS_NUMBER_MODE, - ...STRINGS, - // needed to highlight these as strings and to avoid issues with - // illegal characters that might be inside urls that would tigger the - // languages illegal stack - { - begin: /(url|data-uri)\(/, - end: /\)/, - relevance: 0, - // from keywords - keywords: { built_in: "url data-uri" }, - contains: [ - ...STRINGS, - { - className: "string", - // any character other than `)` as in `url()` will be the start - // of a string, which ends with `)` (from the parent mode) - begin: /[^)]/, - endsWithParent: true, - excludeEnd: true - } - ] - }, - modes.FUNCTION_DISPATCH - ] - }, - { - begin: regex.lookahead(/@/), - end: "[{;]", - relevance: 0, - illegal: /:/, - // break on Less variables @var: ... - contains: [ - { - className: "keyword", - begin: AT_PROPERTY_RE - }, - { - begin: /\s/, - endsWithParent: true, - excludeEnd: true, - relevance: 0, - keywords: { - $pattern: /[a-z-]+/, - keyword: AT_MODIFIERS, - attribute: MEDIA_FEATURES.join(" ") - }, - contains: [ - { - begin: /[a-z-]+(?=:)/, - className: "attribute" - }, - ...STRINGS, - modes.CSS_NUMBER_MODE - ] - } - ] - }, - { - className: "selector-tag", - begin: "\\b(" + TAGS.join("|") + ")\\b" - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/diff.js -function diff(hljs) { - const regex = hljs.regex; - return { - name: "Diff", - aliases: ["patch"], - contains: [ - { - className: "meta", - relevance: 10, - match: regex.either( - /^@@ +-\d+,\d+ +\+\d+,\d+ +@@/, - /^\*\*\* +\d+,\d+ +\*\*\*\*$/, - /^--- +\d+,\d+ +----$/ - ) - }, - { - className: "comment", - variants: [ - { - begin: regex.either( - /Index: /, - /^index/, - /={3,}/, - /^-{3}/, - /^\*{3} /, - /^\+{3}/, - /^diff --git/ - ), - end: /$/ - }, - { match: /^\*{15}$/ } - ] - }, - { - className: "addition", - begin: /^\+/, - end: /$/ - }, - { - className: "deletion", - begin: /^-/, - end: /$/ - }, - { - className: "addition", - begin: /^!/, - end: /$/ - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/go.js -function go(hljs) { - const LITERALS3 = [ - "true", - "false", - "iota", - "nil" - ]; - const BUILT_INS3 = [ - "append", - "cap", - "close", - "complex", - "copy", - "imag", - "len", - "make", - "new", - "panic", - "print", - "println", - "real", - "recover", - "delete" - ]; - const TYPES3 = [ - "bool", - "byte", - "complex64", - "complex128", - "error", - "float32", - "float64", - "int8", - "int16", - "int32", - "int64", - "string", - "uint8", - "uint16", - "uint32", - "uint64", - "int", - "uint", - "uintptr", - "rune" - ]; - const KWS = [ - "break", - "case", - "chan", - "const", - "continue", - "default", - "defer", - "else", - "fallthrough", - "for", - "func", - "go", - "goto", - "if", - "import", - "interface", - "map", - "package", - "range", - "return", - "select", - "struct", - "switch", - "type", - "var" - ]; - const KEYWORDS3 = { - keyword: KWS, - type: TYPES3, - literal: LITERALS3, - built_in: BUILT_INS3 - }; - return { - name: "Go", - aliases: ["golang"], - keywords: KEYWORDS3, - illegal: " { - return recurRegex(re, substitution, depth - 1); - }); -} -function java(hljs) { - const regex = hljs.regex; - const JAVA_IDENT_RE = "[\xC0-\u02B8a-zA-Z_$][\xC0-\u02B8a-zA-Z_$0-9]*"; - const GENERIC_IDENT_RE = JAVA_IDENT_RE + recurRegex("(?:<" + JAVA_IDENT_RE + "~~~(?:\\s*,\\s*" + JAVA_IDENT_RE + "~~~)*>)?", /~~~/g, 2); - const MAIN_KEYWORDS = [ - "synchronized", - "abstract", - "private", - "var", - "static", - "if", - "const ", - "for", - "while", - "strictfp", - "finally", - "protected", - "import", - "native", - "final", - "void", - "enum", - "else", - "break", - "transient", - "catch", - "instanceof", - "volatile", - "case", - "assert", - "package", - "default", - "public", - "try", - "switch", - "continue", - "throws", - "protected", - "public", - "private", - "module", - "requires", - "exports", - "do", - "sealed", - "yield", - "permits" - ]; - const BUILT_INS3 = [ - "super", - "this" - ]; - const LITERALS3 = [ - "false", - "true", - "null" - ]; - const TYPES3 = [ - "char", - "boolean", - "long", - "float", - "int", - "byte", - "short", - "double" - ]; - const KEYWORDS3 = { - keyword: MAIN_KEYWORDS, - literal: LITERALS3, - type: TYPES3, - built_in: BUILT_INS3 - }; - const ANNOTATION = { - className: "meta", - begin: "@" + JAVA_IDENT_RE, - contains: [ - { - begin: /\(/, - end: /\)/, - contains: ["self"] - // allow nested () inside our annotation - } - ] - }; - const PARAMS = { - className: "params", - begin: /\(/, - end: /\)/, - keywords: KEYWORDS3, - relevance: 0, - contains: [hljs.C_BLOCK_COMMENT_MODE], - endsParent: true - }; - return { - name: "Java", - aliases: ["jsp"], - keywords: KEYWORDS3, - illegal: /<\/|#/, - contains: [ - hljs.COMMENT( - "/\\*\\*", - "\\*/", - { - relevance: 0, - contains: [ - { - // eat up @'s in emails to prevent them to be recognized as doctags - begin: /\w+@/, - relevance: 0 - }, - { - className: "doctag", - begin: "@[A-Za-z]+" - } - ] - } - ), - // relevance boost - { - begin: /import java\.[a-z]+\./, - keywords: "import", - relevance: 2 - }, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE, - { - begin: /"""/, - end: /"""/, - className: "string", - contains: [hljs.BACKSLASH_ESCAPE] - }, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - { - match: [ - /\b(?:class|interface|enum|extends|implements|new)/, - /\s+/, - JAVA_IDENT_RE - ], - className: { - 1: "keyword", - 3: "title.class" - } - }, - { - // Exceptions for hyphenated keywords - match: /non-sealed/, - scope: "keyword" - }, - { - begin: [ - regex.concat(/(?!else)/, JAVA_IDENT_RE), - /\s+/, - JAVA_IDENT_RE, - /\s+/, - /=(?!=)/ - ], - className: { - 1: "type", - 3: "variable", - 5: "operator" - } - }, - { - begin: [ - /record/, - /\s+/, - JAVA_IDENT_RE - ], - className: { - 1: "keyword", - 3: "title.class" - }, - contains: [ - PARAMS, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - { - // Expression keywords prevent 'keyword Name(...)' from being - // recognized as a function definition - beginKeywords: "new throw return else", - relevance: 0 - }, - { - begin: [ - "(?:" + GENERIC_IDENT_RE + "\\s+)", - hljs.UNDERSCORE_IDENT_RE, - /\s*(?=\()/ - ], - className: { 2: "title.function" }, - keywords: KEYWORDS3, - contains: [ - { - className: "params", - begin: /\(/, - end: /\)/, - keywords: KEYWORDS3, - relevance: 0, - contains: [ - ANNOTATION, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - NUMERIC, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - NUMERIC, - ANNOTATION - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/javascript.js -var IDENT_RE2 = "[A-Za-z$_][0-9A-Za-z$_]*"; -var KEYWORDS = [ - "as", - // for exports - "in", - "of", - "if", - "for", - "while", - "finally", - "var", - "new", - "function", - "do", - "return", - "void", - "else", - "break", - "catch", - "instanceof", - "with", - "throw", - "case", - "default", - "try", - "switch", - "continue", - "typeof", - "delete", - "let", - "yield", - "const", - "class", - // JS handles these with a special rule - // "get", - // "set", - "debugger", - "async", - "await", - "static", - "import", - "from", - "export", - "extends" -]; -var LITERALS = [ - "true", - "false", - "null", - "undefined", - "NaN", - "Infinity" -]; -var TYPES = [ - // Fundamental objects - "Object", - "Function", - "Boolean", - "Symbol", - // numbers and dates - "Math", - "Date", - "Number", - "BigInt", - // text - "String", - "RegExp", - // Indexed collections - "Array", - "Float32Array", - "Float64Array", - "Int8Array", - "Uint8Array", - "Uint8ClampedArray", - "Int16Array", - "Int32Array", - "Uint16Array", - "Uint32Array", - "BigInt64Array", - "BigUint64Array", - // Keyed collections - "Set", - "Map", - "WeakSet", - "WeakMap", - // Structured data - "ArrayBuffer", - "SharedArrayBuffer", - "Atomics", - "DataView", - "JSON", - // Control abstraction objects - "Promise", - "Generator", - "GeneratorFunction", - "AsyncFunction", - // Reflection - "Reflect", - "Proxy", - // Internationalization - "Intl", - // WebAssembly - "WebAssembly" -]; -var ERROR_TYPES = [ - "Error", - "EvalError", - "InternalError", - "RangeError", - "ReferenceError", - "SyntaxError", - "TypeError", - "URIError" -]; -var BUILT_IN_GLOBALS = [ - "setInterval", - "setTimeout", - "clearInterval", - "clearTimeout", - "require", - "exports", - "eval", - "isFinite", - "isNaN", - "parseFloat", - "parseInt", - "decodeURI", - "decodeURIComponent", - "encodeURI", - "encodeURIComponent", - "escape", - "unescape" -]; -var BUILT_IN_VARIABLES = [ - "arguments", - "this", - "super", - "console", - "window", - "document", - "localStorage", - "sessionStorage", - "module", - "global" - // Node.js -]; -var BUILT_INS = [].concat( - BUILT_IN_GLOBALS, - TYPES, - ERROR_TYPES -); -function javascript(hljs) { - const regex = hljs.regex; - const hasClosingTag = (match, { after }) => { - const tag = "", - end: "" - }; - const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/; - const XML_TAG = { - begin: /<[A-Za-z0-9\\._:-]+/, - end: /\/[A-Za-z0-9\\._:-]+>|\/>/, - /** - * @param {RegExpMatchArray} match - * @param {CallbackResponse} response - */ - isTrulyOpeningTag: (match, response) => { - const afterMatchIndex = match[0].length + match.index; - const nextChar = match.input[afterMatchIndex]; - if ( - // HTML should not include another raw `<` inside a tag - // nested type? - // `>`, etc. - nextChar === "<" || // the , gives away that this is not HTML - // `` - nextChar === "," - ) { - response.ignoreMatch(); - return; - } - if (nextChar === ">") { - if (!hasClosingTag(match, { after: afterMatchIndex })) { - response.ignoreMatch(); - } - } - let m; - const afterMatch = match.input.substring(afterMatchIndex); - if (m = afterMatch.match(/^\s*=/)) { - response.ignoreMatch(); - return; - } - if (m = afterMatch.match(/^\s+extends\s+/)) { - if (m.index === 0) { - response.ignoreMatch(); - return; - } - } - } - }; - const KEYWORDS$1 = { - $pattern: IDENT_RE2, - keyword: KEYWORDS, - literal: LITERALS, - built_in: BUILT_INS, - "variable.language": BUILT_IN_VARIABLES - }; - const decimalDigits3 = "[0-9](_?[0-9])*"; - const frac3 = `\\.(${decimalDigits3})`; - const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; - const NUMBER = { - className: "number", - variants: [ - // DecimalLiteral - { begin: `(\\b(${decimalInteger})((${frac3})|\\.)?|(${frac3}))[eE][+-]?(${decimalDigits3})\\b` }, - { begin: `\\b(${decimalInteger})\\b((${frac3})\\b|\\.)?|(${frac3})\\b` }, - // DecimalBigIntegerLiteral - { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, - // NonDecimalIntegerLiteral - { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, - { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, - { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, - // LegacyOctalIntegerLiteral (does not include underscore separators) - // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals - { begin: "\\b0[0-7]+n?\\b" } - ], - relevance: 0 - }; - const SUBST = { - className: "subst", - begin: "\\$\\{", - end: "\\}", - keywords: KEYWORDS$1, - contains: [] - // defined later - }; - const HTML_TEMPLATE = { - begin: "html`", - end: "", - starts: { - end: "`", - returnEnd: false, - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - subLanguage: "xml" - } - }; - const CSS_TEMPLATE = { - begin: "css`", - end: "", - starts: { - end: "`", - returnEnd: false, - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - subLanguage: "css" - } - }; - const GRAPHQL_TEMPLATE = { - begin: "gql`", - end: "", - starts: { - end: "`", - returnEnd: false, - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - subLanguage: "graphql" - } - }; - const TEMPLATE_STRING = { - className: "string", - begin: "`", - end: "`", - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ] - }; - const JSDOC_COMMENT = hljs.COMMENT( - /\/\*\*(?!\/)/, - "\\*/", - { - relevance: 0, - contains: [ - { - begin: "(?=@[A-Za-z]+)", - relevance: 0, - contains: [ - { - className: "doctag", - begin: "@[A-Za-z]+" - }, - { - className: "type", - begin: "\\{", - end: "\\}", - excludeEnd: true, - excludeBegin: true, - relevance: 0 - }, - { - className: "variable", - begin: IDENT_RE$1 + "(?=\\s*(-)|$)", - endsParent: true, - relevance: 0 - }, - // eat spaces (not newlines) so we can find - // types or variables - { - begin: /(?=[^\n])\s/, - relevance: 0 - } - ] - } - ] - } - ); - const COMMENT2 = { - className: "comment", - variants: [ - JSDOC_COMMENT, - hljs.C_BLOCK_COMMENT_MODE, - hljs.C_LINE_COMMENT_MODE - ] - }; - const SUBST_INTERNALS = [ - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - HTML_TEMPLATE, - CSS_TEMPLATE, - GRAPHQL_TEMPLATE, - TEMPLATE_STRING, - // Skip numbers when they are part of a variable name - { match: /\$\d+/ }, - NUMBER - // This is intentional: - // See https://github.com/highlightjs/highlight.js/issues/3288 - // hljs.REGEXP_MODE - ]; - SUBST.contains = SUBST_INTERNALS.concat({ - // we need to pair up {} inside our subst to prevent - // it from ending too early by matching another } - begin: /\{/, - end: /\}/, - keywords: KEYWORDS$1, - contains: [ - "self" - ].concat(SUBST_INTERNALS) - }); - const SUBST_AND_COMMENTS = [].concat(COMMENT2, SUBST.contains); - const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ - // eat recursive parens in sub expressions - { - begin: /\(/, - end: /\)/, - keywords: KEYWORDS$1, - contains: ["self"].concat(SUBST_AND_COMMENTS) - } - ]); - const PARAMS = { - className: "params", - begin: /\(/, - end: /\)/, - excludeBegin: true, - excludeEnd: true, - keywords: KEYWORDS$1, - contains: PARAMS_CONTAINS - }; - const CLASS_OR_EXTENDS = { - variants: [ - // class Car extends vehicle - { - match: [ - /class/, - /\s+/, - IDENT_RE$1, - /\s+/, - /extends/, - /\s+/, - regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*") - ], - scope: { - 1: "keyword", - 3: "title.class", - 5: "keyword", - 7: "title.class.inherited" - } - }, - // class Car - { - match: [ - /class/, - /\s+/, - IDENT_RE$1 - ], - scope: { - 1: "keyword", - 3: "title.class" - } - } - ] - }; - const CLASS_REFERENCE = { - relevance: 0, - match: regex.either( - // Hard coded exceptions - /\bJSON/, - // Float32Array, OutT - /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, - // CSSFactory, CSSFactoryT - /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, - // FPs, FPsT - /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/ - // P - // single letters are not highlighted - // BLAH - // this will be flagged as a UPPER_CASE_CONSTANT instead - ), - className: "title.class", - keywords: { - _: [ - // se we still get relevance credit for JS library classes - ...TYPES, - ...ERROR_TYPES - ] - } - }; - const USE_STRICT = { - label: "use_strict", - className: "meta", - relevance: 10, - begin: /^\s*['"]use (strict|asm)['"]/ - }; - const FUNCTION_DEFINITION = { - variants: [ - { - match: [ - /function/, - /\s+/, - IDENT_RE$1, - /(?=\s*\()/ - ] - }, - // anonymous function - { - match: [ - /function/, - /\s*(?=\()/ - ] - } - ], - className: { - 1: "keyword", - 3: "title.function" - }, - label: "func.def", - contains: [PARAMS], - illegal: /%/ - }; - const UPPER_CASE_CONSTANT = { - relevance: 0, - match: /\b[A-Z][A-Z_0-9]+\b/, - className: "variable.constant" - }; - function noneOf(list) { - return regex.concat("(?!", list.join("|"), ")"); - } - const FUNCTION_CALL = { - match: regex.concat( - /\b/, - noneOf([ - ...BUILT_IN_GLOBALS, - "super", - "import" - ]), - IDENT_RE$1, - regex.lookahead(/\(/) - ), - className: "title.function", - relevance: 0 - }; - const PROPERTY_ACCESS = { - begin: regex.concat(/\./, regex.lookahead( - regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/) - )), - end: IDENT_RE$1, - excludeBegin: true, - keywords: "prototype", - className: "property", - relevance: 0 - }; - const GETTER_OR_SETTER = { - match: [ - /get|set/, - /\s+/, - IDENT_RE$1, - /(?=\()/ - ], - className: { - 1: "keyword", - 3: "title.function" - }, - contains: [ - { - // eat to avoid empty params - begin: /\(\)/ - }, - PARAMS - ] - }; - const FUNC_LEAD_IN_RE = "(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|" + hljs.UNDERSCORE_IDENT_RE + ")\\s*=>"; - const FUNCTION_VARIABLE = { - match: [ - /const|var|let/, - /\s+/, - IDENT_RE$1, - /\s*/, - /=\s*/, - /(async\s*)?/, - // async is optional - regex.lookahead(FUNC_LEAD_IN_RE) - ], - keywords: "async", - className: { - 1: "keyword", - 3: "title.function" - }, - contains: [ - PARAMS - ] - }; - return { - name: "JavaScript", - aliases: ["js", "jsx", "mjs", "cjs"], - keywords: KEYWORDS$1, - // this will be extended by TypeScript - exports: { PARAMS_CONTAINS, CLASS_REFERENCE }, - illegal: /#(?![$_A-z])/, - contains: [ - hljs.SHEBANG({ - label: "shebang", - binary: "node", - relevance: 5 - }), - USE_STRICT, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - HTML_TEMPLATE, - CSS_TEMPLATE, - GRAPHQL_TEMPLATE, - TEMPLATE_STRING, - COMMENT2, - // Skip numbers when they are part of a variable name - { match: /\$\d+/ }, - NUMBER, - CLASS_REFERENCE, - { - className: "attr", - begin: IDENT_RE$1 + regex.lookahead(":"), - relevance: 0 - }, - FUNCTION_VARIABLE, - { - // "value" container - begin: "(" + hljs.RE_STARTERS_RE + "|\\b(case|return|throw)\\b)\\s*", - keywords: "return throw case", - relevance: 0, - contains: [ - COMMENT2, - hljs.REGEXP_MODE, - { - className: "function", - // we have to count the parens to make sure we actually have the - // correct bounding ( ) before the =>. There could be any number of - // sub-expressions inside also surrounded by parens. - begin: FUNC_LEAD_IN_RE, - returnBegin: true, - end: "\\s*=>", - contains: [ - { - className: "params", - variants: [ - { - begin: hljs.UNDERSCORE_IDENT_RE, - relevance: 0 - }, - { - className: null, - begin: /\(\s*\)/, - skip: true - }, - { - begin: /\(/, - end: /\)/, - excludeBegin: true, - excludeEnd: true, - keywords: KEYWORDS$1, - contains: PARAMS_CONTAINS - } - ] - } - ] - }, - { - // could be a comma delimited list of params to a function call - begin: /,/, - relevance: 0 - }, - { - match: /\s+/, - relevance: 0 - }, - { - // JSX - variants: [ - { begin: FRAGMENT.begin, end: FRAGMENT.end }, - { match: XML_SELF_CLOSING }, - { - begin: XML_TAG.begin, - // we carefully check the opening tag to see if it truly - // is a tag and not a false positive - "on:begin": XML_TAG.isTrulyOpeningTag, - end: XML_TAG.end - } - ], - subLanguage: "xml", - contains: [ - { - begin: XML_TAG.begin, - end: XML_TAG.end, - skip: true, - contains: ["self"] - } - ] - } - ] - }, - FUNCTION_DEFINITION, - { - // prevent this from getting swallowed up by function - // since they appear "function like" - beginKeywords: "while if switch catch for" - }, - { - // we have to count the parens to make sure we actually have the correct - // bounding ( ). There could be any number of sub-expressions inside - // also surrounded by parens. - begin: "\\b(?!function)" + hljs.UNDERSCORE_IDENT_RE + "\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", - // end parens - returnBegin: true, - label: "func.def", - contains: [ - PARAMS, - hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" }) - ] - }, - // catch ... so it won't trigger the property rule below - { - match: /\.\.\./, - relevance: 0 - }, - PROPERTY_ACCESS, - // hack: prevents detection of keywords in some circumstances - // .keyword() - // $keyword = x - { - match: "\\$" + IDENT_RE$1, - relevance: 0 - }, - { - match: [/\bconstructor(?=\s*\()/], - className: { 1: "title.function" }, - contains: [PARAMS] - }, - FUNCTION_CALL, - UPPER_CASE_CONSTANT, - CLASS_OR_EXTENDS, - GETTER_OR_SETTER, - { - match: /\$[(.]/ - // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/json.js -function json(hljs) { - const ATTRIBUTE = { - className: "attr", - begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/, - relevance: 1.01 - }; - const PUNCTUATION = { - match: /[{}[\],:]/, - className: "punctuation", - relevance: 0 - }; - const LITERALS3 = [ - "true", - "false", - "null" - ]; - const LITERALS_MODE = { - scope: "literal", - beginKeywords: LITERALS3.join(" ") - }; - return { - name: "JSON", - keywords: { - literal: LITERALS3 - }, - contains: [ - ATTRIBUTE, - PUNCTUATION, - hljs.QUOTE_STRING_MODE, - LITERALS_MODE, - hljs.C_NUMBER_MODE, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ], - illegal: "\\S" - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/kotlin.js -var decimalDigits2 = "[0-9](_*[0-9])*"; -var frac2 = `\\.(${decimalDigits2})`; -var hexDigits2 = "[0-9a-fA-F](_*[0-9a-fA-F])*"; -var NUMERIC2 = { - className: "number", - variants: [ - // DecimalFloatingPointLiteral - // including ExponentPart - { begin: `(\\b(${decimalDigits2})((${frac2})|\\.)?|(${frac2}))[eE][+-]?(${decimalDigits2})[fFdD]?\\b` }, - // excluding ExponentPart - { begin: `\\b(${decimalDigits2})((${frac2})[fFdD]?\\b|\\.([fFdD]\\b)?)` }, - { begin: `(${frac2})[fFdD]?\\b` }, - { begin: `\\b(${decimalDigits2})[fFdD]\\b` }, - // HexadecimalFloatingPointLiteral - { begin: `\\b0[xX]((${hexDigits2})\\.?|(${hexDigits2})?\\.(${hexDigits2}))[pP][+-]?(${decimalDigits2})[fFdD]?\\b` }, - // DecimalIntegerLiteral - { begin: "\\b(0|[1-9](_*[0-9])*)[lL]?\\b" }, - // HexIntegerLiteral - { begin: `\\b0[xX](${hexDigits2})[lL]?\\b` }, - // OctalIntegerLiteral - { begin: "\\b0(_*[0-7])*[lL]?\\b" }, - // BinaryIntegerLiteral - { begin: "\\b0[bB][01](_*[01])*[lL]?\\b" } - ], - relevance: 0 -}; -function kotlin(hljs) { - const KEYWORDS3 = { - keyword: "abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", - built_in: "Byte Short Char Int Long Boolean Float Double Void Unit Nothing", - literal: "true false null" - }; - const KEYWORDS_WITH_LABEL = { - className: "keyword", - begin: /\b(break|continue|return|this)\b/, - starts: { contains: [ - { - className: "symbol", - begin: /@\w+/ - } - ] } - }; - const LABEL = { - className: "symbol", - begin: hljs.UNDERSCORE_IDENT_RE + "@" - }; - const SUBST = { - className: "subst", - begin: /\$\{/, - end: /\}/, - contains: [hljs.C_NUMBER_MODE] - }; - const VARIABLE = { - className: "variable", - begin: "\\$" + hljs.UNDERSCORE_IDENT_RE - }; - const STRING = { - className: "string", - variants: [ - { - begin: '"""', - end: '"""(?=[^"])', - contains: [ - VARIABLE, - SUBST - ] - }, - // Can't use built-in modes easily, as we want to use STRING in the meta - // context as 'meta-string' and there's no syntax to remove explicitly set - // classNames in built-in modes. - { - begin: "'", - end: "'", - illegal: /\n/, - contains: [hljs.BACKSLASH_ESCAPE] - }, - { - begin: '"', - end: '"', - illegal: /\n/, - contains: [ - hljs.BACKSLASH_ESCAPE, - VARIABLE, - SUBST - ] - } - ] - }; - SUBST.contains.push(STRING); - const ANNOTATION_USE_SITE = { - className: "meta", - begin: "@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*" + hljs.UNDERSCORE_IDENT_RE + ")?" - }; - const ANNOTATION = { - className: "meta", - begin: "@" + hljs.UNDERSCORE_IDENT_RE, - contains: [ - { - begin: /\(/, - end: /\)/, - contains: [ - hljs.inherit(STRING, { className: "string" }), - "self" - ] - } - ] - }; - const KOTLIN_NUMBER_MODE = NUMERIC2; - const KOTLIN_NESTED_COMMENT = hljs.COMMENT( - "/\\*", - "\\*/", - { contains: [hljs.C_BLOCK_COMMENT_MODE] } - ); - const KOTLIN_PAREN_TYPE = { variants: [ - { - className: "type", - begin: hljs.UNDERSCORE_IDENT_RE - }, - { - begin: /\(/, - end: /\)/, - contains: [] - // defined later - } - ] }; - const KOTLIN_PAREN_TYPE2 = KOTLIN_PAREN_TYPE; - KOTLIN_PAREN_TYPE2.variants[1].contains = [KOTLIN_PAREN_TYPE]; - KOTLIN_PAREN_TYPE.variants[1].contains = [KOTLIN_PAREN_TYPE2]; - return { - name: "Kotlin", - aliases: [ - "kt", - "kts" - ], - keywords: KEYWORDS3, - contains: [ - hljs.COMMENT( - "/\\*\\*", - "\\*/", - { - relevance: 0, - contains: [ - { - className: "doctag", - begin: "@[A-Za-z]+" - } - ] - } - ), - hljs.C_LINE_COMMENT_MODE, - KOTLIN_NESTED_COMMENT, - KEYWORDS_WITH_LABEL, - LABEL, - ANNOTATION_USE_SITE, - ANNOTATION, - { - className: "function", - beginKeywords: "fun", - end: "[(]|$", - returnBegin: true, - excludeEnd: true, - keywords: KEYWORDS3, - relevance: 5, - contains: [ - { - begin: hljs.UNDERSCORE_IDENT_RE + "\\s*\\(", - returnBegin: true, - relevance: 0, - contains: [hljs.UNDERSCORE_TITLE_MODE] - }, - { - className: "type", - begin: //, - keywords: "reified", - relevance: 0 - }, - { - className: "params", - begin: /\(/, - end: /\)/, - endsParent: true, - keywords: KEYWORDS3, - relevance: 0, - contains: [ - { - begin: /:/, - end: /[=,\/]/, - endsWithParent: true, - contains: [ - KOTLIN_PAREN_TYPE, - hljs.C_LINE_COMMENT_MODE, - KOTLIN_NESTED_COMMENT - ], - relevance: 0 - }, - hljs.C_LINE_COMMENT_MODE, - KOTLIN_NESTED_COMMENT, - ANNOTATION_USE_SITE, - ANNOTATION, - STRING, - hljs.C_NUMBER_MODE - ] - }, - KOTLIN_NESTED_COMMENT - ] - }, - { - begin: [ - /class|interface|trait/, - /\s+/, - hljs.UNDERSCORE_IDENT_RE - ], - beginScope: { - 3: "title.class" - }, - keywords: "class interface trait", - end: /[:\{(]|$/, - excludeEnd: true, - illegal: "extends implements", - contains: [ - { beginKeywords: "public protected internal private constructor" }, - hljs.UNDERSCORE_TITLE_MODE, - { - className: "type", - begin: //, - excludeBegin: true, - excludeEnd: true, - relevance: 0 - }, - { - className: "type", - begin: /[,:]\s*/, - end: /[<\(,){\s]|$/, - excludeBegin: true, - returnEnd: true - }, - ANNOTATION_USE_SITE, - ANNOTATION - ] - }, - STRING, - { - className: "meta", - begin: "^#!/usr/bin/env", - end: "$", - illegal: "\n" - }, - KOTLIN_NUMBER_MODE - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/less.js -var MODES3 = (hljs) => { - return { - IMPORTANT: { - scope: "meta", - begin: "!important" - }, - BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, - HEXCOLOR: { - scope: "number", - begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ - }, - FUNCTION_DISPATCH: { - className: "built_in", - begin: /[\w-]+(?=\()/ - }, - ATTRIBUTE_SELECTOR_MODE: { - scope: "selector-attr", - begin: /\[/, - end: /\]/, - illegal: "$", - contains: [ - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE - ] - }, - CSS_NUMBER_MODE: { - scope: "number", - begin: hljs.NUMBER_RE + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", - relevance: 0 - }, - CSS_VARIABLE: { - className: "attr", - begin: /--[A-Za-z][A-Za-z0-9_-]*/ - } - }; -}; -var TAGS2 = [ - "a", - "abbr", - "address", - "article", - "aside", - "audio", - "b", - "blockquote", - "body", - "button", - "canvas", - "caption", - "cite", - "code", - "dd", - "del", - "details", - "dfn", - "div", - "dl", - "dt", - "em", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "header", - "hgroup", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "label", - "legend", - "li", - "main", - "mark", - "menu", - "nav", - "object", - "ol", - "p", - "q", - "quote", - "samp", - "section", - "span", - "strong", - "summary", - "sup", - "table", - "tbody", - "td", - "textarea", - "tfoot", - "th", - "thead", - "time", - "tr", - "ul", - "var", - "video" -]; -var MEDIA_FEATURES2 = [ - "any-hover", - "any-pointer", - "aspect-ratio", - "color", - "color-gamut", - "color-index", - "device-aspect-ratio", - "device-height", - "device-width", - "display-mode", - "forced-colors", - "grid", - "height", - "hover", - "inverted-colors", - "monochrome", - "orientation", - "overflow-block", - "overflow-inline", - "pointer", - "prefers-color-scheme", - "prefers-contrast", - "prefers-reduced-motion", - "prefers-reduced-transparency", - "resolution", - "scan", - "scripting", - "update", - "width", - // TODO: find a better solution? - "min-width", - "max-width", - "min-height", - "max-height" -]; -var PSEUDO_CLASSES2 = [ - "active", - "any-link", - "blank", - "checked", - "current", - "default", - "defined", - "dir", - // dir() - "disabled", - "drop", - "empty", - "enabled", - "first", - "first-child", - "first-of-type", - "fullscreen", - "future", - "focus", - "focus-visible", - "focus-within", - "has", - // has() - "host", - // host or host() - "host-context", - // host-context() - "hover", - "indeterminate", - "in-range", - "invalid", - "is", - // is() - "lang", - // lang() - "last-child", - "last-of-type", - "left", - "link", - "local-link", - "not", - // not() - "nth-child", - // nth-child() - "nth-col", - // nth-col() - "nth-last-child", - // nth-last-child() - "nth-last-col", - // nth-last-col() - "nth-last-of-type", - //nth-last-of-type() - "nth-of-type", - //nth-of-type() - "only-child", - "only-of-type", - "optional", - "out-of-range", - "past", - "placeholder-shown", - "read-only", - "read-write", - "required", - "right", - "root", - "scope", - "target", - "target-within", - "user-invalid", - "valid", - "visited", - "where" - // where() -]; -var PSEUDO_ELEMENTS2 = [ - "after", - "backdrop", - "before", - "cue", - "cue-region", - "first-letter", - "first-line", - "grammar-error", - "marker", - "part", - "placeholder", - "selection", - "slotted", - "spelling-error" -]; -var ATTRIBUTES2 = [ - "align-content", - "align-items", - "align-self", - "all", - "animation", - "animation-delay", - "animation-direction", - "animation-duration", - "animation-fill-mode", - "animation-iteration-count", - "animation-name", - "animation-play-state", - "animation-timing-function", - "backface-visibility", - "background", - "background-attachment", - "background-blend-mode", - "background-clip", - "background-color", - "background-image", - "background-origin", - "background-position", - "background-repeat", - "background-size", - "block-size", - "border", - "border-block", - "border-block-color", - "border-block-end", - "border-block-end-color", - "border-block-end-style", - "border-block-end-width", - "border-block-start", - "border-block-start-color", - "border-block-start-style", - "border-block-start-width", - "border-block-style", - "border-block-width", - "border-bottom", - "border-bottom-color", - "border-bottom-left-radius", - "border-bottom-right-radius", - "border-bottom-style", - "border-bottom-width", - "border-collapse", - "border-color", - "border-image", - "border-image-outset", - "border-image-repeat", - "border-image-slice", - "border-image-source", - "border-image-width", - "border-inline", - "border-inline-color", - "border-inline-end", - "border-inline-end-color", - "border-inline-end-style", - "border-inline-end-width", - "border-inline-start", - "border-inline-start-color", - "border-inline-start-style", - "border-inline-start-width", - "border-inline-style", - "border-inline-width", - "border-left", - "border-left-color", - "border-left-style", - "border-left-width", - "border-radius", - "border-right", - "border-right-color", - "border-right-style", - "border-right-width", - "border-spacing", - "border-style", - "border-top", - "border-top-color", - "border-top-left-radius", - "border-top-right-radius", - "border-top-style", - "border-top-width", - "border-width", - "bottom", - "box-decoration-break", - "box-shadow", - "box-sizing", - "break-after", - "break-before", - "break-inside", - "caption-side", - "caret-color", - "clear", - "clip", - "clip-path", - "clip-rule", - "color", - "column-count", - "column-fill", - "column-gap", - "column-rule", - "column-rule-color", - "column-rule-style", - "column-rule-width", - "column-span", - "column-width", - "columns", - "contain", - "content", - "content-visibility", - "counter-increment", - "counter-reset", - "cue", - "cue-after", - "cue-before", - "cursor", - "direction", - "display", - "empty-cells", - "filter", - "flex", - "flex-basis", - "flex-direction", - "flex-flow", - "flex-grow", - "flex-shrink", - "flex-wrap", - "float", - "flow", - "font", - "font-display", - "font-family", - "font-feature-settings", - "font-kerning", - "font-language-override", - "font-size", - "font-size-adjust", - "font-smoothing", - "font-stretch", - "font-style", - "font-synthesis", - "font-variant", - "font-variant-caps", - "font-variant-east-asian", - "font-variant-ligatures", - "font-variant-numeric", - "font-variant-position", - "font-variation-settings", - "font-weight", - "gap", - "glyph-orientation-vertical", - "grid", - "grid-area", - "grid-auto-columns", - "grid-auto-flow", - "grid-auto-rows", - "grid-column", - "grid-column-end", - "grid-column-start", - "grid-gap", - "grid-row", - "grid-row-end", - "grid-row-start", - "grid-template", - "grid-template-areas", - "grid-template-columns", - "grid-template-rows", - "hanging-punctuation", - "height", - "hyphens", - "icon", - "image-orientation", - "image-rendering", - "image-resolution", - "ime-mode", - "inline-size", - "isolation", - "justify-content", - "left", - "letter-spacing", - "line-break", - "line-height", - "list-style", - "list-style-image", - "list-style-position", - "list-style-type", - "margin", - "margin-block", - "margin-block-end", - "margin-block-start", - "margin-bottom", - "margin-inline", - "margin-inline-end", - "margin-inline-start", - "margin-left", - "margin-right", - "margin-top", - "marks", - "mask", - "mask-border", - "mask-border-mode", - "mask-border-outset", - "mask-border-repeat", - "mask-border-slice", - "mask-border-source", - "mask-border-width", - "mask-clip", - "mask-composite", - "mask-image", - "mask-mode", - "mask-origin", - "mask-position", - "mask-repeat", - "mask-size", - "mask-type", - "max-block-size", - "max-height", - "max-inline-size", - "max-width", - "min-block-size", - "min-height", - "min-inline-size", - "min-width", - "mix-blend-mode", - "nav-down", - "nav-index", - "nav-left", - "nav-right", - "nav-up", - "none", - "normal", - "object-fit", - "object-position", - "opacity", - "order", - "orphans", - "outline", - "outline-color", - "outline-offset", - "outline-style", - "outline-width", - "overflow", - "overflow-wrap", - "overflow-x", - "overflow-y", - "padding", - "padding-block", - "padding-block-end", - "padding-block-start", - "padding-bottom", - "padding-inline", - "padding-inline-end", - "padding-inline-start", - "padding-left", - "padding-right", - "padding-top", - "page-break-after", - "page-break-before", - "page-break-inside", - "pause", - "pause-after", - "pause-before", - "perspective", - "perspective-origin", - "pointer-events", - "position", - "quotes", - "resize", - "rest", - "rest-after", - "rest-before", - "right", - "row-gap", - "scroll-margin", - "scroll-margin-block", - "scroll-margin-block-end", - "scroll-margin-block-start", - "scroll-margin-bottom", - "scroll-margin-inline", - "scroll-margin-inline-end", - "scroll-margin-inline-start", - "scroll-margin-left", - "scroll-margin-right", - "scroll-margin-top", - "scroll-padding", - "scroll-padding-block", - "scroll-padding-block-end", - "scroll-padding-block-start", - "scroll-padding-bottom", - "scroll-padding-inline", - "scroll-padding-inline-end", - "scroll-padding-inline-start", - "scroll-padding-left", - "scroll-padding-right", - "scroll-padding-top", - "scroll-snap-align", - "scroll-snap-stop", - "scroll-snap-type", - "scrollbar-color", - "scrollbar-gutter", - "scrollbar-width", - "shape-image-threshold", - "shape-margin", - "shape-outside", - "speak", - "speak-as", - "src", - // @font-face - "tab-size", - "table-layout", - "text-align", - "text-align-all", - "text-align-last", - "text-combine-upright", - "text-decoration", - "text-decoration-color", - "text-decoration-line", - "text-decoration-style", - "text-emphasis", - "text-emphasis-color", - "text-emphasis-position", - "text-emphasis-style", - "text-indent", - "text-justify", - "text-orientation", - "text-overflow", - "text-rendering", - "text-shadow", - "text-transform", - "text-underline-position", - "top", - "transform", - "transform-box", - "transform-origin", - "transform-style", - "transition", - "transition-delay", - "transition-duration", - "transition-property", - "transition-timing-function", - "unicode-bidi", - "vertical-align", - "visibility", - "voice-balance", - "voice-duration", - "voice-family", - "voice-pitch", - "voice-range", - "voice-rate", - "voice-stress", - "voice-volume", - "white-space", - "widows", - "width", - "will-change", - "word-break", - "word-spacing", - "word-wrap", - "writing-mode", - "z-index" - // reverse makes sure longer attributes `font-weight` are matched fully - // instead of getting false positives on say `font` -].reverse(); -var PSEUDO_SELECTORS = PSEUDO_CLASSES2.concat(PSEUDO_ELEMENTS2); -function less(hljs) { - const modes = MODES3(hljs); - const PSEUDO_SELECTORS$1 = PSEUDO_SELECTORS; - const AT_MODIFIERS = "and or not only"; - const IDENT_RE4 = "[\\w-]+"; - const INTERP_IDENT_RE = "(" + IDENT_RE4 + "|@\\{" + IDENT_RE4 + "\\})"; - const RULES = []; - const VALUE_MODES = []; - const STRING_MODE = function(c2) { - return { - // Less strings are not multiline (also include '~' for more consistent coloring of "escaped" strings) - className: "string", - begin: "~?" + c2 + ".*?" + c2 - }; - }; - const IDENT_MODE = function(name, begin, relevance) { - return { - className: name, - begin, - relevance - }; - }; - const AT_KEYWORDS = { - $pattern: /[a-z-]+/, - keyword: AT_MODIFIERS, - attribute: MEDIA_FEATURES2.join(" ") - }; - const PARENS_MODE = { - // used only to properly balance nested parens inside mixin call, def. arg list - begin: "\\(", - end: "\\)", - contains: VALUE_MODES, - keywords: AT_KEYWORDS, - relevance: 0 - }; - VALUE_MODES.push( - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE, - STRING_MODE("'"), - STRING_MODE('"'), - modes.CSS_NUMBER_MODE, - // fixme: it does not include dot for numbers like .5em :( - { - begin: "(url|data-uri)\\(", - starts: { - className: "string", - end: "[\\)\\n]", - excludeEnd: true - } - }, - modes.HEXCOLOR, - PARENS_MODE, - IDENT_MODE("variable", "@@?" + IDENT_RE4, 10), - IDENT_MODE("variable", "@\\{" + IDENT_RE4 + "\\}"), - IDENT_MODE("built_in", "~?`[^`]*?`"), - // inline javascript (or whatever host language) *multiline* string - { - // @media features (it’s here to not duplicate things in AT_RULE_MODE with extra PARENS_MODE overriding): - className: "attribute", - begin: IDENT_RE4 + "\\s*:", - end: ":", - returnBegin: true, - excludeEnd: true - }, - modes.IMPORTANT, - { beginKeywords: "and not" }, - modes.FUNCTION_DISPATCH - ); - const VALUE_WITH_RULESETS = VALUE_MODES.concat({ - begin: /\{/, - end: /\}/, - contains: RULES - }); - const MIXIN_GUARD_MODE = { - beginKeywords: "when", - endsWithParent: true, - contains: [{ beginKeywords: "and not" }].concat(VALUE_MODES) - // using this form to override VALUE’s 'function' match - }; - const RULE_MODE = { - begin: INTERP_IDENT_RE + "\\s*:", - returnBegin: true, - end: /[;}]/, - relevance: 0, - contains: [ - { begin: /-(webkit|moz|ms|o)-/ }, - modes.CSS_VARIABLE, - { - className: "attribute", - begin: "\\b(" + ATTRIBUTES2.join("|") + ")\\b", - end: /(?=:)/, - starts: { - endsWithParent: true, - illegal: "[<=$]", - relevance: 0, - contains: VALUE_MODES - } - } - ] - }; - const AT_RULE_MODE = { - className: "keyword", - begin: "@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", - starts: { - end: "[;{}]", - keywords: AT_KEYWORDS, - returnEnd: true, - contains: VALUE_MODES, - relevance: 0 - } - }; - const VAR_RULE_MODE = { - className: "variable", - variants: [ - // using more strict pattern for higher relevance to increase chances of Less detection. - // this is *the only* Less specific statement used in most of the sources, so... - // (we’ll still often loose to the css-parser unless there's '//' comment, - // simply because 1 variable just can't beat 99 properties :) - { - begin: "@" + IDENT_RE4 + "\\s*:", - relevance: 15 - }, - { begin: "@" + IDENT_RE4 } - ], - starts: { - end: "[;}]", - returnEnd: true, - contains: VALUE_WITH_RULESETS - } - }; - const SELECTOR_MODE = { - // first parse unambiguous selectors (i.e. those not starting with tag) - // then fall into the scary lookahead-discriminator variant. - // this mode also handles mixin definitions and calls - variants: [ - { - begin: "[\\.#:&\\[>]", - end: "[;{}]" - // mixin calls end with ';' - }, - { - begin: INTERP_IDENT_RE, - end: /\{/ - } - ], - returnBegin: true, - returnEnd: true, - illegal: `[<='$"]`, - relevance: 0, - contains: [ - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE, - MIXIN_GUARD_MODE, - IDENT_MODE("keyword", "all\\b"), - IDENT_MODE("variable", "@\\{" + IDENT_RE4 + "\\}"), - // otherwise it’s identified as tag - { - begin: "\\b(" + TAGS2.join("|") + ")\\b", - className: "selector-tag" - }, - modes.CSS_NUMBER_MODE, - IDENT_MODE("selector-tag", INTERP_IDENT_RE, 0), - IDENT_MODE("selector-id", "#" + INTERP_IDENT_RE), - IDENT_MODE("selector-class", "\\." + INTERP_IDENT_RE, 0), - IDENT_MODE("selector-tag", "&", 0), - modes.ATTRIBUTE_SELECTOR_MODE, - { - className: "selector-pseudo", - begin: ":(" + PSEUDO_CLASSES2.join("|") + ")" - }, - { - className: "selector-pseudo", - begin: ":(:)?(" + PSEUDO_ELEMENTS2.join("|") + ")" - }, - { - begin: /\(/, - end: /\)/, - relevance: 0, - contains: VALUE_WITH_RULESETS - }, - // argument list of parametric mixins - { begin: "!important" }, - // eat !important after mixin call or it will be colored as tag - modes.FUNCTION_DISPATCH - ] - }; - const PSEUDO_SELECTOR_MODE = { - begin: IDENT_RE4 + `:(:)?(${PSEUDO_SELECTORS$1.join("|")})`, - returnBegin: true, - contains: [SELECTOR_MODE] - }; - RULES.push( - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE, - AT_RULE_MODE, - VAR_RULE_MODE, - PSEUDO_SELECTOR_MODE, - RULE_MODE, - SELECTOR_MODE, - MIXIN_GUARD_MODE, - modes.FUNCTION_DISPATCH - ); - return { - name: "Less", - case_insensitive: true, - illegal: `[=>'/<($"]`, - contains: RULES - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/lua.js -function lua(hljs) { - const OPENING_LONG_BRACKET = "\\[=*\\["; - const CLOSING_LONG_BRACKET = "\\]=*\\]"; - const LONG_BRACKETS = { - begin: OPENING_LONG_BRACKET, - end: CLOSING_LONG_BRACKET, - contains: ["self"] - }; - const COMMENTS = [ - hljs.COMMENT("--(?!" + OPENING_LONG_BRACKET + ")", "$"), - hljs.COMMENT( - "--" + OPENING_LONG_BRACKET, - CLOSING_LONG_BRACKET, - { - contains: [LONG_BRACKETS], - relevance: 10 - } - ) - ]; - return { - name: "Lua", - keywords: { - $pattern: hljs.UNDERSCORE_IDENT_RE, - literal: "true false nil", - keyword: "and break do else elseif end for goto if in local not or repeat return then until while", - built_in: ( - // Metatags and globals: - "_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" - ) - }, - contains: COMMENTS.concat([ - { - className: "function", - beginKeywords: "function", - end: "\\)", - contains: [ - hljs.inherit(hljs.TITLE_MODE, { begin: "([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*" }), - { - className: "params", - begin: "\\(", - endsWithParent: true, - contains: COMMENTS - } - ].concat(COMMENTS) - }, - hljs.C_NUMBER_MODE, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - { - className: "string", - begin: OPENING_LONG_BRACKET, - end: CLOSING_LONG_BRACKET, - contains: [LONG_BRACKETS], - relevance: 5 - } - ]) - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/makefile.js -function makefile(hljs) { - const VARIABLE = { - className: "variable", - variants: [ - { - begin: "\\$\\(" + hljs.UNDERSCORE_IDENT_RE + "\\)", - contains: [hljs.BACKSLASH_ESCAPE] - }, - { begin: /\$[@%", - subLanguage: "xml", - relevance: 0 - }; - const HORIZONTAL_RULE = { - begin: "^[-\\*]{3,}", - end: "$" - }; - const CODE = { - className: "code", - variants: [ - // TODO: fix to allow these to work with sublanguage also - { begin: "(`{3,})[^`](.|\\n)*?\\1`*[ ]*" }, - { begin: "(~{3,})[^~](.|\\n)*?\\1~*[ ]*" }, - // needed to allow markdown as a sublanguage to work - { - begin: "```", - end: "```+[ ]*$" - }, - { - begin: "~~~", - end: "~~~+[ ]*$" - }, - { begin: "`.+?`" }, - { - begin: "(?=^( {4}|\\t))", - // use contains to gobble up multiple lines to allow the block to be whatever size - // but only have a single open/close tag vs one per line - contains: [ - { - begin: "^( {4}|\\t)", - end: "(\\n)$" - } - ], - relevance: 0 - } - ] - }; - const LIST = { - className: "bullet", - begin: "^[ ]*([*+-]|(\\d+\\.))(?=\\s+)", - end: "\\s+", - excludeEnd: true - }; - const LINK_REFERENCE = { - begin: /^\[[^\n]+\]:/, - returnBegin: true, - contains: [ - { - className: "symbol", - begin: /\[/, - end: /\]/, - excludeBegin: true, - excludeEnd: true - }, - { - className: "link", - begin: /:\s*/, - end: /$/, - excludeBegin: true - } - ] - }; - const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/; - const LINK = { - variants: [ - // too much like nested array access in so many languages - // to have any real relevance - { - begin: /\[.+?\]\[.*?\]/, - relevance: 0 - }, - // popular internet URLs - { - begin: /\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, - relevance: 2 - }, - { - begin: regex.concat(/\[.+?\]\(/, URL_SCHEME, /:\/\/.*?\)/), - relevance: 2 - }, - // relative urls - { - begin: /\[.+?\]\([./?&#].*?\)/, - relevance: 1 - }, - // whatever else, lower relevance (might not be a link at all) - { - begin: /\[.*?\]\(.*?\)/, - relevance: 0 - } - ], - returnBegin: true, - contains: [ - { - // empty strings for alt or link text - match: /\[(?=\])/ - }, - { - className: "string", - relevance: 0, - begin: "\\[", - end: "\\]", - excludeBegin: true, - returnEnd: true - }, - { - className: "link", - relevance: 0, - begin: "\\]\\(", - end: "\\)", - excludeBegin: true, - excludeEnd: true - }, - { - className: "symbol", - relevance: 0, - begin: "\\]\\[", - end: "\\]", - excludeBegin: true, - excludeEnd: true - } - ] - }; - const BOLD = { - className: "strong", - contains: [], - // defined later - variants: [ - { - begin: /_{2}(?!\s)/, - end: /_{2}/ - }, - { - begin: /\*{2}(?!\s)/, - end: /\*{2}/ - } - ] - }; - const ITALIC = { - className: "emphasis", - contains: [], - // defined later - variants: [ - { - begin: /\*(?![*\s])/, - end: /\*/ - }, - { - begin: /_(?![_\s])/, - end: /_/, - relevance: 0 - } - ] - }; - const BOLD_WITHOUT_ITALIC = hljs.inherit(BOLD, { contains: [] }); - const ITALIC_WITHOUT_BOLD = hljs.inherit(ITALIC, { contains: [] }); - BOLD.contains.push(ITALIC_WITHOUT_BOLD); - ITALIC.contains.push(BOLD_WITHOUT_ITALIC); - let CONTAINABLE = [ - INLINE_HTML, - LINK - ]; - [ - BOLD, - ITALIC, - BOLD_WITHOUT_ITALIC, - ITALIC_WITHOUT_BOLD - ].forEach((m) => { - m.contains = m.contains.concat(CONTAINABLE); - }); - CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC); - const HEADER = { - className: "section", - variants: [ - { - begin: "^#{1,6}", - end: "$", - contains: CONTAINABLE - }, - { - begin: "(?=^.+?\\n[=-]{2,}$)", - contains: [ - { begin: "^[=-]*$" }, - { - begin: "^", - end: "\\n", - contains: CONTAINABLE - } - ] - } - ] - }; - const BLOCKQUOTE = { - className: "quote", - begin: "^>\\s+", - contains: CONTAINABLE, - end: "$" - }; - return { - name: "Markdown", - aliases: [ - "md", - "mkdown", - "mkd" - ], - contains: [ - HEADER, - INLINE_HTML, - LIST, - BOLD, - ITALIC, - BLOCKQUOTE, - CODE, - HORIZONTAL_RULE, - LINK, - LINK_REFERENCE - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/objectivec.js -function objectivec(hljs) { - const API_CLASS = { - className: "built_in", - begin: "\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+" - }; - const IDENTIFIER_RE = /[a-zA-Z@][a-zA-Z0-9_]*/; - const TYPES3 = [ - "int", - "float", - "char", - "unsigned", - "signed", - "short", - "long", - "double", - "wchar_t", - "unichar", - "void", - "bool", - "BOOL", - "id|0", - "_Bool" - ]; - const KWS = [ - "while", - "export", - "sizeof", - "typedef", - "const", - "struct", - "for", - "union", - "volatile", - "static", - "mutable", - "if", - "do", - "return", - "goto", - "enum", - "else", - "break", - "extern", - "asm", - "case", - "default", - "register", - "explicit", - "typename", - "switch", - "continue", - "inline", - "readonly", - "assign", - "readwrite", - "self", - "@synchronized", - "id", - "typeof", - "nonatomic", - "IBOutlet", - "IBAction", - "strong", - "weak", - "copy", - "in", - "out", - "inout", - "bycopy", - "byref", - "oneway", - "__strong", - "__weak", - "__block", - "__autoreleasing", - "@private", - "@protected", - "@public", - "@try", - "@property", - "@end", - "@throw", - "@catch", - "@finally", - "@autoreleasepool", - "@synthesize", - "@dynamic", - "@selector", - "@optional", - "@required", - "@encode", - "@package", - "@import", - "@defs", - "@compatibility_alias", - "__bridge", - "__bridge_transfer", - "__bridge_retained", - "__bridge_retain", - "__covariant", - "__contravariant", - "__kindof", - "_Nonnull", - "_Nullable", - "_Null_unspecified", - "__FUNCTION__", - "__PRETTY_FUNCTION__", - "__attribute__", - "getter", - "setter", - "retain", - "unsafe_unretained", - "nonnull", - "nullable", - "null_unspecified", - "null_resettable", - "class", - "instancetype", - "NS_DESIGNATED_INITIALIZER", - "NS_UNAVAILABLE", - "NS_REQUIRES_SUPER", - "NS_RETURNS_INNER_POINTER", - "NS_INLINE", - "NS_AVAILABLE", - "NS_DEPRECATED", - "NS_ENUM", - "NS_OPTIONS", - "NS_SWIFT_UNAVAILABLE", - "NS_ASSUME_NONNULL_BEGIN", - "NS_ASSUME_NONNULL_END", - "NS_REFINED_FOR_SWIFT", - "NS_SWIFT_NAME", - "NS_SWIFT_NOTHROW", - "NS_DURING", - "NS_HANDLER", - "NS_ENDHANDLER", - "NS_VALUERETURN", - "NS_VOIDRETURN" - ]; - const LITERALS3 = [ - "false", - "true", - "FALSE", - "TRUE", - "nil", - "YES", - "NO", - "NULL" - ]; - const BUILT_INS3 = [ - "dispatch_once_t", - "dispatch_queue_t", - "dispatch_sync", - "dispatch_async", - "dispatch_once" - ]; - const KEYWORDS3 = { - "variable.language": [ - "this", - "super" - ], - $pattern: IDENTIFIER_RE, - keyword: KWS, - literal: LITERALS3, - built_in: BUILT_INS3, - type: TYPES3 - }; - const CLASS_KEYWORDS = { - $pattern: IDENTIFIER_RE, - keyword: [ - "@interface", - "@class", - "@protocol", - "@implementation" - ] - }; - return { - name: "Objective-C", - aliases: [ - "mm", - "objc", - "obj-c", - "obj-c++", - "objective-c++" - ], - keywords: KEYWORDS3, - illegal: "/, - end: /$/, - illegal: "\\n" - }, - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE - ] - }, - { - className: "class", - begin: "(" + CLASS_KEYWORDS.keyword.join("|") + ")\\b", - end: /(\{|$)/, - excludeEnd: true, - keywords: CLASS_KEYWORDS, - contains: [hljs.UNDERSCORE_TITLE_MODE] - }, - { - begin: "\\." + hljs.UNDERSCORE_IDENT_RE, - relevance: 0 - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/perl.js -function perl(hljs) { - const regex = hljs.regex; - const KEYWORDS3 = [ - "abs", - "accept", - "alarm", - "and", - "atan2", - "bind", - "binmode", - "bless", - "break", - "caller", - "chdir", - "chmod", - "chomp", - "chop", - "chown", - "chr", - "chroot", - "close", - "closedir", - "connect", - "continue", - "cos", - "crypt", - "dbmclose", - "dbmopen", - "defined", - "delete", - "die", - "do", - "dump", - "each", - "else", - "elsif", - "endgrent", - "endhostent", - "endnetent", - "endprotoent", - "endpwent", - "endservent", - "eof", - "eval", - "exec", - "exists", - "exit", - "exp", - "fcntl", - "fileno", - "flock", - "for", - "foreach", - "fork", - "format", - "formline", - "getc", - "getgrent", - "getgrgid", - "getgrnam", - "gethostbyaddr", - "gethostbyname", - "gethostent", - "getlogin", - "getnetbyaddr", - "getnetbyname", - "getnetent", - "getpeername", - "getpgrp", - "getpriority", - "getprotobyname", - "getprotobynumber", - "getprotoent", - "getpwent", - "getpwnam", - "getpwuid", - "getservbyname", - "getservbyport", - "getservent", - "getsockname", - "getsockopt", - "given", - "glob", - "gmtime", - "goto", - "grep", - "gt", - "hex", - "if", - "index", - "int", - "ioctl", - "join", - "keys", - "kill", - "last", - "lc", - "lcfirst", - "length", - "link", - "listen", - "local", - "localtime", - "log", - "lstat", - "lt", - "ma", - "map", - "mkdir", - "msgctl", - "msgget", - "msgrcv", - "msgsnd", - "my", - "ne", - "next", - "no", - "not", - "oct", - "open", - "opendir", - "or", - "ord", - "our", - "pack", - "package", - "pipe", - "pop", - "pos", - "print", - "printf", - "prototype", - "push", - "q|0", - "qq", - "quotemeta", - "qw", - "qx", - "rand", - "read", - "readdir", - "readline", - "readlink", - "readpipe", - "recv", - "redo", - "ref", - "rename", - "require", - "reset", - "return", - "reverse", - "rewinddir", - "rindex", - "rmdir", - "say", - "scalar", - "seek", - "seekdir", - "select", - "semctl", - "semget", - "semop", - "send", - "setgrent", - "sethostent", - "setnetent", - "setpgrp", - "setpriority", - "setprotoent", - "setpwent", - "setservent", - "setsockopt", - "shift", - "shmctl", - "shmget", - "shmread", - "shmwrite", - "shutdown", - "sin", - "sleep", - "socket", - "socketpair", - "sort", - "splice", - "split", - "sprintf", - "sqrt", - "srand", - "stat", - "state", - "study", - "sub", - "substr", - "symlink", - "syscall", - "sysopen", - "sysread", - "sysseek", - "system", - "syswrite", - "tell", - "telldir", - "tie", - "tied", - "time", - "times", - "tr", - "truncate", - "uc", - "ucfirst", - "umask", - "undef", - "unless", - "unlink", - "unpack", - "unshift", - "untie", - "until", - "use", - "utime", - "values", - "vec", - "wait", - "waitpid", - "wantarray", - "warn", - "when", - "while", - "write", - "x|0", - "xor", - "y|0" - ]; - const REGEX_MODIFIERS = /[dualxmsipngr]{0,12}/; - const PERL_KEYWORDS = { - $pattern: /[\w.]+/, - keyword: KEYWORDS3.join(" ") - }; - const SUBST = { - className: "subst", - begin: "[$@]\\{", - end: "\\}", - keywords: PERL_KEYWORDS - }; - const METHOD = { - begin: /->\{/, - end: /\}/ - // contains defined later - }; - const VAR = { variants: [ - { begin: /\$\d/ }, - { begin: regex.concat( - /[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/, - // negative look-ahead tries to avoid matching patterns that are not - // Perl at all like $ident$, @ident@, etc. - `(?![A-Za-z])(?![@$%])` - ) }, - { - begin: /[$%@][^\s\w{]/, - relevance: 0 - } - ] }; - const STRING_CONTAINS = [ - hljs.BACKSLASH_ESCAPE, - SUBST, - VAR - ]; - const REGEX_DELIMS = [ - /!/, - /\//, - /\|/, - /\?/, - /'/, - /"/, - // valid but infrequent and weird - /#/ - // valid but infrequent and weird - ]; - const PAIRED_DOUBLE_RE = (prefix, open, close2 = "\\1") => { - const middle = close2 === "\\1" ? close2 : regex.concat(close2, open); - return regex.concat( - regex.concat("(?:", prefix, ")"), - open, - /(?:\\.|[^\\\/])*?/, - middle, - /(?:\\.|[^\\\/])*?/, - close2, - REGEX_MODIFIERS - ); - }; - const PAIRED_RE = (prefix, open, close2) => { - return regex.concat( - regex.concat("(?:", prefix, ")"), - open, - /(?:\\.|[^\\\/])*?/, - close2, - REGEX_MODIFIERS - ); - }; - const PERL_DEFAULT_CONTAINS = [ - VAR, - hljs.HASH_COMMENT_MODE, - hljs.COMMENT( - /^=\w/, - /=cut/, - { endsWithParent: true } - ), - METHOD, - { - className: "string", - contains: STRING_CONTAINS, - variants: [ - { - begin: "q[qwxr]?\\s*\\(", - end: "\\)", - relevance: 5 - }, - { - begin: "q[qwxr]?\\s*\\[", - end: "\\]", - relevance: 5 - }, - { - begin: "q[qwxr]?\\s*\\{", - end: "\\}", - relevance: 5 - }, - { - begin: "q[qwxr]?\\s*\\|", - end: "\\|", - relevance: 5 - }, - { - begin: "q[qwxr]?\\s*<", - end: ">", - relevance: 5 - }, - { - begin: "qw\\s+q", - end: "q", - relevance: 5 - }, - { - begin: "'", - end: "'", - contains: [hljs.BACKSLASH_ESCAPE] - }, - { - begin: '"', - end: '"' - }, - { - begin: "`", - end: "`", - contains: [hljs.BACKSLASH_ESCAPE] - }, - { - begin: /\{\w+\}/, - relevance: 0 - }, - { - begin: "-?\\w+\\s*=>", - relevance: 0 - } - ] - }, - { - className: "number", - begin: "(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", - relevance: 0 - }, - { - // regexp container - begin: "(\\/\\/|" + hljs.RE_STARTERS_RE + "|\\b(split|return|print|reverse|grep)\\b)\\s*", - keywords: "split return print reverse grep", - relevance: 0, - contains: [ - hljs.HASH_COMMENT_MODE, - { - className: "regexp", - variants: [ - // allow matching common delimiters - { begin: PAIRED_DOUBLE_RE("s|tr|y", regex.either(...REGEX_DELIMS, { capture: true })) }, - // and then paired delmis - { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\(", "\\)") }, - { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\[", "\\]") }, - { begin: PAIRED_DOUBLE_RE("s|tr|y", "\\{", "\\}") } - ], - relevance: 2 - }, - { - className: "regexp", - variants: [ - { - // could be a comment in many languages so do not count - // as relevant - begin: /(m|qr)\/\//, - relevance: 0 - }, - // prefix is optional with /regex/ - { begin: PAIRED_RE("(?:m|qr)?", /\//, /\//) }, - // allow matching common delimiters - { begin: PAIRED_RE("m|qr", regex.either(...REGEX_DELIMS, { capture: true }), /\1/) }, - // allow common paired delmins - { begin: PAIRED_RE("m|qr", /\(/, /\)/) }, - { begin: PAIRED_RE("m|qr", /\[/, /\]/) }, - { begin: PAIRED_RE("m|qr", /\{/, /\}/) } - ] - } - ] - }, - { - className: "function", - beginKeywords: "sub", - end: "(\\s*\\(.*?\\))?[;{]", - excludeEnd: true, - relevance: 5, - contains: [hljs.TITLE_MODE] - }, - { - begin: "-\\w\\b", - relevance: 0 - }, - { - begin: "^__DATA__$", - end: "^__END__$", - subLanguage: "mojolicious", - contains: [ - { - begin: "^@@.*", - end: "$", - className: "comment" - } - ] - } - ]; - SUBST.contains = PERL_DEFAULT_CONTAINS; - METHOD.contains = PERL_DEFAULT_CONTAINS; - return { - name: "Perl", - aliases: [ - "pl", - "pm" - ], - keywords: PERL_KEYWORDS, - contains: PERL_DEFAULT_CONTAINS - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/php.js -function php(hljs) { - const regex = hljs.regex; - const NOT_PERL_ETC = /(?![A-Za-z0-9])(?![$])/; - const IDENT_RE4 = regex.concat( - /[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/, - NOT_PERL_ETC - ); - const PASCAL_CASE_CLASS_NAME_RE = regex.concat( - /(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/, - NOT_PERL_ETC - ); - const VARIABLE = { - scope: "variable", - match: "\\$+" + IDENT_RE4 - }; - const PREPROCESSOR = { - scope: "meta", - variants: [ - { begin: /<\?php/, relevance: 10 }, - // boost for obvious PHP - { begin: /<\?=/ }, - // less relevant per PSR-1 which says not to use short-tags - { begin: /<\?/, relevance: 0.1 }, - { begin: /\?>/ } - // end php tag - ] - }; - const SUBST = { - scope: "subst", - variants: [ - { begin: /\$\w+/ }, - { - begin: /\{\$/, - end: /\}/ - } - ] - }; - const SINGLE_QUOTED = hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null }); - const DOUBLE_QUOTED = hljs.inherit(hljs.QUOTE_STRING_MODE, { - illegal: null, - contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST) - }); - const HEREDOC = { - begin: /<<<[ \t]*(?:(\w+)|"(\w+)")\n/, - end: /[ \t]*(\w+)\b/, - contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST), - "on:begin": (m, resp) => { - resp.data._beginMatch = m[1] || m[2]; - }, - "on:end": (m, resp) => { - if (resp.data._beginMatch !== m[1]) - resp.ignoreMatch(); - } - }; - const NOWDOC = hljs.END_SAME_AS_BEGIN({ - begin: /<<<[ \t]*'(\w+)'\n/, - end: /[ \t]*(\w+)\b/ - }); - const WHITESPACE = "[ \n]"; - const STRING = { - scope: "string", - variants: [ - DOUBLE_QUOTED, - SINGLE_QUOTED, - HEREDOC, - NOWDOC - ] - }; - const NUMBER = { - scope: "number", - variants: [ - { begin: `\\b0[bB][01]+(?:_[01]+)*\\b` }, - // Binary w/ underscore support - { begin: `\\b0[oO][0-7]+(?:_[0-7]+)*\\b` }, - // Octals w/ underscore support - { begin: `\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b` }, - // Hex w/ underscore support - // Decimals w/ underscore support, with optional fragments and scientific exponent (e) suffix. - { begin: `(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?` } - ], - relevance: 0 - }; - const LITERALS3 = [ - "false", - "null", - "true" - ]; - const KWS = [ - // Magic constants: - // - "__CLASS__", - "__DIR__", - "__FILE__", - "__FUNCTION__", - "__COMPILER_HALT_OFFSET__", - "__LINE__", - "__METHOD__", - "__NAMESPACE__", - "__TRAIT__", - // Function that look like language construct or language construct that look like function: - // List of keywords that may not require parenthesis - "die", - "echo", - "exit", - "include", - "include_once", - "print", - "require", - "require_once", - // These are not language construct (function) but operate on the currently-executing function and can access the current symbol table - // 'compact extract func_get_arg func_get_args func_num_args get_called_class get_parent_class ' + - // Other keywords: - // - // - "array", - "abstract", - "and", - "as", - "binary", - "bool", - "boolean", - "break", - "callable", - "case", - "catch", - "class", - "clone", - "const", - "continue", - "declare", - "default", - "do", - "double", - "else", - "elseif", - "empty", - "enddeclare", - "endfor", - "endforeach", - "endif", - "endswitch", - "endwhile", - "enum", - "eval", - "extends", - "final", - "finally", - "float", - "for", - "foreach", - "from", - "global", - "goto", - "if", - "implements", - "instanceof", - "insteadof", - "int", - "integer", - "interface", - "isset", - "iterable", - "list", - "match|0", - "mixed", - "new", - "never", - "object", - "or", - "private", - "protected", - "public", - "readonly", - "real", - "return", - "string", - "switch", - "throw", - "trait", - "try", - "unset", - "use", - "var", - "void", - "while", - "xor", - "yield" - ]; - const BUILT_INS3 = [ - // Standard PHP library: - // - "Error|0", - "AppendIterator", - "ArgumentCountError", - "ArithmeticError", - "ArrayIterator", - "ArrayObject", - "AssertionError", - "BadFunctionCallException", - "BadMethodCallException", - "CachingIterator", - "CallbackFilterIterator", - "CompileError", - "Countable", - "DirectoryIterator", - "DivisionByZeroError", - "DomainException", - "EmptyIterator", - "ErrorException", - "Exception", - "FilesystemIterator", - "FilterIterator", - "GlobIterator", - "InfiniteIterator", - "InvalidArgumentException", - "IteratorIterator", - "LengthException", - "LimitIterator", - "LogicException", - "MultipleIterator", - "NoRewindIterator", - "OutOfBoundsException", - "OutOfRangeException", - "OuterIterator", - "OverflowException", - "ParentIterator", - "ParseError", - "RangeException", - "RecursiveArrayIterator", - "RecursiveCachingIterator", - "RecursiveCallbackFilterIterator", - "RecursiveDirectoryIterator", - "RecursiveFilterIterator", - "RecursiveIterator", - "RecursiveIteratorIterator", - "RecursiveRegexIterator", - "RecursiveTreeIterator", - "RegexIterator", - "RuntimeException", - "SeekableIterator", - "SplDoublyLinkedList", - "SplFileInfo", - "SplFileObject", - "SplFixedArray", - "SplHeap", - "SplMaxHeap", - "SplMinHeap", - "SplObjectStorage", - "SplObserver", - "SplPriorityQueue", - "SplQueue", - "SplStack", - "SplSubject", - "SplTempFileObject", - "TypeError", - "UnderflowException", - "UnexpectedValueException", - "UnhandledMatchError", - // Reserved interfaces: - // - "ArrayAccess", - "BackedEnum", - "Closure", - "Fiber", - "Generator", - "Iterator", - "IteratorAggregate", - "Serializable", - "Stringable", - "Throwable", - "Traversable", - "UnitEnum", - "WeakReference", - "WeakMap", - // Reserved classes: - // - "Directory", - "__PHP_Incomplete_Class", - "parent", - "php_user_filter", - "self", - "static", - "stdClass" - ]; - const dualCase = (items) => { - const result = []; - items.forEach((item) => { - result.push(item); - if (item.toLowerCase() === item) { - result.push(item.toUpperCase()); - } else { - result.push(item.toLowerCase()); - } - }); - return result; - }; - const KEYWORDS3 = { - keyword: KWS, - literal: dualCase(LITERALS3), - built_in: BUILT_INS3 - }; - const normalizeKeywords = (items) => { - return items.map((item) => { - return item.replace(/\|\d+$/, ""); - }); - }; - const CONSTRUCTOR_CALL = { variants: [ - { - match: [ - /new/, - regex.concat(WHITESPACE, "+"), - // to prevent built ins from being confused as the class constructor call - regex.concat("(?!", normalizeKeywords(BUILT_INS3).join("\\b|"), "\\b)"), - PASCAL_CASE_CLASS_NAME_RE - ], - scope: { - 1: "keyword", - 4: "title.class" - } - } - ] }; - const CONSTANT_REFERENCE = regex.concat(IDENT_RE4, "\\b(?!\\()"); - const LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON = { variants: [ - { - match: [ - regex.concat( - /::/, - regex.lookahead(/(?!class\b)/) - ), - CONSTANT_REFERENCE - ], - scope: { 2: "variable.constant" } - }, - { - match: [ - /::/, - /class/ - ], - scope: { 2: "variable.language" } - }, - { - match: [ - PASCAL_CASE_CLASS_NAME_RE, - regex.concat( - /::/, - regex.lookahead(/(?!class\b)/) - ), - CONSTANT_REFERENCE - ], - scope: { - 1: "title.class", - 3: "variable.constant" - } - }, - { - match: [ - PASCAL_CASE_CLASS_NAME_RE, - regex.concat( - "::", - regex.lookahead(/(?!class\b)/) - ) - ], - scope: { 1: "title.class" } - }, - { - match: [ - PASCAL_CASE_CLASS_NAME_RE, - /::/, - /class/ - ], - scope: { - 1: "title.class", - 3: "variable.language" - } - } - ] }; - const NAMED_ARGUMENT = { - scope: "attr", - match: regex.concat(IDENT_RE4, regex.lookahead(":"), regex.lookahead(/(?!::)/)) - }; - const PARAMS_MODE = { - relevance: 0, - begin: /\(/, - end: /\)/, - keywords: KEYWORDS3, - contains: [ - NAMED_ARGUMENT, - VARIABLE, - LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, - hljs.C_BLOCK_COMMENT_MODE, - STRING, - NUMBER, - CONSTRUCTOR_CALL - ] - }; - const FUNCTION_INVOKE = { - relevance: 0, - match: [ - /\b/, - // to prevent keywords from being confused as the function title - regex.concat("(?!fn\\b|function\\b|", normalizeKeywords(KWS).join("\\b|"), "|", normalizeKeywords(BUILT_INS3).join("\\b|"), "\\b)"), - IDENT_RE4, - regex.concat(WHITESPACE, "*"), - regex.lookahead(/(?=\()/) - ], - scope: { 3: "title.function.invoke" }, - contains: [PARAMS_MODE] - }; - PARAMS_MODE.contains.push(FUNCTION_INVOKE); - const ATTRIBUTE_CONTAINS = [ - NAMED_ARGUMENT, - LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, - hljs.C_BLOCK_COMMENT_MODE, - STRING, - NUMBER, - CONSTRUCTOR_CALL - ]; - const ATTRIBUTES4 = { - begin: regex.concat(/#\[\s*/, PASCAL_CASE_CLASS_NAME_RE), - beginScope: "meta", - end: /]/, - endScope: "meta", - keywords: { - literal: LITERALS3, - keyword: [ - "new", - "array" - ] - }, - contains: [ - { - begin: /\[/, - end: /]/, - keywords: { - literal: LITERALS3, - keyword: [ - "new", - "array" - ] - }, - contains: [ - "self", - ...ATTRIBUTE_CONTAINS - ] - }, - ...ATTRIBUTE_CONTAINS, - { - scope: "meta", - match: PASCAL_CASE_CLASS_NAME_RE - } - ] - }; - return { - case_insensitive: false, - keywords: KEYWORDS3, - contains: [ - ATTRIBUTES4, - hljs.HASH_COMMENT_MODE, - hljs.COMMENT("//", "$"), - hljs.COMMENT( - "/\\*", - "\\*/", - { contains: [ - { - scope: "doctag", - match: "@[A-Za-z]+" - } - ] } - ), - { - match: /__halt_compiler\(\);/, - keywords: "__halt_compiler", - starts: { - scope: "comment", - end: hljs.MATCH_NOTHING_RE, - contains: [ - { - match: /\?>/, - scope: "meta", - endsParent: true - } - ] - } - }, - PREPROCESSOR, - { - scope: "variable.language", - match: /\$this\b/ - }, - VARIABLE, - FUNCTION_INVOKE, - LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, - { - match: [ - /const/, - /\s/, - IDENT_RE4 - ], - scope: { - 1: "keyword", - 3: "variable.constant" - } - }, - CONSTRUCTOR_CALL, - { - scope: "function", - relevance: 0, - beginKeywords: "fn function", - end: /[;{]/, - excludeEnd: true, - illegal: "[$%\\[]", - contains: [ - { beginKeywords: "use" }, - hljs.UNDERSCORE_TITLE_MODE, - { - begin: "=>", - // No markup, just a relevance booster - endsParent: true - }, - { - scope: "params", - begin: "\\(", - end: "\\)", - excludeBegin: true, - excludeEnd: true, - keywords: KEYWORDS3, - contains: [ - "self", - VARIABLE, - LEFT_AND_RIGHT_SIDE_OF_DOUBLE_COLON, - hljs.C_BLOCK_COMMENT_MODE, - STRING, - NUMBER - ] - } - ] - }, - { - scope: "class", - variants: [ - { - beginKeywords: "enum", - illegal: /[($"]/ - }, - { - beginKeywords: "class interface trait", - illegal: /[:($"]/ - } - ], - relevance: 0, - end: /\{/, - excludeEnd: true, - contains: [ - { beginKeywords: "extends implements" }, - hljs.UNDERSCORE_TITLE_MODE - ] - }, - // both use and namespace still use "old style" rules (vs multi-match) - // because the namespace name can include `\` and we still want each - // element to be treated as its own *individual* title - { - beginKeywords: "namespace", - relevance: 0, - end: ";", - illegal: /[.']/, - contains: [hljs.inherit(hljs.UNDERSCORE_TITLE_MODE, { scope: "title.class" })] - }, - { - beginKeywords: "use", - relevance: 0, - end: ";", - contains: [ - // TODO: title.function vs title.class - { - match: /\b(as|const|function)\b/, - scope: "keyword" - }, - // TODO: could be title.class or title.function - hljs.UNDERSCORE_TITLE_MODE - ] - }, - STRING, - NUMBER - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/php-template.js -function phpTemplate(hljs) { - return { - name: "PHP template", - subLanguage: "xml", - contains: [ - { - begin: /<\?(php|=)?/, - end: /\?>/, - subLanguage: "php", - contains: [ - // We don't want the php closing tag ?> to close the PHP block when - // inside any of the following blocks: - { - begin: "/\\*", - end: "\\*/", - skip: true - }, - { - begin: 'b"', - end: '"', - skip: true - }, - { - begin: "b'", - end: "'", - skip: true - }, - hljs.inherit(hljs.APOS_STRING_MODE, { - illegal: null, - className: null, - contains: null, - skip: true - }), - hljs.inherit(hljs.QUOTE_STRING_MODE, { - illegal: null, - className: null, - contains: null, - skip: true - }) - ] - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/plaintext.js -function plaintext(hljs) { - return { - name: "Plain text", - aliases: [ - "text", - "txt" - ], - disableAutodetect: true - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/python.js -function python(hljs) { - const regex = hljs.regex; - const IDENT_RE4 = /[\p{XID_Start}_]\p{XID_Continue}*/u; - const RESERVED_WORDS = [ - "and", - "as", - "assert", - "async", - "await", - "break", - "case", - "class", - "continue", - "def", - "del", - "elif", - "else", - "except", - "finally", - "for", - "from", - "global", - "if", - "import", - "in", - "is", - "lambda", - "match", - "nonlocal|10", - "not", - "or", - "pass", - "raise", - "return", - "try", - "while", - "with", - "yield" - ]; - const BUILT_INS3 = [ - "__import__", - "abs", - "all", - "any", - "ascii", - "bin", - "bool", - "breakpoint", - "bytearray", - "bytes", - "callable", - "chr", - "classmethod", - "compile", - "complex", - "delattr", - "dict", - "dir", - "divmod", - "enumerate", - "eval", - "exec", - "filter", - "float", - "format", - "frozenset", - "getattr", - "globals", - "hasattr", - "hash", - "help", - "hex", - "id", - "input", - "int", - "isinstance", - "issubclass", - "iter", - "len", - "list", - "locals", - "map", - "max", - "memoryview", - "min", - "next", - "object", - "oct", - "open", - "ord", - "pow", - "print", - "property", - "range", - "repr", - "reversed", - "round", - "set", - "setattr", - "slice", - "sorted", - "staticmethod", - "str", - "sum", - "super", - "tuple", - "type", - "vars", - "zip" - ]; - const LITERALS3 = [ - "__debug__", - "Ellipsis", - "False", - "None", - "NotImplemented", - "True" - ]; - const TYPES3 = [ - "Any", - "Callable", - "Coroutine", - "Dict", - "List", - "Literal", - "Generic", - "Optional", - "Sequence", - "Set", - "Tuple", - "Type", - "Union" - ]; - const KEYWORDS3 = { - $pattern: /[A-Za-z]\w+|__\w+__/, - keyword: RESERVED_WORDS, - built_in: BUILT_INS3, - literal: LITERALS3, - type: TYPES3 - }; - const PROMPT = { - className: "meta", - begin: /^(>>>|\.\.\.) / - }; - const SUBST = { - className: "subst", - begin: /\{/, - end: /\}/, - keywords: KEYWORDS3, - illegal: /#/ - }; - const LITERAL_BRACKET = { - begin: /\{\{/, - relevance: 0 - }; - const STRING = { - className: "string", - contains: [hljs.BACKSLASH_ESCAPE], - variants: [ - { - begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/, - end: /'''/, - contains: [ - hljs.BACKSLASH_ESCAPE, - PROMPT - ], - relevance: 10 - }, - { - begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/, - end: /"""/, - contains: [ - hljs.BACKSLASH_ESCAPE, - PROMPT - ], - relevance: 10 - }, - { - begin: /([fF][rR]|[rR][fF]|[fF])'''/, - end: /'''/, - contains: [ - hljs.BACKSLASH_ESCAPE, - PROMPT, - LITERAL_BRACKET, - SUBST - ] - }, - { - begin: /([fF][rR]|[rR][fF]|[fF])"""/, - end: /"""/, - contains: [ - hljs.BACKSLASH_ESCAPE, - PROMPT, - LITERAL_BRACKET, - SUBST - ] - }, - { - begin: /([uU]|[rR])'/, - end: /'/, - relevance: 10 - }, - { - begin: /([uU]|[rR])"/, - end: /"/, - relevance: 10 - }, - { - begin: /([bB]|[bB][rR]|[rR][bB])'/, - end: /'/ - }, - { - begin: /([bB]|[bB][rR]|[rR][bB])"/, - end: /"/ - }, - { - begin: /([fF][rR]|[rR][fF]|[fF])'/, - end: /'/, - contains: [ - hljs.BACKSLASH_ESCAPE, - LITERAL_BRACKET, - SUBST - ] - }, - { - begin: /([fF][rR]|[rR][fF]|[fF])"/, - end: /"/, - contains: [ - hljs.BACKSLASH_ESCAPE, - LITERAL_BRACKET, - SUBST - ] - }, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE - ] - }; - const digitpart = "[0-9](_?[0-9])*"; - const pointfloat = `(\\b(${digitpart}))?\\.(${digitpart})|\\b(${digitpart})\\.`; - const lookahead3 = `\\b|${RESERVED_WORDS.join("|")}`; - const NUMBER = { - className: "number", - relevance: 0, - variants: [ - // exponentfloat, pointfloat - // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals - // optionally imaginary - // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals - // Note: no leading \b because floats can start with a decimal point - // and we don't want to mishandle e.g. `fn(.5)`, - // no trailing \b for pointfloat because it can end with a decimal point - // and we don't want to mishandle e.g. `0..hex()`; this should be safe - // because both MUST contain a decimal point and so cannot be confused with - // the interior part of an identifier - { - begin: `(\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead3})` - }, - { - begin: `(${pointfloat})[jJ]?` - }, - // decinteger, bininteger, octinteger, hexinteger - // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals - // optionally "long" in Python 2 - // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals - // decinteger is optionally imaginary - // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals - { - begin: `\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead3})` - }, - { - begin: `\\b0[bB](_?[01])+[lL]?(?=${lookahead3})` - }, - { - begin: `\\b0[oO](_?[0-7])+[lL]?(?=${lookahead3})` - }, - { - begin: `\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead3})` - }, - // imagnumber (digitpart-based) - // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals - { - begin: `\\b(${digitpart})[jJ](?=${lookahead3})` - } - ] - }; - const COMMENT_TYPE = { - className: "comment", - begin: regex.lookahead(/# type:/), - end: /$/, - keywords: KEYWORDS3, - contains: [ - { - // prevent keywords from coloring `type` - begin: /# type:/ - }, - // comment within a datatype comment includes no keywords - { - begin: /#/, - end: /\b\B/, - endsWithParent: true - } - ] - }; - const PARAMS = { - className: "params", - variants: [ - // Exclude params in functions without params - { - className: "", - begin: /\(\s*\)/, - skip: true - }, - { - begin: /\(/, - end: /\)/, - excludeBegin: true, - excludeEnd: true, - keywords: KEYWORDS3, - contains: [ - "self", - PROMPT, - NUMBER, - STRING, - hljs.HASH_COMMENT_MODE - ] - } - ] - }; - SUBST.contains = [ - STRING, - NUMBER, - PROMPT - ]; - return { - name: "Python", - aliases: [ - "py", - "gyp", - "ipython" - ], - unicodeRegex: true, - keywords: KEYWORDS3, - illegal: /(<\/|\?)|=>/, - contains: [ - PROMPT, - NUMBER, - { - // very common convention - begin: /\bself\b/ - }, - { - // eat "if" prior to string so that it won't accidentally be - // labeled as an f-string - beginKeywords: "if", - relevance: 0 - }, - STRING, - COMMENT_TYPE, - hljs.HASH_COMMENT_MODE, - { - match: [ - /\bdef/, - /\s+/, - IDENT_RE4 - ], - scope: { - 1: "keyword", - 3: "title.function" - }, - contains: [PARAMS] - }, - { - variants: [ - { - match: [ - /\bclass/, - /\s+/, - IDENT_RE4, - /\s*/, - /\(\s*/, - IDENT_RE4, - /\s*\)/ - ] - }, - { - match: [ - /\bclass/, - /\s+/, - IDENT_RE4 - ] - } - ], - scope: { - 1: "keyword", - 3: "title.class", - 6: "title.class.inherited" - } - }, - { - className: "meta", - begin: /^[\t ]*@/, - end: /(?=#)|$/, - contains: [ - NUMBER, - PARAMS, - STRING - ] - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/python-repl.js -function pythonRepl(hljs) { - return { - aliases: ["pycon"], - contains: [ - { - className: "meta.prompt", - starts: { - // a space separates the REPL prefix from the actual code - // this is purely for cleaner HTML output - end: / |$/, - starts: { - end: "$", - subLanguage: "python" - } - }, - variants: [ - { begin: /^>>>(?=[ ]|$)/ }, - { begin: /^\.\.\.(?=[ ]|$)/ } - ] - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/r.js -function r(hljs) { - const regex = hljs.regex; - const IDENT_RE4 = /(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/; - const NUMBER_TYPES_RE = regex.either( - // Special case: only hexadecimal binary powers can contain fractions - /0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/, - // Hexadecimal numbers without fraction and optional binary power - /0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/, - // Decimal numbers - /(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/ - ); - const OPERATORS_RE = /[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/; - const PUNCTUATION_RE = regex.either( - /[()]/, - /[{}]/, - /\[\[/, - /[[\]]/, - /\\/, - /,/ - ); - return { - name: "R", - keywords: { - $pattern: IDENT_RE4, - keyword: "function if in break next repeat else for while", - literal: "NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", - built_in: ( - // Builtin constants - "LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" - ) - }, - contains: [ - // Roxygen comments - hljs.COMMENT( - /#'/, - /$/, - { contains: [ - { - // Handle `@examples` separately to cause all subsequent code - // until the next `@`-tag on its own line to be kept as-is, - // preventing highlighting. This code is example R code, so nested - // doctags shouldn’t be treated as such. See - // `test/markup/r/roxygen.txt` for an example. - scope: "doctag", - match: /@examples/, - starts: { - end: regex.lookahead(regex.either( - // end if another doc comment - /\n^#'\s*(?=@[a-zA-Z]+)/, - // or a line with no comment - /\n^(?!#')/ - )), - endsParent: true - } - }, - { - // Handle `@param` to highlight the parameter name following - // after. - scope: "doctag", - begin: "@param", - end: /$/, - contains: [ - { - scope: "variable", - variants: [ - { match: IDENT_RE4 }, - { match: /`(?:\\.|[^`\\])+`/ } - ], - endsParent: true - } - ] - }, - { - scope: "doctag", - match: /@[a-zA-Z]+/ - }, - { - scope: "keyword", - match: /\\[a-zA-Z]+/ - } - ] } - ), - hljs.HASH_COMMENT_MODE, - { - scope: "string", - contains: [hljs.BACKSLASH_ESCAPE], - variants: [ - hljs.END_SAME_AS_BEGIN({ - begin: /[rR]"(-*)\(/, - end: /\)(-*)"/ - }), - hljs.END_SAME_AS_BEGIN({ - begin: /[rR]"(-*)\{/, - end: /\}(-*)"/ - }), - hljs.END_SAME_AS_BEGIN({ - begin: /[rR]"(-*)\[/, - end: /\](-*)"/ - }), - hljs.END_SAME_AS_BEGIN({ - begin: /[rR]'(-*)\(/, - end: /\)(-*)'/ - }), - hljs.END_SAME_AS_BEGIN({ - begin: /[rR]'(-*)\{/, - end: /\}(-*)'/ - }), - hljs.END_SAME_AS_BEGIN({ - begin: /[rR]'(-*)\[/, - end: /\](-*)'/ - }), - { - begin: '"', - end: '"', - relevance: 0 - }, - { - begin: "'", - end: "'", - relevance: 0 - } - ] - }, - // Matching numbers immediately following punctuation and operators is - // tricky since we need to look at the character ahead of a number to - // ensure the number is not part of an identifier, and we cannot use - // negative look-behind assertions. So instead we explicitly handle all - // possible combinations of (operator|punctuation), number. - // TODO: replace with negative look-behind when available - // { begin: /(?>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)"; - const CLASS_NAME_RE = regex.either( - /\b([A-Z]+[a-z0-9]+)+/, - // ends in caps - /\b([A-Z]+[a-z0-9]+)+[A-Z]+/ - ); - const CLASS_NAME_WITH_NAMESPACE_RE = regex.concat(CLASS_NAME_RE, /(::\w+)*/); - const PSEUDO_KWS = [ - "include", - "extend", - "prepend", - "public", - "private", - "protected", - "raise", - "throw" - ]; - const RUBY_KEYWORDS = { - "variable.constant": [ - "__FILE__", - "__LINE__", - "__ENCODING__" - ], - "variable.language": [ - "self", - "super" - ], - keyword: [ - "alias", - "and", - "begin", - "BEGIN", - "break", - "case", - "class", - "defined", - "do", - "else", - "elsif", - "end", - "END", - "ensure", - "for", - "if", - "in", - "module", - "next", - "not", - "or", - "redo", - "require", - "rescue", - "retry", - "return", - "then", - "undef", - "unless", - "until", - "when", - "while", - "yield", - ...PSEUDO_KWS - ], - built_in: [ - "proc", - "lambda", - "attr_accessor", - "attr_reader", - "attr_writer", - "define_method", - "private_constant", - "module_function" - ], - literal: [ - "true", - "false", - "nil" - ] - }; - const YARDOCTAG = { - className: "doctag", - begin: "@[A-Za-z]+" - }; - const IRB_OBJECT = { - begin: "#<", - end: ">" - }; - const COMMENT_MODES = [ - hljs.COMMENT( - "#", - "$", - { contains: [YARDOCTAG] } - ), - hljs.COMMENT( - "^=begin", - "^=end", - { - contains: [YARDOCTAG], - relevance: 10 - } - ), - hljs.COMMENT("^__END__", hljs.MATCH_NOTHING_RE) - ]; - const SUBST = { - className: "subst", - begin: /#\{/, - end: /\}/, - keywords: RUBY_KEYWORDS - }; - const STRING = { - className: "string", - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - variants: [ - { - begin: /'/, - end: /'/ - }, - { - begin: /"/, - end: /"/ - }, - { - begin: /`/, - end: /`/ - }, - { - begin: /%[qQwWx]?\(/, - end: /\)/ - }, - { - begin: /%[qQwWx]?\[/, - end: /\]/ - }, - { - begin: /%[qQwWx]?\{/, - end: /\}/ - }, - { - begin: /%[qQwWx]?/ - }, - { - begin: /%[qQwWx]?\//, - end: /\// - }, - { - begin: /%[qQwWx]?%/, - end: /%/ - }, - { - begin: /%[qQwWx]?-/, - end: /-/ - }, - { - begin: /%[qQwWx]?\|/, - end: /\|/ - }, - // in the following expressions, \B in the beginning suppresses recognition of ?-sequences - // where ? is the last character of a preceding identifier, as in: `func?4` - { begin: /\B\?(\\\d{1,3})/ }, - { begin: /\B\?(\\x[A-Fa-f0-9]{1,2})/ }, - { begin: /\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/ }, - { begin: /\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/ }, - { begin: /\B\?\\(c|C-)[\x20-\x7e]/ }, - { begin: /\B\?\\?\S/ }, - // heredocs - { - // this guard makes sure that we have an entire heredoc and not a false - // positive (auto-detect, etc.) - begin: regex.concat( - /<<[-~]?'?/, - regex.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/) - ), - contains: [ - hljs.END_SAME_AS_BEGIN({ - begin: /(\w+)/, - end: /(\w+)/, - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ] - }) - ] - } - ] - }; - const decimal = "[1-9](_?[0-9])*|0"; - const digits = "[0-9](_?[0-9])*"; - const NUMBER = { - className: "number", - relevance: 0, - variants: [ - // decimal integer/float, optionally exponential or rational, optionally imaginary - { begin: `\\b(${decimal})(\\.(${digits}))?([eE][+-]?(${digits})|r)?i?\\b` }, - // explicit decimal/binary/octal/hexadecimal integer, - // optionally rational and/or imaginary - { begin: "\\b0[dD][0-9](_?[0-9])*r?i?\\b" }, - { begin: "\\b0[bB][0-1](_?[0-1])*r?i?\\b" }, - { begin: "\\b0[oO][0-7](_?[0-7])*r?i?\\b" }, - { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b" }, - // 0-prefixed implicit octal integer, optionally rational and/or imaginary - { begin: "\\b0(_?[0-7])+r?i?\\b" } - ] - }; - const PARAMS = { - variants: [ - { - match: /\(\)/ - }, - { - className: "params", - begin: /\(/, - end: /(?=\))/, - excludeBegin: true, - endsParent: true, - keywords: RUBY_KEYWORDS - } - ] - }; - const INCLUDE_EXTEND = { - match: [ - /(include|extend)\s+/, - CLASS_NAME_WITH_NAMESPACE_RE - ], - scope: { - 2: "title.class" - }, - keywords: RUBY_KEYWORDS - }; - const CLASS_DEFINITION = { - variants: [ - { - match: [ - /class\s+/, - CLASS_NAME_WITH_NAMESPACE_RE, - /\s+<\s+/, - CLASS_NAME_WITH_NAMESPACE_RE - ] - }, - { - match: [ - /\b(class|module)\s+/, - CLASS_NAME_WITH_NAMESPACE_RE - ] - } - ], - scope: { - 2: "title.class", - 4: "title.class.inherited" - }, - keywords: RUBY_KEYWORDS - }; - const UPPER_CASE_CONSTANT = { - relevance: 0, - match: /\b[A-Z][A-Z_0-9]+\b/, - className: "variable.constant" - }; - const METHOD_DEFINITION = { - match: [ - /def/, - /\s+/, - RUBY_METHOD_RE - ], - scope: { - 1: "keyword", - 3: "title.function" - }, - contains: [ - PARAMS - ] - }; - const OBJECT_CREATION = { - relevance: 0, - match: [ - CLASS_NAME_WITH_NAMESPACE_RE, - /\.new[. (]/ - ], - scope: { - 1: "title.class" - } - }; - const CLASS_REFERENCE = { - relevance: 0, - match: CLASS_NAME_RE, - scope: "title.class" - }; - const RUBY_DEFAULT_CONTAINS = [ - STRING, - CLASS_DEFINITION, - INCLUDE_EXTEND, - OBJECT_CREATION, - UPPER_CASE_CONSTANT, - CLASS_REFERENCE, - METHOD_DEFINITION, - { - // swallow namespace qualifiers before symbols - begin: hljs.IDENT_RE + "::" - }, - { - className: "symbol", - begin: hljs.UNDERSCORE_IDENT_RE + "(!|\\?)?:", - relevance: 0 - }, - { - className: "symbol", - begin: ":(?!\\s)", - contains: [ - STRING, - { begin: RUBY_METHOD_RE } - ], - relevance: 0 - }, - NUMBER, - { - // negative-look forward attempts to prevent false matches like: - // @ident@ or $ident$ that might indicate this is not ruby at all - className: "variable", - begin: `(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])` - }, - { - className: "params", - begin: /\|/, - end: /\|/, - excludeBegin: true, - excludeEnd: true, - relevance: 0, - // this could be a lot of things (in other languages) other than params - keywords: RUBY_KEYWORDS - }, - { - // regexp container - begin: "(" + hljs.RE_STARTERS_RE + "|unless)\\s*", - keywords: "unless", - contains: [ - { - className: "regexp", - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - illegal: /\n/, - variants: [ - { - begin: "/", - end: "/[a-z]*" - }, - { - begin: /%r\{/, - end: /\}[a-z]*/ - }, - { - begin: "%r\\(", - end: "\\)[a-z]*" - }, - { - begin: "%r!", - end: "![a-z]*" - }, - { - begin: "%r\\[", - end: "\\][a-z]*" - } - ] - } - ].concat(IRB_OBJECT, COMMENT_MODES), - relevance: 0 - } - ].concat(IRB_OBJECT, COMMENT_MODES); - SUBST.contains = RUBY_DEFAULT_CONTAINS; - PARAMS.contains = RUBY_DEFAULT_CONTAINS; - const SIMPLE_PROMPT = "[>?]>"; - const DEFAULT_PROMPT = "[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"; - const RVM_PROMPT = "(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"; - const IRB_DEFAULT = [ - { - begin: /^\s*=>/, - starts: { - end: "$", - contains: RUBY_DEFAULT_CONTAINS - } - }, - { - className: "meta.prompt", - begin: "^(" + SIMPLE_PROMPT + "|" + DEFAULT_PROMPT + "|" + RVM_PROMPT + ")(?=[ ])", - starts: { - end: "$", - keywords: RUBY_KEYWORDS, - contains: RUBY_DEFAULT_CONTAINS - } - } - ]; - COMMENT_MODES.unshift(IRB_OBJECT); - return { - name: "Ruby", - aliases: [ - "rb", - "gemspec", - "podspec", - "thor", - "irb" - ], - keywords: RUBY_KEYWORDS, - illegal: /\/\*/, - contains: [hljs.SHEBANG({ binary: "ruby" })].concat(IRB_DEFAULT).concat(COMMENT_MODES).concat(RUBY_DEFAULT_CONTAINS) - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/rust.js -function rust(hljs) { - const regex = hljs.regex; - const FUNCTION_INVOKE = { - className: "title.function.invoke", - relevance: 0, - begin: regex.concat( - /\b/, - /(?!let\b)/, - hljs.IDENT_RE, - regex.lookahead(/\s*\(/) - ) - }; - const NUMBER_SUFFIX = "([ui](8|16|32|64|128|size)|f(32|64))?"; - const KEYWORDS3 = [ - "abstract", - "as", - "async", - "await", - "become", - "box", - "break", - "const", - "continue", - "crate", - "do", - "dyn", - "else", - "enum", - "extern", - "false", - "final", - "fn", - "for", - "if", - "impl", - "in", - "let", - "loop", - "macro", - "match", - "mod", - "move", - "mut", - "override", - "priv", - "pub", - "ref", - "return", - "self", - "Self", - "static", - "struct", - "super", - "trait", - "true", - "try", - "type", - "typeof", - "unsafe", - "unsized", - "use", - "virtual", - "where", - "while", - "yield" - ]; - const LITERALS3 = [ - "true", - "false", - "Some", - "None", - "Ok", - "Err" - ]; - const BUILTINS = [ - // functions - "drop ", - // traits - "Copy", - "Send", - "Sized", - "Sync", - "Drop", - "Fn", - "FnMut", - "FnOnce", - "ToOwned", - "Clone", - "Debug", - "PartialEq", - "PartialOrd", - "Eq", - "Ord", - "AsRef", - "AsMut", - "Into", - "From", - "Default", - "Iterator", - "Extend", - "IntoIterator", - "DoubleEndedIterator", - "ExactSizeIterator", - "SliceConcatExt", - "ToString", - // macros - "assert!", - "assert_eq!", - "bitflags!", - "bytes!", - "cfg!", - "col!", - "concat!", - "concat_idents!", - "debug_assert!", - "debug_assert_eq!", - "env!", - "panic!", - "file!", - "format!", - "format_args!", - "include_bytes!", - "include_str!", - "line!", - "local_data_key!", - "module_path!", - "option_env!", - "print!", - "println!", - "select!", - "stringify!", - "try!", - "unimplemented!", - "unreachable!", - "vec!", - "write!", - "writeln!", - "macro_rules!", - "assert_ne!", - "debug_assert_ne!" - ]; - const TYPES3 = [ - "i8", - "i16", - "i32", - "i64", - "i128", - "isize", - "u8", - "u16", - "u32", - "u64", - "u128", - "usize", - "f32", - "f64", - "str", - "char", - "bool", - "Box", - "Option", - "Result", - "String", - "Vec" - ]; - return { - name: "Rust", - aliases: ["rs"], - keywords: { - $pattern: hljs.IDENT_RE + "!?", - type: TYPES3, - keyword: KEYWORDS3, - literal: LITERALS3, - built_in: BUILTINS - }, - illegal: "" - }, - FUNCTION_INVOKE - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/scss.js -var MODES4 = (hljs) => { - return { - IMPORTANT: { - scope: "meta", - begin: "!important" - }, - BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE, - HEXCOLOR: { - scope: "number", - begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ - }, - FUNCTION_DISPATCH: { - className: "built_in", - begin: /[\w-]+(?=\()/ - }, - ATTRIBUTE_SELECTOR_MODE: { - scope: "selector-attr", - begin: /\[/, - end: /\]/, - illegal: "$", - contains: [ - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE - ] - }, - CSS_NUMBER_MODE: { - scope: "number", - begin: hljs.NUMBER_RE + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", - relevance: 0 - }, - CSS_VARIABLE: { - className: "attr", - begin: /--[A-Za-z][A-Za-z0-9_-]*/ - } - }; -}; -var TAGS3 = [ - "a", - "abbr", - "address", - "article", - "aside", - "audio", - "b", - "blockquote", - "body", - "button", - "canvas", - "caption", - "cite", - "code", - "dd", - "del", - "details", - "dfn", - "div", - "dl", - "dt", - "em", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "header", - "hgroup", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "label", - "legend", - "li", - "main", - "mark", - "menu", - "nav", - "object", - "ol", - "p", - "q", - "quote", - "samp", - "section", - "span", - "strong", - "summary", - "sup", - "table", - "tbody", - "td", - "textarea", - "tfoot", - "th", - "thead", - "time", - "tr", - "ul", - "var", - "video" -]; -var MEDIA_FEATURES3 = [ - "any-hover", - "any-pointer", - "aspect-ratio", - "color", - "color-gamut", - "color-index", - "device-aspect-ratio", - "device-height", - "device-width", - "display-mode", - "forced-colors", - "grid", - "height", - "hover", - "inverted-colors", - "monochrome", - "orientation", - "overflow-block", - "overflow-inline", - "pointer", - "prefers-color-scheme", - "prefers-contrast", - "prefers-reduced-motion", - "prefers-reduced-transparency", - "resolution", - "scan", - "scripting", - "update", - "width", - // TODO: find a better solution? - "min-width", - "max-width", - "min-height", - "max-height" -]; -var PSEUDO_CLASSES3 = [ - "active", - "any-link", - "blank", - "checked", - "current", - "default", - "defined", - "dir", - // dir() - "disabled", - "drop", - "empty", - "enabled", - "first", - "first-child", - "first-of-type", - "fullscreen", - "future", - "focus", - "focus-visible", - "focus-within", - "has", - // has() - "host", - // host or host() - "host-context", - // host-context() - "hover", - "indeterminate", - "in-range", - "invalid", - "is", - // is() - "lang", - // lang() - "last-child", - "last-of-type", - "left", - "link", - "local-link", - "not", - // not() - "nth-child", - // nth-child() - "nth-col", - // nth-col() - "nth-last-child", - // nth-last-child() - "nth-last-col", - // nth-last-col() - "nth-last-of-type", - //nth-last-of-type() - "nth-of-type", - //nth-of-type() - "only-child", - "only-of-type", - "optional", - "out-of-range", - "past", - "placeholder-shown", - "read-only", - "read-write", - "required", - "right", - "root", - "scope", - "target", - "target-within", - "user-invalid", - "valid", - "visited", - "where" - // where() -]; -var PSEUDO_ELEMENTS3 = [ - "after", - "backdrop", - "before", - "cue", - "cue-region", - "first-letter", - "first-line", - "grammar-error", - "marker", - "part", - "placeholder", - "selection", - "slotted", - "spelling-error" -]; -var ATTRIBUTES3 = [ - "align-content", - "align-items", - "align-self", - "all", - "animation", - "animation-delay", - "animation-direction", - "animation-duration", - "animation-fill-mode", - "animation-iteration-count", - "animation-name", - "animation-play-state", - "animation-timing-function", - "backface-visibility", - "background", - "background-attachment", - "background-blend-mode", - "background-clip", - "background-color", - "background-image", - "background-origin", - "background-position", - "background-repeat", - "background-size", - "block-size", - "border", - "border-block", - "border-block-color", - "border-block-end", - "border-block-end-color", - "border-block-end-style", - "border-block-end-width", - "border-block-start", - "border-block-start-color", - "border-block-start-style", - "border-block-start-width", - "border-block-style", - "border-block-width", - "border-bottom", - "border-bottom-color", - "border-bottom-left-radius", - "border-bottom-right-radius", - "border-bottom-style", - "border-bottom-width", - "border-collapse", - "border-color", - "border-image", - "border-image-outset", - "border-image-repeat", - "border-image-slice", - "border-image-source", - "border-image-width", - "border-inline", - "border-inline-color", - "border-inline-end", - "border-inline-end-color", - "border-inline-end-style", - "border-inline-end-width", - "border-inline-start", - "border-inline-start-color", - "border-inline-start-style", - "border-inline-start-width", - "border-inline-style", - "border-inline-width", - "border-left", - "border-left-color", - "border-left-style", - "border-left-width", - "border-radius", - "border-right", - "border-right-color", - "border-right-style", - "border-right-width", - "border-spacing", - "border-style", - "border-top", - "border-top-color", - "border-top-left-radius", - "border-top-right-radius", - "border-top-style", - "border-top-width", - "border-width", - "bottom", - "box-decoration-break", - "box-shadow", - "box-sizing", - "break-after", - "break-before", - "break-inside", - "caption-side", - "caret-color", - "clear", - "clip", - "clip-path", - "clip-rule", - "color", - "column-count", - "column-fill", - "column-gap", - "column-rule", - "column-rule-color", - "column-rule-style", - "column-rule-width", - "column-span", - "column-width", - "columns", - "contain", - "content", - "content-visibility", - "counter-increment", - "counter-reset", - "cue", - "cue-after", - "cue-before", - "cursor", - "direction", - "display", - "empty-cells", - "filter", - "flex", - "flex-basis", - "flex-direction", - "flex-flow", - "flex-grow", - "flex-shrink", - "flex-wrap", - "float", - "flow", - "font", - "font-display", - "font-family", - "font-feature-settings", - "font-kerning", - "font-language-override", - "font-size", - "font-size-adjust", - "font-smoothing", - "font-stretch", - "font-style", - "font-synthesis", - "font-variant", - "font-variant-caps", - "font-variant-east-asian", - "font-variant-ligatures", - "font-variant-numeric", - "font-variant-position", - "font-variation-settings", - "font-weight", - "gap", - "glyph-orientation-vertical", - "grid", - "grid-area", - "grid-auto-columns", - "grid-auto-flow", - "grid-auto-rows", - "grid-column", - "grid-column-end", - "grid-column-start", - "grid-gap", - "grid-row", - "grid-row-end", - "grid-row-start", - "grid-template", - "grid-template-areas", - "grid-template-columns", - "grid-template-rows", - "hanging-punctuation", - "height", - "hyphens", - "icon", - "image-orientation", - "image-rendering", - "image-resolution", - "ime-mode", - "inline-size", - "isolation", - "justify-content", - "left", - "letter-spacing", - "line-break", - "line-height", - "list-style", - "list-style-image", - "list-style-position", - "list-style-type", - "margin", - "margin-block", - "margin-block-end", - "margin-block-start", - "margin-bottom", - "margin-inline", - "margin-inline-end", - "margin-inline-start", - "margin-left", - "margin-right", - "margin-top", - "marks", - "mask", - "mask-border", - "mask-border-mode", - "mask-border-outset", - "mask-border-repeat", - "mask-border-slice", - "mask-border-source", - "mask-border-width", - "mask-clip", - "mask-composite", - "mask-image", - "mask-mode", - "mask-origin", - "mask-position", - "mask-repeat", - "mask-size", - "mask-type", - "max-block-size", - "max-height", - "max-inline-size", - "max-width", - "min-block-size", - "min-height", - "min-inline-size", - "min-width", - "mix-blend-mode", - "nav-down", - "nav-index", - "nav-left", - "nav-right", - "nav-up", - "none", - "normal", - "object-fit", - "object-position", - "opacity", - "order", - "orphans", - "outline", - "outline-color", - "outline-offset", - "outline-style", - "outline-width", - "overflow", - "overflow-wrap", - "overflow-x", - "overflow-y", - "padding", - "padding-block", - "padding-block-end", - "padding-block-start", - "padding-bottom", - "padding-inline", - "padding-inline-end", - "padding-inline-start", - "padding-left", - "padding-right", - "padding-top", - "page-break-after", - "page-break-before", - "page-break-inside", - "pause", - "pause-after", - "pause-before", - "perspective", - "perspective-origin", - "pointer-events", - "position", - "quotes", - "resize", - "rest", - "rest-after", - "rest-before", - "right", - "row-gap", - "scroll-margin", - "scroll-margin-block", - "scroll-margin-block-end", - "scroll-margin-block-start", - "scroll-margin-bottom", - "scroll-margin-inline", - "scroll-margin-inline-end", - "scroll-margin-inline-start", - "scroll-margin-left", - "scroll-margin-right", - "scroll-margin-top", - "scroll-padding", - "scroll-padding-block", - "scroll-padding-block-end", - "scroll-padding-block-start", - "scroll-padding-bottom", - "scroll-padding-inline", - "scroll-padding-inline-end", - "scroll-padding-inline-start", - "scroll-padding-left", - "scroll-padding-right", - "scroll-padding-top", - "scroll-snap-align", - "scroll-snap-stop", - "scroll-snap-type", - "scrollbar-color", - "scrollbar-gutter", - "scrollbar-width", - "shape-image-threshold", - "shape-margin", - "shape-outside", - "speak", - "speak-as", - "src", - // @font-face - "tab-size", - "table-layout", - "text-align", - "text-align-all", - "text-align-last", - "text-combine-upright", - "text-decoration", - "text-decoration-color", - "text-decoration-line", - "text-decoration-style", - "text-emphasis", - "text-emphasis-color", - "text-emphasis-position", - "text-emphasis-style", - "text-indent", - "text-justify", - "text-orientation", - "text-overflow", - "text-rendering", - "text-shadow", - "text-transform", - "text-underline-position", - "top", - "transform", - "transform-box", - "transform-origin", - "transform-style", - "transition", - "transition-delay", - "transition-duration", - "transition-property", - "transition-timing-function", - "unicode-bidi", - "vertical-align", - "visibility", - "voice-balance", - "voice-duration", - "voice-family", - "voice-pitch", - "voice-range", - "voice-rate", - "voice-stress", - "voice-volume", - "white-space", - "widows", - "width", - "will-change", - "word-break", - "word-spacing", - "word-wrap", - "writing-mode", - "z-index" - // reverse makes sure longer attributes `font-weight` are matched fully - // instead of getting false positives on say `font` -].reverse(); -function scss(hljs) { - const modes = MODES4(hljs); - const PSEUDO_ELEMENTS$1 = PSEUDO_ELEMENTS3; - const PSEUDO_CLASSES$1 = PSEUDO_CLASSES3; - const AT_IDENTIFIER = "@[a-z-]+"; - const AT_MODIFIERS = "and or not only"; - const IDENT_RE4 = "[a-zA-Z-][a-zA-Z0-9_-]*"; - const VARIABLE = { - className: "variable", - begin: "(\\$" + IDENT_RE4 + ")\\b", - relevance: 0 - }; - return { - name: "SCSS", - case_insensitive: true, - illegal: "[=/|']", - contains: [ - hljs.C_LINE_COMMENT_MODE, - hljs.C_BLOCK_COMMENT_MODE, - // to recognize keyframe 40% etc which are outside the scope of our - // attribute value mode - modes.CSS_NUMBER_MODE, - { - className: "selector-id", - begin: "#[A-Za-z0-9_-]+", - relevance: 0 - }, - { - className: "selector-class", - begin: "\\.[A-Za-z0-9_-]+", - relevance: 0 - }, - modes.ATTRIBUTE_SELECTOR_MODE, - { - className: "selector-tag", - begin: "\\b(" + TAGS3.join("|") + ")\\b", - // was there, before, but why? - relevance: 0 - }, - { - className: "selector-pseudo", - begin: ":(" + PSEUDO_CLASSES$1.join("|") + ")" - }, - { - className: "selector-pseudo", - begin: ":(:)?(" + PSEUDO_ELEMENTS$1.join("|") + ")" - }, - VARIABLE, - { - // pseudo-selector params - begin: /\(/, - end: /\)/, - contains: [modes.CSS_NUMBER_MODE] - }, - modes.CSS_VARIABLE, - { - className: "attribute", - begin: "\\b(" + ATTRIBUTES3.join("|") + ")\\b" - }, - { begin: "\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" }, - { - begin: /:/, - end: /[;}{]/, - relevance: 0, - contains: [ - modes.BLOCK_COMMENT, - VARIABLE, - modes.HEXCOLOR, - modes.CSS_NUMBER_MODE, - hljs.QUOTE_STRING_MODE, - hljs.APOS_STRING_MODE, - modes.IMPORTANT, - modes.FUNCTION_DISPATCH - ] - }, - // matching these here allows us to treat them more like regular CSS - // rules so everything between the {} gets regular rule highlighting, - // which is what we want for page and font-face - { - begin: "@(page|font-face)", - keywords: { - $pattern: AT_IDENTIFIER, - keyword: "@page @font-face" - } - }, - { - begin: "@", - end: "[{;]", - returnBegin: true, - keywords: { - $pattern: /[a-z-]+/, - keyword: AT_MODIFIERS, - attribute: MEDIA_FEATURES3.join(" ") - }, - contains: [ - { - begin: AT_IDENTIFIER, - className: "keyword" - }, - { - begin: /[a-z-]+(?=:)/, - className: "attribute" - }, - VARIABLE, - hljs.QUOTE_STRING_MODE, - hljs.APOS_STRING_MODE, - modes.HEXCOLOR, - modes.CSS_NUMBER_MODE - ] - }, - modes.FUNCTION_DISPATCH - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/shell.js -function shell(hljs) { - return { - name: "Shell Session", - aliases: [ - "console", - "shellsession" - ], - contains: [ - { - className: "meta.prompt", - // We cannot add \s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result. - // For instance, in the following example, it would match "echo /path/to/home >" as a prompt: - // echo /path/to/home > t.exe - begin: /^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/, - starts: { - end: /[^\\](?=\s*$)/, - subLanguage: "bash" - } - } - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/sql.js -function sql(hljs) { - const regex = hljs.regex; - const COMMENT_MODE = hljs.COMMENT("--", "$"); - const STRING = { - className: "string", - variants: [ - { - begin: /'/, - end: /'/, - contains: [{ begin: /''/ }] - } - ] - }; - const QUOTED_IDENTIFIER = { - begin: /"/, - end: /"/, - contains: [{ begin: /""/ }] - }; - const LITERALS3 = [ - "true", - "false", - // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way. - // "null", - "unknown" - ]; - const MULTI_WORD_TYPES = [ - "double precision", - "large object", - "with timezone", - "without timezone" - ]; - const TYPES3 = [ - "bigint", - "binary", - "blob", - "boolean", - "char", - "character", - "clob", - "date", - "dec", - "decfloat", - "decimal", - "float", - "int", - "integer", - "interval", - "nchar", - "nclob", - "national", - "numeric", - "real", - "row", - "smallint", - "time", - "timestamp", - "varchar", - "varying", - // modifier (character varying) - "varbinary" - ]; - const NON_RESERVED_WORDS = [ - "add", - "asc", - "collation", - "desc", - "final", - "first", - "last", - "view" - ]; - const RESERVED_WORDS = [ - "abs", - "acos", - "all", - "allocate", - "alter", - "and", - "any", - "are", - "array", - "array_agg", - "array_max_cardinality", - "as", - "asensitive", - "asin", - "asymmetric", - "at", - "atan", - "atomic", - "authorization", - "avg", - "begin", - "begin_frame", - "begin_partition", - "between", - "bigint", - "binary", - "blob", - "boolean", - "both", - "by", - "call", - "called", - "cardinality", - "cascaded", - "case", - "cast", - "ceil", - "ceiling", - "char", - "char_length", - "character", - "character_length", - "check", - "classifier", - "clob", - "close", - "coalesce", - "collate", - "collect", - "column", - "commit", - "condition", - "connect", - "constraint", - "contains", - "convert", - "copy", - "corr", - "corresponding", - "cos", - "cosh", - "count", - "covar_pop", - "covar_samp", - "create", - "cross", - "cube", - "cume_dist", - "current", - "current_catalog", - "current_date", - "current_default_transform_group", - "current_path", - "current_role", - "current_row", - "current_schema", - "current_time", - "current_timestamp", - "current_path", - "current_role", - "current_transform_group_for_type", - "current_user", - "cursor", - "cycle", - "date", - "day", - "deallocate", - "dec", - "decimal", - "decfloat", - "declare", - "default", - "define", - "delete", - "dense_rank", - "deref", - "describe", - "deterministic", - "disconnect", - "distinct", - "double", - "drop", - "dynamic", - "each", - "element", - "else", - "empty", - "end", - "end_frame", - "end_partition", - "end-exec", - "equals", - "escape", - "every", - "except", - "exec", - "execute", - "exists", - "exp", - "external", - "extract", - "false", - "fetch", - "filter", - "first_value", - "float", - "floor", - "for", - "foreign", - "frame_row", - "free", - "from", - "full", - "function", - "fusion", - "get", - "global", - "grant", - "group", - "grouping", - "groups", - "having", - "hold", - "hour", - "identity", - "in", - "indicator", - "initial", - "inner", - "inout", - "insensitive", - "insert", - "int", - "integer", - "intersect", - "intersection", - "interval", - "into", - "is", - "join", - "json_array", - "json_arrayagg", - "json_exists", - "json_object", - "json_objectagg", - "json_query", - "json_table", - "json_table_primitive", - "json_value", - "lag", - "language", - "large", - "last_value", - "lateral", - "lead", - "leading", - "left", - "like", - "like_regex", - "listagg", - "ln", - "local", - "localtime", - "localtimestamp", - "log", - "log10", - "lower", - "match", - "match_number", - "match_recognize", - "matches", - "max", - "member", - "merge", - "method", - "min", - "minute", - "mod", - "modifies", - "module", - "month", - "multiset", - "national", - "natural", - "nchar", - "nclob", - "new", - "no", - "none", - "normalize", - "not", - "nth_value", - "ntile", - "null", - "nullif", - "numeric", - "octet_length", - "occurrences_regex", - "of", - "offset", - "old", - "omit", - "on", - "one", - "only", - "open", - "or", - "order", - "out", - "outer", - "over", - "overlaps", - "overlay", - "parameter", - "partition", - "pattern", - "per", - "percent", - "percent_rank", - "percentile_cont", - "percentile_disc", - "period", - "portion", - "position", - "position_regex", - "power", - "precedes", - "precision", - "prepare", - "primary", - "procedure", - "ptf", - "range", - "rank", - "reads", - "real", - "recursive", - "ref", - "references", - "referencing", - "regr_avgx", - "regr_avgy", - "regr_count", - "regr_intercept", - "regr_r2", - "regr_slope", - "regr_sxx", - "regr_sxy", - "regr_syy", - "release", - "result", - "return", - "returns", - "revoke", - "right", - "rollback", - "rollup", - "row", - "row_number", - "rows", - "running", - "savepoint", - "scope", - "scroll", - "search", - "second", - "seek", - "select", - "sensitive", - "session_user", - "set", - "show", - "similar", - "sin", - "sinh", - "skip", - "smallint", - "some", - "specific", - "specifictype", - "sql", - "sqlexception", - "sqlstate", - "sqlwarning", - "sqrt", - "start", - "static", - "stddev_pop", - "stddev_samp", - "submultiset", - "subset", - "substring", - "substring_regex", - "succeeds", - "sum", - "symmetric", - "system", - "system_time", - "system_user", - "table", - "tablesample", - "tan", - "tanh", - "then", - "time", - "timestamp", - "timezone_hour", - "timezone_minute", - "to", - "trailing", - "translate", - "translate_regex", - "translation", - "treat", - "trigger", - "trim", - "trim_array", - "true", - "truncate", - "uescape", - "union", - "unique", - "unknown", - "unnest", - "update", - "upper", - "user", - "using", - "value", - "values", - "value_of", - "var_pop", - "var_samp", - "varbinary", - "varchar", - "varying", - "versioning", - "when", - "whenever", - "where", - "width_bucket", - "window", - "with", - "within", - "without", - "year" - ]; - const RESERVED_FUNCTIONS = [ - "abs", - "acos", - "array_agg", - "asin", - "atan", - "avg", - "cast", - "ceil", - "ceiling", - "coalesce", - "corr", - "cos", - "cosh", - "count", - "covar_pop", - "covar_samp", - "cume_dist", - "dense_rank", - "deref", - "element", - "exp", - "extract", - "first_value", - "floor", - "json_array", - "json_arrayagg", - "json_exists", - "json_object", - "json_objectagg", - "json_query", - "json_table", - "json_table_primitive", - "json_value", - "lag", - "last_value", - "lead", - "listagg", - "ln", - "log", - "log10", - "lower", - "max", - "min", - "mod", - "nth_value", - "ntile", - "nullif", - "percent_rank", - "percentile_cont", - "percentile_disc", - "position", - "position_regex", - "power", - "rank", - "regr_avgx", - "regr_avgy", - "regr_count", - "regr_intercept", - "regr_r2", - "regr_slope", - "regr_sxx", - "regr_sxy", - "regr_syy", - "row_number", - "sin", - "sinh", - "sqrt", - "stddev_pop", - "stddev_samp", - "substring", - "substring_regex", - "sum", - "tan", - "tanh", - "translate", - "translate_regex", - "treat", - "trim", - "trim_array", - "unnest", - "upper", - "value_of", - "var_pop", - "var_samp", - "width_bucket" - ]; - const POSSIBLE_WITHOUT_PARENS = [ - "current_catalog", - "current_date", - "current_default_transform_group", - "current_path", - "current_role", - "current_schema", - "current_transform_group_for_type", - "current_user", - "session_user", - "system_time", - "system_user", - "current_time", - "localtime", - "current_timestamp", - "localtimestamp" - ]; - const COMBOS = [ - "create table", - "insert into", - "primary key", - "foreign key", - "not null", - "alter table", - "add constraint", - "grouping sets", - "on overflow", - "character set", - "respect nulls", - "ignore nulls", - "nulls first", - "nulls last", - "depth first", - "breadth first" - ]; - const FUNCTIONS = RESERVED_FUNCTIONS; - const KEYWORDS3 = [ - ...RESERVED_WORDS, - ...NON_RESERVED_WORDS - ].filter((keyword) => { - return !RESERVED_FUNCTIONS.includes(keyword); - }); - const VARIABLE = { - className: "variable", - begin: /@[a-z0-9][a-z0-9_]*/ - }; - const OPERATOR = { - className: "operator", - begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, - relevance: 0 - }; - const FUNCTION_CALL = { - begin: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/), - relevance: 0, - keywords: { built_in: FUNCTIONS } - }; - function reduceRelevancy(list, { - exceptions, - when - } = {}) { - const qualifyFn = when; - exceptions = exceptions || []; - return list.map((item) => { - if (item.match(/\|\d+$/) || exceptions.includes(item)) { - return item; - } else if (qualifyFn(item)) { - return `${item}|0`; - } else { - return item; - } - }); - } - return { - name: "SQL", - case_insensitive: true, - // does not include {} or HTML tags ` x.length < 3 }), - literal: LITERALS3, - type: TYPES3, - built_in: POSSIBLE_WITHOUT_PARENS - }, - contains: [ - { - begin: regex.either(...COMBOS), - relevance: 0, - keywords: { - $pattern: /[\w\.]+/, - keyword: KEYWORDS3.concat(COMBOS), - literal: LITERALS3, - type: TYPES3 - } - }, - { - className: "type", - begin: regex.either(...MULTI_WORD_TYPES) - }, - FUNCTION_CALL, - VARIABLE, - STRING, - QUOTED_IDENTIFIER, - hljs.C_NUMBER_MODE, - hljs.C_BLOCK_COMMENT_MODE, - COMMENT_MODE, - OPERATOR - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/swift.js -function source2(re) { - if (!re) - return null; - if (typeof re === "string") - return re; - return re.source; -} -function lookahead2(re) { - return concat2("(?=", re, ")"); -} -function concat2(...args) { - const joined = args.map((x) => source2(x)).join(""); - return joined; -} -function stripOptionsFromArgs2(args) { - const opts = args[args.length - 1]; - if (typeof opts === "object" && opts.constructor === Object) { - args.splice(args.length - 1, 1); - return opts; - } else { - return {}; - } -} -function either2(...args) { - const opts = stripOptionsFromArgs2(args); - const joined = "(" + (opts.capture ? "" : "?:") + args.map((x) => source2(x)).join("|") + ")"; - return joined; -} -var keywordWrapper = (keyword) => concat2( - /\b/, - keyword, - /\w$/.test(keyword) ? /\b/ : /\B/ -); -var dotKeywords = [ - "Protocol", - // contextual - "Type" - // contextual -].map(keywordWrapper); -var optionalDotKeywords = [ - "init", - "self" -].map(keywordWrapper); -var keywordTypes = [ - "Any", - "Self" -]; -var keywords = [ - // strings below will be fed into the regular `keywords` engine while regex - // will result in additional modes being created to scan for those keywords to - // avoid conflicts with other rules - "actor", - "any", - // contextual - "associatedtype", - "async", - "await", - /as\?/, - // operator - /as!/, - // operator - "as", - // operator - "break", - "case", - "catch", - "class", - "continue", - "convenience", - // contextual - "default", - "defer", - "deinit", - "didSet", - // contextual - "distributed", - "do", - "dynamic", - // contextual - "else", - "enum", - "extension", - "fallthrough", - /fileprivate\(set\)/, - "fileprivate", - "final", - // contextual - "for", - "func", - "get", - // contextual - "guard", - "if", - "import", - "indirect", - // contextual - "infix", - // contextual - /init\?/, - /init!/, - "inout", - /internal\(set\)/, - "internal", - "in", - "is", - // operator - "isolated", - // contextual - "nonisolated", - // contextual - "lazy", - // contextual - "let", - "mutating", - // contextual - "nonmutating", - // contextual - /open\(set\)/, - // contextual - "open", - // contextual - "operator", - "optional", - // contextual - "override", - // contextual - "postfix", - // contextual - "precedencegroup", - "prefix", - // contextual - /private\(set\)/, - "private", - "protocol", - /public\(set\)/, - "public", - "repeat", - "required", - // contextual - "rethrows", - "return", - "set", - // contextual - "some", - // contextual - "static", - "struct", - "subscript", - "super", - "switch", - "throws", - "throw", - /try\?/, - // operator - /try!/, - // operator - "try", - // operator - "typealias", - /unowned\(safe\)/, - // contextual - /unowned\(unsafe\)/, - // contextual - "unowned", - // contextual - "var", - "weak", - // contextual - "where", - "while", - "willSet" - // contextual -]; -var literals = [ - "false", - "nil", - "true" -]; -var precedencegroupKeywords = [ - "assignment", - "associativity", - "higherThan", - "left", - "lowerThan", - "none", - "right" -]; -var numberSignKeywords = [ - "#colorLiteral", - "#column", - "#dsohandle", - "#else", - "#elseif", - "#endif", - "#error", - "#file", - "#fileID", - "#fileLiteral", - "#filePath", - "#function", - "#if", - "#imageLiteral", - "#keyPath", - "#line", - "#selector", - "#sourceLocation", - "#warn_unqualified_access", - "#warning" -]; -var builtIns = [ - "abs", - "all", - "any", - "assert", - "assertionFailure", - "debugPrint", - "dump", - "fatalError", - "getVaList", - "isKnownUniquelyReferenced", - "max", - "min", - "numericCast", - "pointwiseMax", - "pointwiseMin", - "precondition", - "preconditionFailure", - "print", - "readLine", - "repeatElement", - "sequence", - "stride", - "swap", - "swift_unboxFromSwiftValueWithType", - "transcode", - "type", - "unsafeBitCast", - "unsafeDowncast", - "withExtendedLifetime", - "withUnsafeMutablePointer", - "withUnsafePointer", - "withVaList", - "withoutActuallyEscaping", - "zip" -]; -var operatorHead = either2( - /[/=\-+!*%<>&|^~?]/, - /[\u00A1-\u00A7]/, - /[\u00A9\u00AB]/, - /[\u00AC\u00AE]/, - /[\u00B0\u00B1]/, - /[\u00B6\u00BB\u00BF\u00D7\u00F7]/, - /[\u2016-\u2017]/, - /[\u2020-\u2027]/, - /[\u2030-\u203E]/, - /[\u2041-\u2053]/, - /[\u2055-\u205E]/, - /[\u2190-\u23FF]/, - /[\u2500-\u2775]/, - /[\u2794-\u2BFF]/, - /[\u2E00-\u2E7F]/, - /[\u3001-\u3003]/, - /[\u3008-\u3020]/, - /[\u3030]/ -); -var operatorCharacter = either2( - operatorHead, - /[\u0300-\u036F]/, - /[\u1DC0-\u1DFF]/, - /[\u20D0-\u20FF]/, - /[\uFE00-\uFE0F]/, - /[\uFE20-\uFE2F]/ - // TODO: The following characters are also allowed, but the regex isn't supported yet. - // /[\u{E0100}-\u{E01EF}]/u -); -var operator = concat2(operatorHead, operatorCharacter, "*"); -var identifierHead = either2( - /[a-zA-Z_]/, - /[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/, - /[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/, - /[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/, - /[\u1E00-\u1FFF]/, - /[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/, - /[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/, - /[\u2C00-\u2DFF\u2E80-\u2FFF]/, - /[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/, - /[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/, - /[\uFE47-\uFEFE\uFF00-\uFFFD]/ - // Should be /[\uFE47-\uFFFD]/, but we have to exclude FEFF. - // The following characters are also allowed, but the regexes aren't supported yet. - // /[\u{10000}-\u{1FFFD}\u{20000-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}]/u, - // /[\u{50000}-\u{5FFFD}\u{60000-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}]/u, - // /[\u{90000}-\u{9FFFD}\u{A0000-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}]/u, - // /[\u{D0000}-\u{DFFFD}\u{E0000-\u{EFFFD}]/u -); -var identifierCharacter = either2( - identifierHead, - /\d/, - /[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/ -); -var identifier = concat2(identifierHead, identifierCharacter, "*"); -var typeIdentifier = concat2(/[A-Z]/, identifierCharacter, "*"); -var keywordAttributes = [ - "autoclosure", - concat2(/convention\(/, either2("swift", "block", "c"), /\)/), - "discardableResult", - "dynamicCallable", - "dynamicMemberLookup", - "escaping", - "frozen", - "GKInspectable", - "IBAction", - "IBDesignable", - "IBInspectable", - "IBOutlet", - "IBSegueAction", - "inlinable", - "main", - "nonobjc", - "NSApplicationMain", - "NSCopying", - "NSManaged", - concat2(/objc\(/, identifier, /\)/), - "objc", - "objcMembers", - "propertyWrapper", - "requires_stored_property_inits", - "resultBuilder", - "testable", - "UIApplicationMain", - "unknown", - "usableFromInline" -]; -var availabilityKeywords = [ - "iOS", - "iOSApplicationExtension", - "macOS", - "macOSApplicationExtension", - "macCatalyst", - "macCatalystApplicationExtension", - "watchOS", - "watchOSApplicationExtension", - "tvOS", - "tvOSApplicationExtension", - "swift" -]; -function swift(hljs) { - const WHITESPACE = { - match: /\s+/, - relevance: 0 - }; - const BLOCK_COMMENT = hljs.COMMENT( - "/\\*", - "\\*/", - { contains: ["self"] } - ); - const COMMENTS = [ - hljs.C_LINE_COMMENT_MODE, - BLOCK_COMMENT - ]; - const DOT_KEYWORD = { - match: [ - /\./, - either2(...dotKeywords, ...optionalDotKeywords) - ], - className: { 2: "keyword" } - }; - const KEYWORD_GUARD = { - // Consume .keyword to prevent highlighting properties and methods as keywords. - match: concat2(/\./, either2(...keywords)), - relevance: 0 - }; - const PLAIN_KEYWORDS = keywords.filter((kw) => typeof kw === "string").concat(["_|0"]); - const REGEX_KEYWORDS = keywords.filter((kw) => typeof kw !== "string").concat(keywordTypes).map(keywordWrapper); - const KEYWORD = { variants: [ - { - className: "keyword", - match: either2(...REGEX_KEYWORDS, ...optionalDotKeywords) - } - ] }; - const KEYWORDS3 = { - $pattern: either2( - /\b\w+/, - // regular keywords - /#\w+/ - // number keywords - ), - keyword: PLAIN_KEYWORDS.concat(numberSignKeywords), - literal: literals - }; - const KEYWORD_MODES = [ - DOT_KEYWORD, - KEYWORD_GUARD, - KEYWORD - ]; - const BUILT_IN_GUARD = { - // Consume .built_in to prevent highlighting properties and methods. - match: concat2(/\./, either2(...builtIns)), - relevance: 0 - }; - const BUILT_IN = { - className: "built_in", - match: concat2(/\b/, either2(...builtIns), /(?=\()/) - }; - const BUILT_INS3 = [ - BUILT_IN_GUARD, - BUILT_IN - ]; - const OPERATOR_GUARD = { - // Prevent -> from being highlighting as an operator. - match: /->/, - relevance: 0 - }; - const OPERATOR = { - className: "operator", - relevance: 0, - variants: [ - { match: operator }, - { - // dot-operator: only operators that start with a dot are allowed to use dots as - // characters (..., ...<, .*, etc). So there rule here is: a dot followed by one or more - // characters that may also include dots. - match: `\\.(\\.|${operatorCharacter})+` - } - ] - }; - const OPERATORS = [ - OPERATOR_GUARD, - OPERATOR - ]; - const decimalDigits3 = "([0-9]_*)+"; - const hexDigits3 = "([0-9a-fA-F]_*)+"; - const NUMBER = { - className: "number", - relevance: 0, - variants: [ - // decimal floating-point-literal (subsumes decimal-literal) - { match: `\\b(${decimalDigits3})(\\.(${decimalDigits3}))?([eE][+-]?(${decimalDigits3}))?\\b` }, - // hexadecimal floating-point-literal (subsumes hexadecimal-literal) - { match: `\\b0x(${hexDigits3})(\\.(${hexDigits3}))?([pP][+-]?(${decimalDigits3}))?\\b` }, - // octal-literal - { match: /\b0o([0-7]_*)+\b/ }, - // binary-literal - { match: /\b0b([01]_*)+\b/ } - ] - }; - const ESCAPED_CHARACTER = (rawDelimiter = "") => ({ - className: "subst", - variants: [ - { match: concat2(/\\/, rawDelimiter, /[0\\tnr"']/) }, - { match: concat2(/\\/, rawDelimiter, /u\{[0-9a-fA-F]{1,8}\}/) } - ] - }); - const ESCAPED_NEWLINE = (rawDelimiter = "") => ({ - className: "subst", - match: concat2(/\\/, rawDelimiter, /[\t ]*(?:[\r\n]|\r\n)/) - }); - const INTERPOLATION = (rawDelimiter = "") => ({ - className: "subst", - label: "interpol", - begin: concat2(/\\/, rawDelimiter, /\(/), - end: /\)/ - }); - const MULTILINE_STRING = (rawDelimiter = "") => ({ - begin: concat2(rawDelimiter, /"""/), - end: concat2(/"""/, rawDelimiter), - contains: [ - ESCAPED_CHARACTER(rawDelimiter), - ESCAPED_NEWLINE(rawDelimiter), - INTERPOLATION(rawDelimiter) - ] - }); - const SINGLE_LINE_STRING = (rawDelimiter = "") => ({ - begin: concat2(rawDelimiter, /"/), - end: concat2(/"/, rawDelimiter), - contains: [ - ESCAPED_CHARACTER(rawDelimiter), - INTERPOLATION(rawDelimiter) - ] - }); - const STRING = { - className: "string", - variants: [ - MULTILINE_STRING(), - MULTILINE_STRING("#"), - MULTILINE_STRING("##"), - MULTILINE_STRING("###"), - SINGLE_LINE_STRING(), - SINGLE_LINE_STRING("#"), - SINGLE_LINE_STRING("##"), - SINGLE_LINE_STRING("###") - ] - }; - const QUOTED_IDENTIFIER = { match: concat2(/`/, identifier, /`/) }; - const IMPLICIT_PARAMETER = { - className: "variable", - match: /\$\d+/ - }; - const PROPERTY_WRAPPER_PROJECTION = { - className: "variable", - match: `\\$${identifierCharacter}+` - }; - const IDENTIFIERS = [ - QUOTED_IDENTIFIER, - IMPLICIT_PARAMETER, - PROPERTY_WRAPPER_PROJECTION - ]; - const AVAILABLE_ATTRIBUTE = { - match: /(@|#(un)?)available/, - className: "keyword", - starts: { contains: [ - { - begin: /\(/, - end: /\)/, - keywords: availabilityKeywords, - contains: [ - ...OPERATORS, - NUMBER, - STRING - ] - } - ] } - }; - const KEYWORD_ATTRIBUTE = { - className: "keyword", - match: concat2(/@/, either2(...keywordAttributes)) - }; - const USER_DEFINED_ATTRIBUTE = { - className: "meta", - match: concat2(/@/, identifier) - }; - const ATTRIBUTES4 = [ - AVAILABLE_ATTRIBUTE, - KEYWORD_ATTRIBUTE, - USER_DEFINED_ATTRIBUTE - ]; - const TYPE = { - match: lookahead2(/\b[A-Z]/), - relevance: 0, - contains: [ - { - // Common Apple frameworks, for relevance boost - className: "type", - match: concat2(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/, identifierCharacter, "+") - }, - { - // Type identifier - className: "type", - match: typeIdentifier, - relevance: 0 - }, - { - // Optional type - match: /[?!]+/, - relevance: 0 - }, - { - // Variadic parameter - match: /\.\.\./, - relevance: 0 - }, - { - // Protocol composition - match: concat2(/\s+&\s+/, lookahead2(typeIdentifier)), - relevance: 0 - } - ] - }; - const GENERIC_ARGUMENTS = { - begin: //, - keywords: KEYWORDS3, - contains: [ - ...COMMENTS, - ...KEYWORD_MODES, - ...ATTRIBUTES4, - OPERATOR_GUARD, - TYPE - ] - }; - TYPE.contains.push(GENERIC_ARGUMENTS); - const TUPLE_ELEMENT_NAME = { - match: concat2(identifier, /\s*:/), - keywords: "_|0", - relevance: 0 - }; - const TUPLE = { - begin: /\(/, - end: /\)/, - relevance: 0, - keywords: KEYWORDS3, - contains: [ - "self", - TUPLE_ELEMENT_NAME, - ...COMMENTS, - ...KEYWORD_MODES, - ...BUILT_INS3, - ...OPERATORS, - NUMBER, - STRING, - ...IDENTIFIERS, - ...ATTRIBUTES4, - TYPE - ] - }; - const GENERIC_PARAMETERS = { - begin: //, - contains: [ - ...COMMENTS, - TYPE - ] - }; - const FUNCTION_PARAMETER_NAME = { - begin: either2( - lookahead2(concat2(identifier, /\s*:/)), - lookahead2(concat2(identifier, /\s+/, identifier, /\s*:/)) - ), - end: /:/, - relevance: 0, - contains: [ - { - className: "keyword", - match: /\b_\b/ - }, - { - className: "params", - match: identifier - } - ] - }; - const FUNCTION_PARAMETERS = { - begin: /\(/, - end: /\)/, - keywords: KEYWORDS3, - contains: [ - FUNCTION_PARAMETER_NAME, - ...COMMENTS, - ...KEYWORD_MODES, - ...OPERATORS, - NUMBER, - STRING, - ...ATTRIBUTES4, - TYPE, - TUPLE - ], - endsParent: true, - illegal: /["']/ - }; - const FUNCTION = { - match: [ - /func/, - /\s+/, - either2(QUOTED_IDENTIFIER.match, identifier, operator) - ], - className: { - 1: "keyword", - 3: "title.function" - }, - contains: [ - GENERIC_PARAMETERS, - FUNCTION_PARAMETERS, - WHITESPACE - ], - illegal: [ - /\[/, - /%/ - ] - }; - const INIT_SUBSCRIPT = { - match: [ - /\b(?:subscript|init[?!]?)/, - /\s*(?=[<(])/ - ], - className: { 1: "keyword" }, - contains: [ - GENERIC_PARAMETERS, - FUNCTION_PARAMETERS, - WHITESPACE - ], - illegal: /\[|%/ - }; - const OPERATOR_DECLARATION = { - match: [ - /operator/, - /\s+/, - operator - ], - className: { - 1: "keyword", - 3: "title" - } - }; - const PRECEDENCEGROUP = { - begin: [ - /precedencegroup/, - /\s+/, - typeIdentifier - ], - className: { - 1: "keyword", - 3: "title" - }, - contains: [TYPE], - keywords: [ - ...precedencegroupKeywords, - ...literals - ], - end: /}/ - }; - for (const variant of STRING.variants) { - const interpolation = variant.contains.find((mode) => mode.label === "interpol"); - interpolation.keywords = KEYWORDS3; - const submodes = [ - ...KEYWORD_MODES, - ...BUILT_INS3, - ...OPERATORS, - NUMBER, - STRING, - ...IDENTIFIERS - ]; - interpolation.contains = [ - ...submodes, - { - begin: /\(/, - end: /\)/, - contains: [ - "self", - ...submodes - ] - } - ]; - } - return { - name: "Swift", - keywords: KEYWORDS3, - contains: [ - ...COMMENTS, - FUNCTION, - INIT_SUBSCRIPT, - { - beginKeywords: "struct protocol class extension enum actor", - end: "\\{", - excludeEnd: true, - keywords: KEYWORDS3, - contains: [ - hljs.inherit(hljs.TITLE_MODE, { - className: "title.class", - begin: /[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/ - }), - ...KEYWORD_MODES - ] - }, - OPERATOR_DECLARATION, - PRECEDENCEGROUP, - { - beginKeywords: "import", - end: /$/, - contains: [...COMMENTS], - relevance: 0 - }, - ...KEYWORD_MODES, - ...BUILT_INS3, - ...OPERATORS, - NUMBER, - STRING, - ...IDENTIFIERS, - ...ATTRIBUTES4, - TYPE, - TUPLE - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/typescript.js -var IDENT_RE3 = "[A-Za-z$_][0-9A-Za-z$_]*"; -var KEYWORDS2 = [ - "as", - // for exports - "in", - "of", - "if", - "for", - "while", - "finally", - "var", - "new", - "function", - "do", - "return", - "void", - "else", - "break", - "catch", - "instanceof", - "with", - "throw", - "case", - "default", - "try", - "switch", - "continue", - "typeof", - "delete", - "let", - "yield", - "const", - "class", - // JS handles these with a special rule - // "get", - // "set", - "debugger", - "async", - "await", - "static", - "import", - "from", - "export", - "extends" -]; -var LITERALS2 = [ - "true", - "false", - "null", - "undefined", - "NaN", - "Infinity" -]; -var TYPES2 = [ - // Fundamental objects - "Object", - "Function", - "Boolean", - "Symbol", - // numbers and dates - "Math", - "Date", - "Number", - "BigInt", - // text - "String", - "RegExp", - // Indexed collections - "Array", - "Float32Array", - "Float64Array", - "Int8Array", - "Uint8Array", - "Uint8ClampedArray", - "Int16Array", - "Int32Array", - "Uint16Array", - "Uint32Array", - "BigInt64Array", - "BigUint64Array", - // Keyed collections - "Set", - "Map", - "WeakSet", - "WeakMap", - // Structured data - "ArrayBuffer", - "SharedArrayBuffer", - "Atomics", - "DataView", - "JSON", - // Control abstraction objects - "Promise", - "Generator", - "GeneratorFunction", - "AsyncFunction", - // Reflection - "Reflect", - "Proxy", - // Internationalization - "Intl", - // WebAssembly - "WebAssembly" -]; -var ERROR_TYPES2 = [ - "Error", - "EvalError", - "InternalError", - "RangeError", - "ReferenceError", - "SyntaxError", - "TypeError", - "URIError" -]; -var BUILT_IN_GLOBALS2 = [ - "setInterval", - "setTimeout", - "clearInterval", - "clearTimeout", - "require", - "exports", - "eval", - "isFinite", - "isNaN", - "parseFloat", - "parseInt", - "decodeURI", - "decodeURIComponent", - "encodeURI", - "encodeURIComponent", - "escape", - "unescape" -]; -var BUILT_IN_VARIABLES2 = [ - "arguments", - "this", - "super", - "console", - "window", - "document", - "localStorage", - "sessionStorage", - "module", - "global" - // Node.js -]; -var BUILT_INS2 = [].concat( - BUILT_IN_GLOBALS2, - TYPES2, - ERROR_TYPES2 -); -function javascript2(hljs) { - const regex = hljs.regex; - const hasClosingTag = (match, { after }) => { - const tag = "", - end: "" - }; - const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/; - const XML_TAG = { - begin: /<[A-Za-z0-9\\._:-]+/, - end: /\/[A-Za-z0-9\\._:-]+>|\/>/, - /** - * @param {RegExpMatchArray} match - * @param {CallbackResponse} response - */ - isTrulyOpeningTag: (match, response) => { - const afterMatchIndex = match[0].length + match.index; - const nextChar = match.input[afterMatchIndex]; - if ( - // HTML should not include another raw `<` inside a tag - // nested type? - // `>`, etc. - nextChar === "<" || // the , gives away that this is not HTML - // `` - nextChar === "," - ) { - response.ignoreMatch(); - return; - } - if (nextChar === ">") { - if (!hasClosingTag(match, { after: afterMatchIndex })) { - response.ignoreMatch(); - } - } - let m; - const afterMatch = match.input.substring(afterMatchIndex); - if (m = afterMatch.match(/^\s*=/)) { - response.ignoreMatch(); - return; - } - if (m = afterMatch.match(/^\s+extends\s+/)) { - if (m.index === 0) { - response.ignoreMatch(); - return; - } - } - } - }; - const KEYWORDS$1 = { - $pattern: IDENT_RE3, - keyword: KEYWORDS2, - literal: LITERALS2, - built_in: BUILT_INS2, - "variable.language": BUILT_IN_VARIABLES2 - }; - const decimalDigits3 = "[0-9](_?[0-9])*"; - const frac3 = `\\.(${decimalDigits3})`; - const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; - const NUMBER = { - className: "number", - variants: [ - // DecimalLiteral - { begin: `(\\b(${decimalInteger})((${frac3})|\\.)?|(${frac3}))[eE][+-]?(${decimalDigits3})\\b` }, - { begin: `\\b(${decimalInteger})\\b((${frac3})\\b|\\.)?|(${frac3})\\b` }, - // DecimalBigIntegerLiteral - { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, - // NonDecimalIntegerLiteral - { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, - { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, - { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, - // LegacyOctalIntegerLiteral (does not include underscore separators) - // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals - { begin: "\\b0[0-7]+n?\\b" } - ], - relevance: 0 - }; - const SUBST = { - className: "subst", - begin: "\\$\\{", - end: "\\}", - keywords: KEYWORDS$1, - contains: [] - // defined later - }; - const HTML_TEMPLATE = { - begin: "html`", - end: "", - starts: { - end: "`", - returnEnd: false, - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - subLanguage: "xml" - } - }; - const CSS_TEMPLATE = { - begin: "css`", - end: "", - starts: { - end: "`", - returnEnd: false, - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - subLanguage: "css" - } - }; - const GRAPHQL_TEMPLATE = { - begin: "gql`", - end: "", - starts: { - end: "`", - returnEnd: false, - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ], - subLanguage: "graphql" - } - }; - const TEMPLATE_STRING = { - className: "string", - begin: "`", - end: "`", - contains: [ - hljs.BACKSLASH_ESCAPE, - SUBST - ] - }; - const JSDOC_COMMENT = hljs.COMMENT( - /\/\*\*(?!\/)/, - "\\*/", - { - relevance: 0, - contains: [ - { - begin: "(?=@[A-Za-z]+)", - relevance: 0, - contains: [ - { - className: "doctag", - begin: "@[A-Za-z]+" - }, - { - className: "type", - begin: "\\{", - end: "\\}", - excludeEnd: true, - excludeBegin: true, - relevance: 0 - }, - { - className: "variable", - begin: IDENT_RE$1 + "(?=\\s*(-)|$)", - endsParent: true, - relevance: 0 - }, - // eat spaces (not newlines) so we can find - // types or variables - { - begin: /(?=[^\n])\s/, - relevance: 0 - } - ] - } - ] - } - ); - const COMMENT2 = { - className: "comment", - variants: [ - JSDOC_COMMENT, - hljs.C_BLOCK_COMMENT_MODE, - hljs.C_LINE_COMMENT_MODE - ] - }; - const SUBST_INTERNALS = [ - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - HTML_TEMPLATE, - CSS_TEMPLATE, - GRAPHQL_TEMPLATE, - TEMPLATE_STRING, - // Skip numbers when they are part of a variable name - { match: /\$\d+/ }, - NUMBER - // This is intentional: - // See https://github.com/highlightjs/highlight.js/issues/3288 - // hljs.REGEXP_MODE - ]; - SUBST.contains = SUBST_INTERNALS.concat({ - // we need to pair up {} inside our subst to prevent - // it from ending too early by matching another } - begin: /\{/, - end: /\}/, - keywords: KEYWORDS$1, - contains: [ - "self" - ].concat(SUBST_INTERNALS) - }); - const SUBST_AND_COMMENTS = [].concat(COMMENT2, SUBST.contains); - const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ - // eat recursive parens in sub expressions - { - begin: /\(/, - end: /\)/, - keywords: KEYWORDS$1, - contains: ["self"].concat(SUBST_AND_COMMENTS) - } - ]); - const PARAMS = { - className: "params", - begin: /\(/, - end: /\)/, - excludeBegin: true, - excludeEnd: true, - keywords: KEYWORDS$1, - contains: PARAMS_CONTAINS - }; - const CLASS_OR_EXTENDS = { - variants: [ - // class Car extends vehicle - { - match: [ - /class/, - /\s+/, - IDENT_RE$1, - /\s+/, - /extends/, - /\s+/, - regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*") - ], - scope: { - 1: "keyword", - 3: "title.class", - 5: "keyword", - 7: "title.class.inherited" - } - }, - // class Car - { - match: [ - /class/, - /\s+/, - IDENT_RE$1 - ], - scope: { - 1: "keyword", - 3: "title.class" - } - } - ] - }; - const CLASS_REFERENCE = { - relevance: 0, - match: regex.either( - // Hard coded exceptions - /\bJSON/, - // Float32Array, OutT - /\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/, - // CSSFactory, CSSFactoryT - /\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/, - // FPs, FPsT - /\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/ - // P - // single letters are not highlighted - // BLAH - // this will be flagged as a UPPER_CASE_CONSTANT instead - ), - className: "title.class", - keywords: { - _: [ - // se we still get relevance credit for JS library classes - ...TYPES2, - ...ERROR_TYPES2 - ] - } - }; - const USE_STRICT = { - label: "use_strict", - className: "meta", - relevance: 10, - begin: /^\s*['"]use (strict|asm)['"]/ - }; - const FUNCTION_DEFINITION = { - variants: [ - { - match: [ - /function/, - /\s+/, - IDENT_RE$1, - /(?=\s*\()/ - ] - }, - // anonymous function - { - match: [ - /function/, - /\s*(?=\()/ - ] - } - ], - className: { - 1: "keyword", - 3: "title.function" - }, - label: "func.def", - contains: [PARAMS], - illegal: /%/ - }; - const UPPER_CASE_CONSTANT = { - relevance: 0, - match: /\b[A-Z][A-Z_0-9]+\b/, - className: "variable.constant" - }; - function noneOf(list) { - return regex.concat("(?!", list.join("|"), ")"); - } - const FUNCTION_CALL = { - match: regex.concat( - /\b/, - noneOf([ - ...BUILT_IN_GLOBALS2, - "super", - "import" - ]), - IDENT_RE$1, - regex.lookahead(/\(/) - ), - className: "title.function", - relevance: 0 - }; - const PROPERTY_ACCESS = { - begin: regex.concat(/\./, regex.lookahead( - regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/) - )), - end: IDENT_RE$1, - excludeBegin: true, - keywords: "prototype", - className: "property", - relevance: 0 - }; - const GETTER_OR_SETTER = { - match: [ - /get|set/, - /\s+/, - IDENT_RE$1, - /(?=\()/ - ], - className: { - 1: "keyword", - 3: "title.function" - }, - contains: [ - { - // eat to avoid empty params - begin: /\(\)/ - }, - PARAMS - ] - }; - const FUNC_LEAD_IN_RE = "(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|" + hljs.UNDERSCORE_IDENT_RE + ")\\s*=>"; - const FUNCTION_VARIABLE = { - match: [ - /const|var|let/, - /\s+/, - IDENT_RE$1, - /\s*/, - /=\s*/, - /(async\s*)?/, - // async is optional - regex.lookahead(FUNC_LEAD_IN_RE) - ], - keywords: "async", - className: { - 1: "keyword", - 3: "title.function" - }, - contains: [ - PARAMS - ] - }; - return { - name: "JavaScript", - aliases: ["js", "jsx", "mjs", "cjs"], - keywords: KEYWORDS$1, - // this will be extended by TypeScript - exports: { PARAMS_CONTAINS, CLASS_REFERENCE }, - illegal: /#(?![$_A-z])/, - contains: [ - hljs.SHEBANG({ - label: "shebang", - binary: "node", - relevance: 5 - }), - USE_STRICT, - hljs.APOS_STRING_MODE, - hljs.QUOTE_STRING_MODE, - HTML_TEMPLATE, - CSS_TEMPLATE, - GRAPHQL_TEMPLATE, - TEMPLATE_STRING, - COMMENT2, - // Skip numbers when they are part of a variable name - { match: /\$\d+/ }, - NUMBER, - CLASS_REFERENCE, - { - className: "attr", - begin: IDENT_RE$1 + regex.lookahead(":"), - relevance: 0 - }, - FUNCTION_VARIABLE, - { - // "value" container - begin: "(" + hljs.RE_STARTERS_RE + "|\\b(case|return|throw)\\b)\\s*", - keywords: "return throw case", - relevance: 0, - contains: [ - COMMENT2, - hljs.REGEXP_MODE, - { - className: "function", - // we have to count the parens to make sure we actually have the - // correct bounding ( ) before the =>. There could be any number of - // sub-expressions inside also surrounded by parens. - begin: FUNC_LEAD_IN_RE, - returnBegin: true, - end: "\\s*=>", - contains: [ - { - className: "params", - variants: [ - { - begin: hljs.UNDERSCORE_IDENT_RE, - relevance: 0 - }, - { - className: null, - begin: /\(\s*\)/, - skip: true - }, - { - begin: /\(/, - end: /\)/, - excludeBegin: true, - excludeEnd: true, - keywords: KEYWORDS$1, - contains: PARAMS_CONTAINS - } - ] - } - ] - }, - { - // could be a comma delimited list of params to a function call - begin: /,/, - relevance: 0 - }, - { - match: /\s+/, - relevance: 0 - }, - { - // JSX - variants: [ - { begin: FRAGMENT.begin, end: FRAGMENT.end }, - { match: XML_SELF_CLOSING }, - { - begin: XML_TAG.begin, - // we carefully check the opening tag to see if it truly - // is a tag and not a false positive - "on:begin": XML_TAG.isTrulyOpeningTag, - end: XML_TAG.end - } - ], - subLanguage: "xml", - contains: [ - { - begin: XML_TAG.begin, - end: XML_TAG.end, - skip: true, - contains: ["self"] - } - ] - } - ] - }, - FUNCTION_DEFINITION, - { - // prevent this from getting swallowed up by function - // since they appear "function like" - beginKeywords: "while if switch catch for" - }, - { - // we have to count the parens to make sure we actually have the correct - // bounding ( ). There could be any number of sub-expressions inside - // also surrounded by parens. - begin: "\\b(?!function)" + hljs.UNDERSCORE_IDENT_RE + "\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", - // end parens - returnBegin: true, - label: "func.def", - contains: [ - PARAMS, - hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" }) - ] - }, - // catch ... so it won't trigger the property rule below - { - match: /\.\.\./, - relevance: 0 - }, - PROPERTY_ACCESS, - // hack: prevents detection of keywords in some circumstances - // .keyword() - // $keyword = x - { - match: "\\$" + IDENT_RE$1, - relevance: 0 - }, - { - match: [/\bconstructor(?=\s*\()/], - className: { 1: "title.function" }, - contains: [PARAMS] - }, - FUNCTION_CALL, - UPPER_CASE_CONSTANT, - CLASS_OR_EXTENDS, - GETTER_OR_SETTER, - { - match: /\$[(.]/ - // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` - } - ] - }; -} -function typescript(hljs) { - const tsLanguage = javascript2(hljs); - const IDENT_RE$1 = IDENT_RE3; - const TYPES3 = [ - "any", - "void", - "number", - "boolean", - "string", - "object", - "never", - "symbol", - "bigint", - "unknown" - ]; - const NAMESPACE = { - beginKeywords: "namespace", - end: /\{/, - excludeEnd: true, - contains: [tsLanguage.exports.CLASS_REFERENCE] - }; - const INTERFACE = { - beginKeywords: "interface", - end: /\{/, - excludeEnd: true, - keywords: { - keyword: "interface extends", - built_in: TYPES3 - }, - contains: [tsLanguage.exports.CLASS_REFERENCE] - }; - const USE_STRICT = { - className: "meta", - relevance: 10, - begin: /^\s*['"]use strict['"]/ - }; - const TS_SPECIFIC_KEYWORDS = [ - "type", - "namespace", - "interface", - "public", - "private", - "protected", - "implements", - "declare", - "abstract", - "readonly", - "enum", - "override" - ]; - const KEYWORDS$1 = { - $pattern: IDENT_RE3, - keyword: KEYWORDS2.concat(TS_SPECIFIC_KEYWORDS), - literal: LITERALS2, - built_in: BUILT_INS2.concat(TYPES3), - "variable.language": BUILT_IN_VARIABLES2 - }; - const DECORATOR = { - className: "meta", - begin: "@" + IDENT_RE$1 - }; - const swapMode = (mode, label, replacement) => { - const indx = mode.contains.findIndex((m) => m.label === label); - if (indx === -1) { - throw new Error("can not find mode to replace"); - } - mode.contains.splice(indx, 1, replacement); - }; - Object.assign(tsLanguage.keywords, KEYWORDS$1); - tsLanguage.exports.PARAMS_CONTAINS.push(DECORATOR); - tsLanguage.contains = tsLanguage.contains.concat([ - DECORATOR, - NAMESPACE, - INTERFACE - ]); - swapMode(tsLanguage, "shebang", hljs.SHEBANG()); - swapMode(tsLanguage, "use_strict", USE_STRICT); - const functionDeclaration = tsLanguage.contains.find((m) => m.label === "func.def"); - functionDeclaration.relevance = 0; - Object.assign(tsLanguage, { - name: "TypeScript", - aliases: [ - "ts", - "tsx", - "mts", - "cts" - ] - }); - return tsLanguage; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/vbnet.js -function vbnet(hljs) { - const regex = hljs.regex; - const CHARACTER = { - className: "string", - begin: /"(""|[^/n])"C\b/ - }; - const STRING = { - className: "string", - begin: /"/, - end: /"/, - illegal: /\n/, - contains: [ - { - // double quote escape - begin: /""/ - } - ] - }; - const MM_DD_YYYY = /\d{1,2}\/\d{1,2}\/\d{4}/; - const YYYY_MM_DD = /\d{4}-\d{1,2}-\d{1,2}/; - const TIME_12H = /(\d|1[012])(:\d+){0,2} *(AM|PM)/; - const TIME_24H = /\d{1,2}(:\d{1,2}){1,2}/; - const DATE = { - className: "literal", - variants: [ - { - // #YYYY-MM-DD# (ISO-Date) or #M/D/YYYY# (US-Date) - begin: regex.concat(/# */, regex.either(YYYY_MM_DD, MM_DD_YYYY), / *#/) - }, - { - // #H:mm[:ss]# (24h Time) - begin: regex.concat(/# */, TIME_24H, / *#/) - }, - { - // #h[:mm[:ss]] A# (12h Time) - begin: regex.concat(/# */, TIME_12H, / *#/) - }, - { - // date plus time - begin: regex.concat( - /# */, - regex.either(YYYY_MM_DD, MM_DD_YYYY), - / +/, - regex.either(TIME_12H, TIME_24H), - / *#/ - ) - } - ] - }; - const NUMBER = { - className: "number", - relevance: 0, - variants: [ - { - // Float - begin: /\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ - }, - { - // Integer (base 10) - begin: /\b\d[\d_]*((U?[SIL])|[%&])?/ - }, - { - // Integer (base 16) - begin: /&H[\dA-F_]+((U?[SIL])|[%&])?/ - }, - { - // Integer (base 8) - begin: /&O[0-7_]+((U?[SIL])|[%&])?/ - }, - { - // Integer (base 2) - begin: /&B[01_]+((U?[SIL])|[%&])?/ - } - ] - }; - const LABEL = { - className: "label", - begin: /^\w+:/ - }; - const DOC_COMMENT = hljs.COMMENT(/'''/, /$/, { contains: [ - { - className: "doctag", - begin: /<\/?/, - end: />/ - } - ] }); - const COMMENT2 = hljs.COMMENT(null, /$/, { variants: [ - { begin: /'/ }, - { - // TODO: Use multi-class for leading spaces - begin: /([\t ]|^)REM(?=\s)/ - } - ] }); - const DIRECTIVES = { - className: "meta", - // TODO: Use multi-class for indentation once available - begin: /[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, - end: /$/, - keywords: { keyword: "const disable else elseif enable end externalsource if region then" }, - contains: [COMMENT2] - }; - return { - name: "Visual Basic .NET", - aliases: ["vb"], - case_insensitive: true, - classNameAliases: { label: "symbol" }, - keywords: { - keyword: "addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", - built_in: ( - // Operators https://docs.microsoft.com/dotnet/visual-basic/language-reference/operators - "addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort" - ), - type: ( - // Data types https://docs.microsoft.com/dotnet/visual-basic/language-reference/data-types - "boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort" - ), - literal: "true false nothing" - }, - illegal: "//|\\{|\\}|endif|gosub|variant|wend|^\\$ ", - contains: [ - CHARACTER, - STRING, - DATE, - NUMBER, - LABEL, - DOC_COMMENT, - COMMENT2, - DIRECTIVES - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/wasm.js -function wasm(hljs) { - hljs.regex; - const BLOCK_COMMENT = hljs.COMMENT(/\(;/, /;\)/); - BLOCK_COMMENT.contains.push("self"); - const LINE_COMMENT = hljs.COMMENT(/;;/, /$/); - const KWS = [ - "anyfunc", - "block", - "br", - "br_if", - "br_table", - "call", - "call_indirect", - "data", - "drop", - "elem", - "else", - "end", - "export", - "func", - "global.get", - "global.set", - "local.get", - "local.set", - "local.tee", - "get_global", - "get_local", - "global", - "if", - "import", - "local", - "loop", - "memory", - "memory.grow", - "memory.size", - "module", - "mut", - "nop", - "offset", - "param", - "result", - "return", - "select", - "set_global", - "set_local", - "start", - "table", - "tee_local", - "then", - "type", - "unreachable" - ]; - const FUNCTION_REFERENCE = { - begin: [ - /(?:func|call|call_indirect)/, - /\s+/, - /\$[^\s)]+/ - ], - className: { - 1: "keyword", - 3: "title.function" - } - }; - const ARGUMENT = { - className: "variable", - begin: /\$[\w_]+/ - }; - const PARENS = { - match: /(\((?!;)|\))+/, - className: "punctuation", - relevance: 0 - }; - const NUMBER = { - className: "number", - relevance: 0, - // borrowed from Prism, TODO: split out into variants - match: /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ - }; - const TYPE = { - // look-ahead prevents us from gobbling up opcodes - match: /(i32|i64|f32|f64)(?!\.)/, - className: "type" - }; - const MATH_OPERATIONS = { - className: "keyword", - // borrowed from Prism, TODO: split out into variants - match: /\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ - }; - const OFFSET_ALIGN = { - match: [ - /(?:offset|align)/, - /\s*/, - /=/ - ], - className: { - 1: "keyword", - 3: "operator" - } - }; - return { - name: "WebAssembly", - keywords: { - $pattern: /[\w.]+/, - keyword: KWS - }, - contains: [ - LINE_COMMENT, - BLOCK_COMMENT, - OFFSET_ALIGN, - ARGUMENT, - PARENS, - FUNCTION_REFERENCE, - hljs.QUOTE_STRING_MODE, - TYPE, - MATH_OPERATIONS, - NUMBER - ] - }; -} - -// node_modules/lowlight/node_modules/highlight.js/es/languages/xml.js -function xml(hljs) { - const regex = hljs.regex; - const TAG_NAME_RE = regex.concat(/[\p{L}_]/u, regex.optional(/[\p{L}0-9_.-]*:/u), /[\p{L}0-9_.-]*/u); - const XML_IDENT_RE = /[\p{L}0-9._:-]+/u; - const XML_ENTITIES = { - className: "symbol", - begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/ - }; - const XML_META_KEYWORDS = { - begin: /\s/, - contains: [ - { - className: "keyword", - begin: /#?[a-z_][a-z1-9_-]+/, - illegal: /\n/ - } - ] - }; - const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, { - begin: /\(/, - end: /\)/ - }); - const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: "string" }); - const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: "string" }); - const TAG_INTERNALS = { - endsWithParent: true, - illegal: /`]+/ } - ] - } - ] - } - ] - }; - return { - name: "HTML, XML", - aliases: [ - "html", - "xhtml", - "rss", - "atom", - "xjb", - "xsd", - "xsl", - "plist", - "wsf", - "svg" - ], - case_insensitive: true, - unicodeRegex: true, - contains: [ - { - className: "meta", - begin: //, - relevance: 10, - contains: [ - XML_META_KEYWORDS, - QUOTE_META_STRING_MODE, - APOS_META_STRING_MODE, - XML_META_PAR_KEYWORDS, - { - begin: /\[/, - end: /\]/, - contains: [ - { - className: "meta", - begin: //, - contains: [ - XML_META_KEYWORDS, - XML_META_PAR_KEYWORDS, - QUOTE_META_STRING_MODE, - APOS_META_STRING_MODE - ] - } - ] - } - ] - }, - hljs.COMMENT( - //, - { relevance: 10 } - ), - { - begin: //, - relevance: 10 - }, - XML_ENTITIES, - // xml processing instructions - { - className: "meta", - end: /\?>/, - variants: [ - { - begin: /<\?xml/, - relevance: 10, - contains: [ - QUOTE_META_STRING_MODE - ] - }, - { - begin: /<\?[a-z][a-z0-9]+/ - } - ] - }, - { - className: "tag", - /* - The lookahead pattern (?=...) ensures that 'begin' only matches - ')/, - end: />/, - keywords: { name: "style" }, - contains: [TAG_INTERNALS], - starts: { - end: /<\/style>/, - returnEnd: true, - subLanguage: [ - "css", - "xml" - ] - } - }, - { - className: "tag", - // See the comment in the `); - const root = this.attachShadow({ mode: "open" }); - root.appendChild(template.content.cloneNode(true)); - root.addEventListener("move", this); - this[$parts] = this[$sliders].map((slider) => new slider(root)); - } - connectedCallback() { - if (this.hasOwnProperty("color")) { - const value = this.color; - delete this["color"]; - this.color = value; - } else if (!this.color) { - this.color = this.colorModel.defaultColor; - } - } - attributeChangedCallback(_attr, _oldVal, newVal) { - const color = this.colorModel.fromAttr(newVal); - if (!this[$isSame](color)) { - this.color = color; - } - } - handleEvent(event) { - const oldHsva = this[$hsva]; - const newHsva = { ...oldHsva, ...event.detail }; - this[$update](newHsva); - let newColor; - if (!equalColorObjects(newHsva, oldHsva) && !this[$isSame](newColor = this.colorModel.fromHsva(newHsva))) { - this[$color] = newColor; - fire(this, "color-changed", { value: newColor }); - } - } - [$isSame](color) { - return this.color && this.colorModel.equal(color, this.color); - } - [$update](hsva) { - this[$hsva] = hsva; - this[$parts].forEach((part) => part.update(hsva)); - } -}; - -// node_modules/vanilla-colorful/lib/entrypoints/hex.js -var colorModel = { - defaultColor: "#000", - toHsva: hexToHsva, - fromHsva: ({ h, s, v }) => hsvaToHex({ h, s, v, a: 1 }), - equal: equalHex, - fromAttr: (color) => color -}; -var HexBase = class extends ColorPicker { - get colorModel() { - return colorModel; - } -}; - -// resources/js/plugin.js -var import_lodash = __toESM(require_lodash(), 1); -customElements.define("tiptap-hex-color-picker", HexBase); -var coreExtensions = { - blockquote: [Blockquote], - bold: [Bold], - "bullet-list": [BulletList], - "checked-list": [CheckedList], - code: [Code], - "code-block": [CustomCodeBlockLowlight.configure({ - lowlight, - HTMLAttributes: { - class: "hljs" - } - })], - color: [Color], - details: [Details, DetailsSummary, DetailsContent], - grid: [Grid, GridColumn], - "grid-builder": [GridBuilder, GridBuilderColumn], - heading: [Heading.configure({ levels: [1, 2, 3, 4, 5, 6] })], - highlight: [Highlight], - hr: [HorizontalRule], - hurdle: [Hurdle], - italic: [Italic], - lead: [Lead], - link: [CustomLink.configure({ - openOnClick: false, - autolink: false, - HTMLAttributes: { - rel: null, - hreflang: null, - class: null - } - })], - media: [CustomImage.configure({ inline: true })], - oembed: [Youtube, Vimeo, Video], - "ordered-list": [OrderedList], - small: [Small], - strike: [Strike], - subscript: [Subscript], - superscript: [Superscript], - table: [Table.configure({ resizable: true }), TableHeader, TableCell, TableRow], - underline: [Underline] -}; -var customExtensions = window.TiptapEditorExtensions || {}; -var editorExtensions = { ...coreExtensions, ...customExtensions }; -var localeSwitcher = document.getElementById("activeLocale"); -if (localeSwitcher) { - localeSwitcher.addEventListener("change", () => { - const localeChange = new CustomEvent("localeChange", { bubbles: true, detail: { locale: localeSwitcher.value } }); - localeSwitcher.dispatchEvent(localeChange); - }); -} -function tiptap({ - state, - statePath, - tools = [], - disabled = false, - locale = "en", - floatingMenuTools = [], - placeholder = null, - mergeTags = [] -}) { - let editors = window.filamentTiptapEditors || {}; - return { - id: null, - modalId: null, - tools, - state, - statePath, - fullScreenMode: false, - updatedAt: Date.now(), - disabled, - locale, - floatingMenuTools, - getExtensions(id) { - const tools2 = this.tools.map((tool) => { - if (typeof tool === "string") { - return tool; - } - return tool.id; - }); - let exts = [ - Document, - Text, - Paragraph, - Dropcursor, - Gapcursor, - HardBreak, - History, - TextStyle2, - TiptapBlock, - DragAndDropExtension, - ClassExtension, - IdExtension, - StyleExtension - ]; - if (placeholder && !disabled) { - exts.push(Placeholder.configure({ placeholder })); - } - if (tools2.length) { - const keys2 = Object.keys(editorExtensions); - let alignments = []; - let types = ["paragraph"]; - exts.push(BubbleMenu.configure({ - pluginKey: `defaultBubbleMenu${id}`, - element: this.$refs.defaultBubbleMenu, - tippyOptions: { - duration: [500, 0] - }, - shouldShow: ({ state: state2, from: from2, to }) => { - return !(from2 === to || isActive(state2, "link") || isActive(state2, "table") || isActive(state2, "image") || isActive(state2, "oembed") || isActive(state2, "vimeo") || isActive(state2, "youtube") || isActive(state2, "video") || isActive(state2, "tiptapBlock")); - } - })); - if (this.floatingMenuTools.length) { - exts.push(FloatingMenu.configure({ - pluginKey: `defaultFloatingMenu${id}`, - element: this.$refs.defaultFloatingMenu, - tippyOptions: { - duration: [500, 0] - } - })); - this.floatingMenuTools.forEach((tool) => { - if (!tools2.includes(tool)) { - tools2.push(tool); - } - }); - } - tools2.forEach((tool) => { - if (keys2.includes(tool)) { - editorExtensions[tool].forEach((e) => { - if (["ordered-list", "bullet-list", "checked-list"].includes(tool)) { - exts.push(e); - if (!exts.includes(ListItem2)) - exts.push(ListItem2); - } else { - if (tool === "table") { - exts.push(BubbleMenu.configure({ - pluginKey: `tableBubbleMenu${id}`, - element: this.$refs.tableBubbleMenu, - tippyOptions: { - duration: [500, 0] - }, - shouldShow: ({ state: state2 }) => { - return isActive(state2, "table"); - } - })); - } - if (tool === "link") { - exts.push(BubbleMenu.configure({ - pluginKey: `linkBubbleMenu${id}`, - element: this.$refs.linkBubbleMenu, - tippyOptions: { - duration: [500, 0] - }, - shouldShow: ({ state: state2 }) => { - return isActive(state2, "link"); - } - })); - } - exts.push(e); - } - }); - } else { - if (["align-left", "align-right", "align-center", "align-justify"].includes(tool)) { - if (tool === "align-left") - alignments.push("start"); - if (tool === "align-center") - alignments.push("center"); - if (tool === "align-right") - alignments.push("end"); - if (tool === "align-justify") - alignments.push("justify"); - if (tools2.includes("heading")) - types.push("heading"); - let hasTextAlign = exts.find((item) => item.name === "textAlign"); - if (typeof hasTextAlign === "undefined") - exts.push(CustomTextAlign.configure({ types, alignments })); - } - } - }); - } - if (mergeTags?.length) { - exts.push(MergeTag.configure({ - mergeTags - })); - } - return exts; - }, - init: async function() { - this.initEditor(this.state); - this.modalId = this.$el.closest('[x-ref="modalContainer"]')?.getAttribute("wire:key"); - window.filamentTiptapEditors = editors; - document.addEventListener("dblclick", function(e) { - if (e.target && (e.target.hasAttribute("data-youtube-video") || e.target.hasAttribute("data-vimeo-video")) || e.target.hasAttribute("data-native-video")) { - e.target.firstChild.style.pointerEvents = "all"; - } - }); - window.addEventListener("localeChange", (event) => { - this.locale = event.detail.locale; - }); - let sortableEl = this.$el.parentElement.closest("[x-sortable]"); - if (sortableEl) { - window.Sortable.utils.on(sortableEl, "start", () => { - let editors2 = document.querySelectorAll(".tiptap-wrapper"); - if (editors2.length === 0) - return; - editors2.forEach(function(editor) { - editor._x_dataStack[0].editor().setEditable(false); - editor._x_dataStack[0].editor().options.element.style.pointerEvents = "none"; - }); - }); - window.Sortable.utils.on(sortableEl, "end", () => { - let editors2 = document.querySelectorAll(".tiptap-wrapper"); - if (editors2.length === 0) - return; - editors2.forEach(function(editor) { - editor._x_dataStack[0].editor().setEditable(true); - editor._x_dataStack[0].editor().options.element.style.pointerEvents = "all"; - }); - }); - } - this.$watch("state", (newState, oldState) => { - if (this.editor().isEmpty) { - this.editor().destroy(); - this.initEditor(newState); - } - if (!(0, import_lodash.isEqual)(oldState, this.editor().state.doc.toJSON())) { - this.updateEditorContent(newState); - } - }); - }, - destroy() { - this.editor().destroy(); - }, - editor() { - return editors[this.statePath]; - }, - initEditor(content) { - if (editors[this.statePath]) { - content = this.editor().getJSON(); - editors[this.statePath].destroy(); - delete editors[this.statePath]; - } - let _this = this; - editors[this.statePath] = new Editor({ - element: this.$refs.element, - extensions: this.getExtensions(this.statePath), - editable: !this.disabled, - content, - editorProps: { - handlePaste(view, event, slice2) { - slice2.content.descendants((node) => { - if (node.type.name === "tiptapBlock") { - node.attrs.statePath = _this.statePath; - node.attrs.data = JSON.parse(node.attrs.data); - } - }); - } - }, - onUpdate({ editor }) { - _this.updatedAt = Date.now(); - _this.state = editor.isEmpty ? null : editor.getJSON(); - }, - onSelectionUpdate() { - _this.updatedAt = Date.now(); - }, - onBlur() { - _this.updatedAt = Date.now(); - }, - onFocus() { - _this.updatedAt = Date.now(); - } - }); - }, - updateEditorContent(content) { - if (this.editor().isEditable) { - const { from: from2, to } = this.editor().state.selection; - this.editor().commands.setContent(content, true); - this.editor().chain().focus().setTextSelection({ from: from2, to }).run(); - } - }, - refreshEditorContent() { - this.$nextTick(() => this.updateEditorContent(this.state)); - }, - insertContent(event) { - if (event.detail.statePath !== this.statePath) - return; - switch (event.detail.type) { - case "media": - this.insertMedia(event); - return; - case "video": - this.insertVideo(event); - return; - case "link": - this.insertLink(event); - return; - case "source": - this.insertSource(event); - return; - case "grid": - this.insertGridBuilder(event); - return; - default: - return; - } - }, - insertMedia(event) { - if (Array.isArray(event.detail.media)) { - event.detail.media.forEach((item) => { - this.executeMediaInsert(item); - }); - } else { - this.executeMediaInsert(event.detail.media); - } - }, - executeMediaInsert(media = null) { - if (!media || media?.url === null) { - return; - } - if (media) { - const src = media?.url || media?.src; - const imageTypes = ["jpg", "jpeg", "svg", "png", "webp"]; - const regex = /.*\.([a-zA-Z]*)\??/; - const match = regex.exec(src); - if (match !== null && imageTypes.includes(match[1])) { - this.editor().chain().focus().setImage({ - src, - alt: media?.alt, - title: media?.title, - width: media?.width, - height: media?.height, - lazy: media?.lazy - }).run(); - } else { - this.editor().chain().focus().extendMarkRange("link").setLink({ href: src }).insertContent(media?.link_text).run(); - } - } - }, - insertVideo(event) { - let video = event.detail.video; - if (!video || video.url === null) { - return; - } - let commonOptions = { - src: video.url, - width: video.responsive ? video.width * 100 : video.width, - height: video.responsive ? video.height * 100 : video.height, - responsive: video.responsive ?? true, - "data-aspect-width": video.width, - "data-aspect-height": video.height - }; - if (video.url.includes("youtube") || video.url.includes("youtu.be")) { - this.editor().chain().focus().setYoutubeVideo({ - ...commonOptions, - controls: video.youtube_options.includes("controls"), - nocookie: video.youtube_options.includes("nocookie"), - start: video.start_at ?? 0 - }).run(); - } else if (video.url.includes("vimeo")) { - this.editor().chain().focus().setVimeoVideo({ - ...commonOptions, - autoplay: video.vimeo_options.includes("autoplay"), - loop: video.vimeo_options.includes("loop"), - title: video.vimeo_options.includes("show_title"), - byline: video.vimeo_options.includes("byline"), - portrait: video.vimeo_options.includes("portrait") - }).run(); - } else { - this.editor().chain().focus().setVideo({ - ...commonOptions, - autoplay: video.native_options.includes("autoplay"), - loop: video.native_options.includes("loop"), - controls: video.native_options.includes("controls") - }).run(); - } - }, - insertLink(event) { - let link = event.detail; - if (link.href === null && link.id === null) { - return; - } - if (link.href === "" && link.id === null) { - this.unsetLink(); - return; - } - this.editor().chain().focus().extendMarkRange("link").setLink({ - href: link.href, - id: link.id ?? null, - target: link.target ?? null, - hreflang: link.hreflang ?? null, - rel: link.rel ?? null, - referrerpolicy: link.referrerpolicy ?? null, - as_button: link.as_button ?? null, - button_theme: link.button_theme ?? null - }).selectTextblockEnd().run(); - }, - unsetLink() { - this.editor().chain().focus().extendMarkRange("link").unsetLink().selectTextblockEnd().run(); - }, - insertSource(event) { - this.updateEditorContent(event.detail.source); - }, - insertGridBuilder(event) { - let grid = event.detail.data; - let type = "responsive"; - const asymmetricLeft = parseInt(grid.asymmetric_left) ?? null; - const asymmetricRight = parseInt(grid.asymmetric_right) ?? null; - if (grid.fixed) { - type = "fixed"; - } - if (grid.asymmetric) { - type = "asymmetric"; - } - this.editor().chain().focus().insertGridBuilder({ - cols: grid.columns, - type, - stackAt: grid.stack_at, - asymmetricLeft, - asymmetricRight - }).run(); - }, - insertBlock(event) { - if (event.detail.statePath !== this.statePath) - return; - this.editor().commands.insertBlock({ - type: event.detail.type, - statePath: event.detail.statePath, - data: event.detail.data, - preview: event.detail.preview, - label: event.detail.label, - coordinates: event.detail.coordinates - }); - if (!this.editor().isFocused) { - this.editor().commands.focus(); - } - }, - insertMergeTag(event) { - this.editor().commands.insertMergeTag({ - tag: event.detail.tag, - coordinates: event.detail.coordinates - }); - if (!this.editor().isFocused) { - this.editor().commands.focus(); - } - }, - openBlockSettings(event) { - if (event.detail.statePath !== this.statePath) - return; - this.$wire.dispatchFormEvent("tiptap::updateBlock", this.statePath, event.detail); - }, - updateBlock(event) { - if (event.detail.statePath !== this.statePath) - return; - this.editor().commands.updateBlock({ - type: event.detail.type, - statePath: event.detail.statePath, - data: event.detail.data, - preview: event.detail.preview, - label: event.detail.label - }); - if (!this.editor().isFocused) { - this.editor().commands.focus(); - } - }, - deleteBlock() { - this.editor().commands.removeBlock(); - } - }; -} -export { - tiptap as default -}; + `;t=document.createElement("div"),t.innerHTML=r,t.addEventListener("merge-tags-select",i=>{n.command({id:i.detail.item})}),e=as("body",{getReferenceClientRect:n.clientRect,appendTo:()=>document.body,content:t,allowHTML:!0,showOnCreate:!0,interactive:!0,trigger:"manual",placement:"bottom-start"})},onUpdate(n){if(!n.items.length){e[0].hide();return}e[0].show(),t.dispatchEvent(new CustomEvent("merge-tags-update-items",{detail:n.items}))},onKeyDown(n){t.dispatchEvent(new CustomEvent("merge-tags-key-down",{detail:n.event}))},onExit(){e[0].destroy()}}}})]}});var gm=Je.create({name:"classExtension",addGlobalAttributes(){return[{types:["heading","paragraph","link","image","listItem","bulletList","orderedList","table","tableHeader","tableRow","tableCell","textStyle"],attributes:{class:{default:null,parseHTML:t=>t.getAttribute("class")??null,renderHTML:t=>t.class?{class:t.class}:null}}}]}});var bm=Je.create({name:"idExtension",addGlobalAttributes(){return[{types:["heading","link"],attributes:{id:{default:null,parseHTML:t=>t.getAttribute("id")??null,renderHTML:t=>t.id?{id:t.id}:null}}}]}});var ym=Je.create({name:"styleExtension",addGlobalAttributes(){return[{types:["heading","paragraph","link","image","listItem","bulletList","orderedList","table","tableHeader","tableRow","tableCell","textStyle"],attributes:{style:{default:null,parseHTML:t=>t.getAttribute("style")??null,renderHTML:t=>t.style?{style:t.style}:null}}}]}});function j2(t){let e=t.regex,n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",s="(?!struct)("+r+"|"+e.optional(i)+"[a-zA-Z_]\\w*"+e.optional("<[^<>]+>")+")",l={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},d={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},t.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},f={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},t.inherit(d,{className:"string"}),{className:"string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},m={className:"title",begin:e.optional(i)+t.IDENT_RE,relevance:0},b=e.optional(i)+t.IDENT_RE+"\\s*\\(",y=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],v=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],x=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],S=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],T={type:v,keyword:y,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:x},z={className:"function.dispatch",relevance:0,keywords:{_hint:S},begin:e.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,t.IDENT_RE,e.lookahead(/(<[^<>]+>|)\s*\(/))},O=[z,h,l,n,t.C_BLOCK_COMMENT_MODE,f,d],Y={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:T,contains:O.concat([{begin:/\(/,end:/\)/,keywords:T,contains:O.concat(["self"]),relevance:0}]),relevance:0},ie={className:"function",begin:"("+s+"[\\*&\\s]+)+"+b,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:T,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:T,relevance:0},{begin:b,returnBegin:!0,contains:[m],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[d,f]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:T,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,d,f,l,{begin:/\(/,end:/\)/,keywords:T,relevance:0,contains:["self",n,t.C_BLOCK_COMMENT_MODE,d,f,l]}]},l,n,t.C_BLOCK_COMMENT_MODE,h]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:T,illegal:"",keywords:T,contains:["self",l]},{begin:t.IDENT_RE+"::",keywords:T},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function Ax(t){let e={type:["boolean","byte","word","String"],built_in:["KeyboardController","MouseController","SoftwareSerial","EthernetServer","EthernetClient","LiquidCrystal","RobotControl","GSMVoiceCall","EthernetUDP","EsploraTFT","HttpClient","RobotMotor","WiFiClient","GSMScanner","FileSystem","Scheduler","GSMServer","YunClient","YunServer","IPAddress","GSMClient","GSMModem","Keyboard","Ethernet","Console","GSMBand","Esplora","Stepper","Process","WiFiUDP","GSM_SMS","Mailbox","USBHost","Firmata","PImage","Client","Server","GSMPIN","FileIO","Bridge","Serial","EEPROM","Stream","Mouse","Audio","Servo","File","Task","GPRS","WiFi","Wire","TFT","GSM","SPI","SD"],_hints:["setup","loop","runShellCommandAsynchronously","analogWriteResolution","retrieveCallingNumber","printFirmwareVersion","analogReadResolution","sendDigitalPortPair","noListenOnLocalhost","readJoystickButton","setFirmwareVersion","readJoystickSwitch","scrollDisplayRight","getVoiceCallStatus","scrollDisplayLeft","writeMicroseconds","delayMicroseconds","beginTransmission","getSignalStrength","runAsynchronously","getAsynchronously","listenOnLocalhost","getCurrentCarrier","readAccelerometer","messageAvailable","sendDigitalPorts","lineFollowConfig","countryNameWrite","runShellCommand","readStringUntil","rewindDirectory","readTemperature","setClockDivider","readLightSensor","endTransmission","analogReference","detachInterrupt","countryNameRead","attachInterrupt","encryptionType","readBytesUntil","robotNameWrite","readMicrophone","robotNameRead","cityNameWrite","userNameWrite","readJoystickY","readJoystickX","mouseReleased","openNextFile","scanNetworks","noInterrupts","digitalWrite","beginSpeaker","mousePressed","isActionDone","mouseDragged","displayLogos","noAutoscroll","addParameter","remoteNumber","getModifiers","keyboardRead","userNameRead","waitContinue","processInput","parseCommand","printVersion","readNetworks","writeMessage","blinkVersion","cityNameRead","readMessage","setDataMode","parsePacket","isListening","setBitOrder","beginPacket","isDirectory","motorsWrite","drawCompass","digitalRead","clearScreen","serialEvent","rightToLeft","setTextSize","leftToRight","requestFrom","keyReleased","compassRead","analogWrite","interrupts","WiFiServer","disconnect","playMelody","parseFloat","autoscroll","getPINUsed","setPINUsed","setTimeout","sendAnalog","readSlider","analogRead","beginWrite","createChar","motorsStop","keyPressed","tempoWrite","readButton","subnetMask","debugPrint","macAddress","writeGreen","randomSeed","attachGPRS","readString","sendString","remotePort","releaseAll","mouseMoved","background","getXChange","getYChange","answerCall","getResult","voiceCall","endPacket","constrain","getSocket","writeJSON","getButton","available","connected","findUntil","readBytes","exitValue","readGreen","writeBlue","startLoop","IPAddress","isPressed","sendSysex","pauseMode","gatewayIP","setCursor","getOemKey","tuneWrite","noDisplay","loadImage","switchPIN","onRequest","onReceive","changePIN","playFile","noBuffer","parseInt","overflow","checkPIN","knobRead","beginTFT","bitClear","updateIR","bitWrite","position","writeRGB","highByte","writeRed","setSpeed","readBlue","noStroke","remoteIP","transfer","shutdown","hangCall","beginSMS","endWrite","attached","maintain","noCursor","checkReg","checkPUK","shiftOut","isValid","shiftIn","pulseIn","connect","println","localIP","pinMode","getIMEI","display","noBlink","process","getBand","running","beginSD","drawBMP","lowByte","setBand","release","bitRead","prepare","pointTo","readRed","setMode","noFill","remove","listen","stroke","detach","attach","noTone","exists","buffer","height","bitSet","circle","config","cursor","random","IRread","setDNS","endSMS","getKey","micros","millis","begin","print","write","ready","flush","width","isPIN","blink","clear","press","mkdir","rmdir","close","point","yield","image","BSSID","click","delay","read","text","move","peek","beep","rect","line","open","seek","fill","size","turn","stop","home","find","step","tone","sqrt","RSSI","SSID","end","bit","tan","cos","sin","pow","map","abs","max","min","get","run","put"],literal:["DIGITAL_MESSAGE","FIRMATA_STRING","ANALOG_MESSAGE","REPORT_DIGITAL","REPORT_ANALOG","INPUT_PULLUP","SET_PIN_MODE","INTERNAL2V56","SYSTEM_RESET","LED_BUILTIN","INTERNAL1V1","SYSEX_START","INTERNAL","EXTERNAL","DEFAULT","OUTPUT","INPUT","HIGH","LOW"]},n=j2(t),r=n.keywords;return r.type=[...r.type,...e.type],r.literal=[...r.literal,...e.literal],r.built_in=[...r.built_in,...e.built_in],r._hints=e._hints,n.name="Arduino",n.aliases=["ino"],n.supersetOf="cpp",n}function Nx(t){let e=t.regex,n={},r={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{begin:e.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},r]});let i={className:"subst",begin:/\$\(/,end:/\)/,contains:[t.BACKSLASH_ESCAPE]},o={begin:/<<-?\s*(?=\w+)/,starts:{contains:[t.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,n,i]};i.contains.push(s);let l={className:"",begin:/\\"/},u={className:"string",begin:/'/,end:/'/},d={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},t.NUMBER_MODE,n]},f=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],h=t.SHEBANG({binary:`(${f.join("|")})`,relevance:10}),m={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[t.inherit(t.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},b=["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"],y=["true","false"],v={match:/(\/[a-z._-]+)+/},x=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],S=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias"],D=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],L=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:b,literal:y,built_in:[...x,...S,"set","shopt",...D,...L]},contains:[h,t.SHEBANG(),m,d,t.HASH_COMMENT_MODE,o,v,s,l,u,n]}}function Ox(t){let e=t.regex,n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",s="("+r+"|"+e.optional(i)+"[a-zA-Z_]\\w*"+e.optional("<[^<>]+>")+")",l={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/}]},d={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},t.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},f={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},t.inherit(d,{className:"string"}),{className:"string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},m={className:"title",begin:e.optional(i)+t.IDENT_RE,relevance:0},b=e.optional(i)+t.IDENT_RE+"\\s*\\(",x={keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"],literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},S=[h,l,n,t.C_BLOCK_COMMENT_MODE,f,d],D={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:x,contains:S.concat([{begin:/\(/,end:/\)/,keywords:x,contains:S.concat(["self"]),relevance:0}]),relevance:0},L={begin:"("+s+"[\\*&\\s]+)+"+b,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:x,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:x,relevance:0},{begin:b,returnBegin:!0,contains:[t.inherit(m,{className:"title.function"})],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:x,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,d,f,l,{begin:/\(/,end:/\)/,keywords:x,relevance:0,contains:["self",n,t.C_BLOCK_COMMENT_MODE,d,f,l]}]},l,n,t.C_BLOCK_COMMENT_MODE,h]};return{name:"C",aliases:["h"],keywords:x,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},t.TITLE_MODE]}]),exports:{preprocessor:h,strings:d,keywords:x}}}function Rx(t){let e=t.regex,n=t.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",s="(?!struct)("+r+"|"+e.optional(i)+"[a-zA-Z_]\\w*"+e.optional("<[^<>]+>")+")",l={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},d={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[t.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},t.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},f={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},t.inherit(d,{className:"string"}),{className:"string",begin:/<.*?>/},n,t.C_BLOCK_COMMENT_MODE]},m={className:"title",begin:e.optional(i)+t.IDENT_RE,relevance:0},b=e.optional(i)+t.IDENT_RE+"\\s*\\(",y=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],v=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],x=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],S=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],T={type:v,keyword:y,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:x},z={className:"function.dispatch",relevance:0,keywords:{_hint:S},begin:e.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,t.IDENT_RE,e.lookahead(/(<[^<>]+>|)\s*\(/))},O=[z,h,l,n,t.C_BLOCK_COMMENT_MODE,f,d],Y={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:T,contains:O.concat([{begin:/\(/,end:/\)/,keywords:T,contains:O.concat(["self"]),relevance:0}]),relevance:0},ie={className:"function",begin:"("+s+"[\\*&\\s]+)+"+b,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:T,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:T,relevance:0},{begin:b,returnBegin:!0,contains:[m],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[d,f]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:T,relevance:0,contains:[n,t.C_BLOCK_COMMENT_MODE,d,f,l,{begin:/\(/,end:/\)/,keywords:T,relevance:0,contains:["self",n,t.C_BLOCK_COMMENT_MODE,d,f,l]}]},l,n,t.C_BLOCK_COMMENT_MODE,h]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:T,illegal:"",keywords:T,contains:["self",l]},{begin:t.IDENT_RE+"::",keywords:T},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function Ix(t){let e=["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],n=["public","private","protected","static","internal","protected","abstract","async","extern","override","unsafe","virtual","new","sealed","partial"],r=["default","false","null","true"],i=["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"],o=["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"],s={keyword:i.concat(o),built_in:e,literal:r},l=t.inherit(t.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),u={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},d={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},f=t.inherit(d,{illegal:/\n/}),h={className:"subst",begin:/\{/,end:/\}/,keywords:s},m=t.inherit(h,{illegal:/\n/}),b={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},t.BACKSLASH_ESCAPE,m]},y={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},h]},v=t.inherit(y,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},m]});h.contains=[y,b,d,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,u,t.C_BLOCK_COMMENT_MODE],m.contains=[v,b,f,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,u,t.inherit(t.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];let x={variants:[y,b,d,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},S={begin:"<",end:">",contains:[{beginKeywords:"in out"},l]},D=t.IDENT_RE+"(<"+t.IDENT_RE+"(\\s*,\\s*"+t.IDENT_RE+")*>)?(\\[\\])?",L={begin:"@"+t.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:s,illegal:/::/,contains:[t.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:""},{begin:""}]}]}),t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},x,u,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},l,S,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[l,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[l,S,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+D+"\\s+)+"+t.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:s,contains:[{beginKeywords:n.join(" "),relevance:0},{begin:t.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[t.TITLE_MODE,S],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s,relevance:0,contains:[x,u,t.C_BLOCK_COMMENT_MODE]},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},L]}}var Q2=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),eF=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],tF=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],nF=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],rF=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],iF=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse();function Lx(t){let e=t.regex,n=Q2(t),r={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},i="and or not only",o=/@-?\w[\w]*(-\w+)*/,s="[a-zA-Z-][a-zA-Z0-9_-]*",l=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[n.BLOCK_COMMENT,r,n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+s,relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+nF.join("|")+")"},{begin:":(:)?("+rF.join("|")+")"}]},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+iF.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,...l,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...l,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:e.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:o},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:i,attribute:tF.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+eF.join("|")+")\\b"}]}}function Dx(t){let e=t.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:e.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:e.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}function Px(t){let o={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]};return{name:"Go",aliases:["golang"],keywords:o,illegal:"zx(t,e,n-1))}function $x(t){let e=t.regex,n="[\xC0-\u02B8a-zA-Z_$][\xC0-\u02B8a-zA-Z_$0-9]*",r=n+zx("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),u={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double"],built_in:["super","this"]},d={className:"meta",begin:"@"+n,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},f={className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0,contains:[t.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:u,illegal:/<\/|#/,contains:[t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[t.BACKSLASH_ESCAPE]},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[e.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword",3:"title.class"},contains:[f,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+r+"\\s+)",t.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:u,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0,contains:[d,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,Hx,t.C_BLOCK_COMMENT_MODE]},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},Hx,d]}}var Ux="[A-Za-z$_][0-9A-Za-z$_]*",oF=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],sF=["true","false","null","undefined","NaN","Infinity"],Wx=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Kx=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Vx=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],aF=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],lF=[].concat(Vx,Wx,Kx);function Gx(t){let e=t.regex,n=(R,{after:V})=>{let Q="",end:""},o=/<[A-Za-z0-9\\._:-]+\s*\/>/,s={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(R,V)=>{let Q=R[0].length+R.index,he=R.input[Q];if(he==="<"||he===","){V.ignoreMatch();return}he===">"&&(n(R,{after:Q})||V.ignoreMatch());let xe,$e=R.input.substring(Q);if(xe=$e.match(/^\s*=/)){V.ignoreMatch();return}if((xe=$e.match(/^\s+extends\s+/))&&xe.index===0){V.ignoreMatch();return}}},l={$pattern:Ux,keyword:oF,literal:sF,built_in:lF,"variable.language":aF},u="[0-9](_?[0-9])*",d=`\\.(${u})`,f="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",h={className:"number",variants:[{begin:`(\\b(${f})((${d})|\\.)?|(${d}))[eE][+-]?(${u})\\b`},{begin:`\\b(${f})\\b((${d})\\b|\\.)?|(${d})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},m={className:"subst",begin:"\\$\\{",end:"\\}",keywords:l,contains:[]},b={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"xml"}},y={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"css"}},v={begin:"gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"graphql"}},x={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,m]},D={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},L=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,{match:/\$\d+/},h];m.contains=L.concat({begin:/\{/,end:/\}/,keywords:l,contains:["self"].concat(L)});let T=[].concat(D,m.contains),z=T.concat([{begin:/\(/,end:/\)/,keywords:l,contains:["self"].concat(T)}]),O={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z},Y={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},ie={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...Wx,...Kx]}},$={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},oe={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},me={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function Te(R){return e.concat("(?!",R.join("|"),")")}let ge={match:e.concat(/\b/,Te([...Vx,"super","import"]),r,e.lookahead(/\(/)),className:"title.function",relevance:0},Me={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},Ee={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},P="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",N={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(P)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:l,exports:{PARAMS_CONTAINS:z,CLASS_REFERENCE:ie},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),$,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,D,{match:/\$\d+/},h,ie,{className:"attr",begin:r+e.lookahead(":"),relevance:0},N,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[D,t.REGEXP_MODE,{className:"function",begin:P,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:o},{begin:s.begin,"on:begin":s.isTrulyOpeningTag,end:s.end}],subLanguage:"xml",contains:[{begin:s.begin,end:s.end,skip:!0,contains:["self"]}]}]},oe,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},Me,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},ge,me,Y,Ee,{match:/\$[(.]/}]}}function qx(t){let e={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},n={match:/[{}[\],:]/,className:"punctuation",relevance:0},r=["true","false","null"],i={scope:"literal",beginKeywords:r.join(" ")};return{name:"JSON",keywords:{literal:r},contains:[e,n,t.QUOTE_STRING_MODE,i,t.C_NUMBER_MODE,t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}var cs="[0-9](_*[0-9])*",gu=`\\.(${cs})`,bu="[0-9a-fA-F](_*[0-9a-fA-F])*",cF={className:"number",variants:[{begin:`(\\b(${cs})((${gu})|\\.)?|(${gu}))[eE][+-]?(${cs})[fFdD]?\\b`},{begin:`\\b(${cs})((${gu})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${gu})[fFdD]?\\b`},{begin:`\\b(${cs})[fFdD]\\b`},{begin:`\\b0[xX]((${bu})\\.?|(${bu})?\\.(${bu}))[pP][+-]?(${cs})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${bu})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};function Yx(t){let e={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},n={className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},r={className:"symbol",begin:t.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:/\$\{/,end:/\}/,contains:[t.C_NUMBER_MODE]},o={className:"variable",begin:"\\$"+t.UNDERSCORE_IDENT_RE},s={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[o,i]},{begin:"'",end:"'",illegal:/\n/,contains:[t.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[t.BACKSLASH_ESCAPE,o,i]}]};i.contains.push(s);let l={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+t.UNDERSCORE_IDENT_RE+")?"},u={className:"meta",begin:"@"+t.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[t.inherit(s,{className:"string"}),"self"]}]},d=cF,f=t.COMMENT("/\\*","\\*/",{contains:[t.C_BLOCK_COMMENT_MODE]}),h={variants:[{className:"type",begin:t.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},m=h;return m.variants[1].contains=[h],h.variants[1].contains=[m],{name:"Kotlin",aliases:["kt","kts"],keywords:e,contains:[t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),t.C_LINE_COMMENT_MODE,f,n,r,l,u,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:e,relevance:5,contains:[{begin:t.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[t.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:e,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[h,t.C_LINE_COMMENT_MODE,f],relevance:0},t.C_LINE_COMMENT_MODE,f,l,u,s,t.C_NUMBER_MODE]},f]},{begin:[/class|interface|trait/,/\s+/,t.UNDERSCORE_IDENT_RE],beginScope:{3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},t.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/,excludeBegin:!0,returnEnd:!0},l,u]},s,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:` +`},d]}}var uF=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),dF=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],fF=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],Jx=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],Xx=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],pF=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),hF=Jx.concat(Xx);function Zx(t){let e=uF(t),n=hF,r="and or not only",i="[\\w-]+",o="("+i+"|@\\{"+i+"\\})",s=[],l=[],u=function(L){return{className:"string",begin:"~?"+L+".*?"+L}},d=function(L,T,z){return{className:L,begin:T,relevance:z}},f={$pattern:/[a-z-]+/,keyword:r,attribute:fF.join(" ")},h={begin:"\\(",end:"\\)",contains:l,keywords:f,relevance:0};l.push(t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,u("'"),u('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},e.HEXCOLOR,h,d("variable","@@?"+i,10),d("variable","@\\{"+i+"\\}"),d("built_in","~?`[^`]*?`"),{className:"attribute",begin:i+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0},e.IMPORTANT,{beginKeywords:"and not"},e.FUNCTION_DISPATCH);let m=l.concat({begin:/\{/,end:/\}/,contains:s}),b={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(l)},y={begin:o+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},e.CSS_VARIABLE,{className:"attribute",begin:"\\b("+pF.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:l}}]},v={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:f,returnEnd:!0,contains:l,relevance:0}},x={className:"variable",variants:[{begin:"@"+i+"\\s*:",relevance:15},{begin:"@"+i}],starts:{end:"[;}]",returnEnd:!0,contains:m}},S={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:o,end:/\{/}],returnBegin:!0,returnEnd:!0,illegal:`[<='$"]`,relevance:0,contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,b,d("keyword","all\\b"),d("variable","@\\{"+i+"\\}"),{begin:"\\b("+dF.join("|")+")\\b",className:"selector-tag"},e.CSS_NUMBER_MODE,d("selector-tag",o,0),d("selector-id","#"+o),d("selector-class","\\."+o,0),d("selector-tag","&",0),e.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+Jx.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+Xx.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:m},{begin:"!important"},e.FUNCTION_DISPATCH]},D={begin:i+`:(:)?(${n.join("|")})`,returnBegin:!0,contains:[S]};return s.push(t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,v,x,D,y,S,b,e.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:`[=>'/<($"]`,contains:s}}function jx(t){let e="\\[=*\\[",n="\\]=*\\]",r={begin:e,end:n,contains:["self"]},i=[t.COMMENT("--(?!"+e+")","$"),t.COMMENT("--"+e,n,{contains:[r],relevance:10})];return{name:"Lua",keywords:{$pattern:t.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[t.inherit(t.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:i}].concat(i)},t.C_NUMBER_MODE,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,{className:"string",begin:e,end:n,contains:[r],relevance:5}])}}function Qx(t){let e={className:"variable",variants:[{begin:"\\$\\("+t.UNDERSCORE_IDENT_RE+"\\)",contains:[t.BACKSLASH_ESCAPE]},{begin:/\$[@%",subLanguage:"xml",relevance:0},r={begin:"^[-\\*]{3,}",end:"$"},i={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},o={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},s={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},l=/[A-Za-z][A-Za-z0-9+.-]*/,u={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,l,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},d={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},f={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},h=t.inherit(d,{contains:[]}),m=t.inherit(f,{contains:[]});d.contains.push(m),f.contains.push(h);let b=[n,u];return[d,f,h,m].forEach(x=>{x.contains=x.contains.concat(b)}),b=b.concat(d,f),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:b},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:b}]}]},n,o,d,f,{className:"quote",begin:"^>\\s+",contains:b,end:"$"},i,r,u,s]}}function t_(t){let e={className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},n=/[a-zA-Z@][a-zA-Z0-9_]*/,l={"variable.language":["this","super"],$pattern:n,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"]},u={$pattern:n,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:l,illegal:"/,end:/$/,illegal:"\\n"},t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+u.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:u,contains:[t.UNDERSCORE_TITLE_MODE]},{begin:"\\."+t.UNDERSCORE_IDENT_RE,relevance:0}]}}function n_(t){let e=t.regex,n=["abs","accept","alarm","and","atan2","bind","binmode","bless","break","caller","chdir","chmod","chomp","chop","chown","chr","chroot","close","closedir","connect","continue","cos","crypt","dbmclose","dbmopen","defined","delete","die","do","dump","each","else","elsif","endgrent","endhostent","endnetent","endprotoent","endpwent","endservent","eof","eval","exec","exists","exit","exp","fcntl","fileno","flock","for","foreach","fork","format","formline","getc","getgrent","getgrgid","getgrnam","gethostbyaddr","gethostbyname","gethostent","getlogin","getnetbyaddr","getnetbyname","getnetent","getpeername","getpgrp","getpriority","getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam","getpwuid","getservbyname","getservbyport","getservent","getsockname","getsockopt","given","glob","gmtime","goto","grep","gt","hex","if","index","int","ioctl","join","keys","kill","last","lc","lcfirst","length","link","listen","local","localtime","log","lstat","lt","ma","map","mkdir","msgctl","msgget","msgrcv","msgsnd","my","ne","next","no","not","oct","open","opendir","or","ord","our","pack","package","pipe","pop","pos","print","printf","prototype","push","q|0","qq","quotemeta","qw","qx","rand","read","readdir","readline","readlink","readpipe","recv","redo","ref","rename","require","reset","return","reverse","rewinddir","rindex","rmdir","say","scalar","seek","seekdir","select","semctl","semget","semop","send","setgrent","sethostent","setnetent","setpgrp","setpriority","setprotoent","setpwent","setservent","setsockopt","shift","shmctl","shmget","shmread","shmwrite","shutdown","sin","sleep","socket","socketpair","sort","splice","split","sprintf","sqrt","srand","stat","state","study","sub","substr","symlink","syscall","sysopen","sysread","sysseek","system","syswrite","tell","telldir","tie","tied","time","times","tr","truncate","uc","ucfirst","umask","undef","unless","unlink","unpack","unshift","untie","until","use","utime","values","vec","wait","waitpid","wantarray","warn","when","while","write","x|0","xor","y|0"],r=/[dualxmsipngr]{0,12}/,i={$pattern:/[\w.]+/,keyword:n.join(" ")},o={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:i},s={begin:/->\{/,end:/\}/},l={variants:[{begin:/\$\d/},{begin:e.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@][^\s\w{]/,relevance:0}]},u=[t.BACKSLASH_ESCAPE,o,l],d=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],f=(b,y,v="\\1")=>{let x=v==="\\1"?v:e.concat(v,y);return e.concat(e.concat("(?:",b,")"),y,/(?:\\.|[^\\\/])*?/,x,/(?:\\.|[^\\\/])*?/,v,r)},h=(b,y,v)=>e.concat(e.concat("(?:",b,")"),y,/(?:\\.|[^\\\/])*?/,v,r),m=[l,t.HASH_COMMENT_MODE,t.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),s,{className:"string",contains:u,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[t.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+t.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[t.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:f("s|tr|y",e.either(...d,{capture:!0}))},{begin:f("s|tr|y","\\(","\\)")},{begin:f("s|tr|y","\\[","\\]")},{begin:f("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:h("(?:m|qr)?",/\//,/\//)},{begin:h("m|qr",e.either(...d,{capture:!0}),/\1/)},{begin:h("m|qr",/\(/,/\)/)},{begin:h("m|qr",/\[/,/\]/)},{begin:h("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[t.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return o.contains=m,s.contains=m,{name:"Perl",aliases:["pl","pm"],keywords:i,contains:m}}function r_(t){let e=t.regex,n=/(?![A-Za-z0-9])(?![$])/,r=e.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,n),i=e.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,n),o={scope:"variable",match:"\\$+"+r},s={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},l={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},u=t.inherit(t.APOS_STRING_MODE,{illegal:null}),d=t.inherit(t.QUOTE_STRING_MODE,{illegal:null,contains:t.QUOTE_STRING_MODE.contains.concat(l)}),f={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:t.QUOTE_STRING_MODE.contains.concat(l),"on:begin":(ge,Me)=>{Me.data._beginMatch=ge[1]||ge[2]},"on:end":(ge,Me)=>{Me.data._beginMatch!==ge[1]&&Me.ignoreMatch()}},h=t.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),m=`[ +]`,b={scope:"string",variants:[d,u,f,h]},y={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},v=["false","null","true"],x=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],S=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],L={keyword:x,literal:(ge=>{let Me=[];return ge.forEach(Ee=>{Me.push(Ee),Ee.toLowerCase()===Ee?Me.push(Ee.toUpperCase()):Me.push(Ee.toLowerCase())}),Me})(v),built_in:S},T=ge=>ge.map(Me=>Me.replace(/\|\d+$/,"")),z={variants:[{match:[/new/,e.concat(m,"+"),e.concat("(?!",T(S).join("\\b|"),"\\b)"),i],scope:{1:"keyword",4:"title.class"}}]},O=e.concat(r,"\\b(?!\\()"),Y={variants:[{match:[e.concat(/::/,e.lookahead(/(?!class\b)/)),O],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[i,e.concat(/::/,e.lookahead(/(?!class\b)/)),O],scope:{1:"title.class",3:"variable.constant"}},{match:[i,e.concat("::",e.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},ie={scope:"attr",match:e.concat(r,e.lookahead(":"),e.lookahead(/(?!::)/))},$={relevance:0,begin:/\(/,end:/\)/,keywords:L,contains:[ie,o,Y,t.C_BLOCK_COMMENT_MODE,b,y,z]},oe={relevance:0,match:[/\b/,e.concat("(?!fn\\b|function\\b|",T(x).join("\\b|"),"|",T(S).join("\\b|"),"\\b)"),r,e.concat(m,"*"),e.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[$]};$.contains.push(oe);let me=[ie,Y,t.C_BLOCK_COMMENT_MODE,b,y,z],Te={begin:e.concat(/#\[\s*/,i),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:v,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:v,keyword:["new","array"]},contains:["self",...me]},...me,{scope:"meta",match:i}]};return{case_insensitive:!1,keywords:L,contains:[Te,t.HASH_COMMENT_MODE,t.COMMENT("//","$"),t.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:t.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},s,{scope:"variable.language",match:/\$this\b/},o,oe,Y,{match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},z,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},t.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:L,contains:["self",o,Y,t.C_BLOCK_COMMENT_MODE,b,y]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[t.inherit(t.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},t.UNDERSCORE_TITLE_MODE]},b,y]}}function i_(t){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},t.inherit(t.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),t.inherit(t.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}function o_(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}function s_(t){let e=t.regex,n=/[\p{XID_Start}_]\p{XID_Continue}*/u,r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],l={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},u={className:"meta",begin:/^(>>>|\.\.\.) /},d={className:"subst",begin:/\{/,end:/\}/,keywords:l,illegal:/#/},f={begin:/\{\{/,relevance:0},h={className:"string",contains:[t.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[t.BACKSLASH_ESCAPE,u,f,d]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[t.BACKSLASH_ESCAPE,u,f,d]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[t.BACKSLASH_ESCAPE,f,d]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[t.BACKSLASH_ESCAPE,f,d]},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},m="[0-9](_?[0-9])*",b=`(\\b(${m}))?\\.(${m})|\\b(${m})\\.`,y=`\\b|${r.join("|")}`,v={className:"number",relevance:0,variants:[{begin:`(\\b(${m})|(${b}))[eE][+-]?(${m})[jJ]?(?=${y})`},{begin:`(${b})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${y})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${y})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${y})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${y})`},{begin:`\\b(${m})[jJ](?=${y})`}]},x={className:"comment",begin:e.lookahead(/# type:/),end:/$/,keywords:l,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},S={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:["self",u,v,h,t.HASH_COMMENT_MODE]}]};return d.contains=[h,v,u],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:l,illegal:/(<\/|\?)|=>/,contains:[u,v,{begin:/\bself\b/},{beginKeywords:"if",relevance:0},h,x,t.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[S]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[v,S,h]}]}}function a_(t){return{aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}function l_(t){let e=t.regex,n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,r=e.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,o=e.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:n,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[t.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:e.lookahead(e.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:n},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),t.HASH_COMMENT_MODE,{scope:"string",contains:[t.BACKSLASH_ESCAPE],variants:[t.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),t.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),t.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),t.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),t.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),t.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[i,r]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,r]},{scope:{1:"punctuation",2:"number"},match:[o,r]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,r]}]},{scope:{3:"operator"},match:[n,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:o},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}function c_(t){let e=t.regex,n="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",r=e.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=e.concat(r,/(::\w+)*/),s={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield",...["include","extend","prepend","public","private","protected","raise","throw"]],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},l={className:"doctag",begin:"@[A-Za-z]+"},u={begin:"#<",end:">"},d=[t.COMMENT("#","$",{contains:[l]}),t.COMMENT("^=begin","^=end",{contains:[l],relevance:10}),t.COMMENT("^__END__",t.MATCH_NOTHING_RE)],f={className:"subst",begin:/#\{/,end:/\}/,keywords:s},h={className:"string",contains:[t.BACKSLASH_ESCAPE,f],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:e.concat(/<<[-~]?'?/,e.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[t.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[t.BACKSLASH_ESCAPE,f]})]}]},m="[1-9](_?[0-9])*|0",b="[0-9](_?[0-9])*",y={className:"number",relevance:0,variants:[{begin:`\\b(${m})(\\.(${b}))?([eE][+-]?(${b})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},v={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:s}]},O=[h,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:s},{match:[/(include|extend)\s+/,i],scope:{2:"title.class"},keywords:s},{relevance:0,match:[i,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:r,scope:"title.class"},{match:[/def/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[v]},{begin:t.IDENT_RE+"::"},{className:"symbol",begin:t.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[h,{begin:n}],relevance:0},y,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:s},{begin:"("+t.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[t.BACKSLASH_ESCAPE,f],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(u,d),relevance:0}].concat(u,d);f.contains=O,v.contains=O;let oe=[{begin:/^\s*=>/,starts:{end:"$",contains:O}},{className:"meta.prompt",begin:"^("+"[>?]>"+"|"+"[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"+"|"+"(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"+")(?=[ ])",starts:{end:"$",keywords:s,contains:O}}];return d.unshift(u),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:s,illegal:/\/\*/,contains:[t.SHEBANG({binary:"ruby"})].concat(oe).concat(d).concat(O)}}function u_(t){let e=t.regex,n={className:"title.function.invoke",relevance:0,begin:e.concat(/\b/,/(?!let\b)/,t.IDENT_RE,e.lookahead(/\s*\(/))},r="([ui](8|16|32|64|128|size)|f(32|64))?",i=["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"],o=["true","false","Some","None","Ok","Err"],s=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],l=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:t.IDENT_RE+"!?",type:l,keyword:i,literal:o,built_in:s},illegal:""},n]}}var mF=t=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:t.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:t.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),gF=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],bF=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],yF=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],EF=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],vF=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse();function d_(t){let e=mF(t),n=EF,r=yF,i="@[a-z-]+",o="and or not only",l={className:"variable",begin:"(\\$"+"[a-zA-Z-][a-zA-Z0-9_-]*"+")\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,e.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},e.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+gF.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+r.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+n.join("|")+")"},l,{begin:/\(/,end:/\)/,contains:[e.CSS_NUMBER_MODE]},e.CSS_VARIABLE,{className:"attribute",begin:"\\b("+vF.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[e.BLOCK_COMMENT,l,e.HEXCOLOR,e.CSS_NUMBER_MODE,t.QUOTE_STRING_MODE,t.APOS_STRING_MODE,e.IMPORTANT,e.FUNCTION_DISPATCH]},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:o,attribute:bF.join(" ")},contains:[{begin:i,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},l,t.QUOTE_STRING_MODE,t.APOS_STRING_MODE,e.HEXCOLOR,e.CSS_NUMBER_MODE]},e.FUNCTION_DISPATCH]}}function f_(t){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}function p_(t){let e=t.regex,n=t.COMMENT("--","$"),r={className:"string",variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},i={begin:/"/,end:/"/,contains:[{begin:/""/}]},o=["true","false","unknown"],s=["double precision","large object","with timezone","without timezone"],l=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],u=["add","asc","collation","desc","final","first","last","view"],d=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],f=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],h=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],m=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],b=f,y=[...d,...u].filter(L=>!f.includes(L)),v={className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},x={className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},S={begin:e.concat(/\b/,e.either(...b),/\s*\(/),relevance:0,keywords:{built_in:b}};function D(L,{exceptions:T,when:z}={}){let O=z;return T=T||[],L.map(Y=>Y.match(/\|\d+$/)||T.includes(Y)?Y:O(Y)?`${Y}|0`:Y)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:D(y,{when:L=>L.length<3}),literal:o,type:l,built_in:h},contains:[{begin:e.either(...m),relevance:0,keywords:{$pattern:/[\w\.]+/,keyword:y.concat(m),literal:o,type:l}},{className:"type",begin:e.either(...s)},S,v,r,i,t.C_NUMBER_MODE,t.C_BLOCK_COMMENT_MODE,n,x]}}function b_(t){return t?typeof t=="string"?t:t.source:null}function yu(t){return ot("(?=",t,")")}function ot(...t){return t.map(n=>b_(n)).join("")}function wF(t){let e=t[t.length-1];return typeof e=="object"&&e.constructor===Object?(t.splice(t.length-1,1),e):{}}function Sn(...t){return"("+(wF(t).capture?"":"?:")+t.map(r=>b_(r)).join("|")+")"}var xm=t=>ot(/\b/,t,/\w$/.test(t)?/\b/:/\B/),xF=["Protocol","Type"].map(xm),h_=["init","self"].map(xm),_F=["Any","Self"],Em=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],m_=["false","nil","true"],SF=["assignment","associativity","higherThan","left","lowerThan","none","right"],TF=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],g_=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],y_=Sn(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),E_=Sn(y_,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),vm=ot(y_,E_,"*"),v_=Sn(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),Eu=Sn(v_,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),qr=ot(v_,Eu,"*"),wm=ot(/[A-Z]/,Eu,"*"),MF=["autoclosure",ot(/convention\(/,Sn("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",ot(/objc\(/,qr,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],CF=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"];function w_(t){let e={match:/\s+/,relevance:0},n=t.COMMENT("/\\*","\\*/",{contains:["self"]}),r=[t.C_LINE_COMMENT_MODE,n],i={match:[/\./,Sn(...xF,...h_)],className:{2:"keyword"}},o={match:ot(/\./,Sn(...Em)),relevance:0},s=Em.filter(Le=>typeof Le=="string").concat(["_|0"]),l=Em.filter(Le=>typeof Le!="string").concat(_F).map(xm),u={variants:[{className:"keyword",match:Sn(...l,...h_)}]},d={$pattern:Sn(/\b\w+/,/#\w+/),keyword:s.concat(TF),literal:m_},f=[i,o,u],h={match:ot(/\./,Sn(...g_)),relevance:0},m={className:"built_in",match:ot(/\b/,Sn(...g_),/(?=\()/)},b=[h,m],y={match:/->/,relevance:0},v={className:"operator",relevance:0,variants:[{match:vm},{match:`\\.(\\.|${E_})+`}]},x=[y,v],S="([0-9]_*)+",D="([0-9a-fA-F]_*)+",L={className:"number",relevance:0,variants:[{match:`\\b(${S})(\\.(${S}))?([eE][+-]?(${S}))?\\b`},{match:`\\b0x(${D})(\\.(${D}))?([pP][+-]?(${S}))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},T=(Le="")=>({className:"subst",variants:[{match:ot(/\\/,Le,/[0\\tnr"']/)},{match:ot(/\\/,Le,/u\{[0-9a-fA-F]{1,8}\}/)}]}),z=(Le="")=>({className:"subst",match:ot(/\\/,Le,/[\t ]*(?:[\r\n]|\r\n)/)}),O=(Le="")=>({className:"subst",label:"interpol",begin:ot(/\\/,Le,/\(/),end:/\)/}),Y=(Le="")=>({begin:ot(Le,/"""/),end:ot(/"""/,Le),contains:[T(Le),z(Le),O(Le)]}),ie=(Le="")=>({begin:ot(Le,/"/),end:ot(/"/,Le),contains:[T(Le),O(Le)]}),$={className:"string",variants:[Y(),Y("#"),Y("##"),Y("###"),ie(),ie("#"),ie("##"),ie("###")]},oe={match:ot(/`/,qr,/`/)},me={className:"variable",match:/\$\d+/},Te={className:"variable",match:`\\$${Eu}+`},ge=[oe,me,Te],Me={match:/(@|#(un)?)available/,className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:CF,contains:[...x,L,$]}]}},Ee={className:"keyword",match:ot(/@/,Sn(...MF))},P={className:"meta",match:ot(/@/,qr)},N=[Me,Ee,P],R={match:yu(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:ot(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Eu,"+")},{className:"type",match:wm,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:ot(/\s+&\s+/,yu(wm)),relevance:0}]},V={begin://,keywords:d,contains:[...r,...f,...N,y,R]};R.contains.push(V);let Q={match:ot(qr,/\s*:/),keywords:"_|0",relevance:0},he={begin:/\(/,end:/\)/,relevance:0,keywords:d,contains:["self",Q,...r,...f,...b,...x,L,$,...ge,...N,R]},xe={begin://,contains:[...r,R]},$e={begin:Sn(yu(ot(qr,/\s*:/)),yu(ot(qr,/\s+/,qr,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:qr}]},Ue={begin:/\(/,end:/\)/,keywords:d,contains:[$e,...r,...f,...x,L,$,...N,R,he],endsParent:!0,illegal:/["']/},He={match:[/func/,/\s+/,Sn(oe.match,qr,vm)],className:{1:"keyword",3:"title.function"},contains:[xe,Ue,e],illegal:[/\[/,/%/]},Xe={match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[xe,Ue,e],illegal:/\[|%/},xt={match:[/operator/,/\s+/,vm],className:{1:"keyword",3:"title"}},Pt={begin:[/precedencegroup/,/\s+/,wm],className:{1:"keyword",3:"title"},contains:[R],keywords:[...SF,...m_],end:/}/};for(let Le of $.variants){let _t=Le.contains.find(st=>st.label==="interpol");_t.keywords=d;let Zt=[...f,...b,...x,L,$,...ge];_t.contains=[...Zt,{begin:/\(/,end:/\)/,contains:["self",...Zt]}]}return{name:"Swift",keywords:d,contains:[...r,He,Xe,{beginKeywords:"struct protocol class extension enum actor",end:"\\{",excludeEnd:!0,keywords:d,contains:[t.inherit(t.TITLE_MODE,{className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...f]},xt,Pt,{beginKeywords:"import",end:/$/,contains:[...r],relevance:0},...f,...b,...x,L,$,...ge,...N,R,he]}}var vu="[A-Za-z$_][0-9A-Za-z$_]*",x_=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],__=["true","false","null","undefined","NaN","Infinity"],S_=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],T_=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],M_=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],C_=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],k_=[].concat(M_,S_,T_);function kF(t){let e=t.regex,n=(R,{after:V})=>{let Q="",end:""},o=/<[A-Za-z0-9\\._:-]+\s*\/>/,s={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(R,V)=>{let Q=R[0].length+R.index,he=R.input[Q];if(he==="<"||he===","){V.ignoreMatch();return}he===">"&&(n(R,{after:Q})||V.ignoreMatch());let xe,$e=R.input.substring(Q);if(xe=$e.match(/^\s*=/)){V.ignoreMatch();return}if((xe=$e.match(/^\s+extends\s+/))&&xe.index===0){V.ignoreMatch();return}}},l={$pattern:vu,keyword:x_,literal:__,built_in:k_,"variable.language":C_},u="[0-9](_?[0-9])*",d=`\\.(${u})`,f="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",h={className:"number",variants:[{begin:`(\\b(${f})((${d})|\\.)?|(${d}))[eE][+-]?(${u})\\b`},{begin:`\\b(${f})\\b((${d})\\b|\\.)?|(${d})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},m={className:"subst",begin:"\\$\\{",end:"\\}",keywords:l,contains:[]},b={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"xml"}},y={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"css"}},v={begin:"gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,m],subLanguage:"graphql"}},x={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,m]},D={className:"comment",variants:[t.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:r+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]},L=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,{match:/\$\d+/},h];m.contains=L.concat({begin:/\{/,end:/\}/,keywords:l,contains:["self"].concat(L)});let T=[].concat(D,m.contains),z=T.concat([{begin:/\(/,end:/\)/,keywords:l,contains:["self"].concat(T)}]),O={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z},Y={variants:[{match:[/class/,/\s+/,r,/\s+/,/extends/,/\s+/,e.concat(r,"(",e.concat(/\./,r),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,r],scope:{1:"keyword",3:"title.class"}}]},ie={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...S_,...T_]}},$={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},oe={variants:[{match:[/function/,/\s+/,r,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},me={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function Te(R){return e.concat("(?!",R.join("|"),")")}let ge={match:e.concat(/\b/,Te([...M_,"super","import"]),r,e.lookahead(/\(/)),className:"title.function",relevance:0},Me={begin:e.concat(/\./,e.lookahead(e.concat(r,/(?![0-9A-Za-z$_(])/))),end:r,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},Ee={match:[/get|set/,/\s+/,r,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},P="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",N={match:[/const|var|let/,/\s+/,r,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(P)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:l,exports:{PARAMS_CONTAINS:z,CLASS_REFERENCE:ie},illegal:/#(?![$_A-z])/,contains:[t.SHEBANG({label:"shebang",binary:"node",relevance:5}),$,t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,b,y,v,x,D,{match:/\$\d+/},h,ie,{className:"attr",begin:r+e.lookahead(":"),relevance:0},N,{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[D,t.REGEXP_MODE,{className:"function",begin:P,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:z}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:i.begin,end:i.end},{match:o},{begin:s.begin,"on:begin":s.isTrulyOpeningTag,end:s.end}],subLanguage:"xml",contains:[{begin:s.begin,end:s.end,skip:!0,contains:["self"]}]}]},oe,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+t.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,t.inherit(t.TITLE_MODE,{begin:r,className:"title.function"})]},{match:/\.\.\./,relevance:0},Me,{match:"\\$"+r,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},ge,me,Y,Ee,{match:/\$[(.]/}]}}function A_(t){let e=kF(t),n=vu,r=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={beginKeywords:"namespace",end:/\{/,excludeEnd:!0,contains:[e.exports.CLASS_REFERENCE]},o={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:r},contains:[e.exports.CLASS_REFERENCE]},s={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},l=["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"],u={$pattern:vu,keyword:x_.concat(l),literal:__,built_in:k_.concat(r),"variable.language":C_},d={className:"meta",begin:"@"+n},f=(m,b,y)=>{let v=m.contains.findIndex(x=>x.label===b);if(v===-1)throw new Error("can not find mode to replace");m.contains.splice(v,1,y)};Object.assign(e.keywords,u),e.exports.PARAMS_CONTAINS.push(d),e.contains=e.contains.concat([d,i,o]),f(e,"shebang",t.SHEBANG()),f(e,"use_strict",s);let h=e.contains.find(m=>m.label==="func.def");return h.relevance=0,Object.assign(e,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),e}function N_(t){let e=t.regex,n={className:"string",begin:/"(""|[^/n])"C\b/},r={className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},i=/\d{1,2}\/\d{1,2}\/\d{4}/,o=/\d{4}-\d{1,2}-\d{1,2}/,s=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,l=/\d{1,2}(:\d{1,2}){1,2}/,u={className:"literal",variants:[{begin:e.concat(/# */,e.either(o,i),/ *#/)},{begin:e.concat(/# */,l,/ *#/)},{begin:e.concat(/# */,s,/ *#/)},{begin:e.concat(/# */,e.either(o,i),/ +/,e.either(s,l),/ *#/)}]},d={className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},f={className:"label",begin:/^\w+:/},h=t.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),m=t.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[n,r,u,d,f,h,m,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[m]}]}}function O_(t){t.regex;let e=t.COMMENT(/\(;/,/;\)/);e.contains.push("self");let n=t.COMMENT(/;;/,/$/),r=["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"],i={begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},o={className:"variable",begin:/\$[\w_]+/},s={match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},l={className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/},u={match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},d={className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/};return{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:r},contains:[n,e,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},o,s,i,t.QUOTE_STRING_MODE,u,d,l]}}function R_(t){let e=t.regex,n=e.concat(/[\p{L}_]/u,e.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r=/[\p{L}0-9._:-]+/u,i={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},o={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},s=t.inherit(o,{begin:/\(/,end:/\)/}),l=t.inherit(t.APOS_STRING_MODE,{className:"string"}),u=t.inherit(t.QUOTE_STRING_MODE,{className:"string"}),d={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[o,u,l,s,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[o,s,u,l]}]}]},t.COMMENT(//,{relevance:10}),{begin://,relevance:10},i,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[u]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[d],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[d],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:e.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:d}]},{className:"tag",begin:e.concat(/<\//,e.lookahead(e.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function I_(t){let e="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ ]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ ]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ ]|$)"}]},i={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},o={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[t.BACKSLASH_ESCAPE,i]},s=t.inherit(o,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),h={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},m={end:",",endsWithParent:!0,excludeEnd:!0,keywords:e,relevance:0},b={begin:/\{/,end:/\}/,contains:[m],illegal:"\\n",relevance:0},y={begin:"\\[",end:"\\]",contains:[m],illegal:"\\n",relevance:0},v=[r,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+t.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+t.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},t.HASH_COMMENT_MODE,{beginKeywords:e,keywords:{literal:e}},h,{className:"number",begin:t.C_NUMBER_RE+"\\b",relevance:0},b,y,o],x=[...v];return x.pop(),x.push(s),m.contains=x,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:v}}var eS=Yd(Q_(),1);var Zn=eS.default;var nS=Yd(tS(),1),_a=Object.assign(vo(Error),{eval:vo(EvalError),range:vo(RangeError),reference:vo(ReferenceError),syntax:vo(SyntaxError),type:vo(TypeError),uri:vo(URIError)});function vo(t){return e.displayName=t.displayName||t.name,e;function e(n,...r){let i=n&&(0,nS.default)(n,...r);return new t(i)}}var yH={}.hasOwnProperty,rS="hljs-";function iS(t,e,n={}){let r=n.prefix;if(typeof t!="string")throw _a("Expected `string` for name, got `%s`",t);if(!Zn.getLanguage(t))throw _a("Unknown language: `%s` is not registered",t);if(typeof e!="string")throw _a("Expected `string` for value, got `%s`",e);r==null&&(r=rS),Zn.configure({__emitter:Rm,classPrefix:r});let i=Zn.highlight(e,{language:t,ignoreIllegals:!0});if(Zn.configure({}),i.errorRaised)throw i.errorRaised;return i._emitter.root.data.language=i.language,i._emitter.root.data.relevance=i.relevance,i._emitter.root}function EH(t,e={}){let n=e.subset||Zn.listLanguages(),r=e.prefix,i=-1,o={type:"root",data:{language:null,relevance:0},children:[]};if(r==null&&(r=rS),typeof t!="string")throw _a("Expected `string` for value, got `%s`",t);for(;++io.data.relevance&&(o=l)}return o}function vH(t,e){Zn.registerLanguage(t,e)}var wH=function(t,e){if(typeof t=="string")Zn.registerAliases(e,{languageName:t});else{let n;for(n in t)yH.call(t,n)&&Zn.registerAliases(t[n],{languageName:n})}};function xH(t){return!!Zn.getLanguage(t)}function _H(){return Zn.listLanguages()}var Rm=class{constructor(e){this.options=e,this.root={type:"root",data:{language:null,relevance:0},children:[]},this.stack=[this.root]}addText(e){if(e==="")return;let n=this.stack[this.stack.length-1],r=n.children[n.children.length-1];r&&r.type==="text"?r.value+=e:n.children.push({type:"text",value:e})}startScope(e){this.openNode(String(e))}endScope(){this.closeNode()}__addSublanguage(e,n){let r=this.stack[this.stack.length-1],i=e.root.children;n?r.children.push({type:"element",tagName:"span",properties:{className:[n]},children:i}):r.children.push(...i)}openNode(e){let n=e.split(".").map((o,s)=>s?o+"_".repeat(s):this.options.classPrefix+o),r=this.stack[this.stack.length-1],i={type:"element",tagName:"span",properties:{className:n},children:[]};r.children.push(i),this.stack.push(i)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}},Ie={highlight:iS,highlightAuto:EH,registerLanguage:vH,registered:xH,listLanguages:_H,registerAlias:wH};Ie.registerLanguage("arduino",Ax);Ie.registerLanguage("bash",Nx);Ie.registerLanguage("c",Ox);Ie.registerLanguage("cpp",Rx);Ie.registerLanguage("csharp",Ix);Ie.registerLanguage("css",Lx);Ie.registerLanguage("diff",Dx);Ie.registerLanguage("go",Px);Ie.registerLanguage("graphql",Bx);Ie.registerLanguage("ini",Fx);Ie.registerLanguage("java",$x);Ie.registerLanguage("javascript",Gx);Ie.registerLanguage("json",qx);Ie.registerLanguage("kotlin",Yx);Ie.registerLanguage("less",Zx);Ie.registerLanguage("lua",jx);Ie.registerLanguage("makefile",Qx);Ie.registerLanguage("markdown",e_);Ie.registerLanguage("objectivec",t_);Ie.registerLanguage("perl",n_);Ie.registerLanguage("php",r_);Ie.registerLanguage("php-template",i_);Ie.registerLanguage("plaintext",o_);Ie.registerLanguage("python",s_);Ie.registerLanguage("python-repl",a_);Ie.registerLanguage("r",l_);Ie.registerLanguage("ruby",c_);Ie.registerLanguage("rust",u_);Ie.registerLanguage("scss",d_);Ie.registerLanguage("shell",f_);Ie.registerLanguage("sql",p_);Ie.registerLanguage("swift",w_);Ie.registerLanguage("typescript",A_);Ie.registerLanguage("vbnet",N_);Ie.registerLanguage("wasm",O_);Ie.registerLanguage("xml",R_);Ie.registerLanguage("yaml",I_);var Mi=(t,e=0,n=1)=>t>n?n:tMath.round(n*t)/n;var Yq={grad:360/400,turn:360,rad:360/(Math.PI*2)},oS=t=>CH(Mu(t)),Mu=t=>(t[0]==="#"&&(t=t.substring(1)),t.length<6?{r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16),a:t.length===4?At(parseInt(t[3]+t[3],16)/255,2):1}:{r:parseInt(t.substring(0,2),16),g:parseInt(t.substring(2,4),16),b:parseInt(t.substring(4,6),16),a:t.length===8?At(parseInt(t.substring(6,8),16)/255,2):1});var sS=t=>MH(TH(t)),SH=({h:t,s:e,v:n,a:r})=>{let i=(200-e)*n/100;return{h:At(t),s:At(i>0&&i<200?e*n/100/(i<=100?i:200-i)*100:0),l:At(i/2),a:At(r,2)}};var Sa=t=>{let{h:e,s:n,l:r}=SH(t);return`hsl(${e}, ${n}%, ${r}%)`};var TH=({h:t,s:e,v:n,a:r})=>{t=t/360*6,e=e/100,n=n/100;let i=Math.floor(t),o=n*(1-e),s=n*(1-(t-i)*e),l=n*(1-(1-t+i)*e),u=i%6;return{r:At([n,s,o,o,l,n][u]*255),g:At([l,n,n,s,o,o][u]*255),b:At([o,o,l,n,n,s][u]*255),a:At(r,2)}};var Tu=t=>{let e=t.toString(16);return e.length<2?"0"+e:e},MH=({r:t,g:e,b:n,a:r})=>{let i=r<1?Tu(At(r*255)):"";return"#"+Tu(t)+Tu(e)+Tu(n)+i},CH=({r:t,g:e,b:n,a:r})=>{let i=Math.max(t,e,n),o=i-Math.min(t,e,n),s=o?i===t?(e-n)/o:i===e?2+(n-t)/o:4+(t-e)/o:0;return{h:At(60*(s<0?s+6:s)),s:At(i?o/i*100:0),v:At(i/255*100),a:r}};var Im=(t,e)=>{if(t===e)return!0;for(let n in t)if(t[n]!==e[n])return!1;return!0};var aS=(t,e)=>t.toLowerCase()===e.toLowerCase()?!0:Im(Mu(t),Mu(e));var lS={},Cu=t=>{let e=lS[t];return e||(e=document.createElement("template"),e.innerHTML=t,lS[t]=e),e},Ta=(t,e,n)=>{t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:n}))};var fs=!1,Lm=t=>"touches"in t,kH=t=>fs&&!Lm(t)?!1:(fs||(fs=Lm(t)),!0),cS=(t,e)=>{let n=Lm(e)?e.touches[0]:e,r=t.el.getBoundingClientRect();Ta(t.el,"move",t.getMove({x:Mi((n.pageX-(r.left+window.pageXOffset))/r.width),y:Mi((n.pageY-(r.top+window.pageYOffset))/r.height)}))},AH=(t,e)=>{let n=e.keyCode;n>40||t.xy&&n<37||n<33||(e.preventDefault(),Ta(t.el,"move",t.getMove({x:n===39?.01:n===37?-.01:n===34?.05:n===33?-.05:n===35?1:n===36?-1:0,y:n===40?.01:n===38?-.01:0},!0)))},ps=class{constructor(e,n,r,i){let o=Cu(`
`);e.appendChild(o.content.cloneNode(!0));let s=e.querySelector(`[part=${n}]`);s.addEventListener("mousedown",this),s.addEventListener("touchstart",this),s.addEventListener("keydown",this),this.el=s,this.xy=i,this.nodes=[s.firstChild,s]}set dragging(e){let n=e?document.addEventListener:document.removeEventListener;n(fs?"touchmove":"mousemove",this),n(fs?"touchend":"mouseup",this)}handleEvent(e){switch(e.type){case"mousedown":case"touchstart":if(e.preventDefault(),!kH(e)||!fs&&e.button!=0)return;this.el.focus(),cS(this,e),this.dragging=!0;break;case"mousemove":case"touchmove":e.preventDefault(),cS(this,e);break;case"mouseup":case"touchend":this.dragging=!1;break;case"keydown":AH(this,e);break}}style(e){e.forEach((n,r)=>{for(let i in n)this.nodes[r].style.setProperty(i,n[i])})}};var ku=class extends ps{constructor(e){super(e,"hue",'aria-label="Hue" aria-valuemin="0" aria-valuemax="360"',!1)}update({h:e}){this.h=e,this.style([{left:`${e/360*100}%`,color:Sa({h:e,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuenow",`${At(e)}`)}getMove(e,n){return{h:n?Mi(this.h+e.x*360,0,360):360*e.x}}};var Au=class extends ps{constructor(e){super(e,"saturation",'aria-label="Color"',!0)}update(e){this.hsva=e,this.style([{top:`${100-e.v}%`,left:`${e.s}%`,color:Sa(e)},{"background-color":Sa({h:e.h,s:100,v:100,a:1})}]),this.el.setAttribute("aria-valuetext",`Saturation ${At(e.s)}%, Brightness ${At(e.v)}%`)}getMove(e,n){return{s:n?Mi(this.hsva.s+e.x*100,0,100):e.x*100,v:n?Mi(this.hsva.v-e.y*100,0,100):Math.round(100-e.y*100)}}};var uS=':host{display:flex;flex-direction:column;position:relative;width:200px;height:200px;user-select:none;-webkit-user-select:none;cursor:default}:host([hidden]){display:none!important}[role=slider]{position:relative;touch-action:none;user-select:none;-webkit-user-select:none;outline:0}[role=slider]:last-child{border-radius:0 0 8px 8px}[part$=pointer]{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;display:flex;place-content:center center;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}[part$=pointer]::after{content:"";width:100%;height:100%;border-radius:inherit;background-color:currentColor}[role=slider]:focus [part$=pointer]{transform:translate(-50%,-50%) scale(1.1)}';var dS="[part=hue]{flex:0 0 24px;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}[part=hue-pointer]{top:50%;z-index:2}";var fS="[part=saturation]{flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,rgba(255,255,255,0));box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}[part=saturation-pointer]{z-index:3}";var Nu=Symbol("same"),Dm=Symbol("color"),pS=Symbol("hsva"),Pm=Symbol("update"),hS=Symbol("parts"),mS=Symbol("css"),gS=Symbol("sliders"),Ou=class extends HTMLElement{static get observedAttributes(){return["color"]}get[mS](){return[uS,dS,fS]}get[gS](){return[Au,ku]}get color(){return this[Dm]}set color(e){if(!this[Nu](e)){let n=this.colorModel.toHsva(e);this[Pm](n),this[Dm]=e}}constructor(){super();let e=Cu(``),n=this.attachShadow({mode:"open"});n.appendChild(e.content.cloneNode(!0)),n.addEventListener("move",this),this[hS]=this[gS].map(r=>new r(n))}connectedCallback(){if(this.hasOwnProperty("color")){let e=this.color;delete this.color,this.color=e}else this.color||(this.color=this.colorModel.defaultColor)}attributeChangedCallback(e,n,r){let i=this.colorModel.fromAttr(r);this[Nu](i)||(this.color=i)}handleEvent(e){let n=this[pS],r={...n,...e.detail};this[Pm](r);let i;!Im(r,n)&&!this[Nu](i=this.colorModel.fromHsva(r))&&(this[Dm]=i,Ta(this,"color-changed",{value:i}))}[Nu](e){return this.color&&this.colorModel.equal(e,this.color)}[Pm](e){this[pS]=e,this[hS].forEach(n=>n.update(e))}};var NH={defaultColor:"#000",toHsva:oS,fromHsva:({h:t,s:e,v:n})=>sS({h:t,s:e,v:n,a:1}),equal:aS,fromAttr:t=>t},Ru=class extends Ou{get colorModel(){return NH}};var ES=Yd(bS(),1);customElements.define("tiptap-hex-color-picker",Ru);var OH={blockquote:[$E],bold:[UE],"bullet-list":[VE],"checked-list":[Gp],code:[GE],"code-block":[Fh.configure({lowlight:Ie,HTMLAttributes:{class:"hljs"}})],color:[YE],details:[Th,Mh,Ch],grid:[yh,Eh],"grid-builder":[dm,fm],heading:[tv.configure({levels:[1,2,3,4,5,6]})],highlight:[Zv],hr:[av],hurdle:[Hh],italic:[lv],lead:[qp],link:[mh.configure({openOnClick:!1,autolink:!1,HTMLAttributes:{rel:null,hreflang:null,class:null}})],media:[gh.configure({inline:!0})],oembed:[wh,_h,Sh],"ordered-list":[dv],small:[bh],strike:[pv],subscript:[hv],superscript:[mv],table:[Vv.configure({resizable:!0}),qv,Gv,Yv],underline:[Xv]},RH=window.TiptapEditorExtensions||{},yS={...OH,...RH},Iu=document.getElementById("activeLocale");Iu&&Iu.addEventListener("change",()=>{let t=new CustomEvent("localeChange",{bubbles:!0,detail:{locale:Iu.value}});Iu.dispatchEvent(t)});Livewire.on("insertFromAction",t=>{setTimeout(()=>{let e=new CustomEvent("insert-content",{bubble:!0,detail:t});window.dispatchEvent(e)},100)});Livewire.on("insertBlockFromAction",t=>{setTimeout(()=>{let e=new CustomEvent("insert-block",{bubble:!0,detail:t});window.dispatchEvent(e)},100)});Livewire.on("updateBlockFromAction",t=>{setTimeout(()=>{let e=new CustomEvent("update-block",{bubble:!0,detail:t});window.dispatchEvent(e)},100)});function IH({state:t,statePath:e,tools:n=[],disabled:r=!1,locale:i="en",floatingMenuTools:o=[],placeholder:s=null,mergeTags:l=[]}){let u=window.filamentTiptapEditors||{};return{id:null,modalId:null,tools:n,state:t,statePath:e,fullScreenMode:!1,updatedAt:Date.now(),disabled:r,locale:i,floatingMenuTools:o,getExtensions(d){let f=this.tools.map(m=>typeof m=="string"?m:m.id),h=[JE,Jv,uc,ZE,QE,ev,sv,qE,hm,pm,gm,bm,ym];if(s&&!r&&h.push(fv.configure({placeholder:s})),f.length){let m=Object.keys(yS),b=[],y=["paragraph"];h.push(va.configure({pluginKey:`defaultBubbleMenu${d}`,element:this.$refs.defaultBubbleMenu,tippyOptions:{duration:[500,0]},shouldShow:({state:v,from:x,to:S})=>!(x===S||Wn(v,"link")||Wn(v,"table")||Wn(v,"image")||Wn(v,"oembed")||Wn(v,"vimeo")||Wn(v,"youtube")||Wn(v,"video")||Wn(v,"tiptapBlock"))})),this.floatingMenuTools.length&&(h.push(um.configure({pluginKey:`defaultFloatingMenu${d}`,element:this.$refs.defaultFloatingMenu,tippyOptions:{duration:[500,0]}})),this.floatingMenuTools.forEach(v=>{f.includes(v)||f.push(v)})),f.forEach(v=>{m.includes(v)?yS[v].forEach(x=>{["ordered-list","bullet-list","checked-list"].includes(v)?(h.push(x),h.includes(Ip)||h.push(Ip)):(v==="table"&&h.push(va.configure({pluginKey:`tableBubbleMenu${d}`,element:this.$refs.tableBubbleMenu,tippyOptions:{duration:[500,0]},shouldShow:({state:S})=>Wn(S,"table")})),v==="link"&&h.push(va.configure({pluginKey:`linkBubbleMenu${d}`,element:this.$refs.linkBubbleMenu,tippyOptions:{duration:[500,0]},shouldShow:({state:S})=>Wn(S,"link")})),h.push(x))}):["align-left","align-right","align-center","align-justify"].includes(v)&&(v==="align-left"&&b.push("start"),v==="align-center"&&b.push("center"),v==="align-right"&&b.push("end"),v==="align-justify"&&b.push("justify"),f.includes("heading")&&y.push("heading"),typeof h.find(S=>S.name==="textAlign")>"u"&&h.push(zh.configure({types:y,alignments:b})))})}return l?.length&&h.push(mm.configure({mergeTags:l})),h},init:async function(){this.initEditor(this.state),this.modalId=this.$el.closest('[x-ref="modalContainer"]')?.getAttribute("wire:key"),window.filamentTiptapEditors=u,document.addEventListener("dblclick",function(f){(f.target&&(f.target.hasAttribute("data-youtube-video")||f.target.hasAttribute("data-vimeo-video"))||f.target.hasAttribute("data-native-video"))&&(f.target.firstChild.style.pointerEvents="all")}),window.addEventListener("localeChange",f=>{this.locale=f.detail.locale});let d=this.$el.parentElement.closest("[x-sortable]");d&&(window.Sortable.utils.on(d,"start",()=>{let f=document.querySelectorAll(".tiptap-wrapper");f.length!==0&&f.forEach(function(h){h._x_dataStack[0].editor().setEditable(!1),h._x_dataStack[0].editor().options.element.style.pointerEvents="none"})}),window.Sortable.utils.on(d,"end",()=>{let f=document.querySelectorAll(".tiptap-wrapper");f.length!==0&&f.forEach(function(h){h._x_dataStack[0].editor().setEditable(!0),h._x_dataStack[0].editor().options.element.style.pointerEvents="all"})})),this.$watch("state",(f,h)=>{typeof f<"u"&&((0,ES.isEqual)(h,Alpine.raw(f))||this.updateEditorContent(f))})},destroyEditor(d){let f=d.detail.id.split("-")[0];!this.modalId||f+"."+this.statePath===this.modalId||u[this.statePath]&&(u[this.statePath].destroy(),delete u[this.statePath])},editor(){return u[this.statePath]},initEditor(d){let f=null;u[this.statePath]&&(d=this.editor().getJSON(),f=this.editor().state.selection,u[this.statePath].destroy(),delete u[this.statePath]);let h=this;u[this.statePath]=new Xl({element:this.$refs.element,extensions:this.getExtensions(this.statePath),editable:!this.disabled,content:d,editorProps:{handlePaste(m,b,y){y.content.descendants(v=>{v.type.name==="tiptapBlock"&&(v.attrs.statePath=h.statePath,v.attrs.data=JSON.parse(v.attrs.data))})}},onCreate({editor:m}){f&&h.modalId&&(h.updatedAt=Date.now(),m.chain().focus().setTextSelection(f).run())},onUpdate({editor:m}){h.updatedAt=Date.now(),h.state=m.isEmpty?null:m.getJSON()},onSelectionUpdate(){h.updatedAt=Date.now()},onBlur(){h.updatedAt=Date.now()},onFocus(){h.updatedAt=Date.now()}})},updateEditorContent(d){if(this.editor().isEditable){let{from:f,to:h}=this.editor().state.selection;this.editor().commands.setContent(d,!0),this.editor().chain().focus().setTextSelection({from:f,to:h}).run()}},refreshEditorContent(){this.$nextTick(()=>this.updateEditorContent(this.state))},insertContent(d){if(d.detail.statePath===this.statePath)switch(d.detail.type){case"media":this.insertMedia(d);return;case"video":this.insertVideo(d);return;case"link":this.insertLink(d);return;case"source":this.insertSource(d);return;case"grid":this.insertGridBuilder(d);return;default:return}},insertMedia(d){Array.isArray(d.detail.media)?d.detail.media.forEach(f=>{this.executeMediaInsert(f)}):this.executeMediaInsert(d.detail.media)},executeMediaInsert(d=null){if(!(!d||d?.url===null)&&d){let f=d?.url||d?.src,h=["jpg","jpeg","svg","png","webp"],b=/.*\.([a-zA-Z]*)\??/.exec(f);b!==null&&h.includes(b[1])?this.editor().chain().focus().setImage({src:f,alt:d?.alt,title:d?.title,width:d?.width,height:d?.height,lazy:d?.lazy}).run():this.editor().chain().focus().extendMarkRange("link").setLink({href:f}).insertContent(d?.link_text).run()}},insertVideo(d){let f=d.detail.video;if(!f||f.url===null)return;let h={src:f.url,width:f.responsive?f.width*100:f.width,height:f.responsive?f.height*100:f.height,responsive:f.responsive??!0,"data-aspect-width":f.width,"data-aspect-height":f.height};f.url.includes("youtube")||f.url.includes("youtu.be")?this.editor().chain().focus().setYoutubeVideo({...h,controls:f.youtube_options.includes("controls"),nocookie:f.youtube_options.includes("nocookie"),start:f.start_at??0}).run():f.url.includes("vimeo")?this.editor().chain().focus().setVimeoVideo({...h,autoplay:f.vimeo_options.includes("autoplay"),loop:f.vimeo_options.includes("loop"),title:f.vimeo_options.includes("show_title"),byline:f.vimeo_options.includes("byline"),portrait:f.vimeo_options.includes("portrait")}).run():this.editor().chain().focus().setVideo({...h,autoplay:f.native_options.includes("autoplay"),loop:f.native_options.includes("loop"),controls:f.native_options.includes("controls")}).run()},insertLink(d){let f=d.detail;if(!(f.href===null&&f.id===null)){if(f.href===""&&f.id===null){this.unsetLink();return}this.editor().chain().focus().extendMarkRange("link").setLink({href:f.href,id:f.id??null,target:f.target??null,hreflang:f.hreflang??null,rel:f.rel??null,referrerpolicy:f.referrerpolicy??null,as_button:f.as_button??null,button_theme:f.button_theme??null}).selectTextblockEnd().run()}},unsetLink(){this.editor().chain().focus().extendMarkRange("link").unsetLink().selectTextblockEnd().run()},insertSource(d){this.updateEditorContent(d.detail.source)},insertGridBuilder(d){let f=d.detail.data,h="responsive",m=parseInt(f.asymmetric_left)??null,b=parseInt(f.asymmetric_right)??null;f.fixed&&(h="fixed"),f.asymmetric&&(h="asymmetric"),this.editor().chain().focus().insertGridBuilder({cols:f.columns,type:h,stackAt:f.stack_at,asymmetricLeft:m,asymmetricRight:b}).run()},insertBlock(d){d.detail.statePath===this.statePath&&(this.editor().commands.insertBlock({type:d.detail.type,statePath:d.detail.statePath,data:d.detail.data,preview:d.detail.preview,label:d.detail.label,coordinates:d.detail.coordinates}),this.editor().isFocused||this.editor().commands.focus())},insertMergeTag(d){this.editor().commands.insertMergeTag({tag:d.detail.tag,coordinates:d.detail.coordinates}),this.editor().isFocused||this.editor().commands.focus()},openBlockSettings(d){d.detail.statePath===this.statePath&&this.$wire.dispatchFormEvent("tiptap::updateBlock",this.statePath,d.detail)},updateBlock(d){d.detail.statePath===this.statePath&&(this.editor().commands.updateBlock({type:d.detail.type,statePath:d.detail.statePath,data:d.detail.data,preview:d.detail.preview,label:d.detail.label}),this.editor().isFocused||this.editor().commands.focus())},deleteBlock(){this.editor().commands.removeBlock()}}}export{IH as default}; /*! Bundled license information: lodash/lodash.js: @@ -48951,4 +233,3 @@ lodash/lodash.js: * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvbGliL2NvcmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2Zvcm1hdC9mb3JtYXQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL29yZGVyZWRtYXAvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItbW9kZWwvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItdHJhbnNmb3JtL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXN0YXRlL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXZpZXcvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdzNjLWtleW5hbWUvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLWtleW1hcC9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1jb21tYW5kcy9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zY2hlbWEtbGlzdC9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY3JlYXRlQ2hhaW5hYmxlU3RhdGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvQ29tbWFuZE1hbmFnZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvRXZlbnRFbWl0dGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9zcGxpdEV4dGVuc2lvbnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRBdHRyaWJ1dGVzRnJvbUV4dGVuc2lvbnMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXROb2RlVHlwZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvbWVyZ2VBdHRyaWJ1dGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc0Z1bmN0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9jYWxsT3JSZXR1cm4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2lzRW1wdHlPYmplY3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2Zyb21TdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pbmplY3RFeHRlbnNpb25BdHRyaWJ1dGVzVG9QYXJzZVJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRTY2hlbWFCeVJlc29sdmVkRXh0ZW5zaW9ucy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFNjaGVtYVR5cGVCeU5hbWUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0V4dGVuc2lvblJ1bGVzRW5hYmxlZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFRleHRDb250ZW50RnJvbU5vZGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc1JlZ0V4cC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9JbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2lzTnVtYmVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL1Bhc3RlUnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvZmluZER1cGxpY2F0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvRXh0ZW5zaW9uTWFuYWdlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvaXNQbGFpbk9iamVjdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvbWVyZ2VEZWVwLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL0V4dGVuc2lvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFRleHRCZXR3ZWVuLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0VGV4dFNlcmlhbGl6ZXJzRnJvbVNjaGVtYS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL2NsaXBib2FyZFRleHRTZXJpYWxpemVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2JsdXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvY2xlYXJDb250ZW50LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2NsZWFyTm9kZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9jcmVhdGVQYXJhZ3JhcGhOZWFyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2N1dC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9kZWxldGVDdXJyZW50Tm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9kZWxldGVOb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2RlbGV0ZVJhbmdlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2RlbGV0ZVNlbGVjdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9lbnRlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9leGl0Q29kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvb2JqZWN0SW5jbHVkZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRNYXJrUmFuZ2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRNYXJrVHlwZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9leHRlbmRNYXJrUmFuZ2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvZmlyc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc1RleHRTZWxlY3Rpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL21pbk1heC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL3Jlc29sdmVGb2N1c1Bvc2l0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc2lPUy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9mb2N1cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9mb3JFYWNoLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2luc2VydENvbnRlbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2VsZW1lbnRGcm9tU3RyaW5nLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY3JlYXRlTm9kZUZyb21Db250ZW50LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvaW5zZXJ0Q29udGVudEF0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2pvaW4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvam9pbkl0ZW1CYWNrd2FyZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9qb2luSXRlbUZvcndhcmQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2lzTWFjT1MudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMva2V5Ym9hcmRTaG9ydGN1dC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2lzTm9kZUFjdGl2ZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9saWZ0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2xpZnRFbXB0eUJsb2NrLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL2xpZnRMaXN0SXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9uZXdsaW5lSW5Db2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL2RlbGV0ZVByb3BzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3Jlc2V0QXR0cmlidXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zY3JvbGxJbnRvVmlldy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zZWxlY3RBbGwudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2VsZWN0Tm9kZUJhY2t3YXJkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NlbGVjdE5vZGVGb3J3YXJkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NlbGVjdFBhcmVudE5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2VsZWN0VGV4dGJsb2NrRW5kLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NlbGVjdFRleHRibG9ja1N0YXJ0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY3JlYXRlRG9jdW1lbnQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2V0Q29udGVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldE1hcmtBdHRyaWJ1dGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvY29tYmluZVRyYW5zYWN0aW9uU3RlcHMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9kZWZhdWx0QmxvY2tBdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2ZpbmRDaGlsZHJlbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2ZpbmRDaGlsZHJlbkluUmFuZ2UudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9maW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1Bvcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2ZpbmRQYXJlbnROb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0SFRNTEZyb21GcmFnbWVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFNjaGVtYS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dlbmVyYXRlSFRNTC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dlbmVyYXRlSlNPTi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldFRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZW5lcmF0ZVRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXROb2RlQXR0cmlidXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2dldEF0dHJpYnV0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvdXRpbGl0aWVzL3JlbW92ZUR1cGxpY2F0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRDaGFuZ2VkUmFuZ2VzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0RGVidWdKU09OLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0TWFya3NCZXR3ZWVuLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2hlbHBlcnMvZ2V0Tm9kZUF0UG9zaXRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9nZXRTcGxpdHRlZEF0dHJpYnV0ZXMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc01hcmtBY3RpdmUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0FjdGl2ZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2lzQXRFbmRPZk5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0F0U3RhcnRPZk5vZGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc0xpc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaGVscGVycy9pc05vZGVFbXB0eS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL2lzTm9kZVNlbGVjdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9oZWxwZXJzL3Bvc1RvRE9NUmVjdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zZXRNYXJrLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NldE1ldGEudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2V0Tm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy9zZXROb2RlU2VsZWN0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NldFRleHRTZWxlY3Rpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc2lua0xpc3RJdGVtLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3NwbGl0QmxvY2sudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvc3BsaXRMaXN0SXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy90b2dnbGVMaXN0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3RvZ2dsZU1hcmsudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvdG9nZ2xlTm9kZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy90b2dnbGVXcmFwLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2NvbW1hbmRzL3VuZG9JbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvdW5zZXRBbGxNYXJrcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy91bnNldE1hcmsudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvdXBkYXRlQXR0cmlidXRlcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9jb21tYW5kcy93cmFwSW4udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvY29tbWFuZHMvd3JhcEluTGlzdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL2NvbW1hbmRzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2V4dGVuc2lvbnMvZWRpdGFibGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvZXh0ZW5zaW9ucy9mb2N1c0V2ZW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL2tleW1hcC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9leHRlbnNpb25zL3RhYmluZGV4LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3N0eWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9jcmVhdGVTdHlsZVRhZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9FZGl0b3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaW5wdXRSdWxlcy9tYXJrSW5wdXRSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2lucHV0UnVsZXMvbm9kZUlucHV0UnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9pbnB1dFJ1bGVzL3RleHRibG9ja1R5cGVJbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvaW5wdXRSdWxlcy90ZXh0SW5wdXRSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL2lucHV0UnVsZXMvd3JhcHBpbmdJbnB1dFJ1bGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvTWFyay50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9Ob2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9pc0FuZHJvaWQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvTm9kZVZpZXcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvcGFzdGVSdWxlcy9tYXJrUGFzdGVSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3V0aWxpdGllcy9lc2NhcGVGb3JSZWdFeC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy91dGlsaXRpZXMvaXNTdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvY29yZS9zcmMvcGFzdGVSdWxlcy9ub2RlUGFzdGVSdWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2NvcmUvc3JjL3Bhc3RlUnVsZXMvdGV4dFBhc3RlUnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9jb3JlL3NyYy9UcmFja2VyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1ibG9ja3F1b3RlL3NyYy9ibG9ja3F1b3RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1ib2xkL3NyYy9ib2xkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saXN0LWl0ZW0vc3JjL2xpc3QtaXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGV4dC1zdHlsZS9zcmMvdGV4dC1zdHlsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tYnVsbGV0LWxpc3Qvc3JjL2J1bGxldC1saXN0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1jb2RlL3NyYy9jb2RlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10ZXh0LXN0eWxlL3NyYy90ZXh0LXN0eWxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1jb2xvci9zcmMvY29sb3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWRvY3VtZW50L3NyYy9kb2N1bWVudC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItZHJvcGN1cnNvci9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1kcm9wY3Vyc29yL3NyYy9kcm9wY3Vyc29yLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1nYXBjdXJzb3IvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tZ2FwY3Vyc29yL3NyYy9nYXBjdXJzb3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWhhcmQtYnJlYWsvc3JjL2hhcmQtYnJlYWsudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWhlYWRpbmcvc3JjL2hlYWRpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3JvcGUtc2VxdWVuY2UvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItaGlzdG9yeS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1oaXN0b3J5L3NyYy9oaXN0b3J5LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1ob3Jpem9udGFsLXJ1bGUvc3JjL2hvcml6b250YWwtcnVsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24taXRhbGljL3NyYy9pdGFsaWMudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWxpc3QtaXRlbS9zcmMvbGlzdC1pdGVtLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saXN0LWl0ZW0vc3JjL2xpc3QtaXRlbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGV4dC1zdHlsZS9zcmMvdGV4dC1zdHlsZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tb3JkZXJlZC1saXN0L3NyYy9vcmRlcmVkLWxpc3QudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXBhcmFncmFwaC9zcmMvcGFyYWdyYXBoLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1wbGFjZWhvbGRlci9zcmMvcGxhY2Vob2xkZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXN0cmlrZS9zcmMvc3RyaWtlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1zdWJzY3JpcHQvc3JjL3N1YnNjcmlwdC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tc3VwZXJzY3JpcHQvc3JjL3N1cGVyc2NyaXB0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci10YWJsZXMvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGFibGUvc3JjL1RhYmxlVmlldy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGFibGUvc3JjL3V0aWxpdGllcy9jcmVhdGVDZWxsLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdXRpbGl0aWVzL2dldFRhYmxlTm9kZVR5cGVzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdXRpbGl0aWVzL2NyZWF0ZVRhYmxlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdXRpbGl0aWVzL2lzQ2VsbFNlbGVjdGlvbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGFibGUvc3JjL3V0aWxpdGllcy9kZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS9zcmMvdGFibGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWNlbGwvc3JjL3RhYmxlLWNlbGwudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWhlYWRlci9zcmMvdGFibGUtaGVhZGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1yb3cvc3JjL3RhYmxlLXJvdy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdGV4dC9zcmMvdGV4dC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lL3NyYy91bmRlcmxpbmUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWhpZ2hsaWdodC9zcmMvaGlnaGxpZ2h0LnRzIiwgIi4uL2pzL2V4dGVuc2lvbnMvQ2hlY2tlZExpc3QuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9MZWFkLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9saW5raWZ5anMvZGlzdC9saW5raWZ5LmVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saW5rL3NyYy9oZWxwZXJzL2F1dG9saW5rLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1saW5rL3NyYy9oZWxwZXJzL2NsaWNrSGFuZGxlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tbGluay9zcmMvaGVscGVycy9wYXN0ZUhhbmRsZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWxpbmsvc3JjL2xpbmsudHMiLCAiLi4vanMvZXh0ZW5zaW9ucy9MaW5rLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdGlwdGFwL2V4dGVuc2lvbi1pbWFnZS9zcmMvaW1hZ2UudHMiLCAiLi4vanMvZXh0ZW5zaW9ucy9JbWFnZS5qcyIsICIuLi9qcy9leHRlbnNpb25zL1BhcmFncmFwaC5qcyIsICIuLi9qcy9leHRlbnNpb25zL1NtYWxsLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvR3JpZC91dGlscy9jcmVhdGVDb2x1bW4uanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL3V0aWxzL2dldEdyaWROb2RlVHlwZXMuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL3V0aWxzL2NyZWF0ZUdyaWQuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL0dyaWQuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkL0dyaWRDb2x1bW4uanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9Zb3V0dWJlL3V0aWxzLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvWW91dHViZS9Zb3V0dWJlLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvVmltZW8vdXRpbHMuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9WaW1lby9WaW1lby5qcyIsICIuLi9qcy9leHRlbnNpb25zL1ZpZGVvLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvRGV0YWlscy9EZXRhaWxzLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvRGV0YWlscy9EZXRhaWxzU3VtbWFyeS5qcyIsICIuLi9qcy9leHRlbnNpb25zL0RldGFpbHMvRGV0YWlsc0NvbnRlbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2svc3JjL2NvZGUtYmxvY2sudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvbGliL2NvcmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2stbG93bGlnaHQvc3JjL2xvd2xpZ2h0LXBsdWdpbi50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jay1sb3dsaWdodC9zcmMvY29kZS1ibG9jay1sb3dsaWdodC50cyIsICIuLi9qcy9leHRlbnNpb25zL0NvZGVCbG9jay5qcyIsICIuLi9qcy9leHRlbnNpb25zL0h1cmRsZS5qcyIsICIuLi9qcy9leHRlbnNpb25zL0N1c3RvbVRleHRBbGlnbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVOYW1lLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy91c2VyQWdlbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNMYXlvdXRWaWV3cG9ydC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21lcmdlUGFkZGluZ09iamVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcnJvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldFZhcmlhdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzU2Nyb2xsUGFyZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvY29tcHV0ZU9mZnNldHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2ZsaXAuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvaGlkZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEFsdEF4aXMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGVib3VuY2UuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2NyZWF0ZVBvcHBlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL2NvbnN0YW50cy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL3V0aWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvZG9tLXV0aWxzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvYmluZEdsb2JhbEV2ZW50TGlzdGVuZXJzLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvYnJvd3Nlci50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL3ZhbGlkYXRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9wcm9wcy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL3RlbXBsYXRlLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvY3JlYXRlVGlwcHkudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdGlwcHkuanMvc3JjL2FkZG9ucy9jcmVhdGVTaW5nbGV0b24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9hZGRvbnMvZGVsZWdhdGUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9wbHVnaW5zL2FuaW1hdGVGaWxsLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvcGx1Z2lucy9mb2xsb3dDdXJzb3IudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL3NyYy9wbHVnaW5zL2lubGluZVBvc2l0aW9uaW5nLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy90aXBweS5qcy9zcmMvcGx1Z2lucy9zdGlja3kudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3RpcHB5LmpzL2J1aWxkL2Jhc2UuanMiLCAiLi4vanMvcGx1Z2lucy9CdWJibGVNZW51UGx1Z2luLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvQnViYmxlTWVudS5qcyIsICIuLi9qcy9wbHVnaW5zL0Zsb2F0aW5nTWVudVBsdWdpbi5qcyIsICIuLi9qcy9leHRlbnNpb25zL0Zsb2F0aW5nTWVudS5qcyIsICIuLi9qcy9leHRlbnNpb25zL0dyaWRCdWlsZGVyL3V0aWxzL2NyZWF0ZUJ1aWxkZXJDb2x1bW4uanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkQnVpbGRlci91dGlscy9nZXRHcmlkQnVpbGRlck5vZGVUeXBlcy5qcyIsICIuLi9qcy9leHRlbnNpb25zL0dyaWRCdWlsZGVyL3V0aWxzL2NyZWF0ZUdyaWRCdWlsZGVyLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvR3JpZEJ1aWxkZXIvR3JpZEJ1aWxkZXIuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9HcmlkQnVpbGRlci9HcmlkQnVpbGRlckNvbHVtbi5qcyIsICIuLi9qcy9leHRlbnNpb25zL0RyYWdBbmREcm9wLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvVGlwdGFwQmxvY2suanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0aXB0YXAvc3VnZ2VzdGlvbi9zcmMvZmluZFN1Z2dlc3Rpb25NYXRjaC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRpcHRhcC9zdWdnZXN0aW9uL3NyYy9zdWdnZXN0aW9uLnRzIiwgIi4uL2pzL2V4dGVuc2lvbnMvTWVyZ2VUYWcuanMiLCAiLi4vanMvZXh0ZW5zaW9ucy9DbGFzc0V4dGVuc2lvbi5qcyIsICIuLi9qcy9leHRlbnNpb25zL0lkRXh0ZW5zaW9uLmpzIiwgIi4uL2pzL2V4dGVuc2lvbnMvU3R5bGVFeHRlbnNpb24uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2FyZHVpbm8uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2Jhc2guanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2NwcC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvY3NoYXJwLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9jc3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2RpZmYuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2dvLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9ncmFwaHFsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9pbmkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2phdmEuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2phdmFzY3JpcHQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2pzb24uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL2tvdGxpbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvbGVzcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvbHVhLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9tYWtlZmlsZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvbWFya2Rvd24uanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL29iamVjdGl2ZWMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3BlcmwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3BocC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvcGhwLXRlbXBsYXRlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9wbGFpbnRleHQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3B5dGhvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvcHl0aG9uLXJlcGwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3IuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3J1YnkuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3J1c3QuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3Njc3MuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3NoZWxsLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy9zcWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2xvd2xpZ2h0L25vZGVfbW9kdWxlcy9oaWdobGlnaHQuanMvZXMvbGFuZ3VhZ2VzL3N3aWZ0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy90eXBlc2NyaXB0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy92Ym5ldC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMvd2FzbS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbm9kZV9tb2R1bGVzL2hpZ2hsaWdodC5qcy9lcy9sYW5ndWFnZXMveG1sLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2xhbmd1YWdlcy95YW1sLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9ub2RlX21vZHVsZXMvaGlnaGxpZ2h0LmpzL2VzL2NvcmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2ZhdWx0L2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9sb3dsaWdodC9saWIvY29yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvbG93bGlnaHQvbGliL2NvbW1vbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL3V0aWxzL21hdGgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi91dGlscy9jb252ZXJ0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvdXRpbHMvY29tcGFyZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL3V0aWxzL2RvbS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL2NvbXBvbmVudHMvc2xpZGVyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvY29tcG9uZW50cy9odWUudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi9jb21wb25lbnRzL3NhdHVyYXRpb24udHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi9zdHlsZXMvY29sb3ItcGlja2VyLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvc3R5bGVzL2h1ZS50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvdmFuaWxsYS1jb2xvcmZ1bC9zcmMvbGliL3N0eWxlcy9zYXR1cmF0aW9uLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy92YW5pbGxhLWNvbG9yZnVsL3NyYy9saWIvY29tcG9uZW50cy9jb2xvci1waWNrZXIudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ZhbmlsbGEtY29sb3JmdWwvc3JjL2xpYi9lbnRyeXBvaW50cy9oZXgudHMiLCAiLi4vanMvcGx1Z2luLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1hc3NpZ24gKi9cblxuZnVuY3Rpb24gZGVlcEZyZWV6ZShvYmopIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIG9iai5jbGVhciA9XG4gICAgICBvYmouZGVsZXRlID1cbiAgICAgIG9iai5zZXQgPVxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXAgaXMgcmVhZC1vbmx5Jyk7XG4gICAgICAgIH07XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgb2JqLmFkZCA9XG4gICAgICBvYmouY2xlYXIgPVxuICAgICAgb2JqLmRlbGV0ZSA9XG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldCBpcyByZWFkLW9ubHknKTtcbiAgICAgICAgfTtcbiAgfVxuXG4gIC8vIEZyZWV6ZSBzZWxmXG4gIE9iamVjdC5mcmVlemUob2JqKTtcblxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICBjb25zdCBwcm9wID0gb2JqW25hbWVdO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgcHJvcDtcblxuICAgIC8vIEZyZWV6ZSBwcm9wIGlmIGl0IGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiBhbmQgYWxzbyBub3QgYWxyZWFkeSBmcm96ZW5cbiAgICBpZiAoKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdmdW5jdGlvbicpICYmICFPYmplY3QuaXNGcm96ZW4ocHJvcCkpIHtcbiAgICAgIGRlZXBGcmVlemUocHJvcCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gb2JqO1xufVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ2FsbGJhY2tSZXNwb25zZX0gQ2FsbGJhY2tSZXNwb25zZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlICovXG4vKiogQGltcGxlbWVudHMgQ2FsbGJhY2tSZXNwb25zZSAqL1xuXG5jbGFzcyBSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgICBpZiAobW9kZS5kYXRhID09PSB1bmRlZmluZWQpIG1vZGUuZGF0YSA9IHt9O1xuXG4gICAgdGhpcy5kYXRhID0gbW9kZS5kYXRhO1xuICAgIHRoaXMuaXNNYXRjaElnbm9yZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlnbm9yZU1hdGNoKCkge1xuICAgIHRoaXMuaXNNYXRjaElnbm9yZWQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgLnJlcGxhY2UoLycvZywgJyYjeDI3OycpO1xufVxuXG4vKipcbiAqIHBlcmZvcm1zIGEgc2hhbGxvdyBtZXJnZSBvZiBtdWx0aXBsZSBvYmplY3RzIGludG8gb25lXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZyxhbnk+W119IG9iamVjdHNcbiAqIEByZXR1cm5zIHtUfSBhIHNpbmdsZSBuZXcgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGluaGVyaXQkMShvcmlnaW5hbCwgLi4ub2JqZWN0cykge1xuICAvKiogQHR5cGUgUmVjb3JkPHN0cmluZyxhbnk+ICovXG4gIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb3JpZ2luYWwpIHtcbiAgICByZXN1bHRba2V5XSA9IG9yaWdpbmFsW2tleV07XG4gIH1cbiAgb2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtUfSAqLyAocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZW5kZXJlclxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nKSA9PiB2b2lkfSBhZGRUZXh0XG4gKiBAcHJvcGVydHkgeyhub2RlOiBOb2RlKSA9PiB2b2lkfSBvcGVuTm9kZVxuICogQHByb3BlcnR5IHsobm9kZTogTm9kZSkgPT4gdm9pZH0gY2xvc2VOb2RlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gdmFsdWVcbiAqL1xuXG4vKiogQHR5cGVkZWYge3tzY29wZT86IHN0cmluZywgbGFuZ3VhZ2U/OiBzdHJpbmcsIHN1Ymxhbmd1YWdlPzogYm9vbGVhbn19IE5vZGUgKi9cbi8qKiBAdHlwZWRlZiB7e3dhbGs6IChyOiBSZW5kZXJlcikgPT4gdm9pZH19IFRyZWUgKi9cbi8qKiAqL1xuXG5jb25zdCBTUEFOX0NMT1NFID0gJzwvc3Bhbj4nO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBub2RlIG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gPHNwYW4+XG4gKlxuICogQHBhcmFtIHtOb2RlfSBub2RlICovXG5jb25zdCBlbWl0c1dyYXBwaW5nVGFncyA9IChub2RlKSA9PiB7XG4gIC8vIHJhcmVseSB3ZSBjYW4gaGF2ZSBhIHN1Ymxhbmd1YWdlIHdoZXJlIGxhbmd1YWdlIGlzIHVuZGVmaW5lZFxuICAvLyBUT0RPOiB0cmFjayBkb3duIHdoeVxuICByZXR1cm4gISFub2RlLnNjb3BlO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7e3ByZWZpeDpzdHJpbmd9fSBvcHRpb25zXG4gKi9cbmNvbnN0IHNjb3BlVG9DU1NDbGFzcyA9IChuYW1lLCB7IHByZWZpeCB9KSA9PiB7XG4gIC8vIHN1Yi1sYW5ndWFnZVxuICBpZiAobmFtZS5zdGFydHNXaXRoKFwibGFuZ3VhZ2U6XCIpKSB7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZShcImxhbmd1YWdlOlwiLCBcImxhbmd1YWdlLVwiKTtcbiAgfVxuICAvLyB0aWVyZWQgc2NvcGU6IGNvbW1lbnQubGluZVxuICBpZiAobmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICBjb25zdCBwaWVjZXMgPSBuYW1lLnNwbGl0KFwiLlwiKTtcbiAgICByZXR1cm4gW1xuICAgICAgYCR7cHJlZml4fSR7cGllY2VzLnNoaWZ0KCl9YCxcbiAgICAgIC4uLihwaWVjZXMubWFwKCh4LCBpKSA9PiBgJHt4fSR7XCJfXCIucmVwZWF0KGkgKyAxKX1gKSlcbiAgICBdLmpvaW4oXCIgXCIpO1xuICB9XG4gIC8vIHNpbXBsZSBzY29wZVxuICByZXR1cm4gYCR7cHJlZml4fSR7bmFtZX1gO1xufTtcblxuLyoqIEB0eXBlIHtSZW5kZXJlcn0gKi9cbmNsYXNzIEhUTUxSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEhUTUxSZW5kZXJlclxuICAgKlxuICAgKiBAcGFyYW0ge1RyZWV9IHBhcnNlVHJlZSAtIHRoZSBwYXJzZSB0cmVlIChtdXN0IHN1cHBvcnQgYHdhbGtgIEFQSSlcbiAgICogQHBhcmFtIHt7Y2xhc3NQcmVmaXg6IHN0cmluZ319IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcnNlVHJlZSwgb3B0aW9ucykge1xuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcbiAgICB0aGlzLmNsYXNzUHJlZml4ID0gb3B0aW9ucy5jbGFzc1ByZWZpeDtcbiAgICBwYXJzZVRyZWUud2Fsayh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRleHRzIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0ICovXG4gIGFkZFRleHQodGV4dCkge1xuICAgIHRoaXMuYnVmZmVyICs9IGVzY2FwZUhUTUwodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgb3BlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSAoaWYgbmVlZGVkKVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgKi9cbiAgb3Blbk5vZGUobm9kZSkge1xuICAgIGlmICghZW1pdHNXcmFwcGluZ1RhZ3Mobm9kZSkpIHJldHVybjtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHNjb3BlVG9DU1NDbGFzcyhub2RlLnNjb3BlLFxuICAgICAgeyBwcmVmaXg6IHRoaXMuY2xhc3NQcmVmaXggfSk7XG4gICAgdGhpcy5zcGFuKGNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgY2xvc2UgdG8gdGhlIG91dHB1dCBzdHJlYW0gKGlmIG5lZWRlZClcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGNsb3NlTm9kZShub2RlKSB7XG4gICAgaWYgKCFlbWl0c1dyYXBwaW5nVGFncyhub2RlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5idWZmZXIgKz0gU1BBTl9DTE9TRTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCBidWZmZXJcbiAgKi9cbiAgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLy8gaGVscGVyc1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzcGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAqL1xuICBzcGFuKGNsYXNzTmFtZSkge1xuICAgIHRoaXMuYnVmZmVyICs9IGA8c3BhbiBjbGFzcz1cIiR7Y2xhc3NOYW1lfVwiPmA7XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHt7c2NvcGU/OiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nLCBzdWJsYW5ndWFnZT86IGJvb2xlYW4sIGNoaWxkcmVuOiBOb2RlW119IHwgc3RyaW5nfSBOb2RlICovXG4vKiogQHR5cGVkZWYge3tzY29wZT86IHN0cmluZywgbGFuZ3VhZ2U/OiBzdHJpbmcsIHN1Ymxhbmd1YWdlPzogYm9vbGVhbiwgY2hpbGRyZW46IE5vZGVbXX0gfSBEYXRhTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkVtaXR0ZXJ9IEVtaXR0ZXIgKi9cbi8qKiAgKi9cblxuLyoqIEByZXR1cm5zIHtEYXRhTm9kZX0gKi9cbmNvbnN0IG5ld05vZGUgPSAob3B0cyA9IHt9KSA9PiB7XG4gIC8qKiBAdHlwZSBEYXRhTm9kZSAqL1xuICBjb25zdCByZXN1bHQgPSB7IGNoaWxkcmVuOiBbXSB9O1xuICBPYmplY3QuYXNzaWduKHJlc3VsdCwgb3B0cyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jbGFzcyBUb2tlblRyZWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKiogQHR5cGUgRGF0YU5vZGUgKi9cbiAgICB0aGlzLnJvb3ROb2RlID0gbmV3Tm9kZSgpO1xuICAgIHRoaXMuc3RhY2sgPSBbdGhpcy5yb290Tm9kZV07XG4gIH1cblxuICBnZXQgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gIH1cblxuICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMucm9vdE5vZGU7IH1cblxuICAvKiogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGFkZChub2RlKSB7XG4gICAgdGhpcy50b3AuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgKi9cbiAgb3Blbk5vZGUoc2NvcGUpIHtcbiAgICAvKiogQHR5cGUgTm9kZSAqL1xuICAgIGNvbnN0IG5vZGUgPSBuZXdOb2RlKHsgc2NvcGUgfSk7XG4gICAgdGhpcy5hZGQobm9kZSk7XG4gICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xuICB9XG5cbiAgY2xvc2VOb2RlKCkge1xuICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsb3NlQWxsTm9kZXMoKSB7XG4gICAgd2hpbGUgKHRoaXMuY2xvc2VOb2RlKCkpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3ROb2RlLCBudWxsLCA0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vaHRtbF9yZW5kZXJlclwiKS5SZW5kZXJlciB9IFJlbmRlcmVyXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IGJ1aWxkZXJcbiAgICovXG4gIHdhbGsoYnVpbGRlcikge1xuICAgIC8vIHRoaXMgZG9lcyBub3RcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgICAvLyB0aGlzIHdvcmtzXG4gICAgLy8gcmV0dXJuIFRva2VuVHJlZS5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSBidWlsZGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKi9cbiAgc3RhdGljIF93YWxrKGJ1aWxkZXIsIG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGJ1aWxkZXIuYWRkVGV4dChub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGJ1aWxkZXIub3Blbk5vZGUobm9kZSk7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLl93YWxrKGJ1aWxkZXIsIGNoaWxkKSk7XG4gICAgICBidWlsZGVyLmNsb3NlTm9kZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqL1xuICBzdGF0aWMgX2NvbGxhcHNlKG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHJldHVybjtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHJldHVybjtcblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmV2ZXJ5KGVsID0+IHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIC8vIG5vZGUudGV4dCA9IG5vZGUuY2hpbGRyZW4uam9pbihcIlwiKTtcbiAgICAgIC8vIGRlbGV0ZSBub2RlLmNoaWxkcmVuO1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IFtub2RlLmNoaWxkcmVuLmpvaW4oXCJcIildO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIFRva2VuVHJlZS5fY29sbGFwc2UoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICBDdXJyZW50bHkgdGhpcyBpcyBhbGwgcHJpdmF0ZSBBUEksIGJ1dCB0aGlzIGlzIHRoZSBtaW5pbWFsIEFQSSBuZWNlc3NhcnlcbiAgdGhhdCBhbiBFbWl0dGVyIG11c3QgaW1wbGVtZW50IHRvIGZ1bGx5IHN1cHBvcnQgdGhlIHBhcnNlci5cblxuICBNaW5pbWFsIGludGVyZmFjZTpcblxuICAtIGFkZFRleHQodGV4dClcbiAgLSBfX2FkZFN1Ymxhbmd1YWdlKGVtaXR0ZXIsIHN1Ykxhbmd1YWdlTmFtZSlcbiAgLSBzdGFydFNjb3BlKHNjb3BlKVxuICAtIGVuZFNjb3BlKClcbiAgLSBmaW5hbGl6ZSgpXG4gIC0gdG9IVE1MKClcblxuKi9cblxuLyoqXG4gKiBAaW1wbGVtZW50cyB7RW1pdHRlcn1cbiAqL1xuY2xhc3MgVG9rZW5UcmVlRW1pdHRlciBleHRlbmRzIFRva2VuVHJlZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICovXG4gIGFkZFRleHQodGV4dCkge1xuICAgIGlmICh0ZXh0ID09PSBcIlwiKSB7IHJldHVybjsgfVxuXG4gICAgdGhpcy5hZGQodGV4dCk7XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IHNjb3BlICovXG4gIHN0YXJ0U2NvcGUoc2NvcGUpIHtcbiAgICB0aGlzLm9wZW5Ob2RlKHNjb3BlKTtcbiAgfVxuXG4gIGVuZFNjb3BlKCkge1xuICAgIHRoaXMuY2xvc2VOb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbWl0dGVyICYge3Jvb3Q6IERhdGFOb2RlfX0gZW1pdHRlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgX19hZGRTdWJsYW5ndWFnZShlbWl0dGVyLCBuYW1lKSB7XG4gICAgLyoqIEB0eXBlIERhdGFOb2RlICovXG4gICAgY29uc3Qgbm9kZSA9IGVtaXR0ZXIucm9vdDtcbiAgICBpZiAobmFtZSkgbm9kZS5zY29wZSA9IGBsYW5ndWFnZToke25hbWV9YDtcblxuICAgIHRoaXMuYWRkKG5vZGUpO1xuICB9XG5cbiAgdG9IVE1MKCkge1xuICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IEhUTUxSZW5kZXJlcih0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHJldHVybiByZW5kZXJlci52YWx1ZSgpO1xuICB9XG5cbiAgZmluYWxpemUoKSB7XG4gICAgdGhpcy5jbG9zZUFsbE5vZGVzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtSZWdFeHB9XG4gKiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHNvdXJjZShyZSkge1xuICBpZiAoIXJlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiByZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHJlO1xuXG4gIHJldHVybiByZS5zb3VyY2U7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmcgfSByZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gbG9va2FoZWFkKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/PScsIHJlLCAnKScpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGFueU51bWJlck9mVGltZXMocmUpIHtcbiAgcmV0dXJuIGNvbmNhdCgnKD86JywgcmUsICcpKicpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9wdGlvbmFsKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/OicsIHJlLCAnKT8nKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLihSZWdFeHAgfCBzdHJpbmcpIH0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29uY2F0KC4uLmFyZ3MpIHtcbiAgY29uc3Qgam9pbmVkID0gYXJncy5tYXAoKHgpID0+IHNvdXJjZSh4KSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBBcnJheTxzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3Q+IH0gYXJnc1xuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncykge1xuICBjb25zdCBvcHRzID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcgJiYgb3B0cy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgYXJncy5zcGxpY2UoYXJncy5sZW5ndGggLSAxLCAxKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHsge2NhcHR1cmU/OiBib29sZWFufSB9IFJlZ2V4RWl0aGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIEFueSBvZiB0aGUgcGFzc2VkIGV4cHJlc3NzaW9ucyBtYXkgbWF0Y2hcbiAqXG4gKiBDcmVhdGVzIGEgaHVnZSB0aGlzIHwgdGhpcyB8IHRoYXQgfCB0aGF0IG1hdGNoXG4gKiBAcGFyYW0geyhSZWdFeHAgfCBzdHJpbmcpW10gfCBbLi4uKFJlZ0V4cCB8IHN0cmluZylbXSwgUmVnZXhFaXRoZXJPcHRpb25zXX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZWl0aGVyKC4uLmFyZ3MpIHtcbiAgLyoqIEB0eXBlIHsgb2JqZWN0ICYge2NhcHR1cmU/OiBib29sZWFufSB9ICAqL1xuICBjb25zdCBvcHRzID0gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncyk7XG4gIGNvbnN0IGpvaW5lZCA9ICcoJ1xuICAgICsgKG9wdHMuY2FwdHVyZSA/IFwiXCIgOiBcIj86XCIpXG4gICAgKyBhcmdzLm1hcCgoeCkgPT4gc291cmNlKHgpKS5qb2luKFwifFwiKSArIFwiKVwiO1xuICByZXR1cm4gam9pbmVkO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nfSByZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gY291bnRNYXRjaEdyb3VwcyhyZSkge1xuICByZXR1cm4gKG5ldyBSZWdFeHAocmUudG9TdHJpbmcoKSArICd8JykpLmV4ZWMoJycpLmxlbmd0aCAtIDE7XG59XG5cbi8qKlxuICogRG9lcyBsZXhlbWUgc3RhcnQgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZXhlbWVcbiAqL1xuZnVuY3Rpb24gc3RhcnRzV2l0aChyZSwgbGV4ZW1lKSB7XG4gIGNvbnN0IG1hdGNoID0gcmUgJiYgcmUuZXhlYyhsZXhlbWUpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2guaW5kZXggPT09IDA7XG59XG5cbi8vIEJBQ0tSRUZfUkUgbWF0Y2hlcyBhbiBvcGVuIHBhcmVudGhlc2lzIG9yIGJhY2tyZWZlcmVuY2UuIFRvIGF2b2lkXG4vLyBhbiBpbmNvcnJlY3QgcGFyc2UsIGl0IGFkZGl0aW9uYWxseSBtYXRjaGVzIHRoZSBmb2xsb3dpbmc6XG4vLyAtIFsuLi5dIGVsZW1lbnRzLCB3aGVyZSB0aGUgbWVhbmluZyBvZiBwYXJlbnRoZXNlcyBhbmQgZXNjYXBlcyBjaGFuZ2Vcbi8vIC0gb3RoZXIgZXNjYXBlIHNlcXVlbmNlcywgc28gd2UgZG8gbm90IG1pc3BhcnNlIGVzY2FwZSBzZXF1ZW5jZXMgYXNcbi8vICAgaW50ZXJlc3RpbmcgZWxlbWVudHNcbi8vIC0gbm9uLW1hdGNoaW5nIG9yIGxvb2thaGVhZCBwYXJlbnRoZXNlcywgd2hpY2ggZG8gbm90IGNhcHR1cmUuIFRoZXNlXG4vLyAgIGZvbGxvdyB0aGUgJygnIHdpdGggYSAnPycuXG5jb25zdCBCQUNLUkVGX1JFID0gL1xcWyg/OlteXFxcXFxcXV18XFxcXC4pKlxcXXxcXChcXD8/fFxcXFwoWzEtOV1bMC05XSopfFxcXFwuLztcblxuLy8gKipJTlRFUk5BTCoqIE5vdCBpbnRlbmRlZCBmb3Igb3V0c2lkZSB1c2FnZVxuLy8gam9pbiBsb2dpY2FsbHkgY29tcHV0ZXMgcmVnZXhwcy5qb2luKHNlcGFyYXRvciksIGJ1dCBmaXhlcyB0aGVcbi8vIGJhY2tyZWZlcmVuY2VzIHNvIHRoZXkgY29udGludWUgdG8gbWF0Y2guXG4vLyBpdCBhbHNvIHBsYWNlcyBlYWNoIGluZGl2aWR1YWwgcmVndWxhciBleHByZXNzaW9uIGludG8gaXQncyBvd25cbi8vIG1hdGNoIGdyb3VwLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzZXF1ZW5jaW5nIG9mIHRob3NlIG1hdGNoIGdyb3Vwc1xuLy8gaXMgY3VycmVudGx5IGFuIGV4ZXJjaXNlIGZvciB0aGUgY2FsbGVyLiA6LSlcbi8qKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgUmVnRXhwKVtdfSByZWdleHBzXG4gKiBAcGFyYW0ge3tqb2luV2l0aDogc3RyaW5nfX0gb3B0c1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhyZWdleHBzLCB7IGpvaW5XaXRoIH0pIHtcbiAgbGV0IG51bUNhcHR1cmVzID0gMDtcblxuICByZXR1cm4gcmVnZXhwcy5tYXAoKHJlZ2V4KSA9PiB7XG4gICAgbnVtQ2FwdHVyZXMgKz0gMTtcbiAgICBjb25zdCBvZmZzZXQgPSBudW1DYXB0dXJlcztcbiAgICBsZXQgcmUgPSBzb3VyY2UocmVnZXgpO1xuICAgIGxldCBvdXQgPSAnJztcblxuICAgIHdoaWxlIChyZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IEJBQ0tSRUZfUkUuZXhlYyhyZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG91dCArPSByZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvdXQgKz0gcmUuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgIHJlID0gcmUuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgIGlmIChtYXRjaFswXVswXSA9PT0gJ1xcXFwnICYmIG1hdGNoWzFdKSB7XG4gICAgICAgIC8vIEFkanVzdCB0aGUgYmFja3JlZmVyZW5jZS5cbiAgICAgICAgb3V0ICs9ICdcXFxcJyArIFN0cmluZyhOdW1iZXIobWF0Y2hbMV0pICsgb2Zmc2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSBtYXRjaFswXTtcbiAgICAgICAgaWYgKG1hdGNoWzBdID09PSAnKCcpIHtcbiAgICAgICAgICBudW1DYXB0dXJlcysrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH0pLm1hcChyZSA9PiBgKCR7cmV9KWApLmpvaW4oam9pbldpdGgpO1xufVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLk1vZGVDYWxsYmFja30gTW9kZUNhbGxiYWNrICovXG5cbi8vIENvbW1vbiByZWdleHBzXG5jb25zdCBNQVRDSF9OT1RISU5HX1JFID0gL1xcYlxcQi87XG5jb25zdCBJREVOVF9SRSA9ICdbYS16QS1aXVxcXFx3Kic7XG5jb25zdCBVTkRFUlNDT1JFX0lERU5UX1JFID0gJ1thLXpBLVpfXVxcXFx3Kic7XG5jb25zdCBOVU1CRVJfUkUgPSAnXFxcXGJcXFxcZCsoXFxcXC5cXFxcZCspPyc7XG5jb25zdCBDX05VTUJFUl9SRSA9ICcoLT8pKFxcXFxiMFt4WF1bYS1mQS1GMC05XSt8KFxcXFxiXFxcXGQrKFxcXFwuXFxcXGQqKT98XFxcXC5cXFxcZCspKFtlRV1bLStdP1xcXFxkKyk/KSc7IC8vIDB4Li4uLCAwLi4uLCBkZWNpbWFsLCBmbG9hdFxuY29uc3QgQklOQVJZX05VTUJFUl9SRSA9ICdcXFxcYigwYlswMV0rKSc7IC8vIDBiLi4uXG5jb25zdCBSRV9TVEFSVEVSU19SRSA9ICchfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFxcXCp8XFxcXCo9fFxcXFwrfFxcXFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFxcXD98XFxcXFt8XFxcXHt8XFxcXCh8XFxcXF58XFxcXF49fFxcXFx8fFxcXFx8PXxcXFxcfFxcXFx8fH4nO1xuXG4vKipcbiogQHBhcmFtIHsgUGFydGlhbDxNb2RlPiAmIHtiaW5hcnk/OiBzdHJpbmcgfCBSZWdFeHB9IH0gb3B0c1xuKi9cbmNvbnN0IFNIRUJBTkcgPSAob3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IGJlZ2luU2hlYmFuZyA9IC9eIyFbIF0qXFwvLztcbiAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgb3B0cy5iZWdpbiA9IGNvbmNhdChcbiAgICAgIGJlZ2luU2hlYmFuZyxcbiAgICAgIC8uKlxcYi8sXG4gICAgICBvcHRzLmJpbmFyeSxcbiAgICAgIC9cXGIuKi8pO1xuICB9XG4gIHJldHVybiBpbmhlcml0JDEoe1xuICAgIHNjb3BlOiAnbWV0YScsXG4gICAgYmVnaW46IGJlZ2luU2hlYmFuZyxcbiAgICBlbmQ6IC8kLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAgLyoqIEB0eXBlIHtNb2RlQ2FsbGJhY2t9ICovXG4gICAgXCJvbjpiZWdpblwiOiAobSwgcmVzcCkgPT4ge1xuICAgICAgaWYgKG0uaW5kZXggIT09IDApIHJlc3AuaWdub3JlTWF0Y2goKTtcbiAgICB9XG4gIH0sIG9wdHMpO1xufTtcblxuLy8gQ29tbW9uIG1vZGVzXG5jb25zdCBCQUNLU0xBU0hfRVNDQVBFID0ge1xuICBiZWdpbjogJ1xcXFxcXFxcW1xcXFxzXFxcXFNdJywgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQVBPU19TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1xcJycsXG4gIGVuZDogJ1xcJycsXG4gIGlsbGVnYWw6ICdcXFxcbicsXG4gIGNvbnRhaW5zOiBbQkFDS1NMQVNIX0VTQ0FQRV1cbn07XG5jb25zdCBRVU9URV9TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1wiJyxcbiAgZW5kOiAnXCInLFxuICBpbGxlZ2FsOiAnXFxcXG4nLFxuICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG59O1xuY29uc3QgUEhSQVNBTF9XT1JEU19NT0RFID0ge1xuICBiZWdpbjogL1xcYihhfGFufHRoZXxhcmV8SSdtfGlzbid0fGRvbid0fGRvZXNuJ3R8d29uJ3R8YnV0fGp1c3R8c2hvdWxkfHByZXR0eXxzaW1wbHl8ZW5vdWdofGdvbm5hfGdvaW5nfHd0Znxzb3xzdWNofHdpbGx8eW91fHlvdXJ8dGhleXxsaWtlfG1vcmUpXFxiL1xufTtcbi8qKlxuICogQ3JlYXRlcyBhIGNvbW1lbnQgbW9kZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBiZWdpblxuICogQHBhcmFtIHtzdHJpbmcgfCBSZWdFeHB9IGVuZFxuICogQHBhcmFtIHtNb2RlIHwge319IFttb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXJ0aWFsPE1vZGU+fVxuICovXG5jb25zdCBDT01NRU5UID0gZnVuY3Rpb24oYmVnaW4sIGVuZCwgbW9kZU9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtb2RlID0gaW5oZXJpdCQxKFxuICAgIHtcbiAgICAgIHNjb3BlOiAnY29tbWVudCcsXG4gICAgICBiZWdpbixcbiAgICAgIGVuZCxcbiAgICAgIGNvbnRhaW5zOiBbXVxuICAgIH0sXG4gICAgbW9kZU9wdGlvbnNcbiAgKTtcbiAgbW9kZS5jb250YWlucy5wdXNoKHtcbiAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgLy8gaGFjayB0byBhdm9pZCB0aGUgc3BhY2UgZnJvbSBiZWluZyBpbmNsdWRlZC4gdGhlIHNwYWNlIGlzIG5lY2Vzc2FyeSB0b1xuICAgIC8vIG1hdGNoIGhlcmUgdG8gcHJldmVudCB0aGUgcGxhaW4gdGV4dCBydWxlIGJlbG93IGZyb20gZ29iYmxpbmcgdXAgZG9jdGFnc1xuICAgIGJlZ2luOiAnWyBdKig/PShUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKTopJyxcbiAgICBlbmQ6IC8oVE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6LyxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH0pO1xuICBjb25zdCBFTkdMSVNIX1dPUkQgPSBlaXRoZXIoXG4gICAgLy8gbGlzdCBvZiBjb21tb24gMSBhbmQgMiBsZXR0ZXIgd29yZHMgaW4gRW5nbGlzaFxuICAgIFwiSVwiLFxuICAgIFwiYVwiLFxuICAgIFwiaXNcIixcbiAgICBcInNvXCIsXG4gICAgXCJ1c1wiLFxuICAgIFwidG9cIixcbiAgICBcImF0XCIsXG4gICAgXCJpZlwiLFxuICAgIFwiaW5cIixcbiAgICBcIml0XCIsXG4gICAgXCJvblwiLFxuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBjb250cmFjdGlvbnMsIGp1c3QgcG9wdWxhciBvbmVzXG4gICAgL1tBLVphLXpdK1snXShkfHZlfHJlfGxsfHR8c3xuKS8sIC8vIGNvbnRyYWN0aW9ucyAtIGNhbid0IHdlJ2QgdGhleSdyZSBsZXQncywgZXRjXG4gICAgL1tBLVphLXpdK1stXVthLXpdKy8sIC8vIGBuby13YXlgLCBldGMuXG4gICAgL1tBLVphLXpdW2Etel17Mix9LyAvLyBhbGxvdyBjYXBpdGFsaXplZCB3b3JkcyBhdCBiZWdpbm5pbmcgb2Ygc2VudGVuY2VzXG4gICk7XG4gIC8vIGxvb2tpbmcgbGlrZSBwbGFpbiB0ZXh0LCBtb3JlIGxpa2VseSB0byBiZSBhIGNvbW1lbnRcbiAgbW9kZS5jb250YWlucy5wdXNoKFxuICAgIHtcbiAgICAgIC8vIFRPRE86IGhvdyB0byBpbmNsdWRlIFwiLCAoLCApIHdpdGhvdXQgYnJlYWtpbmcgZ3JhbW1hcnMgdGhhdCB1c2UgdGhlc2UgZm9yXG4gICAgICAvLyBjb21tZW50IGRlbGltaXRlcnM/XG4gICAgICAvLyBiZWdpbjogL1sgXSsoWygpXCJdPyhbQS1aYS16Jy1dezMsfXxpc3xhfEl8c298dXN8W3RUXVtvT118YXR8aWZ8aW58aXR8b24pWy5dP1soKVwiOl0/KFsuXVsgXXxbIF18XFwpKSl7M30vXG4gICAgICAvLyAtLS1cblxuICAgICAgLy8gdGhpcyB0cmllcyB0byBmaW5kIHNlcXVlbmNlcyBvZiAzIGVuZ2xpc2ggd29yZHMgaW4gYSByb3cgKHdpdGhvdXQgYW55XG4gICAgICAvLyBcInByb2dyYW1taW5nXCIgdHlwZSBzeW50YXgpIHRoaXMgZ2l2ZXMgdXMgYSBzdHJvbmcgc2lnbmFsIHRoYXQgd2UndmVcbiAgICAgIC8vIFRSVUxZIGZvdW5kIGEgY29tbWVudCAtIHZzIHBlcmhhcHMgc2Nhbm5pbmcgd2l0aCB0aGUgd3JvbmcgbGFuZ3VhZ2UuXG4gICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgTE9PS1MgbGlrZSB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAvLyBjb21tZW50IC0gYnV0IHRoZW4gaWYgdGhlcmUgaXMgbm8gcmVhZGFibGUgdGV4dCAtIGdvb2QgY2hhbmNlIGl0IGlzIGFcbiAgICAgIC8vIGZhbHNlIG1hdGNoIGFuZCBub3QgYSBjb21tZW50LlxuICAgICAgLy9cbiAgICAgIC8vIGZvciBhIHZpc3VhbCBleGFtcGxlIHBsZWFzZSBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yODI3XG5cbiAgICAgIGJlZ2luOiBjb25jYXQoXG4gICAgICAgIC9bIF0rLywgLy8gbmVjZXNzYXJ5IHRvIHByZXZlbnQgdXMgZ29iYmxpbmcgdXAgZG9jdGFncyBsaWtlIC8qIEBhdXRob3IgQm9iIE1jZ2lsbCAqL1xuICAgICAgICAnKCcsXG4gICAgICAgIEVOR0xJU0hfV09SRCxcbiAgICAgICAgL1suXT9bOl0/KFsuXVsgXXxbIF0pLyxcbiAgICAgICAgJyl7M30nKSAvLyBsb29rIGZvciAzIHdvcmRzIGluIGEgcm93XG4gICAgfVxuICApO1xuICByZXR1cm4gbW9kZTtcbn07XG5jb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gQ09NTUVOVCgnLy8nLCAnJCcpO1xuY29uc3QgQ19CTE9DS19DT01NRU5UX01PREUgPSBDT01NRU5UKCcvXFxcXConLCAnXFxcXCovJyk7XG5jb25zdCBIQVNIX0NPTU1FTlRfTU9ERSA9IENPTU1FTlQoJyMnLCAnJCcpO1xuY29uc3QgTlVNQkVSX01PREUgPSB7XG4gIHNjb3BlOiAnbnVtYmVyJyxcbiAgYmVnaW46IE5VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQ19OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQ19OVU1CRVJfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IEJJTkFSWV9OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQklOQVJZX05VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgUkVHRVhQX01PREUgPSB7XG4gIC8vIHRoaXMgb3V0ZXIgcnVsZSBtYWtlcyBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgYSBXSE9MRSByZWdleCBhbmQgbm90IHNpbXBseVxuICAvLyBhbiBleHByZXNzaW9uIHN1Y2ggYXM6XG4gIC8vXG4gIC8vICAgICAzIC8gc29tZXRoaW5nXG4gIC8vXG4gIC8vICh3aGljaCB3aWxsIHRoZW4gYmxvdyB1cCB3aGVuIHJlZ2V4J3MgYGlsbGVnYWxgIHNlZXMgdGhlIG5ld2xpbmUpXG4gIGJlZ2luOiAvKD89XFwvW14vXFxuXSpcXC8pLyxcbiAgY29udGFpbnM6IFt7XG4gICAgc2NvcGU6ICdyZWdleHAnLFxuICAgIGJlZ2luOiAvXFwvLyxcbiAgICBlbmQ6IC9cXC9bZ2ltdXldKi8sXG4gICAgaWxsZWdhbDogL1xcbi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXFxdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG4gICAgICB9XG4gICAgXVxuICB9XVxufTtcbmNvbnN0IFRJVExFX01PREUgPSB7XG4gIHNjb3BlOiAndGl0bGUnLFxuICBiZWdpbjogSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IFVOREVSU0NPUkVfVElUTEVfTU9ERSA9IHtcbiAgc2NvcGU6ICd0aXRsZScsXG4gIGJlZ2luOiBVTkRFUlNDT1JFX0lERU5UX1JFLFxuICByZWxldmFuY2U6IDBcbn07XG5jb25zdCBNRVRIT0RfR1VBUkQgPSB7XG4gIC8vIGV4Y2x1ZGVzIG1ldGhvZCBuYW1lcyBmcm9tIGtleXdvcmQgcHJvY2Vzc2luZ1xuICBiZWdpbjogJ1xcXFwuXFxcXHMqJyArIFVOREVSU0NPUkVfSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcblxuLyoqXG4gKiBBZGRzIGVuZCBzYW1lIGFzIGJlZ2luIG1lY2hhbmljcyB0byBhIG1vZGVcbiAqXG4gKiBZb3VyIG1vZGUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IGEgc2luZ2xlICgpIG1hdGNoIGdyb3VwIGFzIHRoYXQgZmlyc3QgbWF0Y2hcbiAqIGdyb3VwIGlzIHdoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvblxuICogQHBhcmFtIHtQYXJ0aWFsPE1vZGU+fSBtb2RlXG4gKi9cbmNvbnN0IEVORF9TQU1FX0FTX0JFR0lOID0gZnVuY3Rpb24obW9kZSkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihtb2RlLFxuICAgIHtcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmJlZ2luJzogKG0sIHJlc3ApID0+IHsgcmVzcC5kYXRhLl9iZWdpbk1hdGNoID0gbVsxXTsgfSxcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmVuZCc6IChtLCByZXNwKSA9PiB7IGlmIChyZXNwLmRhdGEuX2JlZ2luTWF0Y2ggIT09IG1bMV0pIHJlc3AuaWdub3JlTWF0Y2goKTsgfVxuICAgIH0pO1xufTtcblxudmFyIE1PREVTID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIE1BVENIX05PVEhJTkdfUkU6IE1BVENIX05PVEhJTkdfUkUsXG4gIElERU5UX1JFOiBJREVOVF9SRSxcbiAgVU5ERVJTQ09SRV9JREVOVF9SRTogVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgTlVNQkVSX1JFOiBOVU1CRVJfUkUsXG4gIENfTlVNQkVSX1JFOiBDX05VTUJFUl9SRSxcbiAgQklOQVJZX05VTUJFUl9SRTogQklOQVJZX05VTUJFUl9SRSxcbiAgUkVfU1RBUlRFUlNfUkU6IFJFX1NUQVJURVJTX1JFLFxuICBTSEVCQU5HOiBTSEVCQU5HLFxuICBCQUNLU0xBU0hfRVNDQVBFOiBCQUNLU0xBU0hfRVNDQVBFLFxuICBBUE9TX1NUUklOR19NT0RFOiBBUE9TX1NUUklOR19NT0RFLFxuICBRVU9URV9TVFJJTkdfTU9ERTogUVVPVEVfU1RSSU5HX01PREUsXG4gIFBIUkFTQUxfV09SRFNfTU9ERTogUEhSQVNBTF9XT1JEU19NT0RFLFxuICBDT01NRU5UOiBDT01NRU5ULFxuICBDX0xJTkVfQ09NTUVOVF9NT0RFOiBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICBDX0JMT0NLX0NPTU1FTlRfTU9ERTogQ19CTE9DS19DT01NRU5UX01PREUsXG4gIEhBU0hfQ09NTUVOVF9NT0RFOiBIQVNIX0NPTU1FTlRfTU9ERSxcbiAgTlVNQkVSX01PREU6IE5VTUJFUl9NT0RFLFxuICBDX05VTUJFUl9NT0RFOiBDX05VTUJFUl9NT0RFLFxuICBCSU5BUllfTlVNQkVSX01PREU6IEJJTkFSWV9OVU1CRVJfTU9ERSxcbiAgUkVHRVhQX01PREU6IFJFR0VYUF9NT0RFLFxuICBUSVRMRV9NT0RFOiBUSVRMRV9NT0RFLFxuICBVTkRFUlNDT1JFX1RJVExFX01PREU6IFVOREVSU0NPUkVfVElUTEVfTU9ERSxcbiAgTUVUSE9EX0dVQVJEOiBNRVRIT0RfR1VBUkQsXG4gIEVORF9TQU1FX0FTX0JFR0lOOiBFTkRfU0FNRV9BU19CRUdJTlxufSk7XG5cbi8qKlxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ2FsbGJhY2tSZXNwb25zZX0gQ2FsbGJhY2tSZXNwb25zZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZXJFeHR9IENvbXBpbGVyRXh0XG4qL1xuXG4vLyBHcmFtbWFyIGV4dGVuc2lvbnMgLyBwbHVnaW5zXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzI4MzNcblxuLy8gR3JhbW1hciBleHRlbnNpb25zIGFsbG93IFwic3ludGFjdGljIHN1Z2FyXCIgdG8gYmUgYWRkZWQgdG8gdGhlIGdyYW1tYXIgbW9kZXNcbi8vIHdpdGhvdXQgcmVxdWlyaW5nIGFueSB1bmRlcmx5aW5nIGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVyIGludGVybmFscy5cblxuLy8gYGNvbXBpbGVNYXRjaGAgYmVpbmcgdGhlIHBlcmZlY3Qgc21hbGwgZXhhbXBsZSBvZiBub3cgYWxsb3dpbmcgYSBncmFtbWFyXG4vLyBhdXRob3IgdG8gd3JpdGUgYG1hdGNoYCB3aGVuIHRoZXkgZGVzaXJlIHRvIG1hdGNoIGEgc2luZ2xlIGV4cHJlc3Npb24gcmF0aGVyXG4vLyB0aGFuIGJlaW5nIGZvcmNlZCB0byB1c2UgYGJlZ2luYC4gIFRoZSBleHRlbnNpb24gdGhlbiBqdXN0IG1vdmVzIGBtYXRjaGAgaW50b1xuLy8gYGJlZ2luYCB3aGVuIGl0IHJ1bnMuICBJZSwgbm8gZmVhdHVyZXMgaGF2ZSBiZWVuIGFkZGVkLCBidXQgd2UndmUganVzdCBtYWRlXG4vLyB0aGUgZXhwZXJpZW5jZSBvZiB3cml0aW5nIChhbmQgcmVhZGluZyBncmFtbWFycykgYSBsaXR0bGUgYml0IG5pY2VyLlxuXG4vLyAtLS0tLS1cblxuLy8gVE9ETzogV2UgbmVlZCBuZWdhdGl2ZSBsb29rLWJlaGluZCBzdXBwb3J0IHRvIGRvIHRoaXMgcHJvcGVybHlcbi8qKlxuICogU2tpcCBhIG1hdGNoIGlmIGl0IGhhcyBhIHByZWNlZGluZyBkb3RcbiAqXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGBiZWdpbktleXdvcmRzYCB0byBwcmV2ZW50IG1hdGNoaW5nIGV4cHJlc3Npb25zIHN1Y2ggYXNcbiAqIGBib2Iua2V5d29yZC5kbygpYC4gVGhlIG1vZGUgY29tcGlsZXIgYXV0b21hdGljYWxseSB3aXJlcyB0aGlzIHVwIGFzIGFcbiAqIHNwZWNpYWwgX2ludGVybmFsXyAnb246YmVnaW4nIGNhbGxiYWNrIGZvciBtb2RlcyB3aXRoIGBiZWdpbktleXdvcmRzYFxuICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICogQHBhcmFtIHtDYWxsYmFja1Jlc3BvbnNlfSByZXNwb25zZVxuICovXG5mdW5jdGlvbiBza2lwSWZIYXNQcmVjZWRpbmdEb3QobWF0Y2gsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGJlZm9yZSA9IG1hdGNoLmlucHV0W21hdGNoLmluZGV4IC0gMV07XG4gIGlmIChiZWZvcmUgPT09IFwiLlwiKSB7XG4gICAgcmVzcG9uc2UuaWdub3JlTWF0Y2goKTtcbiAgfVxufVxuXG4vKipcbiAqXG4gKiBAdHlwZSB7Q29tcGlsZXJFeHR9XG4gKi9cbmZ1bmN0aW9uIHNjb3BlQ2xhc3NOYW1lKG1vZGUsIF9wYXJlbnQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICBpZiAobW9kZS5jbGFzc05hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIG1vZGUuc2NvcGUgPSBtb2RlLmNsYXNzTmFtZTtcbiAgICBkZWxldGUgbW9kZS5jbGFzc05hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBgYmVnaW5LZXl3b3Jkc2Agc3ludGFjdGljIHN1Z2FyXG4gKiBAdHlwZSB7Q29tcGlsZXJFeHR9XG4gKi9cbmZ1bmN0aW9uIGJlZ2luS2V5d29yZHMobW9kZSwgcGFyZW50KSB7XG4gIGlmICghcGFyZW50KSByZXR1cm47XG4gIGlmICghbW9kZS5iZWdpbktleXdvcmRzKSByZXR1cm47XG5cbiAgLy8gZm9yIGxhbmd1YWdlcyB3aXRoIGtleXdvcmRzIHRoYXQgaW5jbHVkZSBub24td29yZCBjaGFyYWN0ZXJzIGNoZWNraW5nIGZvclxuICAvLyBhIHdvcmQgYm91bmRhcnkgaXMgbm90IHN1ZmZpY2llbnQsIHNvIGluc3RlYWQgd2UgY2hlY2sgZm9yIGEgd29yZCBib3VuZGFyeVxuICAvLyBvciB3aGl0ZXNwYWNlIC0gdGhpcyBkb2VzIG5vIGhhcm0gaW4gYW55IGNhc2Ugc2luY2Ugb3VyIGtleXdvcmQgZW5naW5lXG4gIC8vIGRvZXNuJ3QgYWxsb3cgc3BhY2VzIGluIGtleXdvcmRzIGFueXdheXMgYW5kIHdlIHN0aWxsIGNoZWNrIGZvciB0aGUgYm91bmRhcnlcbiAgLy8gZmlyc3RcbiAgbW9kZS5iZWdpbiA9ICdcXFxcYignICsgbW9kZS5iZWdpbktleXdvcmRzLnNwbGl0KCcgJykuam9pbignfCcpICsgJykoPyFcXFxcLikoPz1cXFxcYnxcXFxccyknO1xuICBtb2RlLl9fYmVmb3JlQmVnaW4gPSBza2lwSWZIYXNQcmVjZWRpbmdEb3Q7XG4gIG1vZGUua2V5d29yZHMgPSBtb2RlLmtleXdvcmRzIHx8IG1vZGUuYmVnaW5LZXl3b3JkcztcbiAgZGVsZXRlIG1vZGUuYmVnaW5LZXl3b3JkcztcblxuICAvLyBwcmV2ZW50cyBkb3VibGUgcmVsZXZhbmNlLCB0aGUga2V5d29yZHMgdGhlbXNlbHZlcyBwcm92aWRlXG4gIC8vIHJlbGV2YW5jZSwgdGhlIG1vZGUgZG9lc24ndCBuZWVkIHRvIGRvdWJsZSBpdFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gIGlmIChtb2RlLnJlbGV2YW5jZSA9PT0gdW5kZWZpbmVkKSBtb2RlLnJlbGV2YW5jZSA9IDA7XG59XG5cbi8qKlxuICogQWxsb3cgYGlsbGVnYWxgIHRvIGNvbnRhaW4gYW4gYXJyYXkgb2YgaWxsZWdhbCB2YWx1ZXNcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUlsbGVnYWwobW9kZSwgX3BhcmVudCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobW9kZS5pbGxlZ2FsKSkgcmV0dXJuO1xuXG4gIG1vZGUuaWxsZWdhbCA9IGVpdGhlciguLi5tb2RlLmlsbGVnYWwpO1xufVxuXG4vKipcbiAqIGBtYXRjaGAgdG8gbWF0Y2ggYSBzaW5nbGUgZXhwcmVzc2lvbiBmb3IgcmVhZGFiaWxpdHlcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gY29tcGlsZU1hdGNoKG1vZGUsIF9wYXJlbnQpIHtcbiAgaWYgKCFtb2RlLm1hdGNoKSByZXR1cm47XG4gIGlmIChtb2RlLmJlZ2luIHx8IG1vZGUuZW5kKSB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpbiAmIGVuZCBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1hdGNoXCIpO1xuXG4gIG1vZGUuYmVnaW4gPSBtb2RlLm1hdGNoO1xuICBkZWxldGUgbW9kZS5tYXRjaDtcbn1cblxuLyoqXG4gKiBwcm92aWRlcyB0aGUgZGVmYXVsdCAxIHJlbGV2YW5jZSB0byBhbGwgbW9kZXNcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gY29tcGlsZVJlbGV2YW5jZShtb2RlLCBfcGFyZW50KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgaWYgKG1vZGUucmVsZXZhbmNlID09PSB1bmRlZmluZWQpIG1vZGUucmVsZXZhbmNlID0gMTtcbn1cblxuLy8gYWxsb3cgYmVmb3JlTWF0Y2ggdG8gYWN0IGFzIGEgXCJxdWFsaWZpZXJcIiBmb3IgdGhlIG1hdGNoXG4vLyB0aGUgZnVsbCBtYXRjaCBiZWdpbiBtdXN0IGJlIFtiZWZvcmVNYXRjaF1bYmVnaW5dXG5jb25zdCBiZWZvcmVNYXRjaEV4dCA9IChtb2RlLCBwYXJlbnQpID0+IHtcbiAgaWYgKCFtb2RlLmJlZm9yZU1hdGNoKSByZXR1cm47XG4gIC8vIHN0YXJ0cyBjb25mbGljdHMgd2l0aCBlbmRzUGFyZW50IHdoaWNoIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjaGlsZFxuICAvLyBydWxlIGlzIG5vdCBtYXRjaGVkIG11bHRpcGxlIHRpbWVzXG4gIGlmIChtb2RlLnN0YXJ0cykgdGhyb3cgbmV3IEVycm9yKFwiYmVmb3JlTWF0Y2ggY2Fubm90IGJlIHVzZWQgd2l0aCBzdGFydHNcIik7XG5cbiAgY29uc3Qgb3JpZ2luYWxNb2RlID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kZSk7XG4gIE9iamVjdC5rZXlzKG1vZGUpLmZvckVhY2goKGtleSkgPT4geyBkZWxldGUgbW9kZVtrZXldOyB9KTtcblxuICBtb2RlLmtleXdvcmRzID0gb3JpZ2luYWxNb2RlLmtleXdvcmRzO1xuICBtb2RlLmJlZ2luID0gY29uY2F0KG9yaWdpbmFsTW9kZS5iZWZvcmVNYXRjaCwgbG9va2FoZWFkKG9yaWdpbmFsTW9kZS5iZWdpbikpO1xuICBtb2RlLnN0YXJ0cyA9IHtcbiAgICByZWxldmFuY2U6IDAsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3JpZ2luYWxNb2RlLCB7IGVuZHNQYXJlbnQ6IHRydWUgfSlcbiAgICBdXG4gIH07XG4gIG1vZGUucmVsZXZhbmNlID0gMDtcblxuICBkZWxldGUgb3JpZ2luYWxNb2RlLmJlZm9yZU1hdGNoO1xufTtcblxuLy8ga2V5d29yZHMgdGhhdCBzaG91bGQgaGF2ZSBubyBkZWZhdWx0IHJlbGV2YW5jZSB2YWx1ZVxuY29uc3QgQ09NTU9OX0tFWVdPUkRTID0gW1xuICAnb2YnLFxuICAnYW5kJyxcbiAgJ2ZvcicsXG4gICdpbicsXG4gICdub3QnLFxuICAnb3InLFxuICAnaWYnLFxuICAndGhlbicsXG4gICdwYXJlbnQnLCAvLyBjb21tb24gdmFyaWFibGUgbmFtZVxuICAnbGlzdCcsIC8vIGNvbW1vbiB2YXJpYWJsZSBuYW1lXG4gICd2YWx1ZScgLy8gY29tbW9uIHZhcmlhYmxlIG5hbWVcbl07XG5cbmNvbnN0IERFRkFVTFRfS0VZV09SRF9TQ09QRSA9IFwia2V5d29yZFwiO1xuXG4vKipcbiAqIEdpdmVuIHJhdyBrZXl3b3JkcyBmcm9tIGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiwgY29tcGlsZSB0aGVtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgUmVjb3JkPHN0cmluZyxzdHJpbmd8c3RyaW5nW10+IHwgQXJyYXk8c3RyaW5nPn0gcmF3S2V5d29yZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FzZUluc2Vuc2l0aXZlXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVLZXl3b3JkcyhyYXdLZXl3b3JkcywgY2FzZUluc2Vuc2l0aXZlLCBzY29wZU5hbWUgPSBERUZBVUxUX0tFWVdPUkRfU0NPUEUpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJoaWdobGlnaHQuanMvcHJpdmF0ZVwiKS5LZXl3b3JkRGljdH0gKi9cbiAgY29uc3QgY29tcGlsZWRLZXl3b3JkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gaW5wdXQgY2FuIGJlIGEgc3RyaW5nIG9mIGtleXdvcmRzLCBhbiBhcnJheSBvZiBrZXl3b3Jkcywgb3IgYSBvYmplY3Qgd2l0aFxuICAvLyBuYW1lZCBrZXlzIHJlcHJlc2VudGluZyBzY29wZU5hbWUgKHdoaWNoIGNhbiB0aGVuIHBvaW50IHRvIGEgc3RyaW5nIG9yIGFycmF5KVxuICBpZiAodHlwZW9mIHJhd0tleXdvcmRzID09PSAnc3RyaW5nJykge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMuc3BsaXQoXCIgXCIpKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJhd0tleXdvcmRzKSkge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKHJhd0tleXdvcmRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNjb3BlTmFtZSkge1xuICAgICAgLy8gY29sbGFwc2UgYWxsIG91ciBvYmplY3RzIGJhY2sgaW50byB0aGUgcGFyZW50IG9iamVjdFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgY29tcGlsZWRLZXl3b3JkcyxcbiAgICAgICAgY29tcGlsZUtleXdvcmRzKHJhd0tleXdvcmRzW3Njb3BlTmFtZV0sIGNhc2VJbnNlbnNpdGl2ZSwgc2NvcGVOYW1lKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tcGlsZWRLZXl3b3JkcztcblxuICAvLyAtLS1cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBsaXN0IG9mIGtleXdvcmRzXG4gICAqXG4gICAqIEV4OiBcImZvciBpZiB3aGVuIHdoaWxlfDVcIlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVOYW1lXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2V5d29yZExpc3RcbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwga2V5d29yZExpc3QpIHtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBrZXl3b3JkTGlzdCA9IGtleXdvcmRMaXN0Lm1hcCh4ID0+IHgudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICAgIGtleXdvcmRMaXN0LmZvckVhY2goZnVuY3Rpb24oa2V5d29yZCkge1xuICAgICAgY29uc3QgcGFpciA9IGtleXdvcmQuc3BsaXQoJ3wnKTtcbiAgICAgIGNvbXBpbGVkS2V5d29yZHNbcGFpclswXV0gPSBbc2NvcGVOYW1lLCBzY29yZUZvcktleXdvcmQocGFpclswXSwgcGFpclsxXSldO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvcGVyIHNjb3JlIGZvciBhIGdpdmVuIGtleXdvcmRcbiAqXG4gKiBBbHNvIHRha2VzIGludG8gYWNjb3VudCBjb21tZW50IGtleXdvcmRzLCB3aGljaCB3aWxsIGJlIHNjb3JlZCAwIFVOTEVTU1xuICogYW5vdGhlciBzY29yZSBoYXMgYmVlbiBtYW51YWxseSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3ZpZGVkU2NvcmVdXG4gKi9cbmZ1bmN0aW9uIHNjb3JlRm9yS2V5d29yZChrZXl3b3JkLCBwcm92aWRlZFNjb3JlKSB7XG4gIC8vIG1hbnVhbCBzY29yZXMgYWx3YXlzIHdpbiBvdmVyIGNvbW1vbiBrZXl3b3Jkc1xuICAvLyBzbyB5b3UgY2FuIGZvcmNlIGEgc2NvcmUgb2YgMSBpZiB5b3UgcmVhbGx5IGluc2lzdFxuICBpZiAocHJvdmlkZWRTY29yZSkge1xuICAgIHJldHVybiBOdW1iZXIocHJvdmlkZWRTY29yZSk7XG4gIH1cblxuICByZXR1cm4gY29tbW9uS2V5d29yZChrZXl3b3JkKSA/IDAgOiAxO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBnaXZlbiBrZXl3b3JkIGlzIGNvbW1vbiBvciBub3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZCAqL1xuZnVuY3Rpb24gY29tbW9uS2V5d29yZChrZXl3b3JkKSB7XG4gIHJldHVybiBDT01NT05fS0VZV09SRFMuaW5jbHVkZXMoa2V5d29yZC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLypcblxuRm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgcGxlYXNlIHNlZTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzI4ODAjaXNzdWVjb21tZW50LTc0NzI3NTQxOVxuXG4qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn1cbiAqL1xuY29uc3Qgc2VlbkRlcHJlY2F0aW9ucyA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmNvbnN0IGVycm9yID0gKG1lc3NhZ2UpID0+IHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7YW55fSBhcmdzXG4gKi9cbmNvbnN0IHdhcm4gPSAobWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICBjb25zb2xlLmxvZyhgV0FSTjogJHttZXNzYWdlfWAsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuY29uc3QgZGVwcmVjYXRlZCA9ICh2ZXJzaW9uLCBtZXNzYWdlKSA9PiB7XG4gIGlmIChzZWVuRGVwcmVjYXRpb25zW2Ake3ZlcnNpb259LyR7bWVzc2FnZX1gXSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUubG9nKGBEZXByZWNhdGVkIGFzIG9mICR7dmVyc2lvbn0uICR7bWVzc2FnZX1gKTtcbiAgc2VlbkRlcHJlY2F0aW9uc1tgJHt2ZXJzaW9ufS8ke21lc3NhZ2V9YF0gPSB0cnVlO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdGhyb3ctbGl0ZXJhbCAqL1xuXG4vKipcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlXG4qL1xuXG5jb25zdCBNdWx0aUNsYXNzRXJyb3IgPSBuZXcgRXJyb3IoKTtcblxuLyoqXG4gKiBSZW51bWJlcnMgbGFiZWxlZCBzY29wZSBuYW1lcyB0byBhY2NvdW50IGZvciBhZGRpdGlvbmFsIGlubmVyIG1hdGNoXG4gKiBncm91cHMgdGhhdCBvdGhlcndpc2Ugd291bGQgYnJlYWsgZXZlcnl0aGluZy5cbiAqXG4gKiBMZXRzIHNheSB3ZSAzIG1hdGNoIHNjb3BlczpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCAzID0+IC4uLiB9XG4gKlxuICogU28gd2hhdCB3ZSBuZWVkIGlzIGEgY2xlYW4gbWF0Y2ggbGlrZSB0aGlzOlxuICpcbiAqICAgKGEpKGIpKGMpID0+IFsgXCJhXCIsIFwiYlwiLCBcImNcIiBdXG4gKlxuICogQnV0IHRoaXMgZmFsbHMgYXBhcnQgd2l0aCBpbm5lciBtYXRjaCBncm91cHM6XG4gKlxuICogKGEpKCgoYikpKShjKSA9PiBbXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJiXCIsIFwiY1wiIF1cbiAqXG4gKiBPdXIgc2NvcGVzIGFyZSBub3cgXCJvdXQgb2YgYWxpZ25tZW50XCIgYW5kIHdlJ3JlIHJlcGVhdGluZyBgYmAgMyB0aW1lcy5cbiAqIFdoYXQgbmVlZHMgdG8gaGFwcGVuIGlzIHRoZSBudW1iZXJzIGFyZSByZW1hcHBlZDpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCA1ID0+IC4uLiB9XG4gKlxuICogV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhhdCB0aGUgT05MWSBncm91cHMgdGhhdCBzaG91bGQgYmUgb3V0cHV0XG4gKiBhcmUgMSwgMiwgYW5kIDUuICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBiZWhhdmlvci5cbiAqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICogQHBhcmFtIHtBcnJheTxSZWdFeHAgfCBzdHJpbmc+fSByZWdleGVzXG4gKiBAcGFyYW0ge3trZXk6IFwiYmVnaW5TY29wZVwifFwiZW5kU2NvcGVcIn19IG9wdHNcbiAqL1xuZnVuY3Rpb24gcmVtYXBTY29wZU5hbWVzKG1vZGUsIHJlZ2V4ZXMsIHsga2V5IH0pIHtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGNvbnN0IHNjb3BlTmFtZXMgPSBtb2RlW2tleV07XG4gIC8qKiBAdHlwZSBSZWNvcmQ8bnVtYmVyLGJvb2xlYW4+ICovXG4gIGNvbnN0IGVtaXQgPSB7fTtcbiAgLyoqIEB0eXBlIFJlY29yZDxudW1iZXIsc3RyaW5nPiAqL1xuICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSByZWdleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcG9zaXRpb25zW2kgKyBvZmZzZXRdID0gc2NvcGVOYW1lc1tpXTtcbiAgICBlbWl0W2kgKyBvZmZzZXRdID0gdHJ1ZTtcbiAgICBvZmZzZXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZWdleGVzW2kgLSAxXSk7XG4gIH1cbiAgLy8gd2UgdXNlIF9lbWl0IHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWF0Y2ggZ3JvdXBzIGFyZSBcInRvcC1sZXZlbFwiIHRvIGF2b2lkIGRvdWJsZVxuICAvLyBvdXRwdXQgZnJvbSBpbnNpZGUgbWF0Y2ggZ3JvdXBzXG4gIG1vZGVba2V5XSA9IHBvc2l0aW9ucztcbiAgbW9kZVtrZXldLl9lbWl0ID0gZW1pdDtcbiAgbW9kZVtrZXldLl9tdWx0aSA9IHRydWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gYmVnaW5NdWx0aUNsYXNzKG1vZGUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGUuYmVnaW4pKSByZXR1cm47XG5cbiAgaWYgKG1vZGUuc2tpcCB8fCBtb2RlLmV4Y2x1ZGVCZWdpbiB8fCBtb2RlLnJldHVybkJlZ2luKSB7XG4gICAgZXJyb3IoXCJza2lwLCBleGNsdWRlQmVnaW4sIHJldHVybkJlZ2luIG5vdCBjb21wYXRpYmxlIHdpdGggYmVnaW5TY29wZToge31cIik7XG4gICAgdGhyb3cgTXVsdGlDbGFzc0Vycm9yO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2RlLmJlZ2luU2NvcGUgIT09IFwib2JqZWN0XCIgfHwgbW9kZS5iZWdpblNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJiZWdpblNjb3BlIG11c3QgYmUgb2JqZWN0XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIHJlbWFwU2NvcGVOYW1lcyhtb2RlLCBtb2RlLmJlZ2luLCB7IGtleTogXCJiZWdpblNjb3BlXCIgfSk7XG4gIG1vZGUuYmVnaW4gPSBfcmV3cml0ZUJhY2tyZWZlcmVuY2VzKG1vZGUuYmVnaW4sIHsgam9pbldpdGg6IFwiXCIgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gZW5kTXVsdGlDbGFzcyhtb2RlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShtb2RlLmVuZCkpIHJldHVybjtcblxuICBpZiAobW9kZS5za2lwIHx8IG1vZGUuZXhjbHVkZUVuZCB8fCBtb2RlLnJldHVybkVuZCkge1xuICAgIGVycm9yKFwic2tpcCwgZXhjbHVkZUVuZCwgcmV0dXJuRW5kIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kU2NvcGU6IHt9XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSAhPT0gXCJvYmplY3RcIiB8fCBtb2RlLmVuZFNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJlbmRTY29wZSBtdXN0IGJlIG9iamVjdFwiKTtcbiAgICB0aHJvdyBNdWx0aUNsYXNzRXJyb3I7XG4gIH1cblxuICByZW1hcFNjb3BlTmFtZXMobW9kZSwgbW9kZS5lbmQsIHsga2V5OiBcImVuZFNjb3BlXCIgfSk7XG4gIG1vZGUuZW5kID0gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhtb2RlLmVuZCwgeyBqb2luV2l0aDogXCJcIiB9KTtcbn1cblxuLyoqXG4gKiB0aGlzIGV4aXN0cyBvbmx5IHRvIGFsbG93IGBzY29wZToge31gIHRvIGJlIHVzZWQgYmVzaWRlIGBtYXRjaDpgXG4gKiBPdGhlcndpc2UgYGJlZ2luU2NvcGVgIHdvdWxkIG5lY2Vzc2FyeSBhbmQgdGhhdCB3b3VsZCBsb29rIHdlaXJkXG5cbiAge1xuICAgIG1hdGNoOiBbIC9kZWYvLCAvXFx3Ky8gXVxuICAgIHNjb3BlOiB7IDE6IFwia2V5d29yZFwiICwgMjogXCJ0aXRsZVwiIH1cbiAgfVxuXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBzY29wZVN1Z2FyKG1vZGUpIHtcbiAgaWYgKG1vZGUuc2NvcGUgJiYgdHlwZW9mIG1vZGUuc2NvcGUgPT09IFwib2JqZWN0XCIgJiYgbW9kZS5zY29wZSAhPT0gbnVsbCkge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IG1vZGUuc2NvcGU7XG4gICAgZGVsZXRlIG1vZGUuc2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBNdWx0aUNsYXNzKG1vZGUpIHtcbiAgc2NvcGVTdWdhcihtb2RlKTtcblxuICBpZiAodHlwZW9mIG1vZGUuYmVnaW5TY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IHsgX3dyYXA6IG1vZGUuYmVnaW5TY29wZSB9O1xuICB9XG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuZW5kU2NvcGUgPSB7IF93cmFwOiBtb2RlLmVuZFNjb3BlIH07XG4gIH1cblxuICBiZWdpbk11bHRpQ2xhc3MobW9kZSk7XG4gIGVuZE11bHRpQ2xhc3MobW9kZSk7XG59XG5cbi8qKlxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRNb2RlfSBDb21waWxlZE1vZGVcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkxhbmd1YWdlfSBMYW5ndWFnZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU1BsdWdpbn0gSExKU1BsdWdpblxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRMYW5ndWFnZX0gQ29tcGlsZWRMYW5ndWFnZVxuKi9cblxuLy8gY29tcGlsYXRpb25cblxuLyoqXG4gKiBDb21waWxlcyBhIGxhbmd1YWdlIGRlZmluaXRpb24gcmVzdWx0XG4gKlxuICogR2l2ZW4gdGhlIHJhdyByZXN1bHQgb2YgYSBsYW5ndWFnZSBkZWZpbml0aW9uIChMYW5ndWFnZSksIGNvbXBpbGVzIHRoaXMgc29cbiAqIHRoYXQgaXQgaXMgcmVhZHkgZm9yIGhpZ2hsaWdodGluZyBjb2RlLlxuICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2VcbiAqIEByZXR1cm5zIHtDb21waWxlZExhbmd1YWdlfVxuICovXG5mdW5jdGlvbiBjb21waWxlTGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHJlZ2V4IHdpdGggdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dsb2JhbF1cbiAgICovXG4gIGZ1bmN0aW9uIGxhbmdSZSh2YWx1ZSwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBzb3VyY2UodmFsdWUpLFxuICAgICAgJ20nXG4gICAgICArIChsYW5ndWFnZS5jYXNlX2luc2Vuc2l0aXZlID8gJ2knIDogJycpXG4gICAgICArIChsYW5ndWFnZS51bmljb2RlUmVnZXggPyAndScgOiAnJylcbiAgICAgICsgKGdsb2JhbCA/ICdnJyA6ICcnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICBTdG9yZXMgbXVsdGlwbGUgcmVndWxhciBleHByZXNzaW9ucyBhbmQgYWxsb3dzIHlvdSB0byBxdWlja2x5IHNlYXJjaCBmb3JcbiAgICB0aGVtIGFsbCBpbiBhIHN0cmluZyBzaW11bHRhbmVvdXNseSAtIHJldHVybmluZyB0aGUgZmlyc3QgbWF0Y2guICBJdCBkb2VzXG4gICAgdGhpcyBieSBjcmVhdGluZyBhIGh1Z2UgKGF8YnxjKSByZWdleCAtIGVhY2ggaW5kaXZpZHVhbCBpdGVtIHdyYXBwZWQgd2l0aCAoKVxuICAgIGFuZCBqb2luZWQgYnkgYHxgIC0gdXNpbmcgbWF0Y2ggZ3JvdXBzIHRvIHRyYWNrIHBvc2l0aW9uLiAgV2hlbiBhIG1hdGNoIGlzXG4gICAgZm91bmQgY2hlY2tpbmcgd2hpY2ggcG9zaXRpb24gaW4gdGhlIGFycmF5IGhhcyBjb250ZW50IGFsbG93cyB1cyB0byBmaWd1cmVcbiAgICBvdXQgd2hpY2ggb2YgdGhlIG9yaWdpbmFsIHJlZ2V4ZXMgLyBtYXRjaCBncm91cHMgdHJpZ2dlcmVkIHRoZSBtYXRjaC5cblxuICAgIFRoZSBtYXRjaCBvYmplY3QgaXRzZWxmICh0aGUgcmVzdWx0IG9mIGBSZWdleC5leGVjYCkgaXMgcmV0dXJuZWQgYnV0IGFsc29cbiAgICBlbmhhbmNlZCBieSBtZXJnaW5nIGluIGFueSBtZXRhLWRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdleC5cbiAgICBUaGlzIGlzIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG1vZGUgbWF0Y2hlZCwgYW5kIHdoYXQgdHlwZSBvZiBydWxlXG4gICAgKGBpbGxlZ2FsYCwgYGJlZ2luYCwgZW5kLCBldGMpLlxuICAqL1xuICBjbGFzcyBNdWx0aVJlZ2V4IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzID0ge307XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlZ2V4ZXMgPSBbXTtcbiAgICAgIHRoaXMubWF0Y2hBdCA9IDE7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYWRkUnVsZShyZSwgb3B0cykge1xuICAgICAgb3B0cy5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb24rKztcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzW3RoaXMubWF0Y2hBdF0gPSBvcHRzO1xuICAgICAgdGhpcy5yZWdleGVzLnB1c2goW29wdHMsIHJlXSk7XG4gICAgICB0aGlzLm1hdGNoQXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZSkgKyAxO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICBpZiAodGhpcy5yZWdleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBhdm9pZHMgdGhlIG5lZWQgdG8gY2hlY2sgbGVuZ3RoIGV2ZXJ5IHRpbWUgZXhlYyBpcyBjYWxsZWRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmV4ZWMgPSAoKSA9PiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdGVybWluYXRvcnMgPSB0aGlzLnJlZ2V4ZXMubWFwKGVsID0+IGVsWzFdKTtcbiAgICAgIHRoaXMubWF0Y2hlclJlID0gbGFuZ1JlKF9yZXdyaXRlQmFja3JlZmVyZW5jZXModGVybWluYXRvcnMsIHsgam9pbldpdGg6ICd8JyB9KSwgdHJ1ZSk7XG4gICAgICB0aGlzLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBzICovXG4gICAgZXhlYyhzKSB7XG4gICAgICB0aGlzLm1hdGNoZXJSZS5sYXN0SW5kZXggPSB0aGlzLmxhc3RJbmRleDtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaGVyUmUuZXhlYyhzKTtcbiAgICAgIGlmICghbWF0Y2gpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICAgICAgY29uc3QgaSA9IG1hdGNoLmZpbmRJbmRleCgoZWwsIGkpID0+IGkgPiAwICYmIGVsICE9PSB1bmRlZmluZWQpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbWF0Y2hEYXRhID0gdGhpcy5tYXRjaEluZGV4ZXNbaV07XG4gICAgICAvLyB0cmltIG9mZiBhbnkgZWFybGllciBub24tcmVsZXZhbnQgbWF0Y2ggZ3JvdXBzIChpZSwgdGhlIG90aGVyIHJlZ2V4XG4gICAgICAvLyBtYXRjaCBncm91cHMgdGhhdCBtYWtlIHVwIHRoZSBtdWx0aS1tYXRjaGVyKVxuICAgICAgbWF0Y2guc3BsaWNlKDAsIGkpO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihtYXRjaCwgbWF0Y2hEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgIENyZWF0ZWQgdG8gc29sdmUgdGhlIGtleSBkZWZpY2llbnRseSB3aXRoIE11bHRpUmVnZXggLSB0aGVyZSBpcyBubyB3YXkgdG9cbiAgICB0ZXN0IGZvciBtdWx0aXBsZSBtYXRjaGVzIGF0IGEgc2luZ2xlIGxvY2F0aW9uLiAgV2h5IHdvdWxkIHdlIG5lZWQgdG8gZG9cbiAgICB0aGF0PyAgSW4gdGhlIGZ1dHVyZSBhIG1vcmUgZHluYW1pYyBlbmdpbmUgd2lsbCBhbGxvdyBjZXJ0YWluIG1hdGNoZXMgdG8gYmVcbiAgICBpZ25vcmVkLiAgQW4gZXhhbXBsZTogaWYgd2UgbWF0Y2hlZCBzYXkgdGhlIDNyZCByZWdleCBpbiBhIGxhcmdlIGdyb3VwIGJ1dFxuICAgIGRlY2lkZWQgdG8gaWdub3JlIGl0IC0gd2UnZCBuZWVkIHRvIHN0YXJ0ZWQgdGVzdGluZyBhZ2FpbiBhdCB0aGUgNHRoXG4gICAgcmVnZXguLi4gYnV0IE11bHRpUmVnZXggaXRzZWxmIGdpdmVzIHVzIG5vIHJlYWwgd2F5IHRvIGRvIHRoYXQuXG5cbiAgICBTbyB3aGF0IHRoaXMgY2xhc3MgY3JlYXRlcyBNdWx0aVJlZ2V4cyBvbiB0aGUgZmx5IGZvciB3aGF0ZXZlciBzZWFyY2hcbiAgICBwb3NpdGlvbiB0aGV5IGFyZSBuZWVkZWQuXG5cbiAgICBOT1RFOiBUaGVzZSBhZGRpdGlvbmFsIE11bHRpUmVnZXggb2JqZWN0cyBhcmUgY3JlYXRlZCBkeW5hbWljYWxseS4gIEZvciBtb3N0XG4gICAgZ3JhbW1hcnMgbW9zdCBvZiB0aGUgdGltZSB3ZSB3aWxsIG5ldmVyIGFjdHVhbGx5IG5lZWQgYW55dGhpbmcgbW9yZSB0aGFuIHRoZVxuICAgIGZpcnN0IE11bHRpUmVnZXggLSBzbyB0aGlzIHNob3VsZG4ndCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkLlxuXG4gICAgU2F5IHRoaXMgaXMgb3VyIHNlYXJjaCBncm91cCwgYW5kIHdlIG1hdGNoIHJlZ2V4MywgYnV0IHdpc2ggdG8gaWdub3JlIGl0LlxuXG4gICAgICByZWdleDEgfCByZWdleDIgfCByZWdleDMgfCByZWdleDQgfCByZWdleDUgICAgJyBpZSwgc3RhcnRBdCA9IDBcblxuICAgIFdoYXQgd2UgbmVlZCBpcyBhIG5ldyBNdWx0aVJlZ2V4IHRoYXQgb25seSBpbmNsdWRlcyB0aGUgcmVtYWluaW5nXG4gICAgcG9zc2liaWxpdGllczpcblxuICAgICAgcmVnZXg0IHwgcmVnZXg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgaWUsIHN0YXJ0QXQgPSAzXG5cbiAgICBUaGlzIGNsYXNzIHdyYXBzIGFsbCB0aGF0IGNvbXBsZXhpdHkgdXAgaW4gYSBzaW1wbGUgQVBJLi4uIGBzdGFydEF0YCBkZWNpZGVzXG4gICAgd2hlcmUgaW4gdGhlIGFycmF5IG9mIGV4cHJlc3Npb25zIHRvIHN0YXJ0IGRvaW5nIHRoZSBtYXRjaGluZy4gSXRcbiAgICBhdXRvLWluY3JlbWVudHMsIHNvIGlmIGEgbWF0Y2ggaXMgZm91bmQgYXQgcG9zaXRpb24gMiwgdGhlbiBzdGFydEF0IHdpbGwgYmVcbiAgICBzZXQgdG8gMy4gIElmIHRoZSBlbmQgaXMgcmVhY2hlZCBzdGFydEF0IHdpbGwgcmV0dXJuIHRvIDAuXG5cbiAgICBNT1NUIG9mIHRoZSB0aW1lIHRoZSBwYXJzZXIgd2lsbCBiZSBzZXR0aW5nIHN0YXJ0QXQgbWFudWFsbHkgdG8gMC5cbiAgKi9cbiAgY2xhc3MgUmVzdW1hYmxlTXVsdGlSZWdleCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJ1bGVzID0gW107XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm11bHRpUmVnZXhlcyA9IFtdO1xuICAgICAgdGhpcy5jb3VudCA9IDA7XG5cbiAgICAgIHRoaXMubGFzdEluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVnZXhJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGdldE1hdGNoZXIoaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpUmVnZXhlc1tpbmRleF0pIHJldHVybiB0aGlzLm11bHRpUmVnZXhlc1tpbmRleF07XG5cbiAgICAgIGNvbnN0IG1hdGNoZXIgPSBuZXcgTXVsdGlSZWdleCgpO1xuICAgICAgdGhpcy5ydWxlcy5zbGljZShpbmRleCkuZm9yRWFjaCgoW3JlLCBvcHRzXSkgPT4gbWF0Y2hlci5hZGRSdWxlKHJlLCBvcHRzKSk7XG4gICAgICBtYXRjaGVyLmNvbXBpbGUoKTtcbiAgICAgIHRoaXMubXVsdGlSZWdleGVzW2luZGV4XSA9IG1hdGNoZXI7XG4gICAgICByZXR1cm4gbWF0Y2hlcjtcbiAgICB9XG5cbiAgICByZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2V4SW5kZXggIT09IDA7XG4gICAgfVxuXG4gICAgY29uc2lkZXJBbGwoKSB7XG4gICAgICB0aGlzLnJlZ2V4SW5kZXggPSAwO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhZGRSdWxlKHJlLCBvcHRzKSB7XG4gICAgICB0aGlzLnJ1bGVzLnB1c2goW3JlLCBvcHRzXSk7XG4gICAgICBpZiAob3B0cy50eXBlID09PSBcImJlZ2luXCIpIHRoaXMuY291bnQrKztcbiAgICB9XG5cbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IHMgKi9cbiAgICBleGVjKHMpIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLmdldE1hdGNoZXIodGhpcy5yZWdleEluZGV4KTtcbiAgICAgIG0ubGFzdEluZGV4ID0gdGhpcy5sYXN0SW5kZXg7XG4gICAgICBsZXQgcmVzdWx0ID0gbS5leGVjKHMpO1xuXG4gICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBlYXN5IHdheSB0byBzYXkgXCJyZXN1bWUgc2Nhbm5pbmcgYXQgdGhlXG4gICAgICAvLyBleGlzdGluZyBwb3NpdGlvbiBidXQgYWxzbyBza2lwIHRoZSBjdXJyZW50IHJ1bGUgT05MWVwiLiBXaGF0IGhhcHBlbnMgaXNcbiAgICAgIC8vIGFsbCBwcmlvciBydWxlcyBhcmUgYWxzbyBza2lwcGVkIHdoaWNoIGNhbiByZXN1bHQgaW4gbWF0Y2hpbmcgdGhlIHdyb25nXG4gICAgICAvLyB0aGluZy4gRXhhbXBsZSBvZiBtYXRjaGluZyBcImJvb2dlclwiOlxuXG4gICAgICAvLyBvdXIgbWF0Y2hlciBpcyBbc3RyaW5nLCBcImJvb2dlclwiLCBudW1iZXJdXG4gICAgICAvL1xuICAgICAgLy8gLi4uLmJvb2dlci4uLi5cblxuICAgICAgLy8gaWYgXCJib29nZXJcIiBpcyBpZ25vcmVkIHRoZW4gd2UnZCByZWFsbHkgbmVlZCBhIHJlZ2V4IHRvIHNjYW4gZnJvbSB0aGVcbiAgICAgIC8vIFNBTUUgcG9zaXRpb24gZm9yIG9ubHk6IFtzdHJpbmcsIG51bWJlcl0gYnV0IGlnbm9yaW5nIFwiYm9vZ2VyXCIgKGlmIGl0XG4gICAgICAvLyB3YXMgdGhlIGZpcnN0IG1hdGNoKSwgYSBzaW1wbGUgcmVzdW1lIHdvdWxkIHNjYW4gYWhlYWQgd2hvIGtub3dzIGhvd1xuICAgICAgLy8gZmFyIGxvb2tpbmcgb25seSBmb3IgXCJudW1iZXJcIiwgaWdub3JpbmcgcG90ZW50aWFsIHN0cmluZyBtYXRjaGVzIChvclxuICAgICAgLy8gZnV0dXJlIFwiYm9vZ2VyXCIgbWF0Y2hlcyB0aGF0IG1pZ2h0IGJlIHZhbGlkLilcblxuICAgICAgLy8gU28gd2hhdCB3ZSBkbzogV2UgZXhlY3V0ZSB0d28gbWF0Y2hlcnMsIG9uZSByZXN1bWluZyBhdCB0aGUgc2FtZVxuICAgICAgLy8gcG9zaXRpb24sIGJ1dCB0aGUgc2Vjb25kIGZ1bGwgbWF0Y2hlciBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24gYWZ0ZXI6XG5cbiAgICAgIC8vICAgICAvLS0tIHJlc3VtZSBmaXJzdCByZWdleCBtYXRjaCBoZXJlIChmb3IgW251bWJlcl0pXG4gICAgICAvLyAgICAgfC8tLS0tIGZ1bGwgbWF0Y2ggaGVyZSBmb3IgW3N0cmluZywgXCJib29nZXJcIiwgbnVtYmVyXVxuICAgICAgLy8gICAgIHZ2XG4gICAgICAvLyAuLi4uYm9vZ2VyLi4uLlxuXG4gICAgICAvLyBXaGljaCBldmVyIHJlc3VsdHMgaW4gYSBtYXRjaCBmaXJzdCBpcyB0aGVuIHVzZWQuIFNvIHRoaXMgMy00IHN0ZXBcbiAgICAgIC8vIHByb2Nlc3MgZXNzZW50aWFsbHkgYWxsb3dzIHVzIHRvIHNheSBcIm1hdGNoIGF0IHRoaXMgcG9zaXRpb24sIGV4Y2x1ZGluZ1xuICAgICAgLy8gYSBwcmlvciBydWxlIHRoYXQgd2FzIGlnbm9yZWRcIi5cbiAgICAgIC8vXG4gICAgICAvLyAxLiBNYXRjaCBcImJvb2dlclwiIGZpcnN0LCBpZ25vcmUuIEFsc28gcHJvdmVzIHRoYXQgW3N0cmluZ10gZG9lcyBub24gbWF0Y2guXG4gICAgICAvLyAyLiBSZXN1bWUgbWF0Y2hpbmcgZm9yIFtudW1iZXJdXG4gICAgICAvLyAzLiBNYXRjaCBhdCBpbmRleCArIDEgZm9yIFtzdHJpbmcsIFwiYm9vZ2VyXCIsIG51bWJlcl1cbiAgICAgIC8vIDQuIElmICMyIGFuZCAjMyByZXN1bHQgaW4gbWF0Y2hlcywgd2hpY2ggY2FtZSBmaXJzdD9cbiAgICAgIGlmICh0aGlzLnJlc3VtaW5nU2NhbkF0U2FtZVBvc2l0aW9uKCkpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuaW5kZXggPT09IHRoaXMubGFzdEluZGV4KSA7IGVsc2UgeyAvLyB1c2UgdGhlIHNlY29uZCBtYXRjaGVyIHJlc3VsdFxuICAgICAgICAgIGNvbnN0IG0yID0gdGhpcy5nZXRNYXRjaGVyKDApO1xuICAgICAgICAgIG0yLmxhc3RJbmRleCA9IHRoaXMubGFzdEluZGV4ICsgMTtcbiAgICAgICAgICByZXN1bHQgPSBtMi5leGVjKHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWdleEluZGV4ICs9IHJlc3VsdC5wb3NpdGlvbiArIDE7XG4gICAgICAgIGlmICh0aGlzLnJlZ2V4SW5kZXggPT09IHRoaXMuY291bnQpIHtcbiAgICAgICAgICAvLyB3cmFwLWFyb3VuZCB0byBjb25zaWRlcmluZyBhbGwgbWF0Y2hlcyBhZ2FpblxuICAgICAgICAgIHRoaXMuY29uc2lkZXJBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG1vZGUsIGJ1aWxkcyBhIGh1Z2UgUmVzdW1hYmxlTXVsdGlSZWdleCB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhbGtcbiAgICogdGhlIGNvbnRlbnQgYW5kIGZpbmQgbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAgICogQHJldHVybnMge1Jlc3VtYWJsZU11bHRpUmVnZXh9XG4gICAqL1xuICBmdW5jdGlvbiBidWlsZE1vZGVSZWdleChtb2RlKSB7XG4gICAgY29uc3QgbW0gPSBuZXcgUmVzdW1hYmxlTXVsdGlSZWdleCgpO1xuXG4gICAgbW9kZS5jb250YWlucy5mb3JFYWNoKHRlcm0gPT4gbW0uYWRkUnVsZSh0ZXJtLmJlZ2luLCB7IHJ1bGU6IHRlcm0sIHR5cGU6IFwiYmVnaW5cIiB9KSk7XG5cbiAgICBpZiAobW9kZS50ZXJtaW5hdG9yRW5kKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUudGVybWluYXRvckVuZCwgeyB0eXBlOiBcImVuZFwiIH0pO1xuICAgIH1cbiAgICBpZiAobW9kZS5pbGxlZ2FsKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUuaWxsZWdhbCwgeyB0eXBlOiBcImlsbGVnYWxcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW07XG4gIH1cblxuICAvKiogc2tpcCB2cyBhYm9ydCB2cyBpZ25vcmVcbiAgICpcbiAgICogQHNraXAgICAtIFRoZSBtb2RlIGlzIHN0aWxsIGVudGVyZWQgYW5kIGV4aXRlZCBub3JtYWxseSAoYW5kIGNvbnRhaW5zIHJ1bGVzIGFwcGx5KSxcbiAgICogICAgICAgICAgIGJ1dCBhbGwgY29udGVudCBpcyBoZWxkIGFuZCBhZGRlZCB0byB0aGUgcGFyZW50IGJ1ZmZlciByYXRoZXIgdGhhbiBiZWluZ1xuICAgKiAgICAgICAgICAgb3V0cHV0IHdoZW4gdGhlIG1vZGUgZW5kcy4gIE1vc3RseSB1c2VkIHdpdGggYHN1Ymxhbmd1YWdlYCB0byBidWlsZCB1cFxuICAgKiAgICAgICAgICAgYSBzaW5nbGUgbGFyZ2UgYnVmZmVyIHRoYW4gY2FuIGJlIHBhcnNlZCBieSBzdWJsYW5ndWFnZS5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBiZWdpbiBhbmRzIGVuZHMgbm9ybWFsbHkuXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQgbW9kZSBidWZmZXIuXG4gICAqICAgICAgICAgICAgIC0gVGhlIHBhcnNlciBjdXJzb3IgaXMgbW92ZWQgZm9yd2FyZCBub3JtYWxseS5cbiAgICpcbiAgICogQGFib3J0ICAtIEEgaGFjayBwbGFjZWhvbGRlciB1bnRpbCB3ZSBoYXZlIGlnbm9yZS4gIEFib3J0cyB0aGUgbW9kZSAoYXMgaWYgaXRcbiAgICogICAgICAgICAgIG5ldmVyIG1hdGNoZWQpIGJ1dCBET0VTIE5PVCBjb250aW51ZSB0byBtYXRjaCBzdWJzZXF1ZW50IGBjb250YWluc2BcbiAgICogICAgICAgICAgIG1vZGVzLiAgQWJvcnQgaXMgYmFkL3N1Ym9wdGltYWwgYmVjYXVzZSBpdCBjYW4gcmVzdWx0IGluIG1vZGVzXG4gICAqICAgICAgICAgICBmYXJ0aGVyIGRvd24gbm90IGdldHRpbmcgYXBwbGllZCBiZWNhdXNlIGFuIGVhcmxpZXIgcnVsZSBlYXRzIHRoZVxuICAgKiAgICAgICAgICAgY29udGVudCBidXQgdGhlbiBhYm9ydHMuXG4gICAqXG4gICAqICAgICAgICAgICAgIC0gVGhlIG1vZGUgZG9lcyBub3QgYmVnaW4uXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGJ5IGBiZWdpbmAgaXMgYWRkZWQgdG8gdGhlIG1vZGUgYnVmZmVyLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG1vdmVkIGZvcndhcmQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBpZ25vcmUgLSBJZ25vcmVzIHRoZSBtb2RlIChhcyBpZiBpdCBuZXZlciBtYXRjaGVkKSBhbmQgY29udGludWVzIHRvIG1hdGNoIGFueVxuICAgKiAgICAgICAgICAgc3Vic2VxdWVudCBgY29udGFpbnNgIG1vZGVzLiAgSWdub3JlIGlzbid0IHRlY2huaWNhbGx5IHBvc3NpYmxlIHdpdGhcbiAgICogICAgICAgICAgIHRoZSBjdXJyZW50IHBhcnNlciBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBkb2VzIG5vdCBiZWdpbi5cbiAgICogICAgICAgICAgICAgLSBDb250ZW50IG1hdGNoZWQgYnkgYGJlZ2luYCBpcyBpZ25vcmVkLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG5vdCBtb3ZlZCBmb3J3YXJkLlxuICAgKi9cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBtb2RlXG4gICAqXG4gICAqIFRoaXMgY2FuIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBtb2RlIGNvbnRhaW5zIGNlcnRhaW4gZGV0ZWN0YWJsZSBrbm93biBsb2dpY1xuICAgKiBpc3N1ZXMuXG4gICAqIEBwYXJhbSB7TW9kZX0gbW9kZVxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZSB8IG51bGx9IFtwYXJlbnRdXG4gICAqIEByZXR1cm5zIHtDb21waWxlZE1vZGUgfCBuZXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVNb2RlKG1vZGUsIHBhcmVudCkge1xuICAgIGNvbnN0IGNtb2RlID0gLyoqIEB0eXBlIENvbXBpbGVkTW9kZSAqLyAobW9kZSk7XG4gICAgaWYgKG1vZGUuaXNDb21waWxlZCkgcmV0dXJuIGNtb2RlO1xuXG4gICAgW1xuICAgICAgc2NvcGVDbGFzc05hbWUsXG4gICAgICAvLyBkbyB0aGlzIGVhcmx5IHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgZ2VuZXJhbGx5IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXRcbiAgICAgIC8vIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG1hdGNoL2JlZ2luXG4gICAgICBjb21waWxlTWF0Y2gsXG4gICAgICBNdWx0aUNsYXNzLFxuICAgICAgYmVmb3JlTWF0Y2hFeHRcbiAgICBdLmZvckVhY2goZXh0ID0+IGV4dChtb2RlLCBwYXJlbnQpKTtcblxuICAgIGxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucy5mb3JFYWNoKGV4dCA9PiBleHQobW9kZSwgcGFyZW50KSk7XG5cbiAgICAvLyBfX2JlZm9yZUJlZ2luIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSBBUEksIGludGVybmFsIHVzZSBvbmx5XG4gICAgbW9kZS5fX2JlZm9yZUJlZ2luID0gbnVsbDtcblxuICAgIFtcbiAgICAgIGJlZ2luS2V5d29yZHMsXG4gICAgICAvLyBkbyB0aGlzIGxhdGVyIHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgdGhhdCBjb21lIGVhcmxpZXIgaGF2ZSBhY2Nlc3MgdG8gdGhlXG4gICAgICAvLyByYXcgYXJyYXkgaWYgdGhleSB3YW50ZWQgdG8gcGVyaGFwcyBtYW5pcHVsYXRlIGl0LCBldGMuXG4gICAgICBjb21waWxlSWxsZWdhbCxcbiAgICAgIC8vIGRlZmF1bHQgdG8gMSByZWxldmFuY2UgaWYgbm90IHNwZWNpZmllZFxuICAgICAgY29tcGlsZVJlbGV2YW5jZVxuICAgIF0uZm9yRWFjaChleHQgPT4gZXh0KG1vZGUsIHBhcmVudCkpO1xuXG4gICAgbW9kZS5pc0NvbXBpbGVkID0gdHJ1ZTtcblxuICAgIGxldCBrZXl3b3JkUGF0dGVybiA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBtb2RlLmtleXdvcmRzID09PSBcIm9iamVjdFwiICYmIG1vZGUua2V5d29yZHMuJHBhdHRlcm4pIHtcbiAgICAgIC8vIHdlIG5lZWQgYSBjb3B5IGJlY2F1c2Uga2V5d29yZHMgbWlnaHQgYmUgY29tcGlsZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgIC8vIHNvIHdlIGNhbid0IGdvIGRlbGV0aW5nICRwYXR0ZXJuIGZyb20gdGhlIG9yaWdpbmFsIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gcGFzc1xuICAgICAgbW9kZS5rZXl3b3JkcyA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGUua2V5d29yZHMpO1xuICAgICAga2V5d29yZFBhdHRlcm4gPSBtb2RlLmtleXdvcmRzLiRwYXR0ZXJuO1xuICAgICAgZGVsZXRlIG1vZGUua2V5d29yZHMuJHBhdHRlcm47XG4gICAgfVxuICAgIGtleXdvcmRQYXR0ZXJuID0ga2V5d29yZFBhdHRlcm4gfHwgL1xcdysvO1xuXG4gICAgaWYgKG1vZGUua2V5d29yZHMpIHtcbiAgICAgIG1vZGUua2V5d29yZHMgPSBjb21waWxlS2V5d29yZHMobW9kZS5rZXl3b3JkcywgbGFuZ3VhZ2UuY2FzZV9pbnNlbnNpdGl2ZSk7XG4gICAgfVxuXG4gICAgY21vZGUua2V5d29yZFBhdHRlcm5SZSA9IGxhbmdSZShrZXl3b3JkUGF0dGVybiwgdHJ1ZSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAoIW1vZGUuYmVnaW4pIG1vZGUuYmVnaW4gPSAvXFxCfFxcYi87XG4gICAgICBjbW9kZS5iZWdpblJlID0gbGFuZ1JlKGNtb2RlLmJlZ2luKTtcbiAgICAgIGlmICghbW9kZS5lbmQgJiYgIW1vZGUuZW5kc1dpdGhQYXJlbnQpIG1vZGUuZW5kID0gL1xcQnxcXGIvO1xuICAgICAgaWYgKG1vZGUuZW5kKSBjbW9kZS5lbmRSZSA9IGxhbmdSZShjbW9kZS5lbmQpO1xuICAgICAgY21vZGUudGVybWluYXRvckVuZCA9IHNvdXJjZShjbW9kZS5lbmQpIHx8ICcnO1xuICAgICAgaWYgKG1vZGUuZW5kc1dpdGhQYXJlbnQgJiYgcGFyZW50LnRlcm1pbmF0b3JFbmQpIHtcbiAgICAgICAgY21vZGUudGVybWluYXRvckVuZCArPSAobW9kZS5lbmQgPyAnfCcgOiAnJykgKyBwYXJlbnQudGVybWluYXRvckVuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZGUuaWxsZWdhbCkgY21vZGUuaWxsZWdhbFJlID0gbGFuZ1JlKC8qKiBAdHlwZSB7UmVnRXhwIHwgc3RyaW5nfSAqLyAobW9kZS5pbGxlZ2FsKSk7XG4gICAgaWYgKCFtb2RlLmNvbnRhaW5zKSBtb2RlLmNvbnRhaW5zID0gW107XG5cbiAgICBtb2RlLmNvbnRhaW5zID0gW10uY29uY2F0KC4uLm1vZGUuY29udGFpbnMubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBleHBhbmRPckNsb25lTW9kZShjID09PSAnc2VsZicgPyBtb2RlIDogYyk7XG4gICAgfSkpO1xuICAgIG1vZGUuY29udGFpbnMuZm9yRWFjaChmdW5jdGlvbihjKSB7IGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChjKSwgY21vZGUpOyB9KTtcblxuICAgIGlmIChtb2RlLnN0YXJ0cykge1xuICAgICAgY29tcGlsZU1vZGUobW9kZS5zdGFydHMsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgY21vZGUubWF0Y2hlciA9IGJ1aWxkTW9kZVJlZ2V4KGNtb2RlKTtcbiAgICByZXR1cm4gY21vZGU7XG4gIH1cblxuICBpZiAoIWxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucykgbGFuZ3VhZ2UuY29tcGlsZXJFeHRlbnNpb25zID0gW107XG5cbiAgLy8gc2VsZiBpcyBub3QgdmFsaWQgYXQgdGhlIHRvcC1sZXZlbFxuICBpZiAobGFuZ3VhZ2UuY29udGFpbnMgJiYgbGFuZ3VhZ2UuY29udGFpbnMuaW5jbHVkZXMoJ3NlbGYnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkVSUjogY29udGFpbnMgYHNlbGZgIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIGxhbmd1YWdlLiAgU2VlIGRvY3VtZW50YXRpb24uXCIpO1xuICB9XG5cbiAgLy8gd2UgbmVlZCBhIG51bGwgb2JqZWN0LCB3aGljaCBpbmhlcml0IHdpbGwgZ3VhcmFudGVlXG4gIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXMgPSBpbmhlcml0JDEobGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlcyB8fCB7fSk7XG5cbiAgcmV0dXJuIGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChsYW5ndWFnZSkpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBtb2RlIGhhcyBhIGRlcGVuZGVuY3kgb24gaXQncyBwYXJlbnQgb3Igbm90XG4gKlxuICogSWYgYSBtb2RlIGRvZXMgaGF2ZSBhIHBhcmVudCBkZXBlbmRlbmN5IHRoZW4gb2Z0ZW4gd2UgbmVlZCB0byBjbG9uZSBpdCBpZlxuICogaXQncyB1c2VkIGluIG11bHRpcGxlIHBsYWNlcyBzbyB0aGF0IGVhY2ggY29weSBwb2ludHMgdG8gdGhlIGNvcnJlY3QgcGFyZW50LFxuICogd2hlcmUtYXMgbW9kZXMgd2l0aG91dCBhIHBhcmVudCBjYW4gb2Z0ZW4gc2FmZWx5IGJlIHJlLXVzZWQgYXQgdGhlIGJvdHRvbSBvZlxuICogYSBtb2RlIGNoYWluLlxuICpcbiAqIEBwYXJhbSB7TW9kZSB8IG51bGx9IG1vZGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIGlzIHRoZXJlIGEgZGVwZW5kZW5jeSBvbiB0aGUgcGFyZW50P1xuICogKi9cbmZ1bmN0aW9uIGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSB7XG4gIGlmICghbW9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBtb2RlLmVuZHNXaXRoUGFyZW50IHx8IGRlcGVuZGVuY3lPblBhcmVudChtb2RlLnN0YXJ0cyk7XG59XG5cbi8qKlxuICogRXhwYW5kcyBhIG1vZGUgb3IgY2xvbmVzIGl0IGlmIG5lY2Vzc2FyeVxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBtb2RlcyB3aXRoIHBhcmVudGFsIGRlcGVuZGVuY2VpcyAoc2VlIG5vdGVzIG9uXG4gKiBgZGVwZW5kZW5jeU9uUGFyZW50YCkgYW5kIGZvciBub2RlcyB0aGF0IGhhdmUgYHZhcmlhbnRzYCAtIHdoaWNoIG11c3QgdGhlbiBiZVxuICogZXhwbG9kZWQgaW50byB0aGVpciBvd24gaW5kaXZpZHVhbCBtb2RlcyBhdCBjb21waWxlIHRpbWUuXG4gKlxuICogQHBhcmFtIHtNb2RlfSBtb2RlXG4gKiBAcmV0dXJucyB7TW9kZSB8IE1vZGVbXX1cbiAqICovXG5mdW5jdGlvbiBleHBhbmRPckNsb25lTW9kZShtb2RlKSB7XG4gIGlmIChtb2RlLnZhcmlhbnRzICYmICFtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgbW9kZS5jYWNoZWRWYXJpYW50cyA9IG1vZGUudmFyaWFudHMubWFwKGZ1bmN0aW9uKHZhcmlhbnQpIHtcbiAgICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyB2YXJpYW50czogbnVsbCB9LCB2YXJpYW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEVYUEFORFxuICAvLyBpZiB3ZSBoYXZlIHZhcmlhbnRzIHRoZW4gZXNzZW50aWFsbHkgXCJyZXBsYWNlXCIgdGhlIG1vZGUgd2l0aCB0aGUgdmFyaWFudHNcbiAgLy8gdGhpcyBoYXBwZW5zIGluIGNvbXBpbGVNb2RlLCB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tXG4gIGlmIChtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgcmV0dXJuIG1vZGUuY2FjaGVkVmFyaWFudHM7XG4gIH1cblxuICAvLyBDTE9ORVxuICAvLyBpZiB3ZSBoYXZlIGRlcGVuZGVuY2llcyBvbiBwYXJlbnRzIHRoZW4gd2UgbmVlZCBhIHVuaXF1ZVxuICAvLyBpbnN0YW5jZSBvZiBvdXJzZWx2ZXMsIHNvIHdlIGNhbiBiZSByZXVzZWQgd2l0aCBtYW55XG4gIC8vIGRpZmZlcmVudCBwYXJlbnRzIHdpdGhvdXQgaXNzdWVcbiAgaWYgKGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSkge1xuICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyBzdGFydHM6IG1vZGUuc3RhcnRzID8gaW5oZXJpdCQxKG1vZGUuc3RhcnRzKSA6IG51bGwgfSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmlzRnJvemVuKG1vZGUpKSB7XG4gICAgcmV0dXJuIGluaGVyaXQkMShtb2RlKTtcbiAgfVxuXG4gIC8vIG5vIHNwZWNpYWwgZGVwZW5kZW5jeSBpc3N1ZXMsIGp1c3QgcmV0dXJuIG91cnNlbHZlc1xuICByZXR1cm4gbW9kZTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjExLjguMFwiO1xuXG5jbGFzcyBIVE1MSW5qZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbiwgaHRtbCkge1xuICAgIHN1cGVyKHJlYXNvbik7XG4gICAgdGhpcy5uYW1lID0gXCJIVE1MSW5qZWN0aW9uRXJyb3JcIjtcbiAgICB0aGlzLmh0bWwgPSBodG1sO1xuICB9XG59XG5cbi8qXG5TeW50YXggaGlnaGxpZ2h0aW5nIHdpdGggbGFuZ3VhZ2UgYXV0b2RldGVjdGlvbi5cbmh0dHBzOi8vaGlnaGxpZ2h0anMub3JnL1xuKi9cblxuXG4vKipcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLk1vZGV9IE1vZGVcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Db21waWxlZFNjb3BlfSBDb21waWxlZFNjb3BlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5MYW5ndWFnZX0gTGFuZ3VhZ2VcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhMSlNBcGl9IEhMSlNBcGlcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhMSlNQbHVnaW59IEhMSlNQbHVnaW5cbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLlBsdWdpbkV2ZW50fSBQbHVnaW5FdmVudFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU09wdGlvbnN9IEhMSlNPcHRpb25zXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5MYW5ndWFnZUZufSBMYW5ndWFnZUZuXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5IaWdobGlnaHRlZEhUTUxFbGVtZW50fSBIaWdobGlnaHRlZEhUTUxFbGVtZW50XG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5CZWZvcmVIaWdobGlnaHRDb250ZXh0fSBCZWZvcmVIaWdobGlnaHRDb250ZXh0XG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvcHJpdmF0ZScpLk1hdGNoVHlwZX0gTWF0Y2hUeXBlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvcHJpdmF0ZScpLktleXdvcmREYXRhfSBLZXl3b3JkRGF0YVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5FbmhhbmNlZE1hdGNofSBFbmhhbmNlZE1hdGNoXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvcHJpdmF0ZScpLkFubm90YXRlZEVycm9yfSBBbm5vdGF0ZWRFcnJvclxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQXV0b0hpZ2hsaWdodFJlc3VsdH0gQXV0b0hpZ2hsaWdodFJlc3VsdFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSGlnaGxpZ2h0T3B0aW9uc30gSGlnaGxpZ2h0T3B0aW9uc1xuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSGlnaGxpZ2h0UmVzdWx0fSBIaWdobGlnaHRSZXN1bHRcbiovXG5cblxuY29uc3QgZXNjYXBlID0gZXNjYXBlSFRNTDtcbmNvbnN0IGluaGVyaXQgPSBpbmhlcml0JDE7XG5jb25zdCBOT19NQVRDSCA9IFN5bWJvbChcIm5vbWF0Y2hcIik7XG5jb25zdCBNQVhfS0VZV09SRF9ISVRTID0gNztcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gaGxqcyAtIG9iamVjdCB0aGF0IGlzIGV4dGVuZGVkIChsZWdhY3kpXG4gKiBAcmV0dXJucyB7SExKU0FwaX1cbiAqL1xuY29uc3QgSExKUyA9IGZ1bmN0aW9uKGhsanMpIHtcbiAgLy8gR2xvYmFsIGludGVybmFsIHZhcmlhYmxlcyB1c2VkIHdpdGhpbiB0aGUgaGlnaGxpZ2h0LmpzIGxpYnJhcnkuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTGFuZ3VhZ2U+fSAqL1xuICBjb25zdCBsYW5ndWFnZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGFsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvKiogQHR5cGUge0hMSlNQbHVnaW5bXX0gKi9cbiAgY29uc3QgcGx1Z2lucyA9IFtdO1xuXG4gIC8vIHNhZmUvcHJvZHVjdGlvbiBtb2RlIC0gc3dhbGxvd3MgbW9yZSBlcnJvcnMsIHRyaWVzIHRvIGtlZXAgcnVubmluZ1xuICAvLyBldmVuIGlmIGEgc2luZ2xlIHN5bnRheCBvciBwYXJzZSBoaXRzIGEgZmF0YWwgZXJyb3JcbiAgbGV0IFNBRkVfTU9ERSA9IHRydWU7XG4gIGNvbnN0IExBTkdVQUdFX05PVF9GT1VORCA9IFwiQ291bGQgbm90IGZpbmQgdGhlIGxhbmd1YWdlICd7fScsIGRpZCB5b3UgZm9yZ2V0IHRvIGxvYWQvaW5jbHVkZSBhIGxhbmd1YWdlIG1vZHVsZT9cIjtcbiAgLyoqIEB0eXBlIHtMYW5ndWFnZX0gKi9cbiAgY29uc3QgUExBSU5URVhUX0xBTkdVQUdFID0geyBkaXNhYmxlQXV0b2RldGVjdDogdHJ1ZSwgbmFtZTogJ1BsYWluIHRleHQnLCBjb250YWluczogW10gfTtcblxuICAvLyBHbG9iYWwgb3B0aW9ucyB1c2VkIHdoZW4gd2l0aGluIGV4dGVybmFsIEFQSXMuIFRoaXMgaXMgbW9kaWZpZWQgd2hlblxuICAvLyBjYWxsaW5nIHRoZSBgaGxqcy5jb25maWd1cmVgIGZ1bmN0aW9uLlxuICAvKiogQHR5cGUgSExKU09wdGlvbnMgKi9cbiAgbGV0IG9wdGlvbnMgPSB7XG4gICAgaWdub3JlVW5lc2NhcGVkSFRNTDogZmFsc2UsXG4gICAgdGhyb3dVbmVzY2FwZWRIVE1MOiBmYWxzZSxcbiAgICBub0hpZ2hsaWdodFJlOiAvXihuby0/aGlnaGxpZ2h0KSQvaSxcbiAgICBsYW5ndWFnZURldGVjdFJlOiAvXFxibGFuZyg/OnVhZ2UpPy0oW1xcdy1dKylcXGIvaSxcbiAgICBjbGFzc1ByZWZpeDogJ2hsanMtJyxcbiAgICBjc3NTZWxlY3RvcjogJ3ByZSBjb2RlJyxcbiAgICBsYW5ndWFnZXM6IG51bGwsXG4gICAgLy8gYmV0YSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHN1YmplY3QgdG8gY2hhbmdlLCB3ZWxjb21lIHRvIGRpc2N1c3NcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8xMDg2XG4gICAgX19lbWl0dGVyOiBUb2tlblRyZWVFbWl0dGVyXG4gIH07XG5cbiAgLyogVXRpbGl0eSBmdW5jdGlvbnMgKi9cblxuICAvKipcbiAgICogVGVzdHMgYSBsYW5ndWFnZSBuYW1lIHRvIHNlZSBpZiBoaWdobGlnaHRpbmcgc2hvdWxkIGJlIHNraXBwZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlTmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkTm90SGlnaGxpZ2h0KGxhbmd1YWdlTmFtZSkge1xuICAgIHJldHVybiBvcHRpb25zLm5vSGlnaGxpZ2h0UmUudGVzdChsYW5ndWFnZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SGlnaGxpZ2h0ZWRIVE1MRWxlbWVudH0gYmxvY2sgLSB0aGUgSFRNTCBlbGVtZW50IHRvIGRldGVybWluZSBsYW5ndWFnZSBmb3JcbiAgICovXG4gIGZ1bmN0aW9uIGJsb2NrTGFuZ3VhZ2UoYmxvY2spIHtcbiAgICBsZXQgY2xhc3NlcyA9IGJsb2NrLmNsYXNzTmFtZSArICcgJztcblxuICAgIGNsYXNzZXMgKz0gYmxvY2sucGFyZW50Tm9kZSA/IGJsb2NrLnBhcmVudE5vZGUuY2xhc3NOYW1lIDogJyc7XG5cbiAgICAvLyBsYW5ndWFnZS0qIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBub24tcHJlZml4ZWQgY2xhc3MgbmFtZXMuXG4gICAgY29uc3QgbWF0Y2ggPSBvcHRpb25zLmxhbmd1YWdlRGV0ZWN0UmUuZXhlYyhjbGFzc2VzKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobWF0Y2hbMV0pO1xuICAgICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgICB3YXJuKExBTkdVQUdFX05PVF9GT1VORC5yZXBsYWNlKFwie31cIiwgbWF0Y2hbMV0pKTtcbiAgICAgICAgd2FybihcIkZhbGxpbmcgYmFjayB0byBuby1oaWdobGlnaHQgbW9kZSBmb3IgdGhpcyBibG9jay5cIiwgYmxvY2spO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhbmd1YWdlID8gbWF0Y2hbMV0gOiAnbm8taGlnaGxpZ2h0JztcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlc1xuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5maW5kKChfY2xhc3MpID0+IHNob3VsZE5vdEhpZ2hsaWdodChfY2xhc3MpIHx8IGdldExhbmd1YWdlKF9jbGFzcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgaGlnaGxpZ2h0aW5nIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBPTEQgQVBJXG4gICAqIGhpZ2hsaWdodChsYW5nLCBjb2RlLCBpZ25vcmVJbGxlZ2FscywgY29udGludWF0aW9uKVxuICAgKlxuICAgKiBORVcgQVBJXG4gICAqIGhpZ2hsaWdodChjb2RlLCB7bGFuZywgaWdub3JlSWxsZWdhbHN9KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZU9yTGFuZ3VhZ2VOYW1lIC0gdGhlIGxhbmd1YWdlIHRvIHVzZSBmb3IgaGlnaGxpZ2h0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgSGlnaGxpZ2h0T3B0aW9uc30gb3B0aW9uc09yQ29kZSAtIHRoZSBjb2RlIHRvIGhpZ2hsaWdodFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpZ25vcmVJbGxlZ2Fsc10gLSB3aGV0aGVyIHRvIGlnbm9yZSBpbGxlZ2FsIG1hdGNoZXMsIGRlZmF1bHQgaXMgdG8gYmFpbFxuICAgKlxuICAgKiBAcmV0dXJucyB7SGlnaGxpZ2h0UmVzdWx0fSBSZXN1bHQgLSBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxhbmd1YWdlIC0gdGhlIGxhbmd1YWdlIG5hbWVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHJlbGV2YW5jZSAtIHRoZSByZWxldmFuY2Ugc2NvcmVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdGhlIGhpZ2hsaWdodGVkIEhUTUwgY29kZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIHRoZSBvcmlnaW5hbCByYXcgY29kZVxuICAgKiBAcHJvcGVydHkge0NvbXBpbGVkTW9kZX0gdG9wIC0gdG9wIG9mIHRoZSBjdXJyZW50IG1vZGUgc3RhY2tcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBpbGxlZ2FsIC0gaW5kaWNhdGVzIHdoZXRoZXIgYW55IGlsbGVnYWwgbWF0Y2hlcyB3ZXJlIGZvdW5kXG4gICovXG4gIGZ1bmN0aW9uIGhpZ2hsaWdodChjb2RlT3JMYW5ndWFnZU5hbWUsIG9wdGlvbnNPckNvZGUsIGlnbm9yZUlsbGVnYWxzKSB7XG4gICAgbGV0IGNvZGUgPSBcIlwiO1xuICAgIGxldCBsYW5ndWFnZU5hbWUgPSBcIlwiO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yQ29kZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29kZSA9IGNvZGVPckxhbmd1YWdlTmFtZTtcbiAgICAgIGlnbm9yZUlsbGVnYWxzID0gb3B0aW9uc09yQ29kZS5pZ25vcmVJbGxlZ2FscztcbiAgICAgIGxhbmd1YWdlTmFtZSA9IG9wdGlvbnNPckNvZGUubGFuZ3VhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9sZCBBUElcbiAgICAgIGRlcHJlY2F0ZWQoXCIxMC43LjBcIiwgXCJoaWdobGlnaHQobGFuZywgY29kZSwgLi4uYXJncykgaGFzIGJlZW4gZGVwcmVjYXRlZC5cIik7XG4gICAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiUGxlYXNlIHVzZSBoaWdobGlnaHQoY29kZSwgb3B0aW9ucykgaW5zdGVhZC5cXG5odHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yMjc3XCIpO1xuICAgICAgbGFuZ3VhZ2VOYW1lID0gY29kZU9yTGFuZ3VhZ2VOYW1lO1xuICAgICAgY29kZSA9IG9wdGlvbnNPckNvZGU7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzE0OVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgICBpZiAoaWdub3JlSWxsZWdhbHMgPT09IHVuZGVmaW5lZCkgeyBpZ25vcmVJbGxlZ2FscyA9IHRydWU7IH1cblxuICAgIC8qKiBAdHlwZSB7QmVmb3JlSGlnaGxpZ2h0Q29udGV4dH0gKi9cbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgY29kZSxcbiAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZU5hbWVcbiAgICB9O1xuICAgIC8vIHRoZSBwbHVnaW4gY2FuIGNoYW5nZSB0aGUgZGVzaXJlZCBsYW5ndWFnZSBvciB0aGUgY29kZSB0byBiZSBoaWdobGlnaHRlZFxuICAgIC8vIGp1c3QgYmUgY2hhbmdpbmcgdGhlIG9iamVjdCBpdCB3YXMgcGFzc2VkXG4gICAgZmlyZShcImJlZm9yZTpoaWdobGlnaHRcIiwgY29udGV4dCk7XG5cbiAgICAvLyBhIGJlZm9yZSBwbHVnaW4gY2FuIHVzdXJwIHRoZSByZXN1bHQgY29tcGxldGVseSBieSBwcm92aWRpbmcgaXQncyBvd25cbiAgICAvLyBpbiB3aGljaCBjYXNlIHdlIGRvbid0IGV2ZW4gbmVlZCB0byBjYWxsIGhpZ2hsaWdodFxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucmVzdWx0XG4gICAgICA/IGNvbnRleHQucmVzdWx0XG4gICAgICA6IF9oaWdobGlnaHQoY29udGV4dC5sYW5ndWFnZSwgY29udGV4dC5jb2RlLCBpZ25vcmVJbGxlZ2Fscyk7XG5cbiAgICByZXN1bHQuY29kZSA9IGNvbnRleHQuY29kZTtcbiAgICAvLyB0aGUgcGx1Z2luIGNhbiBjaGFuZ2UgYW55dGhpbmcgaW4gcmVzdWx0IHRvIHN1aXRlIGl0XG4gICAgZmlyZShcImFmdGVyOmhpZ2hsaWdodFwiLCByZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBwcml2YXRlIGhpZ2hsaWdodCB0aGF0J3MgdXNlZCBpbnRlcm5hbGx5IGFuZCBkb2VzIG5vdCBmaXJlIGNhbGxiYWNrc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VOYW1lIC0gdGhlIGxhbmd1YWdlIHRvIHVzZSBmb3IgaGlnaGxpZ2h0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlVG9IaWdobGlnaHQgLSB0aGUgY29kZSB0byBoaWdobGlnaHRcbiAgICogQHBhcmFtIHtib29sZWFuP30gW2lnbm9yZUlsbGVnYWxzXSAtIHdoZXRoZXIgdG8gaWdub3JlIGlsbGVnYWwgbWF0Y2hlcywgZGVmYXVsdCBpcyB0byBiYWlsXG4gICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlP30gW2NvbnRpbnVhdGlvbl0gLSBjdXJyZW50IGNvbnRpbnVhdGlvbiBtb2RlLCBpZiBhbnlcbiAgICogQHJldHVybnMge0hpZ2hsaWdodFJlc3VsdH0gLSByZXN1bHQgb2YgdGhlIGhpZ2hsaWdodCBvcGVyYXRpb25cbiAgKi9cbiAgZnVuY3Rpb24gX2hpZ2hsaWdodChsYW5ndWFnZU5hbWUsIGNvZGVUb0hpZ2hsaWdodCwgaWdub3JlSWxsZWdhbHMsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IGtleXdvcmRIaXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBrZXl3b3JkIGRhdGEgaWYgYSBtYXRjaCBpcyBhIGtleXdvcmRcbiAgICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZSAtIGN1cnJlbnQgbW9kZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFRleHQgLSB0aGUgdGV4dHVhbCBtYXRjaFxuICAgICAqIEByZXR1cm5zIHtLZXl3b3JkRGF0YSB8IGZhbHNlfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXdvcmREYXRhKG1vZGUsIG1hdGNoVGV4dCkge1xuICAgICAgcmV0dXJuIG1vZGUua2V5d29yZHNbbWF0Y2hUZXh0XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzS2V5d29yZHMoKSB7XG4gICAgICBpZiAoIXRvcC5rZXl3b3Jkcykge1xuICAgICAgICBlbWl0dGVyLmFkZFRleHQobW9kZUJ1ZmZlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgICB0b3Aua2V5d29yZFBhdHRlcm5SZS5sYXN0SW5kZXggPSAwO1xuICAgICAgbGV0IG1hdGNoID0gdG9wLmtleXdvcmRQYXR0ZXJuUmUuZXhlYyhtb2RlQnVmZmVyKTtcbiAgICAgIGxldCBidWYgPSBcIlwiO1xuXG4gICAgICB3aGlsZSAobWF0Y2gpIHtcbiAgICAgICAgYnVmICs9IG1vZGVCdWZmZXIuc3Vic3RyaW5nKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpO1xuICAgICAgICBjb25zdCB3b3JkID0gbGFuZ3VhZ2UuY2FzZV9pbnNlbnNpdGl2ZSA/IG1hdGNoWzBdLnRvTG93ZXJDYXNlKCkgOiBtYXRjaFswXTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGtleXdvcmREYXRhKHRvcCwgd29yZCk7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgY29uc3QgW2tpbmQsIGtleXdvcmRSZWxldmFuY2VdID0gZGF0YTtcbiAgICAgICAgICBlbWl0dGVyLmFkZFRleHQoYnVmKTtcbiAgICAgICAgICBidWYgPSBcIlwiO1xuXG4gICAgICAgICAga2V5d29yZEhpdHNbd29yZF0gPSAoa2V5d29yZEhpdHNbd29yZF0gfHwgMCkgKyAxO1xuICAgICAgICAgIGlmIChrZXl3b3JkSGl0c1t3b3JkXSA8PSBNQVhfS0VZV09SRF9ISVRTKSByZWxldmFuY2UgKz0ga2V5d29yZFJlbGV2YW5jZTtcbiAgICAgICAgICBpZiAoa2luZC5zdGFydHNXaXRoKFwiX1wiKSkge1xuICAgICAgICAgICAgLy8gXyBpbXBsaWVkIGZvciByZWxldmFuY2Ugb25seSwgZG8gbm90IGhpZ2hsaWdodFxuICAgICAgICAgICAgLy8gYnkgYXBwbHlpbmcgYSBjbGFzcyBuYW1lXG4gICAgICAgICAgICBidWYgKz0gbWF0Y2hbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNzc0NsYXNzID0gbGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlc1traW5kXSB8fCBraW5kO1xuICAgICAgICAgICAgZW1pdEtleXdvcmQobWF0Y2hbMF0sIGNzc0NsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmICs9IG1hdGNoWzBdO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJbmRleCA9IHRvcC5rZXl3b3JkUGF0dGVyblJlLmxhc3RJbmRleDtcbiAgICAgICAgbWF0Y2ggPSB0b3Aua2V5d29yZFBhdHRlcm5SZS5leGVjKG1vZGVCdWZmZXIpO1xuICAgICAgfVxuICAgICAgYnVmICs9IG1vZGVCdWZmZXIuc3Vic3RyaW5nKGxhc3RJbmRleCk7XG4gICAgICBlbWl0dGVyLmFkZFRleHQoYnVmKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzU3ViTGFuZ3VhZ2UoKSB7XG4gICAgICBpZiAobW9kZUJ1ZmZlciA9PT0gXCJcIikgcmV0dXJuO1xuICAgICAgLyoqIEB0eXBlIEhpZ2hsaWdodFJlc3VsdCAqL1xuICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2YgdG9wLnN1Ykxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWxhbmd1YWdlc1t0b3Auc3ViTGFuZ3VhZ2VdKSB7XG4gICAgICAgICAgZW1pdHRlci5hZGRUZXh0KG1vZGVCdWZmZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBfaGlnaGxpZ2h0KHRvcC5zdWJMYW5ndWFnZSwgbW9kZUJ1ZmZlciwgdHJ1ZSwgY29udGludWF0aW9uc1t0b3Auc3ViTGFuZ3VhZ2VdKTtcbiAgICAgICAgY29udGludWF0aW9uc1t0b3Auc3ViTGFuZ3VhZ2VdID0gLyoqIEB0eXBlIHtDb21waWxlZE1vZGV9ICovIChyZXN1bHQuX3RvcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBoaWdobGlnaHRBdXRvKG1vZGVCdWZmZXIsIHRvcC5zdWJMYW5ndWFnZS5sZW5ndGggPyB0b3Auc3ViTGFuZ3VhZ2UgOiBudWxsKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ291bnRpbmcgZW1iZWRkZWQgbGFuZ3VhZ2Ugc2NvcmUgdG93YXJkcyB0aGUgaG9zdCBsYW5ndWFnZSBtYXkgYmUgZGlzYWJsZWRcbiAgICAgIC8vIHdpdGggemVyb2luZyB0aGUgY29udGFpbmluZyBtb2RlIHJlbGV2YW5jZS4gVXNlIGNhc2UgaW4gcG9pbnQgaXMgTWFya2Rvd24gdGhhdFxuICAgICAgLy8gYWxsb3dzIFhNTCBldmVyeXdoZXJlIGFuZCBtYWtlcyBldmVyeSBYTUwgc25pcHBldCB0byBoYXZlIGEgbXVjaCBsYXJnZXIgTWFya2Rvd25cbiAgICAgIC8vIHNjb3JlLlxuICAgICAgaWYgKHRvcC5yZWxldmFuY2UgPiAwKSB7XG4gICAgICAgIHJlbGV2YW5jZSArPSByZXN1bHQucmVsZXZhbmNlO1xuICAgICAgfVxuICAgICAgZW1pdHRlci5fX2FkZFN1Ymxhbmd1YWdlKHJlc3VsdC5fZW1pdHRlciwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQnVmZmVyKCkge1xuICAgICAgaWYgKHRvcC5zdWJMYW5ndWFnZSAhPSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3NTdWJMYW5ndWFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0tleXdvcmRzKCk7XG4gICAgICB9XG4gICAgICBtb2RlQnVmZmVyID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbWl0S2V5d29yZChrZXl3b3JkLCBzY29wZSkge1xuICAgICAgaWYgKGtleXdvcmQgPT09IFwiXCIpIHJldHVybjtcblxuICAgICAgZW1pdHRlci5zdGFydFNjb3BlKHNjb3BlKTtcbiAgICAgIGVtaXR0ZXIuYWRkVGV4dChrZXl3b3JkKTtcbiAgICAgIGVtaXR0ZXIuZW5kU2NvcGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0NvbXBpbGVkU2NvcGV9IHNjb3BlXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVtaXRNdWx0aUNsYXNzKHNjb3BlLCBtYXRjaCkge1xuICAgICAgbGV0IGkgPSAxO1xuICAgICAgY29uc3QgbWF4ID0gbWF0Y2gubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpIDw9IG1heCkge1xuICAgICAgICBpZiAoIXNjb3BlLl9lbWl0W2ldKSB7IGkrKzsgY29udGludWU7IH1cbiAgICAgICAgY29uc3Qga2xhc3MgPSBsYW5ndWFnZS5jbGFzc05hbWVBbGlhc2VzW3Njb3BlW2ldXSB8fCBzY29wZVtpXTtcbiAgICAgICAgY29uc3QgdGV4dCA9IG1hdGNoW2ldO1xuICAgICAgICBpZiAoa2xhc3MpIHtcbiAgICAgICAgICBlbWl0S2V5d29yZCh0ZXh0LCBrbGFzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IHRleHQ7XG4gICAgICAgICAgcHJvY2Vzc0tleXdvcmRzKCk7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlfSBtb2RlIC0gbmV3IG1vZGUgdG8gc3RhcnRcbiAgICAgKiBAcGFyYW0ge1JlZ0V4cE1hdGNoQXJyYXl9IG1hdGNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnROZXdNb2RlKG1vZGUsIG1hdGNoKSB7XG4gICAgICBpZiAobW9kZS5zY29wZSAmJiB0eXBlb2YgbW9kZS5zY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlbWl0dGVyLm9wZW5Ob2RlKGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNbbW9kZS5zY29wZV0gfHwgbW9kZS5zY29wZSk7XG4gICAgICB9XG4gICAgICBpZiAobW9kZS5iZWdpblNjb3BlKSB7XG4gICAgICAgIC8vIGJlZ2luU2NvcGUganVzdCB3cmFwcyB0aGUgYmVnaW4gbWF0Y2ggaXRzZWxmIGluIGEgc2NvcGVcbiAgICAgICAgaWYgKG1vZGUuYmVnaW5TY29wZS5fd3JhcCkge1xuICAgICAgICAgIGVtaXRLZXl3b3JkKG1vZGVCdWZmZXIsIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNbbW9kZS5iZWdpblNjb3BlLl93cmFwXSB8fCBtb2RlLmJlZ2luU2NvcGUuX3dyYXApO1xuICAgICAgICAgIG1vZGVCdWZmZXIgPSBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUuYmVnaW5TY29wZS5fbXVsdGkpIHtcbiAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IG1vZGVCdWZmZXIgc2hvdWxkIGp1c3QgYmUgdGhlIG1hdGNoXG4gICAgICAgICAgZW1pdE11bHRpQ2xhc3MobW9kZS5iZWdpblNjb3BlLCBtYXRjaCk7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdG9wID0gT2JqZWN0LmNyZWF0ZShtb2RlLCB7IHBhcmVudDogeyB2YWx1ZTogdG9wIH0gfSk7XG4gICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlIH0gbW9kZSAtIHRoZSBtb2RlIHRvIHBvdGVudGlhbGx5IGVuZFxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2ggLSB0aGUgbGF0ZXN0IG1hdGNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoUGx1c1JlbWFpbmRlciAtIG1hdGNoIHBsdXMgcmVtYWluZGVyIG9mIGNvbnRlbnRcbiAgICAgKiBAcmV0dXJucyB7Q29tcGlsZWRNb2RlIHwgdm9pZH0gLSB0aGUgbmV4dCBtb2RlLCBvciBpZiB2b2lkIGNvbnRpbnVlIG9uIGluIGN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuZE9mTW9kZShtb2RlLCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKSB7XG4gICAgICBsZXQgbWF0Y2hlZCA9IHN0YXJ0c1dpdGgobW9kZS5lbmRSZSwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcblxuICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgaWYgKG1vZGVbXCJvbjplbmRcIl0pIHtcbiAgICAgICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG1vZGUpO1xuICAgICAgICAgIG1vZGVbXCJvbjplbmRcIl0obWF0Y2gsIHJlc3ApO1xuICAgICAgICAgIGlmIChyZXNwLmlzTWF0Y2hJZ25vcmVkKSBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgIHdoaWxlIChtb2RlLmVuZHNQYXJlbnQgJiYgbW9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIG1vZGUgPSBtb2RlLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGV2ZW4gaWYgb246ZW5kIGZpcmVzIGFuIGBpZ25vcmVgIGl0J3Mgc3RpbGwgcG9zc2libGVcbiAgICAgIC8vIHRoYXQgd2UgbWlnaHQgdHJpZ2dlciB0aGUgZW5kIG5vZGUgYmVjYXVzZSBvZiBhIHBhcmVudCBtb2RlXG4gICAgICBpZiAobW9kZS5lbmRzV2l0aFBhcmVudCkge1xuICAgICAgICByZXR1cm4gZW5kT2ZNb2RlKG1vZGUucGFyZW50LCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbWF0Y2hpbmcgYnV0IHRoZW4gaWdub3JpbmcgYSBzZXF1ZW5jZSBvZiB0ZXh0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGV4ZW1lIC0gc3RyaW5nIGNvbnRhaW5pbmcgZnVsbCBtYXRjaCB0ZXh0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9JZ25vcmUobGV4ZW1lKSB7XG4gICAgICBpZiAodG9wLm1hdGNoZXIucmVnZXhJbmRleCA9PT0gMCkge1xuICAgICAgICAvLyBubyBtb3JlIHJlZ2V4ZXMgdG8gcG90ZW50aWFsbHkgbWF0Y2ggaGVyZSwgc28gd2UgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgb25lXG4gICAgICAgIC8vIHNwYWNlXG4gICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lWzBdO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIG5lZWQgdG8gbW92ZSB0aGUgY3Vyc29yLCB3ZSBzdGlsbCBoYXZlIGFkZGl0aW9uYWwgcmVnZXhlcyB0byB0cnkgYW5kXG4gICAgICAgIC8vIG1hdGNoIGF0IHRoaXMgdmVyeSBzcG90XG4gICAgICAgIHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgc3RhcnQgb2YgYSBuZXcgcG90ZW50aWFsIG1vZGUgbWF0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RW5oYW5jZWRNYXRjaH0gbWF0Y2ggLSB0aGUgY3VycmVudCBtYXRjaFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IGhvdyBmYXIgdG8gYWR2YW5jZSB0aGUgcGFyc2UgY3Vyc29yXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9CZWdpbk1hdGNoKG1hdGNoKSB7XG4gICAgICBjb25zdCBsZXhlbWUgPSBtYXRjaFswXTtcbiAgICAgIGNvbnN0IG5ld01vZGUgPSBtYXRjaC5ydWxlO1xuXG4gICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG5ld01vZGUpO1xuICAgICAgLy8gZmlyc3QgaW50ZXJuYWwgYmVmb3JlIGNhbGxiYWNrcywgdGhlbiB0aGUgcHVibGljIG9uZXNcbiAgICAgIGNvbnN0IGJlZm9yZUNhbGxiYWNrcyA9IFtuZXdNb2RlLl9fYmVmb3JlQmVnaW4sIG5ld01vZGVbXCJvbjpiZWdpblwiXV07XG4gICAgICBmb3IgKGNvbnN0IGNiIG9mIGJlZm9yZUNhbGxiYWNrcykge1xuICAgICAgICBpZiAoIWNiKSBjb250aW51ZTtcbiAgICAgICAgY2IobWF0Y2gsIHJlc3ApO1xuICAgICAgICBpZiAocmVzcC5pc01hdGNoSWdub3JlZCkgcmV0dXJuIGRvSWdub3JlKGxleGVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdNb2RlLnNraXApIHtcbiAgICAgICAgbW9kZUJ1ZmZlciArPSBsZXhlbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGlmICghbmV3TW9kZS5yZXR1cm5CZWdpbiAmJiAhbmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gbGV4ZW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydE5ld01vZGUobmV3TW9kZSwgbWF0Y2gpO1xuICAgICAgcmV0dXJuIG5ld01vZGUucmV0dXJuQmVnaW4gPyAwIDogbGV4ZW1lLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIHBvdGVudGlhbCBlbmQgb2YgbW9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaCAtIHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9FbmRNYXRjaChtYXRjaCkge1xuICAgICAgY29uc3QgbGV4ZW1lID0gbWF0Y2hbMF07XG4gICAgICBjb25zdCBtYXRjaFBsdXNSZW1haW5kZXIgPSBjb2RlVG9IaWdobGlnaHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KTtcblxuICAgICAgY29uc3QgZW5kTW9kZSA9IGVuZE9mTW9kZSh0b3AsIG1hdGNoLCBtYXRjaFBsdXNSZW1haW5kZXIpO1xuICAgICAgaWYgKCFlbmRNb2RlKSB7IHJldHVybiBOT19NQVRDSDsgfVxuXG4gICAgICBjb25zdCBvcmlnaW4gPSB0b3A7XG4gICAgICBpZiAodG9wLmVuZFNjb3BlICYmIHRvcC5lbmRTY29wZS5fd3JhcCkge1xuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGVtaXRLZXl3b3JkKGxleGVtZSwgdG9wLmVuZFNjb3BlLl93cmFwKTtcbiAgICAgIH0gZWxzZSBpZiAodG9wLmVuZFNjb3BlICYmIHRvcC5lbmRTY29wZS5fbXVsdGkpIHtcbiAgICAgICAgcHJvY2Vzc0J1ZmZlcigpO1xuICAgICAgICBlbWl0TXVsdGlDbGFzcyh0b3AuZW5kU2NvcGUsIG1hdGNoKTtcbiAgICAgIH0gZWxzZSBpZiAob3JpZ2luLnNraXApIHtcbiAgICAgICAgbW9kZUJ1ZmZlciArPSBsZXhlbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShvcmlnaW4ucmV0dXJuRW5kIHx8IG9yaWdpbi5leGNsdWRlRW5kKSkge1xuICAgICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NCdWZmZXIoKTtcbiAgICAgICAgaWYgKG9yaWdpbi5leGNsdWRlRW5kKSB7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZG8ge1xuICAgICAgICBpZiAodG9wLnNjb3BlKSB7XG4gICAgICAgICAgZW1pdHRlci5jbG9zZU5vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvcC5za2lwICYmICF0b3Auc3ViTGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZWxldmFuY2UgKz0gdG9wLnJlbGV2YW5jZTtcbiAgICAgICAgfVxuICAgICAgICB0b3AgPSB0b3AucGFyZW50O1xuICAgICAgfSB3aGlsZSAodG9wICE9PSBlbmRNb2RlLnBhcmVudCk7XG4gICAgICBpZiAoZW5kTW9kZS5zdGFydHMpIHtcbiAgICAgICAgc3RhcnROZXdNb2RlKGVuZE1vZGUuc3RhcnRzLCBtYXRjaCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luLnJldHVybkVuZCA/IDAgOiBsZXhlbWUubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NDb250aW51YXRpb25zKCkge1xuICAgICAgY29uc3QgbGlzdCA9IFtdO1xuICAgICAgZm9yIChsZXQgY3VycmVudCA9IHRvcDsgY3VycmVudCAhPT0gbGFuZ3VhZ2U7IGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudCkge1xuICAgICAgICBpZiAoY3VycmVudC5zY29wZSkge1xuICAgICAgICAgIGxpc3QudW5zaGlmdChjdXJyZW50LnNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4gZW1pdHRlci5vcGVuTm9kZShpdGVtKSk7XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHt7dHlwZT86IE1hdGNoVHlwZSwgaW5kZXg/OiBudW1iZXIsIHJ1bGU/OiBNb2RlfX19ICovXG4gICAgbGV0IGxhc3RNYXRjaCA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogIFByb2Nlc3MgYW4gaW5kaXZpZHVhbCBtYXRjaFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRCZWZvcmVNYXRjaCAtIHRleHQgcHJlY2VkaW5nIHRoZSBtYXRjaCAoc2luY2UgdGhlIGxhc3QgbWF0Y2gpXG4gICAgICogQHBhcmFtIHtFbmhhbmNlZE1hdGNofSBbbWF0Y2hdIC0gdGhlIG1hdGNoIGl0c2VsZlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb2Nlc3NMZXhlbWUodGV4dEJlZm9yZU1hdGNoLCBtYXRjaCkge1xuICAgICAgY29uc3QgbGV4ZW1lID0gbWF0Y2ggJiYgbWF0Y2hbMF07XG5cbiAgICAgIC8vIGFkZCBub24tbWF0Y2hlZCB0ZXh0IHRvIHRoZSBjdXJyZW50IG1vZGUgYnVmZmVyXG4gICAgICBtb2RlQnVmZmVyICs9IHRleHRCZWZvcmVNYXRjaDtcblxuICAgICAgaWYgKGxleGVtZSA9PSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3NCdWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlJ3ZlIGZvdW5kIGEgMCB3aWR0aCBtYXRjaCBhbmQgd2UncmUgc3R1Y2ssIHNvIHdlIG5lZWQgdG8gYWR2YW5jZVxuICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBiYWRseSBiZWhhdmVkIHJ1bGVzIHRoYXQgaGF2ZSBvcHRpb25hbCBtYXRjaGVycyB0byB0aGUgZGVncmVlIHRoYXRcbiAgICAgIC8vIHNvbWV0aW1lcyB0aGV5IGNhbiBlbmQgdXAgbWF0Y2hpbmcgbm90aGluZyBhdCBhbGxcbiAgICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjE0MFxuICAgICAgaWYgKGxhc3RNYXRjaC50eXBlID09PSBcImJlZ2luXCIgJiYgbWF0Y2gudHlwZSA9PT0gXCJlbmRcIiAmJiBsYXN0TWF0Y2guaW5kZXggPT09IG1hdGNoLmluZGV4ICYmIGxleGVtZSA9PT0gXCJcIikge1xuICAgICAgICAvLyBzcGl0IHRoZSBcInNraXBwZWRcIiBjaGFyYWN0ZXIgdGhhdCBvdXIgcmVnZXggY2hva2VkIG9uIGJhY2sgaW50byB0aGUgb3V0cHV0IHNlcXVlbmNlXG4gICAgICAgIG1vZGVCdWZmZXIgKz0gY29kZVRvSGlnaGxpZ2h0LnNsaWNlKG1hdGNoLmluZGV4LCBtYXRjaC5pbmRleCArIDEpO1xuICAgICAgICBpZiAoIVNBRkVfTU9ERSkge1xuICAgICAgICAgIC8qKiBAdHlwZSB7QW5ub3RhdGVkRXJyb3J9ICovXG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGAwIHdpZHRoIG1hdGNoIHJlZ2V4ICgke2xhbmd1YWdlTmFtZX0pYCk7XG4gICAgICAgICAgZXJyLmxhbmd1YWdlTmFtZSA9IGxhbmd1YWdlTmFtZTtcbiAgICAgICAgICBlcnIuYmFkUnVsZSA9IGxhc3RNYXRjaC5ydWxlO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGxhc3RNYXRjaCA9IG1hdGNoO1xuXG4gICAgICBpZiAobWF0Y2gudHlwZSA9PT0gXCJiZWdpblwiKSB7XG4gICAgICAgIHJldHVybiBkb0JlZ2luTWF0Y2gobWF0Y2gpO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaC50eXBlID09PSBcImlsbGVnYWxcIiAmJiAhaWdub3JlSWxsZWdhbHMpIHtcbiAgICAgICAgLy8gaWxsZWdhbCBtYXRjaCwgd2UgZG8gbm90IGNvbnRpbnVlIHByb2Nlc3NpbmdcbiAgICAgICAgLyoqIEB0eXBlIHtBbm5vdGF0ZWRFcnJvcn0gKi9cbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdJbGxlZ2FsIGxleGVtZSBcIicgKyBsZXhlbWUgKyAnXCIgZm9yIG1vZGUgXCInICsgKHRvcC5zY29wZSB8fCAnPHVubmFtZWQ+JykgKyAnXCInKTtcbiAgICAgICAgZXJyLm1vZGUgPSB0b3A7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2gudHlwZSA9PT0gXCJlbmRcIikge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBkb0VuZE1hdGNoKG1hdGNoKTtcbiAgICAgICAgaWYgKHByb2Nlc3NlZCAhPT0gTk9fTUFUQ0gpIHtcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGVkZ2UgY2FzZSBmb3Igd2hlbiBpbGxlZ2FsIG1hdGNoZXMgJCAoZW5kIG9mIGxpbmUpIHdoaWNoIGlzIHRlY2huaWNhbGx5XG4gICAgICAvLyBhIDAgd2lkdGggbWF0Y2ggYnV0IG5vdCBhIGJlZ2luL2VuZCBtYXRjaCBzbyBpdCdzIG5vdCBjYXVnaHQgYnkgdGhlXG4gICAgICAvLyBmaXJzdCBoYW5kbGVyICh3aGVuIGlnbm9yZUlsbGVnYWxzIGlzIHRydWUpXG4gICAgICBpZiAobWF0Y2gudHlwZSA9PT0gXCJpbGxlZ2FsXCIgJiYgbGV4ZW1lID09PSBcIlwiKSB7XG4gICAgICAgIC8vIGFkdmFuY2Ugc28gd2UgYXJlbid0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3BcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8vIGluZmluaXRlIGxvb3BzIGFyZSBCQUQsIHRoaXMgaXMgYSBsYXN0IGRpdGNoIGNhdGNoIGFsbC4gaWYgd2UgaGF2ZSBhXG4gICAgICAvLyBkZWNlbnQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgeWV0IG91ciBpbmRleCAoY3Vyc29yIHBvc2l0aW9uIGluIG91clxuICAgICAgLy8gcGFyc2luZykgc3RpbGwgM3ggYmVoaW5kIG91ciBpbmRleCB0aGVuIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nXG4gICAgICAvLyBzbyB3ZSBiYWlsXG4gICAgICBpZiAoaXRlcmF0aW9ucyA+IDEwMDAwMCAmJiBpdGVyYXRpb25zID4gbWF0Y2guaW5kZXggKiAzKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcigncG90ZW50aWFsIGluZmluaXRlIGxvb3AsIHdheSBtb3JlIGl0ZXJhdGlvbnMgdGhhbiBtYXRjaGVzJyk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgIFdoeSBtaWdodCBiZSBmaW5kIG91cnNlbHZlcyBoZXJlPyAgQW4gcG90ZW50aWFsIGVuZCBtYXRjaCB0aGF0IHdhc1xuICAgICAgdHJpZ2dlcmVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkLiAgSUUsIGBkb0VuZE1hdGNoYCByZXR1cm5lZCBOT19NQVRDSC5cbiAgICAgICh0aGlzIGNvdWxkIGJlIGJlY2F1c2UgYSBjYWxsYmFjayByZXF1ZXN0cyB0aGUgbWF0Y2ggYmUgaWdub3JlZCwgZXRjKVxuXG4gICAgICBUaGlzIGNhdXNlcyBubyByZWFsIGhhcm0gb3RoZXIgdGhhbiBzdG9wcGluZyBhIGZldyB0aW1lcyB0b28gbWFueS5cbiAgICAgICovXG5cbiAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lO1xuICAgICAgcmV0dXJuIGxleGVtZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShsYW5ndWFnZU5hbWUpO1xuICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgIGVycm9yKExBTkdVQUdFX05PVF9GT1VORC5yZXBsYWNlKFwie31cIiwgbGFuZ3VhZ2VOYW1lKSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGFuZ3VhZ2U6IFwiJyArIGxhbmd1YWdlTmFtZSArICdcIicpO1xuICAgIH1cblxuICAgIGNvbnN0IG1kID0gY29tcGlsZUxhbmd1YWdlKGxhbmd1YWdlKTtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgLyoqIEB0eXBlIHtDb21waWxlZE1vZGV9ICovXG4gICAgbGV0IHRvcCA9IGNvbnRpbnVhdGlvbiB8fCBtZDtcbiAgICAvKiogQHR5cGUgUmVjb3JkPHN0cmluZyxDb21waWxlZE1vZGU+ICovXG4gICAgY29uc3QgY29udGludWF0aW9ucyA9IHt9OyAvLyBrZWVwIGNvbnRpbnVhdGlvbnMgZm9yIHN1Yi1sYW5ndWFnZXNcbiAgICBjb25zdCBlbWl0dGVyID0gbmV3IG9wdGlvbnMuX19lbWl0dGVyKG9wdGlvbnMpO1xuICAgIHByb2Nlc3NDb250aW51YXRpb25zKCk7XG4gICAgbGV0IG1vZGVCdWZmZXIgPSAnJztcbiAgICBsZXQgcmVsZXZhbmNlID0gMDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBsZXQgcmVzdW1lU2NhbkF0U2FtZVBvc2l0aW9uID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFsYW5ndWFnZS5fX2VtaXRUb2tlbnMpIHtcbiAgICAgICAgdG9wLm1hdGNoZXIuY29uc2lkZXJBbGwoKTtcblxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICAgIGlmIChyZXN1bWVTY2FuQXRTYW1lUG9zaXRpb24pIHtcbiAgICAgICAgICAgIC8vIG9ubHkgcmVnZXhlcyBub3QgbWF0Y2hlZCBwcmV2aW91c2x5IHdpbGwgbm93IGJlXG4gICAgICAgICAgICAvLyBjb25zaWRlcmVkIGZvciBhIHBvdGVudGlhbCBtYXRjaFxuICAgICAgICAgICAgcmVzdW1lU2NhbkF0U2FtZVBvc2l0aW9uID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvcC5tYXRjaGVyLmNvbnNpZGVyQWxsKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvcC5tYXRjaGVyLmxhc3RJbmRleCA9IGluZGV4O1xuXG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSB0b3AubWF0Y2hlci5leGVjKGNvZGVUb0hpZ2hsaWdodCk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaFwiLCBtYXRjaFswXSwgbWF0Y2gucnVsZSAmJiBtYXRjaC5ydWxlLmJlZ2luKVxuXG4gICAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVNYXRjaCA9IGNvZGVUb0hpZ2hsaWdodC5zdWJzdHJpbmcoaW5kZXgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgICBjb25zdCBwcm9jZXNzZWRDb3VudCA9IHByb2Nlc3NMZXhlbWUoYmVmb3JlTWF0Y2gsIG1hdGNoKTtcbiAgICAgICAgICBpbmRleCA9IG1hdGNoLmluZGV4ICsgcHJvY2Vzc2VkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0xleGVtZShjb2RlVG9IaWdobGlnaHQuc3Vic3RyaW5nKGluZGV4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYW5ndWFnZS5fX2VtaXRUb2tlbnMoY29kZVRvSGlnaGxpZ2h0LCBlbWl0dGVyKTtcbiAgICAgIH1cblxuICAgICAgZW1pdHRlci5maW5hbGl6ZSgpO1xuICAgICAgcmVzdWx0ID0gZW1pdHRlci50b0hUTUwoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlTmFtZSxcbiAgICAgICAgdmFsdWU6IHJlc3VsdCxcbiAgICAgICAgcmVsZXZhbmNlLFxuICAgICAgICBpbGxlZ2FsOiBmYWxzZSxcbiAgICAgICAgX2VtaXR0ZXI6IGVtaXR0ZXIsXG4gICAgICAgIF90b3A6IHRvcFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIubWVzc2FnZSAmJiBlcnIubWVzc2FnZS5pbmNsdWRlcygnSWxsZWdhbCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlTmFtZSxcbiAgICAgICAgICB2YWx1ZTogZXNjYXBlKGNvZGVUb0hpZ2hsaWdodCksXG4gICAgICAgICAgaWxsZWdhbDogdHJ1ZSxcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgX2lsbGVnYWxCeToge1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNvZGVUb0hpZ2hsaWdodC5zbGljZShpbmRleCAtIDEwMCwgaW5kZXggKyAxMDApLFxuICAgICAgICAgICAgbW9kZTogZXJyLm1vZGUsXG4gICAgICAgICAgICByZXN1bHRTb0ZhcjogcmVzdWx0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfZW1pdHRlcjogZW1pdHRlclxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChTQUZFX01PREUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VOYW1lLFxuICAgICAgICAgIHZhbHVlOiBlc2NhcGUoY29kZVRvSGlnaGxpZ2h0KSxcbiAgICAgICAgICBpbGxlZ2FsOiBmYWxzZSxcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgZXJyb3JSYWlzZWQ6IGVycixcbiAgICAgICAgICBfZW1pdHRlcjogZW1pdHRlcixcbiAgICAgICAgICBfdG9wOiB0b3BcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIHZhbGlkIGhpZ2hsaWdodCByZXN1bHQsIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgYW55IGFjdHVhbCB3b3JrLFxuICAgKiBhdXRvIGhpZ2hsaWdodCBzdGFydHMgd2l0aCB0aGlzIGFuZCBpdCdzIHBvc3NpYmxlIGZvciBzbWFsbCBzbmlwcGV0cyB0aGF0XG4gICAqIGF1dG8tZGV0ZWN0aW9uIG1heSBub3QgZmluZCBhIGJldHRlciBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKiBAcmV0dXJucyB7SGlnaGxpZ2h0UmVzdWx0fVxuICAgKi9cbiAgZnVuY3Rpb24ganVzdFRleHRIaWdobGlnaHRSZXN1bHQoY29kZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHZhbHVlOiBlc2NhcGUoY29kZSksXG4gICAgICBpbGxlZ2FsOiBmYWxzZSxcbiAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgIF90b3A6IFBMQUlOVEVYVF9MQU5HVUFHRSxcbiAgICAgIF9lbWl0dGVyOiBuZXcgb3B0aW9ucy5fX2VtaXR0ZXIob3B0aW9ucylcbiAgICB9O1xuICAgIHJlc3VsdC5fZW1pdHRlci5hZGRUZXh0KGNvZGUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgSGlnaGxpZ2h0aW5nIHdpdGggbGFuZ3VhZ2UgZGV0ZWN0aW9uLiBBY2NlcHRzIGEgc3RyaW5nIHdpdGggdGhlIGNvZGUgdG9cbiAgaGlnaGxpZ2h0LiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcblxuICAtIGxhbmd1YWdlIChkZXRlY3RlZCBsYW5ndWFnZSlcbiAgLSByZWxldmFuY2UgKGludClcbiAgLSB2YWx1ZSAoYW4gSFRNTCBzdHJpbmcgd2l0aCBoaWdobGlnaHRpbmcgbWFya3VwKVxuICAtIHNlY29uZEJlc3QgKG9iamVjdCB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZSBmb3Igc2Vjb25kLWJlc3QgaGV1cmlzdGljYWxseVxuICAgIGRldGVjdGVkIGxhbmd1YWdlLCBtYXkgYmUgYWJzZW50KVxuXG4gICAgQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtsYW5ndWFnZVN1YnNldF1cbiAgICBAcmV0dXJucyB7QXV0b0hpZ2hsaWdodFJlc3VsdH1cbiAgKi9cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QXV0byhjb2RlLCBsYW5ndWFnZVN1YnNldCkge1xuICAgIGxhbmd1YWdlU3Vic2V0ID0gbGFuZ3VhZ2VTdWJzZXQgfHwgb3B0aW9ucy5sYW5ndWFnZXMgfHwgT2JqZWN0LmtleXMobGFuZ3VhZ2VzKTtcbiAgICBjb25zdCBwbGFpbnRleHQgPSBqdXN0VGV4dEhpZ2hsaWdodFJlc3VsdChjb2RlKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBsYW5ndWFnZVN1YnNldC5maWx0ZXIoZ2V0TGFuZ3VhZ2UpLmZpbHRlcihhdXRvRGV0ZWN0aW9uKS5tYXAobmFtZSA9PlxuICAgICAgX2hpZ2hsaWdodChuYW1lLCBjb2RlLCBmYWxzZSlcbiAgICApO1xuICAgIHJlc3VsdHMudW5zaGlmdChwbGFpbnRleHQpOyAvLyBwbGFpbnRleHQgaXMgYWx3YXlzIGFuIG9wdGlvblxuXG4gICAgY29uc3Qgc29ydGVkID0gcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBzb3J0IGJhc2Ugb24gcmVsZXZhbmNlXG4gICAgICBpZiAoYS5yZWxldmFuY2UgIT09IGIucmVsZXZhbmNlKSByZXR1cm4gYi5yZWxldmFuY2UgLSBhLnJlbGV2YW5jZTtcblxuICAgICAgLy8gYWx3YXlzIGF3YXJkIHRoZSB0aWUgdG8gdGhlIGJhc2UgbGFuZ3VhZ2VcbiAgICAgIC8vIGllIGlmIEMrKyBhbmQgQXJkdWlubyBhcmUgdGllZCwgaXQncyBtb3JlIGxpa2VseSB0byBiZSBDKytcbiAgICAgIGlmIChhLmxhbmd1YWdlICYmIGIubGFuZ3VhZ2UpIHtcbiAgICAgICAgaWYgKGdldExhbmd1YWdlKGEubGFuZ3VhZ2UpLnN1cGVyc2V0T2YgPT09IGIubGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChnZXRMYW5ndWFnZShiLmxhbmd1YWdlKS5zdXBlcnNldE9mID09PSBhLmxhbmd1YWdlKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG90aGVyd2lzZSBzYXkgdGhleSBhcmUgZXF1YWwsIHdoaWNoIGhhcyB0aGUgZWZmZWN0IG9mIHNvcnRpbmcgb25cbiAgICAgIC8vIHJlbGV2YW5jZSB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBvcmRlcmluZyAtIHdoaWNoIGlzIGhvdyB0aWVzXG4gICAgICAvLyBoYXZlIGhpc3RvcmljYWxseSBiZWVuIHNldHRsZWQsIGllIHRoZSBsYW5ndWFnZSB0aGF0IGNvbWVzIGZpcnN0IGFsd2F5c1xuICAgICAgLy8gd2lucyBpbiB0aGUgY2FzZSBvZiBhIHRpZVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBbYmVzdCwgc2Vjb25kQmVzdF0gPSBzb3J0ZWQ7XG5cbiAgICAvKiogQHR5cGUge0F1dG9IaWdobGlnaHRSZXN1bHR9ICovXG4gICAgY29uc3QgcmVzdWx0ID0gYmVzdDtcbiAgICByZXN1bHQuc2Vjb25kQmVzdCA9IHNlY29uZEJlc3Q7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBuZXcgY2xhc3MgbmFtZSBmb3IgYmxvY2sgZ2l2ZW4gdGhlIGxhbmd1YWdlIG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2N1cnJlbnRMYW5nXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Jlc3VsdExhbmddXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVDbGFzc05hbWUoZWxlbWVudCwgY3VycmVudExhbmcsIHJlc3VsdExhbmcpIHtcbiAgICBjb25zdCBsYW5ndWFnZSA9IChjdXJyZW50TGFuZyAmJiBhbGlhc2VzW2N1cnJlbnRMYW5nXSkgfHwgcmVzdWx0TGFuZztcblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImhsanNcIik7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGBsYW5ndWFnZS0ke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgaGlnaGxpZ2h0aW5nIHRvIGEgRE9NIG5vZGUgY29udGFpbmluZyBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0hpZ2hsaWdodGVkSFRNTEVsZW1lbnR9IGVsZW1lbnQgLSB0aGUgSFRNTCBlbGVtZW50IHRvIGhpZ2hsaWdodFxuICAqL1xuICBmdW5jdGlvbiBoaWdobGlnaHRFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAvKiogQHR5cGUgSFRNTEVsZW1lbnQgKi9cbiAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBibG9ja0xhbmd1YWdlKGVsZW1lbnQpO1xuXG4gICAgaWYgKHNob3VsZE5vdEhpZ2hsaWdodChsYW5ndWFnZSkpIHJldHVybjtcblxuICAgIGZpcmUoXCJiZWZvcmU6aGlnaGxpZ2h0RWxlbWVudFwiLFxuICAgICAgeyBlbDogZWxlbWVudCwgbGFuZ3VhZ2UgfSk7XG5cbiAgICAvLyB3ZSBzaG91bGQgYmUgYWxsIHRleHQsIG5vIGNoaWxkIG5vZGVzICh1bmVzY2FwZWQgSFRNTCkgLSB0aGlzIGlzIHBvc3NpYmx5XG4gICAgLy8gYW4gSFRNTCBpbmplY3Rpb24gYXR0YWNrIC0gaXQncyBsaWtlbHkgdG9vIGxhdGUgaWYgdGhpcyBpcyBhbHJlYWR5IGluXG4gICAgLy8gcHJvZHVjdGlvbiAodGhlIGNvZGUgaGFzIGxpa2VseSBhbHJlYWR5IGRvbmUgaXRzIGRhbWFnZSBieSB0aGUgdGltZVxuICAgIC8vIHdlJ3JlIHNlZWluZyBpdCkuLi4gYnV0IHdlIHllbGwgbG91ZGx5IGFib3V0IHRoaXMgc28gdGhhdCBob3BlZnVsbHkgaXQnc1xuICAgIC8vIG1vcmUgbGlrZWx5IHRvIGJlIGNhdWdodCBpbiBkZXZlbG9wbWVudCBiZWZvcmUgbWFraW5nIGl0IHRvIHByb2R1Y3Rpb25cbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlVW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJPbmUgb2YgeW91ciBjb2RlIGJsb2NrcyBpbmNsdWRlcyB1bmVzY2FwZWQgSFRNTC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgc2VjdXJpdHkgcmlzay5cIik7XG4gICAgICAgIGNvbnNvbGUud2FybihcImh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvd2lraS9zZWN1cml0eVwiKTtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgd2l0aCB1bmVzY2FwZWQgSFRNTDpcIik7XG4gICAgICAgIGNvbnNvbGUud2FybihlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnRocm93VW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgSFRNTEluamVjdGlvbkVycm9yKFxuICAgICAgICAgIFwiT25lIG9mIHlvdXIgY29kZSBibG9ja3MgaW5jbHVkZXMgdW5lc2NhcGVkIEhUTUwuXCIsXG4gICAgICAgICAgZWxlbWVudC5pbm5lckhUTUxcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBlbGVtZW50O1xuICAgIGNvbnN0IHRleHQgPSBub2RlLnRleHRDb250ZW50O1xuICAgIGNvbnN0IHJlc3VsdCA9IGxhbmd1YWdlID8gaGlnaGxpZ2h0KHRleHQsIHsgbGFuZ3VhZ2UsIGlnbm9yZUlsbGVnYWxzOiB0cnVlIH0pIDogaGlnaGxpZ2h0QXV0byh0ZXh0KTtcblxuICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gcmVzdWx0LnZhbHVlO1xuICAgIHVwZGF0ZUNsYXNzTmFtZShlbGVtZW50LCBsYW5ndWFnZSwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICBlbGVtZW50LnJlc3VsdCA9IHtcbiAgICAgIGxhbmd1YWdlOiByZXN1bHQubGFuZ3VhZ2UsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2ZXJzaW9uIDExLjBcbiAgICAgIHJlOiByZXN1bHQucmVsZXZhbmNlLFxuICAgICAgcmVsZXZhbmNlOiByZXN1bHQucmVsZXZhbmNlXG4gICAgfTtcbiAgICBpZiAocmVzdWx0LnNlY29uZEJlc3QpIHtcbiAgICAgIGVsZW1lbnQuc2Vjb25kQmVzdCA9IHtcbiAgICAgICAgbGFuZ3VhZ2U6IHJlc3VsdC5zZWNvbmRCZXN0Lmxhbmd1YWdlLFxuICAgICAgICByZWxldmFuY2U6IHJlc3VsdC5zZWNvbmRCZXN0LnJlbGV2YW5jZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmaXJlKFwiYWZ0ZXI6aGlnaGxpZ2h0RWxlbWVudFwiLCB7IGVsOiBlbGVtZW50LCByZXN1bHQsIHRleHQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBoaWdobGlnaHQuanMgZ2xvYmFsIG9wdGlvbnMgd2l0aCB0aGUgcGFzc2VkIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEhMSlNPcHRpb25zPn0gdXNlck9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIGNvbmZpZ3VyZSh1c2VyT3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBpbmhlcml0KG9wdGlvbnMsIHVzZXJPcHRpb25zKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSB2MTIsIGRlcHJlY2F0ZWRcbiAgY29uc3QgaW5pdEhpZ2hsaWdodGluZyA9ICgpID0+IHtcbiAgICBoaWdobGlnaHRBbGwoKTtcbiAgICBkZXByZWNhdGVkKFwiMTAuNi4wXCIsIFwiaW5pdEhpZ2hsaWdodGluZygpIGRlcHJlY2F0ZWQuICBVc2UgaGlnaGxpZ2h0QWxsKCkgbm93LlwiKTtcbiAgfTtcblxuICAvLyBUT0RPOiByZW1vdmUgdjEyLCBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIGluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSB7XG4gICAgaGlnaGxpZ2h0QWxsKCk7XG4gICAgZGVwcmVjYXRlZChcIjEwLjYuMFwiLCBcImluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy5cIik7XG4gIH1cblxuICBsZXQgd2FudHNIaWdobGlnaHQgPSBmYWxzZTtcblxuICAvKipcbiAgICogYXV0by1oaWdobGlnaHRzIGFsbCBwcmU+Y29kZSBlbGVtZW50cyBvbiB0aGUgcGFnZVxuICAgKi9cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QWxsKCkge1xuICAgIC8vIGlmIHdlIGFyZSBjYWxsZWQgdG9vIGVhcmx5IGluIHRoZSBsb2FkaW5nIHByb2Nlc3NcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgIHdhbnRzSGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBibG9ja3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG9wdGlvbnMuY3NzU2VsZWN0b3IpO1xuICAgIGJsb2Nrcy5mb3JFYWNoKGhpZ2hsaWdodEVsZW1lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYm9vdCgpIHtcbiAgICAvLyBpZiBhIGhpZ2hsaWdodCB3YXMgcmVxdWVzdGVkIGJlZm9yZSBET00gd2FzIGxvYWRlZCwgZG8gbm93XG4gICAgaWYgKHdhbnRzSGlnaGxpZ2h0KSBoaWdobGlnaHRBbGwoKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBib290LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsYW5ndWFnZSBncmFtbWFyIG1vZHVsZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VOYW1lXG4gICAqIEBwYXJhbSB7TGFuZ3VhZ2VGbn0gbGFuZ3VhZ2VEZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3Rlckxhbmd1YWdlKGxhbmd1YWdlTmFtZSwgbGFuZ3VhZ2VEZWZpbml0aW9uKSB7XG4gICAgbGV0IGxhbmcgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBsYW5nID0gbGFuZ3VhZ2VEZWZpbml0aW9uKGhsanMpO1xuICAgIH0gY2F0Y2ggKGVycm9yJDEpIHtcbiAgICAgIGVycm9yKFwiTGFuZ3VhZ2UgZGVmaW5pdGlvbiBmb3IgJ3t9JyBjb3VsZCBub3QgYmUgcmVnaXN0ZXJlZC5cIi5yZXBsYWNlKFwie31cIiwgbGFuZ3VhZ2VOYW1lKSk7XG4gICAgICAvLyBoYXJkIG9yIHNvZnQgZXJyb3JcbiAgICAgIGlmICghU0FGRV9NT0RFKSB7IHRocm93IGVycm9yJDE7IH0gZWxzZSB7IGVycm9yKGVycm9yJDEpOyB9XG4gICAgICAvLyBsYW5ndWFnZXMgdGhhdCBoYXZlIHNlcmlvdXMgZXJyb3JzIGFyZSByZXBsYWNlZCB3aXRoIGVzc2VudGlhbGx5IGFcbiAgICAgIC8vIFwicGxhaW50ZXh0XCIgc3RhbmQtaW4gc28gdGhhdCB0aGUgY29kZSBibG9ja3Mgd2lsbCBzdGlsbCBnZXQgbm9ybWFsXG4gICAgICAvLyBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIHRoZW0gLSBhbmQgb25lIGJhZCBsYW5ndWFnZSB3b24ndCBicmVhayB0aGVcbiAgICAgIC8vIGVudGlyZSBoaWdobGlnaHRlclxuICAgICAgbGFuZyA9IFBMQUlOVEVYVF9MQU5HVUFHRTtcbiAgICB9XG4gICAgLy8gZ2l2ZSBpdCBhIHRlbXBvcmFyeSBuYW1lIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgaW4gdGhlIG1ldGEtZGF0YVxuICAgIGlmICghbGFuZy5uYW1lKSBsYW5nLm5hbWUgPSBsYW5ndWFnZU5hbWU7XG4gICAgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV0gPSBsYW5nO1xuICAgIGxhbmcucmF3RGVmaW5pdGlvbiA9IGxhbmd1YWdlRGVmaW5pdGlvbi5iaW5kKG51bGwsIGhsanMpO1xuXG4gICAgaWYgKGxhbmcuYWxpYXNlcykge1xuICAgICAgcmVnaXN0ZXJBbGlhc2VzKGxhbmcuYWxpYXNlcywgeyBsYW5ndWFnZU5hbWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxhbmd1YWdlIGdyYW1tYXIgbW9kdWxlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZU5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHVucmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZU5hbWUpIHtcbiAgICBkZWxldGUgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV07XG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBPYmplY3Qua2V5cyhhbGlhc2VzKSkge1xuICAgICAgaWYgKGFsaWFzZXNbYWxpYXNdID09PSBsYW5ndWFnZU5hbWUpIHtcbiAgICAgICAgZGVsZXRlIGFsaWFzZXNbYWxpYXNdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3Qgb2YgbGFuZ3VhZ2UgaW50ZXJuYWwgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGxpc3RMYW5ndWFnZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBuYW1lIG9mIHRoZSBsYW5ndWFnZSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7TGFuZ3VhZ2UgfCB1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRMYW5ndWFnZShuYW1lKSB7XG4gICAgbmFtZSA9IChuYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBsYW5ndWFnZXNbbmFtZV0gfHwgbGFuZ3VhZ2VzW2FsaWFzZXNbbmFtZV1dO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhbGlhc0xpc3QgLSBzaW5nbGUgYWxpYXMgb3IgbGlzdCBvZiBhbGlhc2VzXG4gICAqIEBwYXJhbSB7e2xhbmd1YWdlTmFtZTogc3RyaW5nfX0gb3B0c1xuICAgKi9cbiAgZnVuY3Rpb24gcmVnaXN0ZXJBbGlhc2VzKGFsaWFzTGlzdCwgeyBsYW5ndWFnZU5hbWUgfSkge1xuICAgIGlmICh0eXBlb2YgYWxpYXNMaXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgYWxpYXNMaXN0ID0gW2FsaWFzTGlzdF07XG4gICAgfVxuICAgIGFsaWFzTGlzdC5mb3JFYWNoKGFsaWFzID0+IHsgYWxpYXNlc1thbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGxhbmd1YWdlTmFtZTsgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGxhbmd1YWdlIGhhcyBhdXRvLWRldGVjdGlvbiBlbmFibGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gbmFtZSBvZiB0aGUgbGFuZ3VhZ2VcbiAgICovXG4gIGZ1bmN0aW9uIGF1dG9EZXRlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGxhbmcgPSBnZXRMYW5ndWFnZShuYW1lKTtcbiAgICByZXR1cm4gbGFuZyAmJiAhbGFuZy5kaXNhYmxlQXV0b2RldGVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGdyYWRlcyB0aGUgb2xkIGhpZ2hsaWdodEJsb2NrIHBsdWdpbnMgdG8gdGhlIG5ld1xuICAgKiBoaWdobGlnaHRFbGVtZW50IEFQSVxuICAgKiBAcGFyYW0ge0hMSlNQbHVnaW59IHBsdWdpblxuICAgKi9cbiAgZnVuY3Rpb24gdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pIHtcbiAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2MTJcbiAgICBpZiAocGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEJsb2NrXCJdICYmICFwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0RWxlbWVudFwiXSkge1xuICAgICAgcGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0QmxvY2tcIl0oXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih7IGJsb2NrOiBkYXRhLmVsIH0sIGRhdGEpXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocGx1Z2luW1wiYWZ0ZXI6aGlnaGxpZ2h0QmxvY2tcIl0gJiYgIXBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0pIHtcbiAgICAgIHBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJhZnRlcjpoaWdobGlnaHRCbG9ja1wiXShcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHsgYmxvY2s6IGRhdGEuZWwgfSwgZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SExKU1BsdWdpbn0gcGx1Z2luXG4gICAqL1xuICBmdW5jdGlvbiBhZGRQbHVnaW4ocGx1Z2luKSB7XG4gICAgdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pO1xuICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SExKU1BsdWdpbn0gcGx1Z2luXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVQbHVnaW4ocGx1Z2luKSB7XG4gICAgY29uc3QgaW5kZXggPSBwbHVnaW5zLmluZGV4T2YocGx1Z2luKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBwbHVnaW5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7UGx1Z2luRXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7YW55fSBhcmdzXG4gICAqL1xuICBmdW5jdGlvbiBmaXJlKGV2ZW50LCBhcmdzKSB7XG4gICAgY29uc3QgY2IgPSBldmVudDtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICBpZiAocGx1Z2luW2NiXSkge1xuICAgICAgICBwbHVnaW5bY2JdKGFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERFUFJFQ0FURURcbiAgICogQHBhcmFtIHtIaWdobGlnaHRlZEhUTUxFbGVtZW50fSBlbFxuICAgKi9cbiAgZnVuY3Rpb24gZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2soZWwpIHtcbiAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wXCIpO1xuICAgIGRlcHJlY2F0ZWQoXCIxMC43LjBcIiwgXCJQbGVhc2UgdXNlIGhpZ2hsaWdodEVsZW1lbnQgbm93LlwiKTtcblxuICAgIHJldHVybiBoaWdobGlnaHRFbGVtZW50KGVsKTtcbiAgfVxuXG4gIC8qIEludGVyZmFjZSBkZWZpbml0aW9uICovXG4gIE9iamVjdC5hc3NpZ24oaGxqcywge1xuICAgIGhpZ2hsaWdodCxcbiAgICBoaWdobGlnaHRBdXRvLFxuICAgIGhpZ2hsaWdodEFsbCxcbiAgICBoaWdobGlnaHRFbGVtZW50LFxuICAgIC8vIFRPRE86IFJlbW92ZSB3aXRoIHYxMiBBUElcbiAgICBoaWdobGlnaHRCbG9jazogZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2ssXG4gICAgY29uZmlndXJlLFxuICAgIGluaXRIaWdobGlnaHRpbmcsXG4gICAgaW5pdEhpZ2hsaWdodGluZ09uTG9hZCxcbiAgICByZWdpc3Rlckxhbmd1YWdlLFxuICAgIHVucmVnaXN0ZXJMYW5ndWFnZSxcbiAgICBsaXN0TGFuZ3VhZ2VzLFxuICAgIGdldExhbmd1YWdlLFxuICAgIHJlZ2lzdGVyQWxpYXNlcyxcbiAgICBhdXRvRGV0ZWN0aW9uLFxuICAgIGluaGVyaXQsXG4gICAgYWRkUGx1Z2luLFxuICAgIHJlbW92ZVBsdWdpblxuICB9KTtcblxuICBobGpzLmRlYnVnTW9kZSA9IGZ1bmN0aW9uKCkgeyBTQUZFX01PREUgPSBmYWxzZTsgfTtcbiAgaGxqcy5zYWZlTW9kZSA9IGZ1bmN0aW9uKCkgeyBTQUZFX01PREUgPSB0cnVlOyB9O1xuICBobGpzLnZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uO1xuXG4gIGhsanMucmVnZXggPSB7XG4gICAgY29uY2F0OiBjb25jYXQsXG4gICAgbG9va2FoZWFkOiBsb29rYWhlYWQsXG4gICAgZWl0aGVyOiBlaXRoZXIsXG4gICAgb3B0aW9uYWw6IG9wdGlvbmFsLFxuICAgIGFueU51bWJlck9mVGltZXM6IGFueU51bWJlck9mVGltZXNcbiAgfTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBNT0RFUykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIE1PREVTW2tleV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGRlZXBGcmVlemUoTU9ERVNba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLy8gbWVyZ2UgYWxsIHRoZSBtb2Rlcy9yZWdleGVzIGludG8gb3VyIG1haW4gb2JqZWN0XG4gIE9iamVjdC5hc3NpZ24oaGxqcywgTU9ERVMpO1xuXG4gIHJldHVybiBobGpzO1xufTtcblxuLy8gT3RoZXIgbmFtZXMgZm9yIHRoZSB2YXJpYWJsZSBtYXkgYnJlYWsgYnVpbGQgc2NyaXB0XG5jb25zdCBoaWdobGlnaHQgPSBITEpTKHt9KTtcblxuLy8gcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaGlnaGxpZ2h0ZXIgdG8gYmUgdXNlZCBmb3IgZXh0ZW5zaW9uc1xuLy8gY2hlY2sgaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9sb3dsaWdodC9pc3N1ZXMvNDdcbmhpZ2hsaWdodC5uZXdJbnN0YW5jZSA9ICgpID0+IEhMSlMoe30pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhpZ2hsaWdodDtcbmhpZ2hsaWdodC5IaWdobGlnaHRKUyA9IGhpZ2hsaWdodDtcbmhpZ2hsaWdodC5kZWZhdWx0ID0gaGlnaGxpZ2h0O1xuIiwgIi8vXG4vLyBmb3JtYXQgLSBwcmludGYtbGlrZSBzdHJpbmcgZm9ybWF0dGluZyBmb3IgSmF2YVNjcmlwdFxuLy8gZ2l0aHViLmNvbS9zYW1zb25qcy9mb3JtYXRcbi8vIEBfc2pzXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTAgLSAyMDEzIFNhbWkgU2FtaHVyaSA8c2FtaUBzYW1odXJpLm5ldD5cbi8vXG4vLyBNSVQgTGljZW5zZVxuLy8gaHR0cDovL3Nqcy5taXQtbGljZW5zZS5vcmdcbi8vXG5cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLy8vLyBFeHBvcnQgdGhlIEFQSVxuICB2YXIgbmFtZXNwYWNlO1xuXG4gIC8vIENvbW1vbkpTIC8gTm9kZSBtb2R1bGVcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbmFtZXNwYWNlID0gbW9kdWxlLmV4cG9ydHMgPSBmb3JtYXQ7XG4gIH1cblxuICAvLyBCcm93c2VycyBhbmQgb3RoZXIgZW52aXJvbm1lbnRzXG4gIGVsc2Uge1xuICAgIC8vIEdldCB0aGUgZ2xvYmFsIG9iamVjdC4gV29ya3MgaW4gRVMzLCBFUzUsIGFuZCBFUzUgc3RyaWN0IG1vZGUuXG4gICAgbmFtZXNwYWNlID0gKGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzIHx8ICgxLGV2YWwpKCd0aGlzJykgfSgpKTtcbiAgfVxuXG4gIG5hbWVzcGFjZS5mb3JtYXQgPSBmb3JtYXQ7XG4gIG5hbWVzcGFjZS52c3ByaW50ZiA9IHZzcHJpbnRmO1xuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbmFtZXNwYWNlLnByaW50ZiA9IHByaW50ZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50ZigvKiAuLi4gKi8pIHtcbiAgICBjb25zb2xlLmxvZyhmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gIH1cblxuICBmdW5jdGlvbiB2c3ByaW50ZihmbXQsIHJlcGxhY2VtZW50cykge1xuICAgIHJldHVybiBmb3JtYXQuYXBwbHkobnVsbCwgW2ZtdF0uY29uY2F0KHJlcGxhY2VtZW50cykpO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0KGZtdCkge1xuICAgIHZhciBhcmdJbmRleCA9IDEgLy8gc2tpcCBpbml0aWFsIGZvcm1hdCBhcmd1bWVudFxuICAgICAgLCBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAsIGkgPSAwXG4gICAgICAsIG4gPSBmbXQubGVuZ3RoXG4gICAgICAsIHJlc3VsdCA9ICcnXG4gICAgICAsIGNcbiAgICAgICwgZXNjYXBlZCA9IGZhbHNlXG4gICAgICAsIGFyZ1xuICAgICAgLCB0bXBcbiAgICAgICwgbGVhZGluZ1plcm8gPSBmYWxzZVxuICAgICAgLCBwcmVjaXNpb25cbiAgICAgICwgbmV4dEFyZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfVxuICAgICAgLCBzbHVycE51bWJlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBkaWdpdHMgPSAnJztcbiAgICAgICAgICB3aGlsZSAoL1xcZC8udGVzdChmbXRbaV0pKSB7XG4gICAgICAgICAgICBkaWdpdHMgKz0gZm10W2krK107XG4gICAgICAgICAgICBjID0gZm10W2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGlnaXRzLmxlbmd0aCA+IDAgPyBwYXJzZUludChkaWdpdHMpIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgO1xuICAgIGZvciAoOyBpIDwgbjsgKytpKSB7XG4gICAgICBjID0gZm10W2ldO1xuICAgICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYyA9PSAnLicpIHtcbiAgICAgICAgICBsZWFkaW5nWmVybyA9IGZhbHNlO1xuICAgICAgICAgIGMgPSBmbXRbKytpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjID09ICcwJyAmJiBmbXRbaSArIDFdID09ICcuJykge1xuICAgICAgICAgIGxlYWRpbmdaZXJvID0gdHJ1ZTtcbiAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgYyA9IGZtdFtpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsZWFkaW5nWmVybyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcHJlY2lzaW9uID0gc2x1cnBOdW1iZXIoKTtcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgIGNhc2UgJ2InOiAvLyBudW1iZXIgaW4gYmluYXJ5XG4gICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjJzogLy8gY2hhcmFjdGVyXG4gICAgICAgICAgYXJnID0gbmV4dEFyZygpO1xuICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fCBhcmcgaW5zdGFuY2VvZiBTdHJpbmcpXG4gICAgICAgICAgICByZXN1bHQgKz0gYXJnO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZCc6IC8vIG51bWJlciBpbiBkZWNpbWFsXG4gICAgICAgICAgcmVzdWx0ICs9IHBhcnNlSW50KG5leHRBcmcoKSwgMTApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmJzogLy8gZmxvYXRpbmcgcG9pbnQgbnVtYmVyXG4gICAgICAgICAgdG1wID0gU3RyaW5nKHBhcnNlRmxvYXQobmV4dEFyZygpKS50b0ZpeGVkKHByZWNpc2lvbiB8fCA2KSk7XG4gICAgICAgICAgcmVzdWx0ICs9IGxlYWRpbmdaZXJvID8gdG1wIDogdG1wLnJlcGxhY2UoL14wLywgJycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdqJzogLy8gSlNPTlxuICAgICAgICAgIHJlc3VsdCArPSBKU09OLnN0cmluZ2lmeShuZXh0QXJnKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdvJzogLy8gbnVtYmVyIGluIG9jdGFsXG4gICAgICAgICAgcmVzdWx0ICs9ICcwJyArIHBhcnNlSW50KG5leHRBcmcoKSwgMTApLnRvU3RyaW5nKDgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nXG4gICAgICAgICAgcmVzdWx0ICs9IG5leHRBcmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneCc6IC8vIGxvd2VyY2FzZSBoZXhhZGVjaW1hbFxuICAgICAgICAgIHJlc3VsdCArPSAnMHgnICsgcGFyc2VJbnQobmV4dEFyZygpLCAxMCkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdYJzogLy8gdXBwZXJjYXNlIGhleGFkZWNpbWFsXG4gICAgICAgICAgcmVzdWx0ICs9ICcweCcgKyBwYXJzZUludChuZXh0QXJnKCksIDEwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXN1bHQgKz0gYztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjID09PSAnJScpIHtcbiAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG59KCkpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL29wZW5qc2Yub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUtRVM1IGVudmlyb25tZW50cy4gKi9cbiAgdmFyIHVuZGVmaW5lZDtcblxuICAvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG4gIHZhciBWRVJTSU9OID0gJzQuMTcuMjEnO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xuICB2YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuICAvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG4gIHZhciBDT1JFX0VSUk9SX1RFWFQgPSAnVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJyxcbiAgICAgIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJyxcbiAgICAgIElOVkFMSURfVEVNUExfVkFSX0VSUk9SX1RFWFQgPSAnSW52YWxpZCBgdmFyaWFibGVgIG9wdGlvbiBwYXNzZWQgaW50byBgXy50ZW1wbGF0ZWAnO1xuXG4gIC8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbiAgdmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbiAgdmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xuICB2YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbiAgdmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbiAgdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICB2YXIgV1JBUF9CSU5EX0ZMQUcgPSAxLFxuICAgICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICAgIFdSQVBfQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgICBXUkFQX1BBUlRJQUxfRkxBRyA9IDMyLFxuICAgICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NCxcbiAgICAgIFdSQVBfQVJZX0ZMQUcgPSAxMjgsXG4gICAgICBXUkFQX1JFQVJHX0ZMQUcgPSAyNTYsXG4gICAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuICAvKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi9cbiAgdmFyIERFRkFVTFRfVFJVTkNfTEVOR1RIID0gMzAsXG4gICAgICBERUZBVUxUX1RSVU5DX09NSVNTSU9OID0gJy4uLic7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xuICB2YXIgSE9UX0NPVU5UID0gODAwLFxuICAgICAgSE9UX1NQQU4gPSAxNjtcblxuICAvKiogVXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBsYXp5IGl0ZXJhdGVlcy4gKi9cbiAgdmFyIExBWllfRklMVEVSX0ZMQUcgPSAxLFxuICAgICAgTEFaWV9NQVBfRkxBRyA9IDIsXG4gICAgICBMQVpZX1dISUxFX0ZMQUcgPSAzO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuICB2YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICAgIE5BTiA9IDAgLyAwO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG4gIHZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NSxcbiAgICAgIE1BWF9BUlJBWV9JTkRFWCA9IE1BWF9BUlJBWV9MRU5HVEggLSAxLFxuICAgICAgSEFMRl9NQVhfQVJSQVlfTEVOR1RIID0gTUFYX0FSUkFZX0xFTkdUSCA+Pj4gMTtcblxuICAvKiogVXNlZCB0byBhc3NvY2lhdGUgd3JhcCBtZXRob2RzIHdpdGggdGhlaXIgYml0IGZsYWdzLiAqL1xuICB2YXIgd3JhcEZsYWdzID0gW1xuICAgIFsnYXJ5JywgV1JBUF9BUllfRkxBR10sXG4gICAgWydiaW5kJywgV1JBUF9CSU5EX0ZMQUddLFxuICAgIFsnYmluZEtleScsIFdSQVBfQklORF9LRVlfRkxBR10sXG4gICAgWydjdXJyeScsIFdSQVBfQ1VSUllfRkxBR10sXG4gICAgWydjdXJyeVJpZ2h0JywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxcbiAgICBbJ2ZsaXAnLCBXUkFQX0ZMSVBfRkxBR10sXG4gICAgWydwYXJ0aWFsJywgV1JBUF9QQVJUSUFMX0ZMQUddLFxuICAgIFsncGFydGlhbFJpZ2h0JywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFxuICAgIFsncmVhcmcnLCBXUkFQX1JFQVJHX0ZMQUddXG4gIF07XG5cbiAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuICB2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICAgIGRvbUV4Y1RhZyA9ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nLFxuICAgICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICAgIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XScsXG4gICAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nLFxuICAgICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJyxcbiAgICAgIHdlYWtTZXRUYWcgPSAnW29iamVjdCBXZWFrU2V0XSc7XG5cbiAgdmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBlbXB0eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlLiAqL1xuICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXFxiX19wIFxcKz0gJyc7L2csXG4gICAgICByZUVtcHR5U3RyaW5nTWlkZGxlID0gL1xcYihfX3AgXFwrPSkgJycgXFwrL2csXG4gICAgICByZUVtcHR5U3RyaW5nVHJhaWxpbmcgPSAvKF9fZVxcKC4qP1xcKXxcXGJfX3RcXCkpIFxcK1xcbicnOy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlZEh0bWwgPSAvJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2csXG4gICAgICByZVVuZXNjYXBlZEh0bWwgPSAvWyY8PlwiJ10vZyxcbiAgICAgIHJlSGFzRXNjYXBlZEh0bWwgPSBSZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLFxuICAgICAgcmVIYXNVbmVzY2FwZWRIdG1sID0gUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG4gIHZhciByZUVzY2FwZSA9IC88JS0oW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVFdmFsdWF0ZSA9IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUludGVycG9sYXRlID0gLzwlPShbXFxzXFxTXSs/KSU+L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLyxcbiAgICAgIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAgICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gICAqL1xuICB2YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nLFxuICAgICAgcmVIYXNSZWdFeHBDaGFyID0gUmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuICAvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbiAgdmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xuICB2YXIgcmVXcmFwQ29tbWVudCA9IC9cXHsoPzpcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoIC4rXFxdIFxcKlxcLyk/XFxuPy8sXG4gICAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdmFsaWRhdGUgdGhlIGB2YWxpZGF0ZWAgb3B0aW9uIGluIGBfLnRlbXBsYXRlYCB2YXJpYWJsZS5cbiAgICpcbiAgICogRm9yYmlkcyBjaGFyYWN0ZXJzIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgZGVmaW5pdGlvbjpcbiAgICogLSBcIigpLFwiIChtb2RpZmljYXRpb24gb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIj1cIiAoZGVmYXVsdCB2YWx1ZSlcbiAgICogLSBcIltde31cIiAoZGVzdHJ1Y3R1cmluZyBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzKVxuICAgKiAtIFwiL1wiIChiZWdpbm5pbmcgb2YgYSBjb21tZW50KVxuICAgKiAtIHdoaXRlc3BhY2VcbiAgICovXG4gIHZhciByZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycyA9IC9bKCk9LHt9XFxbXFxdXFwvXFxzXS87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaFxuICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLlxuICAgKi9cbiAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG4gIHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG4gIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggTGF0aW4gVW5pY29kZSBsZXR0ZXJzIChleGNsdWRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycykuICovXG4gIHZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbiAgdmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICAgIHJzTG93ZXJSYW5nZSA9ICdhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmYnLFxuICAgICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgICByc1B1bmN0dWF0aW9uUmFuZ2UgPSAnXFxcXHUyMDAwLVxcXFx1MjA2ZicsXG4gICAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZicsXG4gICAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xuICB2YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCIsXG4gICAgICByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICAgIHJzRGlnaXRzID0gJ1xcXFxkKycsXG4gICAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgICByc01pc2MgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArIHJzQnJlYWtSYW5nZSArIHJzRGlnaXRzICsgcnNEaW5nYmF0UmFuZ2UgKyByc0xvd2VyUmFuZ2UgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICAgIHJzVXBwZXIgPSAnWycgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xuICB2YXIgcnNNaXNjTG93ZXIgPSAnKD86JyArIHJzTG93ZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgICAgcnNPcHRDb250clVwcGVyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86RHxMTHxNfFJFfFN8VHxWRSkpPycsXG4gICAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxLFxuICAgICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG4gIHZhciByZUFwb3MgPSBSZWdFeHAocnNBcG9zLCAnZycpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kXG4gICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gICAqL1xuICB2YXIgcmVDb21ib01hcmsgPSBSZWdFeHAocnNDb21ibywgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xuICB2YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggY29tcGxleCBvciBjb21wb3VuZCB3b3Jkcy4gKi9cbiAgdmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICAgIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNNaXNjVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyICsgcnNNaXNjTG93ZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICAgIHJzT3JkVXBwZXIsXG4gICAgcnNPcmRMb3dlcixcbiAgICByc0RpZ2l0cyxcbiAgICByc0Vtb2ppXG4gIF0uam9pbignfCcpLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG4gIHZhciByZUhhc1VuaWNvZGVXb3JkID0gL1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdCdWZmZXInLCAnRGF0YVZpZXcnLCAnRGF0ZScsICdFcnJvcicsICdGbG9hdDMyQXJyYXknLCAnRmxvYXQ2NEFycmF5JyxcbiAgICAnRnVuY3Rpb24nLCAnSW50OEFycmF5JywgJ0ludDE2QXJyYXknLCAnSW50MzJBcnJheScsICdNYXAnLCAnTWF0aCcsICdPYmplY3QnLFxuICAgICdQcm9taXNlJywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ1N5bWJvbCcsICdUeXBlRXJyb3InLCAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ1VpbnQxNkFycmF5JywgJ1VpbnQzMkFycmF5JywgJ1dlYWtNYXAnLFxuICAgICdfJywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdwYXJzZUludCcsICdzZXRUaW1lb3V0J1xuICBdO1xuXG4gIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG4gIHZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xuICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICB0eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbiAgdmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbiAgY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbiAgY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbiAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcycsXG4gICAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAgICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAgICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAgICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAgICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAgICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAgICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAgICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAgICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAgICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAgICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG4gIHZhciBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgaHRtbFVuZXNjYXBlcyA9IHtcbiAgICAnJmFtcDsnOiAnJicsXG4gICAgJyZsdDsnOiAnPCcsXG4gICAgJyZndDsnOiAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyYjMzk7JzogXCInXCJcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbiAgdmFyIGZyZWVQYXJzZUZsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICAgIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbiAgLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG4gIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgICAgaWYgKHR5cGVzKSB7XG4gICAgICAgIHJldHVybiB0eXBlcztcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9KCkpO1xuXG4gIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG4gIHZhciBub2RlSXNBcnJheUJ1ZmZlciA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsXG4gICAgICBub2RlSXNEYXRlID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNEYXRlLFxuICAgICAgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXAsXG4gICAgICBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cCxcbiAgICAgIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0LFxuICAgICAgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgIH1cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsXG4gICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICAgIHZhciByZXN1bHQ7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlSW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVhbmAgYW5kIGBfLm1lYW5CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gICAqIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXlcbiAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nXG4gICAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgICAgOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICAgKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAgICogb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICAgIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltU3RhcnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSAwO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgKytyZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gICAqL1xuICB2YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIGVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIGEgd29yZCBjb21wb3NlZCBvZiBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYGl0ZXJhdG9yYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZXJhdG9yIFRoZSBpdGVyYXRvciB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikge1xuICAgIHZhciBkYXRhLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICghKGRhdGEgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBbdmFsdWUsIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5sYXN0SW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgICA6IGFzY2lpVG9BcnJheShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAgICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICAgIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byB1bmVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciB1bmVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICAgICsrcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQHNpbmNlIDEuMS4wXG4gICAqIEBjYXRlZ29yeSBVdGlsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogXy5taXhpbih7ICdmb28nOiBfLmNvbnN0YW50KCdmb28nKSB9KTtcbiAgICpcbiAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7XG4gICAqIGxvZGFzaC5taXhpbih7ICdiYXInOiBsb2Rhc2guY29uc3RhbnQoJ2JhcicpIH0pO1xuICAgKlxuICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqIF8uaXNGdW5jdGlvbihfLmJhcik7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5mb28pO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guYmFyKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKlxuICAgKiAvLyBDcmVhdGUgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanMuXG4gICAqIHZhciBkZWZlciA9IF8ucnVuSW5Db250ZXh0KHsgJ3NldFRpbWVvdXQnOiBzZXRJbW1lZGlhdGUgfSkuZGVmZXI7XG4gICAqL1xuICB2YXIgcnVuSW5Db250ZXh0ID0gKGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IGNvbnRleHQgPT0gbnVsbCA/IHJvb3QgOiBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKTtcblxuICAgIC8qKiBCdWlsdC1pbiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksXG4gICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsXG4gICAgICAgIEVycm9yID0gY29udGV4dC5FcnJvcixcbiAgICAgICAgRnVuY3Rpb24gPSBjb250ZXh0LkZ1bmN0aW9uLFxuICAgICAgICBNYXRoID0gY29udGV4dC5NYXRoLFxuICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCxcbiAgICAgICAgUmVnRXhwID0gY29udGV4dC5SZWdFeHAsXG4gICAgICAgIFN0cmluZyA9IGNvbnRleHQuU3RyaW5nLFxuICAgICAgICBUeXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjtcblxuICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICAgICAgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG4gICAgdmFyIGNvcmVKc0RhdGEgPSBjb250ZXh0WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbiAgICB2YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG4gICAgdmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqL1xuICAgIHZhciBpZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbiAgICB2YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gICAgICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAgICAgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAgICAgKiBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgdmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG4gICAgdmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgXy5ub0NvbmZsaWN0YC4gKi9cbiAgICB2YXIgb2xkRGFzaCA9IHJvb3QuXztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG4gICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBjb250ZXh0LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgU3ltYm9sID0gY29udGV4dC5TeW1ib2wsXG4gICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksXG4gICAgICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkLFxuICAgICAgICBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KSxcbiAgICAgICAgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSxcbiAgICAgICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2UsXG4gICAgICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1JdGVyYXRvciA9IFN5bWJvbCA/IFN5bWJvbC5pdGVyYXRvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgICAgICBmdW5jKHt9LCAnJywge30pO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSgpKTtcblxuICAgIC8qKiBNb2NrZWQgYnVpbHQtaW5zLiAqL1xuICAgIHZhciBjdHhDbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCAhPT0gcm9vdC5jbGVhclRpbWVvdXQgJiYgY29udGV4dC5jbGVhclRpbWVvdXQsXG4gICAgICAgIGN0eE5vdyA9IERhdGUgJiYgRGF0ZS5ub3cgIT09IHJvb3QuRGF0ZS5ub3cgJiYgRGF0ZS5ub3csXG4gICAgICAgIGN0eFNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQgIT09IHJvb3Quc2V0VGltZW91dCAmJiBjb250ZXh0LnNldFRpbWVvdXQ7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG4gICAgdmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcixcbiAgICAgICAgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gICAgICAgIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsXG4gICAgICAgIG5hdGl2ZUpvaW4gPSBhcnJheVByb3RvLmpvaW4sXG4gICAgICAgIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZU5vdyA9IERhdGUubm93LFxuICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRleHQucGFyc2VJbnQsXG4gICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tLFxuICAgICAgICBuYXRpdmVSZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuICAgIHZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShjb250ZXh0LCAnRGF0YVZpZXcnKSxcbiAgICAgICAgTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdNYXAnKSxcbiAgICAgICAgUHJvbWlzZSA9IGdldE5hdGl2ZShjb250ZXh0LCAnUHJvbWlzZScpLFxuICAgICAgICBTZXQgPSBnZXROYXRpdmUoY29udGV4dCwgJ1NldCcpLFxuICAgICAgICBXZWFrTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdXZWFrTWFwJyksXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuICAgIC8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICAgIHZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xuICAgIHZhciByZWFsTmFtZXMgPSB7fTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG4gICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICAgICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgICAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4gICAgLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG4gICAgdmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMuIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucyxcbiAgICAgKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWVcbiAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gICAgICogYW5kIHJldHVybiB0aGUgdW53cmFwcGVkIHZhbHVlLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogRXhwbGljaXQgY2hhaW4gc2VxdWVuY2VzLCB3aGljaCBtdXN0IGJlIHVud3JhcHBlZCB3aXRoIGBfI3ZhbHVlYCwgbWF5IGJlXG4gICAgICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuXG4gICAgICpcbiAgICAgKiBUaGUgZXhlY3V0aW9uIG9mIGNoYWluZWQgbWV0aG9kcyBpcyBsYXp5LCB0aGF0IGlzLCBpdCdzIGRlZmVycmVkIHVudGlsXG4gICAgICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBMYXp5IGV2YWx1YXRpb24gYWxsb3dzIHNldmVyYWwgbWV0aG9kcyB0byBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbi5cbiAgICAgKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkc1xuICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICAgICAqIGl0ZXJhdGVlIGV4ZWN1dGlvbnMuIFNlY3Rpb25zIG9mIGEgY2hhaW4gc2VxdWVuY2UgcXVhbGlmeSBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5XG4gICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlLlxuICAgICAqXG4gICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gICAgICogYGZpbmRMYXN0YCwgYGhlYWRgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGByZWplY3RgLCBgcmV2ZXJzZWAsIGBzbGljZWAsXG4gICAgICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YFxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCxcbiAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gICAgICogYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25mb3Jtc2AsIGBjb25zdGFudGAsIGBjb3VudEJ5YCwgYGNyZWF0ZWAsXG4gICAgICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsXG4gICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAgICAgKiBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGV4dGVuZGAsIGBleHRlbmRXaXRoYCwgYGZpbGxgLCBgZmlsdGVyYCxcbiAgICAgKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsXG4gICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICAgICAqIGBmdW5jdGlvbnNJbmAsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludGVyc2VjdGlvbkJ5YCxcbiAgICAgKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCxcbiAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAgICAgKiBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXJnZVdpdGhgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCwgYG5lZ2F0ZWAsXG4gICAgICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsXG4gICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gICAgICogYHBpY2tCeWAsIGBwbGFudGAsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLCBgcHVsbEFsbGAsIGBwdWxsQWxsQnlgLFxuICAgICAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsXG4gICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAgICAgKiBgc2xpY2VgLCBgc29ydGAsIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHNwcmVhZGAsIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLFxuICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICAgICAqIGB1bmlvbmAsIGB1bmlvbkJ5YCwgYHVuaW9uV2l0aGAsIGB1bmlxYCwgYHVuaXFCeWAsIGB1bmlxV2l0aGAsIGB1bnNldGAsXG4gICAgICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsXG4gICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICAgICAqIGB6aXBPYmplY3RgLCBgemlwT2JqZWN0RGVlcGAsIGFuZCBgemlwV2l0aGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gICAgICogYGFkZGAsIGBhdHRlbXB0YCwgYGNhbWVsQ2FzZWAsIGBjYXBpdGFsaXplYCwgYGNlaWxgLCBgY2xhbXBgLCBgY2xvbmVgLFxuICAgICAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLFxuICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gICAgICogYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCxcbiAgICAgKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsXG4gICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAgICAgKiBgaGFzSW5gLCBgaGVhZGAsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCwgYGluUmFuZ2VgLCBgaW52b2tlYCxcbiAgICAgKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCxcbiAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAgICAgKiBgaXNFcXVhbFdpdGhgLCBgaXNFcnJvcmAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzSW50ZWdlcmAsIGBpc0xlbmd0aGAsXG4gICAgICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCxcbiAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICAgICAqIGBpc1NhZmVJbnRlZ2VyYCwgYGlzU2V0YCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsXG4gICAgICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsXG4gICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICAgICAqIGBtaW5gLCBgbWluQnlgLCBgbXVsdGlwbHlgLCBgbm9Db25mbGljdGAsIGBub29wYCwgYG5vd2AsIGBudGhgLCBgcGFkYCxcbiAgICAgKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCxcbiAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICAgICAqIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRJbmRleEJ5YCwgYHNvcnRlZExhc3RJbmRleGAsXG4gICAgICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLFxuICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdGltZXNgLCBgdG9GaW5pdGVgLCBgdG9JbnRlZ2VyYCwgYHRvSlNPTmAsIGB0b0xlbmd0aGAsXG4gICAgICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLFxuICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICAgICAqIGB1cHBlckZpcnN0YCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpO1xuICAgICAqIC8vID0+IDZcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgICAgIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTG9kYXNoKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWluQWxsXSBFbmFibGUgZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLCBjaGFpbkFsbCkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2NoYWluX18gPSAhIWNoYWluQWxsO1xuICAgICAgdGhpcy5fX2luZGV4X18gPSAwO1xuICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlXG4gICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogcmVFc2NhcGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2V2YWx1YXRlJzogcmVFdmFsdWF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAqL1xuICAgICAgJ2ltcG9ydHMnOiB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgICdfJzogbG9kYXNoXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB3cmFwcGVycyBhcmUgaW5zdGFuY2VzIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBsb2Rhc2gucHJvdG90eXBlID0gYmFzZUxvZGFzaC5wcm90b3R5cGU7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGxvZGFzaDtcblxuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fZGlyX18gPSAxO1xuICAgICAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlZXNfXyA9IFtdO1xuICAgICAgdGhpcy5fX3Rha2VDb3VudF9fID0gTUFYX0FSUkFZX0xFTkdUSDtcbiAgICAgIHRoaXMuX192aWV3c19fID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBsYXp5IHdyYXBwZXIgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5Q2xvbmUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9fZGlyX18gPSB0aGlzLl9fZGlyX187XG4gICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdGhpcy5fX2ZpbHRlcmVkX187XG4gICAgICByZXN1bHQuX19pdGVyYXRlZXNfXyA9IGNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO1xuICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSB0aGlzLl9fdGFrZUNvdW50X187XG4gICAgICByZXN1bHQuX192aWV3c19fID0gY29weUFycmF5KHRoaXMuX192aWV3c19fKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBsYXp5IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5UmV2ZXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLl9fZmlsdGVyZWRfXykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyA9IC0xO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSB1bndyYXBwZWQgdmFsdWUgZnJvbSBpdHMgbGF6eSB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVZhbHVlKCkge1xuICAgICAgdmFyIGFycmF5ID0gdGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLFxuICAgICAgICAgIGRpciA9IHRoaXMuX19kaXJfXyxcbiAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoYXJyYXkpLFxuICAgICAgICAgIGlzUmlnaHQgPSBkaXIgPCAwLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGlzQXJyID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICB2aWV3ID0gZ2V0VmlldygwLCBhcnJMZW5ndGgsIHRoaXMuX192aWV3c19fKSxcbiAgICAgICAgICBzdGFydCA9IHZpZXcuc3RhcnQsXG4gICAgICAgICAgZW5kID0gdmlldy5lbmQsXG4gICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQsXG4gICAgICAgICAgaW5kZXggPSBpc1JpZ2h0ID8gZW5kIDogKHN0YXJ0IC0gMSksXG4gICAgICAgICAgaXRlcmF0ZWVzID0gdGhpcy5fX2l0ZXJhdGVlc19fLFxuICAgICAgICAgIGl0ZXJMZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICB0YWtlQ291bnQgPSBuYXRpdmVNaW4obGVuZ3RoLCB0aGlzLl9fdGFrZUNvdW50X18pO1xuXG4gICAgICBpZiAoIWlzQXJyIHx8ICghaXNSaWdodCAmJiBhcnJMZW5ndGggPT0gbGVuZ3RoICYmIHRha2VDb3VudCA9PSBsZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKGFycmF5LCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuXG4gICAgICAgIHZhciBpdGVySW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlICgrK2l0ZXJJbmRleCA8IGl0ZXJMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGl0ZXJhdGVlc1tpdGVySW5kZXhdLFxuICAgICAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgICAgIHR5cGUgPSBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhenlXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICAgICAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG4gICAgSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG4gICAgSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbiAgICBIYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuICAgIEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG4gICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICAgICAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgICAgICBkYXRhLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgLS10aGlzLnNpemU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgKyt0aGlzLnNpemU7XG4gICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAgICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgYWRkXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQGFsaWFzIHB1c2hcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICAgICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICAgICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gICAgICB9XG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcbiAgICBTdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG4gICAgU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuICAgIFN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcbiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICAgICAgKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVTaXplYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlU2l6ZShhcnJheSwgbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAgICAgKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZXMgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIG9uIGBhY2N1bXVsYXRvcmAgd2l0aCBrZXlzIHRyYW5zZm9ybWVkXG4gICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICAgICAqIHZhbHVlIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBdChvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBza2lwID0gb2JqZWN0ID09IG51bGw7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBza2lwID8gdW5kZWZpbmVkIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyIDw9IHVwcGVyID8gbnVtYmVyIDogdXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gICAgICogdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIERlZXAgY2xvbmVcbiAgICAgKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgKiAgNCAtIENsb25lIHN5bWJvbHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgICAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgICAgIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zVG9gIHdoaWNoIGFjY2VwdHMgYHByb3BzYCB0byBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHNvdXJjZVtrZXldLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICogdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ldmVyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICAgICAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgICAgIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgICAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmICghKHNlZW5cbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYXBwbHkoZnVuYywgb2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcnJheUJ1ZmZlclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gZGF0ZVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICAgICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gICAgICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgICAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICAgICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2FtZVRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICAgID8gY3VzdG9taXplcihzYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5udGhgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU50aChhcnJheSwgbikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG4gKz0gbiA8IDAgPyBsZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGlzSW5kZXgobiwgbGVuZ3RoKSA/IGFycmF5W25dIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gICAgICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2VHZXQodmFsdWUsIGl0ZXJhdGVlLmxlbmd0aCA9PT0gMSA/IGl0ZXJhdGVlWzBdIDogaXRlcmF0ZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW2lkZW50aXR5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgdmFyIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpLFxuICAgICAgICAgIHZhbElzVW5kZWZpbmVkID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IG5hdGl2ZUZsb29yKChsb3cgKyBoaWdoKSAvIDIpLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSxcbiAgICAgICAgICAgIG90aElzRGVmaW5lZCA9IGNvbXB1dGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBjb21wdXRlZCA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gY29tcHV0ZWQgPT09IGNvbXB1dGVkLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7XG5cbiAgICAgICAgaWYgKHZhbElzTmFOKSB7XG4gICAgICAgICAgdmFyIHNldExvdyA9IHJldEhpZ2hlc3QgfHwgb3RoSXNSZWZsZXhpdmU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiAocmV0SGlnaGVzdCB8fCBvdGhJc0RlZmluZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzTnVsbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNOdWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAhb3RoSXNOdWxsICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc1N5bWJvbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3RoSXNOdWxsIHx8IG90aElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldExvdykge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZU1pbihoaWdoLCBNQVhfQVJSQVlfSU5ERVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZFVuaXFgIGFuZCBgXy5zb3J0ZWRVbmlxQnlgIHdpdGhvdXRcbiAgICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWVxKGNvbXB1dGVkLCBzZWVuKSkge1xuICAgICAgICAgIHZhciBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAgICAgKiBjb252ZXJzaW9ucyBvZiBiaW5hcnksIGhleGFkZWNpbWFsLCBvciBvY3RhbCBzdHJpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAgICAgKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgICAgICBpZiAoc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51cGRhdGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHJldHVybiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdXBkYXRlcihiYXNlR2V0KG9iamVjdCwgcGF0aCkpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZHJvcFdoaWxlYCBhbmQgYF8udGFrZVdoaWxlYFxuICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRHJvcF0gU3BlY2lmeSBkcm9wcGluZyBlbGVtZW50cyBpbnN0ZWFkIG9mIHRha2luZyB0aGVtLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkgJiZcbiAgICAgICAgcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge31cblxuICAgICAgcmV0dXJuIGlzRHJvcFxuICAgICAgICA/IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IDAgOiBpbmRleCksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiBsZW5ndGgpKVxuICAgICAgICA6IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IDApLCAoZnJvbVJpZ2h0ID8gbGVuZ3RoIDogaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2ZcbiAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2hcbiAgICAgKiBzdWNjZXNzaXZlIGFjdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykge1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsIGZ1bmN0aW9uKHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpO1xuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ueG9yYCwgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWG9yKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VVbmlxKGFycmF5c1swXSkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpbmRleF0sXG4gICAgICAgICAgICBvdGhJbmRleCA9IC0xO1xuXG4gICAgICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKG90aEluZGV4ICE9IGluZGV4KSB7XG4gICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gYmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XSB8fCBhcnJheSwgYXJyYXlzW290aEluZGV4XSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uemlwT2JqZWN0YCB3aGljaCBhc3NpZ25zIHZhbHVlcyB1c2luZyBgYXNzaWduRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2lnbkZ1bmMocmVzdWx0LCBwcm9wc1tpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgYGJhc2VSZXN0YCBhbGlhcyB3aGljaCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBgaWRlbnRpdHlgIGJ5IG1vZHVsZVxuICAgICAqIHJlcGxhY2VtZW50IHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHZhciBjYXN0UmVzdCA9IGJhc2VSZXN0O1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gICAgICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgY2xlYXJUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vY2xlYXJUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ8T2JqZWN0fSBpZCBUaGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3Qgb2YgdGhlIHRpbWVyIHRvIGNsZWFyLlxuICAgICAqL1xuICAgIHZhciBjbGVhclRpbWVvdXQgPSBjdHhDbGVhclRpbWVvdXQgfHwgZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiByb290LmNsZWFyVGltZW91dChpZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICBidWZmZXIuY29weShyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gICAgICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHN5bWJvbCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZiA/IE9iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSkgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpO1xuXG4gICAgICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICAgICAodmFsSXNTeW1ib2wgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlICYmICFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICF2YWxJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wgJiYgIW90aElzU3ltYm9sICYmIHZhbHVlIDwgb3RoZXIpIHx8XG4gICAgICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIW90aElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gICAgICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gICAgICpcbiAgICAgKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICAgICAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAgICAgKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgICAgIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gICAgICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZWZ0TGVuZ3RoICsgcmFuZ2VMZW5ndGgpLFxuICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICAgICAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IHJhbmdlTGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IGFyZ3NJbmRleDtcbiAgICAgIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgaG9sZGVyc1tob2xkZXJzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICAgICAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgICAgIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5ncm91cEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbml0aWFsaXplcl0gVGhlIGFjY3VtdWxhdG9yIG9iamVjdCBpbml0aWFsaXplci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLCBpbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5QWdncmVnYXRvciA6IGJhc2VBZ2dyZWdhdG9yLFxuICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBpbml0aWFsaXplciA/IGluaXRpYWxpemVyKCkgOiB7fTtcblxuICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBzZXR0ZXIsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYWNjdW11bGF0b3IpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5sb3dlckZpcnN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBTdHJpbmdgIGNhc2UgbWV0aG9kIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHZhciBjaHIgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICAgICAgOiBzdHJpbmcuY2hhckF0KDApO1xuXG4gICAgICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHNcbiAgICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgICAgIDogc3RyaW5nLnNsaWNlKDEpO1xuXG4gICAgICAgIHJldHVybiBjaHJbbWV0aG9kTmFtZV0oKSArIHRyYWlsaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5jYW1lbENhc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBlYWNoIHdvcmQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhcnJheVJlZHVjZSh3b3JkcyhkZWJ1cnIoc3RyaW5nKS5yZXBsYWNlKHJlQXBvcywgJycpKSwgY2FsbGJhY2ssICcnKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbiAgICAgICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcbiAgICAgICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxcbiAgICAgICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXJpdHkgVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KSB7XG4gICAgICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpO1xuXG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuXG4gICAgICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZsb3dgIG9yIGBfLmZsb3dSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsb3cgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmxvdyhmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmbGF0UmVzdChmdW5jdGlvbihmdW5jcykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gZnVuY3MubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwcmVyZXEgPSBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O1xuXG4gICAgICAgIGlmIChmcm9tUmlnaHQpIHtcbiAgICAgICAgICBmdW5jcy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2luZGV4XTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlcmVxICYmICF3cmFwcGVyICYmIGdldEZ1bmNOYW1lKGZ1bmMpID09ICd3cmFwcGVyJykge1xuICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgTG9kYXNoV3JhcHBlcihbXSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gd3JhcHBlciA/IGluZGV4IDogbGVuZ3RoO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGZ1bmMgPSBmdW5jc1tpbmRleF07XG5cbiAgICAgICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICAgICAgZGF0YSA9IGZ1bmNOYW1lID09ICd3cmFwcGVyJyA/IGdldERhdGEoZnVuYykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoZGF0YSAmJiBpc0xhemlhYmxlKGRhdGFbMF0pICYmXG4gICAgICAgICAgICAgICAgZGF0YVsxXSA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSAmJlxuICAgICAgICAgICAgICAgICFkYXRhWzRdLmxlbmd0aCAmJiBkYXRhWzldID09IDFcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gd3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlciwgZGF0YVszXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyYXBwZXIgPSAoZnVuYy5sZW5ndGggPT0gMSAmJiBpc0xhemlhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICA/IHdyYXBwZXJbZnVuY05hbWVdKClcbiAgICAgICAgICAgICAgOiB3cmFwcGVyLnRocnUoZnVuYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzWzBdO1xuXG4gICAgICAgICAgaWYgKHdyYXBwZXIgJiYgYXJncy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGxlbmd0aCA/IGZ1bmNzW2luZGV4XS5hcHBseSh0aGlzLCBhcmdzKSA6IHZhbHVlO1xuXG4gICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNzW2luZGV4XS5jYWxsKHRoaXMsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkXG4gICAgICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBXUkFQX0FSWV9GTEFHLFxuICAgICAgICAgIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLFxuICAgICAgICAgIGlzQ3VycmllZCA9IGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgICAgICBpc0ZsaXAgPSBiaXRtYXNrICYgV1JBUF9GTElQX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgICAgICBob2xkZXJzQ291bnQgPSBjb3VudEhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgICAgICBpZiAoaXNDdXJyaWVkICYmIGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHRoaXNBcmcsXG4gICAgICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICAgICAgbGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgICAgIGlmIChhcmdQb3MpIHtcbiAgICAgICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRmxpcCAmJiBsZW5ndGggPiAxKSB7XG4gICAgICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJ5ICYmIGFyeSA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpIHtcbiAgICAgICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmludmVydEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRvSXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgaXRlcmF0ZWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludmVydGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmVydGVyKHNldHRlciwgdG9JdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgdG9JdGVyYXRlZShpdGVyYXRlZSksIHt9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSB1c2VkIGZvciBgdW5kZWZpbmVkYCBhcmd1bWVudHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3RoZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9TdHJpbmcob3RoZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICBvdGhlciA9IGJhc2VUb051bWJlcihvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ub3ZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFycmF5RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBvdmVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcbiAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgICB2YXIgdGhpc0FyZyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgIGJhc2VkIG9uIGBsZW5ndGhgLiBUaGUgYGNoYXJzYCBzdHJpbmdcbiAgICAgKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIGNoYXJzID0gY2hhcnMgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGJhc2VUb1N0cmluZyhjaGFycyk7XG5cbiAgICAgIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDtcbiAgICAgIGlmIChjaGFyc0xlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJzTGVuZ3RoID8gYmFzZVJlcGVhdChjaGFycywgbGVuZ3RoKSA6IGNoYXJzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VSZXBlYXQoY2hhcnMsIG5hdGl2ZUNlaWwobGVuZ3RoIC8gc3RyaW5nU2l6ZShjaGFycykpKTtcbiAgICAgIHJldHVybiBoYXNVbmljb2RlKGNoYXJzKVxuICAgICAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJylcbiAgICAgICAgOiByZXN1bHQuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nXG4gICAgICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZWZ0TGVuZ3RoICsgYXJnc0xlbmd0aCksXG4gICAgICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZm4sIGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAoc3RhcnQgPCBlbmQgPyAxIDogLTEpIDogdG9GaW5pdGUoc3RlcCk7XG4gICAgICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSByZWxhdGlvbmFsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlbGF0aW9uYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24ob3BlcmF0b3IpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmIHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICBvdGhlciA9IHRvTnVtYmVyKG90aGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuXG4gICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBXUkFQX0NVUlJZX0ZMQUcsXG4gICAgICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBob2xkZXJzLFxuICAgICAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogcGFydGlhbHM7XG5cbiAgICAgIGJpdG1hc2sgfD0gKGlzQ3VycnkgPyBXUkFQX1BBUlRJQUxfRkxBRyA6IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgOiBXUkFQX1BBUlRJQUxfRkxBRyk7XG5cbiAgICAgIGlmICghKGJpdG1hc2sgJiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgbmV3UGFydGlhbHMsIG5ld0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsXG4gICAgICAgIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gd3JhcEZ1bmMuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIGlmIChpc0xhemlhYmxlKGZ1bmMpKSB7XG4gICAgICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLnJvdW5kYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBNYXRoW21ldGhvZE5hbWVdO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PSBudWxsID8gMCA6IG5hdGl2ZU1pbih0b0ludGVnZXIocHJlY2lzaW9uKSwgMjkyKTtcbiAgICAgICAgaWYgKHByZWNpc2lvbiAmJiBuYXRpdmVJc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuXG4gICAgICAgICAgLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksXG4gICAgICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7XG5cbiAgICAgICAgICBwYWlyID0gKHRvU3RyaW5nKHZhbHVlKSArICdlJykuc3BsaXQoJ2UnKTtcbiAgICAgICAgICByZXR1cm4gKyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdIC0gcHJlY2lzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMobnVtYmVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gICAgICovXG4gICAgdmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy50b1BhaXJzYCBvciBgXy50b1BhaXJzSW5gIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpO1xuICAgICAgICBpZiAodGFnID09IG1hcFRhZykge1xuICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVG9QYWlycyhvYmplY3QsIGtleXNGdW5jKG9iamVjdCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogICAgMSAtIGBfLmJpbmRgXG4gICAgICogICAgMiAtIGBfLmJpbmRLZXlgXG4gICAgICogICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gICAgICogICAgOCAtIGBfLmN1cnJ5YFxuICAgICAqICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICAgICAqICAgMzIgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gICAgICogIDEyOCAtIGBfLnJlYXJnYFxuICAgICAqICAyNTYgLSBgXy5hcnlgXG4gICAgICogIDUxMiAtIGBfLmZsaXBgXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJ5ID0gYXJ5ID09PSB1bmRlZmluZWQgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApO1xuICAgICAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkID8gYXJpdHkgOiB0b0ludGVnZXIoYXJpdHkpO1xuICAgICAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgICAgIGhvbGRlcnNSaWdodCA9IGhvbGRlcnM7XG5cbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBnZXREYXRhKGZ1bmMpO1xuXG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICAgICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gICAgICB9XG4gICAgICBmdW5jID0gbmV3RGF0YVswXTtcbiAgICAgIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICAgICAgdGhpc0FyZyA9IG5ld0RhdGFbMl07XG4gICAgICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gICAgICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgICAgIGFyaXR5ID0gbmV3RGF0YVs5XSA9IG5ld0RhdGFbOV0gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gICAgICBpZiAoIWFyaXR5ICYmIGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtcbiAgICAgIH1cbiAgICAgIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICAgICAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7XG4gICAgICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZXR0ZXIgPSBkYXRhID8gYmFzZVNldERhdGEgOiBzZXREYXRhO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKSwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c2AgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25JbmAgdXNlIHRvIGFzc2lnbiBwcm9wZXJ0aWVzXG4gICAgICogb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXNcbiAgICAgKiB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzRGVlcGAgdG8gY3VzdG9taXplIGl0cyBgXy5tZXJnZWAgdXNlIHRvIG1lcmdlIHNvdXJjZVxuICAgICAqIG9iamVjdHMgaW50byBkZXN0aW5hdGlvbiBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0aHJ1LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgcGFyZW50IG9iamVjdCBvZiBgc3JjVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykge1xuICAgICAgaWYgKGlzT2JqZWN0KG9ialZhbHVlKSAmJiBpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgb2JqVmFsdWUpO1xuICAgICAgICBiYXNlTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCB1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9taXRgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uY2xvbmVEZWVwYCB1c2UgdG8gb25seSBjbG9uZSBwbGFpblxuICAgICAqIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bmNsb25lZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCB0byBkZWZlciBjbG9uaW5nIHRvIGBfLmNsb25lRGVlcGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gICAgICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gICAgICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gICAgICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gICAgICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICAgICAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgICAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgICAgIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgICAgICBpZiAob3RoZXJGdW5jID09IG51bGwgfHwgb3RoZXJGdW5jID09IGZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsICdwbGFjZWhvbGRlcicpID8gbG9kYXNoIDogZnVuYztcbiAgICAgIHJldHVybiBvYmplY3QucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBiYXNlSXRlcmF0ZWVgLlxuICAgICAqIElmIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjaG9zZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiB0aGUgY3JlYXRlZCBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdGVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5pdGVyYXRlZSB8fCBpdGVyYXRlZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gaXRlcmF0ZWUgPyBiYXNlSXRlcmF0ZWUgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJlc3VsdChhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgICAgICA6IGRhdGEubWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB3aGlsZSAob2JqZWN0KSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuICAgIGlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAgICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgICAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAgICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgICAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gICAgICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLCB3cmFwcGVyLl9fY2hhaW5fXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICAgICAgcmVzdWx0Ll9fdmFsdWVzX18gPSB3cmFwcGVyLl9fdmFsdWVzX187XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmdcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoIC8gc2l6ZSkpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYmFzZVNsaWNlKGFycmF5LCBpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICogYW5kL29yIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIG90aGVyID0gXy5jb25jYXQoYXJyYXksIDIsIFszXSwgW1s0XV0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCAtIDEpLFxuICAgICAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KSA/IGNvcHlBcnJheShhcnJheSkgOiBbYXJyYXldLCBiYXNlRmxhdHRlbihhcmdzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbEJ5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmRcbiAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMFxuICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKVxuICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCBJTkZJTklUWSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dO1xuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8udG9QYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkXG4gICAgICogZnJvbSBrZXktdmFsdWUgYHBhaXJzYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5oZWFkKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZWFkKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWBcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDAsIC0xKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBhbGwgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMl1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgaWYgKGl0ZXJhdGVlID09PSBsYXN0KG1hcHBlZCkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzXG4gICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFsbCBlbGVtZW50cyBpbiBgYXJyYXlgIGludG8gYSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5qb2luKFsnYScsICdiJywgJ2MnXSwgJ34nKTtcbiAgICAgKiAvLyA9PiAnYX5ifmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gam9pbihhcnJheSwgc2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/ICcnIDogbmF0aXZlSm9pbi5jYWxsKGFycmF5LCBzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgYXJyYXlgIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCkgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgICA/IHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpXG4gICAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAtMik7XG4gICAgICogLy8gPT4gJ2MnO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBnaXZlbiB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICogdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgcHJlZGljYXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGwoYXJyYXksICdhJywgJ2MnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIHZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogNSwgJ3knOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksIHZhbHVlcywgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdjJ11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHB1bGxlZCk7XG4gICAgICogLy8gPT4gWydiJywgJ2QnXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSBmbGF0UmVzdChmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG5cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGFycmF5TWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gICAgICB9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5maWx0ZXJgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5wdWxsYFxuICAgICAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICogW2BBcnJheSNzbGljZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3NsaWNlKSB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgJiYgdHlwZW9mIGVuZCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggJiYgZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmxhc3RJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIGlmIChlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjEsIDIuM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMSwgbGVuZ3RoKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZVxuICAgICAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAqIGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbkJ5KFsyLjFdLCBbMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb21cbiAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgKiBpbiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICAgKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgKiBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqXG4gICAgICogXy51bnppcCh6aXBwZWQpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCwgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTtcbiAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZVxuICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqL1xuICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZFxuICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yLCAzLjRdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnhvckJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB4b3JCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0RGVlcChbJ2EuYlswXS5jJywgJ2EuYlsxXS5kJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gYSArIGIgKyBjO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxMTEsIDIyMl1cbiAgICAgKi9cbiAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpdGVyYXRlZSA9IHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gKGFycmF5cy5wb3AoKSwgaXRlcmF0ZWUpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLiBUaGUgcmVzdWx0IG9mIHN1Y2ggc2VxdWVuY2VzIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gX1xuICAgICAqICAgLmNoYWluKHVzZXJzKVxuICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAqICAgICByZXR1cm4gby51c2VyICsgJyBpcyAnICsgby5hZ2U7XG4gICAgICogICB9KVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICAgICAqICAgIC8vIE11dGF0ZSBpbnB1dCBhcnJheS5cbiAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnJldmVyc2UoKVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXygnICBhYmMgICcpXG4gICAgICogIC5jaGFpbigpXG4gICAgICogIC50cmltKClcbiAgICAgKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICAgICAqXG4gICAgICogQG5hbWUgYXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDEgfHwgdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGggfHxcbiAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICAgICAgdmFsdWUuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGlmIChsZW5ndGggJiYgIWFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGFycmF5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgY2hhaW5cbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpLmhlYWQoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycylcbiAgICAgKiAgIC5jaGFpbigpXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAucGljaygndXNlcicpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHtcbiAgICAgIHJldHVybiBjaGFpbih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oYXJyYXkpLnB1c2goMyk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLmxhc3QoKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksIHRoaXMuX19jaGFpbl9fKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZVxuICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciBkb25lID0gdGhpcy5fX2luZGV4X18gPj0gdGhpcy5fX3ZhbHVlc19fLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAqXG4gICAgICogQG5hbWUgU3ltYm9sLml0ZXJhdG9yXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZFtTeW1ib2wuaXRlcmF0b3JdKCkgPT09IHdyYXBwZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogQXJyYXkuZnJvbSh3cmFwcGVkKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSkubWFwKHNxdWFyZSk7XG4gICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAqXG4gICAgICogb3RoZXIudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwO1xuICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSBjbG9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXMgPSBjbG9uZTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIHRoZSB3cmFwcGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXztcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgICAnYXJncyc6IFtyZXZlcnNlXSxcbiAgICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sIHRoaXMuX19hY3Rpb25zX18pO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgKytyZXN1bHRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAqIGVsZW1lbnRzIG9mIGVtcHR5IGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8ucmVqZWN0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gQ29tYmluaW5nIHNldmVyYWwgcHJlZGljYXRlcyB1c2luZyBgXy5vdmVyRXZlcnlgIG9yIGBfLm92ZXJTb21lYC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9Y29sbGVjdGlvbi5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgdmFyIGZpbmRMYXN0ID0gY3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlZXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgSU5GSU5JVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlcHRoKFsxLCAyXSwgZHVwbGljYXRlLCAyKTtcbiAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBkZXB0aCkge1xuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZVxuICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICAgIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXNGdW5jID8gYXBwbHkocGF0aCwgdmFsdWUsIGFyZ3MpIDogYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICAgICAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlc1xuICAgICAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICAgICAgfVxuICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleSBmb3IuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKi9cbiAgICB2YXIgcGFydGl0aW9uID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXkgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICogYW5kIGBzb3J0QnlgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICogfSwgMCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2VSaWdodCA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqIHRoYXQgYHByZWRpY2F0ZWAgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5maWx0ZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZSA6IGJhc2VTYW1wbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlXG4gICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgKiAvLyA9PiBbMiwgMywgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZVNpemUgOiBiYXNlU2FtcGxlU2l6ZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTaHVmZmxlIDogYmFzZVNodWZmbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAqIC8vID0+IDdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U29tZSA6IGJhc2VTb21lO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAgICAgKi9cbiAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gICAgICogfSwgXy5ub3coKSk7XG4gICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgbm93ID0gY3R4Tm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmJlZm9yZWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA8IDEpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHVwIHRvIGBuYCBhcmd1bWVudHMsXG4gICAgICogaWdub3JpbmcgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLmFyeShwYXJzZUludCwgMSkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnkoZnVuYywgbiwgZ3VhcmQpIHtcbiAgICAgIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAgICAgKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA8PSAxKSB7XG4gICAgICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIHdpdGggYHBhcnRpYWxzYFxuICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2VcbiAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gICAgICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnlSaWdodChhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgzKSgyKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMiwgMykoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAqIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICAgICAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICAgICAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxhc3RBcmdzLFxuICAgICAgICAgIGxhc3RUaGlzLFxuICAgICAgICAgIG1heFdhaXQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHRpbWVySWQsXG4gICAgICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgICAgICByZXR1cm4gbWF4aW5nXG4gICAgICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgICAgIDogdGltZVdhaXRpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICAgICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgICAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAgICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgICAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gICAgICByZXR1cm4gZGVib3VuY2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBpbnZva2luZyB0aGUgYGZ1bmNgIHVudGlsIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuIEFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAnZGVmZXJyZWQnKTtcbiAgICAgKiAvLyA9PiBMb2dzICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG1pbGxpc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWZlciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgMSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWxheShmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgKiAvLyA9PiBMb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVsYXkgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIHRvTnVtYmVyKHdhaXQpIHx8IDAsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxpcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZsaXBwZWQgPSBfLmZsaXAoZnVuY3Rpb24oKSB7XG4gICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gWydkJywgJ2MnLCAnYicsICdhJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGlwKGZ1bmMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfRkxJUF9GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICAgICAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAgICAgKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICAgICAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICAgICAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gICAgICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAgICAgKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICAgICAqXG4gICAgICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB2YWx1ZXMob3RoZXIpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqXG4gICAgICogb2JqZWN0LmEgPSAyO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gICAgICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKlxuICAgICAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gICAgICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgICAgIHJldHVybiBtZW1vaXplZDtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgYE1hcENhY2hlYC5cbiAgICBtZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBuZWdhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBgZnVuY2AuIFRoZVxuICAgICAqIGBmdW5jYCBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIHByZWRpY2F0ZSB0byBuZWdhdGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbmVnYXRlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNFdmVuKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gICAgICogLy8gPT4gWzEsIDMsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyByZXN0cmljdGVkIHRvIGludm9raW5nIGBmdW5jYCBvbmNlLiBSZXBlYXQgY2FsbHNcbiAgICAgKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIC8vID0+IGBjcmVhdGVBcHBsaWNhdGlvbmAgaXMgaW52b2tlZCBvbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmVmb3JlKDIsIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50cyB0cmFuc2Zvcm1lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGFyZ3VtZW50IHRyYW5zZm9ybXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGRvdWJsZWQobikge1xuICAgICAqICAgcmV0dXJuIG4gKiAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJBcmdzKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiBbeCwgeV07XG4gICAgICogfSwgW3NxdWFyZSwgZG91YmxlZF0pO1xuICAgICAqXG4gICAgICogZnVuYyg5LCAzKTtcbiAgICAgKiAvLyA9PiBbODEsIDZdXG4gICAgICpcbiAgICAgKiBmdW5jKDEwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTAwLCAxMF1cbiAgICAgKi9cbiAgICB2YXIgb3ZlckFyZ3MgPSBjYXN0UmVzdChmdW5jdGlvbihmdW5jLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB0cmFuc2Zvcm1zID0gKHRyYW5zZm9ybXMubGVuZ3RoID09IDEgJiYgaXNBcnJheSh0cmFuc2Zvcm1zWzBdKSlcbiAgICAgICAgPyBhcnJheU1hcCh0cmFuc2Zvcm1zWzBdLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpXG4gICAgICAgIDogYXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywgMSksIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciBmdW5jc0xlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oYXJncy5sZW5ndGgsIGZ1bmNzTGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gdHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLCBhcmdzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZVxuICAgICAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4gVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5iaW5kYCBleGNlcHQgaXQgZG9lcyAqKm5vdCoqXG4gICAgICogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWwoZ3JlZXQsICdoZWxsbycpO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWwoZ3JlZXQsIF8sICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsKSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50c1xuICAgICAqIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsUmlnaHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgYXJyYW5nZWQgYWNjb3JkaW5nXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBgaW5kZXhlc2Agd2hlcmUgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBmaXJzdCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBzZWNvbmQgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZWFycmFuZ2UgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcmd1bWVudCBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcmVhcmdlZCA9IF8ucmVhcmcoZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9LCBbMiwgMCwgMV0pO1xuICAgICAqXG4gICAgICogcmVhcmdlZCgnYicsICdjJywgJ2EnKVxuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIHZhciByZWFyZyA9IGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsIGluZGV4ZXMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUkVBUkdfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5kZXhlcyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXNcbiAgICAgKiBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vbWRuLmlvL3Jlc3RfcGFyYW1ldGVycykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8ucmVzdChmdW5jdGlvbih3aGF0LCBuYW1lcykge1xuICAgICAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgK1xuICAgICAqICAgICAoXy5zaXplKG5hbWVzKSA+IDEgPyAnLCAmICcgOiAnJykgKyBfLmxhc3QobmFtZXMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KCdoZWxsbycsICdmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jLCBzdGFydCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlIGZ1bmN0aW9uIGFuZCBhbiBhcnJheSBvZiBhcmd1bWVudHMgbXVjaCBsaWtlXG4gICAgICogW2BGdW5jdGlvbiNhcHBseWBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtzcHJlYWQgb3BlcmF0b3JdKGh0dHBzOi8vbWRuLmlvL3NwcmVhZF9vcGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBzcHJlYWQgYXJndW1lbnRzIG92ZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNwcmVhZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8uc3ByZWFkKGZ1bmN0aW9uKHdobywgd2hhdCkge1xuICAgICAqICAgcmV0dXJuIHdobyArICcgc2F5cyAnICsgd2hhdDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheShbJ2ZyZWQnLCAnaGVsbG8nXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQgc2F5cyBoZWxsbydcbiAgICAgKlxuICAgICAqIHZhciBudW1iZXJzID0gUHJvbWlzZS5hbGwoW1xuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDQwKSxcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSgzNilcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIG51bWJlcnMudGhlbihfLnNwcmVhZChmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4geCArIHk7XG4gICAgICogfSkpO1xuICAgICAqIC8vID0+IGEgUHJvbWlzZSBvZiA3NlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwcmVhZChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IG5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLCAwKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFyZ3Nbc3RhcnRdLFxuICAgICAgICAgICAgb3RoZXJBcmdzID0gY2FzdFNsaWNlKGFyZ3MsIDAsIHN0YXJ0KTtcblxuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBhcnJheVB1c2gob3RoZXJBcmdzLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gICAgICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAgICAgKiBtZXRob2QgdG8gY2FuY2VsIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvXG4gICAgICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gICAgICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICAgICAqIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZCB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGVcbiAgICAgKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gICAgICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy50aHJvdHRsZWAgYW5kIGBfLmRlYm91bmNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHRocm90dGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gICAgICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB0aHJvdHRsZWQpO1xuICAgICAqXG4gICAgICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCB0aHJvdHRsZWQuY2FuY2VsKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVhZGluZyA9IHRydWUsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICdsZWFkaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIHtcbiAgICAgICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgICAgICd0cmFpbGluZyc6IHRyYWlsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG9uZSBhcmd1bWVudCwgaWdub3JpbmcgYW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8udW5hcnkocGFyc2VJbnQpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5hcnkoZnVuYykge1xuICAgICAgcmV0dXJuIGFyeShmdW5jLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIGB3cmFwcGVyYCBhcyBpdHMgZmlyc3RcbiAgICAgKiBhcmd1bWVudC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWRcbiAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYHdyYXBwZXJgLiBUaGUgd3JhcHBlciBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFt3cmFwcGVyPWlkZW50aXR5XSBUaGUgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHAgPSBfLndyYXAoXy5lc2NhcGUsIGZ1bmN0aW9uKGZ1bmMsIHRleHQpIHtcbiAgICAgKiAgIHJldHVybiAnPHA+JyArIGZ1bmModGV4dCkgKyAnPC9wPic7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBwKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICc8cD5mcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXM8L3A+J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgYXMgYW4gYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoMSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbbnVsbF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKiBjb25zb2xlLmxvZyhfLmNhc3RBcnJheShhcnJheSkgPT09IGFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEFycmF5KCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gICAgICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAgICAgKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gICAgICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkXG4gICAgICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAgICAgKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gICAgICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAgICAgKiBjbG9uaW5nIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHVwIHRvIGZvdXIgYXJndW1lbnRzOyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lV2l0aGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVEZWVwV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXBXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgb2JqZWN0YCBjb25mb3JtcyB0byBgc291cmNlYCBieSBpbnZva2luZyB0aGUgcHJlZGljYXRlXG4gICAgICogcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMjsgfSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2UgPT0gbnVsbCB8fCBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKE5hTiwgTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5ndCgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUd0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheUJ1ZmZlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheUJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IG5vZGVJc0FycmF5QnVmZmVyID8gYmFzZVVuYXJ5KG5vZGVJc0FycmF5QnVmZmVyKSA6IGJhc2VJc0FycmF5QnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICAgICAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAgICAgKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gICAgICogaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUobmV3IERhdGUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKCdNb24gQXByaWwgMjMgMjAxMicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzRGF0ZSA9IG5vZGVJc0RhdGUgPyBiYXNlVW5hcnkobm9kZUlzRGF0ZSkgOiBiYXNlSXNEYXRlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoJzxib2R5PicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAgICAgKlxuICAgICAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICAgICAqIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAgICAgKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gICAgICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkodHJ1ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICAgICAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgICAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICAgICAqIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gICAgICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLFxuICAgICAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkXG4gICAgICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gICAgICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogb2JqZWN0ID09PSBvdGhlcjtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzRXF1YWxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0b1xuICAgICAqIHNpeCBhcmd1bWVudHM6IChvYmpWYWx1ZSwgb3RoVmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIG90aGVyLCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcob3RoVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddO1xuICAgICAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsV2l0aChhcnJheSwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcih2YWx1ZSwgb3RoZXIpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCB1bmRlZmluZWQsIGN1c3RvbWl6ZXIpIDogISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgYEV2YWxFcnJvcmAsIGBSYW5nZUVycm9yYCwgYFJlZmVyZW5jZUVycm9yYCxcbiAgICAgKiBgU3ludGF4RXJyb3JgLCBgVHlwZUVycm9yYCwgb3IgYFVSSUVycm9yYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IobmV3IEVycm9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IoRXJyb3IpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZXJyb3JUYWcgfHwgdGFnID09IGRvbUV4Y1RhZyB8fFxuICAgICAgICAodHlwZW9mIHZhbHVlLm1lc3NhZ2UgPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLm5hbWUgPT0gJ3N0cmluZycgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBwcmltaXRpdmUgbnVtYmVyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNGaW5pdGVgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNGaW5pdGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiBuYXRpdmVJc0Zpbml0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbihfKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gICAgICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gICAgICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICAgICAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gICAgICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBgb2JqZWN0YCBhbmQgYHNvdXJjZWAgdG9cbiAgICAgKiBkZXRlcm1pbmUgaWYgYG9iamVjdGAgY29udGFpbnMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5tYXRjaGVzYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaChvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc01hdGNoYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggZml2ZVxuICAgICAqIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwgaW5kZXh8a2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcoc3JjVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAgICAgKiB2YXIgc291cmNlID0geyAnZ3JlZXRpbmcnOiAnaGknIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNOYU5gXShodHRwczovL21kbi5pby9OdW1iZXIvaXNOYU4pIGFuZCBpcyBub3QgdGhlIHNhbWUgYXNcbiAgICAgKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgbm9uLW51bWJlciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGB0b1N0cmluZ1RhZ2AgY2hlY2sgZmlyc3QgdG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZVxuICAgICAgLy8gQWN0aXZlWCBvYmplY3RzIGluIElFLlxuICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcmlzdGluZSBuYXRpdmUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgY2FuJ3QgcmVsaWFibHkgZGV0ZWN0IG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIHByZXNlbmNlXG4gICAgICogb2YgdGhlIGNvcmUtanMgcGFja2FnZSBiZWNhdXNlIGNvcmUtanMgY2lyY3VtdmVudHMgdGhpcyBraW5kIG9mIGRldGVjdGlvbi5cbiAgICAgKiBEZXNwaXRlIG11bHRpcGxlIHJlcXVlc3RzLCB0aGUgY29yZS1qcyBtYWludGFpbmVyIGhhcyBtYWRlIGl0IGNsZWFyOiBhbnlcbiAgICAgKiBhdHRlbXB0IHRvIGZpeCB0aGUgZGV0ZWN0aW9uIHdpbGwgYmUgb2JzdHJ1Y3RlZC4gQXMgYSByZXN1bHQsIHdlJ3JlIGxlZnRcbiAgICAgKiB3aXRoIGxpdHRsZSBjaG9pY2UgYnV0IHRvIHRocm93IGFuIGVycm9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gYWZmZWN0c1xuICAgICAqIHBhY2thZ2VzLCBsaWtlIFtiYWJlbC1wb2x5ZmlsbF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcG9seWZpbGwpLFxuICAgICAqIHdoaWNoIHJlbHkgb24gY29yZS1qcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShfKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoaXNNYXNrYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbCh2b2lkIDApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBudWxsaXNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmlsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZVxuICAgICAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gICAgICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuOC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICAgICAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBSZWdFeHBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgvYWJjLyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgnL2FiYy8nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1JlZ0V4cCA9IG5vZGVJc1JlZ0V4cCA/IGJhc2VVbmFyeShub2RlSXNSZWdFeHApIDogYmFzZUlzUmVnRXhwO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIuIEFuIGludGVnZXIgaXMgc2FmZSBpZiBpdCdzIGFuIElFRUUtNzU0XG4gICAgICogZG91YmxlIHByZWNpc2lvbiBudW1iZXIgd2hpY2ggaXNuJ3QgdGhlIHJlc3VsdCBvZiBhIHJvdW5kZWQgdW5zYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc1NhZmVJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzU2FmZUludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IC1NQVhfU0FGRV9JTlRFR0VSICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gd2Vha01hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHdlYWtTZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0KDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHQgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDw9IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0FycmF5KHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KDEpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHN0cmluZ1RvQXJyYXkodmFsdWUpIDogY29weUFycmF5KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeW1JdGVyYXRvciAmJiB2YWx1ZVtzeW1JdGVyYXRvcl0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVG9BcnJheSh2YWx1ZVtzeW1JdGVyYXRvcl0oKSk7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICBmdW5jID0gdGFnID09IG1hcFRhZyA/IG1hcFRvQXJyYXkgOiAodGFnID09IHNldFRhZyA/IHNldFRvQXJyYXkgOiB2YWx1ZXMpO1xuXG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMi4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICAgICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBsZW5ndGggb2YgYW5cbiAgICAgKiBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDQyOTQ5NjcyOTVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIDAsIE1BWF9BUlJBWV9MRU5HVEgpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b051bWJlcigzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IEluZmluaXR5XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOQU47XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgICAgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAgICAgKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICAgICAqIHJlcHJlc2VudGVkIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIC1NQVhfU0FGRV9JTlRFR0VSLCBNQVhfU0FGRV9JTlRFR0VSKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAgICAgKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKG51bGwpO1xuICAgICAqIC8vID0+ICcnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKC0wKTtcbiAgICAgKiAvLyA9PiAnLTAnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gJzEsMiwzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgIGFuZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBpZiAoaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25JbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRXaXRoXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25JbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXy5hdChvYmplY3QsIFsnYVswXS5iLmMnLCAnYVsxXSddKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgYXQgPSBmbGF0UmVzdChiYXNlQXQpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgcHJvdG90eXBlYCBvYmplY3QuIElmIGFcbiAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0IGlzIGdpdmVuLCBpdHMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXNcbiAgICAgKiBhcmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICAgICAqICAgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTtcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcyA9PSBudWxsID8gcmVzdWx0IDogYmFzZUFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAgICAgKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgICAgICB2YXIgcHJvcHNJbmRleCA9IC0xO1xuICAgICAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW3Byb3BzSW5kZXhdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kZWZhdWx0c2AgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgYXNzaWduc1xuICAgICAqIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0c0RlZXAoeyAnYSc6IHsgJ2InOiAyIH0gfSwgeyAnYSc6IHsgJ2InOiAxLCAnYyc6IDMgfSB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IDIsICdjJzogMyB9IH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHNEZWVwID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgYXJncy5wdXNoKHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSk7XG4gICAgICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiByZXR1cm5zICdwZWJibGVzJyBhc3N1bWluZyBgXy5maW5kS2V5YCByZXR1cm5zICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW5cbiAgICAgKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3Iob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW5SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2MnLCAnYicsIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvckluYCBsb2dzICdhJywgJ2InLCB0aGVuICdjJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3JSaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmRcbiAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd24ob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdiJyB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIHRoZW4gJ2InLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93blJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgICAqIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc0luXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGFuZCBpbmhlcml0ZWRcbiAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gICAgICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gICAgICogcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnQob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9XG4gICAgICovXG4gICAgdmFyIGludmVydCA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRbdmFsdWVdID0ga2V5O1xuICAgIH0sIGNvbnN0YW50KGlkZW50aXR5KSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludmVydGAgZXhjZXB0IHRoYXQgdGhlIGludmVydGVkIG9iamVjdCBpcyBnZW5lcmF0ZWRcbiAgICAgKiBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogY29ycmVzcG9uZGluZyBpbnZlcnRlZCB2YWx1ZSBvZiBlYWNoIGludmVydGVkIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzXG4gICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGludmVydGVkIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAnZ3JvdXAnICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnZ3JvdXAxJzogWydhJywgJ2MnXSwgJ2dyb3VwMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0QnkgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gW2tleV07XG4gICAgICB9XG4gICAgfSwgZ2V0SXRlcmF0ZWUpO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IFsxLCAyLCAzLCA0XSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmludm9rZShvYmplY3QsICdhWzBdLmIuYy5zbGljZScsIDEsIDMpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIHZhciBpbnZva2UgPSBiYXNlUmVzdChiYXNlSW52b2tlKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAgICAgKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5cyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLmtleXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1hcFZhbHVlc2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAgICogc2FtZSB2YWx1ZXMgYXMgYG9iamVjdGAgYW5kIGtleXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZVxuICAgICAqIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcFZhbHVlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcEtleXMoeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICByZXR1cm4ga2V5ICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYTEnOiAxLCAnYjInOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBLZXlzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAgICAgKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBLZXlzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICAgICAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICAgICAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gICAgICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gICAgICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIG90aGVyID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVyZ2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlXG4gICAgICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGVcbiAgICAgKiBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggc2l4IGFyZ3VtZW50czpcbiAgICAgKiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogWzFdLCAnYic6IFsyXSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiBbM10sICdiJzogWzRdIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlV2l0aChvYmplY3QsIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogWzEsIDNdLCAnYic6IFsyLCA0XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgcGF0aHMgb2YgYG9iamVjdGAgdGhhdCBhcmUgbm90IG9taXR0ZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IHNsb3dlciB0aGFuIGBfLnBpY2tgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gb21pdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdChvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIHZhciBvbWl0ID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaXNEZWVwID0gZmFsc2U7XG4gICAgICBwYXRocyA9IGFycmF5TWFwKHBhdGhzLCBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgICBpc0RlZXAgfHwgKGlzRGVlcCA9IHBhdGgubGVuZ3RoID4gMSk7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSk7XG4gICAgICBjb3B5T2JqZWN0KG9iamVjdCwgZ2V0QWxsS2V5c0luKG9iamVjdCksIHJlc3VsdCk7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJlc3VsdCA9IGJhc2VDbG9uZShyZXN1bHQsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX0ZMQVRfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9tT21pdENsb25lKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgYmFzZVVuc2V0KHJlc3VsdCwgcGF0aHNbbGVuZ3RoXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tCeWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mXG4gICAgICogdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYG9iamVjdGAgdGhhdFxuICAgICAqIGBwcmVkaWNhdGVgIGRvZXNuJ3QgcmV0dXJuIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3b1xuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9taXRCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHBpY2tCeShvYmplY3QsIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAgICAgKiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGlja0J5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGlja0J5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFtwcm9wXTtcbiAgICAgIH0pO1xuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlKTtcbiAgICAgIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwcmVkaWNhdGUodmFsdWUsIHBhdGhbMF0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhXG4gICAgICogZnVuY3Rpb24gaXQncyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGl0cyBwYXJlbnQgb2JqZWN0IGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYzEnOiAzLCAnYzInOiBfLmNvbnN0YW50KDQpIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMScpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMicpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCBfLmNvbnN0YW50KCdkZWZhdWx0JykpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3VsdChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGxvb3AgaXMgZW50ZXJlZCB3aGVuIHBhdGggaXMgZW1wdHkuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICBvYmplY3QgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IGlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUuY2FsbChvYmplY3QpIDogdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICAgICAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICAgICAqIGFyZSBjcmVhdGVkIGZvciBhbGwgb3RoZXIgbWlzc2luZyBwcm9wZXJ0aWVzLiBVc2UgYF8uc2V0V2l0aGAgdG8gY3VzdG9taXplXG4gICAgICogYHBhdGhgIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgWyd4JywgJzAnLCAneScsICd6J10sIDUpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnNldFdpdGgob2JqZWN0LCAnWzBdWzFdJywgJ2EnLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdpdGgob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGBcbiAgICAgKiB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXAgb3Igc2V0LCBpdHNcbiAgICAgKiBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlycyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzID0gY3JlYXRlVG9QYWlycyhrZXlzKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnNcbiAgICAgKiBmb3IgYG9iamVjdGAgd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwXG4gICAgICogb3Igc2V0LCBpdHMgZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc0luXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlyc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzSW4gPSBjcmVhdGVUb1BhaXJzKGtleXNJbik7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICAgICAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICAgICAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAgICAgKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICAgICAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgOV1cbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgICAgIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogNyB9IH1dIH07XG4gICAgICogXy51bnNldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udW5zZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdHJ1ZSA6IGJhc2VVbnNldChvYmplY3QsIHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBhY2NlcHRzIGB1cGRhdGVyYCB0byBwcm9kdWNlIHRoZVxuICAgICAqIHZhbHVlIHRvIHNldC4gVXNlIGBfLnVwZGF0ZVdpdGhgIHRvIGN1c3RvbWl6ZSBgcGF0aGAgY3JlYXRpb24uIFRoZSBgdXBkYXRlcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ2FbMF0uYi5jJywgZnVuY3Rpb24obikgeyByZXR1cm4gbiAqIG47IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gOVxuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAneFswXS55LnonLCBmdW5jdGlvbihuKSB7IHJldHVybiBuID8gbiArIDEgOiAwOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVwZGF0ZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlV2l0aChvYmplY3QsICdbMF1bMV0nLCBfLmNvbnN0YW50KCdhJyksIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlciksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKCdoaScpO1xuICAgICAqIC8vID0+IFsnaCcsICdpJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5XG4gICAgICogdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IC01XG4gICAgICpcbiAgICAgKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgICAgICB1cHBlciA9IHVwcGVyID09PSB1cHBlciA/IHVwcGVyIDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gdG9OdW1iZXIobG93ZXIpO1xuICAgICAgICBsb3dlciA9IGxvd2VyID09PSBsb3dlciA/IGxvd2VyIDogMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSwgbG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG5gIGlzIGJldHdlZW4gYHN0YXJ0YCBhbmQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gSWZcbiAgICAgKiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLCBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0XG4gICAgICogbmVnYXRpdmUgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLnJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDMsIDIsIDQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCA4KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgyLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDEuMiwgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDUuMiwgNCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgtMywgLTIsIC02KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgfVxuICAgICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICAgIHJldHVybiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICogSWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXJcbiAgICAgKiBpcyByZXR1cm5lZC4gSWYgYGZsb2F0aW5nYCBpcyBgdHJ1ZWAsIG9yIGVpdGhlciBgbG93ZXJgIG9yIGB1cHBlcmAgYXJlXG4gICAgICogZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyPTBdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3VwcGVyPTFdIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZ10gU3BlY2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obG93ZXIsIHVwcGVyLCBmbG9hdGluZykge1xuICAgICAgaWYgKGZsb2F0aW5nICYmIHR5cGVvZiBmbG9hdGluZyAhPSAnYm9vbGVhbicgJiYgaXNJdGVyYXRlZUNhbGwobG93ZXIsIHVwcGVyLCBmbG9hdGluZykpIHtcbiAgICAgICAgdXBwZXIgPSBmbG9hdGluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdXBwZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSB1cHBlcjtcbiAgICAgICAgICB1cHBlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG93ZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID09PSB1bmRlZmluZWQgJiYgdXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIHVwcGVyID0gMTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBsb3dlciA9IHRvRmluaXRlKGxvd2VyKTtcbiAgICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cHBlciA9IHRvRmluaXRlKHVwcGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgICAgdmFyIHRlbXAgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1cHBlcjtcbiAgICAgICAgdXBwZXIgPSB0ZW1wO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nIHx8IGxvd2VyICUgMSB8fCB1cHBlciAlIDEpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVSYW5kb20oKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihsb3dlciArIChyYW5kICogKHVwcGVyIC0gbG93ZXIgKyBmcmVlUGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArICcnKS5sZW5ndGggLSAxKSkpKSwgdXBwZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbY2FtZWwgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FtZWxDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhbWVsIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICovXG4gICAgdmFyIGNhbWVsQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyBjYXBpdGFsaXplKHdvcmQpIDogd29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UgYW5kIHRoZSByZW1haW5pbmdcbiAgICAgKiB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICAgICAgcmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWJ1cnJzIGBzdHJpbmdgIGJ5IGNvbnZlcnRpbmdcbiAgICAgKiBbTGF0aW4tMSBTdXBwbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbi0xX1N1cHBsZW1lbnRfKFVuaWNvZGVfYmxvY2spI0NoYXJhY3Rlcl90YWJsZSlcbiAgICAgKiBhbmQgW0xhdGluIEV4dGVuZGVkLUFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX0V4dGVuZGVkLUEpXG4gICAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzIGFuZCByZW1vdmluZ1xuICAgICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWJ1cnIoJ2RcdTAwRTlqXHUwMEUwIHZ1Jyk7XG4gICAgICogLy8gPT4gJ2RlamEgdnUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBlbmRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTtcblxuICAgICAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA+PSAwICYmIHN0cmluZy5zbGljZShwb3NpdGlvbiwgZW5kKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gICAgICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICAgICAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICAgICAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gICAgICogWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGhlIGBSZWdFeHBgIHNwZWNpYWwgY2hhcmFjdGVycyBcIl5cIiwgXCIkXCIsIFwiXFxcIiwgXCIuXCIsIFwiKlwiLCBcIitcIixcbiAgICAgKiBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgYW5kIFwifFwiIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICogLy8gPT4gJ1xcW2xvZGFzaFxcXVxcKGh0dHBzOi8vbG9kYXNoXFwuY29tL1xcKSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqL1xuICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdmUkVEJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCk7XG4gICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpO1xuICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzdHJMZW5ndGggPj0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbWlkID0gKGxlbmd0aCAtIHN0ckxlbmd0aCkgLyAyO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLCBjaGFycykgK1xuICAgICAgICBzdHJpbmcgK1xuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnICAgYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tX2FiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpICsgc3RyaW5nKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYVxuICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlXG4gICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICogLy8gPT4gJyoqKidcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgKiAvLyA9PiAnYWJjYWJjJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAqIC8vID0+ICcnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTtcbiAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoIDwgMyA/IHN0cmluZyA6IHN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tRk9PLUJBUi0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICovXG4gICAgdmFyIHNuYWtlQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICdfJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX0FSUkFZX0xFTkdUSCA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKCFsaW1pdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoXG4gICAgICAgICAgICB0eXBlb2Ygc2VwYXJhdG9yID09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICAgICAgKSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksIDAsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPTBdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplc1xuICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlPV8udGVtcGxhdGVTZXR0aW5ncy5ldmFsdWF0ZV1cbiAgICAgKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICogIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgZnJlZSB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddXG4gICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnYmFybmV5JyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgRVMgdGVtcGxhdGUgbGl0ZXJhbCBkZWxpbWl0ZXIgYXMgYW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ3BlYmJsZXMnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSBiYWNrc2xhc2hlcyB0byB0cmVhdCBkZWxpbWl0ZXJzIGFzIHBsYWluIHRleHQuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gICAgICogdmFyIHRleHQgPSAnPCUganEuZWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+JztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7XG4gICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAgICAgKiBjb21waWxlZC5zb3VyY2U7XG4gICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gICAgICogLy8gICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS51c2VyICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAqIC8vIH1cbiAgICAgKlxuICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gICAgICB2YXIgaXNFc2NhcGluZyxcbiAgICAgICAgICBpc0V2YWx1YXRpbmcsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGludGVycG9sYXRlID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsXG4gICAgICAgICAgc291cmNlID0gXCJfX3AgKz0gJ1wiO1xuXG4gICAgICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKFxuICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xhdGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJ1xuICAgICAgLCAnZycpO1xuXG4gICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICAvLyBUaGUgc291cmNlVVJMIGdldHMgaW5qZWN0ZWQgaW50byB0aGUgc291cmNlIHRoYXQncyBldmFsLWVkLCBzbyBiZSBjYXJlZnVsXG4gICAgICAvLyB0byBub3JtYWxpemUgYWxsIGtpbmRzIG9mIHdoaXRlc3BhY2UsIHNvIGUuZy4gbmV3bGluZXMgKGFuZCB1bmljb2RlIHZlcnNpb25zIG9mIGl0KSBjYW4ndCBzbmVhayBpblxuICAgICAgLy8gYW5kIGVzY2FwZSB0aGUgY29tbWVudCwgdGh1cyBpbmplY3RpbmcgY29kZSB0aGF0IGdldHMgZXZhbGVkLlxuICAgICAgdmFyIHNvdXJjZVVSTCA9ICcvLyMgc291cmNlVVJMPScgK1xuICAgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnc291cmNlVVJMJylcbiAgICAgICAgICA/IChvcHRpb25zLnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9cXHMvZywgJyAnKVxuICAgICAgICAgIDogKCdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWycgKyAoKyt0ZW1wbGF0ZUNvdW50ZXIpICsgJ10nKVxuICAgICAgICApICsgJ1xcbic7XG5cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlRGVsaW1pdGVycywgZnVuY3Rpb24obWF0Y2gsIGVzY2FwZVZhbHVlLCBpbnRlcnBvbGF0ZVZhbHVlLCBlc1RlbXBsYXRlVmFsdWUsIGV2YWx1YXRlVmFsdWUsIG9mZnNldCkge1xuICAgICAgICBpbnRlcnBvbGF0ZVZhbHVlIHx8IChpbnRlcnBvbGF0ZVZhbHVlID0gZXNUZW1wbGF0ZVZhbHVlKTtcblxuICAgICAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscy5cbiAgICAgICAgc291cmNlICs9IHN0cmluZy5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBlc2NhcGVTdHJpbmdDaGFyKTtcblxuICAgICAgICAvLyBSZXBsYWNlIGRlbGltaXRlcnMgd2l0aCBzbmlwcGV0cy5cbiAgICAgICAgaWYgKGVzY2FwZVZhbHVlKSB7XG4gICAgICAgICAgaXNFc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuX19lKFwiICsgZXNjYXBlVmFsdWUgKyBcIikgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXZhbHVhdGluZyA9IHRydWU7XG4gICAgICAgICAgc291cmNlICs9IFwiJztcXG5cIiArIGV2YWx1YXRlVmFsdWUgKyBcIjtcXG5fX3AgKz0gJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnBvbGF0ZVZhbHVlKSB7XG4gICAgICAgICAgc291cmNlICs9IFwiJyArXFxuKChfX3QgPSAoXCIgKyBpbnRlcnBvbGF0ZVZhbHVlICsgXCIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgICAgLy8gVGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBwcm9kdWN0cyBuZWVkcyBgbWF0Y2hgIHJldHVybmVkIGluXG4gICAgICAgIC8vIG9yZGVyIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3QgYG9mZnNldGAgdmFsdWUuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH0pO1xuXG4gICAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgICAvLyBJZiBgdmFyaWFibGVgIGlzIG5vdCBzcGVjaWZpZWQgd3JhcCBhIHdpdGgtc3RhdGVtZW50IGFyb3VuZCB0aGUgZ2VuZXJhdGVkXG4gICAgICAvLyBjb2RlIHRvIGFkZCB0aGUgZGF0YSBvYmplY3QgdG8gdGhlIHRvcCBvZiB0aGUgc2NvcGUgY2hhaW4uXG4gICAgICB2YXIgdmFyaWFibGUgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICd2YXJpYWJsZScpICYmIG9wdGlvbnMudmFyaWFibGU7XG4gICAgICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgICAgIHNvdXJjZSA9ICd3aXRoIChvYmopIHtcXG4nICsgc291cmNlICsgJ1xcbn1cXG4nO1xuICAgICAgfVxuICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgYSBmb3JiaWRkZW4gY2hhcmFjdGVyIHdhcyBmb3VuZCBpbiBgdmFyaWFibGVgLCB0byBwcmV2ZW50XG4gICAgICAvLyBwb3RlbnRpYWwgY29tbWFuZCBpbmplY3Rpb24gYXR0YWNrcy5cbiAgICAgIGVsc2UgaWYgKHJlRm9yYmlkZGVuSWRlbnRpZmllckNoYXJzLnRlc3QodmFyaWFibGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsICckMScpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywgJyQxOycpO1xuXG4gICAgICAvLyBGcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyAodmFyaWFibGUgfHwgJ29iaicpICsgJykge1xcbicgK1xuICAgICAgICAodmFyaWFibGVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnb2JqIHx8IChvYmogPSB7fSk7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgXCJ2YXIgX190LCBfX3AgPSAnJ1wiICtcbiAgICAgICAgKGlzRXNjYXBpbmdcbiAgICAgICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZSdcbiAgICAgICAgICAgOiAnJ1xuICAgICAgICApICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIHZhciByZXN1bHQgPSBhdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsIHNvdXJjZVVSTCArICdyZXR1cm4gJyArIHNvdXJjZSlcbiAgICAgICAgICAuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3JcbiAgICAgIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgaWYgKGlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byBsb3dlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9Mb3dlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvTG93ZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0xvd2VyKCctLUZvby1CYXItLScpO1xuICAgICAqIC8vID0+ICctLWZvby1iYXItLSdcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb2JhcidcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnX19mb29fYmFyX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBhIHdob2xlLCB0byB1cHBlciBjYXNlIGp1c3QgbGlrZVxuICAgICAqIFtTdHJpbmcjdG9VcHBlckNhc2VdKGh0dHBzOi8vbWRuLmlvL3RvVXBwZXJDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVwcGVyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1VwcGVyKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICctLUZPTy1CQVItLSdcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPT0JBUidcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnX19GT09fQkFSX18nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9VcHBlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbSgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICpcbiAgICAgKiBfLm1hcChbJyAgZm9vICAnLCAnICBiYXIgICddLCBfLnRyaW0pO1xuICAgICAqIC8vID0+IFsnZm9vJywgJ2JhciddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbShzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBiYXNlVHJpbShzdHJpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltRW5kKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJyAgYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltRW5kKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnLV8tYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjICAnXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYy1fLSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0KS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgYHN0cmluZ2AgaWYgaXQncyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gICAgICogc3RyaW5nIHdoaWNoIGRlZmF1bHRzIHRvIFwiLi4uXCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub21pc3Npb249Jy4uLiddIFRoZSBzdHJpbmcgdG8gaW5kaWNhdGUgdGV4dCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuc2VwYXJhdG9yXSBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gdHJ1bmNhdGUgdG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm8uLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6ICcgJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAvLD8gKy9cbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdvbWlzc2lvbic6ICcgWy4uLl0nXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBERUZBVUxUX1RSVU5DX0xFTkdUSCxcbiAgICAgICAgICBvbWlzc2lvbiA9IERFRkFVTFRfVFJVTkNfT01JU1NJT047XG5cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gJ3NlcGFyYXRvcicgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc2VwYXJhdG9yIDogc2VwYXJhdG9yO1xuICAgICAgICBsZW5ndGggPSAnbGVuZ3RoJyBpbiBvcHRpb25zID8gdG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKSA6IGxlbmd0aDtcbiAgICAgICAgb21pc3Npb24gPSAnb21pc3Npb24nIGluIG9wdGlvbnMgPyBiYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbikgOiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTtcbiAgICAgICAgc3RyTGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pO1xuICAgICAgaWYgKGVuZCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHN0clN5bWJvbHNcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKVxuICAgICAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpO1xuXG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKHN0clN5bWJvbHMpIHtcbiAgICAgICAgZW5kICs9IChyZXN1bHQubGVuZ3RoIC0gZW5kKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlZ0V4cChzZXBhcmF0b3IpKSB7XG4gICAgICAgIGlmIChzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSkge1xuICAgICAgICAgIHZhciBtYXRjaCxcbiAgICAgICAgICAgICAgc3Vic3RyaW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgICAgICB2YXIgbmV3RW5kID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCA/IGVuZCA6IG5ld0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksIGVuZCkgIT0gZW5kKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAqIGAmYW1wO2AsIGAmbHQ7YCwgYCZndDtgLCBgJnF1b3Q7YCwgYW5kIGAmIzM5O2AgaW4gYHN0cmluZ2AgdG9cbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogSFRNTCBlbnRpdGllcyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCctLWZvby1iYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGUkVEJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b1VwcGVyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gICAgICBpZiAocGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pIHx8IFtdO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGludm9rZSBgZnVuY2AsIHJldHVybmluZyBlaXRoZXIgdGhlIHJlc3VsdCBvciB0aGUgY2F1Z2h0IGVycm9yXG4gICAgICogb2JqZWN0LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYGZ1bmNgIHJlc3VsdCBvciBlcnJvciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIHRocm93aW5nIGVycm9ycyBmb3IgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgICogdmFyIGVsZW1lbnRzID0gXy5hdHRlbXB0KGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICogICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICogfSwgJz5fPicpO1xuICAgICAqXG4gICAgICogaWYgKF8uaXNFcnJvcihlbGVtZW50cykpIHtcbiAgICAgKiAgIGVsZW1lbnRzID0gW107XG4gICAgICogfVxuICAgICAqL1xuICAgIHZhciBhdHRlbXB0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBpc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgKiBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IG1ldGhvZE5hbWVzIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVzIHRvIGJpbmQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHZpZXcgPSB7XG4gICAgICogICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICogICAnY2xpY2snOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdmlldy5jbGljayk7XG4gICAgICogLy8gPT4gTG9ncyAnY2xpY2tlZCBkb2NzJyB3aGVuIGNsaWNrZWQuXG4gICAgICovXG4gICAgdmFyIGJpbmRBbGwgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIG1ldGhvZE5hbWVzKSB7XG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBrZXkgPSB0b0tleShrZXkpO1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIGJpbmQob2JqZWN0W2tleV0sIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogZnVuY3Rpb24gb2YgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byByZXR1cm4gdHJ1dGh5LiBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uXG4gICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLmNvbmQoW1xuICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSxcbiAgICAgKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sXG4gICAgICogICBbXy5zdHViVHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgXy5jb25zdGFudCgnbm8gbWF0Y2gnKV1cbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMCwgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEInXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAnMScsICdiJzogJzInIH0pO1xuICAgICAqIC8vID0+ICdubyBtYXRjaCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25kKHBhaXJzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgdG9JdGVyYXRlZSA9IGdldEl0ZXJhdGVlKCk7XG5cbiAgICAgIHBhaXJzID0gIWxlbmd0aCA/IFtdIDogYXJyYXlNYXAocGFpcnMsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYWlyWzFdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0b0l0ZXJhdGVlKHBhaXJbMF0pLCBwYWlyWzFdXTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgICBpZiAoYXBwbHkocGFpclswXSwgdGhpcywgYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShwYWlyWzFdLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYSBnaXZlbiBvYmplY3QsIHJldHVybmluZyBgdHJ1ZWAgaWZcbiAgICAgKiBhbGwgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc1RvYCB3aXRoXG4gICAgICogYHNvdXJjZWAgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMiwgJ2InOiAxIH0sXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5jb25mb3Jtcyh7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYHZhbHVlYCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIGluXG4gICAgICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICAgICAqIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3coW18uYWRkLCBzcXVhcmVdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93ID0gY3JlYXRlRmxvdygpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbG93YCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdFxuICAgICAqIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3dSaWdodChbc3F1YXJlLCBfLmFkZF0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3dSaWdodCA9IGNyZWF0ZUZsb3codHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUsIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlXG4gICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50XG4gICAgICogc291cmNlIHByb3BlcnRpZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZShbJ3VzZXInLCAnZnJlZCddKSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsIF8uaXRlcmF0ZWUoJ3VzZXInKSk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBDcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICAgICAqICAgcmV0dXJuICFfLmlzUmVnRXhwKGZ1bmMpID8gaXRlcmF0ZWUoZnVuYykgOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgKiAgICAgcmV0dXJuIGZ1bmMudGVzdChzdHJpbmcpO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAgICAgKiAvLyA9PiBbJ2RlZiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykge1xuICAgICAgcmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gZnVuYyA6IGJhc2VDbG9uZShmdW5jLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlblxuICAgICAqIG9iamVjdCBhbmQgYHNvdXJjZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgZXF1aXZhbGVudFxuICAgICAqIHByb3BlcnR5IHZhbHVlcywgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uaXNNYXRjaGAgd2l0aCBgc291cmNlYFxuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgY2hlY2tlZCBieSBjb21iaW5pbmcgc2V2ZXJhbCBtYXRjaGVyc1xuICAgICAqIHVzaW5nIGBfLm92ZXJTb21lYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm1hdGNoZXMoeyAnYSc6IDQsICdjJzogNiB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqXG4gICAgICogLy8gQ2hlY2tpbmcgZm9yIHNldmVyYWwgcG9zc2libGUgdmFsdWVzXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5vdmVyU29tZShbXy5tYXRjaGVzKHsgJ2EnOiAxIH0pLCBfLm1hdGNoZXMoeyAnYSc6IDQgfSldKSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0aGVcbiAgICAgKiB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QgdG8gYHNyY1ZhbHVlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGVcbiAgICAgKiBvYmplY3QgdmFsdWUgaXMgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0XG4gICAgICogYHNyY1ZhbHVlYCB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZVxuICAgICAqIGBfLmlzRXF1YWxgIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE11bHRpcGxlIHZhbHVlcyBjYW4gYmUgY2hlY2tlZCBieSBjb21iaW5pbmcgc2V2ZXJhbCBtYXRjaGVyc1xuICAgICAqIHVzaW5nIGBfLm92ZXJTb21lYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmQob2JqZWN0cywgXy5tYXRjaGVzUHJvcGVydHkoJ2EnLCA0KSk7XG4gICAgICogLy8gPT4geyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlc1Byb3BlcnR5KCdhJywgMSksIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCldKSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIGJhc2VDbG9uZShzcmNWYWx1ZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDIpIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgxKSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKFsnYScsICdiJ10pKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kID0gYmFzZVJlc3QoZnVuY3Rpb24ocGF0aCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tZXRob2RgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogdGhlIG1ldGhvZCBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gXy50aW1lcygzLCBfLmNvbnN0YW50KSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLm1ldGhvZE9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIHZhciBtZXRob2RPZiA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZVxuICAgICAqIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LiBJZiBgb2JqZWN0YCBpcyBhIGZ1bmN0aW9uLCB0aGVuIG1ldGhvZHNcbiAgICAgKiBhcmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVzZSBgXy5ydW5JbkNvbnRleHRgIHRvIGNyZWF0ZSBhIHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHRvXG4gICAgICogYXZvaWQgY29uZmxpY3RzIGNhdXNlZCBieSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gW29iamVjdD1sb2Rhc2hdIFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgbWl4aW5zIGFyZSBjaGFpbmFibGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gdm93ZWxzKHN0cmluZykge1xuICAgICAqICAgcmV0dXJuIF8uZmlsdGVyKHN0cmluZywgZnVuY3Rpb24odikge1xuICAgICAqICAgICByZXR1cm4gL1thZWlvdV0vaS50ZXN0KHYpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSk7XG4gICAgICogXy52b3dlbHMoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXygnZnJlZCcpLnZvd2VscygpLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0sIHsgJ2NoYWluJzogZmFsc2UgfSk7XG4gICAgICogXygnZnJlZCcpLnZvd2VscygpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWl4aW4ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKSxcbiAgICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBwcm9wcyk7XG5cbiAgICAgIGlmIChvcHRpb25zID09IG51bGwgJiZcbiAgICAgICAgICAhKGlzT2JqZWN0KHNvdXJjZSkgJiYgKG1ldGhvZE5hbWVzLmxlbmd0aCB8fCAhcHJvcHMubGVuZ3RoKSkpIHtcbiAgICAgICAgb3B0aW9ucyA9IHNvdXJjZTtcbiAgICAgICAgc291cmNlID0gb2JqZWN0O1xuICAgICAgICBvYmplY3QgPSB0aGlzO1xuICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBrZXlzKHNvdXJjZSkpO1xuICAgICAgfVxuICAgICAgdmFyIGNoYWluID0gIShpc09iamVjdChvcHRpb25zKSAmJiAnY2hhaW4nIGluIG9wdGlvbnMpIHx8ICEhb3B0aW9ucy5jaGFpbixcbiAgICAgICAgICBpc0Z1bmMgPSBpc0Z1bmN0aW9uKG9iamVjdCk7XG5cbiAgICAgIGFycmF5RWFjaChtZXRob2ROYW1lcywgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgZnVuYyA9IHNvdXJjZVttZXRob2ROYW1lXTtcbiAgICAgICAgb2JqZWN0W21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgaWYgKGlzRnVuYykge1xuICAgICAgICAgIG9iamVjdC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fO1xuICAgICAgICAgICAgaWYgKGNoYWluIHx8IGNoYWluQWxsKSB7XG4gICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvYmplY3QodGhpcy5fX3dyYXBwZWRfXyksXG4gICAgICAgICAgICAgICAgICBhY3Rpb25zID0gcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuXG4gICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh7ICdmdW5jJzogZnVuYywgJ2FyZ3MnOiBhcmd1bWVudHMsICd0aGlzQXJnJzogb2JqZWN0IH0pO1xuICAgICAgICAgICAgICByZXN1bHQuX19jaGFpbl9fID0gY2hhaW5BbGw7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShvYmplY3QsIGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSwgYXJndW1lbnRzKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0b1xuICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgICBpZiAocm9vdC5fID09PSB0aGlzKSB7XG4gICAgICAgIHJvb3QuXyA9IG9sZERhc2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLm5vb3ApO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub29wKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHRoZSBhcmd1bWVudCBhdCBpbmRleCBgbmAuIElmIGBuYCBpcyBuZWdhdGl2ZSxcbiAgICAgKiB0aGUgbnRoIGFyZ3VtZW50IGZyb20gdGhlIGVuZCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBpbmRleCBvZiB0aGUgYXJndW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhc3MtdGhydSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygxKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKC0yKTtcbiAgICAgKiBmdW5jKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gJ2MnXG4gICAgICovXG4gICAgZnVuY3Rpb24gbnRoQXJnKG4pIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICByZXR1cm4gYmFzZU50aChhcmdzLCBuKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGl0ZXJhdGVlc2Agd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzXG4gICAgICogYW5kIHJldHVybnMgdGhlaXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXIoW01hdGgubWF4LCBNYXRoLm1pbl0pO1xuICAgICAqXG4gICAgICogZnVuYygxLCAyLCAzLCA0KTtcbiAgICAgKiAvLyA9PiBbNCwgMV1cbiAgICAgKi9cbiAgICB2YXIgb3ZlciA9IGNyZWF0ZU92ZXIoYXJyYXlNYXApO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYWxsKiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEZvbGxvd2luZyBzaG9ydGhhbmRzIGFyZSBwb3NzaWJsZSBmb3IgcHJvdmlkaW5nIHByZWRpY2F0ZXMuXG4gICAgICogUGFzcyBhbiBgT2JqZWN0YCBhbmQgaXQgd2lsbCBiZSB1c2VkIGFzIGFuIHBhcmFtZXRlciBmb3IgYF8ubWF0Y2hlc2AgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuXG4gICAgICogUGFzcyBhbiBgQXJyYXlgIG9mIHBhcmFtZXRlcnMgZm9yIGBfLm1hdGNoZXNQcm9wZXJ0eWAgYW5kIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckV2ZXJ5KFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIGZ1bmMoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBvdmVyRXZlcnkgPSBjcmVhdGVPdmVyKGFycmF5RXZlcnkpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYW55Kiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm5cbiAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEZvbGxvd2luZyBzaG9ydGhhbmRzIGFyZSBwb3NzaWJsZSBmb3IgcHJvdmlkaW5nIHByZWRpY2F0ZXMuXG4gICAgICogUGFzcyBhbiBgT2JqZWN0YCBhbmQgaXQgd2lsbCBiZSB1c2VkIGFzIGFuIHBhcmFtZXRlciBmb3IgYF8ubWF0Y2hlc2AgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuXG4gICAgICogUGFzcyBhbiBgQXJyYXlgIG9mIHBhcmFtZXRlcnMgZm9yIGBfLm1hdGNoZXNQcm9wZXJ0eWAgYW5kIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlclNvbWUoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciBtYXRjaGVzRnVuYyA9IF8ub3ZlclNvbWUoW3sgJ2EnOiAxIH0sIHsgJ2EnOiAyIH1dKVxuICAgICAqIHZhciBtYXRjaGVzUHJvcGVydHlGdW5jID0gXy5vdmVyU29tZShbWydhJywgMV0sIFsnYScsIDJdXSlcbiAgICAgKi9cbiAgICB2YXIgb3ZlclNvbWUgPSBjcmVhdGVPdmVyKGFycmF5U29tZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICogdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMCwgMSwgMl0sXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3QpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAgICAgKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICAgICAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZSg0KTtcbiAgICAgKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoLTQpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJhbmdlYCBleGNlcHQgdGhhdCBpdCBwb3B1bGF0ZXMgdmFsdWVzIGluXG4gICAgICogZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoNCk7XG4gICAgICogLy8gPT4gWzMsIDIsIDEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoLTQpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICAgICAqIC8vID0+IFs0LCAzLCAyLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTUsIDEwLCA1LCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICAgICAqIC8vID0+IFtbXSwgW11dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gICAgICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5zdHViT2JqZWN0KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7fSwge31dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJycsICcnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViVHJ1ZSk7XG4gICAgICogLy8gPT4gW3RydWUsIHRydWVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlRydWUoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZlxuICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIFN0cmluZyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddXG4gICAgICpcbiAgICAgKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTtcbiAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSk7XG4gICAgICBuIC09IE1BWF9BUlJBWV9MRU5HVEg7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlVGltZXMobGVuZ3RoLCBpdGVyYXRlZSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgICAgaXRlcmF0ZWUoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBnaXZlbiwgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD0nJ10gVGhlIHZhbHVlIHRvIHByZWZpeCB0aGUgSUQgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgpO1xuICAgICAqIC8vID0+ICcxMDUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgICAgIHJldHVybiB0b1N0cmluZyhwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdG90YWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYWRkKDYsIDQpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgdmFyIGFkZCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLCBhZGRlbmQpIHtcbiAgICAgIHJldHVybiBhdWdlbmQgKyBhZGRlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg0LjAwNik7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogXy5jZWlsKDYuMDA0LCAyKTtcbiAgICAgKiAvLyA9PiA2LjAxXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNjA0MCwgLTIpO1xuICAgICAqIC8vID0+IDYxMDBcbiAgICAgKi9cbiAgICB2YXIgY2VpbCA9IGNyZWF0ZVJvdW5kKCdjZWlsJyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpZGVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBxdW90aWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaXZpZGUoNiwgNCk7XG4gICAgICogLy8gPT4gMS41XG4gICAgICovXG4gICAgdmFyIGRpdmlkZSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgIHJldHVybiBkaXZpZGVuZCAvIGRpdmlzb3I7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbG9vcig0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5mbG9vcigwLjA0NiwgMik7XG4gICAgICogLy8gPT4gMC4wNFxuICAgICAqXG4gICAgICogXy5mbG9vcig0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDAwMFxuICAgICAqL1xuICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXgoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1heGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXhCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1lYW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbihhcnJheSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBpZGVudGl0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgYXZlcmFnZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5taW4oW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbihhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGllciBUaGUgZmlyc3QgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpY2FuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHByb2R1Y3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubXVsdGlwbHkoNiwgNCk7XG4gICAgICogLy8gPT4gMjRcbiAgICAgKi9cbiAgICB2YXIgbXVsdGlwbHkgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCkge1xuICAgICAgcmV0dXJuIG11bHRpcGxpZXIgKiBtdWx0aXBsaWNhbmQ7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICAgICAqIC8vID0+IDQuMDFcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQxMDBcbiAgICAgKi9cbiAgICB2YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTtcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWludWVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN1YnRyYWhlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1YnRyYWN0KDYsIDQpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsIHN1YnRyYWhlbmQpIHtcbiAgICAgIHJldHVybiBtaW51ZW5kIC0gc3VidHJhaGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdW0oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgaWRlbnRpdHkpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7XG4gICAgbG9kYXNoLmFyeSA9IGFyeTtcbiAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduO1xuICAgIGxvZGFzaC5hc3NpZ25JbiA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5hc3NpZ25JbldpdGggPSBhc3NpZ25JbldpdGg7XG4gICAgbG9kYXNoLmFzc2lnbldpdGggPSBhc3NpZ25XaXRoO1xuICAgIGxvZGFzaC5hdCA9IGF0O1xuICAgIGxvZGFzaC5iZWZvcmUgPSBiZWZvcmU7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNhc3RBcnJheSA9IGNhc3RBcnJheTtcbiAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjtcbiAgICBsb2Rhc2guY2h1bmsgPSBjaHVuaztcbiAgICBsb2Rhc2guY29tcGFjdCA9IGNvbXBhY3Q7XG4gICAgbG9kYXNoLmNvbmNhdCA9IGNvbmNhdDtcbiAgICBsb2Rhc2guY29uZCA9IGNvbmQ7XG4gICAgbG9kYXNoLmNvbmZvcm1zID0gY29uZm9ybXM7XG4gICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7XG4gICAgbG9kYXNoLmNvdW50QnkgPSBjb3VudEJ5O1xuICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgbG9kYXNoLmN1cnJ5ID0gY3Vycnk7XG4gICAgbG9kYXNoLmN1cnJ5UmlnaHQgPSBjdXJyeVJpZ2h0O1xuICAgIGxvZGFzaC5kZWJvdW5jZSA9IGRlYm91bmNlO1xuICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgIGxvZGFzaC5kZWZhdWx0c0RlZXAgPSBkZWZhdWx0c0RlZXA7XG4gICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7XG4gICAgbG9kYXNoLmRlbGF5ID0gZGVsYXk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlO1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlQnkgPSBkaWZmZXJlbmNlQnk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VXaXRoID0gZGlmZmVyZW5jZVdpdGg7XG4gICAgbG9kYXNoLmRyb3AgPSBkcm9wO1xuICAgIGxvZGFzaC5kcm9wUmlnaHQgPSBkcm9wUmlnaHQ7XG4gICAgbG9kYXNoLmRyb3BSaWdodFdoaWxlID0gZHJvcFJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTtcbiAgICBsb2Rhc2guZmlsbCA9IGZpbGw7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdE1hcCA9IGZsYXRNYXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZWVwID0gZmxhdE1hcERlZXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZXB0aCA9IGZsYXRNYXBEZXB0aDtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZsYXR0ZW5EZWVwID0gZmxhdHRlbkRlZXA7XG4gICAgbG9kYXNoLmZsYXR0ZW5EZXB0aCA9IGZsYXR0ZW5EZXB0aDtcbiAgICBsb2Rhc2guZmxpcCA9IGZsaXA7XG4gICAgbG9kYXNoLmZsb3cgPSBmbG93O1xuICAgIGxvZGFzaC5mbG93UmlnaHQgPSBmbG93UmlnaHQ7XG4gICAgbG9kYXNoLmZyb21QYWlycyA9IGZyb21QYWlycztcbiAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zO1xuICAgIGxvZGFzaC5mdW5jdGlvbnNJbiA9IGZ1bmN0aW9uc0luO1xuICAgIGxvZGFzaC5ncm91cEJ5ID0gZ3JvdXBCeTtcbiAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uQnkgPSBpbnRlcnNlY3Rpb25CeTtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aCA9IGludGVyc2VjdGlvbldpdGg7XG4gICAgbG9kYXNoLmludmVydCA9IGludmVydDtcbiAgICBsb2Rhc2guaW52ZXJ0QnkgPSBpbnZlcnRCeTtcbiAgICBsb2Rhc2guaW52b2tlTWFwID0gaW52b2tlTWFwO1xuICAgIGxvZGFzaC5pdGVyYXRlZSA9IGl0ZXJhdGVlO1xuICAgIGxvZGFzaC5rZXlCeSA9IGtleUJ5O1xuICAgIGxvZGFzaC5rZXlzID0ga2V5cztcbiAgICBsb2Rhc2gua2V5c0luID0ga2V5c0luO1xuICAgIGxvZGFzaC5tYXAgPSBtYXA7XG4gICAgbG9kYXNoLm1hcEtleXMgPSBtYXBLZXlzO1xuICAgIGxvZGFzaC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7XG4gICAgbG9kYXNoLm1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGxvZGFzaC5tYXRjaGVzUHJvcGVydHkgPSBtYXRjaGVzUHJvcGVydHk7XG4gICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplO1xuICAgIGxvZGFzaC5tZXJnZSA9IG1lcmdlO1xuICAgIGxvZGFzaC5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG4gICAgbG9kYXNoLm1ldGhvZCA9IG1ldGhvZDtcbiAgICBsb2Rhc2gubWV0aG9kT2YgPSBtZXRob2RPZjtcbiAgICBsb2Rhc2gubWl4aW4gPSBtaXhpbjtcbiAgICBsb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xuICAgIGxvZGFzaC5udGhBcmcgPSBudGhBcmc7XG4gICAgbG9kYXNoLm9taXQgPSBvbWl0O1xuICAgIGxvZGFzaC5vbWl0QnkgPSBvbWl0Qnk7XG4gICAgbG9kYXNoLm9uY2UgPSBvbmNlO1xuICAgIGxvZGFzaC5vcmRlckJ5ID0gb3JkZXJCeTtcbiAgICBsb2Rhc2gub3ZlciA9IG92ZXI7XG4gICAgbG9kYXNoLm92ZXJBcmdzID0gb3ZlckFyZ3M7XG4gICAgbG9kYXNoLm92ZXJFdmVyeSA9IG92ZXJFdmVyeTtcbiAgICBsb2Rhc2gub3ZlclNvbWUgPSBvdmVyU29tZTtcbiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgbG9kYXNoLnBhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodDtcbiAgICBsb2Rhc2gucGFydGl0aW9uID0gcGFydGl0aW9uO1xuICAgIGxvZGFzaC5waWNrID0gcGljaztcbiAgICBsb2Rhc2gucGlja0J5ID0gcGlja0J5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eU9mID0gcHJvcGVydHlPZjtcbiAgICBsb2Rhc2gucHVsbCA9IHB1bGw7XG4gICAgbG9kYXNoLnB1bGxBbGwgPSBwdWxsQWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsQnkgPSBwdWxsQWxsQnk7XG4gICAgbG9kYXNoLnB1bGxBbGxXaXRoID0gcHVsbEFsbFdpdGg7XG4gICAgbG9kYXNoLnB1bGxBdCA9IHB1bGxBdDtcbiAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTtcbiAgICBsb2Rhc2gucmFuZ2VSaWdodCA9IHJhbmdlUmlnaHQ7XG4gICAgbG9kYXNoLnJlYXJnID0gcmVhcmc7XG4gICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDtcbiAgICBsb2Rhc2gucmVtb3ZlID0gcmVtb3ZlO1xuICAgIGxvZGFzaC5yZXN0ID0gcmVzdDtcbiAgICBsb2Rhc2gucmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgbG9kYXNoLnNhbXBsZVNpemUgPSBzYW1wbGVTaXplO1xuICAgIGxvZGFzaC5zZXQgPSBzZXQ7XG4gICAgbG9kYXNoLnNldFdpdGggPSBzZXRXaXRoO1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc2xpY2UgPSBzbGljZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxID0gc29ydGVkVW5pcTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcUJ5ID0gc29ydGVkVW5pcUJ5O1xuICAgIGxvZGFzaC5zcGxpdCA9IHNwbGl0O1xuICAgIGxvZGFzaC5zcHJlYWQgPSBzcHJlYWQ7XG4gICAgbG9kYXNoLnRhaWwgPSB0YWlsO1xuICAgIGxvZGFzaC50YWtlID0gdGFrZTtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0ID0gdGFrZVJpZ2h0O1xuICAgIGxvZGFzaC50YWtlUmlnaHRXaGlsZSA9IHRha2VSaWdodFdoaWxlO1xuICAgIGxvZGFzaC50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG4gICAgbG9kYXNoLnRhcCA9IHRhcDtcbiAgICBsb2Rhc2gudGhyb3R0bGUgPSB0aHJvdHRsZTtcbiAgICBsb2Rhc2gudGhydSA9IHRocnU7XG4gICAgbG9kYXNoLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIGxvZGFzaC50b1BhaXJzID0gdG9QYWlycztcbiAgICBsb2Rhc2gudG9QYWlyc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC50b1BhdGggPSB0b1BhdGg7XG4gICAgbG9kYXNoLnRvUGxhaW5PYmplY3QgPSB0b1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgbG9kYXNoLnVuYXJ5ID0gdW5hcnk7XG4gICAgbG9kYXNoLnVuaW9uID0gdW5pb247XG4gICAgbG9kYXNoLnVuaW9uQnkgPSB1bmlvbkJ5O1xuICAgIGxvZGFzaC51bmlvbldpdGggPSB1bmlvbldpdGg7XG4gICAgbG9kYXNoLnVuaXEgPSB1bmlxO1xuICAgIGxvZGFzaC51bmlxQnkgPSB1bmlxQnk7XG4gICAgbG9kYXNoLnVuaXFXaXRoID0gdW5pcVdpdGg7XG4gICAgbG9kYXNoLnVuc2V0ID0gdW5zZXQ7XG4gICAgbG9kYXNoLnVuemlwID0gdW56aXA7XG4gICAgbG9kYXNoLnVuemlwV2l0aCA9IHVuemlwV2l0aDtcbiAgICBsb2Rhc2gudXBkYXRlID0gdXBkYXRlO1xuICAgIGxvZGFzaC51cGRhdGVXaXRoID0gdXBkYXRlV2l0aDtcbiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzO1xuICAgIGxvZGFzaC52YWx1ZXNJbiA9IHZhbHVlc0luO1xuICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDtcbiAgICBsb2Rhc2gud29yZHMgPSB3b3JkcztcbiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7XG4gICAgbG9kYXNoLnhvciA9IHhvcjtcbiAgICBsb2Rhc2gueG9yQnkgPSB4b3JCeTtcbiAgICBsb2Rhc2gueG9yV2l0aCA9IHhvcldpdGg7XG4gICAgbG9kYXNoLnppcCA9IHppcDtcbiAgICBsb2Rhc2guemlwT2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC56aXBPYmplY3REZWVwID0gemlwT2JqZWN0RGVlcDtcbiAgICBsb2Rhc2guemlwV2l0aCA9IHppcFdpdGg7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZW50cmllcyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLmVudHJpZXNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmV4dGVuZFdpdGggPSBhc3NpZ25JbldpdGg7XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgbWl4aW4obG9kYXNoLCBsb2Rhc2gpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFkZCA9IGFkZDtcbiAgICBsb2Rhc2guYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgbG9kYXNoLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbiAgICBsb2Rhc2guY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7XG4gICAgbG9kYXNoLmNlaWwgPSBjZWlsO1xuICAgIGxvZGFzaC5jbGFtcCA9IGNsYW1wO1xuICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lO1xuICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7XG4gICAgbG9kYXNoLmNsb25lRGVlcFdpdGggPSBjbG9uZURlZXBXaXRoO1xuICAgIGxvZGFzaC5jbG9uZVdpdGggPSBjbG9uZVdpdGg7XG4gICAgbG9kYXNoLmNvbmZvcm1zVG8gPSBjb25mb3Jtc1RvO1xuICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7XG4gICAgbG9kYXNoLmRlZmF1bHRUbyA9IGRlZmF1bHRUbztcbiAgICBsb2Rhc2guZGl2aWRlID0gZGl2aWRlO1xuICAgIGxvZGFzaC5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuICAgIGxvZGFzaC5lcSA9IGVxO1xuICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7XG4gICAgbG9kYXNoLmVzY2FwZVJlZ0V4cCA9IGVzY2FwZVJlZ0V4cDtcbiAgICBsb2Rhc2guZXZlcnkgPSBldmVyeTtcbiAgICBsb2Rhc2guZmluZCA9IGZpbmQ7XG4gICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7XG4gICAgbG9kYXNoLmZpbmRMYXN0ID0gZmluZExhc3Q7XG4gICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4O1xuICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5O1xuICAgIGxvZGFzaC5mbG9vciA9IGZsb29yO1xuICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5mb3JJbiA9IGZvckluO1xuICAgIGxvZGFzaC5mb3JJblJpZ2h0ID0gZm9ySW5SaWdodDtcbiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duO1xuICAgIGxvZGFzaC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0O1xuICAgIGxvZGFzaC5nZXQgPSBnZXQ7XG4gICAgbG9kYXNoLmd0ID0gZ3Q7XG4gICAgbG9kYXNoLmd0ZSA9IGd0ZTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5oYXNJbiA9IGhhc0luO1xuICAgIGxvZGFzaC5oZWFkID0gaGVhZDtcbiAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7XG4gICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlO1xuICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7XG4gICAgbG9kYXNoLmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7XG4gICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuICAgIGxvZGFzaC5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZTtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2VPYmplY3QgPSBpc0FycmF5TGlrZU9iamVjdDtcbiAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuO1xuICAgIGxvZGFzaC5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7XG4gICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbiAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7XG4gICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsO1xuICAgIGxvZGFzaC5pc0VxdWFsV2l0aCA9IGlzRXF1YWxXaXRoO1xuICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzSW50ZWdlciA9IGlzSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNMZW5ndGggPSBpc0xlbmd0aDtcbiAgICBsb2Rhc2guaXNNYXAgPSBpc01hcDtcbiAgICBsb2Rhc2guaXNNYXRjaCA9IGlzTWF0Y2g7XG4gICAgbG9kYXNoLmlzTWF0Y2hXaXRoID0gaXNNYXRjaFdpdGg7XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTmF0aXZlID0gaXNOYXRpdmU7XG4gICAgbG9kYXNoLmlzTmlsID0gaXNOaWw7XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNPYmplY3RMaWtlID0gaXNPYmplY3RMaWtlO1xuICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcbiAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4cDtcbiAgICBsb2Rhc2guaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLmlzU2V0ID0gaXNTZXQ7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzU3ltYm9sID0gaXNTeW1ib2w7XG4gICAgbG9kYXNoLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTtcbiAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcbiAgICBsb2Rhc2guaXNXZWFrTWFwID0gaXNXZWFrTWFwO1xuICAgIGxvZGFzaC5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7XG4gICAgbG9kYXNoLmpvaW4gPSBqb2luO1xuICAgIGxvZGFzaC5rZWJhYkNhc2UgPSBrZWJhYkNhc2U7XG4gICAgbG9kYXNoLmxhc3QgPSBsYXN0O1xuICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5sb3dlckNhc2UgPSBsb3dlckNhc2U7XG4gICAgbG9kYXNoLmxvd2VyRmlyc3QgPSBsb3dlckZpcnN0O1xuICAgIGxvZGFzaC5sdCA9IGx0O1xuICAgIGxvZGFzaC5sdGUgPSBsdGU7XG4gICAgbG9kYXNoLm1heCA9IG1heDtcbiAgICBsb2Rhc2gubWF4QnkgPSBtYXhCeTtcbiAgICBsb2Rhc2gubWVhbiA9IG1lYW47XG4gICAgbG9kYXNoLm1lYW5CeSA9IG1lYW5CeTtcbiAgICBsb2Rhc2gubWluID0gbWluO1xuICAgIGxvZGFzaC5taW5CeSA9IG1pbkJ5O1xuICAgIGxvZGFzaC5zdHViQXJyYXkgPSBzdHViQXJyYXk7XG4gICAgbG9kYXNoLnN0dWJGYWxzZSA9IHN0dWJGYWxzZTtcbiAgICBsb2Rhc2guc3R1Yk9iamVjdCA9IHN0dWJPYmplY3Q7XG4gICAgbG9kYXNoLnN0dWJTdHJpbmcgPSBzdHViU3RyaW5nO1xuICAgIGxvZGFzaC5zdHViVHJ1ZSA9IHN0dWJUcnVlO1xuICAgIGxvZGFzaC5tdWx0aXBseSA9IG11bHRpcGx5O1xuICAgIGxvZGFzaC5udGggPSBudGg7XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYWQgPSBwYWQ7XG4gICAgbG9kYXNoLnBhZEVuZCA9IHBhZEVuZDtcbiAgICBsb2Rhc2gucGFkU3RhcnQgPSBwYWRTdGFydDtcbiAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUludDtcbiAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tO1xuICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1Y2U7XG4gICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7XG4gICAgbG9kYXNoLnJlcGVhdCA9IHJlcGVhdDtcbiAgICBsb2Rhc2gucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDtcbiAgICBsb2Rhc2gucm91bmQgPSByb3VuZDtcbiAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0O1xuICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zbmFrZUNhc2UgPSBzbmFrZUNhc2U7XG4gICAgbG9kYXNoLnNvbWUgPSBzb21lO1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleEJ5ID0gc29ydGVkSW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhPZiA9IHNvcnRlZEluZGV4T2Y7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4QnkgPSBzb3J0ZWRMYXN0SW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBzb3J0ZWRMYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlO1xuICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbiAgICBsb2Rhc2guc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBsb2Rhc2guc3VtID0gc3VtO1xuICAgIGxvZGFzaC5zdW1CeSA9IHN1bUJ5O1xuICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzO1xuICAgIGxvZGFzaC50b0Zpbml0ZSA9IHRvRmluaXRlO1xuICAgIGxvZGFzaC50b0ludGVnZXIgPSB0b0ludGVnZXI7XG4gICAgbG9kYXNoLnRvTGVuZ3RoID0gdG9MZW5ndGg7XG4gICAgbG9kYXNoLnRvTG93ZXIgPSB0b0xvd2VyO1xuICAgIGxvZGFzaC50b051bWJlciA9IHRvTnVtYmVyO1xuICAgIGxvZGFzaC50b1NhZmVJbnRlZ2VyID0gdG9TYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBsb2Rhc2gudG9VcHBlciA9IHRvVXBwZXI7XG4gICAgbG9kYXNoLnRyaW0gPSB0cmltO1xuICAgIGxvZGFzaC50cmltRW5kID0gdHJpbUVuZDtcbiAgICBsb2Rhc2gudHJpbVN0YXJ0ID0gdHJpbVN0YXJ0O1xuICAgIGxvZGFzaC50cnVuY2F0ZSA9IHRydW5jYXRlO1xuICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlO1xuICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGxvZGFzaC51cHBlckNhc2UgPSB1cHBlckNhc2U7XG4gICAgbG9kYXNoLnVwcGVyRmlyc3QgPSB1cHBlckZpcnN0O1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5lYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZpcnN0ID0gaGVhZDtcblxuICAgIG1peGluKGxvZGFzaCwgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHt9O1xuICAgICAgYmFzZUZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsIG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH0oKSksIHsgJ2NoYWluJzogZmFsc2UgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGxvZGFzaC5WRVJTSU9OID0gVkVSU0lPTjtcblxuICAgIC8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbiAgICBhcnJheUVhY2goWydiaW5kJywgJ2JpbmRLZXknLCAnY3VycnknLCAnY3VycnlSaWdodCcsICdwYXJ0aWFsJywgJ3BhcnRpYWxSaWdodCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICBsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXIgPSBsb2Rhc2g7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuXG4gICAgYXJyYXlFYWNoKFsnZHJvcCcsICd0YWtlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIG4gPSBuID09PSB1bmRlZmluZWQgPyAxIDogbmF0aXZlTWF4KHRvSW50ZWdlcihuKSwgMCk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9ICh0aGlzLl9fZmlsdGVyZWRfXyAmJiAhaW5kZXgpXG4gICAgICAgICAgPyBuZXcgTGF6eVdyYXBwZXIodGhpcylcbiAgICAgICAgICA6IHRoaXMuY2xvbmUoKTtcblxuICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXykge1xuICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gbmF0aXZlTWluKG4sIHJlc3VsdC5fX3Rha2VDb3VudF9fKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQuX192aWV3c19fLnB1c2goe1xuICAgICAgICAgICAgJ3NpemUnOiBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCksXG4gICAgICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSArICdSaWdodCddID0gZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdGhhdCBhY2NlcHQgYW4gYGl0ZXJhdGVlYCB2YWx1ZS5cbiAgICBhcnJheUVhY2goWydmaWx0ZXInLCAnbWFwJywgJ3Rha2VXaGlsZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHR5cGUgPSBpbmRleCArIDEsXG4gICAgICAgICAgaXNGaWx0ZXIgPSB0eXBlID09IExBWllfRklMVEVSX0ZMQUcgfHwgdHlwZSA9PSBMQVpZX1dISUxFX0ZMQUc7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe1xuICAgICAgICAgICdpdGVyYXRlZSc6IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSxcbiAgICAgICAgICAndHlwZSc6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmhlYWRgIGFuZCBgXy5sYXN0YC5cbiAgICBhcnJheUVhY2goWydoZWFkJywgJ2xhc3QnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuXG4gICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fICYmIChzdGFydCA+IDAgfHwgZW5kIDwgMCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGFrZVJpZ2h0KC1zdGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kcm9wKHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0b0ludGVnZXIoZW5kKTtcbiAgICAgICAgcmVzdWx0ID0gZW5kIDwgMCA/IHJlc3VsdC5kcm9wUmlnaHQoLWVuZCkgOiByZXN1bHQudGFrZShlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWtlKE1BWF9BUlJBWV9MRU5HVEgpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGNoZWNrSXRlcmF0ZWUgPSAvXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW2lzVGFrZXIgPyAoJ3Rha2UnICsgKG1ldGhvZE5hbWUgPT0gJ2xhc3QnID8gJ1JpZ2h0JyA6ICcnKSkgOiBtZXRob2ROYW1lXSxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSBpc1Rha2VyIHx8IC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgaWYgKCFsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICAgIGFyZ3MgPSBpc1Rha2VyID8gWzFdIDogYXJndW1lbnRzLFxuICAgICAgICAgICAgaXNMYXp5ID0gdmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixcbiAgICAgICAgICAgIGl0ZXJhdGVlID0gYXJnc1swXSxcbiAgICAgICAgICAgIHVzZUxhenkgPSBpc0xhenkgfHwgaXNBcnJheSh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIGludGVyY2VwdG9yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsIGFycmF5UHVzaChbdmFsdWVdLCBhcmdzKSk7XG4gICAgICAgICAgcmV0dXJuIChpc1Rha2VyICYmIGNoYWluQWxsKSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhIFwibGVuZ3RoXCIgdmFsdWUgb3RoZXIgdGhhbiBgMWAuXG4gICAgICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgaXNIeWJyaWQgPSAhIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLFxuICAgICAgICAgICAgaXNVbndyYXBwZWQgPSByZXRVbndyYXBwZWQgJiYgIWNoYWluQWxsLFxuICAgICAgICAgICAgb25seUxhenkgPSBpc0xhenkgJiYgIWlzSHlicmlkO1xuXG4gICAgICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9ubHlMYXp5ID8gdmFsdWUgOiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbndyYXBwZWQgJiYgb25seUxhenkpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgICByZXR1cm4gaXNVbndyYXBwZWQgPyAoaXNUYWtlciA/IHJlc3VsdC52YWx1ZSgpWzBdIDogcmVzdWx0LnZhbHVlKCkpIDogcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgQXJyYXlgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGFycmF5RWFjaChbJ3BvcCcsICdwdXNoJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVByb3RvW21ldGhvZE5hbWVdLFxuICAgICAgICAgIGNoYWluTmFtZSA9IC9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKSA/ICd0YXAnIDogJ3RocnUnLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IC9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIXRoaXMuX19jaGFpbl9fKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIE1hcCBtaW5pZmllZCBtZXRob2QgbmFtZXMgdG8gdGhlaXIgcmVhbCBuYW1lcy5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbbWV0aG9kTmFtZV07XG4gICAgICBpZiAobG9kYXNoRnVuYykge1xuICAgICAgICB2YXIga2V5ID0gbG9kYXNoRnVuYy5uYW1lICsgJyc7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIGtleSkpIHtcbiAgICAgICAgICByZWFsTmFtZXNba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJlYWxOYW1lc1trZXldLnB1c2goeyAnbmFtZSc6IG1ldGhvZE5hbWUsICdmdW5jJzogbG9kYXNoRnVuYyB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLCBXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3tcbiAgICAgICduYW1lJzogJ3dyYXBwZXInLFxuICAgICAgJ2Z1bmMnOiB1bmRlZmluZWRcbiAgICB9XTtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMYXp5V3JhcHBlcmAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lID0gbGF6eUNsb25lO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlID0gbGF6eVJldmVyc2U7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlID0gbGF6eVZhbHVlO1xuXG4gICAgLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5hdCA9IHdyYXBwZXJBdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29tbWl0ID0gd3JhcHBlckNvbW1pdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLm5leHQgPSB3cmFwcGVyTmV4dDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnBsYW50ID0gd3JhcHBlclBsYW50O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucmV2ZXJzZSA9IHdyYXBwZXJSZXZlcnNlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTtcblxuICAgIC8vIEFkZCBsYXp5IGFsaWFzZXMuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5maXJzdCA9IGxvZGFzaC5wcm90b3R5cGUuaGVhZDtcblxuICAgIGlmIChzeW1JdGVyYXRvcikge1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl0gPSB3cmFwcGVyVG9JdGVyYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfSk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLy8gRXhwb3J0IGxvZGFzaC5cbiAgdmFyIF8gPSBydW5JbkNvbnRleHQoKTtcblxuICAvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBjb25kaXRpb24gcGF0dGVybnMgbGlrZTpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIExvZGFzaCBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBwcmV2ZW50IGVycm9ycyB3aGVuIExvZGFzaCBpc1xuICAgIC8vIGxvYWRlZCBieSBhIHNjcmlwdCB0YWcgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRCBsb2FkZXIuXG4gICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjbWlzbWF0Y2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAvLyBVc2UgYF8ubm9Db25mbGljdGAgdG8gcmVtb3ZlIExvZGFzaCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG5cbiAgICAvLyBEZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBpdC5cbiAgZWxzZSBpZiAoZnJlZU1vZHVsZSkge1xuICAgIC8vIEV4cG9ydCBmb3IgTm9kZS5qcy5cbiAgICAoZnJlZU1vZHVsZS5leHBvcnRzID0gXykuXyA9IF87XG4gICAgLy8gRXhwb3J0IGZvciBDb21tb25KUyBzdXBwb3J0LlxuICAgIGZyZWVFeHBvcnRzLl8gPSBfO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIEV4cG9ydCB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuICB9XG59LmNhbGwodGhpcykpO1xuIiwgIi8vIDo6LSBQZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBvcmRlcmVkIG1hcHBpbmcgZnJvbVxuLy8gc3RyaW5ncyB0byB2YWx1ZXMsIHdpdGggc29tZSBjb252ZW5pZW50IHVwZGF0ZSBtZXRob2RzLlxuZnVuY3Rpb24gT3JkZXJlZE1hcChjb250ZW50KSB7XG4gIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG59XG5cbk9yZGVyZWRNYXAucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogT3JkZXJlZE1hcCxcblxuICBmaW5kOiBmdW5jdGlvbihrZXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbaV0gPT09IGtleSkgcmV0dXJuIGlcbiAgICByZXR1cm4gLTFcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nKSBcdTIxOTIgP2FueVxuICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyIGBrZXlgLCBvciByZXR1cm4gdW5kZWZpbmVkIHdoZW5cbiAgLy8gbm8gc3VjaCBrZXkgZXhpc3RzLlxuICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZChrZXkpO1xuICAgIHJldHVybiBmb3VuZCA9PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudFtmb3VuZCArIDFdXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55LCA/c3RyaW5nKSBcdTIxOTIgT3JkZXJlZE1hcFxuICAvLyBDcmVhdGUgYSBuZXcgbWFwIGJ5IHJlcGxhY2luZyB0aGUgdmFsdWUgb2YgYGtleWAgd2l0aCBhIG5ld1xuICAvLyB2YWx1ZSwgb3IgYWRkaW5nIGEgYmluZGluZyB0byB0aGUgZW5kIG9mIHRoZSBtYXAuIElmIGBuZXdLZXlgIGlzXG4gIC8vIGdpdmVuLCB0aGUga2V5IG9mIHRoZSBiaW5kaW5nIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGF0IGtleS5cbiAgdXBkYXRlOiBmdW5jdGlvbihrZXksIHZhbHVlLCBuZXdLZXkpIHtcbiAgICB2YXIgc2VsZiA9IG5ld0tleSAmJiBuZXdLZXkgIT0ga2V5ID8gdGhpcy5yZW1vdmUobmV3S2V5KSA6IHRoaXM7XG4gICAgdmFyIGZvdW5kID0gc2VsZi5maW5kKGtleSksIGNvbnRlbnQgPSBzZWxmLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHtcbiAgICAgIGNvbnRlbnQucHVzaChuZXdLZXkgfHwga2V5LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRbZm91bmQgKyAxXSA9IHZhbHVlO1xuICAgICAgaWYgKG5ld0tleSkgY29udGVudFtmb3VuZF0gPSBuZXdLZXk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcpIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIFJldHVybiBhIG1hcCB3aXRoIHRoZSBnaXZlbiBrZXkgcmVtb3ZlZCwgaWYgaXQgZXhpc3RlZC5cbiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHJldHVybiB0aGlzXG4gICAgdmFyIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBjb250ZW50LnNwbGljZShmb3VuZCwgMik7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55KSBcdTIxOTIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBuZXcga2V5IHRvIHRoZSBzdGFydCBvZiB0aGUgbWFwLlxuICBhZGRUb1N0YXJ0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKFtrZXksIHZhbHVlXS5jb25jYXQodGhpcy5yZW1vdmUoa2V5KS5jb250ZW50KSlcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIEFkZCBhIG5ldyBrZXkgdG8gdGhlIGVuZCBvZiB0aGUgbWFwLlxuICBhZGRUb0VuZDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBjb250ZW50ID0gdGhpcy5yZW1vdmUoa2V5KS5jb250ZW50LnNsaWNlKCk7XG4gICAgY29udGVudC5wdXNoKGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcsIHN0cmluZywgYW55KSBcdTIxOTIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBrZXkgYWZ0ZXIgdGhlIGdpdmVuIGtleS4gSWYgYHBsYWNlYCBpcyBub3QgZm91bmQsIHRoZSBuZXdcbiAgLy8ga2V5IGlzIGFkZGVkIHRvIHRoZSBlbmQuXG4gIGFkZEJlZm9yZTogZnVuY3Rpb24ocGxhY2UsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgd2l0aG91dCA9IHRoaXMucmVtb3ZlKGtleSksIGNvbnRlbnQgPSB3aXRob3V0LmNvbnRlbnQuc2xpY2UoKTtcbiAgICB2YXIgZm91bmQgPSB3aXRob3V0LmZpbmQocGxhY2UpO1xuICAgIGNvbnRlbnQuc3BsaWNlKGZvdW5kID09IC0xID8gY29udGVudC5sZW5ndGggOiBmb3VuZCwgMCwga2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkpXG4gIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBtYXAsIGluXG4gIC8vIG9yZGVyLlxuICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICBmKHRoaXMuY29udGVudFtpXSwgdGhpcy5jb250ZW50W2kgKyAxXSk7XG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgcHJlcGVuZGluZyB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYCBiZWZvcmUgdGhlIGtleXMgaW4gYG1hcGAuXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKG1hcC5jb250ZW50LmNvbmNhdCh0aGlzLnN1YnRyYWN0KG1hcCkuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgYXBwZW5kaW5nIHRoZSBrZXlzIGluIHRoaXMgbWFwIHRoYXQgZG9uJ3RcbiAgLy8gYXBwZWFyIGluIGBtYXBgIGFmdGVyIHRoZSBrZXlzIGluIGBtYXBgLlxuICBhcHBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKHRoaXMuc3VidHJhY3QobWFwKS5jb250ZW50LmNvbmNhdChtYXAuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIFx1MjE5MiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG1hcCBjb250YWluaW5nIGFsbCB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYC5cbiAgc3VidHJhY3Q6IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzO1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXN1bHQgPSByZXN1bHQucmVtb3ZlKG1hcC5jb250ZW50W2ldKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sXG5cbiAgLy8gOjogKCkgXHUyMTkyIE9iamVjdFxuICAvLyBUdXJuIG9yZGVyZWQgbWFwIGludG8gYSBwbGFpbiBvYmplY3QuXG4gIHRvT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsgcmVzdWx0W2tleV0gPSB2YWx1ZTsgfSk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LFxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBUaGUgYW1vdW50IG9mIGtleXMgaW4gdGhpcyBtYXAuXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID4+IDFcbiAgfVxufTtcblxuLy8gOjogKD91bmlvbjxPYmplY3QsIE9yZGVyZWRNYXA+KSBcdTIxOTIgT3JkZXJlZE1hcFxuLy8gUmV0dXJuIGEgbWFwIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuIElmIG51bGwsIGNyZWF0ZSBhbiBlbXB0eVxuLy8gbWFwLiBJZiBnaXZlbiBhbiBvcmRlcmVkIG1hcCwgcmV0dXJuIHRoYXQgbWFwIGl0c2VsZi4gSWYgZ2l2ZW4gYW5cbi8vIG9iamVjdCwgY3JlYXRlIGEgbWFwIGZyb20gdGhlIG9iamVjdCdzIHByb3BlcnRpZXMuXG5PcmRlcmVkTWFwLmZyb20gPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPcmRlcmVkTWFwKSByZXR1cm4gdmFsdWVcbiAgdmFyIGNvbnRlbnQgPSBbXTtcbiAgaWYgKHZhbHVlKSBmb3IgKHZhciBwcm9wIGluIHZhbHVlKSBjb250ZW50LnB1c2gocHJvcCwgdmFsdWVbcHJvcF0pO1xuICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9yZGVyZWRNYXA7XG4iLCAiaW1wb3J0IE9yZGVyZWRNYXAgZnJvbSAnb3JkZXJlZG1hcCc7XG5cbmZ1bmN0aW9uIGZpbmREaWZmU3RhcnQoYSwgYiwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT0gYS5jaGlsZENvdW50IHx8IGkgPT0gYi5jaGlsZENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIGEuY2hpbGRDb3VudCA9PSBiLmNoaWxkQ291bnQgPyBudWxsIDogcG9zO1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZChpKSwgY2hpbGRCID0gYi5jaGlsZChpKTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZEEubm9kZVNpemU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoaWxkQS5zYW1lTWFya3VwKGNoaWxkQikpXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNoaWxkQS50ZXh0W2pdID09IGNoaWxkQi50ZXh0W2pdOyBqKyspXG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZEEuY29udGVudC5zaXplIHx8IGNoaWxkQi5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGZpbmREaWZmU3RhcnQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3MgKyAxKTtcbiAgICAgICAgICAgIGlmIChpbm5lciAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gY2hpbGRBLm5vZGVTaXplO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmREaWZmRW5kKGEsIGIsIHBvc0EsIHBvc0IpIHtcbiAgICBmb3IgKGxldCBpQSA9IGEuY2hpbGRDb3VudCwgaUIgPSBiLmNoaWxkQ291bnQ7Oykge1xuICAgICAgICBpZiAoaUEgPT0gMCB8fCBpQiA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGlBID09IGlCID8gbnVsbCA6IHsgYTogcG9zQSwgYjogcG9zQiB9O1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZCgtLWlBKSwgY2hpbGRCID0gYi5jaGlsZCgtLWlCKSwgc2l6ZSA9IGNoaWxkQS5ub2RlU2l6ZTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvc0EgLT0gc2l6ZTtcbiAgICAgICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSlcbiAgICAgICAgICAgIHJldHVybiB7IGE6IHBvc0EsIGI6IHBvc0IgfTtcbiAgICAgICAgaWYgKGNoaWxkQS5pc1RleHQgJiYgY2hpbGRBLnRleHQgIT0gY2hpbGRCLnRleHQpIHtcbiAgICAgICAgICAgIGxldCBzYW1lID0gMCwgbWluU2l6ZSA9IE1hdGgubWluKGNoaWxkQS50ZXh0Lmxlbmd0aCwgY2hpbGRCLnRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIHdoaWxlIChzYW1lIDwgbWluU2l6ZSAmJiBjaGlsZEEudGV4dFtjaGlsZEEudGV4dC5sZW5ndGggLSBzYW1lIC0gMV0gPT0gY2hpbGRCLnRleHRbY2hpbGRCLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdKSB7XG4gICAgICAgICAgICAgICAgc2FtZSsrO1xuICAgICAgICAgICAgICAgIHBvc0EtLTtcbiAgICAgICAgICAgICAgICBwb3NCLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBhOiBwb3NBLCBiOiBwb3NCIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkQS5jb250ZW50LnNpemUgfHwgY2hpbGRCLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZERpZmZFbmQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3NBIC0gMSwgcG9zQiAtIDEpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3NBIC09IHNpemU7XG4gICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICB9XG59XG5cbi8qKlxuQSBmcmFnbWVudCByZXByZXNlbnRzIGEgbm9kZSdzIGNvbGxlY3Rpb24gb2YgY2hpbGQgbm9kZXMuXG5cbkxpa2Ugbm9kZXMsIGZyYWdtZW50cyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMsIGFuZCB5b3VcbnNob3VsZCBub3QgbXV0YXRlIHRoZW0gb3IgdGhlaXIgY29udGVudC4gUmF0aGVyLCB5b3UgY3JlYXRlIG5ld1xuaW5zdGFuY2VzIHdoZW5ldmVyIG5lZWRlZC4gVGhlIEFQSSB0cmllcyB0byBtYWtlIHRoaXMgZWFzeS5cbiovXG5jbGFzcyBGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnRlbnQsIHNpemUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCAwO1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSArPSBjb250ZW50W2ldLm5vZGVTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdHdvXG4gICAgcG9zaXRpb25zIChyZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIGZyYWdtZW50KS4gRG9lc24ndCBkZXNjZW5kXG4gICAgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgbm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBub2RlU3RhcnQgPSAwLCBwYXJlbnQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXSwgZW5kID0gcG9zICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSAmJiBmKGNoaWxkLCBub2RlU3RhcnQgKyBwb3MsIHBhcmVudCB8fCBudWxsLCBpKSAhPT0gZmFsc2UgJiYgY2hpbGQuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zICsgMTtcbiAgICAgICAgICAgICAgICBjaGlsZC5ub2Rlc0JldHdlZW4oTWF0aC5tYXgoMCwgZnJvbSAtIHN0YXJ0KSwgTWF0aC5taW4oY2hpbGQuY29udGVudC5zaXplLCB0byAtIHN0YXJ0KSwgZiwgbm9kZVN0YXJ0ICsgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGwgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBldmVyeSBkZXNjZW5kYW50IG5vZGUuIGBwb3NgIHdpbGwgYmVcbiAgICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50LiBUaGUgY2FsbGJhY2sgbWF5IHJldHVyblxuICAgIGBmYWxzZWAgdG8gcHJldmVudCB0cmF2ZXJzYWwgb2YgYSBnaXZlbiBub2RlJ3MgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBkZXNjZW5kYW50cyhmKSB7XG4gICAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKDAsIHRoaXMuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dHJhY3QgdGhlIHRleHQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuIFNlZSB0aGUgc2FtZSBtZXRob2Qgb25cbiAgICBbYE5vZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS50ZXh0QmV0d2VlbikuXG4gICAgKi9cbiAgICB0ZXh0QmV0d2Vlbihmcm9tLCB0bywgYmxvY2tTZXBhcmF0b3IsIGxlYWZUZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIiwgc2VwYXJhdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLmlzVGV4dCkge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gbm9kZS50ZXh0LnNsaWNlKE1hdGgubWF4KGZyb20sIHBvcykgLSBwb3MsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgICAgICBzZXBhcmF0ZWQgPSAhYmxvY2tTZXBhcmF0b3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLmlzTGVhZikge1xuICAgICAgICAgICAgICAgIGlmIChsZWFmVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHR5cGVvZiBsZWFmVGV4dCA9PT0gXCJmdW5jdGlvblwiID8gbGVhZlRleHQobm9kZSkgOiBsZWFmVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlLnNwZWMubGVhZlRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBub2RlLnR5cGUuc3BlYy5sZWFmVGV4dChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VwYXJhdGVkID0gIWJsb2NrU2VwYXJhdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXNlcGFyYXRlZCAmJiBub2RlLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgIHNlcGFyYXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGNvbWJpbmVkIGNvbnRlbnQgb2YgdGhpc1xuICAgIGZyYWdtZW50IGFuZCB0aGUgb3RoZXIuXG4gICAgKi9cbiAgICBhcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlci5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubGFzdENoaWxkLCBmaXJzdCA9IG90aGVyLmZpcnN0Q2hpbGQsIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKSwgaSA9IDA7XG4gICAgICAgIGlmIChsYXN0LmlzVGV4dCAmJiBsYXN0LnNhbWVNYXJrdXAoZmlyc3QpKSB7XG4gICAgICAgICAgICBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV0gPSBsYXN0LndpdGhUZXh0KGxhc3QudGV4dCArIGZpcnN0LnRleHQpO1xuICAgICAgICAgICAgaSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPCBvdGhlci5jb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgY29udGVudC5wdXNoKG90aGVyLmNvbnRlbnRbaV0pO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvbnRlbnQsIHRoaXMuc2l6ZSArIG90aGVyLnNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDdXQgb3V0IHRoZSBzdWItZnJhZ21lbnQgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuc2l6ZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHNpemUgPSAwO1xuICAgICAgICBpZiAodG8gPiBmcm9tKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sIGVuZCA9IHBvcyArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tIHx8IGVuZCA+IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KE1hdGgubWF4KDAsIGZyb20gLSBwb3MpLCBNYXRoLm1pbihjaGlsZC50ZXh0Lmxlbmd0aCwgdG8gLSBwb3MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmN1dChNYXRoLm1heCgwLCBmcm9tIC0gcG9zIC0gMSksIE1hdGgubWluKGNoaWxkLmNvbnRlbnQuc2l6ZSwgdG8gLSBwb3MgLSAxKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBzaXplICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQocmVzdWx0LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjdXRCeUluZGV4KGZyb20sIHRvKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuY29udGVudC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudCh0aGlzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGluIHdoaWNoIHRoZSBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCBpc1xuICAgIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBub2RlLlxuICAgICovXG4gICAgcmVwbGFjZUNoaWxkKGluZGV4LCBub2RlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5jb250ZW50W2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbm9kZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY29weSA9IHRoaXMuY29udGVudC5zbGljZSgpO1xuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUgLSBjdXJyZW50Lm5vZGVTaXplO1xuICAgICAgICBjb3B5W2luZGV4XSA9IG5vZGU7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29weSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBwcmVwZW5kaW5nIHRoZSBnaXZlbiBub2RlIHRvIHRoaXNcbiAgICBmcmFnbWVudC5cbiAgICAqL1xuICAgIGFkZFRvU3RhcnQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2RlXS5jb25jYXQodGhpcy5jb250ZW50KSwgdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIG5vZGUgdG8gdGhpc1xuICAgIGZyYWdtZW50LlxuICAgICovXG4gICAgYWRkVG9FbmQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHRoaXMuY29udGVudC5jb25jYXQobm9kZSksIHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgZnJhZ21lbnQgdG8gYW5vdGhlciBvbmUuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aCAhPSBvdGhlci5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFtpXS5lcShvdGhlci5jb250ZW50W2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIGxhc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBpbiB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleC4gUmFpc2UgYW4gZXJyb3Igd2hlbiB0aGVcbiAgICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgKi9cbiAgICBjaGlsZChpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLmNvbnRlbnRbaW5kZXhdO1xuICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBcIiArIGluZGV4ICsgXCIgb3V0IG9mIHJhbmdlIGZvciBcIiArIHRoaXMpO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGl0IGV4aXN0cy5cbiAgICAqL1xuICAgIG1heWJlQ2hpbGQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFtpbmRleF0gfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV07XG4gICAgICAgICAgICBmKGNoaWxkLCBwLCBpKTtcbiAgICAgICAgICAgIHAgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhpcyBmcmFnbWVudCBhbmQgYW5vdGhlclxuICAgIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICovXG4gICAgZmluZERpZmZTdGFydChvdGhlciwgcG9zID0gMCkge1xuICAgICAgICByZXR1cm4gZmluZERpZmZTdGFydCh0aGlzLCBvdGhlciwgcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24sIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQsIGF0IHdoaWNoIHRoaXNcbiAgICBmcmFnbWVudCBhbmQgdGhlIGdpdmVuIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlXG4gICAgdGhlIHNhbWUuIFNpbmNlIHRoaXMgcG9zaXRpb24gd2lsbCBub3QgYmUgdGhlIHNhbWUgaW4gYm90aFxuICAgIG5vZGVzLCBhbiBvYmplY3Qgd2l0aCB0d28gc2VwYXJhdGUgcG9zaXRpb25zIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZmluZERpZmZFbmQob3RoZXIsIHBvcyA9IHRoaXMuc2l6ZSwgb3RoZXJQb3MgPSBvdGhlci5zaXplKSB7XG4gICAgICAgIHJldHVybiBmaW5kRGlmZkVuZCh0aGlzLCBvdGhlciwgcG9zLCBvdGhlclBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGV4IGFuZCBpbm5lciBvZmZzZXQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHJlbGF0aXZlXG4gICAgcG9zaXRpb24gaW4gdGhpcyBmcmFnbWVudC4gVGhlIHJlc3VsdCBvYmplY3Qgd2lsbCBiZSByZXVzZWRcbiAgICAob3ZlcndyaXR0ZW4pIHRoZSBuZXh0IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gKE5vdCBwdWJsaWMuKVxuICAgICovXG4gICAgZmluZEluZGV4KHBvcywgcm91bmQgPSAtMSkge1xuICAgICAgICBpZiAocG9zID09IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoMCwgcG9zKTtcbiAgICAgICAgaWYgKHBvcyA9PSB0aGlzLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgodGhpcy5jb250ZW50Lmxlbmd0aCwgcG9zKTtcbiAgICAgICAgaWYgKHBvcyA+IHRoaXMuc2l6ZSB8fCBwb3MgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBvc2l0aW9uICR7cG9zfSBvdXRzaWRlIG9mIGZyYWdtZW50ICgke3RoaXN9KWApO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgY3VyUG9zID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHRoaXMuY2hpbGQoaSksIGVuZCA9IGN1clBvcyArIGN1ci5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBwb3MgfHwgcm91bmQgPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoaSArIDEsIGVuZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KGksIGN1clBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZGVidWdnaW5nIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBcIjxcIiArIHRoaXMudG9TdHJpbmdJbm5lcigpICsgXCI+XCI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nSW5uZXIoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuam9pbihcIiwgXCIpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50Lm1hcChuID0+IG4udG9KU09OKCkpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBmcmFnbWVudCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRnJhZ21lbnQuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQodmFsdWUubWFwKHNjaGVtYS5ub2RlRnJvbUpTT04pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBmcmFnbWVudCBmcm9tIGFuIGFycmF5IG9mIG5vZGVzLiBFbnN1cmVzIHRoYXQgYWRqYWNlbnRcbiAgICB0ZXh0IG5vZGVzIHdpdGggdGhlIHNhbWUgbWFya3MgYXJlIGpvaW5lZCB0b2dldGhlci5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQXJyYXkoYXJyYXkpIHtcbiAgICAgICAgaWYgKCFhcnJheS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGxldCBqb2luZWQsIHNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGFycmF5W2ldO1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGkgJiYgbm9kZS5pc1RleHQgJiYgYXJyYXlbaSAtIDFdLnNhbWVNYXJrdXAobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW5lZClcbiAgICAgICAgICAgICAgICAgICAgam9pbmVkID0gYXJyYXkuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgam9pbmVkW2pvaW5lZC5sZW5ndGggLSAxXSA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUZXh0KGpvaW5lZFtqb2luZWQubGVuZ3RoIC0gMV0udGV4dCArIG5vZGUudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChqb2luZWQpIHtcbiAgICAgICAgICAgICAgICBqb2luZWQucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGpvaW5lZCB8fCBhcnJheSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGZyYWdtZW50IGZyb20gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGFcbiAgICBzZXQgb2Ygbm9kZXMuIEZvciBgbnVsbGAsIGl0IHJldHVybnMgdGhlIGVtcHR5IGZyYWdtZW50LiBGb3IgYVxuICAgIGZyYWdtZW50LCB0aGUgZnJhZ21lbnQgaXRzZWxmLiBGb3IgYSBub2RlIG9yIGFycmF5IG9mIG5vZGVzLCBhXG4gICAgZnJhZ21lbnQgY29udGFpbmluZyB0aG9zZSBub2Rlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG5vZGVzKSB7XG4gICAgICAgIGlmICghbm9kZXMpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGlmIChub2RlcyBpbnN0YW5jZW9mIEZyYWdtZW50KVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkobm9kZXMpO1xuICAgICAgICBpZiAobm9kZXMuYXR0cnMpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2Rlc10sIG5vZGVzLm5vZGVTaXplKTtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gbm90IGNvbnZlcnQgXCIgKyBub2RlcyArIFwiIHRvIGEgRnJhZ21lbnRcIiArXG4gICAgICAgICAgICAobm9kZXMubm9kZXNCZXR3ZWVuID8gXCIgKGxvb2tzIGxpa2UgbXVsdGlwbGUgdmVyc2lvbnMgb2YgcHJvc2VtaXJyb3ItbW9kZWwgd2VyZSBsb2FkZWQpXCIgOiBcIlwiKSk7XG4gICAgfVxufVxuLyoqXG5BbiBlbXB0eSBmcmFnbWVudC4gSW50ZW5kZWQgdG8gYmUgcmV1c2VkIHdoZW5ldmVyIGEgbm9kZSBkb2Vzbid0XG5jb250YWluIGFueXRoaW5nIChyYXRoZXIgdGhhbiBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGZyYWdtZW50IGZvclxuZWFjaCBsZWFmIG5vZGUpLlxuKi9cbkZyYWdtZW50LmVtcHR5ID0gbmV3IEZyYWdtZW50KFtdLCAwKTtcbmNvbnN0IGZvdW5kID0geyBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG5mdW5jdGlvbiByZXRJbmRleChpbmRleCwgb2Zmc2V0KSB7XG4gICAgZm91bmQuaW5kZXggPSBpbmRleDtcbiAgICBmb3VuZC5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlRGVlcChhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKGEgJiYgdHlwZW9mIGEgPT0gXCJvYmplY3RcIikgfHxcbiAgICAgICAgIShiICYmIHR5cGVvZiBiID09IFwib2JqZWN0XCIpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiKSAhPSBhcnJheSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghY29tcGFyZURlZXAoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICAgICAgaWYgKCEocCBpbiBiKSB8fCAhY29tcGFyZURlZXAoYVtwXSwgYltwXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgICAgICBpZiAoIShwIGluIGEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuQSBtYXJrIGlzIGEgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBub2RlLFxuc3VjaCBhcyBpdCBiZWluZyBlbXBoYXNpemVkLCBpbiBjb2RlIGZvbnQsIG9yIGEgbGluay4gSXQgaGFzIGFcbnR5cGUgYW5kIG9wdGlvbmFsbHkgYSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgZnVydGhlclxuaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHRhcmdldCBvZiB0aGUgbGluaykuIE1hcmtzIGFyZSBjcmVhdGVkXG50aHJvdWdoIGEgYFNjaGVtYWAsIHdoaWNoIGNvbnRyb2xzIHdoaWNoIHR5cGVzIGV4aXN0IGFuZCB3aGljaFxuYXR0cmlidXRlcyB0aGV5IGhhdmUuXG4qL1xuY2xhc3MgTWFyayB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0aGlzIG1hcmsuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXJrLlxuICAgICovXG4gICAgYXR0cnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgIH1cbiAgICAvKipcbiAgICBHaXZlbiBhIHNldCBvZiBtYXJrcywgY3JlYXRlIGEgbmV3IHNldCB3aGljaCBjb250YWlucyB0aGlzIG9uZSBhc1xuICAgIHdlbGwsIGluIHRoZSByaWdodCBwb3NpdGlvbi4gSWYgdGhpcyBtYXJrIGlzIGFscmVhZHkgaW4gdGhlIHNldCxcbiAgICB0aGUgc2V0IGl0c2VsZiBpcyByZXR1cm5lZC4gSWYgYW55IG1hcmtzIHRoYXQgYXJlIHNldCB0byBiZVxuICAgIFtleGNsdXNpdmVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5leGNsdWRlcykgd2l0aCB0aGlzIG1hcmsgYXJlIHByZXNlbnQsXG4gICAgdGhvc2UgYXJlIHJlcGxhY2VkIGJ5IHRoaXMgb25lLlxuICAgICovXG4gICAgYWRkVG9TZXQoc2V0KSB7XG4gICAgICAgIGxldCBjb3B5LCBwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvdGhlciA9IHNldFtpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKG90aGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZS5leGNsdWRlcyhvdGhlci50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IHNldC5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG90aGVyLnR5cGUuZXhjbHVkZXModGhpcy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBsYWNlZCAmJiBvdGhlci50eXBlLnJhbmsgPiB0aGlzLnR5cGUucmFuaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gc2V0LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2gob3RoZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgIGNvcHkgPSBzZXQuc2xpY2UoKTtcbiAgICAgICAgaWYgKCFwbGFjZWQpXG4gICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmUgdGhpcyBtYXJrIGZyb20gdGhlIGdpdmVuIHNldCwgcmV0dXJuaW5nIGEgbmV3IHNldC4gSWYgdGhpc1xuICAgIG1hcmsgaXMgbm90IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodGhpcy5lcShzZXRbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGlzIGluIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKHNldFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoaXMgbWFyayBoYXMgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlcyBhc1xuICAgIGFub3RoZXIgbWFyay5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAodGhpcy50eXBlID09IG90aGVyLnR5cGUgJiYgY29tcGFyZURlZXAodGhpcy5hdHRycywgb3RoZXIuYXR0cnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIG1hcmsgdG8gYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIEpTT04uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgTWFyay5mcm9tSlNPTlwiKTtcbiAgICAgICAgbGV0IHR5cGUgPSBzY2hlbWEubWFya3NbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZXJlIGlzIG5vIG1hcmsgdHlwZSAke2pzb24udHlwZX0gaW4gdGhpcyBzY2hlbWFgKTtcbiAgICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlKGpzb24uYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdHdvIHNldHMgb2YgbWFya3MgYXJlIGlkZW50aWNhbC5cbiAgICAqL1xuICAgIHN0YXRpYyBzYW1lU2V0KGEsIGIpIHtcbiAgICAgICAgaWYgKGEgPT0gYilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwcm9wZXJseSBzb3J0ZWQgbWFyayBzZXQgZnJvbSBudWxsLCBhIHNpbmdsZSBtYXJrLCBvciBhblxuICAgIHVuc29ydGVkIGFycmF5IG9mIG1hcmtzLlxuICAgICovXG4gICAgc3RhdGljIHNldEZyb20obWFya3MpIHtcbiAgICAgICAgaWYgKCFtYXJrcyB8fCBBcnJheS5pc0FycmF5KG1hcmtzKSAmJiBtYXJrcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIGlmIChtYXJrcyBpbnN0YW5jZW9mIE1hcmspXG4gICAgICAgICAgICByZXR1cm4gW21hcmtzXTtcbiAgICAgICAgbGV0IGNvcHkgPSBtYXJrcy5zbGljZSgpO1xuICAgICAgICBjb3B5LnNvcnQoKGEsIGIpID0+IGEudHlwZS5yYW5rIC0gYi50eXBlLnJhbmspO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgbWFya3MuXG4qL1xuTWFyay5ub25lID0gW107XG5cbi8qKlxuRXJyb3IgdHlwZSByYWlzZWQgYnkgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aGVuXG5naXZlbiBhbiBpbnZhbGlkIHJlcGxhY2VtZW50LlxuKi9cbmNsYXNzIFJlcGxhY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qXG5SZXBsYWNlRXJyb3IgPSBmdW5jdGlvbih0aGlzOiBhbnksIG1lc3NhZ2U6IHN0cmluZykge1xuICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKVxuICA7KGVyciBhcyBhbnkpLl9fcHJvdG9fXyA9IFJlcGxhY2VFcnJvci5wcm90b3R5cGVcbiAgcmV0dXJuIGVyclxufSBhcyBhbnlcblxuUmVwbGFjZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlcGxhY2VFcnJvclxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJSZXBsYWNlRXJyb3JcIlxuKi9cbi8qKlxuQSBzbGljZSByZXByZXNlbnRzIGEgcGllY2UgY3V0IG91dCBvZiBhIGxhcmdlciBkb2N1bWVudC4gSXRcbnN0b3JlcyBub3Qgb25seSBhIGZyYWdtZW50LCBidXQgYWxzbyB0aGUgZGVwdGggdXAgdG8gd2hpY2ggbm9kZXMgb25cbmJvdGggc2lkZSBhcmUgXHUyMDE4b3Blblx1MjAxOSAoY3V0IHRocm91Z2gpLlxuKi9cbmNsYXNzIFNsaWNlIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzbGljZS4gV2hlbiBzcGVjaWZ5aW5nIGEgbm9uLXplcm8gb3BlbiBkZXB0aCwgeW91IG11c3RcbiAgICBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm9kZXMgb2YgYXQgbGVhc3QgdGhhdCBkZXB0aCBhdCB0aGVcbiAgICBhcHByb3ByaWF0ZSBzaWRlIG9mIHRoZSBmcmFnbWVudFx1MjAxNGkuZS4gaWYgdGhlIGZyYWdtZW50IGlzIGFuXG4gICAgZW1wdHkgcGFyYWdyYXBoIG5vZGUsIGBvcGVuU3RhcnRgIGFuZCBgb3BlbkVuZGAgY2FuJ3QgYmUgZ3JlYXRlclxuICAgIHRoYW4gMS5cbiAgICBcbiAgICBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgY29udGVudCBvZiBvcGVuIG5vZGVzIHRvIGNvbmZvcm0gdG9cbiAgICB0aGUgc2NoZW1hJ3MgY29udGVudCBjb25zdHJhaW50cywgdGhvdWdoIGl0IHNob3VsZCBiZSBhIHZhbGlkXG4gICAgc3RhcnQvZW5kL21pZGRsZSBmb3Igc3VjaCBhIG5vZGUsIGRlcGVuZGluZyBvbiB3aGljaCBzaWRlcyBhcmVcbiAgICBvcGVuLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHNsaWNlJ3MgY29udGVudC5cbiAgICAqL1xuICAgIGNvbnRlbnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBvcGVuU3RhcnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBlbmQuXG4gICAgKi9cbiAgICBvcGVuRW5kKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSBvcGVuRW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSB0aGlzIHNsaWNlIHdvdWxkIGFkZCB3aGVuIGluc2VydGVkIGludG8gYSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnNpemUgLSB0aGlzLm9wZW5TdGFydCAtIHRoaXMub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRBdChwb3MsIGZyYWdtZW50KSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gaW5zZXJ0SW50byh0aGlzLmNvbnRlbnQsIHBvcyArIHRoaXMub3BlblN0YXJ0LCBmcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBjb250ZW50ICYmIG5ldyBTbGljZShjb250ZW50LCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZW1vdmVCZXR3ZWVuKGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UocmVtb3ZlUmFuZ2UodGhpcy5jb250ZW50LCBmcm9tICsgdGhpcy5vcGVuU3RhcnQsIHRvICsgdGhpcy5vcGVuU3RhcnQpLCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGlzIHNsaWNlIGlzIGVxdWFsIHRvIGFub3RoZXIgc2xpY2UuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpICYmIHRoaXMub3BlblN0YXJ0ID09IG90aGVyLm9wZW5TdGFydCAmJiB0aGlzLm9wZW5FbmQgPT0gb3RoZXIub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudCArIFwiKFwiICsgdGhpcy5vcGVuU3RhcnQgKyBcIixcIiArIHRoaXMub3BlbkVuZCArIFwiKVwiO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgc2xpY2UgdG8gYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQganNvbiA9IHsgY29udGVudDogdGhpcy5jb250ZW50LnRvSlNPTigpIH07XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA+IDApXG4gICAgICAgICAgICBqc29uLm9wZW5TdGFydCA9IHRoaXMub3BlblN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5vcGVuRW5kID4gMClcbiAgICAgICAgICAgIGpzb24ub3BlbkVuZCA9IHRoaXMub3BlbkVuZDtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgc2xpY2UgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0ganNvbi5vcGVuU3RhcnQgfHwgMCwgb3BlbkVuZCA9IGpzb24ub3BlbkVuZCB8fCAwO1xuICAgICAgICBpZiAodHlwZW9mIG9wZW5TdGFydCAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBvcGVuRW5kICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFNsaWNlLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2xpY2UgZnJvbSBhIGZyYWdtZW50IGJ5IHRha2luZyB0aGUgbWF4aW11bSBwb3NzaWJsZVxuICAgIG9wZW4gdmFsdWUgb24gYm90aCBzaWRlIG9mIHRoZSBmcmFnbWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXhPcGVuKGZyYWdtZW50LCBvcGVuSXNvbGF0aW5nID0gdHJ1ZSkge1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0gMCwgb3BlbkVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IG4gPSBmcmFnbWVudC5maXJzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIG9wZW5TdGFydCsrO1xuICAgICAgICBmb3IgKGxldCBuID0gZnJhZ21lbnQubGFzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4ubGFzdENoaWxkKVxuICAgICAgICAgICAgb3BlbkVuZCsrO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGZyYWdtZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNsaWNlLlxuKi9cblNsaWNlLmVtcHR5ID0gbmV3IFNsaWNlKEZyYWdtZW50LmVtcHR5LCAwLCAwKTtcbmZ1bmN0aW9uIHJlbW92ZVJhbmdlKGNvbnRlbnQsIGZyb20sIHRvKSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZnJvbSksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBsZXQgeyBpbmRleDogaW5kZXhUbywgb2Zmc2V0OiBvZmZzZXRUbyB9ID0gY29udGVudC5maW5kSW5kZXgodG8pO1xuICAgIGlmIChvZmZzZXQgPT0gZnJvbSB8fCBjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgaWYgKG9mZnNldFRvICE9IHRvICYmICFjb250ZW50LmNoaWxkKGluZGV4VG8pLmlzVGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBjb250ZW50LmN1dCgwLCBmcm9tKS5hcHBlbmQoY29udGVudC5jdXQodG8pKTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9IGluZGV4VG8pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBjaGlsZC5jb3B5KHJlbW92ZVJhbmdlKGNoaWxkLmNvbnRlbnQsIGZyb20gLSBvZmZzZXQgLSAxLCB0byAtIG9mZnNldCAtIDEpKSk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbnRvKGNvbnRlbnQsIGRpc3QsIGluc2VydCwgcGFyZW50KSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZGlzdCksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBpZiAob2Zmc2V0ID09IGRpc3QgfHwgY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5jYW5SZXBsYWNlKGluZGV4LCBpbmRleCwgaW5zZXJ0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gY29udGVudC5jdXQoMCwgZGlzdCkuYXBwZW5kKGluc2VydCkuYXBwZW5kKGNvbnRlbnQuY3V0KGRpc3QpKTtcbiAgICB9XG4gICAgbGV0IGlubmVyID0gaW5zZXJ0SW50byhjaGlsZC5jb250ZW50LCBkaXN0IC0gb2Zmc2V0IC0gMSwgaW5zZXJ0KTtcbiAgICByZXR1cm4gaW5uZXIgJiYgY29udGVudC5yZXBsYWNlQ2hpbGQoaW5kZXgsIGNoaWxkLmNvcHkoaW5uZXIpKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2UoJGZyb20sICR0bywgc2xpY2UpIHtcbiAgICBpZiAoc2xpY2Uub3BlblN0YXJ0ID4gJGZyb20uZGVwdGgpXG4gICAgICAgIHRocm93IG5ldyBSZXBsYWNlRXJyb3IoXCJJbnNlcnRlZCBjb250ZW50IGRlZXBlciB0aGFuIGluc2VydGlvbiBwb3NpdGlvblwiKTtcbiAgICBpZiAoJGZyb20uZGVwdGggLSBzbGljZS5vcGVuU3RhcnQgIT0gJHRvLmRlcHRoIC0gc2xpY2Uub3BlbkVuZClcbiAgICAgICAgdGhyb3cgbmV3IFJlcGxhY2VFcnJvcihcIkluY29uc2lzdGVudCBvcGVuIGRlcHRoc1wiKTtcbiAgICByZXR1cm4gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCAwKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGgpIHtcbiAgICBsZXQgaW5kZXggPSAkZnJvbS5pbmRleChkZXB0aCksIG5vZGUgPSAkZnJvbS5ub2RlKGRlcHRoKTtcbiAgICBpZiAoaW5kZXggPT0gJHRvLmluZGV4KGRlcHRoKSAmJiBkZXB0aCA8ICRmcm9tLmRlcHRoIC0gc2xpY2Uub3BlblN0YXJ0KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGggKyAxKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuY29weShub2RlLmNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBpbm5lcikpO1xuICAgIH1cbiAgICBlbHNlIGlmICghc2xpY2UuY29udGVudC5zaXplKSB7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFzbGljZS5vcGVuU3RhcnQgJiYgIXNsaWNlLm9wZW5FbmQgJiYgJGZyb20uZGVwdGggPT0gZGVwdGggJiYgJHRvLmRlcHRoID09IGRlcHRoKSB7IC8vIFNpbXBsZSwgZmxhdCBjYXNlXG4gICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5wYXJlbnQsIGNvbnRlbnQgPSBwYXJlbnQuY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNsb3NlKHBhcmVudCwgY29udGVudC5jdXQoMCwgJGZyb20ucGFyZW50T2Zmc2V0KS5hcHBlbmQoc2xpY2UuY29udGVudCkuYXBwZW5kKGNvbnRlbnQuY3V0KCR0by5wYXJlbnRPZmZzZXQpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBwcmVwYXJlU2xpY2VGb3JSZXBsYWNlKHNsaWNlLCAkZnJvbSk7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVGhyZWVXYXkoJGZyb20sIHN0YXJ0LCBlbmQsICR0bywgZGVwdGgpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0pvaW4obWFpbiwgc3ViKSB7XG4gICAgaWYgKCFzdWIudHlwZS5jb21wYXRpYmxlQ29udGVudChtYWluLnR5cGUpKVxuICAgICAgICB0aHJvdyBuZXcgUmVwbGFjZUVycm9yKFwiQ2Fubm90IGpvaW4gXCIgKyBzdWIudHlwZS5uYW1lICsgXCIgb250byBcIiArIG1haW4udHlwZS5uYW1lKTtcbn1cbmZ1bmN0aW9uIGpvaW5hYmxlKCRiZWZvcmUsICRhZnRlciwgZGVwdGgpIHtcbiAgICBsZXQgbm9kZSA9ICRiZWZvcmUubm9kZShkZXB0aCk7XG4gICAgY2hlY2tKb2luKG5vZGUsICRhZnRlci5ub2RlKGRlcHRoKSk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBhZGROb2RlKGNoaWxkLCB0YXJnZXQpIHtcbiAgICBsZXQgbGFzdCA9IHRhcmdldC5sZW5ndGggLSAxO1xuICAgIGlmIChsYXN0ID49IDAgJiYgY2hpbGQuaXNUZXh0ICYmIGNoaWxkLnNhbWVNYXJrdXAodGFyZ2V0W2xhc3RdKSlcbiAgICAgICAgdGFyZ2V0W2xhc3RdID0gY2hpbGQud2l0aFRleHQodGFyZ2V0W2xhc3RdLnRleHQgKyBjaGlsZC50ZXh0KTtcbiAgICBlbHNlXG4gICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFkZFJhbmdlKCRzdGFydCwgJGVuZCwgZGVwdGgsIHRhcmdldCkge1xuICAgIGxldCBub2RlID0gKCRlbmQgfHwgJHN0YXJ0KS5ub2RlKGRlcHRoKTtcbiAgICBsZXQgc3RhcnRJbmRleCA9IDAsIGVuZEluZGV4ID0gJGVuZCA/ICRlbmQuaW5kZXgoZGVwdGgpIDogbm9kZS5jaGlsZENvdW50O1xuICAgIGlmICgkc3RhcnQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9ICRzdGFydC5pbmRleChkZXB0aCk7XG4gICAgICAgIGlmICgkc3RhcnQuZGVwdGggPiBkZXB0aCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCRzdGFydC50ZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICBhZGROb2RlKCRzdGFydC5ub2RlQWZ0ZXIsIHRhcmdldCk7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKVxuICAgICAgICBhZGROb2RlKG5vZGUuY2hpbGQoaSksIHRhcmdldCk7XG4gICAgaWYgKCRlbmQgJiYgJGVuZC5kZXB0aCA9PSBkZXB0aCAmJiAkZW5kLnRleHRPZmZzZXQpXG4gICAgICAgIGFkZE5vZGUoJGVuZC5ub2RlQmVmb3JlLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gY2xvc2Uobm9kZSwgY29udGVudCkge1xuICAgIG5vZGUudHlwZS5jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgcmV0dXJuIG5vZGUuY29weShjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgJHN0YXJ0LCAkZW5kLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IG9wZW5TdGFydCA9ICRmcm9tLmRlcHRoID4gZGVwdGggJiYgam9pbmFibGUoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKTtcbiAgICBsZXQgb3BlbkVuZCA9ICR0by5kZXB0aCA+IGRlcHRoICYmIGpvaW5hYmxlKCRlbmQsICR0bywgZGVwdGggKyAxKTtcbiAgICBsZXQgY29udGVudCA9IFtdO1xuICAgIGFkZFJhbmdlKG51bGwsICRmcm9tLCBkZXB0aCwgY29udGVudCk7XG4gICAgaWYgKG9wZW5TdGFydCAmJiBvcGVuRW5kICYmICRzdGFydC5pbmRleChkZXB0aCkgPT0gJGVuZC5pbmRleChkZXB0aCkpIHtcbiAgICAgICAgY2hlY2tKb2luKG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIGFkZE5vZGUoY2xvc2Uob3BlblN0YXJ0LCByZXBsYWNlVGhyZWVXYXkoJGZyb20sICRzdGFydCwgJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAob3BlblN0YXJ0KVxuICAgICAgICAgICAgYWRkTm9kZShjbG9zZShvcGVuU3RhcnQsIHJlcGxhY2VUd29XYXkoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgICAgICBhZGRSYW5nZSgkc3RhcnQsICRlbmQsIGRlcHRoLCBjb250ZW50KTtcbiAgICAgICAgaWYgKG9wZW5FbmQpXG4gICAgICAgICAgICBhZGROb2RlKGNsb3NlKG9wZW5FbmQsIHJlcGxhY2VUd29XYXkoJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGFkZFJhbmdlKCR0bywgbnVsbCwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29udGVudCk7XG59XG5mdW5jdGlvbiByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXTtcbiAgICBhZGRSYW5nZShudWxsLCAkZnJvbSwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIGlmICgkZnJvbS5kZXB0aCA+IGRlcHRoKSB7XG4gICAgICAgIGxldCB0eXBlID0gam9pbmFibGUoJGZyb20sICR0bywgZGVwdGggKyAxKTtcbiAgICAgICAgYWRkTm9kZShjbG9zZSh0eXBlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgYWRkUmFuZ2UoJHRvLCBudWxsLCBkZXB0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTbGljZUZvclJlcGxhY2Uoc2xpY2UsICRhbG9uZykge1xuICAgIGxldCBleHRyYSA9ICRhbG9uZy5kZXB0aCAtIHNsaWNlLm9wZW5TdGFydCwgcGFyZW50ID0gJGFsb25nLm5vZGUoZXh0cmEpO1xuICAgIGxldCBub2RlID0gcGFyZW50LmNvcHkoc2xpY2UuY29udGVudCk7XG4gICAgZm9yIChsZXQgaSA9IGV4dHJhIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIG5vZGUgPSAkYWxvbmcubm9kZShpKS5jb3B5KEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiB7IHN0YXJ0OiBub2RlLnJlc29sdmVOb0NhY2hlKHNsaWNlLm9wZW5TdGFydCArIGV4dHJhKSxcbiAgICAgICAgZW5kOiBub2RlLnJlc29sdmVOb0NhY2hlKG5vZGUuY29udGVudC5zaXplIC0gc2xpY2Uub3BlbkVuZCAtIGV4dHJhKSB9O1xufVxuXG4vKipcbllvdSBjYW4gW19yZXNvbHZlX10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUucmVzb2x2ZSkgYSBwb3NpdGlvbiB0byBnZXQgbW9yZVxuaW5mb3JtYXRpb24gYWJvdXQgaXQuIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgc3VjaCBhXG5yZXNvbHZlZCBwb3NpdGlvbiwgcHJvdmlkaW5nIHZhcmlvdXMgcGllY2VzIG9mIGNvbnRleHRcbmluZm9ybWF0aW9uLCBhbmQgc29tZSBoZWxwZXIgbWV0aG9kcy5cblxuVGhyb3VnaG91dCB0aGlzIGludGVyZmFjZSwgbWV0aG9kcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgYGRlcHRoYFxucGFyYW1ldGVyIHdpbGwgaW50ZXJwcmV0IHVuZGVmaW5lZCBhcyBgdGhpcy5kZXB0aGAgYW5kIG5lZ2F0aXZlXG5udW1iZXJzIGFzIGB0aGlzLmRlcHRoICsgdmFsdWVgLlxuKi9cbmNsYXNzIFJlc29sdmVkUG9zIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiB0aGF0IHdhcyByZXNvbHZlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBwYXRoLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IHRoaXMgcG9zaXRpb24gaGFzIGludG8gaXRzIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgcGFyZW50T2Zmc2V0KSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnBhcmVudE9mZnNldCA9IHBhcmVudE9mZnNldDtcbiAgICAgICAgdGhpcy5kZXB0aCA9IHBhdGgubGVuZ3RoIC8gMyAtIDE7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZURlcHRoKHZhbCkge1xuICAgICAgICBpZiAodmFsID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aDtcbiAgICAgICAgaWYgKHZhbCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aCArIHZhbDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHBvc2l0aW9uIHBvaW50cyBpbnRvLiBOb3RlIHRoYXQgZXZlbiBpZlxuICAgIGEgcG9zaXRpb24gcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIHRoYXQgbm9kZSBpcyBub3QgY29uc2lkZXJlZFxuICAgIHRoZSBwYXJlbnRcdTIwMTR0ZXh0IG5vZGVzIGFyZSBcdTIwMThmbGF0XHUyMDE5IGluIHRoaXMgbW9kZWwsIGFuZCBoYXZlIG5vIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgcGFyZW50KCkgeyByZXR1cm4gdGhpcy5ub2RlKHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIHJvb3Qgbm9kZSBpbiB3aGljaCB0aGUgcG9zaXRpb24gd2FzIHJlc29sdmVkLlxuICAgICovXG4gICAgZ2V0IGRvYygpIHsgcmV0dXJuIHRoaXMubm9kZSgwKTsgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNlc3RvciBub2RlIGF0IHRoZSBnaXZlbiBsZXZlbC4gYHAubm9kZShwLmRlcHRoKWAgaXMgdGhlXG4gICAgc2FtZSBhcyBgcC5wYXJlbnRgLlxuICAgICovXG4gICAgbm9kZShkZXB0aCkgeyByZXR1cm4gdGhpcy5wYXRoW3RoaXMucmVzb2x2ZURlcHRoKGRlcHRoKSAqIDNdOyB9XG4gICAgLyoqXG4gICAgVGhlIGluZGV4IGludG8gdGhlIGFuY2VzdG9yIGF0IHRoZSBnaXZlbiBsZXZlbC4gSWYgdGhpcyBwb2ludHNcbiAgICBhdCB0aGUgM3JkIG5vZGUgaW4gdGhlIDJuZCBwYXJhZ3JhcGggb24gdGhlIHRvcCBsZXZlbCwgZm9yXG4gICAgZXhhbXBsZSwgYHAuaW5kZXgoMClgIGlzIDEgYW5kIGBwLmluZGV4KDEpYCBpcyAyLlxuICAgICovXG4gICAgaW5kZXgoZGVwdGgpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnJlc29sdmVEZXB0aChkZXB0aCkgKiAzICsgMV07IH1cbiAgICAvKipcbiAgICBUaGUgaW5kZXggcG9pbnRpbmcgYWZ0ZXIgdGhpcyBwb3NpdGlvbiBpbnRvIHRoZSBhbmNlc3RvciBhdCB0aGVcbiAgICBnaXZlbiBsZXZlbC5cbiAgICAqL1xuICAgIGluZGV4QWZ0ZXIoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4KGRlcHRoKSArIChkZXB0aCA9PSB0aGlzLmRlcHRoICYmICF0aGlzLnRleHRPZmZzZXQgPyAwIDogMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW5cbiAgICBsZXZlbC5cbiAgICAqL1xuICAgIHN0YXJ0KGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gMCA/IDAgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV0gKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBub2RlIGF0IHRoZSBnaXZlblxuICAgIGxldmVsLlxuICAgICovXG4gICAgZW5kKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydChkZXB0aCkgKyB0aGlzLm5vZGUoZGVwdGgpLmNvbnRlbnQuc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYmVmb3JlIHRoZSB3cmFwcGluZyBub2RlIGF0IHRoZVxuICAgIGdpdmVuIGxldmVsLCBvciwgd2hlbiBgZGVwdGhgIGlzIGB0aGlzLmRlcHRoICsgMWAsIHRoZSBvcmlnaW5hbFxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgYmVmb3JlKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBiZWZvcmUgdGhlIHRvcC1sZXZlbCBub2RlXCIpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gdGhpcy5kZXB0aCArIDEgPyB0aGlzLnBvcyA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYWZ0ZXIgdGhlIHdyYXBwaW5nIG5vZGUgYXQgdGhlXG4gICAgZ2l2ZW4gbGV2ZWwsIG9yIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiB3aGVuIGBkZXB0aGAgaXMgYHRoaXMuZGVwdGggKyAxYC5cbiAgICAqL1xuICAgIGFmdGVyKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBhZnRlciB0aGUgdG9wLWxldmVsIG5vZGVcIik7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSB0aGlzLmRlcHRoICsgMSA/IHRoaXMucG9zIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdICsgdGhpcy5wYXRoW2RlcHRoICogM10ubm9kZVNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhpcyBwb3NpdGlvbiBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgdGhpcyByZXR1cm5zIHRoZVxuICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgbm9kZS5cbiAgICBXaWxsIGJlIHplcm8gZm9yIHBvc2l0aW9ucyB0aGF0IHBvaW50IGJldHdlZW4gbm9kZXMuXG4gICAgKi9cbiAgICBnZXQgdGV4dE9mZnNldCgpIHsgcmV0dXJuIHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBhZnRlciB0aGUgcG9zaXRpb24sIGlmIGFueS4gSWYgdGhlIHBvc2l0aW9uXG4gICAgcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgb2YgdGhhdCBub2RlIGFmdGVyIHRoZVxuICAgIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZ2V0IG5vZGVBZnRlcigpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50LCBpbmRleCA9IHRoaXMuaW5kZXgodGhpcy5kZXB0aCk7XG4gICAgICAgIGlmIChpbmRleCA9PSBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZE9mZiA9IHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXSwgY2hpbGQgPSBwYXJlbnQuY2hpbGQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gZE9mZiA/IHBhcmVudC5jaGlsZChpbmRleCkuY3V0KGRPZmYpIDogY2hpbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBiZWZvcmUgdGhlIHBvc2l0aW9uLCBpZiBhbnkuIElmIHRoZVxuICAgIHBvc2l0aW9uIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCBvbmx5IHRoZSBwYXJ0IG9mIHRoYXQgbm9kZVxuICAgIGJlZm9yZSB0aGUgcG9zaXRpb24gaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBnZXQgbm9kZUJlZm9yZSgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5pbmRleCh0aGlzLmRlcHRoKTtcbiAgICAgICAgbGV0IGRPZmYgPSB0aGlzLnBvcyAtIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChkT2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkKGluZGV4KS5jdXQoMCwgZE9mZik7XG4gICAgICAgIHJldHVybiBpbmRleCA9PSAwID8gbnVsbCA6IHRoaXMucGFyZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcG9zaXRpb24gYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBwYXJlbnQgbm9kZSBhdCB0aGVcbiAgICBnaXZlbiBkZXB0aCAod2hpY2ggZGVmYXVsdHMgdG8gYHRoaXMuZGVwdGhgKS5cbiAgICAqL1xuICAgIHBvc0F0SW5kZXgoaW5kZXgsIGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMucGF0aFtkZXB0aCAqIDNdLCBwb3MgPSBkZXB0aCA9PSAwID8gMCA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXSArIDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgICAgICAgIHBvcyArPSBub2RlLmNoaWxkKGkpLm5vZGVTaXplO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGF0IHRoaXMgcG9zaXRpb24sIGZhY3RvcmluZyBpbiB0aGUgc3Vycm91bmRpbmdcbiAgICBtYXJrcycgW2BpbmNsdXNpdmVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMuaW5jbHVzaXZlKSBwcm9wZXJ0eS4gSWYgdGhlXG4gICAgcG9zaXRpb24gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbm9uLWVtcHR5IG5vZGUsIHRoZSBtYXJrcyBvZiB0aGVcbiAgICBub2RlIGFmdGVyIGl0IChpZiBhbnkpIGFyZSByZXR1cm5lZC5cbiAgICAqL1xuICAgIG1hcmtzKCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQsIGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgICAvLyBJbiBhbiBlbXB0eSBwYXJlbnQsIHJldHVybiB0aGUgZW1wdHkgYXJyYXlcbiAgICAgICAgaWYgKHBhcmVudC5jb250ZW50LnNpemUgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIC8vIFdoZW4gaW5zaWRlIGEgdGV4dCBub2RlLCBqdXN0IHJldHVybiB0aGUgdGV4dCBub2RlJ3MgbWFya3NcbiAgICAgICAgaWYgKHRoaXMudGV4dE9mZnNldClcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY2hpbGQoaW5kZXgpLm1hcmtzO1xuICAgICAgICBsZXQgbWFpbiA9IHBhcmVudC5tYXliZUNoaWxkKGluZGV4IC0gMSksIG90aGVyID0gcGFyZW50Lm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAvLyBJZiB0aGUgYGFmdGVyYCBmbGFnIGlzIHRydWUgb2YgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUsIG1ha2VcbiAgICAgICAgLy8gdGhlIG5vZGUgYWZ0ZXIgdGhpcyBwb3NpdGlvbiB0aGUgbWFpbiByZWZlcmVuY2UuXG4gICAgICAgIGlmICghbWFpbikge1xuICAgICAgICAgICAgbGV0IHRtcCA9IG1haW47XG4gICAgICAgICAgICBtYWluID0gb3RoZXI7XG4gICAgICAgICAgICBvdGhlciA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgYWxsIG1hcmtzIGluIHRoZSBtYWluIG5vZGUsIGV4Y2VwdCB0aG9zZSB0aGF0IGhhdmVcbiAgICAgICAgLy8gYGluY2x1c2l2ZWAgc2V0IHRvIGZhbHNlIGFuZCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG90aGVyIG5vZGUuXG4gICAgICAgIGxldCBtYXJrcyA9IG1haW4ubWFya3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFvdGhlciB8fCAhbWFya3NbaV0uaXNJblNldChvdGhlci5tYXJrcykpKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3NbaS0tXS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpZiBhbnksIGV4Y2VwdCB0aG9zZVxuICAgIHRoYXQgYXJlIG5vbi1pbmNsdXNpdmUgYW5kIG5vdCBwcmVzZW50IGF0IHBvc2l0aW9uIGAkZW5kYC4gVGhpc1xuICAgIGlzIG1vc3RseSB1c2VmdWwgZm9yIGdldHRpbmcgdGhlIHNldCBvZiBtYXJrcyB0byBwcmVzZXJ2ZSBhZnRlciBhXG4gICAgZGVsZXRpb24uIFdpbGwgcmV0dXJuIGBudWxsYCBpZiB0aGlzIHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2ZcbiAgICBpdHMgcGFyZW50IG5vZGUgb3IgaXRzIHBhcmVudCBub2RlIGlzbid0IGEgdGV4dGJsb2NrIChpbiB3aGljaFxuICAgIGNhc2Ugbm8gbWFya3Mgc2hvdWxkIGJlIHByZXNlcnZlZCkuXG4gICAgKi9cbiAgICBtYXJrc0Fjcm9zcygkZW5kKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMucGFyZW50Lm1heWJlQ2hpbGQodGhpcy5pbmRleCgpKTtcbiAgICAgICAgaWYgKCFhZnRlciB8fCAhYWZ0ZXIuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG1hcmtzID0gYWZ0ZXIubWFya3MsIG5leHQgPSAkZW5kLnBhcmVudC5tYXliZUNoaWxkKCRlbmQuaW5kZXgoKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFuZXh0IHx8ICFtYXJrc1tpXS5pc0luU2V0KG5leHQubWFya3MpKSlcbiAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzW2ktLV0ucmVtb3ZlRnJvbVNldChtYXJrcyk7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIHVwIHRvIHdoaWNoIHRoaXMgcG9zaXRpb24gYW5kIHRoZSBnaXZlbiAobm9uLXJlc29sdmVkKVxuICAgIHBvc2l0aW9uIHNoYXJlIHRoZSBzYW1lIHBhcmVudCBub2Rlcy5cbiAgICAqL1xuICAgIHNoYXJlZERlcHRoKHBvcykge1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IHRoaXMuZGVwdGg7IGRlcHRoID4gMDsgZGVwdGgtLSlcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0KGRlcHRoKSA8PSBwb3MgJiYgdGhpcy5lbmQoZGVwdGgpID49IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVwdGg7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgcmFuZ2UgYmFzZWQgb24gdGhlIHBsYWNlIHdoZXJlIHRoaXMgcG9zaXRpb24gYW5kIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9uIGRpdmVyZ2UgYXJvdW5kIGJsb2NrIGNvbnRlbnQuIElmIGJvdGggcG9pbnQgaW50b1xuICAgIHRoZSBzYW1lIHRleHRibG9jaywgZm9yIGV4YW1wbGUsIGEgcmFuZ2UgYXJvdW5kIHRoYXQgdGV4dGJsb2NrXG4gICAgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhleSBwb2ludCBpbnRvIGRpZmZlcmVudCBibG9ja3MsIHRoZSByYW5nZVxuICAgIGFyb3VuZCB0aG9zZSBibG9ja3MgaW4gdGhlaXIgc2hhcmVkIGFuY2VzdG9yIGlzIHJldHVybmVkLiBZb3UgY2FuXG4gICAgcGFzcyBpbiBhbiBvcHRpb25hbCBwcmVkaWNhdGUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgcGFyZW50XG4gICAgbm9kZSB0byBzZWUgaWYgYSByYW5nZSBpbnRvIHRoYXQgcGFyZW50IGlzIGFjY2VwdGFibGUuXG4gICAgKi9cbiAgICBibG9ja1JhbmdlKG90aGVyID0gdGhpcywgcHJlZCkge1xuICAgICAgICBpZiAob3RoZXIucG9zIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICByZXR1cm4gb3RoZXIuYmxvY2tSYW5nZSh0aGlzKTtcbiAgICAgICAgZm9yIChsZXQgZCA9IHRoaXMuZGVwdGggLSAodGhpcy5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB0aGlzLnBvcyA9PSBvdGhlci5wb3MgPyAxIDogMCk7IGQgPj0gMDsgZC0tKVxuICAgICAgICAgICAgaWYgKG90aGVyLnBvcyA8PSB0aGlzLmVuZChkKSAmJiAoIXByZWQgfHwgcHJlZCh0aGlzLm5vZGUoZCkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVSYW5nZSh0aGlzLCBvdGhlciwgZCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyeSB3aGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbiBzaGFyZXMgdGhlIHNhbWUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBzYW1lUGFyZW50KG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyAtIHRoaXMucGFyZW50T2Zmc2V0ID09IG90aGVyLnBvcyAtIG90aGVyLnBhcmVudE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBncmVhdGVyIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG1heChvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIucG9zID4gdGhpcy5wb3MgPyBvdGhlciA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgc21hbGxlciBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBtaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLnBvcyA8IHRoaXMucG9zID8gb3RoZXIgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgc3RyID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdGhpcy5kZXB0aDsgaSsrKVxuICAgICAgICAgICAgc3RyICs9IChzdHIgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy5ub2RlKGkpLnR5cGUubmFtZSArIFwiX1wiICsgdGhpcy5pbmRleChpIC0gMSk7XG4gICAgICAgIHJldHVybiBzdHIgKyBcIjpcIiArIHRoaXMucGFyZW50T2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKGRvYywgcG9zKSB7XG4gICAgICAgIGlmICghKHBvcyA+PSAwICYmIHBvcyA8PSBkb2MuY29udGVudC5zaXplKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUG9zaXRpb24gXCIgKyBwb3MgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICAgIGxldCBwYXRoID0gW107XG4gICAgICAgIGxldCBzdGFydCA9IDAsIHBhcmVudE9mZnNldCA9IHBvcztcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IGRvYzs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBhcmVudE9mZnNldCk7XG4gICAgICAgICAgICBsZXQgcmVtID0gcGFyZW50T2Zmc2V0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUsIGluZGV4LCBzdGFydCArIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoIXJlbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBhcmVudE9mZnNldCA9IHJlbSAtIDE7XG4gICAgICAgICAgICBzdGFydCArPSBvZmZzZXQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQb3MocG9zLCBwYXRoLCBwYXJlbnRPZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlQ2FjaGVkKGRvYywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2FjaGVkID0gcmVzb2x2ZUNhY2hlW2ldO1xuICAgICAgICAgICAgaWYgKGNhY2hlZC5wb3MgPT0gcG9zICYmIGNhY2hlZC5kb2MgPT0gZG9jKVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc29sdmVDYWNoZVtyZXNvbHZlQ2FjaGVQb3NdID0gUmVzb2x2ZWRQb3MucmVzb2x2ZShkb2MsIHBvcyk7XG4gICAgICAgIHJlc29sdmVDYWNoZVBvcyA9IChyZXNvbHZlQ2FjaGVQb3MgKyAxKSAlIHJlc29sdmVDYWNoZVNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxubGV0IHJlc29sdmVDYWNoZSA9IFtdLCByZXNvbHZlQ2FjaGVQb3MgPSAwLCByZXNvbHZlQ2FjaGVTaXplID0gMTI7XG4vKipcblJlcHJlc2VudHMgYSBmbGF0IHJhbmdlIG9mIGNvbnRlbnQsIGkuZS4gb25lIHRoYXQgc3RhcnRzIGFuZFxuZW5kcyBpbiB0aGUgc2FtZSBub2RlLlxuKi9cbmNsYXNzIE5vZGVSYW5nZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbm9kZSByYW5nZS4gYCRmcm9tYCBhbmQgYCR0b2Agc2hvdWxkIHBvaW50IGludG8gdGhlXG4gICAgc2FtZSBub2RlIHVudGlsIGF0IGxlYXN0IHRoZSBnaXZlbiBgZGVwdGhgLCBzaW5jZSBhIG5vZGUgcmFuZ2VcbiAgICBkZW5vdGVzIGFuIGFkamFjZW50IHNldCBvZiBub2RlcyBpbiBhIHNpbmdsZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEEgcmVzb2x2ZWQgcG9zaXRpb24gYWxvbmcgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50LiBNYXkgaGF2ZSBhXG4gICAgYGRlcHRoYCBncmVhdGVyIHRoYW4gdGhpcyBvYmplY3QncyBgZGVwdGhgIHByb3BlcnR5LCBzaW5jZVxuICAgIHRoZXNlIGFyZSB0aGUgcG9zaXRpb25zIHRoYXQgd2VyZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHJhbmdlLFxuICAgIG5vdCByZS1yZXNvbHZlZCBwb3NpdGlvbnMgZGlyZWN0bHkgYXQgaXRzIGJvdW5kYXJpZXMuXG4gICAgKi9cbiAgICAkZnJvbSwgXG4gICAgLyoqXG4gICAgQSBwb3NpdGlvbiBhbG9uZyB0aGUgZW5kIG9mIHRoZSBjb250ZW50LiBTZWVcbiAgICBjYXZlYXQgZm9yIFtgJGZyb21gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVJhbmdlLiRmcm9tKS5cbiAgICAqL1xuICAgICR0bywgXG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIG9mIHRoZSBub2RlIHRoYXQgdGhpcyByYW5nZSBwb2ludHMgaW50by5cbiAgICAqL1xuICAgIGRlcHRoKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLiRmcm9tLmJlZm9yZSh0aGlzLmRlcHRoICsgMSk7IH1cbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy4kdG8uYWZ0ZXIodGhpcy5kZXB0aCArIDEpOyB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHJhbmdlIHBvaW50cyBpbnRvLlxuICAgICovXG4gICAgZ2V0IHBhcmVudCgpIHsgcmV0dXJuIHRoaXMuJGZyb20ubm9kZSh0aGlzLmRlcHRoKTsgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IHN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLiRmcm9tLmluZGV4KHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IGVuZEluZGV4KCkgeyByZXR1cm4gdGhpcy4kdG8uaW5kZXhBZnRlcih0aGlzLmRlcHRoKTsgfVxufVxuXG5jb25zdCBlbXB0eUF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgdHJlZSB0aGF0IG1ha2VzIHVwIGFcblByb3NlTWlycm9yIGRvY3VtZW50LiBTbyBhIGRvY3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGBOb2RlYCwgd2l0aFxuY2hpbGRyZW4gdGhhdCBhcmUgYWxzbyBpbnN0YW5jZXMgb2YgYE5vZGVgLlxuXG5Ob2RlcyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMuIEluc3RlYWQgb2YgY2hhbmdpbmcgdGhlbSwgeW91XG5jcmVhdGUgbmV3IG9uZXMgd2l0aCB0aGUgY29udGVudCB5b3Ugd2FudC4gT2xkIG9uZXMga2VlcCBwb2ludGluZ1xuYXQgdGhlIG9sZCBkb2N1bWVudCBzaGFwZS4gVGhpcyBpcyBtYWRlIGNoZWFwZXIgYnkgc2hhcmluZ1xuc3RydWN0dXJlIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGRhdGEgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2hpY2ggYVxudHJlZSBzaGFwZSBsaWtlIHRoaXMgKHdpdGhvdXQgYmFjayBwb2ludGVycykgbWFrZXMgZWFzeS5cblxuKipEbyBub3QqKiBkaXJlY3RseSBtdXRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYSBgTm9kZWAgb2JqZWN0LiBTZWVcblt0aGUgZ3VpZGVdKC9kb2NzL2d1aWRlLyNkb2MpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuKi9cbmNsYXNzIE5vZGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgaXMuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBBbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzLiBUaGUga2luZCBvZlxuICAgIGF0dHJpYnV0ZXMgYWxsb3dlZCBhbmQgcmVxdWlyZWQgYXJlXG4gICAgW2RldGVybWluZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5hdHRycykgYnkgdGhlIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIGF0dHJzLCBcbiAgICAvLyBBIGZyYWdtZW50IGhvbGRpbmcgdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICBjb250ZW50LCBcbiAgICAvKipcbiAgICBUaGUgbWFya3MgKHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQgaXMgZW1waGFzaXplZCBvciBwYXJ0IG9mIGFcbiAgICBsaW5rKSBhcHBsaWVkIHRvIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIG1hcmtzID0gTWFyay5ub25lKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50IHx8IEZyYWdtZW50LmVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSBvZiB0aGlzIG5vZGUsIGFzIGRlZmluZWQgYnkgdGhlIGludGVnZXItYmFzZWQgW2luZGV4aW5nXG4gICAgc2NoZW1lXSgvZG9jcy9ndWlkZS8jZG9jLmluZGV4aW5nKS4gRm9yIHRleHQgbm9kZXMsIHRoaXMgaXMgdGhlXG4gICAgYW1vdW50IG9mIGNoYXJhY3RlcnMuIEZvciBvdGhlciBsZWFmIG5vZGVzLCBpdCBpcyBvbmUuIEZvclxuICAgIG5vbi1sZWFmIG5vZGVzLCBpdCBpcyB0aGUgc2l6ZSBvZiB0aGUgY29udGVudCBwbHVzIHR3byAodGhlXG4gICAgc3RhcnQgYW5kIGVuZCB0b2tlbikuXG4gICAgKi9cbiAgICBnZXQgbm9kZVNpemUoKSB7IHJldHVybiB0aGlzLmlzTGVhZiA/IDEgOiAyICsgdGhpcy5jb250ZW50LnNpemU7IH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgdGhlIG5vZGUgaGFzLlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGRDb3VudDsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFJhaXNlcyBhbiBlcnJvciB3aGVuIHRoZVxuICAgIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiAgICAqL1xuICAgIGNoaWxkKGluZGV4KSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCwgaWYgaXQgZXhpc3RzLlxuICAgICovXG4gICAgbWF5YmVDaGlsZChpbmRleCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHsgdGhpcy5jb250ZW50LmZvckVhY2goZik7IH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgcmVjdXJzaXZlbHkgYmV0d2VlblxuICAgIHRoZSBnaXZlbiB0d28gcG9zaXRpb25zIHRoYXQgYXJlIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHRoaXNcbiAgICBub2RlJ3MgY29udGVudC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCB0aGUgbm9kZSwgaXRzXG4gICAgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIG5vZGUgKG1ldGhvZCByZWNlaXZlciksXG4gICAgaXRzIHBhcmVudCBub2RlLCBhbmQgaXRzIGNoaWxkIGluZGV4LiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgZmFsc2UgZm9yIGEgZ2l2ZW4gbm9kZSwgdGhhdCBub2RlJ3MgY2hpbGRyZW4gd2lsbCBub3QgYmVcbiAgICByZWN1cnNlZCBvdmVyLiBUaGUgbGFzdCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhXG4gICAgc3RhcnRpbmcgcG9zaXRpb24gdG8gY291bnQgZnJvbS5cbiAgICAqL1xuICAgIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgc3RhcnRQb3MgPSAwKSB7XG4gICAgICAgIHRoaXMuY29udGVudC5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHN0YXJ0UG9zLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgbm9kZS4gRG9lc24ndFxuICAgIGRlc2NlbmQgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgZGVzY2VuZGFudHMoZikge1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2VlbigwLCB0aGlzLmNvbnRlbnQuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbmNhdGVuYXRlcyBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgdGV4dENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0xlYWYgJiYgdGhpcy50eXBlLnNwZWMubGVhZlRleHQpXG4gICAgICAgICAgICA/IHRoaXMudHlwZS5zcGVjLmxlYWZUZXh0KHRoaXMpXG4gICAgICAgICAgICA6IHRoaXMudGV4dEJldHdlZW4oMCwgdGhpcy5jb250ZW50LnNpemUsIFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYWxsIHRleHQgYmV0d2VlbiBwb3NpdGlvbnMgYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYGJsb2NrU2VwYXJhdG9yYCBpcyBnaXZlbiwgaXQgd2lsbCBiZSBpbnNlcnRlZCB0byBzZXBhcmF0ZSB0ZXh0XG4gICAgZnJvbSBkaWZmZXJlbnQgYmxvY2sgbm9kZXMuIElmIGBsZWFmVGV4dGAgaXMgZ2l2ZW4sIGl0J2xsIGJlXG4gICAgaW5zZXJ0ZWQgZm9yIGV2ZXJ5IG5vbi10ZXh0IGxlYWYgbm9kZSBlbmNvdW50ZXJlZCwgb3RoZXJ3aXNlXG4gICAgW2BsZWFmVGV4dGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlY15sZWFmVGV4dCkgd2lsbCBiZSB1c2VkLlxuICAgICovXG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8sIGJsb2NrU2VwYXJhdG9yLCBsZWFmVGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnRleHRCZXR3ZWVuKGZyb20sIHRvLCBibG9ja1NlcGFyYXRvciwgbGVhZlRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5maXJzdENoaWxkOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxhc3RDaGlsZDsgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0d28gbm9kZXMgcmVwcmVzZW50IHRoZSBzYW1lIHBpZWNlIG9mIGRvY3VtZW50LlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgKHRoaXMuc2FtZU1hcmt1cChvdGhlcikgJiYgdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgbWFya3VwICh0eXBlLCBhdHRyaWJ1dGVzLCBhbmQgbWFya3MpIG9mIHRoaXMgbm9kZSB0b1xuICAgIHRob3NlIG9mIGFub3RoZXIuIFJldHVybnMgYHRydWVgIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSBtYXJrdXAuXG4gICAgKi9cbiAgICBzYW1lTWFya3VwKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc01hcmt1cChvdGhlci50eXBlLCBvdGhlci5hdHRycywgb3RoZXIubWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSdzIG1hcmt1cCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiB0eXBlLFxuICAgIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcy5cbiAgICAqL1xuICAgIGhhc01hcmt1cCh0eXBlLCBhdHRycywgbWFya3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlICYmXG4gICAgICAgICAgICBjb21wYXJlRGVlcCh0aGlzLmF0dHJzLCBhdHRycyB8fCB0eXBlLmRlZmF1bHRBdHRycyB8fCBlbXB0eUF0dHJzKSAmJlxuICAgICAgICAgICAgTWFyay5zYW1lU2V0KHRoaXMubWFya3MsIG1hcmtzIHx8IE1hcmsubm9uZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggdGhlIHNhbWUgbWFya3VwIGFzIHRoaXMgbm9kZSwgY29udGFpbmluZ1xuICAgIHRoZSBnaXZlbiBjb250ZW50IChvciBlbXB0eSwgaWYgbm8gY29udGVudCBpcyBnaXZlbikuXG4gICAgKi9cbiAgICBjb3B5KGNvbnRlbnQgPSBudWxsKSB7XG4gICAgICAgIGlmIChjb250ZW50ID09IHRoaXMuY29udGVudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUsIHdpdGggdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBpbnN0ZWFkXG4gICAgb2YgdGhlIG5vZGUncyBvd24gbWFya3MuXG4gICAgKi9cbiAgICBtYXJrKG1hcmtzKSB7XG4gICAgICAgIHJldHVybiBtYXJrcyA9PSB0aGlzLm1hcmtzID8gdGhpcyA6IG5ldyBOb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy5jb250ZW50LCBtYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggb25seSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9ucy4gSWYgYHRvYCBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2ZcbiAgICB0aGUgbm9kZS5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuY3V0KGZyb20sIHRvKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEN1dCBvdXQgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucywgYW5kXG4gICAgcmV0dXJuIGl0IGFzIGEgYFNsaWNlYCBvYmplY3QuXG4gICAgKi9cbiAgICBzbGljZShmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplLCBpbmNsdWRlUGFyZW50cyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgJGZyb20gPSB0aGlzLnJlc29sdmUoZnJvbSksICR0byA9IHRoaXMucmVzb2x2ZSh0byk7XG4gICAgICAgIGxldCBkZXB0aCA9IGluY2x1ZGVQYXJlbnRzID8gMCA6ICRmcm9tLnNoYXJlZERlcHRoKHRvKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gJGZyb20uc3RhcnQoZGVwdGgpLCBub2RlID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgIGxldCBjb250ZW50ID0gbm9kZS5jb250ZW50LmN1dCgkZnJvbS5wb3MgLSBzdGFydCwgJHRvLnBvcyAtIHN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShjb250ZW50LCAkZnJvbS5kZXB0aCAtIGRlcHRoLCAkdG8uZGVwdGggLSBkZXB0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucyB3aXRoXG4gICAgdGhlIGdpdmVuIHNsaWNlLiBUaGUgc2xpY2UgbXVzdCAnZml0JywgbWVhbmluZyBpdHMgb3BlbiBzaWRlc1xuICAgIG11c3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzdXJyb3VuZGluZyBjb250ZW50LCBhbmQgaXRzXG4gICAgY29udGVudCBub2RlcyBtdXN0IGJlIHZhbGlkIGNoaWxkcmVuIGZvciB0aGUgbm9kZSB0aGV5IGFyZSBwbGFjZWRcbiAgICBpbnRvLiBJZiBhbnkgb2YgdGhpcyBpcyB2aW9sYXRlZCwgYW4gZXJyb3Igb2YgdHlwZVxuICAgIFtgUmVwbGFjZUVycm9yYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlcGxhY2VFcnJvcikgaXMgdGhyb3duLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgc2xpY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2UodGhpcy5yZXNvbHZlKGZyb20pLCB0aGlzLnJlc29sdmUodG8pLCBzbGljZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIG5vZGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbm9kZUF0KHBvcykge1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdGhpczs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBvcyk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zIHx8IG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgcG9zIC09IG9mZnNldCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBhZnRlciB0aGUgZ2l2ZW4gb2Zmc2V0LCBpZiBhbnksXG4gICAgYW5kIHJldHVybiBpdCBhbG9uZyB3aXRoIGl0cyBpbmRleCBhbmQgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoaXNcbiAgICBub2RlLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHtcbiAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gdGhpcy5jb250ZW50LmZpbmRJbmRleChwb3MpO1xuICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnQubWF5YmVDaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIG9mZnNldCwgaWYgYW55LFxuICAgIGFuZCByZXR1cm4gaXQgYWxvbmcgd2l0aCBpdHMgaW5kZXggYW5kIG9mZnNldCByZWxhdGl2ZSB0byB0aGlzXG4gICAgbm9kZS5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykge1xuICAgICAgICBpZiAocG9zID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBudWxsLCBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG4gICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IHRoaXMuY29udGVudC5maW5kSW5kZXgocG9zKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IHBvcylcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudC5jaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgaW5kZXg6IGluZGV4IC0gMSwgb2Zmc2V0OiBvZmZzZXQgLSBub2RlLm5vZGVTaXplIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJlc29sdmUgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCwgcmV0dXJuaW5nIGFuXG4gICAgW29iamVjdF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlc29sdmVkUG9zKSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjb250ZXh0LlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MpIHsgcmV0dXJuIFJlc29sdmVkUG9zLnJlc29sdmVDYWNoZWQodGhpcywgcG9zKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZU5vQ2FjaGUocG9zKSB7IHJldHVybiBSZXNvbHZlZFBvcy5yZXNvbHZlKHRoaXMsIHBvcyk7IH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgYSBnaXZlbiBtYXJrIG9yIG1hcmsgdHlwZSBvY2N1cnMgaW4gdGhpcyBkb2N1bWVudFxuICAgIGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICByYW5nZUhhc01hcmsoZnJvbSwgdG8sIHR5cGUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmICh0byA+IGZyb20pXG4gICAgICAgICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAhZm91bmQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIGJsb2NrIChub24taW5saW5lIG5vZGUpXG4gICAgKi9cbiAgICBnZXQgaXNCbG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0Jsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSB0ZXh0YmxvY2sgbm9kZSwgYSBibG9jayBub2RlIHdpdGggaW5saW5lXG4gICAgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc1RleHRibG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc1RleHRibG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgYWxsb3dzIGlubGluZSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlubGluZUNvbnRlbnQoKSB7IHJldHVybiB0aGlzLnR5cGUuaW5saW5lQ29udGVudDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGlubGluZSBub2RlIChhIHRleHQgbm9kZSBvciBhIG5vZGUgdGhhdCBjYW5cbiAgICBhcHBlYXIgYW1vbmcgdGV4dCkuXG4gICAgKi9cbiAgICBnZXQgaXNJbmxpbmUoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNJbmxpbmU7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBpc1RleHQoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNUZXh0OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNMZWFmKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzTGVhZjsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGF0b20sIGkuZS4gd2hlbiBpdCBkb2VzIG5vdCBoYXZlIGRpcmVjdGx5XG4gICAgZWRpdGFibGUgY29udGVudC4gVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIGBpc0xlYWZgLCBidXQgY2FuXG4gICAgYmUgY29uZmlndXJlZCB3aXRoIHRoZSBbYGF0b21gIHByb3BlcnR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuYXRvbSlcbiAgICBvbiBhIG5vZGUncyBzcGVjICh0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBub2RlIGlzIGRpc3BsYXllZCBhc1xuICAgIGFuIHVuZWRpdGFibGUgW25vZGUgdmlld10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuTm9kZVZpZXcpKS5cbiAgICAqL1xuICAgIGdldCBpc0F0b20oKSB7IHJldHVybiB0aGlzLnR5cGUuaXNBdG9tOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBmb3IgZGVidWdnaW5nXG4gICAgcHVycG9zZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZyh0aGlzKTtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnR5cGUubmFtZTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgbmFtZSArPSBcIihcIiArIHRoaXMuY29udGVudC50b1N0cmluZ0lubmVyKCkgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb250ZW50IG1hdGNoIGluIHRoaXMgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgKi9cbiAgICBjb250ZW50TWF0Y2hBdChpbmRleCkge1xuICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCAwLCBpbmRleCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsZWQgY29udGVudE1hdGNoQXQgb24gYSBub2RlIHdpdGggaW52YWxpZCBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIChieVxuICAgIGNoaWxkIGluZGV4KSB3aXRoIHRoZSBnaXZlbiByZXBsYWNlbWVudCBmcmFnbWVudCAod2hpY2ggZGVmYXVsdHNcbiAgICB0byB0aGUgZW1wdHkgZnJhZ21lbnQpIHdvdWxkIGxlYXZlIHRoZSBub2RlJ3MgY29udGVudCB2YWxpZC4gWW91XG4gICAgY2FuIG9wdGlvbmFsbHkgcGFzcyBgc3RhcnRgIGFuZCBgZW5kYCBpbmRpY2VzIGludG8gdGhlXG4gICAgcmVwbGFjZW1lbnQgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlKGZyb20sIHRvLCByZXBsYWNlbWVudCA9IEZyYWdtZW50LmVtcHR5LCBzdGFydCA9IDAsIGVuZCA9IHJlcGxhY2VtZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgbGV0IG9uZSA9IHRoaXMuY29udGVudE1hdGNoQXQoZnJvbSkubWF0Y2hGcmFnbWVudChyZXBsYWNlbWVudCwgc3RhcnQsIGVuZCk7XG4gICAgICAgIGxldCB0d28gPSBvbmUgJiYgb25lLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIGlmICghdHdvIHx8ICF0d28udmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUuYWxsb3dzTWFya3MocmVwbGFjZW1lbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGBmcm9tYCB0byBgdG9gIChieSBpbmRleCkgd2l0aFxuICAgIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSB3b3VsZCBsZWF2ZSB0aGUgbm9kZSdzIGNvbnRlbnQgdmFsaWQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlV2l0aChmcm9tLCB0bywgdHlwZSwgbWFya3MpIHtcbiAgICAgICAgaWYgKG1hcmtzICYmICF0aGlzLnR5cGUuYWxsb3dzTWFya3MobWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNvbnRlbnRNYXRjaEF0KGZyb20pLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICYmIHN0YXJ0Lm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIHJldHVybiBlbmQgPyBlbmQudmFsaWRFbmQgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBub2RlJ3MgY29udGVudCBjb3VsZCBiZSBhcHBlbmRlZCB0byB0aGlzXG4gICAgbm9kZS4gSWYgdGhhdCBub2RlIGlzIGVtcHR5LCB0aGlzIHdpbGwgb25seSByZXR1cm4gdHJ1ZSBpZiB0aGVyZVxuICAgIGlzIGF0IGxlYXN0IG9uZSBub2RlIHR5cGUgdGhhdCBjYW4gYXBwZWFyIGluIGJvdGggbm9kZXMgKHRvIGF2b2lkXG4gICAgbWVyZ2luZyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZSBub2RlcykuXG4gICAgKi9cbiAgICBjYW5BcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhblJlcGxhY2UodGhpcy5jaGlsZENvdW50LCB0aGlzLmNoaWxkQ291bnQsIG90aGVyLmNvbnRlbnQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmNvbXBhdGlibGVDb250ZW50KG90aGVyLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSBhbmQgaXRzIGRlc2NlbmRhbnRzIGNvbmZvcm0gdG8gdGhlXG4gICAgc2NoZW1hLCBhbmQgcmFpc2UgZXJyb3Igd2hlbiB0aGV5IGRvIG5vdC5cbiAgICAqL1xuICAgIGNoZWNrKCkge1xuICAgICAgICB0aGlzLnR5cGUuY2hlY2tDb250ZW50KHRoaXMuY29udGVudCk7XG4gICAgICAgIGxldCBjb3B5ID0gTWFyay5ub25lO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjb3B5ID0gdGhpcy5tYXJrc1tpXS5hZGRUb1NldChjb3B5KTtcbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQoY29weSwgdGhpcy5tYXJrcykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjb2xsZWN0aW9uIG9mIG1hcmtzIGZvciBub2RlICR7dGhpcy50eXBlLm5hbWV9OiAke3RoaXMubWFya3MubWFwKG0gPT4gbS50eXBlLm5hbWUpfWApO1xuICAgICAgICB0aGlzLmNvbnRlbnQuZm9yRWFjaChub2RlID0+IG5vZGUuY2hlY2soKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIG9iai5jb250ZW50ID0gdGhpcy5jb250ZW50LnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICBvYmoubWFya3MgPSB0aGlzLm1hcmtzLm1hcChuID0+IG4udG9KU09OKCkpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG5vZGUgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgbWFya3MgPSBudWxsO1xuICAgICAgICBpZiAoanNvbi5tYXJrcykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb24ubWFya3MpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBtYXJrIGRhdGEgZm9yIE5vZGUuZnJvbUpTT05cIik7XG4gICAgICAgICAgICBtYXJrcyA9IGpzb24ubWFya3MubWFwKHNjaGVtYS5tYXJrRnJvbUpTT04pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uLnR5cGUgPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YganNvbi50ZXh0ICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHRleHQgbm9kZSBpbiBKU09OXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS50ZXh0KGpzb24udGV4dCwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQuZnJvbUpTT04oc2NoZW1hLCBqc29uLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gc2NoZW1hLm5vZGVUeXBlKGpzb24udHlwZSkuY3JlYXRlKGpzb24uYXR0cnMsIGNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG59XG5Ob2RlLnByb3RvdHlwZS50ZXh0ID0gdW5kZWZpbmVkO1xuY2xhc3MgVGV4dE5vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBzdXBlcih0eXBlLCBhdHRycywgbnVsbCwgbWFya3MpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkVtcHR5IHRleHQgbm9kZXMgYXJlIG5vdCBhbGxvd2VkXCIpO1xuICAgICAgICB0aGlzLnRleHQgPSBjb250ZW50O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRleHQpKTtcbiAgICB9XG4gICAgZ2V0IHRleHRDb250ZW50KCkgeyByZXR1cm4gdGhpcy50ZXh0OyB9XG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8pIHsgcmV0dXJuIHRoaXMudGV4dC5zbGljZShmcm9tLCB0byk7IH1cbiAgICBnZXQgbm9kZVNpemUoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgbWFyayhtYXJrcykge1xuICAgICAgICByZXR1cm4gbWFya3MgPT0gdGhpcy5tYXJrcyA/IHRoaXMgOiBuZXcgVGV4dE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0aGlzLnRleHQsIG1hcmtzKTtcbiAgICB9XG4gICAgd2l0aFRleHQodGV4dCkge1xuICAgICAgICBpZiAodGV4dCA9PSB0aGlzLnRleHQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRleHQsIHRoaXMubWFya3MpO1xuICAgIH1cbiAgICBjdXQoZnJvbSA9IDAsIHRvID0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMudGV4dC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFRleHQodGhpcy50ZXh0LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbWVNYXJrdXAob3RoZXIpICYmIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBiYXNlID0gc3VwZXIudG9KU09OKCk7XG4gICAgICAgIGJhc2UudGV4dCA9IHRoaXMudGV4dDtcbiAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcE1hcmtzKG1hcmtzLCBzdHIpIHtcbiAgICBmb3IgKGxldCBpID0gbWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIHN0ciA9IG1hcmtzW2ldLnR5cGUubmFtZSArIFwiKFwiICsgc3RyICsgXCIpXCI7XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG5JbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBtYXRjaCBzdGF0ZSBvZiBhIG5vZGUgdHlwZSdzXG5bY29udGVudCBleHByZXNzaW9uXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29udGVudCksIGFuZCBjYW4gYmUgdXNlZCB0b1xuZmluZCBvdXQgd2hldGhlciBmdXJ0aGVyIGNvbnRlbnQgbWF0Y2hlcyBoZXJlLCBhbmQgd2hldGhlciBhIGdpdmVuXG5wb3NpdGlvbiBpcyBhIHZhbGlkIGVuZCBvZiB0aGUgbm9kZS5cbiovXG5jbGFzcyBDb250ZW50TWF0Y2gge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbWF0Y2ggc3RhdGUgcmVwcmVzZW50cyBhIHZhbGlkIGVuZCBvZiB0aGUgbm9kZS5cbiAgICAqL1xuICAgIHZhbGlkRW5kKSB7XG4gICAgICAgIHRoaXMudmFsaWRFbmQgPSB2YWxpZEVuZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm5leHQgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLndyYXBDYWNoZSA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShzdHJpbmcsIG5vZGVUeXBlcykge1xuICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKHN0cmluZywgbm9kZVR5cGVzKTtcbiAgICAgICAgaWYgKHN0cmVhbS5uZXh0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gQ29udGVudE1hdGNoLmVtcHR5O1xuICAgICAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzdHJlYW0pO1xuICAgICAgICBpZiAoc3RyZWFtLm5leHQpXG4gICAgICAgICAgICBzdHJlYW0uZXJyKFwiVW5leHBlY3RlZCB0cmFpbGluZyB0ZXh0XCIpO1xuICAgICAgICBsZXQgbWF0Y2ggPSBkZmEobmZhKGV4cHIpKTtcbiAgICAgICAgY2hlY2tGb3JEZWFkRW5kcyhtYXRjaCwgc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCBhIG5vZGUgdHlwZSwgcmV0dXJuaW5nIGEgbWF0Y2ggYWZ0ZXIgdGhhdCBub2RlIGlmXG4gICAgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIG1hdGNoVHlwZSh0eXBlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHRoaXMubmV4dFtpXS50eXBlID09IHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dFtpXS5uZXh0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1hdGNoIGEgZnJhZ21lbnQuIFJldHVybnMgdGhlIHJlc3VsdGluZyBtYXRjaCB3aGVuXG4gICAgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIG1hdGNoRnJhZ21lbnQoZnJhZywgc3RhcnQgPSAwLCBlbmQgPSBmcmFnLmNoaWxkQ291bnQpIHtcbiAgICAgICAgbGV0IGN1ciA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgY3VyICYmIGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIGN1ciA9IGN1ci5tYXRjaFR5cGUoZnJhZy5jaGlsZChpKS50eXBlKTtcbiAgICAgICAgcmV0dXJuIGN1cjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaW5saW5lQ29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dC5sZW5ndGggIT0gMCAmJiB0aGlzLm5leHRbMF0udHlwZS5pc0lubGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBmaXJzdCBtYXRjaGluZyBub2RlIHR5cGUgYXQgdGhpcyBtYXRjaCBwb3NpdGlvbiB0aGF0IGNhblxuICAgIGJlIGdlbmVyYXRlZC5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0VHlwZSgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHR5cGUgfSA9IHRoaXMubmV4dFtpXTtcbiAgICAgICAgICAgIGlmICghKHR5cGUuaXNUZXh0IHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXRpYmxlKG90aGVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvdGhlci5uZXh0Lmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRbaV0udHlwZSA9PSBvdGhlci5uZXh0W2pdLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFRyeSB0byBtYXRjaCB0aGUgZ2l2ZW4gZnJhZ21lbnQsIGFuZCBpZiB0aGF0IGZhaWxzLCBzZWUgaWYgaXQgY2FuXG4gICAgYmUgbWFkZSB0byBtYXRjaCBieSBpbnNlcnRpbmcgbm9kZXMgaW4gZnJvbnQgb2YgaXQuIFdoZW5cbiAgICBzdWNjZXNzZnVsLCByZXR1cm4gYSBmcmFnbWVudCBvZiBpbnNlcnRlZCBub2RlcyAod2hpY2ggbWF5IGJlXG4gICAgZW1wdHkgaWYgbm90aGluZyBoYWQgdG8gYmUgaW5zZXJ0ZWQpLiBXaGVuIGB0b0VuZGAgaXMgdHJ1ZSwgb25seVxuICAgIHJldHVybiBhIGZyYWdtZW50IGlmIHRoZSByZXN1bHRpbmcgbWF0Y2ggZ29lcyB0byB0aGUgZW5kIG9mIHRoZVxuICAgIGNvbnRlbnQgZXhwcmVzc2lvbi5cbiAgICAqL1xuICAgIGZpbGxCZWZvcmUoYWZ0ZXIsIHRvRW5kID0gZmFsc2UsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGxldCBzZWVuID0gW3RoaXNdO1xuICAgICAgICBmdW5jdGlvbiBzZWFyY2gobWF0Y2gsIHR5cGVzKSB7XG4gICAgICAgICAgICBsZXQgZmluaXNoZWQgPSBtYXRjaC5tYXRjaEZyYWdtZW50KGFmdGVyLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCAmJiAoIXRvRW5kIHx8IGZpbmlzaGVkLnZhbGlkRW5kKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbSh0eXBlcy5tYXAodHAgPT4gdHAuY3JlYXRlQW5kRmlsbCgpKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5uZXh0W2ldO1xuICAgICAgICAgICAgICAgIGlmICghKHR5cGUuaXNUZXh0IHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKSAmJiBzZWVuLmluZGV4T2YobmV4dCkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vlbi5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzZWFyY2gobmV4dCwgdHlwZXMuY29uY2F0KHR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWFyY2godGhpcywgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgc2V0IG9mIHdyYXBwaW5nIG5vZGUgdHlwZXMgdGhhdCB3b3VsZCBhbGxvdyBhIG5vZGUgb2YgdGhlXG4gICAgZ2l2ZW4gdHlwZSB0byBhcHBlYXIgYXQgdGhpcyBwb3NpdGlvbi4gVGhlIHJlc3VsdCBtYXkgYmUgZW1wdHlcbiAgICAod2hlbiBpdCBmaXRzIGRpcmVjdGx5KSBhbmQgd2lsbCBiZSBudWxsIHdoZW4gbm8gc3VjaCB3cmFwcGluZ1xuICAgIGV4aXN0cy5cbiAgICAqL1xuICAgIGZpbmRXcmFwcGluZyh0YXJnZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndyYXBDYWNoZS5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIGlmICh0aGlzLndyYXBDYWNoZVtpXSA9PSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcENhY2hlW2kgKyAxXTtcbiAgICAgICAgbGV0IGNvbXB1dGVkID0gdGhpcy5jb21wdXRlV3JhcHBpbmcodGFyZ2V0KTtcbiAgICAgICAgdGhpcy53cmFwQ2FjaGUucHVzaCh0YXJnZXQsIGNvbXB1dGVkKTtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXB1dGVXcmFwcGluZyh0YXJnZXQpIHtcbiAgICAgICAgbGV0IHNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpLCBhY3RpdmUgPSBbeyBtYXRjaDogdGhpcywgdHlwZTogbnVsbCwgdmlhOiBudWxsIH1dO1xuICAgICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhY3RpdmUuc2hpZnQoKSwgbWF0Y2ggPSBjdXJyZW50Lm1hdGNoO1xuICAgICAgICAgICAgaWYgKG1hdGNoLm1hdGNoVHlwZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9iaiA9IGN1cnJlbnQ7IG9iai50eXBlOyBvYmogPSBvYmoudmlhKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvYmoudHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5uZXh0W2ldO1xuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc0xlYWYgJiYgIXR5cGUuaGFzUmVxdWlyZWRBdHRycygpICYmICEodHlwZS5uYW1lIGluIHNlZW4pICYmICghY3VycmVudC50eXBlIHx8IG5leHQudmFsaWRFbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKHsgbWF0Y2g6IHR5cGUuY29udGVudE1hdGNoLCB0eXBlLCB2aWE6IGN1cnJlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5bdHlwZS5uYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIG91dGdvaW5nIGVkZ2VzIHRoaXMgbm9kZSBoYXMgaW4gdGhlIGZpbml0ZVxuICAgIGF1dG9tYXRvbiB0aGF0IGRlc2NyaWJlcyB0aGUgY29udGVudCBleHByZXNzaW9uLlxuICAgICovXG4gICAgZ2V0IGVkZ2VDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dC5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgX25fXHUyMDBCdGggb3V0Z29pbmcgZWRnZSBmcm9tIHRoaXMgbm9kZSBpbiB0aGUgZmluaXRlXG4gICAgYXV0b21hdG9uIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50IGV4cHJlc3Npb24uXG4gICAgKi9cbiAgICBlZGdlKG4pIHtcbiAgICAgICAgaWYgKG4gPj0gdGhpcy5uZXh0Lmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGVyZSdzIG5vICR7bn10aCBlZGdlIGluIHRoaXMgY29udGVudCBtYXRjaGApO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0W25dO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgc2VlbiA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBzY2FuKG0pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChtKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbS5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChzZWVuLmluZGV4T2YobS5uZXh0W2ldLm5leHQpID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBzY2FuKG0ubmV4dFtpXS5uZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBzY2FuKHRoaXMpO1xuICAgICAgICByZXR1cm4gc2Vlbi5tYXAoKG0sIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBvdXQgPSBpICsgKG0udmFsaWRFbmQgPyBcIipcIiA6IFwiIFwiKSArIFwiIFwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgb3V0ICs9IChpID8gXCIsIFwiIDogXCJcIikgKyBtLm5leHRbaV0udHlwZS5uYW1lICsgXCItPlwiICsgc2Vlbi5pbmRleE9mKG0ubmV4dFtpXS5uZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0pLmpvaW4oXCJcXG5cIik7XG4gICAgfVxufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5Db250ZW50TWF0Y2guZW1wdHkgPSBuZXcgQ29udGVudE1hdGNoKHRydWUpO1xuY2xhc3MgVG9rZW5TdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHN0cmluZywgbm9kZVR5cGVzKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xuICAgICAgICB0aGlzLm5vZGVUeXBlcyA9IG5vZGVUeXBlcztcbiAgICAgICAgdGhpcy5pbmxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMudG9rZW5zID0gc3RyaW5nLnNwbGl0KC9cXHMqKD89XFxifFxcV3wkKS8pO1xuICAgICAgICBpZiAodGhpcy50b2tlbnNbdGhpcy50b2tlbnMubGVuZ3RoIC0gMV0gPT0gXCJcIilcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLnBvcCgpO1xuICAgICAgICBpZiAodGhpcy50b2tlbnNbMF0gPT0gXCJcIilcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLnNoaWZ0KCk7XG4gICAgfVxuICAgIGdldCBuZXh0KCkgeyByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5wb3NdOyB9XG4gICAgZWF0KHRvaykgeyByZXR1cm4gdGhpcy5uZXh0ID09IHRvayAmJiAodGhpcy5wb3MrKyB8fCB0cnVlKTsgfVxuICAgIGVycihzdHIpIHsgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN0ciArIFwiIChpbiBjb250ZW50IGV4cHJlc3Npb24gJ1wiICsgdGhpcy5zdHJpbmcgKyBcIicpXCIpOyB9XG59XG5mdW5jdGlvbiBwYXJzZUV4cHIoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHJzID0gW107XG4gICAgZG8ge1xuICAgICAgICBleHBycy5wdXNoKHBhcnNlRXhwclNlcShzdHJlYW0pKTtcbiAgICB9IHdoaWxlIChzdHJlYW0uZWF0KFwifFwiKSk7XG4gICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA9PSAxID8gZXhwcnNbMF0gOiB7IHR5cGU6IFwiY2hvaWNlXCIsIGV4cHJzIH07XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJTZXEoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHJzID0gW107XG4gICAgZG8ge1xuICAgICAgICBleHBycy5wdXNoKHBhcnNlRXhwclN1YnNjcmlwdChzdHJlYW0pKTtcbiAgICB9IHdoaWxlIChzdHJlYW0ubmV4dCAmJiBzdHJlYW0ubmV4dCAhPSBcIilcIiAmJiBzdHJlYW0ubmV4dCAhPSBcInxcIik7XG4gICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA9PSAxID8gZXhwcnNbMF0gOiB7IHR5cGU6IFwic2VxXCIsIGV4cHJzIH07XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJTdWJzY3JpcHQoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHIgPSBwYXJzZUV4cHJBdG9tKHN0cmVhbSk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoc3RyZWFtLmVhdChcIitcIikpXG4gICAgICAgICAgICBleHByID0geyB0eXBlOiBcInBsdXNcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwiKlwiKSlcbiAgICAgICAgICAgIGV4cHIgPSB7IHR5cGU6IFwic3RhclwiLCBleHByIH07XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoXCI/XCIpKVxuICAgICAgICAgICAgZXhwciA9IHsgdHlwZTogXCJvcHRcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwie1wiKSlcbiAgICAgICAgICAgIGV4cHIgPSBwYXJzZUV4cHJSYW5nZShzdHJlYW0sIGV4cHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG59XG5mdW5jdGlvbiBwYXJzZU51bShzdHJlYW0pIHtcbiAgICBpZiAoL1xcRC8udGVzdChzdHJlYW0ubmV4dCkpXG4gICAgICAgIHN0cmVhbS5lcnIoXCJFeHBlY3RlZCBudW1iZXIsIGdvdCAnXCIgKyBzdHJlYW0ubmV4dCArIFwiJ1wiKTtcbiAgICBsZXQgcmVzdWx0ID0gTnVtYmVyKHN0cmVhbS5uZXh0KTtcbiAgICBzdHJlYW0ucG9zKys7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwclJhbmdlKHN0cmVhbSwgZXhwcikge1xuICAgIGxldCBtaW4gPSBwYXJzZU51bShzdHJlYW0pLCBtYXggPSBtaW47XG4gICAgaWYgKHN0cmVhbS5lYXQoXCIsXCIpKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubmV4dCAhPSBcIn1cIilcbiAgICAgICAgICAgIG1heCA9IHBhcnNlTnVtKHN0cmVhbSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1heCA9IC0xO1xuICAgIH1cbiAgICBpZiAoIXN0cmVhbS5lYXQoXCJ9XCIpKVxuICAgICAgICBzdHJlYW0uZXJyKFwiVW5jbG9zZWQgYnJhY2VkIHJhbmdlXCIpO1xuICAgIHJldHVybiB7IHR5cGU6IFwicmFuZ2VcIiwgbWluLCBtYXgsIGV4cHIgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVOYW1lKHN0cmVhbSwgbmFtZSkge1xuICAgIGxldCB0eXBlcyA9IHN0cmVhbS5ub2RlVHlwZXMsIHR5cGUgPSB0eXBlc1tuYW1lXTtcbiAgICBpZiAodHlwZSlcbiAgICAgICAgcmV0dXJuIFt0eXBlXTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgdHlwZU5hbWUgaW4gdHlwZXMpIHtcbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1t0eXBlTmFtZV07XG4gICAgICAgIGlmICh0eXBlLmdyb3Vwcy5pbmRleE9mKG5hbWUpID4gLTEpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMClcbiAgICAgICAgc3RyZWFtLmVycihcIk5vIG5vZGUgdHlwZSBvciBncm91cCAnXCIgKyBuYW1lICsgXCInIGZvdW5kXCIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJBdG9tKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0uZWF0KFwiKFwiKSkge1xuICAgICAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzdHJlYW0pO1xuICAgICAgICBpZiAoIXN0cmVhbS5lYXQoXCIpXCIpKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk1pc3NpbmcgY2xvc2luZyBwYXJlblwiKTtcbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEvXFxXLy50ZXN0KHN0cmVhbS5uZXh0KSkge1xuICAgICAgICBsZXQgZXhwcnMgPSByZXNvbHZlTmFtZShzdHJlYW0sIHN0cmVhbS5uZXh0KS5tYXAodHlwZSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLmlubGluZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5pbmxpbmUgPSB0eXBlLmlzSW5saW5lO1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmlubGluZSAhPSB0eXBlLmlzSW5saW5lKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJNaXhpbmcgaW5saW5lIGFuZCBibG9jayBjb250ZW50XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJuYW1lXCIsIHZhbHVlOiB0eXBlIH07XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ucG9zKys7XG4gICAgICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcImNob2ljZVwiLCBleHBycyB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyZWFtLmVycihcIlVuZXhwZWN0ZWQgdG9rZW4gJ1wiICsgc3RyZWFtLm5leHQgKyBcIidcIik7XG4gICAgfVxufVxuLyoqXG5Db25zdHJ1Y3QgYW4gTkZBIGZyb20gYW4gZXhwcmVzc2lvbiBhcyByZXR1cm5lZCBieSB0aGUgcGFyc2VyLiBUaGVcbk5GQSBpcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBzdGF0ZXMsIHdoaWNoIGFyZSB0aGVtc2VsdmVzXG5hcnJheXMgb2YgZWRnZXMsIHdoaWNoIGFyZSBge3Rlcm0sIHRvfWAgb2JqZWN0cy4gVGhlIGZpcnN0IHN0YXRlIGlzXG50aGUgZW50cnkgc3RhdGUgYW5kIHRoZSBsYXN0IG5vZGUgaXMgdGhlIHN1Y2Nlc3Mgc3RhdGUuXG5cbk5vdGUgdGhhdCB1bmxpa2UgdHlwaWNhbCBORkFzLCB0aGUgZWRnZSBvcmRlcmluZyBpbiB0aGlzIG9uZSBpc1xuc2lnbmlmaWNhbnQsIGluIHRoYXQgaXQgaXMgdXNlZCB0byBjb250cnVjdCBmaWxsZXIgY29udGVudCB3aGVuXG5uZWNlc3NhcnkuXG4qL1xuZnVuY3Rpb24gbmZhKGV4cHIpIHtcbiAgICBsZXQgbmZhID0gW1tdXTtcbiAgICBjb25uZWN0KGNvbXBpbGUoZXhwciwgMCksIG5vZGUoKSk7XG4gICAgcmV0dXJuIG5mYTtcbiAgICBmdW5jdGlvbiBub2RlKCkgeyByZXR1cm4gbmZhLnB1c2goW10pIC0gMTsgfVxuICAgIGZ1bmN0aW9uIGVkZ2UoZnJvbSwgdG8sIHRlcm0pIHtcbiAgICAgICAgbGV0IGVkZ2UgPSB7IHRlcm0sIHRvIH07XG4gICAgICAgIG5mYVtmcm9tXS5wdXNoKGVkZ2UpO1xuICAgICAgICByZXR1cm4gZWRnZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29ubmVjdChlZGdlcywgdG8pIHtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChlZGdlID0+IGVkZ2UudG8gPSB0byk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBpbGUoZXhwciwgZnJvbSkge1xuICAgICAgICBpZiAoZXhwci50eXBlID09IFwiY2hvaWNlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByLmV4cHJzLnJlZHVjZSgob3V0LCBleHByKSA9PiBvdXQuY29uY2F0KGNvbXBpbGUoZXhwciwgZnJvbSkpLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwic2VxXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjb21waWxlKGV4cHIuZXhwcnNbaV0sIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChpID09IGV4cHIuZXhwcnMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICAgICAgY29ubmVjdChuZXh0LCBmcm9tID0gbm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJzdGFyXCIpIHtcbiAgICAgICAgICAgIGxldCBsb29wID0gbm9kZSgpO1xuICAgICAgICAgICAgZWRnZShmcm9tLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicGx1c1wiKSB7XG4gICAgICAgICAgICBsZXQgbG9vcCA9IG5vZGUoKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGZyb20pLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwib3B0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShmcm9tKV0uY29uY2F0KGNvbXBpbGUoZXhwci5leHByLCBmcm9tKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicmFuZ2VcIikge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIubWluOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUoKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBuZXh0KTtcbiAgICAgICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIubWF4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBleHByLm1pbjsgaSA8IGV4cHIubWF4OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVkZ2UoY3VyLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGN1cildO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcIm5hbWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGZyb20sIHVuZGVmaW5lZCwgZXhwci52YWx1ZSldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBleHByIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gYiAtIGE7IH1cbi8vIEdldCB0aGUgc2V0IG9mIG5vZGVzIHJlYWNoYWJsZSBieSBudWxsIGVkZ2VzIGZyb20gYG5vZGVgLiBPbWl0XG4vLyBub2RlcyB3aXRoIG9ubHkgYSBzaW5nbGUgbnVsbC1vdXQtZWRnZSwgc2luY2UgdGhleSBtYXkgbGVhZCB0b1xuLy8gbmVlZGxlc3MgZHVwbGljYXRlZCBub2Rlcy5cbmZ1bmN0aW9uIG51bGxGcm9tKG5mYSwgbm9kZSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBzY2FuKG5vZGUpO1xuICAgIHJldHVybiByZXN1bHQuc29ydChjbXApO1xuICAgIGZ1bmN0aW9uIHNjYW4obm9kZSkge1xuICAgICAgICBsZXQgZWRnZXMgPSBuZmFbbm9kZV07XG4gICAgICAgIGlmIChlZGdlcy5sZW5ndGggPT0gMSAmJiAhZWRnZXNbMF0udGVybSlcbiAgICAgICAgICAgIHJldHVybiBzY2FuKGVkZ2VzWzBdLnRvKTtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHRlcm0sIHRvIH0gPSBlZGdlc1tpXTtcbiAgICAgICAgICAgIGlmICghdGVybSAmJiByZXN1bHQuaW5kZXhPZih0bykgPT0gLTEpXG4gICAgICAgICAgICAgICAgc2Nhbih0byk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBDb21waWxlcyBhbiBORkEgYXMgcHJvZHVjZWQgYnkgYG5mYWAgaW50byBhIERGQSwgbW9kZWxlZCBhcyBhIHNldFxuLy8gb2Ygc3RhdGUgb2JqZWN0cyAoYENvbnRlbnRNYXRjaGAgaW5zdGFuY2VzKSB3aXRoIHRyYW5zaXRpb25zXG4vLyBiZXR3ZWVuIHRoZW0uXG5mdW5jdGlvbiBkZmEobmZhKSB7XG4gICAgbGV0IGxhYmVsZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHJldHVybiBleHBsb3JlKG51bGxGcm9tKG5mYSwgMCkpO1xuICAgIGZ1bmN0aW9uIGV4cGxvcmUoc3RhdGVzKSB7XG4gICAgICAgIGxldCBvdXQgPSBbXTtcbiAgICAgICAgc3RhdGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBuZmFbbm9kZV0uZm9yRWFjaCgoeyB0ZXJtLCB0byB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXJtKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbGV0IHNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFtpXVswXSA9PSB0ZXJtKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gb3V0W2ldWzFdO1xuICAgICAgICAgICAgICAgIG51bGxGcm9tKG5mYSwgdG8pLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goW3Rlcm0sIHNldCA9IFtdXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXQuaW5kZXhPZihub2RlKSA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgc3RhdGUgPSBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gPSBuZXcgQ29udGVudE1hdGNoKHN0YXRlcy5pbmRleE9mKG5mYS5sZW5ndGggLSAxKSA+IC0xKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZXMgPSBvdXRbaV1bMV0uc29ydChjbXApO1xuICAgICAgICAgICAgc3RhdGUubmV4dC5wdXNoKHsgdHlwZTogb3V0W2ldWzBdLCBuZXh0OiBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gfHwgZXhwbG9yZShzdGF0ZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0ZvckRlYWRFbmRzKG1hdGNoLCBzdHJlYW0pIHtcbiAgICBmb3IgKGxldCBpID0gMCwgd29yayA9IFttYXRjaF07IGkgPCB3b3JrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHdvcmtbaV0sIGRlYWQgPSAhc3RhdGUudmFsaWRFbmQsIG5vZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RhdGUubmV4dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gc3RhdGUubmV4dFtqXTtcbiAgICAgICAgICAgIG5vZGVzLnB1c2godHlwZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChkZWFkICYmICEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpKVxuICAgICAgICAgICAgICAgIGRlYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh3b3JrLmluZGV4T2YobmV4dCkgPT0gLTEpXG4gICAgICAgICAgICAgICAgd29yay5wdXNoKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWFkKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk9ubHkgbm9uLWdlbmVyYXRhYmxlIG5vZGVzIChcIiArIG5vZGVzLmpvaW4oXCIsIFwiKSArIFwiKSBpbiBhIHJlcXVpcmVkIHBvc2l0aW9uIChzZWUgaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jZ2VuZXJhdGFibGUpXCIpO1xuICAgIH1cbn1cblxuLy8gRm9yIG5vZGUgdHlwZXMgd2hlcmUgYWxsIGF0dHJzIGhhdmUgYSBkZWZhdWx0IHZhbHVlIChvciB3aGljaCBkb24ndFxuLy8gaGF2ZSBhbnkgYXR0cmlidXRlcyksIGJ1aWxkIHVwIGEgc2luZ2xlIHJldXNhYmxlIGRlZmF1bHQgYXR0cmlidXRlXG4vLyBvYmplY3QsIGFuZCB1c2UgaXQgZm9yIGFsbCBub2RlcyB0aGF0IGRvbid0IHNwZWNpZnkgc3BlY2lmaWNcbi8vIGF0dHJpYnV0ZXMuXG5mdW5jdGlvbiBkZWZhdWx0QXR0cnMoYXR0cnMpIHtcbiAgICBsZXQgZGVmYXVsdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGF0dHJOYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGxldCBhdHRyID0gYXR0cnNbYXR0ck5hbWVdO1xuICAgICAgICBpZiAoIWF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBkZWZhdWx0c1thdHRyTmFtZV0gPSBhdHRyLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0cztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVBdHRycyhhdHRycywgdmFsdWUpIHtcbiAgICBsZXQgYnVpbHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgbGV0IGdpdmVuID0gdmFsdWUgJiYgdmFsdWVbbmFtZV07XG4gICAgICAgIGlmIChnaXZlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYXR0ciA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKGF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgICAgICBnaXZlbiA9IGF0dHIuZGVmYXVsdDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIHZhbHVlIHN1cHBsaWVkIGZvciBhdHRyaWJ1dGUgXCIgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBidWlsdFtuYW1lXSA9IGdpdmVuO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbHQ7XG59XG5mdW5jdGlvbiBpbml0QXR0cnMoYXR0cnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBuZXcgQXR0cmlidXRlKGF0dHJzW25hbWVdKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5Ob2RlIHR5cGVzIGFyZSBvYmplY3RzIGFsbG9jYXRlZCBvbmNlIHBlciBgU2NoZW1hYCBhbmQgdXNlZCB0b1xuW3RhZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUudHlwZSkgYE5vZGVgIGluc3RhbmNlcy4gVGhleSBjb250YWluIGluZm9ybWF0aW9uXG5hYm91dCB0aGUgbm9kZSB0eXBlLCBzdWNoIGFzIGl0cyBuYW1lIGFuZCB3aGF0IGtpbmQgb2Ygbm9kZSBpdFxucmVwcmVzZW50cy5cbiovXG5jbGFzcyBOb2RlVHlwZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSB0aGUgbm9kZSB0eXBlIGhhcyBpbiB0aGlzIHNjaGVtYS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEEgbGluayBiYWNrIHRvIHRoZSBgU2NoZW1hYCB0aGUgbm9kZSB0eXBlIGJlbG9uZ3MgdG8uXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzcGVjIHRoYXQgdGhpcyB0eXBlIGlzIGJhc2VkIG9uXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIHNldCBvZiBtYXJrcyBhbGxvd2VkIGluIHRoaXMgbm9kZS4gYG51bGxgIG1lYW5zIGFsbCBtYXJrc1xuICAgICAgICBhcmUgYWxsb3dlZC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrU2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBzcGVjLmdyb3VwID8gc3BlYy5ncm91cC5zcGxpdChcIiBcIikgOiBbXTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGluaXRBdHRycyhzcGVjLmF0dHJzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXR0cnMgPSBkZWZhdWx0QXR0cnModGhpcy5hdHRycyk7XG4gICAgICAgIHRoaXMuY29udGVudE1hdGNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbmxpbmVDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0Jsb2NrID0gIShzcGVjLmlubGluZSB8fCBuYW1lID09IFwidGV4dFwiKTtcbiAgICAgICAgdGhpcy5pc1RleHQgPSBuYW1lID09IFwidGV4dFwiO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHRoaXMgaXMgYW4gaW5saW5lIHR5cGUuXG4gICAgKi9cbiAgICBnZXQgaXNJbmxpbmUoKSB7IHJldHVybiAhdGhpcy5pc0Jsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB0aGlzIGlzIGEgdGV4dGJsb2NrIHR5cGUsIGEgYmxvY2sgdGhhdCBjb250YWlucyBpbmxpbmVcbiAgICBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzVGV4dGJsb2NrKCkgeyByZXR1cm4gdGhpcy5pc0Jsb2NrICYmIHRoaXMuaW5saW5lQ29udGVudDsgfVxuICAgIC8qKlxuICAgIFRydWUgZm9yIG5vZGUgdHlwZXMgdGhhdCBhbGxvdyBubyBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzTGVhZigpIHsgcmV0dXJuIHRoaXMuY29udGVudE1hdGNoID09IENvbnRlbnRNYXRjaC5lbXB0eTsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgaXMgYW4gYXRvbSwgaS5lLiB3aGVuIGl0IGRvZXMgbm90IGhhdmVcbiAgICBkaXJlY3RseSBlZGl0YWJsZSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzQXRvbSgpIHsgcmV0dXJuIHRoaXMuaXNMZWFmIHx8ICEhdGhpcy5zcGVjLmF0b207IH1cbiAgICAvKipcbiAgICBUaGUgbm9kZSB0eXBlJ3MgW3doaXRlc3BhY2VdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy53aGl0ZXNwYWNlKSBvcHRpb24uXG4gICAgKi9cbiAgICBnZXQgd2hpdGVzcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BlYy53aGl0ZXNwYWNlIHx8ICh0aGlzLnNwZWMuY29kZSA/IFwicHJlXCIgOiBcIm5vcm1hbFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhpcyBub2RlIHR5cGUgaGFzIGFueSByZXF1aXJlZCBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgaGFzUmVxdWlyZWRBdHRycygpIHtcbiAgICAgICAgZm9yIChsZXQgbiBpbiB0aGlzLmF0dHJzKVxuICAgICAgICAgICAgaWYgKHRoaXMuYXR0cnNbbl0uaXNSZXF1aXJlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG5vZGUgYWxsb3dzIHNvbWUgb2YgdGhlIHNhbWUgY29udGVudCBhc1xuICAgIHRoZSBnaXZlbiBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBjb21wYXRpYmxlQ29udGVudChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCB0aGlzLmNvbnRlbnRNYXRjaC5jb21wYXRpYmxlKG90aGVyLmNvbnRlbnRNYXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcHV0ZUF0dHJzKGF0dHJzKSB7XG4gICAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QXR0cnM7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBjb21wdXRlQXR0cnModGhpcy5hdHRycywgYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBgTm9kZWAgb2YgdGhpcyB0eXBlLiBUaGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmVcbiAgICBjaGVja2VkIGFuZCBkZWZhdWx0ZWQgKHlvdSBjYW4gcGFzcyBgbnVsbGAgdG8gdXNlIHRoZSB0eXBlJ3NcbiAgICBkZWZhdWx0cyBlbnRpcmVseSwgaWYgbm8gcmVxdWlyZWQgYXR0cmlidXRlcyBleGlzdCkuIGBjb250ZW50YFxuICAgIG1heSBiZSBhIGBGcmFnbWVudGAsIGEgbm9kZSwgYW4gYXJyYXkgb2Ygbm9kZXMsIG9yXG4gICAgYG51bGxgLiBTaW1pbGFybHkgYG1hcmtzYCBtYXkgYmUgYG51bGxgIHRvIGRlZmF1bHQgdG8gdGhlIGVtcHR5XG4gICAgc2V0IG9mIG1hcmtzLlxuICAgICovXG4gICAgY3JlYXRlKGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNUZXh0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZVR5cGUuY3JlYXRlIGNhbid0IGNvbnN0cnVjdCB0ZXh0IG5vZGVzXCIpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5jb21wdXRlQXR0cnMoYXR0cnMpLCBGcmFnbWVudC5mcm9tKGNvbnRlbnQpLCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTGlrZSBbYGNyZWF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZS5jcmVhdGUpLCBidXQgY2hlY2sgdGhlIGdpdmVuIGNvbnRlbnRcbiAgICBhZ2FpbnN0IHRoZSBub2RlIHR5cGUncyBjb250ZW50IHJlc3RyaWN0aW9ucywgYW5kIHRocm93IGFuIGVycm9yXG4gICAgaWYgaXQgZG9lc24ndCBtYXRjaC5cbiAgICAqL1xuICAgIGNyZWF0ZUNoZWNrZWQoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbShjb250ZW50KTtcbiAgICAgICAgdGhpcy5jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCB0aGlzLmNvbXB1dGVBdHRycyhhdHRycyksIGNvbnRlbnQsIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgY3JlYXRlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVUeXBlLmNyZWF0ZSksIGJ1dCBzZWUgaWYgaXQgaXNcbiAgICBuZWNlc3NhcnkgdG8gYWRkIG5vZGVzIHRvIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGdpdmVuIGZyYWdtZW50XG4gICAgdG8gbWFrZSBpdCBmaXQgdGhlIG5vZGUuIElmIG5vIGZpdHRpbmcgd3JhcHBpbmcgY2FuIGJlIGZvdW5kLFxuICAgIHJldHVybiBudWxsLiBOb3RlIHRoYXQsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJlcXVpcmVkIG5vZGVzIGNhblxuICAgIGFsd2F5cyBiZSBjcmVhdGVkLCB0aGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQgaWYgeW91IHBhc3MgbnVsbCBvclxuICAgIGBGcmFnbWVudC5lbXB0eWAgYXMgY29udGVudC5cbiAgICAqL1xuICAgIGNyZWF0ZUFuZEZpbGwoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBhdHRycyA9IHRoaXMuY29tcHV0ZUF0dHJzKGF0dHJzKTtcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20oY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSB0aGlzLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFiZWZvcmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb250ZW50ID0gYmVmb3JlLmFwcGVuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2hlZCA9IHRoaXMuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgIGxldCBhZnRlciA9IG1hdGNoZWQgJiYgbWF0Y2hlZC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKTtcbiAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgYXR0cnMsIGNvbnRlbnQuYXBwZW5kKGFmdGVyKSwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgdmFsaWQgY29udGVudCBmb3IgdGhpcyBub2RlXG4gICAgdHlwZSB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgdmFsaWRDb250ZW50KGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQudmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya3MoY29udGVudC5jaGlsZChpKS5tYXJrcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhyb3dzIGEgUmFuZ2VFcnJvciBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgbm90IHZhbGlkIGNvbnRlbnQgZm9yIHRoaXNcbiAgICBub2RlIHR5cGUuXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0NvbnRlbnQoY29udGVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRDb250ZW50KGNvbnRlbnQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY29udGVudCBmb3Igbm9kZSAke3RoaXMubmFtZX06ICR7Y29udGVudC50b1N0cmluZygpLnNsaWNlKDAsIDUwKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbWFyayB0eXBlIGlzIGFsbG93ZWQgaW4gdGhpcyBub2RlLlxuICAgICovXG4gICAgYWxsb3dzTWFya1R5cGUobWFya1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFya1NldCA9PSBudWxsIHx8IHRoaXMubWFya1NldC5pbmRleE9mKG1hcmtUeXBlKSA+IC0xO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBhcmUgYWxsb3dlZCBpbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBhbGxvd3NNYXJrcyhtYXJrcykge1xuICAgICAgICBpZiAodGhpcy5tYXJrU2V0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrVHlwZShtYXJrc1tpXS50eXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIHRoZSBtYXJrcyB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gc2V0LlxuICAgICovXG4gICAgYWxsb3dlZE1hcmtzKG1hcmtzKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtTZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBtYXJrcztcbiAgICAgICAgbGV0IGNvcHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrVHlwZShtYXJrc1tpXS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IG1hcmtzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29weSkge1xuICAgICAgICAgICAgICAgIGNvcHkucHVzaChtYXJrc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFjb3B5ID8gbWFya3MgOiBjb3B5Lmxlbmd0aCA/IGNvcHkgOiBNYXJrLm5vbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNvbXBpbGUobm9kZXMsIHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobmFtZSwgc3BlYykgPT4gcmVzdWx0W25hbWVdID0gbmV3IE5vZGVUeXBlKG5hbWUsIHNjaGVtYSwgc3BlYykpO1xuICAgICAgICBsZXQgdG9wVHlwZSA9IHNjaGVtYS5zcGVjLnRvcE5vZGUgfHwgXCJkb2NcIjtcbiAgICAgICAgaWYgKCFyZXN1bHRbdG9wVHlwZV0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNjaGVtYSBpcyBtaXNzaW5nIGl0cyB0b3Agbm9kZSB0eXBlICgnXCIgKyB0b3BUeXBlICsgXCInKVwiKTtcbiAgICAgICAgaWYgKCFyZXN1bHQudGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRXZlcnkgc2NoZW1hIG5lZWRzIGEgJ3RleHQnIHR5cGVcIik7XG4gICAgICAgIGZvciAobGV0IF8gaW4gcmVzdWx0LnRleHQuYXR0cnMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSB0ZXh0IG5vZGUgdHlwZSBzaG91bGQgbm90IGhhdmUgYXR0cmlidXRlc1wiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vLyBBdHRyaWJ1dGUgZGVzY3JpcHRvcnNcbmNsYXNzIEF0dHJpYnV0ZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLmhhc0RlZmF1bHQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgXCJkZWZhdWx0XCIpO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSBvcHRpb25zLmRlZmF1bHQ7XG4gICAgfVxuICAgIGdldCBpc1JlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGFzRGVmYXVsdDtcbiAgICB9XG59XG4vLyBNYXJrc1xuLyoqXG5MaWtlIG5vZGVzLCBtYXJrcyAod2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBub2RlcyB0byBzaWduaWZ5XG50aGluZ3MgbGlrZSBlbXBoYXNpcyBvciBiZWluZyBwYXJ0IG9mIGEgbGluaykgYXJlXG5bdGFnZ2VkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFyay50eXBlKSB3aXRoIHR5cGUgb2JqZWN0cywgd2hpY2ggYXJlXG5pbnN0YW50aWF0ZWQgb25jZSBwZXIgYFNjaGVtYWAuXG4qL1xuY2xhc3MgTWFya1R5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhlIG1hcmsgdHlwZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmFuaywgXG4gICAgLyoqXG4gICAgVGhlIHNjaGVtYSB0aGF0IHRoaXMgbWFyayB0eXBlIGluc3RhbmNlIGlzIHBhcnQgb2YuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzcGVjIG9uIHdoaWNoIHRoZSB0eXBlIGlzIGJhc2VkLlxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgdGhpcy5hdHRycyA9IGluaXRBdHRycyhzcGVjLmF0dHJzKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZCA9IG51bGw7XG4gICAgICAgIGxldCBkZWZhdWx0cyA9IGRlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGRlZmF1bHRzID8gbmV3IE1hcmsodGhpcywgZGVmYXVsdHMpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBvZiB0aGlzIHR5cGUuIGBhdHRyc2AgbWF5IGJlIGBudWxsYCBvciBhbiBvYmplY3RcbiAgICBjb250YWluaW5nIG9ubHkgc29tZSBvZiB0aGUgbWFyaydzIGF0dHJpYnV0ZXMuIFRoZSBvdGhlcnMsIGlmXG4gICAgdGhleSBoYXZlIGRlZmF1bHRzLCB3aWxsIGJlIGFkZGVkLlxuICAgICovXG4gICAgY3JlYXRlKGF0dHJzID0gbnVsbCkge1xuICAgICAgICBpZiAoIWF0dHJzICYmIHRoaXMuaW5zdGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrKHRoaXMsIGNvbXB1dGVBdHRycyh0aGlzLmF0dHJzLCBhdHRycykpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjb21waWxlKG1hcmtzLCBzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCksIHJhbmsgPSAwO1xuICAgICAgICBtYXJrcy5mb3JFYWNoKChuYW1lLCBzcGVjKSA9PiByZXN1bHRbbmFtZV0gPSBuZXcgTWFya1R5cGUobmFtZSwgcmFuaysrLCBzY2hlbWEsIHNwZWMpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQsIGEgbmV3IHNldFxuICAgIHdpdGhvdXQgaXQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGlucHV0IHNldCBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIHJlbW92ZUZyb21TZXQoc2V0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldFtpXS50eXBlID09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBzZXQgPSBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRbaV07XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJpZXMgd2hldGhlciBhIGdpdmVuIG1hcmsgdHlwZSBpc1xuICAgIFtleGNsdWRlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjLmV4Y2x1ZGVzKSBieSB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGV4Y2x1ZGVzKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2x1ZGVkLmluZGV4T2Yob3RoZXIpID4gLTE7XG4gICAgfVxufVxuLyoqXG5BIGRvY3VtZW50IHNjaGVtYS4gSG9sZHMgW25vZGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZSkgYW5kIFttYXJrXG50eXBlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1R5cGUpIG9iamVjdHMgZm9yIHRoZSBub2RlcyBhbmQgbWFya3MgdGhhdCBtYXlcbm9jY3VyIGluIGNvbmZvcm1pbmcgZG9jdW1lbnRzLCBhbmQgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3JcbmNyZWF0aW5nIGFuZCBkZXNlcmlhbGl6aW5nIHN1Y2ggZG9jdW1lbnRzLlxuXG5XaGVuIGdpdmVuLCB0aGUgdHlwZSBwYXJhbWV0ZXJzIHByb3ZpZGUgdGhlIG5hbWVzIG9mIHRoZSBub2RlcyBhbmRcbm1hcmtzIGluIHRoaXMgc2NoZW1hLlxuKi9cbmNsYXNzIFNjaGVtYSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgc2NoZW1hIGZyb20gYSBzY2hlbWEgW3NwZWNpZmljYXRpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5TY2hlbWFTcGVjKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgIEFuIG9iamVjdCBmb3Igc3RvcmluZyB3aGF0ZXZlciB2YWx1ZXMgbW9kdWxlcyBtYXkgd2FudCB0b1xuICAgICAgICBjb21wdXRlIGFuZCBjYWNoZSBwZXIgc2NoZW1hLiAoSWYgeW91IHdhbnQgdG8gc3RvcmUgc29tZXRoaW5nXG4gICAgICAgIGluIGl0LCB0cnkgdG8gdXNlIHByb3BlcnR5IG5hbWVzIHVubGlrZWx5IHRvIGNsYXNoLilcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgaW5zdGFuY2VTcGVjID0gdGhpcy5zcGVjID0ge307XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gc3BlYylcbiAgICAgICAgICAgIGluc3RhbmNlU3BlY1twcm9wXSA9IHNwZWNbcHJvcF07XG4gICAgICAgIGluc3RhbmNlU3BlYy5ub2RlcyA9IE9yZGVyZWRNYXAuZnJvbShzcGVjLm5vZGVzKSxcbiAgICAgICAgICAgIGluc3RhbmNlU3BlYy5tYXJrcyA9IE9yZGVyZWRNYXAuZnJvbShzcGVjLm1hcmtzIHx8IHt9KSxcbiAgICAgICAgICAgIHRoaXMubm9kZXMgPSBOb2RlVHlwZS5jb21waWxlKHRoaXMuc3BlYy5ub2RlcywgdGhpcyk7XG4gICAgICAgIHRoaXMubWFya3MgPSBNYXJrVHlwZS5jb21waWxlKHRoaXMuc3BlYy5tYXJrcywgdGhpcyk7XG4gICAgICAgIGxldCBjb250ZW50RXhwckNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcCBpbiB0aGlzLm1hcmtzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKHByb3AgKyBcIiBjYW4gbm90IGJlIGJvdGggYSBub2RlIGFuZCBhIG1hcmtcIik7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMubm9kZXNbcHJvcF0sIGNvbnRlbnRFeHByID0gdHlwZS5zcGVjLmNvbnRlbnQgfHwgXCJcIiwgbWFya0V4cHIgPSB0eXBlLnNwZWMubWFya3M7XG4gICAgICAgICAgICB0eXBlLmNvbnRlbnRNYXRjaCA9IGNvbnRlbnRFeHByQ2FjaGVbY29udGVudEV4cHJdIHx8XG4gICAgICAgICAgICAgICAgKGNvbnRlbnRFeHByQ2FjaGVbY29udGVudEV4cHJdID0gQ29udGVudE1hdGNoLnBhcnNlKGNvbnRlbnRFeHByLCB0aGlzLm5vZGVzKSk7XG4gICAgICAgICAgICB0eXBlLmlubGluZUNvbnRlbnQgPSB0eXBlLmNvbnRlbnRNYXRjaC5pbmxpbmVDb250ZW50O1xuICAgICAgICAgICAgdHlwZS5tYXJrU2V0ID0gbWFya0V4cHIgPT0gXCJfXCIgPyBudWxsIDpcbiAgICAgICAgICAgICAgICBtYXJrRXhwciA/IGdhdGhlck1hcmtzKHRoaXMsIG1hcmtFeHByLnNwbGl0KFwiIFwiKSkgOlxuICAgICAgICAgICAgICAgICAgICBtYXJrRXhwciA9PSBcIlwiIHx8ICF0eXBlLmlubGluZUNvbnRlbnQgPyBbXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLm1hcmtzKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMubWFya3NbcHJvcF0sIGV4Y2wgPSB0eXBlLnNwZWMuZXhjbHVkZXM7XG4gICAgICAgICAgICB0eXBlLmV4Y2x1ZGVkID0gZXhjbCA9PSBudWxsID8gW3R5cGVdIDogZXhjbCA9PSBcIlwiID8gW10gOiBnYXRoZXJNYXJrcyh0aGlzLCBleGNsLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlRnJvbUpTT04gPSB0aGlzLm5vZGVGcm9tSlNPTi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm1hcmtGcm9tSlNPTiA9IHRoaXMubWFya0Zyb21KU09OLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudG9wTm9kZVR5cGUgPSB0aGlzLm5vZGVzW3RoaXMuc3BlYy50b3BOb2RlIHx8IFwiZG9jXCJdO1xuICAgICAgICB0aGlzLmNhY2hlZC53cmFwcGluZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIGluIHRoaXMgc2NoZW1hLiBUaGUgYHR5cGVgIG1heSBiZSBhIHN0cmluZyBvciBhXG4gICAgYE5vZGVUeXBlYCBpbnN0YW5jZS4gQXR0cmlidXRlcyB3aWxsIGJlIGV4dGVuZGVkIHdpdGggZGVmYXVsdHMsXG4gICAgYGNvbnRlbnRgIG1heSBiZSBhIGBGcmFnbWVudGAsIGBudWxsYCwgYSBgTm9kZWAsIG9yIGFuIGFycmF5IG9mXG4gICAgbm9kZXMuXG4gICAgKi9cbiAgICBub2RlKHR5cGUsIGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0eXBlID0gdGhpcy5ub2RlVHlwZSh0eXBlKTtcbiAgICAgICAgZWxzZSBpZiAoISh0eXBlIGluc3RhbmNlb2YgTm9kZVR5cGUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIG5vZGUgdHlwZTogXCIgKyB0eXBlKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZS5zY2hlbWEgIT0gdGhpcylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm9kZSB0eXBlIGZyb20gZGlmZmVyZW50IHNjaGVtYSB1c2VkIChcIiArIHR5cGUubmFtZSArIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlQ2hlY2tlZChhdHRycywgY29udGVudCwgbWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0ZXh0IG5vZGUgaW4gdGhlIHNjaGVtYS4gRW1wdHkgdGV4dCBub2RlcyBhcmUgbm90XG4gICAgYWxsb3dlZC5cbiAgICAqL1xuICAgIHRleHQodGV4dCwgbWFya3MpIHtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLm5vZGVzLnRleHQ7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUodHlwZSwgdHlwZS5kZWZhdWx0QXR0cnMsIHRleHQsIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBtYXJrKHR5cGUsIGF0dHJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdHlwZSA9IHRoaXMubWFya3NbdHlwZV07XG4gICAgICAgIHJldHVybiB0eXBlLmNyZWF0ZShhdHRycyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIGJvdW5kLlxuICAgICovXG4gICAgbm9kZUZyb21KU09OKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIE5vZGUuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIGJvdW5kLlxuICAgICovXG4gICAgbWFya0Zyb21KU09OKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIE1hcmsuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbm9kZVR5cGUobmFtZSkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLm5vZGVzW25hbWVdO1xuICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVbmtub3duIG5vZGUgdHlwZTogXCIgKyBuYW1lKTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdhdGhlck1hcmtzKHNjaGVtYSwgbWFya3MpIHtcbiAgICBsZXQgZm91bmQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBuYW1lID0gbWFya3NbaV0sIG1hcmsgPSBzY2hlbWEubWFya3NbbmFtZV0sIG9rID0gbWFyaztcbiAgICAgICAgaWYgKG1hcmspIHtcbiAgICAgICAgICAgIGZvdW5kLnB1c2gobWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNjaGVtYS5tYXJrcykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gc2NoZW1hLm1hcmtzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwiX1wiIHx8IChtYXJrLnNwZWMuZ3JvdXAgJiYgbWFyay5zcGVjLmdyb3VwLnNwbGl0KFwiIFwiKS5pbmRleE9mKG5hbWUpID4gLTEpKVxuICAgICAgICAgICAgICAgICAgICBmb3VuZC5wdXNoKG9rID0gbWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvaylcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlVua25vd24gbWFyayB0eXBlOiAnXCIgKyBtYXJrc1tpXSArIFwiJ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG4vKipcbkEgRE9NIHBhcnNlciByZXByZXNlbnRzIGEgc3RyYXRlZ3kgZm9yIHBhcnNpbmcgRE9NIGNvbnRlbnQgaW50byBhXG5Qcm9zZU1pcnJvciBkb2N1bWVudCBjb25mb3JtaW5nIHRvIGEgZ2l2ZW4gc2NoZW1hLiBJdHMgYmVoYXZpb3IgaXNcbmRlZmluZWQgYnkgYW4gYXJyYXkgb2YgW3J1bGVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlKS5cbiovXG5jbGFzcyBET01QYXJzZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBhcnNlciB0aGF0IHRhcmdldHMgdGhlIGdpdmVuIHNjaGVtYSwgdXNpbmcgdGhlIGdpdmVuXG4gICAgcGFyc2luZyBydWxlcy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzY2hlbWEgaW50byB3aGljaCB0aGUgcGFyc2VyIHBhcnNlcy5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhlIHNldCBvZiBbcGFyc2UgcnVsZXNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5QYXJzZVJ1bGUpIHRoYXQgdGhlIHBhcnNlclxuICAgIHVzZXMsIGluIG9yZGVyIG9mIHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBydWxlcykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudGFncyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3R5bGVzID0gW107XG4gICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICBpZiAocnVsZS50YWcpXG4gICAgICAgICAgICAgICAgdGhpcy50YWdzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChydWxlLnN0eWxlKVxuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbmx5IG5vcm1hbGl6ZSBsaXN0IGVsZW1lbnRzIHdoZW4gbGlzdHMgaW4gdGhlIHNjaGVtYSBjYW4ndCBkaXJlY3RseSBjb250YWluIHRoZW1zZWx2ZXNcbiAgICAgICAgdGhpcy5ub3JtYWxpemVMaXN0cyA9ICF0aGlzLnRhZ3Muc29tZShyID0+IHtcbiAgICAgICAgICAgIGlmICghL14odWx8b2wpXFxiLy50ZXN0KHIudGFnKSB8fCAhci5ub2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBub2RlID0gc2NoZW1hLm5vZGVzW3Iubm9kZV07XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUGFyc2UgYSBkb2N1bWVudCBmcm9tIHRoZSBjb250ZW50IG9mIGEgRE9NIG5vZGUuXG4gICAgKi9cbiAgICBwYXJzZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgICBjb250ZXh0LmFkZEFsbChkb20sIG9wdGlvbnMuZnJvbSwgb3B0aW9ucy50byk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBQYXJzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBub2RlLCBsaWtlXG4gICAgW2BwYXJzZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5ET01QYXJzZXIucGFyc2UpLCBhbmQgdGFrZXMgdGhlIHNhbWUgc2V0IG9mXG4gICAgb3B0aW9ucy4gQnV0IHVubGlrZSB0aGF0IG1ldGhvZCwgd2hpY2ggcHJvZHVjZXMgYSB3aG9sZSBub2RlLFxuICAgIHRoaXMgb25lIHJldHVybnMgYSBzbGljZSB0aGF0IGlzIG9wZW4gYXQgdGhlIHNpZGVzLCBtZWFuaW5nIHRoYXRcbiAgICB0aGUgc2NoZW1hIGNvbnN0cmFpbnRzIGFyZW4ndCBhcHBsaWVkIHRvIHRoZSBzdGFydCBvZiBub2RlcyB0b1xuICAgIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBhbmQgdGhlIGVuZCBvZiBub2RlcyBhdCB0aGUgZW5kLlxuICAgICovXG4gICAgcGFyc2VTbGljZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuYWRkQWxsKGRvbSwgb3B0aW9ucy5mcm9tLCBvcHRpb25zLnRvKTtcbiAgICAgICAgcmV0dXJuIFNsaWNlLm1heE9wZW4oY29udGV4dC5maW5pc2goKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF0Y2hUYWcoZG9tLCBjb250ZXh0LCBhZnRlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gYWZ0ZXIgPyB0aGlzLnRhZ3MuaW5kZXhPZihhZnRlcikgKyAxIDogMDsgaSA8IHRoaXMudGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJ1bGUgPSB0aGlzLnRhZ3NbaV07XG4gICAgICAgICAgICBpZiAobWF0Y2hlcyhkb20sIHJ1bGUudGFnKSAmJlxuICAgICAgICAgICAgICAgIChydWxlLm5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkIHx8IGRvbS5uYW1lc3BhY2VVUkkgPT0gcnVsZS5uYW1lc3BhY2UpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlLmNvbnRleHQgfHwgY29udGV4dC5tYXRjaGVzQ29udGV4dChydWxlLmNvbnRleHQpKSkge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBydWxlLmdldEF0dHJzKGRvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUuYXR0cnMgPSByZXN1bHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hdGNoU3R5bGUocHJvcCwgdmFsdWUsIGNvbnRleHQsIGFmdGVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZnRlciA/IHRoaXMuc3R5bGVzLmluZGV4T2YoYWZ0ZXIpICsgMSA6IDA7IGkgPCB0aGlzLnN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJ1bGUgPSB0aGlzLnN0eWxlc1tpXSwgc3R5bGUgPSBydWxlLnN0eWxlO1xuICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YocHJvcCkgIT0gMCB8fFxuICAgICAgICAgICAgICAgIHJ1bGUuY29udGV4dCAmJiAhY29udGV4dC5tYXRjaGVzQ29udGV4dChydWxlLmNvbnRleHQpIHx8XG4gICAgICAgICAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBzdHlsZSBzdHJpbmcgZWl0aGVyIHByZWNpc2VseSBtYXRjaGVzIHRoZSBwcm9wLFxuICAgICAgICAgICAgICAgIC8vIG9yIGhhcyBhbiAnPScgc2lnbiBhZnRlciB0aGUgcHJvcCwgZm9sbG93ZWQgYnkgdGhlIGdpdmVuXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgc3R5bGUubGVuZ3RoID4gcHJvcC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHN0eWxlLmNoYXJDb2RlQXQocHJvcC5sZW5ndGgpICE9IDYxIHx8IHN0eWxlLnNsaWNlKHByb3AubGVuZ3RoICsgMSkgIT0gdmFsdWUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJ1bGUuZ2V0QXR0cnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcnVsZS5nZXRBdHRycyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJ1bGUuYXR0cnMgPSByZXN1bHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgc2NoZW1hUnVsZXMoc2NoZW1hKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gaW5zZXJ0KHJ1bGUpIHtcbiAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IHJ1bGUucHJpb3JpdHkgPT0gbnVsbCA/IDUwIDogcnVsZS5wcmlvcml0eSwgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcmVzdWx0W2ldLCBuZXh0UHJpb3JpdHkgPSBuZXh0LnByaW9yaXR5ID09IG51bGwgPyA1MCA6IG5leHQucHJpb3JpdHk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRQcmlvcml0eSA8IHByaW9yaXR5KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UoaSwgMCwgcnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBzY2hlbWEubWFya3MpIHtcbiAgICAgICAgICAgIGxldCBydWxlcyA9IHNjaGVtYS5tYXJrc1tuYW1lXS5zcGVjLnBhcnNlRE9NO1xuICAgICAgICAgICAgaWYgKHJ1bGVzKVxuICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydChydWxlID0gY29weShydWxlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHJ1bGUubWFyayB8fCBydWxlLmlnbm9yZSB8fCBydWxlLmNsZWFyTWFyaykpXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlLm1hcmsgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gc2NoZW1hLm5vZGVzKSB7XG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBzY2hlbWEubm9kZXNbbmFtZV0uc3BlYy5wYXJzZURPTTtcbiAgICAgICAgICAgIGlmIChydWxlcylcbiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnQocnVsZSA9IGNvcHkocnVsZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShydWxlLm5vZGUgfHwgcnVsZS5pZ25vcmUgfHwgcnVsZS5tYXJrKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubm9kZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgRE9NIHBhcnNlciB1c2luZyB0aGUgcGFyc2luZyBydWxlcyBsaXN0ZWQgaW4gYVxuICAgIHNjaGVtYSdzIFtub2RlIHNwZWNzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMucGFyc2VET00pLCByZW9yZGVyZWQgYnlcbiAgICBbcHJpb3JpdHldKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5QYXJzZVJ1bGUucHJpb3JpdHkpLlxuICAgICovXG4gICAgc3RhdGljIGZyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuY2FjaGVkLmRvbVBhcnNlciB8fFxuICAgICAgICAgICAgKHNjaGVtYS5jYWNoZWQuZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcihzY2hlbWEsIERPTVBhcnNlci5zY2hlbWFSdWxlcyhzY2hlbWEpKSk7XG4gICAgfVxufVxuY29uc3QgYmxvY2tUYWdzID0ge1xuICAgIGFkZHJlc3M6IHRydWUsIGFydGljbGU6IHRydWUsIGFzaWRlOiB0cnVlLCBibG9ja3F1b3RlOiB0cnVlLCBjYW52YXM6IHRydWUsXG4gICAgZGQ6IHRydWUsIGRpdjogdHJ1ZSwgZGw6IHRydWUsIGZpZWxkc2V0OiB0cnVlLCBmaWdjYXB0aW9uOiB0cnVlLCBmaWd1cmU6IHRydWUsXG4gICAgZm9vdGVyOiB0cnVlLCBmb3JtOiB0cnVlLCBoMTogdHJ1ZSwgaDI6IHRydWUsIGgzOiB0cnVlLCBoNDogdHJ1ZSwgaDU6IHRydWUsXG4gICAgaDY6IHRydWUsIGhlYWRlcjogdHJ1ZSwgaGdyb3VwOiB0cnVlLCBocjogdHJ1ZSwgbGk6IHRydWUsIG5vc2NyaXB0OiB0cnVlLCBvbDogdHJ1ZSxcbiAgICBvdXRwdXQ6IHRydWUsIHA6IHRydWUsIHByZTogdHJ1ZSwgc2VjdGlvbjogdHJ1ZSwgdGFibGU6IHRydWUsIHRmb290OiB0cnVlLCB1bDogdHJ1ZVxufTtcbmNvbnN0IGlnbm9yZVRhZ3MgPSB7XG4gICAgaGVhZDogdHJ1ZSwgbm9zY3JpcHQ6IHRydWUsIG9iamVjdDogdHJ1ZSwgc2NyaXB0OiB0cnVlLCBzdHlsZTogdHJ1ZSwgdGl0bGU6IHRydWVcbn07XG5jb25zdCBsaXN0VGFncyA9IHsgb2w6IHRydWUsIHVsOiB0cnVlIH07XG4vLyBVc2luZyBhIGJpdGZpZWxkIGZvciBub2RlIGNvbnRleHQgb3B0aW9uc1xuY29uc3QgT1BUX1BSRVNFUlZFX1dTID0gMSwgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgPSAyLCBPUFRfT1BFTl9MRUZUID0gNDtcbmZ1bmN0aW9uIHdzT3B0aW9uc0Zvcih0eXBlLCBwcmVzZXJ2ZVdoaXRlc3BhY2UsIGJhc2UpIHtcbiAgICBpZiAocHJlc2VydmVXaGl0ZXNwYWNlICE9IG51bGwpXG4gICAgICAgIHJldHVybiAocHJlc2VydmVXaGl0ZXNwYWNlID8gT1BUX1BSRVNFUlZFX1dTIDogMCkgfFxuICAgICAgICAgICAgKHByZXNlcnZlV2hpdGVzcGFjZSA9PT0gXCJmdWxsXCIgPyBPUFRfUFJFU0VSVkVfV1NfRlVMTCA6IDApO1xuICAgIHJldHVybiB0eXBlICYmIHR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiID8gT1BUX1BSRVNFUlZFX1dTIHwgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgOiBiYXNlICYgfk9QVF9PUEVOX0xFRlQ7XG59XG5jbGFzcyBOb2RlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgYXR0cnMsIFxuICAgIC8vIE1hcmtzIGFwcGxpZWQgdG8gdGhpcyBub2RlIGl0c2VsZlxuICAgIG1hcmtzLCBcbiAgICAvLyBNYXJrcyB0aGF0IGNhbid0IGFwcGx5IGhlcmUsIGJ1dCB3aWxsIGJlIHVzZWQgaW4gY2hpbGRyZW4gaWYgcG9zc2libGVcbiAgICBwZW5kaW5nTWFya3MsIHNvbGlkLCBtYXRjaCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy5wZW5kaW5nTWFya3MgPSBwZW5kaW5nTWFya3M7XG4gICAgICAgIHRoaXMuc29saWQgPSBzb2xpZDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5jb250ZW50ID0gW107XG4gICAgICAgIC8vIE1hcmtzIGFwcGxpZWQgdG8gdGhlIG5vZGUncyBjaGlsZHJlblxuICAgICAgICB0aGlzLmFjdGl2ZU1hcmtzID0gTWFyay5ub25lO1xuICAgICAgICAvLyBOZXN0ZWQgTWFya3Mgd2l0aCBzYW1lIHR5cGVcbiAgICAgICAgdGhpcy5zdGFzaE1hcmtzID0gW107XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaCB8fCAob3B0aW9ucyAmIE9QVF9PUEVOX0xFRlQgPyBudWxsIDogdHlwZS5jb250ZW50TWF0Y2gpO1xuICAgIH1cbiAgICBmaW5kV3JhcHBpbmcobm9kZSkge1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2gpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBmaWxsID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgICAgICAgICAgaWYgKGZpbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGZpbGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaCwgd3JhcDtcbiAgICAgICAgICAgICAgICBpZiAod3JhcCA9IHN0YXJ0LmZpbmRXcmFwcGluZyhub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2guZmluZFdyYXBwaW5nKG5vZGUudHlwZSk7XG4gICAgfVxuICAgIGZpbmlzaChvcGVuRW5kKSB7XG4gICAgICAgIGlmICghKHRoaXMub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XUykpIHsgLy8gU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdLCBtO1xuICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC5pc1RleHQgJiYgKG0gPSAvWyBcXHRcXHJcXG5cXHUwMDBjXSskLy5leGVjKGxhc3QudGV4dCkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsYXN0LnRleHQubGVuZ3RoID09IG1bMF0ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucG9wKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdID0gdGV4dC53aXRoVGV4dCh0ZXh0LnRleHQuc2xpY2UoMCwgdGV4dC50ZXh0Lmxlbmd0aCAtIG1bMF0ubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHRoaXMuY29udGVudCk7XG4gICAgICAgIGlmICghb3BlbkVuZCAmJiB0aGlzLm1hdGNoKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuYXBwZW5kKHRoaXMubWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID8gdGhpcy50eXBlLmNyZWF0ZSh0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKSA6IGNvbnRlbnQ7XG4gICAgfVxuICAgIHBvcEZyb21TdGFzaE1hcmsobWFyaykge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFzaE1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgaWYgKG1hcmsuZXEodGhpcy5zdGFzaE1hcmtzW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFzaE1hcmtzLnNwbGljZShpLCAxKVswXTtcbiAgICB9XG4gICAgYXBwbHlQZW5kaW5nKG5leHRUeXBlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nTWFya3M7IGkgPCBwZW5kaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFyayA9IHBlbmRpbmdbaV07XG4gICAgICAgICAgICBpZiAoKHRoaXMudHlwZSA/IHRoaXMudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrLnR5cGUpIDogbWFya01heUFwcGx5KG1hcmsudHlwZSwgbmV4dFR5cGUpKSAmJlxuICAgICAgICAgICAgICAgICFtYXJrLmlzSW5TZXQodGhpcy5hY3RpdmVNYXJrcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU1hcmtzID0gbWFyay5hZGRUb1NldCh0aGlzLmFjdGl2ZU1hcmtzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdNYXJrcyA9IG1hcmsucmVtb3ZlRnJvbVNldCh0aGlzLnBlbmRpbmdNYXJrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5saW5lQ29udGV4dChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmlubGluZUNvbnRlbnQ7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFswXS5pc0lubGluZTtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSAmJiAhYmxvY2tUYWdzLmhhc093blByb3BlcnR5KG5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG59XG5jbGFzcyBQYXJzZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBwYXJzZXIgd2UgYXJlIHVzaW5nLlxuICAgIHBhcnNlciwgXG4gICAgLy8gVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoaXMgcGFyc2UuXG4gICAgb3B0aW9ucywgaXNPcGVuKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGlzT3BlbjtcbiAgICAgICAgdGhpcy5vcGVuID0gMDtcbiAgICAgICAgbGV0IHRvcE5vZGUgPSBvcHRpb25zLnRvcE5vZGUsIHRvcENvbnRleHQ7XG4gICAgICAgIGxldCB0b3BPcHRpb25zID0gd3NPcHRpb25zRm9yKG51bGwsIG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlLCAwKSB8IChpc09wZW4gPyBPUFRfT1BFTl9MRUZUIDogMCk7XG4gICAgICAgIGlmICh0b3BOb2RlKVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dCh0b3BOb2RlLnR5cGUsIHRvcE5vZGUuYXR0cnMsIE1hcmsubm9uZSwgTWFyay5ub25lLCB0cnVlLCBvcHRpb25zLnRvcE1hdGNoIHx8IHRvcE5vZGUudHlwZS5jb250ZW50TWF0Y2gsIHRvcE9wdGlvbnMpO1xuICAgICAgICBlbHNlIGlmIChpc09wZW4pXG4gICAgICAgICAgICB0b3BDb250ZXh0ID0gbmV3IE5vZGVDb250ZXh0KG51bGwsIG51bGwsIE1hcmsubm9uZSwgTWFyay5ub25lLCB0cnVlLCBudWxsLCB0b3BPcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dChwYXJzZXIuc2NoZW1hLnRvcE5vZGVUeXBlLCBudWxsLCBNYXJrLm5vbmUsIE1hcmsubm9uZSwgdHJ1ZSwgbnVsbCwgdG9wT3B0aW9ucyk7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbdG9wQ29udGV4dF07XG4gICAgICAgIHRoaXMuZmluZCA9IG9wdGlvbnMuZmluZFBvc2l0aW9ucztcbiAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCB0b3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzW3RoaXMub3Blbl07XG4gICAgfVxuICAgIC8vIEFkZCBhIERPTSBub2RlIHRvIHRoZSBjb250ZW50LiBUZXh0IGlzIGluc2VydGVkIGFzIHRleHQgbm9kZSxcbiAgICAvLyBvdGhlcndpc2UsIHRoZSBub2RlIGlzIHBhc3NlZCB0byBgYWRkRWxlbWVudGAgb3IsIGlmIGl0IGhhcyBhXG4gICAgLy8gYHN0eWxlYCBhdHRyaWJ1dGUsIGBhZGRFbGVtZW50V2l0aFN0eWxlc2AuXG4gICAgYWRkRE9NKGRvbSkge1xuICAgICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKGRvbSk7XG4gICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KGRvbSk7XG4gICAgfVxuICAgIHdpdGhTdHlsZVJ1bGVzKGRvbSwgZikge1xuICAgICAgICBsZXQgc3R5bGUgPSBkb20uZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgIGlmICghc3R5bGUpXG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICBsZXQgbWFya3MgPSB0aGlzLnJlYWRTdHlsZXMocGFyc2VTdHlsZXMoc3R5bGUpKTtcbiAgICAgICAgaWYgKCFtYXJrcylcbiAgICAgICAgICAgIHJldHVybjsgLy8gQSBzdHlsZSB3aXRoIGlnbm9yZTogdHJ1ZVxuICAgICAgICBsZXQgW2FkZE1hcmtzLCByZW1vdmVNYXJrc10gPSBtYXJrcywgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlTWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVBlbmRpbmdNYXJrKHJlbW92ZU1hcmtzW2ldLCB0b3ApO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZE1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5hZGRQZW5kaW5nTWFyayhhZGRNYXJrc1tpXSk7XG4gICAgICAgIGYoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRNYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUGVuZGluZ01hcmsoYWRkTWFya3NbaV0sIHRvcCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlTWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmFkZFBlbmRpbmdNYXJrKHJlbW92ZU1hcmtzW2ldKTtcbiAgICB9XG4gICAgYWRkVGV4dE5vZGUoZG9tKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGRvbS5ub2RlVmFsdWU7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcDtcbiAgICAgICAgaWYgKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgfHxcbiAgICAgICAgICAgIHRvcC5pbmxpbmVDb250ZXh0KGRvbSkgfHxcbiAgICAgICAgICAgIC9bXiBcXHRcXHJcXG5cXHUwMDBjXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICghKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvWyBcXHRcXHJcXG5cXHUwMDBjXSsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3RhcnRzIHdpdGggd2hpdGVzcGFjZSwgYW5kIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlIGl0LCBvclxuICAgICAgICAgICAgICAgIC8vIGEgaGFyZCBicmVhaywgb3IgYSB0ZXh0IG5vZGUgdGhhdCBlbmRzIHdpdGggd2hpdGVzcGFjZSwgc3RyaXAgdGhlXG4gICAgICAgICAgICAgICAgLy8gbGVhZGluZyBzcGFjZS5cbiAgICAgICAgICAgICAgICBpZiAoL15bIFxcdFxcclxcblxcdTAwMGNdLy50ZXN0KHZhbHVlKSAmJiB0aGlzLm9wZW4gPT0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlQmVmb3JlID0gdG9wLmNvbnRlbnRbdG9wLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb21Ob2RlQmVmb3JlID0gZG9tLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlQmVmb3JlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZG9tTm9kZUJlZm9yZSAmJiBkb21Ob2RlQmVmb3JlLm5vZGVOYW1lID09ICdCUicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAobm9kZUJlZm9yZS5pc1RleHQgJiYgL1sgXFx0XFxyXFxuXFx1MDAwY10kLy50ZXN0KG5vZGVCZWZvcmUudGV4dCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTX0ZVTEwpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnROb2RlKHRoaXMucGFyc2VyLnNjaGVtYS50ZXh0KHZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLmZpbmRJblRleHQoZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIHRhZyBhbmQgdXNlIHRoYXQgdG8gcGFyc2UuIElmXG4gICAgLy8gbm9uZSBpcyBmb3VuZCwgdGhlIGVsZW1lbnQncyBjb250ZW50IG5vZGVzIGFyZSBhZGRlZCBkaXJlY3RseS5cbiAgICBhZGRFbGVtZW50KGRvbSwgbWF0Y2hBZnRlcikge1xuICAgICAgICBsZXQgbmFtZSA9IGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBydWxlSUQ7XG4gICAgICAgIGlmIChsaXN0VGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB0aGlzLnBhcnNlci5ub3JtYWxpemVMaXN0cylcbiAgICAgICAgICAgIG5vcm1hbGl6ZUxpc3QoZG9tKTtcbiAgICAgICAgbGV0IHJ1bGUgPSAodGhpcy5vcHRpb25zLnJ1bGVGcm9tTm9kZSAmJiB0aGlzLm9wdGlvbnMucnVsZUZyb21Ob2RlKGRvbSkpIHx8XG4gICAgICAgICAgICAocnVsZUlEID0gdGhpcy5wYXJzZXIubWF0Y2hUYWcoZG9tLCB0aGlzLCBtYXRjaEFmdGVyKSk7XG4gICAgICAgIGlmIChydWxlID8gcnVsZS5pZ25vcmUgOiBpZ25vcmVUYWdzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlRmFsbGJhY2soZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcnVsZSB8fCBydWxlLnNraXAgfHwgcnVsZS5jbG9zZVBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5jbG9zZVBhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBNYXRoLm1heCgwLCB0aGlzLm9wZW4gLSAxKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUgJiYgcnVsZS5za2lwLm5vZGVUeXBlKVxuICAgICAgICAgICAgICAgIGRvbSA9IHJ1bGUuc2tpcDtcbiAgICAgICAgICAgIGxldCBzeW5jLCB0b3AgPSB0aGlzLnRvcCwgb2xkTmVlZHNCbG9jayA9IHRoaXMubmVlZHNCbG9jaztcbiAgICAgICAgICAgIGlmIChibG9ja1RhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wLmNvbnRlbnQubGVuZ3RoICYmIHRvcC5jb250ZW50WzBdLmlzSW5saW5lICYmIHRoaXMub3Blbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4tLTtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGhpcy50b3A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghdG9wLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZG9tLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxlYWZGYWxsYmFjayhkb20pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUuc2tpcClcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFsbChkb20pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFN0eWxlUnVsZXMoZG9tLCAoKSA9PiB0aGlzLmFkZEFsbChkb20pKTtcbiAgICAgICAgICAgIGlmIChzeW5jKVxuICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gb2xkTmVlZHNCbG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFN0eWxlUnVsZXMoZG9tLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50QnlSdWxlKGRvbSwgcnVsZSwgcnVsZS5jb25zdW1pbmcgPT09IGZhbHNlID8gcnVsZUlEIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbGxlZCBmb3IgbGVhZiBET00gbm9kZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaWdub3JlZFxuICAgIGxlYWZGYWxsYmFjayhkb20pIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgdGhpcy50b3AudHlwZSAmJiB0aGlzLnRvcC50eXBlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKGRvbS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXFxuXCIpKTtcbiAgICB9XG4gICAgLy8gQ2FsbGVkIGZvciBpZ25vcmVkIG5vZGVzXG4gICAgaWdub3JlRmFsbGJhY2soZG9tKSB7XG4gICAgICAgIC8vIElnbm9yZWQgQlIgbm9kZXMgc2hvdWxkIGF0IGxlYXN0IGNyZWF0ZSBhbiBpbmxpbmUgY29udGV4dFxuICAgICAgICBpZiAoZG9tLm5vZGVOYW1lID09IFwiQlJcIiAmJiAoIXRoaXMudG9wLnR5cGUgfHwgIXRoaXMudG9wLnR5cGUuaW5saW5lQ29udGVudCkpXG4gICAgICAgICAgICB0aGlzLmZpbmRQbGFjZSh0aGlzLnBhcnNlci5zY2hlbWEudGV4dChcIi1cIikpO1xuICAgIH1cbiAgICAvLyBSdW4gYW55IHN0eWxlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUncyBzdHlsZXMuIEVpdGhlclxuICAgIC8vIHJldHVybiBhbiBhcnJheSBvZiBtYXJrcywgb3IgbnVsbCB0byBpbmRpY2F0ZSBzb21lIG9mIHRoZSBzdHlsZXNcbiAgICAvLyBoYWQgYSBydWxlIHdpdGggYGlnbm9yZWAgc2V0LlxuICAgIHJlYWRTdHlsZXMoc3R5bGVzKSB7XG4gICAgICAgIGxldCBhZGQgPSBNYXJrLm5vbmUsIHJlbW92ZSA9IE1hcmsubm9uZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGFmdGVyID0gdW5kZWZpbmVkOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHRoaXMucGFyc2VyLm1hdGNoU3R5bGUoc3R5bGVzW2ldLCBzdHlsZXNbaSArIDFdLCB0aGlzLCBhZnRlcik7XG4gICAgICAgICAgICAgICAgaWYgKCFydWxlKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5pZ25vcmUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmNsZWFyTWFyaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcC5wZW5kaW5nTWFya3MuY29uY2F0KHRoaXMudG9wLmFjdGl2ZU1hcmtzKS5mb3JFYWNoKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY2xlYXJNYXJrKG0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IG0uYWRkVG9TZXQocmVtb3ZlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGQgPSB0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXS5jcmVhdGUocnVsZS5hdHRycykuYWRkVG9TZXQoYWRkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuY29uc3VtaW5nID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBydWxlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFthZGQsIHJlbW92ZV07XG4gICAgfVxuICAgIC8vIExvb2sgdXAgYSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gbm9kZS4gSWYgbm9uZSBhcmUgZm91bmQsIHJldHVyblxuICAgIC8vIGZhbHNlLiBPdGhlcndpc2UsIGFwcGx5IGl0LCB1c2UgaXRzIHJldHVybiB2YWx1ZSB0byBkcml2ZSB0aGUgd2F5XG4gICAgLy8gdGhlIG5vZGUncyBjb250ZW50IGlzIHdyYXBwZWQsIGFuZCByZXR1cm4gdHJ1ZS5cbiAgICBhZGRFbGVtZW50QnlSdWxlKGRvbSwgcnVsZSwgY29udGludWVBZnRlcikge1xuICAgICAgICBsZXQgc3luYywgbm9kZVR5cGUsIG1hcms7XG4gICAgICAgIGlmIChydWxlLm5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVUeXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW3J1bGUubm9kZV07XG4gICAgICAgICAgICBpZiAoIW5vZGVUeXBlLmlzTGVhZikge1xuICAgICAgICAgICAgICAgIHN5bmMgPSB0aGlzLmVudGVyKG5vZGVUeXBlLCBydWxlLmF0dHJzIHx8IG51bGwsIHJ1bGUucHJlc2VydmVXaGl0ZXNwYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmluc2VydE5vZGUobm9kZVR5cGUuY3JlYXRlKHJ1bGUuYXR0cnMpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVhZkZhbGxiYWNrKGRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFya1R5cGUgPSB0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXTtcbiAgICAgICAgICAgIG1hcmsgPSBtYXJrVHlwZS5jcmVhdGUocnVsZS5hdHRycyk7XG4gICAgICAgICAgICB0aGlzLmFkZFBlbmRpbmdNYXJrKG1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydEluID0gdGhpcy50b3A7XG4gICAgICAgIGlmIChub2RlVHlwZSAmJiBub2RlVHlwZS5pc0xlYWYpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRpbnVlQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudChkb20sIGNvbnRpbnVlQWZ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGUuZ2V0Q29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgICAgICBydWxlLmdldENvbnRlbnQoZG9tLCB0aGlzLnBhcnNlci5zY2hlbWEpLmZvckVhY2gobm9kZSA9PiB0aGlzLmluc2VydE5vZGUobm9kZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRET00gPSBkb207XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUuY29udGVudEVsZW1lbnQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gZG9tLnF1ZXJ5U2VsZWN0b3IocnVsZS5jb250ZW50RWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcnVsZS5jb250ZW50RWxlbWVudCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQoZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUuY29udGVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmZpbmRBcm91bmQoZG9tLCBjb250ZW50RE9NLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQWxsKGNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW5jICYmIHRoaXMuc3luYyhzdGFydEluKSlcbiAgICAgICAgICAgIHRoaXMub3Blbi0tO1xuICAgICAgICBpZiAobWFyaylcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUGVuZGluZ01hcmsobWFyaywgc3RhcnRJbik7XG4gICAgfVxuICAgIC8vIEFkZCBhbGwgY2hpbGQgbm9kZXMgYmV0d2VlbiBgc3RhcnRJbmRleGAgYW5kIGBlbmRJbmRleGAgKG9yIHRoZVxuICAgIC8vIHdob2xlIG5vZGUsIGlmIG5vdCBnaXZlbikuIElmIGBzeW5jYCBpcyBwYXNzZWQsIHVzZSBpdCB0b1xuICAgIC8vIHN5bmNocm9uaXplIGFmdGVyIGV2ZXJ5IGJsb2NrIGVsZW1lbnQuXG4gICAgYWRkQWxsKHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gc3RhcnRJbmRleCB8fCAwO1xuICAgICAgICBmb3IgKGxldCBkb20gPSBzdGFydEluZGV4ID8gcGFyZW50LmNoaWxkTm9kZXNbc3RhcnRJbmRleF0gOiBwYXJlbnQuZmlyc3RDaGlsZCwgZW5kID0gZW5kSW5kZXggPT0gbnVsbCA/IG51bGwgOiBwYXJlbnQuY2hpbGROb2Rlc1tlbmRJbmRleF07IGRvbSAhPSBlbmQ7IGRvbSA9IGRvbS5uZXh0U2libGluZywgKytpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRE9NKGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpbmQgYSB3YXkgdG8gZml0IHRoZSBnaXZlbiBub2RlIHR5cGUgaW50byB0aGUgY3VycmVudFxuICAgIC8vIGNvbnRleHQuIE1heSBhZGQgaW50ZXJtZWRpYXRlIHdyYXBwZXJzIGFuZC9vciBsZWF2ZSBub24tc29saWRcbiAgICAvLyBub2RlcyB0aGF0IHdlJ3JlIGluLlxuICAgIGZpbmRQbGFjZShub2RlKSB7XG4gICAgICAgIGxldCByb3V0ZSwgc3luYztcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSB0aGlzLm9wZW47IGRlcHRoID49IDA7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBjeCA9IHRoaXMubm9kZXNbZGVwdGhdO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gY3guZmluZFdyYXBwaW5nKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGZvdW5kICYmICghcm91dGUgfHwgcm91dGUubGVuZ3RoID4gZm91bmQubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIHJvdXRlID0gZm91bmQ7XG4gICAgICAgICAgICAgICAgc3luYyA9IGN4O1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjeC5zb2xpZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnN5bmMoc3luYyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmVudGVySW5uZXIocm91dGVbaV0sIG51bGwsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFRyeSB0byBpbnNlcnQgdGhlIGdpdmVuIG5vZGUsIGFkanVzdGluZyB0aGUgY29udGV4dCB3aGVuIG5lZWRlZC5cbiAgICBpbnNlcnROb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuaXNJbmxpbmUgJiYgdGhpcy5uZWVkc0Jsb2NrICYmICF0aGlzLnRvcC50eXBlKSB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLnRleHRibG9ja0Zyb21Db250ZXh0KCk7XG4gICAgICAgICAgICBpZiAoYmxvY2spXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRlcklubmVyKGJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maW5kUGxhY2Uobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wO1xuICAgICAgICAgICAgdG9wLmFwcGx5UGVuZGluZyhub2RlLnR5cGUpO1xuICAgICAgICAgICAgaWYgKHRvcC5tYXRjaClcbiAgICAgICAgICAgICAgICB0b3AubWF0Y2ggPSB0b3AubWF0Y2gubWF0Y2hUeXBlKG5vZGUudHlwZSk7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSB0b3AuYWN0aXZlTWFya3M7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0b3AudHlwZSB8fCB0b3AudHlwZS5hbGxvd3NNYXJrVHlwZShub2RlLm1hcmtzW2ldLnR5cGUpKVxuICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG5vZGUubWFya3NbaV0uYWRkVG9TZXQobWFya3MpO1xuICAgICAgICAgICAgdG9wLmNvbnRlbnQucHVzaChub2RlLm1hcmsobWFya3MpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIHN0YXJ0IGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSwgYWRqdXN0aW5nIHRoZSBjb250ZXh0IHdoZW5cbiAgICAvLyBuZWNlc3NhcnkuXG4gICAgZW50ZXIodHlwZSwgYXR0cnMsIHByZXNlcnZlV1MpIHtcbiAgICAgICAgbGV0IG9rID0gdGhpcy5maW5kUGxhY2UodHlwZS5jcmVhdGUoYXR0cnMpKTtcbiAgICAgICAgaWYgKG9rKVxuICAgICAgICAgICAgdGhpcy5lbnRlcklubmVyKHR5cGUsIGF0dHJzLCB0cnVlLCBwcmVzZXJ2ZVdTKTtcbiAgICAgICAgcmV0dXJuIG9rO1xuICAgIH1cbiAgICAvLyBPcGVuIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICAgIGVudGVySW5uZXIodHlwZSwgYXR0cnMgPSBudWxsLCBzb2xpZCA9IGZhbHNlLCBwcmVzZXJ2ZVdTKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIHRvcC5hcHBseVBlbmRpbmcodHlwZSk7XG4gICAgICAgIHRvcC5tYXRjaCA9IHRvcC5tYXRjaCAmJiB0b3AubWF0Y2gubWF0Y2hUeXBlKHR5cGUpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHdzT3B0aW9uc0Zvcih0eXBlLCBwcmVzZXJ2ZVdTLCB0b3Aub3B0aW9ucyk7XG4gICAgICAgIGlmICgodG9wLm9wdGlvbnMgJiBPUFRfT1BFTl9MRUZUKSAmJiB0b3AuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIG9wdGlvbnMgfD0gT1BUX09QRU5fTEVGVDtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBOb2RlQ29udGV4dCh0eXBlLCBhdHRycywgdG9wLmFjdGl2ZU1hcmtzLCB0b3AucGVuZGluZ01hcmtzLCBzb2xpZCwgbnVsbCwgb3B0aW9ucykpO1xuICAgICAgICB0aGlzLm9wZW4rKztcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGFsbCBub2RlcyBhYm92ZSB0aGlzLm9wZW4gYXJlIGZpbmlzaGVkIGFuZCBhZGRlZCB0b1xuICAgIC8vIHRoZWlyIHBhcmVudHNcbiAgICBjbG9zZUV4dHJhKG9wZW5FbmQgPSBmYWxzZSkge1xuICAgICAgICBsZXQgaSA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGkgPiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIGZvciAoOyBpID4gdGhpcy5vcGVuOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tpIC0gMV0uY29udGVudC5wdXNoKHRoaXMubm9kZXNbaV0uZmluaXNoKG9wZW5FbmQpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMubGVuZ3RoID0gdGhpcy5vcGVuICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IDA7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSh0aGlzLmlzT3Blbik7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdLmZpbmlzaCh0aGlzLmlzT3BlbiB8fCB0aGlzLm9wdGlvbnMudG9wT3Blbik7XG4gICAgfVxuICAgIHN5bmModG8pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbjsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlc1tpXSA9PSB0bykge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IGk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRQb3MoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5ub2Rlc1tpXS5jb250ZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGNvbnRlbnQubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pXG4gICAgICAgICAgICAgICAgcG9zICs9IGNvbnRlbnRbal0ubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICBmaW5kQXRQb2ludChwYXJlbnQsIG9mZnNldCkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLm5vZGUgPT0gcGFyZW50ICYmIHRoaXMuZmluZFtpXS5vZmZzZXQgPT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kSW5zaWRlKHBhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLnBvcyA9PSBudWxsICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxICYmIHBhcmVudC5jb250YWlucyh0aGlzLmZpbmRbaV0ubm9kZSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3M7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRBcm91bmQocGFyZW50LCBjb250ZW50LCBiZWZvcmUpIHtcbiAgICAgICAgaWYgKHBhcmVudCAhPSBjb250ZW50ICYmIHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5wb3MgPT0gbnVsbCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMSAmJiBwYXJlbnQuY29udGFpbnModGhpcy5maW5kW2ldLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMuZmluZFtpXS5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyAmIChiZWZvcmUgPyAyIDogNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZmluZEluVGV4dCh0ZXh0Tm9kZSkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLm5vZGUgPT0gdGV4dE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3MgLSAodGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCAtIHRoaXMuZmluZFtpXS5vZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRleHQgc3RyaW5nIG1hdGNoZXMgdGhpcyBjb250ZXh0LlxuICAgIG1hdGNoZXNDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQuaW5kZXhPZihcInxcIikgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnNwbGl0KC9cXHMqXFx8XFxzKi8pLnNvbWUodGhpcy5tYXRjaGVzQ29udGV4dCwgdGhpcyk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGNvbnRleHQuc3BsaXQoXCIvXCIpO1xuICAgICAgICBsZXQgb3B0aW9uID0gdGhpcy5vcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGxldCB1c2VSb290ID0gIXRoaXMuaXNPcGVuICYmICghb3B0aW9uIHx8IG9wdGlvbi5wYXJlbnQudHlwZSA9PSB0aGlzLm5vZGVzWzBdLnR5cGUpO1xuICAgICAgICBsZXQgbWluRGVwdGggPSAtKG9wdGlvbiA/IG9wdGlvbi5kZXB0aCArIDEgOiAwKSArICh1c2VSb290ID8gMCA6IDEpO1xuICAgICAgICBsZXQgbWF0Y2ggPSAoaSwgZGVwdGgpID0+IHtcbiAgICAgICAgICAgIGZvciAoOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBwYXJ0cy5sZW5ndGggLSAxIHx8IGkgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZGVwdGggPj0gbWluRGVwdGg7IGRlcHRoLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2goaSAtIDEsIGRlcHRoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBkZXB0aCA+IDAgfHwgKGRlcHRoID09IDAgJiYgdXNlUm9vdCkgPyB0aGlzLm5vZGVzW2RlcHRoXS50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbiAmJiBkZXB0aCA+PSBtaW5EZXB0aCA/IG9wdGlvbi5ub2RlKGRlcHRoIC0gbWluRGVwdGgpLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCAobmV4dC5uYW1lICE9IHBhcnQgJiYgbmV4dC5ncm91cHMuaW5kZXhPZihwYXJ0KSA9PSAtMSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtYXRjaChwYXJ0cy5sZW5ndGggLSAxLCB0aGlzLm9wZW4pO1xuICAgIH1cbiAgICB0ZXh0YmxvY2tGcm9tQ29udGV4dCgpIHtcbiAgICAgICAgbGV0ICRjb250ZXh0ID0gdGhpcy5vcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmICgkY29udGV4dClcbiAgICAgICAgICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVmbHQgPSAkY29udGV4dC5ub2RlKGQpLmNvbnRlbnRNYXRjaEF0KCRjb250ZXh0LmluZGV4QWZ0ZXIoZCkpLmRlZmF1bHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmIChkZWZsdCAmJiBkZWZsdC5pc1RleHRibG9jayAmJiBkZWZsdC5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLnBhcnNlci5zY2hlbWEubm9kZXMpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGUuaXNUZXh0YmxvY2sgJiYgdHlwZS5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkUGVuZGluZ01hcmsobWFyaykge1xuICAgICAgICBsZXQgZm91bmQgPSBmaW5kU2FtZU1hcmtJblNldChtYXJrLCB0aGlzLnRvcC5wZW5kaW5nTWFya3MpO1xuICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICB0aGlzLnRvcC5zdGFzaE1hcmtzLnB1c2goZm91bmQpO1xuICAgICAgICB0aGlzLnRvcC5wZW5kaW5nTWFya3MgPSBtYXJrLmFkZFRvU2V0KHRoaXMudG9wLnBlbmRpbmdNYXJrcyk7XG4gICAgfVxuICAgIHJlbW92ZVBlbmRpbmdNYXJrKG1hcmssIHVwdG8pIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSB0aGlzLm9wZW47IGRlcHRoID49IDA7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBsZXZlbCA9IHRoaXMubm9kZXNbZGVwdGhdO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gbGV2ZWwucGVuZGluZ01hcmtzLmxhc3RJbmRleE9mKG1hcmspO1xuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXZlbC5wZW5kaW5nTWFya3MgPSBtYXJrLnJlbW92ZUZyb21TZXQobGV2ZWwucGVuZGluZ01hcmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldmVsLmFjdGl2ZU1hcmtzID0gbWFyay5yZW1vdmVGcm9tU2V0KGxldmVsLmFjdGl2ZU1hcmtzKTtcbiAgICAgICAgICAgICAgICBsZXQgc3Rhc2hNYXJrID0gbGV2ZWwucG9wRnJvbVN0YXNoTWFyayhtYXJrKTtcbiAgICAgICAgICAgICAgICBpZiAoc3Rhc2hNYXJrICYmIGxldmVsLnR5cGUgJiYgbGV2ZWwudHlwZS5hbGxvd3NNYXJrVHlwZShzdGFzaE1hcmsudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIGxldmVsLmFjdGl2ZU1hcmtzID0gc3Rhc2hNYXJrLmFkZFRvU2V0KGxldmVsLmFjdGl2ZU1hcmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZXZlbCA9PSB1cHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIGRpcmVjdGx5IG5lc3RlZCBsaXN0IG5vZGVzIHByb2R1Y2VkIGJ5IHNvbWVcbi8vIHRvb2xzIGFuZCBhbGxvd2VkIGJ5IGJyb3dzZXJzIHRvIG1lYW4gdGhhdCB0aGUgbmVzdGVkIGxpc3QgaXNcbi8vIGFjdHVhbGx5IHBhcnQgb2YgdGhlIGxpc3QgaXRlbSBhYm92ZSBpdC5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpc3QoZG9tKSB7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZCwgcHJldkl0ZW0gPSBudWxsOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgbmFtZSA9IGNoaWxkLm5vZGVUeXBlID09IDEgPyBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgaWYgKG5hbWUgJiYgbGlzdFRhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgcHJldkl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZJdGVtLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIGNoaWxkID0gcHJldkl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHByZXZJdGVtID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSkge1xuICAgICAgICAgICAgcHJldkl0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gQXBwbHkgYSBDU1Mgc2VsZWN0b3IuXG5mdW5jdGlvbiBtYXRjaGVzKGRvbSwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gKGRvbS5tYXRjaGVzIHx8IGRvbS5tc01hdGNoZXNTZWxlY3RvciB8fCBkb20ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGRvbS5tb3pNYXRjaGVzU2VsZWN0b3IpLmNhbGwoZG9tLCBzZWxlY3Rvcik7XG59XG4vLyBUb2tlbml6ZSBhIHN0eWxlIGF0dHJpYnV0ZSBpbnRvIHByb3BlcnR5L3ZhbHVlIHBhaXJzLlxuZnVuY3Rpb24gcGFyc2VTdHlsZXMoc3R5bGUpIHtcbiAgICBsZXQgcmUgPSAvXFxzKihbXFx3LV0rKVxccyo6XFxzKihbXjtdKykvZywgbSwgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKG0gPSByZS5leGVjKHN0eWxlKSlcbiAgICAgICAgcmVzdWx0LnB1c2gobVsxXSwgbVsyXS50cmltKCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb3B5KG9iaikge1xuICAgIGxldCBjb3B5ID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgcmV0dXJuIGNvcHk7XG59XG4vLyBVc2VkIHdoZW4gZmluZGluZyBhIG1hcmsgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZyYWdtZW50IHBhcnNlLlxuLy8gQ2hlY2tzIHdoZXRoZXIgaXQgd291bGQgYmUgcmVhc29uYWJsZSB0byBhcHBseSBhIGdpdmVuIG1hcmsgdHlwZSB0b1xuLy8gYSBnaXZlbiBub2RlLCBieSBsb29raW5nIGF0IHRoZSB3YXkgdGhlIG1hcmsgb2NjdXJzIGluIHRoZSBzY2hlbWEuXG5mdW5jdGlvbiBtYXJrTWF5QXBwbHkobWFya1R5cGUsIG5vZGVUeXBlKSB7XG4gICAgbGV0IG5vZGVzID0gbm9kZVR5cGUuc2NoZW1hLm5vZGVzO1xuICAgIGZvciAobGV0IG5hbWUgaW4gbm9kZXMpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGVzW25hbWVdO1xuICAgICAgICBpZiAoIXBhcmVudC5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IHNlZW4gPSBbXSwgc2NhbiA9IChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKG1hdGNoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2guZWRnZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5lZGdlKGkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG5vZGVUeXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5leHQpIDwgMCAmJiBzY2FuKG5leHQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNjYW4ocGFyZW50LmNvbnRlbnRNYXRjaCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kU2FtZU1hcmtJblNldChtYXJrLCBzZXQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWFyay5lcShzZXRbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIHNldFtpXTtcbiAgICB9XG59XG5cbi8qKlxuQSBET00gc2VyaWFsaXplciBrbm93cyBob3cgdG8gY29udmVydCBQcm9zZU1pcnJvciBub2RlcyBhbmRcbm1hcmtzIG9mIHZhcmlvdXMgdHlwZXMgdG8gRE9NIG5vZGVzLlxuKi9cbmNsYXNzIERPTVNlcmlhbGl6ZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlcmlhbGl6ZXIuIGBub2Rlc2Agc2hvdWxkIG1hcCBub2RlIG5hbWVzIHRvIGZ1bmN0aW9uc1xuICAgIHRoYXQgdGFrZSBhIG5vZGUgYW5kIHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgRE9NLiBgbWFya3NgIGRvZXMgdGhlIHNhbWUgZm9yIG1hcmsgbmFtZXMsIGJ1dCBhbHNvIGdldHMgYW5cbiAgICBhcmd1bWVudCB0aGF0IHRlbGxzIGl0IHdoZXRoZXIgdGhlIG1hcmsncyBjb250ZW50IGlzIGJsb2NrIG9yXG4gICAgaW5saW5lIGNvbnRlbnQgKGZvciB0eXBpY2FsIHVzZSwgaXQnbGwgYWx3YXlzIGJlIGlubGluZSkuIEEgbWFya1xuICAgIHNlcmlhbGl6ZXIgbWF5IGJlIGBudWxsYCB0byBpbmRpY2F0ZSB0aGF0IG1hcmtzIG9mIHRoYXQgdHlwZVxuICAgIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbm9kZXMsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbWFya3MpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGlzIGZyYWdtZW50IHRvIGEgRE9NIGZyYWdtZW50LiBXaGVuXG4gICAgbm90IGluIHRoZSBicm93c2VyLCB0aGUgYGRvY3VtZW50YCBvcHRpb24sIGNvbnRhaW5pbmcgYSBET01cbiAgICBkb2N1bWVudCwgc2hvdWxkIGJlIHBhc3NlZCBzbyB0aGF0IHRoZSBzZXJpYWxpemVyIGNhbiBjcmVhdGVcbiAgICBub2Rlcy5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZUZyYWdtZW50KGZyYWdtZW50LCBvcHRpb25zID0ge30sIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IGRvYyhvcHRpb25zKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGxldCB0b3AgPSB0YXJnZXQsIGFjdGl2ZSA9IFtdO1xuICAgICAgICBmcmFnbWVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggfHwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQga2VlcCA9IDAsIHJlbmRlcmVkID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcCA8IGFjdGl2ZS5sZW5ndGggJiYgcmVuZGVyZWQgPCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUubWFya3NbcmVuZGVyZWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya3NbbmV4dC50eXBlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0LmVxKGFjdGl2ZVtrZWVwXVswXSkgfHwgbmV4dC50eXBlLnNwZWMuc3Bhbm5pbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBhY3RpdmUucG9wKClbMV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlbmRlcmVkIDwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZCA9IG5vZGUubWFya3NbcmVuZGVyZWQrK107XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXJrRE9NID0gdGhpcy5zZXJpYWxpemVNYXJrKGFkZCwgbm9kZS5pc0lubGluZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUucHVzaChbYWRkLCB0b3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5hcHBlbmRDaGlsZChtYXJrRE9NLmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBtYXJrRE9NLmNvbnRlbnRET00gfHwgbWFya0RPTS5kb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b3AuYXBwZW5kQ2hpbGQodGhpcy5zZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgeyBkb20sIGNvbnRlbnRET00gfSA9IERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2Mob3B0aW9ucyksIHRoaXMubm9kZXNbbm9kZS50eXBlLm5hbWVdKG5vZGUpKTtcbiAgICAgICAgaWYgKGNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRlbnQgaG9sZSBub3QgYWxsb3dlZCBpbiBhIGxlYWYgbm9kZSBzcGVjXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVGcmFnbWVudChub2RlLmNvbnRlbnQsIG9wdGlvbnMsIGNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIG5vZGUgdG8gYSBET00gbm9kZS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91XG4gICAgbmVlZCB0byBzZXJpYWxpemUgYSBwYXJ0IG9mIGEgZG9jdW1lbnQsIGFzIG9wcG9zZWQgdG8gdGhlIHdob2xlXG4gICAgZG9jdW1lbnQuIFRvIHNlcmlhbGl6ZSBhIHdob2xlIGRvY3VtZW50LCB1c2VcbiAgICBbYHNlcmlhbGl6ZUZyYWdtZW50YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkRPTVNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQpIG9uXG4gICAgaXRzIFtjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5jb250ZW50KS5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZU5vZGUobm9kZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBkb20gPSB0aGlzLnNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwID0gdGhpcy5zZXJpYWxpemVNYXJrKG5vZGUubWFya3NbaV0sIG5vZGUuaXNJbmxpbmUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHdyYXApIHtcbiAgICAgICAgICAgICAgICAod3JhcC5jb250ZW50RE9NIHx8IHdyYXAuZG9tKS5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IHdyYXAuZG9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2VyaWFsaXplTWFyayhtYXJrLCBpbmxpbmUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgdG9ET00gPSB0aGlzLm1hcmtzW21hcmsudHlwZS5uYW1lXTtcbiAgICAgICAgcmV0dXJuIHRvRE9NICYmIERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2Mob3B0aW9ucyksIHRvRE9NKG1hcmssIGlubGluZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgYW4gW291dHB1dCBzcGVjXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuRE9NT3V0cHV0U3BlYykgdG8gYSBET00gbm9kZS4gSWZcbiAgICB0aGUgc3BlYyBoYXMgYSBob2xlICh6ZXJvKSBpbiBpdCwgYGNvbnRlbnRET01gIHdpbGwgcG9pbnQgYXQgdGhlXG4gICAgbm9kZSB3aXRoIHRoZSBob2xlLlxuICAgICovXG4gICAgc3RhdGljIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TID0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIHN0cnVjdHVyZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgcmV0dXJuIHsgZG9tOiBkb2MuY3JlYXRlVGV4dE5vZGUoc3RydWN0dXJlKSB9O1xuICAgICAgICBpZiAoc3RydWN0dXJlLm5vZGVUeXBlICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4geyBkb206IHN0cnVjdHVyZSB9O1xuICAgICAgICBpZiAoc3RydWN0dXJlLmRvbSAmJiBzdHJ1Y3R1cmUuZG9tLm5vZGVUeXBlICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gc3RydWN0dXJlO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHN0cnVjdHVyZVswXSwgc3BhY2UgPSB0YWdOYW1lLmluZGV4T2YoXCIgXCIpO1xuICAgICAgICBpZiAoc3BhY2UgPiAwKSB7XG4gICAgICAgICAgICB4bWxOUyA9IHRhZ05hbWUuc2xpY2UoMCwgc3BhY2UpO1xuICAgICAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUuc2xpY2Uoc3BhY2UgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudERPTTtcbiAgICAgICAgbGV0IGRvbSA9ICh4bWxOUyA/IGRvYy5jcmVhdGVFbGVtZW50TlMoeG1sTlMsIHRhZ05hbWUpIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpO1xuICAgICAgICBsZXQgYXR0cnMgPSBzdHJ1Y3R1cmVbMV0sIHN0YXJ0ID0gMTtcbiAgICAgICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PSBcIm9iamVjdFwiICYmIGF0dHJzLm5vZGVUeXBlID09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoYXR0cnMpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDI7XG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgICAgIGlmIChhdHRyc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZSA9IG5hbWUuaW5kZXhPZihcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFjZSA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlTlMobmFtZS5zbGljZSgwLCBzcGFjZSksIG5hbWUuc2xpY2Uoc3BhY2UgKyAxKSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIGF0dHJzW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBzdHJ1Y3R1cmVbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHN0cnVjdHVyZS5sZW5ndGggLSAxIHx8IGkgPiBzdGFydClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDb250ZW50IGhvbGUgbXVzdCBiZSB0aGUgb25seSBjaGlsZCBvZiBpdHMgcGFyZW50IG5vZGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9tLCBjb250ZW50RE9NOiBkb20gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB7IGRvbTogaW5uZXIsIGNvbnRlbnRET006IGlubmVyQ29udGVudCB9ID0gRE9NU2VyaWFsaXplci5yZW5kZXJTcGVjKGRvYywgY2hpbGQsIHhtbE5TKTtcbiAgICAgICAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoaW5uZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11bHRpcGxlIGNvbnRlbnQgaG9sZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBpbm5lckNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbSwgY29udGVudERPTSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIHNlcmlhbGl6ZXIgdXNpbmcgdGhlIFtgdG9ET01gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMudG9ET00pXG4gICAgcHJvcGVydGllcyBpbiBhIHNjaGVtYSdzIG5vZGUgYW5kIG1hcmsgc3BlY3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciB8fFxuICAgICAgICAgICAgKHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKHRoaXMubm9kZXNGcm9tU2NoZW1hKHNjaGVtYSksIHRoaXMubWFya3NGcm9tU2NoZW1hKHNjaGVtYSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2F0aGVyIHRoZSBzZXJpYWxpemVycyBpbiBhIHNjaGVtYSdzIG5vZGUgc3BlY3MgaW50byBhbiBvYmplY3QuXG4gICAgVGhpcyBjYW4gYmUgdXNlZnVsIGFzIGEgYmFzZSB0byBidWlsZCBhIGN1c3RvbSBzZXJpYWxpemVyIGZyb20uXG4gICAgKi9cbiAgICBzdGF0aWMgbm9kZXNGcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZ2F0aGVyVG9ET00oc2NoZW1hLm5vZGVzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQudGV4dClcbiAgICAgICAgICAgIHJlc3VsdC50ZXh0ID0gbm9kZSA9PiBub2RlLnRleHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdhdGhlciB0aGUgc2VyaWFsaXplcnMgaW4gYSBzY2hlbWEncyBtYXJrIHNwZWNzIGludG8gYW4gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIG1hcmtzRnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIGdhdGhlclRvRE9NKHNjaGVtYS5tYXJrcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2F0aGVyVG9ET00ob2JqKSB7XG4gICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IG5hbWUgaW4gb2JqKSB7XG4gICAgICAgIGxldCB0b0RPTSA9IG9ialtuYW1lXS5zcGVjLnRvRE9NO1xuICAgICAgICBpZiAodG9ET00pXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB0b0RPTTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvYyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50O1xufVxuXG5leHBvcnQgeyBDb250ZW50TWF0Y2gsIERPTVBhcnNlciwgRE9NU2VyaWFsaXplciwgRnJhZ21lbnQsIE1hcmssIE1hcmtUeXBlLCBOb2RlLCBOb2RlUmFuZ2UsIE5vZGVUeXBlLCBSZXBsYWNlRXJyb3IsIFJlc29sdmVkUG9zLCBTY2hlbWEsIFNsaWNlIH07XG4iLCAiaW1wb3J0IHsgUmVwbGFjZUVycm9yLCBTbGljZSwgRnJhZ21lbnQsIE1hcmtUeXBlLCBNYXJrIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuXG4vLyBSZWNvdmVyeSB2YWx1ZXMgZW5jb2RlIGEgcmFuZ2UgaW5kZXggYW5kIGFuIG9mZnNldC4gVGhleSBhcmVcbi8vIHJlcHJlc2VudGVkIGFzIG51bWJlcnMsIGJlY2F1c2UgdG9ucyBvZiB0aGVtIHdpbGwgYmUgY3JlYXRlZCB3aGVuXG4vLyBtYXBwaW5nLCBmb3IgZXhhbXBsZSwgYSBsYXJnZSBudW1iZXIgb2YgZGVjb3JhdGlvbnMuIFRoZSBudW1iZXInc1xuLy8gbG93ZXIgMTYgYml0cyBwcm92aWRlIHRoZSBpbmRleCwgdGhlIHJlbWFpbmluZyBiaXRzIHRoZSBvZmZzZXQuXG4vL1xuLy8gTm90ZTogV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYml0IHNoaWZ0IG9wZXJhdG9ycyB0byBlbi0gYW5kXG4vLyBkZWNvZGUgdGhlc2UsIHNpbmNlIHRob3NlIGNsaXAgdG8gMzIgYml0cywgd2hpY2ggd2UgbWlnaHQgaW4gcmFyZVxuLy8gY2FzZXMgd2FudCB0byBvdmVyZmxvdy4gQSA2NC1iaXQgZmxvYXQgY2FuIHJlcHJlc2VudCA0OC1iaXRcbi8vIGludGVnZXJzIHByZWNpc2VseS5cbmNvbnN0IGxvd2VyMTYgPSAweGZmZmY7XG5jb25zdCBmYWN0b3IxNiA9IE1hdGgucG93KDIsIDE2KTtcbmZ1bmN0aW9uIG1ha2VSZWNvdmVyKGluZGV4LCBvZmZzZXQpIHsgcmV0dXJuIGluZGV4ICsgb2Zmc2V0ICogZmFjdG9yMTY7IH1cbmZ1bmN0aW9uIHJlY292ZXJJbmRleCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgJiBsb3dlcjE2OyB9XG5mdW5jdGlvbiByZWNvdmVyT2Zmc2V0KHZhbHVlKSB7IHJldHVybiAodmFsdWUgLSAodmFsdWUgJiBsb3dlcjE2KSkgLyBmYWN0b3IxNjsgfVxuY29uc3QgREVMX0JFRk9SRSA9IDEsIERFTF9BRlRFUiA9IDIsIERFTF9BQ1JPU1MgPSA0LCBERUxfU0lERSA9IDg7XG4vKipcbkFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtYXBwZWQgcG9zaXRpb24gd2l0aCBleHRyYVxuaW5mb3JtYXRpb24uXG4qL1xuY2xhc3MgTWFwUmVzdWx0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBtYXBwZWQgdmVyc2lvbiBvZiB0aGUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZGVsSW5mbywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyKSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmRlbEluZm8gPSBkZWxJbmZvO1xuICAgICAgICB0aGlzLnJlY292ZXIgPSByZWNvdmVyO1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGUgcG9zaXRpb24gd2FzIGRlbGV0ZWQsIHRoYXQgaXMsIHdoZXRoZXIgdGhlXG4gICAgc3RlcCByZW1vdmVkIHRoZSB0b2tlbiBvbiB0aGUgc2lkZSBxdWVyaWVkICh2aWEgdGhlIGBhc3NvY2ApXG4gICAgYXJndW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZCgpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiBERUxfU0lERSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIHRva2VuIGJlZm9yZSB0aGUgbWFwcGVkIHBvc2l0aW9uIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRCZWZvcmUoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgKERFTF9CRUZPUkUgfCBERUxfQUNST1NTKSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoZSB0b2tlbiBhZnRlciB0aGUgbWFwcGVkIHBvc2l0aW9uIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRBZnRlcigpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiAoREVMX0FGVEVSIHwgREVMX0FDUk9TUykpID4gMDsgfVxuICAgIC8qKlxuICAgIFRlbGxzIHdoZXRoZXIgYW55IG9mIHRoZSBzdGVwcyBtYXBwZWQgdGhyb3VnaCBkZWxldGVzIGFjcm9zcyB0aGVcbiAgICBwb3NpdGlvbiAoaW5jbHVkaW5nIGJvdGggdGhlIHRva2VuIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlXG4gICAgcG9zaXRpb24pLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRBY3Jvc3MoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgREVMX0FDUk9TUykgPiAwOyB9XG59XG4vKipcbkEgbWFwIGRlc2NyaWJpbmcgdGhlIGRlbGV0aW9ucyBhbmQgaW5zZXJ0aW9ucyBtYWRlIGJ5IGEgc3RlcCwgd2hpY2hcbmNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gcG9zaXRpb25zIGluIHRoZVxucHJlLXN0ZXAgdmVyc2lvbiBvZiBhIGRvY3VtZW50IGFuZCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGVcbnBvc3Qtc3RlcCB2ZXJzaW9uLlxuKi9cbmNsYXNzIFN0ZXBNYXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBvc2l0aW9uIG1hcC4gVGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50IGFyZVxuICAgIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG51bWJlcnMsIGluIHdoaWNoIGVhY2ggZ3JvdXAgb2YgdGhyZWVcbiAgICByZXByZXNlbnRzIGEgbW9kaWZpZWQgY2h1bmsgYXMgYFtzdGFydCwgb2xkU2l6ZSwgbmV3U2l6ZV1gLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByYW5nZXMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaW52ZXJ0ZWQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5pbnZlcnRlZCA9IGludmVydGVkO1xuICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGggJiYgU3RlcE1hcC5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlY292ZXIodmFsdWUpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBpbmRleCA9IHJlY292ZXJJbmRleCh2YWx1ZSk7XG4gICAgICAgIGlmICghdGhpcy5pbnZlcnRlZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgICAgICAgICAgICBkaWZmICs9IHRoaXMucmFuZ2VzW2kgKiAzICsgMl0gLSB0aGlzLnJhbmdlc1tpICogMyArIDFdO1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbaW5kZXggKiAzXSArIGRpZmYgKyByZWNvdmVyT2Zmc2V0KHZhbHVlKTtcbiAgICB9XG4gICAgbWFwUmVzdWx0KHBvcywgYXNzb2MgPSAxKSB7IHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgZmFsc2UpOyB9XG4gICAgbWFwKHBvcywgYXNzb2MgPSAxKSB7IHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIF9tYXAocG9zLCBhc3NvYywgc2ltcGxlKSB7XG4gICAgICAgIGxldCBkaWZmID0gMCwgb2xkSW5kZXggPSB0aGlzLmludmVydGVkID8gMiA6IDEsIG5ld0luZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDEgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1tpXSAtICh0aGlzLmludmVydGVkID8gZGlmZiA6IDApO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID4gcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IG9sZFNpemUgPSB0aGlzLnJhbmdlc1tpICsgb2xkSW5kZXhdLCBuZXdTaXplID0gdGhpcy5yYW5nZXNbaSArIG5ld0luZGV4XSwgZW5kID0gc3RhcnQgKyBvbGRTaXplO1xuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2lkZSA9ICFvbGRTaXplID8gYXNzb2MgOiBwb3MgPT0gc3RhcnQgPyAtMSA6IHBvcyA9PSBlbmQgPyAxIDogYXNzb2M7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHN0YXJ0ICsgZGlmZiArIChzaWRlIDwgMCA/IDAgOiBuZXdTaXplKTtcbiAgICAgICAgICAgICAgICBpZiAoc2ltcGxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGxldCByZWNvdmVyID0gcG9zID09IChhc3NvYyA8IDAgPyBzdGFydCA6IGVuZCkgPyBudWxsIDogbWFrZVJlY292ZXIoaSAvIDMsIHBvcyAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBsZXQgZGVsID0gcG9zID09IHN0YXJ0ID8gREVMX0FGVEVSIDogcG9zID09IGVuZCA/IERFTF9CRUZPUkUgOiBERUxfQUNST1NTO1xuICAgICAgICAgICAgICAgIGlmIChhc3NvYyA8IDAgPyBwb3MgIT0gc3RhcnQgOiBwb3MgIT0gZW5kKVxuICAgICAgICAgICAgICAgICAgICBkZWwgfD0gREVMX1NJREU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQocmVzdWx0LCBkZWwsIHJlY292ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlmZiArPSBuZXdTaXplIC0gb2xkU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlID8gcG9zICsgZGlmZiA6IG5ldyBNYXBSZXN1bHQocG9zICsgZGlmZiwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG91Y2hlcyhwb3MsIHJlY292ZXIpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBpbmRleCA9IHJlY292ZXJJbmRleChyZWNvdmVyKTtcbiAgICAgICAgbGV0IG9sZEluZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDIgOiAxLCBuZXdJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAxIDogMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbaV0gLSAodGhpcy5pbnZlcnRlZCA/IGRpZmYgOiAwKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA+IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBvbGRTaXplID0gdGhpcy5yYW5nZXNbaSArIG9sZEluZGV4XSwgZW5kID0gc3RhcnQgKyBvbGRTaXplO1xuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQgJiYgaSA9PSBpbmRleCAqIDMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkaWZmICs9IHRoaXMucmFuZ2VzW2kgKyBuZXdJbmRleF0gLSBvbGRTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIGVhY2ggb2YgdGhlIGNoYW5nZWQgcmFuZ2VzIGluY2x1ZGVkIGluXG4gICAgdGhpcyBtYXAuXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHtcbiAgICAgICAgbGV0IG9sZEluZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDIgOiAxLCBuZXdJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAxIDogMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGRpZmYgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzW2ldLCBvbGRTdGFydCA9IHN0YXJ0IC0gKHRoaXMuaW52ZXJ0ZWQgPyBkaWZmIDogMCksIG5ld1N0YXJ0ID0gc3RhcnQgKyAodGhpcy5pbnZlcnRlZCA/IDAgOiBkaWZmKTtcbiAgICAgICAgICAgIGxldCBvbGRTaXplID0gdGhpcy5yYW5nZXNbaSArIG9sZEluZGV4XSwgbmV3U2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBuZXdJbmRleF07XG4gICAgICAgICAgICBmKG9sZFN0YXJ0LCBvbGRTdGFydCArIG9sZFNpemUsIG5ld1N0YXJ0LCBuZXdTdGFydCArIG5ld1NpemUpO1xuICAgICAgICAgICAgZGlmZiArPSBuZXdTaXplIC0gb2xkU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hcC4gVGhlIHJlc3VsdCBjYW4gYmUgdXNlZCB0b1xuICAgIG1hcCBwb3NpdGlvbnMgaW4gdGhlIHBvc3Qtc3RlcCBkb2N1bWVudCB0byB0aGUgcHJlLXN0ZXAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBpbnZlcnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RlcE1hcCh0aGlzLnJhbmdlcywgIXRoaXMuaW52ZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaW52ZXJ0ZWQgPyBcIi1cIiA6IFwiXCIpICsgSlNPTi5zdHJpbmdpZnkodGhpcy5yYW5nZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXAgdGhhdCBtb3ZlcyBhbGwgcG9zaXRpb25zIGJ5IG9mZnNldCBgbmAgKHdoaWNoIG1heSBiZVxuICAgIG5lZ2F0aXZlKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gYXBwbHlpbmcgc3RlcHMgbWVhbnQgZm9yIGFcbiAgICBzdWItZG9jdW1lbnQgdG8gYSBsYXJnZXIgZG9jdW1lbnQsIG9yIHZpY2UtdmVyc2EuXG4gICAgKi9cbiAgICBzdGF0aWMgb2Zmc2V0KG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPT0gMCA/IFN0ZXBNYXAuZW1wdHkgOiBuZXcgU3RlcE1hcChuIDwgMCA/IFswLCAtbiwgMF0gOiBbMCwgMCwgbl0pO1xuICAgIH1cbn1cbi8qKlxuQSBTdGVwTWFwIHRoYXQgY29udGFpbnMgbm8gY2hhbmdlZCByYW5nZXMuXG4qL1xuU3RlcE1hcC5lbXB0eSA9IG5ldyBTdGVwTWFwKFtdKTtcbi8qKlxuQSBtYXBwaW5nIHJlcHJlc2VudHMgYSBwaXBlbGluZSBvZiB6ZXJvIG9yIG1vcmUgW3N0ZXBcbm1hcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcE1hcCkuIEl0IGhhcyBzcGVjaWFsIHByb3Zpc2lvbnMgZm9yIGxvc3NsZXNzbHlcbmhhbmRsaW5nIG1hcHBpbmcgcG9zaXRpb25zIHRocm91Z2ggYSBzZXJpZXMgb2Ygc3RlcHMgaW4gd2hpY2ggc29tZVxuc3RlcHMgYXJlIGludmVydGVkIHZlcnNpb25zIG9mIGVhcmxpZXIgc3RlcHMuIChUaGlzIGNvbWVzIHVwIHdoZW5cblx1MjAxOFtyZWJhc2luZ10oL2RvY3MvZ3VpZGUvI3RyYW5zZm9ybS5yZWJhc2luZylcdTIwMTkgc3RlcHMgZm9yXG5jb2xsYWJvcmF0aW9uIG9yIGhpc3RvcnkgbWFuYWdlbWVudC4pXG4qL1xuY2xhc3MgTWFwcGluZyB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gcG9zaXRpb24gbWFwcy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGVwIG1hcHMgaW4gdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgbWFwcyA9IFtdLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1pcnJvciwgXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXksIHVzZWQgd2hlbiBgbWFwYCBvclxuICAgIGBtYXBSZXN1bHRgIGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIGZyb20gPSAwLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXkuXG4gICAgKi9cbiAgICB0byA9IG1hcHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubWFwcyA9IG1hcHM7XG4gICAgICAgIHRoaXMubWlycm9yID0gbWlycm9yO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcHBpbmcgdGhhdCBtYXBzIG9ubHkgdGhyb3VnaCBhIHBhcnQgb2YgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBzbGljZShmcm9tID0gMCwgdG8gPSB0aGlzLm1hcHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwcGluZyh0aGlzLm1hcHMsIHRoaXMubWlycm9yLCBmcm9tLCB0byk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29weSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwaW5nKHRoaXMubWFwcy5zbGljZSgpLCB0aGlzLm1pcnJvciAmJiB0aGlzLm1pcnJvci5zbGljZSgpLCB0aGlzLmZyb20sIHRoaXMudG8pO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBzdGVwIG1hcCB0byB0aGUgZW5kIG9mIHRoaXMgbWFwcGluZy4gSWYgYG1pcnJvcnNgIGlzXG4gICAgZ2l2ZW4sIGl0IHNob3VsZCBiZSB0aGUgaW5kZXggb2YgdGhlIHN0ZXAgbWFwIHRoYXQgaXMgdGhlIG1pcnJvclxuICAgIGltYWdlIG9mIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kTWFwKG1hcCwgbWlycm9ycykge1xuICAgICAgICB0aGlzLnRvID0gdGhpcy5tYXBzLnB1c2gobWFwKTtcbiAgICAgICAgaWYgKG1pcnJvcnMgIT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuc2V0TWlycm9yKHRoaXMubWFwcy5sZW5ndGggLSAxLCBtaXJyb3JzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGFsbCB0aGUgc3RlcCBtYXBzIGluIGEgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZSAocHJlc2VydmluZ1xuICAgIG1pcnJvcmluZyBpbmZvcm1hdGlvbikuXG4gICAgKi9cbiAgICBhcHBlbmRNYXBwaW5nKG1hcHBpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0U2l6ZSA9IHRoaXMubWFwcy5sZW5ndGg7IGkgPCBtYXBwaW5nLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtaXJyID0gbWFwcGluZy5nZXRNaXJyb3IoaSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZE1hcChtYXBwaW5nLm1hcHNbaV0sIG1pcnIgIT0gbnVsbCAmJiBtaXJyIDwgaSA/IHN0YXJ0U2l6ZSArIG1pcnIgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmRzIHRoZSBvZmZzZXQgb2YgdGhlIHN0ZXAgbWFwIHRoYXQgbWlycm9ycyB0aGUgbWFwIGF0IHRoZVxuICAgIGdpdmVuIG9mZnNldCwgaW4gdGhpcyBtYXBwaW5nIChhcyBwZXIgdGhlIHNlY29uZCBhcmd1bWVudCB0b1xuICAgIGBhcHBlbmRNYXBgKS5cbiAgICAqL1xuICAgIGdldE1pcnJvcihuKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5taXJyb3IubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yW2ldID09IG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pcnJvcltpICsgKGkgJSAyID8gLTEgOiAxKV07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2V0TWlycm9yKG4sIG0pIHtcbiAgICAgICAgaWYgKCF0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHRoaXMubWlycm9yID0gW107XG4gICAgICAgIHRoaXMubWlycm9yLnB1c2gobiwgbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCB0aGUgaW52ZXJzZSBvZiB0aGUgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFwcGVuZE1hcHBpbmdJbnZlcnRlZChtYXBwaW5nKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXBwaW5nLm1hcHMubGVuZ3RoIC0gMSwgdG90YWxTaXplID0gdGhpcy5tYXBzLmxlbmd0aCArIG1hcHBpbmcubWFwcy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgbWlyciA9IG1hcHBpbmcuZ2V0TWlycm9yKGkpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRNYXAobWFwcGluZy5tYXBzW2ldLmludmVydCgpLCBtaXJyICE9IG51bGwgJiYgbWlyciA+IGkgPyB0b3RhbFNpemUgLSBtaXJyIC0gMSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGludmVydGVkIHZlcnNpb24gb2YgdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgaW52ZXJ0KCkge1xuICAgICAgICBsZXQgaW52ZXJzZSA9IG5ldyBNYXBwaW5nO1xuICAgICAgICBpbnZlcnNlLmFwcGVuZE1hcHBpbmdJbnZlcnRlZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGludmVyc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgbWFwKHBvcywgYXNzb2MgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgdHJ1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZyb207IGkgPCB0aGlzLnRvOyBpKyspXG4gICAgICAgICAgICBwb3MgPSB0aGlzLm1hcHNbaV0ubWFwKHBvcywgYXNzb2MpO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgbWFwcGluZywgcmV0dXJuaW5nIGEgbWFwcGluZ1xuICAgIHJlc3VsdC5cbiAgICAqL1xuICAgIG1hcFJlc3VsdChwb3MsIGFzc29jID0gMSkgeyByZXR1cm4gdGhpcy5fbWFwKHBvcywgYXNzb2MsIGZhbHNlKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgX21hcChwb3MsIGFzc29jLCBzaW1wbGUpIHtcbiAgICAgICAgbGV0IGRlbEluZm8gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcm9tOyBpIDwgdGhpcy50bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwID0gdGhpcy5tYXBzW2ldLCByZXN1bHQgPSBtYXAubWFwUmVzdWx0KHBvcywgYXNzb2MpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWNvdmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29yciA9IHRoaXMuZ2V0TWlycm9yKGkpO1xuICAgICAgICAgICAgICAgIGlmIChjb3JyICE9IG51bGwgJiYgY29yciA+IGkgJiYgY29yciA8IHRoaXMudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNvcnI7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMubWFwc1tjb3JyXS5yZWNvdmVyKHJlc3VsdC5yZWNvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsSW5mbyB8PSByZXN1bHQuZGVsSW5mbztcbiAgICAgICAgICAgIHBvcyA9IHJlc3VsdC5wb3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZSA/IHBvcyA6IG5ldyBNYXBSZXN1bHQocG9zLCBkZWxJbmZvLCBudWxsKTtcbiAgICB9XG59XG5cbmNvbnN0IHN0ZXBzQnlJRCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcbkEgc3RlcCBvYmplY3QgcmVwcmVzZW50cyBhbiBhdG9taWMgY2hhbmdlLiBJdCBnZW5lcmFsbHkgYXBwbGllc1xub25seSB0byB0aGUgZG9jdW1lbnQgaXQgd2FzIGNyZWF0ZWQgZm9yLCBzaW5jZSB0aGUgcG9zaXRpb25zXG5zdG9yZWQgaW4gaXQgd2lsbCBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHRoYXQgZG9jdW1lbnQuXG5cbk5ldyBzdGVwcyBhcmUgZGVmaW5lZCBieSBjcmVhdGluZyBjbGFzc2VzIHRoYXQgZXh0ZW5kIGBTdGVwYCxcbm92ZXJyaWRpbmcgdGhlIGBhcHBseWAsIGBpbnZlcnRgLCBgbWFwYCwgYGdldE1hcGAgYW5kIGBmcm9tSlNPTmBcbm1ldGhvZHMsIGFuZCByZWdpc3RlcmluZyB5b3VyIGNsYXNzIHdpdGggYSB1bmlxdWVcbkpTT04tc2VyaWFsaXphdGlvbiBpZGVudGlmaWVyIHVzaW5nXG5bYFN0ZXAuanNvbklEYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwXmpzb25JRCkuXG4qL1xuY2xhc3MgU3RlcCB7XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzdGVwIG1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgbWFkZSBieSB0aGlzIHN0ZXAsXG4gICAgYW5kIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHBvc2l0aW9ucyBpbiB0aGUgb2xkXG4gICAgYW5kIHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXRNYXAoKSB7IHJldHVybiBTdGVwTWFwLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1lcmdlIHRoaXMgc3RlcCB3aXRoIGFub3RoZXIgb25lLCB0byBiZSBhcHBsaWVkIGRpcmVjdGx5XG4gICAgYWZ0ZXIgaXQuIFJldHVybnMgdGhlIG1lcmdlZCBzdGVwIHdoZW4gcG9zc2libGUsIG51bGwgaWYgdGhlXG4gICAgc3RlcHMgY2FuJ3QgYmUgbWVyZ2VkLlxuICAgICovXG4gICAgbWVyZ2Uob3RoZXIpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0ZXAgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gV2lsbCBjYWxsXG4gICAgdGhyb3VnaCB0byB0aGUgc3RlcCBjbGFzcycgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24uc3RlcFR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIGxldCB0eXBlID0gc3RlcHNCeUlEW2pzb24uc3RlcFR5cGVdO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc3RlcCB0eXBlICR7anNvbi5zdGVwVHlwZX0gZGVmaW5lZGApO1xuICAgICAgICByZXR1cm4gdHlwZS5mcm9tSlNPTihzY2hlbWEsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIHNlcmlhbGl6ZSBzdGVwcyB0byBKU09OLCBlYWNoIHN0ZXAgbmVlZHMgYSBzdHJpbmdcbiAgICBJRCB0byBhdHRhY2ggdG8gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFVzZSB0aGlzIG1ldGhvZCB0b1xuICAgIHJlZ2lzdGVyIGFuIElEIGZvciB5b3VyIHN0ZXAgY2xhc3Nlcy4gVHJ5IHRvIHBpY2sgc29tZXRoaW5nXG4gICAgdGhhdCdzIHVubGlrZWx5IHRvIGNsYXNoIHdpdGggc3RlcHMgZnJvbSBvdGhlciBtb2R1bGVzLlxuICAgICovXG4gICAgc3RhdGljIGpzb25JRChpZCwgc3RlcENsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBzdGVwc0J5SUQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkR1cGxpY2F0ZSB1c2Ugb2Ygc3RlcCBKU09OIElEIFwiICsgaWQpO1xuICAgICAgICBzdGVwc0J5SURbaWRdID0gc3RlcENsYXNzO1xuICAgICAgICBzdGVwQ2xhc3MucHJvdG90eXBlLmpzb25JRCA9IGlkO1xuICAgICAgICByZXR1cm4gc3RlcENsYXNzO1xuICAgIH1cbn1cbi8qKlxuVGhlIHJlc3VsdCBvZiBbYXBwbHlpbmddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcC5hcHBseSkgYSBzdGVwLiBDb250YWlucyBlaXRoZXIgYVxubmV3IGRvY3VtZW50IG9yIGEgZmFpbHVyZSB2YWx1ZS5cbiovXG5jbGFzcyBTdGVwUmVzdWx0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCwgaWYgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGZhaWx1cmUgbWVzc2FnZSwgaWYgdW5zdWNjZXNzZnVsLlxuICAgICovXG4gICAgZmFpbGVkKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmZhaWxlZCA9IGZhaWxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc3VjY2Vzc2Z1bCBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIHN0YXRpYyBvayhkb2MpIHsgcmV0dXJuIG5ldyBTdGVwUmVzdWx0KGRvYywgbnVsbCk7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmYWlsZWQgc3RlcCByZXN1bHQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmFpbChtZXNzYWdlKSB7IHJldHVybiBuZXcgU3RlcFJlc3VsdChudWxsLCBtZXNzYWdlKTsgfVxuICAgIC8qKlxuICAgIENhbGwgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aXRoIHRoZSBnaXZlblxuICAgIGFyZ3VtZW50cy4gQ3JlYXRlIGEgc3VjY2Vzc2Z1bCByZXN1bHQgaWYgaXQgc3VjY2VlZHMsIGFuZCBhXG4gICAgZmFpbGVkIG9uZSBpZiBpdCB0aHJvd3MgYSBgUmVwbGFjZUVycm9yYC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tUmVwbGFjZShkb2MsIGZyb20sIHRvLCBzbGljZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQub2soZG9jLnJlcGxhY2UoZnJvbSwgdG8sIHNsaWNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVwbGFjZUVycm9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcEZyYWdtZW50KGZyYWdtZW50LCBmLCBwYXJlbnQpIHtcbiAgICBsZXQgbWFwcGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFnbWVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gZnJhZ21lbnQuY2hpbGQoaSk7XG4gICAgICAgIGlmIChjaGlsZC5jb250ZW50LnNpemUpXG4gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmNvcHkobWFwRnJhZ21lbnQoY2hpbGQuY29udGVudCwgZiwgY2hpbGQpKTtcbiAgICAgICAgaWYgKGNoaWxkLmlzSW5saW5lKVxuICAgICAgICAgICAgY2hpbGQgPSBmKGNoaWxkLCBwYXJlbnQsIGkpO1xuICAgICAgICBtYXBwZWQucHVzaChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkobWFwcGVkKTtcbn1cbi8qKlxuQWRkIGEgbWFyayB0byBhbGwgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiB0d28gcG9zaXRpb25zLlxuKi9cbmNsYXNzIEFkZE1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gYWRkLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKSwgJGZyb20gPSBkb2MucmVzb2x2ZSh0aGlzLmZyb20pO1xuICAgICAgICBsZXQgcGFyZW50ID0gJGZyb20ubm9kZSgkZnJvbS5zaGFyZWREZXB0aCh0aGlzLnRvKSk7XG4gICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShtYXBGcmFnbWVudChvbGRTbGljZS5jb250ZW50LCAobm9kZSwgcGFyZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vZGUuaXNBdG9tIHx8ICFwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZSh0aGlzLm1hcmsudHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHRoaXMubWFyay5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIHBhcmVudCksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBBZGRNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGRNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJhZGRNYXJrXCIsIEFkZE1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGFsbCBpbmxpbmUgY29udGVudCBiZXR3ZWVuIHR3byBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmVtb3ZlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHVubWFya2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgdW5tYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gcmVtb3ZlLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKG1hcEZyYWdtZW50KG9sZFNsaWNlLmNvbnRlbnQsIG5vZGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFyayh0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIGRvYyksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBSZW1vdmVNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcInJlbW92ZU1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZW1vdmVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVNYXJrXCIsIFJlbW92ZU1hcmtTdGVwKTtcbi8qKlxuQWRkIGEgbWFyayB0byBhIHNwZWNpZmljIG5vZGUuXG4qL1xuY2xhc3MgQWRkTm9kZU1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBtYXJrIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byBhZGQuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMucG9zLCB0aGlzLnBvcyArIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHVwZGF0ZWQpLCAwLCBub2RlLmlzTGVhZiA/IDAgOiAxKSk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGxldCBuZXdTZXQgPSB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcyk7XG4gICAgICAgICAgICBpZiAobmV3U2V0Lmxlbmd0aCA9PSBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5tYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLm1hcmtzW2ldLmlzSW5TZXQobmV3U2V0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCBub2RlLm1hcmtzW2ldKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFkZE5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMucG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIHBvcy5kZWxldGVkQWZ0ZXIgPyBudWxsIDogbmV3IEFkZE5vZGVNYXJrU3RlcChwb3MucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE5vZGVNYXJrXCIsIHBvczogdGhpcy5wb3MsIG1hcms6IHRoaXMubWFyay50b0pTT04oKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLnBvcyAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGROb2RlTWFya1N0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKGpzb24ucG9zLCBzY2hlbWEubWFya0Zyb21KU09OKGpzb24ubWFyaykpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYWRkTm9kZU1hcmtcIiwgQWRkTm9kZU1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBSZW1vdmVOb2RlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byByZW1vdmUuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5wb3MsIHRoaXMucG9zICsgMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odXBkYXRlZCksIDAsIG5vZGUuaXNMZWFmID8gMCA6IDEpKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMubWFyay5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgcG9zID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5wb3MsIDEpO1xuICAgICAgICByZXR1cm4gcG9zLmRlbGV0ZWRBZnRlciA/IG51bGwgOiBuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcy5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwicmVtb3ZlTm9kZU1hcmtcIiwgcG9zOiB0aGlzLnBvcywgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24ucG9zICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlbW92ZU5vZGVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAoanNvbi5wb3MsIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVOb2RlTWFya1wiLCBSZW1vdmVOb2RlTWFya1N0ZXApO1xuXG4vKipcblJlcGxhY2UgYSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgc2xpY2Ugb2YgbmV3IGNvbnRlbnQuXG4qL1xuY2xhc3MgUmVwbGFjZVN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBUaGUgZ2l2ZW4gYHNsaWNlYCBzaG91bGQgZml0IHRoZSAnZ2FwJyBiZXR3ZWVuIGBmcm9tYCBhbmRcbiAgICBgdG9gXHUyMDE0dGhlIGRlcHRocyBtdXN0IGxpbmUgdXAsIGFuZCB0aGUgc3Vycm91bmRpbmcgbm9kZXMgbXVzdCBiZVxuICAgIGFibGUgdG8gYmUgam9pbmVkIHdpdGggdGhlIG9wZW4gc2lkZXMgb2YgdGhlIHNsaWNlLiBXaGVuXG4gICAgYHN0cnVjdHVyZWAgaXMgdHJ1ZSwgdGhlIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZSBjb250ZW50IGJldHdlZW5cbiAgICBmcm9tIGFuZCB0byBpcyBub3QganVzdCBhIHNlcXVlbmNlIG9mIGNsb3NpbmcgYW5kIHRoZW4gb3BlbmluZ1xuICAgIHRva2VucyAodGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHJlYmFzZWQgcmVwbGFjZSBzdGVwc1xuICAgIG92ZXJ3cml0aW5nIHNvbWV0aGluZyB0aGV5IHdlcmVuJ3Qgc3VwcG9zZWQgdG8pLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSB0byBpbnNlcnQuXG4gICAgKi9cbiAgICBzbGljZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdHJ1Y3R1cmUgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUgJiYgY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmZyb20sIHRoaXMudG8pKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIlN0cnVjdHVyZSByZXBsYWNlIHdvdWxkIG92ZXJ3cml0ZSBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy5zbGljZSk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKFt0aGlzLmZyb20sIHRoaXMudG8gLSB0aGlzLmZyb20sIHRoaXMuc2xpY2Uuc2l6ZV0pO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAodGhpcy5mcm9tLCB0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUsIGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMudG8sIC0xKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZEFjcm9zcyAmJiB0by5kZWxldGVkQWNyb3NzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoZnJvbS5wb3MsIE1hdGgubWF4KGZyb20ucG9zLCB0by5wb3MpLCB0aGlzLnNsaWNlKTtcbiAgICB9XG4gICAgbWVyZ2Uob3RoZXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCkgfHwgb3RoZXIuc3RydWN0dXJlIHx8IHRoaXMuc3RydWN0dXJlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUgPT0gb3RoZXIuZnJvbSAmJiAhdGhpcy5zbGljZS5vcGVuRW5kICYmICFvdGhlci5zbGljZS5vcGVuU3RhcnQpIHtcbiAgICAgICAgICAgIGxldCBzbGljZSA9IHRoaXMuc2xpY2Uuc2l6ZSArIG90aGVyLnNsaWNlLnNpemUgPT0gMCA/IFNsaWNlLmVtcHR5XG4gICAgICAgICAgICAgICAgOiBuZXcgU2xpY2UodGhpcy5zbGljZS5jb250ZW50LmFwcGVuZChvdGhlci5zbGljZS5jb250ZW50KSwgdGhpcy5zbGljZS5vcGVuU3RhcnQsIG90aGVyLnNsaWNlLm9wZW5FbmQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcCh0aGlzLmZyb20sIHRoaXMudG8gKyAob3RoZXIudG8gLSBvdGhlci5mcm9tKSwgc2xpY2UsIHRoaXMuc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvdGhlci50byA9PSB0aGlzLmZyb20gJiYgIXRoaXMuc2xpY2Uub3BlblN0YXJ0ICYmICFvdGhlci5zbGljZS5vcGVuRW5kKSB7XG4gICAgICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLnNsaWNlLnNpemUgKyBvdGhlci5zbGljZS5zaXplID09IDAgPyBTbGljZS5lbXB0eVxuICAgICAgICAgICAgICAgIDogbmV3IFNsaWNlKG90aGVyLnNsaWNlLmNvbnRlbnQuYXBwZW5kKHRoaXMuc2xpY2UuY29udGVudCksIG90aGVyLnNsaWNlLm9wZW5TdGFydCwgdGhpcy5zbGljZS5vcGVuRW5kKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAob3RoZXIuZnJvbSwgdGhpcy50bywgc2xpY2UsIHRoaXMuc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGpzb24gPSB7IHN0ZXBUeXBlOiBcInJlcGxhY2VcIiwgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgICAgICBpZiAodGhpcy5zbGljZS5zaXplKVxuICAgICAgICAgICAganNvbi5zbGljZSA9IHRoaXMuc2xpY2UudG9KU09OKCk7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSlcbiAgICAgICAgICAgIGpzb24uc3RydWN0dXJlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLnRvICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlcGxhY2VTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKGpzb24uZnJvbSwganNvbi50bywgU2xpY2UuZnJvbUpTT04oc2NoZW1hLCBqc29uLnNsaWNlKSwgISFqc29uLnN0cnVjdHVyZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZXBsYWNlXCIsIFJlcGxhY2VTdGVwKTtcbi8qKlxuUmVwbGFjZSBhIHBhcnQgb2YgdGhlIGRvY3VtZW50IHdpdGggYSBzbGljZSBvZiBjb250ZW50LCBidXRcbnByZXNlcnZlIGEgcmFuZ2Ugb2YgdGhlIHJlcGxhY2VkIGNvbnRlbnQgYnkgbW92aW5nIGl0IGludG8gdGhlXG5zbGljZS5cbiovXG5jbGFzcyBSZXBsYWNlQXJvdW5kU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJlcGxhY2UtYXJvdW5kIHN0ZXAgd2l0aCB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIGdhcC5cbiAgICBgaW5zZXJ0YCBzaG91bGQgYmUgdGhlIHBvaW50IGluIHRoZSBzbGljZSBpbnRvIHdoaWNoIHRoZSBjb250ZW50XG4gICAgb2YgdGhlIGdhcCBzaG91bGQgYmUgbW92ZWQuIGBzdHJ1Y3R1cmVgIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzXG4gICAgaXQgaGFzIGluIHRoZSBbYFJlcGxhY2VTdGVwYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5SZXBsYWNlU3RlcCkgY2xhc3MuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgcmVwbGFjZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHByZXNlcnZlZCByYW5nZS5cbiAgICAqL1xuICAgIGdhcEZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgcHJlc2VydmVkIHJhbmdlLlxuICAgICovXG4gICAgZ2FwVG8sIFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSB0byBpbnNlcnQuXG4gICAgKi9cbiAgICBzbGljZSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGluIHRoZSBzbGljZSB3aGVyZSB0aGUgcHJlc2VydmVkIHJhbmdlIHNob3VsZCBiZVxuICAgIGluc2VydGVkLlxuICAgICovXG4gICAgaW5zZXJ0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0cnVjdHVyZSA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5nYXBGcm9tID0gZ2FwRnJvbTtcbiAgICAgICAgdGhpcy5nYXBUbyA9IGdhcFRvO1xuICAgICAgICB0aGlzLnNsaWNlID0gc2xpY2U7XG4gICAgICAgIHRoaXMuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgICAgICB0aGlzLnN0cnVjdHVyZSA9IHN0cnVjdHVyZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSAmJiAoY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmZyb20sIHRoaXMuZ2FwRnJvbSkgfHxcbiAgICAgICAgICAgIGNvbnRlbnRCZXR3ZWVuKGRvYywgdGhpcy5nYXBUbywgdGhpcy50bykpKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIlN0cnVjdHVyZSBnYXAtcmVwbGFjZSB3b3VsZCBvdmVyd3JpdGUgY29udGVudFwiKTtcbiAgICAgICAgbGV0IGdhcCA9IGRvYy5zbGljZSh0aGlzLmdhcEZyb20sIHRoaXMuZ2FwVG8pO1xuICAgICAgICBpZiAoZ2FwLm9wZW5TdGFydCB8fCBnYXAub3BlbkVuZClcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJHYXAgaXMgbm90IGEgZmxhdCByYW5nZVwiKTtcbiAgICAgICAgbGV0IGluc2VydGVkID0gdGhpcy5zbGljZS5pbnNlcnRBdCh0aGlzLmluc2VydCwgZ2FwLmNvbnRlbnQpO1xuICAgICAgICBpZiAoIWluc2VydGVkKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIkNvbnRlbnQgZG9lcyBub3QgZml0IGluIGdhcFwiKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLmZyb20sIHRoaXMudG8sIGluc2VydGVkKTtcbiAgICB9XG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0ZXBNYXAoW3RoaXMuZnJvbSwgdGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLmluc2VydCxcbiAgICAgICAgICAgIHRoaXMuZ2FwVG8sIHRoaXMudG8gLSB0aGlzLmdhcFRvLCB0aGlzLnNsaWNlLnNpemUgLSB0aGlzLmluc2VydF0pO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIGxldCBnYXAgPSB0aGlzLmdhcFRvIC0gdGhpcy5nYXBGcm9tO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKHRoaXMuZnJvbSwgdGhpcy5mcm9tICsgdGhpcy5zbGljZS5zaXplICsgZ2FwLCB0aGlzLmZyb20gKyB0aGlzLmluc2VydCwgdGhpcy5mcm9tICsgdGhpcy5pbnNlcnQgKyBnYXAsIGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pLnJlbW92ZUJldHdlZW4odGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLmdhcFRvIC0gdGhpcy5mcm9tKSwgdGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGxldCBnYXBGcm9tID0gbWFwcGluZy5tYXAodGhpcy5nYXBGcm9tLCAtMSksIGdhcFRvID0gbWFwcGluZy5tYXAodGhpcy5nYXBUbywgMSk7XG4gICAgICAgIGlmICgoZnJvbS5kZWxldGVkQWNyb3NzICYmIHRvLmRlbGV0ZWRBY3Jvc3MpIHx8IGdhcEZyb20gPCBmcm9tLnBvcyB8fCBnYXBUbyA+IHRvLnBvcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKGZyb20ucG9zLCB0by5wb3MsIGdhcEZyb20sIGdhcFRvLCB0aGlzLnNsaWNlLCB0aGlzLmluc2VydCwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBqc29uID0geyBzdGVwVHlwZTogXCJyZXBsYWNlQXJvdW5kXCIsIGZyb206IHRoaXMuZnJvbSwgdG86IHRoaXMudG8sXG4gICAgICAgICAgICBnYXBGcm9tOiB0aGlzLmdhcEZyb20sIGdhcFRvOiB0aGlzLmdhcFRvLCBpbnNlcnQ6IHRoaXMuaW5zZXJ0IH07XG4gICAgICAgIGlmICh0aGlzLnNsaWNlLnNpemUpXG4gICAgICAgICAgICBqc29uLnNsaWNlID0gdGhpcy5zbGljZS50b0pTT04oKTtcbiAgICAgICAgaWYgKHRoaXMuc3RydWN0dXJlKVxuICAgICAgICAgICAganNvbi5zdHJ1Y3R1cmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5mcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24udG8gIT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIGpzb24uZ2FwRnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmdhcFRvICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaW5zZXJ0ICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlcGxhY2VBcm91bmRTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKGpzb24uZnJvbSwganNvbi50bywganNvbi5nYXBGcm9tLCBqc29uLmdhcFRvLCBTbGljZS5mcm9tSlNPTihzY2hlbWEsIGpzb24uc2xpY2UpLCBqc29uLmluc2VydCwgISFqc29uLnN0cnVjdHVyZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZXBsYWNlQXJvdW5kXCIsIFJlcGxhY2VBcm91bmRTdGVwKTtcbmZ1bmN0aW9uIGNvbnRlbnRCZXR3ZWVuKGRvYywgZnJvbSwgdG8pIHtcbiAgICBsZXQgJGZyb20gPSBkb2MucmVzb2x2ZShmcm9tKSwgZGlzdCA9IHRvIC0gZnJvbSwgZGVwdGggPSAkZnJvbS5kZXB0aDtcbiAgICB3aGlsZSAoZGlzdCA+IDAgJiYgZGVwdGggPiAwICYmICRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpID09ICRmcm9tLm5vZGUoZGVwdGgpLmNoaWxkQ291bnQpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgZGlzdC0tO1xuICAgIH1cbiAgICBpZiAoZGlzdCA+IDApIHtcbiAgICAgICAgbGV0IG5leHQgPSAkZnJvbS5ub2RlKGRlcHRoKS5tYXliZUNoaWxkKCRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpKTtcbiAgICAgICAgd2hpbGUgKGRpc3QgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC5pc0xlYWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dC5maXJzdENoaWxkO1xuICAgICAgICAgICAgZGlzdC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkTWFyayh0ciwgZnJvbSwgdG8sIG1hcmspIHtcbiAgICBsZXQgcmVtb3ZlZCA9IFtdLCBhZGRlZCA9IFtdO1xuICAgIGxldCByZW1vdmluZywgYWRkaW5nO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MsIHBhcmVudCkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtYXJrcyA9IG5vZGUubWFya3M7XG4gICAgICAgIGlmICghbWFyay5pc0luU2V0KG1hcmtzKSAmJiBwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrLnR5cGUpKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChwb3MsIGZyb20pLCBlbmQgPSBNYXRoLm1pbihwb3MgKyBub2RlLm5vZGVTaXplLCB0byk7XG4gICAgICAgICAgICBsZXQgbmV3U2V0ID0gbWFyay5hZGRUb1NldChtYXJrcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXJrc1tpXS5pc0luU2V0KG5ld1NldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92aW5nICYmIHJlbW92aW5nLnRvID09IHN0YXJ0ICYmIHJlbW92aW5nLm1hcmsuZXEobWFya3NbaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZpbmcudG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQucHVzaChyZW1vdmluZyA9IG5ldyBSZW1vdmVNYXJrU3RlcChzdGFydCwgZW5kLCBtYXJrc1tpXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhZGRpbmcgJiYgYWRkaW5nLnRvID09IHN0YXJ0KVxuICAgICAgICAgICAgICAgIGFkZGluZy50byA9IGVuZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhZGRlZC5wdXNoKGFkZGluZyA9IG5ldyBBZGRNYXJrU3RlcChzdGFydCwgZW5kLCBtYXJrKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZW1vdmVkLmZvckVhY2gocyA9PiB0ci5zdGVwKHMpKTtcbiAgICBhZGRlZC5mb3JFYWNoKHMgPT4gdHIuc3RlcChzKSk7XG59XG5mdW5jdGlvbiByZW1vdmVNYXJrKHRyLCBmcm9tLCB0bywgbWFyaykge1xuICAgIGxldCBtYXRjaGVkID0gW10sIHN0ZXAgPSAwO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgaWYgKCFub2RlLmlzSW5saW5lKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdGVwKys7XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IG51bGw7XG4gICAgICAgIGlmIChtYXJrIGluc3RhbmNlb2YgTWFya1R5cGUpIHtcbiAgICAgICAgICAgIGxldCBzZXQgPSBub2RlLm1hcmtzLCBmb3VuZDtcbiAgICAgICAgICAgIHdoaWxlIChmb3VuZCA9IG1hcmsuaXNJblNldChzZXQpKSB7XG4gICAgICAgICAgICAgICAgKHRvUmVtb3ZlIHx8ICh0b1JlbW92ZSA9IFtdKSkucHVzaChmb3VuZCk7XG4gICAgICAgICAgICAgICAgc2V0ID0gZm91bmQucmVtb3ZlRnJvbVNldChzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcmspIHtcbiAgICAgICAgICAgIGlmIChtYXJrLmlzSW5TZXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUgPSBbbWFya107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b1JlbW92ZSA9IG5vZGUubWFya3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvUmVtb3ZlICYmIHRvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHBvcyArIG5vZGUubm9kZVNpemUsIHRvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0b1JlbW92ZVtpXSwgZm91bmQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gbWF0Y2hlZFtqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0uc3RlcCA9PSBzdGVwIC0gMSAmJiBzdHlsZS5lcShtYXRjaGVkW2pdLnN0eWxlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kLnRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICBmb3VuZC5zdGVwID0gc3RlcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQucHVzaCh7IHN0eWxlLCBmcm9tOiBNYXRoLm1heChwb3MsIGZyb20pLCB0bzogZW5kLCBzdGVwIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIG1hdGNoZWQuZm9yRWFjaChtID0+IHRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKG0uZnJvbSwgbS50bywgbS5zdHlsZSkpKTtcbn1cbmZ1bmN0aW9uIGNsZWFySW5jb21wYXRpYmxlKHRyLCBwb3MsIHBhcmVudFR5cGUsIG1hdGNoID0gcGFyZW50VHlwZS5jb250ZW50TWF0Y2gpIHtcbiAgICBsZXQgbm9kZSA9IHRyLmRvYy5ub2RlQXQocG9zKTtcbiAgICBsZXQgcmVwbFN0ZXBzID0gW10sIGN1ciA9IHBvcyArIDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpLCBlbmQgPSBjdXIgKyBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBtYXRjaC5tYXRjaFR5cGUoY2hpbGQudHlwZSk7XG4gICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgICAgcmVwbFN0ZXBzLnB1c2gobmV3IFJlcGxhY2VTdGVwKGN1ciwgZW5kLCBTbGljZS5lbXB0eSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2ggPSBhbGxvd2VkO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZC5tYXJrcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudFR5cGUuYWxsb3dzTWFya1R5cGUoY2hpbGQubWFya3Nbal0udHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKGN1ciwgZW5kLCBjaGlsZC5tYXJrc1tqXSkpO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmlzVGV4dCAmJiAhcGFyZW50VHlwZS5zcGVjLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbSwgbmV3bGluZSA9IC9cXHI/XFxufFxcci9nLCBzbGljZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobSA9IG5ld2xpbmUuZXhlYyhjaGlsZC50ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNsaWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShwYXJlbnRUeXBlLnNjaGVtYS50ZXh0KFwiIFwiLCBwYXJlbnRUeXBlLmFsbG93ZWRNYXJrcyhjaGlsZC5tYXJrcykpKSwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxTdGVwcy5wdXNoKG5ldyBSZXBsYWNlU3RlcChjdXIgKyBtLmluZGV4LCBjdXIgKyBtLmluZGV4ICsgbVswXS5sZW5ndGgsIHNsaWNlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1ciA9IGVuZDtcbiAgICB9XG4gICAgaWYgKCFtYXRjaC52YWxpZEVuZCkge1xuICAgICAgICBsZXQgZmlsbCA9IG1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICB0ci5yZXBsYWNlKGN1ciwgY3VyLCBuZXcgU2xpY2UoZmlsbCwgMCwgMCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gcmVwbFN0ZXBzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICB0ci5zdGVwKHJlcGxTdGVwc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNhbkN1dChub2RlLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIChzdGFydCA9PSAwIHx8IG5vZGUuY2FuUmVwbGFjZShzdGFydCwgbm9kZS5jaGlsZENvdW50KSkgJiZcbiAgICAgICAgKGVuZCA9PSBub2RlLmNoaWxkQ291bnQgfHwgbm9kZS5jYW5SZXBsYWNlKDAsIGVuZCkpO1xufVxuLyoqXG5UcnkgdG8gZmluZCBhIHRhcmdldCBkZXB0aCB0byB3aGljaCB0aGUgY29udGVudCBpbiB0aGUgZ2l2ZW4gcmFuZ2VcbmNhbiBiZSBsaWZ0ZWQuIFdpbGwgbm90IGdvIGFjcm9zc1xuW2lzb2xhdGluZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmlzb2xhdGluZykgcGFyZW50IG5vZGVzLlxuKi9cbmZ1bmN0aW9uIGxpZnRUYXJnZXQocmFuZ2UpIHtcbiAgICBsZXQgcGFyZW50ID0gcmFuZ2UucGFyZW50O1xuICAgIGxldCBjb250ZW50ID0gcGFyZW50LmNvbnRlbnQuY3V0QnlJbmRleChyYW5nZS5zdGFydEluZGV4LCByYW5nZS5lbmRJbmRleCk7XG4gICAgZm9yIChsZXQgZGVwdGggPSByYW5nZS5kZXB0aDs7IC0tZGVwdGgpIHtcbiAgICAgICAgbGV0IG5vZGUgPSByYW5nZS4kZnJvbS5ub2RlKGRlcHRoKTtcbiAgICAgICAgbGV0IGluZGV4ID0gcmFuZ2UuJGZyb20uaW5kZXgoZGVwdGgpLCBlbmRJbmRleCA9IHJhbmdlLiR0by5pbmRleEFmdGVyKGRlcHRoKTtcbiAgICAgICAgaWYgKGRlcHRoIDwgcmFuZ2UuZGVwdGggJiYgbm9kZS5jYW5SZXBsYWNlKGluZGV4LCBlbmRJbmRleCwgY29udGVudCkpXG4gICAgICAgICAgICByZXR1cm4gZGVwdGg7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwIHx8IG5vZGUudHlwZS5zcGVjLmlzb2xhdGluZyB8fCAhY2FuQ3V0KG5vZGUsIGluZGV4LCBlbmRJbmRleCkpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBsaWZ0KHRyLCByYW5nZSwgdGFyZ2V0KSB7XG4gICAgbGV0IHsgJGZyb20sICR0bywgZGVwdGggfSA9IHJhbmdlO1xuICAgIGxldCBnYXBTdGFydCA9ICRmcm9tLmJlZm9yZShkZXB0aCArIDEpLCBnYXBFbmQgPSAkdG8uYWZ0ZXIoZGVwdGggKyAxKTtcbiAgICBsZXQgc3RhcnQgPSBnYXBTdGFydCwgZW5kID0gZ2FwRW5kO1xuICAgIGxldCBiZWZvcmUgPSBGcmFnbWVudC5lbXB0eSwgb3BlblN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBkID0gZGVwdGgsIHNwbGl0dGluZyA9IGZhbHNlOyBkID4gdGFyZ2V0OyBkLS0pXG4gICAgICAgIGlmIChzcGxpdHRpbmcgfHwgJGZyb20uaW5kZXgoZCkgPiAwKSB7XG4gICAgICAgICAgICBzcGxpdHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYmVmb3JlID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGQpLmNvcHkoYmVmb3JlKSk7XG4gICAgICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgIH1cbiAgICBsZXQgYWZ0ZXIgPSBGcmFnbWVudC5lbXB0eSwgb3BlbkVuZCA9IDA7XG4gICAgZm9yIChsZXQgZCA9IGRlcHRoLCBzcGxpdHRpbmcgPSBmYWxzZTsgZCA+IHRhcmdldDsgZC0tKVxuICAgICAgICBpZiAoc3BsaXR0aW5nIHx8ICR0by5hZnRlcihkICsgMSkgPCAkdG8uZW5kKGQpKSB7XG4gICAgICAgICAgICBzcGxpdHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYWZ0ZXIgPSBGcmFnbWVudC5mcm9tKCR0by5ub2RlKGQpLmNvcHkoYWZ0ZXIpKTtcbiAgICAgICAgICAgIG9wZW5FbmQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoc3RhcnQsIGVuZCwgZ2FwU3RhcnQsIGdhcEVuZCwgbmV3IFNsaWNlKGJlZm9yZS5hcHBlbmQoYWZ0ZXIpLCBvcGVuU3RhcnQsIG9wZW5FbmQpLCBiZWZvcmUuc2l6ZSAtIG9wZW5TdGFydCwgdHJ1ZSkpO1xufVxuLyoqXG5UcnkgdG8gZmluZCBhIHZhbGlkIHdheSB0byB3cmFwIHRoZSBjb250ZW50IGluIHRoZSBnaXZlbiByYW5nZSBpbiBhXG5ub2RlIG9mIHRoZSBnaXZlbiB0eXBlLiBNYXkgaW50cm9kdWNlIGV4dHJhIG5vZGVzIGFyb3VuZCBhbmQgaW5zaWRlXG50aGUgd3JhcHBlciBub2RlLCBpZiBuZWNlc3NhcnkuIFJldHVybnMgbnVsbCBpZiBubyB2YWxpZCB3cmFwcGluZ1xuY291bGQgYmUgZm91bmQuIFdoZW4gYGlubmVyUmFuZ2VgIGlzIGdpdmVuLCB0aGF0IHJhbmdlJ3MgY29udGVudCBpc1xudXNlZCBhcyB0aGUgY29udGVudCB0byBmaXQgaW50byB0aGUgd3JhcHBpbmcsIGluc3RlYWQgb2YgdGhlXG5jb250ZW50IG9mIGByYW5nZWAuXG4qL1xuZnVuY3Rpb24gZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMgPSBudWxsLCBpbm5lclJhbmdlID0gcmFuZ2UpIHtcbiAgICBsZXQgYXJvdW5kID0gZmluZFdyYXBwaW5nT3V0c2lkZShyYW5nZSwgbm9kZVR5cGUpO1xuICAgIGxldCBpbm5lciA9IGFyb3VuZCAmJiBmaW5kV3JhcHBpbmdJbnNpZGUoaW5uZXJSYW5nZSwgbm9kZVR5cGUpO1xuICAgIGlmICghaW5uZXIpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBhcm91bmQubWFwKHdpdGhBdHRycylcbiAgICAgICAgLmNvbmNhdCh7IHR5cGU6IG5vZGVUeXBlLCBhdHRycyB9KS5jb25jYXQoaW5uZXIubWFwKHdpdGhBdHRycykpO1xufVxuZnVuY3Rpb24gd2l0aEF0dHJzKHR5cGUpIHsgcmV0dXJuIHsgdHlwZSwgYXR0cnM6IG51bGwgfTsgfVxuZnVuY3Rpb24gZmluZFdyYXBwaW5nT3V0c2lkZShyYW5nZSwgdHlwZSkge1xuICAgIGxldCB7IHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHJhbmdlO1xuICAgIGxldCBhcm91bmQgPSBwYXJlbnQuY29udGVudE1hdGNoQXQoc3RhcnRJbmRleCkuZmluZFdyYXBwaW5nKHR5cGUpO1xuICAgIGlmICghYXJvdW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb3V0ZXIgPSBhcm91bmQubGVuZ3RoID8gYXJvdW5kWzBdIDogdHlwZTtcbiAgICByZXR1cm4gcGFyZW50LmNhblJlcGxhY2VXaXRoKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBvdXRlcikgPyBhcm91bmQgOiBudWxsO1xufVxuZnVuY3Rpb24gZmluZFdyYXBwaW5nSW5zaWRlKHJhbmdlLCB0eXBlKSB7XG4gICAgbGV0IHsgcGFyZW50LCBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gcmFuZ2U7XG4gICAgbGV0IGlubmVyID0gcGFyZW50LmNoaWxkKHN0YXJ0SW5kZXgpO1xuICAgIGxldCBpbnNpZGUgPSB0eXBlLmNvbnRlbnRNYXRjaC5maW5kV3JhcHBpbmcoaW5uZXIudHlwZSk7XG4gICAgaWYgKCFpbnNpZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBsYXN0VHlwZSA9IGluc2lkZS5sZW5ndGggPyBpbnNpZGVbaW5zaWRlLmxlbmd0aCAtIDFdIDogdHlwZTtcbiAgICBsZXQgaW5uZXJNYXRjaCA9IGxhc3RUeXBlLmNvbnRlbnRNYXRjaDtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaW5uZXJNYXRjaCAmJiBpIDwgZW5kSW5kZXg7IGkrKylcbiAgICAgICAgaW5uZXJNYXRjaCA9IGlubmVyTWF0Y2gubWF0Y2hUeXBlKHBhcmVudC5jaGlsZChpKS50eXBlKTtcbiAgICBpZiAoIWlubmVyTWF0Y2ggfHwgIWlubmVyTWF0Y2gudmFsaWRFbmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpbnNpZGU7XG59XG5mdW5jdGlvbiB3cmFwKHRyLCByYW5nZSwgd3JhcHBlcnMpIHtcbiAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSB3cmFwcGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSB3cmFwcGVyc1tpXS50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gudmFsaWRFbmQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJXcmFwcGVyIHR5cGUgZ2l2ZW4gdG8gVHJhbnNmb3JtLndyYXAgZG9lcyBub3QgZm9ybSB2YWxpZCBjb250ZW50IG9mIGl0cyBwYXJlbnQgd3JhcHBlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbSh3cmFwcGVyc1tpXS50eXBlLmNyZWF0ZSh3cmFwcGVyc1tpXS5hdHRycywgY29udGVudCkpO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSByYW5nZS5zdGFydCwgZW5kID0gcmFuZ2UuZW5kO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0LCBlbmQsIHN0YXJ0LCBlbmQsIG5ldyBTbGljZShjb250ZW50LCAwLCAwKSwgd3JhcHBlcnMubGVuZ3RoLCB0cnVlKSk7XG59XG5mdW5jdGlvbiBzZXRCbG9ja1R5cGUodHIsIGZyb20sIHRvLCB0eXBlLCBhdHRycykge1xuICAgIGlmICghdHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUeXBlIGdpdmVuIHRvIHNldEJsb2NrVHlwZSBzaG91bGQgYmUgYSB0ZXh0YmxvY2tcIik7XG4gICAgbGV0IG1hcEZyb20gPSB0ci5zdGVwcy5sZW5ndGg7XG4gICAgdHIuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS5oYXNNYXJrdXAodHlwZSwgYXR0cnMpICYmIGNhbkNoYW5nZVR5cGUodHIuZG9jLCB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChwb3MpLCB0eXBlKSkge1xuICAgICAgICAgICAgLy8gRW5zdXJlIGFsbCBtYXJrdXAgdGhhdCBpc24ndCBhbGxvd2VkIGluIHRoZSBuZXcgbm9kZSB0eXBlIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIHRyLmNsZWFySW5jb21wYXRpYmxlKHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcywgMSksIHR5cGUpO1xuICAgICAgICAgICAgbGV0IG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgbGV0IHN0YXJ0TSA9IG1hcHBpbmcubWFwKHBvcywgMSksIGVuZE0gPSBtYXBwaW5nLm1hcChwb3MgKyBub2RlLm5vZGVTaXplLCAxKTtcbiAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0TSwgZW5kTSwgc3RhcnRNICsgMSwgZW5kTSAtIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGF0dHJzLCBudWxsLCBub2RlLm1hcmtzKSksIDAsIDApLCAxLCB0cnVlKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNhbkNoYW5nZVR5cGUoZG9jLCBwb3MsIHR5cGUpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyksIGluZGV4ID0gJHBvcy5pbmRleCgpO1xuICAgIHJldHVybiAkcG9zLnBhcmVudC5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXggKyAxLCB0eXBlKTtcbn1cbi8qKlxuQ2hhbmdlIHRoZSB0eXBlLCBhdHRyaWJ1dGVzLCBhbmQvb3IgbWFya3Mgb2YgdGhlIG5vZGUgYXQgYHBvc2AuXG5XaGVuIGB0eXBlYCBpc24ndCBnaXZlbiwgdGhlIGV4aXN0aW5nIG5vZGUgdHlwZSBpcyBwcmVzZXJ2ZWQsXG4qL1xuZnVuY3Rpb24gc2V0Tm9kZU1hcmt1cCh0ciwgcG9zLCB0eXBlLCBhdHRycywgbWFya3MpIHtcbiAgICBsZXQgbm9kZSA9IHRyLmRvYy5ub2RlQXQocG9zKTtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhdCBnaXZlbiBwb3NpdGlvblwiKTtcbiAgICBpZiAoIXR5cGUpXG4gICAgICAgIHR5cGUgPSBub2RlLnR5cGU7XG4gICAgbGV0IG5ld05vZGUgPSB0eXBlLmNyZWF0ZShhdHRycywgbnVsbCwgbWFya3MgfHwgbm9kZS5tYXJrcyk7XG4gICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICByZXR1cm4gdHIucmVwbGFjZVdpdGgocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCBuZXdOb2RlKTtcbiAgICBpZiAoIXR5cGUudmFsaWRDb250ZW50KG5vZGUuY29udGVudCkpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBjb250ZW50IGZvciBub2RlIHR5cGUgXCIgKyB0eXBlLm5hbWUpO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHBvcywgcG9zICsgbm9kZS5ub2RlU2l6ZSwgcG9zICsgMSwgcG9zICsgbm9kZS5ub2RlU2l6ZSAtIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKG5ld05vZGUpLCAwLCAwKSwgMSwgdHJ1ZSkpO1xufVxuLyoqXG5DaGVjayB3aGV0aGVyIHNwbGl0dGluZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgYWxsb3dlZC5cbiovXG5mdW5jdGlvbiBjYW5TcGxpdChkb2MsIHBvcywgZGVwdGggPSAxLCB0eXBlc0FmdGVyKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBiYXNlID0gJHBvcy5kZXB0aCAtIGRlcHRoO1xuICAgIGxldCBpbm5lclR5cGUgPSAodHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW3R5cGVzQWZ0ZXIubGVuZ3RoIC0gMV0pIHx8ICRwb3MucGFyZW50O1xuICAgIGlmIChiYXNlIDwgMCB8fCAkcG9zLnBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nIHx8XG4gICAgICAgICEkcG9zLnBhcmVudC5jYW5SZXBsYWNlKCRwb3MuaW5kZXgoKSwgJHBvcy5wYXJlbnQuY2hpbGRDb3VudCkgfHxcbiAgICAgICAgIWlubmVyVHlwZS50eXBlLnZhbGlkQ29udGVudCgkcG9zLnBhcmVudC5jb250ZW50LmN1dEJ5SW5kZXgoJHBvcy5pbmRleCgpLCAkcG9zLnBhcmVudC5jaGlsZENvdW50KSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCAtIDEsIGkgPSBkZXB0aCAtIDI7IGQgPiBiYXNlOyBkLS0sIGktLSkge1xuICAgICAgICBsZXQgbm9kZSA9ICRwb3Mubm9kZShkKSwgaW5kZXggPSAkcG9zLmluZGV4KGQpO1xuICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmVzdCA9IG5vZGUuY29udGVudC5jdXRCeUluZGV4KGluZGV4LCBub2RlLmNoaWxkQ291bnQpO1xuICAgICAgICBsZXQgb3ZlcnJpZGVDaGlsZCA9IHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlcltpICsgMV07XG4gICAgICAgIGlmIChvdmVycmlkZUNoaWxkKVxuICAgICAgICAgICAgcmVzdCA9IHJlc3QucmVwbGFjZUNoaWxkKDAsIG92ZXJyaWRlQ2hpbGQudHlwZS5jcmVhdGUob3ZlcnJpZGVDaGlsZC5hdHRycykpO1xuICAgICAgICBsZXQgYWZ0ZXIgPSAodHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW2ldKSB8fCBub2RlO1xuICAgICAgICBpZiAoIW5vZGUuY2FuUmVwbGFjZShpbmRleCArIDEsIG5vZGUuY2hpbGRDb3VudCkgfHwgIWFmdGVyLnR5cGUudmFsaWRDb250ZW50KHJlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4QWZ0ZXIoYmFzZSk7XG4gICAgbGV0IGJhc2VUeXBlID0gdHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyWzBdO1xuICAgIHJldHVybiAkcG9zLm5vZGUoYmFzZSkuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBiYXNlVHlwZSA/IGJhc2VUeXBlLnR5cGUgOiAkcG9zLm5vZGUoYmFzZSArIDEpLnR5cGUpO1xufVxuZnVuY3Rpb24gc3BsaXQodHIsIHBvcywgZGVwdGggPSAxLCB0eXBlc0FmdGVyKSB7XG4gICAgbGV0ICRwb3MgPSB0ci5kb2MucmVzb2x2ZShwb3MpLCBiZWZvcmUgPSBGcmFnbWVudC5lbXB0eSwgYWZ0ZXIgPSBGcmFnbWVudC5lbXB0eTtcbiAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCwgZSA9ICRwb3MuZGVwdGggLSBkZXB0aCwgaSA9IGRlcHRoIC0gMTsgZCA+IGU7IGQtLSwgaS0tKSB7XG4gICAgICAgIGJlZm9yZSA9IEZyYWdtZW50LmZyb20oJHBvcy5ub2RlKGQpLmNvcHkoYmVmb3JlKSk7XG4gICAgICAgIGxldCB0eXBlQWZ0ZXIgPSB0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbaV07XG4gICAgICAgIGFmdGVyID0gRnJhZ21lbnQuZnJvbSh0eXBlQWZ0ZXIgPyB0eXBlQWZ0ZXIudHlwZS5jcmVhdGUodHlwZUFmdGVyLmF0dHJzLCBhZnRlcikgOiAkcG9zLm5vZGUoZCkuY29weShhZnRlcikpO1xuICAgIH1cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlU3RlcChwb3MsIHBvcywgbmV3IFNsaWNlKGJlZm9yZS5hcHBlbmQoYWZ0ZXIpLCBkZXB0aCwgZGVwdGgpLCB0cnVlKSk7XG59XG4vKipcblRlc3Qgd2hldGhlciB0aGUgYmxvY2tzIGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBwb3NpdGlvbiBjYW4gYmVcbmpvaW5lZC5cbiovXG5mdW5jdGlvbiBjYW5Kb2luKGRvYywgcG9zKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICByZXR1cm4gam9pbmFibGUoJHBvcy5ub2RlQmVmb3JlLCAkcG9zLm5vZGVBZnRlcikgJiZcbiAgICAgICAgJHBvcy5wYXJlbnQuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKTtcbn1cbmZ1bmN0aW9uIGpvaW5hYmxlKGEsIGIpIHtcbiAgICByZXR1cm4gISEoYSAmJiBiICYmICFhLmlzTGVhZiAmJiBhLmNhbkFwcGVuZChiKSk7XG59XG4vKipcbkZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHBvc2l0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCB0byB0aGVcbmJsb2NrIGJlZm9yZSAob3IgYWZ0ZXIgaWYgYGRpcmAgaXMgcG9zaXRpdmUpLiBSZXR1cm5zIHRoZSBqb2luYWJsZVxucG9pbnQsIGlmIGFueS5cbiovXG5mdW5jdGlvbiBqb2luUG9pbnQoZG9jLCBwb3MsIGRpciA9IC0xKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOzsgZC0tKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgIGlmIChkID09ICRwb3MuZGVwdGgpIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZUJlZm9yZTtcbiAgICAgICAgICAgIGFmdGVyID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyID4gMCkge1xuICAgICAgICAgICAgYmVmb3JlID0gJHBvcy5ub2RlKGQgKyAxKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZm9yZSAmJiAhYmVmb3JlLmlzVGV4dGJsb2NrICYmIGpvaW5hYmxlKGJlZm9yZSwgYWZ0ZXIpICYmXG4gICAgICAgICAgICAkcG9zLm5vZGUoZCkuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKSlcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIGlmIChkID09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcG9zID0gZGlyIDwgMCA/ICRwb3MuYmVmb3JlKGQpIDogJHBvcy5hZnRlcihkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBqb2luKHRyLCBwb3MsIGRlcHRoKSB7XG4gICAgbGV0IHN0ZXAgPSBuZXcgUmVwbGFjZVN0ZXAocG9zIC0gZGVwdGgsIHBvcyArIGRlcHRoLCBTbGljZS5lbXB0eSwgdHJ1ZSk7XG4gICAgdHIuc3RlcChzdGVwKTtcbn1cbi8qKlxuVHJ5IHRvIGZpbmQgYSBwb2ludCB3aGVyZSBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUgY2FuIGJlIGluc2VydGVkXG5uZWFyIGBwb3NgLCBieSBzZWFyY2hpbmcgdXAgdGhlIG5vZGUgaGllcmFyY2h5IHdoZW4gYHBvc2AgaXRzZWxmXG5pc24ndCBhIHZhbGlkIHBsYWNlIGJ1dCBpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbm9kZS4gUmV0dXJuXG5udWxsIGlmIG5vIHBvc2l0aW9uIHdhcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBpbnNlcnRQb2ludChkb2MsIHBvcywgbm9kZVR5cGUpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgaWYgKCRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKCRwb3MuaW5kZXgoKSwgJHBvcy5pbmRleCgpLCBub2RlVHlwZSkpXG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgaWYgKCRwb3MucGFyZW50T2Zmc2V0ID09IDApXG4gICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGQpLmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgbm9kZVR5cGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmJlZm9yZShkICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgaWYgKCRwb3MucGFyZW50T2Zmc2V0ID09ICRwb3MucGFyZW50LmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gJHBvcy5pbmRleEFmdGVyKGQpO1xuICAgICAgICAgICAgaWYgKCRwb3Mubm9kZShkKS5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXgsIG5vZGVUeXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5hZnRlcihkICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCAkcG9zLm5vZGUoZCkuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG5GaW5kcyBhIHBvc2l0aW9uIGF0IG9yIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24gd2hlcmUgdGhlIGdpdmVuXG5zbGljZSBjYW4gYmUgaW5zZXJ0ZWQuIFdpbGwgbG9vayBhdCBwYXJlbnQgbm9kZXMnIG5lYXJlc3QgYm91bmRhcnlcbmFuZCB0cnkgdGhlcmUsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIHdhc24ndCBkaXJlY3RseSBhdCB0aGVcbnN0YXJ0IG9yIGVuZCBvZiB0aGF0IG5vZGUuIFJldHVybnMgbnVsbCB3aGVuIG5vIHBvc2l0aW9uIHdhcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBkcm9wUG9pbnQoZG9jLCBwb3MsIHNsaWNlKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGlmICghc2xpY2UuY29udGVudC5zaXplKVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIGxldCBjb250ZW50ID0gc2xpY2UuY29udGVudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLm9wZW5TdGFydDsgaSsrKVxuICAgICAgICBjb250ZW50ID0gY29udGVudC5maXJzdENoaWxkLmNvbnRlbnQ7XG4gICAgZm9yIChsZXQgcGFzcyA9IDE7IHBhc3MgPD0gKHNsaWNlLm9wZW5TdGFydCA9PSAwICYmIHNsaWNlLnNpemUgPyAyIDogMSk7IHBhc3MrKykge1xuICAgICAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBiaWFzID0gZCA9PSAkcG9zLmRlcHRoID8gMCA6ICRwb3MucG9zIDw9ICgkcG9zLnN0YXJ0KGQgKyAxKSArICRwb3MuZW5kKGQgKyAxKSkgLyAyID8gLTEgOiAxO1xuICAgICAgICAgICAgbGV0IGluc2VydFBvcyA9ICRwb3MuaW5kZXgoZCkgKyAoYmlhcyA+IDAgPyAxIDogMCk7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gJHBvcy5ub2RlKGQpLCBmaXRzID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocGFzcyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgZml0cyA9IHBhcmVudC5jYW5SZXBsYWNlKGluc2VydFBvcywgaW5zZXJ0UG9zLCBjb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB3cmFwcGluZyA9IHBhcmVudC5jb250ZW50TWF0Y2hBdChpbnNlcnRQb3MpLmZpbmRXcmFwcGluZyhjb250ZW50LmZpcnN0Q2hpbGQudHlwZSk7XG4gICAgICAgICAgICAgICAgZml0cyA9IHdyYXBwaW5nICYmIHBhcmVudC5jYW5SZXBsYWNlV2l0aChpbnNlcnRQb3MsIGluc2VydFBvcywgd3JhcHBpbmdbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpdHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpYXMgPT0gMCA/ICRwb3MucG9zIDogYmlhcyA8IDAgPyAkcG9zLmJlZm9yZShkICsgMSkgOiAkcG9zLmFmdGVyKGQgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG5cdTIwMThGaXRcdTIwMTkgYSBzbGljZSBpbnRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LCBwcm9kdWNpbmcgYVxuW3N0ZXBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcCkgdGhhdCBpbnNlcnRzIGl0LiBXaWxsIHJldHVybiBudWxsIGlmXG50aGVyZSdzIG5vIG1lYW5pbmdmdWwgd2F5IHRvIGluc2VydCB0aGUgc2xpY2UgaGVyZSwgb3IgaW5zZXJ0aW5nIGl0XG53b3VsZCBiZSBhIG5vLW9wIChhbiBlbXB0eSBzbGljZSBvdmVyIGFuIGVtcHR5IHJhbmdlKS5cbiovXG5mdW5jdGlvbiByZXBsYWNlU3RlcChkb2MsIGZyb20sIHRvID0gZnJvbSwgc2xpY2UgPSBTbGljZS5lbXB0eSkge1xuICAgIGlmIChmcm9tID09IHRvICYmICFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgJGZyb20gPSBkb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gZG9jLnJlc29sdmUodG8pO1xuICAgIC8vIE9wdGltaXphdGlvbiAtLSBhdm9pZCB3b3JrIGlmIGl0J3Mgb2J2aW91cyB0aGF0IGl0J3Mgbm90IG5lZWRlZC5cbiAgICBpZiAoZml0c1RyaXZpYWxseSgkZnJvbSwgJHRvLCBzbGljZSkpXG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoZnJvbSwgdG8sIHNsaWNlKTtcbiAgICByZXR1cm4gbmV3IEZpdHRlcigkZnJvbSwgJHRvLCBzbGljZSkuZml0KCk7XG59XG5mdW5jdGlvbiBmaXRzVHJpdmlhbGx5KCRmcm9tLCAkdG8sIHNsaWNlKSB7XG4gICAgcmV0dXJuICFzbGljZS5vcGVuU3RhcnQgJiYgIXNsaWNlLm9wZW5FbmQgJiYgJGZyb20uc3RhcnQoKSA9PSAkdG8uc3RhcnQoKSAmJlxuICAgICAgICAkZnJvbS5wYXJlbnQuY2FuUmVwbGFjZSgkZnJvbS5pbmRleCgpLCAkdG8uaW5kZXgoKSwgc2xpY2UuY29udGVudCk7XG59XG4vLyBBbGdvcml0aG0gZm9yICdwbGFjaW5nJyB0aGUgZWxlbWVudHMgb2YgYSBzbGljZSBpbnRvIGEgZ2FwOlxuLy9cbi8vIFdlIGNvbnNpZGVyIHRoZSBjb250ZW50IG9mIGVhY2ggbm9kZSB0aGF0IGlzIG9wZW4gdG8gdGhlIGxlZnQgdG8gYmVcbi8vIGluZGVwZW5kZW50bHkgcGxhY2VhYmxlLiBJLmUuIGluIDxwKFwiZm9vXCIpLCBwKFwiYmFyXCIpPiwgd2hlbiB0aGVcbi8vIHBhcmFncmFwaCBvbiB0aGUgbGVmdCBpcyBvcGVuLCBcImZvb1wiIGNhbiBiZSBwbGFjZWQgKHNvbWV3aGVyZSBvblxuLy8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgcmVwbGFjZW1lbnQgZ2FwKSBpbmRlcGVuZGVudGx5IGZyb20gcChcImJhclwiKS5cbi8vXG4vLyBUaGlzIGNsYXNzIHRyYWNrcyB0aGUgc3RhdGUgb2YgdGhlIHBsYWNlbWVudCBwcm9ncmVzcyBpbiB0aGVcbi8vIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuLy9cbi8vICAtIGBmcm9udGllcmAgaG9sZHMgYSBzdGFjayBvZiBge3R5cGUsIG1hdGNofWAgb2JqZWN0cyB0aGF0XG4vLyAgICByZXByZXNlbnQgdGhlIG9wZW4gc2lkZSBvZiB0aGUgcmVwbGFjZW1lbnQuIEl0IHN0YXJ0cyBhdFxuLy8gICAgYCRmcm9tYCwgdGhlbiBtb3ZlcyBmb3J3YXJkIGFzIGNvbnRlbnQgaXMgcGxhY2VkLCBhbmQgaXMgZmluYWxseVxuLy8gICAgcmVjb25jaWxlZCB3aXRoIGAkdG9gLlxuLy9cbi8vICAtIGB1bnBsYWNlZGAgaXMgYSBzbGljZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnQgdGhhdCBoYXNuJ3Rcbi8vICAgIGJlZW4gcGxhY2VkIHlldC5cbi8vXG4vLyAgLSBgcGxhY2VkYCBpcyBhIGZyYWdtZW50IG9mIHBsYWNlZCBjb250ZW50LiBJdHMgb3Blbi1zdGFydCB2YWx1ZVxuLy8gICAgaXMgaW1wbGljaXQgaW4gYCRmcm9tYCwgYW5kIGl0cyBvcGVuLWVuZCB2YWx1ZSBpbiBgZnJvbnRpZXJgLlxuY2xhc3MgRml0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigkZnJvbSwgJHRvLCB1bnBsYWNlZCkge1xuICAgICAgICB0aGlzLiRmcm9tID0gJGZyb207XG4gICAgICAgIHRoaXMuJHRvID0gJHRvO1xuICAgICAgICB0aGlzLnVucGxhY2VkID0gdW5wbGFjZWQ7XG4gICAgICAgIHRoaXMuZnJvbnRpZXIgPSBbXTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gJGZyb20uZGVwdGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSAkZnJvbS5ub2RlKGkpO1xuICAgICAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAgICAgICAgICAgbWF0Y2g6IG5vZGUuY29udGVudE1hdGNoQXQoJGZyb20uaW5kZXhBZnRlcihpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAkZnJvbS5kZXB0aDsgaSA+IDA7IGktLSlcbiAgICAgICAgICAgIHRoaXMucGxhY2VkID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGkpLmNvcHkodGhpcy5wbGFjZWQpKTtcbiAgICB9XG4gICAgZ2V0IGRlcHRoKCkgeyByZXR1cm4gdGhpcy5mcm9udGllci5sZW5ndGggLSAxOyB9XG4gICAgZml0KCkge1xuICAgICAgICAvLyBBcyBsb25nIGFzIHRoZXJlJ3MgdW5wbGFjZWQgY29udGVudCwgdHJ5IHRvIHBsYWNlIHNvbWUgb2YgaXQuXG4gICAgICAgIC8vIElmIHRoYXQgZmFpbHMsIGVpdGhlciBpbmNyZWFzZSB0aGUgb3BlbiBzY29yZSBvZiB0aGUgdW5wbGFjZWRcbiAgICAgICAgLy8gc2xpY2UsIG9yIGRyb3Agbm9kZXMgZnJvbSBpdCwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgICAgICB3aGlsZSAodGhpcy51bnBsYWNlZC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgZml0ID0gdGhpcy5maW5kRml0dGFibGUoKTtcbiAgICAgICAgICAgIGlmIChmaXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZU5vZGVzKGZpdCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuTW9yZSgpIHx8IHRoaXMuZHJvcE5vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZXJlJ3MgaW5saW5lIGNvbnRlbnQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGZyb250aWVyIF9hbmRfXG4gICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIGB0aGlzLiR0b2AsIHdlIG11c3QgZ2VuZXJhdGUgYSBgUmVwbGFjZUFyb3VuZGBcbiAgICAgICAgLy8gc3RlcCB0aGF0IHB1bGxzIHRoYXQgY29udGVudCBpbnRvIHRoZSBub2RlIGFmdGVyIHRoZSBmcm9udGllci5cbiAgICAgICAgLy8gVGhhdCBtZWFucyB0aGUgZml0dGluZyBtdXN0IGJlIGRvbmUgdG8gdGhlIGVuZCBvZiB0aGUgdGV4dGJsb2NrXG4gICAgICAgIC8vIG5vZGUgYWZ0ZXIgYHRoaXMuJHRvYCwgbm90IGB0aGlzLiR0b2AgaXRzZWxmLlxuICAgICAgICBsZXQgbW92ZUlubGluZSA9IHRoaXMubXVzdE1vdmVJbmxpbmUoKSwgcGxhY2VkU2l6ZSA9IHRoaXMucGxhY2VkLnNpemUgLSB0aGlzLmRlcHRoIC0gdGhpcy4kZnJvbS5kZXB0aDtcbiAgICAgICAgbGV0ICRmcm9tID0gdGhpcy4kZnJvbSwgJHRvID0gdGhpcy5jbG9zZShtb3ZlSW5saW5lIDwgMCA/IHRoaXMuJHRvIDogJGZyb20uZG9jLnJlc29sdmUobW92ZUlubGluZSkpO1xuICAgICAgICBpZiAoISR0bylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAvLyBJZiBjbG9zaW5nIHRvIGAkdG9gIHN1Y2NlZWRlZCwgY3JlYXRlIGEgc3RlcFxuICAgICAgICBsZXQgY29udGVudCA9IHRoaXMucGxhY2VkLCBvcGVuU3RhcnQgPSAkZnJvbS5kZXB0aCwgb3BlbkVuZCA9ICR0by5kZXB0aDtcbiAgICAgICAgd2hpbGUgKG9wZW5TdGFydCAmJiBvcGVuRW5kICYmIGNvbnRlbnQuY2hpbGRDb3VudCA9PSAxKSB7IC8vIE5vcm1hbGl6ZSBieSBkcm9wcGluZyBvcGVuIHBhcmVudCBub2Rlc1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgICAgICAgICAgb3BlblN0YXJ0LS07XG4gICAgICAgICAgICBvcGVuRW5kLS07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIGlmIChtb3ZlSW5saW5lID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKCRmcm9tLnBvcywgbW92ZUlubGluZSwgdGhpcy4kdG8ucG9zLCB0aGlzLiR0by5lbmQoKSwgc2xpY2UsIHBsYWNlZFNpemUpO1xuICAgICAgICBpZiAoc2xpY2Uuc2l6ZSB8fCAkZnJvbS5wb3MgIT0gdGhpcy4kdG8ucG9zKSAvLyBEb24ndCBnZW5lcmF0ZSBuby1vcCBzdGVwc1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcCgkZnJvbS5wb3MsICR0by5wb3MsIHNsaWNlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEZpbmQgYSBwb3NpdGlvbiBvbiB0aGUgc3RhcnQgc3BpbmUgb2YgYHRoaXMudW5wbGFjZWRgIHRoYXQgaGFzXG4gICAgLy8gY29udGVudCB0aGF0IGNhbiBiZSBtb3ZlZCBzb21ld2hlcmUgb24gdGhlIGZyb250aWVyLiBSZXR1cm5zIHR3b1xuICAgIC8vIGRlcHRocywgb25lIGZvciB0aGUgc2xpY2UgYW5kIG9uZSBmb3IgdGhlIGZyb250aWVyLlxuICAgIGZpbmRGaXR0YWJsZSgpIHtcbiAgICAgICAgbGV0IHN0YXJ0RGVwdGggPSB0aGlzLnVucGxhY2VkLm9wZW5TdGFydDtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gdGhpcy51bnBsYWNlZC5jb250ZW50LCBkID0gMCwgb3BlbkVuZCA9IHRoaXMudW5wbGFjZWQub3BlbkVuZDsgZCA8IHN0YXJ0RGVwdGg7IGQrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBjdXIuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmIChjdXIuY2hpbGRDb3VudCA+IDEpXG4gICAgICAgICAgICAgICAgb3BlbkVuZCA9IDA7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nICYmIG9wZW5FbmQgPD0gZCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGVwdGggPSBkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyID0gbm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgdHJ5IHdyYXBwaW5nIG5vZGVzIChwYXNzIDIpIGFmdGVyIGZpbmRpbmcgYSBwbGFjZSB3aXRob3V0XG4gICAgICAgIC8vIHdyYXBwaW5nIGZhaWxlZC5cbiAgICAgICAgZm9yIChsZXQgcGFzcyA9IDE7IHBhc3MgPD0gMjsgcGFzcysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbGljZURlcHRoID0gcGFzcyA9PSAxID8gc3RhcnREZXB0aCA6IHRoaXMudW5wbGFjZWQub3BlblN0YXJ0OyBzbGljZURlcHRoID49IDA7IHNsaWNlRGVwdGgtLSkge1xuICAgICAgICAgICAgICAgIGxldCBmcmFnbWVudCwgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoc2xpY2VEZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBjb250ZW50QXQodGhpcy51bnBsYWNlZC5jb250ZW50LCBzbGljZURlcHRoIC0gMSkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBwYXJlbnQuY29udGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy51bnBsYWNlZC5jb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZyb250aWVyRGVwdGggPSB0aGlzLmRlcHRoOyBmcm9udGllckRlcHRoID49IDA7IGZyb250aWVyRGVwdGgtLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBtYXRjaCB9ID0gdGhpcy5mcm9udGllcltmcm9udGllckRlcHRoXSwgd3JhcCwgaW5qZWN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gcGFzcyAxLCBpZiB0aGUgbmV4dCBub2RlIG1hdGNoZXMsIG9yIHRoZXJlIGlzIG5vIG5leHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSBidXQgdGhlIHBhcmVudHMgbG9vayBjb21wYXRpYmxlLCB3ZSd2ZSBmb3VuZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSAxICYmIChmaXJzdCA/IG1hdGNoLm1hdGNoVHlwZShmaXJzdC50eXBlKSB8fCAoaW5qZWN0ID0gbWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5mcm9tKGZpcnN0KSwgZmFsc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJlbnQgJiYgdHlwZS5jb21wYXRpYmxlQ29udGVudChwYXJlbnQudHlwZSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2xpY2VEZXB0aCwgZnJvbnRpZXJEZXB0aCwgcGFyZW50LCBpbmplY3QgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gcGFzcyAyLCBsb29rIGZvciBhIHNldCBvZiB3cmFwcGluZyBub2RlcyB0aGF0IG1ha2VcbiAgICAgICAgICAgICAgICAgICAgLy8gYGZpcnN0YCBmaXQgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzcyA9PSAyICYmIGZpcnN0ICYmICh3cmFwID0gbWF0Y2guZmluZFdyYXBwaW5nKGZpcnN0LnR5cGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgd3JhcCB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjb250aW51ZSBsb29raW5nIGZ1cnRoZXIgdXAgaWYgdGhlIHBhcmVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGZpdCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIG1hdGNoLm1hdGNoVHlwZShwYXJlbnQudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3Blbk1vcmUoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gdGhpcy51bnBsYWNlZDtcbiAgICAgICAgbGV0IGlubmVyID0gY29udGVudEF0KGNvbnRlbnQsIG9wZW5TdGFydCk7XG4gICAgICAgIGlmICghaW5uZXIuY2hpbGRDb3VudCB8fCBpbm5lci5maXJzdENoaWxkLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShjb250ZW50LCBvcGVuU3RhcnQgKyAxLCBNYXRoLm1heChvcGVuRW5kLCBpbm5lci5zaXplICsgb3BlblN0YXJ0ID49IGNvbnRlbnQuc2l6ZSAtIG9wZW5FbmQgPyBvcGVuU3RhcnQgKyAxIDogMCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZHJvcE5vZGUoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gdGhpcy51bnBsYWNlZDtcbiAgICAgICAgbGV0IGlubmVyID0gY29udGVudEF0KGNvbnRlbnQsIG9wZW5TdGFydCk7XG4gICAgICAgIGlmIChpbm5lci5jaGlsZENvdW50IDw9IDEgJiYgb3BlblN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgbGV0IG9wZW5BdEVuZCA9IGNvbnRlbnQuc2l6ZSAtIG9wZW5TdGFydCA8PSBvcGVuU3RhcnQgKyBpbm5lci5zaXplO1xuICAgICAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KGNvbnRlbnQsIG9wZW5TdGFydCAtIDEsIDEpLCBvcGVuU3RhcnQgLSAxLCBvcGVuQXRFbmQgPyBvcGVuU3RhcnQgLSAxIDogb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVucGxhY2VkID0gbmV3IFNsaWNlKGRyb3BGcm9tRnJhZ21lbnQoY29udGVudCwgb3BlblN0YXJ0LCAxKSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNb3ZlIGNvbnRlbnQgZnJvbSB0aGUgdW5wbGFjZWQgc2xpY2UgYXQgYHNsaWNlRGVwdGhgIHRvIHRoZVxuICAgIC8vIGZyb250aWVyIG5vZGUgYXQgYGZyb250aWVyRGVwdGhgLiBDbG9zZSB0aGF0IGZyb250aWVyIG5vZGUgd2hlblxuICAgIC8vIGFwcGxpY2FibGUuXG4gICAgcGxhY2VOb2Rlcyh7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgaW5qZWN0LCB3cmFwIH0pIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGVwdGggPiBmcm9udGllckRlcHRoKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICBpZiAod3JhcClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Gcm9udGllck5vZGUod3JhcFtpXSk7XG4gICAgICAgIGxldCBzbGljZSA9IHRoaXMudW5wbGFjZWQsIGZyYWdtZW50ID0gcGFyZW50ID8gcGFyZW50LmNvbnRlbnQgOiBzbGljZS5jb250ZW50O1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0gc2xpY2Uub3BlblN0YXJ0IC0gc2xpY2VEZXB0aDtcbiAgICAgICAgbGV0IHRha2VuID0gMCwgYWRkID0gW107XG4gICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2Zyb250aWVyRGVwdGhdO1xuICAgICAgICBpZiAoaW5qZWN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICAgICAgYWRkLnB1c2goaW5qZWN0LmNoaWxkKGkpKTtcbiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2gubWF0Y2hGcmFnbWVudChpbmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbXB1dGVzIHRoZSBhbW91bnQgb2YgKGVuZCkgb3BlbiBub2RlcyBhdCB0aGUgZW5kIG9mIHRoZVxuICAgICAgICAvLyBmcmFnbWVudC4gV2hlbiAwLCB0aGUgcGFyZW50IGlzIG9wZW4sIGJ1dCBubyBtb3JlLiBXaGVuXG4gICAgICAgIC8vIG5lZ2F0aXZlLCBub3RoaW5nIGlzIG9wZW4uXG4gICAgICAgIGxldCBvcGVuRW5kQ291bnQgPSAoZnJhZ21lbnQuc2l6ZSArIHNsaWNlRGVwdGgpIC0gKHNsaWNlLmNvbnRlbnQuc2l6ZSAtIHNsaWNlLm9wZW5FbmQpO1xuICAgICAgICAvLyBTY2FuIG92ZXIgdGhlIGZyYWdtZW50LCBmaXR0aW5nIGFzIG1hbnkgY2hpbGQgbm9kZXMgYXNcbiAgICAgICAgLy8gcG9zc2libGUuXG4gICAgICAgIHdoaWxlICh0YWtlbiA8IGZyYWdtZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZnJhZ21lbnQuY2hpbGQodGFrZW4pLCBtYXRjaGVzID0gbWF0Y2gubWF0Y2hUeXBlKG5leHQudHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB0YWtlbisrO1xuICAgICAgICAgICAgaWYgKHRha2VuID4gMSB8fCBvcGVuU3RhcnQgPT0gMCB8fCBuZXh0LmNvbnRlbnQuc2l6ZSkgeyAvLyBEcm9wIGVtcHR5IG9wZW4gbm9kZXNcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXM7XG4gICAgICAgICAgICAgICAgYWRkLnB1c2goY2xvc2VOb2RlU3RhcnQobmV4dC5tYXJrKHR5cGUuYWxsb3dlZE1hcmtzKG5leHQubWFya3MpKSwgdGFrZW4gPT0gMSA/IG9wZW5TdGFydCA6IDAsIHRha2VuID09IGZyYWdtZW50LmNoaWxkQ291bnQgPyBvcGVuRW5kQ291bnQgOiAtMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0b0VuZCA9IHRha2VuID09IGZyYWdtZW50LmNoaWxkQ291bnQ7XG4gICAgICAgIGlmICghdG9FbmQpXG4gICAgICAgICAgICBvcGVuRW5kQ291bnQgPSAtMTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCBmcm9udGllckRlcHRoLCBGcmFnbWVudC5mcm9tKGFkZCkpO1xuICAgICAgICB0aGlzLmZyb250aWVyW2Zyb250aWVyRGVwdGhdLm1hdGNoID0gbWF0Y2g7XG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgdHlwZXMgbWF0Y2gsIGFuZCB0aGUgZW50aXJlIG5vZGUgd2FzIG1vdmVkLCBhbmRcbiAgICAgICAgLy8gaXQncyBub3Qgb3BlbiwgY2xvc2UgdGhpcyBmcm9udGllciBub2RlIHJpZ2h0IGF3YXkuXG4gICAgICAgIGlmICh0b0VuZCAmJiBvcGVuRW5kQ291bnQgPCAwICYmIHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PSB0aGlzLmZyb250aWVyW3RoaXMuZGVwdGhdLnR5cGUgJiYgdGhpcy5mcm9udGllci5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICAvLyBBZGQgbmV3IGZyb250aWVyIG5vZGVzIGZvciBhbnkgb3BlbiBub2RlcyBhdCB0aGUgZW5kLlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgY3VyID0gZnJhZ21lbnQ7IGkgPCBvcGVuRW5kQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBjdXIubGFzdENoaWxkO1xuICAgICAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHsgdHlwZTogbm9kZS50eXBlLCBtYXRjaDogbm9kZS5jb250ZW50TWF0Y2hBdChub2RlLmNoaWxkQ291bnQpIH0pO1xuICAgICAgICAgICAgY3VyID0gbm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBgdGhpcy51bnBsYWNlZGAuIERyb3AgdGhlIGVudGlyZSBub2RlIGZyb20gd2hpY2ggd2VcbiAgICAgICAgLy8gcGxhY2VkIGl0IHdlIGdvdCB0byBpdHMgZW5kLCBvdGhlcndpc2UganVzdCBkcm9wIHRoZSBwbGFjZWRcbiAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgIHRoaXMudW5wbGFjZWQgPSAhdG9FbmQgPyBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChzbGljZS5jb250ZW50LCBzbGljZURlcHRoLCB0YWtlbiksIHNsaWNlLm9wZW5TdGFydCwgc2xpY2Uub3BlbkVuZClcbiAgICAgICAgICAgIDogc2xpY2VEZXB0aCA9PSAwID8gU2xpY2UuZW1wdHlcbiAgICAgICAgICAgICAgICA6IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KHNsaWNlLmNvbnRlbnQsIHNsaWNlRGVwdGggLSAxLCAxKSwgc2xpY2VEZXB0aCAtIDEsIG9wZW5FbmRDb3VudCA8IDAgPyBzbGljZS5vcGVuRW5kIDogc2xpY2VEZXB0aCAtIDEpO1xuICAgIH1cbiAgICBtdXN0TW92ZUlubGluZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiR0by5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLmZyb250aWVyW3RoaXMuZGVwdGhdLCBsZXZlbDtcbiAgICAgICAgaWYgKCF0b3AudHlwZS5pc1RleHRibG9jayB8fCAhY29udGVudEFmdGVyRml0cyh0aGlzLiR0bywgdGhpcy4kdG8uZGVwdGgsIHRvcC50eXBlLCB0b3AubWF0Y2gsIGZhbHNlKSB8fFxuICAgICAgICAgICAgKHRoaXMuJHRvLmRlcHRoID09IHRoaXMuZGVwdGggJiYgKGxldmVsID0gdGhpcy5maW5kQ2xvc2VMZXZlbCh0aGlzLiR0bykpICYmIGxldmVsLmRlcHRoID09IHRoaXMuZGVwdGgpKVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBsZXQgeyBkZXB0aCB9ID0gdGhpcy4kdG8sIGFmdGVyID0gdGhpcy4kdG8uYWZ0ZXIoZGVwdGgpO1xuICAgICAgICB3aGlsZSAoZGVwdGggPiAxICYmIGFmdGVyID09IHRoaXMuJHRvLmVuZCgtLWRlcHRoKSlcbiAgICAgICAgICAgICsrYWZ0ZXI7XG4gICAgICAgIHJldHVybiBhZnRlcjtcbiAgICB9XG4gICAgZmluZENsb3NlTGV2ZWwoJHRvKSB7XG4gICAgICAgIHNjYW46IGZvciAobGV0IGkgPSBNYXRoLm1pbih0aGlzLmRlcHRoLCAkdG8uZGVwdGgpOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHsgbWF0Y2gsIHR5cGUgfSA9IHRoaXMuZnJvbnRpZXJbaV07XG4gICAgICAgICAgICBsZXQgZHJvcElubmVyID0gaSA8ICR0by5kZXB0aCAmJiAkdG8uZW5kKGkgKyAxKSA9PSAkdG8ucG9zICsgKCR0by5kZXB0aCAtIChpICsgMSkpO1xuICAgICAgICAgICAgbGV0IGZpdCA9IGNvbnRlbnRBZnRlckZpdHMoJHRvLCBpLCB0eXBlLCBtYXRjaCwgZHJvcElubmVyKTtcbiAgICAgICAgICAgIGlmICghZml0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgZCA9IGkgLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2RdO1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gY29udGVudEFmdGVyRml0cygkdG8sIGQsIHR5cGUsIG1hdGNoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5jaGlsZENvdW50KVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzY2FuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGVwdGg6IGksIGZpdCwgbW92ZTogZHJvcElubmVyID8gJHRvLmRvYy5yZXNvbHZlKCR0by5hZnRlcihpICsgMSkpIDogJHRvIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xvc2UoJHRvKSB7XG4gICAgICAgIGxldCBjbG9zZSA9IHRoaXMuZmluZENsb3NlTGV2ZWwoJHRvKTtcbiAgICAgICAgaWYgKCFjbG9zZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAodGhpcy5kZXB0aCA+IGNsb3NlLmRlcHRoKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICBpZiAoY2xvc2UuZml0LmNoaWxkQ291bnQpXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIGNsb3NlLmRlcHRoLCBjbG9zZS5maXQpO1xuICAgICAgICAkdG8gPSBjbG9zZS5tb3ZlO1xuICAgICAgICBmb3IgKGxldCBkID0gY2xvc2UuZGVwdGggKyAxOyBkIDw9ICR0by5kZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9ICR0by5ub2RlKGQpLCBhZGQgPSBub2RlLnR5cGUuY29udGVudE1hdGNoLmZpbGxCZWZvcmUobm9kZS5jb250ZW50LCB0cnVlLCAkdG8uaW5kZXgoZCkpO1xuICAgICAgICAgICAgdGhpcy5vcGVuRnJvbnRpZXJOb2RlKG5vZGUudHlwZSwgbm9kZS5hdHRycywgYWRkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJHRvO1xuICAgIH1cbiAgICBvcGVuRnJvbnRpZXJOb2RlKHR5cGUsIGF0dHJzID0gbnVsbCwgY29udGVudCkge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy5mcm9udGllclt0aGlzLmRlcHRoXTtcbiAgICAgICAgdG9wLm1hdGNoID0gdG9wLm1hdGNoLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCB0aGlzLmRlcHRoLCBGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGF0dHJzLCBjb250ZW50KSkpO1xuICAgICAgICB0aGlzLmZyb250aWVyLnB1c2goeyB0eXBlLCBtYXRjaDogdHlwZS5jb250ZW50TWF0Y2ggfSk7XG4gICAgfVxuICAgIGNsb3NlRnJvbnRpZXJOb2RlKCkge1xuICAgICAgICBsZXQgb3BlbiA9IHRoaXMuZnJvbnRpZXIucG9wKCk7XG4gICAgICAgIGxldCBhZGQgPSBvcGVuLm1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICBpZiAoYWRkLmNoaWxkQ291bnQpXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIHRoaXMuZnJvbnRpZXIubGVuZ3RoLCBhZGQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRyb3BGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIGRlcHRoLCBjb3VudCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQuY3V0QnlJbmRleChjb3VudCwgZnJhZ21lbnQuY2hpbGRDb3VudCk7XG4gICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2VDaGlsZCgwLCBmcmFnbWVudC5maXJzdENoaWxkLmNvcHkoZHJvcEZyb21GcmFnbWVudChmcmFnbWVudC5maXJzdENoaWxkLmNvbnRlbnQsIGRlcHRoIC0gMSwgY291bnQpKSk7XG59XG5mdW5jdGlvbiBhZGRUb0ZyYWdtZW50KGZyYWdtZW50LCBkZXB0aCwgY29udGVudCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoZnJhZ21lbnQuY2hpbGRDb3VudCAtIDEsIGZyYWdtZW50Lmxhc3RDaGlsZC5jb3B5KGFkZFRvRnJhZ21lbnQoZnJhZ21lbnQubGFzdENoaWxkLmNvbnRlbnQsIGRlcHRoIC0gMSwgY29udGVudCkpKTtcbn1cbmZ1bmN0aW9uIGNvbnRlbnRBdChmcmFnbWVudCwgZGVwdGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgIHJldHVybiBmcmFnbWVudDtcbn1cbmZ1bmN0aW9uIGNsb3NlTm9kZVN0YXJ0KG5vZGUsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGlmIChvcGVuU3RhcnQgPD0gMClcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgbGV0IGZyYWcgPSBub2RlLmNvbnRlbnQ7XG4gICAgaWYgKG9wZW5TdGFydCA+IDEpXG4gICAgICAgIGZyYWcgPSBmcmFnLnJlcGxhY2VDaGlsZCgwLCBjbG9zZU5vZGVTdGFydChmcmFnLmZpcnN0Q2hpbGQsIG9wZW5TdGFydCAtIDEsIGZyYWcuY2hpbGRDb3VudCA9PSAxID8gb3BlbkVuZCAtIDEgOiAwKSk7XG4gICAgaWYgKG9wZW5TdGFydCA+IDApIHtcbiAgICAgICAgZnJhZyA9IG5vZGUudHlwZS5jb250ZW50TWF0Y2guZmlsbEJlZm9yZShmcmFnKS5hcHBlbmQoZnJhZyk7XG4gICAgICAgIGlmIChvcGVuRW5kIDw9IDApXG4gICAgICAgICAgICBmcmFnID0gZnJhZy5hcHBlbmQobm9kZS50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGZyYWcpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUuY29weShmcmFnKTtcbn1cbmZ1bmN0aW9uIGNvbnRlbnRBZnRlckZpdHMoJHRvLCBkZXB0aCwgdHlwZSwgbWF0Y2gsIG9wZW4pIHtcbiAgICBsZXQgbm9kZSA9ICR0by5ub2RlKGRlcHRoKSwgaW5kZXggPSBvcGVuID8gJHRvLmluZGV4QWZ0ZXIoZGVwdGgpIDogJHRvLmluZGV4KGRlcHRoKTtcbiAgICBpZiAoaW5kZXggPT0gbm9kZS5jaGlsZENvdW50ICYmICF0eXBlLmNvbXBhdGlibGVDb250ZW50KG5vZGUudHlwZSkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmaXQgPSBtYXRjaC5maWxsQmVmb3JlKG5vZGUuY29udGVudCwgdHJ1ZSwgaW5kZXgpO1xuICAgIHJldHVybiBmaXQgJiYgIWludmFsaWRNYXJrcyh0eXBlLCBub2RlLmNvbnRlbnQsIGluZGV4KSA/IGZpdCA6IG51bGw7XG59XG5mdW5jdGlvbiBpbnZhbGlkTWFya3ModHlwZSwgZnJhZ21lbnQsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZnJhZ21lbnQuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICBpZiAoIXR5cGUuYWxsb3dzTWFya3MoZnJhZ21lbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZGVmaW5lc0NvbnRlbnQodHlwZSkge1xuICAgIHJldHVybiB0eXBlLnNwZWMuZGVmaW5pbmcgfHwgdHlwZS5zcGVjLmRlZmluaW5nRm9yQ29udGVudDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VSYW5nZSh0ciwgZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgaWYgKCFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gdHIuZGVsZXRlUmFuZ2UoZnJvbSwgdG8pO1xuICAgIGxldCAkZnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pLCAkdG8gPSB0ci5kb2MucmVzb2x2ZSh0byk7XG4gICAgaWYgKGZpdHNUcml2aWFsbHkoJGZyb20sICR0bywgc2xpY2UpKVxuICAgICAgICByZXR1cm4gdHIuc3RlcChuZXcgUmVwbGFjZVN0ZXAoZnJvbSwgdG8sIHNsaWNlKSk7XG4gICAgbGV0IHRhcmdldERlcHRocyA9IGNvdmVyZWREZXB0aHMoJGZyb20sIHRyLmRvYy5yZXNvbHZlKHRvKSk7XG4gICAgLy8gQ2FuJ3QgcmVwbGFjZSB0aGUgd2hvbGUgZG9jdW1lbnQsIHNvIHJlbW92ZSAwIGlmIGl0J3MgcHJlc2VudFxuICAgIGlmICh0YXJnZXREZXB0aHNbdGFyZ2V0RGVwdGhzLmxlbmd0aCAtIDFdID09IDApXG4gICAgICAgIHRhcmdldERlcHRocy5wb3AoKTtcbiAgICAvLyBOZWdhdGl2ZSBudW1iZXJzIHJlcHJlc2VudCBub3QgZXhwYW5zaW9uIG92ZXIgdGhlIHdob2xlIG5vZGUgYXRcbiAgICAvLyB0aGF0IGRlcHRoLCBidXQgcmVwbGFjaW5nIGZyb20gJGZyb20uYmVmb3JlKC1EKSB0byAkdG8ucG9zLlxuICAgIGxldCBwcmVmZXJyZWRUYXJnZXQgPSAtKCRmcm9tLmRlcHRoICsgMSk7XG4gICAgdGFyZ2V0RGVwdGhzLnVuc2hpZnQocHJlZmVycmVkVGFyZ2V0KTtcbiAgICAvLyBUaGlzIGxvb3AgcGlja3MgYSBwcmVmZXJyZWQgdGFyZ2V0IGRlcHRoLCBpZiBvbmUgb2YgdGhlIGNvdmVyaW5nXG4gICAgLy8gZGVwdGhzIGlzIG5vdCBvdXRzaWRlIG9mIGEgZGVmaW5pbmcgbm9kZSwgYW5kIGFkZHMgbmVnYXRpdmVcbiAgICAvLyBkZXB0aHMgZm9yIGFueSBkZXB0aCB0aGF0IGhhcyAkZnJvbSBhdCBpdHMgc3RhcnQgYW5kIGRvZXMgbm90XG4gICAgLy8gY3Jvc3MgYSBkZWZpbmluZyBub2RlLlxuICAgIGZvciAobGV0IGQgPSAkZnJvbS5kZXB0aCwgcG9zID0gJGZyb20ucG9zIC0gMTsgZCA+IDA7IGQtLSwgcG9zLS0pIHtcbiAgICAgICAgbGV0IHNwZWMgPSAkZnJvbS5ub2RlKGQpLnR5cGUuc3BlYztcbiAgICAgICAgaWYgKHNwZWMuZGVmaW5pbmcgfHwgc3BlYy5kZWZpbmluZ0FzQ29udGV4dCB8fCBzcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAodGFyZ2V0RGVwdGhzLmluZGV4T2YoZCkgPiAtMSlcbiAgICAgICAgICAgIHByZWZlcnJlZFRhcmdldCA9IGQ7XG4gICAgICAgIGVsc2UgaWYgKCRmcm9tLmJlZm9yZShkKSA9PSBwb3MpXG4gICAgICAgICAgICB0YXJnZXREZXB0aHMuc3BsaWNlKDEsIDAsIC1kKTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpdCBlYWNoIHBvc3NpYmxlIGRlcHRoIG9mIHRoZSBzbGljZSBpbnRvIGVhY2ggcG9zc2libGVcbiAgICAvLyB0YXJnZXQgZGVwdGgsIHN0YXJ0aW5nIHdpdGggdGhlIHByZWZlcnJlZCBkZXB0aHMuXG4gICAgbGV0IHByZWZlcnJlZFRhcmdldEluZGV4ID0gdGFyZ2V0RGVwdGhzLmluZGV4T2YocHJlZmVycmVkVGFyZ2V0KTtcbiAgICBsZXQgbGVmdE5vZGVzID0gW10sIHByZWZlcnJlZERlcHRoID0gc2xpY2Uub3BlblN0YXJ0O1xuICAgIGZvciAobGV0IGNvbnRlbnQgPSBzbGljZS5jb250ZW50LCBpID0gMDs7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IGNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgbGVmdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChpID09IHNsaWNlLm9wZW5TdGFydClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjb250ZW50ID0gbm9kZS5jb250ZW50O1xuICAgIH1cbiAgICAvLyBCYWNrIHVwIHByZWZlcnJlZERlcHRoIHRvIGNvdmVyIGRlZmluaW5nIHRleHRibG9ja3MgZGlyZWN0bHlcbiAgICAvLyBhYm92ZSBpdCwgcG9zc2libHkgc2tpcHBpbmcgYSBub24tZGVmaW5pbmcgdGV4dGJsb2NrLlxuICAgIGZvciAobGV0IGQgPSBwcmVmZXJyZWREZXB0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBsZWZ0Tm9kZSA9IGxlZnROb2Rlc1tkXSwgZGVmID0gZGVmaW5lc0NvbnRlbnQobGVmdE5vZGUudHlwZSk7XG4gICAgICAgIGlmIChkZWYgJiYgIWxlZnROb2RlLnNhbWVNYXJrdXAoJGZyb20ubm9kZShNYXRoLmFicyhwcmVmZXJyZWRUYXJnZXQpIC0gMSkpKVxuICAgICAgICAgICAgcHJlZmVycmVkRGVwdGggPSBkO1xuICAgICAgICBlbHNlIGlmIChkZWYgfHwgIWxlZnROb2RlLnR5cGUuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IHNsaWNlLm9wZW5TdGFydDsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgbGV0IG9wZW5EZXB0aCA9IChqICsgcHJlZmVycmVkRGVwdGggKyAxKSAlIChzbGljZS5vcGVuU3RhcnQgKyAxKTtcbiAgICAgICAgbGV0IGluc2VydCA9IGxlZnROb2Rlc1tvcGVuRGVwdGhdO1xuICAgICAgICBpZiAoIWluc2VydClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldERlcHRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHBvc3NpYmxlIGV4cGFuc2lvbiBsZXZlbHMsIHN0YXJ0aW5nIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBwcmVmZXJyZWQgb25lXG4gICAgICAgICAgICBsZXQgdGFyZ2V0RGVwdGggPSB0YXJnZXREZXB0aHNbKGkgKyBwcmVmZXJyZWRUYXJnZXRJbmRleCkgJSB0YXJnZXREZXB0aHMubGVuZ3RoXSwgZXhwYW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0YXJnZXREZXB0aCA8IDApIHtcbiAgICAgICAgICAgICAgICBleHBhbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0YXJnZXREZXB0aCA9IC10YXJnZXREZXB0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5ub2RlKHRhcmdldERlcHRoIC0gMSksIGluZGV4ID0gJGZyb20uaW5kZXgodGFyZ2V0RGVwdGggLSAxKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBpbnNlcnQudHlwZSwgaW5zZXJ0Lm1hcmtzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHIucmVwbGFjZSgkZnJvbS5iZWZvcmUodGFyZ2V0RGVwdGgpLCBleHBhbmQgPyAkdG8uYWZ0ZXIodGFyZ2V0RGVwdGgpIDogdG8sIG5ldyBTbGljZShjbG9zZUZyYWdtZW50KHNsaWNlLmNvbnRlbnQsIDAsIHNsaWNlLm9wZW5TdGFydCwgb3BlbkRlcHRoKSwgb3BlbkRlcHRoLCBzbGljZS5vcGVuRW5kKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0YXJ0U3RlcHMgPSB0ci5zdGVwcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IHRhcmdldERlcHRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0ci5yZXBsYWNlKGZyb20sIHRvLCBzbGljZSk7XG4gICAgICAgIGlmICh0ci5zdGVwcy5sZW5ndGggPiBzdGFydFN0ZXBzKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBkZXB0aCA9IHRhcmdldERlcHRoc1tpXTtcbiAgICAgICAgaWYgKGRlcHRoIDwgMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmcm9tID0gJGZyb20uYmVmb3JlKGRlcHRoKTtcbiAgICAgICAgdG8gPSAkdG8uYWZ0ZXIoZGVwdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsb3NlRnJhZ21lbnQoZnJhZ21lbnQsIGRlcHRoLCBvbGRPcGVuLCBuZXdPcGVuLCBwYXJlbnQpIHtcbiAgICBpZiAoZGVwdGggPCBvbGRPcGVuKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQucmVwbGFjZUNoaWxkKDAsIGZpcnN0LmNvcHkoY2xvc2VGcmFnbWVudChmaXJzdC5jb250ZW50LCBkZXB0aCArIDEsIG9sZE9wZW4sIG5ld09wZW4sIGZpcnN0KSkpO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPiBuZXdPcGVuKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdCgwKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gbWF0Y2guZmlsbEJlZm9yZShmcmFnbWVudCkuYXBwZW5kKGZyYWdtZW50KTtcbiAgICAgICAgZnJhZ21lbnQgPSBzdGFydC5hcHBlbmQobWF0Y2gubWF0Y2hGcmFnbWVudChzdGFydCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiByZXBsYWNlUmFuZ2VXaXRoKHRyLCBmcm9tLCB0bywgbm9kZSkge1xuICAgIGlmICghbm9kZS5pc0lubGluZSAmJiBmcm9tID09IHRvICYmIHRyLmRvYy5yZXNvbHZlKGZyb20pLnBhcmVudC5jb250ZW50LnNpemUpIHtcbiAgICAgICAgbGV0IHBvaW50ID0gaW5zZXJ0UG9pbnQodHIuZG9jLCBmcm9tLCBub2RlLnR5cGUpO1xuICAgICAgICBpZiAocG9pbnQgIT0gbnVsbClcbiAgICAgICAgICAgIGZyb20gPSB0byA9IHBvaW50O1xuICAgIH1cbiAgICB0ci5yZXBsYWNlUmFuZ2UoZnJvbSwgdG8sIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKG5vZGUpLCAwLCAwKSk7XG59XG5mdW5jdGlvbiBkZWxldGVSYW5nZSh0ciwgZnJvbSwgdG8pIHtcbiAgICBsZXQgJGZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gdHIuZG9jLnJlc29sdmUodG8pO1xuICAgIGxldCBjb3ZlcmVkID0gY292ZXJlZERlcHRocygkZnJvbSwgJHRvKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdmVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRlcHRoID0gY292ZXJlZFtpXSwgbGFzdCA9IGkgPT0gY292ZXJlZC5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoKGxhc3QgJiYgZGVwdGggPT0gMCkgfHwgJGZyb20ubm9kZShkZXB0aCkudHlwZS5jb250ZW50TWF0Y2gudmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLnN0YXJ0KGRlcHRoKSwgJHRvLmVuZChkZXB0aCkpO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIChsYXN0IHx8ICRmcm9tLm5vZGUoZGVwdGggLSAxKS5jYW5SZXBsYWNlKCRmcm9tLmluZGV4KGRlcHRoIC0gMSksICR0by5pbmRleEFmdGVyKGRlcHRoIC0gMSkpKSlcbiAgICAgICAgICAgIHJldHVybiB0ci5kZWxldGUoJGZyb20uYmVmb3JlKGRlcHRoKSwgJHRvLmFmdGVyKGRlcHRoKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGQgPSAxOyBkIDw9ICRmcm9tLmRlcHRoICYmIGQgPD0gJHRvLmRlcHRoOyBkKyspIHtcbiAgICAgICAgaWYgKGZyb20gLSAkZnJvbS5zdGFydChkKSA9PSAkZnJvbS5kZXB0aCAtIGQgJiYgdG8gPiAkZnJvbS5lbmQoZCkgJiYgJHRvLmVuZChkKSAtIHRvICE9ICR0by5kZXB0aCAtIGQpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLmJlZm9yZShkKSwgdG8pO1xuICAgIH1cbiAgICB0ci5kZWxldGUoZnJvbSwgdG8pO1xufVxuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZGVwdGhzIGZvciB3aGljaCAkZnJvbSAtICR0byBzcGFucyB0aGVcbi8vIHdob2xlIGNvbnRlbnQgb2YgdGhlIG5vZGVzIGF0IHRoYXQgZGVwdGguXG5mdW5jdGlvbiBjb3ZlcmVkRGVwdGhzKCRmcm9tLCAkdG8pIHtcbiAgICBsZXQgcmVzdWx0ID0gW10sIG1pbkRlcHRoID0gTWF0aC5taW4oJGZyb20uZGVwdGgsICR0by5kZXB0aCk7XG4gICAgZm9yIChsZXQgZCA9IG1pbkRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5zdGFydChkKTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgJGZyb20ucG9zIC0gKCRmcm9tLmRlcHRoIC0gZCkgfHxcbiAgICAgICAgICAgICR0by5lbmQoZCkgPiAkdG8ucG9zICsgKCR0by5kZXB0aCAtIGQpIHx8XG4gICAgICAgICAgICAkZnJvbS5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcgfHxcbiAgICAgICAgICAgICR0by5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHN0YXJ0ID09ICR0by5zdGFydChkKSB8fFxuICAgICAgICAgICAgKGQgPT0gJGZyb20uZGVwdGggJiYgZCA9PSAkdG8uZGVwdGggJiYgJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQgJiYgJHRvLnBhcmVudC5pbmxpbmVDb250ZW50ICYmXG4gICAgICAgICAgICAgICAgZCAmJiAkdG8uc3RhcnQoZCAtIDEpID09IHN0YXJ0IC0gMSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaChkKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5VcGRhdGUgYW4gYXR0cmlidXRlIGluIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBBdHRyU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhbiBhdHRyaWJ1dGUgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxuICAgICovXG4gICAgYXR0ciwgXG4gICAgLy8gVGhlIGF0dHJpYnV0ZSdzIG5ldyB2YWx1ZS5cbiAgICB2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5hdHRyID0gYXR0cjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgYXR0cmlidXRlIHN0ZXAncyBwb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBub2RlLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBub2RlLmF0dHJzW25hbWVdO1xuICAgICAgICBhdHRyc1t0aGlzLmF0dHJdID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBub2RlLnR5cGUuY3JlYXRlKGF0dHJzLCBudWxsLCBub2RlLm1hcmtzKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLnBvcywgdGhpcy5wb3MgKyAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKSwgMCwgbm9kZS5pc0xlYWYgPyAwIDogMSkpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXR0clN0ZXAodGhpcy5wb3MsIHRoaXMuYXR0ciwgZG9jLm5vZGVBdCh0aGlzLnBvcykuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnBvcywgMSk7XG4gICAgICAgIHJldHVybiBwb3MuZGVsZXRlZEFmdGVyID8gbnVsbCA6IG5ldyBBdHRyU3RlcChwb3MucG9zLCB0aGlzLmF0dHIsIHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImF0dHJcIiwgcG9zOiB0aGlzLnBvcywgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEF0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJTdGVwKGpzb24ucG9zLCBqc29uLmF0dHIsIGpzb24udmFsdWUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYXR0clwiLCBBdHRyU3RlcCk7XG4vKipcblVwZGF0ZSBhbiBhdHRyaWJ1dGUgaW4gdGhlIGRvYyBub2RlLlxuKi9cbmNsYXNzIERvY0F0dHJTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGFuIGF0dHJpYnV0ZSBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGF0dHJpYnV0ZSB0byBzZXQuXG4gICAgKi9cbiAgICBhdHRyLCBcbiAgICAvLyBUaGUgYXR0cmlidXRlJ3MgbmV3IHZhbHVlLlxuICAgIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gZG9jLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBkb2MuYXR0cnNbbmFtZV07XG4gICAgICAgIGF0dHJzW3RoaXMuYXR0cl0gPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGRvYy50eXBlLmNyZWF0ZShhdHRycywgZG9jLmNvbnRlbnQsIGRvYy5tYXJrcyk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0Lm9rKHVwZGF0ZWQpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRG9jQXR0clN0ZXAodGhpcy5hdHRyLCBkb2MuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImRvY0F0dHJcIiwgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIERvY0F0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IERvY0F0dHJTdGVwKGpzb24uYXR0ciwganNvbi52YWx1ZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJkb2NBdHRyXCIsIERvY0F0dHJTdGVwKTtcblxuLyoqXG5AaW50ZXJuYWxcbiovXG5sZXQgVHJhbnNmb3JtRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbn07XG5UcmFuc2Zvcm1FcnJvciA9IGZ1bmN0aW9uIFRyYW5zZm9ybUVycm9yKG1lc3NhZ2UpIHtcbiAgICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgICBlcnIuX19wcm90b19fID0gVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlO1xuICAgIHJldHVybiBlcnI7XG59O1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHJhbnNmb3JtRXJyb3I7XG5UcmFuc2Zvcm1FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiVHJhbnNmb3JtRXJyb3JcIjtcbi8qKlxuQWJzdHJhY3Rpb24gdG8gYnVpbGQgdXAgYW5kIHRyYWNrIGFuIGFycmF5IG9mXG5bc3RlcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcCkgcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgdHJhbnNmb3JtYXRpb24uXG5cbk1vc3QgdHJhbnNmb3JtaW5nIG1ldGhvZHMgcmV0dXJuIHRoZSBgVHJhbnNmb3JtYCBvYmplY3QgaXRzZWxmLCBzb1xudGhhdCB0aGV5IGNhbiBiZSBjaGFpbmVkLlxuKi9cbmNsYXNzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdHJhbnNmb3JtIHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQgKHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zZm9ybSkuXG4gICAgKi9cbiAgICBkb2MpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RlcHMgaW4gdGhpcyB0cmFuc2Zvcm0uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBkb2N1bWVudHMgYmVmb3JlIGVhY2ggb2YgdGhlIHN0ZXBzLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRvY3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEEgbWFwcGluZyB3aXRoIHRoZSBtYXBzIGZvciBlYWNoIG9mIHRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zZm9ybS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydGluZyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBiZWZvcmUoKSB7IHJldHVybiB0aGlzLmRvY3MubGVuZ3RoID8gdGhpcy5kb2NzWzBdIDogdGhpcy5kb2M7IH1cbiAgICAvKipcbiAgICBBcHBseSBhIG5ldyBzdGVwIGluIHRoaXMgdHJhbnNmb3JtLCBzYXZpbmcgdGhlIHJlc3VsdC4gVGhyb3dzIGFuXG4gICAgZXJyb3Igd2hlbiB0aGUgc3RlcCBmYWlscy5cbiAgICAqL1xuICAgIHN0ZXAoc3RlcCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5tYXliZVN0ZXAoc3RlcCk7XG4gICAgICAgIGlmIChyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybUVycm9yKHJlc3VsdC5mYWlsZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIGFwcGx5IGEgc3RlcCBpbiB0aGlzIHRyYW5zZm9ybWF0aW9uLCBpZ25vcmluZyBpdCBpZiBpdFxuICAgIGZhaWxzLiBSZXR1cm5zIHRoZSBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIG1heWJlU3RlcChzdGVwKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgICAgaWYgKCFyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhpcy5hZGRTdGVwKHN0ZXAsIHJlc3VsdC5kb2MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQgKHdoZW4gdGhlcmUgYXJlIGFueVxuICAgIHN0ZXBzKS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZFN0ZXAoc3RlcCwgZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jcy5wdXNoKHRoaXMuZG9jKTtcbiAgICAgICAgdGhpcy5zdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICB0aGlzLm1hcHBpbmcuYXBwZW5kTWFwKHN0ZXAuZ2V0TWFwKCkpO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2Agd2l0aCB0aGVcbiAgICBnaXZlbiBgc2xpY2VgLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0byA9IGZyb20sIHNsaWNlID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgbGV0IHN0ZXAgPSByZXBsYWNlU3RlcCh0aGlzLmRvYywgZnJvbSwgdG8sIHNsaWNlKTtcbiAgICAgICAgaWYgKHN0ZXApXG4gICAgICAgICAgICB0aGlzLnN0ZXAoc3RlcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBnaXZlbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCB3aGljaCBtYXkgYmUgYVxuICAgIGZyYWdtZW50LCBub2RlLCBvciBhcnJheSBvZiBub2Rlcy5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKGZyb20sIHRvLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoZnJvbSwgdG8sIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGNvbnRlbnQpLCAwLCAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBkZWxldGUoZnJvbSwgdG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShmcm9tLCB0bywgU2xpY2UuZW1wdHkpO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnNlcnQgdGhlIGdpdmVuIGNvbnRlbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgaW5zZXJ0KHBvcywgY29udGVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChwb3MsIHBvcywgY29udGVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIHNsaWNlLCB1c2luZ1xuICAgIGBmcm9tYCwgYHRvYCwgYW5kIHRoZSBzbGljZSdzXG4gICAgW2BvcGVuU3RhcnRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2xpY2Uub3BlblN0YXJ0KSBwcm9wZXJ0eSBhcyBoaW50cywgcmF0aGVyXG4gICAgdGhhbiBmaXhlZCBzdGFydCBhbmQgZW5kIHBvaW50cy4gVGhpcyBtZXRob2QgbWF5IGdyb3cgdGhlXG4gICAgcmVwbGFjZWQgYXJlYSBvciBjbG9zZSBvcGVuIG5vZGVzIGluIHRoZSBzbGljZSBpbiBvcmRlciB0byBnZXQgYVxuICAgIGZpdCB0aGF0IGlzIG1vcmUgaW4gbGluZSB3aXRoIFdZU0lXWUcgZXhwZWN0YXRpb25zLCBieSBkcm9wcGluZ1xuICAgIGZ1bGx5IGNvdmVyZWQgcGFyZW50IG5vZGVzIG9mIHRoZSByZXBsYWNlZCByZWdpb24gd2hlbiB0aGV5IGFyZVxuICAgIG1hcmtlZCBbbm9uLWRlZmluaW5nIGFzXG4gICAgY29udGV4dF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmRlZmluaW5nQXNDb250ZXh0KSwgb3IgaW5jbHVkaW5nIGFuXG4gICAgb3BlbiBwYXJlbnQgbm9kZSBmcm9tIHRoZSBzbGljZSB0aGF0IF9pc18gbWFya2VkIGFzIFtkZWZpbmluZ1xuICAgIGl0cyBjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuZGVmaW5pbmdGb3JDb250ZW50KS5cbiAgICBcbiAgICBUaGlzIGlzIHRoZSBtZXRob2QsIGZvciBleGFtcGxlLCB0byBoYW5kbGUgcGFzdGUuIFRoZSBzaW1pbGFyXG4gICAgW2ByZXBsYWNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5UcmFuc2Zvcm0ucmVwbGFjZSkgbWV0aG9kIGlzIGEgbW9yZVxuICAgIHByaW1pdGl2ZSB0b29sIHdoaWNoIHdpbGwgX25vdF8gbW92ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiBpdHMgZ2l2ZW5cbiAgICByYW5nZSwgYW5kIGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIG1vcmUgcHJlY2lzZVxuICAgIGNvbnRyb2wgb3ZlciB3aGF0IGhhcHBlbnMuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2UoZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBmcm9tLCB0bywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aCBhIG5vZGUsIGJ1dCB1c2UgYGZyb21gIGFuZCBgdG9gIGFzXG4gICAgaGludHMsIHJhdGhlciB0aGFuIHByZWNpc2UgcG9zaXRpb25zLiBXaGVuIGZyb20gYW5kIHRvIGFyZSB0aGUgc2FtZVxuICAgIGFuZCBhcmUgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIHBhcmVudCBub2RlIGluIHdoaWNoIHRoZSBnaXZlblxuICAgIG5vZGUgZG9lc24ndCBmaXQsIHRoaXMgbWV0aG9kIG1heSBfbW92ZV8gdGhlbSBvdXQgdG93YXJkcyBhIHBhcmVudFxuICAgIHRoYXQgZG9lcyBhbGxvdyB0aGUgZ2l2ZW4gbm9kZSB0byBiZSBwbGFjZWQuIFdoZW4gdGhlIGdpdmVuIHJhbmdlXG4gICAgY29tcGxldGVseSBjb3ZlcnMgYSBwYXJlbnQgbm9kZSwgdGhpcyBtZXRob2QgbWF5IGNvbXBsZXRlbHkgcmVwbGFjZVxuICAgIHRoYXQgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBub2RlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZVdpdGgodGhpcywgZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVsZXRlIHRoZSBnaXZlbiByYW5nZSwgZXhwYW5kaW5nIGl0IHRvIGNvdmVyIGZ1bGx5IGNvdmVyZWRcbiAgICBwYXJlbnQgbm9kZXMgdW50aWwgYSB2YWxpZCByZXBsYWNlIGlzIGZvdW5kLlxuICAgICovXG4gICAgZGVsZXRlUmFuZ2UoZnJvbSwgdG8pIHtcbiAgICAgICAgZGVsZXRlUmFuZ2UodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU3BsaXQgdGhlIGNvbnRlbnQgaW4gdGhlIGdpdmVuIHJhbmdlIG9mZiBmcm9tIGl0cyBwYXJlbnQsIGlmIHRoZXJlXG4gICAgaXMgc2libGluZyBjb250ZW50IGJlZm9yZSBvciBhZnRlciBpdCwgYW5kIG1vdmUgaXQgdXAgdGhlIHRyZWUgdG9cbiAgICB0aGUgZGVwdGggc3BlY2lmaWVkIGJ5IGB0YXJnZXRgLiBZb3UnbGwgcHJvYmFibHkgd2FudCB0byB1c2VcbiAgICBbYGxpZnRUYXJnZXRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmxpZnRUYXJnZXQpIHRvIGNvbXB1dGUgYHRhcmdldGAsIHRvIG1ha2VcbiAgICBzdXJlIHRoZSBsaWZ0IGlzIHZhbGlkLlxuICAgICovXG4gICAgbGlmdChyYW5nZSwgdGFyZ2V0KSB7XG4gICAgICAgIGxpZnQodGhpcywgcmFuZ2UsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIHRoZSBibG9ja3MgYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi4gSWYgZGVwdGggaXMgMiwgdGhlaXJcbiAgICBsYXN0IGFuZCBmaXJzdCBzaWJsaW5ncyBhcmUgYWxzbyBqb2luZWQsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIGpvaW4ocG9zLCBkZXB0aCA9IDEpIHtcbiAgICAgICAgam9pbih0aGlzLCBwb3MsIGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFdyYXAgdGhlIGdpdmVuIFtyYW5nZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVSYW5nZSkgaW4gdGhlIGdpdmVuIHNldCBvZiB3cmFwcGVycy5cbiAgICBUaGUgd3JhcHBlcnMgYXJlIGFzc3VtZWQgdG8gYmUgdmFsaWQgaW4gdGhpcyBwb3NpdGlvbiwgYW5kIHNob3VsZFxuICAgIHByb2JhYmx5IGJlIGNvbXB1dGVkIHdpdGggW2BmaW5kV3JhcHBpbmdgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmZpbmRXcmFwcGluZykuXG4gICAgKi9cbiAgICB3cmFwKHJhbmdlLCB3cmFwcGVycykge1xuICAgICAgICB3cmFwKHRoaXMsIHJhbmdlLCB3cmFwcGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHR5cGUgb2YgYWxsIHRleHRibG9ja3MgKHBhcnRseSkgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgdG9cbiAgICB0aGUgZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBzZXRCbG9ja1R5cGUoZnJvbSwgdG8gPSBmcm9tLCB0eXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICAgICAgc2V0QmxvY2tUeXBlKHRoaXMsIGZyb20sIHRvLCB0eXBlLCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGFuZ2UgdGhlIHR5cGUsIGF0dHJpYnV0ZXMsIGFuZC9vciBtYXJrcyBvZiB0aGUgbm9kZSBhdCBgcG9zYC5cbiAgICBXaGVuIGB0eXBlYCBpc24ndCBnaXZlbiwgdGhlIGV4aXN0aW5nIG5vZGUgdHlwZSBpcyBwcmVzZXJ2ZWQsXG4gICAgKi9cbiAgICBzZXROb2RlTWFya3VwKHBvcywgdHlwZSwgYXR0cnMgPSBudWxsLCBtYXJrcykge1xuICAgICAgICBzZXROb2RlTWFya3VwKHRoaXMsIHBvcywgdHlwZSwgYXR0cnMsIG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCBhIHNpbmdsZSBhdHRyaWJ1dGUgb24gYSBnaXZlbiBub2RlIHRvIGEgbmV3IHZhbHVlLlxuICAgIFRoZSBgcG9zYCBhZGRyZXNzZXMgdGhlIGRvY3VtZW50IGNvbnRlbnQuIFVzZSBgc2V0RG9jQXR0cmlidXRlYFxuICAgIHRvIHNldCBhdHRyaWJ1dGVzIG9uIHRoZSBkb2N1bWVudCBpdHNlbGYuXG4gICAgKi9cbiAgICBzZXROb2RlQXR0cmlidXRlKHBvcywgYXR0ciwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdGVwKG5ldyBBdHRyU3RlcChwb3MsIGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgYSBzaW5nbGUgYXR0cmlidXRlIG9uIHRoZSBkb2N1bWVudCB0byBhIG5ldyB2YWx1ZS5cbiAgICAqL1xuICAgIHNldERvY0F0dHJpYnV0ZShhdHRyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnN0ZXAobmV3IERvY0F0dHJTdGVwKGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBtYXJrIHRvIHRoZSBub2RlIGF0IHBvc2l0aW9uIGBwb3NgLlxuICAgICovXG4gICAgYWRkTm9kZU1hcmsocG9zLCBtYXJrKSB7XG4gICAgICAgIHRoaXMuc3RlcChuZXcgQWRkTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayAob3IgYSBtYXJrIG9mIHRoZSBnaXZlbiB0eXBlKSBmcm9tIHRoZSBub2RlIGF0XG4gICAgcG9zaXRpb24gYHBvc2AuXG4gICAgKi9cbiAgICByZW1vdmVOb2RlTWFyayhwb3MsIG1hcmspIHtcbiAgICAgICAgaWYgKCEobWFyayBpbnN0YW5jZW9mIE1hcmspKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuZG9jLm5vZGVBdChwb3MpO1xuICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhdCBwb3NpdGlvbiBcIiArIHBvcyk7XG4gICAgICAgICAgICBtYXJrID0gbWFyay5pc0luU2V0KG5vZGUubWFya3MpO1xuICAgICAgICAgICAgaWYgKCFtYXJrKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcChuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU3BsaXQgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhbmQgb3B0aW9uYWxseSwgaWYgYGRlcHRoYCBpc1xuICAgIGdyZWF0ZXIgdGhhbiBvbmUsIGFueSBudW1iZXIgb2Ygbm9kZXMgYWJvdmUgdGhhdC4gQnkgZGVmYXVsdCwgdGhlXG4gICAgcGFydHMgc3BsaXQgb2ZmIHdpbGwgaW5oZXJpdCB0aGUgbm9kZSB0eXBlIG9mIHRoZSBvcmlnaW5hbCBub2RlLlxuICAgIFRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgcGFzc2luZyBhbiBhcnJheSBvZiB0eXBlcyBhbmQgYXR0cmlidXRlcyB0b1xuICAgIHVzZSBhZnRlciB0aGUgc3BsaXQuXG4gICAgKi9cbiAgICBzcGxpdChwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgICAgICBzcGxpdCh0aGlzLCBwb3MsIGRlcHRoLCB0eXBlc0FmdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG4gICAgKi9cbiAgICBhZGRNYXJrKGZyb20sIHRvLCBtYXJrKSB7XG4gICAgICAgIGFkZE1hcmsodGhpcywgZnJvbSwgdG8sIG1hcmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIG1hcmtzIGZyb20gaW5saW5lIG5vZGVzIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYG1hcmtgIGlzIGEgc2luZ2xlIG1hcmssIHJlbW92ZSBwcmVjaXNlbHkgdGhhdCBtYXJrLiBXaGVuIGl0IGlzXG4gICAgYSBtYXJrIHR5cGUsIHJlbW92ZSBhbGwgbWFya3Mgb2YgdGhhdCB0eXBlLiBXaGVuIGl0IGlzIG51bGwsXG4gICAgcmVtb3ZlIGFsbCBtYXJrcyBvZiBhbnkgdHlwZS5cbiAgICAqL1xuICAgIHJlbW92ZU1hcmsoZnJvbSwgdG8sIG1hcmspIHtcbiAgICAgICAgcmVtb3ZlTWFyayh0aGlzLCBmcm9tLCB0bywgbWFyayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIGFsbCBtYXJrcyBhbmQgbm9kZXMgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSBhdFxuICAgIGBwb3NgIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGdpdmVuIG5ldyBwYXJlbnQgbm9kZSB0eXBlLiBBY2NlcHRzXG4gICAgYW4gb3B0aW9uYWwgc3RhcnRpbmcgW2NvbnRlbnQgbWF0Y2hdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Db250ZW50TWF0Y2gpIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBjbGVhckluY29tcGF0aWJsZShwb3MsIHBhcmVudFR5cGUsIG1hdGNoKSB7XG4gICAgICAgIGNsZWFySW5jb21wYXRpYmxlKHRoaXMsIHBvcywgcGFyZW50VHlwZSwgbWF0Y2gpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IEFkZE1hcmtTdGVwLCBBZGROb2RlTWFya1N0ZXAsIEF0dHJTdGVwLCBEb2NBdHRyU3RlcCwgTWFwUmVzdWx0LCBNYXBwaW5nLCBSZW1vdmVNYXJrU3RlcCwgUmVtb3ZlTm9kZU1hcmtTdGVwLCBSZXBsYWNlQXJvdW5kU3RlcCwgUmVwbGFjZVN0ZXAsIFN0ZXAsIFN0ZXBNYXAsIFN0ZXBSZXN1bHQsIFRyYW5zZm9ybSwgVHJhbnNmb3JtRXJyb3IsIGNhbkpvaW4sIGNhblNwbGl0LCBkcm9wUG9pbnQsIGZpbmRXcmFwcGluZywgaW5zZXJ0UG9pbnQsIGpvaW5Qb2ludCwgbGlmdFRhcmdldCwgcmVwbGFjZVN0ZXAgfTtcbiIsICJpbXBvcnQgeyBTbGljZSwgRnJhZ21lbnQsIE1hcmssIE5vZGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBSZXBsYWNlU3RlcCwgUmVwbGFjZUFyb3VuZFN0ZXAsIFRyYW5zZm9ybSB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbmNvbnN0IGNsYXNzZXNCeUlkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuU3VwZXJjbGFzcyBmb3IgZWRpdG9yIHNlbGVjdGlvbnMuIEV2ZXJ5IHNlbGVjdGlvbiB0eXBlIHNob3VsZFxuZXh0ZW5kIHRoaXMuIFNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuKi9cbmNsYXNzIFNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgSW5pdGlhbGl6ZSBhIHNlbGVjdGlvbiB3aXRoIHRoZSBoZWFkIGFuZCBhbmNob3IgYW5kIHJhbmdlcy4gSWYgbm9cbiAgICByYW5nZXMgYXJlIGdpdmVuLCBjb25zdHJ1Y3RzIGEgc2luZ2xlIHJhbmdlIGFjcm9zcyBgJGFuY2hvcmAgYW5kXG4gICAgYCRoZWFkYC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCBhbmNob3Igb2YgdGhlIHNlbGVjdGlvbiAodGhlIHNpZGUgdGhhdCBzdGF5cyBpblxuICAgIHBsYWNlIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBtb2RpZmllZCkuXG4gICAgKi9cbiAgICAkYW5jaG9yLCBcbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgaGVhZCBvZiB0aGUgc2VsZWN0aW9uICh0aGUgc2lkZSB0aGF0IG1vdmVzIHdoZW5cbiAgICB0aGUgc2VsZWN0aW9uIGlzIG1vZGlmaWVkKS5cbiAgICAqL1xuICAgICRoZWFkLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy4kYW5jaG9yID0gJGFuY2hvcjtcbiAgICAgICAgdGhpcy4kaGVhZCA9ICRoZWFkO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcyB8fCBbbmV3IFNlbGVjdGlvblJhbmdlKCRhbmNob3IubWluKCRoZWFkKSwgJGFuY2hvci5tYXgoJGhlYWQpKV07XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBhbmNob3IsIGFzIGFuIHVucmVzb2x2ZWQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy4kYW5jaG9yLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBoZWFkLlxuICAgICovXG4gICAgZ2V0IGhlYWQoKSB7IHJldHVybiB0aGlzLiRoZWFkLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy4kZnJvbS5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHNlbGVjdGlvbidzIG1haW4gcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLiR0by5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgbG93ZXIgIGJvdW5kIG9mIHRoZSBzZWxlY3Rpb24ncyBtYWluIHJhbmdlLlxuICAgICovXG4gICAgZ2V0ICRmcm9tKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbMF0uJGZyb207XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCB1cHBlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCAkdG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlc1swXS4kdG87XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgYW55IGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocmFuZ2VzW2ldLiRmcm9tLnBvcyAhPSByYW5nZXNbaV0uJHRvLnBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBzZWxlY3Rpb24gYXMgYSBzbGljZS5cbiAgICAqL1xuICAgIGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRmcm9tLmRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8sIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBhIHNsaWNlIG9yLCBpZiBubyBzbGljZSBpcyBnaXZlbixcbiAgICBkZWxldGUgdGhlIHNlbGVjdGlvbi4gV2lsbCBhcHBlbmQgdG8gdGhlIGdpdmVuIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgIC8vIFB1dCB0aGUgbmV3IHNlbGVjdGlvbiBhdCB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIGluc2VydGVkXG4gICAgICAgIC8vIGNvbnRlbnQuIFdoZW4gdGhhdCBlbmRlZCBpbiBhbiBpbmxpbmUgbm9kZSwgc2VhcmNoIGJhY2t3YXJkcyxcbiAgICAgICAgLy8gdG8gZ2V0IHRoZSBwb3NpdGlvbiBhZnRlciB0aGF0IG5vZGUuIElmIG5vdCwgc2VhcmNoIGZvcndhcmQuXG4gICAgICAgIGxldCBsYXN0Tm9kZSA9IGNvbnRlbnQuY29udGVudC5sYXN0Q2hpbGQsIGxhc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQub3BlbkVuZDsgaSsrKSB7XG4gICAgICAgICAgICBsYXN0UGFyZW50ID0gbGFzdE5vZGU7XG4gICAgICAgICAgICBsYXN0Tm9kZSA9IGxhc3ROb2RlLmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aCwgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV0sIG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgdHIucmVwbGFjZVJhbmdlKG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIG1hcHBpbmcubWFwKCR0by5wb3MpLCBpID8gU2xpY2UuZW1wdHkgOiBjb250ZW50KTtcbiAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQodHIsIG1hcEZyb20sIChsYXN0Tm9kZSA/IGxhc3ROb2RlLmlzSW5saW5lIDogbGFzdFBhcmVudCAmJiBsYXN0UGFyZW50LmlzVGV4dGJsb2NrKSA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUsIGFwcGVuZGluZyB0aGUgY2hhbmdlc1xuICAgIHRvIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKHRyLCBub2RlKSB7XG4gICAgICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoLCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXSwgbWFwcGluZyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSk7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIHRvID0gbWFwcGluZy5tYXAoJHRvLnBvcyk7XG4gICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgIHRyLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyLnJlcGxhY2VSYW5nZVdpdGgoZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBtYXBGcm9tLCBub2RlLmlzSW5saW5lID8gLTEgOiAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gc3RhcnRpbmcgYXQgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gYW5kIHNlYXJjaGluZyBiYWNrIGlmIGBkaXJgIGlzIG5lZ2F0aXZlLCBhbmQgZm9yd2FyZCBpZlxuICAgIHBvc2l0aXZlLiBXaGVuIGB0ZXh0T25seWAgaXMgdHJ1ZSwgb25seSBjb25zaWRlciBjdXJzb3JcbiAgICBzZWxlY3Rpb25zLiBXaWxsIHJldHVybiBudWxsIHdoZW4gbm8gdmFsaWQgc2VsZWN0aW9uIHBvc2l0aW9uIGlzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEZyb20oJHBvcywgZGlyLCB0ZXh0T25seSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBpbm5lciA9ICRwb3MucGFyZW50LmlubGluZUNvbnRlbnQgPyBuZXcgVGV4dFNlbGVjdGlvbigkcG9zKVxuICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLnBhcmVudCwgJHBvcy5wb3MsICRwb3MuaW5kZXgoKSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgIGlmIChpbm5lcilcbiAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAkcG9zLmRlcHRoIC0gMTsgZGVwdGggPj0gMDsgZGVwdGgtLSkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZGlyIDwgMFxuICAgICAgICAgICAgICAgID8gZmluZFNlbGVjdGlvbkluKCRwb3Mubm9kZSgwKSwgJHBvcy5ub2RlKGRlcHRoKSwgJHBvcy5iZWZvcmUoZGVwdGggKyAxKSwgJHBvcy5pbmRleChkZXB0aCksIGRpciwgdGV4dE9ubHkpXG4gICAgICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLm5vZGUoZGVwdGgpLCAkcG9zLmFmdGVyKGRlcHRoICsgMSksICRwb3MuaW5kZXgoZGVwdGgpICsgMSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gbmVhciB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi4gU2VhcmNoZXMgZm9yd2FyZCBmaXJzdCBieSBkZWZhdWx0LCBidXQgaWYgYGJpYXNgIGlzXG4gICAgbmVnYXRpdmUsIGl0IHdpbGwgc2VhcmNoIGJhY2t3YXJkcyBmaXJzdC5cbiAgICAqL1xuICAgIHN0YXRpYyBuZWFyKCRwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRGcm9tKCRwb3MsIGJpYXMpIHx8IHRoaXMuZmluZEZyb20oJHBvcywgLWJpYXMpIHx8IG5ldyBBbGxTZWxlY3Rpb24oJHBvcy5ub2RlKDApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gY2xvc2VzdCB0byB0aGUgc3RhcnQgb2ZcbiAgICB0aGUgZ2l2ZW4gZG9jdW1lbnQuIFdpbGwgcmV0dXJuIGFuXG4gICAgW2BBbGxTZWxlY3Rpb25gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuQWxsU2VsZWN0aW9uKSBpZiBubyB2YWxpZCBwb3NpdGlvblxuICAgIGV4aXN0cy5cbiAgICAqL1xuICAgIHN0YXRpYyBhdFN0YXJ0KGRvYykge1xuICAgICAgICByZXR1cm4gZmluZFNlbGVjdGlvbkluKGRvYywgZG9jLCAwLCAwLCAxKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGN1cnNvciBvciBsZWFmIG5vZGUgc2VsZWN0aW9uIGNsb3Nlc3QgdG8gdGhlIGVuZCBvZiB0aGVcbiAgICBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBhdEVuZChkb2MpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3Rpb25Jbihkb2MsIGRvYywgZG9jLmNvbnRlbnQuc2l6ZSwgZG9jLmNoaWxkQ291bnQsIC0xKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc2VsZWN0aW9uLiBNdXN0IGJlXG4gICAgaW1wbGVtZW50ZWQgZm9yIGN1c3RvbSBjbGFzc2VzIChhcyBhIHN0YXRpYyBjbGFzcyBtZXRob2QpLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24udHlwZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgY2xzID0gY2xhc3Nlc0J5SWRbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCFjbHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc2VsZWN0aW9uIHR5cGUgJHtqc29uLnR5cGV9IGRlZmluZWRgKTtcbiAgICAgICAgcmV0dXJuIGNscy5mcm9tSlNPTihkb2MsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIGRlc2VyaWFsaXplIHNlbGVjdGlvbnMgZnJvbSBKU09OLCBjdXN0b20gc2VsZWN0aW9uXG4gICAgY2xhc3NlcyBtdXN0IHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBhbiBJRCBzdHJpbmcsIHNvIHRoYXQgdGhleVxuICAgIGNhbiBiZSBkaXNhbWJpZ3VhdGVkLiBUcnkgdG8gcGljayBzb21ldGhpbmcgdGhhdCdzIHVubGlrZWx5IHRvXG4gICAgY2xhc2ggd2l0aCBjbGFzc2VzIGZyb20gb3RoZXIgbW9kdWxlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBqc29uSUQoaWQsIHNlbGVjdGlvbkNsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBjbGFzc2VzQnlJZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRHVwbGljYXRlIHVzZSBvZiBzZWxlY3Rpb24gSlNPTiBJRCBcIiArIGlkKTtcbiAgICAgICAgY2xhc3Nlc0J5SWRbaWRdID0gc2VsZWN0aW9uQ2xhc3M7XG4gICAgICAgIHNlbGVjdGlvbkNsYXNzLnByb3RvdHlwZS5qc29uSUQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkNsYXNzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbYm9va21hcmtdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25Cb29rbWFyaykgZm9yIHRoaXMgc2VsZWN0aW9uLFxuICAgIHdoaWNoIGlzIGEgdmFsdWUgdGhhdCBjYW4gYmUgbWFwcGVkIHdpdGhvdXQgaGF2aW5nIGFjY2VzcyB0byBhXG4gICAgY3VycmVudCBkb2N1bWVudCwgYW5kIGxhdGVyIHJlc29sdmVkIHRvIGEgcmVhbCBzZWxlY3Rpb24gZm9yIGFcbiAgICBnaXZlbiBkb2N1bWVudCBhZ2Fpbi4gKFRoaXMgaXMgdXNlZCBtb3N0bHkgYnkgdGhlIGhpc3RvcnkgdG9cbiAgICB0cmFjayBhbmQgcmVzdG9yZSBvbGQgc2VsZWN0aW9ucy4pIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mXG4gICAgdGhpcyBtZXRob2QganVzdCBjb252ZXJ0cyB0aGUgc2VsZWN0aW9uIHRvIGEgdGV4dCBzZWxlY3Rpb24gYW5kXG4gICAgcmV0dXJucyB0aGUgYm9va21hcmsgZm9yIHRoYXQuXG4gICAgKi9cbiAgICBnZXRCb29rbWFyaygpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbih0aGlzLiRhbmNob3IsIHRoaXMuJGhlYWQpLmdldEJvb2ttYXJrKCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gdHJ1ZTtcbi8qKlxuUmVwcmVzZW50cyBhIHNlbGVjdGVkIHJhbmdlIGluIGEgZG9jdW1lbnQuXG4qL1xuY2xhc3MgU2VsZWN0aW9uUmFuZ2Uge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgICRmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgJHRvKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgfVxufVxubGV0IHdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tUZXh0U2VsZWN0aW9uKCRwb3MpIHtcbiAgICBpZiAoIXdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiAmJiAhJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICB3YXJuZWRBYm91dFRleHRTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBjb25zb2xlW1wid2FyblwiXShcIlRleHRTZWxlY3Rpb24gZW5kcG9pbnQgbm90IHBvaW50aW5nIGludG8gYSBub2RlIHdpdGggaW5saW5lIGNvbnRlbnQgKFwiICsgJHBvcy5wYXJlbnQudHlwZS5uYW1lICsgXCIpXCIpO1xuICAgIH1cbn1cbi8qKlxuQSB0ZXh0IHNlbGVjdGlvbiByZXByZXNlbnRzIGEgY2xhc3NpY2FsIGVkaXRvciBzZWxlY3Rpb24sIHdpdGggYVxuaGVhZCAodGhlIG1vdmluZyBzaWRlKSBhbmQgYW5jaG9yIChpbW1vYmlsZSBzaWRlKSwgYm90aCBvZiB3aGljaFxucG9pbnQgaW50byB0ZXh0YmxvY2sgbm9kZXMuIEl0IGNhbiBiZSBlbXB0eSAoYSByZWd1bGFyIGN1cnNvclxucG9zaXRpb24pLlxuKi9cbmNsYXNzIFRleHRTZWxlY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb24ge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHRleHQgc2VsZWN0aW9uIGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRhbmNob3IsICRoZWFkID0gJGFuY2hvcikge1xuICAgICAgICBjaGVja1RleHRTZWxlY3Rpb24oJGFuY2hvcik7XG4gICAgICAgIGNoZWNrVGV4dFNlbGVjdGlvbigkaGVhZCk7XG4gICAgICAgIHN1cGVyKCRhbmNob3IsICRoZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIHJlc29sdmVkIHBvc2l0aW9uIGlmIHRoaXMgaXMgYSBjdXJzb3Igc2VsZWN0aW9uIChhblxuICAgIGVtcHR5IHRleHQgc2VsZWN0aW9uKSwgYW5kIG51bGwgb3RoZXJ3aXNlLlxuICAgICovXG4gICAgZ2V0ICRjdXJzb3IoKSB7IHJldHVybiB0aGlzLiRhbmNob3IucG9zID09IHRoaXMuJGhlYWQucG9zID8gdGhpcy4kaGVhZCA6IG51bGw7IH1cbiAgICBtYXAoZG9jLCBtYXBwaW5nKSB7XG4gICAgICAgIGxldCAkaGVhZCA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHRoaXMuaGVhZCkpO1xuICAgICAgICBpZiAoISRoZWFkLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5uZWFyKCRoZWFkKTtcbiAgICAgICAgbGV0ICRhbmNob3IgPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcCh0aGlzLmFuY2hvcikpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRhbmNob3IgOiAkaGVhZCwgJGhlYWQpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgc3VwZXIucmVwbGFjZSh0ciwgY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50ID09IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSB0aGlzLiRmcm9tLm1hcmtzQWNyb3NzKHRoaXMuJHRvKTtcbiAgICAgICAgICAgIGlmIChtYXJrcylcbiAgICAgICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhtYXJrcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBvdGhlci5hbmNob3IgPT0gdGhpcy5hbmNob3IgJiYgb3RoZXIuaGVhZCA9PSB0aGlzLmhlYWQ7XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRleHRCb29rbWFyayh0aGlzLmFuY2hvciwgdGhpcy5oZWFkKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcInRleHRcIiwgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uYW5jaG9yICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaGVhZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBUZXh0U2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpLCBkb2MucmVzb2x2ZShqc29uLmhlYWQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGV4dCBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICBsZXQgJGFuY2hvciA9IGRvYy5yZXNvbHZlKGFuY2hvcik7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcygkYW5jaG9yLCBoZWFkID09IGFuY2hvciA/ICRhbmNob3IgOiBkb2MucmVzb2x2ZShoZWFkKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIHRleHQgc2VsZWN0aW9uIHRoYXQgc3BhbnMgdGhlIGdpdmVuIHBvc2l0aW9ucyBvciwgaWZcbiAgICB0aGV5IGFyZW4ndCB0ZXh0IHBvc2l0aW9ucywgZmluZCBhIHRleHQgc2VsZWN0aW9uIG5lYXIgdGhlbS5cbiAgICBgYmlhc2AgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtZXRob2Qgc2VhcmNoZXMgZm9yd2FyZCAoZGVmYXVsdClcbiAgICBvciBiYWNrd2FyZHMgKG5lZ2F0aXZlIG51bWJlcikgZmlyc3QuIFdpbGwgZmFsbCBiYWNrIHRvIGNhbGxpbmdcbiAgICBbYFNlbGVjdGlvbi5uZWFyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbl5uZWFyKSB3aGVuIHRoZSBkb2N1bWVudFxuICAgIGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIHRleHQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcykge1xuICAgICAgICBsZXQgZFBvcyA9ICRhbmNob3IucG9zIC0gJGhlYWQucG9zO1xuICAgICAgICBpZiAoIWJpYXMgfHwgZFBvcylcbiAgICAgICAgICAgIGJpYXMgPSBkUG9zID49IDAgPyAxIDogLTE7XG4gICAgICAgIGlmICghJGhlYWQucGFyZW50LmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IFNlbGVjdGlvbi5maW5kRnJvbSgkaGVhZCwgYmlhcywgdHJ1ZSkgfHwgU2VsZWN0aW9uLmZpbmRGcm9tKCRoZWFkLCAtYmlhcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgJGhlYWQgPSBmb3VuZC4kaGVhZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJGhlYWQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgaWYgKGRQb3MgPT0gMCkge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAkaGVhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAoU2VsZWN0aW9uLmZpbmRGcm9tKCRhbmNob3IsIC1iaWFzLCB0cnVlKSB8fCBTZWxlY3Rpb24uZmluZEZyb20oJGFuY2hvciwgYmlhcywgdHJ1ZSkpLiRhbmNob3I7XG4gICAgICAgICAgICAgICAgaWYgKCgkYW5jaG9yLnBvcyA8ICRoZWFkLnBvcykgIT0gKGRQb3MgPCAwKSlcbiAgICAgICAgICAgICAgICAgICAgJGFuY2hvciA9ICRoZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbigkYW5jaG9yLCAkaGVhZCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLmpzb25JRChcInRleHRcIiwgVGV4dFNlbGVjdGlvbik7XG5jbGFzcyBUZXh0Qm9va21hcmsge1xuICAgIGNvbnN0cnVjdG9yKGFuY2hvciwgaGVhZCkge1xuICAgICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICAgICAgdGhpcy5oZWFkID0gaGVhZDtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Qm9va21hcmsobWFwcGluZy5tYXAodGhpcy5hbmNob3IpLCBtYXBwaW5nLm1hcCh0aGlzLmhlYWQpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbihkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIGRvYy5yZXNvbHZlKHRoaXMuaGVhZCkpO1xuICAgIH1cbn1cbi8qKlxuQSBub2RlIHNlbGVjdGlvbiBpcyBhIHNlbGVjdGlvbiB0aGF0IHBvaW50cyBhdCBhIHNpbmdsZSBub2RlLiBBbGxcbm5vZGVzIG1hcmtlZCBbc2VsZWN0YWJsZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnNlbGVjdGFibGUpIGNhbiBiZSB0aGVcbnRhcmdldCBvZiBhIG5vZGUgc2VsZWN0aW9uLiBJbiBzdWNoIGEgc2VsZWN0aW9uLCBgZnJvbWAgYW5kIGB0b2BcbnBvaW50IGRpcmVjdGx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNlbGVjdGVkIG5vZGUsIGBhbmNob3JgIGVxdWFsc1xuYGZyb21gLCBhbmQgYGhlYWRgIGVxdWFscyBgdG9gLi5cbiovXG5jbGFzcyBOb2RlU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIHNlbGVjdGlvbi4gRG9lcyBub3QgdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBpdHNcbiAgICBhcmd1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRwb3MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgbGV0ICRlbmQgPSAkcG9zLm5vZGUoMCkucmVzb2x2ZSgkcG9zLnBvcyArIG5vZGUubm9kZVNpemUpO1xuICAgICAgICBzdXBlcigkcG9zLCAkZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICBpZiAoZGVsZXRlZClcbiAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKCRwb3MpO1xuICAgIH1cbiAgICBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odGhpcy5ub2RlKSwgMCwgMCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgb3RoZXIuYW5jaG9yID09IHRoaXMuYW5jaG9yO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwibm9kZVwiLCBhbmNob3I6IHRoaXMuYW5jaG9yIH07XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkgeyByZXR1cm4gbmV3IE5vZGVCb29rbWFyayh0aGlzLmFuY2hvcik7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihkb2MsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKGRvYy5yZXNvbHZlKGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIG1heSBiZSBzZWxlY3RlZCBhcyBhIG5vZGVcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgaXNTZWxlY3RhYmxlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICFub2RlLmlzVGV4dCAmJiBub2RlLnR5cGUuc3BlYy5zZWxlY3RhYmxlICE9PSBmYWxzZTtcbiAgICB9XG59XG5Ob2RlU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gZmFsc2U7XG5TZWxlY3Rpb24uanNvbklEKFwibm9kZVwiLCBOb2RlU2VsZWN0aW9uKTtcbmNsYXNzIE5vZGVCb29rbWFyayB7XG4gICAgY29uc3RydWN0b3IoYW5jaG9yKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQgPyBuZXcgVGV4dEJvb2ttYXJrKHBvcywgcG9zKSA6IG5ldyBOb2RlQm9va21hcmsocG9zKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oJHBvcyk7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICB9XG59XG4vKipcbkEgc2VsZWN0aW9uIHR5cGUgdGhhdCByZXByZXNlbnRzIHNlbGVjdGluZyB0aGUgd2hvbGUgZG9jdW1lbnRcbih3aGljaCBjYW4gbm90IG5lY2Vzc2FyaWx5IGJlIGV4cHJlc3NlZCB3aXRoIGEgdGV4dCBzZWxlY3Rpb24sIHdoZW5cbnRoZXJlIGFyZSBmb3IgZXhhbXBsZSBsZWFmIGJsb2NrIG5vZGVzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlXG5kb2N1bWVudCkuXG4qL1xuY2xhc3MgQWxsU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gYWxsLXNlbGVjdGlvbiBvdmVyIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvYykge1xuICAgICAgICBzdXBlcihkb2MucmVzb2x2ZSgwKSwgZG9jLnJlc29sdmUoZG9jLmNvbnRlbnQuc2l6ZSkpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgwLCB0ci5kb2MuY29udGVudC5zaXplKTtcbiAgICAgICAgICAgIGxldCBzZWwgPSBTZWxlY3Rpb24uYXRTdGFydCh0ci5kb2MpO1xuICAgICAgICAgICAgaWYgKCFzZWwuZXEodHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnJlcGxhY2UodHIsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgdHlwZTogXCJhbGxcIiB9OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBtYXAoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb247IH1cbiAgICBnZXRCb29rbWFyaygpIHsgcmV0dXJuIEFsbEJvb2ttYXJrOyB9XG59XG5TZWxlY3Rpb24uanNvbklEKFwiYWxsXCIsIEFsbFNlbGVjdGlvbik7XG5jb25zdCBBbGxCb29rbWFyayA9IHtcbiAgICBtYXAoKSB7IHJldHVybiB0aGlzOyB9LFxuICAgIHJlc29sdmUoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbn07XG4vLyBGSVhNRSB3ZSdsbCBuZWVkIHNvbWUgYXdhcmVuZXNzIG9mIHRleHQgZGlyZWN0aW9uIHdoZW4gc2Nhbm5pbmcgZm9yIHNlbGVjdGlvbnNcbi8vIFRyeSB0byBmaW5kIGEgc2VsZWN0aW9uIGluc2lkZSB0aGUgZ2l2ZW4gbm9kZS4gYHBvc2AgcG9pbnRzIGF0IHRoZVxuLy8gcG9zaXRpb24gd2hlcmUgdGhlIHNlYXJjaCBzdGFydHMuIFdoZW4gYHRleHRgIGlzIHRydWUsIG9ubHkgcmV0dXJuXG4vLyB0ZXh0IHNlbGVjdGlvbnMuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBub2RlLCBwb3MsIGluZGV4LCBkaXIsIHRleHQgPSBmYWxzZSkge1xuICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyk7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4IC0gKGRpciA+IDAgPyAwIDogMSk7IGRpciA+IDAgPyBpIDwgbm9kZS5jaGlsZENvdW50IDogaSA+PSAwOyBpICs9IGRpcikge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpO1xuICAgICAgICBpZiAoIWNoaWxkLmlzQXRvbSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZFNlbGVjdGlvbkluKGRvYywgY2hpbGQsIHBvcyArIGRpciwgZGlyIDwgMCA/IGNoaWxkLmNoaWxkQ291bnQgOiAwLCBkaXIsIHRleHQpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGV4dCAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOb2RlU2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyAtIChkaXIgPCAwID8gY2hpbGQubm9kZVNpemUgOiAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IGNoaWxkLm5vZGVTaXplICogZGlyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBzdGFydExlbiwgYmlhcykge1xuICAgIGxldCBsYXN0ID0gdHIuc3RlcHMubGVuZ3RoIC0gMTtcbiAgICBpZiAobGFzdCA8IHN0YXJ0TGVuKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHN0ZXAgPSB0ci5zdGVwc1tsYXN0XTtcbiAgICBpZiAoIShzdGVwIGluc3RhbmNlb2YgUmVwbGFjZVN0ZXAgfHwgc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VBcm91bmRTdGVwKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBtYXAgPSB0ci5tYXBwaW5nLm1hcHNbbGFzdF0sIGVuZDtcbiAgICBtYXAuZm9yRWFjaCgoX2Zyb20sIF90bywgX25ld0Zyb20sIG5ld1RvKSA9PiB7IGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgZW5kID0gbmV3VG87IH0pO1xuICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShlbmQpLCBiaWFzKSk7XG59XG5cbmNvbnN0IFVQREFURURfU0VMID0gMSwgVVBEQVRFRF9NQVJLUyA9IDIsIFVQREFURURfU0NST0xMID0gNDtcbi8qKlxuQW4gZWRpdG9yIHN0YXRlIHRyYW5zYWN0aW9uLCB3aGljaCBjYW4gYmUgYXBwbGllZCB0byBhIHN0YXRlIHRvXG5jcmVhdGUgYW4gdXBkYXRlZCBzdGF0ZS4gVXNlXG5bYEVkaXRvclN0YXRlLnRyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRyKSB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG5cblRyYW5zYWN0aW9ucyB0cmFjayBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudCAodGhleSBhcmUgYSBzdWJjbGFzcyBvZlxuW2BUcmFuc2Zvcm1gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlRyYW5zZm9ybSkpLCBidXQgYWxzbyBvdGhlciBzdGF0ZSBjaGFuZ2VzLFxubGlrZSBzZWxlY3Rpb24gdXBkYXRlcyBhbmQgYWRqdXN0bWVudHMgb2YgdGhlIHNldCBvZiBbc3RvcmVkXG5tYXJrc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnN0b3JlZE1hcmtzKS4gSW4gYWRkaXRpb24sIHlvdSBjYW4gc3RvcmVcbm1ldGFkYXRhIHByb3BlcnRpZXMgaW4gYSB0cmFuc2FjdGlvbiwgd2hpY2ggYXJlIGV4dHJhIHBpZWNlcyBvZlxuaW5mb3JtYXRpb24gdGhhdCBjbGllbnQgY29kZSBvciBwbHVnaW5zIGNhbiB1c2UgdG8gZGVzY3JpYmUgd2hhdCBhXG50cmFuc2FjdGlvbiByZXByZXNlbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHVwZGF0ZSB0aGVpciBbb3duXG5zdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpIGFjY29yZGluZ2x5LlxuXG5UaGUgW2VkaXRvciB2aWV3XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3KSB1c2VzIGEgZmV3IG1ldGFkYXRhXG5wcm9wZXJ0aWVzOiBpdCB3aWxsIGF0dGFjaCBhIHByb3BlcnR5IGBcInBvaW50ZXJcImAgd2l0aCB0aGUgdmFsdWVcbmB0cnVlYCB0byBzZWxlY3Rpb24gdHJhbnNhY3Rpb25zIGRpcmVjdGx5IGNhdXNlZCBieSBtb3VzZSBvciB0b3VjaFxuaW5wdXQsIGEgYFwiY29tcG9zaXRpb25cImAgcHJvcGVydHkgaG9sZGluZyBhbiBJRCBpZGVudGlmeWluZyB0aGVcbmNvbXBvc2l0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIHRyYW5zYWN0aW9ucyBjYXVzZWQgYnkgY29tcG9zZWQgRE9NXG5pbnB1dCwgYW5kIGEgYFwidWlFdmVudFwiYCBwcm9wZXJ0eSBvZiB0aGF0IG1heSBiZSBgXCJwYXN0ZVwiYCxcbmBcImN1dFwiYCwgb3IgYFwiZHJvcFwiYC5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICBzdXBlcihzdGF0ZS5kb2MpO1xuICAgICAgICAvLyBUaGUgc3RlcCBjb3VudCBmb3Igd2hpY2ggdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIHZhbGlkLlxuICAgICAgICB0aGlzLmN1clNlbGVjdGlvbkZvciA9IDA7XG4gICAgICAgIC8vIEJpdGZpZWxkIHRvIHRyYWNrIHdoaWNoIGFzcGVjdHMgb2YgdGhlIHN0YXRlIHdlcmUgdXBkYXRlZCBieVxuICAgICAgICAvLyB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAgICB0aGlzLnVwZGF0ZWQgPSAwO1xuICAgICAgICAvLyBPYmplY3QgdXNlZCB0byBzdG9yZSBtZXRhZGF0YSBwcm9wZXJ0aWVzIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMubWV0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbidzIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSBlZGl0b3JcbiAgICBzZWxlY3Rpb24gW21hcHBlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbi5tYXApIHRocm91Z2ggdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zYWN0aW9uLCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIHdpdGhcbiAgICBbYHNldFNlbGVjdGlvbmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZXRTZWxlY3Rpb24pLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyU2VsZWN0aW9uRm9yIDwgdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gdGhpcy5jdXJTZWxlY3Rpb24ubWFwKHRoaXMuZG9jLCB0aGlzLm1hcHBpbmcuc2xpY2UodGhpcy5jdXJTZWxlY3Rpb25Gb3IpKTtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyU2VsZWN0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHRyYW5zYWN0aW9uJ3MgY3VycmVudCBzZWxlY3Rpb24uIFdpbGwgZGV0ZXJtaW5lIHRoZVxuICAgIHNlbGVjdGlvbiB0aGF0IHRoZSBlZGl0b3IgZ2V0cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhcHBsaWVkLlxuICAgICovXG4gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikge1xuICAgICAgICBpZiAoc2VsZWN0aW9uLiRmcm9tLmRvYyAhPSB0aGlzLmRvYylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VsZWN0aW9uIHBhc3NlZCB0byBzZXRTZWxlY3Rpb24gbXVzdCBwb2ludCBhdCB0aGUgY3VycmVudCBkb2N1bWVudFwiKTtcbiAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9ICh0aGlzLnVwZGF0ZWQgfCBVUERBVEVEX1NFTCkgJiB+VVBEQVRFRF9NQVJLUztcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gd2FzIGV4cGxpY2l0bHkgdXBkYXRlZCBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvblNldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVwZGF0ZWQgJiBVUERBVEVEX1NFTCkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIGN1cnJlbnQgc3RvcmVkIG1hcmtzLlxuICAgICovXG4gICAgc2V0U3RvcmVkTWFya3MobWFya3MpIHtcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9NQVJLUztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBzdG9yZWQgbWFya3Mgb3IsIGlmIHRoYXQgaXMgbnVsbCwgdGhlIG1hcmtzXG4gICAgYXQgdGhlIHNlbGVjdGlvbiwgbWF0Y2ggdGhlIGdpdmVuIHNldCBvZiBtYXJrcy4gRG9lcyBub3RoaW5nIGlmXG4gICAgdGhpcyBpcyBhbHJlYWR5IHRoZSBjYXNlLlxuICAgICovXG4gICAgZW5zdXJlTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpLCBtYXJrcykpXG4gICAgICAgICAgICB0aGlzLnNldFN0b3JlZE1hcmtzKG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIG1hcmsgdG8gdGhlIHNldCBvZiBzdG9yZWQgbWFya3MuXG4gICAgKi9cbiAgICBhZGRTdG9yZWRNYXJrKG1hcmspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlTWFya3MobWFyay5hZGRUb1NldCh0aGlzLnN0b3JlZE1hcmtzIHx8IHRoaXMuc2VsZWN0aW9uLiRoZWFkLm1hcmtzKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayBvciBtYXJrIHR5cGUgZnJvbSB0aGUgc2V0IG9mIHN0b3JlZCBtYXJrcy5cbiAgICAqL1xuICAgIHJlbW92ZVN0b3JlZE1hcmsobWFyaykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnN1cmVNYXJrcyhtYXJrLnJlbW92ZUZyb21TZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kaGVhZC5tYXJrcygpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0b3JlZCBtYXJrcyB3ZXJlIGV4cGxpY2l0bHkgc2V0IGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHN0b3JlZE1hcmtzU2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudXBkYXRlZCAmIFVQREFURURfTUFSS1MpID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRTdGVwKHN0ZXAsIGRvYykge1xuICAgICAgICBzdXBlci5hZGRTdGVwKHN0ZXAsIGRvYyk7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9IHRoaXMudXBkYXRlZCAmIH5VUERBVEVEX01BUktTO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNldFRpbWUodGltZSkge1xuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gc2xpY2UuXG4gICAgKi9cbiAgICByZXBsYWNlU2VsZWN0aW9uKHNsaWNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UodGhpcywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUuIFdoZW4gYGluaGVyaXRNYXJrc2AgaXNcbiAgICB0cnVlIGFuZCB0aGUgY29udGVudCBpcyBpbmxpbmUsIGl0IGluaGVyaXRzIHRoZSBtYXJrcyBmcm9tIHRoZVxuICAgIHBsYWNlIHdoZXJlIGl0IGlzIGluc2VydGVkLlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbldpdGgobm9kZSwgaW5oZXJpdE1hcmtzID0gdHJ1ZSkge1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGlmIChpbmhlcml0TWFya3MpXG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXJrKHRoaXMuc3RvcmVkTWFya3MgfHwgKHNlbGVjdGlvbi5lbXB0eSA/IHNlbGVjdGlvbi4kZnJvbS5tYXJrcygpIDogKHNlbGVjdGlvbi4kZnJvbS5tYXJrc0Fjcm9zcyhzZWxlY3Rpb24uJHRvKSB8fCBNYXJrLm5vbmUpKSk7XG4gICAgICAgIHNlbGVjdGlvbi5yZXBsYWNlV2l0aCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgc2VsZWN0aW9uLlxuICAgICovXG4gICAgZGVsZXRlU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2UsIG9yIHRoZSBzZWxlY3Rpb24gaWYgbm8gcmFuZ2UgaXMgZ2l2ZW4sXG4gICAgd2l0aCBhIHRleHQgbm9kZSBjb250YWluaW5nIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBpbnNlcnRUZXh0KHRleHQsIGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzY2hlbWEgPSB0aGlzLmRvYy50eXBlLnNjaGVtYTtcbiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVNlbGVjdGlvbldpdGgoc2NoZW1hLnRleHQodGV4dCksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSBmcm9tO1xuICAgICAgICAgICAgdG8gPSB0byA9PSBudWxsID8gZnJvbSA6IHRvO1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IHRoaXMuc3RvcmVkTWFya3M7XG4gICAgICAgICAgICBpZiAoIW1hcmtzKSB7XG4gICAgICAgICAgICAgICAgbGV0ICRmcm9tID0gdGhpcy5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICAgICAgICAgICAgICBtYXJrcyA9IHRvID09IGZyb20gPyAkZnJvbS5tYXJrcygpIDogJGZyb20ubWFya3NBY3Jvc3ModGhpcy5kb2MucmVzb2x2ZSh0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBzY2hlbWEudGV4dCh0ZXh0LCBtYXJrcykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5lbXB0eSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0aGlzLnNlbGVjdGlvbi4kdG8pKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFN0b3JlIGEgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhpcyB0cmFuc2FjdGlvbiwga2V5ZWQgZWl0aGVyIGJ5XG4gICAgbmFtZSBvciBieSBwbHVnaW4uXG4gICAgKi9cbiAgICBzZXRNZXRhKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5tZXRhW3R5cGVvZiBrZXkgPT0gXCJzdHJpbmdcIiA/IGtleSA6IGtleS5rZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSBhIG1ldGFkYXRhIHByb3BlcnR5IGZvciBhIGdpdmVuIG5hbWUgb3IgcGx1Z2luLlxuICAgICovXG4gICAgZ2V0TWV0YShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YVt0eXBlb2Yga2V5ID09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkua2V5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNhY3Rpb24gZG9lc24ndCBjb250YWluIGFueSBtZXRhZGF0YSxcbiAgICBhbmQgY2FuIHRodXMgc2FmZWx5IGJlIGV4dGVuZGVkLlxuICAgICovXG4gICAgZ2V0IGlzR2VuZXJpYygpIHtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLm1ldGEpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZSB0aGF0IHRoZSBlZGl0b3Igc2hvdWxkIHNjcm9sbCB0aGUgc2VsZWN0aW9uIGludG8gdmlld1xuICAgIHdoZW4gdXBkYXRlZCB0byB0aGUgc3RhdGUgcHJvZHVjZWQgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9TQ1JPTEw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB0cmFuc2FjdGlvbiBoYXMgaGFkIGBzY3JvbGxJbnRvVmlld2AgY2FsbGVkIG9uIGl0LlxuICAgICovXG4gICAgZ2V0IHNjcm9sbGVkSW50b1ZpZXcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy51cGRhdGVkICYgVVBEQVRFRF9TQ1JPTEwpID4gMDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmQoZiwgc2VsZikge1xuICAgIHJldHVybiAhc2VsZiB8fCAhZiA/IGYgOiBmLmJpbmQoc2VsZik7XG59XG5jbGFzcyBGaWVsZERlc2Mge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2MsIHNlbGYpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pbml0ID0gYmluZChkZXNjLmluaXQsIHNlbGYpO1xuICAgICAgICB0aGlzLmFwcGx5ID0gYmluZChkZXNjLmFwcGx5LCBzZWxmKTtcbiAgICB9XG59XG5jb25zdCBiYXNlRmllbGRzID0gW1xuICAgIG5ldyBGaWVsZERlc2MoXCJkb2NcIiwge1xuICAgICAgICBpbml0KGNvbmZpZykgeyByZXR1cm4gY29uZmlnLmRvYyB8fCBjb25maWcuc2NoZW1hLnRvcE5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLmRvYzsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzZWxlY3Rpb25cIiwge1xuICAgICAgICBpbml0KGNvbmZpZywgaW5zdGFuY2UpIHsgcmV0dXJuIGNvbmZpZy5zZWxlY3Rpb24gfHwgU2VsZWN0aW9uLmF0U3RhcnQoaW5zdGFuY2UuZG9jKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLnNlbGVjdGlvbjsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzdG9yZWRNYXJrc1wiLCB7XG4gICAgICAgIGluaXQoY29uZmlnKSB7IHJldHVybiBjb25maWcuc3RvcmVkTWFya3MgfHwgbnVsbDsgfSxcbiAgICAgICAgYXBwbHkodHIsIF9tYXJrcywgX29sZCwgc3RhdGUpIHsgcmV0dXJuIHN0YXRlLnNlbGVjdGlvbi4kY3Vyc29yID8gdHIuc3RvcmVkTWFya3MgOiBudWxsOyB9XG4gICAgfSksXG4gICAgbmV3IEZpZWxkRGVzYyhcInNjcm9sbFRvU2VsZWN0aW9uXCIsIHtcbiAgICAgICAgaW5pdCgpIHsgcmV0dXJuIDA7IH0sXG4gICAgICAgIGFwcGx5KHRyLCBwcmV2KSB7IHJldHVybiB0ci5zY3JvbGxlZEludG9WaWV3ID8gcHJldiArIDEgOiBwcmV2OyB9XG4gICAgfSlcbl07XG4vLyBPYmplY3Qgd3JhcHBpbmcgdGhlIHBhcnQgb2YgYSBzdGF0ZSBvYmplY3QgdGhhdCBzdGF5cyB0aGUgc2FtZVxuLy8gYWNyb3NzIHRyYW5zYWN0aW9ucy4gU3RvcmVkIGluIHRoZSBzdGF0ZSdzIGBjb25maWdgIHByb3BlcnR5LlxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBwbHVnaW5zKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5zQnlLZXkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGJhc2VGaWVsZHMuc2xpY2UoKTtcbiAgICAgICAgaWYgKHBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zQnlLZXlbcGx1Z2luLmtleV0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQWRkaW5nIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBrZXllZCBwbHVnaW4gKFwiICsgcGx1Z2luLmtleSArIFwiKVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc0J5S2V5W3BsdWdpbi5rZXldID0gcGx1Z2luO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5zdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHMucHVzaChuZXcgRmllbGREZXNjKHBsdWdpbi5rZXksIHBsdWdpbi5zcGVjLnN0YXRlLCBwbHVnaW4pKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuVGhlIHN0YXRlIG9mIGEgUHJvc2VNaXJyb3IgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IGFuIG9iamVjdCBvZlxudGhpcyB0eXBlLiBBIHN0YXRlIGlzIGEgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZVx1MjAxNGl0IGlzbid0XG51cGRhdGVkLCBidXQgcmF0aGVyIGEgbmV3IHN0YXRlIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gYW4gb2xkIG9uZVxudXNpbmcgdGhlIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIG1ldGhvZC5cblxuQSBzdGF0ZSBob2xkcyBhIG51bWJlciBvZiBidWlsdC1pbiBmaWVsZHMsIGFuZCBwbHVnaW5zIGNhblxuW2RlZmluZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuc3RhdGUpIGFkZGl0aW9uYWwgZmllbGRzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIG9mIHRoZSBzdGF0ZSdzIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnNjaGVtYTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBsdWdpbnMgdGhhdCBhcmUgYWN0aXZlIGluIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnBsdWdpbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB0byBwcm9kdWNlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHkodHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlUcmFuc2FjdGlvbih0cikuc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmlsdGVyVHJhbnNhY3Rpb24odHIsIGlnbm9yZSA9IC0xKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChpICE9IGlnbm9yZSkge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5maWx0ZXJUcmFuc2FjdGlvbiAmJiAhcGx1Z2luLnNwZWMuZmlsdGVyVHJhbnNhY3Rpb24uY2FsbChwbHVnaW4sIHRyLCB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVmVyYm9zZSB2YXJpYW50IG9mIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIHRoYXRcbiAgICByZXR1cm5zIHRoZSBwcmVjaXNlIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgYXBwbGllZCAod2hpY2ggbWlnaHRcbiAgICBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBbdHJhbnNhY3Rpb25cbiAgICBob29rc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuZmlsdGVyVHJhbnNhY3Rpb24pIG9mXG4gICAgcGx1Z2lucykgYWxvbmcgd2l0aCB0aGUgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHlUcmFuc2FjdGlvbihyb290VHIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlclRyYW5zYWN0aW9uKHJvb3RUcikpXG4gICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogdGhpcywgdHJhbnNhY3Rpb25zOiBbXSB9O1xuICAgICAgICBsZXQgdHJzID0gW3Jvb3RUcl0sIG5ld1N0YXRlID0gdGhpcy5hcHBseUlubmVyKHJvb3RUciksIHNlZW4gPSBudWxsO1xuICAgICAgICAvLyBUaGlzIGxvb3AgcmVwZWF0ZWRseSBnaXZlcyBwbHVnaW5zIGEgY2hhbmNlIHRvIHJlc3BvbmQgdG9cbiAgICAgICAgLy8gdHJhbnNhY3Rpb25zIGFzIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGFkZGVkLCBtYWtpbmcgc3VyZSB0byBvbmx5XG4gICAgICAgIC8vIHBhc3MgdGhlIHRyYW5zYWN0aW9ucyB0aGUgcGx1Z2luIGRpZCBub3Qgc2VlIGJlZm9yZS5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGhhdmVOZXcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5hcHBlbmRUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IHNlZW4gPyBzZWVuW2ldLm4gOiAwLCBvbGRTdGF0ZSA9IHNlZW4gPyBzZWVuW2ldLnN0YXRlIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyID0gbiA8IHRycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zcGVjLmFwcGVuZFRyYW5zYWN0aW9uLmNhbGwocGx1Z2luLCBuID8gdHJzLnNsaWNlKG4pIDogdHJzLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHIgJiYgbmV3U3RhdGUuZmlsdGVyVHJhbnNhY3Rpb24odHIsIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiYXBwZW5kZWRUcmFuc2FjdGlvblwiLCByb290VHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGogPCBpID8geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfSA6IHsgc3RhdGU6IHRoaXMsIG46IDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnMucHVzaCh0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IG5ld1N0YXRlLmFwcGx5SW5uZXIodHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZU5ldyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2ldID0geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhdmVOZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IG5ld1N0YXRlLCB0cmFuc2FjdGlvbnM6IHRycyB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYXBwbHlJbm5lcih0cikge1xuICAgICAgICBpZiAoIXRyLmJlZm9yZS5lcSh0aGlzLmRvYykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGEgbWlzbWF0Y2hlZCB0cmFuc2FjdGlvblwiKTtcbiAgICAgICAgbGV0IG5ld0luc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKHRoaXMuY29uZmlnKSwgZmllbGRzID0gdGhpcy5jb25maWcuZmllbGRzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgbmV3SW5zdGFuY2VbZmllbGQubmFtZV0gPSBmaWVsZC5hcHBseSh0ciwgdGhpc1tmaWVsZC5uYW1lXSwgdGhpcywgbmV3SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhcnQgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbikgZnJvbSB0aGlzIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IHRyKCkgeyByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHRoaXMpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcpIHtcbiAgICAgICAgbGV0ICRjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcuZG9jID8gY29uZmlnLmRvYy50eXBlLnNjaGVtYSA6IGNvbmZpZy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKCRjb25maWcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRjb25maWcuZmllbGRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaW5zdGFuY2VbJGNvbmZpZy5maWVsZHNbaV0ubmFtZV0gPSAkY29uZmlnLmZpZWxkc1tpXS5pbml0KGNvbmZpZywgaW5zdGFuY2UpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZSBiYXNlZCBvbiB0aGlzIG9uZSwgYnV0IHdpdGggYW4gYWRqdXN0ZWQgc2V0XG4gICAgb2YgYWN0aXZlIHBsdWdpbnMuIFN0YXRlIGZpZWxkcyB0aGF0IGV4aXN0IGluIGJvdGggc2V0cyBvZlxuICAgIHBsdWdpbnMgYXJlIGtlcHQgdW5jaGFuZ2VkLiBUaG9zZSB0aGF0IG5vIGxvbmdlciBleGlzdCBhcmVcbiAgICBkcm9wcGVkLCBhbmQgdGhvc2UgdGhhdCBhcmUgbmV3IGFyZSBpbml0aWFsaXplZCB1c2luZyB0aGVpclxuICAgIFtgaW5pdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkLmluaXQpIG1ldGhvZCwgcGFzc2luZyBpbiB0aGUgbmV3XG4gICAgY29uZmlndXJhdGlvbiBvYmplY3QuLlxuICAgICovXG4gICAgcmVjb25maWd1cmUoY29uZmlnKSB7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24odGhpcy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICRjb25maWcuZmllbGRzLCBpbnN0YW5jZSA9IG5ldyBFZGl0b3JTdGF0ZSgkY29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gZmllbGRzW2ldLm5hbWU7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IHRoaXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyB0aGlzW25hbWVdIDogZmllbGRzW2ldLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBzdGF0ZSB0byBKU09OLiBJZiB5b3Ugd2FudCB0byBzZXJpYWxpemUgdGhlIHN0YXRlXG4gICAgb2YgcGx1Z2lucywgcGFzcyBhbiBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyB0byB1c2UgaW4gdGhlXG4gICAgcmVzdWx0aW5nIEpTT04gb2JqZWN0IHRvIHBsdWdpbiBvYmplY3RzLiBUaGUgYXJndW1lbnQgbWF5IGFsc28gYmVcbiAgICBhIHN0cmluZyBvciBudW1iZXIsIGluIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZCwgdG8gc3VwcG9ydCB0aGVcbiAgICB3YXkgYEpTT04uc3RyaW5naWZ5YCBjYWxscyBgdG9TdHJpbmdgIG1ldGhvZHMuXG4gICAgKi9cbiAgICB0b0pTT04ocGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRvYzogdGhpcy5kb2MudG9KU09OKCksIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKCkgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVkTWFya3MpXG4gICAgICAgICAgICByZXN1bHQuc3RvcmVkTWFya3MgPSB0aGlzLnN0b3JlZE1hcmtzLm1hcChtID0+IG0udG9KU09OKCkpO1xuICAgICAgICBpZiAocGx1Z2luRmllbGRzICYmIHR5cGVvZiBwbHVnaW5GaWVsZHMgPT0gJ29iamVjdCcpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wID09IFwiZG9jXCIgfHwgcHJvcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBKU09OIGZpZWxkcyBgZG9jYCBhbmQgYHNlbGVjdGlvbmAgYXJlIHJlc2VydmVkXCIpO1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5GaWVsZHNbcHJvcF0sIHN0YXRlID0gcGx1Z2luLnNwZWMuc3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnRvSlNPTilcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gc3RhdGUudG9KU09OLmNhbGwocGx1Z2luLCB0aGlzW3BsdWdpbi5rZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RhdGUuIGBjb25maWdgIHNob3VsZFxuICAgIGhhdmUgYXQgbGVhc3QgYSBgc2NoZW1hYCBmaWVsZCwgYW5kIHNob3VsZCBjb250YWluIGFycmF5IG9mXG4gICAgcGx1Z2lucyB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSB3aXRoLiBgcGx1Z2luRmllbGRzYCBjYW4gYmUgdXNlZFxuICAgIHRvIGRlc2VyaWFsaXplIHRoZSBzdGF0ZSBvZiBwbHVnaW5zLCBieSBhc3NvY2lhdGluZyBwbHVnaW5cbiAgICBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvcGVydHkgbmFtZXMgdGhleSB1c2UgaW4gdGhlIEpTT04gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGNvbmZpZywganNvbiwgcGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRWRpdG9yU3RhdGUuZnJvbUpTT05cIik7XG4gICAgICAgIGlmICghY29uZmlnLnNjaGVtYSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVxdWlyZWQgY29uZmlnIGZpZWxkICdzY2hlbWEnIG1pc3NpbmdcIik7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oY29uZmlnLnNjaGVtYSwgY29uZmlnLnBsdWdpbnMpO1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgRWRpdG9yU3RhdGUoJGNvbmZpZyk7XG4gICAgICAgICRjb25maWcuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gXCJkb2NcIikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLmRvYyA9IE5vZGUuZnJvbUpTT04oY29uZmlnLnNjaGVtYSwganNvbi5kb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2VsZWN0aW9uID0gU2VsZWN0aW9uLmZyb21KU09OKGluc3RhbmNlLmRvYywganNvbi5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInN0b3JlZE1hcmtzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvbi5zdG9yZWRNYXJrcylcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RvcmVkTWFya3MgPSBqc29uLnN0b3JlZE1hcmtzLm1hcChjb25maWcuc2NoZW1hLm1hcmtGcm9tSlNPTik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luRmllbGRzKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbkZpZWxkc1twcm9wXSwgc3RhdGUgPSBwbHVnaW4uc3BlYy5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ua2V5ID09IGZpZWxkLm5hbWUgJiYgc3RhdGUgJiYgc3RhdGUuZnJvbUpTT04gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IHN0YXRlLmZyb21KU09OLmNhbGwocGx1Z2luLCBjb25maWcsIGpzb25bcHJvcF0sIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IGZpZWxkLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kUHJvcHMob2JqLCBzZWxmLCB0YXJnZXQpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9iaikge1xuICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgICAgICB2YWwgPSB2YWwuYmluZChzZWxmKTtcbiAgICAgICAgZWxzZSBpZiAocHJvcCA9PSBcImhhbmRsZURPTUV2ZW50c1wiKVxuICAgICAgICAgICAgdmFsID0gYmluZFByb3BzKHZhbCwgc2VsZiwge30pO1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG4vKipcblBsdWdpbnMgYnVuZGxlIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYW4gZWRpdG9yLlxuVGhleSBhcmUgcGFydCBvZiB0aGUgW2VkaXRvciBzdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlKSBhbmRcbm1heSBpbmZsdWVuY2UgdGhhdCBzdGF0ZSBhbmQgdGhlIHZpZXcgdGhhdCBjb250YWlucyBpdC5cbiovXG5jbGFzcyBQbHVnaW4ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBsdWdpbi5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwbHVnaW4ncyBbc3BlYyBvYmplY3RdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjKS5cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBbcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzKSBleHBvcnRlZCBieSB0aGlzIHBsdWdpbi5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgICAgICBpZiAoc3BlYy5wcm9wcylcbiAgICAgICAgICAgIGJpbmRQcm9wcyhzcGVjLnByb3BzLCB0aGlzLCB0aGlzLnByb3BzKTtcbiAgICAgICAgdGhpcy5rZXkgPSBzcGVjLmtleSA/IHNwZWMua2V5LmtleSA6IGNyZWF0ZUtleShcInBsdWdpblwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0cmFjdCB0aGUgcGx1Z2luJ3Mgc3RhdGUgZmllbGQgZnJvbSBhbiBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXRTdGF0ZShzdGF0ZSkgeyByZXR1cm4gc3RhdGVbdGhpcy5rZXldOyB9XG59XG5jb25zdCBrZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZ1bmN0aW9uIGNyZWF0ZUtleShuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4ga2V5cylcbiAgICAgICAgcmV0dXJuIG5hbWUgKyBcIiRcIiArICsra2V5c1tuYW1lXTtcbiAgICBrZXlzW25hbWVdID0gMDtcbiAgICByZXR1cm4gbmFtZSArIFwiJFwiO1xufVxuLyoqXG5BIGtleSBpcyB1c2VkIHRvIFt0YWddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjLmtleSkgcGx1Z2lucyBpbiBhIHdheVxudGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBmaW5kIHRoZW0sIGdpdmVuIGFuIGVkaXRvciBzdGF0ZS5cbkFzc2lnbmluZyBhIGtleSBkb2VzIG1lYW4gb25seSBvbmUgcGx1Z2luIG9mIHRoYXQgdHlwZSBjYW4gYmVcbmFjdGl2ZSBpbiBhIHN0YXRlLlxuKi9cbmNsYXNzIFBsdWdpbktleSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGx1Z2luIGtleS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUgPSBcImtleVwiKSB7IHRoaXMua2V5ID0gY3JlYXRlS2V5KG5hbWUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBhY3RpdmUgcGx1Z2luIHdpdGggdGhpcyBrZXksIGlmIGFueSwgZnJvbSBhbiBlZGl0b3JcbiAgICBzdGF0ZS5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkgeyByZXR1cm4gc3RhdGUuY29uZmlnLnBsdWdpbnNCeUtleVt0aGlzLmtleV07IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHBsdWdpbidzIHN0YXRlIGZyb20gYW4gZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgZ2V0U3RhdGUoc3RhdGUpIHsgcmV0dXJuIHN0YXRlW3RoaXMua2V5XTsgfVxufVxuXG5leHBvcnQgeyBBbGxTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBOb2RlU2VsZWN0aW9uLCBQbHVnaW4sIFBsdWdpbktleSwgU2VsZWN0aW9uLCBTZWxlY3Rpb25SYW5nZSwgVGV4dFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfTtcbiIsICJpbXBvcnQgeyBUZXh0U2VsZWN0aW9uLCBOb2RlU2VsZWN0aW9uLCBBbGxTZWxlY3Rpb24sIFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IERPTVNlcmlhbGl6ZXIsIEZyYWdtZW50LCBNYXJrLCBTbGljZSwgRE9NUGFyc2VyIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgZHJvcFBvaW50IH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcblxuY29uc3QgZG9tSW5kZXggPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGZvciAodmFyIGluZGV4ID0gMDs7IGluZGV4KyspIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufTtcbmNvbnN0IHBhcmVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGxldCBwYXJlbnQgPSBub2RlLmFzc2lnbmVkU2xvdCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMTEgPyBwYXJlbnQuaG9zdCA6IHBhcmVudDtcbn07XG5sZXQgcmV1c2VkUmFuZ2UgPSBudWxsO1xuLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJhbmdlLCBiZWNhdXNlIERPTSByYW5nZVxuLy8gb2JqZWN0cyBhcmUgZXZlcnkgZXhwZW5zaXZlLCBhbmQga2VlcCBzbG93aW5nIGRvd24gc3Vic2VxdWVudCBET01cbi8vIHVwZGF0ZXMsIGZvciBzb21lIHJlYXNvbi5cbmNvbnN0IHRleHRSYW5nZSA9IGZ1bmN0aW9uIChub2RlLCBmcm9tLCB0bykge1xuICAgIGxldCByYW5nZSA9IHJldXNlZFJhbmdlIHx8IChyZXVzZWRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpO1xuICAgIHJhbmdlLnNldEVuZChub2RlLCB0byA9PSBudWxsID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogdG8pO1xuICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGZyb20gfHwgMCk7XG4gICAgcmV0dXJuIHJhbmdlO1xufTtcbi8vIFNjYW5zIGZvcndhcmQgYW5kIGJhY2t3YXJkIHRocm91Z2ggRE9NIHBvc2l0aW9ucyBlcXVpdmFsZW50IHRvIHRoZVxuLy8gZ2l2ZW4gb25lIHRvIHNlZSBpZiB0aGUgdHdvIGFyZSBpbiB0aGUgc2FtZSBwbGFjZSAoaS5lLiBhZnRlciBhXG4vLyB0ZXh0IG5vZGUgdnMgYXQgdGhlIGVuZCBvZiB0aGF0IHRleHQgbm9kZSlcbmNvbnN0IGlzRXF1aXZhbGVudFBvc2l0aW9uID0gZnVuY3Rpb24gKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmKSB7XG4gICAgcmV0dXJuIHRhcmdldE5vZGUgJiYgKHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIC0xKSB8fFxuICAgICAgICBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAxKSk7XG59O1xuY29uc3QgYXRvbUVsZW1lbnRzID0gL14oaW1nfGJyfGlucHV0fHRleHRhcmVhfGhyKSQvaTtcbmZ1bmN0aW9uIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIGRpcikge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0Tm9kZSAmJiBvZmYgPT0gdGFyZ2V0T2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvZmYgPT0gKGRpciA8IDAgPyAwIDogbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEgfHwgaGFzQmxvY2tEZXNjKG5vZGUpIHx8IGF0b21FbGVtZW50cy50ZXN0KG5vZGUubm9kZU5hbWUpIHx8XG4gICAgICAgICAgICAgICAgbm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRvbUluZGV4KG5vZGUpICsgKGRpciA8IDAgPyAwIDogMSk7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmYgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkaXIgPCAwID8gbm9kZVNpemUobm9kZSkgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbm9kZVNpemUobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xufVxuZnVuY3Rpb24gaXNPbkVkZ2Uobm9kZSwgb2Zmc2V0LCBwYXJlbnQpIHtcbiAgICBmb3IgKGxldCBhdFN0YXJ0ID0gb2Zmc2V0ID09IDAsIGF0RW5kID0gb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpOyBhdFN0YXJ0IHx8IGF0RW5kOykge1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGluZGV4ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXRTdGFydCA9IGF0U3RhcnQgJiYgaW5kZXggPT0gMDtcbiAgICAgICAgYXRFbmQgPSBhdEVuZCAmJiBpbmRleCA9PSBub2RlU2l6ZShub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNCbG9ja0Rlc2MoZG9tKSB7XG4gICAgbGV0IGRlc2M7XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKVxuICAgICAgICBpZiAoZGVzYyA9IGN1ci5wbVZpZXdEZXNjKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgcmV0dXJuIGRlc2MgJiYgZGVzYy5ub2RlICYmIGRlc2Mubm9kZS5pc0Jsb2NrICYmIChkZXNjLmRvbSA9PSBkb20gfHwgZGVzYy5jb250ZW50RE9NID09IGRvbSk7XG59XG4vLyBXb3JrIGFyb3VuZCBDaHJvbWUgaXNzdWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3NTIzXG4vLyAoaXNDb2xsYXBzZWQgaW5hcHByb3ByaWF0ZWx5IHJldHVybnMgdHJ1ZSBpbiBzaGFkb3cgZG9tKVxuY29uc3Qgc2VsZWN0aW9uQ29sbGFwc2VkID0gZnVuY3Rpb24gKGRvbVNlbCkge1xuICAgIHJldHVybiBkb21TZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xufTtcbmZ1bmN0aW9uIGtleUV2ZW50KGtleUNvZGUsIGtleSkge1xuICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KFwia2V5ZG93blwiLCB0cnVlLCB0cnVlKTtcbiAgICBldmVudC5rZXlDb2RlID0ga2V5Q29kZTtcbiAgICBldmVudC5rZXkgPSBldmVudC5jb2RlID0ga2V5O1xuICAgIHJldHVybiBldmVudDtcbn1cbmZ1bmN0aW9uIGRlZXBBY3RpdmVFbGVtZW50KGRvYykge1xuICAgIGxldCBlbHQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAoZWx0ICYmIGVsdC5zaGFkb3dSb290KVxuICAgICAgICBlbHQgPSBlbHQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiBlbHQ7XG59XG5mdW5jdGlvbiBjYXJldEZyb21Qb2ludChkb2MsIHgsIHkpIHtcbiAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHtcbiAgICAgICAgdHJ5IHsgLy8gRmlyZWZveCB0aHJvd3MgZm9yIHRoaXMgY2FsbCBpbiBoYXJkLXRvLXByZWRpY3QgY2lyY3Vtc3RhbmNlcyAoIzk5NClcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGlmIChwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogcG9zLm9mZnNldE5vZGUsIG9mZnNldDogcG9zLm9mZnNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICB9XG4gICAgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7XG4gICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAocmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiByYW5nZS5zdGFydENvbnRhaW5lciwgb2Zmc2V0OiByYW5nZS5zdGFydE9mZnNldCB9O1xuICAgIH1cbn1cblxuY29uc3QgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yIDogbnVsbDtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiBudWxsO1xuY29uc3QgYWdlbnQgPSAobmF2ICYmIG5hdi51c2VyQWdlbnQpIHx8IFwiXCI7XG5jb25zdCBpZV9lZGdlID0gL0VkZ2VcXC8oXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWVfdXB0bzEwID0gL01TSUUgXFxkLy5leGVjKGFnZW50KTtcbmNvbnN0IGllXzExdXAgPSAvVHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWUgPSAhIShpZV91cHRvMTAgfHwgaWVfMTF1cCB8fCBpZV9lZGdlKTtcbmNvbnN0IGllX3ZlcnNpb24gPSBpZV91cHRvMTAgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiBpZV8xMXVwID8gK2llXzExdXBbMV0gOiBpZV9lZGdlID8gK2llX2VkZ2VbMV0gOiAwO1xuY29uc3QgZ2Vja28gPSAhaWUgJiYgL2dlY2tvXFwvKFxcZCspL2kudGVzdChhZ2VudCk7XG5nZWNrbyAmJiArKC9GaXJlZm94XFwvKFxcZCspLy5leGVjKGFnZW50KSB8fCBbMCwgMF0pWzFdO1xuY29uc3QgX2Nocm9tZSA9ICFpZSAmJiAvQ2hyb21lXFwvKFxcZCspLy5leGVjKGFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICEhX2Nocm9tZTtcbmNvbnN0IGNocm9tZV92ZXJzaW9uID0gX2Nocm9tZSA/ICtfY2hyb21lWzFdIDogMDtcbmNvbnN0IHNhZmFyaSA9ICFpZSAmJiAhIW5hdiAmJiAvQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2LnZlbmRvcik7XG4vLyBJcyB0cnVlIGZvciBib3RoIGlPUyBhbmQgaVBhZE9TIGZvciBjb252ZW5pZW5jZVxuY29uc3QgaW9zID0gc2FmYXJpICYmICgvTW9iaWxlXFwvXFx3Ky8udGVzdChhZ2VudCkgfHwgISFuYXYgJiYgbmF2Lm1heFRvdWNoUG9pbnRzID4gMik7XG5jb25zdCBtYWMgPSBpb3MgfHwgKG5hdiA/IC9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSA6IGZhbHNlKTtcbmNvbnN0IHdpbmRvd3MgPSBuYXYgPyAvV2luLy50ZXN0KG5hdi5wbGF0Zm9ybSkgOiBmYWxzZTtcbmNvbnN0IGFuZHJvaWQgPSAvQW5kcm9pZCBcXGQvLnRlc3QoYWdlbnQpO1xuY29uc3Qgd2Via2l0ID0gISFkb2MgJiYgXCJ3ZWJraXRGb250U21vb3RoaW5nXCIgaW4gZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbmNvbnN0IHdlYmtpdF92ZXJzaW9uID0gd2Via2l0ID8gKygvXFxiQXBwbGVXZWJLaXRcXC8oXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDA7XG5cbmZ1bmN0aW9uIHdpbmRvd1JlY3QoZG9jKSB7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB9O1xufVxuZnVuY3Rpb24gZ2V0U2lkZSh2YWx1ZSwgc2lkZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIiA/IHZhbHVlIDogdmFsdWVbc2lkZV07XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0KG5vZGUpIHtcbiAgICBsZXQgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gQWRqdXN0IGZvciBlbGVtZW50cyB3aXRoIHN0eWxlIFwidHJhbnNmb3JtOiBzY2FsZSgpXCJcbiAgICBsZXQgc2NhbGVYID0gKHJlY3Qud2lkdGggLyBub2RlLm9mZnNldFdpZHRoKSB8fCAxO1xuICAgIGxldCBzY2FsZVkgPSAocmVjdC5oZWlnaHQgLyBub2RlLm9mZnNldEhlaWdodCkgfHwgMTtcbiAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICByZXR1cm4geyBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgKyBub2RlLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgbm9kZS5jbGllbnRIZWlnaHQgKiBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyh2aWV3LCByZWN0LCBzdGFydERPTSkge1xuICAgIGxldCBzY3JvbGxUaHJlc2hvbGQgPSB2aWV3LnNvbWVQcm9wKFwic2Nyb2xsVGhyZXNob2xkXCIpIHx8IDAsIHNjcm9sbE1hcmdpbiA9IHZpZXcuc29tZVByb3AoXCJzY3JvbGxNYXJnaW5cIikgfHwgNTtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBwYXJlbnQgPSBzdGFydERPTSB8fCB2aWV3LmRvbTs7IHBhcmVudCA9IHBhcmVudE5vZGUocGFyZW50KSkge1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAocGFyZW50Lm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgbGV0IGF0VG9wID0gZWx0ID09IGRvYy5ib2R5O1xuICAgICAgICBsZXQgYm91bmRpbmcgPSBhdFRvcCA/IHdpbmRvd1JlY3QoZG9jKSA6IGNsaWVudFJlY3QoZWx0KTtcbiAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3AgKyBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJ0b3BcIikpXG4gICAgICAgICAgICBtb3ZlWSA9IC0oYm91bmRpbmcudG9wIC0gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSAtIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImJvdHRvbVwiKSlcbiAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IGJvdW5kaW5nLmJvdHRvbSAtIGJvdW5kaW5nLnRvcFxuICAgICAgICAgICAgICAgID8gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikgLSBib3VuZGluZy50b3BcbiAgICAgICAgICAgICAgICA6IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwiYm90dG9tXCIpO1xuICAgICAgICBpZiAocmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCArIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImxlZnRcIikpXG4gICAgICAgICAgICBtb3ZlWCA9IC0oYm91bmRpbmcubGVmdCAtIHJlY3QubGVmdCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcImxlZnRcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgLSBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJyaWdodFwiKSlcbiAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwicmlnaHRcIik7XG4gICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgaWYgKGF0VG9wKSB7XG4gICAgICAgICAgICAgICAgZG9jLmRlZmF1bHRWaWV3LnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRYID0gZWx0LnNjcm9sbExlZnQsIHN0YXJ0WSA9IGVsdC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgaWYgKG1vdmVZKVxuICAgICAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsVG9wICs9IG1vdmVZO1xuICAgICAgICAgICAgICAgIGlmIChtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgZWx0LnNjcm9sbExlZnQgKz0gbW92ZVg7XG4gICAgICAgICAgICAgICAgbGV0IGRYID0gZWx0LnNjcm9sbExlZnQgLSBzdGFydFgsIGRZID0gZWx0LnNjcm9sbFRvcCAtIHN0YXJ0WTtcbiAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBkWCwgdG9wOiByZWN0LnRvcCAtIGRZLCByaWdodDogcmVjdC5yaWdodCAtIGRYLCBib3R0b206IHJlY3QuYm90dG9tIC0gZFkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYXRUb3AgfHwgL14oZml4ZWR8c3RpY2t5KSQvLnRlc3QoZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpLnBvc2l0aW9uKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn1cbi8vIFN0b3JlIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIGVkaXRvcidzIHBhcmVudCBub2RlcywgYWxvbmcgd2l0aFxuLy8gdGhlIHRvcCBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IG5lYXIgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLCB3aGljaFxuLy8gd2lsbCBiZSB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgdmlzaWJsZSB2aWV3cG9ydCByZW1haW5zIHN0YWJsZSBldmVuXG4vLyB3aGVuIHRoZSBzaXplIG9mIHRoZSBjb250ZW50IGFib3ZlIGNoYW5nZXMuXG5mdW5jdGlvbiBzdG9yZVNjcm9sbFBvcyh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgc3RhcnRZID0gTWF0aC5tYXgoMCwgcmVjdC50b3ApO1xuICAgIGxldCByZWZET00sIHJlZlRvcDtcbiAgICBmb3IgKGxldCB4ID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiwgeSA9IHN0YXJ0WSArIDE7IHkgPCBNYXRoLm1pbihpbm5lckhlaWdodCwgcmVjdC5ib3R0b20pOyB5ICs9IDUpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAoIWRvbSB8fCBkb20gPT0gdmlldy5kb20gfHwgIXZpZXcuZG9tLmNvbnRhaW5zKGRvbSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IGxvY2FsUmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGxvY2FsUmVjdC50b3AgPj0gc3RhcnRZIC0gMjApIHtcbiAgICAgICAgICAgIHJlZkRPTSA9IGRvbTtcbiAgICAgICAgICAgIHJlZlRvcCA9IGxvY2FsUmVjdC50b3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZWZET006IHJlZkRPTSwgcmVmVG9wOiByZWZUb3AsIHN0YWNrOiBzY3JvbGxTdGFjayh2aWV3LmRvbSkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFN0YWNrKGRvbSkge1xuICAgIGxldCBzdGFjayA9IFtdLCBkb2MgPSBkb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gcGFyZW50Tm9kZShjdXIpKSB7XG4gICAgICAgIHN0YWNrLnB1c2goeyBkb206IGN1ciwgdG9wOiBjdXIuc2Nyb2xsVG9wLCBsZWZ0OiBjdXIuc2Nyb2xsTGVmdCB9KTtcbiAgICAgICAgaWYgKGRvbSA9PSBkb2MpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrO1xufVxuLy8gUmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZWRpdG9yJ3MgcGFyZW50IG5vZGVzIHRvIHRoYXQgd2hhdFxuLy8gaXQgd2FzIGJlZm9yZSwgd2hlbiBzdG9yZVNjcm9sbFBvcyB3YXMgY2FsbGVkLlxuZnVuY3Rpb24gcmVzZXRTY3JvbGxQb3MoeyByZWZET00sIHJlZlRvcCwgc3RhY2sgfSkge1xuICAgIGxldCBuZXdSZWZUb3AgPSByZWZET00gPyByZWZET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDogMDtcbiAgICByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIG5ld1JlZlRvcCA9PSAwID8gMCA6IG5ld1JlZlRvcCAtIHJlZlRvcCk7XG59XG5mdW5jdGlvbiByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIGRUb3ApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGRvbSwgdG9wLCBsZWZ0IH0gPSBzdGFja1tpXTtcbiAgICAgICAgaWYgKGRvbS5zY3JvbGxUb3AgIT0gdG9wICsgZFRvcClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxUb3AgPSB0b3AgKyBkVG9wO1xuICAgICAgICBpZiAoZG9tLnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0b3JlZCA9IHNjcm9sbFN0YWNrKGRvbSk7XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIHJlc3RvcmVTY3JvbGxTdGFjayhzdG9yZWQsIDApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXRJbk5vZGUobm9kZSwgY29vcmRzKSB7XG4gICAgbGV0IGNsb3Nlc3QsIGR4Q2xvc2VzdCA9IDJlOCwgY29vcmRzQ2xvc2VzdCwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgcm93Qm90ID0gY29vcmRzLnRvcCwgcm93VG9wID0gY29vcmRzLnRvcDtcbiAgICBsZXQgZmlyc3RCZWxvdywgY29vcmRzQmVsb3c7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQsIGNoaWxkSW5kZXggPSAwOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZywgY2hpbGRJbmRleCsrKSB7XG4gICAgICAgIGxldCByZWN0cztcbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZWN0cyA9IHRleHRSYW5nZShjaGlsZCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPD0gcm93Qm90ICYmIHJlY3QuYm90dG9tID49IHJvd1RvcCkge1xuICAgICAgICAgICAgICAgIHJvd0JvdCA9IE1hdGgubWF4KHJlY3QuYm90dG9tLCByb3dCb3QpO1xuICAgICAgICAgICAgICAgIHJvd1RvcCA9IE1hdGgubWluKHJlY3QudG9wLCByb3dUb3ApO1xuICAgICAgICAgICAgICAgIGxldCBkeCA9IHJlY3QubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gcmVjdC5sZWZ0IC0gY29vcmRzLmxlZnRcbiAgICAgICAgICAgICAgICAgICAgOiByZWN0LnJpZ2h0IDwgY29vcmRzLmxlZnQgPyBjb29yZHMubGVmdCAtIHJlY3QucmlnaHQgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChkeCA8IGR4Q2xvc2VzdCkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGR4Q2xvc2VzdCA9IGR4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZHNDbG9zZXN0ID0gZHggJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAzID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5yaWdodCA8IGNvb3Jkcy5sZWZ0ID8gcmVjdC5yaWdodCA6IHJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogY29vcmRzLnRvcFxuICAgICAgICAgICAgICAgICAgICB9IDogY29vcmRzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSAmJiBkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAoY29vcmRzLmxlZnQgPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVjdC50b3AgPiBjb29yZHMudG9wICYmICFmaXJzdEJlbG93ICYmIHJlY3QubGVmdCA8PSBjb29yZHMubGVmdCAmJiByZWN0LnJpZ2h0ID49IGNvb3Jkcy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgZmlyc3RCZWxvdyA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGNvb3Jkc0JlbG93ID0geyBsZWZ0OiBNYXRoLm1heChyZWN0LmxlZnQsIE1hdGgubWluKHJlY3QucmlnaHQsIGNvb3Jkcy5sZWZ0KSksIHRvcDogcmVjdC50b3AgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2xvc2VzdCAmJiAoY29vcmRzLmxlZnQgPj0gcmVjdC5yaWdodCAmJiBjb29yZHMudG9wID49IHJlY3QudG9wIHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLmxlZnQgPj0gcmVjdC5sZWZ0ICYmIGNvb3Jkcy50b3AgPj0gcmVjdC5ib3R0b20pKVxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghY2xvc2VzdCAmJiBmaXJzdEJlbG93KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBmaXJzdEJlbG93O1xuICAgICAgICBjb29yZHNDbG9zZXN0ID0gY29vcmRzQmVsb3c7XG4gICAgICAgIGR4Q2xvc2VzdCA9IDA7XG4gICAgfVxuICAgIGlmIChjbG9zZXN0ICYmIGNsb3Nlc3Qubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIGZpbmRPZmZzZXRJblRleHQoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG4gICAgaWYgKCFjbG9zZXN0IHx8IChkeENsb3Nlc3QgJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAxKSlcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0IH07XG4gICAgcmV0dXJuIGZpbmRPZmZzZXRJbk5vZGUoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG59XG5mdW5jdGlvbiBmaW5kT2Zmc2V0SW5UZXh0KG5vZGUsIGNvb3Jkcykge1xuICAgIGxldCBsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QocmFuZ2UsIDEpO1xuICAgICAgICBpZiAocmVjdC50b3AgPT0gcmVjdC5ib3R0b20pXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGluUmVjdChjb29yZHMsIHJlY3QpKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGNvb3Jkcy5sZWZ0ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIgPyAxIDogMCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiAwIH07XG59XG5mdW5jdGlvbiBpblJlY3QoY29vcmRzLCByZWN0KSB7XG4gICAgcmV0dXJuIGNvb3Jkcy5sZWZ0ID49IHJlY3QubGVmdCAtIDEgJiYgY29vcmRzLmxlZnQgPD0gcmVjdC5yaWdodCArIDEgJiZcbiAgICAgICAgY29vcmRzLnRvcCA+PSByZWN0LnRvcCAtIDEgJiYgY29vcmRzLnRvcCA8PSByZWN0LmJvdHRvbSArIDE7XG59XG5mdW5jdGlvbiB0YXJnZXRLbHVkZ2UoZG9tLCBjb29yZHMpIHtcbiAgICBsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCAmJiAvXmxpJC9pLnRlc3QocGFyZW50Lm5vZGVOYW1lKSAmJiBjb29yZHMubGVmdCA8IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KVxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIHJldHVybiBkb207XG59XG5mdW5jdGlvbiBwb3NGcm9tRWxlbWVudCh2aWV3LCBlbHQsIGNvb3Jkcykge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gZmluZE9mZnNldEluTm9kZShlbHQsIGNvb3JkcyksIGJpYXMgPSAtMTtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICFub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBiaWFzID0gcmVjdC5sZWZ0ICE9IHJlY3QucmlnaHQgJiYgY29vcmRzLmxlZnQgPiAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gMSA6IC0xO1xuICAgIH1cbiAgICByZXR1cm4gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCBiaWFzKTtcbn1cbmZ1bmN0aW9uIHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcykge1xuICAgIC8vIEJyb3dzZXIgKGluIGNhcmV0UG9zaXRpb24vUmFuZ2VGcm9tUG9pbnQpIHdpbGwgYWdyZXNzaXZlbHlcbiAgICAvLyBub3JtYWxpemUgdG93YXJkcyBuZWFyYnkgaW5saW5lIG5vZGVzLiBTaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpblxuICAgIC8vIHBvc2l0aW9ucyBiZXR3ZWVuIGJsb2NrIG5vZGVzIHRvbywgd2UgZmlyc3Qgd2FsayB1cCB0aGUgaGllcmFyY2h5XG4gICAgLy8gb2Ygbm9kZXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBibG9jayBub2RlcyB0aGF0IHRoZSBjb29yZGluYXRlc1xuICAgIC8vIGZhbGwgb3V0c2lkZSBvZi4gSWYgc28sIHdlIHRha2UgdGhlIHBvc2l0aW9uIGJlZm9yZS9hZnRlciB0aGF0XG4gICAgLy8gYmxvY2suIElmIG5vdCwgd2UgY2FsbCBgcG9zRnJvbURPTWAgb24gdGhlIHJhdyBub2RlL29mZnNldC5cbiAgICBsZXQgb3V0c2lkZUJsb2NrID0gLTE7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZSwgc2F3QmxvY2sgPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gdmlldy5kb20pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoY3VyLCB0cnVlKTtcbiAgICAgICAgaWYgKCFkZXNjKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChkZXNjLmRvbS5ub2RlVHlwZSA9PSAxICYmIChkZXNjLm5vZGUuaXNCbG9jayAmJiBkZXNjLnBhcmVudCAmJiAhc2F3QmxvY2sgfHwgIWRlc2MuY29udGVudERPTSkpIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gZGVzYy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBpZiAoZGVzYy5ub2RlLmlzQmxvY2sgJiYgZGVzYy5wYXJlbnQgJiYgIXNhd0Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgc2F3QmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPiBjb29yZHMubGVmdCB8fCByZWN0LnRvcCA+IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGVCbG9jayA9IGRlc2MucG9zQmVmb3JlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPCBjb29yZHMubGVmdCB8fCByZWN0LmJvdHRvbSA8IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGVCbG9jayA9IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRlc2MuY29udGVudERPTSAmJiBvdXRzaWRlQmxvY2sgPCAwICYmICFkZXNjLm5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGluc2lkZSBhIGxlYWYsIHJldHVybiB0aGUgc2lkZSBvZiB0aGUgbGVhZiBjbG9zZXIgdG8gdGhlIGNvb3Jkc1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBkZXNjLm5vZGUuaXNCbG9jayA/IGNvb3Jkcy50b3AgPCAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyXG4gICAgICAgICAgICAgICAgICAgIDogY29vcmRzLmxlZnQgPCAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUgPyBkZXNjLnBvc0JlZm9yZSA6IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gZGVzYy5kb20ucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHNpZGVCbG9jayA+IC0xID8gb3V0c2lkZUJsb2NrIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCAtMSk7XG59XG5mdW5jdGlvbiBlbGVtZW50RnJvbVBvaW50KGVsZW1lbnQsIGNvb3JkcywgYm94KSB7XG4gICAgbGV0IGxlbiA9IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgaWYgKGxlbiAmJiBib3gudG9wIDwgYm94LmJvdHRvbSkge1xuICAgICAgICBmb3IgKGxldCBzdGFydEkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZW4gLSAxLCBNYXRoLmZsb29yKGxlbiAqIChjb29yZHMudG9wIC0gYm94LnRvcCkgLyAoYm94LmJvdHRvbSAtIGJveC50b3ApKSAtIDIpKSwgaSA9IHN0YXJ0STs7KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5SZWN0KGNvb3JkcywgcmVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudEZyb21Qb2ludChjaGlsZCwgY29vcmRzLCByZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgPSAoaSArIDEpICUgbGVuKSA9PSBzdGFydEkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vLyBHaXZlbiBhbiB4LHkgcG9zaXRpb24gb24gdGhlIGVkaXRvciwgZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG5mdW5jdGlvbiBwb3NBdENvb3Jkcyh2aWV3LCBjb29yZHMpIHtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudCwgbm9kZSwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgY2FyZXQgPSBjYXJldEZyb21Qb2ludChkb2MsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBpZiAoY2FyZXQpXG4gICAgICAgICh7IG5vZGUsIG9mZnNldCB9ID0gY2FyZXQpO1xuICAgIGxldCBlbHQgPSAodmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2MpXG4gICAgICAgIC5lbGVtZW50RnJvbVBvaW50KGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBsZXQgcG9zO1xuICAgIGlmICghZWx0IHx8ICF2aWV3LmRvbS5jb250YWlucyhlbHQubm9kZVR5cGUgIT0gMSA/IGVsdC5wYXJlbnROb2RlIDogZWx0KSkge1xuICAgICAgICBsZXQgYm94ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghaW5SZWN0KGNvb3JkcywgYm94KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBlbHQgPSBlbGVtZW50RnJvbVBvaW50KHZpZXcuZG9tLCBjb29yZHMsIGJveCk7XG4gICAgICAgIGlmICghZWx0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFNhZmFyaSdzIGNhcmV0UmFuZ2VGcm9tUG9pbnQgcmV0dXJucyBub25zZW5zZSB3aGVuIG9uIGEgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICBpZiAoc2FmYXJpKSB7XG4gICAgICAgIGZvciAobGV0IHAgPSBlbHQ7IG5vZGUgJiYgcDsgcCA9IHBhcmVudE5vZGUocCkpXG4gICAgICAgICAgICBpZiAocC5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWx0ID0gdGFyZ2V0S2x1ZGdlKGVsdCwgY29vcmRzKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgICBpZiAoZ2Vja28gJiYgbm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHdpbGwgc29tZXRpbWVzIHJldHVybiBvZmZzZXRzIGludG8gPGlucHV0PiBub2Rlcywgd2hpY2hcbiAgICAgICAgICAgIC8vIGhhdmUgbm8gYWN0dWFsIGNoaWxkcmVuLCBmcm9tIGNhcmV0UG9zaXRpb25Gcm9tUG9pbnQgKCM5NTMpXG4gICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAgICAgICAgLy8gSXQnbGwgYWxzbyBtb3ZlIHRoZSByZXR1cm5lZCBwb3NpdGlvbiBiZWZvcmUgaW1hZ2Ugbm9kZXMsXG4gICAgICAgICAgICAvLyBldmVuIGlmIHRob3NlIGFyZSBiZWhpbmQgaXQuXG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF0sIGJveDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5ub2RlTmFtZSA9PSBcIklNR1wiICYmIChib3ggPSBuZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS5yaWdodCA8PSBjb29yZHMubGVmdCAmJlxuICAgICAgICAgICAgICAgICAgICBib3guYm90dG9tID4gY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXY7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgYWJvdmUgdGhlIHJpZ2h0IHNpZGUgb2YgYW4gdW5lZGl0YWJsZSBub2RlLCBDaHJvbWUgd2lsbCByZXBvcnQgYSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdGhhdCBub2RlLlxuICAgICAgICBpZiAod2Via2l0ICYmIG9mZnNldCAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgKHByZXYgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0pLm5vZGVUeXBlID09IDEgJiZcbiAgICAgICAgICAgIHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiAmJiBwcmV2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA+PSBjb29yZHMudG9wKVxuICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgIC8vIFN1c3BpY2lvdXNseSBzcGVjaWZpYyBrbHVkZ2UgdG8gd29yayBhcm91bmQgY2FyZXQqRnJvbVBvaW50XG4gICAgICAgIC8vIG5ldmVyIHJldHVybmluZyBhIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50XG4gICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tICYmIG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSAmJiBub2RlLmxhc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmXG4gICAgICAgICAgICBjb29yZHMudG9wID4gbm9kZS5sYXN0Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKVxuICAgICAgICAgICAgcG9zID0gdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplO1xuICAgICAgICAvLyBJZ25vcmUgcG9zaXRpb25zIGRpcmVjdGx5IGFmdGVyIGEgQlIsIHNpbmNlIGNhcmV0KkZyb21Qb2ludFxuICAgICAgICAvLyAncm91bmQgdXAnIHBvc2l0aW9ucyB0aGF0IHdvdWxkIGJlIG1vcmUgYWNjdXJhdGVseSBwbGFjZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBCUiBub2RlLlxuICAgICAgICBlbHNlIGlmIChvZmZzZXQgPT0gMCB8fCBub2RlLm5vZGVUeXBlICE9IDEgfHwgbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdLm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHBvcyA9IHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcyk7XG4gICAgfVxuICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgcG9zID0gcG9zRnJvbUVsZW1lbnQodmlldywgZWx0LCBjb29yZHMpO1xuICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGVsdCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHsgcG9zLCBpbnNpZGU6IGRlc2MgPyBkZXNjLnBvc0F0U3RhcnQgLSBkZXNjLmJvcmRlciA6IC0xIH07XG59XG5mdW5jdGlvbiBub25aZXJvKHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC50b3AgPCByZWN0LmJvdHRvbSB8fCByZWN0LmxlZnQgPCByZWN0LnJpZ2h0O1xufVxuZnVuY3Rpb24gc2luZ2xlUmVjdCh0YXJnZXQsIGJpYXMpIHtcbiAgICBsZXQgcmVjdHMgPSB0YXJnZXQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHJlY3RzW2JpYXMgPCAwID8gMCA6IHJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobm9uWmVybyhmaXJzdCkpXG4gICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHJlY3RzLCBub25aZXJvKSB8fCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG59XG5jb25zdCBCSURJID0gL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNdLztcbi8vIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IG1vZGVsLCBnZXQgYSBib3VuZGluZyBib3ggb2YgdGhlXG4vLyBjaGFyYWN0ZXIgYXQgdGhhdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbmZ1bmN0aW9uIGNvb3Jkc0F0UG9zKHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCwgYXRvbSB9ID0gdmlldy5kb2NWaWV3LmRvbUZyb21Qb3MocG9zLCBzaWRlIDwgMCA/IC0xIDogMSk7XG4gICAgbGV0IHN1cHBvcnRFbXB0eVJhbmdlID0gd2Via2l0IHx8IGdlY2tvO1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgLy8gVGhlc2UgYnJvd3NlcnMgc3VwcG9ydCBxdWVyeWluZyBlbXB0eSB0ZXh0IHJhbmdlcy4gUHJlZmVyIHRoYXQgaW5cbiAgICAgICAgLy8gYmlkaSBjb250ZXh0IG9yIHdoZW4gYXQgdGhlIGVuZCBvZiBhIG5vZGUuXG4gICAgICAgIGlmIChzdXBwb3J0RW1wdHlSYW5nZSAmJiAoQklESS50ZXN0KG5vZGUubm9kZVZhbHVlKSB8fCAoc2lkZSA8IDAgPyAhb2Zmc2V0IDogb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkpKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0KSwgc2lkZSk7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHJldHVybnMgYmFkIHJlc3VsdHMgKHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIHNwYWNlKVxuICAgICAgICAgICAgLy8gd2hlbiBxdWVyeWluZyBhIHBvc2l0aW9uIGRpcmVjdGx5IGFmdGVyIGxpbmUtYnJva2VuXG4gICAgICAgICAgICAvLyB3aGl0ZXNwYWNlLiBEZXRlY3QgdGhpcyBzaXR1YXRpb24gYW5kIGFuZCBrbHVkZ2UgYXJvdW5kIGl0XG4gICAgICAgICAgICBpZiAoZ2Vja28gJiYgb2Zmc2V0ICYmIC9cXHMvLnRlc3Qobm9kZS5ub2RlVmFsdWVbb2Zmc2V0IC0gMV0pICYmIG9mZnNldCA8IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0QmVmb3JlID0gc2luZ2xlUmVjdCh0ZXh0UmFuZ2Uobm9kZSwgb2Zmc2V0IC0gMSwgb2Zmc2V0IC0gMSksIC0xKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjdEJlZm9yZS50b3AgPT0gcmVjdC50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RBZnRlciA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0ICsgMSksIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RBZnRlci50b3AgIT0gcmVjdC50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlblYocmVjdEFmdGVyLCByZWN0QWZ0ZXIubGVmdCA8IHJlY3RCZWZvcmUubGVmdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG9mZnNldCwgdG8gPSBvZmZzZXQsIHRha2VTaWRlID0gc2lkZSA8IDAgPyAxIDogLTE7XG4gICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgIW9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICAgICAgdGFrZVNpZGUgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPj0gMCAmJiBvZmZzZXQgPT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgICAgIHRha2VTaWRlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPCAwKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBmcm9tLCB0byksIHRha2VTaWRlKSwgdGFrZVNpZGUgPCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgJGRvbSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zIC0gKGF0b20gfHwgMCkpO1xuICAgIC8vIFJldHVybiBhIGhvcml6b250YWwgbGluZSBpbiBibG9jayBjb250ZXh0XG4gICAgaWYgKCEkZG9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChiZWZvcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCA8IG5vZGVTaXplKG5vZGUpKSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChhZnRlci5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChhZnRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5IKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHNpZGUgPj0gMCk7XG4gICAgfVxuICAgIC8vIElubGluZSwgbm90IGluIHRleHQgbm9kZSAodGhpcyBpcyBub3QgQmlkaS1zYWZlKVxuICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgIGxldCBiZWZvcmUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgIGxldCB0YXJnZXQgPSBiZWZvcmUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShiZWZvcmUsIG5vZGVTaXplKGJlZm9yZSkgLSAoc3VwcG9ydEVtcHR5UmFuZ2UgPyAwIDogMSkpXG4gICAgICAgICAgICAvLyBCUiBub2RlcyB0ZW5kIHRvIG9ubHkgcmV0dXJuIHRoZSByZWN0YW5nbGUgYmVmb3JlIHRoZW0uXG4gICAgICAgICAgICAvLyBPbmx5IHVzZSB0aGVtIGlmIHRoZXkgYXJlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlaXIgcGFyZW50XG4gICAgICAgICAgICA6IGJlZm9yZS5ub2RlVHlwZSA9PSAxICYmIChiZWZvcmUubm9kZU5hbWUgIT0gXCJCUlwiIHx8ICFiZWZvcmUubmV4dFNpYmxpbmcpID8gYmVmb3JlIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgMSksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGF0b20gPT0gbnVsbCAmJiBvZmZzZXQgPCBub2RlU2l6ZShub2RlKSkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgd2hpbGUgKGFmdGVyLnBtVmlld0Rlc2MgJiYgYWZ0ZXIucG1WaWV3RGVzYy5pZ25vcmVGb3JDb29yZHMpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gIWFmdGVyID8gbnVsbCA6IGFmdGVyLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2UoYWZ0ZXIsIDAsIChzdXBwb3J0RW1wdHlSYW5nZSA/IDAgOiAxKSlcbiAgICAgICAgICAgIDogYWZ0ZXIubm9kZVR5cGUgPT0gMSA/IGFmdGVyIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgLTEpLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gQWxsIGVsc2UgZmFpbGVkLCBqdXN0IHRyeSB0byBnZXQgYSByZWN0YW5nbGUgZm9yIHRoZSB0YXJnZXQgbm9kZVxuICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KG5vZGUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShub2RlKSA6IG5vZGUsIC1zaWRlKSwgc2lkZSA+PSAwKTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5WKHJlY3QsIGxlZnQpIHtcbiAgICBpZiAocmVjdC53aWR0aCA9PSAwKVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICBsZXQgeCA9IGxlZnQgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0O1xuICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiB4IH07XG59XG5mdW5jdGlvbiBmbGF0dGVuSChyZWN0LCB0b3ApIHtcbiAgICBpZiAocmVjdC5oZWlnaHQgPT0gMClcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgbGV0IHkgPSB0b3AgPyByZWN0LnRvcCA6IHJlY3QuYm90dG9tO1xuICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0IH07XG59XG5mdW5jdGlvbiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCBmKSB7XG4gICAgbGV0IHZpZXdTdGF0ZSA9IHZpZXcuc3RhdGUsIGFjdGl2ZSA9IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50O1xuICAgIGlmICh2aWV3U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgIHZpZXcudXBkYXRlU3RhdGUoc3RhdGUpO1xuICAgIGlmIChhY3RpdmUgIT0gdmlldy5kb20pXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZigpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHZpZXdTdGF0ZSAhPSBzdGF0ZSlcbiAgICAgICAgICAgIHZpZXcudXBkYXRlU3RhdGUodmlld1N0YXRlKTtcbiAgICAgICAgaWYgKGFjdGl2ZSAhPSB2aWV3LmRvbSAmJiBhY3RpdmUpXG4gICAgICAgICAgICBhY3RpdmUuZm9jdXMoKTtcbiAgICB9XG59XG4vLyBXaGV0aGVyIHZlcnRpY2FsIHBvc2l0aW9uIG1vdGlvbiBpbiBhIGdpdmVuIGRpcmVjdGlvblxuLy8gZnJvbSBhIHBvc2l0aW9uIHdvdWxkIGxlYXZlIGEgdGV4dCBibG9jay5cbmZ1bmN0aW9uIGVuZE9mVGV4dGJsb2NrVmVydGljYWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0ICRwb3MgPSBkaXIgPT0gXCJ1cFwiID8gc2VsLiRmcm9tIDogc2VsLiR0bztcbiAgICByZXR1cm4gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgKCkgPT4ge1xuICAgICAgICBsZXQgeyBub2RlOiBkb20gfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKCRwb3MucG9zLCBkaXIgPT0gXCJ1cFwiID8gLTEgOiAxKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IG5lYXJlc3QgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZG9tLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghbmVhcmVzdClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChuZWFyZXN0Lm5vZGUuaXNCbG9jaykge1xuICAgICAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuY29udGVudERPTSB8fCBuZWFyZXN0LmRvbTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuZG9tLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvb3JkcyA9IGNvb3Jkc0F0UG9zKHZpZXcsICRwb3MucG9zLCAxKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBib3hlcztcbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIGJveGVzID0gY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgYm94ZXMgPSB0ZXh0UmFuZ2UoY2hpbGQsIDAsIGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGgpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJveCA9IGJveGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChib3guYm90dG9tID4gYm94LnRvcCArIDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRpciA9PSBcInVwXCIgPyBjb29yZHMudG9wIC0gYm94LnRvcCA+IChib3guYm90dG9tIC0gY29vcmRzLnRvcCkgKiAyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJveC5ib3R0b20gLSBjb29yZHMuYm90dG9tID4gKGNvb3Jkcy5ib3R0b20gLSBib3gudG9wKSAqIDIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5jb25zdCBtYXliZVJUTCA9IC9bXFx1MDU5MC1cXHUwOGFjXS87XG5mdW5jdGlvbiBlbmRPZlRleHRibG9ja0hvcml6b250YWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCB7ICRoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb2Zmc2V0ID0gJGhlYWQucGFyZW50T2Zmc2V0LCBhdFN0YXJ0ID0gIW9mZnNldCwgYXRFbmQgPSBvZmZzZXQgPT0gJGhlYWQucGFyZW50LmNvbnRlbnQuc2l6ZTtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICAvLyBJZiB0aGUgdGV4dGJsb2NrIGlzIGFsbCBMVFIsIG9yIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydFxuICAgIC8vIFNlbGVjdGlvbi5tb2RpZnkgKEVkZ2UpLCBmYWxsIGJhY2sgdG8gYSBwcmltaXRpdmUgYXBwcm9hY2hcbiAgICBpZiAoIW1heWJlUlRMLnRlc3QoJGhlYWQucGFyZW50LnRleHRDb250ZW50KSB8fCAhc2VsLm1vZGlmeSlcbiAgICAgICAgcmV0dXJuIGRpciA9PSBcImxlZnRcIiB8fCBkaXIgPT0gXCJiYWNrd2FyZFwiID8gYXRTdGFydCA6IGF0RW5kO1xuICAgIHJldHVybiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCAoKSA9PiB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBodWdlIGhhY2ssIGJ1dCBhcHBlYXJzIHRvIGJlIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBjdXJyZW50bHkgZG86IHVzZSBgU2VsZWN0aW9uLm1vZGlmeWAgdG8gbW92ZSB0aGUgc2VsZWN0aW9uIGJ5XG4gICAgICAgIC8vIG9uZSBjaGFyYWN0ZXIsIGFuZCBzZWUgaWYgdGhhdCBtb3ZlcyB0aGUgY3Vyc29yIG91dCBvZiB0aGVcbiAgICAgICAgLy8gdGV4dGJsb2NrIChvciBkb2Vzbid0IG1vdmUgaXQgYXQgYWxsLCB3aGVuIGF0IHRoZSBzdGFydC9lbmQgb2ZcbiAgICAgICAgLy8gdGhlIGRvY3VtZW50KS5cbiAgICAgICAgbGV0IHsgZm9jdXNOb2RlOiBvbGROb2RlLCBmb2N1c09mZnNldDogb2xkT2ZmLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG9sZEJpZGlMZXZlbCA9IHNlbC5jYXJldEJpZGlMZXZlbCAvLyBPbmx5IGZvciBGaXJlZm94XG4gICAgICAgIDtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgZGlyLCBcImNoYXJhY3RlclwiKTtcbiAgICAgICAgbGV0IHBhcmVudERPTSA9ICRoZWFkLmRlcHRoID8gdmlldy5kb2NWaWV3LmRvbUFmdGVyUG9zKCRoZWFkLmJlZm9yZSgpKSA6IHZpZXcuZG9tO1xuICAgICAgICBsZXQgeyBmb2N1c05vZGU6IG5ld05vZGUsIGZvY3VzT2Zmc2V0OiBuZXdPZmYgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ld05vZGUgJiYgIXBhcmVudERPTS5jb250YWlucyhuZXdOb2RlLm5vZGVUeXBlID09IDEgPyBuZXdOb2RlIDogbmV3Tm9kZS5wYXJlbnROb2RlKSB8fFxuICAgICAgICAgICAgKG9sZE5vZGUgPT0gbmV3Tm9kZSAmJiBvbGRPZmYgPT0gbmV3T2ZmKTtcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChvbGROb2RlICYmIChvbGROb2RlICE9IGFuY2hvck5vZGUgfHwgb2xkT2ZmICE9IGFuY2hvck9mZnNldCkgJiYgc2VsLmV4dGVuZClcbiAgICAgICAgICAgICAgICBzZWwuZXh0ZW5kKG9sZE5vZGUsIG9sZE9mZik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICBpZiAob2xkQmlkaUxldmVsICE9IG51bGwpXG4gICAgICAgICAgICBzZWwuY2FyZXRCaWRpTGV2ZWwgPSBvbGRCaWRpTGV2ZWw7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5sZXQgY2FjaGVkU3RhdGUgPSBudWxsO1xubGV0IGNhY2hlZERpciA9IG51bGw7XG5sZXQgY2FjaGVkUmVzdWx0ID0gZmFsc2U7XG5mdW5jdGlvbiBlbmRPZlRleHRibG9jayh2aWV3LCBzdGF0ZSwgZGlyKSB7XG4gICAgaWYgKGNhY2hlZFN0YXRlID09IHN0YXRlICYmIGNhY2hlZERpciA9PSBkaXIpXG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgY2FjaGVkU3RhdGUgPSBzdGF0ZTtcbiAgICBjYWNoZWREaXIgPSBkaXI7XG4gICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9IGRpciA9PSBcInVwXCIgfHwgZGlyID09IFwiZG93blwiXG4gICAgICAgID8gZW5kT2ZUZXh0YmxvY2tWZXJ0aWNhbCh2aWV3LCBzdGF0ZSwgZGlyKVxuICAgICAgICA6IGVuZE9mVGV4dGJsb2NrSG9yaXpvbnRhbCh2aWV3LCBzdGF0ZSwgZGlyKTtcbn1cblxuLy8gVmlldyBkZXNjcmlwdGlvbnMgYXJlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGRlc2NyaWJlIHRoZSBET00gdGhhdCBpc1xuLy8gdXNlZCB0byByZXByZXNlbnQgdGhlIGVkaXRvcidzIGNvbnRlbnQuIFRoZXkgYXJlIHVzZWQgZm9yOlxuLy9cbi8vIC0gSW5jcmVtZW50YWwgcmVkcmF3aW5nIHdoZW4gdGhlIGRvY3VtZW50IGNoYW5nZXNcbi8vXG4vLyAtIEZpZ3VyaW5nIG91dCB3aGF0IHBhcnQgb2YgdGhlIGRvY3VtZW50IGEgZ2l2ZW4gRE9NIHBvc2l0aW9uXG4vLyAgIGNvcnJlc3BvbmRzIHRvXG4vL1xuLy8gLSBXaXJpbmcgaW4gY3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZWRpdGluZyBpbnRlcmZhY2UgZm9yIGFcbi8vICAgZ2l2ZW4gbm9kZVxuLy9cbi8vIFRoZXkgZm9ybSBhIGRvdWJseS1saW5rZWQgbXV0YWJsZSB0cmVlLCBzdGFydGluZyBhdCBgdmlldy5kb2NWaWV3YC5cbmNvbnN0IE5PVF9ESVJUWSA9IDAsIENISUxEX0RJUlRZID0gMSwgQ09OVEVOVF9ESVJUWSA9IDIsIE5PREVfRElSVFkgPSAzO1xuLy8gU3VwZXJjbGFzcyBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRpb25zLiBEZWZpbmVzIHRoZWlyXG4vLyBiYXNpYyBzdHJ1Y3R1cmUgYW5kIHNoYXJlZCBtZXRob2RzLlxuY2xhc3MgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgY2hpbGRyZW4sIGRvbSwgXG4gICAgLy8gVGhpcyBpcyB0aGUgbm9kZSB0aGF0IGhvbGRzIHRoZSBjaGlsZCB2aWV3cy4gSXQgbWF5IGJlIG51bGwgZm9yXG4gICAgLy8gZGVzY3MgdGhhdCBkb24ndCBoYXZlIGNoaWxkcmVuLlxuICAgIGNvbnRlbnRET00pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGNvbnRlbnRET007XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIC8vIEFuIGV4cGFuZG8gcHJvcGVydHkgb24gdGhlIERPTSBub2RlIHByb3ZpZGVzIGEgbGluayBiYWNrIHRvIGl0c1xuICAgICAgICAvLyBkZXNjcmlwdGlvbi5cbiAgICAgICAgZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgIH1cbiAgICAvLyBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBkZXNjcmlwdGlvbiBjb3JyZXNwb25kcyB0byBhXG4gICAgLy8gd2lkZ2V0L21hcmsvbm9kZS5cbiAgICBtYXRjaGVzV2lkZ2V0KHdpZGdldCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzTWFyayhtYXJrKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNIYWNrKG5vZGVOYW1lKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8vIFdoZW4gcGFyc2luZyBpbi1lZGl0b3IgY29udGVudCAoaW4gZG9tY2hhbmdlLmpzKSwgd2UgYWxsb3dcbiAgICAvLyBkZXNjcmlwdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBwYXJzZSBydWxlcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvXG4gICAgLy8gcGFyc2UgdGhlbS5cbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiBudWxsOyB9XG4gICAgLy8gVXNlZCBieSB0aGUgZWRpdG9yJ3MgZXZlbnQgaGFuZGxlciB0byBpZ25vcmUgZXZlbnRzIHRoYXQgY29tZVxuICAgIC8vIGZyb20gY2VydGFpbiBkZXNjcy5cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZXNjLlxuICAgIGdldCBzaXplKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jaGlsZHJlbltpXS5zaXplO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLy8gRm9yIGJsb2NrIG5vZGVzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHNwYWNlIHRha2VuIHVwIGJ5IHRoZWlyXG4gICAgLy8gc3RhcnQvZW5kIHRva2Vucy5cbiAgICBnZXQgYm9yZGVyKCkgeyByZXR1cm4gMDsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5kb20ucG1WaWV3RGVzYyA9PSB0aGlzKVxuICAgICAgICAgICAgdGhpcy5kb20ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHBvc0JlZm9yZUNoaWxkKGNoaWxkKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGN1ciA9PSBjaGlsZClcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGN1ci5zaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwb3NCZWZvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5wb3NCZWZvcmVDaGlsZCh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnBvc0JlZm9yZUNoaWxkKHRoaXMpICsgdGhpcy5ib3JkZXIgOiAwO1xuICAgIH1cbiAgICBnZXQgcG9zQWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSArIHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5zaXplIC0gMiAqIHRoaXMuYm9yZGVyO1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgLy8gSWYgdGhlIERPTSBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGVudCwgdXNlIHRoZSBjaGlsZCBkZXNjIGFmdGVyXG4gICAgICAgIC8vIGl0IHRvIGZpZ3VyZSBvdXQgYSBwb3NpdGlvbi5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChiaWFzIDwgMCkge1xuICAgICAgICAgICAgICAgIGxldCBkb21CZWZvcmUsIGRlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdoaWxlIChkb21CZWZvcmUgJiYgISgoZGVzYyA9IGRvbUJlZm9yZS5wbVZpZXdEZXNjKSAmJiBkZXNjLnBhcmVudCA9PSB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tQmVmb3JlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmVmb3JlID8gdGhpcy5wb3NCZWZvcmVDaGlsZChkZXNjKSArIGRlc2Muc2l6ZSA6IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBkb21BZnRlciwgZGVzYztcbiAgICAgICAgICAgICAgICBpZiAoZG9tID09IHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUFmdGVyID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoZG9tQWZ0ZXIgJiYgISgoZGVzYyA9IGRvbUFmdGVyLnBtVmlld0Rlc2MpICYmIGRlc2MucGFyZW50ID09IHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbUFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBkb21BZnRlciA/IHRoaXMucG9zQmVmb3JlQ2hpbGQoZGVzYykgOiB0aGlzLnBvc0F0RW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIHZhcmlvdXMgaGV1cmlzdGljcywgZmFsbGluZyBiYWNrIG9uIHRoZSBiaWFzXG4gICAgICAgIC8vIHBhcmFtZXRlciwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBwb3NpdGlvbiBhdCB0aGVcbiAgICAgICAgLy8gc3RhcnQgb3IgYXQgdGhlIGVuZCBvZiB0aGlzIHZpZXcgZGVzYy5cbiAgICAgICAgbGV0IGF0RW5kO1xuICAgICAgICBpZiAoZG9tID09IHRoaXMuZG9tICYmIHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgYXRFbmQgPSBvZmZzZXQgPiBkb21JbmRleCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00gIT0gdGhpcy5kb20gJiYgdGhpcy5kb20uY29udGFpbnModGhpcy5jb250ZW50RE9NKSkge1xuICAgICAgICAgICAgYXRFbmQgPSBkb20uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5jb250ZW50RE9NKSAmIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb20uZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IGRvbTs7IHNlYXJjaCA9IHNlYXJjaC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLnByZXZpb3VzU2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhdEVuZCA9PSBudWxsICYmIG9mZnNldCA9PSBkb20uY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoID0gZG9tOzsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGF0RW5kID09IG51bGwgPyBiaWFzID4gMCA6IGF0RW5kKSA/IHRoaXMucG9zQXRFbmQgOiB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIG5lYXJlc3REZXNjKGRvbSwgb25seU5vZGVzID0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChsZXQgZmlyc3QgPSB0cnVlLCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gdGhpcy5nZXREZXNjKGN1ciksIG5vZGVET007XG4gICAgICAgICAgICBpZiAoZGVzYyAmJiAoIW9ubHlOb2RlcyB8fCBkZXNjLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZG9tIGlzIG91dHNpZGUgb2YgdGhpcyBkZXNjJ3Mgbm9kZURPTSwgZG9uJ3QgY291bnQgaXQuXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0ICYmIChub2RlRE9NID0gZGVzYy5ub2RlRE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGVET00ubm9kZVR5cGUgPT0gMSA/IG5vZGVET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkgOiBub2RlRE9NID09IGRvbSkpXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREZXNjKGRvbSkge1xuICAgICAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgICAgICBmb3IgKGxldCBjdXIgPSBkZXNjOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnQpXG4gICAgICAgICAgICBpZiAoY3VyID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxuICAgIHBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IGRvbTsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbGV0IGRlc2MgPSB0aGlzLmdldERlc2Moc2Nhbik7XG4gICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5sb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLy8gRmluZCB0aGUgZGVzYyBmb3IgdGhlIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIHBvcywgaWYgYW55LiAoV2hlbiBhXG4gICAgLy8gcGFyZW50IG5vZGUgb3ZlcnJvZGUgcmVuZGVyaW5nLCB0aGVyZSBtaWdodCBub3QgYmUgb25lLilcbiAgICBkZXNjQXQocG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmZzZXQgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zICYmIGVuZCAhPSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWNoaWxkLmJvcmRlciAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuZGVzY0F0KHBvcyAtIG9mZnNldCAtIGNoaWxkLmJvcmRlcik7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmRvbSwgb2Zmc2V0OiAwLCBhdG9tOiBwb3MgKyAxIH07XG4gICAgICAgIC8vIEZpcnN0IGZpbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBjaGlsZCBhcnJheVxuICAgICAgICBsZXQgaSA9IDAsIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGN1clBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBjdXJQb3MgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcyB8fCBjaGlsZCBpbnN0YW5jZW9mIFRyYWlsaW5nSGFja1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gcG9zIC0gY3VyUG9zO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyUG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoaXMgcG9pbnRzIGludG8gdGhlIG1pZGRsZSBvZiBhIGNoaWxkLCBjYWxsIHRocm91Z2hcbiAgICAgICAgaWYgKG9mZnNldClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUZyb21Qb3Mob2Zmc2V0IC0gdGhpcy5jaGlsZHJlbltpXS5ib3JkZXIsIHNpZGUpO1xuICAgICAgICAvLyBHbyBiYWNrIGlmIHRoZXJlIHdlcmUgYW55IHplcm8tbGVuZ3RoIHdpZGdldHMgd2l0aCBzaWRlID49IDAgYmVmb3JlIHRoaXMgcG9pbnRcbiAgICAgICAgZm9yIChsZXQgcHJldjsgaSAmJiAhKHByZXYgPSB0aGlzLmNoaWxkcmVuW2kgLSAxXSkuc2l6ZSAmJiBwcmV2IGluc3RhbmNlb2YgV2lkZ2V0Vmlld0Rlc2MgJiYgcHJldi5zaWRlID49IDA7IGktLSkgeyB9XG4gICAgICAgIC8vIFNjYW4gdG93YXJkcyB0aGUgZmlyc3QgdXNlYWJsZSBub2RlXG4gICAgICAgIGlmIChzaWRlIDw9IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGktLSwgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSBpID8gdGhpcy5jaGlsZHJlbltpIC0gMV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghcHJldiB8fCBwcmV2LmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldiAmJiBzaWRlICYmIGVudGVyICYmICFwcmV2LmJvcmRlciAmJiAhcHJldi5kb21BdG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LmRvbUZyb21Qb3MocHJldi5zaXplLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBwcmV2ID8gZG9tSW5kZXgocHJldi5kb20pICsgMSA6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKywgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmNoaWxkcmVuW2ldIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHQgJiYgZW50ZXIgJiYgIW5leHQuYm9yZGVyICYmICFuZXh0LmRvbUF0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuZG9tRnJvbVBvcygwLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBuZXh0ID8gZG9tSW5kZXgobmV4dC5kb20pIDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXNlZCB0byBmaW5kIGEgRE9NIHJhbmdlIGluIGEgc2luZ2xlIHBhcmVudCBmb3IgYSBnaXZlbiBjaGFuZ2VkXG4gICAgLy8gcmFuZ2UuXG4gICAgcGFyc2VSYW5nZShmcm9tLCB0bywgYmFzZSA9IDApIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIGZyb20sIHRvLCBmcm9tT2Zmc2V0OiAwLCB0b09mZnNldDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIGxldCBmcm9tT2Zmc2V0ID0gLTEsIHRvT2Zmc2V0ID0gLTE7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IGJhc2UsIGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEgJiYgZnJvbSA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRCYXNlID0gb2Zmc2V0ICsgY2hpbGQuYm9yZGVyO1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIG1heWJlIGRlc2NlbmQgbWFyayB2aWV3cyB0byBwYXJzZSBhIG5hcnJvd2VyIHJhbmdlP1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IGNoaWxkQmFzZSAmJiB0byA8PSBlbmQgLSBjaGlsZC5ib3JkZXIgJiYgY2hpbGQubm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jb250ZW50RE9NICYmIHRoaXMuY29udGVudERPTS5jb250YWlucyhjaGlsZC5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnBhcnNlUmFuZ2UoZnJvbSwgdG8sIGNoaWxkQmFzZSk7XG4gICAgICAgICAgICAgICAgZnJvbSA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuY2hpbGRyZW5baiAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5zaXplICYmIHByZXYuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFwcmV2LmVtcHR5Q2hpbGRBdCgxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9mZnNldCA9IGRvbUluZGV4KHByZXYuZG9tKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcm9tIC09IHByZXYuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGZyb21PZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPiAtMSAmJiAoZW5kID4gdG8gfHwgaSA9PSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICAgICAgdG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuY2hpbGRyZW5bal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LnNpemUgJiYgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00gJiYgIW5leHQuZW1wdHlDaGlsZEF0KC0xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSBkb21JbmRleChuZXh0LmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0byArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b09mZnNldCA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSB0aGlzLmNvbnRlbnRET00uY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50RE9NLCBmcm9tLCB0bywgZnJvbU9mZnNldCwgdG9PZmZzZXQgfTtcbiAgICB9XG4gICAgZW1wdHlDaGlsZEF0KHNpZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuYm9yZGVyIHx8ICF0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3NpZGUgPCAwID8gMCA6IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBjaGlsZC5zaXplID09IDAgfHwgY2hpbGQuZW1wdHlDaGlsZEF0KHNpZGUpO1xuICAgIH1cbiAgICBkb21BZnRlclBvcyhwb3MpIHtcbiAgICAgICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSB0aGlzLmRvbUZyb21Qb3MocG9zLCAwKTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSB8fCBvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhZnRlciBwb3MgXCIgKyBwb3MpO1xuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgfVxuICAgIC8vIFZpZXcgZGVzY3MgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGFueSBzZWxlY3Rpb24gdGhhdCBmYWxsc1xuICAgIC8vIGVudGlyZWx5IGluc2lkZSBvZiB0aGVtLCBzbyB0aGF0IGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgY2FuIGRvXG4gICAgLy8gY3VzdG9tIHRoaW5ncyB3aXRoIHRoZSBzZWxlY3Rpb24uIE5vdGUgdGhhdCB0aGlzIGZhbGxzIGFwYXJ0IHdoZW5cbiAgICAvLyBhIHNlbGVjdGlvbiBzdGFydHMgaW4gc3VjaCBhIG5vZGUgYW5kIGVuZHMgaW4gYW5vdGhlciwgaW4gd2hpY2hcbiAgICAvLyBjYXNlIHdlIGp1c3QgdXNlIHdoYXRldmVyIGRvbUZyb21Qb3MgcHJvZHVjZXMgYXMgYSBiZXN0IGVmZm9ydC5cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCByb290LCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gZmFsbHMgZW50aXJlbHkgaW4gYSBjaGlsZCwgZ2l2ZSBpdCB0byB0aGF0IGNoaWxkXG4gICAgICAgIGxldCBmcm9tID0gTWF0aC5taW4oYW5jaG9yLCBoZWFkKSwgdG8gPSBNYXRoLm1heChhbmNob3IsIGhlYWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IG9mZnNldCAmJiB0byA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2V0U2VsZWN0aW9uKGFuY2hvciAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgaGVhZCAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgcm9vdCwgZm9yY2UpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbmNob3JET00gPSB0aGlzLmRvbUZyb21Qb3MoYW5jaG9yLCBhbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgaGVhZERPTSA9IGhlYWQgPT0gYW5jaG9yID8gYW5jaG9yRE9NIDogdGhpcy5kb21Gcm9tUG9zKGhlYWQsIGhlYWQgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgZG9tU2VsID0gcm9vdC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgbGV0IGJyS2x1ZGdlID0gZmFsc2U7XG4gICAgICAgIC8vIE9uIEZpcmVmb3gsIHVzaW5nIFNlbGVjdGlvbi5jb2xsYXBzZSB0byBwdXQgdGhlIGN1cnNvciBhZnRlciBhXG4gICAgICAgIC8vIEJSIG5vZGUgZm9yIHNvbWUgcmVhc29uIGRvZXNuJ3QgYWx3YXlzIHdvcmsgKCMxMDczKS4gT24gU2FmYXJpLFxuICAgICAgICAvLyB0aGUgY3Vyc29yIHNvbWV0aW1lcyBpbmV4cGxpY2FibGUgdmlzdWFsbHkgbGFncyBiZWhpbmQgaXRzXG4gICAgICAgIC8vIHJlcG9ydGVkIHBvc2l0aW9uIGluIHN1Y2ggc2l0dWF0aW9ucyAoIzEwOTIpLlxuICAgICAgICBpZiAoKGdlY2tvIHx8IHNhZmFyaSkgJiYgYW5jaG9yID09IGhlYWQpIHtcbiAgICAgICAgICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gYW5jaG9yRE9NO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIGJyS2x1ZGdlID0gISEob2Zmc2V0ICYmIG5vZGUubm9kZVZhbHVlW29mZnNldCAtIDFdID09IFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIC8vIElzc3VlICMxMTI4XG4gICAgICAgICAgICAgICAgaWYgKGJyS2x1ZGdlICYmIG9mZnNldCA9PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc2NhbiA9IG5vZGUsIGFmdGVyOyBzY2FuOyBzY2FuID0gc2Nhbi5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPSBzY2FuLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyLm5vZGVOYW1lID09IFwiQlJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRE9NID0gaGVhZERPTSA9IHsgbm9kZTogYWZ0ZXIucGFyZW50Tm9kZSwgb2Zmc2V0OiBkb21JbmRleChhZnRlcikgKyAxIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IHNjYW4ucG1WaWV3RGVzYztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgIGJyS2x1ZGdlID0gcHJldiAmJiAocHJldi5ub2RlTmFtZSA9PSBcIkJSXCIgfHwgcHJldi5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGaXJlZm94IGNhbiBhY3Qgc3RyYW5nZWx5IHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBpbiBmcm9udCBvZiBhblxuICAgICAgICAvLyB1bmVkaXRhYmxlIG5vZGUuIFNlZSAjMTE2MyBhbmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcwOTUzNlxuICAgICAgICBpZiAoZ2Vja28gJiYgZG9tU2VsLmZvY3VzTm9kZSAmJiBkb21TZWwuZm9jdXNOb2RlICE9IGhlYWRET00ubm9kZSAmJiBkb21TZWwuZm9jdXNOb2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IGRvbVNlbC5mb2N1c05vZGUuY2hpbGROb2Rlc1tkb21TZWwuZm9jdXNPZmZzZXRdO1xuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGZvcmNlIHx8IGJyS2x1ZGdlICYmIHNhZmFyaSkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0LCBkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQsIGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIFNlbGVjdGlvbi5leHRlbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuICdpbnZlcnRlZCcgc2VsZWN0aW9uXG4gICAgICAgIC8vIChvbmUgd2hlcmUgdGhlIGZvY3VzIGlzIGJlZm9yZSB0aGUgYW5jaG9yKSwgYnV0IG5vdCBhbGxcbiAgICAgICAgLy8gYnJvd3NlcnMgc3VwcG9ydCBpdCB5ZXQuXG4gICAgICAgIGxldCBkb21TZWxFeHRlbmRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoKGRvbVNlbC5leHRlbmQgfHwgYW5jaG9yID09IGhlYWQpICYmICFicktsdWRnZSkge1xuICAgICAgICAgICAgZG9tU2VsLmNvbGxhcHNlKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvciAhPSBoZWFkKVxuICAgICAgICAgICAgICAgICAgICBkb21TZWwuZXh0ZW5kKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGRvbVNlbEV4dGVuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcyB3aXRoIENocm9tZSB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFmdGVyIGNhbGxpbmdcbiAgICAgICAgICAgICAgICAvLyBjb2xsYXBzZSwgZXZlbiB3aGVuIGl0IHNob3VsZCBiZSB2YWxpZC4gVGhpcyBhcHBlYXJzIHRvIGJlIGEgYnVnLCBidXRcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBkaWZmaWN1bHQgdG8gaXNvbGF0ZS4gSWYgdGhpcyBoYXBwZW5zIGZhbGxiYWNrIHRvIHRoZSBvbGQgcGF0aFxuICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdXNpbmcgZXh0ZW5kLlxuICAgICAgICAgICAgICAgIC8vIFNpbWlsYXJseSwgdGhpcyBjb3VsZCBjcmFzaCBvbiBTYWZhcmkgaWYgdGhlIGVkaXRvciBpcyBoaWRkZW4sIGFuZFxuICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdhcyBubyBzZWxlY3Rpb24uXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkb21TZWxFeHRlbmRlZCkge1xuICAgICAgICAgICAgaWYgKGFuY2hvciA+IGhlYWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdG1wID0gYW5jaG9yRE9NO1xuICAgICAgICAgICAgICAgIGFuY2hvckRPTSA9IGhlYWRET007XG4gICAgICAgICAgICAgICAgaGVhZERPTSA9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoaGVhZERPTS5ub2RlLCBoZWFkRE9NLm9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChhbmNob3JET00ubm9kZSwgYW5jaG9yRE9NLm9mZnNldCk7XG4gICAgICAgICAgICBkb21TZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBkb21TZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250ZW50RE9NICYmIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIjtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRMb3N0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50RE9NICYmIHRoaXMuY29udGVudERPTSAhPSB0aGlzLmRvbSAmJiAhdGhpcy5kb20uY29udGFpbnModGhpcy5jb250ZW50RE9NKTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGEgc3VidHJlZSBvZiB0aGUgZWxlbWVudCB0cmVlIHRoYXQgaGFzIGJlZW4gdG91Y2hlZFxuICAgIC8vIGJ5IGEgRE9NIGNoYW5nZSwgc28gdGhhdCB0aGUgbmV4dCB1cGRhdGUgd2lsbCByZWRyYXcgaXQuXG4gICAgbWFya0RpcnR5KGZyb20sIHRvKSB7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IDAsIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gZW5kID8gZnJvbSA8PSBlbmQgJiYgdG8gPj0gb2Zmc2V0IDogZnJvbSA8IGVuZCAmJiB0byA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydEluc2lkZSA9IG9mZnNldCArIGNoaWxkLmJvcmRlciwgZW5kSW5zaWRlID0gZW5kIC0gY2hpbGQuYm9yZGVyO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IHN0YXJ0SW5zaWRlICYmIHRvIDw9IGVuZEluc2lkZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcnR5ID0gZnJvbSA9PSBvZmZzZXQgfHwgdG8gPT0gZW5kID8gQ09OVEVOVF9ESVJUWSA6IENISUxEX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA9PSBzdGFydEluc2lkZSAmJiB0byA9PSBlbmRJbnNpZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGlsZC5jb250ZW50TG9zdCB8fCBjaGlsZC5kb20ucGFyZW50Tm9kZSAhPSB0aGlzLmNvbnRlbnRET00pKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBOT0RFX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tYXJrRGlydHkoZnJvbSAtIHN0YXJ0SW5zaWRlLCB0byAtIHN0YXJ0SW5zaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBjaGlsZC5kb20gPT0gY2hpbGQuY29udGVudERPTSAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00gJiYgIWNoaWxkLmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBDT05URU5UX0RJUlRZIDogTk9ERV9ESVJUWTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eSA9IENPTlRFTlRfRElSVFk7XG4gICAgfVxuICAgIG1hcmtQYXJlbnRzRGlydHkoKSB7XG4gICAgICAgIGxldCBsZXZlbCA9IDE7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSB0aGlzLnBhcmVudDsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50LCBsZXZlbCsrKSB7XG4gICAgICAgICAgICBsZXQgZGlydHkgPSBsZXZlbCA9PSAxID8gQ09OVEVOVF9ESVJUWSA6IENISUxEX0RJUlRZO1xuICAgICAgICAgICAgaWYgKG5vZGUuZGlydHkgPCBkaXJ0eSlcbiAgICAgICAgICAgICAgICBub2RlLmRpcnR5ID0gZGlydHk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRvbUF0b20oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpZ25vcmVGb3JDb29yZHMoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuLy8gQSB3aWRnZXQgZGVzYyByZXByZXNlbnRzIGEgd2lkZ2V0IGRlY29yYXRpb24sIHdoaWNoIGlzIGEgRE9NIG5vZGVcbi8vIGRyYXduIGJldHdlZW4gdGhlIGRvY3VtZW50IG5vZGVzLlxuY2xhc3MgV2lkZ2V0Vmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCB3aWRnZXQsIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgc2VsZiwgZG9tID0gd2lkZ2V0LnR5cGUudG9ET007XG4gICAgICAgIGlmICh0eXBlb2YgZG9tID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGRvbSA9IGRvbSh2aWV3LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWxmKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnBhcmVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50LnBvc0JlZm9yZUNoaWxkKHNlbGYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICghd2lkZ2V0LnR5cGUuc3BlYy5yYXcpIHtcbiAgICAgICAgICAgIGlmIChkb20ubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgICAgIGxldCB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICAgICAgd3JhcC5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IHdyYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5hZGQoXCJQcm9zZU1pcnJvci13aWRnZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBudWxsKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICBzZWxmID0gdGhpcztcbiAgICB9XG4gICAgbWF0Y2hlc1dpZGdldCh3aWRnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlydHkgPT0gTk9UX0RJUlRZICYmIHdpZGdldC50eXBlLmVxKHRoaXMud2lkZ2V0LnR5cGUpO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiB7IGlnbm9yZTogdHJ1ZSB9OyB9XG4gICAgc3RvcEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGxldCBzdG9wID0gdGhpcy53aWRnZXQuc3BlYy5zdG9wRXZlbnQ7XG4gICAgICAgIHJldHVybiBzdG9wID8gc3RvcChldmVudCkgOiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIiB8fCB0aGlzLndpZGdldC5zcGVjLmlnbm9yZVNlbGVjdGlvbjtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy53aWRnZXQudHlwZS5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgc2lkZSgpIHsgcmV0dXJuIHRoaXMud2lkZ2V0LnR5cGUuc2lkZTsgfVxufVxuY2xhc3MgQ29tcG9zaXRpb25WaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIGRvbSwgdGV4dERPTSwgdGV4dCkge1xuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIG51bGwpO1xuICAgICAgICB0aGlzLnRleHRET00gPSB0ZXh0RE9NO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKGRvbSAhPSB0aGlzLnRleHRET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgKG9mZnNldCA/IHRoaXMuc2l6ZSA6IDApO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgb2Zmc2V0O1xuICAgIH1cbiAgICBkb21Gcm9tUG9zKHBvcykge1xuICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLnRleHRET00sIG9mZnNldDogcG9zIH07XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dCkge1xuICAgICAgICByZXR1cm4gbXV0LnR5cGUgPT09ICdjaGFyYWN0ZXJEYXRhJyAmJiBtdXQudGFyZ2V0Lm5vZGVWYWx1ZSA9PSBtdXQub2xkVmFsdWU7XG4gICAgfVxufVxuLy8gQSBtYXJrIGRlc2MgcmVwcmVzZW50cyBhIG1hcmsuIE1heSBoYXZlIG11bHRpcGxlIGNoaWxkcmVuLFxuLy8gZGVwZW5kaW5nIG9uIGhvdyB0aGUgbWFyayBpcyBzcGxpdC4gTm90ZSB0aGF0IG1hcmtzIGFyZSBkcmF3biB1c2luZ1xuLy8gYSBmaXhlZCBuZXN0aW5nIG9yZGVyLCBmb3Igc2ltcGxpY2l0eSBhbmQgcHJlZGljdGFiaWxpdHksIHNvIGluXG4vLyBzb21lIGNhc2VzIHRoZXkgd2lsbCBiZSBzcGxpdCBtb3JlIG9mdGVuIHRoYW4gd291bGQgYXBwZWFyXG4vLyBuZWNlc3NhcnkuXG5jbGFzcyBNYXJrVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBtYXJrLCBkb20sIGNvbnRlbnRET00pIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBjb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShwYXJlbnQsIG1hcmssIGlubGluZSwgdmlldykge1xuICAgICAgICBsZXQgY3VzdG9tID0gdmlldy5ub2RlVmlld3NbbWFyay50eXBlLm5hbWVdO1xuICAgICAgICBsZXQgc3BlYyA9IGN1c3RvbSAmJiBjdXN0b20obWFyaywgdmlldywgaW5saW5lKTtcbiAgICAgICAgaWYgKCFzcGVjIHx8ICFzcGVjLmRvbSlcbiAgICAgICAgICAgIHNwZWMgPSBET01TZXJpYWxpemVyLnJlbmRlclNwZWMoZG9jdW1lbnQsIG1hcmsudHlwZS5zcGVjLnRvRE9NKG1hcmssIGlubGluZSkpO1xuICAgICAgICByZXR1cm4gbmV3IE1hcmtWaWV3RGVzYyhwYXJlbnQsIG1hcmssIHNwZWMuZG9tLCBzcGVjLmNvbnRlbnRET00gfHwgc3BlYy5kb20pO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7XG4gICAgICAgIGlmICgodGhpcy5kaXJ0eSAmIE5PREVfRElSVFkpIHx8IHRoaXMubWFyay50eXBlLnNwZWMucmVwYXJzZUluVmlldylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4geyBtYXJrOiB0aGlzLm1hcmsudHlwZS5uYW1lLCBhdHRyczogdGhpcy5tYXJrLmF0dHJzLCBjb250ZW50RWxlbWVudDogdGhpcy5jb250ZW50RE9NIH07XG4gICAgfVxuICAgIG1hdGNoZXNNYXJrKG1hcmspIHsgcmV0dXJuIHRoaXMuZGlydHkgIT0gTk9ERV9ESVJUWSAmJiB0aGlzLm1hcmsuZXEobWFyayk7IH1cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgc3VwZXIubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgLy8gTW92ZSBkaXJ0eSBpbmZvIHRvIG5lYXJlc3Qgbm9kZSB2aWV3XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ICE9IE5PVF9ESVJUWSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgd2hpbGUgKCFwYXJlbnQubm9kZSlcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgICAgICAgaWYgKHBhcmVudC5kaXJ0eSA8IHRoaXMuZGlydHkpXG4gICAgICAgICAgICAgICAgcGFyZW50LmRpcnR5ID0gdGhpcy5kaXJ0eTtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2xpY2UoZnJvbSwgdG8sIHZpZXcpIHtcbiAgICAgICAgbGV0IGNvcHkgPSBNYXJrVmlld0Rlc2MuY3JlYXRlKHRoaXMucGFyZW50LCB0aGlzLm1hcmssIHRydWUsIHZpZXcpO1xuICAgICAgICBsZXQgbm9kZXMgPSB0aGlzLmNoaWxkcmVuLCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBpZiAodG8gPCBzaXplKVxuICAgICAgICAgICAgbm9kZXMgPSByZXBsYWNlTm9kZXMobm9kZXMsIHRvLCBzaXplLCB2aWV3KTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgbm9kZXMgPSByZXBsYWNlTm9kZXMobm9kZXMsIDAsIGZyb20sIHZpZXcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgbm9kZXNbaV0ucGFyZW50ID0gY29weTtcbiAgICAgICAgY29weS5jaGlsZHJlbiA9IG5vZGVzO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG4vLyBOb2RlIHZpZXcgZGVzY3MgYXJlIHRoZSBtYWluLCBtb3N0IGNvbW1vbiB0eXBlIG9mIHZpZXcgZGVzYywgYW5kXG4vLyBjb3JyZXNwb25kIHRvIGFuIGFjdHVhbCBub2RlIGluIHRoZSBkb2N1bWVudC4gVW5saWtlIG1hcmsgZGVzY3MsXG4vLyB0aGV5IHBvcHVsYXRlIHRoZWlyIGNoaWxkIGFycmF5IHRoZW1zZWx2ZXMuXG5jbGFzcyBOb2RlVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NLCBub2RlRE9NLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBjb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vdXRlckRlY28gPSBvdXRlckRlY287XG4gICAgICAgIHRoaXMuaW5uZXJEZWNvID0gaW5uZXJEZWNvO1xuICAgICAgICB0aGlzLm5vZGVET00gPSBub2RlRE9NO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0LCBhIG5vZGUgaXMgcmVuZGVyZWQgdXNpbmcgdGhlIGB0b0RPTWAgbWV0aG9kIGZyb20gdGhlXG4gICAgLy8gbm9kZSB0eXBlIHNwZWMuIEJ1dCBjbGllbnQgY29kZSBjYW4gdXNlIHRoZSBgbm9kZVZpZXdzYCBzcGVjIHRvXG4gICAgLy8gc3VwcGx5IGEgY3VzdG9tIG5vZGUgdmlldywgd2hpY2ggY2FuIGluZmx1ZW5jZSB2YXJpb3VzIGFzcGVjdHMgb2ZcbiAgICAvLyB0aGUgd2F5IHRoZSBub2RlIHdvcmtzLlxuICAgIC8vXG4gICAgLy8gKFVzaW5nIHN1YmNsYXNzaW5nIGZvciB0aGlzIHdhcyBpbnRlbnRpb25hbGx5IGRlY2lkZWQgYWdhaW5zdCxcbiAgICAvLyBzaW5jZSBpdCdkIHJlcXVpcmUgZXhwb3NpbmcgYSB3aG9sZSBzbGV3IG9mIGZpbmlja3lcbiAgICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIHRoZSB1c2VyIGNvZGUgdGhhdCB0aGV5IHByb2JhYmx5IHdpbGxcbiAgICAvLyBuZXZlciBuZWVkLilcbiAgICBzdGF0aWMgY3JlYXRlKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgY3VzdG9tID0gdmlldy5ub2RlVmlld3Nbbm9kZS50eXBlLm5hbWVdLCBkZXNjT2JqO1xuICAgICAgICBsZXQgc3BlYyA9IGN1c3RvbSAmJiBjdXN0b20obm9kZSwgdmlldywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gKFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGFsbG93cyB0aGUgY3VzdG9tIHZpZXcgdG8gZmluZCBpdHNcbiAgICAgICAgICAgIC8vIG93biBwb3NpdGlvbilcbiAgICAgICAgICAgIGlmICghZGVzY09iailcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgaWYgKGRlc2NPYmoucGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBkZXNjT2JqLnBhcmVudC5wb3NCZWZvcmVDaGlsZChkZXNjT2JqKTtcbiAgICAgICAgfSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pO1xuICAgICAgICBsZXQgZG9tID0gc3BlYyAmJiBzcGVjLmRvbSwgY29udGVudERPTSA9IHNwZWMgJiYgc3BlYy5jb250ZW50RE9NO1xuICAgICAgICBpZiAobm9kZS5pc1RleHQpIHtcbiAgICAgICAgICAgIGlmICghZG9tKVxuICAgICAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5vZGUudGV4dCk7XG4gICAgICAgICAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgIT0gMylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRleHQgbXVzdCBiZSByZW5kZXJlZCBhcyBhIERPTSB0ZXh0IG5vZGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWRvbSkge1xuICAgICAgICAgICAgKHsgZG9tLCBjb250ZW50RE9NIH0gPSBET01TZXJpYWxpemVyLnJlbmRlclNwZWMoZG9jdW1lbnQsIG5vZGUudHlwZS5zcGVjLnRvRE9NKG5vZGUpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250ZW50RE9NICYmICFub2RlLmlzVGV4dCAmJiBkb20ubm9kZU5hbWUgIT0gXCJCUlwiKSB7IC8vIENocm9tZSBnZXRzIGNvbmZ1c2VkIGJ5IDxiciBjb250ZW50ZWRpdGFibGU9ZmFsc2U+XG4gICAgICAgICAgICBpZiAoIWRvbS5oYXNBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIikpXG4gICAgICAgICAgICAgICAgZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgZG9tLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5vZGVET00gPSBkb207XG4gICAgICAgIGRvbSA9IGFwcGx5T3V0ZXJEZWNvKGRvbSwgb3V0ZXJEZWNvLCBub2RlKTtcbiAgICAgICAgaWYgKHNwZWMpXG4gICAgICAgICAgICByZXR1cm4gZGVzY09iaiA9IG5ldyBDdXN0b21Ob2RlVmlld0Rlc2MocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NIHx8IG51bGwsIG5vZGVET00sIHNwZWMsIHZpZXcsIHBvcyArIDEpO1xuICAgICAgICBlbHNlIGlmIChub2RlLmlzVGV4dClcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFZpZXdEZXNjKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgbm9kZURPTSwgdmlldyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZVZpZXdEZXNjKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSB8fCBudWxsLCBub2RlRE9NLCB2aWV3LCBwb3MgKyAxKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICAvLyBFeHBlcmltZW50YWwga2x1ZGdlIHRvIGFsbG93IG9wdC1pbiByZS1wYXJzaW5nIG9mIG5vZGVzXG4gICAgICAgIGlmICh0aGlzLm5vZGUudHlwZS5zcGVjLnJlcGFyc2VJblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRklYTUUgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGNhbiBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIGF0dHJzIG1lYW5zIHRoYXQgaWYgdGhlIHVzZXIgc29tZWhvdyBtYW5hZ2VzIHRvIGNoYW5nZSB0aGVcbiAgICAgICAgLy8gYXR0cnMgaW4gdGhlIGRvbSwgdGhhdCB3b24ndCBiZSBwaWNrZWQgdXAuIE5vdCBlbnRpcmVseSBzdXJlXG4gICAgICAgIC8vIHdoZXRoZXIgdGhpcyBpcyBhIHByb2JsZW1cbiAgICAgICAgbGV0IHJ1bGUgPSB7IG5vZGU6IHRoaXMubm9kZS50eXBlLm5hbWUsIGF0dHJzOiB0aGlzLm5vZGUuYXR0cnMgfTtcbiAgICAgICAgaWYgKHRoaXMubm9kZS50eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIilcbiAgICAgICAgICAgIHJ1bGUucHJlc2VydmVXaGl0ZXNwYWNlID0gXCJmdWxsXCI7XG4gICAgICAgIGlmICghdGhpcy5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICBydWxlLmdldENvbnRlbnQgPSAoKSA9PiB0aGlzLm5vZGUuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZW50TG9zdCkge1xuICAgICAgICAgICAgcnVsZS5jb250ZW50RWxlbWVudCA9IHRoaXMuY29udGVudERPTTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIENocm9tZSBsaWtlcyB0byByYW5kb21seSByZWNyZWF0ZSBwYXJlbnQgbm9kZXMgd2hlblxuICAgICAgICAgICAgLy8gYmFja3NwYWNpbmcgdGhpbmdzLiBXaGVuIHRoYXQgaGFwcGVucywgdGhpcyB0cmllcyB0byBmaW5kIHRoZVxuICAgICAgICAgICAgLy8gbmV3IHBhcmVudC5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb20uY29udGFpbnMoY2hpbGQuZG9tLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUuY29udGVudEVsZW1lbnQgPSBjaGlsZC5kb20ucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFydWxlLmNvbnRlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJ1bGUuZ2V0Q29udGVudCA9ICgpID0+IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydWxlO1xuICAgIH1cbiAgICBtYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJ0eSA9PSBOT1RfRElSVFkgJiYgbm9kZS5lcSh0aGlzLm5vZGUpICYmXG4gICAgICAgICAgICBzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgdGhpcy5vdXRlckRlY28pICYmIGlubmVyRGVjby5lcSh0aGlzLmlubmVyRGVjbyk7XG4gICAgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy5ub2RlLm5vZGVTaXplOyB9XG4gICAgZ2V0IGJvcmRlcigpIHsgcmV0dXJuIHRoaXMubm9kZS5pc0xlYWYgPyAwIDogMTsgfVxuICAgIC8vIFN5bmNzIGB0aGlzLmNoaWxkcmVuYCB0byBtYXRjaCBgdGhpcy5ub2RlLmNvbnRlbnRgIGFuZCB0aGUgbG9jYWxcbiAgICAvLyBkZWNvcmF0aW9ucywgcG9zc2libHkgaW50cm9kdWNpbmcgbmVzdGluZyBmb3IgbWFya3MuIFRoZW4sIGluIGFcbiAgICAvLyBzZXBhcmF0ZSBzdGVwLCBzeW5jcyB0aGUgRE9NIGluc2lkZSBgdGhpcy5jb250ZW50RE9NYCB0b1xuICAgIC8vIGB0aGlzLmNoaWxkcmVuYC5cbiAgICB1cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IGlubGluZSA9IHRoaXMubm9kZS5pbmxpbmVDb250ZW50LCBvZmYgPSBwb3M7XG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IHZpZXcuY29tcG9zaW5nID8gdGhpcy5sb2NhbENvbXBvc2l0aW9uSW5mbyh2aWV3LCBwb3MpIDogbnVsbDtcbiAgICAgICAgbGV0IGxvY2FsQ29tcG9zaXRpb24gPSBjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5wb3MgPiAtMSA/IGNvbXBvc2l0aW9uIDogbnVsbDtcbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uSW5DaGlsZCA9IGNvbXBvc2l0aW9uICYmIGNvbXBvc2l0aW9uLnBvcyA8IDA7XG4gICAgICAgIGxldCB1cGRhdGVyID0gbmV3IFZpZXdUcmVlVXBkYXRlcih0aGlzLCBsb2NhbENvbXBvc2l0aW9uICYmIGxvY2FsQ29tcG9zaXRpb24ubm9kZSwgdmlldyk7XG4gICAgICAgIGl0ZXJEZWNvKHRoaXMubm9kZSwgdGhpcy5pbm5lckRlY28sICh3aWRnZXQsIGksIGluc2lkZU5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmICh3aWRnZXQuc3BlYy5tYXJrcylcbiAgICAgICAgICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKHdpZGdldC5zcGVjLm1hcmtzLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgZWxzZSBpZiAod2lkZ2V0LnR5cGUuc2lkZSA+PSAwICYmICFpbnNpZGVOb2RlKVxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3MoaSA9PSB0aGlzLm5vZGUuY2hpbGRDb3VudCA/IE1hcmsubm9uZSA6IHRoaXMubm9kZS5jaGlsZChpKS5tYXJrcywgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IG5vZGUgaXMgYSBkZXNjIG1hdGNoaW5nIHRoaXMgd2lkZ2V0LCByZXVzZSBpdCxcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBpbnNlcnQgdGhlIHdpZGdldCBhcyBhIG5ldyB2aWV3IGRlc2MuXG4gICAgICAgICAgICB1cGRhdGVyLnBsYWNlV2lkZ2V0KHdpZGdldCwgdmlldywgb2ZmKTtcbiAgICAgICAgfSwgKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgaSkgPT4ge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB3cmFwcGluZyBtYXJrIGRlc2NzIG1hdGNoIHRoZSBub2RlJ3MgbWFya3MuXG4gICAgICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKGNoaWxkLm1hcmtzLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgLy8gVHJ5IHNldmVyYWwgc3RyYXRlZ2llcyBmb3IgZHJhd2luZyB0aGlzIG5vZGVcbiAgICAgICAgICAgIGxldCBjb21wSW5kZXg7XG4gICAgICAgICAgICBpZiAodXBkYXRlci5maW5kTm9kZU1hdGNoKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgaSkpIDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBvc2l0aW9uSW5DaGlsZCAmJiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tID4gb2ZmICYmXG4gICAgICAgICAgICAgICAgdmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gPCBvZmYgKyBjaGlsZC5ub2RlU2l6ZSAmJlxuICAgICAgICAgICAgICAgIChjb21wSW5kZXggPSB1cGRhdGVyLmZpbmRJbmRleFdpdGhDaGlsZChjb21wb3NpdGlvbi5ub2RlKSkgPiAtMSAmJlxuICAgICAgICAgICAgICAgIHVwZGF0ZXIudXBkYXRlTm9kZUF0KGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgY29tcEluZGV4LCB2aWV3KSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAodXBkYXRlci51cGRhdGVOZXh0Tm9kZShjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIGksIG9mZikpIDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFkZCBpdCBhcyBhIG5ldyB2aWV3XG4gICAgICAgICAgICAgICAgdXBkYXRlci5hZGROb2RlKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgb2ZmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIERyb3AgYWxsIHJlbWFpbmluZyBkZXNjcyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyhbXSwgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5pc1RleHRibG9jaylcbiAgICAgICAgICAgIHVwZGF0ZXIuYWRkVGV4dGJsb2NrSGFja3MoKTtcbiAgICAgICAgdXBkYXRlci5kZXN0cm95UmVzdCgpO1xuICAgICAgICAvLyBTeW5jIHRoZSBET00gaWYgYW55dGhpbmcgY2hhbmdlZFxuICAgICAgICBpZiAodXBkYXRlci5jaGFuZ2VkIHx8IHRoaXMuZGlydHkgPT0gQ09OVEVOVF9ESVJUWSkge1xuICAgICAgICAgICAgLy8gTWF5IGhhdmUgdG8gcHJvdGVjdCBmb2N1c2VkIERPTSBmcm9tIGJlaW5nIGNoYW5nZWQgaWYgYSBjb21wb3NpdGlvbiBpcyBhY3RpdmVcbiAgICAgICAgICAgIGlmIChsb2NhbENvbXBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdGVjdExvY2FsQ29tcG9zaXRpb24odmlldywgbG9jYWxDb21wb3NpdGlvbik7XG4gICAgICAgICAgICByZW5kZXJEZXNjcyh0aGlzLmNvbnRlbnRET00sIHRoaXMuY2hpbGRyZW4sIHZpZXcpO1xuICAgICAgICAgICAgaWYgKGlvcylcbiAgICAgICAgICAgICAgICBpb3NIYWNrcyh0aGlzLmRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9jYWxDb21wb3NpdGlvbkluZm8odmlldywgcG9zKSB7XG4gICAgICAgIC8vIE9ubHkgZG8gc29tZXRoaW5nIGlmIGJvdGggdGhlIHNlbGVjdGlvbiBhbmQgYSBmb2N1c2VkIHRleHQgbm9kZVxuICAgICAgICAvLyBhcmUgaW5zaWRlIG9mIHRoaXMgbm9kZVxuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmICghKHZpZXcuc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgfHwgZnJvbSA8IHBvcyB8fCB0byA+IHBvcyArIHRoaXMubm9kZS5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IHRleHROb2RlID0gbmVhcmJ5VGV4dE5vZGUoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgICAgaWYgKCF0ZXh0Tm9kZSB8fCAhdGhpcy5kb20uY29udGFpbnModGV4dE5vZGUucGFyZW50Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSB0ZXh0IGluIHRoZSBmb2N1c2VkIG5vZGUgaW4gdGhlIG5vZGUsIHN0b3AgaWYgaXQncyBub3RcbiAgICAgICAgICAgIC8vIHRoZXJlIChtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHRocm91Z2ggb3RoZXIgbWVhbnMsIGluIHdoaWNoXG4gICAgICAgICAgICAvLyBjYXNlIGl0IHNob3VsZCBvdmVyd3JpdHRlbilcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgbGV0IHRleHRQb3MgPSBmaW5kVGV4dEluRnJhZ21lbnQodGhpcy5ub2RlLmNvbnRlbnQsIHRleHQsIGZyb20gLSBwb3MsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0UG9zIDwgMCA/IG51bGwgOiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IHRleHRQb3MsIHRleHQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IC0xLCB0ZXh0OiBcIlwiIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdExvY2FsQ29tcG9zaXRpb24odmlldywgeyBub2RlLCBwb3MsIHRleHQgfSkge1xuICAgICAgICAvLyBUaGUgbm9kZSBpcyBhbHJlYWR5IHBhcnQgb2YgYSBsb2NhbCB2aWV3IGRlc2MsIGxlYXZlIGl0IHRoZXJlXG4gICAgICAgIGlmICh0aGlzLmdldERlc2Mobm9kZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0aW9uIHZpZXcgZm9yIHRoZSBvcnBoYW5lZCBub2Rlc1xuICAgICAgICBsZXQgdG9wTm9kZSA9IG5vZGU7XG4gICAgICAgIGZvciAoOzsgdG9wTm9kZSA9IHRvcE5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKHRvcE5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB3aGlsZSAodG9wTm9kZS5wcmV2aW91c1NpYmxpbmcpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvcE5vZGUucHJldmlvdXNTaWJsaW5nKTtcbiAgICAgICAgICAgIHdoaWxlICh0b3BOb2RlLm5leHRTaWJsaW5nKVxuICAgICAgICAgICAgICAgIHRvcE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b3BOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIGlmICh0b3BOb2RlLnBtVmlld0Rlc2MpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wbVZpZXdEZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZXNjID0gbmV3IENvbXBvc2l0aW9uVmlld0Rlc2ModGhpcywgdG9wTm9kZSwgbm9kZSwgdGV4dCk7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5wdXNoKGRlc2MpO1xuICAgICAgICAvLyBQYXRjaCB1cCB0aGlzLmNoaWxkcmVuIHRvIGNvbnRhaW4gdGhlIGNvbXBvc2l0aW9uIHZpZXdcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHJlcGxhY2VOb2Rlcyh0aGlzLmNoaWxkcmVuLCBwb3MsIHBvcyArIHRleHQubGVuZ3RoLCB2aWV3LCBkZXNjKTtcbiAgICB9XG4gICAgLy8gSWYgdGhpcyBkZXNjIG11c3QgYmUgdXBkYXRlZCB0byBtYXRjaCB0aGUgZ2l2ZW4gbm9kZSBkZWNvcmF0aW9uLFxuICAgIC8vIGRvIHNvIGFuZCByZXR1cm4gdHJ1ZS5cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSB8fFxuICAgICAgICAgICAgIW5vZGUuc2FtZU1hcmt1cCh0aGlzLm5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuaW5uZXJEZWNvID0gaW5uZXJEZWNvO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbih2aWV3LCB0aGlzLnBvc0F0U3RhcnQpO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgIH1cbiAgICB1cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKSB7XG4gICAgICAgIGlmIChzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgdGhpcy5vdXRlckRlY28pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbmVlZHNXcmFwID0gdGhpcy5ub2RlRE9NLm5vZGVUeXBlICE9IDE7XG4gICAgICAgIGxldCBvbGRET00gPSB0aGlzLmRvbTtcbiAgICAgICAgdGhpcy5kb20gPSBwYXRjaE91dGVyRGVjbyh0aGlzLmRvbSwgdGhpcy5ub2RlRE9NLCBjb21wdXRlT3V0ZXJEZWNvKHRoaXMub3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCksIGNvbXB1dGVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCkpO1xuICAgICAgICBpZiAodGhpcy5kb20gIT0gb2xkRE9NKSB7XG4gICAgICAgICAgICBvbGRET00ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0ZXJEZWNvID0gb3V0ZXJEZWNvO1xuICAgIH1cbiAgICAvLyBNYXJrIHRoaXMgbm9kZSBhcyBiZWluZyB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5ub2RlRE9NLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICB0aGlzLm5vZGVET00uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSB8fCAhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICB0aGlzLmRvbS5kcmFnZ2FibGUgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgbm9kZSBtYXJraW5nIGZyb20gdGhpcyBub2RlLlxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZURPTS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5ub2RlRE9NLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1zZWxlY3RlZG5vZGVcIik7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMubm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlQXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRoaXMubm9kZS5pc0F0b207IH1cbn1cbi8vIENyZWF0ZSBhIHZpZXcgZGVzYyBmb3IgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCBub2RlLCB0byBiZSBleHBvcnRlZFxuLy8gYW5kIHVzZWQgYnkgdGhlIHZpZXcgY2xhc3MuXG5mdW5jdGlvbiBkb2NWaWV3RGVzYyhkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIHZpZXcpIHtcbiAgICBhcHBseU91dGVyRGVjbyhkb20sIG91dGVyRGVjbywgZG9jKTtcbiAgICBsZXQgZG9jVmlldyA9IG5ldyBOb2RlVmlld0Rlc2ModW5kZWZpbmVkLCBkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGRvbSwgZG9tLCB2aWV3LCAwKTtcbiAgICBpZiAoZG9jVmlldy5jb250ZW50RE9NKVxuICAgICAgICBkb2NWaWV3LnVwZGF0ZUNoaWxkcmVuKHZpZXcsIDApO1xuICAgIHJldHVybiBkb2NWaWV3O1xufVxuY2xhc3MgVGV4dFZpZXdEZXNjIGV4dGVuZHMgTm9kZVZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG5vZGVET00sIHZpZXcpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBudWxsLCBub2RlRE9NLCB2aWV3LCAwKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICBsZXQgc2tpcCA9IHRoaXMubm9kZURPTS5wYXJlbnROb2RlO1xuICAgICAgICB3aGlsZSAoc2tpcCAmJiBza2lwICE9IHRoaXMuZG9tICYmICFza2lwLnBtSXNEZWNvKVxuICAgICAgICAgICAgc2tpcCA9IHNraXAucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIHsgc2tpcDogKHNraXAgfHwgdHJ1ZSkgfTtcbiAgICB9XG4gICAgdXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ID09IE5PREVfRElSVFkgfHwgKHRoaXMuZGlydHkgIT0gTk9UX0RJUlRZICYmICF0aGlzLmluUGFyZW50KCkpIHx8XG4gICAgICAgICAgICAhbm9kZS5zYW1lTWFya3VwKHRoaXMubm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIGlmICgodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkgfHwgbm9kZS50ZXh0ICE9IHRoaXMubm9kZS50ZXh0KSAmJiBub2RlLnRleHQgIT0gdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSA9IG5vZGUudGV4dDtcbiAgICAgICAgICAgIGlmICh2aWV3LnRyYWNrV3JpdGVzID09IHRoaXMubm9kZURPTSlcbiAgICAgICAgICAgICAgICB2aWV3LnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaW5QYXJlbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnRET00gPSB0aGlzLnBhcmVudC5jb250ZW50RE9NO1xuICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5ub2RlRE9NOyBuOyBuID0gbi5wYXJlbnROb2RlKVxuICAgICAgICAgICAgaWYgKG4gPT0gcGFyZW50RE9NKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMubm9kZURPTSwgb2Zmc2V0OiBwb3MgfTtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIGlmIChkb20gPT0gdGhpcy5ub2RlRE9NKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIE1hdGgubWluKG9mZnNldCwgdGhpcy5ub2RlLnRleHQubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmxvY2FsUG9zRnJvbURPTShkb20sIG9mZnNldCwgYmlhcyk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGlvbi50eXBlICE9IFwiY2hhcmFjdGVyRGF0YVwiICYmIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIjtcbiAgICB9XG4gICAgc2xpY2UoZnJvbSwgdG8sIHZpZXcpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLm5vZGUuY3V0KGZyb20sIHRvKSwgZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Vmlld0Rlc2ModGhpcy5wYXJlbnQsIG5vZGUsIHRoaXMub3V0ZXJEZWNvLCB0aGlzLmlubmVyRGVjbywgZG9tLCBkb20sIHZpZXcpO1xuICAgIH1cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgc3VwZXIubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tICE9IHRoaXMubm9kZURPTSAmJiAoZnJvbSA9PSAwIHx8IHRvID09IHRoaXMubm9kZURPTS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBOT0RFX0RJUlRZO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vLyBBIGR1bW15IGRlc2MgdXNlZCB0byB0YWcgdHJhaWxpbmcgQlIgb3IgSU1HIG5vZGVzIGNyZWF0ZWQgdG8gd29ya1xuLy8gYXJvdW5kIGNvbnRlbnRFZGl0YWJsZSB0ZXJyaWJsZW5lc3MuXG5jbGFzcyBUcmFpbGluZ0hhY2tWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiB7IGlnbm9yZTogdHJ1ZSB9OyB9XG4gICAgbWF0Y2hlc0hhY2sobm9kZU5hbWUpIHsgcmV0dXJuIHRoaXMuZGlydHkgPT0gTk9UX0RJUlRZICYmIHRoaXMuZG9tLm5vZGVOYW1lID09IG5vZGVOYW1lOyB9XG4gICAgZ2V0IGRvbUF0b20oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlnbm9yZUZvckNvb3JkcygpIHsgcmV0dXJuIHRoaXMuZG9tLm5vZGVOYW1lID09IFwiSU1HXCI7IH1cbn1cbi8vIEEgc2VwYXJhdGUgc3ViY2xhc3MgaXMgdXNlZCBmb3IgY3VzdG9taXplZCBub2RlIHZpZXdzLCBzbyB0aGF0IHRoZVxuLy8gZXh0cmEgY2hlY2tzIG9ubHkgaGF2ZSB0byBiZSBtYWRlIGZvciBub2RlcyB0aGF0IGFyZSBhY3R1YWxseVxuLy8gY3VzdG9taXplZC5cbmNsYXNzIEN1c3RvbU5vZGVWaWV3RGVzYyBleHRlbmRzIE5vZGVWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NLCBub2RlRE9NLCBzcGVjLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NLCBub2RlRE9NLCB2aWV3LCBwb3MpO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIH1cbiAgICAvLyBBIGN1c3RvbSBgdXBkYXRlYCBtZXRob2QgZ2V0cyB0byBkZWNpZGUgd2hldGhlciB0aGUgdXBkYXRlIGdvZXNcbiAgICAvLyB0aHJvdWdoLiBJZiBpdCBkb2VzLCBhbmQgdGhlcmUncyBhIGBjb250ZW50RE9NYCBub2RlLCBvdXIgbG9naWNcbiAgICAvLyB1cGRhdGVzIHRoZSBjaGlsZHJlbi5cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy51cGRhdGUpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnNwZWMudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRlbnRET00gJiYgIW5vZGUuaXNMZWFmKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICB0aGlzLnNwZWMuc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5zZWxlY3ROb2RlKCkgOiBzdXBlci5zZWxlY3ROb2RlKCk7XG4gICAgfVxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjLmRlc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5kZXNlbGVjdE5vZGUoKSA6IHN1cGVyLmRlc2VsZWN0Tm9kZSgpO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCByb290LCBmb3JjZSkge1xuICAgICAgICB0aGlzLnNwZWMuc2V0U2VsZWN0aW9uID8gdGhpcy5zcGVjLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHJvb3QpXG4gICAgICAgICAgICA6IHN1cGVyLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHJvb3QsIGZvcmNlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5zcGVjLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BlYy5zdG9wRXZlbnQgPyB0aGlzLnNwZWMuc3RvcEV2ZW50KGV2ZW50KSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uID8gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSA6IHN1cGVyLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKTtcbiAgICB9XG59XG4vLyBTeW5jIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gbm9kZSB3aXRoIHRoZSBub2RlcyBhc3NvY2lhdGVkXG4vLyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZiB2aWV3IGRlc2NzLCByZWN1cnNpbmcgaW50byBtYXJrIGRlc2NzXG4vLyBiZWNhdXNlIHRoaXMgc2hvdWxkIHN5bmMgdGhlIHN1YnRyZWUgZm9yIGEgd2hvbGUgbm9kZSBhdCBhIHRpbWUuXG5mdW5jdGlvbiByZW5kZXJEZXNjcyhwYXJlbnRET00sIGRlc2NzLCB2aWV3KSB7XG4gICAgbGV0IGRvbSA9IHBhcmVudERPTS5maXJzdENoaWxkLCB3cml0dGVuID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZGVzYyA9IGRlc2NzW2ldLCBjaGlsZERPTSA9IGRlc2MuZG9tO1xuICAgICAgICBpZiAoY2hpbGRET00ucGFyZW50Tm9kZSA9PSBwYXJlbnRET00pIHtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZERPTSAhPSBkb20pIHtcbiAgICAgICAgICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICBwYXJlbnRET00uaW5zZXJ0QmVmb3JlKGNoaWxkRE9NLCBkb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgTWFya1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gZG9tID8gZG9tLnByZXZpb3VzU2libGluZyA6IHBhcmVudERPTS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICByZW5kZXJEZXNjcyhkZXNjLmNvbnRlbnRET00sIGRlc2MuY2hpbGRyZW4sIHZpZXcpO1xuICAgICAgICAgICAgZG9tID0gcG9zID8gcG9zLm5leHRTaWJsaW5nIDogcGFyZW50RE9NLmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKGRvbSkge1xuICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICB3cml0dGVuID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHdyaXR0ZW4gJiYgdmlldy50cmFja1dyaXRlcyA9PSBwYXJlbnRET00pXG4gICAgICAgIHZpZXcudHJhY2tXcml0ZXMgPSBudWxsO1xufVxuY29uc3QgT3V0ZXJEZWNvTGV2ZWwgPSBmdW5jdGlvbiAobm9kZU5hbWUpIHtcbiAgICBpZiAobm9kZU5hbWUpXG4gICAgICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTtcbn07XG5PdXRlckRlY29MZXZlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgbm9EZWNvID0gW25ldyBPdXRlckRlY29MZXZlbF07XG5mdW5jdGlvbiBjb21wdXRlT3V0ZXJEZWNvKG91dGVyRGVjbywgbm9kZSwgbmVlZHNXcmFwKSB7XG4gICAgaWYgKG91dGVyRGVjby5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG5vRGVjbztcbiAgICBsZXQgdG9wID0gbmVlZHNXcmFwID8gbm9EZWNvWzBdIDogbmV3IE91dGVyRGVjb0xldmVsLCByZXN1bHQgPSBbdG9wXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyRGVjby5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgYXR0cnMgPSBvdXRlckRlY29baV0udHlwZS5hdHRycztcbiAgICAgICAgaWYgKCFhdHRycylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoYXR0cnMubm9kZU5hbWUpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0b3AgPSBuZXcgT3V0ZXJEZWNvTGV2ZWwoYXR0cnMubm9kZU5hbWUpKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG5lZWRzV3JhcCAmJiByZXN1bHQubGVuZ3RoID09IDEpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9wID0gbmV3IE91dGVyRGVjb0xldmVsKG5vZGUuaXNJbmxpbmUgPyBcInNwYW5cIiA6IFwiZGl2XCIpKTtcbiAgICAgICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIilcbiAgICAgICAgICAgICAgICB0b3AuY2xhc3MgPSAodG9wLmNsYXNzID8gdG9wLmNsYXNzICsgXCIgXCIgOiBcIlwiKSArIHZhbDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgIHRvcC5zdHlsZSA9ICh0b3Auc3R5bGUgPyB0b3Auc3R5bGUgKyBcIjtcIiA6IFwiXCIpICsgdmFsO1xuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBcIm5vZGVOYW1lXCIpXG4gICAgICAgICAgICAgICAgdG9wW25hbWVdID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXRjaE91dGVyRGVjbyhvdXRlckRPTSwgbm9kZURPTSwgcHJldkNvbXB1dGVkLCBjdXJDb21wdXRlZCkge1xuICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGNhc2VcbiAgICBpZiAocHJldkNvbXB1dGVkID09IG5vRGVjbyAmJiBjdXJDb21wdXRlZCA9PSBub0RlY28pXG4gICAgICAgIHJldHVybiBub2RlRE9NO1xuICAgIGxldCBjdXJET00gPSBub2RlRE9NO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyQ29tcHV0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRlY28gPSBjdXJDb21wdXRlZFtpXSwgcHJldiA9IHByZXZDb21wdXRlZFtpXTtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2Lm5vZGVOYW1lID09IGRlY28ubm9kZU5hbWUgJiYgY3VyRE9NICE9IG91dGVyRE9NICYmXG4gICAgICAgICAgICAgICAgKHBhcmVudCA9IGN1ckRPTS5wYXJlbnROb2RlKSAmJiBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBkZWNvLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkZWNvLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQucG1Jc0RlY28gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjdXJET00pO1xuICAgICAgICAgICAgICAgIHByZXYgPSBub0RlY29bMF07XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhdGNoQXR0cmlidXRlcyhjdXJET00sIHByZXYgfHwgbm9EZWNvWzBdLCBkZWNvKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1ckRPTTtcbn1cbmZ1bmN0aW9uIHBhdGNoQXR0cmlidXRlcyhkb20sIHByZXYsIGN1cikge1xuICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmICEobmFtZSBpbiBjdXIpKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGN1cilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmIGN1cltuYW1lXSAhPSBwcmV2W25hbWVdKVxuICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBjdXJbbmFtZV0pO1xuICAgIGlmIChwcmV2LmNsYXNzICE9IGN1ci5jbGFzcykge1xuICAgICAgICBsZXQgcHJldkxpc3QgPSBwcmV2LmNsYXNzID8gcHJldi5jbGFzcy5zcGxpdChcIiBcIikuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICAgIGxldCBjdXJMaXN0ID0gY3VyLmNsYXNzID8gY3VyLmNsYXNzLnNwbGl0KFwiIFwiKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2TGlzdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjdXJMaXN0LmluZGV4T2YocHJldkxpc3RbaV0pID09IC0xKVxuICAgICAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QucmVtb3ZlKHByZXZMaXN0W2ldKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJMaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHByZXZMaXN0LmluZGV4T2YoY3VyTGlzdFtpXSkgPT0gLTEpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5hZGQoY3VyTGlzdFtpXSk7XG4gICAgICAgIGlmIChkb20uY2xhc3NMaXN0Lmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIH1cbiAgICBpZiAocHJldi5zdHlsZSAhPSBjdXIuc3R5bGUpIHtcbiAgICAgICAgaWYgKHByZXYuc3R5bGUpIHtcbiAgICAgICAgICAgIGxldCBwcm9wID0gL1xccyooW1xcd1xcLVxceGExLVxcdWZmZmZdKylcXHMqOig/OlwiKD86XFxcXC58W15cIl0pKlwifCcoPzpcXFxcLnxbXiddKSonfFxcKC4qP1xcKXxbXjtdKSovZywgbTtcbiAgICAgICAgICAgIHdoaWxlIChtID0gcHJvcC5leGVjKHByZXYuc3R5bGUpKVxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShtWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLnN0eWxlKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgKz0gY3VyLnN0eWxlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5T3V0ZXJEZWNvKGRvbSwgZGVjbywgbm9kZSkge1xuICAgIHJldHVybiBwYXRjaE91dGVyRGVjbyhkb20sIGRvbSwgbm9EZWNvLCBjb21wdXRlT3V0ZXJEZWNvKGRlY28sIG5vZGUsIGRvbS5ub2RlVHlwZSAhPSAxKSk7XG59XG5mdW5jdGlvbiBzYW1lT3V0ZXJEZWNvKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS50eXBlLmVxKGJbaV0udHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybShkb20pIHtcbiAgICBsZXQgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgICBkb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20pO1xuICAgIHJldHVybiBuZXh0O1xufVxuLy8gSGVscGVyIGNsYXNzIGZvciBpbmNyZW1lbnRhbGx5IHVwZGF0aW5nIGEgdHJlZSBvZiBtYXJrIGRlc2NzIGFuZFxuLy8gdGhlIHdpZGdldCBhbmQgbm9kZSBkZXNjcyBpbnNpZGUgb2YgdGhlbS5cbmNsYXNzIFZpZXdUcmVlVXBkYXRlciB7XG4gICAgY29uc3RydWN0b3IodG9wLCBsb2NrLCB2aWV3KSB7XG4gICAgICAgIHRoaXMubG9jayA9IGxvY2s7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIC8vIEluZGV4IGludG8gYHRoaXMudG9wYCdzIGNoaWxkIGFycmF5LCByZXByZXNlbnRzIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbi5cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIC8vIFdoZW4gZW50ZXJpbmcgYSBtYXJrLCB0aGUgY3VycmVudCB0b3AgYW5kIGluZGV4IGFyZSBwdXNoZWRcbiAgICAgICAgLy8gb250byB0aGlzLlxuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8vIFRyYWNrcyB3aGV0aGVyIGFueXRoaW5nIHdhcyBjaGFuZ2VkXG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5wcmVNYXRjaCA9IHByZU1hdGNoKHRvcC5ub2RlLmNvbnRlbnQsIHRvcCk7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYW5kIHJlbW92ZSB0aGUgY2hpbGRyZW4gYmV0d2VlbiB0aGUgZ2l2ZW4gaW5kaWNlcyBpblxuICAgIC8vIGB0aGlzLnRvcGAuXG4gICAgZGVzdHJveUJldHdlZW4oc3RhcnQsIGVuZCkge1xuICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYWxsIHJlbWFpbmluZyBjaGlsZHJlbiBpbiBgdGhpcy50b3BgLlxuICAgIGRlc3Ryb3lSZXN0KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIGN1cnJlbnQgc3RhY2sgb2YgbWFyayBkZXNjcyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZlxuICAgIC8vIG1hcmtzLCByZXVzaW5nIGV4aXN0aW5nIG1hcmsgZGVzY3Mgd2hlbiBwb3NzaWJsZS5cbiAgICBzeW5jVG9NYXJrcyhtYXJrcywgaW5saW5lLCB2aWV3KSB7XG4gICAgICAgIGxldCBrZWVwID0gMCwgZGVwdGggPSB0aGlzLnN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICBsZXQgbWF4S2VlcCA9IE1hdGgubWluKGRlcHRoLCBtYXJrcy5sZW5ndGgpO1xuICAgICAgICB3aGlsZSAoa2VlcCA8IG1heEtlZXAgJiZcbiAgICAgICAgICAgIChrZWVwID09IGRlcHRoIC0gMSA/IHRoaXMudG9wIDogdGhpcy5zdGFja1soa2VlcCArIDEpIDw8IDFdKVxuICAgICAgICAgICAgICAgIC5tYXRjaGVzTWFyayhtYXJrc1trZWVwXSkgJiYgbWFya3Nba2VlcF0udHlwZS5zcGVjLnNwYW5uaW5nICE9PSBmYWxzZSlcbiAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgd2hpbGUgKGtlZXAgPCBkZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVzdCgpO1xuICAgICAgICAgICAgdGhpcy50b3AuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGRlcHRoIDwgbWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy50b3AsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IC0xO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXg7IGkgPCBNYXRoLm1pbih0aGlzLmluZGV4ICsgMywgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5tYXRjaGVzTWFyayhtYXJrc1tkZXB0aF0pICYmICF0aGlzLmlzTG9ja2VkKG5leHQuZG9tKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kID4gdGhpcy5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrRGVzYyA9IE1hcmtWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG1hcmtzW2RlcHRoXSwgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCwgMCwgbWFya0Rlc2MpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9wID0gbWFya0Rlc2M7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gZmluZCBhIG5vZGUgZGVzYyBtYXRjaGluZyB0aGUgZ2l2ZW4gZGF0YS4gU2tpcCBvdmVyIGl0IGFuZFxuICAgIC8vIHJldHVybiB0cnVlIHdoZW4gc3VjY2Vzc2Z1bC5cbiAgICBmaW5kTm9kZU1hdGNoKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSAtMSwgdGFyZ2V0RGVzYztcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMucHJlTWF0Y2guaW5kZXggJiZcbiAgICAgICAgICAgICh0YXJnZXREZXNjID0gdGhpcy5wcmVNYXRjaC5tYXRjaGVzW2luZGV4IC0gdGhpcy5wcmVNYXRjaC5pbmRleF0pLnBhcmVudCA9PSB0aGlzLnRvcCAmJlxuICAgICAgICAgICAgdGFyZ2V0RGVzYy5tYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdGhpcy50b3AuY2hpbGRyZW4uaW5kZXhPZih0YXJnZXREZXNjLCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4LCBlID0gTWF0aC5taW4odGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoLCBpICsgNSk7IGkgPCBlOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubWF0Y2hlc05vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pICYmICF0aGlzLnByZU1hdGNoLm1hdGNoZWQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdXBkYXRlTm9kZUF0KG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCwgdmlldykge1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpbmRleF07XG4gICAgICAgIGlmIChjaGlsZC5kaXJ0eSA9PSBOT0RFX0RJUlRZICYmIGNoaWxkLmRvbSA9PSBjaGlsZC5jb250ZW50RE9NKVxuICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICBpZiAoIWNoaWxkLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaW5kZXgpO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmaW5kSW5kZXhXaXRoQ2hpbGQoZG9tTm9kZSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gZG9tTm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcC5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBkb21Ob2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2MpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4OyBpIDwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvcC5jaGlsZHJlbltpXSA9PSBkZXNjKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tTm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gdXBkYXRlIHRoZSBuZXh0IG5vZGUsIGlmIGFueSwgdG8gdGhlIGdpdmVuIGRhdGEuIENoZWNrc1xuICAgIC8vIHByZS1tYXRjaGVzIHRvIGF2b2lkIG92ZXJ3cml0aW5nIG5vZGVzIHRoYXQgY291bGQgc3RpbGwgYmUgdXNlZC5cbiAgICB1cGRhdGVOZXh0Tm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgaW5kZXgsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBOb2RlVmlld0Rlc2MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlTWF0Y2ggPSB0aGlzLnByZU1hdGNoLm1hdGNoZWQuZ2V0KG5leHQpO1xuICAgICAgICAgICAgICAgIGlmIChwcmVNYXRjaCAhPSBudWxsICYmIHByZU1hdGNoICE9IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRET00gPSBuZXh0LmRvbSwgdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAvLyBDYW4ndCB1cGRhdGUgaWYgbmV4dERPTSBpcyBvciBjb250YWlucyB0aGlzLmxvY2ssIGV4Y2VwdCBpZlxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSB0ZXh0IG5vZGUgd2hvc2UgY29udGVudCBhbHJlYWR5IG1hdGNoZXMgdGhlIG5ldyB0ZXh0XG4gICAgICAgICAgICAgICAgLy8gYW5kIHdob3NlIGRlY29yYXRpb25zIG1hdGNoIHRoZSBuZXcgb25lcy5cbiAgICAgICAgICAgICAgICBsZXQgbG9ja2VkID0gdGhpcy5pc0xvY2tlZChuZXh0RE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGUuaXNUZXh0ICYmIG5leHQubm9kZSAmJiBuZXh0Lm5vZGUuaXNUZXh0ICYmIG5leHQubm9kZURPTS5ub2RlVmFsdWUgPT0gbm9kZS50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmRpcnR5ICE9IE5PREVfRElSVFkgJiYgc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIG5leHQub3V0ZXJEZWNvKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2NrZWQgJiYgbmV4dC51cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmRvbSAhPSBuZXh0RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWxvY2tlZCAmJiAodXBkYXRlZCA9IHRoaXMucmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBXaGVuIGEgbm9kZSB3aXRoIGNvbnRlbnQgaXMgcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgbm9kZSB3aXRoXG4gICAgLy8gaWRlbnRpY2FsIGNvbnRlbnQsIG1vdmUgb3ZlciBpdHMgY2hpbGRyZW4uXG4gICAgcmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgaWYgKG5leHQuZGlydHkgfHwgbm9kZS5pc0F0b20gfHwgIW5leHQuY2hpbGRyZW4ubGVuZ3RoIHx8XG4gICAgICAgICAgICAhbmV4dC5ub2RlLmNvbnRlbnQuZXEobm9kZS5jb250ZW50KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgd3JhcHBlciA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAod3JhcHBlci5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICB3cmFwcGVyLmNoaWxkcmVuID0gbmV4dC5jaGlsZHJlbjtcbiAgICAgICAgICAgIG5leHQuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIHdyYXBwZXIuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2gucGFyZW50ID0gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgICAgICBuZXh0LmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuICAgIC8vIEluc2VydCB0aGUgbm9kZSBhcyBhIG5ld2x5IGNyZWF0ZWQgbm9kZSBkZXNjLlxuICAgIGFkZE5vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgZGVzYyA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAoZGVzYy5jb250ZW50RE9NKVxuICAgICAgICAgICAgZGVzYy51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgZGVzYyk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIHBsYWNlV2lkZ2V0KHdpZGdldCwgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5pbmRleCA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCA/IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdIDogbnVsbDtcbiAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5tYXRjaGVzV2lkZ2V0KHdpZGdldCkgJiZcbiAgICAgICAgICAgICh3aWRnZXQgPT0gbmV4dC53aWRnZXQgfHwgIW5leHQud2lkZ2V0LnR5cGUudG9ET00ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gbmV3IFdpZGdldFZpZXdEZXNjKHRoaXMudG9wLCB3aWRnZXQsIHZpZXcsIHBvcyk7XG4gICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBkZXNjKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGEgdGV4dGJsb2NrIGxvb2tzIGFuZCBiZWhhdmVzIGNvcnJlY3RseSBpblxuICAgIC8vIGNvbnRlbnRFZGl0YWJsZS5cbiAgICBhZGRUZXh0YmxvY2tIYWNrcygpIHtcbiAgICAgICAgbGV0IGxhc3RDaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXggLSAxXSwgcGFyZW50ID0gdGhpcy50b3A7XG4gICAgICAgIHdoaWxlIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IGxhc3RDaGlsZDtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHBhcmVudC5jaGlsZHJlbltwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0Q2hpbGQgfHwgLy8gRW1wdHkgdGV4dGJsb2NrXG4gICAgICAgICAgICAhKGxhc3RDaGlsZCBpbnN0YW5jZW9mIFRleHRWaWV3RGVzYykgfHxcbiAgICAgICAgICAgIC9cXG4kLy50ZXN0KGxhc3RDaGlsZC5ub2RlLnRleHQpIHx8XG4gICAgICAgICAgICAodGhpcy52aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSAmJiAvXFxzJC8udGVzdChsYXN0Q2hpbGQubm9kZS50ZXh0KSkpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3MgaW4gU2FmYXJpJ3MgY3Vyc29yIGRyYXdpbmcgKCMxMTY1KSBhbmQgQ2hyb21lJ3MgbW91c2Ugc2VsZWN0aW9uICgjMTE1MilcbiAgICAgICAgICAgIGlmICgoc2FmYXJpIHx8IGNocm9tZSkgJiYgbGFzdENoaWxkICYmIGxhc3RDaGlsZC5kb20uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiSU1HXCIsIHBhcmVudCk7XG4gICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiQlJcIiwgdGhpcy50b3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEhhY2tOb2RlKG5vZGVOYW1lLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcCAmJiB0aGlzLmluZGV4IDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAmJiBwYXJlbnQuY2hpbGRyZW5bdGhpcy5pbmRleF0ubWF0Y2hlc0hhY2sobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLXNlcGFyYXRvclwiO1xuICAgICAgICAgICAgICAgIGRvbS5hbHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiQlJcIilcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci10cmFpbGluZ0JyZWFrXCI7XG4gICAgICAgICAgICBsZXQgaGFjayA9IG5ldyBUcmFpbGluZ0hhY2tWaWV3RGVzYyh0aGlzLnRvcCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMudG9wKVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKGhhY2spO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBoYWNrKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNMb2NrZWQobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NrICYmIChub2RlID09IHRoaXMubG9jayB8fCBub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5jb250YWlucyh0aGlzLmxvY2sucGFyZW50Tm9kZSkpO1xuICAgIH1cbn1cbi8vIEl0ZXJhdGUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudCBhbmQgYXJyYXkgb2YgZGVzY3MgdG8gZmluZFxuLy8gZGlyZWN0bHkgbWF0Y2hpbmcgb25lcywgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmVhZ2VybHkgcmV1c2luZyB0aG9zZVxuLy8gZm9yIG90aGVyIG5vZGVzLiBSZXR1cm5zIHRoZSBmcmFnbWVudCBpbmRleCBvZiB0aGUgZmlyc3Qgbm9kZSB0aGF0XG4vLyBpcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSBvZiBtYXRjaGVkIG5vZGVzIGF0IHRoZSBlbmQgb2YgdGhlXG4vLyBmcmFnbWVudC5cbmZ1bmN0aW9uIHByZU1hdGNoKGZyYWcsIHBhcmVudERlc2MpIHtcbiAgICBsZXQgY3VyRGVzYyA9IHBhcmVudERlc2MsIGRlc2NJID0gY3VyRGVzYy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGZJID0gZnJhZy5jaGlsZENvdW50LCBtYXRjaGVkID0gbmV3IE1hcCwgbWF0Y2hlcyA9IFtdO1xuICAgIG91dGVyOiB3aGlsZSAoZkkgPiAwKSB7XG4gICAgICAgIGxldCBkZXNjO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoZGVzY0kpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGN1ckRlc2MuY2hpbGRyZW5bZGVzY0kgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIE1hcmtWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjdXJEZXNjID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgZGVzY0kgPSBuZXh0LmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICBkZXNjSS0tO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJEZXNjID09IHBhcmVudERlc2MpIHtcbiAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FXG4gICAgICAgICAgICAgICAgZGVzY0kgPSBjdXJEZXNjLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGN1ckRlc2MpO1xuICAgICAgICAgICAgICAgIGN1ckRlc2MgPSBjdXJEZXNjLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IGRlc2Mubm9kZTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChub2RlICE9IGZyYWcuY2hpbGQoZkkgLSAxKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAtLWZJO1xuICAgICAgICBtYXRjaGVkLnNldChkZXNjLCBmSSk7XG4gICAgICAgIG1hdGNoZXMucHVzaChkZXNjKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5kZXg6IGZJLCBtYXRjaGVkLCBtYXRjaGVzOiBtYXRjaGVzLnJldmVyc2UoKSB9O1xufVxuZnVuY3Rpb24gY29tcGFyZVNpZGUoYSwgYikge1xuICAgIHJldHVybiBhLnR5cGUuc2lkZSAtIGIudHlwZS5zaWRlO1xufVxuLy8gVGhpcyBmdW5jdGlvbiBhYnN0cmFjdHMgaXRlcmF0aW5nIG92ZXIgdGhlIG5vZGVzIGFuZCBkZWNvcmF0aW9ucyBpblxuLy8gYSBmcmFnbWVudC4gQ2FsbHMgYG9uTm9kZWAgZm9yIGVhY2ggbm9kZSwgd2l0aCBpdHMgbG9jYWwgYW5kIGNoaWxkXG4vLyBkZWNvcmF0aW9ucy4gU3BsaXRzIHRleHQgbm9kZXMgd2hlbiB0aGVyZSBpcyBhIGRlY29yYXRpb24gc3RhcnRpbmdcbi8vIG9yIGVuZGluZyBpbnNpZGUgb2YgdGhlbS4gQ2FsbHMgYG9uV2lkZ2V0YCBmb3IgZWFjaCB3aWRnZXQuXG5mdW5jdGlvbiBpdGVyRGVjbyhwYXJlbnQsIGRlY28sIG9uV2lkZ2V0LCBvbk5vZGUpIHtcbiAgICBsZXQgbG9jYWxzID0gZGVjby5sb2NhbHMocGFyZW50KSwgb2Zmc2V0ID0gMDtcbiAgICAvLyBTaW1wbGUsIGNoZWFwIHZhcmlhbnQgZm9yIHdoZW4gdGhlcmUgYXJlIG5vIGxvY2FsIGRlY29yYXRpb25zXG4gICAgaWYgKGxvY2Fscy5sZW5ndGggPT0gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHBhcmVudC5jaGlsZChpKTtcbiAgICAgICAgICAgIG9uTm9kZShjaGlsZCwgbG9jYWxzLCBkZWNvLmZvckNoaWxkKG9mZnNldCwgY2hpbGQpLCBpKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkZWNvSW5kZXggPSAwLCBhY3RpdmUgPSBbXSwgcmVzdE5vZGUgPSBudWxsO1xuICAgIGZvciAobGV0IHBhcmVudEluZGV4ID0gMDs7KSB7XG4gICAgICAgIGxldCB3aWRnZXQsIHdpZGdldHM7XG4gICAgICAgIHdoaWxlIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLnRvID09IG9mZnNldCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBsb2NhbHNbZGVjb0luZGV4KytdO1xuICAgICAgICAgICAgaWYgKG5leHQud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3aWRnZXQpXG4gICAgICAgICAgICAgICAgICAgIHdpZGdldCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAod2lkZ2V0cyB8fCAod2lkZ2V0cyA9IFt3aWRnZXRdKSkucHVzaChuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkZ2V0KSB7XG4gICAgICAgICAgICBpZiAod2lkZ2V0cykge1xuICAgICAgICAgICAgICAgIHdpZGdldHMuc29ydChjb21wYXJlU2lkZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWRnZXRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXRzW2ldLCBwYXJlbnRJbmRleCwgISFyZXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXQsIHBhcmVudEluZGV4LCAhIXJlc3ROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hpbGQsIGluZGV4O1xuICAgICAgICBpZiAocmVzdE5vZGUpIHtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjaGlsZCA9IHJlc3ROb2RlO1xuICAgICAgICAgICAgcmVzdE5vZGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudEluZGV4IDwgcGFyZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgICAgICAgICBjaGlsZCA9IHBhcmVudC5jaGlsZChwYXJlbnRJbmRleCsrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGFjdGl2ZVtpXS50byA8PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgYWN0aXZlLnNwbGljZShpLS0sIDEpO1xuICAgICAgICB3aGlsZSAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS5mcm9tIDw9IG9mZnNldCAmJiBsb2NhbHNbZGVjb0luZGV4XS50byA+IG9mZnNldClcbiAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGxvY2Fsc1tkZWNvSW5kZXgrK10pO1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgIGlmIChjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgICAgIGxldCBjdXRBdCA9IGVuZDtcbiAgICAgICAgICAgIGlmIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLmZyb20gPCBjdXRBdClcbiAgICAgICAgICAgICAgICBjdXRBdCA9IGxvY2Fsc1tkZWNvSW5kZXhdLmZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlW2ldLnRvIDwgY3V0QXQpXG4gICAgICAgICAgICAgICAgICAgIGN1dEF0ID0gYWN0aXZlW2ldLnRvO1xuICAgICAgICAgICAgaWYgKGN1dEF0IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdE5vZGUgPSBjaGlsZC5jdXQoY3V0QXQgLSBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KDAsIGN1dEF0IC0gb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBlbmQgPSBjdXRBdDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRlckRlY28gPSBjaGlsZC5pc0lubGluZSAmJiAhY2hpbGQuaXNMZWFmID8gYWN0aXZlLmZpbHRlcihkID0+ICFkLmlubGluZSkgOiBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgb25Ob2RlKGNoaWxkLCBvdXRlckRlY28sIGRlY28uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCksIGluZGV4KTtcbiAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgIH1cbn1cbi8vIExpc3QgbWFya2VycyBpbiBNb2JpbGUgU2FmYXJpIHdpbGwgbXlzdGVyaW91c2x5IGRpc2FwcGVhclxuLy8gc29tZXRpbWVzLiBUaGlzIHdvcmtzIGFyb3VuZCB0aGF0LlxuZnVuY3Rpb24gaW9zSGFja3MoZG9tKSB7XG4gICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIlVMXCIgfHwgZG9tLm5vZGVOYW1lID09IFwiT0xcIikge1xuICAgICAgICBsZXQgb2xkQ1NTID0gZG9tLnN0eWxlLmNzc1RleHQ7XG4gICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gb2xkQ1NTICsgXCI7IGxpc3Qtc3R5bGU6IHNxdWFyZSAhaW1wb3J0YW50XCI7XG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbSkubGlzdFN0eWxlO1xuICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IG9sZENTUztcbiAgICB9XG59XG5mdW5jdGlvbiBuZWFyYnlUZXh0Tm9kZShub2RlLCBvZmZzZXQpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IG9mZnNldCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICBvZmZzZXQgPSBub2RlU2l6ZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gRmluZCBhIHBpZWNlIG9mIHRleHQgaW4gYW4gaW5saW5lIGZyYWdtZW50LCBvdmVybGFwcGluZyBmcm9tLXRvXG5mdW5jdGlvbiBmaW5kVGV4dEluRnJhZ21lbnQoZnJhZywgdGV4dCwgZnJvbSwgdG8pIHtcbiAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IGZyYWcuY2hpbGRDb3VudCAmJiBwb3MgPD0gdG87KSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGZyYWcuY2hpbGQoaSsrKSwgY2hpbGRTdGFydCA9IHBvcztcbiAgICAgICAgcG9zICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICBpZiAoIWNoaWxkLmlzVGV4dClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc3RyID0gY2hpbGQudGV4dDtcbiAgICAgICAgd2hpbGUgKGkgPCBmcmFnLmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZnJhZy5jaGlsZChpKyspO1xuICAgICAgICAgICAgcG9zICs9IG5leHQubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoIW5leHQuaXNUZXh0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgc3RyICs9IG5leHQudGV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID49IGZyb20pIHtcbiAgICAgICAgICAgIGlmIChwb3MgPj0gdG8gJiYgc3RyLnNsaWNlKHRvIC0gdGV4dC5sZW5ndGggLSBjaGlsZFN0YXJ0LCB0byAtIGNoaWxkU3RhcnQpID09IHRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvIC0gdGV4dC5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBjaGlsZFN0YXJ0IDwgdG8gPyBzdHIubGFzdEluZGV4T2YodGV4dCwgdG8gLSBjaGlsZFN0YXJ0IC0gMSkgOiAtMTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA+PSAwICYmIGZvdW5kICsgdGV4dC5sZW5ndGggKyBjaGlsZFN0YXJ0ID49IGZyb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkU3RhcnQgKyBmb3VuZDtcbiAgICAgICAgICAgIGlmIChmcm9tID09IHRvICYmIHN0ci5sZW5ndGggPj0gKHRvICsgdGV4dC5sZW5ndGgpIC0gY2hpbGRTdGFydCAmJlxuICAgICAgICAgICAgICAgIHN0ci5zbGljZSh0byAtIGNoaWxkU3RhcnQsIHRvIC0gY2hpbGRTdGFydCArIHRleHQubGVuZ3RoKSA9PSB0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0bztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4vLyBSZXBsYWNlIHJhbmdlIGZyb20tdG8gaW4gYW4gYXJyYXkgb2YgdmlldyBkZXNjcyB3aXRoIHJlcGxhY2VtZW50XG4vLyAobWF5IGJlIG51bGwgdG8ganVzdCBkZWxldGUpLiBUaGlzIGdvZXMgdmVyeSBtdWNoIGFnYWluc3QgdGhlIGdyYWluXG4vLyBvZiB0aGUgcmVzdCBvZiB0aGlzIGNvZGUsIHdoaWNoIHRlbmRzIHRvIGNyZWF0ZSBub2RlcyB3aXRoIHRoZVxuLy8gcmlnaHQgc2hhcGUgaW4gb25lIGdvLCByYXRoZXIgdGhhbiBtZXNzaW5nIHdpdGggdGhlbSBhZnRlclxuLy8gY3JlYXRpb24sIGJ1dCBpcyBuZWNlc3NhcnkgaW4gdGhlIGNvbXBvc2l0aW9uIGhhY2suXG5mdW5jdGlvbiByZXBsYWNlTm9kZXMobm9kZXMsIGZyb20sIHRvLCB2aWV3LCByZXBsYWNlbWVudCkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IG5vZGVzW2ldLCBzdGFydCA9IG9mZiwgZW5kID0gb2ZmICs9IGNoaWxkLnNpemU7XG4gICAgICAgIGlmIChzdGFydCA+PSB0byB8fCBlbmQgPD0gZnJvbSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZC5zbGljZSgwLCBmcm9tIC0gc3RhcnQsIHZpZXcpKTtcbiAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZC5zbGljZSh0byAtIHN0YXJ0LCBjaGlsZC5zaXplLCB2aWV3KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uRnJvbURPTSh2aWV3LCBvcmlnaW4gPSBudWxsKSB7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSwgZG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgaWYgKCFkb21TZWwuZm9jdXNOb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgbmVhcmVzdERlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZG9tU2VsLmZvY3VzTm9kZSksIGluV2lkZ2V0ID0gbmVhcmVzdERlc2MgJiYgbmVhcmVzdERlc2Muc2l6ZSA9PSAwO1xuICAgIGxldCBoZWFkID0gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0LCAxKTtcbiAgICBpZiAoaGVhZCA8IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCAkaGVhZCA9IGRvYy5yZXNvbHZlKGhlYWQpLCAkYW5jaG9yLCBzZWxlY3Rpb247XG4gICAgaWYgKHNlbGVjdGlvbkNvbGxhcHNlZChkb21TZWwpKSB7XG4gICAgICAgICRhbmNob3IgPSAkaGVhZDtcbiAgICAgICAgd2hpbGUgKG5lYXJlc3REZXNjICYmICFuZWFyZXN0RGVzYy5ub2RlKVxuICAgICAgICAgICAgbmVhcmVzdERlc2MgPSBuZWFyZXN0RGVzYy5wYXJlbnQ7XG4gICAgICAgIGxldCBuZWFyZXN0RGVzY05vZGUgPSBuZWFyZXN0RGVzYy5ub2RlO1xuICAgICAgICBpZiAobmVhcmVzdERlc2MgJiYgbmVhcmVzdERlc2NOb2RlLmlzQXRvbSAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShuZWFyZXN0RGVzY05vZGUpICYmIG5lYXJlc3REZXNjLnBhcmVudFxuICAgICAgICAgICAgJiYgIShuZWFyZXN0RGVzY05vZGUuaXNJbmxpbmUgJiYgaXNPbkVkZ2UoZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0LCBuZWFyZXN0RGVzYy5kb20pKSkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IG5lYXJlc3REZXNjLnBvc0JlZm9yZTtcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IG5ldyBOb2RlU2VsZWN0aW9uKGhlYWQgPT0gcG9zID8gJGhlYWQgOiBkb2MucmVzb2x2ZShwb3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGFuY2hvciA9IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0LCAxKTtcbiAgICAgICAgaWYgKGFuY2hvciA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgJGFuY2hvciA9IGRvYy5yZXNvbHZlKGFuY2hvcik7XG4gICAgfVxuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBiaWFzID0gb3JpZ2luID09IFwicG9pbnRlclwiIHx8ICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5oZWFkIDwgJGhlYWQucG9zICYmICFpbldpZGdldCkgPyAxIDogLTE7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbkJldHdlZW4odmlldywgJGFuY2hvciwgJGhlYWQsIGJpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uO1xufVxuZnVuY3Rpb24gZWRpdG9yT3duc1NlbGVjdGlvbih2aWV3KSB7XG4gICAgcmV0dXJuIHZpZXcuZWRpdGFibGUgPyB2aWV3Lmhhc0ZvY3VzKCkgOlxuICAgICAgICBoYXNTZWxlY3Rpb24odmlldykgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNvbnRhaW5zKHZpZXcuZG9tKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvRE9NKHZpZXcsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgc3luY05vZGVTZWxlY3Rpb24odmlldywgc2VsKTtcbiAgICBpZiAoIWVkaXRvck93bnNTZWxlY3Rpb24odmlldykpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBUaGUgZGVsYXllZCBkcmFnIHNlbGVjdGlvbiBjYXVzZXMgaXNzdWVzIHdpdGggQ2VsbCBTZWxlY3Rpb25zXG4gICAgLy8gaW4gU2FmYXJpLiBBbmQgdGhlIGRyYWcgc2VsZWN0aW9uIGRlbGF5IGlzIHRvIHdvcmthcm9uZCBpc3N1ZXNcbiAgICAvLyB3aGljaCBvbmx5IHByZXNlbnQgaW4gQ2hyb21lLlxuICAgIGlmICghZm9yY2UgJiYgdmlldy5pbnB1dC5tb3VzZURvd24gJiYgdmlldy5pbnB1dC5tb3VzZURvd24uYWxsb3dEZWZhdWx0ICYmIGNocm9tZSkge1xuICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpLCBjdXJTZWwgPSB2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgIGlmIChkb21TZWwuYW5jaG9yTm9kZSAmJiBjdXJTZWwuYW5jaG9yTm9kZSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQsIGN1clNlbC5hbmNob3JOb2RlLCBjdXJTZWwuYW5jaG9yT2Zmc2V0KSkge1xuICAgICAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24uZGVsYXllZFNlbGVjdGlvblN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLmRpc2Nvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICBpZiAodmlldy5jdXJzb3JXcmFwcGVyKSB7XG4gICAgICAgIHNlbGVjdEN1cnNvcldyYXBwZXIodmlldyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBhbmNob3IsIGhlYWQgfSA9IHNlbCwgcmVzZXRFZGl0YWJsZUZyb20sIHJlc2V0RWRpdGFibGVUbztcbiAgICAgICAgaWYgKGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlICYmICEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmICghc2VsLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGVGcm9tID0gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgc2VsLmZyb20pO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkgJiYgIXNlbC4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlVG8gPSB0ZW1wb3JhcmlseUVkaXRhYmxlTmVhcih2aWV3LCBzZWwudG8pO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcuZG9jVmlldy5zZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LnJvb3QsIGZvcmNlKTtcbiAgICAgICAgaWYgKGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAocmVzZXRFZGl0YWJsZUZyb20pXG4gICAgICAgICAgICAgICAgcmVzZXRFZGl0YWJsZShyZXNldEVkaXRhYmxlRnJvbSk7XG4gICAgICAgICAgICBpZiAocmVzZXRFZGl0YWJsZVRvKVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGUocmVzZXRFZGl0YWJsZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsLnZpc2libGUpIHtcbiAgICAgICAgICAgIHZpZXcuZG9tLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb25cIik7XG4gICAgICAgICAgICBpZiAoXCJvbnNlbGVjdGlvbmNoYW5nZVwiIGluIGRvY3VtZW50KVxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzT25TZWxlY3Rpb25DaGFuZ2Uodmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICB2aWV3LmRvbU9ic2VydmVyLmNvbm5lY3RTZWxlY3Rpb24oKTtcbn1cbi8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCBXZWJraXQgbm90IGFsbG93aW5nIGEgc2VsZWN0aW9uIHRvIHN0YXJ0L2VuZFxuLy8gYmV0d2VlbiBub24tZWRpdGFibGUgYmxvY2sgbm9kZXMuIFdlIGJyaWVmbHkgbWFrZSBzb21ldGhpbmdcbi8vIGVkaXRhYmxlLCBzZXQgdGhlIHNlbGVjdGlvbiwgdGhlbiBzZXQgaXQgdW5lZGl0YWJsZSBhZ2Fpbi5cbmNvbnN0IGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlID0gc2FmYXJpIHx8IGNocm9tZSAmJiBjaHJvbWVfdmVyc2lvbiA8IDYzO1xuZnVuY3Rpb24gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgcG9zKSB7XG4gICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSB2aWV3LmRvY1ZpZXcuZG9tRnJvbVBvcyhwb3MsIDApO1xuICAgIGxldCBhZnRlciA9IG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPyBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XSA6IG51bGw7XG4gICAgbGV0IGJlZm9yZSA9IG9mZnNldCA/IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXSA6IG51bGw7XG4gICAgaWYgKHNhZmFyaSAmJiBhZnRlciAmJiBhZnRlci5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICByZXR1cm4gc2V0RWRpdGFibGUoYWZ0ZXIpO1xuICAgIGlmICgoIWFmdGVyIHx8IGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpICYmXG4gICAgICAgICghYmVmb3JlIHx8IGJlZm9yZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSkge1xuICAgICAgICBpZiAoYWZ0ZXIpXG4gICAgICAgICAgICByZXR1cm4gc2V0RWRpdGFibGUoYWZ0ZXIpO1xuICAgICAgICBlbHNlIGlmIChiZWZvcmUpXG4gICAgICAgICAgICByZXR1cm4gc2V0RWRpdGFibGUoYmVmb3JlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRFZGl0YWJsZShlbGVtZW50KSB7XG4gICAgZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICBpZiAoc2FmYXJpICYmIGVsZW1lbnQuZHJhZ2dhYmxlKSB7XG4gICAgICAgIGVsZW1lbnQuZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICAgIGVsZW1lbnQud2FzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5mdW5jdGlvbiByZXNldEVkaXRhYmxlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICBpZiAoZWxlbWVudC53YXNEcmFnZ2FibGUpIHtcbiAgICAgICAgZWxlbWVudC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICBlbGVtZW50Lndhc0RyYWdnYWJsZSA9IG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3NPblNlbGVjdGlvbkNoYW5nZSh2aWV3KSB7XG4gICAgbGV0IGRvYyA9IHZpZXcuZG9tLm93bmVyRG9jdW1lbnQ7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdmlldy5pbnB1dC5oaWRlU2VsZWN0aW9uR3VhcmQpO1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgbGV0IG5vZGUgPSBkb21TZWwuYW5jaG9yTm9kZSwgb2Zmc2V0ID0gZG9tU2VsLmFuY2hvck9mZnNldDtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB2aWV3LmlucHV0LmhpZGVTZWxlY3Rpb25HdWFyZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGRvbVNlbC5hbmNob3JOb2RlICE9IG5vZGUgfHwgZG9tU2VsLmFuY2hvck9mZnNldCAhPSBvZmZzZXQpIHtcbiAgICAgICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHZpZXcuaW5wdXQuaGlkZVNlbGVjdGlvbkd1YXJkKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZWRpdG9yT3duc1NlbGVjdGlvbih2aWV3KSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbi52aXNpYmxlKVxuICAgICAgICAgICAgICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvblwiKTtcbiAgICAgICAgICAgIH0sIDIwKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gc2VsZWN0Q3Vyc29yV3JhcHBlcih2aWV3KSB7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uKCksIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHZpZXcuY3Vyc29yV3JhcHBlci5kb20sIGltZyA9IG5vZGUubm9kZU5hbWUgPT0gXCJJTUdcIjtcbiAgICBpZiAoaW1nKVxuICAgICAgICByYW5nZS5zZXRFbmQobm9kZS5wYXJlbnROb2RlLCBkb21JbmRleChub2RlKSArIDEpO1xuICAgIGVsc2VcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIDApO1xuICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICBkb21TZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgZG9tU2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAvLyBLbHVkZ2UgdG8ga2lsbCAnY29udHJvbCBzZWxlY3Rpb24nIGluIElFMTEgd2hlbiBzZWxlY3RpbmcgYW5cbiAgICAvLyBpbnZpc2libGUgY3Vyc29yIHdyYXBwZXIsIHNpbmNlIHRoYXQgd291bGQgcmVzdWx0IGluIHRob3NlIHdlaXJkXG4gICAgLy8gcmVzaXplIGhhbmRsZXMgYW5kIGEgc2VsZWN0aW9uIHRoYXQgY29uc2lkZXJzIHRoZSBhYnNvbHV0ZWx5XG4gICAgLy8gcG9zaXRpb25lZCB3cmFwcGVyLCByYXRoZXIgdGhhbiB0aGUgcm9vdCBlZGl0YWJsZSBub2RlLCB0aGVcbiAgICAvLyBmb2N1c2VkIGVsZW1lbnQuXG4gICAgaWYgKCFpbWcgJiYgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUgJiYgaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSkge1xuICAgICAgICBub2RlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgbm9kZS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN5bmNOb2RlU2VsZWN0aW9uKHZpZXcsIHNlbCkge1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3LmRlc2NBdChzZWwuZnJvbSk7XG4gICAgICAgIGlmIChkZXNjICE9IHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICAgICAgICAgIGlmIChkZXNjKVxuICAgICAgICAgICAgICAgIGRlc2Muc2VsZWN0Tm9kZSgpO1xuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IGRlc2M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICB9XG59XG4vLyBDbGVhciBhbGwgRE9NIHN0YXRlZnVsbmVzcyBvZiB0aGUgbGFzdCBub2RlIHNlbGVjdGlvbi5cbmZ1bmN0aW9uIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MucGFyZW50KVxuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYy5kZXNlbGVjdE5vZGUoKTtcbiAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRhbmNob3IsICRoZWFkLCBiaWFzKSB7XG4gICAgcmV0dXJuIHZpZXcuc29tZVByb3AoXCJjcmVhdGVTZWxlY3Rpb25CZXR3ZWVuXCIsIGYgPT4gZih2aWV3LCAkYW5jaG9yLCAkaGVhZCkpXG4gICAgICAgIHx8IFRleHRTZWxlY3Rpb24uYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcyk7XG59XG5mdW5jdGlvbiBoYXNGb2N1c0FuZFNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcuZWRpdGFibGUgJiYgIXZpZXcuaGFzRm9jdXMoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBoYXNTZWxlY3Rpb24odmlldyk7XG59XG5mdW5jdGlvbiBoYXNTZWxlY3Rpb24odmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFzZWwuYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gdmlldy5kb20uY29udGFpbnMoc2VsLmFuY2hvck5vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5hbmNob3JOb2RlLnBhcmVudE5vZGUgOiBzZWwuYW5jaG9yTm9kZSkgJiZcbiAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8IHZpZXcuZG9tLmNvbnRhaW5zKHNlbC5mb2N1c05vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5mb2N1c05vZGUucGFyZW50Tm9kZSA6IHNlbC5mb2N1c05vZGUpKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFuY2hvckluUmlnaHRQbGFjZSh2aWV3KSB7XG4gICAgbGV0IGFuY2hvckRPTSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvciwgMCk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICByZXR1cm4gaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gbW92ZVNlbGVjdGlvbkJsb2NrKHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgeyAkYW5jaG9yLCAkaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCAkc2lkZSA9IGRpciA+IDAgPyAkYW5jaG9yLm1heCgkaGVhZCkgOiAkYW5jaG9yLm1pbigkaGVhZCk7XG4gICAgbGV0ICRzdGFydCA9ICEkc2lkZS5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRzaWRlIDogJHNpZGUuZGVwdGggPyBzdGF0ZS5kb2MucmVzb2x2ZShkaXIgPiAwID8gJHNpZGUuYWZ0ZXIoKSA6ICRzaWRlLmJlZm9yZSgpKSA6IG51bGw7XG4gICAgcmV0dXJuICRzdGFydCAmJiBTZWxlY3Rpb24uZmluZEZyb20oJHN0YXJ0LCBkaXIpO1xufVxuZnVuY3Rpb24gYXBwbHkodmlldywgc2VsKSB7XG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gc2VsZWN0SG9yaXpvbnRhbGx5KHZpZXcsIGRpciwgbW9kcykge1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikge1xuICAgICAgICBpZiAobW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgeyAkaGVhZCB9ID0gc2VsLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlcjtcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dCB8fCAhbm9kZS5pc0xlYWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0ICRuZXdIZWFkID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSgkaGVhZC5wb3MgKyBub2RlLm5vZGVTaXplICogKGRpciA8IDAgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihzZWwuJGFuY2hvciwgJG5ld0hlYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghc2VsLmVtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayh2aWV3LnN0YXRlLCBkaXIpO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShtYWMgJiYgbW9kcy5pbmRleE9mKFwibVwiKSA+IC0xKSkge1xuICAgICAgICAgICAgbGV0ICRoZWFkID0gc2VsLiRoZWFkLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlciwgZGVzYztcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbm9kZVBvcyA9IGRpciA8IDAgPyAkaGVhZC5wb3MgLSBub2RlLm5vZGVTaXplIDogJGhlYWQucG9zO1xuICAgICAgICAgICAgaWYgKCEobm9kZS5pc0F0b20gfHwgKGRlc2MgPSB2aWV3LmRvY1ZpZXcuZGVzY0F0KG5vZGVQb3MpKSAmJiAhZGVzYy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IE5vZGVTZWxlY3Rpb24oZGlyIDwgMCA/IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoJGhlYWQucG9zIC0gbm9kZS5ub2RlU2l6ZSkgOiAkaGVhZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2Via2l0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIGFuZCBTYWZhcmkgd2lsbCBpbnRyb2R1Y2UgZXh0cmEgcG9pbnRsZXNzIGN1cnNvclxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9ucyBhcm91bmQgaW5saW5lIHVuZWRpdGFibGUgbm9kZXMsIHNvIHdlIGhhdmUgdG9cbiAgICAgICAgICAgICAgICAvLyB0YWtlIG92ZXIgYW5kIG1vdmUgdGhlIGN1cnNvciBwYXN0IHRoZW0gKCM5MzcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5ldyBUZXh0U2VsZWN0aW9uKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZGlyIDwgMCA/IG5vZGVQb3MgOiBub2RlUG9zICsgbm9kZS5ub2RlU2l6ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbC5ub2RlLmlzSW5saW5lKSB7XG4gICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihkaXIgPiAwID8gc2VsLiR0byA6IHNlbC4kZnJvbSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBub2RlTGVuKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGlzSWdub3JhYmxlKGRvbSwgZGlyKSB7XG4gICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICByZXR1cm4gZGVzYyAmJiBkZXNjLnNpemUgPT0gMCAmJiAoZGlyIDwgMCB8fCBkb20ubmV4dFNpYmxpbmcgfHwgZG9tLm5vZGVOYW1lICE9IFwiQlJcIik7XG59XG5mdW5jdGlvbiBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcikge1xuICAgIHJldHVybiBkaXIgPCAwID8gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSA6IHNraXBJZ25vcmVkTm9kZXNBZnRlcih2aWV3KTtcbn1cbi8vIE1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzbid0IGRpcmVjdGx5IGFmdGVyIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLCB3aGljaCB3aWxsIGNvbmZ1c2UgdGhlIGJyb3dzZXIncyBjdXJzb3IgbW90aW9uIGxvZ2ljLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHNlbC5mb2N1c05vZGUsIG9mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbW92ZU5vZGUsIG1vdmVPZmZzZXQsIGZvcmNlID0gZmFsc2U7XG4gICAgLy8gR2Vja28gd2lsbCBkbyBvZGQgdGhpbmdzIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBkaXJlY3RseSBpbiBmcm9udFxuICAgIC8vIG9mIGEgbm9uLWVkaXRhYmxlIG5vZGUsIHNvIGluIHRoYXQgY2FzZSwgbW92ZSBpdCBpbnRvIHRoZSBuZXh0XG4gICAgLy8gbm9kZSBpZiBwb3NzaWJsZS4gSXNzdWUgcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3IjODMyLlxuICAgIGlmIChnZWNrbyAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZUxlbihub2RlKSAmJiBpc0lnbm9yYWJsZShub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XSwgLTEpKVxuICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmFibGUoYmVmb3JlLCAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0ID0gLS1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Jsb2NrTm9kZShub2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHByZXYgJiYgaXNJZ25vcmFibGUocHJldiwgLTEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KHByZXYpO1xuICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJldikge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlTGVuKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JjZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbm9kZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChtb3ZlTm9kZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbW92ZU5vZGUsIG1vdmVPZmZzZXQpO1xufVxuLy8gTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXNuJ3QgZGlyZWN0bHkgYmVmb3JlIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0FmdGVyKHZpZXcpIHtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBsZW4gPSBub2RlTGVuKG5vZGUpO1xuICAgIGxldCBtb3ZlTm9kZSwgbW92ZU9mZnNldDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChvZmZzZXQgPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChpc0lnbm9yYWJsZShhZnRlciwgMSkpIHtcbiAgICAgICAgICAgICAgICBtb3ZlTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9ICsrb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQmxvY2tOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIGlzSWdub3JhYmxlKG5leHQsIDEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBuZXh0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KG5leHQpICsgMTtcbiAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGxlbiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGVMZW4obm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vdmVOb2RlKVxuICAgICAgICBzZXRTZWxGb2N1cyh2aWV3LCBtb3ZlTm9kZSwgbW92ZU9mZnNldCk7XG59XG5mdW5jdGlvbiBpc0Jsb2NrTm9kZShkb20pIHtcbiAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgIHJldHVybiBkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jaztcbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIobm9kZSwgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKG5vZGUgJiYgb2Zmc2V0ID09IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYgIWhhc0Jsb2NrRGVzYyhub2RlKSkge1xuICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKSArIDE7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUJlZm9yZShub2RlLCBvZmZzZXQpIHtcbiAgICB3aGlsZSAobm9kZSAmJiAhb2Zmc2V0ICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCkge1xuICAgICAgICBsZXQgbmV4dCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRTZWxGb2N1cyh2aWV3LCBub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgICAgICBpZiAoYWZ0ZXIgPSB0ZXh0Tm9kZUFmdGVyKG5vZGUsIG9mZnNldCkpIHtcbiAgICAgICAgICAgIG5vZGUgPSBhZnRlcjtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmVmb3JlID0gdGV4dE5vZGVCZWZvcmUobm9kZSwgb2Zmc2V0KSkge1xuICAgICAgICAgICAgbm9kZSA9IGJlZm9yZTtcbiAgICAgICAgICAgIG9mZnNldCA9IGJlZm9yZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpO1xuICAgIGlmIChzZWxlY3Rpb25Db2xsYXBzZWQoc2VsKSkge1xuICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZXRFbmQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWwuZXh0ZW5kKSB7XG4gICAgICAgIHNlbC5leHRlbmQobm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICBsZXQgeyBzdGF0ZSB9ID0gdmlldztcbiAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgZW5kcyB1cCBoYXBwZW5pbmcsIHJlc2V0IHRoZSBzZWxlY3Rpb24uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlID09IHN0YXRlKVxuICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgfSwgNTApO1xufVxuZnVuY3Rpb24gZmluZERpcmVjdGlvbih2aWV3LCBwb3MpIHtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIShjaHJvbWUgfHwgd2luZG93cykgJiYgJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgY29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICBpZiAocG9zID4gJHBvcy5zdGFydCgpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdmlldy5jb29yZHNBdFBvcyhwb3MgLSAxKTtcbiAgICAgICAgICAgIGxldCBtaWQgPSAoYmVmb3JlLnRvcCArIGJlZm9yZS5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgIGlmIChtaWQgPiBjb29yZHMudG9wICYmIG1pZCA8IGNvb3Jkcy5ib3R0b20gJiYgTWF0aC5hYnMoYmVmb3JlLmxlZnQgLSBjb29yZHMubGVmdCkgPiAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUubGVmdCA8IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA8ICRwb3MuZW5kKCkpIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IHZpZXcuY29vcmRzQXRQb3MocG9zICsgMSk7XG4gICAgICAgICAgICBsZXQgbWlkID0gKGFmdGVyLnRvcCArIGFmdGVyLmJvdHRvbSkgLyAyO1xuICAgICAgICAgICAgaWYgKG1pZCA+IGNvb3Jkcy50b3AgJiYgbWlkIDwgY29vcmRzLmJvdHRvbSAmJiBNYXRoLmFicyhhZnRlci5sZWZ0IC0gY29vcmRzLmxlZnQpID4gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbXB1dGVkID0gZ2V0Q29tcHV0ZWRTdHlsZSh2aWV3LmRvbSkuZGlyZWN0aW9uO1xuICAgIHJldHVybiBjb21wdXRlZCA9PSBcInJ0bFwiID8gXCJydGxcIiA6IFwibHRyXCI7XG59XG4vLyBDaGVjayB3aGV0aGVyIHZlcnRpY2FsIHNlbGVjdGlvbiBtb3Rpb24gd291bGQgaW52b2x2ZSBub2RlXG4vLyBzZWxlY3Rpb25zLiBJZiBzbywgYXBwbHkgaXQgKGlmIG5vdCwgdGhlIHJlc3VsdCBpcyBsZWZ0IHRvIHRoZVxuLy8gYnJvd3NlcilcbmZ1bmN0aW9uIHNlbGVjdFZlcnRpY2FsbHkodmlldywgZGlyLCBtb2RzKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFzZWwuZW1wdHkgfHwgbW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hYyAmJiBtb2RzLmluZGV4T2YoXCJtXCIpID4gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB2aWV3LmVuZE9mVGV4dGJsb2NrKGRpciA8IDAgPyBcInVwXCIgOiBcImRvd25cIikpIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXh0KTtcbiAgICB9XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgc2lkZSA9IGRpciA8IDAgPyAkZnJvbSA6ICR0bztcbiAgICAgICAgbGV0IGJleW9uZCA9IHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiA/IFNlbGVjdGlvbi5uZWFyKHNpZGUsIGRpcikgOiBTZWxlY3Rpb24uZmluZEZyb20oc2lkZSwgZGlyKTtcbiAgICAgICAgcmV0dXJuIGJleW9uZCA/IGFwcGx5KHZpZXcsIGJleW9uZCkgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgZGlyKSB7XG4gICAgaWYgKCEodmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHsgJGhlYWQsICRhbmNob3IsIGVtcHR5IH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgbmV4dE5vZGUgPSAhJGhlYWQudGV4dE9mZnNldCAmJiAoZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXIpO1xuICAgIGlmIChuZXh0Tm9kZSAmJiAhbmV4dE5vZGUuaXNUZXh0KSB7XG4gICAgICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHI7XG4gICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgdHIuZGVsZXRlKCRoZWFkLnBvcyAtIG5leHROb2RlLm5vZGVTaXplLCAkaGVhZC5wb3MpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ci5kZWxldGUoJGhlYWQucG9zLCAkaGVhZC5wb3MgKyBuZXh0Tm9kZS5ub2RlU2l6ZSk7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3dpdGNoRWRpdGFibGUodmlldywgbm9kZSwgc3RhdGUpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBub2RlLmNvbnRlbnRFZGl0YWJsZSA9IHN0YXRlO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbn1cbi8vIElzc3VlICM4NjcgLyAjMTA5MCAvIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTkwMzgyMVxuLy8gSW4gd2hpY2ggU2FmYXJpIChhbmQgYXQgc29tZSBwb2ludCBpbiB0aGUgcGFzdCwgQ2hyb21lKSBkb2VzIHJlYWxseVxuLy8gd3JvbmcgdGhpbmdzIHdoZW4gdGhlIGRvd24gYXJyb3cgaXMgcHJlc3NlZCB3aGVuIHRoZSBjdXJzb3IgaXNcbi8vIGRpcmVjdGx5IGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBhbmQgaGFzIGFuIHVuZWRpdGFibGUgbm9kZVxuLy8gYWZ0ZXIgaXRcbmZ1bmN0aW9uIHNhZmFyaURvd25BcnJvd0J1Zyh2aWV3KSB7XG4gICAgaWYgKCFzYWZhcmkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB7IGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBpZiAoZm9jdXNOb2RlICYmIGZvY3VzTm9kZS5ub2RlVHlwZSA9PSAxICYmIGZvY3VzT2Zmc2V0ID09IDAgJiZcbiAgICAgICAgZm9jdXNOb2RlLmZpcnN0Q2hpbGQgJiYgZm9jdXNOb2RlLmZpcnN0Q2hpbGQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikge1xuICAgICAgICBsZXQgY2hpbGQgPSBmb2N1c05vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgc3dpdGNoRWRpdGFibGUodmlldywgY2hpbGQsIFwidHJ1ZVwiKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBjaGlsZCwgXCJmYWxzZVwiKSwgMjApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBBIGJhY2tkcm9wIGtleSBtYXBwaW5nIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cyBzdXBwcmVzcyBrZXlzXG4vLyB0aGF0IGhhdmUgYSBkYW5nZXJvdXMgZGVmYXVsdCBlZmZlY3QsIGV2ZW4gaWYgdGhlIGNvbW1hbmRzIHRoZXkgYXJlXG4vLyBib3VuZCB0byByZXR1cm4gZmFsc2UsIGFuZCB0byBtYWtlIHN1cmUgdGhhdCBjdXJzb3ItbW90aW9uIGtleXNcbi8vIGZpbmQgYSBjdXJzb3IgKGFzIG9wcG9zZWQgdG8gYSBub2RlIHNlbGVjdGlvbikgd2hlbiBwcmVzc2VkLiBGb3Jcbi8vIGN1cnNvci1tb3Rpb24ga2V5cywgdGhlIGNvZGUgaW4gdGhlIGhhbmRsZXJzIGFsc28gdGFrZXMgY2FyZSBvZlxuLy8gYmxvY2sgc2VsZWN0aW9ucy5cbmZ1bmN0aW9uIGdldE1vZHMoZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoZXZlbnQuY3RybEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiY1wiO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJtXCI7XG4gICAgaWYgKGV2ZW50LmFsdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiYVwiO1xuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwic1wiO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjYXB0dXJlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgIGxldCBjb2RlID0gZXZlbnQua2V5Q29kZSwgbW9kcyA9IGdldE1vZHMoZXZlbnQpO1xuICAgIGlmIChjb2RlID09IDggfHwgKG1hYyAmJiBjb2RlID09IDcyICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIEJhY2tzcGFjZSwgQ3RybC1oIG9uIE1hY1xuICAgICAgICByZXR1cm4gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgLTEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgLTEpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoY29kZSA9PSA0NiAmJiAhZXZlbnQuc2hpZnRLZXkpIHx8IChtYWMgJiYgY29kZSA9PSA2OCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBEZWxldGUsIEN0cmwtZCBvbiBNYWNcbiAgICAgICAgcmV0dXJuIHN0b3BOYXRpdmVIb3Jpem9udGFsRGVsZXRlKHZpZXcsIDEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMTMgfHwgY29kZSA9PSAyNykgeyAvLyBFbnRlciwgRXNjXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDM3IHx8IChtYWMgJiYgY29kZSA9PSA2NiAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBMZWZ0IGFycm93LCBDdHJsLWIgb24gTWFjXG4gICAgICAgIGxldCBkaXIgPSBjb2RlID09IDM3ID8gKGZpbmREaXJlY3Rpb24odmlldywgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSkgPT0gXCJsdHJcIiA/IC0xIDogMSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgZGlyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAzOSB8fCAobWFjICYmIGNvZGUgPT0gNzAgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gUmlnaHQgYXJyb3csIEN0cmwtZiBvbiBNYWNcbiAgICAgICAgbGV0IGRpciA9IGNvZGUgPT0gMzkgPyAoZmluZERpcmVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSA9PSBcImx0clwiID8gMSA6IC0xKSA6IDE7XG4gICAgICAgIHJldHVybiBzZWxlY3RIb3Jpem9udGFsbHkodmlldywgZGlyLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMzggfHwgKG1hYyAmJiBjb2RlID09IDgwICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIFVwIGFycm93LCBDdHJsLXAgb24gTWFjXG4gICAgICAgIHJldHVybiBzZWxlY3RWZXJ0aWNhbGx5KHZpZXcsIC0xLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIC0xKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSA0MCB8fCAobWFjICYmIGNvZGUgPT0gNzggJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gRG93biBhcnJvdywgQ3RybC1uIG9uIE1hY1xuICAgICAgICByZXR1cm4gc2FmYXJpRG93bkFycm93QnVnKHZpZXcpIHx8IHNlbGVjdFZlcnRpY2FsbHkodmlldywgMSwgbW9kcykgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAxKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kcyA9PSAobWFjID8gXCJtXCIgOiBcImNcIikgJiZcbiAgICAgICAgKGNvZGUgPT0gNjYgfHwgY29kZSA9PSA3MyB8fCBjb2RlID09IDg5IHx8IGNvZGUgPT0gOTApKSB7IC8vIE1vZC1bYml5el1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKSB7XG4gICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybUNvcGllZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgbGV0IGNvbnRleHQgPSBbXSwgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHNsaWNlO1xuICAgIHdoaWxlIChvcGVuU3RhcnQgPiAxICYmIG9wZW5FbmQgPiAxICYmIGNvbnRlbnQuY2hpbGRDb3VudCA9PSAxICYmIGNvbnRlbnQuZmlyc3RDaGlsZC5jaGlsZENvdW50ID09IDEpIHtcbiAgICAgICAgb3BlblN0YXJ0LS07XG4gICAgICAgIG9wZW5FbmQtLTtcbiAgICAgICAgbGV0IG5vZGUgPSBjb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGNvbnRleHQucHVzaChub2RlLnR5cGUubmFtZSwgbm9kZS5hdHRycyAhPSBub2RlLnR5cGUuZGVmYXVsdEF0dHJzID8gbm9kZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBjb250ZW50ID0gbm9kZS5jb250ZW50O1xuICAgIH1cbiAgICBsZXQgc2VyaWFsaXplciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRTZXJpYWxpemVyXCIpIHx8IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgbGV0IGRvYyA9IGRldGFjaGVkRG9jKCksIHdyYXAgPSBkb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQoY29udGVudCwgeyBkb2N1bWVudDogZG9jIH0pKTtcbiAgICBsZXQgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZCwgbmVlZHNXcmFwLCB3cmFwcGVycyA9IDA7XG4gICAgd2hpbGUgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmIChuZWVkc1dyYXAgPSB3cmFwTWFwW2ZpcnN0Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBuZWVkc1dyYXAubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwcGVyID0gZG9jLmNyZWF0ZUVsZW1lbnQobmVlZHNXcmFwW2ldKTtcbiAgICAgICAgICAgIHdoaWxlICh3cmFwLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh3cmFwLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICAgICAgICAgIHdyYXBwZXJzKys7XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICBmaXJzdENoaWxkLnNldEF0dHJpYnV0ZShcImRhdGEtcG0tc2xpY2VcIiwgYCR7b3BlblN0YXJ0fSAke29wZW5FbmR9JHt3cmFwcGVycyA/IGAgLSR7d3JhcHBlcnN9YCA6IFwiXCJ9ICR7SlNPTi5zdHJpbmdpZnkoY29udGV4dCl9YCk7XG4gICAgbGV0IHRleHQgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXJcIiwgZiA9PiBmKHNsaWNlLCB2aWV3KSkgfHxcbiAgICAgICAgc2xpY2UuY29udGVudC50ZXh0QmV0d2VlbigwLCBzbGljZS5jb250ZW50LnNpemUsIFwiXFxuXFxuXCIpO1xuICAgIHJldHVybiB7IGRvbTogd3JhcCwgdGV4dCB9O1xufVxuLy8gUmVhZCBhIHNsaWNlIG9mIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIChvciBkcm9wIGRhdGEpLlxuZnVuY3Rpb24gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHBsYWluVGV4dCwgJGNvbnRleHQpIHtcbiAgICBsZXQgaW5Db2RlID0gJGNvbnRleHQucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCBkb20sIHNsaWNlO1xuICAgIGlmICghaHRtbCAmJiAhdGV4dClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFzVGV4dCA9IHRleHQgJiYgKHBsYWluVGV4dCB8fCBpbkNvZGUgfHwgIWh0bWwpO1xuICAgIGlmIChhc1RleHQpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFRleHRcIiwgZiA9PiB7IHRleHQgPSBmKHRleHQsIGluQ29kZSB8fCBwbGFpblRleHQsIHZpZXcpOyB9KTtcbiAgICAgICAgaWYgKGluQ29kZSlcbiAgICAgICAgICAgIHJldHVybiB0ZXh0ID8gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odmlldy5zdGF0ZS5zY2hlbWEudGV4dCh0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikpKSwgMCwgMCkgOiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRUZXh0UGFyc2VyXCIsIGYgPT4gZih0ZXh0LCAkY29udGV4dCwgcGxhaW5UZXh0LCB2aWV3KSk7XG4gICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIHNsaWNlID0gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gJGNvbnRleHQubWFya3MoKTtcbiAgICAgICAgICAgIGxldCB7IHNjaGVtYSB9ID0gdmlldy5zdGF0ZSwgc2VyaWFsaXplciA9IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYShzY2hlbWEpO1xuICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRleHQuc3BsaXQoLyg/Olxcclxcbj98XFxuKSsvKS5mb3JFYWNoKGJsb2NrID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrKVxuICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplTm9kZShzY2hlbWEudGV4dChibG9jaywgbWFya3MpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZEhUTUxcIiwgZiA9PiB7IGh0bWwgPSBmKGh0bWwsIHZpZXcpOyB9KTtcbiAgICAgICAgZG9tID0gcmVhZEhUTUwoaHRtbCk7XG4gICAgICAgIGlmICh3ZWJraXQpXG4gICAgICAgICAgICByZXN0b3JlUmVwbGFjZWRTcGFjZXMoZG9tKTtcbiAgICB9XG4gICAgbGV0IGNvbnRleHROb2RlID0gZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtcG0tc2xpY2VdXCIpO1xuICAgIGxldCBzbGljZURhdGEgPSBjb250ZXh0Tm9kZSAmJiAvXihcXGQrKSAoXFxkKykoPzogLShcXGQrKSk/ICguKikvLmV4ZWMoY29udGV4dE5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wbS1zbGljZVwiKSB8fCBcIlwiKTtcbiAgICBpZiAoc2xpY2VEYXRhICYmIHNsaWNlRGF0YVszXSlcbiAgICAgICAgZm9yIChsZXQgaSA9ICtzbGljZURhdGFbM107IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IGRvbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkb20gPSBjaGlsZDtcbiAgICAgICAgfVxuICAgIGlmICghc2xpY2UpIHtcbiAgICAgICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRQYXJzZXJcIikgfHwgdmlldy5zb21lUHJvcChcImRvbVBhcnNlclwiKSB8fCBET01QYXJzZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgICAgIHNsaWNlID0gcGFyc2VyLnBhcnNlU2xpY2UoZG9tLCB7XG4gICAgICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICEhKGFzVGV4dCB8fCBzbGljZURhdGEpLFxuICAgICAgICAgICAgY29udGV4dDogJGNvbnRleHQsXG4gICAgICAgICAgICBydWxlRnJvbU5vZGUoZG9tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRvbS5uZXh0U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBkb20ucGFyZW50Tm9kZSAmJiAhaW5saW5lUGFyZW50cy50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2xpY2VEYXRhKSB7XG4gICAgICAgIHNsaWNlID0gYWRkQ29udGV4dChjbG9zZVNsaWNlKHNsaWNlLCArc2xpY2VEYXRhWzFdLCArc2xpY2VEYXRhWzJdKSwgc2xpY2VEYXRhWzRdKTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIEhUTUwgd2Fzbid0IGNyZWF0ZWQgYnkgUHJvc2VNaXJyb3IuIE1ha2Ugc3VyZSB0b3AtbGV2ZWwgc2libGluZ3MgYXJlIGNvaGVyZW50XG4gICAgICAgIHNsaWNlID0gU2xpY2UubWF4T3Blbihub3JtYWxpemVTaWJsaW5ncyhzbGljZS5jb250ZW50LCAkY29udGV4dCksIHRydWUpO1xuICAgICAgICBpZiAoc2xpY2Uub3BlblN0YXJ0IHx8IHNsaWNlLm9wZW5FbmQpIHtcbiAgICAgICAgICAgIGxldCBvcGVuU3RhcnQgPSAwLCBvcGVuRW5kID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgPSBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQ7IG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydCAmJiAhbm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nOyBvcGVuU3RhcnQrKywgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZCkgeyB9XG4gICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2xpY2UuY29udGVudC5sYXN0Q2hpbGQ7IG9wZW5FbmQgPCBzbGljZS5vcGVuRW5kICYmICFub2RlLnR5cGUuc3BlYy5pc29sYXRpbmc7IG9wZW5FbmQrKywgbm9kZSA9IG5vZGUubGFzdENoaWxkKSB7IH1cbiAgICAgICAgICAgIHNsaWNlID0gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtUGFzdGVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG5jb25zdCBpbmxpbmVQYXJlbnRzID0gL14oYXxhYmJyfGFjcm9ueW18YnxjaXRlfGNvZGV8ZGVsfGVtfGl8aW5zfGtiZHxsYWJlbHxvdXRwdXR8cXxydWJ5fHN8c2FtcHxzcGFufHN0cm9uZ3xzdWJ8c3VwfHRpbWV8dXx0dHx2YXIpJC9pO1xuLy8gVGFrZXMgYSBzbGljZSBwYXJzZWQgd2l0aCBwYXJzZVNsaWNlLCB3aGljaCBtZWFucyB0aGVyZSBoYXNuJ3QgYmVlblxuLy8gYW55IGNvbnRlbnQtZXhwcmVzc2lvbiBjaGVja2luZyBkb25lIG9uIHRoZSB0b3Agbm9kZXMsIHRyaWVzIHRvXG4vLyBmaW5kIGEgcGFyZW50IG5vZGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dCB0aGF0IG1pZ2h0IGZpdCB0aGUgbm9kZXMsXG4vLyBhbmQgaWYgc3VjY2Vzc2Z1bCwgcmVidWlsZHMgdGhlIHNsaWNlIHNvIHRoYXQgaXQgZml0cyBpbnRvIHRoYXQgcGFyZW50LlxuLy9cbi8vIFRoaXMgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIHRoYXQgVHJhbnNmb3JtLnJlcGxhY2UgZXhwZWN0cyBhXG4vLyBjb2hlcmVudCBzbGljZSwgYW5kIHdpbGwgZmFpbCB0byBwbGFjZSBhIHNldCBvZiBzaWJsaW5ncyB0aGF0IGRvbid0XG4vLyBmaXQgYW55d2hlcmUgaW4gdGhlIHNjaGVtYS5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpYmxpbmdzKGZyYWdtZW50LCAkY29udGV4dCkge1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50IDwgMilcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjb250ZXh0Lm5vZGUoZCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdCgkY29udGV4dC5pbmRleChkKSk7XG4gICAgICAgIGxldCBsYXN0V3JhcCwgcmVzdWx0ID0gW107XG4gICAgICAgIGZyYWdtZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgd3JhcCA9IG1hdGNoLmZpbmRXcmFwcGluZyhub2RlLnR5cGUpLCBpbkxhc3Q7XG4gICAgICAgICAgICBpZiAoIXdyYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaW5MYXN0ID0gcmVzdWx0Lmxlbmd0aCAmJiBsYXN0V3JhcC5sZW5ndGggJiYgYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLCAwKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBpbkxhc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGNsb3NlUmlnaHQocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSwgbGFzdFdyYXAubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcHBlZCA9IHdpdGhXcmFwcGVycyhub2RlLCB3cmFwKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3cmFwcGVkKTtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoVHlwZSh3cmFwcGVkLnR5cGUpO1xuICAgICAgICAgICAgICAgIGxhc3RXcmFwID0gd3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiB3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZnJvbSA9IDApIHtcbiAgICBmb3IgKGxldCBpID0gd3JhcC5sZW5ndGggLSAxOyBpID49IGZyb207IGktLSlcbiAgICAgICAgbm9kZSA9IHdyYXBbaV0uY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiBub2RlO1xufVxuLy8gVXNlZCB0byBncm91cCBhZGphY2VudCBub2RlcyB3cmFwcGVkIGluIHNpbWlsYXIgcGFyZW50cyBieVxuLy8gbm9ybWFsaXplU2libGluZ3MgaW50byB0aGUgc2FtZSBwYXJlbnQgbm9kZVxuZnVuY3Rpb24gYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCBzaWJsaW5nLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA8IHdyYXAubGVuZ3RoICYmIGRlcHRoIDwgbGFzdFdyYXAubGVuZ3RoICYmIHdyYXBbZGVwdGhdID09IGxhc3RXcmFwW2RlcHRoXSkge1xuICAgICAgICBsZXQgaW5uZXIgPSBhZGRUb1NpYmxpbmcod3JhcCwgbGFzdFdyYXAsIG5vZGUsIHNpYmxpbmcubGFzdENoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgICBpZiAoaW5uZXIpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5yZXBsYWNlQ2hpbGQoc2libGluZy5jaGlsZENvdW50IC0gMSwgaW5uZXIpKTtcbiAgICAgICAgbGV0IG1hdGNoID0gc2libGluZy5jb250ZW50TWF0Y2hBdChzaWJsaW5nLmNoaWxkQ291bnQpO1xuICAgICAgICBpZiAobWF0Y2gubWF0Y2hUeXBlKGRlcHRoID09IHdyYXAubGVuZ3RoIC0gMSA/IG5vZGUudHlwZSA6IHdyYXBbZGVwdGggKyAxXSkpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5hcHBlbmQoRnJhZ21lbnQuZnJvbSh3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZGVwdGggKyAxKSkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbG9zZVJpZ2h0KG5vZGUsIGRlcHRoKSB7XG4gICAgaWYgKGRlcHRoID09IDApXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIGxldCBmcmFnbWVudCA9IG5vZGUuY29udGVudC5yZXBsYWNlQ2hpbGQobm9kZS5jaGlsZENvdW50IC0gMSwgY2xvc2VSaWdodChub2RlLmxhc3RDaGlsZCwgZGVwdGggLSAxKSk7XG4gICAgbGV0IGZpbGwgPSBub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5vZGUuY29weShmcmFnbWVudC5hcHBlbmQoZmlsbCkpO1xufVxuZnVuY3Rpb24gY2xvc2VSYW5nZShmcmFnbWVudCwgc2lkZSwgZnJvbSwgdG8sIGRlcHRoLCBvcGVuRW5kKSB7XG4gICAgbGV0IG5vZGUgPSBzaWRlIDwgMCA/IGZyYWdtZW50LmZpcnN0Q2hpbGQgOiBmcmFnbWVudC5sYXN0Q2hpbGQsIGlubmVyID0gbm9kZS5jb250ZW50O1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50ID4gMSlcbiAgICAgICAgb3BlbkVuZCA9IDA7XG4gICAgaWYgKGRlcHRoIDwgdG8gLSAxKVxuICAgICAgICBpbm5lciA9IGNsb3NlUmFuZ2UoaW5uZXIsIHNpZGUsIGZyb20sIHRvLCBkZXB0aCArIDEsIG9wZW5FbmQpO1xuICAgIGlmIChkZXB0aCA+PSBmcm9tKVxuICAgICAgICBpbm5lciA9IHNpZGUgPCAwID8gbm9kZS5jb250ZW50TWF0Y2hBdCgwKS5maWxsQmVmb3JlKGlubmVyLCBvcGVuRW5kIDw9IGRlcHRoKS5hcHBlbmQoaW5uZXIpXG4gICAgICAgICAgICA6IGlubmVyLmFwcGVuZChub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoc2lkZSA8IDAgPyAwIDogZnJhZ21lbnQuY2hpbGRDb3VudCAtIDEsIG5vZGUuY29weShpbm5lcikpO1xufVxuZnVuY3Rpb24gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgaWYgKG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAtMSwgb3BlblN0YXJ0LCBzbGljZS5vcGVuU3RhcnQsIDAsIHNsaWNlLm9wZW5FbmQpLCBvcGVuU3RhcnQsIHNsaWNlLm9wZW5FbmQpO1xuICAgIGlmIChvcGVuRW5kIDwgc2xpY2Uub3BlbkVuZClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAxLCBvcGVuRW5kLCBzbGljZS5vcGVuRW5kLCAwLCAwKSwgc2xpY2Uub3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG4vLyBUcmljayBmcm9tIGpRdWVyeSAtLSBzb21lIGVsZW1lbnRzIG11c3QgYmUgd3JhcHBlZCBpbiBvdGhlclxuLy8gZWxlbWVudHMgZm9yIGlubmVySFRNTCB0byB3b3JrLiBJLmUuIGlmIHlvdSBkbyBgZGl2LmlubmVySFRNTCA9XG4vLyBcIjx0ZD4uLjwvdGQ+XCJgIHRoZSB0YWJsZSBjZWxscyBhcmUgaWdub3JlZC5cbmNvbnN0IHdyYXBNYXAgPSB7XG4gICAgdGhlYWQ6IFtcInRhYmxlXCJdLFxuICAgIHRib2R5OiBbXCJ0YWJsZVwiXSxcbiAgICB0Zm9vdDogW1widGFibGVcIl0sXG4gICAgY2FwdGlvbjogW1widGFibGVcIl0sXG4gICAgY29sZ3JvdXA6IFtcInRhYmxlXCJdLFxuICAgIGNvbDogW1widGFibGVcIiwgXCJjb2xncm91cFwiXSxcbiAgICB0cjogW1widGFibGVcIiwgXCJ0Ym9keVwiXSxcbiAgICB0ZDogW1widGFibGVcIiwgXCJ0Ym9keVwiLCBcInRyXCJdLFxuICAgIHRoOiBbXCJ0YWJsZVwiLCBcInRib2R5XCIsIFwidHJcIl1cbn07XG5sZXQgX2RldGFjaGVkRG9jID0gbnVsbDtcbmZ1bmN0aW9uIGRldGFjaGVkRG9jKCkge1xuICAgIHJldHVybiBfZGV0YWNoZWREb2MgfHwgKF9kZXRhY2hlZERvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcInRpdGxlXCIpKTtcbn1cbmZ1bmN0aW9uIHJlYWRIVE1MKGh0bWwpIHtcbiAgICBsZXQgbWV0YXMgPSAvXihcXHMqPG1ldGEgW14+XSo+KSovLmV4ZWMoaHRtbCk7XG4gICAgaWYgKG1ldGFzKVxuICAgICAgICBodG1sID0gaHRtbC5zbGljZShtZXRhc1swXS5sZW5ndGgpO1xuICAgIGxldCBlbHQgPSBkZXRhY2hlZERvYygpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbGV0IGZpcnN0VGFnID0gLzwoW2Etel1bXj5cXHNdKykvaS5leGVjKGh0bWwpLCB3cmFwO1xuICAgIGlmICh3cmFwID0gZmlyc3RUYWcgJiYgd3JhcE1hcFtmaXJzdFRhZ1sxXS50b0xvd2VyQ2FzZSgpXSlcbiAgICAgICAgaHRtbCA9IHdyYXAubWFwKG4gPT4gXCI8XCIgKyBuICsgXCI+XCIpLmpvaW4oXCJcIikgKyBodG1sICsgd3JhcC5tYXAobiA9PiBcIjwvXCIgKyBuICsgXCI+XCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgIGVsdC5pbm5lckhUTUwgPSBodG1sO1xuICAgIGlmICh3cmFwKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXAubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbHQgPSBlbHQucXVlcnlTZWxlY3Rvcih3cmFwW2ldKSB8fCBlbHQ7XG4gICAgcmV0dXJuIGVsdDtcbn1cbi8vIFdlYmtpdCBicm93c2VycyBkbyBzb21lIGhhcmQtdG8tcHJlZGljdCByZXBsYWNlbWVudCBvZiByZWd1bGFyXG4vLyBzcGFjZXMgd2l0aCBub24tYnJlYWtpbmcgc3BhY2VzIHdoZW4gcHV0dGluZyBjb250ZW50IG9uIHRoZVxuLy8gY2xpcGJvYXJkLiBUaGlzIHRyaWVzIHRvIGNvbnZlcnQgc3VjaCBub24tYnJlYWtpbmcgc3BhY2VzICh3aGljaFxuLy8gd2lsbCBiZSB3cmFwcGVkIGluIGEgcGxhaW4gc3BhbiBvbiBDaHJvbWUsIGEgc3BhbiB3aXRoIGNsYXNzXG4vLyBBcHBsZS1jb252ZXJ0ZWQtc3BhY2Ugb24gU2FmYXJpKSBiYWNrIHRvIHJlZ3VsYXIgc3BhY2VzLlxuZnVuY3Rpb24gcmVzdG9yZVJlcGxhY2VkU3BhY2VzKGRvbSkge1xuICAgIGxldCBub2RlcyA9IGRvbS5xdWVyeVNlbGVjdG9yQWxsKGNocm9tZSA/IFwic3Bhbjpub3QoW2NsYXNzXSk6bm90KFtzdHlsZV0pXCIgOiBcInNwYW4uQXBwbGUtY29udmVydGVkLXNwYWNlXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSAmJiBub2RlLnRleHRDb250ZW50ID09IFwiXFx1MDBhMFwiICYmIG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZG9tLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIgXCIpLCBub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRDb250ZXh0KHNsaWNlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgbGV0IHNjaGVtYSA9IHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZC50eXBlLnNjaGVtYSwgYXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgICAgYXJyYXkgPSBKU09OLnBhcnNlKGNvbnRleHQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgfVxuICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gc2xpY2U7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIGxldCB0eXBlID0gc2NoZW1hLm5vZGVzW2FycmF5W2ldXTtcbiAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGFycmF5W2kgKyAxXSwgY29udGVudCkpO1xuICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgb3BlbkVuZCsrO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBET00gZXZlbnRzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBlZGl0b3IsIGFuZCBjYWxsYmFjayBmdW5jdGlvbnNcbi8vIHRvIGludm9rZSB3aGVuIHRoZSBldmVudCBmaXJlcy5cbmNvbnN0IGhhbmRsZXJzID0ge307XG5jb25zdCBlZGl0SGFuZGxlcnMgPSB7fTtcbmNvbnN0IHBhc3NpdmVIYW5kbGVycyA9IHsgdG91Y2hzdGFydDogdHJ1ZSwgdG91Y2htb3ZlOiB0cnVlIH07XG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zaGlmdEtleSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlRG93biA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdENsaWNrID0geyB0aW1lOiAwLCB4OiAwLCB5OiAwLCB0eXBlOiBcIlwiIH07XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RJT1NFbnRlciA9IDA7XG4gICAgICAgIHRoaXMubGFzdElPU0VudGVyRmFsbGJhY2tUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdEZvY3VzID0gMDtcbiAgICAgICAgdGhpcy5sYXN0VG91Y2ggPSAwO1xuICAgICAgICB0aGlzLmxhc3RBbmRyb2lkRGVsZXRlID0gMDtcbiAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21wb3NpbmdUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Ob2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25JRCA9IDE7XG4gICAgICAgIC8vIFNldCB0byBhIGNvbXBvc2l0aW9uIElEIHdoZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBhdCBjb21wb3NpdGlvbmVuZFxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgPSAwO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5oaWRlU2VsZWN0aW9uR3VhcmQgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRJbnB1dCh2aWV3KSB7XG4gICAgZm9yIChsZXQgZXZlbnQgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1tldmVudF0gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudEJlbG9uZ3NUb1ZpZXcodmlldywgZXZlbnQpICYmICFydW5DdXN0b21IYW5kbGVyKHZpZXcsIGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHZpZXcsIGV2ZW50KTtcbiAgICAgICAgfSwgcGFzc2l2ZUhhbmRsZXJzW2V2ZW50XSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgLy8gT24gU2FmYXJpLCBmb3IgcmVhc29ucyBiZXlvbmQgbXkgdW5kZXJzdGFuZGluZywgYWRkaW5nIGFuIGlucHV0XG4gICAgLy8gZXZlbnQgaGFuZGxlciBtYWtlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlblxuICAgIC8vIHlvdSBwcmVzcyBlbnRlciBnbyBhd2F5LlxuICAgIGlmIChzYWZhcmkpXG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiBudWxsKTtcbiAgICBlbnN1cmVMaXN0ZW5lcnModmlldyk7XG59XG5mdW5jdGlvbiBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgb3JpZ2luKSB7XG4gICAgdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgIHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPSBEYXRlLm5vdygpO1xufVxuZnVuY3Rpb24gZGVzdHJveUlucHV0KHZpZXcpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBmb3IgKGxldCB0eXBlIGluIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVycylcbiAgICAgICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB2aWV3LmlucHV0LmV2ZW50SGFuZGxlcnNbdHlwZV0pO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCk7XG59XG5mdW5jdGlvbiBlbnN1cmVMaXN0ZW5lcnModmlldykge1xuICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVET01FdmVudHNcIiwgY3VycmVudEhhbmRsZXJzID0+IHtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBjdXJyZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBpZiAoIXZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSA9IGV2ZW50ID0+IHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpIHtcbiAgICByZXR1cm4gdmlldy5zb21lUHJvcChcImhhbmRsZURPTUV2ZW50c1wiLCBoYW5kbGVycyA9PiB7XG4gICAgICAgIGxldCBoYW5kbGVyID0gaGFuZGxlcnNbZXZlbnQudHlwZV07XG4gICAgICAgIHJldHVybiBoYW5kbGVyID8gaGFuZGxlcih2aWV3LCBldmVudCkgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IGZhbHNlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZXZlbnRCZWxvbmdzVG9WaWV3KHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQ7IG5vZGUgIT0gdmlldy5kb207IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8XG4gICAgICAgICAgICAobm9kZS5wbVZpZXdEZXNjICYmIG5vZGUucG1WaWV3RGVzYy5zdG9wRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIXJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpICYmIGhhbmRsZXJzW2V2ZW50LnR5cGVdICYmXG4gICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgaGFuZGxlcnNbZXZlbnQudHlwZV0odmlldywgZXZlbnQpO1xufVxuZWRpdEhhbmRsZXJzLmtleWRvd24gPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBldmVudC5rZXlDb2RlID09IDE2IHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgIGlmIChpbk9yTmVhckNvbXBvc2l0aW9uKHZpZXcsIGV2ZW50KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBTdXBwcmVzcyBlbnRlciBrZXkgZXZlbnRzIG9uIENocm9tZSBBbmRyb2lkLCBiZWNhdXNlIHRob3NlIHRlbmRcbiAgICAvLyB0byBiZSBwYXJ0IG9mIGEgY29uZnVzZWQgc2VxdWVuY2Ugb2YgY29tcG9zaXRpb24gZXZlbnRzIGZpcmVkLFxuICAgIC8vIGFuZCBoYW5kbGluZyB0aGVtIGVhZ2VybHkgdGVuZHMgdG8gY29ycnVwdCB0aGUgaW5wdXQuXG4gICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lICYmIGV2ZW50LmtleUNvZGUgPT0gMTMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIC8vIE9uIGlPUywgaWYgd2UgcHJldmVudERlZmF1bHQgZW50ZXIga2V5IHByZXNzZXMsIHRoZSB2aXJ0dWFsXG4gICAgLy8ga2V5Ym9hcmQgZ2V0cyBjb25mdXNlZC4gU28gdGhlIGhhY2sgaGVyZSBpcyB0byBzZXQgYSBmbGFnIHRoYXRcbiAgICAvLyBtYWtlcyB0aGUgRE9NIGNoYW5nZSBjb2RlIHJlY29nbml6ZSB0aGF0IHdoYXQganVzdCBoYXBwZW5zIHNob3VsZFxuICAgIC8vIGJlIHJlcGxhY2VkIGJ5IHdoYXRldmVyIHRoZSBFbnRlciBrZXkgaGFuZGxlcnMgZG8uXG4gICAgaWYgKGlvcyAmJiBldmVudC5rZXlDb2RlID09IDEzICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gbm93O1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdElPU0VudGVyID09IG5vdykge1xuICAgICAgICAgICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpO1xuICAgICAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkgfHwgY2FwdHVyZUtleURvd24odmlldywgZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJrZXlcIik7XG4gICAgfVxufTtcbmVkaXRIYW5kbGVycy5rZXl1cCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDE2KVxuICAgICAgICB2aWV3LmlucHV0LnNoaWZ0S2V5ID0gZmFsc2U7XG59O1xuZWRpdEhhbmRsZXJzLmtleXByZXNzID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAoaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkgfHwgIWV2ZW50LmNoYXJDb2RlIHx8XG4gICAgICAgIGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fCBtYWMgJiYgZXZlbnQubWV0YUtleSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5UHJlc3NcIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgfHwgIXNlbC4kZnJvbS5zYW1lUGFyZW50KHNlbC4kdG8pKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSk7XG4gICAgICAgIGlmICghL1tcXHJcXG5dLy50ZXN0KHRleHQpICYmICF2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVGV4dElucHV0XCIsIGYgPT4gZih2aWV3LCBzZWwuJGZyb20ucG9zLCBzZWwuJHRvLnBvcywgdGV4dCkpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmluc2VydFRleHQodGV4dCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGV2ZW50Q29vcmRzKGV2ZW50KSB7IHJldHVybiB7IGxlZnQ6IGV2ZW50LmNsaWVudFgsIHRvcDogZXZlbnQuY2xpZW50WSB9OyB9XG5mdW5jdGlvbiBpc05lYXIoZXZlbnQsIGNsaWNrKSB7XG4gICAgbGV0IGR4ID0gY2xpY2sueCAtIGV2ZW50LmNsaWVudFgsIGR5ID0gY2xpY2sueSAtIGV2ZW50LmNsaWVudFk7XG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5IDwgMTAwO1xufVxuZnVuY3Rpb24gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBwcm9wTmFtZSwgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBpZiAodmlldy5zb21lUHJvcChwcm9wTmFtZSwgZiA9PiBpID4gJHBvcy5kZXB0aCA/IGYodmlldywgcG9zLCAkcG9zLm5vZGVBZnRlciwgJHBvcy5iZWZvcmUoaSksIGV2ZW50LCB0cnVlKVxuICAgICAgICAgICAgOiBmKHZpZXcsIHBvcywgJHBvcy5ub2RlKGkpLCAkcG9zLmJlZm9yZShpKSwgZXZlbnQsIGZhbHNlKSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKHZpZXcsIHNlbGVjdGlvbiwgb3JpZ2luKSB7XG4gICAgaWYgKCF2aWV3LmZvY3VzZWQpXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgIGlmIChvcmlnaW4gPT0gXCJwb2ludGVyXCIpXG4gICAgICAgIHRyLnNldE1ldGEoXCJwb2ludGVyXCIsIHRydWUpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIpO1xufVxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZExlYWYodmlldywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpLCBub2RlID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgaWYgKG5vZGUgJiYgbm9kZS5pc0F0b20gJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIG5ldyBOb2RlU2VsZWN0aW9uKCRwb3MpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzZWxlY3RDbGlja2VkTm9kZSh2aWV3LCBpbnNpZGUpIHtcbiAgICBpZiAoaW5zaWRlID09IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLCBzZWxlY3RlZE5vZGUsIHNlbGVjdEF0O1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKVxuICAgICAgICBzZWxlY3RlZE5vZGUgPSBzZWwubm9kZTtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoaW5zaWRlKTtcbiAgICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aCArIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSBpID4gJHBvcy5kZXB0aCA/ICRwb3Mubm9kZUFmdGVyIDogJHBvcy5ub2RlKGkpO1xuICAgICAgICBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZE5vZGUgJiYgc2VsLiRmcm9tLmRlcHRoID4gMCAmJlxuICAgICAgICAgICAgICAgIGkgPj0gc2VsLiRmcm9tLmRlcHRoICYmICRwb3MuYmVmb3JlKHNlbC4kZnJvbS5kZXB0aCArIDEpID09IHNlbC4kZnJvbS5wb3MpXG4gICAgICAgICAgICAgICAgc2VsZWN0QXQgPSAkcG9zLmJlZm9yZShzZWwuJGZyb20uZGVwdGgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlbGVjdEF0ID0gJHBvcy5iZWZvcmUoaSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZWN0QXQgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIHNlbGVjdEF0KSwgXCJwb2ludGVyXCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVTaW5nbGVDbGljayh2aWV3LCBwb3MsIGluc2lkZSwgZXZlbnQsIHNlbGVjdE5vZGUpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBcImhhbmRsZUNsaWNrT25cIiwgcG9zLCBpbnNpZGUsIGV2ZW50KSB8fFxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlQ2xpY2tcIiwgZiA9PiBmKHZpZXcsIHBvcywgZXZlbnQpKSB8fFxuICAgICAgICAoc2VsZWN0Tm9kZSA/IHNlbGVjdENsaWNrZWROb2RlKHZpZXcsIGluc2lkZSkgOiBzZWxlY3RDbGlja2VkTGVhZih2aWV3LCBpbnNpZGUpKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZURvdWJsZUNsaWNrKHZpZXcsIHBvcywgaW5zaWRlLCBldmVudCkge1xuICAgIHJldHVybiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIFwiaGFuZGxlRG91YmxlQ2xpY2tPblwiLCBwb3MsIGluc2lkZSwgZXZlbnQpIHx8XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVEb3VibGVDbGlja1wiLCBmID0+IGYodmlldywgcG9zLCBldmVudCkpO1xufVxuZnVuY3Rpb24gaGFuZGxlVHJpcGxlQ2xpY2sodmlldywgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgcmV0dXJuIHJ1bkhhbmRsZXJPbkNvbnRleHQodmlldywgXCJoYW5kbGVUcmlwbGVDbGlja09uXCIsIHBvcywgaW5zaWRlLCBldmVudCkgfHxcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZVRyaXBsZUNsaWNrXCIsIGYgPT4gZih2aWV3LCBwb3MsIGV2ZW50KSkgfHxcbiAgICAgICAgZGVmYXVsdFRyaXBsZUNsaWNrKHZpZXcsIGluc2lkZSwgZXZlbnQpO1xufVxuZnVuY3Rpb24gZGVmYXVsdFRyaXBsZUNsaWNrKHZpZXcsIGluc2lkZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgaWYgKGluc2lkZSA9PSAtMSkge1xuICAgICAgICBpZiAoZG9jLmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIDAsIGRvYy5jb250ZW50LnNpemUpLCBcInBvaW50ZXJcIik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUoaW5zaWRlKTtcbiAgICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aCArIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSBpID4gJHBvcy5kZXB0aCA/ICRwb3Mubm9kZUFmdGVyIDogJHBvcy5ub2RlKGkpO1xuICAgICAgICBsZXQgbm9kZVBvcyA9ICRwb3MuYmVmb3JlKGkpO1xuICAgICAgICBpZiAobm9kZS5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgbm9kZVBvcyArIDEsIG5vZGVQb3MgKyAxICsgbm9kZS5jb250ZW50LnNpemUpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIGVsc2UgaWYgKE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKVxuICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIE5vZGVTZWxlY3Rpb24uY3JlYXRlKGRvYywgbm9kZVBvcyksIFwicG9pbnRlclwiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZvcmNlRE9NRmx1c2godmlldykge1xuICAgIHJldHVybiBlbmRDb21wb3NpdGlvbih2aWV3KTtcbn1cbmNvbnN0IHNlbGVjdE5vZGVNb2RpZmllciA9IG1hYyA/IFwibWV0YUtleVwiIDogXCJjdHJsS2V5XCI7XG5oYW5kbGVycy5tb3VzZWRvd24gPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTtcbiAgICBsZXQgZmx1c2hlZCA9IGZvcmNlRE9NRmx1c2godmlldyk7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCksIHR5cGUgPSBcInNpbmdsZUNsaWNrXCI7XG4gICAgaWYgKG5vdyAtIHZpZXcuaW5wdXQubGFzdENsaWNrLnRpbWUgPCA1MDAgJiYgaXNOZWFyKGV2ZW50LCB2aWV3LmlucHV0Lmxhc3RDbGljaykgJiYgIWV2ZW50W3NlbGVjdE5vZGVNb2RpZmllcl0pIHtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdENsaWNrLnR5cGUgPT0gXCJzaW5nbGVDbGlja1wiKVxuICAgICAgICAgICAgdHlwZSA9IFwiZG91YmxlQ2xpY2tcIjtcbiAgICAgICAgZWxzZSBpZiAodmlldy5pbnB1dC5sYXN0Q2xpY2sudHlwZSA9PSBcImRvdWJsZUNsaWNrXCIpXG4gICAgICAgICAgICB0eXBlID0gXCJ0cmlwbGVDbGlja1wiO1xuICAgIH1cbiAgICB2aWV3LmlucHV0Lmxhc3RDbGljayA9IHsgdGltZTogbm93LCB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCB0eXBlIH07XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBpZiAoIXBvcylcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh0eXBlID09IFwic2luZ2xlQ2xpY2tcIikge1xuICAgICAgICBpZiAodmlldy5pbnB1dC5tb3VzZURvd24pXG4gICAgICAgICAgICB2aWV3LmlucHV0Lm1vdXNlRG93bi5kb25lKCk7XG4gICAgICAgIHZpZXcuaW5wdXQubW91c2VEb3duID0gbmV3IE1vdXNlRG93bih2aWV3LCBwb3MsIGV2ZW50LCAhIWZsdXNoZWQpO1xuICAgIH1cbiAgICBlbHNlIGlmICgodHlwZSA9PSBcImRvdWJsZUNsaWNrXCIgPyBoYW5kbGVEb3VibGVDbGljayA6IGhhbmRsZVRyaXBsZUNsaWNrKSh2aWV3LCBwb3MucG9zLCBwb3MuaW5zaWRlLCBldmVudCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih2aWV3LCBcInBvaW50ZXJcIik7XG4gICAgfVxufTtcbmNsYXNzIE1vdXNlRG93biB7XG4gICAgY29uc3RydWN0b3IodmlldywgcG9zLCBldmVudCwgZmx1c2hlZCkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50O1xuICAgICAgICB0aGlzLmZsdXNoZWQgPSBmbHVzaGVkO1xuICAgICAgICB0aGlzLmRlbGF5ZWRTZWxlY3Rpb25TeW5jID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWlnaHREcmFnID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGFydERvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUgPSAhIWV2ZW50W3NlbGVjdE5vZGVNb2RpZmllcl07XG4gICAgICAgIHRoaXMuYWxsb3dEZWZhdWx0ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIGxldCB0YXJnZXROb2RlLCB0YXJnZXRQb3M7XG4gICAgICAgIGlmIChwb3MuaW5zaWRlID4gLTEpIHtcbiAgICAgICAgICAgIHRhcmdldE5vZGUgPSB2aWV3LnN0YXRlLmRvYy5ub2RlQXQocG9zLmluc2lkZSk7XG4gICAgICAgICAgICB0YXJnZXRQb3MgPSBwb3MuaW5zaWRlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKHBvcy5wb3MpO1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9ICRwb3MucGFyZW50O1xuICAgICAgICAgICAgdGFyZ2V0UG9zID0gJHBvcy5kZXB0aCA/ICRwb3MuYmVmb3JlKCkgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGZsdXNoZWQgPyBudWxsIDogZXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCB0YXJnZXREZXNjID0gdGFyZ2V0ID8gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKHRhcmdldCwgdHJ1ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldERlc2MgPyB0YXJnZXREZXNjLmRvbSA6IG51bGw7XG4gICAgICAgIGxldCB7IHNlbGVjdGlvbiB9ID0gdmlldy5zdGF0ZTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PSAwICYmXG4gICAgICAgICAgICB0YXJnZXROb2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUgJiYgdGFyZ2V0Tm9kZS50eXBlLnNwZWMuc2VsZWN0YWJsZSAhPT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHNlbGVjdGlvbiBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZyb20gPD0gdGFyZ2V0UG9zICYmIHNlbGVjdGlvbi50byA+IHRhcmdldFBvcylcbiAgICAgICAgICAgIHRoaXMubWlnaHREcmFnID0ge1xuICAgICAgICAgICAgICAgIG5vZGU6IHRhcmdldE5vZGUsXG4gICAgICAgICAgICAgICAgcG9zOiB0YXJnZXRQb3MsXG4gICAgICAgICAgICAgICAgYWRkQXR0cjogISEodGhpcy50YXJnZXQgJiYgIXRoaXMudGFyZ2V0LmRyYWdnYWJsZSksXG4gICAgICAgICAgICAgICAgc2V0VW5lZGl0YWJsZTogISEodGhpcy50YXJnZXQgJiYgZ2Vja28gJiYgIXRoaXMudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLm1pZ2h0RHJhZyAmJiAodGhpcy5taWdodERyYWcuYWRkQXR0ciB8fCB0aGlzLm1pZ2h0RHJhZy5zZXRVbmVkaXRhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pZ2h0RHJhZy5hZGRBdHRyKVxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPT0gdGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcImZhbHNlXCIpO1xuICAgICAgICAgICAgICAgIH0sIDIwKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmlldy5yb290LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlID0gdGhpcy5tb3ZlLmJpbmQodGhpcykpO1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xuICAgIH1cbiAgICBkb25lKCkge1xuICAgICAgICB0aGlzLnZpZXcucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUpO1xuICAgICAgICBpZiAodGhpcy5taWdodERyYWcgJiYgdGhpcy50YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuYWRkQXR0cilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIik7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxheWVkU2VsZWN0aW9uU3luYylcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2VsZWN0aW9uVG9ET00odGhpcy52aWV3KSk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPSBudWxsO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICB0aGlzLmRvbmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5kb2MgIT0gdGhpcy5zdGFydERvYylcbiAgICAgICAgICAgIHBvcyA9IHRoaXMudmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmFsbG93RGVmYXVsdCB8fCAhcG9zKSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGFuZGxlU2luZ2xlQ2xpY2sodGhpcy52aWV3LCBwb3MucG9zLCBwb3MuaW5zaWRlLCBldmVudCwgdGhpcy5zZWxlY3ROb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudC5idXR0b24gPT0gMCAmJlxuICAgICAgICAgICAgKHRoaXMuZmx1c2hlZCB8fFxuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBpZ25vcmVzIGNsaWNrcyBvbiBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAoc2FmYXJpICYmIHRoaXMubWlnaHREcmFnICYmICF0aGlzLm1pZ2h0RHJhZy5ub2RlLmlzQXRvbSkgfHxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMgdHJlYXQgYSBub2RlIHNlbGVjdGlvbiBhcyBhXG4gICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBidXQgc3RpbGwgcmVwb3J0IHRoYXQgdGhlIG5vZGUgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyB3aGVuIGFza2VkIHRocm91Z2ggZ2V0U2VsZWN0aW9uLiBZb3UnbGwgdGhlbiBnZXQgYVxuICAgICAgICAgICAgICAgIC8vIHNpdHVhdGlvbiB3aGVyZSBjbGlja2luZyBhdCB0aGUgcG9pbnQgd2hlcmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIChoaWRkZW4pIGN1cnNvciBpcyBkb2Vzbid0IGNoYW5nZSB0aGUgc2VsZWN0aW9uLCBhbmRcbiAgICAgICAgICAgICAgICAvLyB0aHVzIGRvZXNuJ3QgZ2V0IGEgcmVhY3Rpb24gZnJvbSBQcm9zZU1pcnJvci4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtzIGFyb3VuZCB0aGF0LlxuICAgICAgICAgICAgICAgIChjaHJvbWUgJiYgIXRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udmlzaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihNYXRoLmFicyhwb3MucG9zIC0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSwgTWF0aC5hYnMocG9zLnBvcyAtIHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udG8pKSA8PSAyKSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih0aGlzLnZpZXcsIFNlbGVjdGlvbi5uZWFyKHRoaXMudmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MucG9zKSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW92ZShldmVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih0aGlzLnZpZXcsIFwicG9pbnRlclwiKTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHRoaXMuZG9uZSgpO1xuICAgIH1cbiAgICB1cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93RGVmYXVsdCAmJiAoTWF0aC5hYnModGhpcy5ldmVudC54IC0gZXZlbnQuY2xpZW50WCkgPiA0IHx8XG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmV2ZW50LnkgLSBldmVudC5jbGllbnRZKSA+IDQpKVxuICAgICAgICAgICAgdGhpcy5hbGxvd0RlZmF1bHQgPSB0cnVlO1xuICAgIH1cbn1cbmhhbmRsZXJzLnRvdWNoc3RhcnQgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0Lmxhc3RUb3VjaCA9IERhdGUubm93KCk7XG4gICAgZm9yY2VET01GbHVzaCh2aWV3KTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXQubGFzdFRvdWNoID0gRGF0ZS5ub3coKTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLmNvbnRleHRtZW51ID0gdmlldyA9PiBmb3JjZURPTUZsdXNoKHZpZXcpO1xuZnVuY3Rpb24gaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LnN0dW0uZGUvMjAxNi8wNi8yNC9oYW5kbGluZy1pbWUtZXZlbnRzLWluLWphdmFzY3JpcHQvLlxuICAgIC8vIE9uIEphcGFuZXNlIGlucHV0IG1ldGhvZCBlZGl0b3JzIChJTUVzKSwgdGhlIEVudGVyIGtleSBpcyB1c2VkIHRvIGNvbmZpcm0gY2hhcmFjdGVyXG4gICAgLy8gc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCwgY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZVxuICAgIC8vIGVtaXR0ZWQuIFRoZSBrZXlkb3duIGV2ZW50IHRyaWdnZXJzIG5ld2xpbmUgaW5zZXJ0aW9uLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5ZG93biBldmVudCBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAvLyBXZSBvbmx5IGlnbm9yZSBpdCBvbmNlLCBhcyBwcmVzc2luZyBFbnRlciBhIHNlY29uZCB0aW1lICpzaG91bGQqIGluc2VydCBhIG5ld2xpbmUuXG4gICAgLy8gRnVydGhlcm1vcmUsIHRoZSBrZXlkb3duIGV2ZW50IHRpbWVzdGFtcCBtdXN0IGJlIGNsb3NlIHRvIHRoZSBjb21wb3NpdGlvbkVuZGVkQXQgdGltZXN0YW1wLlxuICAgIC8vIFRoaXMgZ3VhcmRzIGFnYWluc3QgdGhlIGNhc2Ugd2hlcmUgY29tcG9zaXRpb25lbmQgaXMgdHJpZ2dlcmVkIHdpdGhvdXQgdGhlIGtleWJvYXJkXG4gICAgLy8gKGUuZy4gY2hhcmFjdGVyIGNvbmZpcm1hdGlvbiBtYXkgYmUgZG9uZSB3aXRoIHRoZSBtb3VzZSksIGFuZCBrZXlkb3duIGlzIHRyaWdnZXJlZFxuICAgIC8vIGFmdGVyd2FyZHMtIHdlIHdvdWxkbid0IHdhbnQgdG8gaWdub3JlIHRoZSBrZXlkb3duIGV2ZW50IGluIHRoaXMgY2FzZS5cbiAgICBpZiAoc2FmYXJpICYmIE1hdGguYWJzKGV2ZW50LnRpbWVTdGFtcCAtIHZpZXcuaW5wdXQuY29tcG9zaXRpb25FbmRlZEF0KSA8IDUwMCkge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBEcm9wIGFjdGl2ZSBjb21wb3NpdGlvbiBhZnRlciA1IHNlY29uZHMgb2YgaW5hY3Rpdml0eSBvbiBBbmRyb2lkXG5jb25zdCB0aW1lb3V0Q29tcG9zaXRpb24gPSBhbmRyb2lkID8gNTAwMCA6IC0xO1xuZWRpdEhhbmRsZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBlZGl0SGFuZGxlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAoIXZpZXcuY29tcG9zaW5nKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZmx1c2goKTtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsICRwb3MgPSBzdGF0ZS5zZWxlY3Rpb24uJGZyb207XG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiZcbiAgICAgICAgICAgIChzdGF0ZS5zdG9yZWRNYXJrcyB8fFxuICAgICAgICAgICAgICAgICghJHBvcy50ZXh0T2Zmc2V0ICYmICRwb3MucGFyZW50T2Zmc2V0ICYmICRwb3Mubm9kZUJlZm9yZS5tYXJrcy5zb21lKG0gPT4gbS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSkpKSkge1xuICAgICAgICAgICAgLy8gTmVlZCB0byB3cmFwIHRoZSBjdXJzb3IgaW4gbWFyayBub2RlcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lcyBpbiB0aGUgRE9NIGNvbnRleHRcbiAgICAgICAgICAgIHZpZXcubWFya0N1cnNvciA9IHZpZXcuc3RhdGUuc3RvcmVkTWFya3MgfHwgJHBvcy5tYXJrcygpO1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldywgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3Lm1hcmtDdXJzb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldyk7XG4gICAgICAgICAgICAvLyBJbiBmaXJlZm94LCBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIGJ1dCBvdXRzaWRlIGEgbWFya2VkIG5vZGUsXG4gICAgICAgICAgICAvLyB0aGUgaW5zZXJ0ZWQgdGV4dCB3b24ndCBpbmhlcml0IHRoZSBtYXJrcy4gU28gdGhpcyBtb3ZlcyBpdFxuICAgICAgICAgICAgLy8gaW5zaWRlIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgICAgIGlmIChnZWNrbyAmJiBzdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiYgJHBvcy5wYXJlbnRPZmZzZXQgJiYgISRwb3MudGV4dE9mZnNldCAmJiAkcG9zLm5vZGVCZWZvcmUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0OyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgIT0gMDspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG9mZnNldCA8IDAgPyBub2RlLmxhc3RDaGlsZCA6IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRvbVNlbGVjdGlvbigpLmNvbGxhcHNlKGJlZm9yZSwgYmVmb3JlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgdGltZW91dENvbXBvc2l0aW9uKTtcbn07XG5lZGl0SGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSBldmVudC50aW1lU3RhbXA7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IHZpZXcuZG9tT2JzZXJ2ZXIucGVuZGluZ1JlY29yZHMoKS5sZW5ndGggPyB2aWV3LmlucHV0LmNvbXBvc2l0aW9uSUQgOiAwO1xuICAgICAgICBpZiAodmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzKVxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB2aWV3LmRvbU9ic2VydmVyLmZsdXNoKCkpO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uSUQrKztcbiAgICAgICAgc2NoZWR1bGVDb21wb3NlRW5kKHZpZXcsIDIwKTtcbiAgICB9XG59O1xuZnVuY3Rpb24gc2NoZWR1bGVDb21wb3NlRW5kKHZpZXcsIGRlbGF5KSB7XG4gICAgY2xlYXJUaW1lb3V0KHZpZXcuaW5wdXQuY29tcG9zaW5nVGltZW91dCk7XG4gICAgaWYgKGRlbGF5ID4gLTEpXG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gZW5kQ29tcG9zaXRpb24odmlldyksIGRlbGF5KTtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29tcG9zaXRpb24odmlldykge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZykge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IHRpbWVzdGFtcEZyb21DdXN0b21FdmVudCgpO1xuICAgIH1cbiAgICB3aGlsZSAodmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGVzLmxlbmd0aCA+IDApXG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5wb3AoKS5tYXJrUGFyZW50c0RpcnR5KCk7XG59XG5mdW5jdGlvbiB0aW1lc3RhbXBGcm9tQ3VzdG9tRXZlbnQoKSB7XG4gICAgbGV0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBldmVudC5pbml0RXZlbnQoXCJldmVudFwiLCB0cnVlLCB0cnVlKTtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wO1xufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5mdW5jdGlvbiBlbmRDb21wb3NpdGlvbih2aWV3LCBmb3JjZVVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKGFuZHJvaWQgJiYgdmlldy5kb21PYnNlcnZlci5mbHVzaGluZ1Nvb24gPj0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIGNsZWFyQ29tcG9zaXRpb24odmlldyk7XG4gICAgaWYgKGZvcmNlVXBkYXRlIHx8IHZpZXcuZG9jVmlldyAmJiB2aWV3LmRvY1ZpZXcuZGlydHkpIHtcbiAgICAgICAgbGV0IHNlbCA9IHNlbGVjdGlvbkZyb21ET00odmlldyk7XG4gICAgICAgIGlmIChzZWwgJiYgIXNlbC5lcSh2aWV3LnN0YXRlLnNlbGVjdGlvbikpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXcuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2FwdHVyZUNvcHkodmlldywgZG9tKSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGlmICghdmlldy5kb20ucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCB3cmFwID0gdmlldy5kb20ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgd3JhcC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKCksIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZG9tKTtcbiAgICAvLyBEb25lIGJlY2F1c2UgSUUgd2lsbCBmaXJlIGEgc2VsZWN0aW9uY2hhbmdlIG1vdmluZyB0aGUgc2VsZWN0aW9uXG4gICAgLy8gdG8gaXRzIHN0YXJ0IHdoZW4gcmVtb3ZlQWxsUmFuZ2VzIGlzIGNhbGxlZCBhbmQgdGhlIGVkaXRvciBzdGlsbFxuICAgIC8vIGhhcyBmb2N1cyAod2hpY2ggd2lsbCBtZXNzIHVwIHRoZSBlZGl0b3IncyBzZWxlY3Rpb24gc3RhdGUpLlxuICAgIHZpZXcuZG9tLmJsdXIoKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHdyYXAucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHdyYXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSVx1MjAxNGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChpZSAmJiBpZV92ZXJzaW9uIDwgMTUpIHx8XG4gICAgKGlvcyAmJiB3ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5oYW5kbGVycy5jb3B5ID0gZWRpdEhhbmRsZXJzLmN1dCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLCBjdXQgPSBldmVudC50eXBlID09IFwiY3V0XCI7XG4gICAgaWYgKHNlbC5lbXB0eSlcbiAgICAgICAgcmV0dXJuO1xuICAgIC8vIElFIGFuZCBFZGdlJ3MgY2xpcGJvYXJkIGludGVyZmFjZSBpcyBjb21wbGV0ZWx5IGJyb2tlblxuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgbGV0IHNsaWNlID0gc2VsLmNvbnRlbnQoKSwgeyBkb20sIHRleHQgfSA9IHNlcmlhbGl6ZUZvckNsaXBib2FyZCh2aWV3LCBzbGljZSk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9odG1sXCIsIGRvbS5pbm5lckhUTUwpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZUNvcHkodmlldywgZG9tKTtcbiAgICB9XG4gICAgaWYgKGN1dClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJjdXRcIikpO1xufTtcbmZ1bmN0aW9uIHNsaWNlU2luZ2xlTm9kZShzbGljZSkge1xuICAgIHJldHVybiBzbGljZS5vcGVuU3RhcnQgPT0gMCAmJiBzbGljZS5vcGVuRW5kID09IDAgJiYgc2xpY2UuY29udGVudC5jaGlsZENvdW50ID09IDEgPyBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQgOiBudWxsO1xufVxuZnVuY3Rpb24gY2FwdHVyZVBhc3RlKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCF2aWV3LmRvbS5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHBsYWluVGV4dCA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGZyb20ucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCB0YXJnZXQgPSB2aWV3LmRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGxhaW5UZXh0ID8gXCJ0ZXh0YXJlYVwiIDogXCJkaXZcIikpO1xuICAgIGlmICghcGxhaW5UZXh0KVxuICAgICAgICB0YXJnZXQuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICBpZiAodGFyZ2V0LnBhcmVudE5vZGUpXG4gICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpO1xuICAgICAgICBpZiAocGxhaW5UZXh0KVxuICAgICAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUsIG51bGwsIHBsYWluLCBldmVudCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnRleHRDb250ZW50LCB0YXJnZXQuaW5uZXJIVE1MLCBwbGFpbiwgZXZlbnQpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGRvUGFzdGUodmlldywgdGV4dCwgaHRtbCwgcHJlZmVyUGxhaW4sIGV2ZW50KSB7XG4gICAgbGV0IHNsaWNlID0gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHByZWZlclBsYWluLCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbSk7XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVQYXN0ZVwiLCBmID0+IGYodmlldywgZXZlbnQsIHNsaWNlIHx8IFNsaWNlLmVtcHR5KSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghc2xpY2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2luZ2xlTm9kZSA9IHNsaWNlU2luZ2xlTm9kZShzbGljZSk7XG4gICAgbGV0IHRyID0gc2luZ2xlTm9kZVxuICAgICAgICA/IHZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbldpdGgoc2luZ2xlTm9kZSwgcHJlZmVyUGxhaW4pXG4gICAgICAgIDogdmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uKHNsaWNlKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInBhc3RlXCIsIHRydWUpLnNldE1ldGEoXCJ1aUV2ZW50XCIsIFwicGFzdGVcIikpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0VGV4dChjbGlwYm9hcmREYXRhKSB7XG4gICAgbGV0IHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgaWYgKHRleHQpXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGxldCB1cmlzID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC91cmktbGlzdFwiKTtcbiAgICByZXR1cm4gdXJpcyA/IHVyaXMucmVwbGFjZSgvXFxyP1xcbi9nLCBcIiBcIikgOiBcIlwiO1xufVxuZWRpdEhhbmRsZXJzLnBhc3RlID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICAvLyBIYW5kbGluZyBwYXN0ZSBmcm9tIEphdmFTY3JpcHQgZHVyaW5nIGNvbXBvc2l0aW9uIGlzIHZlcnkgcG9vcmx5XG4gICAgLy8gaGFuZGxlZCBieSBicm93c2Vycywgc28gYXMgYSBkb2RneSBidXQgcHJlZmVyYWJsZSBrbHVkZ2UsIHdlIGp1c3RcbiAgICAvLyBsZXQgdGhlIGJyb3dzZXIgZG8gaXRzIG5hdGl2ZSB0aGluZyB0aGVyZSwgZXhjZXB0IG9uIEFuZHJvaWQsXG4gICAgLy8gd2hlcmUgdGhlIGVkaXRvciBpcyBhbG1vc3QgYWx3YXlzIGNvbXBvc2luZy5cbiAgICBpZiAodmlldy5jb21wb3NpbmcgJiYgIWFuZHJvaWQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZGF0YSA9IGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5jbGlwYm9hcmREYXRhO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBpZiAoZGF0YSAmJiBkb1Bhc3RlKHZpZXcsIGdldFRleHQoZGF0YSksIGRhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgcGxhaW4sIGV2ZW50KSlcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBlbHNlXG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3LCBldmVudCk7XG59O1xuY2xhc3MgRHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKHNsaWNlLCBtb3ZlLCBub2RlKSB7XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5tb3ZlID0gbW92ZTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG59XG5jb25zdCBkcmFnQ29weU1vZGlmaWVyID0gbWFjID8gXCJhbHRLZXlcIiA6IFwiY3RybEtleVwiO1xuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBsZXQgbW91c2VEb3duID0gdmlldy5pbnB1dC5tb3VzZURvd247XG4gICAgaWYgKG1vdXNlRG93bilcbiAgICAgICAgbW91c2VEb3duLmRvbmUoKTtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgcG9zID0gc2VsLmVtcHR5ID8gbnVsbCA6IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBsZXQgbm9kZTtcbiAgICBpZiAocG9zICYmIHBvcy5wb3MgPj0gc2VsLmZyb20gJiYgcG9zLnBvcyA8PSAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiA/IHNlbC50byAtIDEgOiBzZWwudG8pKSA7XG4gICAgZWxzZSBpZiAobW91c2VEb3duICYmIG1vdXNlRG93bi5taWdodERyYWcpIHtcbiAgICAgICAgbm9kZSA9IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBtb3VzZURvd24ubWlnaHREcmFnLnBvcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhldmVudC50YXJnZXQsIHRydWUpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLm5vZGUudHlwZS5zcGVjLmRyYWdnYWJsZSAmJiBkZXNjICE9IHZpZXcuZG9jVmlldylcbiAgICAgICAgICAgIG5vZGUgPSBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgZGVzYy5wb3NCZWZvcmUpO1xuICAgIH1cbiAgICBsZXQgc2xpY2UgPSAobm9kZSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbikuY29udGVudCgpLCB7IGRvbSwgdGV4dCB9ID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuY2xlYXJEYXRhKCk7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoYnJva2VuQ2xpcGJvYXJkQVBJID8gXCJUZXh0XCIgOiBcInRleHQvaHRtbFwiLCBkb20uaW5uZXJIVE1MKTtcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yL2lzc3Vlcy8xMTU2XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcImNvcHlNb3ZlXCI7XG4gICAgaWYgKCFicm9rZW5DbGlwYm9hcmRBUEkpXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0ZXh0KTtcbiAgICB2aWV3LmRyYWdnaW5nID0gbmV3IERyYWdnaW5nKHNsaWNlLCAhZXZlbnRbZHJhZ0NvcHlNb2RpZmllcl0sIG5vZGUpO1xufTtcbmhhbmRsZXJzLmRyYWdlbmQgPSB2aWV3ID0+IHtcbiAgICBsZXQgZHJhZ2dpbmcgPSB2aWV3LmRyYWdnaW5nO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXcuZHJhZ2dpbmcgPT0gZHJhZ2dpbmcpXG4gICAgICAgICAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICB9LCA1MCk7XG59O1xuZWRpdEhhbmRsZXJzLmRyYWdvdmVyID0gZWRpdEhhbmRsZXJzLmRyYWdlbnRlciA9IChfLCBlKSA9PiBlLnByZXZlbnREZWZhdWx0KCk7XG5lZGl0SGFuZGxlcnMuZHJvcCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IGRyYWdnaW5nID0gdmlldy5kcmFnZ2luZztcbiAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBldmVudFBvcyA9IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBpZiAoIWV2ZW50UG9zKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0ICRtb3VzZSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZXZlbnRQb3MucG9zKTtcbiAgICBsZXQgc2xpY2UgPSBkcmFnZ2luZyAmJiBkcmFnZ2luZy5zbGljZTtcbiAgICBpZiAoc2xpY2UpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzbGljZSA9IHBhcnNlRnJvbUNsaXBib2FyZCh2aWV3LCBnZXRUZXh0KGV2ZW50LmRhdGFUcmFuc2ZlciksIGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgZmFsc2UsICRtb3VzZSk7XG4gICAgfVxuICAgIGxldCBtb3ZlID0gISEoZHJhZ2dpbmcgJiYgIWV2ZW50W2RyYWdDb3B5TW9kaWZpZXJdKTtcbiAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZURyb3BcIiwgZiA9PiBmKHZpZXcsIGV2ZW50LCBzbGljZSB8fCBTbGljZS5lbXB0eSwgbW92ZSkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFzbGljZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IGluc2VydFBvcyA9IHNsaWNlID8gZHJvcFBvaW50KHZpZXcuc3RhdGUuZG9jLCAkbW91c2UucG9zLCBzbGljZSkgOiAkbW91c2UucG9zO1xuICAgIGlmIChpbnNlcnRQb3MgPT0gbnVsbClcbiAgICAgICAgaW5zZXJ0UG9zID0gJG1vdXNlLnBvcztcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyO1xuICAgIGlmIChtb3ZlKSB7XG4gICAgICAgIGxldCB7IG5vZGUgfSA9IGRyYWdnaW5nO1xuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICAgIG5vZGUucmVwbGFjZSh0cik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBsZXQgcG9zID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICBsZXQgaXNOb2RlID0gc2xpY2Uub3BlblN0YXJ0ID09IDAgJiYgc2xpY2Uub3BlbkVuZCA9PSAwICYmIHNsaWNlLmNvbnRlbnQuY2hpbGRDb3VudCA9PSAxO1xuICAgIGxldCBiZWZvcmVJbnNlcnQgPSB0ci5kb2M7XG4gICAgaWYgKGlzTm9kZSlcbiAgICAgICAgdHIucmVwbGFjZVJhbmdlV2l0aChwb3MsIHBvcywgc2xpY2UuY29udGVudC5maXJzdENoaWxkKTtcbiAgICBlbHNlXG4gICAgICAgIHRyLnJlcGxhY2VSYW5nZShwb3MsIHBvcywgc2xpY2UpO1xuICAgIGlmICh0ci5kb2MuZXEoYmVmb3JlSW5zZXJ0KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCAkcG9zID0gdHIuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoaXNOb2RlICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCkgJiZcbiAgICAgICAgJHBvcy5ub2RlQWZ0ZXIgJiYgJHBvcy5ub2RlQWZ0ZXIuc2FtZU1hcmt1cChzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQpKSB7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihuZXcgTm9kZVNlbGVjdGlvbigkcG9zKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgZW5kID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICAgICAgdHIubWFwcGluZy5tYXBzW3RyLm1hcHBpbmcubWFwcy5sZW5ndGggLSAxXS5mb3JFYWNoKChfZnJvbSwgX3RvLCBfbmV3RnJvbSwgbmV3VG8pID0+IGVuZCA9IG5ld1RvKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkJldHdlZW4odmlldywgJHBvcywgdHIuZG9jLnJlc29sdmUoZW5kKSkpO1xuICAgIH1cbiAgICB2aWV3LmZvY3VzKCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zZXRNZXRhKFwidWlFdmVudFwiLCBcImRyb3BcIikpO1xufTtcbmhhbmRsZXJzLmZvY3VzID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPSBEYXRlLm5vdygpO1xuICAgIGlmICghdmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmRvY1ZpZXcgJiYgdmlldy5oYXNGb2N1cygpICYmICF2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uZXEodmlldy5kb21TZWxlY3Rpb25SYW5nZSgpKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgfSwgMjApO1xuICAgIH1cbn07XG5oYW5kbGVycy5ibHVyID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAodmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAmJiB2aWV3LmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG59O1xuaGFuZGxlcnMuYmVmb3JlaW5wdXQgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIC8vIFdlIHNob3VsZCBwcm9iYWJseSBkbyBtb3JlIHdpdGggYmVmb3JlaW5wdXQgZXZlbnRzLCBidXQgc3VwcG9ydFxuICAgIC8vIGlzIHNvIHNwb3R0eSB0aGF0IEknbSBzdGlsbCB3YWl0aW5nIHRvIHNlZSB3aGVyZSB0aGV5IGFyZSBnb2luZy5cbiAgICAvLyBWZXJ5IHNwZWNpZmljIGhhY2sgdG8gZGVhbCB3aXRoIGJhY2tzcGFjZSBzb21ldGltZXMgZmFpbGluZyBvblxuICAgIC8vIENocm9tZSBBbmRyb2lkIHdoZW4gYWZ0ZXIgYW4gdW5lZGl0YWJsZSBub2RlLlxuICAgIGlmIChjaHJvbWUgJiYgYW5kcm9pZCAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJkZWxldGVDb250ZW50QmFja3dhcmRcIikge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgICAgICBsZXQgeyBkb21DaGFuZ2VDb3VudCB9ID0gdmlldy5pbnB1dDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCAhPSBkb21DaGFuZ2VDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIEV2ZW50IGFscmVhZHkgaGFkIHNvbWUgZWZmZWN0XG4gICAgICAgICAgICAvLyBUaGlzIGJ1ZyB0ZW5kcyB0byBjbG9zZSB0aGUgdmlydHVhbCBrZXlib2FyZCwgc28gd2UgcmVmb2N1c1xuICAgICAgICAgICAgdmlldy5kb20uYmx1cigpO1xuICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCg4LCBcIkJhY2tzcGFjZVwiKSkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgLy8gQ3J1ZGUgYXBwcm94aW1hdGlvbiBvZiBiYWNrc3BhY2UgYmVoYXZpb3Igd2hlbiBubyBjb21tYW5kIGhhbmRsZWQgaXRcbiAgICAgICAgICAgIGlmICgkY3Vyc29yICYmICRjdXJzb3IucG9zID4gMClcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlKCRjdXJzb3IucG9zIC0gMSwgJGN1cnNvci5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbi8vIE1ha2Ugc3VyZSBhbGwgaGFuZGxlcnMgZ2V0IHJlZ2lzdGVyZWRcbmZvciAobGV0IHByb3AgaW4gZWRpdEhhbmRsZXJzKVxuICAgIGhhbmRsZXJzW3Byb3BdID0gZWRpdEhhbmRsZXJzW3Byb3BdO1xuXG5mdW5jdGlvbiBjb21wYXJlT2JqcyhhLCBiKSB7XG4gICAgaWYgKGEgPT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICBpZiAoYVtwXSAhPT0gYltwXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgIGlmICghKHAgaW4gYSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jbGFzcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0b0RPTSwgc3BlYykge1xuICAgICAgICB0aGlzLnRvRE9NID0gdG9ET007XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgICAgICB0aGlzLnNpZGUgPSB0aGlzLnNwZWMuc2lkZSB8fCAwO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IHsgcG9zLCBkZWxldGVkIH0gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIHRoaXMuc2lkZSA8IDAgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gZGVsZXRlZCA/IG51bGwgOiBuZXcgRGVjb3JhdGlvbihwb3MgLSBvZmZzZXQsIHBvcyAtIG9mZnNldCwgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRUeXBlICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuc3BlYy5rZXkgJiYgdGhpcy5zcGVjLmtleSA9PSBvdGhlci5zcGVjLmtleSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvRE9NID09IG90aGVyLnRvRE9NICYmIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpKTtcbiAgICB9XG4gICAgZGVzdHJveShub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnNwZWMuZGVzdHJveSlcbiAgICAgICAgICAgIHRoaXMuc3BlYy5kZXN0cm95KG5vZGUpO1xuICAgIH1cbn1cbmNsYXNzIElubGluZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYyB8fCBub1NwZWM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBzcGFuLCBvZmZzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKHNwYW4uZnJvbSArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZVN0YXJ0ID8gLTEgOiAxKSAtIG9mZnNldDtcbiAgICAgICAgbGV0IHRvID0gbWFwcGluZy5tYXAoc3Bhbi50byArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZUVuZCA/IDEgOiAtMSkgLSBvZmZzZXQ7XG4gICAgICAgIHJldHVybiBmcm9tID49IHRvID8gbnVsbCA6IG5ldyBEZWNvcmF0aW9uKGZyb20sIHRvLCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQoXywgc3BhbikgeyByZXR1cm4gc3Bhbi5mcm9tIDwgc3Bhbi50bzsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBJbmxpbmVUeXBlICYmIGNvbXBhcmVPYmpzKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpO1xuICAgIH1cbiAgICBzdGF0aWMgaXMoc3BhbikgeyByZXR1cm4gc3Bhbi50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihhdHRycywgc3BlYykge1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIDEpO1xuICAgICAgICBpZiAoZnJvbS5kZWxldGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHNwYW4udG8gKyBvbGRPZmZzZXQsIC0xKTtcbiAgICAgICAgaWYgKHRvLmRlbGV0ZWQgfHwgdG8ucG9zIDw9IGZyb20ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLnBvcyAtIG9mZnNldCwgdG8ucG9zIC0gb2Zmc2V0LCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQobm9kZSwgc3Bhbikge1xuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHNwYW4uZnJvbSksIGNoaWxkO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID09IHNwYW4uZnJvbSAmJiAhKGNoaWxkID0gbm9kZS5jaGlsZChpbmRleCkpLmlzVGV4dCAmJiBvZmZzZXQgKyBjaGlsZC5ub2RlU2l6ZSA9PSBzcGFuLnRvO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgTm9kZVR5cGUgJiYgY29tcGFyZU9ianModGhpcy5hdHRycywgb3RoZXIuYXR0cnMpICYmXG4gICAgICAgICAgICAgICAgY29tcGFyZU9ianModGhpcy5zcGVjLCBvdGhlci5zcGVjKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbi8qKlxuRGVjb3JhdGlvbiBvYmplY3RzIGNhbiBiZSBwcm92aWRlZCB0byB0aGUgdmlldyB0aHJvdWdoIHRoZVxuW2BkZWNvcmF0aW9uc2AgcHJvcF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuZGVjb3JhdGlvbnMpLiBUaGV5IGNvbWUgaW5cbnNldmVyYWwgdmFyaWFudHNcdTIwMTRzZWUgdGhlIHN0YXRpYyBtZW1iZXJzIG9mIHRoaXMgY2xhc3MgZm9yIGRldGFpbHMuXG4qL1xuY2xhc3MgRGVjb3JhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uLiBXaWxsIGJlIHRoZSBzYW1lIGFzIGBmcm9tYCBmb3IgW3dpZGdldFxuICAgIGRlY29yYXRpb25zXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXndpZGdldCkuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb3B5KGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgdGhpcy50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlcShvdGhlciwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVxKG90aGVyLnR5cGUpICYmIHRoaXMuZnJvbSArIG9mZnNldCA9PSBvdGhlci5mcm9tICYmIHRoaXMudG8gKyBvZmZzZXQgPT0gb3RoZXIudG87XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUubWFwKG1hcHBpbmcsIHRoaXMsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBpcyBhIERPTSBub2RlIHRoYXQncyBzaG93biBpblxuICAgIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91XG4gICAgZGVsYXkgcmVuZGVyaW5nIHRoZSB3aWRnZXQgYnkgcGFzc2luZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZVxuICAgIGNhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgYWN0dWFsbHkgZHJhd24gaW4gYSB2aWV3LCBidXQgeW91IGNhblxuICAgIGFsc28gZGlyZWN0bHkgcGFzcyBhIERPTSBub2RlLiBgZ2V0UG9zYCBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZVxuICAgIHdpZGdldCdzIGN1cnJlbnQgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHBvcywgdG9ET00sIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKHBvcywgcG9zLCBuZXcgV2lkZ2V0VHlwZSh0b0RPTSwgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGVzIGFuIGlubGluZSBkZWNvcmF0aW9uLCB3aGljaCBhZGRzIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIHRvXG4gICAgZWFjaCBpbmxpbmUgbm9kZSBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbiAgICAqL1xuICAgIHN0YXRpYyBpbmxpbmUoZnJvbSwgdG8sIGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgbmV3IElubGluZVR5cGUoYXR0cnMsIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIG5vZGUgZGVjb3JhdGlvbi4gYGZyb21gIGFuZCBgdG9gIHNob3VsZCBwb2ludCBwcmVjaXNlbHlcbiAgICBiZWZvcmUgYW5kIGFmdGVyIGEgbm9kZSBpbiB0aGUgZG9jdW1lbnQuIFRoYXQgbm9kZSwgYW5kIG9ubHkgdGhhdFxuICAgIG5vZGUsIHdpbGwgcmVjZWl2ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBub2RlKGZyb20sIHRvLCBhdHRycywgc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIG5ldyBOb2RlVHlwZShhdHRycywgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3BlYyBwcm92aWRlZCB3aGVuIGNyZWF0aW5nIHRoaXMgZGVjb3JhdGlvbi4gQ2FuIGJlIHVzZWZ1bFxuICAgIGlmIHlvdSd2ZSBzdG9yZWQgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhhdCBvYmplY3QuXG4gICAgKi9cbiAgICBnZXQgc3BlYygpIHsgcmV0dXJuIHRoaXMudHlwZS5zcGVjOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaW5saW5lKCkgeyByZXR1cm4gdGhpcy50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHdpZGdldCgpIHsgcmV0dXJuIHRoaXMudHlwZSBpbnN0YW5jZW9mIFdpZGdldFR5cGU7IH1cbn1cbmNvbnN0IG5vbmUgPSBbXSwgbm9TcGVjID0ge307XG4vKipcbkEgY29sbGVjdGlvbiBvZiBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pLCBvcmdhbml6ZWQgaW4gc3VjaFxuYSB3YXkgdGhhdCB0aGUgZHJhd2luZyBhbGdvcml0aG0gY2FuIGVmZmljaWVudGx5IHVzZSBhbmQgY29tcGFyZVxudGhlbS4gVGhpcyBpcyBhIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVcdTIwMTRpdCBpcyBub3QgbW9kaWZpZWQsXG51cGRhdGVzIGNyZWF0ZSBhIG5ldyB2YWx1ZS5cbiovXG5jbGFzcyBEZWNvcmF0aW9uU2V0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsLCBjaGlsZHJlbikge1xuICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWwubGVuZ3RoID8gbG9jYWwgOiBub25lO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW4gOiBub25lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZGVjb3JhdGlvbnMsIHVzaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdpdmVuXG4gICAgZG9jdW1lbnQuIFRoaXMgd2lsbCBjb25zdW1lIChtb2RpZnkpIHRoZSBgZGVjb3JhdGlvbnNgIGFycmF5LCBzb1xuICAgIHlvdSBtdXN0IG1ha2UgYSBjb3B5IGlmIHlvdSB3YW50IG5lZWQgdG8gcHJlc2VydmUgdGhhdC5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZG9jLCBkZWNvcmF0aW9ucykge1xuICAgICAgICByZXR1cm4gZGVjb3JhdGlvbnMubGVuZ3RoID8gYnVpbGRUcmVlKGRlY29yYXRpb25zLCBkb2MsIDAsIG5vU3BlYykgOiBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhbGwgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQgd2hpY2ggdG91Y2ggdGhlIGdpdmVuIHJhbmdlXG4gICAgKGluY2x1ZGluZyBkZWNvcmF0aW9ucyB0aGF0IHN0YXJ0IG9yIGVuZCBkaXJlY3RseSBhdCB0aGVcbiAgICBib3VuZGFyaWVzKSBhbmQgbWF0Y2ggdGhlIGdpdmVuIHByZWRpY2F0ZSBvbiB0aGVpciBzcGVjLiBXaGVuXG4gICAgYHN0YXJ0YCBhbmQgYGVuZGAgYXJlIG9taXR0ZWQsIGFsbCBkZWNvcmF0aW9ucyBpbiB0aGUgc2V0IGFyZVxuICAgIGNvbnNpZGVyZWQuIFdoZW4gYHByZWRpY2F0ZWAgaXNuJ3QgZ2l2ZW4sIGFsbCBkZWNvcmF0aW9ucyBhcmVcbiAgICBhc3N1bWVkIHRvIG1hdGNoLlxuICAgICovXG4gICAgZmluZChzdGFydCwgZW5kLCBwcmVkaWNhdGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZpbmRJbm5lcihzdGFydCA9PSBudWxsID8gMCA6IHN0YXJ0LCBlbmQgPT0gbnVsbCA/IDFlOSA6IGVuZCwgcmVzdWx0LCAwLCBwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmaW5kSW5uZXIoc3RhcnQsIGVuZCwgcmVzdWx0LCBvZmZzZXQsIHByZWRpY2F0ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gdGhpcy5sb2NhbFtpXTtcbiAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPD0gZW5kICYmIHNwYW4udG8gPj0gc3RhcnQgJiYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHNwYW4uc3BlYykpKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYW4uY29weShzcGFuLmZyb20gKyBvZmZzZXQsIHNwYW4udG8gKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldIDwgZW5kICYmIHRoaXMuY2hpbGRyZW5baSArIDFdID4gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPZmYgPSB0aGlzLmNoaWxkcmVuW2ldICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2kgKyAyXS5maW5kSW5uZXIoc3RhcnQgLSBjaGlsZE9mZiwgZW5kIC0gY2hpbGRPZmYsIHJlc3VsdCwgb2Zmc2V0ICsgY2hpbGRPZmYsIHByZWRpY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoZSBzZXQgb2YgZGVjb3JhdGlvbnMgaW4gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZywgZG9jLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5IHx8IG1hcHBpbmcubWFwcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBJbm5lcihtYXBwaW5nLCBkb2MsIDAsIDAsIG9wdGlvbnMgfHwgbm9TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXBJbm5lcihtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgbmV3TG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMubG9jYWxbaV0ubWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQgJiYgbWFwcGVkLnR5cGUudmFsaWQobm9kZSwgbWFwcGVkKSlcbiAgICAgICAgICAgICAgICAobmV3TG9jYWwgfHwgKG5ld0xvY2FsID0gW10pKS5wdXNoKG1hcHBlZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUodGhpcy5sb2NhbFtpXS5zcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbWFwQ2hpbGRyZW4odGhpcy5jaGlsZHJlbiwgbmV3TG9jYWwgfHwgW10sIG1hcHBpbmcsIG5vZGUsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ld0xvY2FsID8gbmV3IERlY29yYXRpb25TZXQobmV3TG9jYWwuc29ydChieVBvcyksIG5vbmUpIDogZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gYXJyYXkgb2YgZGVjb3JhdGlvbnMgdG8gdGhlIG9uZXMgaW4gdGhlIHNldCxcbiAgICBwcm9kdWNpbmcgYSBuZXcgc2V0LiBDb25zdW1lcyB0aGUgYGRlY29yYXRpb25zYCBhcnJheS4gTmVlZHNcbiAgICBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0cmVlXG4gICAgc3RydWN0dXJlLlxuICAgICovXG4gICAgYWRkKGRvYywgZGVjb3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFkZWNvcmF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZElubmVyKGRvYywgZGVjb3JhdGlvbnMsIDApO1xuICAgIH1cbiAgICBhZGRJbm5lcihkb2MsIGRlY29yYXRpb25zLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuLCBjaGlsZEluZGV4ID0gMDtcbiAgICAgICAgZG9jLmZvckVhY2goKGNoaWxkTm9kZSwgY2hpbGRPZmZzZXQpID0+IHtcbiAgICAgICAgICAgIGxldCBiYXNlT2Zmc2V0ID0gY2hpbGRPZmZzZXQgKyBvZmZzZXQsIGZvdW5kO1xuICAgICAgICAgICAgaWYgKCEoZm91bmQgPSB0YWtlU3BhbnNGb3JOb2RlKGRlY29yYXRpb25zLCBjaGlsZE5vZGUsIGJhc2VPZmZzZXQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkSW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5bY2hpbGRJbmRleF0gPCBjaGlsZE9mZnNldClcbiAgICAgICAgICAgICAgICBjaGlsZEluZGV4ICs9IDM7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5bY2hpbGRJbmRleF0gPT0gY2hpbGRPZmZzZXQpXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdID0gY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdLmFkZElubmVyKGNoaWxkTm9kZSwgZm91bmQsIGJhc2VPZmZzZXQgKyAxKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoY2hpbGRJbmRleCwgMCwgY2hpbGRPZmZzZXQsIGNoaWxkT2Zmc2V0ICsgY2hpbGROb2RlLm5vZGVTaXplLCBidWlsZFRyZWUoZm91bmQsIGNoaWxkTm9kZSwgYmFzZU9mZnNldCArIDEsIG5vU3BlYykpO1xuICAgICAgICAgICAgY2hpbGRJbmRleCArPSAzO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxvY2FsID0gbW92ZVNwYW5zKGNoaWxkSW5kZXggPyB3aXRob3V0TnVsbHMoZGVjb3JhdGlvbnMpIDogZGVjb3JhdGlvbnMsIC1vZmZzZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFsb2NhbFtpXS50eXBlLnZhbGlkKGRvYywgbG9jYWxbaV0pKVxuICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShpLS0sIDEpO1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb25TZXQobG9jYWwubGVuZ3RoID8gdGhpcy5sb2NhbC5jb25jYXQobG9jYWwpLnNvcnQoYnlQb3MpIDogdGhpcy5sb2NhbCwgY2hpbGRyZW4gfHwgdGhpcy5jaGlsZHJlbik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzZXQgdGhhdCBjb250YWlucyB0aGUgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQsIG1pbnVzXG4gICAgdGhlIG9uZXMgaW4gdGhlIGdpdmVuIGFycmF5LlxuICAgICovXG4gICAgcmVtb3ZlKGRlY29yYXRpb25zKSB7XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUlubmVyKGRlY29yYXRpb25zLCAwKTtcbiAgICB9XG4gICAgcmVtb3ZlSW5uZXIoZGVjb3JhdGlvbnMsIG9mZnNldCkge1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLCBsb2NhbCA9IHRoaXMubG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZDtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY2hpbGRyZW5baV0gKyBvZmZzZXQsIHRvID0gY2hpbGRyZW5baSArIDFdICsgb2Zmc2V0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIHNwYW47IGogPCBkZWNvcmF0aW9ucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoc3BhbiA9IGRlY29yYXRpb25zW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPiBmcm9tICYmIHNwYW4udG8gPCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbnNbal0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGZvdW5kIHx8IChmb3VuZCA9IFtdKSkucHVzaChzcGFuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gY2hpbGRyZW5baSArIDJdLnJlbW92ZUlubmVyKGZvdW5kLCBmcm9tICsgMSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZCAhPSBlbXB0eSkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAyXSA9IHJlbW92ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMyk7XG4gICAgICAgICAgICAgICAgaSAtPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbC5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgc3BhbjsgaSA8IGRlY29yYXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChzcGFuID0gZGVjb3JhdGlvbnNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsb2NhbC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFtqXS5lcShzcGFuLCBvZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsID09IHRoaXMubG9jYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gdGhpcy5sb2NhbC5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuID09IHRoaXMuY2hpbGRyZW4gJiYgbG9jYWwgPT0gdGhpcy5sb2NhbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbG9jYWwubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA/IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLCBjaGlsZHJlbikgOiBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3JDaGlsZChvZmZzZXQsIG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuZW1wdHk7XG4gICAgICAgIGxldCBjaGlsZCwgbG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldID49IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldID09IG9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2kgKyAyXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gb2Zmc2V0ICsgMSwgZW5kID0gc3RhcnQgKyBub2RlLmNvbnRlbnQuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZGVjID0gdGhpcy5sb2NhbFtpXTtcbiAgICAgICAgICAgIGlmIChkZWMuZnJvbSA8IGVuZCAmJiBkZWMudG8gPiBzdGFydCAmJiAoZGVjLnR5cGUgaW5zdGFuY2VvZiBJbmxpbmVUeXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoc3RhcnQsIGRlYy5mcm9tKSAtIHN0YXJ0LCB0byA9IE1hdGgubWluKGVuZCwgZGVjLnRvKSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pXG4gICAgICAgICAgICAgICAgICAgIChsb2NhbCB8fCAobG9jYWwgPSBbXSkpLnB1c2goZGVjLmNvcHkoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICAgIGxldCBsb2NhbFNldCA9IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLnNvcnQoYnlQb3MpLCBub25lKTtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZCA/IG5ldyBEZWNvcmF0aW9uR3JvdXAoW2xvY2FsU2V0LCBjaGlsZF0pIDogbG9jYWxTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkIHx8IGVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzID09IG90aGVyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRGVjb3JhdGlvblNldCkgfHxcbiAgICAgICAgICAgIHRoaXMubG9jYWwubGVuZ3RoICE9IG90aGVyLmxvY2FsLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggIT0gb3RoZXIuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMubG9jYWxbaV0uZXEob3RoZXIubG9jYWxbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0gIT0gb3RoZXIuY2hpbGRyZW5baV0gfHxcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2kgKyAxXSAhPSBvdGhlci5jaGlsZHJlbltpICsgMV0gfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5jaGlsZHJlbltpICsgMl0uZXEob3RoZXIuY2hpbGRyZW5baSArIDJdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGxvY2Fscyhub2RlKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVPdmVybGFwKHRoaXMubG9jYWxzSW5uZXIobm9kZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGxvY2Fsc0lubmVyKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gbm9uZTtcbiAgICAgICAgaWYgKG5vZGUuaW5saW5lQ29udGVudCB8fCAhdGhpcy5sb2NhbC5zb21lKElubGluZVR5cGUuaXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWw7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmxvY2FsW2ldLnR5cGUgaW5zdGFuY2VvZiBJbmxpbmVUeXBlKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmxvY2FsW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiBkZWNvcmF0aW9ucy5cbiovXG5EZWNvcmF0aW9uU2V0LmVtcHR5ID0gbmV3IERlY29yYXRpb25TZXQoW10sIFtdKTtcbi8qKlxuQGludGVybmFsXG4qL1xuRGVjb3JhdGlvblNldC5yZW1vdmVPdmVybGFwID0gcmVtb3ZlT3ZlcmxhcDtcbmNvbnN0IGVtcHR5ID0gRGVjb3JhdGlvblNldC5lbXB0eTtcbi8vIEFuIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIHRoZSBjb2RlIGRlYWxpbmcgd2l0aCBkZWNvcmF0aW9ucyB0b1xuLy8gdHJlYXQgbXVsdGlwbGUgRGVjb3JhdGlvblNldCBvYmplY3RzIGFzIGlmIGl0IHdlcmUgYSBzaW5nbGUgb2JqZWN0XG4vLyB3aXRoIChhIHN1YnNldCBvZikgdGhlIHNhbWUgaW50ZXJmYWNlLlxuY2xhc3MgRGVjb3JhdGlvbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihtZW1iZXJzKSB7XG4gICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBkb2MpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkRGVjb3MgPSB0aGlzLm1lbWJlcnMubWFwKG1lbWJlciA9PiBtZW1iZXIubWFwKG1hcHBpbmcsIGRvYywgbm9TcGVjKSk7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShtYXBwZWREZWNvcyk7XG4gICAgfVxuICAgIGZvckNoaWxkKG9mZnNldCwgY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmVtcHR5O1xuICAgICAgICBsZXQgZm91bmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm1lbWJlcnNbaV0uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09IGVtcHR5KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIERlY29yYXRpb25Hcm91cClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kLmNvbmNhdChyZXN1bHQubWVtYmVycyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm91bmQucHVzaChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShmb3VuZCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRGVjb3JhdGlvbkdyb3VwKSB8fFxuICAgICAgICAgICAgb3RoZXIubWVtYmVycy5sZW5ndGggIT0gdGhpcy5tZW1iZXJzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMubWVtYmVyc1tpXS5lcShvdGhlci5tZW1iZXJzW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsb2NhbHMobm9kZSkge1xuICAgICAgICBsZXQgcmVzdWx0LCBzb3J0ZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxvY2FscyA9IHRoaXMubWVtYmVyc1tpXS5sb2NhbHNJbm5lcihub2RlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9jYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWxzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsb2NhbHNbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgPyByZW1vdmVPdmVybGFwKHNvcnRlZCA/IHJlc3VsdCA6IHJlc3VsdC5zb3J0KGJ5UG9zKSkgOiBub25lO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGRlY29yYXRpb24gc2V0cywgb3IgcmV0dXJuXG4gICAgLy8gYSBzaW5nbGUgc2V0IHdoZW4gcG9zc2libGUuXG4gICAgc3RhdGljIGZyb20obWVtYmVycykge1xuICAgICAgICBzd2l0Y2ggKG1lbWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG1lbWJlcnNbMF07XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gbmV3IERlY29yYXRpb25Hcm91cChtZW1iZXJzLmV2ZXJ5KG0gPT4gbSBpbnN0YW5jZW9mIERlY29yYXRpb25TZXQpID8gbWVtYmVycyA6XG4gICAgICAgICAgICAgICAgbWVtYmVycy5yZWR1Y2UoKHIsIG0pID0+IHIuY29uY2F0KG0gaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0ID8gbSA6IG0ubWVtYmVycyksIFtdKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXBDaGlsZHJlbihvbGRDaGlsZHJlbiwgbmV3TG9jYWwsIG1hcHBpbmcsIG5vZGUsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgbGV0IGNoaWxkcmVuID0gb2xkQ2hpbGRyZW4uc2xpY2UoKTtcbiAgICAvLyBNYXJrIHRoZSBjaGlsZHJlbiB0aGF0IGFyZSBkaXJlY3RseSB0b3VjaGVkIGJ5IGNoYW5nZXMsIGFuZFxuICAgIC8vIG1vdmUgdGhvc2UgdGhhdCBhcmUgYWZ0ZXIgdGhlIGNoYW5nZXMuXG4gICAgZm9yIChsZXQgaSA9IDAsIGJhc2VPZmZzZXQgPSBvbGRPZmZzZXQ7IGkgPCBtYXBwaW5nLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG1vdmVkID0gMDtcbiAgICAgICAgbWFwcGluZy5tYXBzW2ldLmZvckVhY2goKG9sZFN0YXJ0LCBvbGRFbmQsIG5ld1N0YXJ0LCBuZXdFbmQpID0+IHtcbiAgICAgICAgICAgIGxldCBkU2l6ZSA9IChuZXdFbmQgLSBuZXdTdGFydCkgLSAob2xkRW5kIC0gb2xkU3RhcnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBjaGlsZHJlbltpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA8IDAgfHwgb2xkU3RhcnQgPiBlbmQgKyBiYXNlT2Zmc2V0IC0gbW92ZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGNoaWxkcmVuW2ldICsgYmFzZU9mZnNldCAtIG1vdmVkO1xuICAgICAgICAgICAgICAgIGlmIChvbGRFbmQgPj0gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gb2xkU3RhcnQgPD0gc3RhcnQgPyAtMiA6IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvbGRTdGFydCA+PSBiYXNlT2Zmc2V0ICYmIGRTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldICs9IGRTaXplO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gKz0gZFNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbW92ZWQgKz0gZFNpemU7XG4gICAgICAgIH0pO1xuICAgICAgICBiYXNlT2Zmc2V0ID0gbWFwcGluZy5tYXBzW2ldLm1hcChiYXNlT2Zmc2V0LCAtMSk7XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIGNoaWxkIG5vZGVzIHRoYXQgc3RpbGwgY29ycmVzcG9uZCB0byBhIHNpbmdsZSBub2RlLFxuICAgIC8vIHJlY3Vyc2l2ZWx5IGNhbGwgbWFwSW5uZXIgb24gdGhlbSBhbmQgdXBkYXRlIHRoZWlyIHBvc2l0aW9ucy5cbiAgICBsZXQgbXVzdFJlYnVpbGQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdIDwgMCkgeyAvLyBUb3VjaGVkIG5vZGVzXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdID09IC0yKSB7XG4gICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IC0xO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcChvbGRDaGlsZHJlbltpXSArIG9sZE9mZnNldCksIGZyb21Mb2NhbCA9IGZyb20gLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoZnJvbUxvY2FsIDwgMCB8fCBmcm9tTG9jYWwgPj0gbm9kZS5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNdXN0IHJlYWQgb2xkQ2hpbGRyZW4gYmVjYXVzZSBjaGlsZHJlbiB3YXMgdGFnZ2VkIHdpdGggLTFcbiAgICAgICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwKG9sZENoaWxkcmVuW2kgKyAxXSArIG9sZE9mZnNldCwgLTEpLCB0b0xvY2FsID0gdG8gLSBvZmZzZXQ7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0OiBjaGlsZE9mZnNldCB9ID0gbm9kZS5jb250ZW50LmZpbmRJbmRleChmcm9tTG9jYWwpO1xuICAgICAgICAgICAgbGV0IGNoaWxkTm9kZSA9IG5vZGUubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgICAgICBpZiAoY2hpbGROb2RlICYmIGNoaWxkT2Zmc2V0ID09IGZyb21Mb2NhbCAmJiBjaGlsZE9mZnNldCArIGNoaWxkTm9kZS5ub2RlU2l6ZSA9PSB0b0xvY2FsKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGNoaWxkcmVuW2kgKyAyXVxuICAgICAgICAgICAgICAgICAgICAubWFwSW5uZXIobWFwcGluZywgY2hpbGROb2RlLCBmcm9tICsgMSwgb2xkQ2hpbGRyZW5baV0gKyBvbGRPZmZzZXQgKyAxLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkICE9IGVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gZnJvbUxvY2FsO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSB0b0xvY2FsO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMl0gPSBtYXBwZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIC8vIFJlbWFpbmluZyBjaGlsZHJlbiBtdXN0IGJlIGNvbGxlY3RlZCBhbmQgcmVidWlsdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmVcbiAgICBpZiAobXVzdFJlYnVpbGQpIHtcbiAgICAgICAgbGV0IGRlY29yYXRpb25zID0gbWFwQW5kR2F0aGVyUmVtYWluaW5nRGVjb3JhdGlvbnMoY2hpbGRyZW4sIG9sZENoaWxkcmVuLCBuZXdMb2NhbCwgbWFwcGluZywgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgYnVpbHQgPSBidWlsZFRyZWUoZGVjb3JhdGlvbnMsIG5vZGUsIDAsIG9wdGlvbnMpO1xuICAgICAgICBuZXdMb2NhbCA9IGJ1aWx0LmxvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA8IDApIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMyk7XG4gICAgICAgICAgICAgICAgaSAtPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCBidWlsdC5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBidWlsdC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIHdoaWxlIChqIDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuW2pdIDwgZnJvbSlcbiAgICAgICAgICAgICAgICBqICs9IDM7XG4gICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaiwgMCwgYnVpbHQuY2hpbGRyZW5baV0sIGJ1aWx0LmNoaWxkcmVuW2kgKyAxXSwgYnVpbHQuY2hpbGRyZW5baSArIDJdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IERlY29yYXRpb25TZXQobmV3TG9jYWwuc29ydChieVBvcyksIGNoaWxkcmVuKTtcbn1cbmZ1bmN0aW9uIG1vdmVTcGFucyhzcGFucywgb2Zmc2V0KSB7XG4gICAgaWYgKCFvZmZzZXQgfHwgIXNwYW5zLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIHNwYW5zO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzcGFuID0gc3BhbnNbaV07XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBEZWNvcmF0aW9uKHNwYW4uZnJvbSArIG9mZnNldCwgc3Bhbi50byArIG9mZnNldCwgc3Bhbi50eXBlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXBBbmRHYXRoZXJSZW1haW5pbmdEZWNvcmF0aW9ucyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIGRlY29yYXRpb25zLCBtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgIC8vIEdhdGhlciBhbGwgZGVjb3JhdGlvbnMgZnJvbSB0aGUgcmVtYWluaW5nIG1hcmtlZCBjaGlsZHJlblxuICAgIGZ1bmN0aW9uIGdhdGhlcihzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IHNldC5sb2NhbFtpXS5tYXAobWFwcGluZywgb2Zmc2V0LCBvbGRPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKG1hcHBlZClcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcHBlZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUoc2V0LmxvY2FsW2ldLnNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgZ2F0aGVyKHNldC5jaGlsZHJlbltpICsgMl0sIHNldC5jaGlsZHJlbltpXSArIG9sZE9mZnNldCArIDEpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdID09IC0xKVxuICAgICAgICAgICAgZ2F0aGVyKGNoaWxkcmVuW2kgKyAyXSwgb2xkQ2hpbGRyZW5baV0gKyBvbGRPZmZzZXQgKyAxKTtcbiAgICByZXR1cm4gZGVjb3JhdGlvbnM7XG59XG5mdW5jdGlvbiB0YWtlU3BhbnNGb3JOb2RlKHNwYW5zLCBub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5pc0xlYWYpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBlbmQgPSBvZmZzZXQgKyBub2RlLm5vZGVTaXplLCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDAsIHNwYW47IGkgPCBzcGFucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoKHNwYW4gPSBzcGFuc1tpXSkgJiYgc3Bhbi5mcm9tID4gb2Zmc2V0ICYmIHNwYW4udG8gPCBlbmQpIHtcbiAgICAgICAgICAgIChmb3VuZCB8fCAoZm91bmQgPSBbXSkpLnB1c2goc3Bhbik7XG4gICAgICAgICAgICBzcGFuc1tpXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gd2l0aG91dE51bGxzKGFycmF5KSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChhcnJheVtpXSAhPSBudWxsKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyYXlbaV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBCdWlsZCB1cCBhIHRyZWUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNldCBvZiBkZWNvcmF0aW9ucy4gYG9mZnNldGBcbi8vIGlzIGEgYmFzZSBvZmZzZXQgdGhhdCBzaG91bGQgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBgZnJvbWAgYW5kIGB0b2Bcbi8vIHBvc2l0aW9ucyBpbiB0aGUgc3BhbnMgKHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBhbGxvY2F0ZSBuZXcgc3BhbnNcbi8vIGZvciByZWN1cnNpdmUgY2FsbHMpLlxuZnVuY3Rpb24gYnVpbGRUcmVlKHNwYW5zLCBub2RlLCBvZmZzZXQsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2hpbGRyZW4gPSBbXSwgaGFzTnVsbHMgPSBmYWxzZTtcbiAgICBub2RlLmZvckVhY2goKGNoaWxkTm9kZSwgbG9jYWxTdGFydCkgPT4ge1xuICAgICAgICBsZXQgZm91bmQgPSB0YWtlU3BhbnNGb3JOb2RlKHNwYW5zLCBjaGlsZE5vZGUsIGxvY2FsU3RhcnQgKyBvZmZzZXQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGhhc051bGxzID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBzdWJ0cmVlID0gYnVpbGRUcmVlKGZvdW5kLCBjaGlsZE5vZGUsIG9mZnNldCArIGxvY2FsU3RhcnQgKyAxLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChzdWJ0cmVlICE9IGVtcHR5KVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobG9jYWxTdGFydCwgbG9jYWxTdGFydCArIGNoaWxkTm9kZS5ub2RlU2l6ZSwgc3VidHJlZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgbG9jYWxzID0gbW92ZVNwYW5zKGhhc051bGxzID8gd2l0aG91dE51bGxzKHNwYW5zKSA6IHNwYW5zLCAtb2Zmc2V0KS5zb3J0KGJ5UG9zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2Fscy5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFsb2NhbHNbaV0udHlwZS52YWxpZChub2RlLCBsb2NhbHNbaV0pKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5vblJlbW92ZSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVtb3ZlKGxvY2Fsc1tpXS5zcGVjKTtcbiAgICAgICAgICAgIGxvY2Fscy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBsb2NhbHMubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA/IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FscywgY2hpbGRyZW4pIDogZW1wdHk7XG59XG4vLyBVc2VkIHRvIHNvcnQgZGVjb3JhdGlvbnMgc28gdGhhdCBvbmVzIHdpdGggYSBsb3cgc3RhcnQgcG9zaXRpb25cbi8vIGNvbWUgZmlyc3QsIGFuZCB3aXRoaW4gYSBzZXQgd2l0aCB0aGUgc2FtZSBzdGFydCBwb3NpdGlvbiwgdGhvc2Vcbi8vIHdpdGggYW4gc21hbGxlciBlbmQgcG9zaXRpb24gY29tZSBmaXJzdC5cbmZ1bmN0aW9uIGJ5UG9zKGEsIGIpIHtcbiAgICByZXR1cm4gYS5mcm9tIC0gYi5mcm9tIHx8IGEudG8gLSBiLnRvO1xufVxuLy8gU2NhbiBhIHNvcnRlZCBhcnJheSBvZiBkZWNvcmF0aW9ucyBmb3IgcGFydGlhbGx5IG92ZXJsYXBwaW5nIHNwYW5zLFxuLy8gYW5kIHNwbGl0IHRob3NlIHNvIHRoYXQgb25seSBmdWxseSBvdmVybGFwcGluZyBzcGFucyBhcmUgbGVmdCAodG9cbi8vIG1ha2Ugc3Vic2VxdWVudCByZW5kZXJpbmcgZWFzaWVyKS4gV2lsbCByZXR1cm4gdGhlIGlucHV0IGFycmF5IGlmXG4vLyBubyBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgc3BhbnMgYXJlIGZvdW5kICh0aGUgY29tbW9uIGNhc2UpLlxuZnVuY3Rpb24gcmVtb3ZlT3ZlcmxhcChzcGFucykge1xuICAgIGxldCB3b3JraW5nID0gc3BhbnM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JraW5nLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBsZXQgc3BhbiA9IHdvcmtpbmdbaV07XG4gICAgICAgIGlmIChzcGFuLmZyb20gIT0gc3Bhbi50bylcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHdvcmtpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHdvcmtpbmdbal07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQuZnJvbSA9PSBzcGFuLmZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQudG8gIT0gc3Bhbi50bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtpbmcgPT0gc3BhbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IHNwYW5zLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dlZCBieSBhIHBhcnRpYWxseSBvdmVybGFwcGluZyBsYXJnZXIgc3Bhbi4gU3BsaXQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Bhbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdbal0gPSBuZXh0LmNvcHkobmV4dC5mcm9tLCBzcGFuLnRvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEFoZWFkKHdvcmtpbmcsIGogKyAxLCBuZXh0LmNvcHkoc3Bhbi50bywgbmV4dC50bykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuZnJvbSA8IHNwYW4udG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JraW5nID09IHNwYW5zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgPSBzcGFucy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVuZCBvZiB0aGlzIG9uZSBvdmVybGFwcyB3aXRoIGEgc3Vic2VxdWVudCBzcGFuLiBTcGxpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nW2ldID0gc3Bhbi5jb3B5KHNwYW4uZnJvbSwgbmV4dC5mcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEFoZWFkKHdvcmtpbmcsIGosIHNwYW4uY29weShuZXh0LmZyb20sIHNwYW4udG8pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3b3JraW5nO1xufVxuZnVuY3Rpb24gaW5zZXJ0QWhlYWQoYXJyYXksIGksIGRlY28pIHtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCAmJiBieVBvcyhkZWNvLCBhcnJheVtpXSkgPiAwKVxuICAgICAgICBpKys7XG4gICAgYXJyYXkuc3BsaWNlKGksIDAsIGRlY28pO1xufVxuLy8gR2V0IHRoZSBkZWNvcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcHJvcHMgb2YgYSB2aWV3LlxuZnVuY3Rpb24gdmlld0RlY29yYXRpb25zKHZpZXcpIHtcbiAgICBsZXQgZm91bmQgPSBbXTtcbiAgICB2aWV3LnNvbWVQcm9wKFwiZGVjb3JhdGlvbnNcIiwgZiA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmKHZpZXcuc3RhdGUpO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSBlbXB0eSlcbiAgICAgICAgICAgIGZvdW5kLnB1c2gocmVzdWx0KTtcbiAgICB9KTtcbiAgICBpZiAodmlldy5jdXJzb3JXcmFwcGVyKVxuICAgICAgICBmb3VuZC5wdXNoKERlY29yYXRpb25TZXQuY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBbdmlldy5jdXJzb3JXcmFwcGVyLmRlY29dKSk7XG4gICAgcmV0dXJuIERlY29yYXRpb25Hcm91cC5mcm9tKGZvdW5kKTtcbn1cblxuY29uc3Qgb2JzZXJ2ZU9wdGlvbnMgPSB7XG4gICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YU9sZFZhbHVlOiB0cnVlLFxuICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgYXR0cmlidXRlT2xkVmFsdWU6IHRydWUsXG4gICAgc3VidHJlZTogdHJ1ZVxufTtcbi8vIElFMTEgaGFzIHZlcnkgYnJva2VuIG11dGF0aW9uIG9ic2VydmVycywgc28gd2UgYWxzbyBsaXN0ZW4gdG8gRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXG5jb25zdCB1c2VDaGFyRGF0YSA9IGllICYmIGllX3ZlcnNpb24gPD0gMTE7XG5jbGFzcyBTZWxlY3Rpb25TdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgc2V0KHNlbCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBzZWwuYW5jaG9yTm9kZTtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0O1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IHNlbC5mb2N1c05vZGU7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgfVxuICAgIGVxKHNlbCkge1xuICAgICAgICByZXR1cm4gc2VsLmFuY2hvck5vZGUgPT0gdGhpcy5hbmNob3JOb2RlICYmIHNlbC5hbmNob3JPZmZzZXQgPT0gdGhpcy5hbmNob3JPZmZzZXQgJiZcbiAgICAgICAgICAgIHNlbC5mb2N1c05vZGUgPT0gdGhpcy5mb2N1c05vZGUgJiYgc2VsLmZvY3VzT2Zmc2V0ID09IHRoaXMuZm9jdXNPZmZzZXQ7XG4gICAgfVxufVxuY2xhc3MgRE9NT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGhhbmRsZURPTUNoYW5nZSkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmhhbmRsZURPTUNoYW5nZSA9IGhhbmRsZURPTUNoYW5nZTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLmZsdXNoaW5nU29vbiA9IC0xO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvblN0YXRlO1xuICAgICAgICB0aGlzLm9uQ2hhckRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgJiZcbiAgICAgICAgICAgIG5ldyB3aW5kb3cuTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0YXRpb25zW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBJRTExIHdpbGwgc29tZXRpbWVzIChvbiBiYWNrc3BhY2luZyBvdXQgYSBzaW5nbGUgY2hhcmFjdGVyXG4gICAgICAgICAgICAgICAgLy8gdGV4dCBub2RlIGFmdGVyIGEgQlIgbm9kZSkgY2FsbCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgYWN0dWFsbHkgdXBkYXRpbmcgdGhlIERPTSwgd2hpY2ggd2lsbCBjYXVzZVxuICAgICAgICAgICAgICAgIC8vIFByb3NlTWlycm9yIHRvIG1pc3MgdGhlIGNoYW5nZSAoc2VlICM5MzApXG4gICAgICAgICAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgbXV0YXRpb25zLnNvbWUobSA9PiBtLnR5cGUgPT0gXCJjaGlsZExpc3RcIiAmJiBtLnJlbW92ZWROb2Rlcy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAgICAgbS50eXBlID09IFwiY2hhcmFjdGVyRGF0YVwiICYmIG0ub2xkVmFsdWUubGVuZ3RoID4gbS50YXJnZXQubm9kZVZhbHVlLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhckRhdGEgPSBlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2goeyB0YXJnZXQ6IGUudGFyZ2V0LCB0eXBlOiBcImNoYXJhY3RlckRhdGFcIiwgb2xkVmFsdWU6IGUucHJldlZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGZsdXNoU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hpbmdTb29uIDwgMClcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdTb29uID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmZsdXNoaW5nU29vbiA9IC0xOyB0aGlzLmZsdXNoKCk7IH0sIDIwKTtcbiAgICB9XG4gICAgZm9yY2VGbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmx1c2hpbmdTb29uID4gLTEpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5mbHVzaGluZ1Nvb24pO1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZ1Nvb24gPSAtMTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKTtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnZpZXcuZG9tLCBvYnNlcnZlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25DaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgICAgICB0aGlzLmNvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIGxldCB0YWtlID0gdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpO1xuICAgICAgICAgICAgaWYgKHRha2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWtlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2godGFrZVtpXSk7XG4gICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5mbHVzaCgpLCAyMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbkNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdFNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBjb25uZWN0U2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnZpZXcuZG9tLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgZGlzY29ubmVjdFNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIHN1cHByZXNzU2VsZWN0aW9uVXBkYXRlcygpIHtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzID0gZmFsc2UsIDUwKTtcbiAgICB9XG4gICAgb25TZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgICAgIGlmICghaGFzRm9jdXNBbmRTZWxlY3Rpb24odGhpcy52aWV3KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzKVxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvblRvRE9NKHRoaXMudmlldyk7XG4gICAgICAgIC8vIERlbGV0aW9ucyBvbiBJRTExIGZpcmUgdGhlaXIgZXZlbnRzIGluIHRoZSB3cm9uZyBvcmRlciwgZ2l2aW5nXG4gICAgICAgIC8vIHVzIGEgc2VsZWN0aW9uIGNoYW5nZSBldmVudCBiZWZvcmUgdGhlIERPTSBjaGFuZ2VzIGFyZVxuICAgICAgICAvLyByZXBvcnRlZC5cbiAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgIXRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCBzZWwgPSB0aGlzLnZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgICAgIC8vIFNlbGVjdGlvbi5pc0NvbGxhcHNlZCBpc24ndCByZWxpYWJsZSBvbiBJRVxuICAgICAgICAgICAgaWYgKHNlbC5mb2N1c05vZGUgJiYgaXNFcXVpdmFsZW50UG9zaXRpb24oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICBzZXRDdXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5zZXQodGhpcy52aWV3LmRvbVNlbGVjdGlvblJhbmdlKCkpO1xuICAgIH1cbiAgICBpZ25vcmVTZWxlY3Rpb25DaGFuZ2Uoc2VsKSB7XG4gICAgICAgIGlmICghc2VsLmZvY3VzTm9kZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgYW5jZXN0b3JzID0gbmV3IFNldCwgY29udGFpbmVyO1xuICAgICAgICBmb3IgKGxldCBzY2FuID0gc2VsLmZvY3VzTm9kZTsgc2Nhbjsgc2NhbiA9IHBhcmVudE5vZGUoc2NhbikpXG4gICAgICAgICAgICBhbmNlc3RvcnMuYWRkKHNjYW4pO1xuICAgICAgICBmb3IgKGxldCBzY2FuID0gc2VsLmFuY2hvck5vZGU7IHNjYW47IHNjYW4gPSBwYXJlbnROb2RlKHNjYW4pKVxuICAgICAgICAgICAgaWYgKGFuY2VzdG9ycy5oYXMoc2NhbikpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBzY2FuO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICBsZXQgZGVzYyA9IGNvbnRhaW5lciAmJiB0aGlzLnZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhjb250YWluZXIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLmlnbm9yZU11dGF0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IFwic2VsZWN0aW9uXCIsXG4gICAgICAgICAgICB0YXJnZXQ6IGNvbnRhaW5lci5ub2RlVHlwZSA9PSAzID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXJcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nUmVjb3JkcygpIHtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpXG4gICAgICAgICAgICBmb3IgKGxldCBtdXQgb2YgdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpKVxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZTtcbiAgICB9XG4gICAgZmx1c2goKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIGlmICghdmlldy5kb2NWaWV3IHx8IHRoaXMuZmx1c2hpbmdTb29uID4gLTEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtdXRhdGlvbnMgPSB0aGlzLnBlbmRpbmdSZWNvcmRzKCk7XG4gICAgICAgIGlmIChtdXRhdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgbmV3U2VsID0gIXRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzICYmICF0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZXEoc2VsKSAmJiBoYXNGb2N1c0FuZFNlbGVjdGlvbih2aWV3KSAmJiAhdGhpcy5pZ25vcmVTZWxlY3Rpb25DaGFuZ2Uoc2VsKTtcbiAgICAgICAgbGV0IGZyb20gPSAtMSwgdG8gPSAtMSwgdHlwZU92ZXIgPSBmYWxzZSwgYWRkZWQgPSBbXTtcbiAgICAgICAgaWYgKHZpZXcuZWRpdGFibGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVnaXN0ZXJNdXRhdGlvbihtdXRhdGlvbnNbaV0sIGFkZGVkKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBmcm9tIDwgMCA/IHJlc3VsdC5mcm9tIDogTWF0aC5taW4ocmVzdWx0LmZyb20sIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICB0byA9IHRvIDwgMCA/IHJlc3VsdC50byA6IE1hdGgubWF4KHJlc3VsdC50bywgdG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnR5cGVPdmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2Vja28gJiYgYWRkZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IGJycyA9IGFkZGVkLmZpbHRlcihuID0+IG4ubm9kZU5hbWUgPT0gXCJCUlwiKTtcbiAgICAgICAgICAgIGlmIChicnMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IGJyc1swXSwgYiA9IGJyc1sxXTtcbiAgICAgICAgICAgICAgICBpZiAoYS5wYXJlbnROb2RlICYmIGEucGFyZW50Tm9kZS5wYXJlbnROb2RlID09IGIucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgYi5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGEucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlYWRTZWwgPSBudWxsO1xuICAgICAgICAvLyBJZiBpdCBsb29rcyBsaWtlIHRoZSBicm93c2VyIGhhcyByZXNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZVxuICAgICAgICAvLyBzdGFydCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgZm9jdXMsIHJlc3RvcmUgdGhlIHNlbGVjdGlvbiBmcm9tXG4gICAgICAgIC8vIHRoZSBzdGF0ZVxuICAgICAgICBpZiAoZnJvbSA8IDAgJiYgbmV3U2VsICYmIHZpZXcuaW5wdXQubGFzdEZvY3VzID4gRGF0ZS5ub3coKSAtIDIwMCAmJlxuICAgICAgICAgICAgTWF0aC5tYXgodmlldy5pbnB1dC5sYXN0VG91Y2gsIHZpZXcuaW5wdXQubGFzdENsaWNrLnRpbWUpIDwgRGF0ZS5ub3coKSAtIDMwMCAmJlxuICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGFwc2VkKHNlbCkgJiYgKHJlYWRTZWwgPSBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcpKSAmJlxuICAgICAgICAgICAgcmVhZFNlbC5lcShTZWxlY3Rpb24ubmVhcih2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKDApLCAxKSkpIHtcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdEZvY3VzID0gMDtcbiAgICAgICAgICAgIHNlbGVjdGlvblRvRE9NKHZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldChzZWwpO1xuICAgICAgICAgICAgdmlldy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZyb20gPiAtMSB8fCBuZXdTZWwpIHtcbiAgICAgICAgICAgIGlmIChmcm9tID4gLTEpIHtcbiAgICAgICAgICAgICAgICB2aWV3LmRvY1ZpZXcubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICBjaGVja0NTUyh2aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRE9NQ2hhbmdlKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpO1xuICAgICAgICAgICAgaWYgKHZpZXcuZG9jVmlldyAmJiB2aWV3LmRvY1ZpZXcuZGlydHkpXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGVTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZXEoc2VsKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5zZXQoc2VsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWdpc3Rlck11dGF0aW9uKG11dCwgYWRkZWQpIHtcbiAgICAgICAgLy8gSWdub3JlIG11dGF0aW9ucyBpbnNpZGUgbm9kZXMgdGhhdCB3ZXJlIGFscmVhZHkgbm90ZWQgYXMgaW5zZXJ0ZWRcbiAgICAgICAgaWYgKGFkZGVkLmluZGV4T2YobXV0LnRhcmdldCkgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZGVzYyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKG11dC50YXJnZXQpO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIgJiZcbiAgICAgICAgICAgIChkZXNjID09IHRoaXMudmlldy5kb2NWaWV3IHx8IG11dC5hdHRyaWJ1dGVOYW1lID09IFwiY29udGVudGVkaXRhYmxlXCIgfHxcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHNvbWV0aW1lcyBmaXJlcyBzcHVyaW91cyBldmVudHMgZm9yIG51bGwvZW1wdHkgc3R5bGVzXG4gICAgICAgICAgICAgICAgKG11dC5hdHRyaWJ1dGVOYW1lID09IFwic3R5bGVcIiAmJiAhbXV0Lm9sZFZhbHVlICYmICFtdXQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpKSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFkZXNjIHx8IGRlc2MuaWdub3JlTXV0YXRpb24obXV0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJjaGlsZExpc3RcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYWRkZWROb2Rlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBhZGRlZC5wdXNoKG11dC5hZGRlZE5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmIChkZXNjLmNvbnRlbnRET00gJiYgZGVzYy5jb250ZW50RE9NICE9IGRlc2MuZG9tICYmICFkZXNjLmNvbnRlbnRET00uY29udGFpbnMobXV0LnRhcmdldCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogZGVzYy5wb3NCZWZvcmUsIHRvOiBkZXNjLnBvc0FmdGVyIH07XG4gICAgICAgICAgICBsZXQgcHJldiA9IG11dC5wcmV2aW91c1NpYmxpbmcsIG5leHQgPSBtdXQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBtdXQuYWRkZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBJRTExIGdpdmVzIHVzIGluY29ycmVjdCBuZXh0L3ByZXYgc2libGluZ3MgZm9yIHNvbWVcbiAgICAgICAgICAgICAgICAvLyBpbnNlcnRpb25zLCBzbyBpZiB0aGVyZSBhcmUgYWRkZWQgbm9kZXMsIHJlY29tcHV0ZSB0aG9zZVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXV0LmFkZGVkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgcHJldmlvdXNTaWJsaW5nLCBuZXh0U2libGluZyB9ID0gbXV0LmFkZGVkTm9kZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNTaWJsaW5nIHx8IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwobXV0LmFkZGVkTm9kZXMsIHByZXZpb3VzU2libGluZykgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0U2libGluZyB8fCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKG11dC5hZGRlZE5vZGVzLCBuZXh0U2libGluZykgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmcm9tT2Zmc2V0ID0gcHJldiAmJiBwcmV2LnBhcmVudE5vZGUgPT0gbXV0LnRhcmdldFxuICAgICAgICAgICAgICAgID8gZG9tSW5kZXgocHJldikgKyAxIDogMDtcbiAgICAgICAgICAgIGxldCBmcm9tID0gZGVzYy5sb2NhbFBvc0Zyb21ET00obXV0LnRhcmdldCwgZnJvbU9mZnNldCwgLTEpO1xuICAgICAgICAgICAgbGV0IHRvT2Zmc2V0ID0gbmV4dCAmJiBuZXh0LnBhcmVudE5vZGUgPT0gbXV0LnRhcmdldFxuICAgICAgICAgICAgICAgID8gZG9tSW5kZXgobmV4dCkgOiBtdXQudGFyZ2V0LmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHRvID0gZGVzYy5sb2NhbFBvc0Zyb21ET00obXV0LnRhcmdldCwgdG9PZmZzZXQsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtdXQudHlwZSA9PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogZGVzYy5wb3NBdFN0YXJ0IC0gZGVzYy5ib3JkZXIsIHRvOiBkZXNjLnBvc0F0RW5kICsgZGVzYy5ib3JkZXIgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gXCJjaGFyYWN0ZXJEYXRhXCJcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZnJvbTogZGVzYy5wb3NBdFN0YXJ0LFxuICAgICAgICAgICAgICAgIHRvOiBkZXNjLnBvc0F0RW5kLFxuICAgICAgICAgICAgICAgIC8vIEFuIGV2ZW50IHdhcyBnZW5lcmF0ZWQgZm9yIGEgdGV4dCBjaGFuZ2UgdGhhdCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgLy8gYW55IHRleHQuIE1hcmsgdGhlIGRvbSBjaGFuZ2UgdG8gZmFsbCBiYWNrIHRvIGFzc3VtaW5nIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiB3YXMgdHlwZWQgb3ZlciB3aXRoIGFuIGlkZW50aWNhbCB2YWx1ZSBpZiBpdCBjYW4ndFxuICAgICAgICAgICAgICAgIC8vIGZpbmQgYW5vdGhlciBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgdHlwZU92ZXI6IG11dC50YXJnZXQubm9kZVZhbHVlID09IG11dC5vbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBjc3NDaGVja2VkID0gbmV3IFdlYWtNYXAoKTtcbmxldCBjc3NDaGVja1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tDU1Modmlldykge1xuICAgIGlmIChjc3NDaGVja2VkLmhhcyh2aWV3KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNzc0NoZWNrZWQuc2V0KHZpZXcsIG51bGwpO1xuICAgIGlmIChbJ25vcm1hbCcsICdub3dyYXAnLCAncHJlLWxpbmUnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUodmlldy5kb20pLndoaXRlU3BhY2UpICE9PSAtMSkge1xuICAgICAgICB2aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGdlY2tvO1xuICAgICAgICBpZiAoY3NzQ2hlY2tXYXJuZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnNvbGVbXCJ3YXJuXCJdKFwiUHJvc2VNaXJyb3IgZXhwZWN0cyB0aGUgQ1NTIHdoaXRlLXNwYWNlIHByb3BlcnR5IHRvIGJlIHNldCwgcHJlZmVyYWJseSB0byAncHJlLXdyYXAnLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsb2FkIHN0eWxlL3Byb3NlbWlycm9yLmNzcyBmcm9tIHRoZSBwcm9zZW1pcnJvci12aWV3IHBhY2thZ2UuXCIpO1xuICAgICAgICBjc3NDaGVja1dhcm5lZCA9IHRydWU7XG4gICAgfVxufVxuLy8gVXNlZCB0byB3b3JrIGFyb3VuZCBhIFNhZmFyaSBTZWxlY3Rpb24vc2hhZG93IERPTSBidWdcbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDE0IGZpeFxuZnVuY3Rpb24gc2FmYXJpU2hhZG93U2VsZWN0aW9uUmFuZ2Uodmlldykge1xuICAgIGxldCBmb3VuZDtcbiAgICBmdW5jdGlvbiByZWFkKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBmb3VuZCA9IGV2ZW50LmdldFRhcmdldFJhbmdlcygpWzBdO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIFNhZmFyaSAoYXQgbGVhc3QgaW4gMjAxOC0yMDIyKSBkb2Vzbid0IHByb3ZpZGUgcmVndWxhclxuICAgIC8vIGFjY2VzcyB0byB0aGUgc2VsZWN0aW9uIGluc2lkZSBhIHNoYWRvd1Jvb3QsIHdlIGhhdmUgdG8gcGVyZm9ybSBhXG4gICAgLy8gcmlkaWN1bG91cyBoYWNrIHRvIGdldCBhdCBpdFx1MjAxNHVzaW5nIGBleGVjQ29tbWFuZGAgdG8gdHJpZ2dlciBhXG4gICAgLy8gYGJlZm9yZUlucHV0YCBldmVudCBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSB0YXJnZXQgcmFuZ2UgZnJvbSB0aGVcbiAgICAvLyBldmVudC5cbiAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbmRlbnRcIik7XG4gICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIGxldCBhbmNob3JOb2RlID0gZm91bmQuc3RhcnRDb250YWluZXIsIGFuY2hvck9mZnNldCA9IGZvdW5kLnN0YXJ0T2Zmc2V0O1xuICAgIGxldCBmb2N1c05vZGUgPSBmb3VuZC5lbmRDb250YWluZXIsIGZvY3VzT2Zmc2V0ID0gZm91bmQuZW5kT2Zmc2V0O1xuICAgIGxldCBjdXJyZW50QW5jaG9yID0gdmlldy5kb21BdFBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IpO1xuICAgIC8vIFNpbmNlIHN1Y2ggYSByYW5nZSBkb2Vzbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW5jaG9yIGFuZCBoZWFkLFxuICAgIC8vIHVzZSBhIGhldXJpc3RpYyB0aGF0IGZsaXBzIGl0IGFyb3VuZCBpZiBpdHMgZW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBhbmNob3IuXG4gICAgaWYgKGlzRXF1aXZhbGVudFBvc2l0aW9uKGN1cnJlbnRBbmNob3Iubm9kZSwgY3VycmVudEFuY2hvci5vZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKVxuICAgICAgICBbYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0XSA9IFtmb2N1c05vZGUsIGZvY3VzT2Zmc2V0LCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXRdO1xuICAgIHJldHVybiB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9O1xufVxuXG4vLyBOb3RlIHRoYXQgYWxsIHJlZmVyZW5jaW5nIGFuZCBwYXJzaW5nIGlzIGRvbmUgd2l0aCB0aGVcbi8vIHN0YXJ0LW9mLW9wZXJhdGlvbiBzZWxlY3Rpb24gYW5kIGRvY3VtZW50LCBzaW5jZSB0aGF0J3MgdGhlIG9uZVxuLy8gdGhhdCB0aGUgRE9NIHJlcHJlc2VudHMuIElmIGFueSBjaGFuZ2VzIGNhbWUgaW4gaW4gdGhlIG1lYW50aW1lLFxuLy8gdGhlIG1vZGlmaWNhdGlvbiBpcyBtYXBwZWQgb3ZlciB0aG9zZSBiZWZvcmUgaXQgaXMgYXBwbGllZCwgaW5cbi8vIHJlYWRET01DaGFuZ2UuXG5mdW5jdGlvbiBwYXJzZUJldHdlZW4odmlldywgZnJvbV8sIHRvXykge1xuICAgIGxldCB7IG5vZGU6IHBhcmVudCwgZnJvbU9mZnNldCwgdG9PZmZzZXQsIGZyb20sIHRvIH0gPSB2aWV3LmRvY1ZpZXcucGFyc2VSYW5nZShmcm9tXywgdG9fKTtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBmaW5kO1xuICAgIGxldCBhbmNob3IgPSBkb21TZWwuYW5jaG9yTm9kZTtcbiAgICBpZiAoYW5jaG9yICYmIHZpZXcuZG9tLmNvbnRhaW5zKGFuY2hvci5ub2RlVHlwZSA9PSAxID8gYW5jaG9yIDogYW5jaG9yLnBhcmVudE5vZGUpKSB7XG4gICAgICAgIGZpbmQgPSBbeyBub2RlOiBhbmNob3IsIG9mZnNldDogZG9tU2VsLmFuY2hvck9mZnNldCB9XTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25Db2xsYXBzZWQoZG9tU2VsKSlcbiAgICAgICAgICAgIGZpbmQucHVzaCh7IG5vZGU6IGRvbVNlbC5mb2N1c05vZGUsIG9mZnNldDogZG9tU2VsLmZvY3VzT2Zmc2V0IH0pO1xuICAgIH1cbiAgICAvLyBXb3JrIGFyb3VuZCBpc3N1ZSBpbiBDaHJvbWUgd2hlcmUgYmFja3NwYWNpbmcgc29tZXRpbWVzIHJlcGxhY2VzXG4gICAgLy8gdGhlIGRlbGV0ZWQgY29udGVudCB3aXRoIGEgcmFuZG9tIEJSIG5vZGUgKGlzc3VlcyAjNzk5LCAjODMxKVxuICAgIGlmIChjaHJvbWUgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCkge1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0b09mZnNldDsgb2ZmID4gZnJvbU9mZnNldDsgb2ZmLS0pIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcGFyZW50LmNoaWxkTm9kZXNbb2ZmIC0gMV0sIGRlc2MgPSBub2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRlc2MpIHtcbiAgICAgICAgICAgICAgICB0b09mZnNldCA9IG9mZjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGVzYyB8fCBkZXNjLnNpemUpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0YXJ0RG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJkb21QYXJzZXJcIikgfHwgRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpO1xuICAgIGxldCAkZnJvbSA9IHN0YXJ0RG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHNlbCA9IG51bGwsIGRvYyA9IHBhcnNlci5wYXJzZShwYXJlbnQsIHtcbiAgICAgICAgdG9wTm9kZTogJGZyb20ucGFyZW50LFxuICAgICAgICB0b3BNYXRjaDogJGZyb20ucGFyZW50LmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4KCkpLFxuICAgICAgICB0b3BPcGVuOiB0cnVlLFxuICAgICAgICBmcm9tOiBmcm9tT2Zmc2V0LFxuICAgICAgICB0bzogdG9PZmZzZXQsXG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZTogJGZyb20ucGFyZW50LnR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiID8gXCJmdWxsXCIgOiB0cnVlLFxuICAgICAgICBmaW5kUG9zaXRpb25zOiBmaW5kLFxuICAgICAgICBydWxlRnJvbU5vZGUsXG4gICAgICAgIGNvbnRleHQ6ICRmcm9tXG4gICAgfSk7XG4gICAgaWYgKGZpbmQgJiYgZmluZFswXS5wb3MgIT0gbnVsbCkge1xuICAgICAgICBsZXQgYW5jaG9yID0gZmluZFswXS5wb3MsIGhlYWQgPSBmaW5kWzFdICYmIGZpbmRbMV0ucG9zO1xuICAgICAgICBpZiAoaGVhZCA9PSBudWxsKVxuICAgICAgICAgICAgaGVhZCA9IGFuY2hvcjtcbiAgICAgICAgc2VsID0geyBhbmNob3I6IGFuY2hvciArIGZyb20sIGhlYWQ6IGhlYWQgKyBmcm9tIH07XG4gICAgfVxuICAgIHJldHVybiB7IGRvYywgc2VsLCBmcm9tLCB0byB9O1xufVxuZnVuY3Rpb24gcnVsZUZyb21Ob2RlKGRvbSkge1xuICAgIGxldCBkZXNjID0gZG9tLnBtVmlld0Rlc2M7XG4gICAgaWYgKGRlc2MpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MucGFyc2VSdWxlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgLy8gU2FmYXJpIHJlcGxhY2VzIHRoZSBsaXN0IGl0ZW0gb3IgdGFibGUgY2VsbCB3aXRoIGEgQlJcbiAgICAgICAgLy8gZGlyZWN0bHkgaW4gdGhlIGxpc3Qgbm9kZSAoPyEpIGlmIHlvdSBkZWxldGUgdGhlIGxhc3RcbiAgICAgICAgLy8gY2hhcmFjdGVyIGluIGEgbGlzdCBpdGVtIG9yIHRhYmxlIGNlbGwgKCM3MDgsICM4NjIpXG4gICAgICAgIGlmIChzYWZhcmkgJiYgL14odWx8b2wpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBza2lwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaVwiKSk7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9tLnBhcmVudE5vZGUubGFzdENoaWxkID09IGRvbSB8fCBzYWZhcmkgJiYgL14odHJ8dGFibGUpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkb20ubm9kZU5hbWUgPT0gXCJJTUdcIiAmJiBkb20uZ2V0QXR0cmlidXRlKFwibWFyay1wbGFjZWhvbGRlclwiKSkge1xuICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jb25zdCBpc0lubGluZSA9IC9eKGF8YWJicnxhY3JvbnltfGJ8YmRbaW9dfGJpZ3xicnxidXR0b258Y2l0ZXxjb2RlfGRhdGEobGlzdCk/fGRlbHxkZm58ZW18aXxpbnN8a2JkfGxhYmVsfG1hcHxtYXJrfG1ldGVyfG91dHB1dHxxfHJ1Ynl8c3xzYW1wfHNtYWxsfHNwYW58c3Ryb25nfHN1W2JwXXx0aW1lfHV8dHR8dmFyKSQvaTtcbmZ1bmN0aW9uIHJlYWRET01DaGFuZ2UodmlldywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZE5vZGVzKSB7XG4gICAgbGV0IGNvbXBvc2l0aW9uSUQgPSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgfHwgKHZpZXcuY29tcG9zaW5nID8gdmlldy5pbnB1dC5jb21wb3NpdGlvbklEIDogMCk7XG4gICAgdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzID0gMDtcbiAgICBpZiAoZnJvbSA8IDApIHtcbiAgICAgICAgbGV0IG9yaWdpbiA9IHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPiBEYXRlLm5vdygpIC0gNTAgPyB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25PcmlnaW4gOiBudWxsO1xuICAgICAgICBsZXQgbmV3U2VsID0gc2VsZWN0aW9uRnJvbURPTSh2aWV3LCBvcmlnaW4pO1xuICAgICAgICBpZiAobmV3U2VsICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5lcShuZXdTZWwpKSB7XG4gICAgICAgICAgICBpZiAoY2hyb21lICYmIGFuZHJvaWQgJiZcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlID09PSAxMyAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUgJiZcbiAgICAgICAgICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXdTZWwpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbiA9PSBcInBvaW50ZXJcIilcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwicG9pbnRlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG9yaWdpbiA9PSBcImtleVwiKVxuICAgICAgICAgICAgICAgIHRyLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JRClcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCAkYmVmb3JlID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICBsZXQgc2hhcmVkID0gJGJlZm9yZS5zaGFyZWREZXB0aCh0byk7XG4gICAgZnJvbSA9ICRiZWZvcmUuYmVmb3JlKHNoYXJlZCArIDEpO1xuICAgIHRvID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSh0bykuYWZ0ZXIoc2hhcmVkICsgMSk7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCBwYXJzZSA9IHBhcnNlQmV0d2Vlbih2aWV3LCBmcm9tLCB0byk7XG4gICAgbGV0IGRvYyA9IHZpZXcuc3RhdGUuZG9jLCBjb21wYXJlID0gZG9jLnNsaWNlKHBhcnNlLmZyb20sIHBhcnNlLnRvKTtcbiAgICBsZXQgcHJlZmVycmVkUG9zLCBwcmVmZXJyZWRTaWRlO1xuICAgIC8vIFByZWZlciBhbmNob3JpbmcgdG8gZW5kIHdoZW4gQmFja3NwYWNlIGlzIHByZXNzZWRcbiAgICBpZiAodmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUpIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24udG87XG4gICAgICAgIHByZWZlcnJlZFNpZGUgPSBcImVuZFwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbTtcbiAgICAgICAgcHJlZmVycmVkU2lkZSA9IFwic3RhcnRcIjtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9IG51bGw7XG4gICAgbGV0IGNoYW5nZSA9IGZpbmREaWZmKGNvbXBhcmUuY29udGVudCwgcGFyc2UuZG9jLmNvbnRlbnQsIHBhcnNlLmZyb20sIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSk7XG4gICAgaWYgKChpb3MgJiYgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPiBEYXRlLm5vdygpIC0gMjI1IHx8IGFuZHJvaWQpICYmXG4gICAgICAgIGFkZGVkTm9kZXMuc29tZShuID0+IG4ubm9kZVR5cGUgPT0gMSAmJiAhaXNJbmxpbmUudGVzdChuLm5vZGVOYW1lKSkgJiZcbiAgICAgICAgKCFjaGFuZ2UgfHwgY2hhbmdlLmVuZEEgPj0gY2hhbmdlLmVuZEIpICYmXG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpKSB7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICBpZiAodHlwZU92ZXIgJiYgc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiAhc2VsLmVtcHR5ICYmIHNlbC4kaGVhZC5zYW1lUGFyZW50KHNlbC4kYW5jaG9yKSAmJlxuICAgICAgICAgICAgIXZpZXcuY29tcG9zaW5nICYmICEocGFyc2Uuc2VsICYmIHBhcnNlLnNlbC5hbmNob3IgIT0gcGFyc2Uuc2VsLmhlYWQpKSB7XG4gICAgICAgICAgICBjaGFuZ2UgPSB7IHN0YXJ0OiBzZWwuZnJvbSwgZW5kQTogc2VsLnRvLCBlbmRCOiBzZWwudG8gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwYXJzZS5zZWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsID0gcmVzb2x2ZVNlbGVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLmRvYywgcGFyc2Uuc2VsKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsICYmICFzZWwuZXEodmlldy5zdGF0ZS5zZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbklEKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHIuc2V0TWV0YShcImNvbXBvc2l0aW9uXCIsIGNvbXBvc2l0aW9uSUQpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2hyb21lIHNvbWV0aW1lcyBsZWF2ZXMgdGhlIGN1cnNvciBiZWZvcmUgdGhlIGluc2VydGVkIHRleHQgd2hlblxuICAgIC8vIGNvbXBvc2luZyBhZnRlciBhIGN1cnNvciB3cmFwcGVyLiBUaGlzIG1vdmVzIGl0IGZvcndhcmQuXG4gICAgaWYgKGNocm9tZSAmJiB2aWV3LmN1cnNvcldyYXBwZXIgJiYgcGFyc2Uuc2VsICYmIHBhcnNlLnNlbC5hbmNob3IgPT0gdmlldy5jdXJzb3JXcmFwcGVyLmRlY28uZnJvbSAmJlxuICAgICAgICBwYXJzZS5zZWwuaGVhZCA9PSBwYXJzZS5zZWwuYW5jaG9yKSB7XG4gICAgICAgIGxldCBzaXplID0gY2hhbmdlLmVuZEIgLSBjaGFuZ2Uuc3RhcnQ7XG4gICAgICAgIHBhcnNlLnNlbCA9IHsgYW5jaG9yOiBwYXJzZS5zZWwuYW5jaG9yICsgc2l6ZSwgaGVhZDogcGFyc2Uuc2VsLmFuY2hvciArIHNpemUgfTtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCsrO1xuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvdmVyd3JpdGluZyBhIHNlbGVjdGlvbiBieSB0eXBpbmcgbWF0Y2hlc1xuICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHNlbGVjdGVkIGNvbnRlbnQsIGNyZWF0aW5nIGEgY2hhbmdlXG4gICAgLy8gdGhhdCdzIHNtYWxsZXIgdGhhbiB3aGF0IHdhcyBhY3R1YWxseSBvdmVyd3JpdHRlbi5cbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA8IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvICYmXG4gICAgICAgIGNoYW5nZS5zdGFydCA9PSBjaGFuZ2UuZW5kQiAmJlxuICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKGNoYW5nZS5zdGFydCA+IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gJiYgY2hhbmdlLnN0YXJ0IDw9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gKyAyICYmXG4gICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tID49IHBhcnNlLmZyb20pIHtcbiAgICAgICAgICAgIGNoYW5nZS5zdGFydCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlLmVuZEEgPCB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAmJiBjaGFuZ2UuZW5kQSA+PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAtIDIgJiZcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIDw9IHBhcnNlLnRvKSB7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQiArPSAodmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gLSBjaGFuZ2UuZW5kQSk7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElFMTEgd2lsbCBpbnNlcnQgYSBub24tYnJlYWtpbmcgc3BhY2UgX2FoZWFkXyBvZiB0aGUgc3BhY2UgYWZ0ZXJcbiAgICAvLyB0aGUgY3Vyc29yIHNwYWNlIHdoZW4gYWRkaW5nIGEgc3BhY2UgYmVmb3JlIGFub3RoZXIgc3BhY2UuIFdoZW5cbiAgICAvLyB0aGF0IGhhcHBlbmVkLCBhZGp1c3QgdGhlIGNoYW5nZSB0byBjb3ZlciB0aGUgc3BhY2UgaW5zdGVhZC5cbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBjaGFuZ2UuZW5kQiA9PSBjaGFuZ2Uuc3RhcnQgKyAxICYmXG4gICAgICAgIGNoYW5nZS5lbmRBID09IGNoYW5nZS5zdGFydCAmJiBjaGFuZ2Uuc3RhcnQgPiBwYXJzZS5mcm9tICYmXG4gICAgICAgIHBhcnNlLmRvYy50ZXh0QmV0d2VlbihjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tIC0gMSwgY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSArIDEpID09IFwiIFxcdTAwYTBcIikge1xuICAgICAgICBjaGFuZ2Uuc3RhcnQtLTtcbiAgICAgICAgY2hhbmdlLmVuZEEtLTtcbiAgICAgICAgY2hhbmdlLmVuZEItLTtcbiAgICB9XG4gICAgbGV0ICRmcm9tID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20pO1xuICAgIGxldCAkdG8gPSBwYXJzZS5kb2MucmVzb2x2ZU5vQ2FjaGUoY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKTtcbiAgICBsZXQgJGZyb21BID0gZG9jLnJlc29sdmUoY2hhbmdlLnN0YXJ0KTtcbiAgICBsZXQgaW5saW5lQ2hhbmdlID0gJGZyb20uc2FtZVBhcmVudCgkdG8pICYmICRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50ICYmICRmcm9tQS5lbmQoKSA+PSBjaGFuZ2UuZW5kQTtcbiAgICBsZXQgbmV4dFNlbDtcbiAgICAvLyBJZiB0aGlzIGxvb2tzIGxpa2UgdGhlIGVmZmVjdCBvZiBwcmVzc2luZyBFbnRlciAob3Igd2FzIHJlY29yZGVkXG4gICAgLy8gYXMgYmVpbmcgYW4gaU9TIGVudGVyIHByZXNzKSwganVzdCBkaXNwYXRjaCBhbiBFbnRlciBrZXkgaW5zdGVhZC5cbiAgICBpZiAoKChpb3MgJiYgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPiBEYXRlLm5vdygpIC0gMjI1ICYmXG4gICAgICAgICghaW5saW5lQ2hhbmdlIHx8IGFkZGVkTm9kZXMuc29tZShuID0+IG4ubm9kZU5hbWUgPT0gXCJESVZcIiB8fCBuLm5vZGVOYW1lID09IFwiUFwiKSkpIHx8XG4gICAgICAgICghaW5saW5lQ2hhbmdlICYmICRmcm9tLnBvcyA8IHBhcnNlLmRvYy5jb250ZW50LnNpemUgJiYgISRmcm9tLnNhbWVQYXJlbnQoJHRvKSAmJlxuICAgICAgICAgICAgKG5leHRTZWwgPSBTZWxlY3Rpb24uZmluZEZyb20ocGFyc2UuZG9jLnJlc29sdmUoJGZyb20ucG9zICsgMSksIDEsIHRydWUpKSAmJlxuICAgICAgICAgICAgbmV4dFNlbC5oZWFkID09ICR0by5wb3MpKSAmJlxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSkge1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlciA9IDA7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU2FtZSBmb3IgYmFja3NwYWNlXG4gICAgaWYgKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvciA+IGNoYW5nZS5zdGFydCAmJlxuICAgICAgICBsb29rc0xpa2VKb2luKGRvYywgY2hhbmdlLnN0YXJ0LCBjaGFuZ2UuZW5kQSwgJGZyb20sICR0bykgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDgsIFwiQmFja3NwYWNlXCIpKSkpIHtcbiAgICAgICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lKVxuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKTsgLy8gIzgyMFxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENocm9tZSBBbmRyb2lkIHdpbGwgb2NjYXNpb25hbGx5LCBkdXJpbmcgY29tcG9zaXRpb24sIGRlbGV0ZSB0aGVcbiAgICAvLyBlbnRpcmUgY29tcG9zaXRpb24gYW5kIHRoZW4gaW1tZWRpYXRlbHkgaW5zZXJ0IGl0IGFnYWluLiBUaGlzIGlzXG4gICAgLy8gdXNlZCB0byBkZXRlY3QgdGhhdCBzaXR1YXRpb24uXG4gICAgaWYgKGNocm9tZSAmJiBhbmRyb2lkICYmIGNoYW5nZS5lbmRCID09IGNoYW5nZS5zdGFydClcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0QW5kcm9pZERlbGV0ZSA9IERhdGUubm93KCk7XG4gICAgLy8gVGhpcyB0cmllcyB0byBkZXRlY3QgQW5kcm9pZCB2aXJ0dWFsIGtleWJvYXJkXG4gICAgLy8gZW50ZXItYW5kLXBpY2stc3VnZ2VzdGlvbiBhY3Rpb24uIFRoYXQgc29tZXRpbWVzIChzZWUgaXNzdWVcbiAgICAvLyAjMTA1OSkgZmlyc3QgZmlyZXMgYSBET00gbXV0YXRpb24sIGJlZm9yZSBtb3ZpbmcgdGhlIHNlbGVjdGlvbiB0b1xuICAgIC8vIHRoZSBuZXdseSBjcmVhdGVkIGJsb2NrLiBBbmQgdGhlbiwgYmVjYXVzZSBQcm9zZU1pcnJvciBjbGVhbnMgdXBcbiAgICAvLyB0aGUgRE9NIHNlbGVjdGlvbiwgaXQgZ2l2ZXMgdXAgbW92aW5nIHRoZSBzZWxlY3Rpb24gZW50aXJlbHksXG4gICAgLy8gbGVhdmluZyB0aGUgY3Vyc29yIGluIHRoZSB3cm9uZyBwbGFjZS4gV2hlbiB0aGF0IGhhcHBlbnMsIHdlIGRyb3BcbiAgICAvLyB0aGUgbmV3IHBhcmFncmFwaCBmcm9tIHRoZSBpbml0aWFsIGNoYW5nZSwgYW5kIGZpcmUgYSBzaW11bGF0ZWRcbiAgICAvLyBlbnRlciBrZXkgYWZ0ZXJ3YXJkcy5cbiAgICBpZiAoYW5kcm9pZCAmJiAhaW5saW5lQ2hhbmdlICYmICRmcm9tLnN0YXJ0KCkgIT0gJHRvLnN0YXJ0KCkgJiYgJHRvLnBhcmVudE9mZnNldCA9PSAwICYmICRmcm9tLmRlcHRoID09ICR0by5kZXB0aCAmJlxuICAgICAgICBwYXJzZS5zZWwgJiYgcGFyc2Uuc2VsLmFuY2hvciA9PSBwYXJzZS5zZWwuaGVhZCAmJiBwYXJzZS5zZWwuaGVhZCA9PSBjaGFuZ2UuZW5kQSkge1xuICAgICAgICBjaGFuZ2UuZW5kQiAtPSAyO1xuICAgICAgICAkdG8gPSBwYXJzZS5kb2MucmVzb2x2ZU5vQ2FjaGUoY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmdW5jdGlvbiAoZikgeyByZXR1cm4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSk7IH0pO1xuICAgICAgICB9LCAyMCk7XG4gICAgfVxuICAgIGxldCBjaEZyb20gPSBjaGFuZ2Uuc3RhcnQsIGNoVG8gPSBjaGFuZ2UuZW5kQTtcbiAgICBsZXQgdHIsIHN0b3JlZE1hcmtzLCBtYXJrQ2hhbmdlO1xuICAgIGlmIChpbmxpbmVDaGFuZ2UpIHtcbiAgICAgICAgaWYgKCRmcm9tLnBvcyA9PSAkdG8ucG9zKSB7IC8vIERlbGV0aW9uXG4gICAgICAgICAgICAvLyBJRTExIHNvbWV0aW1lcyB3ZWlyZGx5IG1vdmVzIHRoZSBET00gc2VsZWN0aW9uIGFyb3VuZCBhZnRlclxuICAgICAgICAgICAgLy8gYmFja3NwYWNpbmcgb3V0IHRoZSBmaXJzdCBlbGVtZW50IGluIGEgdGV4dGJsb2NrXG4gICAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiAkZnJvbS5wYXJlbnRPZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3VwcHJlc3NTZWxlY3Rpb25VcGRhdGVzKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzZWxlY3Rpb25Ub0RPTSh2aWV3KSwgMjApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyLmRlbGV0ZShjaEZyb20sIGNoVG8pO1xuICAgICAgICAgICAgc3RvcmVkTWFya3MgPSBkb2MucmVzb2x2ZShjaGFuZ2Uuc3RhcnQpLm1hcmtzQWNyb3NzKGRvYy5yZXNvbHZlKGNoYW5nZS5lbmRBKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIC8vIEFkZGluZyBvciByZW1vdmluZyBhIG1hcmtcbiAgICAgICAgY2hhbmdlLmVuZEEgPT0gY2hhbmdlLmVuZEIgJiZcbiAgICAgICAgICAgIChtYXJrQ2hhbmdlID0gaXNNYXJrQ2hhbmdlKCRmcm9tLnBhcmVudC5jb250ZW50LmN1dCgkZnJvbS5wYXJlbnRPZmZzZXQsICR0by5wYXJlbnRPZmZzZXQpLCAkZnJvbUEucGFyZW50LmNvbnRlbnQuY3V0KCRmcm9tQS5wYXJlbnRPZmZzZXQsIGNoYW5nZS5lbmRBIC0gJGZyb21BLnN0YXJ0KCkpKSkpIHtcbiAgICAgICAgICAgIHRyID0gdmlldy5zdGF0ZS50cjtcbiAgICAgICAgICAgIGlmIChtYXJrQ2hhbmdlLnR5cGUgPT0gXCJhZGRcIilcbiAgICAgICAgICAgICAgICB0ci5hZGRNYXJrKGNoRnJvbSwgY2hUbywgbWFya0NoYW5nZS5tYXJrKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0ci5yZW1vdmVNYXJrKGNoRnJvbSwgY2hUbywgbWFya0NoYW5nZS5tYXJrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgkZnJvbS5wYXJlbnQuY2hpbGQoJGZyb20uaW5kZXgoKSkuaXNUZXh0ICYmICRmcm9tLmluZGV4KCkgPT0gJHRvLmluZGV4KCkgLSAoJHRvLnRleHRPZmZzZXQgPyAwIDogMSkpIHtcbiAgICAgICAgICAgIC8vIEJvdGggcG9zaXRpb25zIGluIHRoZSBzYW1lIHRleHQgbm9kZSAtLSBzaW1wbHkgaW5zZXJ0IHRleHRcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gJGZyb20ucGFyZW50LnRleHRCZXR3ZWVuKCRmcm9tLnBhcmVudE9mZnNldCwgJHRvLnBhcmVudE9mZnNldCk7XG4gICAgICAgICAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZVRleHRJbnB1dFwiLCBmID0+IGYodmlldywgY2hGcm9tLCBjaFRvLCB0ZXh0KSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyLmluc2VydFRleHQodGV4dCwgY2hGcm9tLCBjaFRvKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRyKVxuICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHIucmVwbGFjZShjaEZyb20sIGNoVG8sIHBhcnNlLmRvYy5zbGljZShjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tLCBjaGFuZ2UuZW5kQiAtIHBhcnNlLmZyb20pKTtcbiAgICBpZiAocGFyc2Uuc2VsKSB7XG4gICAgICAgIGxldCBzZWwgPSByZXNvbHZlU2VsZWN0aW9uKHZpZXcsIHRyLmRvYywgcGFyc2Uuc2VsKTtcbiAgICAgICAgLy8gQ2hyb21lIEFuZHJvaWQgd2lsbCBzb21ldGltZXMsIGR1cmluZyBjb21wb3NpdGlvbiwgcmVwb3J0IHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gaW4gdGhlIHdyb25nIHBsYWNlLiBJZiBpdCBsb29rcyBsaWtlIHRoYXQgaXNcbiAgICAgICAgLy8gaGFwcGVuaW5nLCBkb24ndCB1cGRhdGUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgLy8gRWRnZSBqdXN0IGRvZXNuJ3QgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgd2hlbiB5b3Ugc3RhcnQgdHlwaW5nXG4gICAgICAgIC8vIGluIGFuIGVtcHR5IGJsb2NrIG9yIGJldHdlZW4gYnIgbm9kZXMuXG4gICAgICAgIGlmIChzZWwgJiYgIShjaHJvbWUgJiYgYW5kcm9pZCAmJiB2aWV3LmNvbXBvc2luZyAmJiBzZWwuZW1wdHkgJiZcbiAgICAgICAgICAgIChjaGFuZ2Uuc3RhcnQgIT0gY2hhbmdlLmVuZEIgfHwgdmlldy5pbnB1dC5sYXN0QW5kcm9pZERlbGV0ZSA8IERhdGUubm93KCkgLSAxMDApICYmXG4gICAgICAgICAgICAoc2VsLmhlYWQgPT0gY2hGcm9tIHx8IHNlbC5oZWFkID09IHRyLm1hcHBpbmcubWFwKGNoVG8pIC0gMSkgfHxcbiAgICAgICAgICAgIGllICYmIHNlbC5lbXB0eSAmJiBzZWwuaGVhZCA9PSBjaEZyb20pKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbCk7XG4gICAgfVxuICAgIGlmIChzdG9yZWRNYXJrcylcbiAgICAgICAgdHIuZW5zdXJlTWFya3Moc3RvcmVkTWFya3MpO1xuICAgIGlmIChjb21wb3NpdGlvbklEKVxuICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVTZWxlY3Rpb24odmlldywgZG9jLCBwYXJzZWRTZWwpIHtcbiAgICBpZiAoTWF0aC5tYXgocGFyc2VkU2VsLmFuY2hvciwgcGFyc2VkU2VsLmhlYWQpID4gZG9jLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkJldHdlZW4odmlldywgZG9jLnJlc29sdmUocGFyc2VkU2VsLmFuY2hvciksIGRvYy5yZXNvbHZlKHBhcnNlZFNlbC5oZWFkKSk7XG59XG4vLyBHaXZlbiB0d28gc2FtZS1sZW5ndGgsIG5vbi1lbXB0eSBmcmFnbWVudHMgb2YgaW5saW5lIGNvbnRlbnQsXG4vLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmlyc3QgY291bGQgYmUgY3JlYXRlZCBmcm9tIHRoZSBzZWNvbmQgYnlcbi8vIHJlbW92aW5nIG9yIGFkZGluZyBhIHNpbmdsZSBtYXJrIHR5cGUuXG5mdW5jdGlvbiBpc01hcmtDaGFuZ2UoY3VyLCBwcmV2KSB7XG4gICAgbGV0IGN1ck1hcmtzID0gY3VyLmZpcnN0Q2hpbGQubWFya3MsIHByZXZNYXJrcyA9IHByZXYuZmlyc3RDaGlsZC5tYXJrcztcbiAgICBsZXQgYWRkZWQgPSBjdXJNYXJrcywgcmVtb3ZlZCA9IHByZXZNYXJrcywgdHlwZSwgbWFyaywgdXBkYXRlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldk1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICBhZGRlZCA9IHByZXZNYXJrc1tpXS5yZW1vdmVGcm9tU2V0KGFkZGVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICByZW1vdmVkID0gY3VyTWFya3NbaV0ucmVtb3ZlRnJvbVNldChyZW1vdmVkKTtcbiAgICBpZiAoYWRkZWQubGVuZ3RoID09IDEgJiYgcmVtb3ZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICBtYXJrID0gYWRkZWRbMF07XG4gICAgICAgIHR5cGUgPSBcImFkZFwiO1xuICAgICAgICB1cGRhdGUgPSAobm9kZSkgPT4gbm9kZS5tYXJrKG1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhZGRlZC5sZW5ndGggPT0gMCAmJiByZW1vdmVkLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIG1hcmsgPSByZW1vdmVkWzBdO1xuICAgICAgICB0eXBlID0gXCJyZW1vdmVcIjtcbiAgICAgICAgdXBkYXRlID0gKG5vZGUpID0+IG5vZGUubWFyayhtYXJrLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB1cGRhdGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgdXBkYXRlZC5wdXNoKHVwZGF0ZShwcmV2LmNoaWxkKGkpKSk7XG4gICAgaWYgKEZyYWdtZW50LmZyb20odXBkYXRlZCkuZXEoY3VyKSlcbiAgICAgICAgcmV0dXJuIHsgbWFyaywgdHlwZSB9O1xufVxuZnVuY3Rpb24gbG9va3NMaWtlSm9pbihvbGQsIHN0YXJ0LCBlbmQsICRuZXdTdGFydCwgJG5ld0VuZCkge1xuICAgIGlmICghJG5ld1N0YXJ0LnBhcmVudC5pc1RleHRibG9jayB8fFxuICAgICAgICAvLyBUaGUgY29udGVudCBtdXN0IGhhdmUgc2hydW5rXG4gICAgICAgIGVuZCAtIHN0YXJ0IDw9ICRuZXdFbmQucG9zIC0gJG5ld1N0YXJ0LnBvcyB8fFxuICAgICAgICAvLyBuZXdFbmQgbXVzdCBwb2ludCBkaXJlY3RseSBhdCBvciBhZnRlciB0aGUgZW5kIG9mIHRoZSBibG9jayB0aGF0IG5ld1N0YXJ0IHBvaW50cyBpbnRvXG4gICAgICAgIHNraXBDbG9zaW5nQW5kT3BlbmluZygkbmV3U3RhcnQsIHRydWUsIGZhbHNlKSA8ICRuZXdFbmQucG9zKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRzdGFydCA9IG9sZC5yZXNvbHZlKHN0YXJ0KTtcbiAgICAvLyBTdGFydCBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgYSBibG9ja1xuICAgIGlmICgkc3RhcnQucGFyZW50T2Zmc2V0IDwgJHN0YXJ0LnBhcmVudC5jb250ZW50LnNpemUgfHwgISRzdGFydC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJG5leHQgPSBvbGQucmVzb2x2ZShza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHN0YXJ0LCB0cnVlLCB0cnVlKSk7XG4gICAgLy8gVGhlIG5leHQgdGV4dGJsb2NrIG11c3Qgc3RhcnQgYmVmb3JlIGVuZCBhbmQgZW5kIG5lYXIgaXRcbiAgICBpZiAoISRuZXh0LnBhcmVudC5pc1RleHRibG9jayB8fCAkbmV4dC5wb3MgPiBlbmQgfHxcbiAgICAgICAgc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRuZXh0LCB0cnVlLCBmYWxzZSkgPCBlbmQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBUaGUgZnJhZ21lbnRzIGFmdGVyIHRoZSBqb2luIHBvaW50IG11c3QgbWF0Y2hcbiAgICByZXR1cm4gJG5ld1N0YXJ0LnBhcmVudC5jb250ZW50LmN1dCgkbmV3U3RhcnQucGFyZW50T2Zmc2V0KS5lcSgkbmV4dC5wYXJlbnQuY29udGVudCk7XG59XG5mdW5jdGlvbiBza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHBvcywgZnJvbUVuZCwgbWF5T3Blbikge1xuICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGgsIGVuZCA9IGZyb21FbmQgPyAkcG9zLmVuZCgpIDogJHBvcy5wb3M7XG4gICAgd2hpbGUgKGRlcHRoID4gMCAmJiAoZnJvbUVuZCB8fCAkcG9zLmluZGV4QWZ0ZXIoZGVwdGgpID09ICRwb3Mubm9kZShkZXB0aCkuY2hpbGRDb3VudCkpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgZW5kKys7XG4gICAgICAgIGZyb21FbmQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1heU9wZW4pIHtcbiAgICAgICAgbGV0IG5leHQgPSAkcG9zLm5vZGUoZGVwdGgpLm1heWJlQ2hpbGQoJHBvcy5pbmRleEFmdGVyKGRlcHRoKSk7XG4gICAgICAgIHdoaWxlIChuZXh0ICYmICFuZXh0LmlzTGVhZikge1xuICAgICAgICAgICAgbmV4dCA9IG5leHQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5mdW5jdGlvbiBmaW5kRGlmZihhLCBiLCBwb3MsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBzdGFydCA9IGEuZmluZERpZmZTdGFydChiLCBwb3MpO1xuICAgIGlmIChzdGFydCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgeyBhOiBlbmRBLCBiOiBlbmRCIH0gPSBhLmZpbmREaWZmRW5kKGIsIHBvcyArIGEuc2l6ZSwgcG9zICsgYi5zaXplKTtcbiAgICBpZiAocHJlZmVycmVkU2lkZSA9PSBcImVuZFwiKSB7XG4gICAgICAgIGxldCBhZGp1c3QgPSBNYXRoLm1heCgwLCBzdGFydCAtIE1hdGgubWluKGVuZEEsIGVuZEIpKTtcbiAgICAgICAgcHJlZmVycmVkUG9zIC09IGVuZEEgKyBhZGp1c3QgLSBzdGFydDtcbiAgICB9XG4gICAgaWYgKGVuZEEgPCBzdGFydCAmJiBhLnNpemUgPCBiLnNpemUpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEEgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGIuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYi50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0ICsgKGVuZEIgLSBlbmRBKTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0O1xuICAgIH1cbiAgICBlbHNlIGlmIChlbmRCIDwgc3RhcnQpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEIgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGEuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYS50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0ICsgKGVuZEEgLSBlbmRCKTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kQSwgZW5kQiB9O1xufVxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoICE9IDIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYSA9IHN0ci5jaGFyQ29kZUF0KDApLCBiID0gc3RyLmNoYXJDb2RlQXQoMSk7XG4gICAgcmV0dXJuIGEgPj0gMHhEQzAwICYmIGEgPD0gMHhERkZGICYmIGIgPj0gMHhEODAwICYmIGIgPD0gMHhEQkZGO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fc2VyaWFsaXplRm9yQ2xpcGJvYXJkID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkO1xuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3BhcnNlRnJvbUNsaXBib2FyZCA9IHBhcnNlRnJvbUNsaXBib2FyZDtcbi8qKlxuQGludGVybmFsXG4qL1xuY29uc3QgX19lbmRDb21wb3NpdGlvbiA9IGVuZENvbXBvc2l0aW9uO1xuLyoqXG5BbiBlZGl0b3IgdmlldyBtYW5hZ2VzIHRoZSBET00gc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhblxuZWRpdGFibGUgZG9jdW1lbnQuIEl0cyBzdGF0ZSBhbmQgYmVoYXZpb3IgYXJlIGRldGVybWluZWQgYnkgaXRzXG5bcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRpcmVjdEVkaXRvclByb3BzKS5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB2aWV3LiBgcGxhY2VgIG1heSBiZSBhIERPTSBub2RlIHRoYXQgdGhlIGVkaXRvciBzaG91bGRcbiAgICBiZSBhcHBlbmRlZCB0bywgYSBmdW5jdGlvbiB0aGF0IHdpbGwgcGxhY2UgaXQgaW50byB0aGUgZG9jdW1lbnQsXG4gICAgb3IgYW4gb2JqZWN0IHdob3NlIGBtb3VudGAgcHJvcGVydHkgaG9sZHMgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZVxuICAgIGRvY3VtZW50IGNvbnRhaW5lci4gSWYgaXQgaXMgYG51bGxgLCB0aGUgZWRpdG9yIHdpbGwgbm90IGJlXG4gICAgYWRkZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IocGxhY2UsIHByb3BzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgS2x1ZGdlIHVzZWQgdG8gd29yayBhcm91bmQgYSBDaHJvbWUgYnVnIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrQ3Vyc29yID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnNvcldyYXBwZXIgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnB1dCA9IG5ldyBJbnB1dFN0YXRlO1xuICAgICAgICB0aGlzLnByZXZEaXJlY3RQbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luVmlld3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEhvbGRzIGB0cnVlYCB3aGVuIGEgaGFjayBub2RlIGlzIG5lZWRlZCBpbiBGaXJlZm94IHRvIHByZXZlbnQgdGhlXG4gICAgICAgIFtzcGFjZSBpcyBlYXRlbiBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yL2lzc3Vlcy82NTEpXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgV2hlbiBlZGl0b3IgY29udGVudCBpcyBiZWluZyBkcmFnZ2VkLCB0aGlzIG9iamVjdCBjb250YWluc1xuICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJhZ2dlZCBzbGljZSBhbmQgd2hldGhlciBpdCBpcyBiZWluZ1xuICAgICAgICBjb3BpZWQgb3IgbW92ZWQuIEF0IGFueSBvdGhlciB0aW1lLCBpdCBpcyBudWxsLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHByb3BzLnN0YXRlO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zIHx8IFtdO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMuZm9yRWFjaChjaGVja1N0YXRlQ29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kb20gPSAocGxhY2UgJiYgcGxhY2UubW91bnQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmIChwbGFjZSkge1xuICAgICAgICAgICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKVxuICAgICAgICAgICAgICAgIHBsYWNlLmFwcGVuZENoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwbGFjZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgcGxhY2UodGhpcy5kb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAocGxhY2UubW91bnQpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIHRoaXMubm9kZVZpZXdzID0gYnVpbGROb2RlVmlld3ModGhpcyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IGRvY1ZpZXdEZXNjKHRoaXMuc3RhdGUuZG9jLCBjb21wdXRlRG9jRGVjbyh0aGlzKSwgdmlld0RlY29yYXRpb25zKHRoaXMpLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIodGhpcywgKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpID0+IHJlYWRET01DaGFuZ2UodGhpcywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCkpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIGluaXRJbnB1dCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cygpO1xuICAgIH1cbiAgICAvKipcbiAgICBIb2xkcyBgdHJ1ZWAgd2hlbiBhXG4gICAgW2NvbXBvc2l0aW9uXShodHRwczovL3czYy5naXRodWIuaW8vdWlldmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50cylcbiAgICBpcyBhY3RpdmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gdGhpcy5pbnB1dC5jb21wb3Npbmc7IH1cbiAgICAvKipcbiAgICBUaGUgdmlldydzIGN1cnJlbnQgW3Byb3BzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcykuXG4gICAgKi9cbiAgICBnZXQgcHJvcHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcm9wcy5zdGF0ZSAhPSB0aGlzLnN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuX3Byb3BzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wc1tuYW1lXSA9IHByZXZbbmFtZV07XG4gICAgICAgICAgICB0aGlzLl9wcm9wcy5zdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BzO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcncyBwcm9wcy4gV2lsbCBpbW1lZGlhdGVseSBjYXVzZSBhbiB1cGRhdGUgdG9cbiAgICB0aGUgRE9NLlxuICAgICovXG4gICAgdXBkYXRlKHByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wcy5oYW5kbGVET01FdmVudHMgIT0gdGhpcy5fcHJvcHMuaGFuZGxlRE9NRXZlbnRzKVxuICAgICAgICAgICAgZW5zdXJlTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBsZXQgcHJldlByb3BzID0gdGhpcy5fcHJvcHM7XG4gICAgICAgIHRoaXMuX3Byb3BzID0gcHJvcHM7XG4gICAgICAgIGlmIChwcm9wcy5wbHVnaW5zKSB7XG4gICAgICAgICAgICBwcm9wcy5wbHVnaW5zLmZvckVhY2goY2hlY2tTdGF0ZUNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGVJbm5lcihwcm9wcy5zdGF0ZSwgcHJldlByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB2aWV3IGJ5IHVwZGF0aW5nIGV4aXN0aW5nIHByb3BzIG9iamVjdCB3aXRoIHRoZSBvYmplY3RcbiAgICBnaXZlbiBhcyBhcmd1bWVudC4gRXF1aXZhbGVudCB0byBgdmlldy51cGRhdGUoT2JqZWN0LmFzc2lnbih7fSxcbiAgICB2aWV3LnByb3BzLCBwcm9wcykpYC5cbiAgICAqL1xuICAgIHNldFByb3BzKHByb3BzKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0ge307XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5fcHJvcHMpXG4gICAgICAgICAgICB1cGRhdGVkW25hbWVdID0gdGhpcy5fcHJvcHNbbmFtZV07XG4gICAgICAgIHVwZGF0ZWQuc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByb3BzKVxuICAgICAgICAgICAgdXBkYXRlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgICAgICB0aGlzLnVwZGF0ZSh1cGRhdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSBlZGl0b3IncyBgc3RhdGVgIHByb3AsIHdpdGhvdXQgdG91Y2hpbmcgYW55IG9mIHRoZVxuICAgIG90aGVyIHByb3BzLlxuICAgICovXG4gICAgdXBkYXRlU3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUlubmVyKHN0YXRlLCB0aGlzLl9wcm9wcyk7XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlSW5uZXIoc3RhdGUsIHByZXZQcm9wcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5zdGF0ZSwgcmVkcmF3ID0gZmFsc2UsIHVwZGF0ZVNlbCA9IGZhbHNlO1xuICAgICAgICAvLyBXaGVuIHN0b3JlZCBtYXJrcyBhcmUgYWRkZWQsIHN0b3AgY29tcG9zaXRpb24sIHNvIHRoYXQgdGhleSBjYW5cbiAgICAgICAgLy8gYmUgZGlzcGxheWVkLlxuICAgICAgICBpZiAoc3RhdGUuc3RvcmVkTWFya3MgJiYgdGhpcy5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgIGNsZWFyQ29tcG9zaXRpb24odGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVTZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgbGV0IHBsdWdpbnNDaGFuZ2VkID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMucGx1Z2lucyAhPSBwcmV2UHJvcHMucGx1Z2lucztcbiAgICAgICAgaWYgKHBsdWdpbnNDaGFuZ2VkIHx8IHRoaXMuX3Byb3BzLnBsdWdpbnMgIT0gcHJldlByb3BzLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMubm9kZVZpZXdzICE9IHByZXZQcm9wcy5ub2RlVmlld3MpIHtcbiAgICAgICAgICAgIGxldCBub2RlVmlld3MgPSBidWlsZE5vZGVWaWV3cyh0aGlzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkTm9kZVZpZXdzKG5vZGVWaWV3cywgdGhpcy5ub2RlVmlld3MpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlVmlld3MgPSBub2RlVmlld3M7XG4gICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGx1Z2luc0NoYW5nZWQgfHwgcHJldlByb3BzLmhhbmRsZURPTUV2ZW50cyAhPSB0aGlzLl9wcm9wcy5oYW5kbGVET01FdmVudHMpIHtcbiAgICAgICAgICAgIGVuc3VyZUxpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIGxldCBpbm5lckRlY28gPSB2aWV3RGVjb3JhdGlvbnModGhpcyksIG91dGVyRGVjbyA9IGNvbXB1dGVEb2NEZWNvKHRoaXMpO1xuICAgICAgICBsZXQgc2Nyb2xsID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykgPyBcInJlc2V0XCJcbiAgICAgICAgICAgIDogc3RhdGUuc2Nyb2xsVG9TZWxlY3Rpb24gPiBwcmV2LnNjcm9sbFRvU2VsZWN0aW9uID8gXCJ0byBzZWxlY3Rpb25cIiA6IFwicHJlc2VydmVcIjtcbiAgICAgICAgbGV0IHVwZGF0ZURvYyA9IHJlZHJhdyB8fCAhdGhpcy5kb2NWaWV3Lm1hdGNoZXNOb2RlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28pO1xuICAgICAgICBpZiAodXBkYXRlRG9jIHx8ICFzdGF0ZS5zZWxlY3Rpb24uZXEocHJldi5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgdXBkYXRlU2VsID0gdHJ1ZTtcbiAgICAgICAgbGV0IG9sZFNjcm9sbFBvcyA9IHNjcm9sbCA9PSBcInByZXNlcnZlXCIgJiYgdXBkYXRlU2VsICYmIHRoaXMuZG9tLnN0eWxlLm92ZXJmbG93QW5jaG9yID09IG51bGwgJiYgc3RvcmVTY3JvbGxQb3ModGhpcyk7XG4gICAgICAgIGlmICh1cGRhdGVTZWwpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgLy8gV29yayBhcm91bmQgYW4gaXNzdWUgaW4gQ2hyb21lLCBJRSwgYW5kIEVkZ2Ugd2hlcmUgY2hhbmdpbmdcbiAgICAgICAgICAgIC8vIHRoZSBET00gYXJvdW5kIGFuIGFjdGl2ZSBzZWxlY3Rpb24gcHV0cyBpdCBpbnRvIGEgYnJva2VuXG4gICAgICAgICAgICAvLyBzdGF0ZSB3aGVyZSB0aGUgdGhpbmcgdGhlIHVzZXIgc2VlcyBkaWZmZXJzIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gcmVwb3J0ZWQgYnkgdGhlIFNlbGVjdGlvbiBvYmplY3QgKCM3MTAsICM5NzMsXG4gICAgICAgICAgICAvLyAjMTAxMSwgIzEwMTMsICMxMDM1KS5cbiAgICAgICAgICAgIGxldCBmb3JjZVNlbFVwZGF0ZSA9IHVwZGF0ZURvYyAmJiAoaWUgfHwgY2hyb21lKSAmJiAhdGhpcy5jb21wb3NpbmcgJiZcbiAgICAgICAgICAgICAgICAhcHJldi5zZWxlY3Rpb24uZW1wdHkgJiYgIXN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiBzZWxlY3Rpb25Db250ZXh0Q2hhbmdlZChwcmV2LnNlbGVjdGlvbiwgc3RhdGUuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVEb2MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSB0aGF0IHRoZSBzZWxlY3Rpb24gcG9pbnRzIGludG8gaXMgd3JpdHRlbiB0byxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgc29tZXRpbWVzIHN0YXJ0cyBtaXNyZXBvcnRpbmcgdGhlIHNlbGVjdGlvbiwgc28gdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRyYWNrcyB0aGF0IGFuZCBmb3JjZXMgYSBzZWxlY3Rpb24gcmVzZXQgd2hlbiBvdXIgdXBkYXRlXG4gICAgICAgICAgICAgICAgLy8gZGlkIHdyaXRlIHRvIHRoZSBub2RlLlxuICAgICAgICAgICAgICAgIGxldCBjaHJvbWVLbHVkZ2UgPSBjaHJvbWUgPyAodGhpcy50cmFja1dyaXRlcyA9IHRoaXMuZG9tU2VsZWN0aW9uUmFuZ2UoKS5mb2N1c05vZGUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocmVkcmF3IHx8ICF0aGlzLmRvY1ZpZXcudXBkYXRlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVPdXRlckRlY28oW10pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcgPSBkb2NWaWV3RGVzYyhzdGF0ZS5kb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHJvbWVLbHVkZ2UgJiYgIXRoaXMudHJhY2tXcml0ZXMpXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlU2VsVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGZvciBhbiBpc3N1ZSB3aGVyZSBhbiB1cGRhdGUgYXJyaXZpbmcgcmlnaHQgYmV0d2VlblxuICAgICAgICAgICAgLy8gYSBET00gc2VsZWN0aW9uIGNoYW5nZSBhbmQgdGhlIFwic2VsZWN0aW9uY2hhbmdlXCIgZXZlbnQgZm9yIGl0XG4gICAgICAgICAgICAvLyBjYW4gY2F1c2UgYSBzcHVyaW91cyBET00gc2VsZWN0aW9uIHVwZGF0ZSwgZGlzcnVwdGluZyBtb3VzZVxuICAgICAgICAgICAgLy8gZHJhZyBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZm9yY2VTZWxVcGRhdGUgfHxcbiAgICAgICAgICAgICAgICAhKHRoaXMuaW5wdXQubW91c2VEb3duICYmIHRoaXMuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5lcSh0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkpICYmXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvckluUmlnaHRQbGFjZSh0aGlzKSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh0aGlzLCBmb3JjZVNlbFVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzeW5jTm9kZVNlbGVjdGlvbih0aGlzLCBzdGF0ZS5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cyhwcmV2KTtcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmRyYWdnaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZSkgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURyYWdnZWROb2RlKHRoaXMuZHJhZ2dpbmcsIHByZXYpO1xuICAgICAgICBpZiAoc2Nyb2xsID09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgdGhpcy5kb20uc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY3JvbGwgPT0gXCJ0byBzZWxlY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFNjcm9sbFBvcykge1xuICAgICAgICAgICAgcmVzZXRTY3JvbGxQb3Mob2xkU2Nyb2xsUG9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjcm9sbFRvU2VsZWN0aW9uKCkge1xuICAgICAgICBsZXQgc3RhcnRET00gPSB0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkuZm9jdXNOb2RlO1xuICAgICAgICBpZiAodGhpcy5zb21lUHJvcChcImhhbmRsZVNjcm9sbFRvU2VsZWN0aW9uXCIsIGYgPT4gZih0aGlzKSkpIDtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5kb2NWaWV3LmRvbUFmdGVyUG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmZyb20pO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHN0YXJ0RE9NKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0aGlzLmNvb3Jkc0F0UG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmhlYWQsIDEpLCBzdGFydERPTSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveVBsdWdpblZpZXdzKCkge1xuICAgICAgICBsZXQgdmlldztcbiAgICAgICAgd2hpbGUgKHZpZXcgPSB0aGlzLnBsdWdpblZpZXdzLnBvcCgpKVxuICAgICAgICAgICAgaWYgKHZpZXcuZGVzdHJveSlcbiAgICAgICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2luVmlld3MocHJldlN0YXRlKSB7XG4gICAgICAgIGlmICghcHJldlN0YXRlIHx8IHByZXZTdGF0ZS5wbHVnaW5zICE9IHRoaXMuc3RhdGUucGx1Z2lucyB8fCB0aGlzLmRpcmVjdFBsdWdpbnMgIT0gdGhpcy5wcmV2RGlyZWN0UGx1Z2lucykge1xuICAgICAgICAgICAgdGhpcy5wcmV2RGlyZWN0UGx1Z2lucyA9IHRoaXMuZGlyZWN0UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVBsdWdpblZpZXdzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGlyZWN0UGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmRpcmVjdFBsdWdpbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zcGVjLnZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luVmlld3MucHVzaChwbHVnaW4uc3BlYy52aWV3KHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5wbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuc3RhdGUucGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMudmlldylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5WaWV3cy5wdXNoKHBsdWdpbi5zcGVjLnZpZXcodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpblZpZXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpblZpZXcgPSB0aGlzLnBsdWdpblZpZXdzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW5WaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luVmlldy51cGRhdGUodGhpcywgcHJldlN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVEcmFnZ2VkTm9kZShkcmFnZ2luZywgcHJldikge1xuICAgICAgICBsZXQgc2VsID0gZHJhZ2dpbmcubm9kZSwgZm91bmQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZG9jLm5vZGVBdChzZWwuZnJvbSkgPT0gc2VsLm5vZGUpIHtcbiAgICAgICAgICAgIGZvdW5kID0gc2VsLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbW92ZWRQb3MgPSBzZWwuZnJvbSArICh0aGlzLnN0YXRlLmRvYy5jb250ZW50LnNpemUgLSBwcmV2LmRvYy5jb250ZW50LnNpemUpO1xuICAgICAgICAgICAgbGV0IG1vdmVkID0gbW92ZWRQb3MgPiAwICYmIHRoaXMuc3RhdGUuZG9jLm5vZGVBdChtb3ZlZFBvcyk7XG4gICAgICAgICAgICBpZiAobW92ZWQgPT0gc2VsLm5vZGUpXG4gICAgICAgICAgICAgICAgZm91bmQgPSBtb3ZlZFBvcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbmV3IERyYWdnaW5nKGRyYWdnaW5nLnNsaWNlLCBkcmFnZ2luZy5tb3ZlLCBmb3VuZCA8IDAgPyB1bmRlZmluZWQgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnN0YXRlLmRvYywgZm91bmQpKTtcbiAgICB9XG4gICAgc29tZVByb3AocHJvcE5hbWUsIGYpIHtcbiAgICAgICAgbGV0IHByb3AgPSB0aGlzLl9wcm9wcyAmJiB0aGlzLl9wcm9wc1twcm9wTmFtZV0sIHZhbHVlO1xuICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RQbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJvcCA9IHRoaXMuZGlyZWN0UGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwbHVnaW5zID0gdGhpcy5zdGF0ZS5wbHVnaW5zO1xuICAgICAgICBpZiAocGx1Z2lucylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwcm9wID0gcGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgIT0gbnVsbCAmJiAodmFsdWUgPSBmID8gZihwcm9wKSA6IHByb3ApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhlIHZpZXcgaGFzIGZvY3VzLlxuICAgICovXG4gICAgaGFzRm9jdXMoKSB7XG4gICAgICAgIC8vIFdvcmsgYXJvdW5kIElFIG5vdCBoYW5kbGluZyBmb2N1cyBjb3JyZWN0bHkgaWYgcmVzaXplIGhhbmRsZXMgYXJlIHNob3duLlxuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBhbiBlbGVtZW50IHdpdGggcmVzaXplIGhhbmRsZXMsIGFjdGl2ZUVsZW1lbnRcbiAgICAgICAgLy8gd2lsbCBiZSB0aGF0IGVsZW1lbnQgaW5zdGVhZCBvZiB0aGlzLmRvbS5cbiAgICAgICAgaWYgKGllKSB7XG4gICAgICAgICAgICAvLyBJZiBhY3RpdmVFbGVtZW50IGlzIHdpdGhpbiB0aGlzLmRvbSwgYW5kIHRoZXJlIGFyZSBubyBvdGhlciBlbGVtZW50c1xuICAgICAgICAgICAgLy8gc2V0dGluZyBgY29udGVudGVkaXRhYmxlYCB0byBmYWxzZSBpbiBiZXR3ZWVuLCB0cmVhdCBpdCBhcyBmb2N1c2VkLlxuICAgICAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChub2RlID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLmRvbS5jb250YWlucyhub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiB0aGlzLmRvbSAhPSBub2RlICYmIHRoaXMuZG9tLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09ICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBGb2N1cyB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSlcbiAgICAgICAgICAgIGZvY3VzUHJldmVudFNjcm9sbCh0aGlzLmRvbSk7XG4gICAgICAgIHNlbGVjdGlvblRvRE9NKHRoaXMpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZG9jdW1lbnQgcm9vdCBpbiB3aGljaCB0aGUgZWRpdG9yIGV4aXN0cy4gVGhpcyB3aWxsXG4gICAgdXN1YWxseSBiZSB0aGUgdG9wLWxldmVsIGBkb2N1bWVudGAsIGJ1dCBtaWdodCBiZSBhIFtzaGFkb3dcbiAgICBET01dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1dlYl9Db21wb25lbnRzL1NoYWRvd19ET00pXG4gICAgcm9vdCBpZiB0aGUgZWRpdG9yIGlzIGluc2lkZSBvbmUuXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuX3Jvb3Q7XG4gICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IHRoaXMuZG9tLnBhcmVudE5vZGU7IHNlYXJjaDsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLm5vZGVUeXBlID09IDkgfHwgKHNlYXJjaC5ub2RlVHlwZSA9PSAxMSAmJiBzZWFyY2guaG9zdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWFyY2guZ2V0U2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNlYXJjaCkuZ2V0U2VsZWN0aW9uID0gKCkgPT4gc2VhcmNoLm93bmVyRG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290ID0gc2VhcmNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZCB8fCBkb2N1bWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiBhbiBleGlzdGluZyBlZGl0b3IgdmlldyBpcyBtb3ZlZCB0byBhIG5ldyBkb2N1bWVudCBvclxuICAgIHNoYWRvdyB0cmVlLCBjYWxsIHRoaXMgdG8gbWFrZSBpdCByZWNvbXB1dGUgaXRzIHJvb3QuXG4gICAgKi9cbiAgICB1cGRhdGVSb290KCkge1xuICAgICAgICB0aGlzLl9yb290ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2l2ZW4gYSBwYWlyIG9mIHZpZXdwb3J0IGNvb3JkaW5hdGVzLCByZXR1cm4gdGhlIGRvY3VtZW50XG4gICAgcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGVtLiBNYXkgcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuXG4gICAgY29vcmRpbmF0ZXMgYXJlbid0IGluc2lkZSBvZiB0aGUgZWRpdG9yLiBXaGVuIGFuIG9iamVjdCBpc1xuICAgIHJldHVybmVkLCBpdHMgYHBvc2AgcHJvcGVydHkgaXMgdGhlIHBvc2l0aW9uIG5lYXJlc3QgdG8gdGhlXG4gICAgY29vcmRpbmF0ZXMsIGFuZCBpdHMgYGluc2lkZWAgcHJvcGVydHkgaG9sZHMgdGhlIHBvc2l0aW9uIG9mIHRoZVxuICAgIGlubmVyIG5vZGUgdGhhdCB0aGUgcG9zaXRpb24gZmFsbHMgaW5zaWRlIG9mLCBvciAtMSBpZiBpdCBpcyBhdFxuICAgIHRoZSB0b3AgbGV2ZWwsIG5vdCBpbiBhbnkgbm9kZS5cbiAgICAqL1xuICAgIHBvc0F0Q29vcmRzKGNvb3Jkcykge1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgYGxlZnRgIGFuZCBgcmlnaHRgIHdpbGwgYmUgdGhlIHNhbWUgbnVtYmVyLCBhcyB0aGlzIHJldHVybnMgYVxuICAgIGZsYXQgY3Vyc29yLWlzaCByZWN0YW5nbGUuIElmIHRoZSBwb3NpdGlvbiBpcyBiZXR3ZWVuIHR3byB0aGluZ3NcbiAgICB0aGF0IGFyZW4ndCBkaXJlY3RseSBhZGphY2VudCwgYHNpZGVgIGRldGVybWluZXMgd2hpY2ggZWxlbWVudFxuICAgIGlzIHVzZWQuIFdoZW4gPCAwLCB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIHBvc2l0aW9uIGlzIHVzZWQsXG4gICAgb3RoZXJ3aXNlIHRoZSBlbGVtZW50IGFmdGVyLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICByZXR1cm4gY29vcmRzQXRQb3ModGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGRvY3VtZW50XG4gICAgcG9zaXRpb24uIFdoZW4gYHNpZGVgIGlzIG5lZ2F0aXZlLCBmaW5kIHRoZSBwb3NpdGlvbiBhcyBjbG9zZSBhc1xuICAgIHBvc3NpYmxlIHRvIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgcG9zaXRpb24uIFdoZW4gcG9zaXRpdmUsXG4gICAgcHJlZmVyIHBvc2l0aW9ucyBjbG9zZSB0byB0aGUgY29udGVudCBhZnRlciB0aGUgcG9zaXRpb24uIFdoZW5cbiAgICB6ZXJvLCBwcmVmZXIgYXMgc2hhbGxvdyBhIHBvc2l0aW9uIGFzIHBvc3NpYmxlLlxuICAgIFxuICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkICoqbm90KiogbXV0YXRlIHRoZSBlZGl0b3IncyBpbnRlcm5hbCBET00sXG4gICAgb25seSBpbnNwZWN0IGl0IChhbmQgZXZlbiB0aGF0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tRnJvbVBvcyhwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IG5vZGUgYWZ0ZXIgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uIE1heSByZXR1cm4gYG51bGxgIHdoZW4gdGhlIHBvc2l0aW9uIGRvZXNuJ3QgcG9pbnRcbiAgICBpbiBmcm9udCBvZiBhIG5vZGUgb3IgaWYgdGhlIG5vZGUgaXMgaW5zaWRlIGFuIG9wYXF1ZSBub2RlIHZpZXcuXG4gICAgXG4gICAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhYmxlIHRvIGNhbGwgdGhpbmdzIGxpa2VcbiAgICBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBvbiB0aGF0IERPTSBub2RlLiBEbyAqKm5vdCoqIG11dGF0ZSB0aGVcbiAgICBlZGl0b3IgRE9NIGRpcmVjdGx5LCBvciBhZGQgc3R5bGluZyB0aGlzIHdheSwgc2luY2UgdGhhdCB3aWxsIGJlXG4gICAgaW1tZWRpYXRlbHkgb3ZlcnJpZGVuIGJ5IHRoZSBlZGl0b3IgYXMgaXQgcmVkcmF3cyB0aGUgbm9kZS5cbiAgICAqL1xuICAgIG5vZGVET00ocG9zKSB7XG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5kb2NWaWV3LmRlc2NBdChwb3MpO1xuICAgICAgICByZXR1cm4gZGVzYyA/IGRlc2Mubm9kZURPTSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBET01cbiAgICBwb3NpdGlvbi4gKFdoZW5ldmVyIHBvc3NpYmxlLCBpdCBpcyBwcmVmZXJhYmxlIHRvIGluc3BlY3QgdGhlXG4gICAgZG9jdW1lbnQgc3RydWN0dXJlIGRpcmVjdGx5LCByYXRoZXIgdGhhbiBwb2tpbmcgYXJvdW5kIGluIHRoZVxuICAgIERPTSwgYnV0IHNvbWV0aW1lc1x1MjAxNGZvciBleGFtcGxlIHdoZW4gaW50ZXJwcmV0aW5nIGFuIGV2ZW50XG4gICAgdGFyZ2V0XHUyMDE0eW91IGRvbid0IGhhdmUgYSBjaG9pY2UuKVxuICAgIFxuICAgIFRoZSBgYmlhc2AgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB3aGljaCBzaWRlIG9mIGEgRE9NXG4gICAgbm9kZSB0byB1c2Ugd2hlbiB0aGUgcG9zaXRpb24gaXMgaW5zaWRlIGEgbGVhZiBub2RlLlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0LCBiaWFzID0gLTEpIHtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCwgYmlhcyk7XG4gICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRE9NIHBvc2l0aW9uIG5vdCBpbnNpZGUgdGhlIGVkaXRvclwiKTtcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBvdXQgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2sgd2hlblxuICAgIG1vdmluZyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gV2hlbiwgZm9yIGV4YW1wbGUsIGdpdmVuIGBcImxlZnRcImAsXG4gICAgaXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBtb3ZpbmcgbGVmdCBmcm9tIHRoZSBjdXJyZW50IGN1cnNvclxuICAgIHBvc2l0aW9uIHdvdWxkIGxlYXZlIHRoYXQgcG9zaXRpb24ncyBwYXJlbnQgdGV4dGJsb2NrLiBXaWxsIGFwcGx5XG4gICAgdG8gdGhlIHZpZXcncyBjdXJyZW50IHN0YXRlIGJ5IGRlZmF1bHQsIGJ1dCBpdCBpcyBwb3NzaWJsZSB0b1xuICAgIHBhc3MgYSBkaWZmZXJlbnQgc3RhdGUuXG4gICAgKi9cbiAgICBlbmRPZlRleHRibG9jayhkaXIsIHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBlbmRPZlRleHRibG9jayh0aGlzLCBzdGF0ZSB8fCB0aGlzLnN0YXRlLCBkaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSdW4gdGhlIGVkaXRvcidzIHBhc3RlIGxvZ2ljIHdpdGggdGhlIGdpdmVuIEhUTUwgc3RyaW5nLiBUaGVcbiAgICBgZXZlbnRgLCBpZiBnaXZlbiwgd2lsbCBiZSBwYXNzZWQgdG8gdGhlXG4gICAgW2BoYW5kbGVQYXN0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLmhhbmRsZVBhc3RlKSBob29rLlxuICAgICovXG4gICAgcGFzdGVIVE1MKGh0bWwsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkb1Bhc3RlKHRoaXMsIFwiXCIsIGh0bWwsIGZhbHNlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biB0aGUgZWRpdG9yJ3MgcGFzdGUgbG9naWMgd2l0aCB0aGUgZ2l2ZW4gcGxhaW4tdGV4dCBpbnB1dC5cbiAgICAqL1xuICAgIHBhc3RlVGV4dCh0ZXh0LCBldmVudCkge1xuICAgICAgICByZXR1cm4gZG9QYXN0ZSh0aGlzLCB0ZXh0LCBudWxsLCB0cnVlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZXMgdGhlIGVkaXRvciBmcm9tIHRoZSBET00gYW5kIGRlc3Ryb3lzIGFsbCBbbm9kZVxuICAgIHZpZXdzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5Ob2RlVmlldykuXG4gICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9jVmlldylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVzdHJveUlucHV0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lQbHVnaW5WaWV3cygpO1xuICAgICAgICBpZiAodGhpcy5tb3VudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlKHRoaXMuc3RhdGUuZG9jLCBbXSwgdmlld0RlY29yYXRpb25zKHRoaXMpLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmRvbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvY1ZpZXcgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGlzIGlzIHRydWUgd2hlbiB0aGUgdmlldyBoYXMgYmVlblxuICAgIFtkZXN0cm95ZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGVzdHJveSkgKGFuZCB0aHVzIHNob3VsZCBub3QgYmVcbiAgICB1c2VkIGFueW1vcmUpLlxuICAgICovXG4gICAgZ2V0IGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3ID09IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzZWQgZm9yIHRlc3RpbmcuXG4gICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGlzcGF0Y2ggYSB0cmFuc2FjdGlvbi4gV2lsbCBjYWxsXG4gICAgW2BkaXNwYXRjaFRyYW5zYWN0aW9uYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0RWRpdG9yUHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbilcbiAgICB3aGVuIGdpdmVuLCBhbmQgb3RoZXJ3aXNlIGRlZmF1bHRzIHRvIGFwcGx5aW5nIHRoZSB0cmFuc2FjdGlvbiB0b1xuICAgIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBjYWxsaW5nXG4gICAgW2B1cGRhdGVTdGF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudXBkYXRlU3RhdGUpIHdpdGggdGhlIHJlc3VsdC5cbiAgICBUaGlzIG1ldGhvZCBpcyBib3VuZCB0byB0aGUgdmlldyBpbnN0YW5jZSwgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBlYXNpbHkgcGFzc2VkIGFyb3VuZC5cbiAgICAqL1xuICAgIGRpc3BhdGNoKHRyKSB7XG4gICAgICAgIGxldCBkaXNwYXRjaFRyYW5zYWN0aW9uID0gdGhpcy5fcHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbjtcbiAgICAgICAgaWYgKGRpc3BhdGNoVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICBkaXNwYXRjaFRyYW5zYWN0aW9uLmNhbGwodGhpcywgdHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHRoaXMuc3RhdGUuYXBwbHkodHIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21TZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgcmV0dXJuIHNhZmFyaSAmJiB0aGlzLnJvb3Qubm9kZVR5cGUgPT09IDExICYmIGRlZXBBY3RpdmVFbGVtZW50KHRoaXMuZG9tLm93bmVyRG9jdW1lbnQpID09IHRoaXMuZG9tXG4gICAgICAgICAgICA/IHNhZmFyaVNoYWRvd1NlbGVjdGlvblJhbmdlKHRoaXMpIDogdGhpcy5kb21TZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QuZ2V0U2VsZWN0aW9uKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZURvY0RlY28odmlldykge1xuICAgIGxldCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgYXR0cnMuY2xhc3MgPSBcIlByb3NlTWlycm9yXCI7XG4gICAgYXR0cnMuY29udGVudGVkaXRhYmxlID0gU3RyaW5nKHZpZXcuZWRpdGFibGUpO1xuICAgIHZpZXcuc29tZVByb3AoXCJhdHRyaWJ1dGVzXCIsIHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHZpZXcuc3RhdGUpO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICBmb3IgKGxldCBhdHRyIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIgPT0gXCJjbGFzc1wiKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5jbGFzcyArPSBcIiBcIiArIHZhbHVlW2F0dHJdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0dHIgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5zdHlsZSA9IChhdHRycy5zdHlsZSA/IGF0dHJzLnN0eWxlICsgXCI7XCIgOiBcIlwiKSArIHZhbHVlW2F0dHJdO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhdHRyc1thdHRyXSAmJiBhdHRyICE9IFwiY29udGVudGVkaXRhYmxlXCIgJiYgYXR0ciAhPSBcIm5vZGVOYW1lXCIpXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzW2F0dHJdID0gU3RyaW5nKHZhbHVlW2F0dHJdKTtcbiAgICAgICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWF0dHJzLnRyYW5zbGF0ZSlcbiAgICAgICAgYXR0cnMudHJhbnNsYXRlID0gXCJub1wiO1xuICAgIHJldHVybiBbRGVjb3JhdGlvbi5ub2RlKDAsIHZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSwgYXR0cnMpXTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUN1cnNvcldyYXBwZXIodmlldykge1xuICAgIGlmICh2aWV3Lm1hcmtDdXJzb3IpIHtcbiAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgIGRvbS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLXNlcGFyYXRvclwiO1xuICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwibWFyay1wbGFjZWhvbGRlclwiLCBcInRydWVcIik7XG4gICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoXCJhbHRcIiwgXCJcIik7XG4gICAgICAgIHZpZXcuY3Vyc29yV3JhcHBlciA9IHsgZG9tLCBkZWNvOiBEZWNvcmF0aW9uLndpZGdldCh2aWV3LnN0YXRlLnNlbGVjdGlvbi5oZWFkLCBkb20sIHsgcmF3OiB0cnVlLCBtYXJrczogdmlldy5tYXJrQ3Vyc29yIH0pIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2aWV3LmN1cnNvcldyYXBwZXIgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEVkaXRhYmxlKHZpZXcpIHtcbiAgICByZXR1cm4gIXZpZXcuc29tZVByb3AoXCJlZGl0YWJsZVwiLCB2YWx1ZSA9PiB2YWx1ZSh2aWV3LnN0YXRlKSA9PT0gZmFsc2UpO1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uQ29udGV4dENoYW5nZWQoc2VsMSwgc2VsMikge1xuICAgIGxldCBkZXB0aCA9IE1hdGgubWluKHNlbDEuJGFuY2hvci5zaGFyZWREZXB0aChzZWwxLmhlYWQpLCBzZWwyLiRhbmNob3Iuc2hhcmVkRGVwdGgoc2VsMi5oZWFkKSk7XG4gICAgcmV0dXJuIHNlbDEuJGFuY2hvci5zdGFydChkZXB0aCkgIT0gc2VsMi4kYW5jaG9yLnN0YXJ0KGRlcHRoKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkTm9kZVZpZXdzKHZpZXcpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmdW5jdGlvbiBhZGQob2JqKSB7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gb2JqKVxuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBwcm9wKSlcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICAgIHZpZXcuc29tZVByb3AoXCJub2RlVmlld3NcIiwgYWRkKTtcbiAgICB2aWV3LnNvbWVQcm9wKFwibWFya1ZpZXdzXCIsIGFkZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNoYW5nZWROb2RlVmlld3MoYSwgYikge1xuICAgIGxldCBuQSA9IDAsIG5CID0gMDtcbiAgICBmb3IgKGxldCBwcm9wIGluIGEpIHtcbiAgICAgICAgaWYgKGFbcHJvcF0gIT0gYltwcm9wXSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBuQSsrO1xuICAgIH1cbiAgICBmb3IgKGxldCBfIGluIGIpXG4gICAgICAgIG5CKys7XG4gICAgcmV0dXJuIG5BICE9IG5CO1xufVxuZnVuY3Rpb24gY2hlY2tTdGF0ZUNvbXBvbmVudChwbHVnaW4pIHtcbiAgICBpZiAocGx1Z2luLnNwZWMuc3RhdGUgfHwgcGx1Z2luLnNwZWMuZmlsdGVyVHJhbnNhY3Rpb24gfHwgcGx1Z2luLnNwZWMuYXBwZW5kVHJhbnNhY3Rpb24pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUGx1Z2lucyBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIHZpZXcgbXVzdCBub3QgaGF2ZSBhIHN0YXRlIGNvbXBvbmVudFwiKTtcbn1cblxuZXhwb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCwgRWRpdG9yVmlldywgX19lbmRDb21wb3NpdGlvbiwgX19wYXJzZUZyb21DbGlwYm9hcmQsIF9fc2VyaWFsaXplRm9yQ2xpcGJvYXJkIH07XG4iLCAiZXhwb3J0IHZhciBiYXNlID0ge1xuICA4OiBcIkJhY2tzcGFjZVwiLFxuICA5OiBcIlRhYlwiLFxuICAxMDogXCJFbnRlclwiLFxuICAxMjogXCJOdW1Mb2NrXCIsXG4gIDEzOiBcIkVudGVyXCIsXG4gIDE2OiBcIlNoaWZ0XCIsXG4gIDE3OiBcIkNvbnRyb2xcIixcbiAgMTg6IFwiQWx0XCIsXG4gIDIwOiBcIkNhcHNMb2NrXCIsXG4gIDI3OiBcIkVzY2FwZVwiLFxuICAzMjogXCIgXCIsXG4gIDMzOiBcIlBhZ2VVcFwiLFxuICAzNDogXCJQYWdlRG93blwiLFxuICAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLFxuICAzNzogXCJBcnJvd0xlZnRcIixcbiAgMzg6IFwiQXJyb3dVcFwiLFxuICAzOTogXCJBcnJvd1JpZ2h0XCIsXG4gIDQwOiBcIkFycm93RG93blwiLFxuICA0NDogXCJQcmludFNjcmVlblwiLFxuICA0NTogXCJJbnNlcnRcIixcbiAgNDY6IFwiRGVsZXRlXCIsXG4gIDU5OiBcIjtcIixcbiAgNjE6IFwiPVwiLFxuICA5MTogXCJNZXRhXCIsXG4gIDkyOiBcIk1ldGFcIixcbiAgMTA2OiBcIipcIixcbiAgMTA3OiBcIitcIixcbiAgMTA4OiBcIixcIixcbiAgMTA5OiBcIi1cIixcbiAgMTEwOiBcIi5cIixcbiAgMTExOiBcIi9cIixcbiAgMTQ0OiBcIk51bUxvY2tcIixcbiAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgMTYwOiBcIlNoaWZ0XCIsXG4gIDE2MTogXCJTaGlmdFwiLFxuICAxNjI6IFwiQ29udHJvbFwiLFxuICAxNjM6IFwiQ29udHJvbFwiLFxuICAxNjQ6IFwiQWx0XCIsXG4gIDE2NTogXCJBbHRcIixcbiAgMTczOiBcIi1cIixcbiAgMTg2OiBcIjtcIixcbiAgMTg3OiBcIj1cIixcbiAgMTg4OiBcIixcIixcbiAgMTg5OiBcIi1cIixcbiAgMTkwOiBcIi5cIixcbiAgMTkxOiBcIi9cIixcbiAgMTkyOiBcImBcIixcbiAgMjE5OiBcIltcIixcbiAgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIixcbiAgMjIyOiBcIidcIlxufVxuXG5leHBvcnQgdmFyIHNoaWZ0ID0ge1xuICA0ODogXCIpXCIsXG4gIDQ5OiBcIiFcIixcbiAgNTA6IFwiQFwiLFxuICA1MTogXCIjXCIsXG4gIDUyOiBcIiRcIixcbiAgNTM6IFwiJVwiLFxuICA1NDogXCJeXCIsXG4gIDU1OiBcIiZcIixcbiAgNTY6IFwiKlwiLFxuICA1NzogXCIoXCIsXG4gIDU5OiBcIjpcIixcbiAgNjE6IFwiK1wiLFxuICAxNzM6IFwiX1wiLFxuICAxODY6IFwiOlwiLFxuICAxODc6IFwiK1wiLFxuICAxODg6IFwiPFwiLFxuICAxODk6IFwiX1wiLFxuICAxOTA6IFwiPlwiLFxuICAxOTE6IFwiP1wiLFxuICAxOTI6IFwiflwiLFxuICAyMTk6IFwie1wiLFxuICAyMjA6IFwifFwiLFxuICAyMjE6IFwifVwiLFxuICAyMjI6IFwiXFxcIlwiXG59XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG52YXIgaWUgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgXFxkfFRyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbi8vIEZpbGwgaW4gdGhlIGRpZ2l0IGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgYmFzZVs0OCArIGldID0gYmFzZVs5NiArIGldID0gU3RyaW5nKGkpXG5cbi8vIFRoZSBmdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAyNDsgaSsrKSBiYXNlW2kgKyAxMTFdID0gXCJGXCIgKyBpXG5cbi8vIEFuZCB0aGUgYWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBiYXNlW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpICsgMzIpXG4gIHNoaWZ0W2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxufVxuXG4vLyBGb3IgZWFjaCBjb2RlIHRoYXQgZG9lc24ndCBoYXZlIGEgc2hpZnQtZXF1aXZhbGVudCwgY29weSB0aGUgYmFzZSBuYW1lXG5mb3IgKHZhciBjb2RlIGluIGJhc2UpIGlmICghc2hpZnQuaGFzT3duUHJvcGVydHkoY29kZSkpIHNoaWZ0W2NvZGVdID0gYmFzZVtjb2RlXVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5TmFtZShldmVudCkge1xuICAvLyBPbiBtYWNPUywga2V5cyBoZWxkIHdpdGggU2hpZnQgYW5kIENtZCBkb24ndCByZWZsZWN0IHRoZSBlZmZlY3Qgb2YgU2hpZnQgaW4gYC5rZXlgLlxuICAvLyBPbiBJRSwgc2hpZnQgZWZmZWN0IGlzIG5ldmVyIGluY2x1ZGVkIGluIGAua2V5YC5cbiAgdmFyIGlnbm9yZUtleSA9IG1hYyAmJiBldmVudC5tZXRhS2V5ICYmIGV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgfHxcbiAgICAgIGllICYmIGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSAmJiBldmVudC5rZXkubGVuZ3RoID09IDEgfHxcbiAgICAgIGV2ZW50LmtleSA9PSBcIlVuaWRlbnRpZmllZFwiXG4gIHZhciBuYW1lID0gKCFpZ25vcmVLZXkgJiYgZXZlbnQua2V5KSB8fFxuICAgIChldmVudC5zaGlmdEtleSA/IHNoaWZ0IDogYmFzZSlbZXZlbnQua2V5Q29kZV0gfHxcbiAgICBldmVudC5rZXkgfHwgXCJVbmlkZW50aWZpZWRcIlxuICAvLyBFZGdlIHNvbWV0aW1lcyBwcm9kdWNlcyB3cm9uZyBuYW1lcyAoSXNzdWUgIzMpXG4gIGlmIChuYW1lID09IFwiRXNjXCIpIG5hbWUgPSBcIkVzY2FwZVwiXG4gIGlmIChuYW1lID09IFwiRGVsXCIpIG5hbWUgPSBcIkRlbGV0ZVwiXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzg4NjA1NzEvXG4gIGlmIChuYW1lID09IFwiTGVmdFwiKSBuYW1lID0gXCJBcnJvd0xlZnRcIlxuICBpZiAobmFtZSA9PSBcIlVwXCIpIG5hbWUgPSBcIkFycm93VXBcIlxuICBpZiAobmFtZSA9PSBcIlJpZ2h0XCIpIG5hbWUgPSBcIkFycm93UmlnaHRcIlxuICBpZiAobmFtZSA9PSBcIkRvd25cIikgbmFtZSA9IFwiQXJyb3dEb3duXCJcbiAgcmV0dXJuIG5hbWVcbn1cbiIsICJpbXBvcnQgeyBrZXlOYW1lLCBiYXNlIH0gZnJvbSAndzNjLWtleW5hbWUnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG5jb25zdCBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyAvTWFjfGlQKGhvbmV8W29hXWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgOiBmYWxzZTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSkge1xuICAgIGxldCBwYXJ0cyA9IG5hbWUuc3BsaXQoLy0oPyEkKS8pLCByZXN1bHQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICBpZiAocmVzdWx0ID09IFwiU3BhY2VcIilcbiAgICAgICAgcmVzdWx0ID0gXCIgXCI7XG4gICAgbGV0IGFsdCwgY3RybCwgc2hpZnQsIG1ldGE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKG1hYylcbiAgICAgICAgICAgICAgICBtZXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbW9kaWZpZXIgbmFtZTogXCIgKyBtb2QpO1xuICAgIH1cbiAgICBpZiAoYWx0KVxuICAgICAgICByZXN1bHQgPSBcIkFsdC1cIiArIHJlc3VsdDtcbiAgICBpZiAoY3RybClcbiAgICAgICAgcmVzdWx0ID0gXCJDdHJsLVwiICsgcmVzdWx0O1xuICAgIGlmIChtZXRhKVxuICAgICAgICByZXN1bHQgPSBcIk1ldGEtXCIgKyByZXN1bHQ7XG4gICAgaWYgKHNoaWZ0KVxuICAgICAgICByZXN1bHQgPSBcIlNoaWZ0LVwiICsgcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemUobWFwKSB7XG4gICAgbGV0IGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gbWFwKVxuICAgICAgICBjb3B5W25vcm1hbGl6ZUtleU5hbWUocHJvcCldID0gbWFwW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCA9IHRydWUpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG4vKipcbkNyZWF0ZSBhIGtleW1hcCBwbHVnaW4gZm9yIHRoZSBnaXZlbiBzZXQgb2YgYmluZGluZ3MuXG5cbkJpbmRpbmdzIHNob3VsZCBtYXAga2V5IG5hbWVzIHRvIFtjb21tYW5kXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMpLXN0eWxlXG5mdW5jdGlvbnMsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggYChFZGl0b3JTdGF0ZSwgZGlzcGF0Y2gsXG5FZGl0b3JWaWV3KWAgYXJndW1lbnRzLCBhbmQgc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhleSd2ZSBoYW5kbGVkXG50aGUga2V5LiBOb3RlIHRoYXQgdGhlIHZpZXcgYXJndW1lbnQgaXNuJ3QgcGFydCBvZiB0aGUgY29tbWFuZFxucHJvdG9jb2wsIGJ1dCBjYW4gYmUgdXNlZCBhcyBhbiBlc2NhcGUgaGF0Y2ggaWYgYSBiaW5kaW5nIG5lZWRzIHRvXG5kaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBVSS5cblxuS2V5IG5hbWVzIG1heSBiZSBzdHJpbmdzIGxpa2UgYFwiU2hpZnQtQ3RybC1FbnRlclwiYFx1MjAxNGEga2V5XG5pZGVudGlmaWVyIHByZWZpeGVkIHdpdGggemVybyBvciBtb3JlIG1vZGlmaWVycy4gS2V5IGlkZW50aWZpZXJzXG5hcmUgYmFzZWQgb24gdGhlIHN0cmluZ3MgdGhhdCBjYW4gYXBwZWFyIGluXG5bYEtleUV2ZW50LmtleWBdKGh0dHBzOmRldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkpLlxuVXNlIGxvd2VyY2FzZSBsZXR0ZXJzIHRvIHJlZmVyIHRvIGxldHRlciBrZXlzIChvciB1cHBlcmNhc2UgbGV0dGVyc1xuaWYgeW91IHdhbnQgc2hpZnQgdG8gYmUgaGVsZCkuIFlvdSBtYXkgdXNlIGBcIlNwYWNlXCJgIGFzIGFuIGFsaWFzXG5mb3IgdGhlIGBcIiBcImAgbmFtZS5cblxuTW9kaWZpZXJzIGNhbiBiZSBnaXZlbiBpbiBhbnkgb3JkZXIuIGBTaGlmdC1gIChvciBgcy1gKSwgYEFsdC1gIChvclxuYGEtYCksIGBDdHJsLWAgKG9yIGBjLWAgb3IgYENvbnRyb2wtYCkgYW5kIGBDbWQtYCAob3IgYG0tYCBvclxuYE1ldGEtYCkgYXJlIHJlY29nbml6ZWQuIEZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgaG9sZGluZ1xuc2hpZnQsIHRoZSBgU2hpZnQtYCBwcmVmaXggaXMgaW1wbGllZCwgYW5kIHNob3VsZCBub3QgYmUgYWRkZWRcbmV4cGxpY2l0bHkuXG5cbllvdSBjYW4gdXNlIGBNb2QtYCBhcyBhIHNob3J0aGFuZCBmb3IgYENtZC1gIG9uIE1hYyBhbmQgYEN0cmwtYCBvblxub3RoZXIgcGxhdGZvcm1zLlxuXG5Zb3UgY2FuIGFkZCBtdWx0aXBsZSBrZXltYXAgcGx1Z2lucyB0byBhbiBlZGl0b3IuIFRoZSBvcmRlciBpblxud2hpY2ggdGhleSBhcHBlYXIgZGV0ZXJtaW5lcyB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBlYXJseSBpblxudGhlIGFycmF5IGdldCB0byBkaXNwYXRjaCBmaXJzdCkuXG4qL1xuZnVuY3Rpb24ga2V5bWFwKGJpbmRpbmdzKSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oeyBwcm9wczogeyBoYW5kbGVLZXlEb3duOiBrZXlkb3duSGFuZGxlcihiaW5kaW5ncykgfSB9KTtcbn1cbi8qKlxuR2l2ZW4gYSBzZXQgb2YgYmluZGluZ3MgKHVzaW5nIHRoZSBzYW1lIGZvcm1hdCBhc1xuW2BrZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8ja2V5bWFwLmtleW1hcCkpLCByZXR1cm4gYSBba2V5ZG93blxuaGFuZGxlcl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuaGFuZGxlS2V5RG93bikgdGhhdCBoYW5kbGVzIHRoZW0uXG4qL1xuZnVuY3Rpb24ga2V5ZG93bkhhbmRsZXIoYmluZGluZ3MpIHtcbiAgICBsZXQgbWFwID0gbm9ybWFsaXplKGJpbmRpbmdzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZpZXcsIGV2ZW50KSB7XG4gICAgICAgIGxldCBuYW1lID0ga2V5TmFtZShldmVudCksIGJhc2VOYW1lLCBkaXJlY3QgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50KV07XG4gICAgICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0KHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gsIHZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIEEgY2hhcmFjdGVyIGtleVxuICAgICAgICBpZiAobmFtZS5sZW5ndGggPT0gMSAmJiBuYW1lICE9IFwiIFwiKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBuYW1lIHdhcyBhbHJlYWR5IG1vZGlmaWVkIGJ5IHNoaWZ0LCB0cnkgbG9va2luZ1xuICAgICAgICAgICAgICAgIC8vIGl0IHVwIHdpdGhvdXQgaXRzIHNoaWZ0IG1vZGlmaWVyXG4gICAgICAgICAgICAgICAgbGV0IG5vU2hpZnQgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBmYWxzZSldO1xuICAgICAgICAgICAgICAgIGlmIChub1NoaWZ0ICYmIG5vU2hpZnQodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBuYW1lLmNoYXJDb2RlQXQoMCkgPiAxMjcpICYmXG4gICAgICAgICAgICAgICAgKGJhc2VOYW1lID0gYmFzZVtldmVudC5rZXlDb2RlXSkgJiYgYmFzZU5hbWUgIT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFRyeSBmYWxsaW5nIGJhY2sgdG8gdGhlIGtleUNvZGUgd2hlbiB0aGVyZSdzIGEgbW9kaWZpZXJcbiAgICAgICAgICAgICAgICAvLyBhY3RpdmUgb3IgdGhlIGNoYXJhY3RlciBwcm9kdWNlZCBpc24ndCBBU0NJSSwgYW5kIG91ciB0YWJsZVxuICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VzIGEgZGlmZmVyZW50IG5hbWUgZnJvbSB0aGUgdGhlIGtleUNvZGUuIFNlZSAjNjY4LFxuICAgICAgICAgICAgICAgIC8vICMxMDYwXG4gICAgICAgICAgICAgICAgbGV0IGZyb21Db2RlID0gbWFwW21vZGlmaWVycyhiYXNlTmFtZSwgZXZlbnQpXTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUNvZGUgJiYgZnJvbUNvZGUodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxuXG5leHBvcnQgeyBrZXlkb3duSGFuZGxlciwga2V5bWFwIH07XG4iLCAiaW1wb3J0IHsgbGlmdFRhcmdldCwgcmVwbGFjZVN0ZXAsIFJlcGxhY2VTdGVwLCBjYW5Kb2luLCBqb2luUG9pbnQsIGNhblNwbGl0LCBSZXBsYWNlQXJvdW5kU3RlcCwgZmluZFdyYXBwaW5nIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcbmltcG9ydCB7IFNsaWNlLCBGcmFnbWVudCB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IE5vZGVTZWxlY3Rpb24sIFNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiwgQWxsU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG4vKipcbkRlbGV0ZSB0aGUgc2VsZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4qL1xuY29uc3QgZGVsZXRlU2VsZWN0aW9uID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldykge1xuICAgIGxldCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRjdXJzb3IgfHwgKHZpZXcgPyAhdmlldy5lbmRPZlRleHRibG9jayhcImJhY2t3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0ID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiAkY3Vyc29yO1xufVxuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2ssIHRyeSB0b1xucmVkdWNlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoYXQgYmxvY2sgYW5kIHRoZSBvbmUgYmVmb3JlIGl0XHUyMDE0aWZcbnRoZXJlJ3MgYSBibG9jayBkaXJlY3RseSBiZWZvcmUgaXQgdGhhdCBjYW4gYmUgam9pbmVkLCBqb2luIHRoZW0uXG5JZiBub3QsIHRyeSB0byBtb3ZlIHRoZSBzZWxlY3RlZCBibG9jayBjbG9zZXIgdG8gdGhlIG5leHQgb25lIGluXG50aGUgZG9jdW1lbnQgc3RydWN0dXJlIGJ5IGxpZnRpbmcgaXQgb3V0IG9mIGl0cyBwYXJlbnQgb3IgbW92aW5nIGl0XG5pbnRvIGEgcGFyZW50IG9mIHRoZSBwcmV2aW91cyBibG9jay4gV2lsbCB1c2UgdGhlIHZpZXcgZm9yIGFjY3VyYXRlXG4oYmlkaS1hd2FyZSkgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrU3RhcnQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEJlZm9yZSgkY3Vyc29yKTtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBub2RlIGJlZm9yZSB0aGlzLCB0cnkgdG8gbGlmdFxuICAgIGlmICghJGN1dCkge1xuICAgICAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIubGlmdChyYW5nZSwgdGFyZ2V0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBiZWZvcmUgPSAkY3V0Lm5vZGVCZWZvcmU7XG4gICAgLy8gQXBwbHkgdGhlIGpvaW5pbmcgYWxnb3JpdGhtXG4gICAgaWYgKCFiZWZvcmUudHlwZS5zcGVjLmlzb2xhdGluZyAmJiBkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGJlbG93IGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBhYm92ZSBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBiZWxvdyBhbmQgc2VsZWN0IHRoZSBvbmUgYWJvdmUuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChiZWZvcmUsIFwiZW5kXCIpIHx8IE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKGJlZm9yZSkpKSB7XG4gICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZSgpLCAkY3Vyc29yLmFmdGVyKCksIFNsaWNlLmVtcHR5KTtcbiAgICAgICAgaWYgKGRlbFN0ZXAgJiYgZGVsU3RlcC5zbGljZS5zaXplIDwgZGVsU3RlcC50byAtIGRlbFN0ZXAuZnJvbSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChkZWxTdGVwKTtcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24odGV4dGJsb2NrQXQoYmVmb3JlLCBcImVuZFwiKSA/IFNlbGVjdGlvbi5maW5kRnJvbSh0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcCgkY3V0LnBvcywgLTEpKSwgLTEpXG4gICAgICAgICAgICAgICAgICAgIDogTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCAkY3V0LnBvcyAtIGJlZm9yZS5ub2RlU2l6ZSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5vZGUgYmVmb3JlIGlzIGFuIGF0b20sIGRlbGV0ZSBpdFxuICAgIGlmIChiZWZvcmUuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkY3V0LnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5BIG1vcmUgbGltaXRlZCBmb3JtIG9mIFtgam9pbkJhY2t3YXJkYF0oJGNvbW1hbmRzLmpvaW5CYWNrd2FyZClcbnRoYXQgb25seSB0cmllcyB0byBqb2luIHRoZSBjdXJyZW50IHRleHRibG9jayB0byB0aGUgb25lIGJlZm9yZVxuaXQsIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLlxuKi9cbmNvbnN0IGpvaW5UZXh0YmxvY2tCYWNrd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldyk7XG4gICAgaWYgKCEkY3Vyc29yKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRjdXQgPSBmaW5kQ3V0QmVmb3JlKCRjdXJzb3IpO1xuICAgIHJldHVybiAkY3V0ID8gam9pblRleHRibG9ja3NBcm91bmQoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSA6IGZhbHNlO1xufTtcbi8qKlxuQSBtb3JlIGxpbWl0ZWQgZm9ybSBvZiBbYGpvaW5Gb3J3YXJkYF0oJGNvbW1hbmRzLmpvaW5Gb3J3YXJkKVxudGhhdCBvbmx5IHRyaWVzIHRvIGpvaW4gdGhlIGN1cnJlbnQgdGV4dGJsb2NrIHRvIHRoZSBvbmUgYWZ0ZXJcbml0LCBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2suXG4qL1xuY29uc3Qgam9pblRleHRibG9ja0ZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrRW5kKHN0YXRlLCB2aWV3KTtcbiAgICBpZiAoISRjdXJzb3IpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJGN1dCA9IGZpbmRDdXRBZnRlcigkY3Vyc29yKTtcbiAgICByZXR1cm4gJGN1dCA/IGpvaW5UZXh0YmxvY2tzQXJvdW5kKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiBqb2luVGV4dGJsb2Nrc0Fyb3VuZChzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJGN1dC5ub2RlQmVmb3JlLCBiZWZvcmVUZXh0ID0gYmVmb3JlLCBiZWZvcmVQb3MgPSAkY3V0LnBvcyAtIDE7XG4gICAgZm9yICg7ICFiZWZvcmVUZXh0LmlzVGV4dGJsb2NrOyBiZWZvcmVQb3MtLSkge1xuICAgICAgICBpZiAoYmVmb3JlVGV4dC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSBiZWZvcmVUZXh0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFjaGlsZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYmVmb3JlVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyUG9zID0gJGN1dC5wb3MgKyAxO1xuICAgIGZvciAoOyAhYWZ0ZXJUZXh0LmlzVGV4dGJsb2NrOyBhZnRlclBvcysrKSB7XG4gICAgICAgIGlmIChhZnRlclRleHQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGNoaWxkID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGFmdGVyVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgc3RlcCA9IHJlcGxhY2VTdGVwKHN0YXRlLmRvYywgYmVmb3JlUG9zLCBhZnRlclBvcywgU2xpY2UuZW1wdHkpO1xuICAgIGlmICghc3RlcCB8fCBzdGVwLmZyb20gIT0gYmVmb3JlUG9zIHx8XG4gICAgICAgIHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCAmJiBzdGVwLnNsaWNlLnNpemUgPj0gYWZ0ZXJQb3MgLSBiZWZvcmVQb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChzdGVwKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgYmVmb3JlUG9zKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRleHRibG9ja0F0KG5vZGUsIHNpZGUsIG9ubHkgPSBmYWxzZSkge1xuICAgIGZvciAobGV0IHNjYW4gPSBub2RlOyBzY2FuOyBzY2FuID0gKHNpZGUgPT0gXCJzdGFydFwiID8gc2Nhbi5maXJzdENoaWxkIDogc2Nhbi5sYXN0Q2hpbGQpKSB7XG4gICAgICAgIGlmIChzY2FuLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvbmx5ICYmIHNjYW4uY2hpbGRDb3VudCAhPSAxKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLCBzZWxlY3RcbnRoZSBub2RlIGJlZm9yZSB0aGF0IHRleHRibG9jaywgaWYgcG9zc2libGUuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbmJvdW5kIHRvIGtleXMgbGlrZSBiYWNrc3BhY2UsIGFmdGVyXG5bYGpvaW5CYWNrd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luQmFja3dhcmQpIG9yIG90aGVyIGRlbGV0aW5nXG5jb21tYW5kcywgYXMgYSBmYWxsLWJhY2sgYmVoYXZpb3Igd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3QgYWxsb3dcbmRlbGV0aW9uIGF0IHRoZSBzZWxlY3RlZCBwb2ludC5cbiovXG5jb25zdCBzZWxlY3ROb2RlQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiYmFja3dhcmRcIiwgc3RhdGUpIDogJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgJGN1dCA9IGZpbmRDdXRCZWZvcmUoJGhlYWQpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9ICRjdXQgJiYgJGN1dC5ub2RlQmVmb3JlO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zIC0gbm9kZS5ub2RlU2l6ZSkpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGZpbmRDdXRCZWZvcmUoJHBvcykge1xuICAgIGlmICghJHBvcy5wYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKCRwb3MuaW5kZXgoaSkgPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmRvYy5yZXNvbHZlKCRwb3MuYmVmb3JlKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGkpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpIHtcbiAgICBsZXQgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkY3Vyc29yIHx8ICh2aWV3ID8gIXZpZXcuZW5kT2ZUZXh0YmxvY2soXCJmb3J3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0IDwgJGN1cnNvci5wYXJlbnQuY29udGVudC5zaXplKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuICRjdXJzb3I7XG59XG4vKipcbklmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYW5kIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiBhXG50ZXh0YmxvY2ssIHRyeSB0byByZWR1Y2Ugb3IgcmVtb3ZlIHRoZSBib3VuZGFyeSBiZXR3ZWVuIHRoYXQgYmxvY2tcbmFuZCB0aGUgb25lIGFmdGVyIGl0LCBlaXRoZXIgYnkgam9pbmluZyB0aGVtIG9yIGJ5IG1vdmluZyB0aGUgb3RoZXJcbmJsb2NrIGNsb3NlciB0byB0aGlzIG9uZSBpbiB0aGUgdHJlZSBzdHJ1Y3R1cmUuIFdpbGwgdXNlIHRoZSB2aWV3XG5mb3IgYWNjdXJhdGUgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luRm9yd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEFmdGVyKCRjdXJzb3IpO1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYWZ0ZXIgdGhpcywgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCEkY3V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFmdGVyID0gJGN1dC5ub2RlQWZ0ZXI7XG4gICAgLy8gVHJ5IHRoZSBqb2luaW5nIGFsZ29yaXRobVxuICAgIGlmIChkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGFib3ZlIGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBiZWxvdyBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBhYm92ZSBhbmQgc2VsZWN0IHRoZSBvbmUgYmVsb3cuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChhZnRlciwgXCJzdGFydFwiKSB8fCBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShhZnRlcikpKSB7XG4gICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZSgpLCAkY3Vyc29yLmFmdGVyKCksIFNsaWNlLmVtcHR5KTtcbiAgICAgICAgaWYgKGRlbFN0ZXAgJiYgZGVsU3RlcC5zbGljZS5zaXplIDwgZGVsU3RlcC50byAtIGRlbFN0ZXAuZnJvbSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChkZWxTdGVwKTtcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24odGV4dGJsb2NrQXQoYWZ0ZXIsIFwic3RhcnRcIikgPyBTZWxlY3Rpb24uZmluZEZyb20odHIuZG9jLnJlc29sdmUodHIubWFwcGluZy5tYXAoJGN1dC5wb3MpKSwgMSlcbiAgICAgICAgICAgICAgICAgICAgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsIHRyLm1hcHBpbmcubWFwKCRjdXQucG9zKSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5leHQgbm9kZSBpcyBhbiBhdG9tLCBkZWxldGUgaXRcbiAgICBpZiAoYWZ0ZXIuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIGVuZCBvZiBhIHRleHRibG9jaywgc2VsZWN0XG50aGUgbm9kZSBjb21pbmcgYWZ0ZXIgdGhhdCB0ZXh0YmxvY2ssIGlmIHBvc3NpYmxlLiBUaGlzIGlzIGludGVuZGVkXG50byBiZSBib3VuZCB0byBrZXlzIGxpa2UgZGVsZXRlLCBhZnRlclxuW2Bqb2luRm9yd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luRm9yd2FyZCkgYW5kIHNpbWlsYXIgZGVsZXRpbmdcbmNvbW1hbmRzLCB0byBwcm92aWRlIGEgZmFsbC1iYWNrIGJlaGF2aW9yIHdoZW4gdGhlIHNjaGVtYSBkb2Vzbid0XG5hbGxvdyBkZWxldGlvbiBhdCB0aGUgc2VsZWN0ZWQgcG9pbnQuXG4qL1xuY29uc3Qgc2VsZWN0Tm9kZUZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiZm9yd2FyZFwiLCBzdGF0ZSkgOiAkaGVhZC5wYXJlbnRPZmZzZXQgPCAkaGVhZC5wYXJlbnQuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAkY3V0ID0gZmluZEN1dEFmdGVyKCRoZWFkKTtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSAkY3V0ICYmICRjdXQubm9kZUFmdGVyO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zKSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZmluZEN1dEFmdGVyKCRwb3MpIHtcbiAgICBpZiAoISRwb3MucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkcG9zLm5vZGUoaSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5pbmRleChpKSArIDEgPCBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5kb2MucmVzb2x2ZSgkcG9zLmFmdGVyKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuSm9pbiB0aGUgc2VsZWN0ZWQgYmxvY2sgb3IsIGlmIHRoZXJlIGlzIGEgdGV4dCBzZWxlY3Rpb24sIHRoZVxuY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGUgc2VsZWN0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCwgd2l0aFxudGhlIHNpYmxpbmcgYWJvdmUgaXQuXG4qL1xuY29uc3Qgam9pblVwID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIG5vZGVTZWwgPSBzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uLCBwb2ludDtcbiAgICBpZiAobm9kZVNlbCkge1xuICAgICAgICBpZiAoc2VsLm5vZGUuaXNUZXh0YmxvY2sgfHwgIWNhbkpvaW4oc3RhdGUuZG9jLCBzZWwuZnJvbSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLmZyb207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwb2ludCA9IGpvaW5Qb2ludChzdGF0ZS5kb2MsIHNlbC5mcm9tLCAtMSk7XG4gICAgICAgIGlmIChwb2ludCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuam9pbihwb2ludCk7XG4gICAgICAgIGlmIChub2RlU2VsKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgcG9pbnQgLSBzdGF0ZS5kb2MucmVzb2x2ZShwb2ludCkubm9kZUJlZm9yZS5ub2RlU2l6ZSkpO1xuICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5Kb2luIHRoZSBzZWxlY3RlZCBibG9jaywgb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3Igb2YgdGhlIHNlbGVjdGlvblxudGhhdCBjYW4gYmUgam9pbmVkLCB3aXRoIHRoZSBzaWJsaW5nIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGpvaW5Eb3duID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIHBvaW50O1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGlmIChzZWwubm9kZS5pc1RleHRibG9jayB8fCAhY2FuSm9pbihzdGF0ZS5kb2MsIHNlbC50bykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLnRvO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcG9pbnQgPSBqb2luUG9pbnQoc3RhdGUuZG9jLCBzZWwudG8sIDEpO1xuICAgICAgICBpZiAocG9pbnQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5qb2luKHBvaW50KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbkxpZnQgdGhlIHNlbGVjdGVkIGJsb2NrLCBvciB0aGUgY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGVcbnNlbGVjdGlvbiB0aGF0IGNhbiBiZSBsaWZ0ZWQsIG91dCBvZiBpdHMgcGFyZW50IG5vZGUuXG4qL1xuY29uc3QgbGlmdCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pLCB0YXJnZXQgPSByYW5nZSAmJiBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmxpZnQocmFuZ2UsIHRhcmdldCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aG9zZSB0eXBlIGhhcyBhIHRydXRoeVxuW2Bjb2RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmNvZGUpIHByb3BlcnR5IGluIGl0cyBzcGVjLCByZXBsYWNlIHRoZVxuc2VsZWN0aW9uIHdpdGggYSBuZXdsaW5lIGNoYXJhY3Rlci5cbiovXG5jb25zdCBuZXdsaW5lSW5Db2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmluc2VydFRleHQoXCJcXG5cIikuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZGVmYXVsdEJsb2NrQXQobWF0Y2gpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLmVkZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCB7IHR5cGUgfSA9IG1hdGNoLmVkZ2UoaSk7XG4gICAgICAgIGlmICh0eXBlLmlzVGV4dGJsb2NrICYmICF0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSlcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aXRoIGEgdHJ1dGh5XG5bYGNvZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29kZSkgcHJvcGVydHkgaW4gaXRzIHNwZWMsIGNyZWF0ZSBhXG5kZWZhdWx0IGJsb2NrIGFmdGVyIHRoZSBjb2RlIGJsb2NrLCBhbmQgbW92ZSB0aGUgY3Vyc29yIHRoZXJlLlxuKi9cbmNvbnN0IGV4aXRDb2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYWJvdmUgPSAkaGVhZC5ub2RlKC0xKSwgYWZ0ZXIgPSAkaGVhZC5pbmRleEFmdGVyKC0xKSwgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KGFib3ZlLmNvbnRlbnRNYXRjaEF0KGFmdGVyKSk7XG4gICAgaWYgKCF0eXBlIHx8ICFhYm92ZS5jYW5SZXBsYWNlV2l0aChhZnRlciwgYWZ0ZXIsIHR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBwb3MgPSAkaGVhZC5hZnRlcigpLCB0ciA9IHN0YXRlLnRyLnJlcGxhY2VXaXRoKHBvcywgcG9zLCB0eXBlLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShwb3MpLCAxKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbklmIGEgYmxvY2sgbm9kZSBpcyBzZWxlY3RlZCwgY3JlYXRlIGFuIGVtcHR5IHBhcmFncmFwaCBiZWZvcmUgKGlmXG5pdCBpcyBpdHMgcGFyZW50J3MgZmlyc3QgY2hpbGQpIG9yIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGNyZWF0ZVBhcmFncmFwaE5lYXIgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbiwgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiB8fCAkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCAkdG8ucGFyZW50LmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KCR0by5wYXJlbnQuY29udGVudE1hdGNoQXQoJHRvLmluZGV4QWZ0ZXIoKSkpO1xuICAgIGlmICghdHlwZSB8fCAhdHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICBsZXQgc2lkZSA9ICghJGZyb20ucGFyZW50T2Zmc2V0ICYmICR0by5pbmRleCgpIDwgJHRvLnBhcmVudC5jaGlsZENvdW50ID8gJGZyb20gOiAkdG8pLnBvcztcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuaW5zZXJ0KHNpZGUsIHR5cGUuY3JlYXRlQW5kRmlsbCgpKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgc2lkZSArIDEpKTtcbiAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuSWYgdGhlIGN1cnNvciBpcyBpbiBhbiBlbXB0eSB0ZXh0YmxvY2sgdGhhdCBjYW4gYmUgbGlmdGVkLCBsaWZ0IHRoZVxuYmxvY2suXG4qL1xuY29uc3QgbGlmdEVtcHR5QmxvY2sgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGN1cnNvciB8fCAkY3Vyc29yLnBhcmVudC5jb250ZW50LnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoJGN1cnNvci5kZXB0aCA+IDEgJiYgJGN1cnNvci5hZnRlcigpICE9ICRjdXJzb3IuZW5kKC0xKSkge1xuICAgICAgICBsZXQgYmVmb3JlID0gJGN1cnNvci5iZWZvcmUoKTtcbiAgICAgICAgaWYgKGNhblNwbGl0KHN0YXRlLmRvYywgYmVmb3JlKSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNwbGl0KGJlZm9yZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuQ3JlYXRlIGEgdmFyaWFudCBvZiBbYHNwbGl0QmxvY2tgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuc3BsaXRCbG9jaykgdGhhdCB1c2VzXG5hIGN1c3RvbSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIG5ld2x5IHNwbGl0IG9mZiBibG9jay5cbiovXG5mdW5jdGlvbiBzcGxpdEJsb2NrQXMoc3BsaXROb2RlKSB7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBzdGF0ZS5zZWxlY3Rpb24ubm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgICBpZiAoISRmcm9tLnBhcmVudE9mZnNldCB8fCAhY2FuU3BsaXQoc3RhdGUuZG9jLCAkZnJvbS5wb3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zcGxpdCgkZnJvbS5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkZnJvbS5wYXJlbnQuaXNCbG9jaylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgYXRFbmQgPSAkdG8ucGFyZW50T2Zmc2V0ID09ICR0by5wYXJlbnQuY29udGVudC5zaXplO1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiB8fCBzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgdHIuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBsZXQgZGVmbHQgPSAkZnJvbS5kZXB0aCA9PSAwID8gbnVsbCA6IGRlZmF1bHRCbG9ja0F0KCRmcm9tLm5vZGUoLTEpLmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4QWZ0ZXIoLTEpKSk7XG4gICAgICAgICAgICBsZXQgc3BsaXRUeXBlID0gc3BsaXROb2RlICYmIHNwbGl0Tm9kZSgkdG8ucGFyZW50LCBhdEVuZCk7XG4gICAgICAgICAgICBsZXQgdHlwZXMgPSBzcGxpdFR5cGUgPyBbc3BsaXRUeXBlXSA6IGF0RW5kICYmIGRlZmx0ID8gW3sgdHlwZTogZGVmbHQgfV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgY2FuID0gY2FuU3BsaXQodHIuZG9jLCB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCB0eXBlcyk7XG4gICAgICAgICAgICBpZiAoIXR5cGVzICYmICFjYW4gJiYgY2FuU3BsaXQodHIuZG9jLCB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCBkZWZsdCA/IFt7IHR5cGU6IGRlZmx0IH1dIDogdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWZsdClcbiAgICAgICAgICAgICAgICAgICAgdHlwZXMgPSBbeyB0eXBlOiBkZWZsdCB9XTtcbiAgICAgICAgICAgICAgICBjYW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhbikge1xuICAgICAgICAgICAgICAgIHRyLnNwbGl0KHRyLm1hcHBpbmcubWFwKCRmcm9tLnBvcyksIDEsIHR5cGVzKTtcbiAgICAgICAgICAgICAgICBpZiAoIWF0RW5kICYmICEkZnJvbS5wYXJlbnRPZmZzZXQgJiYgJGZyb20ucGFyZW50LnR5cGUgIT0gZGVmbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHIubWFwcGluZy5tYXAoJGZyb20uYmVmb3JlKCkpLCAkZmlyc3QgPSB0ci5kb2MucmVzb2x2ZShmaXJzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZsdCAmJiAkZnJvbS5ub2RlKC0xKS5jYW5SZXBsYWNlV2l0aCgkZmlyc3QuaW5kZXgoKSwgJGZpcnN0LmluZGV4KCkgKyAxLCBkZWZsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXROb2RlTWFya3VwKHRyLm1hcHBpbmcubWFwKCRmcm9tLmJlZm9yZSgpKSwgZGVmbHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblNwbGl0IHRoZSBwYXJlbnQgYmxvY2sgb2YgdGhlIHNlbGVjdGlvbi4gSWYgdGhlIHNlbGVjdGlvbiBpcyBhIHRleHRcbnNlbGVjdGlvbiwgYWxzbyBkZWxldGUgaXRzIGNvbnRlbnQuXG4qL1xuY29uc3Qgc3BsaXRCbG9jayA9IHNwbGl0QmxvY2tBcygpO1xuLyoqXG5BY3RzIGxpa2UgW2BzcGxpdEJsb2NrYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLnNwbGl0QmxvY2spLCBidXQgd2l0aG91dFxucmVzZXR0aW5nIHRoZSBzZXQgb2YgYWN0aXZlIG1hcmtzIGF0IHRoZSBjdXJzb3IuXG4qL1xuY29uc3Qgc3BsaXRCbG9ja0tlZXBNYXJrcyA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICByZXR1cm4gc3BsaXRCbG9jayhzdGF0ZSwgZGlzcGF0Y2ggJiYgKHRyID0+IHtcbiAgICAgICAgbGV0IG1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3MgfHwgKHN0YXRlLnNlbGVjdGlvbi4kdG8ucGFyZW50T2Zmc2V0ICYmIHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKTtcbiAgICAgICAgaWYgKG1hcmtzKVxuICAgICAgICAgICAgdHIuZW5zdXJlTWFya3MobWFya3MpO1xuICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgfSkpO1xufTtcbi8qKlxuTW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBub2RlIHdyYXBwaW5nIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgaWZcbmFueS4gKFdpbGwgbm90IHNlbGVjdCB0aGUgZG9jdW1lbnQgbm9kZS4pXG4qL1xuY29uc3Qgc2VsZWN0UGFyZW50Tm9kZSA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgdG8gfSA9IHN0YXRlLnNlbGVjdGlvbiwgcG9zO1xuICAgIGxldCBzYW1lID0gJGZyb20uc2hhcmVkRGVwdGgodG8pO1xuICAgIGlmIChzYW1lID09IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBwb3MgPSAkZnJvbS5iZWZvcmUoc2FtZSk7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBwb3MpKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5TZWxlY3QgdGhlIHdob2xlIGRvY3VtZW50LlxuKi9cbmNvbnN0IHNlbGVjdEFsbCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXcgQWxsU2VsZWN0aW9uKHN0YXRlLmRvYykpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBqb2luTWF5YmVDbGVhcihzdGF0ZSwgJHBvcywgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJHBvcy5ub2RlQmVmb3JlLCBhZnRlciA9ICRwb3Mubm9kZUFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICBpZiAoIWJlZm9yZSB8fCAhYWZ0ZXIgfHwgIWJlZm9yZS50eXBlLmNvbXBhdGlibGVDb250ZW50KGFmdGVyLnR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFiZWZvcmUuY29udGVudC5zaXplICYmICRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXggLSAxLCBpbmRleCkpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRwb3MucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkcG9zLnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoISRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSkgfHwgIShhZnRlci5pc1RleHRibG9jayB8fCBjYW5Kb2luKHN0YXRlLmRvYywgJHBvcy5wb3MpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHJcbiAgICAgICAgICAgIC5jbGVhckluY29tcGF0aWJsZSgkcG9zLnBvcywgYmVmb3JlLnR5cGUsIGJlZm9yZS5jb250ZW50TWF0Y2hBdChiZWZvcmUuY2hpbGRDb3VudCkpXG4gICAgICAgICAgICAuam9pbigkcG9zLnBvcylcbiAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZUJhcnJpZXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSB7XG4gICAgbGV0IGJlZm9yZSA9ICRjdXQubm9kZUJlZm9yZSwgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgY29ubiwgbWF0Y2g7XG4gICAgaWYgKGJlZm9yZS50eXBlLnNwZWMuaXNvbGF0aW5nIHx8IGFmdGVyLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoam9pbk1heWJlQ2xlYXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGNhbkRlbEFmdGVyID0gJGN1dC5wYXJlbnQuY2FuUmVwbGFjZSgkY3V0LmluZGV4KCksICRjdXQuaW5kZXgoKSArIDEpO1xuICAgIGlmIChjYW5EZWxBZnRlciAmJlxuICAgICAgICAoY29ubiA9IChtYXRjaCA9IGJlZm9yZS5jb250ZW50TWF0Y2hBdChiZWZvcmUuY2hpbGRDb3VudCkpLmZpbmRXcmFwcGluZyhhZnRlci50eXBlKSkgJiZcbiAgICAgICAgbWF0Y2gubWF0Y2hUeXBlKGNvbm5bMF0gfHwgYWZ0ZXIudHlwZSkudmFsaWRFbmQpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gJGN1dC5wb3MgKyBhZnRlci5ub2RlU2l6ZSwgd3JhcCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbm4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oY29ubltpXS5jcmVhdGUobnVsbCwgd3JhcCkpO1xuICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oYmVmb3JlLmNvcHkod3JhcCkpO1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoJGN1dC5wb3MgLSAxLCBlbmQsICRjdXQucG9zLCBlbmQsIG5ldyBTbGljZSh3cmFwLCAxLCAwKSwgY29ubi5sZW5ndGgsIHRydWUpKTtcbiAgICAgICAgICAgIGxldCBqb2luQXQgPSBlbmQgKyAyICogY29ubi5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoY2FuSm9pbih0ci5kb2MsIGpvaW5BdCkpXG4gICAgICAgICAgICAgICAgdHIuam9pbihqb2luQXQpO1xuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBzZWxBZnRlciA9IFNlbGVjdGlvbi5maW5kRnJvbSgkY3V0LCAxKTtcbiAgICBsZXQgcmFuZ2UgPSBzZWxBZnRlciAmJiBzZWxBZnRlci4kZnJvbS5ibG9ja1JhbmdlKHNlbEFmdGVyLiR0byksIHRhcmdldCA9IHJhbmdlICYmIGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgPj0gJGN1dC5kZXB0aCkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNhbkRlbEFmdGVyICYmIHRleHRibG9ja0F0KGFmdGVyLCBcInN0YXJ0XCIsIHRydWUpICYmIHRleHRibG9ja0F0KGJlZm9yZSwgXCJlbmRcIikpIHtcbiAgICAgICAgbGV0IGF0ID0gYmVmb3JlLCB3cmFwID0gW107XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIHdyYXAucHVzaChhdCk7XG4gICAgICAgICAgICBpZiAoYXQuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBhdCA9IGF0Lmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyRGVwdGggPSAxO1xuICAgICAgICBmb3IgKDsgIWFmdGVyVGV4dC5pc1RleHRibG9jazsgYWZ0ZXJUZXh0ID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICBhZnRlckRlcHRoKys7XG4gICAgICAgIGlmIChhdC5jYW5SZXBsYWNlKGF0LmNoaWxkQ291bnQsIGF0LmNoaWxkQ291bnQsIGFmdGVyVGV4dC5jb250ZW50KSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB3cmFwLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgICAgICAgICBlbmQgPSBGcmFnbWVudC5mcm9tKHdyYXBbaV0uY29weShlbmQpKTtcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkY3V0LnBvcyAtIHdyYXAubGVuZ3RoLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplLCAkY3V0LnBvcyArIGFmdGVyRGVwdGgsICRjdXQucG9zICsgYWZ0ZXIubm9kZVNpemUgLSBhZnRlckRlcHRoLCBuZXcgU2xpY2UoZW5kLCB3cmFwLmxlbmd0aCwgMCksIDAsIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdFRleHRibG9ja1NpZGUoc2lkZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sICRwb3MgPSBzaWRlIDwgMCA/IHNlbC4kZnJvbSA6IHNlbC4kdG87XG4gICAgICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGg7XG4gICAgICAgIHdoaWxlICgkcG9zLm5vZGUoZGVwdGgpLmlzSW5saW5lKSB7XG4gICAgICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkcG9zLm5vZGUoZGVwdGgpLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBzaWRlIDwgMCA/ICRwb3Muc3RhcnQoZGVwdGgpIDogJHBvcy5lbmQoZGVwdGgpKSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5Nb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IHRleHQgYmxvY2suXG4qL1xuY29uc3Qgc2VsZWN0VGV4dGJsb2NrU3RhcnQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKC0xKTtcbi8qKlxuTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIGN1cnJlbnQgdGV4dCBibG9jay5cbiovXG5jb25zdCBzZWxlY3RUZXh0YmxvY2tFbmQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKDEpO1xuLy8gUGFyYW1ldGVyaXplZCBjb21tYW5kc1xuLyoqXG5XcmFwIHRoZSBzZWxlY3Rpb24gaW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuXG5hdHRyaWJ1dGVzLlxuKi9cbmZ1bmN0aW9uIHdyYXBJbihub2RlVHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byksIHdyYXBwaW5nID0gcmFuZ2UgJiYgZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMpO1xuICAgICAgICBpZiAoIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci53cmFwKHJhbmdlLCB3cmFwcGluZykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblJldHVybnMgYSBjb21tYW5kIHRoYXQgdHJpZXMgdG8gc2V0IHRoZSBzZWxlY3RlZCB0ZXh0YmxvY2tzIHRvIHRoZVxuZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4qL1xuZnVuY3Rpb24gc2V0QmxvY2tUeXBlKG5vZGVUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgYXBwbGljYWJsZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoICYmICFhcHBsaWNhYmxlOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tOiB7IHBvczogZnJvbSB9LCAkdG86IHsgcG9zOiB0byB9IH0gPSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzW2ldO1xuICAgICAgICAgICAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhYmxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrIHx8IG5vZGUuaGFzTWFya3VwKG5vZGVUeXBlLCBhdHRycykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09IG5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0ICRwb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9ICRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCArIDEsIG5vZGVUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFwcGxpY2FibGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyAkZnJvbTogeyBwb3M6IGZyb20gfSwgJHRvOiB7IHBvczogdG8gfSB9ID0gc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICB0ci5zZXRCbG9ja1R5cGUoZnJvbSwgdG8sIG5vZGVUeXBlLCBhdHRycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbWFya0FwcGxpZXMoZG9jLCByYW5nZXMsIHR5cGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV07XG4gICAgICAgIGxldCBjYW4gPSAkZnJvbS5kZXB0aCA9PSAwID8gZG9jLmlubGluZUNvbnRlbnQgJiYgZG9jLnR5cGUuYWxsb3dzTWFya1R5cGUodHlwZSkgOiBmYWxzZTtcbiAgICAgICAgZG9jLm5vZGVzQmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MsIG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYW4gPSBub2RlLmlubGluZUNvbnRlbnQgJiYgbm9kZS50eXBlLmFsbG93c01hcmtUeXBlKHR5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB0b2dnbGVzIHRoZSBnaXZlbiBtYXJrIHdpdGggdGhlXG5naXZlbiBhdHRyaWJ1dGVzLiBXaWxsIHJldHVybiBgZmFsc2VgIHdoZW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG5kb2Vzbid0IHN1cHBvcnQgdGhhdCBtYXJrLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBtYXJrIGlmIGFueSBtYXJrc1xub2YgdGhhdCB0eXBlIGV4aXN0IGluIHRoZSBzZWxlY3Rpb24sIG9yIGFkZCBpdCBvdGhlcndpc2UuIElmIHRoZVxuc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGlzIGFwcGxpZXMgdG8gdGhlIFtzdG9yZWRcbm1hcmtzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuc3RvcmVkTWFya3MpIGluc3RlYWQgb2YgYSByYW5nZSBvZiB0aGVcbmRvY3VtZW50LlxuKi9cbmZ1bmN0aW9uIHRvZ2dsZU1hcmsobWFya1R5cGUsIGF0dHJzID0gbnVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7IGVtcHR5LCAkY3Vyc29yLCByYW5nZXMgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKChlbXB0eSAmJiAhJGN1cnNvcikgfHwgIW1hcmtBcHBsaWVzKHN0YXRlLmRvYywgcmFuZ2VzLCBtYXJrVHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgaWYgKCRjdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAobWFya1R5cGUuaXNJblNldChzdGF0ZS5zdG9yZWRNYXJrcyB8fCAkY3Vyc29yLm1hcmtzKCkpKVxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5yZW1vdmVTdG9yZWRNYXJrKG1hcmtUeXBlKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5hZGRTdG9yZWRNYXJrKG1hcmtUeXBlLmNyZWF0ZShhdHRycykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBoYXMgPSBmYWxzZSwgdHIgPSBzdGF0ZS50cjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhcyAmJiBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaGFzID0gc3RhdGUuZG9jLnJhbmdlSGFzTWFyaygkZnJvbS5wb3MsICR0by5wb3MsIG1hcmtUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5yZW1vdmVNYXJrKCRmcm9tLnBvcywgJHRvLnBvcywgbWFya1R5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSAkZnJvbS5wb3MsIHRvID0gJHRvLnBvcywgc3RhcnQgPSAkZnJvbS5ub2RlQWZ0ZXIsIGVuZCA9ICR0by5ub2RlQmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlU3RhcnQgPSBzdGFydCAmJiBzdGFydC5pc1RleHQgPyAvXlxccyovLmV4ZWMoc3RhcnQudGV4dClbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZUVuZCA9IGVuZCAmJiBlbmQuaXNUZXh0ID8gL1xccyokLy5leGVjKGVuZC50ZXh0KVswXS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gKyBzcGFjZVN0YXJ0IDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHNwYWNlU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gLT0gc3BhY2VFbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5hZGRNYXJrKGZyb20sIHRvLCBtYXJrVHlwZS5jcmVhdGUoYXR0cnMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gd3JhcERpc3BhdGNoRm9ySm9pbihkaXNwYXRjaCwgaXNKb2luYWJsZSkge1xuICAgIHJldHVybiAodHIpID0+IHtcbiAgICAgICAgaWYgKCF0ci5pc0dlbmVyaWMpXG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2godHIpO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHIubWFwcGluZy5tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwID0gdHIubWFwcGluZy5tYXBzW2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByYW5nZXMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgcmFuZ2VzW2pdID0gbWFwLm1hcChyYW5nZXNbal0pO1xuICAgICAgICAgICAgbWFwLmZvckVhY2goKF9zLCBfZSwgZnJvbSwgdG8pID0+IHJhbmdlcy5wdXNoKGZyb20sIHRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBqb2luYWJsZSBwb2ludHMgZXhpc3QgaW5zaWRlIHRob3NlIHJhbmdlcyxcbiAgICAgICAgLy8gYnkgY2hlY2tpbmcgYWxsIG5vZGUgYm91bmRhcmllcyBpbiB0aGVpciBwYXJlbnQgbm9kZXMuXG4gICAgICAgIGxldCBqb2luYWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbaV0sIHRvID0gcmFuZ2VzW2kgKyAxXTtcbiAgICAgICAgICAgIGxldCAkZnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pLCBkZXB0aCA9ICRmcm9tLnNoYXJlZERlcHRoKHRvKSwgcGFyZW50ID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9ICRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpLCBwb3MgPSAkZnJvbS5hZnRlcihkZXB0aCArIDEpOyBwb3MgPD0gdG87ICsraW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBwYXJlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICYmIGpvaW5hYmxlLmluZGV4T2YocG9zKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gcGFyZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmUudHlwZSA9PSBhZnRlci50eXBlICYmIGlzSm9pbmFibGUoYmVmb3JlLCBhZnRlcikpXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luYWJsZS5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyArPSBhZnRlci5ub2RlU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKb2luIHRoZSBqb2luYWJsZSBwb2ludHNcbiAgICAgICAgam9pbmFibGUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBmb3IgKGxldCBpID0gam9pbmFibGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChjYW5Kb2luKHRyLmRvYywgam9pbmFibGVbaV0pKVxuICAgICAgICAgICAgICAgIHRyLmpvaW4oam9pbmFibGVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICB9O1xufVxuLyoqXG5XcmFwIGEgY29tbWFuZCBzbyB0aGF0LCB3aGVuIGl0IHByb2R1Y2VzIGEgdHJhbnNmb3JtIHRoYXQgY2F1c2VzXG50d28gam9pbmFibGUgbm9kZXMgdG8gZW5kIHVwIG5leHQgdG8gZWFjaCBvdGhlciwgdGhvc2UgYXJlIGpvaW5lZC5cbk5vZGVzIGFyZSBjb25zaWRlcmVkIGpvaW5hYmxlIHdoZW4gdGhleSBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmRcbndoZW4gdGhlIGBpc0pvaW5hYmxlYCBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciB0aGVtIG9yLCBpZiBhblxuYXJyYXkgb2Ygc3RyaW5ncyB3YXMgcGFzc2VkLCBpZiB0aGVpciBub2RlIHR5cGUgbmFtZSBpcyBpbiB0aGF0XG5hcnJheS5cbiovXG5mdW5jdGlvbiBhdXRvSm9pbihjb21tYW5kLCBpc0pvaW5hYmxlKSB7XG4gICAgbGV0IGNhbkpvaW4gPSBBcnJheS5pc0FycmF5KGlzSm9pbmFibGUpID8gKG5vZGUpID0+IGlzSm9pbmFibGUuaW5kZXhPZihub2RlLnR5cGUubmFtZSkgPiAtMVxuICAgICAgICA6IGlzSm9pbmFibGU7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IGNvbW1hbmQoc3RhdGUsIGRpc3BhdGNoICYmIHdyYXBEaXNwYXRjaEZvckpvaW4oZGlzcGF0Y2gsIGNhbkpvaW4pLCB2aWV3KTtcbn1cbi8qKlxuQ29tYmluZSBhIG51bWJlciBvZiBjb21tYW5kIGZ1bmN0aW9ucyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uICh3aGljaFxuY2FsbHMgdGhlbSBvbmUgYnkgb25lIHVudGlsIG9uZSByZXR1cm5zIHRydWUpLlxuKi9cbmZ1bmN0aW9uIGNoYWluQ29tbWFuZHMoLi4uY29tbWFuZHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGNvbW1hbmRzW2ldKHN0YXRlLCBkaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxubGV0IGJhY2tzcGFjZSA9IGNoYWluQ29tbWFuZHMoZGVsZXRlU2VsZWN0aW9uLCBqb2luQmFja3dhcmQsIHNlbGVjdE5vZGVCYWNrd2FyZCk7XG5sZXQgZGVsID0gY2hhaW5Db21tYW5kcyhkZWxldGVTZWxlY3Rpb24sIGpvaW5Gb3J3YXJkLCBzZWxlY3ROb2RlRm9yd2FyZCk7XG4vKipcbkEgYmFzaWMga2V5bWFwIGNvbnRhaW5pbmcgYmluZGluZ3Mgbm90IHNwZWNpZmljIHRvIGFueSBzY2hlbWEuXG5CaW5kcyB0aGUgZm9sbG93aW5nIGtleXMgKHdoZW4gbXVsdGlwbGUgY29tbWFuZHMgYXJlIGxpc3RlZCwgdGhleVxuYXJlIGNoYWluZWQgd2l0aCBbYGNoYWluQ29tbWFuZHNgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuY2hhaW5Db21tYW5kcykpOlxuXG4qICoqRW50ZXIqKiB0byBgbmV3bGluZUluQ29kZWAsIGBjcmVhdGVQYXJhZ3JhcGhOZWFyYCwgYGxpZnRFbXB0eUJsb2NrYCwgYHNwbGl0QmxvY2tgXG4qICoqTW9kLUVudGVyKiogdG8gYGV4aXRDb2RlYFxuKiAqKkJhY2tzcGFjZSoqIGFuZCAqKk1vZC1CYWNrc3BhY2UqKiB0byBgZGVsZXRlU2VsZWN0aW9uYCwgYGpvaW5CYWNrd2FyZGAsIGBzZWxlY3ROb2RlQmFja3dhcmRgXG4qICoqRGVsZXRlKiogYW5kICoqTW9kLURlbGV0ZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkZvcndhcmRgLCBgc2VsZWN0Tm9kZUZvcndhcmRgXG4qICoqTW9kLURlbGV0ZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkZvcndhcmRgLCBgc2VsZWN0Tm9kZUZvcndhcmRgXG4qICoqTW9kLWEqKiB0byBgc2VsZWN0QWxsYFxuKi9cbmNvbnN0IHBjQmFzZUtleW1hcCA9IHtcbiAgICBcIkVudGVyXCI6IGNoYWluQ29tbWFuZHMobmV3bGluZUluQ29kZSwgY3JlYXRlUGFyYWdyYXBoTmVhciwgbGlmdEVtcHR5QmxvY2ssIHNwbGl0QmxvY2spLFxuICAgIFwiTW9kLUVudGVyXCI6IGV4aXRDb2RlLFxuICAgIFwiQmFja3NwYWNlXCI6IGJhY2tzcGFjZSxcbiAgICBcIk1vZC1CYWNrc3BhY2VcIjogYmFja3NwYWNlLFxuICAgIFwiU2hpZnQtQmFja3NwYWNlXCI6IGJhY2tzcGFjZSxcbiAgICBcIkRlbGV0ZVwiOiBkZWwsXG4gICAgXCJNb2QtRGVsZXRlXCI6IGRlbCxcbiAgICBcIk1vZC1hXCI6IHNlbGVjdEFsbFxufTtcbi8qKlxuQSBjb3B5IG9mIGBwY0Jhc2VLZXltYXBgIHRoYXQgYWxzbyBiaW5kcyAqKkN0cmwtaCoqIGxpa2UgQmFja3NwYWNlLFxuKipDdHJsLWQqKiBsaWtlIERlbGV0ZSwgKipBbHQtQmFja3NwYWNlKiogbGlrZSBDdHJsLUJhY2tzcGFjZSwgYW5kXG4qKkN0cmwtQWx0LUJhY2tzcGFjZSoqLCAqKkFsdC1EZWxldGUqKiwgYW5kICoqQWx0LWQqKiBsaWtlXG5DdHJsLURlbGV0ZS5cbiovXG5jb25zdCBtYWNCYXNlS2V5bWFwID0ge1xuICAgIFwiQ3RybC1oXCI6IHBjQmFzZUtleW1hcFtcIkJhY2tzcGFjZVwiXSxcbiAgICBcIkFsdC1CYWNrc3BhY2VcIjogcGNCYXNlS2V5bWFwW1wiTW9kLUJhY2tzcGFjZVwiXSxcbiAgICBcIkN0cmwtZFwiOiBwY0Jhc2VLZXltYXBbXCJEZWxldGVcIl0sXG4gICAgXCJDdHJsLUFsdC1CYWNrc3BhY2VcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkFsdC1EZWxldGVcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkFsdC1kXCI6IHBjQmFzZUtleW1hcFtcIk1vZC1EZWxldGVcIl0sXG4gICAgXCJDdHJsLWFcIjogc2VsZWN0VGV4dGJsb2NrU3RhcnQsXG4gICAgXCJDdHJsLWVcIjogc2VsZWN0VGV4dGJsb2NrRW5kXG59O1xuZm9yIChsZXQga2V5IGluIHBjQmFzZUtleW1hcClcbiAgICBtYWNCYXNlS2V5bWFwW2tleV0gPSBwY0Jhc2VLZXltYXBba2V5XTtcbmNvbnN0IG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiA/IC9NYWN8aVAoaG9uZXxbb2FdZCkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICA6IHR5cGVvZiBvcyAhPSBcInVuZGVmaW5lZFwiICYmIG9zLnBsYXRmb3JtID8gb3MucGxhdGZvcm0oKSA9PSBcImRhcndpblwiIDogZmFsc2U7XG4vKipcbkRlcGVuZGluZyBvbiB0aGUgZGV0ZWN0ZWQgcGxhdGZvcm0sIHRoaXMgd2lsbCBob2xkXG5bYHBjQmFzZWtleW1hcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5wY0Jhc2VLZXltYXApIG9yXG5bYG1hY0Jhc2VLZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMubWFjQmFzZUtleW1hcCkuXG4qL1xuY29uc3QgYmFzZUtleW1hcCA9IG1hYyA/IG1hY0Jhc2VLZXltYXAgOiBwY0Jhc2VLZXltYXA7XG5cbmV4cG9ydCB7IGF1dG9Kb2luLCBiYXNlS2V5bWFwLCBjaGFpbkNvbW1hbmRzLCBjcmVhdGVQYXJhZ3JhcGhOZWFyLCBkZWxldGVTZWxlY3Rpb24sIGV4aXRDb2RlLCBqb2luQmFja3dhcmQsIGpvaW5Eb3duLCBqb2luRm9yd2FyZCwgam9pblRleHRibG9ja0JhY2t3YXJkLCBqb2luVGV4dGJsb2NrRm9yd2FyZCwgam9pblVwLCBsaWZ0LCBsaWZ0RW1wdHlCbG9jaywgbWFjQmFzZUtleW1hcCwgbmV3bGluZUluQ29kZSwgcGNCYXNlS2V5bWFwLCBzZWxlY3RBbGwsIHNlbGVjdE5vZGVCYWNrd2FyZCwgc2VsZWN0Tm9kZUZvcndhcmQsIHNlbGVjdFBhcmVudE5vZGUsIHNlbGVjdFRleHRibG9ja0VuZCwgc2VsZWN0VGV4dGJsb2NrU3RhcnQsIHNldEJsb2NrVHlwZSwgc3BsaXRCbG9jaywgc3BsaXRCbG9ja0FzLCBzcGxpdEJsb2NrS2VlcE1hcmtzLCB0b2dnbGVNYXJrLCB3cmFwSW4gfTtcbiIsICJpbXBvcnQgeyBmaW5kV3JhcHBpbmcsIFJlcGxhY2VBcm91bmRTdGVwLCBjYW5TcGxpdCwgbGlmdFRhcmdldCwgY2FuSm9pbiB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBOb2RlUmFuZ2UsIEZyYWdtZW50LCBTbGljZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuY29uc3Qgb2xET00gPSBbXCJvbFwiLCAwXSwgdWxET00gPSBbXCJ1bFwiLCAwXSwgbGlET00gPSBbXCJsaVwiLCAwXTtcbi8qKlxuQW4gb3JkZXJlZCBsaXN0IFtub2RlIHNwZWNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYykuIEhhcyBhIHNpbmdsZVxuYXR0cmlidXRlLCBgb3JkZXJgLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgYXQgd2hpY2ggdGhlIGxpc3RcbnN0YXJ0cyBjb3VudGluZywgYW5kIGRlZmF1bHRzIHRvIDEuIFJlcHJlc2VudGVkIGFzIGFuIGA8b2w+YFxuZWxlbWVudC5cbiovXG5jb25zdCBvcmRlcmVkTGlzdCA9IHtcbiAgICBhdHRyczogeyBvcmRlcjogeyBkZWZhdWx0OiAxIH0gfSxcbiAgICBwYXJzZURPTTogW3sgdGFnOiBcIm9sXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG9yZGVyOiBkb20uaGFzQXR0cmlidXRlKFwic3RhcnRcIikgPyArZG9tLmdldEF0dHJpYnV0ZShcInN0YXJ0XCIpIDogMSB9O1xuICAgICAgICAgICAgfSB9XSxcbiAgICB0b0RPTShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmF0dHJzLm9yZGVyID09IDEgPyBvbERPTSA6IFtcIm9sXCIsIHsgc3RhcnQ6IG5vZGUuYXR0cnMub3JkZXIgfSwgMF07XG4gICAgfVxufTtcbi8qKlxuQSBidWxsZXQgbGlzdCBub2RlIHNwZWMsIHJlcHJlc2VudGVkIGluIHRoZSBET00gYXMgYDx1bD5gLlxuKi9cbmNvbnN0IGJ1bGxldExpc3QgPSB7XG4gICAgcGFyc2VET006IFt7IHRhZzogXCJ1bFwiIH1dLFxuICAgIHRvRE9NKCkgeyByZXR1cm4gdWxET007IH1cbn07XG4vKipcbkEgbGlzdCBpdGVtIChgPGxpPmApIHNwZWMuXG4qL1xuY29uc3QgbGlzdEl0ZW0gPSB7XG4gICAgcGFyc2VET006IFt7IHRhZzogXCJsaVwiIH1dLFxuICAgIHRvRE9NKCkgeyByZXR1cm4gbGlET007IH0sXG4gICAgZGVmaW5pbmc6IHRydWVcbn07XG5mdW5jdGlvbiBhZGQob2JqLCBwcm9wcykge1xuICAgIGxldCBjb3B5ID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcylcbiAgICAgICAgY29weVtwcm9wXSA9IHByb3BzW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuLyoqXG5Db252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWRkaW5nIGxpc3QtcmVsYXRlZCBub2RlIHR5cGVzIHRvIGEgbWFwXG5zcGVjaWZ5aW5nIHRoZSBub2RlcyBmb3IgYSBzY2hlbWEuIEFkZHNcbltgb3JkZXJlZExpc3RgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3Qub3JkZXJlZExpc3QpIGFzIGBcIm9yZGVyZWRfbGlzdFwiYCxcbltgYnVsbGV0TGlzdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdC5idWxsZXRMaXN0KSBhcyBgXCJidWxsZXRfbGlzdFwiYCwgYW5kXG5bYGxpc3RJdGVtYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYS1saXN0Lmxpc3RJdGVtKSBhcyBgXCJsaXN0X2l0ZW1cImAuXG5cbmBpdGVtQ29udGVudGAgZGV0ZXJtaW5lcyB0aGUgY29udGVudCBleHByZXNzaW9uIGZvciB0aGUgbGlzdCBpdGVtcy5cbklmIHlvdSB3YW50IHRoZSBjb21tYW5kcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIHRvIGFwcGx5IHRvIHlvdXJcbmxpc3Qgc3RydWN0dXJlLCBpdCBzaG91bGQgaGF2ZSBhIHNoYXBlIGxpa2UgYFwicGFyYWdyYXBoIGJsb2NrKlwiYCBvclxuYFwicGFyYWdyYXBoIChvcmRlcmVkX2xpc3QgfCBidWxsZXRfbGlzdCkqXCJgLiBgbGlzdEdyb3VwYCBjYW4gYmVcbmdpdmVuIHRvIGFzc2lnbiBhIGdyb3VwIG5hbWUgdG8gdGhlIGxpc3Qgbm9kZSB0eXBlcywgZm9yIGV4YW1wbGVcbmBcImJsb2NrXCJgLlxuKi9cbmZ1bmN0aW9uIGFkZExpc3ROb2Rlcyhub2RlcywgaXRlbUNvbnRlbnQsIGxpc3RHcm91cCkge1xuICAgIHJldHVybiBub2Rlcy5hcHBlbmQoe1xuICAgICAgICBvcmRlcmVkX2xpc3Q6IGFkZChvcmRlcmVkTGlzdCwgeyBjb250ZW50OiBcImxpc3RfaXRlbStcIiwgZ3JvdXA6IGxpc3RHcm91cCB9KSxcbiAgICAgICAgYnVsbGV0X2xpc3Q6IGFkZChidWxsZXRMaXN0LCB7IGNvbnRlbnQ6IFwibGlzdF9pdGVtK1wiLCBncm91cDogbGlzdEdyb3VwIH0pLFxuICAgICAgICBsaXN0X2l0ZW06IGFkZChsaXN0SXRlbSwgeyBjb250ZW50OiBpdGVtQ29udGVudCB9KVxuICAgIH0pO1xufVxuLyoqXG5SZXR1cm5zIGEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBzZWxlY3Rpb24gaW4gYSBsaXN0IHdpdGhcbnRoZSBnaXZlbiB0eXBlIGFuIGF0dHJpYnV0ZXMuIElmIGBkaXNwYXRjaGAgaXMgbnVsbCwgb25seSByZXR1cm4gYVxudmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIHBvc3NpYmxlLCBidXQgZG9uJ3QgYWN0dWFsbHlcbnBlcmZvcm0gdGhlIGNoYW5nZS5cbiovXG5mdW5jdGlvbiB3cmFwSW5MaXN0KGxpc3RUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKSwgZG9Kb2luID0gZmFsc2UsIG91dGVyUmFuZ2UgPSByYW5nZTtcbiAgICAgICAgaWYgKCFyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gVGhpcyBpcyBhdCB0aGUgdG9wIG9mIGFuIGV4aXN0aW5nIGxpc3QgaXRlbVxuICAgICAgICBpZiAocmFuZ2UuZGVwdGggPj0gMiAmJiAkZnJvbS5ub2RlKHJhbmdlLmRlcHRoIC0gMSkudHlwZS5jb21wYXRpYmxlQ29udGVudChsaXN0VHlwZSkgJiYgcmFuZ2Uuc3RhcnRJbmRleCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGlzIHRoZSB0b3Agb2YgdGhlIGxpc3RcbiAgICAgICAgICAgIGlmICgkZnJvbS5pbmRleChyYW5nZS5kZXB0aCAtIDEpID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0ICRpbnNlcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShyYW5nZS5zdGFydCAtIDIpO1xuICAgICAgICAgICAgb3V0ZXJSYW5nZSA9IG5ldyBOb2RlUmFuZ2UoJGluc2VydCwgJGluc2VydCwgcmFuZ2UuZGVwdGgpO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVuZEluZGV4IDwgcmFuZ2UucGFyZW50LmNoaWxkQ291bnQpXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgTm9kZVJhbmdlKCRmcm9tLCBzdGF0ZS5kb2MucmVzb2x2ZSgkdG8uZW5kKHJhbmdlLmRlcHRoKSksIHJhbmdlLmRlcHRoKTtcbiAgICAgICAgICAgIGRvSm9pbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdyYXAgPSBmaW5kV3JhcHBpbmcob3V0ZXJSYW5nZSwgbGlzdFR5cGUsIGF0dHJzLCByYW5nZSk7XG4gICAgICAgIGlmICghd3JhcClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goZG9XcmFwSW5MaXN0KHN0YXRlLnRyLCByYW5nZSwgd3JhcCwgZG9Kb2luLCBsaXN0VHlwZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5mdW5jdGlvbiBkb1dyYXBJbkxpc3QodHIsIHJhbmdlLCB3cmFwcGVycywgam9pbkJlZm9yZSwgbGlzdFR5cGUpIHtcbiAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSB3cmFwcGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20od3JhcHBlcnNbaV0udHlwZS5jcmVhdGUod3JhcHBlcnNbaV0uYXR0cnMsIGNvbnRlbnQpKTtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChyYW5nZS5zdGFydCAtIChqb2luQmVmb3JlID8gMiA6IDApLCByYW5nZS5lbmQsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIG5ldyBTbGljZShjb250ZW50LCAwLCAwKSwgd3JhcHBlcnMubGVuZ3RoLCB0cnVlKSk7XG4gICAgbGV0IGZvdW5kID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXBwZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAod3JhcHBlcnNbaV0udHlwZSA9PSBsaXN0VHlwZSlcbiAgICAgICAgICAgIGZvdW5kID0gaSArIDE7XG4gICAgbGV0IHNwbGl0RGVwdGggPSB3cmFwcGVycy5sZW5ndGggLSBmb3VuZDtcbiAgICBsZXQgc3BsaXRQb3MgPSByYW5nZS5zdGFydCArIHdyYXBwZXJzLmxlbmd0aCAtIChqb2luQmVmb3JlID8gMiA6IDApLCBwYXJlbnQgPSByYW5nZS5wYXJlbnQ7XG4gICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0SW5kZXgsIGUgPSByYW5nZS5lbmRJbmRleCwgZmlyc3QgPSB0cnVlOyBpIDwgZTsgaSsrLCBmaXJzdCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghZmlyc3QgJiYgY2FuU3BsaXQodHIuZG9jLCBzcGxpdFBvcywgc3BsaXREZXB0aCkpIHtcbiAgICAgICAgICAgIHRyLnNwbGl0KHNwbGl0UG9zLCBzcGxpdERlcHRoKTtcbiAgICAgICAgICAgIHNwbGl0UG9zICs9IDIgKiBzcGxpdERlcHRoO1xuICAgICAgICB9XG4gICAgICAgIHNwbGl0UG9zICs9IHBhcmVudC5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuLyoqXG5CdWlsZCBhIGNvbW1hbmQgdGhhdCBzcGxpdHMgYSBub24tZW1wdHkgdGV4dGJsb2NrIGF0IHRoZSB0b3AgbGV2ZWxcbm9mIGEgbGlzdCBpdGVtIGJ5IGFsc28gc3BsaXR0aW5nIHRoYXQgbGlzdCBpdGVtLlxuKi9cbmZ1bmN0aW9uIHNwbGl0TGlzdEl0ZW0oaXRlbVR5cGUsIGl0ZW1BdHRycykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8sIG5vZGUgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKChub2RlICYmIG5vZGUuaXNCbG9jaykgfHwgJGZyb20uZGVwdGggPCAyIHx8ICEkZnJvbS5zYW1lUGFyZW50KCR0bykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBncmFuZFBhcmVudCA9ICRmcm9tLm5vZGUoLTEpO1xuICAgICAgICBpZiAoZ3JhbmRQYXJlbnQudHlwZSAhPSBpdGVtVHlwZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCRmcm9tLnBhcmVudC5jb250ZW50LnNpemUgPT0gMCAmJiAkZnJvbS5ub2RlKC0xKS5jaGlsZENvdW50ID09ICRmcm9tLmluZGV4QWZ0ZXIoLTEpKSB7XG4gICAgICAgICAgICAvLyBJbiBhbiBlbXB0eSBibG9jay4gSWYgdGhpcyBpcyBhIG5lc3RlZCBsaXN0LCB0aGUgd3JhcHBpbmdcbiAgICAgICAgICAgIC8vIGxpc3QgaXRlbSBzaG91bGQgYmUgc3BsaXQuIE90aGVyd2lzZSwgYmFpbCBvdXQgYW5kIGxldCBuZXh0XG4gICAgICAgICAgICAvLyBjb21tYW5kIGhhbmRsZSBsaWZ0aW5nLlxuICAgICAgICAgICAgaWYgKCRmcm9tLmRlcHRoID09IDMgfHwgJGZyb20ubm9kZSgtMykudHlwZSAhPSBpdGVtVHlwZSB8fFxuICAgICAgICAgICAgICAgICRmcm9tLmluZGV4KC0yKSAhPSAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50IC0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aEJlZm9yZSA9ICRmcm9tLmluZGV4KC0xKSA/IDEgOiAkZnJvbS5pbmRleCgtMikgPyAyIDogMztcbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGZyYWdtZW50IGNvbnRhaW5pbmcgZW1wdHkgdmVyc2lvbnMgb2YgdGhlIHN0cnVjdHVyZVxuICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG91dGVyIGxpc3QgaXRlbSB0byB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAkZnJvbS5kZXB0aCAtIGRlcHRoQmVmb3JlOyBkID49ICRmcm9tLmRlcHRoIC0gMzsgZC0tKVxuICAgICAgICAgICAgICAgICAgICB3cmFwID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGQpLmNvcHkod3JhcCkpO1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aEFmdGVyID0gJGZyb20uaW5kZXhBZnRlcigtMSkgPCAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50ID8gMVxuICAgICAgICAgICAgICAgICAgICA6ICRmcm9tLmluZGV4QWZ0ZXIoLTIpIDwgJGZyb20ubm9kZSgtMykuY2hpbGRDb3VudCA/IDIgOiAzO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBhIHNlY29uZCBsaXN0IGl0ZW0gd2l0aCBhbiBlbXB0eSBkZWZhdWx0IHN0YXJ0IG5vZGVcbiAgICAgICAgICAgICAgICB3cmFwID0gd3JhcC5hcHBlbmQoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGVBbmRGaWxsKCkpKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5iZWZvcmUoJGZyb20uZGVwdGggLSAoZGVwdGhCZWZvcmUgLSAxKSk7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIucmVwbGFjZShzdGFydCwgJGZyb20uYWZ0ZXIoLWRlcHRoQWZ0ZXIpLCBuZXcgU2xpY2Uod3JhcCwgNCAtIGRlcHRoQmVmb3JlLCAwKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IC0xO1xuICAgICAgICAgICAgICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oc3RhcnQsIHRyLmRvYy5jb250ZW50LnNpemUsIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jayAmJiBub2RlLmNvbnRlbnQuc2l6ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsID0gcG9zICsgMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShzZWwpKSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFR5cGUgPSAkdG8ucG9zID09ICRmcm9tLmVuZCgpID8gZ3JhbmRQYXJlbnQuY29udGVudE1hdGNoQXQoMCkuZGVmYXVsdFR5cGUgOiBudWxsO1xuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5kZWxldGUoJGZyb20ucG9zLCAkdG8ucG9zKTtcbiAgICAgICAgbGV0IHR5cGVzID0gbmV4dFR5cGUgPyBbaXRlbUF0dHJzID8geyB0eXBlOiBpdGVtVHlwZSwgYXR0cnM6IGl0ZW1BdHRycyB9IDogbnVsbCwgeyB0eXBlOiBuZXh0VHlwZSB9XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjYW5TcGxpdCh0ci5kb2MsICRmcm9tLnBvcywgMiwgdHlwZXMpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zcGxpdCgkZnJvbS5wb3MsIDIsIHR5cGVzKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuQ3JlYXRlIGEgY29tbWFuZCB0byBsaWZ0IHRoZSBsaXN0IGl0ZW0gYXJvdW5kIHRoZSBzZWxlY3Rpb24gdXAgaW50b1xuYSB3cmFwcGluZyBsaXN0LlxuKi9cbmZ1bmN0aW9uIGxpZnRMaXN0SXRlbShpdGVtVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8sIG5vZGUgPT4gbm9kZS5jaGlsZENvdW50ID4gMCAmJiBub2RlLmZpcnN0Q2hpbGQudHlwZSA9PSBpdGVtVHlwZSk7XG4gICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghZGlzcGF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCRmcm9tLm5vZGUocmFuZ2UuZGVwdGggLSAxKS50eXBlID09IGl0ZW1UeXBlKSAvLyBJbnNpZGUgYSBwYXJlbnQgbGlzdFxuICAgICAgICAgICAgcmV0dXJuIGxpZnRUb091dGVyTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIGl0ZW1UeXBlLCByYW5nZSk7XG4gICAgICAgIGVsc2UgLy8gT3V0ZXIgbGlzdCBub2RlXG4gICAgICAgICAgICByZXR1cm4gbGlmdE91dE9mTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIHJhbmdlKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbGlmdFRvT3V0ZXJMaXN0KHN0YXRlLCBkaXNwYXRjaCwgaXRlbVR5cGUsIHJhbmdlKSB7XG4gICAgbGV0IHRyID0gc3RhdGUudHIsIGVuZCA9IHJhbmdlLmVuZCwgZW5kT2ZMaXN0ID0gcmFuZ2UuJHRvLmVuZChyYW5nZS5kZXB0aCk7XG4gICAgaWYgKGVuZCA8IGVuZE9mTGlzdCkge1xuICAgICAgICAvLyBUaGVyZSBhcmUgc2libGluZ3MgYWZ0ZXIgdGhlIGxpZnRlZCBpdGVtcywgd2hpY2ggbXVzdCBiZWNvbWVcbiAgICAgICAgLy8gY2hpbGRyZW4gb2YgdGhlIGxhc3QgaXRlbVxuICAgICAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChlbmQgLSAxLCBlbmRPZkxpc3QsIGVuZCwgZW5kT2ZMaXN0LCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGUobnVsbCwgcmFuZ2UucGFyZW50LmNvcHkoKSkpLCAxLCAwKSwgMSwgdHJ1ZSkpO1xuICAgICAgICByYW5nZSA9IG5ldyBOb2RlUmFuZ2UodHIuZG9jLnJlc29sdmUocmFuZ2UuJGZyb20ucG9zKSwgdHIuZG9jLnJlc29sdmUoZW5kT2ZMaXN0KSwgcmFuZ2UuZGVwdGgpO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0ci5saWZ0KHJhbmdlLCB0YXJnZXQpO1xuICAgIGxldCBhZnRlciA9IHRyLm1hcHBpbmcubWFwKGVuZCwgLTEpIC0gMTtcbiAgICBpZiAoY2FuSm9pbih0ci5kb2MsIGFmdGVyKSlcbiAgICAgICAgdHIuam9pbihhZnRlcik7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBsaWZ0T3V0T2ZMaXN0KHN0YXRlLCBkaXNwYXRjaCwgcmFuZ2UpIHtcbiAgICBsZXQgdHIgPSBzdGF0ZS50ciwgbGlzdCA9IHJhbmdlLnBhcmVudDtcbiAgICAvLyBNZXJnZSB0aGUgbGlzdCBpdGVtcyBpbnRvIGEgc2luZ2xlIGJpZyBpdGVtXG4gICAgZm9yIChsZXQgcG9zID0gcmFuZ2UuZW5kLCBpID0gcmFuZ2UuZW5kSW5kZXggLSAxLCBlID0gcmFuZ2Uuc3RhcnRJbmRleDsgaSA+IGU7IGktLSkge1xuICAgICAgICBwb3MgLT0gbGlzdC5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICAgICAgdHIuZGVsZXRlKHBvcyAtIDEsIHBvcyArIDEpO1xuICAgIH1cbiAgICBsZXQgJHN0YXJ0ID0gdHIuZG9jLnJlc29sdmUocmFuZ2Uuc3RhcnQpLCBpdGVtID0gJHN0YXJ0Lm5vZGVBZnRlcjtcbiAgICBpZiAodHIubWFwcGluZy5tYXAocmFuZ2UuZW5kKSAhPSByYW5nZS5zdGFydCArICRzdGFydC5ub2RlQWZ0ZXIubm9kZVNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYXRTdGFydCA9IHJhbmdlLnN0YXJ0SW5kZXggPT0gMCwgYXRFbmQgPSByYW5nZS5lbmRJbmRleCA9PSBsaXN0LmNoaWxkQ291bnQ7XG4gICAgbGV0IHBhcmVudCA9ICRzdGFydC5ub2RlKC0xKSwgaW5kZXhCZWZvcmUgPSAkc3RhcnQuaW5kZXgoLTEpO1xuICAgIGlmICghcGFyZW50LmNhblJlcGxhY2UoaW5kZXhCZWZvcmUgKyAoYXRTdGFydCA/IDAgOiAxKSwgaW5kZXhCZWZvcmUgKyAxLCBpdGVtLmNvbnRlbnQuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QpKSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc3RhcnQgPSAkc3RhcnQucG9zLCBlbmQgPSBzdGFydCArIGl0ZW0ubm9kZVNpemU7XG4gICAgLy8gU3RyaXAgb2ZmIHRoZSBzdXJyb3VuZGluZyBsaXN0LiBBdCB0aGUgc2lkZXMgd2hlcmUgd2UncmUgbm90IGF0XG4gICAgLy8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIGV4aXN0aW5nIGxpc3QgaXMgY2xvc2VkLiBBdCBzaWRlcyB3aGVyZVxuICAgIC8vIHRoaXMgaXMgdGhlIGVuZCwgaXQgaXMgb3ZlcndyaXR0ZW4gdG8gaXRzIGVuZC5cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydCAtIChhdFN0YXJ0ID8gMSA6IDApLCBlbmQgKyAoYXRFbmQgPyAxIDogMCksIHN0YXJ0ICsgMSwgZW5kIC0gMSwgbmV3IFNsaWNlKChhdFN0YXJ0ID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKVxuICAgICAgICAuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKSwgYXRTdGFydCA/IDAgOiAxLCBhdEVuZCA/IDAgOiAxKSwgYXRTdGFydCA/IDAgOiAxKSk7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgdG8gc2luayB0aGUgbGlzdCBpdGVtIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGRvd25cbmludG8gYW4gaW5uZXIgbGlzdC5cbiovXG5mdW5jdGlvbiBzaW5rTGlzdEl0ZW0oaXRlbVR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvLCBub2RlID0+IG5vZGUuY2hpbGRDb3VudCA+IDAgJiYgbm9kZS5maXJzdENoaWxkLnR5cGUgPT0gaXRlbVR5cGUpO1xuICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHJhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBwYXJlbnQgPSByYW5nZS5wYXJlbnQsIG5vZGVCZWZvcmUgPSBwYXJlbnQuY2hpbGQoc3RhcnRJbmRleCAtIDEpO1xuICAgICAgICBpZiAobm9kZUJlZm9yZS50eXBlICE9IGl0ZW1UeXBlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBuZXN0ZWRCZWZvcmUgPSBub2RlQmVmb3JlLmxhc3RDaGlsZCAmJiBub2RlQmVmb3JlLmxhc3RDaGlsZC50eXBlID09IHBhcmVudC50eXBlO1xuICAgICAgICAgICAgbGV0IGlubmVyID0gRnJhZ21lbnQuZnJvbShuZXN0ZWRCZWZvcmUgPyBpdGVtVHlwZS5jcmVhdGUoKSA6IG51bGwpO1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20oaXRlbVR5cGUuY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20ocGFyZW50LnR5cGUuY3JlYXRlKG51bGwsIGlubmVyKSkpKSwgbmVzdGVkQmVmb3JlID8gMyA6IDEsIDApO1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHJhbmdlLnN0YXJ0LCBhZnRlciA9IHJhbmdlLmVuZDtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKGJlZm9yZSAtIChuZXN0ZWRCZWZvcmUgPyAzIDogMSksIGFmdGVyLCBiZWZvcmUsIGFmdGVyLCBzbGljZSwgMSwgdHJ1ZSkpXG4gICAgICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGFkZExpc3ROb2RlcywgYnVsbGV0TGlzdCwgbGlmdExpc3RJdGVtLCBsaXN0SXRlbSwgb3JkZXJlZExpc3QsIHNpbmtMaXN0SXRlbSwgc3BsaXRMaXN0SXRlbSwgd3JhcEluTGlzdCB9O1xuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVTdGF0ZShjb25maWc6IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZVxufSk6IEVkaXRvclN0YXRlIHtcbiAgY29uc3QgeyBzdGF0ZSwgdHJhbnNhY3Rpb24gfSA9IGNvbmZpZ1xuICBsZXQgeyBzZWxlY3Rpb24gfSA9IHRyYW5zYWN0aW9uXG4gIGxldCB7IGRvYyB9ID0gdHJhbnNhY3Rpb25cbiAgbGV0IHsgc3RvcmVkTWFya3MgfSA9IHRyYW5zYWN0aW9uXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhcHBseTogc3RhdGUuYXBwbHkuYmluZChzdGF0ZSksXG4gICAgYXBwbHlUcmFuc2FjdGlvbjogc3RhdGUuYXBwbHlUcmFuc2FjdGlvbi5iaW5kKHN0YXRlKSxcbiAgICBmaWx0ZXJUcmFuc2FjdGlvbjogc3RhdGUuZmlsdGVyVHJhbnNhY3Rpb24sXG4gICAgcGx1Z2luczogc3RhdGUucGx1Z2lucyxcbiAgICBzY2hlbWE6IHN0YXRlLnNjaGVtYSxcbiAgICByZWNvbmZpZ3VyZTogc3RhdGUucmVjb25maWd1cmUuYmluZChzdGF0ZSksXG4gICAgdG9KU09OOiBzdGF0ZS50b0pTT04uYmluZChzdGF0ZSksXG4gICAgZ2V0IHN0b3JlZE1hcmtzKCkge1xuICAgICAgcmV0dXJuIHN0b3JlZE1hcmtzXG4gICAgfSxcbiAgICBnZXQgc2VsZWN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGVjdGlvblxuICAgIH0sXG4gICAgZ2V0IGRvYygpIHtcbiAgICAgIHJldHVybiBkb2NcbiAgICB9LFxuICAgIGdldCB0cigpIHtcbiAgICAgIHNlbGVjdGlvbiA9IHRyYW5zYWN0aW9uLnNlbGVjdGlvblxuICAgICAgZG9jID0gdHJhbnNhY3Rpb24uZG9jXG4gICAgICBzdG9yZWRNYXJrcyA9IHRyYW5zYWN0aW9uLnN0b3JlZE1hcmtzXG5cbiAgICAgIHJldHVybiB0cmFuc2FjdGlvblxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSwgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICcuL0VkaXRvci5qcydcbmltcG9ydCB7IGNyZWF0ZUNoYWluYWJsZVN0YXRlIH0gZnJvbSAnLi9oZWxwZXJzL2NyZWF0ZUNoYWluYWJsZVN0YXRlLmpzJ1xuaW1wb3J0IHtcbiAgQW55Q29tbWFuZHMsIENhbkNvbW1hbmRzLCBDaGFpbmVkQ29tbWFuZHMsIENvbW1hbmRQcm9wcywgU2luZ2xlQ29tbWFuZHMsXG59IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kTWFuYWdlciB7XG4gIGVkaXRvcjogRWRpdG9yXG5cbiAgcmF3Q29tbWFuZHM6IEFueUNvbW1hbmRzXG5cbiAgY3VzdG9tU3RhdGU/OiBFZGl0b3JTdGF0ZVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiB7IGVkaXRvcjogRWRpdG9yOyBzdGF0ZT86IEVkaXRvclN0YXRlIH0pIHtcbiAgICB0aGlzLmVkaXRvciA9IHByb3BzLmVkaXRvclxuICAgIHRoaXMucmF3Q29tbWFuZHMgPSB0aGlzLmVkaXRvci5leHRlbnNpb25NYW5hZ2VyLmNvbW1hbmRzXG4gICAgdGhpcy5jdXN0b21TdGF0ZSA9IHByb3BzLnN0YXRlXG4gIH1cblxuICBnZXQgaGFzQ3VzdG9tU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jdXN0b21TdGF0ZVxuICB9XG5cbiAgZ2V0IHN0YXRlKCk6IEVkaXRvclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21TdGF0ZSB8fCB0aGlzLmVkaXRvci5zdGF0ZVxuICB9XG5cbiAgZ2V0IGNvbW1hbmRzKCk6IFNpbmdsZUNvbW1hbmRzIHtcbiAgICBjb25zdCB7IHJhd0NvbW1hbmRzLCBlZGl0b3IsIHN0YXRlIH0gPSB0aGlzXG4gICAgY29uc3QgeyB2aWV3IH0gPSBlZGl0b3JcbiAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZVxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5idWlsZFByb3BzKHRyKVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJhd0NvbW1hbmRzKS5tYXAoKFtuYW1lLCBjb21tYW5kXSkgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2QgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGNvbW1hbmQoLi4uYXJncykocHJvcHMpXG5cbiAgICAgICAgICBpZiAoIXRyLmdldE1ldGEoJ3ByZXZlbnREaXNwYXRjaCcpICYmICF0aGlzLmhhc0N1c3RvbVN0YXRlKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjYWxsYmFja1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtuYW1lLCBtZXRob2RdXG4gICAgICB9KSxcbiAgICApIGFzIHVua25vd24gYXMgU2luZ2xlQ29tbWFuZHNcbiAgfVxuXG4gIGdldCBjaGFpbigpOiAoKSA9PiBDaGFpbmVkQ29tbWFuZHMge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLmNyZWF0ZUNoYWluKClcbiAgfVxuXG4gIGdldCBjYW4oKTogKCkgPT4gQ2FuQ29tbWFuZHMge1xuICAgIHJldHVybiAoKSA9PiB0aGlzLmNyZWF0ZUNhbigpXG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQ2hhaW4oc3RhcnRUcj86IFRyYW5zYWN0aW9uLCBzaG91bGREaXNwYXRjaCA9IHRydWUpOiBDaGFpbmVkQ29tbWFuZHMge1xuICAgIGNvbnN0IHsgcmF3Q29tbWFuZHMsIGVkaXRvciwgc3RhdGUgfSA9IHRoaXNcbiAgICBjb25zdCB7IHZpZXcgfSA9IGVkaXRvclxuICAgIGNvbnN0IGNhbGxiYWNrczogYm9vbGVhbltdID0gW11cbiAgICBjb25zdCBoYXNTdGFydFRyYW5zYWN0aW9uID0gISFzdGFydFRyXG4gICAgY29uc3QgdHIgPSBzdGFydFRyIHx8IHN0YXRlLnRyXG5cbiAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFoYXNTdGFydFRyYW5zYWN0aW9uXG4gICAgICAgICYmIHNob3VsZERpc3BhdGNoXG4gICAgICAgICYmICF0ci5nZXRNZXRhKCdwcmV2ZW50RGlzcGF0Y2gnKVxuICAgICAgICAmJiAhdGhpcy5oYXNDdXN0b21TdGF0ZVxuICAgICAgKSB7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYWxsYmFja3MuZXZlcnkoY2FsbGJhY2sgPT4gY2FsbGJhY2sgPT09IHRydWUpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhaW4gPSB7XG4gICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJhd0NvbW1hbmRzKS5tYXAoKFtuYW1lLCBjb21tYW5kXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoYWluZWRDb21tYW5kID0gKC4uLmFyZ3M6IG5ldmVyW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5idWlsZFByb3BzKHRyLCBzaG91bGREaXNwYXRjaClcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gY29tbWFuZCguLi5hcmdzKShwcm9wcylcblxuICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG5cbiAgICAgICAgICAgIHJldHVybiBjaGFpblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbbmFtZSwgY2hhaW5lZENvbW1hbmRdXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIHJ1bixcbiAgICB9IGFzIHVua25vd24gYXMgQ2hhaW5lZENvbW1hbmRzXG5cbiAgICByZXR1cm4gY2hhaW5cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVDYW4oc3RhcnRUcj86IFRyYW5zYWN0aW9uKTogQ2FuQ29tbWFuZHMge1xuICAgIGNvbnN0IHsgcmF3Q29tbWFuZHMsIHN0YXRlIH0gPSB0aGlzXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBmYWxzZVxuICAgIGNvbnN0IHRyID0gc3RhcnRUciB8fCBzdGF0ZS50clxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5idWlsZFByb3BzKHRyLCBkaXNwYXRjaClcbiAgICBjb25zdCBmb3JtYXR0ZWRDb21tYW5kcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJhd0NvbW1hbmRzKS5tYXAoKFtuYW1lLCBjb21tYW5kXSkgPT4ge1xuICAgICAgICByZXR1cm4gW25hbWUsICguLi5hcmdzOiBuZXZlcltdKSA9PiBjb21tYW5kKC4uLmFyZ3MpKHsgLi4ucHJvcHMsIGRpc3BhdGNoOiB1bmRlZmluZWQgfSldXG4gICAgICB9KSxcbiAgICApIGFzIHVua25vd24gYXMgU2luZ2xlQ29tbWFuZHNcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5mb3JtYXR0ZWRDb21tYW5kcyxcbiAgICAgIGNoYWluOiAoKSA9PiB0aGlzLmNyZWF0ZUNoYWluKHRyLCBkaXNwYXRjaCksXG4gICAgfSBhcyBDYW5Db21tYW5kc1xuICB9XG5cbiAgcHVibGljIGJ1aWxkUHJvcHModHI6IFRyYW5zYWN0aW9uLCBzaG91bGREaXNwYXRjaCA9IHRydWUpOiBDb21tYW5kUHJvcHMge1xuICAgIGNvbnN0IHsgcmF3Q29tbWFuZHMsIGVkaXRvciwgc3RhdGUgfSA9IHRoaXNcbiAgICBjb25zdCB7IHZpZXcgfSA9IGVkaXRvclxuXG4gICAgY29uc3QgcHJvcHM6IENvbW1hbmRQcm9wcyA9IHtcbiAgICAgIHRyLFxuICAgICAgZWRpdG9yLFxuICAgICAgdmlldyxcbiAgICAgIHN0YXRlOiBjcmVhdGVDaGFpbmFibGVTdGF0ZSh7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICB0cmFuc2FjdGlvbjogdHIsXG4gICAgICB9KSxcbiAgICAgIGRpc3BhdGNoOiBzaG91bGREaXNwYXRjaCA/ICgpID0+IHVuZGVmaW5lZCA6IHVuZGVmaW5lZCxcbiAgICAgIGNoYWluOiAoKSA9PiB0aGlzLmNyZWF0ZUNoYWluKHRyLCBzaG91bGREaXNwYXRjaCksXG4gICAgICBjYW46ICgpID0+IHRoaXMuY3JlYXRlQ2FuKHRyKSxcbiAgICAgIGdldCBjb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhyYXdDb21tYW5kcykubWFwKChbbmFtZSwgY29tbWFuZF0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbbmFtZSwgKC4uLmFyZ3M6IG5ldmVyW10pID0+IGNvbW1hbmQoLi4uYXJncykocHJvcHMpXVxuICAgICAgICAgIH0pLFxuICAgICAgICApIGFzIHVua25vd24gYXMgU2luZ2xlQ29tbWFuZHNcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzXG4gIH1cbn1cbiIsICJ0eXBlIFN0cmluZ0tleU9mPFQ+ID0gRXh0cmFjdDxrZXlvZiBULCBzdHJpbmc+XG50eXBlIENhbGxiYWNrVHlwZTxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleU9mPFQ+LFxuPiA9IFRbRXZlbnROYW1lXSBleHRlbmRzIGFueVtdID8gVFtFdmVudE5hbWVdIDogW1RbRXZlbnROYW1lXV1cbnR5cGUgQ2FsbGJhY2tGdW5jdGlvbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleU9mPFQ+LFxuPiA9ICguLi5wcm9wczogQ2FsbGJhY2tUeXBlPFQsIEV2ZW50TmFtZT4pID0+IGFueVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG5cbiAgcHJpdmF0ZSBjYWxsYmFja3M6IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb25bXSB9ID0ge31cblxuICBwdWJsaWMgb248RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5T2Y8VD4+KGV2ZW50OiBFdmVudE5hbWUsIGZuOiBDYWxsYmFja0Z1bmN0aW9uPFQsIEV2ZW50TmFtZT4pOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2tzW2V2ZW50XSkge1xuICAgICAgdGhpcy5jYWxsYmFja3NbZXZlbnRdID0gW11cbiAgICB9XG5cbiAgICB0aGlzLmNhbGxiYWNrc1tldmVudF0ucHVzaChmbilcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdDxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlPZjxUPj4oZXZlbnQ6IEV2ZW50TmFtZSwgLi4uYXJnczogQ2FsbGJhY2tUeXBlPFQsIEV2ZW50TmFtZT4pOiB0aGlzIHtcbiAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLmNhbGxiYWNrc1tldmVudF1cblxuICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleU9mPFQ+PihldmVudDogRXZlbnROYW1lLCBmbj86IENhbGxiYWNrRnVuY3Rpb248VCwgRXZlbnROYW1lPik6IHRoaXMge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzW2V2ZW50XVxuXG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzW2V2ZW50XSA9IGNhbGxiYWNrcy5maWx0ZXIoY2FsbGJhY2sgPT4gY2FsbGJhY2sgIT09IGZuKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2V2ZW50XVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlQWxsTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge31cbiAgfVxufVxuIiwgImltcG9ydCB7IEFueUV4dGVuc2lvbiwgTWF5YmVUaGlzUGFyYW1ldGVyVHlwZSwgUmVtb3ZlVGhpcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uRmllbGQ8VCA9IGFueT4oXG4gIGV4dGVuc2lvbjogQW55RXh0ZW5zaW9uLFxuICBmaWVsZDogc3RyaW5nLFxuICBjb250ZXh0PzogT21pdDxNYXliZVRoaXNQYXJhbWV0ZXJUeXBlPFQ+LCAncGFyZW50Jz4sXG4pOiBSZW1vdmVUaGlzPFQ+IHtcblxuICBpZiAoZXh0ZW5zaW9uLmNvbmZpZ1tmaWVsZF0gPT09IHVuZGVmaW5lZCAmJiBleHRlbnNpb24ucGFyZW50KSB7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbi5wYXJlbnQsIGZpZWxkLCBjb250ZXh0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiBleHRlbnNpb24uY29uZmlnW2ZpZWxkXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gZXh0ZW5zaW9uLmNvbmZpZ1tmaWVsZF0uYmluZCh7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgcGFyZW50OiBleHRlbnNpb24ucGFyZW50XG4gICAgICAgID8gZ2V0RXh0ZW5zaW9uRmllbGQoZXh0ZW5zaW9uLnBhcmVudCwgZmllbGQsIGNvbnRleHQpXG4gICAgICAgIDogbnVsbCxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICByZXR1cm4gZXh0ZW5zaW9uLmNvbmZpZ1tmaWVsZF1cbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9FeHRlbnNpb24uanMnXG5pbXBvcnQgeyBNYXJrIH0gZnJvbSAnLi4vTWFyay5qcydcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuLi9Ob2RlLmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRFeHRlbnNpb25zKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpIHtcbiAgY29uc3QgYmFzZUV4dGVuc2lvbnMgPSBleHRlbnNpb25zLmZpbHRlcihleHRlbnNpb24gPT4gZXh0ZW5zaW9uLnR5cGUgPT09ICdleHRlbnNpb24nKSBhcyBFeHRlbnNpb25bXVxuICBjb25zdCBub2RlRXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMuZmlsdGVyKGV4dGVuc2lvbiA9PiBleHRlbnNpb24udHlwZSA9PT0gJ25vZGUnKSBhcyBOb2RlW11cbiAgY29uc3QgbWFya0V4dGVuc2lvbnMgPSBleHRlbnNpb25zLmZpbHRlcihleHRlbnNpb24gPT4gZXh0ZW5zaW9uLnR5cGUgPT09ICdtYXJrJykgYXMgTWFya1tdXG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlRXh0ZW5zaW9ucyxcbiAgICBub2RlRXh0ZW5zaW9ucyxcbiAgICBtYXJrRXh0ZW5zaW9ucyxcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtDb25maWcsIE5vZGVDb25maWcgfSBmcm9tICcuLi9pbmRleC5qcydcbmltcG9ydCB7XG4gIEFueUNvbmZpZyxcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVzLFxuICBFeHRlbnNpb25BdHRyaWJ1dGUsXG4gIEV4dGVuc2lvbnMsXG4gIEdsb2JhbEF0dHJpYnV0ZXMsXG59IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgc3BsaXRFeHRlbnNpb25zIH0gZnJvbSAnLi9zcGxpdEV4dGVuc2lvbnMuanMnXG5cbi8qKlxuICogR2V0IGEgbGlzdCBvZiBhbGwgZXh0ZW5zaW9uIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBgYWRkQXR0cmlidXRlYCBhbmQgYGFkZEdsb2JhbEF0dHJpYnV0ZWAuXG4gKiBAcGFyYW0gZXh0ZW5zaW9ucyBMaXN0IG9mIGV4dGVuc2lvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBFeHRlbnNpb25zKTogRXh0ZW5zaW9uQXR0cmlidXRlW10ge1xuICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzOiBFeHRlbnNpb25BdHRyaWJ1dGVbXSA9IFtdXG4gIGNvbnN0IHsgbm9kZUV4dGVuc2lvbnMsIG1hcmtFeHRlbnNpb25zIH0gPSBzcGxpdEV4dGVuc2lvbnMoZXh0ZW5zaW9ucylcbiAgY29uc3Qgbm9kZUFuZE1hcmtFeHRlbnNpb25zID0gWy4uLm5vZGVFeHRlbnNpb25zLCAuLi5tYXJrRXh0ZW5zaW9uc11cbiAgY29uc3QgZGVmYXVsdEF0dHJpYnV0ZTogUmVxdWlyZWQ8QXR0cmlidXRlPiA9IHtcbiAgICBkZWZhdWx0OiBudWxsLFxuICAgIHJlbmRlcmVkOiB0cnVlLFxuICAgIHJlbmRlckhUTUw6IG51bGwsXG4gICAgcGFyc2VIVE1MOiBudWxsLFxuICAgIGtlZXBPblNwbGl0OiB0cnVlLFxuICAgIGlzUmVxdWlyZWQ6IGZhbHNlLFxuICB9XG5cbiAgZXh0ZW5zaW9ucy5mb3JFYWNoKGV4dGVuc2lvbiA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgICB9XG5cbiAgICBjb25zdCBhZGRHbG9iYWxBdHRyaWJ1dGVzID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRHbG9iYWxBdHRyaWJ1dGVzJ10+KFxuICAgICAgZXh0ZW5zaW9uLFxuICAgICAgJ2FkZEdsb2JhbEF0dHJpYnV0ZXMnLFxuICAgICAgY29udGV4dCxcbiAgICApXG5cbiAgICBpZiAoIWFkZEdsb2JhbEF0dHJpYnV0ZXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSBgYXMgR2xvYmFsQXR0cmlidXRlc2BcbiAgICBjb25zdCBnbG9iYWxBdHRyaWJ1dGVzID0gYWRkR2xvYmFsQXR0cmlidXRlcygpIGFzIEdsb2JhbEF0dHJpYnV0ZXNcblxuICAgIGdsb2JhbEF0dHJpYnV0ZXMuZm9yRWFjaChnbG9iYWxBdHRyaWJ1dGUgPT4ge1xuICAgICAgZ2xvYmFsQXR0cmlidXRlLnR5cGVzLmZvckVhY2godHlwZSA9PiB7XG4gICAgICAgIE9iamVjdFxuICAgICAgICAgIC5lbnRyaWVzKGdsb2JhbEF0dHJpYnV0ZS5hdHRyaWJ1dGVzKVxuICAgICAgICAgIC5mb3JFYWNoKChbbmFtZSwgYXR0cmlidXRlXSkgPT4ge1xuICAgICAgICAgICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgYXR0cmlidXRlOiB7XG4gICAgICAgICAgICAgICAgLi4uZGVmYXVsdEF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgbm9kZUFuZE1hcmtFeHRlbnNpb25zLmZvckVhY2goZXh0ZW5zaW9uID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgIH1cblxuICAgIGNvbnN0IGFkZEF0dHJpYnV0ZXMgPSBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydhZGRBdHRyaWJ1dGVzJ10gfCBNYXJrQ29uZmlnWydhZGRBdHRyaWJ1dGVzJ10+KFxuICAgICAgZXh0ZW5zaW9uLFxuICAgICAgJ2FkZEF0dHJpYnV0ZXMnLFxuICAgICAgY29udGV4dCxcbiAgICApXG5cbiAgICBpZiAoIWFkZEF0dHJpYnV0ZXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSBgYXMgQXR0cmlidXRlc2BcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gYWRkQXR0cmlidXRlcygpIGFzIEF0dHJpYnV0ZXNcblxuICAgIE9iamVjdFxuICAgICAgLmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAgIC5mb3JFYWNoKChbbmFtZSwgYXR0cmlidXRlXSkgPT4ge1xuICAgICAgICBjb25zdCBtZXJnZWRBdHRyID0ge1xuICAgICAgICAgIC4uLmRlZmF1bHRBdHRyaWJ1dGUsXG4gICAgICAgICAgLi4uYXR0cmlidXRlLFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtZXJnZWRBdHRyPy5kZWZhdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgbWVyZ2VkQXR0ci5kZWZhdWx0ID0gbWVyZ2VkQXR0ci5kZWZhdWx0KClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXJnZWRBdHRyPy5pc1JlcXVpcmVkICYmIG1lcmdlZEF0dHI/LmRlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSBtZXJnZWRBdHRyLmRlZmF1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBhdHRyaWJ1dGU6IG1lcmdlZEF0dHIsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICB9KVxuXG4gIHJldHVybiBleHRlbnNpb25BdHRyaWJ1dGVzXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUsIFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlVHlwZShuYW1lT3JUeXBlOiBzdHJpbmcgfCBOb2RlVHlwZSwgc2NoZW1hOiBTY2hlbWEpOiBOb2RlVHlwZSB7XG4gIGlmICh0eXBlb2YgbmFtZU9yVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXNjaGVtYS5ub2Rlc1tuYW1lT3JUeXBlXSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBUaGVyZSBpcyBubyBub2RlIHR5cGUgbmFtZWQgJyR7bmFtZU9yVHlwZX0nLiBNYXliZSB5b3UgZm9yZ290IHRvIGFkZCB0aGUgZXh0ZW5zaW9uP2AsXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNjaGVtYS5ub2Rlc1tuYW1lT3JUeXBlXVxuICB9XG5cbiAgcmV0dXJuIG5hbWVPclR5cGVcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbWVyZ2VBdHRyaWJ1dGVzKC4uLm9iamVjdHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICByZXR1cm4gb2JqZWN0c1xuICAgIC5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pXG4gICAgLnJlZHVjZSgoaXRlbXMsIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IG1lcmdlZEF0dHJpYnV0ZXMgPSB7IC4uLml0ZW1zIH1cblxuICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG1lcmdlZEF0dHJpYnV0ZXNba2V5XVxuXG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgbWVyZ2VkQXR0cmlidXRlc1trZXldID0gdmFsdWVcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ2xhc3Nlczogc3RyaW5nW10gPSB2YWx1ZSA/IHZhbHVlLnNwbGl0KCcgJykgOiBbXVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhc3Nlczogc3RyaW5nW10gPSBtZXJnZWRBdHRyaWJ1dGVzW2tleV0gPyBtZXJnZWRBdHRyaWJ1dGVzW2tleV0uc3BsaXQoJyAnKSA6IFtdXG5cbiAgICAgICAgICBjb25zdCBpbnNlcnRDbGFzc2VzID0gdmFsdWVDbGFzc2VzLmZpbHRlcihcbiAgICAgICAgICAgIHZhbHVlQ2xhc3MgPT4gIWV4aXN0aW5nQ2xhc3Nlcy5pbmNsdWRlcyh2YWx1ZUNsYXNzKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBtZXJnZWRBdHRyaWJ1dGVzW2tleV0gPSBbLi4uZXhpc3RpbmdDbGFzc2VzLCAuLi5pbnNlcnRDbGFzc2VzXS5qb2luKCcgJylcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICBtZXJnZWRBdHRyaWJ1dGVzW2tleV0gPSBbbWVyZ2VkQXR0cmlidXRlc1trZXldLCB2YWx1ZV0uam9pbignOyAnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lcmdlZEF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBtZXJnZWRBdHRyaWJ1dGVzXG4gICAgfSwge30pXG59XG4iLCAiaW1wb3J0IHsgTWFyaywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IEV4dGVuc2lvbkF0dHJpYnV0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSAnLi4vdXRpbGl0aWVzL21lcmdlQXR0cmlidXRlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlbmRlcmVkQXR0cmlidXRlcyhcbiAgbm9kZU9yTWFyazogTm9kZSB8IE1hcmssXG4gIGV4dGVuc2lvbkF0dHJpYnV0ZXM6IEV4dGVuc2lvbkF0dHJpYnV0ZVtdLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIHJldHVybiBleHRlbnNpb25BdHRyaWJ1dGVzXG4gICAgLmZpbHRlcihpdGVtID0+IGl0ZW0uYXR0cmlidXRlLnJlbmRlcmVkKVxuICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0uYXR0cmlidXRlLnJlbmRlckhUTUwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbaXRlbS5uYW1lXTogbm9kZU9yTWFyay5hdHRyc1tpdGVtLm5hbWVdLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtLmF0dHJpYnV0ZS5yZW5kZXJIVE1MKG5vZGVPck1hcmsuYXR0cnMpIHx8IHt9XG4gICAgfSlcbiAgICAucmVkdWNlKChhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUpID0+IG1lcmdlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUpLCB7fSlcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZTogYW55KTogdmFsdWUgaXMgRnVuY3Rpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG59XG4iLCAiaW1wb3J0IHsgTWF5YmVSZXR1cm5UeXBlIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJ1xuXG4vKipcbiAqIE9wdGlvbmFsbHkgY2FsbHMgYHZhbHVlYCBhcyBhIGZ1bmN0aW9uLlxuICogT3RoZXJ3aXNlIGl0IGlzIHJldHVybmVkIGRpcmVjdGx5LlxuICogQHBhcmFtIHZhbHVlIEZ1bmN0aW9uIG9yIGFueSB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGNvbnRleHQgdG8gYmluZCB0byBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwcm9wcyBPcHRpb25hbCBwcm9wcyB0byBwYXNzIHRvIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsbE9yUmV0dXJuPFQ+KHZhbHVlOiBULCBjb250ZXh0OiBhbnkgPSB1bmRlZmluZWQsIC4uLnByb3BzOiBhbnlbXSk6IE1heWJlUmV0dXJuVHlwZTxUPiB7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdmFsdWUuYmluZChjb250ZXh0KSguLi5wcm9wcylcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUoLi4ucHJvcHMpXG4gIH1cblxuICByZXR1cm4gdmFsdWUgYXMgTWF5YmVSZXR1cm5UeXBlPFQ+XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlPYmplY3QodmFsdWUgPSB7fSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWU6IGFueSk6IGFueSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUubWF0Y2goL15bKy1dPyg/OlxcZCpcXC4pP1xcZCskLykpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cbiIsICJpbXBvcnQgeyBQYXJzZVJ1bGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb25BdHRyaWJ1dGUgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGZyb21TdHJpbmcgfSBmcm9tICcuLi91dGlsaXRpZXMvZnJvbVN0cmluZy5qcydcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1lcmdlcyBleHRlbnNpb24gYXR0cmlidXRlcyBpbnRvIHBhcnNlcnVsZSBhdHRyaWJ1dGVzIChgYXR0cnNgIG9yIGBnZXRBdHRyc2ApLlxuICogQ2FuY2VscyB3aGVuIGBnZXRBdHRyc2AgcmV0dXJuZWQgYGZhbHNlYC5cbiAqIEBwYXJhbSBwYXJzZVJ1bGUgUHJvc2VNaXJyb3IgUGFyc2VSdWxlXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQXR0cmlidXRlcyBMaXN0IG9mIGF0dHJpYnV0ZXMgdG8gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RFeHRlbnNpb25BdHRyaWJ1dGVzVG9QYXJzZVJ1bGUoXG4gIHBhcnNlUnVsZTogUGFyc2VSdWxlLFxuICBleHRlbnNpb25BdHRyaWJ1dGVzOiBFeHRlbnNpb25BdHRyaWJ1dGVbXSxcbik6IFBhcnNlUnVsZSB7XG4gIGlmIChwYXJzZVJ1bGUuc3R5bGUpIHtcbiAgICByZXR1cm4gcGFyc2VSdWxlXG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnBhcnNlUnVsZSxcbiAgICBnZXRBdHRyczogbm9kZSA9PiB7XG4gICAgICBjb25zdCBvbGRBdHRyaWJ1dGVzID0gcGFyc2VSdWxlLmdldEF0dHJzID8gcGFyc2VSdWxlLmdldEF0dHJzKG5vZGUpIDogcGFyc2VSdWxlLmF0dHJzXG5cbiAgICAgIGlmIChvbGRBdHRyaWJ1dGVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IGV4dGVuc2lvbkF0dHJpYnV0ZXMucmVkdWNlKChpdGVtcywgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0uYXR0cmlidXRlLnBhcnNlSFRNTFxuICAgICAgICAgID8gaXRlbS5hdHRyaWJ1dGUucGFyc2VIVE1MKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgOiBmcm9tU3RyaW5nKChub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoaXRlbS5uYW1lKSlcblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBpdGVtc1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtcyxcbiAgICAgICAgICBbaXRlbS5uYW1lXTogdmFsdWUsXG4gICAgICAgIH1cbiAgICAgIH0sIHt9KVxuXG4gICAgICByZXR1cm4geyAuLi5vbGRBdHRyaWJ1dGVzLCAuLi5uZXdBdHRyaWJ1dGVzIH1cbiAgICB9LFxuICB9XG59XG4iLCAiaW1wb3J0IHsgTWFya1NwZWMsIE5vZGVTcGVjLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBFZGl0b3IsIE1hcmtDb25maWcsIE5vZGVDb25maWcgfSBmcm9tICcuLi9pbmRleC5qcydcbmltcG9ydCB7IEFueUNvbmZpZywgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IGlzRW1wdHlPYmplY3QgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNFbXB0eU9iamVjdC5qcydcbmltcG9ydCB7IGdldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucyB9IGZyb20gJy4vZ2V0QXR0cmlidXRlc0Zyb21FeHRlbnNpb25zLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZXRSZW5kZXJlZEF0dHJpYnV0ZXMuanMnXG5pbXBvcnQgeyBpbmplY3RFeHRlbnNpb25BdHRyaWJ1dGVzVG9QYXJzZVJ1bGUgfSBmcm9tICcuL2luamVjdEV4dGVuc2lvbkF0dHJpYnV0ZXNUb1BhcnNlUnVsZS5qcydcbmltcG9ydCB7IHNwbGl0RXh0ZW5zaW9ucyB9IGZyb20gJy4vc3BsaXRFeHRlbnNpb25zLmpzJ1xuXG5mdW5jdGlvbiBjbGVhblVwU2NoZW1hSXRlbTxUPihkYXRhOiBUKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAnYXR0cnMnICYmIGlzRW1wdHlPYmplY3QodmFsdWUgYXMge30gfCB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgIH0pLFxuICApIGFzIFRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVtYUJ5UmVzb2x2ZWRFeHRlbnNpb25zKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsIGVkaXRvcj86IEVkaXRvcik6IFNjaGVtYSB7XG4gIGNvbnN0IGFsbEF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzRnJvbUV4dGVuc2lvbnMoZXh0ZW5zaW9ucylcbiAgY29uc3QgeyBub2RlRXh0ZW5zaW9ucywgbWFya0V4dGVuc2lvbnMgfSA9IHNwbGl0RXh0ZW5zaW9ucyhleHRlbnNpb25zKVxuICBjb25zdCB0b3BOb2RlID0gbm9kZUV4dGVuc2lvbnMuZmluZChleHRlbnNpb24gPT4gZ2V0RXh0ZW5zaW9uRmllbGQoZXh0ZW5zaW9uLCAndG9wTm9kZScpKT8ubmFtZVxuXG4gIGNvbnN0IG5vZGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIG5vZGVFeHRlbnNpb25zLm1hcChleHRlbnNpb24gPT4ge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uQXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXMuZmlsdGVyKFxuICAgICAgICBhdHRyaWJ1dGUgPT4gYXR0cmlidXRlLnR5cGUgPT09IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgKVxuICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgICAgICAgZWRpdG9yLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRyYU5vZGVGaWVsZHMgPSBleHRlbnNpb25zLnJlZHVjZSgoZmllbGRzLCBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4dGVuZE5vZGVTY2hlbWEgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2V4dGVuZE5vZGVTY2hlbWEnXT4oXG4gICAgICAgICAgZSxcbiAgICAgICAgICAnZXh0ZW5kTm9kZVNjaGVtYScsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZmllbGRzLFxuICAgICAgICAgIC4uLihleHRlbmROb2RlU2NoZW1hID8gZXh0ZW5kTm9kZVNjaGVtYShleHRlbnNpb24pIDoge30pLFxuICAgICAgICB9XG4gICAgICB9LCB7fSlcblxuICAgICAgY29uc3Qgc2NoZW1hOiBOb2RlU3BlYyA9IGNsZWFuVXBTY2hlbWFJdGVtKHtcbiAgICAgICAgLi4uZXh0cmFOb2RlRmllbGRzLFxuICAgICAgICBjb250ZW50OiBjYWxsT3JSZXR1cm4oXG4gICAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snY29udGVudCddPihleHRlbnNpb24sICdjb250ZW50JywgY29udGV4dCksXG4gICAgICAgICksXG4gICAgICAgIG1hcmtzOiBjYWxsT3JSZXR1cm4oZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snbWFya3MnXT4oZXh0ZW5zaW9uLCAnbWFya3MnLCBjb250ZXh0KSksXG4gICAgICAgIGdyb3VwOiBjYWxsT3JSZXR1cm4oZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snZ3JvdXAnXT4oZXh0ZW5zaW9uLCAnZ3JvdXAnLCBjb250ZXh0KSksXG4gICAgICAgIGlubGluZTogY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2lubGluZSddPihleHRlbnNpb24sICdpbmxpbmUnLCBjb250ZXh0KSksXG4gICAgICAgIGF0b206IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydhdG9tJ10+KGV4dGVuc2lvbiwgJ2F0b20nLCBjb250ZXh0KSksXG4gICAgICAgIHNlbGVjdGFibGU6IGNhbGxPclJldHVybihcbiAgICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydzZWxlY3RhYmxlJ10+KGV4dGVuc2lvbiwgJ3NlbGVjdGFibGUnLCBjb250ZXh0KSxcbiAgICAgICAgKSxcbiAgICAgICAgZHJhZ2dhYmxlOiBjYWxsT3JSZXR1cm4oXG4gICAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snZHJhZ2dhYmxlJ10+KGV4dGVuc2lvbiwgJ2RyYWdnYWJsZScsIGNvbnRleHQpLFxuICAgICAgICApLFxuICAgICAgICBjb2RlOiBjYWxsT3JSZXR1cm4oZ2V0RXh0ZW5zaW9uRmllbGQ8Tm9kZUNvbmZpZ1snY29kZSddPihleHRlbnNpb24sICdjb2RlJywgY29udGV4dCkpLFxuICAgICAgICBkZWZpbmluZzogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2RlZmluaW5nJ10+KGV4dGVuc2lvbiwgJ2RlZmluaW5nJywgY29udGV4dCksXG4gICAgICAgICksXG4gICAgICAgIGlzb2xhdGluZzogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2lzb2xhdGluZyddPihleHRlbnNpb24sICdpc29sYXRpbmcnLCBjb250ZXh0KSxcbiAgICAgICAgKSxcbiAgICAgICAgYXR0cnM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBleHRlbnNpb25BdHRyaWJ1dGVzLm1hcChleHRlbnNpb25BdHRyaWJ1dGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFtleHRlbnNpb25BdHRyaWJ1dGUubmFtZSwgeyBkZWZhdWx0OiBleHRlbnNpb25BdHRyaWJ1dGU/LmF0dHJpYnV0ZT8uZGVmYXVsdCB9XVxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcGFyc2VIVE1MID0gY2FsbE9yUmV0dXJuKFxuICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydwYXJzZUhUTUwnXT4oZXh0ZW5zaW9uLCAncGFyc2VIVE1MJywgY29udGV4dCksXG4gICAgICApXG5cbiAgICAgIGlmIChwYXJzZUhUTUwpIHtcbiAgICAgICAgc2NoZW1hLnBhcnNlRE9NID0gcGFyc2VIVE1MLm1hcChwYXJzZVJ1bGUgPT4gaW5qZWN0RXh0ZW5zaW9uQXR0cmlidXRlc1RvUGFyc2VSdWxlKHBhcnNlUnVsZSwgZXh0ZW5zaW9uQXR0cmlidXRlcykpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbmRlckhUTUwgPSBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydyZW5kZXJIVE1MJ10+KFxuICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICdyZW5kZXJIVE1MJyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIClcblxuICAgICAgaWYgKHJlbmRlckhUTUwpIHtcbiAgICAgICAgc2NoZW1hLnRvRE9NID0gbm9kZSA9PiByZW5kZXJIVE1MKHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzOiBnZXRSZW5kZXJlZEF0dHJpYnV0ZXMobm9kZSwgZXh0ZW5zaW9uQXR0cmlidXRlcyksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbmRlclRleHQgPSBnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydyZW5kZXJUZXh0J10+KFxuICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICdyZW5kZXJUZXh0JyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIClcblxuICAgICAgaWYgKHJlbmRlclRleHQpIHtcbiAgICAgICAgc2NoZW1hLnRvVGV4dCA9IHJlbmRlclRleHRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtleHRlbnNpb24ubmFtZSwgc2NoZW1hXVxuICAgIH0pLFxuICApXG5cbiAgY29uc3QgbWFya3MgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgbWFya0V4dGVuc2lvbnMubWFwKGV4dGVuc2lvbiA9PiB7XG4gICAgICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzID0gYWxsQXR0cmlidXRlcy5maWx0ZXIoXG4gICAgICAgIGF0dHJpYnV0ZSA9PiBhdHRyaWJ1dGUudHlwZSA9PT0gZXh0ZW5zaW9uLm5hbWUsXG4gICAgICApXG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgICAgICBlZGl0b3IsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dHJhTWFya0ZpZWxkcyA9IGV4dGVuc2lvbnMucmVkdWNlKChmaWVsZHMsIGUpID0+IHtcbiAgICAgICAgY29uc3QgZXh0ZW5kTWFya1NjaGVtYSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snZXh0ZW5kTWFya1NjaGVtYSddPihcbiAgICAgICAgICBlLFxuICAgICAgICAgICdleHRlbmRNYXJrU2NoZW1hJyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgLi4uKGV4dGVuZE1hcmtTY2hlbWEgPyBleHRlbmRNYXJrU2NoZW1hKGV4dGVuc2lvbikgOiB7fSksXG4gICAgICAgIH1cbiAgICAgIH0sIHt9KVxuXG4gICAgICBjb25zdCBzY2hlbWE6IE1hcmtTcGVjID0gY2xlYW5VcFNjaGVtYUl0ZW0oe1xuICAgICAgICAuLi5leHRyYU1hcmtGaWVsZHMsXG4gICAgICAgIGluY2x1c2l2ZTogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE1hcmtDb25maWdbJ2luY2x1c2l2ZSddPihleHRlbnNpb24sICdpbmNsdXNpdmUnLCBjb250ZXh0KSxcbiAgICAgICAgKSxcbiAgICAgICAgZXhjbHVkZXM6IGNhbGxPclJldHVybihcbiAgICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxNYXJrQ29uZmlnWydleGNsdWRlcyddPihleHRlbnNpb24sICdleGNsdWRlcycsIGNvbnRleHQpLFxuICAgICAgICApLFxuICAgICAgICBncm91cDogY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkPE1hcmtDb25maWdbJ2dyb3VwJ10+KGV4dGVuc2lvbiwgJ2dyb3VwJywgY29udGV4dCkpLFxuICAgICAgICBzcGFubmluZzogY2FsbE9yUmV0dXJuKFxuICAgICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPE1hcmtDb25maWdbJ3NwYW5uaW5nJ10+KGV4dGVuc2lvbiwgJ3NwYW5uaW5nJywgY29udGV4dCksXG4gICAgICAgICksXG4gICAgICAgIGNvZGU6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZDxNYXJrQ29uZmlnWydjb2RlJ10+KGV4dGVuc2lvbiwgJ2NvZGUnLCBjb250ZXh0KSksXG4gICAgICAgIGF0dHJzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5tYXAoZXh0ZW5zaW9uQXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbZXh0ZW5zaW9uQXR0cmlidXRlLm5hbWUsIHsgZGVmYXVsdDogZXh0ZW5zaW9uQXR0cmlidXRlPy5hdHRyaWJ1dGU/LmRlZmF1bHQgfV1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHBhcnNlSFRNTCA9IGNhbGxPclJldHVybihcbiAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8TWFya0NvbmZpZ1sncGFyc2VIVE1MJ10+KGV4dGVuc2lvbiwgJ3BhcnNlSFRNTCcsIGNvbnRleHQpLFxuICAgICAgKVxuXG4gICAgICBpZiAocGFyc2VIVE1MKSB7XG4gICAgICAgIHNjaGVtYS5wYXJzZURPTSA9IHBhcnNlSFRNTC5tYXAocGFyc2VSdWxlID0+IGluamVjdEV4dGVuc2lvbkF0dHJpYnV0ZXNUb1BhcnNlUnVsZShwYXJzZVJ1bGUsIGV4dGVuc2lvbkF0dHJpYnV0ZXMpKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZW5kZXJIVE1MID0gZ2V0RXh0ZW5zaW9uRmllbGQ8TWFya0NvbmZpZ1sncmVuZGVySFRNTCddPihcbiAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAncmVuZGVySFRNTCcsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIGlmIChyZW5kZXJIVE1MKSB7XG4gICAgICAgIHNjaGVtYS50b0RPTSA9IG1hcmsgPT4gcmVuZGVySFRNTCh7XG4gICAgICAgICAgbWFyayxcbiAgICAgICAgICBIVE1MQXR0cmlidXRlczogZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzKG1hcmssIGV4dGVuc2lvbkF0dHJpYnV0ZXMpLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2V4dGVuc2lvbi5uYW1lLCBzY2hlbWFdXG4gICAgfSksXG4gIClcblxuICByZXR1cm4gbmV3IFNjaGVtYSh7XG4gICAgdG9wTm9kZSxcbiAgICBub2RlcyxcbiAgICBtYXJrcyxcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBNYXJrVHlwZSwgTm9kZVR5cGUsIFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFUeXBlQnlOYW1lKG5hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWEpOiBOb2RlVHlwZSB8IE1hcmtUeXBlIHwgbnVsbCB7XG4gIHJldHVybiBzY2hlbWEubm9kZXNbbmFtZV0gfHwgc2NoZW1hLm1hcmtzW25hbWVdIHx8IG51bGxcbn1cbiIsICJpbXBvcnQgeyBBbnlFeHRlbnNpb24sIEVuYWJsZVJ1bGVzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V4dGVuc2lvblJ1bGVzRW5hYmxlZChleHRlbnNpb246IEFueUV4dGVuc2lvbiwgZW5hYmxlZDogRW5hYmxlUnVsZXMpOiBib29sZWFuIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZW5hYmxlZCkpIHtcbiAgICByZXR1cm4gZW5hYmxlZC5zb21lKGVuYWJsZWRFeHRlbnNpb24gPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiBlbmFibGVkRXh0ZW5zaW9uID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGVuYWJsZWRFeHRlbnNpb25cbiAgICAgICAgOiBlbmFibGVkRXh0ZW5zaW9uLm5hbWVcblxuICAgICAgcmV0dXJuIG5hbWUgPT09IGV4dGVuc2lvbi5uYW1lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBlbmFibGVkXG59XG4iLCAiaW1wb3J0IHsgUmVzb2x2ZWRQb3MgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dENvbnRlbnRGcm9tTm9kZXMgPSAoJGZyb206IFJlc29sdmVkUG9zLCBtYXhNYXRjaCA9IDUwMCkgPT4ge1xuICBsZXQgdGV4dEJlZm9yZSA9ICcnXG5cbiAgY29uc3Qgc2xpY2VFbmRQb3MgPSAkZnJvbS5wYXJlbnRPZmZzZXRcblxuICAkZnJvbS5wYXJlbnQubm9kZXNCZXR3ZWVuKFxuICAgIE1hdGgubWF4KDAsIHNsaWNlRW5kUG9zIC0gbWF4TWF0Y2gpLFxuICAgIHNsaWNlRW5kUG9zLFxuICAgIChub2RlLCBwb3MsIHBhcmVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNodW5rID0gbm9kZS50eXBlLnNwZWMudG9UZXh0Py4oe1xuICAgICAgICBub2RlLFxuICAgICAgICBwb3MsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaW5kZXgsXG4gICAgICB9KVxuICAgICAgICB8fCBub2RlLnRleHRDb250ZW50XG4gICAgICAgIHx8ICclbGVhZiUnXG5cbiAgICAgIHRleHRCZWZvcmUgKz0gY2h1bmsuc2xpY2UoMCwgTWF0aC5tYXgoMCwgc2xpY2VFbmRQb3MgLSBwb3MpKVxuICAgIH0sXG4gIClcblxuICByZXR1cm4gdGV4dEJlZm9yZVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBpc1JlZ0V4cCh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVnRXhwIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nXG59XG4iLCAiaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiwgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IENvbW1hbmRNYW5hZ2VyIH0gZnJvbSAnLi9Db21tYW5kTWFuYWdlci5qcydcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgY3JlYXRlQ2hhaW5hYmxlU3RhdGUgfSBmcm9tICcuL2hlbHBlcnMvY3JlYXRlQ2hhaW5hYmxlU3RhdGUuanMnXG5pbXBvcnQgeyBnZXRUZXh0Q29udGVudEZyb21Ob2RlcyB9IGZyb20gJy4vaGVscGVycy9nZXRUZXh0Q29udGVudEZyb21Ob2Rlcy5qcydcbmltcG9ydCB7XG4gIENhbkNvbW1hbmRzLFxuICBDaGFpbmVkQ29tbWFuZHMsXG4gIEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSxcbiAgUmFuZ2UsXG4gIFNpbmdsZUNvbW1hbmRzLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNSZWdFeHAgfSBmcm9tICcuL3V0aWxpdGllcy9pc1JlZ0V4cC5qcydcblxuZXhwb3J0IHR5cGUgSW5wdXRSdWxlTWF0Y2ggPSB7XG4gIGluZGV4OiBudW1iZXJcbiAgdGV4dDogc3RyaW5nXG4gIHJlcGxhY2VXaXRoPzogc3RyaW5nXG4gIG1hdGNoPzogUmVnRXhwTWF0Y2hBcnJheVxuICBkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PlxufVxuXG5leHBvcnQgdHlwZSBJbnB1dFJ1bGVGaW5kZXIgPSBSZWdFeHAgfCAoKHRleHQ6IHN0cmluZykgPT4gSW5wdXRSdWxlTWF0Y2ggfCBudWxsKVxuXG5leHBvcnQgY2xhc3MgSW5wdXRSdWxlIHtcbiAgZmluZDogSW5wdXRSdWxlRmluZGVyXG5cbiAgaGFuZGxlcjogKHByb3BzOiB7XG4gICAgc3RhdGU6IEVkaXRvclN0YXRlXG4gICAgcmFuZ2U6IFJhbmdlXG4gICAgbWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheVxuICAgIGNvbW1hbmRzOiBTaW5nbGVDb21tYW5kc1xuICAgIGNoYWluOiAoKSA9PiBDaGFpbmVkQ29tbWFuZHNcbiAgICBjYW46ICgpID0+IENhbkNvbW1hbmRzXG4gIH0pID0+IHZvaWQgfCBudWxsXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiB7XG4gICAgZmluZDogSW5wdXRSdWxlRmluZGVyXG4gICAgaGFuZGxlcjogKHByb3BzOiB7XG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGVcbiAgICAgIHJhbmdlOiBSYW5nZVxuICAgICAgbWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheVxuICAgICAgY29tbWFuZHM6IFNpbmdsZUNvbW1hbmRzXG4gICAgICBjaGFpbjogKCkgPT4gQ2hhaW5lZENvbW1hbmRzXG4gICAgICBjYW46ICgpID0+IENhbkNvbW1hbmRzXG4gICAgfSkgPT4gdm9pZCB8IG51bGxcbiAgfSkge1xuICAgIHRoaXMuZmluZCA9IGNvbmZpZy5maW5kXG4gICAgdGhpcy5oYW5kbGVyID0gY29uZmlnLmhhbmRsZXJcbiAgfVxufVxuXG5jb25zdCBpbnB1dFJ1bGVNYXRjaGVySGFuZGxlciA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmaW5kOiBJbnB1dFJ1bGVGaW5kZXIsXG4pOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkgfCBudWxsID0+IHtcbiAgaWYgKGlzUmVnRXhwKGZpbmQpKSB7XG4gICAgcmV0dXJuIGZpbmQuZXhlYyh0ZXh0KVxuICB9XG5cbiAgY29uc3QgaW5wdXRSdWxlTWF0Y2ggPSBmaW5kKHRleHQpXG5cbiAgaWYgKCFpbnB1dFJ1bGVNYXRjaCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCByZXN1bHQ6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSA9IFtpbnB1dFJ1bGVNYXRjaC50ZXh0XVxuXG4gIHJlc3VsdC5pbmRleCA9IGlucHV0UnVsZU1hdGNoLmluZGV4XG4gIHJlc3VsdC5pbnB1dCA9IHRleHRcbiAgcmVzdWx0LmRhdGEgPSBpbnB1dFJ1bGVNYXRjaC5kYXRhXG5cbiAgaWYgKGlucHV0UnVsZU1hdGNoLnJlcGxhY2VXaXRoKSB7XG4gICAgaWYgKCFpbnB1dFJ1bGVNYXRjaC50ZXh0LmluY2x1ZGVzKGlucHV0UnVsZU1hdGNoLnJlcGxhY2VXaXRoKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3RpcHRhcCB3YXJuXTogXCJpbnB1dFJ1bGVNYXRjaC5yZXBsYWNlV2l0aFwiIG11c3QgYmUgcGFydCBvZiBcImlucHV0UnVsZU1hdGNoLnRleHRcIi4nLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGlucHV0UnVsZU1hdGNoLnJlcGxhY2VXaXRoKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBydW4oY29uZmlnOiB7XG4gIGVkaXRvcjogRWRpdG9yXG4gIGZyb206IG51bWJlclxuICB0bzogbnVtYmVyXG4gIHRleHQ6IHN0cmluZ1xuICBydWxlczogSW5wdXRSdWxlW11cbiAgcGx1Z2luOiBQbHVnaW5cbn0pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGVkaXRvciwgZnJvbSwgdG8sIHRleHQsIHJ1bGVzLCBwbHVnaW4sXG4gIH0gPSBjb25maWdcbiAgY29uc3QgeyB2aWV3IH0gPSBlZGl0b3JcblxuICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0ICRmcm9tID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShmcm9tKVxuXG4gIGlmIChcbiAgICAvLyBjaGVjayBmb3IgY29kZSBub2RlXG4gICAgJGZyb20ucGFyZW50LnR5cGUuc3BlYy5jb2RlXG4gICAgLy8gY2hlY2sgZm9yIGNvZGUgbWFya1xuICAgIHx8ICEhKCRmcm9tLm5vZGVCZWZvcmUgfHwgJGZyb20ubm9kZUFmdGVyKT8ubWFya3MuZmluZChtYXJrID0+IG1hcmsudHlwZS5zcGVjLmNvZGUpXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IG1hdGNoZWQgPSBmYWxzZVxuXG4gIGNvbnN0IHRleHRCZWZvcmUgPSBnZXRUZXh0Q29udGVudEZyb21Ob2RlcygkZnJvbSkgKyB0ZXh0XG5cbiAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSBpbnB1dFJ1bGVNYXRjaGVySGFuZGxlcih0ZXh0QmVmb3JlLCBydWxlLmZpbmQpXG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0ciA9IHZpZXcuc3RhdGUudHJcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUNoYWluYWJsZVN0YXRlKHtcbiAgICAgIHN0YXRlOiB2aWV3LnN0YXRlLFxuICAgICAgdHJhbnNhY3Rpb246IHRyLFxuICAgIH0pXG4gICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICBmcm9tOiBmcm9tIC0gKG1hdGNoWzBdLmxlbmd0aCAtIHRleHQubGVuZ3RoKSxcbiAgICAgIHRvLFxuICAgIH1cblxuICAgIGNvbnN0IHsgY29tbWFuZHMsIGNoYWluLCBjYW4gfSA9IG5ldyBDb21tYW5kTWFuYWdlcih7XG4gICAgICBlZGl0b3IsXG4gICAgICBzdGF0ZSxcbiAgICB9KVxuXG4gICAgY29uc3QgaGFuZGxlciA9IHJ1bGUuaGFuZGxlcih7XG4gICAgICBzdGF0ZSxcbiAgICAgIHJhbmdlLFxuICAgICAgbWF0Y2gsXG4gICAgICBjb21tYW5kcyxcbiAgICAgIGNoYWluLFxuICAgICAgY2FuLFxuICAgIH0pXG5cbiAgICAvLyBzdG9wIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VzXG4gICAgaWYgKGhhbmRsZXIgPT09IG51bGwgfHwgIXRyLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gc3RvcmUgdHJhbnNmb3JtIGFzIG1ldGEgZGF0YVxuICAgIC8vIHNvIHdlIGNhbiB1bmRvIGlucHV0IHJ1bGVzIHdpdGhpbiB0aGUgYHVuZG9JbnB1dFJ1bGVzYCBjb21tYW5kXG4gICAgdHIuc2V0TWV0YShwbHVnaW4sIHtcbiAgICAgIHRyYW5zZm9ybTogdHIsXG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICB0ZXh0LFxuICAgIH0pXG5cbiAgICB2aWV3LmRpc3BhdGNoKHRyKVxuICAgIG1hdGNoZWQgPSB0cnVlXG4gIH0pXG5cbiAgcmV0dXJuIG1hdGNoZWRcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5wdXQgcnVsZXMgcGx1Z2luLiBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgY2F1c2UgdGV4dFxuICogaW5wdXQgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcnVsZXMgdG8gdHJpZ2dlciB0aGUgcnVsZeKAmXNcbiAqIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlucHV0UnVsZXNQbHVnaW4ocHJvcHM6IHsgZWRpdG9yOiBFZGl0b3I7IHJ1bGVzOiBJbnB1dFJ1bGVbXSB9KTogUGx1Z2luIHtcbiAgY29uc3QgeyBlZGl0b3IsIHJ1bGVzIH0gPSBwcm9wc1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGx1Z2luKHtcbiAgICBzdGF0ZToge1xuICAgICAgaW5pdCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH0sXG4gICAgICBhcHBseSh0ciwgcHJldikge1xuICAgICAgICBjb25zdCBzdG9yZWQgPSB0ci5nZXRNZXRhKHBsdWdpbilcblxuICAgICAgICBpZiAoc3RvcmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHN0b3JlZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyLnNlbGVjdGlvblNldCB8fCB0ci5kb2NDaGFuZ2VkID8gbnVsbCA6IHByZXZcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHByb3BzOiB7XG4gICAgICBoYW5kbGVUZXh0SW5wdXQodmlldywgZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJ1bih7XG4gICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgIGZyb20sXG4gICAgICAgICAgdG8sXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBydWxlcyxcbiAgICAgICAgICBwbHVnaW4sXG4gICAgICAgIH0pXG4gICAgICB9LFxuXG4gICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgY29tcG9zaXRpb25lbmQ6IHZpZXcgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyAkY3Vyc29yIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uXG5cbiAgICAgICAgICAgIGlmICgkY3Vyc29yKSB7XG4gICAgICAgICAgICAgIHJ1bih7XG4gICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgIGZyb206ICRjdXJzb3IucG9zLFxuICAgICAgICAgICAgICAgIHRvOiAkY3Vyc29yLnBvcyxcbiAgICAgICAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICBydWxlcyxcbiAgICAgICAgICAgICAgICBwbHVnaW4sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gYWRkIHN1cHBvcnQgZm9yIGlucHV0IHJ1bGVzIHRvIHRyaWdnZXIgb24gZW50ZXJcbiAgICAgIC8vIHRoaXMgaXMgdXNlZnVsIGZvciBleGFtcGxlIGZvciBjb2RlIGJsb2Nrc1xuICAgICAgaGFuZGxlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb25cblxuICAgICAgICBpZiAoJGN1cnNvcikge1xuICAgICAgICAgIHJldHVybiBydW4oe1xuICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgZnJvbTogJGN1cnNvci5wb3MsXG4gICAgICAgICAgICB0bzogJGN1cnNvci5wb3MsXG4gICAgICAgICAgICB0ZXh0OiAnXFxuJyxcbiAgICAgICAgICAgIHJ1bGVzLFxuICAgICAgICAgICAgcGx1Z2luLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpc0lucHV0UnVsZXM6IHRydWUsXG4gIH0pIGFzIFBsdWdpblxuXG4gIHJldHVybiBwbHVnaW5cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IGFueSk6IHZhbHVlIGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG59XG4iLCAiaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IENvbW1hbmRNYW5hZ2VyIH0gZnJvbSAnLi9Db21tYW5kTWFuYWdlci5qcydcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgY3JlYXRlQ2hhaW5hYmxlU3RhdGUgfSBmcm9tICcuL2hlbHBlcnMvY3JlYXRlQ2hhaW5hYmxlU3RhdGUuanMnXG5pbXBvcnQge1xuICBDYW5Db21tYW5kcyxcbiAgQ2hhaW5lZENvbW1hbmRzLFxuICBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXksXG4gIFJhbmdlLFxuICBTaW5nbGVDb21tYW5kcyxcbn0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi91dGlsaXRpZXMvaXNOdW1iZXIuanMnXG5pbXBvcnQgeyBpc1JlZ0V4cCB9IGZyb20gJy4vdXRpbGl0aWVzL2lzUmVnRXhwLmpzJ1xuXG5leHBvcnQgdHlwZSBQYXN0ZVJ1bGVNYXRjaCA9IHtcbiAgaW5kZXg6IG51bWJlclxuICB0ZXh0OiBzdHJpbmdcbiAgcmVwbGFjZVdpdGg/OiBzdHJpbmdcbiAgbWF0Y2g/OiBSZWdFeHBNYXRjaEFycmF5XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCB0eXBlIFBhc3RlUnVsZUZpbmRlciA9IFJlZ0V4cCB8ICgodGV4dDogc3RyaW5nKSA9PiBQYXN0ZVJ1bGVNYXRjaFtdIHwgbnVsbCB8IHVuZGVmaW5lZClcblxuZXhwb3J0IGNsYXNzIFBhc3RlUnVsZSB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlclxuXG4gIGhhbmRsZXI6IChwcm9wczoge1xuICAgIHN0YXRlOiBFZGl0b3JTdGF0ZVxuICAgIHJhbmdlOiBSYW5nZVxuICAgIG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXlcbiAgICBjb21tYW5kczogU2luZ2xlQ29tbWFuZHNcbiAgICBjaGFpbjogKCkgPT4gQ2hhaW5lZENvbW1hbmRzXG4gICAgY2FuOiAoKSA9PiBDYW5Db21tYW5kc1xuICAgIHBhc3RlRXZlbnQ6IENsaXBib2FyZEV2ZW50XG4gICAgZHJvcEV2ZW50OiBEcmFnRXZlbnRcbiAgfSkgPT4gdm9pZCB8IG51bGxcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IHtcbiAgICBmaW5kOiBQYXN0ZVJ1bGVGaW5kZXJcbiAgICBoYW5kbGVyOiAocHJvcHM6IHtcbiAgICAgIGNhbjogKCkgPT4gQ2FuQ29tbWFuZHNcbiAgICAgIGNoYWluOiAoKSA9PiBDaGFpbmVkQ29tbWFuZHNcbiAgICAgIGNvbW1hbmRzOiBTaW5nbGVDb21tYW5kc1xuICAgICAgZHJvcEV2ZW50OiBEcmFnRXZlbnRcbiAgICAgIG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXlcbiAgICAgIHBhc3RlRXZlbnQ6IENsaXBib2FyZEV2ZW50XG4gICAgICByYW5nZTogUmFuZ2VcbiAgICAgIHN0YXRlOiBFZGl0b3JTdGF0ZVxuICAgIH0pID0+IHZvaWQgfCBudWxsXG4gIH0pIHtcbiAgICB0aGlzLmZpbmQgPSBjb25maWcuZmluZFxuICAgIHRoaXMuaGFuZGxlciA9IGNvbmZpZy5oYW5kbGVyXG4gIH1cbn1cblxuY29uc3QgcGFzdGVSdWxlTWF0Y2hlckhhbmRsZXIgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZmluZDogUGFzdGVSdWxlRmluZGVyLFxuKTogRXh0ZW5kZWRSZWdFeHBNYXRjaEFycmF5W10gPT4ge1xuICBpZiAoaXNSZWdFeHAoZmluZCkpIHtcbiAgICByZXR1cm4gWy4uLnRleHQubWF0Y2hBbGwoZmluZCldXG4gIH1cblxuICBjb25zdCBtYXRjaGVzID0gZmluZCh0ZXh0KVxuXG4gIGlmICghbWF0Y2hlcykge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXMubWFwKHBhc3RlUnVsZU1hdGNoID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSA9IFtwYXN0ZVJ1bGVNYXRjaC50ZXh0XVxuXG4gICAgcmVzdWx0LmluZGV4ID0gcGFzdGVSdWxlTWF0Y2guaW5kZXhcbiAgICByZXN1bHQuaW5wdXQgPSB0ZXh0XG4gICAgcmVzdWx0LmRhdGEgPSBwYXN0ZVJ1bGVNYXRjaC5kYXRhXG5cbiAgICBpZiAocGFzdGVSdWxlTWF0Y2gucmVwbGFjZVdpdGgpIHtcbiAgICAgIGlmICghcGFzdGVSdWxlTWF0Y2gudGV4dC5pbmNsdWRlcyhwYXN0ZVJ1bGVNYXRjaC5yZXBsYWNlV2l0aCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdbdGlwdGFwIHdhcm5dOiBcInBhc3RlUnVsZU1hdGNoLnJlcGxhY2VXaXRoXCIgbXVzdCBiZSBwYXJ0IG9mIFwicGFzdGVSdWxlTWF0Y2gudGV4dFwiLicsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmVzdWx0LnB1c2gocGFzdGVSdWxlTWF0Y2gucmVwbGFjZVdpdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxufVxuXG5mdW5jdGlvbiBydW4oY29uZmlnOiB7XG4gIGVkaXRvcjogRWRpdG9yXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZVxuICBmcm9tOiBudW1iZXJcbiAgdG86IG51bWJlclxuICBydWxlOiBQYXN0ZVJ1bGVcbiAgcGFzdGVFdmVudDogQ2xpcGJvYXJkRXZlbnRcbiAgZHJvcEV2ZW50OiBEcmFnRXZlbnRcbn0pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGVkaXRvciwgc3RhdGUsIGZyb20sIHRvLCBydWxlLCBwYXN0ZUV2ZW50LCBkcm9wRXZlbnQsXG4gIH0gPSBjb25maWdcblxuICBjb25zdCB7IGNvbW1hbmRzLCBjaGFpbiwgY2FuIH0gPSBuZXcgQ29tbWFuZE1hbmFnZXIoe1xuICAgIGVkaXRvcixcbiAgICBzdGF0ZSxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVyczogKHZvaWQgfCBudWxsKVtdID0gW11cblxuICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrIHx8IG5vZGUudHlwZS5zcGVjLmNvZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcylcbiAgICBjb25zdCByZXNvbHZlZFRvID0gTWF0aC5taW4odG8sIHBvcyArIG5vZGUuY29udGVudC5zaXplKVxuICAgIGNvbnN0IHRleHRUb01hdGNoID0gbm9kZS50ZXh0QmV0d2VlbihyZXNvbHZlZEZyb20gLSBwb3MsIHJlc29sdmVkVG8gLSBwb3MsIHVuZGVmaW5lZCwgJ1xcdWZmZmMnKVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IHBhc3RlUnVsZU1hdGNoZXJIYW5kbGVyKHRleHRUb01hdGNoLCBydWxlLmZpbmQpXG5cbiAgICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgICAgaWYgKG1hdGNoLmluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXJ0ID0gcmVzb2x2ZWRGcm9tICsgbWF0Y2guaW5kZXggKyAxXG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIG1hdGNoWzBdLmxlbmd0aFxuICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgIGZyb206IHN0YXRlLnRyLm1hcHBpbmcubWFwKHN0YXJ0KSxcbiAgICAgICAgdG86IHN0YXRlLnRyLm1hcHBpbmcubWFwKGVuZCksXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBydWxlLmhhbmRsZXIoe1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIG1hdGNoLFxuICAgICAgICBjb21tYW5kcyxcbiAgICAgICAgY2hhaW4sXG4gICAgICAgIGNhbixcbiAgICAgICAgcGFzdGVFdmVudCxcbiAgICAgICAgZHJvcEV2ZW50LFxuICAgICAgfSlcblxuICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgIH0pXG4gIH0pXG5cbiAgY29uc3Qgc3VjY2VzcyA9IGhhbmRsZXJzLmV2ZXJ5KGhhbmRsZXIgPT4gaGFuZGxlciAhPT0gbnVsbClcblxuICByZXR1cm4gc3VjY2Vzc1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBwYXN0ZSBydWxlcyBwbHVnaW4uIFdoZW4gZW5hYmxlZCwgaXQgd2lsbCBjYXVzZSBwYXN0ZWRcbiAqIHRleHQgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcnVsZXMgdG8gdHJpZ2dlciB0aGUgcnVsZeKAmXNcbiAqIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhc3RlUnVsZXNQbHVnaW4ocHJvcHM6IHsgZWRpdG9yOiBFZGl0b3I7IHJ1bGVzOiBQYXN0ZVJ1bGVbXSB9KTogUGx1Z2luW10ge1xuICBjb25zdCB7IGVkaXRvciwgcnVsZXMgfSA9IHByb3BzXG4gIGxldCBkcmFnU291cmNlRWxlbWVudDogRWxlbWVudCB8IG51bGwgPSBudWxsXG4gIGxldCBpc1Bhc3RlZEZyb21Qcm9zZU1pcnJvciA9IGZhbHNlXG4gIGxldCBpc0Ryb3BwZWRGcm9tUHJvc2VNaXJyb3IgPSBmYWxzZVxuICBsZXQgcGFzdGVFdmVudCA9IG5ldyBDbGlwYm9hcmRFdmVudCgncGFzdGUnKVxuICBsZXQgZHJvcEV2ZW50ID0gbmV3IERyYWdFdmVudCgnZHJvcCcpXG5cbiAgY29uc3QgcGx1Z2lucyA9IHJ1bGVzLm1hcChydWxlID0+IHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAgICAvLyB3ZSByZWdpc3RlciBhIGdsb2JhbCBkcmFnIGhhbmRsZXIgdG8gdHJhY2sgdGhlIGN1cnJlbnQgZHJhZyBzb3VyY2UgZWxlbWVudFxuICAgICAgdmlldyh2aWV3KSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZURyYWdzdGFydCA9IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgICAgZHJhZ1NvdXJjZUVsZW1lbnQgPSB2aWV3LmRvbS5wYXJlbnRFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgRWxlbWVudClcbiAgICAgICAgICAgID8gdmlldy5kb20ucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgaGFuZGxlRHJhZ3N0YXJ0KVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBoYW5kbGVEcmFnc3RhcnQpXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgICAgZHJvcDogKHZpZXcsIGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgaXNEcm9wcGVkRnJvbVByb3NlTWlycm9yID0gZHJhZ1NvdXJjZUVsZW1lbnQgPT09IHZpZXcuZG9tLnBhcmVudEVsZW1lbnRcbiAgICAgICAgICAgIGRyb3BFdmVudCA9IGV2ZW50IGFzIERyYWdFdmVudFxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgcGFzdGU6IChfdmlldywgZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gKGV2ZW50IGFzIENsaXBib2FyZEV2ZW50KS5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0L2h0bWwnKVxuXG4gICAgICAgICAgICBwYXN0ZUV2ZW50ID0gZXZlbnQgYXMgQ2xpcGJvYXJkRXZlbnRcblxuICAgICAgICAgICAgaXNQYXN0ZWRGcm9tUHJvc2VNaXJyb3IgPSAhIWh0bWw/LmluY2x1ZGVzKCdkYXRhLXBtLXNsaWNlJylcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFwcGVuZFRyYW5zYWN0aW9uOiAodHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbnNbMF1cbiAgICAgICAgY29uc3QgaXNQYXN0ZSA9IHRyYW5zYWN0aW9uLmdldE1ldGEoJ3VpRXZlbnQnKSA9PT0gJ3Bhc3RlJyAmJiAhaXNQYXN0ZWRGcm9tUHJvc2VNaXJyb3JcbiAgICAgICAgY29uc3QgaXNEcm9wID0gdHJhbnNhY3Rpb24uZ2V0TWV0YSgndWlFdmVudCcpID09PSAnZHJvcCcgJiYgIWlzRHJvcHBlZEZyb21Qcm9zZU1pcnJvclxuXG4gICAgICAgIGlmICghaXNQYXN0ZSAmJiAhaXNEcm9wKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9wIGlmIHRoZXJlIGlzIG5vIGNoYW5nZWQgcmFuZ2VcbiAgICAgICAgY29uc3QgZnJvbSA9IG9sZFN0YXRlLmRvYy5jb250ZW50LmZpbmREaWZmU3RhcnQoc3RhdGUuZG9jLmNvbnRlbnQpXG4gICAgICAgIGNvbnN0IHRvID0gb2xkU3RhdGUuZG9jLmNvbnRlbnQuZmluZERpZmZFbmQoc3RhdGUuZG9jLmNvbnRlbnQpXG5cbiAgICAgICAgaWYgKCFpc051bWJlcihmcm9tKSB8fCAhdG8gfHwgZnJvbSA9PT0gdG8uYikge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYnVpbGQgYSBjaGFpbmFibGUgc3RhdGVcbiAgICAgICAgLy8gc28gd2UgY2FuIHVzZSBhIHNpbmdsZSB0cmFuc2FjdGlvbiBmb3IgYWxsIHBhc3RlIHJ1bGVzXG4gICAgICAgIGNvbnN0IHRyID0gc3RhdGUudHJcbiAgICAgICAgY29uc3QgY2hhaW5hYmxlU3RhdGUgPSBjcmVhdGVDaGFpbmFibGVTdGF0ZSh7XG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgdHJhbnNhY3Rpb246IHRyLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBydW4oe1xuICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICBzdGF0ZTogY2hhaW5hYmxlU3RhdGUsXG4gICAgICAgICAgZnJvbTogTWF0aC5tYXgoZnJvbSAtIDEsIDApLFxuICAgICAgICAgIHRvOiB0by5iIC0gMSxcbiAgICAgICAgICBydWxlLFxuICAgICAgICAgIHBhc3RlRXZlbnQsXG4gICAgICAgICAgZHJvcEV2ZW50LFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIHN0b3AgaWYgdGhlcmUgYXJlIG5vIGNoYW5nZXNcbiAgICAgICAgaWYgKCFoYW5kbGVyIHx8ICF0ci5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRyb3BFdmVudCA9IG5ldyBEcmFnRXZlbnQoJ2Ryb3AnKVxuICAgICAgICBwYXN0ZUV2ZW50ID0gbmV3IENsaXBib2FyZEV2ZW50KCdwYXN0ZScpXG5cbiAgICAgICAgcmV0dXJuIHRyXG4gICAgICB9LFxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIHBsdWdpbnNcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gZmluZER1cGxpY2F0ZXMoaXRlbXM6IGFueVtdKTogYW55W10ge1xuICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoZWwsIGluZGV4KSA9PiBpdGVtcy5pbmRleE9mKGVsKSAhPT0gaW5kZXgpXG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbHRlcmVkKV1cbn1cbiIsICJpbXBvcnQgeyBrZXltYXAgfSBmcm9tICdAdGlwdGFwL3BtL2tleW1hcCdcbmltcG9ydCB7IE5vZGUgYXMgUHJvc2VtaXJyb3JOb2RlLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcbmltcG9ydCB7IERlY29yYXRpb24sIEVkaXRvclZpZXcgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0QXR0cmlidXRlc0Zyb21FeHRlbnNpb25zIH0gZnJvbSAnLi9oZWxwZXJzL2dldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucy5qcydcbmltcG9ydCB7IGdldEV4dGVuc2lvbkZpZWxkIH0gZnJvbSAnLi9oZWxwZXJzL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgZ2V0Tm9kZVR5cGUgfSBmcm9tICcuL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBnZXRSZW5kZXJlZEF0dHJpYnV0ZXMgfSBmcm9tICcuL2hlbHBlcnMvZ2V0UmVuZGVyZWRBdHRyaWJ1dGVzLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQnlSZXNvbHZlZEV4dGVuc2lvbnMgfSBmcm9tICcuL2hlbHBlcnMvZ2V0U2NoZW1hQnlSZXNvbHZlZEV4dGVuc2lvbnMuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFUeXBlQnlOYW1lIH0gZnJvbSAnLi9oZWxwZXJzL2dldFNjaGVtYVR5cGVCeU5hbWUuanMnXG5pbXBvcnQgeyBpc0V4dGVuc2lvblJ1bGVzRW5hYmxlZCB9IGZyb20gJy4vaGVscGVycy9pc0V4dGVuc2lvblJ1bGVzRW5hYmxlZC5qcydcbmltcG9ydCB7IHNwbGl0RXh0ZW5zaW9ucyB9IGZyb20gJy4vaGVscGVycy9zcGxpdEV4dGVuc2lvbnMuanMnXG5pbXBvcnQgeyBNYXJrLCBOb2RlQ29uZmlnIH0gZnJvbSAnLi9pbmRleC5qcydcbmltcG9ydCB7IGlucHV0UnVsZXNQbHVnaW4gfSBmcm9tICcuL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IHBhc3RlUnVsZXNQbHVnaW4gfSBmcm9tICcuL1Bhc3RlUnVsZS5qcydcbmltcG9ydCB7IEFueUNvbmZpZywgRXh0ZW5zaW9ucywgUmF3Q29tbWFuZHMgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi91dGlsaXRpZXMvY2FsbE9yUmV0dXJuLmpzJ1xuaW1wb3J0IHsgZmluZER1cGxpY2F0ZXMgfSBmcm9tICcuL3V0aWxpdGllcy9maW5kRHVwbGljYXRlcy5qcydcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIge1xuICBlZGl0b3I6IEVkaXRvclxuXG4gIHNjaGVtYTogU2NoZW1hXG5cbiAgZXh0ZW5zaW9uczogRXh0ZW5zaW9uc1xuXG4gIHNwbGl0dGFibGVNYXJrczogc3RyaW5nW10gPSBbXVxuXG4gIGNvbnN0cnVjdG9yKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsIGVkaXRvcjogRWRpdG9yKSB7XG4gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3JcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSBFeHRlbnNpb25NYW5hZ2VyLnJlc29sdmUoZXh0ZW5zaW9ucylcbiAgICB0aGlzLnNjaGVtYSA9IGdldFNjaGVtYUJ5UmVzb2x2ZWRFeHRlbnNpb25zKHRoaXMuZXh0ZW5zaW9ucywgZWRpdG9yKVxuXG4gICAgdGhpcy5leHRlbnNpb25zLmZvckVhY2goZXh0ZW5zaW9uID0+IHtcbiAgICAgIC8vIHN0b3JlIGV4dGVuc2lvbiBzdG9yYWdlIGluIGVkaXRvclxuICAgICAgdGhpcy5lZGl0b3IuZXh0ZW5zaW9uU3RvcmFnZVtleHRlbnNpb24ubmFtZV0gPSBleHRlbnNpb24uc3RvcmFnZVxuXG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICB0eXBlOiBnZXRTY2hlbWFUeXBlQnlOYW1lKGV4dGVuc2lvbi5uYW1lLCB0aGlzLnNjaGVtYSksXG4gICAgICB9XG5cbiAgICAgIGlmIChleHRlbnNpb24udHlwZSA9PT0gJ21hcmsnKSB7XG4gICAgICAgIGNvbnN0IGtlZXBPblNwbGl0ID0gY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbiwgJ2tlZXBPblNwbGl0JywgY29udGV4dCkpID8/IHRydWVcblxuICAgICAgICBpZiAoa2VlcE9uU3BsaXQpIHtcbiAgICAgICAgICB0aGlzLnNwbGl0dGFibGVNYXJrcy5wdXNoKGV4dGVuc2lvbi5uYW1lKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uQmVmb3JlQ3JlYXRlID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydvbkJlZm9yZUNyZWF0ZSddPihcbiAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAnb25CZWZvcmVDcmVhdGUnLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKVxuXG4gICAgICBpZiAob25CZWZvcmVDcmVhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JlZm9yZUNyZWF0ZScsIG9uQmVmb3JlQ3JlYXRlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvbkNyZWF0ZSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25DcmVhdGUnXT4oZXh0ZW5zaW9uLCAnb25DcmVhdGUnLCBjb250ZXh0KVxuXG4gICAgICBpZiAob25DcmVhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2NyZWF0ZScsIG9uQ3JlYXRlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvblVwZGF0ZSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25VcGRhdGUnXT4oZXh0ZW5zaW9uLCAnb25VcGRhdGUnLCBjb250ZXh0KVxuXG4gICAgICBpZiAob25VcGRhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ3VwZGF0ZScsIG9uVXBkYXRlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvblNlbGVjdGlvblVwZGF0ZSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25TZWxlY3Rpb25VcGRhdGUnXT4oXG4gICAgICAgIGV4dGVuc2lvbixcbiAgICAgICAgJ29uU2VsZWN0aW9uVXBkYXRlJyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIClcblxuICAgICAgaWYgKG9uU2VsZWN0aW9uVXBkYXRlKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKCdzZWxlY3Rpb25VcGRhdGUnLCBvblNlbGVjdGlvblVwZGF0ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25UcmFuc2FjdGlvbiA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25UcmFuc2FjdGlvbiddPihcbiAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAnb25UcmFuc2FjdGlvbicsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIGlmIChvblRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKCd0cmFuc2FjdGlvbicsIG9uVHJhbnNhY3Rpb24pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uRm9jdXMgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ29uRm9jdXMnXT4oZXh0ZW5zaW9uLCAnb25Gb2N1cycsIGNvbnRleHQpXG5cbiAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKCdmb2N1cycsIG9uRm9jdXMpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uQmx1ciA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25CbHVyJ10+KGV4dGVuc2lvbiwgJ29uQmx1cicsIGNvbnRleHQpXG5cbiAgICAgIGlmIChvbkJsdXIpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JsdXInLCBvbkJsdXIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uRGVzdHJveSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snb25EZXN0cm95J10+KGV4dGVuc2lvbiwgJ29uRGVzdHJveScsIGNvbnRleHQpXG5cbiAgICAgIGlmIChvbkRlc3Ryb3kpIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2Rlc3Ryb3knLCBvbkRlc3Ryb3kpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyByZXNvbHZlKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpOiBFeHRlbnNpb25zIHtcbiAgICBjb25zdCByZXNvbHZlZEV4dGVuc2lvbnMgPSBFeHRlbnNpb25NYW5hZ2VyLnNvcnQoRXh0ZW5zaW9uTWFuYWdlci5mbGF0dGVuKGV4dGVuc2lvbnMpKVxuICAgIGNvbnN0IGR1cGxpY2F0ZWROYW1lcyA9IGZpbmREdXBsaWNhdGVzKHJlc29sdmVkRXh0ZW5zaW9ucy5tYXAoZXh0ZW5zaW9uID0+IGV4dGVuc2lvbi5uYW1lKSlcblxuICAgIGlmIChkdXBsaWNhdGVkTmFtZXMubGVuZ3RoKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbdGlwdGFwIHdhcm5dOiBEdXBsaWNhdGUgZXh0ZW5zaW9uIG5hbWVzIGZvdW5kOiBbJHtkdXBsaWNhdGVkTmFtZXNcbiAgICAgICAgICAubWFwKGl0ZW0gPT4gYCcke2l0ZW19J2ApXG4gICAgICAgICAgLmpvaW4oJywgJyl9XS4gVGhpcyBjYW4gbGVhZCB0byBpc3N1ZXMuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRFeHRlbnNpb25zXG4gIH1cblxuICBzdGF0aWMgZmxhdHRlbihleHRlbnNpb25zOiBFeHRlbnNpb25zKTogRXh0ZW5zaW9ucyB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgLm1hcChleHRlbnNpb24gPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYWRkRXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkRXh0ZW5zaW9ucyddPihcbiAgICAgICAgICAgIGV4dGVuc2lvbixcbiAgICAgICAgICAgICdhZGRFeHRlbnNpb25zJyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKGFkZEV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbZXh0ZW5zaW9uLCAuLi50aGlzLmZsYXR0ZW4oYWRkRXh0ZW5zaW9ucygpKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uXG4gICAgICAgIH0pXG4gICAgICAgIC8vIGBJbmZpbml0eWAgd2lsbCBicmVhayBUeXBlU2NyaXB0IHNvIHdlIHNldCBhIG51bWJlciB0aGF0IGlzIHByb2JhYmx5IGhpZ2ggZW5vdWdoXG4gICAgICAgIC5mbGF0KDEwKVxuICAgIClcbiAgfVxuXG4gIHN0YXRpYyBzb3J0KGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpOiBFeHRlbnNpb25zIHtcbiAgICBjb25zdCBkZWZhdWx0UHJpb3JpdHkgPSAxMDBcblxuICAgIHJldHVybiBleHRlbnNpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IHByaW9yaXR5QSA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1sncHJpb3JpdHknXT4oYSwgJ3ByaW9yaXR5JykgfHwgZGVmYXVsdFByaW9yaXR5XG4gICAgICBjb25zdCBwcmlvcml0eUIgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ3ByaW9yaXR5J10+KGIsICdwcmlvcml0eScpIHx8IGRlZmF1bHRQcmlvcml0eVxuXG4gICAgICBpZiAocHJpb3JpdHlBID4gcHJpb3JpdHlCKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuXG4gICAgICBpZiAocHJpb3JpdHlBIDwgcHJpb3JpdHlCKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwXG4gICAgfSlcbiAgfVxuXG4gIGdldCBjb21tYW5kcygpOiBSYXdDb21tYW5kcyB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5yZWR1Y2UoKGNvbW1hbmRzLCBleHRlbnNpb24pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgIGVkaXRvcjogdGhpcy5lZGl0b3IsXG4gICAgICAgIHR5cGU6IGdldFNjaGVtYVR5cGVCeU5hbWUoZXh0ZW5zaW9uLm5hbWUsIHRoaXMuc2NoZW1hKSxcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWRkQ29tbWFuZHMgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZENvbW1hbmRzJ10+KFxuICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICdhZGRDb21tYW5kcycsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApXG5cbiAgICAgIGlmICghYWRkQ29tbWFuZHMpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbW1hbmRzLFxuICAgICAgICAuLi5hZGRDb21tYW5kcygpLFxuICAgICAgfVxuICAgIH0sIHt9IGFzIFJhd0NvbW1hbmRzKVxuICB9XG5cbiAgZ2V0IHBsdWdpbnMoKTogUGx1Z2luW10ge1xuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzXG5cbiAgICAvLyBXaXRoIFByb3NlTWlycm9yLCBmaXJzdCBwbHVnaW5zIHdpdGhpbiBhbiBhcnJheSBhcmUgZXhlY3V0ZWQgZmlyc3QuXG4gICAgLy8gSW4gVGlwdGFwLCB3ZSBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIG92ZXJyaWRlIHBsdWdpbnMsXG4gICAgLy8gc28gaXQgZmVlbHMgbW9yZSBuYXR1cmFsIHRvIHJ1biBwbHVnaW5zIGF0IHRoZSBlbmQgb2YgYW4gYXJyYXkgZmlyc3QuXG4gICAgLy8gVGhhdOKAmXMgd2h5IHdlIGhhdmUgdG8gcmV2ZXJzZSB0aGUgYGV4dGVuc2lvbnNgIGFycmF5IGFuZCBzb3J0IGFnYWluXG4gICAgLy8gYmFzZWQgb24gdGhlIGBwcmlvcml0eWAgb3B0aW9uLlxuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBFeHRlbnNpb25NYW5hZ2VyLnNvcnQoWy4uLnRoaXMuZXh0ZW5zaW9uc10ucmV2ZXJzZSgpKVxuXG4gICAgY29uc3QgaW5wdXRSdWxlczogYW55W10gPSBbXVxuICAgIGNvbnN0IHBhc3RlUnVsZXM6IGFueVtdID0gW11cblxuICAgIGNvbnN0IGFsbFBsdWdpbnMgPSBleHRlbnNpb25zXG4gICAgICAubWFwKGV4dGVuc2lvbiA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgIHR5cGU6IGdldFNjaGVtYVR5cGVCeU5hbWUoZXh0ZW5zaW9uLm5hbWUsIHRoaXMuc2NoZW1hKSxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW11cblxuICAgICAgICBjb25zdCBhZGRLZXlib2FyZFNob3J0Y3V0cyA9IGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkS2V5Ym9hcmRTaG9ydGN1dHMnXT4oXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICdhZGRLZXlib2FyZFNob3J0Y3V0cycsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKVxuXG4gICAgICAgIGxldCBkZWZhdWx0QmluZGluZ3M6IFJlY29yZDxzdHJpbmcsICgpID0+IGJvb2xlYW4+ID0ge31cblxuICAgICAgICAvLyBiaW5kIGV4aXQgaGFuZGxpbmdcbiAgICAgICAgaWYgKGV4dGVuc2lvbi50eXBlID09PSAnbWFyaycgJiYgZXh0ZW5zaW9uLmNvbmZpZy5leGl0YWJsZSkge1xuICAgICAgICAgIGRlZmF1bHRCaW5kaW5ncy5BcnJvd1JpZ2h0ID0gKCkgPT4gTWFyay5oYW5kbGVFeGl0KHsgZWRpdG9yLCBtYXJrOiBleHRlbnNpb24gYXMgTWFyayB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkZEtleWJvYXJkU2hvcnRjdXRzKSB7XG4gICAgICAgICAgY29uc3QgYmluZGluZ3MgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhhZGRLZXlib2FyZFNob3J0Y3V0cygpKS5tYXAoKFtzaG9ydGN1dCwgbWV0aG9kXSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3Nob3J0Y3V0LCAoKSA9PiBtZXRob2QoeyBlZGl0b3IgfSldXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBkZWZhdWx0QmluZGluZ3MgPSB7IC4uLmRlZmF1bHRCaW5kaW5ncywgLi4uYmluZGluZ3MgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TWFwUGx1Z2luID0ga2V5bWFwKGRlZmF1bHRCaW5kaW5ncylcblxuICAgICAgICBwbHVnaW5zLnB1c2goa2V5TWFwUGx1Z2luKVxuXG4gICAgICAgIGNvbnN0IGFkZElucHV0UnVsZXMgPSBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZElucHV0UnVsZXMnXT4oXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICdhZGRJbnB1dFJ1bGVzJyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGlzRXh0ZW5zaW9uUnVsZXNFbmFibGVkKGV4dGVuc2lvbiwgZWRpdG9yLm9wdGlvbnMuZW5hYmxlSW5wdXRSdWxlcykgJiYgYWRkSW5wdXRSdWxlcykge1xuICAgICAgICAgIGlucHV0UnVsZXMucHVzaCguLi5hZGRJbnB1dFJ1bGVzKCkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRQYXN0ZVJ1bGVzID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRQYXN0ZVJ1bGVzJ10+KFxuICAgICAgICAgIGV4dGVuc2lvbixcbiAgICAgICAgICAnYWRkUGFzdGVSdWxlcycsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChpc0V4dGVuc2lvblJ1bGVzRW5hYmxlZChleHRlbnNpb24sIGVkaXRvci5vcHRpb25zLmVuYWJsZVBhc3RlUnVsZXMpICYmIGFkZFBhc3RlUnVsZXMpIHtcbiAgICAgICAgICBwYXN0ZVJ1bGVzLnB1c2goLi4uYWRkUGFzdGVSdWxlcygpKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkUHJvc2VNaXJyb3JQbHVnaW5zID0gZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRQcm9zZU1pcnJvclBsdWdpbnMnXT4oXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICdhZGRQcm9zZU1pcnJvclBsdWdpbnMnLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoYWRkUHJvc2VNaXJyb3JQbHVnaW5zKSB7XG4gICAgICAgICAgY29uc3QgcHJvc2VNaXJyb3JQbHVnaW5zID0gYWRkUHJvc2VNaXJyb3JQbHVnaW5zKClcblxuICAgICAgICAgIHBsdWdpbnMucHVzaCguLi5wcm9zZU1pcnJvclBsdWdpbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGx1Z2luc1xuICAgICAgfSlcbiAgICAgIC5mbGF0KClcblxuICAgIHJldHVybiBbXG4gICAgICBpbnB1dFJ1bGVzUGx1Z2luKHtcbiAgICAgICAgZWRpdG9yLFxuICAgICAgICBydWxlczogaW5wdXRSdWxlcyxcbiAgICAgIH0pLFxuICAgICAgLi4ucGFzdGVSdWxlc1BsdWdpbih7XG4gICAgICAgIGVkaXRvcixcbiAgICAgICAgcnVsZXM6IHBhc3RlUnVsZXMsXG4gICAgICB9KSxcbiAgICAgIC4uLmFsbFBsdWdpbnMsXG4gICAgXVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIGdldEF0dHJpYnV0ZXNGcm9tRXh0ZW5zaW9ucyh0aGlzLmV4dGVuc2lvbnMpXG4gIH1cblxuICBnZXQgbm9kZVZpZXdzKCkge1xuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzXG4gICAgY29uc3QgeyBub2RlRXh0ZW5zaW9ucyB9ID0gc3BsaXRFeHRlbnNpb25zKHRoaXMuZXh0ZW5zaW9ucylcblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBub2RlRXh0ZW5zaW9uc1xuICAgICAgICAuZmlsdGVyKGV4dGVuc2lvbiA9PiAhIWdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbiwgJ2FkZE5vZGVWaWV3JykpXG4gICAgICAgIC5tYXAoZXh0ZW5zaW9uID0+IHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLmZpbHRlcihcbiAgICAgICAgICAgIGF0dHJpYnV0ZSA9PiBhdHRyaWJ1dGUudHlwZSA9PT0gZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICB0eXBlOiBnZXROb2RlVHlwZShleHRlbnNpb24ubmFtZSwgdGhpcy5zY2hlbWEpLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGROb2RlVmlldyA9IGdldEV4dGVuc2lvbkZpZWxkPE5vZGVDb25maWdbJ2FkZE5vZGVWaWV3J10+KFxuICAgICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgICAgJ2FkZE5vZGVWaWV3JyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKCFhZGROb2RlVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgbm9kZXZpZXcgPSAoXG4gICAgICAgICAgICBub2RlOiBQcm9zZW1pcnJvck5vZGUsXG4gICAgICAgICAgICB2aWV3OiBFZGl0b3JWaWV3LFxuICAgICAgICAgICAgZ2V0UG9zOiAoKCkgPT4gbnVtYmVyKSB8IGJvb2xlYW4sXG4gICAgICAgICAgICBkZWNvcmF0aW9uczogRGVjb3JhdGlvbltdLFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgY29uc3QgSFRNTEF0dHJpYnV0ZXMgPSBnZXRSZW5kZXJlZEF0dHJpYnV0ZXMobm9kZSwgZXh0ZW5zaW9uQXR0cmlidXRlcylcblxuICAgICAgICAgICAgcmV0dXJuIGFkZE5vZGVWaWV3KCkoe1xuICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIGdldFBvcyxcbiAgICAgICAgICAgICAgZGVjb3JhdGlvbnMsXG4gICAgICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICBleHRlbnNpb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbZXh0ZW5zaW9uLm5hbWUsIG5vZGV2aWV3XVxuICAgICAgICB9KSxcbiAgICApXG4gIH1cbn1cbiIsICIvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZXNxdWVlYi9pcy13aGF0L2Jsb2IvODhkNmU0Y2E5MmZiMmJhYWI2MDAzYzU0ZTAyZWVkZjRlNzI5ZTVhYi9zcmMvaW5kZXgudHNcblxuZnVuY3Rpb24gZ2V0VHlwZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnT2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZVxufVxuIiwgImltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICcuL2lzUGxhaW5PYmplY3QuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3Qgb3V0cHV0ID0geyAuLi50YXJnZXQgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRhcmdldCkpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgeyBba2V5XTogc291cmNlW2tleV0gfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXRba2V5XSA9IG1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQuanMnXG5pbXBvcnQgeyBFeHRlbnNpb25Db25maWcgfSBmcm9tICcuL2luZGV4LmpzJ1xuaW1wb3J0IHsgSW5wdXRSdWxlIH0gZnJvbSAnLi9JbnB1dFJ1bGUuanMnXG5pbXBvcnQgeyBNYXJrIH0gZnJvbSAnLi9NYXJrLmpzJ1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4vTm9kZS5qcydcbmltcG9ydCB7IFBhc3RlUnVsZSB9IGZyb20gJy4vUGFzdGVSdWxlLmpzJ1xuaW1wb3J0IHtcbiAgQW55Q29uZmlnLFxuICBFeHRlbnNpb25zLFxuICBHbG9iYWxBdHRyaWJ1dGVzLFxuICBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZCxcbiAgUGFyZW50Q29uZmlnLFxuICBSYXdDb21tYW5kcyxcbn0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gJy4vdXRpbGl0aWVzL21lcmdlRGVlcC5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgRXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMgPSBhbnksIFN0b3JhZ2UgPSBhbnk+IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAgIC8qKlxuICAgICAqIE5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIFByaW9yaXR5XG4gICAgICovXG4gICAgcHJpb3JpdHk/OiBudW1iZXJcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgb3B0aW9uc1xuICAgICAqL1xuICAgIGRlZmF1bHRPcHRpb25zPzogT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBPcHRpb25zXG4gICAgICovXG4gICAgYWRkT3B0aW9ucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkT3B0aW9ucyddLCB1bmRlZmluZWQ+XG4gICAgfSkgPT4gT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBTdG9yYWdlXG4gICAgICovXG4gICAgYWRkU3RvcmFnZT86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkU3RvcmFnZSddLCB1bmRlZmluZWQ+XG4gICAgfSkgPT4gU3RvcmFnZVxuXG4gICAgLyoqXG4gICAgICogR2xvYmFsIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRHbG9iYWxBdHRyaWJ1dGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkR2xvYmFsQXR0cmlidXRlcyddXG4gICAgfSkgPT4gR2xvYmFsQXR0cmlidXRlcyB8IHt9XG5cbiAgICAvKipcbiAgICAgKiBSYXdcbiAgICAgKi9cbiAgICBhZGRDb21tYW5kcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRDb21tYW5kcyddXG4gICAgfSkgPT4gUGFydGlhbDxSYXdDb21tYW5kcz5cblxuICAgIC8qKlxuICAgICAqIEtleWJvYXJkIHNob3J0Y3V0c1xuICAgICAqL1xuICAgIGFkZEtleWJvYXJkU2hvcnRjdXRzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEtleWJvYXJkU2hvcnRjdXRzJ11cbiAgICB9KSA9PiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElucHV0IHJ1bGVzXG4gICAgICovXG4gICAgYWRkSW5wdXRSdWxlcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRJbnB1dFJ1bGVzJ11cbiAgICB9KSA9PiBJbnB1dFJ1bGVbXVxuXG4gICAgLyoqXG4gICAgICogUGFzdGUgcnVsZXNcbiAgICAgKi9cbiAgICBhZGRQYXN0ZVJ1bGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFBhc3RlUnVsZXMnXVxuICAgIH0pID0+IFBhc3RlUnVsZVtdXG5cbiAgICAvKipcbiAgICAgKiBQcm9zZU1pcnJvciBwbHVnaW5zXG4gICAgICovXG4gICAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFByb3NlTWlycm9yUGx1Z2lucyddXG4gICAgfSkgPT4gUGx1Z2luW11cblxuICAgIC8qKlxuICAgICAqIEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBhZGRFeHRlbnNpb25zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkRXh0ZW5zaW9ucyddXG4gICAgfSkgPT4gRXh0ZW5zaW9uc1xuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIE5vZGUgU2NoZW1hXG4gICAgICovXG4gICAgZXh0ZW5kTm9kZVNjaGVtYT86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydleHRlbmROb2RlU2NoZW1hJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4dGVuc2lvbjogTm9kZSxcbiAgICAgICAgKSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgTWFyayBTY2hlbWFcbiAgICAgKi9cbiAgICBleHRlbmRNYXJrU2NoZW1hPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4dGVuZE1hcmtTY2hlbWEnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBNYXJrLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgbm90IHJlYWR5IHlldC5cbiAgICAgKi9cbiAgICBvbkJlZm9yZUNyZWF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkJlZm9yZUNyZWF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgcmVhZHkuXG4gICAgICovXG4gICAgb25DcmVhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25DcmVhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBvblVwZGF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvblVwZGF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICovXG4gICAgb25TZWxlY3Rpb25VcGRhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25TZWxlY3Rpb25VcGRhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uVHJhbnNhY3Rpb24/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uVHJhbnNhY3Rpb24nXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBmb2N1c2VkLlxuICAgICAqL1xuICAgIG9uRm9jdXM/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRm9jdXMnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGV2ZW50OiBGb2N1c0V2ZW50XG4gICAgICAgICAgfSxcbiAgICAgICAgKSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGlzbuKAmXQgZm9jdXNlZCBhbnltb3JlLlxuICAgICAqL1xuICAgIG9uQmx1cj86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8RXh0ZW5zaW9uQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25CbHVyJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgb25EZXN0cm95PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPEV4dGVuc2lvbkNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRGVzdHJveSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uPE9wdGlvbnMgPSBhbnksIFN0b3JhZ2UgPSBhbnk+IHtcbiAgdHlwZSA9ICdleHRlbnNpb24nXG5cbiAgbmFtZSA9ICdleHRlbnNpb24nXG5cbiAgcGFyZW50OiBFeHRlbnNpb24gfCBudWxsID0gbnVsbFxuXG4gIGNoaWxkOiBFeHRlbnNpb24gfCBudWxsID0gbnVsbFxuXG4gIG9wdGlvbnM6IE9wdGlvbnNcblxuICBzdG9yYWdlOiBTdG9yYWdlXG5cbiAgY29uZmlnOiBFeHRlbnNpb25Db25maWcgPSB7XG4gICAgbmFtZTogdGhpcy5uYW1lLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxFeHRlbnNpb25Db25maWc8T3B0aW9ucywgU3RvcmFnZT4+ID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgLi4uY29uZmlnLFxuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uZmlnLm5hbWVcblxuICAgIGlmIChjb25maWcuZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt0aXB0YXAgd2Fybl06IEJSRUFLSU5HIENIQU5HRTogXCJkZWZhdWx0T3B0aW9uc1wiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJhZGRPcHRpb25zXCIgaW5zdGVhZC4gRm91bmQgaW4gZXh0ZW5zaW9uOiBcIiR7dGhpcy5uYW1lfVwiLmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVtb3ZlIGBhZGRPcHRpb25zYCBmYWxsYmFja1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuY29uZmlnLmRlZmF1bHRPcHRpb25zXG5cbiAgICBpZiAodGhpcy5jb25maWcuYWRkT3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0gY2FsbE9yUmV0dXJuKFxuICAgICAgICBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZE9wdGlvbnMnXT4odGhpcywgJ2FkZE9wdGlvbnMnLCB7XG4gICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JhZ2UgPSBjYWxsT3JSZXR1cm4oXG4gICAgICBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZFN0b3JhZ2UnXT4odGhpcywgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgfSksXG4gICAgKSB8fCB7fVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZTxPID0gYW55LCBTID0gYW55Pihjb25maWc6IFBhcnRpYWw8RXh0ZW5zaW9uQ29uZmlnPE8sIFM+PiA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlbnNpb248TywgUz4oY29uZmlnKVxuICB9XG5cbiAgY29uZmlndXJlKG9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7fSkge1xuICAgIC8vIHJldHVybiBhIG5ldyBpbnN0YW5jZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGV4dGVuc2lvblxuICAgIC8vIHdpdGggZGlmZmVyZW50IGNhbGxzIG9mIGBjb25maWd1cmVgXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5leHRlbmQoKVxuXG4gICAgZXh0ZW5zaW9uLm9wdGlvbnMgPSBtZXJnZURlZXAodGhpcy5vcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnMpIGFzIE9wdGlvbnNcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxuXG4gIGV4dGVuZDxFeHRlbmRlZE9wdGlvbnMgPSBPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2UgPSBTdG9yYWdlPihcbiAgICBleHRlbmRlZENvbmZpZzogUGFydGlhbDxFeHRlbnNpb25Db25maWc8RXh0ZW5kZWRPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2U+PiA9IHt9LFxuICApIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uPEV4dGVuZGVkT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlPihleHRlbmRlZENvbmZpZylcblxuICAgIGV4dGVuc2lvbi5wYXJlbnQgPSB0aGlzXG5cbiAgICB0aGlzLmNoaWxkID0gZXh0ZW5zaW9uXG5cbiAgICBleHRlbnNpb24ubmFtZSA9IGV4dGVuZGVkQ29uZmlnLm5hbWUgPyBleHRlbmRlZENvbmZpZy5uYW1lIDogZXh0ZW5zaW9uLnBhcmVudC5uYW1lXG5cbiAgICBpZiAoZXh0ZW5kZWRDb25maWcuZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt0aXB0YXAgd2Fybl06IEJSRUFLSU5HIENIQU5HRTogXCJkZWZhdWx0T3B0aW9uc1wiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJhZGRPcHRpb25zXCIgaW5zdGVhZC4gRm91bmQgaW4gZXh0ZW5zaW9uOiBcIiR7ZXh0ZW5zaW9uLm5hbWV9XCIuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBleHRlbnNpb24ub3B0aW9ucyA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkT3B0aW9ucyddPihleHRlbnNpb24sICdhZGRPcHRpb25zJywge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgUmFuZ2UsIFRleHRTZXJpYWxpemVyIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0QmV0d2VlbihcbiAgc3RhcnROb2RlOiBQcm9zZU1pcnJvck5vZGUsXG4gIHJhbmdlOiBSYW5nZSxcbiAgb3B0aW9ucz86IHtcbiAgICBibG9ja1NlcGFyYXRvcj86IHN0cmluZ1xuICAgIHRleHRTZXJpYWxpemVycz86IFJlY29yZDxzdHJpbmcsIFRleHRTZXJpYWxpemVyPlxuICB9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgeyBmcm9tLCB0byB9ID0gcmFuZ2VcbiAgY29uc3QgeyBibG9ja1NlcGFyYXRvciA9ICdcXG5cXG4nLCB0ZXh0U2VyaWFsaXplcnMgPSB7fSB9ID0gb3B0aW9ucyB8fCB7fVxuICBsZXQgdGV4dCA9ICcnXG4gIGxldCBzZXBhcmF0ZWQgPSB0cnVlXG5cbiAgc3RhcnROb2RlLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcywgcGFyZW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHRleHRTZXJpYWxpemVyID0gdGV4dFNlcmlhbGl6ZXJzPy5bbm9kZS50eXBlLm5hbWVdXG5cbiAgICBpZiAodGV4dFNlcmlhbGl6ZXIpIHtcbiAgICAgIGlmIChub2RlLmlzQmxvY2sgJiYgIXNlcGFyYXRlZCkge1xuICAgICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yXG4gICAgICAgIHNlcGFyYXRlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICB0ZXh0ICs9IHRleHRTZXJpYWxpemVyKHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHBvcyxcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgcmFuZ2UsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLmlzVGV4dCkge1xuICAgICAgdGV4dCArPSBub2RlPy50ZXh0Py5zbGljZShNYXRoLm1heChmcm9tLCBwb3MpIC0gcG9zLCB0byAtIHBvcykgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgc2VwYXJhdGVkID0gZmFsc2VcbiAgICB9IGVsc2UgaWYgKG5vZGUuaXNCbG9jayAmJiAhc2VwYXJhdGVkKSB7XG4gICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yXG4gICAgICBzZXBhcmF0ZWQgPSB0cnVlXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB0ZXh0XG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgVGV4dFNlcmlhbGl6ZXIgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEoc2NoZW1hOiBTY2hlbWEpOiBSZWNvcmQ8c3RyaW5nLCBUZXh0U2VyaWFsaXplcj4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5ub2RlcylcbiAgICAgIC5maWx0ZXIoKFssIG5vZGVdKSA9PiBub2RlLnNwZWMudG9UZXh0KVxuICAgICAgLm1hcCgoW25hbWUsIG5vZGVdKSA9PiBbbmFtZSwgbm9kZS5zcGVjLnRvVGV4dF0pLFxuICApXG59XG4iLCAiaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9FeHRlbnNpb24uanMnXG5pbXBvcnQgeyBnZXRUZXh0QmV0d2VlbiB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0VGV4dEJldHdlZW4uanMnXG5pbXBvcnQgeyBnZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hIH0gZnJvbSAnLi4vaGVscGVycy9nZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hLmpzJ1xuXG5leHBvcnQgY29uc3QgQ2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXIgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2NsaXBib2FyZFRleHRTZXJpYWxpemVyJyxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICBrZXk6IG5ldyBQbHVnaW5LZXkoJ2NsaXBib2FyZFRleHRTZXJpYWxpemVyJyksXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgY2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXI6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzXG4gICAgICAgICAgICBjb25zdCB7IHN0YXRlLCBzY2hlbWEgfSA9IGVkaXRvclxuICAgICAgICAgICAgY29uc3QgeyBkb2MsIHNlbGVjdGlvbiB9ID0gc3RhdGVcbiAgICAgICAgICAgIGNvbnN0IHsgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1pbiguLi5yYW5nZXMubWFwKHJhbmdlID0+IHJhbmdlLiRmcm9tLnBvcykpXG4gICAgICAgICAgICBjb25zdCB0byA9IE1hdGgubWF4KC4uLnJhbmdlcy5tYXAocmFuZ2UgPT4gcmFuZ2UuJHRvLnBvcykpXG4gICAgICAgICAgICBjb25zdCB0ZXh0U2VyaWFsaXplcnMgPSBnZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hKHNjaGVtYSlcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0geyBmcm9tLCB0byB9XG5cbiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0QmV0d2Vlbihkb2MsIHJhbmdlLCB7XG4gICAgICAgICAgICAgIHRleHRTZXJpYWxpemVycyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJsdXI6IHtcbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBlZGl0b3IuXG4gICAgICAgKi9cbiAgICAgIGJsdXI6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibHVyOiBSYXdDb21tYW5kc1snYmx1ciddID0gKCkgPT4gKHsgZWRpdG9yLCB2aWV3IH0pID0+IHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICBpZiAoIWVkaXRvci5pc0Rlc3Ryb3llZCkge1xuICAgICAgKHZpZXcuZG9tIGFzIEhUTUxFbGVtZW50KS5ibHVyKClcblxuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIHJlbW92ZSB0aGUgY2FyZXQgb24gYmx1ciBidXQgc2FmYXJpIGRvZXMgbm90LlxuICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdWViZXJkb3Npcy90aXB0YXAvaXNzdWVzLzI0MDVcbiAgICAgIHdpbmRvdz8uZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGNsZWFyQ29udGVudDoge1xuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciB0aGUgd2hvbGUgZG9jdW1lbnQuXG4gICAgICAgKi9cbiAgICAgIGNsZWFyQ29udGVudDogKGVtaXRVcGRhdGU/OiBib29sZWFuKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJDb250ZW50OiBSYXdDb21tYW5kc1snY2xlYXJDb250ZW50J10gPSAoZW1pdFVwZGF0ZSA9IGZhbHNlKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gIHJldHVybiBjb21tYW5kcy5zZXRDb250ZW50KCcnLCBlbWl0VXBkYXRlKVxufVxuIiwgImltcG9ydCB7IGxpZnRUYXJnZXQgfSBmcm9tICdAdGlwdGFwL3BtL3RyYW5zZm9ybSdcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGNsZWFyTm9kZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogTm9ybWFsaXplIG5vZGVzIHRvIGEgc2ltcGxlIHBhcmFncmFwaC5cbiAgICAgICAqL1xuICAgICAgY2xlYXJOb2RlczogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFyTm9kZXM6IFJhd0NvbW1hbmRzWydjbGVhck5vZGVzJ10gPSAoKSA9PiAoeyBzdGF0ZSwgdHIsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHRyXG4gIGNvbnN0IHsgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICBpZiAoIWRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJhbmdlcy5mb3JFYWNoKCh7ICRmcm9tLCAkdG8gfSkgPT4ge1xuICAgIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oJGZyb20ucG9zLCAkdG8ucG9zLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICBpZiAobm9kZS50eXBlLmlzVGV4dCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkb2MsIG1hcHBpbmcgfSA9IHRyXG4gICAgICBjb25zdCAkbWFwcGVkRnJvbSA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHBvcykpXG4gICAgICBjb25zdCAkbWFwcGVkVG8gPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcChwb3MgKyBub2RlLm5vZGVTaXplKSlcbiAgICAgIGNvbnN0IG5vZGVSYW5nZSA9ICRtYXBwZWRGcm9tLmJsb2NrUmFuZ2UoJG1hcHBlZFRvKVxuXG4gICAgICBpZiAoIW5vZGVSYW5nZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0TGlmdERlcHRoID0gbGlmdFRhcmdldChub2RlUmFuZ2UpXG5cbiAgICAgIGlmIChub2RlLnR5cGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0VHlwZSB9ID0gJG1hcHBlZEZyb20ucGFyZW50LmNvbnRlbnRNYXRjaEF0KCRtYXBwZWRGcm9tLmluZGV4KCkpXG5cbiAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cChub2RlUmFuZ2Uuc3RhcnQsIGRlZmF1bHRUeXBlKVxuICAgICAgfVxuXG4gICAgICBpZiAodGFyZ2V0TGlmdERlcHRoIHx8IHRhcmdldExpZnREZXB0aCA9PT0gMCkge1xuICAgICAgICB0ci5saWZ0KG5vZGVSYW5nZSwgdGFyZ2V0TGlmdERlcHRoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBDb21tYW5kLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgY29tbWFuZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWZpbmUgYSBjb21tYW5kIGlubGluZS5cbiAgICAgICAqL1xuICAgICAgY29tbWFuZDogKGZuOiAocHJvcHM6IFBhcmFtZXRlcnM8Q29tbWFuZD5bMF0pID0+IGJvb2xlYW4pID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjb21tYW5kOiBSYXdDb21tYW5kc1snY29tbWFuZCddID0gZm4gPT4gcHJvcHMgPT4ge1xuICByZXR1cm4gZm4ocHJvcHMpXG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlUGFyYWdyYXBoTmVhciBhcyBvcmlnaW5hbENyZWF0ZVBhcmFncmFwaE5lYXIgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgY3JlYXRlUGFyYWdyYXBoTmVhcjoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGUgYSBwYXJhZ3JhcGggbmVhcmJ5LlxuICAgICAgICovXG4gICAgICBjcmVhdGVQYXJhZ3JhcGhOZWFyOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXJhZ3JhcGhOZWFyOiBSYXdDb21tYW5kc1snY3JlYXRlUGFyYWdyYXBoTmVhciddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsQ3JlYXRlUGFyYWdyYXBoTmVhcihzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBjdXQ6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3V0cyBjb250ZW50IGZyb20gYSByYW5nZSBhbmQgaW5zZXJ0cyBpdCBhdCBhIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgICovXG4gICAgICBjdXQ6ICh7IGZyb20sIHRvIH06IHsgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyIH0sIHRhcmdldFBvczogbnVtYmVyKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY3V0OiBSYXdDb21tYW5kc1snY3V0J10gPSAob3JpZ2luUmFuZ2UsIHRhcmdldFBvcykgPT4gKHsgZWRpdG9yLCB0ciB9KSA9PiB7XG4gIGNvbnN0IHsgc3RhdGUgfSA9IGVkaXRvclxuXG4gIGNvbnN0IGNvbnRlbnRTbGljZSA9IHN0YXRlLmRvYy5zbGljZShvcmlnaW5SYW5nZS5mcm9tLCBvcmlnaW5SYW5nZS50bylcblxuICB0ci5kZWxldGVSYW5nZShvcmlnaW5SYW5nZS5mcm9tLCBvcmlnaW5SYW5nZS50bylcbiAgY29uc3QgbmV3UG9zID0gdHIubWFwcGluZy5tYXAodGFyZ2V0UG9zKVxuXG4gIHRyLmluc2VydChuZXdQb3MsIGNvbnRlbnRTbGljZS5jb250ZW50KVxuXG4gIHRyLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbih0ci5kb2MucmVzb2x2ZShuZXdQb3MgLSAxKSkpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZGVsZXRlQ3VycmVudE5vZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlIHRoZSBub2RlIHRoYXQgY3VycmVudGx5IGhhcyB0aGUgc2VsZWN0aW9uIGFuY2hvci5cbiAgICAgICAqL1xuICAgICAgZGVsZXRlQ3VycmVudE5vZGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVDdXJyZW50Tm9kZTogUmF3Q29tbWFuZHNbJ2RlbGV0ZUN1cnJlbnROb2RlJ10gPSAoKSA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJcbiAgY29uc3QgY3VycmVudE5vZGUgPSBzZWxlY3Rpb24uJGFuY2hvci5ub2RlKClcblxuICAvLyBpZiB0aGVyZSBpcyBjb250ZW50IGluc2lkZSB0aGUgY3VycmVudCBub2RlLCBicmVhayBvdXQgb2YgdGhpcyBjb21tYW5kXG4gIGlmIChjdXJyZW50Tm9kZS5jb250ZW50LnNpemUgPiAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCAkcG9zID0gdHIuc2VsZWN0aW9uLiRhbmNob3JcblxuICBmb3IgKGxldCBkZXB0aCA9ICRwb3MuZGVwdGg7IGRlcHRoID4gMDsgZGVwdGggLT0gMSkge1xuICAgIGNvbnN0IG5vZGUgPSAkcG9zLm5vZGUoZGVwdGgpXG5cbiAgICBpZiAobm9kZS50eXBlID09PSBjdXJyZW50Tm9kZS50eXBlKSB7XG4gICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgY29uc3QgZnJvbSA9ICRwb3MuYmVmb3JlKGRlcHRoKVxuICAgICAgICBjb25zdCB0byA9ICRwb3MuYWZ0ZXIoZGVwdGgpXG5cbiAgICAgICAgdHIuZGVsZXRlKGZyb20sIHRvKS5zY3JvbGxJbnRvVmlldygpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZGVsZXRlTm9kZToge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGUgYSBub2RlLlxuICAgICAgICovXG4gICAgICBkZWxldGVOb2RlOiAodHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVOb2RlOiBSYXdDb21tYW5kc1snZGVsZXRlTm9kZSddID0gdHlwZU9yTmFtZSA9PiAoeyB0ciwgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgJHBvcyA9IHRyLnNlbGVjdGlvbi4kYW5jaG9yXG5cbiAgZm9yIChsZXQgZGVwdGggPSAkcG9zLmRlcHRoOyBkZXB0aCA+IDA7IGRlcHRoIC09IDEpIHtcbiAgICBjb25zdCBub2RlID0gJHBvcy5ub2RlKGRlcHRoKVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gdHlwZSkge1xuICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGNvbnN0IGZyb20gPSAkcG9zLmJlZm9yZShkZXB0aClcbiAgICAgICAgY29uc3QgdG8gPSAkcG9zLmFmdGVyKGRlcHRoKVxuXG4gICAgICAgIHRyLmRlbGV0ZShmcm9tLCB0bykuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IFJhbmdlLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZGVsZXRlUmFuZ2U6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlIGEgZ2l2ZW4gcmFuZ2UuXG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZVJhbmdlOiAocmFuZ2U6IFJhbmdlKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVsZXRlUmFuZ2U6IFJhd0NvbW1hbmRzWydkZWxldGVSYW5nZSddID0gcmFuZ2UgPT4gKHsgdHIsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgeyBmcm9tLCB0byB9ID0gcmFuZ2VcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICB0ci5kZWxldGUoZnJvbSwgdG8pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IGRlbGV0ZVNlbGVjdGlvbiBhcyBvcmlnaW5hbERlbGV0ZVNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBkZWxldGVTZWxlY3Rpb246IHtcbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlIHRoZSBzZWxlY3Rpb24sIGlmIHRoZXJlIGlzIG9uZS5cbiAgICAgICAqL1xuICAgICAgZGVsZXRlU2VsZWN0aW9uOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWxldGVTZWxlY3Rpb246IFJhd0NvbW1hbmRzWydkZWxldGVTZWxlY3Rpb24nXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbERlbGV0ZVNlbGVjdGlvbihzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGVudGVyOiB7XG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgZW50ZXIuXG4gICAgICAgKi9cbiAgICAgIGVudGVyOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZW50ZXI6IFJhd0NvbW1hbmRzWydlbnRlciddID0gKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICByZXR1cm4gY29tbWFuZHMua2V5Ym9hcmRTaG9ydGN1dCgnRW50ZXInKVxufVxuIiwgImltcG9ydCB7IGV4aXRDb2RlIGFzIG9yaWdpbmFsRXhpdENvZGUgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZXhpdENvZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogRXhpdCBmcm9tIGEgY29kZSBibG9jay5cbiAgICAgICAqL1xuICAgICAgZXhpdENvZGU6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGV4aXRDb2RlOiBSYXdDb21tYW5kc1snZXhpdENvZGUnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbEV4aXRDb2RlKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgeyBpc1JlZ0V4cCB9IGZyb20gJy4vaXNSZWdFeHAuanMnXG5cbi8qKlxuICogQ2hlY2sgaWYgb2JqZWN0MSBpbmNsdWRlcyBvYmplY3QyXG4gKiBAcGFyYW0gb2JqZWN0MSBPYmplY3RcbiAqIEBwYXJhbSBvYmplY3QyIE9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0SW5jbHVkZXMoXG4gIG9iamVjdDE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9iamVjdDI6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG9wdGlvbnM6IHsgc3RyaWN0OiBib29sZWFuIH0gPSB7IHN0cmljdDogdHJ1ZSB9LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QyKVxuXG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoa2V5ID0+IHtcbiAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QyW2tleV0gPT09IG9iamVjdDFba2V5XVxuICAgIH1cblxuICAgIGlmIChpc1JlZ0V4cChvYmplY3QyW2tleV0pKSB7XG4gICAgICByZXR1cm4gb2JqZWN0MltrZXldLnRlc3Qob2JqZWN0MVtrZXldKVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3QyW2tleV0gPT09IG9iamVjdDFba2V5XVxuICB9KVxufVxuIiwgImltcG9ydCB7IE1hcmsgYXMgUHJvc2VNaXJyb3JNYXJrLCBNYXJrVHlwZSwgUmVzb2x2ZWRQb3MgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgb2JqZWN0SW5jbHVkZXMgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JqZWN0SW5jbHVkZXMuanMnXG5cbmZ1bmN0aW9uIGZpbmRNYXJrSW5TZXQoXG4gIG1hcmtzOiBQcm9zZU1pcnJvck1hcmtbXSxcbiAgdHlwZTogTWFya1R5cGUsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IFByb3NlTWlycm9yTWFyayB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBtYXJrcy5maW5kKGl0ZW0gPT4ge1xuICAgIHJldHVybiBpdGVtLnR5cGUgPT09IHR5cGUgJiYgb2JqZWN0SW5jbHVkZXMoaXRlbS5hdHRycywgYXR0cmlidXRlcylcbiAgfSlcbn1cblxuZnVuY3Rpb24gaXNNYXJrSW5TZXQoXG4gIG1hcmtzOiBQcm9zZU1pcnJvck1hcmtbXSxcbiAgdHlwZTogTWFya1R5cGUsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFmaW5kTWFya0luU2V0KG1hcmtzLCB0eXBlLCBhdHRyaWJ1dGVzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya1JhbmdlKFxuICAkcG9zOiBSZXNvbHZlZFBvcyxcbiAgdHlwZTogTWFya1R5cGUsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IFJhbmdlIHwgdm9pZCB7XG4gIGlmICghJHBvcyB8fCAhdHlwZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IHN0YXJ0ID0gJHBvcy5wYXJlbnQuY2hpbGRBZnRlcigkcG9zLnBhcmVudE9mZnNldClcblxuICBpZiAoJHBvcy5wYXJlbnRPZmZzZXQgPT09IHN0YXJ0Lm9mZnNldCAmJiBzdGFydC5vZmZzZXQgIT09IDApIHtcbiAgICBzdGFydCA9ICRwb3MucGFyZW50LmNoaWxkQmVmb3JlKCRwb3MucGFyZW50T2Zmc2V0KVxuICB9XG5cbiAgaWYgKCFzdGFydC5ub2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtYXJrID0gZmluZE1hcmtJblNldChbLi4uc3RhcnQubm9kZS5tYXJrc10sIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgaWYgKCFtYXJrKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgc3RhcnRJbmRleCA9IHN0YXJ0LmluZGV4XG4gIGxldCBzdGFydFBvcyA9ICRwb3Muc3RhcnQoKSArIHN0YXJ0Lm9mZnNldFxuICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgMVxuICBsZXQgZW5kUG9zID0gc3RhcnRQb3MgKyBzdGFydC5ub2RlLm5vZGVTaXplXG5cbiAgZmluZE1hcmtJblNldChbLi4uc3RhcnQubm9kZS5tYXJrc10sIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgd2hpbGUgKHN0YXJ0SW5kZXggPiAwICYmIG1hcmsuaXNJblNldCgkcG9zLnBhcmVudC5jaGlsZChzdGFydEluZGV4IC0gMSkubWFya3MpKSB7XG4gICAgc3RhcnRJbmRleCAtPSAxXG4gICAgc3RhcnRQb3MgLT0gJHBvcy5wYXJlbnQuY2hpbGQoc3RhcnRJbmRleCkubm9kZVNpemVcbiAgfVxuXG4gIHdoaWxlIChcbiAgICBlbmRJbmRleCA8ICRwb3MucGFyZW50LmNoaWxkQ291bnRcbiAgICAmJiBpc01hcmtJblNldChbLi4uJHBvcy5wYXJlbnQuY2hpbGQoZW5kSW5kZXgpLm1hcmtzXSwgdHlwZSwgYXR0cmlidXRlcylcbiAgKSB7XG4gICAgZW5kUG9zICs9ICRwb3MucGFyZW50LmNoaWxkKGVuZEluZGV4KS5ub2RlU2l6ZVxuICAgIGVuZEluZGV4ICs9IDFcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbTogc3RhcnRQb3MsXG4gICAgdG86IGVuZFBvcyxcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya1R5cGUobmFtZU9yVHlwZTogc3RyaW5nIHwgTWFya1R5cGUsIHNjaGVtYTogU2NoZW1hKTogTWFya1R5cGUge1xuICBpZiAodHlwZW9mIG5hbWVPclR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFzY2hlbWEubWFya3NbbmFtZU9yVHlwZV0pIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gbWFyayB0eXBlIG5hbWVkICcke25hbWVPclR5cGV9Jy4gTWF5YmUgeW91IGZvcmdvdCB0byBhZGQgdGhlIGV4dGVuc2lvbj9gLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWEubWFya3NbbmFtZU9yVHlwZV1cbiAgfVxuXG4gIHJldHVybiBuYW1lT3JUeXBlXG59XG4iLCAiaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGdldE1hcmtSYW5nZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0TWFya1JhbmdlLmpzJ1xuaW1wb3J0IHsgZ2V0TWFya1R5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtUeXBlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGV4dGVuZE1hcmtSYW5nZToge1xuICAgICAgLyoqXG4gICAgICAgKiBFeHRlbmRzIHRoZSB0ZXh0IHNlbGVjdGlvbiB0byB0aGUgY3VycmVudCBtYXJrLlxuICAgICAgICovXG4gICAgICBleHRlbmRNYXJrUmFuZ2U6IChcbiAgICAgICAgdHlwZU9yTmFtZTogc3RyaW5nIHwgTWFya1R5cGUsXG4gICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBleHRlbmRNYXJrUmFuZ2U6IFJhd0NvbW1hbmRzWydleHRlbmRNYXJrUmFuZ2UnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7IHRyLCBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB0eXBlID0gZ2V0TWFya1R5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7IGRvYywgc2VsZWN0aW9uIH0gPSB0clxuICBjb25zdCB7ICRmcm9tLCBmcm9tLCB0byB9ID0gc2VsZWN0aW9uXG5cbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBnZXRNYXJrUmFuZ2UoJGZyb20sIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgICBpZiAocmFuZ2UgJiYgcmFuZ2UuZnJvbSA8PSBmcm9tICYmIHJhbmdlLnRvID49IHRvKSB7XG4gICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIHJhbmdlLmZyb20sIHJhbmdlLnRvKVxuXG4gICAgICB0ci5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZFByb3BzLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZmlyc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogUnVucyBvbmUgY29tbWFuZCBhZnRlciB0aGUgb3RoZXIgYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aGljaCByZXR1cm5zIHRydWUuXG4gICAgICAgKi9cbiAgICAgIGZpcnN0OiAoY29tbWFuZHM6IENvbW1hbmRbXSB8ICgocHJvcHM6IENvbW1hbmRQcm9wcykgPT4gQ29tbWFuZFtdKSkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGZpcnN0OiBSYXdDb21tYW5kc1snZmlyc3QnXSA9IGNvbW1hbmRzID0+IHByb3BzID0+IHtcbiAgY29uc3QgaXRlbXMgPSB0eXBlb2YgY29tbWFuZHMgPT09ICdmdW5jdGlvbidcbiAgICA/IGNvbW1hbmRzKHByb3BzKVxuICAgIDogY29tbWFuZHNcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGl0ZW1zW2ldKHByb3BzKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBUZXh0U2VsZWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGV4dFNlbGVjdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRleHRTZWxlY3Rpb24ge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG1pbk1heCh2YWx1ZSA9IDAsIG1pbiA9IDAsIG1heCA9IDApOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIG1pbiksIG1heClcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBTZWxlY3Rpb24sIFRleHRTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBGb2N1c1Bvc2l0aW9uIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBtaW5NYXggfSBmcm9tICcuLi91dGlsaXRpZXMvbWluTWF4LmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZvY3VzUG9zaXRpb24oXG4gIGRvYzogUHJvc2VNaXJyb3JOb2RlLFxuICBwb3NpdGlvbjogRm9jdXNQb3NpdGlvbiA9IG51bGwsXG4pOiBTZWxlY3Rpb24gfCBudWxsIHtcbiAgaWYgKCFwb3NpdGlvbikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBzZWxlY3Rpb25BdFN0YXJ0ID0gU2VsZWN0aW9uLmF0U3RhcnQoZG9jKVxuICBjb25zdCBzZWxlY3Rpb25BdEVuZCA9IFNlbGVjdGlvbi5hdEVuZChkb2MpXG5cbiAgaWYgKHBvc2l0aW9uID09PSAnc3RhcnQnIHx8IHBvc2l0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkF0U3RhcnRcbiAgfVxuXG4gIGlmIChwb3NpdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICByZXR1cm4gc2VsZWN0aW9uQXRFbmRcbiAgfVxuXG4gIGNvbnN0IG1pblBvcyA9IHNlbGVjdGlvbkF0U3RhcnQuZnJvbVxuICBjb25zdCBtYXhQb3MgPSBzZWxlY3Rpb25BdEVuZC50b1xuXG4gIGlmIChwb3NpdGlvbiA9PT0gJ2FsbCcpIHtcbiAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGUoXG4gICAgICBkb2MsXG4gICAgICBtaW5NYXgoMCwgbWluUG9zLCBtYXhQb3MpLFxuICAgICAgbWluTWF4KGRvYy5jb250ZW50LnNpemUsIG1pblBvcywgbWF4UG9zKSxcbiAgICApXG4gIH1cblxuICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGUoXG4gICAgZG9jLFxuICAgIG1pbk1heChwb3NpdGlvbiwgbWluUG9zLCBtYXhQb3MpLFxuICAgIG1pbk1heChwb3NpdGlvbiwgbWluUG9zLCBtYXhQb3MpLFxuICApXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzaU9TKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgICdpUGFkIFNpbXVsYXRvcicsXG4gICAgJ2lQaG9uZSBTaW11bGF0b3InLFxuICAgICdpUG9kIFNpbXVsYXRvcicsXG4gICAgJ2lQYWQnLFxuICAgICdpUGhvbmUnLFxuICAgICdpUG9kJyxcbiAgXS5pbmNsdWRlcyhuYXZpZ2F0b3IucGxhdGZvcm0pXG4gIC8vIGlQYWQgb24gaU9TIDEzIGRldGVjdGlvblxuICB8fCAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygnTWFjJykgJiYgJ29udG91Y2hlbmQnIGluIGRvY3VtZW50KVxufVxuIiwgImltcG9ydCB7IGlzVGV4dFNlbGVjdGlvbiB9IGZyb20gJy4uL2hlbHBlcnMvaXNUZXh0U2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZUZvY3VzUG9zaXRpb24gfSBmcm9tICcuLi9oZWxwZXJzL3Jlc29sdmVGb2N1c1Bvc2l0aW9uLmpzJ1xuaW1wb3J0IHsgRm9jdXNQb3NpdGlvbiwgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGlzaU9TIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzaU9TLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZm9jdXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRm9jdXMgdGhlIGVkaXRvciBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgICAgKi9cbiAgICAgIGZvY3VzOiAoXG4gICAgICAgIHBvc2l0aW9uPzogRm9jdXNQb3NpdGlvbixcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICBzY3JvbGxJbnRvVmlldz86IGJvb2xlYW4sXG4gICAgICAgIH0sXG4gICAgICApID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBmb2N1czogUmF3Q29tbWFuZHNbJ2ZvY3VzJ10gPSAocG9zaXRpb24gPSBudWxsLCBvcHRpb25zID0ge30pID0+ICh7XG4gIGVkaXRvcixcbiAgdmlldyxcbiAgdHIsXG4gIGRpc3BhdGNoLFxufSkgPT4ge1xuICBvcHRpb25zID0ge1xuICAgIHNjcm9sbEludG9WaWV3OiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH1cblxuICBjb25zdCBkZWxheWVkRm9jdXMgPSAoKSA9PiB7XG4gICAgLy8gZm9jdXMgd2l0aGluIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGJyZWFrcyBmb2N1cyBvbiBpT1NcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGNhbGwgdGhpc1xuICAgIGlmIChpc2lPUygpKSB7XG4gICAgICAodmlldy5kb20gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKClcbiAgICB9XG5cbiAgICAvLyBGb3IgUmVhY3Qgd2UgaGF2ZSB0byBmb2N1cyBhc3luY2hyb25vdXNseS4gT3RoZXJ3aXNlIHdpbGQgdGhpbmdzIGhhcHBlbi5cbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS91ZWJlcmRvc2lzL3RpcHRhcC9pc3N1ZXMvMTUyMFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAoIWVkaXRvci5pc0Rlc3Ryb3llZCkge1xuICAgICAgICB2aWV3LmZvY3VzKClcblxuICAgICAgICBpZiAob3B0aW9ucz8uc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgICBlZGl0b3IuY29tbWFuZHMuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmICgodmlldy5oYXNGb2N1cygpICYmIHBvc2l0aW9uID09PSBudWxsKSB8fCBwb3NpdGlvbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gd2UgZG9u4oCZdCB0cnkgdG8gcmVzb2x2ZSBhIE5vZGVTZWxlY3Rpb24gb3IgQ2VsbFNlbGVjdGlvblxuICBpZiAoZGlzcGF0Y2ggJiYgcG9zaXRpb24gPT09IG51bGwgJiYgIWlzVGV4dFNlbGVjdGlvbihlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uKSkge1xuICAgIGRlbGF5ZWRGb2N1cygpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIHBhc3MgdGhyb3VnaCB0ci5kb2MgaW5zdGVhZCBvZiBlZGl0b3Iuc3RhdGUuZG9jXG4gIC8vIHNpbmNlIHRyYW5zYWN0aW9ucyBjb3VsZCBjaGFuZ2UgdGhlIGVkaXRvcnMgc3RhdGUgYmVmb3JlIHRoaXMgY29tbWFuZCBoYXMgYmVlbiBydW5cbiAgY29uc3Qgc2VsZWN0aW9uID0gcmVzb2x2ZUZvY3VzUG9zaXRpb24odHIuZG9jLCBwb3NpdGlvbikgfHwgZWRpdG9yLnN0YXRlLnNlbGVjdGlvblxuICBjb25zdCBpc1NhbWVTZWxlY3Rpb24gPSBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLmVxKHNlbGVjdGlvbilcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBpZiAoIWlzU2FtZVNlbGVjdGlvbikge1xuICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbilcbiAgICB9XG5cbiAgICAvLyBgdHIuc2V0U2VsZWN0aW9uYCByZXNldHMgdGhlIHN0b3JlZCBtYXJrc1xuICAgIC8vIHNvIHdl4oCZbGwgcmVzdG9yZSB0aGVtIGlmIHRoZSBzZWxlY3Rpb24gaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gICAgaWYgKGlzU2FtZVNlbGVjdGlvbiAmJiB0ci5zdG9yZWRNYXJrcykge1xuICAgICAgdHIuc2V0U3RvcmVkTWFya3ModHIuc3RvcmVkTWFya3MpXG4gICAgfVxuXG4gICAgZGVsYXllZEZvY3VzKClcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFByb3BzLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgZm9yRWFjaDoge1xuICAgICAgLyoqXG4gICAgICAgKiBMb29wIHRocm91Z2ggYW4gYXJyYXkgb2YgaXRlbXMuXG4gICAgICAgKi9cbiAgICAgIGZvckVhY2g6IDxUPihcbiAgICAgICAgaXRlbXM6IFRbXSxcbiAgICAgICAgZm46IChcbiAgICAgICAgICBpdGVtOiBULFxuICAgICAgICAgIHByb3BzOiBDb21tYW5kUHJvcHMgJiB7XG4gICAgICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gYm9vbGVhbixcbiAgICAgICkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGZvckVhY2g6IFJhd0NvbW1hbmRzWydmb3JFYWNoJ10gPSAoaXRlbXMsIGZuKSA9PiBwcm9wcyA9PiB7XG4gIHJldHVybiBpdGVtcy5ldmVyeSgoaXRlbSwgaW5kZXgpID0+IGZuKGl0ZW0sIHsgLi4ucHJvcHMsIGluZGV4IH0pKVxufVxuIiwgImltcG9ydCB7IFBhcnNlT3B0aW9ucyB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IENvbnRlbnQsIFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBpbnNlcnRDb250ZW50OiB7XG4gICAgICAvKipcbiAgICAgICAqIEluc2VydCBhIG5vZGUgb3Igc3RyaW5nIG9mIEhUTUwgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICAgKi9cbiAgICAgIGluc2VydENvbnRlbnQ6IChcbiAgICAgICAgdmFsdWU6IENvbnRlbnQsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgcGFyc2VPcHRpb25zPzogUGFyc2VPcHRpb25zXG4gICAgICAgICAgdXBkYXRlU2VsZWN0aW9uPzogYm9vbGVhblxuICAgICAgICB9LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRDb250ZW50OiBSYXdDb21tYW5kc1snaW5zZXJ0Q29udGVudCddID0gKHZhbHVlLCBvcHRpb25zKSA9PiAoeyB0ciwgY29tbWFuZHMgfSkgPT4ge1xuICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudEF0KFxuICAgIHsgZnJvbTogdHIuc2VsZWN0aW9uLmZyb20sIHRvOiB0ci5zZWxlY3Rpb24udG8gfSxcbiAgICB2YWx1ZSxcbiAgICBvcHRpb25zLFxuICApXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRGcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIC8vIGFkZCBhIHdyYXBwZXIgdG8gcHJlc2VydmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZVxuICBjb25zdCB3cmFwcGVkVmFsdWUgPSBgPGJvZHk+JHt2YWx1ZX08L2JvZHk+YFxuXG4gIHJldHVybiBuZXcgd2luZG93LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh3cmFwcGVkVmFsdWUsICd0ZXh0L2h0bWwnKS5ib2R5XG59XG4iLCAiaW1wb3J0IHtcbiAgRE9NUGFyc2VyLFxuICBGcmFnbWVudCxcbiAgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUsXG4gIFBhcnNlT3B0aW9ucyxcbiAgU2NoZW1hLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBlbGVtZW50RnJvbVN0cmluZyB9IGZyb20gJy4uL3V0aWxpdGllcy9lbGVtZW50RnJvbVN0cmluZy5qcydcblxuZXhwb3J0IHR5cGUgQ3JlYXRlTm9kZUZyb21Db250ZW50T3B0aW9ucyA9IHtcbiAgc2xpY2U/OiBib29sZWFuXG4gIHBhcnNlT3B0aW9ucz86IFBhcnNlT3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTm9kZUZyb21Db250ZW50KFxuICBjb250ZW50OiBDb250ZW50LFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgb3B0aW9ucz86IENyZWF0ZU5vZGVGcm9tQ29udGVudE9wdGlvbnMsXG4pOiBQcm9zZU1pcnJvck5vZGUgfCBGcmFnbWVudCB7XG4gIG9wdGlvbnMgPSB7XG4gICAgc2xpY2U6IHRydWUsXG4gICAgcGFyc2VPcHRpb25zOiB7fSxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnb2JqZWN0JyAmJiBjb250ZW50ICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpICYmIGNvbnRlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbUFycmF5KGNvbnRlbnQubWFwKGl0ZW0gPT4gc2NoZW1hLm5vZGVGcm9tSlNPTihpdGVtKSkpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWEubm9kZUZyb21KU09OKGNvbnRlbnQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3RpcHRhcCB3YXJuXTogSW52YWxpZCBjb250ZW50LicsICdQYXNzZWQgdmFsdWU6JywgY29udGVudCwgJ0Vycm9yOicsIGVycm9yKVxuXG4gICAgICByZXR1cm4gY3JlYXRlTm9kZUZyb21Db250ZW50KCcnLCBzY2hlbWEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlciA9IERPTVBhcnNlci5mcm9tU2NoZW1hKHNjaGVtYSlcblxuICAgIHJldHVybiBvcHRpb25zLnNsaWNlXG4gICAgICA/IHBhcnNlci5wYXJzZVNsaWNlKGVsZW1lbnRGcm9tU3RyaW5nKGNvbnRlbnQpLCBvcHRpb25zLnBhcnNlT3B0aW9ucykuY29udGVudFxuICAgICAgOiBwYXJzZXIucGFyc2UoZWxlbWVudEZyb21TdHJpbmcoY29udGVudCksIG9wdGlvbnMucGFyc2VPcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZU5vZGVGcm9tQ29udGVudCgnJywgc2NoZW1hLCBvcHRpb25zKVxufVxuIiwgImltcG9ydCB7IFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgUmVwbGFjZUFyb3VuZFN0ZXAsIFJlcGxhY2VTdGVwIH0gZnJvbSAnQHRpcHRhcC9wbS90cmFuc2Zvcm0nXG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yLXN0YXRlL2Jsb2IvbWFzdGVyL3NyYy9zZWxlY3Rpb24uanMjTDQ2NlxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyOiBUcmFuc2FjdGlvbiwgc3RhcnRMZW46IG51bWJlciwgYmlhczogbnVtYmVyKSB7XG4gIGNvbnN0IGxhc3QgPSB0ci5zdGVwcy5sZW5ndGggLSAxXG5cbiAgaWYgKGxhc3QgPCBzdGFydExlbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RlcCA9IHRyLnN0ZXBzW2xhc3RdXG5cbiAgaWYgKCEoc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VTdGVwIHx8IHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlQXJvdW5kU3RlcCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1hcCA9IHRyLm1hcHBpbmcubWFwc1tsYXN0XVxuICBsZXQgZW5kID0gMFxuXG4gIG1hcC5mb3JFYWNoKChfZnJvbSwgX3RvLCBfbmV3RnJvbSwgbmV3VG8pID0+IHtcbiAgICBpZiAoZW5kID09PSAwKSB7XG4gICAgICBlbmQgPSBuZXdUb1xuICAgIH1cbiAgfSlcblxuICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoZW5kKSwgYmlhcykpXG59XG4iLCAiaW1wb3J0IHsgRnJhZ21lbnQsIE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlLCBQYXJzZU9wdGlvbnMgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBjcmVhdGVOb2RlRnJvbUNvbnRlbnQgfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZU5vZGVGcm9tQ29udGVudC5qcydcbmltcG9ydCB7IHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kIH0gZnJvbSAnLi4vaGVscGVycy9zZWxlY3Rpb25Ub0luc2VydGlvbkVuZC5qcydcbmltcG9ydCB7IENvbnRlbnQsIFJhbmdlLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaW5zZXJ0Q29udGVudEF0OiB7XG4gICAgICAvKipcbiAgICAgICAqIEluc2VydCBhIG5vZGUgb3Igc3RyaW5nIG9mIEhUTUwgYXQgYSBzcGVjaWZpYyBwb3NpdGlvbi5cbiAgICAgICAqL1xuICAgICAgaW5zZXJ0Q29udGVudEF0OiAoXG4gICAgICAgIHBvc2l0aW9uOiBudW1iZXIgfCBSYW5nZSxcbiAgICAgICAgdmFsdWU6IENvbnRlbnQsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgcGFyc2VPcHRpb25zPzogUGFyc2VPcHRpb25zXG4gICAgICAgICAgdXBkYXRlU2VsZWN0aW9uPzogYm9vbGVhblxuICAgICAgICB9LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGlzRnJhZ21lbnQgPSAobm9kZU9yRnJhZ21lbnQ6IFByb3NlTWlycm9yTm9kZSB8IEZyYWdtZW50KTogbm9kZU9yRnJhZ21lbnQgaXMgRnJhZ21lbnQgPT4ge1xuICByZXR1cm4gbm9kZU9yRnJhZ21lbnQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCc8Jylcbn1cblxuZXhwb3J0IGNvbnN0IGluc2VydENvbnRlbnRBdDogUmF3Q29tbWFuZHNbJ2luc2VydENvbnRlbnRBdCddID0gKHBvc2l0aW9uLCB2YWx1ZSwgb3B0aW9ucykgPT4gKHsgdHIsIGRpc3BhdGNoLCBlZGl0b3IgfSkgPT4ge1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgcGFyc2VPcHRpb25zOiB7fSxcbiAgICAgIHVwZGF0ZVNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGNyZWF0ZU5vZGVGcm9tQ29udGVudCh2YWx1ZSwgZWRpdG9yLnNjaGVtYSwge1xuICAgICAgcGFyc2VPcHRpb25zOiB7XG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZTogJ2Z1bGwnLFxuICAgICAgICAuLi5vcHRpb25zLnBhcnNlT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIC8vIGRvbuKAmXQgZGlzcGF0Y2ggYW4gZW1wdHkgZnJhZ21lbnQgYmVjYXVzZSB0aGlzIGNhbiBsZWFkIHRvIHN0cmFuZ2UgZXJyb3JzXG4gICAgaWYgKGNvbnRlbnQudG9TdHJpbmcoKSA9PT0gJzw+Jykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBsZXQgeyBmcm9tLCB0byB9ID0gdHlwZW9mIHBvc2l0aW9uID09PSAnbnVtYmVyJyA/IHsgZnJvbTogcG9zaXRpb24sIHRvOiBwb3NpdGlvbiB9IDogeyBmcm9tOiBwb3NpdGlvbi5mcm9tLCB0bzogcG9zaXRpb24udG8gfVxuXG4gICAgbGV0IGlzT25seVRleHRDb250ZW50ID0gdHJ1ZVxuICAgIGxldCBpc09ubHlCbG9ja0NvbnRlbnQgPSB0cnVlXG4gICAgY29uc3Qgbm9kZXMgPSBpc0ZyYWdtZW50KGNvbnRlbnQpID8gY29udGVudCA6IFtjb250ZW50XVxuXG4gICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGFkZGVkIG5vZGUgaXMgdmFsaWRcbiAgICAgIG5vZGUuY2hlY2soKVxuXG4gICAgICBpc09ubHlUZXh0Q29udGVudCA9IGlzT25seVRleHRDb250ZW50ID8gbm9kZS5pc1RleHQgJiYgbm9kZS5tYXJrcy5sZW5ndGggPT09IDAgOiBmYWxzZVxuXG4gICAgICBpc09ubHlCbG9ja0NvbnRlbnQgPSBpc09ubHlCbG9ja0NvbnRlbnQgPyBub2RlLmlzQmxvY2sgOiBmYWxzZVxuICAgIH0pXG5cbiAgICAvLyBjaGVjayBpZiB3ZSBjYW4gcmVwbGFjZSB0aGUgd3JhcHBpbmcgbm9kZSBieVxuICAgIC8vIHRoZSBuZXdseSBpbnNlcnRlZCBjb250ZW50XG4gICAgLy8gZXhhbXBsZTpcbiAgICAvLyByZXBsYWNlIGFuIGVtcHR5IHBhcmFncmFwaCBieSBhbiBpbnNlcnRlZCBpbWFnZVxuICAgIC8vIGluc3RlYWQgb2YgaW5zZXJ0aW5nIHRoZSBpbWFnZSBiZWxvdyB0aGUgcGFyYWdyYXBoXG4gICAgaWYgKGZyb20gPT09IHRvICYmIGlzT25seUJsb2NrQ29udGVudCkge1xuICAgICAgY29uc3QgeyBwYXJlbnQgfSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pXG4gICAgICBjb25zdCBpc0VtcHR5VGV4dEJsb2NrID0gcGFyZW50LmlzVGV4dGJsb2NrICYmICFwYXJlbnQudHlwZS5zcGVjLmNvZGUgJiYgIXBhcmVudC5jaGlsZENvdW50XG5cbiAgICAgIGlmIChpc0VtcHR5VGV4dEJsb2NrKSB7XG4gICAgICAgIGZyb20gLT0gMVxuICAgICAgICB0byArPSAxXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgaXMgb25seSBwbGFpbiB0ZXh0IHdlIGhhdmUgdG8gdXNlIGBpbnNlcnRUZXh0YFxuICAgIC8vIGJlY2F1c2UgdGhpcyB3aWxsIGtlZXAgdGhlIGN1cnJlbnQgbWFya3NcbiAgICBpZiAoaXNPbmx5VGV4dENvbnRlbnQpIHtcbiAgICAgIC8vIGlmIHZhbHVlIGlzIHN0cmluZywgd2UgY2FuIHVzZSBpdCBkaXJlY3RseVxuICAgICAgLy8gb3RoZXJ3aXNlIGlmIGl0IGlzIGFuIGFycmF5LCB3ZSBoYXZlIHRvIGpvaW4gaXRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0ci5pbnNlcnRUZXh0KHZhbHVlLm1hcCh2ID0+IHYudGV4dCB8fCAnJykuam9pbignJyksIGZyb20sIHRvKVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEhdmFsdWUgJiYgISF2YWx1ZS50ZXh0KSB7XG4gICAgICAgIHRyLmluc2VydFRleHQodmFsdWUudGV4dCwgZnJvbSwgdG8pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ci5pbnNlcnRUZXh0KHZhbHVlIGFzIHN0cmluZywgZnJvbSwgdG8pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyLnJlcGxhY2VXaXRoKGZyb20sIHRvLCBjb250ZW50KVxuICAgIH1cblxuICAgIC8vIHNldCBjdXJzb3IgYXQgZW5kIG9mIGluc2VydGVkIGNvbnRlbnRcbiAgICBpZiAob3B0aW9ucy51cGRhdGVTZWxlY3Rpb24pIHtcbiAgICAgIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCB0ci5zdGVwcy5sZW5ndGggLSAxLCAtMSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7XG4gIGpvaW5CYWNrd2FyZCBhcyBvcmlnaW5hbEpvaW5CYWNrd2FyZCxcbiAgam9pbkRvd24gYXMgb3JpZ2luYWxKb2luRG93bixcbiAgam9pbkZvcndhcmQgYXMgb3JpZ2luYWxKb2luRm9yd2FyZCxcbiAgam9pblVwIGFzIG9yaWdpbmFsSm9pblVwLFxufSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgam9pblVwOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIFVwLlxuICAgICAgICovXG4gICAgICBqb2luVXA6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gICAgam9pbkRvd246IHtcbiAgICAgIC8qKlxuICAgICAgICogSm9pbiB0d28gbm9kZXMgRG93bi5cbiAgICAgICAqL1xuICAgICAgam9pbkRvd246ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gICAgam9pbkJhY2t3YXJkOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIEJhY2t3YXJkcy5cbiAgICAgICAqL1xuICAgICAgam9pbkJhY2t3YXJkOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICAgIGpvaW5Gb3J3YXJkOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIEZvcndhcmRzLlxuICAgICAgICovXG4gICAgICBqb2luRm9yd2FyZDogKCkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgam9pblVwOiBSYXdDb21tYW5kc1snam9pblVwJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxKb2luVXAoc3RhdGUsIGRpc3BhdGNoKVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkRvd246IFJhd0NvbW1hbmRzWydqb2luRG93biddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsSm9pbkRvd24oc3RhdGUsIGRpc3BhdGNoKVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkJhY2t3YXJkOiBSYXdDb21tYW5kc1snam9pbkJhY2t3YXJkJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxKb2luQmFja3dhcmQoc3RhdGUsIGRpc3BhdGNoKVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkZvcndhcmQ6IFJhd0NvbW1hbmRzWydqb2luRm9yd2FyZCddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsSm9pbkZvcndhcmQoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IGpvaW5Qb2ludCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgam9pbkl0ZW1CYWNrd2FyZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBKb2luIHR3byBub2RlcyBGb3J3YXJkcy5cbiAgICAgICAqL1xuICAgICAgam9pbkl0ZW1CYWNrd2FyZDogKCkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgam9pbkl0ZW1CYWNrd2FyZDogUmF3Q29tbWFuZHNbJ2pvaW5JdGVtQmFja3dhcmQnXSA9ICgpID0+ICh7XG4gIHRyLCBzdGF0ZSwgZGlzcGF0Y2gsXG59KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcG9pbnQgPSBqb2luUG9pbnQoc3RhdGUuZG9jLCBzdGF0ZS5zZWxlY3Rpb24uJGZyb20ucG9zLCAtMSlcblxuICAgIGlmIChwb2ludCA9PT0gbnVsbCB8fCBwb2ludCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0ci5qb2luKHBvaW50LCAyKVxuXG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBkaXNwYXRjaCh0cilcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwgImltcG9ydCB7IGpvaW5Qb2ludCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgam9pbkl0ZW1Gb3J3YXJkOiB7XG4gICAgICAvKipcbiAgICAgICAqIEpvaW4gdHdvIG5vZGVzIEZvcndhcmRzLlxuICAgICAgICovXG4gICAgICBqb2luSXRlbUZvcndhcmQ6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGpvaW5JdGVtRm9yd2FyZDogUmF3Q29tbWFuZHNbJ2pvaW5JdGVtRm9yd2FyZCddID0gKCkgPT4gKHtcbiAgc3RhdGUsXG4gIGRpc3BhdGNoLFxuICB0cixcbn0pID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwb2ludCA9IGpvaW5Qb2ludChzdGF0ZS5kb2MsIHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wb3MsICsxKVxuXG4gICAgaWYgKHBvaW50ID09PSBudWxsIHx8IHBvaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRyLmpvaW4ocG9pbnQsIDIpXG5cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgIGRpc3BhdGNoKHRyKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBpc01hY09TKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgIDogZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNpT1MgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNpT1MuanMnXG5pbXBvcnQgeyBpc01hY09TIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzTWFjT1MuanMnXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLylcbiAgbGV0IHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdXG5cbiAgaWYgKHJlc3VsdCA9PT0gJ1NwYWNlJykge1xuICAgIHJlc3VsdCA9ICcgJ1xuICB9XG5cbiAgbGV0IGFsdFxuICBsZXQgY3RybFxuICBsZXQgc2hpZnRcbiAgbGV0IG1ldGFcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkgKz0gMSkge1xuICAgIGNvbnN0IG1vZCA9IHBhcnRzW2ldXG5cbiAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKSB7XG4gICAgICBtZXRhID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKSB7XG4gICAgICBhbHQgPSB0cnVlXG4gICAgfSBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKSB7XG4gICAgICBjdHJsID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpIHtcbiAgICAgIHNoaWZ0ID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoL15tb2QkL2kudGVzdChtb2QpKSB7XG4gICAgICBpZiAoaXNpT1MoKSB8fCBpc01hY09TKCkpIHtcbiAgICAgICAgbWV0YSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0cmwgPSB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6ICR7bW9kfWApXG4gICAgfVxuICB9XG5cbiAgaWYgKGFsdCkge1xuICAgIHJlc3VsdCA9IGBBbHQtJHtyZXN1bHR9YFxuICB9XG5cbiAgaWYgKGN0cmwpIHtcbiAgICByZXN1bHQgPSBgQ3RybC0ke3Jlc3VsdH1gXG4gIH1cblxuICBpZiAobWV0YSkge1xuICAgIHJlc3VsdCA9IGBNZXRhLSR7cmVzdWx0fWBcbiAgfVxuXG4gIGlmIChzaGlmdCkge1xuICAgIHJlc3VsdCA9IGBTaGlmdC0ke3Jlc3VsdH1gXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBrZXlib2FyZFNob3J0Y3V0OiB7XG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYSBrZXlib2FyZCBzaG9ydGN1dC5cbiAgICAgICAqL1xuICAgICAga2V5Ym9hcmRTaG9ydGN1dDogKG5hbWU6IHN0cmluZykgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGtleWJvYXJkU2hvcnRjdXQ6IFJhd0NvbW1hbmRzWydrZXlib2FyZFNob3J0Y3V0J10gPSBuYW1lID0+ICh7XG4gIGVkaXRvcixcbiAgdmlldyxcbiAgdHIsXG4gIGRpc3BhdGNoLFxufSkgPT4ge1xuICBjb25zdCBrZXlzID0gbm9ybWFsaXplS2V5TmFtZShuYW1lKS5zcGxpdCgvLSg/ISQpLylcbiAgY29uc3Qga2V5ID0ga2V5cy5maW5kKGl0ZW0gPT4gIVsnQWx0JywgJ0N0cmwnLCAnTWV0YScsICdTaGlmdCddLmluY2x1ZGVzKGl0ZW0pKVxuICBjb25zdCBldmVudCA9IG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywge1xuICAgIGtleToga2V5ID09PSAnU3BhY2UnXG4gICAgICA/ICcgJ1xuICAgICAgOiBrZXksXG4gICAgYWx0S2V5OiBrZXlzLmluY2x1ZGVzKCdBbHQnKSxcbiAgICBjdHJsS2V5OiBrZXlzLmluY2x1ZGVzKCdDdHJsJyksXG4gICAgbWV0YUtleToga2V5cy5pbmNsdWRlcygnTWV0YScpLFxuICAgIHNoaWZ0S2V5OiBrZXlzLmluY2x1ZGVzKCdTaGlmdCcpLFxuICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgfSlcblxuICBjb25zdCBjYXB0dXJlZFRyYW5zYWN0aW9uID0gZWRpdG9yLmNhcHR1cmVUcmFuc2FjdGlvbigoKSA9PiB7XG4gICAgdmlldy5zb21lUHJvcCgnaGFuZGxlS2V5RG93bicsIGYgPT4gZih2aWV3LCBldmVudCkpXG4gIH0pXG5cbiAgY2FwdHVyZWRUcmFuc2FjdGlvbj8uc3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICBjb25zdCBuZXdTdGVwID0gc3RlcC5tYXAodHIubWFwcGluZylcblxuICAgIGlmIChuZXdTdGVwICYmIGRpc3BhdGNoKSB7XG4gICAgICB0ci5tYXliZVN0ZXAobmV3U3RlcClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IE5vZGVSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgb2JqZWN0SW5jbHVkZXMgfSBmcm9tICcuLi91dGlsaXRpZXMvb2JqZWN0SW5jbHVkZXMuanMnXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4vZ2V0Tm9kZVR5cGUuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVBY3RpdmUoXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZSxcbiAgdHlwZU9yTmFtZTogTm9kZVR5cGUgfCBzdHJpbmcgfCBudWxsLFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgeyBmcm9tLCB0bywgZW1wdHkgfSA9IHN0YXRlLnNlbGVjdGlvblxuICBjb25zdCB0eXBlID0gdHlwZU9yTmFtZSA/IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSkgOiBudWxsXG5cbiAgY29uc3Qgbm9kZVJhbmdlczogTm9kZVJhbmdlW10gPSBbXVxuXG4gIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICBpZiAobm9kZS5pc1RleHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcylcbiAgICBjb25zdCByZWxhdGl2ZVRvID0gTWF0aC5taW4odG8sIHBvcyArIG5vZGUubm9kZVNpemUpXG5cbiAgICBub2RlUmFuZ2VzLnB1c2goe1xuICAgICAgbm9kZSxcbiAgICAgIGZyb206IHJlbGF0aXZlRnJvbSxcbiAgICAgIHRvOiByZWxhdGl2ZVRvLFxuICAgIH0pXG4gIH0pXG5cbiAgY29uc3Qgc2VsZWN0aW9uUmFuZ2UgPSB0byAtIGZyb21cbiAgY29uc3QgbWF0Y2hlZE5vZGVSYW5nZXMgPSBub2RlUmFuZ2VzXG4gICAgLmZpbHRlcihub2RlUmFuZ2UgPT4ge1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlLm5hbWUgPT09IG5vZGVSYW5nZS5ub2RlLnR5cGUubmFtZVxuICAgIH0pXG4gICAgLmZpbHRlcihub2RlUmFuZ2UgPT4gb2JqZWN0SW5jbHVkZXMobm9kZVJhbmdlLm5vZGUuYXR0cnMsIGF0dHJpYnV0ZXMsIHsgc3RyaWN0OiBmYWxzZSB9KSlcblxuICBpZiAoZW1wdHkpIHtcbiAgICByZXR1cm4gISFtYXRjaGVkTm9kZVJhbmdlcy5sZW5ndGhcbiAgfVxuXG4gIGNvbnN0IHJhbmdlID0gbWF0Y2hlZE5vZGVSYW5nZXMucmVkdWNlKChzdW0sIG5vZGVSYW5nZSkgPT4gc3VtICsgbm9kZVJhbmdlLnRvIC0gbm9kZVJhbmdlLmZyb20sIDApXG5cbiAgcmV0dXJuIHJhbmdlID49IHNlbGVjdGlvblJhbmdlXG59XG4iLCAiaW1wb3J0IHsgbGlmdCBhcyBvcmlnaW5hbExpZnQgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBpc05vZGVBY3RpdmUgfSBmcm9tICcuLi9oZWxwZXJzL2lzTm9kZUFjdGl2ZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBsaWZ0OiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZXMgYW4gZXhpc3Rpbmcgd3JhcC5cbiAgICAgICAqL1xuICAgICAgbGlmdDogKHR5cGVPck5hbWU6IHN0cmluZyB8IE5vZGVUeXBlLCBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbGlmdDogUmF3Q29tbWFuZHNbJ2xpZnQnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGNvbnN0IHR5cGUgPSBnZXROb2RlVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IGlzQWN0aXZlID0gaXNOb2RlQWN0aXZlKHN0YXRlLCB0eXBlLCBhdHRyaWJ1dGVzKVxuXG4gIGlmICghaXNBY3RpdmUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBvcmlnaW5hbExpZnQoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IGxpZnRFbXB0eUJsb2NrIGFzIG9yaWdpbmFsTGlmdEVtcHR5QmxvY2sgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgbGlmdEVtcHR5QmxvY2s6IHtcbiAgICAgIC8qKlxuICAgICAgICogTGlmdCBibG9jayBpZiBlbXB0eS5cbiAgICAgICAqL1xuICAgICAgbGlmdEVtcHR5QmxvY2s6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsaWZ0RW1wdHlCbG9jazogUmF3Q29tbWFuZHNbJ2xpZnRFbXB0eUJsb2NrJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxMaWZ0RW1wdHlCbG9jayhzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgbGlmdExpc3RJdGVtIGFzIG9yaWdpbmFsTGlmdExpc3RJdGVtIH0gZnJvbSAnQHRpcHRhcC9wbS9zY2hlbWEtbGlzdCdcblxuaW1wb3J0IHsgZ2V0Tm9kZVR5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE5vZGVUeXBlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGxpZnRMaXN0SXRlbToge1xuICAgICAgLyoqXG4gICAgICAgKiBMaWZ0IHRoZSBsaXN0IGl0ZW0gaW50byBhIHdyYXBwaW5nIGxpc3QuXG4gICAgICAgKi9cbiAgICAgIGxpZnRMaXN0SXRlbTogKHR5cGVPck5hbWU6IHN0cmluZyB8IE5vZGVUeXBlKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsaWZ0TGlzdEl0ZW06IFJhd0NvbW1hbmRzWydsaWZ0TGlzdEl0ZW0nXSA9IHR5cGVPck5hbWUgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICByZXR1cm4gb3JpZ2luYWxMaWZ0TGlzdEl0ZW0odHlwZSkoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IG5ld2xpbmVJbkNvZGUgYXMgb3JpZ2luYWxOZXdsaW5lSW5Db2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9jb21tYW5kcydcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIG5ld2xpbmVJbkNvZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgaW4gY29kZS5cbiAgICAgICAqL1xuICAgICAgbmV3bGluZUluQ29kZTogKCkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV3bGluZUluQ29kZTogUmF3Q29tbWFuZHNbJ25ld2xpbmVJbkNvZGUnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbE5ld2xpbmVJbkNvZGUoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZShuYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hKTogJ25vZGUnIHwgJ21hcmsnIHwgbnVsbCB7XG4gIGlmIChzY2hlbWEubm9kZXNbbmFtZV0pIHtcbiAgICByZXR1cm4gJ25vZGUnXG4gIH1cblxuICBpZiAoc2NoZW1hLm1hcmtzW25hbWVdKSB7XG4gICAgcmV0dXJuICdtYXJrJ1xuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbiIsICIvKipcbiAqIFJlbW92ZSBhIHByb3BlcnR5IG9yIGFuIGFycmF5IG9mIHByb3BlcnRpZXMgZnJvbSBhbiBvYmplY3RcbiAqIEBwYXJhbSBvYmogT2JqZWN0XG4gKiBAcGFyYW0ga2V5IEtleSB0byByZW1vdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVByb3BzKG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgcHJvcE9yUHJvcHM6IHN0cmluZyB8IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IHByb3BzID0gdHlwZW9mIHByb3BPclByb3BzID09PSAnc3RyaW5nJ1xuICAgID8gW3Byb3BPclByb3BzXVxuICAgIDogcHJvcE9yUHJvcHNcblxuICByZXR1cm4gT2JqZWN0XG4gICAgLmtleXMob2JqKVxuICAgIC5yZWR1Y2UoKG5ld09iajogUmVjb3JkPHN0cmluZywgYW55PiwgcHJvcCkgPT4ge1xuICAgICAgaWYgKCFwcm9wcy5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICBuZXdPYmpbcHJvcF0gPSBvYmpbcHJvcF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09ialxuICAgIH0sIHt9KVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IGdldFNjaGVtYVR5cGVOYW1lQnlOYW1lIH0gZnJvbSAnLi4vaGVscGVycy9nZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBkZWxldGVQcm9wcyB9IGZyb20gJy4uL3V0aWxpdGllcy9kZWxldGVQcm9wcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHJlc2V0QXR0cmlidXRlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXNldHMgc29tZSBub2RlIGF0dHJpYnV0ZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgKi9cbiAgICAgIHJlc2V0QXR0cmlidXRlczogKFxuICAgICAgICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSB8IE1hcmtUeXBlLFxuICAgICAgICBhdHRyaWJ1dGVzOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVzZXRBdHRyaWJ1dGVzOiBSYXdDb21tYW5kc1sncmVzZXRBdHRyaWJ1dGVzJ10gPSAodHlwZU9yTmFtZSwgYXR0cmlidXRlcykgPT4gKHsgdHIsIHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGxldCBub2RlVHlwZTogTm9kZVR5cGUgfCBudWxsID0gbnVsbFxuICBsZXQgbWFya1R5cGU6IE1hcmtUeXBlIHwgbnVsbCA9IG51bGxcblxuICBjb25zdCBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUoXG4gICAgdHlwZW9mIHR5cGVPck5hbWUgPT09ICdzdHJpbmcnID8gdHlwZU9yTmFtZSA6IHR5cGVPck5hbWUubmFtZSxcbiAgICBzdGF0ZS5zY2hlbWEsXG4gIClcblxuICBpZiAoIXNjaGVtYVR5cGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChzY2hlbWFUeXBlID09PSAnbm9kZScpIHtcbiAgICBub2RlVHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUgYXMgTm9kZVR5cGUsIHN0YXRlLnNjaGVtYSlcbiAgfVxuXG4gIGlmIChzY2hlbWFUeXBlID09PSAnbWFyaycpIHtcbiAgICBtYXJrVHlwZSA9IGdldE1hcmtUeXBlKHR5cGVPck5hbWUgYXMgTWFya1R5cGUsIHN0YXRlLnNjaGVtYSlcbiAgfVxuXG4gIGlmIChkaXNwYXRjaCkge1xuICAgIHRyLnNlbGVjdGlvbi5yYW5nZXMuZm9yRWFjaChyYW5nZSA9PiB7XG4gICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKHJhbmdlLiRmcm9tLnBvcywgcmFuZ2UuJHRvLnBvcywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICBpZiAobm9kZVR5cGUgJiYgbm9kZVR5cGUgPT09IG5vZGUudHlwZSkge1xuICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAocG9zLCB1bmRlZmluZWQsIGRlbGV0ZVByb3BzKG5vZGUuYXR0cnMsIGF0dHJpYnV0ZXMpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcmtUeXBlICYmIG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgbm9kZS5tYXJrcy5mb3JFYWNoKG1hcmsgPT4ge1xuICAgICAgICAgICAgaWYgKG1hcmtUeXBlID09PSBtYXJrLnR5cGUpIHtcbiAgICAgICAgICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgICAgICAgICBwb3MsXG4gICAgICAgICAgICAgICAgcG9zICsgbm9kZS5ub2RlU2l6ZSxcbiAgICAgICAgICAgICAgICBtYXJrVHlwZS5jcmVhdGUoZGVsZXRlUHJvcHMobWFyay5hdHRycywgYXR0cmlidXRlcykpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc2Nyb2xsSW50b1ZpZXc6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3LlxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlldzogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNjcm9sbEludG9WaWV3OiBSYXdDb21tYW5kc1snc2Nyb2xsSW50b1ZpZXcnXSA9ICgpID0+ICh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIHRyLnNjcm9sbEludG9WaWV3KClcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNlbGVjdEFsbDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgdGhlIHdob2xlIGRvY3VtZW50LlxuICAgICAgICovXG4gICAgICBzZWxlY3RBbGw6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RBbGw6IFJhd0NvbW1hbmRzWydzZWxlY3RBbGwnXSA9ICgpID0+ICh7IHRyLCBjb21tYW5kcyB9KSA9PiB7XG4gIHJldHVybiBjb21tYW5kcy5zZXRUZXh0U2VsZWN0aW9uKHtcbiAgICBmcm9tOiAwLFxuICAgIHRvOiB0ci5kb2MuY29udGVudC5zaXplLFxuICB9KVxufVxuIiwgImltcG9ydCB7IHNlbGVjdE5vZGVCYWNrd2FyZCBhcyBvcmlnaW5hbFNlbGVjdE5vZGVCYWNrd2FyZCB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZWxlY3ROb2RlQmFja3dhcmQ6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGEgbm9kZSBiYWNrd2FyZC5cbiAgICAgICAqL1xuICAgICAgc2VsZWN0Tm9kZUJhY2t3YXJkOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlQmFja3dhcmQ6IFJhd0NvbW1hbmRzWydzZWxlY3ROb2RlQmFja3dhcmQnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbFNlbGVjdE5vZGVCYWNrd2FyZChzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgc2VsZWN0Tm9kZUZvcndhcmQgYXMgb3JpZ2luYWxTZWxlY3ROb2RlRm9yd2FyZCB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5cbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZWxlY3ROb2RlRm9yd2FyZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgYSBub2RlIGZvcndhcmQuXG4gICAgICAgKi9cbiAgICAgIHNlbGVjdE5vZGVGb3J3YXJkOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlRm9yd2FyZDogUmF3Q29tbWFuZHNbJ3NlbGVjdE5vZGVGb3J3YXJkJ10gPSAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxTZWxlY3ROb2RlRm9yd2FyZChzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiaW1wb3J0IHsgc2VsZWN0UGFyZW50Tm9kZSBhcyBvcmlnaW5hbFNlbGVjdFBhcmVudE5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc2VsZWN0UGFyZW50Tm9kZToge1xuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgdGhlIHBhcmVudCBub2RlLlxuICAgICAgICovXG4gICAgICBzZWxlY3RQYXJlbnROb2RlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RQYXJlbnROb2RlOiBSYXdDb21tYW5kc1snc2VsZWN0UGFyZW50Tm9kZSddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsU2VsZWN0UGFyZW50Tm9kZShzdGF0ZSwgZGlzcGF0Y2gpXG59XG4iLCAiLy8gQHRzLWlnbm9yZVxuLy8gVE9ETzogYWRkIHR5cGVzIHRvIEB0eXBlcy9wcm9zZW1pcnJvci1jb21tYW5kc1xuaW1wb3J0IHsgc2VsZWN0VGV4dGJsb2NrRW5kIGFzIG9yaWdpbmFsU2VsZWN0VGV4dGJsb2NrRW5kIH0gZnJvbSAnQHRpcHRhcC9wbS9jb21tYW5kcydcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNlbGVjdFRleHRibG9ja0VuZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgY3VycmVudCB0ZXh0IGJsb2NrLlxuICAgICAgICovXG4gICAgICBzZWxlY3RUZXh0YmxvY2tFbmQ6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdFRleHRibG9ja0VuZDogUmF3Q29tbWFuZHNbJ3NlbGVjdFRleHRibG9ja0VuZCddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsU2VsZWN0VGV4dGJsb2NrRW5kKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICIvLyBAdHMtaWdub3JlXG4vLyBUT0RPOiBhZGQgdHlwZXMgdG8gQHR5cGVzL3Byb3NlbWlycm9yLWNvbW1hbmRzXG5pbXBvcnQgeyBzZWxlY3RUZXh0YmxvY2tTdGFydCBhcyBvcmlnaW5hbFNlbGVjdFRleHRibG9ja1N0YXJ0IH0gZnJvbSAnQHRpcHRhcC9wbS9jb21tYW5kcydcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNlbGVjdFRleHRibG9ja1N0YXJ0OiB7XG4gICAgICAvKipcbiAgICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIGN1cnJlbnQgdGV4dCBibG9jay5cbiAgICAgICAqL1xuICAgICAgc2VsZWN0VGV4dGJsb2NrU3RhcnQ6ICgpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdFRleHRibG9ja1N0YXJ0OiBSYXdDb21tYW5kc1snc2VsZWN0VGV4dGJsb2NrU3RhcnQnXSA9ICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbFNlbGVjdFRleHRibG9ja1N0YXJ0KHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgUGFyc2VPcHRpb25zLCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBjcmVhdGVOb2RlRnJvbUNvbnRlbnQgfSBmcm9tICcuL2NyZWF0ZU5vZGVGcm9tQ29udGVudC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURvY3VtZW50KFxuICBjb250ZW50OiBDb250ZW50LFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgcGFyc2VPcHRpb25zOiBQYXJzZU9wdGlvbnMgPSB7fSxcbik6IFByb3NlTWlycm9yTm9kZSB7XG4gIHJldHVybiBjcmVhdGVOb2RlRnJvbUNvbnRlbnQoY29udGVudCwgc2NoZW1hLCB7IHNsaWNlOiBmYWxzZSwgcGFyc2VPcHRpb25zIH0pIGFzIFByb3NlTWlycm9yTm9kZVxufVxuIiwgImltcG9ydCB7IFBhcnNlT3B0aW9ucyB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGNyZWF0ZURvY3VtZW50IH0gZnJvbSAnLi4vaGVscGVycy9jcmVhdGVEb2N1bWVudC5qcydcbmltcG9ydCB7IENvbnRlbnQsIFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXRDb250ZW50OiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlcGxhY2UgdGhlIHdob2xlIGRvY3VtZW50IHdpdGggbmV3IGNvbnRlbnQuXG4gICAgICAgKi9cbiAgICAgIHNldENvbnRlbnQ6IChcbiAgICAgICAgY29udGVudDogQ29udGVudCxcbiAgICAgICAgZW1pdFVwZGF0ZT86IGJvb2xlYW4sXG4gICAgICAgIHBhcnNlT3B0aW9ucz86IFBhcnNlT3B0aW9ucyxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2V0Q29udGVudDogUmF3Q29tbWFuZHNbJ3NldENvbnRlbnQnXSA9IChjb250ZW50LCBlbWl0VXBkYXRlID0gZmFsc2UsIHBhcnNlT3B0aW9ucyA9IHt9KSA9PiAoeyB0ciwgZWRpdG9yLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGNvbnN0IHsgZG9jIH0gPSB0clxuICBjb25zdCBkb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KGNvbnRlbnQsIGVkaXRvci5zY2hlbWEsIHBhcnNlT3B0aW9ucylcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICB0ci5yZXBsYWNlV2l0aCgwLCBkb2MuY29udGVudC5zaXplLCBkb2N1bWVudCkuc2V0TWV0YSgncHJldmVudFVwZGF0ZScsICFlbWl0VXBkYXRlKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBNYXJrLCBNYXJrVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi9nZXRNYXJrVHlwZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtBdHRyaWJ1dGVzKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIHR5cGVPck5hbWU6IHN0cmluZyB8IE1hcmtUeXBlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IHR5cGUgPSBnZXRNYXJrVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IHsgZnJvbSwgdG8sIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb25cbiAgY29uc3QgbWFya3M6IE1hcmtbXSA9IFtdXG5cbiAgaWYgKGVtcHR5KSB7XG4gICAgaWYgKHN0YXRlLnN0b3JlZE1hcmtzKSB7XG4gICAgICBtYXJrcy5wdXNoKC4uLnN0YXRlLnN0b3JlZE1hcmtzKVxuICAgIH1cblxuICAgIG1hcmtzLnB1c2goLi4uc3RhdGUuc2VsZWN0aW9uLiRoZWFkLm1hcmtzKCkpXG4gIH0gZWxzZSB7XG4gICAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgICBtYXJrcy5wdXNoKC4uLm5vZGUubWFya3MpXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IG1hcmsgPSBtYXJrcy5maW5kKG1hcmtJdGVtID0+IG1hcmtJdGVtLnR5cGUubmFtZSA9PT0gdHlwZS5uYW1lKVxuXG4gIGlmICghbWFyaykge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ubWFyay5hdHRycyB9XG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnQHRpcHRhcC9wbS90cmFuc2Zvcm0nXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBgVHJhbnNmb3JtYCBiYXNlZCBvbiBhbGwgc3RlcHMgb2YgdGhlIHBhc3NlZCB0cmFuc2FjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lVHJhbnNhY3Rpb25TdGVwcyhcbiAgb2xkRG9jOiBQcm9zZU1pcnJvck5vZGUsXG4gIHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25bXSxcbik6IFRyYW5zZm9ybSB7XG4gIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0ob2xkRG9jKVxuXG4gIHRyYW5zYWN0aW9ucy5mb3JFYWNoKHRyYW5zYWN0aW9uID0+IHtcbiAgICB0cmFuc2FjdGlvbi5zdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgdHJhbnNmb3JtLnN0ZXAoc3RlcClcbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiB0cmFuc2Zvcm1cbn1cbiIsICJpbXBvcnQgeyBDb250ZW50TWF0Y2gsIE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRCbG9ja0F0KG1hdGNoOiBDb250ZW50TWF0Y2gpOiBOb2RlVHlwZSB8IG51bGwge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLmVkZ2VDb3VudDsgaSArPSAxKSB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSBtYXRjaC5lZGdlKGkpXG5cbiAgICBpZiAodHlwZS5pc1RleHRibG9jayAmJiAhdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpIHtcbiAgICAgIHJldHVybiB0eXBlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IE5vZGVXaXRoUG9zLCBQcmVkaWNhdGUgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDaGlsZHJlbihub2RlOiBQcm9zZU1pcnJvck5vZGUsIHByZWRpY2F0ZTogUHJlZGljYXRlKTogTm9kZVdpdGhQb3NbXSB7XG4gIGNvbnN0IG5vZGVzV2l0aFBvczogTm9kZVdpdGhQb3NbXSA9IFtdXG5cbiAgbm9kZS5kZXNjZW5kYW50cygoY2hpbGQsIHBvcykgPT4ge1xuICAgIGlmIChwcmVkaWNhdGUoY2hpbGQpKSB7XG4gICAgICBub2Rlc1dpdGhQb3MucHVzaCh7XG4gICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICBwb3MsXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbm9kZXNXaXRoUG9zXG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBOb2RlV2l0aFBvcywgUHJlZGljYXRlLCBSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG4vKipcbiAqIFNhbWUgYXMgYGZpbmRDaGlsZHJlbmAgYnV0IHNlYXJjaGVzIG9ubHkgd2l0aGluIGEgYHJhbmdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDaGlsZHJlbkluUmFuZ2UoXG4gIG5vZGU6IFByb3NlTWlycm9yTm9kZSxcbiAgcmFuZ2U6IFJhbmdlLFxuICBwcmVkaWNhdGU6IFByZWRpY2F0ZSxcbik6IE5vZGVXaXRoUG9zW10ge1xuICBjb25zdCBub2Rlc1dpdGhQb3M6IE5vZGVXaXRoUG9zW10gPSBbXVxuXG4gIC8vIGlmIChyYW5nZS5mcm9tID09PSByYW5nZS50bykge1xuICAvLyAgIGNvbnN0IG5vZGVBdCA9IG5vZGUubm9kZUF0KHJhbmdlLmZyb20pXG5cbiAgLy8gICBpZiAobm9kZUF0KSB7XG4gIC8vICAgICBub2Rlc1dpdGhQb3MucHVzaCh7XG4gIC8vICAgICAgIG5vZGU6IG5vZGVBdCxcbiAgLy8gICAgICAgcG9zOiByYW5nZS5mcm9tLFxuICAvLyAgICAgfSlcbiAgLy8gICB9XG4gIC8vIH1cblxuICBub2RlLm5vZGVzQmV0d2VlbihyYW5nZS5mcm9tLCByYW5nZS50bywgKGNoaWxkLCBwb3MpID0+IHtcbiAgICBpZiAocHJlZGljYXRlKGNoaWxkKSkge1xuICAgICAgbm9kZXNXaXRoUG9zLnB1c2goe1xuICAgICAgICBub2RlOiBjaGlsZCxcbiAgICAgICAgcG9zLFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG5vZGVzV2l0aFBvc1xufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlLCBSZXNvbHZlZFBvcyB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IFByZWRpY2F0ZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudE5vZGVDbG9zZXN0VG9Qb3MoXG4gICRwb3M6IFJlc29sdmVkUG9zLFxuICBwcmVkaWNhdGU6IFByZWRpY2F0ZSxcbik6XG4gIHwge1xuICAgICAgcG9zOiBudW1iZXJcbiAgICAgIHN0YXJ0OiBudW1iZXJcbiAgICAgIGRlcHRoOiBudW1iZXJcbiAgICAgIG5vZGU6IFByb3NlTWlycm9yTm9kZVxuICAgIH1cbiAgfCB1bmRlZmluZWQge1xuICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aDsgaSA+IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IG5vZGUgPSAkcG9zLm5vZGUoaSlcblxuICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvczogaSA+IDAgPyAkcG9zLmJlZm9yZShpKSA6IDAsXG4gICAgICAgIHN0YXJ0OiAkcG9zLnN0YXJ0KGkpLFxuICAgICAgICBkZXB0aDogaSxcbiAgICAgICAgbm9kZSxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBQcmVkaWNhdGUgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGZpbmRQYXJlbnROb2RlQ2xvc2VzdFRvUG9zIH0gZnJvbSAnLi9maW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1Bvcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQYXJlbnROb2RlKHByZWRpY2F0ZTogUHJlZGljYXRlKSB7XG4gIHJldHVybiAoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IGZpbmRQYXJlbnROb2RlQ2xvc2VzdFRvUG9zKHNlbGVjdGlvbi4kZnJvbSwgcHJlZGljYXRlKVxufVxuIiwgImltcG9ydCB7IERPTVNlcmlhbGl6ZXIsIEZyYWdtZW50LCBTY2hlbWEgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SFRNTEZyb21GcmFnbWVudChmcmFnbWVudDogRnJhZ21lbnQsIHNjaGVtYTogU2NoZW1hKTogc3RyaW5nIHtcbiAgY29uc3QgZG9jdW1lbnRGcmFnbWVudCA9IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYShzY2hlbWEpLnNlcmlhbGl6ZUZyYWdtZW50KGZyYWdtZW50KVxuXG4gIGNvbnN0IHRlbXBvcmFyeURvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KClcbiAgY29uc3QgY29udGFpbmVyID0gdGVtcG9yYXJ5RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcblxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnRGcmFnbWVudClcblxuICByZXR1cm4gY29udGFpbmVyLmlubmVySFRNTFxufVxuIiwgImltcG9ydCB7IFNjaGVtYSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4uL0VkaXRvci5qcydcbmltcG9ydCB7IEV4dGVuc2lvbk1hbmFnZXIgfSBmcm9tICcuLi9FeHRlbnNpb25NYW5hZ2VyLmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQnlSZXNvbHZlZEV4dGVuc2lvbnMgfSBmcm9tICcuL2dldFNjaGVtYUJ5UmVzb2x2ZWRFeHRlbnNpb25zLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hKGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsIGVkaXRvcj86IEVkaXRvcik6IFNjaGVtYSB7XG4gIGNvbnN0IHJlc29sdmVkRXh0ZW5zaW9ucyA9IEV4dGVuc2lvbk1hbmFnZXIucmVzb2x2ZShleHRlbnNpb25zKVxuXG4gIHJldHVybiBnZXRTY2hlbWFCeVJlc29sdmVkRXh0ZW5zaW9ucyhyZXNvbHZlZEV4dGVuc2lvbnMsIGVkaXRvcilcbn1cbiIsICJpbXBvcnQgeyBOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgRXh0ZW5zaW9ucywgSlNPTkNvbnRlbnQgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGdldEhUTUxGcm9tRnJhZ21lbnQgfSBmcm9tICcuL2dldEhUTUxGcm9tRnJhZ21lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWEgfSBmcm9tICcuL2dldFNjaGVtYS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSFRNTChkb2M6IEpTT05Db250ZW50LCBleHRlbnNpb25zOiBFeHRlbnNpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKGV4dGVuc2lvbnMpXG4gIGNvbnN0IGNvbnRlbnROb2RlID0gTm9kZS5mcm9tSlNPTihzY2hlbWEsIGRvYylcblxuICByZXR1cm4gZ2V0SFRNTEZyb21GcmFnbWVudChjb250ZW50Tm9kZS5jb250ZW50LCBzY2hlbWEpXG59XG4iLCAiaW1wb3J0IHsgRE9NUGFyc2VyIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZWxlbWVudEZyb21TdHJpbmcgfSBmcm9tICcuLi91dGlsaXRpZXMvZWxlbWVudEZyb21TdHJpbmcuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWEgfSBmcm9tICcuL2dldFNjaGVtYS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSlNPTihodG1sOiBzdHJpbmcsIGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKGV4dGVuc2lvbnMpXG4gIGNvbnN0IGRvbSA9IGVsZW1lbnRGcm9tU3RyaW5nKGh0bWwpXG5cbiAgcmV0dXJuIERPTVBhcnNlci5mcm9tU2NoZW1hKHNjaGVtYSkucGFyc2UoZG9tKS50b0pTT04oKVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgVGV4dFNlcmlhbGl6ZXIgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGdldFRleHRCZXR3ZWVuIH0gZnJvbSAnLi9nZXRUZXh0QmV0d2Vlbi5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHQoXG4gIG5vZGU6IFByb3NlTWlycm9yTm9kZSxcbiAgb3B0aW9ucz86IHtcbiAgICBibG9ja1NlcGFyYXRvcj86IHN0cmluZ1xuICAgIHRleHRTZXJpYWxpemVycz86IFJlY29yZDxzdHJpbmcsIFRleHRTZXJpYWxpemVyPlxuICB9LFxuKSB7XG4gIGNvbnN0IHJhbmdlID0ge1xuICAgIGZyb206IDAsXG4gICAgdG86IG5vZGUuY29udGVudC5zaXplLFxuICB9XG5cbiAgcmV0dXJuIGdldFRleHRCZXR3ZWVuKG5vZGUsIHJhbmdlLCBvcHRpb25zKVxufVxuIiwgImltcG9ydCB7IE5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb25zLCBKU09OQ29udGVudCwgVGV4dFNlcmlhbGl6ZXIgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGdldFNjaGVtYSB9IGZyb20gJy4vZ2V0U2NoZW1hLmpzJ1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4vZ2V0VGV4dC5qcydcbmltcG9ydCB7IGdldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEgfSBmcm9tICcuL2dldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRleHQoXG4gIGRvYzogSlNPTkNvbnRlbnQsXG4gIGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMsXG4gIG9wdGlvbnM/OiB7XG4gICAgYmxvY2tTZXBhcmF0b3I/OiBzdHJpbmdcbiAgICB0ZXh0U2VyaWFsaXplcnM/OiBSZWNvcmQ8c3RyaW5nLCBUZXh0U2VyaWFsaXplcj5cbiAgfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgYmxvY2tTZXBhcmF0b3IgPSAnXFxuXFxuJywgdGV4dFNlcmlhbGl6ZXJzID0ge30gfSA9IG9wdGlvbnMgfHwge31cbiAgY29uc3Qgc2NoZW1hID0gZ2V0U2NoZW1hKGV4dGVuc2lvbnMpXG4gIGNvbnN0IGNvbnRlbnROb2RlID0gTm9kZS5mcm9tSlNPTihzY2hlbWEsIGRvYylcblxuICByZXR1cm4gZ2V0VGV4dChjb250ZW50Tm9kZSwge1xuICAgIGJsb2NrU2VwYXJhdG9yLFxuICAgIHRleHRTZXJpYWxpemVyczoge1xuICAgICAgLi4uZ2V0VGV4dFNlcmlhbGl6ZXJzRnJvbVNjaGVtYShzY2hlbWEpLFxuICAgICAgLi4udGV4dFNlcmlhbGl6ZXJzLFxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgTm9kZSwgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4vZ2V0Tm9kZVR5cGUuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlQXR0cmlidXRlcyhcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCB0eXBlID0gZ2V0Tm9kZVR5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7IGZyb20sIHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb25cbiAgY29uc3Qgbm9kZXM6IE5vZGVbXSA9IFtdXG5cbiAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgbm9kZXMucHVzaChub2RlKVxuICB9KVxuXG4gIGNvbnN0IG5vZGUgPSBub2Rlcy5yZXZlcnNlKCkuZmluZChub2RlSXRlbSA9PiBub2RlSXRlbS50eXBlLm5hbWUgPT09IHR5cGUubmFtZSlcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHJldHVybiB7IC4uLm5vZGUuYXR0cnMgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGdldE1hcmtBdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZXRNYXJrQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IGdldE5vZGVBdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZXROb2RlQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IGdldFNjaGVtYVR5cGVOYW1lQnlOYW1lIH0gZnJvbSAnLi9nZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXMoXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZSxcbiAgdHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUgfCBNYXJrVHlwZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUoXG4gICAgdHlwZW9mIHR5cGVPck5hbWUgPT09ICdzdHJpbmcnID8gdHlwZU9yTmFtZSA6IHR5cGVPck5hbWUubmFtZSxcbiAgICBzdGF0ZS5zY2hlbWEsXG4gIClcblxuICBpZiAoc2NoZW1hVHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgcmV0dXJuIGdldE5vZGVBdHRyaWJ1dGVzKHN0YXRlLCB0eXBlT3JOYW1lIGFzIE5vZGVUeXBlKVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdtYXJrJykge1xuICAgIHJldHVybiBnZXRNYXJrQXR0cmlidXRlcyhzdGF0ZSwgdHlwZU9yTmFtZSBhcyBNYXJrVHlwZSlcbiAgfVxuXG4gIHJldHVybiB7fVxufVxuIiwgIi8qKlxuICogUmVtb3ZlcyBkdXBsaWNhdGVkIHZhbHVlcyB3aXRoaW4gYW4gYXJyYXkuXG4gKiBTdXBwb3J0cyBudW1iZXJzLCBzdHJpbmdzIGFuZCBvYmplY3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRlczxUPihhcnJheTogVFtdLCBieSA9IEpTT04uc3RyaW5naWZ5KTogVFtdIHtcbiAgY29uc3Qgc2VlbjogUmVjb3JkPGFueSwgYW55PiA9IHt9XG5cbiAgcmV0dXJuIGFycmF5LmZpbHRlcihpdGVtID0+IHtcbiAgICBjb25zdCBrZXkgPSBieShpdGVtKVxuXG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWVuLCBrZXkpXG4gICAgICA/IGZhbHNlXG4gICAgICA6IChzZWVuW2tleV0gPSB0cnVlKVxuICB9KVxufVxuIiwgImltcG9ydCB7IFN0ZXAsIFRyYW5zZm9ybSB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgcmVtb3ZlRHVwbGljYXRlcyB9IGZyb20gJy4uL3V0aWxpdGllcy9yZW1vdmVEdXBsaWNhdGVzLmpzJ1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VkUmFuZ2UgPSB7XG4gIG9sZFJhbmdlOiBSYW5nZSxcbiAgbmV3UmFuZ2U6IFJhbmdlLFxufVxuXG4vKipcbiAqIFJlbW92ZXMgZHVwbGljYXRlZCByYW5nZXMgYW5kIHJhbmdlcyB0aGF0IGFyZVxuICogZnVsbHkgY2FwdHVyZWQgYnkgb3RoZXIgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiBzaW1wbGlmeUNoYW5nZWRSYW5nZXMoY2hhbmdlczogQ2hhbmdlZFJhbmdlW10pOiBDaGFuZ2VkUmFuZ2VbXSB7XG4gIGNvbnN0IHVuaXF1ZUNoYW5nZXMgPSByZW1vdmVEdXBsaWNhdGVzKGNoYW5nZXMpXG5cbiAgcmV0dXJuIHVuaXF1ZUNoYW5nZXMubGVuZ3RoID09PSAxXG4gICAgPyB1bmlxdWVDaGFuZ2VzXG4gICAgOiB1bmlxdWVDaGFuZ2VzLmZpbHRlcigoY2hhbmdlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmVzdCA9IHVuaXF1ZUNoYW5nZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcblxuICAgICAgcmV0dXJuICFyZXN0LnNvbWUob3RoZXJDaGFuZ2UgPT4ge1xuICAgICAgICByZXR1cm4gY2hhbmdlLm9sZFJhbmdlLmZyb20gPj0gb3RoZXJDaGFuZ2Uub2xkUmFuZ2UuZnJvbVxuICAgICAgICAgICYmIGNoYW5nZS5vbGRSYW5nZS50byA8PSBvdGhlckNoYW5nZS5vbGRSYW5nZS50b1xuICAgICAgICAgICYmIGNoYW5nZS5uZXdSYW5nZS5mcm9tID49IG90aGVyQ2hhbmdlLm5ld1JhbmdlLmZyb21cbiAgICAgICAgICAmJiBjaGFuZ2UubmV3UmFuZ2UudG8gPD0gb3RoZXJDaGFuZ2UubmV3UmFuZ2UudG9cbiAgICAgIH0pXG4gICAgfSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBjaGFuZ2VkIHJhbmdlc1xuICogYmFzZWQgb24gdGhlIGZpcnN0IGFuZCBsYXN0IHN0YXRlIG9mIGFsbCBzdGVwcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5nZWRSYW5nZXModHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBDaGFuZ2VkUmFuZ2VbXSB7XG4gIGNvbnN0IHsgbWFwcGluZywgc3RlcHMgfSA9IHRyYW5zZm9ybVxuICBjb25zdCBjaGFuZ2VzOiBDaGFuZ2VkUmFuZ2VbXSA9IFtdXG5cbiAgbWFwcGluZy5tYXBzLmZvckVhY2goKHN0ZXBNYXAsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgcmFuZ2VzOiBSYW5nZVtdID0gW11cblxuICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHN0ZXAgY2hhbmdlcyB3aGVyZSBubyByYW5nZSB3YXMgYWN0dWFsbHkgYWx0ZXJlZFxuICAgIC8vIGUuZy4gd2hlbiBzZXR0aW5nIGEgbWFyaywgbm9kZSBhdHRyaWJ1dGUsIGV0Yy5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCFzdGVwTWFwLnJhbmdlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHN0ZXBzW2luZGV4XSBhcyBTdGVwICYge1xuICAgICAgICBmcm9tPzogbnVtYmVyLFxuICAgICAgICB0bz86IG51bWJlcixcbiAgICAgIH1cblxuICAgICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCB8fCB0byA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByYW5nZXMucHVzaCh7IGZyb20sIHRvIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBNYXAuZm9yRWFjaCgoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByYW5nZXMuZm9yRWFjaCgoeyBmcm9tLCB0byB9KSA9PiB7XG4gICAgICBjb25zdCBuZXdTdGFydCA9IG1hcHBpbmcuc2xpY2UoaW5kZXgpLm1hcChmcm9tLCAtMSlcbiAgICAgIGNvbnN0IG5ld0VuZCA9IG1hcHBpbmcuc2xpY2UoaW5kZXgpLm1hcCh0bylcbiAgICAgIGNvbnN0IG9sZFN0YXJ0ID0gbWFwcGluZy5pbnZlcnQoKS5tYXAobmV3U3RhcnQsIC0xKVxuICAgICAgY29uc3Qgb2xkRW5kID0gbWFwcGluZy5pbnZlcnQoKS5tYXAobmV3RW5kKVxuXG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBvbGRSYW5nZToge1xuICAgICAgICAgIGZyb206IG9sZFN0YXJ0LFxuICAgICAgICAgIHRvOiBvbGRFbmQsXG4gICAgICAgIH0sXG4gICAgICAgIG5ld1JhbmdlOiB7XG4gICAgICAgICAgZnJvbTogbmV3U3RhcnQsXG4gICAgICAgICAgdG86IG5ld0VuZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gc2ltcGxpZnlDaGFuZ2VkUmFuZ2VzKGNoYW5nZXMpXG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBKU09OQ29udGVudCB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5pbnRlcmZhY2UgRGVidWdKU09OQ29udGVudCBleHRlbmRzIEpTT05Db250ZW50IHtcbiAgZnJvbTogbnVtYmVyXG4gIHRvOiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlYnVnSlNPTihub2RlOiBQcm9zZU1pcnJvck5vZGUsIHN0YXJ0T2Zmc2V0ID0gMCk6IERlYnVnSlNPTkNvbnRlbnQge1xuICBjb25zdCBpc1RvcE5vZGUgPSBub2RlLnR5cGUgPT09IG5vZGUudHlwZS5zY2hlbWEudG9wTm9kZVR5cGVcbiAgY29uc3QgaW5jcmVtZW50ID0gaXNUb3BOb2RlID8gMCA6IDFcbiAgY29uc3QgZnJvbSA9IHN0YXJ0T2Zmc2V0XG4gIGNvbnN0IHRvID0gZnJvbSArIG5vZGUubm9kZVNpemVcbiAgY29uc3QgbWFya3MgPSBub2RlLm1hcmtzLm1hcChtYXJrID0+IHtcbiAgICBjb25zdCBvdXRwdXQ6IHsgdHlwZTogc3RyaW5nOyBhdHRycz86IFJlY29yZDxzdHJpbmcsIGFueT4gfSA9IHtcbiAgICAgIHR5cGU6IG1hcmsudHlwZS5uYW1lLFxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhtYXJrLmF0dHJzKS5sZW5ndGgpIHtcbiAgICAgIG91dHB1dC5hdHRycyA9IHsgLi4ubWFyay5hdHRycyB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dFxuICB9KVxuICBjb25zdCBhdHRycyA9IHsgLi4ubm9kZS5hdHRycyB9XG4gIGNvbnN0IG91dHB1dDogRGVidWdKU09OQ29udGVudCA9IHtcbiAgICB0eXBlOiBub2RlLnR5cGUubmFtZSxcbiAgICBmcm9tLFxuICAgIHRvLFxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGF0dHJzKS5sZW5ndGgpIHtcbiAgICBvdXRwdXQuYXR0cnMgPSBhdHRyc1xuICB9XG5cbiAgaWYgKG1hcmtzLmxlbmd0aCkge1xuICAgIG91dHB1dC5tYXJrcyA9IG1hcmtzXG4gIH1cblxuICBpZiAobm9kZS5jb250ZW50LmNoaWxkQ291bnQpIHtcbiAgICBvdXRwdXQuY29udGVudCA9IFtdXG5cbiAgICBub2RlLmZvckVhY2goKGNoaWxkLCBvZmZzZXQpID0+IHtcbiAgICAgIG91dHB1dC5jb250ZW50Py5wdXNoKGdldERlYnVnSlNPTihjaGlsZCwgc3RhcnRPZmZzZXQgKyBvZmZzZXQgKyBpbmNyZW1lbnQpKVxuICAgIH0pXG4gIH1cblxuICBpZiAobm9kZS50ZXh0KSB7XG4gICAgb3V0cHV0LnRleHQgPSBub2RlLnRleHRcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRcbn1cbiIsICJpbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IE1hcmtSYW5nZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgZ2V0TWFya1JhbmdlIH0gZnJvbSAnLi9nZXRNYXJrUmFuZ2UuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrc0JldHdlZW4oZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBkb2M6IFByb3NlTWlycm9yTm9kZSk6IE1hcmtSYW5nZVtdIHtcbiAgY29uc3QgbWFya3M6IE1hcmtSYW5nZVtdID0gW11cblxuICAvLyBnZXQgYWxsIGluY2x1c2l2ZSBtYXJrcyBvbiBlbXB0eSBzZWxlY3Rpb25cbiAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgZG9jXG4gICAgICAucmVzb2x2ZShmcm9tKVxuICAgICAgLm1hcmtzKClcbiAgICAgIC5mb3JFYWNoKG1hcmsgPT4ge1xuICAgICAgICBjb25zdCAkcG9zID0gZG9jLnJlc29sdmUoZnJvbSAtIDEpXG4gICAgICAgIGNvbnN0IHJhbmdlID0gZ2V0TWFya1JhbmdlKCRwb3MsIG1hcmsudHlwZSlcblxuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBtYXJrcy5wdXNoKHtcbiAgICAgICAgICBtYXJrLFxuICAgICAgICAgIC4uLnJhbmdlLFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgfSBlbHNlIHtcbiAgICBkb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICBtYXJrcy5wdXNoKFxuICAgICAgICAuLi5ub2RlLm1hcmtzLm1hcChtYXJrID0+ICh7XG4gICAgICAgICAgZnJvbTogcG9zLFxuICAgICAgICAgIHRvOiBwb3MgKyBub2RlLm5vZGVTaXplLFxuICAgICAgICAgIG1hcmssXG4gICAgICAgIH0pKSxcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG1hcmtzXG59XG4iLCAiaW1wb3J0IHsgTm9kZSwgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBub2RlIG9mIGEgZ2l2ZW4gdHlwZSBvciBuYW1lIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqIEBwYXJhbSBzdGF0ZSBUaGUgZWRpdG9yIHN0YXRlLlxuICogQHBhcmFtIHR5cGVPck5hbWUgVGhlIG5vZGUgdHlwZSBvciBuYW1lLlxuICogQHBhcmFtIHBvcyBUaGUgcG9zaXRpb24gdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20uXG4gKiBAcGFyYW0gbWF4RGVwdGggVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICogQHJldHVybnMgVGhlIG5vZGUgYW5kIHRoZSBkZXB0aCBhcyBhbiBhcnJheS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vZGVBdFBvc2l0aW9uID0gKHN0YXRlOiBFZGl0b3JTdGF0ZSwgdHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIHBvczogbnVtYmVyLCBtYXhEZXB0aCA9IDIwKSA9PiB7XG4gIGNvbnN0ICRwb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpXG5cbiAgbGV0IGN1cnJlbnREZXB0aCA9IG1heERlcHRoXG4gIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IG51bGxcblxuICB3aGlsZSAoY3VycmVudERlcHRoID4gMCAmJiBub2RlID09PSBudWxsKSB7XG4gICAgY29uc3QgY3VycmVudE5vZGUgPSAkcG9zLm5vZGUoY3VycmVudERlcHRoKVxuXG4gICAgaWYgKGN1cnJlbnROb2RlPy50eXBlLm5hbWUgPT09IHR5cGVPck5hbWUpIHtcbiAgICAgIG5vZGUgPSBjdXJyZW50Tm9kZVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50RGVwdGggLT0gMVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbm9kZSwgY3VycmVudERlcHRoXSBhcyBbTm9kZSB8IG51bGwsIG51bWJlcl1cbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb25BdHRyaWJ1dGUgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwbGl0dGVkQXR0cmlidXRlcyhcbiAgZXh0ZW5zaW9uQXR0cmlidXRlczogRXh0ZW5zaW9uQXR0cmlidXRlW10sXG4gIHR5cGVOYW1lOiBzdHJpbmcsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3RcbiAgICAuZW50cmllcyhhdHRyaWJ1dGVzKVxuICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4ge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uQXR0cmlidXRlID0gZXh0ZW5zaW9uQXR0cmlidXRlcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSB0eXBlTmFtZSAmJiBpdGVtLm5hbWUgPT09IG5hbWVcbiAgICAgIH0pXG5cbiAgICAgIGlmICghZXh0ZW5zaW9uQXR0cmlidXRlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXh0ZW5zaW9uQXR0cmlidXRlLmF0dHJpYnV0ZS5rZWVwT25TcGxpdFxuICAgIH0pKVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgTWFya1JhbmdlIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBvYmplY3RJbmNsdWRlcyB9IGZyb20gJy4uL3V0aWxpdGllcy9vYmplY3RJbmNsdWRlcy5qcydcbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi9nZXRNYXJrVHlwZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya0FjdGl2ZShcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICB0eXBlT3JOYW1lOiBNYXJrVHlwZSB8IHN0cmluZyB8IG51bGwsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IGJvb2xlYW4ge1xuICBjb25zdCB7IGVtcHR5LCByYW5nZXMgfSA9IHN0YXRlLnNlbGVjdGlvblxuICBjb25zdCB0eXBlID0gdHlwZU9yTmFtZSA/IGdldE1hcmtUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSkgOiBudWxsXG5cbiAgaWYgKGVtcHR5KSB7XG4gICAgcmV0dXJuICEhKHN0YXRlLnN0b3JlZE1hcmtzIHx8IHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKVxuICAgICAgLmZpbHRlcihtYXJrID0+IHtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlLm5hbWUgPT09IG1hcmsudHlwZS5uYW1lXG4gICAgICB9KVxuICAgICAgLmZpbmQobWFyayA9PiBvYmplY3RJbmNsdWRlcyhtYXJrLmF0dHJzLCBhdHRyaWJ1dGVzLCB7IHN0cmljdDogZmFsc2UgfSkpXG4gIH1cblxuICBsZXQgc2VsZWN0aW9uUmFuZ2UgPSAwXG4gIGNvbnN0IG1hcmtSYW5nZXM6IE1hcmtSYW5nZVtdID0gW11cblxuICByYW5nZXMuZm9yRWFjaCgoeyAkZnJvbSwgJHRvIH0pID0+IHtcbiAgICBjb25zdCBmcm9tID0gJGZyb20ucG9zXG4gICAgY29uc3QgdG8gPSAkdG8ucG9zXG5cbiAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0ICYmICFub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tID0gTWF0aC5tYXgoZnJvbSwgcG9zKVxuICAgICAgY29uc3QgcmVsYXRpdmVUbyA9IE1hdGgubWluKHRvLCBwb3MgKyBub2RlLm5vZGVTaXplKVxuICAgICAgY29uc3QgcmFuZ2UgPSByZWxhdGl2ZVRvIC0gcmVsYXRpdmVGcm9tXG5cbiAgICAgIHNlbGVjdGlvblJhbmdlICs9IHJhbmdlXG5cbiAgICAgIG1hcmtSYW5nZXMucHVzaChcbiAgICAgICAgLi4ubm9kZS5tYXJrcy5tYXAobWFyayA9PiAoe1xuICAgICAgICAgIG1hcmssXG4gICAgICAgICAgZnJvbTogcmVsYXRpdmVGcm9tLFxuICAgICAgICAgIHRvOiByZWxhdGl2ZVRvLFxuICAgICAgICB9KSksXG4gICAgICApXG4gICAgfSlcbiAgfSlcblxuICBpZiAoc2VsZWN0aW9uUmFuZ2UgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSByYW5nZSBvZiBtYXRjaGVkIG1hcmtcbiAgY29uc3QgbWF0Y2hlZFJhbmdlID0gbWFya1Jhbmdlc1xuICAgIC5maWx0ZXIobWFya1JhbmdlID0+IHtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZS5uYW1lID09PSBtYXJrUmFuZ2UubWFyay50eXBlLm5hbWVcbiAgICB9KVxuICAgIC5maWx0ZXIobWFya1JhbmdlID0+IG9iamVjdEluY2x1ZGVzKG1hcmtSYW5nZS5tYXJrLmF0dHJzLCBhdHRyaWJ1dGVzLCB7IHN0cmljdDogZmFsc2UgfSkpXG4gICAgLnJlZHVjZSgoc3VtLCBtYXJrUmFuZ2UpID0+IHN1bSArIG1hcmtSYW5nZS50byAtIG1hcmtSYW5nZS5mcm9tLCAwKVxuXG4gIC8vIGNhbGN1bGF0ZSByYW5nZSBvZiBtYXJrcyB0aGF0IGV4Y2x1ZGVzIHRoZSBzZWFyY2hlZCBtYXJrXG4gIC8vIGZvciBleGFtcGxlIGBjb2RlYCBkb2VzbuKAmXQgYWxsb3cgYW55IG90aGVyIG1hcmtzXG4gIGNvbnN0IGV4Y2x1ZGVkUmFuZ2UgPSBtYXJrUmFuZ2VzXG4gICAgLmZpbHRlcihtYXJrUmFuZ2UgPT4ge1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXJrUmFuZ2UubWFyay50eXBlICE9PSB0eXBlICYmIG1hcmtSYW5nZS5tYXJrLnR5cGUuZXhjbHVkZXModHlwZSlcbiAgICB9KVxuICAgIC5yZWR1Y2UoKHN1bSwgbWFya1JhbmdlKSA9PiBzdW0gKyBtYXJrUmFuZ2UudG8gLSBtYXJrUmFuZ2UuZnJvbSwgMClcblxuICAvLyB3ZSBvbmx5IGluY2x1ZGUgdGhlIHJlc3VsdCBvZiBgZXhjbHVkZWRSYW5nZWBcbiAgLy8gaWYgdGhlcmUgaXMgYSBtYXRjaCBhdCBhbGxcbiAgY29uc3QgcmFuZ2UgPSBtYXRjaGVkUmFuZ2UgPiAwID8gbWF0Y2hlZFJhbmdlICsgZXhjbHVkZWRSYW5nZSA6IG1hdGNoZWRSYW5nZVxuXG4gIHJldHVybiByYW5nZSA+PSBzZWxlY3Rpb25SYW5nZVxufVxuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUgfSBmcm9tICcuL2dldFNjaGVtYVR5cGVOYW1lQnlOYW1lLmpzJ1xuaW1wb3J0IHsgaXNNYXJrQWN0aXZlIH0gZnJvbSAnLi9pc01hcmtBY3RpdmUuanMnXG5pbXBvcnQgeyBpc05vZGVBY3RpdmUgfSBmcm9tICcuL2lzTm9kZUFjdGl2ZS5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aXZlKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIG5hbWU6IHN0cmluZyB8IG51bGwsXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbik6IGJvb2xlYW4ge1xuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gaXNOb2RlQWN0aXZlKHN0YXRlLCBudWxsLCBhdHRyaWJ1dGVzKSB8fCBpc01hcmtBY3RpdmUoc3RhdGUsIG51bGwsIGF0dHJpYnV0ZXMpXG4gIH1cblxuICBjb25zdCBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZU5hbWVCeU5hbWUobmFtZSwgc3RhdGUuc2NoZW1hKVxuXG4gIGlmIChzY2hlbWFUeXBlID09PSAnbm9kZScpIHtcbiAgICByZXR1cm4gaXNOb2RlQWN0aXZlKHN0YXRlLCBuYW1lLCBhdHRyaWJ1dGVzKVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdtYXJrJykge1xuICAgIHJldHVybiBpc01hcmtBY3RpdmUoc3RhdGUsIG5hbWUsIGF0dHJpYnV0ZXMpXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IGZpbmRQYXJlbnROb2RlIH0gZnJvbSAnLi9maW5kUGFyZW50Tm9kZS5qcydcblxuZXhwb3J0IGNvbnN0IGlzQXRFbmRPZk5vZGUgPSAoc3RhdGU6IEVkaXRvclN0YXRlLCBub2RlVHlwZT86IHN0cmluZykgPT4ge1xuICBjb25zdCB7ICRmcm9tLCAkdG8sICRhbmNob3IgfSA9IHN0YXRlLnNlbGVjdGlvblxuXG4gIGlmIChub2RlVHlwZSkge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IG5vZGUudHlwZS5uYW1lID09PSBub2RlVHlwZSkoc3RhdGUuc2VsZWN0aW9uKVxuXG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCAkcGFyZW50UG9zID0gc3RhdGUuZG9jLnJlc29sdmUocGFyZW50Tm9kZS5wb3MgKyAxKVxuXG4gICAgaWYgKCRhbmNob3IucG9zICsgMSA9PT0gJHBhcmVudFBvcy5lbmQoKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICgkdG8ucGFyZW50T2Zmc2V0IDwgJHRvLnBhcmVudC5ub2RlU2l6ZSAtIDIgfHwgJGZyb20ucG9zICE9PSAkdG8ucG9zKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGNvbnN0IGlzQXRTdGFydE9mTm9kZSA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb25cblxuICBpZiAoJGZyb20ucGFyZW50T2Zmc2V0ID4gMCB8fCAkZnJvbS5wb3MgIT09ICR0by5wb3MpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuLi9oZWxwZXJzL2dldEV4dGVuc2lvbkZpZWxkLmpzJ1xuaW1wb3J0IHsgTm9kZUNvbmZpZyB9IGZyb20gJy4uL2luZGV4LmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IHNwbGl0RXh0ZW5zaW9ucyB9IGZyb20gJy4vc3BsaXRFeHRlbnNpb25zLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0KG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uczogRXh0ZW5zaW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IG5vZGVFeHRlbnNpb25zIH0gPSBzcGxpdEV4dGVuc2lvbnMoZXh0ZW5zaW9ucylcbiAgY29uc3QgZXh0ZW5zaW9uID0gbm9kZUV4dGVuc2lvbnMuZmluZChpdGVtID0+IGl0ZW0ubmFtZSA9PT0gbmFtZSlcblxuICBpZiAoIWV4dGVuc2lvbikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgfVxuICBjb25zdCBncm91cCA9IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZDxOb2RlQ29uZmlnWydncm91cCddPihleHRlbnNpb24sICdncm91cCcsIGNvbnRleHQpKVxuXG4gIGlmICh0eXBlb2YgZ3JvdXAgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZ3JvdXAuc3BsaXQoJyAnKS5pbmNsdWRlcygnbGlzdCcpXG59XG4iLCAiaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlRW1wdHkobm9kZTogUHJvc2VNaXJyb3JOb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRDb250ZW50ID0gbm9kZS50eXBlLmNyZWF0ZUFuZEZpbGwoKT8udG9KU09OKClcbiAgY29uc3QgY29udGVudCA9IG5vZGUudG9KU09OKClcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGVmYXVsdENvbnRlbnQpID09PSBKU09OLnN0cmluZ2lmeShjb250ZW50KVxufVxuIiwgImltcG9ydCB7IE5vZGVTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlU2VsZWN0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTm9kZVNlbGVjdGlvbiB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb25cbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAnQHRpcHRhcC9wbS92aWV3J1xuXG5pbXBvcnQgeyBtaW5NYXggfSBmcm9tICcuLi91dGlsaXRpZXMvbWluTWF4LmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zVG9ET01SZWN0KHZpZXc6IEVkaXRvclZpZXcsIGZyb206IG51bWJlciwgdG86IG51bWJlcik6IERPTVJlY3Qge1xuICBjb25zdCBtaW5Qb3MgPSAwXG4gIGNvbnN0IG1heFBvcyA9IHZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZVxuICBjb25zdCByZXNvbHZlZEZyb20gPSBtaW5NYXgoZnJvbSwgbWluUG9zLCBtYXhQb3MpXG4gIGNvbnN0IHJlc29sdmVkRW5kID0gbWluTWF4KHRvLCBtaW5Qb3MsIG1heFBvcylcbiAgY29uc3Qgc3RhcnQgPSB2aWV3LmNvb3Jkc0F0UG9zKHJlc29sdmVkRnJvbSlcbiAgY29uc3QgZW5kID0gdmlldy5jb29yZHNBdFBvcyhyZXNvbHZlZEVuZCwgLTEpXG4gIGNvbnN0IHRvcCA9IE1hdGgubWluKHN0YXJ0LnRvcCwgZW5kLnRvcClcbiAgY29uc3QgYm90dG9tID0gTWF0aC5tYXgoc3RhcnQuYm90dG9tLCBlbmQuYm90dG9tKVxuICBjb25zdCBsZWZ0ID0gTWF0aC5taW4oc3RhcnQubGVmdCwgZW5kLmxlZnQpXG4gIGNvbnN0IHJpZ2h0ID0gTWF0aC5tYXgoc3RhcnQucmlnaHQsIGVuZC5yaWdodClcbiAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnRcbiAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wXG4gIGNvbnN0IHggPSBsZWZ0XG4gIGNvbnN0IHkgPSB0b3BcbiAgY29uc3QgZGF0YSA9IHtcbiAgICB0b3AsXG4gICAgYm90dG9tLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeSxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICB0b0pTT046ICgpID0+IGRhdGEsXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBNYXJrVHlwZSwgUmVzb2x2ZWRQb3MgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFRyYW5zYWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgZ2V0TWFya0F0dHJpYnV0ZXMgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtBdHRyaWJ1dGVzLmpzJ1xuaW1wb3J0IHsgZ2V0TWFya1R5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtUeXBlLmpzJ1xuaW1wb3J0IHsgaXNUZXh0U2VsZWN0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXRNYXJrOiB7XG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIG1hcmsgd2l0aCBuZXcgYXR0cmlidXRlcy5cbiAgICAgICAqL1xuICAgICAgc2V0TWFyazogKHR5cGVPck5hbWU6IHN0cmluZyB8IE1hcmtUeXBlLCBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5TZXRNYXJrKHN0YXRlOiBFZGl0b3JTdGF0ZSwgdHI6IFRyYW5zYWN0aW9uLCBuZXdNYXJrVHlwZTogTWFya1R5cGUpIHtcbiAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHRyXG4gIGxldCBjdXJzb3I6IFJlc29sdmVkUG9zIHwgbnVsbCA9IG51bGxcblxuICBpZiAoaXNUZXh0U2VsZWN0aW9uKHNlbGVjdGlvbikpIHtcbiAgICBjdXJzb3IgPSBzZWxlY3Rpb24uJGN1cnNvclxuICB9XG5cbiAgaWYgKGN1cnNvcikge1xuICAgIGNvbnN0IGN1cnJlbnRNYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzID8/IGN1cnNvci5tYXJrcygpXG5cbiAgICAvLyBUaGVyZSBjYW4gYmUgbm8gY3VycmVudCBtYXJrcyB0aGF0IGV4Y2x1ZGUgdGhlIG5ldyBtYXJrXG4gICAgcmV0dXJuIChcbiAgICAgICEhbmV3TWFya1R5cGUuaXNJblNldChjdXJyZW50TWFya3MpXG4gICAgICB8fCAhY3VycmVudE1hcmtzLnNvbWUobWFyayA9PiBtYXJrLnR5cGUuZXhjbHVkZXMobmV3TWFya1R5cGUpKVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICByZXR1cm4gcmFuZ2VzLnNvbWUoKHsgJGZyb20sICR0byB9KSA9PiB7XG4gICAgbGV0IHNvbWVOb2RlU3VwcG9ydHNNYXJrID0gJGZyb20uZGVwdGggPT09IDBcbiAgICAgID8gc3RhdGUuZG9jLmlubGluZUNvbnRlbnQgJiYgc3RhdGUuZG9jLnR5cGUuYWxsb3dzTWFya1R5cGUobmV3TWFya1R5cGUpXG4gICAgICA6IGZhbHNlXG5cbiAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKCRmcm9tLnBvcywgJHRvLnBvcywgKG5vZGUsIF9wb3MsIHBhcmVudCkgPT4ge1xuICAgICAgLy8gSWYgd2UgYWxyZWFkeSBmb3VuZCBhIG1hcmsgdGhhdCB3ZSBjYW4gZW5hYmxlLCByZXR1cm4gZmFsc2UgdG8gYnlwYXNzIHRoZSByZW1haW5pbmcgc2VhcmNoXG4gICAgICBpZiAoc29tZU5vZGVTdXBwb3J0c01hcmspIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmlzSW5saW5lKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEFsbG93c01hcmtUeXBlID0gIXBhcmVudCB8fCBwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShuZXdNYXJrVHlwZSlcbiAgICAgICAgY29uc3QgY3VycmVudE1hcmtzQWxsb3dNYXJrVHlwZSA9ICEhbmV3TWFya1R5cGUuaXNJblNldChub2RlLm1hcmtzKVxuICAgICAgICAgIHx8ICFub2RlLm1hcmtzLnNvbWUob3RoZXJNYXJrID0+IG90aGVyTWFyay50eXBlLmV4Y2x1ZGVzKG5ld01hcmtUeXBlKSlcblxuICAgICAgICBzb21lTm9kZVN1cHBvcnRzTWFyayA9IHBhcmVudEFsbG93c01hcmtUeXBlICYmIGN1cnJlbnRNYXJrc0FsbG93TWFya1R5cGVcbiAgICAgIH1cbiAgICAgIHJldHVybiAhc29tZU5vZGVTdXBwb3J0c01hcmtcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNvbWVOb2RlU3VwcG9ydHNNYXJrXG4gIH0pXG59XG5leHBvcnQgY29uc3Qgc2V0TWFyazogUmF3Q29tbWFuZHNbJ3NldE1hcmsnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7IHRyLCBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJcbiAgY29uc3QgeyBlbXB0eSwgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cbiAgY29uc3QgdHlwZSA9IGdldE1hcmtUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBpZiAoZW1wdHkpIHtcbiAgICAgIGNvbnN0IG9sZEF0dHJpYnV0ZXMgPSBnZXRNYXJrQXR0cmlidXRlcyhzdGF0ZSwgdHlwZSlcblxuICAgICAgdHIuYWRkU3RvcmVkTWFyayhcbiAgICAgICAgdHlwZS5jcmVhdGUoe1xuICAgICAgICAgIC4uLm9sZEF0dHJpYnV0ZXMsXG4gICAgICAgICAgLi4uYXR0cmlidXRlcyxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5mb3JFYWNoKHJhbmdlID0+IHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHJhbmdlLiRmcm9tLnBvc1xuICAgICAgICBjb25zdCB0byA9IHJhbmdlLiR0by5wb3NcblxuICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJpbW1lZEZyb20gPSBNYXRoLm1heChwb3MsIGZyb20pXG4gICAgICAgICAgY29uc3QgdHJpbW1lZFRvID0gTWF0aC5taW4ocG9zICsgbm9kZS5ub2RlU2l6ZSwgdG8pXG4gICAgICAgICAgY29uc3Qgc29tZUhhc01hcmsgPSBub2RlLm1hcmtzLmZpbmQobWFyayA9PiBtYXJrLnR5cGUgPT09IHR5cGUpXG5cbiAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgbWFyayBvZiB0aGlzIHR5cGVcbiAgICAgICAgICAvLyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSB0byBtZXJnZSBpdHMgYXR0cmlidXRlc1xuICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBhZGQgYSBmcmVzaCBuZXcgbWFya1xuICAgICAgICAgIGlmIChzb21lSGFzTWFyaykge1xuICAgICAgICAgICAgbm9kZS5tYXJrcy5mb3JFYWNoKG1hcmsgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gbWFyay50eXBlKSB7XG4gICAgICAgICAgICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgICAgICAgICAgIHRyaW1tZWRGcm9tLFxuICAgICAgICAgICAgICAgICAgdHJpbW1lZFRvLFxuICAgICAgICAgICAgICAgICAgdHlwZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5tYXJrLmF0dHJzLFxuICAgICAgICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ci5hZGRNYXJrKHRyaW1tZWRGcm9tLCB0cmltbWVkVG8sIHR5cGUuY3JlYXRlKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhblNldE1hcmsoc3RhdGUsIHRyLCB0eXBlKVxufVxuIiwgImltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXRNZXRhOiB7XG4gICAgICAvKipcbiAgICAgICAqIFN0b3JlIGEgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uXG4gICAgICAgKi9cbiAgICAgIHNldE1ldGE6IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNldE1ldGE6IFJhd0NvbW1hbmRzWydzZXRNZXRhJ10gPSAoa2V5LCB2YWx1ZSkgPT4gKHsgdHIgfSkgPT4ge1xuICB0ci5zZXRNZXRhKGtleSwgdmFsdWUpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQgeyBzZXRCbG9ja1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL2NvbW1hbmRzJ1xuaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc2V0Tm9kZToge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXBsYWNlIGEgZ2l2ZW4gcmFuZ2Ugd2l0aCBhIG5vZGUuXG4gICAgICAgKi9cbiAgICAgIHNldE5vZGU6ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSwgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNldE5vZGU6IFJhd0NvbW1hbmRzWydzZXROb2RlJ10gPSAodHlwZU9yTmFtZSwgYXR0cmlidXRlcyA9IHt9KSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2gsIGNoYWluIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICAvLyBUT0RPOiB1c2UgYSBmYWxsYmFjayBsaWtlIGluc2VydENvbnRlbnQ/XG4gIGlmICghdHlwZS5pc1RleHRibG9jaykge1xuICAgIGNvbnNvbGUud2FybignW3RpcHRhcCB3YXJuXTogQ3VycmVudGx5IFwic2V0Tm9kZSgpXCIgb25seSBzdXBwb3J0cyB0ZXh0IGJsb2NrIG5vZGVzLicpXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgY2hhaW4oKVxuICAgIC8vIHRyeSB0byBjb252ZXJ0IG5vZGUgdG8gZGVmYXVsdCBub2RlIGlmIG5lZWRlZFxuICAgICAgLmNvbW1hbmQoKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICBjb25zdCBjYW5TZXRCbG9jayA9IHNldEJsb2NrVHlwZSh0eXBlLCBhdHRyaWJ1dGVzKShzdGF0ZSlcblxuICAgICAgICBpZiAoY2FuU2V0QmxvY2spIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLmNsZWFyTm9kZXMoKVxuICAgICAgfSlcbiAgICAgIC5jb21tYW5kKCh7IHN0YXRlOiB1cGRhdGVkU3RhdGUgfSkgPT4ge1xuICAgICAgICByZXR1cm4gc2V0QmxvY2tUeXBlKHR5cGUsIGF0dHJpYnV0ZXMpKHVwZGF0ZWRTdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICB9KVxuICAgICAgLnJ1bigpXG4gIClcbn1cbiIsICJpbXBvcnQgeyBOb2RlU2VsZWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IG1pbk1heCB9IGZyb20gJy4uL3V0aWxpdGllcy9taW5NYXguanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzZXROb2RlU2VsZWN0aW9uOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSBOb2RlU2VsZWN0aW9uLlxuICAgICAgICovXG4gICAgICBzZXROb2RlU2VsZWN0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2V0Tm9kZVNlbGVjdGlvbjogUmF3Q29tbWFuZHNbJ3NldE5vZGVTZWxlY3Rpb24nXSA9IHBvc2l0aW9uID0+ICh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHsgZG9jIH0gPSB0clxuICAgIGNvbnN0IGZyb20gPSBtaW5NYXgocG9zaXRpb24sIDAsIGRvYy5jb250ZW50LnNpemUpXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUoZG9jLCBmcm9tKVxuXG4gICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbilcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IFJhbmdlLCBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgbWluTWF4IH0gZnJvbSAnLi4vdXRpbGl0aWVzL21pbk1heC5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHNldFRleHRTZWxlY3Rpb246IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIFRleHRTZWxlY3Rpb24uXG4gICAgICAgKi9cbiAgICAgIHNldFRleHRTZWxlY3Rpb246IChwb3NpdGlvbjogbnVtYmVyIHwgUmFuZ2UpID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNldFRleHRTZWxlY3Rpb246IFJhd0NvbW1hbmRzWydzZXRUZXh0U2VsZWN0aW9uJ10gPSBwb3NpdGlvbiA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gdHJcbiAgICBjb25zdCB7IGZyb20sIHRvIH0gPSB0eXBlb2YgcG9zaXRpb24gPT09ICdudW1iZXInID8geyBmcm9tOiBwb3NpdGlvbiwgdG86IHBvc2l0aW9uIH0gOiBwb3NpdGlvblxuICAgIGNvbnN0IG1pblBvcyA9IFRleHRTZWxlY3Rpb24uYXRTdGFydChkb2MpLmZyb21cbiAgICBjb25zdCBtYXhQb3MgPSBUZXh0U2VsZWN0aW9uLmF0RW5kKGRvYykudG9cbiAgICBjb25zdCByZXNvbHZlZEZyb20gPSBtaW5NYXgoZnJvbSwgbWluUG9zLCBtYXhQb3MpXG4gICAgY29uc3QgcmVzb2x2ZWRFbmQgPSBtaW5NYXgodG8sIG1pblBvcywgbWF4UG9zKVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgcmVzb2x2ZWRGcm9tLCByZXNvbHZlZEVuZClcblxuICAgIHRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IHNpbmtMaXN0SXRlbSBhcyBvcmlnaW5hbFNpbmtMaXN0SXRlbSB9IGZyb20gJ0B0aXB0YXAvcG0vc2NoZW1hLWxpc3QnXG5cbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzaW5rTGlzdEl0ZW06IHtcbiAgICAgIC8qKlxuICAgICAgICogU2luayB0aGUgbGlzdCBpdGVtIGRvd24gaW50byBhbiBpbm5lciBsaXN0LlxuICAgICAgICovXG4gICAgICBzaW5rTGlzdEl0ZW06ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2lua0xpc3RJdGVtOiBSYXdDb21tYW5kc1snc2lua0xpc3RJdGVtJ10gPSB0eXBlT3JOYW1lID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gIGNvbnN0IHR5cGUgPSBnZXROb2RlVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG5cbiAgcmV0dXJuIG9yaWdpbmFsU2lua0xpc3RJdGVtKHR5cGUpKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSwgTm9kZVNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBjYW5TcGxpdCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBkZWZhdWx0QmxvY2tBdCB9IGZyb20gJy4uL2hlbHBlcnMvZGVmYXVsdEJsb2NrQXQuanMnXG5pbXBvcnQgeyBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9oZWxwZXJzL2dldFNwbGl0dGVkQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmZ1bmN0aW9uIGVuc3VyZU1hcmtzKHN0YXRlOiBFZGl0b3JTdGF0ZSwgc3BsaXR0YWJsZU1hcmtzPzogc3RyaW5nW10pIHtcbiAgY29uc3QgbWFya3MgPSBzdGF0ZS5zdG9yZWRNYXJrcyB8fCAoc3RhdGUuc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc3RhdGUuc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpXG5cbiAgaWYgKG1hcmtzKSB7XG4gICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzLmZpbHRlcihtYXJrID0+IHNwbGl0dGFibGVNYXJrcz8uaW5jbHVkZXMobWFyay50eXBlLm5hbWUpKVxuXG4gICAgc3RhdGUudHIuZW5zdXJlTWFya3MoZmlsdGVyZWRNYXJrcylcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc3BsaXRCbG9jazoge1xuICAgICAgLyoqXG4gICAgICAgKiBGb3JrcyBhIG5ldyBub2RlIGZyb20gYW4gZXhpc3Rpbmcgbm9kZS5cbiAgICAgICAqL1xuICAgICAgc3BsaXRCbG9jazogKG9wdGlvbnM/OiB7IGtlZXBNYXJrcz86IGJvb2xlYW4gfSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3BsaXRCbG9jazogUmF3Q29tbWFuZHNbJ3NwbGl0QmxvY2snXSA9ICh7IGtlZXBNYXJrcyA9IHRydWUgfSA9IHt9KSA9PiAoe1xuICB0ciwgc3RhdGUsIGRpc3BhdGNoLCBlZGl0b3IsXG59KSA9PiB7XG4gIGNvbnN0IHsgc2VsZWN0aW9uLCBkb2MgfSA9IHRyXG4gIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc2VsZWN0aW9uXG4gIGNvbnN0IGV4dGVuc2lvbkF0dHJpYnV0ZXMgPSBlZGl0b3IuZXh0ZW5zaW9uTWFuYWdlci5hdHRyaWJ1dGVzXG4gIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMoXG4gICAgZXh0ZW5zaW9uQXR0cmlidXRlcyxcbiAgICAkZnJvbS5ub2RlKCkudHlwZS5uYW1lLFxuICAgICRmcm9tLm5vZGUoKS5hdHRycyxcbiAgKVxuXG4gIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbGVjdGlvbi5ub2RlLmlzQmxvY2spIHtcbiAgICBpZiAoISRmcm9tLnBhcmVudE9mZnNldCB8fCAhY2FuU3BsaXQoZG9jLCAkZnJvbS5wb3MpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgIGlmIChrZWVwTWFya3MpIHtcbiAgICAgICAgZW5zdXJlTWFya3Moc3RhdGUsIGVkaXRvci5leHRlbnNpb25NYW5hZ2VyLnNwbGl0dGFibGVNYXJrcylcbiAgICAgIH1cblxuICAgICAgdHIuc3BsaXQoJGZyb20ucG9zKS5zY3JvbGxJbnRvVmlldygpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICghJGZyb20ucGFyZW50LmlzQmxvY2spIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IGF0RW5kID0gJHRvLnBhcmVudE9mZnNldCA9PT0gJHRvLnBhcmVudC5jb250ZW50LnNpemVcblxuICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB7XG4gICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmx0ID0gJGZyb20uZGVwdGggPT09IDBcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGRlZmF1bHRCbG9ja0F0KCRmcm9tLm5vZGUoLTEpLmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4QWZ0ZXIoLTEpKSlcblxuICAgIGxldCB0eXBlcyA9IGF0RW5kICYmIGRlZmx0XG4gICAgICA/IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IGRlZmx0LFxuICAgICAgICAgIGF0dHJzOiBuZXdBdHRyaWJ1dGVzLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGxldCBjYW4gPSBjYW5TcGxpdCh0ci5kb2MsIHRyLm1hcHBpbmcubWFwKCRmcm9tLnBvcyksIDEsIHR5cGVzKVxuXG4gICAgaWYgKFxuICAgICAgIXR5cGVzXG4gICAgICAgICYmICFjYW5cbiAgICAgICAgJiYgY2FuU3BsaXQodHIuZG9jLCB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCBkZWZsdCA/IFt7IHR5cGU6IGRlZmx0IH1dIDogdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgY2FuID0gdHJ1ZVxuICAgICAgdHlwZXMgPSBkZWZsdFxuICAgICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBkZWZsdCxcbiAgICAgICAgICAgIGF0dHJzOiBuZXdBdHRyaWJ1dGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpZiAoY2FuKSB7XG4gICAgICB0ci5zcGxpdCh0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCAxLCB0eXBlcylcblxuICAgICAgaWYgKGRlZmx0ICYmICFhdEVuZCAmJiAhJGZyb20ucGFyZW50T2Zmc2V0ICYmICRmcm9tLnBhcmVudC50eXBlICE9PSBkZWZsdCkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRyLm1hcHBpbmcubWFwKCRmcm9tLmJlZm9yZSgpKVxuICAgICAgICBjb25zdCAkZmlyc3QgPSB0ci5kb2MucmVzb2x2ZShmaXJzdClcblxuICAgICAgICBpZiAoJGZyb20ubm9kZSgtMSkuY2FuUmVwbGFjZVdpdGgoJGZpcnN0LmluZGV4KCksICRmaXJzdC5pbmRleCgpICsgMSwgZGVmbHQpKSB7XG4gICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cCh0ci5tYXBwaW5nLm1hcCgkZnJvbS5iZWZvcmUoKSksIGRlZmx0KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtlZXBNYXJrcykge1xuICAgICAgZW5zdXJlTWFya3Moc3RhdGUsIGVkaXRvci5leHRlbnNpb25NYW5hZ2VyLnNwbGl0dGFibGVNYXJrcylcbiAgICB9XG5cbiAgICB0ci5zY3JvbGxJbnRvVmlldygpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7XG4gIEZyYWdtZW50LCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgTm9kZVR5cGUsIFNsaWNlLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBjYW5TcGxpdCB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMgfSBmcm9tICcuLi9oZWxwZXJzL2dldFNwbGl0dGVkQXR0cmlidXRlcy5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzcGxpdExpc3RJdGVtOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNwbGl0cyBvbmUgbGlzdCBpdGVtIGludG8gdHdvIGxpc3QgaXRlbXMuXG4gICAgICAgKi9cbiAgICAgIHNwbGl0TGlzdEl0ZW06ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3BsaXRMaXN0SXRlbTogUmF3Q29tbWFuZHNbJ3NwbGl0TGlzdEl0ZW0nXSA9IHR5cGVPck5hbWUgPT4gKHtcbiAgdHIsIHN0YXRlLCBkaXNwYXRjaCwgZWRpdG9yLFxufSkgPT4ge1xuICBjb25zdCB0eXBlID0gZ2V0Tm9kZVR5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvblxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgY29uc3Qgbm9kZTogUHJvc2VNaXJyb3JOb2RlID0gc3RhdGUuc2VsZWN0aW9uLm5vZGVcblxuICBpZiAoKG5vZGUgJiYgbm9kZS5pc0Jsb2NrKSB8fCAkZnJvbS5kZXB0aCA8IDIgfHwgISRmcm9tLnNhbWVQYXJlbnQoJHRvKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgZ3JhbmRQYXJlbnQgPSAkZnJvbS5ub2RlKC0xKVxuXG4gIGlmIChncmFuZFBhcmVudC50eXBlICE9PSB0eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBleHRlbnNpb25BdHRyaWJ1dGVzID0gZWRpdG9yLmV4dGVuc2lvbk1hbmFnZXIuYXR0cmlidXRlc1xuXG4gIGlmICgkZnJvbS5wYXJlbnQuY29udGVudC5zaXplID09PSAwICYmICRmcm9tLm5vZGUoLTEpLmNoaWxkQ291bnQgPT09ICRmcm9tLmluZGV4QWZ0ZXIoLTEpKSB7XG4gICAgLy8gSW4gYW4gZW1wdHkgYmxvY2suIElmIHRoaXMgaXMgYSBuZXN0ZWQgbGlzdCwgdGhlIHdyYXBwaW5nXG4gICAgLy8gbGlzdCBpdGVtIHNob3VsZCBiZSBzcGxpdC4gT3RoZXJ3aXNlLCBiYWlsIG91dCBhbmQgbGV0IG5leHRcbiAgICAvLyBjb21tYW5kIGhhbmRsZSBsaWZ0aW5nLlxuICAgIGlmIChcbiAgICAgICRmcm9tLmRlcHRoID09PSAyXG4gICAgICAgIHx8ICRmcm9tLm5vZGUoLTMpLnR5cGUgIT09IHR5cGVcbiAgICAgICAgfHwgJGZyb20uaW5kZXgoLTIpICE9PSAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50IC0gMVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBsZXQgd3JhcCA9IEZyYWdtZW50LmVtcHR5XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgY29uc3QgZGVwdGhCZWZvcmUgPSAkZnJvbS5pbmRleCgtMSkgPyAxIDogJGZyb20uaW5kZXgoLTIpID8gMiA6IDNcblxuICAgICAgLy8gQnVpbGQgYSBmcmFnbWVudCBjb250YWluaW5nIGVtcHR5IHZlcnNpb25zIG9mIHRoZSBzdHJ1Y3R1cmVcbiAgICAgIC8vIGZyb20gdGhlIG91dGVyIGxpc3QgaXRlbSB0byB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIGN1cnNvclxuICAgICAgZm9yIChsZXQgZCA9ICRmcm9tLmRlcHRoIC0gZGVwdGhCZWZvcmU7IGQgPj0gJGZyb20uZGVwdGggLSAzOyBkIC09IDEpIHtcbiAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShkKS5jb3B5KHdyYXApKVxuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgY29uc3QgZGVwdGhBZnRlciA9ICRmcm9tLmluZGV4QWZ0ZXIoLTEpIDwgJGZyb20ubm9kZSgtMikuY2hpbGRDb3VudCA/IDEgOiAkZnJvbS5pbmRleEFmdGVyKC0yKSA8ICRmcm9tLm5vZGUoLTMpLmNoaWxkQ291bnQgPyAyIDogM1xuXG4gICAgICAvLyBBZGQgYSBzZWNvbmQgbGlzdCBpdGVtIHdpdGggYW4gZW1wdHkgZGVmYXVsdCBzdGFydCBub2RlXG4gICAgICBjb25zdCBuZXdOZXh0VHlwZUF0dHJpYnV0ZXMgPSBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMoXG4gICAgICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMsXG4gICAgICAgICRmcm9tLm5vZGUoKS50eXBlLm5hbWUsXG4gICAgICAgICRmcm9tLm5vZGUoKS5hdHRycyxcbiAgICAgIClcbiAgICAgIGNvbnN0IG5leHRUeXBlID0gdHlwZS5jb250ZW50TWF0Y2guZGVmYXVsdFR5cGU/LmNyZWF0ZUFuZEZpbGwobmV3TmV4dFR5cGVBdHRyaWJ1dGVzKSB8fCB1bmRlZmluZWRcblxuICAgICAgd3JhcCA9IHdyYXAuYXBwZW5kKEZyYWdtZW50LmZyb20odHlwZS5jcmVhdGVBbmRGaWxsKG51bGwsIG5leHRUeXBlKSB8fCB1bmRlZmluZWQpKVxuXG4gICAgICBjb25zdCBzdGFydCA9ICRmcm9tLmJlZm9yZSgkZnJvbS5kZXB0aCAtIChkZXB0aEJlZm9yZSAtIDEpKVxuXG4gICAgICB0ci5yZXBsYWNlKHN0YXJ0LCAkZnJvbS5hZnRlcigtZGVwdGhBZnRlciksIG5ldyBTbGljZSh3cmFwLCA0IC0gZGVwdGhCZWZvcmUsIDApKVxuXG4gICAgICBsZXQgc2VsID0gLTFcblxuICAgICAgdHIuZG9jLm5vZGVzQmV0d2VlbihzdGFydCwgdHIuZG9jLmNvbnRlbnQuc2l6ZSwgKG4sIHBvcykgPT4ge1xuICAgICAgICBpZiAoc2VsID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuLmlzVGV4dGJsb2NrICYmIG4uY29udGVudC5zaXplID09PSAwKSB7XG4gICAgICAgICAgc2VsID0gcG9zICsgMVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoc2VsID4gLTEpIHtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShzZWwpKSlcbiAgICAgIH1cblxuICAgICAgdHIuc2Nyb2xsSW50b1ZpZXcoKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCBuZXh0VHlwZSA9ICR0by5wb3MgPT09ICRmcm9tLmVuZCgpID8gZ3JhbmRQYXJlbnQuY29udGVudE1hdGNoQXQoMCkuZGVmYXVsdFR5cGUgOiBudWxsXG5cbiAgY29uc3QgbmV3VHlwZUF0dHJpYnV0ZXMgPSBnZXRTcGxpdHRlZEF0dHJpYnV0ZXMoXG4gICAgZXh0ZW5zaW9uQXR0cmlidXRlcyxcbiAgICBncmFuZFBhcmVudC50eXBlLm5hbWUsXG4gICAgZ3JhbmRQYXJlbnQuYXR0cnMsXG4gIClcbiAgY29uc3QgbmV3TmV4dFR5cGVBdHRyaWJ1dGVzID0gZ2V0U3BsaXR0ZWRBdHRyaWJ1dGVzKFxuICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMsXG4gICAgJGZyb20ubm9kZSgpLnR5cGUubmFtZSxcbiAgICAkZnJvbS5ub2RlKCkuYXR0cnMsXG4gIClcblxuICB0ci5kZWxldGUoJGZyb20ucG9zLCAkdG8ucG9zKVxuXG4gIGNvbnN0IHR5cGVzID0gbmV4dFR5cGVcbiAgICA/IFtcbiAgICAgIHsgdHlwZSwgYXR0cnM6IG5ld1R5cGVBdHRyaWJ1dGVzIH0sXG4gICAgICB7IHR5cGU6IG5leHRUeXBlLCBhdHRyczogbmV3TmV4dFR5cGVBdHRyaWJ1dGVzIH0sXG4gICAgXVxuICAgIDogW3sgdHlwZSwgYXR0cnM6IG5ld1R5cGVBdHRyaWJ1dGVzIH1dXG5cbiAgaWYgKCFjYW5TcGxpdCh0ci5kb2MsICRmcm9tLnBvcywgMikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uLCBzdG9yZWRNYXJrcyB9ID0gc3RhdGVcbiAgICBjb25zdCB7IHNwbGl0dGFibGVNYXJrcyB9ID0gZWRpdG9yLmV4dGVuc2lvbk1hbmFnZXJcbiAgICBjb25zdCBtYXJrcyA9IHN0b3JlZE1hcmtzIHx8IChzZWxlY3Rpb24uJHRvLnBhcmVudE9mZnNldCAmJiBzZWxlY3Rpb24uJGZyb20ubWFya3MoKSlcblxuICAgIHRyLnNwbGl0KCRmcm9tLnBvcywgMiwgdHlwZXMpLnNjcm9sbEludG9WaWV3KClcblxuICAgIGlmICghbWFya3MgfHwgIWRpc3BhdGNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkTWFya3MgPSBtYXJrcy5maWx0ZXIobWFyayA9PiBzcGxpdHRhYmxlTWFya3MuaW5jbHVkZXMobWFyay50eXBlLm5hbWUpKVxuXG4gICAgdHIuZW5zdXJlTWFya3MoZmlsdGVyZWRNYXJrcylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgY2FuSm9pbiB9IGZyb20gJ0B0aXB0YXAvcG0vdHJhbnNmb3JtJ1xuXG5pbXBvcnQgeyBmaW5kUGFyZW50Tm9kZSB9IGZyb20gJy4uL2hlbHBlcnMvZmluZFBhcmVudE5vZGUuanMnXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBpc0xpc3QgfSBmcm9tICcuLi9oZWxwZXJzL2lzTGlzdC5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmNvbnN0IGpvaW5MaXN0QmFja3dhcmRzID0gKHRyOiBUcmFuc2FjdGlvbiwgbGlzdFR5cGU6IE5vZGVUeXBlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGxpc3QgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IG5vZGUudHlwZSA9PT0gbGlzdFR5cGUpKHRyLnNlbGVjdGlvbilcblxuICBpZiAoIWxpc3QpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgYmVmb3JlID0gdHIuZG9jLnJlc29sdmUoTWF0aC5tYXgoMCwgbGlzdC5wb3MgLSAxKSkuYmVmb3JlKGxpc3QuZGVwdGgpXG5cbiAgaWYgKGJlZm9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0IG5vZGVCZWZvcmUgPSB0ci5kb2Mubm9kZUF0KGJlZm9yZSlcbiAgY29uc3QgY2FuSm9pbkJhY2t3YXJkcyA9IGxpc3Qubm9kZS50eXBlID09PSBub2RlQmVmb3JlPy50eXBlICYmIGNhbkpvaW4odHIuZG9jLCBsaXN0LnBvcylcblxuICBpZiAoIWNhbkpvaW5CYWNrd2FyZHMpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdHIuam9pbihsaXN0LnBvcylcblxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBqb2luTGlzdEZvcndhcmRzID0gKHRyOiBUcmFuc2FjdGlvbiwgbGlzdFR5cGU6IE5vZGVUeXBlKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGxpc3QgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IG5vZGUudHlwZSA9PT0gbGlzdFR5cGUpKHRyLnNlbGVjdGlvbilcblxuICBpZiAoIWxpc3QpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgY29uc3QgYWZ0ZXIgPSB0ci5kb2MucmVzb2x2ZShsaXN0LnN0YXJ0KS5hZnRlcihsaXN0LmRlcHRoKVxuXG4gIGlmIChhZnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0IG5vZGVBZnRlciA9IHRyLmRvYy5ub2RlQXQoYWZ0ZXIpXG4gIGNvbnN0IGNhbkpvaW5Gb3J3YXJkcyA9IGxpc3Qubm9kZS50eXBlID09PSBub2RlQWZ0ZXI/LnR5cGUgJiYgY2FuSm9pbih0ci5kb2MsIGFmdGVyKVxuXG4gIGlmICghY2FuSm9pbkZvcndhcmRzKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHRyLmpvaW4oYWZ0ZXIpXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRvZ2dsZUxpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGJldHdlZW4gZGlmZmVyZW50IGxpc3QgdHlwZXMuXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUxpc3Q6IChsaXN0VHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIGl0ZW1UeXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSwga2VlcE1hcmtzPzogYm9vbGVhbiwgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFJldHVyblR5cGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVMaXN0OiBSYXdDb21tYW5kc1sndG9nZ2xlTGlzdCddID0gKGxpc3RUeXBlT3JOYW1lLCBpdGVtVHlwZU9yTmFtZSwga2VlcE1hcmtzLCBhdHRyaWJ1dGVzID0ge30pID0+ICh7XG4gIGVkaXRvciwgdHIsIHN0YXRlLCBkaXNwYXRjaCwgY2hhaW4sIGNvbW1hbmRzLCBjYW4sXG59KSA9PiB7XG4gIGNvbnN0IHsgZXh0ZW5zaW9ucywgc3BsaXR0YWJsZU1hcmtzIH0gPSBlZGl0b3IuZXh0ZW5zaW9uTWFuYWdlclxuICBjb25zdCBsaXN0VHlwZSA9IGdldE5vZGVUeXBlKGxpc3RUeXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IGl0ZW1UeXBlID0gZ2V0Tm9kZVR5cGUoaXRlbVR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgeyBzZWxlY3Rpb24sIHN0b3JlZE1hcmtzIH0gPSBzdGF0ZVxuICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHNlbGVjdGlvblxuICBjb25zdCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKVxuXG4gIGNvbnN0IG1hcmtzID0gc3RvcmVkTWFya3MgfHwgKHNlbGVjdGlvbi4kdG8ucGFyZW50T2Zmc2V0ICYmIHNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKVxuXG4gIGlmICghcmFuZ2UpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IHBhcmVudExpc3QgPSBmaW5kUGFyZW50Tm9kZShub2RlID0+IGlzTGlzdChub2RlLnR5cGUubmFtZSwgZXh0ZW5zaW9ucykpKHNlbGVjdGlvbilcblxuICBpZiAocmFuZ2UuZGVwdGggPj0gMSAmJiBwYXJlbnRMaXN0ICYmIHJhbmdlLmRlcHRoIC0gcGFyZW50TGlzdC5kZXB0aCA8PSAxKSB7XG4gICAgLy8gcmVtb3ZlIGxpc3RcbiAgICBpZiAocGFyZW50TGlzdC5ub2RlLnR5cGUgPT09IGxpc3RUeXBlKSB7XG4gICAgICByZXR1cm4gY29tbWFuZHMubGlmdExpc3RJdGVtKGl0ZW1UeXBlKVxuICAgIH1cblxuICAgIC8vIGNoYW5nZSBsaXN0IHR5cGVcbiAgICBpZiAoXG4gICAgICBpc0xpc3QocGFyZW50TGlzdC5ub2RlLnR5cGUubmFtZSwgZXh0ZW5zaW9ucylcbiAgICAgICAgJiYgbGlzdFR5cGUudmFsaWRDb250ZW50KHBhcmVudExpc3Qubm9kZS5jb250ZW50KVxuICAgICAgICAmJiBkaXNwYXRjaFxuICAgICkge1xuICAgICAgcmV0dXJuIGNoYWluKClcbiAgICAgICAgLmNvbW1hbmQoKCkgPT4ge1xuICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAocGFyZW50TGlzdC5wb3MsIGxpc3RUeXBlKVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RCYWNrd2FyZHModHIsIGxpc3RUeXBlKSlcbiAgICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RGb3J3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgICAucnVuKClcbiAgICB9XG4gIH1cbiAgaWYgKCFrZWVwTWFya3MgfHwgIW1hcmtzIHx8ICFkaXNwYXRjaCkge1xuXG4gICAgcmV0dXJuIGNoYWluKClcbiAgICAgIC8vIHRyeSB0byBjb252ZXJ0IG5vZGUgdG8gZGVmYXVsdCBub2RlIGlmIG5lZWRlZFxuICAgICAgLmNvbW1hbmQoKCkgPT4ge1xuICAgICAgICBjb25zdCBjYW5XcmFwSW5MaXN0ID0gY2FuKCkud3JhcEluTGlzdChsaXN0VHlwZSwgYXR0cmlidXRlcylcblxuICAgICAgICBpZiAoY2FuV3JhcEluTGlzdCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWFuZHMuY2xlYXJOb2RlcygpXG4gICAgICB9KVxuICAgICAgLndyYXBJbkxpc3QobGlzdFR5cGUsIGF0dHJpYnV0ZXMpXG4gICAgICAuY29tbWFuZCgoKSA9PiBqb2luTGlzdEJhY2t3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RGb3J3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLnJ1bigpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIGNoYWluKClcbiAgICAvLyB0cnkgdG8gY29udmVydCBub2RlIHRvIGRlZmF1bHQgbm9kZSBpZiBuZWVkZWRcbiAgICAgIC5jb21tYW5kKCgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuV3JhcEluTGlzdCA9IGNhbigpLndyYXBJbkxpc3QobGlzdFR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzLmZpbHRlcihtYXJrID0+IHNwbGl0dGFibGVNYXJrcy5pbmNsdWRlcyhtYXJrLnR5cGUubmFtZSkpXG5cbiAgICAgICAgdHIuZW5zdXJlTWFya3MoZmlsdGVyZWRNYXJrcylcblxuICAgICAgICBpZiAoY2FuV3JhcEluTGlzdCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWFuZHMuY2xlYXJOb2RlcygpXG4gICAgICB9KVxuICAgICAgLndyYXBJbkxpc3QobGlzdFR5cGUsIGF0dHJpYnV0ZXMpXG4gICAgICAuY29tbWFuZCgoKSA9PiBqb2luTGlzdEJhY2t3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLmNvbW1hbmQoKCkgPT4gam9pbkxpc3RGb3J3YXJkcyh0ciwgbGlzdFR5cGUpKVxuICAgICAgLnJ1bigpXG4gIClcbn1cbiIsICJpbXBvcnQgeyBNYXJrVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IGlzTWFya0FjdGl2ZSB9IGZyb20gJy4uL2hlbHBlcnMvaXNNYXJrQWN0aXZlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRvZ2dsZU1hcms6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgbWFyayBvbiBhbmQgb2ZmLlxuICAgICAgICovXG4gICAgICB0b2dnbGVNYXJrOiAoXG4gICAgICAgIHR5cGVPck5hbWU6IHN0cmluZyB8IE1hcmtUeXBlLFxuICAgICAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZW1vdmVzIHRoZSBtYXJrIGV2ZW4gYWNyb3NzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBleHRlbmRFbXB0eU1hcmtSYW5nZT86IGJvb2xlYW5cbiAgICAgICAgfSxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdG9nZ2xlTWFyazogUmF3Q29tbWFuZHNbJ3RvZ2dsZU1hcmsnXSA9ICh0eXBlT3JOYW1lLCBhdHRyaWJ1dGVzID0ge30sIG9wdGlvbnMgPSB7fSkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgY29uc3QgeyBleHRlbmRFbXB0eU1hcmtSYW5nZSA9IGZhbHNlIH0gPSBvcHRpb25zXG4gIGNvbnN0IHR5cGUgPSBnZXRNYXJrVHlwZSh0eXBlT3JOYW1lLCBzdGF0ZS5zY2hlbWEpXG4gIGNvbnN0IGlzQWN0aXZlID0gaXNNYXJrQWN0aXZlKHN0YXRlLCB0eXBlLCBhdHRyaWJ1dGVzKVxuXG4gIGlmIChpc0FjdGl2ZSkge1xuICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodHlwZSwgeyBleHRlbmRFbXB0eU1hcmtSYW5nZSB9KVxuICB9XG5cbiAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodHlwZSwgYXR0cmlidXRlcylcbn1cbiIsICJpbXBvcnQgeyBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IGlzTm9kZUFjdGl2ZSB9IGZyb20gJy4uL2hlbHBlcnMvaXNOb2RlQWN0aXZlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRvZ2dsZU5vZGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgbm9kZSB3aXRoIGFub3RoZXIgbm9kZS5cbiAgICAgICAqL1xuICAgICAgdG9nZ2xlTm9kZTogKFxuICAgICAgICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSxcbiAgICAgICAgdG9nZ2xlVHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsXG4gICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVOb2RlOiBSYXdDb21tYW5kc1sndG9nZ2xlTm9kZSddID0gKHR5cGVPck5hbWUsIHRvZ2dsZVR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgdG9nZ2xlVHlwZSA9IGdldE5vZGVUeXBlKHRvZ2dsZVR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgaXNBY3RpdmUgPSBpc05vZGVBY3RpdmUoc3RhdGUsIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgaWYgKGlzQWN0aXZlKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRzLnNldE5vZGUodG9nZ2xlVHlwZSlcbiAgfVxuXG4gIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHR5cGUsIGF0dHJpYnV0ZXMpXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXROb2RlVHlwZSB9IGZyb20gJy4uL2hlbHBlcnMvZ2V0Tm9kZVR5cGUuanMnXG5pbXBvcnQgeyBpc05vZGVBY3RpdmUgfSBmcm9tICcuLi9oZWxwZXJzL2lzTm9kZUFjdGl2ZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB0b2dnbGVXcmFwOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdyYXBzIG5vZGVzIGluIGFub3RoZXIgbm9kZSwgb3IgcmVtb3ZlcyBhbiBleGlzdGluZyB3cmFwLlxuICAgICAgICovXG4gICAgICB0b2dnbGVXcmFwOiAodHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b2dnbGVXcmFwOiBSYXdDb21tYW5kc1sndG9nZ2xlV3JhcCddID0gKHR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcbiAgY29uc3QgaXNBY3RpdmUgPSBpc05vZGVBY3RpdmUoc3RhdGUsIHR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgaWYgKGlzQWN0aXZlKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRzLmxpZnQodHlwZSlcbiAgfVxuXG4gIHJldHVybiBjb21tYW5kcy53cmFwSW4odHlwZSwgYXR0cmlidXRlcylcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgdW5kb0lucHV0UnVsZToge1xuICAgICAgLyoqXG4gICAgICAgKiBVbmRvIGFuIGlucHV0IHJ1bGUuXG4gICAgICAgKi9cbiAgICAgIHVuZG9JbnB1dFJ1bGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB1bmRvSW5wdXRSdWxlOiBSYXdDb21tYW5kc1sndW5kb0lucHV0UnVsZSddID0gKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHN0YXRlLnBsdWdpbnNcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW2ldXG4gICAgbGV0IHVuZG9hYmxlXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgaWYgKHBsdWdpbi5zcGVjLmlzSW5wdXRSdWxlcyAmJiAodW5kb2FibGUgPSBwbHVnaW4uZ2V0U3RhdGUoc3RhdGUpKSkge1xuICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGNvbnN0IHRyID0gc3RhdGUudHJcbiAgICAgICAgY29uc3QgdG9VbmRvID0gdW5kb2FibGUudHJhbnNmb3JtXG5cbiAgICAgICAgZm9yIChsZXQgaiA9IHRvVW5kby5zdGVwcy5sZW5ndGggLSAxOyBqID49IDA7IGogLT0gMSkge1xuICAgICAgICAgIHRyLnN0ZXAodG9VbmRvLnN0ZXBzW2pdLmludmVydCh0b1VuZG8uZG9jc1tqXSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5kb2FibGUudGV4dCkge1xuICAgICAgICAgIGNvbnN0IG1hcmtzID0gdHIuZG9jLnJlc29sdmUodW5kb2FibGUuZnJvbSkubWFya3MoKVxuXG4gICAgICAgICAgdHIucmVwbGFjZVdpdGgodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8sIHN0YXRlLnNjaGVtYS50ZXh0KHVuZG9hYmxlLnRleHQsIG1hcmtzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ci5kZWxldGUodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBSYXdDb21tYW5kcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgdW5zZXRBbGxNYXJrczoge1xuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYWxsIG1hcmtzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAgICAqL1xuICAgICAgdW5zZXRBbGxNYXJrczogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHVuc2V0QWxsTWFya3M6IFJhd0NvbW1hbmRzWyd1bnNldEFsbE1hcmtzJ10gPSAoKSA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJcbiAgY29uc3QgeyBlbXB0eSwgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICBpZiAoZW1wdHkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgcmFuZ2VzLmZvckVhY2gocmFuZ2UgPT4ge1xuICAgICAgdHIucmVtb3ZlTWFyayhyYW5nZS4kZnJvbS5wb3MsIHJhbmdlLiR0by5wb3MpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCAiaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBnZXRNYXJrUmFuZ2UgfSBmcm9tICcuLi9oZWxwZXJzL2dldE1hcmtSYW5nZS5qcydcbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB1bnNldE1hcms6IHtcbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFsbCBtYXJrcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gICAgICAgKi9cbiAgICAgIHVuc2V0TWFyazogKFxuICAgICAgICB0eXBlT3JOYW1lOiBzdHJpbmcgfCBNYXJrVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZW1vdmVzIHRoZSBtYXJrIGV2ZW4gYWNyb3NzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBleHRlbmRFbXB0eU1hcmtSYW5nZT86IGJvb2xlYW5cbiAgICAgICAgfSxcbiAgICAgICkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdW5zZXRNYXJrOiBSYXdDb21tYW5kc1sndW5zZXRNYXJrJ10gPSAodHlwZU9yTmFtZSwgb3B0aW9ucyA9IHt9KSA9PiAoeyB0ciwgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgeyBleHRlbmRFbXB0eU1hcmtSYW5nZSA9IGZhbHNlIH0gPSBvcHRpb25zXG4gIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSB0clxuICBjb25zdCB0eXBlID0gZ2V0TWFya1R5cGUodHlwZU9yTmFtZSwgc3RhdGUuc2NoZW1hKVxuICBjb25zdCB7ICRmcm9tLCBlbXB0eSwgcmFuZ2VzIH0gPSBzZWxlY3Rpb25cblxuICBpZiAoIWRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChlbXB0eSAmJiBleHRlbmRFbXB0eU1hcmtSYW5nZSkge1xuICAgIGxldCB7IGZyb20sIHRvIH0gPSBzZWxlY3Rpb25cbiAgICBjb25zdCBhdHRycyA9ICRmcm9tLm1hcmtzKCkuZmluZChtYXJrID0+IG1hcmsudHlwZSA9PT0gdHlwZSk/LmF0dHJzXG4gICAgY29uc3QgcmFuZ2UgPSBnZXRNYXJrUmFuZ2UoJGZyb20sIHR5cGUsIGF0dHJzKVxuXG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICBmcm9tID0gcmFuZ2UuZnJvbVxuICAgICAgdG8gPSByYW5nZS50b1xuICAgIH1cblxuICAgIHRyLnJlbW92ZU1hcmsoZnJvbSwgdG8sIHR5cGUpXG4gIH0gZWxzZSB7XG4gICAgcmFuZ2VzLmZvckVhY2gocmFuZ2UgPT4ge1xuICAgICAgdHIucmVtb3ZlTWFyayhyYW5nZS4kZnJvbS5wb3MsIHJhbmdlLiR0by5wb3MsIHR5cGUpXG4gICAgfSlcbiAgfVxuXG4gIHRyLnJlbW92ZVN0b3JlZE1hcmsodHlwZSlcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE1hcmtUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrVHlwZS5qcydcbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IGdldFNjaGVtYVR5cGVOYW1lQnlOYW1lIH0gZnJvbSAnLi4vaGVscGVycy9nZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB1cGRhdGVBdHRyaWJ1dGVzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBhdHRyaWJ1dGVzIG9mIGEgbm9kZSBvciBtYXJrLlxuICAgICAgICovXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzOiAoXG4gICAgICAgIHR5cGVPck5hbWU6IHN0cmluZyB8IE5vZGVUeXBlIHwgTWFya1R5cGUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICApID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUF0dHJpYnV0ZXM6IFJhd0NvbW1hbmRzWyd1cGRhdGVBdHRyaWJ1dGVzJ10gPSAodHlwZU9yTmFtZSwgYXR0cmlidXRlcyA9IHt9KSA9PiAoeyB0ciwgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgbGV0IG5vZGVUeXBlOiBOb2RlVHlwZSB8IG51bGwgPSBudWxsXG4gIGxldCBtYXJrVHlwZTogTWFya1R5cGUgfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0IHNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlTmFtZUJ5TmFtZShcbiAgICB0eXBlb2YgdHlwZU9yTmFtZSA9PT0gJ3N0cmluZycgPyB0eXBlT3JOYW1lIDogdHlwZU9yTmFtZS5uYW1lLFxuICAgIHN0YXRlLnNjaGVtYSxcbiAgKVxuXG4gIGlmICghc2NoZW1hVHlwZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdub2RlJykge1xuICAgIG5vZGVUeXBlID0gZ2V0Tm9kZVR5cGUodHlwZU9yTmFtZSBhcyBOb2RlVHlwZSwgc3RhdGUuc2NoZW1hKVxuICB9XG5cbiAgaWYgKHNjaGVtYVR5cGUgPT09ICdtYXJrJykge1xuICAgIG1hcmtUeXBlID0gZ2V0TWFya1R5cGUodHlwZU9yTmFtZSBhcyBNYXJrVHlwZSwgc3RhdGUuc2NoZW1hKVxuICB9XG5cbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgdHIuc2VsZWN0aW9uLnJhbmdlcy5mb3JFYWNoKHJhbmdlID0+IHtcbiAgICAgIGNvbnN0IGZyb20gPSByYW5nZS4kZnJvbS5wb3NcbiAgICAgIGNvbnN0IHRvID0gcmFuZ2UuJHRvLnBvc1xuXG4gICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgIGlmIChub2RlVHlwZSAmJiBub2RlVHlwZSA9PT0gbm9kZS50eXBlKSB7XG4gICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cChwb3MsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgLi4ubm9kZS5hdHRycyxcbiAgICAgICAgICAgIC4uLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXJrVHlwZSAmJiBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgIG5vZGUubWFya3MuZm9yRWFjaChtYXJrID0+IHtcbiAgICAgICAgICAgIGlmIChtYXJrVHlwZSA9PT0gbWFyay50eXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWRGcm9tID0gTWF0aC5tYXgocG9zLCBmcm9tKVxuICAgICAgICAgICAgICBjb25zdCB0cmltbWVkVG8gPSBNYXRoLm1pbihwb3MgKyBub2RlLm5vZGVTaXplLCB0bylcblxuICAgICAgICAgICAgICB0ci5hZGRNYXJrKFxuICAgICAgICAgICAgICAgIHRyaW1tZWRGcm9tLFxuICAgICAgICAgICAgICAgIHRyaW1tZWRUbyxcbiAgICAgICAgICAgICAgICBtYXJrVHlwZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgLi4ubWFyay5hdHRycyxcbiAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwgImltcG9ydCB7IHdyYXBJbiBhcyBvcmlnaW5hbFdyYXBJbiB9IGZyb20gJ0B0aXB0YXAvcG0vY29tbWFuZHMnXG5pbXBvcnQgeyBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5cbmltcG9ydCB7IGdldE5vZGVUeXBlIH0gZnJvbSAnLi4vaGVscGVycy9nZXROb2RlVHlwZS5qcydcbmltcG9ydCB7IFJhd0NvbW1hbmRzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB3cmFwSW46IHtcbiAgICAgIC8qKlxuICAgICAgICogV3JhcHMgbm9kZXMgaW4gYW5vdGhlciBub2RlLlxuICAgICAgICovXG4gICAgICB3cmFwSW46ICh0eXBlT3JOYW1lOiBzdHJpbmcgfCBOb2RlVHlwZSwgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFJldHVyblR5cGVcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHdyYXBJbjogUmF3Q29tbWFuZHNbJ3dyYXBJbiddID0gKHR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICByZXR1cm4gb3JpZ2luYWxXcmFwSW4odHlwZSwgYXR0cmlidXRlcykoc3RhdGUsIGRpc3BhdGNoKVxufVxuIiwgImltcG9ydCB7IE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IHdyYXBJbkxpc3QgYXMgb3JpZ2luYWxXcmFwSW5MaXN0IH0gZnJvbSAnQHRpcHRhcC9wbS9zY2hlbWEtbGlzdCdcblxuaW1wb3J0IHsgZ2V0Tm9kZVR5cGUgfSBmcm9tICcuLi9oZWxwZXJzL2dldE5vZGVUeXBlLmpzJ1xuaW1wb3J0IHsgUmF3Q29tbWFuZHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHdyYXBJbkxpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogV3JhcCBhIG5vZGUgaW4gYSBsaXN0LlxuICAgICAgICovXG4gICAgICB3cmFwSW5MaXN0OiAodHlwZU9yTmFtZTogc3RyaW5nIHwgTm9kZVR5cGUsIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB3cmFwSW5MaXN0OiBSYXdDb21tYW5kc1snd3JhcEluTGlzdCddID0gKHR5cGVPck5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldE5vZGVUeXBlKHR5cGVPck5hbWUsIHN0YXRlLnNjaGVtYSlcblxuICByZXR1cm4gb3JpZ2luYWxXcmFwSW5MaXN0KHR5cGUsIGF0dHJpYnV0ZXMpKHN0YXRlLCBkaXNwYXRjaClcbn1cbiIsICJpbXBvcnQgKiBhcyBjb21tYW5kcyBmcm9tICcuLi9jb21tYW5kcy9pbmRleC5qcydcbmltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gJy4uL0V4dGVuc2lvbi5qcydcblxuZXhwb3J0ICogZnJvbSAnLi4vY29tbWFuZHMvaW5kZXguanMnXG5cbmV4cG9ydCBjb25zdCBDb21tYW5kcyA9IEV4dGVuc2lvbi5jcmVhdGUoe1xuICBuYW1lOiAnY29tbWFuZHMnLFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21tYW5kcyxcbiAgICB9XG4gIH0sXG59KVxuIiwgImltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vRXh0ZW5zaW9uLmpzJ1xuXG5leHBvcnQgY29uc3QgRWRpdGFibGUgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2VkaXRhYmxlJyxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICBrZXk6IG5ldyBQbHVnaW5LZXkoJ2VkaXRhYmxlJyksXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgZWRpdGFibGU6ICgpID0+IHRoaXMuZWRpdG9yLm9wdGlvbnMuZWRpdGFibGUsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vRXh0ZW5zaW9uLmpzJ1xuXG5leHBvcnQgY29uc3QgRm9jdXNFdmVudHMgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2ZvY3VzRXZlbnRzJyxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXNcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdmb2N1c0V2ZW50cycpLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGhhbmRsZURPTUV2ZW50czoge1xuICAgICAgICAgICAgZm9jdXM6ICh2aWV3LCBldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgZWRpdG9yLmlzRm9jdXNlZCA9IHRydWVcblxuICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGVkaXRvci5zdGF0ZS50clxuICAgICAgICAgICAgICAgIC5zZXRNZXRhKCdmb2N1cycsIHsgZXZlbnQgfSlcbiAgICAgICAgICAgICAgICAuc2V0TWV0YSgnYWRkVG9IaXN0b3J5JywgZmFsc2UpXG5cbiAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cmFuc2FjdGlvbilcblxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibHVyOiAodmlldywgZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGVkaXRvci5pc0ZvY3VzZWQgPSBmYWxzZVxuXG4gICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZWRpdG9yLnN0YXRlLnRyXG4gICAgICAgICAgICAgICAgLnNldE1ldGEoJ2JsdXInLCB7IGV2ZW50IH0pXG4gICAgICAgICAgICAgICAgLnNldE1ldGEoJ2FkZFRvSGlzdG9yeScsIGZhbHNlKVxuXG4gICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godHJhbnNhY3Rpb24pXG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5LCBTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBDb21tYW5kTWFuYWdlciB9IGZyb20gJy4uL0NvbW1hbmRNYW5hZ2VyLmpzJ1xuaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnLi4vRXh0ZW5zaW9uLmpzJ1xuaW1wb3J0IHsgY3JlYXRlQ2hhaW5hYmxlU3RhdGUgfSBmcm9tICcuLi9oZWxwZXJzL2NyZWF0ZUNoYWluYWJsZVN0YXRlLmpzJ1xuaW1wb3J0IHsgaXNpT1MgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNpT1MuanMnXG5pbXBvcnQgeyBpc01hY09TIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzTWFjT1MuanMnXG5cbmV4cG9ydCBjb25zdCBLZXltYXAgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgbmFtZTogJ2tleW1hcCcsXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgY29uc3QgaGFuZGxlQmFja3NwYWNlID0gKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuZmlyc3QoKHsgY29tbWFuZHMgfSkgPT4gW1xuICAgICAgKCkgPT4gY29tbWFuZHMudW5kb0lucHV0UnVsZSgpLFxuXG4gICAgICAvLyBtYXliZSBjb252ZXJ0IGZpcnN0IHRleHQgYmxvY2sgbm9kZSB0byBkZWZhdWx0IG5vZGVcbiAgICAgICgpID0+IGNvbW1hbmRzLmNvbW1hbmQoKHsgdHIgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgZG9jIH0gPSB0clxuICAgICAgICBjb25zdCB7IGVtcHR5LCAkYW5jaG9yIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgeyBwb3MsIHBhcmVudCB9ID0gJGFuY2hvclxuICAgICAgICBjb25zdCAkcGFyZW50UG9zID0gJGFuY2hvci5wYXJlbnQuaXNUZXh0YmxvY2sgPyB0ci5kb2MucmVzb2x2ZShwb3MgLSAxKSA6ICRhbmNob3JcbiAgICAgICAgY29uc3QgcGFyZW50SXNJc29sYXRpbmcgPSAkcGFyZW50UG9zLnBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nXG5cbiAgICAgICAgY29uc3QgcGFyZW50UG9zID0gJGFuY2hvci5wb3MgLSAkYW5jaG9yLnBhcmVudE9mZnNldFxuXG4gICAgICAgIGNvbnN0IGlzQXRTdGFydCA9IChwYXJlbnRJc0lzb2xhdGluZyAmJiAkcGFyZW50UG9zLnBhcmVudC5jaGlsZENvdW50ID09PSAxKVxuICAgICAgICAgID8gcGFyZW50UG9zID09PSAkYW5jaG9yLnBvc1xuICAgICAgICAgIDogU2VsZWN0aW9uLmF0U3RhcnQoZG9jKS5mcm9tID09PSBwb3NcblxuICAgICAgICBpZiAoIWVtcHR5IHx8ICFpc0F0U3RhcnQgfHwgIXBhcmVudC50eXBlLmlzVGV4dGJsb2NrIHx8IHBhcmVudC50ZXh0Q29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy5jbGVhck5vZGVzKClcbiAgICAgIH0pLFxuXG4gICAgICAoKSA9PiBjb21tYW5kcy5kZWxldGVTZWxlY3Rpb24oKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmpvaW5CYWNrd2FyZCgpLFxuICAgICAgKCkgPT4gY29tbWFuZHMuc2VsZWN0Tm9kZUJhY2t3YXJkKCksXG4gICAgXSlcblxuICAgIGNvbnN0IGhhbmRsZURlbGV0ZSA9ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmZpcnN0KCh7IGNvbW1hbmRzIH0pID0+IFtcbiAgICAgICgpID0+IGNvbW1hbmRzLmRlbGV0ZVNlbGVjdGlvbigpLFxuICAgICAgKCkgPT4gY29tbWFuZHMuZGVsZXRlQ3VycmVudE5vZGUoKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmpvaW5Gb3J3YXJkKCksXG4gICAgICAoKSA9PiBjb21tYW5kcy5zZWxlY3ROb2RlRm9yd2FyZCgpLFxuICAgIF0pXG5cbiAgICBjb25zdCBoYW5kbGVFbnRlciA9ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmZpcnN0KCh7IGNvbW1hbmRzIH0pID0+IFtcbiAgICAgICgpID0+IGNvbW1hbmRzLm5ld2xpbmVJbkNvZGUoKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmNyZWF0ZVBhcmFncmFwaE5lYXIoKSxcbiAgICAgICgpID0+IGNvbW1hbmRzLmxpZnRFbXB0eUJsb2NrKCksXG4gICAgICAoKSA9PiBjb21tYW5kcy5zcGxpdEJsb2NrKCksXG4gICAgXSlcblxuICAgIGNvbnN0IGJhc2VLZXltYXAgPSB7XG4gICAgICBFbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgICAnTW9kLUVudGVyJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuZXhpdENvZGUoKSxcbiAgICAgIEJhY2tzcGFjZTogaGFuZGxlQmFja3NwYWNlLFxuICAgICAgJ01vZC1CYWNrc3BhY2UnOiBoYW5kbGVCYWNrc3BhY2UsXG4gICAgICAnU2hpZnQtQmFja3NwYWNlJzogaGFuZGxlQmFja3NwYWNlLFxuICAgICAgRGVsZXRlOiBoYW5kbGVEZWxldGUsXG4gICAgICAnTW9kLURlbGV0ZSc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdNb2QtYSc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNlbGVjdEFsbCgpLFxuICAgIH1cblxuICAgIGNvbnN0IHBjS2V5bWFwID0ge1xuICAgICAgLi4uYmFzZUtleW1hcCxcbiAgICB9XG5cbiAgICBjb25zdCBtYWNLZXltYXAgPSB7XG4gICAgICAuLi5iYXNlS2V5bWFwLFxuICAgICAgJ0N0cmwtaCc6IGhhbmRsZUJhY2tzcGFjZSxcbiAgICAgICdBbHQtQmFja3NwYWNlJzogaGFuZGxlQmFja3NwYWNlLFxuICAgICAgJ0N0cmwtZCc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdDdHJsLUFsdC1CYWNrc3BhY2UnOiBoYW5kbGVEZWxldGUsXG4gICAgICAnQWx0LURlbGV0ZSc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdBbHQtZCc6IGhhbmRsZURlbGV0ZSxcbiAgICAgICdDdHJsLWEnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zZWxlY3RUZXh0YmxvY2tTdGFydCgpLFxuICAgICAgJ0N0cmwtZSc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNlbGVjdFRleHRibG9ja0VuZCgpLFxuICAgIH1cblxuICAgIGlmIChpc2lPUygpIHx8IGlzTWFjT1MoKSkge1xuICAgICAgcmV0dXJuIG1hY0tleW1hcFxuICAgIH1cblxuICAgIHJldHVybiBwY0tleW1hcFxuICB9LFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gV2l0aCB0aGlzIHBsdWdpbiB3ZSBjaGVjayBpZiB0aGUgd2hvbGUgZG9jdW1lbnQgd2FzIHNlbGVjdGVkIGFuZCBkZWxldGVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHdpbGwgYWRkaXRpb25hbGx5IGNhbGwgYGNsZWFyTm9kZXMoKWAgdG8gY29udmVydCBlLmcuIGEgaGVhZGluZ1xuICAgICAgLy8gdG8gYSBwYXJhZ3JhcGggaWYgbmVjZXNzYXJ5LlxuICAgICAgLy8gVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byBQcm9zZU1pcnJvcidzIGBBbGxTZWxlY3Rpb25gLCB3aGljaCBkb2VzbuKAmXQgd29yayB3ZWxsXG4gICAgICAvLyB3aXRoIG1hbnkgb3RoZXIgY29tbWFuZHMuXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdjbGVhckRvY3VtZW50JyksXG4gICAgICAgIGFwcGVuZFRyYW5zYWN0aW9uOiAodHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkb2NDaGFuZ2VzID0gdHJhbnNhY3Rpb25zLnNvbWUodHJhbnNhY3Rpb24gPT4gdHJhbnNhY3Rpb24uZG9jQ2hhbmdlZClcbiAgICAgICAgICAgICYmICFvbGRTdGF0ZS5kb2MuZXEobmV3U3RhdGUuZG9jKVxuXG4gICAgICAgICAgaWYgKCFkb2NDaGFuZ2VzKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGVtcHR5LCBmcm9tLCB0byB9ID0gb2xkU3RhdGUuc2VsZWN0aW9uXG4gICAgICAgICAgY29uc3QgYWxsRnJvbSA9IFNlbGVjdGlvbi5hdFN0YXJ0KG9sZFN0YXRlLmRvYykuZnJvbVxuICAgICAgICAgIGNvbnN0IGFsbEVuZCA9IFNlbGVjdGlvbi5hdEVuZChvbGRTdGF0ZS5kb2MpLnRvXG4gICAgICAgICAgY29uc3QgYWxsV2FzU2VsZWN0ZWQgPSBmcm9tID09PSBhbGxGcm9tICYmIHRvID09PSBhbGxFbmRcblxuICAgICAgICAgIGlmIChlbXB0eSB8fCAhYWxsV2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBuZXdTdGF0ZS5kb2MudGV4dEJldHdlZW4oMCwgbmV3U3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSwgJyAnLCAnICcpLmxlbmd0aCA9PT0gMFxuXG4gICAgICAgICAgaWYgKCFpc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ciA9IG5ld1N0YXRlLnRyXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVDaGFpbmFibGVTdGF0ZSh7XG4gICAgICAgICAgICBzdGF0ZTogbmV3U3RhdGUsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogdHIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCB7IGNvbW1hbmRzIH0gPSBuZXcgQ29tbWFuZE1hbmFnZXIoe1xuICAgICAgICAgICAgZWRpdG9yOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb21tYW5kcy5jbGVhck5vZGVzKClcblxuICAgICAgICAgIGlmICghdHIuc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICcuLi9FeHRlbnNpb24uanMnXG5cbmV4cG9ydCBjb25zdCBUYWJpbmRleCA9IEV4dGVuc2lvbi5jcmVhdGUoe1xuICBuYW1lOiAndGFiaW5kZXgnLFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFBsdWdpbih7XG4gICAgICAgIGtleTogbmV3IFBsdWdpbktleSgndGFiaW5kZXgnKSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0aGlzLmVkaXRvci5pc0VkaXRhYmxlID8geyB0YWJpbmRleDogJzAnIH0gOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGNvbnN0IHN0eWxlID0gYC5Qcm9zZU1pcnJvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLlByb3NlTWlycm9yIHtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gIHdoaXRlLXNwYWNlOiBicmVhay1zcGFjZXM7XG4gIC13ZWJraXQtZm9udC12YXJpYW50LWxpZ2F0dXJlczogbm9uZTtcbiAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogbm9uZTtcbiAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiBcImxpZ2FcIiAwOyAvKiB0aGUgYWJvdmUgZG9lc24ndCBzZWVtIHRvIHdvcmsgaW4gRWRnZSAqL1xufVxuXG4uUHJvc2VNaXJyb3IgW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdIHtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbn1cblxuLlByb3NlTWlycm9yIFtjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXSBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLlByb3NlTWlycm9yIHByZSB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuaW1nLlByb3NlTWlycm9yLXNlcGFyYXRvciB7XG4gIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gIHdpZHRoOiAxcHggIWltcG9ydGFudDtcbiAgaGVpZ2h0OiAxcHggIWltcG9ydGFudDtcbn1cblxuLlByb3NlTWlycm9yLWdhcGN1cnNvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbjogMDtcbn1cblxuLlByb3NlTWlycm9yLWdhcGN1cnNvcjphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTJweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjaztcbiAgYW5pbWF0aW9uOiBQcm9zZU1pcnJvci1jdXJzb3ItYmxpbmsgMS4xcyBzdGVwcygyLCBzdGFydCkgaW5maW5pdGU7XG59XG5cbkBrZXlmcmFtZXMgUHJvc2VNaXJyb3ItY3Vyc29yLWJsaW5rIHtcbiAgdG8ge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxufVxuXG4uUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvbiAqOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cblxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKjo6LW1vei1zZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbn1cblxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKiB7XG4gIGNhcmV0LWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLlByb3NlTWlycm9yLWZvY3VzZWQgLlByb3NlTWlycm9yLWdhcGN1cnNvciB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4udGlwcHktYm94W2RhdGEtYW5pbWF0aW9uPWZhZGVdW2RhdGEtc3RhdGU9aGlkZGVuXSB7XG4gIG9wYWNpdHk6IDBcbn1gXG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlVGFnKHN0eWxlOiBzdHJpbmcsIG5vbmNlPzogc3RyaW5nLCBzdWZmaXg/OiBzdHJpbmcpOiBIVE1MU3R5bGVFbGVtZW50IHtcbiAgY29uc3QgdGlwdGFwU3R5bGVUYWcgPSAoPEhUTUxTdHlsZUVsZW1lbnQ+ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc3R5bGVbZGF0YS10aXB0YXAtc3R5bGUke3N1ZmZpeCA/IGAtJHtzdWZmaXh9YCA6ICcnfV1gKSlcblxuICBpZiAodGlwdGFwU3R5bGVUYWcgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGlwdGFwU3R5bGVUYWdcbiAgfVxuXG4gIGNvbnN0IHN0eWxlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcblxuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZU5vZGUuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKVxuICB9XG5cbiAgc3R5bGVOb2RlLnNldEF0dHJpYnV0ZShgZGF0YS10aXB0YXAtc3R5bGUke3N1ZmZpeCA/IGAtJHtzdWZmaXh9YCA6ICcnfWAsICcnKVxuICBzdHlsZU5vZGUuaW5uZXJIVE1MID0gc3R5bGVcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZU5vZGUpXG5cbiAgcmV0dXJuIHN0eWxlTm9kZVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSwgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7XG4gIEVkaXRvclN0YXRlLCBQbHVnaW4sIFBsdWdpbktleSwgVHJhbnNhY3Rpb24sXG59IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAnQHRpcHRhcC9wbS92aWV3J1xuXG5pbXBvcnQgeyBDb21tYW5kTWFuYWdlciB9IGZyb20gJy4vQ29tbWFuZE1hbmFnZXIuanMnXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL0V2ZW50RW1pdHRlci5qcydcbmltcG9ydCB7IEV4dGVuc2lvbk1hbmFnZXIgfSBmcm9tICcuL0V4dGVuc2lvbk1hbmFnZXIuanMnXG5pbXBvcnQgKiBhcyBleHRlbnNpb25zIGZyb20gJy4vZXh0ZW5zaW9ucy9pbmRleC5qcydcbmltcG9ydCB7IGNyZWF0ZURvY3VtZW50IH0gZnJvbSAnLi9oZWxwZXJzL2NyZWF0ZURvY3VtZW50LmpzJ1xuaW1wb3J0IHsgZ2V0QXR0cmlidXRlcyB9IGZyb20gJy4vaGVscGVycy9nZXRBdHRyaWJ1dGVzLmpzJ1xuaW1wb3J0IHsgZ2V0SFRNTEZyb21GcmFnbWVudCB9IGZyb20gJy4vaGVscGVycy9nZXRIVE1MRnJvbUZyYWdtZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4vaGVscGVycy9nZXRUZXh0LmpzJ1xuaW1wb3J0IHsgZ2V0VGV4dFNlcmlhbGl6ZXJzRnJvbVNjaGVtYSB9IGZyb20gJy4vaGVscGVycy9nZXRUZXh0U2VyaWFsaXplcnNGcm9tU2NoZW1hLmpzJ1xuaW1wb3J0IHsgaXNBY3RpdmUgfSBmcm9tICcuL2hlbHBlcnMvaXNBY3RpdmUuanMnXG5pbXBvcnQgeyBpc05vZGVFbXB0eSB9IGZyb20gJy4vaGVscGVycy9pc05vZGVFbXB0eS5qcydcbmltcG9ydCB7IHJlc29sdmVGb2N1c1Bvc2l0aW9uIH0gZnJvbSAnLi9oZWxwZXJzL3Jlc29sdmVGb2N1c1Bvc2l0aW9uLmpzJ1xuaW1wb3J0IHsgc3R5bGUgfSBmcm9tICcuL3N0eWxlLmpzJ1xuaW1wb3J0IHtcbiAgQ2FuQ29tbWFuZHMsXG4gIENoYWluZWRDb21tYW5kcyxcbiAgRWRpdG9yRXZlbnRzLFxuICBFZGl0b3JPcHRpb25zLFxuICBKU09OQ29udGVudCxcbiAgU2luZ2xlQ29tbWFuZHMsXG4gIFRleHRTZXJpYWxpemVyLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY3JlYXRlU3R5bGVUYWcgfSBmcm9tICcuL3V0aWxpdGllcy9jcmVhdGVTdHlsZVRhZy5qcydcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL3V0aWxpdGllcy9pc0Z1bmN0aW9uLmpzJ1xuXG5leHBvcnQgeyBleHRlbnNpb25zIH1cblxuZXhwb3J0IGludGVyZmFjZSBIVE1MRWxlbWVudCB7XG4gIGVkaXRvcj86IEVkaXRvclxufVxuXG5leHBvcnQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEVkaXRvckV2ZW50cz4ge1xuICBwcml2YXRlIGNvbW1hbmRNYW5hZ2VyITogQ29tbWFuZE1hbmFnZXJcblxuICBwdWJsaWMgZXh0ZW5zaW9uTWFuYWdlciE6IEV4dGVuc2lvbk1hbmFnZXJcblxuICBwcml2YXRlIGNzcyE6IEhUTUxTdHlsZUVsZW1lbnRcblxuICBwdWJsaWMgc2NoZW1hITogU2NoZW1hXG5cbiAgcHVibGljIHZpZXchOiBFZGl0b3JWaWV3XG5cbiAgcHVibGljIGlzRm9jdXNlZCA9IGZhbHNlXG5cbiAgcHVibGljIGV4dGVuc2lvblN0b3JhZ2U6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gIHB1YmxpYyBvcHRpb25zOiBFZGl0b3JPcHRpb25zID0ge1xuICAgIGVsZW1lbnQ6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIGNvbnRlbnQ6ICcnLFxuICAgIGluamVjdENTUzogdHJ1ZSxcbiAgICBpbmplY3ROb25jZTogdW5kZWZpbmVkLFxuICAgIGV4dGVuc2lvbnM6IFtdLFxuICAgIGF1dG9mb2N1czogZmFsc2UsXG4gICAgZWRpdGFibGU6IHRydWUsXG4gICAgZWRpdG9yUHJvcHM6IHt9LFxuICAgIHBhcnNlT3B0aW9uczoge30sXG4gICAgZW5hYmxlSW5wdXRSdWxlczogdHJ1ZSxcbiAgICBlbmFibGVQYXN0ZVJ1bGVzOiB0cnVlLFxuICAgIGVuYWJsZUNvcmVFeHRlbnNpb25zOiB0cnVlLFxuICAgIG9uQmVmb3JlQ3JlYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uQ3JlYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uVXBkYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoKSA9PiBudWxsLFxuICAgIG9uVHJhbnNhY3Rpb246ICgpID0+IG51bGwsXG4gICAgb25Gb2N1czogKCkgPT4gbnVsbCxcbiAgICBvbkJsdXI6ICgpID0+IG51bGwsXG4gICAgb25EZXN0cm95OiAoKSA9PiBudWxsLFxuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFydGlhbDxFZGl0b3JPcHRpb25zPiA9IHt9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKVxuICAgIHRoaXMuY3JlYXRlRXh0ZW5zaW9uTWFuYWdlcigpXG4gICAgdGhpcy5jcmVhdGVDb21tYW5kTWFuYWdlcigpXG4gICAgdGhpcy5jcmVhdGVTY2hlbWEoKVxuICAgIHRoaXMub24oJ2JlZm9yZUNyZWF0ZScsIHRoaXMub3B0aW9ucy5vbkJlZm9yZUNyZWF0ZSlcbiAgICB0aGlzLmVtaXQoJ2JlZm9yZUNyZWF0ZScsIHsgZWRpdG9yOiB0aGlzIH0pXG4gICAgdGhpcy5jcmVhdGVWaWV3KClcbiAgICB0aGlzLmluamVjdENTUygpXG4gICAgdGhpcy5vbignY3JlYXRlJywgdGhpcy5vcHRpb25zLm9uQ3JlYXRlKVxuICAgIHRoaXMub24oJ3VwZGF0ZScsIHRoaXMub3B0aW9ucy5vblVwZGF0ZSlcbiAgICB0aGlzLm9uKCdzZWxlY3Rpb25VcGRhdGUnLCB0aGlzLm9wdGlvbnMub25TZWxlY3Rpb25VcGRhdGUpXG4gICAgdGhpcy5vbigndHJhbnNhY3Rpb24nLCB0aGlzLm9wdGlvbnMub25UcmFuc2FjdGlvbilcbiAgICB0aGlzLm9uKCdmb2N1cycsIHRoaXMub3B0aW9ucy5vbkZvY3VzKVxuICAgIHRoaXMub24oJ2JsdXInLCB0aGlzLm9wdGlvbnMub25CbHVyKVxuICAgIHRoaXMub24oJ2Rlc3Ryb3knLCB0aGlzLm9wdGlvbnMub25EZXN0cm95KVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29tbWFuZHMuZm9jdXModGhpcy5vcHRpb25zLmF1dG9mb2N1cylcbiAgICAgIHRoaXMuZW1pdCgnY3JlYXRlJywgeyBlZGl0b3I6IHRoaXMgfSlcbiAgICB9LCAwKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVkaXRvciBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBzdG9yYWdlKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvblN0b3JhZ2VcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY29tbWFuZHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1hbmRzKCk6IFNpbmdsZUNvbW1hbmRzIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kTWFuYWdlci5jb21tYW5kc1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvbW1hbmQgY2hhaW4gdG8gY2FsbCBtdWx0aXBsZSBjb21tYW5kcyBhdCBvbmNlLlxuICAgKi9cbiAgcHVibGljIGNoYWluKCk6IENoYWluZWRDb21tYW5kcyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZE1hbmFnZXIuY2hhaW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgY29tbWFuZCBvciBhIGNvbW1hbmQgY2hhaW4gY2FuIGJlIGV4ZWN1dGVkLiBXaXRob3V0IGV4ZWN1dGluZyBpdC5cbiAgICovXG4gIHB1YmxpYyBjYW4oKTogQ2FuQ29tbWFuZHMge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmRNYW5hZ2VyLmNhbigpXG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IENTUyBzdHlsZXMuXG4gICAqL1xuICBwcml2YXRlIGluamVjdENTUygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmluamVjdENTUyAmJiBkb2N1bWVudCkge1xuICAgICAgdGhpcy5jc3MgPSBjcmVhdGVTdHlsZVRhZyhzdHlsZSwgdGhpcy5vcHRpb25zLmluamVjdE5vbmNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZWRpdG9yIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIEEgbGlzdCBvZiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBQYXJ0aWFsPEVkaXRvck9wdGlvbnM+ID0ge30pOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH1cblxuICAgIGlmICghdGhpcy52aWV3IHx8ICF0aGlzLnN0YXRlIHx8IHRoaXMuaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdG9yUHJvcHMpIHtcbiAgICAgIHRoaXMudmlldy5zZXRQcm9wcyh0aGlzLm9wdGlvbnMuZWRpdG9yUHJvcHMpXG4gICAgfVxuXG4gICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKHRoaXMuc3RhdGUpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGVkaXRhYmxlIHN0YXRlIG9mIHRoZSBlZGl0b3IuXG4gICAqL1xuICBwdWJsaWMgc2V0RWRpdGFibGUoZWRpdGFibGU6IGJvb2xlYW4sIGVtaXRVcGRhdGUgPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5zZXRPcHRpb25zKHsgZWRpdGFibGUgfSlcblxuICAgIGlmIChlbWl0VXBkYXRlKSB7XG4gICAgICB0aGlzLmVtaXQoJ3VwZGF0ZScsIHsgZWRpdG9yOiB0aGlzLCB0cmFuc2FjdGlvbjogdGhpcy5zdGF0ZS50ciB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVkaXRvciBpcyBlZGl0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAvLyBzaW5jZSBwbHVnaW5zIGFyZSBhcHBsaWVkIGFmdGVyIGNyZWF0aW5nIHRoZSB2aWV3XG4gICAgLy8gYGVkaXRhYmxlYCBpcyBhbHdheXMgYHRydWVgIGZvciBvbmUgdGljay5cbiAgICAvLyB0aGF04oCZcyB3aHkgd2UgYWxzbyBoYXZlIHRvIGNoZWNrIGZvciBgb3B0aW9ucy5lZGl0YWJsZWBcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVkaXRhYmxlICYmIHRoaXMudmlldyAmJiB0aGlzLnZpZXcuZWRpdGFibGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlZGl0b3Igc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IEVkaXRvclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy52aWV3LnN0YXRlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBQcm9zZU1pcnJvciBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gQSBQcm9zZU1pcnJvciBwbHVnaW5cbiAgICogQHBhcmFtIGhhbmRsZVBsdWdpbnMgQ29udHJvbCBob3cgdG8gbWVyZ2UgdGhlIHBsdWdpbiBpbnRvIHRoZSBleGlzdGluZyBwbHVnaW5zLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyUGx1Z2luKFxuICAgIHBsdWdpbjogUGx1Z2luLFxuICAgIGhhbmRsZVBsdWdpbnM/OiAobmV3UGx1Z2luOiBQbHVnaW4sIHBsdWdpbnM6IFBsdWdpbltdKSA9PiBQbHVnaW5bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGx1Z2lucyA9IGlzRnVuY3Rpb24oaGFuZGxlUGx1Z2lucylcbiAgICAgID8gaGFuZGxlUGx1Z2lucyhwbHVnaW4sIFsuLi50aGlzLnN0YXRlLnBsdWdpbnNdKVxuICAgICAgOiBbLi4udGhpcy5zdGF0ZS5wbHVnaW5zLCBwbHVnaW5dXG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUucmVjb25maWd1cmUoeyBwbHVnaW5zIH0pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUoc3RhdGUpXG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhIFByb3NlTWlycm9yIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIG5hbWVPclBsdWdpbktleSBUaGUgcGx1Z2lucyBuYW1lXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclBsdWdpbihuYW1lT3JQbHVnaW5LZXk6IHN0cmluZyB8IFBsdWdpbktleSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JQbHVnaW5LZXkgPT09ICdzdHJpbmcnID8gYCR7bmFtZU9yUGx1Z2luS2V5fSRgIDogbmFtZU9yUGx1Z2luS2V5LmtleVxuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlLnJlY29uZmlndXJlKHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHBsdWdpbnM6IHRoaXMuc3RhdGUucGx1Z2lucy5maWx0ZXIocGx1Z2luID0+ICFwbHVnaW4ua2V5LnN0YXJ0c1dpdGgobmFtZSkpLFxuICAgIH0pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUoc3RhdGUpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBleHRlbnNpb24gbWFuYWdlci5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRXh0ZW5zaW9uTWFuYWdlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb3JlRXh0ZW5zaW9ucyA9IHRoaXMub3B0aW9ucy5lbmFibGVDb3JlRXh0ZW5zaW9ucyA/IE9iamVjdC52YWx1ZXMoZXh0ZW5zaW9ucykgOiBbXVxuICAgIGNvbnN0IGFsbEV4dGVuc2lvbnMgPSBbLi4uY29yZUV4dGVuc2lvbnMsIC4uLnRoaXMub3B0aW9ucy5leHRlbnNpb25zXS5maWx0ZXIoZXh0ZW5zaW9uID0+IHtcbiAgICAgIHJldHVybiBbJ2V4dGVuc2lvbicsICdub2RlJywgJ21hcmsnXS5pbmNsdWRlcyhleHRlbnNpb24/LnR5cGUpXG4gICAgfSlcblxuICAgIHRoaXMuZXh0ZW5zaW9uTWFuYWdlciA9IG5ldyBFeHRlbnNpb25NYW5hZ2VyKGFsbEV4dGVuc2lvbnMsIHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBjb21tYW5kIG1hbmFnZXIuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbW1hbmRNYW5hZ2VyKCk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZE1hbmFnZXIgPSBuZXcgQ29tbWFuZE1hbmFnZXIoe1xuICAgICAgZWRpdG9yOiB0aGlzLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIFByb3NlTWlycm9yIHNjaGVtYS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU2NoZW1hKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZW1hID0gdGhpcy5leHRlbnNpb25NYW5hZ2VyLnNjaGVtYVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBQcm9zZU1pcnJvciB2aWV3LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVWaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IGRvYyA9IGNyZWF0ZURvY3VtZW50KHRoaXMub3B0aW9ucy5jb250ZW50LCB0aGlzLnNjaGVtYSwgdGhpcy5vcHRpb25zLnBhcnNlT3B0aW9ucylcbiAgICBjb25zdCBzZWxlY3Rpb24gPSByZXNvbHZlRm9jdXNQb3NpdGlvbihkb2MsIHRoaXMub3B0aW9ucy5hdXRvZm9jdXMpXG5cbiAgICB0aGlzLnZpZXcgPSBuZXcgRWRpdG9yVmlldyh0aGlzLm9wdGlvbnMuZWxlbWVudCwge1xuICAgICAgLi4udGhpcy5vcHRpb25zLmVkaXRvclByb3BzLFxuICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbjogdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9uLmJpbmQodGhpcyksXG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgZG9jLFxuICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbiB8fCB1bmRlZmluZWQsXG4gICAgICB9KSxcbiAgICB9KVxuXG4gICAgLy8gYGVkaXRvci52aWV3YCBpcyBub3QgeWV0IGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUuXG4gICAgLy8gVGhlcmVmb3JlIHdlIHdpbGwgYWRkIGFsbCBwbHVnaW5zIGFuZCBub2RlIHZpZXdzIGRpcmVjdGx5IGFmdGVyd2FyZHMuXG4gICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnN0YXRlLnJlY29uZmlndXJlKHtcbiAgICAgIHBsdWdpbnM6IHRoaXMuZXh0ZW5zaW9uTWFuYWdlci5wbHVnaW5zLFxuICAgIH0pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUobmV3U3RhdGUpXG5cbiAgICB0aGlzLmNyZWF0ZU5vZGVWaWV3cygpXG4gICAgdGhpcy5wcmVwZW5kQ2xhc3MoKVxuXG4gICAgLy8gTGV04oCZcyBzdG9yZSB0aGUgZWRpdG9yIGluc3RhbmNlIGluIHRoZSBET00gZWxlbWVudC5cbiAgICAvLyBTbyB3ZeKAmWxsIGhhdmUgYWNjZXNzIHRvIGl0IGZvciB0ZXN0cy5cbiAgICBjb25zdCBkb20gPSB0aGlzLnZpZXcuZG9tIGFzIEhUTUxFbGVtZW50XG5cbiAgICBkb20uZWRpdG9yID0gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYWxsIG5vZGUgdmlld3MuXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTm9kZVZpZXdzKCk6IHZvaWQge1xuICAgIHRoaXMudmlldy5zZXRQcm9wcyh7XG4gICAgICBub2RlVmlld3M6IHRoaXMuZXh0ZW5zaW9uTWFuYWdlci5ub2RlVmlld3MsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kIGNsYXNzIG5hbWUgdG8gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBwcmVwZW5kQ2xhc3MoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LmRvbS5jbGFzc05hbWUgPSBgdGlwdGFwICR7dGhpcy52aWV3LmRvbS5jbGFzc05hbWV9YFxuICB9XG5cbiAgcHVibGljIGlzQ2FwdHVyaW5nVHJhbnNhY3Rpb24gPSBmYWxzZVxuXG4gIHByaXZhdGUgY2FwdHVyZWRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gfCBudWxsID0gbnVsbFxuXG4gIHB1YmxpYyBjYXB0dXJlVHJhbnNhY3Rpb24oZm46IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5pc0NhcHR1cmluZ1RyYW5zYWN0aW9uID0gdHJ1ZVxuICAgIGZuKClcbiAgICB0aGlzLmlzQ2FwdHVyaW5nVHJhbnNhY3Rpb24gPSBmYWxzZVxuXG4gICAgY29uc3QgdHIgPSB0aGlzLmNhcHR1cmVkVHJhbnNhY3Rpb25cblxuICAgIHRoaXMuY2FwdHVyZWRUcmFuc2FjdGlvbiA9IG51bGxcblxuICAgIHJldHVybiB0clxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBvdmVyIHdoaWNoIHRvIHNlbmQgdHJhbnNhY3Rpb25zIChzdGF0ZSB1cGRhdGVzKSBwcm9kdWNlZCBieSB0aGUgdmlldy5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIEFuIGVkaXRvciBzdGF0ZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIC8vIGlmIHRoZSBlZGl0b3IgLyB0aGUgdmlldyBvZiB0aGUgZWRpdG9yIHdhcyBkZXN0cm95ZWRcbiAgICAvLyB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIG5vdCBiZSBkaXNwYXRjaGVkIGFzIHRoZXJlIGlzIG5vIHZpZXcgYW55bW9yZS5cbiAgICBpZiAodGhpcy52aWV3LmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NhcHR1cmluZ1RyYW5zYWN0aW9uKSB7XG4gICAgICBpZiAoIXRoaXMuY2FwdHVyZWRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmNhcHR1cmVkVHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvblxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zdGVwcy5mb3JFYWNoKHN0ZXAgPT4gdGhpcy5jYXB0dXJlZFRyYW5zYWN0aW9uPy5zdGVwKHN0ZXApKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUuYXBwbHkodHJhbnNhY3Rpb24pXG4gICAgY29uc3Qgc2VsZWN0aW9uSGFzQ2hhbmdlZCA9ICF0aGlzLnN0YXRlLnNlbGVjdGlvbi5lcShzdGF0ZS5zZWxlY3Rpb24pXG5cbiAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUoc3RhdGUpXG4gICAgdGhpcy5lbWl0KCd0cmFuc2FjdGlvbicsIHtcbiAgICAgIGVkaXRvcjogdGhpcyxcbiAgICAgIHRyYW5zYWN0aW9uLFxuICAgIH0pXG5cbiAgICBpZiAoc2VsZWN0aW9uSGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5lbWl0KCdzZWxlY3Rpb25VcGRhdGUnLCB7XG4gICAgICAgIGVkaXRvcjogdGhpcyxcbiAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzID0gdHJhbnNhY3Rpb24uZ2V0TWV0YSgnZm9jdXMnKVxuICAgIGNvbnN0IGJsdXIgPSB0cmFuc2FjdGlvbi5nZXRNZXRhKCdibHVyJylcblxuICAgIGlmIChmb2N1cykge1xuICAgICAgdGhpcy5lbWl0KCdmb2N1cycsIHtcbiAgICAgICAgZWRpdG9yOiB0aGlzLFxuICAgICAgICBldmVudDogZm9jdXMuZXZlbnQsXG4gICAgICAgIHRyYW5zYWN0aW9uLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYmx1cikge1xuICAgICAgdGhpcy5lbWl0KCdibHVyJywge1xuICAgICAgICBlZGl0b3I6IHRoaXMsXG4gICAgICAgIGV2ZW50OiBibHVyLmV2ZW50LFxuICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKCF0cmFuc2FjdGlvbi5kb2NDaGFuZ2VkIHx8IHRyYW5zYWN0aW9uLmdldE1ldGEoJ3ByZXZlbnRVcGRhdGUnKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KCd1cGRhdGUnLCB7XG4gICAgICBlZGl0b3I6IHRoaXMsXG4gICAgICB0cmFuc2FjdGlvbixcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdHRyaWJ1dGVzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBvciBtYXJrLlxuICAgKi9cbiAgcHVibGljIGdldEF0dHJpYnV0ZXMobmFtZU9yVHlwZTogc3RyaW5nIHwgTm9kZVR5cGUgfCBNYXJrVHlwZSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKHRoaXMuc3RhdGUsIG5hbWVPclR5cGUpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5vZGUgb3IgbWFyayBpcyBhY3RpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5vZGUgb3IgbWFya1xuICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBdHRyaWJ1dGVzIG9mIHRoZSBub2RlIG9yIG1hcmtcbiAgICovXG4gIHB1YmxpYyBpc0FjdGl2ZShuYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZXM/OiB7fSk6IGJvb2xlYW5cbiAgcHVibGljIGlzQWN0aXZlKGF0dHJpYnV0ZXM6IHt9KTogYm9vbGVhblxuICBwdWJsaWMgaXNBY3RpdmUobmFtZU9yQXR0cmlidXRlczogc3RyaW5nLCBhdHRyaWJ1dGVzT3JVbmRlZmluZWQ/OiB7fSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgbmFtZU9yQXR0cmlidXRlcyA9PT0gJ3N0cmluZycgPyBuYW1lT3JBdHRyaWJ1dGVzIDogbnVsbFxuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHR5cGVvZiBuYW1lT3JBdHRyaWJ1dGVzID09PSAnc3RyaW5nJyA/IGF0dHJpYnV0ZXNPclVuZGVmaW5lZCA6IG5hbWVPckF0dHJpYnV0ZXNcblxuICAgIHJldHVybiBpc0FjdGl2ZSh0aGlzLnN0YXRlLCBuYW1lLCBhdHRyaWJ1dGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZG9jdW1lbnQgYXMgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBnZXRKU09OKCk6IEpTT05Db250ZW50IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5kb2MudG9KU09OKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRvY3VtZW50IGFzIEhUTUwuXG4gICAqL1xuICBwdWJsaWMgZ2V0SFRNTCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRIVE1MRnJvbUZyYWdtZW50KHRoaXMuc3RhdGUuZG9jLmNvbnRlbnQsIHRoaXMuc2NoZW1hKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZG9jdW1lbnQgYXMgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXRUZXh0KG9wdGlvbnM/OiB7XG4gICAgYmxvY2tTZXBhcmF0b3I/OiBzdHJpbmdcbiAgICB0ZXh0U2VyaWFsaXplcnM/OiBSZWNvcmQ8c3RyaW5nLCBUZXh0U2VyaWFsaXplcj5cbiAgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBibG9ja1NlcGFyYXRvciA9ICdcXG5cXG4nLCB0ZXh0U2VyaWFsaXplcnMgPSB7fSB9ID0gb3B0aW9ucyB8fCB7fVxuXG4gICAgcmV0dXJuIGdldFRleHQodGhpcy5zdGF0ZS5kb2MsIHtcbiAgICAgIGJsb2NrU2VwYXJhdG9yLFxuICAgICAgdGV4dFNlcmlhbGl6ZXJzOiB7XG4gICAgICAgIC4uLmdldFRleHRTZXJpYWxpemVyc0Zyb21TY2hlbWEodGhpcy5zY2hlbWEpLFxuICAgICAgICAuLi50ZXh0U2VyaWFsaXplcnMsXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUgaXMgbm8gY29udGVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOb2RlRW1wdHkodGhpcy5zdGF0ZS5kb2MpXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2hhcmFjdGVyQ291bnQoKTogbnVtYmVyIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3RpcHRhcCB3YXJuXTogXCJlZGl0b3IuZ2V0Q2hhcmFjdGVyQ291bnQoKVwiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJlZGl0b3Iuc3RvcmFnZS5jaGFyYWN0ZXJDb3VudC5jaGFyYWN0ZXJzKClcIiBpbnN0ZWFkLicsXG4gICAgKVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSAtIDJcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBlZGl0b3IuXG4gICAqL1xuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKVxuXG4gICAgaWYgKHRoaXMudmlldykge1xuICAgICAgdGhpcy52aWV3LmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgZGVzdHJveWVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICF0aGlzLnZpZXc/LmRvY1ZpZXdcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgZ2V0TWFya3NCZXR3ZWVuIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrc0JldHdlZW4uanMnXG5pbXBvcnQgeyBJbnB1dFJ1bGUsIElucHV0UnVsZUZpbmRlciB9IGZyb20gJy4uL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBpbnB1dCBydWxlIHRoYXQgYWRkcyBhIG1hcmsgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyB0eXBlZCBpbnRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya0lucHV0UnVsZShjb25maWc6IHtcbiAgZmluZDogSW5wdXRSdWxlRmluZGVyXG4gIHR5cGU6IE1hcmtUeXBlXG4gIGdldEF0dHJpYnV0ZXM/OlxuICAgIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICAgIHwgKChtYXRjaDogRXh0ZW5kZWRSZWdFeHBNYXRjaEFycmF5KSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgIHwgZmFsc2VcbiAgICB8IG51bGxcbn0pIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXI6ICh7IHN0YXRlLCByYW5nZSwgbWF0Y2ggfSkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGNhbGxPclJldHVybihjb25maWcuZ2V0QXR0cmlidXRlcywgdW5kZWZpbmVkLCBtYXRjaClcblxuICAgICAgaWYgKGF0dHJpYnV0ZXMgPT09IGZhbHNlIHx8IGF0dHJpYnV0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0ciB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IGNhcHR1cmVHcm91cCA9IG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdXG4gICAgICBjb25zdCBmdWxsTWF0Y2ggPSBtYXRjaFswXVxuXG4gICAgICBpZiAoY2FwdHVyZUdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0U3BhY2VzID0gZnVsbE1hdGNoLnNlYXJjaCgvXFxTLylcbiAgICAgICAgY29uc3QgdGV4dFN0YXJ0ID0gcmFuZ2UuZnJvbSArIGZ1bGxNYXRjaC5pbmRleE9mKGNhcHR1cmVHcm91cClcbiAgICAgICAgY29uc3QgdGV4dEVuZCA9IHRleHRTdGFydCArIGNhcHR1cmVHcm91cC5sZW5ndGhcblxuICAgICAgICBjb25zdCBleGNsdWRlZE1hcmtzID0gZ2V0TWFya3NCZXR3ZWVuKHJhbmdlLmZyb20sIHJhbmdlLnRvLCBzdGF0ZS5kb2MpXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gaXRlbS5tYXJrLnR5cGUuZXhjbHVkZWQgYXMgTWFya1R5cGVbXVxuXG4gICAgICAgICAgICByZXR1cm4gZXhjbHVkZWQuZmluZCh0eXBlID0+IHR5cGUgPT09IGNvbmZpZy50eXBlICYmIHR5cGUgIT09IGl0ZW0ubWFyay50eXBlKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udG8gPiB0ZXh0U3RhcnQpXG5cbiAgICAgICAgaWYgKGV4Y2x1ZGVkTWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXh0RW5kIDwgcmFuZ2UudG8pIHtcbiAgICAgICAgICB0ci5kZWxldGUodGV4dEVuZCwgcmFuZ2UudG8pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dFN0YXJ0ID4gcmFuZ2UuZnJvbSkge1xuICAgICAgICAgIHRyLmRlbGV0ZShyYW5nZS5mcm9tICsgc3RhcnRTcGFjZXMsIHRleHRTdGFydClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcmtFbmQgPSByYW5nZS5mcm9tICsgc3RhcnRTcGFjZXMgKyBjYXB0dXJlR3JvdXAubGVuZ3RoXG5cbiAgICAgICAgdHIuYWRkTWFyayhyYW5nZS5mcm9tICsgc3RhcnRTcGFjZXMsIG1hcmtFbmQsIGNvbmZpZy50eXBlLmNyZWF0ZShhdHRyaWJ1dGVzIHx8IHt9KSlcblxuICAgICAgICB0ci5yZW1vdmVTdG9yZWRNYXJrKGNvbmZpZy50eXBlKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBJbnB1dFJ1bGUsIElucHV0UnVsZUZpbmRlciB9IGZyb20gJy4uL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBpbnB1dCBydWxlIHRoYXQgYWRkcyBhIG5vZGUgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyB0eXBlZCBpbnRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9kZUlucHV0UnVsZShjb25maWc6IHtcbiAgLyoqXG4gICAqIFRoZSByZWdleCB0byBtYXRjaC5cbiAgICovXG4gIGZpbmQ6IElucHV0UnVsZUZpbmRlclxuXG4gIC8qKlxuICAgKiBUaGUgbm9kZSB0eXBlIHRvIGFkZC5cbiAgICovXG4gIHR5cGU6IE5vZGVUeXBlXG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgbm9kZVxuICAgKiBjYW4gYWxzbyBiZSBhbiBvYmplY3Qgb2YgYXR0cmlidXRlc1xuICAgKi9cbiAgZ2V0QXR0cmlidXRlcz86XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfCAoKG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkpID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgfCBmYWxzZVxuICAgIHwgbnVsbFxufSkge1xuICByZXR1cm4gbmV3IElucHV0UnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY2FsbE9yUmV0dXJuKGNvbmZpZy5nZXRBdHRyaWJ1dGVzLCB1bmRlZmluZWQsIG1hdGNoKSB8fCB7fVxuICAgICAgY29uc3QgeyB0ciB9ID0gc3RhdGVcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcmFuZ2UuZnJvbVxuICAgICAgbGV0IGVuZCA9IHJhbmdlLnRvXG5cbiAgICAgIGNvbnN0IG5ld05vZGUgPSBjb25maWcudHlwZS5jcmVhdGUoYXR0cmlidXRlcylcblxuICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IG1hdGNoWzBdLmxhc3RJbmRleE9mKG1hdGNoWzFdKVxuICAgICAgICBsZXQgbWF0Y2hTdGFydCA9IHN0YXJ0ICsgb2Zmc2V0XG5cbiAgICAgICAgaWYgKG1hdGNoU3RhcnQgPiBlbmQpIHtcbiAgICAgICAgICBtYXRjaFN0YXJ0ID0gZW5kXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gbWF0Y2hTdGFydCArIG1hdGNoWzFdLmxlbmd0aFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5zZXJ0IGxhc3QgdHlwZWQgY2hhcmFjdGVyXG4gICAgICAgIGNvbnN0IGxhc3RDaGFyID0gbWF0Y2hbMF1bbWF0Y2hbMF0ubGVuZ3RoIC0gMV1cblxuICAgICAgICB0ci5pbnNlcnRUZXh0KGxhc3RDaGFyLCBzdGFydCArIG1hdGNoWzBdLmxlbmd0aCAtIDEpXG5cbiAgICAgICAgLy8gaW5zZXJ0IG5vZGUgZnJvbSBpbnB1dCBydWxlXG4gICAgICAgIHRyLnJlcGxhY2VXaXRoKG1hdGNoU3RhcnQsIGVuZCwgbmV3Tm9kZSlcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hbMF0pIHtcbiAgICAgICAgdHIuaW5zZXJ0KHN0YXJ0IC0gMSwgY29uZmlnLnR5cGUuY3JlYXRlKGF0dHJpYnV0ZXMpKS5kZWxldGUoXG4gICAgICAgICAgdHIubWFwcGluZy5tYXAoc3RhcnQpLFxuICAgICAgICAgIHRyLm1hcHBpbmcubWFwKGVuZCksXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgdHIuc2Nyb2xsSW50b1ZpZXcoKVxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5pbXBvcnQgeyBJbnB1dFJ1bGUsIElucHV0UnVsZUZpbmRlciB9IGZyb20gJy4uL0lucHV0UnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBpbnB1dCBydWxlIHRoYXQgY2hhbmdlcyB0aGUgdHlwZSBvZiBhIHRleHRibG9jayB3aGVuIHRoZVxuICogbWF0Y2hlZCB0ZXh0IGlzIHR5cGVkIGludG8gaXQuIFdoZW4gdXNpbmcgYSByZWd1bGFyIGV4cHJlc2lvbiB5b3XigJlsbFxuICogcHJvYmFibHkgd2FudCB0aGUgcmVnZXhwIHRvIHN0YXJ0IHdpdGggYF5gLCBzbyB0aGF0IHRoZSBwYXR0ZXJuIGNhblxuICogb25seSBvY2N1ciBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKGNvbmZpZzoge1xuICBmaW5kOiBJbnB1dFJ1bGVGaW5kZXJcbiAgdHlwZTogTm9kZVR5cGVcbiAgZ2V0QXR0cmlidXRlcz86XG4gICAgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfCAoKG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkpID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgfCBmYWxzZVxuICAgIHwgbnVsbFxufSkge1xuICByZXR1cm4gbmV3IElucHV0UnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBjb25zdCAkc3RhcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShyYW5nZS5mcm9tKVxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGNhbGxPclJldHVybihjb25maWcuZ2V0QXR0cmlidXRlcywgdW5kZWZpbmVkLCBtYXRjaCkgfHwge31cblxuICAgICAgaWYgKCEkc3RhcnQubm9kZSgtMSkuY2FuUmVwbGFjZVdpdGgoJHN0YXJ0LmluZGV4KC0xKSwgJHN0YXJ0LmluZGV4QWZ0ZXIoLTEpLCBjb25maWcudHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgc3RhdGUudHJcbiAgICAgICAgLmRlbGV0ZShyYW5nZS5mcm9tLCByYW5nZS50bylcbiAgICAgICAgLnNldEJsb2NrVHlwZShyYW5nZS5mcm9tLCByYW5nZS5mcm9tLCBjb25maWcudHlwZSwgYXR0cmlidXRlcylcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IElucHV0UnVsZSwgSW5wdXRSdWxlRmluZGVyIH0gZnJvbSAnLi4vSW5wdXRSdWxlLmpzJ1xuXG4vKipcbiAqIEJ1aWxkIGFuIGlucHV0IHJ1bGUgdGhhdCByZXBsYWNlcyB0ZXh0IHdoZW4gdGhlXG4gKiBtYXRjaGVkIHRleHQgaXMgdHlwZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRleHRJbnB1dFJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IElucHV0UnVsZUZpbmRlcixcbiAgcmVwbGFjZTogc3RyaW5nLFxufSkge1xuICByZXR1cm4gbmV3IElucHV0UnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBsZXQgaW5zZXJ0ID0gY29uZmlnLnJlcGxhY2VcbiAgICAgIGxldCBzdGFydCA9IHJhbmdlLmZyb21cbiAgICAgIGNvbnN0IGVuZCA9IHJhbmdlLnRvXG5cbiAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtYXRjaFswXS5sYXN0SW5kZXhPZihtYXRjaFsxXSlcblxuICAgICAgICBpbnNlcnQgKz0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0ICsgbWF0Y2hbMV0ubGVuZ3RoKVxuICAgICAgICBzdGFydCArPSBvZmZzZXRcblxuICAgICAgICBjb25zdCBjdXRPZmYgPSBzdGFydCAtIGVuZFxuXG4gICAgICAgIGlmIChjdXRPZmYgPiAwKSB7XG4gICAgICAgICAgaW5zZXJ0ID0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0IC0gY3V0T2ZmLCBvZmZzZXQpICsgaW5zZXJ0XG4gICAgICAgICAgc3RhcnQgPSBlbmRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0ZS50ci5pbnNlcnRUZXh0KGluc2VydCwgc3RhcnQsIGVuZClcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlLCBOb2RlVHlwZSB9IGZyb20gJ0B0aXB0YXAvcG0vbW9kZWwnXG5pbXBvcnQgeyBjYW5Kb2luLCBmaW5kV3JhcHBpbmcgfSBmcm9tICdAdGlwdGFwL3BtL3RyYW5zZm9ybSdcblxuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnLi4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgSW5wdXRSdWxlLCBJbnB1dFJ1bGVGaW5kZXIgfSBmcm9tICcuLi9JbnB1dFJ1bGUuanMnXG5pbXBvcnQgeyBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4uL3V0aWxpdGllcy9jYWxsT3JSZXR1cm4uanMnXG5cbi8qKlxuICogQnVpbGQgYW4gaW5wdXQgcnVsZSBmb3IgYXV0b21hdGljYWxseSB3cmFwcGluZyBhIHRleHRibG9jayB3aGVuIGFcbiAqIGdpdmVuIHN0cmluZyBpcyB0eXBlZC4gV2hlbiB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzaW9uIHlvdeKAmWxsXG4gKiBwcm9iYWJseSB3YW50IHRoZSByZWdleHAgdG8gc3RhcnQgd2l0aCBgXmAsIHNvIHRoYXQgdGhlIHBhdHRlcm4gY2FuXG4gKiBvbmx5IG9jY3VyIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jay5cbiAqXG4gKiBgdHlwZWAgaXMgdGhlIHR5cGUgb2Ygbm9kZSB0byB3cmFwIGluLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGlmIHRoZXJl4oCZcyBhIG5vZGUgd2l0aCB0aGUgc2FtZSB0eXBlIGFib3ZlIHRoZSBuZXdseVxuICogd3JhcHBlZCBub2RlLCB0aGUgcnVsZSB3aWxsIHRyeSB0byBqb2luIHRob3NlXG4gKiB0d28gbm9kZXMuIFlvdSBjYW4gcGFzcyBhIGpvaW4gcHJlZGljYXRlLCB3aGljaCB0YWtlcyBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24gbWF0Y2ggYW5kIHRoZSBub2RlIGJlZm9yZSB0aGUgd3JhcHBlZCBub2RlLCBhbmQgY2FuXG4gKiByZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgYSBqb2luIHNob3VsZCBoYXBwZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwcGluZ0lucHV0UnVsZShjb25maWc6IHtcbiAgZmluZDogSW5wdXRSdWxlRmluZGVyLFxuICB0eXBlOiBOb2RlVHlwZSxcbiAga2VlcE1hcmtzPzogYm9vbGVhbixcbiAga2VlcEF0dHJpYnV0ZXM/OiBib29sZWFuLFxuICBlZGl0b3I/OiBFZGl0b3JcbiAgZ2V0QXR0cmlidXRlcz86XG4gIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICB8ICgobWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSkgPT4gUmVjb3JkPHN0cmluZywgYW55PilcbiAgfCBmYWxzZVxuICB8IG51bGxcbiAgLFxuICBqb2luUHJlZGljYXRlPzogKG1hdGNoOiBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXksIG5vZGU6IFByb3NlTWlycm9yTm9kZSkgPT4gYm9vbGVhbixcbn0pIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXI6ICh7XG4gICAgICBzdGF0ZSwgcmFuZ2UsIG1hdGNoLCBjaGFpbixcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY2FsbE9yUmV0dXJuKGNvbmZpZy5nZXRBdHRyaWJ1dGVzLCB1bmRlZmluZWQsIG1hdGNoKSB8fCB7fVxuICAgICAgY29uc3QgdHIgPSBzdGF0ZS50ci5kZWxldGUocmFuZ2UuZnJvbSwgcmFuZ2UudG8pXG4gICAgICBjb25zdCAkc3RhcnQgPSB0ci5kb2MucmVzb2x2ZShyYW5nZS5mcm9tKVxuICAgICAgY29uc3QgYmxvY2tSYW5nZSA9ICRzdGFydC5ibG9ja1JhbmdlKClcbiAgICAgIGNvbnN0IHdyYXBwaW5nID0gYmxvY2tSYW5nZSAmJiBmaW5kV3JhcHBpbmcoYmxvY2tSYW5nZSwgY29uZmlnLnR5cGUsIGF0dHJpYnV0ZXMpXG5cbiAgICAgIGlmICghd3JhcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgdHIud3JhcChibG9ja1JhbmdlLCB3cmFwcGluZylcblxuICAgICAgaWYgKGNvbmZpZy5rZWVwTWFya3MgJiYgY29uZmlnLmVkaXRvcikge1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgc3RvcmVkTWFya3MgfSA9IHN0YXRlXG4gICAgICAgIGNvbnN0IHsgc3BsaXR0YWJsZU1hcmtzIH0gPSBjb25maWcuZWRpdG9yLmV4dGVuc2lvbk1hbmFnZXJcbiAgICAgICAgY29uc3QgbWFya3MgPSBzdG9yZWRNYXJrcyB8fCAoc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpXG5cbiAgICAgICAgaWYgKG1hcmtzKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzLmZpbHRlcihtYXJrID0+IHNwbGl0dGFibGVNYXJrcy5pbmNsdWRlcyhtYXJrLnR5cGUubmFtZSkpXG5cbiAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhmaWx0ZXJlZE1hcmtzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICAgIC8qKiBJZiB0aGUgbm9kZVR5cGUgaXMgYGJ1bGxldExpc3RgIG9yIGBvcmRlcmVkTGlzdGAgc2V0IHRoZSBgbm9kZVR5cGVgIGFzIGBsaXN0SXRlbWAgKi9cbiAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBjb25maWcudHlwZS5uYW1lID09PSAnYnVsbGV0TGlzdCcgfHwgY29uZmlnLnR5cGUubmFtZSA9PT0gJ29yZGVyZWRMaXN0JyA/ICdsaXN0SXRlbScgOiAndGFza0xpc3QnXG5cbiAgICAgICAgY2hhaW4oKS51cGRhdGVBdHRyaWJ1dGVzKG5vZGVUeXBlLCBhdHRyaWJ1dGVzKS5ydW4oKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBiZWZvcmUgPSB0ci5kb2MucmVzb2x2ZShyYW5nZS5mcm9tIC0gMSkubm9kZUJlZm9yZVxuXG4gICAgICBpZiAoXG4gICAgICAgIGJlZm9yZVxuICAgICAgICAmJiBiZWZvcmUudHlwZSA9PT0gY29uZmlnLnR5cGVcbiAgICAgICAgJiYgY2FuSm9pbih0ci5kb2MsIHJhbmdlLmZyb20gLSAxKVxuICAgICAgICAmJiAoIWNvbmZpZy5qb2luUHJlZGljYXRlIHx8IGNvbmZpZy5qb2luUHJlZGljYXRlKG1hdGNoLCBiZWZvcmUpKVxuICAgICAgKSB7XG4gICAgICAgIHRyLmpvaW4ocmFuZ2UuZnJvbSAtIDEpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQge1xuICBET01PdXRwdXRTcGVjLCBNYXJrIGFzIFByb3NlTWlycm9yTWFyaywgTWFya1NwZWMsIE1hcmtUeXBlLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQuanMnXG5pbXBvcnQgeyBNYXJrQ29uZmlnIH0gZnJvbSAnLi9pbmRleC5qcydcbmltcG9ydCB7IElucHV0UnVsZSB9IGZyb20gJy4vSW5wdXRSdWxlLmpzJ1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJy4vTm9kZS5qcydcbmltcG9ydCB7IFBhc3RlUnVsZSB9IGZyb20gJy4vUGFzdGVSdWxlLmpzJ1xuaW1wb3J0IHtcbiAgQW55Q29uZmlnLFxuICBBdHRyaWJ1dGVzLFxuICBFeHRlbnNpb25zLFxuICBHbG9iYWxBdHRyaWJ1dGVzLFxuICBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZCxcbiAgUGFyZW50Q29uZmlnLFxuICBSYXdDb21tYW5kcyxcbn0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcbmltcG9ydCB7IG1lcmdlRGVlcCB9IGZyb20gJy4vdXRpbGl0aWVzL21lcmdlRGVlcC5qcydcblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBleHBvcnQgaW50ZXJmYWNlIE1hcmtDb25maWc8T3B0aW9ucyA9IGFueSwgU3RvcmFnZSA9IGFueT4ge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxuXG4gICAgLyoqXG4gICAgICogTmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogUHJpb3JpdHlcbiAgICAgKi9cbiAgICBwcmlvcml0eT86IG51bWJlclxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBvcHRpb25zXG4gICAgICovXG4gICAgZGVmYXVsdE9wdGlvbnM/OiBPcHRpb25zXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IE9wdGlvbnNcbiAgICAgKi9cbiAgICBhZGRPcHRpb25zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgcGFyZW50OiBFeGNsdWRlPFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkT3B0aW9ucyddLCB1bmRlZmluZWQ+XG4gICAgfSkgPT4gT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBTdG9yYWdlXG4gICAgICovXG4gICAgYWRkU3RvcmFnZT86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFN0b3JhZ2UnXSwgdW5kZWZpbmVkPlxuICAgIH0pID0+IFN0b3JhZ2VcblxuICAgIC8qKlxuICAgICAqIEdsb2JhbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkR2xvYmFsQXR0cmlidXRlcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRHbG9iYWxBdHRyaWJ1dGVzJ11cbiAgICB9KSA9PiBHbG9iYWxBdHRyaWJ1dGVzIHwge31cblxuICAgIC8qKlxuICAgICAqIFJhd1xuICAgICAqL1xuICAgIGFkZENvbW1hbmRzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkQ29tbWFuZHMnXVxuICAgIH0pID0+IFBhcnRpYWw8UmF3Q29tbWFuZHM+XG5cbiAgICAvKipcbiAgICAgKiBLZXlib2FyZCBzaG9ydGN1dHNcbiAgICAgKi9cbiAgICBhZGRLZXlib2FyZFNob3J0Y3V0cz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEtleWJvYXJkU2hvcnRjdXRzJ11cbiAgICB9KSA9PiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBLZXlib2FyZFNob3J0Y3V0Q29tbWFuZFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElucHV0IHJ1bGVzXG4gICAgICovXG4gICAgYWRkSW5wdXRSdWxlcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZElucHV0UnVsZXMnXVxuICAgIH0pID0+IElucHV0UnVsZVtdXG5cbiAgICAvKipcbiAgICAgKiBQYXN0ZSBydWxlc1xuICAgICAqL1xuICAgIGFkZFBhc3RlUnVsZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRQYXN0ZVJ1bGVzJ11cbiAgICB9KSA9PiBQYXN0ZVJ1bGVbXVxuXG4gICAgLyoqXG4gICAgICogUHJvc2VNaXJyb3IgcGx1Z2luc1xuICAgICAqL1xuICAgIGFkZFByb3NlTWlycm9yUGx1Z2lucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZFByb3NlTWlycm9yUGx1Z2lucyddXG4gICAgfSkgPT4gUGx1Z2luW11cblxuICAgIC8qKlxuICAgICAqIEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBhZGRFeHRlbnNpb25zPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEV4dGVuc2lvbnMnXVxuICAgIH0pID0+IEV4dGVuc2lvbnNcblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCBOb2RlIFNjaGVtYVxuICAgICAqL1xuICAgIGV4dGVuZE5vZGVTY2hlbWE/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4dGVuZE5vZGVTY2hlbWEnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBOb2RlLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCBNYXJrIFNjaGVtYVxuICAgICAqL1xuICAgIGV4dGVuZE1hcmtTY2hlbWE/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4dGVuZE1hcmtTY2hlbWEnXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBNYXJrLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgbm90IHJlYWR5IHlldC5cbiAgICAgKi9cbiAgICBvbkJlZm9yZUNyZWF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkJlZm9yZUNyZWF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgcmVhZHkuXG4gICAgICovXG4gICAgb25DcmVhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25DcmVhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBvblVwZGF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBNYXJrVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvblVwZGF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICovXG4gICAgb25TZWxlY3Rpb25VcGRhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25TZWxlY3Rpb25VcGRhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uVHJhbnNhY3Rpb24/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25UcmFuc2FjdGlvbiddXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG4gICAgICAgICAgfSxcbiAgICAgICAgKSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGlzIGZvY3VzZWQuXG4gICAgICovXG4gICAgb25Gb2N1cz86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgICAgdHlwZTogTWFya1R5cGVcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkZvY3VzJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpc27igJl0IGZvY3VzZWQgYW55bW9yZS5cbiAgICAgKi9cbiAgICBvbkJsdXI/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25CbHVyJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgb25EZXN0cm95PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHR5cGU6IE1hcmtUeXBlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRGVzdHJveSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIEtlZXAgbWFyayBhZnRlciBzcGxpdCBub2RlXG4gICAgICovXG4gICAga2VlcE9uU3BsaXQ/OiBib29sZWFuIHwgKCgpID0+IGJvb2xlYW4pXG5cbiAgICAvKipcbiAgICAgKiBJbmNsdXNpdmVcbiAgICAgKi9cbiAgICBpbmNsdXNpdmU/OlxuICAgICAgfCBNYXJrU3BlY1snaW5jbHVzaXZlJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnaW5jbHVzaXZlJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTWFya1NwZWNbJ2luY2x1c2l2ZSddKVxuXG4gICAgLyoqXG4gICAgICogRXhjbHVkZXNcbiAgICAgKi9cbiAgICBleGNsdWRlcz86XG4gICAgICB8IE1hcmtTcGVjWydleGNsdWRlcyddXG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2V4Y2x1ZGVzJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTWFya1NwZWNbJ2V4Y2x1ZGVzJ10pXG5cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGlzIE1hcmsgYXMgZXhpdGFibGVcbiAgICAgKi9cbiAgICBleGl0YWJsZT86IGJvb2xlYW4gfCAoKCkgPT4gYm9vbGVhbilcblxuICAgIC8qKlxuICAgICAqIEdyb3VwXG4gICAgICovXG4gICAgZ3JvdXA/OlxuICAgICAgfCBNYXJrU3BlY1snZ3JvdXAnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+Wydncm91cCddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE1hcmtTcGVjWydncm91cCddKVxuXG4gICAgLyoqXG4gICAgICogU3Bhbm5pbmdcbiAgICAgKi9cbiAgICBzcGFubmluZz86XG4gICAgICB8IE1hcmtTcGVjWydzcGFubmluZyddXG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ3NwYW5uaW5nJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTWFya1NwZWNbJ3NwYW5uaW5nJ10pXG5cbiAgICAvKipcbiAgICAgKiBDb2RlXG4gICAgICovXG4gICAgY29kZT86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxNYXJrQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnY29kZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IGJvb2xlYW4pXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBIVE1MXG4gICAgICovXG4gICAgcGFyc2VIVE1MPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ3BhcnNlSFRNTCddXG4gICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICB9KSA9PiBNYXJrU3BlY1sncGFyc2VET00nXVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIEhUTUxcbiAgICAgKi9cbiAgICByZW5kZXJIVE1MPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE1hcmtDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydyZW5kZXJIVE1MJ11cbiAgICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIG1hcms6IFByb3NlTWlycm9yTWFya1xuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICB9LFxuICAgICAgICApID0+IERPTU91dHB1dFNwZWMpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRBdHRyaWJ1dGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZEF0dHJpYnV0ZXMnXVxuICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgfSkgPT4gQXR0cmlidXRlcyB8IHt9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcms8T3B0aW9ucyA9IGFueSwgU3RvcmFnZSA9IGFueT4ge1xuICB0eXBlID0gJ21hcmsnXG5cbiAgbmFtZSA9ICdtYXJrJ1xuXG4gIHBhcmVudDogTWFyayB8IG51bGwgPSBudWxsXG5cbiAgY2hpbGQ6IE1hcmsgfCBudWxsID0gbnVsbFxuXG4gIG9wdGlvbnM6IE9wdGlvbnNcblxuICBzdG9yYWdlOiBTdG9yYWdlXG5cbiAgY29uZmlnOiBNYXJrQ29uZmlnID0ge1xuICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICBkZWZhdWx0T3B0aW9uczoge30sXG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8TWFya0NvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj4gPSB7fSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAuLi5jb25maWcsXG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25maWcubmFtZVxuXG4gICAgaWYgKGNvbmZpZy5kZWZhdWx0T3B0aW9ucykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3RpcHRhcCB3YXJuXTogQlJFQUtJTkcgQ0hBTkdFOiBcImRlZmF1bHRPcHRpb25zXCIgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBcImFkZE9wdGlvbnNcIiBpbnN0ZWFkLiBGb3VuZCBpbiBleHRlbnNpb246IFwiJHt0aGlzLm5hbWV9XCIuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgYGFkZE9wdGlvbnNgIGZhbGxiYWNrXG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5jb25maWcuZGVmYXVsdE9wdGlvbnNcblxuICAgIGlmICh0aGlzLmNvbmZpZy5hZGRPcHRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBjYWxsT3JSZXR1cm4oXG4gICAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkT3B0aW9ucyddPih0aGlzLCAnYWRkT3B0aW9ucycsIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZSA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkU3RvcmFnZSddPih0aGlzLCAnYWRkU3RvcmFnZScsIHtcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICB9KSxcbiAgICApIHx8IHt9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlPE8gPSBhbnksIFMgPSBhbnk+KGNvbmZpZzogUGFydGlhbDxNYXJrQ29uZmlnPE8sIFM+PiA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBNYXJrPE8sIFM+KGNvbmZpZylcbiAgfVxuXG4gIGNvbmZpZ3VyZShvcHRpb25zOiBQYXJ0aWFsPE9wdGlvbnM+ID0ge30pIHtcbiAgICAvLyByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugc28gd2UgY2FuIHVzZSB0aGUgc2FtZSBleHRlbnNpb25cbiAgICAvLyB3aXRoIGRpZmZlcmVudCBjYWxscyBvZiBgY29uZmlndXJlYFxuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMuZXh0ZW5kKClcblxuICAgIGV4dGVuc2lvbi5vcHRpb25zID0gbWVyZ2VEZWVwKHRoaXMub3B0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvcHRpb25zKSBhcyBPcHRpb25zXG5cbiAgICBleHRlbnNpb24uc3RvcmFnZSA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkU3RvcmFnZSddPihleHRlbnNpb24sICdhZGRTdG9yYWdlJywge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICB9KSxcbiAgICApXG5cbiAgICByZXR1cm4gZXh0ZW5zaW9uXG4gIH1cblxuICBleHRlbmQ8RXh0ZW5kZWRPcHRpb25zID0gT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlID0gU3RvcmFnZT4oXG4gICAgZXh0ZW5kZWRDb25maWc6IFBhcnRpYWw8TWFya0NvbmZpZzxFeHRlbmRlZE9wdGlvbnMsIEV4dGVuZGVkU3RvcmFnZT4+ID0ge30sXG4gICkge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IG5ldyBNYXJrPEV4dGVuZGVkT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlPihleHRlbmRlZENvbmZpZylcblxuICAgIGV4dGVuc2lvbi5wYXJlbnQgPSB0aGlzXG5cbiAgICB0aGlzLmNoaWxkID0gZXh0ZW5zaW9uXG5cbiAgICBleHRlbnNpb24ubmFtZSA9IGV4dGVuZGVkQ29uZmlnLm5hbWUgPyBleHRlbmRlZENvbmZpZy5uYW1lIDogZXh0ZW5zaW9uLnBhcmVudC5uYW1lXG5cbiAgICBpZiAoZXh0ZW5kZWRDb25maWcuZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt0aXB0YXAgd2Fybl06IEJSRUFLSU5HIENIQU5HRTogXCJkZWZhdWx0T3B0aW9uc1wiIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXCJhZGRPcHRpb25zXCIgaW5zdGVhZC4gRm91bmQgaW4gZXh0ZW5zaW9uOiBcIiR7ZXh0ZW5zaW9uLm5hbWV9XCIuYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBleHRlbnNpb24ub3B0aW9ucyA9IGNhbGxPclJldHVybihcbiAgICAgIGdldEV4dGVuc2lvbkZpZWxkPEFueUNvbmZpZ1snYWRkT3B0aW9ucyddPihleHRlbnNpb24sICdhZGRPcHRpb25zJywge1xuICAgICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVFeGl0KHsgZWRpdG9yLCBtYXJrIH06IHsgZWRpdG9yOiBFZGl0b3I7IG1hcms6IE1hcmsgfSkge1xuICAgIGNvbnN0IHsgdHIgfSA9IGVkaXRvci5zdGF0ZVxuICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLiRmcm9tXG4gICAgY29uc3QgaXNBdEVuZCA9IGN1cnJlbnRQb3MucG9zID09PSBjdXJyZW50UG9zLmVuZCgpXG5cbiAgICBpZiAoaXNBdEVuZCkge1xuICAgICAgY29uc3QgY3VycmVudE1hcmtzID0gY3VycmVudFBvcy5tYXJrcygpXG4gICAgICBjb25zdCBpc0luTWFyayA9ICEhY3VycmVudE1hcmtzLmZpbmQobSA9PiBtPy50eXBlLm5hbWUgPT09IG1hcmsubmFtZSlcblxuICAgICAgaWYgKCFpc0luTWFyaykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVtb3ZlTWFyayA9IGN1cnJlbnRNYXJrcy5maW5kKG0gPT4gbT8udHlwZS5uYW1lID09PSBtYXJrLm5hbWUpXG5cbiAgICAgIGlmIChyZW1vdmVNYXJrKSB7XG4gICAgICAgIHRyLnJlbW92ZVN0b3JlZE1hcmsocmVtb3ZlTWFyaylcbiAgICAgIH1cbiAgICAgIHRyLmluc2VydFRleHQoJyAnLCBjdXJyZW50UG9zLnBvcylcblxuICAgICAgZWRpdG9yLnZpZXcuZGlzcGF0Y2godHIpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBET01PdXRwdXRTcGVjLCBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSwgTm9kZVNwZWMsIE5vZGVUeXBlLFxufSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vRWRpdG9yLmpzJ1xuaW1wb3J0IHsgZ2V0RXh0ZW5zaW9uRmllbGQgfSBmcm9tICcuL2hlbHBlcnMvZ2V0RXh0ZW5zaW9uRmllbGQuanMnXG5pbXBvcnQgeyBOb2RlQ29uZmlnIH0gZnJvbSAnLi9pbmRleC5qcydcbmltcG9ydCB7IElucHV0UnVsZSB9IGZyb20gJy4vSW5wdXRSdWxlLmpzJ1xuaW1wb3J0IHsgUGFzdGVSdWxlIH0gZnJvbSAnLi9QYXN0ZVJ1bGUuanMnXG5pbXBvcnQge1xuICBBbnlDb25maWcsXG4gIEF0dHJpYnV0ZXMsXG4gIEV4dGVuc2lvbnMsXG4gIEdsb2JhbEF0dHJpYnV0ZXMsXG4gIEtleWJvYXJkU2hvcnRjdXRDb21tYW5kLFxuICBOb2RlVmlld1JlbmRlcmVyLFxuICBQYXJlbnRDb25maWcsXG4gIFJhd0NvbW1hbmRzLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi91dGlsaXRpZXMvY2FsbE9yUmV0dXJuLmpzJ1xuaW1wb3J0IHsgbWVyZ2VEZWVwIH0gZnJvbSAnLi91dGlsaXRpZXMvbWVyZ2VEZWVwLmpzJ1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBOb2RlQ29uZmlnPE9wdGlvbnMgPSBhbnksIFN0b3JhZ2UgPSBhbnk+IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcblxuICAgIC8qKlxuICAgICAqIE5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIFByaW9yaXR5XG4gICAgICovXG4gICAgcHJpb3JpdHk/OiBudW1iZXJcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgb3B0aW9uc1xuICAgICAqL1xuICAgIGRlZmF1bHRPcHRpb25zPzogT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBPcHRpb25zXG4gICAgICovXG4gICAgYWRkT3B0aW9ucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIHBhcmVudDogRXhjbHVkZTxQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZE9wdGlvbnMnXSwgdW5kZWZpbmVkPlxuICAgIH0pID0+IE9wdGlvbnNcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgU3RvcmFnZVxuICAgICAqL1xuICAgIGFkZFN0b3JhZ2U/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBwYXJlbnQ6IEV4Y2x1ZGU8UGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRTdG9yYWdlJ10sIHVuZGVmaW5lZD5cbiAgICB9KSA9PiBTdG9yYWdlXG5cbiAgICAvKipcbiAgICAgKiBHbG9iYWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkR2xvYmFsQXR0cmlidXRlcyddXG4gICAgfSkgPT4gR2xvYmFsQXR0cmlidXRlcyB8IHt9XG5cbiAgICAvKipcbiAgICAgKiBSYXdcbiAgICAgKi9cbiAgICBhZGRDb21tYW5kcz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICB0eXBlOiBOb2RlVHlwZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZENvbW1hbmRzJ11cbiAgICB9KSA9PiBQYXJ0aWFsPFJhd0NvbW1hbmRzPlxuXG4gICAgLyoqXG4gICAgICogS2V5Ym9hcmQgc2hvcnRjdXRzXG4gICAgICovXG4gICAgYWRkS2V5Ym9hcmRTaG9ydGN1dHM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRLZXlib2FyZFNob3J0Y3V0cyddXG4gICAgfSkgPT4ge1xuICAgICAgW2tleTogc3RyaW5nXTogS2V5Ym9hcmRTaG9ydGN1dENvbW1hbmRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnB1dCBydWxlc1xuICAgICAqL1xuICAgIGFkZElucHV0UnVsZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRJbnB1dFJ1bGVzJ11cbiAgICB9KSA9PiBJbnB1dFJ1bGVbXVxuXG4gICAgLyoqXG4gICAgICogUGFzdGUgcnVsZXNcbiAgICAgKi9cbiAgICBhZGRQYXN0ZVJ1bGVzPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkUGFzdGVSdWxlcyddXG4gICAgfSkgPT4gUGFzdGVSdWxlW11cblxuICAgIC8qKlxuICAgICAqIFByb3NlTWlycm9yIHBsdWdpbnNcbiAgICAgKi9cbiAgICBhZGRQcm9zZU1pcnJvclBsdWdpbnM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRQcm9zZU1pcnJvclBsdWdpbnMnXVxuICAgIH0pID0+IFBsdWdpbltdXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbnNpb25zXG4gICAgICovXG4gICAgYWRkRXh0ZW5zaW9ucz86ICh0aGlzOiB7XG4gICAgICBuYW1lOiBzdHJpbmdcbiAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhZGRFeHRlbnNpb25zJ11cbiAgICB9KSA9PiBFeHRlbnNpb25zXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgTm9kZSBTY2hlbWFcbiAgICAgKi9cbiAgICBleHRlbmROb2RlU2NoZW1hPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydleHRlbmROb2RlU2NoZW1hJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4dGVuc2lvbjogTm9kZSxcbiAgICAgICAgKSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgTWFyayBTY2hlbWFcbiAgICAgKi9cbiAgICBleHRlbmRNYXJrU2NoZW1hPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydleHRlbmRNYXJrU2NoZW1hJ11cbiAgICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXh0ZW5zaW9uOiBOb2RlLFxuICAgICAgICApID0+IFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgbm90IHJlYWR5IHlldC5cbiAgICAgKi9cbiAgICBvbkJlZm9yZUNyZWF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkJlZm9yZUNyZWF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgaXMgcmVhZHkuXG4gICAgICovXG4gICAgb25DcmVhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25DcmVhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBoYXMgY2hhbmdlZC5cbiAgICAgKi9cbiAgICBvblVwZGF0ZT86XG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvblVwZGF0ZSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuXG4gICAgICovXG4gICAgb25TZWxlY3Rpb25VcGRhdGU/OlxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIGVkaXRvcjogRWRpdG9yXG4gICAgICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25TZWxlY3Rpb25VcGRhdGUnXVxuICAgICAgICB9KSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uVHJhbnNhY3Rpb24/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25UcmFuc2FjdGlvbiddXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG4gICAgICAgICAgfSxcbiAgICAgICAgKSA9PiB2b2lkKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGlzIGZvY3VzZWQuXG4gICAgICovXG4gICAgb25Gb2N1cz86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgICAgdHlwZTogTm9kZVR5cGVcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydvbkZvY3VzJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpc27igJl0IGZvY3VzZWQgYW55bW9yZS5cbiAgICAgKi9cbiAgICBvbkJsdXI/OlxuICAgICAgfCAoKFxuICAgICAgICAgIHRoaXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnb25CbHVyJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBldmVudDogRm9jdXNFdmVudFxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gdm9pZClcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgb25EZXN0cm95PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ29uRGVzdHJveSddXG4gICAgICAgIH0pID0+IHZvaWQpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIE5vZGUgVmlld1xuICAgICAqL1xuICAgIGFkZE5vZGVWaWV3PzpcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBlZGl0b3I6IEVkaXRvclxuICAgICAgICAgIHR5cGU6IE5vZGVUeXBlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2FkZE5vZGVWaWV3J11cbiAgICAgICAgfSkgPT4gTm9kZVZpZXdSZW5kZXJlcilcbiAgICAgIHwgbnVsbFxuXG4gICAgLyoqXG4gICAgICogVG9wTm9kZVxuICAgICAqL1xuICAgIHRvcE5vZGU/OiBib29sZWFuXG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50XG4gICAgICovXG4gICAgY29udGVudD86XG4gICAgICB8IE5vZGVTcGVjWydjb250ZW50J11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnY29udGVudCddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydjb250ZW50J10pXG5cbiAgICAvKipcbiAgICAgKiBNYXJrc1xuICAgICAqL1xuICAgIG1hcmtzPzpcbiAgICAgIHwgTm9kZVNwZWNbJ21hcmtzJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnbWFya3MnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snbWFya3MnXSlcblxuICAgIC8qKlxuICAgICAqIEdyb3VwXG4gICAgICovXG4gICAgZ3JvdXA/OlxuICAgICAgfCBOb2RlU3BlY1snZ3JvdXAnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+Wydncm91cCddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydncm91cCddKVxuXG4gICAgLyoqXG4gICAgICogSW5saW5lXG4gICAgICovXG4gICAgaW5saW5lPzpcbiAgICAgIHwgTm9kZVNwZWNbJ2lubGluZSddXG4gICAgICB8ICgodGhpczoge1xuICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ2lubGluZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydpbmxpbmUnXSlcblxuICAgIC8qKlxuICAgICAqIEF0b21cbiAgICAgKi9cbiAgICBhdG9tPzpcbiAgICAgIHwgTm9kZVNwZWNbJ2F0b20nXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydhdG9tJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTm9kZVNwZWNbJ2F0b20nXSlcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGFibGVcbiAgICAgKi9cbiAgICBzZWxlY3RhYmxlPzpcbiAgICAgIHwgTm9kZVNwZWNbJ3NlbGVjdGFibGUnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydzZWxlY3RhYmxlJ11cbiAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgfSkgPT4gTm9kZVNwZWNbJ3NlbGVjdGFibGUnXSlcblxuICAgIC8qKlxuICAgICAqIERyYWdnYWJsZVxuICAgICAqL1xuICAgIGRyYWdnYWJsZT86XG4gICAgICB8IE5vZGVTcGVjWydkcmFnZ2FibGUnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydkcmFnZ2FibGUnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snZHJhZ2dhYmxlJ10pXG5cbiAgICAvKipcbiAgICAgKiBDb2RlXG4gICAgICovXG4gICAgY29kZT86XG4gICAgICB8IE5vZGVTcGVjWydjb2RlJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnY29kZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWydjb2RlJ10pXG5cbiAgICAvKipcbiAgICAgKiBXaGl0ZXNwYWNlXG4gICAgICovXG4gICAgd2hpdGVzcGFjZT86XG4gICAgICB8IE5vZGVTcGVjWyd3aGl0ZXNwYWNlJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+Plsnd2hpdGVzcGFjZSddXG4gICAgICAgICAgZWRpdG9yPzogRWRpdG9yXG4gICAgICAgIH0pID0+IE5vZGVTcGVjWyd3aGl0ZXNwYWNlJ10pXG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmluZ1xuICAgICAqL1xuICAgIGRlZmluaW5nPzpcbiAgICAgIHwgTm9kZVNwZWNbJ2RlZmluaW5nJ11cbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnZGVmaW5pbmcnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snZGVmaW5pbmcnXSlcblxuICAgIC8qKlxuICAgICAqIElzb2xhdGluZ1xuICAgICAqL1xuICAgIGlzb2xhdGluZz86XG4gICAgICB8IE5vZGVTcGVjWydpc29sYXRpbmcnXVxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+Wydpc29sYXRpbmcnXVxuICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICB9KSA9PiBOb2RlU3BlY1snaXNvbGF0aW5nJ10pXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBIVE1MXG4gICAgICovXG4gICAgcGFyc2VIVE1MPzogKHRoaXM6IHtcbiAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgc3RvcmFnZTogU3RvcmFnZVxuICAgICAgcGFyZW50OiBQYXJlbnRDb25maWc8Tm9kZUNvbmZpZzxPcHRpb25zLCBTdG9yYWdlPj5bJ3BhcnNlSFRNTCddXG4gICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICB9KSA9PiBOb2RlU3BlY1sncGFyc2VET00nXVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVyIEhUTUxcbiAgICAgKi9cbiAgICByZW5kZXJIVE1MPzpcbiAgICAgIHwgKChcbiAgICAgICAgICB0aGlzOiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmdcbiAgICAgICAgICAgIG9wdGlvbnM6IE9wdGlvbnNcbiAgICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICAgIHBhcmVudDogUGFyZW50Q29uZmlnPE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4+WydyZW5kZXJIVE1MJ11cbiAgICAgICAgICAgIGVkaXRvcj86IEVkaXRvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIG5vZGU6IFByb3NlTWlycm9yTm9kZVxuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgICB9LFxuICAgICAgICApID0+IERPTU91dHB1dFNwZWMpXG4gICAgICB8IG51bGxcblxuICAgIC8qKlxuICAgICAqIFJlbmRlciBUZXh0XG4gICAgICovXG4gICAgcmVuZGVyVGV4dD86XG4gICAgICB8ICgoXG4gICAgICAgICAgdGhpczoge1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICAgICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsncmVuZGVyVGV4dCddXG4gICAgICAgICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBub2RlOiBQcm9zZU1pcnJvck5vZGVcbiAgICAgICAgICAgIHBvczogbnVtYmVyXG4gICAgICAgICAgICBwYXJlbnQ6IFByb3NlTWlycm9yTm9kZVxuICAgICAgICAgICAgaW5kZXg6IG51bWJlclxuICAgICAgICAgIH0sXG4gICAgICAgICkgPT4gc3RyaW5nKVxuICAgICAgfCBudWxsXG5cbiAgICAvKipcbiAgICAgKiBBZGQgQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZEF0dHJpYnV0ZXM/OiAodGhpczoge1xuICAgICAgbmFtZTogc3RyaW5nXG4gICAgICBvcHRpb25zOiBPcHRpb25zXG4gICAgICBzdG9yYWdlOiBTdG9yYWdlXG4gICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PlsnYWRkQXR0cmlidXRlcyddXG4gICAgICBlZGl0b3I/OiBFZGl0b3JcbiAgICB9KSA9PiBBdHRyaWJ1dGVzIHwge31cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9kZTxPcHRpb25zID0gYW55LCBTdG9yYWdlID0gYW55PiB7XG4gIHR5cGUgPSAnbm9kZSdcblxuICBuYW1lID0gJ25vZGUnXG5cbiAgcGFyZW50OiBOb2RlIHwgbnVsbCA9IG51bGxcblxuICBjaGlsZDogTm9kZSB8IG51bGwgPSBudWxsXG5cbiAgb3B0aW9uczogT3B0aW9uc1xuXG4gIHN0b3JhZ2U6IFN0b3JhZ2VcblxuICBjb25maWc6IE5vZGVDb25maWcgPSB7XG4gICAgbmFtZTogdGhpcy5uYW1lLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7fSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxOb2RlQ29uZmlnPE9wdGlvbnMsIFN0b3JhZ2U+PiA9IHt9KSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbmZpZy5uYW1lXG5cbiAgICBpZiAoY29uZmlnLmRlZmF1bHRPcHRpb25zKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbdGlwdGFwIHdhcm5dOiBCUkVBS0lORyBDSEFOR0U6IFwiZGVmYXVsdE9wdGlvbnNcIiBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIFwiYWRkT3B0aW9uc1wiIGluc3RlYWQuIEZvdW5kIGluIGV4dGVuc2lvbjogXCIke3RoaXMubmFtZX1cIi5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSBgYWRkT3B0aW9uc2AgZmFsbGJhY2tcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kZWZhdWx0T3B0aW9uc1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmFkZE9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IGNhbGxPclJldHVybihcbiAgICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRPcHRpb25zJ10+KHRoaXMsICdhZGRPcHRpb25zJywge1xuICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KHRoaXMsICdhZGRTdG9yYWdlJywge1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgICkgfHwge31cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8TyA9IGFueSwgUyA9IGFueT4oY29uZmlnOiBQYXJ0aWFsPE5vZGVDb25maWc8TywgUz4+ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IE5vZGU8TywgUz4oY29uZmlnKVxuICB9XG5cbiAgY29uZmlndXJlKG9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7fSkge1xuICAgIC8vIHJldHVybiBhIG5ldyBpbnN0YW5jZSBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lIGV4dGVuc2lvblxuICAgIC8vIHdpdGggZGlmZmVyZW50IGNhbGxzIG9mIGBjb25maWd1cmVgXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5leHRlbmQoKVxuXG4gICAgZXh0ZW5zaW9uLm9wdGlvbnMgPSBtZXJnZURlZXAodGhpcy5vcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnMpIGFzIE9wdGlvbnNcblxuICAgIGV4dGVuc2lvbi5zdG9yYWdlID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRTdG9yYWdlJ10+KGV4dGVuc2lvbiwgJ2FkZFN0b3JhZ2UnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBleHRlbnNpb25cbiAgfVxuXG4gIGV4dGVuZDxFeHRlbmRlZE9wdGlvbnMgPSBPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2UgPSBTdG9yYWdlPihcbiAgICBleHRlbmRlZENvbmZpZzogUGFydGlhbDxOb2RlQ29uZmlnPEV4dGVuZGVkT3B0aW9ucywgRXh0ZW5kZWRTdG9yYWdlPj4gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gbmV3IE5vZGU8RXh0ZW5kZWRPcHRpb25zLCBFeHRlbmRlZFN0b3JhZ2U+KGV4dGVuZGVkQ29uZmlnKVxuXG4gICAgZXh0ZW5zaW9uLnBhcmVudCA9IHRoaXNcblxuICAgIHRoaXMuY2hpbGQgPSBleHRlbnNpb25cblxuICAgIGV4dGVuc2lvbi5uYW1lID0gZXh0ZW5kZWRDb25maWcubmFtZSA/IGV4dGVuZGVkQ29uZmlnLm5hbWUgOiBleHRlbnNpb24ucGFyZW50Lm5hbWVcblxuICAgIGlmIChleHRlbmRlZENvbmZpZy5kZWZhdWx0T3B0aW9ucykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3RpcHRhcCB3YXJuXTogQlJFQUtJTkcgQ0hBTkdFOiBcImRlZmF1bHRPcHRpb25zXCIgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBcImFkZE9wdGlvbnNcIiBpbnN0ZWFkLiBGb3VuZCBpbiBleHRlbnNpb246IFwiJHtleHRlbnNpb24ubmFtZX1cIi5gLFxuICAgICAgKVxuICAgIH1cblxuICAgIGV4dGVuc2lvbi5vcHRpb25zID0gY2FsbE9yUmV0dXJuKFxuICAgICAgZ2V0RXh0ZW5zaW9uRmllbGQ8QW55Q29uZmlnWydhZGRPcHRpb25zJ10+KGV4dGVuc2lvbiwgJ2FkZE9wdGlvbnMnLCB7XG4gICAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgZXh0ZW5zaW9uLnN0b3JhZ2UgPSBjYWxsT3JSZXR1cm4oXG4gICAgICBnZXRFeHRlbnNpb25GaWVsZDxBbnlDb25maWdbJ2FkZFN0b3JhZ2UnXT4oZXh0ZW5zaW9uLCAnYWRkU3RvcmFnZScsIHtcbiAgICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcmV0dXJuIGV4dGVuc2lvblxuICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzQW5kcm9pZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ0FuZHJvaWQnIHx8IC9hbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxufVxuIiwgImltcG9ydCB7IE5vZGUgYXMgUHJvc2VNaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IE5vZGVTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgTm9kZVZpZXcgYXMgUHJvc2VNaXJyb3JOb2RlVmlldyB9IGZyb20gJ0B0aXB0YXAvcG0vdmlldydcblxuaW1wb3J0IHsgRWRpdG9yIGFzIENvcmVFZGl0b3IgfSBmcm9tICcuL0VkaXRvci5qcydcbmltcG9ydCB7IE5vZGUgfSBmcm9tICcuL05vZGUuanMnXG5pbXBvcnQgeyBEZWNvcmF0aW9uV2l0aFR5cGUsIE5vZGVWaWV3UmVuZGVyZXJPcHRpb25zLCBOb2RlVmlld1JlbmRlcmVyUHJvcHMgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNBbmRyb2lkIH0gZnJvbSAnLi91dGlsaXRpZXMvaXNBbmRyb2lkLmpzJ1xuaW1wb3J0IHsgaXNpT1MgfSBmcm9tICcuL3V0aWxpdGllcy9pc2lPUy5qcydcblxuZXhwb3J0IGNsYXNzIE5vZGVWaWV3PFxuICBDb21wb25lbnQsXG4gIE5vZGVFZGl0b3IgZXh0ZW5kcyBDb3JlRWRpdG9yID0gQ29yZUVkaXRvcixcbiAgT3B0aW9ucyBleHRlbmRzIE5vZGVWaWV3UmVuZGVyZXJPcHRpb25zID0gTm9kZVZpZXdSZW5kZXJlck9wdGlvbnMsXG4+IGltcGxlbWVudHMgUHJvc2VNaXJyb3JOb2RlVmlldyB7XG4gIGNvbXBvbmVudDogQ29tcG9uZW50XG5cbiAgZWRpdG9yOiBOb2RlRWRpdG9yXG5cbiAgb3B0aW9uczogT3B0aW9uc1xuXG4gIGV4dGVuc2lvbjogTm9kZVxuXG4gIG5vZGU6IFByb3NlTWlycm9yTm9kZVxuXG4gIGRlY29yYXRpb25zOiBEZWNvcmF0aW9uV2l0aFR5cGVbXVxuXG4gIGdldFBvczogYW55XG5cbiAgaXNEcmFnZ2luZyA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoY29tcG9uZW50OiBDb21wb25lbnQsIHByb3BzOiBOb2RlVmlld1JlbmRlcmVyUHJvcHMsIG9wdGlvbnM/OiBQYXJ0aWFsPE9wdGlvbnM+KSB7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnRcbiAgICB0aGlzLmVkaXRvciA9IHByb3BzLmVkaXRvciBhcyBOb2RlRWRpdG9yXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgc3RvcEV2ZW50OiBudWxsLFxuICAgICAgaWdub3JlTXV0YXRpb246IG51bGwsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0gYXMgT3B0aW9uc1xuICAgIHRoaXMuZXh0ZW5zaW9uID0gcHJvcHMuZXh0ZW5zaW9uXG4gICAgdGhpcy5ub2RlID0gcHJvcHMubm9kZVxuICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBwcm9wcy5kZWNvcmF0aW9ucyBhcyBEZWNvcmF0aW9uV2l0aFR5cGVbXVxuICAgIHRoaXMuZ2V0UG9zID0gcHJvcHMuZ2V0UG9zXG4gICAgdGhpcy5tb3VudCgpXG4gIH1cblxuICBtb3VudCgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZXR1cm5cbiAgfVxuXG4gIGdldCBkb20oKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci52aWV3LmRvbSBhcyBIVE1MRWxlbWVudFxuICB9XG5cbiAgZ2V0IGNvbnRlbnRET00oKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGNvbnN0IHsgdmlldyB9ID0gdGhpcy5lZGl0b3JcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcblxuICAgIC8vIGdldCB0aGUgZHJhZyBoYW5kbGUgZWxlbWVudFxuICAgIC8vIGBjbG9zZXN0YCBpcyBub3QgYXZhaWxhYmxlIGZvciB0ZXh0IG5vZGVzIHNvIHdlIG1heSBoYXZlIHRvIHVzZSBpdHMgcGFyZW50XG4gICAgY29uc3QgZHJhZ0hhbmRsZSA9IHRhcmdldC5ub2RlVHlwZSA9PT0gM1xuICAgICAgPyB0YXJnZXQucGFyZW50RWxlbWVudD8uY2xvc2VzdCgnW2RhdGEtZHJhZy1oYW5kbGVdJylcbiAgICAgIDogdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWRyYWctaGFuZGxlXScpXG5cbiAgICBpZiAoIXRoaXMuZG9tIHx8IHRoaXMuY29udGVudERPTT8uY29udGFpbnModGFyZ2V0KSB8fCAhZHJhZ0hhbmRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IHggPSAwXG4gICAgbGV0IHkgPSAwXG5cbiAgICAvLyBjYWxjdWxhdGUgb2Zmc2V0IGZvciBkcmFnIGVsZW1lbnQgaWYgd2UgdXNlIGEgZGlmZmVyZW50IGRyYWcgaGFuZGxlIGVsZW1lbnRcbiAgICBpZiAodGhpcy5kb20gIT09IGRyYWdIYW5kbGUpIHtcbiAgICAgIGNvbnN0IGRvbUJveCA9IHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCBoYW5kbGVCb3ggPSBkcmFnSGFuZGxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgIC8vIEluIFJlYWN0LCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggbmF0aXZlRXZlbnQgdG8gcmVhY2ggb2Zmc2V0WC9vZmZzZXRZLlxuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50Lm9mZnNldFggPz8gKGV2ZW50IGFzIGFueSkubmF0aXZlRXZlbnQ/Lm9mZnNldFhcbiAgICAgIGNvbnN0IG9mZnNldFkgPSBldmVudC5vZmZzZXRZID8/IChldmVudCBhcyBhbnkpLm5hdGl2ZUV2ZW50Py5vZmZzZXRZXG5cbiAgICAgIHggPSBoYW5kbGVCb3gueCAtIGRvbUJveC54ICsgb2Zmc2V0WFxuICAgICAgeSA9IGhhbmRsZUJveC55IC0gZG9tQm94LnkgKyBvZmZzZXRZXG4gICAgfVxuXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREcmFnSW1hZ2UodGhpcy5kb20sIHgsIHkpXG5cbiAgICAvLyB3ZSBuZWVkIHRvIHRlbGwgUHJvc2VNaXJyb3IgdGhhdCB3ZSB3YW50IHRvIG1vdmUgdGhlIHdob2xlIG5vZGVcbiAgICAvLyBzbyB3ZSBjcmVhdGUgYSBOb2RlU2VsZWN0aW9uXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIHRoaXMuZ2V0UG9zKCkpXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pXG5cbiAgICB2aWV3LmRpc3BhdGNoKHRyYW5zYWN0aW9uKVxuICB9XG5cbiAgc3RvcEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnN0b3BFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zdG9wRXZlbnQoeyBldmVudCB9KVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxuICAgIGNvbnN0IGlzSW5FbGVtZW50ID0gdGhpcy5kb20uY29udGFpbnModGFyZ2V0KSAmJiAhdGhpcy5jb250ZW50RE9NPy5jb250YWlucyh0YXJnZXQpXG5cbiAgICAvLyBhbnkgZXZlbnQgZnJvbSBjaGlsZCBub2RlcyBzaG91bGQgYmUgaGFuZGxlZCBieSBQcm9zZU1pcnJvclxuICAgIGlmICghaXNJbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGlzRHJhZ0V2ZW50ID0gZXZlbnQudHlwZS5zdGFydHNXaXRoKCdkcmFnJylcbiAgICBjb25zdCBpc0Ryb3BFdmVudCA9IGV2ZW50LnR5cGUgPT09ICdkcm9wJ1xuICAgIGNvbnN0IGlzSW5wdXQgPSBbJ0lOUFVUJywgJ0JVVFRPTicsICdTRUxFQ1QnLCAnVEVYVEFSRUEnXS5pbmNsdWRlcyh0YXJnZXQudGFnTmFtZSkgfHwgdGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlXG5cbiAgICAvLyBhbnkgaW5wdXQgZXZlbnQgd2l0aGluIG5vZGUgdmlld3Mgc2hvdWxkIGJlIGlnbm9yZWQgYnkgUHJvc2VNaXJyb3JcbiAgICBpZiAoaXNJbnB1dCAmJiAhaXNEcm9wRXZlbnQgJiYgIWlzRHJhZ0V2ZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHsgaXNFZGl0YWJsZSB9ID0gdGhpcy5lZGl0b3JcbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcgfSA9IHRoaXNcbiAgICBjb25zdCBpc0RyYWdnYWJsZSA9ICEhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGVcbiAgICBjb25zdCBpc1NlbGVjdGFibGUgPSBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZSh0aGlzLm5vZGUpXG4gICAgY29uc3QgaXNDb3B5RXZlbnQgPSBldmVudC50eXBlID09PSAnY29weSdcbiAgICBjb25zdCBpc1Bhc3RlRXZlbnQgPSBldmVudC50eXBlID09PSAncGFzdGUnXG4gICAgY29uc3QgaXNDdXRFdmVudCA9IGV2ZW50LnR5cGUgPT09ICdjdXQnXG4gICAgY29uc3QgaXNDbGlja0V2ZW50ID0gZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bidcblxuICAgIC8vIFByb3NlTWlycm9yIHRyaWVzIHRvIGRyYWcgc2VsZWN0YWJsZSBub2Rlc1xuICAgIC8vIGV2ZW4gaWYgYGRyYWdnYWJsZWAgaXMgc2V0IHRvIGBmYWxzZWBcbiAgICAvLyB0aGlzIGZpeCBwcmV2ZW50cyB0aGF0XG4gICAgaWYgKCFpc0RyYWdnYWJsZSAmJiBpc1NlbGVjdGFibGUgJiYgaXNEcmFnRXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAoaXNEcmFnZ2FibGUgJiYgaXNEcmFnRXZlbnQgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhhdCBkcmFnZ2luZyBzdGFydGVkXG4gICAgaWYgKGlzRHJhZ2dhYmxlICYmIGlzRWRpdGFibGUgJiYgIWlzRHJhZ2dpbmcgJiYgaXNDbGlja0V2ZW50KSB7XG4gICAgICBjb25zdCBkcmFnSGFuZGxlID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWRyYWctaGFuZGxlXScpXG4gICAgICBjb25zdCBpc1ZhbGlkRHJhZ0hhbmRsZSA9IGRyYWdIYW5kbGUgJiYgKHRoaXMuZG9tID09PSBkcmFnSGFuZGxlIHx8IHRoaXMuZG9tLmNvbnRhaW5zKGRyYWdIYW5kbGUpKVxuXG4gICAgICBpZiAoaXNWYWxpZERyYWdIYW5kbGUpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZVxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2RyYWdlbmQnLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICAgICAgKVxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ2Ryb3AnLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICAgICAgKVxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgJ21vdXNldXAnLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG9uY2U6IHRydWUgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRoZXNlIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBwcm9zZW1pcnJvclxuICAgIGlmIChcbiAgICAgIGlzRHJhZ2dpbmdcbiAgICAgIHx8IGlzRHJvcEV2ZW50XG4gICAgICB8fCBpc0NvcHlFdmVudFxuICAgICAgfHwgaXNQYXN0ZUV2ZW50XG4gICAgICB8fCBpc0N1dEV2ZW50XG4gICAgICB8fCAoaXNDbGlja0V2ZW50ICYmIGlzU2VsZWN0YWJsZSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQgfCB7IHR5cGU6ICdzZWxlY3Rpb24nOyB0YXJnZXQ6IEVsZW1lbnQgfSkge1xuICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMuY29udGVudERPTSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5pZ25vcmVNdXRhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pZ25vcmVNdXRhdGlvbih7IG11dGF0aW9uIH0pXG4gICAgfVxuXG4gICAgLy8gYSBsZWFmL2F0b20gbm9kZSBpcyBsaWtlIGEgYmxhY2sgYm94IGZvciBQcm9zZU1pcnJvclxuICAgIC8vIGFuZCBzaG91bGQgYmUgZnVsbHkgaGFuZGxlZCBieSB0aGUgbm9kZSB2aWV3XG4gICAgaWYgKHRoaXMubm9kZS5pc0xlYWYgfHwgdGhpcy5ub2RlLmlzQXRvbSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBQcm9zZU1pcnJvciBzaG91bGQgaGFuZGxlIGFueSBzZWxlY3Rpb25zXG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdzZWxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyB0cnkgdG8gcHJldmVudCBhIGJ1ZyBvbiBpT1MgYW5kIEFuZHJvaWQgdGhhdCB3aWxsIGJyZWFrIG5vZGUgdmlld3Mgb24gZW50ZXJcbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgUHJvc2VNaXJyb3IgY2Fu4oCZdCBwcmV2ZW50RGlzcGF0Y2ggb24gZW50ZXJcbiAgICAvLyB0aGlzIHdpbGwgbGVhZCB0byBhIHJlLXJlbmRlciBvZiB0aGUgbm9kZSB2aWV3IG9uIGVudGVyXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vdWViZXJkb3Npcy90aXB0YXAvaXNzdWVzLzEyMTRcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS91ZWJlcmRvc2lzL3RpcHRhcC9pc3N1ZXMvMjUzNFxuICAgIGlmIChcbiAgICAgIHRoaXMuZG9tLmNvbnRhaW5zKG11dGF0aW9uLnRhcmdldClcbiAgICAgICYmIG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnXG4gICAgICAmJiAoaXNpT1MoKSB8fCBpc0FuZHJvaWQoKSlcbiAgICAgICYmIHRoaXMuZWRpdG9yLmlzRm9jdXNlZFxuICAgICkge1xuICAgICAgY29uc3QgY2hhbmdlZE5vZGVzID0gW1xuICAgICAgICAuLi5BcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLFxuICAgICAgICAuLi5BcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2RlcyksXG4gICAgICBdIGFzIEhUTUxFbGVtZW50W11cblxuICAgICAgLy8gd2XigJlsbCBjaGVjayBpZiBldmVyeSBjaGFuZ2VkIG5vZGUgaXMgY29udGVudEVkaXRhYmxlXG4gICAgICAvLyB0byBtYWtlIHN1cmUgaXTigJlzIHByb2JhYmx5IG11dGF0ZWQgYnkgUHJvc2VNaXJyb3JcbiAgICAgIGlmIChjaGFuZ2VkTm9kZXMuZXZlcnkobm9kZSA9PiBub2RlLmlzQ29udGVudEVkaXRhYmxlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB3ZSB3aWxsIGFsbG93IG11dGF0aW9uIGNvbnRlbnRET00gd2l0aCBhdHRyaWJ1dGVzXG4gICAgLy8gc28gd2UgY2FuIGZvciBleGFtcGxlIGFkZGluZyBjbGFzc2VzIHdpdGhpbiBvdXIgbm9kZSB2aWV3XG4gICAgaWYgKHRoaXMuY29udGVudERPTSA9PT0gbXV0YXRpb24udGFyZ2V0ICYmIG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBQcm9zZU1pcnJvciBzaG91bGQgaGFuZGxlIGFueSBjaGFuZ2VzIHdpdGhpbiBjb250ZW50RE9NXG4gICAgaWYgKHRoaXMuY29udGVudERPTS5jb250YWlucyhtdXRhdGlvbi50YXJnZXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQXR0cmlidXRlcyhhdHRyaWJ1dGVzOiB7fSkge1xuICAgIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmNvbW1hbmQoKHsgdHIgfSkgPT4ge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5nZXRQb3MoKVxuXG4gICAgICB0ci5zZXROb2RlTWFya3VwKHBvcywgdW5kZWZpbmVkLCB7XG4gICAgICAgIC4uLnRoaXMubm9kZS5hdHRycyxcbiAgICAgICAgLi4uYXR0cmlidXRlcyxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSlcbiAgfVxuXG4gIGRlbGV0ZU5vZGUoKTogdm9pZCB7XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuZ2V0UG9zKClcbiAgICBjb25zdCB0byA9IGZyb20gKyB0aGlzLm5vZGUubm9kZVNpemVcblxuICAgIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmRlbGV0ZVJhbmdlKHsgZnJvbSwgdG8gfSlcbiAgfVxufVxuIiwgImltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgZ2V0TWFya3NCZXR3ZWVuIH0gZnJvbSAnLi4vaGVscGVycy9nZXRNYXJrc0JldHdlZW4uanMnXG5pbXBvcnQgeyBQYXN0ZVJ1bGUsIFBhc3RlUnVsZUZpbmRlciB9IGZyb20gJy4uL1Bhc3RlUnVsZS5qcydcbmltcG9ydCB7IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgY2FsbE9yUmV0dXJuIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2NhbGxPclJldHVybi5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBwYXN0ZSBydWxlIHRoYXQgYWRkcyBhIG1hcmsgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyBwYXN0ZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtQYXN0ZVJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlclxuICB0eXBlOiBNYXJrVHlwZVxuICBnZXRBdHRyaWJ1dGVzPzpcbiAgICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICB8ICgobWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSwgZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgIHwgZmFsc2VcbiAgICB8IG51bGxcbn0pIHtcbiAgcmV0dXJuIG5ldyBQYXN0ZVJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXI6ICh7XG4gICAgICBzdGF0ZSwgcmFuZ2UsIG1hdGNoLCBwYXN0ZUV2ZW50LFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjYWxsT3JSZXR1cm4oY29uZmlnLmdldEF0dHJpYnV0ZXMsIHVuZGVmaW5lZCwgbWF0Y2gsIHBhc3RlRXZlbnQpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVzID09PSBmYWxzZSB8fCBhdHRyaWJ1dGVzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgdHIgfSA9IHN0YXRlXG4gICAgICBjb25zdCBjYXB0dXJlR3JvdXAgPSBtYXRjaFttYXRjaC5sZW5ndGggLSAxXVxuICAgICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF1cbiAgICAgIGxldCBtYXJrRW5kID0gcmFuZ2UudG9cblxuICAgICAgaWYgKGNhcHR1cmVHcm91cCkge1xuICAgICAgICBjb25zdCBzdGFydFNwYWNlcyA9IGZ1bGxNYXRjaC5zZWFyY2goL1xcUy8pXG4gICAgICAgIGNvbnN0IHRleHRTdGFydCA9IHJhbmdlLmZyb20gKyBmdWxsTWF0Y2guaW5kZXhPZihjYXB0dXJlR3JvdXApXG4gICAgICAgIGNvbnN0IHRleHRFbmQgPSB0ZXh0U3RhcnQgKyBjYXB0dXJlR3JvdXAubGVuZ3RoXG5cbiAgICAgICAgY29uc3QgZXhjbHVkZWRNYXJrcyA9IGdldE1hcmtzQmV0d2VlbihyYW5nZS5mcm9tLCByYW5nZS50bywgc3RhdGUuZG9jKVxuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBleGNsdWRlZCA9IGl0ZW0ubWFyay50eXBlLmV4Y2x1ZGVkIGFzIE1hcmtUeXBlW11cblxuICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVkLmZpbmQodHlwZSA9PiB0eXBlID09PSBjb25maWcudHlwZSAmJiB0eXBlICE9PSBpdGVtLm1hcmsudHlwZSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLnRvID4gdGV4dFN0YXJ0KVxuXG4gICAgICAgIGlmIChleGNsdWRlZE1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dEVuZCA8IHJhbmdlLnRvKSB7XG4gICAgICAgICAgdHIuZGVsZXRlKHRleHRFbmQsIHJhbmdlLnRvKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRleHRTdGFydCA+IHJhbmdlLmZyb20pIHtcbiAgICAgICAgICB0ci5kZWxldGUocmFuZ2UuZnJvbSArIHN0YXJ0U3BhY2VzLCB0ZXh0U3RhcnQpXG4gICAgICAgIH1cblxuICAgICAgICBtYXJrRW5kID0gcmFuZ2UuZnJvbSArIHN0YXJ0U3BhY2VzICsgY2FwdHVyZUdyb3VwLmxlbmd0aFxuXG4gICAgICAgIHRyLmFkZE1hcmsocmFuZ2UuZnJvbSArIHN0YXJ0U3BhY2VzLCBtYXJrRW5kLCBjb25maWcudHlwZS5jcmVhdGUoYXR0cmlidXRlcyB8fCB7fSkpXG5cbiAgICAgICAgdHIucmVtb3ZlU3RvcmVkTWFyayhjb25maWcudHlwZSlcbiAgICAgIH1cbiAgICB9LFxuICB9KVxufVxuIiwgIi8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzY5Njk0ODZcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVGb3JSZWdFeChzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpXG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xufVxuIiwgImltcG9ydCB7IE5vZGVUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgUGFzdGVSdWxlLCBQYXN0ZVJ1bGVGaW5kZXIgfSBmcm9tICcuLi9QYXN0ZVJ1bGUuanMnXG5pbXBvcnQgeyBFeHRlbmRlZFJlZ0V4cE1hdGNoQXJyYXkgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGNhbGxPclJldHVybiB9IGZyb20gJy4uL3V0aWxpdGllcy9pbmRleC5qcydcblxuLyoqXG4gKiBCdWlsZCBhbiBwYXN0ZSBydWxlIHRoYXQgYWRkcyBhIG5vZGUgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyBwYXN0ZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vZGVQYXN0ZVJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlclxuICB0eXBlOiBOb2RlVHlwZVxuICBnZXRBdHRyaWJ1dGVzPzpcbiAgICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICB8ICgobWF0Y2g6IEV4dGVuZGVkUmVnRXhwTWF0Y2hBcnJheSwgZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiBSZWNvcmQ8c3RyaW5nLCBhbnk+KVxuICAgIHwgZmFsc2VcbiAgICB8IG51bGxcbn0pIHtcbiAgcmV0dXJuIG5ldyBQYXN0ZVJ1bGUoe1xuICAgIGZpbmQ6IGNvbmZpZy5maW5kLFxuICAgIGhhbmRsZXIoe1xuICAgICAgbWF0Y2gsIGNoYWluLCByYW5nZSwgcGFzdGVFdmVudCxcbiAgICB9KSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY2FsbE9yUmV0dXJuKGNvbmZpZy5nZXRBdHRyaWJ1dGVzLCB1bmRlZmluZWQsIG1hdGNoLCBwYXN0ZUV2ZW50KVxuXG4gICAgICBpZiAoYXR0cmlidXRlcyA9PT0gZmFsc2UgfHwgYXR0cmlidXRlcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2guaW5wdXQpIHtcbiAgICAgICAgY2hhaW4oKS5kZWxldGVSYW5nZShyYW5nZSkuaW5zZXJ0Q29udGVudEF0KHJhbmdlLmZyb20sIHtcbiAgICAgICAgICB0eXBlOiBjb25maWcudHlwZS5uYW1lLFxuICAgICAgICAgIGF0dHJzOiBhdHRyaWJ1dGVzLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgUGFzdGVSdWxlLCBQYXN0ZVJ1bGVGaW5kZXIgfSBmcm9tICcuLi9QYXN0ZVJ1bGUuanMnXG5cbi8qKlxuICogQnVpbGQgYW4gcGFzdGUgcnVsZSB0aGF0IHJlcGxhY2VzIHRleHQgd2hlbiB0aGVcbiAqIG1hdGNoZWQgdGV4dCBpcyBwYXN0ZWQgaW50byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRleHRQYXN0ZVJ1bGUoY29uZmlnOiB7XG4gIGZpbmQ6IFBhc3RlUnVsZUZpbmRlcixcbiAgcmVwbGFjZTogc3RyaW5nLFxufSkge1xuICByZXR1cm4gbmV3IFBhc3RlUnVsZSh7XG4gICAgZmluZDogY29uZmlnLmZpbmQsXG4gICAgaGFuZGxlcjogKHsgc3RhdGUsIHJhbmdlLCBtYXRjaCB9KSA9PiB7XG4gICAgICBsZXQgaW5zZXJ0ID0gY29uZmlnLnJlcGxhY2VcbiAgICAgIGxldCBzdGFydCA9IHJhbmdlLmZyb21cbiAgICAgIGNvbnN0IGVuZCA9IHJhbmdlLnRvXG5cbiAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtYXRjaFswXS5sYXN0SW5kZXhPZihtYXRjaFsxXSlcblxuICAgICAgICBpbnNlcnQgKz0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0ICsgbWF0Y2hbMV0ubGVuZ3RoKVxuICAgICAgICBzdGFydCArPSBvZmZzZXRcblxuICAgICAgICBjb25zdCBjdXRPZmYgPSBzdGFydCAtIGVuZFxuXG4gICAgICAgIGlmIChjdXRPZmYgPiAwKSB7XG4gICAgICAgICAgaW5zZXJ0ID0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0IC0gY3V0T2ZmLCBvZmZzZXQpICsgaW5zZXJ0XG4gICAgICAgICAgc3RhcnQgPSBlbmRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0ZS50ci5pbnNlcnRUZXh0KGluc2VydCwgc3RhcnQsIGVuZClcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGludGVyZmFjZSBUcmFja2VyUmVzdWx0IHtcbiAgcG9zaXRpb246IG51bWJlclxuICBkZWxldGVkOiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBUcmFja2VyIHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uXG5cbiAgY3VycmVudFN0ZXA6IG51bWJlclxuXG4gIGNvbnN0cnVjdG9yKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvblxuICAgIHRoaXMuY3VycmVudFN0ZXAgPSB0aGlzLnRyYW5zYWN0aW9uLnN0ZXBzLmxlbmd0aFxuICB9XG5cbiAgbWFwKHBvc2l0aW9uOiBudW1iZXIpOiBUcmFja2VyUmVzdWx0IHtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlXG5cbiAgICBjb25zdCBtYXBwZWRQb3NpdGlvbiA9IHRoaXMudHJhbnNhY3Rpb24uc3RlcHNcbiAgICAgIC5zbGljZSh0aGlzLmN1cnJlbnRTdGVwKVxuICAgICAgLnJlZHVjZSgobmV3UG9zaXRpb24sIHN0ZXApID0+IHtcbiAgICAgICAgY29uc3QgbWFwUmVzdWx0ID0gc3RlcC5nZXRNYXAoKS5tYXBSZXN1bHQobmV3UG9zaXRpb24pXG5cbiAgICAgICAgaWYgKG1hcFJlc3VsdC5kZWxldGVkKSB7XG4gICAgICAgICAgZGVsZXRlZCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXBSZXN1bHQucG9zXG4gICAgICB9LCBwb3NpdGlvbilcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogbWFwcGVkUG9zaXRpb24sXG4gICAgICBkZWxldGVkLFxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSwgd3JhcHBpbmdJbnB1dFJ1bGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmxvY2txdW90ZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJsb2NrUXVvdGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgYmxvY2txdW90ZSBub2RlXG4gICAgICAgKi9cbiAgICAgIHNldEJsb2NrcXVvdGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIGJsb2NrcXVvdGUgbm9kZVxuICAgICAgICovXG4gICAgICB0b2dnbGVCbG9ja3F1b3RlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIGJsb2NrcXVvdGUgbm9kZVxuICAgICAgICovXG4gICAgICB1bnNldEJsb2NrcXVvdGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpbnB1dFJlZ2V4ID0gL15cXHMqPlxccyQvXG5cbmV4cG9ydCBjb25zdCBCbG9ja3F1b3RlID0gTm9kZS5jcmVhdGU8QmxvY2txdW90ZU9wdGlvbnM+KHtcblxuICBuYW1lOiAnYmxvY2txdW90ZScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAnYmxvY2srJyxcblxuICBncm91cDogJ2Jsb2NrJyxcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgdGFnOiAnYmxvY2txdW90ZScgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydibG9ja3F1b3RlJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRCbG9ja3F1b3RlOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy53cmFwSW4odGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUJsb2NrcXVvdGU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZVdyYXAodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHVuc2V0QmxvY2txdW90ZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMubGlmdCh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC1TaGlmdC1iJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlQmxvY2txdW90ZSgpLFxuICAgIH1cbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB3cmFwcGluZ0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgTWFyayxcbiAgbWFya0lucHV0UnVsZSxcbiAgbWFya1Bhc3RlUnVsZSxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9sZE9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJvbGQ6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgYm9sZCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldEJvbGQ6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIGJvbGQgbWFya1xuICAgICAgICovXG4gICAgICB0b2dnbGVCb2xkOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIGJvbGQgbWFya1xuICAgICAgICovXG4gICAgICB1bnNldEJvbGQ6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzdGFySW5wdXRSZWdleCA9IC8oPzpefFxccykoKD86XFwqXFwqKSgoPzpbXipdKykpKD86XFwqXFwqKSkkL1xuZXhwb3J0IGNvbnN0IHN0YXJQYXN0ZVJlZ2V4ID0gLyg/Ol58XFxzKSgoPzpcXCpcXCopKCg/OlteKl0rKSkoPzpcXCpcXCopKS9nXG5leHBvcnQgY29uc3QgdW5kZXJzY29yZUlucHV0UmVnZXggPSAvKD86XnxcXHMpKCg/Ol9fKSgoPzpbXl9fXSspKSg/Ol9fKSkkL1xuZXhwb3J0IGNvbnN0IHVuZGVyc2NvcmVQYXN0ZVJlZ2V4ID0gLyg/Ol58XFxzKSgoPzpfXykoKD86W15fX10rKSkoPzpfXykpL2dcblxuZXhwb3J0IGNvbnN0IEJvbGQgPSBNYXJrLmNyZWF0ZTxCb2xkT3B0aW9ucz4oe1xuICBuYW1lOiAnYm9sZCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3Ryb25nJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2InLFxuICAgICAgICBnZXRBdHRyczogbm9kZSA9PiAobm9kZSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZm9udFdlaWdodCAhPT0gJ25vcm1hbCcgJiYgbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiAnZm9udC13ZWlnaHQnLFxuICAgICAgICBnZXRBdHRyczogdmFsdWUgPT4gL14oYm9sZChlcik/fFs1LTldXFxkezIsfSkkLy50ZXN0KHZhbHVlIGFzIHN0cmluZykgJiYgbnVsbCxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnc3Ryb25nJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRCb2xkOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB0b2dnbGVCb2xkOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB1bnNldEJvbGQ6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC1iJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlQm9sZCgpLFxuICAgICAgJ01vZC1CJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlQm9sZCgpLFxuICAgIH1cbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogc3RhcklucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgICAgbWFya0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IHVuZGVyc2NvcmVJbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgYWRkUGFzdGVSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya1Bhc3RlUnVsZSh7XG4gICAgICAgIGZpbmQ6IHN0YXJQYXN0ZVJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICAgIG1hcmtQYXN0ZVJ1bGUoe1xuICAgICAgICBmaW5kOiB1bmRlcnNjb3JlUGFzdGVSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEl0ZW1PcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGJ1bGxldExpc3RUeXBlTmFtZTogc3RyaW5nXG4gIG9yZGVyZWRMaXN0VHlwZU5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgTGlzdEl0ZW0gPSBOb2RlLmNyZWF0ZTxMaXN0SXRlbU9wdGlvbnM+KHtcbiAgbmFtZTogJ2xpc3RJdGVtJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgICBidWxsZXRMaXN0VHlwZU5hbWU6ICdidWxsZXRMaXN0JyxcbiAgICAgIG9yZGVyZWRMaXN0VHlwZU5hbWU6ICdvcmRlcmVkTGlzdCcsXG4gICAgfVxuICB9LFxuXG4gIGNvbnRlbnQ6ICdwYXJhZ3JhcGggYmxvY2sqJyxcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnbGknLFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydsaScsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgRW50ZXI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNwbGl0TGlzdEl0ZW0odGhpcy5uYW1lKSxcbiAgICAgIFRhYjogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuc2lua0xpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgICAnU2hpZnQtVGFiJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMubGlmdExpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQge1xuICBnZXRNYXJrQXR0cmlidXRlcyxcbiAgTWFyayxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dFN0eWxlT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgdGV4dFN0eWxlOiB7XG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBzcGFucyB3aXRob3V0IGlubGluZSBzdHlsZSBhdHRyaWJ1dGVzLlxuICAgICAgICovXG4gICAgICByZW1vdmVFbXB0eVRleHRTdHlsZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRleHRTdHlsZSA9IE1hcmsuY3JlYXRlPFRleHRTdHlsZU9wdGlvbnM+KHtcbiAgbmFtZTogJ3RleHRTdHlsZScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3BhbicsXG4gICAgICAgIGdldEF0dHJzOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNTdHlsZXMgPSAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKCdzdHlsZScpXG5cbiAgICAgICAgICBpZiAoIWhhc1N0eWxlcykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3NwYW4nLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbW92ZUVtcHR5VGV4dFN0eWxlOiAoKSA9PiAoeyBzdGF0ZSwgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2V0TWFya0F0dHJpYnV0ZXMoc3RhdGUsIHRoaXMudHlwZSlcbiAgICAgICAgY29uc3QgaGFzU3R5bGVzID0gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykuc29tZSgoWywgdmFsdWVdKSA9PiAhIXZhbHVlKVxuXG4gICAgICAgIGlmIChoYXNTdHlsZXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUsIHdyYXBwaW5nSW5wdXRSdWxlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5pbXBvcnQgTGlzdEl0ZW0gZnJvbSAnLi4vLi4vZXh0ZW5zaW9uLWxpc3QtaXRlbS9zcmMvaW5kZXguanMnXG5pbXBvcnQgVGV4dFN0eWxlIGZyb20gJy4uLy4uL2V4dGVuc2lvbi10ZXh0LXN0eWxlL3NyYy9pbmRleC5qcydcblxuZXhwb3J0IGludGVyZmFjZSBCdWxsZXRMaXN0T3B0aW9ucyB7XG4gIGl0ZW1UeXBlTmFtZTogc3RyaW5nLFxuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PixcbiAga2VlcE1hcmtzOiBib29sZWFuLFxuICBrZWVwQXR0cmlidXRlczogYm9vbGVhbixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGJ1bGxldExpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgYnVsbGV0IGxpc3RcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlQnVsbGV0TGlzdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlucHV0UmVnZXggPSAvXlxccyooWy0rKl0pXFxzJC9cblxuZXhwb3J0IGNvbnN0IEJ1bGxldExpc3QgPSBOb2RlLmNyZWF0ZTxCdWxsZXRMaXN0T3B0aW9ucz4oe1xuICBuYW1lOiAnYnVsbGV0TGlzdCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbVR5cGVOYW1lOiAnbGlzdEl0ZW0nLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAga2VlcE1hcmtzOiBmYWxzZSxcbiAgICAgIGtlZXBBdHRyaWJ1dGVzOiBmYWxzZSxcbiAgICB9XG4gIH0sXG5cbiAgZ3JvdXA6ICdibG9jayBsaXN0JyxcblxuICBjb250ZW50KCkge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lfStgXG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3VsJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3VsJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0b2dnbGVCdWxsZXRMaXN0OiAoKSA9PiAoeyBjb21tYW5kcywgY2hhaW4gfSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKCkudG9nZ2xlTGlzdCh0aGlzLm5hbWUsIHRoaXMub3B0aW9ucy5pdGVtVHlwZU5hbWUsIHRoaXMub3B0aW9ucy5rZWVwTWFya3MpLnVwZGF0ZUF0dHJpYnV0ZXMoTGlzdEl0ZW0ubmFtZSwgdGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhUZXh0U3R5bGUubmFtZSkpLnJ1bigpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZUxpc3QodGhpcy5uYW1lLCB0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lLCB0aGlzLm9wdGlvbnMua2VlcE1hcmtzKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtU2hpZnQtOCc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZUJ1bGxldExpc3QoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICBsZXQgaW5wdXRSdWxlID0gd3JhcHBpbmdJbnB1dFJ1bGUoe1xuICAgICAgZmluZDogaW5wdXRSZWdleCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5rZWVwTWFya3MgfHwgdGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICBpbnB1dFJ1bGUgPSB3cmFwcGluZ0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAga2VlcE1hcmtzOiB0aGlzLm9wdGlvbnMua2VlcE1hcmtzLFxuICAgICAgICBrZWVwQXR0cmlidXRlczogdGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzLFxuICAgICAgICBnZXRBdHRyaWJ1dGVzOiAoKSA9PiB7IHJldHVybiB0aGlzLmVkaXRvci5nZXRBdHRyaWJ1dGVzKFRleHRTdHlsZS5uYW1lKSB9LFxuICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIGlucHV0UnVsZSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7XG4gIE1hcmssXG4gIG1hcmtJbnB1dFJ1bGUsXG4gIG1hcmtQYXN0ZVJ1bGUsXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVPcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBjb2RlOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNldCBhIGNvZGUgbWFya1xuICAgICAgICovXG4gICAgICBzZXRDb2RlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgaW5saW5lIGNvZGVcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlQ29kZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBjb2RlIG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRDb2RlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaW5wdXRSZWdleCA9IC8oPzpefFxccykoKD86YCkoKD86W15gXSspKSg/OmApKSQvXG5leHBvcnQgY29uc3QgcGFzdGVSZWdleCA9IC8oPzpefFxccykoKD86YCkoKD86W15gXSspKSg/OmApKS9nXG5cbmV4cG9ydCBjb25zdCBDb2RlID0gTWFyay5jcmVhdGU8Q29kZU9wdGlvbnM+KHtcbiAgbmFtZTogJ2NvZGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgZXhjbHVkZXM6ICdfJyxcblxuICBjb2RlOiB0cnVlLFxuXG4gIGV4aXRhYmxlOiB0cnVlLFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgeyB0YWc6ICdjb2RlJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2NvZGUnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldENvZGU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUNvZGU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZU1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHVuc2V0Q29kZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLWUnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVDb2RlKCksXG4gICAgfVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hcmtJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiBpbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgYWRkUGFzdGVSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya1Bhc3RlUnVsZSh7XG4gICAgICAgIGZpbmQ6IHBhc3RlUmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgZ2V0TWFya0F0dHJpYnV0ZXMsXG4gIE1hcmssXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRleHRTdHlsZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRleHRTdHlsZToge1xuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgc3BhbnMgd2l0aG91dCBpbmxpbmUgc3R5bGUgYXR0cmlidXRlcy5cbiAgICAgICAqL1xuICAgICAgcmVtb3ZlRW1wdHlUZXh0U3R5bGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUZXh0U3R5bGUgPSBNYXJrLmNyZWF0ZTxUZXh0U3R5bGVPcHRpb25zPih7XG4gIG5hbWU6ICd0ZXh0U3R5bGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgICBnZXRBdHRyczogZWxlbWVudCA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzU3R5bGVzID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKVxuXG4gICAgICAgICAgaWYgKCFoYXNTdHlsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzcGFuJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZW1vdmVFbXB0eVRleHRTdHlsZTogKCkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdldE1hcmtBdHRyaWJ1dGVzKHN0YXRlLCB0aGlzLnR5cGUpXG4gICAgICAgIGNvbnN0IGhhc1N0eWxlcyA9IE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLnNvbWUoKFssIHZhbHVlXSkgPT4gISF2YWx1ZSlcblxuICAgICAgICBpZiAoaGFzU3R5bGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbn0pXG4iLCAiaW1wb3J0ICdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0LXN0eWxlJ1xuXG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCB0eXBlIENvbG9yT3B0aW9ucyA9IHtcbiAgdHlwZXM6IHN0cmluZ1tdLFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgY29sb3I6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IHRoZSB0ZXh0IGNvbG9yXG4gICAgICAgKi9cbiAgICAgIHNldENvbG9yOiAoY29sb3I6IHN0cmluZykgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgdGhlIHRleHQgY29sb3JcbiAgICAgICAqL1xuICAgICAgdW5zZXRDb2xvcjogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IENvbG9yID0gRXh0ZW5zaW9uLmNyZWF0ZTxDb2xvck9wdGlvbnM+KHtcbiAgbmFtZTogJ2NvbG9yJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlczogWyd0ZXh0U3R5bGUnXSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkR2xvYmFsQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0eXBlczogdGhpcy5vcHRpb25zLnR5cGVzLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5zdHlsZS5jb2xvcj8ucmVwbGFjZSgvWydcIl0rL2csICcnKSxcbiAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXMuY29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IGBjb2xvcjogJHthdHRyaWJ1dGVzLmNvbG9yfWAsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRDb2xvcjogY29sb3IgPT4gKHsgY2hhaW4gfSkgPT4ge1xuICAgICAgICByZXR1cm4gY2hhaW4oKVxuICAgICAgICAgIC5zZXRNYXJrKCd0ZXh0U3R5bGUnLCB7IGNvbG9yIH0pXG4gICAgICAgICAgLnJ1bigpXG4gICAgICB9LFxuICAgICAgdW5zZXRDb2xvcjogKCkgPT4gKHsgY2hhaW4gfSkgPT4ge1xuICAgICAgICByZXR1cm4gY2hhaW4oKVxuICAgICAgICAgIC5zZXRNYXJrKCd0ZXh0U3R5bGUnLCB7IGNvbG9yOiBudWxsIH0pXG4gICAgICAgICAgLnJlbW92ZUVtcHR5VGV4dFN0eWxlKClcbiAgICAgICAgICAucnVuKClcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgY29uc3QgRG9jdW1lbnQgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6ICdkb2MnLFxuICB0b3BOb2RlOiB0cnVlLFxuICBjb250ZW50OiAnYmxvY2srJyxcbn0pXG4iLCAiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgZHJvcFBvaW50IH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcblxuLyoqXG5DcmVhdGUgYSBwbHVnaW4gdGhhdCwgd2hlbiBhZGRlZCB0byBhIFByb3NlTWlycm9yIGluc3RhbmNlLFxuY2F1c2VzIGEgZGVjb3JhdGlvbiB0byBzaG93IHVwIGF0IHRoZSBkcm9wIHBvc2l0aW9uIHdoZW4gc29tZXRoaW5nXG5pcyBkcmFnZ2VkIG92ZXIgdGhlIGVkaXRvci5cblxuTm9kZXMgbWF5IGFkZCBhIGBkaXNhYmxlRHJvcEN1cnNvcmAgcHJvcGVydHkgdG8gdGhlaXIgc3BlYyB0b1xuY29udHJvbCB0aGUgc2hvd2luZyBvZiBhIGRyb3AgY3Vyc29yIGluc2lkZSB0aGVtLiBUaGlzIG1heSBiZSBhXG5ib29sZWFuIG9yIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggYSB2aWV3IGFuZCBhXG5wb3NpdGlvbiwgYW5kIHNob3VsZCByZXR1cm4gYSBib29sZWFuLlxuKi9cbmZ1bmN0aW9uIGRyb3BDdXJzb3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgICAgICB2aWV3KGVkaXRvclZpZXcpIHsgcmV0dXJuIG5ldyBEcm9wQ3Vyc29yVmlldyhlZGl0b3JWaWV3LCBvcHRpb25zKTsgfVxuICAgIH0pO1xufVxuY2xhc3MgRHJvcEN1cnNvclZpZXcge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRvclZpZXcsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmVkaXRvclZpZXcgPSBlZGl0b3JWaWV3O1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLndpZHRoID0gKF9hID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMTtcbiAgICAgICAgdGhpcy5jb2xvciA9IG9wdGlvbnMuY29sb3IgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogKG9wdGlvbnMuY29sb3IgfHwgXCJibGFja1wiKTtcbiAgICAgICAgdGhpcy5jbGFzcyA9IG9wdGlvbnMuY2xhc3M7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXCJkcmFnb3ZlclwiLCBcImRyYWdlbmRcIiwgXCJkcm9wXCIsIFwiZHJhZ2xlYXZlXCJdLm1hcChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gKGUpID0+IHsgdGhpc1tuYW1lXShlKTsgfTtcbiAgICAgICAgICAgIGVkaXRvclZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lLCBoYW5kbGVyIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmZvckVhY2goKHsgbmFtZSwgaGFuZGxlciB9KSA9PiB0aGlzLmVkaXRvclZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlcikpO1xuICAgIH1cbiAgICB1cGRhdGUoZWRpdG9yVmlldywgcHJldlN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvclBvcyAhPSBudWxsICYmIHByZXZTdGF0ZS5kb2MgIT0gZWRpdG9yVmlldy5zdGF0ZS5kb2MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvclBvcyA+IGVkaXRvclZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnNvcihudWxsKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU92ZXJsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXJzb3IocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPT0gdGhpcy5jdXJzb3JQb3MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gcG9zO1xuICAgICAgICBpZiAocG9zID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlT3ZlcmxheSgpIHtcbiAgICAgICAgbGV0ICRwb3MgPSB0aGlzLmVkaXRvclZpZXcuc3RhdGUuZG9jLnJlc29sdmUodGhpcy5jdXJzb3JQb3MpO1xuICAgICAgICBsZXQgaXNCbG9jayA9ICEkcG9zLnBhcmVudC5pbmxpbmVDb250ZW50LCByZWN0O1xuICAgICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9ICRwb3Mubm9kZUJlZm9yZSwgYWZ0ZXIgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgICAgIGlmIChiZWZvcmUgfHwgYWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuZWRpdG9yVmlldy5ub2RlRE9NKHRoaXMuY3Vyc29yUG9zIC0gKGJlZm9yZSA/IGJlZm9yZS5ub2RlU2l6ZSA6IDApKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wID0gYmVmb3JlID8gbm9kZVJlY3QuYm90dG9tIDogbm9kZVJlY3QudG9wO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlICYmIGFmdGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gKHRvcCArIHRoaXMuZWRpdG9yVmlldy5ub2RlRE9NKHRoaXMuY3Vyc29yUG9zKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogbm9kZVJlY3QubGVmdCwgcmlnaHQ6IG5vZGVSZWN0LnJpZ2h0LCB0b3A6IHRvcCAtIHRoaXMud2lkdGggLyAyLCBib3R0b206IHRvcCArIHRoaXMud2lkdGggLyAyIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVjdCkge1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IHRoaXMuZWRpdG9yVmlldy5jb29yZHNBdFBvcyh0aGlzLmN1cnNvclBvcyk7XG4gICAgICAgICAgICByZWN0ID0geyBsZWZ0OiBjb29yZHMubGVmdCAtIHRoaXMud2lkdGggLyAyLCByaWdodDogY29vcmRzLmxlZnQgKyB0aGlzLndpZHRoIC8gMiwgdG9wOiBjb29yZHMudG9wLCBib3R0b206IGNvb3Jkcy5ib3R0b20gfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5lZGl0b3JWaWV3LmRvbS5vZmZzZXRQYXJlbnQ7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBwYXJlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jbGFzcylcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5jbGFzcztcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDUwOyBwb2ludGVyLWV2ZW50czogbm9uZTtcIjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJwcm9zZW1pcnJvci1kcm9wY3Vyc29yLWJsb2NrXCIsIGlzQmxvY2spO1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShcInByb3NlbWlycm9yLWRyb3BjdXJzb3ItaW5saW5lXCIsICFpc0Jsb2NrKTtcbiAgICAgICAgbGV0IHBhcmVudExlZnQsIHBhcmVudFRvcDtcbiAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09IGRvY3VtZW50LmJvZHkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpLnBvc2l0aW9uID09IFwic3RhdGljXCIpIHtcbiAgICAgICAgICAgIHBhcmVudExlZnQgPSAtcGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICBwYXJlbnRUb3AgPSAtcGFnZVlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHBhcmVudExlZnQgPSByZWN0LmxlZnQgLSBwYXJlbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIHBhcmVudFRvcCA9IHJlY3QudG9wIC0gcGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUubGVmdCA9IChyZWN0LmxlZnQgLSBwYXJlbnRMZWZ0KSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnRvcCA9IChyZWN0LnRvcCAtIHBhcmVudFRvcCkgKyBcInB4XCI7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IChyZWN0LmJvdHRvbSAtIHJlY3QudG9wKSArIFwicHhcIjtcbiAgICB9XG4gICAgc2NoZWR1bGVSZW1vdmFsKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRDdXJzb3IobnVsbCksIHRpbWVvdXQpO1xuICAgIH1cbiAgICBkcmFnb3ZlcihldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuZWRpdG9yVmlldy5lZGl0YWJsZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuZWRpdG9yVmlldy5wb3NBdENvb3Jkcyh7IGxlZnQ6IGV2ZW50LmNsaWVudFgsIHRvcDogZXZlbnQuY2xpZW50WSB9KTtcbiAgICAgICAgbGV0IG5vZGUgPSBwb3MgJiYgcG9zLmluc2lkZSA+PSAwICYmIHRoaXMuZWRpdG9yVmlldy5zdGF0ZS5kb2Mubm9kZUF0KHBvcy5pbnNpZGUpO1xuICAgICAgICBsZXQgZGlzYWJsZURyb3BDdXJzb3IgPSBub2RlICYmIG5vZGUudHlwZS5zcGVjLmRpc2FibGVEcm9wQ3Vyc29yO1xuICAgICAgICBsZXQgZGlzYWJsZWQgPSB0eXBlb2YgZGlzYWJsZURyb3BDdXJzb3IgPT0gXCJmdW5jdGlvblwiID8gZGlzYWJsZURyb3BDdXJzb3IodGhpcy5lZGl0b3JWaWV3LCBwb3MsIGV2ZW50KSA6IGRpc2FibGVEcm9wQ3Vyc29yO1xuICAgICAgICBpZiAocG9zICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHBvcy5wb3M7XG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3JWaWV3LmRyYWdnaW5nICYmIHRoaXMuZWRpdG9yVmlldy5kcmFnZ2luZy5zbGljZSkge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IGRyb3BQb2ludCh0aGlzLmVkaXRvclZpZXcuc3RhdGUuZG9jLCB0YXJnZXQsIHRoaXMuZWRpdG9yVmlldy5kcmFnZ2luZy5zbGljZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvaW50ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3IodGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZW1vdmFsKDUwMDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRyYWdlbmQoKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZW1vdmFsKDIwKTtcbiAgICB9XG4gICAgZHJvcCgpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlbW92YWwoMjApO1xuICAgIH1cbiAgICBkcmFnbGVhdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PSB0aGlzLmVkaXRvclZpZXcuZG9tIHx8ICF0aGlzLmVkaXRvclZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3IobnVsbCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBkcm9wQ3Vyc29yIH07XG4iLCAiaW1wb3J0IHsgRXh0ZW5zaW9uIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgZHJvcEN1cnNvciB9IGZyb20gJ0B0aXB0YXAvcG0vZHJvcGN1cnNvcidcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wY3Vyc29yT3B0aW9ucyB7XG4gIGNvbG9yOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGNsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQsXG59XG5cbmV4cG9ydCBjb25zdCBEcm9wY3Vyc29yID0gRXh0ZW5zaW9uLmNyZWF0ZTxEcm9wY3Vyc29yT3B0aW9ucz4oe1xuICBuYW1lOiAnZHJvcEN1cnNvcicsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6ICdjdXJyZW50Q29sb3InLFxuICAgICAgd2lkdGg6IDEsXG4gICAgICBjbGFzczogdW5kZWZpbmVkLFxuICAgIH1cbiAgfSxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGRyb3BDdXJzb3IodGhpcy5vcHRpb25zKSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IGtleWRvd25IYW5kbGVyIH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7IFNlbGVjdGlvbiwgTm9kZVNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiwgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgU2xpY2UsIEZyYWdtZW50IH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgRGVjb3JhdGlvblNldCwgRGVjb3JhdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuXG4vKipcbkdhcCBjdXJzb3Igc2VsZWN0aW9ucyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhpcyBjbGFzcy4gSXRzXG5gJGFuY2hvcmAgYW5kIGAkaGVhZGAgcHJvcGVydGllcyBib3RoIHBvaW50IGF0IHRoZSBjdXJzb3IgcG9zaXRpb24uXG4qL1xuY2xhc3MgR2FwQ3Vyc29yIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBnYXAgY3Vyc29yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoJHBvcykge1xuICAgICAgICBzdXBlcigkcG9zLCAkcG9zKTtcbiAgICB9XG4gICAgbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHRoaXMuaGVhZCkpO1xuICAgICAgICByZXR1cm4gR2FwQ3Vyc29yLnZhbGlkKCRwb3MpID8gbmV3IEdhcEN1cnNvcigkcG9zKSA6IFNlbGVjdGlvbi5uZWFyKCRwb3MpO1xuICAgIH1cbiAgICBjb250ZW50KCkgeyByZXR1cm4gU2xpY2UuZW1wdHk7IH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBHYXBDdXJzb3IgJiYgb3RoZXIuaGVhZCA9PSB0aGlzLmhlYWQ7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJnYXBjdXJzb3JcIiwgcG9zOiB0aGlzLmhlYWQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgR2FwQ3Vyc29yLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEdhcEN1cnNvcihkb2MucmVzb2x2ZShqc29uLnBvcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldEJvb2ttYXJrKCkgeyByZXR1cm4gbmV3IEdhcEJvb2ttYXJrKHRoaXMuYW5jaG9yKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHZhbGlkKCRwb3MpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRwb3MucGFyZW50O1xuICAgICAgICBpZiAocGFyZW50LmlzVGV4dGJsb2NrIHx8ICFjbG9zZWRCZWZvcmUoJHBvcykgfHwgIWNsb3NlZEFmdGVyKCRwb3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgb3ZlcnJpZGUgPSBwYXJlbnQudHlwZS5zcGVjLmFsbG93R2FwQ3Vyc29yO1xuICAgICAgICBpZiAob3ZlcnJpZGUgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBvdmVycmlkZTtcbiAgICAgICAgbGV0IGRlZmx0ID0gcGFyZW50LmNvbnRlbnRNYXRjaEF0KCRwb3MuaW5kZXgoKSkuZGVmYXVsdFR5cGU7XG4gICAgICAgIHJldHVybiBkZWZsdCAmJiBkZWZsdC5pc1RleHRibG9jaztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEdhcEN1cnNvckZyb20oJHBvcywgZGlyLCBtdXN0TW92ZSA9IGZhbHNlKSB7XG4gICAgICAgIHNlYXJjaDogZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKCFtdXN0TW92ZSAmJiBHYXBDdXJzb3IudmFsaWQoJHBvcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuICRwb3M7XG4gICAgICAgICAgICBsZXQgcG9zID0gJHBvcy5wb3MsIG5leHQgPSBudWxsO1xuICAgICAgICAgICAgLy8gU2NhbiB1cCBmcm9tIHRoaXMgcG9zaXRpb25cbiAgICAgICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOzsgZC0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9ICRwb3Mubm9kZShkKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyID4gMCA/ICRwb3MuaW5kZXhBZnRlcihkKSA8IHBhcmVudC5jaGlsZENvdW50IDogJHBvcy5pbmRleChkKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHBhcmVudC5jaGlsZChkaXIgPiAwID8gJHBvcy5pbmRleEFmdGVyKGQpIDogJHBvcy5pbmRleChkKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgKz0gZGlyO1xuICAgICAgICAgICAgICAgIGxldCAkY3VyID0gJHBvcy5kb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICAgICAgICAgIGlmIChHYXBDdXJzb3IudmFsaWQoJGN1cikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkY3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQW5kIHRoZW4gZG93biBpbnRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5zaWRlID0gZGlyID4gMCA/IG5leHQuZmlyc3RDaGlsZCA6IG5leHQubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgIGlmICghaW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmlzQXRvbSAmJiAhbmV4dC5pc1RleHQgJiYgIU5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkcG9zID0gJHBvcy5kb2MucmVzb2x2ZShwb3MgKyBuZXh0Lm5vZGVTaXplICogZGlyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11c3RNb3ZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzZWFyY2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgPSBpbnNpZGU7XG4gICAgICAgICAgICAgICAgcG9zICs9IGRpcjtcbiAgICAgICAgICAgICAgICBsZXQgJGN1ciA9ICRwb3MuZG9jLnJlc29sdmUocG9zKTtcbiAgICAgICAgICAgICAgICBpZiAoR2FwQ3Vyc29yLnZhbGlkKCRjdXIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGN1cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuR2FwQ3Vyc29yLnByb3RvdHlwZS52aXNpYmxlID0gZmFsc2U7XG5HYXBDdXJzb3IuZmluZEZyb20gPSBHYXBDdXJzb3IuZmluZEdhcEN1cnNvckZyb207XG5TZWxlY3Rpb24uanNvbklEKFwiZ2FwY3Vyc29yXCIsIEdhcEN1cnNvcik7XG5jbGFzcyBHYXBCb29rbWFyayB7XG4gICAgY29uc3RydWN0b3IocG9zKSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICByZXR1cm4gbmV3IEdhcEJvb2ttYXJrKG1hcHBpbmcubWFwKHRoaXMucG9zKSk7XG4gICAgfVxuICAgIHJlc29sdmUoZG9jKSB7XG4gICAgICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUodGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gR2FwQ3Vyc29yLnZhbGlkKCRwb3MpID8gbmV3IEdhcEN1cnNvcigkcG9zKSA6IFNlbGVjdGlvbi5uZWFyKCRwb3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsb3NlZEJlZm9yZSgkcG9zKSB7XG4gICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXgoZCksIHBhcmVudCA9ICRwb3Mubm9kZShkKTtcbiAgICAgICAgLy8gQXQgdGhlIHN0YXJ0IG9mIHRoaXMgcGFyZW50LCBsb29rIGF0IG5leHQgb25lXG4gICAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWUgaWYgdGhlIG5vZGUgYmVmb3JlIChvciBpdHMgZmlyc3QgYW5jZXN0b3IpIGlzIGNsb3NlZFxuICAgICAgICBmb3IgKGxldCBiZWZvcmUgPSBwYXJlbnQuY2hpbGQoaW5kZXggLSAxKTs7IGJlZm9yZSA9IGJlZm9yZS5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmICgoYmVmb3JlLmNoaWxkQ291bnQgPT0gMCAmJiAhYmVmb3JlLmlubGluZUNvbnRlbnQpIHx8IGJlZm9yZS5pc0F0b20gfHwgYmVmb3JlLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoYmVmb3JlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhpdCBzdGFydCBvZiBkb2N1bWVudFxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY2xvc2VkQWZ0ZXIoJHBvcykge1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4QWZ0ZXIoZCksIHBhcmVudCA9ICRwb3Mubm9kZShkKTtcbiAgICAgICAgaWYgKGluZGV4ID09IHBhcmVudC5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBhZnRlciA9IHBhcmVudC5jaGlsZChpbmRleCk7OyBhZnRlciA9IGFmdGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmICgoYWZ0ZXIuY2hpbGRDb3VudCA9PSAwICYmICFhZnRlci5pbmxpbmVDb250ZW50KSB8fCBhZnRlci5pc0F0b20gfHwgYWZ0ZXIudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChhZnRlci5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG5DcmVhdGUgYSBnYXAgY3Vyc29yIHBsdWdpbi4gV2hlbiBlbmFibGVkLCB0aGlzIHdpbGwgY2FwdHVyZSBjbGlja3Ncbm5lYXIgYW5kIGFycm93LWtleS1tb3Rpb24gcGFzdCBwbGFjZXMgdGhhdCBkb24ndCBoYXZlIGEgbm9ybWFsbHlcbnNlbGVjdGFibGUgcG9zaXRpb24gbmVhcmJ5LCBhbmQgY3JlYXRlIGEgZ2FwIGN1cnNvciBzZWxlY3Rpb24gZm9yXG50aGVtLiBUaGUgY3Vyc29yIGlzIGRyYXduIGFzIGFuIGVsZW1lbnQgd2l0aCBjbGFzc1xuYFByb3NlTWlycm9yLWdhcGN1cnNvcmAuIFlvdSBjYW4gZWl0aGVyIGluY2x1ZGVcbmBzdHlsZS9nYXBjdXJzb3IuY3NzYCBmcm9tIHRoZSBwYWNrYWdlJ3MgZGlyZWN0b3J5IG9yIGFkZCB5b3VyIG93blxuc3R5bGVzIHRvIG1ha2UgaXQgdmlzaWJsZS5cbiovXG5mdW5jdGlvbiBnYXBDdXJzb3IoKSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZGVjb3JhdGlvbnM6IGRyYXdHYXBDdXJzb3IsXG4gICAgICAgICAgICBjcmVhdGVTZWxlY3Rpb25CZXR3ZWVuKF92aWV3LCAkYW5jaG9yLCAkaGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkYW5jaG9yLnBvcyA9PSAkaGVhZC5wb3MgJiYgR2FwQ3Vyc29yLnZhbGlkKCRoZWFkKSA/IG5ldyBHYXBDdXJzb3IoJGhlYWQpIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYW5kbGVDbGljayxcbiAgICAgICAgICAgIGhhbmRsZUtleURvd24sXG4gICAgICAgICAgICBoYW5kbGVET01FdmVudHM6IHsgYmVmb3JlaW5wdXQ6IGJlZm9yZWlucHV0IH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuY29uc3QgaGFuZGxlS2V5RG93biA9IGtleWRvd25IYW5kbGVyKHtcbiAgICBcIkFycm93TGVmdFwiOiBhcnJvdyhcImhvcml6XCIsIC0xKSxcbiAgICBcIkFycm93UmlnaHRcIjogYXJyb3coXCJob3JpelwiLCAxKSxcbiAgICBcIkFycm93VXBcIjogYXJyb3coXCJ2ZXJ0XCIsIC0xKSxcbiAgICBcIkFycm93RG93blwiOiBhcnJvdyhcInZlcnRcIiwgMSlcbn0pO1xuZnVuY3Rpb24gYXJyb3coYXhpcywgZGlyKSB7XG4gICAgY29uc3QgZGlyU3RyID0gYXhpcyA9PSBcInZlcnRcIiA/IChkaXIgPiAwID8gXCJkb3duXCIgOiBcInVwXCIpIDogKGRpciA+IDAgPyBcInJpZ2h0XCIgOiBcImxlZnRcIik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpIHtcbiAgICAgICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0ICRzdGFydCA9IGRpciA+IDAgPyBzZWwuJHRvIDogc2VsLiRmcm9tLCBtdXN0TW92ZSA9IHNlbC5lbXB0eTtcbiAgICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghdmlldy5lbmRPZlRleHRibG9jayhkaXJTdHIpIHx8ICRzdGFydC5kZXB0aCA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG11c3RNb3ZlID0gZmFsc2U7XG4gICAgICAgICAgICAkc3RhcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShkaXIgPiAwID8gJHN0YXJ0LmFmdGVyKCkgOiAkc3RhcnQuYmVmb3JlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCAkZm91bmQgPSBHYXBDdXJzb3IuZmluZEdhcEN1cnNvckZyb20oJHN0YXJ0LCBkaXIsIG11c3RNb3ZlKTtcbiAgICAgICAgaWYgKCEkZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXcgR2FwQ3Vyc29yKCRmb3VuZCkpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUNsaWNrKHZpZXcsIHBvcywgZXZlbnQpIHtcbiAgICBpZiAoIXZpZXcgfHwgIXZpZXcuZWRpdGFibGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIUdhcEN1cnNvci52YWxpZCgkcG9zKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBjbGlja1BvcyA9IHZpZXcucG9zQXRDb29yZHMoeyBsZWZ0OiBldmVudC5jbGllbnRYLCB0b3A6IGV2ZW50LmNsaWVudFkgfSk7XG4gICAgaWYgKGNsaWNrUG9zICYmIGNsaWNrUG9zLmluc2lkZSA+IC0xICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKHZpZXcuc3RhdGUuZG9jLm5vZGVBdChjbGlja1Bvcy5pbnNpZGUpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24obmV3IEdhcEN1cnNvcigkcG9zKSkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuLy8gVGhpcyBpcyBhIGhhY2sgdGhhdCwgd2hlbiBhIGNvbXBvc2l0aW9uIHN0YXJ0cyB3aGlsZSBhIGdhcCBjdXJzb3Jcbi8vIGlzIGFjdGl2ZSwgcXVpY2tseSBjcmVhdGVzIGFuIGlubGluZSBjb250ZXh0IGZvciB0aGUgY29tcG9zaXRpb24gdG9cbi8vIGhhcHBlbiBpbiwgdG8gYXZvaWQgaXQgYmVpbmcgYWJvcnRlZCBieSB0aGUgRE9NIHNlbGVjdGlvbiBiZWluZ1xuLy8gbW92ZWQgaW50byBhIHZhbGlkIHBvc2l0aW9uLlxuZnVuY3Rpb24gYmVmb3JlaW5wdXQodmlldywgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuaW5wdXRUeXBlICE9IFwiaW5zZXJ0Q29tcG9zaXRpb25UZXh0XCIgfHwgISh2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIEdhcEN1cnNvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgeyAkZnJvbSB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IGluc2VydCA9ICRmcm9tLnBhcmVudC5jb250ZW50TWF0Y2hBdCgkZnJvbS5pbmRleCgpKS5maW5kV3JhcHBpbmcodmlldy5zdGF0ZS5zY2hlbWEubm9kZXMudGV4dCk7XG4gICAgaWYgKCFpbnNlcnQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZnJhZyA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSBpbnNlcnQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIGZyYWcgPSBGcmFnbWVudC5mcm9tKGluc2VydFtpXS5jcmVhdGVBbmRGaWxsKG51bGwsIGZyYWcpKTtcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnJlcGxhY2UoJGZyb20ucG9zLCAkZnJvbS5wb3MsIG5ldyBTbGljZShmcmFnLCAwLCAwKSk7XG4gICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZSgkZnJvbS5wb3MgKyAxKSkpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRyYXdHYXBDdXJzb3Ioc3RhdGUpIHtcbiAgICBpZiAoIShzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBHYXBDdXJzb3IpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbm9kZS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLWdhcGN1cnNvclwiO1xuICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmNyZWF0ZShzdGF0ZS5kb2MsIFtEZWNvcmF0aW9uLndpZGdldChzdGF0ZS5zZWxlY3Rpb24uaGVhZCwgbm9kZSwgeyBrZXk6IFwiZ2FwY3Vyc29yXCIgfSldKTtcbn1cblxuZXhwb3J0IHsgR2FwQ3Vyc29yLCBnYXBDdXJzb3IgfTtcbiIsICJpbXBvcnQge1xuICBjYWxsT3JSZXR1cm4sXG4gIEV4dGVuc2lvbixcbiAgZ2V0RXh0ZW5zaW9uRmllbGQsXG4gIFBhcmVudENvbmZpZyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgZ2FwQ3Vyc29yIH0gZnJvbSAnQHRpcHRhcC9wbS9nYXBjdXJzb3InXG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4ge1xuICAgIC8qKlxuICAgICAqIEFsbG93IGdhcCBjdXJzb3JcbiAgICAgKi9cbiAgICBhbGxvd0dhcEN1cnNvcj86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgbnVsbFxuICAgICAgfCAoKHRoaXM6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zOiBPcHRpb25zLFxuICAgICAgICBzdG9yYWdlOiBTdG9yYWdlLFxuICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnM+PlsnYWxsb3dHYXBDdXJzb3InXSxcbiAgICAgIH0pID0+IGJvb2xlYW4gfCBudWxsKSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgR2FwY3Vyc29yID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gIG5hbWU6ICdnYXBDdXJzb3InLFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgZ2FwQ3Vyc29yKCksXG4gICAgXVxuICB9LFxuXG4gIGV4dGVuZE5vZGVTY2hlbWEoZXh0ZW5zaW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIG5hbWU6IGV4dGVuc2lvbi5uYW1lLFxuICAgICAgb3B0aW9uczogZXh0ZW5zaW9uLm9wdGlvbnMsXG4gICAgICBzdG9yYWdlOiBleHRlbnNpb24uc3RvcmFnZSxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dHYXBDdXJzb3I6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZChleHRlbnNpb24sICdhbGxvd0dhcEN1cnNvcicsIGNvbnRleHQpKSA/PyBudWxsLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhcmRCcmVha09wdGlvbnMge1xuICBrZWVwTWFya3M6IGJvb2xlYW4sXG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaGFyZEJyZWFrOiB7XG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhIGhhcmQgYnJlYWtcbiAgICAgICAqL1xuICAgICAgc2V0SGFyZEJyZWFrOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSGFyZEJyZWFrID0gTm9kZS5jcmVhdGU8SGFyZEJyZWFrT3B0aW9ucz4oe1xuICBuYW1lOiAnaGFyZEJyZWFrJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBrZWVwTWFya3M6IHRydWUsXG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIGlubGluZTogdHJ1ZSxcblxuICBncm91cDogJ2lubGluZScsXG5cbiAgc2VsZWN0YWJsZTogZmFsc2UsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ2JyJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2JyJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpXVxuICB9LFxuXG4gIHJlbmRlclRleHQoKSB7XG4gICAgcmV0dXJuICdcXG4nXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldEhhcmRCcmVhazogKCkgPT4gKHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIGNoYWluLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZWRpdG9yLFxuICAgICAgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMuZmlyc3QoW1xuICAgICAgICAgICgpID0+IGNvbW1hbmRzLmV4aXRDb2RlKCksXG4gICAgICAgICAgKCkgPT4gY29tbWFuZHMuY29tbWFuZCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgc3RvcmVkTWFya3MgfSA9IHN0YXRlXG5cbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24uJGZyb20ucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHsga2VlcE1hcmtzIH0gPSB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IHsgc3BsaXR0YWJsZU1hcmtzIH0gPSBlZGl0b3IuZXh0ZW5zaW9uTWFuYWdlclxuICAgICAgICAgICAgY29uc3QgbWFya3MgPSBzdG9yZWRNYXJrc1xuICAgICAgICAgICAgICB8fCAoc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpXG5cbiAgICAgICAgICAgIHJldHVybiBjaGFpbigpXG4gICAgICAgICAgICAgIC5pbnNlcnRDb250ZW50KHsgdHlwZTogdGhpcy5uYW1lIH0pXG4gICAgICAgICAgICAgIC5jb21tYW5kKCh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoICYmIG1hcmtzICYmIGtlZXBNYXJrcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRNYXJrcyA9IG1hcmtzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobWFyayA9PiBzcGxpdHRhYmxlTWFya3MuaW5jbHVkZXMobWFyay50eXBlLm5hbWUpKVxuXG4gICAgICAgICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhmaWx0ZXJlZE1hcmtzKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5ydW4oKVxuICAgICAgICAgIH0pLFxuICAgICAgICBdKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtRW50ZXInOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zZXRIYXJkQnJlYWsoKSxcbiAgICAgICdTaGlmdC1FbnRlcic6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldEhhcmRCcmVhaygpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlLCB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgdHlwZSBMZXZlbCA9IDEgfCAyIHwgMyB8IDQgfCA1IHwgNlxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRpbmdPcHRpb25zIHtcbiAgbGV2ZWxzOiBMZXZlbFtdLFxuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGhlYWRpbmc6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgaGVhZGluZyBub2RlXG4gICAgICAgKi9cbiAgICAgIHNldEhlYWRpbmc6IChhdHRyaWJ1dGVzOiB7IGxldmVsOiBMZXZlbCB9KSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgYSBoZWFkaW5nIG5vZGVcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlSGVhZGluZzogKGF0dHJpYnV0ZXM6IHsgbGV2ZWw6IExldmVsIH0pID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBIZWFkaW5nID0gTm9kZS5jcmVhdGU8SGVhZGluZ09wdGlvbnM+KHtcbiAgbmFtZTogJ2hlYWRpbmcnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxldmVsczogWzEsIDIsIDMsIDQsIDUsIDZdLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAnaW5saW5lKicsXG5cbiAgZ3JvdXA6ICdibG9jaycsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGV2ZWw6IHtcbiAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgcmVuZGVyZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGV2ZWxzXG4gICAgICAubWFwKChsZXZlbDogTGV2ZWwpID0+ICh7XG4gICAgICAgIHRhZzogYGgke2xldmVsfWAsXG4gICAgICAgIGF0dHJzOiB7IGxldmVsIH0sXG4gICAgICB9KSlcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgbm9kZSwgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIGNvbnN0IGhhc0xldmVsID0gdGhpcy5vcHRpb25zLmxldmVscy5pbmNsdWRlcyhub2RlLmF0dHJzLmxldmVsKVxuICAgIGNvbnN0IGxldmVsID0gaGFzTGV2ZWxcbiAgICAgID8gbm9kZS5hdHRycy5sZXZlbFxuICAgICAgOiB0aGlzLm9wdGlvbnMubGV2ZWxzWzBdXG5cbiAgICByZXR1cm4gW2BoJHtsZXZlbH1gLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldEhlYWRpbmc6IGF0dHJpYnV0ZXMgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5sZXZlbHMuaW5jbHVkZXMoYXR0cmlidXRlcy5sZXZlbCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgIH0sXG4gICAgICB0b2dnbGVIZWFkaW5nOiBhdHRyaWJ1dGVzID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubGV2ZWxzLmluY2x1ZGVzKGF0dHJpYnV0ZXMubGV2ZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTm9kZSh0aGlzLm5hbWUsICdwYXJhZ3JhcGgnLCBhdHRyaWJ1dGVzKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZXZlbHMucmVkdWNlKChpdGVtcywgbGV2ZWwpID0+ICh7XG4gICAgICAuLi5pdGVtcyxcbiAgICAgIC4uLntcbiAgICAgICAgW2BNb2QtQWx0LSR7bGV2ZWx9YF06ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbCB9KSxcbiAgICAgIH0sXG4gICAgfSksIHt9KVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZXZlbHMubWFwKGxldmVsID0+IHtcbiAgICAgIHJldHVybiB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogbmV3IFJlZ0V4cChgXigjezEsJHtsZXZlbH19KVxcXFxzJGApLFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGdldEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSxcbn0pXG4iLCAidmFyIEdPT0RfTEVBRl9TSVpFID0gMjAwO1xuXG4vLyA6OiBjbGFzczxUPiBBIHJvcGUgc2VxdWVuY2UgaXMgYSBwZXJzaXN0ZW50IHNlcXVlbmNlIGRhdGEgc3RydWN0dXJlXG4vLyB0aGF0IHN1cHBvcnRzIGFwcGVuZGluZywgcHJlcGVuZGluZywgYW5kIHNsaWNpbmcgd2l0aG91dCBkb2luZyBhXG4vLyBmdWxsIGNvcHkuIEl0IGlzIHJlcHJlc2VudGVkIGFzIGEgbW9zdGx5LWJhbGFuY2VkIHRyZWUuXG52YXIgUm9wZVNlcXVlbmNlID0gZnVuY3Rpb24gUm9wZVNlcXVlbmNlICgpIHt9O1xuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAob3RoZXIpIHtcbiAgaWYgKCFvdGhlci5sZW5ndGgpIHsgcmV0dXJuIHRoaXMgfVxuICBvdGhlciA9IFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKTtcblxuICByZXR1cm4gKCF0aGlzLmxlbmd0aCAmJiBvdGhlcikgfHxcbiAgICAob3RoZXIubGVuZ3RoIDwgR09PRF9MRUFGX1NJWkUgJiYgdGhpcy5sZWFmQXBwZW5kKG90aGVyKSkgfHxcbiAgICAodGhpcy5sZW5ndGggPCBHT09EX0xFQUZfU0laRSAmJiBvdGhlci5sZWFmUHJlcGVuZCh0aGlzKSkgfHxcbiAgICB0aGlzLmFwcGVuZElubmVyKG90aGVyKVxufTtcblxuLy8gOjogKHVuaW9uPFtUXSwgUm9wZVNlcXVlbmNlPFQ+PikgXHUyMTkyIFJvcGVTZXF1ZW5jZTxUPlxuLy8gUHJlcGVuZCBhbiBhcnJheSBvciBvdGhlciByb3BlIHRvIHRoaXMgb25lLCByZXR1cm5pbmcgYSBuZXcgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIHByZXBlbmQgKG90aGVyKSB7XG4gIGlmICghb3RoZXIubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgcmV0dXJuIFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKS5hcHBlbmQodGhpcylcbn07XG5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuYXBwZW5kSW5uZXIgPSBmdW5jdGlvbiBhcHBlbmRJbm5lciAob3RoZXIpIHtcbiAgcmV0dXJuIG5ldyBBcHBlbmQodGhpcywgb3RoZXIpXG59O1xuXG4vLyA6OiAoP251bWJlciwgP251bWJlcikgXHUyMTkyIFJvcGVTZXF1ZW5jZTxUPlxuLy8gQ3JlYXRlIGEgcm9wZSByZXBlc2VudGluZyBhIHN1Yi1zZXF1ZW5jZSBvZiB0aGlzIHJvcGUuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIGlmIChmcm9tID49IHRvKSB7IHJldHVybiBSb3BlU2VxdWVuY2UuZW1wdHkgfVxuICByZXR1cm4gdGhpcy5zbGljZUlubmVyKE1hdGgubWF4KDAsIGZyb20pLCBNYXRoLm1pbih0aGlzLmxlbmd0aCwgdG8pKVxufTtcblxuLy8gOjogKG51bWJlcikgXHUyMTkyIFRcbi8vIFJldHJpZXZlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoaXMgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpKSB7XG4gIGlmIChpIDwgMCB8fCBpID49IHRoaXMubGVuZ3RoKSB7IHJldHVybiB1bmRlZmluZWQgfVxuICByZXR1cm4gdGhpcy5nZXRJbm5lcihpKVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSBcdTIxOTIgP2Jvb2wsID9udW1iZXIsID9udW1iZXIpXG4vLyBDYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBlbGVtZW50IGJldHdlZW4gdGhlIGdpdmVuXG4vLyBpbmRpY2VzLiBUaGlzIHRlbmRzIHRvIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gbG9vcGluZyBvdmVyIHRoZVxuLy8gaW5kaWNlcyBhbmQgY2FsbGluZyBgZ2V0YCwgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgdG8gZGVzY2VuZCB0aGVcbi8vIHRyZWUgZm9yIGV2ZXJ5IGVsZW1lbnQuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoIChmLCBmcm9tLCB0bykge1xuICAgIGlmICggZnJvbSA9PT0gdm9pZCAwICkgZnJvbSA9IDA7XG4gICAgaWYgKCB0byA9PT0gdm9pZCAwICkgdG8gPSB0aGlzLmxlbmd0aDtcblxuICBpZiAoZnJvbSA8PSB0bylcbiAgICB7IHRoaXMuZm9yRWFjaElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLmZvckVhY2hJbnZlcnRlZElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSBcdTIxOTIgVSwgP251bWJlciwgP251bWJlcikgXHUyMTkyIFtVXVxuLy8gTWFwIHRoZSBnaXZlbiBmdW5jdGlvbnMgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHJvcGUsIHByb2R1Y2luZ1xuLy8gYSBmbGF0IGFycmF5LlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAgKGYsIGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbHQsIGkpIHsgcmV0dXJuIHJlc3VsdC5wdXNoKGYoZWx0LCBpKSk7IH0sIGZyb20sIHRvKTtcbiAgcmV0dXJuIHJlc3VsdFxufTtcblxuLy8gOjogKD91bmlvbjxbVF0sIFJvcGVTZXF1ZW5jZTxUPj4pIFx1MjE5MiBSb3BlU2VxdWVuY2U8VD5cbi8vIENyZWF0ZSBhIHJvcGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBhcnJheSwgb3IgcmV0dXJuIHRoZSByb3BlXG4vLyBpdHNlbGYgaWYgYSByb3BlIHdhcyBnaXZlbi5cblJvcGVTZXF1ZW5jZS5mcm9tID0gZnVuY3Rpb24gZnJvbSAodmFsdWVzKSB7XG4gIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBSb3BlU2VxdWVuY2UpIHsgcmV0dXJuIHZhbHVlcyB9XG4gIHJldHVybiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA/IG5ldyBMZWFmKHZhbHVlcykgOiBSb3BlU2VxdWVuY2UuZW1wdHlcbn07XG5cbnZhciBMZWFmID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIExlYWYodmFsdWVzKSB7XG4gICAgUm9wZVNlcXVlbmNlLmNhbGwodGhpcyk7XG4gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIExlYWYuX19wcm90b19fID0gUm9wZVNlcXVlbmNlO1xuICBMZWFmLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFJvcGVTZXF1ZW5jZSAmJiBSb3BlU2VxdWVuY2UucHJvdG90eXBlICk7XG4gIExlYWYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGVhZjtcblxuICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBsZW5ndGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGVwdGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICBMZWFmLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgcmV0dXJuIG5ldyBMZWFmKHRoaXMudmFsdWVzLnNsaWNlKGZyb20sIHRvKSlcbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5nZXRJbm5lciA9IGZ1bmN0aW9uIGdldElubmVyIChpKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2ldXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaElubmVyID0gZnVuY3Rpb24gZm9yRWFjaElubmVyIChmLCBmcm9tLCB0bywgc3RhcnQpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbTsgaSA8IHRvOyBpKyspXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaEludmVydGVkSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW52ZXJ0ZWRJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgZm9yICh2YXIgaSA9IGZyb20gLSAxOyBpID49IHRvOyBpLS0pXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUubGVhZkFwcGVuZCA9IGZ1bmN0aW9uIGxlYWZBcHBlbmQgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoIDw9IEdPT0RfTEVBRl9TSVpFKVxuICAgICAgeyByZXR1cm4gbmV3IExlYWYodGhpcy52YWx1ZXMuY29uY2F0KG90aGVyLmZsYXR0ZW4oKSkpIH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aCA8PSBHT09EX0xFQUZfU0laRSlcbiAgICAgIHsgcmV0dXJuIG5ldyBMZWFmKG90aGVyLmZsYXR0ZW4oKS5jb25jYXQodGhpcy52YWx1ZXMpKSB9XG4gIH07XG5cbiAgcHJvdG90eXBlQWNjZXNzb3JzLmxlbmd0aC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggfTtcblxuICBwcm90b3R5cGVBY2Nlc3NvcnMuZGVwdGguZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMCB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMZWFmLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgcmV0dXJuIExlYWY7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG4vLyA6OiBSb3BlU2VxdWVuY2Vcbi8vIFRoZSBlbXB0eSByb3BlIHNlcXVlbmNlLlxuUm9wZVNlcXVlbmNlLmVtcHR5ID0gbmV3IExlYWYoW10pO1xuXG52YXIgQXBwZW5kID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIEFwcGVuZChsZWZ0LCByaWdodCkge1xuICAgIFJvcGVTZXF1ZW5jZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgIHRoaXMubGVuZ3RoID0gbGVmdC5sZW5ndGggKyByaWdodC5sZW5ndGg7XG4gICAgdGhpcy5kZXB0aCA9IE1hdGgubWF4KGxlZnQuZGVwdGgsIHJpZ2h0LmRlcHRoKSArIDE7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIEFwcGVuZC5fX3Byb3RvX18gPSBSb3BlU2VxdWVuY2U7XG4gIEFwcGVuZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBSb3BlU2VxdWVuY2UgJiYgUm9wZVNlcXVlbmNlLnByb3RvdHlwZSApO1xuICBBcHBlbmQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXBwZW5kO1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZmxhdHRlbiA9IGZ1bmN0aW9uIGZsYXR0ZW4gKCkge1xuICAgIHJldHVybiB0aGlzLmxlZnQuZmxhdHRlbigpLmNvbmNhdCh0aGlzLnJpZ2h0LmZsYXR0ZW4oKSlcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmdldElubmVyID0gZnVuY3Rpb24gZ2V0SW5uZXIgKGkpIHtcbiAgICByZXR1cm4gaSA8IHRoaXMubGVmdC5sZW5ndGggPyB0aGlzLmxlZnQuZ2V0KGkpIDogdGhpcy5yaWdodC5nZXQoaSAtIHRoaXMubGVmdC5sZW5ndGgpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5mb3JFYWNoSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA8IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hJbm5lcihmLCBmcm9tLCBNYXRoLm1pbih0bywgbGVmdExlbiksIHN0YXJ0KSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvID4gbGVmdExlbiAmJlxuICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hJbm5lcihmLCBNYXRoLm1heChmcm9tIC0gbGVmdExlbiwgMCksIE1hdGgubWluKHRoaXMubGVuZ3RoLCB0bykgLSBsZWZ0TGVuLCBzdGFydCArIGxlZnRMZW4pID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmZvckVhY2hJbnZlcnRlZElubmVyID0gZnVuY3Rpb24gZm9yRWFjaEludmVydGVkSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA+IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoSW52ZXJ0ZWRJbm5lcihmLCBmcm9tIC0gbGVmdExlbiwgTWF0aC5tYXgodG8sIGxlZnRMZW4pIC0gbGVmdExlbiwgc3RhcnQgKyBsZWZ0TGVuKSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvIDwgbGVmdExlbiAmJlxuICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaEludmVydGVkSW5uZXIoZiwgTWF0aC5taW4oZnJvbSwgbGVmdExlbiksIHRvLCBzdGFydCkgPT09IGZhbHNlKVxuICAgICAgeyByZXR1cm4gZmFsc2UgfVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmICh0byA8PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLmxlZnQuc2xpY2UoZnJvbSwgdG8pIH1cbiAgICBpZiAoZnJvbSA+PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKGZyb20gLSBsZWZ0TGVuLCB0byAtIGxlZnRMZW4pIH1cbiAgICByZXR1cm4gdGhpcy5sZWZ0LnNsaWNlKGZyb20sIGxlZnRMZW4pLmFwcGVuZCh0aGlzLnJpZ2h0LnNsaWNlKDAsIHRvIC0gbGVmdExlbikpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmQXBwZW5kID0gZnVuY3Rpb24gbGVhZkFwcGVuZCAob3RoZXIpIHtcbiAgICB2YXIgaW5uZXIgPSB0aGlzLnJpZ2h0LmxlYWZBcHBlbmQob3RoZXIpO1xuICAgIGlmIChpbm5lcikgeyByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLmxlZnQsIGlubmVyKSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIHZhciBpbm5lciA9IHRoaXMubGVmdC5sZWFmUHJlcGVuZChvdGhlcik7XG4gICAgaWYgKGlubmVyKSB7IHJldHVybiBuZXcgQXBwZW5kKGlubmVyLCB0aGlzLnJpZ2h0KSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5hcHBlbmRJbm5lciA9IGZ1bmN0aW9uIGFwcGVuZElubmVyIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlZnQuZGVwdGggPj0gTWF0aC5tYXgodGhpcy5yaWdodC5kZXB0aCwgb3RoZXIuZGVwdGgpICsgMSlcbiAgICAgIHsgcmV0dXJuIG5ldyBBcHBlbmQodGhpcy5sZWZ0LCBuZXcgQXBwZW5kKHRoaXMucmlnaHQsIG90aGVyKSkgfVxuICAgIHJldHVybiBuZXcgQXBwZW5kKHRoaXMsIG90aGVyKVxuICB9O1xuXG4gIHJldHVybiBBcHBlbmQ7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBSb3BlU2VxdWVuY2U7XG4iLCAiaW1wb3J0IFJvcGVTZXF1ZW5jZSBmcm9tICdyb3BlLXNlcXVlbmNlJztcbmltcG9ydCB7IE1hcHBpbmcgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgUGx1Z2luS2V5LCBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5cbi8vIFByb3NlTWlycm9yJ3MgaGlzdG9yeSBpc24ndCBzaW1wbHkgYSB3YXkgdG8gcm9sbCBiYWNrIHRvIGEgcHJldmlvdXNcbi8vIHN0YXRlLCBiZWNhdXNlIFByb3NlTWlycm9yIHN1cHBvcnRzIGFwcGx5aW5nIGNoYW5nZXMgd2l0aG91dCBhZGRpbmdcbi8vIHRoZW0gdG8gdGhlIGhpc3RvcnkgKGZvciBleGFtcGxlIGR1cmluZyBjb2xsYWJvcmF0aW9uKS5cbi8vXG4vLyBUbyB0aGlzIGVuZCwgZWFjaCAnQnJhbmNoJyAob25lIGZvciB0aGUgdW5kbyBoaXN0b3J5IGFuZCBvbmUgZm9yXG4vLyB0aGUgcmVkbyBoaXN0b3J5KSBrZWVwcyBhbiBhcnJheSBvZiAnSXRlbXMnLCB3aGljaCBjYW4gb3B0aW9uYWxseVxuLy8gaG9sZCBhIHN0ZXAgKGFuIGFjdHVhbCB1bmRvYWJsZSBjaGFuZ2UpLCBhbmQgYWx3YXlzIGhvbGQgYSBwb3NpdGlvblxuLy8gbWFwICh3aGljaCBpcyBuZWVkZWQgdG8gbW92ZSBjaGFuZ2VzIGJlbG93IHRoZW0gdG8gYXBwbHkgdG8gdGhlXG4vLyBjdXJyZW50IGRvY3VtZW50KS5cbi8vXG4vLyBBbiBpdGVtIHRoYXQgaGFzIGJvdGggYSBzdGVwIGFuZCBhIHNlbGVjdGlvbiBib29rbWFyayBpcyB0aGUgc3RhcnRcbi8vIG9mIGFuICdldmVudCcgXHUyMDE0IGEgZ3JvdXAgb2YgY2hhbmdlcyB0aGF0IHdpbGwgYmUgdW5kb25lIG9yIHJlZG9uZSBhdFxuLy8gb25jZS4gKEl0IHN0b3JlcyBvbmx5IHRoZSBib29rbWFyaywgc2luY2UgdGhhdCB3YXkgd2UgZG9uJ3QgaGF2ZSB0b1xuLy8gcHJvdmlkZSBhIGRvY3VtZW50IHVudGlsIHRoZSBzZWxlY3Rpb24gaXMgYWN0dWFsbHkgYXBwbGllZCwgd2hpY2hcbi8vIGlzIHVzZWZ1bCB3aGVuIGNvbXByZXNzaW5nLilcbi8vIFVzZWQgdG8gc2NoZWR1bGUgaGlzdG9yeSBjb21wcmVzc2lvblxuY29uc3QgbWF4X2VtcHR5X2l0ZW1zID0gNTAwO1xuY2xhc3MgQnJhbmNoIHtcbiAgICBjb25zdHJ1Y3RvcihpdGVtcywgZXZlbnRDb3VudCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuZXZlbnRDb3VudCA9IGV2ZW50Q291bnQ7XG4gICAgfVxuICAgIC8vIFBvcCB0aGUgbGF0ZXN0IGV2ZW50IG9mZiB0aGUgYnJhbmNoJ3MgaGlzdG9yeSBhbmQgYXBwbHkgaXRcbiAgICAvLyB0byBhIGRvY3VtZW50IHRyYW5zZm9ybS5cbiAgICBwb3BFdmVudChzdGF0ZSwgcHJlc2VydmVJdGVtcykge1xuICAgICAgICBpZiAodGhpcy5ldmVudENvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgICAgICBmb3IgKDs7IGVuZC0tKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuaXRlbXMuZ2V0KGVuZCAtIDEpO1xuICAgICAgICAgICAgaWYgKG5leHQuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLS1lbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlbWFwLCBtYXBGcm9tO1xuICAgICAgICBpZiAocHJlc2VydmVJdGVtcykge1xuICAgICAgICAgICAgcmVtYXAgPSB0aGlzLnJlbWFwcGluZyhlbmQsIHRoaXMuaXRlbXMubGVuZ3RoKTtcbiAgICAgICAgICAgIG1hcEZyb20gPSByZW1hcC5tYXBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHJhbnNmb3JtID0gc3RhdGUudHI7XG4gICAgICAgIGxldCBzZWxlY3Rpb24sIHJlbWFpbmluZztcbiAgICAgICAgbGV0IGFkZEFmdGVyID0gW10sIGFkZEJlZm9yZSA9IFtdO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZW1hcCkge1xuICAgICAgICAgICAgICAgICAgICByZW1hcCA9IHRoaXMucmVtYXBwaW5nKGVuZCwgaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBtYXBGcm9tID0gcmVtYXAubWFwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgICAgICBhZGRCZWZvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVtYXApIHtcbiAgICAgICAgICAgICAgICBhZGRCZWZvcmUucHVzaChuZXcgSXRlbShpdGVtLm1hcCkpO1xuICAgICAgICAgICAgICAgIGxldCBzdGVwID0gaXRlbS5zdGVwLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSksIG1hcDtcbiAgICAgICAgICAgICAgICBpZiAoc3RlcCAmJiB0cmFuc2Zvcm0ubWF5YmVTdGVwKHN0ZXApLmRvYykge1xuICAgICAgICAgICAgICAgICAgICBtYXAgPSB0cmFuc2Zvcm0ubWFwcGluZy5tYXBzW3RyYW5zZm9ybS5tYXBwaW5nLm1hcHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGFkZEFmdGVyLnB1c2gobmV3IEl0ZW0obWFwLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWRkQWZ0ZXIubGVuZ3RoICsgYWRkQmVmb3JlLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICAgICAgaWYgKG1hcClcbiAgICAgICAgICAgICAgICAgICAgcmVtYXAuYXBwZW5kTWFwKG1hcCwgbWFwRnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0ubWF5YmVTdGVwKGl0ZW0uc3RlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbS5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSByZW1hcCA/IGl0ZW0uc2VsZWN0aW9uLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSkgOiBpdGVtLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBuZXcgQnJhbmNoKHRoaXMuaXRlbXMuc2xpY2UoMCwgZW5kKS5hcHBlbmQoYWRkQmVmb3JlLnJldmVyc2UoKS5jb25jYXQoYWRkQWZ0ZXIpKSwgdGhpcy5ldmVudENvdW50IC0gMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLml0ZW1zLmxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiB7IHJlbWFpbmluZzogcmVtYWluaW5nLCB0cmFuc2Zvcm0sIHNlbGVjdGlvbjogc2VsZWN0aW9uIH07XG4gICAgfVxuICAgIC8vIENyZWF0ZSBhIG5ldyBicmFuY2ggd2l0aCB0aGUgZ2l2ZW4gdHJhbnNmb3JtIGFkZGVkLlxuICAgIGFkZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHNlbGVjdGlvbiwgaGlzdE9wdGlvbnMsIHByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgbGV0IG5ld0l0ZW1zID0gW10sIGV2ZW50Q291bnQgPSB0aGlzLmV2ZW50Q291bnQ7XG4gICAgICAgIGxldCBvbGRJdGVtcyA9IHRoaXMuaXRlbXMsIGxhc3RJdGVtID0gIXByZXNlcnZlSXRlbXMgJiYgb2xkSXRlbXMubGVuZ3RoID8gb2xkSXRlbXMuZ2V0KG9sZEl0ZW1zLmxlbmd0aCAtIDEpIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm0uc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGVwID0gdHJhbnNmb3JtLnN0ZXBzW2ldLmludmVydCh0cmFuc2Zvcm0uZG9jc1tpXSk7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IG5ldyBJdGVtKHRyYW5zZm9ybS5tYXBwaW5nLm1hcHNbaV0sIHN0ZXAsIHNlbGVjdGlvbiksIG1lcmdlZDtcbiAgICAgICAgICAgIGlmIChtZXJnZWQgPSBsYXN0SXRlbSAmJiBsYXN0SXRlbS5tZXJnZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBtZXJnZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGkpXG4gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW1zLnBvcCgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb2xkSXRlbXMgPSBvbGRJdGVtcy5zbGljZSgwLCBvbGRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0l0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRDb3VudCsrO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJlc2VydmVJdGVtcylcbiAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG92ZXJmbG93ID0gZXZlbnRDb3VudCAtIGhpc3RPcHRpb25zLmRlcHRoO1xuICAgICAgICBpZiAob3ZlcmZsb3cgPiBERVBUSF9PVkVSRkxPVykge1xuICAgICAgICAgICAgb2xkSXRlbXMgPSBjdXRPZmZFdmVudHMob2xkSXRlbXMsIG92ZXJmbG93KTtcbiAgICAgICAgICAgIGV2ZW50Q291bnQgLT0gb3ZlcmZsb3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBCcmFuY2gob2xkSXRlbXMuYXBwZW5kKG5ld0l0ZW1zKSwgZXZlbnRDb3VudCk7XG4gICAgfVxuICAgIHJlbWFwcGluZyhmcm9tLCB0bykge1xuICAgICAgICBsZXQgbWFwcyA9IG5ldyBNYXBwaW5nO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBtaXJyb3JQb3MgPSBpdGVtLm1pcnJvck9mZnNldCAhPSBudWxsICYmIGkgLSBpdGVtLm1pcnJvck9mZnNldCA+PSBmcm9tXG4gICAgICAgICAgICAgICAgPyBtYXBzLm1hcHMubGVuZ3RoIC0gaXRlbS5taXJyb3JPZmZzZXQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtYXBzLmFwcGVuZE1hcChpdGVtLm1hcCwgbWlycm9yUG9zKTtcbiAgICAgICAgfSwgZnJvbSwgdG8pO1xuICAgICAgICByZXR1cm4gbWFwcztcbiAgICB9XG4gICAgYWRkTWFwcyhhcnJheSkge1xuICAgICAgICBpZiAodGhpcy5ldmVudENvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBCcmFuY2godGhpcy5pdGVtcy5hcHBlbmQoYXJyYXkubWFwKG1hcCA9PiBuZXcgSXRlbShtYXApKSksIHRoaXMuZXZlbnRDb3VudCk7XG4gICAgfVxuICAgIC8vIFdoZW4gdGhlIGNvbGxhYiBtb2R1bGUgcmVjZWl2ZXMgcmVtb3RlIGNoYW5nZXMsIHRoZSBoaXN0b3J5IGhhc1xuICAgIC8vIHRvIGtub3cgYWJvdXQgdGhvc2UsIHNvIHRoYXQgaXQgY2FuIGFkanVzdCB0aGUgc3RlcHMgdGhhdCB3ZXJlXG4gICAgLy8gcmViYXNlZCBvbiB0b3Agb2YgdGhlIHJlbW90ZSBjaGFuZ2VzLCBhbmQgaW5jbHVkZSB0aGUgcG9zaXRpb25cbiAgICAvLyBtYXBzIGZvciB0aGUgcmVtb3RlIGNoYW5nZXMgaW4gaXRzIGFycmF5IG9mIGl0ZW1zLlxuICAgIHJlYmFzZWQocmViYXNlZFRyYW5zZm9ybSwgcmViYXNlZENvdW50KSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCByZWJhc2VkSXRlbXMgPSBbXSwgc3RhcnQgPSBNYXRoLm1heCgwLCB0aGlzLml0ZW1zLmxlbmd0aCAtIHJlYmFzZWRDb3VudCk7XG4gICAgICAgIGxldCBtYXBwaW5nID0gcmViYXNlZFRyYW5zZm9ybS5tYXBwaW5nO1xuICAgICAgICBsZXQgbmV3VW50aWwgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzLmxlbmd0aDtcbiAgICAgICAgbGV0IGV2ZW50Q291bnQgPSB0aGlzLmV2ZW50Q291bnQ7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHsgaWYgKGl0ZW0uc2VsZWN0aW9uKVxuICAgICAgICAgICAgZXZlbnRDb3VudC0tOyB9LCBzdGFydCk7XG4gICAgICAgIGxldCBpUmViYXNlZCA9IHJlYmFzZWRDb3VudDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcuZ2V0TWlycm9yKC0taVJlYmFzZWQpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIG5ld1VudGlsID0gTWF0aC5taW4obmV3VW50aWwsIHBvcyk7XG4gICAgICAgICAgICBsZXQgbWFwID0gbWFwcGluZy5tYXBzW3Bvc107XG4gICAgICAgICAgICBpZiAoaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzW3Bvc10uaW52ZXJ0KHJlYmFzZWRUcmFuc2Zvcm0uZG9jc1twb3NdKTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gaXRlbS5zZWxlY3Rpb24gJiYgaXRlbS5zZWxlY3Rpb24ubWFwKG1hcHBpbmcuc2xpY2UoaVJlYmFzZWQgKyAxLCBwb3MpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICBldmVudENvdW50Kys7XG4gICAgICAgICAgICAgICAgcmViYXNlZEl0ZW1zLnB1c2gobmV3IEl0ZW0obWFwLCBzdGVwLCBzZWxlY3Rpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlYmFzZWRJdGVtcy5wdXNoKG5ldyBJdGVtKG1hcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBzdGFydCk7XG4gICAgICAgIGxldCBuZXdNYXBzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSByZWJhc2VkQ291bnQ7IGkgPCBuZXdVbnRpbDsgaSsrKVxuICAgICAgICAgICAgbmV3TWFwcy5wdXNoKG5ldyBJdGVtKG1hcHBpbmcubWFwc1tpXSkpO1xuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHN0YXJ0KS5hcHBlbmQobmV3TWFwcykuYXBwZW5kKHJlYmFzZWRJdGVtcyk7XG4gICAgICAgIGxldCBicmFuY2ggPSBuZXcgQnJhbmNoKGl0ZW1zLCBldmVudENvdW50KTtcbiAgICAgICAgaWYgKGJyYW5jaC5lbXB0eUl0ZW1Db3VudCgpID4gbWF4X2VtcHR5X2l0ZW1zKVxuICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoLmNvbXByZXNzKHRoaXMuaXRlbXMubGVuZ3RoIC0gcmViYXNlZEl0ZW1zLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBicmFuY2g7XG4gICAgfVxuICAgIGVtcHR5SXRlbUNvdW50KCkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7IGlmICghaXRlbS5zdGVwKVxuICAgICAgICAgICAgY291bnQrKzsgfSk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gICAgLy8gQ29tcHJlc3NpbmcgYSBicmFuY2ggbWVhbnMgcmV3cml0aW5nIGl0IHRvIHB1c2ggdGhlIGFpciAobWFwLW9ubHlcbiAgICAvLyBpdGVtcykgb3V0LiBEdXJpbmcgY29sbGFib3JhdGlvbiwgdGhlc2UgbmF0dXJhbGx5IGFjY3VtdWxhdGVcbiAgICAvLyBiZWNhdXNlIGVhY2ggcmVtb3RlIGNoYW5nZSBhZGRzIG9uZS4gVGhlIGB1cHRvYCBhcmd1bWVudCBpcyB1c2VkXG4gICAgLy8gdG8gZW5zdXJlIHRoYXQgb25seSB0aGUgaXRlbXMgYmVsb3cgYSBnaXZlbiBsZXZlbCBhcmUgY29tcHJlc3NlZCxcbiAgICAvLyBiZWNhdXNlIGByZWJhc2VkYCByZWxpZXMgb24gYSBjbGVhbiwgdW50b3VjaGVkIHNldCBvZiBpdGVtcyBpblxuICAgIC8vIG9yZGVyIHRvIGFzc29jaWF0ZSBvbGQgaXRlbXMgd2l0aCByZWJhc2VkIHN0ZXBzLlxuICAgIGNvbXByZXNzKHVwdG8gPSB0aGlzLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICBsZXQgcmVtYXAgPSB0aGlzLnJlbWFwcGluZygwLCB1cHRvKSwgbWFwRnJvbSA9IHJlbWFwLm1hcHMubGVuZ3RoO1xuICAgICAgICBsZXQgaXRlbXMgPSBbXSwgZXZlbnRzID0gMDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA+PSB1cHRvKSB7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5zZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSBpdGVtLnN0ZXAubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKSwgbWFwID0gc3RlcCAmJiBzdGVwLmdldE1hcCgpO1xuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgICAgICBpZiAobWFwKVxuICAgICAgICAgICAgICAgICAgICByZW1hcC5hcHBlbmRNYXAobWFwLCBtYXBGcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gaXRlbS5zZWxlY3Rpb24gJiYgaXRlbS5zZWxlY3Rpb24ubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cysrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SXRlbSA9IG5ldyBJdGVtKG1hcC5pbnZlcnQoKSwgc3RlcCwgc2VsZWN0aW9uKSwgbWVyZ2VkLCBsYXN0ID0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZCA9IGl0ZW1zLmxlbmd0aCAmJiBpdGVtc1tsYXN0XS5tZXJnZShuZXdJdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2xhc3RdID0gbWVyZ2VkO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0ubWFwKSB7XG4gICAgICAgICAgICAgICAgbWFwRnJvbS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLml0ZW1zLmxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiBuZXcgQnJhbmNoKFJvcGVTZXF1ZW5jZS5mcm9tKGl0ZW1zLnJldmVyc2UoKSksIGV2ZW50cyk7XG4gICAgfVxufVxuQnJhbmNoLmVtcHR5ID0gbmV3IEJyYW5jaChSb3BlU2VxdWVuY2UuZW1wdHksIDApO1xuZnVuY3Rpb24gY3V0T2ZmRXZlbnRzKGl0ZW1zLCBuKSB7XG4gICAgbGV0IGN1dFBvaW50O1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0aW9uICYmIChuLS0gPT0gMCkpIHtcbiAgICAgICAgICAgIGN1dFBvaW50ID0gaTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpdGVtcy5zbGljZShjdXRQb2ludCk7XG59XG5jbGFzcyBJdGVtIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBUaGUgKGZvcndhcmQpIHN0ZXAgbWFwIGZvciB0aGlzIGl0ZW0uXG4gICAgbWFwLCBcbiAgICAvLyBUaGUgaW52ZXJ0ZWQgc3RlcFxuICAgIHN0ZXAsIFxuICAgIC8vIElmIHRoaXMgaXMgbm9uLW51bGwsIHRoaXMgaXRlbSBpcyB0aGUgc3RhcnQgb2YgYSBncm91cCwgYW5kXG4gICAgLy8gdGhpcyBzZWxlY3Rpb24gaXMgdGhlIHN0YXJ0aW5nIHNlbGVjdGlvbiBmb3IgdGhlIGdyb3VwICh0aGUgb25lXG4gICAgLy8gdGhhdCB3YXMgYWN0aXZlIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcCB3YXMgYXBwbGllZClcbiAgICBzZWxlY3Rpb24sIFxuICAgIC8vIElmIHRoaXMgaXRlbSBpcyB0aGUgaW52ZXJzZSBvZiBhIHByZXZpb3VzIG1hcHBpbmcgb24gdGhlIHN0YWNrLFxuICAgIC8vIHRoaXMgcG9pbnRzIGF0IHRoZSBpbnZlcnNlJ3Mgb2Zmc2V0XG4gICAgbWlycm9yT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLnN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5taXJyb3JPZmZzZXQgPSBtaXJyb3JPZmZzZXQ7XG4gICAgfVxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnN0ZXAgJiYgb3RoZXIuc3RlcCAmJiAhb3RoZXIuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgc3RlcCA9IG90aGVyLnN0ZXAubWVyZ2UodGhpcy5zdGVwKTtcbiAgICAgICAgICAgIGlmIChzdGVwKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlbShzdGVwLmdldE1hcCgpLmludmVydCgpLCBzdGVwLCB0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBUaGUgdmFsdWUgb2YgdGhlIHN0YXRlIGZpZWxkIHRoYXQgdHJhY2tzIHVuZG8vcmVkbyBoaXN0b3J5IGZvciB0aGF0XG4vLyBzdGF0ZS4gV2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBsdWdpbiBzdGF0ZSB3aGVuIHRoZSBoaXN0b3J5IHBsdWdpblxuLy8gaXMgYWN0aXZlLlxuY2xhc3MgSGlzdG9yeVN0YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcihkb25lLCB1bmRvbmUsIHByZXZSYW5nZXMsIHByZXZUaW1lLCBwcmV2Q29tcG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5kb25lID0gZG9uZTtcbiAgICAgICAgdGhpcy51bmRvbmUgPSB1bmRvbmU7XG4gICAgICAgIHRoaXMucHJldlJhbmdlcyA9IHByZXZSYW5nZXM7XG4gICAgICAgIHRoaXMucHJldlRpbWUgPSBwcmV2VGltZTtcbiAgICAgICAgdGhpcy5wcmV2Q29tcG9zaXRpb24gPSBwcmV2Q29tcG9zaXRpb247XG4gICAgfVxufVxuY29uc3QgREVQVEhfT1ZFUkZMT1cgPSAyMDtcbi8vIFJlY29yZCBhIHRyYW5zZm9ybWF0aW9uIGluIHVuZG8gaGlzdG9yeS5cbmZ1bmN0aW9uIGFwcGx5VHJhbnNhY3Rpb24oaGlzdG9yeSwgc3RhdGUsIHRyLCBvcHRpb25zKSB7XG4gICAgbGV0IGhpc3RvcnlUciA9IHRyLmdldE1ldGEoaGlzdG9yeUtleSksIHJlYmFzZWQ7XG4gICAgaWYgKGhpc3RvcnlUcilcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlUci5oaXN0b3J5U3RhdGU7XG4gICAgaWYgKHRyLmdldE1ldGEoY2xvc2VIaXN0b3J5S2V5KSlcbiAgICAgICAgaGlzdG9yeSA9IG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLCBoaXN0b3J5LnVuZG9uZSwgbnVsbCwgMCwgLTEpO1xuICAgIGxldCBhcHBlbmRlZCA9IHRyLmdldE1ldGEoXCJhcHBlbmRlZFRyYW5zYWN0aW9uXCIpO1xuICAgIGlmICh0ci5zdGVwcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXBwZW5kZWQgJiYgYXBwZW5kZWQuZ2V0TWV0YShoaXN0b3J5S2V5KSkge1xuICAgICAgICBpZiAoYXBwZW5kZWQuZ2V0TWV0YShoaXN0b3J5S2V5KS5yZWRvKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLmFkZFRyYW5zZm9ybSh0ciwgdW5kZWZpbmVkLCBvcHRpb25zLCBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSkpLCBoaXN0b3J5LnVuZG9uZSwgcmFuZ2VzRm9yKHRyLm1hcHBpbmcubWFwc1t0ci5zdGVwcy5sZW5ndGggLSAxXSksIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLCBoaXN0b3J5LnVuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIHVuZGVmaW5lZCwgb3B0aW9ucywgbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpKSwgbnVsbCwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0ci5nZXRNZXRhKFwiYWRkVG9IaXN0b3J5XCIpICE9PSBmYWxzZSAmJiAhKGFwcGVuZGVkICYmIGFwcGVuZGVkLmdldE1ldGEoXCJhZGRUb0hpc3RvcnlcIikgPT09IGZhbHNlKSkge1xuICAgICAgICAvLyBHcm91cCB0cmFuc2Zvcm1zIHRoYXQgb2NjdXIgaW4gcXVpY2sgc3VjY2Vzc2lvbiBpbnRvIG9uZSBldmVudC5cbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gdHIuZ2V0TWV0YShcImNvbXBvc2l0aW9uXCIpO1xuICAgICAgICBsZXQgbmV3R3JvdXAgPSBoaXN0b3J5LnByZXZUaW1lID09IDAgfHxcbiAgICAgICAgICAgICghYXBwZW5kZWQgJiYgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24gIT0gY29tcG9zaXRpb24gJiZcbiAgICAgICAgICAgICAgICAoaGlzdG9yeS5wcmV2VGltZSA8ICh0ci50aW1lIHx8IDApIC0gb3B0aW9ucy5uZXdHcm91cERlbGF5IHx8ICFpc0FkamFjZW50VG8odHIsIGhpc3RvcnkucHJldlJhbmdlcykpKTtcbiAgICAgICAgbGV0IHByZXZSYW5nZXMgPSBhcHBlbmRlZCA/IG1hcFJhbmdlcyhoaXN0b3J5LnByZXZSYW5nZXMsIHRyLm1hcHBpbmcpIDogcmFuZ2VzRm9yKHRyLm1hcHBpbmcubWFwc1t0ci5zdGVwcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIG5ld0dyb3VwID8gc3RhdGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCkgOiB1bmRlZmluZWQsIG9wdGlvbnMsIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSksIEJyYW5jaC5lbXB0eSwgcHJldlJhbmdlcywgdHIudGltZSwgY29tcG9zaXRpb24gPT0gbnVsbCA/IGhpc3RvcnkucHJldkNvbXBvc2l0aW9uIDogY29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZWJhc2VkID0gdHIuZ2V0TWV0YShcInJlYmFzZWRcIikpIHtcbiAgICAgICAgLy8gVXNlZCBieSB0aGUgY29sbGFiIG1vZHVsZSB0byB0ZWxsIHRoZSBoaXN0b3J5IHRoYXQgc29tZSBvZiBpdHNcbiAgICAgICAgLy8gY29udGVudCBoYXMgYmVlbiByZWJhc2VkLlxuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUucmViYXNlZCh0ciwgcmViYXNlZCksIGhpc3RvcnkudW5kb25lLnJlYmFzZWQodHIsIHJlYmFzZWQpLCBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLmFkZE1hcHModHIubWFwcGluZy5tYXBzKSwgaGlzdG9yeS51bmRvbmUuYWRkTWFwcyh0ci5tYXBwaW5nLm1hcHMpLCBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQWRqYWNlbnRUbyh0cmFuc2Zvcm0sIHByZXZSYW5nZXMpIHtcbiAgICBpZiAoIXByZXZSYW5nZXMpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRyYW5zZm9ybS5kb2NDaGFuZ2VkKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgYWRqYWNlbnQgPSBmYWxzZTtcbiAgICB0cmFuc2Zvcm0ubWFwcGluZy5tYXBzWzBdLmZvckVhY2goKHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2UmFuZ2VzLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IHByZXZSYW5nZXNbaSArIDFdICYmIGVuZCA+PSBwcmV2UmFuZ2VzW2ldKVxuICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWRqYWNlbnQ7XG59XG5mdW5jdGlvbiByYW5nZXNGb3IobWFwKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIG1hcC5mb3JFYWNoKChfZnJvbSwgX3RvLCBmcm9tLCB0bykgPT4gcmVzdWx0LnB1c2goZnJvbSwgdG8pKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFwUmFuZ2VzKHJhbmdlcywgbWFwcGluZykge1xuICAgIGlmICghcmFuZ2VzKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcChyYW5nZXNbaV0sIDEpLCB0byA9IG1hcHBpbmcubWFwKHJhbmdlc1tpICsgMV0sIC0xKTtcbiAgICAgICAgaWYgKGZyb20gPD0gdG8pXG4gICAgICAgICAgICByZXN1bHQucHVzaChmcm9tLCB0byk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBBcHBseSB0aGUgbGF0ZXN0IGV2ZW50IGZyb20gb25lIGJyYW5jaCB0byB0aGUgZG9jdW1lbnQgYW5kIHNoaWZ0IHRoZSBldmVudFxuLy8gb250byB0aGUgb3RoZXIgYnJhbmNoLlxuZnVuY3Rpb24gaGlzdFRyYW5zYWN0aW9uKGhpc3RvcnksIHN0YXRlLCBkaXNwYXRjaCwgcmVkbykge1xuICAgIGxldCBwcmVzZXJ2ZUl0ZW1zID0gbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpO1xuICAgIGxldCBoaXN0T3B0aW9ucyA9IGhpc3RvcnlLZXkuZ2V0KHN0YXRlKS5zcGVjLmNvbmZpZztcbiAgICBsZXQgcG9wID0gKHJlZG8gPyBoaXN0b3J5LnVuZG9uZSA6IGhpc3RvcnkuZG9uZSkucG9wRXZlbnQoc3RhdGUsIHByZXNlcnZlSXRlbXMpO1xuICAgIGlmICghcG9wKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHNlbGVjdGlvbiA9IHBvcC5zZWxlY3Rpb24ucmVzb2x2ZShwb3AudHJhbnNmb3JtLmRvYyk7XG4gICAgbGV0IGFkZGVkID0gKHJlZG8gPyBoaXN0b3J5LmRvbmUgOiBoaXN0b3J5LnVuZG9uZSkuYWRkVHJhbnNmb3JtKHBvcC50cmFuc2Zvcm0sIHN0YXRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpLCBoaXN0T3B0aW9ucywgcHJlc2VydmVJdGVtcyk7XG4gICAgbGV0IG5ld0hpc3QgPSBuZXcgSGlzdG9yeVN0YXRlKHJlZG8gPyBhZGRlZCA6IHBvcC5yZW1haW5pbmcsIHJlZG8gPyBwb3AucmVtYWluaW5nIDogYWRkZWQsIG51bGwsIDAsIC0xKTtcbiAgICBkaXNwYXRjaChwb3AudHJhbnNmb3JtLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pLnNldE1ldGEoaGlzdG9yeUtleSwgeyByZWRvLCBoaXN0b3J5U3RhdGU6IG5ld0hpc3QgfSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG59XG5sZXQgY2FjaGVkUHJlc2VydmVJdGVtcyA9IGZhbHNlLCBjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyA9IG51bGw7XG4vLyBDaGVjayB3aGV0aGVyIGFueSBwbHVnaW4gaW4gdGhlIGdpdmVuIHN0YXRlIGhhcyBhXG4vLyBgaGlzdG9yeVByZXNlcnZlSXRlbXNgIHByb3BlcnR5IGluIGl0cyBzcGVjLCBpbiB3aGljaCBjYXNlIHdlIG11c3Rcbi8vIHByZXNlcnZlIHN0ZXBzIGV4YWN0bHkgYXMgdGhleSBjYW1lIGluLCBzbyB0aGF0IHRoZXkgY2FuIGJlXG4vLyByZWJhc2VkLlxuZnVuY3Rpb24gbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpIHtcbiAgICBsZXQgcGx1Z2lucyA9IHN0YXRlLnBsdWdpbnM7XG4gICAgaWYgKGNhY2hlZFByZXNlcnZlSXRlbXNQbHVnaW5zICE9IHBsdWdpbnMpIHtcbiAgICAgICAgY2FjaGVkUHJlc2VydmVJdGVtcyA9IGZhbHNlO1xuICAgICAgICBjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyA9IHBsdWdpbnM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChwbHVnaW5zW2ldLnNwZWMuaGlzdG9yeVByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgICAgICAgICBjYWNoZWRQcmVzZXJ2ZUl0ZW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZFByZXNlcnZlSXRlbXM7XG59XG4vKipcblNldCBhIGZsYWcgb24gdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHRoYXQgd2lsbCBwcmV2ZW50IGZ1cnRoZXIgc3RlcHNcbmZyb20gYmVpbmcgYXBwZW5kZWQgdG8gYW4gZXhpc3RpbmcgaGlzdG9yeSBldmVudCAoc28gdGhhdCB0aGV5XG5yZXF1aXJlIGEgc2VwYXJhdGUgdW5kbyBjb21tYW5kIHRvIHVuZG8pLlxuKi9cbmZ1bmN0aW9uIGNsb3NlSGlzdG9yeSh0cikge1xuICAgIHJldHVybiB0ci5zZXRNZXRhKGNsb3NlSGlzdG9yeUtleSwgdHJ1ZSk7XG59XG5jb25zdCBoaXN0b3J5S2V5ID0gbmV3IFBsdWdpbktleShcImhpc3RvcnlcIik7XG5jb25zdCBjbG9zZUhpc3RvcnlLZXkgPSBuZXcgUGx1Z2luS2V5KFwiY2xvc2VIaXN0b3J5XCIpO1xuLyoqXG5SZXR1cm5zIGEgcGx1Z2luIHRoYXQgZW5hYmxlcyB0aGUgdW5kbyBoaXN0b3J5IGZvciBhbiBlZGl0b3IuIFRoZVxucGx1Z2luIHdpbGwgdHJhY2sgdW5kbyBhbmQgcmVkbyBzdGFja3MsIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlXG5bYHVuZG9gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jaGlzdG9yeS51bmRvKSBhbmQgW2ByZWRvYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2hpc3RvcnkucmVkbykgY29tbWFuZHMuXG5cbllvdSBjYW4gc2V0IGFuIGBcImFkZFRvSGlzdG9yeVwiYCBbbWV0YWRhdGFcbnByb3BlcnR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2V0TWV0YSkgb2YgYGZhbHNlYCBvbiBhIHRyYW5zYWN0aW9uXG50byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcm9sbGVkIGJhY2sgYnkgdW5kby5cbiovXG5mdW5jdGlvbiBoaXN0b3J5KGNvbmZpZyA9IHt9KSB7XG4gICAgY29uZmlnID0geyBkZXB0aDogY29uZmlnLmRlcHRoIHx8IDEwMCxcbiAgICAgICAgbmV3R3JvdXBEZWxheTogY29uZmlnLm5ld0dyb3VwRGVsYXkgfHwgNTAwIH07XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgICAgICBrZXk6IGhpc3RvcnlLZXksXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKEJyYW5jaC5lbXB0eSwgQnJhbmNoLmVtcHR5LCBudWxsLCAwLCAtMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwbHkodHIsIGhpc3QsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIHRyLCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgICAgICAgICBiZWZvcmVpbnB1dCh2aWV3LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFR5cGUgPSBlLmlucHV0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSBpbnB1dFR5cGUgPT0gXCJoaXN0b3J5VW5kb1wiID8gdW5kbyA6IGlucHV0VHlwZSA9PSBcImhpc3RvcnlSZWRvXCIgPyByZWRvIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21tYW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kKHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB1bmRvZXMgdGhlIGxhc3QgY2hhbmdlLCBpZiBhbnkuXG4qL1xuY29uc3QgdW5kbyA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgIGlmICghaGlzdCB8fCBoaXN0LmRvbmUuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBoaXN0VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIGRpc3BhdGNoLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCByZWRvZXMgdGhlIGxhc3QgdW5kb25lIGNoYW5nZSwgaWYgYW55LlxuKi9cbmNvbnN0IHJlZG8gPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IGhpc3QgPSBoaXN0b3J5S2V5LmdldFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIWhpc3QgfHwgaGlzdC51bmRvbmUuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBoaXN0VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIGRpc3BhdGNoLCB0cnVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcblRoZSBhbW91bnQgb2YgdW5kb2FibGUgZXZlbnRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIHVuZG9EZXB0aChzdGF0ZSkge1xuICAgIGxldCBoaXN0ID0gaGlzdG9yeUtleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgcmV0dXJuIGhpc3QgPyBoaXN0LmRvbmUuZXZlbnRDb3VudCA6IDA7XG59XG4vKipcblRoZSBhbW91bnQgb2YgcmVkb2FibGUgZXZlbnRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGVkaXRvciBzdGF0ZS5cbiovXG5mdW5jdGlvbiByZWRvRGVwdGgoc3RhdGUpIHtcbiAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgIHJldHVybiBoaXN0ID8gaGlzdC51bmRvbmUuZXZlbnRDb3VudCA6IDA7XG59XG5cbmV4cG9ydCB7IGNsb3NlSGlzdG9yeSwgaGlzdG9yeSwgcmVkbywgcmVkb0RlcHRoLCB1bmRvLCB1bmRvRGVwdGggfTtcbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBoaXN0b3J5LCByZWRvLCB1bmRvIH0gZnJvbSAnQHRpcHRhcC9wbS9oaXN0b3J5J1xuXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlPcHRpb25zIHtcbiAgZGVwdGg6IG51bWJlcixcbiAgbmV3R3JvdXBEZWxheTogbnVtYmVyLFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaGlzdG9yeToge1xuICAgICAgLyoqXG4gICAgICAgKiBVbmRvIHJlY2VudCBjaGFuZ2VzXG4gICAgICAgKi9cbiAgICAgIHVuZG86ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFJlYXBwbHkgcmV2ZXJ0ZWQgY2hhbmdlc1xuICAgICAgICovXG4gICAgICByZWRvOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSGlzdG9yeSA9IEV4dGVuc2lvbi5jcmVhdGU8SGlzdG9yeU9wdGlvbnM+KHtcbiAgbmFtZTogJ2hpc3RvcnknLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcHRoOiAxMDAsXG4gICAgICBuZXdHcm91cERlbGF5OiA1MDAsXG4gICAgfVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1bmRvOiAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICByZXR1cm4gdW5kbyhzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICB9LFxuICAgICAgcmVkbzogKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZG8oc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgIHJldHVybiBbXG4gICAgICBoaXN0b3J5KHRoaXMub3B0aW9ucyksXG4gICAgXVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLXonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy51bmRvKCksXG4gICAgICAnTW9kLVonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy51bmRvKCksXG4gICAgICAnTW9kLXknOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgICAnTW9kLVknOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgICAnU2hpZnQtTW9kLXonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgICAnU2hpZnQtTW9kLVonOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG5cbiAgICAgIC8vIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0c1xuICAgICAgJ01vZC3Rjyc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnVuZG8oKSxcbiAgICAgICdTaGlmdC1Nb2Qt0Y8nOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5yZWRvKCksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUsIG5vZGVJbnB1dFJ1bGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBOb2RlU2VsZWN0aW9uLCBUZXh0U2VsZWN0aW9uIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcblxuZXhwb3J0IGludGVyZmFjZSBIb3Jpem9udGFsUnVsZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PlxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaG9yaXpvbnRhbFJ1bGU6IHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgaG9yaXpvbnRhbCBydWxlXG4gICAgICAgKi9cbiAgICAgIHNldEhvcml6b250YWxSdWxlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBIb3Jpem9udGFsUnVsZSA9IE5vZGUuY3JlYXRlPEhvcml6b250YWxSdWxlT3B0aW9ucz4oe1xuICBuYW1lOiAnaG9yaXpvbnRhbFJ1bGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgZ3JvdXA6ICdibG9jaycsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbeyB0YWc6ICdocicgfV1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2hyJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRIb3Jpem9udGFsUnVsZTpcbiAgICAgICAgKCkgPT4gKHsgY2hhaW4sIHN0YXRlIH0pID0+IHtcbiAgICAgICAgICBjb25zdCB7ICR0bzogJG9yaWdpblRvIH0gPSBzdGF0ZS5zZWxlY3Rpb25cblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFpbiA9IGNoYWluKClcblxuICAgICAgICAgIGlmICgkb3JpZ2luVG8ucGFyZW50T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KE1hdGgubWF4KCRvcmlnaW5Uby5wb3MgLSAyLCAwKSwgeyB0eXBlOiB0aGlzLm5hbWUgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudENoYWluLmluc2VydENvbnRlbnQoeyB0eXBlOiB0aGlzLm5hbWUgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY3VycmVudENoYWluXG4gICAgICAgICAgICAgIC8vIHNldCBjdXJzb3IgYWZ0ZXIgaG9yaXpvbnRhbCBydWxlXG4gICAgICAgICAgICAgIC5jb21tYW5kKCh7IHRyLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB7ICR0byB9ID0gdHIuc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICBjb25zdCBwb3NBZnRlciA9ICR0by5lbmQoKVxuXG4gICAgICAgICAgICAgICAgICBpZiAoJHRvLm5vZGVBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHRvLm5vZGVBZnRlci5pc1RleHRibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsICR0by5wb3MgKyAxKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkdG8ubm9kZUFmdGVyLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCAkdG8ucG9zKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCAkdG8ucG9zKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5vZGUgYWZ0ZXIgaG9yaXpvbnRhbCBydWxlIGlmIGl04oCZcyB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gJHRvLnBhcmVudC50eXBlLmNvbnRlbnRNYXRjaC5kZWZhdWx0VHlwZT8uY3JlYXRlKClcblxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRyLmluc2VydChwb3NBZnRlciwgbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBwb3NBZnRlciArIDEpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHRyLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucnVuKClcbiAgICAgICAgICApXG4gICAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG5vZGVJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiAvXig/Oi0tLXzigJQtfF9fX1xcc3xcXCpcXCpcXCpcXHMpJC8sXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgTWFyayxcbiAgbWFya0lucHV0UnVsZSxcbiAgbWFya1Bhc3RlUnVsZSxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRhbGljT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaXRhbGljOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNldCBhbiBpdGFsaWMgbWFya1xuICAgICAgICovXG4gICAgICBzZXRJdGFsaWM6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhbiBpdGFsaWMgbWFya1xuICAgICAgICovXG4gICAgICB0b2dnbGVJdGFsaWM6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFVuc2V0IGFuIGl0YWxpYyBtYXJrXG4gICAgICAgKi9cbiAgICAgIHVuc2V0SXRhbGljOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3RhcklucHV0UmVnZXggPSAvKD86XnxcXHMpKCg/OlxcKikoKD86W14qXSspKSg/OlxcKikpJC9cbmV4cG9ydCBjb25zdCBzdGFyUGFzdGVSZWdleCA9IC8oPzpefFxccykoKD86XFwqKSgoPzpbXipdKykpKD86XFwqKSkvZ1xuZXhwb3J0IGNvbnN0IHVuZGVyc2NvcmVJbnB1dFJlZ2V4ID0gLyg/Ol58XFxzKSgoPzpfKSgoPzpbXl9dKykpKD86XykpJC9cbmV4cG9ydCBjb25zdCB1bmRlcnNjb3JlUGFzdGVSZWdleCA9IC8oPzpefFxccykoKD86XykoKD86W15fXSspKSg/Ol8pKS9nXG5cbmV4cG9ydCBjb25zdCBJdGFsaWMgPSBNYXJrLmNyZWF0ZTxJdGFsaWNPcHRpb25zPih7XG4gIG5hbWU6ICdpdGFsaWMnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2VtJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2knLFxuICAgICAgICBnZXRBdHRyczogbm9kZSA9PiAobm9kZSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZm9udFN0eWxlICE9PSAnbm9ybWFsJyAmJiBudWxsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3R5bGU6ICdmb250LXN0eWxlPWl0YWxpYycsXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2VtJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRJdGFsaWM6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUl0YWxpYzogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRJdGFsaWM6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC1pJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlSXRhbGljKCksXG4gICAgICAnTW9kLUknOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVJdGFsaWMoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IHN0YXJJbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICAgIG1hcmtJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiB1bmRlcnNjb3JlSW5wdXRSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxuXG4gIGFkZFBhc3RlUnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hcmtQYXN0ZVJ1bGUoe1xuICAgICAgICBmaW5kOiBzdGFyUGFzdGVSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgICBtYXJrUGFzdGVSdWxlKHtcbiAgICAgICAgZmluZDogdW5kZXJzY29yZVBhc3RlUmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBidWxsZXRMaXN0VHlwZU5hbWU6IHN0cmluZ1xuICBvcmRlcmVkTGlzdFR5cGVOYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IExpc3RJdGVtID0gTm9kZS5jcmVhdGU8TGlzdEl0ZW1PcHRpb25zPih7XG4gIG5hbWU6ICdsaXN0SXRlbScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYnVsbGV0TGlzdFR5cGVOYW1lOiAnYnVsbGV0TGlzdCcsXG4gICAgICBvcmRlcmVkTGlzdFR5cGVOYW1lOiAnb3JkZXJlZExpc3QnLFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAncGFyYWdyYXBoIGJsb2NrKicsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2xpJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnbGknLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEVudGVyOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zcGxpdExpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgICBUYWI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNpbmtMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgICAgJ1NoaWZ0LVRhYic6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmxpZnRMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBidWxsZXRMaXN0VHlwZU5hbWU6IHN0cmluZ1xuICBvcmRlcmVkTGlzdFR5cGVOYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IExpc3RJdGVtID0gTm9kZS5jcmVhdGU8TGlzdEl0ZW1PcHRpb25zPih7XG4gIG5hbWU6ICdsaXN0SXRlbScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYnVsbGV0TGlzdFR5cGVOYW1lOiAnYnVsbGV0TGlzdCcsXG4gICAgICBvcmRlcmVkTGlzdFR5cGVOYW1lOiAnb3JkZXJlZExpc3QnLFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAncGFyYWdyYXBoIGJsb2NrKicsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2xpJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnbGknLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEVudGVyOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zcGxpdExpc3RJdGVtKHRoaXMubmFtZSksXG4gICAgICBUYWI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNpbmtMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgICAgJ1NoaWZ0LVRhYic6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmxpZnRMaXN0SXRlbSh0aGlzLm5hbWUpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgZ2V0TWFya0F0dHJpYnV0ZXMsXG4gIE1hcmssXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRleHRTdHlsZU9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRleHRTdHlsZToge1xuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgc3BhbnMgd2l0aG91dCBpbmxpbmUgc3R5bGUgYXR0cmlidXRlcy5cbiAgICAgICAqL1xuICAgICAgcmVtb3ZlRW1wdHlUZXh0U3R5bGU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUZXh0U3R5bGUgPSBNYXJrLmNyZWF0ZTxUZXh0U3R5bGVPcHRpb25zPih7XG4gIG5hbWU6ICd0ZXh0U3R5bGUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ3NwYW4nLFxuICAgICAgICBnZXRBdHRyczogZWxlbWVudCA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzU3R5bGVzID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKVxuXG4gICAgICAgICAgaWYgKCFoYXNTdHlsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzcGFuJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZW1vdmVFbXB0eVRleHRTdHlsZTogKCkgPT4gKHsgc3RhdGUsIGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdldE1hcmtBdHRyaWJ1dGVzKHN0YXRlLCB0aGlzLnR5cGUpXG4gICAgICAgIGNvbnN0IGhhc1N0eWxlcyA9IE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpLnNvbWUoKFssIHZhbHVlXSkgPT4gISF2YWx1ZSlcblxuICAgICAgICBpZiAoaGFzU3R5bGVzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbn0pXG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlLCB3cmFwcGluZ0lucHV0UnVsZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuaW1wb3J0IExpc3RJdGVtIGZyb20gJy4uLy4uL2V4dGVuc2lvbi1saXN0LWl0ZW0vc3JjL2luZGV4LmpzJ1xuaW1wb3J0IFRleHRTdHlsZSBmcm9tICcuLi8uLi9leHRlbnNpb24tdGV4dC1zdHlsZS9zcmMvaW5kZXguanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JkZXJlZExpc3RPcHRpb25zIHtcbiAgaXRlbVR5cGVOYW1lOiBzdHJpbmcsXG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBrZWVwTWFya3M6IGJvb2xlYW4sXG4gIGtlZXBBdHRyaWJ1dGVzOiBib29sZWFuLFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgb3JkZXJlZExpc3Q6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGFuIG9yZGVyZWQgbGlzdFxuICAgICAgICovXG4gICAgICB0b2dnbGVPcmRlcmVkTGlzdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlucHV0UmVnZXggPSAvXihcXGQrKVxcLlxccyQvXG5cbmV4cG9ydCBjb25zdCBPcmRlcmVkTGlzdCA9IE5vZGUuY3JlYXRlPE9yZGVyZWRMaXN0T3B0aW9ucz4oe1xuICBuYW1lOiAnb3JkZXJlZExpc3QnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1UeXBlTmFtZTogJ2xpc3RJdGVtJyxcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGtlZXBNYXJrczogZmFsc2UsXG4gICAgICBrZWVwQXR0cmlidXRlczogZmFsc2UsXG4gICAgfVxuICB9LFxuXG4gIGdyb3VwOiAnYmxvY2sgbGlzdCcsXG5cbiAgY29udGVudCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLml0ZW1UeXBlTmFtZX0rYFxuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdzdGFydCcpXG4gICAgICAgICAgICA/IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdGFydCcpIHx8ICcnLCAxMClcbiAgICAgICAgICAgIDogMVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ29sJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgY29uc3QgeyBzdGFydCwgLi4uYXR0cmlidXRlc1dpdGhvdXRTdGFydCB9ID0gSFRNTEF0dHJpYnV0ZXNcblxuICAgIHJldHVybiBzdGFydCA9PT0gMVxuICAgICAgPyBbJ29sJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgYXR0cmlidXRlc1dpdGhvdXRTdGFydCksIDBdXG4gICAgICA6IFsnb2wnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvZ2dsZU9yZGVyZWRMaXN0OiAoKSA9PiAoeyBjb21tYW5kcywgY2hhaW4gfSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmtlZXBBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKCkudG9nZ2xlTGlzdCh0aGlzLm5hbWUsIHRoaXMub3B0aW9ucy5pdGVtVHlwZU5hbWUsIHRoaXMub3B0aW9ucy5rZWVwTWFya3MpLnVwZGF0ZUF0dHJpYnV0ZXMoTGlzdEl0ZW0ubmFtZSwgdGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhUZXh0U3R5bGUubmFtZSkpLnJ1bigpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZUxpc3QodGhpcy5uYW1lLCB0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lLCB0aGlzLm9wdGlvbnMua2VlcE1hcmtzKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtU2hpZnQtNyc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZU9yZGVyZWRMaXN0KCksXG4gICAgfVxuICB9LFxuXG4gIGFkZElucHV0UnVsZXMoKSB7XG4gICAgbGV0IGlucHV0UnVsZSA9IHdyYXBwaW5nSW5wdXRSdWxlKHtcbiAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBnZXRBdHRyaWJ1dGVzOiBtYXRjaCA9PiAoeyBzdGFydDogK21hdGNoWzFdIH0pLFxuICAgICAgam9pblByZWRpY2F0ZTogKG1hdGNoLCBub2RlKSA9PiBub2RlLmNoaWxkQ291bnQgKyBub2RlLmF0dHJzLnN0YXJ0ID09PSArbWF0Y2hbMV0sXG4gICAgfSlcblxuICAgIGlmICh0aGlzLm9wdGlvbnMua2VlcE1hcmtzIHx8IHRoaXMub3B0aW9ucy5rZWVwQXR0cmlidXRlcykge1xuICAgICAgaW5wdXRSdWxlID0gd3JhcHBpbmdJbnB1dFJ1bGUoe1xuICAgICAgICBmaW5kOiBpbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGtlZXBNYXJrczogdGhpcy5vcHRpb25zLmtlZXBNYXJrcyxcbiAgICAgICAga2VlcEF0dHJpYnV0ZXM6IHRoaXMub3B0aW9ucy5rZWVwQXR0cmlidXRlcyxcbiAgICAgICAgZ2V0QXR0cmlidXRlczogbWF0Y2ggPT4gKHsgc3RhcnQ6ICttYXRjaFsxXSwgLi4udGhpcy5lZGl0b3IuZ2V0QXR0cmlidXRlcyhUZXh0U3R5bGUubmFtZSkgfSksXG4gICAgICAgIGpvaW5QcmVkaWNhdGU6IChtYXRjaCwgbm9kZSkgPT4gbm9kZS5jaGlsZENvdW50ICsgbm9kZS5hdHRycy5zdGFydCA9PT0gK21hdGNoWzFdLFxuICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIGlucHV0UnVsZSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBQYXJhZ3JhcGhPcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBwYXJhZ3JhcGg6IHtcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgcGFyYWdyYXBoXG4gICAgICAgKi9cbiAgICAgIHNldFBhcmFncmFwaDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBhcmFncmFwaCA9IE5vZGUuY3JlYXRlPFBhcmFncmFwaE9wdGlvbnM+KHtcbiAgbmFtZTogJ3BhcmFncmFwaCcsXG5cbiAgcHJpb3JpdHk6IDEwMDAsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBncm91cDogJ2Jsb2NrJyxcblxuICBjb250ZW50OiAnaW5saW5lKicsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3AnIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsncCcsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0UGFyYWdyYXBoOiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLUFsdC0wJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuc2V0UGFyYWdyYXBoKCksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBFZGl0b3IsIEV4dGVuc2lvbiB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IE5vZGUgYXMgUHJvc2VtaXJyb3JOb2RlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcbmltcG9ydCB7IERlY29yYXRpb24sIERlY29yYXRpb25TZXQgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2Vob2xkZXJPcHRpb25zIHtcbiAgZW1wdHlFZGl0b3JDbGFzczogc3RyaW5nXG4gIGVtcHR5Tm9kZUNsYXNzOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXI6XG4gICAgfCAoKFBsYWNlaG9sZGVyUHJvcHM6IHtcbiAgICAgICAgZWRpdG9yOiBFZGl0b3JcbiAgICAgICAgbm9kZTogUHJvc2VtaXJyb3JOb2RlXG4gICAgICAgIHBvczogbnVtYmVyXG4gICAgICAgIGhhc0FuY2hvcjogYm9vbGVhblxuICAgICAgfSkgPT4gc3RyaW5nKVxuICAgIHwgc3RyaW5nXG4gIHNob3dPbmx5V2hlbkVkaXRhYmxlOiBib29sZWFuXG4gIHNob3dPbmx5Q3VycmVudDogYm9vbGVhblxuICBpbmNsdWRlQ2hpbGRyZW46IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IFBsYWNlaG9sZGVyID0gRXh0ZW5zaW9uLmNyZWF0ZTxQbGFjZWhvbGRlck9wdGlvbnM+KHtcbiAgbmFtZTogJ3BsYWNlaG9sZGVyJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlbXB0eUVkaXRvckNsYXNzOiAnaXMtZWRpdG9yLWVtcHR5JyxcbiAgICAgIGVtcHR5Tm9kZUNsYXNzOiAnaXMtZW1wdHknLFxuICAgICAgcGxhY2Vob2xkZXI6ICdXcml0ZSBzb21ldGhpbmcg4oCmJyxcbiAgICAgIHNob3dPbmx5V2hlbkVkaXRhYmxlOiB0cnVlLFxuICAgICAgc2hvd09ubHlDdXJyZW50OiB0cnVlLFxuICAgICAgaW5jbHVkZUNoaWxkcmVuOiBmYWxzZSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgIHJldHVybiBbXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdwbGFjZWhvbGRlcicpLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGRlY29yYXRpb25zOiAoeyBkb2MsIHNlbGVjdGlvbiB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmVkaXRvci5pc0VkaXRhYmxlIHx8ICF0aGlzLm9wdGlvbnMuc2hvd09ubHlXaGVuRWRpdGFibGVcbiAgICAgICAgICAgIGNvbnN0IHsgYW5jaG9yIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGRlY29yYXRpb25zOiBEZWNvcmF0aW9uW10gPSBbXVxuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBvbmx5IGNhbGN1bGF0ZSBpc0VtcHR5IG9uY2UgZHVlIHRvIGl0cyBwZXJmb3JtYW5jZSBpbXBhY3RzIChzZWUgaXNzdWUgIzMzNjApXG4gICAgICAgICAgICBjb25zdCBlbXB0eURvY0luc3RhbmNlID0gZG9jLnR5cGUuY3JlYXRlQW5kRmlsbCgpXG4gICAgICAgICAgICBjb25zdCBpc0VkaXRvckVtcHR5ID0gZW1wdHlEb2NJbnN0YW5jZT8uc2FtZU1hcmt1cChkb2MpXG4gICAgICAgICAgICAgICYmIGVtcHR5RG9jSW5zdGFuY2UuY29udGVudC5maW5kRGlmZlN0YXJ0KGRvYy5jb250ZW50KSA9PT0gbnVsbFxuXG4gICAgICAgICAgICBkb2MuZGVzY2VuZGFudHMoKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBoYXNBbmNob3IgPSBhbmNob3IgPj0gcG9zICYmIGFuY2hvciA8PSBwb3MgKyBub2RlLm5vZGVTaXplXG4gICAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSAhbm9kZS5pc0xlYWYgJiYgIW5vZGUuY2hpbGRDb3VudFxuXG4gICAgICAgICAgICAgIGlmICgoaGFzQW5jaG9yIHx8ICF0aGlzLm9wdGlvbnMuc2hvd09ubHlDdXJyZW50KSAmJiBpc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NlcyA9IFt0aGlzLm9wdGlvbnMuZW1wdHlOb2RlQ2xhc3NdXG5cbiAgICAgICAgICAgICAgICBpZiAoaXNFZGl0b3JFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMub3B0aW9ucy5lbXB0eUVkaXRvckNsYXNzKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29yYXRpb24gPSBEZWNvcmF0aW9uLm5vZGUocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCB7XG4gICAgICAgICAgICAgICAgICBjbGFzczogY2xhc3Nlcy5qb2luKCcgJyksXG4gICAgICAgICAgICAgICAgICAnZGF0YS1wbGFjZWhvbGRlcic6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGRlY29yYXRpb24pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmluY2x1ZGVDaGlsZHJlblxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuY3JlYXRlKGRvYywgZGVjb3JhdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHtcbiAgaXNNYWNPUyxcbiAgTWFyayxcbiAgbWFya0lucHV0UnVsZSxcbiAgbWFya1Bhc3RlUnVsZSxcbiAgbWVyZ2VBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaWtlT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgc3RyaWtlOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNldCBhIHN0cmlrZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldFN0cmlrZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgc3RyaWtlIG1hcmtcbiAgICAgICAqL1xuICAgICAgdG9nZ2xlU3RyaWtlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIHN0cmlrZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHVuc2V0U3RyaWtlOiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaW5wdXRSZWdleCA9IC8oPzpefFxccykoKD86fn4pKCg/Oltefl0rKSkoPzp+fikpJC9cbmV4cG9ydCBjb25zdCBwYXN0ZVJlZ2V4ID0gLyg/Ol58XFxzKSgoPzp+fikoKD86W15+XSspKSg/On5+KSkvZ1xuXG5leHBvcnQgY29uc3QgU3RyaWtlID0gTWFyay5jcmVhdGU8U3RyaWtlT3B0aW9ucz4oe1xuICBuYW1lOiAnc3RyaWtlJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdzJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhZzogJ2RlbCcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0YWc6ICdzdHJpa2UnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3R5bGU6ICd0ZXh0LWRlY29yYXRpb24nLFxuICAgICAgICBjb25zdW1pbmc6IGZhbHNlLFxuICAgICAgICBnZXRBdHRyczogc3R5bGUgPT4gKChzdHlsZSBhcyBzdHJpbmcpLmluY2x1ZGVzKCdsaW5lLXRocm91Z2gnKSA/IHt9IDogZmFsc2UpLFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTdHJpa2U6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZVN0cmlrZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRTdHJpa2U6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICBjb25zdCBzaG9ydGN1dHM6IFJlY29yZDxzdHJpbmcsICgpID0+IGJvb2xlYW4+ID0ge31cblxuICAgIGlmIChpc01hY09TKCkpIHtcbiAgICAgIHNob3J0Y3V0c1snTW9kLVNoaWZ0LXMnXSA9ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZVN0cmlrZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3J0Y3V0c1snQ3RybC1TaGlmdC1zJ10gPSAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVTdHJpa2UoKVxuICAgIH1cblxuICAgIHJldHVybiBzaG9ydGN1dHNcbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogaW5wdXRSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxuXG4gIGFkZFBhc3RlUnVsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1hcmtQYXN0ZVJ1bGUoe1xuICAgICAgICBmaW5kOiBwYXN0ZVJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCB7IE1hcmssIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpcHRFeHRlbnNpb25PcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IE9iamVjdCxcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHN1YnNjcmlwdDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzdWJzY3JpcHQgbWFya1xuICAgICAgICovXG4gICAgICBzZXRTdWJzY3JpcHQ6ICgpID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIHN1YnNjcmlwdCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZVN1YnNjcmlwdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBzdWJzY3JpcHQgbWFya1xuICAgICAgICovXG4gICAgICB1bnNldFN1YnNjcmlwdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFN1YnNjcmlwdCA9IE1hcmsuY3JlYXRlPFN1YnNjcmlwdEV4dGVuc2lvbk9wdGlvbnM+KHtcbiAgbmFtZTogJ3N1YnNjcmlwdCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3ViJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiAndmVydGljYWwtYWxpZ24nLFxuICAgICAgICBnZXRBdHRycyh2YWx1ZSkge1xuICAgICAgICAgIC8vIERvbuKAmXQgbWF0Y2ggdGhpcyBydWxlIGlmIHRoZSB2ZXJ0aWNhbCBhbGlnbiBpc27igJl0IHN1Yi5cbiAgICAgICAgICBpZiAodmFsdWUgIT09ICdzdWInKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBpdCBmYWxscyB0aHJvdWdoIHdl4oCZbGwgbWF0Y2gsIGFuZCB0aGlzIG1hcmsgd2lsbCBiZSBhcHBsaWVkLlxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3N1YicsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U3Vic2NyaXB0OiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB0b2dnbGVTdWJzY3JpcHQ6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZU1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHVuc2V0U3Vic2NyaXB0OiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtLCc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnRvZ2dsZVN1YnNjcmlwdCgpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IHsgTWFyaywgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1cGVyc2NyaXB0RXh0ZW5zaW9uT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBPYmplY3QsXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICBzdXBlcnNjcmlwdDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzdXBlcnNjcmlwdCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldFN1cGVyc2NyaXB0OiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgYSBzdXBlcnNjcmlwdCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZVN1cGVyc2NyaXB0OiAoKSA9PiBSZXR1cm5UeXBlLFxuICAgICAgLyoqXG4gICAgICAgKiBVbnNldCBhIHN1cGVyc2NyaXB0IG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRTdXBlcnNjcmlwdDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFN1cGVyc2NyaXB0ID0gTWFyay5jcmVhdGU8U3VwZXJzY3JpcHRFeHRlbnNpb25PcHRpb25zPih7XG4gIG5hbWU6ICdzdXBlcnNjcmlwdCcsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3VwJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHN0eWxlOiAndmVydGljYWwtYWxpZ24nLFxuICAgICAgICBnZXRBdHRycyh2YWx1ZSkge1xuICAgICAgICAgIC8vIERvbuKAmXQgbWF0Y2ggdGhpcyBydWxlIGlmIHRoZSB2ZXJ0aWNhbCBhbGlnbiBpc27igJl0IHN1cGVyLlxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gJ3N1cGVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgaXQgZmFsbHMgdGhyb3VnaCB3ZeKAmWxsIG1hdGNoLCBhbmQgdGhpcyBtYXJrIHdpbGwgYmUgYXBwbGllZC5cbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWydzdXAnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFN1cGVyc2NyaXB0OiAoKSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgICB0b2dnbGVTdXBlcnNjcmlwdDogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRTdXBlcnNjcmlwdDogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLS4nOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVTdXBlcnNjcmlwdCgpLFxuICAgIH1cbiAgfSxcbn0pXG4iLCAiLy8gc3JjL2luZGV4LnRzXG5pbXBvcnQgeyBQbHVnaW4gYXMgUGx1Z2luMiB9IGZyb20gXCJwcm9zZW1pcnJvci1zdGF0ZVwiO1xuXG4vLyBzcmMvY2VsbHNlbGVjdGlvbi50c1xuaW1wb3J0IHsgRnJhZ21lbnQsIFNsaWNlIH0gZnJvbSBcInByb3NlbWlycm9yLW1vZGVsXCI7XG5pbXBvcnQge1xuICBOb2RlU2VsZWN0aW9uIGFzIE5vZGVTZWxlY3Rpb24yLFxuICBTZWxlY3Rpb24sXG4gIFNlbGVjdGlvblJhbmdlLFxuICBUZXh0U2VsZWN0aW9uXG59IGZyb20gXCJwcm9zZW1pcnJvci1zdGF0ZVwiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCB9IGZyb20gXCJwcm9zZW1pcnJvci12aWV3XCI7XG5cbi8vIHNyYy90YWJsZW1hcC50c1xudmFyIHJlYWRGcm9tQ2FjaGU7XG52YXIgYWRkVG9DYWNoZTtcbmlmICh0eXBlb2YgV2Vha01hcCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gIGxldCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICByZWFkRnJvbUNhY2hlID0gKGtleSkgPT4gY2FjaGUuZ2V0KGtleSk7XG4gIGFkZFRvQ2FjaGUgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgIGNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59IGVsc2Uge1xuICBjb25zdCBjYWNoZSA9IFtdO1xuICBjb25zdCBjYWNoZVNpemUgPSAxMDtcbiAgbGV0IGNhY2hlUG9zID0gMDtcbiAgcmVhZEZyb21DYWNoZSA9IChrZXkpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlLmxlbmd0aDsgaSArPSAyKVxuICAgICAgaWYgKGNhY2hlW2ldID09IGtleSlcbiAgICAgICAgcmV0dXJuIGNhY2hlW2kgKyAxXTtcbiAgfTtcbiAgYWRkVG9DYWNoZSA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgaWYgKGNhY2hlUG9zID09IGNhY2hlU2l6ZSlcbiAgICAgIGNhY2hlUG9zID0gMDtcbiAgICBjYWNoZVtjYWNoZVBvcysrXSA9IGtleTtcbiAgICByZXR1cm4gY2FjaGVbY2FjaGVQb3MrK10gPSB2YWx1ZTtcbiAgfTtcbn1cbnZhciBUYWJsZU1hcCA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCwgbWFwLCBwcm9ibGVtcykge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB0aGlzLnByb2JsZW1zID0gcHJvYmxlbXM7XG4gIH1cbiAgLy8gRmluZCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY2VsbCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gIGZpbmRDZWxsKHBvcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1clBvcyA9IHRoaXMubWFwW2ldO1xuICAgICAgaWYgKGN1clBvcyAhPSBwb3MpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbGVmdCA9IGkgJSB0aGlzLndpZHRoO1xuICAgICAgY29uc3QgdG9wID0gaSAvIHRoaXMud2lkdGggfCAwO1xuICAgICAgbGV0IHJpZ2h0ID0gbGVmdCArIDE7XG4gICAgICBsZXQgYm90dG9tID0gdG9wICsgMTtcbiAgICAgIGZvciAobGV0IGogPSAxOyByaWdodCA8IHRoaXMud2lkdGggJiYgdGhpcy5tYXBbaSArIGpdID09IGN1clBvczsgaisrKSB7XG4gICAgICAgIHJpZ2h0Kys7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBqID0gMTsgYm90dG9tIDwgdGhpcy5oZWlnaHQgJiYgdGhpcy5tYXBbaSArIHRoaXMud2lkdGggKiBqXSA9PSBjdXJQb3M7IGorKykge1xuICAgICAgICBib3R0b20rKztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gY2VsbCB3aXRoIG9mZnNldCAke3Bvc30gZm91bmRgKTtcbiAgfVxuICAvLyBGaW5kIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGNlbGwgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICBjb2xDb3VudChwb3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFwLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5tYXBbaV0gPT0gcG9zKSB7XG4gICAgICAgIHJldHVybiBpICUgdGhpcy53aWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIGNlbGwgd2l0aCBvZmZzZXQgJHtwb3N9IGZvdW5kYCk7XG4gIH1cbiAgLy8gRmluZCB0aGUgbmV4dCBjZWxsIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24sIHN0YXJ0aW5nIGZyb20gdGhlIGNlbGxcbiAgLy8gYXQgYHBvc2AsIGlmIGFueS5cbiAgbmV4dENlbGwocG9zLCBheGlzLCBkaXIpIHtcbiAgICBjb25zdCB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9ID0gdGhpcy5maW5kQ2VsbChwb3MpO1xuICAgIGlmIChheGlzID09IFwiaG9yaXpcIikge1xuICAgICAgaWYgKGRpciA8IDAgPyBsZWZ0ID09IDAgOiByaWdodCA9PSB0aGlzLndpZHRoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLm1hcFt0b3AgKiB0aGlzLndpZHRoICsgKGRpciA8IDAgPyBsZWZ0IC0gMSA6IHJpZ2h0KV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkaXIgPCAwID8gdG9wID09IDAgOiBib3R0b20gPT0gdGhpcy5oZWlnaHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHRoaXMubWFwW2xlZnQgKyB0aGlzLndpZHRoICogKGRpciA8IDAgPyB0b3AgLSAxIDogYm90dG9tKV07XG4gICAgfVxuICB9XG4gIC8vIEdldCB0aGUgcmVjdGFuZ2xlIHNwYW5uaW5nIHRoZSB0d28gZ2l2ZW4gY2VsbHMuXG4gIHJlY3RCZXR3ZWVuKGEsIGIpIHtcbiAgICBjb25zdCB7XG4gICAgICBsZWZ0OiBsZWZ0QSxcbiAgICAgIHJpZ2h0OiByaWdodEEsXG4gICAgICB0b3A6IHRvcEEsXG4gICAgICBib3R0b206IGJvdHRvbUFcbiAgICB9ID0gdGhpcy5maW5kQ2VsbChhKTtcbiAgICBjb25zdCB7XG4gICAgICBsZWZ0OiBsZWZ0QixcbiAgICAgIHJpZ2h0OiByaWdodEIsXG4gICAgICB0b3A6IHRvcEIsXG4gICAgICBib3R0b206IGJvdHRvbUJcbiAgICB9ID0gdGhpcy5maW5kQ2VsbChiKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogTWF0aC5taW4obGVmdEEsIGxlZnRCKSxcbiAgICAgIHRvcDogTWF0aC5taW4odG9wQSwgdG9wQiksXG4gICAgICByaWdodDogTWF0aC5tYXgocmlnaHRBLCByaWdodEIpLFxuICAgICAgYm90dG9tOiBNYXRoLm1heChib3R0b21BLCBib3R0b21CKVxuICAgIH07XG4gIH1cbiAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiBhbGwgY2VsbHMgdGhhdCBoYXZlIHRoZSB0b3AgbGVmdCBjb3JuZXIgaW5cbiAgLy8gdGhlIGdpdmVuIHJlY3RhbmdsZS5cbiAgY2VsbHNJblJlY3QocmVjdCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSB7fTtcbiAgICBmb3IgKGxldCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSByZWN0LmxlZnQ7IGNvbCA8IHJlY3QucmlnaHQ7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcm93ICogdGhpcy53aWR0aCArIGNvbDtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5tYXBbaW5kZXhdO1xuICAgICAgICBpZiAoc2Vlbltwb3NdKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBzZWVuW3Bvc10gPSB0cnVlO1xuICAgICAgICBpZiAoY29sID09IHJlY3QubGVmdCAmJiBjb2wgJiYgdGhpcy5tYXBbaW5kZXggLSAxXSA9PSBwb3MgfHwgcm93ID09IHJlY3QudG9wICYmIHJvdyAmJiB0aGlzLm1hcFtpbmRleCAtIHRoaXMud2lkdGhdID09IHBvcykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHBvcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgY2VsbCBhdCB0aGUgZ2l2ZW4gcm93IGFuZCBjb2x1bW5cbiAgLy8gc3RhcnRzLCBvciB3b3VsZCBzdGFydCwgaWYgYSBjZWxsIHN0YXJ0ZWQgdGhlcmUuXG4gIHBvc2l0aW9uQXQocm93LCBjb2wsIHRhYmxlKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIHJvd1N0YXJ0ID0gMDsgOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvd0VuZCA9IHJvd1N0YXJ0ICsgdGFibGUuY2hpbGQoaSkubm9kZVNpemU7XG4gICAgICBpZiAoaSA9PSByb3cpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gY29sICsgcm93ICogdGhpcy53aWR0aDtcbiAgICAgICAgY29uc3Qgcm93RW5kSW5kZXggPSAocm93ICsgMSkgKiB0aGlzLndpZHRoO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCByb3dFbmRJbmRleCAmJiB0aGlzLm1hcFtpbmRleF0gPCByb3dTdGFydClcbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICByZXR1cm4gaW5kZXggPT0gcm93RW5kSW5kZXggPyByb3dFbmQgLSAxIDogdGhpcy5tYXBbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcm93U3RhcnQgPSByb3dFbmQ7XG4gICAgfVxuICB9XG4gIC8vIEZpbmQgdGhlIHRhYmxlIG1hcCBmb3IgdGhlIGdpdmVuIHRhYmxlIG5vZGUuXG4gIHN0YXRpYyBnZXQodGFibGUpIHtcbiAgICByZXR1cm4gcmVhZEZyb21DYWNoZSh0YWJsZSkgfHwgYWRkVG9DYWNoZSh0YWJsZSwgY29tcHV0ZU1hcCh0YWJsZSkpO1xuICB9XG59O1xuZnVuY3Rpb24gY29tcHV0ZU1hcCh0YWJsZSkge1xuICBpZiAodGFibGUudHlwZS5zcGVjLnRhYmxlUm9sZSAhPSBcInRhYmxlXCIpXG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJOb3QgYSB0YWJsZSBub2RlOiBcIiArIHRhYmxlLnR5cGUubmFtZSk7XG4gIGNvbnN0IHdpZHRoID0gZmluZFdpZHRoKHRhYmxlKSwgaGVpZ2h0ID0gdGFibGUuY2hpbGRDb3VudDtcbiAgY29uc3QgbWFwID0gW107XG4gIGxldCBtYXBQb3MgPSAwO1xuICBsZXQgcHJvYmxlbXMgPSBudWxsO1xuICBjb25zdCBjb2xXaWR0aHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGUgPSB3aWR0aCAqIGhlaWdodDsgaSA8IGU7IGkrKylcbiAgICBtYXBbaV0gPSAwO1xuICBmb3IgKGxldCByb3cgPSAwLCBwb3MgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3Qgcm93Tm9kZSA9IHRhYmxlLmNoaWxkKHJvdyk7XG4gICAgcG9zKys7XG4gICAgZm9yIChsZXQgaSA9IDA7IDsgaSsrKSB7XG4gICAgICB3aGlsZSAobWFwUG9zIDwgbWFwLmxlbmd0aCAmJiBtYXBbbWFwUG9zXSAhPSAwKVxuICAgICAgICBtYXBQb3MrKztcbiAgICAgIGlmIChpID09IHJvd05vZGUuY2hpbGRDb3VudClcbiAgICAgICAgYnJlYWs7XG4gICAgICBjb25zdCBjZWxsTm9kZSA9IHJvd05vZGUuY2hpbGQoaSk7XG4gICAgICBjb25zdCB7IGNvbHNwYW4sIHJvd3NwYW4sIGNvbHdpZHRoIH0gPSBjZWxsTm9kZS5hdHRycztcbiAgICAgIGZvciAobGV0IGggPSAwOyBoIDwgcm93c3BhbjsgaCsrKSB7XG4gICAgICAgIGlmIChoICsgcm93ID49IGhlaWdodCkge1xuICAgICAgICAgIChwcm9ibGVtcyB8fCAocHJvYmxlbXMgPSBbXSkpLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJvdmVybG9uZ19yb3dzcGFuXCIsXG4gICAgICAgICAgICBwb3MsXG4gICAgICAgICAgICBuOiByb3dzcGFuIC0gaFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbWFwUG9zICsgaCAqIHdpZHRoO1xuICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGNvbHNwYW47IHcrKykge1xuICAgICAgICAgIGlmIChtYXBbc3RhcnQgKyB3XSA9PSAwKVxuICAgICAgICAgICAgbWFwW3N0YXJ0ICsgd10gPSBwb3M7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgKHByb2JsZW1zIHx8IChwcm9ibGVtcyA9IFtdKSkucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiY29sbGlzaW9uXCIsXG4gICAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgICAgcG9zLFxuICAgICAgICAgICAgICBuOiBjb2xzcGFuIC0gd1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgY29sVyA9IGNvbHdpZHRoICYmIGNvbHdpZHRoW3ddO1xuICAgICAgICAgIGlmIChjb2xXKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEluZGV4ID0gKHN0YXJ0ICsgdykgJSB3aWR0aCAqIDIsIHByZXYgPSBjb2xXaWR0aHNbd2lkdGhJbmRleF07XG4gICAgICAgICAgICBpZiAocHJldiA9PSBudWxsIHx8IHByZXYgIT0gY29sVyAmJiBjb2xXaWR0aHNbd2lkdGhJbmRleCArIDFdID09IDEpIHtcbiAgICAgICAgICAgICAgY29sV2lkdGhzW3dpZHRoSW5kZXhdID0gY29sVztcbiAgICAgICAgICAgICAgY29sV2lkdGhzW3dpZHRoSW5kZXggKyAxXSA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByZXYgPT0gY29sVykge1xuICAgICAgICAgICAgICBjb2xXaWR0aHNbd2lkdGhJbmRleCArIDFdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtYXBQb3MgKz0gY29sc3BhbjtcbiAgICAgIHBvcyArPSBjZWxsTm9kZS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgY29uc3QgZXhwZWN0ZWRQb3MgPSAocm93ICsgMSkgKiB3aWR0aDtcbiAgICBsZXQgbWlzc2luZyA9IDA7XG4gICAgd2hpbGUgKG1hcFBvcyA8IGV4cGVjdGVkUG9zKVxuICAgICAgaWYgKG1hcFttYXBQb3MrK10gPT0gMClcbiAgICAgICAgbWlzc2luZysrO1xuICAgIGlmIChtaXNzaW5nKVxuICAgICAgKHByb2JsZW1zIHx8IChwcm9ibGVtcyA9IFtdKSkucHVzaCh7IHR5cGU6IFwibWlzc2luZ1wiLCByb3csIG46IG1pc3NpbmcgfSk7XG4gICAgcG9zKys7XG4gIH1cbiAgY29uc3QgdGFibGVNYXAgPSBuZXcgVGFibGVNYXAod2lkdGgsIGhlaWdodCwgbWFwLCBwcm9ibGVtcyk7XG4gIGxldCBiYWRXaWR0aHMgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7ICFiYWRXaWR0aHMgJiYgaSA8IGNvbFdpZHRocy5sZW5ndGg7IGkgKz0gMilcbiAgICBpZiAoY29sV2lkdGhzW2ldICE9IG51bGwgJiYgY29sV2lkdGhzW2kgKyAxXSA8IGhlaWdodClcbiAgICAgIGJhZFdpZHRocyA9IHRydWU7XG4gIGlmIChiYWRXaWR0aHMpXG4gICAgZmluZEJhZENvbFdpZHRocyh0YWJsZU1hcCwgY29sV2lkdGhzLCB0YWJsZSk7XG4gIHJldHVybiB0YWJsZU1hcDtcbn1cbmZ1bmN0aW9uIGZpbmRXaWR0aCh0YWJsZSkge1xuICBsZXQgd2lkdGggPSAtMTtcbiAgbGV0IGhhc1Jvd1NwYW4gPSBmYWxzZTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdGFibGUuY2hpbGRDb3VudDsgcm93KyspIHtcbiAgICBjb25zdCByb3dOb2RlID0gdGFibGUuY2hpbGQocm93KTtcbiAgICBsZXQgcm93V2lkdGggPSAwO1xuICAgIGlmIChoYXNSb3dTcGFuKVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3c7IGorKykge1xuICAgICAgICBjb25zdCBwcmV2Um93ID0gdGFibGUuY2hpbGQoaik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlJvdy5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjZWxsID0gcHJldlJvdy5jaGlsZChpKTtcbiAgICAgICAgICBpZiAoaiArIGNlbGwuYXR0cnMucm93c3BhbiA+IHJvdylcbiAgICAgICAgICAgIHJvd1dpZHRoICs9IGNlbGwuYXR0cnMuY29sc3BhbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Tm9kZS5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGNlbGwgPSByb3dOb2RlLmNoaWxkKGkpO1xuICAgICAgcm93V2lkdGggKz0gY2VsbC5hdHRycy5jb2xzcGFuO1xuICAgICAgaWYgKGNlbGwuYXR0cnMucm93c3BhbiA+IDEpXG4gICAgICAgIGhhc1Jvd1NwYW4gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAod2lkdGggPT0gLTEpXG4gICAgICB3aWR0aCA9IHJvd1dpZHRoO1xuICAgIGVsc2UgaWYgKHdpZHRoICE9IHJvd1dpZHRoKVxuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgcm93V2lkdGgpO1xuICB9XG4gIHJldHVybiB3aWR0aDtcbn1cbmZ1bmN0aW9uIGZpbmRCYWRDb2xXaWR0aHMobWFwLCBjb2xXaWR0aHMsIHRhYmxlKSB7XG4gIGlmICghbWFwLnByb2JsZW1zKVxuICAgIG1hcC5wcm9ibGVtcyA9IFtdO1xuICBjb25zdCBzZWVuID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwLm1hcC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBvcyA9IG1hcC5tYXBbaV07XG4gICAgaWYgKHNlZW5bcG9zXSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIHNlZW5bcG9zXSA9IHRydWU7XG4gICAgY29uc3Qgbm9kZSA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIGNlbGwgd2l0aCBvZmZzZXQgJHtwb3N9IGZvdW5kYCk7XG4gICAgfVxuICAgIGxldCB1cGRhdGVkID0gbnVsbDtcbiAgICBjb25zdCBhdHRycyA9IG5vZGUuYXR0cnM7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRycy5jb2xzcGFuOyBqKyspIHtcbiAgICAgIGNvbnN0IGNvbCA9IChpICsgaikgJSBtYXAud2lkdGg7XG4gICAgICBjb25zdCBjb2xXaWR0aCA9IGNvbFdpZHRoc1tjb2wgKiAyXTtcbiAgICAgIGlmIChjb2xXaWR0aCAhPSBudWxsICYmICghYXR0cnMuY29sd2lkdGggfHwgYXR0cnMuY29sd2lkdGhbal0gIT0gY29sV2lkdGgpKVxuICAgICAgICAodXBkYXRlZCB8fCAodXBkYXRlZCA9IGZyZXNoQ29sV2lkdGgoYXR0cnMpKSlbal0gPSBjb2xXaWR0aDtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZWQpXG4gICAgICBtYXAucHJvYmxlbXMudW5zaGlmdCh7XG4gICAgICAgIHR5cGU6IFwiY29sd2lkdGggbWlzbWF0Y2hcIixcbiAgICAgICAgcG9zLFxuICAgICAgICBjb2x3aWR0aDogdXBkYXRlZFxuICAgICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZyZXNoQ29sV2lkdGgoYXR0cnMpIHtcbiAgaWYgKGF0dHJzLmNvbHdpZHRoKVxuICAgIHJldHVybiBhdHRycy5jb2x3aWR0aC5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5jb2xzcGFuOyBpKyspXG4gICAgcmVzdWx0LnB1c2goMCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy91dGlsLnRzXG5pbXBvcnQgeyBQbHVnaW5LZXkgfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcblxuLy8gc3JjL3NjaGVtYS50c1xuZnVuY3Rpb24gZ2V0Q2VsbEF0dHJzKGRvbSwgZXh0cmFBdHRycykge1xuICBpZiAodHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCB3aWR0aEF0dHIgPSBkb20uZ2V0QXR0cmlidXRlKFwiZGF0YS1jb2x3aWR0aFwiKTtcbiAgY29uc3Qgd2lkdGhzID0gd2lkdGhBdHRyICYmIC9eXFxkKygsXFxkKykqJC8udGVzdCh3aWR0aEF0dHIpID8gd2lkdGhBdHRyLnNwbGl0KFwiLFwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkgOiBudWxsO1xuICBjb25zdCBjb2xzcGFuID0gTnVtYmVyKGRvbS5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpIHx8IDEpO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgY29sc3BhbixcbiAgICByb3dzcGFuOiBOdW1iZXIoZG9tLmdldEF0dHJpYnV0ZShcInJvd3NwYW5cIikgfHwgMSksXG4gICAgY29sd2lkdGg6IHdpZHRocyAmJiB3aWR0aHMubGVuZ3RoID09IGNvbHNwYW4gPyB3aWR0aHMgOiBudWxsXG4gIH07XG4gIGZvciAoY29uc3QgcHJvcCBpbiBleHRyYUF0dHJzKSB7XG4gICAgY29uc3QgZ2V0dGVyID0gZXh0cmFBdHRyc1twcm9wXS5nZXRGcm9tRE9NO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyICYmIGdldHRlcihkb20pO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNldENlbGxBdHRycyhub2RlLCBleHRyYUF0dHJzKSB7XG4gIGNvbnN0IGF0dHJzID0ge307XG4gIGlmIChub2RlLmF0dHJzLmNvbHNwYW4gIT0gMSlcbiAgICBhdHRycy5jb2xzcGFuID0gbm9kZS5hdHRycy5jb2xzcGFuO1xuICBpZiAobm9kZS5hdHRycy5yb3dzcGFuICE9IDEpXG4gICAgYXR0cnMucm93c3BhbiA9IG5vZGUuYXR0cnMucm93c3BhbjtcbiAgaWYgKG5vZGUuYXR0cnMuY29sd2lkdGgpXG4gICAgYXR0cnNbXCJkYXRhLWNvbHdpZHRoXCJdID0gbm9kZS5hdHRycy5jb2x3aWR0aC5qb2luKFwiLFwiKTtcbiAgZm9yIChjb25zdCBwcm9wIGluIGV4dHJhQXR0cnMpIHtcbiAgICBjb25zdCBzZXR0ZXIgPSBleHRyYUF0dHJzW3Byb3BdLnNldERPTUF0dHI7XG4gICAgaWYgKHNldHRlcilcbiAgICAgIHNldHRlcihub2RlLmF0dHJzW3Byb3BdLCBhdHRycyk7XG4gIH1cbiAgcmV0dXJuIGF0dHJzO1xufVxuZnVuY3Rpb24gdGFibGVOb2RlcyhvcHRpb25zKSB7XG4gIGNvbnN0IGV4dHJhQXR0cnMgPSBvcHRpb25zLmNlbGxBdHRyaWJ1dGVzIHx8IHt9O1xuICBjb25zdCBjZWxsQXR0cnMgPSB7XG4gICAgY29sc3BhbjogeyBkZWZhdWx0OiAxIH0sXG4gICAgcm93c3BhbjogeyBkZWZhdWx0OiAxIH0sXG4gICAgY29sd2lkdGg6IHsgZGVmYXVsdDogbnVsbCB9XG4gIH07XG4gIGZvciAoY29uc3QgcHJvcCBpbiBleHRyYUF0dHJzKVxuICAgIGNlbGxBdHRyc1twcm9wXSA9IHsgZGVmYXVsdDogZXh0cmFBdHRyc1twcm9wXS5kZWZhdWx0IH07XG4gIHJldHVybiB7XG4gICAgdGFibGU6IHtcbiAgICAgIGNvbnRlbnQ6IFwidGFibGVfcm93K1wiLFxuICAgICAgdGFibGVSb2xlOiBcInRhYmxlXCIsXG4gICAgICBpc29sYXRpbmc6IHRydWUsXG4gICAgICBncm91cDogb3B0aW9ucy50YWJsZUdyb3VwLFxuICAgICAgcGFyc2VET006IFt7IHRhZzogXCJ0YWJsZVwiIH1dLFxuICAgICAgdG9ET00oKSB7XG4gICAgICAgIHJldHVybiBbXCJ0YWJsZVwiLCBbXCJ0Ym9keVwiLCAwXV07XG4gICAgICB9XG4gICAgfSxcbiAgICB0YWJsZV9yb3c6IHtcbiAgICAgIGNvbnRlbnQ6IFwiKHRhYmxlX2NlbGwgfCB0YWJsZV9oZWFkZXIpKlwiLFxuICAgICAgdGFibGVSb2xlOiBcInJvd1wiLFxuICAgICAgcGFyc2VET006IFt7IHRhZzogXCJ0clwiIH1dLFxuICAgICAgdG9ET00oKSB7XG4gICAgICAgIHJldHVybiBbXCJ0clwiLCAwXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYmxlX2NlbGw6IHtcbiAgICAgIGNvbnRlbnQ6IG9wdGlvbnMuY2VsbENvbnRlbnQsXG4gICAgICBhdHRyczogY2VsbEF0dHJzLFxuICAgICAgdGFibGVSb2xlOiBcImNlbGxcIixcbiAgICAgIGlzb2xhdGluZzogdHJ1ZSxcbiAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgIHsgdGFnOiBcInRkXCIsIGdldEF0dHJzOiAoZG9tKSA9PiBnZXRDZWxsQXR0cnMoZG9tLCBleHRyYUF0dHJzKSB9XG4gICAgICBdLFxuICAgICAgdG9ET00obm9kZSkge1xuICAgICAgICByZXR1cm4gW1widGRcIiwgc2V0Q2VsbEF0dHJzKG5vZGUsIGV4dHJhQXR0cnMpLCAwXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYmxlX2hlYWRlcjoge1xuICAgICAgY29udGVudDogb3B0aW9ucy5jZWxsQ29udGVudCxcbiAgICAgIGF0dHJzOiBjZWxsQXR0cnMsXG4gICAgICB0YWJsZVJvbGU6IFwiaGVhZGVyX2NlbGxcIixcbiAgICAgIGlzb2xhdGluZzogdHJ1ZSxcbiAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgIHsgdGFnOiBcInRoXCIsIGdldEF0dHJzOiAoZG9tKSA9PiBnZXRDZWxsQXR0cnMoZG9tLCBleHRyYUF0dHJzKSB9XG4gICAgICBdLFxuICAgICAgdG9ET00obm9kZSkge1xuICAgICAgICByZXR1cm4gW1widGhcIiwgc2V0Q2VsbEF0dHJzKG5vZGUsIGV4dHJhQXR0cnMpLCAwXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiB0YWJsZU5vZGVUeXBlcyhzY2hlbWEpIHtcbiAgbGV0IHJlc3VsdCA9IHNjaGVtYS5jYWNoZWQudGFibGVOb2RlVHlwZXM7XG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmVzdWx0ID0gc2NoZW1hLmNhY2hlZC50YWJsZU5vZGVUeXBlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiBzY2hlbWEubm9kZXMpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBzY2hlbWEubm9kZXNbbmFtZV0sIHJvbGUgPSB0eXBlLnNwZWMudGFibGVSb2xlO1xuICAgICAgaWYgKHJvbGUpXG4gICAgICAgIHJlc3VsdFtyb2xlXSA9IHR5cGU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIHNyYy91dGlsLnRzXG52YXIgdGFibGVFZGl0aW5nS2V5ID0gbmV3IFBsdWdpbktleShcInNlbGVjdGluZ0NlbGxzXCIpO1xuZnVuY3Rpb24gY2VsbEFyb3VuZCgkcG9zKSB7XG4gIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMTsgZCA+IDA7IGQtLSlcbiAgICBpZiAoJHBvcy5ub2RlKGQpLnR5cGUuc3BlYy50YWJsZVJvbGUgPT0gXCJyb3dcIilcbiAgICAgIHJldHVybiAkcG9zLm5vZGUoMCkucmVzb2x2ZSgkcG9zLmJlZm9yZShkICsgMSkpO1xuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNlbGxXcmFwcGluZygkcG9zKSB7XG4gIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOyBkID4gMDsgZC0tKSB7XG4gICAgY29uc3Qgcm9sZSA9ICRwb3Mubm9kZShkKS50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgIGlmIChyb2xlID09PSBcImNlbGxcIiB8fCByb2xlID09PSBcImhlYWRlcl9jZWxsXCIpXG4gICAgICByZXR1cm4gJHBvcy5ub2RlKGQpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gaXNJblRhYmxlKHN0YXRlKSB7XG4gIGNvbnN0ICRoZWFkID0gc3RhdGUuc2VsZWN0aW9uLiRoZWFkO1xuICBmb3IgKGxldCBkID0gJGhlYWQuZGVwdGg7IGQgPiAwOyBkLS0pXG4gICAgaWYgKCRoZWFkLm5vZGUoZCkudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcInJvd1wiKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkNlbGwoc3RhdGUpIHtcbiAgY29uc3Qgc2VsID0gc3RhdGUuc2VsZWN0aW9uO1xuICBpZiAoXCIkYW5jaG9yQ2VsbFwiIGluIHNlbCAmJiBzZWwuJGFuY2hvckNlbGwpIHtcbiAgICByZXR1cm4gc2VsLiRhbmNob3JDZWxsLnBvcyA+IHNlbC4kaGVhZENlbGwucG9zID8gc2VsLiRhbmNob3JDZWxsIDogc2VsLiRoZWFkQ2VsbDtcbiAgfSBlbHNlIGlmIChcIm5vZGVcIiBpbiBzZWwgJiYgc2VsLm5vZGUgJiYgc2VsLm5vZGUudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcImNlbGxcIikge1xuICAgIHJldHVybiBzZWwuJGFuY2hvcjtcbiAgfVxuICBjb25zdCAkY2VsbCA9IGNlbGxBcm91bmQoc2VsLiRoZWFkKSB8fCBjZWxsTmVhcihzZWwuJGhlYWQpO1xuICBpZiAoJGNlbGwpIHtcbiAgICByZXR1cm4gJGNlbGw7XG4gIH1cbiAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIGNlbGwgZm91bmQgYXJvdW5kIHBvc2l0aW9uICR7c2VsLmhlYWR9YCk7XG59XG5mdW5jdGlvbiBjZWxsTmVhcigkcG9zKSB7XG4gIGZvciAobGV0IGFmdGVyID0gJHBvcy5ub2RlQWZ0ZXIsIHBvcyA9ICRwb3MucG9zOyBhZnRlcjsgYWZ0ZXIgPSBhZnRlci5maXJzdENoaWxkLCBwb3MrKykge1xuICAgIGNvbnN0IHJvbGUgPSBhZnRlci50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKVxuICAgICAgcmV0dXJuICRwb3MuZG9jLnJlc29sdmUocG9zKTtcbiAgfVxuICBmb3IgKGxldCBiZWZvcmUgPSAkcG9zLm5vZGVCZWZvcmUsIHBvcyA9ICRwb3MucG9zOyBiZWZvcmU7IGJlZm9yZSA9IGJlZm9yZS5sYXN0Q2hpbGQsIHBvcy0tKSB7XG4gICAgY29uc3Qgcm9sZSA9IGJlZm9yZS50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKVxuICAgICAgcmV0dXJuICRwb3MuZG9jLnJlc29sdmUocG9zIC0gYmVmb3JlLm5vZGVTaXplKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9pbnRzQXRDZWxsKCRwb3MpIHtcbiAgcmV0dXJuICRwb3MucGFyZW50LnR5cGUuc3BlYy50YWJsZVJvbGUgPT0gXCJyb3dcIiAmJiAhISRwb3Mubm9kZUFmdGVyO1xufVxuZnVuY3Rpb24gbW92ZUNlbGxGb3J3YXJkKCRwb3MpIHtcbiAgcmV0dXJuICRwb3Mubm9kZSgwKS5yZXNvbHZlKCRwb3MucG9zICsgJHBvcy5ub2RlQWZ0ZXIubm9kZVNpemUpO1xufVxuZnVuY3Rpb24gaW5TYW1lVGFibGUoJGNlbGxBLCAkY2VsbEIpIHtcbiAgcmV0dXJuICRjZWxsQS5kZXB0aCA9PSAkY2VsbEIuZGVwdGggJiYgJGNlbGxBLnBvcyA+PSAkY2VsbEIuc3RhcnQoLTEpICYmICRjZWxsQS5wb3MgPD0gJGNlbGxCLmVuZCgtMSk7XG59XG5mdW5jdGlvbiBmaW5kQ2VsbCgkcG9zKSB7XG4gIHJldHVybiBUYWJsZU1hcC5nZXQoJHBvcy5ub2RlKC0xKSkuZmluZENlbGwoJHBvcy5wb3MgLSAkcG9zLnN0YXJ0KC0xKSk7XG59XG5mdW5jdGlvbiBjb2xDb3VudCgkcG9zKSB7XG4gIHJldHVybiBUYWJsZU1hcC5nZXQoJHBvcy5ub2RlKC0xKSkuY29sQ291bnQoJHBvcy5wb3MgLSAkcG9zLnN0YXJ0KC0xKSk7XG59XG5mdW5jdGlvbiBuZXh0Q2VsbCgkcG9zLCBheGlzLCBkaXIpIHtcbiAgY29uc3QgdGFibGUgPSAkcG9zLm5vZGUoLTEpO1xuICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICBjb25zdCB0YWJsZVN0YXJ0ID0gJHBvcy5zdGFydCgtMSk7XG4gIGNvbnN0IG1vdmVkID0gbWFwLm5leHRDZWxsKCRwb3MucG9zIC0gdGFibGVTdGFydCwgYXhpcywgZGlyKTtcbiAgcmV0dXJuIG1vdmVkID09IG51bGwgPyBudWxsIDogJHBvcy5ub2RlKDApLnJlc29sdmUodGFibGVTdGFydCArIG1vdmVkKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNvbFNwYW4oYXR0cnMsIHBvcywgbiA9IDEpIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5hdHRycywgY29sc3BhbjogYXR0cnMuY29sc3BhbiAtIG4gfTtcbiAgaWYgKHJlc3VsdC5jb2x3aWR0aCkge1xuICAgIHJlc3VsdC5jb2x3aWR0aCA9IHJlc3VsdC5jb2x3aWR0aC5zbGljZSgpO1xuICAgIHJlc3VsdC5jb2x3aWR0aC5zcGxpY2UocG9zLCBuKTtcbiAgICBpZiAoIXJlc3VsdC5jb2x3aWR0aC5zb21lKCh3KSA9PiB3ID4gMCkpXG4gICAgICByZXN1bHQuY29sd2lkdGggPSBudWxsO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBhZGRDb2xTcGFuKGF0dHJzLCBwb3MsIG4gPSAxKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4uYXR0cnMsIGNvbHNwYW46IGF0dHJzLmNvbHNwYW4gKyBuIH07XG4gIGlmIChyZXN1bHQuY29sd2lkdGgpIHtcbiAgICByZXN1bHQuY29sd2lkdGggPSByZXN1bHQuY29sd2lkdGguc2xpY2UoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKylcbiAgICAgIHJlc3VsdC5jb2x3aWR0aC5zcGxpY2UocG9zLCAwLCAwKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29sdW1uSXNIZWFkZXIobWFwLCB0YWJsZSwgY29sKSB7XG4gIGNvbnN0IGhlYWRlckNlbGwgPSB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkuaGVhZGVyX2NlbGw7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG1hcC5oZWlnaHQ7IHJvdysrKVxuICAgIGlmICh0YWJsZS5ub2RlQXQobWFwLm1hcFtjb2wgKyByb3cgKiBtYXAud2lkdGhdKS50eXBlICE9IGhlYWRlckNlbGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvY2VsbHNlbGVjdGlvbi50c1xudmFyIENlbGxTZWxlY3Rpb24gPSBjbGFzcyBfQ2VsbFNlbGVjdGlvbiBleHRlbmRzIFNlbGVjdGlvbiB7XG4gIC8vIEEgdGFibGUgc2VsZWN0aW9uIGlzIGlkZW50aWZpZWQgYnkgaXRzIGFuY2hvciBhbmQgaGVhZCBjZWxscy4gVGhlXG4gIC8vIHBvc2l0aW9ucyBnaXZlbiB0byB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBwb2ludCBfYmVmb3JlXyB0d29cbiAgLy8gY2VsbHMgaW4gdGhlIHNhbWUgdGFibGUuIFRoZXkgbWF5IGJlIHRoZSBzYW1lLCB0byBzZWxlY3QgYSBzaW5nbGVcbiAgLy8gY2VsbC5cbiAgY29uc3RydWN0b3IoJGFuY2hvckNlbGwsICRoZWFkQ2VsbCA9ICRhbmNob3JDZWxsKSB7XG4gICAgY29uc3QgdGFibGUgPSAkYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgIGNvbnN0IHRhYmxlU3RhcnQgPSAkYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgcmVjdCA9IG1hcC5yZWN0QmV0d2VlbihcbiAgICAgICRhbmNob3JDZWxsLnBvcyAtIHRhYmxlU3RhcnQsXG4gICAgICAkaGVhZENlbGwucG9zIC0gdGFibGVTdGFydFxuICAgICk7XG4gICAgY29uc3QgZG9jID0gJGFuY2hvckNlbGwubm9kZSgwKTtcbiAgICBjb25zdCBjZWxscyA9IG1hcC5jZWxsc0luUmVjdChyZWN0KS5maWx0ZXIoKHApID0+IHAgIT0gJGhlYWRDZWxsLnBvcyAtIHRhYmxlU3RhcnQpO1xuICAgIGNlbGxzLnVuc2hpZnQoJGhlYWRDZWxsLnBvcyAtIHRhYmxlU3RhcnQpO1xuICAgIGNvbnN0IHJhbmdlcyA9IGNlbGxzLm1hcCgocG9zKSA9PiB7XG4gICAgICBjb25zdCBjZWxsID0gdGFibGUubm9kZUF0KHBvcyk7XG4gICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgTm8gY2VsbCB3aXRoIG9mZnNldCAke3Bvc30gZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZyb20gPSB0YWJsZVN0YXJ0ICsgcG9zICsgMTtcbiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgIGRvYy5yZXNvbHZlKGZyb20pLFxuICAgICAgICBkb2MucmVzb2x2ZShmcm9tICsgY2VsbC5jb250ZW50LnNpemUpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHN1cGVyKHJhbmdlc1swXS4kZnJvbSwgcmFuZ2VzWzBdLiR0bywgcmFuZ2VzKTtcbiAgICB0aGlzLiRhbmNob3JDZWxsID0gJGFuY2hvckNlbGw7XG4gICAgdGhpcy4kaGVhZENlbGwgPSAkaGVhZENlbGw7XG4gIH1cbiAgbWFwKGRvYywgbWFwcGluZykge1xuICAgIGNvbnN0ICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUobWFwcGluZy5tYXAodGhpcy4kYW5jaG9yQ2VsbC5wb3MpKTtcbiAgICBjb25zdCAkaGVhZENlbGwgPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcCh0aGlzLiRoZWFkQ2VsbC5wb3MpKTtcbiAgICBpZiAocG9pbnRzQXRDZWxsKCRhbmNob3JDZWxsKSAmJiBwb2ludHNBdENlbGwoJGhlYWRDZWxsKSAmJiBpblNhbWVUYWJsZSgkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKSkge1xuICAgICAgY29uc3QgdGFibGVDaGFuZ2VkID0gdGhpcy4kYW5jaG9yQ2VsbC5ub2RlKC0xKSAhPSAkYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICAgIGlmICh0YWJsZUNoYW5nZWQgJiYgdGhpcy5pc1Jvd1NlbGVjdGlvbigpKVxuICAgICAgICByZXR1cm4gX0NlbGxTZWxlY3Rpb24ucm93U2VsZWN0aW9uKCRhbmNob3JDZWxsLCAkaGVhZENlbGwpO1xuICAgICAgZWxzZSBpZiAodGFibGVDaGFuZ2VkICYmIHRoaXMuaXNDb2xTZWxlY3Rpb24oKSlcbiAgICAgICAgcmV0dXJuIF9DZWxsU2VsZWN0aW9uLmNvbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIG5ldyBfQ2VsbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2VlbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgfVxuICAvLyBSZXR1cm5zIGEgcmVjdGFuZ3VsYXIgc2xpY2Ugb2YgdGFibGUgcm93cyBjb250YWluaW5nIHRoZSBzZWxlY3RlZFxuICAvLyBjZWxscy5cbiAgY29udGVudCgpIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuJGFuY2hvckNlbGwubm9kZSgtMSk7XG4gICAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHRhYmxlKTtcbiAgICBjb25zdCB0YWJsZVN0YXJ0ID0gdGhpcy4kYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgcmVjdCA9IG1hcC5yZWN0QmV0d2VlbihcbiAgICAgIHRoaXMuJGFuY2hvckNlbGwucG9zIC0gdGFibGVTdGFydCxcbiAgICAgIHRoaXMuJGhlYWRDZWxsLnBvcyAtIHRhYmxlU3RhcnRcbiAgICApO1xuICAgIGNvbnN0IHNlZW4gPSB7fTtcbiAgICBjb25zdCByb3dzID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykge1xuICAgICAgY29uc3Qgcm93Q29udGVudCA9IFtdO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSByb3cgKiBtYXAud2lkdGggKyByZWN0LmxlZnQsIGNvbCA9IHJlY3QubGVmdDsgY29sIDwgcmVjdC5yaWdodDsgY29sKyssIGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgICAgIGlmIChzZWVuW3Bvc10pXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIHNlZW5bcG9zXSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGNlbGxSZWN0ID0gbWFwLmZpbmRDZWxsKHBvcyk7XG4gICAgICAgIGxldCBjZWxsID0gdGFibGUubm9kZUF0KHBvcyk7XG4gICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoYE5vIGNlbGwgd2l0aCBvZmZzZXQgJHtwb3N9IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0cmFMZWZ0ID0gcmVjdC5sZWZ0IC0gY2VsbFJlY3QubGVmdDtcbiAgICAgICAgY29uc3QgZXh0cmFSaWdodCA9IGNlbGxSZWN0LnJpZ2h0IC0gcmVjdC5yaWdodDtcbiAgICAgICAgaWYgKGV4dHJhTGVmdCA+IDAgfHwgZXh0cmFSaWdodCA+IDApIHtcbiAgICAgICAgICBsZXQgYXR0cnMgPSBjZWxsLmF0dHJzO1xuICAgICAgICAgIGlmIChleHRyYUxlZnQgPiAwKSB7XG4gICAgICAgICAgICBhdHRycyA9IHJlbW92ZUNvbFNwYW4oYXR0cnMsIDAsIGV4dHJhTGVmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHRyYVJpZ2h0ID4gMCkge1xuICAgICAgICAgICAgYXR0cnMgPSByZW1vdmVDb2xTcGFuKFxuICAgICAgICAgICAgICBhdHRycyxcbiAgICAgICAgICAgICAgYXR0cnMuY29sc3BhbiAtIGV4dHJhUmlnaHQsXG4gICAgICAgICAgICAgIGV4dHJhUmlnaHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjZWxsUmVjdC5sZWZ0IDwgcmVjdC5sZWZ0KSB7XG4gICAgICAgICAgICBjZWxsID0gY2VsbC50eXBlLmNyZWF0ZUFuZEZpbGwoYXR0cnMpO1xuICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBjcmVhdGUgY2VsbCB3aXRoIGF0dHJzICR7SlNPTi5zdHJpbmdpZnkoYXR0cnMpfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VsbCA9IGNlbGwudHlwZS5jcmVhdGUoYXR0cnMsIGNlbGwuY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjZWxsUmVjdC50b3AgPCByZWN0LnRvcCB8fCBjZWxsUmVjdC5ib3R0b20gPiByZWN0LmJvdHRvbSkge1xuICAgICAgICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgICAgIHJvd3NwYW46IE1hdGgubWluKGNlbGxSZWN0LmJvdHRvbSwgcmVjdC5ib3R0b20pIC0gTWF0aC5tYXgoY2VsbFJlY3QudG9wLCByZWN0LnRvcClcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjZWxsUmVjdC50b3AgPCByZWN0LnRvcCkge1xuICAgICAgICAgICAgY2VsbCA9IGNlbGwudHlwZS5jcmVhdGVBbmRGaWxsKGF0dHJzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VsbCA9IGNlbGwudHlwZS5jcmVhdGUoYXR0cnMsIGNlbGwuY29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJvd0NvbnRlbnQucHVzaChjZWxsKTtcbiAgICAgIH1cbiAgICAgIHJvd3MucHVzaCh0YWJsZS5jaGlsZChyb3cpLmNvcHkoRnJhZ21lbnQuZnJvbShyb3dDb250ZW50KSkpO1xuICAgIH1cbiAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuaXNDb2xTZWxlY3Rpb24oKSAmJiB0aGlzLmlzUm93U2VsZWN0aW9uKCkgPyB0YWJsZSA6IHJvd3M7XG4gICAgcmV0dXJuIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGZyYWdtZW50KSwgMSwgMSk7XG4gIH1cbiAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgY29uc3QgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aCwgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldLCBtYXBwaW5nID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKTtcbiAgICAgIHRyLnJlcGxhY2UoXG4gICAgICAgIG1hcHBpbmcubWFwKCRmcm9tLnBvcyksXG4gICAgICAgIG1hcHBpbmcubWFwKCR0by5wb3MpLFxuICAgICAgICBpID8gU2xpY2UuZW1wdHkgOiBjb250ZW50XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZWwgPSBTZWxlY3Rpb24uZmluZEZyb20oXG4gICAgICB0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcCh0aGlzLnRvKSksXG4gICAgICAtMVxuICAgICk7XG4gICAgaWYgKHNlbClcbiAgICAgIHRyLnNldFNlbGVjdGlvbihzZWwpO1xuICB9XG4gIHJlcGxhY2VXaXRoKHRyLCBub2RlKSB7XG4gICAgdGhpcy5yZXBsYWNlKHRyLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShub2RlKSwgMCwgMCkpO1xuICB9XG4gIGZvckVhY2hDZWxsKGYpIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuJGFuY2hvckNlbGwubm9kZSgtMSk7XG4gICAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHRhYmxlKTtcbiAgICBjb25zdCB0YWJsZVN0YXJ0ID0gdGhpcy4kYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgY2VsbHMgPSBtYXAuY2VsbHNJblJlY3QoXG4gICAgICBtYXAucmVjdEJldHdlZW4oXG4gICAgICAgIHRoaXMuJGFuY2hvckNlbGwucG9zIC0gdGFibGVTdGFydCxcbiAgICAgICAgdGhpcy4kaGVhZENlbGwucG9zIC0gdGFibGVTdGFydFxuICAgICAgKVxuICAgICk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgZih0YWJsZS5ub2RlQXQoY2VsbHNbaV0pLCB0YWJsZVN0YXJ0ICsgY2VsbHNbaV0pO1xuICAgIH1cbiAgfVxuICAvLyBUcnVlIGlmIHRoaXMgc2VsZWN0aW9uIGdvZXMgYWxsIHRoZSB3YXkgZnJvbSB0aGUgdG9wIHRvIHRoZVxuICAvLyBib3R0b20gb2YgdGhlIHRhYmxlLlxuICBpc0NvbFNlbGVjdGlvbigpIHtcbiAgICBjb25zdCBhbmNob3JUb3AgPSB0aGlzLiRhbmNob3JDZWxsLmluZGV4KC0xKTtcbiAgICBjb25zdCBoZWFkVG9wID0gdGhpcy4kaGVhZENlbGwuaW5kZXgoLTEpO1xuICAgIGlmIChNYXRoLm1pbihhbmNob3JUb3AsIGhlYWRUb3ApID4gMClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhbmNob3JCb3R0b20gPSBhbmNob3JUb3AgKyB0aGlzLiRhbmNob3JDZWxsLm5vZGVBZnRlci5hdHRycy5yb3dzcGFuO1xuICAgIGNvbnN0IGhlYWRCb3R0b20gPSBoZWFkVG9wICsgdGhpcy4kaGVhZENlbGwubm9kZUFmdGVyLmF0dHJzLnJvd3NwYW47XG4gICAgcmV0dXJuIE1hdGgubWF4KGFuY2hvckJvdHRvbSwgaGVhZEJvdHRvbSkgPT0gdGhpcy4kaGVhZENlbGwubm9kZSgtMSkuY2hpbGRDb3VudDtcbiAgfVxuICAvLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBjb2x1bW4gc2VsZWN0aW9uIHRoYXQgY292ZXJzIHRoZSBnaXZlbiBhbmNob3JcbiAgLy8gYW5kIGhlYWQgY2VsbC5cbiAgc3RhdGljIGNvbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsID0gJGFuY2hvckNlbGwpIHtcbiAgICBjb25zdCB0YWJsZSA9ICRhbmNob3JDZWxsLm5vZGUoLTEpO1xuICAgIGNvbnN0IG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gICAgY29uc3QgdGFibGVTdGFydCA9ICRhbmNob3JDZWxsLnN0YXJ0KC0xKTtcbiAgICBjb25zdCBhbmNob3JSZWN0ID0gbWFwLmZpbmRDZWxsKCRhbmNob3JDZWxsLnBvcyAtIHRhYmxlU3RhcnQpO1xuICAgIGNvbnN0IGhlYWRSZWN0ID0gbWFwLmZpbmRDZWxsKCRoZWFkQ2VsbC5wb3MgLSB0YWJsZVN0YXJ0KTtcbiAgICBjb25zdCBkb2MgPSAkYW5jaG9yQ2VsbC5ub2RlKDApO1xuICAgIGlmIChhbmNob3JSZWN0LnRvcCA8PSBoZWFkUmVjdC50b3ApIHtcbiAgICAgIGlmIChhbmNob3JSZWN0LnRvcCA+IDApXG4gICAgICAgICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUodGFibGVTdGFydCArIG1hcC5tYXBbYW5jaG9yUmVjdC5sZWZ0XSk7XG4gICAgICBpZiAoaGVhZFJlY3QuYm90dG9tIDwgbWFwLmhlaWdodClcbiAgICAgICAgJGhlYWRDZWxsID0gZG9jLnJlc29sdmUoXG4gICAgICAgICAgdGFibGVTdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogKG1hcC5oZWlnaHQgLSAxKSArIGhlYWRSZWN0LnJpZ2h0IC0gMV1cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhlYWRSZWN0LnRvcCA+IDApXG4gICAgICAgICRoZWFkQ2VsbCA9IGRvYy5yZXNvbHZlKHRhYmxlU3RhcnQgKyBtYXAubWFwW2hlYWRSZWN0LmxlZnRdKTtcbiAgICAgIGlmIChhbmNob3JSZWN0LmJvdHRvbSA8IG1hcC5oZWlnaHQpXG4gICAgICAgICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUoXG4gICAgICAgICAgdGFibGVTdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogKG1hcC5oZWlnaHQgLSAxKSArIGFuY2hvclJlY3QucmlnaHQgLSAxXVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9DZWxsU2VsZWN0aW9uKCRhbmNob3JDZWxsLCAkaGVhZENlbGwpO1xuICB9XG4gIC8vIFRydWUgaWYgdGhpcyBzZWxlY3Rpb24gZ29lcyBhbGwgdGhlIHdheSBmcm9tIHRoZSBsZWZ0IHRvIHRoZVxuICAvLyByaWdodCBvZiB0aGUgdGFibGUuXG4gIGlzUm93U2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgIGNvbnN0IHRhYmxlU3RhcnQgPSB0aGlzLiRhbmNob3JDZWxsLnN0YXJ0KC0xKTtcbiAgICBjb25zdCBhbmNob3JMZWZ0ID0gbWFwLmNvbENvdW50KHRoaXMuJGFuY2hvckNlbGwucG9zIC0gdGFibGVTdGFydCk7XG4gICAgY29uc3QgaGVhZExlZnQgPSBtYXAuY29sQ291bnQodGhpcy4kaGVhZENlbGwucG9zIC0gdGFibGVTdGFydCk7XG4gICAgaWYgKE1hdGgubWluKGFuY2hvckxlZnQsIGhlYWRMZWZ0KSA+IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgYW5jaG9yUmlnaHQgPSBhbmNob3JMZWZ0ICsgdGhpcy4kYW5jaG9yQ2VsbC5ub2RlQWZ0ZXIuYXR0cnMuY29sc3BhbjtcbiAgICBjb25zdCBoZWFkUmlnaHQgPSBoZWFkTGVmdCArIHRoaXMuJGhlYWRDZWxsLm5vZGVBZnRlci5hdHRycy5jb2xzcGFuO1xuICAgIHJldHVybiBNYXRoLm1heChhbmNob3JSaWdodCwgaGVhZFJpZ2h0KSA9PSBtYXAud2lkdGg7XG4gIH1cbiAgZXEob3RoZXIpIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBfQ2VsbFNlbGVjdGlvbiAmJiBvdGhlci4kYW5jaG9yQ2VsbC5wb3MgPT0gdGhpcy4kYW5jaG9yQ2VsbC5wb3MgJiYgb3RoZXIuJGhlYWRDZWxsLnBvcyA9PSB0aGlzLiRoZWFkQ2VsbC5wb3M7XG4gIH1cbiAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgcm93IHNlbGVjdGlvbiB0aGF0IGNvdmVycyB0aGUgZ2l2ZW4gYW5jaG9yXG4gIC8vIGFuZCBoZWFkIGNlbGwuXG4gIHN0YXRpYyByb3dTZWxlY3Rpb24oJGFuY2hvckNlbGwsICRoZWFkQ2VsbCA9ICRhbmNob3JDZWxsKSB7XG4gICAgY29uc3QgdGFibGUgPSAkYW5jaG9yQ2VsbC5ub2RlKC0xKTtcbiAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgIGNvbnN0IHRhYmxlU3RhcnQgPSAkYW5jaG9yQ2VsbC5zdGFydCgtMSk7XG4gICAgY29uc3QgYW5jaG9yUmVjdCA9IG1hcC5maW5kQ2VsbCgkYW5jaG9yQ2VsbC5wb3MgLSB0YWJsZVN0YXJ0KTtcbiAgICBjb25zdCBoZWFkUmVjdCA9IG1hcC5maW5kQ2VsbCgkaGVhZENlbGwucG9zIC0gdGFibGVTdGFydCk7XG4gICAgY29uc3QgZG9jID0gJGFuY2hvckNlbGwubm9kZSgwKTtcbiAgICBpZiAoYW5jaG9yUmVjdC5sZWZ0IDw9IGhlYWRSZWN0LmxlZnQpIHtcbiAgICAgIGlmIChhbmNob3JSZWN0LmxlZnQgPiAwKVxuICAgICAgICAkYW5jaG9yQ2VsbCA9IGRvYy5yZXNvbHZlKFxuICAgICAgICAgIHRhYmxlU3RhcnQgKyBtYXAubWFwW2FuY2hvclJlY3QudG9wICogbWFwLndpZHRoXVxuICAgICAgICApO1xuICAgICAgaWYgKGhlYWRSZWN0LnJpZ2h0IDwgbWFwLndpZHRoKVxuICAgICAgICAkaGVhZENlbGwgPSBkb2MucmVzb2x2ZShcbiAgICAgICAgICB0YWJsZVN0YXJ0ICsgbWFwLm1hcFttYXAud2lkdGggKiAoaGVhZFJlY3QudG9wICsgMSkgLSAxXVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGVhZFJlY3QubGVmdCA+IDApXG4gICAgICAgICRoZWFkQ2VsbCA9IGRvYy5yZXNvbHZlKHRhYmxlU3RhcnQgKyBtYXAubWFwW2hlYWRSZWN0LnRvcCAqIG1hcC53aWR0aF0pO1xuICAgICAgaWYgKGFuY2hvclJlY3QucmlnaHQgPCBtYXAud2lkdGgpXG4gICAgICAgICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUoXG4gICAgICAgICAgdGFibGVTdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogKGFuY2hvclJlY3QudG9wICsgMSkgLSAxXVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9DZWxsU2VsZWN0aW9uKCRhbmNob3JDZWxsLCAkaGVhZENlbGwpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjZWxsXCIsXG4gICAgICBhbmNob3I6IHRoaXMuJGFuY2hvckNlbGwucG9zLFxuICAgICAgaGVhZDogdGhpcy4kaGVhZENlbGwucG9zXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgZnJvbUpTT04oZG9jLCBqc29uKSB7XG4gICAgcmV0dXJuIG5ldyBfQ2VsbFNlbGVjdGlvbihkb2MucmVzb2x2ZShqc29uLmFuY2hvciksIGRvYy5yZXNvbHZlKGpzb24uaGVhZCkpO1xuICB9XG4gIHN0YXRpYyBjcmVhdGUoZG9jLCBhbmNob3JDZWxsLCBoZWFkQ2VsbCA9IGFuY2hvckNlbGwpIHtcbiAgICByZXR1cm4gbmV3IF9DZWxsU2VsZWN0aW9uKGRvYy5yZXNvbHZlKGFuY2hvckNlbGwpLCBkb2MucmVzb2x2ZShoZWFkQ2VsbCkpO1xuICB9XG4gIGdldEJvb2ttYXJrKCkge1xuICAgIHJldHVybiBuZXcgQ2VsbEJvb2ttYXJrKHRoaXMuJGFuY2hvckNlbGwucG9zLCB0aGlzLiRoZWFkQ2VsbC5wb3MpO1xuICB9XG59O1xuQ2VsbFNlbGVjdGlvbi5wcm90b3R5cGUudmlzaWJsZSA9IGZhbHNlO1xuU2VsZWN0aW9uLmpzb25JRChcImNlbGxcIiwgQ2VsbFNlbGVjdGlvbik7XG52YXIgQ2VsbEJvb2ttYXJrID0gY2xhc3MgX0NlbGxCb29rbWFyayB7XG4gIGNvbnN0cnVjdG9yKGFuY2hvciwgaGVhZCkge1xuICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gIH1cbiAgbWFwKG1hcHBpbmcpIHtcbiAgICByZXR1cm4gbmV3IF9DZWxsQm9va21hcmsobWFwcGluZy5tYXAodGhpcy5hbmNob3IpLCBtYXBwaW5nLm1hcCh0aGlzLmhlYWQpKTtcbiAgfVxuICByZXNvbHZlKGRvYykge1xuICAgIGNvbnN0ICRhbmNob3JDZWxsID0gZG9jLnJlc29sdmUodGhpcy5hbmNob3IpLCAkaGVhZENlbGwgPSBkb2MucmVzb2x2ZSh0aGlzLmhlYWQpO1xuICAgIGlmICgkYW5jaG9yQ2VsbC5wYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcInJvd1wiICYmICRoZWFkQ2VsbC5wYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcInJvd1wiICYmICRhbmNob3JDZWxsLmluZGV4KCkgPCAkYW5jaG9yQ2VsbC5wYXJlbnQuY2hpbGRDb3VudCAmJiAkaGVhZENlbGwuaW5kZXgoKSA8ICRoZWFkQ2VsbC5wYXJlbnQuY2hpbGRDb3VudCAmJiBpblNhbWVUYWJsZSgkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKSlcbiAgICAgIHJldHVybiBuZXcgQ2VsbFNlbGVjdGlvbigkYW5jaG9yQ2VsbCwgJGhlYWRDZWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJGhlYWRDZWxsLCAxKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGRyYXdDZWxsU2VsZWN0aW9uKHN0YXRlKSB7XG4gIGlmICghKHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCBjZWxscyA9IFtdO1xuICBzdGF0ZS5zZWxlY3Rpb24uZm9yRWFjaENlbGwoKG5vZGUsIHBvcykgPT4ge1xuICAgIGNlbGxzLnB1c2goXG4gICAgICBEZWNvcmF0aW9uLm5vZGUocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCB7IGNsYXNzOiBcInNlbGVjdGVkQ2VsbFwiIH0pXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiBEZWNvcmF0aW9uU2V0LmNyZWF0ZShzdGF0ZS5kb2MsIGNlbGxzKTtcbn1cbmZ1bmN0aW9uIGlzQ2VsbEJvdW5kYXJ5U2VsZWN0aW9uKHsgJGZyb20sICR0byB9KSB7XG4gIGlmICgkZnJvbS5wb3MgPT0gJHRvLnBvcyB8fCAkZnJvbS5wb3MgPCAkZnJvbS5wb3MgLSA2KVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IGFmdGVyRnJvbSA9ICRmcm9tLnBvcztcbiAgbGV0IGJlZm9yZVRvID0gJHRvLnBvcztcbiAgbGV0IGRlcHRoID0gJGZyb20uZGVwdGg7XG4gIGZvciAoOyBkZXB0aCA+PSAwOyBkZXB0aC0tLCBhZnRlckZyb20rKylcbiAgICBpZiAoJGZyb20uYWZ0ZXIoZGVwdGggKyAxKSA8ICRmcm9tLmVuZChkZXB0aCkpXG4gICAgICBicmVhaztcbiAgZm9yIChsZXQgZCA9ICR0by5kZXB0aDsgZCA+PSAwOyBkLS0sIGJlZm9yZVRvLS0pXG4gICAgaWYgKCR0by5iZWZvcmUoZCArIDEpID4gJHRvLnN0YXJ0KGQpKVxuICAgICAgYnJlYWs7XG4gIHJldHVybiBhZnRlckZyb20gPT0gYmVmb3JlVG8gJiYgL3Jvd3x0YWJsZS8udGVzdCgkZnJvbS5ub2RlKGRlcHRoKS50eXBlLnNwZWMudGFibGVSb2xlKTtcbn1cbmZ1bmN0aW9uIGlzVGV4dFNlbGVjdGlvbkFjcm9zc0NlbGxzKHsgJGZyb20sICR0byB9KSB7XG4gIGxldCBmcm9tQ2VsbEJvdW5kYXJ5Tm9kZTtcbiAgbGV0IHRvQ2VsbEJvdW5kYXJ5Tm9kZTtcbiAgZm9yIChsZXQgaSA9ICRmcm9tLmRlcHRoOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3Qgbm9kZSA9ICRmcm9tLm5vZGUoaSk7XG4gICAgaWYgKG5vZGUudHlwZS5zcGVjLnRhYmxlUm9sZSA9PT0gXCJjZWxsXCIgfHwgbm9kZS50eXBlLnNwZWMudGFibGVSb2xlID09PSBcImhlYWRlcl9jZWxsXCIpIHtcbiAgICAgIGZyb21DZWxsQm91bmRhcnlOb2RlID0gbm9kZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gJHRvLmRlcHRoOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3Qgbm9kZSA9ICR0by5ub2RlKGkpO1xuICAgIGlmIChub2RlLnR5cGUuc3BlYy50YWJsZVJvbGUgPT09IFwiY2VsbFwiIHx8IG5vZGUudHlwZS5zcGVjLnRhYmxlUm9sZSA9PT0gXCJoZWFkZXJfY2VsbFwiKSB7XG4gICAgICB0b0NlbGxCb3VuZGFyeU5vZGUgPSBub2RlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmcm9tQ2VsbEJvdW5kYXJ5Tm9kZSAhPT0gdG9DZWxsQm91bmRhcnlOb2RlICYmICR0by5wYXJlbnRPZmZzZXQgPT09IDA7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTZWxlY3Rpb24oc3RhdGUsIHRyLCBhbGxvd1RhYmxlTm9kZVNlbGVjdGlvbikge1xuICBjb25zdCBzZWwgPSAodHIgfHwgc3RhdGUpLnNlbGVjdGlvbjtcbiAgY29uc3QgZG9jID0gKHRyIHx8IHN0YXRlKS5kb2M7XG4gIGxldCBub3JtYWxpemU7XG4gIGxldCByb2xlO1xuICBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbjIgJiYgKHJvbGUgPSBzZWwubm9kZS50eXBlLnNwZWMudGFibGVSb2xlKSkge1xuICAgIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKSB7XG4gICAgICBub3JtYWxpemUgPSBDZWxsU2VsZWN0aW9uLmNyZWF0ZShkb2MsIHNlbC5mcm9tKTtcbiAgICB9IGVsc2UgaWYgKHJvbGUgPT0gXCJyb3dcIikge1xuICAgICAgY29uc3QgJGNlbGwgPSBkb2MucmVzb2x2ZShzZWwuZnJvbSArIDEpO1xuICAgICAgbm9ybWFsaXplID0gQ2VsbFNlbGVjdGlvbi5yb3dTZWxlY3Rpb24oJGNlbGwsICRjZWxsKTtcbiAgICB9IGVsc2UgaWYgKCFhbGxvd1RhYmxlTm9kZVNlbGVjdGlvbikge1xuICAgICAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHNlbC5ub2RlKTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gc2VsLmZyb20gKyAxO1xuICAgICAgY29uc3QgbGFzdENlbGwgPSBzdGFydCArIG1hcC5tYXBbbWFwLndpZHRoICogbWFwLmhlaWdodCAtIDFdO1xuICAgICAgbm9ybWFsaXplID0gQ2VsbFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBzdGFydCArIDEsIGxhc3RDZWxsKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBpc0NlbGxCb3VuZGFyeVNlbGVjdGlvbihzZWwpKSB7XG4gICAgbm9ybWFsaXplID0gVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBzZWwuZnJvbSk7XG4gIH0gZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBpc1RleHRTZWxlY3Rpb25BY3Jvc3NDZWxscyhzZWwpKSB7XG4gICAgbm9ybWFsaXplID0gVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBzZWwuJGZyb20uc3RhcnQoKSwgc2VsLiRmcm9tLmVuZCgpKTtcbiAgfVxuICBpZiAobm9ybWFsaXplKVxuICAgICh0ciB8fCAodHIgPSBzdGF0ZS50cikpLnNldFNlbGVjdGlvbihub3JtYWxpemUpO1xuICByZXR1cm4gdHI7XG59XG5cbi8vIHNyYy9maXh0YWJsZXMudHNcbmltcG9ydCB7IFBsdWdpbktleSBhcyBQbHVnaW5LZXkyIH0gZnJvbSBcInByb3NlbWlycm9yLXN0YXRlXCI7XG52YXIgZml4VGFibGVzS2V5ID0gbmV3IFBsdWdpbktleTIoXCJmaXgtdGFibGVzXCIpO1xuZnVuY3Rpb24gY2hhbmdlZERlc2NlbmRhbnRzKG9sZCwgY3VyLCBvZmZzZXQsIGYpIHtcbiAgY29uc3Qgb2xkU2l6ZSA9IG9sZC5jaGlsZENvdW50LCBjdXJTaXplID0gY3VyLmNoaWxkQ291bnQ7XG4gIG91dGVyOlxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGN1clNpemU7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBjdXIuY2hpbGQoaSk7XG4gICAgICBmb3IgKGxldCBzY2FuID0gaiwgZSA9IE1hdGgubWluKG9sZFNpemUsIGkgKyAzKTsgc2NhbiA8IGU7IHNjYW4rKykge1xuICAgICAgICBpZiAob2xkLmNoaWxkKHNjYW4pID09IGNoaWxkKSB7XG4gICAgICAgICAgaiA9IHNjYW4gKyAxO1xuICAgICAgICAgIG9mZnNldCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZihjaGlsZCwgb2Zmc2V0KTtcbiAgICAgIGlmIChqIDwgb2xkU2l6ZSAmJiBvbGQuY2hpbGQoaikuc2FtZU1hcmt1cChjaGlsZCkpXG4gICAgICAgIGNoYW5nZWREZXNjZW5kYW50cyhvbGQuY2hpbGQoaiksIGNoaWxkLCBvZmZzZXQgKyAxLCBmKTtcbiAgICAgIGVsc2VcbiAgICAgICAgY2hpbGQubm9kZXNCZXR3ZWVuKDAsIGNoaWxkLmNvbnRlbnQuc2l6ZSwgZiwgb2Zmc2V0ICsgMSk7XG4gICAgICBvZmZzZXQgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgfVxufVxuZnVuY3Rpb24gZml4VGFibGVzKHN0YXRlLCBvbGRTdGF0ZSkge1xuICBsZXQgdHI7XG4gIGNvbnN0IGNoZWNrID0gKG5vZGUsIHBvcykgPT4ge1xuICAgIGlmIChub2RlLnR5cGUuc3BlYy50YWJsZVJvbGUgPT0gXCJ0YWJsZVwiKVxuICAgICAgdHIgPSBmaXhUYWJsZShzdGF0ZSwgbm9kZSwgcG9zLCB0cik7XG4gIH07XG4gIGlmICghb2xkU3RhdGUpXG4gICAgc3RhdGUuZG9jLmRlc2NlbmRhbnRzKGNoZWNrKTtcbiAgZWxzZSBpZiAob2xkU3RhdGUuZG9jICE9IHN0YXRlLmRvYylcbiAgICBjaGFuZ2VkRGVzY2VuZGFudHMob2xkU3RhdGUuZG9jLCBzdGF0ZS5kb2MsIDAsIGNoZWNrKTtcbiAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gZml4VGFibGUoc3RhdGUsIHRhYmxlLCB0YWJsZVBvcywgdHIpIHtcbiAgY29uc3QgbWFwID0gVGFibGVNYXAuZ2V0KHRhYmxlKTtcbiAgaWYgKCFtYXAucHJvYmxlbXMpXG4gICAgcmV0dXJuIHRyO1xuICBpZiAoIXRyKVxuICAgIHRyID0gc3RhdGUudHI7XG4gIGNvbnN0IG11c3RBZGQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXAuaGVpZ2h0OyBpKyspXG4gICAgbXVzdEFkZC5wdXNoKDApO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcC5wcm9ibGVtcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByb2IgPSBtYXAucHJvYmxlbXNbaV07XG4gICAgaWYgKHByb2IudHlwZSA9PSBcImNvbGxpc2lvblwiKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGFibGUubm9kZUF0KHByb2IucG9zKTtcbiAgICAgIGlmICghY2VsbClcbiAgICAgICAgY29udGludWU7XG4gICAgICBjb25zdCBhdHRycyA9IGNlbGwuYXR0cnM7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJzLnJvd3NwYW47IGorKylcbiAgICAgICAgbXVzdEFkZFtwcm9iLnJvdyArIGpdICs9IHByb2IubjtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgIHRyLm1hcHBpbmcubWFwKHRhYmxlUG9zICsgMSArIHByb2IucG9zKSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcmVtb3ZlQ29sU3BhbihhdHRycywgYXR0cnMuY29sc3BhbiAtIHByb2IubiwgcHJvYi5uKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHByb2IudHlwZSA9PSBcIm1pc3NpbmdcIikge1xuICAgICAgbXVzdEFkZFtwcm9iLnJvd10gKz0gcHJvYi5uO1xuICAgIH0gZWxzZSBpZiAocHJvYi50eXBlID09IFwib3Zlcmxvbmdfcm93c3BhblwiKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGFibGUubm9kZUF0KHByb2IucG9zKTtcbiAgICAgIGlmICghY2VsbClcbiAgICAgICAgY29udGludWU7XG4gICAgICB0ci5zZXROb2RlTWFya3VwKHRyLm1hcHBpbmcubWFwKHRhYmxlUG9zICsgMSArIHByb2IucG9zKSwgbnVsbCwge1xuICAgICAgICAuLi5jZWxsLmF0dHJzLFxuICAgICAgICByb3dzcGFuOiBjZWxsLmF0dHJzLnJvd3NwYW4gLSBwcm9iLm5cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocHJvYi50eXBlID09IFwiY29sd2lkdGggbWlzbWF0Y2hcIikge1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwcm9iLnBvcyk7XG4gICAgICBpZiAoIWNlbGwpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdHIuc2V0Tm9kZU1hcmt1cCh0ci5tYXBwaW5nLm1hcCh0YWJsZVBvcyArIDEgKyBwcm9iLnBvcyksIG51bGwsIHtcbiAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgY29sd2lkdGg6IHByb2IuY29sd2lkdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBsZXQgZmlyc3QsIGxhc3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbXVzdEFkZC5sZW5ndGg7IGkrKylcbiAgICBpZiAobXVzdEFkZFtpXSkge1xuICAgICAgaWYgKGZpcnN0ID09IG51bGwpXG4gICAgICAgIGZpcnN0ID0gaTtcbiAgICAgIGxhc3QgPSBpO1xuICAgIH1cbiAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IHRhYmxlUG9zICsgMTsgaSA8IG1hcC5oZWlnaHQ7IGkrKykge1xuICAgIGNvbnN0IHJvdyA9IHRhYmxlLmNoaWxkKGkpO1xuICAgIGNvbnN0IGVuZCA9IHBvcyArIHJvdy5ub2RlU2l6ZTtcbiAgICBjb25zdCBhZGQgPSBtdXN0QWRkW2ldO1xuICAgIGlmIChhZGQgPiAwKSB7XG4gICAgICBsZXQgcm9sZSA9IFwiY2VsbFwiO1xuICAgICAgaWYgKHJvdy5maXJzdENoaWxkKSB7XG4gICAgICAgIHJvbGUgPSByb3cuZmlyc3RDaGlsZC50eXBlLnNwZWMudGFibGVSb2xlO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYWRkOyBqKyspIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSlbcm9sZV0uY3JlYXRlQW5kRmlsbCgpO1xuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2lkZSA9IChpID09IDAgfHwgZmlyc3QgPT0gaSAtIDEpICYmIGxhc3QgPT0gaSA/IHBvcyArIDEgOiBlbmQgLSAxO1xuICAgICAgdHIuaW5zZXJ0KHRyLm1hcHBpbmcubWFwKHNpZGUpLCBub2Rlcyk7XG4gICAgfVxuICAgIHBvcyA9IGVuZDtcbiAgfVxuICByZXR1cm4gdHIuc2V0TWV0YShmaXhUYWJsZXNLZXksIHsgZml4VGFibGVzOiB0cnVlIH0pO1xufVxuXG4vLyBzcmMvaW5wdXQudHNcbmltcG9ydCB7IEZyYWdtZW50IGFzIEZyYWdtZW50MywgU2xpY2UgYXMgU2xpY2UzIH0gZnJvbSBcInByb3NlbWlycm9yLW1vZGVsXCI7XG5pbXBvcnQge1xuICBTZWxlY3Rpb24gYXMgU2VsZWN0aW9uMixcbiAgVGV4dFNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uMlxufSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmltcG9ydCB7IGtleWRvd25IYW5kbGVyIH0gZnJvbSBcInByb3NlbWlycm9yLWtleW1hcFwiO1xuXG4vLyBzcmMvY29weXBhc3RlLnRzXG5pbXBvcnQgeyBGcmFnbWVudCBhcyBGcmFnbWVudDIsIFNsaWNlIGFzIFNsaWNlMiB9IGZyb20gXCJwcm9zZW1pcnJvci1tb2RlbFwiO1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSBcInByb3NlbWlycm9yLXRyYW5zZm9ybVwiO1xuZnVuY3Rpb24gcGFzdGVkQ2VsbHMoc2xpY2UpIHtcbiAgaWYgKCFzbGljZS5zaXplKVxuICAgIHJldHVybiBudWxsO1xuICBsZXQgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHNsaWNlO1xuICB3aGlsZSAoY29udGVudC5jaGlsZENvdW50ID09IDEgJiYgKG9wZW5TdGFydCA+IDAgJiYgb3BlbkVuZCA+IDAgfHwgY29udGVudC5jaGlsZCgwKS50eXBlLnNwZWMudGFibGVSb2xlID09IFwidGFibGVcIikpIHtcbiAgICBvcGVuU3RhcnQtLTtcbiAgICBvcGVuRW5kLS07XG4gICAgY29udGVudCA9IGNvbnRlbnQuY2hpbGQoMCkuY29udGVudDtcbiAgfVxuICBjb25zdCBmaXJzdCA9IGNvbnRlbnQuY2hpbGQoMCk7XG4gIGNvbnN0IHJvbGUgPSBmaXJzdC50eXBlLnNwZWMudGFibGVSb2xlO1xuICBjb25zdCBzY2hlbWEgPSBmaXJzdC50eXBlLnNjaGVtYSwgcm93cyA9IFtdO1xuICBpZiAocm9sZSA9PSBcInJvd1wiKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50LmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgbGV0IGNlbGxzID0gY29udGVudC5jaGlsZChpKS5jb250ZW50O1xuICAgICAgY29uc3QgbGVmdCA9IGkgPyAwIDogTWF0aC5tYXgoMCwgb3BlblN0YXJ0IC0gMSk7XG4gICAgICBjb25zdCByaWdodCA9IGkgPCBjb250ZW50LmNoaWxkQ291bnQgLSAxID8gMCA6IE1hdGgubWF4KDAsIG9wZW5FbmQgLSAxKTtcbiAgICAgIGlmIChsZWZ0IHx8IHJpZ2h0KVxuICAgICAgICBjZWxscyA9IGZpdFNsaWNlKFxuICAgICAgICAgIHRhYmxlTm9kZVR5cGVzKHNjaGVtYSkucm93LFxuICAgICAgICAgIG5ldyBTbGljZTIoY2VsbHMsIGxlZnQsIHJpZ2h0KVxuICAgICAgICApLmNvbnRlbnQ7XG4gICAgICByb3dzLnB1c2goY2VsbHMpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyb2xlID09IFwiY2VsbFwiIHx8IHJvbGUgPT0gXCJoZWFkZXJfY2VsbFwiKSB7XG4gICAgcm93cy5wdXNoKFxuICAgICAgb3BlblN0YXJ0IHx8IG9wZW5FbmQgPyBmaXRTbGljZShcbiAgICAgICAgdGFibGVOb2RlVHlwZXMoc2NoZW1hKS5yb3csXG4gICAgICAgIG5ldyBTbGljZTIoY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kKVxuICAgICAgKS5jb250ZW50IDogY29udGVudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGVuc3VyZVJlY3Rhbmd1bGFyKHNjaGVtYSwgcm93cyk7XG59XG5mdW5jdGlvbiBlbnN1cmVSZWN0YW5ndWxhcihzY2hlbWEsIHJvd3MpIHtcbiAgY29uc3Qgd2lkdGhzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gICAgZm9yIChsZXQgaiA9IHJvdy5jaGlsZENvdW50IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIGNvbnN0IHsgcm93c3BhbiwgY29sc3BhbiB9ID0gcm93LmNoaWxkKGopLmF0dHJzO1xuICAgICAgZm9yIChsZXQgciA9IGk7IHIgPCBpICsgcm93c3BhbjsgcisrKVxuICAgICAgICB3aWR0aHNbcl0gPSAod2lkdGhzW3JdIHx8IDApICsgY29sc3BhbjtcbiAgICB9XG4gIH1cbiAgbGV0IHdpZHRoID0gMDtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCB3aWR0aHMubGVuZ3RoOyByKyspXG4gICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgd2lkdGhzW3JdKTtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCB3aWR0aHMubGVuZ3RoOyByKyspIHtcbiAgICBpZiAociA+PSByb3dzLmxlbmd0aClcbiAgICAgIHJvd3MucHVzaChGcmFnbWVudDIuZW1wdHkpO1xuICAgIGlmICh3aWR0aHNbcl0gPCB3aWR0aCkge1xuICAgICAgY29uc3QgZW1wdHkgPSB0YWJsZU5vZGVUeXBlcyhzY2hlbWEpLmNlbGwuY3JlYXRlQW5kRmlsbCgpO1xuICAgICAgY29uc3QgY2VsbHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSB3aWR0aHNbcl07IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgICAgIGNlbGxzLnB1c2goZW1wdHkpO1xuICAgICAgfVxuICAgICAgcm93c1tyXSA9IHJvd3Nbcl0uYXBwZW5kKEZyYWdtZW50Mi5mcm9tKGNlbGxzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGhlaWdodDogcm93cy5sZW5ndGgsIHdpZHRoLCByb3dzIH07XG59XG5mdW5jdGlvbiBmaXRTbGljZShub2RlVHlwZSwgc2xpY2UpIHtcbiAgY29uc3Qgbm9kZSA9IG5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTtcbiAgY29uc3QgdHIgPSBuZXcgVHJhbnNmb3JtKG5vZGUpLnJlcGxhY2UoMCwgbm9kZS5jb250ZW50LnNpemUsIHNsaWNlKTtcbiAgcmV0dXJuIHRyLmRvYztcbn1cbmZ1bmN0aW9uIGNsaXBDZWxscyh7IHdpZHRoLCBoZWlnaHQsIHJvd3MgfSwgbmV3V2lkdGgsIG5ld0hlaWdodCkge1xuICBpZiAod2lkdGggIT0gbmV3V2lkdGgpIHtcbiAgICBjb25zdCBhZGRlZCA9IFtdO1xuICAgIGNvbnN0IG5ld1Jvd3MgPSBbXTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dzLmxlbmd0aDsgcm93KyspIHtcbiAgICAgIGNvbnN0IGZyYWcgPSByb3dzW3Jvd10sIGNlbGxzID0gW107XG4gICAgICBmb3IgKGxldCBjb2wgPSBhZGRlZFtyb3ddIHx8IDAsIGkgPSAwOyBjb2wgPCBuZXdXaWR0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjZWxsID0gZnJhZy5jaGlsZChpICUgZnJhZy5jaGlsZENvdW50KTtcbiAgICAgICAgaWYgKGNvbCArIGNlbGwuYXR0cnMuY29sc3BhbiA+IG5ld1dpZHRoKVxuICAgICAgICAgIGNlbGwgPSBjZWxsLnR5cGUuY3JlYXRlQ2hlY2tlZChcbiAgICAgICAgICAgIHJlbW92ZUNvbFNwYW4oXG4gICAgICAgICAgICAgIGNlbGwuYXR0cnMsXG4gICAgICAgICAgICAgIGNlbGwuYXR0cnMuY29sc3BhbixcbiAgICAgICAgICAgICAgY29sICsgY2VsbC5hdHRycy5jb2xzcGFuIC0gbmV3V2lkdGhcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRcbiAgICAgICAgICApO1xuICAgICAgICBjZWxscy5wdXNoKGNlbGwpO1xuICAgICAgICBjb2wgKz0gY2VsbC5hdHRycy5jb2xzcGFuO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGNlbGwuYXR0cnMucm93c3BhbjsgaisrKVxuICAgICAgICAgIGFkZGVkW3JvdyArIGpdID0gKGFkZGVkW3JvdyArIGpdIHx8IDApICsgY2VsbC5hdHRycy5jb2xzcGFuO1xuICAgICAgfVxuICAgICAgbmV3Um93cy5wdXNoKEZyYWdtZW50Mi5mcm9tKGNlbGxzKSk7XG4gICAgfVxuICAgIHJvd3MgPSBuZXdSb3dzO1xuICAgIHdpZHRoID0gbmV3V2lkdGg7XG4gIH1cbiAgaWYgKGhlaWdodCAhPSBuZXdIZWlnaHQpIHtcbiAgICBjb25zdCBuZXdSb3dzID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMCwgaSA9IDA7IHJvdyA8IG5ld0hlaWdodDsgcm93KyssIGkrKykge1xuICAgICAgY29uc3QgY2VsbHMgPSBbXSwgc291cmNlID0gcm93c1tpICUgaGVpZ2h0XTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc291cmNlLmNoaWxkQ291bnQ7IGorKykge1xuICAgICAgICBsZXQgY2VsbCA9IHNvdXJjZS5jaGlsZChqKTtcbiAgICAgICAgaWYgKHJvdyArIGNlbGwuYXR0cnMucm93c3BhbiA+IG5ld0hlaWdodClcbiAgICAgICAgICBjZWxsID0gY2VsbC50eXBlLmNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgICAgICAgcm93c3BhbjogTWF0aC5tYXgoMSwgbmV3SGVpZ2h0IC0gY2VsbC5hdHRycy5yb3dzcGFuKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNlbGwuY29udGVudFxuICAgICAgICAgICk7XG4gICAgICAgIGNlbGxzLnB1c2goY2VsbCk7XG4gICAgICB9XG4gICAgICBuZXdSb3dzLnB1c2goRnJhZ21lbnQyLmZyb20oY2VsbHMpKTtcbiAgICB9XG4gICAgcm93cyA9IG5ld1Jvd3M7XG4gICAgaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICB9XG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIHJvd3MgfTtcbn1cbmZ1bmN0aW9uIGdyb3dUYWJsZSh0ciwgbWFwLCB0YWJsZSwgc3RhcnQsIHdpZHRoLCBoZWlnaHQsIG1hcEZyb20pIHtcbiAgY29uc3Qgc2NoZW1hID0gdHIuZG9jLnR5cGUuc2NoZW1hO1xuICBjb25zdCB0eXBlcyA9IHRhYmxlTm9kZVR5cGVzKHNjaGVtYSk7XG4gIGxldCBlbXB0eTtcbiAgbGV0IGVtcHR5SGVhZDtcbiAgaWYgKHdpZHRoID4gbWFwLndpZHRoKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMCwgcm93RW5kID0gMDsgcm93IDwgbWFwLmhlaWdodDsgcm93KyspIHtcbiAgICAgIGNvbnN0IHJvd05vZGUgPSB0YWJsZS5jaGlsZChyb3cpO1xuICAgICAgcm93RW5kICs9IHJvd05vZGUubm9kZVNpemU7XG4gICAgICBjb25zdCBjZWxscyA9IFtdO1xuICAgICAgbGV0IGFkZDtcbiAgICAgIGlmIChyb3dOb2RlLmxhc3RDaGlsZCA9PSBudWxsIHx8IHJvd05vZGUubGFzdENoaWxkLnR5cGUgPT0gdHlwZXMuY2VsbClcbiAgICAgICAgYWRkID0gZW1wdHkgfHwgKGVtcHR5ID0gdHlwZXMuY2VsbC5jcmVhdGVBbmRGaWxsKCkpO1xuICAgICAgZWxzZVxuICAgICAgICBhZGQgPSBlbXB0eUhlYWQgfHwgKGVtcHR5SGVhZCA9IHR5cGVzLmhlYWRlcl9jZWxsLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICBmb3IgKGxldCBpID0gbWFwLndpZHRoOyBpIDwgd2lkdGg7IGkrKylcbiAgICAgICAgY2VsbHMucHVzaChhZGQpO1xuICAgICAgdHIuaW5zZXJ0KHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHJvd0VuZCAtIDEgKyBzdGFydCksIGNlbGxzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGhlaWdodCA+IG1hcC5oZWlnaHQpIHtcbiAgICBjb25zdCBjZWxscyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdGFydDIgPSAobWFwLmhlaWdodCAtIDEpICogbWFwLndpZHRoOyBpIDwgTWF0aC5tYXgobWFwLndpZHRoLCB3aWR0aCk7IGkrKykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaSA+PSBtYXAud2lkdGggPyBmYWxzZSA6IHRhYmxlLm5vZGVBdChtYXAubWFwW3N0YXJ0MiArIGldKS50eXBlID09IHR5cGVzLmhlYWRlcl9jZWxsO1xuICAgICAgY2VsbHMucHVzaChcbiAgICAgICAgaGVhZGVyID8gZW1wdHlIZWFkIHx8IChlbXB0eUhlYWQgPSB0eXBlcy5oZWFkZXJfY2VsbC5jcmVhdGVBbmRGaWxsKCkpIDogZW1wdHkgfHwgKGVtcHR5ID0gdHlwZXMuY2VsbC5jcmVhdGVBbmRGaWxsKCkpXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBlbXB0eVJvdyA9IHR5cGVzLnJvdy5jcmVhdGUobnVsbCwgRnJhZ21lbnQyLmZyb20oY2VsbHMpKSwgcm93cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBtYXAuaGVpZ2h0OyBpIDwgaGVpZ2h0OyBpKyspXG4gICAgICByb3dzLnB1c2goZW1wdHlSb3cpO1xuICAgIHRyLmluc2VydCh0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChzdGFydCArIHRhYmxlLm5vZGVTaXplIC0gMiksIHJvd3MpO1xuICB9XG4gIHJldHVybiAhIShlbXB0eSB8fCBlbXB0eUhlYWQpO1xufVxuZnVuY3Rpb24gaXNvbGF0ZUhvcml6b250YWwodHIsIG1hcCwgdGFibGUsIHN0YXJ0LCBsZWZ0LCByaWdodCwgdG9wLCBtYXBGcm9tKSB7XG4gIGlmICh0b3AgPT0gMCB8fCB0b3AgPT0gbWFwLmhlaWdodClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGxldCBmb3VuZCA9IGZhbHNlO1xuICBmb3IgKGxldCBjb2wgPSBsZWZ0OyBjb2wgPCByaWdodDsgY29sKyspIHtcbiAgICBjb25zdCBpbmRleCA9IHRvcCAqIG1hcC53aWR0aCArIGNvbCwgcG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgaWYgKG1hcC5tYXBbaW5kZXggLSBtYXAud2lkdGhdID09IHBvcykge1xuICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgICAgY29uc3QgeyB0b3A6IGNlbGxUb3AsIGxlZnQ6IGNlbGxMZWZ0IH0gPSBtYXAuZmluZENlbGwocG9zKTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAodHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zICsgc3RhcnQpLCBudWxsLCB7XG4gICAgICAgIC4uLmNlbGwuYXR0cnMsXG4gICAgICAgIHJvd3NwYW46IHRvcCAtIGNlbGxUb3BcbiAgICAgIH0pO1xuICAgICAgdHIuaW5zZXJ0KFxuICAgICAgICB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChtYXAucG9zaXRpb25BdCh0b3AsIGNlbGxMZWZ0LCB0YWJsZSkpLFxuICAgICAgICBjZWxsLnR5cGUuY3JlYXRlQW5kRmlsbCh7XG4gICAgICAgICAgLi4uY2VsbC5hdHRycyxcbiAgICAgICAgICByb3dzcGFuOiBjZWxsVG9wICsgY2VsbC5hdHRycy5yb3dzcGFuIC0gdG9wXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29sICs9IGNlbGwuYXR0cnMuY29sc3BhbiAtIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGlzb2xhdGVWZXJ0aWNhbCh0ciwgbWFwLCB0YWJsZSwgc3RhcnQsIHRvcCwgYm90dG9tLCBsZWZ0LCBtYXBGcm9tKSB7XG4gIGlmIChsZWZ0ID09IDAgfHwgbGVmdCA9PSBtYXAud2lkdGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgcm93ID0gdG9wOyByb3cgPCBib3R0b207IHJvdysrKSB7XG4gICAgY29uc3QgaW5kZXggPSByb3cgKiBtYXAud2lkdGggKyBsZWZ0LCBwb3MgPSBtYXAubWFwW2luZGV4XTtcbiAgICBpZiAobWFwLm1hcFtpbmRleCAtIDFdID09IHBvcykge1xuICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgICAgY29uc3QgY2VsbExlZnQgPSBtYXAuY29sQ291bnQocG9zKTtcbiAgICAgIGNvbnN0IHVwZGF0ZVBvcyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyArIHN0YXJ0KTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgIHVwZGF0ZVBvcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcmVtb3ZlQ29sU3BhbihcbiAgICAgICAgICBjZWxsLmF0dHJzLFxuICAgICAgICAgIGxlZnQgLSBjZWxsTGVmdCxcbiAgICAgICAgICBjZWxsLmF0dHJzLmNvbHNwYW4gLSAobGVmdCAtIGNlbGxMZWZ0KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgdHIuaW5zZXJ0KFxuICAgICAgICB1cGRhdGVQb3MgKyBjZWxsLm5vZGVTaXplLFxuICAgICAgICBjZWxsLnR5cGUuY3JlYXRlQW5kRmlsbChcbiAgICAgICAgICByZW1vdmVDb2xTcGFuKGNlbGwuYXR0cnMsIDAsIGxlZnQgLSBjZWxsTGVmdClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJvdyArPSBjZWxsLmF0dHJzLnJvd3NwYW4gLSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBpbnNlcnRDZWxscyhzdGF0ZSwgZGlzcGF0Y2gsIHRhYmxlU3RhcnQsIHJlY3QsIGNlbGxzKSB7XG4gIGxldCB0YWJsZSA9IHRhYmxlU3RhcnQgPyBzdGF0ZS5kb2Mubm9kZUF0KHRhYmxlU3RhcnQgLSAxKSA6IHN0YXRlLmRvYztcbiAgaWYgKCF0YWJsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHRhYmxlIGZvdW5kXCIpO1xuICB9XG4gIGxldCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICBjb25zdCB7IHRvcCwgbGVmdCB9ID0gcmVjdDtcbiAgY29uc3QgcmlnaHQgPSBsZWZ0ICsgY2VsbHMud2lkdGgsIGJvdHRvbSA9IHRvcCArIGNlbGxzLmhlaWdodDtcbiAgY29uc3QgdHIgPSBzdGF0ZS50cjtcbiAgbGV0IG1hcEZyb20gPSAwO1xuICBmdW5jdGlvbiByZWNvbXAoKSB7XG4gICAgdGFibGUgPSB0YWJsZVN0YXJ0ID8gdHIuZG9jLm5vZGVBdCh0YWJsZVN0YXJ0IC0gMSkgOiB0ci5kb2M7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFibGUgZm91bmRcIik7XG4gICAgfVxuICAgIG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gICAgbWFwRnJvbSA9IHRyLm1hcHBpbmcubWFwcy5sZW5ndGg7XG4gIH1cbiAgaWYgKGdyb3dUYWJsZSh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgcmlnaHQsIGJvdHRvbSwgbWFwRnJvbSkpXG4gICAgcmVjb21wKCk7XG4gIGlmIChpc29sYXRlSG9yaXpvbnRhbCh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgbGVmdCwgcmlnaHQsIHRvcCwgbWFwRnJvbSkpXG4gICAgcmVjb21wKCk7XG4gIGlmIChpc29sYXRlSG9yaXpvbnRhbCh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgbWFwRnJvbSkpXG4gICAgcmVjb21wKCk7XG4gIGlmIChpc29sYXRlVmVydGljYWwodHIsIG1hcCwgdGFibGUsIHRhYmxlU3RhcnQsIHRvcCwgYm90dG9tLCBsZWZ0LCBtYXBGcm9tKSlcbiAgICByZWNvbXAoKTtcbiAgaWYgKGlzb2xhdGVWZXJ0aWNhbCh0ciwgbWFwLCB0YWJsZSwgdGFibGVTdGFydCwgdG9wLCBib3R0b20sIHJpZ2h0LCBtYXBGcm9tKSlcbiAgICByZWNvbXAoKTtcbiAgZm9yIChsZXQgcm93ID0gdG9wOyByb3cgPCBib3R0b207IHJvdysrKSB7XG4gICAgY29uc3QgZnJvbSA9IG1hcC5wb3NpdGlvbkF0KHJvdywgbGVmdCwgdGFibGUpLCB0byA9IG1hcC5wb3NpdGlvbkF0KHJvdywgcmlnaHQsIHRhYmxlKTtcbiAgICB0ci5yZXBsYWNlKFxuICAgICAgdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAoZnJvbSArIHRhYmxlU3RhcnQpLFxuICAgICAgdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAodG8gKyB0YWJsZVN0YXJ0KSxcbiAgICAgIG5ldyBTbGljZTIoY2VsbHMucm93c1tyb3cgLSB0b3BdLCAwLCAwKVxuICAgICk7XG4gIH1cbiAgcmVjb21wKCk7XG4gIHRyLnNldFNlbGVjdGlvbihcbiAgICBuZXcgQ2VsbFNlbGVjdGlvbihcbiAgICAgIHRyLmRvYy5yZXNvbHZlKHRhYmxlU3RhcnQgKyBtYXAucG9zaXRpb25BdCh0b3AsIGxlZnQsIHRhYmxlKSksXG4gICAgICB0ci5kb2MucmVzb2x2ZSh0YWJsZVN0YXJ0ICsgbWFwLnBvc2l0aW9uQXQoYm90dG9tIC0gMSwgcmlnaHQgLSAxLCB0YWJsZSkpXG4gICAgKVxuICApO1xuICBkaXNwYXRjaCh0cik7XG59XG5cbi8vIHNyYy9pbnB1dC50c1xudmFyIGhhbmRsZUtleURvd24gPSBrZXlkb3duSGFuZGxlcih7XG4gIEFycm93TGVmdDogYXJyb3coXCJob3JpelwiLCAtMSksXG4gIEFycm93UmlnaHQ6IGFycm93KFwiaG9yaXpcIiwgMSksXG4gIEFycm93VXA6IGFycm93KFwidmVydFwiLCAtMSksXG4gIEFycm93RG93bjogYXJyb3coXCJ2ZXJ0XCIsIDEpLFxuICBcIlNoaWZ0LUFycm93TGVmdFwiOiBzaGlmdEFycm93KFwiaG9yaXpcIiwgLTEpLFxuICBcIlNoaWZ0LUFycm93UmlnaHRcIjogc2hpZnRBcnJvdyhcImhvcml6XCIsIDEpLFxuICBcIlNoaWZ0LUFycm93VXBcIjogc2hpZnRBcnJvdyhcInZlcnRcIiwgLTEpLFxuICBcIlNoaWZ0LUFycm93RG93blwiOiBzaGlmdEFycm93KFwidmVydFwiLCAxKSxcbiAgQmFja3NwYWNlOiBkZWxldGVDZWxsU2VsZWN0aW9uLFxuICBcIk1vZC1CYWNrc3BhY2VcIjogZGVsZXRlQ2VsbFNlbGVjdGlvbixcbiAgRGVsZXRlOiBkZWxldGVDZWxsU2VsZWN0aW9uLFxuICBcIk1vZC1EZWxldGVcIjogZGVsZXRlQ2VsbFNlbGVjdGlvblxufSk7XG5mdW5jdGlvbiBtYXliZVNldFNlbGVjdGlvbihzdGF0ZSwgZGlzcGF0Y2gsIHNlbGVjdGlvbikge1xuICBpZiAoc2VsZWN0aW9uLmVxKHN0YXRlLnNlbGVjdGlvbikpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpXG4gICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYXJyb3coYXhpcywgZGlyKSB7XG4gIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgaWYgKCF2aWV3KVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgQ2VsbFNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIG1heWJlU2V0U2VsZWN0aW9uKFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIFNlbGVjdGlvbjIubmVhcihzZWwuJGhlYWRDZWxsLCBkaXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXhpcyAhPSBcImhvcml6XCIgJiYgIXNlbC5lbXB0eSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbmQgPSBhdEVuZE9mQ2VsbCh2aWV3LCBheGlzLCBkaXIpO1xuICAgIGlmIChlbmQgPT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXhpcyA9PSBcImhvcml6XCIpIHtcbiAgICAgIHJldHVybiBtYXliZVNldFNlbGVjdGlvbihcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGRpc3BhdGNoLFxuICAgICAgICBTZWxlY3Rpb24yLm5lYXIoc3RhdGUuZG9jLnJlc29sdmUoc2VsLmhlYWQgKyBkaXIpLCBkaXIpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkY2VsbCA9IHN0YXRlLmRvYy5yZXNvbHZlKGVuZCk7XG4gICAgICBjb25zdCAkbmV4dCA9IG5leHRDZWxsKCRjZWxsLCBheGlzLCBkaXIpO1xuICAgICAgbGV0IG5ld1NlbDtcbiAgICAgIGlmICgkbmV4dClcbiAgICAgICAgbmV3U2VsID0gU2VsZWN0aW9uMi5uZWFyKCRuZXh0LCAxKTtcbiAgICAgIGVsc2UgaWYgKGRpciA8IDApXG4gICAgICAgIG5ld1NlbCA9IFNlbGVjdGlvbjIubmVhcihzdGF0ZS5kb2MucmVzb2x2ZSgkY2VsbC5iZWZvcmUoLTEpKSwgLTEpO1xuICAgICAgZWxzZVxuICAgICAgICBuZXdTZWwgPSBTZWxlY3Rpb24yLm5lYXIoc3RhdGUuZG9jLnJlc29sdmUoJGNlbGwuYWZ0ZXIoLTEpKSwgMSk7XG4gICAgICByZXR1cm4gbWF5YmVTZXRTZWxlY3Rpb24oc3RhdGUsIGRpc3BhdGNoLCBuZXdTZWwpO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHNoaWZ0QXJyb3coYXhpcywgZGlyKSB7XG4gIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgaWYgKCF2aWV3KVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgY2VsbFNlbDtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgQ2VsbFNlbGVjdGlvbikge1xuICAgICAgY2VsbFNlbCA9IHNlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZW5kID0gYXRFbmRPZkNlbGwodmlldywgYXhpcywgZGlyKTtcbiAgICAgIGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2VsbFNlbCA9IG5ldyBDZWxsU2VsZWN0aW9uKHN0YXRlLmRvYy5yZXNvbHZlKGVuZCkpO1xuICAgIH1cbiAgICBjb25zdCAkaGVhZCA9IG5leHRDZWxsKGNlbGxTZWwuJGhlYWRDZWxsLCBheGlzLCBkaXIpO1xuICAgIGlmICghJGhlYWQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG1heWJlU2V0U2VsZWN0aW9uKFxuICAgICAgc3RhdGUsXG4gICAgICBkaXNwYXRjaCxcbiAgICAgIG5ldyBDZWxsU2VsZWN0aW9uKGNlbGxTZWwuJGFuY2hvckNlbGwsICRoZWFkKVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBkZWxldGVDZWxsU2VsZWN0aW9uKHN0YXRlLCBkaXNwYXRjaCkge1xuICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gIGlmICghKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgdHIgPSBzdGF0ZS50cjtcbiAgICBjb25zdCBiYXNlQ29udGVudCA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSkuY2VsbC5jcmVhdGVBbmRGaWxsKCkuY29udGVudDtcbiAgICBzZWwuZm9yRWFjaENlbGwoKGNlbGwsIHBvcykgPT4ge1xuICAgICAgaWYgKCFjZWxsLmNvbnRlbnQuZXEoYmFzZUNvbnRlbnQpKVxuICAgICAgICB0ci5yZXBsYWNlKFxuICAgICAgICAgIHRyLm1hcHBpbmcubWFwKHBvcyArIDEpLFxuICAgICAgICAgIHRyLm1hcHBpbmcubWFwKHBvcyArIGNlbGwubm9kZVNpemUgLSAxKSxcbiAgICAgICAgICBuZXcgU2xpY2UzKGJhc2VDb250ZW50LCAwLCAwKVxuICAgICAgICApO1xuICAgIH0pO1xuICAgIGlmICh0ci5kb2NDaGFuZ2VkKVxuICAgICAgZGlzcGF0Y2godHIpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gaGFuZGxlVHJpcGxlQ2xpY2sodmlldywgcG9zKSB7XG4gIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jLCAkY2VsbCA9IGNlbGxBcm91bmQoZG9jLnJlc29sdmUocG9zKSk7XG4gIGlmICghJGNlbGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKG5ldyBDZWxsU2VsZWN0aW9uKCRjZWxsKSkpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVBhc3RlKHZpZXcsIF8sIHNsaWNlKSB7XG4gIGlmICghaXNJblRhYmxlKHZpZXcuc3RhdGUpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IGNlbGxzID0gcGFzdGVkQ2VsbHMoc2xpY2UpO1xuICBjb25zdCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgaWYgKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pIHtcbiAgICBpZiAoIWNlbGxzKVxuICAgICAgY2VsbHMgPSB7XG4gICAgICAgIHdpZHRoOiAxLFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIHJvd3M6IFtcbiAgICAgICAgICBGcmFnbWVudDMuZnJvbShcbiAgICAgICAgICAgIGZpdFNsaWNlKHRhYmxlTm9kZVR5cGVzKHZpZXcuc3RhdGUuc2NoZW1hKS5jZWxsLCBzbGljZSlcbiAgICAgICAgICApXG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgY29uc3QgdGFibGUgPSBzZWwuJGFuY2hvckNlbGwubm9kZSgtMSk7XG4gICAgY29uc3Qgc3RhcnQgPSBzZWwuJGFuY2hvckNlbGwuc3RhcnQoLTEpO1xuICAgIGNvbnN0IHJlY3QgPSBUYWJsZU1hcC5nZXQodGFibGUpLnJlY3RCZXR3ZWVuKFxuICAgICAgc2VsLiRhbmNob3JDZWxsLnBvcyAtIHN0YXJ0LFxuICAgICAgc2VsLiRoZWFkQ2VsbC5wb3MgLSBzdGFydFxuICAgICk7XG4gICAgY2VsbHMgPSBjbGlwQ2VsbHMoY2VsbHMsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3ApO1xuICAgIGluc2VydENlbGxzKHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gsIHN0YXJ0LCByZWN0LCBjZWxscyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoY2VsbHMpIHtcbiAgICBjb25zdCAkY2VsbCA9IHNlbGVjdGlvbkNlbGwodmlldy5zdGF0ZSk7XG4gICAgY29uc3Qgc3RhcnQgPSAkY2VsbC5zdGFydCgtMSk7XG4gICAgaW5zZXJ0Q2VsbHMoXG4gICAgICB2aWV3LnN0YXRlLFxuICAgICAgdmlldy5kaXNwYXRjaCxcbiAgICAgIHN0YXJ0LFxuICAgICAgVGFibGVNYXAuZ2V0KCRjZWxsLm5vZGUoLTEpKS5maW5kQ2VsbCgkY2VsbC5wb3MgLSBzdGFydCksXG4gICAgICBjZWxsc1xuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVNb3VzZURvd24odmlldywgc3RhcnRFdmVudCkge1xuICB2YXIgX2E7XG4gIGlmIChzdGFydEV2ZW50LmN0cmxLZXkgfHwgc3RhcnRFdmVudC5tZXRhS2V5KVxuICAgIHJldHVybjtcbiAgY29uc3Qgc3RhcnRET01DZWxsID0gZG9tSW5DZWxsKHZpZXcsIHN0YXJ0RXZlbnQudGFyZ2V0KTtcbiAgbGV0ICRhbmNob3I7XG4gIGlmIChzdGFydEV2ZW50LnNoaWZ0S2V5ICYmIHZpZXcuc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgQ2VsbFNlbGVjdGlvbikge1xuICAgIHNldENlbGxTZWxlY3Rpb24odmlldy5zdGF0ZS5zZWxlY3Rpb24uJGFuY2hvckNlbGwsIHN0YXJ0RXZlbnQpO1xuICAgIHN0YXJ0RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSBlbHNlIGlmIChzdGFydEV2ZW50LnNoaWZ0S2V5ICYmIHN0YXJ0RE9NQ2VsbCAmJiAoJGFuY2hvciA9IGNlbGxBcm91bmQodmlldy5zdGF0ZS5zZWxlY3Rpb24uJGFuY2hvcikpICE9IG51bGwgJiYgKChfYSA9IGNlbGxVbmRlck1vdXNlKHZpZXcsIHN0YXJ0RXZlbnQpKSA9PSBudWxsID8gdm9pZCAwIDogX2EucG9zKSAhPSAkYW5jaG9yLnBvcykge1xuICAgIHNldENlbGxTZWxlY3Rpb24oJGFuY2hvciwgc3RhcnRFdmVudCk7XG4gICAgc3RhcnRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9IGVsc2UgaWYgKCFzdGFydERPTUNlbGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZnVuY3Rpb24gc2V0Q2VsbFNlbGVjdGlvbigkYW5jaG9yMiwgZXZlbnQpIHtcbiAgICBsZXQgJGhlYWQgPSBjZWxsVW5kZXJNb3VzZSh2aWV3LCBldmVudCk7XG4gICAgY29uc3Qgc3RhcnRpbmcgPSB0YWJsZUVkaXRpbmdLZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSkgPT0gbnVsbDtcbiAgICBpZiAoISRoZWFkIHx8ICFpblNhbWVUYWJsZSgkYW5jaG9yMiwgJGhlYWQpKSB7XG4gICAgICBpZiAoc3RhcnRpbmcpXG4gICAgICAgICRoZWFkID0gJGFuY2hvcjI7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gbmV3IENlbGxTZWxlY3Rpb24oJGFuY2hvcjIsICRoZWFkKTtcbiAgICBpZiAoc3RhcnRpbmcgfHwgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLmVxKHNlbGVjdGlvbikpIHtcbiAgICAgIGNvbnN0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICAgIGlmIChzdGFydGluZylcbiAgICAgICAgdHIuc2V0TWV0YSh0YWJsZUVkaXRpbmdLZXksICRhbmNob3IyLnBvcyk7XG4gICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB2aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgc3RvcCk7XG4gICAgdmlldy5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkcmFnc3RhcnRcIiwgc3RvcCk7XG4gICAgdmlldy5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW92ZSk7XG4gICAgaWYgKHRhYmxlRWRpdGluZ0tleS5nZXRTdGF0ZSh2aWV3LnN0YXRlKSAhPSBudWxsKVxuICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldE1ldGEodGFibGVFZGl0aW5nS2V5LCAtMSkpO1xuICB9XG4gIGZ1bmN0aW9uIG1vdmUoX2V2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSBfZXZlbnQ7XG4gICAgY29uc3QgYW5jaG9yID0gdGFibGVFZGl0aW5nS2V5LmdldFN0YXRlKHZpZXcuc3RhdGUpO1xuICAgIGxldCAkYW5jaG9yMjtcbiAgICBpZiAoYW5jaG9yICE9IG51bGwpIHtcbiAgICAgICRhbmNob3IyID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShhbmNob3IpO1xuICAgIH0gZWxzZSBpZiAoZG9tSW5DZWxsKHZpZXcsIGV2ZW50LnRhcmdldCkgIT0gc3RhcnRET01DZWxsKSB7XG4gICAgICAkYW5jaG9yMiA9IGNlbGxVbmRlck1vdXNlKHZpZXcsIHN0YXJ0RXZlbnQpO1xuICAgICAgaWYgKCEkYW5jaG9yMilcbiAgICAgICAgcmV0dXJuIHN0b3AoKTtcbiAgICB9XG4gICAgaWYgKCRhbmNob3IyKVxuICAgICAgc2V0Q2VsbFNlbGVjdGlvbigkYW5jaG9yMiwgZXZlbnQpO1xuICB9XG4gIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBzdG9wKTtcbiAgdmlldy5yb290LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnc3RhcnRcIiwgc3RvcCk7XG4gIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIG1vdmUpO1xufVxuZnVuY3Rpb24gYXRFbmRPZkNlbGwodmlldywgYXhpcywgZGlyKSB7XG4gIGlmICghKHZpZXcuc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbjIpKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCB7ICRoZWFkIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgZm9yIChsZXQgZCA9ICRoZWFkLmRlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICBjb25zdCBwYXJlbnQgPSAkaGVhZC5ub2RlKGQpLCBpbmRleCA9IGRpciA8IDAgPyAkaGVhZC5pbmRleChkKSA6ICRoZWFkLmluZGV4QWZ0ZXIoZCk7XG4gICAgaWYgKGluZGV4ICE9IChkaXIgPCAwID8gMCA6IHBhcmVudC5jaGlsZENvdW50KSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChwYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcImNlbGxcIiB8fCBwYXJlbnQudHlwZS5zcGVjLnRhYmxlUm9sZSA9PSBcImhlYWRlcl9jZWxsXCIpIHtcbiAgICAgIGNvbnN0IGNlbGxQb3MgPSAkaGVhZC5iZWZvcmUoZCk7XG4gICAgICBjb25zdCBkaXJTdHIgPSBheGlzID09IFwidmVydFwiID8gZGlyID4gMCA/IFwiZG93blwiIDogXCJ1cFwiIDogZGlyID4gMCA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuICAgICAgcmV0dXJuIHZpZXcuZW5kT2ZUZXh0YmxvY2soZGlyU3RyKSA/IGNlbGxQb3MgOiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRvbUluQ2VsbCh2aWV3LCBkb20pIHtcbiAgZm9yICg7IGRvbSAmJiBkb20gIT0gdmlldy5kb207IGRvbSA9IGRvbS5wYXJlbnROb2RlKSB7XG4gICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIlREXCIgfHwgZG9tLm5vZGVOYW1lID09IFwiVEhcIikge1xuICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjZWxsVW5kZXJNb3VzZSh2aWV3LCBldmVudCkge1xuICBjb25zdCBtb3VzZVBvcyA9IHZpZXcucG9zQXRDb29yZHMoe1xuICAgIGxlZnQ6IGV2ZW50LmNsaWVudFgsXG4gICAgdG9wOiBldmVudC5jbGllbnRZXG4gIH0pO1xuICBpZiAoIW1vdXNlUG9zKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gbW91c2VQb3MgPyBjZWxsQXJvdW5kKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUobW91c2VQb3MucG9zKSkgOiBudWxsO1xufVxuXG4vLyBzcmMvY29sdW1ucmVzaXppbmcudHNcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IGFzIFBsdWdpbktleTMgfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmltcG9ydCB7XG4gIERlY29yYXRpb24gYXMgRGVjb3JhdGlvbjIsXG4gIERlY29yYXRpb25TZXQgYXMgRGVjb3JhdGlvblNldDJcbn0gZnJvbSBcInByb3NlbWlycm9yLXZpZXdcIjtcblxuLy8gc3JjL3RhYmxldmlldy50c1xudmFyIFRhYmxlVmlldyA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3Iobm9kZSwgY2VsbE1pbldpZHRoKSB7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB0aGlzLmNlbGxNaW5XaWR0aCA9IGNlbGxNaW5XaWR0aDtcbiAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJ0YWJsZVdyYXBwZXJcIjtcbiAgICB0aGlzLnRhYmxlID0gdGhpcy5kb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIpKTtcbiAgICB0aGlzLmNvbGdyb3VwID0gdGhpcy50YWJsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29sZ3JvdXBcIikpO1xuICAgIHVwZGF0ZUNvbHVtbnNPblJlc2l6ZShub2RlLCB0aGlzLmNvbGdyb3VwLCB0aGlzLnRhYmxlLCBjZWxsTWluV2lkdGgpO1xuICAgIHRoaXMuY29udGVudERPTSA9IHRoaXMudGFibGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRib2R5XCIpKTtcbiAgfVxuICB1cGRhdGUobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT0gdGhpcy5ub2RlLnR5cGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB1cGRhdGVDb2x1bW5zT25SZXNpemUobm9kZSwgdGhpcy5jb2xncm91cCwgdGhpcy50YWJsZSwgdGhpcy5jZWxsTWluV2lkdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlnbm9yZU11dGF0aW9uKHJlY29yZCkge1xuICAgIHJldHVybiByZWNvcmQudHlwZSA9PSBcImF0dHJpYnV0ZXNcIiAmJiAocmVjb3JkLnRhcmdldCA9PSB0aGlzLnRhYmxlIHx8IHRoaXMuY29sZ3JvdXAuY29udGFpbnMocmVjb3JkLnRhcmdldCkpO1xuICB9XG59O1xuZnVuY3Rpb24gdXBkYXRlQ29sdW1uc09uUmVzaXplKG5vZGUsIGNvbGdyb3VwLCB0YWJsZSwgY2VsbE1pbldpZHRoLCBvdmVycmlkZUNvbCwgb3ZlcnJpZGVWYWx1ZSkge1xuICB2YXIgX2E7XG4gIGxldCB0b3RhbFdpZHRoID0gMDtcbiAgbGV0IGZpeGVkV2lkdGggPSB0cnVlO1xuICBsZXQgbmV4dERPTSA9IGNvbGdyb3VwLmZpcnN0Q2hpbGQ7XG4gIGNvbnN0IHJvdyA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgaWYgKCFyb3cpXG4gICAgcmV0dXJuO1xuICBmb3IgKGxldCBpID0gMCwgY29sID0gMDsgaSA8IHJvdy5jaGlsZENvdW50OyBpKyspIHtcbiAgICBjb25zdCB7IGNvbHNwYW4sIGNvbHdpZHRoIH0gPSByb3cuY2hpbGQoaSkuYXR0cnM7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzcGFuOyBqKyssIGNvbCsrKSB7XG4gICAgICBjb25zdCBoYXNXaWR0aCA9IG92ZXJyaWRlQ29sID09IGNvbCA/IG92ZXJyaWRlVmFsdWUgOiBjb2x3aWR0aCAmJiBjb2x3aWR0aFtqXTtcbiAgICAgIGNvbnN0IGNzc1dpZHRoID0gaGFzV2lkdGggPyBoYXNXaWR0aCArIFwicHhcIiA6IFwiXCI7XG4gICAgICB0b3RhbFdpZHRoICs9IGhhc1dpZHRoIHx8IGNlbGxNaW5XaWR0aDtcbiAgICAgIGlmICghaGFzV2lkdGgpXG4gICAgICAgIGZpeGVkV2lkdGggPSBmYWxzZTtcbiAgICAgIGlmICghbmV4dERPTSkge1xuICAgICAgICBjb2xncm91cC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29sXCIpKS5zdHlsZS53aWR0aCA9IGNzc1dpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5leHRET00uc3R5bGUud2lkdGggIT0gY3NzV2lkdGgpXG4gICAgICAgICAgbmV4dERPTS5zdHlsZS53aWR0aCA9IGNzc1dpZHRoO1xuICAgICAgICBuZXh0RE9NID0gbmV4dERPTS5uZXh0U2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgd2hpbGUgKG5leHRET00pIHtcbiAgICBjb25zdCBhZnRlciA9IG5leHRET00ubmV4dFNpYmxpbmc7XG4gICAgKF9hID0gbmV4dERPTS5wYXJlbnROb2RlKSA9PSBudWxsID8gdm9pZCAwIDogX2EucmVtb3ZlQ2hpbGQobmV4dERPTSk7XG4gICAgbmV4dERPTSA9IGFmdGVyO1xuICB9XG4gIGlmIChmaXhlZFdpZHRoKSB7XG4gICAgdGFibGUuc3R5bGUud2lkdGggPSB0b3RhbFdpZHRoICsgXCJweFwiO1xuICAgIHRhYmxlLnN0eWxlLm1pbldpZHRoID0gXCJcIjtcbiAgfSBlbHNlIHtcbiAgICB0YWJsZS5zdHlsZS53aWR0aCA9IFwiXCI7XG4gICAgdGFibGUuc3R5bGUubWluV2lkdGggPSB0b3RhbFdpZHRoICsgXCJweFwiO1xuICB9XG59XG5cbi8vIHNyYy9jb2x1bW5yZXNpemluZy50c1xudmFyIGNvbHVtblJlc2l6aW5nUGx1Z2luS2V5ID0gbmV3IFBsdWdpbktleTMoXG4gIFwidGFibGVDb2x1bW5SZXNpemluZ1wiXG4pO1xuZnVuY3Rpb24gY29sdW1uUmVzaXppbmcoe1xuICBoYW5kbGVXaWR0aCA9IDUsXG4gIGNlbGxNaW5XaWR0aCA9IDI1LFxuICBWaWV3ID0gVGFibGVWaWV3LFxuICBsYXN0Q29sdW1uUmVzaXphYmxlID0gdHJ1ZVxufSA9IHt9KSB7XG4gIGNvbnN0IHBsdWdpbiA9IG5ldyBQbHVnaW4oe1xuICAgIGtleTogY29sdW1uUmVzaXppbmdQbHVnaW5LZXksXG4gICAgc3RhdGU6IHtcbiAgICAgIGluaXQoXywgc3RhdGUpIHtcbiAgICAgICAgcGx1Z2luLnNwZWMucHJvcHMubm9kZVZpZXdzW3RhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSkudGFibGUubmFtZV0gPSAobm9kZSwgdmlldykgPT4gbmV3IFZpZXcobm9kZSwgY2VsbE1pbldpZHRoLCB2aWV3KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNpemVTdGF0ZSgtMSwgZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGFwcGx5KHRyLCBwcmV2KSB7XG4gICAgICAgIHJldHVybiBwcmV2LmFwcGx5KHRyKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHByb3BzOiB7XG4gICAgICBhdHRyaWJ1dGVzOiAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luU3RhdGUgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIHJldHVybiBwbHVnaW5TdGF0ZSAmJiBwbHVnaW5TdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSA/IHsgY2xhc3M6IFwicmVzaXplLWN1cnNvclwiIH0gOiB7fTtcbiAgICAgIH0sXG4gICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgbW91c2Vtb3ZlOiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgICBoYW5kbGVNb3VzZU1vdmUoXG4gICAgICAgICAgICB2aWV3LFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBoYW5kbGVXaWR0aCxcbiAgICAgICAgICAgIGNlbGxNaW5XaWR0aCxcbiAgICAgICAgICAgIGxhc3RDb2x1bW5SZXNpemFibGVcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBtb3VzZWxlYXZlOiAodmlldykgPT4ge1xuICAgICAgICAgIGhhbmRsZU1vdXNlTGVhdmUodmlldyk7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdXNlZG93bjogKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgaGFuZGxlTW91c2VEb3duMih2aWV3LCBldmVudCwgY2VsbE1pbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlY29yYXRpb25zOiAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luU3RhdGUgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIGlmIChwbHVnaW5TdGF0ZSAmJiBwbHVnaW5TdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSkge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVEZWNvcmF0aW9ucyhzdGF0ZSwgcGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG5vZGVWaWV3czoge31cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGx1Z2luO1xufVxudmFyIFJlc2l6ZVN0YXRlID0gY2xhc3MgX1Jlc2l6ZVN0YXRlIHtcbiAgY29uc3RydWN0b3IoYWN0aXZlSGFuZGxlLCBkcmFnZ2luZykge1xuICAgIHRoaXMuYWN0aXZlSGFuZGxlID0gYWN0aXZlSGFuZGxlO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBkcmFnZ2luZztcbiAgfVxuICBhcHBseSh0cikge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcztcbiAgICBjb25zdCBhY3Rpb24gPSB0ci5nZXRNZXRhKGNvbHVtblJlc2l6aW5nUGx1Z2luS2V5KTtcbiAgICBpZiAoYWN0aW9uICYmIGFjdGlvbi5zZXRIYW5kbGUgIT0gbnVsbClcbiAgICAgIHJldHVybiBuZXcgX1Jlc2l6ZVN0YXRlKGFjdGlvbi5zZXRIYW5kbGUsIGZhbHNlKTtcbiAgICBpZiAoYWN0aW9uICYmIGFjdGlvbi5zZXREcmFnZ2luZyAhPT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIG5ldyBfUmVzaXplU3RhdGUoc3RhdGUuYWN0aXZlSGFuZGxlLCBhY3Rpb24uc2V0RHJhZ2dpbmcpO1xuICAgIGlmIChzdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSAmJiB0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICBsZXQgaGFuZGxlID0gdHIubWFwcGluZy5tYXAoc3RhdGUuYWN0aXZlSGFuZGxlLCAtMSk7XG4gICAgICBpZiAoIXBvaW50c0F0Q2VsbCh0ci5kb2MucmVzb2x2ZShoYW5kbGUpKSkge1xuICAgICAgICBoYW5kbGUgPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgX1Jlc2l6ZVN0YXRlKGhhbmRsZSwgc3RhdGUuZHJhZ2dpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn07XG5mdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUodmlldywgZXZlbnQsIGhhbmRsZVdpZHRoLCBjZWxsTWluV2lkdGgsIGxhc3RDb2x1bW5SZXNpemFibGUpIHtcbiAgY29uc3QgcGx1Z2luU3RhdGUgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgaWYgKCFwbHVnaW5TdGF0ZSlcbiAgICByZXR1cm47XG4gIGlmICghcGx1Z2luU3RhdGUuZHJhZ2dpbmcpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBkb21DZWxsQXJvdW5kKGV2ZW50LnRhcmdldCk7XG4gICAgbGV0IGNlbGwgPSAtMTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0IH0gPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoZXZlbnQuY2xpZW50WCAtIGxlZnQgPD0gaGFuZGxlV2lkdGgpXG4gICAgICAgIGNlbGwgPSBlZGdlQ2VsbCh2aWV3LCBldmVudCwgXCJsZWZ0XCIsIGhhbmRsZVdpZHRoKTtcbiAgICAgIGVsc2UgaWYgKHJpZ2h0IC0gZXZlbnQuY2xpZW50WCA8PSBoYW5kbGVXaWR0aClcbiAgICAgICAgY2VsbCA9IGVkZ2VDZWxsKHZpZXcsIGV2ZW50LCBcInJpZ2h0XCIsIGhhbmRsZVdpZHRoKTtcbiAgICB9XG4gICAgaWYgKGNlbGwgIT0gcGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlKSB7XG4gICAgICBpZiAoIWxhc3RDb2x1bW5SZXNpemFibGUgJiYgY2VsbCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgJGNlbGwgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGNlbGwpO1xuICAgICAgICBjb25zdCB0YWJsZSA9ICRjZWxsLm5vZGUoLTEpO1xuICAgICAgICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZVN0YXJ0ID0gJGNlbGwuc3RhcnQoLTEpO1xuICAgICAgICBjb25zdCBjb2wgPSBtYXAuY29sQ291bnQoJGNlbGwucG9zIC0gdGFibGVTdGFydCkgKyAkY2VsbC5ub2RlQWZ0ZXIuYXR0cnMuY29sc3BhbiAtIDE7XG4gICAgICAgIGlmIChjb2wgPT0gbWFwLndpZHRoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdXBkYXRlSGFuZGxlKHZpZXcsIGNlbGwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlTW91c2VMZWF2ZSh2aWV3KSB7XG4gIGNvbnN0IHBsdWdpblN0YXRlID0gY29sdW1uUmVzaXppbmdQbHVnaW5LZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSk7XG4gIGlmIChwbHVnaW5TdGF0ZSAmJiBwbHVnaW5TdGF0ZS5hY3RpdmVIYW5kbGUgPiAtMSAmJiAhcGx1Z2luU3RhdGUuZHJhZ2dpbmcpXG4gICAgdXBkYXRlSGFuZGxlKHZpZXcsIC0xKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bjIodmlldywgZXZlbnQsIGNlbGxNaW5XaWR0aCkge1xuICBjb25zdCBwbHVnaW5TdGF0ZSA9IGNvbHVtblJlc2l6aW5nUGx1Z2luS2V5LmdldFN0YXRlKHZpZXcuc3RhdGUpO1xuICBpZiAoIXBsdWdpblN0YXRlIHx8IHBsdWdpblN0YXRlLmFjdGl2ZUhhbmRsZSA9PSAtMSB8fCBwbHVnaW5TdGF0ZS5kcmFnZ2luZylcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGNlbGwgPSB2aWV3LnN0YXRlLmRvYy5ub2RlQXQocGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlKTtcbiAgY29uc3Qgd2lkdGggPSBjdXJyZW50Q29sV2lkdGgodmlldywgcGx1Z2luU3RhdGUuYWN0aXZlSGFuZGxlLCBjZWxsLmF0dHJzKTtcbiAgdmlldy5kaXNwYXRjaChcbiAgICB2aWV3LnN0YXRlLnRyLnNldE1ldGEoY29sdW1uUmVzaXppbmdQbHVnaW5LZXksIHtcbiAgICAgIHNldERyYWdnaW5nOiB7IHN0YXJ0WDogZXZlbnQuY2xpZW50WCwgc3RhcnRXaWR0aDogd2lkdGggfVxuICAgIH0pXG4gICk7XG4gIGZ1bmN0aW9uIGZpbmlzaChldmVudDIpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZmluaXNoKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3ZlKTtcbiAgICBjb25zdCBwbHVnaW5TdGF0ZTIgPSBjb2x1bW5SZXNpemluZ1BsdWdpbktleS5nZXRTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgICBpZiAocGx1Z2luU3RhdGUyID09IG51bGwgPyB2b2lkIDAgOiBwbHVnaW5TdGF0ZTIuZHJhZ2dpbmcpIHtcbiAgICAgIHVwZGF0ZUNvbHVtbldpZHRoKFxuICAgICAgICB2aWV3LFxuICAgICAgICBwbHVnaW5TdGF0ZTIuYWN0aXZlSGFuZGxlLFxuICAgICAgICBkcmFnZ2VkV2lkdGgocGx1Z2luU3RhdGUyLmRyYWdnaW5nLCBldmVudDIsIGNlbGxNaW5XaWR0aClcbiAgICAgICk7XG4gICAgICB2aWV3LmRpc3BhdGNoKFxuICAgICAgICB2aWV3LnN0YXRlLnRyLnNldE1ldGEoY29sdW1uUmVzaXppbmdQbHVnaW5LZXksIHsgc2V0RHJhZ2dpbmc6IG51bGwgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG1vdmUoZXZlbnQyKSB7XG4gICAgaWYgKCFldmVudDIud2hpY2gpXG4gICAgICByZXR1cm4gZmluaXNoKGV2ZW50Mik7XG4gICAgY29uc3QgcGx1Z2luU3RhdGUyID0gY29sdW1uUmVzaXppbmdQbHVnaW5LZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSk7XG4gICAgaWYgKCFwbHVnaW5TdGF0ZTIpXG4gICAgICByZXR1cm47XG4gICAgaWYgKHBsdWdpblN0YXRlMi5kcmFnZ2luZykge1xuICAgICAgY29uc3QgZHJhZ2dlZCA9IGRyYWdnZWRXaWR0aChwbHVnaW5TdGF0ZTIuZHJhZ2dpbmcsIGV2ZW50MiwgY2VsbE1pbldpZHRoKTtcbiAgICAgIGRpc3BsYXlDb2x1bW5XaWR0aCh2aWV3LCBwbHVnaW5TdGF0ZTIuYWN0aXZlSGFuZGxlLCBkcmFnZ2VkLCBjZWxsTWluV2lkdGgpO1xuICAgIH1cbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZmluaXNoKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgbW92ZSk7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY3VycmVudENvbFdpZHRoKHZpZXcsIGNlbGxQb3MsIHsgY29sc3BhbiwgY29sd2lkdGggfSkge1xuICBjb25zdCB3aWR0aCA9IGNvbHdpZHRoICYmIGNvbHdpZHRoW2NvbHdpZHRoLmxlbmd0aCAtIDFdO1xuICBpZiAod2lkdGgpXG4gICAgcmV0dXJuIHdpZHRoO1xuICBjb25zdCBkb20gPSB2aWV3LmRvbUF0UG9zKGNlbGxQb3MpO1xuICBjb25zdCBub2RlID0gZG9tLm5vZGUuY2hpbGROb2Rlc1tkb20ub2Zmc2V0XTtcbiAgbGV0IGRvbVdpZHRoID0gbm9kZS5vZmZzZXRXaWR0aCwgcGFydHMgPSBjb2xzcGFuO1xuICBpZiAoY29sd2lkdGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHNwYW47IGkrKylcbiAgICAgIGlmIChjb2x3aWR0aFtpXSkge1xuICAgICAgICBkb21XaWR0aCAtPSBjb2x3aWR0aFtpXTtcbiAgICAgICAgcGFydHMtLTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZG9tV2lkdGggLyBwYXJ0cztcbn1cbmZ1bmN0aW9uIGRvbUNlbGxBcm91bmQodGFyZ2V0KSB7XG4gIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVOYW1lICE9IFwiVERcIiAmJiB0YXJnZXQubm9kZU5hbWUgIT0gXCJUSFwiKVxuICAgIHRhcmdldCA9IHRhcmdldC5jbGFzc0xpc3QgJiYgdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcIlByb3NlTWlycm9yXCIpID8gbnVsbCA6IHRhcmdldC5wYXJlbnROb2RlO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZWRnZUNlbGwodmlldywgZXZlbnQsIHNpZGUsIGhhbmRsZVdpZHRoKSB7XG4gIGNvbnN0IG9mZnNldCA9IHNpZGUgPT0gXCJyaWdodFwiID8gLWhhbmRsZVdpZHRoIDogaGFuZGxlV2lkdGg7XG4gIGNvbnN0IGZvdW5kID0gdmlldy5wb3NBdENvb3Jkcyh7XG4gICAgbGVmdDogZXZlbnQuY2xpZW50WCArIG9mZnNldCxcbiAgICB0b3A6IGV2ZW50LmNsaWVudFlcbiAgfSk7XG4gIGlmICghZm91bmQpXG4gICAgcmV0dXJuIC0xO1xuICBjb25zdCB7IHBvcyB9ID0gZm91bmQ7XG4gIGNvbnN0ICRjZWxsID0gY2VsbEFyb3VuZCh2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKHBvcykpO1xuICBpZiAoISRjZWxsKVxuICAgIHJldHVybiAtMTtcbiAgaWYgKHNpZGUgPT0gXCJyaWdodFwiKVxuICAgIHJldHVybiAkY2VsbC5wb3M7XG4gIGNvbnN0IG1hcCA9IFRhYmxlTWFwLmdldCgkY2VsbC5ub2RlKC0xKSksIHN0YXJ0ID0gJGNlbGwuc3RhcnQoLTEpO1xuICBjb25zdCBpbmRleCA9IG1hcC5tYXAuaW5kZXhPZigkY2VsbC5wb3MgLSBzdGFydCk7XG4gIHJldHVybiBpbmRleCAlIG1hcC53aWR0aCA9PSAwID8gLTEgOiBzdGFydCArIG1hcC5tYXBbaW5kZXggLSAxXTtcbn1cbmZ1bmN0aW9uIGRyYWdnZWRXaWR0aChkcmFnZ2luZywgZXZlbnQsIGNlbGxNaW5XaWR0aCkge1xuICBjb25zdCBvZmZzZXQgPSBldmVudC5jbGllbnRYIC0gZHJhZ2dpbmcuc3RhcnRYO1xuICByZXR1cm4gTWF0aC5tYXgoY2VsbE1pbldpZHRoLCBkcmFnZ2luZy5zdGFydFdpZHRoICsgb2Zmc2V0KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhhbmRsZSh2aWV3LCB2YWx1ZSkge1xuICB2aWV3LmRpc3BhdGNoKFxuICAgIHZpZXcuc3RhdGUudHIuc2V0TWV0YShjb2x1bW5SZXNpemluZ1BsdWdpbktleSwgeyBzZXRIYW5kbGU6IHZhbHVlIH0pXG4gICk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb2x1bW5XaWR0aCh2aWV3LCBjZWxsLCB3aWR0aCkge1xuICBjb25zdCAkY2VsbCA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoY2VsbCk7XG4gIGNvbnN0IHRhYmxlID0gJGNlbGwubm9kZSgtMSksIG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSksIHN0YXJ0ID0gJGNlbGwuc3RhcnQoLTEpO1xuICBjb25zdCBjb2wgPSBtYXAuY29sQ291bnQoJGNlbGwucG9zIC0gc3RhcnQpICsgJGNlbGwubm9kZUFmdGVyLmF0dHJzLmNvbHNwYW4gLSAxO1xuICBjb25zdCB0ciA9IHZpZXcuc3RhdGUudHI7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG1hcC5oZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgbWFwSW5kZXggPSByb3cgKiBtYXAud2lkdGggKyBjb2w7XG4gICAgaWYgKHJvdyAmJiBtYXAubWFwW21hcEluZGV4XSA9PSBtYXAubWFwW21hcEluZGV4IC0gbWFwLndpZHRoXSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBvcyA9IG1hcC5tYXBbbWFwSW5kZXhdO1xuICAgIGNvbnN0IGF0dHJzID0gdGFibGUubm9kZUF0KHBvcykuYXR0cnM7XG4gICAgY29uc3QgaW5kZXggPSBhdHRycy5jb2xzcGFuID09IDEgPyAwIDogY29sIC0gbWFwLmNvbENvdW50KHBvcyk7XG4gICAgaWYgKGF0dHJzLmNvbHdpZHRoICYmIGF0dHJzLmNvbHdpZHRoW2luZGV4XSA9PSB3aWR0aClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbHdpZHRoID0gYXR0cnMuY29sd2lkdGggPyBhdHRycy5jb2x3aWR0aC5zbGljZSgpIDogemVyb2VzKGF0dHJzLmNvbHNwYW4pO1xuICAgIGNvbHdpZHRoW2luZGV4XSA9IHdpZHRoO1xuICAgIHRyLnNldE5vZGVNYXJrdXAoc3RhcnQgKyBwb3MsIG51bGwsIHsgLi4uYXR0cnMsIGNvbHdpZHRoIH0pO1xuICB9XG4gIGlmICh0ci5kb2NDaGFuZ2VkKVxuICAgIHZpZXcuZGlzcGF0Y2godHIpO1xufVxuZnVuY3Rpb24gZGlzcGxheUNvbHVtbldpZHRoKHZpZXcsIGNlbGwsIHdpZHRoLCBjZWxsTWluV2lkdGgpIHtcbiAgY29uc3QgJGNlbGwgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGNlbGwpO1xuICBjb25zdCB0YWJsZSA9ICRjZWxsLm5vZGUoLTEpLCBzdGFydCA9ICRjZWxsLnN0YXJ0KC0xKTtcbiAgY29uc3QgY29sID0gVGFibGVNYXAuZ2V0KHRhYmxlKS5jb2xDb3VudCgkY2VsbC5wb3MgLSBzdGFydCkgKyAkY2VsbC5ub2RlQWZ0ZXIuYXR0cnMuY29sc3BhbiAtIDE7XG4gIGxldCBkb20gPSB2aWV3LmRvbUF0UG9zKCRjZWxsLnN0YXJ0KC0xKSkubm9kZTtcbiAgd2hpbGUgKGRvbSAmJiBkb20ubm9kZU5hbWUgIT0gXCJUQUJMRVwiKSB7XG4gICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gIH1cbiAgaWYgKCFkb20pXG4gICAgcmV0dXJuO1xuICB1cGRhdGVDb2x1bW5zT25SZXNpemUoXG4gICAgdGFibGUsXG4gICAgZG9tLmZpcnN0Q2hpbGQsXG4gICAgZG9tLFxuICAgIGNlbGxNaW5XaWR0aCxcbiAgICBjb2wsXG4gICAgd2lkdGhcbiAgKTtcbn1cbmZ1bmN0aW9uIHplcm9lcyhuKSB7XG4gIHJldHVybiBBcnJheShuKS5maWxsKDApO1xufVxuZnVuY3Rpb24gaGFuZGxlRGVjb3JhdGlvbnMoc3RhdGUsIGNlbGwpIHtcbiAgY29uc3QgZGVjb3JhdGlvbnMgPSBbXTtcbiAgY29uc3QgJGNlbGwgPSBzdGF0ZS5kb2MucmVzb2x2ZShjZWxsKTtcbiAgY29uc3QgdGFibGUgPSAkY2VsbC5ub2RlKC0xKTtcbiAgaWYgKCF0YWJsZSkge1xuICAgIHJldHVybiBEZWNvcmF0aW9uU2V0Mi5lbXB0eTtcbiAgfVxuICBjb25zdCBtYXAgPSBUYWJsZU1hcC5nZXQodGFibGUpO1xuICBjb25zdCBzdGFydCA9ICRjZWxsLnN0YXJ0KC0xKTtcbiAgY29uc3QgY29sID0gbWFwLmNvbENvdW50KCRjZWxsLnBvcyAtIHN0YXJ0KSArICRjZWxsLm5vZGVBZnRlci5hdHRycy5jb2xzcGFuO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBtYXAuaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IGluZGV4ID0gY29sICsgcm93ICogbWFwLndpZHRoIC0gMTtcbiAgICBpZiAoKGNvbCA9PSBtYXAud2lkdGggfHwgbWFwLm1hcFtpbmRleF0gIT0gbWFwLm1hcFtpbmRleCArIDFdKSAmJiAocm93ID09IDAgfHwgbWFwLm1hcFtpbmRleF0gIT0gbWFwLm1hcFtpbmRleCAtIG1hcC53aWR0aF0pKSB7XG4gICAgICBjb25zdCBjZWxsUG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgICBjb25zdCBwb3MgPSBzdGFydCArIGNlbGxQb3MgKyB0YWJsZS5ub2RlQXQoY2VsbFBvcykubm9kZVNpemUgLSAxO1xuICAgICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRvbS5jbGFzc05hbWUgPSBcImNvbHVtbi1yZXNpemUtaGFuZGxlXCI7XG4gICAgICBkZWNvcmF0aW9ucy5wdXNoKERlY29yYXRpb24yLndpZGdldChwb3MsIGRvbSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRGVjb3JhdGlvblNldDIuY3JlYXRlKHN0YXRlLmRvYywgZGVjb3JhdGlvbnMpO1xufVxuXG4vLyBzcmMvY29tbWFuZHMudHNcbmltcG9ydCB7IEZyYWdtZW50IGFzIEZyYWdtZW50NCB9IGZyb20gXCJwcm9zZW1pcnJvci1tb2RlbFwiO1xuaW1wb3J0IHtcbiAgVGV4dFNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uM1xufSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmZ1bmN0aW9uIHNlbGVjdGVkUmVjdChzdGF0ZSkge1xuICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gIGNvbnN0ICRwb3MgPSBzZWxlY3Rpb25DZWxsKHN0YXRlKTtcbiAgY29uc3QgdGFibGUgPSAkcG9zLm5vZGUoLTEpO1xuICBjb25zdCB0YWJsZVN0YXJ0ID0gJHBvcy5zdGFydCgtMSk7XG4gIGNvbnN0IG1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gIGNvbnN0IHJlY3QgPSBzZWwgaW5zdGFuY2VvZiBDZWxsU2VsZWN0aW9uID8gbWFwLnJlY3RCZXR3ZWVuKFxuICAgIHNlbC4kYW5jaG9yQ2VsbC5wb3MgLSB0YWJsZVN0YXJ0LFxuICAgIHNlbC4kaGVhZENlbGwucG9zIC0gdGFibGVTdGFydFxuICApIDogbWFwLmZpbmRDZWxsKCRwb3MucG9zIC0gdGFibGVTdGFydCk7XG4gIHJldHVybiB7IC4uLnJlY3QsIHRhYmxlU3RhcnQsIG1hcCwgdGFibGUgfTtcbn1cbmZ1bmN0aW9uIGFkZENvbHVtbih0ciwgeyBtYXAsIHRhYmxlU3RhcnQsIHRhYmxlIH0sIGNvbCkge1xuICBsZXQgcmVmQ29sdW1uID0gY29sID4gMCA/IC0xIDogMDtcbiAgaWYgKGNvbHVtbklzSGVhZGVyKG1hcCwgdGFibGUsIGNvbCArIHJlZkNvbHVtbikpIHtcbiAgICByZWZDb2x1bW4gPSBjb2wgPT0gMCB8fCBjb2wgPT0gbWFwLndpZHRoID8gbnVsbCA6IDA7XG4gIH1cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgbWFwLmhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBpbmRleCA9IHJvdyAqIG1hcC53aWR0aCArIGNvbDtcbiAgICBpZiAoY29sID4gMCAmJiBjb2wgPCBtYXAud2lkdGggJiYgbWFwLm1hcFtpbmRleCAtIDFdID09IG1hcC5tYXBbaW5kZXhdKSB7XG4gICAgICBjb25zdCBwb3MgPSBtYXAubWFwW2luZGV4XTtcbiAgICAgIGNvbnN0IGNlbGwgPSB0YWJsZS5ub2RlQXQocG9zKTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgIHRyLm1hcHBpbmcubWFwKHRhYmxlU3RhcnQgKyBwb3MpLFxuICAgICAgICBudWxsLFxuICAgICAgICBhZGRDb2xTcGFuKGNlbGwuYXR0cnMsIGNvbCAtIG1hcC5jb2xDb3VudChwb3MpKVxuICAgICAgKTtcbiAgICAgIHJvdyArPSBjZWxsLmF0dHJzLnJvd3NwYW4gLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID0gcmVmQ29sdW1uID09IG51bGwgPyB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkuY2VsbCA6IHRhYmxlLm5vZGVBdChtYXAubWFwW2luZGV4ICsgcmVmQ29sdW1uXSkudHlwZTtcbiAgICAgIGNvbnN0IHBvcyA9IG1hcC5wb3NpdGlvbkF0KHJvdywgY29sLCB0YWJsZSk7XG4gICAgICB0ci5pbnNlcnQodHIubWFwcGluZy5tYXAodGFibGVTdGFydCArIHBvcyksIHR5cGUuY3JlYXRlQW5kRmlsbCgpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uQmVmb3JlKHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKTtcbiAgICBkaXNwYXRjaChhZGRDb2x1bW4oc3RhdGUudHIsIHJlY3QsIHJlY3QubGVmdCkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYWRkQ29sdW1uQWZ0ZXIoc3RhdGUsIGRpc3BhdGNoKSB7XG4gIGlmICghaXNJblRhYmxlKHN0YXRlKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHJlY3QgPSBzZWxlY3RlZFJlY3Qoc3RhdGUpO1xuICAgIGRpc3BhdGNoKGFkZENvbHVtbihzdGF0ZS50ciwgcmVjdCwgcmVjdC5yaWdodCkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ29sdW1uKHRyLCB7IG1hcCwgdGFibGUsIHRhYmxlU3RhcnQgfSwgY29sKSB7XG4gIGNvbnN0IG1hcFN0YXJ0ID0gdHIubWFwcGluZy5tYXBzLmxlbmd0aDtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgbWFwLmhlaWdodDsgKSB7XG4gICAgY29uc3QgaW5kZXggPSByb3cgKiBtYXAud2lkdGggKyBjb2w7XG4gICAgY29uc3QgcG9zID0gbWFwLm1hcFtpbmRleF07XG4gICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgIGNvbnN0IGF0dHJzID0gY2VsbC5hdHRycztcbiAgICBpZiAoY29sID4gMCAmJiBtYXAubWFwW2luZGV4IC0gMV0gPT0gcG9zIHx8IGNvbCA8IG1hcC53aWR0aCAtIDEgJiYgbWFwLm1hcFtpbmRleCArIDFdID09IHBvcykge1xuICAgICAgdHIuc2V0Tm9kZU1hcmt1cChcbiAgICAgICAgdHIubWFwcGluZy5zbGljZShtYXBTdGFydCkubWFwKHRhYmxlU3RhcnQgKyBwb3MpLFxuICAgICAgICBudWxsLFxuICAgICAgICByZW1vdmVDb2xTcGFuKGF0dHJzLCBjb2wgLSBtYXAuY29sQ291bnQocG9zKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdHIubWFwcGluZy5zbGljZShtYXBTdGFydCkubWFwKHRhYmxlU3RhcnQgKyBwb3MpO1xuICAgICAgdHIuZGVsZXRlKHN0YXJ0LCBzdGFydCArIGNlbGwubm9kZVNpemUpO1xuICAgIH1cbiAgICByb3cgKz0gYXR0cnMucm93c3BhbjtcbiAgfVxufVxuZnVuY3Rpb24gZGVsZXRlQ29sdW1uKHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKTtcbiAgICBjb25zdCB0ciA9IHN0YXRlLnRyO1xuICAgIGlmIChyZWN0LmxlZnQgPT0gMCAmJiByZWN0LnJpZ2h0ID09IHJlY3QubWFwLndpZHRoKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSByZWN0LnJpZ2h0IC0gMTsgOyBpLS0pIHtcbiAgICAgIHJlbW92ZUNvbHVtbih0ciwgcmVjdCwgaSk7XG4gICAgICBpZiAoaSA9PSByZWN0LmxlZnQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY29uc3QgdGFibGUgPSByZWN0LnRhYmxlU3RhcnQgPyB0ci5kb2Mubm9kZUF0KHJlY3QudGFibGVTdGFydCAtIDEpIDogdHIuZG9jO1xuICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiTm8gdGFibGUgZm91bmRcIik7XG4gICAgICB9XG4gICAgICByZWN0LnRhYmxlID0gdGFibGU7XG4gICAgICByZWN0Lm1hcCA9IFRhYmxlTWFwLmdldCh0YWJsZSk7XG4gICAgfVxuICAgIGRpc3BhdGNoKHRyKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJvd0lzSGVhZGVyKG1hcCwgdGFibGUsIHJvdykge1xuICB2YXIgX2E7XG4gIGNvbnN0IGhlYWRlckNlbGwgPSB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkuaGVhZGVyX2NlbGw7XG4gIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IG1hcC53aWR0aDsgY29sKyspXG4gICAgaWYgKCgoX2EgPSB0YWJsZS5ub2RlQXQobWFwLm1hcFtjb2wgKyByb3cgKiBtYXAud2lkdGhdKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnR5cGUpICE9IGhlYWRlckNlbGwpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYWRkUm93KHRyLCB7IG1hcCwgdGFibGVTdGFydCwgdGFibGUgfSwgcm93KSB7XG4gIHZhciBfYTtcbiAgbGV0IHJvd1BvcyA9IHRhYmxlU3RhcnQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93OyBpKyspXG4gICAgcm93UG9zICs9IHRhYmxlLmNoaWxkKGkpLm5vZGVTaXplO1xuICBjb25zdCBjZWxscyA9IFtdO1xuICBsZXQgcmVmUm93ID0gcm93ID4gMCA/IC0xIDogMDtcbiAgaWYgKHJvd0lzSGVhZGVyKG1hcCwgdGFibGUsIHJvdyArIHJlZlJvdykpXG4gICAgcmVmUm93ID0gcm93ID09IDAgfHwgcm93ID09IG1hcC5oZWlnaHQgPyBudWxsIDogMDtcbiAgZm9yIChsZXQgY29sID0gMCwgaW5kZXggPSBtYXAud2lkdGggKiByb3c7IGNvbCA8IG1hcC53aWR0aDsgY29sKyssIGluZGV4KyspIHtcbiAgICBpZiAocm93ID4gMCAmJiByb3cgPCBtYXAuaGVpZ2h0ICYmIG1hcC5tYXBbaW5kZXhdID09IG1hcC5tYXBbaW5kZXggLSBtYXAud2lkdGhdKSB7XG4gICAgICBjb25zdCBwb3MgPSBtYXAubWFwW2luZGV4XTtcbiAgICAgIGNvbnN0IGF0dHJzID0gdGFibGUubm9kZUF0KHBvcykuYXR0cnM7XG4gICAgICB0ci5zZXROb2RlTWFya3VwKHRhYmxlU3RhcnQgKyBwb3MsIG51bGwsIHtcbiAgICAgICAgLi4uYXR0cnMsXG4gICAgICAgIHJvd3NwYW46IGF0dHJzLnJvd3NwYW4gKyAxXG4gICAgICB9KTtcbiAgICAgIGNvbCArPSBhdHRycy5jb2xzcGFuIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IHJlZlJvdyA9PSBudWxsID8gdGFibGVOb2RlVHlwZXModGFibGUudHlwZS5zY2hlbWEpLmNlbGwgOiAoX2EgPSB0YWJsZS5ub2RlQXQobWFwLm1hcFtpbmRleCArIHJlZlJvdyAqIG1hcC53aWR0aF0pKSA9PSBudWxsID8gdm9pZCAwIDogX2EudHlwZTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0eXBlID09IG51bGwgPyB2b2lkIDAgOiB0eXBlLmNyZWF0ZUFuZEZpbGwoKTtcbiAgICAgIGlmIChub2RlKVxuICAgICAgICBjZWxscy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICB0ci5pbnNlcnQocm93UG9zLCB0YWJsZU5vZGVUeXBlcyh0YWJsZS50eXBlLnNjaGVtYSkucm93LmNyZWF0ZShudWxsLCBjZWxscykpO1xuICByZXR1cm4gdHI7XG59XG5mdW5jdGlvbiBhZGRSb3dCZWZvcmUoc3RhdGUsIGRpc3BhdGNoKSB7XG4gIGlmICghaXNJblRhYmxlKHN0YXRlKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHJlY3QgPSBzZWxlY3RlZFJlY3Qoc3RhdGUpO1xuICAgIGRpc3BhdGNoKGFkZFJvdyhzdGF0ZS50ciwgcmVjdCwgcmVjdC50b3ApKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGFkZFJvd0FmdGVyKHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKTtcbiAgICBkaXNwYXRjaChhZGRSb3coc3RhdGUudHIsIHJlY3QsIHJlY3QuYm90dG9tKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZW1vdmVSb3codHIsIHsgbWFwLCB0YWJsZSwgdGFibGVTdGFydCB9LCByb3cpIHtcbiAgbGV0IHJvd1BvcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93OyBpKyspXG4gICAgcm93UG9zICs9IHRhYmxlLmNoaWxkKGkpLm5vZGVTaXplO1xuICBjb25zdCBuZXh0Um93ID0gcm93UG9zICsgdGFibGUuY2hpbGQocm93KS5ub2RlU2l6ZTtcbiAgY29uc3QgbWFwRnJvbSA9IHRyLm1hcHBpbmcubWFwcy5sZW5ndGg7XG4gIHRyLmRlbGV0ZShyb3dQb3MgKyB0YWJsZVN0YXJ0LCBuZXh0Um93ICsgdGFibGVTdGFydCk7XG4gIGNvbnN0IHNlZW4gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBmb3IgKGxldCBjb2wgPSAwLCBpbmRleCA9IHJvdyAqIG1hcC53aWR0aDsgY29sIDwgbWFwLndpZHRoOyBjb2wrKywgaW5kZXgrKykge1xuICAgIGNvbnN0IHBvcyA9IG1hcC5tYXBbaW5kZXhdO1xuICAgIGlmIChzZWVuLmhhcyhwb3MpKVxuICAgICAgY29udGludWU7XG4gICAgc2Vlbi5hZGQocG9zKTtcbiAgICBpZiAocm93ID4gMCAmJiBwb3MgPT0gbWFwLm1hcFtpbmRleCAtIG1hcC53aWR0aF0pIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gdGFibGUubm9kZUF0KHBvcykuYXR0cnM7XG4gICAgICB0ci5zZXROb2RlTWFya3VwKHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyArIHRhYmxlU3RhcnQpLCBudWxsLCB7XG4gICAgICAgIC4uLmF0dHJzLFxuICAgICAgICByb3dzcGFuOiBhdHRycy5yb3dzcGFuIC0gMVxuICAgICAgfSk7XG4gICAgICBjb2wgKz0gYXR0cnMuY29sc3BhbiAtIDE7XG4gICAgfSBlbHNlIGlmIChyb3cgPCBtYXAuaGVpZ2h0ICYmIHBvcyA9PSBtYXAubWFwW2luZGV4ICsgbWFwLndpZHRoXSkge1xuICAgICAgY29uc3QgY2VsbCA9IHRhYmxlLm5vZGVBdChwb3MpO1xuICAgICAgY29uc3QgYXR0cnMgPSBjZWxsLmF0dHJzO1xuICAgICAgY29uc3QgY29weSA9IGNlbGwudHlwZS5jcmVhdGUoXG4gICAgICAgIHsgLi4uYXR0cnMsIHJvd3NwYW46IGNlbGwuYXR0cnMucm93c3BhbiAtIDEgfSxcbiAgICAgICAgY2VsbC5jb250ZW50XG4gICAgICApO1xuICAgICAgY29uc3QgbmV3UG9zID0gbWFwLnBvc2l0aW9uQXQocm93ICsgMSwgY29sLCB0YWJsZSk7XG4gICAgICB0ci5pbnNlcnQodHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAodGFibGVTdGFydCArIG5ld1BvcyksIGNvcHkpO1xuICAgICAgY29sICs9IGF0dHJzLmNvbHNwYW4gLSAxO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGVsZXRlUm93KHN0YXRlLCBkaXNwYXRjaCkge1xuICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKSwgdHIgPSBzdGF0ZS50cjtcbiAgICBpZiAocmVjdC50b3AgPT0gMCAmJiByZWN0LmJvdHRvbSA9PSByZWN0Lm1hcC5oZWlnaHQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IHJlY3QuYm90dG9tIC0gMTsgOyBpLS0pIHtcbiAgICAgIHJlbW92ZVJvdyh0ciwgcmVjdCwgaSk7XG4gICAgICBpZiAoaSA9PSByZWN0LnRvcClcbiAgICAgICAgYnJlYWs7XG4gICAgICBjb25zdCB0YWJsZSA9IHJlY3QudGFibGVTdGFydCA/IHRyLmRvYy5ub2RlQXQocmVjdC50YWJsZVN0YXJ0IC0gMSkgOiB0ci5kb2M7XG4gICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJObyB0YWJsZSBmb3VuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJlY3QudGFibGUgPSB0YWJsZTtcbiAgICAgIHJlY3QubWFwID0gVGFibGVNYXAuZ2V0KHJlY3QudGFibGUpO1xuICAgIH1cbiAgICBkaXNwYXRjaCh0cik7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBpc0VtcHR5KGNlbGwpIHtcbiAgY29uc3QgYyA9IGNlbGwuY29udGVudDtcbiAgcmV0dXJuIGMuY2hpbGRDb3VudCA9PSAxICYmIGMuY2hpbGQoMCkuaXNUZXh0YmxvY2sgJiYgYy5jaGlsZCgwKS5jaGlsZENvdW50ID09IDA7XG59XG5mdW5jdGlvbiBjZWxsc092ZXJsYXBSZWN0YW5nbGUoeyB3aWR0aCwgaGVpZ2h0LCBtYXAgfSwgcmVjdCkge1xuICBsZXQgaW5kZXhUb3AgPSByZWN0LnRvcCAqIHdpZHRoICsgcmVjdC5sZWZ0LCBpbmRleExlZnQgPSBpbmRleFRvcDtcbiAgbGV0IGluZGV4Qm90dG9tID0gKHJlY3QuYm90dG9tIC0gMSkgKiB3aWR0aCArIHJlY3QubGVmdCwgaW5kZXhSaWdodCA9IGluZGV4VG9wICsgKHJlY3QucmlnaHQgLSByZWN0LmxlZnQgLSAxKTtcbiAgZm9yIChsZXQgaSA9IHJlY3QudG9wOyBpIDwgcmVjdC5ib3R0b207IGkrKykge1xuICAgIGlmIChyZWN0LmxlZnQgPiAwICYmIG1hcFtpbmRleExlZnRdID09IG1hcFtpbmRleExlZnQgLSAxXSB8fCByZWN0LnJpZ2h0IDwgd2lkdGggJiYgbWFwW2luZGV4UmlnaHRdID09IG1hcFtpbmRleFJpZ2h0ICsgMV0pXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpbmRleExlZnQgKz0gd2lkdGg7XG4gICAgaW5kZXhSaWdodCArPSB3aWR0aDtcbiAgfVxuICBmb3IgKGxldCBpID0gcmVjdC5sZWZ0OyBpIDwgcmVjdC5yaWdodDsgaSsrKSB7XG4gICAgaWYgKHJlY3QudG9wID4gMCAmJiBtYXBbaW5kZXhUb3BdID09IG1hcFtpbmRleFRvcCAtIHdpZHRoXSB8fCByZWN0LmJvdHRvbSA8IGhlaWdodCAmJiBtYXBbaW5kZXhCb3R0b21dID09IG1hcFtpbmRleEJvdHRvbSArIHdpZHRoXSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGluZGV4VG9wKys7XG4gICAgaW5kZXhCb3R0b20rKztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBtZXJnZUNlbGxzKHN0YXRlLCBkaXNwYXRjaCkge1xuICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gIGlmICghKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pIHx8IHNlbC4kYW5jaG9yQ2VsbC5wb3MgPT0gc2VsLiRoZWFkQ2VsbC5wb3MpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKSwgeyBtYXAgfSA9IHJlY3Q7XG4gIGlmIChjZWxsc092ZXJsYXBSZWN0YW5nbGUobWFwLCByZWN0KSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChkaXNwYXRjaCkge1xuICAgIGNvbnN0IHRyID0gc3RhdGUudHI7XG4gICAgY29uc3Qgc2VlbiA9IHt9O1xuICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQ0LmVtcHR5O1xuICAgIGxldCBtZXJnZWRQb3M7XG4gICAgbGV0IG1lcmdlZENlbGw7XG4gICAgZm9yIChsZXQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gcmVjdC5sZWZ0OyBjb2wgPCByZWN0LnJpZ2h0OyBjb2wrKykge1xuICAgICAgICBjb25zdCBjZWxsUG9zID0gbWFwLm1hcFtyb3cgKiBtYXAud2lkdGggKyBjb2xdO1xuICAgICAgICBjb25zdCBjZWxsID0gcmVjdC50YWJsZS5ub2RlQXQoY2VsbFBvcyk7XG4gICAgICAgIGlmIChzZWVuW2NlbGxQb3NdIHx8ICFjZWxsKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBzZWVuW2NlbGxQb3NdID0gdHJ1ZTtcbiAgICAgICAgaWYgKG1lcmdlZFBvcyA9PSBudWxsKSB7XG4gICAgICAgICAgbWVyZ2VkUG9zID0gY2VsbFBvcztcbiAgICAgICAgICBtZXJnZWRDZWxsID0gY2VsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWlzRW1wdHkoY2VsbCkpXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5hcHBlbmQoY2VsbC5jb250ZW50KTtcbiAgICAgICAgICBjb25zdCBtYXBwZWQgPSB0ci5tYXBwaW5nLm1hcChjZWxsUG9zICsgcmVjdC50YWJsZVN0YXJ0KTtcbiAgICAgICAgICB0ci5kZWxldGUobWFwcGVkLCBtYXBwZWQgKyBjZWxsLm5vZGVTaXplKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWVyZ2VkUG9zID09IG51bGwgfHwgbWVyZ2VkQ2VsbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdHIuc2V0Tm9kZU1hcmt1cChtZXJnZWRQb3MgKyByZWN0LnRhYmxlU3RhcnQsIG51bGwsIHtcbiAgICAgIC4uLmFkZENvbFNwYW4oXG4gICAgICAgIG1lcmdlZENlbGwuYXR0cnMsXG4gICAgICAgIG1lcmdlZENlbGwuYXR0cnMuY29sc3BhbixcbiAgICAgICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCAtIG1lcmdlZENlbGwuYXR0cnMuY29sc3BhblxuICAgICAgKSxcbiAgICAgIHJvd3NwYW46IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICB9KTtcbiAgICBpZiAoY29udGVudC5zaXplKSB7XG4gICAgICBjb25zdCBlbmQgPSBtZXJnZWRQb3MgKyAxICsgbWVyZ2VkQ2VsbC5jb250ZW50LnNpemU7XG4gICAgICBjb25zdCBzdGFydCA9IGlzRW1wdHkobWVyZ2VkQ2VsbCkgPyBtZXJnZWRQb3MgKyAxIDogZW5kO1xuICAgICAgdHIucmVwbGFjZVdpdGgoc3RhcnQgKyByZWN0LnRhYmxlU3RhcnQsIGVuZCArIHJlY3QudGFibGVTdGFydCwgY29udGVudCk7XG4gICAgfVxuICAgIHRyLnNldFNlbGVjdGlvbihcbiAgICAgIG5ldyBDZWxsU2VsZWN0aW9uKHRyLmRvYy5yZXNvbHZlKG1lcmdlZFBvcyArIHJlY3QudGFibGVTdGFydCkpXG4gICAgKTtcbiAgICBkaXNwYXRjaCh0cik7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBzcGxpdENlbGwoc3RhdGUsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IG5vZGVUeXBlcyA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSk7XG4gIHJldHVybiBzcGxpdENlbGxXaXRoVHlwZSgoeyBub2RlIH0pID0+IHtcbiAgICByZXR1cm4gbm9kZVR5cGVzW25vZGUudHlwZS5zcGVjLnRhYmxlUm9sZV07XG4gIH0pKHN0YXRlLCBkaXNwYXRjaCk7XG59XG5mdW5jdGlvbiBzcGxpdENlbGxXaXRoVHlwZShnZXRDZWxsVHlwZSkge1xuICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IGNlbGxOb2RlO1xuICAgIGxldCBjZWxsUG9zO1xuICAgIGlmICghKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pKSB7XG4gICAgICBjZWxsTm9kZSA9IGNlbGxXcmFwcGluZyhzZWwuJGZyb20pO1xuICAgICAgaWYgKCFjZWxsTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2VsbFBvcyA9IChfYSA9IGNlbGxBcm91bmQoc2VsLiRmcm9tKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNlbC4kYW5jaG9yQ2VsbC5wb3MgIT0gc2VsLiRoZWFkQ2VsbC5wb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNlbGxOb2RlID0gc2VsLiRhbmNob3JDZWxsLm5vZGVBZnRlcjtcbiAgICAgIGNlbGxQb3MgPSBzZWwuJGFuY2hvckNlbGwucG9zO1xuICAgIH1cbiAgICBpZiAoY2VsbE5vZGUgPT0gbnVsbCB8fCBjZWxsUG9zID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNlbGxOb2RlLmF0dHJzLmNvbHNwYW4gPT0gMSAmJiBjZWxsTm9kZS5hdHRycy5yb3dzcGFuID09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBsZXQgYmFzZUF0dHJzID0gY2VsbE5vZGUuYXR0cnM7XG4gICAgICBjb25zdCBhdHRycyA9IFtdO1xuICAgICAgY29uc3QgY29sd2lkdGggPSBiYXNlQXR0cnMuY29sd2lkdGg7XG4gICAgICBpZiAoYmFzZUF0dHJzLnJvd3NwYW4gPiAxKVxuICAgICAgICBiYXNlQXR0cnMgPSB7IC4uLmJhc2VBdHRycywgcm93c3BhbjogMSB9O1xuICAgICAgaWYgKGJhc2VBdHRycy5jb2xzcGFuID4gMSlcbiAgICAgICAgYmFzZUF0dHJzID0geyAuLi5iYXNlQXR0cnMsIGNvbHNwYW46IDEgfTtcbiAgICAgIGNvbnN0IHJlY3QgPSBzZWxlY3RlZFJlY3Qoc3RhdGUpLCB0ciA9IHN0YXRlLnRyO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OyBpKyspXG4gICAgICAgIGF0dHJzLnB1c2goXG4gICAgICAgICAgY29sd2lkdGggPyB7XG4gICAgICAgICAgICAuLi5iYXNlQXR0cnMsXG4gICAgICAgICAgICBjb2x3aWR0aDogY29sd2lkdGggJiYgY29sd2lkdGhbaV0gPyBbY29sd2lkdGhbaV1dIDogbnVsbFxuICAgICAgICAgIH0gOiBiYXNlQXR0cnNcbiAgICAgICAgKTtcbiAgICAgIGxldCBsYXN0Q2VsbDtcbiAgICAgIGZvciAobGV0IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHtcbiAgICAgICAgbGV0IHBvcyA9IHJlY3QubWFwLnBvc2l0aW9uQXQocm93LCByZWN0LmxlZnQsIHJlY3QudGFibGUpO1xuICAgICAgICBpZiAocm93ID09IHJlY3QudG9wKVxuICAgICAgICAgIHBvcyArPSBjZWxsTm9kZS5ub2RlU2l6ZTtcbiAgICAgICAgZm9yIChsZXQgY29sID0gcmVjdC5sZWZ0LCBpID0gMDsgY29sIDwgcmVjdC5yaWdodDsgY29sKyssIGkrKykge1xuICAgICAgICAgIGlmIChjb2wgPT0gcmVjdC5sZWZ0ICYmIHJvdyA9PSByZWN0LnRvcClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIHRyLmluc2VydChcbiAgICAgICAgICAgIGxhc3RDZWxsID0gdHIubWFwcGluZy5tYXAocG9zICsgcmVjdC50YWJsZVN0YXJ0LCAxKSxcbiAgICAgICAgICAgIGdldENlbGxUeXBlKHsgbm9kZTogY2VsbE5vZGUsIHJvdywgY29sIH0pLmNyZWF0ZUFuZEZpbGwoYXR0cnNbaV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHIuc2V0Tm9kZU1hcmt1cChcbiAgICAgICAgY2VsbFBvcyxcbiAgICAgICAgZ2V0Q2VsbFR5cGUoeyBub2RlOiBjZWxsTm9kZSwgcm93OiByZWN0LnRvcCwgY29sOiByZWN0LmxlZnQgfSksXG4gICAgICAgIGF0dHJzWzBdXG4gICAgICApO1xuICAgICAgaWYgKHNlbCBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb24pXG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihcbiAgICAgICAgICBuZXcgQ2VsbFNlbGVjdGlvbihcbiAgICAgICAgICAgIHRyLmRvYy5yZXNvbHZlKHNlbC4kYW5jaG9yQ2VsbC5wb3MpLFxuICAgICAgICAgICAgbGFzdENlbGwgPyB0ci5kb2MucmVzb2x2ZShsYXN0Q2VsbCkgOiB2b2lkIDBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuZnVuY3Rpb24gc2V0Q2VsbEF0dHIobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgIGlmICghaXNJblRhYmxlKHN0YXRlKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCAkY2VsbCA9IHNlbGVjdGlvbkNlbGwoc3RhdGUpO1xuICAgIGlmICgkY2VsbC5ub2RlQWZ0ZXIuYXR0cnNbbmFtZV0gPT09IHZhbHVlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgY29uc3QgdHIgPSBzdGF0ZS50cjtcbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBDZWxsU2VsZWN0aW9uKVxuICAgICAgICBzdGF0ZS5zZWxlY3Rpb24uZm9yRWFjaENlbGwoKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgIGlmIChub2RlLmF0dHJzW25hbWVdICE9PSB2YWx1ZSlcbiAgICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAocG9zLCBudWxsLCB7XG4gICAgICAgICAgICAgIC4uLm5vZGUuYXR0cnMsXG4gICAgICAgICAgICAgIFtuYW1lXTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIGVsc2VcbiAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cCgkY2VsbC5wb3MsIG51bGwsIHtcbiAgICAgICAgICAuLi4kY2VsbC5ub2RlQWZ0ZXIuYXR0cnMsXG4gICAgICAgICAgW25hbWVdOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5mdW5jdGlvbiBkZXByZWNhdGVkX3RvZ2dsZUhlYWRlcih0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICBpZiAoIWlzSW5UYWJsZShzdGF0ZSkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICBjb25zdCB0eXBlcyA9IHRhYmxlTm9kZVR5cGVzKHN0YXRlLnNjaGVtYSk7XG4gICAgICBjb25zdCByZWN0ID0gc2VsZWN0ZWRSZWN0KHN0YXRlKSwgdHIgPSBzdGF0ZS50cjtcbiAgICAgIGNvbnN0IGNlbGxzID0gcmVjdC5tYXAuY2VsbHNJblJlY3QoXG4gICAgICAgIHR5cGUgPT0gXCJjb2x1bW5cIiA/IHtcbiAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxuICAgICAgICAgIGJvdHRvbTogcmVjdC5tYXAuaGVpZ2h0XG4gICAgICAgIH0gOiB0eXBlID09IFwicm93XCIgPyB7XG4gICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgICAgIHJpZ2h0OiByZWN0Lm1hcC53aWR0aCxcbiAgICAgICAgICBib3R0b206IHJlY3QuYm90dG9tXG4gICAgICAgIH0gOiByZWN0XG4gICAgICApO1xuICAgICAgY29uc3Qgbm9kZXMgPSBjZWxscy5tYXAoKHBvcykgPT4gcmVjdC50YWJsZS5ub2RlQXQocG9zKSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAobm9kZXNbaV0udHlwZSA9PSB0eXBlcy5oZWFkZXJfY2VsbClcbiAgICAgICAgICB0ci5zZXROb2RlTWFya3VwKFxuICAgICAgICAgICAgcmVjdC50YWJsZVN0YXJ0ICsgY2VsbHNbaV0sXG4gICAgICAgICAgICB0eXBlcy5jZWxsLFxuICAgICAgICAgICAgbm9kZXNbaV0uYXR0cnNcbiAgICAgICAgICApO1xuICAgICAgaWYgKHRyLnN0ZXBzLmxlbmd0aCA9PSAwKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAoXG4gICAgICAgICAgICByZWN0LnRhYmxlU3RhcnQgKyBjZWxsc1tpXSxcbiAgICAgICAgICAgIHR5cGVzLmhlYWRlcl9jZWxsLFxuICAgICAgICAgICAgbm9kZXNbaV0uYXR0cnNcbiAgICAgICAgICApO1xuICAgICAgZGlzcGF0Y2godHIpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGlzSGVhZGVyRW5hYmxlZEJ5VHlwZSh0eXBlLCByZWN0LCB0eXBlcykge1xuICBjb25zdCBjZWxsUG9zaXRpb25zID0gcmVjdC5tYXAuY2VsbHNJblJlY3Qoe1xuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiB0eXBlID09IFwicm93XCIgPyByZWN0Lm1hcC53aWR0aCA6IDEsXG4gICAgYm90dG9tOiB0eXBlID09IFwiY29sdW1uXCIgPyByZWN0Lm1hcC5oZWlnaHQgOiAxXG4gIH0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbGxQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjZWxsID0gcmVjdC50YWJsZS5ub2RlQXQoY2VsbFBvc2l0aW9uc1tpXSk7XG4gICAgaWYgKGNlbGwgJiYgY2VsbC50eXBlICE9PSB0eXBlcy5oZWFkZXJfY2VsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZUhlYWRlcih0eXBlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHsgdXNlRGVwcmVjYXRlZExvZ2ljOiBmYWxzZSB9O1xuICBpZiAob3B0aW9ucy51c2VEZXByZWNhdGVkTG9naWMpXG4gICAgcmV0dXJuIGRlcHJlY2F0ZWRfdG9nZ2xlSGVhZGVyKHR5cGUpO1xuICByZXR1cm4gZnVuY3Rpb24oc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgaWYgKCFpc0luVGFibGUoc3RhdGUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgY29uc3QgdHlwZXMgPSB0YWJsZU5vZGVUeXBlcyhzdGF0ZS5zY2hlbWEpO1xuICAgICAgY29uc3QgcmVjdCA9IHNlbGVjdGVkUmVjdChzdGF0ZSksIHRyID0gc3RhdGUudHI7XG4gICAgICBjb25zdCBpc0hlYWRlclJvd0VuYWJsZWQgPSBpc0hlYWRlckVuYWJsZWRCeVR5cGUoXCJyb3dcIiwgcmVjdCwgdHlwZXMpO1xuICAgICAgY29uc3QgaXNIZWFkZXJDb2x1bW5FbmFibGVkID0gaXNIZWFkZXJFbmFibGVkQnlUeXBlKFxuICAgICAgICBcImNvbHVtblwiLFxuICAgICAgICByZWN0LFxuICAgICAgICB0eXBlc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzSGVhZGVyRW5hYmxlZCA9IHR5cGUgPT09IFwiY29sdW1uXCIgPyBpc0hlYWRlclJvd0VuYWJsZWQgOiB0eXBlID09PSBcInJvd1wiID8gaXNIZWFkZXJDb2x1bW5FbmFibGVkIDogZmFsc2U7XG4gICAgICBjb25zdCBzZWxlY3Rpb25TdGFydHNBdCA9IGlzSGVhZGVyRW5hYmxlZCA/IDEgOiAwO1xuICAgICAgY29uc3QgY2VsbHNSZWN0ID0gdHlwZSA9PSBcImNvbHVtblwiID8ge1xuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IHNlbGVjdGlvblN0YXJ0c0F0LFxuICAgICAgICByaWdodDogMSxcbiAgICAgICAgYm90dG9tOiByZWN0Lm1hcC5oZWlnaHRcbiAgICAgIH0gOiB0eXBlID09IFwicm93XCIgPyB7XG4gICAgICAgIGxlZnQ6IHNlbGVjdGlvblN0YXJ0c0F0LFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIHJpZ2h0OiByZWN0Lm1hcC53aWR0aCxcbiAgICAgICAgYm90dG9tOiAxXG4gICAgICB9IDogcmVjdDtcbiAgICAgIGNvbnN0IG5ld1R5cGUgPSB0eXBlID09IFwiY29sdW1uXCIgPyBpc0hlYWRlckNvbHVtbkVuYWJsZWQgPyB0eXBlcy5jZWxsIDogdHlwZXMuaGVhZGVyX2NlbGwgOiB0eXBlID09IFwicm93XCIgPyBpc0hlYWRlclJvd0VuYWJsZWQgPyB0eXBlcy5jZWxsIDogdHlwZXMuaGVhZGVyX2NlbGwgOiB0eXBlcy5jZWxsO1xuICAgICAgcmVjdC5tYXAuY2VsbHNJblJlY3QoY2VsbHNSZWN0KS5mb3JFYWNoKChyZWxhdGl2ZUNlbGxQb3MpID0+IHtcbiAgICAgICAgY29uc3QgY2VsbFBvcyA9IHJlbGF0aXZlQ2VsbFBvcyArIHJlY3QudGFibGVTdGFydDtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRyLmRvYy5ub2RlQXQoY2VsbFBvcyk7XG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cChjZWxsUG9zLCBuZXdUeXBlLCBjZWxsLmF0dHJzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxudmFyIHRvZ2dsZUhlYWRlclJvdyA9IHRvZ2dsZUhlYWRlcihcInJvd1wiLCB7XG4gIHVzZURlcHJlY2F0ZWRMb2dpYzogdHJ1ZVxufSk7XG52YXIgdG9nZ2xlSGVhZGVyQ29sdW1uID0gdG9nZ2xlSGVhZGVyKFwiY29sdW1uXCIsIHtcbiAgdXNlRGVwcmVjYXRlZExvZ2ljOiB0cnVlXG59KTtcbnZhciB0b2dnbGVIZWFkZXJDZWxsID0gdG9nZ2xlSGVhZGVyKFwiY2VsbFwiLCB7XG4gIHVzZURlcHJlY2F0ZWRMb2dpYzogdHJ1ZVxufSk7XG5mdW5jdGlvbiBmaW5kTmV4dENlbGwoJGNlbGwsIGRpcikge1xuICBpZiAoZGlyIDwgMCkge1xuICAgIGNvbnN0IGJlZm9yZSA9ICRjZWxsLm5vZGVCZWZvcmU7XG4gICAgaWYgKGJlZm9yZSlcbiAgICAgIHJldHVybiAkY2VsbC5wb3MgLSBiZWZvcmUubm9kZVNpemU7XG4gICAgZm9yIChsZXQgcm93ID0gJGNlbGwuaW5kZXgoLTEpIC0gMSwgcm93RW5kID0gJGNlbGwuYmVmb3JlKCk7IHJvdyA+PSAwOyByb3ctLSkge1xuICAgICAgY29uc3Qgcm93Tm9kZSA9ICRjZWxsLm5vZGUoLTEpLmNoaWxkKHJvdyk7XG4gICAgICBjb25zdCBsYXN0Q2hpbGQgPSByb3dOb2RlLmxhc3RDaGlsZDtcbiAgICAgIGlmIChsYXN0Q2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIHJvd0VuZCAtIDEgLSBsYXN0Q2hpbGQubm9kZVNpemU7XG4gICAgICB9XG4gICAgICByb3dFbmQgLT0gcm93Tm9kZS5ub2RlU2l6ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCRjZWxsLmluZGV4KCkgPCAkY2VsbC5wYXJlbnQuY2hpbGRDb3VudCAtIDEpIHtcbiAgICAgIHJldHVybiAkY2VsbC5wb3MgKyAkY2VsbC5ub2RlQWZ0ZXIubm9kZVNpemU7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gJGNlbGwubm9kZSgtMSk7XG4gICAgZm9yIChsZXQgcm93ID0gJGNlbGwuaW5kZXhBZnRlcigtMSksIHJvd1N0YXJ0ID0gJGNlbGwuYWZ0ZXIoKTsgcm93IDwgdGFibGUuY2hpbGRDb3VudDsgcm93KyspIHtcbiAgICAgIGNvbnN0IHJvd05vZGUgPSB0YWJsZS5jaGlsZChyb3cpO1xuICAgICAgaWYgKHJvd05vZGUuY2hpbGRDb3VudClcbiAgICAgICAgcmV0dXJuIHJvd1N0YXJ0ICsgMTtcbiAgICAgIHJvd1N0YXJ0ICs9IHJvd05vZGUubm9kZVNpemU7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ29Ub05leHRDZWxsKGRpcmVjdGlvbikge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgaWYgKCFpc0luVGFibGUoc3RhdGUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNlbGwgPSBmaW5kTmV4dENlbGwoc2VsZWN0aW9uQ2VsbChzdGF0ZSksIGRpcmVjdGlvbik7XG4gICAgaWYgKGNlbGwgPT0gbnVsbClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgIGNvbnN0ICRjZWxsID0gc3RhdGUuZG9jLnJlc29sdmUoY2VsbCk7XG4gICAgICBkaXNwYXRjaChcbiAgICAgICAgc3RhdGUudHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24zLmJldHdlZW4oJGNlbGwsIG1vdmVDZWxsRm9yd2FyZCgkY2VsbCkpKS5zY3JvbGxJbnRvVmlldygpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZVRhYmxlKHN0YXRlLCBkaXNwYXRjaCkge1xuICBjb25zdCAkcG9zID0gc3RhdGUuc2VsZWN0aW9uLiRhbmNob3I7XG4gIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOyBkID4gMDsgZC0tKSB7XG4gICAgY29uc3Qgbm9kZSA9ICRwb3Mubm9kZShkKTtcbiAgICBpZiAobm9kZS50eXBlLnNwZWMudGFibGVSb2xlID09IFwidGFibGVcIikge1xuICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICBzdGF0ZS50ci5kZWxldGUoJHBvcy5iZWZvcmUoZCksICRwb3MuYWZ0ZXIoZCkpLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIHNyYy9pbmRleC50c1xuZnVuY3Rpb24gdGFibGVFZGl0aW5nKHtcbiAgYWxsb3dUYWJsZU5vZGVTZWxlY3Rpb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIHJldHVybiBuZXcgUGx1Z2luMih7XG4gICAga2V5OiB0YWJsZUVkaXRpbmdLZXksXG4gICAgLy8gVGhpcyBwaWVjZSBvZiBzdGF0ZSBpcyB1c2VkIHRvIHJlbWVtYmVyIHdoZW4gYSBtb3VzZS1kcmFnXG4gICAgLy8gY2VsbC1zZWxlY3Rpb24gaXMgaGFwcGVuaW5nLCBzbyB0aGF0IGl0IGNhbiBjb250aW51ZSBldmVuIGFzXG4gICAgLy8gdHJhbnNhY3Rpb25zICh3aGljaCBtaWdodCBtb3ZlIGl0cyBhbmNob3IgY2VsbCkgY29tZSBpbi5cbiAgICBzdGF0ZToge1xuICAgICAgaW5pdCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICAgYXBwbHkodHIsIGN1cikge1xuICAgICAgICBjb25zdCBzZXQgPSB0ci5nZXRNZXRhKHRhYmxlRWRpdGluZ0tleSk7XG4gICAgICAgIGlmIChzZXQgIT0gbnVsbClcbiAgICAgICAgICByZXR1cm4gc2V0ID09IC0xID8gbnVsbCA6IHNldDtcbiAgICAgICAgaWYgKGN1ciA9PSBudWxsIHx8ICF0ci5kb2NDaGFuZ2VkKVxuICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgIGNvbnN0IHsgZGVsZXRlZCwgcG9zIH0gPSB0ci5tYXBwaW5nLm1hcFJlc3VsdChjdXIpO1xuICAgICAgICByZXR1cm4gZGVsZXRlZCA/IG51bGwgOiBwb3M7XG4gICAgICB9XG4gICAgfSxcbiAgICBwcm9wczoge1xuICAgICAgZGVjb3JhdGlvbnM6IGRyYXdDZWxsU2VsZWN0aW9uLFxuICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgIG1vdXNlZG93bjogaGFuZGxlTW91c2VEb3duXG4gICAgICB9LFxuICAgICAgY3JlYXRlU2VsZWN0aW9uQmV0d2Vlbih2aWV3KSB7XG4gICAgICAgIHJldHVybiB0YWJsZUVkaXRpbmdLZXkuZ2V0U3RhdGUodmlldy5zdGF0ZSkgIT0gbnVsbCA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uIDogbnVsbDtcbiAgICAgIH0sXG4gICAgICBoYW5kbGVUcmlwbGVDbGljayxcbiAgICAgIGhhbmRsZUtleURvd24sXG4gICAgICBoYW5kbGVQYXN0ZVxuICAgIH0sXG4gICAgYXBwZW5kVHJhbnNhY3Rpb24oXywgb2xkU3RhdGUsIHN0YXRlKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplU2VsZWN0aW9uKFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgZml4VGFibGVzKHN0YXRlLCBvbGRTdGF0ZSksXG4gICAgICAgIGFsbG93VGFibGVOb2RlU2VsZWN0aW9uXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG5leHBvcnQge1xuICBDZWxsQm9va21hcmssXG4gIENlbGxTZWxlY3Rpb24sXG4gIFJlc2l6ZVN0YXRlLFxuICBUYWJsZU1hcCxcbiAgVGFibGVWaWV3LFxuICBjbGlwQ2VsbHMgYXMgX19jbGlwQ2VsbHMsXG4gIGluc2VydENlbGxzIGFzIF9faW5zZXJ0Q2VsbHMsXG4gIHBhc3RlZENlbGxzIGFzIF9fcGFzdGVkQ2VsbHMsXG4gIGFkZENvbFNwYW4sXG4gIGFkZENvbHVtbixcbiAgYWRkQ29sdW1uQWZ0ZXIsXG4gIGFkZENvbHVtbkJlZm9yZSxcbiAgYWRkUm93LFxuICBhZGRSb3dBZnRlcixcbiAgYWRkUm93QmVmb3JlLFxuICBjZWxsQXJvdW5kLFxuICBjb2xDb3VudCxcbiAgY29sdW1uSXNIZWFkZXIsXG4gIGNvbHVtblJlc2l6aW5nLFxuICBjb2x1bW5SZXNpemluZ1BsdWdpbktleSxcbiAgZGVsZXRlQ29sdW1uLFxuICBkZWxldGVSb3csXG4gIGRlbGV0ZVRhYmxlLFxuICBmaW5kQ2VsbCxcbiAgZml4VGFibGVzLFxuICBmaXhUYWJsZXNLZXksXG4gIGdvVG9OZXh0Q2VsbCxcbiAgaGFuZGxlUGFzdGUsXG4gIGluU2FtZVRhYmxlLFxuICBpc0luVGFibGUsXG4gIG1lcmdlQ2VsbHMsXG4gIG1vdmVDZWxsRm9yd2FyZCxcbiAgbmV4dENlbGwsXG4gIHBvaW50c0F0Q2VsbCxcbiAgcmVtb3ZlQ29sU3BhbixcbiAgcmVtb3ZlQ29sdW1uLFxuICByZW1vdmVSb3csXG4gIHJvd0lzSGVhZGVyLFxuICBzZWxlY3RlZFJlY3QsXG4gIHNlbGVjdGlvbkNlbGwsXG4gIHNldENlbGxBdHRyLFxuICBzcGxpdENlbGwsXG4gIHNwbGl0Q2VsbFdpdGhUeXBlLFxuICB0YWJsZUVkaXRpbmcsXG4gIHRhYmxlRWRpdGluZ0tleSxcbiAgdGFibGVOb2RlVHlwZXMsXG4gIHRhYmxlTm9kZXMsXG4gIHRvZ2dsZUhlYWRlcixcbiAgdG9nZ2xlSGVhZGVyQ2VsbCxcbiAgdG9nZ2xlSGVhZGVyQ29sdW1uLFxuICB0b2dnbGVIZWFkZXJSb3csXG4gIHVwZGF0ZUNvbHVtbnNPblJlc2l6ZVxufTtcbiIsICIvLyBAdHMtbm9jaGVja1xuaW1wb3J0IHsgTm9kZSBhcyBQcm9zZU1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgTm9kZVZpZXcgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDb2x1bW5zKFxuICBub2RlOiBQcm9zZU1pcnJvck5vZGUsXG4gIGNvbGdyb3VwOiBFbGVtZW50LFxuICB0YWJsZTogRWxlbWVudCxcbiAgY2VsbE1pbldpZHRoOiBudW1iZXIsXG4gIG92ZXJyaWRlQ29sPzogbnVtYmVyLFxuICBvdmVycmlkZVZhbHVlPzogYW55LFxuKSB7XG4gIGxldCB0b3RhbFdpZHRoID0gMFxuICBsZXQgZml4ZWRXaWR0aCA9IHRydWVcbiAgbGV0IG5leHRET00gPSBjb2xncm91cC5maXJzdENoaWxkXG4gIGNvbnN0IHJvdyA9IG5vZGUuZmlyc3RDaGlsZFxuXG4gIGZvciAobGV0IGkgPSAwLCBjb2wgPSAwOyBpIDwgcm93LmNoaWxkQ291bnQ7IGkgKz0gMSkge1xuICAgIGNvbnN0IHsgY29sc3BhbiwgY29sd2lkdGggfSA9IHJvdy5jaGlsZChpKS5hdHRyc1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzcGFuOyBqICs9IDEsIGNvbCArPSAxKSB7XG4gICAgICBjb25zdCBoYXNXaWR0aCA9IG92ZXJyaWRlQ29sID09PSBjb2wgPyBvdmVycmlkZVZhbHVlIDogY29sd2lkdGggJiYgY29sd2lkdGhbal1cbiAgICAgIGNvbnN0IGNzc1dpZHRoID0gaGFzV2lkdGggPyBgJHtoYXNXaWR0aH1weGAgOiAnJ1xuXG4gICAgICB0b3RhbFdpZHRoICs9IGhhc1dpZHRoIHx8IGNlbGxNaW5XaWR0aFxuXG4gICAgICBpZiAoIWhhc1dpZHRoKSB7XG4gICAgICAgIGZpeGVkV2lkdGggPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICBpZiAoIW5leHRET00pIHtcbiAgICAgICAgY29sZ3JvdXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY29sJykpLnN0eWxlLndpZHRoID0gY3NzV2lkdGhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChuZXh0RE9NLnN0eWxlLndpZHRoICE9PSBjc3NXaWR0aCkge1xuICAgICAgICAgIG5leHRET00uc3R5bGUud2lkdGggPSBjc3NXaWR0aFxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dERPTSA9IG5leHRET00ubmV4dFNpYmxpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3aGlsZSAobmV4dERPTSkge1xuICAgIGNvbnN0IGFmdGVyID0gbmV4dERPTS5uZXh0U2libGluZ1xuXG4gICAgbmV4dERPTS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHRET00pXG4gICAgbmV4dERPTSA9IGFmdGVyXG4gIH1cblxuICBpZiAoZml4ZWRXaWR0aCkge1xuICAgIHRhYmxlLnN0eWxlLndpZHRoID0gYCR7dG90YWxXaWR0aH1weGBcbiAgICB0YWJsZS5zdHlsZS5taW5XaWR0aCA9ICcnXG4gIH0gZWxzZSB7XG4gICAgdGFibGUuc3R5bGUud2lkdGggPSAnJ1xuICAgIHRhYmxlLnN0eWxlLm1pbldpZHRoID0gYCR7dG90YWxXaWR0aH1weGBcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVWaWV3IGltcGxlbWVudHMgTm9kZVZpZXcge1xuICBub2RlOiBQcm9zZU1pcnJvck5vZGVcblxuICBjZWxsTWluV2lkdGg6IG51bWJlclxuXG4gIGRvbTogRWxlbWVudFxuXG4gIHRhYmxlOiBFbGVtZW50XG5cbiAgY29sZ3JvdXA6IEVsZW1lbnRcblxuICBjb250ZW50RE9NOiBFbGVtZW50XG5cbiAgY29uc3RydWN0b3Iobm9kZTogUHJvc2VNaXJyb3JOb2RlLCBjZWxsTWluV2lkdGg6IG51bWJlcikge1xuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICB0aGlzLmNlbGxNaW5XaWR0aCA9IGNlbGxNaW5XaWR0aFxuICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSAndGFibGVXcmFwcGVyJ1xuICAgIHRoaXMudGFibGUgPSB0aGlzLmRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpKVxuICAgIHRoaXMuY29sZ3JvdXAgPSB0aGlzLnRhYmxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvbGdyb3VwJykpXG4gICAgdXBkYXRlQ29sdW1ucyhub2RlLCB0aGlzLmNvbGdyb3VwLCB0aGlzLnRhYmxlLCBjZWxsTWluV2lkdGgpXG4gICAgdGhpcy5jb250ZW50RE9NID0gdGhpcy50YWJsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpKVxuICB9XG5cbiAgdXBkYXRlKG5vZGU6IFByb3NlTWlycm9yTm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT09IHRoaXMubm9kZS50eXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLm5vZGUgPSBub2RlXG4gICAgdXBkYXRlQ29sdW1ucyhub2RlLCB0aGlzLmNvbGdyb3VwLCB0aGlzLnRhYmxlLCB0aGlzLmNlbGxNaW5XaWR0aClcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQgfCB7IHR5cGU6ICdzZWxlY3Rpb24nOyB0YXJnZXQ6IEVsZW1lbnQgfSkge1xuICAgIHJldHVybiAoXG4gICAgICBtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcydcbiAgICAgICYmIChtdXRhdGlvbi50YXJnZXQgPT09IHRoaXMudGFibGUgfHwgdGhpcy5jb2xncm91cC5jb250YWlucyhtdXRhdGlvbi50YXJnZXQpKVxuICAgIClcbiAgfVxufVxuIiwgImltcG9ydCB7IEZyYWdtZW50LCBOb2RlIGFzIFByb3NlbWlycm9yTm9kZSwgTm9kZVR5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2VsbChcbiAgY2VsbFR5cGU6IE5vZGVUeXBlLFxuICBjZWxsQ29udGVudD86IEZyYWdtZW50IHwgUHJvc2VtaXJyb3JOb2RlIHwgQXJyYXk8UHJvc2VtaXJyb3JOb2RlPixcbik6IFByb3NlbWlycm9yTm9kZSB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoY2VsbENvbnRlbnQpIHtcbiAgICByZXR1cm4gY2VsbFR5cGUuY3JlYXRlQ2hlY2tlZChudWxsLCBjZWxsQ29udGVudClcbiAgfVxuXG4gIHJldHVybiBjZWxsVHlwZS5jcmVhdGVBbmRGaWxsKClcbn1cbiIsICJpbXBvcnQgeyBOb2RlVHlwZSwgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTm9kZVR5cGVzKHNjaGVtYTogU2NoZW1hKTogeyBba2V5OiBzdHJpbmddOiBOb2RlVHlwZSB9IHtcbiAgaWYgKHNjaGVtYS5jYWNoZWQudGFibGVOb2RlVHlwZXMpIHtcbiAgICByZXR1cm4gc2NoZW1hLmNhY2hlZC50YWJsZU5vZGVUeXBlc1xuICB9XG5cbiAgY29uc3Qgcm9sZXM6IHsgW2tleTogc3RyaW5nXTogTm9kZVR5cGUgfSA9IHt9XG5cbiAgT2JqZWN0LmtleXMoc2NoZW1hLm5vZGVzKS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgIGNvbnN0IG5vZGVUeXBlID0gc2NoZW1hLm5vZGVzW3R5cGVdXG5cbiAgICBpZiAobm9kZVR5cGUuc3BlYy50YWJsZVJvbGUpIHtcbiAgICAgIHJvbGVzW25vZGVUeXBlLnNwZWMudGFibGVSb2xlXSA9IG5vZGVUeXBlXG4gICAgfVxuICB9KVxuXG4gIHNjaGVtYS5jYWNoZWQudGFibGVOb2RlVHlwZXMgPSByb2xlc1xuXG4gIHJldHVybiByb2xlc1xufVxuIiwgImltcG9ydCB7IEZyYWdtZW50LCBOb2RlIGFzIFByb3NlbWlycm9yTm9kZSwgU2NoZW1hIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuaW1wb3J0IHsgY3JlYXRlQ2VsbCB9IGZyb20gJy4vY3JlYXRlQ2VsbC5qcydcbmltcG9ydCB7IGdldFRhYmxlTm9kZVR5cGVzIH0gZnJvbSAnLi9nZXRUYWJsZU5vZGVUeXBlcy5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgcm93c0NvdW50OiBudW1iZXIsXG4gIGNvbHNDb3VudDogbnVtYmVyLFxuICB3aXRoSGVhZGVyUm93OiBib29sZWFuLFxuICBjZWxsQ29udGVudD86IEZyYWdtZW50IHwgUHJvc2VtaXJyb3JOb2RlIHwgQXJyYXk8UHJvc2VtaXJyb3JOb2RlPixcbik6IFByb3NlbWlycm9yTm9kZSB7XG4gIGNvbnN0IHR5cGVzID0gZ2V0VGFibGVOb2RlVHlwZXMoc2NoZW1hKVxuICBjb25zdCBoZWFkZXJDZWxsczogUHJvc2VtaXJyb3JOb2RlW10gPSBbXVxuICBjb25zdCBjZWxsczogUHJvc2VtaXJyb3JOb2RlW10gPSBbXVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb2xzQ291bnQ7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBjZWxsID0gY3JlYXRlQ2VsbCh0eXBlcy5jZWxsLCBjZWxsQ29udGVudClcblxuICAgIGlmIChjZWxsKSB7XG4gICAgICBjZWxscy5wdXNoKGNlbGwpXG4gICAgfVxuXG4gICAgaWYgKHdpdGhIZWFkZXJSb3cpIHtcbiAgICAgIGNvbnN0IGhlYWRlckNlbGwgPSBjcmVhdGVDZWxsKHR5cGVzLmhlYWRlcl9jZWxsLCBjZWxsQ29udGVudClcblxuICAgICAgaWYgKGhlYWRlckNlbGwpIHtcbiAgICAgICAgaGVhZGVyQ2VsbHMucHVzaChoZWFkZXJDZWxsKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJvd3M6IFByb3NlbWlycm9yTm9kZVtdID0gW11cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm93c0NvdW50OyBpbmRleCArPSAxKSB7XG4gICAgcm93cy5wdXNoKHR5cGVzLnJvdy5jcmVhdGVDaGVja2VkKG51bGwsIHdpdGhIZWFkZXJSb3cgJiYgaW5kZXggPT09IDAgPyBoZWFkZXJDZWxscyA6IGNlbGxzKSlcbiAgfVxuXG4gIHJldHVybiB0eXBlcy50YWJsZS5jcmVhdGVDaGVja2VkKG51bGwsIHJvd3MpXG59XG4iLCAiaW1wb3J0IHsgQ2VsbFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vdGFibGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDZWxsU2VsZWN0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ2VsbFNlbGVjdGlvbiB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIENlbGxTZWxlY3Rpb25cbn1cbiIsICJpbXBvcnQgeyBmaW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1BvcywgS2V5Ym9hcmRTaG9ydGN1dENvbW1hbmQgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmltcG9ydCB7IGlzQ2VsbFNlbGVjdGlvbiB9IGZyb20gJy4vaXNDZWxsU2VsZWN0aW9uLmpzJ1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFibGVXaGVuQWxsQ2VsbHNTZWxlY3RlZDogS2V5Ym9hcmRTaG9ydGN1dENvbW1hbmQgPSAoeyBlZGl0b3IgfSkgPT4ge1xuICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yLnN0YXRlXG5cbiAgaWYgKCFpc0NlbGxTZWxlY3Rpb24oc2VsZWN0aW9uKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IGNlbGxDb3VudCA9IDBcbiAgY29uc3QgdGFibGUgPSBmaW5kUGFyZW50Tm9kZUNsb3Nlc3RUb1BvcyhzZWxlY3Rpb24ucmFuZ2VzWzBdLiRmcm9tLCBub2RlID0+IHtcbiAgICByZXR1cm4gbm9kZS50eXBlLm5hbWUgPT09ICd0YWJsZSdcbiAgfSlcblxuICB0YWJsZT8ubm9kZS5kZXNjZW5kYW50cyhub2RlID0+IHtcbiAgICBpZiAobm9kZS50eXBlLm5hbWUgPT09ICd0YWJsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChbJ3RhYmxlQ2VsbCcsICd0YWJsZUhlYWRlciddLmluY2x1ZGVzKG5vZGUudHlwZS5uYW1lKSkge1xuICAgICAgY2VsbENvdW50ICs9IDFcbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgYWxsQ2VsbHNTZWxlY3RlZCA9IGNlbGxDb3VudCA9PT0gc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGhcblxuICBpZiAoIWFsbENlbGxzU2VsZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGVkaXRvci5jb21tYW5kcy5kZWxldGVUYWJsZSgpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsICJpbXBvcnQge1xuICBjYWxsT3JSZXR1cm4sIGdldEV4dGVuc2lvbkZpZWxkLCBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUsIFBhcmVudENvbmZpZyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQge1xuICBhZGRDb2x1bW5BZnRlcixcbiAgYWRkQ29sdW1uQmVmb3JlLFxuICBhZGRSb3dBZnRlcixcbiAgYWRkUm93QmVmb3JlLFxuICBDZWxsU2VsZWN0aW9uLFxuICBjb2x1bW5SZXNpemluZyxcbiAgZGVsZXRlQ29sdW1uLFxuICBkZWxldGVSb3csXG4gIGRlbGV0ZVRhYmxlLFxuICBmaXhUYWJsZXMsXG4gIGdvVG9OZXh0Q2VsbCxcbiAgbWVyZ2VDZWxscyxcbiAgc2V0Q2VsbEF0dHIsXG4gIHNwbGl0Q2VsbCxcbiAgdGFibGVFZGl0aW5nLFxuICB0b2dnbGVIZWFkZXIsXG4gIHRvZ2dsZUhlYWRlckNlbGwsXG59IGZyb20gJ0B0aXB0YXAvcG0vdGFibGVzJ1xuaW1wb3J0IHsgTm9kZVZpZXcgfSBmcm9tICdAdGlwdGFwL3BtL3ZpZXcnXG5cbmltcG9ydCB7IFRhYmxlVmlldyB9IGZyb20gJy4vVGFibGVWaWV3LmpzJ1xuaW1wb3J0IHsgY3JlYXRlVGFibGUgfSBmcm9tICcuL3V0aWxpdGllcy9jcmVhdGVUYWJsZS5qcydcbmltcG9ydCB7IGRlbGV0ZVRhYmxlV2hlbkFsbENlbGxzU2VsZWN0ZWQgfSBmcm9tICcuL3V0aWxpdGllcy9kZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIHJlc2l6YWJsZTogYm9vbGVhblxuICBoYW5kbGVXaWR0aDogbnVtYmVyXG4gIGNlbGxNaW5XaWR0aDogbnVtYmVyXG4gIFZpZXc6IE5vZGVWaWV3XG4gIGxhc3RDb2x1bW5SZXNpemFibGU6IGJvb2xlYW5cbiAgYWxsb3dUYWJsZU5vZGVTZWxlY3Rpb246IGJvb2xlYW5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIHRhYmxlOiB7XG4gICAgICBpbnNlcnRUYWJsZTogKG9wdGlvbnM/OiB7XG4gICAgICAgIHJvd3M/OiBudW1iZXJcbiAgICAgICAgY29scz86IG51bWJlclxuICAgICAgICB3aXRoSGVhZGVyUm93PzogYm9vbGVhblxuICAgICAgfSkgPT4gUmV0dXJuVHlwZVxuICAgICAgYWRkQ29sdW1uQmVmb3JlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBhZGRDb2x1bW5BZnRlcjogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgZGVsZXRlQ29sdW1uOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBhZGRSb3dCZWZvcmU6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIGFkZFJvd0FmdGVyOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBkZWxldGVSb3c6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIGRlbGV0ZVRhYmxlOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBtZXJnZUNlbGxzOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBzcGxpdENlbGw6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIHRvZ2dsZUhlYWRlckNvbHVtbjogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgdG9nZ2xlSGVhZGVyUm93OiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICB0b2dnbGVIZWFkZXJDZWxsOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBtZXJnZU9yU3BsaXQ6ICgpID0+IFJldHVyblR5cGVcbiAgICAgIHNldENlbGxBdHRyaWJ1dGU6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IFJldHVyblR5cGVcbiAgICAgIGdvVG9OZXh0Q2VsbDogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgZ29Ub1ByZXZpb3VzQ2VsbDogKCkgPT4gUmV0dXJuVHlwZVxuICAgICAgZml4VGFibGVzOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgICBzZXRDZWxsU2VsZWN0aW9uOiAocG9zaXRpb246IHsgYW5jaG9yQ2VsbDogbnVtYmVyOyBoZWFkQ2VsbD86IG51bWJlciB9KSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG5cbiAgaW50ZXJmYWNlIE5vZGVDb25maWc8T3B0aW9ucywgU3RvcmFnZT4ge1xuICAgIC8qKlxuICAgICAqIFRhYmxlIFJvbGVcbiAgICAgKi9cbiAgICB0YWJsZVJvbGU/OlxuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgKCh0aGlzOiB7XG4gICAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgICAgb3B0aW9uczogT3B0aW9uc1xuICAgICAgICAgIHN0b3JhZ2U6IFN0b3JhZ2VcbiAgICAgICAgICBwYXJlbnQ6IFBhcmVudENvbmZpZzxOb2RlQ29uZmlnPE9wdGlvbnM+PlsndGFibGVSb2xlJ11cbiAgICAgICAgfSkgPT4gc3RyaW5nKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUYWJsZSA9IE5vZGUuY3JlYXRlPFRhYmxlT3B0aW9ucz4oe1xuICBuYW1lOiAndGFibGUnLFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgcmVzaXphYmxlOiBmYWxzZSxcbiAgICAgIGhhbmRsZVdpZHRoOiA1LFxuICAgICAgY2VsbE1pbldpZHRoOiAyNSxcbiAgICAgIC8vIFRPRE86IGZpeFxuICAgICAgVmlldzogVGFibGVWaWV3LFxuICAgICAgbGFzdENvbHVtblJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgIGFsbG93VGFibGVOb2RlU2VsZWN0aW9uOiBmYWxzZSxcbiAgICB9XG4gIH0sXG5cbiAgY29udGVudDogJ3RhYmxlUm93KycsXG5cbiAgdGFibGVSb2xlOiAndGFibGUnLFxuXG4gIGlzb2xhdGluZzogdHJ1ZSxcblxuICBncm91cDogJ2Jsb2NrJyxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFt7IHRhZzogJ3RhYmxlJyB9XVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsndGFibGUnLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIFsndGJvZHknLCAwXV1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0VGFibGU6XG4gICAgICAgICh7IHJvd3MgPSAzLCBjb2xzID0gMywgd2l0aEhlYWRlclJvdyA9IHRydWUgfSA9IHt9KSA9PiAoeyB0ciwgZGlzcGF0Y2gsIGVkaXRvciB9KSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IGNyZWF0ZVRhYmxlKGVkaXRvci5zY2hlbWEsIHJvd3MsIGNvbHMsIHdpdGhIZWFkZXJSb3cpXG5cbiAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRyLnNlbGVjdGlvbi5hbmNob3IgKyAxXG5cbiAgICAgICAgICAgIHRyLnJlcGxhY2VTZWxlY3Rpb25XaXRoKG5vZGUpXG4gICAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldygpXG4gICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKG9mZnNldCkpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICBhZGRDb2x1bW5CZWZvcmU6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFkZENvbHVtbkJlZm9yZShzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICBhZGRDb2x1bW5BZnRlcjpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uQWZ0ZXIoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgZGVsZXRlQ29sdW1uOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkZWxldGVDb2x1bW4oc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgYWRkUm93QmVmb3JlOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhZGRSb3dCZWZvcmUoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgYWRkUm93QWZ0ZXI6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFkZFJvd0FmdGVyKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGRlbGV0ZVJvdzpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gZGVsZXRlUm93KHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGRlbGV0ZVRhYmxlOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkZWxldGVUYWJsZShzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICBtZXJnZUNlbGxzOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBtZXJnZUNlbGxzKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIHNwbGl0Q2VsbDpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3BsaXRDZWxsKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIHRvZ2dsZUhlYWRlckNvbHVtbjpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdG9nZ2xlSGVhZGVyKCdjb2x1bW4nKShzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICB0b2dnbGVIZWFkZXJSb3c6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRvZ2dsZUhlYWRlcigncm93Jykoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgdG9nZ2xlSGVhZGVyQ2VsbDpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdG9nZ2xlSGVhZGVyQ2VsbChzdGF0ZSwgZGlzcGF0Y2gpXG4gICAgICAgIH0sXG4gICAgICBtZXJnZU9yU3BsaXQ6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgaWYgKG1lcmdlQ2VsbHMoc3RhdGUsIGRpc3BhdGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3BsaXRDZWxsKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIHNldENlbGxBdHRyaWJ1dGU6XG4gICAgICAgIChuYW1lLCB2YWx1ZSkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc2V0Q2VsbEF0dHIobmFtZSwgdmFsdWUpKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGdvVG9OZXh0Q2VsbDpcbiAgICAgICAgKCkgPT4gKHsgc3RhdGUsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gZ29Ub05leHRDZWxsKDEpKHN0YXRlLCBkaXNwYXRjaClcbiAgICAgICAgfSxcbiAgICAgIGdvVG9QcmV2aW91c0NlbGw6XG4gICAgICAgICgpID0+ICh7IHN0YXRlLCBkaXNwYXRjaCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGdvVG9OZXh0Q2VsbCgtMSkoc3RhdGUsIGRpc3BhdGNoKVxuICAgICAgICB9LFxuICAgICAgZml4VGFibGVzOlxuICAgICAgICAoKSA9PiAoeyBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgZml4VGFibGVzKHN0YXRlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICBzZXRDZWxsU2VsZWN0aW9uOlxuICAgICAgICBwb3NpdGlvbiA9PiAoeyB0ciwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gQ2VsbFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBwb3NpdGlvbi5hbmNob3JDZWxsLCBwb3NpdGlvbi5oZWFkQ2VsbClcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgVGFiOiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvci5jb21tYW5kcy5nb1RvTmV4dENlbGwoKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZWRpdG9yLmNhbigpLmFkZFJvd0FmdGVyKCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvci5jaGFpbigpLmFkZFJvd0FmdGVyKCkuZ29Ub05leHRDZWxsKCkucnVuKClcbiAgICAgIH0sXG4gICAgICAnU2hpZnQtVGFiJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuZ29Ub1ByZXZpb3VzQ2VsbCgpLFxuICAgICAgQmFja3NwYWNlOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgICAgJ01vZC1CYWNrc3BhY2UnOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgICAgRGVsZXRlOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgICAgJ01vZC1EZWxldGUnOiBkZWxldGVUYWJsZVdoZW5BbGxDZWxsc1NlbGVjdGVkLFxuICAgIH1cbiAgfSxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgY29uc3QgaXNSZXNpemFibGUgPSB0aGlzLm9wdGlvbnMucmVzaXphYmxlICYmIHRoaXMuZWRpdG9yLmlzRWRpdGFibGVcblxuICAgIHJldHVybiBbXG4gICAgICAuLi4oaXNSZXNpemFibGVcbiAgICAgICAgPyBbXG4gICAgICAgICAgY29sdW1uUmVzaXppbmcoe1xuICAgICAgICAgICAgaGFuZGxlV2lkdGg6IHRoaXMub3B0aW9ucy5oYW5kbGVXaWR0aCxcbiAgICAgICAgICAgIGNlbGxNaW5XaWR0aDogdGhpcy5vcHRpb25zLmNlbGxNaW5XaWR0aCxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgKGluY29ycmVjdCB0eXBlKVxuICAgICAgICAgICAgVmlldzogdGhpcy5vcHRpb25zLlZpZXcsXG4gICAgICAgICAgICAvLyBUT0RPOiBQUiBmb3IgQHR5cGVzL3Byb3NlbWlycm9yLXRhYmxlc1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAoaW5jb3JyZWN0IHR5cGUpXG4gICAgICAgICAgICBsYXN0Q29sdW1uUmVzaXphYmxlOiB0aGlzLm9wdGlvbnMubGFzdENvbHVtblJlc2l6YWJsZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIHRhYmxlRWRpdGluZyh7XG4gICAgICAgIGFsbG93VGFibGVOb2RlU2VsZWN0aW9uOiB0aGlzLm9wdGlvbnMuYWxsb3dUYWJsZU5vZGVTZWxlY3Rpb24sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgZXh0ZW5kTm9kZVNjaGVtYShleHRlbnNpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgbmFtZTogZXh0ZW5zaW9uLm5hbWUsXG4gICAgICBvcHRpb25zOiBleHRlbnNpb24ub3B0aW9ucyxcbiAgICAgIHN0b3JhZ2U6IGV4dGVuc2lvbi5zdG9yYWdlLFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZVJvbGU6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZChleHRlbnNpb24sICd0YWJsZVJvbGUnLCBjb250ZXh0KSksXG4gICAgfVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDZWxsT3B0aW9ucyB7XG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5leHBvcnQgY29uc3QgVGFibGVDZWxsID0gTm9kZS5jcmVhdGU8VGFibGVDZWxsT3B0aW9ucz4oe1xuICBuYW1lOiAndGFibGVDZWxsJyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIGNvbnRlbnQ6ICdibG9jaysnLFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHNwYW46IHtcbiAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgIH0sXG4gICAgICByb3dzcGFuOiB7XG4gICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICB9LFxuICAgICAgY29sd2lkdGg6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x3aWR0aCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjb2x3aWR0aCcpXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjb2x3aWR0aFxuICAgICAgICAgICAgPyBbcGFyc2VJbnQoY29sd2lkdGgsIDEwKV1cbiAgICAgICAgICAgIDogbnVsbFxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICB0YWJsZVJvbGU6ICdjZWxsJyxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3RkJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3RkJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG59KVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUhlYWRlck9wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cbmV4cG9ydCBjb25zdCBUYWJsZUhlYWRlciA9IE5vZGUuY3JlYXRlPFRhYmxlSGVhZGVyT3B0aW9ucz4oe1xuICBuYW1lOiAndGFibGVIZWFkZXInLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgY29udGVudDogJ2Jsb2NrKycsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sc3Bhbjoge1xuICAgICAgICBkZWZhdWx0OiAxLFxuICAgICAgfSxcbiAgICAgIHJvd3NwYW46IHtcbiAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgIH0sXG4gICAgICBjb2x3aWR0aDoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHdpZHRoID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NvbHdpZHRoJylcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbHdpZHRoXG4gICAgICAgICAgICA/IFtwYXJzZUludChjb2x3aWR0aCwgMTApXVxuICAgICAgICAgICAgOiBudWxsXG5cbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHRhYmxlUm9sZTogJ2hlYWRlcl9jZWxsJyxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3RoJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3RoJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG59KVxuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVJvd09wdGlvbnMge1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZXhwb3J0IGNvbnN0IFRhYmxlUm93ID0gTm9kZS5jcmVhdGU8VGFibGVSb3dPcHRpb25zPih7XG4gIG5hbWU6ICd0YWJsZVJvdycsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH1cbiAgfSxcblxuICBjb250ZW50OiAnKHRhYmxlQ2VsbCB8IHRhYmxlSGVhZGVyKSonLFxuXG4gIHRhYmxlUm9sZTogJ3JvdycsXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7IHRhZzogJ3RyJyB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ3RyJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBOb2RlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgY29uc3QgVGV4dCA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogJ3RleHQnLFxuICBncm91cDogJ2lubGluZScsXG59KVxuIiwgImltcG9ydCB7IE1hcmssIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGludGVyZmFjZSBVbmRlcmxpbmVPcHRpb25zIHtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG59XG5cbmRlY2xhcmUgbW9kdWxlICdAdGlwdGFwL2NvcmUnIHtcbiAgaW50ZXJmYWNlIENvbW1hbmRzPFJldHVyblR5cGU+IHtcbiAgICB1bmRlcmxpbmU6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGFuIHVuZGVybGluZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldFVuZGVybGluZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGFuIHVuZGVybGluZSBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZVVuZGVybGluZTogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYW4gdW5kZXJsaW5lIG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRVbmRlcmxpbmU6ICgpID0+IFJldHVyblR5cGUsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBVbmRlcmxpbmUgPSBNYXJrLmNyZWF0ZTxVbmRlcmxpbmVPcHRpb25zPih7XG4gIG5hbWU6ICd1bmRlcmxpbmUnLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogJ3UnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3R5bGU6ICd0ZXh0LWRlY29yYXRpb24nLFxuICAgICAgICBjb25zdW1pbmc6IGZhbHNlLFxuICAgICAgICBnZXRBdHRyczogc3R5bGUgPT4gKChzdHlsZSBhcyBzdHJpbmcpLmluY2x1ZGVzKCd1bmRlcmxpbmUnKSA/IHt9IDogZmFsc2UpLFxuICAgICAgfSxcbiAgICBdXG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gWyd1JywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRVbmRlcmxpbmU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZVVuZGVybGluZTogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgICAgdW5zZXRVbmRlcmxpbmU6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnVuc2V0TWFyayh0aGlzLm5hbWUpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ01vZC11JzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lKCksXG4gICAgICAnTW9kLVUnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVVbmRlcmxpbmUoKSxcbiAgICB9XG4gIH0sXG59KVxuIiwgImltcG9ydCB7XG4gIE1hcmssXG4gIG1hcmtJbnB1dFJ1bGUsXG4gIG1hcmtQYXN0ZVJ1bGUsXG4gIG1lcmdlQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEhpZ2hsaWdodE9wdGlvbnMge1xuICBtdWx0aWNvbG9yOiBib29sZWFuLFxuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55Pixcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGhpZ2hsaWdodDoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBoaWdobGlnaHQgbWFya1xuICAgICAgICovXG4gICAgICBzZXRIaWdobGlnaHQ6IChhdHRyaWJ1dGVzPzogeyBjb2xvcjogc3RyaW5nIH0pID0+IFJldHVyblR5cGUsXG4gICAgICAvKipcbiAgICAgICAqIFRvZ2dsZSBhIGhpZ2hsaWdodCBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUhpZ2hsaWdodDogKGF0dHJpYnV0ZXM/OiB7IGNvbG9yOiBzdHJpbmcgfSkgPT4gUmV0dXJuVHlwZSxcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBoaWdobGlnaHQgbWFya1xuICAgICAgICovXG4gICAgICB1bnNldEhpZ2hsaWdodDogKCkgPT4gUmV0dXJuVHlwZSxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGlucHV0UmVnZXggPSAvKD86XnxcXHMpKCg/Oj09KSgoPzpbXn49XSspKSg/Oj09KSkkL1xuZXhwb3J0IGNvbnN0IHBhc3RlUmVnZXggPSAvKD86XnxcXHMpKCg/Oj09KSgoPzpbXn49XSspKSg/Oj09KSkvZ1xuXG5leHBvcnQgY29uc3QgSGlnaGxpZ2h0ID0gTWFyay5jcmVhdGU8SGlnaGxpZ2h0T3B0aW9ucz4oe1xuICBuYW1lOiAnaGlnaGxpZ2h0JyxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtdWx0aWNvbG9yOiBmYWxzZSxcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aWNvbG9yKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbG9yJykgfHwgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgIGlmICghYXR0cmlidXRlcy5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdkYXRhLWNvbG9yJzogYXR0cmlidXRlcy5jb2xvcixcbiAgICAgICAgICAgIHN0eWxlOiBgYmFja2dyb3VuZC1jb2xvcjogJHthdHRyaWJ1dGVzLmNvbG9yfTsgY29sb3I6IGluaGVyaXRgLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdtYXJrJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFsnbWFyaycsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0SGlnaGxpZ2h0OiBhdHRyaWJ1dGVzID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lLCBhdHRyaWJ1dGVzKVxuICAgICAgfSxcbiAgICAgIHRvZ2dsZUhpZ2hsaWdodDogYXR0cmlidXRlcyA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgIH0sXG4gICAgICB1bnNldEhpZ2hsaWdodDogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnTW9kLVNoaWZ0LWgnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVIaWdobGlnaHQoKSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWFya0lucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcblxuICBhZGRQYXN0ZVJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrUGFzdGVSdWxlKHtcbiAgICAgICAgZmluZDogcGFzdGVSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgfSksXG4gICAgXVxuICB9LFxufSlcbiIsICJpbXBvcnQgeyBOb2RlLCBtZXJnZUF0dHJpYnV0ZXMgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5cbmV4cG9ydCBjb25zdCBDaGVja2VkTGlzdCA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogXCJjaGVja2VkTGlzdFwiLFxuXG4gIHByaW9yaXR5OiA1MCxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtVHlwZU5hbWU6IFwibGlzdEl0ZW1cIixcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIGNsYXNzOiBcImNoZWNrZWQtbGlzdFwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGdyb3VwOiBcImJsb2NrIGxpc3RcIixcblxuICBjb250ZW50KCkge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lfStgO1xuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW3sgdGFnOiBcInVsXCIsIGdldEF0dHJzOiAoZWxlbWVudCkgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjaGVja2VkLWxpc3RcIiksIHByaW9yaXR5OiAxMDAwIH1dO1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcInVsXCIsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF07XG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvZ2dsZUNoZWNrZWRMaXN0OlxuICAgICAgICAoKSA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZUxpc3QodGhpcy5uYW1lLCB0aGlzLm9wdGlvbnMuaXRlbVR5cGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgTGVhZCA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogXCJsZWFkXCIsXG4gIGdyb3VwOiBcImJsb2NrXCIsXG4gIGNvbnRlbnQ6IFwiYmxvY2srXCIsXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIGNsYXNzOiBcImxlYWRcIixcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgZ2V0QXR0cnM6IChlbGVtZW50KSA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImxlYWRcIiksXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIHJlbmRlckhUTUwoeyBub2RlLCBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICB9LFxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9nZ2xlTGVhZDpcbiAgICAgICAgKCkgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVXcmFwKHRoaXMubmFtZSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgIi8vIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBETyBOT1QgRURJVCBESVJFQ1RMWVxuLy8gU2VlIHVwZGF0ZS10bGRzLmpzIGZvciBlbmNvZGluZy9kZWNvZGluZyBmb3JtYXRcbi8vIGh0dHBzOi8vZGF0YS5pYW5hLm9yZy9UTEQvdGxkcy1hbHBoYS1ieS1kb21haW4udHh0XG5jb25zdCBlbmNvZGVkVGxkcyA9ICdhYWExcnAzYmIwb3R0M3ZpZTRjMWxlMm9nYWRvNXVkaGFiaTdjMGFkZW15NWNlbnR1cmU2b3VudGFudDBzOW8xdG9yNGQwczF1bHQ0ZTBnMXJvMnRuYTRmMGwxcmljYTVnMGFraGFuNWVuY3k1aTBnMXJidXMzZm9yY2U1dGVsNWtkbjNsMGliYWJhNHBheTRsZmluYW56NnN0YXRlNXkyc2FjZTN0b201bTBhem9uNGVyaWNhbmV4cHJlc3M3ZmFtaWx5MTF4MmZhbTNpY2Ezc3RlcmRhbThuYWx5dGljczdkcm9pZDVxdWFuNHoybzBsMnBhcnRtZW50czhwMGxlNHEwdWFyZWxsZThyMGFiMW1jbzRjaGkzbXkycGEydDBlM3MwZGEyaWEyc29jaWF0ZXM5dDBobGV0YTV0b3JuZXk3dTBjdGlvbjVkaTBibGUzbzNzcG9zdDV0aG9yM28wczR2aWFuY2E2dzBzMngwYTJ6MHVyZTViYTBieTJpZHUzbmFtZXgzbmFyZXB1YmxpYzExZDFrMnIwY2Vsb25hNWxheWNhcmQ0czVlZm9vdDVnYWluczZzZWJhbGw1a2V0YmFsbDh1aGF1czV5ZXJuNWIwYzF0MXZhM2NnMW4yZDFlMGF0czJ1dHk0ZXIybnRsZXk1cmxpbjRzdDBidXk1dDJmMWcxaDBhcnRpNWkwYmxlM2Qxa2UybmcwbzNvMXoyajFsYWNrMGZyaWRheTlvY2tidXN0ZXI4ZzFvbWJlcmc3dWUzbTBzMXcybjBwcGFyaWJhczlvMGF0czNlaHJpbmdlcjhmYTJtMW5kMm8wazBpbmc1c2NoMnRpazJvbjR0MXV0aXF1ZTZ4MnIwYWRlc2NvNmlkZ2VzdG9uZTlvYWR3YXk1a2VyM3RoZXI1dXNzZWxzN3MxdDF1aWxkMGVyczZzaW5lc3M2eTF6ejN2MXcxeTF6MGgzY2EwYjFmZTJsMGwxdmlua2xlaW45bTBlcmEzcDJub24zcGV0b3duNWl0YWwwb25lOHIwYXZhbjRkczJlMGVyMHM0czJzYTFlMWgxaW5vNHQwZXJpbmc1aG9saWM3YmExbjFyZTNjMWQxZW50ZXI0bzFybjNmMGExZDJnMWgwYW5lbDJuZWw0cml0eTRzZTJ0MmVhcDNpbnRhaTVyaXN0bWFzNm9tZTR1cmNoNWkwcHJpYW5pNnJjbGU0c2NvM3RhZGVsNGkwYzJ5M2sxbDBhaW1zNGVhbmluZzZpY2sybmljMXF1ZTZvdGhpbmc1dWQzdWIwbWVkNm0xbjFvMGFjaDNkZXMzZmZlZTRsbGVnZTRvZ25lNW0wY2FzdDRtYmFuazR1bml0eTZwYW55MnJlM3V0ZXI1c2VjNG5kb3Mzc3RydWN0aW9uOHVsdGluZzd0YWN0M3JhY3RvcnM5b2tpbmc0bDFwMnJzaWNhNXVudHJ5NHBvbjBzNHJzZXM2cGEycjBlZGl0MGNhcmQ0dW5pb245aWNrZXQ1b3duM3MxdWlzZTBzNnUwaXNpbmVsbGE5djF3MXgxeTBtcnUzb3UzejJkYWJ1cjNkMW5jZTN0YTFlMWluZzNzdW40eTJjbGszZHMyZTBhbDBlcjJzM2dyZWU0bGl2ZXJ5NWwxb2l0dGU1dGEzbW9jcmF0Nm50YWwyaXN0NXNpMGduNHYyaGwyaWFtb25kczZldDJnaXRhbDVyZWN0MG9yeTdzY291bnQzdmVyNWgyeTJqMWsxbTFucDJvMGNzMXRvcjRnMW1haW5zNXQxd25sb2FkN3JpdmU0dHYydWJhaTNubG9wNHBvbnQ0cmJhbjV2YWcycjJ6MmVhcnRoM3QyYzBvMmRla2EzdTBjYXRpb244ZTFnMW1haWwzZXJjazVuZXJneTRnaW5lZXIwaW5nOXRlcnByaXNlczEwcHNvbjRxdWlwbWVudDhyMGljc3NvbjZuaTNzMHExdGF0ZTV0MXUwcm92aXNpb244czJ2ZW50czV4Y2hhbmdlNnBlcnQzb3NlZDRyZXNzNXRyYXNwYWNlMTBmYWdlMmlsMXJ3aW5kczZ0aDNtaWx5NG4wczJybTBlcnM1c2hpb240dDNlZGV4M2VkYmFjazZycmFyaTNlcm82aTBkZWxpdHk1bzJsbTJuYWwxbmNlMWlhbDdyZTBzdG9uZTZtZGFsZTZzaDBpbmc1dDBuZXNzNmoxazFsaWNrcjNnaHRzNHIyb3Jpc3Q0d2VyczV5Mm0xbzBvMGQxdGJhbGw2cmQxZXgyc2FsZTR1bTN1bmRhdGlvbjh4MnIwZWUxc2VuaXVzN2wxb2dhbnM0bnRpZXI3dHIydWppdHN1NW4wZDJybml0dXJlN3Rib2w1eWkzZ2EwbDBsZXJ5M28xdXA0bWUwczNwMXJkZW40eTJiMGl6M2QwbjJlMGExbnQwaW5nNW9yZ2U1ZjFnMGVlM2gxaTBmdDBzM3ZlczJpbmc1bDBhc3MzZTFvYmFsMm80bTBhaWwzYmgybzF4Mm4xb2RhZGR5NWxkMHBvaW50NmYybzBkeWVhcjVnMGxlNHAxdDF2MnAxcTFyMGFpbmdlcjVwaGljczV0aXM0ZWVuM2lwZTNvY2VyeTR1cDRzMXQxdTBhcmRpYW42Y2NpM2dlMmlkZTJ0YXJzNXJ1M3cxeTJoYWlyMm1idXJnNW5nb3V0NXVzM2JvMmRmYzBiYW5rN2VhbHRoMGNhcmU4bHAxc2lua2k2cmUxbWVzNWlwaG9wNHNhbWl0c3U3dGFjaGk1djJrMHQybTFuMW9ja2V5NGxkaW5nczVpZGF5NW1lZGVwb3Q1Z29vZHM1czBlbnNlN25kYTNyc2Uzc3BpdGFsNXQwaW5nNXQwZWxzM21haWw1dXNlM3cycjFzYmMzdDF1MGdoZXM1eWF0dDN1bmRhaTdpYm0yY2JjMmUxdTJkMWUwZWUzZm0ya2FubzRsMW0wYW1hdDRkYjJtbzBiaWxpZW45bjBjMWR1c3RyaWVzOGZpbml0aTVvMmcxazFzdGl0dXRlNnVyYW5jZTRlNHQwZXJuYXRpb25hbDEwdWl0NHZlc3RtZW50czEwbzFwaXJhbmdhN3ExcjBpc2g0czBtYWlsaTV0MGFuYnVsN3QwYXUydjNqYWd1YXI0dmEzY2IyZTBlcDJ0enQzd2Vscnk2aW8ybGwybTBwMm5qMm8wYnMxdXJnNHQxeTJwMG1vcmdhbjZyczN1ZWdvczRuaXBlcjdrYXVmZW41ZGRpM2UwcnJ5aG90ZWxzNmxvZ2lzdGljczlwcm9wZXJ0aWVzMTRmaDJnMWgxaTBhMWRzMm0xbmRsZTR0Y2hlbjV3aTNtMW4xb2VsbjNtYXRzdTVzaGVyNXAwbWcybjJyMGQxZWQzdW9rZ3JvdXA4dzF5MG90bzR6MmxhMGNhaXhhNW1ib3JnaGluaThlcjNuY2FzdGVyNmQwcm92ZXI2eGVzczVzYWxsZTV0MGlubzNyb2JlNXcweWVyNWIxYzFkczJlYXNlM2NsZXJjNWZyYWs0Z2FsMm8yeHVzNGdidDNpMGRsMmZlMGluc3VyYW5jZTlzdHlsZTdnaHRpbmc2a2UybGx5M21pdGVkNG8ybmNvbG40azJwc3kzdmUxaW5nNWsxbGMxcDJvYW4wczNja2VyM3VzM2wxbmRvbjR0dGUxbzN2ZTNwbDBmaW5hbmNpYWwxMXIxczF0MGQwYTN1MG5kYmVjazZ4ZTF1cnk1djF5Mm1hMGRyaWQ0aWYxc29uNGtldXA0bjBhZ2VtZW50N2dvM3AxcmtldDBpbmczczRyaW90dDVzaGFsbHM3dHRlbDViYTJjMGtpbnNleTdkMWUwZDBpYTNldDJsYm91cm5lN21lMW9yaWFsNm4wdTJyY2ttc2Q3ZzFoMWlhbWkzY3Jvc29mdDdsMW5pMXQydDBzdWJpc2hpOWsxbDBiMXMybTBhMm4xbzBiaTBsZTRkYTJlMWkxbTFuYXNoM2V5MnN0ZXI1cm1vbjN0Z2FnZTZzY293NHRvMHJjeWNsZXM5djBpZTRwMXExcjFzMGQydDBuMXIydTBzZXVtM2ljNHYxdzF4MXkxejJuYTBiMWdveWE0bWUydHVyYTR2eTNiYTJjMWUwYzF0MGJhbms0ZmxpeDR3b3JrNXVzdGFyNXcwczJ4dDBkaXJlY3Q3dXM0ZjBsMmcwbzJoazJpMGNvMmtlMW9uM25qYTNzc2FuMXk1bDFvMGtpYTNydG9uNHcwcnV6M3R2NHAxcjBhMXcydHQydTF5YzJ6Mm9iaTFzZXJ2ZXI3ZmZpY2U1a2luYXdhNmxheWFuMGdyb3VwOWRuYXZ5NWxvM20wZWdhNG5lMWcxbDBpbmU1b28ycGVuM3JhY2xlM25nZTRnMGFuaWM1aWdpbnM2c2FrYTR0c3VrYTR0MnZoM3BhMGdlMm5hc29uaWM3cmlzMnMxdG5lcnM0czF5M3kyY2N3M2UwdDJmMGl6ZXI1ZzFoMGFybWFjeTZkMWlsaXBzNW9uZTJ0bzBncmFwaHk2czR5c2lvNWljczF0ZXQydXJlczZkMW4wZzFrMm9uZWVyNXp6YTRrMWwwYWNlMnkwc3RhdGlvbjl1bWJpbmc1czNtMW4wYzJvaGwya2VyM2xpdGllNXJuMnN0M3IwYW1lcmljYTZ4aTNlc3MzaW1lM28wZDB1Y3Rpb25zOGYxZ3Jlc3NpdmU4bW8ycGVydGllczN5NXRlY3Rpb244dTBkZW50aWFsOXMxdDF1YjJ3MGMyeTJxYTFwb24zdWViZWMzc3Q1cmFjaW5nNGRpbzRlMGFkMWxlc3RhdGU2dG9yMnk0Y2lwZXM1ZDBzdG9uZTV1bWJyZWxsYTloYWIzaXNlMG4zdDJsaWFuY2U2bjB0MGFsczVwYWlyM29ydDN1YmxpY2FuOHN0MGF1cmFudDh2aWV3MHM1eHJvdGg2aWNoMGFyZGxpNm9oM2wxbzFwMm8wY2tzM2RlbzNnZXJzNG9tM3MwdnAzdTBnYnkzaHIybjJ3MGUyeXVreXU2c2EwYXJsYW5kNmZlMHR5NGt1cmE0bGUxb24zbXNjbHViNHVuZzVuZHZpazBjb3JvbWFudDEyb2ZpNHAxcmwyczF2ZTJ4bzNiMGkxczJjMGExYjFoYWVmZmxlcjdtaWR0NG9sYXJzaGlwczhvbDN1bGUzd2FyejVpZW5jZTVvdDNkMWUwYXJjaDN0MmN1cmUxaXR5NmVrMmxlY3Q0bmVyM3J2aWNlczZ2ZW4zdzF4MHkzZnIyZzFoMGFuZ3JpbGE2cnAydzJlbGwzaWExa3NoYTVvZXMycDBwaW5nNXVqaTN3M2kwbGsybmExZ2xlczV0ZTNqMWswaTBuMnkwcGU0bDBpbmc0bTBhcnQzaWxlNG4wY2YzbzBjY2VyM2lhbDRmdGJhbms0d2FyZTZodTJsYXIydXRpb25zN25nMXkyeTJwYTBjZTNvcnQydDNyMGwyczF0MGFkYTJwbGVzNHIxdGViYW5rNGZhcm03YzBncm91cDZvY2tob2xtNnJhZ2UzZTNyZWFtNHVkaW8yeTN5bGU0dTBja3MzcHBsaWVzM3kyb3J0NXJmMWdlcnk1enVraTV2MXdhdGNoNGlzczR4MXkwZG5leTRzdGVtczZ6MnRhYjFpcGVpNGxrMm9iYW80cmdldDR0YW1vdG9yczZyMnRvbzR4MGkzYzBpMmQwazJlYW0yY2gwbm9sb2d5OGwxbWFzZWs1bm5pczR2YTNmMWcxaDBkMWVhdGVyMnJlNmlhYTJja2V0czVlbmRhNHBzMnJlczJvbDRqMG1heHg0eDJrMG1heHg1bDFtMGFsbDRuMW8wZGF5M2t5bzNvbHMzcDFyYXkzc2hpYmE1dGFsM3VyczN3bjJ5b3RhM3MzcjBhZGUxaW5nNGluaW5nNXZlbDBlcnMwaW5zdXJhbmNlMTZ1c3QzdjJ0MXViZTJpMW5lczNzaHU0djBzMncxejJ1YTFiYW5rM3MyZzFrMW5pY29tM3ZlcnNpdHk4bzJvbDJwczJzMXkxejJ2YTBjYXRpb25zN25hMWd1YXJkN2MxZTBnYXMzbnR1cmVzNnJpc2lnbjVtXHUwMEY2Z2Vuc2JlcmF0ZXIydW5nMTRzaWNoZXJ1bmcxMHQyZzFpMGFqZXM0ZGVvM2cxa2luZzRsbGFzNG4xcDFyZ2luNHNhMWlvbjR2YTFvM2xhYW5kZXJlbjluMW9ka2EzbHZvM3RlMWluZzNvMnlhZ2U1dTJ3YWxlczJtYXJ0NHRlcjRuZzBnb3U1dGNoMGVzNmVhdGhlcjBjaGFubmVsMTJiY2FtM2VyMnNpdGU1ZDBkaW5nNWlibzJyM2YxaG9zd2hvNmllbjJraTJsbGlhbWhpbGw5bjBkb3dzNGUxbmVyczZtZTJvbHRlcnNrbHV3ZXIxMW9kc2lkZTZyazBzMmxkM3cyczF0YzFmM3hib3gzZXJveDRmaW5pdHk2aWh1YW40bjJ4eDJ5ejN5YWNodHM0aG9vM21heHVuNW5kZXg1ZTFvZG9iYXNoaTdnYTJrb2hhbWE2dTB0dWJlNnQxdW4zemEwcHBvczRyYTNlcm8zaXAybTFvbmUzdWVyaWNoNncyJztcbi8vIEludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lcyBjb250YWluaW5nIG5vbi1BU0NJSVxuY29uc3QgZW5jb2RlZFV0bGRzID0gJ1x1MDNCNVx1MDNCQjFcdTAzQzUyXHUwNDMxXHUwNDMzMVx1MDQzNVx1MDQzQjNcdTA0MzRcdTA0MzVcdTA0NDJcdTA0Mzg0XHUwNDM1XHUwNDRFMlx1MDQzQVx1MDQzMFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQzOFx1MDQzQTZcdTA0M0VcdTA0M0MzXHUwNDNDXHUwNDNBXHUwNDM0Mlx1MDQzRVx1MDQzRDFcdTA0NDFcdTA0M0FcdTA0MzJcdTA0MzA2XHUwNDNFXHUwNDNEXHUwNDNCXHUwNDMwXHUwNDM5XHUwNDNENVx1MDQ0MFx1MDQzMzNcdTA0NDBcdTA0NDNcdTA0NDEyXHUwNDQ0Mlx1MDQ0MVx1MDQzMFx1MDQzOVx1MDQ0MjNcdTA0NDBcdTA0MzEzXHUwNDQzXHUwNDNBXHUwNDQwM1x1MDQ5Qlx1MDQzMFx1MDQzNzNcdTA1NzBcdTA1NjFcdTA1NzUzXHUwNUQ5XHUwNUU5XHUwNUU4XHUwNUQwXHUwNURDNVx1MDVFN1x1MDVENVx1MDVERDNcdTA2MjdcdTA2MjhcdTA2NDhcdTA2MzhcdTA2MjhcdTA2NEE1XHUwNjMxXHUwNjI3XHUwNjQ1XHUwNjQzXHUwNjQ4NVx1MDY0NFx1MDYyN1x1MDYzMVx1MDYyRlx1MDY0NjRcdTA2MjhcdTA2MkRcdTA2MzFcdTA2NEFcdTA2NDY1XHUwNjJDXHUwNjMyXHUwNjI3XHUwNjI2XHUwNjMxNVx1MDYzM1x1MDYzOVx1MDY0OFx1MDYyRlx1MDY0QVx1MDYyOTZcdTA2MzlcdTA2NDRcdTA2NEFcdTA2MjdcdTA2NDY1XHUwNjQ1XHUwNjNBXHUwNjMxXHUwNjI4NVx1MDY0NVx1MDYyN1x1MDYzMVx1MDYyN1x1MDYyQTVcdTA2Q0NcdTA2MzFcdTA2MjdcdTA2NDY1XHUwNjI4XHUwNjI3XHUwNjMxXHUwNjJBMlx1MDYzMlx1MDYyN1x1MDYzMTRcdTA2NEFcdTA2MkFcdTA2NDMzXHUwNkJFXHUwNjI3XHUwNjMxXHUwNjJBNVx1MDYyQVx1MDY0OFx1MDY0Nlx1MDYzMzRcdTA2MzNcdTA2NDhcdTA2MkZcdTA2MjdcdTA2NDYzXHUwNjMxXHUwNjRBXHUwNjI5NVx1MDYzNFx1MDYyOFx1MDY0M1x1MDYyOTRcdTA2MzlcdTA2MzFcdTA2MjdcdTA2NDIyXHUwNjI4Mlx1MDY0NVx1MDYyN1x1MDY0NjRcdTA2NDFcdTA2NDRcdTA2MzNcdTA2MzdcdTA2NEFcdTA2NDY2XHUwNjQyXHUwNjM3XHUwNjMxM1x1MDY0M1x1MDYyN1x1MDYyQlx1MDY0OFx1MDY0NFx1MDY0QVx1MDY0MzZcdTA2NDhcdTA2NDUzXHUwNjQ1XHUwNjM1XHUwNjMxMlx1MDY0NFx1MDY0QVx1MDYzM1x1MDY0QVx1MDYyNzVcdTA2NDhcdTA2MzFcdTA2NEFcdTA2MkFcdTA2MjdcdTA2NDZcdTA2NEFcdTA2Mjc3XHUwNjQyXHUwNjM5NFx1MDY0N1x1MDY0NVx1MDYzMVx1MDYyN1x1MDY0NzVcdTA2N0VcdTA2MjdcdTA2QTlcdTA2MzNcdTA2MkFcdTA2MjdcdTA2NDY3XHUwNjgwXHUwNjI3XHUwNjMxXHUwNjJBNFx1MDkxNVx1MDk0OVx1MDkyRTNcdTA5MjhcdTA5NDdcdTA5MUYzXHUwOTJEXHUwOTNFXHUwOTMwXHUwOTI0MFx1MDkyRVx1MDk0RDNcdTA5NEJcdTA5MjQ1XHUwOTM4XHUwOTAyXHUwOTE3XHUwOTIwXHUwOTI4NVx1MDlBQ1x1MDlCRVx1MDk4Mlx1MDlCMlx1MDlCRTVcdTA5QURcdTA5QkVcdTA5QjBcdTA5QTQyXHUwOUYwXHUwOUE0NFx1MEEyRFx1MEEzRVx1MEEzMFx1MEEyNDRcdTBBQURcdTBBQkVcdTBBQjBcdTBBQTQ0XHUwQjJEXHUwQjNFXHUwQjMwXHUwQjI0NFx1MEI4N1x1MEJBOFx1MEJDRFx1MEJBNFx1MEJCRlx1MEJBRlx1MEJCRTZcdTBCQjJcdTBCOTlcdTBCQ0RcdTBCOTVcdTBCQzg2XHUwQjlBXHUwQkJGXHUwQjk5XHUwQkNEXHUwQjk1XHUwQkFBXHUwQkNEXHUwQkFBXHUwQkMyXHUwQkIwXHUwQkNEMTFcdTBDMkRcdTBDM0VcdTBDMzBcdTBDMjRcdTBDNEQ1XHUwQ0FEXHUwQ0JFXHUwQ0IwXHUwQ0E0NFx1MEQyRFx1MEQzRVx1MEQzMFx1MEQyNFx1MEQwMjVcdTBEQkRcdTBEODJcdTBEOUFcdTBEQ0Y0XHUwRTA0XHUwRTJEXHUwRTIxM1x1MEU0NFx1MEUxN1x1MEUyMjNcdTBFQTVcdTBFQjJcdTBFQTczXHUxMEQyXHUxMEQ0Mlx1MzA3Rlx1MzA5M1x1MzA2QTNcdTMwQTJcdTMwREVcdTMwQkVcdTMwRjM0XHUzMEFGXHUzMEU5XHUzMEE2XHUzMEM5NFx1MzBCMFx1MzBGQ1x1MzBCMFx1MzBFQjRcdTMwQjNcdTMwRTAyXHUzMEI5XHUzMEM4XHUzMEEyM1x1MzBCQlx1MzBGQ1x1MzBFQjNcdTMwRDVcdTMwQTFcdTMwQzNcdTMwQjdcdTMwRTdcdTMwRjM2XHUzMEREXHUzMEE0XHUzMEYzXHUzMEM4NFx1NEUxNlx1NzU0QzJcdTRFMkRcdTRGRTExXHU1NkZEMVx1NTcwQjFcdTY1ODdcdTdGNTEzXHU0RTlBXHU5QTZDXHU5MDBBM1x1NEYwMVx1NEUxQTJcdTRGNUJcdTVDNzEyXHU0RkUxXHU2MDZGMlx1NTA2NVx1NUVCNzJcdTUxNkJcdTUzNjYyXHU1MTZDXHU1M0Y4MVx1NzZDQTJcdTUzRjBcdTZFN0UxXHU3MDYzMlx1NTU0Nlx1NTdDRTFcdTVFOTcxXHU2ODA3Mlx1NTYwOVx1OTFDQzBcdTU5MjdcdTkxNTJcdTVFOTc1XHU1NzI4XHU3RUJGMlx1NTkyN1x1NjJGRjJcdTU5MjlcdTRFM0JcdTY1NTkzXHU1QTMxXHU0RTUwMlx1NUJCNlx1OTZGQjJcdTVFN0ZcdTRFMUMyXHU1RkFFXHU1MzVBMlx1NjE0OFx1NTU4NDJcdTYyMTFcdTcyMzFcdTRGNjAzXHU2MjRCXHU2NzNBMlx1NjJEQlx1ODA1ODJcdTY1M0ZcdTUyQTExXHU1RTlDMlx1NjVCMFx1NTJBMFx1NTc2MTJcdTk1RkIyXHU2NUY2XHU1QzFBMlx1NjZGOFx1N0M0RDJcdTY3M0FcdTY3ODQyXHU2REUxXHU5QTZDXHU5NTIxM1x1NkUzOFx1NjIwRjJcdTZGQjNcdTk1ODAyXHU3MEI5XHU3NzBCMlx1NzlGQlx1NTJBODJcdTdFQzRcdTdFQzdcdTY3M0FcdTY3ODQ0XHU3RjUxXHU1NzQwMVx1NUU5NzFcdTdBRDkxXHU3RURDMlx1ODA1NFx1OTAxQTJcdThDMzdcdTZCNEMyXHU4RDJEXHU3MjY5Mlx1OTAxQVx1OENBOTJcdTk2QzZcdTU2RTIyXHU5NkZCXHU4QTBBXHU3NkM4XHU3OUQxNFx1OThERVx1NTIyOVx1NkQ2NjNcdTk4REZcdTU0QzEyXHU5OTEwXHU1Mzg1Mlx1OTk5OVx1NjgzQ1x1OTFDQ1x1NjJDOTNcdTZFMkYyXHVCMkY3XHVCMTM3MVx1Q0VGNDJcdUMwQkNcdUMxMzEyXHVENTVDXHVBRDZEMic7XG5cbi8qKlxuICogQHRlbXBsYXRlIEFcbiAqIEB0ZW1wbGF0ZSBCXG4gKiBAcGFyYW0ge0F9IHRhcmdldFxuICogQHBhcmFtIHtCfSBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtBICYgQn1cbiAqL1xuY29uc3QgYXNzaWduID0gKHRhcmdldCwgcHJvcGVydGllcykgPT4ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgdGFyZ2V0W2tleV0gPSBwcm9wZXJ0aWVzW2tleV07XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbi8qKlxuICogRmluaXRlIFN0YXRlIE1hY2hpbmUgZ2VuZXJhdGlvbiB1dGlsaXRpZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7eyBbZ3JvdXA6IHN0cmluZ106IFRbXSB9fSBDb2xsZWN0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgW2dyb3VwOiBzdHJpbmddOiB0cnVlIH19IEZsYWdzXG4gKi9cblxuLy8gS2V5cyBpbiBzY2FubmVyIENvbGxlY3Rpb25zIGluc3RhbmNlc1xuY29uc3QgbnVtZXJpYyA9ICdudW1lcmljJztcbmNvbnN0IGFzY2lpID0gJ2FzY2lpJztcbmNvbnN0IGFscGhhID0gJ2FscGhhJztcbmNvbnN0IGFzY2lpbnVtZXJpYyA9ICdhc2NpaW51bWVyaWMnO1xuY29uc3QgYWxwaGFudW1lcmljID0gJ2FscGhhbnVtZXJpYyc7XG5jb25zdCBkb21haW4gPSAnZG9tYWluJztcbmNvbnN0IGVtb2ppID0gJ2Vtb2ppJztcbmNvbnN0IHNjaGVtZSA9ICdzY2hlbWUnO1xuY29uc3Qgc2xhc2hzY2hlbWUgPSAnc2xhc2hzY2hlbWUnO1xuY29uc3Qgd2hpdGVzcGFjZSA9ICd3aGl0ZXNwYWNlJztcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IGdyb3VwcyB0byByZWdpc3RlciBpblxuICogQHJldHVybnMge1RbXX0gQ3VycmVudCBsaXN0IG9mIHRva2VucyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvblxuICovXG5mdW5jdGlvbiByZWdpc3Rlckdyb3VwKG5hbWUsIGdyb3Vwcykge1xuICBpZiAoIShuYW1lIGluIGdyb3VwcykpIHtcbiAgICBncm91cHNbbmFtZV0gPSBbXTtcbiAgfVxuICByZXR1cm4gZ3JvdXBzW25hbWVdO1xufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHQgdG9rZW4gdG8gYWRkXG4gKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBncm91cHNcbiAqIEBwYXJhbSB7RmxhZ3N9IGZsYWdzXG4gKi9cbmZ1bmN0aW9uIGFkZFRvR3JvdXBzKHQsIGZsYWdzLCBncm91cHMpIHtcbiAgaWYgKGZsYWdzW251bWVyaWNdKSB7XG4gICAgZmxhZ3NbYXNjaWludW1lcmljXSA9IHRydWU7XG4gICAgZmxhZ3NbYWxwaGFudW1lcmljXSA9IHRydWU7XG4gIH1cbiAgaWYgKGZsYWdzW2FzY2lpXSkge1xuICAgIGZsYWdzW2FzY2lpbnVtZXJpY10gPSB0cnVlO1xuICAgIGZsYWdzW2FscGhhXSA9IHRydWU7XG4gIH1cbiAgaWYgKGZsYWdzW2FzY2lpbnVtZXJpY10pIHtcbiAgICBmbGFnc1thbHBoYW51bWVyaWNdID0gdHJ1ZTtcbiAgfVxuICBpZiAoZmxhZ3NbYWxwaGFdKSB7XG4gICAgZmxhZ3NbYWxwaGFudW1lcmljXSA9IHRydWU7XG4gIH1cbiAgaWYgKGZsYWdzW2FscGhhbnVtZXJpY10pIHtcbiAgICBmbGFnc1tkb21haW5dID0gdHJ1ZTtcbiAgfVxuICBpZiAoZmxhZ3NbZW1vamldKSB7XG4gICAgZmxhZ3NbZG9tYWluXSA9IHRydWU7XG4gIH1cbiAgZm9yIChjb25zdCBrIGluIGZsYWdzKSB7XG4gICAgY29uc3QgZ3JvdXAgPSByZWdpc3Rlckdyb3VwKGssIGdyb3Vwcyk7XG4gICAgaWYgKGdyb3VwLmluZGV4T2YodCkgPCAwKSB7XG4gICAgICBncm91cC5wdXNoKHQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHQgdG9rZW4gdG8gY2hlY2tcbiAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IGdyb3Vwc1xuICogQHJldHVybnMge0ZsYWdzfSBncm91cCBmbGFncyB0aGF0IGNvbnRhaW4gdGhpcyB0b2tlblxuICovXG5mdW5jdGlvbiBmbGFnc0ZvclRva2VuKHQsIGdyb3Vwcykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBjIGluIGdyb3Vwcykge1xuICAgIGlmIChncm91cHNbY10uaW5kZXhPZih0KSA+PSAwKSB7XG4gICAgICByZXN1bHRbY10gPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7bnVsbCB8IFQgfSBUcmFuc2l0aW9uXG4gKi9cblxuLyoqXG4gKiBEZWZpbmUgYSBiYXNpYyBzdGF0ZSBtYWNoaW5lIHN0YXRlLiBqIGlzIHRoZSBsaXN0IG9mIGNoYXJhY3RlciB0cmFuc2l0aW9ucyxcbiAqIGpyIGlzIHRoZSBsaXN0IG9mIHJlZ2V4LW1hdGNoIHRyYW5zaXRpb25zLCBqZCBpcyB0aGUgZGVmYXVsdCBzdGF0ZSB0b1xuICogdHJhbnNpdGlvbiB0byB0IGlzIHRoZSBhY2NlcHRpbmcgdG9rZW4gdHlwZSwgaWYgYW55LiBJZiB0aGlzIGlzIHRoZSB0ZXJtaW5hbFxuICogc3RhdGUsIHRoZW4gaXQgZG9lcyBub3QgZW1pdCBhIHRva2VuLlxuICpcbiAqIFRoZSB0ZW1wbGF0ZSB0eXBlIFQgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gdGhpcyBzdGF0ZSBhY2NlcHRzLiBUaGlzXG4gKiBzaG91bGQgYmUgYSBzdHJpbmcgKHN1Y2ggYXMgb2YgdGhlIHRva2VuIGV4cG9ydHMgaW4gYHRleHQuanNgKSBvciBhXG4gKiBNdWx0aVRva2VuIHN1YmNsYXNzIChmcm9tIGBtdWx0aS5qc2ApXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gW3Rva2VuXSBUb2tlbiB0aGF0IHRoaXMgc3RhdGUgZW1pdHNcbiAqL1xuZnVuY3Rpb24gU3RhdGUodG9rZW4pIHtcbiAgaWYgKHRva2VuID09PSB2b2lkIDApIHtcbiAgICB0b2tlbiA9IG51bGw7XG4gIH1cbiAgLy8gdGhpcy5uID0gbnVsbDsgLy8gREVCVUc6IFN0YXRlIG5hbWVcbiAgLyoqIEB0eXBlIHt7IFtpbnB1dDogc3RyaW5nXTogU3RhdGU8VD4gfX0gaiAqL1xuICB0aGlzLmogPSB7fTsgLy8gSU1QTEVNRU5UQVRJT04gMVxuICAvLyB0aGlzLmogPSBbXTsgLy8gSU1QTEVNRU5UQVRJT04gMlxuICAvKiogQHR5cGUge1tSZWdFeHAsIFN0YXRlPFQ+XVtdfSBqciAqL1xuICB0aGlzLmpyID0gW107XG4gIC8qKiBAdHlwZSB7P1N0YXRlPFQ+fSBqZCAqL1xuICB0aGlzLmpkID0gbnVsbDtcbiAgLyoqIEB0eXBlIHs/VH0gdCAqL1xuICB0aGlzLnQgPSB0b2tlbjtcbn1cblxuLyoqXG4gKiBTY2FubmVyIHRva2VuIGdyb3Vwc1xuICogQHR5cGUgQ29sbGVjdGlvbnM8c3RyaW5nPlxuICovXG5TdGF0ZS5ncm91cHMgPSB7fTtcblN0YXRlLnByb3RvdHlwZSA9IHtcbiAgYWNjZXB0cygpIHtcbiAgICByZXR1cm4gISF0aGlzLnQ7XG4gIH0sXG4gIC8qKlxuICAgKiBGb2xsb3cgYW4gZXhpc3RpbmcgdHJhbnNpdGlvbiBmcm9tIHRoZSBnaXZlbiBpbnB1dCB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICogRG9lcyBub3QgbXV0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgY2hhcmFjdGVyIG9yIHRva2VuIHR5cGUgdG8gdHJhbnNpdGlvbiBvblxuICAgKiBAcmV0dXJucyB7P1N0YXRlPFQ+fSB0aGUgbmV4dCBzdGF0ZSwgaWYgYW55XG4gICAqL1xuICBnbyhpbnB1dCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcztcbiAgICBjb25zdCBuZXh0U3RhdGUgPSBzdGF0ZS5qW2lucHV0XTtcbiAgICBpZiAobmV4dFN0YXRlKSB7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLmpyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZWdleCA9IHN0YXRlLmpyW2ldWzBdO1xuICAgICAgY29uc3QgbmV4dFN0YXRlID0gc3RhdGUuanJbaV1bMV07IC8vIG5vdGU6IG1pZ2h0IGJlIGVtcHR5IHRvIHByZXZlbnQgZGVmYXVsdCBqdW1wXG4gICAgICBpZiAobmV4dFN0YXRlICYmIHJlZ2V4LnRlc3QoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vd2hlcmUgbGVmdCB0byBqdW1wISBSZXR1cm4gZGVmYXVsdCwgaWYgYW55XG4gICAgcmV0dXJuIHN0YXRlLmpkO1xuICB9LFxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RhdGUgaGFzIGEgdHJhbnNpdGlvbiBmb3IgdGhlIGdpdmVuIGlucHV0LiBTZXQgdGhlIHNlY29uZFxuICAgKiBhcmd1bWVudCB0byB0cnVlIHRvIG9ubHkgbG9vayBmb3IgYW4gZXhhY3QgbWF0Y2ggKGFuZCBub3QgYSBkZWZhdWx0IG9yXG4gICAqIHJlZ3VsYXItZXhwcmVzc2lvbi1iYXNlZCB0cmFuc2l0aW9uKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcbiAgICogQHBhcmFtIHtib29sZWFufSBleGFjdE9ubHlcbiAgICovXG4gIGhhcyhpbnB1dCwgZXhhY3RPbmx5KSB7XG4gICAgaWYgKGV4YWN0T25seSA9PT0gdm9pZCAwKSB7XG4gICAgICBleGFjdE9ubHkgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGV4YWN0T25seSA/IGlucHV0IGluIHRoaXMuaiA6ICEhdGhpcy5nbyhpbnB1dCk7XG4gIH0sXG4gIC8qKlxuICAgKiBTaG9ydCBmb3IgXCJ0cmFuc2l0aW9uIGFsbFwiOyBjcmVhdGUgYSB0cmFuc2l0aW9uIGZyb20gdGhlIGFycmF5IG9mIGl0ZW1zXG4gICAqIGluIHRoZSBnaXZlbiBsaXN0IHRvIHRoZSBzYW1lIGZpbmFsIHJlc3VsdGluZyBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gaW5wdXRzIEdyb3VwIG9mIGlucHV0cyB0byB0cmFuc2l0aW9uIG9uXG4gICAqIEBwYXJhbSB7VHJhbnNpdGlvbjxUPiB8IFN0YXRlPFQ+fSBbbmV4dF0gVHJhbnNpdGlvbiBvcHRpb25zXG4gICAqIEBwYXJhbSB7RmxhZ3N9IFtmbGFnc10gQ29sbGVjdGlvbnMgZmxhZ3MgdG8gYWRkIHRva2VuIHRvXG4gICAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IFtncm91cHNdIE1hc3RlciBsaXN0IG9mIHRva2VuIGdyb3Vwc1xuICAgKi9cbiAgdGEoaW5wdXRzLCBuZXh0LCBmbGFncywgZ3JvdXBzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudHQoaW5wdXRzW2ldLCBuZXh0LCBmbGFncywgZ3JvdXBzKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBTaG9ydCBmb3IgXCJ0YWtlIHJlZ2V4cCB0cmFuc2l0aW9uXCI7IGRlZmluZXMgYSB0cmFuc2l0aW9uIGZvciB0aGlzIHN0YXRlXG4gICAqIHdoZW4gaXQgZW5jb3VudGVycyBhIHRva2VuIHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwIFJlZ3VsYXIgZXhwcmVzc2lvbiB0cmFuc2l0aW9uIChwb3B1bGF0ZSBmaXJzdClcbiAgICogQHBhcmFtIHtUIHwgU3RhdGU8VD59IFtuZXh0XSBUcmFuc2l0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXSBDb2xsZWN0aW9ucyBmbGFncyB0byBhZGQgdG9rZW4gdG9cbiAgICogQHBhcmFtIHtDb2xsZWN0aW9uczxUPn0gW2dyb3Vwc10gTWFzdGVyIGxpc3Qgb2YgdG9rZW4gZ3JvdXBzXG4gICAqIEByZXR1cm5zIHtTdGF0ZTxUPn0gdGFrZW4gYWZ0ZXIgdGhlIGdpdmVuIGlucHV0XG4gICAqL1xuICB0cihyZWdleHAsIG5leHQsIGZsYWdzLCBncm91cHMpIHtcbiAgICBncm91cHMgPSBncm91cHMgfHwgU3RhdGUuZ3JvdXBzO1xuICAgIGxldCBuZXh0U3RhdGU7XG4gICAgaWYgKG5leHQgJiYgbmV4dC5qKSB7XG4gICAgICBuZXh0U3RhdGUgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUb2tlbiB3aXRoIG1heWJlIHRva2VuIGdyb3Vwc1xuICAgICAgbmV4dFN0YXRlID0gbmV3IFN0YXRlKG5leHQpO1xuICAgICAgaWYgKGZsYWdzICYmIGdyb3Vwcykge1xuICAgICAgICBhZGRUb0dyb3VwcyhuZXh0LCBmbGFncywgZ3JvdXBzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5qci5wdXNoKFtyZWdleHAsIG5leHRTdGF0ZV0pO1xuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH0sXG4gIC8qKlxuICAgKiBTaG9ydCBmb3IgXCJ0YWtlIHRyYW5zaXRpb25zXCIsIHdpbGwgdGFrZSBhcyBtYW55IHNlcXVlbnRpYWwgdHJhbnNpdGlvbnMgYXNcbiAgICogdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gaW5wdXQgYW5kIHJldHVybnMgdGhlXG4gICAqIHJlc3VsdGluZyBmaW5hbCBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gaW5wdXRcbiAgICogQHBhcmFtIHtUIHwgU3RhdGU8VD59IFtuZXh0XSBUcmFuc2l0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXSBDb2xsZWN0aW9ucyBmbGFncyB0byBhZGQgdG9rZW4gdG9cbiAgICogQHBhcmFtIHtDb2xsZWN0aW9uczxUPn0gW2dyb3Vwc10gTWFzdGVyIGxpc3Qgb2YgdG9rZW4gZ3JvdXBzXG4gICAqIEByZXR1cm5zIHtTdGF0ZTxUPn0gdGFrZW4gYWZ0ZXIgdGhlIGdpdmVuIGlucHV0XG4gICAqL1xuICB0cyhpbnB1dCwgbmV4dCwgZmxhZ3MsIGdyb3Vwcykge1xuICAgIGxldCBzdGF0ZSA9IHRoaXM7XG4gICAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICAgIGlmICghbGVuKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7XG4gICAgICBzdGF0ZSA9IHN0YXRlLnR0KGlucHV0W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLnR0KGlucHV0W2xlbiAtIDFdLCBuZXh0LCBmbGFncywgZ3JvdXBzKTtcbiAgfSxcbiAgLyoqXG4gICAqIFNob3J0IGZvciBcInRha2UgdHJhbnNpdGlvblwiLCB0aGlzIGlzIGEgbWV0aG9kIGZvciBidWlsZGluZy93b3JraW5nIHdpdGhcbiAgICogc3RhdGUgbWFjaGluZXMuXG4gICAqXG4gICAqIElmIGEgc3RhdGUgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBnaXZlbiBpbnB1dCwgcmV0dXJucyBpdC5cbiAgICpcbiAgICogSWYgYSB0b2tlbiBpcyBzcGVjaWZpZWQsIHRoYXQgc3RhdGUgd2lsbCBlbWl0IHRoYXQgdG9rZW4gd2hlbiByZWFjaGVkIGJ5XG4gICAqIHRoZSBsaW5raWZ5IGVuZ2luZS5cbiAgICpcbiAgICogSWYgbm8gc3RhdGUgZXhpc3RzLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggc29tZSBkZWZhdWx0IHRyYW5zaXRpb25zXG4gICAqIHRoYXQgcmVzZW1ibGUgZXhpc3RpbmcgZGVmYXVsdCB0cmFuc2l0aW9ucy5cbiAgICpcbiAgICogSWYgYSBzdGF0ZSBpcyBnaXZlbiBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCwgdGhhdCBzdGF0ZSB3aWxsIGJlXG4gICAqIHRyYW5zaXRpb25lZCB0byBvbiB0aGUgZ2l2ZW4gaW5wdXQgcmVnYXJkbGVzcyBvZiB3aGF0IHRoYXQgaW5wdXRcbiAgICogcHJldmlvdXNseSBkaWQuXG4gICAqXG4gICAqIFNwZWNpZnkgYSB0b2tlbiBncm91cCBmbGFncyB0byBkZWZpbmUgZ3JvdXBzIHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvLlxuICAgKiBUaGUgdG9rZW4gd2lsbCBiZSBhZGRlZCB0byBjb3JyZXNwb25kaW5nIGVudGlyZXMgaW4gdGhlIGdpdmVuIGdyb3Vwc1xuICAgKiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBjaGFyYWN0ZXIsIHRva2VuIHR5cGUgdG8gdHJhbnNpdGlvbiBvblxuICAgKiBAcGFyYW0ge1QgfCBTdGF0ZTxUPn0gW25leHRdIFRyYW5zaXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0ZsYWdzfSBbZmxhZ3NdIENvbGxlY3Rpb25zIGZsYWdzIHRvIGFkZCB0b2tlbiB0b1xuICAgKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBbZ3JvdXBzXSBNYXN0ZXIgbGlzdCBvZiBncm91cHNcbiAgICogQHJldHVybnMge1N0YXRlPFQ+fSB0YWtlbiBhZnRlciB0aGUgZ2l2ZW4gaW5wdXRcbiAgICovXG4gIHR0KGlucHV0LCBuZXh0LCBmbGFncywgZ3JvdXBzKSB7XG4gICAgZ3JvdXBzID0gZ3JvdXBzIHx8IFN0YXRlLmdyb3VwcztcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXM7XG5cbiAgICAvLyBDaGVjayBpZiBleGlzdGluZyBzdGF0ZSBnaXZlbiwganVzdCBhIGJhc2ljIHRyYW5zaXRpb25cbiAgICBpZiAobmV4dCAmJiBuZXh0LmopIHtcbiAgICAgIHN0YXRlLmpbaW5wdXRdID0gbmV4dDtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cbiAgICBjb25zdCB0ID0gbmV4dDtcblxuICAgIC8vIFRha2UgdGhlIHRyYW5zaXRpb24gd2l0aCB0aGUgdXN1YWwgZGVmYXVsdCBtZWNoYW5pc21zIGFuZCB1c2UgdGhhdCBhc1xuICAgIC8vIGEgdGVtcGxhdGUgZm9yIGNyZWF0aW5nIHRoZSBuZXh0IHN0YXRlXG4gICAgbGV0IG5leHRTdGF0ZSxcbiAgICAgIHRlbXBsYXRlU3RhdGUgPSBzdGF0ZS5nbyhpbnB1dCk7XG4gICAgaWYgKHRlbXBsYXRlU3RhdGUpIHtcbiAgICAgIG5leHRTdGF0ZSA9IG5ldyBTdGF0ZSgpO1xuICAgICAgYXNzaWduKG5leHRTdGF0ZS5qLCB0ZW1wbGF0ZVN0YXRlLmopO1xuICAgICAgbmV4dFN0YXRlLmpyLnB1c2guYXBwbHkobmV4dFN0YXRlLmpyLCB0ZW1wbGF0ZVN0YXRlLmpyKTtcbiAgICAgIG5leHRTdGF0ZS5qZCA9IHRlbXBsYXRlU3RhdGUuamQ7XG4gICAgICBuZXh0U3RhdGUudCA9IHRlbXBsYXRlU3RhdGUudDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFN0YXRlID0gbmV3IFN0YXRlKCk7XG4gICAgfVxuICAgIGlmICh0KSB7XG4gICAgICAvLyBFbnN1cmUgbmV3bHkgdG9rZW4gaXMgaW4gdGhlIHNhbWUgZ3JvdXBzIGFzIHRoZSBvbGQgdG9rZW5cbiAgICAgIGlmIChncm91cHMpIHtcbiAgICAgICAgaWYgKG5leHRTdGF0ZS50ICYmIHR5cGVvZiBuZXh0U3RhdGUudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBhbGxGbGFncyA9IGFzc2lnbihmbGFnc0ZvclRva2VuKG5leHRTdGF0ZS50LCBncm91cHMpLCBmbGFncyk7XG4gICAgICAgICAgYWRkVG9Hcm91cHModCwgYWxsRmxhZ3MsIGdyb3Vwcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MpIHtcbiAgICAgICAgICBhZGRUb0dyb3Vwcyh0LCBmbGFncywgZ3JvdXBzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dFN0YXRlLnQgPSB0OyAvLyBvdmVyd3JpdGUgYW55dGhpbmcgdGhhdCB3YXMgcHJldmlvdXNseSB0aGVyZVxuICAgIH1cblxuICAgIHN0YXRlLmpbaW5wdXRdID0gbmV4dFN0YXRlO1xuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH1cbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgdG8gaW1wcm92ZSBtaW5pZmljYXRpb24gKG5vdCBleHBvcnRlZCBvdXRzaWRlIGxpbmtpZnlqcyBtb2R1bGUpXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3RhdGU8VD59IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBpbnB1dFxuICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXVxuICogQHBhcmFtIHtDb2xsZWN0aW9uczxUPn0gW2dyb3Vwc11cbiAqL1xuY29uc3QgdGEgPSAoc3RhdGUsIGlucHV0LCBuZXh0LCBmbGFncywgZ3JvdXBzKSA9PiBzdGF0ZS50YShpbnB1dCwgbmV4dCwgZmxhZ3MsIGdyb3Vwcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3RhdGU8VD59IHN0YXRlXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gKiBAcGFyYW0ge1QgfCBTdGF0ZTxUPn0gW25leHRdXG4gKiBAcGFyYW0ge0ZsYWdzfSBbZmxhZ3NdXG4gKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBbZ3JvdXBzXVxuICovXG5jb25zdCB0ciA9IChzdGF0ZSwgcmVnZXhwLCBuZXh0LCBmbGFncywgZ3JvdXBzKSA9PiBzdGF0ZS50cihyZWdleHAsIG5leHQsIGZsYWdzLCBncm91cHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N0YXRlPFQ+fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gaW5wdXRcbiAqIEBwYXJhbSB7VCB8IFN0YXRlPFQ+fSBbbmV4dF1cbiAqIEBwYXJhbSB7RmxhZ3N9IFtmbGFnc11cbiAqIEBwYXJhbSB7Q29sbGVjdGlvbnM8VD59IFtncm91cHNdXG4gKi9cbmNvbnN0IHRzID0gKHN0YXRlLCBpbnB1dCwgbmV4dCwgZmxhZ3MsIGdyb3VwcykgPT4gc3RhdGUudHMoaW5wdXQsIG5leHQsIGZsYWdzLCBncm91cHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N0YXRlPFQ+fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge1QgfCBTdGF0ZTxUPn0gW25leHRdXG4gKiBAcGFyYW0ge0NvbGxlY3Rpb25zPFQ+fSBbZ3JvdXBzXVxuICogQHBhcmFtIHtGbGFnc30gW2ZsYWdzXVxuICovXG5jb25zdCB0dCA9IChzdGF0ZSwgaW5wdXQsIG5leHQsIGZsYWdzLCBncm91cHMpID0+IHN0YXRlLnR0KGlucHV0LCBuZXh0LCBmbGFncywgZ3JvdXBzKTtcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuVGV4dCBUb2tlbnNcbklkZW50aWZpZXJzIGZvciB0b2tlbiBvdXRwdXRzIGZyb20gdGhlIHJlZ2V4cCBzY2FubmVyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIEEgdmFsaWQgd2ViIGRvbWFpbiB0b2tlblxuY29uc3QgV09SRCA9ICdXT1JEJzsgLy8gb25seSBjb250YWlucyBhLXpcbmNvbnN0IFVXT1JEID0gJ1VXT1JEJzsgLy8gY29udGFpbnMgbGV0dGVycyBvdGhlciB0aGFuIGEteiwgdXNlZCBmb3IgSUROXG5cbi8vIFNwZWNpYWwgY2FzZSBvZiB3b3JkXG5jb25zdCBMT0NBTEhPU1QgPSAnTE9DQUxIT1NUJztcblxuLy8gVmFsaWQgdG9wLWxldmVsIGRvbWFpbiwgc3BlY2lhbCBjYXNlIG9mIFdPUkQgKHNlZSB0bGRzLmpzKVxuY29uc3QgVExEID0gJ1RMRCc7XG5cbi8vIFZhbGlkIElETiBUTEQsIHNwZWNpYWwgY2FzZSBvZiBVV09SRCAoc2VlIHRsZHMuanMpXG5jb25zdCBVVExEID0gJ1VUTEQnO1xuXG4vLyBUaGUgc2NoZW1lIHBvcnRpb24gb2YgYSB3ZWIgVVJJIHByb3RvY29sLiBTdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZTogYG1haWx0b2AsXG4vLyBgZmlsZWAsIGFuZCB1c2VyLWRlZmluZWQgY3VzdG9tIHByb3RvY29scy4gTGltaXRlZCB0byBzY2hlbWVzIHRoYXQgY29udGFpblxuLy8gb25seSBsZXR0ZXJzXG5jb25zdCBTQ0hFTUUgPSAnU0NIRU1FJztcblxuLy8gU2ltaWxhciB0byBTQ0hFTUUsIGV4Y2VwdCBtYWtlcyBkaXN0aW5jdGlvbiBmb3Igc2NoZW1lcyB0aGF0IG11c3QgYWx3YXlzIGJlXG4vLyBmb2xsb3dlZCBieSBgOi8vYCwgbm90IGp1c3QgYDpgLiBTdXBwb3J0ZWQgdHlwZXMgaW5jbHVkZSBgaHR0cGAsIGBodHRwc2AsXG4vLyBgZnRwYCwgYGZ0cHNgXG5jb25zdCBTTEFTSF9TQ0hFTUUgPSAnU0xBU0hfU0NIRU1FJztcblxuLy8gQW55IHNlcXVlbmNlIG9mIGRpZ2l0cyAwLTlcbmNvbnN0IE5VTSA9ICdOVU0nO1xuXG4vLyBBbnkgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgbmV3bGluZVxuY29uc3QgV1MgPSAnV1MnO1xuXG4vLyBOZXcgbGluZSAodW5peCBzdHlsZSlcbmNvbnN0IE5MJDEgPSAnTkwnOyAvLyBcXG5cblxuLy8gT3BlbmluZy9jbG9zaW5nIGJyYWNrZXQgY2xhc3Nlc1xuLy8gVE9ETzogUmVuYW1lIE9QRU4gLT4gTEVGVCBhbmQgQ0xPU0UgLT4gUklHSFQgaW4gdjUgdG8gZml0IHdpdGggVW5pY29kZSBuYW1lc1xuLy8gQWxzbyByZW5hbWUgYW5nbGUgYnJhY2tlcyB0byBMRVNTVEhBTiBhbmQgR1JFQVRFUiBUSEFOXG5jb25zdCBPUEVOQlJBQ0UgPSAnT1BFTkJSQUNFJzsgLy8ge1xuY29uc3QgQ0xPU0VCUkFDRSA9ICdDTE9TRUJSQUNFJzsgLy8gfVxuY29uc3QgT1BFTkJSQUNLRVQgPSAnT1BFTkJSQUNLRVQnOyAvLyBbXG5jb25zdCBDTE9TRUJSQUNLRVQgPSAnQ0xPU0VCUkFDS0VUJzsgLy8gXVxuY29uc3QgT1BFTlBBUkVOID0gJ09QRU5QQVJFTic7IC8vIChcbmNvbnN0IENMT1NFUEFSRU4gPSAnQ0xPU0VQQVJFTic7IC8vIClcbmNvbnN0IE9QRU5BTkdMRUJSQUNLRVQgPSAnT1BFTkFOR0xFQlJBQ0tFVCc7IC8vIDxcbmNvbnN0IENMT1NFQU5HTEVCUkFDS0VUID0gJ0NMT1NFQU5HTEVCUkFDS0VUJzsgLy8gPlxuY29uc3QgRlVMTFdJRFRITEVGVFBBUkVOID0gJ0ZVTExXSURUSExFRlRQQVJFTic7IC8vIFx1RkYwOFxuY29uc3QgRlVMTFdJRFRIUklHSFRQQVJFTiA9ICdGVUxMV0lEVEhSSUdIVFBBUkVOJzsgLy8gXHVGRjA5XG5jb25zdCBMRUZUQ09STkVSQlJBQ0tFVCA9ICdMRUZUQ09STkVSQlJBQ0tFVCc7IC8vIFx1MzAwQ1xuY29uc3QgUklHSFRDT1JORVJCUkFDS0VUID0gJ1JJR0hUQ09STkVSQlJBQ0tFVCc7IC8vIFx1MzAwRFxuY29uc3QgTEVGVFdISVRFQ09STkVSQlJBQ0tFVCA9ICdMRUZUV0hJVEVDT1JORVJCUkFDS0VUJzsgLy8gXHUzMDBFXG5jb25zdCBSSUdIVFdISVRFQ09STkVSQlJBQ0tFVCA9ICdSSUdIVFdISVRFQ09STkVSQlJBQ0tFVCc7IC8vIFx1MzAwRlxuY29uc3QgRlVMTFdJRFRITEVTU1RIQU4gPSAnRlVMTFdJRFRITEVTU1RIQU4nOyAvLyBcdUZGMUNcbmNvbnN0IEZVTExXSURUSEdSRUFURVJUSEFOID0gJ0ZVTExXSURUSEdSRUFURVJUSEFOJzsgLy8gXHVGRjFFXG5cbi8vIFZhcmlvdXMgc3ltYm9sc1xuY29uc3QgQU1QRVJTQU5EID0gJ0FNUEVSU0FORCc7IC8vICZcbmNvbnN0IEFQT1NUUk9QSEUgPSAnQVBPU1RST1BIRSc7IC8vICdcbmNvbnN0IEFTVEVSSVNLID0gJ0FTVEVSSVNLJzsgLy8gKlxuY29uc3QgQVQgPSAnQVQnOyAvLyBAXG5jb25zdCBCQUNLU0xBU0ggPSAnQkFDS1NMQVNIJzsgLy8gXFxcbmNvbnN0IEJBQ0tUSUNLID0gJ0JBQ0tUSUNLJzsgLy8gYFxuY29uc3QgQ0FSRVQgPSAnQ0FSRVQnOyAvLyBeXG5jb25zdCBDT0xPTiA9ICdDT0xPTic7IC8vIDpcbmNvbnN0IENPTU1BID0gJ0NPTU1BJzsgLy8gLFxuY29uc3QgRE9MTEFSID0gJ0RPTExBUic7IC8vICRcbmNvbnN0IERPVCA9ICdET1QnOyAvLyAuXG5jb25zdCBFUVVBTFMgPSAnRVFVQUxTJzsgLy8gPVxuY29uc3QgRVhDTEFNQVRJT04gPSAnRVhDTEFNQVRJT04nOyAvLyAhXG5jb25zdCBIWVBIRU4gPSAnSFlQSEVOJzsgLy8gLVxuY29uc3QgUEVSQ0VOVCA9ICdQRVJDRU5UJzsgLy8gJVxuY29uc3QgUElQRSA9ICdQSVBFJzsgLy8gfFxuY29uc3QgUExVUyA9ICdQTFVTJzsgLy8gK1xuY29uc3QgUE9VTkQgPSAnUE9VTkQnOyAvLyAjXG5jb25zdCBRVUVSWSA9ICdRVUVSWSc7IC8vID9cbmNvbnN0IFFVT1RFID0gJ1FVT1RFJzsgLy8gXCJcblxuY29uc3QgU0VNSSA9ICdTRU1JJzsgLy8gO1xuY29uc3QgU0xBU0ggPSAnU0xBU0gnOyAvLyAvXG5jb25zdCBUSUxERSA9ICdUSUxERSc7IC8vIH5cbmNvbnN0IFVOREVSU0NPUkUgPSAnVU5ERVJTQ09SRSc7IC8vIF9cblxuLy8gRW1vamkgc3ltYm9sXG5jb25zdCBFTU9KSSQxID0gJ0VNT0pJJztcblxuLy8gRGVmYXVsdCB0b2tlbiAtIGFueXRoaW5nIHRoYXQgaXMgbm90IG9uZSBvZiB0aGUgYWJvdmVcbmNvbnN0IFNZTSA9ICdTWU0nO1xuXG52YXIgdGsgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0V09SRDogV09SRCxcblx0VVdPUkQ6IFVXT1JELFxuXHRMT0NBTEhPU1Q6IExPQ0FMSE9TVCxcblx0VExEOiBUTEQsXG5cdFVUTEQ6IFVUTEQsXG5cdFNDSEVNRTogU0NIRU1FLFxuXHRTTEFTSF9TQ0hFTUU6IFNMQVNIX1NDSEVNRSxcblx0TlVNOiBOVU0sXG5cdFdTOiBXUyxcblx0Tkw6IE5MJDEsXG5cdE9QRU5CUkFDRTogT1BFTkJSQUNFLFxuXHRDTE9TRUJSQUNFOiBDTE9TRUJSQUNFLFxuXHRPUEVOQlJBQ0tFVDogT1BFTkJSQUNLRVQsXG5cdENMT1NFQlJBQ0tFVDogQ0xPU0VCUkFDS0VULFxuXHRPUEVOUEFSRU46IE9QRU5QQVJFTixcblx0Q0xPU0VQQVJFTjogQ0xPU0VQQVJFTixcblx0T1BFTkFOR0xFQlJBQ0tFVDogT1BFTkFOR0xFQlJBQ0tFVCxcblx0Q0xPU0VBTkdMRUJSQUNLRVQ6IENMT1NFQU5HTEVCUkFDS0VULFxuXHRGVUxMV0lEVEhMRUZUUEFSRU46IEZVTExXSURUSExFRlRQQVJFTixcblx0RlVMTFdJRFRIUklHSFRQQVJFTjogRlVMTFdJRFRIUklHSFRQQVJFTixcblx0TEVGVENPUk5FUkJSQUNLRVQ6IExFRlRDT1JORVJCUkFDS0VULFxuXHRSSUdIVENPUk5FUkJSQUNLRVQ6IFJJR0hUQ09STkVSQlJBQ0tFVCxcblx0TEVGVFdISVRFQ09STkVSQlJBQ0tFVDogTEVGVFdISVRFQ09STkVSQlJBQ0tFVCxcblx0UklHSFRXSElURUNPUk5FUkJSQUNLRVQ6IFJJR0hUV0hJVEVDT1JORVJCUkFDS0VULFxuXHRGVUxMV0lEVEhMRVNTVEhBTjogRlVMTFdJRFRITEVTU1RIQU4sXG5cdEZVTExXSURUSEdSRUFURVJUSEFOOiBGVUxMV0lEVEhHUkVBVEVSVEhBTixcblx0QU1QRVJTQU5EOiBBTVBFUlNBTkQsXG5cdEFQT1NUUk9QSEU6IEFQT1NUUk9QSEUsXG5cdEFTVEVSSVNLOiBBU1RFUklTSyxcblx0QVQ6IEFULFxuXHRCQUNLU0xBU0g6IEJBQ0tTTEFTSCxcblx0QkFDS1RJQ0s6IEJBQ0tUSUNLLFxuXHRDQVJFVDogQ0FSRVQsXG5cdENPTE9OOiBDT0xPTixcblx0Q09NTUE6IENPTU1BLFxuXHRET0xMQVI6IERPTExBUixcblx0RE9UOiBET1QsXG5cdEVRVUFMUzogRVFVQUxTLFxuXHRFWENMQU1BVElPTjogRVhDTEFNQVRJT04sXG5cdEhZUEhFTjogSFlQSEVOLFxuXHRQRVJDRU5UOiBQRVJDRU5ULFxuXHRQSVBFOiBQSVBFLFxuXHRQTFVTOiBQTFVTLFxuXHRQT1VORDogUE9VTkQsXG5cdFFVRVJZOiBRVUVSWSxcblx0UVVPVEU6IFFVT1RFLFxuXHRTRU1JOiBTRU1JLFxuXHRTTEFTSDogU0xBU0gsXG5cdFRJTERFOiBUSUxERSxcblx0VU5ERVJTQ09SRTogVU5ERVJTQ09SRSxcblx0RU1PSkk6IEVNT0pJJDEsXG5cdFNZTTogU1lNXG59KTtcblxuLy8gTm90ZSB0aGF0IHRoZXNlIHR3byBVbmljb2RlIG9uZXMgZXhwYW5kIGludG8gYSByZWFsbHkgYmlnIG9uZSB3aXRoIEJhYmVsXG5jb25zdCBBU0NJSV9MRVRURVIgPSAvW2Etel0vO1xuY29uc3QgTEVUVEVSID0gL1xccHtMfS91OyAvLyBBbnkgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCBsZXR0ZXIgZGF0YSB0eXBlXG5jb25zdCBFTU9KSSA9IC9cXHB7RW1vaml9L3U7IC8vIEFueSBVbmljb2RlIGVtb2ppIGNoYXJhY3RlclxuY29uc3QgRU1PSklfVkFSSUFUSU9OJDEgPSAvXFx1ZmUwZi87XG5jb25zdCBESUdJVCA9IC9cXGQvO1xuY29uc3QgU1BBQ0UgPSAvXFxzLztcblxudmFyIHJlZ2V4cCA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRBU0NJSV9MRVRURVI6IEFTQ0lJX0xFVFRFUixcblx0TEVUVEVSOiBMRVRURVIsXG5cdEVNT0pJOiBFTU9KSSxcblx0RU1PSklfVkFSSUFUSU9OOiBFTU9KSV9WQVJJQVRJT04kMSxcblx0RElHSVQ6IERJR0lULFxuXHRTUEFDRTogU1BBQ0Vcbn0pO1xuXG4vKipcblx0VGhlIHNjYW5uZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRoYXQgdGFrZXMgYSBzdHJpbmcgb2YgdGV4dCBhcyBpbnB1dCwgYW5kXG5cdG91dHB1dHMgYW4gYXJyYXkgb2YgdG9rZW5zIGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBlYXN5IFVSTCBwYXJzaW5nLlxuKi9cbmNvbnN0IE5MID0gJ1xcbic7IC8vIE5ldyBsaW5lIGNoYXJhY3RlclxuY29uc3QgRU1PSklfVkFSSUFUSU9OID0gJ1xcdWZlMGYnOyAvLyBWYXJpYXRpb24gc2VsZWN0b3IsIGZvbGxvd3MgaGVhcnQgYW5kIG90aGVyc1xuY29uc3QgRU1PSklfSk9JTkVSID0gJ1xcdTIwMGQnOyAvLyB6ZXJvLXdpZHRoIGpvaW5lclxuXG5sZXQgdGxkcyA9IG51bGwsXG4gIHV0bGRzID0gbnVsbDsgLy8gZG9uJ3QgY2hhbmdlIHNvIG9ubHkgaGF2ZSB0byBiZSBjb21wdXRlZCBvbmNlXG5cbi8qKlxuICogU2Nhbm5lciBvdXRwdXQgdG9rZW46XG4gKiAtIGB0YCBpcyB0aGUgdG9rZW4gbmFtZSAoZS5nLiwgJ05VTScsICdFTU9KSScsICdUTEQnKVxuICogLSBgdmAgaXMgdGhlIHZhbHVlIG9mIHRoZSB0b2tlbiAoZS5nLiwgJzEyMycsICdcdTI3NjRcdUZFMEYnLCAnY29tJylcbiAqIC0gYHNgIGlzIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdG9rZW4gaW4gdGhlIG9yaWdpbmFsIHN0cmluZ1xuICogLSBgZWAgaXMgdGhlIGVuZCBpbmRleCBvZiB0aGUgdG9rZW4gaW4gdGhlIG9yaWdpbmFsIHN0cmluZ1xuICogQHR5cGVkZWYge3t0OiBzdHJpbmcsIHY6IHN0cmluZywgczogbnVtYmVyLCBlOiBudW1iZXJ9fSBUb2tlblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IFtjb2xsZWN0aW9uOiBzdHJpbmddOiBUW10gfX0gQ29sbGVjdGlvbnNcbiAqL1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHNjYW5uZXIgY2hhcmFjdGVyLWJhc2VkIHN0YXRlIG1hY2hpbmUgZm9yIHRoZSBnaXZlbiBzdGFydFxuICogc3RhdGVcbiAqIEBwYXJhbSB7W3N0cmluZywgYm9vbGVhbl1bXX0gY3VzdG9tU2NoZW1lcyBMaXN0IG9mIGN1c3RvbSBzY2hlbWVzLCB3aGVyZSBlYWNoXG4gKiBpdGVtIGlzIGEgbGVuZ3RoLTIgdHVwbGUgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBzZXQgdG8gdGhlIHN0cmluZyBzY2hlbWUsIGFuZFxuICogdGhlIHNlY29uZCBlbGVtZW50IHNldCB0byBgdHJ1ZWAgaWYgdGhlIGA6Ly9gIGFmdGVyIHRoZSBzY2hlbWUgaXMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gaW5pdCQyKGN1c3RvbVNjaGVtZXMpIHtcbiAgaWYgKGN1c3RvbVNjaGVtZXMgPT09IHZvaWQgMCkge1xuICAgIGN1c3RvbVNjaGVtZXMgPSBbXTtcbiAgfVxuICAvLyBGcmVxdWVudGx5IHVzZWQgc3RhdGVzIChuYW1lIGFyZ3VtZW50IHJlbW92ZWQgZHVyaW5nIG1pbmlmaWNhdGlvbilcbiAgLyoqIEB0eXBlIENvbGxlY3Rpb25zPHN0cmluZz4gKi9cbiAgY29uc3QgZ3JvdXBzID0ge307IC8vIG9mIHRva2Vuc1xuICBTdGF0ZS5ncm91cHMgPSBncm91cHM7XG4gIC8qKiBAdHlwZSBTdGF0ZTxzdHJpbmc+ICovXG4gIGNvbnN0IFN0YXJ0ID0gbmV3IFN0YXRlKCk7XG4gIGlmICh0bGRzID09IG51bGwpIHtcbiAgICB0bGRzID0gZGVjb2RlVGxkcyhlbmNvZGVkVGxkcyk7XG4gIH1cbiAgaWYgKHV0bGRzID09IG51bGwpIHtcbiAgICB1dGxkcyA9IGRlY29kZVRsZHMoZW5jb2RlZFV0bGRzKTtcbiAgfVxuXG4gIC8vIFN0YXRlcyBmb3Igc3BlY2lhbCBVUkwgc3ltYm9scyB0aGF0IGFjY2VwdCBpbW1lZGlhdGVseSBhZnRlciBzdGFydFxuICB0dChTdGFydCwgXCInXCIsIEFQT1NUUk9QSEUpO1xuICB0dChTdGFydCwgJ3snLCBPUEVOQlJBQ0UpO1xuICB0dChTdGFydCwgJ30nLCBDTE9TRUJSQUNFKTtcbiAgdHQoU3RhcnQsICdbJywgT1BFTkJSQUNLRVQpO1xuICB0dChTdGFydCwgJ10nLCBDTE9TRUJSQUNLRVQpO1xuICB0dChTdGFydCwgJygnLCBPUEVOUEFSRU4pO1xuICB0dChTdGFydCwgJyknLCBDTE9TRVBBUkVOKTtcbiAgdHQoU3RhcnQsICc8JywgT1BFTkFOR0xFQlJBQ0tFVCk7XG4gIHR0KFN0YXJ0LCAnPicsIENMT1NFQU5HTEVCUkFDS0VUKTtcbiAgdHQoU3RhcnQsICdcdUZGMDgnLCBGVUxMV0lEVEhMRUZUUEFSRU4pO1xuICB0dChTdGFydCwgJ1x1RkYwOScsIEZVTExXSURUSFJJR0hUUEFSRU4pO1xuICB0dChTdGFydCwgJ1x1MzAwQycsIExFRlRDT1JORVJCUkFDS0VUKTtcbiAgdHQoU3RhcnQsICdcdTMwMEQnLCBSSUdIVENPUk5FUkJSQUNLRVQpO1xuICB0dChTdGFydCwgJ1x1MzAwRScsIExFRlRXSElURUNPUk5FUkJSQUNLRVQpO1xuICB0dChTdGFydCwgJ1x1MzAwRicsIFJJR0hUV0hJVEVDT1JORVJCUkFDS0VUKTtcbiAgdHQoU3RhcnQsICdcdUZGMUMnLCBGVUxMV0lEVEhMRVNTVEhBTik7XG4gIHR0KFN0YXJ0LCAnXHVGRjFFJywgRlVMTFdJRFRIR1JFQVRFUlRIQU4pO1xuICB0dChTdGFydCwgJyYnLCBBTVBFUlNBTkQpO1xuICB0dChTdGFydCwgJyonLCBBU1RFUklTSyk7XG4gIHR0KFN0YXJ0LCAnQCcsIEFUKTtcbiAgdHQoU3RhcnQsICdgJywgQkFDS1RJQ0spO1xuICB0dChTdGFydCwgJ14nLCBDQVJFVCk7XG4gIHR0KFN0YXJ0LCAnOicsIENPTE9OKTtcbiAgdHQoU3RhcnQsICcsJywgQ09NTUEpO1xuICB0dChTdGFydCwgJyQnLCBET0xMQVIpO1xuICB0dChTdGFydCwgJy4nLCBET1QpO1xuICB0dChTdGFydCwgJz0nLCBFUVVBTFMpO1xuICB0dChTdGFydCwgJyEnLCBFWENMQU1BVElPTik7XG4gIHR0KFN0YXJ0LCAnLScsIEhZUEhFTik7XG4gIHR0KFN0YXJ0LCAnJScsIFBFUkNFTlQpO1xuICB0dChTdGFydCwgJ3wnLCBQSVBFKTtcbiAgdHQoU3RhcnQsICcrJywgUExVUyk7XG4gIHR0KFN0YXJ0LCAnIycsIFBPVU5EKTtcbiAgdHQoU3RhcnQsICc/JywgUVVFUlkpO1xuICB0dChTdGFydCwgJ1wiJywgUVVPVEUpO1xuICB0dChTdGFydCwgJy8nLCBTTEFTSCk7XG4gIHR0KFN0YXJ0LCAnOycsIFNFTUkpO1xuICB0dChTdGFydCwgJ34nLCBUSUxERSk7XG4gIHR0KFN0YXJ0LCAnXycsIFVOREVSU0NPUkUpO1xuICB0dChTdGFydCwgJ1xcXFwnLCBCQUNLU0xBU0gpO1xuICBjb25zdCBOdW0gPSB0cihTdGFydCwgRElHSVQsIE5VTSwge1xuICAgIFtudW1lcmljXTogdHJ1ZVxuICB9KTtcbiAgdHIoTnVtLCBESUdJVCwgTnVtKTtcblxuICAvLyBTdGF0ZSB3aGljaCBlbWl0cyBhIHdvcmQgdG9rZW5cbiAgY29uc3QgV29yZCA9IHRyKFN0YXJ0LCBBU0NJSV9MRVRURVIsIFdPUkQsIHtcbiAgICBbYXNjaWldOiB0cnVlXG4gIH0pO1xuICB0cihXb3JkLCBBU0NJSV9MRVRURVIsIFdvcmQpO1xuXG4gIC8vIFNhbWUgYXMgcHJldmlvdXMsIGJ1dCBzcGVjaWZpYyB0byBub24tZnNtLmFzY2lpIGFscGhhYmV0IHdvcmRzXG4gIGNvbnN0IFVXb3JkID0gdHIoU3RhcnQsIExFVFRFUiwgVVdPUkQsIHtcbiAgICBbYWxwaGFdOiB0cnVlXG4gIH0pO1xuICB0cihVV29yZCwgQVNDSUlfTEVUVEVSKTsgLy8gTm9uLWFjY2VwdGluZ1xuICB0cihVV29yZCwgTEVUVEVSLCBVV29yZCk7XG5cbiAgLy8gV2hpdGVzcGFjZSBqdW1wc1xuICAvLyBUb2tlbnMgb2Ygb25seSBub24tbmV3bGluZSB3aGl0ZXNwYWNlIGFyZSBhcmJpdHJhcmlseSBsb25nXG4gIC8vIElmIGFueSB3aGl0ZXNwYWNlIGV4Y2VwdCBuZXdsaW5lLCBtb3JlIHdoaXRlc3BhY2UhXG4gIGNvbnN0IFdzID0gdHIoU3RhcnQsIFNQQUNFLCBXUywge1xuICAgIFt3aGl0ZXNwYWNlXTogdHJ1ZVxuICB9KTtcbiAgdHQoU3RhcnQsIE5MLCBOTCQxLCB7XG4gICAgW3doaXRlc3BhY2VdOiB0cnVlXG4gIH0pO1xuICB0dChXcywgTkwpOyAvLyBub24tYWNjZXB0aW5nIHN0YXRlIHRvIGF2b2lkIG1peGluZyB3aGl0ZXNwYWNlc1xuICB0cihXcywgU1BBQ0UsIFdzKTtcblxuICAvLyBFbW9qaSB0b2tlbnMuIFRoZXkgYXJlIG5vdCBncm91cGVkIGJ5IHRoZSBzY2FubmVyIGV4Y2VwdCBpbiBjYXNlcyB3aGVyZSBhXG4gIC8vIHplcm8td2lkdGggam9pbmVyIGlzIHByZXNlbnRcbiAgY29uc3QgRW1vamkgPSB0cihTdGFydCwgRU1PSkksIEVNT0pJJDEsIHtcbiAgICBbZW1vamldOiB0cnVlXG4gIH0pO1xuICB0cihFbW9qaSwgRU1PSkksIEVtb2ppKTtcbiAgdHQoRW1vamksIEVNT0pJX1ZBUklBVElPTiwgRW1vamkpO1xuICAvLyB0dChTdGFydCwgRU1PSklfVkFSSUFUSU9OLCBFbW9qaSk7IC8vIFRoaXMgb25lIGlzIHNrZXRjaHlcblxuICBjb25zdCBFbW9qaUpvaW5lciA9IHR0KEVtb2ppLCBFTU9KSV9KT0lORVIpO1xuICB0cihFbW9qaUpvaW5lciwgRU1PSkksIEVtb2ppKTtcbiAgLy8gdHQoRW1vamlKb2luZXIsIEVNT0pJX1ZBUklBVElPTiwgRW1vamkpOyAvLyBhbHNvIHNrZXRjaHlcblxuICAvLyBHZW5lcmF0ZXMgc3RhdGVzIGZvciB0b3AtbGV2ZWwgZG9tYWluc1xuICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBtb3N0IGFjY3VyYXRlIHdoZW4gdGxkcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyXG4gIGNvbnN0IHdvcmRqciA9IFtbQVNDSUlfTEVUVEVSLCBXb3JkXV07XG4gIGNvbnN0IHV3b3JkanIgPSBbW0FTQ0lJX0xFVFRFUiwgbnVsbF0sIFtMRVRURVIsIFVXb3JkXV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGxkcy5sZW5ndGg7IGkrKykge1xuICAgIGZhc3R0cyhTdGFydCwgdGxkc1tpXSwgVExELCBXT1JELCB3b3JkanIpO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXRsZHMubGVuZ3RoOyBpKyspIHtcbiAgICBmYXN0dHMoU3RhcnQsIHV0bGRzW2ldLCBVVExELCBVV09SRCwgdXdvcmRqcik7XG4gIH1cbiAgYWRkVG9Hcm91cHMoVExELCB7XG4gICAgdGxkOiB0cnVlLFxuICAgIGFzY2lpOiB0cnVlXG4gIH0sIGdyb3Vwcyk7XG4gIGFkZFRvR3JvdXBzKFVUTEQsIHtcbiAgICB1dGxkOiB0cnVlLFxuICAgIGFscGhhOiB0cnVlXG4gIH0sIGdyb3Vwcyk7XG5cbiAgLy8gQ29sbGVjdCB0aGUgc3RhdGVzIGdlbmVyYXRlZCBieSBkaWZmZXJlbnQgcHJvdG9jb2xzLiBOT1RFOiBJZiBhbnkgbmV3IFRMRHNcbiAgLy8gZ2V0IGFkZGVkIHRoYXQgYXJlIGFsc28gcHJvdG9jb2xzLCBzZXQgdGhlIHRva2VuIHRvIGJlIHRoZSBzYW1lIGFzIHRoZVxuICAvLyBwcm90b2NvbCB0byBlbnN1cmUgcGFyc2luZyB3b3JrcyBhcyBleHBlY3RlZC5cbiAgZmFzdHRzKFN0YXJ0LCAnZmlsZScsIFNDSEVNRSwgV09SRCwgd29yZGpyKTtcbiAgZmFzdHRzKFN0YXJ0LCAnbWFpbHRvJywgU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBmYXN0dHMoU3RhcnQsICdodHRwJywgU0xBU0hfU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBmYXN0dHMoU3RhcnQsICdodHRwcycsIFNMQVNIX1NDSEVNRSwgV09SRCwgd29yZGpyKTtcbiAgZmFzdHRzKFN0YXJ0LCAnZnRwJywgU0xBU0hfU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBmYXN0dHMoU3RhcnQsICdmdHBzJywgU0xBU0hfU0NIRU1FLCBXT1JELCB3b3JkanIpO1xuICBhZGRUb0dyb3VwcyhTQ0hFTUUsIHtcbiAgICBzY2hlbWU6IHRydWUsXG4gICAgYXNjaWk6IHRydWVcbiAgfSwgZ3JvdXBzKTtcbiAgYWRkVG9Hcm91cHMoU0xBU0hfU0NIRU1FLCB7XG4gICAgc2xhc2hzY2hlbWU6IHRydWUsXG4gICAgYXNjaWk6IHRydWVcbiAgfSwgZ3JvdXBzKTtcblxuICAvLyBSZWdpc3RlciBjdXN0b20gc2NoZW1lcy4gQXNzdW1lcyBlYWNoIHNjaGVtZSBpcyBhc2NpaW51bWVyaWMgd2l0aCBoeXBoZW5zXG4gIGN1c3RvbVNjaGVtZXMgPSBjdXN0b21TY2hlbWVzLnNvcnQoKGEsIGIpID0+IGFbMF0gPiBiWzBdID8gMSA6IC0xKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXN0b21TY2hlbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2NoID0gY3VzdG9tU2NoZW1lc1tpXVswXTtcbiAgICBjb25zdCBvcHRpb25hbFNsYXNoU2xhc2ggPSBjdXN0b21TY2hlbWVzW2ldWzFdO1xuICAgIGNvbnN0IGZsYWdzID0gb3B0aW9uYWxTbGFzaFNsYXNoID8ge1xuICAgICAgW3NjaGVtZV06IHRydWVcbiAgICB9IDoge1xuICAgICAgW3NsYXNoc2NoZW1lXTogdHJ1ZVxuICAgIH07XG4gICAgaWYgKHNjaC5pbmRleE9mKCctJykgPj0gMCkge1xuICAgICAgZmxhZ3NbZG9tYWluXSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghQVNDSUlfTEVUVEVSLnRlc3Qoc2NoKSkge1xuICAgICAgZmxhZ3NbbnVtZXJpY10gPSB0cnVlOyAvLyBudW1iZXJzIG9ubHlcbiAgICB9IGVsc2UgaWYgKERJR0lULnRlc3Qoc2NoKSkge1xuICAgICAgZmxhZ3NbYXNjaWludW1lcmljXSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYWdzW2FzY2lpXSA9IHRydWU7XG4gICAgfVxuICAgIHRzKFN0YXJ0LCBzY2gsIHNjaCwgZmxhZ3MpO1xuICB9XG5cbiAgLy8gTG9jYWxob3N0IHRva2VuXG4gIHRzKFN0YXJ0LCAnbG9jYWxob3N0JywgTE9DQUxIT1NULCB7XG4gICAgYXNjaWk6IHRydWVcbiAgfSk7XG5cbiAgLy8gU2V0IGRlZmF1bHQgdHJhbnNpdGlvbiBmb3Igc3RhcnQgc3RhdGUgKHNvbWUgc3ltYm9sKVxuICBTdGFydC5qZCA9IG5ldyBTdGF0ZShTWU0pO1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBTdGFydCxcbiAgICB0b2tlbnM6IGFzc2lnbih7XG4gICAgICBncm91cHNcbiAgICB9LCB0aylcbiAgfTtcbn1cblxuLyoqXG5cdEdpdmVuIGEgc3RyaW5nLCByZXR1cm5zIGFuIGFycmF5IG9mIFRPS0VOIGluc3RhbmNlcyByZXByZXNlbnRpbmcgdGhlXG5cdGNvbXBvc2l0aW9uIG9mIHRoYXQgc3RyaW5nLlxuXG5cdEBtZXRob2QgcnVuXG5cdEBwYXJhbSB7U3RhdGU8c3RyaW5nPn0gc3RhcnQgc2Nhbm5lciBzdGFydGluZyBzdGF0ZVxuXHRAcGFyYW0ge3N0cmluZ30gc3RyIGlucHV0IHN0cmluZyB0byBzY2FuXG5cdEByZXR1cm4ge1Rva2VuW119IGxpc3Qgb2YgdG9rZW5zLCBlYWNoIHdpdGggYSB0eXBlIGFuZCB2YWx1ZVxuKi9cbmZ1bmN0aW9uIHJ1biQxKHN0YXJ0LCBzdHIpIHtcbiAgLy8gU3RhdGUgbWFjaGluZSBpcyBub3QgY2FzZSBzZW5zaXRpdmUsIHNvIGlucHV0IGlzIHRva2VuaXplZCBpbiBsb3dlcmNhc2VkXG4gIC8vIGZvcm0gKHN0aWxsIHJldHVybnMgcmVndWxhciBjYXNlKS4gVXNlcyBzZWxlY3RpdmUgYHRvTG93ZXJDYXNlYCBiZWNhdXNlXG4gIC8vIGxvd2VyY2FzaW5nIHRoZSBlbnRpcmUgc3RyaW5nIGNhdXNlcyB0aGUgbGVuZ3RoIGFuZCBjaGFyYWN0ZXIgcG9zaXRpb24gdG9cbiAgLy8gdmFyeSBpbiBzb21lIG5vbi1FbmdsaXNoIHN0cmluZ3Mgd2l0aCBWOC1iYXNlZCBydW50aW1lcy5cbiAgY29uc3QgaXRlcmFibGUgPSBzdHJpbmdUb0FycmF5KHN0ci5yZXBsYWNlKC9bQS1aXS9nLCBjID0+IGMudG9Mb3dlckNhc2UoKSkpO1xuICBjb25zdCBjaGFyQ291bnQgPSBpdGVyYWJsZS5sZW5ndGg7IC8vIDw9IGxlbiBpZiB0aGVyZSBhcmUgZW1vamlzLCBldGNcbiAgY29uc3QgdG9rZW5zID0gW107IC8vIHJldHVybiB2YWx1ZVxuXG4gIC8vIGN1cnNvciB0aHJvdWdoIHRoZSBzdHJpbmcgaXRzZWxmLCBhY2NvdW50aW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgaGF2ZVxuICAvLyB3aWR0aCB3aXRoIGxlbmd0aCAyIHN1Y2ggYXMgZW1vamlzXG4gIGxldCBjdXJzb3IgPSAwO1xuXG4gIC8vIEN1cnNvciB0aHJvdWdoIHRoZSBhcnJheS1yZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RyaW5nXG4gIGxldCBjaGFyQ3Vyc29yID0gMDtcblxuICAvLyBUb2tlbml6ZSB0aGUgc3RyaW5nXG4gIHdoaWxlIChjaGFyQ3Vyc29yIDwgY2hhckNvdW50KSB7XG4gICAgbGV0IHN0YXRlID0gc3RhcnQ7XG4gICAgbGV0IG5leHRTdGF0ZSA9IG51bGw7XG4gICAgbGV0IHRva2VuTGVuZ3RoID0gMDtcbiAgICBsZXQgbGF0ZXN0QWNjZXB0aW5nID0gbnVsbDtcbiAgICBsZXQgc2luY2VBY2NlcHRzID0gLTE7XG4gICAgbGV0IGNoYXJzU2luY2VBY2NlcHRzID0gLTE7XG4gICAgd2hpbGUgKGNoYXJDdXJzb3IgPCBjaGFyQ291bnQgJiYgKG5leHRTdGF0ZSA9IHN0YXRlLmdvKGl0ZXJhYmxlW2NoYXJDdXJzb3JdKSkpIHtcbiAgICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXRlc3QgYWNjZXB0aW5nIHN0YXRlXG4gICAgICBpZiAoc3RhdGUuYWNjZXB0cygpKSB7XG4gICAgICAgIHNpbmNlQWNjZXB0cyA9IDA7XG4gICAgICAgIGNoYXJzU2luY2VBY2NlcHRzID0gMDtcbiAgICAgICAgbGF0ZXN0QWNjZXB0aW5nID0gc3RhdGU7XG4gICAgICB9IGVsc2UgaWYgKHNpbmNlQWNjZXB0cyA+PSAwKSB7XG4gICAgICAgIHNpbmNlQWNjZXB0cyArPSBpdGVyYWJsZVtjaGFyQ3Vyc29yXS5sZW5ndGg7XG4gICAgICAgIGNoYXJzU2luY2VBY2NlcHRzKys7XG4gICAgICB9XG4gICAgICB0b2tlbkxlbmd0aCArPSBpdGVyYWJsZVtjaGFyQ3Vyc29yXS5sZW5ndGg7XG4gICAgICBjdXJzb3IgKz0gaXRlcmFibGVbY2hhckN1cnNvcl0ubGVuZ3RoO1xuICAgICAgY2hhckN1cnNvcisrO1xuICAgIH1cblxuICAgIC8vIFJvbGwgYmFjayB0byB0aGUgbGF0ZXN0IGFjY2VwdGluZyBzdGF0ZVxuICAgIGN1cnNvciAtPSBzaW5jZUFjY2VwdHM7XG4gICAgY2hhckN1cnNvciAtPSBjaGFyc1NpbmNlQWNjZXB0cztcbiAgICB0b2tlbkxlbmd0aCAtPSBzaW5jZUFjY2VwdHM7XG5cbiAgICAvLyBObyBtb3JlIGp1bXBzLCBqdXN0IG1ha2UgYSBuZXcgdG9rZW4gZnJvbSB0aGUgbGFzdCBhY2NlcHRpbmcgb25lXG4gICAgdG9rZW5zLnB1c2goe1xuICAgICAgdDogbGF0ZXN0QWNjZXB0aW5nLnQsXG4gICAgICAvLyB0b2tlbiB0eXBlL25hbWVcbiAgICAgIHY6IHN0ci5zbGljZShjdXJzb3IgLSB0b2tlbkxlbmd0aCwgY3Vyc29yKSxcbiAgICAgIC8vIHN0cmluZyB2YWx1ZVxuICAgICAgczogY3Vyc29yIC0gdG9rZW5MZW5ndGgsXG4gICAgICAvLyBzdGFydCBpbmRleFxuICAgICAgZTogY3Vyc29yIC8vIGVuZCBpbmRleCAoZXhjbHVkaW5nKVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgU3RyaW5nIHRvIGFuIEFycmF5IG9mIGNoYXJhY3RlcnMsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdCBzb21lXG4gKiBjaGFyYWN0ZXJzIGxpa2UgZW1vamlzIHRha2UgdXAgdHdvIHN0cmluZyBpbmRleGVzLlxuICpcbiAqIEFkYXB0ZWQgZnJvbSBjb3JlLWpzIChNSVQgbGljZW5zZSlcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvMmQ2OWNmNWY5OWFiM2VhMzQ2M2MzOTVkZjgxZTVhMTViNjhmNDlkOS9wYWNrYWdlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXG4gKlxuICogQGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHIpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IGxlbikge1xuICAgIGxldCBmaXJzdCA9IHN0ci5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICBsZXQgc2Vjb25kO1xuICAgIGxldCBjaGFyID0gZmlyc3QgPCAweGQ4MDAgfHwgZmlyc3QgPiAweGRiZmYgfHwgaW5kZXggKyAxID09PSBsZW4gfHwgKHNlY29uZCA9IHN0ci5jaGFyQ29kZUF0KGluZGV4ICsgMSkpIDwgMHhkYzAwIHx8IHNlY29uZCA+IDB4ZGZmZiA/IHN0cltpbmRleF0gLy8gc2luZ2xlIGNoYXJhY3RlclxuICAgIDogc3RyLnNsaWNlKGluZGV4LCBpbmRleCArIDIpOyAvLyB0d28taW5kZXggY2hhcmFjdGVyc1xuICAgIHJlc3VsdC5wdXNoKGNoYXIpO1xuICAgIGluZGV4ICs9IGNoYXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRmFzdCB2ZXJzaW9uIG9mIHRzIGZ1bmN0aW9uIGZvciB3aGVuIHRyYW5zaXRpb24gZGVmYXVsdHMgYXJlIHdlbGwga25vd25cbiAqIEBwYXJhbSB7U3RhdGU8c3RyaW5nPn0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHtzdHJpbmd9IHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0dFxuICogQHBhcmFtIHtbUmVnRXhwLCBTdGF0ZTxzdHJpbmc+XVtdfSBqclxuICogQHJldHVybnMge1N0YXRlPHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIGZhc3R0cyhzdGF0ZSwgaW5wdXQsIHQsIGRlZmF1bHR0LCBqcikge1xuICBsZXQgbmV4dDtcbiAgY29uc3QgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBpbnB1dFtpXTtcbiAgICBpZiAoc3RhdGUualtjaGFyXSkge1xuICAgICAgbmV4dCA9IHN0YXRlLmpbY2hhcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQgPSBuZXcgU3RhdGUoZGVmYXVsdHQpO1xuICAgICAgbmV4dC5qciA9IGpyLnNsaWNlKCk7XG4gICAgICBzdGF0ZS5qW2NoYXJdID0gbmV4dDtcbiAgICB9XG4gICAgc3RhdGUgPSBuZXh0O1xuICB9XG4gIG5leHQgPSBuZXcgU3RhdGUodCk7XG4gIG5leHQuanIgPSBqci5zbGljZSgpO1xuICBzdGF0ZS5qW2lucHV0W2xlbiAtIDFdXSA9IG5leHQ7XG4gIHJldHVybiBuZXh0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFRvcC1MZXZlbCBEb21haW4gbmFtZXMgZW5jb2RlZCBpbiB1cGRhdGUtdGxkcy5qcyBiYWNrXG4gKiBpbnRvIGEgbGlzdCBvZiBzdHJpbmdzLlxuICogQHBhcmFtIHtzdHJ9IGVuY29kZWQgZW5jb2RlZCBUTERzIHN0cmluZ1xuICogQHJldHVybnMge3N0cltdfSBvcmlnaW5hbCBUTERzIGxpc3RcbiAqL1xuZnVuY3Rpb24gZGVjb2RlVGxkcyhlbmNvZGVkKSB7XG4gIGNvbnN0IHdvcmRzID0gW107XG4gIGNvbnN0IHN0YWNrID0gW107XG4gIGxldCBpID0gMDtcbiAgbGV0IGRpZ2l0cyA9ICcwMTIzNDU2Nzg5JztcbiAgd2hpbGUgKGkgPCBlbmNvZGVkLmxlbmd0aCkge1xuICAgIGxldCBwb3BEaWdpdENvdW50ID0gMDtcbiAgICB3aGlsZSAoZGlnaXRzLmluZGV4T2YoZW5jb2RlZFtpICsgcG9wRGlnaXRDb3VudF0pID49IDApIHtcbiAgICAgIHBvcERpZ2l0Q291bnQrKzsgLy8gZW5jb3VudGVyZWQgc29tZSBkaWdpdHMsIGhhdmUgdG8gcG9wIHRvIGdvIG9uZSBsZXZlbCB1cCB0cmllXG4gICAgfVxuXG4gICAgaWYgKHBvcERpZ2l0Q291bnQgPiAwKSB7XG4gICAgICB3b3Jkcy5wdXNoKHN0YWNrLmpvaW4oJycpKTsgLy8gd2hhdGV2ZXIgcHJlY2VkZWQgdGhlIHBvcCBkaWdpdHMgbXVzdCBiZSBhIHdvcmRcbiAgICAgIGZvciAobGV0IHBvcENvdW50ID0gcGFyc2VJbnQoZW5jb2RlZC5zdWJzdHJpbmcoaSwgaSArIHBvcERpZ2l0Q291bnQpLCAxMCk7IHBvcENvdW50ID4gMDsgcG9wQ291bnQtLSkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgIH1cbiAgICAgIGkgKz0gcG9wRGlnaXRDb3VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhY2sucHVzaChlbmNvZGVkW2ldKTsgLy8gZHJvcCBkb3duIGEgbGV2ZWwgaW50byB0aGUgdHJpZVxuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd29yZHM7XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHdoZXJlIGVhY2gga2V5IGlzIGEgdmFsaWQgRE9NIEV2ZW50IE5hbWUgc3VjaCBhcyBgY2xpY2tgIG9yIGBmb2N1c2BcbiAqIGFuZCBlYWNoIHZhbHVlIGlzIGFuIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQjZXZlbnRzXG4gKiBAdHlwZWRlZiB7P3sgW2V2ZW50OiBzdHJpbmddOiBGdW5jdGlvbiB9fSBFdmVudExpc3RlbmVyc1xuICovXG5cbi8qKlxuICogQWxsIGZvcm1hdHRlZCBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIHJlbmRlciBhIGxpbmssIGluY2x1ZGluZyBgdGFnTmFtZWAsXG4gKiBgYXR0cmlidXRlc2AsIGBjb250ZW50YCBhbmQgYGV2ZW50TGlzdGVuZXJzYC5cbiAqIEB0eXBlZGVmIHt7IHRhZ05hbWU6IGFueSwgYXR0cmlidXRlczoge1thdHRyOiBzdHJpbmddOiBhbnl9LCBjb250ZW50OiBzdHJpbmcsXG4gKiBldmVudExpc3RlbmVyczogRXZlbnRMaXN0ZW5lcnMgfX0gSW50ZXJtZWRpYXRlUmVwcmVzZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIFNwZWNpZnkgZWl0aGVyIGFuIG9iamVjdCBkZXNjcmliZWQgYnkgdGhlIHRlbXBsYXRlIHR5cGUgYE9gIG9yIGEgZnVuY3Rpb24uXG4gKlxuICogVGhlIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHZhbHVlICh1c3VhbGx5IHRoZSBsaW5rJ3MgaHJlZiBhdHRyaWJ1dGUpLCB0aGVcbiAqIGxpbmsgdHlwZSAoYCd1cmwnYCwgYCdoYXNodGFnYCcsIGV0Yy4pIGFuZCBhbiBpbnRlcm5hbCB0b2tlbiByZXByZXNlbnRhdGlvblxuICogb2YgdGhlIGxpbmsuIEl0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSB0ZW1wbGF0ZSB0eXBlIGBPYFxuICogQHRlbXBsYXRlIE9cbiAqIEB0eXBlZGVmIHtPIHwgKCh2YWx1ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIHRva2VuOiBNdWx0aVRva2VuKSA9PiBPKX0gT3B0T2JqXG4gKi9cblxuLyoqXG4gKiBTcGVjaWZ5IGVpdGhlciBhIGZ1bmN0aW9uIGRlc2NyaWJlZCBieSB0ZW1wbGF0ZSB0eXBlIGBGYCBvciBhbiBvYmplY3QuXG4gKlxuICogRWFjaCBrZXkgaW4gdGhlIG9iamVjdCBzaG91bGQgYmUgYSBsaW5rIHR5cGUgKGAndXJsJ2AsIGAnaGFzaHRhZ2AnLCBldGMuKS4gRWFjaFxuICogdmFsdWUgc2hvdWxkIGJlIGEgZnVuY3Rpb24gd2l0aCB0ZW1wbGF0ZSB0eXBlIGBGYCB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZVxuICogY29ycmVzcG9uZGluZyBsaW5rIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4gKiBAdGVtcGxhdGUgRlxuICogQHR5cGVkZWYge0YgfCB7IFt0eXBlOiBzdHJpbmddOiBGfX0gT3B0Rm5cbiAqL1xuXG4vKipcbiAqIFNwZWNpZnkgZWl0aGVyIGEgdmFsdWUgd2l0aCB0ZW1wbGF0ZSB0eXBlIGBWYCwgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYFZgIG9yXG4gKiBhbiBvYmplY3Qgd2hlcmUgZWFjaCB2YWx1ZSByZXNvbHZlcyB0byBgVmAuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIHZhbHVlICh1c3VhbGx5IHRoZSBsaW5rJ3MgaHJlZiBhdHRyaWJ1dGUpLCB0aGVcbiAqIGxpbmsgdHlwZSAoYCd1cmwnYCwgYCdoYXNodGFnYCcsIGV0Yy4pIGFuZCBhbiBpbnRlcm5hbCB0b2tlbiByZXByZXNlbnRhdGlvblxuICogb2YgdGhlIGxpbmsuIEl0IHNob3VsZCByZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSB0ZW1wbGF0ZSB0eXBlIGBWYFxuICpcbiAqIEZvciB0aGUgb2JqZWN0LCBlYWNoIGtleSBzaG91bGQgYmUgYSBsaW5rIHR5cGUgKGAndXJsJ2AsIGAnaGFzaHRhZ2AnLCBldGMuKS5cbiAqIEVhY2ggdmFsdWUgc2hvdWxkIGVpdGhlciBoYXZlIHR5cGUgYFZgIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIFYuIFRoaXNcbiAqIGZ1bmN0aW9uIHNpbWlsYXJseSB0YWtlcyBhIHN0cmluZyB2YWx1ZSBhbmQgYSB0b2tlbi5cbiAqXG4gKiBFeGFtcGxlIHZhbGlkIHR5cGVzIGZvciBgT3B0PHN0cmluZz5gOlxuICpcbiAqIGBgYGpzXG4gKiAnaGVsbG8nXG4gKiAodmFsdWUsIHR5cGUsIHRva2VuKSA9PiAnd29ybGQnXG4gKiB7IHVybDogJ2hlbGxvJywgZW1haWw6ICh2YWx1ZSwgdG9rZW4pID0+ICd3b3JsZCd9XG4gKiBgYGBcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7ViB8ICgodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCB0b2tlbjogTXVsdGlUb2tlbikgPT4gVikgfCB7IFt0eXBlOiBzdHJpbmddOiBWIHwgKCh2YWx1ZTogc3RyaW5nLCB0b2tlbjogTXVsdGlUb2tlbikgPT4gVikgfX0gT3B0XG4gKi9cblxuLyoqXG4gKiBTZWUgYXZhaWxhYmxlIG9wdGlvbnM6IGh0dHBzOi8vbGlua2lmeS5qcy5vcmcvZG9jcy9vcHRpb25zLmh0bWxcbiAqIEB0eXBlZGVmIHt7XG4gKiBcdGRlZmF1bHRQcm90b2NvbD86IHN0cmluZyxcbiAqICBldmVudHM/OiBPcHRPYmo8RXZlbnRMaXN0ZW5lcnM+LFxuICogXHRmb3JtYXQ/OiBPcHQ8c3RyaW5nPixcbiAqIFx0Zm9ybWF0SHJlZj86IE9wdDxzdHJpbmc+LFxuICogXHRubDJicj86IGJvb2xlYW4sXG4gKiBcdHRhZ05hbWU/OiBPcHQ8YW55PixcbiAqIFx0dGFyZ2V0PzogT3B0PHN0cmluZz4sXG4gKiBcdHJlbD86IE9wdDxzdHJpbmc+LFxuICogXHR2YWxpZGF0ZT86IE9wdDxib29sZWFuPixcbiAqIFx0dHJ1bmNhdGU/OiBPcHQ8bnVtYmVyPixcbiAqIFx0Y2xhc3NOYW1lPzogT3B0PHN0cmluZz4sXG4gKiBcdGF0dHJpYnV0ZXM/OiBPcHRPYmo8KHsgW2F0dHI6IHN0cmluZ106IGFueSB9KT4sXG4gKiAgaWdub3JlVGFncz86IHN0cmluZ1tdLFxuICogXHRyZW5kZXI/OiBPcHRGbjwoKGlyOiBJbnRlcm1lZGlhdGVSZXByZXNlbnRhdGlvbikgPT4gYW55KT5cbiAqIH19IE9wdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlIFJlcXVpcmVkPE9wdHM+XG4gKi9cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBkZWZhdWx0UHJvdG9jb2w6ICdodHRwJyxcbiAgZXZlbnRzOiBudWxsLFxuICBmb3JtYXQ6IG5vb3AsXG4gIGZvcm1hdEhyZWY6IG5vb3AsXG4gIG5sMmJyOiBmYWxzZSxcbiAgdGFnTmFtZTogJ2EnLFxuICB0YXJnZXQ6IG51bGwsXG4gIHJlbDogbnVsbCxcbiAgdmFsaWRhdGU6IHRydWUsXG4gIHRydW5jYXRlOiBJbmZpbml0eSxcbiAgY2xhc3NOYW1lOiBudWxsLFxuICBhdHRyaWJ1dGVzOiBudWxsLFxuICBpZ25vcmVUYWdzOiBbXSxcbiAgcmVuZGVyOiBudWxsXG59O1xuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIGxpbmtpZnkgaW50ZXJmYWNlcyB0byBhcHBseSBzcGVjaWZpZWRcbiAqIHtAbGluayBPcHRzIGZvcm1hdHRpbmcgYW5kIHJlbmRlcmluZyBvcHRpb25zfS5cbiAqXG4gKiBAcGFyYW0ge09wdHMgfCBPcHRpb25zfSBbb3B0c10gT3B0aW9uIHZhbHVlIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSB7KGlyOiBJbnRlcm1lZGlhdGVSZXByZXNlbnRhdGlvbikgPT4gYW55fSBbZGVmYXVsdFJlbmRlcl0gKEZvclxuICogICBpbnRlcm5hbCB1c2UpIGRlZmF1bHQgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gZ2VuZXJhdGUgYW5cbiAqICAgSFRNTCBlbGVtZW50IGJhc2VkIG9uIGEgbGluayB0b2tlbidzIGRlcml2ZWQgdGFnTmFtZSwgYXR0cmlidXRlcyBhbmQgSFRNTC5cbiAqICAgU2ltaWxhciB0byByZW5kZXIgb3B0aW9uXG4gKi9cbmZ1bmN0aW9uIE9wdGlvbnMob3B0cywgZGVmYXVsdFJlbmRlcikge1xuICBpZiAoZGVmYXVsdFJlbmRlciA9PT0gdm9pZCAwKSB7XG4gICAgZGVmYXVsdFJlbmRlciA9IG51bGw7XG4gIH1cbiAgbGV0IG8gPSBhc3NpZ24oe30sIGRlZmF1bHRzKTtcbiAgaWYgKG9wdHMpIHtcbiAgICBvID0gYXNzaWduKG8sIG9wdHMgaW5zdGFuY2VvZiBPcHRpb25zID8gb3B0cy5vIDogb3B0cyk7XG4gIH1cblxuICAvLyBFbnN1cmUgYWxsIGlnbm9yZWQgdGFncyBhcmUgdXBwZXJjYXNlXG4gIGNvbnN0IGlnbm9yZWRUYWdzID0gby5pZ25vcmVUYWdzO1xuICBjb25zdCB1cHBlcmNhc2VJZ25vcmVkVGFncyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlnbm9yZWRUYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdXBwZXJjYXNlSWdub3JlZFRhZ3MucHVzaChpZ25vcmVkVGFnc1tpXS50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuICAvKiogQHByb3RlY3RlZCAqL1xuICB0aGlzLm8gPSBvO1xuICBpZiAoZGVmYXVsdFJlbmRlcikge1xuICAgIHRoaXMuZGVmYXVsdFJlbmRlciA9IGRlZmF1bHRSZW5kZXI7XG4gIH1cbiAgdGhpcy5pZ25vcmVUYWdzID0gdXBwZXJjYXNlSWdub3JlZFRhZ3M7XG59XG5PcHRpb25zLnByb3RvdHlwZSA9IHtcbiAgbzogZGVmYXVsdHMsXG4gIC8qKlxuICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgKi9cbiAgaWdub3JlVGFnczogW10sXG4gIC8qKlxuICAgKiBAcGFyYW0ge0ludGVybWVkaWF0ZVJlcHJlc2VudGF0aW9ufSBpclxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZGVmYXVsdFJlbmRlcihpcikge1xuICAgIHJldHVybiBpcjtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiB3aGV0aGVyIGEgdG9rZW4gc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBhXG4gICAqIGxpbmsgYmFzZWQgb24gdGhlIHVzZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtNdWx0aVRva2VufSB0b2tlblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGNoZWNrKHRva2VuKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCd2YWxpZGF0ZScsIHRva2VuLnRvU3RyaW5nKCksIHRva2VuKTtcbiAgfSxcbiAgLy8gUHJpdmF0ZSBtZXRob2RzXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gb3B0aW9uJ3MgdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gYW5kIHRoZSBnaXZlblxuICAgKiBwYXJhbXMuIElmIG9wZXJhdG9yIGFuZCB0b2tlbiBhcmUgc3BlY2lmaWVkIGFuZCB0aGUgdGFyZ2V0IG9wdGlvbiBpc1xuICAgKiBjYWxsYWJsZSwgYXV0b21hdGljYWxseSBjYWxscyB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnQuXG4gICAqIEB0ZW1wbGF0ZSB7a2V5b2YgT3B0c30gS1xuICAgKiBAcGFyYW0ge0t9IGtleSBOYW1lIG9mIG9wdGlvbiB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcGVyYXRvcl0gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBvcHRpb24gaWYgaXQncyBhXG4gICAqIGZ1bmN0aW9uLiBJZiBub3Qgc3BlY2lmaWVkLCBSQVcgZnVuY3Rpb24gdmFsdWUgZ2V0cyByZXR1cm5lZFxuICAgKiBAcGFyYW0ge011bHRpVG9rZW59IFt0b2tlbl0gVGhlIHRva2VuIGZyb20gbGlua2lmeS50b2tlbml6ZVxuICAgKiBAcmV0dXJucyB7T3B0c1tLXSB8IGFueX1cbiAgICovXG4gIGdldChrZXksIG9wZXJhdG9yLCB0b2tlbikge1xuICAgIGNvbnN0IGlzQ2FsbGFibGUgPSBvcGVyYXRvciAhPSBudWxsO1xuICAgIGxldCBvcHRpb24gPSB0aGlzLm9ba2V5XTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRpb24gPSB0b2tlbi50IGluIG9wdGlvbiA/IG9wdGlvblt0b2tlbi50XSA6IGRlZmF1bHRzW2tleV07XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0NhbGxhYmxlKSB7XG4gICAgICAgIG9wdGlvbiA9IG9wdGlvbihvcGVyYXRvciwgdG9rZW4pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0NhbGxhYmxlKSB7XG4gICAgICBvcHRpb24gPSBvcHRpb24ob3BlcmF0b3IsIHRva2VuLnQsIHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfSxcbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7a2V5b2YgT3B0c30gTFxuICAgKiBAcGFyYW0ge0x9IGtleSBOYW1lIG9mIG9wdGlvbnMgb2JqZWN0IHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wZXJhdG9yXVxuICAgKiBAcGFyYW0ge011bHRpVG9rZW59IFt0b2tlbl1cbiAgICogQHJldHVybnMge09wdHNbTF0gfCBhbnl9XG4gICAqL1xuICBnZXRPYmooa2V5LCBvcGVyYXRvciwgdG9rZW4pIHtcbiAgICBsZXQgb2JqID0gdGhpcy5vW2tleV07XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicgJiYgb3BlcmF0b3IgIT0gbnVsbCkge1xuICAgICAgb2JqID0gb2JqKG9wZXJhdG9yLCB0b2tlbi50LCB0b2tlbik7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0sXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBnaXZlbiB0b2tlbiB0byBhIHJlbmRlcmVkIGVsZW1lbnQgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlXG4gICAqIGNhbGxpbmctaW50ZXJmYWNlJ3MgRE9NXG4gICAqIEBwYXJhbSB7TXVsdGlUb2tlbn0gdG9rZW4gVG9rZW4gdG8gcmVuZGVyIHRvIGFuIEhUTUwgZWxlbWVudFxuICAgKiBAcmV0dXJucyB7YW55fSBSZW5kZXIgcmVzdWx0OyBlLmcuLCBIVE1MIHN0cmluZywgRE9NIGVsZW1lbnQsIFJlYWN0XG4gICAqICAgQ29tcG9uZW50LCBldGMuXG4gICAqL1xuICByZW5kZXIodG9rZW4pIHtcbiAgICBjb25zdCBpciA9IHRva2VuLnJlbmRlcih0aGlzKTsgLy8gaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgY29uc3QgcmVuZGVyRm4gPSB0aGlzLmdldCgncmVuZGVyJywgbnVsbCwgdG9rZW4pIHx8IHRoaXMuZGVmYXVsdFJlbmRlcjtcbiAgICByZXR1cm4gcmVuZGVyRm4oaXIsIHRva2VuLnQsIHRva2VuKTtcbiAgfVxufTtcbmZ1bmN0aW9uIG5vb3AodmFsKSB7XG4gIHJldHVybiB2YWw7XG59XG5cbnZhciBvcHRpb25zID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGRlZmF1bHRzOiBkZWZhdWx0cyxcblx0T3B0aW9uczogT3B0aW9ucyxcblx0YXNzaWduOiBhc3NpZ25cbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cdE11bHRpLVRva2Vuc1xuXHRUb2tlbnMgY29tcG9zZWQgb2YgYXJyYXlzIG9mIFRleHRUb2tlbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7VG9rZW5bXX0gdG9rZW5zXG4gKi9cbmZ1bmN0aW9uIE11bHRpVG9rZW4odmFsdWUsIHRva2Vucykge1xuICB0aGlzLnQgPSAndG9rZW4nO1xuICB0aGlzLnYgPSB2YWx1ZTtcbiAgdGhpcy50ayA9IHRva2Vucztcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyB1c2VkIGZvciBtYW51ZmFjdHVyaW5nIHRva2VucyBvZiB0ZXh0IHRva2Vucy4gVGhhdCBpcyByYXRoZXJcbiAqIHRoYW4gdGhlIHZhbHVlIGZvciBhIHRva2VuIGJlaW5nIGEgc21hbGwgc3RyaW5nIG9mIHRleHQsIGl0J3MgdmFsdWUgYW4gYXJyYXlcbiAqIG9mIHRleHQgdG9rZW5zLlxuICpcbiAqIFVzZWQgZm9yIGdyb3VwaW5nIHRvZ2V0aGVyIFVSTHMsIGVtYWlscywgaGFzaHRhZ3MsIGFuZCBvdGhlciBwb3RlbnRpYWxcbiAqIGNyZWF0aW9ucy5cbiAqIEBjbGFzcyBNdWx0aVRva2VuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZcbiAqIEBwcm9wZXJ0eSB7VG9rZW5bXX0gdGtcbiAqIEBhYnN0cmFjdFxuICovXG5NdWx0aVRva2VuLnByb3RvdHlwZSA9IHtcbiAgaXNMaW5rOiBmYWxzZSxcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc3RyaW5nIHRoaXMgdG9rZW4gcmVwcmVzZW50cy5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudjtcbiAgfSxcbiAgLyoqXG4gICAqIFdoYXQgc2hvdWxkIHRoZSB2YWx1ZSBmb3IgdGhpcyB0b2tlbiBiZSBpbiB0aGUgYGhyZWZgIEhUTUwgYXR0cmlidXRlP1xuICAgKiBSZXR1cm5zIHRoZSBgLnRvU3RyaW5nYCB2YWx1ZSBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjaGVtZV1cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAqL1xuICB0b0hyZWYoc2NoZW1lKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBGb3JtYXR0aW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRvRm9ybWF0dGVkU3RyaW5nKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgdHJ1bmNhdGUgPSBvcHRpb25zLmdldCgndHJ1bmNhdGUnLCB2YWwsIHRoaXMpO1xuICAgIGNvbnN0IGZvcm1hdHRlZCA9IG9wdGlvbnMuZ2V0KCdmb3JtYXQnLCB2YWwsIHRoaXMpO1xuICAgIHJldHVybiB0cnVuY2F0ZSAmJiBmb3JtYXR0ZWQubGVuZ3RoID4gdHJ1bmNhdGUgPyBmb3JtYXR0ZWQuc3Vic3RyaW5nKDAsIHRydW5jYXRlKSArICdcdTIwMjYnIDogZm9ybWF0dGVkO1xuICB9LFxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdHRlZEhyZWYob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLmdldCgnZm9ybWF0SHJlZicsIHRoaXMudG9IcmVmKG9wdGlvbnMuZ2V0KCdkZWZhdWx0UHJvdG9jb2wnKSksIHRoaXMpO1xuICB9LFxuICAvKipcbiAgICogVGhlIHN0YXJ0IGluZGV4IG9mIHRoaXMgdG9rZW4gaW4gdGhlIG9yaWdpbmFsIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgc3RhcnRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy50a1swXS5zO1xuICB9LFxuICAvKipcbiAgICogVGhlIGVuZCBpbmRleCBvZiB0aGlzIHRva2VuIGluIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJpbmcgKHVwIHRvIHRoaXNcbiAgICogaW5kZXggYnV0IG5vdCBpbmNsdWRpbmcgaXQpXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBlbmRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy50a1t0aGlzLnRrLmxlbmd0aCAtIDFdLmU7XG4gIH0sXG4gIC8qKlxuICBcdFJldHVybnMgYW4gb2JqZWN0ICBvZiByZWxldmFudCB2YWx1ZXMgZm9yIHRoaXMgdG9rZW4sIHdoaWNoIGluY2x1ZGVzIGtleXNcbiAgXHQqIHR5cGUgLSBLaW5kIG9mIHRva2VuICgndXJsJywgJ2VtYWlsJywgZXRjLilcbiAgXHQqIHZhbHVlIC0gT3JpZ2luYWwgdGV4dFxuICBcdCogaHJlZiAtIFRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgYW5jaG9yIHRhZydzIGhyZWZcbiAgXHRcdGF0dHJpYnV0ZVxuICBcdFx0QG1ldGhvZCB0b09iamVjdFxuICBcdEBwYXJhbSB7c3RyaW5nfSBbcHJvdG9jb2xdIGAnaHR0cCdgIGJ5IGRlZmF1bHRcbiAgKi9cbiAgdG9PYmplY3QocHJvdG9jb2wpIHtcbiAgICBpZiAocHJvdG9jb2wgPT09IHZvaWQgMCkge1xuICAgICAgcHJvdG9jb2wgPSBkZWZhdWx0cy5kZWZhdWx0UHJvdG9jb2w7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnQsXG4gICAgICB2YWx1ZTogdGhpcy50b1N0cmluZygpLFxuICAgICAgaXNMaW5rOiB0aGlzLmlzTGluayxcbiAgICAgIGhyZWY6IHRoaXMudG9IcmVmKHByb3RvY29sKSxcbiAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0SW5kZXgoKSxcbiAgICAgIGVuZDogdGhpcy5lbmRJbmRleCgpXG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBGb3JtYXR0aW5nIG9wdGlvblxuICAgKi9cbiAgdG9Gb3JtYXR0ZWRPYmplY3Qob3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnQsXG4gICAgICB2YWx1ZTogdGhpcy50b0Zvcm1hdHRlZFN0cmluZyhvcHRpb25zKSxcbiAgICAgIGlzTGluazogdGhpcy5pc0xpbmssXG4gICAgICBocmVmOiB0aGlzLnRvRm9ybWF0dGVkSHJlZihvcHRpb25zKSxcbiAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0SW5kZXgoKSxcbiAgICAgIGVuZDogdGhpcy5lbmRJbmRleCgpXG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0b2tlbiBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBsaW5rIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWxpZGF0ZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZ2V0KCd2YWxpZGF0ZScsIHRoaXMudG9TdHJpbmcoKSwgdGhpcyk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBob3cgdGhpcyBsaW5rIHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIEZvcm1hdHRpbm5nIG9wdGlvbnNcbiAgICovXG4gIHJlbmRlcihvcHRpb25zKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzO1xuICAgIGNvbnN0IGhyZWYgPSB0aGlzLnRvSHJlZihvcHRpb25zLmdldCgnZGVmYXVsdFByb3RvY29sJykpO1xuICAgIGNvbnN0IGZvcm1hdHRlZEhyZWYgPSBvcHRpb25zLmdldCgnZm9ybWF0SHJlZicsIGhyZWYsIHRoaXMpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSBvcHRpb25zLmdldCgndGFnTmFtZScsIGhyZWYsIHRva2VuKTtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy50b0Zvcm1hdHRlZFN0cmluZyhvcHRpb25zKTtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgY29uc3QgY2xhc3NOYW1lID0gb3B0aW9ucy5nZXQoJ2NsYXNzTmFtZScsIGhyZWYsIHRva2VuKTtcbiAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLmdldCgndGFyZ2V0JywgaHJlZiwgdG9rZW4pO1xuICAgIGNvbnN0IHJlbCA9IG9wdGlvbnMuZ2V0KCdyZWwnLCBocmVmLCB0b2tlbik7XG4gICAgY29uc3QgYXR0cnMgPSBvcHRpb25zLmdldE9iaignYXR0cmlidXRlcycsIGhyZWYsIHRva2VuKTtcbiAgICBjb25zdCBldmVudExpc3RlbmVycyA9IG9wdGlvbnMuZ2V0T2JqKCdldmVudHMnLCBocmVmLCB0b2tlbik7XG4gICAgYXR0cmlidXRlcy5ocmVmID0gZm9ybWF0dGVkSHJlZjtcbiAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBhdHRyaWJ1dGVzLnRhcmdldCA9IHRhcmdldDtcbiAgICB9XG4gICAgaWYgKHJlbCkge1xuICAgICAgYXR0cmlidXRlcy5yZWwgPSByZWw7XG4gICAgfVxuICAgIGlmIChhdHRycykge1xuICAgICAgYXNzaWduKGF0dHJpYnV0ZXMsIGF0dHJzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhZ05hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgY29udGVudCxcbiAgICAgIGV2ZW50TGlzdGVuZXJzXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgdG9rZW4gdGhhdCBjYW4gYmUgZW1pdHRlZCBieSB0aGUgcGFyc2VyIHN0YXRlIG1hY2hpbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIHJlYWRhYmxlIHR5cGUgb2YgdGhlIHRva2VuXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgcHJvcGVydGllcyB0byBhc3NpZ24gb3Igb3ZlcnJpZGUsIGluY2x1ZGluZyBpc0xpbmsgPSB0cnVlIG9yIGZhbHNlXG4gKiBAcmV0dXJucyB7bmV3ICh2YWx1ZTogc3RyaW5nLCB0b2tlbnM6IFRva2VuW10pID0+IE11bHRpVG9rZW59IG5ldyB0b2tlbiBjbGFzc1xuICovXG5mdW5jdGlvbiBjcmVhdGVUb2tlbkNsYXNzKHR5cGUsIHByb3BzKSB7XG4gIGNsYXNzIFRva2VuIGV4dGVuZHMgTXVsdGlUb2tlbiB7XG4gICAgY29uc3RydWN0b3IodmFsdWUsIHRva2Vucykge1xuICAgICAgc3VwZXIodmFsdWUsIHRva2Vucyk7XG4gICAgICB0aGlzLnQgPSB0eXBlO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IHAgaW4gcHJvcHMpIHtcbiAgICBUb2tlbi5wcm90b3R5cGVbcF0gPSBwcm9wc1twXTtcbiAgfVxuICBUb2tlbi50ID0gdHlwZTtcbiAgcmV0dXJuIFRva2VuO1xufVxuXG4vKipcblx0UmVwcmVzZW50cyBhIGxpc3Qgb2YgdG9rZW5zIG1ha2luZyB1cCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcbiovXG5jb25zdCBFbWFpbCA9IGNyZWF0ZVRva2VuQ2xhc3MoJ2VtYWlsJywge1xuICBpc0xpbms6IHRydWUsXG4gIHRvSHJlZigpIHtcbiAgICByZXR1cm4gJ21haWx0bzonICsgdGhpcy50b1N0cmluZygpO1xuICB9XG59KTtcblxuLyoqXG5cdFJlcHJlc2VudHMgc29tZSBwbGFpbiB0ZXh0XG4qL1xuY29uc3QgVGV4dCA9IGNyZWF0ZVRva2VuQ2xhc3MoJ3RleHQnKTtcblxuLyoqXG5cdE11bHRpLWxpbmVicmVhayB0b2tlbiAtIHJlcHJlc2VudHMgYSBsaW5lIGJyZWFrXG5cdEBjbGFzcyBObFxuKi9cbmNvbnN0IE5sID0gY3JlYXRlVG9rZW5DbGFzcygnbmwnKTtcblxuLyoqXG5cdFJlcHJlc2VudHMgYSBsaXN0IG9mIHRleHQgdG9rZW5zIG1ha2luZyB1cCBhIHZhbGlkIFVSTFxuXHRAY2xhc3MgVXJsXG4qL1xuY29uc3QgVXJsID0gY3JlYXRlVG9rZW5DbGFzcygndXJsJywge1xuICBpc0xpbms6IHRydWUsXG4gIC8qKlxuICBcdExvd2VyY2FzZXMgcmVsZXZhbnQgcGFydHMgb2YgdGhlIGRvbWFpbiBhbmQgYWRkcyB0aGUgcHJvdG9jb2wgaWZcbiAgXHRyZXF1aXJlZC4gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgZXNjYXBlIHVuc2FmZSBIVE1MIGNoYXJhY3RlcnMgaW4gdGhlXG4gIFx0VVJMLlxuICBcdFx0QHBhcmFtIHtzdHJpbmd9IFtzY2hlbWVdIGRlZmF1bHQgc2NoZW1lIChlLmcuLCAnaHR0cHMnKVxuICBcdEByZXR1cm4ge3N0cmluZ30gdGhlIGZ1bGwgaHJlZlxuICAqL1xuICB0b0hyZWYoc2NoZW1lKSB7XG4gICAgaWYgKHNjaGVtZSA9PT0gdm9pZCAwKSB7XG4gICAgICBzY2hlbWUgPSBkZWZhdWx0cy5kZWZhdWx0UHJvdG9jb2w7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaGFzIGEgcHJlZml4IHNjaGVtZVxuICAgIHJldHVybiB0aGlzLmhhc1Byb3RvY29sKCkgPyB0aGlzLnYgOiBgJHtzY2hlbWV9Oi8vJHt0aGlzLnZ9YDtcbiAgfSxcbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhpcyBVUkwgdG9rZW4gaGFzIGEgcHJvdG9jb2xcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc1Byb3RvY29sKCkge1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMudGs7XG4gICAgcmV0dXJuIHRva2Vucy5sZW5ndGggPj0gMiAmJiB0b2tlbnNbMF0udCAhPT0gTE9DQUxIT1NUICYmIHRva2Vuc1sxXS50ID09PSBDT0xPTjtcbiAgfVxufSk7XG5cbnZhciBtdWx0aSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRNdWx0aVRva2VuOiBNdWx0aVRva2VuLFxuXHRCYXNlOiBNdWx0aVRva2VuLFxuXHRjcmVhdGVUb2tlbkNsYXNzOiBjcmVhdGVUb2tlbkNsYXNzLFxuXHRFbWFpbDogRW1haWwsXG5cdFRleHQ6IFRleHQsXG5cdE5sOiBObCxcblx0VXJsOiBVcmxcbn0pO1xuXG4vKipcblx0Tm90IGV4YWN0bHkgcGFyc2VyLCBtb3JlIGxpa2UgdGhlIHNlY29uZC1zdGFnZSBzY2FubmVyIChhbHRob3VnaCB3ZSBjYW5cblx0dGhlb3JldGljYWxseSBob3Rzd2FwIHRoZSBjb2RlIGhlcmUgd2l0aCBhIHJlYWwgcGFyc2VyIGluIHRoZSBmdXR1cmUuLi4gYnV0XG5cdGZvciBhIGxpdHRsZSBVUkwtZmluZGluZyB1dGlsaXR5IGFic3RyYWN0IHN5bnRheCB0cmVlcyBtYXkgYmUgYSBsaXR0bGVcblx0b3ZlcmtpbGwpLlxuXG5cdFVSTCBmb3JtYXQ6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVJJX3NjaGVtZVxuXHRFbWFpbCBmb3JtYXQ6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1haWxBZGRyZXNzIChsaW5rcyB0byBSRkMgaW5cblx0cmVmZXJlbmNlKVxuXG5cdEBtb2R1bGUgbGlua2lmeVxuXHRAc3VibW9kdWxlIHBhcnNlclxuXHRAbWFpbiBydW5cbiovXG5jb25zdCBtYWtlU3RhdGUgPSBhcmcgPT4gbmV3IFN0YXRlKGFyZyk7XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHBhcnNlciBtdWx0aSB0b2tlbi1iYXNlZCBzdGF0ZSBtYWNoaW5lXG4gKiBAcGFyYW0ge3sgZ3JvdXBzOiBDb2xsZWN0aW9uczxzdHJpbmc+IH19IHRva2Vuc1xuICovXG5mdW5jdGlvbiBpbml0JDEoX3JlZikge1xuICBsZXQge1xuICAgIGdyb3Vwc1xuICB9ID0gX3JlZjtcbiAgLy8gVHlwZXMgb2YgY2hhcmFjdGVycyB0aGUgVVJMIGNhbiBkZWZpbml0ZWx5IGVuZCBpblxuICBjb25zdCBxc0FjY2VwdGluZyA9IGdyb3Vwcy5kb21haW4uY29uY2F0KFtBTVBFUlNBTkQsIEFTVEVSSVNLLCBBVCwgQkFDS1NMQVNILCBCQUNLVElDSywgQ0FSRVQsIERPTExBUiwgRVFVQUxTLCBIWVBIRU4sIE5VTSwgUEVSQ0VOVCwgUElQRSwgUExVUywgUE9VTkQsIFNMQVNILCBTWU0sIFRJTERFLCBVTkRFUlNDT1JFXSk7XG5cbiAgLy8gVHlwZXMgb2YgdG9rZW5zIHRoYXQgY2FuIGZvbGxvdyBhIFVSTCBhbmQgYmUgcGFydCBvZiB0aGUgcXVlcnkgc3RyaW5nXG4gIC8vIGJ1dCBjYW5ub3QgYmUgdGhlIHZlcnkgbGFzdCBjaGFyYWN0ZXJzXG4gIC8vIENoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYXBwZWFyIGluIHRoZSBVUkwgYXQgYWxsIHNob3VsZCBiZSBleGNsdWRlZFxuICBjb25zdCBxc05vbkFjY2VwdGluZyA9IFtBUE9TVFJPUEhFLCBDT0xPTiwgQ09NTUEsIERPVCwgRVhDTEFNQVRJT04sIFFVRVJZLCBRVU9URSwgU0VNSSwgT1BFTkFOR0xFQlJBQ0tFVCwgQ0xPU0VBTkdMRUJSQUNLRVQsIE9QRU5CUkFDRSwgQ0xPU0VCUkFDRSwgQ0xPU0VCUkFDS0VULCBPUEVOQlJBQ0tFVCwgT1BFTlBBUkVOLCBDTE9TRVBBUkVOLCBGVUxMV0lEVEhMRUZUUEFSRU4sIEZVTExXSURUSFJJR0hUUEFSRU4sIExFRlRDT1JORVJCUkFDS0VULCBSSUdIVENPUk5FUkJSQUNLRVQsIExFRlRXSElURUNPUk5FUkJSQUNLRVQsIFJJR0hUV0hJVEVDT1JORVJCUkFDS0VULCBGVUxMV0lEVEhMRVNTVEhBTiwgRlVMTFdJRFRIR1JFQVRFUlRIQU5dO1xuXG4gIC8vIEZvciBhZGRyZXNzZXMgd2l0aG91dCB0aGUgbWFpbHRvIHByZWZpeFxuICAvLyBUb2tlbnMgYWxsb3dlZCBpbiB0aGUgbG9jYWxwYXJ0IG9mIHRoZSBlbWFpbFxuICBjb25zdCBsb2NhbHBhcnRBY2NlcHRpbmcgPSBbQU1QRVJTQU5ELCBBUE9TVFJPUEhFLCBBU1RFUklTSywgQkFDS1NMQVNILCBCQUNLVElDSywgQ0FSRVQsIERPTExBUiwgRVFVQUxTLCBIWVBIRU4sIE9QRU5CUkFDRSwgQ0xPU0VCUkFDRSwgUEVSQ0VOVCwgUElQRSwgUExVUywgUE9VTkQsIFFVRVJZLCBTTEFTSCwgU1lNLCBUSUxERSwgVU5ERVJTQ09SRV07XG5cbiAgLy8gVGhlIHVuaXZlcnNhbCBzdGFydGluZyBzdGF0ZS5cbiAgLyoqXG4gICAqIEB0eXBlIFN0YXRlPFRva2VuPlxuICAgKi9cbiAgY29uc3QgU3RhcnQgPSBtYWtlU3RhdGUoKTtcbiAgY29uc3QgTG9jYWxwYXJ0ID0gdHQoU3RhcnQsIFRJTERFKTsgLy8gTG9jYWwgcGFydCBvZiB0aGUgZW1haWwgYWRkcmVzc1xuICB0YShMb2NhbHBhcnQsIGxvY2FscGFydEFjY2VwdGluZywgTG9jYWxwYXJ0KTtcbiAgdGEoTG9jYWxwYXJ0LCBncm91cHMuZG9tYWluLCBMb2NhbHBhcnQpO1xuICBjb25zdCBEb21haW4gPSBtYWtlU3RhdGUoKSxcbiAgICBTY2hlbWUgPSBtYWtlU3RhdGUoKSxcbiAgICBTbGFzaFNjaGVtZSA9IG1ha2VTdGF0ZSgpO1xuICB0YShTdGFydCwgZ3JvdXBzLmRvbWFpbiwgRG9tYWluKTsgLy8gcGFyc2VkIHN0cmluZyBlbmRzIHdpdGggYSBwb3RlbnRpYWwgZG9tYWluIG5hbWUgKEEpXG4gIHRhKFN0YXJ0LCBncm91cHMuc2NoZW1lLCBTY2hlbWUpOyAvLyBlLmcuLCAnbWFpbHRvJ1xuICB0YShTdGFydCwgZ3JvdXBzLnNsYXNoc2NoZW1lLCBTbGFzaFNjaGVtZSk7IC8vIGUuZy4sICdodHRwJ1xuXG4gIHRhKERvbWFpbiwgbG9jYWxwYXJ0QWNjZXB0aW5nLCBMb2NhbHBhcnQpO1xuICB0YShEb21haW4sIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIGNvbnN0IExvY2FscGFydEF0ID0gdHQoRG9tYWluLCBBVCk7IC8vIExvY2FsIHBhcnQgb2YgdGhlIGVtYWlsIGFkZHJlc3MgcGx1cyBAXG5cbiAgdHQoTG9jYWxwYXJ0LCBBVCwgTG9jYWxwYXJ0QXQpOyAvLyBjbG9zZSB0byBhbiBlbWFpbCBhZGRyZXNzIG5vd1xuXG4gIC8vIExvY2FsIHBhcnQgb2YgYW4gZW1haWwgYWRkcmVzcyBjYW4gYmUgZS5nLiAnaHR0cCcgb3IgJ21haWx0bydcbiAgdHQoU2NoZW1lLCBBVCwgTG9jYWxwYXJ0QXQpO1xuICB0dChTbGFzaFNjaGVtZSwgQVQsIExvY2FscGFydEF0KTtcbiAgY29uc3QgTG9jYWxwYXJ0RG90ID0gdHQoTG9jYWxwYXJ0LCBET1QpOyAvLyBMb2NhbCBwYXJ0IG9mIHRoZSBlbWFpbCBhZGRyZXNzIHBsdXMgJy4nIChsb2NhbHBhcnQgY2Fubm90IGVuZCBpbiAuKVxuICB0YShMb2NhbHBhcnREb3QsIGxvY2FscGFydEFjY2VwdGluZywgTG9jYWxwYXJ0KTtcbiAgdGEoTG9jYWxwYXJ0RG90LCBncm91cHMuZG9tYWluLCBMb2NhbHBhcnQpO1xuICBjb25zdCBFbWFpbERvbWFpbiA9IG1ha2VTdGF0ZSgpO1xuICB0YShMb2NhbHBhcnRBdCwgZ3JvdXBzLmRvbWFpbiwgRW1haWxEb21haW4pOyAvLyBwYXJzZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIGxvY2FsIGVtYWlsIGluZm8gKyBAIHdpdGggYSBwb3RlbnRpYWwgZG9tYWluIG5hbWVcbiAgdGEoRW1haWxEb21haW4sIGdyb3Vwcy5kb21haW4sIEVtYWlsRG9tYWluKTtcbiAgY29uc3QgRW1haWxEb21haW5Eb3QgPSB0dChFbWFpbERvbWFpbiwgRE9UKTsgLy8gZG9tYWluIGZvbGxvd2VkIGJ5IERPVFxuICB0YShFbWFpbERvbWFpbkRvdCwgZ3JvdXBzLmRvbWFpbiwgRW1haWxEb21haW4pO1xuICBjb25zdCBFbWFpbCQxID0gbWFrZVN0YXRlKEVtYWlsKTsgLy8gUG9zc2libGUgZW1haWwgYWRkcmVzcyAoY291bGQgaGF2ZSBtb3JlIHRsZHMpXG4gIHRhKEVtYWlsRG9tYWluRG90LCBncm91cHMudGxkLCBFbWFpbCQxKTtcbiAgdGEoRW1haWxEb21haW5Eb3QsIGdyb3Vwcy51dGxkLCBFbWFpbCQxKTtcbiAgdHQoTG9jYWxwYXJ0QXQsIExPQ0FMSE9TVCwgRW1haWwkMSk7XG5cbiAgLy8gSHlwaGVuIGNhbiBqdW1wIGJhY2sgdG8gYSBkb21haW4gbmFtZVxuICBjb25zdCBFbWFpbERvbWFpbkh5cGhlbiA9IHR0KEVtYWlsRG9tYWluLCBIWVBIRU4pOyAvLyBwYXJzZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIGxvY2FsIGVtYWlsIGluZm8gKyBAIHdpdGggYSBwb3RlbnRpYWwgZG9tYWluIG5hbWVcbiAgdGEoRW1haWxEb21haW5IeXBoZW4sIGdyb3Vwcy5kb21haW4sIEVtYWlsRG9tYWluKTtcbiAgdGEoRW1haWwkMSwgZ3JvdXBzLmRvbWFpbiwgRW1haWxEb21haW4pO1xuICB0dChFbWFpbCQxLCBET1QsIEVtYWlsRG9tYWluRG90KTtcbiAgdHQoRW1haWwkMSwgSFlQSEVOLCBFbWFpbERvbWFpbkh5cGhlbik7XG5cbiAgLy8gRmluYWwgcG9zc2libGUgZW1haWwgc3RhdGVzXG4gIGNvbnN0IEVtYWlsQ29sb24gPSB0dChFbWFpbCQxLCBDT0xPTik7IC8vIFVSTCBmb2xsb3dlZCBieSBjb2xvbiAocG90ZW50aWFsIHBvcnQgbnVtYmVyIGhlcmUpXG4gIC8qY29uc3QgRW1haWxDb2xvblBvcnQgPSAqL1xuICB0YShFbWFpbENvbG9uLCBncm91cHMubnVtZXJpYywgRW1haWwpOyAvLyBVUkwgZm9sbG93ZWQgYnkgY29sb24gYW5kIHBvcnQgbnVtYmVyXG5cbiAgLy8gQWNjb3VudCBmb3IgZG90cyBhbmQgaHlwaGVucy4gSHlwaGVucyBhcmUgdXN1YWxseSBwYXJ0cyBvZiBkb21haW4gbmFtZXNcbiAgLy8gKGJ1dCBub3QgVExEcylcbiAgY29uc3QgRG9tYWluSHlwaGVuID0gdHQoRG9tYWluLCBIWVBIRU4pOyAvLyBkb21haW4gZm9sbG93ZWQgYnkgaHlwaGVuXG4gIGNvbnN0IERvbWFpbkRvdCA9IHR0KERvbWFpbiwgRE9UKTsgLy8gZG9tYWluIGZvbGxvd2VkIGJ5IERPVFxuICB0YShEb21haW5IeXBoZW4sIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIHRhKERvbWFpbkRvdCwgbG9jYWxwYXJ0QWNjZXB0aW5nLCBMb2NhbHBhcnQpO1xuICB0YShEb21haW5Eb3QsIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIGNvbnN0IERvbWFpbkRvdFRsZCA9IG1ha2VTdGF0ZShVcmwpOyAvLyBTaW1wbGVzdCBwb3NzaWJsZSBVUkwgd2l0aCBubyBxdWVyeSBzdHJpbmdcbiAgdGEoRG9tYWluRG90LCBncm91cHMudGxkLCBEb21haW5Eb3RUbGQpO1xuICB0YShEb21haW5Eb3QsIGdyb3Vwcy51dGxkLCBEb21haW5Eb3RUbGQpO1xuICB0YShEb21haW5Eb3RUbGQsIGdyb3Vwcy5kb21haW4sIERvbWFpbik7XG4gIHRhKERvbWFpbkRvdFRsZCwgbG9jYWxwYXJ0QWNjZXB0aW5nLCBMb2NhbHBhcnQpO1xuICB0dChEb21haW5Eb3RUbGQsIERPVCwgRG9tYWluRG90KTtcbiAgdHQoRG9tYWluRG90VGxkLCBIWVBIRU4sIERvbWFpbkh5cGhlbik7XG4gIHR0KERvbWFpbkRvdFRsZCwgQVQsIExvY2FscGFydEF0KTtcbiAgY29uc3QgRG9tYWluRG90VGxkQ29sb24gPSB0dChEb21haW5Eb3RUbGQsIENPTE9OKTsgLy8gVVJMIGZvbGxvd2VkIGJ5IGNvbG9uIChwb3RlbnRpYWwgcG9ydCBudW1iZXIgaGVyZSlcbiAgY29uc3QgRG9tYWluRG90VGxkQ29sb25Qb3J0ID0gbWFrZVN0YXRlKFVybCk7IC8vIFRMRCBmb2xsb3dlZCBieSBhIHBvcnQgbnVtYmVyXG4gIHRhKERvbWFpbkRvdFRsZENvbG9uLCBncm91cHMubnVtZXJpYywgRG9tYWluRG90VGxkQ29sb25Qb3J0KTtcblxuICAvLyBMb25nIFVSTCB3aXRoIG9wdGlvbmFsIHBvcnQgYW5kIG1heWJlIHF1ZXJ5IHN0cmluZ1xuICBjb25zdCBVcmwkMSA9IG1ha2VTdGF0ZShVcmwpO1xuXG4gIC8vIFVSTCB3aXRoIGV4dHJhIHN5bWJvbHMgYXQgdGhlIGVuZCwgZm9sbG93ZWQgYnkgYW4gb3BlbmluZyBicmFja2V0XG4gIGNvbnN0IFVybE5vbmFjY2VwdCA9IG1ha2VTdGF0ZSgpOyAvLyBVUkwgZm9sbG93ZWQgYnkgc29tZSBzeW1ib2xzICh3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBmaW5hbCBVUkwpXG5cbiAgLy8gUXVlcnkgc3RyaW5nc1xuICB0YShVcmwkMSwgcXNBY2NlcHRpbmcsIFVybCQxKTtcbiAgdGEoVXJsJDEsIHFzTm9uQWNjZXB0aW5nLCBVcmxOb25hY2NlcHQpO1xuICB0YShVcmxOb25hY2NlcHQsIHFzQWNjZXB0aW5nLCBVcmwkMSk7XG4gIHRhKFVybE5vbmFjY2VwdCwgcXNOb25BY2NlcHRpbmcsIFVybE5vbmFjY2VwdCk7XG5cbiAgLy8gQmVjb21lIHJlYWwgVVJMcyBhZnRlciBgU0xBU0hgIG9yIGBDT0xPTiBOVU0gU0xBU0hgXG4gIC8vIEhlcmUgd29ya3Mgd2l0aCBvciB3aXRob3V0IHNjaGVtZTovLyBwcmVmaXhcbiAgdHQoRG9tYWluRG90VGxkLCBTTEFTSCwgVXJsJDEpO1xuICB0dChEb21haW5Eb3RUbGRDb2xvblBvcnQsIFNMQVNILCBVcmwkMSk7XG5cbiAgLy8gTm90ZSB0aGF0IGRvbWFpbnMgdGhhdCBiZWdpbiB3aXRoIHNjaGVtZXMgYXJlIHRyZWF0ZWQgc2xpZ2hseSBkaWZmZXJlbnRseVxuICBjb25zdCBTY2hlbWVDb2xvbiA9IHR0KFNjaGVtZSwgQ09MT04pOyAvLyBlLmcuLCAnbWFpbHRvOidcbiAgY29uc3QgU2xhc2hTY2hlbWVDb2xvbiA9IHR0KFNsYXNoU2NoZW1lLCBDT0xPTik7IC8vIGUuZy4sICdodHRwOidcbiAgY29uc3QgU2xhc2hTY2hlbWVDb2xvblNsYXNoID0gdHQoU2xhc2hTY2hlbWVDb2xvbiwgU0xBU0gpOyAvLyBlLmcuLCAnaHR0cDovJ1xuXG4gIGNvbnN0IFVyaVByZWZpeCA9IHR0KFNsYXNoU2NoZW1lQ29sb25TbGFzaCwgU0xBU0gpOyAvLyBlLmcuLCAnaHR0cDovLydcblxuICAvLyBTY2hlbWUgc3RhdGVzIGNhbiB0cmFuc2l0aW9uIHRvIGRvbWFpbiBzdGF0ZXNcbiAgdGEoU2NoZW1lLCBncm91cHMuZG9tYWluLCBEb21haW4pO1xuICB0dChTY2hlbWUsIERPVCwgRG9tYWluRG90KTtcbiAgdHQoU2NoZW1lLCBIWVBIRU4sIERvbWFpbkh5cGhlbik7XG4gIHRhKFNsYXNoU2NoZW1lLCBncm91cHMuZG9tYWluLCBEb21haW4pO1xuICB0dChTbGFzaFNjaGVtZSwgRE9ULCBEb21haW5Eb3QpO1xuICB0dChTbGFzaFNjaGVtZSwgSFlQSEVOLCBEb21haW5IeXBoZW4pO1xuXG4gIC8vIEZvcmNlIFVSTCB3aXRoIHNjaGVtZSBwcmVmaXggZm9sbG93ZWQgYnkgYW55dGhpbmcgc2FuZVxuICB0YShTY2hlbWVDb2xvbiwgZ3JvdXBzLmRvbWFpbiwgVXJsJDEpO1xuICB0dChTY2hlbWVDb2xvbiwgU0xBU0gsIFVybCQxKTtcbiAgdGEoVXJpUHJlZml4LCBncm91cHMuZG9tYWluLCBVcmwkMSk7XG4gIHRhKFVyaVByZWZpeCwgcXNBY2NlcHRpbmcsIFVybCQxKTtcbiAgdHQoVXJpUHJlZml4LCBTTEFTSCwgVXJsJDEpO1xuICBjb25zdCBicmFja2V0UGFpcnMgPSBbW09QRU5CUkFDRSwgQ0xPU0VCUkFDRV0sXG4gIC8vIHt9XG4gIFtPUEVOQlJBQ0tFVCwgQ0xPU0VCUkFDS0VUXSxcbiAgLy8gW11cbiAgW09QRU5QQVJFTiwgQ0xPU0VQQVJFTl0sXG4gIC8vICgpXG4gIFtPUEVOQU5HTEVCUkFDS0VULCBDTE9TRUFOR0xFQlJBQ0tFVF0sXG4gIC8vIDw+XG4gIFtGVUxMV0lEVEhMRUZUUEFSRU4sIEZVTExXSURUSFJJR0hUUEFSRU5dLFxuICAvLyBcdUZGMDhcdUZGMDlcbiAgW0xFRlRDT1JORVJCUkFDS0VULCBSSUdIVENPUk5FUkJSQUNLRVRdLFxuICAvLyBcdTMwMENcdTMwMERcbiAgW0xFRlRXSElURUNPUk5FUkJSQUNLRVQsIFJJR0hUV0hJVEVDT1JORVJCUkFDS0VUXSxcbiAgLy8gXHUzMDBFXHUzMDBGXG4gIFtGVUxMV0lEVEhMRVNTVEhBTiwgRlVMTFdJRFRIR1JFQVRFUlRIQU5dIC8vIFx1RkYxQ1x1RkYxRVxuICBdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhY2tldFBhaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgW09QRU4sIENMT1NFXSA9IGJyYWNrZXRQYWlyc1tpXTtcbiAgICBjb25zdCBVcmxPcGVuID0gdHQoVXJsJDEsIE9QRU4pOyAvLyBVUkwgZm9sbG93ZWQgYnkgb3BlbiBicmFja2V0XG5cbiAgICAvLyBDb250aW51ZSBub3QgYWNjZXB0aW5nIGZvciBvcGVuIGJyYWNrZXRzXG4gICAgdHQoVXJsTm9uYWNjZXB0LCBPUEVOLCBVcmxPcGVuKTtcblxuICAgIC8vIENsb3NpbmcgYnJhY2tldCBjb21wb25lbnQuIFRoaXMgY2hhcmFjdGVyIFdJTEwgYmUgaW5jbHVkZWQgaW4gdGhlIFVSTFxuICAgIHR0KFVybE9wZW4sIENMT1NFLCBVcmwkMSk7XG5cbiAgICAvLyBVUkwgdGhhdCBiZWluZ3Mgd2l0aCBhbiBvcGVuaW5nIGJyYWNrZXQsIGZvbGxvd2VkIGJ5IGEgc3ltYm9scy5cbiAgICAvLyBOb3RlIHRoYXQgdGhlIGZpbmFsIHN0YXRlIGNhbiBzdGlsbCBiZSBgVXJsT3BlbmAgKGlmIHRoZSBVUkwgaGFzIGFcbiAgICAvLyBzaW5nbGUgb3BlbmluZyBicmFja2V0IGZvciBzb21lIHJlYXNvbikuXG4gICAgY29uc3QgVXJsT3BlblEgPSBtYWtlU3RhdGUoVXJsKTtcbiAgICB0YShVcmxPcGVuLCBxc0FjY2VwdGluZywgVXJsT3BlblEpO1xuICAgIGNvbnN0IFVybE9wZW5TeW1zID0gbWFrZVN0YXRlKCk7IC8vIFVybE9wZW4gZm9sbG93ZWQgYnkgc29tZSBzeW1ib2xzIGl0IGNhbm5vdCBlbmQgaXRcbiAgICB0YShVcmxPcGVuLCBxc05vbkFjY2VwdGluZyk7XG5cbiAgICAvLyBVUkwgdGhhdCBiZWdpbnMgd2l0aCBhbiBvcGVuaW5nIGJyYWNrZXQsIGZvbGxvd2VkIGJ5IHNvbWUgc3ltYm9sc1xuICAgIHRhKFVybE9wZW5RLCBxc0FjY2VwdGluZywgVXJsT3BlblEpO1xuICAgIHRhKFVybE9wZW5RLCBxc05vbkFjY2VwdGluZywgVXJsT3BlblN5bXMpO1xuICAgIHRhKFVybE9wZW5TeW1zLCBxc0FjY2VwdGluZywgVXJsT3BlblEpO1xuICAgIHRhKFVybE9wZW5TeW1zLCBxc05vbkFjY2VwdGluZywgVXJsT3BlblN5bXMpO1xuXG4gICAgLy8gQ2xvc2UgYnJhY2UvYnJhY2tldCB0byBiZWNvbWUgcmVndWxhciBVUkxcbiAgICB0dChVcmxPcGVuUSwgQ0xPU0UsIFVybCQxKTtcbiAgICB0dChVcmxPcGVuU3ltcywgQ0xPU0UsIFVybCQxKTtcbiAgfVxuICB0dChTdGFydCwgTE9DQUxIT1NULCBEb21haW5Eb3RUbGQpOyAvLyBsb2NhbGhvc3QgaXMgYSB2YWxpZCBVUkwgc3RhdGVcbiAgdHQoU3RhcnQsIE5MJDEsIE5sKTsgLy8gc2luZ2xlIG5ldyBsaW5lXG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogU3RhcnQsXG4gICAgdG9rZW5zOiB0a1xuICB9O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGFyc2VyIHN0YXRlIG1hY2hpbmUgb24gYSBsaXN0IG9mIHNjYW5uZWQgc3RyaW5nLWJhc2VkIHRva2VucyB0b1xuICogY3JlYXRlIGEgbGlzdCBvZiBtdWx0aSB0b2tlbnMsIGVhY2ggb2Ygd2hpY2ggcmVwcmVzZW50cyBhIFVSTCwgZW1haWwgYWRkcmVzcyxcbiAqIHBsYWluIHRleHQsIGV0Yy5cbiAqXG4gKiBAcGFyYW0ge1N0YXRlPE11bHRpVG9rZW4+fSBzdGFydCBwYXJzZXIgc3RhcnQgc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCB0aGUgb3JpZ2luYWwgaW5wdXQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZ2l2ZW4gdG9rZW5zXG4gKiBAcGFyYW0ge1Rva2VuW119IHRva2VucyBsaXN0IG9mIHNjYW5uZWQgdG9rZW5zXG4gKiBAcmV0dXJucyB7TXVsdGlUb2tlbltdfVxuICovXG5mdW5jdGlvbiBydW4oc3RhcnQsIGlucHV0LCB0b2tlbnMpIHtcbiAgbGV0IGxlbiA9IHRva2Vucy5sZW5ndGg7XG4gIGxldCBjdXJzb3IgPSAwO1xuICBsZXQgbXVsdGlzID0gW107XG4gIGxldCB0ZXh0VG9rZW5zID0gW107XG4gIHdoaWxlIChjdXJzb3IgPCBsZW4pIHtcbiAgICBsZXQgc3RhdGUgPSBzdGFydDtcbiAgICBsZXQgc2Vjb25kU3RhdGUgPSBudWxsO1xuICAgIGxldCBuZXh0U3RhdGUgPSBudWxsO1xuICAgIGxldCBtdWx0aUxlbmd0aCA9IDA7XG4gICAgbGV0IGxhdGVzdEFjY2VwdGluZyA9IG51bGw7XG4gICAgbGV0IHNpbmNlQWNjZXB0cyA9IC0xO1xuICAgIHdoaWxlIChjdXJzb3IgPCBsZW4gJiYgIShzZWNvbmRTdGF0ZSA9IHN0YXRlLmdvKHRva2Vuc1tjdXJzb3JdLnQpKSkge1xuICAgICAgLy8gU3RhcnRpbmcgdG9rZW5zIHdpdGggbm93aGVyZSB0byBqdW1wIHRvLlxuICAgICAgLy8gQ29uc2lkZXIgdGhlc2UgdG8gYmUganVzdCBwbGFpbiB0ZXh0XG4gICAgICB0ZXh0VG9rZW5zLnB1c2godG9rZW5zW2N1cnNvcisrXSk7XG4gICAgfVxuICAgIHdoaWxlIChjdXJzb3IgPCBsZW4gJiYgKG5leHRTdGF0ZSA9IHNlY29uZFN0YXRlIHx8IHN0YXRlLmdvKHRva2Vuc1tjdXJzb3JdLnQpKSkge1xuICAgICAgLy8gR2V0IHRoZSBuZXh0IHN0YXRlXG4gICAgICBzZWNvbmRTdGF0ZSA9IG51bGw7XG4gICAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGF0ZXN0IGFjY2VwdGluZyBzdGF0ZVxuICAgICAgaWYgKHN0YXRlLmFjY2VwdHMoKSkge1xuICAgICAgICBzaW5jZUFjY2VwdHMgPSAwO1xuICAgICAgICBsYXRlc3RBY2NlcHRpbmcgPSBzdGF0ZTtcbiAgICAgIH0gZWxzZSBpZiAoc2luY2VBY2NlcHRzID49IDApIHtcbiAgICAgICAgc2luY2VBY2NlcHRzKys7XG4gICAgICB9XG4gICAgICBjdXJzb3IrKztcbiAgICAgIG11bHRpTGVuZ3RoKys7XG4gICAgfVxuICAgIGlmIChzaW5jZUFjY2VwdHMgPCAwKSB7XG4gICAgICAvLyBObyBhY2NlcHRpbmcgc3RhdGUgd2FzIGZvdW5kLCBwYXJ0IG9mIGEgcmVndWxhciB0ZXh0IHRva2VuIGFkZFxuICAgICAgLy8gdGhlIGZpcnN0IHRleHQgdG9rZW4gdG8gdGhlIHRleHQgdG9rZW5zIGFycmF5IGFuZCB0cnkgYWdhaW4gZnJvbVxuICAgICAgLy8gdGhlIG5leHRcbiAgICAgIGN1cnNvciAtPSBtdWx0aUxlbmd0aDtcbiAgICAgIGlmIChjdXJzb3IgPCBsZW4pIHtcbiAgICAgICAgdGV4dFRva2Vucy5wdXNoKHRva2Vuc1tjdXJzb3JdKTtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFjY2VwdGluZyBzdGF0ZSFcbiAgICAgIC8vIEZpcnN0IGNsb3NlIG9mZiB0aGUgdGV4dFRva2VucyAoaWYgYXZhaWxhYmxlKVxuICAgICAgaWYgKHRleHRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBtdWx0aXMucHVzaChpbml0TXVsdGlUb2tlbihUZXh0LCBpbnB1dCwgdGV4dFRva2VucykpO1xuICAgICAgICB0ZXh0VG9rZW5zID0gW107XG4gICAgICB9XG5cbiAgICAgIC8vIFJvbGwgYmFjayB0byB0aGUgbGF0ZXN0IGFjY2VwdGluZyBzdGF0ZVxuICAgICAgY3Vyc29yIC09IHNpbmNlQWNjZXB0cztcbiAgICAgIG11bHRpTGVuZ3RoIC09IHNpbmNlQWNjZXB0cztcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IG11bHRpdG9rZW5cbiAgICAgIGNvbnN0IE11bHRpID0gbGF0ZXN0QWNjZXB0aW5nLnQ7XG4gICAgICBjb25zdCBzdWJ0b2tlbnMgPSB0b2tlbnMuc2xpY2UoY3Vyc29yIC0gbXVsdGlMZW5ndGgsIGN1cnNvcik7XG4gICAgICBtdWx0aXMucHVzaChpbml0TXVsdGlUb2tlbihNdWx0aSwgaW5wdXQsIHN1YnRva2VucykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmFsbHkgY2xvc2Ugb2ZmIHRoZSB0ZXh0VG9rZW5zIChpZiBhdmFpbGFibGUpXG4gIGlmICh0ZXh0VG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICBtdWx0aXMucHVzaChpbml0TXVsdGlUb2tlbihUZXh0LCBpbnB1dCwgdGV4dFRva2VucykpO1xuICB9XG4gIHJldHVybiBtdWx0aXM7XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgaW5zdGFudGlhdGluZyBhIG5ldyBtdWx0aXRva2VuIHdpdGggYWxsIHRoZSByZWxldmFudFxuICogZmllbGRzIGR1cmluZyBwYXJzaW5nLlxuICogQHBhcmFtIHtuZXcgKHZhbHVlOiBzdHJpbmcsIHRva2VuczogVG9rZW5bXSkgPT4gTXVsdGlUb2tlbn0gTXVsdGkgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCBvcmlnaW5hbCBpbnB1dCBzdHJpbmdcbiAqIEBwYXJhbSB7VG9rZW5bXX0gdG9rZW5zIGNvbnNlY3V0aXZlIHRva2VucyBzY2FubmVkIGZyb20gaW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7TXVsdGlUb2tlbn1cbiAqL1xuZnVuY3Rpb24gaW5pdE11bHRpVG9rZW4oTXVsdGksIGlucHV0LCB0b2tlbnMpIHtcbiAgY29uc3Qgc3RhcnRJZHggPSB0b2tlbnNbMF0ucztcbiAgY29uc3QgZW5kSWR4ID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5lO1xuICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHgpO1xuICByZXR1cm4gbmV3IE11bHRpKHZhbHVlLCB0b2tlbnMpO1xufVxuXG5jb25zdCB3YXJuID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUgJiYgY29uc29sZS53YXJuIHx8ICgoKSA9PiB7fSk7XG5jb25zdCB3YXJuQWR2aWNlID0gJ3VudGlsIG1hbnVhbCBjYWxsIG9mIGxpbmtpZnkuaW5pdCgpLiBSZWdpc3RlciBhbGwgc2NoZW1lcyBhbmQgcGx1Z2lucyBiZWZvcmUgaW52b2tpbmcgbGlua2lmeSB0aGUgZmlyc3QgdGltZS4nO1xuXG4vLyBTaWRlLWVmZmVjdCBpbml0aWFsaXphdGlvbiBzdGF0ZVxuY29uc3QgSU5JVCA9IHtcbiAgc2Nhbm5lcjogbnVsbCxcbiAgcGFyc2VyOiBudWxsLFxuICB0b2tlblF1ZXVlOiBbXSxcbiAgcGx1Z2luUXVldWU6IFtdLFxuICBjdXN0b21TY2hlbWVzOiBbXSxcbiAgaW5pdGlhbGl6ZWQ6IGZhbHNlXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiBcdHN0YXJ0OiBTdGF0ZTxzdHJpbmc+LFxuICogXHR0b2tlbnM6IHsgZ3JvdXBzOiBDb2xsZWN0aW9uczxzdHJpbmc+IH0gJiB0eXBlb2YgdGtcbiAqIH19IFNjYW5uZXJJbml0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogXHRzdGFydDogU3RhdGU8TXVsdGlUb2tlbj4sXG4gKiBcdHRva2VuczogdHlwZW9mIG11bHRpXG4gKiB9fSBQYXJzZXJJbml0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFyZzogeyBzY2FubmVyOiBTY2FubmVySW5pdCB9KSA9PiB2b2lkfSBUb2tlblBsdWdpblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmc6IHsgc2Nhbm5lcjogU2Nhbm5lckluaXQsIHBhcnNlcjogUGFyc2VySW5pdCB9KSA9PiB2b2lkfSBQbHVnaW5cbiAqL1xuXG4vKipcbiAqIERlLXJlZ2lzdGVyIGFsbCBwbHVnaW5zIGFuZCByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGUtbWFjaGluZS4gVXNlZCBmb3JcbiAqIHRlc3Rpbmc7IG5vdCByZXF1aXJlZCBpbiBwcmFjdGljZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc2V0KCkge1xuICBTdGF0ZS5ncm91cHMgPSB7fTtcbiAgSU5JVC5zY2FubmVyID0gbnVsbDtcbiAgSU5JVC5wYXJzZXIgPSBudWxsO1xuICBJTklULnRva2VuUXVldWUgPSBbXTtcbiAgSU5JVC5wbHVnaW5RdWV1ZSA9IFtdO1xuICBJTklULmN1c3RvbVNjaGVtZXMgPSBbXTtcbiAgSU5JVC5pbml0aWFsaXplZCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgdG9rZW4gcGx1Z2luIHRvIGFsbG93IHRoZSBzY2FubmVyIHRvIHJlY29nbml6ZSBhZGRpdGlvbmFsIHRva2VuXG4gKiB0eXBlcyBiZWZvcmUgdGhlIHBhcnNlciBzdGF0ZSBtYWNoaW5lIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHJlc3VsdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBvZiBwbHVnaW4gdG8gcmVnaXN0ZXJcbiAqIEBwYXJhbSB7VG9rZW5QbHVnaW59IHBsdWdpbiBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHNjYW5uZXIgc3RhdGUgbWFjaGluZVxuICogYW5kIGF2YWlsYWJsZSBzY2FubmVyIHRva2VucyBhbmQgY29sbGVjdGlvbnMgYW5kIGV4dGVuZHMgdGhlIHN0YXRlIG1hY2hpbmUgdG9cbiAqIHJlY29nbml6ZSBhZGRpdGlvbmFsIHRva2VucyBvciBncm91cHMuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyVG9rZW5QbHVnaW4obmFtZSwgcGx1Z2luKSB7XG4gIGlmICh0eXBlb2YgcGx1Z2luICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsaW5raWZ5anM6IEludmFsaWQgdG9rZW4gcGx1Z2luICR7cGx1Z2lufSAoZXhwZWN0cyBmdW5jdGlvbilgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IElOSVQudG9rZW5RdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChuYW1lID09PSBJTklULnRva2VuUXVldWVbaV1bMF0pIHtcbiAgICAgIHdhcm4oYGxpbmtpZnlqczogdG9rZW4gcGx1Z2luIFwiJHtuYW1lfVwiIGFscmVhZHkgcmVnaXN0ZXJlZCAtIHdpbGwgYmUgb3ZlcndyaXR0ZW5gKTtcbiAgICAgIElOSVQudG9rZW5RdWV1ZVtpXSA9IFtuYW1lLCBwbHVnaW5dO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBJTklULnRva2VuUXVldWUucHVzaChbbmFtZSwgcGx1Z2luXSk7XG4gIGlmIChJTklULmluaXRpYWxpemVkKSB7XG4gICAgd2FybihgbGlua2lmeWpzOiBhbHJlYWR5IGluaXRpYWxpemVkIC0gd2lsbCBub3QgcmVnaXN0ZXIgdG9rZW4gcGx1Z2luIFwiJHtuYW1lfVwiICR7d2FybkFkdmljZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgbGlua2lmeSBwbHVnaW5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIG9mIHBsdWdpbiB0byByZWdpc3RlclxuICogQHBhcmFtIHtQbHVnaW59IHBsdWdpbiBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHBhcnNlciBzdGF0ZSBtYWNoaW5lIGFuZFxuICogZXh0ZW5kcyB0aGUgcGFyc2VyIHRvIHJlY29nbml6ZSBhZGRpdGlvbmFsIGxpbmsgdHlwZXNcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW4obmFtZSwgcGx1Z2luKSB7XG4gIGlmICh0eXBlb2YgcGx1Z2luICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsaW5raWZ5anM6IEludmFsaWQgcGx1Z2luICR7cGx1Z2lufSAoZXhwZWN0cyBmdW5jdGlvbilgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IElOSVQucGx1Z2luUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobmFtZSA9PT0gSU5JVC5wbHVnaW5RdWV1ZVtpXVswXSkge1xuICAgICAgd2FybihgbGlua2lmeWpzOiBwbHVnaW4gXCIke25hbWV9XCIgYWxyZWFkeSByZWdpc3RlcmVkIC0gd2lsbCBiZSBvdmVyd3JpdHRlbmApO1xuICAgICAgSU5JVC5wbHVnaW5RdWV1ZVtpXSA9IFtuYW1lLCBwbHVnaW5dO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBJTklULnBsdWdpblF1ZXVlLnB1c2goW25hbWUsIHBsdWdpbl0pO1xuICBpZiAoSU5JVC5pbml0aWFsaXplZCkge1xuICAgIHdhcm4oYGxpbmtpZnlqczogYWxyZWFkeSBpbml0aWFsaXplZCAtIHdpbGwgbm90IHJlZ2lzdGVyIHBsdWdpbiBcIiR7bmFtZX1cIiAke3dhcm5BZHZpY2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgVVJMcyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm90b2NvbC4gQW55dGhpbmcgd2l0aCBmb3JtYXRcbiAqIFwicHJvdG9jb2w6Ly8uLi5cIiB3aWxsIGJlIGNvbnNpZGVyZWQgYSBsaW5rLiBJZiBgb3B0aW9uYWxTbGFzaFNsYXNoYCBpcyBzZXQgdG9cbiAqIGB0cnVlYCwgYW55dGhpbmcgd2l0aCBmb3JtYXQgXCJwcm90b2NvbDouLi5cIiB3aWxsIGJlIGNvbnNpZGVyZWQgYSBsaW5rLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3RvY29sXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25hbFNsYXNoU2xhc2hdXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tUHJvdG9jb2woc2NoZW1lLCBvcHRpb25hbFNsYXNoU2xhc2gpIHtcbiAgaWYgKG9wdGlvbmFsU2xhc2hTbGFzaCA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9uYWxTbGFzaFNsYXNoID0gZmFsc2U7XG4gIH1cbiAgaWYgKElOSVQuaW5pdGlhbGl6ZWQpIHtcbiAgICB3YXJuKGBsaW5raWZ5anM6IGFscmVhZHkgaW5pdGlhbGl6ZWQgLSB3aWxsIG5vdCByZWdpc3RlciBjdXN0b20gc2NoZW1lIFwiJHtzY2hlbWV9XCIgJHt3YXJuQWR2aWNlfWApO1xuICB9XG4gIGlmICghL15bMC05YS16XSsoLVswLTlhLXpdKykqJC8udGVzdChzY2hlbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsaW5raWZ5anM6IGluY29ycmVjdCBzY2hlbWUgZm9ybWF0LlxuMS4gTXVzdCBvbmx5IGNvbnRhaW4gZGlnaXRzLCBsb3dlcmNhc2UgQVNDSUkgbGV0dGVycyBvciBcIi1cIlxuMi4gQ2Fubm90IHN0YXJ0IG9yIGVuZCB3aXRoIFwiLVwiXG4zLiBcIi1cIiBjYW5ub3QgcmVwZWF0YCk7XG4gIH1cbiAgSU5JVC5jdXN0b21TY2hlbWVzLnB1c2goW3NjaGVtZSwgb3B0aW9uYWxTbGFzaFNsYXNoXSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgbGlua2lmeSBzdGF0ZSBtYWNoaW5lLiBDYWxsZWQgYXV0b21hdGljYWxseSB0aGUgZmlyc3QgdGltZVxuICogbGlua2lmeSBpcyBjYWxsZWQgb24gYSBzdHJpbmcsIGJ1dCBtYXkgYmUgY2FsbGVkIG1hbnVhbGx5IGFzIHdlbGwuXG4gKi9cbmZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vIEluaXRpYWxpemUgc2Nhbm5lciBzdGF0ZSBtYWNoaW5lIGFuZCBwbHVnaW5zXG4gIElOSVQuc2Nhbm5lciA9IGluaXQkMihJTklULmN1c3RvbVNjaGVtZXMpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IElOSVQudG9rZW5RdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIElOSVQudG9rZW5RdWV1ZVtpXVsxXSh7XG4gICAgICBzY2FubmVyOiBJTklULnNjYW5uZXJcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgcGFyc2VyIHN0YXRlIG1hY2hpbmUgYW5kIHBsdWdpbnNcbiAgSU5JVC5wYXJzZXIgPSBpbml0JDEoSU5JVC5zY2FubmVyLnRva2Vucyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgSU5JVC5wbHVnaW5RdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIElOSVQucGx1Z2luUXVldWVbaV1bMV0oe1xuICAgICAgc2Nhbm5lcjogSU5JVC5zY2FubmVyLFxuICAgICAgcGFyc2VyOiBJTklULnBhcnNlclxuICAgIH0pO1xuICB9XG4gIElOSVQuaW5pdGlhbGl6ZWQgPSB0cnVlO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgc3RyaW5nIGludG8gdG9rZW5zIHRoYXQgcmVwcmVzZW50IGxpbmthYmxlIGFuZCBub24tbGlua2FibGUgc3ViLWNvbXBvbmVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge011bHRpVG9rZW5bXX0gdG9rZW5zXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplKHN0cikge1xuICBpZiAoIUlOSVQuaW5pdGlhbGl6ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgcmV0dXJuIHJ1bihJTklULnBhcnNlci5zdGFydCwgc3RyLCBydW4kMShJTklULnNjYW5uZXIuc3RhcnQsIHN0cikpO1xufVxuXG4vKipcbiAqIEZpbmQgYSBsaXN0IG9mIGxpbmthYmxlIGl0ZW1zIGluIHRoZSBnaXZlbiBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIHN0cmluZyB0byBmaW5kIGxpbmtzIGluXG4gKiBAcGFyYW0ge3N0cmluZyB8IE9wdHN9IFt0eXBlXSBlaXRoZXIgZm9ybWF0dGluZyBvcHRpb25zIG9yIHNwZWNpZmljIHR5cGUgb2ZcbiAqIGxpbmtzIHRvIGZpbmQsIGUuZy4sICd1cmwnIG9yICdlbWFpbCdcbiAqIEBwYXJhbSB7T3B0c30gW29wdHNdIGZvcm1hdHRpbmcgb3B0aW9ucyBmb3IgZmluYWwgb3V0cHV0LiBDYW5ub3QgYmUgc3BlY2lmaWVkXG4gKiBpZiBvcHRzIGFscmVhZHkgcHJvdmlkZWQgaW4gYHR5cGVgIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGZpbmQoc3RyLCB0eXBlLCBvcHRzKSB7XG4gIGlmICh0eXBlID09PSB2b2lkIDApIHtcbiAgICB0eXBlID0gbnVsbDtcbiAgfVxuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IG51bGw7XG4gIH1cbiAgaWYgKHR5cGUgJiYgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIHRocm93IEVycm9yKGBsaW5raWZ5anM6IEludmFsaWQgbGluayB0eXBlICR7dHlwZX07IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICB9XG4gICAgb3B0cyA9IHR5cGU7XG4gICAgdHlwZSA9IG51bGw7XG4gIH1cbiAgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKG9wdHMpO1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZShzdHIpO1xuICBjb25zdCBmaWx0ZXJlZCA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgIGlmICh0b2tlbi5pc0xpbmsgJiYgKCF0eXBlIHx8IHRva2VuLnQgPT09IHR5cGUpICYmIG9wdGlvbnMuY2hlY2sodG9rZW4pKSB7XG4gICAgICBmaWx0ZXJlZC5wdXNoKHRva2VuLnRvRm9ybWF0dGVkT2JqZWN0KG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgdmFsaWQgbGlua2FibGUgdGV4dCBvZiBzb21lIHNvcnQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90XG4gKiB0cmltIHRoZSB0ZXh0IGZvciB5b3UuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGEgc2Vjb25kIGB0eXBlYCBwYXJhbSwgd2hpY2ggaXMgdGhlIHR5cGUgb2YgbGluayB0byB0ZXN0XG4gKiBmb3IuXG4gKlxuICogRm9yIGV4YW1wbGUsXG4gKlxuICogICAgIGxpbmtpZnkudGVzdChzdHIsICdlbWFpbCcpO1xuICpcbiAqIFJldHVybnMgYHRydWVgIGlmIHN0ciBpcyBhIHZhbGlkIGVtYWlsLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBzdHJpbmcgdG8gdGVzdCBmb3IgbGlua3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZV0gb3B0aW9uYWwgc3BlY2lmaWMgbGluayB0eXBlIHRvIGxvb2sgZm9yXG4gKiBAcmV0dXJucyBib29sZWFuIHRydWUvZmFsc2VcbiAqL1xuZnVuY3Rpb24gdGVzdChzdHIsIHR5cGUpIHtcbiAgaWYgKHR5cGUgPT09IHZvaWQgMCkge1xuICAgIHR5cGUgPSBudWxsO1xuICB9XG4gIGNvbnN0IHRva2VucyA9IHRva2VuaXplKHN0cik7XG4gIHJldHVybiB0b2tlbnMubGVuZ3RoID09PSAxICYmIHRva2Vuc1swXS5pc0xpbmsgJiYgKCF0eXBlIHx8IHRva2Vuc1swXS50ID09PSB0eXBlKTtcbn1cblxuZXhwb3J0IHsgTXVsdGlUb2tlbiwgT3B0aW9ucywgU3RhdGUsIGNyZWF0ZVRva2VuQ2xhc3MsIGZpbmQsIGluaXQsIG11bHRpLCBvcHRpb25zLCByZWdleHAsIHJlZ2lzdGVyQ3VzdG9tUHJvdG9jb2wsIHJlZ2lzdGVyUGx1Z2luLCByZWdpc3RlclRva2VuUGx1Z2luLCByZXNldCwgc3RyaW5nVG9BcnJheSwgdGVzdCwgdG9rZW5pemUgfTtcbiIsICJpbXBvcnQge1xuICBjb21iaW5lVHJhbnNhY3Rpb25TdGVwcyxcbiAgZmluZENoaWxkcmVuSW5SYW5nZSxcbiAgZ2V0Q2hhbmdlZFJhbmdlcyxcbiAgZ2V0TWFya3NCZXR3ZWVuLFxuICBOb2RlV2l0aFBvcyxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgZmluZCB9IGZyb20gJ2xpbmtpZnlqcydcblxudHlwZSBBdXRvbGlua09wdGlvbnMgPSB7XG4gIHR5cGU6IE1hcmtUeXBlXG4gIHZhbGlkYXRlPzogKHVybDogc3RyaW5nKSA9PiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGluayhvcHRpb25zOiBBdXRvbGlua09wdGlvbnMpOiBQbHVnaW4ge1xuICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAga2V5OiBuZXcgUGx1Z2luS2V5KCdhdXRvbGluaycpLFxuICAgIGFwcGVuZFRyYW5zYWN0aW9uOiAodHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGNvbnN0IGRvY0NoYW5nZXMgPSB0cmFuc2FjdGlvbnMuc29tZSh0cmFuc2FjdGlvbiA9PiB0cmFuc2FjdGlvbi5kb2NDaGFuZ2VkKSAmJiAhb2xkU3RhdGUuZG9jLmVxKG5ld1N0YXRlLmRvYylcbiAgICAgIGNvbnN0IHByZXZlbnRBdXRvbGluayA9IHRyYW5zYWN0aW9ucy5zb21lKHRyYW5zYWN0aW9uID0+IHRyYW5zYWN0aW9uLmdldE1ldGEoJ3ByZXZlbnRBdXRvbGluaycpKVxuXG4gICAgICBpZiAoIWRvY0NoYW5nZXMgfHwgcHJldmVudEF1dG9saW5rKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRyIH0gPSBuZXdTdGF0ZVxuICAgICAgY29uc3QgdHJhbnNmb3JtID0gY29tYmluZVRyYW5zYWN0aW9uU3RlcHMob2xkU3RhdGUuZG9jLCBbLi4udHJhbnNhY3Rpb25zXSlcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBnZXRDaGFuZ2VkUmFuZ2VzKHRyYW5zZm9ybSlcblxuICAgICAgY2hhbmdlcy5mb3JFYWNoKCh7IG5ld1JhbmdlIH0pID0+IHtcbiAgICAgICAgLy8gTm93IGxldOKAmXMgc2VlIGlmIHdlIGNhbiBhZGQgbmV3IGxpbmtzLlxuICAgICAgICBjb25zdCBub2Rlc0luQ2hhbmdlZFJhbmdlcyA9IGZpbmRDaGlsZHJlbkluUmFuZ2UoXG4gICAgICAgICAgbmV3U3RhdGUuZG9jLFxuICAgICAgICAgIG5ld1JhbmdlLFxuICAgICAgICAgIG5vZGUgPT4gbm9kZS5pc1RleHRibG9jayxcbiAgICAgICAgKVxuXG4gICAgICAgIGxldCB0ZXh0QmxvY2s6IE5vZGVXaXRoUG9zIHwgdW5kZWZpbmVkXG4gICAgICAgIGxldCB0ZXh0QmVmb3JlV2hpdGVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKG5vZGVzSW5DaGFuZ2VkUmFuZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAvLyBHcmFiIHRoZSBmaXJzdCBub2RlIHdpdGhpbiB0aGUgY2hhbmdlZCByYW5nZXMgKGV4LiB0aGUgZmlyc3Qgb2YgdHdvIHBhcmFncmFwaHMgd2hlbiBoaXR0aW5nIGVudGVyKS5cbiAgICAgICAgICB0ZXh0QmxvY2sgPSBub2Rlc0luQ2hhbmdlZFJhbmdlc1swXVxuICAgICAgICAgIHRleHRCZWZvcmVXaGl0ZXNwYWNlID0gbmV3U3RhdGUuZG9jLnRleHRCZXR3ZWVuKFxuICAgICAgICAgICAgdGV4dEJsb2NrLnBvcyxcbiAgICAgICAgICAgIHRleHRCbG9jay5wb3MgKyB0ZXh0QmxvY2subm9kZS5ub2RlU2l6ZSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICcgJyxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbm9kZXNJbkNoYW5nZWRSYW5nZXMubGVuZ3RoXG4gICAgICAgICAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gaW5jbHVkZSB0aGUgYmxvY2sgc2VwZXJhdG9yIGFyZ3VtZW50IHRvIHRyZWF0IGhhcmQgYnJlYWtzIGxpa2Ugc3BhY2VzLlxuICAgICAgICAgICYmIG5ld1N0YXRlLmRvYy50ZXh0QmV0d2VlbihuZXdSYW5nZS5mcm9tLCBuZXdSYW5nZS50bywgJyAnLCAnICcpLmVuZHNXaXRoKCcgJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGV4dEJsb2NrID0gbm9kZXNJbkNoYW5nZWRSYW5nZXNbMF1cbiAgICAgICAgICB0ZXh0QmVmb3JlV2hpdGVzcGFjZSA9IG5ld1N0YXRlLmRvYy50ZXh0QmV0d2VlbihcbiAgICAgICAgICAgIHRleHRCbG9jay5wb3MsXG4gICAgICAgICAgICBuZXdSYW5nZS50byxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICcgJyxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dEJsb2NrICYmIHRleHRCZWZvcmVXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgY29uc3Qgd29yZHNCZWZvcmVXaGl0ZXNwYWNlID0gdGV4dEJlZm9yZVdoaXRlc3BhY2Uuc3BsaXQoJyAnKS5maWx0ZXIocyA9PiBzICE9PSAnJylcblxuICAgICAgICAgIGlmICh3b3Jkc0JlZm9yZVdoaXRlc3BhY2UubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxhc3RXb3JkQmVmb3JlU3BhY2UgPSB3b3Jkc0JlZm9yZVdoaXRlc3BhY2Vbd29yZHNCZWZvcmVXaGl0ZXNwYWNlLmxlbmd0aCAtIDFdXG4gICAgICAgICAgY29uc3QgbGFzdFdvcmRBbmRCbG9ja09mZnNldCA9IHRleHRCbG9jay5wb3MgKyB0ZXh0QmVmb3JlV2hpdGVzcGFjZS5sYXN0SW5kZXhPZihsYXN0V29yZEJlZm9yZVNwYWNlKVxuXG4gICAgICAgICAgaWYgKCFsYXN0V29yZEJlZm9yZVNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaW5kKGxhc3RXb3JkQmVmb3JlU3BhY2UpXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmsgPT4gbGluay5pc0xpbmspXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgbGluayBwb3NpdGlvbi5cbiAgICAgICAgICAgIC5tYXAobGluayA9PiAoe1xuICAgICAgICAgICAgICAuLi5saW5rLFxuICAgICAgICAgICAgICBmcm9tOiBsYXN0V29yZEFuZEJsb2NrT2Zmc2V0ICsgbGluay5zdGFydCArIDEsXG4gICAgICAgICAgICAgIHRvOiBsYXN0V29yZEFuZEJsb2NrT2Zmc2V0ICsgbGluay5lbmQgKyAxLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAvLyBpZ25vcmUgbGluayBpbnNpZGUgY29kZSBtYXJrXG4gICAgICAgICAgICAuZmlsdGVyKGxpbmsgPT4ge1xuICAgICAgICAgICAgICBpZiAoIW5ld1N0YXRlLnNjaGVtYS5tYXJrcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiAhbmV3U3RhdGUuZG9jLnJhbmdlSGFzTWFyayhcbiAgICAgICAgICAgICAgICBsaW5rLmZyb20sXG4gICAgICAgICAgICAgICAgbGluay50byxcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZS5zY2hlbWEubWFya3MuY29kZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC8vIHZhbGlkYXRlIGxpbmtcbiAgICAgICAgICAgIC5maWx0ZXIobGluayA9PiB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMudmFsaWRhdGUobGluay52YWx1ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC8vIEFkZCBsaW5rIG1hcmsuXG4gICAgICAgICAgICAuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgICAgICAgICAgaWYgKGdldE1hcmtzQmV0d2VlbihsaW5rLmZyb20sIGxpbmsudG8sIG5ld1N0YXRlLmRvYykuc29tZShpdGVtID0+IGl0ZW0ubWFyay50eXBlID09PSBvcHRpb25zLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0ci5hZGRNYXJrKFxuICAgICAgICAgICAgICAgIGxpbmsuZnJvbSxcbiAgICAgICAgICAgICAgICBsaW5rLnRvLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZS5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgaHJlZjogbGluay5ocmVmLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBpZiAoIXRyLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyXG4gICAgfSxcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBnZXRBdHRyaWJ1dGVzIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgTWFya1R5cGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG50eXBlIENsaWNrSGFuZGxlck9wdGlvbnMgPSB7XG4gIHR5cGU6IE1hcmtUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGlja0hhbmRsZXIob3B0aW9uczogQ2xpY2tIYW5kbGVyT3B0aW9ucyk6IFBsdWdpbiB7XG4gIHJldHVybiBuZXcgUGx1Z2luKHtcbiAgICBrZXk6IG5ldyBQbHVnaW5LZXkoJ2hhbmRsZUNsaWNrTGluaycpLFxuICAgIHByb3BzOiB7XG4gICAgICBoYW5kbGVDbGljazogKHZpZXcsIHBvcywgZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRUYXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcblxuICAgICAgICBpZiAoZXZlbnRUYXJnZXQubm9kZU5hbWUgIT09ICdBJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cnMgPSBnZXRBdHRyaWJ1dGVzKHZpZXcuc3RhdGUsIG9wdGlvbnMudHlwZS5uYW1lKVxuICAgICAgICBjb25zdCBsaW5rID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MTGlua0VsZW1lbnQpXG5cbiAgICAgICAgY29uc3QgaHJlZiA9IGxpbms/LmhyZWYgPz8gYXR0cnMuaHJlZlxuICAgICAgICBjb25zdCB0YXJnZXQgPSBsaW5rPy50YXJnZXQgPz8gYXR0cnMudGFyZ2V0XG5cbiAgICAgICAgaWYgKGxpbmsgJiYgaHJlZikge1xuICAgICAgICAgIGlmICh2aWV3LmVkaXRhYmxlKSB7XG4gICAgICAgICAgICB3aW5kb3cub3BlbihocmVmLCB0YXJnZXQpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IEVkaXRvciB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IE1hcmtUeXBlIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSdcbmltcG9ydCB7IGZpbmQgfSBmcm9tICdsaW5raWZ5anMnXG5cbnR5cGUgUGFzdGVIYW5kbGVyT3B0aW9ucyA9IHtcbiAgZWRpdG9yOiBFZGl0b3JcbiAgdHlwZTogTWFya1R5cGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhc3RlSGFuZGxlcihvcHRpb25zOiBQYXN0ZUhhbmRsZXJPcHRpb25zKTogUGx1Z2luIHtcbiAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgIGtleTogbmV3IFBsdWdpbktleSgnaGFuZGxlUGFzdGVMaW5rJyksXG4gICAgcHJvcHM6IHtcbiAgICAgIGhhbmRsZVBhc3RlOiAodmlldywgZXZlbnQsIHNsaWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHZpZXdcbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgIGNvbnN0IHsgZW1wdHkgfSA9IHNlbGVjdGlvblxuXG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRleHRDb250ZW50ID0gJydcblxuICAgICAgICBzbGljZS5jb250ZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgdGV4dENvbnRlbnQgKz0gbm9kZS50ZXh0Q29udGVudFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGxpbmsgPSBmaW5kKHRleHRDb250ZW50KS5maW5kKGl0ZW0gPT4gaXRlbS5pc0xpbmsgJiYgaXRlbS52YWx1ZSA9PT0gdGV4dENvbnRlbnQpXG5cbiAgICAgICAgaWYgKCF0ZXh0Q29udGVudCB8fCAhbGluaykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvaHRtbCcpXG5cbiAgICAgICAgY29uc3QgaHJlZlJlZ2V4ID0gL2hyZWY9XCIoW15cIl0qKVwiL1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nTGluayA9IGh0bWw/Lm1hdGNoKGhyZWZSZWdleClcblxuICAgICAgICBjb25zdCB1cmwgPSBleGlzdGluZ0xpbmsgPyBleGlzdGluZ0xpbmtbMV0gOiBsaW5rLmhyZWZcblxuICAgICAgICBvcHRpb25zLmVkaXRvci5jb21tYW5kcy5zZXRNYXJrKG9wdGlvbnMudHlwZSwge1xuICAgICAgICAgIGhyZWY6IHVybCxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICB9LFxuICB9KVxufVxuIiwgImltcG9ydCB7IE1hcmssIG1hcmtQYXN0ZVJ1bGUsIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgeyBmaW5kLCByZWdpc3RlckN1c3RvbVByb3RvY29sLCByZXNldCB9IGZyb20gJ2xpbmtpZnlqcydcblxuaW1wb3J0IHsgYXV0b2xpbmsgfSBmcm9tICcuL2hlbHBlcnMvYXV0b2xpbmsuanMnXG5pbXBvcnQgeyBjbGlja0hhbmRsZXIgfSBmcm9tICcuL2hlbHBlcnMvY2xpY2tIYW5kbGVyLmpzJ1xuaW1wb3J0IHsgcGFzdGVIYW5kbGVyIH0gZnJvbSAnLi9oZWxwZXJzL3Bhc3RlSGFuZGxlci5qcydcblxuZXhwb3J0IGludGVyZmFjZSBMaW5rUHJvdG9jb2xPcHRpb25zIHtcbiAgc2NoZW1lOiBzdHJpbmc7XG4gIG9wdGlvbmFsU2xhc2hlcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09wdGlvbnMge1xuICAvKipcbiAgICogSWYgZW5hYmxlZCwgaXQgYWRkcyBsaW5rcyBhcyB5b3UgdHlwZS5cbiAgICovXG4gIGF1dG9saW5rOiBib29sZWFuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjdXN0b20gcHJvdG9jb2xzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBsaW5raWZ5anMuXG4gICAqL1xuICBwcm90b2NvbHM6IEFycmF5PExpbmtQcm90b2NvbE9wdGlvbnMgfCBzdHJpbmc+XG4gIC8qKlxuICAgKiBJZiBlbmFibGVkLCBsaW5rcyB3aWxsIGJlIG9wZW5lZCBvbiBjbGljay5cbiAgICovXG4gIG9wZW5PbkNsaWNrOiBib29sZWFuXG4gIC8qKlxuICAgKiBBZGRzIGEgbGluayB0byB0aGUgY3VycmVudCBzZWxlY3Rpb24gaWYgdGhlIHBhc3RlZCBjb250ZW50IG9ubHkgY29udGFpbnMgYW4gdXJsLlxuICAgKi9cbiAgbGlua09uUGFzdGU6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBIVE1MIGF0dHJpYnV0ZXMgdG8gYmUgcmVuZGVyZWQuXG4gICAqL1xuICBIVE1MQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgYW55PlxuICAvKipcbiAgICogQSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgbW9kaWZpZXMgbGluayB2ZXJpZmljYXRpb24gZm9yIHRoZSBhdXRvIGxpbmtlci5cbiAgICogQHBhcmFtIHVybCAtIFRoZSB1cmwgdG8gYmUgdmFsaWRhdGVkLlxuICAgKiBAcmV0dXJucyAtIFRydWUgaWYgdGhlIHVybCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgdmFsaWRhdGU/OiAodXJsOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGxpbms6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgbGluayBtYXJrXG4gICAgICAgKi9cbiAgICAgIHNldExpbms6IChhdHRyaWJ1dGVzOiB7IGhyZWY6IHN0cmluZzsgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbDsgcmVsPzogc3RyaW5nIHwgbnVsbDsgY2xhc3M/OiBzdHJpbmcgfCBudWxsIH0pID0+IFJldHVyblR5cGVcbiAgICAgIC8qKlxuICAgICAgICogVG9nZ2xlIGEgbGluayBtYXJrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUxpbms6IChhdHRyaWJ1dGVzOiB7IGhyZWY6IHN0cmluZzsgdGFyZ2V0Pzogc3RyaW5nIHwgbnVsbDsgcmVsPzogc3RyaW5nIHwgbnVsbDsgY2xhc3M/OiBzdHJpbmcgfCBudWxsIH0pID0+IFJldHVyblR5cGVcbiAgICAgIC8qKlxuICAgICAgICogVW5zZXQgYSBsaW5rIG1hcmtcbiAgICAgICAqL1xuICAgICAgdW5zZXRMaW5rOiAoKSA9PiBSZXR1cm5UeXBlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBMaW5rID0gTWFyay5jcmVhdGU8TGlua09wdGlvbnM+KHtcbiAgbmFtZTogJ2xpbmsnLFxuXG4gIHByaW9yaXR5OiAxMDAwLFxuXG4gIGtlZXBPblNwbGl0OiBmYWxzZSxcblxuICBvbkNyZWF0ZSgpIHtcbiAgICB0aGlzLm9wdGlvbnMucHJvdG9jb2xzLmZvckVhY2gocHJvdG9jb2wgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBwcm90b2NvbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVnaXN0ZXJDdXN0b21Qcm90b2NvbChwcm90b2NvbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICByZWdpc3RlckN1c3RvbVByb3RvY29sKHByb3RvY29sLnNjaGVtZSwgcHJvdG9jb2wub3B0aW9uYWxTbGFzaGVzKVxuICAgIH0pXG4gIH0sXG5cbiAgb25EZXN0cm95KCkge1xuICAgIHJlc2V0KClcbiAgfSxcblxuICBpbmNsdXNpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hdXRvbGlua1xuICB9LFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5PbkNsaWNrOiB0cnVlLFxuICAgICAgbGlua09uUGFzdGU6IHRydWUsXG4gICAgICBhdXRvbGluazogdHJ1ZSxcbiAgICAgIHByb3RvY29sczogW10sXG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICB0YXJnZXQ6ICdfYmxhbmsnLFxuICAgICAgICByZWw6ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JyxcbiAgICAgICAgY2xhc3M6IG51bGwsXG4gICAgICB9LFxuICAgICAgdmFsaWRhdGU6IHVuZGVmaW5lZCxcbiAgICB9XG4gIH0sXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaHJlZjoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHRhcmdldDoge1xuICAgICAgICBkZWZhdWx0OiB0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMudGFyZ2V0LFxuICAgICAgfSxcbiAgICAgIHJlbDoge1xuICAgICAgICBkZWZhdWx0OiB0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMucmVsLFxuICAgICAgfSxcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcy5jbGFzcyxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW3sgdGFnOiAnYVtocmVmXTpub3QoW2hyZWYgKj0gXCJqYXZhc2NyaXB0OlwiIGldKScgfV1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIC8vIEZhbHNlIHBvc2l0aXZlOyB3ZSdyZSBleHBsaWNpdGx5IGNoZWNraW5nIGZvciBqYXZhc2NyaXB0OiBsaW5rcyB0byBpZ25vcmUgdGhlbVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zY3JpcHQtdXJsXG4gICAgaWYgKEhUTUxBdHRyaWJ1dGVzLmhyZWY/LnN0YXJ0c1dpdGgoJ2phdmFzY3JpcHQ6JykpIHtcbiAgICAgIC8vIHN0cmlwIG91dCB0aGUgaHJlZlxuICAgICAgcmV0dXJuIFsnYScsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIHsgLi4uSFRNTEF0dHJpYnV0ZXMsIGhyZWY6ICcnIH0pLCAwXVxuICAgIH1cbiAgICByZXR1cm4gWydhJywgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRMaW5rOlxuICAgICAgICBhdHRyaWJ1dGVzID0+ICh7IGNoYWluIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY2hhaW4oKS5zZXRNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcykuc2V0TWV0YSgncHJldmVudEF1dG9saW5rJywgdHJ1ZSkucnVuKClcbiAgICAgICAgfSxcblxuICAgICAgdG9nZ2xlTGluazpcbiAgICAgICAgYXR0cmlidXRlcyA9PiAoeyBjaGFpbiB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKClcbiAgICAgICAgICAgIC50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcywgeyBleHRlbmRFbXB0eU1hcmtSYW5nZTogdHJ1ZSB9KVxuICAgICAgICAgICAgLnNldE1ldGEoJ3ByZXZlbnRBdXRvbGluaycsIHRydWUpXG4gICAgICAgICAgICAucnVuKClcbiAgICAgICAgfSxcblxuICAgICAgdW5zZXRMaW5rOlxuICAgICAgICAoKSA9PiAoeyBjaGFpbiB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoYWluKClcbiAgICAgICAgICAgIC51bnNldE1hcmsodGhpcy5uYW1lLCB7IGV4dGVuZEVtcHR5TWFya1JhbmdlOiB0cnVlIH0pXG4gICAgICAgICAgICAuc2V0TWV0YSgncHJldmVudEF1dG9saW5rJywgdHJ1ZSlcbiAgICAgICAgICAgIC5ydW4oKVxuICAgICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRQYXN0ZVJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtYXJrUGFzdGVSdWxlKHtcbiAgICAgICAgZmluZDogdGV4dCA9PiBmaW5kKHRleHQpXG4gICAgICAgICAgLmZpbHRlcihsaW5rID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy52YWxpZGF0ZShsaW5rLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihsaW5rID0+IGxpbmsuaXNMaW5rKVxuICAgICAgICAgIC5tYXAobGluayA9PiAoe1xuICAgICAgICAgICAgdGV4dDogbGluay52YWx1ZSxcbiAgICAgICAgICAgIGluZGV4OiBsaW5rLnN0YXJ0LFxuICAgICAgICAgICAgZGF0YTogbGluayxcbiAgICAgICAgICB9KSksXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgZ2V0QXR0cmlidXRlczogKG1hdGNoLCBwYXN0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IHBhc3RlRXZlbnQ/LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvaHRtbCcpXG4gICAgICAgICAgY29uc3QgaHJlZlJlZ2V4ID0gL2hyZWY9XCIoW15cIl0qKVwiL1xuXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdMaW5rID0gaHRtbD8ubWF0Y2goaHJlZlJlZ2V4KVxuXG4gICAgICAgICAgaWYgKGV4aXN0aW5nTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaHJlZjogZXhpc3RpbmdMaW5rWzFdLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBocmVmOiBtYXRjaC5kYXRhPy5ocmVmLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvbGluaykge1xuICAgICAgcGx1Z2lucy5wdXNoKFxuICAgICAgICBhdXRvbGluayh7XG4gICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgIHZhbGlkYXRlOiB0aGlzLm9wdGlvbnMudmFsaWRhdGUsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3Blbk9uQ2xpY2spIHtcbiAgICAgIHBsdWdpbnMucHVzaChcbiAgICAgICAgY2xpY2tIYW5kbGVyKHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubGlua09uUGFzdGUpIHtcbiAgICAgIHBsdWdpbnMucHVzaChcbiAgICAgICAgcGFzdGVIYW5kbGVyKHtcbiAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBsdWdpbnNcbiAgfSxcbn0pXG4iLCAiaW1wb3J0IExpbmsgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWxpbmtcIjtcblxuZXhwb3J0IGNvbnN0IEN1c3RvbUxpbmsgPSBMaW5rLmV4dGVuZCh7XG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5PbkNsaWNrOiB0cnVlLFxuICAgICAgbGlua09uUGFzdGU6IHRydWUsXG4gICAgICBhdXRvbGluazogdHJ1ZSxcbiAgICAgIHByb3RvY29sczogW10sXG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgICB2YWxpZGF0ZTogdW5kZWZpbmVkLFxuICAgIH07XG4gIH0sXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaHJlZjoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGlkOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0OiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcy50YXJnZXQsXG4gICAgICB9LFxuICAgICAgaHJlZmxhbmc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICByZWw6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICByZWZlcnJlcnBvbGljeToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYXNfYnV0dG9uOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1hcy1idXR0b24nKSxcbiAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdkYXRhLWFzLWJ1dHRvbic6IGF0dHJpYnV0ZXMuYXNfYnV0dG9uLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGJ1dHRvbl90aGVtZToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXMtYnV0dG9uLXRoZW1lJyksXG4gICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnZGF0YS1hcy1idXR0b24tdGhlbWUnOiBhdHRyaWJ1dGVzLmJ1dHRvbl90aGVtZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIG1lcmdlQXR0cmlidXRlcyxcbiAgTm9kZSxcbiAgbm9kZUlucHV0UnVsZSxcbn0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlT3B0aW9ucyB7XG4gIGlubGluZTogYm9vbGVhbixcbiAgYWxsb3dCYXNlNjQ6IGJvb2xlYW4sXG4gIEhUTUxBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxufVxuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgaW1hZ2U6IHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGltYWdlXG4gICAgICAgKi9cbiAgICAgIHNldEltYWdlOiAob3B0aW9uczogeyBzcmM6IHN0cmluZywgYWx0Pzogc3RyaW5nLCB0aXRsZT86IHN0cmluZyB9KSA9PiBSZXR1cm5UeXBlLFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaW5wdXRSZWdleCA9IC8oPzpefFxccykoIVxcWyguK3w6PyldXFwoKFxcUyspKD86KD86XFxzKylbXCInXShcXFMrKVtcIiddKT9cXCkpJC9cblxuZXhwb3J0IGNvbnN0IEltYWdlID0gTm9kZS5jcmVhdGU8SW1hZ2VPcHRpb25zPih7XG4gIG5hbWU6ICdpbWFnZScsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5saW5lOiBmYWxzZSxcbiAgICAgIGFsbG93QmFzZTY0OiBmYWxzZSxcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9XG4gIH0sXG5cbiAgaW5saW5lKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lXG4gIH0sXG5cbiAgZ3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmxpbmUgPyAnaW5saW5lJyA6ICdibG9jaydcbiAgfSxcblxuICBkcmFnZ2FibGU6IHRydWUsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3JjOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYWx0OiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IHRoaXMub3B0aW9ucy5hbGxvd0Jhc2U2NFxuICAgICAgICAgID8gJ2ltZ1tzcmNdJ1xuICAgICAgICAgIDogJ2ltZ1tzcmNdOm5vdChbc3JjXj1cImRhdGE6XCJdKScsXG4gICAgICB9LFxuICAgIF1cbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbJ2ltZycsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKV1cbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0SW1hZ2U6IG9wdGlvbnMgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudCh7XG4gICAgICAgICAgdHlwZTogdGhpcy5uYW1lLFxuICAgICAgICAgIGF0dHJzOiBvcHRpb25zLFxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkSW5wdXRSdWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgbm9kZUlucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IGlucHV0UmVnZXgsXG4gICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgZ2V0QXR0cmlidXRlczogbWF0Y2ggPT4ge1xuICAgICAgICAgIGNvbnN0IFssLCBhbHQsIHNyYywgdGl0bGVdID0gbWF0Y2hcblxuICAgICAgICAgIHJldHVybiB7IHNyYywgYWx0LCB0aXRsZSB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgImltcG9ydCBJbWFnZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24taW1hZ2VcIjtcblxuZXhwb3J0IGNvbnN0IEN1c3RvbUltYWdlID0gSW1hZ2UuZXh0ZW5kKHtcbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3JjOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgYWx0OiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIH0sXG4gICAgICB3aWR0aDoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGhlaWdodDoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxhenk6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdsb2FkaW5nJykgPT09ICdsYXp5JyA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWxhenknKSA6IG51bGwsXG4gICAgICAgIHJlbmRlckhUTUw6IChhdHRyaWJ1dGVzKSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZXMubGF6eSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgXCJkYXRhLWxhenlcIjogYXR0cmlidXRlcy5sYXp5LFxuICAgICAgICAgICAgICBcImxvYWRpbmdcIjogXCJsYXp5XCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgUGFyYWdyYXBoIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1wYXJhZ3JhcGhcIjtcblxuZXhwb3J0IGNvbnN0IEN1c3RvbVBhcmFncmFwaCA9IFBhcmFncmFwaC5leHRlbmQoe1xuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjbGFzczoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTWFyaywgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgU21hbGwgPSBNYXJrLmNyZWF0ZSh7XG4gIG5hbWU6IFwic21hbGxcIixcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcInNtYWxsXCIsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG5cbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gW1wic21hbGxcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0U21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMuc2V0TWFyayh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgdG9nZ2xlU21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudG9nZ2xlTWFyayh0aGlzLm5hbWUpO1xuICAgICAgICB9LFxuICAgICAgdW5zZXRTbWFsbDpcbiAgICAgICAgKCkgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbHVtbihjb2xUeXBlLCBjb2xDb250ZW50ID0gbnVsbCkge1xuICBpZiAoY29sQ29udGVudCkge1xuICAgIHJldHVybiBjb2xUeXBlLmNyZWF0ZUNoZWNrZWQobnVsbCwgY29sQ29udGVudCk7XG4gIH1cblxuICByZXR1cm4gY29sVHlwZS5jcmVhdGVBbmRGaWxsKCk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGdldEdyaWROb2RlVHlwZXMoc2NoZW1hKSB7XG4gIGlmIChzY2hlbWEuY2FjaGVkLmdyaWROb2RlVHlwZXMpIHtcbiAgICByZXR1cm4gc2NoZW1hLmNhY2hlZC5ncmlkTm9kZVR5cGVzO1xuICB9XG5cbiAgY29uc3Qgcm9sZXMgPSB7fTtcblxuICBPYmplY3Qua2V5cyhzY2hlbWEubm9kZXMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBjb25zdCBub2RlVHlwZSA9IHNjaGVtYS5ub2Rlc1t0eXBlXTtcblxuICAgIGlmIChub2RlVHlwZS5zcGVjLmdyaWRSb2xlKSB7XG4gICAgICByb2xlc1tub2RlVHlwZS5zcGVjLmdyaWRSb2xlXSA9IG5vZGVUeXBlO1xuICAgIH1cbiAgfSk7XG5cbiAgc2NoZW1hLmNhY2hlZC5ncmlkTm9kZVR5cGVzID0gcm9sZXM7XG5cbiAgcmV0dXJuIHJvbGVzO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbHVtbiB9IGZyb20gXCIuL2NyZWF0ZUNvbHVtblwiO1xuaW1wb3J0IHsgZ2V0R3JpZE5vZGVUeXBlcyB9IGZyb20gXCIuL2dldEdyaWROb2RlVHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdyaWQoc2NoZW1hLCBjb2xzQ291bnQsIHR5cGUsIGNvbENvbnRlbnQpIHtcbiAgY29uc3QgdHlwZXMgPSBnZXRHcmlkTm9kZVR5cGVzKHNjaGVtYSk7XG4gIGNvbnN0IGNvbHMgPSBbXTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sc0NvdW50OyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY29sID0gY3JlYXRlQ29sdW1uKHR5cGVzLmNvbHVtbiwgY29sQ29udGVudCk7XG5cbiAgICBpZiAoY29sKSB7XG4gICAgICBjb2xzLnB1c2goY29sKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHlwZXMuZ3JpZC5jcmVhdGVDaGVja2VkKHsgY29sczogY29sc0NvdW50LCB0eXBlOiB0eXBlIH0sIGNvbHMpO1xufVxuIiwgImltcG9ydCB7IGNhbGxPclJldHVybiwgZ2V0RXh0ZW5zaW9uRmllbGQsIE5vZGUsIG1lcmdlQXR0cmlidXRlcywgZmluZFBhcmVudE5vZGUsIGZpbmRDaGlsZHJlbiB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFRleHRTZWxlY3Rpb24gfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUdyaWQgfSBmcm9tIFwiLi91dGlscy9jcmVhdGVHcmlkXCI7XG5pbXBvcnQgeyBHYXBDdXJzb3IgfSBmcm9tIFwicHJvc2VtaXJyb3ItZ2FwY3Vyc29yXCI7XG5cbmV4cG9ydCBjb25zdCBHcmlkID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcImdyaWRcIixcblxuICBncm91cDogXCJibG9ja1wiLFxuXG4gIGRlZmluaW5nOiB0cnVlLFxuXG4gIGlzb2xhdGluZzogdHJ1ZSxcblxuICBhbGxvd0dhcEN1cnNvcjogZmFsc2UsXG5cbiAgY29udGVudDogXCJncmlkQ29sdW1uK1wiLFxuXG4gIGdyaWRSb2xlOiBcImdyaWRcIixcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtZ3JpZFwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgZGVmYXVsdDogXCJyZXNwb25zaXZlXCIsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSxcbiAgICAgIH0sXG4gICAgICBjb2xzOiB7XG4gICAgICAgIGRlZmF1bHQ6IDIsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29sc1wiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBnZXRBdHRyczogKG5vZGUpID0+IG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmlsYW1lbnQtdGlwdGFwLWdyaWRcIikgJiYgbnVsbCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJkaXZcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0R3JpZDpcbiAgICAgICAgKHsgY29scyA9IDMsIHR5cGUgPSBcInJlc3BvbnNpdmVcIiB9ID0ge30pID0+XG4gICAgICAgICh7IHRyLCBkaXNwYXRjaCwgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBub2RlID0gY3JlYXRlR3JpZChlZGl0b3Iuc2NoZW1hLCBjb2xzLCB0eXBlKTtcblxuICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHIuc2VsZWN0aW9uLmFuY2hvciArIDE7XG5cbiAgICAgICAgICAgIHRyLnJlcGxhY2VTZWxlY3Rpb25XaXRoKG5vZGUpXG4gICAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldygpXG4gICAgICAgICAgICAgIC5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKG9mZnNldCkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBcIk1vZC1BbHQtR1wiOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5pbnNlcnRHcmlkKCksXG4gICAgfTtcbiAgfSxcblxuICBleHRlbmROb2RlU2NoZW1hKGV4dGVuc2lvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBncmlkUm9sZTogY2FsbE9yUmV0dXJuKGdldEV4dGVuc2lvbkZpZWxkKGV4dGVuc2lvbiwgXCJncmlkUm9sZVwiLCBjb250ZXh0KSksXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IE5vZGUsIG1lcmdlQXR0cmlidXRlcyB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcblxuZXhwb3J0IGNvbnN0IEdyaWRDb2x1bW4gPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZ3JpZENvbHVtblwiLFxuICBjb250ZW50OiBcImJsb2NrK1wiLFxuICBncmlkUm9sZTogXCJjb2x1bW5cIixcbiAgaXNvbGF0aW5nOiB0cnVlLFxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtZ3JpZF9fY29sdW1uXCIsXG4gICAgICB9LFxuICAgIH07XG4gIH0sXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IFwiZGl2XCIsXG4gICAgICAgIGdldEF0dHJzOiAobm9kZSkgPT4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoXCJmaWxhbWVudC10aXB0YXAtZ3JpZF9fY29sdW1uXCIpICYmIG51bGwsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICB9LFxufSk7XG4iLCAiZXhwb3J0IGNvbnN0IGlzVmFsaWRZb3V0dWJlVXJsID0gKHVybCkgPT4ge1xuICByZXR1cm4gdXJsLm1hdGNoKC8oeW91dHViZVxcLmNvbXx5b3V0dVxcLmJlKSguKyk/JC8pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFlvdXR1YmVFbWJlZFVybCA9IChub2Nvb2tpZSA9IGZhbHNlKSA9PiB7XG4gIHJldHVybiBub2Nvb2tpZSA/IFwiaHR0cHM6Ly93d3cueW91dHViZS1ub2Nvb2tpZS5jb20vZW1iZWQvXCIgOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL1wiO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVtYmVkVVJMRnJvbVlvdXR1YmVVUkwgPSAob3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHVybCwgY29udHJvbHMsIG5vY29va2llLCBzdGFydEF0IH0gPSBvcHRpb25zO1xuXG4gIC8vIGlmIGlzIGFscmVhZHkgYW4gZW1iZWQgdXJsLCByZXR1cm4gaXRcbiAgaWYgKHVybC5pbmNsdWRlcyhcIi9lbWJlZC9cIikpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgLy8gaWYgaXMgYSB5b3V0dS5iZSB1cmwsIGdldCB0aGUgaWQgYWZ0ZXIgdGhlIC9cbiAgaWYgKHVybC5pbmNsdWRlcyhcInlvdXR1LmJlXCIpKSB7XG4gICAgY29uc3QgaWQgPSB1cmwuc3BsaXQoXCIvXCIpLnBvcCgpO1xuXG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBgJHtnZXRZb3V0dWJlRW1iZWRVcmwobm9jb29raWUpfSR7aWR9YDtcbiAgfVxuXG4gIGNvbnN0IHZpZGVvSWRSZWdleCA9IC92PShbLVxcd10rKS9nbTtcbiAgY29uc3QgbWF0Y2hlcyA9IHZpZGVvSWRSZWdleC5leGVjKHVybCk7XG5cbiAgaWYgKCFtYXRjaGVzIHx8ICFtYXRjaGVzWzFdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgb3V0cHV0VXJsID0gYCR7Z2V0WW91dHViZUVtYmVkVXJsKG5vY29va2llKX0ke21hdGNoZXNbMV19YDtcblxuICBjb25zdCBwYXJhbXMgPSBbXTtcblxuICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgcGFyYW1zLnB1c2goXCJjb250cm9scz0wXCIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmFtcy5wdXNoKFwiY29udHJvbHM9MVwiKTtcbiAgfVxuXG4gIGlmIChzdGFydEF0KSB7XG4gICAgcGFyYW1zLnB1c2goYHN0YXJ0PSR7c3RhcnRBdH1gKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgb3V0cHV0VXJsICs9IGA/JHtwYXJhbXMuam9pbihcIiZcIil9YDtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRVcmw7XG59O1xuIiwgImltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcblxuaW1wb3J0IHsgZ2V0RW1iZWRVUkxGcm9tWW91dHViZVVSTCwgaXNWYWxpZFlvdXR1YmVVcmwgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgWW91dHViZSA9IE5vZGUuY3JlYXRlKHtcbiAgbmFtZTogXCJ5b3V0dWJlXCIsXG5cbiAgc2VsZWN0YWJsZTogdHJ1ZSxcblxuICBkcmFnZ2FibGU6IHRydWUsXG5cbiAgYXRvbTogdHJ1ZSxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgd2lkdGg6IDY0MCxcbiAgICAgIGhlaWdodDogNDgwLFxuICAgIH07XG4gIH0sXG5cbiAgaW5saW5lKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lO1xuICB9LFxuXG4gIGdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgfSxcblxuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLFxuICAgICAgfSxcbiAgICAgIHNyYzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy53aWR0aCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiksXG4gICAgICB9LFxuICAgICAgcmVzcG9uc2l2ZToge1xuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInJlc3BvbnNpdmVcIikgPz8gZmFsc2UsXG4gICAgICB9LFxuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBjb250cm9sczoge1xuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIG5vY29va2llOiB7XG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC13aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0Jzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtYXNwZWN0LWhlaWdodFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdltkYXRhLXlvdXR1YmUtdmlkZW9dIGlmcmFtZVwiLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRZb3V0dWJlVmlkZW86XG4gICAgICAgIChvcHRpb25zKSA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1ZhbGlkWW91dHViZVVybChvcHRpb25zLnNyYykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbWJlZFVybCA9IGdldEVtYmVkVVJMRnJvbVlvdXR1YmVVUkwoe1xuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnNyYyxcbiAgICAgICAgICAgIGNvbnRyb2xzOiBvcHRpb25zLmNvbnRyb2xzLFxuICAgICAgICAgICAgbm9jb29raWU6IG9wdGlvbnMubm9jb29raWUsXG4gICAgICAgICAgICBzdGFydEF0OiBvcHRpb25zLnN0YXJ0IHx8IDAsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudCh7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICBzcmM6IGVtYmVkVXJsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgY29uc3QgZW1iZWRVcmwgPSBnZXRFbWJlZFVSTEZyb21Zb3V0dWJlVVJMKHtcbiAgICAgIHVybDogSFRNTEF0dHJpYnV0ZXMuc3JjLFxuICAgICAgY29udHJvbHM6IEhUTUxBdHRyaWJ1dGVzLmNvbnRyb2xzLFxuICAgICAgbm9jb29raWU6IEhUTUxBdHRyaWJ1dGVzLm5vY29va2llLFxuICAgICAgc3RhcnRBdDogSFRNTEF0dHJpYnV0ZXMuc3RhcnQgfHwgMCxcbiAgICB9KTtcblxuICAgIHJldHVybiBbXG4gICAgICBcImRpdlwiLFxuICAgICAge1xuICAgICAgICBcImRhdGEteW91dHViZS12aWRlb1wiOiBcIlwiLFxuICAgICAgICBjbGFzczogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IFwicmVzcG9uc2l2ZVwiIDogbnVsbFxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgXCJpZnJhbWVcIixcbiAgICAgICAge1xuICAgICAgICAgIHNyYzogZW1iZWRVcmwsXG4gICAgICAgICAgd2lkdGg6IEhUTUxBdHRyaWJ1dGVzLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogSFRNTEF0dHJpYnV0ZXMuaGVpZ2h0LFxuICAgICAgICAgIGFsbG93ZnVsbHNjcmVlbjogdGhpcy5vcHRpb25zLmFsbG93RnVsbHNjcmVlbixcbiAgICAgICAgICBzdHlsZTogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IGBhc3BlY3QtcmF0aW86ICR7SFRNTEF0dHJpYnV0ZXNbJ2RhdGEtYXNwZWN0LXdpZHRoJ119IC8gJHtIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3QtaGVpZ2h0J119OyB3aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvO2AgOiBudWxsLFxuICAgICAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXSA6IG51bGwsXG4gICAgICAgICAgJ2RhdGEtYXNwZWN0LWhlaWdodCc6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3QtaGVpZ2h0J10gOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuICB9LFxufSk7XG4iLCAiZXhwb3J0IGNvbnN0IGlzVmFsaWRWaW1lb1VybCA9ICh1cmwpID0+IHtcbiAgcmV0dXJuIHVybC5tYXRjaCgvKHZpbWVvXFwuY29tKSguKyk/JC8pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVtYmVkVVJMRnJvbVZpbWVvVVJMID0gKG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyB1cmwsIGF1dG9wbGF5LCBsb29wLCB0aXRsZSwgYnlsaW5lLCBwb3J0cmFpdCB9ID0gb3B0aW9ucztcblxuICAvLyBpZiBpcyBhbHJlYWR5IGFuIGVtYmVkIHVybCwgcmV0dXJuIGl0XG4gIGlmICh1cmwuaW5jbHVkZXMoXCIvdmlkZW8vXCIpKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIGNvbnN0IHZpZGVvSWRSZWdleCA9IC9cXC5jb21cXC8oWzAtOV0rKS9nbTtcbiAgY29uc3QgbWF0Y2hlcyA9IHZpZGVvSWRSZWdleC5leGVjKHVybCk7XG5cbiAgaWYgKCFtYXRjaGVzIHx8ICFtYXRjaGVzWzFdKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgb3V0cHV0VXJsID0gYGh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8ke21hdGNoZXNbMV19YDtcblxuICBjb25zdCBwYXJhbXMgPSBbYGF1dG9wbGF5PSR7YXV0b3BsYXl9YCwgYGxvb3A9JHtsb29wfWAsIGB0aXRsZT0ke3RpdGxlfWAsIGBieWxpbmU9JHtieWxpbmV9YCwgYHBvcnRyYWl0PSR7cG9ydHJhaXR9YF07XG5cbiAgb3V0cHV0VXJsICs9IGA/JHtwYXJhbXMuam9pbihcIiZcIil9YDtcblxuICByZXR1cm4gb3V0cHV0VXJsO1xufTtcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBnZXRFbWJlZFVSTEZyb21WaW1lb1VSTCwgaXNWYWxpZFZpbWVvVXJsIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7Z2V0RW1iZWRVUkxGcm9tWW91dHViZVVSTH0gZnJvbSBcIi4uL1lvdXR1YmUvdXRpbHMuanNcIjtcblxuZXhwb3J0IGNvbnN0IFZpbWVvID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcInZpbWVvXCIsXG5cbiAgc2VsZWN0YWJsZTogdHJ1ZSxcblxuICBkcmFnZ2FibGU6IHRydWUsXG5cbiAgYXRvbTogdHJ1ZSxcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgYWxsb3dGdWxsc2NyZWVuOiB0cnVlLFxuICAgICAgd2lkdGg6IDY0MCxcbiAgICAgIGhlaWdodDogNDgwLFxuICAgIH07XG4gIH0sXG5cbiAgaW5saW5lKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lO1xuICB9LFxuXG4gIGdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5saW5lID8gXCJpbmxpbmVcIiA6IFwiYmxvY2tcIjtcbiAgfSxcblxuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLFxuICAgICAgfSxcbiAgICAgIHNyYzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiB7XG4gICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy53aWR0aCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiksXG4gICAgICB9LFxuICAgICAgYXV0b3BsYXk6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBsb29wOiB7XG4gICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBieWxpbmU6IHtcbiAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgIH0sXG4gICAgICBwb3J0cmFpdDoge1xuICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgfSxcbiAgICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJyZXNwb25zaXZlXCIpID8/IGZhbHNlLFxuICAgICAgfSxcbiAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC13aWR0aFwiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0Jzoge1xuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtYXNwZWN0LWhlaWdodFwiKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdltkYXRhLXZpbWVvLXZpZGVvXSBpZnJhbWVcIixcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2V0VmltZW9WaWRlbzpcbiAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICBpZiAoIWlzVmFsaWRWaW1lb1VybChvcHRpb25zLnNyYykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbWJlZFVybCA9IGdldEVtYmVkVVJMRnJvbVZpbWVvVVJMKHtcbiAgICAgICAgICAgIHVybDogb3B0aW9ucy5zcmMsXG4gICAgICAgICAgICBhdXRvcGxheTogb3B0aW9ucz8uYXV0b3BsYXkgfHwgMCxcbiAgICAgICAgICAgIGxvb3A6IG9wdGlvbnM/Lmxvb3AgfHwgMCxcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSB8fCAwLFxuICAgICAgICAgICAgYnlsaW5lOiBvcHRpb25zPy5ieWxpbmUgfHwgMCxcbiAgICAgICAgICAgIHBvcnRyYWl0OiBvcHRpb25zPy5wb3J0cmFpdCB8fCAwLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLmluc2VydENvbnRlbnQoe1xuICAgICAgICAgICAgdHlwZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgc3JjOiBlbWJlZFVybCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIGNvbnN0IGVtYmVkVXJsID0gZ2V0RW1iZWRVUkxGcm9tVmltZW9VUkwoe1xuICAgICAgdXJsOiBIVE1MQXR0cmlidXRlcy5zcmMsXG4gICAgICBhdXRvcGxheTogSFRNTEF0dHJpYnV0ZXM/LmF1dG9wbGF5IHx8IDAsXG4gICAgICBsb29wOiBIVE1MQXR0cmlidXRlcz8ubG9vcCB8fCAwLFxuICAgICAgdGl0bGU6IEhUTUxBdHRyaWJ1dGVzPy50aXRsZSB8fCAwLFxuICAgICAgYnlsaW5lOiBIVE1MQXR0cmlidXRlcz8uYnlsaW5lIHx8IDAsXG4gICAgICBwb3J0cmFpdDogSFRNTEF0dHJpYnV0ZXM/LnBvcnRyYWl0IHx8IDAsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHsgXCJkYXRhLXZpbWVvLXZpZGVvXCI6IFwiXCIsIGNsYXNzOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gXCJyZXNwb25zaXZlXCIgOiBudWxsIH0sXG4gICAgICBbXG4gICAgICAgIFwiaWZyYW1lXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzcmM6IGVtYmVkVXJsLFxuICAgICAgICAgIHdpZHRoOiBIVE1MQXR0cmlidXRlcy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IEhUTUxBdHRyaWJ1dGVzLmhlaWdodCxcbiAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW46IHRoaXMub3B0aW9ucy5hbGxvd2Z1bGxzY3JlZW4sXG4gICAgICAgICAgZnJhbWVib3JkZXI6IDAsXG4gICAgICAgICAgYWxsb3c6IFwiYXV0b3BsYXk7IGZ1bGxzY3JlZW47IHBpY3R1cmUtaW4tcGljdHVyZVwiLFxuICAgICAgICAgIHN0eWxlOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gYGFzcGVjdC1yYXRpbzogJHtIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXX0gLyAke0hUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC1oZWlnaHQnXX07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87YCA6IG51bGwsXG4gICAgICAgICAgJ2RhdGEtYXNwZWN0LXdpZHRoJzogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IEhUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC13aWR0aCddIDogbnVsbCxcbiAgICAgICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0JzogSFRNTEF0dHJpYnV0ZXMucmVzcG9uc2l2ZSA/IEhUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC1oZWlnaHQnXSA6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5cbmV4cG9ydCBjb25zdCBWaWRlbyA9IE5vZGUuY3JlYXRlKHtcbiAgICBuYW1lOiBcInZpZGVvXCIsXG5cbiAgICBzZWxlY3RhYmxlOiB0cnVlLFxuXG4gICAgZHJhZ2dhYmxlOiB0cnVlLFxuXG4gICAgYXRvbTogdHJ1ZSxcblxuICAgIGlubGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pbmxpbmU7XG4gICAgfSxcblxuICAgIGdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmlubGluZSA/IFwiaW5saW5lXCIgOiBcImJsb2NrXCI7XG4gICAgfSxcblxuICAgIGFkZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICBhdXRvcGxheTogbnVsbCxcbiAgICAgICAgICAgICAgICBjb250cm9sczogbnVsbCxcbiAgICAgICAgICAgICAgICBsb29wOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgYWRkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmVzcG9uc2l2ZVwiKSA/PyBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzcmM6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLndpZHRoLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwid2lkdGhcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVpZ2h0OiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhpcy5vcHRpb25zLmhlaWdodCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImhlaWdodFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRvcGxheToge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhdXRvcGxheVwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250cm9sczoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250cm9sc1wiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb29wOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImxvb3BcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RhdGEtYXNwZWN0LXdpZHRoJzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC13aWR0aFwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGF0YS1hc3BlY3QtaGVpZ2h0Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFzcGVjdC1oZWlnaHRcIiksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBwYXJzZUhUTUwoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGFnOiBcImRpdltkYXRhLW5hdGl2ZS12aWRlb10gdmlkZW9cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfSxcblxuICAgIGFkZENvbW1hbmRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0VmlkZW86XG4gICAgICAgICAgICAgICAgKG9wdGlvbnMpID0+XG4gICAgICAgICAgICAgICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kcy5pbnNlcnRDb250ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7IFwiZGF0YS1uYXRpdmUtdmlkZW9cIjogXCJcIiwgY2xhc3M6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBcInJlc3BvbnNpdmVcIiA6IG51bGwgfSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBcInZpZGVvXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzcmM6IEhUTUxBdHRyaWJ1dGVzLnNyYyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IEhUTUxBdHRyaWJ1dGVzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IEhUTUxBdHRyaWJ1dGVzLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b3BsYXk6IEhUTUxBdHRyaWJ1dGVzLmF1dG9wbGF5ID8gJ3RydWUnIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHM6IEhUTUxBdHRyaWJ1dGVzLmNvbnRyb2xzID8gJ3RydWUnIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbG9vcDogSFRNTEF0dHJpYnV0ZXMubG9vcCA/ICd0cnVlJyA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gYGFzcGVjdC1yYXRpbzogJHtIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXX0gLyAke0hUTUxBdHRyaWJ1dGVzWydkYXRhLWFzcGVjdC1oZWlnaHQnXX07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IEhUTUxBdHRyaWJ1dGVzLnJlc3BvbnNpdmUgPyBIVE1MQXR0cmlidXRlc1snZGF0YS1hc3BlY3Qtd2lkdGgnXSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC1oZWlnaHQnOiBIVE1MQXR0cmlidXRlcy5yZXNwb25zaXZlID8gSFRNTEF0dHJpYnV0ZXNbJ2RhdGEtYXNwZWN0LWhlaWdodCddIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgXTtcbiAgICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZmluZFBhcmVudE5vZGUsIGZpbmRDaGlsZHJlbiwgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzLCBkZWZhdWx0QmxvY2tBdCwgaXNBY3RpdmUgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb24sIFBsdWdpbiwgUGx1Z2luS2V5LCBUZXh0U2VsZWN0aW9uIH0gZnJvbSBcInByb3NlbWlycm9yLXN0YXRlXCI7XG5pbXBvcnQgeyBpc05vZGVWaXNpYmxlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjb25zdCBEZXRhaWxzID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcImRldGFpbHNcIixcblxuICBjb250ZW50OiBcImRldGFpbHNTdW1tYXJ5IGRldGFpbHNDb250ZW50XCIsXG5cbiAgZ3JvdXA6IFwiYmxvY2tcIixcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgYWxsb3dHYXBDdXJzb3I6IGZhbHNlLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IFwiZGV0YWlsc1wiLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRldGFpbHNcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcblxuICBhZGROb2RlVmlldygpIHtcbiAgICByZXR1cm4gKHsgZWRpdG9yLCBnZXRQb3MsIG5vZGUsIEhUTUxBdHRyaWJ1dGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzLCB7XG4gICAgICAgIFwiZGF0YS10eXBlXCI6IHRoaXMubmFtZSxcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBkb20uc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZG9tLFxuICAgICAgICBjb250ZW50RE9NOiBkb20sXG4gICAgICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICFkb20uY29udGFpbnMobXV0YXRpb24udGFyZ2V0KSB8fCBkb20gPT09IG11dGF0aW9uLnRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlOiAodXBkYXRlZE5vZGUpID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlZE5vZGUudHlwZSAhPT0gdGhpcy50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9O1xuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXREZXRhaWxzOlxuICAgICAgICAoKSA9PlxuICAgICAgICAoeyBzdGF0ZSwgY2hhaW4gfSkgPT4ge1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICBjb25zdCB7IHNjaGVtYSwgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHNlbGVjdGlvbjtcbiAgICAgICAgICBjb25zdCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKTtcbiAgICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNsaWNlID0gc3RhdGUuZG9jLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gc2NoZW1hLm5vZGVzLmRldGFpbHNDb250ZW50LmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KHNsaWNlLmNvbnRlbnQpO1xuICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gKChfYSA9IHNsaWNlLnRvSlNPTigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGVudCkgfHwgW107XG5cbiAgICAgICAgICByZXR1cm4gY2hhaW4oKVxuICAgICAgICAgICAgLmluc2VydENvbnRlbnRBdCh7IGZyb206IHJhbmdlLnN0YXJ0LCB0bzogcmFuZ2UuZW5kIH0sIHsgdHlwZTogdGhpcy5uYW1lLCBjb250ZW50OiBbeyB0eXBlOiBcImRldGFpbHNTdW1tYXJ5XCIgfSwgeyB0eXBlOiBcImRldGFpbHNDb250ZW50XCIsIGNvbnRlbnQgfV0gfSlcbiAgICAgICAgICAgIC5zZXRUZXh0U2VsZWN0aW9uKHJhbmdlLnN0YXJ0ICsgMilcbiAgICAgICAgICAgIC5ydW4oKTtcbiAgICAgICAgfSxcbiAgICAgIHVuc2V0RGV0YWlsczpcbiAgICAgICAgKCkgPT5cbiAgICAgICAgKHsgc3RhdGUsIGNoYWluIH0pID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiwgc2NoZW1hIH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZmluZFBhcmVudE5vZGUoKG5vZGUpID0+IG5vZGUudHlwZSA9PT0gdGhpcy50eXBlKShzZWxlY3Rpb24pO1xuICAgICAgICAgIGlmICghZGV0YWlscykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkZXRhaWxzU3VtbWFyaWVzID0gZmluZENoaWxkcmVuKGRldGFpbHMubm9kZSwgKG5vZGUpID0+IG5vZGUudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmRldGFpbHNTdW1tYXJ5KTtcbiAgICAgICAgICBjb25zdCBkZXRhaWxzQ29udGVudHMgPSBmaW5kQ2hpbGRyZW4oZGV0YWlscy5ub2RlLCAobm9kZSkgPT4gbm9kZS50eXBlID09PSBzY2hlbWEubm9kZXMuZGV0YWlsc0NvbnRlbnQpO1xuICAgICAgICAgIGlmICghZGV0YWlsc1N1bW1hcmllcy5sZW5ndGggfHwgIWRldGFpbHNDb250ZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGV0YWlsc1N1bW1hcnkgPSBkZXRhaWxzU3VtbWFyaWVzWzBdO1xuICAgICAgICAgIGNvbnN0IGRldGFpbHNDb250ZW50ID0gZGV0YWlsc0NvbnRlbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGZyb20gPSBkZXRhaWxzLnBvcztcbiAgICAgICAgICBjb25zdCAkZnJvbSA9IHN0YXRlLmRvYy5yZXNvbHZlKGZyb20pO1xuICAgICAgICAgIGNvbnN0IHRvID0gZnJvbSArIGRldGFpbHMubm9kZS5ub2RlU2l6ZTtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IHsgZnJvbSwgdG8gfTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZGV0YWlsc0NvbnRlbnQubm9kZS5jb250ZW50LnRvSlNPTigpIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRUeXBlRm9yU3VtbWFyeSA9ICRmcm9tLnBhcmVudC50eXBlLmNvbnRlbnRNYXRjaC5kZWZhdWx0VHlwZTtcbiAgICAgICAgICAvLyBUT0RPOiB0aGlzIG1heSBicmVhayBmb3Igc29tZSBjdXN0b20gc2NoZW1hc1xuICAgICAgICAgIGNvbnN0IHN1bW1hcnlDb250ZW50ID0gZGVmYXVsdFR5cGVGb3JTdW1tYXJ5ID09PSBudWxsIHx8IGRlZmF1bHRUeXBlRm9yU3VtbWFyeSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVmYXVsdFR5cGVGb3JTdW1tYXJ5LmNyZWF0ZShudWxsLCBkZXRhaWxzU3VtbWFyeS5ub2RlLmNvbnRlbnQpLnRvSlNPTigpO1xuICAgICAgICAgIGNvbnN0IG1lcmdlZENvbnRlbnQgPSBbc3VtbWFyeUNvbnRlbnQsIC4uLmNvbnRlbnRdO1xuICAgICAgICAgIHJldHVybiBjaGFpbigpXG4gICAgICAgICAgICAuaW5zZXJ0Q29udGVudEF0KHJhbmdlLCBtZXJnZWRDb250ZW50KVxuICAgICAgICAgICAgLnNldFRleHRTZWxlY3Rpb24oZnJvbSArIDEpXG4gICAgICAgICAgICAucnVuKCk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQmFja3NwYWNlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2NoZW1hLCBzZWxlY3Rpb24gfSA9IHRoaXMuZWRpdG9yLnN0YXRlO1xuICAgICAgICBjb25zdCB7IGVtcHR5LCAkYW5jaG9yIH0gPSBzZWxlY3Rpb247XG4gICAgICAgIGlmICghZW1wdHkgfHwgJGFuY2hvci5wYXJlbnQudHlwZSAhPT0gc2NoZW1hLm5vZGVzLmRldGFpbHNTdW1tYXJ5KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvciBzb21lIHJlYXNvbiBzYWZhcmkgcmVtb3ZlcyB0aGUgd2hvbGUgdGV4dCBjb250ZW50IHdpdGhpbiBhIGA8c3VtbWFyeT5gdGFnIG9uIGJhY2tzcGFjZVxuICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgdGV4dCBtYW51YWxseVxuICAgICAgICAvLyBzZWU6IGh0dHBzOi8vZGlzY3Vzcy5wcm9zZW1pcnJvci5uZXQvdC9zYWZhcmktYmFja3NwYWNlLWJ1Zy13aXRoLWRldGFpbHMtdGFnLzQyMjNcbiAgICAgICAgaWYgKCRhbmNob3IucGFyZW50T2Zmc2V0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmNvbW1hbmQoKHsgdHIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJvbSA9ICRhbmNob3IucG9zIC0gMTtcbiAgICAgICAgICAgIGNvbnN0IHRvID0gJGFuY2hvci5wb3M7XG4gICAgICAgICAgICB0ci5kZWxldGUoZnJvbSwgdG8pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLnVuc2V0RGV0YWlscygpO1xuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgRGV0YWlsc1N1bW1hcnkgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZGV0YWlsc1N1bW1hcnlcIixcbiAgY29udGVudDogXCJ0ZXh0KlwiLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgc2VsZWN0YWJsZTogZmFsc2UsXG4gIGlzb2xhdGluZzogdHJ1ZSxcbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHt9LFxuICAgIH07XG4gIH0sXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IFwic3VtbWFyeVwiLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJzdW1tYXJ5XCIsIG1lcmdlQXR0cmlidXRlcyh0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKSwgMF07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBOb2RlLCBtZXJnZUF0dHJpYnV0ZXMsIGZpbmRQYXJlbnROb2RlLCBkZWZhdWx0QmxvY2tBdCB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gXCJwcm9zZW1pcnJvci1zdGF0ZVwiO1xuXG5leHBvcnQgY29uc3QgRGV0YWlsc0NvbnRlbnQgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZGV0YWlsc0NvbnRlbnRcIixcblxuICBjb250ZW50OiBcImJsb2NrK1wiLFxuXG4gIGRlZmluaW5nOiB0cnVlLFxuXG4gIHNlbGVjdGFibGU6IGZhbHNlLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6IGBkaXZbZGF0YS10eXBlPVwiZGV0YWlscy1jb250ZW50XCJdYCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcblxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJkaXZcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMsIHsgXCJkYXRhLXR5cGVcIjogXCJkZXRhaWxzLWNvbnRlbnRcIiB9KSwgMF07XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGFsbG93cyBkb3VibGUgZW50ZXIgdG8gZXhpdCBjb250ZW50IG5vZGVcbiAgICAgIEVudGVyOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXRlLCB2aWV3IH0gPSBlZGl0b3I7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgeyAkZnJvbSwgZW1wdHkgfSA9IHNlbGVjdGlvbjtcbiAgICAgICAgY29uc3QgZGV0YWlsc0NvbnRlbnQgPSBmaW5kUGFyZW50Tm9kZSgobm9kZSkgPT4gbm9kZS50eXBlID09PSB0aGlzLnR5cGUpKHNlbGVjdGlvbik7XG5cbiAgICAgICAgaWYgKCFlbXB0eSB8fCAhZGV0YWlsc0NvbnRlbnQgfHwgIWRldGFpbHNDb250ZW50Lm5vZGUuY2hpbGRDb3VudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZyb21JbmRleCA9ICRmcm9tLmluZGV4KGRldGFpbHNDb250ZW50LmRlcHRoKTtcbiAgICAgICAgY29uc3QgeyBjaGlsZENvdW50IH0gPSBkZXRhaWxzQ29udGVudC5ub2RlO1xuICAgICAgICBjb25zdCBpc0F0RW5kID0gY2hpbGRDb3VudCA9PT0gZnJvbUluZGV4ICsgMTtcblxuICAgICAgICBpZiAoIWlzQXRFbmQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0Q2hpbGRUeXBlID0gZGV0YWlsc0NvbnRlbnQubm9kZS50eXBlLmNvbnRlbnRNYXRjaC5kZWZhdWx0VHlwZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdENoaWxkTm9kZSA9IGRlZmF1bHRDaGlsZFR5cGUgPT09IG51bGwgfHwgZGVmYXVsdENoaWxkVHlwZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVmYXVsdENoaWxkVHlwZS5jcmVhdGVBbmRGaWxsKCk7XG5cbiAgICAgICAgaWYgKCFkZWZhdWx0Q2hpbGROb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJGNoaWxkUG9zID0gc3RhdGUuZG9jLnJlc29sdmUoZGV0YWlsc0NvbnRlbnQucG9zICsgMSk7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZEluZGV4ID0gY2hpbGRDb3VudCAtIDE7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZE5vZGUgPSBkZXRhaWxzQ29udGVudC5ub2RlLmNoaWxkKGxhc3RDaGlsZEluZGV4KTtcbiAgICAgICAgY29uc3QgbGFzdENoaWxkUG9zID0gJGNoaWxkUG9zLnBvc0F0SW5kZXgobGFzdENoaWxkSW5kZXgsIGRldGFpbHNDb250ZW50LmRlcHRoKTtcbiAgICAgICAgY29uc3QgbGFzdENoaWxkTm9kZUlzRW1wdHkgPSBsYXN0Q2hpbGROb2RlLmVxKGRlZmF1bHRDaGlsZE5vZGUpO1xuXG4gICAgICAgIGlmICghbGFzdENoaWxkTm9kZUlzRW1wdHkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhYm92ZSA9ICRmcm9tLm5vZGUoLTMpO1xuICAgICAgICBpZiAoIWFib3ZlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWZ0ZXIgPSAkZnJvbS5pbmRleEFmdGVyKC0zKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KGFib3ZlLmNvbnRlbnRNYXRjaEF0KGFmdGVyKSk7XG4gICAgICAgIGlmICghdHlwZSB8fCAhYWJvdmUuY2FuUmVwbGFjZVdpdGgoYWZ0ZXIsIGFmdGVyLCB0eXBlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0eXBlLmNyZWF0ZUFuZEZpbGwoKTtcblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgcG9zID0gJGZyb20uYWZ0ZXIoLTIpO1xuICAgICAgICB0ci5yZXBsYWNlV2l0aChwb3MsIHBvcywgbm9kZSk7XG4gICAgICAgIGNvbnN0ICRwb3MgPSB0ci5kb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBTZWxlY3Rpb24ubmVhcigkcG9zLCAxKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7XG4gICAgICAgIGNvbnN0IGRlbGV0ZUZyb20gPSBsYXN0Q2hpbGRQb3M7XG4gICAgICAgIGNvbnN0IGRlbGV0ZVRvID0gbGFzdENoaWxkUG9zICsgbGFzdENoaWxkTm9kZS5ub2RlU2l6ZTtcbiAgICAgICAgdHIuZGVsZXRlKGRlbGV0ZUZyb20sIGRlbGV0ZVRvKTtcbiAgICAgICAgdHIuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgbWVyZ2VBdHRyaWJ1dGVzLCBOb2RlLCB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXksIFRleHRTZWxlY3Rpb24gfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja09wdGlvbnMge1xuICAvKipcbiAgICogQWRkcyBhIHByZWZpeCB0byBsYW5ndWFnZSBjbGFzc2VzIHRoYXQgYXJlIGFwcGxpZWQgdG8gY29kZSB0YWdzLlxuICAgKiBEZWZhdWx0cyB0byBgJ2xhbmd1YWdlLSdgLlxuICAgKi9cbiAgbGFuZ3VhZ2VDbGFzc1ByZWZpeDogc3RyaW5nXG4gIC8qKlxuICAgKiBEZWZpbmUgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgZXhpdGVkIG9uIHRyaXBsZSBlbnRlci5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgZXhpdE9uVHJpcGxlRW50ZXI6IGJvb2xlYW5cbiAgLyoqXG4gICAqIERlZmluZSB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBleGl0ZWQgb24gYXJyb3cgZG93biBpZiB0aGVyZSBpcyBubyBub2RlIGFmdGVyIGl0LlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBleGl0T25BcnJvd0Rvd246IGJvb2xlYW5cbiAgLyoqXG4gICAqIEN1c3RvbSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlbmRlcmVkIEhUTUwgdGFnLlxuICAgKi9cbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ0B0aXB0YXAvY29yZScge1xuICBpbnRlcmZhY2UgQ29tbWFuZHM8UmV0dXJuVHlwZT4ge1xuICAgIGNvZGVCbG9jazoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBjb2RlIGJsb2NrXG4gICAgICAgKi9cbiAgICAgIHNldENvZGVCbG9jazogKGF0dHJpYnV0ZXM/OiB7IGxhbmd1YWdlOiBzdHJpbmcgfSkgPT4gUmV0dXJuVHlwZVxuICAgICAgLyoqXG4gICAgICAgKiBUb2dnbGUgYSBjb2RlIGJsb2NrXG4gICAgICAgKi9cbiAgICAgIHRvZ2dsZUNvZGVCbG9jazogKGF0dHJpYnV0ZXM/OiB7IGxhbmd1YWdlOiBzdHJpbmcgfSkgPT4gUmV0dXJuVHlwZVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmFja3RpY2tJbnB1dFJlZ2V4ID0gL15gYGAoW2Etel0rKT9bXFxzXFxuXSQvXG5leHBvcnQgY29uc3QgdGlsZGVJbnB1dFJlZ2V4ID0gL15+fn4oW2Etel0rKT9bXFxzXFxuXSQvXG5cbmV4cG9ydCBjb25zdCBDb2RlQmxvY2sgPSBOb2RlLmNyZWF0ZTxDb2RlQmxvY2tPcHRpb25zPih7XG4gIG5hbWU6ICdjb2RlQmxvY2snLFxuXG4gIGFkZE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhbmd1YWdlQ2xhc3NQcmVmaXg6ICdsYW5ndWFnZS0nLFxuICAgICAgZXhpdE9uVHJpcGxlRW50ZXI6IHRydWUsXG4gICAgICBleGl0T25BcnJvd0Rvd246IHRydWUsXG4gICAgICBIVE1MQXR0cmlidXRlczoge30sXG4gICAgfVxuICB9LFxuXG4gIGNvbnRlbnQ6ICd0ZXh0KicsXG5cbiAgbWFya3M6ICcnLFxuXG4gIGdyb3VwOiAnYmxvY2snLFxuXG4gIGNvZGU6IHRydWUsXG5cbiAgZGVmaW5pbmc6IHRydWUsXG5cbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICBjb25zdCB7IGxhbmd1YWdlQ2xhc3NQcmVmaXggfSA9IHRoaXMub3B0aW9uc1xuICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbLi4uKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdCB8fCBbXSldXG4gICAgICAgICAgY29uc3QgbGFuZ3VhZ2VzID0gY2xhc3NOYW1lc1xuICAgICAgICAgICAgLmZpbHRlcihjbGFzc05hbWUgPT4gY2xhc3NOYW1lLnN0YXJ0c1dpdGgobGFuZ3VhZ2VDbGFzc1ByZWZpeCkpXG4gICAgICAgICAgICAubWFwKGNsYXNzTmFtZSA9PiBjbGFzc05hbWUucmVwbGFjZShsYW5ndWFnZUNsYXNzUHJlZml4LCAnJykpXG4gICAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbMF1cblxuICAgICAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGxhbmd1YWdlXG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfVxuICB9LFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdwcmUnLFxuICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICdmdWxsJyxcbiAgICAgIH0sXG4gICAgXVxuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBub2RlLCBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdwcmUnLFxuICAgICAgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLFxuICAgICAgW1xuICAgICAgICAnY29kZScsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzczogbm9kZS5hdHRycy5sYW5ndWFnZVxuICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMubGFuZ3VhZ2VDbGFzc1ByZWZpeCArIG5vZGUuYXR0cnMubGFuZ3VhZ2VcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgMCxcbiAgICAgIF0sXG4gICAgXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRDb2RlQmxvY2s6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy5zZXROb2RlKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHRvZ2dsZUNvZGVCbG9jazpcbiAgICAgICAgYXR0cmlidXRlcyA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZU5vZGUodGhpcy5uYW1lLCAncGFyYWdyYXBoJywgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICB9XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdNb2QtQWx0LWMnOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy50b2dnbGVDb2RlQmxvY2soKSxcblxuICAgICAgLy8gcmVtb3ZlIGNvZGUgYmxvY2sgd2hlbiBhdCBzdGFydCBvZiBkb2N1bWVudCBvciBjb2RlIGJsb2NrIGlzIGVtcHR5XG4gICAgICBCYWNrc3BhY2U6ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbXB0eSwgJGFuY2hvciB9ID0gdGhpcy5lZGl0b3Iuc3RhdGUuc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzQXRTdGFydCA9ICRhbmNob3IucG9zID09PSAxXG5cbiAgICAgICAgaWYgKCFlbXB0eSB8fCAkYW5jaG9yLnBhcmVudC50eXBlLm5hbWUgIT09IHRoaXMubmFtZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXRTdGFydCB8fCAhJGFuY2hvci5wYXJlbnQudGV4dENvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLmNsZWFyTm9kZXMoKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9LFxuXG4gICAgICAvLyBleGl0IG5vZGUgb24gdHJpcGxlIGVudGVyXG4gICAgICBFbnRlcjogKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZXhpdE9uVHJpcGxlRW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IGVkaXRvclxuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gc3RhdGVcbiAgICAgICAgY29uc3QgeyAkZnJvbSwgZW1wdHkgfSA9IHNlbGVjdGlvblxuXG4gICAgICAgIGlmICghZW1wdHkgfHwgJGZyb20ucGFyZW50LnR5cGUgIT09IHRoaXMudHlwZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNBdEVuZCA9ICRmcm9tLnBhcmVudE9mZnNldCA9PT0gJGZyb20ucGFyZW50Lm5vZGVTaXplIC0gMlxuICAgICAgICBjb25zdCBlbmRzV2l0aERvdWJsZU5ld2xpbmUgPSAkZnJvbS5wYXJlbnQudGV4dENvbnRlbnQuZW5kc1dpdGgoJ1xcblxcbicpXG5cbiAgICAgICAgaWYgKCFpc0F0RW5kIHx8ICFlbmRzV2l0aERvdWJsZU5ld2xpbmUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlZGl0b3JcbiAgICAgICAgICAuY2hhaW4oKVxuICAgICAgICAgIC5jb21tYW5kKCh7IHRyIH0pID0+IHtcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgkZnJvbS5wb3MgLSAyLCAkZnJvbS5wb3MpXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZXhpdENvZGUoKVxuICAgICAgICAgIC5ydW4oKVxuICAgICAgfSxcblxuICAgICAgLy8gZXhpdCBub2RlIG9uIGFycm93IGRvd25cbiAgICAgIEFycm93RG93bjogKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZXhpdE9uQXJyb3dEb3duKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSBlZGl0b3JcbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24sIGRvYyB9ID0gc3RhdGVcbiAgICAgICAgY29uc3QgeyAkZnJvbSwgZW1wdHkgfSA9IHNlbGVjdGlvblxuXG4gICAgICAgIGlmICghZW1wdHkgfHwgJGZyb20ucGFyZW50LnR5cGUgIT09IHRoaXMudHlwZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNBdEVuZCA9ICRmcm9tLnBhcmVudE9mZnNldCA9PT0gJGZyb20ucGFyZW50Lm5vZGVTaXplIC0gMlxuXG4gICAgICAgIGlmICghaXNBdEVuZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWZ0ZXIgPSAkZnJvbS5hZnRlcigpXG5cbiAgICAgICAgaWYgKGFmdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVBZnRlciA9IGRvYy5ub2RlQXQoYWZ0ZXIpXG5cbiAgICAgICAgaWYgKG5vZGVBZnRlcikge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVkaXRvci5jb21tYW5kcy5leGl0Q29kZSgpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcblxuICBhZGRJbnB1dFJ1bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKHtcbiAgICAgICAgZmluZDogYmFja3RpY2tJbnB1dFJlZ2V4LFxuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIGdldEF0dHJpYnV0ZXM6IG1hdGNoID0+ICh7XG4gICAgICAgICAgbGFuZ3VhZ2U6IG1hdGNoWzFdLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSh7XG4gICAgICAgIGZpbmQ6IHRpbGRlSW5wdXRSZWdleCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICBnZXRBdHRyaWJ1dGVzOiBtYXRjaCA9PiAoe1xuICAgICAgICAgIGxhbmd1YWdlOiBtYXRjaFsxXSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG5cbiAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAvLyB0aGlzIHBsdWdpbiBjcmVhdGVzIGEgY29kZSBibG9jayBmb3IgcGFzdGVkIGNvbnRlbnQgZnJvbSBWUyBDb2RlXG4gICAgICAvLyB3ZSBjYW4gYWxzbyBkZXRlY3QgdGhlIGNvcGllZCBjb2RlIGxhbmd1YWdlXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KCdjb2RlQmxvY2tWU0NvZGVIYW5kbGVyJyksXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgaGFuZGxlUGFzdGU6ICh2aWV3LCBldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudC5jbGlwYm9hcmREYXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkb27igJl0IGNyZWF0ZSBhIG5ldyBjb2RlIGJsb2NrIHdpdGhpbiBjb2RlIGJsb2Nrc1xuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yLmlzQWN0aXZlKHRoaXMudHlwZS5uYW1lKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpXG4gICAgICAgICAgICBjb25zdCB2c2NvZGUgPSBldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3ZzY29kZS1lZGl0b3ItZGF0YScpXG4gICAgICAgICAgICBjb25zdCB2c2NvZGVEYXRhID0gdnNjb2RlID8gSlNPTi5wYXJzZSh2c2NvZGUpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHZzY29kZURhdGE/Lm1vZGVcblxuICAgICAgICAgICAgaWYgKCF0ZXh0IHx8ICFsYW5ndWFnZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyB0ciB9ID0gdmlldy5zdGF0ZVxuXG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gZW1wdHkgY29kZSBibG9ja1xuICAgICAgICAgICAgdHIucmVwbGFjZVNlbGVjdGlvbldpdGgodGhpcy50eXBlLmNyZWF0ZSh7IGxhbmd1YWdlIH0pKVxuXG4gICAgICAgICAgICAvLyBwdXQgY3Vyc29yIGluc2lkZSB0aGUgbmV3bHkgY3JlYXRlZCBjb2RlIGJsb2NrXG4gICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKE1hdGgubWF4KDAsIHRyLnNlbGVjdGlvbi5mcm9tIC0gMikpKSlcblxuICAgICAgICAgICAgLy8gYWRkIHRleHQgdG8gY29kZSBibG9ja1xuICAgICAgICAgICAgLy8gc3RyaXAgY2FycmlhZ2UgcmV0dXJuIGNoYXJzIGZyb20gdGV4dCBwYXN0ZWQgYXMgY29kZVxuICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3Itdmlldy9jb21taXQvYTUwYTZiY2NlYjRjZTUyYWM4ZmNjNjE2MjQ4OGQ4ODc1NjEzYWFjZFxuICAgICAgICAgICAgdHIuaW5zZXJ0VGV4dCh0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgJ1xcbicpKVxuXG4gICAgICAgICAgICAvLyBzdG9yZSBtZXRhIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWZ1bCBmb3Igb3RoZXIgcGx1Z2lucyB0aGF0IGRlcGVuZHMgb24gdGhlIHBhc3RlIGV2ZW50XG4gICAgICAgICAgICAvLyBsaWtlIHRoZSBwYXN0ZSBydWxlIHBsdWdpblxuICAgICAgICAgICAgdHIuc2V0TWV0YSgncGFzdGUnLCB0cnVlKVxuXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdXG4gIH0sXG59KVxuIiwgInZhciBkZWVwRnJlZXplRXM2ID0ge2V4cG9ydHM6IHt9fTtcblxuZnVuY3Rpb24gZGVlcEZyZWV6ZShvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIG9iai5jbGVhciA9IG9iai5kZWxldGUgPSBvYmouc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXAgaXMgcmVhZC1vbmx5Jyk7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgb2JqLmFkZCA9IG9iai5jbGVhciA9IG9iai5kZWxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldCBpcyByZWFkLW9ubHknKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGcmVlemUgc2VsZlxuICAgIE9iamVjdC5mcmVlemUob2JqKTtcblxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgcHJvcCA9IG9ialtuYW1lXTtcblxuICAgICAgICAvLyBGcmVlemUgcHJvcCBpZiBpdCBpcyBhbiBvYmplY3RcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09ICdvYmplY3QnICYmICFPYmplY3QuaXNGcm96ZW4ocHJvcCkpIHtcbiAgICAgICAgICAgIGRlZXBGcmVlemUocHJvcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG59XG5cbmRlZXBGcmVlemVFczYuZXhwb3J0cyA9IGRlZXBGcmVlemU7XG5kZWVwRnJlZXplRXM2LmV4cG9ydHMuZGVmYXVsdCA9IGRlZXBGcmVlemU7XG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5DYWxsYmFja1Jlc3BvbnNlfSBDYWxsYmFja1Jlc3BvbnNlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRNb2RlfSBDb21waWxlZE1vZGUgKi9cbi8qKiBAaW1wbGVtZW50cyBDYWxsYmFja1Jlc3BvbnNlICovXG5cbmNsYXNzIFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlfSBtb2RlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICAgIGlmIChtb2RlLmRhdGEgPT09IHVuZGVmaW5lZCkgbW9kZS5kYXRhID0ge307XG5cbiAgICB0aGlzLmRhdGEgPSBtb2RlLmRhdGE7XG4gICAgdGhpcy5pc01hdGNoSWdub3JlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWdub3JlTWF0Y2goKSB7XG4gICAgdGhpcy5pc01hdGNoSWdub3JlZCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUhUTUwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAucmVwbGFjZSgvJy9nLCAnJiN4Mjc7Jyk7XG59XG5cbi8qKlxuICogcGVyZm9ybXMgYSBzaGFsbG93IG1lcmdlIG9mIG11bHRpcGxlIG9iamVjdHMgaW50byBvbmVcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBvcmlnaW5hbFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLGFueT5bXX0gb2JqZWN0c1xuICogQHJldHVybnMge1R9IGEgc2luZ2xlIG5ldyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaW5oZXJpdCQxKG9yaWdpbmFsLCAuLi5vYmplY3RzKSB7XG4gIC8qKiBAdHlwZSBSZWNvcmQ8c3RyaW5nLGFueT4gKi9cbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBvcmlnaW5hbCkge1xuICAgIHJlc3VsdFtrZXldID0gb3JpZ2luYWxba2V5XTtcbiAgfVxuICBvYmplY3RzLmZvckVhY2goZnVuY3Rpb24ob2JqKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge1R9ICovIChyZXN1bHQpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlbmRlcmVyXG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcpID0+IHZvaWR9IGFkZFRleHRcbiAqIEBwcm9wZXJ0eSB7KG5vZGU6IE5vZGUpID0+IHZvaWR9IG9wZW5Ob2RlXG4gKiBAcHJvcGVydHkgeyhub2RlOiBOb2RlKSA9PiB2b2lkfSBjbG9zZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB2YWx1ZVxuICovXG5cbi8qKiBAdHlwZWRlZiB7e3Njb3BlPzogc3RyaW5nLCBsYW5ndWFnZT86IHN0cmluZywgc3VibGFuZ3VhZ2U/OiBib29sZWFufX0gTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHt7d2FsazogKHI6IFJlbmRlcmVyKSA9PiB2b2lkfX0gVHJlZSAqL1xuLyoqICovXG5cbmNvbnN0IFNQQU5fQ0xPU0UgPSAnPC9zcGFuPic7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIG5vZGUgbmVlZHMgdG8gYmUgd3JhcHBlZCBpbiA8c3Bhbj5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgKi9cbmNvbnN0IGVtaXRzV3JhcHBpbmdUYWdzID0gKG5vZGUpID0+IHtcbiAgLy8gcmFyZWx5IHdlIGNhbiBoYXZlIGEgc3VibGFuZ3VhZ2Ugd2hlcmUgbGFuZ3VhZ2UgaXMgdW5kZWZpbmVkXG4gIC8vIFRPRE86IHRyYWNrIGRvd24gd2h5XG4gIHJldHVybiAhIW5vZGUuc2NvcGUgfHwgKG5vZGUuc3VibGFuZ3VhZ2UgJiYgbm9kZS5sYW5ndWFnZSk7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHt7cHJlZml4OnN0cmluZ319IG9wdGlvbnNcbiAqL1xuY29uc3Qgc2NvcGVUb0NTU0NsYXNzID0gKG5hbWUsIHsgcHJlZml4IH0pID0+IHtcbiAgaWYgKG5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgY29uc3QgcGllY2VzID0gbmFtZS5zcGxpdChcIi5cIik7XG4gICAgcmV0dXJuIFtcbiAgICAgIGAke3ByZWZpeH0ke3BpZWNlcy5zaGlmdCgpfWAsXG4gICAgICAuLi4ocGllY2VzLm1hcCgoeCwgaSkgPT4gYCR7eH0ke1wiX1wiLnJlcGVhdChpICsgMSl9YCkpXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxuICByZXR1cm4gYCR7cHJlZml4fSR7bmFtZX1gO1xufTtcblxuLyoqIEB0eXBlIHtSZW5kZXJlcn0gKi9cbmNsYXNzIEhUTUxSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEhUTUxSZW5kZXJlclxuICAgKlxuICAgKiBAcGFyYW0ge1RyZWV9IHBhcnNlVHJlZSAtIHRoZSBwYXJzZSB0cmVlIChtdXN0IHN1cHBvcnQgYHdhbGtgIEFQSSlcbiAgICogQHBhcmFtIHt7Y2xhc3NQcmVmaXg6IHN0cmluZ319IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcnNlVHJlZSwgb3B0aW9ucykge1xuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcbiAgICB0aGlzLmNsYXNzUHJlZml4ID0gb3B0aW9ucy5jbGFzc1ByZWZpeDtcbiAgICBwYXJzZVRyZWUud2Fsayh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRleHRzIHRvIHRoZSBvdXRwdXQgc3RyZWFtXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0ICovXG4gIGFkZFRleHQodGV4dCkge1xuICAgIHRoaXMuYnVmZmVyICs9IGVzY2FwZUhUTUwodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgb3BlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSAoaWYgbmVlZGVkKVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgKi9cbiAgb3Blbk5vZGUobm9kZSkge1xuICAgIGlmICghZW1pdHNXcmFwcGluZ1RhZ3Mobm9kZSkpIHJldHVybjtcblxuICAgIGxldCBjbGFzc05hbWUgPSBcIlwiO1xuICAgIGlmIChub2RlLnN1Ymxhbmd1YWdlKSB7XG4gICAgICBjbGFzc05hbWUgPSBgbGFuZ3VhZ2UtJHtub2RlLmxhbmd1YWdlfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsYXNzTmFtZSA9IHNjb3BlVG9DU1NDbGFzcyhub2RlLnNjb3BlLCB7IHByZWZpeDogdGhpcy5jbGFzc1ByZWZpeCB9KTtcbiAgICB9XG4gICAgdGhpcy5zcGFuKGNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5vZGUgY2xvc2UgdG8gdGhlIG91dHB1dCBzdHJlYW0gKGlmIG5lZWRlZClcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGNsb3NlTm9kZShub2RlKSB7XG4gICAgaWYgKCFlbWl0c1dyYXBwaW5nVGFncyhub2RlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5idWZmZXIgKz0gU1BBTl9DTE9TRTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCBidWZmZXJcbiAgKi9cbiAgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLy8gaGVscGVyc1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzcGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAqL1xuICBzcGFuKGNsYXNzTmFtZSkge1xuICAgIHRoaXMuYnVmZmVyICs9IGA8c3BhbiBjbGFzcz1cIiR7Y2xhc3NOYW1lfVwiPmA7XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHt7c2NvcGU/OiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nLCBzdWJsYW5ndWFnZT86IGJvb2xlYW4sIGNoaWxkcmVuOiBOb2RlW119IHwgc3RyaW5nfSBOb2RlICovXG4vKiogQHR5cGVkZWYge3tzY29wZT86IHN0cmluZywgbGFuZ3VhZ2U/OiBzdHJpbmcsIHN1Ymxhbmd1YWdlPzogYm9vbGVhbiwgY2hpbGRyZW46IE5vZGVbXX0gfSBEYXRhTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkVtaXR0ZXJ9IEVtaXR0ZXIgKi9cbi8qKiAgKi9cblxuLyoqIEByZXR1cm5zIHtEYXRhTm9kZX0gKi9cbmNvbnN0IG5ld05vZGUgPSAob3B0cyA9IHt9KSA9PiB7XG4gIC8qKiBAdHlwZSBEYXRhTm9kZSAqL1xuICBjb25zdCByZXN1bHQgPSB7IGNoaWxkcmVuOiBbXSB9O1xuICBPYmplY3QuYXNzaWduKHJlc3VsdCwgb3B0cyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jbGFzcyBUb2tlblRyZWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKiogQHR5cGUgRGF0YU5vZGUgKi9cbiAgICB0aGlzLnJvb3ROb2RlID0gbmV3Tm9kZSgpO1xuICAgIHRoaXMuc3RhY2sgPSBbdGhpcy5yb290Tm9kZV07XG4gIH1cblxuICBnZXQgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gIH1cblxuICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMucm9vdE5vZGU7IH1cblxuICAvKiogQHBhcmFtIHtOb2RlfSBub2RlICovXG4gIGFkZChub2RlKSB7XG4gICAgdGhpcy50b3AuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgKi9cbiAgb3Blbk5vZGUoc2NvcGUpIHtcbiAgICAvKiogQHR5cGUgTm9kZSAqL1xuICAgIGNvbnN0IG5vZGUgPSBuZXdOb2RlKHsgc2NvcGUgfSk7XG4gICAgdGhpcy5hZGQobm9kZSk7XG4gICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xuICB9XG5cbiAgY2xvc2VOb2RlKCkge1xuICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNsb3NlQWxsTm9kZXMoKSB7XG4gICAgd2hpbGUgKHRoaXMuY2xvc2VOb2RlKCkpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3ROb2RlLCBudWxsLCA0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vaHRtbF9yZW5kZXJlclwiKS5SZW5kZXJlciB9IFJlbmRlcmVyXG4gICAqIEBwYXJhbSB7UmVuZGVyZXJ9IGJ1aWxkZXJcbiAgICovXG4gIHdhbGsoYnVpbGRlcikge1xuICAgIC8vIHRoaXMgZG9lcyBub3RcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgICAvLyB0aGlzIHdvcmtzXG4gICAgLy8gcmV0dXJuIFRva2VuVHJlZS5fd2FsayhidWlsZGVyLCB0aGlzLnJvb3ROb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlbmRlcmVyfSBidWlsZGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKi9cbiAgc3RhdGljIF93YWxrKGJ1aWxkZXIsIG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGJ1aWxkZXIuYWRkVGV4dChub2RlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGJ1aWxkZXIub3Blbk5vZGUobm9kZSk7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLl93YWxrKGJ1aWxkZXIsIGNoaWxkKSk7XG4gICAgICBidWlsZGVyLmNsb3NlTm9kZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqL1xuICBzdGF0aWMgX2NvbGxhcHNlKG5vZGUpIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHJldHVybjtcbiAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHJldHVybjtcblxuICAgIGlmIChub2RlLmNoaWxkcmVuLmV2ZXJ5KGVsID0+IHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIC8vIG5vZGUudGV4dCA9IG5vZGUuY2hpbGRyZW4uam9pbihcIlwiKTtcbiAgICAgIC8vIGRlbGV0ZSBub2RlLmNoaWxkcmVuO1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IFtub2RlLmNoaWxkcmVuLmpvaW4oXCJcIildO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIFRva2VuVHJlZS5fY29sbGFwc2UoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICBDdXJyZW50bHkgdGhpcyBpcyBhbGwgcHJpdmF0ZSBBUEksIGJ1dCB0aGlzIGlzIHRoZSBtaW5pbWFsIEFQSSBuZWNlc3NhcnlcbiAgdGhhdCBhbiBFbWl0dGVyIG11c3QgaW1wbGVtZW50IHRvIGZ1bGx5IHN1cHBvcnQgdGhlIHBhcnNlci5cblxuICBNaW5pbWFsIGludGVyZmFjZTpcblxuICAtIGFkZEtleXdvcmQodGV4dCwgc2NvcGUpXG4gIC0gYWRkVGV4dCh0ZXh0KVxuICAtIGFkZFN1Ymxhbmd1YWdlKGVtaXR0ZXIsIHN1Ykxhbmd1YWdlTmFtZSlcbiAgLSBmaW5hbGl6ZSgpXG4gIC0gb3Blbk5vZGUoc2NvcGUpXG4gIC0gY2xvc2VOb2RlKClcbiAgLSBjbG9zZUFsbE5vZGVzKClcbiAgLSB0b0hUTUwoKVxuXG4qL1xuXG4vKipcbiAqIEBpbXBsZW1lbnRzIHtFbWl0dGVyfVxuICovXG5jbGFzcyBUb2tlblRyZWVFbWl0dGVyIGV4dGVuZHMgVG9rZW5UcmVlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVcbiAgICovXG4gIGFkZEtleXdvcmQodGV4dCwgc2NvcGUpIHtcbiAgICBpZiAodGV4dCA9PT0gXCJcIikgeyByZXR1cm47IH1cblxuICAgIHRoaXMub3Blbk5vZGUoc2NvcGUpO1xuICAgIHRoaXMuYWRkVGV4dCh0ZXh0KTtcbiAgICB0aGlzLmNsb3NlTm9kZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqL1xuICBhZGRUZXh0KHRleHQpIHtcbiAgICBpZiAodGV4dCA9PT0gXCJcIikgeyByZXR1cm47IH1cblxuICAgIHRoaXMuYWRkKHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RW1pdHRlciAmIHtyb290OiBEYXRhTm9kZX19IGVtaXR0ZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGFkZFN1Ymxhbmd1YWdlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgICAvKiogQHR5cGUgRGF0YU5vZGUgKi9cbiAgICBjb25zdCBub2RlID0gZW1pdHRlci5yb290O1xuICAgIG5vZGUuc3VibGFuZ3VhZ2UgPSB0cnVlO1xuICAgIG5vZGUubGFuZ3VhZ2UgPSBuYW1lO1xuICAgIHRoaXMuYWRkKG5vZGUpO1xuICB9XG5cbiAgdG9IVE1MKCkge1xuICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IEhUTUxSZW5kZXJlcih0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHJldHVybiByZW5kZXJlci52YWx1ZSgpO1xuICB9XG5cbiAgZmluYWxpemUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtSZWdFeHB9XG4gKiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHNvdXJjZShyZSkge1xuICBpZiAoIXJlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiByZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHJlO1xuXG4gIHJldHVybiByZS5zb3VyY2U7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmcgfSByZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gbG9va2FoZWFkKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/PScsIHJlLCAnKScpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGFueU51bWJlck9mVGltZXMocmUpIHtcbiAgcmV0dXJuIGNvbmNhdCgnKD86JywgcmUsICcpKicpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9wdGlvbmFsKHJlKSB7XG4gIHJldHVybiBjb25jYXQoJyg/OicsIHJlLCAnKT8nKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLihSZWdFeHAgfCBzdHJpbmcpIH0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29uY2F0KC4uLmFyZ3MpIHtcbiAgY29uc3Qgam9pbmVkID0gYXJncy5tYXAoKHgpID0+IHNvdXJjZSh4KSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBBcnJheTxzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3Q+IH0gYXJnc1xuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncykge1xuICBjb25zdCBvcHRzID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcgJiYgb3B0cy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgYXJncy5zcGxpY2UoYXJncy5sZW5ndGggLSAxLCAxKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHsge2NhcHR1cmU/OiBib29sZWFufSB9IFJlZ2V4RWl0aGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIEFueSBvZiB0aGUgcGFzc2VkIGV4cHJlc3NzaW9ucyBtYXkgbWF0Y2hcbiAqXG4gKiBDcmVhdGVzIGEgaHVnZSB0aGlzIHwgdGhpcyB8IHRoYXQgfCB0aGF0IG1hdGNoXG4gKiBAcGFyYW0geyhSZWdFeHAgfCBzdHJpbmcpW10gfCBbLi4uKFJlZ0V4cCB8IHN0cmluZylbXSwgUmVnZXhFaXRoZXJPcHRpb25zXX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZWl0aGVyKC4uLmFyZ3MpIHtcbiAgLyoqIEB0eXBlIHsgb2JqZWN0ICYge2NhcHR1cmU/OiBib29sZWFufSB9ICAqL1xuICBjb25zdCBvcHRzID0gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncyk7XG4gIGNvbnN0IGpvaW5lZCA9ICcoJ1xuICAgICsgKG9wdHMuY2FwdHVyZSA/IFwiXCIgOiBcIj86XCIpXG4gICAgKyBhcmdzLm1hcCgoeCkgPT4gc291cmNlKHgpKS5qb2luKFwifFwiKSArIFwiKVwiO1xuICByZXR1cm4gam9pbmVkO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nfSByZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gY291bnRNYXRjaEdyb3VwcyhyZSkge1xuICByZXR1cm4gKG5ldyBSZWdFeHAocmUudG9TdHJpbmcoKSArICd8JykpLmV4ZWMoJycpLmxlbmd0aCAtIDE7XG59XG5cbi8qKlxuICogRG9lcyBsZXhlbWUgc3RhcnQgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZXhlbWVcbiAqL1xuZnVuY3Rpb24gc3RhcnRzV2l0aChyZSwgbGV4ZW1lKSB7XG4gIGNvbnN0IG1hdGNoID0gcmUgJiYgcmUuZXhlYyhsZXhlbWUpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2guaW5kZXggPT09IDA7XG59XG5cbi8vIEJBQ0tSRUZfUkUgbWF0Y2hlcyBhbiBvcGVuIHBhcmVudGhlc2lzIG9yIGJhY2tyZWZlcmVuY2UuIFRvIGF2b2lkXG4vLyBhbiBpbmNvcnJlY3QgcGFyc2UsIGl0IGFkZGl0aW9uYWxseSBtYXRjaGVzIHRoZSBmb2xsb3dpbmc6XG4vLyAtIFsuLi5dIGVsZW1lbnRzLCB3aGVyZSB0aGUgbWVhbmluZyBvZiBwYXJlbnRoZXNlcyBhbmQgZXNjYXBlcyBjaGFuZ2Vcbi8vIC0gb3RoZXIgZXNjYXBlIHNlcXVlbmNlcywgc28gd2UgZG8gbm90IG1pc3BhcnNlIGVzY2FwZSBzZXF1ZW5jZXMgYXNcbi8vICAgaW50ZXJlc3RpbmcgZWxlbWVudHNcbi8vIC0gbm9uLW1hdGNoaW5nIG9yIGxvb2thaGVhZCBwYXJlbnRoZXNlcywgd2hpY2ggZG8gbm90IGNhcHR1cmUuIFRoZXNlXG4vLyAgIGZvbGxvdyB0aGUgJygnIHdpdGggYSAnPycuXG5jb25zdCBCQUNLUkVGX1JFID0gL1xcWyg/OlteXFxcXFxcXV18XFxcXC4pKlxcXXxcXChcXD8/fFxcXFwoWzEtOV1bMC05XSopfFxcXFwuLztcblxuLy8gKipJTlRFUk5BTCoqIE5vdCBpbnRlbmRlZCBmb3Igb3V0c2lkZSB1c2FnZVxuLy8gam9pbiBsb2dpY2FsbHkgY29tcHV0ZXMgcmVnZXhwcy5qb2luKHNlcGFyYXRvciksIGJ1dCBmaXhlcyB0aGVcbi8vIGJhY2tyZWZlcmVuY2VzIHNvIHRoZXkgY29udGludWUgdG8gbWF0Y2guXG4vLyBpdCBhbHNvIHBsYWNlcyBlYWNoIGluZGl2aWR1YWwgcmVndWxhciBleHByZXNzaW9uIGludG8gaXQncyBvd25cbi8vIG1hdGNoIGdyb3VwLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBzZXF1ZW5jaW5nIG9mIHRob3NlIG1hdGNoIGdyb3Vwc1xuLy8gaXMgY3VycmVudGx5IGFuIGV4ZXJjaXNlIGZvciB0aGUgY2FsbGVyLiA6LSlcbi8qKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgUmVnRXhwKVtdfSByZWdleHBzXG4gKiBAcGFyYW0ge3tqb2luV2l0aDogc3RyaW5nfX0gb3B0c1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhyZWdleHBzLCB7IGpvaW5XaXRoIH0pIHtcbiAgbGV0IG51bUNhcHR1cmVzID0gMDtcblxuICByZXR1cm4gcmVnZXhwcy5tYXAoKHJlZ2V4KSA9PiB7XG4gICAgbnVtQ2FwdHVyZXMgKz0gMTtcbiAgICBjb25zdCBvZmZzZXQgPSBudW1DYXB0dXJlcztcbiAgICBsZXQgcmUgPSBzb3VyY2UocmVnZXgpO1xuICAgIGxldCBvdXQgPSAnJztcblxuICAgIHdoaWxlIChyZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IEJBQ0tSRUZfUkUuZXhlYyhyZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG91dCArPSByZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvdXQgKz0gcmUuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgIHJlID0gcmUuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgIGlmIChtYXRjaFswXVswXSA9PT0gJ1xcXFwnICYmIG1hdGNoWzFdKSB7XG4gICAgICAgIC8vIEFkanVzdCB0aGUgYmFja3JlZmVyZW5jZS5cbiAgICAgICAgb3V0ICs9ICdcXFxcJyArIFN0cmluZyhOdW1iZXIobWF0Y2hbMV0pICsgb2Zmc2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCArPSBtYXRjaFswXTtcbiAgICAgICAgaWYgKG1hdGNoWzBdID09PSAnKCcpIHtcbiAgICAgICAgICBudW1DYXB0dXJlcysrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH0pLm1hcChyZSA9PiBgKCR7cmV9KWApLmpvaW4oam9pbldpdGgpO1xufVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLk1vZGVDYWxsYmFja30gTW9kZUNhbGxiYWNrICovXG5cbi8vIENvbW1vbiByZWdleHBzXG5jb25zdCBNQVRDSF9OT1RISU5HX1JFID0gL1xcYlxcQi87XG5jb25zdCBJREVOVF9SRSA9ICdbYS16QS1aXVxcXFx3Kic7XG5jb25zdCBVTkRFUlNDT1JFX0lERU5UX1JFID0gJ1thLXpBLVpfXVxcXFx3Kic7XG5jb25zdCBOVU1CRVJfUkUgPSAnXFxcXGJcXFxcZCsoXFxcXC5cXFxcZCspPyc7XG5jb25zdCBDX05VTUJFUl9SRSA9ICcoLT8pKFxcXFxiMFt4WF1bYS1mQS1GMC05XSt8KFxcXFxiXFxcXGQrKFxcXFwuXFxcXGQqKT98XFxcXC5cXFxcZCspKFtlRV1bLStdP1xcXFxkKyk/KSc7IC8vIDB4Li4uLCAwLi4uLCBkZWNpbWFsLCBmbG9hdFxuY29uc3QgQklOQVJZX05VTUJFUl9SRSA9ICdcXFxcYigwYlswMV0rKSc7IC8vIDBiLi4uXG5jb25zdCBSRV9TVEFSVEVSU19SRSA9ICchfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFxcXCp8XFxcXCo9fFxcXFwrfFxcXFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFxcXD98XFxcXFt8XFxcXHt8XFxcXCh8XFxcXF58XFxcXF49fFxcXFx8fFxcXFx8PXxcXFxcfFxcXFx8fH4nO1xuXG4vKipcbiogQHBhcmFtIHsgUGFydGlhbDxNb2RlPiAmIHtiaW5hcnk/OiBzdHJpbmcgfCBSZWdFeHB9IH0gb3B0c1xuKi9cbmNvbnN0IFNIRUJBTkcgPSAob3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IGJlZ2luU2hlYmFuZyA9IC9eIyFbIF0qXFwvLztcbiAgaWYgKG9wdHMuYmluYXJ5KSB7XG4gICAgb3B0cy5iZWdpbiA9IGNvbmNhdChcbiAgICAgIGJlZ2luU2hlYmFuZyxcbiAgICAgIC8uKlxcYi8sXG4gICAgICBvcHRzLmJpbmFyeSxcbiAgICAgIC9cXGIuKi8pO1xuICB9XG4gIHJldHVybiBpbmhlcml0JDEoe1xuICAgIHNjb3BlOiAnbWV0YScsXG4gICAgYmVnaW46IGJlZ2luU2hlYmFuZyxcbiAgICBlbmQ6IC8kLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAgLyoqIEB0eXBlIHtNb2RlQ2FsbGJhY2t9ICovXG4gICAgXCJvbjpiZWdpblwiOiAobSwgcmVzcCkgPT4ge1xuICAgICAgaWYgKG0uaW5kZXggIT09IDApIHJlc3AuaWdub3JlTWF0Y2goKTtcbiAgICB9XG4gIH0sIG9wdHMpO1xufTtcblxuLy8gQ29tbW9uIG1vZGVzXG5jb25zdCBCQUNLU0xBU0hfRVNDQVBFID0ge1xuICBiZWdpbjogJ1xcXFxcXFxcW1xcXFxzXFxcXFNdJywgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQVBPU19TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1xcJycsXG4gIGVuZDogJ1xcJycsXG4gIGlsbGVnYWw6ICdcXFxcbicsXG4gIGNvbnRhaW5zOiBbQkFDS1NMQVNIX0VTQ0FQRV1cbn07XG5jb25zdCBRVU9URV9TVFJJTkdfTU9ERSA9IHtcbiAgc2NvcGU6ICdzdHJpbmcnLFxuICBiZWdpbjogJ1wiJyxcbiAgZW5kOiAnXCInLFxuICBpbGxlZ2FsOiAnXFxcXG4nLFxuICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG59O1xuY29uc3QgUEhSQVNBTF9XT1JEU19NT0RFID0ge1xuICBiZWdpbjogL1xcYihhfGFufHRoZXxhcmV8SSdtfGlzbid0fGRvbid0fGRvZXNuJ3R8d29uJ3R8YnV0fGp1c3R8c2hvdWxkfHByZXR0eXxzaW1wbHl8ZW5vdWdofGdvbm5hfGdvaW5nfHd0Znxzb3xzdWNofHdpbGx8eW91fHlvdXJ8dGhleXxsaWtlfG1vcmUpXFxiL1xufTtcbi8qKlxuICogQ3JlYXRlcyBhIGNvbW1lbnQgbW9kZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBiZWdpblxuICogQHBhcmFtIHtzdHJpbmcgfCBSZWdFeHB9IGVuZFxuICogQHBhcmFtIHtNb2RlIHwge319IFttb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXJ0aWFsPE1vZGU+fVxuICovXG5jb25zdCBDT01NRU5UID0gZnVuY3Rpb24oYmVnaW4sIGVuZCwgbW9kZU9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBtb2RlID0gaW5oZXJpdCQxKFxuICAgIHtcbiAgICAgIHNjb3BlOiAnY29tbWVudCcsXG4gICAgICBiZWdpbixcbiAgICAgIGVuZCxcbiAgICAgIGNvbnRhaW5zOiBbXVxuICAgIH0sXG4gICAgbW9kZU9wdGlvbnNcbiAgKTtcbiAgbW9kZS5jb250YWlucy5wdXNoKHtcbiAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgLy8gaGFjayB0byBhdm9pZCB0aGUgc3BhY2UgZnJvbSBiZWluZyBpbmNsdWRlZC4gdGhlIHNwYWNlIGlzIG5lY2Vzc2FyeSB0b1xuICAgIC8vIG1hdGNoIGhlcmUgdG8gcHJldmVudCB0aGUgcGxhaW4gdGV4dCBydWxlIGJlbG93IGZyb20gZ29iYmxpbmcgdXAgZG9jdGFnc1xuICAgIGJlZ2luOiAnWyBdKig/PShUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKTopJyxcbiAgICBlbmQ6IC8oVE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6LyxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH0pO1xuICBjb25zdCBFTkdMSVNIX1dPUkQgPSBlaXRoZXIoXG4gICAgLy8gbGlzdCBvZiBjb21tb24gMSBhbmQgMiBsZXR0ZXIgd29yZHMgaW4gRW5nbGlzaFxuICAgIFwiSVwiLFxuICAgIFwiYVwiLFxuICAgIFwiaXNcIixcbiAgICBcInNvXCIsXG4gICAgXCJ1c1wiLFxuICAgIFwidG9cIixcbiAgICBcImF0XCIsXG4gICAgXCJpZlwiLFxuICAgIFwiaW5cIixcbiAgICBcIml0XCIsXG4gICAgXCJvblwiLFxuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBjb250cmFjdGlvbnMsIGp1c3QgcG9wdWxhciBvbmVzXG4gICAgL1tBLVphLXpdK1snXShkfHZlfHJlfGxsfHR8c3xuKS8sIC8vIGNvbnRyYWN0aW9ucyAtIGNhbid0IHdlJ2QgdGhleSdyZSBsZXQncywgZXRjXG4gICAgL1tBLVphLXpdK1stXVthLXpdKy8sIC8vIGBuby13YXlgLCBldGMuXG4gICAgL1tBLVphLXpdW2Etel17Mix9LyAvLyBhbGxvdyBjYXBpdGFsaXplZCB3b3JkcyBhdCBiZWdpbm5pbmcgb2Ygc2VudGVuY2VzXG4gICk7XG4gIC8vIGxvb2tpbmcgbGlrZSBwbGFpbiB0ZXh0LCBtb3JlIGxpa2VseSB0byBiZSBhIGNvbW1lbnRcbiAgbW9kZS5jb250YWlucy5wdXNoKFxuICAgIHtcbiAgICAgIC8vIFRPRE86IGhvdyB0byBpbmNsdWRlIFwiLCAoLCApIHdpdGhvdXQgYnJlYWtpbmcgZ3JhbW1hcnMgdGhhdCB1c2UgdGhlc2UgZm9yXG4gICAgICAvLyBjb21tZW50IGRlbGltaXRlcnM/XG4gICAgICAvLyBiZWdpbjogL1sgXSsoWygpXCJdPyhbQS1aYS16Jy1dezMsfXxpc3xhfEl8c298dXN8W3RUXVtvT118YXR8aWZ8aW58aXR8b24pWy5dP1soKVwiOl0/KFsuXVsgXXxbIF18XFwpKSl7M30vXG4gICAgICAvLyAtLS1cblxuICAgICAgLy8gdGhpcyB0cmllcyB0byBmaW5kIHNlcXVlbmNlcyBvZiAzIGVuZ2xpc2ggd29yZHMgaW4gYSByb3cgKHdpdGhvdXQgYW55XG4gICAgICAvLyBcInByb2dyYW1taW5nXCIgdHlwZSBzeW50YXgpIHRoaXMgZ2l2ZXMgdXMgYSBzdHJvbmcgc2lnbmFsIHRoYXQgd2UndmVcbiAgICAgIC8vIFRSVUxZIGZvdW5kIGEgY29tbWVudCAtIHZzIHBlcmhhcHMgc2Nhbm5pbmcgd2l0aCB0aGUgd3JvbmcgbGFuZ3VhZ2UuXG4gICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgTE9PS1MgbGlrZSB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAvLyBjb21tZW50IC0gYnV0IHRoZW4gaWYgdGhlcmUgaXMgbm8gcmVhZGFibGUgdGV4dCAtIGdvb2QgY2hhbmNlIGl0IGlzIGFcbiAgICAgIC8vIGZhbHNlIG1hdGNoIGFuZCBub3QgYSBjb21tZW50LlxuICAgICAgLy9cbiAgICAgIC8vIGZvciBhIHZpc3VhbCBleGFtcGxlIHBsZWFzZSBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yODI3XG5cbiAgICAgIGJlZ2luOiBjb25jYXQoXG4gICAgICAgIC9bIF0rLywgLy8gbmVjZXNzYXJ5IHRvIHByZXZlbnQgdXMgZ29iYmxpbmcgdXAgZG9jdGFncyBsaWtlIC8qIEBhdXRob3IgQm9iIE1jZ2lsbCAqL1xuICAgICAgICAnKCcsXG4gICAgICAgIEVOR0xJU0hfV09SRCxcbiAgICAgICAgL1suXT9bOl0/KFsuXVsgXXxbIF0pLyxcbiAgICAgICAgJyl7M30nKSAvLyBsb29rIGZvciAzIHdvcmRzIGluIGEgcm93XG4gICAgfVxuICApO1xuICByZXR1cm4gbW9kZTtcbn07XG5jb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gQ09NTUVOVCgnLy8nLCAnJCcpO1xuY29uc3QgQ19CTE9DS19DT01NRU5UX01PREUgPSBDT01NRU5UKCcvXFxcXConLCAnXFxcXCovJyk7XG5jb25zdCBIQVNIX0NPTU1FTlRfTU9ERSA9IENPTU1FTlQoJyMnLCAnJCcpO1xuY29uc3QgTlVNQkVSX01PREUgPSB7XG4gIHNjb3BlOiAnbnVtYmVyJyxcbiAgYmVnaW46IE5VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgQ19OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQ19OVU1CRVJfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IEJJTkFSWV9OVU1CRVJfTU9ERSA9IHtcbiAgc2NvcGU6ICdudW1iZXInLFxuICBiZWdpbjogQklOQVJZX05VTUJFUl9SRSxcbiAgcmVsZXZhbmNlOiAwXG59O1xuY29uc3QgUkVHRVhQX01PREUgPSB7XG4gIC8vIHRoaXMgb3V0ZXIgcnVsZSBtYWtlcyBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgYSBXSE9MRSByZWdleCBhbmQgbm90IHNpbXBseVxuICAvLyBhbiBleHByZXNzaW9uIHN1Y2ggYXM6XG4gIC8vXG4gIC8vICAgICAzIC8gc29tZXRoaW5nXG4gIC8vXG4gIC8vICh3aGljaCB3aWxsIHRoZW4gYmxvdyB1cCB3aGVuIHJlZ2V4J3MgYGlsbGVnYWxgIHNlZXMgdGhlIG5ld2xpbmUpXG4gIGJlZ2luOiAvKD89XFwvW14vXFxuXSpcXC8pLyxcbiAgY29udGFpbnM6IFt7XG4gICAgc2NvcGU6ICdyZWdleHAnLFxuICAgIGJlZ2luOiAvXFwvLyxcbiAgICBlbmQ6IC9cXC9bZ2ltdXldKi8sXG4gICAgaWxsZWdhbDogL1xcbi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXFxdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW0JBQ0tTTEFTSF9FU0NBUEVdXG4gICAgICB9XG4gICAgXVxuICB9XVxufTtcbmNvbnN0IFRJVExFX01PREUgPSB7XG4gIHNjb3BlOiAndGl0bGUnLFxuICBiZWdpbjogSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcbmNvbnN0IFVOREVSU0NPUkVfVElUTEVfTU9ERSA9IHtcbiAgc2NvcGU6ICd0aXRsZScsXG4gIGJlZ2luOiBVTkRFUlNDT1JFX0lERU5UX1JFLFxuICByZWxldmFuY2U6IDBcbn07XG5jb25zdCBNRVRIT0RfR1VBUkQgPSB7XG4gIC8vIGV4Y2x1ZGVzIG1ldGhvZCBuYW1lcyBmcm9tIGtleXdvcmQgcHJvY2Vzc2luZ1xuICBiZWdpbjogJ1xcXFwuXFxcXHMqJyArIFVOREVSU0NPUkVfSURFTlRfUkUsXG4gIHJlbGV2YW5jZTogMFxufTtcblxuLyoqXG4gKiBBZGRzIGVuZCBzYW1lIGFzIGJlZ2luIG1lY2hhbmljcyB0byBhIG1vZGVcbiAqXG4gKiBZb3VyIG1vZGUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IGEgc2luZ2xlICgpIG1hdGNoIGdyb3VwIGFzIHRoYXQgZmlyc3QgbWF0Y2hcbiAqIGdyb3VwIGlzIHdoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvblxuICogQHBhcmFtIHtQYXJ0aWFsPE1vZGU+fSBtb2RlXG4gKi9cbmNvbnN0IEVORF9TQU1FX0FTX0JFR0lOID0gZnVuY3Rpb24obW9kZSkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihtb2RlLFxuICAgIHtcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmJlZ2luJzogKG0sIHJlc3ApID0+IHsgcmVzcC5kYXRhLl9iZWdpbk1hdGNoID0gbVsxXTsgfSxcbiAgICAgIC8qKiBAdHlwZSB7TW9kZUNhbGxiYWNrfSAqL1xuICAgICAgJ29uOmVuZCc6IChtLCByZXNwKSA9PiB7IGlmIChyZXNwLmRhdGEuX2JlZ2luTWF0Y2ggIT09IG1bMV0pIHJlc3AuaWdub3JlTWF0Y2goKTsgfVxuICAgIH0pO1xufTtcblxudmFyIE1PREVTID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBNQVRDSF9OT1RISU5HX1JFOiBNQVRDSF9OT1RISU5HX1JFLFxuICAgIElERU5UX1JFOiBJREVOVF9SRSxcbiAgICBVTkRFUlNDT1JFX0lERU5UX1JFOiBVTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgIE5VTUJFUl9SRTogTlVNQkVSX1JFLFxuICAgIENfTlVNQkVSX1JFOiBDX05VTUJFUl9SRSxcbiAgICBCSU5BUllfTlVNQkVSX1JFOiBCSU5BUllfTlVNQkVSX1JFLFxuICAgIFJFX1NUQVJURVJTX1JFOiBSRV9TVEFSVEVSU19SRSxcbiAgICBTSEVCQU5HOiBTSEVCQU5HLFxuICAgIEJBQ0tTTEFTSF9FU0NBUEU6IEJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgQVBPU19TVFJJTkdfTU9ERTogQVBPU19TVFJJTkdfTU9ERSxcbiAgICBRVU9URV9TVFJJTkdfTU9ERTogUVVPVEVfU1RSSU5HX01PREUsXG4gICAgUEhSQVNBTF9XT1JEU19NT0RFOiBQSFJBU0FMX1dPUkRTX01PREUsXG4gICAgQ09NTUVOVDogQ09NTUVOVCxcbiAgICBDX0xJTkVfQ09NTUVOVF9NT0RFOiBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgIENfQkxPQ0tfQ09NTUVOVF9NT0RFOiBDX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBIQVNIX0NPTU1FTlRfTU9ERTogSEFTSF9DT01NRU5UX01PREUsXG4gICAgTlVNQkVSX01PREU6IE5VTUJFUl9NT0RFLFxuICAgIENfTlVNQkVSX01PREU6IENfTlVNQkVSX01PREUsXG4gICAgQklOQVJZX05VTUJFUl9NT0RFOiBCSU5BUllfTlVNQkVSX01PREUsXG4gICAgUkVHRVhQX01PREU6IFJFR0VYUF9NT0RFLFxuICAgIFRJVExFX01PREU6IFRJVExFX01PREUsXG4gICAgVU5ERVJTQ09SRV9USVRMRV9NT0RFOiBVTkRFUlNDT1JFX1RJVExFX01PREUsXG4gICAgTUVUSE9EX0dVQVJEOiBNRVRIT0RfR1VBUkQsXG4gICAgRU5EX1NBTUVfQVNfQkVHSU46IEVORF9TQU1FX0FTX0JFR0lOXG59KTtcblxuLyoqXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5DYWxsYmFja1Jlc3BvbnNlfSBDYWxsYmFja1Jlc3BvbnNlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Db21waWxlckV4dH0gQ29tcGlsZXJFeHRcbiovXG5cbi8vIEdyYW1tYXIgZXh0ZW5zaW9ucyAvIHBsdWdpbnNcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjgzM1xuXG4vLyBHcmFtbWFyIGV4dGVuc2lvbnMgYWxsb3cgXCJzeW50YWN0aWMgc3VnYXJcIiB0byBiZSBhZGRlZCB0byB0aGUgZ3JhbW1hciBtb2Rlc1xuLy8gd2l0aG91dCByZXF1aXJpbmcgYW55IHVuZGVybHlpbmcgY2hhbmdlcyB0byB0aGUgY29tcGlsZXIgaW50ZXJuYWxzLlxuXG4vLyBgY29tcGlsZU1hdGNoYCBiZWluZyB0aGUgcGVyZmVjdCBzbWFsbCBleGFtcGxlIG9mIG5vdyBhbGxvd2luZyBhIGdyYW1tYXJcbi8vIGF1dGhvciB0byB3cml0ZSBgbWF0Y2hgIHdoZW4gdGhleSBkZXNpcmUgdG8gbWF0Y2ggYSBzaW5nbGUgZXhwcmVzc2lvbiByYXRoZXJcbi8vIHRoYW4gYmVpbmcgZm9yY2VkIHRvIHVzZSBgYmVnaW5gLiAgVGhlIGV4dGVuc2lvbiB0aGVuIGp1c3QgbW92ZXMgYG1hdGNoYCBpbnRvXG4vLyBgYmVnaW5gIHdoZW4gaXQgcnVucy4gIEllLCBubyBmZWF0dXJlcyBoYXZlIGJlZW4gYWRkZWQsIGJ1dCB3ZSd2ZSBqdXN0IG1hZGVcbi8vIHRoZSBleHBlcmllbmNlIG9mIHdyaXRpbmcgKGFuZCByZWFkaW5nIGdyYW1tYXJzKSBhIGxpdHRsZSBiaXQgbmljZXIuXG5cbi8vIC0tLS0tLVxuXG4vLyBUT0RPOiBXZSBuZWVkIG5lZ2F0aXZlIGxvb2stYmVoaW5kIHN1cHBvcnQgdG8gZG8gdGhpcyBwcm9wZXJseVxuLyoqXG4gKiBTa2lwIGEgbWF0Y2ggaWYgaXQgaGFzIGEgcHJlY2VkaW5nIGRvdFxuICpcbiAqIFRoaXMgaXMgdXNlZCBmb3IgYGJlZ2luS2V5d29yZHNgIHRvIHByZXZlbnQgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgc3VjaCBhc1xuICogYGJvYi5rZXl3b3JkLmRvKClgLiBUaGUgbW9kZSBjb21waWxlciBhdXRvbWF0aWNhbGx5IHdpcmVzIHRoaXMgdXAgYXMgYVxuICogc3BlY2lhbCBfaW50ZXJuYWxfICdvbjpiZWdpbicgY2FsbGJhY2sgZm9yIG1vZGVzIHdpdGggYGJlZ2luS2V5d29yZHNgXG4gKiBAcGFyYW0ge1JlZ0V4cE1hdGNoQXJyYXl9IG1hdGNoXG4gKiBAcGFyYW0ge0NhbGxiYWNrUmVzcG9uc2V9IHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIHNraXBJZkhhc1ByZWNlZGluZ0RvdChtYXRjaCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgYmVmb3JlID0gbWF0Y2guaW5wdXRbbWF0Y2guaW5kZXggLSAxXTtcbiAgaWYgKGJlZm9yZSA9PT0gXCIuXCIpIHtcbiAgICByZXNwb25zZS5pZ25vcmVNYXRjaCgpO1xuICB9XG59XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gc2NvcGVDbGFzc05hbWUobW9kZSwgX3BhcmVudCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gIGlmIChtb2RlLmNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbW9kZS5zY29wZSA9IG1vZGUuY2xhc3NOYW1lO1xuICAgIGRlbGV0ZSBtb2RlLmNsYXNzTmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIGBiZWdpbktleXdvcmRzYCBzeW50YWN0aWMgc3VnYXJcbiAqIEB0eXBlIHtDb21waWxlckV4dH1cbiAqL1xuZnVuY3Rpb24gYmVnaW5LZXl3b3Jkcyhtb2RlLCBwYXJlbnQpIHtcbiAgaWYgKCFwYXJlbnQpIHJldHVybjtcbiAgaWYgKCFtb2RlLmJlZ2luS2V5d29yZHMpIHJldHVybjtcblxuICAvLyBmb3IgbGFuZ3VhZ2VzIHdpdGgga2V5d29yZHMgdGhhdCBpbmNsdWRlIG5vbi13b3JkIGNoYXJhY3RlcnMgY2hlY2tpbmcgZm9yXG4gIC8vIGEgd29yZCBib3VuZGFyeSBpcyBub3Qgc3VmZmljaWVudCwgc28gaW5zdGVhZCB3ZSBjaGVjayBmb3IgYSB3b3JkIGJvdW5kYXJ5XG4gIC8vIG9yIHdoaXRlc3BhY2UgLSB0aGlzIGRvZXMgbm8gaGFybSBpbiBhbnkgY2FzZSBzaW5jZSBvdXIga2V5d29yZCBlbmdpbmVcbiAgLy8gZG9lc24ndCBhbGxvdyBzcGFjZXMgaW4ga2V5d29yZHMgYW55d2F5cyBhbmQgd2Ugc3RpbGwgY2hlY2sgZm9yIHRoZSBib3VuZGFyeVxuICAvLyBmaXJzdFxuICBtb2RlLmJlZ2luID0gJ1xcXFxiKCcgKyBtb2RlLmJlZ2luS2V5d29yZHMuc3BsaXQoJyAnKS5qb2luKCd8JykgKyAnKSg/IVxcXFwuKSg/PVxcXFxifFxcXFxzKSc7XG4gIG1vZGUuX19iZWZvcmVCZWdpbiA9IHNraXBJZkhhc1ByZWNlZGluZ0RvdDtcbiAgbW9kZS5rZXl3b3JkcyA9IG1vZGUua2V5d29yZHMgfHwgbW9kZS5iZWdpbktleXdvcmRzO1xuICBkZWxldGUgbW9kZS5iZWdpbktleXdvcmRzO1xuXG4gIC8vIHByZXZlbnRzIGRvdWJsZSByZWxldmFuY2UsIHRoZSBrZXl3b3JkcyB0aGVtc2VsdmVzIHByb3ZpZGVcbiAgLy8gcmVsZXZhbmNlLCB0aGUgbW9kZSBkb2Vzbid0IG5lZWQgdG8gZG91YmxlIGl0XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZmluZWRcbiAgaWYgKG1vZGUucmVsZXZhbmNlID09PSB1bmRlZmluZWQpIG1vZGUucmVsZXZhbmNlID0gMDtcbn1cblxuLyoqXG4gKiBBbGxvdyBgaWxsZWdhbGAgdG8gY29udGFpbiBhbiBhcnJheSBvZiBpbGxlZ2FsIHZhbHVlc1xuICogQHR5cGUge0NvbXBpbGVyRXh0fVxuICovXG5mdW5jdGlvbiBjb21waWxlSWxsZWdhbChtb2RlLCBfcGFyZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShtb2RlLmlsbGVnYWwpKSByZXR1cm47XG5cbiAgbW9kZS5pbGxlZ2FsID0gZWl0aGVyKC4uLm1vZGUuaWxsZWdhbCk7XG59XG5cbi8qKlxuICogYG1hdGNoYCB0byBtYXRjaCBhIHNpbmdsZSBleHByZXNzaW9uIGZvciByZWFkYWJpbGl0eVxuICogQHR5cGUge0NvbXBpbGVyRXh0fVxuICovXG5mdW5jdGlvbiBjb21waWxlTWF0Y2gobW9kZSwgX3BhcmVudCkge1xuICBpZiAoIW1vZGUubWF0Y2gpIHJldHVybjtcbiAgaWYgKG1vZGUuYmVnaW4gfHwgbW9kZS5lbmQpIHRocm93IG5ldyBFcnJvcihcImJlZ2luICYgZW5kIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbWF0Y2hcIik7XG5cbiAgbW9kZS5iZWdpbiA9IG1vZGUubWF0Y2g7XG4gIGRlbGV0ZSBtb2RlLm1hdGNoO1xufVxuXG4vKipcbiAqIHByb3ZpZGVzIHRoZSBkZWZhdWx0IDEgcmVsZXZhbmNlIHRvIGFsbCBtb2Rlc1xuICogQHR5cGUge0NvbXBpbGVyRXh0fVxuICovXG5mdW5jdGlvbiBjb21waWxlUmVsZXZhbmNlKG1vZGUsIF9wYXJlbnQpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICBpZiAobW9kZS5yZWxldmFuY2UgPT09IHVuZGVmaW5lZCkgbW9kZS5yZWxldmFuY2UgPSAxO1xufVxuXG4vLyBhbGxvdyBiZWZvcmVNYXRjaCB0byBhY3QgYXMgYSBcInF1YWxpZmllclwiIGZvciB0aGUgbWF0Y2hcbi8vIHRoZSBmdWxsIG1hdGNoIGJlZ2luIG11c3QgYmUgW2JlZm9yZU1hdGNoXVtiZWdpbl1cbmNvbnN0IGJlZm9yZU1hdGNoRXh0ID0gKG1vZGUsIHBhcmVudCkgPT4ge1xuICBpZiAoIW1vZGUuYmVmb3JlTWF0Y2gpIHJldHVybjtcbiAgLy8gc3RhcnRzIGNvbmZsaWN0cyB3aXRoIGVuZHNQYXJlbnQgd2hpY2ggd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGNoaWxkXG4gIC8vIHJ1bGUgaXMgbm90IG1hdGNoZWQgbXVsdGlwbGUgdGltZXNcbiAgaWYgKG1vZGUuc3RhcnRzKSB0aHJvdyBuZXcgRXJyb3IoXCJiZWZvcmVNYXRjaCBjYW5ub3QgYmUgdXNlZCB3aXRoIHN0YXJ0c1wiKTtcblxuICBjb25zdCBvcmlnaW5hbE1vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlKTtcbiAgT2JqZWN0LmtleXMobW9kZSkuZm9yRWFjaCgoa2V5KSA9PiB7IGRlbGV0ZSBtb2RlW2tleV07IH0pO1xuXG4gIG1vZGUua2V5d29yZHMgPSBvcmlnaW5hbE1vZGUua2V5d29yZHM7XG4gIG1vZGUuYmVnaW4gPSBjb25jYXQob3JpZ2luYWxNb2RlLmJlZm9yZU1hdGNoLCBsb29rYWhlYWQob3JpZ2luYWxNb2RlLmJlZ2luKSk7XG4gIG1vZGUuc3RhcnRzID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogW1xuICAgICAgT2JqZWN0LmFzc2lnbihvcmlnaW5hbE1vZGUsIHsgZW5kc1BhcmVudDogdHJ1ZSB9KVxuICAgIF1cbiAgfTtcbiAgbW9kZS5yZWxldmFuY2UgPSAwO1xuXG4gIGRlbGV0ZSBvcmlnaW5hbE1vZGUuYmVmb3JlTWF0Y2g7XG59O1xuXG4vLyBrZXl3b3JkcyB0aGF0IHNob3VsZCBoYXZlIG5vIGRlZmF1bHQgcmVsZXZhbmNlIHZhbHVlXG5jb25zdCBDT01NT05fS0VZV09SRFMgPSBbXG4gICdvZicsXG4gICdhbmQnLFxuICAnZm9yJyxcbiAgJ2luJyxcbiAgJ25vdCcsXG4gICdvcicsXG4gICdpZicsXG4gICd0aGVuJyxcbiAgJ3BhcmVudCcsIC8vIGNvbW1vbiB2YXJpYWJsZSBuYW1lXG4gICdsaXN0JywgLy8gY29tbW9uIHZhcmlhYmxlIG5hbWVcbiAgJ3ZhbHVlJyAvLyBjb21tb24gdmFyaWFibGUgbmFtZVxuXTtcblxuY29uc3QgREVGQVVMVF9LRVlXT1JEX1NDT1BFID0gXCJrZXl3b3JkXCI7XG5cbi8qKlxuICogR2l2ZW4gcmF3IGtleXdvcmRzIGZyb20gYSBsYW5ndWFnZSBkZWZpbml0aW9uLCBjb21waWxlIHRoZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLHN0cmluZ3xzdHJpbmdbXT4gfCBBcnJheTxzdHJpbmc+fSByYXdLZXl3b3Jkc1xuICogQHBhcmFtIHtib29sZWFufSBjYXNlSW5zZW5zaXRpdmVcbiAqL1xuZnVuY3Rpb24gY29tcGlsZUtleXdvcmRzKHJhd0tleXdvcmRzLCBjYXNlSW5zZW5zaXRpdmUsIHNjb3BlTmFtZSA9IERFRkFVTFRfS0VZV09SRF9TQ09QRSkge1xuICAvKiogQHR5cGUgS2V5d29yZERpY3QgKi9cbiAgY29uc3QgY29tcGlsZWRLZXl3b3JkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gaW5wdXQgY2FuIGJlIGEgc3RyaW5nIG9mIGtleXdvcmRzLCBhbiBhcnJheSBvZiBrZXl3b3Jkcywgb3IgYSBvYmplY3Qgd2l0aFxuICAvLyBuYW1lZCBrZXlzIHJlcHJlc2VudGluZyBzY29wZU5hbWUgKHdoaWNoIGNhbiB0aGVuIHBvaW50IHRvIGEgc3RyaW5nIG9yIGFycmF5KVxuICBpZiAodHlwZW9mIHJhd0tleXdvcmRzID09PSAnc3RyaW5nJykge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMuc3BsaXQoXCIgXCIpKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJhd0tleXdvcmRzKSkge1xuICAgIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwgcmF3S2V5d29yZHMpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzKHJhd0tleXdvcmRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNjb3BlTmFtZSkge1xuICAgICAgLy8gY29sbGFwc2UgYWxsIG91ciBvYmplY3RzIGJhY2sgaW50byB0aGUgcGFyZW50IG9iamVjdFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgY29tcGlsZWRLZXl3b3JkcyxcbiAgICAgICAgY29tcGlsZUtleXdvcmRzKHJhd0tleXdvcmRzW3Njb3BlTmFtZV0sIGNhc2VJbnNlbnNpdGl2ZSwgc2NvcGVOYW1lKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tcGlsZWRLZXl3b3JkcztcblxuICAvLyAtLS1cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBsaXN0IG9mIGtleXdvcmRzXG4gICAqXG4gICAqIEV4OiBcImZvciBpZiB3aGVuIHdoaWxlfDVcIlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVOYW1lXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2V5d29yZExpc3RcbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjb3BlTmFtZSwga2V5d29yZExpc3QpIHtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBrZXl3b3JkTGlzdCA9IGtleXdvcmRMaXN0Lm1hcCh4ID0+IHgudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICAgIGtleXdvcmRMaXN0LmZvckVhY2goZnVuY3Rpb24oa2V5d29yZCkge1xuICAgICAgY29uc3QgcGFpciA9IGtleXdvcmQuc3BsaXQoJ3wnKTtcbiAgICAgIGNvbXBpbGVkS2V5d29yZHNbcGFpclswXV0gPSBbc2NvcGVOYW1lLCBzY29yZUZvcktleXdvcmQocGFpclswXSwgcGFpclsxXSldO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvcGVyIHNjb3JlIGZvciBhIGdpdmVuIGtleXdvcmRcbiAqXG4gKiBBbHNvIHRha2VzIGludG8gYWNjb3VudCBjb21tZW50IGtleXdvcmRzLCB3aGljaCB3aWxsIGJlIHNjb3JlZCAwIFVOTEVTU1xuICogYW5vdGhlciBzY29yZSBoYXMgYmVlbiBtYW51YWxseSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3ZpZGVkU2NvcmVdXG4gKi9cbmZ1bmN0aW9uIHNjb3JlRm9yS2V5d29yZChrZXl3b3JkLCBwcm92aWRlZFNjb3JlKSB7XG4gIC8vIG1hbnVhbCBzY29yZXMgYWx3YXlzIHdpbiBvdmVyIGNvbW1vbiBrZXl3b3Jkc1xuICAvLyBzbyB5b3UgY2FuIGZvcmNlIGEgc2NvcmUgb2YgMSBpZiB5b3UgcmVhbGx5IGluc2lzdFxuICBpZiAocHJvdmlkZWRTY29yZSkge1xuICAgIHJldHVybiBOdW1iZXIocHJvdmlkZWRTY29yZSk7XG4gIH1cblxuICByZXR1cm4gY29tbW9uS2V5d29yZChrZXl3b3JkKSA/IDAgOiAxO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBnaXZlbiBrZXl3b3JkIGlzIGNvbW1vbiBvciBub3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZCAqL1xuZnVuY3Rpb24gY29tbW9uS2V5d29yZChrZXl3b3JkKSB7XG4gIHJldHVybiBDT01NT05fS0VZV09SRFMuaW5jbHVkZXMoa2V5d29yZC50b0xvd2VyQ2FzZSgpKTtcbn1cblxuLypcblxuRm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgcGxlYXNlIHNlZTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzI4ODAjaXNzdWVjb21tZW50LTc0NzI3NTQxOVxuXG4qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuPn1cbiAqL1xuY29uc3Qgc2VlbkRlcHJlY2F0aW9ucyA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmNvbnN0IGVycm9yID0gKG1lc3NhZ2UpID0+IHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7YW55fSBhcmdzXG4gKi9cbmNvbnN0IHdhcm4gPSAobWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICBjb25zb2xlLmxvZyhgV0FSTjogJHttZXNzYWdlfWAsIC4uLmFyZ3MpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuY29uc3QgZGVwcmVjYXRlZCA9ICh2ZXJzaW9uLCBtZXNzYWdlKSA9PiB7XG4gIGlmIChzZWVuRGVwcmVjYXRpb25zW2Ake3ZlcnNpb259LyR7bWVzc2FnZX1gXSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUubG9nKGBEZXByZWNhdGVkIGFzIG9mICR7dmVyc2lvbn0uICR7bWVzc2FnZX1gKTtcbiAgc2VlbkRlcHJlY2F0aW9uc1tgJHt2ZXJzaW9ufS8ke21lc3NhZ2V9YF0gPSB0cnVlO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdGhyb3ctbGl0ZXJhbCAqL1xuXG4vKipcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkNvbXBpbGVkTW9kZX0gQ29tcGlsZWRNb2RlXG4qL1xuXG5jb25zdCBNdWx0aUNsYXNzRXJyb3IgPSBuZXcgRXJyb3IoKTtcblxuLyoqXG4gKiBSZW51bWJlcnMgbGFiZWxlZCBzY29wZSBuYW1lcyB0byBhY2NvdW50IGZvciBhZGRpdGlvbmFsIGlubmVyIG1hdGNoXG4gKiBncm91cHMgdGhhdCBvdGhlcndpc2Ugd291bGQgYnJlYWsgZXZlcnl0aGluZy5cbiAqXG4gKiBMZXRzIHNheSB3ZSAzIG1hdGNoIHNjb3BlczpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCAzID0+IC4uLiB9XG4gKlxuICogU28gd2hhdCB3ZSBuZWVkIGlzIGEgY2xlYW4gbWF0Y2ggbGlrZSB0aGlzOlxuICpcbiAqICAgKGEpKGIpKGMpID0+IFsgXCJhXCIsIFwiYlwiLCBcImNcIiBdXG4gKlxuICogQnV0IHRoaXMgZmFsbHMgYXBhcnQgd2l0aCBpbm5lciBtYXRjaCBncm91cHM6XG4gKlxuICogKGEpKCgoYikpKShjKSA9PiBbXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJiXCIsIFwiY1wiIF1cbiAqXG4gKiBPdXIgc2NvcGVzIGFyZSBub3cgXCJvdXQgb2YgYWxpZ25tZW50XCIgYW5kIHdlJ3JlIHJlcGVhdGluZyBgYmAgMyB0aW1lcy5cbiAqIFdoYXQgbmVlZHMgdG8gaGFwcGVuIGlzIHRoZSBudW1iZXJzIGFyZSByZW1hcHBlZDpcbiAqXG4gKiAgIHsgMSA9PiAuLi4sIDIgPT4gLi4uLCA1ID0+IC4uLiB9XG4gKlxuICogV2UgYWxzbyBuZWVkIHRvIGtub3cgdGhhdCB0aGUgT05MWSBncm91cHMgdGhhdCBzaG91bGQgYmUgb3V0cHV0XG4gKiBhcmUgMSwgMiwgYW5kIDUuICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBiZWhhdmlvci5cbiAqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICogQHBhcmFtIHtBcnJheTxSZWdFeHAgfCBzdHJpbmc+fSByZWdleGVzXG4gKiBAcGFyYW0ge3trZXk6IFwiYmVnaW5TY29wZVwifFwiZW5kU2NvcGVcIn19IG9wdHNcbiAqL1xuZnVuY3Rpb24gcmVtYXBTY29wZU5hbWVzKG1vZGUsIHJlZ2V4ZXMsIHsga2V5IH0pIHtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGNvbnN0IHNjb3BlTmFtZXMgPSBtb2RlW2tleV07XG4gIC8qKiBAdHlwZSBSZWNvcmQ8bnVtYmVyLGJvb2xlYW4+ICovXG4gIGNvbnN0IGVtaXQgPSB7fTtcbiAgLyoqIEB0eXBlIFJlY29yZDxudW1iZXIsc3RyaW5nPiAqL1xuICBjb25zdCBwb3NpdGlvbnMgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSByZWdleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcG9zaXRpb25zW2kgKyBvZmZzZXRdID0gc2NvcGVOYW1lc1tpXTtcbiAgICBlbWl0W2kgKyBvZmZzZXRdID0gdHJ1ZTtcbiAgICBvZmZzZXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZWdleGVzW2kgLSAxXSk7XG4gIH1cbiAgLy8gd2UgdXNlIF9lbWl0IHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWF0Y2ggZ3JvdXBzIGFyZSBcInRvcC1sZXZlbFwiIHRvIGF2b2lkIGRvdWJsZVxuICAvLyBvdXRwdXQgZnJvbSBpbnNpZGUgbWF0Y2ggZ3JvdXBzXG4gIG1vZGVba2V5XSA9IHBvc2l0aW9ucztcbiAgbW9kZVtrZXldLl9lbWl0ID0gZW1pdDtcbiAgbW9kZVtrZXldLl9tdWx0aSA9IHRydWU7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gYmVnaW5NdWx0aUNsYXNzKG1vZGUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGUuYmVnaW4pKSByZXR1cm47XG5cbiAgaWYgKG1vZGUuc2tpcCB8fCBtb2RlLmV4Y2x1ZGVCZWdpbiB8fCBtb2RlLnJldHVybkJlZ2luKSB7XG4gICAgZXJyb3IoXCJza2lwLCBleGNsdWRlQmVnaW4sIHJldHVybkJlZ2luIG5vdCBjb21wYXRpYmxlIHdpdGggYmVnaW5TY29wZToge31cIik7XG4gICAgdGhyb3cgTXVsdGlDbGFzc0Vycm9yO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2RlLmJlZ2luU2NvcGUgIT09IFwib2JqZWN0XCIgfHwgbW9kZS5iZWdpblNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJiZWdpblNjb3BlIG11c3QgYmUgb2JqZWN0XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIHJlbWFwU2NvcGVOYW1lcyhtb2RlLCBtb2RlLmJlZ2luLCB7IGtleTogXCJiZWdpblNjb3BlXCIgfSk7XG4gIG1vZGUuYmVnaW4gPSBfcmV3cml0ZUJhY2tyZWZlcmVuY2VzKG1vZGUuYmVnaW4sIHsgam9pbldpdGg6IFwiXCIgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAqL1xuZnVuY3Rpb24gZW5kTXVsdGlDbGFzcyhtb2RlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShtb2RlLmVuZCkpIHJldHVybjtcblxuICBpZiAobW9kZS5za2lwIHx8IG1vZGUuZXhjbHVkZUVuZCB8fCBtb2RlLnJldHVybkVuZCkge1xuICAgIGVycm9yKFwic2tpcCwgZXhjbHVkZUVuZCwgcmV0dXJuRW5kIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kU2NvcGU6IHt9XCIpO1xuICAgIHRocm93IE11bHRpQ2xhc3NFcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSAhPT0gXCJvYmplY3RcIiB8fCBtb2RlLmVuZFNjb3BlID09PSBudWxsKSB7XG4gICAgZXJyb3IoXCJlbmRTY29wZSBtdXN0IGJlIG9iamVjdFwiKTtcbiAgICB0aHJvdyBNdWx0aUNsYXNzRXJyb3I7XG4gIH1cblxuICByZW1hcFNjb3BlTmFtZXMobW9kZSwgbW9kZS5lbmQsIHsga2V5OiBcImVuZFNjb3BlXCIgfSk7XG4gIG1vZGUuZW5kID0gX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyhtb2RlLmVuZCwgeyBqb2luV2l0aDogXCJcIiB9KTtcbn1cblxuLyoqXG4gKiB0aGlzIGV4aXN0cyBvbmx5IHRvIGFsbG93IGBzY29wZToge31gIHRvIGJlIHVzZWQgYmVzaWRlIGBtYXRjaDpgXG4gKiBPdGhlcndpc2UgYGJlZ2luU2NvcGVgIHdvdWxkIG5lY2Vzc2FyeSBhbmQgdGhhdCB3b3VsZCBsb29rIHdlaXJkXG5cbiAge1xuICAgIG1hdGNoOiBbIC9kZWYvLCAvXFx3Ky8gXVxuICAgIHNjb3BlOiB7IDE6IFwia2V5d29yZFwiICwgMjogXCJ0aXRsZVwiIH1cbiAgfVxuXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBzY29wZVN1Z2FyKG1vZGUpIHtcbiAgaWYgKG1vZGUuc2NvcGUgJiYgdHlwZW9mIG1vZGUuc2NvcGUgPT09IFwib2JqZWN0XCIgJiYgbW9kZS5zY29wZSAhPT0gbnVsbCkge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IG1vZGUuc2NvcGU7XG4gICAgZGVsZXRlIG1vZGUuc2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBpbGVkTW9kZX0gbW9kZVxuICovXG5mdW5jdGlvbiBNdWx0aUNsYXNzKG1vZGUpIHtcbiAgc2NvcGVTdWdhcihtb2RlKTtcblxuICBpZiAodHlwZW9mIG1vZGUuYmVnaW5TY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuYmVnaW5TY29wZSA9IHsgX3dyYXA6IG1vZGUuYmVnaW5TY29wZSB9O1xuICB9XG4gIGlmICh0eXBlb2YgbW9kZS5lbmRTY29wZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIG1vZGUuZW5kU2NvcGUgPSB7IF93cmFwOiBtb2RlLmVuZFNjb3BlIH07XG4gIH1cblxuICBiZWdpbk11bHRpQ2xhc3MobW9kZSk7XG4gIGVuZE11bHRpQ2xhc3MobW9kZSk7XG59XG5cbi8qKlxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTW9kZX0gTW9kZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRNb2RlfSBDb21waWxlZE1vZGVcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkxhbmd1YWdlfSBMYW5ndWFnZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU1BsdWdpbn0gSExKU1BsdWdpblxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRMYW5ndWFnZX0gQ29tcGlsZWRMYW5ndWFnZVxuKi9cblxuLy8gY29tcGlsYXRpb25cblxuLyoqXG4gKiBDb21waWxlcyBhIGxhbmd1YWdlIGRlZmluaXRpb24gcmVzdWx0XG4gKlxuICogR2l2ZW4gdGhlIHJhdyByZXN1bHQgb2YgYSBsYW5ndWFnZSBkZWZpbml0aW9uIChMYW5ndWFnZSksIGNvbXBpbGVzIHRoaXMgc29cbiAqIHRoYXQgaXQgaXMgcmVhZHkgZm9yIGhpZ2hsaWdodGluZyBjb2RlLlxuICogQHBhcmFtIHtMYW5ndWFnZX0gbGFuZ3VhZ2VcbiAqIEByZXR1cm5zIHtDb21waWxlZExhbmd1YWdlfVxuICovXG5mdW5jdGlvbiBjb21waWxlTGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHJlZ2V4IHdpdGggdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHAgfCBzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dsb2JhbF1cbiAgICovXG4gIGZ1bmN0aW9uIGxhbmdSZSh2YWx1ZSwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBzb3VyY2UodmFsdWUpLFxuICAgICAgJ20nXG4gICAgICArIChsYW5ndWFnZS5jYXNlX2luc2Vuc2l0aXZlID8gJ2knIDogJycpXG4gICAgICArIChsYW5ndWFnZS51bmljb2RlUmVnZXggPyAndScgOiAnJylcbiAgICAgICsgKGdsb2JhbCA/ICdnJyA6ICcnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICBTdG9yZXMgbXVsdGlwbGUgcmVndWxhciBleHByZXNzaW9ucyBhbmQgYWxsb3dzIHlvdSB0byBxdWlja2x5IHNlYXJjaCBmb3JcbiAgICB0aGVtIGFsbCBpbiBhIHN0cmluZyBzaW11bHRhbmVvdXNseSAtIHJldHVybmluZyB0aGUgZmlyc3QgbWF0Y2guICBJdCBkb2VzXG4gICAgdGhpcyBieSBjcmVhdGluZyBhIGh1Z2UgKGF8YnxjKSByZWdleCAtIGVhY2ggaW5kaXZpZHVhbCBpdGVtIHdyYXBwZWQgd2l0aCAoKVxuICAgIGFuZCBqb2luZWQgYnkgYHxgIC0gdXNpbmcgbWF0Y2ggZ3JvdXBzIHRvIHRyYWNrIHBvc2l0aW9uLiAgV2hlbiBhIG1hdGNoIGlzXG4gICAgZm91bmQgY2hlY2tpbmcgd2hpY2ggcG9zaXRpb24gaW4gdGhlIGFycmF5IGhhcyBjb250ZW50IGFsbG93cyB1cyB0byBmaWd1cmVcbiAgICBvdXQgd2hpY2ggb2YgdGhlIG9yaWdpbmFsIHJlZ2V4ZXMgLyBtYXRjaCBncm91cHMgdHJpZ2dlcmVkIHRoZSBtYXRjaC5cblxuICAgIFRoZSBtYXRjaCBvYmplY3QgaXRzZWxmICh0aGUgcmVzdWx0IG9mIGBSZWdleC5leGVjYCkgaXMgcmV0dXJuZWQgYnV0IGFsc29cbiAgICBlbmhhbmNlZCBieSBtZXJnaW5nIGluIGFueSBtZXRhLWRhdGEgdGhhdCB3YXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZWdleC5cbiAgICBUaGlzIGlzIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG1vZGUgbWF0Y2hlZCwgYW5kIHdoYXQgdHlwZSBvZiBydWxlXG4gICAgKGBpbGxlZ2FsYCwgYGJlZ2luYCwgZW5kLCBldGMpLlxuICAqL1xuICBjbGFzcyBNdWx0aVJlZ2V4IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzID0ge307XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlZ2V4ZXMgPSBbXTtcbiAgICAgIHRoaXMubWF0Y2hBdCA9IDE7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYWRkUnVsZShyZSwgb3B0cykge1xuICAgICAgb3B0cy5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb24rKztcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMubWF0Y2hJbmRleGVzW3RoaXMubWF0Y2hBdF0gPSBvcHRzO1xuICAgICAgdGhpcy5yZWdleGVzLnB1c2goW29wdHMsIHJlXSk7XG4gICAgICB0aGlzLm1hdGNoQXQgKz0gY291bnRNYXRjaEdyb3VwcyhyZSkgKyAxO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICBpZiAodGhpcy5yZWdleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBhdm9pZHMgdGhlIG5lZWQgdG8gY2hlY2sgbGVuZ3RoIGV2ZXJ5IHRpbWUgZXhlYyBpcyBjYWxsZWRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmV4ZWMgPSAoKSA9PiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdGVybWluYXRvcnMgPSB0aGlzLnJlZ2V4ZXMubWFwKGVsID0+IGVsWzFdKTtcbiAgICAgIHRoaXMubWF0Y2hlclJlID0gbGFuZ1JlKF9yZXdyaXRlQmFja3JlZmVyZW5jZXModGVybWluYXRvcnMsIHsgam9pbldpdGg6ICd8JyB9KSwgdHJ1ZSk7XG4gICAgICB0aGlzLmxhc3RJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBzICovXG4gICAgZXhlYyhzKSB7XG4gICAgICB0aGlzLm1hdGNoZXJSZS5sYXN0SW5kZXggPSB0aGlzLmxhc3RJbmRleDtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaGVyUmUuZXhlYyhzKTtcbiAgICAgIGlmICghbWF0Y2gpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICAgICAgY29uc3QgaSA9IG1hdGNoLmZpbmRJbmRleCgoZWwsIGkpID0+IGkgPiAwICYmIGVsICE9PSB1bmRlZmluZWQpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbWF0Y2hEYXRhID0gdGhpcy5tYXRjaEluZGV4ZXNbaV07XG4gICAgICAvLyB0cmltIG9mZiBhbnkgZWFybGllciBub24tcmVsZXZhbnQgbWF0Y2ggZ3JvdXBzIChpZSwgdGhlIG90aGVyIHJlZ2V4XG4gICAgICAvLyBtYXRjaCBncm91cHMgdGhhdCBtYWtlIHVwIHRoZSBtdWx0aS1tYXRjaGVyKVxuICAgICAgbWF0Y2guc3BsaWNlKDAsIGkpO1xuXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihtYXRjaCwgbWF0Y2hEYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgIENyZWF0ZWQgdG8gc29sdmUgdGhlIGtleSBkZWZpY2llbnRseSB3aXRoIE11bHRpUmVnZXggLSB0aGVyZSBpcyBubyB3YXkgdG9cbiAgICB0ZXN0IGZvciBtdWx0aXBsZSBtYXRjaGVzIGF0IGEgc2luZ2xlIGxvY2F0aW9uLiAgV2h5IHdvdWxkIHdlIG5lZWQgdG8gZG9cbiAgICB0aGF0PyAgSW4gdGhlIGZ1dHVyZSBhIG1vcmUgZHluYW1pYyBlbmdpbmUgd2lsbCBhbGxvdyBjZXJ0YWluIG1hdGNoZXMgdG8gYmVcbiAgICBpZ25vcmVkLiAgQW4gZXhhbXBsZTogaWYgd2UgbWF0Y2hlZCBzYXkgdGhlIDNyZCByZWdleCBpbiBhIGxhcmdlIGdyb3VwIGJ1dFxuICAgIGRlY2lkZWQgdG8gaWdub3JlIGl0IC0gd2UnZCBuZWVkIHRvIHN0YXJ0ZWQgdGVzdGluZyBhZ2FpbiBhdCB0aGUgNHRoXG4gICAgcmVnZXguLi4gYnV0IE11bHRpUmVnZXggaXRzZWxmIGdpdmVzIHVzIG5vIHJlYWwgd2F5IHRvIGRvIHRoYXQuXG5cbiAgICBTbyB3aGF0IHRoaXMgY2xhc3MgY3JlYXRlcyBNdWx0aVJlZ2V4cyBvbiB0aGUgZmx5IGZvciB3aGF0ZXZlciBzZWFyY2hcbiAgICBwb3NpdGlvbiB0aGV5IGFyZSBuZWVkZWQuXG5cbiAgICBOT1RFOiBUaGVzZSBhZGRpdGlvbmFsIE11bHRpUmVnZXggb2JqZWN0cyBhcmUgY3JlYXRlZCBkeW5hbWljYWxseS4gIEZvciBtb3N0XG4gICAgZ3JhbW1hcnMgbW9zdCBvZiB0aGUgdGltZSB3ZSB3aWxsIG5ldmVyIGFjdHVhbGx5IG5lZWQgYW55dGhpbmcgbW9yZSB0aGFuIHRoZVxuICAgIGZpcnN0IE11bHRpUmVnZXggLSBzbyB0aGlzIHNob3VsZG4ndCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkLlxuXG4gICAgU2F5IHRoaXMgaXMgb3VyIHNlYXJjaCBncm91cCwgYW5kIHdlIG1hdGNoIHJlZ2V4MywgYnV0IHdpc2ggdG8gaWdub3JlIGl0LlxuXG4gICAgICByZWdleDEgfCByZWdleDIgfCByZWdleDMgfCByZWdleDQgfCByZWdleDUgICAgJyBpZSwgc3RhcnRBdCA9IDBcblxuICAgIFdoYXQgd2UgbmVlZCBpcyBhIG5ldyBNdWx0aVJlZ2V4IHRoYXQgb25seSBpbmNsdWRlcyB0aGUgcmVtYWluaW5nXG4gICAgcG9zc2liaWxpdGllczpcblxuICAgICAgcmVnZXg0IHwgcmVnZXg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgaWUsIHN0YXJ0QXQgPSAzXG5cbiAgICBUaGlzIGNsYXNzIHdyYXBzIGFsbCB0aGF0IGNvbXBsZXhpdHkgdXAgaW4gYSBzaW1wbGUgQVBJLi4uIGBzdGFydEF0YCBkZWNpZGVzXG4gICAgd2hlcmUgaW4gdGhlIGFycmF5IG9mIGV4cHJlc3Npb25zIHRvIHN0YXJ0IGRvaW5nIHRoZSBtYXRjaGluZy4gSXRcbiAgICBhdXRvLWluY3JlbWVudHMsIHNvIGlmIGEgbWF0Y2ggaXMgZm91bmQgYXQgcG9zaXRpb24gMiwgdGhlbiBzdGFydEF0IHdpbGwgYmVcbiAgICBzZXQgdG8gMy4gIElmIHRoZSBlbmQgaXMgcmVhY2hlZCBzdGFydEF0IHdpbGwgcmV0dXJuIHRvIDAuXG5cbiAgICBNT1NUIG9mIHRoZSB0aW1lIHRoZSBwYXJzZXIgd2lsbCBiZSBzZXR0aW5nIHN0YXJ0QXQgbWFudWFsbHkgdG8gMC5cbiAgKi9cbiAgY2xhc3MgUmVzdW1hYmxlTXVsdGlSZWdleCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJ1bGVzID0gW107XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm11bHRpUmVnZXhlcyA9IFtdO1xuICAgICAgdGhpcy5jb3VudCA9IDA7XG5cbiAgICAgIHRoaXMubGFzdEluZGV4ID0gMDtcbiAgICAgIHRoaXMucmVnZXhJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGdldE1hdGNoZXIoaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpUmVnZXhlc1tpbmRleF0pIHJldHVybiB0aGlzLm11bHRpUmVnZXhlc1tpbmRleF07XG5cbiAgICAgIGNvbnN0IG1hdGNoZXIgPSBuZXcgTXVsdGlSZWdleCgpO1xuICAgICAgdGhpcy5ydWxlcy5zbGljZShpbmRleCkuZm9yRWFjaCgoW3JlLCBvcHRzXSkgPT4gbWF0Y2hlci5hZGRSdWxlKHJlLCBvcHRzKSk7XG4gICAgICBtYXRjaGVyLmNvbXBpbGUoKTtcbiAgICAgIHRoaXMubXVsdGlSZWdleGVzW2luZGV4XSA9IG1hdGNoZXI7XG4gICAgICByZXR1cm4gbWF0Y2hlcjtcbiAgICB9XG5cbiAgICByZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2V4SW5kZXggIT09IDA7XG4gICAgfVxuXG4gICAgY29uc2lkZXJBbGwoKSB7XG4gICAgICB0aGlzLnJlZ2V4SW5kZXggPSAwO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBhZGRSdWxlKHJlLCBvcHRzKSB7XG4gICAgICB0aGlzLnJ1bGVzLnB1c2goW3JlLCBvcHRzXSk7XG4gICAgICBpZiAob3B0cy50eXBlID09PSBcImJlZ2luXCIpIHRoaXMuY291bnQrKztcbiAgICB9XG5cbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IHMgKi9cbiAgICBleGVjKHMpIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLmdldE1hdGNoZXIodGhpcy5yZWdleEluZGV4KTtcbiAgICAgIG0ubGFzdEluZGV4ID0gdGhpcy5sYXN0SW5kZXg7XG4gICAgICBsZXQgcmVzdWx0ID0gbS5leGVjKHMpO1xuXG4gICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugd2UgaGF2ZSBubyBlYXN5IHdheSB0byBzYXkgXCJyZXN1bWUgc2Nhbm5pbmcgYXQgdGhlXG4gICAgICAvLyBleGlzdGluZyBwb3NpdGlvbiBidXQgYWxzbyBza2lwIHRoZSBjdXJyZW50IHJ1bGUgT05MWVwiLiBXaGF0IGhhcHBlbnMgaXNcbiAgICAgIC8vIGFsbCBwcmlvciBydWxlcyBhcmUgYWxzbyBza2lwcGVkIHdoaWNoIGNhbiByZXN1bHQgaW4gbWF0Y2hpbmcgdGhlIHdyb25nXG4gICAgICAvLyB0aGluZy4gRXhhbXBsZSBvZiBtYXRjaGluZyBcImJvb2dlclwiOlxuXG4gICAgICAvLyBvdXIgbWF0Y2hlciBpcyBbc3RyaW5nLCBcImJvb2dlclwiLCBudW1iZXJdXG4gICAgICAvL1xuICAgICAgLy8gLi4uLmJvb2dlci4uLi5cblxuICAgICAgLy8gaWYgXCJib29nZXJcIiBpcyBpZ25vcmVkIHRoZW4gd2UnZCByZWFsbHkgbmVlZCBhIHJlZ2V4IHRvIHNjYW4gZnJvbSB0aGVcbiAgICAgIC8vIFNBTUUgcG9zaXRpb24gZm9yIG9ubHk6IFtzdHJpbmcsIG51bWJlcl0gYnV0IGlnbm9yaW5nIFwiYm9vZ2VyXCIgKGlmIGl0XG4gICAgICAvLyB3YXMgdGhlIGZpcnN0IG1hdGNoKSwgYSBzaW1wbGUgcmVzdW1lIHdvdWxkIHNjYW4gYWhlYWQgd2hvIGtub3dzIGhvd1xuICAgICAgLy8gZmFyIGxvb2tpbmcgb25seSBmb3IgXCJudW1iZXJcIiwgaWdub3JpbmcgcG90ZW50aWFsIHN0cmluZyBtYXRjaGVzIChvclxuICAgICAgLy8gZnV0dXJlIFwiYm9vZ2VyXCIgbWF0Y2hlcyB0aGF0IG1pZ2h0IGJlIHZhbGlkLilcblxuICAgICAgLy8gU28gd2hhdCB3ZSBkbzogV2UgZXhlY3V0ZSB0d28gbWF0Y2hlcnMsIG9uZSByZXN1bWluZyBhdCB0aGUgc2FtZVxuICAgICAgLy8gcG9zaXRpb24sIGJ1dCB0aGUgc2Vjb25kIGZ1bGwgbWF0Y2hlciBzdGFydGluZyBhdCB0aGUgcG9zaXRpb24gYWZ0ZXI6XG5cbiAgICAgIC8vICAgICAvLS0tIHJlc3VtZSBmaXJzdCByZWdleCBtYXRjaCBoZXJlIChmb3IgW251bWJlcl0pXG4gICAgICAvLyAgICAgfC8tLS0tIGZ1bGwgbWF0Y2ggaGVyZSBmb3IgW3N0cmluZywgXCJib29nZXJcIiwgbnVtYmVyXVxuICAgICAgLy8gICAgIHZ2XG4gICAgICAvLyAuLi4uYm9vZ2VyLi4uLlxuXG4gICAgICAvLyBXaGljaCBldmVyIHJlc3VsdHMgaW4gYSBtYXRjaCBmaXJzdCBpcyB0aGVuIHVzZWQuIFNvIHRoaXMgMy00IHN0ZXBcbiAgICAgIC8vIHByb2Nlc3MgZXNzZW50aWFsbHkgYWxsb3dzIHVzIHRvIHNheSBcIm1hdGNoIGF0IHRoaXMgcG9zaXRpb24sIGV4Y2x1ZGluZ1xuICAgICAgLy8gYSBwcmlvciBydWxlIHRoYXQgd2FzIGlnbm9yZWRcIi5cbiAgICAgIC8vXG4gICAgICAvLyAxLiBNYXRjaCBcImJvb2dlclwiIGZpcnN0LCBpZ25vcmUuIEFsc28gcHJvdmVzIHRoYXQgW3N0cmluZ10gZG9lcyBub24gbWF0Y2guXG4gICAgICAvLyAyLiBSZXN1bWUgbWF0Y2hpbmcgZm9yIFtudW1iZXJdXG4gICAgICAvLyAzLiBNYXRjaCBhdCBpbmRleCArIDEgZm9yIFtzdHJpbmcsIFwiYm9vZ2VyXCIsIG51bWJlcl1cbiAgICAgIC8vIDQuIElmICMyIGFuZCAjMyByZXN1bHQgaW4gbWF0Y2hlcywgd2hpY2ggY2FtZSBmaXJzdD9cbiAgICAgIGlmICh0aGlzLnJlc3VtaW5nU2NhbkF0U2FtZVBvc2l0aW9uKCkpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuaW5kZXggPT09IHRoaXMubGFzdEluZGV4KSA7IGVsc2UgeyAvLyB1c2UgdGhlIHNlY29uZCBtYXRjaGVyIHJlc3VsdFxuICAgICAgICAgIGNvbnN0IG0yID0gdGhpcy5nZXRNYXRjaGVyKDApO1xuICAgICAgICAgIG0yLmxhc3RJbmRleCA9IHRoaXMubGFzdEluZGV4ICsgMTtcbiAgICAgICAgICByZXN1bHQgPSBtMi5leGVjKHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5yZWdleEluZGV4ICs9IHJlc3VsdC5wb3NpdGlvbiArIDE7XG4gICAgICAgIGlmICh0aGlzLnJlZ2V4SW5kZXggPT09IHRoaXMuY291bnQpIHtcbiAgICAgICAgICAvLyB3cmFwLWFyb3VuZCB0byBjb25zaWRlcmluZyBhbGwgbWF0Y2hlcyBhZ2FpblxuICAgICAgICAgIHRoaXMuY29uc2lkZXJBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG1vZGUsIGJ1aWxkcyBhIGh1Z2UgUmVzdW1hYmxlTXVsdGlSZWdleCB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhbGtcbiAgICogdGhlIGNvbnRlbnQgYW5kIGZpbmQgbWF0Y2hlcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGVcbiAgICogQHJldHVybnMge1Jlc3VtYWJsZU11bHRpUmVnZXh9XG4gICAqL1xuICBmdW5jdGlvbiBidWlsZE1vZGVSZWdleChtb2RlKSB7XG4gICAgY29uc3QgbW0gPSBuZXcgUmVzdW1hYmxlTXVsdGlSZWdleCgpO1xuXG4gICAgbW9kZS5jb250YWlucy5mb3JFYWNoKHRlcm0gPT4gbW0uYWRkUnVsZSh0ZXJtLmJlZ2luLCB7IHJ1bGU6IHRlcm0sIHR5cGU6IFwiYmVnaW5cIiB9KSk7XG5cbiAgICBpZiAobW9kZS50ZXJtaW5hdG9yRW5kKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUudGVybWluYXRvckVuZCwgeyB0eXBlOiBcImVuZFwiIH0pO1xuICAgIH1cbiAgICBpZiAobW9kZS5pbGxlZ2FsKSB7XG4gICAgICBtbS5hZGRSdWxlKG1vZGUuaWxsZWdhbCwgeyB0eXBlOiBcImlsbGVnYWxcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW07XG4gIH1cblxuICAvKiogc2tpcCB2cyBhYm9ydCB2cyBpZ25vcmVcbiAgICpcbiAgICogQHNraXAgICAtIFRoZSBtb2RlIGlzIHN0aWxsIGVudGVyZWQgYW5kIGV4aXRlZCBub3JtYWxseSAoYW5kIGNvbnRhaW5zIHJ1bGVzIGFwcGx5KSxcbiAgICogICAgICAgICAgIGJ1dCBhbGwgY29udGVudCBpcyBoZWxkIGFuZCBhZGRlZCB0byB0aGUgcGFyZW50IGJ1ZmZlciByYXRoZXIgdGhhbiBiZWluZ1xuICAgKiAgICAgICAgICAgb3V0cHV0IHdoZW4gdGhlIG1vZGUgZW5kcy4gIE1vc3RseSB1c2VkIHdpdGggYHN1Ymxhbmd1YWdlYCB0byBidWlsZCB1cFxuICAgKiAgICAgICAgICAgYSBzaW5nbGUgbGFyZ2UgYnVmZmVyIHRoYW4gY2FuIGJlIHBhcnNlZCBieSBzdWJsYW5ndWFnZS5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBiZWdpbiBhbmRzIGVuZHMgbm9ybWFsbHkuXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGlzIGFkZGVkIHRvIHRoZSBwYXJlbnQgbW9kZSBidWZmZXIuXG4gICAqICAgICAgICAgICAgIC0gVGhlIHBhcnNlciBjdXJzb3IgaXMgbW92ZWQgZm9yd2FyZCBub3JtYWxseS5cbiAgICpcbiAgICogQGFib3J0ICAtIEEgaGFjayBwbGFjZWhvbGRlciB1bnRpbCB3ZSBoYXZlIGlnbm9yZS4gIEFib3J0cyB0aGUgbW9kZSAoYXMgaWYgaXRcbiAgICogICAgICAgICAgIG5ldmVyIG1hdGNoZWQpIGJ1dCBET0VTIE5PVCBjb250aW51ZSB0byBtYXRjaCBzdWJzZXF1ZW50IGBjb250YWluc2BcbiAgICogICAgICAgICAgIG1vZGVzLiAgQWJvcnQgaXMgYmFkL3N1Ym9wdGltYWwgYmVjYXVzZSBpdCBjYW4gcmVzdWx0IGluIG1vZGVzXG4gICAqICAgICAgICAgICBmYXJ0aGVyIGRvd24gbm90IGdldHRpbmcgYXBwbGllZCBiZWNhdXNlIGFuIGVhcmxpZXIgcnVsZSBlYXRzIHRoZVxuICAgKiAgICAgICAgICAgY29udGVudCBidXQgdGhlbiBhYm9ydHMuXG4gICAqXG4gICAqICAgICAgICAgICAgIC0gVGhlIG1vZGUgZG9lcyBub3QgYmVnaW4uXG4gICAqICAgICAgICAgICAgIC0gQ29udGVudCBtYXRjaGVkIGJ5IGBiZWdpbmAgaXMgYWRkZWQgdG8gdGhlIG1vZGUgYnVmZmVyLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG1vdmVkIGZvcndhcmQgYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBpZ25vcmUgLSBJZ25vcmVzIHRoZSBtb2RlIChhcyBpZiBpdCBuZXZlciBtYXRjaGVkKSBhbmQgY29udGludWVzIHRvIG1hdGNoIGFueVxuICAgKiAgICAgICAgICAgc3Vic2VxdWVudCBgY29udGFpbnNgIG1vZGVzLiAgSWdub3JlIGlzbid0IHRlY2huaWNhbGx5IHBvc3NpYmxlIHdpdGhcbiAgICogICAgICAgICAgIHRoZSBjdXJyZW50IHBhcnNlciBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogICAgICAgICAgICAgLSBUaGUgbW9kZSBkb2VzIG5vdCBiZWdpbi5cbiAgICogICAgICAgICAgICAgLSBDb250ZW50IG1hdGNoZWQgYnkgYGJlZ2luYCBpcyBpZ25vcmVkLlxuICAgKiAgICAgICAgICAgICAtIFRoZSBwYXJzZXIgY3Vyc29yIGlzIG5vdCBtb3ZlZCBmb3J3YXJkLlxuICAgKi9cblxuICAvKipcbiAgICogQ29tcGlsZXMgYW4gaW5kaXZpZHVhbCBtb2RlXG4gICAqXG4gICAqIFRoaXMgY2FuIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBtb2RlIGNvbnRhaW5zIGNlcnRhaW4gZGV0ZWN0YWJsZSBrbm93biBsb2dpY1xuICAgKiBpc3N1ZXMuXG4gICAqIEBwYXJhbSB7TW9kZX0gbW9kZVxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZSB8IG51bGx9IFtwYXJlbnRdXG4gICAqIEByZXR1cm5zIHtDb21waWxlZE1vZGUgfCBuZXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBpbGVNb2RlKG1vZGUsIHBhcmVudCkge1xuICAgIGNvbnN0IGNtb2RlID0gLyoqIEB0eXBlIENvbXBpbGVkTW9kZSAqLyAobW9kZSk7XG4gICAgaWYgKG1vZGUuaXNDb21waWxlZCkgcmV0dXJuIGNtb2RlO1xuXG4gICAgW1xuICAgICAgc2NvcGVDbGFzc05hbWUsXG4gICAgICAvLyBkbyB0aGlzIGVhcmx5IHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgZ2VuZXJhbGx5IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXRcbiAgICAgIC8vIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIG1hdGNoL2JlZ2luXG4gICAgICBjb21waWxlTWF0Y2gsXG4gICAgICBNdWx0aUNsYXNzLFxuICAgICAgYmVmb3JlTWF0Y2hFeHRcbiAgICBdLmZvckVhY2goZXh0ID0+IGV4dChtb2RlLCBwYXJlbnQpKTtcblxuICAgIGxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucy5mb3JFYWNoKGV4dCA9PiBleHQobW9kZSwgcGFyZW50KSk7XG5cbiAgICAvLyBfX2JlZm9yZUJlZ2luIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSBBUEksIGludGVybmFsIHVzZSBvbmx5XG4gICAgbW9kZS5fX2JlZm9yZUJlZ2luID0gbnVsbDtcblxuICAgIFtcbiAgICAgIGJlZ2luS2V5d29yZHMsXG4gICAgICAvLyBkbyB0aGlzIGxhdGVyIHNvIGNvbXBpbGVyIGV4dGVuc2lvbnMgdGhhdCBjb21lIGVhcmxpZXIgaGF2ZSBhY2Nlc3MgdG8gdGhlXG4gICAgICAvLyByYXcgYXJyYXkgaWYgdGhleSB3YW50ZWQgdG8gcGVyaGFwcyBtYW5pcHVsYXRlIGl0LCBldGMuXG4gICAgICBjb21waWxlSWxsZWdhbCxcbiAgICAgIC8vIGRlZmF1bHQgdG8gMSByZWxldmFuY2UgaWYgbm90IHNwZWNpZmllZFxuICAgICAgY29tcGlsZVJlbGV2YW5jZVxuICAgIF0uZm9yRWFjaChleHQgPT4gZXh0KG1vZGUsIHBhcmVudCkpO1xuXG4gICAgbW9kZS5pc0NvbXBpbGVkID0gdHJ1ZTtcblxuICAgIGxldCBrZXl3b3JkUGF0dGVybiA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBtb2RlLmtleXdvcmRzID09PSBcIm9iamVjdFwiICYmIG1vZGUua2V5d29yZHMuJHBhdHRlcm4pIHtcbiAgICAgIC8vIHdlIG5lZWQgYSBjb3B5IGJlY2F1c2Uga2V5d29yZHMgbWlnaHQgYmUgY29tcGlsZWQgbXVsdGlwbGUgdGltZXNcbiAgICAgIC8vIHNvIHdlIGNhbid0IGdvIGRlbGV0aW5nICRwYXR0ZXJuIGZyb20gdGhlIG9yaWdpbmFsIG9uIHRoZSBmaXJzdFxuICAgICAgLy8gcGFzc1xuICAgICAgbW9kZS5rZXl3b3JkcyA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGUua2V5d29yZHMpO1xuICAgICAga2V5d29yZFBhdHRlcm4gPSBtb2RlLmtleXdvcmRzLiRwYXR0ZXJuO1xuICAgICAgZGVsZXRlIG1vZGUua2V5d29yZHMuJHBhdHRlcm47XG4gICAgfVxuICAgIGtleXdvcmRQYXR0ZXJuID0ga2V5d29yZFBhdHRlcm4gfHwgL1xcdysvO1xuXG4gICAgaWYgKG1vZGUua2V5d29yZHMpIHtcbiAgICAgIG1vZGUua2V5d29yZHMgPSBjb21waWxlS2V5d29yZHMobW9kZS5rZXl3b3JkcywgbGFuZ3VhZ2UuY2FzZV9pbnNlbnNpdGl2ZSk7XG4gICAgfVxuXG4gICAgY21vZGUua2V5d29yZFBhdHRlcm5SZSA9IGxhbmdSZShrZXl3b3JkUGF0dGVybiwgdHJ1ZSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAoIW1vZGUuYmVnaW4pIG1vZGUuYmVnaW4gPSAvXFxCfFxcYi87XG4gICAgICBjbW9kZS5iZWdpblJlID0gbGFuZ1JlKGNtb2RlLmJlZ2luKTtcbiAgICAgIGlmICghbW9kZS5lbmQgJiYgIW1vZGUuZW5kc1dpdGhQYXJlbnQpIG1vZGUuZW5kID0gL1xcQnxcXGIvO1xuICAgICAgaWYgKG1vZGUuZW5kKSBjbW9kZS5lbmRSZSA9IGxhbmdSZShjbW9kZS5lbmQpO1xuICAgICAgY21vZGUudGVybWluYXRvckVuZCA9IHNvdXJjZShjbW9kZS5lbmQpIHx8ICcnO1xuICAgICAgaWYgKG1vZGUuZW5kc1dpdGhQYXJlbnQgJiYgcGFyZW50LnRlcm1pbmF0b3JFbmQpIHtcbiAgICAgICAgY21vZGUudGVybWluYXRvckVuZCArPSAobW9kZS5lbmQgPyAnfCcgOiAnJykgKyBwYXJlbnQudGVybWluYXRvckVuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZGUuaWxsZWdhbCkgY21vZGUuaWxsZWdhbFJlID0gbGFuZ1JlKC8qKiBAdHlwZSB7UmVnRXhwIHwgc3RyaW5nfSAqLyAobW9kZS5pbGxlZ2FsKSk7XG4gICAgaWYgKCFtb2RlLmNvbnRhaW5zKSBtb2RlLmNvbnRhaW5zID0gW107XG5cbiAgICBtb2RlLmNvbnRhaW5zID0gW10uY29uY2F0KC4uLm1vZGUuY29udGFpbnMubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBleHBhbmRPckNsb25lTW9kZShjID09PSAnc2VsZicgPyBtb2RlIDogYyk7XG4gICAgfSkpO1xuICAgIG1vZGUuY29udGFpbnMuZm9yRWFjaChmdW5jdGlvbihjKSB7IGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChjKSwgY21vZGUpOyB9KTtcblxuICAgIGlmIChtb2RlLnN0YXJ0cykge1xuICAgICAgY29tcGlsZU1vZGUobW9kZS5zdGFydHMsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgY21vZGUubWF0Y2hlciA9IGJ1aWxkTW9kZVJlZ2V4KGNtb2RlKTtcbiAgICByZXR1cm4gY21vZGU7XG4gIH1cblxuICBpZiAoIWxhbmd1YWdlLmNvbXBpbGVyRXh0ZW5zaW9ucykgbGFuZ3VhZ2UuY29tcGlsZXJFeHRlbnNpb25zID0gW107XG5cbiAgLy8gc2VsZiBpcyBub3QgdmFsaWQgYXQgdGhlIHRvcC1sZXZlbFxuICBpZiAobGFuZ3VhZ2UuY29udGFpbnMgJiYgbGFuZ3VhZ2UuY29udGFpbnMuaW5jbHVkZXMoJ3NlbGYnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkVSUjogY29udGFpbnMgYHNlbGZgIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIGxhbmd1YWdlLiAgU2VlIGRvY3VtZW50YXRpb24uXCIpO1xuICB9XG5cbiAgLy8gd2UgbmVlZCBhIG51bGwgb2JqZWN0LCB3aGljaCBpbmhlcml0IHdpbGwgZ3VhcmFudGVlXG4gIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXMgPSBpbmhlcml0JDEobGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlcyB8fCB7fSk7XG5cbiAgcmV0dXJuIGNvbXBpbGVNb2RlKC8qKiBAdHlwZSBNb2RlICovIChsYW5ndWFnZSkpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBtb2RlIGhhcyBhIGRlcGVuZGVuY3kgb24gaXQncyBwYXJlbnQgb3Igbm90XG4gKlxuICogSWYgYSBtb2RlIGRvZXMgaGF2ZSBhIHBhcmVudCBkZXBlbmRlbmN5IHRoZW4gb2Z0ZW4gd2UgbmVlZCB0byBjbG9uZSBpdCBpZlxuICogaXQncyB1c2VkIGluIG11bHRpcGxlIHBsYWNlcyBzbyB0aGF0IGVhY2ggY29weSBwb2ludHMgdG8gdGhlIGNvcnJlY3QgcGFyZW50LFxuICogd2hlcmUtYXMgbW9kZXMgd2l0aG91dCBhIHBhcmVudCBjYW4gb2Z0ZW4gc2FmZWx5IGJlIHJlLXVzZWQgYXQgdGhlIGJvdHRvbSBvZlxuICogYSBtb2RlIGNoYWluLlxuICpcbiAqIEBwYXJhbSB7TW9kZSB8IG51bGx9IG1vZGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIGlzIHRoZXJlIGEgZGVwZW5kZW5jeSBvbiB0aGUgcGFyZW50P1xuICogKi9cbmZ1bmN0aW9uIGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSB7XG4gIGlmICghbW9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBtb2RlLmVuZHNXaXRoUGFyZW50IHx8IGRlcGVuZGVuY3lPblBhcmVudChtb2RlLnN0YXJ0cyk7XG59XG5cbi8qKlxuICogRXhwYW5kcyBhIG1vZGUgb3IgY2xvbmVzIGl0IGlmIG5lY2Vzc2FyeVxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBtb2RlcyB3aXRoIHBhcmVudGFsIGRlcGVuZGVuY2VpcyAoc2VlIG5vdGVzIG9uXG4gKiBgZGVwZW5kZW5jeU9uUGFyZW50YCkgYW5kIGZvciBub2RlcyB0aGF0IGhhdmUgYHZhcmlhbnRzYCAtIHdoaWNoIG11c3QgdGhlbiBiZVxuICogZXhwbG9kZWQgaW50byB0aGVpciBvd24gaW5kaXZpZHVhbCBtb2RlcyBhdCBjb21waWxlIHRpbWUuXG4gKlxuICogQHBhcmFtIHtNb2RlfSBtb2RlXG4gKiBAcmV0dXJucyB7TW9kZSB8IE1vZGVbXX1cbiAqICovXG5mdW5jdGlvbiBleHBhbmRPckNsb25lTW9kZShtb2RlKSB7XG4gIGlmIChtb2RlLnZhcmlhbnRzICYmICFtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgbW9kZS5jYWNoZWRWYXJpYW50cyA9IG1vZGUudmFyaWFudHMubWFwKGZ1bmN0aW9uKHZhcmlhbnQpIHtcbiAgICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyB2YXJpYW50czogbnVsbCB9LCB2YXJpYW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEVYUEFORFxuICAvLyBpZiB3ZSBoYXZlIHZhcmlhbnRzIHRoZW4gZXNzZW50aWFsbHkgXCJyZXBsYWNlXCIgdGhlIG1vZGUgd2l0aCB0aGUgdmFyaWFudHNcbiAgLy8gdGhpcyBoYXBwZW5zIGluIGNvbXBpbGVNb2RlLCB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tXG4gIGlmIChtb2RlLmNhY2hlZFZhcmlhbnRzKSB7XG4gICAgcmV0dXJuIG1vZGUuY2FjaGVkVmFyaWFudHM7XG4gIH1cblxuICAvLyBDTE9ORVxuICAvLyBpZiB3ZSBoYXZlIGRlcGVuZGVuY2llcyBvbiBwYXJlbnRzIHRoZW4gd2UgbmVlZCBhIHVuaXF1ZVxuICAvLyBpbnN0YW5jZSBvZiBvdXJzZWx2ZXMsIHNvIHdlIGNhbiBiZSByZXVzZWQgd2l0aCBtYW55XG4gIC8vIGRpZmZlcmVudCBwYXJlbnRzIHdpdGhvdXQgaXNzdWVcbiAgaWYgKGRlcGVuZGVuY3lPblBhcmVudChtb2RlKSkge1xuICAgIHJldHVybiBpbmhlcml0JDEobW9kZSwgeyBzdGFydHM6IG1vZGUuc3RhcnRzID8gaW5oZXJpdCQxKG1vZGUuc3RhcnRzKSA6IG51bGwgfSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmlzRnJvemVuKG1vZGUpKSB7XG4gICAgcmV0dXJuIGluaGVyaXQkMShtb2RlKTtcbiAgfVxuXG4gIC8vIG5vIHNwZWNpYWwgZGVwZW5kZW5jeSBpc3N1ZXMsIGp1c3QgcmV0dXJuIG91cnNlbHZlc1xuICByZXR1cm4gbW9kZTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjExLjYuMFwiO1xuXG5jbGFzcyBIVE1MSW5qZWN0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbiwgaHRtbCkge1xuICAgIHN1cGVyKHJlYXNvbik7XG4gICAgdGhpcy5uYW1lID0gXCJIVE1MSW5qZWN0aW9uRXJyb3JcIjtcbiAgICB0aGlzLmh0bWwgPSBodG1sO1xuICB9XG59XG5cbi8qXG5TeW50YXggaGlnaGxpZ2h0aW5nIHdpdGggbGFuZ3VhZ2UgYXV0b2RldGVjdGlvbi5cbmh0dHBzOi8vaGlnaGxpZ2h0anMub3JnL1xuKi9cblxuLyoqXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Nb2RlfSBNb2RlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5Db21waWxlZE1vZGV9IENvbXBpbGVkTW9kZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQ29tcGlsZWRTY29wZX0gQ29tcGlsZWRTY29wZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTGFuZ3VhZ2V9IExhbmd1YWdlXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5ITEpTQXBpfSBITEpTQXBpXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5ITEpTUGx1Z2lufSBITEpTUGx1Z2luXG5AdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5QbHVnaW5FdmVudH0gUGx1Z2luRXZlbnRcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhMSlNPcHRpb25zfSBITEpTT3B0aW9uc1xuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuTGFuZ3VhZ2VGbn0gTGFuZ3VhZ2VGblxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSGlnaGxpZ2h0ZWRIVE1MRWxlbWVudH0gSGlnaGxpZ2h0ZWRIVE1MRWxlbWVudFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuQmVmb3JlSGlnaGxpZ2h0Q29udGV4dH0gQmVmb3JlSGlnaGxpZ2h0Q29udGV4dFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5NYXRjaFR5cGV9IE1hdGNoVHlwZVxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5LZXl3b3JkRGF0YX0gS2V5d29yZERhdGFcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcy9wcml2YXRlJykuRW5oYW5jZWRNYXRjaH0gRW5oYW5jZWRNYXRjaFxuQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzL3ByaXZhdGUnKS5Bbm5vdGF0ZWRFcnJvcn0gQW5ub3RhdGVkRXJyb3JcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkF1dG9IaWdobGlnaHRSZXN1bHR9IEF1dG9IaWdobGlnaHRSZXN1bHRcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhpZ2hsaWdodE9wdGlvbnN9IEhpZ2hsaWdodE9wdGlvbnNcbkB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkhpZ2hsaWdodFJlc3VsdH0gSGlnaGxpZ2h0UmVzdWx0XG4qL1xuXG5cbmNvbnN0IGVzY2FwZSA9IGVzY2FwZUhUTUw7XG5jb25zdCBpbmhlcml0ID0gaW5oZXJpdCQxO1xuY29uc3QgTk9fTUFUQ0ggPSBTeW1ib2woXCJub21hdGNoXCIpO1xuY29uc3QgTUFYX0tFWVdPUkRfSElUUyA9IDc7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGhsanMgLSBvYmplY3QgdGhhdCBpcyBleHRlbmRlZCAobGVnYWN5KVxuICogQHJldHVybnMge0hMSlNBcGl9XG4gKi9cbmNvbnN0IEhMSlMgPSBmdW5jdGlvbihobGpzKSB7XG4gIC8vIEdsb2JhbCBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCB3aXRoaW4gdGhlIGhpZ2hsaWdodC5qcyBsaWJyYXJ5LlxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIExhbmd1YWdlPn0gKi9cbiAgY29uc3QgbGFuZ3VhZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBhbGlhc2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLyoqIEB0eXBlIHtITEpTUGx1Z2luW119ICovXG4gIGNvbnN0IHBsdWdpbnMgPSBbXTtcblxuICAvLyBzYWZlL3Byb2R1Y3Rpb24gbW9kZSAtIHN3YWxsb3dzIG1vcmUgZXJyb3JzLCB0cmllcyB0byBrZWVwIHJ1bm5pbmdcbiAgLy8gZXZlbiBpZiBhIHNpbmdsZSBzeW50YXggb3IgcGFyc2UgaGl0cyBhIGZhdGFsIGVycm9yXG4gIGxldCBTQUZFX01PREUgPSB0cnVlO1xuICBjb25zdCBMQU5HVUFHRV9OT1RfRk9VTkQgPSBcIkNvdWxkIG5vdCBmaW5kIHRoZSBsYW5ndWFnZSAne30nLCBkaWQgeW91IGZvcmdldCB0byBsb2FkL2luY2x1ZGUgYSBsYW5ndWFnZSBtb2R1bGU/XCI7XG4gIC8qKiBAdHlwZSB7TGFuZ3VhZ2V9ICovXG4gIGNvbnN0IFBMQUlOVEVYVF9MQU5HVUFHRSA9IHsgZGlzYWJsZUF1dG9kZXRlY3Q6IHRydWUsIG5hbWU6ICdQbGFpbiB0ZXh0JywgY29udGFpbnM6IFtdIH07XG5cbiAgLy8gR2xvYmFsIG9wdGlvbnMgdXNlZCB3aGVuIHdpdGhpbiBleHRlcm5hbCBBUElzLiBUaGlzIGlzIG1vZGlmaWVkIHdoZW5cbiAgLy8gY2FsbGluZyB0aGUgYGhsanMuY29uZmlndXJlYCBmdW5jdGlvbi5cbiAgLyoqIEB0eXBlIEhMSlNPcHRpb25zICovXG4gIGxldCBvcHRpb25zID0ge1xuICAgIGlnbm9yZVVuZXNjYXBlZEhUTUw6IGZhbHNlLFxuICAgIHRocm93VW5lc2NhcGVkSFRNTDogZmFsc2UsXG4gICAgbm9IaWdobGlnaHRSZTogL14obm8tP2hpZ2hsaWdodCkkL2ksXG4gICAgbGFuZ3VhZ2VEZXRlY3RSZTogL1xcYmxhbmcoPzp1YWdlKT8tKFtcXHctXSspXFxiL2ksXG4gICAgY2xhc3NQcmVmaXg6ICdobGpzLScsXG4gICAgY3NzU2VsZWN0b3I6ICdwcmUgY29kZScsXG4gICAgbGFuZ3VhZ2VzOiBudWxsLFxuICAgIC8vIGJldGEgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzdWJqZWN0IHRvIGNoYW5nZSwgd2VsY29tZSB0byBkaXNjdXNzXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMTA4NlxuICAgIF9fZW1pdHRlcjogVG9rZW5UcmVlRW1pdHRlclxuICB9O1xuXG4gIC8qIFV0aWxpdHkgZnVuY3Rpb25zICovXG5cbiAgLyoqXG4gICAqIFRlc3RzIGEgbGFuZ3VhZ2UgbmFtZSB0byBzZWUgaWYgaGlnaGxpZ2h0aW5nIHNob3VsZCBiZSBza2lwcGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZU5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZE5vdEhpZ2hsaWdodChsYW5ndWFnZU5hbWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5ub0hpZ2hsaWdodFJlLnRlc3QobGFuZ3VhZ2VOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hpZ2hsaWdodGVkSFRNTEVsZW1lbnR9IGJsb2NrIC0gdGhlIEhUTUwgZWxlbWVudCB0byBkZXRlcm1pbmUgbGFuZ3VhZ2UgZm9yXG4gICAqL1xuICBmdW5jdGlvbiBibG9ja0xhbmd1YWdlKGJsb2NrKSB7XG4gICAgbGV0IGNsYXNzZXMgPSBibG9jay5jbGFzc05hbWUgKyAnICc7XG5cbiAgICBjbGFzc2VzICs9IGJsb2NrLnBhcmVudE5vZGUgPyBibG9jay5wYXJlbnROb2RlLmNsYXNzTmFtZSA6ICcnO1xuXG4gICAgLy8gbGFuZ3VhZ2UtKiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbm9uLXByZWZpeGVkIGNsYXNzIG5hbWVzLlxuICAgIGNvbnN0IG1hdGNoID0gb3B0aW9ucy5sYW5ndWFnZURldGVjdFJlLmV4ZWMoY2xhc3Nlcyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG1hdGNoWzFdKTtcbiAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgd2FybihMQU5HVUFHRV9OT1RfRk9VTkQucmVwbGFjZShcInt9XCIsIG1hdGNoWzFdKSk7XG4gICAgICAgIHdhcm4oXCJGYWxsaW5nIGJhY2sgdG8gbm8taGlnaGxpZ2h0IG1vZGUgZm9yIHRoaXMgYmxvY2suXCIsIGJsb2NrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYW5ndWFnZSA/IG1hdGNoWzFdIDogJ25vLWhpZ2hsaWdodCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzZXNcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuZmluZCgoX2NsYXNzKSA9PiBzaG91bGROb3RIaWdobGlnaHQoX2NsYXNzKSB8fCBnZXRMYW5ndWFnZShfY2xhc3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIGhpZ2hsaWdodGluZyBmdW5jdGlvbi5cbiAgICpcbiAgICogT0xEIEFQSVxuICAgKiBoaWdobGlnaHQobGFuZywgY29kZSwgaWdub3JlSWxsZWdhbHMsIGNvbnRpbnVhdGlvbilcbiAgICpcbiAgICogTkVXIEFQSVxuICAgKiBoaWdobGlnaHQoY29kZSwge2xhbmcsIGlnbm9yZUlsbGVnYWxzfSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVPckxhbmd1YWdlTmFtZSAtIHRoZSBsYW5ndWFnZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IEhpZ2hsaWdodE9wdGlvbnN9IG9wdGlvbnNPckNvZGUgLSB0aGUgY29kZSB0byBoaWdobGlnaHRcbiAgICogQHBhcmFtIHtib29sZWFufSBbaWdub3JlSWxsZWdhbHNdIC0gd2hldGhlciB0byBpZ25vcmUgaWxsZWdhbCBtYXRjaGVzLCBkZWZhdWx0IGlzIHRvIGJhaWxcbiAgICpcbiAgICogQHJldHVybnMge0hpZ2hsaWdodFJlc3VsdH0gUmVzdWx0IC0gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVzdWx0XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYW5ndWFnZSAtIHRoZSBsYW5ndWFnZSBuYW1lXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByZWxldmFuY2UgLSB0aGUgcmVsZXZhbmNlIHNjb3JlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIHRoZSBoaWdobGlnaHRlZCBIVE1MIGNvZGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvZGUgLSB0aGUgb3JpZ2luYWwgcmF3IGNvZGVcbiAgICogQHByb3BlcnR5IHtDb21waWxlZE1vZGV9IHRvcCAtIHRvcCBvZiB0aGUgY3VycmVudCBtb2RlIHN0YWNrXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaWxsZWdhbCAtIGluZGljYXRlcyB3aGV0aGVyIGFueSBpbGxlZ2FsIG1hdGNoZXMgd2VyZSBmb3VuZFxuICAqL1xuICBmdW5jdGlvbiBoaWdobGlnaHQoY29kZU9yTGFuZ3VhZ2VOYW1lLCBvcHRpb25zT3JDb2RlLCBpZ25vcmVJbGxlZ2Fscykge1xuICAgIGxldCBjb2RlID0gXCJcIjtcbiAgICBsZXQgbGFuZ3VhZ2VOYW1lID0gXCJcIjtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPckNvZGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvZGUgPSBjb2RlT3JMYW5ndWFnZU5hbWU7XG4gICAgICBpZ25vcmVJbGxlZ2FscyA9IG9wdGlvbnNPckNvZGUuaWdub3JlSWxsZWdhbHM7XG4gICAgICBsYW5ndWFnZU5hbWUgPSBvcHRpb25zT3JDb2RlLmxhbmd1YWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbGQgQVBJXG4gICAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiaGlnaGxpZ2h0KGxhbmcsIGNvZGUsIC4uLmFyZ3MpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuXCIpO1xuICAgICAgZGVwcmVjYXRlZChcIjEwLjcuMFwiLCBcIlBsZWFzZSB1c2UgaGlnaGxpZ2h0KGNvZGUsIG9wdGlvbnMpIGluc3RlYWQuXFxuaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjI3N1wiKTtcbiAgICAgIGxhbmd1YWdlTmFtZSA9IGNvZGVPckxhbmd1YWdlTmFtZTtcbiAgICAgIGNvZGUgPSBvcHRpb25zT3JDb2RlO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzMxNDlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgaWYgKGlnbm9yZUlsbGVnYWxzID09PSB1bmRlZmluZWQpIHsgaWdub3JlSWxsZWdhbHMgPSB0cnVlOyB9XG5cbiAgICAvKiogQHR5cGUge0JlZm9yZUhpZ2hsaWdodENvbnRleHR9ICovXG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIGNvZGUsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VOYW1lXG4gICAgfTtcbiAgICAvLyB0aGUgcGx1Z2luIGNhbiBjaGFuZ2UgdGhlIGRlc2lyZWQgbGFuZ3VhZ2Ugb3IgdGhlIGNvZGUgdG8gYmUgaGlnaGxpZ2h0ZWRcbiAgICAvLyBqdXN0IGJlIGNoYW5naW5nIHRoZSBvYmplY3QgaXQgd2FzIHBhc3NlZFxuICAgIGZpcmUoXCJiZWZvcmU6aGlnaGxpZ2h0XCIsIGNvbnRleHQpO1xuXG4gICAgLy8gYSBiZWZvcmUgcGx1Z2luIGNhbiB1c3VycCB0aGUgcmVzdWx0IGNvbXBsZXRlbHkgYnkgcHJvdmlkaW5nIGl0J3Mgb3duXG4gICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBldmVuIG5lZWQgdG8gY2FsbCBoaWdobGlnaHRcbiAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnJlc3VsdFxuICAgICAgPyBjb250ZXh0LnJlc3VsdFxuICAgICAgOiBfaGlnaGxpZ2h0KGNvbnRleHQubGFuZ3VhZ2UsIGNvbnRleHQuY29kZSwgaWdub3JlSWxsZWdhbHMpO1xuXG4gICAgcmVzdWx0LmNvZGUgPSBjb250ZXh0LmNvZGU7XG4gICAgLy8gdGhlIHBsdWdpbiBjYW4gY2hhbmdlIGFueXRoaW5nIGluIHJlc3VsdCB0byBzdWl0ZSBpdFxuICAgIGZpcmUoXCJhZnRlcjpoaWdobGlnaHRcIiwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogcHJpdmF0ZSBoaWdobGlnaHQgdGhhdCdzIHVzZWQgaW50ZXJuYWxseSBhbmQgZG9lcyBub3QgZmlyZSBjYWxsYmFja3NcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlTmFtZSAtIHRoZSBsYW5ndWFnZSB0byB1c2UgZm9yIGhpZ2hsaWdodGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVRvSGlnaGxpZ2h0IC0gdGhlIGNvZGUgdG8gaGlnaGxpZ2h0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbj99IFtpZ25vcmVJbGxlZ2Fsc10gLSB3aGV0aGVyIHRvIGlnbm9yZSBpbGxlZ2FsIG1hdGNoZXMsIGRlZmF1bHQgaXMgdG8gYmFpbFxuICAgKiBAcGFyYW0ge0NvbXBpbGVkTW9kZT99IFtjb250aW51YXRpb25dIC0gY3VycmVudCBjb250aW51YXRpb24gbW9kZSwgaWYgYW55XG4gICAqIEByZXR1cm5zIHtIaWdobGlnaHRSZXN1bHR9IC0gcmVzdWx0IG9mIHRoZSBoaWdobGlnaHQgb3BlcmF0aW9uXG4gICovXG4gIGZ1bmN0aW9uIF9oaWdobGlnaHQobGFuZ3VhZ2VOYW1lLCBjb2RlVG9IaWdobGlnaHQsIGlnbm9yZUlsbGVnYWxzLCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBrZXl3b3JkSGl0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4ga2V5d29yZCBkYXRhIGlmIGEgbWF0Y2ggaXMgYSBrZXl3b3JkXG4gICAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGUgLSBjdXJyZW50IG1vZGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hUZXh0IC0gdGhlIHRleHR1YWwgbWF0Y2hcbiAgICAgKiBAcmV0dXJucyB7S2V5d29yZERhdGEgfCBmYWxzZX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXl3b3JkRGF0YShtb2RlLCBtYXRjaFRleHQpIHtcbiAgICAgIHJldHVybiBtb2RlLmtleXdvcmRzW21hdGNoVGV4dF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0tleXdvcmRzKCkge1xuICAgICAgaWYgKCF0b3Aua2V5d29yZHMpIHtcbiAgICAgICAgZW1pdHRlci5hZGRUZXh0KG1vZGVCdWZmZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgICAgdG9wLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4ID0gMDtcbiAgICAgIGxldCBtYXRjaCA9IHRvcC5rZXl3b3JkUGF0dGVyblJlLmV4ZWMobW9kZUJ1ZmZlcik7XG4gICAgICBsZXQgYnVmID0gXCJcIjtcblxuICAgICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgIGJ1ZiArPSBtb2RlQnVmZmVyLnN1YnN0cmluZyhsYXN0SW5kZXgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgY29uc3Qgd29yZCA9IGxhbmd1YWdlLmNhc2VfaW5zZW5zaXRpdmUgPyBtYXRjaFswXS50b0xvd2VyQ2FzZSgpIDogbWF0Y2hbMF07XG4gICAgICAgIGNvbnN0IGRhdGEgPSBrZXl3b3JkRGF0YSh0b3AsIHdvcmQpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGNvbnN0IFtraW5kLCBrZXl3b3JkUmVsZXZhbmNlXSA9IGRhdGE7XG4gICAgICAgICAgZW1pdHRlci5hZGRUZXh0KGJ1Zik7XG4gICAgICAgICAgYnVmID0gXCJcIjtcblxuICAgICAgICAgIGtleXdvcmRIaXRzW3dvcmRdID0gKGtleXdvcmRIaXRzW3dvcmRdIHx8IDApICsgMTtcbiAgICAgICAgICBpZiAoa2V5d29yZEhpdHNbd29yZF0gPD0gTUFYX0tFWVdPUkRfSElUUykgcmVsZXZhbmNlICs9IGtleXdvcmRSZWxldmFuY2U7XG4gICAgICAgICAgaWYgKGtpbmQuc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgICAgIC8vIF8gaW1wbGllZCBmb3IgcmVsZXZhbmNlIG9ubHksIGRvIG5vdCBoaWdobGlnaHRcbiAgICAgICAgICAgIC8vIGJ5IGFwcGx5aW5nIGEgY2xhc3MgbmFtZVxuICAgICAgICAgICAgYnVmICs9IG1hdGNoWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjc3NDbGFzcyA9IGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNba2luZF0gfHwga2luZDtcbiAgICAgICAgICAgIGVtaXR0ZXIuYWRkS2V5d29yZChtYXRjaFswXSwgY3NzQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWYgKz0gbWF0Y2hbMF07XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEluZGV4ID0gdG9wLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4O1xuICAgICAgICBtYXRjaCA9IHRvcC5rZXl3b3JkUGF0dGVyblJlLmV4ZWMobW9kZUJ1ZmZlcik7XG4gICAgICB9XG4gICAgICBidWYgKz0gbW9kZUJ1ZmZlci5zdWJzdHJpbmcobGFzdEluZGV4KTtcbiAgICAgIGVtaXR0ZXIuYWRkVGV4dChidWYpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NTdWJMYW5ndWFnZSgpIHtcbiAgICAgIGlmIChtb2RlQnVmZmVyID09PSBcIlwiKSByZXR1cm47XG4gICAgICAvKiogQHR5cGUgSGlnaGxpZ2h0UmVzdWx0ICovXG4gICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgaWYgKHR5cGVvZiB0b3Auc3ViTGFuZ3VhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghbGFuZ3VhZ2VzW3RvcC5zdWJMYW5ndWFnZV0pIHtcbiAgICAgICAgICBlbWl0dGVyLmFkZFRleHQobW9kZUJ1ZmZlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IF9oaWdobGlnaHQodG9wLnN1Ykxhbmd1YWdlLCBtb2RlQnVmZmVyLCB0cnVlLCBjb250aW51YXRpb25zW3RvcC5zdWJMYW5ndWFnZV0pO1xuICAgICAgICBjb250aW51YXRpb25zW3RvcC5zdWJMYW5ndWFnZV0gPSAvKiogQHR5cGUge0NvbXBpbGVkTW9kZX0gKi8gKHJlc3VsdC5fdG9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGhpZ2hsaWdodEF1dG8obW9kZUJ1ZmZlciwgdG9wLnN1Ykxhbmd1YWdlLmxlbmd0aCA/IHRvcC5zdWJMYW5ndWFnZSA6IG51bGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudGluZyBlbWJlZGRlZCBsYW5ndWFnZSBzY29yZSB0b3dhcmRzIHRoZSBob3N0IGxhbmd1YWdlIG1heSBiZSBkaXNhYmxlZFxuICAgICAgLy8gd2l0aCB6ZXJvaW5nIHRoZSBjb250YWluaW5nIG1vZGUgcmVsZXZhbmNlLiBVc2UgY2FzZSBpbiBwb2ludCBpcyBNYXJrZG93biB0aGF0XG4gICAgICAvLyBhbGxvd3MgWE1MIGV2ZXJ5d2hlcmUgYW5kIG1ha2VzIGV2ZXJ5IFhNTCBzbmlwcGV0IHRvIGhhdmUgYSBtdWNoIGxhcmdlciBNYXJrZG93blxuICAgICAgLy8gc2NvcmUuXG4gICAgICBpZiAodG9wLnJlbGV2YW5jZSA+IDApIHtcbiAgICAgICAgcmVsZXZhbmNlICs9IHJlc3VsdC5yZWxldmFuY2U7XG4gICAgICB9XG4gICAgICBlbWl0dGVyLmFkZFN1Ymxhbmd1YWdlKHJlc3VsdC5fZW1pdHRlciwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQnVmZmVyKCkge1xuICAgICAgaWYgKHRvcC5zdWJMYW5ndWFnZSAhPSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3NTdWJMYW5ndWFnZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzc0tleXdvcmRzKCk7XG4gICAgICB9XG4gICAgICBtb2RlQnVmZmVyID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDb21waWxlZFNjb3BlfSBzY29wZVxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbWl0TXVsdGlDbGFzcyhzY29wZSwgbWF0Y2gpIHtcbiAgICAgIGxldCBpID0gMTtcbiAgICAgIGNvbnN0IG1heCA9IG1hdGNoLmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaSA8PSBtYXgpIHtcbiAgICAgICAgaWYgKCFzY29wZS5fZW1pdFtpXSkgeyBpKys7IGNvbnRpbnVlOyB9XG4gICAgICAgIGNvbnN0IGtsYXNzID0gbGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlc1tzY29wZVtpXV0gfHwgc2NvcGVbaV07XG4gICAgICAgIGNvbnN0IHRleHQgPSBtYXRjaFtpXTtcbiAgICAgICAgaWYgKGtsYXNzKSB7XG4gICAgICAgICAgZW1pdHRlci5hZGRLZXl3b3JkKHRleHQsIGtsYXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gdGV4dDtcbiAgICAgICAgICBwcm9jZXNzS2V5d29yZHMoKTtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDb21waWxlZE1vZGV9IG1vZGUgLSBuZXcgbW9kZSB0byBzdGFydFxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydE5ld01vZGUobW9kZSwgbWF0Y2gpIHtcbiAgICAgIGlmIChtb2RlLnNjb3BlICYmIHR5cGVvZiBtb2RlLnNjb3BlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVtaXR0ZXIub3Blbk5vZGUobGFuZ3VhZ2UuY2xhc3NOYW1lQWxpYXNlc1ttb2RlLnNjb3BlXSB8fCBtb2RlLnNjb3BlKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlLmJlZ2luU2NvcGUpIHtcbiAgICAgICAgLy8gYmVnaW5TY29wZSBqdXN0IHdyYXBzIHRoZSBiZWdpbiBtYXRjaCBpdHNlbGYgaW4gYSBzY29wZVxuICAgICAgICBpZiAobW9kZS5iZWdpblNjb3BlLl93cmFwKSB7XG4gICAgICAgICAgZW1pdHRlci5hZGRLZXl3b3JkKG1vZGVCdWZmZXIsIGxhbmd1YWdlLmNsYXNzTmFtZUFsaWFzZXNbbW9kZS5iZWdpblNjb3BlLl93cmFwXSB8fCBtb2RlLmJlZ2luU2NvcGUuX3dyYXApO1xuICAgICAgICAgIG1vZGVCdWZmZXIgPSBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUuYmVnaW5TY29wZS5fbXVsdGkpIHtcbiAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IG1vZGVCdWZmZXIgc2hvdWxkIGp1c3QgYmUgdGhlIG1hdGNoXG4gICAgICAgICAgZW1pdE11bHRpQ2xhc3MobW9kZS5iZWdpblNjb3BlLCBtYXRjaCk7XG4gICAgICAgICAgbW9kZUJ1ZmZlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdG9wID0gT2JqZWN0LmNyZWF0ZShtb2RlLCB7IHBhcmVudDogeyB2YWx1ZTogdG9wIH0gfSk7XG4gICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Q29tcGlsZWRNb2RlIH0gbW9kZSAtIHRoZSBtb2RlIHRvIHBvdGVudGlhbGx5IGVuZFxuICAgICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2ggLSB0aGUgbGF0ZXN0IG1hdGNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoUGx1c1JlbWFpbmRlciAtIG1hdGNoIHBsdXMgcmVtYWluZGVyIG9mIGNvbnRlbnRcbiAgICAgKiBAcmV0dXJucyB7Q29tcGlsZWRNb2RlIHwgdm9pZH0gLSB0aGUgbmV4dCBtb2RlLCBvciBpZiB2b2lkIGNvbnRpbnVlIG9uIGluIGN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVuZE9mTW9kZShtb2RlLCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKSB7XG4gICAgICBsZXQgbWF0Y2hlZCA9IHN0YXJ0c1dpdGgobW9kZS5lbmRSZSwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcblxuICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgaWYgKG1vZGVbXCJvbjplbmRcIl0pIHtcbiAgICAgICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG1vZGUpO1xuICAgICAgICAgIG1vZGVbXCJvbjplbmRcIl0obWF0Y2gsIHJlc3ApO1xuICAgICAgICAgIGlmIChyZXNwLmlzTWF0Y2hJZ25vcmVkKSBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgIHdoaWxlIChtb2RlLmVuZHNQYXJlbnQgJiYgbW9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIG1vZGUgPSBtb2RlLnBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGV2ZW4gaWYgb246ZW5kIGZpcmVzIGFuIGBpZ25vcmVgIGl0J3Mgc3RpbGwgcG9zc2libGVcbiAgICAgIC8vIHRoYXQgd2UgbWlnaHQgdHJpZ2dlciB0aGUgZW5kIG5vZGUgYmVjYXVzZSBvZiBhIHBhcmVudCBtb2RlXG4gICAgICBpZiAobW9kZS5lbmRzV2l0aFBhcmVudCkge1xuICAgICAgICByZXR1cm4gZW5kT2ZNb2RlKG1vZGUucGFyZW50LCBtYXRjaCwgbWF0Y2hQbHVzUmVtYWluZGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbWF0Y2hpbmcgYnV0IHRoZW4gaWdub3JpbmcgYSBzZXF1ZW5jZSBvZiB0ZXh0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGV4ZW1lIC0gc3RyaW5nIGNvbnRhaW5pbmcgZnVsbCBtYXRjaCB0ZXh0XG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9JZ25vcmUobGV4ZW1lKSB7XG4gICAgICBpZiAodG9wLm1hdGNoZXIucmVnZXhJbmRleCA9PT0gMCkge1xuICAgICAgICAvLyBubyBtb3JlIHJlZ2V4ZXMgdG8gcG90ZW50aWFsbHkgbWF0Y2ggaGVyZSwgc28gd2UgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgb25lXG4gICAgICAgIC8vIHNwYWNlXG4gICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lWzBdO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vIG5lZWQgdG8gbW92ZSB0aGUgY3Vyc29yLCB3ZSBzdGlsbCBoYXZlIGFkZGl0aW9uYWwgcmVnZXhlcyB0byB0cnkgYW5kXG4gICAgICAgIC8vIG1hdGNoIGF0IHRoaXMgdmVyeSBzcG90XG4gICAgICAgIHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IHRydWU7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgc3RhcnQgb2YgYSBuZXcgcG90ZW50aWFsIG1vZGUgbWF0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RW5oYW5jZWRNYXRjaH0gbWF0Y2ggLSB0aGUgY3VycmVudCBtYXRjaFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IGhvdyBmYXIgdG8gYWR2YW5jZSB0aGUgcGFyc2UgY3Vyc29yXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9CZWdpbk1hdGNoKG1hdGNoKSB7XG4gICAgICBjb25zdCBsZXhlbWUgPSBtYXRjaFswXTtcbiAgICAgIGNvbnN0IG5ld01vZGUgPSBtYXRjaC5ydWxlO1xuXG4gICAgICBjb25zdCByZXNwID0gbmV3IFJlc3BvbnNlKG5ld01vZGUpO1xuICAgICAgLy8gZmlyc3QgaW50ZXJuYWwgYmVmb3JlIGNhbGxiYWNrcywgdGhlbiB0aGUgcHVibGljIG9uZXNcbiAgICAgIGNvbnN0IGJlZm9yZUNhbGxiYWNrcyA9IFtuZXdNb2RlLl9fYmVmb3JlQmVnaW4sIG5ld01vZGVbXCJvbjpiZWdpblwiXV07XG4gICAgICBmb3IgKGNvbnN0IGNiIG9mIGJlZm9yZUNhbGxiYWNrcykge1xuICAgICAgICBpZiAoIWNiKSBjb250aW51ZTtcbiAgICAgICAgY2IobWF0Y2gsIHJlc3ApO1xuICAgICAgICBpZiAocmVzcC5pc01hdGNoSWdub3JlZCkgcmV0dXJuIGRvSWdub3JlKGxleGVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdNb2RlLnNraXApIHtcbiAgICAgICAgbW9kZUJ1ZmZlciArPSBsZXhlbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGlmICghbmV3TW9kZS5yZXR1cm5CZWdpbiAmJiAhbmV3TW9kZS5leGNsdWRlQmVnaW4pIHtcbiAgICAgICAgICBtb2RlQnVmZmVyID0gbGV4ZW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydE5ld01vZGUobmV3TW9kZSwgbWF0Y2gpO1xuICAgICAgcmV0dXJuIG5ld01vZGUucmV0dXJuQmVnaW4gPyAwIDogbGV4ZW1lLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIHBvdGVudGlhbCBlbmQgb2YgbW9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaCAtIHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gZG9FbmRNYXRjaChtYXRjaCkge1xuICAgICAgY29uc3QgbGV4ZW1lID0gbWF0Y2hbMF07XG4gICAgICBjb25zdCBtYXRjaFBsdXNSZW1haW5kZXIgPSBjb2RlVG9IaWdobGlnaHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KTtcblxuICAgICAgY29uc3QgZW5kTW9kZSA9IGVuZE9mTW9kZSh0b3AsIG1hdGNoLCBtYXRjaFBsdXNSZW1haW5kZXIpO1xuICAgICAgaWYgKCFlbmRNb2RlKSB7IHJldHVybiBOT19NQVRDSDsgfVxuXG4gICAgICBjb25zdCBvcmlnaW4gPSB0b3A7XG4gICAgICBpZiAodG9wLmVuZFNjb3BlICYmIHRvcC5lbmRTY29wZS5fd3JhcCkge1xuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGVtaXR0ZXIuYWRkS2V5d29yZChsZXhlbWUsIHRvcC5lbmRTY29wZS5fd3JhcCk7XG4gICAgICB9IGVsc2UgaWYgKHRvcC5lbmRTY29wZSAmJiB0b3AuZW5kU2NvcGUuX211bHRpKSB7XG4gICAgICAgIHByb2Nlc3NCdWZmZXIoKTtcbiAgICAgICAgZW1pdE11bHRpQ2xhc3ModG9wLmVuZFNjb3BlLCBtYXRjaCk7XG4gICAgICB9IGVsc2UgaWYgKG9yaWdpbi5za2lwKSB7XG4gICAgICAgIG1vZGVCdWZmZXIgKz0gbGV4ZW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEob3JpZ2luLnJldHVybkVuZCB8fCBvcmlnaW4uZXhjbHVkZUVuZCkpIHtcbiAgICAgICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIGlmIChvcmlnaW4uZXhjbHVkZUVuZCkge1xuICAgICAgICAgIG1vZGVCdWZmZXIgPSBsZXhlbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRvcC5zY29wZSkge1xuICAgICAgICAgIGVtaXR0ZXIuY2xvc2VOb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0b3Auc2tpcCAmJiAhdG9wLnN1Ykxhbmd1YWdlKSB7XG4gICAgICAgICAgcmVsZXZhbmNlICs9IHRvcC5yZWxldmFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgdG9wID0gdG9wLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKHRvcCAhPT0gZW5kTW9kZS5wYXJlbnQpO1xuICAgICAgaWYgKGVuZE1vZGUuc3RhcnRzKSB7XG4gICAgICAgIHN0YXJ0TmV3TW9kZShlbmRNb2RlLnN0YXJ0cywgbWF0Y2gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yaWdpbi5yZXR1cm5FbmQgPyAwIDogbGV4ZW1lLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQ29udGludWF0aW9ucygpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBbXTtcbiAgICAgIGZvciAobGV0IGN1cnJlbnQgPSB0b3A7IGN1cnJlbnQgIT09IGxhbmd1YWdlOyBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQuc2NvcGUpIHtcbiAgICAgICAgICBsaXN0LnVuc2hpZnQoY3VycmVudC5zY29wZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QuZm9yRWFjaChpdGVtID0+IGVtaXR0ZXIub3Blbk5vZGUoaXRlbSkpO1xuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7e3R5cGU/OiBNYXRjaFR5cGUsIGluZGV4PzogbnVtYmVyLCBydWxlPzogTW9kZX19fSAqL1xuICAgIGxldCBsYXN0TWF0Y2ggPSB7fTtcblxuICAgIC8qKlxuICAgICAqICBQcm9jZXNzIGFuIGluZGl2aWR1YWwgbWF0Y2hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0QmVmb3JlTWF0Y2ggLSB0ZXh0IHByZWNlZGluZyB0aGUgbWF0Y2ggKHNpbmNlIHRoZSBsYXN0IG1hdGNoKVxuICAgICAqIEBwYXJhbSB7RW5oYW5jZWRNYXRjaH0gW21hdGNoXSAtIHRoZSBtYXRjaCBpdHNlbGZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9jZXNzTGV4ZW1lKHRleHRCZWZvcmVNYXRjaCwgbWF0Y2gpIHtcbiAgICAgIGNvbnN0IGxleGVtZSA9IG1hdGNoICYmIG1hdGNoWzBdO1xuXG4gICAgICAvLyBhZGQgbm9uLW1hdGNoZWQgdGV4dCB0byB0aGUgY3VycmVudCBtb2RlIGJ1ZmZlclxuICAgICAgbW9kZUJ1ZmZlciArPSB0ZXh0QmVmb3JlTWF0Y2g7XG5cbiAgICAgIGlmIChsZXhlbWUgPT0gbnVsbCkge1xuICAgICAgICBwcm9jZXNzQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSd2ZSBmb3VuZCBhIDAgd2lkdGggbWF0Y2ggYW5kIHdlJ3JlIHN0dWNrLCBzbyB3ZSBuZWVkIHRvIGFkdmFuY2VcbiAgICAgIC8vIHRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYmFkbHkgYmVoYXZlZCBydWxlcyB0aGF0IGhhdmUgb3B0aW9uYWwgbWF0Y2hlcnMgdG8gdGhlIGRlZ3JlZSB0aGF0XG4gICAgICAvLyBzb21ldGltZXMgdGhleSBjYW4gZW5kIHVwIG1hdGNoaW5nIG5vdGhpbmcgYXQgYWxsXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzIxNDBcbiAgICAgIGlmIChsYXN0TWF0Y2gudHlwZSA9PT0gXCJiZWdpblwiICYmIG1hdGNoLnR5cGUgPT09IFwiZW5kXCIgJiYgbGFzdE1hdGNoLmluZGV4ID09PSBtYXRjaC5pbmRleCAmJiBsZXhlbWUgPT09IFwiXCIpIHtcbiAgICAgICAgLy8gc3BpdCB0aGUgXCJza2lwcGVkXCIgY2hhcmFjdGVyIHRoYXQgb3VyIHJlZ2V4IGNob2tlZCBvbiBiYWNrIGludG8gdGhlIG91dHB1dCBzZXF1ZW5jZVxuICAgICAgICBtb2RlQnVmZmVyICs9IGNvZGVUb0hpZ2hsaWdodC5zbGljZShtYXRjaC5pbmRleCwgbWF0Y2guaW5kZXggKyAxKTtcbiAgICAgICAgaWYgKCFTQUZFX01PREUpIHtcbiAgICAgICAgICAvKiogQHR5cGUge0Fubm90YXRlZEVycm9yfSAqL1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgMCB3aWR0aCBtYXRjaCByZWdleCAoJHtsYW5ndWFnZU5hbWV9KWApO1xuICAgICAgICAgIGVyci5sYW5ndWFnZU5hbWUgPSBsYW5ndWFnZU5hbWU7XG4gICAgICAgICAgZXJyLmJhZFJ1bGUgPSBsYXN0TWF0Y2gucnVsZTtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICBsYXN0TWF0Y2ggPSBtYXRjaDtcblxuICAgICAgaWYgKG1hdGNoLnR5cGUgPT09IFwiYmVnaW5cIikge1xuICAgICAgICByZXR1cm4gZG9CZWdpbk1hdGNoKG1hdGNoKTtcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2gudHlwZSA9PT0gXCJpbGxlZ2FsXCIgJiYgIWlnbm9yZUlsbGVnYWxzKSB7XG4gICAgICAgIC8vIGlsbGVnYWwgbWF0Y2gsIHdlIGRvIG5vdCBjb250aW51ZSBwcm9jZXNzaW5nXG4gICAgICAgIC8qKiBAdHlwZSB7QW5ub3RhdGVkRXJyb3J9ICovXG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignSWxsZWdhbCBsZXhlbWUgXCInICsgbGV4ZW1lICsgJ1wiIGZvciBtb2RlIFwiJyArICh0b3Auc2NvcGUgfHwgJzx1bm5hbWVkPicpICsgJ1wiJyk7XG4gICAgICAgIGVyci5tb2RlID0gdG9wO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9IGVsc2UgaWYgKG1hdGNoLnR5cGUgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gZG9FbmRNYXRjaChtYXRjaCk7XG4gICAgICAgIGlmIChwcm9jZXNzZWQgIT09IE5PX01BVENIKSB7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlZGdlIGNhc2UgZm9yIHdoZW4gaWxsZWdhbCBtYXRjaGVzICQgKGVuZCBvZiBsaW5lKSB3aGljaCBpcyB0ZWNobmljYWxseVxuICAgICAgLy8gYSAwIHdpZHRoIG1hdGNoIGJ1dCBub3QgYSBiZWdpbi9lbmQgbWF0Y2ggc28gaXQncyBub3QgY2F1Z2h0IGJ5IHRoZVxuICAgICAgLy8gZmlyc3QgaGFuZGxlciAod2hlbiBpZ25vcmVJbGxlZ2FscyBpcyB0cnVlKVxuICAgICAgaWYgKG1hdGNoLnR5cGUgPT09IFwiaWxsZWdhbFwiICYmIGxleGVtZSA9PT0gXCJcIikge1xuICAgICAgICAvLyBhZHZhbmNlIHNvIHdlIGFyZW4ndCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvLyBpbmZpbml0ZSBsb29wcyBhcmUgQkFELCB0aGlzIGlzIGEgbGFzdCBkaXRjaCBjYXRjaCBhbGwuIGlmIHdlIGhhdmUgYVxuICAgICAgLy8gZGVjZW50IG51bWJlciBvZiBpdGVyYXRpb25zIHlldCBvdXIgaW5kZXggKGN1cnNvciBwb3NpdGlvbiBpbiBvdXJcbiAgICAgIC8vIHBhcnNpbmcpIHN0aWxsIDN4IGJlaGluZCBvdXIgaW5kZXggdGhlbiBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZ1xuICAgICAgLy8gc28gd2UgYmFpbFxuICAgICAgaWYgKGl0ZXJhdGlvbnMgPiAxMDAwMDAgJiYgaXRlcmF0aW9ucyA+IG1hdGNoLmluZGV4ICogMykge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ3BvdGVudGlhbCBpbmZpbml0ZSBsb29wLCB3YXkgbW9yZSBpdGVyYXRpb25zIHRoYW4gbWF0Y2hlcycpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICBXaHkgbWlnaHQgYmUgZmluZCBvdXJzZWx2ZXMgaGVyZT8gIEFuIHBvdGVudGlhbCBlbmQgbWF0Y2ggdGhhdCB3YXNcbiAgICAgIHRyaWdnZXJlZCBidXQgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gIElFLCBgZG9FbmRNYXRjaGAgcmV0dXJuZWQgTk9fTUFUQ0guXG4gICAgICAodGhpcyBjb3VsZCBiZSBiZWNhdXNlIGEgY2FsbGJhY2sgcmVxdWVzdHMgdGhlIG1hdGNoIGJlIGlnbm9yZWQsIGV0YylcblxuICAgICAgVGhpcyBjYXVzZXMgbm8gcmVhbCBoYXJtIG90aGVyIHRoYW4gc3RvcHBpbmcgYSBmZXcgdGltZXMgdG9vIG1hbnkuXG4gICAgICAqL1xuXG4gICAgICBtb2RlQnVmZmVyICs9IGxleGVtZTtcbiAgICAgIHJldHVybiBsZXhlbWUubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobGFuZ3VhZ2VOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBlcnJvcihMQU5HVUFHRV9OT1RfRk9VTkQucmVwbGFjZShcInt9XCIsIGxhbmd1YWdlTmFtZSkpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlOiBcIicgKyBsYW5ndWFnZU5hbWUgKyAnXCInKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZCA9IGNvbXBpbGVMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIC8qKiBAdHlwZSB7Q29tcGlsZWRNb2RlfSAqL1xuICAgIGxldCB0b3AgPSBjb250aW51YXRpb24gfHwgbWQ7XG4gICAgLyoqIEB0eXBlIFJlY29yZDxzdHJpbmcsQ29tcGlsZWRNb2RlPiAqL1xuICAgIGNvbnN0IGNvbnRpbnVhdGlvbnMgPSB7fTsgLy8ga2VlcCBjb250aW51YXRpb25zIGZvciBzdWItbGFuZ3VhZ2VzXG4gICAgY29uc3QgZW1pdHRlciA9IG5ldyBvcHRpb25zLl9fZW1pdHRlcihvcHRpb25zKTtcbiAgICBwcm9jZXNzQ29udGludWF0aW9ucygpO1xuICAgIGxldCBtb2RlQnVmZmVyID0gJyc7XG4gICAgbGV0IHJlbGV2YW5jZSA9IDA7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgaXRlcmF0aW9ucyA9IDA7XG4gICAgbGV0IHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRvcC5tYXRjaGVyLmNvbnNpZGVyQWxsKCk7XG5cbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICBpZiAocmVzdW1lU2NhbkF0U2FtZVBvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gb25seSByZWdleGVzIG5vdCBtYXRjaGVkIHByZXZpb3VzbHkgd2lsbCBub3cgYmVcbiAgICAgICAgICAvLyBjb25zaWRlcmVkIGZvciBhIHBvdGVudGlhbCBtYXRjaFxuICAgICAgICAgIHJlc3VtZVNjYW5BdFNhbWVQb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvcC5tYXRjaGVyLmNvbnNpZGVyQWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgdG9wLm1hdGNoZXIubGFzdEluZGV4ID0gaW5kZXg7XG5cbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0b3AubWF0Y2hlci5leGVjKGNvZGVUb0hpZ2hsaWdodCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwibWF0Y2hcIiwgbWF0Y2hbMF0sIG1hdGNoLnJ1bGUgJiYgbWF0Y2gucnVsZS5iZWdpbilcblxuICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcblxuICAgICAgICBjb25zdCBiZWZvcmVNYXRjaCA9IGNvZGVUb0hpZ2hsaWdodC5zdWJzdHJpbmcoaW5kZXgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkQ291bnQgPSBwcm9jZXNzTGV4ZW1lKGJlZm9yZU1hdGNoLCBtYXRjaCk7XG4gICAgICAgIGluZGV4ID0gbWF0Y2guaW5kZXggKyBwcm9jZXNzZWRDb3VudDtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3NMZXhlbWUoY29kZVRvSGlnaGxpZ2h0LnN1YnN0cmluZyhpbmRleCkpO1xuICAgICAgZW1pdHRlci5jbG9zZUFsbE5vZGVzKCk7XG4gICAgICBlbWl0dGVyLmZpbmFsaXplKCk7XG4gICAgICByZXN1bHQgPSBlbWl0dGVyLnRvSFRNTCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2VOYW1lLFxuICAgICAgICB2YWx1ZTogcmVzdWx0LFxuICAgICAgICByZWxldmFuY2U6IHJlbGV2YW5jZSxcbiAgICAgICAgaWxsZWdhbDogZmFsc2UsXG4gICAgICAgIF9lbWl0dGVyOiBlbWl0dGVyLFxuICAgICAgICBfdG9wOiB0b3BcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ0lsbGVnYWwnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZU5hbWUsXG4gICAgICAgICAgdmFsdWU6IGVzY2FwZShjb2RlVG9IaWdobGlnaHQpLFxuICAgICAgICAgIGlsbGVnYWw6IHRydWUsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIF9pbGxlZ2FsQnk6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgY29udGV4dDogY29kZVRvSGlnaGxpZ2h0LnNsaWNlKGluZGV4IC0gMTAwLCBpbmRleCArIDEwMCksXG4gICAgICAgICAgICBtb2RlOiBlcnIubW9kZSxcbiAgICAgICAgICAgIHJlc3VsdFNvRmFyOiByZXN1bHRcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9lbWl0dGVyOiBlbWl0dGVyXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKFNBRkVfTU9ERSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZU5hbWUsXG4gICAgICAgICAgdmFsdWU6IGVzY2FwZShjb2RlVG9IaWdobGlnaHQpLFxuICAgICAgICAgIGlsbGVnYWw6IGZhbHNlLFxuICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICBlcnJvclJhaXNlZDogZXJyLFxuICAgICAgICAgIF9lbWl0dGVyOiBlbWl0dGVyLFxuICAgICAgICAgIF90b3A6IHRvcFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgdmFsaWQgaGlnaGxpZ2h0IHJlc3VsdCwgd2l0aG91dCBhY3R1YWxseSBkb2luZyBhbnkgYWN0dWFsIHdvcmssXG4gICAqIGF1dG8gaGlnaGxpZ2h0IHN0YXJ0cyB3aXRoIHRoaXMgYW5kIGl0J3MgcG9zc2libGUgZm9yIHNtYWxsIHNuaXBwZXRzIHRoYXRcbiAgICogYXV0by1kZXRlY3Rpb24gbWF5IG5vdCBmaW5kIGEgYmV0dGVyIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqIEByZXR1cm5zIHtIaWdobGlnaHRSZXN1bHR9XG4gICAqL1xuICBmdW5jdGlvbiBqdXN0VGV4dEhpZ2hsaWdodFJlc3VsdChjb2RlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgdmFsdWU6IGVzY2FwZShjb2RlKSxcbiAgICAgIGlsbGVnYWw6IGZhbHNlLFxuICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgX3RvcDogUExBSU5URVhUX0xBTkdVQUdFLFxuICAgICAgX2VtaXR0ZXI6IG5ldyBvcHRpb25zLl9fZW1pdHRlcihvcHRpb25zKVxuICAgIH07XG4gICAgcmVzdWx0Ll9lbWl0dGVyLmFkZFRleHQoY29kZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICBIaWdobGlnaHRpbmcgd2l0aCBsYW5ndWFnZSBkZXRlY3Rpb24uIEFjY2VwdHMgYSBzdHJpbmcgd2l0aCB0aGUgY29kZSB0b1xuICBoaWdobGlnaHQuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuXG4gIC0gbGFuZ3VhZ2UgKGRldGVjdGVkIGxhbmd1YWdlKVxuICAtIHJlbGV2YW5jZSAoaW50KVxuICAtIHZhbHVlIChhbiBIVE1MIHN0cmluZyB3aXRoIGhpZ2hsaWdodGluZyBtYXJrdXApXG4gIC0gc2Vjb25kQmVzdCAob2JqZWN0IHdpdGggdGhlIHNhbWUgc3RydWN0dXJlIGZvciBzZWNvbmQtYmVzdCBoZXVyaXN0aWNhbGx5XG4gICAgZGV0ZWN0ZWQgbGFuZ3VhZ2UsIG1heSBiZSBhYnNlbnQpXG5cbiAgICBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2xhbmd1YWdlU3Vic2V0XVxuICAgIEByZXR1cm5zIHtBdXRvSGlnaGxpZ2h0UmVzdWx0fVxuICAqL1xuICBmdW5jdGlvbiBoaWdobGlnaHRBdXRvKGNvZGUsIGxhbmd1YWdlU3Vic2V0KSB7XG4gICAgbGFuZ3VhZ2VTdWJzZXQgPSBsYW5ndWFnZVN1YnNldCB8fCBvcHRpb25zLmxhbmd1YWdlcyB8fCBPYmplY3Qua2V5cyhsYW5ndWFnZXMpO1xuICAgIGNvbnN0IHBsYWludGV4dCA9IGp1c3RUZXh0SGlnaGxpZ2h0UmVzdWx0KGNvZGUpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGxhbmd1YWdlU3Vic2V0LmZpbHRlcihnZXRMYW5ndWFnZSkuZmlsdGVyKGF1dG9EZXRlY3Rpb24pLm1hcChuYW1lID0+XG4gICAgICBfaGlnaGxpZ2h0KG5hbWUsIGNvZGUsIGZhbHNlKVxuICAgICk7XG4gICAgcmVzdWx0cy51bnNoaWZ0KHBsYWludGV4dCk7IC8vIHBsYWludGV4dCBpcyBhbHdheXMgYW4gb3B0aW9uXG5cbiAgICBjb25zdCBzb3J0ZWQgPSByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIHNvcnQgYmFzZSBvbiByZWxldmFuY2VcbiAgICAgIGlmIChhLnJlbGV2YW5jZSAhPT0gYi5yZWxldmFuY2UpIHJldHVybiBiLnJlbGV2YW5jZSAtIGEucmVsZXZhbmNlO1xuXG4gICAgICAvLyBhbHdheXMgYXdhcmQgdGhlIHRpZSB0byB0aGUgYmFzZSBsYW5ndWFnZVxuICAgICAgLy8gaWUgaWYgQysrIGFuZCBBcmR1aW5vIGFyZSB0aWVkLCBpdCdzIG1vcmUgbGlrZWx5IHRvIGJlIEMrK1xuICAgICAgaWYgKGEubGFuZ3VhZ2UgJiYgYi5sYW5ndWFnZSkge1xuICAgICAgICBpZiAoZ2V0TGFuZ3VhZ2UoYS5sYW5ndWFnZSkuc3VwZXJzZXRPZiA9PT0gYi5sYW5ndWFnZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGdldExhbmd1YWdlKGIubGFuZ3VhZ2UpLnN1cGVyc2V0T2YgPT09IGEubGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb3RoZXJ3aXNlIHNheSB0aGV5IGFyZSBlcXVhbCwgd2hpY2ggaGFzIHRoZSBlZmZlY3Qgb2Ygc29ydGluZyBvblxuICAgICAgLy8gcmVsZXZhbmNlIHdoaWxlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIG9yZGVyaW5nIC0gd2hpY2ggaXMgaG93IHRpZXNcbiAgICAgIC8vIGhhdmUgaGlzdG9yaWNhbGx5IGJlZW4gc2V0dGxlZCwgaWUgdGhlIGxhbmd1YWdlIHRoYXQgY29tZXMgZmlyc3QgYWx3YXlzXG4gICAgICAvLyB3aW5zIGluIHRoZSBjYXNlIG9mIGEgdGllXG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIGNvbnN0IFtiZXN0LCBzZWNvbmRCZXN0XSA9IHNvcnRlZDtcblxuICAgIC8qKiBAdHlwZSB7QXV0b0hpZ2hsaWdodFJlc3VsdH0gKi9cbiAgICBjb25zdCByZXN1bHQgPSBiZXN0O1xuICAgIHJlc3VsdC5zZWNvbmRCZXN0ID0gc2Vjb25kQmVzdDtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIG5ldyBjbGFzcyBuYW1lIGZvciBibG9jayBnaXZlbiB0aGUgbGFuZ3VhZ2UgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudExhbmddXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVzdWx0TGFuZ11cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZUNsYXNzTmFtZShlbGVtZW50LCBjdXJyZW50TGFuZywgcmVzdWx0TGFuZykge1xuICAgIGNvbnN0IGxhbmd1YWdlID0gKGN1cnJlbnRMYW5nICYmIGFsaWFzZXNbY3VycmVudExhbmddKSB8fCByZXN1bHRMYW5nO1xuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGxqc1wiKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYGxhbmd1YWdlLSR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBoaWdobGlnaHRpbmcgdG8gYSBET00gbm9kZSBjb250YWluaW5nIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7SGlnaGxpZ2h0ZWRIVE1MRWxlbWVudH0gZWxlbWVudCAtIHRoZSBIVE1MIGVsZW1lbnQgdG8gaGlnaGxpZ2h0XG4gICovXG4gIGZ1bmN0aW9uIGhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCkge1xuICAgIC8qKiBAdHlwZSBIVE1MRWxlbWVudCAqL1xuICAgIGxldCBub2RlID0gbnVsbDtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGJsb2NrTGFuZ3VhZ2UoZWxlbWVudCk7XG5cbiAgICBpZiAoc2hvdWxkTm90SGlnaGxpZ2h0KGxhbmd1YWdlKSkgcmV0dXJuO1xuXG4gICAgZmlyZShcImJlZm9yZTpoaWdobGlnaHRFbGVtZW50XCIsXG4gICAgICB7IGVsOiBlbGVtZW50LCBsYW5ndWFnZTogbGFuZ3VhZ2UgfSk7XG5cbiAgICAvLyB3ZSBzaG91bGQgYmUgYWxsIHRleHQsIG5vIGNoaWxkIG5vZGVzICh1bmVzY2FwZWQgSFRNTCkgLSB0aGlzIGlzIHBvc3NpYmx5XG4gICAgLy8gYW4gSFRNTCBpbmplY3Rpb24gYXR0YWNrIC0gaXQncyBsaWtlbHkgdG9vIGxhdGUgaWYgdGhpcyBpcyBhbHJlYWR5IGluXG4gICAgLy8gcHJvZHVjdGlvbiAodGhlIGNvZGUgaGFzIGxpa2VseSBhbHJlYWR5IGRvbmUgaXRzIGRhbWFnZSBieSB0aGUgdGltZVxuICAgIC8vIHdlJ3JlIHNlZWluZyBpdCkuLi4gYnV0IHdlIHllbGwgbG91ZGx5IGFib3V0IHRoaXMgc28gdGhhdCBob3BlZnVsbHkgaXQnc1xuICAgIC8vIG1vcmUgbGlrZWx5IHRvIGJlIGNhdWdodCBpbiBkZXZlbG9wbWVudCBiZWZvcmUgbWFraW5nIGl0IHRvIHByb2R1Y3Rpb25cbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlVW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJPbmUgb2YgeW91ciBjb2RlIGJsb2NrcyBpbmNsdWRlcyB1bmVzY2FwZWQgSFRNTC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgc2VjdXJpdHkgcmlzay5cIik7XG4gICAgICAgIGNvbnNvbGUud2FybihcImh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvd2lraS9zZWN1cml0eVwiKTtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgd2l0aCB1bmVzY2FwZWQgSFRNTDpcIik7XG4gICAgICAgIGNvbnNvbGUud2FybihlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnRocm93VW5lc2NhcGVkSFRNTCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgSFRNTEluamVjdGlvbkVycm9yKFxuICAgICAgICAgIFwiT25lIG9mIHlvdXIgY29kZSBibG9ja3MgaW5jbHVkZXMgdW5lc2NhcGVkIEhUTUwuXCIsXG4gICAgICAgICAgZWxlbWVudC5pbm5lckhUTUxcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBlbGVtZW50O1xuICAgIGNvbnN0IHRleHQgPSBub2RlLnRleHRDb250ZW50O1xuICAgIGNvbnN0IHJlc3VsdCA9IGxhbmd1YWdlID8gaGlnaGxpZ2h0KHRleHQsIHsgbGFuZ3VhZ2UsIGlnbm9yZUlsbGVnYWxzOiB0cnVlIH0pIDogaGlnaGxpZ2h0QXV0byh0ZXh0KTtcblxuICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gcmVzdWx0LnZhbHVlO1xuICAgIHVwZGF0ZUNsYXNzTmFtZShlbGVtZW50LCBsYW5ndWFnZSwgcmVzdWx0Lmxhbmd1YWdlKTtcbiAgICBlbGVtZW50LnJlc3VsdCA9IHtcbiAgICAgIGxhbmd1YWdlOiByZXN1bHQubGFuZ3VhZ2UsXG4gICAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2ZXJzaW9uIDExLjBcbiAgICAgIHJlOiByZXN1bHQucmVsZXZhbmNlLFxuICAgICAgcmVsZXZhbmNlOiByZXN1bHQucmVsZXZhbmNlXG4gICAgfTtcbiAgICBpZiAocmVzdWx0LnNlY29uZEJlc3QpIHtcbiAgICAgIGVsZW1lbnQuc2Vjb25kQmVzdCA9IHtcbiAgICAgICAgbGFuZ3VhZ2U6IHJlc3VsdC5zZWNvbmRCZXN0Lmxhbmd1YWdlLFxuICAgICAgICByZWxldmFuY2U6IHJlc3VsdC5zZWNvbmRCZXN0LnJlbGV2YW5jZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmaXJlKFwiYWZ0ZXI6aGlnaGxpZ2h0RWxlbWVudFwiLCB7IGVsOiBlbGVtZW50LCByZXN1bHQsIHRleHQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBoaWdobGlnaHQuanMgZ2xvYmFsIG9wdGlvbnMgd2l0aCB0aGUgcGFzc2VkIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEhMSlNPcHRpb25zPn0gdXNlck9wdGlvbnNcbiAgICovXG4gIGZ1bmN0aW9uIGNvbmZpZ3VyZSh1c2VyT3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBpbmhlcml0KG9wdGlvbnMsIHVzZXJPcHRpb25zKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSB2MTIsIGRlcHJlY2F0ZWRcbiAgY29uc3QgaW5pdEhpZ2hsaWdodGluZyA9ICgpID0+IHtcbiAgICBoaWdobGlnaHRBbGwoKTtcbiAgICBkZXByZWNhdGVkKFwiMTAuNi4wXCIsIFwiaW5pdEhpZ2hsaWdodGluZygpIGRlcHJlY2F0ZWQuICBVc2UgaGlnaGxpZ2h0QWxsKCkgbm93LlwiKTtcbiAgfTtcblxuICAvLyBUT0RPOiByZW1vdmUgdjEyLCBkZXByZWNhdGVkXG4gIGZ1bmN0aW9uIGluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSB7XG4gICAgaGlnaGxpZ2h0QWxsKCk7XG4gICAgZGVwcmVjYXRlZChcIjEwLjYuMFwiLCBcImluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy5cIik7XG4gIH1cblxuICBsZXQgd2FudHNIaWdobGlnaHQgPSBmYWxzZTtcblxuICAvKipcbiAgICogYXV0by1oaWdobGlnaHRzIGFsbCBwcmU+Y29kZSBlbGVtZW50cyBvbiB0aGUgcGFnZVxuICAgKi9cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QWxsKCkge1xuICAgIC8vIGlmIHdlIGFyZSBjYWxsZWQgdG9vIGVhcmx5IGluIHRoZSBsb2FkaW5nIHByb2Nlc3NcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgIHdhbnRzSGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBibG9ja3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG9wdGlvbnMuY3NzU2VsZWN0b3IpO1xuICAgIGJsb2Nrcy5mb3JFYWNoKGhpZ2hsaWdodEVsZW1lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gYm9vdCgpIHtcbiAgICAvLyBpZiBhIGhpZ2hsaWdodCB3YXMgcmVxdWVzdGVkIGJlZm9yZSBET00gd2FzIGxvYWRlZCwgZG8gbm93XG4gICAgaWYgKHdhbnRzSGlnaGxpZ2h0KSBoaWdobGlnaHRBbGwoKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgaW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBib290LCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsYW5ndWFnZSBncmFtbWFyIG1vZHVsZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VOYW1lXG4gICAqIEBwYXJhbSB7TGFuZ3VhZ2VGbn0gbGFuZ3VhZ2VEZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3Rlckxhbmd1YWdlKGxhbmd1YWdlTmFtZSwgbGFuZ3VhZ2VEZWZpbml0aW9uKSB7XG4gICAgbGV0IGxhbmcgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBsYW5nID0gbGFuZ3VhZ2VEZWZpbml0aW9uKGhsanMpO1xuICAgIH0gY2F0Y2ggKGVycm9yJDEpIHtcbiAgICAgIGVycm9yKFwiTGFuZ3VhZ2UgZGVmaW5pdGlvbiBmb3IgJ3t9JyBjb3VsZCBub3QgYmUgcmVnaXN0ZXJlZC5cIi5yZXBsYWNlKFwie31cIiwgbGFuZ3VhZ2VOYW1lKSk7XG4gICAgICAvLyBoYXJkIG9yIHNvZnQgZXJyb3JcbiAgICAgIGlmICghU0FGRV9NT0RFKSB7IHRocm93IGVycm9yJDE7IH0gZWxzZSB7IGVycm9yKGVycm9yJDEpOyB9XG4gICAgICAvLyBsYW5ndWFnZXMgdGhhdCBoYXZlIHNlcmlvdXMgZXJyb3JzIGFyZSByZXBsYWNlZCB3aXRoIGVzc2VudGlhbGx5IGFcbiAgICAgIC8vIFwicGxhaW50ZXh0XCIgc3RhbmQtaW4gc28gdGhhdCB0aGUgY29kZSBibG9ja3Mgd2lsbCBzdGlsbCBnZXQgbm9ybWFsXG4gICAgICAvLyBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIHRoZW0gLSBhbmQgb25lIGJhZCBsYW5ndWFnZSB3b24ndCBicmVhayB0aGVcbiAgICAgIC8vIGVudGlyZSBoaWdobGlnaHRlclxuICAgICAgbGFuZyA9IFBMQUlOVEVYVF9MQU5HVUFHRTtcbiAgICB9XG4gICAgLy8gZ2l2ZSBpdCBhIHRlbXBvcmFyeSBuYW1lIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgaW4gdGhlIG1ldGEtZGF0YVxuICAgIGlmICghbGFuZy5uYW1lKSBsYW5nLm5hbWUgPSBsYW5ndWFnZU5hbWU7XG4gICAgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV0gPSBsYW5nO1xuICAgIGxhbmcucmF3RGVmaW5pdGlvbiA9IGxhbmd1YWdlRGVmaW5pdGlvbi5iaW5kKG51bGwsIGhsanMpO1xuXG4gICAgaWYgKGxhbmcuYWxpYXNlcykge1xuICAgICAgcmVnaXN0ZXJBbGlhc2VzKGxhbmcuYWxpYXNlcywgeyBsYW5ndWFnZU5hbWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGxhbmd1YWdlIGdyYW1tYXIgbW9kdWxlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZU5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHVucmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZU5hbWUpIHtcbiAgICBkZWxldGUgbGFuZ3VhZ2VzW2xhbmd1YWdlTmFtZV07XG4gICAgZm9yIChjb25zdCBhbGlhcyBvZiBPYmplY3Qua2V5cyhhbGlhc2VzKSkge1xuICAgICAgaWYgKGFsaWFzZXNbYWxpYXNdID09PSBsYW5ndWFnZU5hbWUpIHtcbiAgICAgICAgZGVsZXRlIGFsaWFzZXNbYWxpYXNdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IExpc3Qgb2YgbGFuZ3VhZ2UgaW50ZXJuYWwgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGxpc3RMYW5ndWFnZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBuYW1lIG9mIHRoZSBsYW5ndWFnZSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyB7TGFuZ3VhZ2UgfCB1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRMYW5ndWFnZShuYW1lKSB7XG4gICAgbmFtZSA9IChuYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBsYW5ndWFnZXNbbmFtZV0gfHwgbGFuZ3VhZ2VzW2FsaWFzZXNbbmFtZV1dO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhbGlhc0xpc3QgLSBzaW5nbGUgYWxpYXMgb3IgbGlzdCBvZiBhbGlhc2VzXG4gICAqIEBwYXJhbSB7e2xhbmd1YWdlTmFtZTogc3RyaW5nfX0gb3B0c1xuICAgKi9cbiAgZnVuY3Rpb24gcmVnaXN0ZXJBbGlhc2VzKGFsaWFzTGlzdCwgeyBsYW5ndWFnZU5hbWUgfSkge1xuICAgIGlmICh0eXBlb2YgYWxpYXNMaXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgYWxpYXNMaXN0ID0gW2FsaWFzTGlzdF07XG4gICAgfVxuICAgIGFsaWFzTGlzdC5mb3JFYWNoKGFsaWFzID0+IHsgYWxpYXNlc1thbGlhcy50b0xvd2VyQ2FzZSgpXSA9IGxhbmd1YWdlTmFtZTsgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGxhbmd1YWdlIGhhcyBhdXRvLWRldGVjdGlvbiBlbmFibGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gbmFtZSBvZiB0aGUgbGFuZ3VhZ2VcbiAgICovXG4gIGZ1bmN0aW9uIGF1dG9EZXRlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGxhbmcgPSBnZXRMYW5ndWFnZShuYW1lKTtcbiAgICByZXR1cm4gbGFuZyAmJiAhbGFuZy5kaXNhYmxlQXV0b2RldGVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGdyYWRlcyB0aGUgb2xkIGhpZ2hsaWdodEJsb2NrIHBsdWdpbnMgdG8gdGhlIG5ld1xuICAgKiBoaWdobGlnaHRFbGVtZW50IEFQSVxuICAgKiBAcGFyYW0ge0hMSlNQbHVnaW59IHBsdWdpblxuICAgKi9cbiAgZnVuY3Rpb24gdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pIHtcbiAgICAvLyBUT0RPOiByZW1vdmUgd2l0aCB2MTJcbiAgICBpZiAocGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEJsb2NrXCJdICYmICFwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0RWxlbWVudFwiXSkge1xuICAgICAgcGx1Z2luW1wiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJiZWZvcmU6aGlnaGxpZ2h0QmxvY2tcIl0oXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih7IGJsb2NrOiBkYXRhLmVsIH0sIGRhdGEpXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocGx1Z2luW1wiYWZ0ZXI6aGlnaGxpZ2h0QmxvY2tcIl0gJiYgIXBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0pIHtcbiAgICAgIHBsdWdpbltcImFmdGVyOmhpZ2hsaWdodEVsZW1lbnRcIl0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBwbHVnaW5bXCJhZnRlcjpoaWdobGlnaHRCbG9ja1wiXShcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHsgYmxvY2s6IGRhdGEuZWwgfSwgZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SExKU1BsdWdpbn0gcGx1Z2luXG4gICAqL1xuICBmdW5jdGlvbiBhZGRQbHVnaW4ocGx1Z2luKSB7XG4gICAgdXBncmFkZVBsdWdpbkFQSShwbHVnaW4pO1xuICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7UGx1Z2luRXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7YW55fSBhcmdzXG4gICAqL1xuICBmdW5jdGlvbiBmaXJlKGV2ZW50LCBhcmdzKSB7XG4gICAgY29uc3QgY2IgPSBldmVudDtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG4gICAgICBpZiAocGx1Z2luW2NiXSkge1xuICAgICAgICBwbHVnaW5bY2JdKGFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERFUFJFQ0FURURcbiAgICogQHBhcmFtIHtIaWdobGlnaHRlZEhUTUxFbGVtZW50fSBlbFxuICAgKi9cbiAgZnVuY3Rpb24gZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2soZWwpIHtcbiAgICBkZXByZWNhdGVkKFwiMTAuNy4wXCIsIFwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wXCIpO1xuICAgIGRlcHJlY2F0ZWQoXCIxMC43LjBcIiwgXCJQbGVhc2UgdXNlIGhpZ2hsaWdodEVsZW1lbnQgbm93LlwiKTtcblxuICAgIHJldHVybiBoaWdobGlnaHRFbGVtZW50KGVsKTtcbiAgfVxuXG4gIC8qIEludGVyZmFjZSBkZWZpbml0aW9uICovXG4gIE9iamVjdC5hc3NpZ24oaGxqcywge1xuICAgIGhpZ2hsaWdodCxcbiAgICBoaWdobGlnaHRBdXRvLFxuICAgIGhpZ2hsaWdodEFsbCxcbiAgICBoaWdobGlnaHRFbGVtZW50LFxuICAgIC8vIFRPRE86IFJlbW92ZSB3aXRoIHYxMiBBUElcbiAgICBoaWdobGlnaHRCbG9jazogZGVwcmVjYXRlSGlnaGxpZ2h0QmxvY2ssXG4gICAgY29uZmlndXJlLFxuICAgIGluaXRIaWdobGlnaHRpbmcsXG4gICAgaW5pdEhpZ2hsaWdodGluZ09uTG9hZCxcbiAgICByZWdpc3Rlckxhbmd1YWdlLFxuICAgIHVucmVnaXN0ZXJMYW5ndWFnZSxcbiAgICBsaXN0TGFuZ3VhZ2VzLFxuICAgIGdldExhbmd1YWdlLFxuICAgIHJlZ2lzdGVyQWxpYXNlcyxcbiAgICBhdXRvRGV0ZWN0aW9uLFxuICAgIGluaGVyaXQsXG4gICAgYWRkUGx1Z2luXG4gIH0pO1xuXG4gIGhsanMuZGVidWdNb2RlID0gZnVuY3Rpb24oKSB7IFNBRkVfTU9ERSA9IGZhbHNlOyB9O1xuICBobGpzLnNhZmVNb2RlID0gZnVuY3Rpb24oKSB7IFNBRkVfTU9ERSA9IHRydWU7IH07XG4gIGhsanMudmVyc2lvblN0cmluZyA9IHZlcnNpb247XG5cbiAgaGxqcy5yZWdleCA9IHtcbiAgICBjb25jYXQ6IGNvbmNhdCxcbiAgICBsb29rYWhlYWQ6IGxvb2thaGVhZCxcbiAgICBlaXRoZXI6IGVpdGhlcixcbiAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgYW55TnVtYmVyT2ZUaW1lczogYW55TnVtYmVyT2ZUaW1lc1xuICB9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIE1PREVTKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgTU9ERVNba2V5XSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZGVlcEZyZWV6ZUVzNi5leHBvcnRzKE1PREVTW2tleV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1lcmdlIGFsbCB0aGUgbW9kZXMvcmVnZXhlcyBpbnRvIG91ciBtYWluIG9iamVjdFxuICBPYmplY3QuYXNzaWduKGhsanMsIE1PREVTKTtcblxuICByZXR1cm4gaGxqcztcbn07XG5cbi8vIGV4cG9ydCBhbiBcImluc3RhbmNlXCIgb2YgdGhlIGhpZ2hsaWdodGVyXG52YXIgaGlnaGxpZ2h0ID0gSExKUyh7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gaGlnaGxpZ2h0O1xuaGlnaGxpZ2h0LkhpZ2hsaWdodEpTID0gaGlnaGxpZ2h0O1xuaGlnaGxpZ2h0LmRlZmF1bHQgPSBoaWdobGlnaHQ7XG4iLCAiaW1wb3J0IHsgZmluZENoaWxkcmVuIH0gZnJvbSAnQHRpcHRhcC9jb3JlJ1xuaW1wb3J0IHsgTm9kZSBhcyBQcm9zZW1pcnJvck5vZGUgfSBmcm9tICdAdGlwdGFwL3BtL21vZGVsJ1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCB9IGZyb20gJ0B0aXB0YXAvcG0vdmlldydcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBoaWdobGlnaHQgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9jb3JlJ1xuXG5mdW5jdGlvbiBwYXJzZU5vZGVzKG5vZGVzOiBhbnlbXSwgY2xhc3NOYW1lOiBzdHJpbmdbXSA9IFtdKTogeyB0ZXh0OiBzdHJpbmc7IGNsYXNzZXM6IHN0cmluZ1tdIH1bXSB7XG4gIHJldHVybiBub2Rlc1xuICAgIC5tYXAobm9kZSA9PiB7XG4gICAgICBjb25zdCBjbGFzc2VzID0gWy4uLmNsYXNzTmFtZSwgLi4uKG5vZGUucHJvcGVydGllcyA/IG5vZGUucHJvcGVydGllcy5jbGFzc05hbWUgOiBbXSldXG5cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBwYXJzZU5vZGVzKG5vZGUuY2hpbGRyZW4sIGNsYXNzZXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQ6IG5vZGUudmFsdWUsXG4gICAgICAgIGNsYXNzZXMsXG4gICAgICB9XG4gICAgfSlcbiAgICAuZmxhdCgpXG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodE5vZGVzKHJlc3VsdDogYW55KSB7XG4gIC8vIGAudmFsdWVgIGZvciBsb3dsaWdodCB2MSwgYC5jaGlsZHJlbmAgZm9yIGxvd2xpZ2h0IHYyXG4gIHJldHVybiByZXN1bHQudmFsdWUgfHwgcmVzdWx0LmNoaWxkcmVuIHx8IFtdXG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyZWQoYWxpYXNPckxhbmd1YWdlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIEJvb2xlYW4oaGlnaGxpZ2h0LmdldExhbmd1YWdlKGFsaWFzT3JMYW5ndWFnZSkpXG59XG5cbmZ1bmN0aW9uIGdldERlY29yYXRpb25zKHtcbiAgZG9jLFxuICBuYW1lLFxuICBsb3dsaWdodCxcbiAgZGVmYXVsdExhbmd1YWdlLFxufToge1xuICBkb2M6IFByb3NlbWlycm9yTm9kZVxuICBuYW1lOiBzdHJpbmdcbiAgbG93bGlnaHQ6IGFueVxuICBkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbn0pIHtcbiAgY29uc3QgZGVjb3JhdGlvbnM6IERlY29yYXRpb25bXSA9IFtdXG5cbiAgZmluZENoaWxkcmVuKGRvYywgbm9kZSA9PiBub2RlLnR5cGUubmFtZSA9PT0gbmFtZSkuZm9yRWFjaChibG9jayA9PiB7XG4gICAgbGV0IGZyb20gPSBibG9jay5wb3MgKyAxXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBibG9jay5ub2RlLmF0dHJzLmxhbmd1YWdlIHx8IGRlZmF1bHRMYW5ndWFnZVxuICAgIGNvbnN0IGxhbmd1YWdlcyA9IGxvd2xpZ2h0Lmxpc3RMYW5ndWFnZXMoKVxuXG4gICAgY29uc3Qgbm9kZXMgPSBsYW5ndWFnZSAmJiAobGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSB8fCByZWdpc3RlcmVkKGxhbmd1YWdlKSlcbiAgICAgID8gZ2V0SGlnaGxpZ2h0Tm9kZXMobG93bGlnaHQuaGlnaGxpZ2h0KGxhbmd1YWdlLCBibG9jay5ub2RlLnRleHRDb250ZW50KSlcbiAgICAgIDogZ2V0SGlnaGxpZ2h0Tm9kZXMobG93bGlnaHQuaGlnaGxpZ2h0QXV0byhibG9jay5ub2RlLnRleHRDb250ZW50KSlcblxuICAgIHBhcnNlTm9kZXMobm9kZXMpLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBjb25zdCB0byA9IGZyb20gKyBub2RlLnRleHQubGVuZ3RoXG5cbiAgICAgIGlmIChub2RlLmNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlY29yYXRpb24gPSBEZWNvcmF0aW9uLmlubGluZShmcm9tLCB0bywge1xuICAgICAgICAgIGNsYXNzOiBub2RlLmNsYXNzZXMuam9pbignICcpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGRlY29yYXRpb25zLnB1c2goZGVjb3JhdGlvbilcbiAgICAgIH1cblxuICAgICAgZnJvbSA9IHRvXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucylcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihwYXJhbTogRnVuY3Rpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTG93bGlnaHRQbHVnaW4oe1xuICBuYW1lLFxuICBsb3dsaWdodCxcbiAgZGVmYXVsdExhbmd1YWdlLFxufToge1xuICBuYW1lOiBzdHJpbmdcbiAgbG93bGlnaHQ6IGFueVxuICBkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbn0pIHtcbiAgaWYgKCFbJ2hpZ2hsaWdodCcsICdoaWdobGlnaHRBdXRvJywgJ2xpc3RMYW5ndWFnZXMnXS5ldmVyeShhcGkgPT4gaXNGdW5jdGlvbihsb3dsaWdodFthcGldKSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICdZb3Ugc2hvdWxkIHByb3ZpZGUgYW4gaW5zdGFuY2Ugb2YgbG93bGlnaHQgdG8gdXNlIHRoZSBjb2RlLWJsb2NrLWxvd2xpZ2h0IGV4dGVuc2lvbicsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbG93bGlnaHRQbHVnaW46IFBsdWdpbjxhbnk+ID0gbmV3IFBsdWdpbih7XG4gICAga2V5OiBuZXcgUGx1Z2luS2V5KCdsb3dsaWdodCcpLFxuXG4gICAgc3RhdGU6IHtcbiAgICAgIGluaXQ6IChfLCB7IGRvYyB9KSA9PiBnZXREZWNvcmF0aW9ucyh7XG4gICAgICAgIGRvYyxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbG93bGlnaHQsXG4gICAgICAgIGRlZmF1bHRMYW5ndWFnZSxcbiAgICAgIH0pLFxuICAgICAgYXBwbHk6ICh0cmFuc2FjdGlvbiwgZGVjb3JhdGlvblNldCwgb2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZE5vZGVOYW1lID0gb2xkU3RhdGUuc2VsZWN0aW9uLiRoZWFkLnBhcmVudC50eXBlLm5hbWVcbiAgICAgICAgY29uc3QgbmV3Tm9kZU5hbWUgPSBuZXdTdGF0ZS5zZWxlY3Rpb24uJGhlYWQucGFyZW50LnR5cGUubmFtZVxuICAgICAgICBjb25zdCBvbGROb2RlcyA9IGZpbmRDaGlsZHJlbihvbGRTdGF0ZS5kb2MsIG5vZGUgPT4gbm9kZS50eXBlLm5hbWUgPT09IG5hbWUpXG4gICAgICAgIGNvbnN0IG5ld05vZGVzID0gZmluZENoaWxkcmVuKG5ld1N0YXRlLmRvYywgbm9kZSA9PiBub2RlLnR5cGUubmFtZSA9PT0gbmFtZSlcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHJhbnNhY3Rpb24uZG9jQ2hhbmdlZFxuICAgICAgICAgIC8vIEFwcGx5IGRlY29yYXRpb25zIGlmOlxuICAgICAgICAgIC8vIHNlbGVjdGlvbiBpbmNsdWRlcyBuYW1lZCBub2RlLFxuICAgICAgICAgICYmIChbb2xkTm9kZU5hbWUsIG5ld05vZGVOYW1lXS5pbmNsdWRlcyhuYW1lKVxuICAgICAgICAgICAgLy8gT1IgdHJhbnNhY3Rpb24gYWRkcy9yZW1vdmVzIG5hbWVkIG5vZGUsXG4gICAgICAgICAgICB8fCBuZXdOb2Rlcy5sZW5ndGggIT09IG9sZE5vZGVzLmxlbmd0aFxuICAgICAgICAgICAgLy8gT1IgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZXMgdGhhdCBjb21wbGV0ZWx5IGVuY2Fwc3VsdGUgYSBub2RlXG4gICAgICAgICAgICAvLyAoZm9yIGV4YW1wbGUsIGEgdHJhbnNhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBlbnRpcmUgZG9jdW1lbnQpLlxuICAgICAgICAgICAgLy8gU3VjaCB0cmFuc2FjdGlvbnMgY2FuIGhhcHBlbiBkdXJpbmcgY29sbGFiIHN5bmNpbmcgdmlhIHktcHJvc2VtaXJyb3IsIGZvciBleGFtcGxlLlxuICAgICAgICAgICAgfHwgdHJhbnNhY3Rpb24uc3RlcHMuc29tZShzdGVwID0+IHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBzdGVwLmZyb20gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAmJiBzdGVwLnRvICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAmJiBvbGROb2Rlcy5zb21lKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBub2RlLnBvcyA+PSBzdGVwLmZyb21cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAmJiBub2RlLnBvcyArIG5vZGUubm9kZS5ub2RlU2l6ZSA8PSBzdGVwLnRvXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBnZXREZWNvcmF0aW9ucyh7XG4gICAgICAgICAgICBkb2M6IHRyYW5zYWN0aW9uLmRvYyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBsb3dsaWdodCxcbiAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlY29yYXRpb25TZXQubWFwKHRyYW5zYWN0aW9uLm1hcHBpbmcsIHRyYW5zYWN0aW9uLmRvYylcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHByb3BzOiB7XG4gICAgICBkZWNvcmF0aW9ucyhzdGF0ZSkge1xuICAgICAgICByZXR1cm4gbG93bGlnaHRQbHVnaW4uZ2V0U3RhdGUoc3RhdGUpXG4gICAgICB9LFxuICAgIH0sXG4gIH0pXG5cbiAgcmV0dXJuIGxvd2xpZ2h0UGx1Z2luXG59XG4iLCAiaW1wb3J0IENvZGVCbG9jaywgeyBDb2RlQmxvY2tPcHRpb25zIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jaydcblxuaW1wb3J0IHsgTG93bGlnaHRQbHVnaW4gfSBmcm9tICcuL2xvd2xpZ2h0LXBsdWdpbi5qcydcblxuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tMb3dsaWdodE9wdGlvbnMgZXh0ZW5kcyBDb2RlQmxvY2tPcHRpb25zIHtcbiAgbG93bGlnaHQ6IGFueSxcbiAgZGVmYXVsdExhbmd1YWdlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxufVxuXG5leHBvcnQgY29uc3QgQ29kZUJsb2NrTG93bGlnaHQgPSBDb2RlQmxvY2suZXh0ZW5kPENvZGVCbG9ja0xvd2xpZ2h0T3B0aW9ucz4oe1xuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnBhcmVudD8uKCksXG4gICAgICBsb3dsaWdodDoge30sXG4gICAgICBkZWZhdWx0TGFuZ3VhZ2U6IG51bGwsXG4gICAgfVxuICB9LFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5wYXJlbnQ/LigpIHx8IFtdLFxuICAgICAgTG93bGlnaHRQbHVnaW4oe1xuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGxvd2xpZ2h0OiB0aGlzLm9wdGlvbnMubG93bGlnaHQsXG4gICAgICAgIGRlZmF1bHRMYW5ndWFnZTogdGhpcy5vcHRpb25zLmRlZmF1bHRMYW5ndWFnZSxcbiAgICAgIH0pLFxuICAgIF1cbiAgfSxcbn0pXG4iLCAiaW1wb3J0IENvZGVCbG9ja0xvd2xpZ2h0IGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1jb2RlLWJsb2NrLWxvd2xpZ2h0XCI7XG5cbmV4cG9ydCBjb25zdCBDdXN0b21Db2RlQmxvY2tMb3dsaWdodCA9IENvZGVCbG9ja0xvd2xpZ2h0LmV4dGVuZCh7XG4gIGFkZEtleWJvYXJkU2hvcnRjdXRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnBhcmVudD8uKCksXG4gICAgICBBcnJvd0Rvd246ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmVkaXRvci5zdGF0ZTtcbiAgICAgICAgY29uc3QgeyBmcm9tLCB0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuXG4gICAgICAgIGlmIChmcm9tID4gMSAmJiBmcm9tID09PSB0bykge1xuICAgICAgICAgIGxldCBpbkNvZGVCbG9jayA9IGZhbHNlO1xuICAgICAgICAgIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSAtIDEsIHRvIC0gMSwgKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUubmFtZSA9PT0gXCJjb2RlQmxvY2tcIikgaW5Db2RlQmxvY2sgPSB0cnVlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbGV0IG5vdGhpbmdPblJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20gKyAxLCB0byArIDEsIChub2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZSkgbm90aGluZ09uUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChpbkNvZGVCbG9jayAmJiBub3RoaW5nT25SaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldEhhcmRCcmVhaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7Tm9kZSwgbWVyZ2VBdHRyaWJ1dGVzfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5cbmV4cG9ydCBjb25zdCBIdXJkbGUgPSBOb2RlLmNyZWF0ZSh7XG4gICAgbmFtZTogXCJodXJkbGVcIixcbiAgICBncm91cDogXCJibG9ja1wiLFxuICAgIGNvbnRlbnQ6IFwiYmxvY2srXCIsXG4gICAgYWRkT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbG9yczogWydncmF5X2xpZ2h0JywgJ2dyYXknLCAnZ3JheV9kYXJrJywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5JywgJ3RlcnRpYXJ5JywgJ2FjY2VudCddLFxuICAgICAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtaHVyZGxlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgYWRkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJ2dyYXknLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb2xvcicpLFxuICAgICAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtY29sb3InOiBhdHRyaWJ1dGVzLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgICAgICAgICBnZXRBdHRyczogKGVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmlsYW1lbnQtdGlwdGFwLWh1cmRsZVwiKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfSxcbiAgICByZW5kZXJIVE1MKHtub2RlLCBIVE1MQXR0cmlidXRlc30pIHtcbiAgICAgICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICAgIH0sXG4gICAgYWRkQ29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXRIdXJkbGU6IGF0dHJpYnV0ZXMgPT4gKHtjb21tYW5kc30pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5jb2xvcnMuaW5jbHVkZXMoYXR0cmlidXRlcy5jb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVXcmFwKHRoaXMubmFtZSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59KTtcbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5cbmV4cG9ydCBjb25zdCBDdXN0b21UZXh0QWxpZ24gPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgICBuYW1lOiAndGV4dEFsaWduJyxcblxuICAgIGFkZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlczogW10sXG4gICAgICAgICAgICBhbGlnbm1lbnRzOiBbJ3N0YXJ0JywgJ2NlbnRlcicsICdlbmQnLCAnanVzdGlmeSddLFxuICAgICAgICAgICAgZGVmYXVsdEFsaWdubWVudDogJ3N0YXJ0JyxcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRHbG9iYWxBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGVzOiB0aGlzLm9wdGlvbnMudHlwZXMsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRoaXMub3B0aW9ucy5kZWZhdWx0QWxpZ25tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuc3R5bGUudGV4dEFsaWduIHx8IHRoaXMub3B0aW9ucy5kZWZhdWx0QWxpZ25tZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMudGV4dEFsaWduID09PSB0aGlzLm9wdGlvbnMuZGVmYXVsdEFsaWdubWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdHlsZTogYHRleHQtYWxpZ246ICR7YXR0cmlidXRlcy50ZXh0QWxpZ259YCB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfSxcblxuICAgIGFkZENvbW1hbmRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0VGV4dEFsaWduOiAoYWxpZ25tZW50KSA9PiAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxpZ25tZW50cy5pbmNsdWRlcyhhbGlnbm1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudHlwZXMuZXZlcnkodHlwZSA9PiBjb21tYW5kcy51cGRhdGVBdHRyaWJ1dGVzKHR5cGUsIHsgdGV4dEFsaWduOiBhbGlnbm1lbnQgfSkpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1bnNldFRleHRBbGlnbjogKCkgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudHlwZXMuZXZlcnkodHlwZSA9PiBjb21tYW5kcy5yZXNldEF0dHJpYnV0ZXModHlwZSwgJ3RleHRBbGlnbicpKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdNb2QtU2hpZnQtbCc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldFRleHRBbGlnbignc3RhcnQnKSxcbiAgICAgICAgICAgICdNb2QtU2hpZnQtZSc6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLnNldFRleHRBbGlnbignY2VudGVyJyksXG4gICAgICAgICAgICAnTW9kLVNoaWZ0LXInOiAoKSA9PiB0aGlzLmVkaXRvci5jb21tYW5kcy5zZXRUZXh0QWxpZ24oJ2VuZCcpLFxuICAgICAgICAgICAgJ01vZC1TaGlmdC1qJzogKCkgPT4gdGhpcy5lZGl0b3IuY29tbWFuZHMuc2V0VGV4dEFsaWduKCdqdXN0aWZ5JyksXG4gICAgICAgIH1cbiAgICB9LFxufSlcbiIsICJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsICJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwgImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCAiaW1wb3J0IGdldFVBU3RyaW5nIGZyb20gXCIuLi91dGlscy91c2VyQWdlbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTGF5b3V0Vmlld3BvcnQoKSB7XG4gIHJldHVybiAhL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChnZXRVQVN0cmluZygpKTtcbn0iLCAiaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSkge1xuICBpZiAoaW5jbHVkZVNjYWxlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlU2NhbGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gMTtcbiAgdmFyIHNjYWxlWSA9IDE7XG5cbiAgaWYgKGluY2x1ZGVTY2FsZSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgc2NhbGVYID0gZWxlbWVudC5vZmZzZXRXaWR0aCA+IDAgPyByb3VuZChjbGllbnRSZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMSA6IDE7XG4gICAgc2NhbGVZID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgPiAwID8gcm91bmQoY2xpZW50UmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMSA6IDE7XG4gIH1cblxuICB2YXIgX3JlZiA9IGlzRWxlbWVudChlbGVtZW50KSA/IGdldFdpbmRvdyhlbGVtZW50KSA6IHdpbmRvdyxcbiAgICAgIHZpc3VhbFZpZXdwb3J0ID0gX3JlZi52aXN1YWxWaWV3cG9ydDtcblxuICB2YXIgYWRkVmlzdWFsT2Zmc2V0cyA9ICFpc0xheW91dFZpZXdwb3J0KCkgJiYgaXNGaXhlZFN0cmF0ZWd5O1xuICB2YXIgeCA9IChjbGllbnRSZWN0LmxlZnQgKyAoYWRkVmlzdWFsT2Zmc2V0cyAmJiB2aXN1YWxWaWV3cG9ydCA/IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQgOiAwKSkgLyBzY2FsZVg7XG4gIHZhciB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3AgOiAwKSkgLyBzY2FsZVk7XG4gIHZhciB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIHZhciBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlWTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIGxlZnQ6IHgsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkge1xuICB2YXIgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSAmJiBjaGlsZC5nZXRSb290Tm9kZSgpOyAvLyBGaXJzdCwgYXR0ZW1wdCB3aXRoIGZhc3RlciBuYXRpdmUgbWV0aG9kXG5cbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyB0aGVuIGZhbGxiYWNrIHRvIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aXRoIFNoYWRvdyBET00gc3VwcG9ydFxuICBlbHNlIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgICB2YXIgbmV4dCA9IGNoaWxkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChuZXh0ICYmIHBhcmVudC5pc1NhbWVOb2RlKG5leHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddOiBuZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4uLlxuXG5cbiAgICAgICAgbmV4dCA9IG5leHQucGFyZW50Tm9kZSB8fCBuZXh0Lmhvc3Q7XG4gICAgICB9IHdoaWxlIChuZXh0KTtcbiAgICB9IC8vIEdpdmUgdXAsIHRoZSByZXN1bHQgaXMgZmFsc2VcblxuXG4gIHJldHVybiBmYWxzZTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0V2luZG93KGVsZW1lbnQpLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG59IiwgImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwgImltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSB7XG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgcmV0dXJuICgoaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudC5vd25lckRvY3VtZW50IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gIGVsZW1lbnQuZG9jdW1lbnQpIHx8IHdpbmRvdy5kb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50O1xufSIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgPj0gMCA/ICd4JyA6ICd5Jztcbn0iLCAiaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW4sIHZhbHVlLCBtYXgpIHtcbiAgcmV0dXJuIG1hdGhNYXgobWluLCBtYXRoTWluKHZhbHVlLCBtYXgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW5NYXhDbGFtcChtaW4sIHZhbHVlLCBtYXgpIHtcbiAgdmFyIHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwgImltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4vZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZVBhZGRpbmdPYmplY3QocGFkZGluZ09iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCksIHBhZGRpbmdPYmplY3QpO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBleHBhbmRUb0hhc2hNYXAodmFsdWUsIGtleXMpIHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChoYXNoTWFwLCBrZXkpIHtcbiAgICBoYXNoTWFwW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gaGFzaE1hcDtcbiAgfSwge30pO1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBlbmQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB1bnNldFNpZGVzID0ge1xuICB0b3A6ICdhdXRvJyxcbiAgcmlnaHQ6ICdhdXRvJyxcbiAgYm90dG9tOiAnYXV0bycsXG4gIGxlZnQ6ICdhdXRvJ1xufTsgLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cblxuZnVuY3Rpb24gcm91bmRPZmZzZXRzQnlEUFIoX3JlZiwgd2luKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0sIGdldFdpbmRvdyhwb3BwZXIpKSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjQueDtcbiAgeSA9IF9yZWY0Lnk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbiA9IHt9LCBfT2JqZWN0JGFzc2lnbltzaWRlWV0gPSBoYXNZID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduW3NpZGVYXSA9IGhhc1ggPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ24udHJhbnNmb3JtID0gKHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIDw9IDEgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduMiA9IHt9LCBfT2JqZWN0JGFzc2lnbjJbc2lkZVldID0gaGFzWSA/IHkgKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yW3NpZGVYXSA9IGhhc1ggPyB4ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMi50cmFuc2Zvcm0gPSAnJywgX09iamVjdCRhc3NpZ24yKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTdHlsZXMoX3JlZjUpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjUub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9IG9wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZ3B1QWNjZWxlcmF0LFxuICAgICAgX29wdGlvbnMkYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlLFxuICAgICAgYWRhcHRpdmUgPSBfb3B0aW9ucyRhZGFwdGl2ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFkYXB0aXZlLFxuICAgICAgX29wdGlvbnMkcm91bmRPZmZzZXRzID0gb3B0aW9ucy5yb3VuZE9mZnNldHMsXG4gICAgICByb3VuZE9mZnNldHMgPSBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyb3VuZE9mZnNldHM7XG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgdmFyaWF0aW9uOiBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KSxcbiAgICBwb3BwZXI6IHN0YXRlLmVsZW1lbnRzLnBvcHBlcixcbiAgICBwb3BwZXJSZWN0OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgZ3B1QWNjZWxlcmF0aW9uOiBncHVBY2NlbGVyYXRpb24sXG4gICAgaXNGaXhlZDogc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJ1xuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCAidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwgInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBpc0xheW91dFZpZXdwb3J0IGZyb20gXCIuL2lzTGF5b3V0Vmlld3BvcnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICB2YXIgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuXG4gIGlmICh2aXN1YWxWaWV3cG9ydCkge1xuICAgIHdpZHRoID0gdmlzdWFsVmlld3BvcnQud2lkdGg7XG4gICAgaGVpZ2h0ID0gdmlzdWFsVmlld3BvcnQuaGVpZ2h0O1xuICAgIHZhciBsYXlvdXRWaWV3cG9ydCA9IGlzTGF5b3V0Vmlld3BvcnQoKTtcblxuICAgIGlmIChsYXlvdXRWaWV3cG9ydCB8fCAhbGF5b3V0Vmlld3BvcnQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwgImltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2Nyb2xsUGFyZW50KGVsZW1lbnQpIHtcbiAgLy8gRmlyZWZveCB3YW50cyB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbFxuICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLFxuICAgICAgb3ZlcmZsb3cgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvdyxcbiAgICAgIG92ZXJmbG93WCA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WCxcbiAgICAgIG92ZXJmbG93WSA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93WTtcblxuICByZXR1cm4gL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVuLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKTtcbn0iLCAiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCAiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCAiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgZmFsc2UsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudCA9PT0gdmlld3BvcnQgPyByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpIDogaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSA/IGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnksIHN0cmF0ZWd5KSB7XG4gIHZhciBtYWluQ2xpcHBpbmdQYXJlbnRzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ1BhcmVudHMnID8gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IFtdLmNvbmNhdChtYWluQ2xpcHBpbmdQYXJlbnRzLCBbcm9vdEJvdW5kYXJ5XSk7XG4gIHZhciBmaXJzdENsaXBwaW5nUGFyZW50ID0gY2xpcHBpbmdQYXJlbnRzWzBdO1xuICB2YXIgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgICB2YXIgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCAiaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkc3RyYXRlZ3kgPSBfb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHN0cmF0ZWd5ID0gX29wdGlvbnMkc3RyYXRlZ3kgPT09IHZvaWQgMCA/IHN0YXRlLnN0cmF0ZWd5IDogX29wdGlvbnMkc3RyYXRlZ3ksXG4gICAgICBfb3B0aW9ucyRib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucyRib3VuZGFyeSA9PT0gdm9pZCAwID8gY2xpcHBpbmdQYXJlbnRzIDogX29wdGlvbnMkYm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRyb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucyRyb290Qm91bmRhcnkgPT09IHZvaWQgMCA/IHZpZXdwb3J0IDogX29wdGlvbnMkcm9vdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZWxlbWVudENvbnRlID0gX29wdGlvbnMuZWxlbWVudENvbnRleHQsXG4gICAgICBlbGVtZW50Q29udGV4dCA9IF9vcHRpb25zJGVsZW1lbnRDb250ZSA9PT0gdm9pZCAwID8gcG9wcGVyIDogX29wdGlvbnMkZWxlbWVudENvbnRlLFxuICAgICAgX29wdGlvbnMkYWx0Qm91bmRhcnkgPSBfb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMkYWx0Qm91bmRhcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucyRwYWRkaW5nID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkcGFkZGluZztcbiAgdmFyIHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xuICB2YXIgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyByZWZlcmVuY2UgOiBwb3BwZXI7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpO1xuICB2YXIgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oe30sIHBvcHBlclJlY3QsIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCAiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIFx1MjAxMyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsICJpbXBvcnQgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QsIHByZXZlbnRlZE9mZnNldHMpIHtcbiAgaWYgKHByZXZlbnRlZE9mZnNldHMgPT09IHZvaWQgMCkge1xuICAgIHByZXZlbnRlZE9mZnNldHMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQgLSBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCArIHByZXZlbnRlZE9mZnNldHMueCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0ICsgcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoIC0gcHJldmVudGVkT2Zmc2V0cy54XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0uc29tZShmdW5jdGlvbiAoc2lkZSkge1xuICAgIHJldHVybiBvdmVyZmxvd1tzaWRlXSA+PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGlkZShfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBwcmV2ZW50ZWRPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3c7XG4gIHZhciByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gIH0pO1xuICB2YXIgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gIH0pO1xuICB2YXIgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocmVmZXJlbmNlT3ZlcmZsb3csIHJlZmVyZW5jZVJlY3QpO1xuICB2YXIgcG9wcGVyRXNjYXBlT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHBvcHBlckFsdE92ZXJmbG93LCBwb3BwZXJSZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKTtcbiAgdmFyIGlzUmVmZXJlbmNlSGlkZGVuID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyk7XG4gIHZhciBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0ge1xuICAgIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czogcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHM6IHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW46IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgIGhhc1BvcHBlckVzY2FwZWQ6IGhhc1BvcHBlckVzY2FwZWRcbiAgfTtcbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59OyIsICJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsICJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QWx0QXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59IiwgImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59IiwgImltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRIVE1MRWxlbWVudFNjcm9sbCBmcm9tIFwiLi9nZXRIVE1MRWxlbWVudFNjcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZVNjcm9sbChub2RlKSB7XG4gIGlmIChub2RlID09PSBnZXRXaW5kb3cobm9kZSkgfHwgIWlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsKG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRIVE1MRWxlbWVudFNjcm9sbChub2RlKTtcbiAgfVxufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSBcIi4vZ2V0Tm9kZVNjcm9sbC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQsIGlzRml4ZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCAiaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIFx1MjAxMyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUgXHUyMDEzIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZi5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCAiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG5pbXBvcnQgb2Zmc2V0IGZyb20gXCIuL21vZGlmaWVycy9vZmZzZXQuanNcIjtcbmltcG9ydCBmbGlwIGZyb20gXCIuL21vZGlmaWVycy9mbGlwLmpzXCI7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gXCIuL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBhcnJvdyBmcm9tIFwiLi9tb2RpZmllcnMvYXJyb3cuanNcIjtcbmltcG9ydCBoaWRlIGZyb20gXCIuL21vZGlmaWVycy9oaWRlLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvdywgaGlkZV07XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsiLCAiZXhwb3J0IGNvbnN0IFJPVU5EX0FSUk9XID1cbiAgJzxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0wIDZzMS43OTYtLjAxMyA0LjY3LTMuNjE1QzUuODUxLjkgNi45My4wMDYgOCAwYzEuMDctLjAwNiAyLjE0OC44ODcgMy4zNDMgMi4zODVDMTQuMjMzIDYuMDA1IDE2IDYgMTYgNkgwelwiPjwvc3ZnPic7XG5cbmV4cG9ydCBjb25zdCBCT1hfQ0xBU1MgPSBgX19OQU1FU1BBQ0VfUFJFRklYX18tYm94YDtcbmV4cG9ydCBjb25zdCBDT05URU5UX0NMQVNTID0gYF9fTkFNRVNQQUNFX1BSRUZJWF9fLWNvbnRlbnRgO1xuZXhwb3J0IGNvbnN0IEJBQ0tEUk9QX0NMQVNTID0gYF9fTkFNRVNQQUNFX1BSRUZJWF9fLWJhY2tkcm9wYDtcbmV4cG9ydCBjb25zdCBBUlJPV19DTEFTUyA9IGBfX05BTUVTUEFDRV9QUkVGSVhfXy1hcnJvd2A7XG5leHBvcnQgY29uc3QgU1ZHX0FSUk9XX0NMQVNTID0gYF9fTkFNRVNQQUNFX1BSRUZJWF9fLXN2Zy1hcnJvd2A7XG5cbmV4cG9ydCBjb25zdCBUT1VDSF9PUFRJT05TID0ge3Bhc3NpdmU6IHRydWUsIGNhcHR1cmU6IHRydWV9O1xuXG5leHBvcnQgY29uc3QgVElQUFlfREVGQVVMVF9BUFBFTkRfVE8gPSAoKSA9PiBkb2N1bWVudC5ib2R5O1xuIiwgImltcG9ydCB7QmFzZVBsYWNlbWVudCwgUGxhY2VtZW50fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBrZXk6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIHJldHVybiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQXRJbmRleE9yUmV0dXJuPFQ+KFxuICB2YWx1ZTogVCB8IFtUIHwgbnVsbCwgVCB8IG51bGxdLFxuICBpbmRleDogbnVtYmVyLFxuICBkZWZhdWx0VmFsdWU6IFQgfCBbVCwgVF1cbik6IFQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCB2ID0gdmFsdWVbaW5kZXhdO1xuICAgIHJldHVybiB2ID09IG51bGxcbiAgICAgID8gQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpXG4gICAgICAgID8gZGVmYXVsdFZhbHVlW2luZGV4XVxuICAgICAgICA6IGRlZmF1bHRWYWx1ZVxuICAgICAgOiB2O1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlKHZhbHVlOiBhbnksIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzdHIgPSB7fS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgcmV0dXJuIHN0ci5pbmRleE9mKCdbb2JqZWN0JykgPT09IDAgJiYgc3RyLmluZGV4T2YoYCR7dHlwZX1dYCkgPiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVdpdGhBcmdzT3JSZXR1cm4odmFsdWU6IGFueSwgYXJnczogYW55W10pOiBhbnkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUoLi4uYXJncykgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlPFQ+KFxuICBmbjogKGFyZzogVCkgPT4gdm9pZCxcbiAgbXM6IG51bWJlclxuKTogKGFyZzogVCkgPT4gdm9pZCB7XG4gIC8vIEF2b2lkIHdyYXBwaW5nIGluIGBzZXRUaW1lb3V0YCBpZiBtcyBpcyAwIGFueXdheVxuICBpZiAobXMgPT09IDApIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBsZXQgdGltZW91dDogYW55O1xuXG4gIHJldHVybiAoYXJnKTogdm9pZCA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZuKGFyZyk7XG4gICAgfSwgbXMpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydGllczxUPihvYmo6IFQsIGtleXM6IHN0cmluZ1tdKTogUGFydGlhbDxUPiB7XG4gIGNvbnN0IGNsb25lID0gey4uLm9ian07XG4gIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgZGVsZXRlIChjbG9uZSBhcyBhbnkpW2tleV07XG4gIH0pO1xuICByZXR1cm4gY2xvbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5U3BhY2VzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRvQXJyYXk8VD4odmFsdWU6IFQgfCBUW10pOiBUW10ge1xuICByZXR1cm4gKFtdIGFzIFRbXSkuY29uY2F0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hJZlVuaXF1ZTxUPihhcnI6IFRbXSwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgaWYgKGFyci5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBhcnIucHVzaCh2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFB4SWZOdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gYCR7dmFsdWV9cHhgIDogdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oYXJyOiBUW10pOiBUW10ge1xuICByZXR1cm4gYXJyLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IGFyci5pbmRleE9mKGl0ZW0pID09PSBpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50OiBQbGFjZW1lbnQpOiBCYXNlUGxhY2VtZW50IHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdIGFzIEJhc2VQbGFjZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUZyb20odmFsdWU6IEFycmF5TGlrZTxhbnk+KTogYW55W10ge1xuICByZXR1cm4gW10uc2xpY2UuY2FsbCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVVbmRlZmluZWRQcm9wcyhcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgaWYgKG9ialtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIChhY2MgYXMgYW55KVtrZXldID0gb2JqW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufVxuIiwgImltcG9ydCB7UmVmZXJlbmNlRWxlbWVudCwgVGFyZ2V0c30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1BvcHBlclRyZWVEYXRhfSBmcm9tICcuL3R5cGVzLWludGVybmFsJztcbmltcG9ydCB7YXJyYXlGcm9tLCBpc1R5cGUsIG5vcm1hbGl6ZVRvQXJyYXksIGdldEJhc2VQbGFjZW1lbnR9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2KCk6IEhUTUxEaXZFbGVtZW50IHtcbiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICByZXR1cm4gWydFbGVtZW50JywgJ0ZyYWdtZW50J10uc29tZSgodHlwZSkgPT4gaXNUeXBlKHZhbHVlLCB0eXBlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVMaXN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTm9kZUxpc3Qge1xuICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnTm9kZUxpc3QnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW91c2VFdmVudCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE1vdXNlRXZlbnQge1xuICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnTW91c2VFdmVudCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZlcmVuY2VFbGVtZW50KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWZlcmVuY2VFbGVtZW50IHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl90aXBweSAmJiB2YWx1ZS5fdGlwcHkucmVmZXJlbmNlID09PSB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcnJheU9mRWxlbWVudHModmFsdWU6IFRhcmdldHMpOiBFbGVtZW50W10ge1xuICBpZiAoaXNFbGVtZW50KHZhbHVlKSkge1xuICAgIHJldHVybiBbdmFsdWVdO1xuICB9XG5cbiAgaWYgKGlzTm9kZUxpc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGFycmF5RnJvbSh2YWx1ZSk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gYXJyYXlGcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRyYW5zaXRpb25EdXJhdGlvbihcbiAgZWxzOiAoSFRNTERpdkVsZW1lbnQgfCBudWxsKVtdLFxuICB2YWx1ZTogbnVtYmVyXG4pOiB2b2lkIHtcbiAgZWxzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHt2YWx1ZX1tc2A7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFZpc2liaWxpdHlTdGF0ZShcbiAgZWxzOiAoSFRNTERpdkVsZW1lbnQgfCBudWxsKVtdLFxuICBzdGF0ZTogJ3Zpc2libGUnIHwgJ2hpZGRlbidcbik6IHZvaWQge1xuICBlbHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScsIHN0YXRlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudChcbiAgZWxlbWVudE9yRWxlbWVudHM6IEVsZW1lbnQgfCBFbGVtZW50W11cbik6IERvY3VtZW50IHtcbiAgY29uc3QgW2VsZW1lbnRdID0gbm9ybWFsaXplVG9BcnJheShlbGVtZW50T3JFbGVtZW50cyk7XG5cbiAgLy8gRWxlbWVudHMgY3JlYXRlZCB2aWEgYSA8dGVtcGxhdGU+IGhhdmUgYW4gb3duZXJEb2N1bWVudCB3aXRoIG5vIHJlZmVyZW5jZSB0byB0aGUgYm9keVxuICByZXR1cm4gZWxlbWVudD8ub3duZXJEb2N1bWVudD8uYm9keSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IGRvY3VtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDdXJzb3JPdXRzaWRlSW50ZXJhY3RpdmVCb3JkZXIoXG4gIHBvcHBlclRyZWVEYXRhOiBQb3BwZXJUcmVlRGF0YVtdLFxuICBldmVudDogTW91c2VFdmVudFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtjbGllbnRYLCBjbGllbnRZfSA9IGV2ZW50O1xuXG4gIHJldHVybiBwb3BwZXJUcmVlRGF0YS5ldmVyeSgoe3BvcHBlclJlY3QsIHBvcHBlclN0YXRlLCBwcm9wc30pID0+IHtcbiAgICBjb25zdCB7aW50ZXJhY3RpdmVCb3JkZXJ9ID0gcHJvcHM7XG4gICAgY29uc3QgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocG9wcGVyU3RhdGUucGxhY2VtZW50KTtcbiAgICBjb25zdCBvZmZzZXREYXRhID0gcG9wcGVyU3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7XG5cbiAgICBpZiAoIW9mZnNldERhdGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcERpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ2JvdHRvbScgPyBvZmZzZXREYXRhLnRvcCEueSA6IDA7XG4gICAgY29uc3QgYm90dG9tRGlzdGFuY2UgPSBiYXNlUGxhY2VtZW50ID09PSAndG9wJyA/IG9mZnNldERhdGEuYm90dG9tIS55IDogMDtcbiAgICBjb25zdCBsZWZ0RGlzdGFuY2UgPSBiYXNlUGxhY2VtZW50ID09PSAncmlnaHQnID8gb2Zmc2V0RGF0YS5sZWZ0IS54IDogMDtcbiAgICBjb25zdCByaWdodERpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnID8gb2Zmc2V0RGF0YS5yaWdodCEueCA6IDA7XG5cbiAgICBjb25zdCBleGNlZWRzVG9wID1cbiAgICAgIHBvcHBlclJlY3QudG9wIC0gY2xpZW50WSArIHRvcERpc3RhbmNlID4gaW50ZXJhY3RpdmVCb3JkZXI7XG4gICAgY29uc3QgZXhjZWVkc0JvdHRvbSA9XG4gICAgICBjbGllbnRZIC0gcG9wcGVyUmVjdC5ib3R0b20gLSBib3R0b21EaXN0YW5jZSA+IGludGVyYWN0aXZlQm9yZGVyO1xuICAgIGNvbnN0IGV4Y2VlZHNMZWZ0ID1cbiAgICAgIHBvcHBlclJlY3QubGVmdCAtIGNsaWVudFggKyBsZWZ0RGlzdGFuY2UgPiBpbnRlcmFjdGl2ZUJvcmRlcjtcbiAgICBjb25zdCBleGNlZWRzUmlnaHQgPVxuICAgICAgY2xpZW50WCAtIHBvcHBlclJlY3QucmlnaHQgLSByaWdodERpc3RhbmNlID4gaW50ZXJhY3RpdmVCb3JkZXI7XG5cbiAgICByZXR1cm4gZXhjZWVkc1RvcCB8fCBleGNlZWRzQm90dG9tIHx8IGV4Y2VlZHNMZWZ0IHx8IGV4Y2VlZHNSaWdodDtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uRW5kTGlzdGVuZXIoXG4gIGJveDogSFRNTERpdkVsZW1lbnQsXG4gIGFjdGlvbjogJ2FkZCcgfCAncmVtb3ZlJyxcbiAgbGlzdGVuZXI6IChldmVudDogVHJhbnNpdGlvbkV2ZW50KSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3QgbWV0aG9kID0gYCR7YWN0aW9ufUV2ZW50TGlzdGVuZXJgIGFzXG4gICAgfCAnYWRkRXZlbnRMaXN0ZW5lcidcbiAgICB8ICdyZW1vdmVFdmVudExpc3RlbmVyJztcblxuICAvLyBzb21lIGJyb3dzZXJzIGFwcGFyZW50bHkgc3VwcG9ydCBgdHJhbnNpdGlvbmAgKHVucHJlZml4ZWQpIGJ1dCBvbmx5IGZpcmVcbiAgLy8gYHdlYmtpdFRyYW5zaXRpb25FbmRgLi4uXG4gIFsndHJhbnNpdGlvbmVuZCcsICd3ZWJraXRUcmFuc2l0aW9uRW5kJ10uZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICBib3hbbWV0aG9kXShldmVudCwgbGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcik7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmVkIHRvIHh4eC5jb250YWlucywgdGhpcyBmdW5jdGlvbiB3b3JrcyBmb3IgZG9tIHN0cnVjdHVyZXMgd2l0aCBzaGFkb3dcbiAqIGRvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0dWFsQ29udGFpbnMocGFyZW50OiBFbGVtZW50LCBjaGlsZDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICBsZXQgdGFyZ2V0ID0gY2hpbGQ7XG4gIHdoaWxlICh0YXJnZXQpIHtcbiAgICBpZiAocGFyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0YXJnZXQgPSAodGFyZ2V0LmdldFJvb3ROb2RlPy4oKSBhcyBhbnkpPy5ob3N0O1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQge1RPVUNIX09QVElPTlN9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7aXNSZWZlcmVuY2VFbGVtZW50fSBmcm9tICcuL2RvbS11dGlscyc7XG5cbmV4cG9ydCBjb25zdCBjdXJyZW50SW5wdXQgPSB7aXNUb3VjaDogZmFsc2V9O1xubGV0IGxhc3RNb3VzZU1vdmVUaW1lID0gMDtcblxuLyoqXG4gKiBXaGVuIGEgYHRvdWNoc3RhcnRgIGV2ZW50IGlzIGZpcmVkLCBpdCdzIGFzc3VtZWQgdGhlIHVzZXIgaXMgdXNpbmcgdG91Y2hcbiAqIGlucHV0LiBXZSdsbCBiaW5kIGEgYG1vdXNlbW92ZWAgZXZlbnQgbGlzdGVuZXIgdG8gbGlzdGVuIGZvciBtb3VzZSBpbnB1dCBpblxuICogdGhlIGZ1dHVyZS4gVGhpcyB3YXksIHRoZSBgaXNUb3VjaGAgcHJvcGVydHkgaXMgZnVsbHkgZHluYW1pYyBhbmQgd2lsbCBoYW5kbGVcbiAqIGh5YnJpZCBkZXZpY2VzIHRoYXQgdXNlIGEgbWl4IG9mIHRvdWNoICsgbW91c2UgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRvY3VtZW50VG91Y2hTdGFydCgpOiB2b2lkIHtcbiAgaWYgKGN1cnJlbnRJbnB1dC5pc1RvdWNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY3VycmVudElucHV0LmlzVG91Y2ggPSB0cnVlO1xuXG4gIGlmICh3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbkRvY3VtZW50TW91c2VNb3ZlKTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZW4gdHdvIGBtb3VzZW1vdmVgIGV2ZW50IGFyZSBmaXJlZCBjb25zZWN1dGl2ZWx5IHdpdGhpbiAyMG1zLCBpdCdzIGFzc3VtZWRcbiAqIHRoZSB1c2VyIGlzIHVzaW5nIG1vdXNlIGlucHV0IGFnYWluLiBgbW91c2Vtb3ZlYCBjYW4gZmlyZSBvbiB0b3VjaCBkZXZpY2VzIGFzXG4gKiB3ZWxsLCBidXQgdmVyeSByYXJlbHkgdGhhdCBxdWlja2x5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25Eb2N1bWVudE1vdXNlTW92ZSgpOiB2b2lkIHtcbiAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgaWYgKG5vdyAtIGxhc3RNb3VzZU1vdmVUaW1lIDwgMjApIHtcbiAgICBjdXJyZW50SW5wdXQuaXNUb3VjaCA9IGZhbHNlO1xuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Eb2N1bWVudE1vdXNlTW92ZSk7XG4gIH1cblxuICBsYXN0TW91c2VNb3ZlVGltZSA9IG5vdztcbn1cblxuLyoqXG4gKiBXaGVuIGFuIGVsZW1lbnQgaXMgaW4gZm9jdXMgYW5kIGhhcyBhIHRpcHB5LCBsZWF2aW5nIHRoZSB0YWIvd2luZG93IGFuZFxuICogcmV0dXJuaW5nIGNhdXNlcyBpdCB0byBzaG93IGFnYWluLiBGb3IgbW91c2UgdXNlcnMgdGhpcyBpcyB1bmV4cGVjdGVkLCBidXRcbiAqIGZvciBrZXlib2FyZCB1c2UgaXQgbWFrZXMgc2Vuc2UuXG4gKiBUT0RPOiBmaW5kIGEgYmV0dGVyIHRlY2huaXF1ZSB0byBzb2x2ZSB0aGlzIHByb2JsZW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uV2luZG93Qmx1cigpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIGlmIChpc1JlZmVyZW5jZUVsZW1lbnQoYWN0aXZlRWxlbWVudCkpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGFjdGl2ZUVsZW1lbnQuX3RpcHB5ITtcblxuICAgIGlmIChhY3RpdmVFbGVtZW50LmJsdXIgJiYgIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmRHbG9iYWxFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uRG9jdW1lbnRUb3VjaFN0YXJ0LCBUT1VDSF9PUFRJT05TKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbldpbmRvd0JsdXIpO1xufVxuIiwgImV4cG9ydCBjb25zdCBpc0Jyb3dzZXIgPVxuICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgY29uc3QgaXNJRTExID0gaXNCcm93c2VyXG4gID8gLy8gQHRzLWlnbm9yZVxuICAgICEhd2luZG93Lm1zQ3J5cHRvXG4gIDogZmFsc2U7XG4iLCAiaW1wb3J0IHtUYXJnZXRzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKG1ldGhvZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHh0ID0gbWV0aG9kID09PSAnZGVzdHJveScgPyAnbiBhbHJlYWR5LScgOiAnICc7XG5cbiAgcmV0dXJuIFtcbiAgICBgJHttZXRob2R9KCkgd2FzIGNhbGxlZCBvbiBhJHt0eHR9ZGVzdHJveWVkIGluc3RhbmNlLiBUaGlzIGlzIGEgbm8tb3AgYnV0YCxcbiAgICAnaW5kaWNhdGVzIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrLicsXG4gIF0uam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNwYWNlc0FuZFRhYnMgPSAvWyBcXHRdezIsfS9nO1xuICBjb25zdCBsaW5lU3RhcnRXaXRoU3BhY2VzID0gL15bIFxcdF0qL2dtO1xuXG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKHNwYWNlc0FuZFRhYnMsICcgJylcbiAgICAucmVwbGFjZShsaW5lU3RhcnRXaXRoU3BhY2VzLCAnJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXREZXZNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjbGVhbihgXG4gICVjdGlwcHkuanNcblxuICAlYyR7Y2xlYW4obWVzc2FnZSl9XG5cbiAgJWPwn5G34oCNIFRoaXMgaXMgYSBkZXZlbG9wbWVudC1vbmx5IG1lc3NhZ2UuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBwcm9kdWN0aW9uLlxuICBgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIGdldERldk1lc3NhZ2UobWVzc2FnZSksXG4gICAgLy8gdGl0bGVcbiAgICAnY29sb3I6ICMwMEM1ODQ7IGZvbnQtc2l6ZTogMS4zZW07IGZvbnQtd2VpZ2h0OiBib2xkOycsXG4gICAgLy8gbWVzc2FnZVxuICAgICdsaW5lLWhlaWdodDogMS41JyxcbiAgICAvLyBmb290ZXJcbiAgICAnY29sb3I6ICNhNmEwOTU7JyxcbiAgXTtcbn1cblxuLy8gQXNzdW1lIHdhcm5pbmdzIGFuZCBlcnJvcnMgbmV2ZXIgaGF2ZSB0aGUgc2FtZSBtZXNzYWdlXG5sZXQgdmlzaXRlZE1lc3NhZ2VzOiBTZXQ8c3RyaW5nPjtcbmlmIChfX0RFVl9fKSB7XG4gIHJlc2V0VmlzaXRlZE1lc3NhZ2VzKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFZpc2l0ZWRNZXNzYWdlcygpOiB2b2lkIHtcbiAgdmlzaXRlZE1lc3NhZ2VzID0gbmV3IFNldCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2FybldoZW4oY29uZGl0aW9uOiBib29sZWFuLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGNvbmRpdGlvbiAmJiAhdmlzaXRlZE1lc3NhZ2VzLmhhcyhtZXNzYWdlKSkge1xuICAgIHZpc2l0ZWRNZXNzYWdlcy5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS53YXJuKC4uLmdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcldoZW4oY29uZGl0aW9uOiBib29sZWFuLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGNvbmRpdGlvbiAmJiAhdmlzaXRlZE1lc3NhZ2VzLmhhcyhtZXNzYWdlKSkge1xuICAgIHZpc2l0ZWRNZXNzYWdlcy5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvciguLi5nZXRGb3JtYXR0ZWRNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUYXJnZXRzKHRhcmdldHM6IFRhcmdldHMpOiB2b2lkIHtcbiAgY29uc3QgZGlkUGFzc0ZhbHN5VmFsdWUgPSAhdGFyZ2V0cztcbiAgY29uc3QgZGlkUGFzc1BsYWluT2JqZWN0ID1cbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGFyZ2V0cykgPT09ICdbb2JqZWN0IE9iamVjdF0nICYmXG4gICAgISh0YXJnZXRzIGFzIGFueSkuYWRkRXZlbnRMaXN0ZW5lcjtcblxuICBlcnJvcldoZW4oXG4gICAgZGlkUGFzc0ZhbHN5VmFsdWUsXG4gICAgW1xuICAgICAgJ3RpcHB5KCkgd2FzIHBhc3NlZCcsXG4gICAgICAnYCcgKyBTdHJpbmcodGFyZ2V0cykgKyAnYCcsXG4gICAgICAnYXMgaXRzIHRhcmdldHMgKGZpcnN0KSBhcmd1bWVudC4gVmFsaWQgdHlwZXMgYXJlOiBTdHJpbmcsIEVsZW1lbnQsJyxcbiAgICAgICdFbGVtZW50W10sIG9yIE5vZGVMaXN0LicsXG4gICAgXS5qb2luKCcgJylcbiAgKTtcblxuICBlcnJvcldoZW4oXG4gICAgZGlkUGFzc1BsYWluT2JqZWN0LFxuICAgIFtcbiAgICAgICd0aXBweSgpIHdhcyBwYXNzZWQgYSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBhcyBhbiBhcmd1bWVudCcsXG4gICAgICAnZm9yIHZpcnR1YWwgcG9zaXRpb25pbmcuIFVzZSBwcm9wcy5nZXRSZWZlcmVuY2VDbGllbnRSZWN0IGluc3RlYWQuJyxcbiAgICBdLmpvaW4oJyAnKVxuICApO1xufVxuIiwgImltcG9ydCB7RGVmYXVsdFByb3BzLCBQbHVnaW4sIFByb3BzLCBSZWZlcmVuY2VFbGVtZW50LCBUaXBweX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBoYXNPd25Qcm9wZXJ0eSxcbiAgcmVtb3ZlUHJvcGVydGllcyxcbiAgaW52b2tlV2l0aEFyZ3NPclJldHVybixcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3dhcm5XaGVufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHtUSVBQWV9ERUZBVUxUX0FQUEVORF9UT30gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5jb25zdCBwbHVnaW5Qcm9wcyA9IHtcbiAgYW5pbWF0ZUZpbGw6IGZhbHNlLFxuICBmb2xsb3dDdXJzb3I6IGZhbHNlLFxuICBpbmxpbmVQb3NpdGlvbmluZzogZmFsc2UsXG4gIHN0aWNreTogZmFsc2UsXG59O1xuXG5jb25zdCByZW5kZXJQcm9wcyA9IHtcbiAgYWxsb3dIVE1MOiBmYWxzZSxcbiAgYW5pbWF0aW9uOiAnZmFkZScsXG4gIGFycm93OiB0cnVlLFxuICBjb250ZW50OiAnJyxcbiAgaW5lcnRpYTogZmFsc2UsXG4gIG1heFdpZHRoOiAzNTAsXG4gIHJvbGU6ICd0b29sdGlwJyxcbiAgdGhlbWU6ICcnLFxuICB6SW5kZXg6IDk5OTksXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHMgPSB7XG4gIGFwcGVuZFRvOiBUSVBQWV9ERUZBVUxUX0FQUEVORF9UTyxcbiAgYXJpYToge1xuICAgIGNvbnRlbnQ6ICdhdXRvJyxcbiAgICBleHBhbmRlZDogJ2F1dG8nLFxuICB9LFxuICBkZWxheTogMCxcbiAgZHVyYXRpb246IFszMDAsIDI1MF0sXG4gIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IG51bGwsXG4gIGhpZGVPbkNsaWNrOiB0cnVlLFxuICBpZ25vcmVBdHRyaWJ1dGVzOiBmYWxzZSxcbiAgaW50ZXJhY3RpdmU6IGZhbHNlLFxuICBpbnRlcmFjdGl2ZUJvcmRlcjogMixcbiAgaW50ZXJhY3RpdmVEZWJvdW5jZTogMCxcbiAgbW92ZVRyYW5zaXRpb246ICcnLFxuICBvZmZzZXQ6IFswLCAxMF0sXG4gIG9uQWZ0ZXJVcGRhdGUoKSB7fSxcbiAgb25CZWZvcmVVcGRhdGUoKSB7fSxcbiAgb25DcmVhdGUoKSB7fSxcbiAgb25EZXN0cm95KCkge30sXG4gIG9uSGlkZGVuKCkge30sXG4gIG9uSGlkZSgpIHt9LFxuICBvbk1vdW50KCkge30sXG4gIG9uU2hvdygpIHt9LFxuICBvblNob3duKCkge30sXG4gIG9uVHJpZ2dlcigpIHt9LFxuICBvblVudHJpZ2dlcigpIHt9LFxuICBvbkNsaWNrT3V0c2lkZSgpIHt9LFxuICBwbGFjZW1lbnQ6ICd0b3AnLFxuICBwbHVnaW5zOiBbXSxcbiAgcG9wcGVyT3B0aW9uczoge30sXG4gIHJlbmRlcjogbnVsbCxcbiAgc2hvd09uQ3JlYXRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHRyaWdnZXI6ICdtb3VzZWVudGVyIGZvY3VzJyxcbiAgdHJpZ2dlclRhcmdldDogbnVsbCxcbiAgLi4ucGx1Z2luUHJvcHMsXG4gIC4uLnJlbmRlclByb3BzLFxufTtcblxuY29uc3QgZGVmYXVsdEtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0UHJvcHMpO1xuXG5leHBvcnQgY29uc3Qgc2V0RGVmYXVsdFByb3BzOiBUaXBweVsnc2V0RGVmYXVsdFByb3BzJ10gPSAocGFydGlhbFByb3BzKSA9PiB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhwYXJ0aWFsUHJvcHMsIFtdKTtcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwYXJ0aWFsUHJvcHMpIGFzIEFycmF5PGtleW9mIERlZmF1bHRQcm9wcz47XG4gIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgKGRlZmF1bHRQcm9wcyBhcyBhbnkpW2tleV0gPSBwYXJ0aWFsUHJvcHNba2V5XTtcbiAgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wcyhcbiAgcGFzc2VkUHJvcHM6IFBhcnRpYWw8UHJvcHM+ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFBhcnRpYWw8UHJvcHM+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHBhc3NlZFByb3BzLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpblByb3BzID0gcGx1Z2lucy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KChhY2MsIHBsdWdpbikgPT4ge1xuICAgIGNvbnN0IHtuYW1lLCBkZWZhdWx0VmFsdWV9ID0gcGx1Z2luO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGFjY1tuYW1lXSA9XG4gICAgICAgIHBhc3NlZFByb3BzW25hbWVdICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHBhc3NlZFByb3BzW25hbWVdXG4gICAgICAgICAgOiAoZGVmYXVsdFByb3BzIGFzIGFueSlbbmFtZV0gPz8gZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnBhc3NlZFByb3BzLFxuICAgIC4uLnBsdWdpblByb3BzLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YUF0dHJpYnV0ZVByb3BzKFxuICByZWZlcmVuY2U6IFJlZmVyZW5jZUVsZW1lbnQsXG4gIHBsdWdpbnM6IFBsdWdpbltdXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHByb3BLZXlzID0gcGx1Z2luc1xuICAgID8gT2JqZWN0LmtleXMoZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wcyh7Li4uZGVmYXVsdFByb3BzLCBwbHVnaW5zfSkpXG4gICAgOiBkZWZhdWx0S2V5cztcblxuICBjb25zdCBwcm9wcyA9IHByb3BLZXlzLnJlZHVjZShcbiAgICAoYWNjOiBQYXJ0aWFsPFByb3BzPiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlQXNTdHJpbmcgPSAoXG4gICAgICAgIHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoYGRhdGEtdGlwcHktJHtrZXl9YCkgfHwgJydcbiAgICAgICkudHJpbSgpO1xuXG4gICAgICBpZiAoIXZhbHVlQXNTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gJ2NvbnRlbnQnKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWVBc1N0cmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWNjW2tleV0gPSBKU09OLnBhcnNlKHZhbHVlQXNTdHJpbmcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZUFzU3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fVxuICApO1xuXG4gIHJldHVybiBwcm9wcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlUHJvcHMoXG4gIHJlZmVyZW5jZTogUmVmZXJlbmNlRWxlbWVudCxcbiAgcHJvcHM6IFByb3BzXG4pOiBQcm9wcyB7XG4gIGNvbnN0IG91dCA9IHtcbiAgICAuLi5wcm9wcyxcbiAgICBjb250ZW50OiBpbnZva2VXaXRoQXJnc09yUmV0dXJuKHByb3BzLmNvbnRlbnQsIFtyZWZlcmVuY2VdKSxcbiAgICAuLi4ocHJvcHMuaWdub3JlQXR0cmlidXRlc1xuICAgICAgPyB7fVxuICAgICAgOiBnZXREYXRhQXR0cmlidXRlUHJvcHMocmVmZXJlbmNlLCBwcm9wcy5wbHVnaW5zKSksXG4gIH07XG5cbiAgb3V0LmFyaWEgPSB7XG4gICAgLi4uZGVmYXVsdFByb3BzLmFyaWEsXG4gICAgLi4ub3V0LmFyaWEsXG4gIH07XG5cbiAgb3V0LmFyaWEgPSB7XG4gICAgZXhwYW5kZWQ6XG4gICAgICBvdXQuYXJpYS5leHBhbmRlZCA9PT0gJ2F1dG8nID8gcHJvcHMuaW50ZXJhY3RpdmUgOiBvdXQuYXJpYS5leHBhbmRlZCxcbiAgICBjb250ZW50OlxuICAgICAgb3V0LmFyaWEuY29udGVudCA9PT0gJ2F1dG8nXG4gICAgICAgID8gcHJvcHMuaW50ZXJhY3RpdmVcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6ICdkZXNjcmliZWRieSdcbiAgICAgICAgOiBvdXQuYXJpYS5jb250ZW50LFxuICB9O1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BzKFxuICBwYXJ0aWFsUHJvcHM6IFBhcnRpYWw8UHJvcHM+ID0ge30sXG4gIHBsdWdpbnM6IFBsdWdpbltdID0gW11cbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFydGlhbFByb3BzKSBhcyBBcnJheTxrZXlvZiBQcm9wcz47XG4gIGtleXMuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgIGNvbnN0IG5vblBsdWdpblByb3BzID0gcmVtb3ZlUHJvcGVydGllcyhcbiAgICAgIGRlZmF1bHRQcm9wcyxcbiAgICAgIE9iamVjdC5rZXlzKHBsdWdpblByb3BzKVxuICAgICk7XG5cbiAgICBsZXQgZGlkUGFzc1Vua25vd25Qcm9wID0gIWhhc093blByb3BlcnR5KG5vblBsdWdpblByb3BzLCBwcm9wKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwcm9wIGV4aXN0cyBpbiBgcGx1Z2luc2BcbiAgICBpZiAoZGlkUGFzc1Vua25vd25Qcm9wKSB7XG4gICAgICBkaWRQYXNzVW5rbm93blByb3AgPVxuICAgICAgICBwbHVnaW5zLmZpbHRlcigocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gcHJvcCkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHdhcm5XaGVuKFxuICAgICAgZGlkUGFzc1Vua25vd25Qcm9wLFxuICAgICAgW1xuICAgICAgICBgXFxgJHtwcm9wfVxcYGAsXG4gICAgICAgIFwiaXMgbm90IGEgdmFsaWQgcHJvcC4gWW91IG1heSBoYXZlIHNwZWxsZWQgaXQgaW5jb3JyZWN0bHksIG9yIGlmIGl0J3NcIixcbiAgICAgICAgJ2EgcGx1Z2luLCBmb3Jnb3QgdG8gcGFzcyBpdCBpbiBhbiBhcnJheSBhcyBwcm9wcy5wbHVnaW5zLicsXG4gICAgICAgICdcXG5cXG4nLFxuICAgICAgICAnQWxsIHByb3BzOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvYWxsLXByb3BzL1xcbicsXG4gICAgICAgICdQbHVnaW5zOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvcGx1Z2lucy8nLFxuICAgICAgXS5qb2luKCcgJylcbiAgICApO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge1xuICBBUlJPV19DTEFTUyxcbiAgQkFDS0RST1BfQ0xBU1MsXG4gIEJPWF9DTEFTUyxcbiAgQ09OVEVOVF9DTEFTUyxcbiAgU1ZHX0FSUk9XX0NMQVNTLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge2RpdiwgaXNFbGVtZW50fSBmcm9tICcuL2RvbS11dGlscyc7XG5pbXBvcnQge0luc3RhbmNlLCBQb3BwZXJFbGVtZW50LCBQcm9wc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1BvcHBlckNoaWxkcmVufSBmcm9tICcuL3R5cGVzLWludGVybmFsJztcbmltcG9ydCB7YXJyYXlGcm9tfSBmcm9tICcuL3V0aWxzJztcblxuLy8gRmlyZWZveCBleHRlbnNpb25zIGRvbid0IGFsbG93IC5pbm5lckhUTUwgPSBcIi4uLlwiIHByb3BlcnR5LiBUaGlzIHRyaWNrcyBpdC5cbmNvbnN0IGlubmVySFRNTCA9ICgpOiAnaW5uZXJIVE1MJyA9PiAnaW5uZXJIVE1MJztcblxuZnVuY3Rpb24gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoZWxlbWVudDogRWxlbWVudCwgaHRtbDogc3RyaW5nKTogdm9pZCB7XG4gIGVsZW1lbnRbaW5uZXJIVE1MKCldID0gaHRtbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXJyb3dFbGVtZW50KHZhbHVlOiBQcm9wc1snYXJyb3cnXSk6IEhUTUxEaXZFbGVtZW50IHtcbiAgY29uc3QgYXJyb3cgPSBkaXYoKTtcblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICBhcnJvdy5jbGFzc05hbWUgPSBBUlJPV19DTEFTUztcbiAgfSBlbHNlIHtcbiAgICBhcnJvdy5jbGFzc05hbWUgPSBTVkdfQVJST1dfQ0xBU1M7XG5cbiAgICBpZiAoaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAgYXJyb3cuYXBwZW5kQ2hpbGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTChhcnJvdywgdmFsdWUgYXMgc3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXJyb3c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250ZW50KGNvbnRlbnQ6IEhUTUxEaXZFbGVtZW50LCBwcm9wczogUHJvcHMpOiB2b2lkIHtcbiAgaWYgKGlzRWxlbWVudChwcm9wcy5jb250ZW50KSkge1xuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKGNvbnRlbnQsICcnKTtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkKHByb3BzLmNvbnRlbnQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5jb250ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHByb3BzLmFsbG93SFRNTCkge1xuICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoY29udGVudCwgcHJvcHMuY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQudGV4dENvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4ocG9wcGVyOiBQb3BwZXJFbGVtZW50KTogUG9wcGVyQ2hpbGRyZW4ge1xuICBjb25zdCBib3ggPSBwb3BwZXIuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTERpdkVsZW1lbnQ7XG4gIGNvbnN0IGJveENoaWxkcmVuID0gYXJyYXlGcm9tKGJveC5jaGlsZHJlbik7XG5cbiAgcmV0dXJuIHtcbiAgICBib3gsXG4gICAgY29udGVudDogYm94Q2hpbGRyZW4uZmluZCgobm9kZSkgPT4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoQ09OVEVOVF9DTEFTUykpLFxuICAgIGFycm93OiBib3hDaGlsZHJlbi5maW5kKFxuICAgICAgKG5vZGUpID0+XG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKEFSUk9XX0NMQVNTKSB8fFxuICAgICAgICBub2RlLmNsYXNzTGlzdC5jb250YWlucyhTVkdfQVJST1dfQ0xBU1MpXG4gICAgKSxcbiAgICBiYWNrZHJvcDogYm94Q2hpbGRyZW4uZmluZCgobm9kZSkgPT5cbiAgICAgIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKEJBQ0tEUk9QX0NMQVNTKVxuICAgICksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXIoXG4gIGluc3RhbmNlOiBJbnN0YW5jZVxuKToge1xuICBwb3BwZXI6IFBvcHBlckVsZW1lbnQ7XG4gIG9uVXBkYXRlPzogKHByZXZQcm9wczogUHJvcHMsIG5leHRQcm9wczogUHJvcHMpID0+IHZvaWQ7XG59IHtcbiAgY29uc3QgcG9wcGVyID0gZGl2KCk7XG5cbiAgY29uc3QgYm94ID0gZGl2KCk7XG4gIGJveC5jbGFzc05hbWUgPSBCT1hfQ0xBU1M7XG4gIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnLCAnaGlkZGVuJyk7XG4gIGJveC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG5cbiAgY29uc3QgY29udGVudCA9IGRpdigpO1xuICBjb250ZW50LmNsYXNzTmFtZSA9IENPTlRFTlRfQ0xBU1M7XG4gIGNvbnRlbnQuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXRlJywgJ2hpZGRlbicpO1xuXG4gIHNldENvbnRlbnQoY29udGVudCwgaW5zdGFuY2UucHJvcHMpO1xuXG4gIHBvcHBlci5hcHBlbmRDaGlsZChib3gpO1xuICBib3guYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgb25VcGRhdGUoaW5zdGFuY2UucHJvcHMsIGluc3RhbmNlLnByb3BzKTtcblxuICBmdW5jdGlvbiBvblVwZGF0ZShwcmV2UHJvcHM6IFByb3BzLCBuZXh0UHJvcHM6IFByb3BzKTogdm9pZCB7XG4gICAgY29uc3Qge2JveCwgY29udGVudCwgYXJyb3d9ID0gZ2V0Q2hpbGRyZW4ocG9wcGVyKTtcblxuICAgIGlmIChuZXh0UHJvcHMudGhlbWUpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCBuZXh0UHJvcHMudGhlbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3gucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRoZW1lJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXh0UHJvcHMuYW5pbWF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb24nLCBuZXh0UHJvcHMuYW5pbWF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFByb3BzLmluZXJ0aWEpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaW5lcnRpYScsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1pbmVydGlhJyk7XG4gICAgfVxuXG4gICAgYm94LnN0eWxlLm1heFdpZHRoID1cbiAgICAgIHR5cGVvZiBuZXh0UHJvcHMubWF4V2lkdGggPT09ICdudW1iZXInXG4gICAgICAgID8gYCR7bmV4dFByb3BzLm1heFdpZHRofXB4YFxuICAgICAgICA6IG5leHRQcm9wcy5tYXhXaWR0aDtcblxuICAgIGlmIChuZXh0UHJvcHMucm9sZSkge1xuICAgICAgYm94LnNldEF0dHJpYnV0ZSgncm9sZScsIG5leHRQcm9wcy5yb2xlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByZXZQcm9wcy5jb250ZW50ICE9PSBuZXh0UHJvcHMuY29udGVudCB8fFxuICAgICAgcHJldlByb3BzLmFsbG93SFRNTCAhPT0gbmV4dFByb3BzLmFsbG93SFRNTFxuICAgICkge1xuICAgICAgc2V0Q29udGVudChjb250ZW50LCBpbnN0YW5jZS5wcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKG5leHRQcm9wcy5hcnJvdykge1xuICAgICAgaWYgKCFhcnJvdykge1xuICAgICAgICBib3guYXBwZW5kQ2hpbGQoY3JlYXRlQXJyb3dFbGVtZW50KG5leHRQcm9wcy5hcnJvdykpO1xuICAgICAgfSBlbHNlIGlmIChwcmV2UHJvcHMuYXJyb3cgIT09IG5leHRQcm9wcy5hcnJvdykge1xuICAgICAgICBib3gucmVtb3ZlQ2hpbGQoYXJyb3cpO1xuICAgICAgICBib3guYXBwZW5kQ2hpbGQoY3JlYXRlQXJyb3dFbGVtZW50KG5leHRQcm9wcy5hcnJvdykpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJyb3cpIHtcbiAgICAgIGJveC5yZW1vdmVDaGlsZChhcnJvdyEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcG9wcGVyLFxuICAgIG9uVXBkYXRlLFxuICB9O1xufVxuXG4vLyBSdW50aW1lIGNoZWNrIHRvIGlkZW50aWZ5IGlmIHRoZSByZW5kZXIgZnVuY3Rpb24gaXMgdGhlIGRlZmF1bHQgb25lOyB0aGlzXG4vLyB3YXkgd2UgY2FuIGFwcGx5IGRlZmF1bHQgQ1NTIHRyYW5zaXRpb25zIGxvZ2ljIGFuZCBpdCBjYW4gYmUgdHJlZS1zaGFrZW4gYXdheVxucmVuZGVyLiQkdGlwcHkgPSB0cnVlO1xuIiwgImltcG9ydCB7Y3JlYXRlUG9wcGVyLCBTdHJpY3RNb2RpZmllcnMsIE1vZGlmaWVyfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5pbXBvcnQge2N1cnJlbnRJbnB1dH0gZnJvbSAnLi9iaW5kR2xvYmFsRXZlbnRMaXN0ZW5lcnMnO1xuaW1wb3J0IHtpc0lFMTF9IGZyb20gJy4vYnJvd3Nlcic7XG5pbXBvcnQge1RJUFBZX0RFRkFVTFRfQVBQRU5EX1RPLCBUT1VDSF9PUFRJT05TfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBhY3R1YWxDb250YWlucyxcbiAgZGl2LFxuICBnZXRPd25lckRvY3VtZW50LFxuICBpc0N1cnNvck91dHNpZGVJbnRlcmFjdGl2ZUJvcmRlcixcbiAgaXNNb3VzZUV2ZW50LFxuICBzZXRUcmFuc2l0aW9uRHVyYXRpb24sXG4gIHNldFZpc2liaWxpdHlTdGF0ZSxcbiAgdXBkYXRlVHJhbnNpdGlvbkVuZExpc3RlbmVyLFxufSBmcm9tICcuL2RvbS11dGlscyc7XG5pbXBvcnQge2RlZmF1bHRQcm9wcywgZXZhbHVhdGVQcm9wcywgZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wc30gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQge2dldENoaWxkcmVufSBmcm9tICcuL3RlbXBsYXRlJztcbmltcG9ydCB7XG4gIENvbnRlbnQsXG4gIEluc3RhbmNlLFxuICBMaWZlY3ljbGVIb29rcyxcbiAgUG9wcGVyRWxlbWVudCxcbiAgUHJvcHMsXG4gIFJlZmVyZW5jZUVsZW1lbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtMaXN0ZW5lck9iamVjdCwgUG9wcGVyVHJlZURhdGEsIFBvcHBlckNoaWxkcmVufSBmcm9tICcuL3R5cGVzLWludGVybmFsJztcbmltcG9ydCB7XG4gIGFycmF5RnJvbSxcbiAgZGVib3VuY2UsXG4gIGdldFZhbHVlQXRJbmRleE9yUmV0dXJuLFxuICBpbnZva2VXaXRoQXJnc09yUmV0dXJuLFxuICBub3JtYWxpemVUb0FycmF5LFxuICBwdXNoSWZVbmlxdWUsXG4gIHNwbGl0QnlTcGFjZXMsXG4gIHVuaXF1ZSxcbiAgcmVtb3ZlVW5kZWZpbmVkUHJvcHMsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtjcmVhdGVNZW1vcnlMZWFrV2FybmluZywgZXJyb3JXaGVuLCB3YXJuV2hlbn0gZnJvbSAnLi92YWxpZGF0aW9uJztcblxubGV0IGlkQ291bnRlciA9IDE7XG5sZXQgbW91c2VNb3ZlTGlzdGVuZXJzOiAoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkKVtdID0gW107XG5cbi8vIFVzZWQgYnkgYGhpZGVBbGwoKWBcbmV4cG9ydCBsZXQgbW91bnRlZEluc3RhbmNlczogSW5zdGFuY2VbXSA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVUaXBweShcbiAgcmVmZXJlbmNlOiBSZWZlcmVuY2VFbGVtZW50LFxuICBwYXNzZWRQcm9wczogUGFydGlhbDxQcm9wcz5cbik6IEluc3RhbmNlIHtcbiAgY29uc3QgcHJvcHMgPSBldmFsdWF0ZVByb3BzKHJlZmVyZW5jZSwge1xuICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAuLi5nZXRFeHRlbmRlZFBhc3NlZFByb3BzKHJlbW92ZVVuZGVmaW5lZFByb3BzKHBhc3NlZFByb3BzKSksXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyDwn5SSIFByaXZhdGUgbWVtYmVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IHNob3dUaW1lb3V0OiBhbnk7XG4gIGxldCBoaWRlVGltZW91dDogYW55O1xuICBsZXQgc2NoZWR1bGVIaWRlQW5pbWF0aW9uRnJhbWU6IG51bWJlcjtcbiAgbGV0IGlzVmlzaWJsZUZyb21DbGljayA9IGZhbHNlO1xuICBsZXQgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd24gPSBmYWxzZTtcbiAgbGV0IGRpZFRvdWNoTW92ZSA9IGZhbHNlO1xuICBsZXQgaWdub3JlT25GaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICBsZXQgbGFzdFRyaWdnZXJFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50VHJhbnNpdGlvbkVuZExpc3RlbmVyOiAoZXZlbnQ6IFRyYW5zaXRpb25FdmVudCkgPT4gdm9pZDtcbiAgbGV0IG9uRmlyc3RVcGRhdGU6ICgpID0+IHZvaWQ7XG4gIGxldCBsaXN0ZW5lcnM6IExpc3RlbmVyT2JqZWN0W10gPSBbXTtcbiAgbGV0IGRlYm91bmNlZE9uTW91c2VNb3ZlID0gZGVib3VuY2Uob25Nb3VzZU1vdmUsIHByb3BzLmludGVyYWN0aXZlRGVib3VuY2UpO1xuICBsZXQgY3VycmVudFRhcmdldDogRWxlbWVudDtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8g8J+UkSBQdWJsaWMgbWVtYmVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgaWQgPSBpZENvdW50ZXIrKztcbiAgY29uc3QgcG9wcGVySW5zdGFuY2UgPSBudWxsO1xuICBjb25zdCBwbHVnaW5zID0gdW5pcXVlKHByb3BzLnBsdWdpbnMpO1xuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIC8vIElzIHRoZSBpbnN0YW5jZSBjdXJyZW50bHkgZW5hYmxlZD9cbiAgICBpc0VuYWJsZWQ6IHRydWUsXG4gICAgLy8gSXMgdGhlIHRpcHB5IGN1cnJlbnRseSBzaG93aW5nIGFuZCBub3QgdHJhbnNpdGlvbmluZyBvdXQ/XG4gICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAvLyBIYXMgdGhlIGluc3RhbmNlIGJlZW4gZGVzdHJveWVkP1xuICAgIGlzRGVzdHJveWVkOiBmYWxzZSxcbiAgICAvLyBJcyB0aGUgdGlwcHkgY3VycmVudGx5IG1vdW50ZWQgdG8gdGhlIERPTT9cbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIC8vIEhhcyB0aGUgdGlwcHkgZmluaXNoZWQgdHJhbnNpdGlvbmluZyBpbj9cbiAgICBpc1Nob3duOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdCBpbnN0YW5jZTogSW5zdGFuY2UgPSB7XG4gICAgLy8gcHJvcGVydGllc1xuICAgIGlkLFxuICAgIHJlZmVyZW5jZSxcbiAgICBwb3BwZXI6IGRpdigpLFxuICAgIHBvcHBlckluc3RhbmNlLFxuICAgIHByb3BzLFxuICAgIHN0YXRlLFxuICAgIHBsdWdpbnMsXG4gICAgLy8gbWV0aG9kc1xuICAgIGNsZWFyRGVsYXlUaW1lb3V0cyxcbiAgICBzZXRQcm9wcyxcbiAgICBzZXRDb250ZW50LFxuICAgIHNob3csXG4gICAgaGlkZSxcbiAgICBoaWRlV2l0aEludGVyYWN0aXZpdHksXG4gICAgZW5hYmxlLFxuICAgIGRpc2FibGUsXG4gICAgdW5tb3VudCxcbiAgICBkZXN0cm95LFxuICB9O1xuXG4gIC8vIFRPRE86IEludmVzdGlnYXRlIHdoeSB0aGlzIGVhcmx5IHJldHVybiBjYXVzZXMgYSBURFogZXJyb3IgaW4gdGhlIHRlc3RzIOKAlFxuICAvLyBpdCBkb2Vzbid0IHNlZW0gdG8gaGFwcGVuIGluIHRoZSBicm93c2VyXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIXByb3BzLnJlbmRlcikge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBlcnJvcldoZW4odHJ1ZSwgJ3JlbmRlcigpIGZ1bmN0aW9uIGhhcyBub3QgYmVlbiBzdXBwbGllZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbCBtdXRhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHtwb3BwZXIsIG9uVXBkYXRlfSA9IHByb3BzLnJlbmRlcihpbnN0YW5jZSk7XG5cbiAgcG9wcGVyLnNldEF0dHJpYnV0ZSgnZGF0YS1fX05BTUVTUEFDRV9QUkVGSVhfXy1yb290JywgJycpO1xuICBwb3BwZXIuaWQgPSBgX19OQU1FU1BBQ0VfUFJFRklYX18tJHtpbnN0YW5jZS5pZH1gO1xuXG4gIGluc3RhbmNlLnBvcHBlciA9IHBvcHBlcjtcbiAgcmVmZXJlbmNlLl90aXBweSA9IGluc3RhbmNlO1xuICBwb3BwZXIuX3RpcHB5ID0gaW5zdGFuY2U7XG5cbiAgY29uc3QgcGx1Z2luc0hvb2tzID0gcGx1Z2lucy5tYXAoKHBsdWdpbikgPT4gcGx1Z2luLmZuKGluc3RhbmNlKSk7XG4gIGNvbnN0IGhhc0FyaWFFeHBhbmRlZCA9IHJlZmVyZW5jZS5oYXNBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnKTtcblxuICBhZGRMaXN0ZW5lcnMoKTtcbiAgaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCk7XG4gIGhhbmRsZVN0eWxlcygpO1xuXG4gIGludm9rZUhvb2soJ29uQ3JlYXRlJywgW2luc3RhbmNlXSk7XG5cbiAgaWYgKHByb3BzLnNob3dPbkNyZWF0ZSkge1xuICAgIHNjaGVkdWxlU2hvdygpO1xuICB9XG5cbiAgLy8gUHJldmVudCBhIHRpcHB5IHdpdGggYSBkZWxheSBmcm9tIGhpZGluZyBpZiB0aGUgY3Vyc29yIGxlZnQgdGhlbiByZXR1cm5lZFxuICAvLyBiZWZvcmUgaXQgc3RhcnRlZCBoaWRpbmdcbiAgcG9wcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlICYmIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgaW5zdGFuY2UuY2xlYXJEZWxheVRpbWVvdXRzKCk7XG4gICAgfVxuICB9KTtcblxuICBwb3BwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICBpZiAoXG4gICAgICBpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJlxuICAgICAgaW5zdGFuY2UucHJvcHMudHJpZ2dlci5pbmRleE9mKCdtb3VzZWVudGVyJykgPj0gMFxuICAgICkge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBkZWJvdW5jZWRPbk1vdXNlTW92ZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIPCflJIgUHJpdmF0ZSBtZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBnZXROb3JtYWxpemVkVG91Y2hTZXR0aW5ncygpOiBbc3RyaW5nIHwgYm9vbGVhbiwgbnVtYmVyXSB7XG4gICAgY29uc3Qge3RvdWNofSA9IGluc3RhbmNlLnByb3BzO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRvdWNoKSA/IHRvdWNoIDogW3RvdWNoLCAwXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElzQ3VzdG9tVG91Y2hCZWhhdmlvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0Tm9ybWFsaXplZFRvdWNoU2V0dGluZ3MoKVswXSA9PT0gJ2hvbGQnO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKTogYm9vbGVhbiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAhIWluc3RhbmNlLnByb3BzLnJlbmRlcj8uJCR0aXBweTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEN1cnJlbnRUYXJnZXQoKTogRWxlbWVudCB7XG4gICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQgfHwgcmVmZXJlbmNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKTogRG9jdW1lbnQge1xuICAgIGNvbnN0IHBhcmVudCA9IGdldEN1cnJlbnRUYXJnZXQoKS5wYXJlbnROb2RlIGFzIEVsZW1lbnQ7XG4gICAgcmV0dXJuIHBhcmVudCA/IGdldE93bmVyRG9jdW1lbnQocGFyZW50KSA6IGRvY3VtZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKTogUG9wcGVyQ2hpbGRyZW4ge1xuICAgIHJldHVybiBnZXRDaGlsZHJlbihwb3BwZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGVsYXkoaXNTaG93OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAvLyBGb3IgdG91Y2ggb3Iga2V5Ym9hcmQgaW5wdXQsIGZvcmNlIGAwYCBkZWxheSBmb3IgVVggcmVhc29uc1xuICAgIC8vIEFsc28gaWYgdGhlIGluc3RhbmNlIGlzIG1vdW50ZWQgYnV0IG5vdCB2aXNpYmxlICh0cmFuc2l0aW9uaW5nIG91dCksXG4gICAgLy8gaWdub3JlIGRlbGF5XG4gICAgaWYgKFxuICAgICAgKGluc3RhbmNlLnN0YXRlLmlzTW91bnRlZCAmJiAhaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB8fFxuICAgICAgY3VycmVudElucHV0LmlzVG91Y2ggfHxcbiAgICAgIChsYXN0VHJpZ2dlckV2ZW50ICYmIGxhc3RUcmlnZ2VyRXZlbnQudHlwZSA9PT0gJ2ZvY3VzJylcbiAgICApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRWYWx1ZUF0SW5kZXhPclJldHVybihcbiAgICAgIGluc3RhbmNlLnByb3BzLmRlbGF5LFxuICAgICAgaXNTaG93ID8gMCA6IDEsXG4gICAgICBkZWZhdWx0UHJvcHMuZGVsYXlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3R5bGVzKGZyb21IaWRlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBwb3BwZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9XG4gICAgICBpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiAhZnJvbUhpZGUgPyAnJyA6ICdub25lJztcbiAgICBwb3BwZXIuc3R5bGUuekluZGV4ID0gYCR7aW5zdGFuY2UucHJvcHMuekluZGV4fWA7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VIb29rKFxuICAgIGhvb2s6IGtleW9mIExpZmVjeWNsZUhvb2tzLFxuICAgIGFyZ3M6IFtJbnN0YW5jZSwgYW55P10sXG4gICAgc2hvdWxkSW52b2tlUHJvcHNIb29rID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICBwbHVnaW5zSG9va3MuZm9yRWFjaCgocGx1Z2luSG9va3MpID0+IHtcbiAgICAgIGlmIChwbHVnaW5Ib29rc1tob29rXSkge1xuICAgICAgICBwbHVnaW5Ib29rc1tob29rXSEoLi4uYXJncyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoc2hvdWxkSW52b2tlUHJvcHNIb29rKSB7XG4gICAgICBpbnN0YW5jZS5wcm9wc1tob29rXSguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBcmlhQ29udGVudEF0dHJpYnV0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB7YXJpYX0gPSBpbnN0YW5jZS5wcm9wcztcblxuICAgIGlmICghYXJpYS5jb250ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXR0ciA9IGBhcmlhLSR7YXJpYS5jb250ZW50fWA7XG4gICAgY29uc3QgaWQgPSBwb3BwZXIuaWQ7XG4gICAgY29uc3Qgbm9kZXMgPSBub3JtYWxpemVUb0FycmF5KGluc3RhbmNlLnByb3BzLnRyaWdnZXJUYXJnZXQgfHwgcmVmZXJlbmNlKTtcblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHIsIGN1cnJlbnRWYWx1ZSA/IGAke2N1cnJlbnRWYWx1ZX0gJHtpZH1gIDogaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5yZXBsYWNlKGlkLCAnJykudHJpbSgpO1xuXG4gICAgICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyLCBuZXh0VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBcmlhRXhwYW5kZWRBdHRyaWJ1dGUoKTogdm9pZCB7XG4gICAgaWYgKGhhc0FyaWFFeHBhbmRlZCB8fCAhaW5zdGFuY2UucHJvcHMuYXJpYS5leHBhbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gbm9ybWFsaXplVG9BcnJheShpbnN0YW5jZS5wcm9wcy50cmlnZ2VyVGFyZ2V0IHx8IHJlZmVyZW5jZSk7XG5cbiAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUpIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnLFxuICAgICAgICAgIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJiBub2RlID09PSBnZXRDdXJyZW50VGFyZ2V0KClcbiAgICAgICAgICAgID8gJ3RydWUnXG4gICAgICAgICAgICA6ICdmYWxzZSdcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwSW50ZXJhY3RpdmVNb3VzZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBnZXREb2N1bWVudCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGRlYm91bmNlZE9uTW91c2VNb3ZlKTtcbiAgICBtb3VzZU1vdmVMaXN0ZW5lcnMgPSBtb3VzZU1vdmVMaXN0ZW5lcnMuZmlsdGVyKFxuICAgICAgKGxpc3RlbmVyKSA9PiBsaXN0ZW5lciAhPT0gZGVib3VuY2VkT25Nb3VzZU1vdmVcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Eb2N1bWVudFByZXNzKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIC8vIE1vdmVkIGZpbmdlciB0byBzY3JvbGwgaW5zdGVhZCBvZiBhbiBpbnRlbnRpb25hbCB0YXAgb3V0c2lkZVxuICAgIGlmIChjdXJyZW50SW5wdXQuaXNUb3VjaCkge1xuICAgICAgaWYgKGRpZFRvdWNoTW92ZSB8fCBldmVudC50eXBlID09PSAnbW91c2Vkb3duJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVGFyZ2V0ID1cbiAgICAgIChldmVudC5jb21wb3NlZFBhdGggJiYgZXZlbnQuY29tcG9zZWRQYXRoKClbMF0pIHx8IGV2ZW50LnRhcmdldDtcblxuICAgIC8vIENsaWNrZWQgb24gaW50ZXJhY3RpdmUgcG9wcGVyXG4gICAgaWYgKFxuICAgICAgaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiZcbiAgICAgIGFjdHVhbENvbnRhaW5zKHBvcHBlciwgYWN0dWFsVGFyZ2V0IGFzIEVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xpY2tlZCBvbiB0aGUgZXZlbnQgbGlzdGVuZXJzIHRhcmdldFxuICAgIGlmIChcbiAgICAgIG5vcm1hbGl6ZVRvQXJyYXkoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpLnNvbWUoKGVsKSA9PlxuICAgICAgICBhY3R1YWxDb250YWlucyhlbCwgYWN0dWFsVGFyZ2V0IGFzIEVsZW1lbnQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpZiAoY3VycmVudElucHV0LmlzVG91Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJlxuICAgICAgICBpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2NsaWNrJykgPj0gMFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW52b2tlSG9vaygnb25DbGlja091dHNpZGUnLCBbaW5zdGFuY2UsIGV2ZW50XSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmhpZGVPbkNsaWNrID09PSB0cnVlKSB7XG4gICAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcbiAgICAgIGluc3RhbmNlLmhpZGUoKTtcblxuICAgICAgLy8gYG1vdXNlZG93bmAgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYmVmb3JlIGBmb2N1c2AgaWYgcHJlc3NpbmcgdGhlXG4gICAgICAvLyBjdXJyZW50VGFyZ2V0LiBUaGlzIGxldHMgYSB0aXBweSB3aXRoIGBmb2N1c2AgdHJpZ2dlciBrbm93IHRoYXQgaXRcbiAgICAgIC8vIHNob3VsZCBub3Qgc2hvd1xuICAgICAgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd24gPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRpZEhpZGVEdWVUb0RvY3VtZW50TW91c2VEb3duID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGxpc3RlbmVyIGdldHMgYWRkZWQgaW4gYHNjaGVkdWxlU2hvdygpYCwgYnV0IHRoaXMgbWF5IGJlIGhpZGluZyBpdFxuICAgICAgLy8gYmVmb3JlIGl0IHNob3dzLCBhbmQgaGlkZSgpJ3MgZWFybHkgYmFpbC1vdXQgYmVoYXZpb3IgY2FuIHByZXZlbnQgaXRcbiAgICAgIC8vIGZyb20gYmVpbmcgY2xlYW5lZCB1cFxuICAgICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgcmVtb3ZlRG9jdW1lbnRQcmVzcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKCk6IHZvaWQge1xuICAgIGRpZFRvdWNoTW92ZSA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoKTogdm9pZCB7XG4gICAgZGlkVG91Y2hNb3ZlID0gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBhZGREb2N1bWVudFByZXNzKCk6IHZvaWQge1xuICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KCk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uRG9jdW1lbnRQcmVzcywgdHJ1ZSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Eb2N1bWVudFByZXNzLCBUT1VDSF9PUFRJT05TKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgVE9VQ0hfT1BUSU9OUyk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBUT1VDSF9PUFRJT05TKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZURvY3VtZW50UHJlc3MoKTogdm9pZCB7XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Eb2N1bWVudFByZXNzLCB0cnVlKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbkRvY3VtZW50UHJlc3MsIFRPVUNIX09QVElPTlMpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBUT1VDSF9PUFRJT05TKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIFRPVUNIX09QVElPTlMpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25UcmFuc2l0aW9uZWRPdXQoZHVyYXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBvblRyYW5zaXRpb25FbmQoZHVyYXRpb24sICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJlxuICAgICAgICBwb3BwZXIucGFyZW50Tm9kZSAmJlxuICAgICAgICBwb3BwZXIucGFyZW50Tm9kZS5jb250YWlucyhwb3BwZXIpXG4gICAgICApIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHJhbnNpdGlvbmVkSW4oZHVyYXRpb246IG51bWJlciwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBvblRyYW5zaXRpb25FbmQoZHVyYXRpb24sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHJhbnNpdGlvbkVuZChkdXJhdGlvbjogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGJveCA9IGdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuKCkuYm94O1xuXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIoZXZlbnQ6IFRyYW5zaXRpb25FdmVudCk6IHZvaWQge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gYm94KSB7XG4gICAgICAgIHVwZGF0ZVRyYW5zaXRpb25FbmRMaXN0ZW5lcihib3gsICdyZW1vdmUnLCBsaXN0ZW5lcik7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFrZSBjYWxsYmFjayBzeW5jaHJvbm91cyBpZiBkdXJhdGlvbiBpcyAwXG4gICAgLy8gYHRyYW5zaXRpb25lbmRgIHdvbid0IGZpcmUgb3RoZXJ3aXNlXG4gICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9uRW5kTGlzdGVuZXIoYm94LCAncmVtb3ZlJywgY3VycmVudFRyYW5zaXRpb25FbmRMaXN0ZW5lcik7XG4gICAgdXBkYXRlVHJhbnNpdGlvbkVuZExpc3RlbmVyKGJveCwgJ2FkZCcsIGxpc3RlbmVyKTtcblxuICAgIGN1cnJlbnRUcmFuc2l0aW9uRW5kTGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uKFxuICAgIGV2ZW50VHlwZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIsXG4gICAgb3B0aW9uczogYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZXMgPSBub3JtYWxpemVUb0FycmF5KGluc3RhbmNlLnByb3BzLnRyaWdnZXJUYXJnZXQgfHwgcmVmZXJlbmNlKTtcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICAgIGxpc3RlbmVycy5wdXNoKHtub2RlLCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnN9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAoZ2V0SXNDdXN0b21Ub3VjaEJlaGF2aW9yKCkpIHtcbiAgICAgIG9uKCd0b3VjaHN0YXJ0Jywgb25UcmlnZ2VyLCB7cGFzc2l2ZTogdHJ1ZX0pO1xuICAgICAgb24oJ3RvdWNoZW5kJywgb25Nb3VzZUxlYXZlIGFzIEV2ZW50TGlzdGVuZXIsIHtwYXNzaXZlOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgc3BsaXRCeVNwYWNlcyhpbnN0YW5jZS5wcm9wcy50cmlnZ2VyKS5mb3JFYWNoKChldmVudFR5cGUpID0+IHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09ICdtYW51YWwnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb24oZXZlbnRUeXBlLCBvblRyaWdnZXIpO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICBjYXNlICdtb3VzZWVudGVyJzpcbiAgICAgICAgICBvbignbW91c2VsZWF2ZScsIG9uTW91c2VMZWF2ZSBhcyBFdmVudExpc3RlbmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZm9jdXMnOlxuICAgICAgICAgIG9uKGlzSUUxMSA/ICdmb2N1c291dCcgOiAnYmx1cicsIG9uQmx1ck9yRm9jdXNPdXQgYXMgRXZlbnRMaXN0ZW5lcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgICAgIG9uKCdmb2N1c291dCcsIG9uQmx1ck9yRm9jdXNPdXQgYXMgRXZlbnRMaXN0ZW5lcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKHtub2RlLCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnN9OiBMaXN0ZW5lck9iamVjdCkgPT4ge1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBmdW5jdGlvbiBvblRyaWdnZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IHNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlID0gZmFsc2U7XG5cbiAgICBpZiAoXG4gICAgICAhaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkIHx8XG4gICAgICBpc0V2ZW50TGlzdGVuZXJTdG9wcGVkKGV2ZW50KSB8fFxuICAgICAgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd25cbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXNGb2N1c2VkID0gbGFzdFRyaWdnZXJFdmVudD8udHlwZSA9PT0gJ2ZvY3VzJztcblxuICAgIGxhc3RUcmlnZ2VyRXZlbnQgPSBldmVudDtcbiAgICBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCk7XG5cbiAgICBpZiAoIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJiBpc01vdXNlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAvLyBJZiBzY3JvbGxpbmcsIGBtb3VzZWVudGVyYCBldmVudHMgY2FuIGJlIGZpcmVkIGlmIHRoZSBjdXJzb3IgbGFuZHNcbiAgICAgIC8vIG92ZXIgYSBuZXcgdGFyZ2V0LCBidXQgYG1vdXNlbW92ZWAgZXZlbnRzIGRvbid0IGdldCBmaXJlZC4gVGhpc1xuICAgICAgLy8gY2F1c2VzIGludGVyYWN0aXZlIHRvb2x0aXBzIHRvIGdldCBzdHVjayBvcGVuIHVudGlsIHRoZSBjdXJzb3IgaXNcbiAgICAgIC8vIG1vdmVkXG4gICAgICBtb3VzZU1vdmVMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKGV2ZW50KSk7XG4gICAgfVxuXG4gICAgLy8gVG9nZ2xlIHNob3cvaGlkZSB3aGVuIGNsaWNraW5nIGNsaWNrLXRyaWdnZXJlZCB0b29sdGlwc1xuICAgIGlmIChcbiAgICAgIGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ21vdXNlZW50ZXInKSA8IDAgfHxcbiAgICAgICAgaXNWaXNpYmxlRnJvbUNsaWNrKSAmJlxuICAgICAgaW5zdGFuY2UucHJvcHMuaGlkZU9uQ2xpY2sgIT09IGZhbHNlICYmXG4gICAgICBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGVcbiAgICApIHtcbiAgICAgIHNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTaG93KGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaXNWaXNpYmxlRnJvbUNsaWNrID0gIXNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRTY2hlZHVsZUNsaWNrSGlkZSAmJiAhd2FzRm9jdXNlZCkge1xuICAgICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGNvbnN0IGlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyID1cbiAgICAgIGdldEN1cnJlbnRUYXJnZXQoKS5jb250YWlucyh0YXJnZXQpIHx8IHBvcHBlci5jb250YWlucyh0YXJnZXQpO1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnICYmIGlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9wcGVyVHJlZURhdGEgPSBnZXROZXN0ZWRQb3BwZXJUcmVlKClcbiAgICAgIC5jb25jYXQocG9wcGVyKVxuICAgICAgLm1hcCgocG9wcGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gcG9wcGVyLl90aXBweSE7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gaW5zdGFuY2UucG9wcGVySW5zdGFuY2U/LnN0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3BwZXJSZWN0OiBwb3BwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBwb3BwZXJTdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQb3BwZXJUcmVlRGF0YVtdO1xuXG4gICAgaWYgKGlzQ3Vyc29yT3V0c2lkZUludGVyYWN0aXZlQm9yZGVyKHBvcHBlclRyZWVEYXRhLCBldmVudCkpIHtcbiAgICAgIGNsZWFudXBJbnRlcmFjdGl2ZU1vdXNlTGlzdGVuZXJzKCk7XG4gICAgICBzY2hlZHVsZUhpZGUoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uTW91c2VMZWF2ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNob3VsZEJhaWwgPVxuICAgICAgaXNFdmVudExpc3RlbmVyU3RvcHBlZChldmVudCkgfHxcbiAgICAgIChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2NsaWNrJykgPj0gMCAmJiBpc1Zpc2libGVGcm9tQ2xpY2spO1xuXG4gICAgaWYgKHNob3VsZEJhaWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUpIHtcbiAgICAgIGluc3RhbmNlLmhpZGVXaXRoSW50ZXJhY3Rpdml0eShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQmx1ck9yRm9jdXNPdXQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBpbnN0YW5jZS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoJ2ZvY3VzaW4nKSA8IDAgJiZcbiAgICAgIGV2ZW50LnRhcmdldCAhPT0gZ2V0Q3VycmVudFRhcmdldCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgZm9jdXMgd2FzIG1vdmVkIHRvIHdpdGhpbiB0aGUgcG9wcGVyXG4gICAgaWYgKFxuICAgICAgaW5zdGFuY2UucHJvcHMuaW50ZXJhY3RpdmUgJiZcbiAgICAgIGV2ZW50LnJlbGF0ZWRUYXJnZXQgJiZcbiAgICAgIHBvcHBlci5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEVsZW1lbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzRXZlbnRMaXN0ZW5lclN0b3BwZWQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGN1cnJlbnRJbnB1dC5pc1RvdWNoXG4gICAgICA/IGdldElzQ3VzdG9tVG91Y2hCZWhhdmlvcigpICE9PSBldmVudC50eXBlLmluZGV4T2YoJ3RvdWNoJykgPj0gMFxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlckluc3RhbmNlKCk6IHZvaWQge1xuICAgIGRlc3Ryb3lQb3BwZXJJbnN0YW5jZSgpO1xuXG4gICAgY29uc3Qge1xuICAgICAgcG9wcGVyT3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIG9mZnNldCxcbiAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgICBtb3ZlVHJhbnNpdGlvbixcbiAgICB9ID0gaW5zdGFuY2UucHJvcHM7XG5cbiAgICBjb25zdCBhcnJvdyA9IGdldElzRGVmYXVsdFJlbmRlckZuKCkgPyBnZXRDaGlsZHJlbihwb3BwZXIpLmFycm93IDogbnVsbDtcblxuICAgIGNvbnN0IGNvbXB1dGVkUmVmZXJlbmNlID0gZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdFxuICAgICAgPyB7XG4gICAgICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0OiBnZXRSZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgICAgICAgIGNvbnRleHRFbGVtZW50OlxuICAgICAgICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdC5jb250ZXh0RWxlbWVudCB8fCBnZXRDdXJyZW50VGFyZ2V0KCksXG4gICAgICAgIH1cbiAgICAgIDogcmVmZXJlbmNlO1xuXG4gICAgY29uc3QgdGlwcHlNb2RpZmllcjogTW9kaWZpZXI8JyQkdGlwcHknLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7XG4gICAgICBuYW1lOiAnJCR0aXBweScsXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gICAgICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ10sXG4gICAgICBmbih7c3RhdGV9KSB7XG4gICAgICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICAgICAgY29uc3Qge2JveH0gPSBnZXREZWZhdWx0VGVtcGxhdGVDaGlsZHJlbigpO1xuXG4gICAgICAgICAgWydwbGFjZW1lbnQnLCAncmVmZXJlbmNlLWhpZGRlbicsICdlc2NhcGVkJ10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgICAgICAgaWYgKGF0dHIgPT09ICdwbGFjZW1lbnQnKSB7XG4gICAgICAgICAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2VtZW50Jywgc3RhdGUucGxhY2VtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlcltgZGF0YS1wb3BwZXItJHthdHRyfWBdKSB7XG4gICAgICAgICAgICAgICAgYm94LnNldEF0dHJpYnV0ZShgZGF0YS0ke2F0dHJ9YCwgJycpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJveC5yZW1vdmVBdHRyaWJ1dGUoYGRhdGEtJHthdHRyfWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0eXBlIFRpcHB5TW9kaWZpZXIgPSBNb2RpZmllcjwnJCR0aXBweScsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICB0eXBlIEV4dGVuZGVkTW9kaWZpZXJzID0gU3RyaWN0TW9kaWZpZXJzIHwgUGFydGlhbDxUaXBweU1vZGlmaWVyPjtcblxuICAgIGNvbnN0IG1vZGlmaWVyczogQXJyYXk8RXh0ZW5kZWRNb2RpZmllcnM+ID0gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGFkZGluZzoge1xuICAgICAgICAgICAgdG9wOiAyLFxuICAgICAgICAgICAgYm90dG9tOiAyLFxuICAgICAgICAgICAgbGVmdDogNSxcbiAgICAgICAgICAgIHJpZ2h0OiA1LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwYWRkaW5nOiA1LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYWRhcHRpdmU6ICFtb3ZlVHJhbnNpdGlvbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0aXBweU1vZGlmaWVyLFxuICAgIF07XG5cbiAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSAmJiBhcnJvdykge1xuICAgICAgbW9kaWZpZXJzLnB1c2goe1xuICAgICAgICBuYW1lOiAnYXJyb3cnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZWxlbWVudDogYXJyb3csXG4gICAgICAgICAgcGFkZGluZzogMyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1vZGlmaWVycy5wdXNoKC4uLihwb3BwZXJPcHRpb25zPy5tb2RpZmllcnMgfHwgW10pKTtcblxuICAgIGluc3RhbmNlLnBvcHBlckluc3RhbmNlID0gY3JlYXRlUG9wcGVyPEV4dGVuZGVkTW9kaWZpZXJzPihcbiAgICAgIGNvbXB1dGVkUmVmZXJlbmNlLFxuICAgICAgcG9wcGVyLFxuICAgICAge1xuICAgICAgICAuLi5wb3BwZXJPcHRpb25zLFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG9uRmlyc3RVcGRhdGUsXG4gICAgICAgIG1vZGlmaWVycyxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveVBvcHBlckluc3RhbmNlKCk6IHZvaWQge1xuICAgIGlmIChpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHthcHBlbmRUb30gPSBpbnN0YW5jZS5wcm9wcztcblxuICAgIGxldCBwYXJlbnROb2RlOiBhbnk7XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB3ZSdsbCBhcHBlbmQgdGhlIHBvcHBlciB0byB0aGUgdHJpZ2dlclRhcmdldHMncyBwYXJlbnROb2RlIHNvXG4gICAgLy8gaXQncyBkaXJlY3RseSBhZnRlciB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgc28gdGhlIGVsZW1lbnRzIGluc2lkZSB0aGVcbiAgICAvLyB0aXBweSBjYW4gYmUgdGFiYmVkIHRvXG4gICAgLy8gSWYgdGhlcmUgYXJlIGNsaXBwaW5nIGlzc3VlcywgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQgYXBwZW5kVG9cbiAgICAvLyBhbmQgZW5zdXJlIGZvY3VzIG1hbmFnZW1lbnQgaXMgaGFuZGxlZCBjb3JyZWN0bHkgbWFudWFsbHlcbiAgICBjb25zdCBub2RlID0gZ2V0Q3VycmVudFRhcmdldCgpO1xuXG4gICAgaWYgKFxuICAgICAgKGluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlICYmIGFwcGVuZFRvID09PSBUSVBQWV9ERUZBVUxUX0FQUEVORF9UTykgfHxcbiAgICAgIGFwcGVuZFRvID09PSAncGFyZW50J1xuICAgICkge1xuICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Tm9kZSA9IGludm9rZVdpdGhBcmdzT3JSZXR1cm4oYXBwZW5kVG8sIFtub2RlXSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHBvcHBlciBlbGVtZW50IG5lZWRzIHRvIGV4aXN0IG9uIHRoZSBET00gYmVmb3JlIGl0cyBwb3NpdGlvbiBjYW4gYmVcbiAgICAvLyB1cGRhdGVkIGFzIFBvcHBlciBuZWVkcyB0byByZWFkIGl0cyBkaW1lbnNpb25zXG4gICAgaWYgKCFwYXJlbnROb2RlLmNvbnRhaW5zKHBvcHBlcikpIHtcbiAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQocG9wcGVyKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQgPSB0cnVlO1xuXG4gICAgY3JlYXRlUG9wcGVySW5zdGFuY2UoKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIC8vIEFjY2Vzc2liaWxpdHkgY2hlY2tcbiAgICAgIHdhcm5XaGVuKFxuICAgICAgICBpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJlxuICAgICAgICAgIGFwcGVuZFRvID09PSBkZWZhdWx0UHJvcHMuYXBwZW5kVG8gJiZcbiAgICAgICAgICBub2RlLm5leHRFbGVtZW50U2libGluZyAhPT0gcG9wcGVyLFxuICAgICAgICBbXG4gICAgICAgICAgJ0ludGVyYWN0aXZlIHRpcHB5IGVsZW1lbnQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlIHZpYSBrZXlib2FyZCcsXG4gICAgICAgICAgJ25hdmlnYXRpb24gYmVjYXVzZSBpdCBpcyBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50JyxcbiAgICAgICAgICAnaW4gdGhlIERPTSBzb3VyY2Ugb3JkZXIuJyxcbiAgICAgICAgICAnXFxuXFxuJyxcbiAgICAgICAgICAnVXNpbmcgYSB3cmFwcGVyIDxkaXY+IG9yIDxzcGFuPiB0YWcgYXJvdW5kIHRoZSByZWZlcmVuY2UgZWxlbWVudCcsXG4gICAgICAgICAgJ3NvbHZlcyB0aGlzIGJ5IGNyZWF0aW5nIGEgbmV3IHBhcmVudE5vZGUgY29udGV4dC4nLFxuICAgICAgICAgICdcXG5cXG4nLFxuICAgICAgICAgICdTcGVjaWZ5aW5nIGBhcHBlbmRUbzogZG9jdW1lbnQuYm9keWAgc2lsZW5jZXMgdGhpcyB3YXJuaW5nLCBidXQgaXQnLFxuICAgICAgICAgICdhc3N1bWVzIHlvdSBhcmUgdXNpbmcgYSBmb2N1cyBtYW5hZ2VtZW50IHNvbHV0aW9uIHRvIGhhbmRsZScsXG4gICAgICAgICAgJ2tleWJvYXJkIG5hdmlnYXRpb24uJyxcbiAgICAgICAgICAnXFxuXFxuJyxcbiAgICAgICAgICAnU2VlOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvYWNjZXNzaWJpbGl0eS8jaW50ZXJhY3Rpdml0eScsXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5lc3RlZFBvcHBlclRyZWUoKTogUG9wcGVyRWxlbWVudFtdIHtcbiAgICByZXR1cm4gYXJyYXlGcm9tKFxuICAgICAgcG9wcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLV9fTkFNRVNQQUNFX1BSRUZJWF9fLXJvb3RdJylcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGVTaG93KGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcblxuICAgIGlmIChldmVudCkge1xuICAgICAgaW52b2tlSG9vaygnb25UcmlnZ2VyJywgW2luc3RhbmNlLCBldmVudF0pO1xuICAgIH1cblxuICAgIGFkZERvY3VtZW50UHJlc3MoKTtcblxuICAgIGxldCBkZWxheSA9IGdldERlbGF5KHRydWUpO1xuICAgIGNvbnN0IFt0b3VjaFZhbHVlLCB0b3VjaERlbGF5XSA9IGdldE5vcm1hbGl6ZWRUb3VjaFNldHRpbmdzKCk7XG5cbiAgICBpZiAoY3VycmVudElucHV0LmlzVG91Y2ggJiYgdG91Y2hWYWx1ZSA9PT0gJ2hvbGQnICYmIHRvdWNoRGVsYXkpIHtcbiAgICAgIGRlbGF5ID0gdG91Y2hEZWxheTtcbiAgICB9XG5cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHNob3dUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlLnNob3coKTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlSGlkZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcblxuICAgIGludm9rZUhvb2soJ29uVW50cmlnZ2VyJywgW2luc3RhbmNlLCBldmVudF0pO1xuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUpIHtcbiAgICAgIHJlbW92ZURvY3VtZW50UHJlc3MoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBpbnRlcmFjdGl2ZSB0aXBwaWVzLCBzY2hlZHVsZUhpZGUgaXMgYWRkZWQgdG8gYSBkb2N1bWVudC5ib2R5IGhhbmRsZXJcbiAgICAvLyBmcm9tIG9uTW91c2VMZWF2ZSBzbyBtdXN0IGludGVyY2VwdCBzY2hlZHVsZWQgaGlkZXMgZnJvbSBtb3VzZW1vdmUvbGVhdmVcbiAgICAvLyBldmVudHMgd2hlbiB0cmlnZ2VyIGNvbnRhaW5zIG1vdXNlZW50ZXIgYW5kIGNsaWNrLCBhbmQgdGhlIHRpcCBpc1xuICAgIC8vIGN1cnJlbnRseSBzaG93biBhcyBhIHJlc3VsdCBvZiBhIGNsaWNrLlxuICAgIGlmIChcbiAgICAgIGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignbW91c2VlbnRlcicpID49IDAgJiZcbiAgICAgIGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignY2xpY2snKSA+PSAwICYmXG4gICAgICBbJ21vdXNlbGVhdmUnLCAnbW91c2Vtb3ZlJ10uaW5kZXhPZihldmVudC50eXBlKSA+PSAwICYmXG4gICAgICBpc1Zpc2libGVGcm9tQ2xpY2tcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxheSA9IGdldERlbGF5KGZhbHNlKTtcblxuICAgIGlmIChkZWxheSkge1xuICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSkge1xuICAgICAgICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaXhlcyBhIGB0cmFuc2l0aW9uZW5kYCBwcm9ibGVtIHdoZW4gaXQgZmlyZXMgMSBmcmFtZSB0b29cbiAgICAgIC8vIGxhdGUgc29tZXRpbWVzLCB3ZSBkb24ndCB3YW50IGhpZGUoKSB0byBiZSBjYWxsZWQuXG4gICAgICBzY2hlZHVsZUhpZGVBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyDwn5SRIFB1YmxpYyBtZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlbmFibGUoKTogdm9pZCB7XG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGUoKTogdm9pZCB7XG4gICAgLy8gRGlzYWJsaW5nIHRoZSBpbnN0YW5jZSBzaG91bGQgYWxzbyBoaWRlIGl0XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F0b21pa3MvdGlwcHkuanMtcmVhY3QvaXNzdWVzLzEwNlxuICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICBpbnN0YW5jZS5zdGF0ZS5pc0VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyRGVsYXlUaW1lb3V0cygpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoc2hvd1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoc2NoZWR1bGVIaWRlQW5pbWF0aW9uRnJhbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0UHJvcHMocGFydGlhbFByb3BzOiBQYXJ0aWFsPFByb3BzPik6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygnc2V0UHJvcHMnKSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25CZWZvcmVVcGRhdGUnLCBbaW5zdGFuY2UsIHBhcnRpYWxQcm9wc10pO1xuXG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG5cbiAgICBjb25zdCBwcmV2UHJvcHMgPSBpbnN0YW5jZS5wcm9wcztcbiAgICBjb25zdCBuZXh0UHJvcHMgPSBldmFsdWF0ZVByb3BzKHJlZmVyZW5jZSwge1xuICAgICAgLi4ucHJldlByb3BzLFxuICAgICAgLi4ucmVtb3ZlVW5kZWZpbmVkUHJvcHMocGFydGlhbFByb3BzKSxcbiAgICAgIGlnbm9yZUF0dHJpYnV0ZXM6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpbnN0YW5jZS5wcm9wcyA9IG5leHRQcm9wcztcblxuICAgIGFkZExpc3RlbmVycygpO1xuXG4gICAgaWYgKHByZXZQcm9wcy5pbnRlcmFjdGl2ZURlYm91bmNlICE9PSBuZXh0UHJvcHMuaW50ZXJhY3RpdmVEZWJvdW5jZSkge1xuICAgICAgY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKTtcbiAgICAgIGRlYm91bmNlZE9uTW91c2VNb3ZlID0gZGVib3VuY2UoXG4gICAgICAgIG9uTW91c2VNb3ZlLFxuICAgICAgICBuZXh0UHJvcHMuaW50ZXJhY3RpdmVEZWJvdW5jZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgc3RhbGUgYXJpYS1leHBhbmRlZCBhdHRyaWJ1dGVzIGFyZSByZW1vdmVkXG4gICAgaWYgKHByZXZQcm9wcy50cmlnZ2VyVGFyZ2V0ICYmICFuZXh0UHJvcHMudHJpZ2dlclRhcmdldCkge1xuICAgICAgbm9ybWFsaXplVG9BcnJheShwcmV2UHJvcHMudHJpZ2dlclRhcmdldCkuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChuZXh0UHJvcHMudHJpZ2dlclRhcmdldCkge1xuICAgICAgcmVmZXJlbmNlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpO1xuICAgIH1cblxuICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuICAgIGhhbmRsZVN0eWxlcygpO1xuXG4gICAgaWYgKG9uVXBkYXRlKSB7XG4gICAgICBvblVwZGF0ZShwcmV2UHJvcHMsIG5leHRQcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnBvcHBlckluc3RhbmNlKSB7XG4gICAgICBjcmVhdGVQb3BwZXJJbnN0YW5jZSgpO1xuXG4gICAgICAvLyBGaXhlcyBhbiBpc3N1ZSB3aXRoIG5lc3RlZCB0aXBwaWVzIGlmIHRoZXkgYXJlIGFsbCBnZXR0aW5nIHJlLXJlbmRlcmVkLFxuICAgICAgLy8gYW5kIHRoZSBuZXN0ZWQgb25lcyBnZXQgcmUtcmVuZGVyZWQgZmlyc3QuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXRvbWlrcy90aXBweWpzLXJlYWN0L2lzc3Vlcy8xNzdcbiAgICAgIC8vIFRPRE86IGZpbmQgYSBjbGVhbmVyIC8gbW9yZSBlZmZpY2llbnQgc29sdXRpb24oISlcbiAgICAgIGdldE5lc3RlZFBvcHBlclRyZWUoKS5mb3JFYWNoKChuZXN0ZWRQb3BwZXIpID0+IHtcbiAgICAgICAgLy8gUmVhY3QgKGFuZCBvdGhlciBVSSBsaWJzIGxpa2VseSkgcmVxdWlyZXMgYSByQUYgd3JhcHBlciBhcyBpdCBmbHVzaGVzXG4gICAgICAgIC8vIGl0cyB3b3JrIGluIG9uZVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobmVzdGVkUG9wcGVyLl90aXBweSEucG9wcGVySW5zdGFuY2UhLmZvcmNlVXBkYXRlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGludm9rZUhvb2soJ29uQWZ0ZXJVcGRhdGUnLCBbaW5zdGFuY2UsIHBhcnRpYWxQcm9wc10pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0Q29udGVudChjb250ZW50OiBDb250ZW50KTogdm9pZCB7XG4gICAgaW5zdGFuY2Uuc2V0UHJvcHMoe2NvbnRlbnR9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3coKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgd2FybldoZW4oaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQsIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKCdzaG93JykpO1xuICAgIH1cblxuICAgIC8vIEVhcmx5IGJhaWwtb3V0XG4gICAgY29uc3QgaXNBbHJlYWR5VmlzaWJsZSA9IGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZTtcbiAgICBjb25zdCBpc0Rlc3Ryb3llZCA9IGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSAhaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkO1xuICAgIGNvbnN0IGlzVG91Y2hBbmRUb3VjaERpc2FibGVkID1cbiAgICAgIGN1cnJlbnRJbnB1dC5pc1RvdWNoICYmICFpbnN0YW5jZS5wcm9wcy50b3VjaDtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGdldFZhbHVlQXRJbmRleE9yUmV0dXJuKFxuICAgICAgaW5zdGFuY2UucHJvcHMuZHVyYXRpb24sXG4gICAgICAwLFxuICAgICAgZGVmYXVsdFByb3BzLmR1cmF0aW9uXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIGlzQWxyZWFkeVZpc2libGUgfHxcbiAgICAgIGlzRGVzdHJveWVkIHx8XG4gICAgICBpc0Rpc2FibGVkIHx8XG4gICAgICBpc1RvdWNoQW5kVG91Y2hEaXNhYmxlZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGl6ZSBgZGlzYWJsZWRgIGJlaGF2aW9yIGFjcm9zcyBicm93c2Vycy5cbiAgICAvLyBGaXJlZm94IGFsbG93cyBldmVudHMgb24gZGlzYWJsZWQgZWxlbWVudHMsIGJ1dCBDaHJvbWUgZG9lc24ndC5cbiAgICAvLyBVc2luZyBhIHdyYXBwZXIgZWxlbWVudCAoaS5lLiA8c3Bhbj4pIGlzIHJlY29tbWVuZGVkLlxuICAgIGlmIChnZXRDdXJyZW50VGFyZ2V0KCkuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25TaG93JywgW2luc3RhbmNlXSwgZmFsc2UpO1xuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5vblNob3coaW5zdGFuY2UpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSA9IHRydWU7XG5cbiAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSkge1xuICAgICAgcG9wcGVyLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgaGFuZGxlU3R5bGVzKCk7XG4gICAgYWRkRG9jdW1lbnRQcmVzcygpO1xuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgIHBvcHBlci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIElmIGZsaXBwaW5nIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGFmdGVyIGhpZGluZyBhdCBsZWFzdCBvbmNlLCB0aGVcbiAgICAvLyBhbmltYXRpb24gd2lsbCB1c2UgdGhlIHdyb25nIHBsYWNlbWVudCB3aXRob3V0IHJlc2V0dGluZyB0aGUgZHVyYXRpb25cbiAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSkge1xuICAgICAgY29uc3Qge2JveCwgY29udGVudH0gPSBnZXREZWZhdWx0VGVtcGxhdGVDaGlsZHJlbigpO1xuICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKFtib3gsIGNvbnRlbnRdLCAwKTtcbiAgICB9XG5cbiAgICBvbkZpcnN0VXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgfHwgaWdub3JlT25GaXJzdFVwZGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlnbm9yZU9uRmlyc3RVcGRhdGUgPSB0cnVlO1xuXG4gICAgICAvLyByZWZsb3dcbiAgICAgIHZvaWQgcG9wcGVyLm9mZnNldEhlaWdodDtcblxuICAgICAgcG9wcGVyLnN0eWxlLnRyYW5zaXRpb24gPSBpbnN0YW5jZS5wcm9wcy5tb3ZlVHJhbnNpdGlvbjtcblxuICAgICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkgJiYgaW5zdGFuY2UucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHtib3gsIGNvbnRlbnR9ID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKFtib3gsIGNvbnRlbnRdLCBkdXJhdGlvbik7XG4gICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbYm94LCBjb250ZW50XSwgJ3Zpc2libGUnKTtcbiAgICAgIH1cblxuICAgICAgaGFuZGxlQXJpYUNvbnRlbnRBdHRyaWJ1dGUoKTtcbiAgICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuXG4gICAgICBwdXNoSWZVbmlxdWUobW91bnRlZEluc3RhbmNlcywgaW5zdGFuY2UpO1xuXG4gICAgICAvLyBjZXJ0YWluIG1vZGlmaWVycyAoZS5nLiBgbWF4U2l6ZWApIHJlcXVpcmUgYSBzZWNvbmQgdXBkYXRlIGFmdGVyIHRoZVxuICAgICAgLy8gcG9wcGVyIGhhcyBiZWVuIHBvc2l0aW9uZWQgZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAgICBpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZT8uZm9yY2VVcGRhdGUoKTtcblxuICAgICAgaW52b2tlSG9vaygnb25Nb3VudCcsIFtpbnN0YW5jZV0pO1xuXG4gICAgICBpZiAoaW5zdGFuY2UucHJvcHMuYW5pbWF0aW9uICYmIGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgICAgb25UcmFuc2l0aW9uZWRJbihkdXJhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnN0YXRlLmlzU2hvd24gPSB0cnVlO1xuICAgICAgICAgIGludm9rZUhvb2soJ29uU2hvd24nLCBbaW5zdGFuY2VdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIG1vdW50KCk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygnaGlkZScpKTtcbiAgICB9XG5cbiAgICAvLyBFYXJseSBiYWlsLW91dFxuICAgIGNvbnN0IGlzQWxyZWFkeUhpZGRlbiA9ICFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGU7XG4gICAgY29uc3QgaXNEZXN0cm95ZWQgPSBpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZDtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gIWluc3RhbmNlLnN0YXRlLmlzRW5hYmxlZDtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGdldFZhbHVlQXRJbmRleE9yUmV0dXJuKFxuICAgICAgaW5zdGFuY2UucHJvcHMuZHVyYXRpb24sXG4gICAgICAxLFxuICAgICAgZGVmYXVsdFByb3BzLmR1cmF0aW9uXG4gICAgKTtcblxuICAgIGlmIChpc0FscmVhZHlIaWRkZW4gfHwgaXNEZXN0cm95ZWQgfHwgaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGludm9rZUhvb2soJ29uSGlkZScsIFtpbnN0YW5jZV0sIGZhbHNlKTtcbiAgICBpZiAoaW5zdGFuY2UucHJvcHMub25IaWRlKGluc3RhbmNlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBpbnN0YW5jZS5zdGF0ZS5pc1Nob3duID0gZmFsc2U7XG4gICAgaWdub3JlT25GaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICAgIGlzVmlzaWJsZUZyb21DbGljayA9IGZhbHNlO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIHBvcHBlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKTtcbiAgICByZW1vdmVEb2N1bWVudFByZXNzKCk7XG4gICAgaGFuZGxlU3R5bGVzKHRydWUpO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIGNvbnN0IHtib3gsIGNvbnRlbnR9ID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKTtcblxuICAgICAgaWYgKGluc3RhbmNlLnByb3BzLmFuaW1hdGlvbikge1xuICAgICAgICBzZXRUcmFuc2l0aW9uRHVyYXRpb24oW2JveCwgY29udGVudF0sIGR1cmF0aW9uKTtcbiAgICAgICAgc2V0VmlzaWJpbGl0eVN0YXRlKFtib3gsIGNvbnRlbnRdLCAnaGlkZGVuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQXJpYUNvbnRlbnRBdHRyaWJ1dGUoKTtcbiAgICBoYW5kbGVBcmlhRXhwYW5kZWRBdHRyaWJ1dGUoKTtcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5hbmltYXRpb24pIHtcbiAgICAgIGlmIChnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICAgIG9uVHJhbnNpdGlvbmVkT3V0KGR1cmF0aW9uLCBpbnN0YW5jZS51bm1vdW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UudW5tb3VudCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGVXaXRoSW50ZXJhY3Rpdml0eShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKFxuICAgICAgICBpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCxcbiAgICAgICAgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ2hpZGVXaXRoSW50ZXJhY3Rpdml0eScpXG4gICAgICApO1xuICAgIH1cblxuICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZGVib3VuY2VkT25Nb3VzZU1vdmUpO1xuICAgIHB1c2hJZlVuaXF1ZShtb3VzZU1vdmVMaXN0ZW5lcnMsIGRlYm91bmNlZE9uTW91c2VNb3ZlKTtcbiAgICBkZWJvdW5jZWRPbk1vdXNlTW92ZShldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB1bm1vdW50KCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygndW5tb3VudCcpKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZXN0cm95UG9wcGVySW5zdGFuY2UoKTtcblxuICAgIC8vIElmIGEgcG9wcGVyIGlzIG5vdCBpbnRlcmFjdGl2ZSwgaXQgd2lsbCBiZSBhcHBlbmRlZCBvdXRzaWRlIHRoZSBwb3BwZXJcbiAgICAvLyB0cmVlIGJ5IGRlZmF1bHQuIFRoaXMgc2VlbXMgbWFpbmx5IGZvciBpbnRlcmFjdGl2ZSB0aXBwaWVzLCBidXQgd2Ugc2hvdWxkXG4gICAgLy8gZmluZCBhIHdvcmthcm91bmQgaWYgcG9zc2libGVcbiAgICBnZXROZXN0ZWRQb3BwZXJUcmVlKCkuZm9yRWFjaCgobmVzdGVkUG9wcGVyKSA9PiB7XG4gICAgICBuZXN0ZWRQb3BwZXIuX3RpcHB5IS51bm1vdW50KCk7XG4gICAgfSk7XG5cbiAgICBpZiAocG9wcGVyLnBhcmVudE5vZGUpIHtcbiAgICAgIHBvcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHBvcHBlcik7XG4gICAgfVxuXG4gICAgbW91bnRlZEluc3RhbmNlcyA9IG1vdW50ZWRJbnN0YW5jZXMuZmlsdGVyKChpKSA9PiBpICE9PSBpbnN0YW5jZSk7XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQgPSBmYWxzZTtcbiAgICBpbnZva2VIb29rKCdvbkhpZGRlbicsIFtpbnN0YW5jZV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSgpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB3YXJuV2hlbihpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCwgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ2Rlc3Ryb3knKSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5zdGFuY2UuY2xlYXJEZWxheVRpbWVvdXRzKCk7XG4gICAgaW5zdGFuY2UudW5tb3VudCgpO1xuXG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG5cbiAgICBkZWxldGUgcmVmZXJlbmNlLl90aXBweTtcblxuICAgIGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIGludm9rZUhvb2soJ29uRGVzdHJveScsIFtpbnN0YW5jZV0pO1xuICB9XG59XG4iLCAiaW1wb3J0IGJpbmRHbG9iYWxFdmVudExpc3RlbmVycywge1xuICBjdXJyZW50SW5wdXQsXG59IGZyb20gJy4vYmluZEdsb2JhbEV2ZW50TGlzdGVuZXJzJztcbmltcG9ydCBjcmVhdGVUaXBweSwge21vdW50ZWRJbnN0YW5jZXN9IGZyb20gJy4vY3JlYXRlVGlwcHknO1xuaW1wb3J0IHtnZXRBcnJheU9mRWxlbWVudHMsIGlzRWxlbWVudCwgaXNSZWZlcmVuY2VFbGVtZW50fSBmcm9tICcuL2RvbS11dGlscyc7XG5pbXBvcnQge2RlZmF1bHRQcm9wcywgc2V0RGVmYXVsdFByb3BzLCB2YWxpZGF0ZVByb3BzfSBmcm9tICcuL3Byb3BzJztcbmltcG9ydCB7SGlkZUFsbCwgSGlkZUFsbE9wdGlvbnMsIEluc3RhbmNlLCBQcm9wcywgVGFyZ2V0c30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3ZhbGlkYXRlVGFyZ2V0cywgd2FybldoZW59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmZ1bmN0aW9uIHRpcHB5KFxuICB0YXJnZXRzOiBUYXJnZXRzLFxuICBvcHRpb25hbFByb3BzOiBQYXJ0aWFsPFByb3BzPiA9IHt9XG4pOiBJbnN0YW5jZSB8IEluc3RhbmNlW10ge1xuICBjb25zdCBwbHVnaW5zID0gZGVmYXVsdFByb3BzLnBsdWdpbnMuY29uY2F0KG9wdGlvbmFsUHJvcHMucGx1Z2lucyB8fCBbXSk7XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKF9fREVWX18pIHtcbiAgICB2YWxpZGF0ZVRhcmdldHModGFyZ2V0cyk7XG4gICAgdmFsaWRhdGVQcm9wcyhvcHRpb25hbFByb3BzLCBwbHVnaW5zKTtcbiAgfVxuXG4gIGJpbmRHbG9iYWxFdmVudExpc3RlbmVycygpO1xuXG4gIGNvbnN0IHBhc3NlZFByb3BzOiBQYXJ0aWFsPFByb3BzPiA9IHsuLi5vcHRpb25hbFByb3BzLCBwbHVnaW5zfTtcblxuICBjb25zdCBlbGVtZW50cyA9IGdldEFycmF5T2ZFbGVtZW50cyh0YXJnZXRzKTtcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoX19ERVZfXykge1xuICAgIGNvbnN0IGlzU2luZ2xlQ29udGVudEVsZW1lbnQgPSBpc0VsZW1lbnQocGFzc2VkUHJvcHMuY29udGVudCk7XG4gICAgY29uc3QgaXNNb3JlVGhhbk9uZVJlZmVyZW5jZUVsZW1lbnQgPSBlbGVtZW50cy5sZW5ndGggPiAxO1xuICAgIHdhcm5XaGVuKFxuICAgICAgaXNTaW5nbGVDb250ZW50RWxlbWVudCAmJiBpc01vcmVUaGFuT25lUmVmZXJlbmNlRWxlbWVudCxcbiAgICAgIFtcbiAgICAgICAgJ3RpcHB5KCkgd2FzIHBhc3NlZCBhbiBFbGVtZW50IGFzIHRoZSBgY29udGVudGAgcHJvcCwgYnV0IG1vcmUgdGhhbicsXG4gICAgICAgICdvbmUgdGlwcHkgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgYnkgdGhpcyBpbnZvY2F0aW9uLiBUaGlzIG1lYW5zIHRoZScsXG4gICAgICAgICdjb250ZW50IGVsZW1lbnQgd2lsbCBvbmx5IGJlIGFwcGVuZGVkIHRvIHRoZSBsYXN0IHRpcHB5IGluc3RhbmNlLicsXG4gICAgICAgICdcXG5cXG4nLFxuICAgICAgICAnSW5zdGVhZCwgcGFzcyB0aGUgLmlubmVySFRNTCBvZiB0aGUgZWxlbWVudCwgb3IgdXNlIGEgZnVuY3Rpb24gdGhhdCcsXG4gICAgICAgICdyZXR1cm5zIGEgY2xvbmVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgaW5zdGVhZC4nLFxuICAgICAgICAnXFxuXFxuJyxcbiAgICAgICAgJzEpIGNvbnRlbnQ6IGVsZW1lbnQuaW5uZXJIVE1MXFxuJyxcbiAgICAgICAgJzIpIGNvbnRlbnQ6ICgpID0+IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpJyxcbiAgICAgIF0uam9pbignICcpXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluc3RhbmNlcyA9IGVsZW1lbnRzLnJlZHVjZTxJbnN0YW5jZVtdPihcbiAgICAoYWNjLCByZWZlcmVuY2UpOiBJbnN0YW5jZVtdID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gcmVmZXJlbmNlICYmIGNyZWF0ZVRpcHB5KHJlZmVyZW5jZSwgcGFzc2VkUHJvcHMpO1xuXG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgYWNjLnB1c2goaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICByZXR1cm4gaXNFbGVtZW50KHRhcmdldHMpID8gaW5zdGFuY2VzWzBdIDogaW5zdGFuY2VzO1xufVxuXG50aXBweS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG50aXBweS5zZXREZWZhdWx0UHJvcHMgPSBzZXREZWZhdWx0UHJvcHM7XG50aXBweS5jdXJyZW50SW5wdXQgPSBjdXJyZW50SW5wdXQ7XG5cbmV4cG9ydCBkZWZhdWx0IHRpcHB5O1xuXG5leHBvcnQgY29uc3QgaGlkZUFsbDogSGlkZUFsbCA9ICh7XG4gIGV4Y2x1ZGU6IGV4Y2x1ZGVkUmVmZXJlbmNlT3JJbnN0YW5jZSxcbiAgZHVyYXRpb24sXG59OiBIaWRlQWxsT3B0aW9ucyA9IHt9KSA9PiB7XG4gIG1vdW50ZWRJbnN0YW5jZXMuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICBsZXQgaXNFeGNsdWRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGV4Y2x1ZGVkUmVmZXJlbmNlT3JJbnN0YW5jZSkge1xuICAgICAgaXNFeGNsdWRlZCA9IGlzUmVmZXJlbmNlRWxlbWVudChleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UpXG4gICAgICAgID8gaW5zdGFuY2UucmVmZXJlbmNlID09PSBleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2VcbiAgICAgICAgOiBpbnN0YW5jZS5wb3BwZXIgPT09IChleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UgYXMgSW5zdGFuY2UpLnBvcHBlcjtcbiAgICB9XG5cbiAgICBpZiAoIWlzRXhjbHVkZWQpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRHVyYXRpb24gPSBpbnN0YW5jZS5wcm9wcy5kdXJhdGlvbjtcblxuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe2R1cmF0aW9ufSk7XG4gICAgICBpbnN0YW5jZS5oaWRlKCk7XG5cbiAgICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe2R1cmF0aW9uOiBvcmlnaW5hbER1cmF0aW9ufSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG4iLCAiaW1wb3J0IHRpcHB5IGZyb20gJy4uJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9kb20tdXRpbHMnO1xuaW1wb3J0IHtcbiAgQ3JlYXRlU2luZ2xldG9uLFxuICBQbHVnaW4sXG4gIENyZWF0ZVNpbmdsZXRvblByb3BzLFxuICBSZWZlcmVuY2VFbGVtZW50LFxuICBDcmVhdGVTaW5nbGV0b25JbnN0YW5jZSxcbiAgSW5zdGFuY2UsXG4gIFByb3BzLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge25vcm1hbGl6ZVRvQXJyYXksIHJlbW92ZVByb3BlcnRpZXN9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7ZXJyb3JXaGVufSBmcm9tICcuLi92YWxpZGF0aW9uJztcbmltcG9ydCB7YXBwbHlTdHlsZXMsIE1vZGlmaWVyfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5cbi8vIFRoZSBkZWZhdWx0IGBhcHBseVN0eWxlc2AgbW9kaWZpZXIgaGFzIGEgY2xlYW51cCBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkXG4vLyBldmVyeSB0aW1lIHRoZSBwb3BwZXIgaXMgZGVzdHJveWVkIChpLmUuIGEgbmV3IHRhcmdldCksIHJlbW92aW5nIHRoZSBzdHlsZXNcbi8vIGFuZCBjYXVzaW5nIHRyYW5zaXRpb25zIHRvIGJyZWFrIGZvciBzaW5nbGV0b25zIHdoZW4gdGhlIGNvbnNvbGUgaXMgb3BlbiwgYnV0XG4vLyBtb3N0IG5vdGFibHkgZm9yIG5vbi10cmFuc2Zvcm0gc3R5bGVzIGJlaW5nIHVzZWQsIGBncHVBY2NlbGVyYXRpb246IGZhbHNlYC5cbmNvbnN0IGFwcGx5U3R5bGVzTW9kaWZpZXI6IE1vZGlmaWVyPCdhcHBseVN0eWxlcycsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgLi4uYXBwbHlTdHlsZXMsXG4gIGVmZmVjdCh7c3RhdGV9KSB7XG4gICAgY29uc3QgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICAgIHBvcHBlcjoge1xuICAgICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgbWFyZ2luOiAnMCcsXG4gICAgICB9LFxuICAgICAgYXJyb3c6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB9LFxuICAgICAgcmVmZXJlbmNlOiB7fSxcbiAgICB9O1xuXG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5wb3BwZXIuc3R5bGUsIGluaXRpYWxTdHlsZXMucG9wcGVyKTtcbiAgICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gICAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLmFycm93LnN0eWxlLCBpbml0aWFsU3R5bGVzLmFycm93KTtcbiAgICB9XG5cbiAgICAvLyBpbnRlbnRpb25hbGx5IHJldHVybiBubyBjbGVhbnVwIGZ1bmN0aW9uXG4gICAgLy8gcmV0dXJuICgpID0+IHsgLi4uIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZVNpbmdsZXRvbjogQ3JlYXRlU2luZ2xldG9uID0gKFxuICB0aXBweUluc3RhbmNlcyxcbiAgb3B0aW9uYWxQcm9wcyA9IHt9XG4pID0+IHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKF9fREVWX18pIHtcbiAgICBlcnJvcldoZW4oXG4gICAgICAhQXJyYXkuaXNBcnJheSh0aXBweUluc3RhbmNlcyksXG4gICAgICBbXG4gICAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVNpbmdsZXRvbigpIG11c3QgYmUgYW4gYXJyYXkgb2YnLFxuICAgICAgICAndGlwcHkgaW5zdGFuY2VzLiBUaGUgcGFzc2VkIHZhbHVlIHdhcycsXG4gICAgICAgIFN0cmluZyh0aXBweUluc3RhbmNlcyksXG4gICAgICBdLmpvaW4oJyAnKVxuICAgICk7XG4gIH1cblxuICBsZXQgaW5kaXZpZHVhbEluc3RhbmNlcyA9IHRpcHB5SW5zdGFuY2VzO1xuICBsZXQgcmVmZXJlbmNlczogQXJyYXk8UmVmZXJlbmNlRWxlbWVudD4gPSBbXTtcbiAgbGV0IHRyaWdnZXJUYXJnZXRzOiBBcnJheTxFbGVtZW50PiA9IFtdO1xuICBsZXQgY3VycmVudFRhcmdldDogRWxlbWVudCB8IG51bGw7XG4gIGxldCBvdmVycmlkZXMgPSBvcHRpb25hbFByb3BzLm92ZXJyaWRlcztcbiAgbGV0IGludGVyY2VwdFNldFByb3BzQ2xlYW51cHM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG4gIGxldCBzaG93bk9uQ3JlYXRlID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gc2V0VHJpZ2dlclRhcmdldHMoKTogdm9pZCB7XG4gICAgdHJpZ2dlclRhcmdldHMgPSBpbmRpdmlkdWFsSW5zdGFuY2VzXG4gICAgICAubWFwKChpbnN0YW5jZSkgPT5cbiAgICAgICAgbm9ybWFsaXplVG9BcnJheShpbnN0YW5jZS5wcm9wcy50cmlnZ2VyVGFyZ2V0IHx8IGluc3RhbmNlLnJlZmVyZW5jZSlcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjLmNvbmNhdChpdGVtKSwgW10pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0UmVmZXJlbmNlcygpOiB2b2lkIHtcbiAgICByZWZlcmVuY2VzID0gaW5kaXZpZHVhbEluc3RhbmNlcy5tYXAoKGluc3RhbmNlKSA9PiBpbnN0YW5jZS5yZWZlcmVuY2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5hYmxlSW5zdGFuY2VzKGlzRW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGluZGl2aWR1YWxJbnN0YW5jZXMuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgaW5zdGFuY2UuZW5hYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnRlcmNlcHRTZXRQcm9wcyhzaW5nbGV0b246IEluc3RhbmNlKTogQXJyYXk8KCkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBpbmRpdmlkdWFsSW5zdGFuY2VzLm1hcCgoaW5zdGFuY2UpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsU2V0UHJvcHMgPSBpbnN0YW5jZS5zZXRQcm9wcztcblxuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMgPSAocHJvcHMpOiB2b2lkID0+IHtcbiAgICAgICAgb3JpZ2luYWxTZXRQcm9wcyhwcm9wcyk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlLnJlZmVyZW5jZSA9PT0gY3VycmVudFRhcmdldCkge1xuICAgICAgICAgIHNpbmdsZXRvbi5zZXRQcm9wcyhwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGluc3RhbmNlLnNldFByb3BzID0gb3JpZ2luYWxTZXRQcm9wcztcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBoYXZlIHRvIHBhc3Mgc2luZ2xldG9uLCBhcyBpdCBtYXliZSB1bmRlZmluZWQgb24gZmlyc3QgY2FsbFxuICBmdW5jdGlvbiBwcmVwYXJlSW5zdGFuY2UoXG4gICAgc2luZ2xldG9uOiBJbnN0YW5jZSxcbiAgICB0YXJnZXQ6IFJlZmVyZW5jZUVsZW1lbnRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0cmlnZ2VyVGFyZ2V0cy5pbmRleE9mKHRhcmdldCk7XG5cbiAgICAvLyBiYWlsLW91dFxuICAgIGlmICh0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xuXG4gICAgY29uc3Qgb3ZlcnJpZGVQcm9wczogUGFydGlhbDxQcm9wcz4gPSAob3ZlcnJpZGVzIHx8IFtdKVxuICAgICAgLmNvbmNhdCgnY29udGVudCcpXG4gICAgICAucmVkdWNlKChhY2MsIHByb3ApID0+IHtcbiAgICAgICAgKGFjYyBhcyBhbnkpW3Byb3BdID0gaW5kaXZpZHVhbEluc3RhbmNlc1tpbmRleF0ucHJvcHNbcHJvcF07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSk7XG5cbiAgICBzaW5nbGV0b24uc2V0UHJvcHMoe1xuICAgICAgLi4ub3ZlcnJpZGVQcm9wcyxcbiAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6XG4gICAgICAgIHR5cGVvZiBvdmVycmlkZVByb3BzLmdldFJlZmVyZW5jZUNsaWVudFJlY3QgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IG92ZXJyaWRlUHJvcHMuZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdFxuICAgICAgICAgIDogKCk6IENsaWVudFJlY3QgPT4gcmVmZXJlbmNlc1tpbmRleF0/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlSW5zdGFuY2VzKGZhbHNlKTtcbiAgc2V0UmVmZXJlbmNlcygpO1xuICBzZXRUcmlnZ2VyVGFyZ2V0cygpO1xuXG4gIGNvbnN0IHBsdWdpbjogUGx1Z2luID0ge1xuICAgIGZuKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAgIGVuYWJsZUluc3RhbmNlcyh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IaWRkZW4oKTogdm9pZCB7XG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xpY2tPdXRzaWRlKGluc3RhbmNlKTogdm9pZCB7XG4gICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzLnNob3dPbkNyZWF0ZSAmJiAhc2hvd25PbkNyZWF0ZSkge1xuICAgICAgICAgICAgc2hvd25PbkNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2hvdyhpbnN0YW5jZSk6IHZvaWQge1xuICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5zaG93T25DcmVhdGUgJiYgIXNob3duT25DcmVhdGUpIHtcbiAgICAgICAgICAgIHNob3duT25DcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcHJlcGFyZUluc3RhbmNlKGluc3RhbmNlLCByZWZlcmVuY2VzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uVHJpZ2dlcihpbnN0YW5jZSwgZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgICBwcmVwYXJlSW5zdGFuY2UoaW5zdGFuY2UsIGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgRWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3Qgc2luZ2xldG9uID0gdGlwcHkoZGl2KCksIHtcbiAgICAuLi5yZW1vdmVQcm9wZXJ0aWVzKG9wdGlvbmFsUHJvcHMsIFsnb3ZlcnJpZGVzJ10pLFxuICAgIHBsdWdpbnM6IFtwbHVnaW4sIC4uLihvcHRpb25hbFByb3BzLnBsdWdpbnMgfHwgW10pXSxcbiAgICB0cmlnZ2VyVGFyZ2V0OiB0cmlnZ2VyVGFyZ2V0cyxcbiAgICBwb3BwZXJPcHRpb25zOiB7XG4gICAgICAuLi5vcHRpb25hbFByb3BzLnBvcHBlck9wdGlvbnMsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgLi4uKG9wdGlvbmFsUHJvcHMucG9wcGVyT3B0aW9ucz8ubW9kaWZpZXJzIHx8IFtdKSxcbiAgICAgICAgYXBwbHlTdHlsZXNNb2RpZmllcixcbiAgICAgIF0sXG4gICAgfSxcbiAgfSkgYXMgQ3JlYXRlU2luZ2xldG9uSW5zdGFuY2U8Q3JlYXRlU2luZ2xldG9uUHJvcHM+O1xuXG4gIGNvbnN0IG9yaWdpbmFsU2hvdyA9IHNpbmdsZXRvbi5zaG93O1xuXG4gIHNpbmdsZXRvbi5zaG93ID0gKHRhcmdldD86IFJlZmVyZW5jZUVsZW1lbnQgfCBJbnN0YW5jZSB8IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIG9yaWdpbmFsU2hvdygpO1xuXG4gICAgLy8gZmlyc3QgdGltZSwgc2hvd09uQ3JlYXRlIG9yIHByb2dyYW1tYXRpYyBjYWxsIHdpdGggbm8gcGFyYW1zXG4gICAgLy8gZGVmYXVsdCB0byBzaG93aW5nIGZpcnN0IGluc3RhbmNlXG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0ICYmIHRhcmdldCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcHJlcGFyZUluc3RhbmNlKHNpbmdsZXRvbiwgcmVmZXJlbmNlc1swXSk7XG4gICAgfVxuXG4gICAgLy8gdHJpZ2dlcmVkIGZyb20gZXZlbnQgKGRvIG5vdGhpbmcgYXMgcHJlcGFyZUluc3RhbmNlIGFscmVhZHkgY2FsbGVkIGJ5IG9uVHJpZ2dlcilcbiAgICAvLyBwcm9ncmFtbWF0aWMgY2FsbCB3aXRoIG5vIHBhcmFtcyB3aGVuIGFscmVhZHkgdmlzaWJsZSAoZG8gbm90aGluZyBhZ2FpbilcbiAgICBpZiAoY3VycmVudFRhcmdldCAmJiB0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRhcmdldCBpcyBpbmRleCBvZiBpbnN0YW5jZVxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgcmVmZXJlbmNlc1t0YXJnZXRdICYmIHByZXBhcmVJbnN0YW5jZShzaW5nbGV0b24sIHJlZmVyZW5jZXNbdGFyZ2V0XSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdGFyZ2V0IGlzIGEgY2hpbGQgdGlwcHkgaW5zdGFuY2VcbiAgICBpZiAoaW5kaXZpZHVhbEluc3RhbmNlcy5pbmRleE9mKHRhcmdldCBhcyBJbnN0YW5jZSkgPj0gMCkge1xuICAgICAgY29uc3QgcmVmID0gKHRhcmdldCBhcyBJbnN0YW5jZSkucmVmZXJlbmNlO1xuICAgICAgcmV0dXJuIHByZXBhcmVJbnN0YW5jZShzaW5nbGV0b24sIHJlZik7XG4gICAgfVxuXG4gICAgLy8gdGFyZ2V0IGlzIGEgUmVmZXJlbmNlRWxlbWVudFxuICAgIGlmIChyZWZlcmVuY2VzLmluZGV4T2YodGFyZ2V0IGFzIFJlZmVyZW5jZUVsZW1lbnQpID49IDApIHtcbiAgICAgIHJldHVybiBwcmVwYXJlSW5zdGFuY2Uoc2luZ2xldG9uLCB0YXJnZXQgYXMgUmVmZXJlbmNlRWxlbWVudCk7XG4gICAgfVxuICB9O1xuXG4gIHNpbmdsZXRvbi5zaG93TmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBmaXJzdCA9IHJlZmVyZW5jZXNbMF07XG4gICAgaWYgKCFjdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2luZ2xldG9uLnNob3coMCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gcmVmZXJlbmNlcy5pbmRleE9mKGN1cnJlbnRUYXJnZXQpO1xuICAgIHNpbmdsZXRvbi5zaG93KHJlZmVyZW5jZXNbaW5kZXggKyAxXSB8fCBmaXJzdCk7XG4gIH07XG5cbiAgc2luZ2xldG9uLnNob3dQcmV2aW91cyA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBsYXN0ID0gcmVmZXJlbmNlc1tyZWZlcmVuY2VzLmxlbmd0aCAtIDFdO1xuICAgIGlmICghY3VycmVudFRhcmdldCkge1xuICAgICAgcmV0dXJuIHNpbmdsZXRvbi5zaG93KGxhc3QpO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHJlZmVyZW5jZXMuaW5kZXhPZihjdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCB0YXJnZXQgPSByZWZlcmVuY2VzW2luZGV4IC0gMV0gfHwgbGFzdDtcbiAgICBzaW5nbGV0b24uc2hvdyh0YXJnZXQpO1xuICB9O1xuXG4gIGNvbnN0IG9yaWdpbmFsU2V0UHJvcHMgPSBzaW5nbGV0b24uc2V0UHJvcHM7XG5cbiAgc2luZ2xldG9uLnNldFByb3BzID0gKHByb3BzKTogdm9pZCA9PiB7XG4gICAgb3ZlcnJpZGVzID0gcHJvcHMub3ZlcnJpZGVzIHx8IG92ZXJyaWRlcztcbiAgICBvcmlnaW5hbFNldFByb3BzKHByb3BzKTtcbiAgfTtcblxuICBzaW5nbGV0b24uc2V0SW5zdGFuY2VzID0gKG5leHRJbnN0YW5jZXMpOiB2b2lkID0+IHtcbiAgICBlbmFibGVJbnN0YW5jZXModHJ1ZSk7XG4gICAgaW50ZXJjZXB0U2V0UHJvcHNDbGVhbnVwcy5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG5cbiAgICBpbmRpdmlkdWFsSW5zdGFuY2VzID0gbmV4dEluc3RhbmNlcztcblxuICAgIGVuYWJsZUluc3RhbmNlcyhmYWxzZSk7XG4gICAgc2V0UmVmZXJlbmNlcygpO1xuICAgIHNldFRyaWdnZXJUYXJnZXRzKCk7XG4gICAgaW50ZXJjZXB0U2V0UHJvcHNDbGVhbnVwcyA9IGludGVyY2VwdFNldFByb3BzKHNpbmdsZXRvbik7XG5cbiAgICBzaW5nbGV0b24uc2V0UHJvcHMoe3RyaWdnZXJUYXJnZXQ6IHRyaWdnZXJUYXJnZXRzfSk7XG4gIH07XG5cbiAgaW50ZXJjZXB0U2V0UHJvcHNDbGVhbnVwcyA9IGludGVyY2VwdFNldFByb3BzKHNpbmdsZXRvbik7XG5cbiAgcmV0dXJuIHNpbmdsZXRvbjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVNpbmdsZXRvbjtcbiIsICJpbXBvcnQgdGlwcHkgZnJvbSAnLi4nO1xuaW1wb3J0IHtUT1VDSF9PUFRJT05TfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtkZWZhdWx0UHJvcHN9IGZyb20gJy4uL3Byb3BzJztcbmltcG9ydCB7SW5zdGFuY2UsIFByb3BzLCBUYXJnZXRzfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0xpc3RlbmVyT2JqZWN0fSBmcm9tICcuLi90eXBlcy1pbnRlcm5hbCc7XG5pbXBvcnQge25vcm1hbGl6ZVRvQXJyYXksIHJlbW92ZVByb3BlcnRpZXN9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7ZXJyb3JXaGVufSBmcm9tICcuLi92YWxpZGF0aW9uJztcblxuY29uc3QgQlVCQkxJTkdfRVZFTlRTX01BUCA9IHtcbiAgbW91c2VvdmVyOiAnbW91c2VlbnRlcicsXG4gIGZvY3VzaW46ICdmb2N1cycsXG4gIGNsaWNrOiAnY2xpY2snLFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVsZWdhdGUgaW5zdGFuY2UgdGhhdCBjb250cm9scyB0aGUgY3JlYXRpb24gb2YgdGlwcHkgaW5zdGFuY2VzXG4gKiBmb3IgY2hpbGQgZWxlbWVudHMgKGB0YXJnZXRgIENTUyBzZWxlY3RvcikuXG4gKi9cbmZ1bmN0aW9uIGRlbGVnYXRlKFxuICB0YXJnZXRzOiBUYXJnZXRzLFxuICBwcm9wczogUGFydGlhbDxQcm9wcz4gJiB7dGFyZ2V0OiBzdHJpbmd9XG4pOiBJbnN0YW5jZSB8IEluc3RhbmNlW10ge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoX19ERVZfXykge1xuICAgIGVycm9yV2hlbihcbiAgICAgICEocHJvcHMgJiYgcHJvcHMudGFyZ2V0KSxcbiAgICAgIFtcbiAgICAgICAgJ1lvdSBtdXN0IHNwZWNpdHkgYSBgdGFyZ2V0YCBwcm9wIGluZGljYXRpbmcgYSBDU1Mgc2VsZWN0b3Igc3RyaW5nIG1hdGNoaW5nJyxcbiAgICAgICAgJ3RoZSB0YXJnZXQgZWxlbWVudHMgdGhhdCBzaG91bGQgcmVjZWl2ZSBhIHRpcHB5LicsXG4gICAgICBdLmpvaW4oJyAnKVxuICAgICk7XG4gIH1cblxuICBsZXQgbGlzdGVuZXJzOiBMaXN0ZW5lck9iamVjdFtdID0gW107XG4gIGxldCBjaGlsZFRpcHB5SW5zdGFuY2VzOiBJbnN0YW5jZVtdID0gW107XG4gIGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHt0YXJnZXR9ID0gcHJvcHM7XG5cbiAgY29uc3QgbmF0aXZlUHJvcHMgPSByZW1vdmVQcm9wZXJ0aWVzKHByb3BzLCBbJ3RhcmdldCddKTtcbiAgY29uc3QgcGFyZW50UHJvcHMgPSB7Li4ubmF0aXZlUHJvcHMsIHRyaWdnZXI6ICdtYW51YWwnLCB0b3VjaDogZmFsc2V9O1xuICBjb25zdCBjaGlsZFByb3BzID0ge1xuICAgIHRvdWNoOiBkZWZhdWx0UHJvcHMudG91Y2gsXG4gICAgLi4ubmF0aXZlUHJvcHMsXG4gICAgc2hvd09uQ3JlYXRlOiB0cnVlLFxuICB9O1xuXG4gIGNvbnN0IHJldHVyblZhbHVlID0gdGlwcHkodGFyZ2V0cywgcGFyZW50UHJvcHMpO1xuICBjb25zdCBub3JtYWxpemVkUmV0dXJuVmFsdWUgPSBub3JtYWxpemVUb0FycmF5KHJldHVyblZhbHVlKTtcblxuICBmdW5jdGlvbiBvblRyaWdnZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFldmVudC50YXJnZXQgfHwgZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXROb2RlID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5jbG9zZXN0KHRhcmdldCk7XG5cbiAgICBpZiAoIXRhcmdldE5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgcmVsZXZhbnQgdHJpZ2dlciB3aXRoIGZhbGxiYWNrczpcbiAgICAvLyAxLiBDaGVjayBgZGF0YS10aXBweS10cmlnZ2VyYCBhdHRyaWJ1dGUgb24gdGFyZ2V0IG5vZGVcbiAgICAvLyAyLiBGYWxsYmFjayB0byBgdHJpZ2dlcmAgcGFzc2VkIHRvIGBkZWxlZ2F0ZSgpYFxuICAgIC8vIDMuIEZhbGxiYWNrIHRvIGBkZWZhdWx0UHJvcHMudHJpZ2dlcmBcbiAgICBjb25zdCB0cmlnZ2VyID1cbiAgICAgIHRhcmdldE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LXRyaWdnZXInKSB8fFxuICAgICAgcHJvcHMudHJpZ2dlciB8fFxuICAgICAgZGVmYXVsdFByb3BzLnRyaWdnZXI7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHRhcmdldE5vZGUuX3RpcHB5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0JyAmJiB0eXBlb2YgY2hpbGRQcm9wcy50b3VjaCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZXZlbnQudHlwZSAhPT0gJ3RvdWNoc3RhcnQnICYmXG4gICAgICB0cmlnZ2VyLmluZGV4T2YoKEJVQkJMSU5HX0VWRU5UU19NQVAgYXMgYW55KVtldmVudC50eXBlXSkgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aXBweSh0YXJnZXROb2RlLCBjaGlsZFByb3BzKTtcblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2hpbGRUaXBweUluc3RhbmNlcyA9IGNoaWxkVGlwcHlJbnN0YW5jZXMuY29uY2F0KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbihcbiAgICBub2RlOiBFbGVtZW50LFxuICAgIGV2ZW50VHlwZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIsXG4gICAgb3B0aW9uczogYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgbGlzdGVuZXJzLnB1c2goe25vZGUsIGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9uc30pO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcnMoaW5zdGFuY2U6IEluc3RhbmNlKTogdm9pZCB7XG4gICAgY29uc3Qge3JlZmVyZW5jZX0gPSBpbnN0YW5jZTtcblxuICAgIG9uKHJlZmVyZW5jZSwgJ3RvdWNoc3RhcnQnLCBvblRyaWdnZXIsIFRPVUNIX09QVElPTlMpO1xuICAgIG9uKHJlZmVyZW5jZSwgJ21vdXNlb3ZlcicsIG9uVHJpZ2dlcik7XG4gICAgb24ocmVmZXJlbmNlLCAnZm9jdXNpbicsIG9uVHJpZ2dlcik7XG4gICAgb24ocmVmZXJlbmNlLCAnY2xpY2snLCBvblRyaWdnZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKHtub2RlLCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnN9OiBMaXN0ZW5lck9iamVjdCkgPT4ge1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseU11dGF0aW9ucyhpbnN0YW5jZTogSW5zdGFuY2UpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBpbnN0YW5jZS5kZXN0cm95O1xuICAgIGNvbnN0IG9yaWdpbmFsRW5hYmxlID0gaW5zdGFuY2UuZW5hYmxlO1xuICAgIGNvbnN0IG9yaWdpbmFsRGlzYWJsZSA9IGluc3RhbmNlLmRpc2FibGU7XG5cbiAgICBpbnN0YW5jZS5kZXN0cm95ID0gKHNob3VsZERlc3Ryb3lDaGlsZEluc3RhbmNlcyA9IHRydWUpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzaG91bGREZXN0cm95Q2hpbGRJbnN0YW5jZXMpIHtcbiAgICAgICAgY2hpbGRUaXBweUluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGlwcHlJbnN0YW5jZXMgPSBbXTtcblxuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgIH07XG5cbiAgICBpbnN0YW5jZS5lbmFibGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBvcmlnaW5hbEVuYWJsZSgpO1xuICAgICAgY2hpbGRUaXBweUluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuZW5hYmxlKCkpO1xuICAgICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgaW5zdGFuY2UuZGlzYWJsZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIG9yaWdpbmFsRGlzYWJsZSgpO1xuICAgICAgY2hpbGRUaXBweUluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuZGlzYWJsZSgpKTtcbiAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcnMoaW5zdGFuY2UpO1xuICB9XG5cbiAgbm9ybWFsaXplZFJldHVyblZhbHVlLmZvckVhY2goYXBwbHlNdXRhdGlvbnMpO1xuXG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVsZWdhdGU7XG4iLCAiaW1wb3J0IHtCQUNLRFJPUF9DTEFTU30gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7ZGl2LCBzZXRWaXNpYmlsaXR5U3RhdGV9IGZyb20gJy4uL2RvbS11dGlscyc7XG5pbXBvcnQge2dldENoaWxkcmVufSBmcm9tICcuLi90ZW1wbGF0ZSc7XG5pbXBvcnQge0FuaW1hdGVGaWxsfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Vycm9yV2hlbn0gZnJvbSAnLi4vdmFsaWRhdGlvbic7XG5cbmNvbnN0IGFuaW1hdGVGaWxsOiBBbmltYXRlRmlsbCA9IHtcbiAgbmFtZTogJ2FuaW1hdGVGaWxsJyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm4oaW5zdGFuY2UpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCFpbnN0YW5jZS5wcm9wcy5yZW5kZXI/LiQkdGlwcHkpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIGVycm9yV2hlbihcbiAgICAgICAgICBpbnN0YW5jZS5wcm9wcy5hbmltYXRlRmlsbCxcbiAgICAgICAgICAnVGhlIGBhbmltYXRlRmlsbGAgcGx1Z2luIHJlcXVpcmVzIHRoZSBkZWZhdWx0IHJlbmRlciBmdW5jdGlvbi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCB7Ym94LCBjb250ZW50fSA9IGdldENoaWxkcmVuKGluc3RhbmNlLnBvcHBlcik7XG5cbiAgICBjb25zdCBiYWNrZHJvcCA9IGluc3RhbmNlLnByb3BzLmFuaW1hdGVGaWxsXG4gICAgICA/IGNyZWF0ZUJhY2tkcm9wRWxlbWVudCgpXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb25DcmVhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmIChiYWNrZHJvcCkge1xuICAgICAgICAgIGJveC5pbnNlcnRCZWZvcmUoYmFja2Ryb3AsIGJveC5maXJzdEVsZW1lbnRDaGlsZCEpO1xuICAgICAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0ZWZpbGwnLCAnJyk7XG4gICAgICAgICAgYm94LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cbiAgICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7YXJyb3c6IGZhbHNlLCBhbmltYXRpb246ICdzaGlmdC1hd2F5J30pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Nb3VudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICAgICAgY29uc3Qge3RyYW5zaXRpb25EdXJhdGlvbn0gPSBib3guc3R5bGU7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBOdW1iZXIodHJhbnNpdGlvbkR1cmF0aW9uLnJlcGxhY2UoJ21zJywgJycpKTtcblxuICAgICAgICAgIC8vIFRoZSBjb250ZW50IHNob3VsZCBmYWRlIGluIGFmdGVyIHRoZSBiYWNrZHJvcCBoYXMgbW9zdGx5IGZpbGxlZCB0aGVcbiAgICAgICAgICAvLyB0b29sdGlwIGVsZW1lbnQuIGBjbGlwLXBhdGhgIGlzIHRoZSBvdGhlciBhbHRlcm5hdGl2ZSBidXQgaXMgbm90XG4gICAgICAgICAgLy8gd2VsbC1zdXBwb3J0ZWQgYW5kIGlzIGJ1Z2d5IG9uIHNvbWUgZGV2aWNlcy5cbiAgICAgICAgICBjb250ZW50LnN0eWxlLnRyYW5zaXRpb25EZWxheSA9IGAke01hdGgucm91bmQoZHVyYXRpb24gLyAxMCl9bXNgO1xuXG4gICAgICAgICAgYmFja2Ryb3Auc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uO1xuICAgICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbYmFja2Ryb3BdLCAndmlzaWJsZScpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25TaG93KCk6IHZvaWQge1xuICAgICAgICBpZiAoYmFja2Ryb3ApIHtcbiAgICAgICAgICBiYWNrZHJvcC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSAnMG1zJztcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uSGlkZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICAgICAgc2V0VmlzaWJpbGl0eVN0YXRlKFtiYWNrZHJvcF0sICdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgYW5pbWF0ZUZpbGw7XG5cbmZ1bmN0aW9uIGNyZWF0ZUJhY2tkcm9wRWxlbWVudCgpOiBIVE1MRGl2RWxlbWVudCB7XG4gIGNvbnN0IGJhY2tkcm9wID0gZGl2KCk7XG4gIGJhY2tkcm9wLmNsYXNzTmFtZSA9IEJBQ0tEUk9QX0NMQVNTO1xuICBzZXRWaXNpYmlsaXR5U3RhdGUoW2JhY2tkcm9wXSwgJ2hpZGRlbicpO1xuICByZXR1cm4gYmFja2Ryb3A7XG59XG4iLCAiaW1wb3J0IHtnZXRPd25lckRvY3VtZW50LCBpc01vdXNlRXZlbnR9IGZyb20gJy4uL2RvbS11dGlscyc7XG5pbXBvcnQge0ZvbGxvd0N1cnNvciwgSW5zdGFuY2V9IGZyb20gJy4uL3R5cGVzJztcblxubGV0IG1vdXNlQ29vcmRzID0ge2NsaWVudFg6IDAsIGNsaWVudFk6IDB9O1xubGV0IGFjdGl2ZUluc3RhbmNlczogQXJyYXk8e2luc3RhbmNlOiBJbnN0YW5jZTsgZG9jOiBEb2N1bWVudH0+ID0gW107XG5cbmZ1bmN0aW9uIHN0b3JlTW91c2VDb29yZHMoe2NsaWVudFgsIGNsaWVudFl9OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gIG1vdXNlQ29vcmRzID0ge2NsaWVudFgsIGNsaWVudFl9O1xufVxuXG5mdW5jdGlvbiBhZGRNb3VzZUNvb3Jkc0xpc3RlbmVyKGRvYzogRG9jdW1lbnQpOiB2b2lkIHtcbiAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0b3JlTW91c2VDb29yZHMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVNb3VzZUNvb3Jkc0xpc3RlbmVyKGRvYzogRG9jdW1lbnQpOiB2b2lkIHtcbiAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0b3JlTW91c2VDb29yZHMpO1xufVxuXG5jb25zdCBmb2xsb3dDdXJzb3I6IEZvbGxvd0N1cnNvciA9IHtcbiAgbmFtZTogJ2ZvbGxvd0N1cnNvcicsXG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGZuKGluc3RhbmNlKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gaW5zdGFuY2UucmVmZXJlbmNlO1xuICAgIGNvbnN0IGRvYyA9IGdldE93bmVyRG9jdW1lbnQoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpO1xuXG4gICAgbGV0IGlzSW50ZXJuYWxVcGRhdGUgPSBmYWxzZTtcbiAgICBsZXQgd2FzRm9jdXNFdmVudCA9IGZhbHNlO1xuICAgIGxldCBpc1VubW91bnRlZCA9IHRydWU7XG4gICAgbGV0IHByZXZQcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNJbml0aWFsQmVoYXZpb3IoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IgPT09ICdpbml0aWFsJyAmJiBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnNldEdldFJlZmVyZW5jZUNsaWVudFJlY3QoKTogdm9pZCB7XG4gICAgICBpc0ludGVybmFsVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGluc3RhbmNlLnNldFByb3BzKHtnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBudWxsfSk7XG4gICAgICBpc0ludGVybmFsVXBkYXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgIC8vIElmIHRoZSBpbnN0YW5jZSBpcyBpbnRlcmFjdGl2ZSwgYXZvaWQgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHVubGVzcyBpdCdzXG4gICAgICAvLyBvdmVyIHRoZSByZWZlcmVuY2UgZWxlbWVudFxuICAgICAgY29uc3QgaXNDdXJzb3JPdmVyUmVmZXJlbmNlID0gZXZlbnQudGFyZ2V0XG4gICAgICAgID8gcmVmZXJlbmNlLmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKVxuICAgICAgICA6IHRydWU7XG4gICAgICBjb25zdCB7Zm9sbG93Q3Vyc29yfSA9IGluc3RhbmNlLnByb3BzO1xuICAgICAgY29uc3Qge2NsaWVudFgsIGNsaWVudFl9ID0gZXZlbnQ7XG5cbiAgICAgIGNvbnN0IHJlY3QgPSByZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVggPSBjbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgICAgY29uc3QgcmVsYXRpdmVZID0gY2xpZW50WSAtIHJlY3QudG9wO1xuXG4gICAgICBpZiAoaXNDdXJzb3JPdmVyUmVmZXJlbmNlIHx8ICFpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIHVubmVlZGVkIERPTVJlY3QgcHJvcGVydGllc1xuICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3QoKSB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBsZXQgeCA9IGNsaWVudFg7XG4gICAgICAgICAgICBsZXQgeSA9IGNsaWVudFk7XG5cbiAgICAgICAgICAgIGlmIChmb2xsb3dDdXJzb3IgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgICB4ID0gcmVjdC5sZWZ0ICsgcmVsYXRpdmVYO1xuICAgICAgICAgICAgICB5ID0gcmVjdC50b3AgKyByZWxhdGl2ZVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IGZvbGxvd0N1cnNvciA9PT0gJ2hvcml6b250YWwnID8gcmVjdC50b3AgOiB5O1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBmb2xsb3dDdXJzb3IgPT09ICd2ZXJ0aWNhbCcgPyByZWN0LnJpZ2h0IDogeDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGZvbGxvd0N1cnNvciA9PT0gJ2hvcml6b250YWwnID8gcmVjdC5ib3R0b20gOiB5O1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGZvbGxvd0N1cnNvciA9PT0gJ3ZlcnRpY2FsJyA/IHJlY3QubGVmdCA6IHg7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHdpZHRoOiByaWdodCAtIGxlZnQsXG4gICAgICAgICAgICAgIGhlaWdodDogYm90dG9tIC0gdG9wLFxuICAgICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IpIHtcbiAgICAgICAgYWN0aXZlSW5zdGFuY2VzLnB1c2goe2luc3RhbmNlLCBkb2N9KTtcbiAgICAgICAgYWRkTW91c2VDb29yZHNMaXN0ZW5lcihkb2MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBhY3RpdmVJbnN0YW5jZXMgPSBhY3RpdmVJbnN0YW5jZXMuZmlsdGVyKFxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5pbnN0YW5jZSAhPT0gaW5zdGFuY2VcbiAgICAgICk7XG5cbiAgICAgIGlmIChhY3RpdmVJbnN0YW5jZXMuZmlsdGVyKChkYXRhKSA9PiBkYXRhLmRvYyA9PT0gZG9jKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTW91c2VDb29yZHNMaXN0ZW5lcihkb2MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvbkNyZWF0ZTogY3JlYXRlLFxuICAgICAgb25EZXN0cm95OiBkZXN0cm95LFxuICAgICAgb25CZWZvcmVVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIHByZXZQcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuICAgICAgfSxcbiAgICAgIG9uQWZ0ZXJVcGRhdGUoXywge2ZvbGxvd0N1cnNvcn0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzSW50ZXJuYWxVcGRhdGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZm9sbG93Q3Vyc29yICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBwcmV2UHJvcHMuZm9sbG93Q3Vyc29yICE9PSBmb2xsb3dDdXJzb3JcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGVzdHJveSgpO1xuXG4gICAgICAgICAgaWYgKGZvbGxvd0N1cnNvcikge1xuICAgICAgICAgICAgY3JlYXRlKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkICYmXG4gICAgICAgICAgICAgICF3YXNGb2N1c0V2ZW50ICYmXG4gICAgICAgICAgICAgICFnZXRJc0luaXRpYWxCZWhhdmlvcigpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYWRkTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIHVuc2V0R2V0UmVmZXJlbmNlQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uTW91bnQoKTogdm9pZCB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IgJiYgIXdhc0ZvY3VzRXZlbnQpIHtcbiAgICAgICAgICBpZiAoaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICAgIG9uTW91c2VNb3ZlKG1vdXNlQ29vcmRzIGFzIE1vdXNlRXZlbnQpO1xuICAgICAgICAgICAgaXNVbm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWdldElzSW5pdGlhbEJlaGF2aW9yKCkpIHtcbiAgICAgICAgICAgIGFkZExpc3RlbmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25UcmlnZ2VyKF8sIGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChpc01vdXNlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgbW91c2VDb29yZHMgPSB7Y2xpZW50WDogZXZlbnQuY2xpZW50WCwgY2xpZW50WTogZXZlbnQuY2xpZW50WX07XG4gICAgICAgIH1cbiAgICAgICAgd2FzRm9jdXNFdmVudCA9IGV2ZW50LnR5cGUgPT09ICdmb2N1cyc7XG4gICAgICB9LFxuICAgICAgb25IaWRkZW4oKTogdm9pZCB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5mb2xsb3dDdXJzb3IpIHtcbiAgICAgICAgICB1bnNldEdldFJlZmVyZW5jZUNsaWVudFJlY3QoKTtcbiAgICAgICAgICByZW1vdmVMaXN0ZW5lcigpO1xuICAgICAgICAgIGlzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9sbG93Q3Vyc29yO1xuIiwgImltcG9ydCB7TW9kaWZpZXIsIFBsYWNlbWVudH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuaW1wb3J0IHtpc01vdXNlRXZlbnR9IGZyb20gJy4uL2RvbS11dGlscyc7XG5pbXBvcnQge0Jhc2VQbGFjZW1lbnQsIElubGluZVBvc2l0aW9uaW5nLCBQcm9wc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthcnJheUZyb20sIGdldEJhc2VQbGFjZW1lbnR9IGZyb20gJy4uL3V0aWxzJztcblxuZnVuY3Rpb24gZ2V0UHJvcHMocHJvcHM6IFByb3BzLCBtb2RpZmllcjogTW9kaWZpZXI8YW55LCBhbnk+KTogUGFydGlhbDxQcm9wcz4ge1xuICByZXR1cm4ge1xuICAgIHBvcHBlck9wdGlvbnM6IHtcbiAgICAgIC4uLnByb3BzLnBvcHBlck9wdGlvbnMsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgLi4uKHByb3BzLnBvcHBlck9wdGlvbnM/Lm1vZGlmaWVycyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICh7bmFtZX0pID0+IG5hbWUgIT09IG1vZGlmaWVyLm5hbWVcbiAgICAgICAgKSxcbiAgICAgICAgbW9kaWZpZXIsXG4gICAgICBdLFxuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGlubGluZVBvc2l0aW9uaW5nOiBJbmxpbmVQb3NpdGlvbmluZyA9IHtcbiAgbmFtZTogJ2lubGluZVBvc2l0aW9uaW5nJyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm4oaW5zdGFuY2UpIHtcbiAgICBjb25zdCB7cmVmZXJlbmNlfSA9IGluc3RhbmNlO1xuXG4gICAgZnVuY3Rpb24gaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICEhaW5zdGFuY2UucHJvcHMuaW5saW5lUG9zaXRpb25pbmc7XG4gICAgfVxuXG4gICAgbGV0IHBsYWNlbWVudDogUGxhY2VtZW50O1xuICAgIGxldCBjdXJzb3JSZWN0SW5kZXggPSAtMTtcbiAgICBsZXQgaXNJbnRlcm5hbFVwZGF0ZSA9IGZhbHNlO1xuICAgIGxldCB0cmllZFBsYWNlbWVudHM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgIGNvbnN0IG1vZGlmaWVyOiBNb2RpZmllcjxcbiAgICAgICd0aXBweUlubGluZVBvc2l0aW9uaW5nJyxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgPiA9IHtcbiAgICAgIG5hbWU6ICd0aXBweUlubGluZVBvc2l0aW9uaW5nJyxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2FmdGVyV3JpdGUnLFxuICAgICAgZm4oe3N0YXRlfSkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICBpZiAodHJpZWRQbGFjZW1lbnRzLmluZGV4T2Yoc3RhdGUucGxhY2VtZW50KSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRyaWVkUGxhY2VtZW50cyA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBsYWNlbWVudCAhPT0gc3RhdGUucGxhY2VtZW50ICYmXG4gICAgICAgICAgICB0cmllZFBsYWNlbWVudHMuaW5kZXhPZihzdGF0ZS5wbGFjZW1lbnQpID09PSAtMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdHJpZWRQbGFjZW1lbnRzLnB1c2goc3RhdGUucGxhY2VtZW50KTtcbiAgICAgICAgICAgIGluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIHVubmVlZGVkIERPTVJlY3QgcHJvcGVydGllc1xuICAgICAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiAoKSA9PlxuICAgICAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Qoc3RhdGUucGxhY2VtZW50KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBsYWNlbWVudCA9IHN0YXRlLnBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdChwbGFjZW1lbnQ6IFBsYWNlbWVudCk6IFBhcnRpYWw8RE9NUmVjdD4ge1xuICAgICAgcmV0dXJuIGdldElubGluZUJvdW5kaW5nQ2xpZW50UmVjdChcbiAgICAgICAgZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpLFxuICAgICAgICByZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIGFycmF5RnJvbShyZWZlcmVuY2UuZ2V0Q2xpZW50UmVjdHMoKSksXG4gICAgICAgIGN1cnNvclJlY3RJbmRleFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRJbnRlcm5hbFByb3BzKHBhcnRpYWxQcm9wczogUGFydGlhbDxQcm9wcz4pOiB2b2lkIHtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSB0cnVlO1xuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMocGFydGlhbFByb3BzKTtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRNb2RpZmllcigpOiB2b2lkIHtcbiAgICAgIGlmICghaXNJbnRlcm5hbFVwZGF0ZSkge1xuICAgICAgICBzZXRJbnRlcm5hbFByb3BzKGdldFByb3BzKGluc3RhbmNlLnByb3BzLCBtb2RpZmllcikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvbkNyZWF0ZTogYWRkTW9kaWZpZXIsXG4gICAgICBvbkFmdGVyVXBkYXRlOiBhZGRNb2RpZmllcixcbiAgICAgIG9uVHJpZ2dlcihfLCBldmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgIGNvbnN0IHJlY3RzID0gYXJyYXlGcm9tKGluc3RhbmNlLnJlZmVyZW5jZS5nZXRDbGllbnRSZWN0cygpKTtcbiAgICAgICAgICBjb25zdCBjdXJzb3JSZWN0ID0gcmVjdHMuZmluZChcbiAgICAgICAgICAgIChyZWN0KSA9PlxuICAgICAgICAgICAgICByZWN0LmxlZnQgLSAyIDw9IGV2ZW50LmNsaWVudFggJiZcbiAgICAgICAgICAgICAgcmVjdC5yaWdodCArIDIgPj0gZXZlbnQuY2xpZW50WCAmJlxuICAgICAgICAgICAgICByZWN0LnRvcCAtIDIgPD0gZXZlbnQuY2xpZW50WSAmJlxuICAgICAgICAgICAgICByZWN0LmJvdHRvbSArIDIgPj0gZXZlbnQuY2xpZW50WVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSByZWN0cy5pbmRleE9mKGN1cnNvclJlY3QpO1xuICAgICAgICAgIGN1cnNvclJlY3RJbmRleCA9IGluZGV4ID4gLTEgPyBpbmRleCA6IGN1cnNvclJlY3RJbmRleDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uSGlkZGVuKCk6IHZvaWQge1xuICAgICAgICBjdXJzb3JSZWN0SW5kZXggPSAtMTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZVBvc2l0aW9uaW5nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5saW5lQm91bmRpbmdDbGllbnRSZWN0KFxuICBjdXJyZW50QmFzZVBsYWNlbWVudDogQmFzZVBsYWNlbWVudCB8IG51bGwsXG4gIGJvdW5kaW5nUmVjdDogRE9NUmVjdCxcbiAgY2xpZW50UmVjdHM6IERPTVJlY3RbXSxcbiAgY3Vyc29yUmVjdEluZGV4OiBudW1iZXJcbik6IHtcbiAgdG9wOiBudW1iZXI7XG4gIGJvdHRvbTogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG4gIHJpZ2h0OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufSB7XG4gIC8vIE5vdCBhbiBpbmxpbmUgZWxlbWVudCwgb3IgcGxhY2VtZW50IGlzIG5vdCB5ZXQga25vd25cbiAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA8IDIgfHwgY3VycmVudEJhc2VQbGFjZW1lbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gYm91bmRpbmdSZWN0O1xuICB9XG5cbiAgLy8gVGhlcmUgYXJlIHR3byByZWN0cyBhbmQgdGhleSBhcmUgZGlzam9pbmVkXG4gIGlmIChcbiAgICBjbGllbnRSZWN0cy5sZW5ndGggPT09IDIgJiZcbiAgICBjdXJzb3JSZWN0SW5kZXggPj0gMCAmJlxuICAgIGNsaWVudFJlY3RzWzBdLmxlZnQgPiBjbGllbnRSZWN0c1sxXS5yaWdodFxuICApIHtcbiAgICByZXR1cm4gY2xpZW50UmVjdHNbY3Vyc29yUmVjdEluZGV4XSB8fCBib3VuZGluZ1JlY3Q7XG4gIH1cblxuICBzd2l0Y2ggKGN1cnJlbnRCYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICBjb25zdCBmaXJzdFJlY3QgPSBjbGllbnRSZWN0c1swXTtcbiAgICAgIGNvbnN0IGxhc3RSZWN0ID0gY2xpZW50UmVjdHNbY2xpZW50UmVjdHMubGVuZ3RoIC0gMV07XG4gICAgICBjb25zdCBpc1RvcCA9IGN1cnJlbnRCYXNlUGxhY2VtZW50ID09PSAndG9wJztcblxuICAgICAgY29uc3QgdG9wID0gZmlyc3RSZWN0LnRvcDtcbiAgICAgIGNvbnN0IGJvdHRvbSA9IGxhc3RSZWN0LmJvdHRvbTtcbiAgICAgIGNvbnN0IGxlZnQgPSBpc1RvcCA/IGZpcnN0UmVjdC5sZWZ0IDogbGFzdFJlY3QubGVmdDtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gaXNUb3AgPyBmaXJzdFJlY3QucmlnaHQgOiBsYXN0UmVjdC5yaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuXG4gICAgICByZXR1cm4ge3RvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgd2lkdGgsIGhlaWdodH07XG4gICAgfVxuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0Jzoge1xuICAgICAgY29uc3QgbWluTGVmdCA9IE1hdGgubWluKC4uLmNsaWVudFJlY3RzLm1hcCgocmVjdHMpID0+IHJlY3RzLmxlZnQpKTtcbiAgICAgIGNvbnN0IG1heFJpZ2h0ID0gTWF0aC5tYXgoLi4uY2xpZW50UmVjdHMubWFwKChyZWN0cykgPT4gcmVjdHMucmlnaHQpKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVSZWN0cyA9IGNsaWVudFJlY3RzLmZpbHRlcigocmVjdCkgPT5cbiAgICAgICAgY3VycmVudEJhc2VQbGFjZW1lbnQgPT09ICdsZWZ0J1xuICAgICAgICAgID8gcmVjdC5sZWZ0ID09PSBtaW5MZWZ0XG4gICAgICAgICAgOiByZWN0LnJpZ2h0ID09PSBtYXhSaWdodFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdG9wID0gbWVhc3VyZVJlY3RzWzBdLnRvcDtcbiAgICAgIGNvbnN0IGJvdHRvbSA9IG1lYXN1cmVSZWN0c1ttZWFzdXJlUmVjdHMubGVuZ3RoIC0gMV0uYm90dG9tO1xuICAgICAgY29uc3QgbGVmdCA9IG1pbkxlZnQ7XG4gICAgICBjb25zdCByaWdodCA9IG1heFJpZ2h0O1xuICAgICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG5cbiAgICAgIHJldHVybiB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCB3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1ZpcnR1YWxFbGVtZW50fSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5pbXBvcnQge1JlZmVyZW5jZUVsZW1lbnQsIFN0aWNreX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBzdGlja3k6IFN0aWNreSA9IHtcbiAgbmFtZTogJ3N0aWNreScsXG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGZuKGluc3RhbmNlKSB7XG4gICAgY29uc3Qge3JlZmVyZW5jZSwgcG9wcGVyfSA9IGluc3RhbmNlO1xuXG4gICAgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKCk6IFJlZmVyZW5jZUVsZW1lbnQgfCBWaXJ0dWFsRWxlbWVudCB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucG9wcGVySW5zdGFuY2VcbiAgICAgICAgPyBpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZS5zdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2VcbiAgICAgICAgOiByZWZlcmVuY2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hvdWxkQ2hlY2sodmFsdWU6ICdyZWZlcmVuY2UnIHwgJ3BvcHBlcicpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9wcy5zdGlja3kgPT09IHRydWUgfHwgaW5zdGFuY2UucHJvcHMuc3RpY2t5ID09PSB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgcHJldlJlZlJlY3Q6IENsaWVudFJlY3QgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcHJldlBvcFJlY3Q6IENsaWVudFJlY3QgfCBudWxsID0gbnVsbDtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQge1xuICAgICAgY29uc3QgY3VycmVudFJlZlJlY3QgPSBzaG91bGRDaGVjaygncmVmZXJlbmNlJylcbiAgICAgICAgPyBnZXRSZWZlcmVuY2UoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBjdXJyZW50UG9wUmVjdCA9IHNob3VsZENoZWNrKCdwb3BwZXInKVxuICAgICAgICA/IHBvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKGN1cnJlbnRSZWZSZWN0ICYmIGFyZVJlY3RzRGlmZmVyZW50KHByZXZSZWZSZWN0LCBjdXJyZW50UmVmUmVjdCkpIHx8XG4gICAgICAgIChjdXJyZW50UG9wUmVjdCAmJiBhcmVSZWN0c0RpZmZlcmVudChwcmV2UG9wUmVjdCwgY3VycmVudFBvcFJlY3QpKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZSkge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlckluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZSZWZSZWN0ID0gY3VycmVudFJlZlJlY3Q7XG4gICAgICBwcmV2UG9wUmVjdCA9IGN1cnJlbnRQb3BSZWN0O1xuXG4gICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGVQb3NpdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9uTW91bnQoKTogdm9pZCB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5zdGlja3kpIHtcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzdGlja3k7XG5cbmZ1bmN0aW9uIGFyZVJlY3RzRGlmZmVyZW50KFxuICByZWN0QTogQ2xpZW50UmVjdCB8IG51bGwsXG4gIHJlY3RCOiBDbGllbnRSZWN0IHwgbnVsbFxuKTogYm9vbGVhbiB7XG4gIGlmIChyZWN0QSAmJiByZWN0Qikge1xuICAgIHJldHVybiAoXG4gICAgICByZWN0QS50b3AgIT09IHJlY3RCLnRvcCB8fFxuICAgICAgcmVjdEEucmlnaHQgIT09IHJlY3RCLnJpZ2h0IHx8XG4gICAgICByZWN0QS5ib3R0b20gIT09IHJlY3RCLmJvdHRvbSB8fFxuICAgICAgcmVjdEEubGVmdCAhPT0gcmVjdEIubGVmdFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICJpbXBvcnQgdGlwcHkgZnJvbSAnLi4vc3JjJztcbmltcG9ydCB7cmVuZGVyfSBmcm9tICcuLi9zcmMvdGVtcGxhdGUnO1xuXG50aXBweS5zZXREZWZhdWx0UHJvcHMoe3JlbmRlcn0pO1xuXG5leHBvcnQge2RlZmF1bHQsIGhpZGVBbGx9IGZyb20gJy4uL3NyYyc7XG5leHBvcnQge2RlZmF1bHQgYXMgY3JlYXRlU2luZ2xldG9ufSBmcm9tICcuLi9zcmMvYWRkb25zL2NyZWF0ZVNpbmdsZXRvbic7XG5leHBvcnQge2RlZmF1bHQgYXMgZGVsZWdhdGV9IGZyb20gJy4uL3NyYy9hZGRvbnMvZGVsZWdhdGUnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGFuaW1hdGVGaWxsfSBmcm9tICcuLi9zcmMvcGx1Z2lucy9hbmltYXRlRmlsbCc7XG5leHBvcnQge2RlZmF1bHQgYXMgZm9sbG93Q3Vyc29yfSBmcm9tICcuLi9zcmMvcGx1Z2lucy9mb2xsb3dDdXJzb3InO1xuZXhwb3J0IHtkZWZhdWx0IGFzIGlubGluZVBvc2l0aW9uaW5nfSBmcm9tICcuLi9zcmMvcGx1Z2lucy9pbmxpbmVQb3NpdGlvbmluZyc7XG5leHBvcnQge2RlZmF1bHQgYXMgc3RpY2t5fSBmcm9tICcuLi9zcmMvcGx1Z2lucy9zdGlja3knO1xuZXhwb3J0IHtST1VORF9BUlJPVyBhcyByb3VuZEFycm93fSBmcm9tICcuLi9zcmMvY29uc3RhbnRzJztcbiIsICJpbXBvcnQge1BsdWdpbiwgUGx1Z2luS2V5fSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHRpcHB5IGZyb20gJ3RpcHB5LmpzJ1xuaW1wb3J0IHtcbiAgICBFZGl0b3IsIGlzTm9kZVNlbGVjdGlvbiwgaXNUZXh0U2VsZWN0aW9uLCBwb3NUb0RPTVJlY3QsXG59IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuXG5leHBvcnQgY2xhc3MgQnViYmxlTWVudVZpZXcge1xuXG4gICAgc2hvdWxkU2hvdyA9ICh7dmlldywgc3RhdGUsIGZyb20sIHRvfSkgPT4ge1xuICAgICAgICBjb25zdCB7ZG9jLCBzZWxlY3Rpb259ID0gc3RhdGVcbiAgICAgICAgY29uc3Qge2VtcHR5fSA9IHNlbGVjdGlvblxuXG4gICAgICAgIC8vIFNvbWV0aW1lIGNoZWNrIGZvciBgZW1wdHlgIGlzIG5vdCBlbm91Z2guXG4gICAgICAgIC8vIERvdWJsZWNsaWNrIGFuIGVtcHR5IHBhcmFncmFwaCByZXR1cm5zIGEgbm9kZSBzaXplIG9mIDIuXG4gICAgICAgIC8vIFNvIHdlIGNoZWNrIGFsc28gZm9yIGFuIGVtcHR5IHRleHQgc2l6ZS5cbiAgICAgICAgY29uc3QgaXNFbXB0eVRleHRCbG9jayA9ICFkb2MudGV4dEJldHdlZW4oZnJvbSwgdG8pLmxlbmd0aCAmJiBpc1RleHRTZWxlY3Rpb24oc3RhdGUuc2VsZWN0aW9uKVxuXG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgb24gYSBlbGVtZW50IGluc2lkZSB0aGUgYnViYmxlIG1lbnUgdGhlIGVkaXRvciBcImJsdXJcIiBldmVudFxuICAgICAgICAvLyBpcyBjYWxsZWQgYW5kIHRoZSBidWJibGUgbWVudSBpdGVtIGlzIGZvY3Vzc2VkLiBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkXG4gICAgICAgIC8vIGNvbnNpZGVyIHRoZSBtZW51IGFzIHBhcnQgb2YgdGhlIGVkaXRvciBhbmQga2VlcCBzaG93aW5nIHRoZSBtZW51XG4gICAgICAgIGNvbnN0IGlzQ2hpbGRPZk1lbnUgPSB0aGlzLmVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcblxuICAgICAgICBjb25zdCBoYXNFZGl0b3JGb2N1cyA9IHZpZXcuaGFzRm9jdXMoKSB8fCBpc0NoaWxkT2ZNZW51XG5cbiAgICAgICAgcmV0dXJuICEoIWhhc0VkaXRvckZvY3VzIHx8IGVtcHR5IHx8IGlzRW1wdHlUZXh0QmxvY2sgfHwgIXRoaXMuZWRpdG9yLmlzRWRpdGFibGUpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHtlZGl0b3IsIGVsZW1lbnQsIHZpZXcsIHRpcHB5T3B0aW9ucyA9IHt9LCB1cGRhdGVEZWxheSA9IDI1MCwgc2hvdWxkU2hvd30pIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3JcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgICAgIHRoaXMudXBkYXRlRGVsYXkgPSB1cGRhdGVEZWxheVxuXG4gICAgICAgIGlmIChzaG91bGRTaG93KSB7XG4gICAgICAgICAgICB0aGlzLnNob3VsZFNob3cgPSBzaG91bGRTaG93XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5tb3VzZWRvd25IYW5kbGVyLCB7Y2FwdHVyZTogdHJ1ZX0pXG4gICAgICAgIHRoaXMudmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5kcmFnc3RhcnRIYW5kbGVyKVxuICAgICAgICB0aGlzLmVkaXRvci5vbignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JsdXInLCB0aGlzLmJsdXJIYW5kbGVyKVxuICAgICAgICB0aGlzLnRpcHB5T3B0aW9ucyA9IHRpcHB5T3B0aW9uc1xuICAgICAgICAvLyBEZXRhY2hlcyBtZW51IGNvbnRlbnQgZnJvbSBpdHMgY3VycmVudCBwYXJlbnRcbiAgICAgICAgLy8gdGhpcy5lbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbidcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgIH1cblxuICAgIG1vdXNlZG93bkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJldmVudEhpZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgZHJhZ3N0YXJ0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICB9XG5cbiAgICBmb2N1c0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIHdlIHVzZSBgc2V0VGltZW91dGAgdG8gbWFrZSBzdXJlIGBzZWxlY3Rpb25gIGlzIGFscmVhZHkgdXBkYXRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlKHRoaXMuZWRpdG9yLnZpZXcpKVxuICAgIH1cblxuICAgIGJsdXJIYW5kbGVyID0gKHtldmVudH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudEhpZGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmVudEhpZGUgPSBmYWxzZVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudD8ucmVsYXRlZFRhcmdldCAmJiB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZT8uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICB9XG5cbiAgICB0aXBweUJsdXJIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuYmx1ckhhbmRsZXIoe2V2ZW50fSlcbiAgICB9XG5cbiAgICBjcmVhdGVUb29sdGlwKCkge1xuICAgICAgICBjb25zdCB7ZWxlbWVudDogZWRpdG9yRWxlbWVudH0gPSB0aGlzLmVkaXRvci5vcHRpb25zXG4gICAgICAgIGNvbnN0IGVkaXRvcklzQXR0YWNoZWQgPSAhIWVkaXRvckVsZW1lbnQucGFyZW50RWxlbWVudFxuXG4gICAgICAgIGlmICh0aGlzLnRpcHB5IHx8ICFlZGl0b3JJc0F0dGFjaGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGlwcHkgPSB0aXBweShlZGl0b3JFbGVtZW50LCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IG51bGwsXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6ICdtYW51YWwnLFxuICAgICAgICAgICAgcGxhY2VtZW50OiAndG9wJyxcbiAgICAgICAgICAgIGhpZGVPbkNsaWNrOiAndG9nZ2xlJyxcbiAgICAgICAgICAgIC4uLnRoaXMudGlwcHlPcHRpb25zLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIG1heWJlIHdlIGhhdmUgdG8gaGlkZSB0aXBweSBvbiBpdHMgb3duIGJsdXIgZXZlbnQgYXMgd2VsbFxuICAgICAgICBpZiAodGhpcy50aXBweS5wb3BwZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgKHRoaXMudGlwcHkucG9wcGVyLmZpcnN0Q2hpbGQpLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnRpcHB5Qmx1ckhhbmRsZXIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUodmlldywgb2xkU3RhdGUpIHtcbiAgICAgICAgY29uc3Qge3N0YXRlfSA9IHZpZXdcbiAgICAgICAgY29uc3QgaGFzVmFsaWRTZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb24uJGZyb20ucG9zICE9PSBzdGF0ZS5zZWxlY3Rpb24uJHRvLnBvc1xuXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZURlbGF5ID4gMCAmJiBoYXNWYWxpZFNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEZWJvdW5jZWRVcGRhdGUodmlldywgb2xkU3RhdGUpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNoYW5nZWQgPSAhb2xkU3RhdGU/LnNlbGVjdGlvbi5lcSh2aWV3LnN0YXRlLnNlbGVjdGlvbilcbiAgICAgICAgY29uc3QgZG9jQ2hhbmdlZCA9ICFvbGRTdGF0ZT8uZG9jLmVxKHZpZXcuc3RhdGUuZG9jKVxuXG4gICAgICAgIHRoaXMudXBkYXRlSGFuZGxlcih2aWV3LCBzZWxlY3Rpb25DaGFuZ2VkLCBkb2NDaGFuZ2VkLCBvbGRTdGF0ZSlcbiAgICB9XG5cbiAgICBoYW5kbGVEZWJvdW5jZWRVcGRhdGUgPSAodmlldywgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uQ2hhbmdlZCA9ICFvbGRTdGF0ZT8uc2VsZWN0aW9uLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uKVxuICAgICAgICBjb25zdCBkb2NDaGFuZ2VkID0gIW9sZFN0YXRlPy5kb2MuZXEodmlldy5zdGF0ZS5kb2MpXG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb25DaGFuZ2VkICYmICFkb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZURlYm91bmNlVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZURlYm91bmNlVGltZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZURlYm91bmNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhhbmRsZXIodmlldywgc2VsZWN0aW9uQ2hhbmdlZCwgZG9jQ2hhbmdlZCwgb2xkU3RhdGUpXG4gICAgICAgIH0sIHRoaXMudXBkYXRlRGVsYXkpXG4gICAgfVxuXG4gICAgdXBkYXRlSGFuZGxlciA9ICh2aWV3LCBzZWxlY3Rpb25DaGFuZ2VkLCBkb2NDaGFuZ2VkLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB7c3RhdGUsIGNvbXBvc2luZ30gPSB2aWV3XG4gICAgICAgIGNvbnN0IHtzZWxlY3Rpb259ID0gc3RhdGVcblxuICAgICAgICBjb25zdCBpc1NhbWUgPSAhc2VsZWN0aW9uQ2hhbmdlZCAmJiAhZG9jQ2hhbmdlZFxuXG4gICAgICAgIGlmIChjb21wb3NpbmcgfHwgaXNTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcCgpXG5cbiAgICAgICAgLy8gc3VwcG9ydCBmb3IgQ2VsbFNlbGVjdGlvbnNcbiAgICAgICAgY29uc3Qge3Jhbmdlc30gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgZnJvbSA9IE1hdGgubWluKC4uLnJhbmdlcy5tYXAocmFuZ2UgPT4gcmFuZ2UuJGZyb20ucG9zKSlcbiAgICAgICAgY29uc3QgdG8gPSBNYXRoLm1heCguLi5yYW5nZXMubWFwKHJhbmdlID0+IHJhbmdlLiR0by5wb3MpKVxuXG4gICAgICAgIGNvbnN0IHNob3VsZFNob3cgPSB0aGlzLnNob3VsZFNob3c/Lih7XG4gICAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgdmlldyxcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgb2xkU3RhdGUsXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG8sXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFzaG91bGRTaG93KSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uJGFuY2hvci5wb3MgIT09IG9sZFN0YXRlPy5zZWxlY3Rpb24uJGFuY2hvci5wb3MpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKHZpZXcsIHN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGlwcHk/LnNldFByb3BzKHtcbiAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy50aXBweU9wdGlvbnM/LmdldFJlZmVyZW5jZUNsaWVudFJlY3RcbiAgICAgICAgICAgICAgICB8fCAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb2RlU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gdmlldy5ub2RlRE9NKGZyb20pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVWaWV3V3JhcHBlciA9IG5vZGUuZGF0YXNldC5ub2RlVmlld1dyYXBwZXIgPyBub2RlIDogbm9kZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1ub2RlLXZpZXctd3JhcHBlcl0nKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZpZXdXcmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVWaWV3V3JhcHBlci5maXJzdENoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NUb0RPTVJlY3QodmlldywgZnJvbSwgdG8pXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5zaG93KClcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnXG4gICAgICAgIHRoaXMudGlwcHk/LnNob3coKVxuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJ1xuICAgICAgICB0aGlzLnRpcHB5Py5oaWRlKClcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy50aXBweT8ucG9wcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICh0aGlzLnRpcHB5LnBvcHBlci5maXJzdENoaWxkKS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdibHVyJyxcbiAgICAgICAgICAgICAgICB0aGlzLnRpcHB5Qmx1ckhhbmRsZXIsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXBweT8uZGVzdHJveSgpXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm1vdXNlZG93bkhhbmRsZXIsIHtjYXB0dXJlOiB0cnVlfSlcbiAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmRyYWdzdGFydEhhbmRsZXIpXG4gICAgICAgIHRoaXMuZWRpdG9yLm9mZignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub2ZmKCdibHVyJywgdGhpcy5ibHVySGFuZGxlcilcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBCdWJibGVNZW51UGx1Z2luID0gKG9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAgICAgIGtleTogdHlwZW9mIG9wdGlvbnMucGx1Z2luS2V5ID09PSAnc3RyaW5nJyA/IG5ldyBQbHVnaW5LZXkob3B0aW9ucy5wbHVnaW5LZXkpIDogb3B0aW9ucy5wbHVnaW5LZXksXG4gICAgICAgIHZpZXc6IHZpZXcgPT4gbmV3IEJ1YmJsZU1lbnVWaWV3KHt2aWV3LCAuLi5vcHRpb25zfSksXG4gICAgfSlcbn1cbiIsICJpbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCJcblxuaW1wb3J0IHsgQnViYmxlTWVudVBsdWdpbiB9IGZyb20gXCIuLi9wbHVnaW5zL0J1YmJsZU1lbnVQbHVnaW5cIlxuXG5leHBvcnQgY29uc3QgQnViYmxlTWVudSA9IEV4dGVuc2lvbi5jcmVhdGUoe1xuICAgIG5hbWU6IFwiYnViYmxlTWVudVwiLFxuXG4gICAgYWRkT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICB0aXBweU9wdGlvbnM6IHt9LFxuICAgICAgICAgICAgcGx1Z2luS2V5OiBcImJ1YmJsZU1lbnVcIixcbiAgICAgICAgICAgIHVwZGF0ZURlbGF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzaG91bGRTaG93OiBudWxsXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIEJ1YmJsZU1lbnVQbHVnaW4oe1xuICAgICAgICAgICAgICAgIHBsdWdpbktleTogdGhpcy5vcHRpb25zLnBsdWdpbktleSxcbiAgICAgICAgICAgICAgICBlZGl0b3I6IHRoaXMuZWRpdG9yLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMub3B0aW9ucy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczogdGhpcy5vcHRpb25zLnRpcHB5T3B0aW9ucyxcbiAgICAgICAgICAgICAgICB1cGRhdGVEZWxheTogdGhpcy5vcHRpb25zLnVwZGF0ZURlbGF5LFxuICAgICAgICAgICAgICAgIHNob3VsZFNob3c6IHRoaXMub3B0aW9ucy5zaG91bGRTaG93XG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfVxufSkiLCAiaW1wb3J0IHsgRWRpdG9yLCBwb3NUb0RPTVJlY3QgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBQbHVnaW4sIFBsdWdpbktleSB9IGZyb20gJ0B0aXB0YXAvcG0vc3RhdGUnXG5pbXBvcnQgdGlwcHkgZnJvbSAndGlwcHkuanMnXG5cbmV4cG9ydCBjbGFzcyBGbG9hdGluZ01lbnVWaWV3IHtcblxuICAgIHNob3VsZFNob3cgPSAoeyB2aWV3LCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBzdGF0ZVxuICAgICAgICBjb25zdCB7ICRhbmNob3IsIGVtcHR5IH0gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaXNSb290RGVwdGggPSAkYW5jaG9yLmRlcHRoID09PSAxXG4gICAgICAgIGNvbnN0IGlzRW1wdHlUZXh0QmxvY2sgPSAkYW5jaG9yLnBhcmVudC5pc1RleHRibG9jayAmJiAhJGFuY2hvci5wYXJlbnQudHlwZS5zcGVjLmNvZGUgJiYgISRhbmNob3IucGFyZW50LnRleHRDb250ZW50XG5cbiAgICAgICAgcmV0dXJuICEoIXZpZXcuaGFzRm9jdXMoKVxuICAgICAgICAgICAgfHwgIWVtcHR5XG4gICAgICAgICAgICB8fCAhaXNSb290RGVwdGhcbiAgICAgICAgICAgIHx8ICFpc0VtcHR5VGV4dEJsb2NrXG4gICAgICAgICAgICB8fCAhdGhpcy5lZGl0b3IuaXNFZGl0YWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoeyBlZGl0b3IsIGVsZW1lbnQsIHZpZXcsIHRpcHB5T3B0aW9ucyA9IHt9LCBzaG91bGRTaG93IH0pIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3JcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3XG5cbiAgICAgICAgaWYgKHNob3VsZFNob3cpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkU2hvdyA9IHNob3VsZFNob3dcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm1vdXNlZG93bkhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KVxuICAgICAgICB0aGlzLmVkaXRvci5vbignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oJ2JsdXInLCB0aGlzLmJsdXJIYW5kbGVyKVxuICAgICAgICB0aGlzLnRpcHB5T3B0aW9ucyA9IHRpcHB5T3B0aW9uc1xuICAgICAgICAvLyBEZXRhY2hlcyBtZW51IGNvbnRlbnQgZnJvbSBpdHMgY3VycmVudCBwYXJlbnRcbiAgICAgICAgLy8gdGhpcy5lbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbidcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgIH1cblxuICAgIG1vdXNlZG93bkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucHJldmVudEhpZGUgPSB0cnVlXG4gICAgfVxuXG4gICAgZm9jdXNIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAvLyB3ZSB1c2UgYHNldFRpbWVvdXRgIHRvIG1ha2Ugc3VyZSBgc2VsZWN0aW9uYCBpcyBhbHJlYWR5IHVwZGF0ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZSh0aGlzLmVkaXRvci52aWV3KSlcbiAgICB9XG5cbiAgICBibHVySGFuZGxlciA9ICh7IGV2ZW50IH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudEhpZGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmVudEhpZGUgPSBmYWxzZVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudD8ucmVsYXRlZFRhcmdldCAmJiB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZT8uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICB9XG5cbiAgICB0aXBweUJsdXJIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuYmx1ckhhbmRsZXIoeyBldmVudCB9KVxuICAgIH1cblxuICAgIGNyZWF0ZVRvb2x0aXAoKSB7XG4gICAgICAgIGNvbnN0IHsgZWxlbWVudDogZWRpdG9yRWxlbWVudCB9ID0gdGhpcy5lZGl0b3Iub3B0aW9uc1xuICAgICAgICBjb25zdCBlZGl0b3JJc0F0dGFjaGVkID0gISFlZGl0b3JFbGVtZW50LnBhcmVudEVsZW1lbnRcblxuICAgICAgICBpZiAodGhpcy50aXBweSB8fCAhZWRpdG9ySXNBdHRhY2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpcHB5ID0gdGlwcHkoZWRpdG9yRWxlbWVudCwge1xuICAgICAgICAgICAgZHVyYXRpb246IDAsXG4gICAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBudWxsLFxuICAgICAgICAgICAgY29udGVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB0cmlnZ2VyOiAnbWFudWFsJyxcbiAgICAgICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgICAgICAgICAgIGhpZGVPbkNsaWNrOiAndG9nZ2xlJyxcbiAgICAgICAgICAgIC4uLnRoaXMudGlwcHlPcHRpb25zLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIG1heWJlIHdlIGhhdmUgdG8gaGlkZSB0aXBweSBvbiBpdHMgb3duIGJsdXIgZXZlbnQgYXMgd2VsbFxuICAgICAgICBpZiAodGhpcy50aXBweS5wb3BwZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgKHRoaXMudGlwcHkucG9wcGVyLmZpcnN0Q2hpbGQpLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLnRpcHB5Qmx1ckhhbmRsZXIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUodmlldywgb2xkU3RhdGUpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdmlld1xuICAgICAgICBjb25zdCB7IGRvYywgc2VsZWN0aW9uIH0gPSBzdGF0ZVxuICAgICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgY29uc3QgaXNTYW1lID0gb2xkU3RhdGUgJiYgb2xkU3RhdGUuZG9jLmVxKGRvYykgJiYgb2xkU3RhdGUuc2VsZWN0aW9uLmVxKHNlbGVjdGlvbilcblxuICAgICAgICBpZiAoaXNTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcCgpXG5cbiAgICAgICAgY29uc3Qgc2hvdWxkU2hvdyA9IHRoaXMuc2hvdWxkU2hvdz8uKHtcbiAgICAgICAgICAgIGVkaXRvcjogdGhpcy5lZGl0b3IsXG4gICAgICAgICAgICB2aWV3LFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBvbGRTdGF0ZSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIXNob3VsZFNob3cpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpXG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aXBweT8uc2V0UHJvcHMoe1xuICAgICAgICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDpcbiAgICAgICAgICAgICAgICB0aGlzLnRpcHB5T3B0aW9ucz8uZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCB8fCAoKCkgPT4gcG9zVG9ET01SZWN0KHZpZXcsIGZyb20sIHRvKSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5zaG93KClcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnXG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnXG4gICAgICAgIHRoaXMudGlwcHk/LnNob3coKVxuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMudGlwcHk/LmhpZGUoKVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnRpcHB5Py5wb3BwZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgKHRoaXMudGlwcHkucG9wcGVyLmZpcnN0Q2hpbGQpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ2JsdXInLFxuICAgICAgICAgICAgICAgIHRoaXMudGlwcHlCbHVySGFuZGxlcixcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpcHB5Py5kZXN0cm95KClcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2Vkb3duSGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pXG4gICAgICAgIHRoaXMuZWRpdG9yLm9mZignZm9jdXMnLCB0aGlzLmZvY3VzSGFuZGxlcilcbiAgICAgICAgdGhpcy5lZGl0b3Iub2ZmKCdibHVyJywgdGhpcy5ibHVySGFuZGxlcilcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBGbG9hdGluZ01lbnVQbHVnaW4gPSAob3B0aW9ucykgPT4ge1xuICAgIHJldHVybiBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OlxuICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMucGx1Z2luS2V5ID09PSAnc3RyaW5nJyA/IG5ldyBQbHVnaW5LZXkob3B0aW9ucy5wbHVnaW5LZXkpIDogb3B0aW9ucy5wbHVnaW5LZXksXG4gICAgICAgIHZpZXc6IHZpZXcgPT4gbmV3IEZsb2F0aW5nTWVudVZpZXcoeyB2aWV3LCAuLi5vcHRpb25zIH0pLFxuICAgIH0pXG59IiwgImltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuaW1wb3J0IHsgRmxvYXRpbmdNZW51UGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2lucy9GbG9hdGluZ01lbnVQbHVnaW4nXG5cbmV4cG9ydCBjb25zdCBGbG9hdGluZ01lbnUgPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgICBuYW1lOiAnZmxvYXRpbmdNZW51JyxcblxuICAgIGFkZE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgdGlwcHlPcHRpb25zOiB7fSxcbiAgICAgICAgICAgIHBsdWdpbktleTogJ2Zsb2F0aW5nTWVudScsXG4gICAgICAgICAgICBzaG91bGRTaG93OiBudWxsLFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgRmxvYXRpbmdNZW51UGx1Z2luKHtcbiAgICAgICAgICAgICAgICBwbHVnaW5LZXk6IHRoaXMub3B0aW9ucy5wbHVnaW5LZXksXG4gICAgICAgICAgICAgICAgZWRpdG9yOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLm9wdGlvbnMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICB0aXBweU9wdGlvbnM6IHRoaXMub3B0aW9ucy50aXBweU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvdzogdGhpcy5vcHRpb25zLnNob3VsZFNob3csXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgIH0sXG59KSIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlQnVpbGRlckNvbHVtbihjb2xUeXBlLCBjb2xTcGFuLCBjb2xDb250ZW50ID0gbnVsbCkge1xuICBpZiAoY29sQ29udGVudCkge1xuICAgIHJldHVybiBjb2xUeXBlLmNyZWF0ZUNoZWNrZWQoeydkYXRhLWNvbC1zcGFuJzogY29sU3Bhbn0sIGNvbENvbnRlbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNvbFR5cGUuY3JlYXRlQW5kRmlsbCh7J2RhdGEtY29sLXNwYW4nOiBjb2xTcGFufSk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGdldEdyaWRCdWlsZGVyTm9kZVR5cGVzKHNjaGVtYSkge1xuICBpZiAoc2NoZW1hLmNhY2hlZC5ncmlkQnVpbGRlck5vZGVUeXBlcykge1xuICAgIHJldHVybiBzY2hlbWEuY2FjaGVkLmdyaWRCdWlsZGVyTm9kZVR5cGVzO1xuICB9XG5cbiAgY29uc3Qgcm9sZXMgPSB7fTtcblxuICBPYmplY3Qua2V5cyhzY2hlbWEubm9kZXMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBjb25zdCBub2RlVHlwZSA9IHNjaGVtYS5ub2Rlc1t0eXBlXTtcblxuICAgIGlmIChub2RlVHlwZS5zcGVjLmdyaWRCdWlsZGVyUm9sZSkge1xuICAgICAgcm9sZXNbbm9kZVR5cGUuc3BlYy5ncmlkQnVpbGRlclJvbGVdID0gbm9kZVR5cGU7XG4gICAgfVxuICB9KTtcblxuICBzY2hlbWEuY2FjaGVkLmdyaWRCdWlsZGVyTm9kZVR5cGVzID0gcm9sZXM7XG5cbiAgcmV0dXJuIHJvbGVzO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUJ1aWxkZXJDb2x1bW4gfSBmcm9tIFwiLi9jcmVhdGVCdWlsZGVyQ29sdW1uXCI7XG5pbXBvcnQgeyBnZXRHcmlkQnVpbGRlck5vZGVUeXBlcyB9IGZyb20gXCIuL2dldEdyaWRCdWlsZGVyTm9kZVR5cGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHcmlkQnVpbGRlcihzY2hlbWEsIGNvbHNDb3VudCwgdHlwZSwgc3RhY2tBdCwgYXN5bW1ldHJpY0xlZnQsIGFzeW1tZXRyaWNSaWdodCwgY29sQ29udGVudCkge1xuICBjb25zdCB0eXBlcyA9IGdldEdyaWRCdWlsZGVyTm9kZVR5cGVzKHNjaGVtYSk7XG4gIGNvbnN0IGNvbHMgPSBbXTtcblxuICBpZiAodHlwZSA9PT0gJ2FzeW1tZXRyaWMnKSB7XG4gICAgY29scy5wdXNoKGNyZWF0ZUJ1aWxkZXJDb2x1bW4odHlwZXMuYnVpbGRlckNvbHVtbiwgYXN5bW1ldHJpY0xlZnQsIGNvbENvbnRlbnQpKTtcbiAgICBjb2xzLnB1c2goY3JlYXRlQnVpbGRlckNvbHVtbih0eXBlcy5idWlsZGVyQ29sdW1uLCBhc3ltbWV0cmljUmlnaHQsIGNvbENvbnRlbnQpKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29sc0NvdW50OyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjb2wgPSBjcmVhdGVCdWlsZGVyQ29sdW1uKHR5cGVzLmJ1aWxkZXJDb2x1bW4sIG51bGwsIGNvbENvbnRlbnQpO1xuXG4gICAgICBpZiAoY29sKSB7XG4gICAgICAgIGNvbHMucHVzaChjb2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0eXBlcy5ncmlkQnVpbGRlci5jcmVhdGVDaGVja2VkKHsgJ2RhdGEtY29scyc6IGNvbHNDb3VudCwgJ2RhdGEtdHlwZSc6IHR5cGUsICdkYXRhLXN0YWNrLWF0Jzogc3RhY2tBdCB9LCBjb2xzKTtcbn1cbiIsICJpbXBvcnQgeyBjYWxsT3JSZXR1cm4sIGdldEV4dGVuc2lvbkZpZWxkLCBOb2RlLCBtZXJnZUF0dHJpYnV0ZXMsIGZpbmRQYXJlbnROb2RlLCBmaW5kQ2hpbGRyZW4gfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBUZXh0U2VsZWN0aW9uIH0gZnJvbSBcIkB0aXB0YXAvcG0vc3RhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUdyaWRCdWlsZGVyIH0gZnJvbSBcIi4vdXRpbHMvY3JlYXRlR3JpZEJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IEdyaWRCdWlsZGVyID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiBcImdyaWRCdWlsZGVyXCIsXG5cbiAgZ3JvdXA6IFwiYmxvY2tcIixcblxuICBkZWZpbmluZzogdHJ1ZSxcblxuICBpc29sYXRpbmc6IHRydWUsXG5cbiAgYWxsb3dHYXBDdXJzb3I6IGZhbHNlLFxuXG4gIGNvbnRlbnQ6IFwiZ3JpZEJ1aWxkZXJDb2x1bW4rXCIsXG5cbiAgZ3JpZEJ1aWxkZXJSb2xlOiBcImdyaWRCdWlsZGVyXCIsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY2xhc3M6IFwiZmlsYW1lbnQtdGlwdGFwLWdyaWQtYnVpbGRlclwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkYXRhLXR5cGUnOiB7XG4gICAgICAgIGRlZmF1bHQ6IFwicmVzcG9uc2l2ZVwiLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtdHlwZVwiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1jb2xzJzoge1xuICAgICAgICBkZWZhdWx0OiAyLFxuICAgICAgICBwYXJzZUhUTUw6IChlbGVtZW50KSA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY29sc1wiKSxcbiAgICAgIH0sXG4gICAgICAnZGF0YS1zdGFjay1hdCc6IHtcbiAgICAgICAgZGVmYXVsdDogJ21kJyxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXN0YWNrLWF0XCIpLFxuICAgICAgfSxcbiAgICAgICdzdHlsZSc6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgcGFyc2VIVE1MOiAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSxcbiAgICAgICAgcmVuZGVySFRNTDogKGF0dHJpYnV0ZXMpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3R5bGU6IGBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgke2F0dHJpYnV0ZXNbJ2RhdGEtY29scyddfSwgMWZyKTtgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBnZXRBdHRyczogKG5vZGUpID0+IG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmlsYW1lbnQtdGlwdGFwLWdyaWQtYnVpbGRlclwiKSAmJiBudWxsLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcImRpdlwiLCBtZXJnZUF0dHJpYnV0ZXModGhpcy5vcHRpb25zLkhUTUxBdHRyaWJ1dGVzLCBIVE1MQXR0cmlidXRlcyksIDBdO1xuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnNlcnRHcmlkQnVpbGRlcjpcbiAgICAgICAgKHsgY29scyA9IDMsIHR5cGUgPSBcInJlc3BvbnNpdmVcIiwgc3RhY2tBdCwgYXN5bW1ldHJpY0xlZnQgPSBudWxsLCBhc3ltbWV0cmljUmlnaHQgPSBudWxsIH0gPSB7fSkgPT5cbiAgICAgICAgKHsgdHIsIGRpc3BhdGNoLCBlZGl0b3IgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBjcmVhdGVHcmlkQnVpbGRlcihlZGl0b3Iuc2NoZW1hLCBjb2xzLCB0eXBlLCBzdGFja0F0LGFzeW1tZXRyaWNMZWZ0LCBhc3ltbWV0cmljUmlnaHQpO1xuXG4gICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0ci5zZWxlY3Rpb24uYW5jaG9yICsgMTtcblxuICAgICAgICAgICAgdHIucmVwbGFjZVNlbGVjdGlvbldpdGgobm9kZSlcbiAgICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KClcbiAgICAgICAgICAgICAgLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUob2Zmc2V0KSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH07XG4gIH0sXG5cbiAgYWRkS2V5Ym9hcmRTaG9ydGN1dHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiTW9kLUFsdC1HXCI6ICgpID0+IHRoaXMuZWRpdG9yLmNvbW1hbmRzLmluc2VydEdyaWRCdWlsZGVyKCksXG4gICAgfTtcbiAgfSxcblxuICBleHRlbmROb2RlU2NoZW1hKGV4dGVuc2lvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBuYW1lOiBleHRlbnNpb24ubmFtZSxcbiAgICAgIG9wdGlvbnM6IGV4dGVuc2lvbi5vcHRpb25zLFxuICAgICAgc3RvcmFnZTogZXh0ZW5zaW9uLnN0b3JhZ2UsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBncmlkQnVpbGRlclJvbGU6IGNhbGxPclJldHVybihnZXRFeHRlbnNpb25GaWVsZChleHRlbnNpb24sIFwiZ3JpZEJ1aWxkZXJSb2xlXCIsIGNvbnRleHQpKSxcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgTm9kZSwgbWVyZ2VBdHRyaWJ1dGVzIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuXG5leHBvcnQgY29uc3QgR3JpZEJ1aWxkZXJDb2x1bW4gPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6IFwiZ3JpZEJ1aWxkZXJDb2x1bW5cIixcbiAgY29udGVudDogXCJibG9jaytcIixcbiAgZ3JpZEJ1aWxkZXJSb2xlOiBcImJ1aWxkZXJDb2x1bW5cIixcbiAgaXNvbGF0aW5nOiB0cnVlLFxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICBjbGFzczogXCJmaWxhbWVudC10aXB0YXAtZ3JpZC1idWlsZGVyX19jb2x1bW5cIixcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2RhdGEtY29sLXNwYW4nOiB7XG4gICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jb2wtc3BhblwiKSxcbiAgICAgIH0sXG4gICAgICAnc3R5bGUnOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgIHBhcnNlSFRNTDogKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIiksXG4gICAgICAgIHJlbmRlckhUTUw6IChhdHRyaWJ1dGVzKSA9PiB7XG4gICAgICAgICAgbGV0IGNvbHNwYW4gPSBhdHRyaWJ1dGVzWydkYXRhLWNvbC1zcGFuJ107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0eWxlOiBgZ3JpZC1jb2x1bW46IHNwYW4gJHtjb2xzcGFufTtgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgcGFyc2VIVE1MKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRhZzogXCJkaXZcIixcbiAgICAgICAgZ2V0QXR0cnM6IChub2RlKSA9PiBub2RlLmNsYXNzTGlzdC5jb250YWlucyhcImZpbGFtZW50LXRpcHRhcC1ncmlkLWJ1aWxkZXJfX2NvbHVtblwiKSAmJiBudWxsLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXCJkaXZcIiwgbWVyZ2VBdHRyaWJ1dGVzKHRoaXMub3B0aW9ucy5IVE1MQXR0cmlidXRlcywgSFRNTEF0dHJpYnV0ZXMpLCAwXTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJ1xuXG5leHBvcnQgY29uc3QgRHJhZ0FuZERyb3BFeHRlbnNpb24gPSBFeHRlbnNpb24uY3JlYXRlKHtcbiAgICBuYW1lOiAnZHJhZ0FuZERyb3AnLFxuICAgIGFkZFByb3NlTWlycm9yUGx1Z2lucyhibGEpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZURyb3AodmlldywgZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQpIHJldHVybiBmYWxzZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdmlldy5wb3NBdENvb3Jkcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2Jsb2NrJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdnZWQtYmxvY2snLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ2Jsb2NrJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ21lcmdlVGFnJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdnZWQtbWVyZ2UtdGFnJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoJ21lcmdlVGFnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXVxuICAgIH0sXG59KVxuIiwgImltcG9ydCB7bWVyZ2VBdHRyaWJ1dGVzLCBOb2RlfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCJcblxuZXhwb3J0IGNvbnN0IFRpcHRhcEJsb2NrID0gTm9kZS5jcmVhdGUoe1xuICAgIG5hbWU6ICd0aXB0YXBCbG9jaycsXG4gICAgZ3JvdXA6ICdibG9jaycsXG4gICAgYXRvbTogdHJ1ZSxcbiAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICBpc29sYXRpbmc6IHRydWUsXG4gICAgYWxsb3dHYXBDdXJzb3I6IHRydWUsXG4gICAgaW5saW5lOiBmYWxzZSxcbiAgICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJldmlldzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXByZXZpZXcnKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIGF0dHJpYnV0ZXMucHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1wcmV2aWV3JzogYXR0cmlidXRlcy5wcmV2aWV3XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdGVQYXRoOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUtcGF0aCcpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlcy5zdGF0ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtc3RhdGUtcGF0aCc6IGF0dHJpYnV0ZXMuc3RhdGVQYXRoXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVuZGVySFRNTDogYXR0cmlidXRlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIGF0dHJpYnV0ZXMudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS10eXBlJzogYXR0cmlidXRlcy50eXBlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgIHBhcnNlSFRNTDogZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlcy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1sYWJlbCc6IGF0dHJpYnV0ZXMubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0YScpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYXR0cmlidXRlcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhLWRhdGEnOiBKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGVzLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgfSxcbiAgICBwYXJzZUhUTUwoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGFnOiAndGlwdGFwLWJsb2NrJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICAgICAgcmV0dXJuIFsndGlwdGFwLWJsb2NrJywgbWVyZ2VBdHRyaWJ1dGVzKEhUTUxBdHRyaWJ1dGVzKV1cbiAgICB9LFxuICAgIGFkZE5vZGVWaWV3KCkge1xuICAgICAgICByZXR1cm4gKHtub2RlfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnXG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LmFkZCgndGlwdGFwLWJsb2NrLXdyYXBwZXInKVxuXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHR5cGVvZiBub2RlLmF0dHJzLmRhdGEgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShub2RlLmF0dHJzLmRhdGEpXG4gICAgICAgICAgICAgICAgOiBub2RlLmF0dHJzLmRhdGFcblxuICAgICAgICAgICAgZG9tLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHgtZGF0YT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dPcHRpb25zQnV0dG9uOiAke2RhdGEgPT09ICdbXScgPyAnZmFsc2UnIDogJ3RydWUnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5TZXR0aW5ncygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRkaXNwYXRjaCgnb3Blbi1ibG9jay1zZXR0aW5ncycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXFxgJHtub2RlLmF0dHJzLnR5cGV9XFxgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IFxcYCR7bm9kZS5hdHRycy5zdGF0ZVBhdGh9XFxgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAke2RhdGF9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQmxvY2soKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZGlzcGF0Y2goJ2RlbGV0ZS1ibG9jaycpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpcHRhcC1ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWluLWhlaWdodDogM3JlbTtcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpcHRhcC1ibG9jay1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0aXB0YXAtYmxvY2stdGl0bGVcIj4ke25vZGUuYXR0cnMubGFiZWx9PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgeC1zaG93PVwiISBkaXNhYmxlZFwiIGNsYXNzPVwidGlwdGFwLWJsb2NrLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHgtc2hvdz1cInNob3dPcHRpb25zQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIHgtb246Y2xpY2s9XCJvcGVuU2V0dGluZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInctNCBoLTRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTcuODQgMS44MDRBMSAxIDAgMDE4LjgyIDFoMi4zNmExIDEgMCAwMS45OC44MDRsLjMzMSAxLjY1MmE2Ljk5MyA2Ljk5MyAwIDAxMS45MjkgMS4xMTVsMS41OTgtLjU0YTEgMSAwIDAxMS4xODYuNDQ3bDEuMTggMi4wNDRhMSAxIDAgMDEtLjIwNSAxLjI1MWwtMS4yNjcgMS4xMTNhNy4wNDcgNy4wNDcgMCAwMTAgMi4yMjhsMS4yNjcgMS4xMTNhMSAxIDAgMDEuMjA2IDEuMjVsLTEuMTggMi4wNDVhMSAxIDAgMDEtMS4xODcuNDQ3bC0xLjU5OC0uNTRhNi45OTMgNi45OTMgMCAwMS0xLjkyOSAxLjExNWwtLjMzIDEuNjUyYTEgMSAwIDAxLS45OC44MDRIOC44MmExIDEgMCAwMS0uOTgtLjgwNGwtLjMzMS0xLjY1MmE2Ljk5MyA2Ljk5MyAwIDAxLTEuOTI5LTEuMTE1bC0xLjU5OC41NGExIDEgMCAwMS0xLjE4Ni0uNDQ3bC0xLjE4LTIuMDQ0YTEgMSAwIDAxLjIwNS0xLjI1MWwxLjI2Ny0xLjExNGE3LjA1IDcuMDUgMCAwMTAtMi4yMjdMMS44MjEgNy43NzNhMSAxIDAgMDEtLjIwNi0xLjI1bDEuMTgtMi4wNDVhMSAxIDAgMDExLjE4Ny0uNDQ3bDEuNTk4LjU0QTYuOTkzIDYuOTkzIDAgMDE3LjUxIDMuNDU2bC4zMy0xLjY1MnpNMTAgMTNhMyAzIDAgMTAwLTYgMyAzIDAgMDAwIDZ6XCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHgtb246Y2xpY2s9XCJkZWxldGVCbG9jaygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTQgaC00XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04Ljc1IDFBMi43NSAyLjc1IDAgMDA2IDMuNzV2LjQ0M2MtLjc5NS4wNzctMS41ODQuMTc2LTIuMzY1LjI5OGEuNzUuNzUgMCAxMC4yMyAxLjQ4MmwuMTQ5LS4wMjIuODQxIDEwLjUxOEEyLjc1IDIuNzUgMCAwMDcuNTk2IDE5aDQuODA3YTIuNzUgMi43NSAwIDAwMi43NDItMi41M2wuODQxLTEwLjUyLjE0OS4wMjNhLjc1Ljc1IDAgMDAuMjMtMS40ODJBNDEuMDMgNDEuMDMgMCAwMDE0IDQuMTkzVjMuNzVBMi43NSAyLjc1IDAgMDAxMS4yNSAxaC0yLjV6TTEwIDRjLjg0IDAgMS42NzMuMDI1IDIuNS4wNzVWMy43NWMwLS42OS0uNTYtMS4yNS0xLjI1LTEuMjVoLTIuNWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjV2LjMyNUM4LjMyNyA0LjAyNSA5LjE2IDQgMTAgNHpNOC41OCA3LjcyYS43NS43NSAwIDAwLTEuNS4wNmwuMyA3LjVhLjc1Ljc1IDAgMTAxLjUtLjA2bC0uMy03LjV6bTQuMzQuMDZhLjc1Ljc1IDAgMTAtMS41LS4wNmwtLjMgNy41YS43NS43NSAwIDEwMS41LjA2bC4zLTcuNXpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke25vZGUuYXR0cnMucHJldmlld31cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRvbSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgYWRkQ29tbWFuZHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnNlcnRCbG9jazogKGF0dHJpYnV0ZXMpID0+ICh7IGNoYWluLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENoYWluID0gY2hhaW4oKVxuXG4gICAgICAgICAgICAgICAgaWYgKCEgW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYXR0cmlidXRlcy5jb29yZGluYXRlcz8ucG9zKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KHsgZnJvbTogYXR0cmlidXRlcy5jb29yZGluYXRlcy5wb3MsIHRvOiBhdHRyaWJ1dGVzLmNvb3JkaW5hdGVzLnBvcyB9LCB7IHR5cGU6IHRoaXMubmFtZSwgYXR0cnM6IGF0dHJpYnV0ZXMgfSlcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENoYWluLnNldFRleHRTZWxlY3Rpb24oYXR0cmlidXRlcy5jb29yZGluYXRlcy5wb3MpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgICAgICAgICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzZWxlY3Rpb25cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pXG5cbiAgICAgICAgICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdG8ucGFyZW50T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0Q29udGVudEF0KE1hdGgubWF4KCR0by5wb3MgLSAxLCAwKSwgeyB0eXBlOiAncGFyYWdyYXBoJyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnRDb250ZW50QXQoeyBmcm9tOiAkZnJvbS5wb3MsIHRvOiAkdG8ucG9zIH0sIHsgdHlwZTogdGhpcy5uYW1lLCBhdHRyczogYXR0cmlidXRlcyB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENoYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5vZGUoeyB0eXBlOiAncGFyYWdyYXBoJyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnNlcnRDb250ZW50QXQoeyBmcm9tOiAkZnJvbS5wb3MsIHRvOiAkdG8ucG9zIH0sIHsgdHlwZTogdGhpcy5uYW1lLCBhdHRyczogYXR0cmlidXRlcyB9KVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDaGFpbi5zZXRUZXh0U2VsZWN0aW9uKCR0by5wb3MgKyAxKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdG8ucGFyZW50T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KE1hdGgubWF4KCR0by5wb3MgLSAxLCAwKSwgeyB0eXBlOiB0aGlzLm5hbWUsIGF0dHJzOiBhdHRyaWJ1dGVzIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KHsgZnJvbTogcmFuZ2Uuc3RhcnQsIHRvOiByYW5nZS5lbmQgfSwgeyB0eXBlOiB0aGlzLm5hbWUsIGF0dHJzOiBhdHRyaWJ1dGVzIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENoYWluLnNldFRleHRTZWxlY3Rpb24ocmFuZ2UuZW5kKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGVCbG9jazogKGF0dHJpYnV0ZXMpID0+ICh7IGNoYWluLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgICAgICAgICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKVxuXG4gICAgICAgICAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhaW4gPSBjaGFpbigpXG5cbiAgICAgICAgICAgICAgICBjdXJyZW50Q2hhaW4uaW5zZXJ0Q29udGVudEF0KHsgZnJvbTogcmFuZ2Uuc3RhcnQsIHRvOiByYW5nZS5lbmQgfSwgeyB0eXBlOiB0aGlzLm5hbWUsIGF0dHJzOiBhdHRyaWJ1dGVzIH0pXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENoYWluLmZvY3VzKHJhbmdlLmVuZCArIDEpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtb3ZlQmxvY2s6ICgpID0+ICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZHMuZGVsZXRlU2VsZWN0aW9uKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59KVxuIiwgImltcG9ydCB7IGVzY2FwZUZvclJlZ0V4LCBSYW5nZSB9IGZyb20gJ0B0aXB0YXAvY29yZSdcbmltcG9ydCB7IFJlc29sdmVkUG9zIH0gZnJvbSAnQHRpcHRhcC9wbS9tb2RlbCdcblxuZXhwb3J0IGludGVyZmFjZSBUcmlnZ2VyIHtcbiAgY2hhcjogc3RyaW5nXG4gIGFsbG93U3BhY2VzOiBib29sZWFuXG4gIGFsbG93ZWRQcmVmaXhlczogc3RyaW5nW10gfCBudWxsXG4gIHN0YXJ0T2ZMaW5lOiBib29sZWFuXG4gICRwb3NpdGlvbjogUmVzb2x2ZWRQb3Ncbn1cblxuZXhwb3J0IHR5cGUgU3VnZ2VzdGlvbk1hdGNoID0ge1xuICByYW5nZTogUmFuZ2VcbiAgcXVlcnk6IHN0cmluZ1xuICB0ZXh0OiBzdHJpbmdcbn0gfCBudWxsXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU3VnZ2VzdGlvbk1hdGNoKGNvbmZpZzogVHJpZ2dlcik6IFN1Z2dlc3Rpb25NYXRjaCB7XG4gIGNvbnN0IHtcbiAgICBjaGFyLCBhbGxvd1NwYWNlcywgYWxsb3dlZFByZWZpeGVzLCBzdGFydE9mTGluZSwgJHBvc2l0aW9uLFxuICB9ID0gY29uZmlnXG5cbiAgY29uc3QgZXNjYXBlZENoYXIgPSBlc2NhcGVGb3JSZWdFeChjaGFyKVxuICBjb25zdCBzdWZmaXggPSBuZXcgUmVnRXhwKGBcXFxccyR7ZXNjYXBlZENoYXJ9JGApXG4gIGNvbnN0IHByZWZpeCA9IHN0YXJ0T2ZMaW5lID8gJ14nIDogJydcbiAgY29uc3QgcmVnZXhwID0gYWxsb3dTcGFjZXNcbiAgICA/IG5ldyBSZWdFeHAoYCR7cHJlZml4fSR7ZXNjYXBlZENoYXJ9Lio/KD89XFxcXHMke2VzY2FwZWRDaGFyfXwkKWAsICdnbScpXG4gICAgOiBuZXcgUmVnRXhwKGAke3ByZWZpeH0oPzpeKT8ke2VzY2FwZWRDaGFyfVteXFxcXHMke2VzY2FwZWRDaGFyfV0qYCwgJ2dtJylcblxuICBjb25zdCB0ZXh0ID0gJHBvc2l0aW9uLm5vZGVCZWZvcmU/LmlzVGV4dCAmJiAkcG9zaXRpb24ubm9kZUJlZm9yZS50ZXh0XG5cbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHRleHRGcm9tID0gJHBvc2l0aW9uLnBvcyAtIHRleHQubGVuZ3RoXG4gIGNvbnN0IG1hdGNoID0gQXJyYXkuZnJvbSh0ZXh0Lm1hdGNoQWxsKHJlZ2V4cCkpLnBvcCgpXG5cbiAgaWYgKCFtYXRjaCB8fCBtYXRjaC5pbnB1dCA9PT0gdW5kZWZpbmVkIHx8IG1hdGNoLmluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gSmF2YVNjcmlwdCBkb2Vzbid0IGhhdmUgbG9va2JlaGluZHMuIFRoaXMgaGFja3MgYSBjaGVjayB0aGF0IGZpcnN0IGNoYXJhY3RlclxuICAvLyBpcyBhIHNwYWNlIG9yIHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICBjb25zdCBtYXRjaFByZWZpeCA9IG1hdGNoLmlucHV0LnNsaWNlKE1hdGgubWF4KDAsIG1hdGNoLmluZGV4IC0gMSksIG1hdGNoLmluZGV4KVxuICBjb25zdCBtYXRjaFByZWZpeElzQWxsb3dlZCA9IG5ldyBSZWdFeHAoYF5bJHthbGxvd2VkUHJlZml4ZXM/LmpvaW4oJycpfVxcMF0/JGApLnRlc3QobWF0Y2hQcmVmaXgpXG5cbiAgaWYgKGFsbG93ZWRQcmVmaXhlcyAhPT0gbnVsbCAmJiAhbWF0Y2hQcmVmaXhJc0FsbG93ZWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBtYXRjaCBpbiB0aGUgZG9jdW1lbnRcbiAgY29uc3QgZnJvbSA9IHRleHRGcm9tICsgbWF0Y2guaW5kZXhcbiAgbGV0IHRvID0gZnJvbSArIG1hdGNoWzBdLmxlbmd0aFxuXG4gIC8vIEVkZ2UgY2FzZSBoYW5kbGluZzsgaWYgc3BhY2VzIGFyZSBhbGxvd2VkIGFuZCB3ZSdyZSBkaXJlY3RseSBpbiBiZXR3ZWVuXG4gIC8vIHR3byB0cmlnZ2Vyc1xuICBpZiAoYWxsb3dTcGFjZXMgJiYgc3VmZml4LnRlc3QodGV4dC5zbGljZSh0byAtIDEsIHRvICsgMSkpKSB7XG4gICAgbWF0Y2hbMF0gKz0gJyAnXG4gICAgdG8gKz0gMVxuICB9XG5cbiAgLy8gSWYgdGhlICRwb3NpdGlvbiBpcyBsb2NhdGVkIHdpdGhpbiB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcsIHJldHVybiB0aGF0IHJhbmdlXG4gIGlmIChmcm9tIDwgJHBvc2l0aW9uLnBvcyAmJiB0byA+PSAkcG9zaXRpb24ucG9zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJhbmdlOiB7XG4gICAgICAgIGZyb20sXG4gICAgICAgIHRvLFxuICAgICAgfSxcbiAgICAgIHF1ZXJ5OiBtYXRjaFswXS5zbGljZShjaGFyLmxlbmd0aCksXG4gICAgICB0ZXh0OiBtYXRjaFswXSxcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB7IEVkaXRvciwgUmFuZ2UgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSwgUGx1Z2luLCBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCwgRWRpdG9yVmlldyB9IGZyb20gJ0B0aXB0YXAvcG0vdmlldydcblxuaW1wb3J0IHsgZmluZFN1Z2dlc3Rpb25NYXRjaCB9IGZyb20gJy4vZmluZFN1Z2dlc3Rpb25NYXRjaC5qcydcblxuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uT3B0aW9uczxJID0gYW55PiB7XG4gIHBsdWdpbktleT86IFBsdWdpbktleVxuICBlZGl0b3I6IEVkaXRvclxuICBjaGFyPzogc3RyaW5nXG4gIGFsbG93U3BhY2VzPzogYm9vbGVhblxuICBhbGxvd2VkUHJlZml4ZXM/OiBzdHJpbmdbXSB8IG51bGxcbiAgc3RhcnRPZkxpbmU/OiBib29sZWFuXG4gIGRlY29yYXRpb25UYWc/OiBzdHJpbmdcbiAgZGVjb3JhdGlvbkNsYXNzPzogc3RyaW5nXG4gIGNvbW1hbmQ/OiAocHJvcHM6IHsgZWRpdG9yOiBFZGl0b3I7IHJhbmdlOiBSYW5nZTsgcHJvcHM6IEkgfSkgPT4gdm9pZFxuICBpdGVtcz86IChwcm9wczogeyBxdWVyeTogc3RyaW5nOyBlZGl0b3I6IEVkaXRvciB9KSA9PiBJW10gfCBQcm9taXNlPElbXT5cbiAgcmVuZGVyPzogKCkgPT4ge1xuICAgIG9uQmVmb3JlU3RhcnQ/OiAocHJvcHM6IFN1Z2dlc3Rpb25Qcm9wczxJPikgPT4gdm9pZFxuICAgIG9uU3RhcnQ/OiAocHJvcHM6IFN1Z2dlc3Rpb25Qcm9wczxJPikgPT4gdm9pZFxuICAgIG9uQmVmb3JlVXBkYXRlPzogKHByb3BzOiBTdWdnZXN0aW9uUHJvcHM8ST4pID0+IHZvaWRcbiAgICBvblVwZGF0ZT86IChwcm9wczogU3VnZ2VzdGlvblByb3BzPEk+KSA9PiB2b2lkXG4gICAgb25FeGl0PzogKHByb3BzOiBTdWdnZXN0aW9uUHJvcHM8ST4pID0+IHZvaWRcbiAgICBvbktleURvd24/OiAocHJvcHM6IFN1Z2dlc3Rpb25LZXlEb3duUHJvcHMpID0+IGJvb2xlYW5cbiAgfVxuICBhbGxvdz86IChwcm9wczogeyBlZGl0b3I6IEVkaXRvcjsgc3RhdGU6IEVkaXRvclN0YXRlOyByYW5nZTogUmFuZ2UgfSkgPT4gYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1Z2dlc3Rpb25Qcm9wczxJID0gYW55PiB7XG4gIGVkaXRvcjogRWRpdG9yXG4gIHJhbmdlOiBSYW5nZVxuICBxdWVyeTogc3RyaW5nXG4gIHRleHQ6IHN0cmluZ1xuICBpdGVtczogSVtdXG4gIGNvbW1hbmQ6IChwcm9wczogSSkgPT4gdm9pZFxuICBkZWNvcmF0aW9uTm9kZTogRWxlbWVudCB8IG51bGxcbiAgY2xpZW50UmVjdD86ICgoKSA9PiBET01SZWN0IHwgbnVsbCkgfCBudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdGlvbktleURvd25Qcm9wcyB7XG4gIHZpZXc6IEVkaXRvclZpZXdcbiAgZXZlbnQ6IEtleWJvYXJkRXZlbnRcbiAgcmFuZ2U6IFJhbmdlXG59XG5cbmV4cG9ydCBjb25zdCBTdWdnZXN0aW9uUGx1Z2luS2V5ID0gbmV3IFBsdWdpbktleSgnc3VnZ2VzdGlvbicpXG5cbmV4cG9ydCBmdW5jdGlvbiBTdWdnZXN0aW9uPEkgPSBhbnk+KHtcbiAgcGx1Z2luS2V5ID0gU3VnZ2VzdGlvblBsdWdpbktleSxcbiAgZWRpdG9yLFxuICBjaGFyID0gJ0AnLFxuICBhbGxvd1NwYWNlcyA9IGZhbHNlLFxuICBhbGxvd2VkUHJlZml4ZXMgPSBbJyAnXSxcbiAgc3RhcnRPZkxpbmUgPSBmYWxzZSxcbiAgZGVjb3JhdGlvblRhZyA9ICdzcGFuJyxcbiAgZGVjb3JhdGlvbkNsYXNzID0gJ3N1Z2dlc3Rpb24nLFxuICBjb21tYW5kID0gKCkgPT4gbnVsbCxcbiAgaXRlbXMgPSAoKSA9PiBbXSxcbiAgcmVuZGVyID0gKCkgPT4gKHt9KSxcbiAgYWxsb3cgPSAoKSA9PiB0cnVlLFxufTogU3VnZ2VzdGlvbk9wdGlvbnM8ST4pIHtcbiAgbGV0IHByb3BzOiBTdWdnZXN0aW9uUHJvcHM8ST4gfCB1bmRlZmluZWRcbiAgY29uc3QgcmVuZGVyZXIgPSByZW5kZXI/LigpXG5cbiAgY29uc3QgcGx1Z2luOiBQbHVnaW48YW55PiA9IG5ldyBQbHVnaW4oe1xuICAgIGtleTogcGx1Z2luS2V5LFxuXG4gICAgdmlldygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZTogYXN5bmMgKHZpZXcsIHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmtleT8uZ2V0U3RhdGUocHJldlN0YXRlKVxuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmtleT8uZ2V0U3RhdGUodmlldy5zdGF0ZSlcblxuICAgICAgICAgIC8vIFNlZSBob3cgdGhlIHN0YXRlIGNoYW5nZWRcbiAgICAgICAgICBjb25zdCBtb3ZlZCA9IHByZXYuYWN0aXZlICYmIG5leHQuYWN0aXZlICYmIHByZXYucmFuZ2UuZnJvbSAhPT0gbmV4dC5yYW5nZS5mcm9tXG4gICAgICAgICAgY29uc3Qgc3RhcnRlZCA9ICFwcmV2LmFjdGl2ZSAmJiBuZXh0LmFjdGl2ZVxuICAgICAgICAgIGNvbnN0IHN0b3BwZWQgPSBwcmV2LmFjdGl2ZSAmJiAhbmV4dC5hY3RpdmVcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gIXN0YXJ0ZWQgJiYgIXN0b3BwZWQgJiYgcHJldi5xdWVyeSAhPT0gbmV4dC5xdWVyeVxuICAgICAgICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gc3RhcnRlZCB8fCBtb3ZlZFxuICAgICAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IGNoYW5nZWQgJiYgIW1vdmVkXG4gICAgICAgICAgY29uc3QgaGFuZGxlRXhpdCA9IHN0b3BwZWQgfHwgbW92ZWRcblxuICAgICAgICAgIC8vIENhbmNlbCB3aGVuIHN1Z2dlc3Rpb24gaXNuJ3QgYWN0aXZlXG4gICAgICAgICAgaWYgKCFoYW5kbGVTdGFydCAmJiAhaGFuZGxlQ2hhbmdlICYmICFoYW5kbGVFeGl0KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IGhhbmRsZUV4aXQgJiYgIWhhbmRsZVN0YXJ0ID8gcHJldiA6IG5leHRcbiAgICAgICAgICBjb25zdCBkZWNvcmF0aW9uTm9kZSA9IHZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICBgW2RhdGEtZGVjb3JhdGlvbi1pZD1cIiR7c3RhdGUuZGVjb3JhdGlvbklkfVwiXWAsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgcHJvcHMgPSB7XG4gICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICByYW5nZTogc3RhdGUucmFuZ2UsXG4gICAgICAgICAgICBxdWVyeTogc3RhdGUucXVlcnksXG4gICAgICAgICAgICB0ZXh0OiBzdGF0ZS50ZXh0LFxuICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgY29tbWFuZDogY29tbWFuZFByb3BzID0+IHtcbiAgICAgICAgICAgICAgY29tbWFuZCh7XG4gICAgICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBzdGF0ZS5yYW5nZSxcbiAgICAgICAgICAgICAgICBwcm9wczogY29tbWFuZFByb3BzLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlY29yYXRpb25Ob2RlLFxuICAgICAgICAgICAgLy8gdmlydHVhbCBub2RlIGZvciBwb3BwZXIuanMgb3IgdGlwcHkuanNcbiAgICAgICAgICAgIC8vIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIHBvcHVwcyB3aXRob3V0IGEgRE9NIG5vZGVcbiAgICAgICAgICAgIGNsaWVudFJlY3Q6IGRlY29yYXRpb25Ob2RlXG4gICAgICAgICAgICAgID8gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgYGl0ZW1zYCBjYW4gYmUgYXN5bmNocm91bm91cyB3ZeKAmWxsIHNlYXJjaCBmb3IgdGhlIGN1cnJlbnQgZGVjb3JhdGlvbiBub2RlXG4gICAgICAgICAgICAgICAgICBjb25zdCB7IGRlY29yYXRpb25JZCB9ID0gdGhpcy5rZXk/LmdldFN0YXRlKGVkaXRvci5zdGF0ZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZWNvcmF0aW9uTm9kZSA9IHZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgICBgW2RhdGEtZGVjb3JhdGlvbi1pZD1cIiR7ZGVjb3JhdGlvbklkfVwiXWAsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREZWNvcmF0aW9uTm9kZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgfHwgbnVsbFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFuZGxlU3RhcnQpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyPy5vbkJlZm9yZVN0YXJ0Py4ocHJvcHMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhbmRsZUNoYW5nZSkge1xuICAgICAgICAgICAgcmVuZGVyZXI/Lm9uQmVmb3JlVXBkYXRlPy4ocHJvcHMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhbmRsZUNoYW5nZSB8fCBoYW5kbGVTdGFydCkge1xuICAgICAgICAgICAgcHJvcHMuaXRlbXMgPSBhd2FpdCBpdGVtcyh7XG4gICAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgICAgcXVlcnk6IHN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFuZGxlRXhpdCkge1xuICAgICAgICAgICAgcmVuZGVyZXI/Lm9uRXhpdD8uKHByb3BzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYW5kbGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyPy5vblVwZGF0ZT8uKHByb3BzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYW5kbGVTdGFydCkge1xuICAgICAgICAgICAgcmVuZGVyZXI/Lm9uU3RhcnQ/Lihwcm9wcylcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbmRlcmVyPy5vbkV4aXQ/Lihwcm9wcylcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RhdGU6IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbidzIGludGVybmFsIHN0YXRlLlxuICAgICAgaW5pdCgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGU6IHtcbiAgICAgICAgICBhY3RpdmU6IGJvb2xlYW5cbiAgICAgICAgICByYW5nZTogUmFuZ2VcbiAgICAgICAgICBxdWVyeTogbnVsbCB8IHN0cmluZ1xuICAgICAgICAgIHRleHQ6IG51bGwgfCBzdHJpbmdcbiAgICAgICAgICBjb21wb3Npbmc6IGJvb2xlYW5cbiAgICAgICAgICBkZWNvcmF0aW9uSWQ/OiBzdHJpbmcgfCBudWxsXG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICByYW5nZToge1xuICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgIHRvOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcXVlcnk6IG51bGwsXG4gICAgICAgICAgdGV4dDogbnVsbCxcbiAgICAgICAgICBjb21wb3Npbmc6IGZhbHNlLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICB9LFxuXG4gICAgICAvLyBBcHBseSBjaGFuZ2VzIHRvIHRoZSBwbHVnaW4gc3RhdGUgZnJvbSBhIHZpZXcgdHJhbnNhY3Rpb24uXG4gICAgICBhcHBseSh0cmFuc2FjdGlvbiwgcHJldiwgb2xkU3RhdGUsIHN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHsgaXNFZGl0YWJsZSB9ID0gZWRpdG9yXG4gICAgICAgIGNvbnN0IHsgY29tcG9zaW5nIH0gPSBlZGl0b3Iudmlld1xuICAgICAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gdHJhbnNhY3Rpb25cbiAgICAgICAgY29uc3QgeyBlbXB0eSwgZnJvbSB9ID0gc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IG5leHQgPSB7IC4uLnByZXYgfVxuXG4gICAgICAgIG5leHQuY29tcG9zaW5nID0gY29tcG9zaW5nXG5cbiAgICAgICAgLy8gV2UgY2FuIG9ubHkgYmUgc3VnZ2VzdGluZyBpZiB0aGUgdmlldyBpcyBlZGl0YWJsZSwgYW5kOlxuICAgICAgICAvLyAgICogdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBvclxuICAgICAgICAvLyAgICogYSBjb21wb3NpdGlvbiBpcyBhY3RpdmUgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3VlYmVyZG9zaXMvdGlwdGFwL2lzc3Vlcy8xNDQ5KVxuICAgICAgICBpZiAoaXNFZGl0YWJsZSAmJiAoZW1wdHkgfHwgZWRpdG9yLnZpZXcuY29tcG9zaW5nKSkge1xuICAgICAgICAgIC8vIFJlc2V0IGFjdGl2ZSBzdGF0ZSBpZiB3ZSBqdXN0IGxlZnQgdGhlIHByZXZpb3VzIHN1Z2dlc3Rpb24gcmFuZ2VcbiAgICAgICAgICBpZiAoKGZyb20gPCBwcmV2LnJhbmdlLmZyb20gfHwgZnJvbSA+IHByZXYucmFuZ2UudG8pICYmICFjb21wb3NpbmcgJiYgIXByZXYuY29tcG9zaW5nKSB7XG4gICAgICAgICAgICBuZXh0LmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGFnYWluc3Qgd2hlcmUgb3VyIGN1cnNvciBjdXJyZW50bHkgaXNcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IGZpbmRTdWdnZXN0aW9uTWF0Y2goe1xuICAgICAgICAgICAgY2hhcixcbiAgICAgICAgICAgIGFsbG93U3BhY2VzLFxuICAgICAgICAgICAgYWxsb3dlZFByZWZpeGVzLFxuICAgICAgICAgICAgc3RhcnRPZkxpbmUsXG4gICAgICAgICAgICAkcG9zaXRpb246IHNlbGVjdGlvbi4kZnJvbSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGRlY29yYXRpb25JZCA9IGBpZF8ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYpfWBcblxuICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbWF0Y2gsIHVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSB0byBzaG93IGl0XG4gICAgICAgICAgaWYgKG1hdGNoICYmIGFsbG93KHsgZWRpdG9yLCBzdGF0ZSwgcmFuZ2U6IG1hdGNoLnJhbmdlIH0pKSB7XG4gICAgICAgICAgICBuZXh0LmFjdGl2ZSA9IHRydWVcbiAgICAgICAgICAgIG5leHQuZGVjb3JhdGlvbklkID0gcHJldi5kZWNvcmF0aW9uSWQgPyBwcmV2LmRlY29yYXRpb25JZCA6IGRlY29yYXRpb25JZFxuICAgICAgICAgICAgbmV4dC5yYW5nZSA9IG1hdGNoLnJhbmdlXG4gICAgICAgICAgICBuZXh0LnF1ZXJ5ID0gbWF0Y2gucXVlcnlcbiAgICAgICAgICAgIG5leHQudGV4dCA9IG1hdGNoLnRleHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0LmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgdG8gZW1wdHkgdGhlIHJhbmdlIGlmIHN1Z2dlc3Rpb24gaXMgaW5hY3RpdmVcbiAgICAgICAgaWYgKCFuZXh0LmFjdGl2ZSkge1xuICAgICAgICAgIG5leHQuZGVjb3JhdGlvbklkID0gbnVsbFxuICAgICAgICAgIG5leHQucmFuZ2UgPSB7IGZyb206IDAsIHRvOiAwIH1cbiAgICAgICAgICBuZXh0LnF1ZXJ5ID0gbnVsbFxuICAgICAgICAgIG5leHQudGV4dCA9IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBwcm9wczoge1xuICAgICAgLy8gQ2FsbCB0aGUga2V5ZG93biBob29rIGlmIHN1Z2dlc3Rpb24gaXMgYWN0aXZlLlxuICAgICAgaGFuZGxlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgICAgICBjb25zdCB7IGFjdGl2ZSwgcmFuZ2UgfSA9IHBsdWdpbi5nZXRTdGF0ZSh2aWV3LnN0YXRlKVxuXG4gICAgICAgIGlmICghYWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZXI/Lm9uS2V5RG93bj8uKHsgdmlldywgZXZlbnQsIHJhbmdlIH0pIHx8IGZhbHNlXG4gICAgICB9LFxuXG4gICAgICAvLyBTZXR1cCBkZWNvcmF0b3Igb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgc3VnZ2VzdGlvbi5cbiAgICAgIGRlY29yYXRpb25zKHN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHsgYWN0aXZlLCByYW5nZSwgZGVjb3JhdGlvbklkIH0gPSBwbHVnaW4uZ2V0U3RhdGUoc3RhdGUpXG5cbiAgICAgICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuY3JlYXRlKHN0YXRlLmRvYywgW1xuICAgICAgICAgIERlY29yYXRpb24uaW5saW5lKHJhbmdlLmZyb20sIHJhbmdlLnRvLCB7XG4gICAgICAgICAgICBub2RlTmFtZTogZGVjb3JhdGlvblRhZyxcbiAgICAgICAgICAgIGNsYXNzOiBkZWNvcmF0aW9uQ2xhc3MsXG4gICAgICAgICAgICAnZGF0YS1kZWNvcmF0aW9uLWlkJzogZGVjb3JhdGlvbklkLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdKVxuICAgICAgfSxcbiAgICB9LFxuICB9KVxuXG4gIHJldHVybiBwbHVnaW5cbn1cbiIsICJpbXBvcnQgeyBtZXJnZUF0dHJpYnV0ZXMsIE5vZGUgfSBmcm9tICdAdGlwdGFwL2NvcmUnXG5pbXBvcnQgeyBQbHVnaW5LZXkgfSBmcm9tICdAdGlwdGFwL3BtL3N0YXRlJ1xuaW1wb3J0IFN1Z2dlc3Rpb24gZnJvbSAnQHRpcHRhcC9zdWdnZXN0aW9uJ1xuaW1wb3J0IHRpcHB5IGZyb20gXCJ0aXBweS5qc1wiO1xuXG5leHBvcnQgY29uc3QgTWVyZ2VUYWdQbHVnaW5LZXkgPSBuZXcgUGx1Z2luS2V5KCdtZXJnZVRhZycpXG5cbmV4cG9ydCBjb25zdCBNZXJnZVRhZyA9IE5vZGUuY3JlYXRlKHtcbiAgICBuYW1lOiAnbWVyZ2VUYWcnLFxuXG4gICAgZ3JvdXA6ICdpbmxpbmUnLFxuXG4gICAgaW5saW5lOiB0cnVlLFxuXG4gICAgc2VsZWN0YWJsZTogZmFsc2UsXG5cbiAgICBhdG9tOiB0cnVlLFxuXG4gICAgYWRkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSxcbiAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1pZCc6IGF0dHJpYnV0ZXMuaWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhZzogYHNwYW5bZGF0YS10eXBlPScke3RoaXMubmFtZX0nXWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0sXG5cbiAgICByZW5kZXJIVE1MKHsgbm9kZSwgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgICAgbWVyZ2VBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgIHsgJ2RhdGEtdHlwZSc6IHRoaXMubmFtZSB9LFxuICAgICAgICAgICAgICAgIEhUTUxBdHRyaWJ1dGVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYHt7ICR7bm9kZS5hdHRycy5pZH0gfX1gLFxuICAgICAgICBdXG4gICAgfSxcblxuICAgIHJlbmRlclRleHQoeyBub2RlIH0pIHtcbiAgICAgICAgcmV0dXJuIGB7eyAke25vZGUuYXR0cnMuaWR9IH19YFxuICAgIH0sXG5cbiAgICBhZGRLZXlib2FyZFNob3J0Y3V0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEJhY2tzcGFjZTogKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5jb21tYW5kcy5jb21tYW5kKCh7IHRyLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc01lcmdlVGFnID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZW1wdHksIGFuY2hvciB9ID0gc2VsZWN0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGFuY2hvciAtIDEsIGFuY2hvciwgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5uYW1lID09PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01lcmdlVGFnID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLmluc2VydFRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7eycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICsgbm9kZS5ub2RlU2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc01lcmdlVGFnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhZGRDb21tYW5kcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluc2VydE1lcmdlVGFnOiAoYXR0cmlidXRlcykgPT4gKHsgY2hhaW4sIHN0YXRlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhaW4gPSBjaGFpbigpXG5cbiAgICAgICAgICAgICAgICBpZiAoISBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhhdHRyaWJ1dGVzLmNvb3JkaW5hdGVzPy5wb3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaGFpbi5pbnNlcnRDb250ZW50QXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGZyb206IGF0dHJpYnV0ZXMuY29vcmRpbmF0ZXMucG9zLCB0bzogYXR0cmlidXRlcy5jb29yZGluYXRlcy5wb3MgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6IHRoaXMubmFtZSwgYXR0cnM6IHsgaWQ6IGF0dHJpYnV0ZXMudGFnIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICd0ZXh0JywgdGV4dDogJyAnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDaGFpblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgU3VnZ2VzdGlvbih7XG4gICAgICAgICAgICAgICAgZWRpdG9yOiB0aGlzLmVkaXRvcixcbiAgICAgICAgICAgICAgICBjaGFyOiAne3snLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiAoeyBxdWVyeSB9KSA9PiB0aGlzLm9wdGlvbnMubWVyZ2VUYWdzLmZpbHRlcihpdGVtID0+IGl0ZW0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKS5zbGljZSgwLCA1KSxcbiAgICAgICAgICAgICAgICBwbHVnaW5LZXk6IE1lcmdlVGFnUGx1Z2luS2V5LFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICh7IGVkaXRvciwgcmFuZ2UsIHByb3BzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUFmdGVyID0gZWRpdG9yLnZpZXcuc3RhdGUuc2VsZWN0aW9uLiR0by5ub2RlQWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVTcGFjZSA9IG5vZGVBZnRlcj8udGV4dD8uc3RhcnRzV2l0aCgnICcpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlU3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnRvICs9IDFcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNoYWluKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0Q29udGVudEF0KHJhbmdlLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzOiBwcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICcgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJ1bigpXG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpPy5jb2xsYXBzZVRvRW5kKClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFsbG93OiAoeyBzdGF0ZSwgcmFuZ2UgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCAkZnJvbSA9IHN0YXRlLmRvYy5yZXNvbHZlKHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzdGF0ZS5zY2hlbWEubm9kZXNbdGhpcy5uYW1lXVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvdyA9ICEhJGZyb20ucGFyZW50LnR5cGUuY29udGVudE1hdGNoLm1hdGNoVHlwZSh0eXBlKVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVuZGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVwXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQ6IChwcm9wcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuY2xpZW50UmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LWRhdGE9XCJ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogWycke3Byb3BzLml0ZW1zLmpvaW4oJ1xcJywgXFwnJyl9J10sXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4OiAwLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVyZ2UtdGFncy1rZXktZG93bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IHRoaXMub25LZXlEb3duKGV2ZW50LmRldGFpbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucGFyZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lcmdlLXRhZ3MtdXBkYXRlLWl0ZW1zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCkgPT4gKGl0ZW1zID0gZXZlbnQuZGV0YWlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gKCh0aGlzLnNlbGVjdGVkSW5kZXggKyB0aGlzLml0ZW1zLmxlbmd0aCkgLSAxKSAlIHRoaXMuaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9ICh0aGlzLnNlbGVjdGVkSW5kZXggKyAxKSAlIHRoaXMuaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0ZWRJbmRleCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0SXRlbTogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW2luZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsLnBhcmVudEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21lcmdlLXRhZ3Mtc2VsZWN0JywgeyBkZXRhaWw6IHsgaXRlbSB9IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGlwcHktY29udGVudC1wLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgeC1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGl0ZW1zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LXRleHQ9XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC1vbjpjbGljaz1cInNlbGVjdEl0ZW0oaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyAnYmctcHJpbWFyeS01MDAnOiBpbmRleCA9PT0gc2VsZWN0ZWRJbmRleCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayB3LWZ1bGwgdGV4dC1sZWZ0IHJvdW5kZWQgcHgtMiBweS0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWVyZ2UtdGFncy1zZWxlY3QnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuY29tbWFuZCh7IGlkOiBldmVudC5kZXRhaWwuaXRlbSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwID0gdGlwcHkoJ2JvZHknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IHByb3BzLmNsaWVudFJlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAoKSA9PiBkb2N1bWVudC5ib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93SFRNTDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd09uQ3JlYXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbS1zdGFydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZShwcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwWzBdLmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBbMF0uc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdtZXJnZS10YWdzLXVwZGF0ZS1pdGVtcycsIHsgZGV0YWlsOiBwcm9wcy5pdGVtcyB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBvbktleURvd24ocHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21lcmdlLXRhZ3Mta2V5LWRvd24nLCB7IGRldGFpbDogcHJvcHMuZXZlbnQgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgb25FeGl0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwWzBdLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn0pXG4iLCAiaW1wb3J0IHtFeHRlbnNpb259IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGNvbnN0IENsYXNzRXh0ZW5zaW9uID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gICAgbmFtZTogJ2NsYXNzRXh0ZW5zaW9uJyxcblxuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2xpbmsnLFxuICAgICAgICAgICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgICAgICAgICAnbGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAnYnVsbGV0TGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdvcmRlcmVkTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZScsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUhlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZVJvdycsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUNlbGwnLFxuICAgICAgICAgICAgICAgICAgICAndGV4dFN0eWxlJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGF0dHJpYnV0ZXMuY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfVxufSkiLCAiaW1wb3J0IHtFeHRlbnNpb259IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGNvbnN0IElkRXh0ZW5zaW9uID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gICAgbmFtZTogJ2lkRXh0ZW5zaW9uJyxcblxuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAnbGluaycsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VIVE1MOiBlbGVtZW50ID0+IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJIVE1MOiBhdHRyaWJ1dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhdHRyaWJ1dGVzLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgIH1cbn0pXG4iLCAiaW1wb3J0IHtFeHRlbnNpb259IGZyb20gJ0B0aXB0YXAvY29yZSdcblxuZXhwb3J0IGNvbnN0IFN0eWxlRXh0ZW5zaW9uID0gRXh0ZW5zaW9uLmNyZWF0ZSh7XG4gICAgbmFtZTogJ3N0eWxlRXh0ZW5zaW9uJyxcblxuICAgIGFkZEdsb2JhbEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAgICAgICAgICAgICAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2xpbmsnLFxuICAgICAgICAgICAgICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAgICAgICAgICAgICAnbGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAnYnVsbGV0TGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdvcmRlcmVkTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZScsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUhlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZVJvdycsXG4gICAgICAgICAgICAgICAgICAgICd0YWJsZUNlbGwnLFxuICAgICAgICAgICAgICAgICAgICAndGV4dFN0eWxlJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUhUTUw6IGVsZW1lbnQgPT4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckhUTUw6IGF0dHJpYnV0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5zdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IGF0dHJpYnV0ZXMuc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgfVxufSkiLCAiLypcbkxhbmd1YWdlOiBDKytcbkNhdGVnb3J5OiBjb21tb24sIHN5c3RlbVxuV2Vic2l0ZTogaHR0cHM6Ly9pc29jcHAub3JnXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gY1BsdXNQbHVzKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICAvLyBhZGRlZCBmb3IgaGlzdG9yaWMgcmVhc29ucyBiZWNhdXNlIGBobGpzLkNfTElORV9DT01NRU5UX01PREVgIGRvZXNcbiAgLy8gbm90IGluY2x1ZGUgc3VjaCBzdXBwb3J0IG5vciBjYW4gd2UgYmUgc3VyZSBhbGwgdGhlIGdyYW1tYXJzIGRlcGVuZGluZ1xuICAvLyBvbiBpdCB3b3VsZCBkZXNpcmUgdGhpcyBiZWhhdmlvclxuICBjb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gaGxqcy5DT01NRU5UKCcvLycsICckJywgeyBjb250YWluczogWyB7IGJlZ2luOiAvXFxcXFxcbi8gfSBdIH0pO1xuICBjb25zdCBERUNMVFlQRV9BVVRPX1JFID0gJ2RlY2x0eXBlXFxcXChhdXRvXFxcXCknO1xuICBjb25zdCBOQU1FU1BBQ0VfUkUgPSAnW2EtekEtWl9dXFxcXHcqOjonO1xuICBjb25zdCBURU1QTEFURV9BUkdVTUVOVF9SRSA9ICc8W148Pl0rPic7XG4gIGNvbnN0IEZVTkNUSU9OX1RZUEVfUkUgPSAnKD8hc3RydWN0KSgnXG4gICAgKyBERUNMVFlQRV9BVVRPX1JFICsgJ3wnXG4gICAgKyByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpXG4gICAgKyAnW2EtekEtWl9dXFxcXHcqJyArIHJlZ2V4Lm9wdGlvbmFsKFRFTVBMQVRFX0FSR1VNRU5UX1JFKVxuICArICcpJztcblxuICBjb25zdCBDUFBfUFJJTUlUSVZFX1RZUEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgIGJlZ2luOiAnXFxcXGJbYS16XFxcXGRfXSpfdFxcXFxiJ1xuICB9O1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9lc2NhcGVcbiAgLy8gXFxcXCBcXHggXFx4RkYgXFx1MjgzNyBcXHUwMDMyMzc0NyBcXDM3NFxuICBjb25zdCBDSEFSQUNURVJfRVNDQVBFUyA9ICdcXFxcXFxcXCh4WzAtOUEtRmEtZl17Mn18dVswLTlBLUZhLWZdezQsOH18WzAtN117M318XFxcXFMpJztcbiAgY29uc3QgU1RSSU5HUyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnKHU4P3xVfEwpP1wiJyxcbiAgICAgICAgZW5kOiAnXCInLFxuICAgICAgICBpbGxlZ2FsOiAnXFxcXG4nLFxuICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICcodTg/fFV8TCk/XFwnKCcgKyBDSEFSQUNURVJfRVNDQVBFUyArICd8LiknLFxuICAgICAgICBlbmQ6ICdcXCcnLFxuICAgICAgICBpbGxlZ2FsOiAnLidcbiAgICAgIH0sXG4gICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgYmVnaW46IC8oPzp1OD98VXxMKT9SXCIoW14oKVxcXFwgXXswLDE2fSlcXCgvLFxuICAgICAgICBlbmQ6IC9cXCkoW14oKVxcXFwgXXswLDE2fSlcIi9cbiAgICAgIH0pXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IE5VTUJFUlMgPSB7XG4gICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogJ1xcXFxiKDBiWzAxXFwnXSspJyB9LFxuICAgICAgeyBiZWdpbjogJygtPylcXFxcYihbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoKGxsfExMfGx8TCkodXxVKT98KHV8VSkobGx8TEx8bHxMKT98ZnxGfGJ8QiknIH0sXG4gICAgICB7IGJlZ2luOiAnKC0/KShcXFxcYjBbeFhdW2EtZkEtRjAtOVxcJ10rfChcXFxcYltcXFxcZFxcJ10rKFxcXFwuW1xcXFxkXFwnXSopP3xcXFxcLltcXFxcZFxcJ10rKShbZUVdWy0rXT9bXFxcXGRcXCddKyk/KScgfVxuICAgIF0sXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgUFJFUFJPQ0VTU09SID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAvI1xccypbYS16XStcXGIvLFxuICAgIGVuZDogLyQvLFxuICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6XG4gICAgICAgICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSAnXG4gICAgICAgICsgJ3ByYWdtYSBfUHJhZ21hIGlmZGVmIGlmbmRlZiBpbmNsdWRlJyB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxcXFxcbi8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIGhsanMuaW5oZXJpdChTVFJJTkdTLCB7IGNsYXNzTmFtZTogJ3N0cmluZycgfSksXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIGJlZ2luOiAvPC4qPz4vXG4gICAgICB9LFxuICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgVElUTEVfTU9ERSA9IHtcbiAgICBjbGFzc05hbWU6ICd0aXRsZScsXG4gICAgYmVnaW46IHJlZ2V4Lm9wdGlvbmFsKE5BTUVTUEFDRV9SRSkgKyBobGpzLklERU5UX1JFLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX1RJVExFID0gcmVnZXgub3B0aW9uYWwoTkFNRVNQQUNFX1JFKSArIGhsanMuSURFTlRfUkUgKyAnXFxcXHMqXFxcXCgnO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX0tFWVdPUkRTID0gW1xuICAgICdhbGlnbmFzJyxcbiAgICAnYWxpZ25vZicsXG4gICAgJ2FuZCcsXG4gICAgJ2FuZF9lcScsXG4gICAgJ2FzbScsXG4gICAgJ2F0b21pY19jYW5jZWwnLFxuICAgICdhdG9taWNfY29tbWl0JyxcbiAgICAnYXRvbWljX25vZXhjZXB0JyxcbiAgICAnYXV0bycsXG4gICAgJ2JpdGFuZCcsXG4gICAgJ2JpdG9yJyxcbiAgICAnYnJlYWsnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvX2F3YWl0JyxcbiAgICAnY29fcmV0dXJuJyxcbiAgICAnY29feWllbGQnLFxuICAgICdjb21wbCcsXG4gICAgJ2NvbmNlcHQnLFxuICAgICdjb25zdF9jYXN0fDEwJyxcbiAgICAnY29uc3RldmFsJyxcbiAgICAnY29uc3RleHByJyxcbiAgICAnY29uc3Rpbml0JyxcbiAgICAnY29udGludWUnLFxuICAgICdkZWNsdHlwZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdkZWxldGUnLFxuICAgICdkbycsXG4gICAgJ2R5bmFtaWNfY2FzdHwxMCcsXG4gICAgJ2Vsc2UnLFxuICAgICdlbnVtJyxcbiAgICAnZXhwbGljaXQnLFxuICAgICdleHBvcnQnLFxuICAgICdleHRlcm4nLFxuICAgICdmYWxzZScsXG4gICAgJ2ZpbmFsJyxcbiAgICAnZm9yJyxcbiAgICAnZnJpZW5kJyxcbiAgICAnZ290bycsXG4gICAgJ2lmJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW5saW5lJyxcbiAgICAnbW9kdWxlJyxcbiAgICAnbXV0YWJsZScsXG4gICAgJ25hbWVzcGFjZScsXG4gICAgJ25ldycsXG4gICAgJ25vZXhjZXB0JyxcbiAgICAnbm90JyxcbiAgICAnbm90X2VxJyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ29wZXJhdG9yJyxcbiAgICAnb3InLFxuICAgICdvcl9lcScsXG4gICAgJ292ZXJyaWRlJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3JlZmxleHByJyxcbiAgICAncmVnaXN0ZXInLFxuICAgICdyZWludGVycHJldF9jYXN0fDEwJyxcbiAgICAncmVxdWlyZXMnLFxuICAgICdyZXR1cm4nLFxuICAgICdzaXplb2YnLFxuICAgICdzdGF0aWNfYXNzZXJ0JyxcbiAgICAnc3RhdGljX2Nhc3R8MTAnLFxuICAgICdzdHJ1Y3QnLFxuICAgICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLFxuICAgICd0ZW1wbGF0ZScsXG4gICAgJ3RoaXMnLFxuICAgICd0aHJlYWRfbG9jYWwnLFxuICAgICd0aHJvdycsXG4gICAgJ3RyYW5zYWN0aW9uX3NhZmUnLFxuICAgICd0cmFuc2FjdGlvbl9zYWZlX2R5bmFtaWMnLFxuICAgICd0cnVlJyxcbiAgICAndHJ5JyxcbiAgICAndHlwZWRlZicsXG4gICAgJ3R5cGVpZCcsXG4gICAgJ3R5cGVuYW1lJyxcbiAgICAndW5pb24nLFxuICAgICd1c2luZycsXG4gICAgJ3ZpcnR1YWwnLFxuICAgICd2b2xhdGlsZScsXG4gICAgJ3doaWxlJyxcbiAgICAneG9yJyxcbiAgICAneG9yX2VxJ1xuICBdO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX1RZUEVTID0gW1xuICAgICdib29sJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXIxNl90JyxcbiAgICAnY2hhcjMyX3QnLFxuICAgICdjaGFyOF90JyxcbiAgICAnZG91YmxlJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdsb25nJyxcbiAgICAnc2hvcnQnLFxuICAgICd2b2lkJyxcbiAgICAnd2NoYXJfdCcsXG4gICAgJ3Vuc2lnbmVkJyxcbiAgICAnc2lnbmVkJyxcbiAgICAnY29uc3QnLFxuICAgICdzdGF0aWMnXG4gIF07XG5cbiAgY29uc3QgVFlQRV9ISU5UUyA9IFtcbiAgICAnYW55JyxcbiAgICAnYXV0b19wdHInLFxuICAgICdiYXJyaWVyJyxcbiAgICAnYmluYXJ5X3NlbWFwaG9yZScsXG4gICAgJ2JpdHNldCcsXG4gICAgJ2NvbXBsZXgnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGUnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGVfYW55JyxcbiAgICAnY291bnRpbmdfc2VtYXBob3JlJyxcbiAgICAnZGVxdWUnLFxuICAgICdmYWxzZV90eXBlJyxcbiAgICAnZnV0dXJlJyxcbiAgICAnaW1hZ2luYXJ5JyxcbiAgICAnaW5pdGlhbGl6ZXJfbGlzdCcsXG4gICAgJ2lzdHJpbmdzdHJlYW0nLFxuICAgICdqdGhyZWFkJyxcbiAgICAnbGF0Y2gnLFxuICAgICdsb2NrX2d1YXJkJyxcbiAgICAnbXVsdGltYXAnLFxuICAgICdtdWx0aXNldCcsXG4gICAgJ211dGV4JyxcbiAgICAnb3B0aW9uYWwnLFxuICAgICdvc3RyaW5nc3RyZWFtJyxcbiAgICAncGFja2FnZWRfdGFzaycsXG4gICAgJ3BhaXInLFxuICAgICdwcm9taXNlJyxcbiAgICAncHJpb3JpdHlfcXVldWUnLFxuICAgICdxdWV1ZScsXG4gICAgJ3JlY3Vyc2l2ZV9tdXRleCcsXG4gICAgJ3JlY3Vyc2l2ZV90aW1lZF9tdXRleCcsXG4gICAgJ3Njb3BlZF9sb2NrJyxcbiAgICAnc2V0JyxcbiAgICAnc2hhcmVkX2Z1dHVyZScsXG4gICAgJ3NoYXJlZF9sb2NrJyxcbiAgICAnc2hhcmVkX211dGV4JyxcbiAgICAnc2hhcmVkX3RpbWVkX211dGV4JyxcbiAgICAnc2hhcmVkX3B0cicsXG4gICAgJ3N0YWNrJyxcbiAgICAnc3RyaW5nX3ZpZXcnLFxuICAgICdzdHJpbmdzdHJlYW0nLFxuICAgICd0aW1lZF9tdXRleCcsXG4gICAgJ3RocmVhZCcsXG4gICAgJ3RydWVfdHlwZScsXG4gICAgJ3R1cGxlJyxcbiAgICAndW5pcXVlX2xvY2snLFxuICAgICd1bmlxdWVfcHRyJyxcbiAgICAndW5vcmRlcmVkX21hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aW1hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aXNldCcsXG4gICAgJ3Vub3JkZXJlZF9zZXQnLFxuICAgICd2YXJpYW50JyxcbiAgICAndmVjdG9yJyxcbiAgICAnd2Vha19wdHInLFxuICAgICd3c3RyaW5nJyxcbiAgICAnd3N0cmluZ192aWV3J1xuICBdO1xuXG4gIGNvbnN0IEZVTkNUSU9OX0hJTlRTID0gW1xuICAgICdhYm9ydCcsXG4gICAgJ2FicycsXG4gICAgJ2Fjb3MnLFxuICAgICdhcHBseScsXG4gICAgJ2FzX2NvbnN0JyxcbiAgICAnYXNpbicsXG4gICAgJ2F0YW4nLFxuICAgICdhdGFuMicsXG4gICAgJ2NhbGxvYycsXG4gICAgJ2NlaWwnLFxuICAgICdjZXJyJyxcbiAgICAnY2luJyxcbiAgICAnY2xvZycsXG4gICAgJ2NvcycsXG4gICAgJ2Nvc2gnLFxuICAgICdjb3V0JyxcbiAgICAnZGVjbHZhbCcsXG4gICAgJ2VuZGwnLFxuICAgICdleGNoYW5nZScsXG4gICAgJ2V4aXQnLFxuICAgICdleHAnLFxuICAgICdmYWJzJyxcbiAgICAnZmxvb3InLFxuICAgICdmbW9kJyxcbiAgICAnZm9yd2FyZCcsXG4gICAgJ2ZwcmludGYnLFxuICAgICdmcHV0cycsXG4gICAgJ2ZyZWUnLFxuICAgICdmcmV4cCcsXG4gICAgJ2ZzY2FuZicsXG4gICAgJ2Z1dHVyZScsXG4gICAgJ2ludm9rZScsXG4gICAgJ2lzYWxudW0nLFxuICAgICdpc2FscGhhJyxcbiAgICAnaXNjbnRybCcsXG4gICAgJ2lzZGlnaXQnLFxuICAgICdpc2dyYXBoJyxcbiAgICAnaXNsb3dlcicsXG4gICAgJ2lzcHJpbnQnLFxuICAgICdpc3B1bmN0JyxcbiAgICAnaXNzcGFjZScsXG4gICAgJ2lzdXBwZXInLFxuICAgICdpc3hkaWdpdCcsXG4gICAgJ2xhYnMnLFxuICAgICdsYXVuZGVyJyxcbiAgICAnbGRleHAnLFxuICAgICdsb2cnLFxuICAgICdsb2cxMCcsXG4gICAgJ21ha2VfcGFpcicsXG4gICAgJ21ha2Vfc2hhcmVkJyxcbiAgICAnbWFrZV9zaGFyZWRfZm9yX292ZXJ3cml0ZScsXG4gICAgJ21ha2VfdHVwbGUnLFxuICAgICdtYWtlX3VuaXF1ZScsXG4gICAgJ21hbGxvYycsXG4gICAgJ21lbWNocicsXG4gICAgJ21lbWNtcCcsXG4gICAgJ21lbWNweScsXG4gICAgJ21lbXNldCcsXG4gICAgJ21vZGYnLFxuICAgICdtb3ZlJyxcbiAgICAncG93JyxcbiAgICAncHJpbnRmJyxcbiAgICAncHV0Y2hhcicsXG4gICAgJ3B1dHMnLFxuICAgICdyZWFsbG9jJyxcbiAgICAnc2NhbmYnLFxuICAgICdzaW4nLFxuICAgICdzaW5oJyxcbiAgICAnc25wcmludGYnLFxuICAgICdzcHJpbnRmJyxcbiAgICAnc3FydCcsXG4gICAgJ3NzY2FuZicsXG4gICAgJ3N0ZCcsXG4gICAgJ3N0ZGVycicsXG4gICAgJ3N0ZGluJyxcbiAgICAnc3Rkb3V0JyxcbiAgICAnc3RyY2F0JyxcbiAgICAnc3RyY2hyJyxcbiAgICAnc3RyY21wJyxcbiAgICAnc3RyY3B5JyxcbiAgICAnc3RyY3NwbicsXG4gICAgJ3N0cmxlbicsXG4gICAgJ3N0cm5jYXQnLFxuICAgICdzdHJuY21wJyxcbiAgICAnc3RybmNweScsXG4gICAgJ3N0cnBicmsnLFxuICAgICdzdHJyY2hyJyxcbiAgICAnc3Ryc3BuJyxcbiAgICAnc3Ryc3RyJyxcbiAgICAnc3dhcCcsXG4gICAgJ3RhbicsXG4gICAgJ3RhbmgnLFxuICAgICd0ZXJtaW5hdGUnLFxuICAgICd0b191bmRlcmx5aW5nJyxcbiAgICAndG9sb3dlcicsXG4gICAgJ3RvdXBwZXInLFxuICAgICd2ZnByaW50ZicsXG4gICAgJ3Zpc2l0JyxcbiAgICAndnByaW50ZicsXG4gICAgJ3ZzcHJpbnRmJ1xuICBdO1xuXG4gIGNvbnN0IExJVEVSQUxTID0gW1xuICAgICdOVUxMJyxcbiAgICAnZmFsc2UnLFxuICAgICdudWxsb3B0JyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ3RydWUnXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2tleXdvcmRcbiAgY29uc3QgQlVJTFRfSU4gPSBbICdfUHJhZ21hJyBdO1xuXG4gIGNvbnN0IENQUF9LRVlXT1JEUyA9IHtcbiAgICB0eXBlOiBSRVNFUlZFRF9UWVBFUyxcbiAgICBrZXl3b3JkOiBSRVNFUlZFRF9LRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU4sXG4gICAgX3R5cGVfaGludHM6IFRZUEVfSElOVFNcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ESVNQQVRDSCA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbi5kaXNwYXRjaCcsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAvLyBPbmx5IGZvciByZWxldmFuY2UsIG5vdCBoaWdobGlnaHRpbmcuXG4gICAgICBfaGludDogRlVOQ1RJT05fSElOVFMgfSxcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1xcYi8sXG4gICAgICAvKD8hZGVjbHR5cGUpLyxcbiAgICAgIC8oPyFpZikvLFxuICAgICAgLyg/IWZvcikvLFxuICAgICAgLyg/IXN3aXRjaCkvLFxuICAgICAgLyg/IXdoaWxlKS8sXG4gICAgICBobGpzLklERU5UX1JFLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC8oPFtePD5dKz58KVxccypcXCgvKSlcbiAgfTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRBSU5TID0gW1xuICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgIFBSRVBST0NFU1NPUixcbiAgICBDUFBfUFJJTUlUSVZFX1RZUEVTLFxuICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBOVU1CRVJTLFxuICAgIFNUUklOR1NcbiAgXTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRFWFQgPSB7XG4gICAgLy8gVGhpcyBtb2RlIGNvdmVycyBleHByZXNzaW9uIGNvbnRleHQgd2hlcmUgd2UgY2FuJ3QgZXhwZWN0IGEgZnVuY3Rpb25cbiAgICAvLyBkZWZpbml0aW9uIGFuZCBzaG91bGRuJ3QgaGlnaGxpZ2h0IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBvbmU6XG4gICAgLy8gYHJldHVybiBzb21lKClgLCBgZWxzZSBpZigpYCwgYCh4KnN1bSgxLCAyKSlgXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC89LyxcbiAgICAgICAgZW5kOiAvOy9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25ldyB0aHJvdyByZXR1cm4gZWxzZScsXG4gICAgICAgIGVuZDogLzsvXG4gICAgICB9XG4gICAgXSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBFWFBSRVNTSU9OX0NPTlRBSU5TLmNvbmNhdChbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IEVYUFJFU1NJT05fQ09OVEFJTlMuY29uY2F0KFsgJ3NlbGYnIF0pLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdKSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgYmVnaW46ICcoJyArIEZVTkNUSU9OX1RZUEVfUkUgKyAnW1xcXFwqJlxcXFxzXSspKycgKyBGVU5DVElPTl9USVRMRSxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBlbmQ6IC9bezs9XS8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC9bXlxcd1xcc1xcKiY6PD4uXS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgICBiZWdpbjogREVDTFRZUEVfQVVUT19SRSxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogRlVOQ1RJT05fVElUTEUsXG4gICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICBjb250YWluczogWyBUSVRMRV9NT0RFIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIGxvb2stYmVoaW5kIG9uIHRoZSBiZWxvdyBydWxlXG4gICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZ3JhYmJpbmcgdGhlIGZpbmFsIDogaW4gYSA6OiBwYWlyXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOjovLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICAvLyBpbml0aWFsaXplcnNcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC86LyxcbiAgICAgICAgZW5kc1dpdGhQYXJlbnQ6IHRydWUsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICBOVU1CRVJTXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAvLyBhbGxvdyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLCBlLmcuOlxuICAgICAgLy8gZXh0ZXJuIHZvaWQgZihpbnQpLCBnKGNoYXIpO1xuICAgICAge1xuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIG1hdGNoOiAvLC9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBTVFJJTkdTLFxuICAgICAgICAgIE5VTUJFUlMsXG4gICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFUyxcbiAgICAgICAgICAvLyBDb3VudCBtYXRjaGluZyBwYXJlbnRoZXNlcy5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgICdzZWxmJyxcbiAgICAgICAgICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICAgICAgTlVNQkVSUyxcbiAgICAgICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFU1xuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIENQUF9QUklNSVRJVkVfVFlQRVMsXG4gICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIFBSRVBST0NFU1NPUlxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdDKysnLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdjYycsXG4gICAgICAnYysrJyxcbiAgICAgICdoKysnLFxuICAgICAgJ2hwcCcsXG4gICAgICAnaGgnLFxuICAgICAgJ2h4eCcsXG4gICAgICAnY3h4J1xuICAgIF0sXG4gICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNsYXNzTmFtZUFsaWFzZXM6IHsgJ2Z1bmN0aW9uLmRpc3BhdGNoJzogJ2J1aWx0X2luJyB9LFxuICAgIGNvbnRhaW5zOiBbXS5jb25jYXQoXG4gICAgICBFWFBSRVNTSU9OX0NPTlRFWFQsXG4gICAgICBGVU5DVElPTl9ERUNMQVJBVElPTixcbiAgICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgICAgRVhQUkVTU0lPTl9DT05UQUlOUyxcbiAgICAgIFtcbiAgICAgICAgUFJFUFJPQ0VTU09SLFxuICAgICAgICB7IC8vIGNvbnRhaW5lcnM6IGllLCBgdmVjdG9yIDxpbnQ+IHJvb21zICg5KTtgXG4gICAgICAgICAgYmVnaW46ICdcXFxcYihkZXF1ZXxsaXN0fHF1ZXVlfHByaW9yaXR5X3F1ZXVlfHBhaXJ8c3RhY2t8dmVjdG9yfG1hcHxzZXR8Yml0c2V0fG11bHRpc2V0fG11bHRpbWFwfHVub3JkZXJlZF9tYXB8dW5vcmRlcmVkX3NldHx1bm9yZGVyZWRfbXVsdGlzZXR8dW5vcmRlcmVkX211bHRpbWFwfGFycmF5fHR1cGxlfG9wdGlvbmFsfHZhcmlhbnR8ZnVuY3Rpb24pXFxcXHMqPCg/ITwpJyxcbiAgICAgICAgICBlbmQ6ICc+JyxcbiAgICAgICAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgICBDUFBfUFJJTUlUSVZFX1RZUEVTXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46IGhsanMuSURFTlRfUkUgKyAnOjonLFxuICAgICAgICAgIGtleXdvcmRzOiBDUFBfS0VZV09SRFNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgICAvLyBleHRyYSBjb21wbGV4aXR5IHRvIGRlYWwgd2l0aCBgZW51bSBjbGFzc2AgYW5kIGBlbnVtIHN0cnVjdGBcbiAgICAgICAgICAgIC9cXGIoPzplbnVtKD86XFxzKyg/OmNsYXNzfHN0cnVjdCkpP3xjbGFzc3xzdHJ1Y3R8dW5pb24pLyxcbiAgICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICAgIC9cXHcrL1xuICAgICAgICAgIF0sXG4gICAgICAgICAgY2xhc3NOYW1lOiB7XG4gICAgICAgICAgICAxOiAna2V5d29yZCcsXG4gICAgICAgICAgICAzOiAndGl0bGUuY2xhc3MnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdKVxuICB9O1xufVxuXG4vKlxuTGFuZ3VhZ2U6IEFyZHVpbm9cbkF1dGhvcjogU3RlZmFuaWEgTWVsbGFpIDxzLm1lbGxhaUBhcmR1aW5vLmNjPlxuRGVzY3JpcHRpb246IFRoZSBBcmR1aW5vXHUwMEFFIExhbmd1YWdlIGlzIGEgc3VwZXJzZXQgb2YgQysrLiBUaGlzIHJ1bGVzIGFyZSBkZXNpZ25lZCB0byBoaWdobGlnaHQgdGhlIEFyZHVpbm9cdTAwQUUgc291cmNlIGNvZGUuIEZvciBpbmZvIGFib3V0IGxhbmd1YWdlIHNlZSBodHRwOi8vd3d3LmFyZHVpbm8uY2MuXG5XZWJzaXRlOiBodHRwczovL3d3dy5hcmR1aW5vLmNjXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gYXJkdWlubyhobGpzKSB7XG4gIGNvbnN0IEFSRFVJTk9fS1cgPSB7XG4gICAgdHlwZTogW1xuICAgICAgXCJib29sZWFuXCIsXG4gICAgICBcImJ5dGVcIixcbiAgICAgIFwid29yZFwiLFxuICAgICAgXCJTdHJpbmdcIlxuICAgIF0sXG4gICAgYnVpbHRfaW46IFtcbiAgICAgIFwiS2V5Ym9hcmRDb250cm9sbGVyXCIsXG4gICAgICBcIk1vdXNlQ29udHJvbGxlclwiLFxuICAgICAgXCJTb2Z0d2FyZVNlcmlhbFwiLFxuICAgICAgXCJFdGhlcm5ldFNlcnZlclwiLFxuICAgICAgXCJFdGhlcm5ldENsaWVudFwiLFxuICAgICAgXCJMaXF1aWRDcnlzdGFsXCIsXG4gICAgICBcIlJvYm90Q29udHJvbFwiLFxuICAgICAgXCJHU01Wb2ljZUNhbGxcIixcbiAgICAgIFwiRXRoZXJuZXRVRFBcIixcbiAgICAgIFwiRXNwbG9yYVRGVFwiLFxuICAgICAgXCJIdHRwQ2xpZW50XCIsXG4gICAgICBcIlJvYm90TW90b3JcIixcbiAgICAgIFwiV2lGaUNsaWVudFwiLFxuICAgICAgXCJHU01TY2FubmVyXCIsXG4gICAgICBcIkZpbGVTeXN0ZW1cIixcbiAgICAgIFwiU2NoZWR1bGVyXCIsXG4gICAgICBcIkdTTVNlcnZlclwiLFxuICAgICAgXCJZdW5DbGllbnRcIixcbiAgICAgIFwiWXVuU2VydmVyXCIsXG4gICAgICBcIklQQWRkcmVzc1wiLFxuICAgICAgXCJHU01DbGllbnRcIixcbiAgICAgIFwiR1NNTW9kZW1cIixcbiAgICAgIFwiS2V5Ym9hcmRcIixcbiAgICAgIFwiRXRoZXJuZXRcIixcbiAgICAgIFwiQ29uc29sZVwiLFxuICAgICAgXCJHU01CYW5kXCIsXG4gICAgICBcIkVzcGxvcmFcIixcbiAgICAgIFwiU3RlcHBlclwiLFxuICAgICAgXCJQcm9jZXNzXCIsXG4gICAgICBcIldpRmlVRFBcIixcbiAgICAgIFwiR1NNX1NNU1wiLFxuICAgICAgXCJNYWlsYm94XCIsXG4gICAgICBcIlVTQkhvc3RcIixcbiAgICAgIFwiRmlybWF0YVwiLFxuICAgICAgXCJQSW1hZ2VcIixcbiAgICAgIFwiQ2xpZW50XCIsXG4gICAgICBcIlNlcnZlclwiLFxuICAgICAgXCJHU01QSU5cIixcbiAgICAgIFwiRmlsZUlPXCIsXG4gICAgICBcIkJyaWRnZVwiLFxuICAgICAgXCJTZXJpYWxcIixcbiAgICAgIFwiRUVQUk9NXCIsXG4gICAgICBcIlN0cmVhbVwiLFxuICAgICAgXCJNb3VzZVwiLFxuICAgICAgXCJBdWRpb1wiLFxuICAgICAgXCJTZXJ2b1wiLFxuICAgICAgXCJGaWxlXCIsXG4gICAgICBcIlRhc2tcIixcbiAgICAgIFwiR1BSU1wiLFxuICAgICAgXCJXaUZpXCIsXG4gICAgICBcIldpcmVcIixcbiAgICAgIFwiVEZUXCIsXG4gICAgICBcIkdTTVwiLFxuICAgICAgXCJTUElcIixcbiAgICAgIFwiU0RcIlxuICAgIF0sXG4gICAgX2hpbnRzOiBbXG4gICAgICBcInNldHVwXCIsXG4gICAgICBcImxvb3BcIixcbiAgICAgIFwicnVuU2hlbGxDb21tYW5kQXN5bmNocm9ub3VzbHlcIixcbiAgICAgIFwiYW5hbG9nV3JpdGVSZXNvbHV0aW9uXCIsXG4gICAgICBcInJldHJpZXZlQ2FsbGluZ051bWJlclwiLFxuICAgICAgXCJwcmludEZpcm13YXJlVmVyc2lvblwiLFxuICAgICAgXCJhbmFsb2dSZWFkUmVzb2x1dGlvblwiLFxuICAgICAgXCJzZW5kRGlnaXRhbFBvcnRQYWlyXCIsXG4gICAgICBcIm5vTGlzdGVuT25Mb2NhbGhvc3RcIixcbiAgICAgIFwicmVhZEpveXN0aWNrQnV0dG9uXCIsXG4gICAgICBcInNldEZpcm13YXJlVmVyc2lvblwiLFxuICAgICAgXCJyZWFkSm95c3RpY2tTd2l0Y2hcIixcbiAgICAgIFwic2Nyb2xsRGlzcGxheVJpZ2h0XCIsXG4gICAgICBcImdldFZvaWNlQ2FsbFN0YXR1c1wiLFxuICAgICAgXCJzY3JvbGxEaXNwbGF5TGVmdFwiLFxuICAgICAgXCJ3cml0ZU1pY3Jvc2Vjb25kc1wiLFxuICAgICAgXCJkZWxheU1pY3Jvc2Vjb25kc1wiLFxuICAgICAgXCJiZWdpblRyYW5zbWlzc2lvblwiLFxuICAgICAgXCJnZXRTaWduYWxTdHJlbmd0aFwiLFxuICAgICAgXCJydW5Bc3luY2hyb25vdXNseVwiLFxuICAgICAgXCJnZXRBc3luY2hyb25vdXNseVwiLFxuICAgICAgXCJsaXN0ZW5PbkxvY2FsaG9zdFwiLFxuICAgICAgXCJnZXRDdXJyZW50Q2FycmllclwiLFxuICAgICAgXCJyZWFkQWNjZWxlcm9tZXRlclwiLFxuICAgICAgXCJtZXNzYWdlQXZhaWxhYmxlXCIsXG4gICAgICBcInNlbmREaWdpdGFsUG9ydHNcIixcbiAgICAgIFwibGluZUZvbGxvd0NvbmZpZ1wiLFxuICAgICAgXCJjb3VudHJ5TmFtZVdyaXRlXCIsXG4gICAgICBcInJ1blNoZWxsQ29tbWFuZFwiLFxuICAgICAgXCJyZWFkU3RyaW5nVW50aWxcIixcbiAgICAgIFwicmV3aW5kRGlyZWN0b3J5XCIsXG4gICAgICBcInJlYWRUZW1wZXJhdHVyZVwiLFxuICAgICAgXCJzZXRDbG9ja0RpdmlkZXJcIixcbiAgICAgIFwicmVhZExpZ2h0U2Vuc29yXCIsXG4gICAgICBcImVuZFRyYW5zbWlzc2lvblwiLFxuICAgICAgXCJhbmFsb2dSZWZlcmVuY2VcIixcbiAgICAgIFwiZGV0YWNoSW50ZXJydXB0XCIsXG4gICAgICBcImNvdW50cnlOYW1lUmVhZFwiLFxuICAgICAgXCJhdHRhY2hJbnRlcnJ1cHRcIixcbiAgICAgIFwiZW5jcnlwdGlvblR5cGVcIixcbiAgICAgIFwicmVhZEJ5dGVzVW50aWxcIixcbiAgICAgIFwicm9ib3ROYW1lV3JpdGVcIixcbiAgICAgIFwicmVhZE1pY3JvcGhvbmVcIixcbiAgICAgIFwicm9ib3ROYW1lUmVhZFwiLFxuICAgICAgXCJjaXR5TmFtZVdyaXRlXCIsXG4gICAgICBcInVzZXJOYW1lV3JpdGVcIixcbiAgICAgIFwicmVhZEpveXN0aWNrWVwiLFxuICAgICAgXCJyZWFkSm95c3RpY2tYXCIsXG4gICAgICBcIm1vdXNlUmVsZWFzZWRcIixcbiAgICAgIFwib3Blbk5leHRGaWxlXCIsXG4gICAgICBcInNjYW5OZXR3b3Jrc1wiLFxuICAgICAgXCJub0ludGVycnVwdHNcIixcbiAgICAgIFwiZGlnaXRhbFdyaXRlXCIsXG4gICAgICBcImJlZ2luU3BlYWtlclwiLFxuICAgICAgXCJtb3VzZVByZXNzZWRcIixcbiAgICAgIFwiaXNBY3Rpb25Eb25lXCIsXG4gICAgICBcIm1vdXNlRHJhZ2dlZFwiLFxuICAgICAgXCJkaXNwbGF5TG9nb3NcIixcbiAgICAgIFwibm9BdXRvc2Nyb2xsXCIsXG4gICAgICBcImFkZFBhcmFtZXRlclwiLFxuICAgICAgXCJyZW1vdGVOdW1iZXJcIixcbiAgICAgIFwiZ2V0TW9kaWZpZXJzXCIsXG4gICAgICBcImtleWJvYXJkUmVhZFwiLFxuICAgICAgXCJ1c2VyTmFtZVJlYWRcIixcbiAgICAgIFwid2FpdENvbnRpbnVlXCIsXG4gICAgICBcInByb2Nlc3NJbnB1dFwiLFxuICAgICAgXCJwYXJzZUNvbW1hbmRcIixcbiAgICAgIFwicHJpbnRWZXJzaW9uXCIsXG4gICAgICBcInJlYWROZXR3b3Jrc1wiLFxuICAgICAgXCJ3cml0ZU1lc3NhZ2VcIixcbiAgICAgIFwiYmxpbmtWZXJzaW9uXCIsXG4gICAgICBcImNpdHlOYW1lUmVhZFwiLFxuICAgICAgXCJyZWFkTWVzc2FnZVwiLFxuICAgICAgXCJzZXREYXRhTW9kZVwiLFxuICAgICAgXCJwYXJzZVBhY2tldFwiLFxuICAgICAgXCJpc0xpc3RlbmluZ1wiLFxuICAgICAgXCJzZXRCaXRPcmRlclwiLFxuICAgICAgXCJiZWdpblBhY2tldFwiLFxuICAgICAgXCJpc0RpcmVjdG9yeVwiLFxuICAgICAgXCJtb3RvcnNXcml0ZVwiLFxuICAgICAgXCJkcmF3Q29tcGFzc1wiLFxuICAgICAgXCJkaWdpdGFsUmVhZFwiLFxuICAgICAgXCJjbGVhclNjcmVlblwiLFxuICAgICAgXCJzZXJpYWxFdmVudFwiLFxuICAgICAgXCJyaWdodFRvTGVmdFwiLFxuICAgICAgXCJzZXRUZXh0U2l6ZVwiLFxuICAgICAgXCJsZWZ0VG9SaWdodFwiLFxuICAgICAgXCJyZXF1ZXN0RnJvbVwiLFxuICAgICAgXCJrZXlSZWxlYXNlZFwiLFxuICAgICAgXCJjb21wYXNzUmVhZFwiLFxuICAgICAgXCJhbmFsb2dXcml0ZVwiLFxuICAgICAgXCJpbnRlcnJ1cHRzXCIsXG4gICAgICBcIldpRmlTZXJ2ZXJcIixcbiAgICAgIFwiZGlzY29ubmVjdFwiLFxuICAgICAgXCJwbGF5TWVsb2R5XCIsXG4gICAgICBcInBhcnNlRmxvYXRcIixcbiAgICAgIFwiYXV0b3Njcm9sbFwiLFxuICAgICAgXCJnZXRQSU5Vc2VkXCIsXG4gICAgICBcInNldFBJTlVzZWRcIixcbiAgICAgIFwic2V0VGltZW91dFwiLFxuICAgICAgXCJzZW5kQW5hbG9nXCIsXG4gICAgICBcInJlYWRTbGlkZXJcIixcbiAgICAgIFwiYW5hbG9nUmVhZFwiLFxuICAgICAgXCJiZWdpbldyaXRlXCIsXG4gICAgICBcImNyZWF0ZUNoYXJcIixcbiAgICAgIFwibW90b3JzU3RvcFwiLFxuICAgICAgXCJrZXlQcmVzc2VkXCIsXG4gICAgICBcInRlbXBvV3JpdGVcIixcbiAgICAgIFwicmVhZEJ1dHRvblwiLFxuICAgICAgXCJzdWJuZXRNYXNrXCIsXG4gICAgICBcImRlYnVnUHJpbnRcIixcbiAgICAgIFwibWFjQWRkcmVzc1wiLFxuICAgICAgXCJ3cml0ZUdyZWVuXCIsXG4gICAgICBcInJhbmRvbVNlZWRcIixcbiAgICAgIFwiYXR0YWNoR1BSU1wiLFxuICAgICAgXCJyZWFkU3RyaW5nXCIsXG4gICAgICBcInNlbmRTdHJpbmdcIixcbiAgICAgIFwicmVtb3RlUG9ydFwiLFxuICAgICAgXCJyZWxlYXNlQWxsXCIsXG4gICAgICBcIm1vdXNlTW92ZWRcIixcbiAgICAgIFwiYmFja2dyb3VuZFwiLFxuICAgICAgXCJnZXRYQ2hhbmdlXCIsXG4gICAgICBcImdldFlDaGFuZ2VcIixcbiAgICAgIFwiYW5zd2VyQ2FsbFwiLFxuICAgICAgXCJnZXRSZXN1bHRcIixcbiAgICAgIFwidm9pY2VDYWxsXCIsXG4gICAgICBcImVuZFBhY2tldFwiLFxuICAgICAgXCJjb25zdHJhaW5cIixcbiAgICAgIFwiZ2V0U29ja2V0XCIsXG4gICAgICBcIndyaXRlSlNPTlwiLFxuICAgICAgXCJnZXRCdXR0b25cIixcbiAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICBcImNvbm5lY3RlZFwiLFxuICAgICAgXCJmaW5kVW50aWxcIixcbiAgICAgIFwicmVhZEJ5dGVzXCIsXG4gICAgICBcImV4aXRWYWx1ZVwiLFxuICAgICAgXCJyZWFkR3JlZW5cIixcbiAgICAgIFwid3JpdGVCbHVlXCIsXG4gICAgICBcInN0YXJ0TG9vcFwiLFxuICAgICAgXCJJUEFkZHJlc3NcIixcbiAgICAgIFwiaXNQcmVzc2VkXCIsXG4gICAgICBcInNlbmRTeXNleFwiLFxuICAgICAgXCJwYXVzZU1vZGVcIixcbiAgICAgIFwiZ2F0ZXdheUlQXCIsXG4gICAgICBcInNldEN1cnNvclwiLFxuICAgICAgXCJnZXRPZW1LZXlcIixcbiAgICAgIFwidHVuZVdyaXRlXCIsXG4gICAgICBcIm5vRGlzcGxheVwiLFxuICAgICAgXCJsb2FkSW1hZ2VcIixcbiAgICAgIFwic3dpdGNoUElOXCIsXG4gICAgICBcIm9uUmVxdWVzdFwiLFxuICAgICAgXCJvblJlY2VpdmVcIixcbiAgICAgIFwiY2hhbmdlUElOXCIsXG4gICAgICBcInBsYXlGaWxlXCIsXG4gICAgICBcIm5vQnVmZmVyXCIsXG4gICAgICBcInBhcnNlSW50XCIsXG4gICAgICBcIm92ZXJmbG93XCIsXG4gICAgICBcImNoZWNrUElOXCIsXG4gICAgICBcImtub2JSZWFkXCIsXG4gICAgICBcImJlZ2luVEZUXCIsXG4gICAgICBcImJpdENsZWFyXCIsXG4gICAgICBcInVwZGF0ZUlSXCIsXG4gICAgICBcImJpdFdyaXRlXCIsXG4gICAgICBcInBvc2l0aW9uXCIsXG4gICAgICBcIndyaXRlUkdCXCIsXG4gICAgICBcImhpZ2hCeXRlXCIsXG4gICAgICBcIndyaXRlUmVkXCIsXG4gICAgICBcInNldFNwZWVkXCIsXG4gICAgICBcInJlYWRCbHVlXCIsXG4gICAgICBcIm5vU3Ryb2tlXCIsXG4gICAgICBcInJlbW90ZUlQXCIsXG4gICAgICBcInRyYW5zZmVyXCIsXG4gICAgICBcInNodXRkb3duXCIsXG4gICAgICBcImhhbmdDYWxsXCIsXG4gICAgICBcImJlZ2luU01TXCIsXG4gICAgICBcImVuZFdyaXRlXCIsXG4gICAgICBcImF0dGFjaGVkXCIsXG4gICAgICBcIm1haW50YWluXCIsXG4gICAgICBcIm5vQ3Vyc29yXCIsXG4gICAgICBcImNoZWNrUmVnXCIsXG4gICAgICBcImNoZWNrUFVLXCIsXG4gICAgICBcInNoaWZ0T3V0XCIsXG4gICAgICBcImlzVmFsaWRcIixcbiAgICAgIFwic2hpZnRJblwiLFxuICAgICAgXCJwdWxzZUluXCIsXG4gICAgICBcImNvbm5lY3RcIixcbiAgICAgIFwicHJpbnRsblwiLFxuICAgICAgXCJsb2NhbElQXCIsXG4gICAgICBcInBpbk1vZGVcIixcbiAgICAgIFwiZ2V0SU1FSVwiLFxuICAgICAgXCJkaXNwbGF5XCIsXG4gICAgICBcIm5vQmxpbmtcIixcbiAgICAgIFwicHJvY2Vzc1wiLFxuICAgICAgXCJnZXRCYW5kXCIsXG4gICAgICBcInJ1bm5pbmdcIixcbiAgICAgIFwiYmVnaW5TRFwiLFxuICAgICAgXCJkcmF3Qk1QXCIsXG4gICAgICBcImxvd0J5dGVcIixcbiAgICAgIFwic2V0QmFuZFwiLFxuICAgICAgXCJyZWxlYXNlXCIsXG4gICAgICBcImJpdFJlYWRcIixcbiAgICAgIFwicHJlcGFyZVwiLFxuICAgICAgXCJwb2ludFRvXCIsXG4gICAgICBcInJlYWRSZWRcIixcbiAgICAgIFwic2V0TW9kZVwiLFxuICAgICAgXCJub0ZpbGxcIixcbiAgICAgIFwicmVtb3ZlXCIsXG4gICAgICBcImxpc3RlblwiLFxuICAgICAgXCJzdHJva2VcIixcbiAgICAgIFwiZGV0YWNoXCIsXG4gICAgICBcImF0dGFjaFwiLFxuICAgICAgXCJub1RvbmVcIixcbiAgICAgIFwiZXhpc3RzXCIsXG4gICAgICBcImJ1ZmZlclwiLFxuICAgICAgXCJoZWlnaHRcIixcbiAgICAgIFwiYml0U2V0XCIsXG4gICAgICBcImNpcmNsZVwiLFxuICAgICAgXCJjb25maWdcIixcbiAgICAgIFwiY3Vyc29yXCIsXG4gICAgICBcInJhbmRvbVwiLFxuICAgICAgXCJJUnJlYWRcIixcbiAgICAgIFwic2V0RE5TXCIsXG4gICAgICBcImVuZFNNU1wiLFxuICAgICAgXCJnZXRLZXlcIixcbiAgICAgIFwibWljcm9zXCIsXG4gICAgICBcIm1pbGxpc1wiLFxuICAgICAgXCJiZWdpblwiLFxuICAgICAgXCJwcmludFwiLFxuICAgICAgXCJ3cml0ZVwiLFxuICAgICAgXCJyZWFkeVwiLFxuICAgICAgXCJmbHVzaFwiLFxuICAgICAgXCJ3aWR0aFwiLFxuICAgICAgXCJpc1BJTlwiLFxuICAgICAgXCJibGlua1wiLFxuICAgICAgXCJjbGVhclwiLFxuICAgICAgXCJwcmVzc1wiLFxuICAgICAgXCJta2RpclwiLFxuICAgICAgXCJybWRpclwiLFxuICAgICAgXCJjbG9zZVwiLFxuICAgICAgXCJwb2ludFwiLFxuICAgICAgXCJ5aWVsZFwiLFxuICAgICAgXCJpbWFnZVwiLFxuICAgICAgXCJCU1NJRFwiLFxuICAgICAgXCJjbGlja1wiLFxuICAgICAgXCJkZWxheVwiLFxuICAgICAgXCJyZWFkXCIsXG4gICAgICBcInRleHRcIixcbiAgICAgIFwibW92ZVwiLFxuICAgICAgXCJwZWVrXCIsXG4gICAgICBcImJlZXBcIixcbiAgICAgIFwicmVjdFwiLFxuICAgICAgXCJsaW5lXCIsXG4gICAgICBcIm9wZW5cIixcbiAgICAgIFwic2Vla1wiLFxuICAgICAgXCJmaWxsXCIsXG4gICAgICBcInNpemVcIixcbiAgICAgIFwidHVyblwiLFxuICAgICAgXCJzdG9wXCIsXG4gICAgICBcImhvbWVcIixcbiAgICAgIFwiZmluZFwiLFxuICAgICAgXCJzdGVwXCIsXG4gICAgICBcInRvbmVcIixcbiAgICAgIFwic3FydFwiLFxuICAgICAgXCJSU1NJXCIsXG4gICAgICBcIlNTSURcIixcbiAgICAgIFwiZW5kXCIsXG4gICAgICBcImJpdFwiLFxuICAgICAgXCJ0YW5cIixcbiAgICAgIFwiY29zXCIsXG4gICAgICBcInNpblwiLFxuICAgICAgXCJwb3dcIixcbiAgICAgIFwibWFwXCIsXG4gICAgICBcImFic1wiLFxuICAgICAgXCJtYXhcIixcbiAgICAgIFwibWluXCIsXG4gICAgICBcImdldFwiLFxuICAgICAgXCJydW5cIixcbiAgICAgIFwicHV0XCJcbiAgICBdLFxuICAgIGxpdGVyYWw6IFtcbiAgICAgIFwiRElHSVRBTF9NRVNTQUdFXCIsXG4gICAgICBcIkZJUk1BVEFfU1RSSU5HXCIsXG4gICAgICBcIkFOQUxPR19NRVNTQUdFXCIsXG4gICAgICBcIlJFUE9SVF9ESUdJVEFMXCIsXG4gICAgICBcIlJFUE9SVF9BTkFMT0dcIixcbiAgICAgIFwiSU5QVVRfUFVMTFVQXCIsXG4gICAgICBcIlNFVF9QSU5fTU9ERVwiLFxuICAgICAgXCJJTlRFUk5BTDJWNTZcIixcbiAgICAgIFwiU1lTVEVNX1JFU0VUXCIsXG4gICAgICBcIkxFRF9CVUlMVElOXCIsXG4gICAgICBcIklOVEVSTkFMMVYxXCIsXG4gICAgICBcIlNZU0VYX1NUQVJUXCIsXG4gICAgICBcIklOVEVSTkFMXCIsXG4gICAgICBcIkVYVEVSTkFMXCIsXG4gICAgICBcIkRFRkFVTFRcIixcbiAgICAgIFwiT1VUUFVUXCIsXG4gICAgICBcIklOUFVUXCIsXG4gICAgICBcIkhJR0hcIixcbiAgICAgIFwiTE9XXCJcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgQVJEVUlOTyA9IGNQbHVzUGx1cyhobGpzKTtcblxuICBjb25zdCBrd3MgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsYW55Pn0gKi8gKEFSRFVJTk8ua2V5d29yZHMpO1xuXG4gIGt3cy50eXBlID0gW1xuICAgIC4uLmt3cy50eXBlLFxuICAgIC4uLkFSRFVJTk9fS1cudHlwZVxuICBdO1xuICBrd3MubGl0ZXJhbCA9IFtcbiAgICAuLi5rd3MubGl0ZXJhbCxcbiAgICAuLi5BUkRVSU5PX0tXLmxpdGVyYWxcbiAgXTtcbiAga3dzLmJ1aWx0X2luID0gW1xuICAgIC4uLmt3cy5idWlsdF9pbixcbiAgICAuLi5BUkRVSU5PX0tXLmJ1aWx0X2luXG4gIF07XG4gIGt3cy5faGludHMgPSBBUkRVSU5PX0tXLl9oaW50cztcblxuICBBUkRVSU5PLm5hbWUgPSAnQXJkdWlubyc7XG4gIEFSRFVJTk8uYWxpYXNlcyA9IFsgJ2lubycgXTtcbiAgQVJEVUlOTy5zdXBlcnNldE9mID0gXCJjcHBcIjtcblxuICByZXR1cm4gQVJEVUlOTztcbn1cblxuZXhwb3J0IHsgYXJkdWlubyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBCYXNoXG5BdXRob3I6IHZhaCA8dmFodGVuYmVyZ0BnbWFpbC5jb20+XG5Db250cmlidXRyb3JzOiBCZW5qYW1pbiBQYW5uZWxsIDxjb250YWN0QHNpZXJyYXNvZnR3b3Jrcy5jb20+XG5XZWJzaXRlOiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2Jhc2gvXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gYmFzaChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgVkFSID0ge307XG4gIGNvbnN0IEJSQUNFRF9WQVIgPSB7XG4gICAgYmVnaW46IC9cXCRcXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIFwic2VsZlwiLFxuICAgICAge1xuICAgICAgICBiZWdpbjogLzotLyxcbiAgICAgICAgY29udGFpbnM6IFsgVkFSIF1cbiAgICAgIH0gLy8gZGVmYXVsdCB2YWx1ZXNcbiAgICBdXG4gIH07XG4gIE9iamVjdC5hc3NpZ24oVkFSLCB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiByZWdleC5jb25jYXQoL1xcJFtcXHdcXGQjQF1bXFx3XFxkX10qLyxcbiAgICAgICAgLy8gbmVnYXRpdmUgbG9vay1haGVhZCB0cmllcyB0byBhdm9pZCBtYXRjaGluZyBwYXR0ZXJucyB0aGF0IGFyZSBub3RcbiAgICAgICAgLy8gUGVybCBhdCBhbGwgbGlrZSAkaWRlbnQkLCBAaWRlbnRALCBldGMuXG4gICAgICAgIGAoPyFbXFxcXHdcXFxcZF0pKD8hWyRdKWApIH0sXG4gICAgICBCUkFDRURfVkFSXG4gICAgXVxuICB9KTtcblxuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46IC9cXCRcXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgfTtcbiAgY29uc3QgSEVSRV9ET0MgPSB7XG4gICAgYmVnaW46IC88PC0/XFxzKig/PVxcdyspLyxcbiAgICBzdGFydHM6IHsgY29udGFpbnM6IFtcbiAgICAgIGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgICAgICBiZWdpbjogLyhcXHcrKS8sXG4gICAgICAgIGVuZDogLyhcXHcrKS8sXG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZydcbiAgICAgIH0pXG4gICAgXSB9XG4gIH07XG4gIGNvbnN0IFFVT1RFX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXCIvLFxuICAgIGVuZDogL1wiLyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgVkFSLFxuICAgICAgU1VCU1RcbiAgICBdXG4gIH07XG4gIFNVQlNULmNvbnRhaW5zLnB1c2goUVVPVEVfU1RSSU5HKTtcbiAgY29uc3QgRVNDQVBFRF9RVU9URSA9IHtcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIGJlZ2luOiAvXFxcXFwiL1xuXG4gIH07XG4gIGNvbnN0IEFQT1NfU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgYmVnaW46IC8nLyxcbiAgICBlbmQ6IC8nL1xuICB9O1xuICBjb25zdCBBUklUSE1FVElDID0ge1xuICAgIGJlZ2luOiAvXFwkP1xcKFxcKC8sXG4gICAgZW5kOiAvXFwpXFwpLyxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcZCsjWzAtOWEtZl0rLyxcbiAgICAgICAgY2xhc3NOYW1lOiBcIm51bWJlclwiXG4gICAgICB9LFxuICAgICAgaGxqcy5OVU1CRVJfTU9ERSxcbiAgICAgIFZBUlxuICAgIF1cbiAgfTtcbiAgY29uc3QgU0hfTElLRV9TSEVMTFMgPSBbXG4gICAgXCJmaXNoXCIsXG4gICAgXCJiYXNoXCIsXG4gICAgXCJ6c2hcIixcbiAgICBcInNoXCIsXG4gICAgXCJjc2hcIixcbiAgICBcImtzaFwiLFxuICAgIFwidGNzaFwiLFxuICAgIFwiZGFzaFwiLFxuICAgIFwic2NzaFwiLFxuICBdO1xuICBjb25zdCBLTk9XTl9TSEVCQU5HID0gaGxqcy5TSEVCQU5HKHtcbiAgICBiaW5hcnk6IGAoJHtTSF9MSUtFX1NIRUxMUy5qb2luKFwifFwiKX0pYCxcbiAgICByZWxldmFuY2U6IDEwXG4gIH0pO1xuICBjb25zdCBGVU5DVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgYmVnaW46IC9cXHdbXFx3XFxkX10qXFxzKlxcKFxccypcXClcXHMqXFx7LyxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBjb250YWluczogWyBobGpzLmluaGVyaXQoaGxqcy5USVRMRV9NT0RFLCB7IGJlZ2luOiAvXFx3W1xcd1xcZF9dKi8gfSkgXSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBLRVlXT1JEUyA9IFtcbiAgICBcImlmXCIsXG4gICAgXCJ0aGVuXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbGlmXCIsXG4gICAgXCJmaVwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJ3aGlsZVwiLFxuICAgIFwidW50aWxcIixcbiAgICBcImluXCIsXG4gICAgXCJkb1wiLFxuICAgIFwiZG9uZVwiLFxuICAgIFwiY2FzZVwiLFxuICAgIFwiZXNhY1wiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcInNlbGVjdFwiXG4gIF07XG5cbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiXG4gIF07XG5cbiAgLy8gdG8gY29uc3VtZSBwYXRocyB0byBwcmV2ZW50IGtleXdvcmQgbWF0Y2hlcyBpbnNpZGUgdGhlbVxuICBjb25zdCBQQVRIX01PREUgPSB7IG1hdGNoOiAvKFxcL1thLXouXy1dKykrLyB9O1xuXG4gIC8vIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9odG1sX25vZGUvU2hlbGwtQnVpbHRpbi1Db21tYW5kcy5odG1sXG4gIGNvbnN0IFNIRUxMX0JVSUxUX0lOUyA9IFtcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjZFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImV2YWxcIixcbiAgICBcImV4ZWNcIixcbiAgICBcImV4aXRcIixcbiAgICBcImV4cG9ydFwiLFxuICAgIFwiZ2V0b3B0c1wiLFxuICAgIFwiaGFzaFwiLFxuICAgIFwicHdkXCIsXG4gICAgXCJyZWFkb25seVwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzaGlmdFwiLFxuICAgIFwidGVzdFwiLFxuICAgIFwidGltZXNcIixcbiAgICBcInRyYXBcIixcbiAgICBcInVtYXNrXCIsXG4gICAgXCJ1bnNldFwiXG4gIF07XG5cbiAgY29uc3QgQkFTSF9CVUlMVF9JTlMgPSBbXG4gICAgXCJhbGlhc1wiLFxuICAgIFwiYmluZFwiLFxuICAgIFwiYnVpbHRpblwiLFxuICAgIFwiY2FsbGVyXCIsXG4gICAgXCJjb21tYW5kXCIsXG4gICAgXCJkZWNsYXJlXCIsXG4gICAgXCJlY2hvXCIsXG4gICAgXCJlbmFibGVcIixcbiAgICBcImhlbHBcIixcbiAgICBcImxldFwiLFxuICAgIFwibG9jYWxcIixcbiAgICBcImxvZ291dFwiLFxuICAgIFwibWFwZmlsZVwiLFxuICAgIFwicHJpbnRmXCIsXG4gICAgXCJyZWFkXCIsXG4gICAgXCJyZWFkYXJyYXlcIixcbiAgICBcInNvdXJjZVwiLFxuICAgIFwidHlwZVwiLFxuICAgIFwidHlwZXNldFwiLFxuICAgIFwidWxpbWl0XCIsXG4gICAgXCJ1bmFsaWFzXCJcbiAgXTtcblxuICBjb25zdCBaU0hfQlVJTFRfSU5TID0gW1xuICAgIFwiYXV0b2xvYWRcIixcbiAgICBcImJnXCIsXG4gICAgXCJiaW5ka2V5XCIsXG4gICAgXCJieWVcIixcbiAgICBcImNhcFwiLFxuICAgIFwiY2hkaXJcIixcbiAgICBcImNsb25lXCIsXG4gICAgXCJjb21wYXJndW1lbnRzXCIsXG4gICAgXCJjb21wY2FsbFwiLFxuICAgIFwiY29tcGN0bFwiLFxuICAgIFwiY29tcGRlc2NyaWJlXCIsXG4gICAgXCJjb21wZmlsZXNcIixcbiAgICBcImNvbXBncm91cHNcIixcbiAgICBcImNvbXBxdW90ZVwiLFxuICAgIFwiY29tcHRhZ3NcIixcbiAgICBcImNvbXB0cnlcIixcbiAgICBcImNvbXB2YWx1ZXNcIixcbiAgICBcImRpcnNcIixcbiAgICBcImRpc2FibGVcIixcbiAgICBcImRpc293blwiLFxuICAgIFwiZWNob3RjXCIsXG4gICAgXCJlY2hvdGlcIixcbiAgICBcImVtdWxhdGVcIixcbiAgICBcImZjXCIsXG4gICAgXCJmZ1wiLFxuICAgIFwiZmxvYXRcIixcbiAgICBcImZ1bmN0aW9uc1wiLFxuICAgIFwiZ2V0Y2FwXCIsXG4gICAgXCJnZXRsblwiLFxuICAgIFwiaGlzdG9yeVwiLFxuICAgIFwiaW50ZWdlclwiLFxuICAgIFwiam9ic1wiLFxuICAgIFwia2lsbFwiLFxuICAgIFwibGltaXRcIixcbiAgICBcImxvZ1wiLFxuICAgIFwibm9nbG9iXCIsXG4gICAgXCJwb3BkXCIsXG4gICAgXCJwcmludFwiLFxuICAgIFwicHVzaGRcIixcbiAgICBcInB1c2hsblwiLFxuICAgIFwicmVoYXNoXCIsXG4gICAgXCJzY2hlZFwiLFxuICAgIFwic2V0Y2FwXCIsXG4gICAgXCJzZXRvcHRcIixcbiAgICBcInN0YXRcIixcbiAgICBcInN1c3BlbmRcIixcbiAgICBcInR0eWN0bFwiLFxuICAgIFwidW5mdW5jdGlvblwiLFxuICAgIFwidW5oYXNoXCIsXG4gICAgXCJ1bmxpbWl0XCIsXG4gICAgXCJ1bnNldG9wdFwiLFxuICAgIFwidmFyZWRcIixcbiAgICBcIndhaXRcIixcbiAgICBcIndoZW5jZVwiLFxuICAgIFwid2hlcmVcIixcbiAgICBcIndoaWNoXCIsXG4gICAgXCJ6Y29tcGlsZVwiLFxuICAgIFwiemZvcm1hdFwiLFxuICAgIFwiemZ0cFwiLFxuICAgIFwiemxlXCIsXG4gICAgXCJ6bW9kbG9hZFwiLFxuICAgIFwienBhcnNlb3B0c1wiLFxuICAgIFwienByb2ZcIixcbiAgICBcInpwdHlcIixcbiAgICBcInpyZWdleHBhcnNlXCIsXG4gICAgXCJ6c29ja2V0XCIsXG4gICAgXCJ6c3R5bGVcIixcbiAgICBcInp0Y3BcIlxuICBdO1xuXG4gIGNvbnN0IEdOVV9DT1JFX1VUSUxTID0gW1xuICAgIFwiY2hjb25cIixcbiAgICBcImNoZ3JwXCIsXG4gICAgXCJjaG93blwiLFxuICAgIFwiY2htb2RcIixcbiAgICBcImNwXCIsXG4gICAgXCJkZFwiLFxuICAgIFwiZGZcIixcbiAgICBcImRpclwiLFxuICAgIFwiZGlyY29sb3JzXCIsXG4gICAgXCJsblwiLFxuICAgIFwibHNcIixcbiAgICBcIm1rZGlyXCIsXG4gICAgXCJta2ZpZm9cIixcbiAgICBcIm1rbm9kXCIsXG4gICAgXCJta3RlbXBcIixcbiAgICBcIm12XCIsXG4gICAgXCJyZWFscGF0aFwiLFxuICAgIFwicm1cIixcbiAgICBcInJtZGlyXCIsXG4gICAgXCJzaHJlZFwiLFxuICAgIFwic3luY1wiLFxuICAgIFwidG91Y2hcIixcbiAgICBcInRydW5jYXRlXCIsXG4gICAgXCJ2ZGlyXCIsXG4gICAgXCJiMnN1bVwiLFxuICAgIFwiYmFzZTMyXCIsXG4gICAgXCJiYXNlNjRcIixcbiAgICBcImNhdFwiLFxuICAgIFwiY2tzdW1cIixcbiAgICBcImNvbW1cIixcbiAgICBcImNzcGxpdFwiLFxuICAgIFwiY3V0XCIsXG4gICAgXCJleHBhbmRcIixcbiAgICBcImZtdFwiLFxuICAgIFwiZm9sZFwiLFxuICAgIFwiaGVhZFwiLFxuICAgIFwiam9pblwiLFxuICAgIFwibWQ1c3VtXCIsXG4gICAgXCJubFwiLFxuICAgIFwibnVtZm10XCIsXG4gICAgXCJvZFwiLFxuICAgIFwicGFzdGVcIixcbiAgICBcInB0eFwiLFxuICAgIFwicHJcIixcbiAgICBcInNoYTFzdW1cIixcbiAgICBcInNoYTIyNHN1bVwiLFxuICAgIFwic2hhMjU2c3VtXCIsXG4gICAgXCJzaGEzODRzdW1cIixcbiAgICBcInNoYTUxMnN1bVwiLFxuICAgIFwic2h1ZlwiLFxuICAgIFwic29ydFwiLFxuICAgIFwic3BsaXRcIixcbiAgICBcInN1bVwiLFxuICAgIFwidGFjXCIsXG4gICAgXCJ0YWlsXCIsXG4gICAgXCJ0clwiLFxuICAgIFwidHNvcnRcIixcbiAgICBcInVuZXhwYW5kXCIsXG4gICAgXCJ1bmlxXCIsXG4gICAgXCJ3Y1wiLFxuICAgIFwiYXJjaFwiLFxuICAgIFwiYmFzZW5hbWVcIixcbiAgICBcImNocm9vdFwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiZGlybmFtZVwiLFxuICAgIFwiZHVcIixcbiAgICBcImVjaG9cIixcbiAgICBcImVudlwiLFxuICAgIFwiZXhwclwiLFxuICAgIFwiZmFjdG9yXCIsXG4gICAgLy8gXCJmYWxzZVwiLCAvLyBrZXl3b3JkIGxpdGVyYWwgYWxyZWFkeVxuICAgIFwiZ3JvdXBzXCIsXG4gICAgXCJob3N0aWRcIixcbiAgICBcImlkXCIsXG4gICAgXCJsaW5rXCIsXG4gICAgXCJsb2duYW1lXCIsXG4gICAgXCJuaWNlXCIsXG4gICAgXCJub2h1cFwiLFxuICAgIFwibnByb2NcIixcbiAgICBcInBhdGhjaGtcIixcbiAgICBcInBpbmt5XCIsXG4gICAgXCJwcmludGVudlwiLFxuICAgIFwicHJpbnRmXCIsXG4gICAgXCJwd2RcIixcbiAgICBcInJlYWRsaW5rXCIsXG4gICAgXCJydW5jb25cIixcbiAgICBcInNlcVwiLFxuICAgIFwic2xlZXBcIixcbiAgICBcInN0YXRcIixcbiAgICBcInN0ZGJ1ZlwiLFxuICAgIFwic3R0eVwiLFxuICAgIFwidGVlXCIsXG4gICAgXCJ0ZXN0XCIsXG4gICAgXCJ0aW1lb3V0XCIsXG4gICAgLy8gXCJ0cnVlXCIsIC8vIGtleXdvcmQgbGl0ZXJhbCBhbHJlYWR5XG4gICAgXCJ0dHlcIixcbiAgICBcInVuYW1lXCIsXG4gICAgXCJ1bmxpbmtcIixcbiAgICBcInVwdGltZVwiLFxuICAgIFwidXNlcnNcIixcbiAgICBcIndob1wiLFxuICAgIFwid2hvYW1pXCIsXG4gICAgXCJ5ZXNcIlxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0Jhc2gnLFxuICAgIGFsaWFzZXM6IFsgJ3NoJyBdLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogL1xcYlthLXpdW2EtejAtOS5fLV0rXFxiLyxcbiAgICAgIGtleXdvcmQ6IEtFWVdPUkRTLFxuICAgICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgICBidWlsdF9pbjogW1xuICAgICAgICAuLi5TSEVMTF9CVUlMVF9JTlMsXG4gICAgICAgIC4uLkJBU0hfQlVJTFRfSU5TLFxuICAgICAgICAvLyBTaGVsbCBtb2RpZmllcnNcbiAgICAgICAgXCJzZXRcIixcbiAgICAgICAgXCJzaG9wdFwiLFxuICAgICAgICAuLi5aU0hfQlVJTFRfSU5TLFxuICAgICAgICAuLi5HTlVfQ09SRV9VVElMU1xuICAgICAgXVxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEtOT1dOX1NIRUJBTkcsIC8vIHRvIGNhdGNoIGtub3duIHNoZWxscyBhbmQgYm9vc3QgcmVsZXZhbmN5XG4gICAgICBobGpzLlNIRUJBTkcoKSwgLy8gdG8gY2F0Y2ggdW5rbm93biBzaGVsbHMgYnV0IHN0aWxsIGhpZ2hsaWdodCB0aGUgc2hlYmFuZ1xuICAgICAgRlVOQ1RJT04sXG4gICAgICBBUklUSE1FVElDLFxuICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERSxcbiAgICAgIEhFUkVfRE9DLFxuICAgICAgUEFUSF9NT0RFLFxuICAgICAgUVVPVEVfU1RSSU5HLFxuICAgICAgRVNDQVBFRF9RVU9URSxcbiAgICAgIEFQT1NfU1RSSU5HLFxuICAgICAgVkFSXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBiYXNoIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IENcbkNhdGVnb3J5OiBjb21tb24sIHN5c3RlbVxuV2Vic2l0ZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ18ocHJvZ3JhbW1pbmdfbGFuZ3VhZ2UpXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gYyhobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLy8gYWRkZWQgZm9yIGhpc3RvcmljIHJlYXNvbnMgYmVjYXVzZSBgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFYCBkb2VzXG4gIC8vIG5vdCBpbmNsdWRlIHN1Y2ggc3VwcG9ydCBub3IgY2FuIHdlIGJlIHN1cmUgYWxsIHRoZSBncmFtbWFycyBkZXBlbmRpbmdcbiAgLy8gb24gaXQgd291bGQgZGVzaXJlIHRoaXMgYmVoYXZpb3JcbiAgY29uc3QgQ19MSU5FX0NPTU1FTlRfTU9ERSA9IGhsanMuQ09NTUVOVCgnLy8nLCAnJCcsIHsgY29udGFpbnM6IFsgeyBiZWdpbjogL1xcXFxcXG4vIH0gXSB9KTtcbiAgY29uc3QgREVDTFRZUEVfQVVUT19SRSA9ICdkZWNsdHlwZVxcXFwoYXV0b1xcXFwpJztcbiAgY29uc3QgTkFNRVNQQUNFX1JFID0gJ1thLXpBLVpfXVxcXFx3Kjo6JztcbiAgY29uc3QgVEVNUExBVEVfQVJHVU1FTlRfUkUgPSAnPFtePD5dKz4nO1xuICBjb25zdCBGVU5DVElPTl9UWVBFX1JFID0gJygnXG4gICAgKyBERUNMVFlQRV9BVVRPX1JFICsgJ3wnXG4gICAgKyByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpXG4gICAgKyAnW2EtekEtWl9dXFxcXHcqJyArIHJlZ2V4Lm9wdGlvbmFsKFRFTVBMQVRFX0FSR1VNRU5UX1JFKVxuICArICcpJztcblxuXG4gIGNvbnN0IFRZUEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiAnXFxcXGJbYS16XFxcXGRfXSpfdFxcXFxiJyB9LFxuICAgICAgeyBtYXRjaDogL1xcYmF0b21pY19bYS16XXszLDZ9XFxiLyB9XG4gICAgXVxuXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2VzY2FwZVxuICAvLyBcXFxcIFxceCBcXHhGRiBcXHUyODM3IFxcdTAwMzIzNzQ3IFxcMzc0XG4gIGNvbnN0IENIQVJBQ1RFUl9FU0NBUEVTID0gJ1xcXFxcXFxcKHhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NCw4fXxbMC03XXszfXxcXFxcUyknO1xuICBjb25zdCBTVFJJTkdTID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICcodTg/fFV8TCk/XCInLFxuICAgICAgICBlbmQ6ICdcIicsXG4gICAgICAgIGlsbGVnYWw6ICdcXFxcbicsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJyh1OD98VXxMKT9cXCcoJyArIENIQVJBQ1RFUl9FU0NBUEVTICsgXCJ8LilcIixcbiAgICAgICAgZW5kOiAnXFwnJyxcbiAgICAgICAgaWxsZWdhbDogJy4nXG4gICAgICB9LFxuICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgIGJlZ2luOiAvKD86dTg/fFV8TCk/UlwiKFteKClcXFxcIF17MCwxNn0pXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpKFteKClcXFxcIF17MCwxNn0pXCIvXG4gICAgICB9KVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBOVU1CRVJTID0ge1xuICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgYmVnaW46ICdcXFxcYigwYlswMVxcJ10rKScgfSxcbiAgICAgIHsgYmVnaW46ICcoLT8pXFxcXGIoW1xcXFxkXFwnXSsoXFxcXC5bXFxcXGRcXCddKik/fFxcXFwuW1xcXFxkXFwnXSspKChsbHxMTHxsfEwpKHV8VSk/fCh1fFUpKGxsfExMfGx8TCk/fGZ8RnxifEIpJyB9LFxuICAgICAgeyBiZWdpbjogJygtPykoXFxcXGIwW3hYXVthLWZBLUYwLTlcXCddK3woXFxcXGJbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoW2VFXVstK10/W1xcXFxkXFwnXSspPyknIH1cbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IFBSRVBST0NFU1NPUiA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBiZWdpbjogLyNcXHMqW2Etel0rXFxiLyxcbiAgICBlbmQ6IC8kLyxcbiAgICBrZXl3b3JkczogeyBrZXl3b3JkOlxuICAgICAgICAnaWYgZWxzZSBlbGlmIGVuZGlmIGRlZmluZSB1bmRlZiB3YXJuaW5nIGVycm9yIGxpbmUgJ1xuICAgICAgICArICdwcmFnbWEgX1ByYWdtYSBpZmRlZiBpZm5kZWYgaW5jbHVkZScgfSxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcXFxcXG4vLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICBobGpzLmluaGVyaXQoU1RSSU5HUywgeyBjbGFzc05hbWU6ICdzdHJpbmcnIH0pLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICBiZWdpbjogLzwuKj8+L1xuICAgICAgfSxcbiAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IFRJVExFX01PREUgPSB7XG4gICAgY2xhc3NOYW1lOiAndGl0bGUnLFxuICAgIGJlZ2luOiByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpICsgaGxqcy5JREVOVF9SRSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9USVRMRSA9IHJlZ2V4Lm9wdGlvbmFsKE5BTUVTUEFDRV9SRSkgKyBobGpzLklERU5UX1JFICsgJ1xcXFxzKlxcXFwoJztcblxuICBjb25zdCBDX0tFWVdPUkRTID0gW1xuICAgIFwiYXNtXCIsXG4gICAgXCJhdXRvXCIsXG4gICAgXCJicmVha1wiLFxuICAgIFwiY2FzZVwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImRlZmF1bHRcIixcbiAgICBcImRvXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsXG4gICAgXCJleHRlcm5cIixcbiAgICBcImZvclwiLFxuICAgIFwiZm9ydHJhblwiLFxuICAgIFwiZ290b1wiLFxuICAgIFwiaWZcIixcbiAgICBcImlubGluZVwiLFxuICAgIFwicmVnaXN0ZXJcIixcbiAgICBcInJlc3RyaWN0XCIsXG4gICAgXCJyZXR1cm5cIixcbiAgICBcInNpemVvZlwiLFxuICAgIFwic3RydWN0XCIsXG4gICAgXCJzd2l0Y2hcIixcbiAgICBcInR5cGVkZWZcIixcbiAgICBcInVuaW9uXCIsXG4gICAgXCJ2b2xhdGlsZVwiLFxuICAgIFwid2hpbGVcIixcbiAgICBcIl9BbGlnbmFzXCIsXG4gICAgXCJfQWxpZ25vZlwiLFxuICAgIFwiX0F0b21pY1wiLFxuICAgIFwiX0dlbmVyaWNcIixcbiAgICBcIl9Ob3JldHVyblwiLFxuICAgIFwiX1N0YXRpY19hc3NlcnRcIixcbiAgICBcIl9UaHJlYWRfbG9jYWxcIixcbiAgICAvLyBhbGlhc2VzXG4gICAgXCJhbGlnbmFzXCIsXG4gICAgXCJhbGlnbm9mXCIsXG4gICAgXCJub3JldHVyblwiLFxuICAgIFwic3RhdGljX2Fzc2VydFwiLFxuICAgIFwidGhyZWFkX2xvY2FsXCIsXG4gICAgLy8gbm90IGEgQyBrZXl3b3JkIGJ1dCBpcywgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcywgdHJlYXRlZCBleGFjdGx5IGxpa2Ugb25lLlxuICAgIFwiX1ByYWdtYVwiXG4gIF07XG5cbiAgY29uc3QgQ19UWVBFUyA9IFtcbiAgICBcImZsb2F0XCIsXG4gICAgXCJkb3VibGVcIixcbiAgICBcInNpZ25lZFwiLFxuICAgIFwidW5zaWduZWRcIixcbiAgICBcImludFwiLFxuICAgIFwic2hvcnRcIixcbiAgICBcImxvbmdcIixcbiAgICBcImNoYXJcIixcbiAgICBcInZvaWRcIixcbiAgICBcIl9Cb29sXCIsXG4gICAgXCJfQ29tcGxleFwiLFxuICAgIFwiX0ltYWdpbmFyeVwiLFxuICAgIFwiX0RlY2ltYWwzMlwiLFxuICAgIFwiX0RlY2ltYWw2NFwiLFxuICAgIFwiX0RlY2ltYWwxMjhcIixcbiAgICAvLyBtb2RpZmllcnNcbiAgICBcImNvbnN0XCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICAvLyBhbGlhc2VzXG4gICAgXCJjb21wbGV4XCIsXG4gICAgXCJib29sXCIsXG4gICAgXCJpbWFnaW5hcnlcIlxuICBdO1xuXG4gIGNvbnN0IEtFWVdPUkRTID0ge1xuICAgIGtleXdvcmQ6IENfS0VZV09SRFMsXG4gICAgdHlwZTogQ19UWVBFUyxcbiAgICBsaXRlcmFsOiAndHJ1ZSBmYWxzZSBOVUxMJyxcbiAgICAvLyBUT0RPOiBhcHBseSBoaW50aW5nIHdvcmsgc2ltaWxhciB0byB3aGF0IHdhcyBkb25lIGluIGNwcC5qc1xuICAgIGJ1aWx0X2luOiAnc3RkIHN0cmluZyB3c3RyaW5nIGNpbiBjb3V0IGNlcnIgY2xvZyBzdGRpbiBzdGRvdXQgc3RkZXJyIHN0cmluZ3N0cmVhbSBpc3RyaW5nc3RyZWFtIG9zdHJpbmdzdHJlYW0gJ1xuICAgICAgKyAnYXV0b19wdHIgZGVxdWUgbGlzdCBxdWV1ZSBzdGFjayB2ZWN0b3IgbWFwIHNldCBwYWlyIGJpdHNldCBtdWx0aXNldCBtdWx0aW1hcCB1bm9yZGVyZWRfc2V0ICdcbiAgICAgICsgJ3Vub3JkZXJlZF9tYXAgdW5vcmRlcmVkX211bHRpc2V0IHVub3JkZXJlZF9tdWx0aW1hcCBwcmlvcml0eV9xdWV1ZSBtYWtlX3BhaXIgYXJyYXkgc2hhcmVkX3B0ciBhYm9ydCB0ZXJtaW5hdGUgYWJzIGFjb3MgJ1xuICAgICAgKyAnYXNpbiBhdGFuMiBhdGFuIGNhbGxvYyBjZWlsIGNvc2ggY29zIGV4aXQgZXhwIGZhYnMgZmxvb3IgZm1vZCBmcHJpbnRmIGZwdXRzIGZyZWUgZnJleHAgJ1xuICAgICAgKyAnZnNjYW5mIGZ1dHVyZSBpc2FsbnVtIGlzYWxwaGEgaXNjbnRybCBpc2RpZ2l0IGlzZ3JhcGggaXNsb3dlciBpc3ByaW50IGlzcHVuY3QgaXNzcGFjZSBpc3VwcGVyICdcbiAgICAgICsgJ2lzeGRpZ2l0IHRvbG93ZXIgdG91cHBlciBsYWJzIGxkZXhwIGxvZzEwIGxvZyBtYWxsb2MgcmVhbGxvYyBtZW1jaHIgbWVtY21wIG1lbWNweSBtZW1zZXQgbW9kZiBwb3cgJ1xuICAgICAgKyAncHJpbnRmIHB1dGNoYXIgcHV0cyBzY2FuZiBzaW5oIHNpbiBzbnByaW50ZiBzcHJpbnRmIHNxcnQgc3NjYW5mIHN0cmNhdCBzdHJjaHIgc3RyY21wICdcbiAgICAgICsgJ3N0cmNweSBzdHJjc3BuIHN0cmxlbiBzdHJuY2F0IHN0cm5jbXAgc3RybmNweSBzdHJwYnJrIHN0cnJjaHIgc3Ryc3BuIHN0cnN0ciB0YW5oIHRhbiAnXG4gICAgICArICd2ZnByaW50ZiB2cHJpbnRmIHZzcHJpbnRmIGVuZGwgaW5pdGlhbGl6ZXJfbGlzdCB1bmlxdWVfcHRyJyxcbiAgfTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRBSU5TID0gW1xuICAgIFBSRVBST0NFU1NPUixcbiAgICBUWVBFUyxcbiAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgTlVNQkVSUyxcbiAgICBTVFJJTkdTXG4gIF07XG5cbiAgY29uc3QgRVhQUkVTU0lPTl9DT05URVhUID0ge1xuICAgIC8vIFRoaXMgbW9kZSBjb3ZlcnMgZXhwcmVzc2lvbiBjb250ZXh0IHdoZXJlIHdlIGNhbid0IGV4cGVjdCBhIGZ1bmN0aW9uXG4gICAgLy8gZGVmaW5pdGlvbiBhbmQgc2hvdWxkbid0IGhpZ2hsaWdodCBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2Ugb25lOlxuICAgIC8vIGByZXR1cm4gc29tZSgpYCwgYGVsc2UgaWYoKWAsIGAoeCpzdW0oMSwgMikpYFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPS8sXG4gICAgICAgIGVuZDogLzsvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICduZXcgdGhyb3cgcmV0dXJuIGVsc2UnLFxuICAgICAgICBlbmQ6IC87L1xuICAgICAgfVxuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBFWFBSRVNTSU9OX0NPTlRBSU5TLmNvbmNhdChbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICBjb250YWluczogRVhQUkVTU0lPTl9DT05UQUlOUy5jb25jYXQoWyAnc2VsZicgXSksXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfVxuICAgIF0pLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX0RFQ0xBUkFUSU9OID0ge1xuICAgIGJlZ2luOiAnKCcgKyBGVU5DVElPTl9UWVBFX1JFICsgJ1tcXFxcKiZcXFxcc10rKSsnICsgRlVOQ1RJT05fVElUTEUsXG4gICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgZW5kOiAvW3s7PV0vLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC9bXlxcd1xcc1xcKiY6PD4uXS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgICBiZWdpbjogREVDTFRZUEVfQVVUT19SRSxcbiAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBGVU5DVElPTl9USVRMRSxcbiAgICAgICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuaW5oZXJpdChUSVRMRV9NT0RFLCB7IGNsYXNzTmFtZTogXCJ0aXRsZS5mdW5jdGlvblwiIH0pIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIC8vIGFsbG93IGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMsIGUuZy46XG4gICAgICAvLyBleHRlcm4gdm9pZCBmKGludCksIGcoY2hhcik7XG4gICAgICB7XG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgbWF0Y2g6IC8sL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICBOVU1CRVJTLFxuICAgICAgICAgIFRZUEVTLFxuICAgICAgICAgIC8vIENvdW50IG1hdGNoaW5nIHBhcmVudGhlc2VzLlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICAgICAgICAgIFNUUklOR1MsXG4gICAgICAgICAgICAgIE5VTUJFUlMsXG4gICAgICAgICAgICAgIFRZUEVTXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgVFlQRVMsXG4gICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIFBSRVBST0NFU1NPUlxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiQ1wiLFxuICAgIGFsaWFzZXM6IFsgJ2gnIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIC8vIFVudGlsIGRpZmZlcmVudGlhdGlvbnMgYXJlIGFkZGVkIGJldHdlZW4gYGNgIGFuZCBgY3BwYCwgYGNgIHdpbGxcbiAgICAvLyBub3QgYmUgYXV0by1kZXRlY3RlZCB0byBhdm9pZCBhdXRvLWRldGVjdCBjb25mbGljdHMgYmV0d2VlbiBDIGFuZCBDKytcbiAgICBkaXNhYmxlQXV0b2RldGVjdDogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNvbnRhaW5zOiBbXS5jb25jYXQoXG4gICAgICBFWFBSRVNTSU9OX0NPTlRFWFQsXG4gICAgICBGVU5DVElPTl9ERUNMQVJBVElPTixcbiAgICAgIEVYUFJFU1NJT05fQ09OVEFJTlMsXG4gICAgICBbXG4gICAgICAgIFBSRVBST0NFU1NPUixcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiBobGpzLklERU5UX1JFICsgJzo6JyxcbiAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2NsYXNzJyxcbiAgICAgICAgICBiZWdpbktleXdvcmRzOiAnZW51bSBjbGFzcyBzdHJ1Y3QgdW5pb24nLFxuICAgICAgICAgIGVuZDogL1t7Ozo8Pj1dLyxcbiAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgeyBiZWdpbktleXdvcmRzOiBcImZpbmFsIGNsYXNzIHN0cnVjdFwiIH0sXG4gICAgICAgICAgICBobGpzLlRJVExFX01PREVcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0pLFxuICAgIGV4cG9ydHM6IHtcbiAgICAgIHByZXByb2Nlc3NvcjogUFJFUFJPQ0VTU09SLFxuICAgICAgc3RyaW5nczogU1RSSU5HUyxcbiAgICAgIGtleXdvcmRzOiBLRVlXT1JEU1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IHsgYyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBDKytcbkNhdGVnb3J5OiBjb21tb24sIHN5c3RlbVxuV2Vic2l0ZTogaHR0cHM6Ly9pc29jcHAub3JnXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gY3BwKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICAvLyBhZGRlZCBmb3IgaGlzdG9yaWMgcmVhc29ucyBiZWNhdXNlIGBobGpzLkNfTElORV9DT01NRU5UX01PREVgIGRvZXNcbiAgLy8gbm90IGluY2x1ZGUgc3VjaCBzdXBwb3J0IG5vciBjYW4gd2UgYmUgc3VyZSBhbGwgdGhlIGdyYW1tYXJzIGRlcGVuZGluZ1xuICAvLyBvbiBpdCB3b3VsZCBkZXNpcmUgdGhpcyBiZWhhdmlvclxuICBjb25zdCBDX0xJTkVfQ09NTUVOVF9NT0RFID0gaGxqcy5DT01NRU5UKCcvLycsICckJywgeyBjb250YWluczogWyB7IGJlZ2luOiAvXFxcXFxcbi8gfSBdIH0pO1xuICBjb25zdCBERUNMVFlQRV9BVVRPX1JFID0gJ2RlY2x0eXBlXFxcXChhdXRvXFxcXCknO1xuICBjb25zdCBOQU1FU1BBQ0VfUkUgPSAnW2EtekEtWl9dXFxcXHcqOjonO1xuICBjb25zdCBURU1QTEFURV9BUkdVTUVOVF9SRSA9ICc8W148Pl0rPic7XG4gIGNvbnN0IEZVTkNUSU9OX1RZUEVfUkUgPSAnKD8hc3RydWN0KSgnXG4gICAgKyBERUNMVFlQRV9BVVRPX1JFICsgJ3wnXG4gICAgKyByZWdleC5vcHRpb25hbChOQU1FU1BBQ0VfUkUpXG4gICAgKyAnW2EtekEtWl9dXFxcXHcqJyArIHJlZ2V4Lm9wdGlvbmFsKFRFTVBMQVRFX0FSR1VNRU5UX1JFKVxuICArICcpJztcblxuICBjb25zdCBDUFBfUFJJTUlUSVZFX1RZUEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgIGJlZ2luOiAnXFxcXGJbYS16XFxcXGRfXSpfdFxcXFxiJ1xuICB9O1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9sYW5ndWFnZS9lc2NhcGVcbiAgLy8gXFxcXCBcXHggXFx4RkYgXFx1MjgzNyBcXHUwMDMyMzc0NyBcXDM3NFxuICBjb25zdCBDSEFSQUNURVJfRVNDQVBFUyA9ICdcXFxcXFxcXCh4WzAtOUEtRmEtZl17Mn18dVswLTlBLUZhLWZdezQsOH18WzAtN117M318XFxcXFMpJztcbiAgY29uc3QgU1RSSU5HUyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnKHU4P3xVfEwpP1wiJyxcbiAgICAgICAgZW5kOiAnXCInLFxuICAgICAgICBpbGxlZ2FsOiAnXFxcXG4nLFxuICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICcodTg/fFV8TCk/XFwnKCcgKyBDSEFSQUNURVJfRVNDQVBFUyArICd8LiknLFxuICAgICAgICBlbmQ6ICdcXCcnLFxuICAgICAgICBpbGxlZ2FsOiAnLidcbiAgICAgIH0sXG4gICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgYmVnaW46IC8oPzp1OD98VXxMKT9SXCIoW14oKVxcXFwgXXswLDE2fSlcXCgvLFxuICAgICAgICBlbmQ6IC9cXCkoW14oKVxcXFwgXXswLDE2fSlcIi9cbiAgICAgIH0pXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IE5VTUJFUlMgPSB7XG4gICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogJ1xcXFxiKDBiWzAxXFwnXSspJyB9LFxuICAgICAgeyBiZWdpbjogJygtPylcXFxcYihbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoKGxsfExMfGx8TCkodXxVKT98KHV8VSkobGx8TEx8bHxMKT98ZnxGfGJ8QiknIH0sXG4gICAgICB7IGJlZ2luOiAnKC0/KShcXFxcYjBbeFhdW2EtZkEtRjAtOVxcJ10rfChcXFxcYltcXFxcZFxcJ10rKFxcXFwuW1xcXFxkXFwnXSopP3xcXFxcLltcXFxcZFxcJ10rKShbZUVdWy0rXT9bXFxcXGRcXCddKyk/KScgfVxuICAgIF0sXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgUFJFUFJPQ0VTU09SID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAvI1xccypbYS16XStcXGIvLFxuICAgIGVuZDogLyQvLFxuICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6XG4gICAgICAgICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSAnXG4gICAgICAgICsgJ3ByYWdtYSBfUHJhZ21hIGlmZGVmIGlmbmRlZiBpbmNsdWRlJyB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxcXFxcbi8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIGhsanMuaW5oZXJpdChTVFJJTkdTLCB7IGNsYXNzTmFtZTogJ3N0cmluZycgfSksXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIGJlZ2luOiAvPC4qPz4vXG4gICAgICB9LFxuICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgVElUTEVfTU9ERSA9IHtcbiAgICBjbGFzc05hbWU6ICd0aXRsZScsXG4gICAgYmVnaW46IHJlZ2V4Lm9wdGlvbmFsKE5BTUVTUEFDRV9SRSkgKyBobGpzLklERU5UX1JFLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX1RJVExFID0gcmVnZXgub3B0aW9uYWwoTkFNRVNQQUNFX1JFKSArIGhsanMuSURFTlRfUkUgKyAnXFxcXHMqXFxcXCgnO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX0tFWVdPUkRTID0gW1xuICAgICdhbGlnbmFzJyxcbiAgICAnYWxpZ25vZicsXG4gICAgJ2FuZCcsXG4gICAgJ2FuZF9lcScsXG4gICAgJ2FzbScsXG4gICAgJ2F0b21pY19jYW5jZWwnLFxuICAgICdhdG9taWNfY29tbWl0JyxcbiAgICAnYXRvbWljX25vZXhjZXB0JyxcbiAgICAnYXV0bycsXG4gICAgJ2JpdGFuZCcsXG4gICAgJ2JpdG9yJyxcbiAgICAnYnJlYWsnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvX2F3YWl0JyxcbiAgICAnY29fcmV0dXJuJyxcbiAgICAnY29feWllbGQnLFxuICAgICdjb21wbCcsXG4gICAgJ2NvbmNlcHQnLFxuICAgICdjb25zdF9jYXN0fDEwJyxcbiAgICAnY29uc3RldmFsJyxcbiAgICAnY29uc3RleHByJyxcbiAgICAnY29uc3Rpbml0JyxcbiAgICAnY29udGludWUnLFxuICAgICdkZWNsdHlwZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdkZWxldGUnLFxuICAgICdkbycsXG4gICAgJ2R5bmFtaWNfY2FzdHwxMCcsXG4gICAgJ2Vsc2UnLFxuICAgICdlbnVtJyxcbiAgICAnZXhwbGljaXQnLFxuICAgICdleHBvcnQnLFxuICAgICdleHRlcm4nLFxuICAgICdmYWxzZScsXG4gICAgJ2ZpbmFsJyxcbiAgICAnZm9yJyxcbiAgICAnZnJpZW5kJyxcbiAgICAnZ290bycsXG4gICAgJ2lmJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW5saW5lJyxcbiAgICAnbW9kdWxlJyxcbiAgICAnbXV0YWJsZScsXG4gICAgJ25hbWVzcGFjZScsXG4gICAgJ25ldycsXG4gICAgJ25vZXhjZXB0JyxcbiAgICAnbm90JyxcbiAgICAnbm90X2VxJyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ29wZXJhdG9yJyxcbiAgICAnb3InLFxuICAgICdvcl9lcScsXG4gICAgJ292ZXJyaWRlJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3JlZmxleHByJyxcbiAgICAncmVnaXN0ZXInLFxuICAgICdyZWludGVycHJldF9jYXN0fDEwJyxcbiAgICAncmVxdWlyZXMnLFxuICAgICdyZXR1cm4nLFxuICAgICdzaXplb2YnLFxuICAgICdzdGF0aWNfYXNzZXJ0JyxcbiAgICAnc3RhdGljX2Nhc3R8MTAnLFxuICAgICdzdHJ1Y3QnLFxuICAgICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLFxuICAgICd0ZW1wbGF0ZScsXG4gICAgJ3RoaXMnLFxuICAgICd0aHJlYWRfbG9jYWwnLFxuICAgICd0aHJvdycsXG4gICAgJ3RyYW5zYWN0aW9uX3NhZmUnLFxuICAgICd0cmFuc2FjdGlvbl9zYWZlX2R5bmFtaWMnLFxuICAgICd0cnVlJyxcbiAgICAndHJ5JyxcbiAgICAndHlwZWRlZicsXG4gICAgJ3R5cGVpZCcsXG4gICAgJ3R5cGVuYW1lJyxcbiAgICAndW5pb24nLFxuICAgICd1c2luZycsXG4gICAgJ3ZpcnR1YWwnLFxuICAgICd2b2xhdGlsZScsXG4gICAgJ3doaWxlJyxcbiAgICAneG9yJyxcbiAgICAneG9yX2VxJ1xuICBdO1xuXG4gIC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9rZXl3b3JkXG4gIGNvbnN0IFJFU0VSVkVEX1RZUEVTID0gW1xuICAgICdib29sJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXIxNl90JyxcbiAgICAnY2hhcjMyX3QnLFxuICAgICdjaGFyOF90JyxcbiAgICAnZG91YmxlJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdsb25nJyxcbiAgICAnc2hvcnQnLFxuICAgICd2b2lkJyxcbiAgICAnd2NoYXJfdCcsXG4gICAgJ3Vuc2lnbmVkJyxcbiAgICAnc2lnbmVkJyxcbiAgICAnY29uc3QnLFxuICAgICdzdGF0aWMnXG4gIF07XG5cbiAgY29uc3QgVFlQRV9ISU5UUyA9IFtcbiAgICAnYW55JyxcbiAgICAnYXV0b19wdHInLFxuICAgICdiYXJyaWVyJyxcbiAgICAnYmluYXJ5X3NlbWFwaG9yZScsXG4gICAgJ2JpdHNldCcsXG4gICAgJ2NvbXBsZXgnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGUnLFxuICAgICdjb25kaXRpb25fdmFyaWFibGVfYW55JyxcbiAgICAnY291bnRpbmdfc2VtYXBob3JlJyxcbiAgICAnZGVxdWUnLFxuICAgICdmYWxzZV90eXBlJyxcbiAgICAnZnV0dXJlJyxcbiAgICAnaW1hZ2luYXJ5JyxcbiAgICAnaW5pdGlhbGl6ZXJfbGlzdCcsXG4gICAgJ2lzdHJpbmdzdHJlYW0nLFxuICAgICdqdGhyZWFkJyxcbiAgICAnbGF0Y2gnLFxuICAgICdsb2NrX2d1YXJkJyxcbiAgICAnbXVsdGltYXAnLFxuICAgICdtdWx0aXNldCcsXG4gICAgJ211dGV4JyxcbiAgICAnb3B0aW9uYWwnLFxuICAgICdvc3RyaW5nc3RyZWFtJyxcbiAgICAncGFja2FnZWRfdGFzaycsXG4gICAgJ3BhaXInLFxuICAgICdwcm9taXNlJyxcbiAgICAncHJpb3JpdHlfcXVldWUnLFxuICAgICdxdWV1ZScsXG4gICAgJ3JlY3Vyc2l2ZV9tdXRleCcsXG4gICAgJ3JlY3Vyc2l2ZV90aW1lZF9tdXRleCcsXG4gICAgJ3Njb3BlZF9sb2NrJyxcbiAgICAnc2V0JyxcbiAgICAnc2hhcmVkX2Z1dHVyZScsXG4gICAgJ3NoYXJlZF9sb2NrJyxcbiAgICAnc2hhcmVkX211dGV4JyxcbiAgICAnc2hhcmVkX3RpbWVkX211dGV4JyxcbiAgICAnc2hhcmVkX3B0cicsXG4gICAgJ3N0YWNrJyxcbiAgICAnc3RyaW5nX3ZpZXcnLFxuICAgICdzdHJpbmdzdHJlYW0nLFxuICAgICd0aW1lZF9tdXRleCcsXG4gICAgJ3RocmVhZCcsXG4gICAgJ3RydWVfdHlwZScsXG4gICAgJ3R1cGxlJyxcbiAgICAndW5pcXVlX2xvY2snLFxuICAgICd1bmlxdWVfcHRyJyxcbiAgICAndW5vcmRlcmVkX21hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aW1hcCcsXG4gICAgJ3Vub3JkZXJlZF9tdWx0aXNldCcsXG4gICAgJ3Vub3JkZXJlZF9zZXQnLFxuICAgICd2YXJpYW50JyxcbiAgICAndmVjdG9yJyxcbiAgICAnd2Vha19wdHInLFxuICAgICd3c3RyaW5nJyxcbiAgICAnd3N0cmluZ192aWV3J1xuICBdO1xuXG4gIGNvbnN0IEZVTkNUSU9OX0hJTlRTID0gW1xuICAgICdhYm9ydCcsXG4gICAgJ2FicycsXG4gICAgJ2Fjb3MnLFxuICAgICdhcHBseScsXG4gICAgJ2FzX2NvbnN0JyxcbiAgICAnYXNpbicsXG4gICAgJ2F0YW4nLFxuICAgICdhdGFuMicsXG4gICAgJ2NhbGxvYycsXG4gICAgJ2NlaWwnLFxuICAgICdjZXJyJyxcbiAgICAnY2luJyxcbiAgICAnY2xvZycsXG4gICAgJ2NvcycsXG4gICAgJ2Nvc2gnLFxuICAgICdjb3V0JyxcbiAgICAnZGVjbHZhbCcsXG4gICAgJ2VuZGwnLFxuICAgICdleGNoYW5nZScsXG4gICAgJ2V4aXQnLFxuICAgICdleHAnLFxuICAgICdmYWJzJyxcbiAgICAnZmxvb3InLFxuICAgICdmbW9kJyxcbiAgICAnZm9yd2FyZCcsXG4gICAgJ2ZwcmludGYnLFxuICAgICdmcHV0cycsXG4gICAgJ2ZyZWUnLFxuICAgICdmcmV4cCcsXG4gICAgJ2ZzY2FuZicsXG4gICAgJ2Z1dHVyZScsXG4gICAgJ2ludm9rZScsXG4gICAgJ2lzYWxudW0nLFxuICAgICdpc2FscGhhJyxcbiAgICAnaXNjbnRybCcsXG4gICAgJ2lzZGlnaXQnLFxuICAgICdpc2dyYXBoJyxcbiAgICAnaXNsb3dlcicsXG4gICAgJ2lzcHJpbnQnLFxuICAgICdpc3B1bmN0JyxcbiAgICAnaXNzcGFjZScsXG4gICAgJ2lzdXBwZXInLFxuICAgICdpc3hkaWdpdCcsXG4gICAgJ2xhYnMnLFxuICAgICdsYXVuZGVyJyxcbiAgICAnbGRleHAnLFxuICAgICdsb2cnLFxuICAgICdsb2cxMCcsXG4gICAgJ21ha2VfcGFpcicsXG4gICAgJ21ha2Vfc2hhcmVkJyxcbiAgICAnbWFrZV9zaGFyZWRfZm9yX292ZXJ3cml0ZScsXG4gICAgJ21ha2VfdHVwbGUnLFxuICAgICdtYWtlX3VuaXF1ZScsXG4gICAgJ21hbGxvYycsXG4gICAgJ21lbWNocicsXG4gICAgJ21lbWNtcCcsXG4gICAgJ21lbWNweScsXG4gICAgJ21lbXNldCcsXG4gICAgJ21vZGYnLFxuICAgICdtb3ZlJyxcbiAgICAncG93JyxcbiAgICAncHJpbnRmJyxcbiAgICAncHV0Y2hhcicsXG4gICAgJ3B1dHMnLFxuICAgICdyZWFsbG9jJyxcbiAgICAnc2NhbmYnLFxuICAgICdzaW4nLFxuICAgICdzaW5oJyxcbiAgICAnc25wcmludGYnLFxuICAgICdzcHJpbnRmJyxcbiAgICAnc3FydCcsXG4gICAgJ3NzY2FuZicsXG4gICAgJ3N0ZCcsXG4gICAgJ3N0ZGVycicsXG4gICAgJ3N0ZGluJyxcbiAgICAnc3Rkb3V0JyxcbiAgICAnc3RyY2F0JyxcbiAgICAnc3RyY2hyJyxcbiAgICAnc3RyY21wJyxcbiAgICAnc3RyY3B5JyxcbiAgICAnc3RyY3NwbicsXG4gICAgJ3N0cmxlbicsXG4gICAgJ3N0cm5jYXQnLFxuICAgICdzdHJuY21wJyxcbiAgICAnc3RybmNweScsXG4gICAgJ3N0cnBicmsnLFxuICAgICdzdHJyY2hyJyxcbiAgICAnc3Ryc3BuJyxcbiAgICAnc3Ryc3RyJyxcbiAgICAnc3dhcCcsXG4gICAgJ3RhbicsXG4gICAgJ3RhbmgnLFxuICAgICd0ZXJtaW5hdGUnLFxuICAgICd0b191bmRlcmx5aW5nJyxcbiAgICAndG9sb3dlcicsXG4gICAgJ3RvdXBwZXInLFxuICAgICd2ZnByaW50ZicsXG4gICAgJ3Zpc2l0JyxcbiAgICAndnByaW50ZicsXG4gICAgJ3ZzcHJpbnRmJ1xuICBdO1xuXG4gIGNvbnN0IExJVEVSQUxTID0gW1xuICAgICdOVUxMJyxcbiAgICAnZmFsc2UnLFxuICAgICdudWxsb3B0JyxcbiAgICAnbnVsbHB0cicsXG4gICAgJ3RydWUnXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2tleXdvcmRcbiAgY29uc3QgQlVJTFRfSU4gPSBbICdfUHJhZ21hJyBdO1xuXG4gIGNvbnN0IENQUF9LRVlXT1JEUyA9IHtcbiAgICB0eXBlOiBSRVNFUlZFRF9UWVBFUyxcbiAgICBrZXl3b3JkOiBSRVNFUlZFRF9LRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU4sXG4gICAgX3R5cGVfaGludHM6IFRZUEVfSElOVFNcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ESVNQQVRDSCA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbi5kaXNwYXRjaCcsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAvLyBPbmx5IGZvciByZWxldmFuY2UsIG5vdCBoaWdobGlnaHRpbmcuXG4gICAgICBfaGludDogRlVOQ1RJT05fSElOVFMgfSxcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1xcYi8sXG4gICAgICAvKD8hZGVjbHR5cGUpLyxcbiAgICAgIC8oPyFpZikvLFxuICAgICAgLyg/IWZvcikvLFxuICAgICAgLyg/IXN3aXRjaCkvLFxuICAgICAgLyg/IXdoaWxlKS8sXG4gICAgICBobGpzLklERU5UX1JFLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC8oPFtePD5dKz58KVxccypcXCgvKSlcbiAgfTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRBSU5TID0gW1xuICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgIFBSRVBST0NFU1NPUixcbiAgICBDUFBfUFJJTUlUSVZFX1RZUEVTLFxuICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBOVU1CRVJTLFxuICAgIFNUUklOR1NcbiAgXTtcblxuICBjb25zdCBFWFBSRVNTSU9OX0NPTlRFWFQgPSB7XG4gICAgLy8gVGhpcyBtb2RlIGNvdmVycyBleHByZXNzaW9uIGNvbnRleHQgd2hlcmUgd2UgY2FuJ3QgZXhwZWN0IGEgZnVuY3Rpb25cbiAgICAvLyBkZWZpbml0aW9uIGFuZCBzaG91bGRuJ3QgaGlnaGxpZ2h0IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBvbmU6XG4gICAgLy8gYHJldHVybiBzb21lKClgLCBgZWxzZSBpZigpYCwgYCh4KnN1bSgxLCAyKSlgXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC89LyxcbiAgICAgICAgZW5kOiAvOy9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25ldyB0aHJvdyByZXR1cm4gZWxzZScsXG4gICAgICAgIGVuZDogLzsvXG4gICAgICB9XG4gICAgXSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBFWFBSRVNTSU9OX0NPTlRBSU5TLmNvbmNhdChbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IEVYUFJFU1NJT05fQ09OVEFJTlMuY29uY2F0KFsgJ3NlbGYnIF0pLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdKSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgYmVnaW46ICcoJyArIEZVTkNUSU9OX1RZUEVfUkUgKyAnW1xcXFwqJlxcXFxzXSspKycgKyBGVU5DVElPTl9USVRMRSxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBlbmQ6IC9bezs9XS8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC9bXlxcd1xcc1xcKiY6PD4uXS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgICBiZWdpbjogREVDTFRZUEVfQVVUT19SRSxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogRlVOQ1RJT05fVElUTEUsXG4gICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICBjb250YWluczogWyBUSVRMRV9NT0RFIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIGxvb2stYmVoaW5kIG9uIHRoZSBiZWxvdyBydWxlXG4gICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZ3JhYmJpbmcgdGhlIGZpbmFsIDogaW4gYSA6OiBwYWlyXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOjovLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICAvLyBpbml0aWFsaXplcnNcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC86LyxcbiAgICAgICAgZW5kc1dpdGhQYXJlbnQ6IHRydWUsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICBOVU1CRVJTXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAvLyBhbGxvdyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLCBlLmcuOlxuICAgICAgLy8gZXh0ZXJuIHZvaWQgZihpbnQpLCBnKGNoYXIpO1xuICAgICAge1xuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIG1hdGNoOiAvLC9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIENfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBTVFJJTkdTLFxuICAgICAgICAgIE5VTUJFUlMsXG4gICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFUyxcbiAgICAgICAgICAvLyBDb3VudCBtYXRjaGluZyBwYXJlbnRoZXNlcy5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICAgICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgICdzZWxmJyxcbiAgICAgICAgICAgICAgQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICAgICAgU1RSSU5HUyxcbiAgICAgICAgICAgICAgTlVNQkVSUyxcbiAgICAgICAgICAgICAgQ1BQX1BSSU1JVElWRV9UWVBFU1xuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIENQUF9QUklNSVRJVkVfVFlQRVMsXG4gICAgICBDX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIFBSRVBST0NFU1NPUlxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdDKysnLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdjYycsXG4gICAgICAnYysrJyxcbiAgICAgICdoKysnLFxuICAgICAgJ2hwcCcsXG4gICAgICAnaGgnLFxuICAgICAgJ2h4eCcsXG4gICAgICAnY3h4J1xuICAgIF0sXG4gICAga2V5d29yZHM6IENQUF9LRVlXT1JEUyxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNsYXNzTmFtZUFsaWFzZXM6IHsgJ2Z1bmN0aW9uLmRpc3BhdGNoJzogJ2J1aWx0X2luJyB9LFxuICAgIGNvbnRhaW5zOiBbXS5jb25jYXQoXG4gICAgICBFWFBSRVNTSU9OX0NPTlRFWFQsXG4gICAgICBGVU5DVElPTl9ERUNMQVJBVElPTixcbiAgICAgIEZVTkNUSU9OX0RJU1BBVENILFxuICAgICAgRVhQUkVTU0lPTl9DT05UQUlOUyxcbiAgICAgIFtcbiAgICAgICAgUFJFUFJPQ0VTU09SLFxuICAgICAgICB7IC8vIGNvbnRhaW5lcnM6IGllLCBgdmVjdG9yIDxpbnQ+IHJvb21zICg5KTtgXG4gICAgICAgICAgYmVnaW46ICdcXFxcYihkZXF1ZXxsaXN0fHF1ZXVlfHByaW9yaXR5X3F1ZXVlfHBhaXJ8c3RhY2t8dmVjdG9yfG1hcHxzZXR8Yml0c2V0fG11bHRpc2V0fG11bHRpbWFwfHVub3JkZXJlZF9tYXB8dW5vcmRlcmVkX3NldHx1bm9yZGVyZWRfbXVsdGlzZXR8dW5vcmRlcmVkX211bHRpbWFwfGFycmF5fHR1cGxlfG9wdGlvbmFsfHZhcmlhbnR8ZnVuY3Rpb24pXFxcXHMqPCg/ITwpJyxcbiAgICAgICAgICBlbmQ6ICc+JyxcbiAgICAgICAgICBrZXl3b3JkczogQ1BQX0tFWVdPUkRTLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgICBDUFBfUFJJTUlUSVZFX1RZUEVTXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46IGhsanMuSURFTlRfUkUgKyAnOjonLFxuICAgICAgICAgIGtleXdvcmRzOiBDUFBfS0VZV09SRFNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgICAvLyBleHRyYSBjb21wbGV4aXR5IHRvIGRlYWwgd2l0aCBgZW51bSBjbGFzc2AgYW5kIGBlbnVtIHN0cnVjdGBcbiAgICAgICAgICAgIC9cXGIoPzplbnVtKD86XFxzKyg/OmNsYXNzfHN0cnVjdCkpP3xjbGFzc3xzdHJ1Y3R8dW5pb24pLyxcbiAgICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICAgIC9cXHcrL1xuICAgICAgICAgIF0sXG4gICAgICAgICAgY2xhc3NOYW1lOiB7XG4gICAgICAgICAgICAxOiAna2V5d29yZCcsXG4gICAgICAgICAgICAzOiAndGl0bGUuY2xhc3MnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdKVxuICB9O1xufVxuXG5leHBvcnQgeyBjcHAgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogQyNcbkF1dGhvcjogSmFzb24gRGlhbW9uZCA8amFzb25AZGlhbW9uZC5uYW1lPlxuQ29udHJpYnV0b3I6IE5pY29sYXMgTExPQkVSQSA8bmxsb2JlcmFAZ21haWwuY29tPiwgUGlldGVyIFZhbnRvcnJlIDxwaWV0ZXJ2YW50b3JyZUBnbWFpbC5jb20+LCBEYXZpZCBQaW5lIDxkYXZpZC5waW5lQG1pY3Jvc29mdC5jb20+XG5XZWJzaXRlOiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9kb3RuZXQvY3NoYXJwL1xuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIGNzaGFycChobGpzKSB7XG4gIGNvbnN0IEJVSUxUX0lOX0tFWVdPUkRTID0gW1xuICAgICdib29sJyxcbiAgICAnYnl0ZScsXG4gICAgJ2NoYXInLFxuICAgICdkZWNpbWFsJyxcbiAgICAnZGVsZWdhdGUnLFxuICAgICdkb3VibGUnLFxuICAgICdkeW5hbWljJyxcbiAgICAnZW51bScsXG4gICAgJ2Zsb2F0JyxcbiAgICAnaW50JyxcbiAgICAnbG9uZycsXG4gICAgJ25pbnQnLFxuICAgICdudWludCcsXG4gICAgJ29iamVjdCcsXG4gICAgJ3NieXRlJyxcbiAgICAnc2hvcnQnLFxuICAgICdzdHJpbmcnLFxuICAgICd1bG9uZycsXG4gICAgJ3VpbnQnLFxuICAgICd1c2hvcnQnXG4gIF07XG4gIGNvbnN0IEZVTkNUSU9OX01PRElGSUVSUyA9IFtcbiAgICAncHVibGljJyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3N0YXRpYycsXG4gICAgJ2ludGVybmFsJyxcbiAgICAncHJvdGVjdGVkJyxcbiAgICAnYWJzdHJhY3QnLFxuICAgICdhc3luYycsXG4gICAgJ2V4dGVybicsXG4gICAgJ292ZXJyaWRlJyxcbiAgICAndW5zYWZlJyxcbiAgICAndmlydHVhbCcsXG4gICAgJ25ldycsXG4gICAgJ3NlYWxlZCcsXG4gICAgJ3BhcnRpYWwnXG4gIF07XG4gIGNvbnN0IExJVEVSQUxfS0VZV09SRFMgPSBbXG4gICAgJ2RlZmF1bHQnLFxuICAgICdmYWxzZScsXG4gICAgJ251bGwnLFxuICAgICd0cnVlJ1xuICBdO1xuICBjb25zdCBOT1JNQUxfS0VZV09SRFMgPSBbXG4gICAgJ2Fic3RyYWN0JyxcbiAgICAnYXMnLFxuICAgICdiYXNlJyxcbiAgICAnYnJlYWsnLFxuICAgICdjYXNlJyxcbiAgICAnY2F0Y2gnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvbnN0JyxcbiAgICAnY29udGludWUnLFxuICAgICdkbycsXG4gICAgJ2Vsc2UnLFxuICAgICdldmVudCcsXG4gICAgJ2V4cGxpY2l0JyxcbiAgICAnZXh0ZXJuJyxcbiAgICAnZmluYWxseScsXG4gICAgJ2ZpeGVkJyxcbiAgICAnZm9yJyxcbiAgICAnZm9yZWFjaCcsXG4gICAgJ2dvdG8nLFxuICAgICdpZicsXG4gICAgJ2ltcGxpY2l0JyxcbiAgICAnaW4nLFxuICAgICdpbnRlcmZhY2UnLFxuICAgICdpbnRlcm5hbCcsXG4gICAgJ2lzJyxcbiAgICAnbG9jaycsXG4gICAgJ25hbWVzcGFjZScsXG4gICAgJ25ldycsXG4gICAgJ29wZXJhdG9yJyxcbiAgICAnb3V0JyxcbiAgICAnb3ZlcnJpZGUnLFxuICAgICdwYXJhbXMnLFxuICAgICdwcml2YXRlJyxcbiAgICAncHJvdGVjdGVkJyxcbiAgICAncHVibGljJyxcbiAgICAncmVhZG9ubHknLFxuICAgICdyZWNvcmQnLFxuICAgICdyZWYnLFxuICAgICdyZXR1cm4nLFxuICAgICdzY29wZWQnLFxuICAgICdzZWFsZWQnLFxuICAgICdzaXplb2YnLFxuICAgICdzdGFja2FsbG9jJyxcbiAgICAnc3RhdGljJyxcbiAgICAnc3RydWN0JyxcbiAgICAnc3dpdGNoJyxcbiAgICAndGhpcycsXG4gICAgJ3Rocm93JyxcbiAgICAndHJ5JyxcbiAgICAndHlwZW9mJyxcbiAgICAndW5jaGVja2VkJyxcbiAgICAndW5zYWZlJyxcbiAgICAndXNpbmcnLFxuICAgICd2aXJ0dWFsJyxcbiAgICAndm9pZCcsXG4gICAgJ3ZvbGF0aWxlJyxcbiAgICAnd2hpbGUnXG4gIF07XG4gIGNvbnN0IENPTlRFWFRVQUxfS0VZV09SRFMgPSBbXG4gICAgJ2FkZCcsXG4gICAgJ2FsaWFzJyxcbiAgICAnYW5kJyxcbiAgICAnYXNjZW5kaW5nJyxcbiAgICAnYXN5bmMnLFxuICAgICdhd2FpdCcsXG4gICAgJ2J5JyxcbiAgICAnZGVzY2VuZGluZycsXG4gICAgJ2VxdWFscycsXG4gICAgJ2Zyb20nLFxuICAgICdnZXQnLFxuICAgICdnbG9iYWwnLFxuICAgICdncm91cCcsXG4gICAgJ2luaXQnLFxuICAgICdpbnRvJyxcbiAgICAnam9pbicsXG4gICAgJ2xldCcsXG4gICAgJ25hbWVvZicsXG4gICAgJ25vdCcsXG4gICAgJ25vdG51bGwnLFxuICAgICdvbicsXG4gICAgJ29yJyxcbiAgICAnb3JkZXJieScsXG4gICAgJ3BhcnRpYWwnLFxuICAgICdyZW1vdmUnLFxuICAgICdzZWxlY3QnLFxuICAgICdzZXQnLFxuICAgICd1bm1hbmFnZWQnLFxuICAgICd2YWx1ZXwwJyxcbiAgICAndmFyJyxcbiAgICAnd2hlbicsXG4gICAgJ3doZXJlJyxcbiAgICAnd2l0aCcsXG4gICAgJ3lpZWxkJ1xuICBdO1xuXG4gIGNvbnN0IEtFWVdPUkRTID0ge1xuICAgIGtleXdvcmQ6IE5PUk1BTF9LRVlXT1JEUy5jb25jYXQoQ09OVEVYVFVBTF9LRVlXT1JEUyksXG4gICAgYnVpbHRfaW46IEJVSUxUX0lOX0tFWVdPUkRTLFxuICAgIGxpdGVyYWw6IExJVEVSQUxfS0VZV09SRFNcbiAgfTtcbiAgY29uc3QgVElUTEVfTU9ERSA9IGhsanMuaW5oZXJpdChobGpzLlRJVExFX01PREUsIHsgYmVnaW46ICdbYS16QS1aXShcXFxcLj9cXFxcdykqJyB9KTtcbiAgY29uc3QgTlVNQkVSUyA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiAnXFxcXGIoMGJbMDFcXCddKyknIH0sXG4gICAgICB7IGJlZ2luOiAnKC0/KVxcXFxiKFtcXFxcZFxcJ10rKFxcXFwuW1xcXFxkXFwnXSopP3xcXFxcLltcXFxcZFxcJ10rKSh1fFV8bHxMfHVsfFVMfGZ8RnxifEIpJyB9LFxuICAgICAgeyBiZWdpbjogJygtPykoXFxcXGIwW3hYXVthLWZBLUYwLTlcXCddK3woXFxcXGJbXFxcXGRcXCddKyhcXFxcLltcXFxcZFxcJ10qKT98XFxcXC5bXFxcXGRcXCddKykoW2VFXVstK10/W1xcXFxkXFwnXSspPyknIH1cbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuICBjb25zdCBWRVJCQVRJTV9TVFJJTkcgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBiZWdpbjogJ0BcIicsXG4gICAgZW5kOiAnXCInLFxuICAgIGNvbnRhaW5zOiBbIHsgYmVnaW46ICdcIlwiJyB9IF1cbiAgfTtcbiAgY29uc3QgVkVSQkFUSU1fU1RSSU5HX05PX0xGID0gaGxqcy5pbmhlcml0KFZFUkJBVElNX1NUUklORywgeyBpbGxlZ2FsOiAvXFxuLyB9KTtcbiAgY29uc3QgU1VCU1QgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3Vic3QnLFxuICAgIGJlZ2luOiAvXFx7LyxcbiAgICBlbmQ6IC9cXH0vLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEU1xuICB9O1xuICBjb25zdCBTVUJTVF9OT19MRiA9IGhsanMuaW5oZXJpdChTVUJTVCwgeyBpbGxlZ2FsOiAvXFxuLyB9KTtcbiAgY29uc3QgSU5URVJQT0xBVEVEX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXFwkXCIvLFxuICAgIGVuZDogJ1wiJyxcbiAgICBpbGxlZ2FsOiAvXFxuLyxcbiAgICBjb250YWluczogW1xuICAgICAgeyBiZWdpbjogL1xce1xcey8gfSxcbiAgICAgIHsgYmVnaW46IC9cXH1cXH0vIH0sXG4gICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICBTVUJTVF9OT19MRlxuICAgIF1cbiAgfTtcbiAgY29uc3QgSU5URVJQT0xBVEVEX1ZFUkJBVElNX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXFwkQFwiLyxcbiAgICBlbmQ6ICdcIicsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgYmVnaW46IC9cXHtcXHsvIH0sXG4gICAgICB7IGJlZ2luOiAvXFx9XFx9LyB9LFxuICAgICAgeyBiZWdpbjogJ1wiXCInIH0sXG4gICAgICBTVUJTVFxuICAgIF1cbiAgfTtcbiAgY29uc3QgSU5URVJQT0xBVEVEX1ZFUkJBVElNX1NUUklOR19OT19MRiA9IGhsanMuaW5oZXJpdChJTlRFUlBPTEFURURfVkVSQkFUSU1fU1RSSU5HLCB7XG4gICAgaWxsZWdhbDogL1xcbi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgYmVnaW46IC9cXHtcXHsvIH0sXG4gICAgICB7IGJlZ2luOiAvXFx9XFx9LyB9LFxuICAgICAgeyBiZWdpbjogJ1wiXCInIH0sXG4gICAgICBTVUJTVF9OT19MRlxuICAgIF1cbiAgfSk7XG4gIFNVQlNULmNvbnRhaW5zID0gW1xuICAgIElOVEVSUE9MQVRFRF9WRVJCQVRJTV9TVFJJTkcsXG4gICAgSU5URVJQT0xBVEVEX1NUUklORyxcbiAgICBWRVJCQVRJTV9TVFJJTkcsXG4gICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgTlVNQkVSUyxcbiAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gIF07XG4gIFNVQlNUX05PX0xGLmNvbnRhaW5zID0gW1xuICAgIElOVEVSUE9MQVRFRF9WRVJCQVRJTV9TVFJJTkdfTk9fTEYsXG4gICAgSU5URVJQT0xBVEVEX1NUUklORyxcbiAgICBWRVJCQVRJTV9TVFJJTkdfTk9fTEYsXG4gICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgTlVNQkVSUyxcbiAgICBobGpzLmluaGVyaXQoaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSwgeyBpbGxlZ2FsOiAvXFxuLyB9KVxuICBdO1xuICBjb25zdCBTVFJJTkcgPSB7IHZhcmlhbnRzOiBbXG4gICAgSU5URVJQT0xBVEVEX1ZFUkJBVElNX1NUUklORyxcbiAgICBJTlRFUlBPTEFURURfU1RSSU5HLFxuICAgIFZFUkJBVElNX1NUUklORyxcbiAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICBdIH07XG5cbiAgY29uc3QgR0VORVJJQ19NT0RJRklFUiA9IHtcbiAgICBiZWdpbjogXCI8XCIsXG4gICAgZW5kOiBcIj5cIixcbiAgICBjb250YWluczogW1xuICAgICAgeyBiZWdpbktleXdvcmRzOiBcImluIG91dFwiIH0sXG4gICAgICBUSVRMRV9NT0RFXG4gICAgXVxuICB9O1xuICBjb25zdCBUWVBFX0lERU5UX1JFID0gaGxqcy5JREVOVF9SRSArICcoPCcgKyBobGpzLklERU5UX1JFICsgJyhcXFxccyosXFxcXHMqJyArIGhsanMuSURFTlRfUkUgKyAnKSo+KT8oXFxcXFtcXFxcXSk/JztcbiAgY29uc3QgQVRfSURFTlRJRklFUiA9IHtcbiAgICAvLyBwcmV2ZW50cyBleHByZXNzaW9ucyBsaWtlIGBAY2xhc3NgIGZyb20gaW5jb3JyZWN0IGZsYWdnaW5nXG4gICAgLy8gYGNsYXNzYCBhcyBhIGtleXdvcmRcbiAgICBiZWdpbjogXCJAXCIgKyBobGpzLklERU5UX1JFLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0MjJyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAnY3MnLFxuICAgICAgJ2MjJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC86Oi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgJy8vLycsXG4gICAgICAgICckJyxcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYmVnaW46ICcvLy8nLFxuICAgICAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGJlZ2luOiAnPCEtLXwtLT4nIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYmVnaW46ICc8Lz8nLFxuICAgICAgICAgICAgICAgICAgZW5kOiAnPidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICAgICAgYmVnaW46ICcjJyxcbiAgICAgICAgZW5kOiAnJCcsXG4gICAgICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6ICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSByZWdpb24gZW5kcmVnaW9uIHByYWdtYSBjaGVja3N1bScgfVxuICAgICAgfSxcbiAgICAgIFNUUklORyxcbiAgICAgIE5VTUJFUlMsXG4gICAgICB7XG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICdjbGFzcyBpbnRlcmZhY2UnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGVuZDogL1t7Oz1dLyxcbiAgICAgICAgaWxsZWdhbDogL1teXFxzOixdLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7IGJlZ2luS2V5d29yZHM6IFwid2hlcmUgY2xhc3NcIiB9LFxuICAgICAgICAgIFRJVExFX01PREUsXG4gICAgICAgICAgR0VORVJJQ19NT0RJRklFUixcbiAgICAgICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbktleXdvcmRzOiAnbmFtZXNwYWNlJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBlbmQ6IC9bezs9XS8sXG4gICAgICAgIGlsbGVnYWw6IC9bXlxcczpdLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBUSVRMRV9NT0RFLFxuICAgICAgICAgIGhsanMuQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICdyZWNvcmQnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGVuZDogL1t7Oz1dLyxcbiAgICAgICAgaWxsZWdhbDogL1teXFxzOl0vLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIFRJVExFX01PREUsXG4gICAgICAgICAgR0VORVJJQ19NT0RJRklFUixcbiAgICAgICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBbQXR0cmlidXRlcyhcIlwiKV1cbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAnXlxcXFxzKlxcXFxbKD89W1xcXFx3XSknLFxuICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgIGVuZDogJ1xcXFxdJyxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgYmVnaW46IC9cIi8sXG4gICAgICAgICAgICBlbmQ6IC9cIi9cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIEV4cHJlc3Npb24ga2V5d29yZHMgcHJldmVudCAna2V5d29yZCBOYW1lKC4uLiknIGZyb20gYmVpbmdcbiAgICAgICAgLy8gcmVjb2duaXplZCBhcyBhIGZ1bmN0aW9uIGRlZmluaXRpb25cbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25ldyByZXR1cm4gdGhyb3cgYXdhaXQgZWxzZScsXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnZnVuY3Rpb24nLFxuICAgICAgICBiZWdpbjogJygnICsgVFlQRV9JREVOVF9SRSArICdcXFxccyspKycgKyBobGpzLklERU5UX1JFICsgJ1xcXFxzKig8W149XSs+XFxcXHMqKT9cXFxcKCcsXG4gICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICBlbmQ6IC9cXHMqW3s7PV0vLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgLy8gcHJldmVudHMgdGhlc2UgZnJvbSBiZWluZyBoaWdobGlnaHRlZCBgdGl0bGVgXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW5LZXl3b3JkczogRlVOQ1RJT05fTU9ESUZJRVJTLmpvaW4oXCIgXCIpLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogaGxqcy5JREVOVF9SRSArICdcXFxccyooPFtePV0rPlxcXFxzKik/XFxcXCgnLFxuICAgICAgICAgICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICBobGpzLlRJVExFX01PREUsXG4gICAgICAgICAgICAgIEdFTkVSSUNfTU9ESUZJRVJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgbWF0Y2g6IC9cXChcXCkvIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgU1RSSU5HLFxuICAgICAgICAgICAgICBOVU1CRVJTLFxuICAgICAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgQVRfSURFTlRJRklFUlxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgY3NoYXJwIGFzIGRlZmF1bHQgfTtcbiIsICJjb25zdCBNT0RFUyA9IChobGpzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgSU1QT1JUQU5UOiB7XG4gICAgICBzY29wZTogJ21ldGEnLFxuICAgICAgYmVnaW46ICchaW1wb3J0YW50J1xuICAgIH0sXG4gICAgQkxPQ0tfQ09NTUVOVDogaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBIRVhDT0xPUjoge1xuICAgICAgc2NvcGU6ICdudW1iZXInLFxuICAgICAgYmVnaW46IC8jKChbMC05YS1mQS1GXXszLDR9KXwoKFswLTlhLWZBLUZdezJ9KXszLDR9KSlcXGIvXG4gICAgfSxcbiAgICBGVU5DVElPTl9ESVNQQVRDSDoge1xuICAgICAgY2xhc3NOYW1lOiBcImJ1aWx0X2luXCIsXG4gICAgICBiZWdpbjogL1tcXHctXSsoPz1cXCgpL1xuICAgIH0sXG4gICAgQVRUUklCVVRFX1NFTEVDVE9SX01PREU6IHtcbiAgICAgIHNjb3BlOiAnc2VsZWN0b3ItYXR0cicsXG4gICAgICBiZWdpbjogL1xcWy8sXG4gICAgICBlbmQ6IC9cXF0vLFxuICAgICAgaWxsZWdhbDogJyQnLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICBobGpzLlFVT1RFX1NUUklOR19NT0RFXG4gICAgICBdXG4gICAgfSxcbiAgICBDU1NfTlVNQkVSX01PREU6IHtcbiAgICAgIHNjb3BlOiAnbnVtYmVyJyxcbiAgICAgIGJlZ2luOiBobGpzLk5VTUJFUl9SRSArICcoJyArXG4gICAgICAgICclfGVtfGV4fGNofHJlbScgK1xuICAgICAgICAnfHZ3fHZofHZtaW58dm1heCcgK1xuICAgICAgICAnfGNtfG1tfGlufHB0fHBjfHB4JyArXG4gICAgICAgICd8ZGVnfGdyYWR8cmFkfHR1cm4nICtcbiAgICAgICAgJ3xzfG1zJyArXG4gICAgICAgICd8SHp8a0h6JyArXG4gICAgICAgICd8ZHBpfGRwY218ZHBweCcgK1xuICAgICAgICAnKT8nLFxuICAgICAgcmVsZXZhbmNlOiAwXG4gICAgfSxcbiAgICBDU1NfVkFSSUFCTEU6IHtcbiAgICAgIGNsYXNzTmFtZTogXCJhdHRyXCIsXG4gICAgICBiZWdpbjogLy0tW0EtWmEtel1bQS1aYS16MC05Xy1dKi9cbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBUQUdTID0gW1xuICAnYScsXG4gICdhYmJyJyxcbiAgJ2FkZHJlc3MnLFxuICAnYXJ0aWNsZScsXG4gICdhc2lkZScsXG4gICdhdWRpbycsXG4gICdiJyxcbiAgJ2Jsb2NrcXVvdGUnLFxuICAnYm9keScsXG4gICdidXR0b24nLFxuICAnY2FudmFzJyxcbiAgJ2NhcHRpb24nLFxuICAnY2l0ZScsXG4gICdjb2RlJyxcbiAgJ2RkJyxcbiAgJ2RlbCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RmbicsXG4gICdkaXYnLFxuICAnZGwnLFxuICAnZHQnLFxuICAnZW0nLFxuICAnZmllbGRzZXQnLFxuICAnZmlnY2FwdGlvbicsXG4gICdmaWd1cmUnLFxuICAnZm9vdGVyJyxcbiAgJ2Zvcm0nLFxuICAnaDEnLFxuICAnaDInLFxuICAnaDMnLFxuICAnaDQnLFxuICAnaDUnLFxuICAnaDYnLFxuICAnaGVhZGVyJyxcbiAgJ2hncm91cCcsXG4gICdodG1sJyxcbiAgJ2knLFxuICAnaWZyYW1lJyxcbiAgJ2ltZycsXG4gICdpbnB1dCcsXG4gICdpbnMnLFxuICAna2JkJyxcbiAgJ2xhYmVsJyxcbiAgJ2xlZ2VuZCcsXG4gICdsaScsXG4gICdtYWluJyxcbiAgJ21hcmsnLFxuICAnbWVudScsXG4gICduYXYnLFxuICAnb2JqZWN0JyxcbiAgJ29sJyxcbiAgJ3AnLFxuICAncScsXG4gICdxdW90ZScsXG4gICdzYW1wJyxcbiAgJ3NlY3Rpb24nLFxuICAnc3BhbicsXG4gICdzdHJvbmcnLFxuICAnc3VtbWFyeScsXG4gICdzdXAnLFxuICAndGFibGUnLFxuICAndGJvZHknLFxuICAndGQnLFxuICAndGV4dGFyZWEnLFxuICAndGZvb3QnLFxuICAndGgnLFxuICAndGhlYWQnLFxuICAndGltZScsXG4gICd0cicsXG4gICd1bCcsXG4gICd2YXInLFxuICAndmlkZW8nXG5dO1xuXG5jb25zdCBNRURJQV9GRUFUVVJFUyA9IFtcbiAgJ2FueS1ob3ZlcicsXG4gICdhbnktcG9pbnRlcicsXG4gICdhc3BlY3QtcmF0aW8nLFxuICAnY29sb3InLFxuICAnY29sb3ItZ2FtdXQnLFxuICAnY29sb3ItaW5kZXgnLFxuICAnZGV2aWNlLWFzcGVjdC1yYXRpbycsXG4gICdkZXZpY2UtaGVpZ2h0JyxcbiAgJ2RldmljZS13aWR0aCcsXG4gICdkaXNwbGF5LW1vZGUnLFxuICAnZm9yY2VkLWNvbG9ycycsXG4gICdncmlkJyxcbiAgJ2hlaWdodCcsXG4gICdob3ZlcicsXG4gICdpbnZlcnRlZC1jb2xvcnMnLFxuICAnbW9ub2Nocm9tZScsXG4gICdvcmllbnRhdGlvbicsXG4gICdvdmVyZmxvdy1ibG9jaycsXG4gICdvdmVyZmxvdy1pbmxpbmUnLFxuICAncG9pbnRlcicsXG4gICdwcmVmZXJzLWNvbG9yLXNjaGVtZScsXG4gICdwcmVmZXJzLWNvbnRyYXN0JyxcbiAgJ3ByZWZlcnMtcmVkdWNlZC1tb3Rpb24nLFxuICAncHJlZmVycy1yZWR1Y2VkLXRyYW5zcGFyZW5jeScsXG4gICdyZXNvbHV0aW9uJyxcbiAgJ3NjYW4nLFxuICAnc2NyaXB0aW5nJyxcbiAgJ3VwZGF0ZScsXG4gICd3aWR0aCcsXG4gIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgc29sdXRpb24/XG4gICdtaW4td2lkdGgnLFxuICAnbWF4LXdpZHRoJyxcbiAgJ21pbi1oZWlnaHQnLFxuICAnbWF4LWhlaWdodCdcbl07XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Qc2V1ZG8tY2xhc3Nlc1xuY29uc3QgUFNFVURPX0NMQVNTRVMgPSBbXG4gICdhY3RpdmUnLFxuICAnYW55LWxpbmsnLFxuICAnYmxhbmsnLFxuICAnY2hlY2tlZCcsXG4gICdjdXJyZW50JyxcbiAgJ2RlZmF1bHQnLFxuICAnZGVmaW5lZCcsXG4gICdkaXInLCAvLyBkaXIoKVxuICAnZGlzYWJsZWQnLFxuICAnZHJvcCcsXG4gICdlbXB0eScsXG4gICdlbmFibGVkJyxcbiAgJ2ZpcnN0JyxcbiAgJ2ZpcnN0LWNoaWxkJyxcbiAgJ2ZpcnN0LW9mLXR5cGUnLFxuICAnZnVsbHNjcmVlbicsXG4gICdmdXR1cmUnLFxuICAnZm9jdXMnLFxuICAnZm9jdXMtdmlzaWJsZScsXG4gICdmb2N1cy13aXRoaW4nLFxuICAnaGFzJywgLy8gaGFzKClcbiAgJ2hvc3QnLCAvLyBob3N0IG9yIGhvc3QoKVxuICAnaG9zdC1jb250ZXh0JywgLy8gaG9zdC1jb250ZXh0KClcbiAgJ2hvdmVyJyxcbiAgJ2luZGV0ZXJtaW5hdGUnLFxuICAnaW4tcmFuZ2UnLFxuICAnaW52YWxpZCcsXG4gICdpcycsIC8vIGlzKClcbiAgJ2xhbmcnLCAvLyBsYW5nKClcbiAgJ2xhc3QtY2hpbGQnLFxuICAnbGFzdC1vZi10eXBlJyxcbiAgJ2xlZnQnLFxuICAnbGluaycsXG4gICdsb2NhbC1saW5rJyxcbiAgJ25vdCcsIC8vIG5vdCgpXG4gICdudGgtY2hpbGQnLCAvLyBudGgtY2hpbGQoKVxuICAnbnRoLWNvbCcsIC8vIG50aC1jb2woKVxuICAnbnRoLWxhc3QtY2hpbGQnLCAvLyBudGgtbGFzdC1jaGlsZCgpXG4gICdudGgtbGFzdC1jb2wnLCAvLyBudGgtbGFzdC1jb2woKVxuICAnbnRoLWxhc3Qtb2YtdHlwZScsIC8vbnRoLWxhc3Qtb2YtdHlwZSgpXG4gICdudGgtb2YtdHlwZScsIC8vbnRoLW9mLXR5cGUoKVxuICAnb25seS1jaGlsZCcsXG4gICdvbmx5LW9mLXR5cGUnLFxuICAnb3B0aW9uYWwnLFxuICAnb3V0LW9mLXJhbmdlJyxcbiAgJ3Bhc3QnLFxuICAncGxhY2Vob2xkZXItc2hvd24nLFxuICAncmVhZC1vbmx5JyxcbiAgJ3JlYWQtd3JpdGUnLFxuICAncmVxdWlyZWQnLFxuICAncmlnaHQnLFxuICAncm9vdCcsXG4gICdzY29wZScsXG4gICd0YXJnZXQnLFxuICAndGFyZ2V0LXdpdGhpbicsXG4gICd1c2VyLWludmFsaWQnLFxuICAndmFsaWQnLFxuICAndmlzaXRlZCcsXG4gICd3aGVyZScgLy8gd2hlcmUoKVxuXTtcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1BzZXVkby1lbGVtZW50c1xuY29uc3QgUFNFVURPX0VMRU1FTlRTID0gW1xuICAnYWZ0ZXInLFxuICAnYmFja2Ryb3AnLFxuICAnYmVmb3JlJyxcbiAgJ2N1ZScsXG4gICdjdWUtcmVnaW9uJyxcbiAgJ2ZpcnN0LWxldHRlcicsXG4gICdmaXJzdC1saW5lJyxcbiAgJ2dyYW1tYXItZXJyb3InLFxuICAnbWFya2VyJyxcbiAgJ3BhcnQnLFxuICAncGxhY2Vob2xkZXInLFxuICAnc2VsZWN0aW9uJyxcbiAgJ3Nsb3R0ZWQnLFxuICAnc3BlbGxpbmctZXJyb3InXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVTID0gW1xuICAnYWxpZ24tY29udGVudCcsXG4gICdhbGlnbi1pdGVtcycsXG4gICdhbGlnbi1zZWxmJyxcbiAgJ2FsbCcsXG4gICdhbmltYXRpb24nLFxuICAnYW5pbWF0aW9uLWRlbGF5JyxcbiAgJ2FuaW1hdGlvbi1kaXJlY3Rpb24nLFxuICAnYW5pbWF0aW9uLWR1cmF0aW9uJyxcbiAgJ2FuaW1hdGlvbi1maWxsLW1vZGUnLFxuICAnYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCcsXG4gICdhbmltYXRpb24tbmFtZScsXG4gICdhbmltYXRpb24tcGxheS1zdGF0ZScsXG4gICdhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgJ2JhY2tmYWNlLXZpc2liaWxpdHknLFxuICAnYmFja2dyb3VuZCcsXG4gICdiYWNrZ3JvdW5kLWF0dGFjaG1lbnQnLFxuICAnYmFja2dyb3VuZC1ibGVuZC1tb2RlJyxcbiAgJ2JhY2tncm91bmQtY2xpcCcsXG4gICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgJ2JhY2tncm91bmQtaW1hZ2UnLFxuICAnYmFja2dyb3VuZC1vcmlnaW4nLFxuICAnYmFja2dyb3VuZC1wb3NpdGlvbicsXG4gICdiYWNrZ3JvdW5kLXJlcGVhdCcsXG4gICdiYWNrZ3JvdW5kLXNpemUnLFxuICAnYmxvY2stc2l6ZScsXG4gICdib3JkZXInLFxuICAnYm9yZGVyLWJsb2NrJyxcbiAgJ2JvcmRlci1ibG9jay1jb2xvcicsXG4gICdib3JkZXItYmxvY2stZW5kJyxcbiAgJ2JvcmRlci1ibG9jay1lbmQtY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLWVuZC1zdHlsZScsXG4gICdib3JkZXItYmxvY2stZW5kLXdpZHRoJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydCcsXG4gICdib3JkZXItYmxvY2stc3RhcnQtY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLXN0YXJ0LXN0eWxlJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydC13aWR0aCcsXG4gICdib3JkZXItYmxvY2stc3R5bGUnLFxuICAnYm9yZGVyLWJsb2NrLXdpZHRoJyxcbiAgJ2JvcmRlci1ib3R0b20nLFxuICAnYm9yZGVyLWJvdHRvbS1jb2xvcicsXG4gICdib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJyxcbiAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJyxcbiAgJ2JvcmRlci1ib3R0b20tc3R5bGUnLFxuICAnYm9yZGVyLWJvdHRvbS13aWR0aCcsXG4gICdib3JkZXItY29sbGFwc2UnLFxuICAnYm9yZGVyLWNvbG9yJyxcbiAgJ2JvcmRlci1pbWFnZScsXG4gICdib3JkZXItaW1hZ2Utb3V0c2V0JyxcbiAgJ2JvcmRlci1pbWFnZS1yZXBlYXQnLFxuICAnYm9yZGVyLWltYWdlLXNsaWNlJyxcbiAgJ2JvcmRlci1pbWFnZS1zb3VyY2UnLFxuICAnYm9yZGVyLWltYWdlLXdpZHRoJyxcbiAgJ2JvcmRlci1pbmxpbmUnLFxuICAnYm9yZGVyLWlubGluZS1jb2xvcicsXG4gICdib3JkZXItaW5saW5lLWVuZCcsXG4gICdib3JkZXItaW5saW5lLWVuZC1jb2xvcicsXG4gICdib3JkZXItaW5saW5lLWVuZC1zdHlsZScsXG4gICdib3JkZXItaW5saW5lLWVuZC13aWR0aCcsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0JyxcbiAgJ2JvcmRlci1pbmxpbmUtc3RhcnQtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1zdGFydC1zdHlsZScsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0LXdpZHRoJyxcbiAgJ2JvcmRlci1pbmxpbmUtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS13aWR0aCcsXG4gICdib3JkZXItbGVmdCcsXG4gICdib3JkZXItbGVmdC1jb2xvcicsXG4gICdib3JkZXItbGVmdC1zdHlsZScsXG4gICdib3JkZXItbGVmdC13aWR0aCcsXG4gICdib3JkZXItcmFkaXVzJyxcbiAgJ2JvcmRlci1yaWdodCcsXG4gICdib3JkZXItcmlnaHQtY29sb3InLFxuICAnYm9yZGVyLXJpZ2h0LXN0eWxlJyxcbiAgJ2JvcmRlci1yaWdodC13aWR0aCcsXG4gICdib3JkZXItc3BhY2luZycsXG4gICdib3JkZXItc3R5bGUnLFxuICAnYm9yZGVyLXRvcCcsXG4gICdib3JkZXItdG9wLWNvbG9yJyxcbiAgJ2JvcmRlci10b3AtbGVmdC1yYWRpdXMnLFxuICAnYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMnLFxuICAnYm9yZGVyLXRvcC1zdHlsZScsXG4gICdib3JkZXItdG9wLXdpZHRoJyxcbiAgJ2JvcmRlci13aWR0aCcsXG4gICdib3R0b20nLFxuICAnYm94LWRlY29yYXRpb24tYnJlYWsnLFxuICAnYm94LXNoYWRvdycsXG4gICdib3gtc2l6aW5nJyxcbiAgJ2JyZWFrLWFmdGVyJyxcbiAgJ2JyZWFrLWJlZm9yZScsXG4gICdicmVhay1pbnNpZGUnLFxuICAnY2FwdGlvbi1zaWRlJyxcbiAgJ2NhcmV0LWNvbG9yJyxcbiAgJ2NsZWFyJyxcbiAgJ2NsaXAnLFxuICAnY2xpcC1wYXRoJyxcbiAgJ2NsaXAtcnVsZScsXG4gICdjb2xvcicsXG4gICdjb2x1bW4tY291bnQnLFxuICAnY29sdW1uLWZpbGwnLFxuICAnY29sdW1uLWdhcCcsXG4gICdjb2x1bW4tcnVsZScsXG4gICdjb2x1bW4tcnVsZS1jb2xvcicsXG4gICdjb2x1bW4tcnVsZS1zdHlsZScsXG4gICdjb2x1bW4tcnVsZS13aWR0aCcsXG4gICdjb2x1bW4tc3BhbicsXG4gICdjb2x1bW4td2lkdGgnLFxuICAnY29sdW1ucycsXG4gICdjb250YWluJyxcbiAgJ2NvbnRlbnQnLFxuICAnY29udGVudC12aXNpYmlsaXR5JyxcbiAgJ2NvdW50ZXItaW5jcmVtZW50JyxcbiAgJ2NvdW50ZXItcmVzZXQnLFxuICAnY3VlJyxcbiAgJ2N1ZS1hZnRlcicsXG4gICdjdWUtYmVmb3JlJyxcbiAgJ2N1cnNvcicsXG4gICdkaXJlY3Rpb24nLFxuICAnZGlzcGxheScsXG4gICdlbXB0eS1jZWxscycsXG4gICdmaWx0ZXInLFxuICAnZmxleCcsXG4gICdmbGV4LWJhc2lzJyxcbiAgJ2ZsZXgtZGlyZWN0aW9uJyxcbiAgJ2ZsZXgtZmxvdycsXG4gICdmbGV4LWdyb3cnLFxuICAnZmxleC1zaHJpbmsnLFxuICAnZmxleC13cmFwJyxcbiAgJ2Zsb2F0JyxcbiAgJ2Zsb3cnLFxuICAnZm9udCcsXG4gICdmb250LWRpc3BsYXknLFxuICAnZm9udC1mYW1pbHknLFxuICAnZm9udC1mZWF0dXJlLXNldHRpbmdzJyxcbiAgJ2ZvbnQta2VybmluZycsXG4gICdmb250LWxhbmd1YWdlLW92ZXJyaWRlJyxcbiAgJ2ZvbnQtc2l6ZScsXG4gICdmb250LXNpemUtYWRqdXN0JyxcbiAgJ2ZvbnQtc21vb3RoaW5nJyxcbiAgJ2ZvbnQtc3RyZXRjaCcsXG4gICdmb250LXN0eWxlJyxcbiAgJ2ZvbnQtc3ludGhlc2lzJyxcbiAgJ2ZvbnQtdmFyaWFudCcsXG4gICdmb250LXZhcmlhbnQtY2FwcycsXG4gICdmb250LXZhcmlhbnQtZWFzdC1hc2lhbicsXG4gICdmb250LXZhcmlhbnQtbGlnYXR1cmVzJyxcbiAgJ2ZvbnQtdmFyaWFudC1udW1lcmljJyxcbiAgJ2ZvbnQtdmFyaWFudC1wb3NpdGlvbicsXG4gICdmb250LXZhcmlhdGlvbi1zZXR0aW5ncycsXG4gICdmb250LXdlaWdodCcsXG4gICdnYXAnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLFxuICAnZ3JpZCcsXG4gICdncmlkLWFyZWEnLFxuICAnZ3JpZC1hdXRvLWNvbHVtbnMnLFxuICAnZ3JpZC1hdXRvLWZsb3cnLFxuICAnZ3JpZC1hdXRvLXJvd3MnLFxuICAnZ3JpZC1jb2x1bW4nLFxuICAnZ3JpZC1jb2x1bW4tZW5kJyxcbiAgJ2dyaWQtY29sdW1uLXN0YXJ0JyxcbiAgJ2dyaWQtZ2FwJyxcbiAgJ2dyaWQtcm93JyxcbiAgJ2dyaWQtcm93LWVuZCcsXG4gICdncmlkLXJvdy1zdGFydCcsXG4gICdncmlkLXRlbXBsYXRlJyxcbiAgJ2dyaWQtdGVtcGxhdGUtYXJlYXMnLFxuICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJyxcbiAgJ2dyaWQtdGVtcGxhdGUtcm93cycsXG4gICdoYW5naW5nLXB1bmN0dWF0aW9uJyxcbiAgJ2hlaWdodCcsXG4gICdoeXBoZW5zJyxcbiAgJ2ljb24nLFxuICAnaW1hZ2Utb3JpZW50YXRpb24nLFxuICAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgJ2ltYWdlLXJlc29sdXRpb24nLFxuICAnaW1lLW1vZGUnLFxuICAnaW5saW5lLXNpemUnLFxuICAnaXNvbGF0aW9uJyxcbiAgJ2p1c3RpZnktY29udGVudCcsXG4gICdsZWZ0JyxcbiAgJ2xldHRlci1zcGFjaW5nJyxcbiAgJ2xpbmUtYnJlYWsnLFxuICAnbGluZS1oZWlnaHQnLFxuICAnbGlzdC1zdHlsZScsXG4gICdsaXN0LXN0eWxlLWltYWdlJyxcbiAgJ2xpc3Qtc3R5bGUtcG9zaXRpb24nLFxuICAnbGlzdC1zdHlsZS10eXBlJyxcbiAgJ21hcmdpbicsXG4gICdtYXJnaW4tYmxvY2snLFxuICAnbWFyZ2luLWJsb2NrLWVuZCcsXG4gICdtYXJnaW4tYmxvY2stc3RhcnQnLFxuICAnbWFyZ2luLWJvdHRvbScsXG4gICdtYXJnaW4taW5saW5lJyxcbiAgJ21hcmdpbi1pbmxpbmUtZW5kJyxcbiAgJ21hcmdpbi1pbmxpbmUtc3RhcnQnLFxuICAnbWFyZ2luLWxlZnQnLFxuICAnbWFyZ2luLXJpZ2h0JyxcbiAgJ21hcmdpbi10b3AnLFxuICAnbWFya3MnLFxuICAnbWFzaycsXG4gICdtYXNrLWJvcmRlcicsXG4gICdtYXNrLWJvcmRlci1tb2RlJyxcbiAgJ21hc2stYm9yZGVyLW91dHNldCcsXG4gICdtYXNrLWJvcmRlci1yZXBlYXQnLFxuICAnbWFzay1ib3JkZXItc2xpY2UnLFxuICAnbWFzay1ib3JkZXItc291cmNlJyxcbiAgJ21hc2stYm9yZGVyLXdpZHRoJyxcbiAgJ21hc2stY2xpcCcsXG4gICdtYXNrLWNvbXBvc2l0ZScsXG4gICdtYXNrLWltYWdlJyxcbiAgJ21hc2stbW9kZScsXG4gICdtYXNrLW9yaWdpbicsXG4gICdtYXNrLXBvc2l0aW9uJyxcbiAgJ21hc2stcmVwZWF0JyxcbiAgJ21hc2stc2l6ZScsXG4gICdtYXNrLXR5cGUnLFxuICAnbWF4LWJsb2NrLXNpemUnLFxuICAnbWF4LWhlaWdodCcsXG4gICdtYXgtaW5saW5lLXNpemUnLFxuICAnbWF4LXdpZHRoJyxcbiAgJ21pbi1ibG9jay1zaXplJyxcbiAgJ21pbi1oZWlnaHQnLFxuICAnbWluLWlubGluZS1zaXplJyxcbiAgJ21pbi13aWR0aCcsXG4gICdtaXgtYmxlbmQtbW9kZScsXG4gICduYXYtZG93bicsXG4gICduYXYtaW5kZXgnLFxuICAnbmF2LWxlZnQnLFxuICAnbmF2LXJpZ2h0JyxcbiAgJ25hdi11cCcsXG4gICdub25lJyxcbiAgJ25vcm1hbCcsXG4gICdvYmplY3QtZml0JyxcbiAgJ29iamVjdC1wb3NpdGlvbicsXG4gICdvcGFjaXR5JyxcbiAgJ29yZGVyJyxcbiAgJ29ycGhhbnMnLFxuICAnb3V0bGluZScsXG4gICdvdXRsaW5lLWNvbG9yJyxcbiAgJ291dGxpbmUtb2Zmc2V0JyxcbiAgJ291dGxpbmUtc3R5bGUnLFxuICAnb3V0bGluZS13aWR0aCcsXG4gICdvdmVyZmxvdycsXG4gICdvdmVyZmxvdy13cmFwJyxcbiAgJ292ZXJmbG93LXgnLFxuICAnb3ZlcmZsb3cteScsXG4gICdwYWRkaW5nJyxcbiAgJ3BhZGRpbmctYmxvY2snLFxuICAncGFkZGluZy1ibG9jay1lbmQnLFxuICAncGFkZGluZy1ibG9jay1zdGFydCcsXG4gICdwYWRkaW5nLWJvdHRvbScsXG4gICdwYWRkaW5nLWlubGluZScsXG4gICdwYWRkaW5nLWlubGluZS1lbmQnLFxuICAncGFkZGluZy1pbmxpbmUtc3RhcnQnLFxuICAncGFkZGluZy1sZWZ0JyxcbiAgJ3BhZGRpbmctcmlnaHQnLFxuICAncGFkZGluZy10b3AnLFxuICAncGFnZS1icmVhay1hZnRlcicsXG4gICdwYWdlLWJyZWFrLWJlZm9yZScsXG4gICdwYWdlLWJyZWFrLWluc2lkZScsXG4gICdwYXVzZScsXG4gICdwYXVzZS1hZnRlcicsXG4gICdwYXVzZS1iZWZvcmUnLFxuICAncGVyc3BlY3RpdmUnLFxuICAncGVyc3BlY3RpdmUtb3JpZ2luJyxcbiAgJ3BvaW50ZXItZXZlbnRzJyxcbiAgJ3Bvc2l0aW9uJyxcbiAgJ3F1b3RlcycsXG4gICdyZXNpemUnLFxuICAncmVzdCcsXG4gICdyZXN0LWFmdGVyJyxcbiAgJ3Jlc3QtYmVmb3JlJyxcbiAgJ3JpZ2h0JyxcbiAgJ3Jvdy1nYXAnLFxuICAnc2Nyb2xsLW1hcmdpbicsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrJyxcbiAgJ3Njcm9sbC1tYXJnaW4tYmxvY2stZW5kJyxcbiAgJ3Njcm9sbC1tYXJnaW4tYmxvY2stc3RhcnQnLFxuICAnc2Nyb2xsLW1hcmdpbi1ib3R0b20nLFxuICAnc2Nyb2xsLW1hcmdpbi1pbmxpbmUnLFxuICAnc2Nyb2xsLW1hcmdpbi1pbmxpbmUtZW5kJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lLXN0YXJ0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tbGVmdCcsXG4gICdzY3JvbGwtbWFyZ2luLXJpZ2h0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tdG9wJyxcbiAgJ3Njcm9sbC1wYWRkaW5nJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWJsb2NrJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWJsb2NrLWVuZCcsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jay1zdGFydCcsXG4gICdzY3JvbGwtcGFkZGluZy1ib3R0b20nLFxuICAnc2Nyb2xsLXBhZGRpbmctaW5saW5lJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZS1lbmQnLFxuICAnc2Nyb2xsLXBhZGRpbmctaW5saW5lLXN0YXJ0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWxlZnQnLFxuICAnc2Nyb2xsLXBhZGRpbmctcmlnaHQnLFxuICAnc2Nyb2xsLXBhZGRpbmctdG9wJyxcbiAgJ3Njcm9sbC1zbmFwLWFsaWduJyxcbiAgJ3Njcm9sbC1zbmFwLXN0b3AnLFxuICAnc2Nyb2xsLXNuYXAtdHlwZScsXG4gICdzY3JvbGxiYXItY29sb3InLFxuICAnc2Nyb2xsYmFyLWd1dHRlcicsXG4gICdzY3JvbGxiYXItd2lkdGgnLFxuICAnc2hhcGUtaW1hZ2UtdGhyZXNob2xkJyxcbiAgJ3NoYXBlLW1hcmdpbicsXG4gICdzaGFwZS1vdXRzaWRlJyxcbiAgJ3NwZWFrJyxcbiAgJ3NwZWFrLWFzJyxcbiAgJ3NyYycsIC8vIEBmb250LWZhY2VcbiAgJ3RhYi1zaXplJyxcbiAgJ3RhYmxlLWxheW91dCcsXG4gICd0ZXh0LWFsaWduJyxcbiAgJ3RleHQtYWxpZ24tYWxsJyxcbiAgJ3RleHQtYWxpZ24tbGFzdCcsXG4gICd0ZXh0LWNvbWJpbmUtdXByaWdodCcsXG4gICd0ZXh0LWRlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uLWNvbG9yJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1saW5lJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1zdHlsZScsXG4gICd0ZXh0LWVtcGhhc2lzJyxcbiAgJ3RleHQtZW1waGFzaXMtY29sb3InLFxuICAndGV4dC1lbXBoYXNpcy1wb3NpdGlvbicsXG4gICd0ZXh0LWVtcGhhc2lzLXN0eWxlJyxcbiAgJ3RleHQtaW5kZW50JyxcbiAgJ3RleHQtanVzdGlmeScsXG4gICd0ZXh0LW9yaWVudGF0aW9uJyxcbiAgJ3RleHQtb3ZlcmZsb3cnLFxuICAndGV4dC1yZW5kZXJpbmcnLFxuICAndGV4dC1zaGFkb3cnLFxuICAndGV4dC10cmFuc2Zvcm0nLFxuICAndGV4dC11bmRlcmxpbmUtcG9zaXRpb24nLFxuICAndG9wJyxcbiAgJ3RyYW5zZm9ybScsXG4gICd0cmFuc2Zvcm0tYm94JyxcbiAgJ3RyYW5zZm9ybS1vcmlnaW4nLFxuICAndHJhbnNmb3JtLXN0eWxlJyxcbiAgJ3RyYW5zaXRpb24nLFxuICAndHJhbnNpdGlvbi1kZWxheScsXG4gICd0cmFuc2l0aW9uLWR1cmF0aW9uJyxcbiAgJ3RyYW5zaXRpb24tcHJvcGVydHknLFxuICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nLFxuICAndW5pY29kZS1iaWRpJyxcbiAgJ3ZlcnRpY2FsLWFsaWduJyxcbiAgJ3Zpc2liaWxpdHknLFxuICAndm9pY2UtYmFsYW5jZScsXG4gICd2b2ljZS1kdXJhdGlvbicsXG4gICd2b2ljZS1mYW1pbHknLFxuICAndm9pY2UtcGl0Y2gnLFxuICAndm9pY2UtcmFuZ2UnLFxuICAndm9pY2UtcmF0ZScsXG4gICd2b2ljZS1zdHJlc3MnLFxuICAndm9pY2Utdm9sdW1lJyxcbiAgJ3doaXRlLXNwYWNlJyxcbiAgJ3dpZG93cycsXG4gICd3aWR0aCcsXG4gICd3aWxsLWNoYW5nZScsXG4gICd3b3JkLWJyZWFrJyxcbiAgJ3dvcmQtc3BhY2luZycsXG4gICd3b3JkLXdyYXAnLFxuICAnd3JpdGluZy1tb2RlJyxcbiAgJ3otaW5kZXgnXG4gIC8vIHJldmVyc2UgbWFrZXMgc3VyZSBsb25nZXIgYXR0cmlidXRlcyBgZm9udC13ZWlnaHRgIGFyZSBtYXRjaGVkIGZ1bGx5XG4gIC8vIGluc3RlYWQgb2YgZ2V0dGluZyBmYWxzZSBwb3NpdGl2ZXMgb24gc2F5IGBmb250YFxuXS5yZXZlcnNlKCk7XG5cbi8qXG5MYW5ndWFnZTogQ1NTXG5DYXRlZ29yeTogY29tbW9uLCBjc3MsIHdlYlxuV2Vic2l0ZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gY3NzKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBtb2RlcyA9IE1PREVTKGhsanMpO1xuICBjb25zdCBWRU5ET1JfUFJFRklYID0geyBiZWdpbjogLy0od2Via2l0fG1venxtc3xvKS0oPz1bYS16XSkvIH07XG4gIGNvbnN0IEFUX01PRElGSUVSUyA9IFwiYW5kIG9yIG5vdCBvbmx5XCI7XG4gIGNvbnN0IEFUX1BST1BFUlRZX1JFID0gL0AtP1xcd1tcXHddKigtXFx3KykqLzsgLy8gQC13ZWJraXQta2V5ZnJhbWVzXG4gIGNvbnN0IElERU5UX1JFID0gJ1thLXpBLVotXVthLXpBLVowLTlfLV0qJztcbiAgY29uc3QgU1RSSU5HUyA9IFtcbiAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0NTUycsXG4gICAgY2FzZV9pbnNlbnNpdGl2ZTogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAvWz18J1xcJF0vLFxuICAgIGtleXdvcmRzOiB7IGtleWZyYW1lUG9zaXRpb246IFwiZnJvbSB0b1wiIH0sXG4gICAgY2xhc3NOYW1lQWxpYXNlczoge1xuICAgICAgLy8gZm9yIHZpc3VhbCBjb250aW51aXR5IHdpdGggYHRhZyB7fWAgYW5kIGJlY2F1c2Ugd2VcbiAgICAgIC8vIGRvbid0IGhhdmUgYSBncmVhdCBjbGFzcyBmb3IgdGhpcz9cbiAgICAgIGtleWZyYW1lUG9zaXRpb246IFwic2VsZWN0b3ItdGFnXCIgfSxcbiAgICBjb250YWluczogW1xuICAgICAgbW9kZXMuQkxPQ0tfQ09NTUVOVCxcbiAgICAgIFZFTkRPUl9QUkVGSVgsXG4gICAgICAvLyB0byByZWNvZ25pemUga2V5ZnJhbWUgNDAlIGV0YyB3aGljaCBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygb3VyXG4gICAgICAvLyBhdHRyaWJ1dGUgdmFsdWUgbW9kZVxuICAgICAgbW9kZXMuQ1NTX05VTUJFUl9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1pZCcsXG4gICAgICAgIGJlZ2luOiAvI1tBLVphLXowLTlfLV0rLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1jbGFzcycsXG4gICAgICAgIGJlZ2luOiAnXFxcXC4nICsgSURFTlRfUkUsXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIG1vZGVzLkFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1wc2V1ZG8nLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHsgYmVnaW46ICc6KCcgKyBQU0VVRE9fQ0xBU1NFUy5qb2luKCd8JykgKyAnKScgfSxcbiAgICAgICAgICB7IGJlZ2luOiAnOig6KT8oJyArIFBTRVVET19FTEVNRU5UUy5qb2luKCd8JykgKyAnKScgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gd2UgbWF5IGFjdHVhbGx5IG5lZWQgdGhpcyAoMTIvMjAyMClcbiAgICAgIC8vIHsgLy8gcHNldWRvLXNlbGVjdG9yIHBhcmFtc1xuICAgICAgLy8gICBiZWdpbjogL1xcKC8sXG4gICAgICAvLyAgIGVuZDogL1xcKS8sXG4gICAgICAvLyAgIGNvbnRhaW5zOiBbIGhsanMuQ1NTX05VTUJFUl9NT0RFIF1cbiAgICAgIC8vIH0sXG4gICAgICBtb2Rlcy5DU1NfVkFSSUFCTEUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2F0dHJpYnV0ZScsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIEFUVFJJQlVURVMuam9pbignfCcpICsgJylcXFxcYidcbiAgICAgIH0sXG4gICAgICAvLyBhdHRyaWJ1dGUgdmFsdWVzXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOi8sXG4gICAgICAgIGVuZDogL1s7fXtdLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBtb2Rlcy5CTE9DS19DT01NRU5ULFxuICAgICAgICAgIG1vZGVzLkhFWENPTE9SLFxuICAgICAgICAgIG1vZGVzLklNUE9SVEFOVCxcbiAgICAgICAgICBtb2Rlcy5DU1NfTlVNQkVSX01PREUsXG4gICAgICAgICAgLi4uU1RSSU5HUyxcbiAgICAgICAgICAvLyBuZWVkZWQgdG8gaGlnaGxpZ2h0IHRoZXNlIGFzIHN0cmluZ3MgYW5kIHRvIGF2b2lkIGlzc3VlcyB3aXRoXG4gICAgICAgICAgLy8gaWxsZWdhbCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgaW5zaWRlIHVybHMgdGhhdCB3b3VsZCB0aWdnZXIgdGhlXG4gICAgICAgICAgLy8gbGFuZ3VhZ2VzIGlsbGVnYWwgc3RhY2tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogLyh1cmx8ZGF0YS11cmkpXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsIC8vIGZyb20ga2V5d29yZHNcbiAgICAgICAgICAgIGtleXdvcmRzOiB7IGJ1aWx0X2luOiBcInVybCBkYXRhLXVyaVwiIH0sXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICAuLi5TVFJJTkdTLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIC8vIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBgKWAgYXMgaW4gYHVybCgpYCB3aWxsIGJlIHRoZSBzdGFydFxuICAgICAgICAgICAgICAgIC8vIG9mIGEgc3RyaW5nLCB3aGljaCBlbmRzIHdpdGggYClgIChmcm9tIHRoZSBwYXJlbnQgbW9kZSlcbiAgICAgICAgICAgICAgICBiZWdpbjogL1teKV0vLFxuICAgICAgICAgICAgICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9kZXMuRlVOQ1RJT05fRElTUEFUQ0hcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IHJlZ2V4Lmxvb2thaGVhZCgvQC8pLFxuICAgICAgICBlbmQ6ICdbeztdJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBpbGxlZ2FsOiAvOi8sIC8vIGJyZWFrIG9uIExlc3MgdmFyaWFibGVzIEB2YXI6IC4uLlxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2tleXdvcmQnLFxuICAgICAgICAgICAgYmVnaW46IEFUX1BST1BFUlRZX1JFXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xccy8sXG4gICAgICAgICAgICBlbmRzV2l0aFBhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgICBrZXl3b3Jkczoge1xuICAgICAgICAgICAgICAkcGF0dGVybjogL1thLXotXSsvLFxuICAgICAgICAgICAgICBrZXl3b3JkOiBBVF9NT0RJRklFUlMsXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZTogTUVESUFfRkVBVFVSRVMuam9pbihcIiBcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVnaW46IC9bYS16LV0rKD89OikvLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJhdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAuLi5TVFJJTkdTLFxuICAgICAgICAgICAgICBtb2Rlcy5DU1NfTlVNQkVSX01PREVcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXRhZycsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIFRBR1Muam9pbignfCcpICsgJylcXFxcYidcbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IGNzcyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBEaWZmXG5EZXNjcmlwdGlvbjogVW5pZmllZCBhbmQgY29udGV4dCBkaWZmXG5BdXRob3I6IFZhc2lseSBQb2xvdm55b3YgPHZhc3RAd2hpdGVhbnRzLm5ldD5cbldlYnNpdGU6IGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZGlmZnV0aWxzL1xuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIGRpZmYoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0RpZmYnLFxuICAgIGFsaWFzZXM6IFsgJ3BhdGNoJyBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICByZWxldmFuY2U6IDEwLFxuICAgICAgICBtYXRjaDogcmVnZXguZWl0aGVyKFxuICAgICAgICAgIC9eQEAgKy1cXGQrLFxcZCsgK1xcK1xcZCssXFxkKyArQEAvLFxuICAgICAgICAgIC9eXFwqXFwqXFwqICtcXGQrLFxcZCsgK1xcKlxcKlxcKlxcKiQvLFxuICAgICAgICAgIC9eLS0tICtcXGQrLFxcZCsgKy0tLS0kL1xuICAgICAgICApXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdjb21tZW50JyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogcmVnZXguZWl0aGVyKFxuICAgICAgICAgICAgICAvSW5kZXg6IC8sXG4gICAgICAgICAgICAgIC9eaW5kZXgvLFxuICAgICAgICAgICAgICAvPXszLH0vLFxuICAgICAgICAgICAgICAvXi17M30vLFxuICAgICAgICAgICAgICAvXlxcKnszfSAvLFxuICAgICAgICAgICAgICAvXlxcK3szfS8sXG4gICAgICAgICAgICAgIC9eZGlmZiAtLWdpdC9cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbmQ6IC8kL1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtYXRjaDogL15cXCp7MTV9JC8gfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdhZGRpdGlvbicsXG4gICAgICAgIGJlZ2luOiAvXlxcKy8sXG4gICAgICAgIGVuZDogLyQvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdkZWxldGlvbicsXG4gICAgICAgIGJlZ2luOiAvXi0vLFxuICAgICAgICBlbmQ6IC8kL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnYWRkaXRpb24nLFxuICAgICAgICBiZWdpbjogL14hLyxcbiAgICAgICAgZW5kOiAvJC9cbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IGRpZmYgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogR29cbkF1dGhvcjogU3RlcGhhbiBLb3VudHNvIGFrYSBTdGVwTGcgPHN0ZXBsZ0BnbWFpbC5jb20+XG5Db250cmlidXRvcnM6IEV2Z2VueSBTdGVwYW5pc2NoZXYgPGltYm9sa0BnbWFpbC5jb20+XG5EZXNjcmlwdGlvbjogR29vZ2xlIGdvIGxhbmd1YWdlIChnb2xhbmcpLiBGb3IgaW5mbyBhYm91dCBsYW5ndWFnZVxuV2Vic2l0ZTogaHR0cDovL2dvbGFuZy5vcmcvXG5DYXRlZ29yeTogY29tbW9uLCBzeXN0ZW1cbiovXG5cbmZ1bmN0aW9uIGdvKGhsanMpIHtcbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwiaW90YVwiLFxuICAgIFwibmlsXCJcbiAgXTtcbiAgY29uc3QgQlVJTFRfSU5TID0gW1xuICAgIFwiYXBwZW5kXCIsXG4gICAgXCJjYXBcIixcbiAgICBcImNsb3NlXCIsXG4gICAgXCJjb21wbGV4XCIsXG4gICAgXCJjb3B5XCIsXG4gICAgXCJpbWFnXCIsXG4gICAgXCJsZW5cIixcbiAgICBcIm1ha2VcIixcbiAgICBcIm5ld1wiLFxuICAgIFwicGFuaWNcIixcbiAgICBcInByaW50XCIsXG4gICAgXCJwcmludGxuXCIsXG4gICAgXCJyZWFsXCIsXG4gICAgXCJyZWNvdmVyXCIsXG4gICAgXCJkZWxldGVcIlxuICBdO1xuICBjb25zdCBUWVBFUyA9IFtcbiAgICBcImJvb2xcIixcbiAgICBcImJ5dGVcIixcbiAgICBcImNvbXBsZXg2NFwiLFxuICAgIFwiY29tcGxleDEyOFwiLFxuICAgIFwiZXJyb3JcIixcbiAgICBcImZsb2F0MzJcIixcbiAgICBcImZsb2F0NjRcIixcbiAgICBcImludDhcIixcbiAgICBcImludDE2XCIsXG4gICAgXCJpbnQzMlwiLFxuICAgIFwiaW50NjRcIixcbiAgICBcInN0cmluZ1wiLFxuICAgIFwidWludDhcIixcbiAgICBcInVpbnQxNlwiLFxuICAgIFwidWludDMyXCIsXG4gICAgXCJ1aW50NjRcIixcbiAgICBcImludFwiLFxuICAgIFwidWludFwiLFxuICAgIFwidWludHB0clwiLFxuICAgIFwicnVuZVwiXG4gIF07XG4gIGNvbnN0IEtXUyA9IFtcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjYXNlXCIsXG4gICAgXCJjaGFuXCIsXG4gICAgXCJjb25zdFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImRlZmF1bHRcIixcbiAgICBcImRlZmVyXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJmYWxsdGhyb3VnaFwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJmdW5jXCIsXG4gICAgXCJnb1wiLFxuICAgIFwiZ290b1wiLFxuICAgIFwiaWZcIixcbiAgICBcImltcG9ydFwiLFxuICAgIFwiaW50ZXJmYWNlXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInBhY2thZ2VcIixcbiAgICBcInJhbmdlXCIsXG4gICAgXCJyZXR1cm5cIixcbiAgICBcInNlbGVjdFwiLFxuICAgIFwic3RydWN0XCIsXG4gICAgXCJzd2l0Y2hcIixcbiAgICBcInR5cGVcIixcbiAgICBcInZhclwiLFxuICBdO1xuICBjb25zdCBLRVlXT1JEUyA9IHtcbiAgICBrZXl3b3JkOiBLV1MsXG4gICAgdHlwZTogVFlQRVMsXG4gICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgYnVpbHRfaW46IEJVSUxUX0lOU1xuICB9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdHbycsXG4gICAgYWxpYXNlczogWyAnZ29sYW5nJyBdLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnYCcsXG4gICAgICAgICAgICBlbmQ6ICdgJ1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogaGxqcy5DX05VTUJFUl9SRSArICdbaV0nLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBobGpzLkNfTlVNQkVSX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHsgYmVnaW46IC86PS8gLy8gcmVsZXZhbmNlIGJvb3N0ZXJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ2Z1bmMnLFxuICAgICAgICBlbmQ6ICdcXFxccyooXFxcXHt8JCknLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIGhsanMuVElUTEVfTU9ERSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdwYXJhbXMnLFxuICAgICAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgICAgICBpbGxlZ2FsOiAvW1wiJ10vXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBnbyBhcyBkZWZhdWx0IH07XG4iLCAiLypcbiBMYW5ndWFnZTogR3JhcGhRTFxuIEF1dGhvcjogSm9obiBGb3N0ZXIgKEdIIGpmOTkwKSwgYW5kIG90aGVyc1xuIERlc2NyaXB0aW9uOiBHcmFwaFFMIGlzIGEgcXVlcnkgbGFuZ3VhZ2UgZm9yIEFQSXNcbiBDYXRlZ29yeTogd2ViLCBjb21tb25cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBncmFwaHFsKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBHUUxfTkFNRSA9IC9bX0EtWmEtel1bXzAtOUEtWmEtel0qLztcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBcIkdyYXBoUUxcIixcbiAgICBhbGlhc2VzOiBbIFwiZ3FsXCIgXSxcbiAgICBjYXNlX2luc2Vuc2l0aXZlOiB0cnVlLFxuICAgIGRpc2FibGVBdXRvZGV0ZWN0OiBmYWxzZSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAga2V5d29yZDogW1xuICAgICAgICBcInF1ZXJ5XCIsXG4gICAgICAgIFwibXV0YXRpb25cIixcbiAgICAgICAgXCJzdWJzY3JpcHRpb25cIixcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgXCJzY2hlbWFcIixcbiAgICAgICAgXCJkaXJlY3RpdmVcIixcbiAgICAgICAgXCJpbnRlcmZhY2VcIixcbiAgICAgICAgXCJ1bmlvblwiLFxuICAgICAgICBcInNjYWxhclwiLFxuICAgICAgICBcImZyYWdtZW50XCIsXG4gICAgICAgIFwiZW51bVwiLFxuICAgICAgICBcIm9uXCJcbiAgICAgIF0sXG4gICAgICBsaXRlcmFsOiBbXG4gICAgICAgIFwidHJ1ZVwiLFxuICAgICAgICBcImZhbHNlXCIsXG4gICAgICAgIFwibnVsbFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICBobGpzLk5VTUJFUl9NT0RFLFxuICAgICAge1xuICAgICAgICBzY29wZTogXCJwdW5jdHVhdGlvblwiLFxuICAgICAgICBtYXRjaDogL1suXXszfS8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IFwicHVuY3R1YXRpb25cIixcbiAgICAgICAgYmVnaW46IC9bXFwhXFwoXFwpXFw6XFw9XFxbXFxdXFx7XFx8XFx9XXsxfS8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IFwidmFyaWFibGVcIixcbiAgICAgICAgYmVnaW46IC9cXCQvLFxuICAgICAgICBlbmQ6IC9cXFcvLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiBcIm1ldGFcIixcbiAgICAgICAgbWF0Y2g6IC9AXFx3Ky8sXG4gICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiBcInN5bWJvbFwiLFxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KEdRTF9OQU1FLCByZWdleC5sb29rYWhlYWQoL1xccyo6LykpLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdLFxuICAgIGlsbGVnYWw6IFtcbiAgICAgIC9bOzwnXS8sXG4gICAgICAvQkVHSU4vXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBncmFwaHFsIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFRPTUwsIGFsc28gSU5JXG5EZXNjcmlwdGlvbjogVE9NTCBhaW1zIHRvIGJlIGEgbWluaW1hbCBjb25maWd1cmF0aW9uIGZpbGUgZm9ybWF0IHRoYXQncyBlYXN5IHRvIHJlYWQgZHVlIHRvIG9idmlvdXMgc2VtYW50aWNzLlxuQ29udHJpYnV0b3JzOiBHdWlsbGF1bWUgR29tZXogPGd1aWxsYXVtZTEuZ29tZXpAZ21haWwuY29tPlxuQ2F0ZWdvcnk6IGNvbW1vbiwgY29uZmlnXG5XZWJzaXRlOiBodHRwczovL2dpdGh1Yi5jb20vdG9tbC1sYW5nL3RvbWxcbiovXG5cbmZ1bmN0aW9uIGluaShobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgTlVNQkVSUyA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogLyhbKy1dKyk/W1xcZF0rX1tcXGRfXSsvIH0sXG4gICAgICB7IGJlZ2luOiBobGpzLk5VTUJFUl9SRSB9XG4gICAgXVxuICB9O1xuICBjb25zdCBDT01NRU5UUyA9IGhsanMuQ09NTUVOVCgpO1xuICBDT01NRU5UUy52YXJpYW50cyA9IFtcbiAgICB7XG4gICAgICBiZWdpbjogLzsvLFxuICAgICAgZW5kOiAvJC9cbiAgICB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiAvIy8sXG4gICAgICBlbmQ6IC8kL1xuICAgIH1cbiAgXTtcbiAgY29uc3QgVkFSSUFCTEVTID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogL1xcJFtcXHdcXGRcIl1bXFx3XFxkX10qLyB9LFxuICAgICAgeyBiZWdpbjogL1xcJFxceyguKj8pXFx9LyB9XG4gICAgXVxuICB9O1xuICBjb25zdCBMSVRFUkFMUyA9IHtcbiAgICBjbGFzc05hbWU6ICdsaXRlcmFsJyxcbiAgICBiZWdpbjogL1xcYm9ufG9mZnx0cnVlfGZhbHNlfHllc3xub1xcYi9cbiAgfTtcbiAgY29uc3QgU1RSSU5HUyA9IHtcbiAgICBjbGFzc05hbWU6IFwic3RyaW5nXCIsXG4gICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF0sXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFwiJycnXCIsXG4gICAgICAgIGVuZDogXCInJydcIixcbiAgICAgICAgcmVsZXZhbmNlOiAxMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdcIlwiXCInLFxuICAgICAgICBlbmQ6ICdcIlwiXCInLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJ1wiJyxcbiAgICAgICAgZW5kOiAnXCInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogXCInXCIsXG4gICAgICAgIGVuZDogXCInXCJcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IEFSUkFZID0ge1xuICAgIGJlZ2luOiAvXFxbLyxcbiAgICBlbmQ6IC9cXF0vLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBDT01NRU5UUyxcbiAgICAgIExJVEVSQUxTLFxuICAgICAgVkFSSUFCTEVTLFxuICAgICAgU1RSSU5HUyxcbiAgICAgIE5VTUJFUlMsXG4gICAgICAnc2VsZidcbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IEJBUkVfS0VZID0gL1tBLVphLXowLTlfLV0rLztcbiAgY29uc3QgUVVPVEVEX0tFWV9ET1VCTEVfUVVPVEUgPSAvXCIoXFxcXFwifFteXCJdKSpcIi87XG4gIGNvbnN0IFFVT1RFRF9LRVlfU0lOR0xFX1FVT1RFID0gLydbXiddKicvO1xuICBjb25zdCBBTllfS0VZID0gcmVnZXguZWl0aGVyKFxuICAgIEJBUkVfS0VZLCBRVU9URURfS0VZX0RPVUJMRV9RVU9URSwgUVVPVEVEX0tFWV9TSU5HTEVfUVVPVEVcbiAgKTtcbiAgY29uc3QgRE9UVEVEX0tFWSA9IHJlZ2V4LmNvbmNhdChcbiAgICBBTllfS0VZLCAnKFxcXFxzKlxcXFwuXFxcXHMqJywgQU5ZX0tFWSwgJykqJyxcbiAgICByZWdleC5sb29rYWhlYWQoL1xccyo9XFxzKlteI1xcc10vKVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1RPTUwsIGFsc28gSU5JJyxcbiAgICBhbGlhc2VzOiBbICd0b21sJyBdLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgaWxsZWdhbDogL1xcUy8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIENPTU1FTlRTLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWN0aW9uJyxcbiAgICAgICAgYmVnaW46IC9cXFsrLyxcbiAgICAgICAgZW5kOiAvXFxdKy9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBET1RURURfS0VZLFxuICAgICAgICBjbGFzc05hbWU6ICdhdHRyJyxcbiAgICAgICAgc3RhcnRzOiB7XG4gICAgICAgICAgZW5kOiAvJC8sXG4gICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgIENPTU1FTlRTLFxuICAgICAgICAgICAgQVJSQVksXG4gICAgICAgICAgICBMSVRFUkFMUyxcbiAgICAgICAgICAgIFZBUklBQkxFUyxcbiAgICAgICAgICAgIFNUUklOR1MsXG4gICAgICAgICAgICBOVU1CRVJTXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBpbmkgYXMgZGVmYXVsdCB9O1xuIiwgIi8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxNS9odG1sL2pscy0zLmh0bWwjamxzLTMuMTBcbnZhciBkZWNpbWFsRGlnaXRzID0gJ1swLTldKF8qWzAtOV0pKic7XG52YXIgZnJhYyA9IGBcXFxcLigke2RlY2ltYWxEaWdpdHN9KWA7XG52YXIgaGV4RGlnaXRzID0gJ1swLTlhLWZBLUZdKF8qWzAtOWEtZkEtRl0pKic7XG52YXIgTlVNRVJJQyA9IHtcbiAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgdmFyaWFudHM6IFtcbiAgICAvLyBEZWNpbWFsRmxvYXRpbmdQb2ludExpdGVyYWxcbiAgICAvLyBpbmNsdWRpbmcgRXhwb25lbnRQYXJ0XG4gICAgeyBiZWdpbjogYChcXFxcYigke2RlY2ltYWxEaWdpdHN9KSgoJHtmcmFjfSl8XFxcXC4pP3woJHtmcmFjfSkpYCArXG4gICAgICBgW2VFXVsrLV0/KCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdP1xcXFxiYCB9LFxuICAgIC8vIGV4Y2x1ZGluZyBFeHBvbmVudFBhcnRcbiAgICB7IGJlZ2luOiBgXFxcXGIoJHtkZWNpbWFsRGlnaXRzfSkoKCR7ZnJhY30pW2ZGZERdP1xcXFxifFxcXFwuKFtmRmREXVxcXFxiKT8pYCB9LFxuICAgIHsgYmVnaW46IGAoJHtmcmFjfSlbZkZkRF0/XFxcXGJgIH0sXG4gICAgeyBiZWdpbjogYFxcXFxiKCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdXFxcXGJgIH0sXG5cbiAgICAvLyBIZXhhZGVjaW1hbEZsb2F0aW5nUG9pbnRMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oKCR7aGV4RGlnaXRzfSlcXFxcLj98KCR7aGV4RGlnaXRzfSk/XFxcXC4oJHtoZXhEaWdpdHN9KSlgICtcbiAgICAgIGBbcFBdWystXT8oJHtkZWNpbWFsRGlnaXRzfSlbZkZkRF0/XFxcXGJgIH0sXG5cbiAgICAvLyBEZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIoMHxbMS05XShfKlswLTldKSopW2xMXT9cXFxcYicgfSxcblxuICAgIC8vIEhleEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oJHtoZXhEaWdpdHN9KVtsTF0/XFxcXGJgIH0sXG5cbiAgICAvLyBPY3RhbEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogJ1xcXFxiMChfKlswLTddKSpbbExdP1xcXFxiJyB9LFxuXG4gICAgLy8gQmluYXJ5SW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIwW2JCXVswMV0oXypbMDFdKSpbbExdP1xcXFxiJyB9LFxuICBdLFxuICByZWxldmFuY2U6IDBcbn07XG5cbi8qXG5MYW5ndWFnZTogSmF2YVxuQXV0aG9yOiBWc2V2b2xvZCBTb2xvdnlvdiA8dnNldm9sb2Quc29sb3Z5b3ZAZ21haWwuY29tPlxuQ2F0ZWdvcnk6IGNvbW1vbiwgZW50ZXJwcmlzZVxuV2Vic2l0ZTogaHR0cHM6Ly93d3cuamF2YS5jb20vXG4qL1xuXG4vKipcbiAqIEFsbG93cyByZWN1cnNpdmUgcmVnZXggZXhwcmVzc2lvbnMgdG8gYSBnaXZlbiBkZXB0aFxuICpcbiAqIGllOiByZWN1clJlZ2V4KFwiKGFiY35+filcIiwgL35+fi9nLCAyKSBiZWNvbWVzOlxuICogKGFiYyhhYmMoYWJjKSkpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlXG4gKiBAcGFyYW0ge1JlZ0V4cH0gc3Vic3RpdHV0aW9uIChzaG91bGQgYmUgYSBnIG1vZGUgcmVnZXgpXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9YGBcbiAqL1xuZnVuY3Rpb24gcmVjdXJSZWdleChyZSwgc3Vic3RpdHV0aW9uLCBkZXB0aCkge1xuICBpZiAoZGVwdGggPT09IC0xKSByZXR1cm4gXCJcIjtcblxuICByZXR1cm4gcmUucmVwbGFjZShzdWJzdGl0dXRpb24sIF8gPT4ge1xuICAgIHJldHVybiByZWN1clJlZ2V4KHJlLCBzdWJzdGl0dXRpb24sIGRlcHRoIC0gMSk7XG4gIH0pO1xufVxuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gamF2YShobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgSkFWQV9JREVOVF9SRSA9ICdbXFx1MDBDMC1cXHUwMkI4YS16QS1aXyRdW1xcdTAwQzAtXFx1MDJCOGEtekEtWl8kMC05XSonO1xuICBjb25zdCBHRU5FUklDX0lERU5UX1JFID0gSkFWQV9JREVOVF9SRVxuICAgICsgcmVjdXJSZWdleCgnKD86PCcgKyBKQVZBX0lERU5UX1JFICsgJ35+fig/OlxcXFxzKixcXFxccyonICsgSkFWQV9JREVOVF9SRSArICd+fn4pKj4pPycsIC9+fn4vZywgMik7XG4gIGNvbnN0IE1BSU5fS0VZV09SRFMgPSBbXG4gICAgJ3N5bmNocm9uaXplZCcsXG4gICAgJ2Fic3RyYWN0JyxcbiAgICAncHJpdmF0ZScsXG4gICAgJ3ZhcicsXG4gICAgJ3N0YXRpYycsXG4gICAgJ2lmJyxcbiAgICAnY29uc3QgJyxcbiAgICAnZm9yJyxcbiAgICAnd2hpbGUnLFxuICAgICdzdHJpY3RmcCcsXG4gICAgJ2ZpbmFsbHknLFxuICAgICdwcm90ZWN0ZWQnLFxuICAgICdpbXBvcnQnLFxuICAgICduYXRpdmUnLFxuICAgICdmaW5hbCcsXG4gICAgJ3ZvaWQnLFxuICAgICdlbnVtJyxcbiAgICAnZWxzZScsXG4gICAgJ2JyZWFrJyxcbiAgICAndHJhbnNpZW50JyxcbiAgICAnY2F0Y2gnLFxuICAgICdpbnN0YW5jZW9mJyxcbiAgICAndm9sYXRpbGUnLFxuICAgICdjYXNlJyxcbiAgICAnYXNzZXJ0JyxcbiAgICAncGFja2FnZScsXG4gICAgJ2RlZmF1bHQnLFxuICAgICdwdWJsaWMnLFxuICAgICd0cnknLFxuICAgICdzd2l0Y2gnLFxuICAgICdjb250aW51ZScsXG4gICAgJ3Rocm93cycsXG4gICAgJ3Byb3RlY3RlZCcsXG4gICAgJ3B1YmxpYycsXG4gICAgJ3ByaXZhdGUnLFxuICAgICdtb2R1bGUnLFxuICAgICdyZXF1aXJlcycsXG4gICAgJ2V4cG9ydHMnLFxuICAgICdkbycsXG4gICAgJ3NlYWxlZCcsXG4gICAgJ3lpZWxkJyxcbiAgICAncGVybWl0cydcbiAgXTtcblxuICBjb25zdCBCVUlMVF9JTlMgPSBbXG4gICAgJ3N1cGVyJyxcbiAgICAndGhpcydcbiAgXTtcblxuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICAnZmFsc2UnLFxuICAgICd0cnVlJyxcbiAgICAnbnVsbCdcbiAgXTtcblxuICBjb25zdCBUWVBFUyA9IFtcbiAgICAnY2hhcicsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdsb25nJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdieXRlJyxcbiAgICAnc2hvcnQnLFxuICAgICdkb3VibGUnXG4gIF07XG5cbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAga2V5d29yZDogTUFJTl9LRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICB0eXBlOiBUWVBFUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TXG4gIH07XG5cbiAgY29uc3QgQU5OT1RBVElPTiA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBiZWdpbjogJ0AnICsgSkFWQV9JREVOVF9SRSxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgIGNvbnRhaW5zOiBbIFwic2VsZlwiIF0gLy8gYWxsb3cgbmVzdGVkICgpIGluc2lkZSBvdXIgYW5ub3RhdGlvblxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgUEFSQU1TID0ge1xuICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgYmVnaW46IC9cXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogWyBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFIF0sXG4gICAgZW5kc1BhcmVudDogdHJ1ZVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0phdmEnLFxuICAgIGFsaWFzZXM6IFsgJ2pzcCcgXSxcbiAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgaWxsZWdhbDogLzxcXC98Iy8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgJy9cXFxcKlxcXFwqJyxcbiAgICAgICAgJ1xcXFwqLycsXG4gICAgICAgIHtcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gZWF0IHVwIEAncyBpbiBlbWFpbHMgdG8gcHJldmVudCB0aGVtIHRvIGJlIHJlY29nbml6ZWQgYXMgZG9jdGFnc1xuICAgICAgICAgICAgICBiZWdpbjogL1xcdytALyxcbiAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6ICdkb2N0YWcnLFxuICAgICAgICAgICAgICBiZWdpbjogJ0BbQS1aYS16XSsnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgLy8gcmVsZXZhbmNlIGJvb3N0XG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvaW1wb3J0IGphdmFcXC5bYS16XStcXC4vLFxuICAgICAgICBrZXl3b3JkczogXCJpbXBvcnRcIixcbiAgICAgICAgcmVsZXZhbmNlOiAyXG4gICAgICB9LFxuICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cIlwiXCIvLFxuICAgICAgICBlbmQ6IC9cIlwiXCIvLFxuICAgICAgICBjbGFzc05hbWU6IFwic3RyaW5nXCIsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSBdXG4gICAgICB9LFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvXFxiKD86Y2xhc3N8aW50ZXJmYWNlfGVudW18ZXh0ZW5kc3xpbXBsZW1lbnRzfG5ldykvLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBKQVZBX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidGl0bGUuY2xhc3NcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBFeGNlcHRpb25zIGZvciBoeXBoZW5hdGVkIGtleXdvcmRzXG4gICAgICAgIG1hdGNoOiAvbm9uLXNlYWxlZC8sXG4gICAgICAgIHNjb3BlOiBcImtleXdvcmRcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICByZWdleC5jb25jYXQoLyg/IWVsc2UpLywgSkFWQV9JREVOVF9SRSksXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIEpBVkFfSURFTlRfUkUsXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIC89KD8hPSkvXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwidHlwZVwiLFxuICAgICAgICAgIDM6IFwidmFyaWFibGVcIixcbiAgICAgICAgICA1OiBcIm9wZXJhdG9yXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvcmVjb3JkLyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgSkFWQV9JREVOVF9SRVxuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBQQVJBTVMsXG4gICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gRXhwcmVzc2lvbiBrZXl3b3JkcyBwcmV2ZW50ICdrZXl3b3JkIE5hbWUoLi4uKScgZnJvbSBiZWluZ1xuICAgICAgICAvLyByZWNvZ25pemVkIGFzIGEgZnVuY3Rpb24gZGVmaW5pdGlvblxuICAgICAgICBiZWdpbktleXdvcmRzOiAnbmV3IHRocm93IHJldHVybiBlbHNlJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogW1xuICAgICAgICAgICcoPzonICsgR0VORVJJQ19JREVOVF9SRSArICdcXFxccyspJyxcbiAgICAgICAgICBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUsXG4gICAgICAgICAgL1xccyooPz1cXCgpL1xuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHsgMjogXCJ0aXRsZS5mdW5jdGlvblwiIH0sXG4gICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdwYXJhbXMnLFxuICAgICAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgIEFOTk9UQVRJT04sXG4gICAgICAgICAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgICAgICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgICAgICAgICAgTlVNRVJJQyxcbiAgICAgICAgICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIE5VTUVSSUMsXG4gICAgICBBTk5PVEFUSU9OXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBqYXZhIGFzIGRlZmF1bHQgfTtcbiIsICJjb25zdCBJREVOVF9SRSA9ICdbQS1aYS16JF9dWzAtOUEtWmEteiRfXSonO1xuY29uc3QgS0VZV09SRFMgPSBbXG4gIFwiYXNcIiwgLy8gZm9yIGV4cG9ydHNcbiAgXCJpblwiLFxuICBcIm9mXCIsXG4gIFwiaWZcIixcbiAgXCJmb3JcIixcbiAgXCJ3aGlsZVwiLFxuICBcImZpbmFsbHlcIixcbiAgXCJ2YXJcIixcbiAgXCJuZXdcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcImRvXCIsXG4gIFwicmV0dXJuXCIsXG4gIFwidm9pZFwiLFxuICBcImVsc2VcIixcbiAgXCJicmVha1wiLFxuICBcImNhdGNoXCIsXG4gIFwiaW5zdGFuY2VvZlwiLFxuICBcIndpdGhcIixcbiAgXCJ0aHJvd1wiLFxuICBcImNhc2VcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwidHJ5XCIsXG4gIFwic3dpdGNoXCIsXG4gIFwiY29udGludWVcIixcbiAgXCJ0eXBlb2ZcIixcbiAgXCJkZWxldGVcIixcbiAgXCJsZXRcIixcbiAgXCJ5aWVsZFwiLFxuICBcImNvbnN0XCIsXG4gIFwiY2xhc3NcIixcbiAgLy8gSlMgaGFuZGxlcyB0aGVzZSB3aXRoIGEgc3BlY2lhbCBydWxlXG4gIC8vIFwiZ2V0XCIsXG4gIC8vIFwic2V0XCIsXG4gIFwiZGVidWdnZXJcIixcbiAgXCJhc3luY1wiLFxuICBcImF3YWl0XCIsXG4gIFwic3RhdGljXCIsXG4gIFwiaW1wb3J0XCIsXG4gIFwiZnJvbVwiLFxuICBcImV4cG9ydFwiLFxuICBcImV4dGVuZHNcIlxuXTtcbmNvbnN0IExJVEVSQUxTID0gW1xuICBcInRydWVcIixcbiAgXCJmYWxzZVwiLFxuICBcIm51bGxcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJOYU5cIixcbiAgXCJJbmZpbml0eVwiXG5dO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0c1xuY29uc3QgVFlQRVMgPSBbXG4gIC8vIEZ1bmRhbWVudGFsIG9iamVjdHNcbiAgXCJPYmplY3RcIixcbiAgXCJGdW5jdGlvblwiLFxuICBcIkJvb2xlYW5cIixcbiAgXCJTeW1ib2xcIixcbiAgLy8gbnVtYmVycyBhbmQgZGF0ZXNcbiAgXCJNYXRoXCIsXG4gIFwiRGF0ZVwiLFxuICBcIk51bWJlclwiLFxuICBcIkJpZ0ludFwiLFxuICAvLyB0ZXh0XG4gIFwiU3RyaW5nXCIsXG4gIFwiUmVnRXhwXCIsXG4gIC8vIEluZGV4ZWQgY29sbGVjdGlvbnNcbiAgXCJBcnJheVwiLFxuICBcIkZsb2F0MzJBcnJheVwiLFxuICBcIkZsb2F0NjRBcnJheVwiLFxuICBcIkludDhBcnJheVwiLFxuICBcIlVpbnQ4QXJyYXlcIixcbiAgXCJVaW50OENsYW1wZWRBcnJheVwiLFxuICBcIkludDE2QXJyYXlcIixcbiAgXCJJbnQzMkFycmF5XCIsXG4gIFwiVWludDE2QXJyYXlcIixcbiAgXCJVaW50MzJBcnJheVwiLFxuICBcIkJpZ0ludDY0QXJyYXlcIixcbiAgXCJCaWdVaW50NjRBcnJheVwiLFxuICAvLyBLZXllZCBjb2xsZWN0aW9uc1xuICBcIlNldFwiLFxuICBcIk1hcFwiLFxuICBcIldlYWtTZXRcIixcbiAgXCJXZWFrTWFwXCIsXG4gIC8vIFN0cnVjdHVyZWQgZGF0YVxuICBcIkFycmF5QnVmZmVyXCIsXG4gIFwiU2hhcmVkQXJyYXlCdWZmZXJcIixcbiAgXCJBdG9taWNzXCIsXG4gIFwiRGF0YVZpZXdcIixcbiAgXCJKU09OXCIsXG4gIC8vIENvbnRyb2wgYWJzdHJhY3Rpb24gb2JqZWN0c1xuICBcIlByb21pc2VcIixcbiAgXCJHZW5lcmF0b3JcIixcbiAgXCJHZW5lcmF0b3JGdW5jdGlvblwiLFxuICBcIkFzeW5jRnVuY3Rpb25cIixcbiAgLy8gUmVmbGVjdGlvblxuICBcIlJlZmxlY3RcIixcbiAgXCJQcm94eVwiLFxuICAvLyBJbnRlcm5hdGlvbmFsaXphdGlvblxuICBcIkludGxcIixcbiAgLy8gV2ViQXNzZW1ibHlcbiAgXCJXZWJBc3NlbWJseVwiXG5dO1xuXG5jb25zdCBFUlJPUl9UWVBFUyA9IFtcbiAgXCJFcnJvclwiLFxuICBcIkV2YWxFcnJvclwiLFxuICBcIkludGVybmFsRXJyb3JcIixcbiAgXCJSYW5nZUVycm9yXCIsXG4gIFwiUmVmZXJlbmNlRXJyb3JcIixcbiAgXCJTeW50YXhFcnJvclwiLFxuICBcIlR5cGVFcnJvclwiLFxuICBcIlVSSUVycm9yXCJcbl07XG5cbmNvbnN0IEJVSUxUX0lOX0dMT0JBTFMgPSBbXG4gIFwic2V0SW50ZXJ2YWxcIixcbiAgXCJzZXRUaW1lb3V0XCIsXG4gIFwiY2xlYXJJbnRlcnZhbFwiLFxuICBcImNsZWFyVGltZW91dFwiLFxuXG4gIFwicmVxdWlyZVwiLFxuICBcImV4cG9ydHNcIixcblxuICBcImV2YWxcIixcbiAgXCJpc0Zpbml0ZVwiLFxuICBcImlzTmFOXCIsXG4gIFwicGFyc2VGbG9hdFwiLFxuICBcInBhcnNlSW50XCIsXG4gIFwiZGVjb2RlVVJJXCIsXG4gIFwiZGVjb2RlVVJJQ29tcG9uZW50XCIsXG4gIFwiZW5jb2RlVVJJXCIsXG4gIFwiZW5jb2RlVVJJQ29tcG9uZW50XCIsXG4gIFwiZXNjYXBlXCIsXG4gIFwidW5lc2NhcGVcIlxuXTtcblxuY29uc3QgQlVJTFRfSU5fVkFSSUFCTEVTID0gW1xuICBcImFyZ3VtZW50c1wiLFxuICBcInRoaXNcIixcbiAgXCJzdXBlclwiLFxuICBcImNvbnNvbGVcIixcbiAgXCJ3aW5kb3dcIixcbiAgXCJkb2N1bWVudFwiLFxuICBcImxvY2FsU3RvcmFnZVwiLFxuICBcInNlc3Npb25TdG9yYWdlXCIsXG4gIFwibW9kdWxlXCIsXG4gIFwiZ2xvYmFsXCIgLy8gTm9kZS5qc1xuXTtcblxuY29uc3QgQlVJTFRfSU5TID0gW10uY29uY2F0KFxuICBCVUlMVF9JTl9HTE9CQUxTLFxuICBUWVBFUyxcbiAgRVJST1JfVFlQRVNcbik7XG5cbi8qXG5MYW5ndWFnZTogSmF2YVNjcmlwdFxuRGVzY3JpcHRpb246IEphdmFTY3JpcHQgKEpTKSBpcyBhIGxpZ2h0d2VpZ2h0LCBpbnRlcnByZXRlZCwgb3IganVzdC1pbi10aW1lIGNvbXBpbGVkIHByb2dyYW1taW5nIGxhbmd1YWdlIHdpdGggZmlyc3QtY2xhc3MgZnVuY3Rpb25zLlxuQ2F0ZWdvcnk6IGNvbW1vbiwgc2NyaXB0aW5nLCB3ZWJcbldlYnNpdGU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHRcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBqYXZhc2NyaXB0KGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICAvKipcbiAgICogVGFrZXMgYSBzdHJpbmcgbGlrZSBcIjxCb29nZXJcIiBhbmQgY2hlY2tzIHRvIHNlZVxuICAgKiBpZiB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIFwiPC9Cb29nZXJcIiBsYXRlciBpbiB0aGVcbiAgICogY29udGVudC5cbiAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICAgKiBAcGFyYW0ge3thZnRlcjpudW1iZXJ9fSBwYXJhbTFcbiAgICovXG4gIGNvbnN0IGhhc0Nsb3NpbmdUYWcgPSAobWF0Y2gsIHsgYWZ0ZXIgfSkgPT4ge1xuICAgIGNvbnN0IHRhZyA9IFwiPC9cIiArIG1hdGNoWzBdLnNsaWNlKDEpO1xuICAgIGNvbnN0IHBvcyA9IG1hdGNoLmlucHV0LmluZGV4T2YodGFnLCBhZnRlcik7XG4gICAgcmV0dXJuIHBvcyAhPT0gLTE7XG4gIH07XG5cbiAgY29uc3QgSURFTlRfUkUkMSA9IElERU5UX1JFO1xuICBjb25zdCBGUkFHTUVOVCA9IHtcbiAgICBiZWdpbjogJzw+JyxcbiAgICBlbmQ6ICc8Lz4nXG4gIH07XG4gIC8vIHRvIGF2b2lkIHNvbWUgc3BlY2lhbCBjYXNlcyBpbnNpZGUgaXNUcnVseU9wZW5pbmdUYWdcbiAgY29uc3QgWE1MX1NFTEZfQ0xPU0lORyA9IC88W0EtWmEtejAtOVxcXFwuXzotXStcXHMqXFwvPi87XG4gIGNvbnN0IFhNTF9UQUcgPSB7XG4gICAgYmVnaW46IC88W0EtWmEtejAtOVxcXFwuXzotXSsvLFxuICAgIGVuZDogL1xcL1tBLVphLXowLTlcXFxcLl86LV0rPnxcXC8+LyxcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1JlZ0V4cE1hdGNoQXJyYXl9IG1hdGNoXG4gICAgICogQHBhcmFtIHtDYWxsYmFja1Jlc3BvbnNlfSByZXNwb25zZVxuICAgICAqL1xuICAgIGlzVHJ1bHlPcGVuaW5nVGFnOiAobWF0Y2gsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBhZnRlck1hdGNoSW5kZXggPSBtYXRjaFswXS5sZW5ndGggKyBtYXRjaC5pbmRleDtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2guaW5wdXRbYWZ0ZXJNYXRjaEluZGV4XTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gSFRNTCBzaG91bGQgbm90IGluY2x1ZGUgYW5vdGhlciByYXcgYDxgIGluc2lkZSBhIHRhZ1xuICAgICAgICAvLyBuZXN0ZWQgdHlwZT9cbiAgICAgICAgLy8gYDxBcnJheTxBcnJheTxudW1iZXI+PmAsIGV0Yy5cbiAgICAgICAgbmV4dENoYXIgPT09IFwiPFwiIHx8XG4gICAgICAgIC8vIHRoZSAsIGdpdmVzIGF3YXkgdGhhdCB0aGlzIGlzIG5vdCBIVE1MXG4gICAgICAgIC8vIGA8VCwgQSBleHRlbmRzIGtleW9mIFQsIFY+YFxuICAgICAgICBuZXh0Q2hhciA9PT0gXCIsXCJcbiAgICAgICAgKSB7XG4gICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYDxzb21ldGhpbmc+YFxuICAgICAgLy8gUXVpdGUgcG9zc2libHkgYSB0YWcsIGxldHMgbG9vayBmb3IgYSBtYXRjaGluZyBjbG9zaW5nIHRhZy4uLlxuICAgICAgaWYgKG5leHRDaGFyID09PSBcIj5cIikge1xuICAgICAgICAvLyBpZiB3ZSBjYW5ub3QgZmluZCBhIG1hdGNoaW5nIGNsb3NpbmcgdGFnLCB0aGVuIHdlXG4gICAgICAgIC8vIHdpbGwgaWdub3JlIGl0XG4gICAgICAgIGlmICghaGFzQ2xvc2luZ1RhZyhtYXRjaCwgeyBhZnRlcjogYWZ0ZXJNYXRjaEluZGV4IH0pKSB7XG4gICAgICAgICAgcmVzcG9uc2UuaWdub3JlTWF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBgPGJsYWggLz5gIChzZWxmLWNsb3NpbmcpXG4gICAgICAvLyBoYW5kbGVkIGJ5IHNpbXBsZVNlbGZDbG9zaW5nIHJ1bGVcblxuICAgICAgbGV0IG07XG4gICAgICBjb25zdCBhZnRlck1hdGNoID0gbWF0Y2guaW5wdXQuc3Vic3RyaW5nKGFmdGVyTWF0Y2hJbmRleCk7XG5cbiAgICAgIC8vIHNvbWUgbW9yZSB0ZW1wbGF0ZSB0eXBpbmcgc3R1ZmZcbiAgICAgIC8vICA8VCA9IGFueT4oa2V5Pzogc3RyaW5nKSA9PiBNb2RpZnk8XG4gICAgICBpZiAoKG0gPSBhZnRlck1hdGNoLm1hdGNoKC9eXFxzKj0vKSkpIHtcbiAgICAgICAgcmVzcG9uc2UuaWdub3JlTWF0Y2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBgPEZyb20gZXh0ZW5kcyBzdHJpbmc+YFxuICAgICAgLy8gdGVjaG5pY2FsbHkgdGhpcyBjb3VsZCBiZSBIVE1MLCBidXQgaXQgc21lbGxzIGxpa2UgYSB0eXBlXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIHVnaCwgYnV0IGFkZGVkIHNwZWNpZmljYWxseSBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzI3NlxuICAgICAgaWYgKChtID0gYWZ0ZXJNYXRjaC5tYXRjaCgvXlxccytleHRlbmRzXFxzKy8pKSkge1xuICAgICAgICBpZiAobS5pbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtcmV0dXJuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBLRVlXT1JEUyQxID0ge1xuICAgICRwYXR0ZXJuOiBJREVOVF9SRSxcbiAgICBrZXl3b3JkOiBLRVlXT1JEUyxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TLFxuICAgIFwidmFyaWFibGUubGFuZ3VhZ2VcIjogQlVJTFRfSU5fVkFSSUFCTEVTXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1saXRlcmFscy1udW1lcmljLWxpdGVyYWxzXG4gIGNvbnN0IGRlY2ltYWxEaWdpdHMgPSAnWzAtOV0oXz9bMC05XSkqJztcbiAgY29uc3QgZnJhYyA9IGBcXFxcLigke2RlY2ltYWxEaWdpdHN9KWA7XG4gIC8vIERlY2ltYWxJbnRlZ2VyTGl0ZXJhbCwgaW5jbHVkaW5nIEFubmV4IEIgTm9uT2N0YWxEZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZGRpdGlvbmFsLXN5bnRheC1udW1lcmljLWxpdGVyYWxzXG4gIGNvbnN0IGRlY2ltYWxJbnRlZ2VyID0gYDB8WzEtOV0oXz9bMC05XSkqfDBbMC03XSpbODldWzAtOV0qYDtcbiAgY29uc3QgTlVNQkVSID0ge1xuICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIC8vIERlY2ltYWxMaXRlcmFsXG4gICAgICB7IGJlZ2luOiBgKFxcXFxiKCR7ZGVjaW1hbEludGVnZXJ9KSgoJHtmcmFjfSl8XFxcXC4pP3woJHtmcmFjfSkpYCArXG4gICAgICAgIGBbZUVdWystXT8oJHtkZWNpbWFsRGlnaXRzfSlcXFxcYmAgfSxcbiAgICAgIHsgYmVnaW46IGBcXFxcYigke2RlY2ltYWxJbnRlZ2VyfSlcXFxcYigoJHtmcmFjfSlcXFxcYnxcXFxcLik/fCgke2ZyYWN9KVxcXFxiYCB9LFxuXG4gICAgICAvLyBEZWNpbWFsQmlnSW50ZWdlckxpdGVyYWxcbiAgICAgIHsgYmVnaW46IGBcXFxcYigwfFsxLTldKF8/WzAtOV0pKiluXFxcXGJgIH0sXG5cbiAgICAgIC8vIE5vbkRlY2ltYWxJbnRlZ2VyTGl0ZXJhbFxuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbeFhdWzAtOWEtZkEtRl0oXz9bMC05YS1mQS1GXSkqbj9cXFxcYlwiIH0sXG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFtiQl1bMC0xXShfP1swLTFdKSpuP1xcXFxiXCIgfSxcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwW29PXVswLTddKF8/WzAtN10pKm4/XFxcXGJcIiB9LFxuXG4gICAgICAvLyBMZWdhY3lPY3RhbEludGVnZXJMaXRlcmFsIChkb2VzIG5vdCBpbmNsdWRlIHVuZGVyc2NvcmUgc2VwYXJhdG9ycylcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWRkaXRpb25hbC1zeW50YXgtbnVtZXJpYy1saXRlcmFsc1xuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbMC03XStuP1xcXFxiXCIgfSxcbiAgICBdLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IFNVQlNUID0ge1xuICAgIGNsYXNzTmFtZTogJ3N1YnN0JyxcbiAgICBiZWdpbjogJ1xcXFwkXFxcXHsnLFxuICAgIGVuZDogJ1xcXFx9JyxcbiAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICBjb250YWluczogW10gLy8gZGVmaW5lZCBsYXRlclxuICB9O1xuICBjb25zdCBIVE1MX1RFTVBMQVRFID0ge1xuICAgIGJlZ2luOiAnaHRtbGAnLFxuICAgIGVuZDogJycsXG4gICAgc3RhcnRzOiB7XG4gICAgICBlbmQ6ICdgJyxcbiAgICAgIHJldHVybkVuZDogZmFsc2UsXG4gICAgICBjb250YWluczogW1xuICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgIFNVQlNUXG4gICAgICBdLFxuICAgICAgc3ViTGFuZ3VhZ2U6ICd4bWwnXG4gICAgfVxuICB9O1xuICBjb25zdCBDU1NfVEVNUExBVEUgPSB7XG4gICAgYmVnaW46ICdjc3NgJyxcbiAgICBlbmQ6ICcnLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnYCcsXG4gICAgICByZXR1cm5FbmQ6IGZhbHNlLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICBTVUJTVFxuICAgICAgXSxcbiAgICAgIHN1Ykxhbmd1YWdlOiAnY3NzJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgR1JBUEhRTF9URU1QTEFURSA9IHtcbiAgICBiZWdpbjogJ2dxbGAnLFxuICAgIGVuZDogJycsXG4gICAgc3RhcnRzOiB7XG4gICAgICBlbmQ6ICdgJyxcbiAgICAgIHJldHVybkVuZDogZmFsc2UsXG4gICAgICBjb250YWluczogW1xuICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgIFNVQlNUXG4gICAgICBdLFxuICAgICAgc3ViTGFuZ3VhZ2U6ICdncmFwaHFsJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgVEVNUExBVEVfU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgYmVnaW46ICdgJyxcbiAgICBlbmQ6ICdgJyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgU1VCU1RcbiAgICBdXG4gIH07XG4gIGNvbnN0IEpTRE9DX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoXG4gICAgL1xcL1xcKlxcKig/IVxcLykvLFxuICAgICdcXFxcKi8nLFxuICAgIHtcbiAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBiZWdpbjogJyg/PUBbQS1aYS16XSspJyxcbiAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnZG9jdGFnJyxcbiAgICAgICAgICAgICAgYmVnaW46ICdAW0EtWmEtel0rJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICAgICAgICAgIGJlZ2luOiAnXFxcXHsnLFxuICAgICAgICAgICAgICBlbmQ6ICdcXFxcfScsXG4gICAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgICAgICAgIGV4Y2x1ZGVCZWdpbjogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6ICd2YXJpYWJsZScsXG4gICAgICAgICAgICAgIGJlZ2luOiBJREVOVF9SRSQxICsgJyg/PVxcXFxzKigtKXwkKScsXG4gICAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGVhdCBzcGFjZXMgKG5vdCBuZXdsaW5lcykgc28gd2UgY2FuIGZpbmRcbiAgICAgICAgICAgIC8vIHR5cGVzIG9yIHZhcmlhYmxlc1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBiZWdpbjogLyg/PVteXFxuXSlcXHMvLFxuICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gICk7XG4gIGNvbnN0IENPTU1FTlQgPSB7XG4gICAgY2xhc3NOYW1lOiBcImNvbW1lbnRcIixcbiAgICB2YXJpYW50czogW1xuICAgICAgSlNET0NfQ09NTUVOVCxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREVcbiAgICBdXG4gIH07XG4gIGNvbnN0IFNVQlNUX0lOVEVSTkFMUyA9IFtcbiAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICBIVE1MX1RFTVBMQVRFLFxuICAgIENTU19URU1QTEFURSxcbiAgICBHUkFQSFFMX1RFTVBMQVRFLFxuICAgIFRFTVBMQVRFX1NUUklORyxcbiAgICAvLyBTa2lwIG51bWJlcnMgd2hlbiB0aGV5IGFyZSBwYXJ0IG9mIGEgdmFyaWFibGUgbmFtZVxuICAgIHsgbWF0Y2g6IC9cXCRcXGQrLyB9LFxuICAgIE5VTUJFUixcbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsOlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8zMjg4XG4gICAgLy8gaGxqcy5SRUdFWFBfTU9ERVxuICBdO1xuICBTVUJTVC5jb250YWlucyA9IFNVQlNUX0lOVEVSTkFMU1xuICAgIC5jb25jYXQoe1xuICAgICAgLy8gd2UgbmVlZCB0byBwYWlyIHVwIHt9IGluc2lkZSBvdXIgc3Vic3QgdG8gcHJldmVudFxuICAgICAgLy8gaXQgZnJvbSBlbmRpbmcgdG9vIGVhcmx5IGJ5IG1hdGNoaW5nIGFub3RoZXIgfVxuICAgICAgYmVnaW46IC9cXHsvLFxuICAgICAgZW5kOiAvXFx9LyxcbiAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgXCJzZWxmXCJcbiAgICAgIF0uY29uY2F0KFNVQlNUX0lOVEVSTkFMUylcbiAgICB9KTtcbiAgY29uc3QgU1VCU1RfQU5EX0NPTU1FTlRTID0gW10uY29uY2F0KENPTU1FTlQsIFNVQlNULmNvbnRhaW5zKTtcbiAgY29uc3QgUEFSQU1TX0NPTlRBSU5TID0gU1VCU1RfQU5EX0NPTU1FTlRTLmNvbmNhdChbXG4gICAgLy8gZWF0IHJlY3Vyc2l2ZSBwYXJlbnMgaW4gc3ViIGV4cHJlc3Npb25zXG4gICAge1xuICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgZW5kOiAvXFwpLyxcbiAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgICAgY29udGFpbnM6IFtcInNlbGZcIl0uY29uY2F0KFNVQlNUX0FORF9DT01NRU5UUylcbiAgICB9XG4gIF0pO1xuICBjb25zdCBQQVJBTVMgPSB7XG4gICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICBjb250YWluczogUEFSQU1TX0NPTlRBSU5TXG4gIH07XG5cbiAgLy8gRVM2IGNsYXNzZXNcbiAgY29uc3QgQ0xBU1NfT1JfRVhURU5EUyA9IHtcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gY2xhc3MgQ2FyIGV4dGVuZHMgdmVoaWNsZVxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9jbGFzcy8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIElERU5UX1JFJDEsXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIC9leHRlbmRzLyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgcmVnZXguY29uY2F0KElERU5UX1JFJDEsIFwiKFwiLCByZWdleC5jb25jYXQoL1xcLi8sIElERU5UX1JFJDEpLCBcIikqXCIpXG4gICAgICAgIF0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5jbGFzc1wiLFxuICAgICAgICAgIDU6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDc6IFwidGl0bGUuY2xhc3MuaW5oZXJpdGVkXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGNsYXNzIENhclxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9jbGFzcy8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIElERU5UX1JFJDFcbiAgICAgICAgXSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgIF1cbiAgfTtcblxuICBjb25zdCBDTEFTU19SRUZFUkVOQ0UgPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOlxuICAgIHJlZ2V4LmVpdGhlcihcbiAgICAgIC8vIEhhcmQgY29kZWQgZXhjZXB0aW9uc1xuICAgICAgL1xcYkpTT04vLFxuICAgICAgLy8gRmxvYXQzMkFycmF5LCBPdXRUXG4gICAgICAvXFxiW0EtWl1bYS16XSsoW0EtWl1bYS16XSp8XFxkKSovLFxuICAgICAgLy8gQ1NTRmFjdG9yeSwgQ1NTRmFjdG9yeVRcbiAgICAgIC9cXGJbQS1aXXsyLH0oW0EtWl1bYS16XSt8XFxkKSsoW0EtWl1bYS16XSopKi8sXG4gICAgICAvLyBGUHMsIEZQc1RcbiAgICAgIC9cXGJbQS1aXXsyLH1bYS16XSsoW0EtWl1bYS16XSt8XFxkKSooW0EtWl1bYS16XSopKi8sXG4gICAgICAvLyBQXG4gICAgICAvLyBzaW5nbGUgbGV0dGVycyBhcmUgbm90IGhpZ2hsaWdodGVkXG4gICAgICAvLyBCTEFIXG4gICAgICAvLyB0aGlzIHdpbGwgYmUgZmxhZ2dlZCBhcyBhIFVQUEVSX0NBU0VfQ09OU1RBTlQgaW5zdGVhZFxuICAgICksXG4gICAgY2xhc3NOYW1lOiBcInRpdGxlLmNsYXNzXCIsXG4gICAga2V5d29yZHM6IHtcbiAgICAgIF86IFtcbiAgICAgICAgLy8gc2Ugd2Ugc3RpbGwgZ2V0IHJlbGV2YW5jZSBjcmVkaXQgZm9yIEpTIGxpYnJhcnkgY2xhc3Nlc1xuICAgICAgICAuLi5UWVBFUyxcbiAgICAgICAgLi4uRVJST1JfVFlQRVNcbiAgICAgIF1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgVVNFX1NUUklDVCA9IHtcbiAgICBsYWJlbDogXCJ1c2Vfc3RyaWN0XCIsXG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgcmVsZXZhbmNlOiAxMCxcbiAgICBiZWdpbjogL15cXHMqWydcIl11c2UgKHN0cmljdHxhc20pWydcIl0vXG4gIH07XG5cbiAgY29uc3QgRlVOQ1RJT05fREVGSU5JVElPTiA9IHtcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9mdW5jdGlvbi8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIElERU5UX1JFJDEsXG4gICAgICAgICAgLyg/PVxccypcXCgpL1xuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gYW5vbnltb3VzIGZ1bmN0aW9uXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgL2Z1bmN0aW9uLyxcbiAgICAgICAgICAvXFxzKig/PVxcKCkvXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlLmZ1bmN0aW9uXCJcbiAgICB9LFxuICAgIGxhYmVsOiBcImZ1bmMuZGVmXCIsXG4gICAgY29udGFpbnM6IFsgUEFSQU1TIF0sXG4gICAgaWxsZWdhbDogLyUvXG4gIH07XG5cbiAgY29uc3QgVVBQRVJfQ0FTRV9DT05TVEFOVCA9IHtcbiAgICByZWxldmFuY2U6IDAsXG4gICAgbWF0Y2g6IC9cXGJbQS1aXVtBLVpfMC05XStcXGIvLFxuICAgIGNsYXNzTmFtZTogXCJ2YXJpYWJsZS5jb25zdGFudFwiXG4gIH07XG5cbiAgZnVuY3Rpb24gbm9uZU9mKGxpc3QpIHtcbiAgICByZXR1cm4gcmVnZXguY29uY2F0KFwiKD8hXCIsIGxpc3Quam9pbihcInxcIiksIFwiKVwiKTtcbiAgfVxuXG4gIGNvbnN0IEZVTkNUSU9OX0NBTEwgPSB7XG4gICAgbWF0Y2g6IHJlZ2V4LmNvbmNhdChcbiAgICAgIC9cXGIvLFxuICAgICAgbm9uZU9mKFtcbiAgICAgICAgLi4uQlVJTFRfSU5fR0xPQkFMUyxcbiAgICAgICAgXCJzdXBlclwiLFxuICAgICAgICBcImltcG9ydFwiXG4gICAgICBdKSxcbiAgICAgIElERU5UX1JFJDEsIHJlZ2V4Lmxvb2thaGVhZCgvXFwoLykpLFxuICAgIGNsYXNzTmFtZTogXCJ0aXRsZS5mdW5jdGlvblwiLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIGNvbnN0IFBST1BFUlRZX0FDQ0VTUyA9IHtcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KC9cXC4vLCByZWdleC5sb29rYWhlYWQoXG4gICAgICByZWdleC5jb25jYXQoSURFTlRfUkUkMSwgLyg/IVswLTlBLVphLXokXyhdKS8pXG4gICAgKSksXG4gICAgZW5kOiBJREVOVF9SRSQxLFxuICAgIGV4Y2x1ZGVCZWdpbjogdHJ1ZSxcbiAgICBrZXl3b3JkczogXCJwcm90b3R5cGVcIixcbiAgICBjbGFzc05hbWU6IFwicHJvcGVydHlcIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBHRVRURVJfT1JfU0VUVEVSID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvZ2V0fHNldC8sXG4gICAgICAvXFxzKy8sXG4gICAgICBJREVOVF9SRSQxLFxuICAgICAgLyg/PVxcKCkvXG4gICAgXSxcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgfSxcbiAgICBjb250YWluczogW1xuICAgICAgeyAvLyBlYXQgdG8gYXZvaWQgZW1wdHkgcGFyYW1zXG4gICAgICAgIGJlZ2luOiAvXFwoXFwpL1xuICAgICAgfSxcbiAgICAgIFBBUkFNU1xuICAgIF1cbiAgfTtcblxuICBjb25zdCBGVU5DX0xFQURfSU5fUkUgPSAnKFxcXFwoJyArXG4gICAgJ1teKCldKihcXFxcKCcgK1xuICAgICdbXigpXSooXFxcXCgnICtcbiAgICAnW14oKV0qJyArXG4gICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAnXFxcXClbXigpXSopKicgK1xuICAgICdcXFxcKXwnICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFICsgJylcXFxccyo9Pic7XG5cbiAgY29uc3QgRlVOQ1RJT05fVkFSSUFCTEUgPSB7XG4gICAgbWF0Y2g6IFtcbiAgICAgIC9jb25zdHx2YXJ8bGV0LywgL1xccysvLFxuICAgICAgSURFTlRfUkUkMSwgL1xccyovLFxuICAgICAgLz1cXHMqLyxcbiAgICAgIC8oYXN5bmNcXHMqKT8vLCAvLyBhc3luYyBpcyBvcHRpb25hbFxuICAgICAgcmVnZXgubG9va2FoZWFkKEZVTkNfTEVBRF9JTl9SRSlcbiAgICBdLFxuICAgIGtleXdvcmRzOiBcImFzeW5jXCIsXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIFBBUkFNU1xuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdKYXZhU2NyaXB0JyxcbiAgICBhbGlhc2VzOiBbJ2pzJywgJ2pzeCcsICdtanMnLCAnY2pzJ10sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTJDEsXG4gICAgLy8gdGhpcyB3aWxsIGJlIGV4dGVuZGVkIGJ5IFR5cGVTY3JpcHRcbiAgICBleHBvcnRzOiB7IFBBUkFNU19DT05UQUlOUywgQ0xBU1NfUkVGRVJFTkNFIH0sXG4gICAgaWxsZWdhbDogLyMoPyFbJF9BLXpdKS8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuU0hFQkFORyh7XG4gICAgICAgIGxhYmVsOiBcInNoZWJhbmdcIixcbiAgICAgICAgYmluYXJ5OiBcIm5vZGVcIixcbiAgICAgICAgcmVsZXZhbmNlOiA1XG4gICAgICB9KSxcbiAgICAgIFVTRV9TVFJJQ1QsXG4gICAgICBobGpzLkFQT1NfU1RSSU5HX01PREUsXG4gICAgICBobGpzLlFVT1RFX1NUUklOR19NT0RFLFxuICAgICAgSFRNTF9URU1QTEFURSxcbiAgICAgIENTU19URU1QTEFURSxcbiAgICAgIEdSQVBIUUxfVEVNUExBVEUsXG4gICAgICBURU1QTEFURV9TVFJJTkcsXG4gICAgICBDT01NRU5ULFxuICAgICAgLy8gU2tpcCBudW1iZXJzIHdoZW4gdGhleSBhcmUgcGFydCBvZiBhIHZhcmlhYmxlIG5hbWVcbiAgICAgIHsgbWF0Y2g6IC9cXCRcXGQrLyB9LFxuICAgICAgTlVNQkVSLFxuICAgICAgQ0xBU1NfUkVGRVJFTkNFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdhdHRyJyxcbiAgICAgICAgYmVnaW46IElERU5UX1JFJDEgKyByZWdleC5sb29rYWhlYWQoJzonKSxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgRlVOQ1RJT05fVkFSSUFCTEUsXG4gICAgICB7IC8vIFwidmFsdWVcIiBjb250YWluZXJcbiAgICAgICAgYmVnaW46ICcoJyArIGhsanMuUkVfU1RBUlRFUlNfUkUgKyAnfFxcXFxiKGNhc2V8cmV0dXJufHRocm93KVxcXFxiKVxcXFxzKicsXG4gICAgICAgIGtleXdvcmRzOiAncmV0dXJuIHRocm93IGNhc2UnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgQ09NTUVOVCxcbiAgICAgICAgICBobGpzLlJFR0VYUF9NT0RFLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY291bnQgdGhlIHBhcmVucyB0byBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcnJlY3QgYm91bmRpbmcgKCApIGJlZm9yZSB0aGUgPT4uICBUaGVyZSBjb3VsZCBiZSBhbnkgbnVtYmVyIG9mXG4gICAgICAgICAgICAvLyBzdWItZXhwcmVzc2lvbnMgaW5zaWRlIGFsc28gc3Vycm91bmRlZCBieSBwYXJlbnMuXG4gICAgICAgICAgICBiZWdpbjogRlVOQ19MRUFEX0lOX1JFLFxuICAgICAgICAgICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgICAgICAgICBlbmQ6ICdcXFxccyo9PicsXG4gICAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBiZWdpbjogaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgICAgICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46IC9cXChcXHMqXFwpLyxcbiAgICAgICAgICAgICAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgICAgICAgICAgICAgICAgICBjb250YWluczogUEFSQU1TX0NPTlRBSU5TXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IC8vIGNvdWxkIGJlIGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgcGFyYW1zIHRvIGEgZnVuY3Rpb24gY2FsbFxuICAgICAgICAgICAgYmVnaW46IC8sLyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF0Y2g6IC9cXHMrLyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyAvLyBKU1hcbiAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgIHsgYmVnaW46IEZSQUdNRU5ULmJlZ2luLCBlbmQ6IEZSQUdNRU5ULmVuZCB9LFxuICAgICAgICAgICAgICB7IG1hdGNoOiBYTUxfU0VMRl9DTE9TSU5HIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiZWdpbjogWE1MX1RBRy5iZWdpbixcbiAgICAgICAgICAgICAgICAvLyB3ZSBjYXJlZnVsbHkgY2hlY2sgdGhlIG9wZW5pbmcgdGFnIHRvIHNlZSBpZiBpdCB0cnVseVxuICAgICAgICAgICAgICAgIC8vIGlzIGEgdGFnIGFuZCBub3QgYSBmYWxzZSBwb3NpdGl2ZVxuICAgICAgICAgICAgICAgICdvbjpiZWdpbic6IFhNTF9UQUcuaXNUcnVseU9wZW5pbmdUYWcsXG4gICAgICAgICAgICAgICAgZW5kOiBYTUxfVEFHLmVuZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc3ViTGFuZ3VhZ2U6ICd4bWwnLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJlZ2luOiBYTUxfVEFHLmJlZ2luLFxuICAgICAgICAgICAgICAgIGVuZDogWE1MX1RBRy5lbmQsXG4gICAgICAgICAgICAgICAgc2tpcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb250YWluczogWydzZWxmJ11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBGVU5DVElPTl9ERUZJTklUSU9OLFxuICAgICAge1xuICAgICAgICAvLyBwcmV2ZW50IHRoaXMgZnJvbSBnZXR0aW5nIHN3YWxsb3dlZCB1cCBieSBmdW5jdGlvblxuICAgICAgICAvLyBzaW5jZSB0aGV5IGFwcGVhciBcImZ1bmN0aW9uIGxpa2VcIlxuICAgICAgICBiZWdpbktleXdvcmRzOiBcIndoaWxlIGlmIHN3aXRjaCBjYXRjaCBmb3JcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gd2UgaGF2ZSB0byBjb3VudCB0aGUgcGFyZW5zIHRvIG1ha2Ugc3VyZSB3ZSBhY3R1YWxseSBoYXZlIHRoZSBjb3JyZWN0XG4gICAgICAgIC8vIGJvdW5kaW5nICggKS4gIFRoZXJlIGNvdWxkIGJlIGFueSBudW1iZXIgb2Ygc3ViLWV4cHJlc3Npb25zIGluc2lkZVxuICAgICAgICAvLyBhbHNvIHN1cnJvdW5kZWQgYnkgcGFyZW5zLlxuICAgICAgICBiZWdpbjogJ1xcXFxiKD8hZnVuY3Rpb24pJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArXG4gICAgICAgICAgJ1xcXFwoJyArIC8vIGZpcnN0IHBhcmVuc1xuICAgICAgICAgICdbXigpXSooXFxcXCgnICtcbiAgICAgICAgICAgICdbXigpXSooXFxcXCgnICtcbiAgICAgICAgICAgICAgJ1teKCldKicgK1xuICAgICAgICAgICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAgICAgICAnXFxcXClbXigpXSopKicgK1xuICAgICAgICAgICdcXFxcKVxcXFxzKlxcXFx7JywgLy8gZW5kIHBhcmVuc1xuICAgICAgICByZXR1cm5CZWdpbjp0cnVlLFxuICAgICAgICBsYWJlbDogXCJmdW5jLmRlZlwiLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIFBBUkFNUyxcbiAgICAgICAgICBobGpzLmluaGVyaXQoaGxqcy5USVRMRV9NT0RFLCB7IGJlZ2luOiBJREVOVF9SRSQxLCBjbGFzc05hbWU6IFwidGl0bGUuZnVuY3Rpb25cIiB9KVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gY2F0Y2ggLi4uIHNvIGl0IHdvbid0IHRyaWdnZXIgdGhlIHByb3BlcnR5IHJ1bGUgYmVsb3dcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IC9cXC5cXC5cXC4vLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICBQUk9QRVJUWV9BQ0NFU1MsXG4gICAgICAvLyBoYWNrOiBwcmV2ZW50cyBkZXRlY3Rpb24gb2Yga2V5d29yZHMgaW4gc29tZSBjaXJjdW1zdGFuY2VzXG4gICAgICAvLyAua2V5d29yZCgpXG4gICAgICAvLyAka2V5d29yZCA9IHhcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICdcXFxcJCcgKyBJREVOVF9SRSQxLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiBbIC9cXGJjb25zdHJ1Y3Rvcig/PVxccypcXCgpLyBdLFxuICAgICAgICBjbGFzc05hbWU6IHsgMTogXCJ0aXRsZS5mdW5jdGlvblwiIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbIFBBUkFNUyBdXG4gICAgICB9LFxuICAgICAgRlVOQ1RJT05fQ0FMTCxcbiAgICAgIFVQUEVSX0NBU0VfQ09OU1RBTlQsXG4gICAgICBDTEFTU19PUl9FWFRFTkRTLFxuICAgICAgR0VUVEVSX09SX1NFVFRFUixcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IC9cXCRbKC5dLyAvLyByZWxldmFuY2UgYm9vc3RlciBmb3IgYSBwYXR0ZXJuIGNvbW1vbiB0byBKUyBsaWJzOiBgJChzb21ldGhpbmcpYCBhbmQgYCQuc29tZXRoaW5nYFxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgamF2YXNjcmlwdCBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBKU09OXG5EZXNjcmlwdGlvbjogSlNPTiAoSmF2YVNjcmlwdCBPYmplY3QgTm90YXRpb24pIGlzIGEgbGlnaHR3ZWlnaHQgZGF0YS1pbnRlcmNoYW5nZSBmb3JtYXQuXG5BdXRob3I6IEl2YW4gU2FnYWxhZXYgPG1hbmlhY0Bzb2Z0d2FyZW1hbmlhY3Mub3JnPlxuV2Vic2l0ZTogaHR0cDovL3d3dy5qc29uLm9yZ1xuQ2F0ZWdvcnk6IGNvbW1vbiwgcHJvdG9jb2xzLCB3ZWJcbiovXG5cbmZ1bmN0aW9uIGpzb24oaGxqcykge1xuICBjb25zdCBBVFRSSUJVVEUgPSB7XG4gICAgY2xhc3NOYW1lOiAnYXR0cicsXG4gICAgYmVnaW46IC9cIihcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKD89XFxzKjopLyxcbiAgICByZWxldmFuY2U6IDEuMDFcbiAgfTtcbiAgY29uc3QgUFVOQ1RVQVRJT04gPSB7XG4gICAgbWF0Y2g6IC9be31bXFxdLDpdLyxcbiAgICBjbGFzc05hbWU6IFwicHVuY3R1YXRpb25cIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwibnVsbFwiXG4gIF07XG4gIC8vIE5PVEU6IG5vcm1hbGx5IHdlIHdvdWxkIHJlbHkgb24gYGtleXdvcmRzYCBmb3IgdGhpcyBidXQgdXNpbmcgYSBtb2RlIGhlcmUgYWxsb3dzIHVzXG4gIC8vIC0gdG8gdXNlIHRoZSB2ZXJ5IHRpZ2h0IGBpbGxlZ2FsOiBcXFNgIHJ1bGUgbGF0ZXIgdG8gZmxhZyBhbnkgb3RoZXIgY2hhcmFjdGVyXG4gIC8vIC0gYXMgaWxsZWdhbCBpbmRpY2F0aW5nIHRoYXQgZGVzcGl0ZSBsb29raW5nIGxpa2UgSlNPTiB3ZSBkbyBub3QgdHJ1bHkgaGF2ZVxuICAvLyAtIEpTT04gYW5kIHRodXMgaW1wcm92ZSBmYWxzZS1wb3NpdGl2ZWx5IGdyZWF0bHkgc2luY2UgSlNPTiB3aWxsIHRyeSBhbmQgY2xhaW1cbiAgLy8gLSBhbGwgc29ydHMgb2YgSlNPTiBsb29raW5nIHN0dWZmXG4gIGNvbnN0IExJVEVSQUxTX01PREUgPSB7XG4gICAgc2NvcGU6IFwibGl0ZXJhbFwiLFxuICAgIGJlZ2luS2V5d29yZHM6IExJVEVSQUxTLmpvaW4oXCIgXCIpLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0pTT04nLFxuICAgIGtleXdvcmRzOntcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEFUVFJJQlVURSxcbiAgICAgIFBVTkNUVUFUSU9OLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIExJVEVSQUxTX01PREUsXG4gICAgICBobGpzLkNfTlVNQkVSX01PREUsXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgXSxcbiAgICBpbGxlZ2FsOiAnXFxcXFMnXG4gIH07XG59XG5cbmV4cG9ydCB7IGpzb24gYXMgZGVmYXVsdCB9O1xuIiwgIi8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2UxNS9odG1sL2pscy0zLmh0bWwjamxzLTMuMTBcbnZhciBkZWNpbWFsRGlnaXRzID0gJ1swLTldKF8qWzAtOV0pKic7XG52YXIgZnJhYyA9IGBcXFxcLigke2RlY2ltYWxEaWdpdHN9KWA7XG52YXIgaGV4RGlnaXRzID0gJ1swLTlhLWZBLUZdKF8qWzAtOWEtZkEtRl0pKic7XG52YXIgTlVNRVJJQyA9IHtcbiAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgdmFyaWFudHM6IFtcbiAgICAvLyBEZWNpbWFsRmxvYXRpbmdQb2ludExpdGVyYWxcbiAgICAvLyBpbmNsdWRpbmcgRXhwb25lbnRQYXJ0XG4gICAgeyBiZWdpbjogYChcXFxcYigke2RlY2ltYWxEaWdpdHN9KSgoJHtmcmFjfSl8XFxcXC4pP3woJHtmcmFjfSkpYCArXG4gICAgICBgW2VFXVsrLV0/KCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdP1xcXFxiYCB9LFxuICAgIC8vIGV4Y2x1ZGluZyBFeHBvbmVudFBhcnRcbiAgICB7IGJlZ2luOiBgXFxcXGIoJHtkZWNpbWFsRGlnaXRzfSkoKCR7ZnJhY30pW2ZGZERdP1xcXFxifFxcXFwuKFtmRmREXVxcXFxiKT8pYCB9LFxuICAgIHsgYmVnaW46IGAoJHtmcmFjfSlbZkZkRF0/XFxcXGJgIH0sXG4gICAgeyBiZWdpbjogYFxcXFxiKCR7ZGVjaW1hbERpZ2l0c30pW2ZGZERdXFxcXGJgIH0sXG5cbiAgICAvLyBIZXhhZGVjaW1hbEZsb2F0aW5nUG9pbnRMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oKCR7aGV4RGlnaXRzfSlcXFxcLj98KCR7aGV4RGlnaXRzfSk/XFxcXC4oJHtoZXhEaWdpdHN9KSlgICtcbiAgICAgIGBbcFBdWystXT8oJHtkZWNpbWFsRGlnaXRzfSlbZkZkRF0/XFxcXGJgIH0sXG5cbiAgICAvLyBEZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIoMHxbMS05XShfKlswLTldKSopW2xMXT9cXFxcYicgfSxcblxuICAgIC8vIEhleEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogYFxcXFxiMFt4WF0oJHtoZXhEaWdpdHN9KVtsTF0/XFxcXGJgIH0sXG5cbiAgICAvLyBPY3RhbEludGVnZXJMaXRlcmFsXG4gICAgeyBiZWdpbjogJ1xcXFxiMChfKlswLTddKSpbbExdP1xcXFxiJyB9LFxuXG4gICAgLy8gQmluYXJ5SW50ZWdlckxpdGVyYWxcbiAgICB7IGJlZ2luOiAnXFxcXGIwW2JCXVswMV0oXypbMDFdKSpbbExdP1xcXFxiJyB9LFxuICBdLFxuICByZWxldmFuY2U6IDBcbn07XG5cbi8qXG4gTGFuZ3VhZ2U6IEtvdGxpblxuIERlc2NyaXB0aW9uOiBLb3RsaW4gaXMgYW4gT1NTIHN0YXRpY2FsbHkgdHlwZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhhdCB0YXJnZXRzIHRoZSBKVk0sIEFuZHJvaWQsIEphdmFTY3JpcHQgYW5kIE5hdGl2ZS5cbiBBdXRob3I6IFNlcmdleSBNYXNoa292IDxjeTZlckduMG1AZ21haWwuY29tPlxuIFdlYnNpdGU6IGh0dHBzOi8va290bGlubGFuZy5vcmdcbiBDYXRlZ29yeTogY29tbW9uXG4gKi9cblxuZnVuY3Rpb24ga290bGluKGhsanMpIHtcbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAga2V5d29yZDpcbiAgICAgICdhYnN0cmFjdCBhcyB2YWwgdmFyIHZhcmFyZyBnZXQgc2V0IGNsYXNzIG9iamVjdCBvcGVuIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBub2lubGluZSAnXG4gICAgICArICdjcm9zc2lubGluZSBkeW5hbWljIGZpbmFsIGVudW0gaWYgZWxzZSBkbyB3aGlsZSBmb3Igd2hlbiB0aHJvdyB0cnkgY2F0Y2ggZmluYWxseSAnXG4gICAgICArICdpbXBvcnQgcGFja2FnZSBpcyBpbiBmdW4gb3ZlcnJpZGUgY29tcGFuaW9uIHJlaWZpZWQgaW5saW5lIGxhdGVpbml0IGluaXQgJ1xuICAgICAgKyAnaW50ZXJmYWNlIGFubm90YXRpb24gZGF0YSBzZWFsZWQgaW50ZXJuYWwgaW5maXggb3BlcmF0b3Igb3V0IGJ5IGNvbnN0cnVjdG9yIHN1cGVyICdcbiAgICAgICsgJ3RhaWxyZWMgd2hlcmUgY29uc3QgaW5uZXIgc3VzcGVuZCB0eXBlYWxpYXMgZXh0ZXJuYWwgZXhwZWN0IGFjdHVhbCcsXG4gICAgYnVpbHRfaW46XG4gICAgICAnQnl0ZSBTaG9ydCBDaGFyIEludCBMb25nIEJvb2xlYW4gRmxvYXQgRG91YmxlIFZvaWQgVW5pdCBOb3RoaW5nJyxcbiAgICBsaXRlcmFsOlxuICAgICAgJ3RydWUgZmFsc2UgbnVsbCdcbiAgfTtcbiAgY29uc3QgS0VZV09SRFNfV0lUSF9MQUJFTCA9IHtcbiAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICBiZWdpbjogL1xcYihicmVha3xjb250aW51ZXxyZXR1cm58dGhpcylcXGIvLFxuICAgIHN0YXJ0czogeyBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgICBiZWdpbjogL0BcXHcrL1xuICAgICAgfVxuICAgIF0gfVxuICB9O1xuICBjb25zdCBMQUJFTCA9IHtcbiAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgIGJlZ2luOiBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgKyAnQCdcbiAgfTtcblxuICAvLyBmb3Igc3RyaW5nIHRlbXBsYXRlc1xuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46IC9cXCRcXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFsgaGxqcy5DX05VTUJFUl9NT0RFIF1cbiAgfTtcbiAgY29uc3QgVkFSSUFCTEUgPSB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIGJlZ2luOiAnXFxcXCQnICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gIH07XG4gIGNvbnN0IFNUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnXCJcIlwiJyxcbiAgICAgICAgZW5kOiAnXCJcIlwiKD89W15cIl0pJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBWQVJJQUJMRSxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gQ2FuJ3QgdXNlIGJ1aWx0LWluIG1vZGVzIGVhc2lseSwgYXMgd2Ugd2FudCB0byB1c2UgU1RSSU5HIGluIHRoZSBtZXRhXG4gICAgICAvLyBjb250ZXh0IGFzICdtZXRhLXN0cmluZycgYW5kIHRoZXJlJ3Mgbm8gc3ludGF4IHRvIHJlbW92ZSBleHBsaWNpdGx5IHNldFxuICAgICAgLy8gY2xhc3NOYW1lcyBpbiBidWlsdC1pbiBtb2Rlcy5cbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdcXCcnLFxuICAgICAgICBlbmQ6ICdcXCcnLFxuICAgICAgICBpbGxlZ2FsOiAvXFxuLyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnXCInLFxuICAgICAgICBlbmQ6ICdcIicsXG4gICAgICAgIGlsbGVnYWw6IC9cXG4vLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgICAgICBWQVJJQUJMRSxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBTVUJTVC5jb250YWlucy5wdXNoKFNUUklORyk7XG5cbiAgY29uc3QgQU5OT1RBVElPTl9VU0VfU0lURSA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBiZWdpbjogJ0AoPzpmaWxlfHByb3BlcnR5fGZpZWxkfGdldHxzZXR8cmVjZWl2ZXJ8cGFyYW18c2V0cGFyYW18ZGVsZWdhdGUpXFxcXHMqOig/OlxcXFxzKicgKyBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgKyAnKT8nXG4gIH07XG4gIGNvbnN0IEFOTk9UQVRJT04gPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgYmVnaW46ICdAJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5pbmhlcml0KFNUUklORywgeyBjbGFzc05hbWU6ICdzdHJpbmcnIH0pLFxuICAgICAgICAgIFwic2VsZlwiXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy9kb2NzL3JlZmVyZW5jZS93aGF0c25ldzExLmh0bWwjdW5kZXJzY29yZXMtaW4tbnVtZXJpYy1saXRlcmFsc1xuICAvLyBBY2NvcmRpbmcgdG8gdGhlIGRvYyBhYm92ZSwgdGhlIG51bWJlciBtb2RlIG9mIGtvdGxpbiBpcyB0aGUgc2FtZSBhcyBqYXZhIDgsXG4gIC8vIHNvIHRoZSBjb2RlIGJlbG93IGlzIGNvcGllZCBmcm9tIGphdmEuanNcbiAgY29uc3QgS09UTElOX05VTUJFUl9NT0RFID0gTlVNRVJJQztcbiAgY29uc3QgS09UTElOX05FU1RFRF9DT01NRU5UID0gaGxqcy5DT01NRU5UKFxuICAgICcvXFxcXConLCAnXFxcXCovJyxcbiAgICB7IGNvbnRhaW5zOiBbIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUgXSB9XG4gICk7XG4gIGNvbnN0IEtPVExJTl9QQVJFTl9UWVBFID0geyB2YXJpYW50czogW1xuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRVxuICAgIH0sXG4gICAge1xuICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgZW5kOiAvXFwpLyxcbiAgICAgIGNvbnRhaW5zOiBbXSAvLyBkZWZpbmVkIGxhdGVyXG4gICAgfVxuICBdIH07XG4gIGNvbnN0IEtPVExJTl9QQVJFTl9UWVBFMiA9IEtPVExJTl9QQVJFTl9UWVBFO1xuICBLT1RMSU5fUEFSRU5fVFlQRTIudmFyaWFudHNbMV0uY29udGFpbnMgPSBbIEtPVExJTl9QQVJFTl9UWVBFIF07XG4gIEtPVExJTl9QQVJFTl9UWVBFLnZhcmlhbnRzWzFdLmNvbnRhaW5zID0gWyBLT1RMSU5fUEFSRU5fVFlQRTIgXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdLb3RsaW4nLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdrdCcsXG4gICAgICAna3RzJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNPTU1FTlQoXG4gICAgICAgICcvXFxcXCpcXFxcKicsXG4gICAgICAgICdcXFxcKi8nLFxuICAgICAgICB7XG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICAgICAgICAgIGJlZ2luOiAnQFtBLVphLXpdKydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBLT1RMSU5fTkVTVEVEX0NPTU1FTlQsXG4gICAgICBLRVlXT1JEU19XSVRIX0xBQkVMLFxuICAgICAgTEFCRUwsXG4gICAgICBBTk5PVEFUSU9OX1VTRV9TSVRFLFxuICAgICAgQU5OT1RBVElPTixcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnZnVuY3Rpb24nLFxuICAgICAgICBiZWdpbktleXdvcmRzOiAnZnVuJyxcbiAgICAgICAgZW5kOiAnWyhdfCQnLFxuICAgICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICByZWxldmFuY2U6IDUsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICdcXFxccypcXFxcKCcsXG4gICAgICAgICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbIGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFIF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgICAgICAgICAgYmVnaW46IC88LyxcbiAgICAgICAgICAgIGVuZDogLz4vLFxuICAgICAgICAgICAga2V5d29yZHM6ICdyZWlmaWVkJyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgICAgICBlbmRzUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJlZ2luOiAvOi8sXG4gICAgICAgICAgICAgICAgZW5kOiAvWz0sXFwvXS8sXG4gICAgICAgICAgICAgICAgZW5kc1dpdGhQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgICAgIEtPVExJTl9QQVJFTl9UWVBFLFxuICAgICAgICAgICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgICAgICAgICAgS09UTElOX05FU1RFRF9DT01NRU5UXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgICAgICBLT1RMSU5fTkVTVEVEX0NPTU1FTlQsXG4gICAgICAgICAgICAgIEFOTk9UQVRJT05fVVNFX1NJVEUsXG4gICAgICAgICAgICAgIEFOTk9UQVRJT04sXG4gICAgICAgICAgICAgIFNUUklORyxcbiAgICAgICAgICAgICAgaGxqcy5DX05VTUJFUl9NT0RFXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBLT1RMSU5fTkVTVEVEX0NPTU1FTlRcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvY2xhc3N8aW50ZXJmYWNlfHRyYWl0LyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGJlZ2luU2NvcGU6IHtcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfSxcbiAgICAgICAga2V5d29yZHM6ICdjbGFzcyBpbnRlcmZhY2UgdHJhaXQnLFxuICAgICAgICBlbmQ6IC9bOlxceyhdfCQvLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBpbGxlZ2FsOiAnZXh0ZW5kcyBpbXBsZW1lbnRzJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7IGJlZ2luS2V5d29yZHM6ICdwdWJsaWMgcHJvdGVjdGVkIGludGVybmFsIHByaXZhdGUgY29uc3RydWN0b3InIH0sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX1RJVExFX01PREUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICAgICAgICBiZWdpbjogLzwvLFxuICAgICAgICAgICAgZW5kOiAvPi8sXG4gICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgICAgICAgIGJlZ2luOiAvWyw6XVxccyovLFxuICAgICAgICAgICAgZW5kOiAvWzxcXCgsKXtcXHNdfCQvLFxuICAgICAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgcmV0dXJuRW5kOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBBTk5PVEFUSU9OX1VTRV9TSVRFLFxuICAgICAgICAgIEFOTk9UQVRJT05cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIFNUUklORyxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiBcIl4jIS91c3IvYmluL2VudlwiLFxuICAgICAgICBlbmQ6ICckJyxcbiAgICAgICAgaWxsZWdhbDogJ1xcbidcbiAgICAgIH0sXG4gICAgICBLT1RMSU5fTlVNQkVSX01PREVcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IGtvdGxpbiBhcyBkZWZhdWx0IH07XG4iLCAiY29uc3QgTU9ERVMgPSAoaGxqcykgPT4ge1xuICByZXR1cm4ge1xuICAgIElNUE9SVEFOVDoge1xuICAgICAgc2NvcGU6ICdtZXRhJyxcbiAgICAgIGJlZ2luOiAnIWltcG9ydGFudCdcbiAgICB9LFxuICAgIEJMT0NLX0NPTU1FTlQ6IGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgSEVYQ09MT1I6IHtcbiAgICAgIHNjb3BlOiAnbnVtYmVyJyxcbiAgICAgIGJlZ2luOiAvIygoWzAtOWEtZkEtRl17Myw0fSl8KChbMC05YS1mQS1GXXsyfSl7Myw0fSkpXFxiL1xuICAgIH0sXG4gICAgRlVOQ1RJT05fRElTUEFUQ0g6IHtcbiAgICAgIGNsYXNzTmFtZTogXCJidWlsdF9pblwiLFxuICAgICAgYmVnaW46IC9bXFx3LV0rKD89XFwoKS9cbiAgICB9LFxuICAgIEFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ3NlbGVjdG9yLWF0dHInLFxuICAgICAgYmVnaW46IC9cXFsvLFxuICAgICAgZW5kOiAvXFxdLyxcbiAgICAgIGlsbGVnYWw6ICckJyxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICAgICAgXVxuICAgIH0sXG4gICAgQ1NTX05VTUJFUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogaGxqcy5OVU1CRVJfUkUgKyAnKCcgK1xuICAgICAgICAnJXxlbXxleHxjaHxyZW0nICtcbiAgICAgICAgJ3x2d3x2aHx2bWlufHZtYXgnICtcbiAgICAgICAgJ3xjbXxtbXxpbnxwdHxwY3xweCcgK1xuICAgICAgICAnfGRlZ3xncmFkfHJhZHx0dXJuJyArXG4gICAgICAgICd8c3xtcycgK1xuICAgICAgICAnfEh6fGtIeicgK1xuICAgICAgICAnfGRwaXxkcGNtfGRwcHgnICtcbiAgICAgICAgJyk/JyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgQ1NTX1ZBUklBQkxFOiB7XG4gICAgICBjbGFzc05hbWU6IFwiYXR0clwiLFxuICAgICAgYmVnaW46IC8tLVtBLVphLXpdW0EtWmEtejAtOV8tXSovXG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgVEFHUyA9IFtcbiAgJ2EnLFxuICAnYWJicicsXG4gICdhZGRyZXNzJyxcbiAgJ2FydGljbGUnLFxuICAnYXNpZGUnLFxuICAnYXVkaW8nLFxuICAnYicsXG4gICdibG9ja3F1b3RlJyxcbiAgJ2JvZHknLFxuICAnYnV0dG9uJyxcbiAgJ2NhbnZhcycsXG4gICdjYXB0aW9uJyxcbiAgJ2NpdGUnLFxuICAnY29kZScsXG4gICdkZCcsXG4gICdkZWwnLFxuICAnZGV0YWlscycsXG4gICdkZm4nLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2VtJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWRlcicsXG4gICdoZ3JvdXAnLFxuICAnaHRtbCcsXG4gICdpJyxcbiAgJ2lmcmFtZScsXG4gICdpbWcnLFxuICAnaW5wdXQnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdsYWJlbCcsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbWFpbicsXG4gICdtYXJrJyxcbiAgJ21lbnUnLFxuICAnbmF2JyxcbiAgJ29iamVjdCcsXG4gICdvbCcsXG4gICdwJyxcbiAgJ3EnLFxuICAncXVvdGUnLFxuICAnc2FtcCcsXG4gICdzZWN0aW9uJyxcbiAgJ3NwYW4nLFxuICAnc3Ryb25nJyxcbiAgJ3N1bW1hcnknLFxuICAnc3VwJyxcbiAgJ3RhYmxlJyxcbiAgJ3Rib2R5JyxcbiAgJ3RkJyxcbiAgJ3RleHRhcmVhJyxcbiAgJ3Rmb290JyxcbiAgJ3RoJyxcbiAgJ3RoZWFkJyxcbiAgJ3RpbWUnLFxuICAndHInLFxuICAndWwnLFxuICAndmFyJyxcbiAgJ3ZpZGVvJ1xuXTtcblxuY29uc3QgTUVESUFfRkVBVFVSRVMgPSBbXG4gICdhbnktaG92ZXInLFxuICAnYW55LXBvaW50ZXInLFxuICAnYXNwZWN0LXJhdGlvJyxcbiAgJ2NvbG9yJyxcbiAgJ2NvbG9yLWdhbXV0JyxcbiAgJ2NvbG9yLWluZGV4JyxcbiAgJ2RldmljZS1hc3BlY3QtcmF0aW8nLFxuICAnZGV2aWNlLWhlaWdodCcsXG4gICdkZXZpY2Utd2lkdGgnLFxuICAnZGlzcGxheS1tb2RlJyxcbiAgJ2ZvcmNlZC1jb2xvcnMnLFxuICAnZ3JpZCcsXG4gICdoZWlnaHQnLFxuICAnaG92ZXInLFxuICAnaW52ZXJ0ZWQtY29sb3JzJyxcbiAgJ21vbm9jaHJvbWUnLFxuICAnb3JpZW50YXRpb24nLFxuICAnb3ZlcmZsb3ctYmxvY2snLFxuICAnb3ZlcmZsb3ctaW5saW5lJyxcbiAgJ3BvaW50ZXInLFxuICAncHJlZmVycy1jb2xvci1zY2hlbWUnLFxuICAncHJlZmVycy1jb250cmFzdCcsXG4gICdwcmVmZXJzLXJlZHVjZWQtbW90aW9uJyxcbiAgJ3ByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3knLFxuICAncmVzb2x1dGlvbicsXG4gICdzY2FuJyxcbiAgJ3NjcmlwdGluZycsXG4gICd1cGRhdGUnLFxuICAnd2lkdGgnLFxuICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uP1xuICAnbWluLXdpZHRoJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21heC1oZWlnaHQnXG5dO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvUHNldWRvLWNsYXNzZXNcbmNvbnN0IFBTRVVET19DTEFTU0VTID0gW1xuICAnYWN0aXZlJyxcbiAgJ2FueS1saW5rJyxcbiAgJ2JsYW5rJyxcbiAgJ2NoZWNrZWQnLFxuICAnY3VycmVudCcsXG4gICdkZWZhdWx0JyxcbiAgJ2RlZmluZWQnLFxuICAnZGlyJywgLy8gZGlyKClcbiAgJ2Rpc2FibGVkJyxcbiAgJ2Ryb3AnLFxuICAnZW1wdHknLFxuICAnZW5hYmxlZCcsXG4gICdmaXJzdCcsXG4gICdmaXJzdC1jaGlsZCcsXG4gICdmaXJzdC1vZi10eXBlJyxcbiAgJ2Z1bGxzY3JlZW4nLFxuICAnZnV0dXJlJyxcbiAgJ2ZvY3VzJyxcbiAgJ2ZvY3VzLXZpc2libGUnLFxuICAnZm9jdXMtd2l0aGluJyxcbiAgJ2hhcycsIC8vIGhhcygpXG4gICdob3N0JywgLy8gaG9zdCBvciBob3N0KClcbiAgJ2hvc3QtY29udGV4dCcsIC8vIGhvc3QtY29udGV4dCgpXG4gICdob3ZlcicsXG4gICdpbmRldGVybWluYXRlJyxcbiAgJ2luLXJhbmdlJyxcbiAgJ2ludmFsaWQnLFxuICAnaXMnLCAvLyBpcygpXG4gICdsYW5nJywgLy8gbGFuZygpXG4gICdsYXN0LWNoaWxkJyxcbiAgJ2xhc3Qtb2YtdHlwZScsXG4gICdsZWZ0JyxcbiAgJ2xpbmsnLFxuICAnbG9jYWwtbGluaycsXG4gICdub3QnLCAvLyBub3QoKVxuICAnbnRoLWNoaWxkJywgLy8gbnRoLWNoaWxkKClcbiAgJ250aC1jb2wnLCAvLyBudGgtY29sKClcbiAgJ250aC1sYXN0LWNoaWxkJywgLy8gbnRoLWxhc3QtY2hpbGQoKVxuICAnbnRoLWxhc3QtY29sJywgLy8gbnRoLWxhc3QtY29sKClcbiAgJ250aC1sYXN0LW9mLXR5cGUnLCAvL250aC1sYXN0LW9mLXR5cGUoKVxuICAnbnRoLW9mLXR5cGUnLCAvL250aC1vZi10eXBlKClcbiAgJ29ubHktY2hpbGQnLFxuICAnb25seS1vZi10eXBlJyxcbiAgJ29wdGlvbmFsJyxcbiAgJ291dC1vZi1yYW5nZScsXG4gICdwYXN0JyxcbiAgJ3BsYWNlaG9sZGVyLXNob3duJyxcbiAgJ3JlYWQtb25seScsXG4gICdyZWFkLXdyaXRlJyxcbiAgJ3JlcXVpcmVkJyxcbiAgJ3JpZ2h0JyxcbiAgJ3Jvb3QnLFxuICAnc2NvcGUnLFxuICAndGFyZ2V0JyxcbiAgJ3RhcmdldC13aXRoaW4nLFxuICAndXNlci1pbnZhbGlkJyxcbiAgJ3ZhbGlkJyxcbiAgJ3Zpc2l0ZWQnLFxuICAnd2hlcmUnIC8vIHdoZXJlKClcbl07XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Qc2V1ZG8tZWxlbWVudHNcbmNvbnN0IFBTRVVET19FTEVNRU5UUyA9IFtcbiAgJ2FmdGVyJyxcbiAgJ2JhY2tkcm9wJyxcbiAgJ2JlZm9yZScsXG4gICdjdWUnLFxuICAnY3VlLXJlZ2lvbicsXG4gICdmaXJzdC1sZXR0ZXInLFxuICAnZmlyc3QtbGluZScsXG4gICdncmFtbWFyLWVycm9yJyxcbiAgJ21hcmtlcicsXG4gICdwYXJ0JyxcbiAgJ3BsYWNlaG9sZGVyJyxcbiAgJ3NlbGVjdGlvbicsXG4gICdzbG90dGVkJyxcbiAgJ3NwZWxsaW5nLWVycm9yJ1xuXTtcblxuY29uc3QgQVRUUklCVVRFUyA9IFtcbiAgJ2FsaWduLWNvbnRlbnQnLFxuICAnYWxpZ24taXRlbXMnLFxuICAnYWxpZ24tc2VsZicsXG4gICdhbGwnLFxuICAnYW5pbWF0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kZWxheScsXG4gICdhbmltYXRpb24tZGlyZWN0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kdXJhdGlvbicsXG4gICdhbmltYXRpb24tZmlsbC1tb2RlJyxcbiAgJ2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQnLFxuICAnYW5pbWF0aW9uLW5hbWUnLFxuICAnYW5pbWF0aW9uLXBsYXktc3RhdGUnLFxuICAnYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbicsXG4gICdiYWNrZmFjZS12aXNpYmlsaXR5JyxcbiAgJ2JhY2tncm91bmQnLFxuICAnYmFja2dyb3VuZC1hdHRhY2htZW50JyxcbiAgJ2JhY2tncm91bmQtYmxlbmQtbW9kZScsXG4gICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICdiYWNrZ3JvdW5kLWltYWdlJyxcbiAgJ2JhY2tncm91bmQtb3JpZ2luJyxcbiAgJ2JhY2tncm91bmQtcG9zaXRpb24nLFxuICAnYmFja2dyb3VuZC1yZXBlYXQnLFxuICAnYmFja2dyb3VuZC1zaXplJyxcbiAgJ2Jsb2NrLXNpemUnLFxuICAnYm9yZGVyJyxcbiAgJ2JvcmRlci1ibG9jaycsXG4gICdib3JkZXItYmxvY2stY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLWVuZCcsXG4gICdib3JkZXItYmxvY2stZW5kLWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWJsb2NrLWVuZC13aWR0aCcsXG4gICdib3JkZXItYmxvY2stc3RhcnQnLFxuICAnYm9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydC1zdHlsZScsXG4gICdib3JkZXItYmxvY2stc3RhcnQtd2lkdGgnLFxuICAnYm9yZGVyLWJsb2NrLXN0eWxlJyxcbiAgJ2JvcmRlci1ibG9jay13aWR0aCcsXG4gICdib3JkZXItYm90dG9tJyxcbiAgJ2JvcmRlci1ib3R0b20tY29sb3InLFxuICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXN0eWxlJyxcbiAgJ2JvcmRlci1ib3R0b20td2lkdGgnLFxuICAnYm9yZGVyLWNvbGxhcHNlJyxcbiAgJ2JvcmRlci1jb2xvcicsXG4gICdib3JkZXItaW1hZ2UnLFxuICAnYm9yZGVyLWltYWdlLW91dHNldCcsXG4gICdib3JkZXItaW1hZ2UtcmVwZWF0JyxcbiAgJ2JvcmRlci1pbWFnZS1zbGljZScsXG4gICdib3JkZXItaW1hZ2Utc291cmNlJyxcbiAgJ2JvcmRlci1pbWFnZS13aWR0aCcsXG4gICdib3JkZXItaW5saW5lJyxcbiAgJ2JvcmRlci1pbmxpbmUtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtd2lkdGgnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydCcsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1pbmxpbmUtc3RhcnQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydC13aWR0aCcsXG4gICdib3JkZXItaW5saW5lLXN0eWxlJyxcbiAgJ2JvcmRlci1pbmxpbmUtd2lkdGgnLFxuICAnYm9yZGVyLWxlZnQnLFxuICAnYm9yZGVyLWxlZnQtY29sb3InLFxuICAnYm9yZGVyLWxlZnQtc3R5bGUnLFxuICAnYm9yZGVyLWxlZnQtd2lkdGgnLFxuICAnYm9yZGVyLXJhZGl1cycsXG4gICdib3JkZXItcmlnaHQnLFxuICAnYm9yZGVyLXJpZ2h0LWNvbG9yJyxcbiAgJ2JvcmRlci1yaWdodC1zdHlsZScsXG4gICdib3JkZXItcmlnaHQtd2lkdGgnLFxuICAnYm9yZGVyLXNwYWNpbmcnLFxuICAnYm9yZGVyLXN0eWxlJyxcbiAgJ2JvcmRlci10b3AnLFxuICAnYm9yZGVyLXRvcC1jb2xvcicsXG4gICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3Atc3R5bGUnLFxuICAnYm9yZGVyLXRvcC13aWR0aCcsXG4gICdib3JkZXItd2lkdGgnLFxuICAnYm90dG9tJyxcbiAgJ2JveC1kZWNvcmF0aW9uLWJyZWFrJyxcbiAgJ2JveC1zaGFkb3cnLFxuICAnYm94LXNpemluZycsXG4gICdicmVhay1hZnRlcicsXG4gICdicmVhay1iZWZvcmUnLFxuICAnYnJlYWstaW5zaWRlJyxcbiAgJ2NhcHRpb24tc2lkZScsXG4gICdjYXJldC1jb2xvcicsXG4gICdjbGVhcicsXG4gICdjbGlwJyxcbiAgJ2NsaXAtcGF0aCcsXG4gICdjbGlwLXJ1bGUnLFxuICAnY29sb3InLFxuICAnY29sdW1uLWNvdW50JyxcbiAgJ2NvbHVtbi1maWxsJyxcbiAgJ2NvbHVtbi1nYXAnLFxuICAnY29sdW1uLXJ1bGUnLFxuICAnY29sdW1uLXJ1bGUtY29sb3InLFxuICAnY29sdW1uLXJ1bGUtc3R5bGUnLFxuICAnY29sdW1uLXJ1bGUtd2lkdGgnLFxuICAnY29sdW1uLXNwYW4nLFxuICAnY29sdW1uLXdpZHRoJyxcbiAgJ2NvbHVtbnMnLFxuICAnY29udGFpbicsXG4gICdjb250ZW50JyxcbiAgJ2NvbnRlbnQtdmlzaWJpbGl0eScsXG4gICdjb3VudGVyLWluY3JlbWVudCcsXG4gICdjb3VudGVyLXJlc2V0JyxcbiAgJ2N1ZScsXG4gICdjdWUtYWZ0ZXInLFxuICAnY3VlLWJlZm9yZScsXG4gICdjdXJzb3InLFxuICAnZGlyZWN0aW9uJyxcbiAgJ2Rpc3BsYXknLFxuICAnZW1wdHktY2VsbHMnLFxuICAnZmlsdGVyJyxcbiAgJ2ZsZXgnLFxuICAnZmxleC1iYXNpcycsXG4gICdmbGV4LWRpcmVjdGlvbicsXG4gICdmbGV4LWZsb3cnLFxuICAnZmxleC1ncm93JyxcbiAgJ2ZsZXgtc2hyaW5rJyxcbiAgJ2ZsZXgtd3JhcCcsXG4gICdmbG9hdCcsXG4gICdmbG93JyxcbiAgJ2ZvbnQnLFxuICAnZm9udC1kaXNwbGF5JyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2ZvbnQtZmVhdHVyZS1zZXR0aW5ncycsXG4gICdmb250LWtlcm5pbmcnLFxuICAnZm9udC1sYW5ndWFnZS1vdmVycmlkZScsXG4gICdmb250LXNpemUnLFxuICAnZm9udC1zaXplLWFkanVzdCcsXG4gICdmb250LXNtb290aGluZycsXG4gICdmb250LXN0cmV0Y2gnLFxuICAnZm9udC1zdHlsZScsXG4gICdmb250LXN5bnRoZXNpcycsXG4gICdmb250LXZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50LWNhcHMnLFxuICAnZm9udC12YXJpYW50LWVhc3QtYXNpYW4nLFxuICAnZm9udC12YXJpYW50LWxpZ2F0dXJlcycsXG4gICdmb250LXZhcmlhbnQtbnVtZXJpYycsXG4gICdmb250LXZhcmlhbnQtcG9zaXRpb24nLFxuICAnZm9udC12YXJpYXRpb24tc2V0dGluZ3MnLFxuICAnZm9udC13ZWlnaHQnLFxuICAnZ2FwJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJyxcbiAgJ2dyaWQnLFxuICAnZ3JpZC1hcmVhJyxcbiAgJ2dyaWQtYXV0by1jb2x1bW5zJyxcbiAgJ2dyaWQtYXV0by1mbG93JyxcbiAgJ2dyaWQtYXV0by1yb3dzJyxcbiAgJ2dyaWQtY29sdW1uJyxcbiAgJ2dyaWQtY29sdW1uLWVuZCcsXG4gICdncmlkLWNvbHVtbi1zdGFydCcsXG4gICdncmlkLWdhcCcsXG4gICdncmlkLXJvdycsXG4gICdncmlkLXJvdy1lbmQnLFxuICAnZ3JpZC1yb3ctc3RhcnQnLFxuICAnZ3JpZC10ZW1wbGF0ZScsXG4gICdncmlkLXRlbXBsYXRlLWFyZWFzJyxcbiAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsXG4gICdncmlkLXRlbXBsYXRlLXJvd3MnLFxuICAnaGFuZ2luZy1wdW5jdHVhdGlvbicsXG4gICdoZWlnaHQnLFxuICAnaHlwaGVucycsXG4gICdpY29uJyxcbiAgJ2ltYWdlLW9yaWVudGF0aW9uJyxcbiAgJ2ltYWdlLXJlbmRlcmluZycsXG4gICdpbWFnZS1yZXNvbHV0aW9uJyxcbiAgJ2ltZS1tb2RlJyxcbiAgJ2lubGluZS1zaXplJyxcbiAgJ2lzb2xhdGlvbicsXG4gICdqdXN0aWZ5LWNvbnRlbnQnLFxuICAnbGVmdCcsXG4gICdsZXR0ZXItc3BhY2luZycsXG4gICdsaW5lLWJyZWFrJyxcbiAgJ2xpbmUtaGVpZ2h0JyxcbiAgJ2xpc3Qtc3R5bGUnLFxuICAnbGlzdC1zdHlsZS1pbWFnZScsXG4gICdsaXN0LXN0eWxlLXBvc2l0aW9uJyxcbiAgJ2xpc3Qtc3R5bGUtdHlwZScsXG4gICdtYXJnaW4nLFxuICAnbWFyZ2luLWJsb2NrJyxcbiAgJ21hcmdpbi1ibG9jay1lbmQnLFxuICAnbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ21hcmdpbi1ib3R0b20nLFxuICAnbWFyZ2luLWlubGluZScsXG4gICdtYXJnaW4taW5saW5lLWVuZCcsXG4gICdtYXJnaW4taW5saW5lLXN0YXJ0JyxcbiAgJ21hcmdpbi1sZWZ0JyxcbiAgJ21hcmdpbi1yaWdodCcsXG4gICdtYXJnaW4tdG9wJyxcbiAgJ21hcmtzJyxcbiAgJ21hc2snLFxuICAnbWFzay1ib3JkZXInLFxuICAnbWFzay1ib3JkZXItbW9kZScsXG4gICdtYXNrLWJvcmRlci1vdXRzZXQnLFxuICAnbWFzay1ib3JkZXItcmVwZWF0JyxcbiAgJ21hc2stYm9yZGVyLXNsaWNlJyxcbiAgJ21hc2stYm9yZGVyLXNvdXJjZScsXG4gICdtYXNrLWJvcmRlci13aWR0aCcsXG4gICdtYXNrLWNsaXAnLFxuICAnbWFzay1jb21wb3NpdGUnLFxuICAnbWFzay1pbWFnZScsXG4gICdtYXNrLW1vZGUnLFxuICAnbWFzay1vcmlnaW4nLFxuICAnbWFzay1wb3NpdGlvbicsXG4gICdtYXNrLXJlcGVhdCcsXG4gICdtYXNrLXNpemUnLFxuICAnbWFzay10eXBlJyxcbiAgJ21heC1ibG9jay1zaXplJyxcbiAgJ21heC1oZWlnaHQnLFxuICAnbWF4LWlubGluZS1zaXplJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4tYmxvY2stc2l6ZScsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21pbi1pbmxpbmUtc2l6ZScsXG4gICdtaW4td2lkdGgnLFxuICAnbWl4LWJsZW5kLW1vZGUnLFxuICAnbmF2LWRvd24nLFxuICAnbmF2LWluZGV4JyxcbiAgJ25hdi1sZWZ0JyxcbiAgJ25hdi1yaWdodCcsXG4gICduYXYtdXAnLFxuICAnbm9uZScsXG4gICdub3JtYWwnLFxuICAnb2JqZWN0LWZpdCcsXG4gICdvYmplY3QtcG9zaXRpb24nLFxuICAnb3BhY2l0eScsXG4gICdvcmRlcicsXG4gICdvcnBoYW5zJyxcbiAgJ291dGxpbmUnLFxuICAnb3V0bGluZS1jb2xvcicsXG4gICdvdXRsaW5lLW9mZnNldCcsXG4gICdvdXRsaW5lLXN0eWxlJyxcbiAgJ291dGxpbmUtd2lkdGgnLFxuICAnb3ZlcmZsb3cnLFxuICAnb3ZlcmZsb3ctd3JhcCcsXG4gICdvdmVyZmxvdy14JyxcbiAgJ292ZXJmbG93LXknLFxuICAncGFkZGluZycsXG4gICdwYWRkaW5nLWJsb2NrJyxcbiAgJ3BhZGRpbmctYmxvY2stZW5kJyxcbiAgJ3BhZGRpbmctYmxvY2stc3RhcnQnLFxuICAncGFkZGluZy1ib3R0b20nLFxuICAncGFkZGluZy1pbmxpbmUnLFxuICAncGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3BhZGRpbmctaW5saW5lLXN0YXJ0JyxcbiAgJ3BhZGRpbmctbGVmdCcsXG4gICdwYWRkaW5nLXJpZ2h0JyxcbiAgJ3BhZGRpbmctdG9wJyxcbiAgJ3BhZ2UtYnJlYWstYWZ0ZXInLFxuICAncGFnZS1icmVhay1iZWZvcmUnLFxuICAncGFnZS1icmVhay1pbnNpZGUnLFxuICAncGF1c2UnLFxuICAncGF1c2UtYWZ0ZXInLFxuICAncGF1c2UtYmVmb3JlJyxcbiAgJ3BlcnNwZWN0aXZlJyxcbiAgJ3BlcnNwZWN0aXZlLW9yaWdpbicsXG4gICdwb2ludGVyLWV2ZW50cycsXG4gICdwb3NpdGlvbicsXG4gICdxdW90ZXMnLFxuICAncmVzaXplJyxcbiAgJ3Jlc3QnLFxuICAncmVzdC1hZnRlcicsXG4gICdyZXN0LWJlZm9yZScsXG4gICdyaWdodCcsXG4gICdyb3ctZ2FwJyxcbiAgJ3Njcm9sbC1tYXJnaW4nLFxuICAnc2Nyb2xsLW1hcmdpbi1ibG9jaycsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tYm90dG9tJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtbWFyZ2luLWxlZnQnLFxuICAnc2Nyb2xsLW1hcmdpbi1yaWdodCcsXG4gICdzY3JvbGwtbWFyZ2luLXRvcCcsXG4gICdzY3JvbGwtcGFkZGluZycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jaycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jay1lbmQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYmxvY2stc3RhcnQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYm90dG9tJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZScsXG4gICdzY3JvbGwtcGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtcGFkZGluZy1sZWZ0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXJpZ2h0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXRvcCcsXG4gICdzY3JvbGwtc25hcC1hbGlnbicsXG4gICdzY3JvbGwtc25hcC1zdG9wJyxcbiAgJ3Njcm9sbC1zbmFwLXR5cGUnLFxuICAnc2Nyb2xsYmFyLWNvbG9yJyxcbiAgJ3Njcm9sbGJhci1ndXR0ZXInLFxuICAnc2Nyb2xsYmFyLXdpZHRoJyxcbiAgJ3NoYXBlLWltYWdlLXRocmVzaG9sZCcsXG4gICdzaGFwZS1tYXJnaW4nLFxuICAnc2hhcGUtb3V0c2lkZScsXG4gICdzcGVhaycsXG4gICdzcGVhay1hcycsXG4gICdzcmMnLCAvLyBAZm9udC1mYWNlXG4gICd0YWItc2l6ZScsXG4gICd0YWJsZS1sYXlvdXQnLFxuICAndGV4dC1hbGlnbicsXG4gICd0ZXh0LWFsaWduLWFsbCcsXG4gICd0ZXh0LWFsaWduLWxhc3QnLFxuICAndGV4dC1jb21iaW5lLXVwcmlnaHQnLFxuICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1jb2xvcicsXG4gICd0ZXh0LWRlY29yYXRpb24tbGluZScsXG4gICd0ZXh0LWRlY29yYXRpb24tc3R5bGUnLFxuICAndGV4dC1lbXBoYXNpcycsXG4gICd0ZXh0LWVtcGhhc2lzLWNvbG9yJyxcbiAgJ3RleHQtZW1waGFzaXMtcG9zaXRpb24nLFxuICAndGV4dC1lbXBoYXNpcy1zdHlsZScsXG4gICd0ZXh0LWluZGVudCcsXG4gICd0ZXh0LWp1c3RpZnknLFxuICAndGV4dC1vcmllbnRhdGlvbicsXG4gICd0ZXh0LW92ZXJmbG93JyxcbiAgJ3RleHQtcmVuZGVyaW5nJyxcbiAgJ3RleHQtc2hhZG93JyxcbiAgJ3RleHQtdHJhbnNmb3JtJyxcbiAgJ3RleHQtdW5kZXJsaW5lLXBvc2l0aW9uJyxcbiAgJ3RvcCcsXG4gICd0cmFuc2Zvcm0nLFxuICAndHJhbnNmb3JtLWJveCcsXG4gICd0cmFuc2Zvcm0tb3JpZ2luJyxcbiAgJ3RyYW5zZm9ybS1zdHlsZScsXG4gICd0cmFuc2l0aW9uJyxcbiAgJ3RyYW5zaXRpb24tZGVsYXknLFxuICAndHJhbnNpdGlvbi1kdXJhdGlvbicsXG4gICd0cmFuc2l0aW9uLXByb3BlcnR5JyxcbiAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgJ3VuaWNvZGUtYmlkaScsXG4gICd2ZXJ0aWNhbC1hbGlnbicsXG4gICd2aXNpYmlsaXR5JyxcbiAgJ3ZvaWNlLWJhbGFuY2UnLFxuICAndm9pY2UtZHVyYXRpb24nLFxuICAndm9pY2UtZmFtaWx5JyxcbiAgJ3ZvaWNlLXBpdGNoJyxcbiAgJ3ZvaWNlLXJhbmdlJyxcbiAgJ3ZvaWNlLXJhdGUnLFxuICAndm9pY2Utc3RyZXNzJyxcbiAgJ3ZvaWNlLXZvbHVtZScsXG4gICd3aGl0ZS1zcGFjZScsXG4gICd3aWRvd3MnLFxuICAnd2lkdGgnLFxuICAnd2lsbC1jaGFuZ2UnLFxuICAnd29yZC1icmVhaycsXG4gICd3b3JkLXNwYWNpbmcnLFxuICAnd29yZC13cmFwJyxcbiAgJ3dyaXRpbmctbW9kZScsXG4gICd6LWluZGV4J1xuICAvLyByZXZlcnNlIG1ha2VzIHN1cmUgbG9uZ2VyIGF0dHJpYnV0ZXMgYGZvbnQtd2VpZ2h0YCBhcmUgbWF0Y2hlZCBmdWxseVxuICAvLyBpbnN0ZWFkIG9mIGdldHRpbmcgZmFsc2UgcG9zaXRpdmVzIG9uIHNheSBgZm9udGBcbl0ucmV2ZXJzZSgpO1xuXG4vLyBzb21lIGdyYW1tYXJzIHVzZSB0aGVtIGFsbCBhcyBhIHNpbmdsZSBncm91cFxuY29uc3QgUFNFVURPX1NFTEVDVE9SUyA9IFBTRVVET19DTEFTU0VTLmNvbmNhdChQU0VVRE9fRUxFTUVOVFMpO1xuXG4vKlxuTGFuZ3VhZ2U6IExlc3NcbkRlc2NyaXB0aW9uOiBJdCdzIENTUywgd2l0aCBqdXN0IGEgbGl0dGxlIG1vcmUuXG5BdXRob3I6ICAgTWF4IE1pa2hhaWxvdiA8c2V2ZW4ucGhhc2VzLm1heEBnbWFpbC5jb20+XG5XZWJzaXRlOiBodHRwOi8vbGVzc2Nzcy5vcmdcbkNhdGVnb3J5OiBjb21tb24sIGNzcywgd2ViXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gbGVzcyhobGpzKSB7XG4gIGNvbnN0IG1vZGVzID0gTU9ERVMoaGxqcyk7XG4gIGNvbnN0IFBTRVVET19TRUxFQ1RPUlMkMSA9IFBTRVVET19TRUxFQ1RPUlM7XG5cbiAgY29uc3QgQVRfTU9ESUZJRVJTID0gXCJhbmQgb3Igbm90IG9ubHlcIjtcbiAgY29uc3QgSURFTlRfUkUgPSAnW1xcXFx3LV0rJzsgLy8geWVzLCBMZXNzIGlkZW50aWZpZXJzIG1heSBiZWdpbiB3aXRoIGEgZGlnaXRcbiAgY29uc3QgSU5URVJQX0lERU5UX1JFID0gJygnICsgSURFTlRfUkUgKyAnfEBcXFxceycgKyBJREVOVF9SRSArICdcXFxcfSknO1xuXG4gIC8qIEdlbmVyaWMgTW9kZXMgKi9cblxuICBjb25zdCBSVUxFUyA9IFtdOyBjb25zdCBWQUxVRV9NT0RFUyA9IFtdOyAvLyBmb3J3YXJkIGRlZi4gZm9yIHJlY3Vyc2l2ZSBtb2Rlc1xuXG4gIGNvbnN0IFNUUklOR19NT0RFID0gZnVuY3Rpb24oYykge1xuICAgIHJldHVybiB7XG4gICAgLy8gTGVzcyBzdHJpbmdzIGFyZSBub3QgbXVsdGlsaW5lIChhbHNvIGluY2x1ZGUgJ34nIGZvciBtb3JlIGNvbnNpc3RlbnQgY29sb3Jpbmcgb2YgXCJlc2NhcGVkXCIgc3RyaW5ncylcbiAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICBiZWdpbjogJ34/JyArIGMgKyAnLio/JyArIGNcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IElERU5UX01PREUgPSBmdW5jdGlvbihuYW1lLCBiZWdpbiwgcmVsZXZhbmNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogbmFtZSxcbiAgICAgIGJlZ2luOiBiZWdpbixcbiAgICAgIHJlbGV2YW5jZTogcmVsZXZhbmNlXG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBBVF9LRVlXT1JEUyA9IHtcbiAgICAkcGF0dGVybjogL1thLXotXSsvLFxuICAgIGtleXdvcmQ6IEFUX01PRElGSUVSUyxcbiAgICBhdHRyaWJ1dGU6IE1FRElBX0ZFQVRVUkVTLmpvaW4oXCIgXCIpXG4gIH07XG5cbiAgY29uc3QgUEFSRU5TX01PREUgPSB7XG4gICAgLy8gdXNlZCBvbmx5IHRvIHByb3Blcmx5IGJhbGFuY2UgbmVzdGVkIHBhcmVucyBpbnNpZGUgbWl4aW4gY2FsbCwgZGVmLiBhcmcgbGlzdFxuICAgIGJlZ2luOiAnXFxcXCgnLFxuICAgIGVuZDogJ1xcXFwpJyxcbiAgICBjb250YWluczogVkFMVUVfTU9ERVMsXG4gICAga2V5d29yZHM6IEFUX0tFWVdPUkRTLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIC8vIGdlbmVyaWMgTGVzcyBoaWdobGlnaHRlciAodXNlZCBhbG1vc3QgZXZlcnl3aGVyZSBleGNlcHQgc2VsZWN0b3JzKTpcbiAgVkFMVUVfTU9ERVMucHVzaChcbiAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBTVFJJTkdfTU9ERShcIidcIiksXG4gICAgU1RSSU5HX01PREUoJ1wiJyksXG4gICAgbW9kZXMuQ1NTX05VTUJFUl9NT0RFLCAvLyBmaXhtZTogaXQgZG9lcyBub3QgaW5jbHVkZSBkb3QgZm9yIG51bWJlcnMgbGlrZSAuNWVtIDooXG4gICAge1xuICAgICAgYmVnaW46ICcodXJsfGRhdGEtdXJpKVxcXFwoJyxcbiAgICAgIHN0YXJ0czoge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICBlbmQ6ICdbXFxcXClcXFxcbl0nLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9XG4gICAgfSxcbiAgICBtb2Rlcy5IRVhDT0xPUixcbiAgICBQQVJFTlNfTU9ERSxcbiAgICBJREVOVF9NT0RFKCd2YXJpYWJsZScsICdAQD8nICsgSURFTlRfUkUsIDEwKSxcbiAgICBJREVOVF9NT0RFKCd2YXJpYWJsZScsICdAXFxcXHsnICsgSURFTlRfUkUgKyAnXFxcXH0nKSxcbiAgICBJREVOVF9NT0RFKCdidWlsdF9pbicsICd+P2BbXmBdKj9gJyksIC8vIGlubGluZSBqYXZhc2NyaXB0IChvciB3aGF0ZXZlciBob3N0IGxhbmd1YWdlKSAqbXVsdGlsaW5lKiBzdHJpbmdcbiAgICB7IC8vIEBtZWRpYSBmZWF0dXJlcyAoaXRcdTIwMTlzIGhlcmUgdG8gbm90IGR1cGxpY2F0ZSB0aGluZ3MgaW4gQVRfUlVMRV9NT0RFIHdpdGggZXh0cmEgUEFSRU5TX01PREUgb3ZlcnJpZGluZyk6XG4gICAgICBjbGFzc05hbWU6ICdhdHRyaWJ1dGUnLFxuICAgICAgYmVnaW46IElERU5UX1JFICsgJ1xcXFxzKjonLFxuICAgICAgZW5kOiAnOicsXG4gICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgICB9LFxuICAgIG1vZGVzLklNUE9SVEFOVCxcbiAgICB7IGJlZ2luS2V5d29yZHM6ICdhbmQgbm90JyB9LFxuICAgIG1vZGVzLkZVTkNUSU9OX0RJU1BBVENIXG4gICk7XG5cbiAgY29uc3QgVkFMVUVfV0lUSF9SVUxFU0VUUyA9IFZBTFVFX01PREVTLmNvbmNhdCh7XG4gICAgYmVnaW46IC9cXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFJVTEVTXG4gIH0pO1xuXG4gIGNvbnN0IE1JWElOX0dVQVJEX01PREUgPSB7XG4gICAgYmVnaW5LZXl3b3JkczogJ3doZW4nLFxuICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgIGNvbnRhaW5zOiBbIHsgYmVnaW5LZXl3b3JkczogJ2FuZCBub3QnIH0gXS5jb25jYXQoVkFMVUVfTU9ERVMpIC8vIHVzaW5nIHRoaXMgZm9ybSB0byBvdmVycmlkZSBWQUxVRVx1MjAxOXMgJ2Z1bmN0aW9uJyBtYXRjaFxuICB9O1xuXG4gIC8qIFJ1bGUtTGV2ZWwgTW9kZXMgKi9cblxuICBjb25zdCBSVUxFX01PREUgPSB7XG4gICAgYmVnaW46IElOVEVSUF9JREVOVF9SRSArICdcXFxccyo6JyxcbiAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICBlbmQ6IC9bO31dLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgYmVnaW46IC8tKHdlYmtpdHxtb3p8bXN8byktLyB9LFxuICAgICAgbW9kZXMuQ1NTX1ZBUklBQkxFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdhdHRyaWJ1dGUnLFxuICAgICAgICBiZWdpbjogJ1xcXFxiKCcgKyBBVFRSSUJVVEVTLmpvaW4oJ3wnKSArICcpXFxcXGInLFxuICAgICAgICBlbmQ6IC8oPz06KS8sXG4gICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgICAgICAgIGlsbGVnYWw6ICdbPD0kXScsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIGNvbnRhaW5zOiBWQUxVRV9NT0RFU1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IEFUX1JVTEVfTU9ERSA9IHtcbiAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICBiZWdpbjogJ0AoaW1wb3J0fG1lZGlhfGNoYXJzZXR8Zm9udC1mYWNlfCgtW2Etel0rLSk/a2V5ZnJhbWVzfHN1cHBvcnRzfGRvY3VtZW50fG5hbWVzcGFjZXxwYWdlfHZpZXdwb3J0fGhvc3QpXFxcXGInLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnWzt7fV0nLFxuICAgICAga2V5d29yZHM6IEFUX0tFWVdPUkRTLFxuICAgICAgcmV0dXJuRW5kOiB0cnVlLFxuICAgICAgY29udGFpbnM6IFZBTFVFX01PREVTLFxuICAgICAgcmVsZXZhbmNlOiAwXG4gICAgfVxuICB9O1xuXG4gIC8vIHZhcmlhYmxlIGRlZmluaXRpb25zIGFuZCBjYWxsc1xuICBjb25zdCBWQVJfUlVMRV9NT0RFID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gdXNpbmcgbW9yZSBzdHJpY3QgcGF0dGVybiBmb3IgaGlnaGVyIHJlbGV2YW5jZSB0byBpbmNyZWFzZSBjaGFuY2VzIG9mIExlc3MgZGV0ZWN0aW9uLlxuICAgICAgLy8gdGhpcyBpcyAqdGhlIG9ubHkqIExlc3Mgc3BlY2lmaWMgc3RhdGVtZW50IHVzZWQgaW4gbW9zdCBvZiB0aGUgc291cmNlcywgc28uLi5cbiAgICAgIC8vICh3ZVx1MjAxOWxsIHN0aWxsIG9mdGVuIGxvb3NlIHRvIHRoZSBjc3MtcGFyc2VyIHVubGVzcyB0aGVyZSdzICcvLycgY29tbWVudCxcbiAgICAgIC8vIHNpbXBseSBiZWNhdXNlIDEgdmFyaWFibGUganVzdCBjYW4ndCBiZWF0IDk5IHByb3BlcnRpZXMgOilcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdAJyArIElERU5UX1JFICsgJ1xcXFxzKjonLFxuICAgICAgICByZWxldmFuY2U6IDE1XG4gICAgICB9LFxuICAgICAgeyBiZWdpbjogJ0AnICsgSURFTlRfUkUgfVxuICAgIF0sXG4gICAgc3RhcnRzOiB7XG4gICAgICBlbmQ6ICdbO31dJyxcbiAgICAgIHJldHVybkVuZDogdHJ1ZSxcbiAgICAgIGNvbnRhaW5zOiBWQUxVRV9XSVRIX1JVTEVTRVRTXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFNFTEVDVE9SX01PREUgPSB7XG4gICAgLy8gZmlyc3QgcGFyc2UgdW5hbWJpZ3VvdXMgc2VsZWN0b3JzIChpLmUuIHRob3NlIG5vdCBzdGFydGluZyB3aXRoIHRhZylcbiAgICAvLyB0aGVuIGZhbGwgaW50byB0aGUgc2NhcnkgbG9va2FoZWFkLWRpc2NyaW1pbmF0b3IgdmFyaWFudC5cbiAgICAvLyB0aGlzIG1vZGUgYWxzbyBoYW5kbGVzIG1peGluIGRlZmluaXRpb25zIGFuZCBjYWxsc1xuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnW1xcXFwuIzomXFxcXFs+XScsXG4gICAgICAgIGVuZDogJ1s7e31dJyAvLyBtaXhpbiBjYWxscyBlbmQgd2l0aCAnOydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBJTlRFUlBfSURFTlRfUkUsXG4gICAgICAgIGVuZDogL1xcey9cbiAgICAgIH1cbiAgICBdLFxuICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgIHJldHVybkVuZDogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAnWzw9XFwnJFwiXScsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAgTUlYSU5fR1VBUkRfTU9ERSxcbiAgICAgIElERU5UX01PREUoJ2tleXdvcmQnLCAnYWxsXFxcXGInKSxcbiAgICAgIElERU5UX01PREUoJ3ZhcmlhYmxlJywgJ0BcXFxceycgKyBJREVOVF9SRSArICdcXFxcfScpLCAvLyBvdGhlcndpc2UgaXRcdTIwMTlzIGlkZW50aWZpZWQgYXMgdGFnXG4gICAgICBcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdcXFxcYignICsgVEFHUy5qb2luKCd8JykgKyAnKVxcXFxiJyxcbiAgICAgICAgY2xhc3NOYW1lOiAnc2VsZWN0b3ItdGFnJ1xuICAgICAgfSxcbiAgICAgIG1vZGVzLkNTU19OVU1CRVJfTU9ERSxcbiAgICAgIElERU5UX01PREUoJ3NlbGVjdG9yLXRhZycsIElOVEVSUF9JREVOVF9SRSwgMCksXG4gICAgICBJREVOVF9NT0RFKCdzZWxlY3Rvci1pZCcsICcjJyArIElOVEVSUF9JREVOVF9SRSksXG4gICAgICBJREVOVF9NT0RFKCdzZWxlY3Rvci1jbGFzcycsICdcXFxcLicgKyBJTlRFUlBfSURFTlRfUkUsIDApLFxuICAgICAgSURFTlRfTU9ERSgnc2VsZWN0b3ItdGFnJywgJyYnLCAwKSxcbiAgICAgIG1vZGVzLkFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzZWxlY3Rvci1wc2V1ZG8nLFxuICAgICAgICBiZWdpbjogJzooJyArIFBTRVVET19DTEFTU0VTLmpvaW4oJ3wnKSArICcpJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnc2VsZWN0b3ItcHNldWRvJyxcbiAgICAgICAgYmVnaW46ICc6KDopPygnICsgUFNFVURPX0VMRU1FTlRTLmpvaW4oJ3wnKSArICcpJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGNvbnRhaW5zOiBWQUxVRV9XSVRIX1JVTEVTRVRTXG4gICAgICB9LCAvLyBhcmd1bWVudCBsaXN0IG9mIHBhcmFtZXRyaWMgbWl4aW5zXG4gICAgICB7IGJlZ2luOiAnIWltcG9ydGFudCcgfSwgLy8gZWF0ICFpbXBvcnRhbnQgYWZ0ZXIgbWl4aW4gY2FsbCBvciBpdCB3aWxsIGJlIGNvbG9yZWQgYXMgdGFnXG4gICAgICBtb2Rlcy5GVU5DVElPTl9ESVNQQVRDSFxuICAgIF1cbiAgfTtcblxuICBjb25zdCBQU0VVRE9fU0VMRUNUT1JfTU9ERSA9IHtcbiAgICBiZWdpbjogSURFTlRfUkUgKyAnOig6KT8nICsgYCgke1BTRVVET19TRUxFQ1RPUlMkMS5qb2luKCd8Jyl9KWAsXG4gICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgY29udGFpbnM6IFsgU0VMRUNUT1JfTU9ERSBdXG4gIH07XG5cbiAgUlVMRVMucHVzaChcbiAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICBBVF9SVUxFX01PREUsXG4gICAgVkFSX1JVTEVfTU9ERSxcbiAgICBQU0VVRE9fU0VMRUNUT1JfTU9ERSxcbiAgICBSVUxFX01PREUsXG4gICAgU0VMRUNUT1JfTU9ERSxcbiAgICBNSVhJTl9HVUFSRF9NT0RFLFxuICAgIG1vZGVzLkZVTkNUSU9OX0RJU1BBVENIXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGVzcycsXG4gICAgY2FzZV9pbnNlbnNpdGl2ZTogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAnWz0+XFwnLzwoJFwiXScsXG4gICAgY29udGFpbnM6IFJVTEVTXG4gIH07XG59XG5cbmV4cG9ydCB7IGxlc3MgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogTHVhXG5EZXNjcmlwdGlvbjogTHVhIGlzIGEgcG93ZXJmdWwsIGVmZmljaWVudCwgbGlnaHR3ZWlnaHQsIGVtYmVkZGFibGUgc2NyaXB0aW5nIGxhbmd1YWdlLlxuQXV0aG9yOiBBbmRyZXcgRmVkb3JvdiA8ZG1tZHJzQG1haWwucnU+XG5DYXRlZ29yeTogY29tbW9uLCBzY3JpcHRpbmdcbldlYnNpdGU6IGh0dHBzOi8vd3d3Lmx1YS5vcmdcbiovXG5cbmZ1bmN0aW9uIGx1YShobGpzKSB7XG4gIGNvbnN0IE9QRU5JTkdfTE9OR19CUkFDS0VUID0gJ1xcXFxbPSpcXFxcWyc7XG4gIGNvbnN0IENMT1NJTkdfTE9OR19CUkFDS0VUID0gJ1xcXFxdPSpcXFxcXSc7XG4gIGNvbnN0IExPTkdfQlJBQ0tFVFMgPSB7XG4gICAgYmVnaW46IE9QRU5JTkdfTE9OR19CUkFDS0VULFxuICAgIGVuZDogQ0xPU0lOR19MT05HX0JSQUNLRVQsXG4gICAgY29udGFpbnM6IFsgJ3NlbGYnIF1cbiAgfTtcbiAgY29uc3QgQ09NTUVOVFMgPSBbXG4gICAgaGxqcy5DT01NRU5UKCctLSg/IScgKyBPUEVOSU5HX0xPTkdfQlJBQ0tFVCArICcpJywgJyQnKSxcbiAgICBobGpzLkNPTU1FTlQoXG4gICAgICAnLS0nICsgT1BFTklOR19MT05HX0JSQUNLRVQsXG4gICAgICBDTE9TSU5HX0xPTkdfQlJBQ0tFVCxcbiAgICAgIHtcbiAgICAgICAgY29udGFpbnM6IFsgTE9OR19CUkFDS0VUUyBdLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9XG4gICAgKVxuICBdO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdMdWEnLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgICAgbGl0ZXJhbDogXCJ0cnVlIGZhbHNlIG5pbFwiLFxuICAgICAga2V5d29yZDogXCJhbmQgYnJlYWsgZG8gZWxzZSBlbHNlaWYgZW5kIGZvciBnb3RvIGlmIGluIGxvY2FsIG5vdCBvciByZXBlYXQgcmV0dXJuIHRoZW4gdW50aWwgd2hpbGVcIixcbiAgICAgIGJ1aWx0X2luOlxuICAgICAgICAvLyBNZXRhdGFncyBhbmQgZ2xvYmFsczpcbiAgICAgICAgJ19HIF9FTlYgX1ZFUlNJT04gX19pbmRleCBfX25ld2luZGV4IF9fbW9kZSBfX2NhbGwgX19tZXRhdGFibGUgX190b3N0cmluZyBfX2xlbiAnXG4gICAgICAgICsgJ19fZ2MgX19hZGQgX19zdWIgX19tdWwgX19kaXYgX19tb2QgX19wb3cgX19jb25jYXQgX191bm0gX19lcSBfX2x0IF9fbGUgYXNzZXJ0ICdcbiAgICAgICAgLy8gU3RhbmRhcmQgbWV0aG9kcyBhbmQgcHJvcGVydGllczpcbiAgICAgICAgKyAnY29sbGVjdGdhcmJhZ2UgZG9maWxlIGVycm9yIGdldGZlbnYgZ2V0bWV0YXRhYmxlIGlwYWlycyBsb2FkIGxvYWRmaWxlIGxvYWRzdHJpbmcgJ1xuICAgICAgICArICdtb2R1bGUgbmV4dCBwYWlycyBwY2FsbCBwcmludCByYXdlcXVhbCByYXdnZXQgcmF3c2V0IHJlcXVpcmUgc2VsZWN0IHNldGZlbnYgJ1xuICAgICAgICArICdzZXRtZXRhdGFibGUgdG9udW1iZXIgdG9zdHJpbmcgdHlwZSB1bnBhY2sgeHBjYWxsIGFyZyBzZWxmICdcbiAgICAgICAgLy8gTGlicmFyeSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIChvbmUgbGluZSBwZXIgbGlicmFyeSk6XG4gICAgICAgICsgJ2Nvcm91dGluZSByZXN1bWUgeWllbGQgc3RhdHVzIHdyYXAgY3JlYXRlIHJ1bm5pbmcgZGVidWcgZ2V0dXB2YWx1ZSAnXG4gICAgICAgICsgJ2RlYnVnIHNldGhvb2sgZ2V0bWV0YXRhYmxlIGdldGhvb2sgc2V0bWV0YXRhYmxlIHNldGxvY2FsIHRyYWNlYmFjayBzZXRmZW52IGdldGluZm8gc2V0dXB2YWx1ZSBnZXRsb2NhbCBnZXRyZWdpc3RyeSBnZXRmZW52ICdcbiAgICAgICAgKyAnaW8gbGluZXMgd3JpdGUgY2xvc2UgZmx1c2ggb3BlbiBvdXRwdXQgdHlwZSByZWFkIHN0ZGVyciBzdGRpbiBpbnB1dCBzdGRvdXQgcG9wZW4gdG1wZmlsZSAnXG4gICAgICAgICsgJ21hdGggbG9nIG1heCBhY29zIGh1Z2UgbGRleHAgcGkgY29zIHRhbmggcG93IGRlZyB0YW4gY29zaCBzaW5oIHJhbmRvbSByYW5kb21zZWVkIGZyZXhwIGNlaWwgZmxvb3IgcmFkIGFicyBzcXJ0IG1vZGYgYXNpbiBtaW4gbW9kIGZtb2QgbG9nMTAgYXRhbjIgZXhwIHNpbiBhdGFuICdcbiAgICAgICAgKyAnb3MgZXhpdCBzZXRsb2NhbGUgZGF0ZSBnZXRlbnYgZGlmZnRpbWUgcmVtb3ZlIHRpbWUgY2xvY2sgdG1wbmFtZSByZW5hbWUgZXhlY3V0ZSBwYWNrYWdlIHByZWxvYWQgbG9hZGxpYiBsb2FkZWQgbG9hZGVycyBjcGF0aCBjb25maWcgcGF0aCBzZWVhbGwgJ1xuICAgICAgICArICdzdHJpbmcgc3ViIHVwcGVyIGxlbiBnZmluZCByZXAgZmluZCBtYXRjaCBjaGFyIGR1bXAgZ21hdGNoIHJldmVyc2UgYnl0ZSBmb3JtYXQgZ3N1YiBsb3dlciAnXG4gICAgICAgICsgJ3RhYmxlIHNldG4gaW5zZXJ0IGdldG4gZm9yZWFjaGkgbWF4biBmb3JlYWNoIGNvbmNhdCBzb3J0IHJlbW92ZSdcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBDT01NRU5UUy5jb25jYXQoW1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgICAgIGJlZ2luS2V5d29yZHM6ICdmdW5jdGlvbicsXG4gICAgICAgIGVuZDogJ1xcXFwpJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBobGpzLmluaGVyaXQoaGxqcy5USVRMRV9NT0RFLCB7IGJlZ2luOiAnKFtfYS16QS1aXVxcXFx3KlxcXFwuKSooW19hLXpBLVpdXFxcXHcqOik/W19hLXpBLVpdXFxcXHcqJyB9KSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdwYXJhbXMnLFxuICAgICAgICAgICAgYmVnaW46ICdcXFxcKCcsXG4gICAgICAgICAgICBlbmRzV2l0aFBhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBDT01NRU5UU1xuICAgICAgICAgIH1cbiAgICAgICAgXS5jb25jYXQoQ09NTUVOVFMpXG4gICAgICB9LFxuICAgICAgaGxqcy5DX05VTUJFUl9NT0RFLFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICAgICAgYmVnaW46IE9QRU5JTkdfTE9OR19CUkFDS0VULFxuICAgICAgICBlbmQ6IENMT1NJTkdfTE9OR19CUkFDS0VULFxuICAgICAgICBjb250YWluczogWyBMT05HX0JSQUNLRVRTIF0sXG4gICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgfVxuICAgIF0pXG4gIH07XG59XG5cbmV4cG9ydCB7IGx1YSBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBNYWtlZmlsZVxuQXV0aG9yOiBJdmFuIFNhZ2FsYWV2IDxtYW5pYWNAc29mdHdhcmVtYW5pYWNzLm9yZz5cbkNvbnRyaWJ1dG9yczogSm9cdTAwRUJsIFBvcnF1ZXQgPGpvZWxAcG9ycXVldC5vcmc+XG5XZWJzaXRlOiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL21ha2UvbWFudWFsL2h0bWxfbm9kZS9JbnRyb2R1Y3Rpb24uaHRtbFxuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuZnVuY3Rpb24gbWFrZWZpbGUoaGxqcykge1xuICAvKiBWYXJpYWJsZXM6IHNpbXBsZSAoZWcgJCh2YXIpKSBhbmQgc3BlY2lhbCAoZWcgJEApICovXG4gIGNvbnN0IFZBUklBQkxFID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogJ1xcXFwkXFxcXCgnICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFICsgJ1xcXFwpJyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgICAgIH0sXG4gICAgICB7IGJlZ2luOiAvXFwkW0AlPD9cXF5cXCtcXCpdLyB9XG4gICAgXVxuICB9O1xuICAvKiBRdW90ZWQgc3RyaW5nIHdpdGggdmFyaWFibGVzIGluc2lkZSAqL1xuICBjb25zdCBRVU9URV9TVFJJTkcgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBiZWdpbjogL1wiLyxcbiAgICBlbmQ6IC9cIi8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgIFZBUklBQkxFXG4gICAgXVxuICB9O1xuICAvKiBGdW5jdGlvbjogJChmdW5jIGFyZywuLi4pICovXG4gIGNvbnN0IEZVTkMgPSB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIGJlZ2luOiAvXFwkXFwoW1xcdy1dK1xccy8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICBrZXl3b3JkczogeyBidWlsdF9pbjpcbiAgICAgICAgJ3N1YnN0IHBhdHN1YnN0IHN0cmlwIGZpbmRzdHJpbmcgZmlsdGVyIGZpbHRlci1vdXQgc29ydCAnXG4gICAgICAgICsgJ3dvcmQgd29yZGxpc3QgZmlyc3R3b3JkIGxhc3R3b3JkIGRpciBub3RkaXIgc3VmZml4IGJhc2VuYW1lICdcbiAgICAgICAgKyAnYWRkc3VmZml4IGFkZHByZWZpeCBqb2luIHdpbGRjYXJkIHJlYWxwYXRoIGFic3BhdGggZXJyb3Igd2FybmluZyAnXG4gICAgICAgICsgJ3NoZWxsIG9yaWdpbiBmbGF2b3IgZm9yZWFjaCBpZiBvciBhbmQgY2FsbCBldmFsIGZpbGUgdmFsdWUnIH0sXG4gICAgY29udGFpbnM6IFsgVkFSSUFCTEUgXVxuICB9O1xuICAvKiBWYXJpYWJsZSBhc3NpZ25tZW50ICovXG4gIGNvbnN0IEFTU0lHTk1FTlQgPSB7IGJlZ2luOiAnXicgKyBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgKyAnXFxcXHMqKD89WzorP10/PSknIH07XG4gIC8qIE1ldGEgdGFyZ2V0cyAoLlBIT05ZKSAqL1xuICBjb25zdCBNRVRBID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAvXlxcLlBIT05ZOi8sXG4gICAgZW5kOiAvJC8sXG4gICAga2V5d29yZHM6IHtcbiAgICAgICRwYXR0ZXJuOiAvW1xcLlxcd10rLyxcbiAgICAgIGtleXdvcmQ6ICcuUEhPTlknXG4gICAgfVxuICB9O1xuICAvKiBUYXJnZXRzICovXG4gIGNvbnN0IFRBUkdFVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzZWN0aW9uJyxcbiAgICBiZWdpbjogL15bXlxcc10rOi8sXG4gICAgZW5kOiAvJC8sXG4gICAgY29udGFpbnM6IFsgVkFSSUFCTEUgXVxuICB9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdNYWtlZmlsZScsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ21rJyxcbiAgICAgICdtYWsnLFxuICAgICAgJ21ha2UnLFxuICAgIF0sXG4gICAga2V5d29yZHM6IHtcbiAgICAgICRwYXR0ZXJuOiAvW1xcdy1dKy8sXG4gICAgICBrZXl3b3JkOiAnZGVmaW5lIGVuZGVmIHVuZGVmaW5lIGlmZGVmIGlmbmRlZiBpZmVxIGlmbmVxIGVsc2UgZW5kaWYgJ1xuICAgICAgKyAnaW5jbHVkZSAtaW5jbHVkZSBzaW5jbHVkZSBvdmVycmlkZSBleHBvcnQgdW5leHBvcnQgcHJpdmF0ZSB2cGF0aCdcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkhBU0hfQ09NTUVOVF9NT0RFLFxuICAgICAgVkFSSUFCTEUsXG4gICAgICBRVU9URV9TVFJJTkcsXG4gICAgICBGVU5DLFxuICAgICAgQVNTSUdOTUVOVCxcbiAgICAgIE1FVEEsXG4gICAgICBUQVJHRVRcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IG1ha2VmaWxlIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IE1hcmtkb3duXG5SZXF1aXJlczogeG1sLmpzXG5BdXRob3I6IEpvaG4gQ3JlcGV6emkgPGpvaG4uY3JlcGV6emlAZ21haWwuY29tPlxuV2Vic2l0ZTogaHR0cHM6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vXG5DYXRlZ29yeTogY29tbW9uLCBtYXJrdXBcbiovXG5cbmZ1bmN0aW9uIG1hcmtkb3duKGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBJTkxJTkVfSFRNTCA9IHtcbiAgICBiZWdpbjogLzxcXC8/W0EtWmEtel9dLyxcbiAgICBlbmQ6ICc+JyxcbiAgICBzdWJMYW5ndWFnZTogJ3htbCcsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG4gIGNvbnN0IEhPUklaT05UQUxfUlVMRSA9IHtcbiAgICBiZWdpbjogJ15bLVxcXFwqXXszLH0nLFxuICAgIGVuZDogJyQnXG4gIH07XG4gIGNvbnN0IENPREUgPSB7XG4gICAgY2xhc3NOYW1lOiAnY29kZScsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIC8vIFRPRE86IGZpeCB0byBhbGxvdyB0aGVzZSB0byB3b3JrIHdpdGggc3VibGFuZ3VhZ2UgYWxzb1xuICAgICAgeyBiZWdpbjogJyhgezMsfSlbXmBdKC58XFxcXG4pKj9cXFxcMWAqWyBdKicgfSxcbiAgICAgIHsgYmVnaW46ICcofnszLH0pW15+XSgufFxcXFxuKSo/XFxcXDF+KlsgXSonIH0sXG4gICAgICAvLyBuZWVkZWQgdG8gYWxsb3cgbWFya2Rvd24gYXMgYSBzdWJsYW5ndWFnZSB0byB3b3JrXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnYGBgJyxcbiAgICAgICAgZW5kOiAnYGBgK1sgXSokJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICd+fn4nLFxuICAgICAgICBlbmQ6ICd+fn4rWyBdKiQnXG4gICAgICB9LFxuICAgICAgeyBiZWdpbjogJ2AuKz9gJyB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJyg/PV4oIHs0fXxcXFxcdCkpJyxcbiAgICAgICAgLy8gdXNlIGNvbnRhaW5zIHRvIGdvYmJsZSB1cCBtdWx0aXBsZSBsaW5lcyB0byBhbGxvdyB0aGUgYmxvY2sgdG8gYmUgd2hhdGV2ZXIgc2l6ZVxuICAgICAgICAvLyBidXQgb25seSBoYXZlIGEgc2luZ2xlIG9wZW4vY2xvc2UgdGFnIHZzIG9uZSBwZXIgbGluZVxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnXiggezR9fFxcXFx0KScsXG4gICAgICAgICAgICBlbmQ6ICcoXFxcXG4pJCdcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgTElTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdidWxsZXQnLFxuICAgIGJlZ2luOiAnXlsgXFx0XSooWyorLV18KFxcXFxkK1xcXFwuKSkoPz1cXFxccyspJyxcbiAgICBlbmQ6ICdcXFxccysnLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWVcbiAgfTtcbiAgY29uc3QgTElOS19SRUZFUkVOQ0UgPSB7XG4gICAgYmVnaW46IC9eXFxbW15cXG5dK1xcXTovLFxuICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N5bWJvbCcsXG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXFxdLyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdsaW5rJyxcbiAgICAgICAgYmVnaW46IC86XFxzKi8sXG4gICAgICAgIGVuZDogLyQvLFxuICAgICAgICBleGNsdWRlQmVnaW46IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IFVSTF9TQ0hFTUUgPSAvW0EtWmEtel1bQS1aYS16MC05Ky4tXSovO1xuICBjb25zdCBMSU5LID0ge1xuICAgIHZhcmlhbnRzOiBbXG4gICAgICAvLyB0b28gbXVjaCBsaWtlIG5lc3RlZCBhcnJheSBhY2Nlc3MgaW4gc28gbWFueSBsYW5ndWFnZXNcbiAgICAgIC8vIHRvIGhhdmUgYW55IHJlYWwgcmVsZXZhbmNlXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLis/XFxdXFxbLio/XFxdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgLy8gcG9wdWxhciBpbnRlcm5ldCBVUkxzXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLis/XFxdXFwoKChkYXRhfGphdmFzY3JpcHR8bWFpbHRvKTp8KD86aHR0cHxmdHApcz86XFwvXFwvKS4qP1xcKS8sXG4gICAgICAgIHJlbGV2YW5jZTogMlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvXFxbLis/XFxdXFwoLywgVVJMX1NDSEVNRSwgLzpcXC9cXC8uKj9cXCkvKSxcbiAgICAgICAgcmVsZXZhbmNlOiAyXG4gICAgICB9LFxuICAgICAgLy8gcmVsYXRpdmUgdXJsc1xuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcWy4rP1xcXVxcKFsuLz8mI10uKj9cXCkvLFxuICAgICAgICByZWxldmFuY2U6IDFcbiAgICAgIH0sXG4gICAgICAvLyB3aGF0ZXZlciBlbHNlLCBsb3dlciByZWxldmFuY2UgKG1pZ2h0IG5vdCBiZSBhIGxpbmsgYXQgYWxsKVxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcWy4qP1xcXVxcKC4qP1xcKS8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfVxuICAgIF0sXG4gICAgcmV0dXJuQmVnaW46IHRydWUsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgLy8gZW1wdHkgc3RyaW5ncyBmb3IgYWx0IG9yIGxpbmsgdGV4dFxuICAgICAgICBtYXRjaDogL1xcWyg/PVxcXSkvIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgYmVnaW46ICdcXFxcWycsXG4gICAgICAgIGVuZDogJ1xcXFxdJyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICByZXR1cm5FbmQ6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2xpbmsnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGJlZ2luOiAnXFxcXF1cXFxcKCcsXG4gICAgICAgIGVuZDogJ1xcXFwpJyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGJlZ2luOiAnXFxcXF1cXFxcWycsXG4gICAgICAgIGVuZDogJ1xcXFxdJyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBCT0xEID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cm9uZycsXG4gICAgY29udGFpbnM6IFtdLCAvLyBkZWZpbmVkIGxhdGVyXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9fezJ9KD8hXFxzKS8sXG4gICAgICAgIGVuZDogL197Mn0vXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKnsyfSg/IVxccykvLFxuICAgICAgICBlbmQ6IC9cXCp7Mn0vXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBJVEFMSUMgPSB7XG4gICAgY2xhc3NOYW1lOiAnZW1waGFzaXMnLFxuICAgIGNvbnRhaW5zOiBbXSwgLy8gZGVmaW5lZCBsYXRlclxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFwqKD8hWypcXHNdKS8sXG4gICAgICAgIGVuZDogL1xcKi9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXyg/IVtfXFxzXSkvLFxuICAgICAgICBlbmQ6IC9fLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9XG4gICAgXVxuICB9O1xuXG4gIC8vIDMgbGV2ZWwgZGVlcCBuZXN0aW5nIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgaXQgd291bGQgY3JlYXRlIGNvbmZ1c2lvblxuICAvLyBpbiBjYXNlcyBsaWtlIGAqKip0ZXN0aW5nKioqYCBiZWNhdXNlIHdoZXJlIHdlIGRvbid0IGtub3cgaWYgdGhlIGxhc3RcbiAgLy8gYCoqKmAgaXMgc3RhcnRpbmcgYSBuZXcgYm9sZC9pdGFsaWMgb3IgZmluaXNoaW5nIHRoZSBsYXN0IG9uZVxuICBjb25zdCBCT0xEX1dJVEhPVVRfSVRBTElDID0gaGxqcy5pbmhlcml0KEJPTEQsIHsgY29udGFpbnM6IFtdIH0pO1xuICBjb25zdCBJVEFMSUNfV0lUSE9VVF9CT0xEID0gaGxqcy5pbmhlcml0KElUQUxJQywgeyBjb250YWluczogW10gfSk7XG4gIEJPTEQuY29udGFpbnMucHVzaChJVEFMSUNfV0lUSE9VVF9CT0xEKTtcbiAgSVRBTElDLmNvbnRhaW5zLnB1c2goQk9MRF9XSVRIT1VUX0lUQUxJQyk7XG5cbiAgbGV0IENPTlRBSU5BQkxFID0gW1xuICAgIElOTElORV9IVE1MLFxuICAgIExJTktcbiAgXTtcblxuICBbXG4gICAgQk9MRCxcbiAgICBJVEFMSUMsXG4gICAgQk9MRF9XSVRIT1VUX0lUQUxJQyxcbiAgICBJVEFMSUNfV0lUSE9VVF9CT0xEXG4gIF0uZm9yRWFjaChtID0+IHtcbiAgICBtLmNvbnRhaW5zID0gbS5jb250YWlucy5jb25jYXQoQ09OVEFJTkFCTEUpO1xuICB9KTtcblxuICBDT05UQUlOQUJMRSA9IENPTlRBSU5BQkxFLmNvbmNhdChCT0xELCBJVEFMSUMpO1xuXG4gIGNvbnN0IEhFQURFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdzZWN0aW9uJyxcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICBiZWdpbjogJ14jezEsNn0nLFxuICAgICAgICBlbmQ6ICckJyxcbiAgICAgICAgY29udGFpbnM6IENPTlRBSU5BQkxFXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogJyg/PV4uKz9cXFxcbls9LV17Mix9JCknLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHsgYmVnaW46ICdeWz0tXSokJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnXicsXG4gICAgICAgICAgICBlbmQ6IFwiXFxcXG5cIixcbiAgICAgICAgICAgIGNvbnRhaW5zOiBDT05UQUlOQUJMRVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBCTE9DS1FVT1RFID0ge1xuICAgIGNsYXNzTmFtZTogJ3F1b3RlJyxcbiAgICBiZWdpbjogJ14+XFxcXHMrJyxcbiAgICBjb250YWluczogQ09OVEFJTkFCTEUsXG4gICAgZW5kOiAnJCdcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdNYXJrZG93bicsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ21kJyxcbiAgICAgICdta2Rvd24nLFxuICAgICAgJ21rZCdcbiAgICBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBIRUFERVIsXG4gICAgICBJTkxJTkVfSFRNTCxcbiAgICAgIExJU1QsXG4gICAgICBCT0xELFxuICAgICAgSVRBTElDLFxuICAgICAgQkxPQ0tRVU9URSxcbiAgICAgIENPREUsXG4gICAgICBIT1JJWk9OVEFMX1JVTEUsXG4gICAgICBMSU5LLFxuICAgICAgTElOS19SRUZFUkVOQ0VcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IG1hcmtkb3duIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IE9iamVjdGl2ZS1DXG5BdXRob3I6IFZhbGVyaWkgSGlvcmEgPHZhbGVyaWkuaGlvcmFAZ21haWwuY29tPlxuQ29udHJpYnV0b3JzOiBBbmdlbCBHLiBPbGxvcXVpIDxhbmdlbGdhcmNpYS5tYWlsQGdtYWlsLmNvbT4sIE1hdHQgRGllcGhvdXNlIDxtYXR0QGRpZXBob3VzZS5jb20+LCBBbmRyZXcgRmFybWVyIDxhaGZhcm1lckBnbWFpbC5jb20+LCBNaW5oIE5ndXlcdTFFQzVuIDxteG5AMWVjNS5vcmc+XG5XZWJzaXRlOiBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9vYmplY3RpdmVjXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG5mdW5jdGlvbiBvYmplY3RpdmVjKGhsanMpIHtcbiAgY29uc3QgQVBJX0NMQVNTID0ge1xuICAgIGNsYXNzTmFtZTogJ2J1aWx0X2luJyxcbiAgICBiZWdpbjogJ1xcXFxiKEFWfENBfENGfENHfENJfENMfENNfENOfENUfE1LfE1QfE1US3xNVEx8TlN8U0NOfFNLfFVJfFdLfFhDKVxcXFx3KydcbiAgfTtcbiAgY29uc3QgSURFTlRJRklFUl9SRSA9IC9bYS16QS1aQF1bYS16QS1aMC05X10qLztcbiAgY29uc3QgVFlQRVMgPSBbXG4gICAgXCJpbnRcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJjaGFyXCIsXG4gICAgXCJ1bnNpZ25lZFwiLFxuICAgIFwic2lnbmVkXCIsXG4gICAgXCJzaG9ydFwiLFxuICAgIFwibG9uZ1wiLFxuICAgIFwiZG91YmxlXCIsXG4gICAgXCJ3Y2hhcl90XCIsXG4gICAgXCJ1bmljaGFyXCIsXG4gICAgXCJ2b2lkXCIsXG4gICAgXCJib29sXCIsXG4gICAgXCJCT09MXCIsXG4gICAgXCJpZHwwXCIsXG4gICAgXCJfQm9vbFwiXG4gIF07XG4gIGNvbnN0IEtXUyA9IFtcbiAgICBcIndoaWxlXCIsXG4gICAgXCJleHBvcnRcIixcbiAgICBcInNpemVvZlwiLFxuICAgIFwidHlwZWRlZlwiLFxuICAgIFwiY29uc3RcIixcbiAgICBcInN0cnVjdFwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJ1bmlvblwiLFxuICAgIFwidm9sYXRpbGVcIixcbiAgICBcInN0YXRpY1wiLFxuICAgIFwibXV0YWJsZVwiLFxuICAgIFwiaWZcIixcbiAgICBcImRvXCIsXG4gICAgXCJyZXR1cm5cIixcbiAgICBcImdvdG9cIixcbiAgICBcImVudW1cIixcbiAgICBcImVsc2VcIixcbiAgICBcImJyZWFrXCIsXG4gICAgXCJleHRlcm5cIixcbiAgICBcImFzbVwiLFxuICAgIFwiY2FzZVwiLFxuICAgIFwiZGVmYXVsdFwiLFxuICAgIFwicmVnaXN0ZXJcIixcbiAgICBcImV4cGxpY2l0XCIsXG4gICAgXCJ0eXBlbmFtZVwiLFxuICAgIFwic3dpdGNoXCIsXG4gICAgXCJjb250aW51ZVwiLFxuICAgIFwiaW5saW5lXCIsXG4gICAgXCJyZWFkb25seVwiLFxuICAgIFwiYXNzaWduXCIsXG4gICAgXCJyZWFkd3JpdGVcIixcbiAgICBcInNlbGZcIixcbiAgICBcIkBzeW5jaHJvbml6ZWRcIixcbiAgICBcImlkXCIsXG4gICAgXCJ0eXBlb2ZcIixcbiAgICBcIm5vbmF0b21pY1wiLFxuICAgIFwiSUJPdXRsZXRcIixcbiAgICBcIklCQWN0aW9uXCIsXG4gICAgXCJzdHJvbmdcIixcbiAgICBcIndlYWtcIixcbiAgICBcImNvcHlcIixcbiAgICBcImluXCIsXG4gICAgXCJvdXRcIixcbiAgICBcImlub3V0XCIsXG4gICAgXCJieWNvcHlcIixcbiAgICBcImJ5cmVmXCIsXG4gICAgXCJvbmV3YXlcIixcbiAgICBcIl9fc3Ryb25nXCIsXG4gICAgXCJfX3dlYWtcIixcbiAgICBcIl9fYmxvY2tcIixcbiAgICBcIl9fYXV0b3JlbGVhc2luZ1wiLFxuICAgIFwiQHByaXZhdGVcIixcbiAgICBcIkBwcm90ZWN0ZWRcIixcbiAgICBcIkBwdWJsaWNcIixcbiAgICBcIkB0cnlcIixcbiAgICBcIkBwcm9wZXJ0eVwiLFxuICAgIFwiQGVuZFwiLFxuICAgIFwiQHRocm93XCIsXG4gICAgXCJAY2F0Y2hcIixcbiAgICBcIkBmaW5hbGx5XCIsXG4gICAgXCJAYXV0b3JlbGVhc2Vwb29sXCIsXG4gICAgXCJAc3ludGhlc2l6ZVwiLFxuICAgIFwiQGR5bmFtaWNcIixcbiAgICBcIkBzZWxlY3RvclwiLFxuICAgIFwiQG9wdGlvbmFsXCIsXG4gICAgXCJAcmVxdWlyZWRcIixcbiAgICBcIkBlbmNvZGVcIixcbiAgICBcIkBwYWNrYWdlXCIsXG4gICAgXCJAaW1wb3J0XCIsXG4gICAgXCJAZGVmc1wiLFxuICAgIFwiQGNvbXBhdGliaWxpdHlfYWxpYXNcIixcbiAgICBcIl9fYnJpZGdlXCIsXG4gICAgXCJfX2JyaWRnZV90cmFuc2ZlclwiLFxuICAgIFwiX19icmlkZ2VfcmV0YWluZWRcIixcbiAgICBcIl9fYnJpZGdlX3JldGFpblwiLFxuICAgIFwiX19jb3ZhcmlhbnRcIixcbiAgICBcIl9fY29udHJhdmFyaWFudFwiLFxuICAgIFwiX19raW5kb2ZcIixcbiAgICBcIl9Ob25udWxsXCIsXG4gICAgXCJfTnVsbGFibGVcIixcbiAgICBcIl9OdWxsX3Vuc3BlY2lmaWVkXCIsXG4gICAgXCJfX0ZVTkNUSU9OX19cIixcbiAgICBcIl9fUFJFVFRZX0ZVTkNUSU9OX19cIixcbiAgICBcIl9fYXR0cmlidXRlX19cIixcbiAgICBcImdldHRlclwiLFxuICAgIFwic2V0dGVyXCIsXG4gICAgXCJyZXRhaW5cIixcbiAgICBcInVuc2FmZV91bnJldGFpbmVkXCIsXG4gICAgXCJub25udWxsXCIsXG4gICAgXCJudWxsYWJsZVwiLFxuICAgIFwibnVsbF91bnNwZWNpZmllZFwiLFxuICAgIFwibnVsbF9yZXNldHRhYmxlXCIsXG4gICAgXCJjbGFzc1wiLFxuICAgIFwiaW5zdGFuY2V0eXBlXCIsXG4gICAgXCJOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSXCIsXG4gICAgXCJOU19VTkFWQUlMQUJMRVwiLFxuICAgIFwiTlNfUkVRVUlSRVNfU1VQRVJcIixcbiAgICBcIk5TX1JFVFVSTlNfSU5ORVJfUE9JTlRFUlwiLFxuICAgIFwiTlNfSU5MSU5FXCIsXG4gICAgXCJOU19BVkFJTEFCTEVcIixcbiAgICBcIk5TX0RFUFJFQ0FURURcIixcbiAgICBcIk5TX0VOVU1cIixcbiAgICBcIk5TX09QVElPTlNcIixcbiAgICBcIk5TX1NXSUZUX1VOQVZBSUxBQkxFXCIsXG4gICAgXCJOU19BU1NVTUVfTk9OTlVMTF9CRUdJTlwiLFxuICAgIFwiTlNfQVNTVU1FX05PTk5VTExfRU5EXCIsXG4gICAgXCJOU19SRUZJTkVEX0ZPUl9TV0lGVFwiLFxuICAgIFwiTlNfU1dJRlRfTkFNRVwiLFxuICAgIFwiTlNfU1dJRlRfTk9USFJPV1wiLFxuICAgIFwiTlNfRFVSSU5HXCIsXG4gICAgXCJOU19IQU5ETEVSXCIsXG4gICAgXCJOU19FTkRIQU5ETEVSXCIsXG4gICAgXCJOU19WQUxVRVJFVFVSTlwiLFxuICAgIFwiTlNfVk9JRFJFVFVSTlwiXG4gIF07XG4gIGNvbnN0IExJVEVSQUxTID0gW1xuICAgIFwiZmFsc2VcIixcbiAgICBcInRydWVcIixcbiAgICBcIkZBTFNFXCIsXG4gICAgXCJUUlVFXCIsXG4gICAgXCJuaWxcIixcbiAgICBcIllFU1wiLFxuICAgIFwiTk9cIixcbiAgICBcIk5VTExcIlxuICBdO1xuICBjb25zdCBCVUlMVF9JTlMgPSBbXG4gICAgXCJkaXNwYXRjaF9vbmNlX3RcIixcbiAgICBcImRpc3BhdGNoX3F1ZXVlX3RcIixcbiAgICBcImRpc3BhdGNoX3N5bmNcIixcbiAgICBcImRpc3BhdGNoX2FzeW5jXCIsXG4gICAgXCJkaXNwYXRjaF9vbmNlXCJcbiAgXTtcbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAgXCJ2YXJpYWJsZS5sYW5ndWFnZVwiOiBbXG4gICAgICBcInRoaXNcIixcbiAgICAgIFwic3VwZXJcIlxuICAgIF0sXG4gICAgJHBhdHRlcm46IElERU5USUZJRVJfUkUsXG4gICAga2V5d29yZDogS1dTLFxuICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgIGJ1aWx0X2luOiBCVUlMVF9JTlMsXG4gICAgdHlwZTogVFlQRVNcbiAgfTtcbiAgY29uc3QgQ0xBU1NfS0VZV09SRFMgPSB7XG4gICAgJHBhdHRlcm46IElERU5USUZJRVJfUkUsXG4gICAga2V5d29yZDogW1xuICAgICAgXCJAaW50ZXJmYWNlXCIsXG4gICAgICBcIkBjbGFzc1wiLFxuICAgICAgXCJAcHJvdG9jb2xcIixcbiAgICAgIFwiQGltcGxlbWVudGF0aW9uXCJcbiAgICBdXG4gIH07XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ09iamVjdGl2ZS1DJyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAnbW0nLFxuICAgICAgJ29iamMnLFxuICAgICAgJ29iai1jJyxcbiAgICAgICdvYmotYysrJyxcbiAgICAgICdvYmplY3RpdmUtYysrJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6ICc8LycsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEFQSV9DTEFTUyxcbiAgICAgIGhsanMuQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNfTlVNQkVSX01PREUsXG4gICAgICBobGpzLlFVT1RFX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAnQFwiJyxcbiAgICAgICAgICAgIGVuZDogJ1wiJyxcbiAgICAgICAgICAgIGlsbGVnYWw6ICdcXFxcbicsXG4gICAgICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAvI1xccypbYS16XStcXGIvLFxuICAgICAgICBlbmQ6IC8kLyxcbiAgICAgICAga2V5d29yZHM6IHsga2V5d29yZDpcbiAgICAgICAgICAgICdpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSAnXG4gICAgICAgICAgICArICdwcmFnbWEgaWZkZWYgaWZuZGVmIGluY2x1ZGUnIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46IC9cXFxcXFxuLyxcbiAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHsgY2xhc3NOYW1lOiAnc3RyaW5nJyB9KSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgYmVnaW46IC88Lio/Pi8sXG4gICAgICAgICAgICBlbmQ6IC8kLyxcbiAgICAgICAgICAgIGlsbGVnYWw6ICdcXFxcbidcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhsanMuQ19MSU5FX0NPTU1FTlRfTU9ERSxcbiAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2NsYXNzJyxcbiAgICAgICAgYmVnaW46ICcoJyArIENMQVNTX0tFWVdPUkRTLmtleXdvcmQuam9pbignfCcpICsgJylcXFxcYicsXG4gICAgICAgIGVuZDogLyhcXHt8JCkvLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogQ0xBU1NfS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBbIGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnXFxcXC4nICsgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IG9iamVjdGl2ZWMgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogUGVybFxuQXV0aG9yOiBQZXRlciBMZW9ub3YgPGdvanBlZ0B5YW5kZXgucnU+XG5XZWJzaXRlOiBodHRwczovL3d3dy5wZXJsLm9yZ1xuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIHBlcmwoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIGNvbnN0IEtFWVdPUkRTID0gW1xuICAgICdhYnMnLFxuICAgICdhY2NlcHQnLFxuICAgICdhbGFybScsXG4gICAgJ2FuZCcsXG4gICAgJ2F0YW4yJyxcbiAgICAnYmluZCcsXG4gICAgJ2Jpbm1vZGUnLFxuICAgICdibGVzcycsXG4gICAgJ2JyZWFrJyxcbiAgICAnY2FsbGVyJyxcbiAgICAnY2hkaXInLFxuICAgICdjaG1vZCcsXG4gICAgJ2Nob21wJyxcbiAgICAnY2hvcCcsXG4gICAgJ2Nob3duJyxcbiAgICAnY2hyJyxcbiAgICAnY2hyb290JyxcbiAgICAnY2xvc2UnLFxuICAgICdjbG9zZWRpcicsXG4gICAgJ2Nvbm5lY3QnLFxuICAgICdjb250aW51ZScsXG4gICAgJ2NvcycsXG4gICAgJ2NyeXB0JyxcbiAgICAnZGJtY2xvc2UnLFxuICAgICdkYm1vcGVuJyxcbiAgICAnZGVmaW5lZCcsXG4gICAgJ2RlbGV0ZScsXG4gICAgJ2RpZScsXG4gICAgJ2RvJyxcbiAgICAnZHVtcCcsXG4gICAgJ2VhY2gnLFxuICAgICdlbHNlJyxcbiAgICAnZWxzaWYnLFxuICAgICdlbmRncmVudCcsXG4gICAgJ2VuZGhvc3RlbnQnLFxuICAgICdlbmRuZXRlbnQnLFxuICAgICdlbmRwcm90b2VudCcsXG4gICAgJ2VuZHB3ZW50JyxcbiAgICAnZW5kc2VydmVudCcsXG4gICAgJ2VvZicsXG4gICAgJ2V2YWwnLFxuICAgICdleGVjJyxcbiAgICAnZXhpc3RzJyxcbiAgICAnZXhpdCcsXG4gICAgJ2V4cCcsXG4gICAgJ2ZjbnRsJyxcbiAgICAnZmlsZW5vJyxcbiAgICAnZmxvY2snLFxuICAgICdmb3InLFxuICAgICdmb3JlYWNoJyxcbiAgICAnZm9yaycsXG4gICAgJ2Zvcm1hdCcsXG4gICAgJ2Zvcm1saW5lJyxcbiAgICAnZ2V0YycsXG4gICAgJ2dldGdyZW50JyxcbiAgICAnZ2V0Z3JnaWQnLFxuICAgICdnZXRncm5hbScsXG4gICAgJ2dldGhvc3RieWFkZHInLFxuICAgICdnZXRob3N0YnluYW1lJyxcbiAgICAnZ2V0aG9zdGVudCcsXG4gICAgJ2dldGxvZ2luJyxcbiAgICAnZ2V0bmV0YnlhZGRyJyxcbiAgICAnZ2V0bmV0YnluYW1lJyxcbiAgICAnZ2V0bmV0ZW50JyxcbiAgICAnZ2V0cGVlcm5hbWUnLFxuICAgICdnZXRwZ3JwJyxcbiAgICAnZ2V0cHJpb3JpdHknLFxuICAgICdnZXRwcm90b2J5bmFtZScsXG4gICAgJ2dldHByb3RvYnludW1iZXInLFxuICAgICdnZXRwcm90b2VudCcsXG4gICAgJ2dldHB3ZW50JyxcbiAgICAnZ2V0cHduYW0nLFxuICAgICdnZXRwd3VpZCcsXG4gICAgJ2dldHNlcnZieW5hbWUnLFxuICAgICdnZXRzZXJ2Ynlwb3J0JyxcbiAgICAnZ2V0c2VydmVudCcsXG4gICAgJ2dldHNvY2tuYW1lJyxcbiAgICAnZ2V0c29ja29wdCcsXG4gICAgJ2dpdmVuJyxcbiAgICAnZ2xvYicsXG4gICAgJ2dtdGltZScsXG4gICAgJ2dvdG8nLFxuICAgICdncmVwJyxcbiAgICAnZ3QnLFxuICAgICdoZXgnLFxuICAgICdpZicsXG4gICAgJ2luZGV4JyxcbiAgICAnaW50JyxcbiAgICAnaW9jdGwnLFxuICAgICdqb2luJyxcbiAgICAna2V5cycsXG4gICAgJ2tpbGwnLFxuICAgICdsYXN0JyxcbiAgICAnbGMnLFxuICAgICdsY2ZpcnN0JyxcbiAgICAnbGVuZ3RoJyxcbiAgICAnbGluaycsXG4gICAgJ2xpc3RlbicsXG4gICAgJ2xvY2FsJyxcbiAgICAnbG9jYWx0aW1lJyxcbiAgICAnbG9nJyxcbiAgICAnbHN0YXQnLFxuICAgICdsdCcsXG4gICAgJ21hJyxcbiAgICAnbWFwJyxcbiAgICAnbWtkaXInLFxuICAgICdtc2djdGwnLFxuICAgICdtc2dnZXQnLFxuICAgICdtc2dyY3YnLFxuICAgICdtc2dzbmQnLFxuICAgICdteScsXG4gICAgJ25lJyxcbiAgICAnbmV4dCcsXG4gICAgJ25vJyxcbiAgICAnbm90JyxcbiAgICAnb2N0JyxcbiAgICAnb3BlbicsXG4gICAgJ29wZW5kaXInLFxuICAgICdvcicsXG4gICAgJ29yZCcsXG4gICAgJ291cicsXG4gICAgJ3BhY2snLFxuICAgICdwYWNrYWdlJyxcbiAgICAncGlwZScsXG4gICAgJ3BvcCcsXG4gICAgJ3BvcycsXG4gICAgJ3ByaW50JyxcbiAgICAncHJpbnRmJyxcbiAgICAncHJvdG90eXBlJyxcbiAgICAncHVzaCcsXG4gICAgJ3F8MCcsXG4gICAgJ3FxJyxcbiAgICAncXVvdGVtZXRhJyxcbiAgICAncXcnLFxuICAgICdxeCcsXG4gICAgJ3JhbmQnLFxuICAgICdyZWFkJyxcbiAgICAncmVhZGRpcicsXG4gICAgJ3JlYWRsaW5lJyxcbiAgICAncmVhZGxpbmsnLFxuICAgICdyZWFkcGlwZScsXG4gICAgJ3JlY3YnLFxuICAgICdyZWRvJyxcbiAgICAncmVmJyxcbiAgICAncmVuYW1lJyxcbiAgICAncmVxdWlyZScsXG4gICAgJ3Jlc2V0JyxcbiAgICAncmV0dXJuJyxcbiAgICAncmV2ZXJzZScsXG4gICAgJ3Jld2luZGRpcicsXG4gICAgJ3JpbmRleCcsXG4gICAgJ3JtZGlyJyxcbiAgICAnc2F5JyxcbiAgICAnc2NhbGFyJyxcbiAgICAnc2VlaycsXG4gICAgJ3NlZWtkaXInLFxuICAgICdzZWxlY3QnLFxuICAgICdzZW1jdGwnLFxuICAgICdzZW1nZXQnLFxuICAgICdzZW1vcCcsXG4gICAgJ3NlbmQnLFxuICAgICdzZXRncmVudCcsXG4gICAgJ3NldGhvc3RlbnQnLFxuICAgICdzZXRuZXRlbnQnLFxuICAgICdzZXRwZ3JwJyxcbiAgICAnc2V0cHJpb3JpdHknLFxuICAgICdzZXRwcm90b2VudCcsXG4gICAgJ3NldHB3ZW50JyxcbiAgICAnc2V0c2VydmVudCcsXG4gICAgJ3NldHNvY2tvcHQnLFxuICAgICdzaGlmdCcsXG4gICAgJ3NobWN0bCcsXG4gICAgJ3NobWdldCcsXG4gICAgJ3NobXJlYWQnLFxuICAgICdzaG13cml0ZScsXG4gICAgJ3NodXRkb3duJyxcbiAgICAnc2luJyxcbiAgICAnc2xlZXAnLFxuICAgICdzb2NrZXQnLFxuICAgICdzb2NrZXRwYWlyJyxcbiAgICAnc29ydCcsXG4gICAgJ3NwbGljZScsXG4gICAgJ3NwbGl0JyxcbiAgICAnc3ByaW50ZicsXG4gICAgJ3NxcnQnLFxuICAgICdzcmFuZCcsXG4gICAgJ3N0YXQnLFxuICAgICdzdGF0ZScsXG4gICAgJ3N0dWR5JyxcbiAgICAnc3ViJyxcbiAgICAnc3Vic3RyJyxcbiAgICAnc3ltbGluaycsXG4gICAgJ3N5c2NhbGwnLFxuICAgICdzeXNvcGVuJyxcbiAgICAnc3lzcmVhZCcsXG4gICAgJ3N5c3NlZWsnLFxuICAgICdzeXN0ZW0nLFxuICAgICdzeXN3cml0ZScsXG4gICAgJ3RlbGwnLFxuICAgICd0ZWxsZGlyJyxcbiAgICAndGllJyxcbiAgICAndGllZCcsXG4gICAgJ3RpbWUnLFxuICAgICd0aW1lcycsXG4gICAgJ3RyJyxcbiAgICAndHJ1bmNhdGUnLFxuICAgICd1YycsXG4gICAgJ3VjZmlyc3QnLFxuICAgICd1bWFzaycsXG4gICAgJ3VuZGVmJyxcbiAgICAndW5sZXNzJyxcbiAgICAndW5saW5rJyxcbiAgICAndW5wYWNrJyxcbiAgICAndW5zaGlmdCcsXG4gICAgJ3VudGllJyxcbiAgICAndW50aWwnLFxuICAgICd1c2UnLFxuICAgICd1dGltZScsXG4gICAgJ3ZhbHVlcycsXG4gICAgJ3ZlYycsXG4gICAgJ3dhaXQnLFxuICAgICd3YWl0cGlkJyxcbiAgICAnd2FudGFycmF5JyxcbiAgICAnd2FybicsXG4gICAgJ3doZW4nLFxuICAgICd3aGlsZScsXG4gICAgJ3dyaXRlJyxcbiAgICAneHwwJyxcbiAgICAneG9yJyxcbiAgICAneXwwJ1xuICBdO1xuXG4gIC8vIGh0dHBzOi8vcGVybGRvYy5wZXJsLm9yZy9wZXJscmUjTW9kaWZpZXJzXG4gIGNvbnN0IFJFR0VYX01PRElGSUVSUyA9IC9bZHVhbHhtc2lwbmdyXXswLDEyfS87IC8vIGFhIGFuZCB4eCBhcmUgdmFsaWQsIG1ha2luZyBtYXggbGVuZ3RoIDEyXG4gIGNvbnN0IFBFUkxfS0VZV09SRFMgPSB7XG4gICAgJHBhdHRlcm46IC9bXFx3Ll0rLyxcbiAgICBrZXl3b3JkOiBLRVlXT1JEUy5qb2luKFwiIFwiKVxuICB9O1xuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46ICdbJEBdXFxcXHsnLFxuICAgIGVuZDogJ1xcXFx9JyxcbiAgICBrZXl3b3JkczogUEVSTF9LRVlXT1JEU1xuICB9O1xuICBjb25zdCBNRVRIT0QgPSB7XG4gICAgYmVnaW46IC8tPlxcey8sXG4gICAgZW5kOiAvXFx9L1xuICAgIC8vIGNvbnRhaW5zIGRlZmluZWQgbGF0ZXJcbiAgfTtcbiAgY29uc3QgVkFSID0geyB2YXJpYW50czogW1xuICAgIHsgYmVnaW46IC9cXCRcXGQvIH0sXG4gICAgeyBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1skJUBdKFxcXlxcd1xcYnwjXFx3Kyg6OlxcdyspKnxcXHtcXHcrXFx9fFxcdysoOjpcXHcqKSopLyxcbiAgICAgIC8vIG5lZ2F0aXZlIGxvb2stYWhlYWQgdHJpZXMgdG8gYXZvaWQgbWF0Y2hpbmcgcGF0dGVybnMgdGhhdCBhcmUgbm90XG4gICAgICAvLyBQZXJsIGF0IGFsbCBsaWtlICRpZGVudCQsIEBpZGVudEAsIGV0Yy5cbiAgICAgIGAoPyFbQS1aYS16XSkoPyFbQCQlXSlgXG4gICAgKSB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiAvWyQlQF1bXlxcc1xcd3tdLyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH1cbiAgXSB9O1xuICBjb25zdCBTVFJJTkdfQ09OVEFJTlMgPSBbXG4gICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgIFNVQlNULFxuICAgIFZBUlxuICBdO1xuICBjb25zdCBSRUdFWF9ERUxJTVMgPSBbXG4gICAgLyEvLFxuICAgIC9cXC8vLFxuICAgIC9cXHwvLFxuICAgIC9cXD8vLFxuICAgIC8nLyxcbiAgICAvXCIvLCAvLyB2YWxpZCBidXQgaW5mcmVxdWVudCBhbmQgd2VpcmRcbiAgICAvIy8gLy8gdmFsaWQgYnV0IGluZnJlcXVlbnQgYW5kIHdlaXJkXG4gIF07XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IG9wZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8UmVnRXhwfSBjbG9zZVxuICAgKi9cbiAgY29uc3QgUEFJUkVEX0RPVUJMRV9SRSA9IChwcmVmaXgsIG9wZW4sIGNsb3NlID0gJ1xcXFwxJykgPT4ge1xuICAgIGNvbnN0IG1pZGRsZSA9IChjbG9zZSA9PT0gJ1xcXFwxJylcbiAgICAgID8gY2xvc2VcbiAgICAgIDogcmVnZXguY29uY2F0KGNsb3NlLCBvcGVuKTtcbiAgICByZXR1cm4gcmVnZXguY29uY2F0KFxuICAgICAgcmVnZXguY29uY2F0KFwiKD86XCIsIHByZWZpeCwgXCIpXCIpLFxuICAgICAgb3BlbixcbiAgICAgIC8oPzpcXFxcLnxbXlxcXFxcXC9dKSo/LyxcbiAgICAgIG1pZGRsZSxcbiAgICAgIC8oPzpcXFxcLnxbXlxcXFxcXC9dKSo/LyxcbiAgICAgIGNsb3NlLFxuICAgICAgUkVHRVhfTU9ESUZJRVJTXG4gICAgKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfFJlZ0V4cH0gb3BlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IGNsb3NlXG4gICAqL1xuICBjb25zdCBQQUlSRURfUkUgPSAocHJlZml4LCBvcGVuLCBjbG9zZSkgPT4ge1xuICAgIHJldHVybiByZWdleC5jb25jYXQoXG4gICAgICByZWdleC5jb25jYXQoXCIoPzpcIiwgcHJlZml4LCBcIilcIiksXG4gICAgICBvcGVuLFxuICAgICAgLyg/OlxcXFwufFteXFxcXFxcL10pKj8vLFxuICAgICAgY2xvc2UsXG4gICAgICBSRUdFWF9NT0RJRklFUlNcbiAgICApO1xuICB9O1xuICBjb25zdCBQRVJMX0RFRkFVTFRfQ09OVEFJTlMgPSBbXG4gICAgVkFSLFxuICAgIGhsanMuSEFTSF9DT01NRU5UX01PREUsXG4gICAgaGxqcy5DT01NRU5UKFxuICAgICAgL149XFx3LyxcbiAgICAgIC89Y3V0LyxcbiAgICAgIHsgZW5kc1dpdGhQYXJlbnQ6IHRydWUgfVxuICAgICksXG4gICAgTUVUSE9ELFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICBjb250YWluczogU1RSSU5HX0NPTlRBSU5TLFxuICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAncVtxd3hyXT9cXFxccypcXFxcKCcsXG4gICAgICAgICAgZW5kOiAnXFxcXCknLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdxW3F3eHJdP1xcXFxzKlxcXFxbJyxcbiAgICAgICAgICBlbmQ6ICdcXFxcXScsXG4gICAgICAgICAgcmVsZXZhbmNlOiA1XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBiZWdpbjogJ3FbcXd4cl0/XFxcXHMqXFxcXHsnLFxuICAgICAgICAgIGVuZDogJ1xcXFx9JyxcbiAgICAgICAgICByZWxldmFuY2U6IDVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAncVtxd3hyXT9cXFxccypcXFxcfCcsXG4gICAgICAgICAgZW5kOiAnXFxcXHwnLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdxW3F3eHJdP1xcXFxzKjwnLFxuICAgICAgICAgIGVuZDogJz4nLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdxd1xcXFxzK3EnLFxuICAgICAgICAgIGVuZDogJ3EnLFxuICAgICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdcXCcnLFxuICAgICAgICAgIGVuZDogJ1xcJycsXG4gICAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAnXCInLFxuICAgICAgICAgIGVuZDogJ1wiJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICdgJyxcbiAgICAgICAgICBlbmQ6ICdgJyxcbiAgICAgICAgICBjb250YWluczogWyBobGpzLkJBQ0tTTEFTSF9FU0NBUEUgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46IC9cXHtcXHcrXFx9LyxcbiAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiAnLT9cXFxcdytcXFxccyo9PicsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogJyhcXFxcYjBbMC03X10rKXwoXFxcXGIweFswLTlhLWZBLUZfXSspfChcXFxcYlsxLTldWzAtOV9dKihcXFxcLlswLTlfXSspPyl8WzBfXVxcXFxiJyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgeyAvLyByZWdleHAgY29udGFpbmVyXG4gICAgICBiZWdpbjogJyhcXFxcL1xcXFwvfCcgKyBobGpzLlJFX1NUQVJURVJTX1JFICsgJ3xcXFxcYihzcGxpdHxyZXR1cm58cHJpbnR8cmV2ZXJzZXxncmVwKVxcXFxiKVxcXFxzKicsXG4gICAgICBrZXl3b3JkczogJ3NwbGl0IHJldHVybiBwcmludCByZXZlcnNlIGdyZXAnLFxuICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3JlZ2V4cCcsXG4gICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgIC8vIGFsbG93IG1hdGNoaW5nIGNvbW1vbiBkZWxpbWl0ZXJzXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfRE9VQkxFX1JFKFwic3x0cnx5XCIsIHJlZ2V4LmVpdGhlciguLi5SRUdFWF9ERUxJTVMsIHsgY2FwdHVyZTogdHJ1ZSB9KSkgfSxcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIHBhaXJlZCBkZWxtaXNcbiAgICAgICAgICAgIHsgYmVnaW46IFBBSVJFRF9ET1VCTEVfUkUoXCJzfHRyfHlcIiwgXCJcXFxcKFwiLCBcIlxcXFwpXCIpIH0sXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfRE9VQkxFX1JFKFwic3x0cnx5XCIsIFwiXFxcXFtcIiwgXCJcXFxcXVwiKSB9LFxuICAgICAgICAgICAgeyBiZWdpbjogUEFJUkVEX0RPVUJMRV9SRShcInN8dHJ8eVwiLCBcIlxcXFx7XCIsIFwiXFxcXH1cIikgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVsZXZhbmNlOiAyXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZWdleHAnLFxuICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIGNvdWxkIGJlIGEgY29tbWVudCBpbiBtYW55IGxhbmd1YWdlcyBzbyBkbyBub3QgY291bnRcbiAgICAgICAgICAgICAgLy8gYXMgcmVsZXZhbnRcbiAgICAgICAgICAgICAgYmVnaW46IC8obXxxcilcXC9cXC8vLFxuICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBwcmVmaXggaXMgb3B0aW9uYWwgd2l0aCAvcmVnZXgvXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfUkUoXCIoPzptfHFyKT9cIiwgL1xcLy8sIC9cXC8vKSB9LFxuICAgICAgICAgICAgLy8gYWxsb3cgbWF0Y2hpbmcgY29tbW9uIGRlbGltaXRlcnNcbiAgICAgICAgICAgIHsgYmVnaW46IFBBSVJFRF9SRShcIm18cXJcIiwgcmVnZXguZWl0aGVyKC4uLlJFR0VYX0RFTElNUywgeyBjYXB0dXJlOiB0cnVlIH0pLCAvXFwxLykgfSxcbiAgICAgICAgICAgIC8vIGFsbG93IGNvbW1vbiBwYWlyZWQgZGVsbWluc1xuICAgICAgICAgICAgeyBiZWdpbjogUEFJUkVEX1JFKFwibXxxclwiLCAvXFwoLywgL1xcKS8pIH0sXG4gICAgICAgICAgICB7IGJlZ2luOiBQQUlSRURfUkUoXCJtfHFyXCIsIC9cXFsvLCAvXFxdLykgfSxcbiAgICAgICAgICAgIHsgYmVnaW46IFBBSVJFRF9SRShcIm18cXJcIiwgL1xcey8sIC9cXH0vKSB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcbiAgICB7XG4gICAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgICBiZWdpbktleXdvcmRzOiAnc3ViJyxcbiAgICAgIGVuZDogJyhcXFxccypcXFxcKC4qP1xcXFwpKT9bO3tdJyxcbiAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICByZWxldmFuY2U6IDUsXG4gICAgICBjb250YWluczogWyBobGpzLlRJVExFX01PREUgXVxuICAgIH0sXG4gICAge1xuICAgICAgYmVnaW46ICctXFxcXHdcXFxcYicsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiBcIl5fX0RBVEFfXyRcIixcbiAgICAgIGVuZDogXCJeX19FTkRfXyRcIixcbiAgICAgIHN1Ykxhbmd1YWdlOiAnbW9qb2xpY2lvdXMnLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGJlZ2luOiBcIl5AQC4qXCIsXG4gICAgICAgICAgZW5kOiBcIiRcIixcbiAgICAgICAgICBjbGFzc05hbWU6IFwiY29tbWVudFwiXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIF07XG4gIFNVQlNULmNvbnRhaW5zID0gUEVSTF9ERUZBVUxUX0NPTlRBSU5TO1xuICBNRVRIT0QuY29udGFpbnMgPSBQRVJMX0RFRkFVTFRfQ09OVEFJTlM7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnUGVybCcsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ3BsJyxcbiAgICAgICdwbSdcbiAgICBdLFxuICAgIGtleXdvcmRzOiBQRVJMX0tFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBQRVJMX0RFRkFVTFRfQ09OVEFJTlNcbiAgfTtcbn1cblxuZXhwb3J0IHsgcGVybCBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBQSFBcbkF1dGhvcjogVmljdG9yIEthcmFtemluIDxWaWN0b3IuS2FyYW16aW5AZW50ZXJyYS1pbmMuY29tPlxuQ29udHJpYnV0b3JzOiBFdmdlbnkgU3RlcGFuaXNjaGV2IDxpbWJvbGtAZ21haWwuY29tPiwgSXZhbiBTYWdhbGFldiA8bWFuaWFjQHNvZnR3YXJlbWFuaWFjcy5vcmc+XG5XZWJzaXRlOiBodHRwczovL3d3dy5waHAubmV0XG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG4vKipcbiAqIEBwYXJhbSB7SExKU0FwaX0gaGxqc1xuICogQHJldHVybnMge0xhbmd1YWdlRGV0YWlsfVxuICogKi9cbmZ1bmN0aW9uIHBocChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLy8gbmVnYXRpdmUgbG9vay1haGVhZCB0cmllcyB0byBhdm9pZCBtYXRjaGluZyBwYXR0ZXJucyB0aGF0IGFyZSBub3RcbiAgLy8gUGVybCBhdCBhbGwgbGlrZSAkaWRlbnQkLCBAaWRlbnRALCBldGMuXG4gIGNvbnN0IE5PVF9QRVJMX0VUQyA9IC8oPyFbQS1aYS16MC05XSkoPyFbJF0pLztcbiAgY29uc3QgSURFTlRfUkUgPSByZWdleC5jb25jYXQoXG4gICAgL1thLXpBLVpfXFx4N2YtXFx4ZmZdW2EtekEtWjAtOV9cXHg3Zi1cXHhmZl0qLyxcbiAgICBOT1RfUEVSTF9FVEMpO1xuICAvLyBXaWxsIG5vdCBkZXRlY3QgY2FtZWxDYXNlIGNsYXNzZXNcbiAgY29uc3QgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdChcbiAgICAvKFxcXFw/W0EtWl1bYS16MC05X1xceDdmLVxceGZmXSt8XFxcXD9bQS1aXSsoPz1bQS1aXVthLXowLTlfXFx4N2YtXFx4ZmZdKSl7MSx9LyxcbiAgICBOT1RfUEVSTF9FVEMpO1xuICBjb25zdCBWQVJJQUJMRSA9IHtcbiAgICBzY29wZTogJ3ZhcmlhYmxlJyxcbiAgICBtYXRjaDogJ1xcXFwkKycgKyBJREVOVF9SRSxcbiAgfTtcbiAgY29uc3QgUFJFUFJPQ0VTU09SID0ge1xuICAgIHNjb3BlOiAnbWV0YScsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgYmVnaW46IC88XFw/cGhwLywgcmVsZXZhbmNlOiAxMCB9LCAvLyBib29zdCBmb3Igb2J2aW91cyBQSFBcbiAgICAgIHsgYmVnaW46IC88XFw/PS8gfSxcbiAgICAgIC8vIGxlc3MgcmVsZXZhbnQgcGVyIFBTUi0xIHdoaWNoIHNheXMgbm90IHRvIHVzZSBzaG9ydC10YWdzXG4gICAgICB7IGJlZ2luOiAvPFxcPy8sIHJlbGV2YW5jZTogMC4xIH0sXG4gICAgICB7IGJlZ2luOiAvXFw/Pi8gfSAvLyBlbmQgcGhwIHRhZ1xuICAgIF1cbiAgfTtcbiAgY29uc3QgU1VCU1QgPSB7XG4gICAgc2NvcGU6ICdzdWJzdCcsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgYmVnaW46IC9cXCRcXHcrLyB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xce1xcJC8sXG4gICAgICAgIGVuZDogL1xcfS9cbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IFNJTkdMRV9RVU9URUQgPSBobGpzLmluaGVyaXQoaGxqcy5BUE9TX1NUUklOR19NT0RFLCB7IGlsbGVnYWw6IG51bGwsIH0pO1xuICBjb25zdCBET1VCTEVfUVVPVEVEID0gaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHtcbiAgICBpbGxlZ2FsOiBudWxsLFxuICAgIGNvbnRhaW5zOiBobGpzLlFVT1RFX1NUUklOR19NT0RFLmNvbnRhaW5zLmNvbmNhdChTVUJTVCksXG4gIH0pO1xuXG4gIGNvbnN0IEhFUkVET0MgPSB7XG4gICAgYmVnaW46IC88PDxbIFxcdF0qKD86KFxcdyspfFwiKFxcdyspXCIpXFxuLyxcbiAgICBlbmQ6IC9bIFxcdF0qKFxcdyspXFxiLyxcbiAgICBjb250YWluczogaGxqcy5RVU9URV9TVFJJTkdfTU9ERS5jb250YWlucy5jb25jYXQoU1VCU1QpLFxuICAgICdvbjpiZWdpbic6IChtLCByZXNwKSA9PiB7IHJlc3AuZGF0YS5fYmVnaW5NYXRjaCA9IG1bMV0gfHwgbVsyXTsgfSxcbiAgICAnb246ZW5kJzogKG0sIHJlc3ApID0+IHsgaWYgKHJlc3AuZGF0YS5fYmVnaW5NYXRjaCAhPT0gbVsxXSkgcmVzcC5pZ25vcmVNYXRjaCgpOyB9LFxuICB9O1xuXG4gIGNvbnN0IE5PV0RPQyA9IGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgIGJlZ2luOiAvPDw8WyBcXHRdKicoXFx3KyknXFxuLyxcbiAgICBlbmQ6IC9bIFxcdF0qKFxcdyspXFxiLyxcbiAgfSk7XG4gIC8vIGxpc3Qgb2YgdmFsaWQgd2hpdGVzcGFjZXMgYmVjYXVzZSBub24tYnJlYWtpbmcgc3BhY2UgbWlnaHQgYmUgcGFydCBvZiBhIElERU5UX1JFXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAnWyBcXHRcXG5dJztcbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIHNjb3BlOiAnc3RyaW5nJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgRE9VQkxFX1FVT1RFRCxcbiAgICAgIFNJTkdMRV9RVU9URUQsXG4gICAgICBIRVJFRE9DLFxuICAgICAgTk9XRE9DXG4gICAgXVxuICB9O1xuICBjb25zdCBOVU1CRVIgPSB7XG4gICAgc2NvcGU6ICdudW1iZXInLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7IGJlZ2luOiBgXFxcXGIwW2JCXVswMV0rKD86X1swMV0rKSpcXFxcYmAgfSwgLy8gQmluYXJ5IHcvIHVuZGVyc2NvcmUgc3VwcG9ydFxuICAgICAgeyBiZWdpbjogYFxcXFxiMFtvT11bMC03XSsoPzpfWzAtN10rKSpcXFxcYmAgfSwgLy8gT2N0YWxzIHcvIHVuZGVyc2NvcmUgc3VwcG9ydFxuICAgICAgeyBiZWdpbjogYFxcXFxiMFt4WF1bXFxcXGRhLWZBLUZdKyg/Ol9bXFxcXGRhLWZBLUZdKykqXFxcXGJgIH0sIC8vIEhleCB3LyB1bmRlcnNjb3JlIHN1cHBvcnRcbiAgICAgIC8vIERlY2ltYWxzIHcvIHVuZGVyc2NvcmUgc3VwcG9ydCwgd2l0aCBvcHRpb25hbCBmcmFnbWVudHMgYW5kIHNjaWVudGlmaWMgZXhwb25lbnQgKGUpIHN1ZmZpeC5cbiAgICAgIHsgYmVnaW46IGAoPzpcXFxcYlxcXFxkKyg/Ol9cXFxcZCspKihcXFxcLig/OlxcXFxkKyg/Ol9cXFxcZCspKikpP3xcXFxcQlxcXFwuXFxcXGQrKSg/OltlRV1bKy1dP1xcXFxkKyk/YCB9XG4gICAgXSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgTElURVJBTFMgPSBbXG4gICAgXCJmYWxzZVwiLFxuICAgIFwibnVsbFwiLFxuICAgIFwidHJ1ZVwiXG4gIF07XG4gIGNvbnN0IEtXUyA9IFtcbiAgICAvLyBNYWdpYyBjb25zdGFudHM6XG4gICAgLy8gPGh0dHBzOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL2xhbmd1YWdlLmNvbnN0YW50cy5wcmVkZWZpbmVkLnBocD5cbiAgICBcIl9fQ0xBU1NfX1wiLFxuICAgIFwiX19ESVJfX1wiLFxuICAgIFwiX19GSUxFX19cIixcbiAgICBcIl9fRlVOQ1RJT05fX1wiLFxuICAgIFwiX19DT01QSUxFUl9IQUxUX09GRlNFVF9fXCIsXG4gICAgXCJfX0xJTkVfX1wiLFxuICAgIFwiX19NRVRIT0RfX1wiLFxuICAgIFwiX19OQU1FU1BBQ0VfX1wiLFxuICAgIFwiX19UUkFJVF9fXCIsXG4gICAgLy8gRnVuY3Rpb24gdGhhdCBsb29rIGxpa2UgbGFuZ3VhZ2UgY29uc3RydWN0IG9yIGxhbmd1YWdlIGNvbnN0cnVjdCB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbjpcbiAgICAvLyBMaXN0IG9mIGtleXdvcmRzIHRoYXQgbWF5IG5vdCByZXF1aXJlIHBhcmVudGhlc2lzXG4gICAgXCJkaWVcIixcbiAgICBcImVjaG9cIixcbiAgICBcImV4aXRcIixcbiAgICBcImluY2x1ZGVcIixcbiAgICBcImluY2x1ZGVfb25jZVwiLFxuICAgIFwicHJpbnRcIixcbiAgICBcInJlcXVpcmVcIixcbiAgICBcInJlcXVpcmVfb25jZVwiLFxuICAgIC8vIFRoZXNlIGFyZSBub3QgbGFuZ3VhZ2UgY29uc3RydWN0IChmdW5jdGlvbikgYnV0IG9wZXJhdGUgb24gdGhlIGN1cnJlbnRseS1leGVjdXRpbmcgZnVuY3Rpb24gYW5kIGNhbiBhY2Nlc3MgdGhlIGN1cnJlbnQgc3ltYm9sIHRhYmxlXG4gICAgLy8gJ2NvbXBhY3QgZXh0cmFjdCBmdW5jX2dldF9hcmcgZnVuY19nZXRfYXJncyBmdW5jX251bV9hcmdzIGdldF9jYWxsZWRfY2xhc3MgZ2V0X3BhcmVudF9jbGFzcyAnICtcbiAgICAvLyBPdGhlciBrZXl3b3JkczpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQucGhwPlxuICAgIC8vIDxodHRwczovL3d3dy5waHAubmV0L21hbnVhbC9lbi9sYW5ndWFnZS50eXBlcy50eXBlLWp1Z2dsaW5nLnBocD5cbiAgICBcImFycmF5XCIsXG4gICAgXCJhYnN0cmFjdFwiLFxuICAgIFwiYW5kXCIsXG4gICAgXCJhc1wiLFxuICAgIFwiYmluYXJ5XCIsXG4gICAgXCJib29sXCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJicmVha1wiLFxuICAgIFwiY2FsbGFibGVcIixcbiAgICBcImNhc2VcIixcbiAgICBcImNhdGNoXCIsXG4gICAgXCJjbGFzc1wiLFxuICAgIFwiY2xvbmVcIixcbiAgICBcImNvbnN0XCIsXG4gICAgXCJjb250aW51ZVwiLFxuICAgIFwiZGVjbGFyZVwiLFxuICAgIFwiZGVmYXVsdFwiLFxuICAgIFwiZG9cIixcbiAgICBcImRvdWJsZVwiLFxuICAgIFwiZWxzZVwiLFxuICAgIFwiZWxzZWlmXCIsXG4gICAgXCJlbXB0eVwiLFxuICAgIFwiZW5kZGVjbGFyZVwiLFxuICAgIFwiZW5kZm9yXCIsXG4gICAgXCJlbmRmb3JlYWNoXCIsXG4gICAgXCJlbmRpZlwiLFxuICAgIFwiZW5kc3dpdGNoXCIsXG4gICAgXCJlbmR3aGlsZVwiLFxuICAgIFwiZW51bVwiLFxuICAgIFwiZXZhbFwiLFxuICAgIFwiZXh0ZW5kc1wiLFxuICAgIFwiZmluYWxcIixcbiAgICBcImZpbmFsbHlcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJmb3JcIixcbiAgICBcImZvcmVhY2hcIixcbiAgICBcImZyb21cIixcbiAgICBcImdsb2JhbFwiLFxuICAgIFwiZ290b1wiLFxuICAgIFwiaWZcIixcbiAgICBcImltcGxlbWVudHNcIixcbiAgICBcImluc3RhbmNlb2ZcIixcbiAgICBcImluc3RlYWRvZlwiLFxuICAgIFwiaW50XCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJpbnRlcmZhY2VcIixcbiAgICBcImlzc2V0XCIsXG4gICAgXCJpdGVyYWJsZVwiLFxuICAgIFwibGlzdFwiLFxuICAgIFwibWF0Y2h8MFwiLFxuICAgIFwibWl4ZWRcIixcbiAgICBcIm5ld1wiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwib3JcIixcbiAgICBcInByaXZhdGVcIixcbiAgICBcInByb3RlY3RlZFwiLFxuICAgIFwicHVibGljXCIsXG4gICAgXCJyZWFkb25seVwiLFxuICAgIFwicmVhbFwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzdHJpbmdcIixcbiAgICBcInN3aXRjaFwiLFxuICAgIFwidGhyb3dcIixcbiAgICBcInRyYWl0XCIsXG4gICAgXCJ0cnlcIixcbiAgICBcInVuc2V0XCIsXG4gICAgXCJ1c2VcIixcbiAgICBcInZhclwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwid2hpbGVcIixcbiAgICBcInhvclwiLFxuICAgIFwieWllbGRcIlxuICBdO1xuXG4gIGNvbnN0IEJVSUxUX0lOUyA9IFtcbiAgICAvLyBTdGFuZGFyZCBQSFAgbGlicmFyeTpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vYm9vay5zcGwucGhwPlxuICAgIFwiRXJyb3J8MFwiLFxuICAgIFwiQXBwZW5kSXRlcmF0b3JcIixcbiAgICBcIkFyZ3VtZW50Q291bnRFcnJvclwiLFxuICAgIFwiQXJpdGhtZXRpY0Vycm9yXCIsXG4gICAgXCJBcnJheUl0ZXJhdG9yXCIsXG4gICAgXCJBcnJheU9iamVjdFwiLFxuICAgIFwiQXNzZXJ0aW9uRXJyb3JcIixcbiAgICBcIkJhZEZ1bmN0aW9uQ2FsbEV4Y2VwdGlvblwiLFxuICAgIFwiQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvblwiLFxuICAgIFwiQ2FjaGluZ0l0ZXJhdG9yXCIsXG4gICAgXCJDYWxsYmFja0ZpbHRlckl0ZXJhdG9yXCIsXG4gICAgXCJDb21waWxlRXJyb3JcIixcbiAgICBcIkNvdW50YWJsZVwiLFxuICAgIFwiRGlyZWN0b3J5SXRlcmF0b3JcIixcbiAgICBcIkRpdmlzaW9uQnlaZXJvRXJyb3JcIixcbiAgICBcIkRvbWFpbkV4Y2VwdGlvblwiLFxuICAgIFwiRW1wdHlJdGVyYXRvclwiLFxuICAgIFwiRXJyb3JFeGNlcHRpb25cIixcbiAgICBcIkV4Y2VwdGlvblwiLFxuICAgIFwiRmlsZXN5c3RlbUl0ZXJhdG9yXCIsXG4gICAgXCJGaWx0ZXJJdGVyYXRvclwiLFxuICAgIFwiR2xvYkl0ZXJhdG9yXCIsXG4gICAgXCJJbmZpbml0ZUl0ZXJhdG9yXCIsXG4gICAgXCJJbnZhbGlkQXJndW1lbnRFeGNlcHRpb25cIixcbiAgICBcIkl0ZXJhdG9ySXRlcmF0b3JcIixcbiAgICBcIkxlbmd0aEV4Y2VwdGlvblwiLFxuICAgIFwiTGltaXRJdGVyYXRvclwiLFxuICAgIFwiTG9naWNFeGNlcHRpb25cIixcbiAgICBcIk11bHRpcGxlSXRlcmF0b3JcIixcbiAgICBcIk5vUmV3aW5kSXRlcmF0b3JcIixcbiAgICBcIk91dE9mQm91bmRzRXhjZXB0aW9uXCIsXG4gICAgXCJPdXRPZlJhbmdlRXhjZXB0aW9uXCIsXG4gICAgXCJPdXRlckl0ZXJhdG9yXCIsXG4gICAgXCJPdmVyZmxvd0V4Y2VwdGlvblwiLFxuICAgIFwiUGFyZW50SXRlcmF0b3JcIixcbiAgICBcIlBhcnNlRXJyb3JcIixcbiAgICBcIlJhbmdlRXhjZXB0aW9uXCIsXG4gICAgXCJSZWN1cnNpdmVBcnJheUl0ZXJhdG9yXCIsXG4gICAgXCJSZWN1cnNpdmVDYWNoaW5nSXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZUNhbGxiYWNrRmlsdGVySXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yXCIsXG4gICAgXCJSZWN1cnNpdmVGaWx0ZXJJdGVyYXRvclwiLFxuICAgIFwiUmVjdXJzaXZlSXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZVJlZ2V4SXRlcmF0b3JcIixcbiAgICBcIlJlY3Vyc2l2ZVRyZWVJdGVyYXRvclwiLFxuICAgIFwiUmVnZXhJdGVyYXRvclwiLFxuICAgIFwiUnVudGltZUV4Y2VwdGlvblwiLFxuICAgIFwiU2Vla2FibGVJdGVyYXRvclwiLFxuICAgIFwiU3BsRG91Ymx5TGlua2VkTGlzdFwiLFxuICAgIFwiU3BsRmlsZUluZm9cIixcbiAgICBcIlNwbEZpbGVPYmplY3RcIixcbiAgICBcIlNwbEZpeGVkQXJyYXlcIixcbiAgICBcIlNwbEhlYXBcIixcbiAgICBcIlNwbE1heEhlYXBcIixcbiAgICBcIlNwbE1pbkhlYXBcIixcbiAgICBcIlNwbE9iamVjdFN0b3JhZ2VcIixcbiAgICBcIlNwbE9ic2VydmVyXCIsXG4gICAgXCJTcGxQcmlvcml0eVF1ZXVlXCIsXG4gICAgXCJTcGxRdWV1ZVwiLFxuICAgIFwiU3BsU3RhY2tcIixcbiAgICBcIlNwbFN1YmplY3RcIixcbiAgICBcIlNwbFRlbXBGaWxlT2JqZWN0XCIsXG4gICAgXCJUeXBlRXJyb3JcIixcbiAgICBcIlVuZGVyZmxvd0V4Y2VwdGlvblwiLFxuICAgIFwiVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uXCIsXG4gICAgXCJVbmhhbmRsZWRNYXRjaEVycm9yXCIsXG4gICAgLy8gUmVzZXJ2ZWQgaW50ZXJmYWNlczpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQuaW50ZXJmYWNlcy5waHA+XG4gICAgXCJBcnJheUFjY2Vzc1wiLFxuICAgIFwiQmFja2VkRW51bVwiLFxuICAgIFwiQ2xvc3VyZVwiLFxuICAgIFwiRmliZXJcIixcbiAgICBcIkdlbmVyYXRvclwiLFxuICAgIFwiSXRlcmF0b3JcIixcbiAgICBcIkl0ZXJhdG9yQWdncmVnYXRlXCIsXG4gICAgXCJTZXJpYWxpemFibGVcIixcbiAgICBcIlN0cmluZ2FibGVcIixcbiAgICBcIlRocm93YWJsZVwiLFxuICAgIFwiVHJhdmVyc2FibGVcIixcbiAgICBcIlVuaXRFbnVtXCIsXG4gICAgXCJXZWFrUmVmZXJlbmNlXCIsXG4gICAgXCJXZWFrTWFwXCIsXG4gICAgLy8gUmVzZXJ2ZWQgY2xhc3NlczpcbiAgICAvLyA8aHR0cHM6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVzZXJ2ZWQuY2xhc3Nlcy5waHA+XG4gICAgXCJEaXJlY3RvcnlcIixcbiAgICBcIl9fUEhQX0luY29tcGxldGVfQ2xhc3NcIixcbiAgICBcInBhcmVudFwiLFxuICAgIFwicGhwX3VzZXJfZmlsdGVyXCIsXG4gICAgXCJzZWxmXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICBcInN0ZENsYXNzXCJcbiAgXTtcblxuICAvKiogRHVhbC1jYXNlIGtleXdvcmRzXG4gICAqXG4gICAqIFtcInRoZW5cIixcIkZJTEVcIl0gPT5cbiAgICogICAgIFtcInRoZW5cIiwgXCJUSEVOXCIsIFwiRklMRVwiLCBcImZpbGVcIl1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gaXRlbXMgKi9cbiAgY29uc3QgZHVhbENhc2UgPSAoaXRlbXMpID0+IHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgICBpZiAoaXRlbS50b0xvd2VyQ2FzZSgpID09PSBpdGVtKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0udG9VcHBlckNhc2UoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQucHVzaChpdGVtLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAga2V5d29yZDogS1dTLFxuICAgIGxpdGVyYWw6IGR1YWxDYXNlKExJVEVSQUxTKSxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TLFxuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBpdGVtcyAqL1xuICBjb25zdCBub3JtYWxpemVLZXl3b3JkcyA9IChpdGVtcykgPT4ge1xuICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gaXRlbS5yZXBsYWNlKC9cXHxcXGQrJC8sIFwiXCIpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IENPTlNUUlVDVE9SX0NBTEwgPSB7IHZhcmlhbnRzOiBbXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgL25ldy8sXG4gICAgICAgIHJlZ2V4LmNvbmNhdChXSElURVNQQUNFLCBcIitcIiksXG4gICAgICAgIC8vIHRvIHByZXZlbnQgYnVpbHQgaW5zIGZyb20gYmVpbmcgY29uZnVzZWQgYXMgdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGNhbGxcbiAgICAgICAgcmVnZXguY29uY2F0KFwiKD8hXCIsIG5vcm1hbGl6ZUtleXdvcmRzKEJVSUxUX0lOUykuam9pbihcIlxcXFxifFwiKSwgXCJcXFxcYilcIiksXG4gICAgICAgIFBBU0NBTF9DQVNFX0NMQVNTX05BTUVfUkUsXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHtcbiAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgIDQ6IFwidGl0bGUuY2xhc3NcIixcbiAgICAgIH0sXG4gICAgfVxuICBdIH07XG5cbiAgY29uc3QgQ09OU1RBTlRfUkVGRVJFTkNFID0gcmVnZXguY29uY2F0KElERU5UX1JFLCBcIlxcXFxiKD8hXFxcXCgpXCIpO1xuXG4gIGNvbnN0IExFRlRfQU5EX1JJR0hUX1NJREVfT0ZfRE9VQkxFX0NPTE9OID0geyB2YXJpYW50czogW1xuICAgIHtcbiAgICAgIG1hdGNoOiBbXG4gICAgICAgIHJlZ2V4LmNvbmNhdChcbiAgICAgICAgICAvOjovLFxuICAgICAgICAgIHJlZ2V4Lmxvb2thaGVhZCgvKD8hY2xhc3NcXGIpLylcbiAgICAgICAgKSxcbiAgICAgICAgQ09OU1RBTlRfUkVGRVJFTkNFLFxuICAgICAgXSxcbiAgICAgIHNjb3BlOiB7IDI6IFwidmFyaWFibGUuY29uc3RhbnRcIiwgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1hdGNoOiBbXG4gICAgICAgIC86Oi8sXG4gICAgICAgIC9jbGFzcy8sXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHsgMjogXCJ2YXJpYWJsZS5sYW5ndWFnZVwiLCB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSxcbiAgICAgICAgcmVnZXguY29uY2F0KFxuICAgICAgICAgIC86Oi8sXG4gICAgICAgICAgcmVnZXgubG9va2FoZWFkKC8oPyFjbGFzc1xcYikvKVxuICAgICAgICApLFxuICAgICAgICBDT05TVEFOVF9SRUZFUkVOQ0UsXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHtcbiAgICAgICAgMTogXCJ0aXRsZS5jbGFzc1wiLFxuICAgICAgICAzOiBcInZhcmlhYmxlLmNvbnN0YW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSxcbiAgICAgICAgcmVnZXguY29uY2F0KFxuICAgICAgICAgIFwiOjpcIixcbiAgICAgICAgICByZWdleC5sb29rYWhlYWQoLyg/IWNsYXNzXFxiKS8pXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgc2NvcGU6IHsgMTogXCJ0aXRsZS5jbGFzc1wiLCB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbWF0Y2g6IFtcbiAgICAgICAgUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRSxcbiAgICAgICAgLzo6LyxcbiAgICAgICAgL2NsYXNzLyxcbiAgICAgIF0sXG4gICAgICBzY29wZToge1xuICAgICAgICAxOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICAgIDM6IFwidmFyaWFibGUubGFuZ3VhZ2VcIixcbiAgICAgIH0sXG4gICAgfVxuICBdIH07XG5cbiAgY29uc3QgTkFNRURfQVJHVU1FTlQgPSB7XG4gICAgc2NvcGU6ICdhdHRyJyxcbiAgICBtYXRjaDogcmVnZXguY29uY2F0KElERU5UX1JFLCByZWdleC5sb29rYWhlYWQoJzonKSwgcmVnZXgubG9va2FoZWFkKC8oPyE6OikvKSksXG4gIH07XG4gIGNvbnN0IFBBUkFNU19NT0RFID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIE5BTUVEX0FSR1VNRU5ULFxuICAgICAgVkFSSUFCTEUsXG4gICAgICBMRUZUX0FORF9SSUdIVF9TSURFX09GX0RPVUJMRV9DT0xPTixcbiAgICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgICBTVFJJTkcsXG4gICAgICBOVU1CRVIsXG4gICAgICBDT05TVFJVQ1RPUl9DQUxMLFxuICAgIF0sXG4gIH07XG4gIGNvbnN0IEZVTkNUSU9OX0lOVk9LRSA9IHtcbiAgICByZWxldmFuY2U6IDAsXG4gICAgbWF0Y2g6IFtcbiAgICAgIC9cXGIvLFxuICAgICAgLy8gdG8gcHJldmVudCBrZXl3b3JkcyBmcm9tIGJlaW5nIGNvbmZ1c2VkIGFzIHRoZSBmdW5jdGlvbiB0aXRsZVxuICAgICAgcmVnZXguY29uY2F0KFwiKD8hZm5cXFxcYnxmdW5jdGlvblxcXFxifFwiLCBub3JtYWxpemVLZXl3b3JkcyhLV1MpLmpvaW4oXCJcXFxcYnxcIiksIFwifFwiLCBub3JtYWxpemVLZXl3b3JkcyhCVUlMVF9JTlMpLmpvaW4oXCJcXFxcYnxcIiksIFwiXFxcXGIpXCIpLFxuICAgICAgSURFTlRfUkUsXG4gICAgICByZWdleC5jb25jYXQoV0hJVEVTUEFDRSwgXCIqXCIpLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC8oPz1cXCgpLylcbiAgICBdLFxuICAgIHNjb3BlOiB7IDM6IFwidGl0bGUuZnVuY3Rpb24uaW52b2tlXCIsIH0sXG4gICAgY29udGFpbnM6IFsgUEFSQU1TX01PREUgXVxuICB9O1xuICBQQVJBTVNfTU9ERS5jb250YWlucy5wdXNoKEZVTkNUSU9OX0lOVk9LRSk7XG5cbiAgY29uc3QgQVRUUklCVVRFX0NPTlRBSU5TID0gW1xuICAgIE5BTUVEX0FSR1VNRU5ULFxuICAgIExFRlRfQU5EX1JJR0hUX1NJREVfT0ZfRE9VQkxFX0NPTE9OLFxuICAgIGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgU1RSSU5HLFxuICAgIE5VTUJFUixcbiAgICBDT05TVFJVQ1RPUl9DQUxMLFxuICBdO1xuXG4gIGNvbnN0IEFUVFJJQlVURVMgPSB7XG4gICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvI1xcW1xccyovLCBQQVNDQUxfQ0FTRV9DTEFTU19OQU1FX1JFKSxcbiAgICBiZWdpblNjb3BlOiBcIm1ldGFcIixcbiAgICBlbmQ6IC9dLyxcbiAgICBlbmRTY29wZTogXCJtZXRhXCIsXG4gICAga2V5d29yZHM6IHtcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgICAga2V5d29yZDogW1xuICAgICAgICAnbmV3JyxcbiAgICAgICAgJ2FycmF5JyxcbiAgICAgIF1cbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvXFxbLyxcbiAgICAgICAgZW5kOiAvXS8sXG4gICAgICAgIGtleXdvcmRzOiB7XG4gICAgICAgICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgICAgICAga2V5d29yZDogW1xuICAgICAgICAgICAgJ25ldycsXG4gICAgICAgICAgICAnYXJyYXknLFxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgLi4uQVRUUklCVVRFX0NPTlRBSU5TLFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLi4uQVRUUklCVVRFX0NPTlRBSU5TLFxuICAgICAge1xuICAgICAgICBzY29wZTogJ21ldGEnLFxuICAgICAgICBtYXRjaDogUEFTQ0FMX0NBU0VfQ0xBU1NfTkFNRV9SRVxuICAgICAgfVxuICAgIF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNhc2VfaW5zZW5zaXRpdmU6IGZhbHNlLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBjb250YWluczogW1xuICAgICAgQVRUUklCVVRFUyxcbiAgICAgIGhsanMuSEFTSF9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNPTU1FTlQoJy8vJywgJyQnKSxcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgJy9cXFxcKicsXG4gICAgICAgICdcXFxcKi8nLFxuICAgICAgICB7IGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6ICdkb2N0YWcnLFxuICAgICAgICAgICAgbWF0Y2g6ICdAW0EtWmEtel0rJ1xuICAgICAgICAgIH1cbiAgICAgICAgXSB9XG4gICAgICApLFxuICAgICAge1xuICAgICAgICBtYXRjaDogL19faGFsdF9jb21waWxlclxcKFxcKTsvLFxuICAgICAgICBrZXl3b3JkczogJ19faGFsdF9jb21waWxlcicsXG4gICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgIHNjb3BlOiBcImNvbW1lbnRcIixcbiAgICAgICAgICBlbmQ6IGhsanMuTUFUQ0hfTk9USElOR19SRSxcbiAgICAgICAgICBjb250YWluczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtYXRjaDogL1xcPz4vLFxuICAgICAgICAgICAgICBzY29wZTogXCJtZXRhXCIsXG4gICAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBQUkVQUk9DRVNTT1IsXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAndmFyaWFibGUubGFuZ3VhZ2UnLFxuICAgICAgICBtYXRjaDogL1xcJHRoaXNcXGIvXG4gICAgICB9LFxuICAgICAgVkFSSUFCTEUsXG4gICAgICBGVU5DVElPTl9JTlZPS0UsXG4gICAgICBMRUZUX0FORF9SSUdIVF9TSURFX09GX0RPVUJMRV9DT0xPTixcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY29uc3QvLFxuICAgICAgICAgIC9cXHMvLFxuICAgICAgICAgIElERU5UX1JFLFxuICAgICAgICBdLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidmFyaWFibGUuY29uc3RhbnRcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBDT05TVFJVQ1RPUl9DQUxMLFxuICAgICAge1xuICAgICAgICBzY29wZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBiZWdpbktleXdvcmRzOiAnZm4gZnVuY3Rpb24nLFxuICAgICAgICBlbmQ6IC9bO3tdLyxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgaWxsZWdhbDogJ1skJVxcXFxbXScsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgeyBiZWdpbktleXdvcmRzOiAndXNlJywgfSxcbiAgICAgICAgICBobGpzLlVOREVSU0NPUkVfVElUTEVfTU9ERSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogJz0+JywgLy8gTm8gbWFya3VwLCBqdXN0IGEgcmVsZXZhbmNlIGJvb3N0ZXJcbiAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjb3BlOiAncGFyYW1zJyxcbiAgICAgICAgICAgIGJlZ2luOiAnXFxcXCgnLFxuICAgICAgICAgICAgZW5kOiAnXFxcXCknLFxuICAgICAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgICdzZWxmJyxcbiAgICAgICAgICAgICAgVkFSSUFCTEUsXG4gICAgICAgICAgICAgIExFRlRfQU5EX1JJR0hUX1NJREVfT0ZfRE9VQkxFX0NPTE9OLFxuICAgICAgICAgICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAgICAgICAgICBTVFJJTkcsXG4gICAgICAgICAgICAgIE5VTUJFUlxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAnY2xhc3MnLFxuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luS2V5d29yZHM6IFwiZW51bVwiLFxuICAgICAgICAgICAgaWxsZWdhbDogL1soJFwiXS9cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luS2V5d29yZHM6IFwiY2xhc3MgaW50ZXJmYWNlIHRyYWl0XCIsXG4gICAgICAgICAgICBpbGxlZ2FsOiAvWzooJFwiXS9cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgZW5kOiAvXFx7LyxcbiAgICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICB7IGJlZ2luS2V5d29yZHM6ICdleHRlbmRzIGltcGxlbWVudHMnIH0sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX1RJVExFX01PREVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIC8vIGJvdGggdXNlIGFuZCBuYW1lc3BhY2Ugc3RpbGwgdXNlIFwib2xkIHN0eWxlXCIgcnVsZXMgKHZzIG11bHRpLW1hdGNoKVxuICAgICAgLy8gYmVjYXVzZSB0aGUgbmFtZXNwYWNlIG5hbWUgY2FuIGluY2x1ZGUgYFxcYCBhbmQgd2Ugc3RpbGwgd2FudCBlYWNoXG4gICAgICAvLyBlbGVtZW50IHRvIGJlIHRyZWF0ZWQgYXMgaXRzIG93biAqaW5kaXZpZHVhbCogdGl0bGVcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ25hbWVzcGFjZScsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgZW5kOiAnOycsXG4gICAgICAgIGlsbGVnYWw6IC9bLiddLyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5pbmhlcml0KGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFLCB7IHNjb3BlOiBcInRpdGxlLmNsYXNzXCIgfSkgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ3VzZScsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgZW5kOiAnOycsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgLy8gVE9ETzogdGl0bGUuZnVuY3Rpb24gdnMgdGl0bGUuY2xhc3NcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXRjaDogL1xcYihhc3xjb25zdHxmdW5jdGlvbilcXGIvLFxuICAgICAgICAgICAgc2NvcGU6IFwia2V5d29yZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBUT0RPOiBjb3VsZCBiZSB0aXRsZS5jbGFzcyBvciB0aXRsZS5mdW5jdGlvblxuICAgICAgICAgIGhsanMuVU5ERVJTQ09SRV9USVRMRV9NT0RFXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBTVFJJTkcsXG4gICAgICBOVU1CRVIsXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBwaHAgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogUEhQIFRlbXBsYXRlXG5SZXF1aXJlczogeG1sLmpzLCBwaHAuanNcbkF1dGhvcjogSm9zaCBHb2ViZWwgPGhlbGxvQGpvc2hnb2ViZWwuY29tPlxuV2Vic2l0ZTogaHR0cHM6Ly93d3cucGhwLm5ldFxuQ2F0ZWdvcnk6IGNvbW1vblxuKi9cblxuZnVuY3Rpb24gcGhwVGVtcGxhdGUoaGxqcykge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IFwiUEhQIHRlbXBsYXRlXCIsXG4gICAgc3ViTGFuZ3VhZ2U6ICd4bWwnLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPFxcPyhwaHB8PSk/LyxcbiAgICAgICAgZW5kOiAvXFw/Pi8sXG4gICAgICAgIHN1Ykxhbmd1YWdlOiAncGhwJyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRoZSBwaHAgY2xvc2luZyB0YWcgPz4gdG8gY2xvc2UgdGhlIFBIUCBibG9jayB3aGVuXG4gICAgICAgICAgLy8gaW5zaWRlIGFueSBvZiB0aGUgZm9sbG93aW5nIGJsb2NrczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogJy9cXFxcKicsXG4gICAgICAgICAgICBlbmQ6ICdcXFxcKi8nLFxuICAgICAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46ICdiXCInLFxuICAgICAgICAgICAgZW5kOiAnXCInLFxuICAgICAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46ICdiXFwnJyxcbiAgICAgICAgICAgIGVuZDogJ1xcJycsXG4gICAgICAgICAgICBza2lwOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBobGpzLmluaGVyaXQoaGxqcy5BUE9TX1NUUklOR19NT0RFLCB7XG4gICAgICAgICAgICBpbGxlZ2FsOiBudWxsLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBudWxsLFxuICAgICAgICAgICAgY29udGFpbnM6IG51bGwsXG4gICAgICAgICAgICBza2lwOiB0cnVlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHtcbiAgICAgICAgICAgIGlsbGVnYWw6IG51bGwsXG4gICAgICAgICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgICAgICAgICBjb250YWluczogbnVsbCxcbiAgICAgICAgICAgIHNraXA6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBwaHBUZW1wbGF0ZSBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBQbGFpbiB0ZXh0XG5BdXRob3I6IEVnb3IgUm9nb3YgKGUucm9nb3ZAcG9zdGdyZXNwcm8ucnUpXG5EZXNjcmlwdGlvbjogUGxhaW4gdGV4dCB3aXRob3V0IGFueSBoaWdobGlnaHRpbmcuXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG5mdW5jdGlvbiBwbGFpbnRleHQoaGxqcykge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdQbGFpbiB0ZXh0JyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAndGV4dCcsXG4gICAgICAndHh0J1xuICAgIF0sXG4gICAgZGlzYWJsZUF1dG9kZXRlY3Q6IHRydWVcbiAgfTtcbn1cblxuZXhwb3J0IHsgcGxhaW50ZXh0IGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFB5dGhvblxuRGVzY3JpcHRpb246IFB5dGhvbiBpcyBhbiBpbnRlcnByZXRlZCwgb2JqZWN0LW9yaWVudGVkLCBoaWdoLWxldmVsIHByb2dyYW1taW5nIGxhbmd1YWdlIHdpdGggZHluYW1pYyBzZW1hbnRpY3MuXG5XZWJzaXRlOiBodHRwczovL3d3dy5weXRob24ub3JnXG5DYXRlZ29yeTogY29tbW9uXG4qL1xuXG5mdW5jdGlvbiBweXRob24oaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIGNvbnN0IElERU5UX1JFID0gL1tcXHB7WElEX1N0YXJ0fV9dXFxwe1hJRF9Db250aW51ZX0qL3U7XG4gIGNvbnN0IFJFU0VSVkVEX1dPUkRTID0gW1xuICAgICdhbmQnLFxuICAgICdhcycsXG4gICAgJ2Fzc2VydCcsXG4gICAgJ2FzeW5jJyxcbiAgICAnYXdhaXQnLFxuICAgICdicmVhaycsXG4gICAgJ2Nhc2UnLFxuICAgICdjbGFzcycsXG4gICAgJ2NvbnRpbnVlJyxcbiAgICAnZGVmJyxcbiAgICAnZGVsJyxcbiAgICAnZWxpZicsXG4gICAgJ2Vsc2UnLFxuICAgICdleGNlcHQnLFxuICAgICdmaW5hbGx5JyxcbiAgICAnZm9yJyxcbiAgICAnZnJvbScsXG4gICAgJ2dsb2JhbCcsXG4gICAgJ2lmJyxcbiAgICAnaW1wb3J0JyxcbiAgICAnaW4nLFxuICAgICdpcycsXG4gICAgJ2xhbWJkYScsXG4gICAgJ21hdGNoJyxcbiAgICAnbm9ubG9jYWx8MTAnLFxuICAgICdub3QnLFxuICAgICdvcicsXG4gICAgJ3Bhc3MnLFxuICAgICdyYWlzZScsXG4gICAgJ3JldHVybicsXG4gICAgJ3RyeScsXG4gICAgJ3doaWxlJyxcbiAgICAnd2l0aCcsXG4gICAgJ3lpZWxkJ1xuICBdO1xuXG4gIGNvbnN0IEJVSUxUX0lOUyA9IFtcbiAgICAnX19pbXBvcnRfXycsXG4gICAgJ2FicycsXG4gICAgJ2FsbCcsXG4gICAgJ2FueScsXG4gICAgJ2FzY2lpJyxcbiAgICAnYmluJyxcbiAgICAnYm9vbCcsXG4gICAgJ2JyZWFrcG9pbnQnLFxuICAgICdieXRlYXJyYXknLFxuICAgICdieXRlcycsXG4gICAgJ2NhbGxhYmxlJyxcbiAgICAnY2hyJyxcbiAgICAnY2xhc3NtZXRob2QnLFxuICAgICdjb21waWxlJyxcbiAgICAnY29tcGxleCcsXG4gICAgJ2RlbGF0dHInLFxuICAgICdkaWN0JyxcbiAgICAnZGlyJyxcbiAgICAnZGl2bW9kJyxcbiAgICAnZW51bWVyYXRlJyxcbiAgICAnZXZhbCcsXG4gICAgJ2V4ZWMnLFxuICAgICdmaWx0ZXInLFxuICAgICdmbG9hdCcsXG4gICAgJ2Zvcm1hdCcsXG4gICAgJ2Zyb3plbnNldCcsXG4gICAgJ2dldGF0dHInLFxuICAgICdnbG9iYWxzJyxcbiAgICAnaGFzYXR0cicsXG4gICAgJ2hhc2gnLFxuICAgICdoZWxwJyxcbiAgICAnaGV4JyxcbiAgICAnaWQnLFxuICAgICdpbnB1dCcsXG4gICAgJ2ludCcsXG4gICAgJ2lzaW5zdGFuY2UnLFxuICAgICdpc3N1YmNsYXNzJyxcbiAgICAnaXRlcicsXG4gICAgJ2xlbicsXG4gICAgJ2xpc3QnLFxuICAgICdsb2NhbHMnLFxuICAgICdtYXAnLFxuICAgICdtYXgnLFxuICAgICdtZW1vcnl2aWV3JyxcbiAgICAnbWluJyxcbiAgICAnbmV4dCcsXG4gICAgJ29iamVjdCcsXG4gICAgJ29jdCcsXG4gICAgJ29wZW4nLFxuICAgICdvcmQnLFxuICAgICdwb3cnLFxuICAgICdwcmludCcsXG4gICAgJ3Byb3BlcnR5JyxcbiAgICAncmFuZ2UnLFxuICAgICdyZXByJyxcbiAgICAncmV2ZXJzZWQnLFxuICAgICdyb3VuZCcsXG4gICAgJ3NldCcsXG4gICAgJ3NldGF0dHInLFxuICAgICdzbGljZScsXG4gICAgJ3NvcnRlZCcsXG4gICAgJ3N0YXRpY21ldGhvZCcsXG4gICAgJ3N0cicsXG4gICAgJ3N1bScsXG4gICAgJ3N1cGVyJyxcbiAgICAndHVwbGUnLFxuICAgICd0eXBlJyxcbiAgICAndmFycycsXG4gICAgJ3ppcCdcbiAgXTtcblxuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICAnX19kZWJ1Z19fJyxcbiAgICAnRWxsaXBzaXMnLFxuICAgICdGYWxzZScsXG4gICAgJ05vbmUnLFxuICAgICdOb3RJbXBsZW1lbnRlZCcsXG4gICAgJ1RydWUnXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3R5cGluZy5odG1sXG4gIC8vIFRPRE86IENvdWxkIHRoZXNlIGJlIHN1cHBsZW1lbnRlZCBieSBhIENhbWVsQ2FzZSBtYXRjaGVyIGluIGNlcnRhaW5cbiAgLy8gY29udGV4dHMsIGxlYXZpbmcgdGhlc2UgcmVtYWluaW5nIG9ubHkgZm9yIHJlbGV2YW5jZSBoaW50aW5nP1xuICBjb25zdCBUWVBFUyA9IFtcbiAgICBcIkFueVwiLFxuICAgIFwiQ2FsbGFibGVcIixcbiAgICBcIkNvcm91dGluZVwiLFxuICAgIFwiRGljdFwiLFxuICAgIFwiTGlzdFwiLFxuICAgIFwiTGl0ZXJhbFwiLFxuICAgIFwiR2VuZXJpY1wiLFxuICAgIFwiT3B0aW9uYWxcIixcbiAgICBcIlNlcXVlbmNlXCIsXG4gICAgXCJTZXRcIixcbiAgICBcIlR1cGxlXCIsXG4gICAgXCJUeXBlXCIsXG4gICAgXCJVbmlvblwiXG4gIF07XG5cbiAgY29uc3QgS0VZV09SRFMgPSB7XG4gICAgJHBhdHRlcm46IC9bQS1aYS16XVxcdyt8X19cXHcrX18vLFxuICAgIGtleXdvcmQ6IFJFU0VSVkVEX1dPUkRTLFxuICAgIGJ1aWx0X2luOiBCVUlMVF9JTlMsXG4gICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgdHlwZTogVFlQRVNcbiAgfTtcblxuICBjb25zdCBQUk9NUFQgPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgYmVnaW46IC9eKD4+PnxcXC5cXC5cXC4pIC9cbiAgfTtcblxuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46IC9cXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC8jL1xuICB9O1xuXG4gIGNvbnN0IExJVEVSQUxfQlJBQ0tFVCA9IHtcbiAgICBiZWdpbjogL1xce1xcey8sXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF0sXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW3VVXXxbYkJdfFtyUl18W2JCXVtyUl18W3JSXVtiQl0pPycnJy8sXG4gICAgICAgIGVuZDogLycnJy8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgIFBST01QVFxuICAgICAgICBdLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbdVVdfFtiQl18W3JSXXxbYkJdW3JSXXxbclJdW2JCXSk/XCJcIlwiLyxcbiAgICAgICAgZW5kOiAvXCJcIlwiLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgICAgUFJPTVBUXG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMTBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvKFtmRl1bclJdfFtyUl1bZkZdfFtmRl0pJycnLyxcbiAgICAgICAgZW5kOiAvJycnLyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgICAgUFJPTVBULFxuICAgICAgICAgIExJVEVSQUxfQlJBQ0tFVCxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbZkZdW3JSXXxbclJdW2ZGXXxbZkZdKVwiXCJcIi8sXG4gICAgICAgIGVuZDogL1wiXCJcIi8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgIFBST01QVCxcbiAgICAgICAgICBMSVRFUkFMX0JSQUNLRVQsXG4gICAgICAgICAgU1VCU1RcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW3VVXXxbclJdKScvLFxuICAgICAgICBlbmQ6IC8nLyxcbiAgICAgICAgcmVsZXZhbmNlOiAxMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW3VVXXxbclJdKVwiLyxcbiAgICAgICAgZW5kOiAvXCIvLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbYkJdfFtiQl1bclJdfFtyUl1bYkJdKScvLFxuICAgICAgICBlbmQ6IC8nL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW2JCXXxbYkJdW3JSXXxbclJdW2JCXSlcIi8sXG4gICAgICAgIGVuZDogL1wiL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8oW2ZGXVtyUl18W3JSXVtmRl18W2ZGXSknLyxcbiAgICAgICAgZW5kOiAvJy8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgIExJVEVSQUxfQlJBQ0tFVCxcbiAgICAgICAgICBTVUJTVFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyhbZkZdW3JSXXxbclJdW2ZGXXxbZkZdKVwiLyxcbiAgICAgICAgZW5kOiAvXCIvLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgICAgICBMSVRFUkFMX0JSQUNLRVQsXG4gICAgICAgICAgU1VCU1RcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREVcbiAgICBdXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjbnVtZXJpYy1saXRlcmFsc1xuICBjb25zdCBkaWdpdHBhcnQgPSAnWzAtOV0oXz9bMC05XSkqJztcbiAgY29uc3QgcG9pbnRmbG9hdCA9IGAoXFxcXGIoJHtkaWdpdHBhcnR9KSk/XFxcXC4oJHtkaWdpdHBhcnR9KXxcXFxcYigke2RpZ2l0cGFydH0pXFxcXC5gO1xuICAvLyBXaGl0ZXNwYWNlIGFmdGVyIGEgbnVtYmVyIChvciBhbnkgbGV4aWNhbCB0b2tlbikgaXMgbmVlZGVkIG9ubHkgaWYgaXRzIGFic2VuY2VcbiAgLy8gd291bGQgY2hhbmdlIHRoZSB0b2tlbml6YXRpb25cbiAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjd2hpdGVzcGFjZS1iZXR3ZWVuLXRva2Vuc1xuICAvLyBXZSBkZXZpYXRlIHNsaWdodGx5LCByZXF1aXJpbmcgYSB3b3JkIGJvdW5kYXJ5IG9yIGEga2V5d29yZFxuICAvLyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcmVjb2duaXppbmcgKnByZWZpeGVzKiAoZS5nLiwgYDBgIGluIGAweDQxYCBvciBgMDhgIG9yIGAwX18xYClcbiAgY29uc3QgbG9va2FoZWFkID0gYFxcXFxifCR7UkVTRVJWRURfV09SRFMuam9pbignfCcpfWA7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gZXhwb25lbnRmbG9hdCwgcG9pbnRmbG9hdFxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjZmxvYXRpbmctcG9pbnQtbGl0ZXJhbHNcbiAgICAgIC8vIG9wdGlvbmFsbHkgaW1hZ2luYXJ5XG4gICAgICAvLyBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjkvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMuaHRtbCNpbWFnaW5hcnktbGl0ZXJhbHNcbiAgICAgIC8vIE5vdGU6IG5vIGxlYWRpbmcgXFxiIGJlY2F1c2UgZmxvYXRzIGNhbiBzdGFydCB3aXRoIGEgZGVjaW1hbCBwb2ludFxuICAgICAgLy8gYW5kIHdlIGRvbid0IHdhbnQgdG8gbWlzaGFuZGxlIGUuZy4gYGZuKC41KWAsXG4gICAgICAvLyBubyB0cmFpbGluZyBcXGIgZm9yIHBvaW50ZmxvYXQgYmVjYXVzZSBpdCBjYW4gZW5kIHdpdGggYSBkZWNpbWFsIHBvaW50XG4gICAgICAvLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBtaXNoYW5kbGUgZS5nLiBgMC4uaGV4KClgOyB0aGlzIHNob3VsZCBiZSBzYWZlXG4gICAgICAvLyBiZWNhdXNlIGJvdGggTVVTVCBjb250YWluIGEgZGVjaW1hbCBwb2ludCBhbmQgc28gY2Fubm90IGJlIGNvbmZ1c2VkIHdpdGhcbiAgICAgIC8vIHRoZSBpbnRlcmlvciBwYXJ0IG9mIGFuIGlkZW50aWZpZXJcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IGAoXFxcXGIoJHtkaWdpdHBhcnR9KXwoJHtwb2ludGZsb2F0fSkpW2VFXVsrLV0/KCR7ZGlnaXRwYXJ0fSlbakpdPyg/PSR7bG9va2FoZWFkfSlgXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogYCgke3BvaW50ZmxvYXR9KVtqSl0/YFxuICAgICAgfSxcblxuICAgICAgLy8gZGVjaW50ZWdlciwgYmluaW50ZWdlciwgb2N0aW50ZWdlciwgaGV4aW50ZWdlclxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy45L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjaW50ZWdlci1saXRlcmFsc1xuICAgICAgLy8gb3B0aW9uYWxseSBcImxvbmdcIiBpbiBQeXRob24gMlxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi43L3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWwjaW50ZWdlci1hbmQtbG9uZy1pbnRlZ2VyLWxpdGVyYWxzXG4gICAgICAvLyBkZWNpbnRlZ2VyIGlzIG9wdGlvbmFsbHkgaW1hZ2luYXJ5XG4gICAgICAvLyBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjkvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMuaHRtbCNpbWFnaW5hcnktbGl0ZXJhbHNcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IGBcXFxcYihbMS05XShfP1swLTldKSp8MCsoXz8wKSopW2xMakpdPyg/PSR7bG9va2FoZWFkfSlgXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogYFxcXFxiMFtiQl0oXz9bMDFdKStbbExdPyg/PSR7bG9va2FoZWFkfSlgXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogYFxcXFxiMFtvT10oXz9bMC03XSkrW2xMXT8oPz0ke2xvb2thaGVhZH0pYFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IGBcXFxcYjBbeFhdKF8/WzAtOWEtZkEtRl0pK1tsTF0/KD89JHtsb29rYWhlYWR9KWBcbiAgICAgIH0sXG5cbiAgICAgIC8vIGltYWdudW1iZXIgKGRpZ2l0cGFydC1iYXNlZClcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMuOS9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5odG1sI2ltYWdpbmFyeS1saXRlcmFsc1xuICAgICAge1xuICAgICAgICBiZWdpbjogYFxcXFxiKCR7ZGlnaXRwYXJ0fSlbakpdKD89JHtsb29rYWhlYWR9KWBcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IENPTU1FTlRfVFlQRSA9IHtcbiAgICBjbGFzc05hbWU6IFwiY29tbWVudFwiLFxuICAgIGJlZ2luOiByZWdleC5sb29rYWhlYWQoLyMgdHlwZTovKSxcbiAgICBlbmQ6IC8kLyxcbiAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gcHJldmVudCBrZXl3b3JkcyBmcm9tIGNvbG9yaW5nIGB0eXBlYFxuICAgICAgICBiZWdpbjogLyMgdHlwZTovXG4gICAgICB9LFxuICAgICAgLy8gY29tbWVudCB3aXRoaW4gYSBkYXRhdHlwZSBjb21tZW50IGluY2x1ZGVzIG5vIGtleXdvcmRzXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvIy8sXG4gICAgICAgIGVuZDogL1xcYlxcQi8sXG4gICAgICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBQQVJBTVMgPSB7XG4gICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gRXhjbHVkZSBwYXJhbXMgaW4gZnVuY3Rpb25zIHdpdGhvdXQgcGFyYW1zXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJcIixcbiAgICAgICAgYmVnaW46IC9cXChcXHMqXFwpLyxcbiAgICAgICAgc2tpcDogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAgICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAnc2VsZicsXG4gICAgICAgICAgUFJPTVBULFxuICAgICAgICAgIE5VTUJFUixcbiAgICAgICAgICBTVFJJTkcsXG4gICAgICAgICAgaGxqcy5IQVNIX0NPTU1FTlRfTU9ERVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBTVUJTVC5jb250YWlucyA9IFtcbiAgICBTVFJJTkcsXG4gICAgTlVNQkVSLFxuICAgIFBST01QVFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1B5dGhvbicsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ3B5JyxcbiAgICAgICdneXAnLFxuICAgICAgJ2lweXRob24nXG4gICAgXSxcbiAgICB1bmljb2RlUmVnZXg6IHRydWUsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGlsbGVnYWw6IC8oPFxcL3xcXD8pfD0+LyxcbiAgICBjb250YWluczogW1xuICAgICAgUFJPTVBULFxuICAgICAgTlVNQkVSLFxuICAgICAge1xuICAgICAgICAvLyB2ZXJ5IGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAgIGJlZ2luOiAvXFxic2VsZlxcYi9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGVhdCBcImlmXCIgcHJpb3IgdG8gc3RyaW5nIHNvIHRoYXQgaXQgd29uJ3QgYWNjaWRlbnRhbGx5IGJlXG4gICAgICAgIC8vIGxhYmVsZWQgYXMgYW4gZi1zdHJpbmdcbiAgICAgICAgYmVnaW5LZXl3b3JkczogXCJpZlwiLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICBTVFJJTkcsXG4gICAgICBDT01NRU5UX1RZUEUsXG4gICAgICBobGpzLkhBU0hfQ09NTUVOVF9NT0RFLFxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9cXGJkZWYvLCAvXFxzKy8sXG4gICAgICAgICAgSURFTlRfUkUsXG4gICAgICAgIF0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbIFBBUkFNUyBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgICAgIC9cXGJjbGFzcy8sIC9cXHMrLyxcbiAgICAgICAgICAgICAgSURFTlRfUkUsIC9cXHMqLyxcbiAgICAgICAgICAgICAgL1xcKFxccyovLCBJREVOVF9SRSwvXFxzKlxcKS9cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICAvXFxiY2xhc3MvLCAvXFxzKy8sXG4gICAgICAgICAgICAgIElERU5UX1JFXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICAgICAgNjogXCJ0aXRsZS5jbGFzcy5pbmhlcml0ZWRcIixcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAvXltcXHQgXSpALyxcbiAgICAgICAgZW5kOiAvKD89Iyl8JC8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgTlVNQkVSLFxuICAgICAgICAgIFBBUkFNUyxcbiAgICAgICAgICBTVFJJTkdcbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgcHl0aG9uIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFB5dGhvbiBSRVBMXG5SZXF1aXJlczogcHl0aG9uLmpzXG5BdXRob3I6IEpvc2ggR29lYmVsIDxoZWxsb0Bqb3NoZ29lYmVsLmNvbT5cbkNhdGVnb3J5OiBjb21tb25cbiovXG5cbmZ1bmN0aW9uIHB5dGhvblJlcGwoaGxqcykge1xuICByZXR1cm4ge1xuICAgIGFsaWFzZXM6IFsgJ3B5Y29uJyBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEucHJvbXB0JyxcbiAgICAgICAgc3RhcnRzOiB7XG4gICAgICAgICAgLy8gYSBzcGFjZSBzZXBhcmF0ZXMgdGhlIFJFUEwgcHJlZml4IGZyb20gdGhlIGFjdHVhbCBjb2RlXG4gICAgICAgICAgLy8gdGhpcyBpcyBwdXJlbHkgZm9yIGNsZWFuZXIgSFRNTCBvdXRwdXRcbiAgICAgICAgICBlbmQ6IC8gfCQvLFxuICAgICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgICAgZW5kOiAnJCcsXG4gICAgICAgICAgICBzdWJMYW5ndWFnZTogJ3B5dGhvbidcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgeyBiZWdpbjogL14+Pj4oPz1bIF18JCkvIH0sXG4gICAgICAgICAgeyBiZWdpbjogL15cXC5cXC5cXC4oPz1bIF18JCkvIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgcHl0aG9uUmVwbCBhcyBkZWZhdWx0IH07XG4iLCAiLypcbkxhbmd1YWdlOiBSXG5EZXNjcmlwdGlvbjogUiBpcyBhIGZyZWUgc29mdHdhcmUgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZyBhbmQgZ3JhcGhpY3MuXG5BdXRob3I6IEpvZSBDaGVuZyA8am9lQHJzdHVkaW8ub3JnPlxuQ29udHJpYnV0b3JzOiBLb25yYWQgUnVkb2xwaCA8a29ucmFkLnJ1ZG9scGhAZ21haWwuY29tPlxuV2Vic2l0ZTogaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZ1xuQ2F0ZWdvcnk6IGNvbW1vbixzY2llbnRpZmljXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gcihobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLy8gSWRlbnRpZmllcnMgaW4gUiBjYW5ub3Qgc3RhcnQgd2l0aCBgX2AsIGJ1dCB0aGV5IGNhbiBzdGFydCB3aXRoIGAuYCBpZiBpdFxuICAvLyBpcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBkaWdpdC5cbiAgLy8gUiBhbHNvIHN1cHBvcnRzIHF1b3RlZCBpZGVudGlmaWVycywgd2hpY2ggYXJlIG5lYXItYXJiaXRyYXJ5IHNlcXVlbmNlc1xuICAvLyBkZWxpbWl0ZWQgYnkgYmFja3RpY2tzIChgXHUyMDI2YCksIHdoaWNoIG1heSBjb250YWluIGVzY2FwZSBzZXF1ZW5jZXMuIFRoZXNlIGFyZVxuICAvLyBoYW5kbGVkIGluIGEgc2VwYXJhdGUgbW9kZS4gU2VlIGB0ZXN0L21hcmt1cC9yL25hbWVzLnR4dGAgZm9yIGV4YW1wbGVzLlxuICAvLyBGSVhNRTogU3VwcG9ydCBVbmljb2RlIGlkZW50aWZpZXJzLlxuICBjb25zdCBJREVOVF9SRSA9IC8oPzooPzpbYS16QS1aXXxcXC5bLl9hLXpBLVpdKVsuX2EtekEtWjAtOV0qKXxcXC4oPyFcXGQpLztcbiAgY29uc3QgTlVNQkVSX1RZUEVTX1JFID0gcmVnZXguZWl0aGVyKFxuICAgIC8vIFNwZWNpYWwgY2FzZTogb25seSBoZXhhZGVjaW1hbCBiaW5hcnkgcG93ZXJzIGNhbiBjb250YWluIGZyYWN0aW9uc1xuICAgIC8wW3hYXVswLTlhLWZBLUZdK1xcLlswLTlhLWZBLUZdKltwUF1bKy1dP1xcZCtpPy8sXG4gICAgLy8gSGV4YWRlY2ltYWwgbnVtYmVycyB3aXRob3V0IGZyYWN0aW9uIGFuZCBvcHRpb25hbCBiaW5hcnkgcG93ZXJcbiAgICAvMFt4WF1bMC05YS1mQS1GXSsoPzpbcFBdWystXT9cXGQrKT9bTGldPy8sXG4gICAgLy8gRGVjaW1hbCBudW1iZXJzXG4gICAgLyg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpbZUVdWystXT9cXGQrKT9bTGldPy9cbiAgKTtcbiAgY29uc3QgT1BFUkFUT1JTX1JFID0gL1s9ITw+Ol09fFxcfFxcfHwmJnw6Ojo/fDwtfDw8LXwtPj58LT58XFx8PnxbLSsqXFwvPyEkJnw6PD0+QF5+XXxcXCpcXCovO1xuICBjb25zdCBQVU5DVFVBVElPTl9SRSA9IHJlZ2V4LmVpdGhlcihcbiAgICAvWygpXS8sXG4gICAgL1t7fV0vLFxuICAgIC9cXFtcXFsvLFxuICAgIC9bW1xcXV0vLFxuICAgIC9cXFxcLyxcbiAgICAvLC9cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSJyxcblxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogSURFTlRfUkUsXG4gICAgICBrZXl3b3JkOlxuICAgICAgICAnZnVuY3Rpb24gaWYgaW4gYnJlYWsgbmV4dCByZXBlYXQgZWxzZSBmb3Igd2hpbGUnLFxuICAgICAgbGl0ZXJhbDpcbiAgICAgICAgJ05VTEwgTkEgVFJVRSBGQUxTRSBJbmYgTmFOIE5BX2ludGVnZXJffDEwIE5BX3JlYWxffDEwICdcbiAgICAgICAgKyAnTkFfY2hhcmFjdGVyX3wxMCBOQV9jb21wbGV4X3wxMCcsXG4gICAgICBidWlsdF9pbjpcbiAgICAgICAgLy8gQnVpbHRpbiBjb25zdGFudHNcbiAgICAgICAgJ0xFVFRFUlMgbGV0dGVycyBtb250aC5hYmIgbW9udGgubmFtZSBwaSBUIEYgJ1xuICAgICAgICAvLyBQcmltaXRpdmUgZnVuY3Rpb25zXG4gICAgICAgIC8vIFRoZXNlIGFyZSBhbGwgdGhlIGZ1bmN0aW9ucyBpbiBgYmFzZWAgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMgYVxuICAgICAgICAvLyBgLlByaW1pdGl2ZWAsIG1pbnVzIHRob3NlIGZ1bmN0aW9ucyB0aGF0IGFyZSBhbHNvIGtleXdvcmRzLlxuICAgICAgICArICdhYnMgYWNvcyBhY29zaCBhbGwgYW55IGFueU5BIEFyZyBhcy5jYWxsIGFzLmNoYXJhY3RlciAnXG4gICAgICAgICsgJ2FzLmNvbXBsZXggYXMuZG91YmxlIGFzLmVudmlyb25tZW50IGFzLmludGVnZXIgYXMubG9naWNhbCAnXG4gICAgICAgICsgJ2FzLm51bGwuZGVmYXVsdCBhcy5udW1lcmljIGFzLnJhdyBhc2luIGFzaW5oIGF0YW4gYXRhbmggYXR0ciAnXG4gICAgICAgICsgJ2F0dHJpYnV0ZXMgYmFzZWVudiBicm93c2VyIGMgY2FsbCBjZWlsaW5nIGNsYXNzIENvbmogY29zIGNvc2ggJ1xuICAgICAgICArICdjb3NwaSBjdW1tYXggY3VtbWluIGN1bXByb2QgY3Vtc3VtIGRpZ2FtbWEgZGltIGRpbW5hbWVzICdcbiAgICAgICAgKyAnZW1wdHllbnYgZXhwIGV4cHJlc3Npb24gZmxvb3IgZm9yY2VBbmRDYWxsIGdhbW1hIGdjLnRpbWUgJ1xuICAgICAgICArICdnbG9iYWxlbnYgSW0gaW50ZXJhY3RpdmUgaW52aXNpYmxlIGlzLmFycmF5IGlzLmF0b21pYyBpcy5jYWxsICdcbiAgICAgICAgKyAnaXMuY2hhcmFjdGVyIGlzLmNvbXBsZXggaXMuZG91YmxlIGlzLmVudmlyb25tZW50IGlzLmV4cHJlc3Npb24gJ1xuICAgICAgICArICdpcy5maW5pdGUgaXMuZnVuY3Rpb24gaXMuaW5maW5pdGUgaXMuaW50ZWdlciBpcy5sYW5ndWFnZSAnXG4gICAgICAgICsgJ2lzLmxpc3QgaXMubG9naWNhbCBpcy5tYXRyaXggaXMubmEgaXMubmFtZSBpcy5uYW4gaXMubnVsbCAnXG4gICAgICAgICsgJ2lzLm51bWVyaWMgaXMub2JqZWN0IGlzLnBhaXJsaXN0IGlzLnJhdyBpcy5yZWN1cnNpdmUgaXMuc2luZ2xlICdcbiAgICAgICAgKyAnaXMuc3ltYm9sIGxhenlMb2FkREJmZXRjaCBsZW5ndGggbGdhbW1hIGxpc3QgbG9nIG1heCBtaW4gJ1xuICAgICAgICArICdtaXNzaW5nIE1vZCBuYW1lcyBuYXJncyBuemNoYXIgb2xkQ2xhc3Mgb24uZXhpdCBwb3MudG8uZW52ICdcbiAgICAgICAgKyAncHJvYy50aW1lIHByb2QgcXVvdGUgcmFuZ2UgUmUgcmVwIHJldHJhY2VtZW0gcmV0dXJuIHJvdW5kICdcbiAgICAgICAgKyAnc2VxX2Fsb25nIHNlcV9sZW4gc2VxLmludCBzaWduIHNpZ25pZiBzaW4gc2luaCBzaW5waSBzcXJ0ICdcbiAgICAgICAgKyAnc3RhbmRhcmRHZW5lcmljIHN1YnN0aXR1dGUgc3VtIHN3aXRjaCB0YW4gdGFuaCB0YW5waSB0cmFjZW1lbSAnXG4gICAgICAgICsgJ3RyaWdhbW1hIHRydW5jIHVuY2xhc3MgdW50cmFjZW1lbSBVc2VNZXRob2QgeHRmcm0nLFxuICAgIH0sXG5cbiAgICBjb250YWluczogW1xuICAgICAgLy8gUm94eWdlbiBjb21tZW50c1xuICAgICAgaGxqcy5DT01NRU5UKFxuICAgICAgICAvIycvLFxuICAgICAgICAvJC8sXG4gICAgICAgIHsgY29udGFpbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYEBleGFtcGxlc2Agc2VwYXJhdGVseSB0byBjYXVzZSBhbGwgc3Vic2VxdWVudCBjb2RlXG4gICAgICAgICAgICAvLyB1bnRpbCB0aGUgbmV4dCBgQGAtdGFnIG9uIGl0cyBvd24gbGluZSB0byBiZSBrZXB0IGFzLWlzLFxuICAgICAgICAgICAgLy8gcHJldmVudGluZyBoaWdobGlnaHRpbmcuIFRoaXMgY29kZSBpcyBleGFtcGxlIFIgY29kZSwgc28gbmVzdGVkXG4gICAgICAgICAgICAvLyBkb2N0YWdzIHNob3VsZG5cdTIwMTl0IGJlIHRyZWF0ZWQgYXMgc3VjaC4gU2VlXG4gICAgICAgICAgICAvLyBgdGVzdC9tYXJrdXAvci9yb3h5Z2VuLnR4dGAgZm9yIGFuIGV4YW1wbGUuXG4gICAgICAgICAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgICAgICAgICBtYXRjaDogL0BleGFtcGxlcy8sXG4gICAgICAgICAgICBzdGFydHM6IHtcbiAgICAgICAgICAgICAgZW5kOiByZWdleC5sb29rYWhlYWQocmVnZXguZWl0aGVyKFxuICAgICAgICAgICAgICAgIC8vIGVuZCBpZiBhbm90aGVyIGRvYyBjb21tZW50XG4gICAgICAgICAgICAgICAgL1xcbl4jJ1xccyooPz1AW2EtekEtWl0rKS8sXG4gICAgICAgICAgICAgICAgLy8gb3IgYSBsaW5lIHdpdGggbm8gY29tbWVudFxuICAgICAgICAgICAgICAgIC9cXG5eKD8hIycpL1xuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgZW5kc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGBAcGFyYW1gIHRvIGhpZ2hsaWdodCB0aGUgcGFyYW1ldGVyIG5hbWUgZm9sbG93aW5nXG4gICAgICAgICAgICAvLyBhZnRlci5cbiAgICAgICAgICAgIHNjb3BlOiAnZG9jdGFnJyxcbiAgICAgICAgICAgIGJlZ2luOiAnQHBhcmFtJyxcbiAgICAgICAgICAgIGVuZDogLyQvLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNjb3BlOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICAgICAgICB7IG1hdGNoOiBJREVOVF9SRSB9LFxuICAgICAgICAgICAgICAgICAgeyBtYXRjaDogL2AoPzpcXFxcLnxbXmBcXFxcXSkrYC8gfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgZW5kc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY29wZTogJ2RvY3RhZycsXG4gICAgICAgICAgICBtYXRjaDogL0BbYS16QS1aXSsvXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY29wZTogJ2tleXdvcmQnLFxuICAgICAgICAgICAgbWF0Y2g6IC9cXFxcW2EtekEtWl0rL1xuICAgICAgICAgIH1cbiAgICAgICAgXSB9XG4gICAgICApLFxuXG4gICAgICBobGpzLkhBU0hfQ09NTUVOVF9NT0RFLFxuXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAnc3RyaW5nJyxcbiAgICAgICAgY29udGFpbnM6IFsgaGxqcy5CQUNLU0xBU0hfRVNDQVBFIF0sXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgICAgICBiZWdpbjogL1tyUl1cIigtKilcXCgvLFxuICAgICAgICAgICAgZW5kOiAvXFwpKC0qKVwiL1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgICAgICAgICAgYmVnaW46IC9bclJdXCIoLSopXFx7LyxcbiAgICAgICAgICAgIGVuZDogL1xcfSgtKilcIi9cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgICAgIGJlZ2luOiAvW3JSXVwiKC0qKVxcWy8sXG4gICAgICAgICAgICBlbmQ6IC9cXF0oLSopXCIvXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgICAgICBiZWdpbjogL1tyUl0nKC0qKVxcKC8sXG4gICAgICAgICAgICBlbmQ6IC9cXCkoLSopJy9cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBobGpzLkVORF9TQU1FX0FTX0JFR0lOKHtcbiAgICAgICAgICAgIGJlZ2luOiAvW3JSXScoLSopXFx7LyxcbiAgICAgICAgICAgIGVuZDogL1xcfSgtKiknL1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhsanMuRU5EX1NBTUVfQVNfQkVHSU4oe1xuICAgICAgICAgICAgYmVnaW46IC9bclJdJygtKilcXFsvLFxuICAgICAgICAgICAgZW5kOiAvXFxdKC0qKScvXG4gICAgICAgICAgfSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46ICdcIicsXG4gICAgICAgICAgICBlbmQ6ICdcIicsXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiBcIidcIixcbiAgICAgICAgICAgIGVuZDogXCInXCIsXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICB9LFxuXG4gICAgICAvLyBNYXRjaGluZyBudW1iZXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBwdW5jdHVhdGlvbiBhbmQgb3BlcmF0b3JzIGlzXG4gICAgICAvLyB0cmlja3kgc2luY2Ugd2UgbmVlZCB0byBsb29rIGF0IHRoZSBjaGFyYWN0ZXIgYWhlYWQgb2YgYSBudW1iZXIgdG9cbiAgICAgIC8vIGVuc3VyZSB0aGUgbnVtYmVyIGlzIG5vdCBwYXJ0IG9mIGFuIGlkZW50aWZpZXIsIGFuZCB3ZSBjYW5ub3QgdXNlXG4gICAgICAvLyBuZWdhdGl2ZSBsb29rLWJlaGluZCBhc3NlcnRpb25zLiBTbyBpbnN0ZWFkIHdlIGV4cGxpY2l0bHkgaGFuZGxlIGFsbFxuICAgICAgLy8gcG9zc2libGUgY29tYmluYXRpb25zIG9mIChvcGVyYXRvcnxwdW5jdHVhdGlvbiksIG51bWJlci5cbiAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCBuZWdhdGl2ZSBsb29rLWJlaGluZCB3aGVuIGF2YWlsYWJsZVxuICAgICAgLy8geyBiZWdpbjogLyg/PCFbYS16QS1aMC05Ll9dKTBbeFhdWzAtOWEtZkEtRl0rXFwuWzAtOWEtZkEtRl0qW3BQXVsrLV0/XFxkK2k/LyB9LFxuICAgICAgLy8geyBiZWdpbjogLyg/PCFbYS16QS1aMC05Ll9dKTBbeFhdWzAtOWEtZkEtRl0rKFtwUF1bKy1dP1xcZCspP1tMaV0/LyB9LFxuICAgICAgLy8geyBiZWdpbjogLyg/PCFbYS16QS1aMC05Ll9dKShcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWystXT9cXGQrKT9bTGldPy8gfVxuICAgICAge1xuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgMTogJ29wZXJhdG9yJyxcbiAgICAgICAgICAgICAgMjogJ251bWJlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICBPUEVSQVRPUlNfUkUsXG4gICAgICAgICAgICAgIE5VTUJFUl9UWVBFU19SRVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgMTogJ29wZXJhdG9yJyxcbiAgICAgICAgICAgICAgMjogJ251bWJlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICAvJVteJV0qJS8sXG4gICAgICAgICAgICAgIE5VTUJFUl9UWVBFU19SRVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgMTogJ3B1bmN0dWF0aW9uJyxcbiAgICAgICAgICAgICAgMjogJ251bWJlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXRjaDogW1xuICAgICAgICAgICAgICBQVU5DVFVBVElPTl9SRSxcbiAgICAgICAgICAgICAgTlVNQkVSX1RZUEVTX1JFXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY29wZTogeyAyOiAnbnVtYmVyJyB9LFxuICAgICAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAgICAgL1teYS16QS1aMC05Ll9dfF4vLCAvLyBub3QgcGFydCBvZiBhbiBpZGVudGlmaWVyLCBvciBzdGFydCBvZiBkb2N1bWVudFxuICAgICAgICAgICAgICBOVU1CRVJfVFlQRVNfUkVcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG5cbiAgICAgIC8vIE9wZXJhdG9ycy9wdW5jdHVhdGlvbiB3aGVuIHRoZXkncmUgbm90IGRpcmVjdGx5IGZvbGxvd2VkIGJ5IG51bWJlcnNcbiAgICAgIHtcbiAgICAgICAgLy8gUmVsZXZhbmNlIGJvb3N0IGZvciB0aGUgbW9zdCBjb21tb24gYXNzaWdubWVudCBmb3JtLlxuICAgICAgICBzY29wZTogeyAzOiAnb3BlcmF0b3InIH0sXG4gICAgICAgIG1hdGNoOiBbXG4gICAgICAgICAgSURFTlRfUkUsXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIC88LS8sXG4gICAgICAgICAgL1xccysvXG4gICAgICAgIF1cbiAgICAgIH0sXG5cbiAgICAgIHtcbiAgICAgICAgc2NvcGU6ICdvcGVyYXRvcicsXG4gICAgICAgIHJlbGV2YW5jZTogMCxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7IG1hdGNoOiBPUEVSQVRPUlNfUkUgfSxcbiAgICAgICAgICB7IG1hdGNoOiAvJVteJV0qJS8gfVxuICAgICAgICBdXG4gICAgICB9LFxuXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiAncHVuY3R1YXRpb24nLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIG1hdGNoOiBQVU5DVFVBVElPTl9SRVxuICAgICAgfSxcblxuICAgICAge1xuICAgICAgICAvLyBFc2NhcGVkIGlkZW50aWZpZXJcbiAgICAgICAgYmVnaW46ICdgJyxcbiAgICAgICAgZW5kOiAnYCcsXG4gICAgICAgIGNvbnRhaW5zOiBbIHsgYmVnaW46IC9cXFxcLi8gfSBdXG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyByIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFJ1YnlcbkRlc2NyaXB0aW9uOiBSdWJ5IGlzIGEgZHluYW1pYywgb3BlbiBzb3VyY2UgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugd2l0aCBhIGZvY3VzIG9uIHNpbXBsaWNpdHkgYW5kIHByb2R1Y3Rpdml0eS5cbldlYnNpdGU6IGh0dHBzOi8vd3d3LnJ1YnktbGFuZy5vcmcvXG5BdXRob3I6IEFudG9uIEtvdmFseW92IDxhbnRvbkBrb3ZhbHlvdi5uZXQ+XG5Db250cmlidXRvcnM6IFBldGVyIExlb25vdiA8Z29qcGVnQHlhbmRleC5ydT4sIFZhc2lseSBQb2xvdm55b3YgPHZhc3RAd2hpdGVhbnRzLm5ldD4sIExvcmVuIFNlZ2FsIDxsc2VnYWxAc29lbi5jYT4sIFBhc2NhbCBIdXJuaSA8cGhpQHJ1YnktcmVhY3RpdmUub3JnPiwgQ2VkcmljIFNvaHJhdWVyIDxzb2hyYXVlckBnb29nbGVtYWlsLmNvbT5cbkNhdGVnb3J5OiBjb21tb25cbiovXG5cbmZ1bmN0aW9uIHJ1YnkoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIGNvbnN0IFJVQllfTUVUSE9EX1JFID0gJyhbYS16QS1aX11cXFxcdypbIT89XT98Wy0rfl1AfDw8fD4+fD1+fD09PT98PD0+fFs8Pl09P3xcXFxcKlxcXFwqfFstLyslXiYqfmB8XXxcXFxcW1xcXFxdPT8pJztcbiAgLy8gVE9ETzogbW92ZSBjb25jZXB0cyBsaWtlIENBTUVMX0NBU0UgaW50byBgbW9kZXMuanNgXG4gIGNvbnN0IENMQVNTX05BTUVfUkUgPSByZWdleC5laXRoZXIoXG4gICAgL1xcYihbQS1aXStbYS16MC05XSspKy8sXG4gICAgLy8gZW5kcyBpbiBjYXBzXG4gICAgL1xcYihbQS1aXStbYS16MC05XSspK1tBLVpdKy8sXG4gIClcbiAgO1xuICBjb25zdCBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFID0gcmVnZXguY29uY2F0KENMQVNTX05BTUVfUkUsIC8oOjpcXHcrKSovKTtcbiAgLy8gdmVyeSBwb3B1bGFyIHJ1YnkgYnVpbHQtaW5zIHRoYXQgb25lIG1pZ2h0IGV2ZW4gYXNzdW1lXG4gIC8vIGFyZSBhY3R1YWwga2V5d29yZHMgKGRlc3BpdGUgdGhhdCBub3QgYmVpbmcgdGhlIGNhc2UpXG4gIGNvbnN0IFBTRVVET19LV1MgPSBbXG4gICAgXCJpbmNsdWRlXCIsXG4gICAgXCJleHRlbmRcIixcbiAgICBcInByZXBlbmRcIixcbiAgICBcInB1YmxpY1wiLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJvdGVjdGVkXCIsXG4gICAgXCJyYWlzZVwiLFxuICAgIFwidGhyb3dcIlxuICBdO1xuICBjb25zdCBSVUJZX0tFWVdPUkRTID0ge1xuICAgIFwidmFyaWFibGUuY29uc3RhbnRcIjogW1xuICAgICAgXCJfX0ZJTEVfX1wiLFxuICAgICAgXCJfX0xJTkVfX1wiLFxuICAgICAgXCJfX0VOQ09ESU5HX19cIlxuICAgIF0sXG4gICAgXCJ2YXJpYWJsZS5sYW5ndWFnZVwiOiBbXG4gICAgICBcInNlbGZcIixcbiAgICAgIFwic3VwZXJcIixcbiAgICBdLFxuICAgIGtleXdvcmQ6IFtcbiAgICAgIFwiYWxpYXNcIixcbiAgICAgIFwiYW5kXCIsXG4gICAgICBcImJlZ2luXCIsXG4gICAgICBcIkJFR0lOXCIsXG4gICAgICBcImJyZWFrXCIsXG4gICAgICBcImNhc2VcIixcbiAgICAgIFwiY2xhc3NcIixcbiAgICAgIFwiZGVmaW5lZFwiLFxuICAgICAgXCJkb1wiLFxuICAgICAgXCJlbHNlXCIsXG4gICAgICBcImVsc2lmXCIsXG4gICAgICBcImVuZFwiLFxuICAgICAgXCJFTkRcIixcbiAgICAgIFwiZW5zdXJlXCIsXG4gICAgICBcImZvclwiLFxuICAgICAgXCJpZlwiLFxuICAgICAgXCJpblwiLFxuICAgICAgXCJtb2R1bGVcIixcbiAgICAgIFwibmV4dFwiLFxuICAgICAgXCJub3RcIixcbiAgICAgIFwib3JcIixcbiAgICAgIFwicmVkb1wiLFxuICAgICAgXCJyZXF1aXJlXCIsXG4gICAgICBcInJlc2N1ZVwiLFxuICAgICAgXCJyZXRyeVwiLFxuICAgICAgXCJyZXR1cm5cIixcbiAgICAgIFwidGhlblwiLFxuICAgICAgXCJ1bmRlZlwiLFxuICAgICAgXCJ1bmxlc3NcIixcbiAgICAgIFwidW50aWxcIixcbiAgICAgIFwid2hlblwiLFxuICAgICAgXCJ3aGlsZVwiLFxuICAgICAgXCJ5aWVsZFwiLFxuICAgICAgLi4uUFNFVURPX0tXU1xuICAgIF0sXG4gICAgYnVpbHRfaW46IFtcbiAgICAgIFwicHJvY1wiLFxuICAgICAgXCJsYW1iZGFcIixcbiAgICAgIFwiYXR0cl9hY2Nlc3NvclwiLFxuICAgICAgXCJhdHRyX3JlYWRlclwiLFxuICAgICAgXCJhdHRyX3dyaXRlclwiLFxuICAgICAgXCJkZWZpbmVfbWV0aG9kXCIsXG4gICAgICBcInByaXZhdGVfY29uc3RhbnRcIixcbiAgICAgIFwibW9kdWxlX2Z1bmN0aW9uXCJcbiAgICBdLFxuICAgIGxpdGVyYWw6IFtcbiAgICAgIFwidHJ1ZVwiLFxuICAgICAgXCJmYWxzZVwiLFxuICAgICAgXCJuaWxcIlxuICAgIF1cbiAgfTtcbiAgY29uc3QgWUFSRE9DVEFHID0ge1xuICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgYmVnaW46ICdAW0EtWmEtel0rJ1xuICB9O1xuICBjb25zdCBJUkJfT0JKRUNUID0ge1xuICAgIGJlZ2luOiAnIzwnLFxuICAgIGVuZDogJz4nXG4gIH07XG4gIGNvbnN0IENPTU1FTlRfTU9ERVMgPSBbXG4gICAgaGxqcy5DT01NRU5UKFxuICAgICAgJyMnLFxuICAgICAgJyQnLFxuICAgICAgeyBjb250YWluczogWyBZQVJET0NUQUcgXSB9XG4gICAgKSxcbiAgICBobGpzLkNPTU1FTlQoXG4gICAgICAnXj1iZWdpbicsXG4gICAgICAnXj1lbmQnLFxuICAgICAge1xuICAgICAgICBjb250YWluczogWyBZQVJET0NUQUcgXSxcbiAgICAgICAgcmVsZXZhbmNlOiAxMFxuICAgICAgfVxuICAgICksXG4gICAgaGxqcy5DT01NRU5UKCdeX19FTkRfXycsIGhsanMuTUFUQ0hfTk9USElOR19SRSlcbiAgXTtcbiAgY29uc3QgU1VCU1QgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3Vic3QnLFxuICAgIGJlZ2luOiAvI1xcey8sXG4gICAgZW5kOiAvXFx9LyxcbiAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEU1xuICB9O1xuICBjb25zdCBTVFJJTkcgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgU1VCU1RcbiAgICBdLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJy8sXG4gICAgICAgIGVuZDogLycvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1wiLyxcbiAgICAgICAgZW5kOiAvXCIvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL2AvLFxuICAgICAgICBlbmQ6IC9gL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8lW3FRd1d4XT9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyVbcVF3V3hdP1xcWy8sXG4gICAgICAgIGVuZDogL1xcXS9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJVtxUXdXeF0/XFx7LyxcbiAgICAgICAgZW5kOiAvXFx9L1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8lW3FRd1d4XT88LyxcbiAgICAgICAgZW5kOiAvPi9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJVtxUXdXeF0/XFwvLyxcbiAgICAgICAgZW5kOiAvXFwvL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC8lW3FRd1d4XT8lLyxcbiAgICAgICAgZW5kOiAvJS9cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJVtxUXdXeF0/LS8sXG4gICAgICAgIGVuZDogLy0vXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogLyVbcVF3V3hdP1xcfC8sXG4gICAgICAgIGVuZDogL1xcfC9cbiAgICAgIH0sXG4gICAgICAvLyBpbiB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zLCBcXEIgaW4gdGhlIGJlZ2lubmluZyBzdXBwcmVzc2VzIHJlY29nbml0aW9uIG9mID8tc2VxdWVuY2VzXG4gICAgICAvLyB3aGVyZSA/IGlzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIHByZWNlZGluZyBpZGVudGlmaWVyLCBhcyBpbjogYGZ1bmM/NGBcbiAgICAgIHsgYmVnaW46IC9cXEJcXD8oXFxcXFxcZHsxLDN9KS8gfSxcbiAgICAgIHsgYmVnaW46IC9cXEJcXD8oXFxcXHhbQS1GYS1mMC05XXsxLDJ9KS8gfSxcbiAgICAgIHsgYmVnaW46IC9cXEJcXD8oXFxcXHVcXHs/W0EtRmEtZjAtOV17MSw2fVxcfT8pLyB9LFxuICAgICAgeyBiZWdpbjogL1xcQlxcPyhcXFxcTS1cXFxcQy18XFxcXE0tXFxcXGN8XFxcXGNcXFxcTS18XFxcXE0tfFxcXFxDLVxcXFxNLSlbXFx4MjAtXFx4N2VdLyB9LFxuICAgICAgeyBiZWdpbjogL1xcQlxcP1xcXFwoY3xDLSlbXFx4MjAtXFx4N2VdLyB9LFxuICAgICAgeyBiZWdpbjogL1xcQlxcP1xcXFw/XFxTLyB9LFxuICAgICAgLy8gaGVyZWRvY3NcbiAgICAgIHtcbiAgICAgICAgLy8gdGhpcyBndWFyZCBtYWtlcyBzdXJlIHRoYXQgd2UgaGF2ZSBhbiBlbnRpcmUgaGVyZWRvYyBhbmQgbm90IGEgZmFsc2VcbiAgICAgICAgLy8gcG9zaXRpdmUgKGF1dG8tZGV0ZWN0LCBldGMuKVxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgICAgIC88PFstfl0/Jz8vLFxuICAgICAgICAgIHJlZ2V4Lmxvb2thaGVhZCgvKFxcdyspKD89XFxXKVteXFxuXSpcXG4oPzpbXlxcbl0qXFxuKSo/XFxzKlxcMVxcYi8pXG4gICAgICAgICksXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5FTkRfU0FNRV9BU19CRUdJTih7XG4gICAgICAgICAgICBiZWdpbjogLyhcXHcrKS8sXG4gICAgICAgICAgICBlbmQ6IC8oXFx3KykvLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICAgICAgICBTVUJTVFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH07XG5cbiAgLy8gUnVieSBzeW50YXggaXMgdW5kZXJkb2N1bWVudGVkLCBidXQgdGhpcyBncmFtbWFyIHNlZW1zIHRvIGJlIGFjY3VyYXRlXG4gIC8vIGFzIG9mIHZlcnNpb24gMi43LjIgKGNvbmZpcm1lZCB3aXRoIChpcmIgYW5kIGBSaXBwZXIuc2V4cCguLi4pYClcbiAgLy8gaHR0cHM6Ly9kb2NzLnJ1YnktbGFuZy5vcmcvZW4vMi43LjAvZG9jL3N5bnRheC9saXRlcmFsc19yZG9jLmh0bWwjbGFiZWwtTnVtYmVyc1xuICBjb25zdCBkZWNpbWFsID0gJ1sxLTldKF8/WzAtOV0pKnwwJztcbiAgY29uc3QgZGlnaXRzID0gJ1swLTldKF8/WzAtOV0pKic7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gZGVjaW1hbCBpbnRlZ2VyL2Zsb2F0LCBvcHRpb25hbGx5IGV4cG9uZW50aWFsIG9yIHJhdGlvbmFsLCBvcHRpb25hbGx5IGltYWdpbmFyeVxuICAgICAgeyBiZWdpbjogYFxcXFxiKCR7ZGVjaW1hbH0pKFxcXFwuKCR7ZGlnaXRzfSkpPyhbZUVdWystXT8oJHtkaWdpdHN9KXxyKT9pP1xcXFxiYCB9LFxuXG4gICAgICAvLyBleHBsaWNpdCBkZWNpbWFsL2JpbmFyeS9vY3RhbC9oZXhhZGVjaW1hbCBpbnRlZ2VyLFxuICAgICAgLy8gb3B0aW9uYWxseSByYXRpb25hbCBhbmQvb3IgaW1hZ2luYXJ5XG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFtkRF1bMC05XShfP1swLTldKSpyP2k/XFxcXGJcIiB9LFxuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbYkJdWzAtMV0oXz9bMC0xXSkqcj9pP1xcXFxiXCIgfSxcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwW29PXVswLTddKF8/WzAtN10pKnI/aT9cXFxcYlwiIH0sXG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFt4WF1bMC05YS1mQS1GXShfP1swLTlhLWZBLUZdKSpyP2k/XFxcXGJcIiB9LFxuXG4gICAgICAvLyAwLXByZWZpeGVkIGltcGxpY2l0IG9jdGFsIGludGVnZXIsIG9wdGlvbmFsbHkgcmF0aW9uYWwgYW5kL29yIGltYWdpbmFyeVxuICAgICAgeyBiZWdpbjogXCJcXFxcYjAoXz9bMC03XSkrcj9pP1xcXFxiXCIgfVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBQQVJBTVMgPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IC9cXChcXCkvLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC8oPz1cXCkpLyxcbiAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICBlbmRzUGFyZW50OiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEUyxcbiAgICAgIH1cbiAgICBdXG4gIH07XG5cbiAgY29uc3QgSU5DTFVERV9FWFRFTkQgPSB7XG4gICAgbWF0Y2g6IFtcbiAgICAgIC8oaW5jbHVkZXxleHRlbmQpXFxzKy8sXG4gICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFXG4gICAgXSxcbiAgICBzY29wZToge1xuICAgICAgMjogXCJ0aXRsZS5jbGFzc1wiXG4gICAgfSxcbiAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEU1xuICB9O1xuXG4gIGNvbnN0IENMQVNTX0RFRklOSVRJT04gPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY2xhc3NcXHMrLyxcbiAgICAgICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFLFxuICAgICAgICAgIC9cXHMrPFxccysvLFxuICAgICAgICAgIENMQVNTX05BTUVfV0lUSF9OQU1FU1BBQ0VfUkVcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvXFxiKGNsYXNzfG1vZHVsZSlcXHMrLyxcbiAgICAgICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdLFxuICAgIHNjb3BlOiB7XG4gICAgICAyOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICA0OiBcInRpdGxlLmNsYXNzLmluaGVyaXRlZFwiXG4gICAgfSxcbiAgICBrZXl3b3JkczogUlVCWV9LRVlXT1JEU1xuICB9O1xuXG4gIGNvbnN0IFVQUEVSX0NBU0VfQ09OU1RBTlQgPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOiAvXFxiW0EtWl1bQS1aXzAtOV0rXFxiLyxcbiAgICBjbGFzc05hbWU6IFwidmFyaWFibGUuY29uc3RhbnRcIlxuICB9O1xuXG4gIGNvbnN0IE1FVEhPRF9ERUZJTklUSU9OID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvZGVmLywgL1xccysvLFxuICAgICAgUlVCWV9NRVRIT0RfUkVcbiAgICBdLFxuICAgIHNjb3BlOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIFBBUkFNU1xuICAgIF1cbiAgfTtcblxuICBjb25zdCBPQkpFQ1RfQ1JFQVRJT04gPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOiBbXG4gICAgICBDTEFTU19OQU1FX1dJVEhfTkFNRVNQQUNFX1JFLFxuICAgICAgL1xcLm5ld1suIChdL1xuICAgIF0sXG4gICAgc2NvcGU6IHtcbiAgICAgIDE6IFwidGl0bGUuY2xhc3NcIlxuICAgIH1cbiAgfTtcblxuICAvLyBDYW1lbENhc2VcbiAgY29uc3QgQ0xBU1NfUkVGRVJFTkNFID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBtYXRjaDogQ0xBU1NfTkFNRV9SRSxcbiAgICBzY29wZTogXCJ0aXRsZS5jbGFzc1wiXG4gIH07XG5cbiAgY29uc3QgUlVCWV9ERUZBVUxUX0NPTlRBSU5TID0gW1xuICAgIFNUUklORyxcbiAgICBDTEFTU19ERUZJTklUSU9OLFxuICAgIElOQ0xVREVfRVhURU5ELFxuICAgIE9CSkVDVF9DUkVBVElPTixcbiAgICBVUFBFUl9DQVNFX0NPTlNUQU5ULFxuICAgIENMQVNTX1JFRkVSRU5DRSxcbiAgICBNRVRIT0RfREVGSU5JVElPTixcbiAgICB7XG4gICAgICAvLyBzd2FsbG93IG5hbWVzcGFjZSBxdWFsaWZpZXJzIGJlZm9yZSBzeW1ib2xzXG4gICAgICBiZWdpbjogaGxqcy5JREVOVF9SRSArICc6OicgfSxcbiAgICB7XG4gICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICcoIXxcXFxcPyk/OicsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3N5bWJvbCcsXG4gICAgICBiZWdpbjogJzooPyFcXFxccyknLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgU1RSSU5HLFxuICAgICAgICB7IGJlZ2luOiBSVUJZX01FVEhPRF9SRSB9XG4gICAgICBdLFxuICAgICAgcmVsZXZhbmNlOiAwXG4gICAgfSxcbiAgICBOVU1CRVIsXG4gICAge1xuICAgICAgLy8gbmVnYXRpdmUtbG9vayBmb3J3YXJkIGF0dGVtcHRzIHRvIHByZXZlbnQgZmFsc2UgbWF0Y2hlcyBsaWtlOlxuICAgICAgLy8gQGlkZW50QCBvciAkaWRlbnQkIHRoYXQgbWlnaHQgaW5kaWNhdGUgdGhpcyBpcyBub3QgcnVieSBhdCBhbGxcbiAgICAgIGNsYXNzTmFtZTogXCJ2YXJpYWJsZVwiLFxuICAgICAgYmVnaW46ICcoXFxcXCRcXFxcVyl8KChcXFxcJHxAQD8pKFxcXFx3KykpKD89W15AJD9dKScgKyBgKD8hW0EtWmEtel0pKD8hW0AkPyddKWBcbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICBiZWdpbjogL1xcfC8sXG4gICAgICBlbmQ6IC9cXHwvLFxuICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgIHJlbGV2YW5jZTogMCwgLy8gdGhpcyBjb3VsZCBiZSBhIGxvdCBvZiB0aGluZ3MgKGluIG90aGVyIGxhbmd1YWdlcykgb3RoZXIgdGhhbiBwYXJhbXNcbiAgICAgIGtleXdvcmRzOiBSVUJZX0tFWVdPUkRTXG4gICAgfSxcbiAgICB7IC8vIHJlZ2V4cCBjb250YWluZXJcbiAgICAgIGJlZ2luOiAnKCcgKyBobGpzLlJFX1NUQVJURVJTX1JFICsgJ3x1bmxlc3MpXFxcXHMqJyxcbiAgICAgIGtleXdvcmRzOiAndW5sZXNzJyxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZWdleHAnLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICAgICAgICBTVUJTVFxuICAgICAgICAgIF0sXG4gICAgICAgICAgaWxsZWdhbDogL1xcbi8sXG4gICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYmVnaW46ICcvJyxcbiAgICAgICAgICAgICAgZW5kOiAnL1thLXpdKidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJlZ2luOiAvJXJcXHsvLFxuICAgICAgICAgICAgICBlbmQ6IC9cXH1bYS16XSovXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBiZWdpbjogJyVyXFxcXCgnLFxuICAgICAgICAgICAgICBlbmQ6ICdcXFxcKVthLXpdKidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJlZ2luOiAnJXIhJyxcbiAgICAgICAgICAgICAgZW5kOiAnIVthLXpdKidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGJlZ2luOiAnJXJcXFxcWycsXG4gICAgICAgICAgICAgIGVuZDogJ1xcXFxdW2Etel0qJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXS5jb25jYXQoSVJCX09CSkVDVCwgQ09NTUVOVF9NT0RFUyksXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9XG4gIF0uY29uY2F0KElSQl9PQkpFQ1QsIENPTU1FTlRfTU9ERVMpO1xuXG4gIFNVQlNULmNvbnRhaW5zID0gUlVCWV9ERUZBVUxUX0NPTlRBSU5TO1xuICBQQVJBTVMuY29udGFpbnMgPSBSVUJZX0RFRkFVTFRfQ09OVEFJTlM7XG5cbiAgLy8gPj5cbiAgLy8gPz5cbiAgY29uc3QgU0lNUExFX1BST01QVCA9IFwiWz4/XT5cIjtcbiAgLy8gaXJiKG1haW4pOjAwMTowPlxuICBjb25zdCBERUZBVUxUX1BST01QVCA9IFwiW1xcXFx3I10rXFxcXChcXFxcdytcXFxcKTpcXFxcZCs6XFxcXGQrWz4qXVwiO1xuICBjb25zdCBSVk1fUFJPTVBUID0gXCIoXFxcXHcrLSk/XFxcXGQrXFxcXC5cXFxcZCtcXFxcLlxcXFxkKyhwXFxcXGQrKT9bXlxcXFxkXVtePl0rPlwiO1xuXG4gIGNvbnN0IElSQl9ERUZBVUxUID0gW1xuICAgIHtcbiAgICAgIGJlZ2luOiAvXlxccyo9Pi8sXG4gICAgICBzdGFydHM6IHtcbiAgICAgICAgZW5kOiAnJCcsXG4gICAgICAgIGNvbnRhaW5zOiBSVUJZX0RFRkFVTFRfQ09OVEFJTlNcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ21ldGEucHJvbXB0JyxcbiAgICAgIGJlZ2luOiAnXignICsgU0lNUExFX1BST01QVCArIFwifFwiICsgREVGQVVMVF9QUk9NUFQgKyAnfCcgKyBSVk1fUFJPTVBUICsgJykoPz1bIF0pJyxcbiAgICAgIHN0YXJ0czoge1xuICAgICAgICBlbmQ6ICckJyxcbiAgICAgICAga2V5d29yZHM6IFJVQllfS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBSVUJZX0RFRkFVTFRfQ09OVEFJTlNcbiAgICAgIH1cbiAgICB9XG4gIF07XG5cbiAgQ09NTUVOVF9NT0RFUy51bnNoaWZ0KElSQl9PQkpFQ1QpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1J1YnknLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICdyYicsXG4gICAgICAnZ2Vtc3BlYycsXG4gICAgICAncG9kc3BlYycsXG4gICAgICAndGhvcicsXG4gICAgICAnaXJiJ1xuICAgIF0sXG4gICAga2V5d29yZHM6IFJVQllfS0VZV09SRFMsXG4gICAgaWxsZWdhbDogL1xcL1xcKi8sXG4gICAgY29udGFpbnM6IFsgaGxqcy5TSEVCQU5HKHsgYmluYXJ5OiBcInJ1YnlcIiB9KSBdXG4gICAgICAuY29uY2F0KElSQl9ERUZBVUxUKVxuICAgICAgLmNvbmNhdChDT01NRU5UX01PREVTKVxuICAgICAgLmNvbmNhdChSVUJZX0RFRkFVTFRfQ09OVEFJTlMpXG4gIH07XG59XG5cbmV4cG9ydCB7IHJ1YnkgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogUnVzdFxuQXV0aG9yOiBBbmRyZXkgVmxhc292c2tpa2ggPGFuZHJleS52bGFzb3Zza2lraEBnbWFpbC5jb20+XG5Db250cmlidXRvcnM6IFJvbWFuIFNobWF0b3YgPHJvbWFuc2htYXRvdkBnbWFpbC5jb20+LCBLYXNwZXIgQW5kZXJzZW4gPGttYV91bnRydXN0ZWRAcHJvdG9ubWFpbC5jb20+XG5XZWJzaXRlOiBodHRwczovL3d3dy5ydXN0LWxhbmcub3JnXG5DYXRlZ29yeTogY29tbW9uLCBzeXN0ZW1cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBydXN0KGhsanMpIHtcbiAgY29uc3QgcmVnZXggPSBobGpzLnJlZ2V4O1xuICBjb25zdCBGVU5DVElPTl9JTlZPS0UgPSB7XG4gICAgY2xhc3NOYW1lOiBcInRpdGxlLmZ1bmN0aW9uLmludm9rZVwiLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgL1xcYi8sXG4gICAgICAvKD8hbGV0XFxiKS8sXG4gICAgICBobGpzLklERU5UX1JFLFxuICAgICAgcmVnZXgubG9va2FoZWFkKC9cXHMqXFwoLykpXG4gIH07XG4gIGNvbnN0IE5VTUJFUl9TVUZGSVggPSAnKFt1aV0oOHwxNnwzMnw2NHwxMjh8c2l6ZSl8ZigzMnw2NCkpXFw/JztcbiAgY29uc3QgS0VZV09SRFMgPSBbXG4gICAgXCJhYnN0cmFjdFwiLFxuICAgIFwiYXNcIixcbiAgICBcImFzeW5jXCIsXG4gICAgXCJhd2FpdFwiLFxuICAgIFwiYmVjb21lXCIsXG4gICAgXCJib3hcIixcbiAgICBcImJyZWFrXCIsXG4gICAgXCJjb25zdFwiLFxuICAgIFwiY29udGludWVcIixcbiAgICBcImNyYXRlXCIsXG4gICAgXCJkb1wiLFxuICAgIFwiZHluXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsXG4gICAgXCJleHRlcm5cIixcbiAgICBcImZhbHNlXCIsXG4gICAgXCJmaW5hbFwiLFxuICAgIFwiZm5cIixcbiAgICBcImZvclwiLFxuICAgIFwiaWZcIixcbiAgICBcImltcGxcIixcbiAgICBcImluXCIsXG4gICAgXCJsZXRcIixcbiAgICBcImxvb3BcIixcbiAgICBcIm1hY3JvXCIsXG4gICAgXCJtYXRjaFwiLFxuICAgIFwibW9kXCIsXG4gICAgXCJtb3ZlXCIsXG4gICAgXCJtdXRcIixcbiAgICBcIm92ZXJyaWRlXCIsXG4gICAgXCJwcml2XCIsXG4gICAgXCJwdWJcIixcbiAgICBcInJlZlwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzZWxmXCIsXG4gICAgXCJTZWxmXCIsXG4gICAgXCJzdGF0aWNcIixcbiAgICBcInN0cnVjdFwiLFxuICAgIFwic3VwZXJcIixcbiAgICBcInRyYWl0XCIsXG4gICAgXCJ0cnVlXCIsXG4gICAgXCJ0cnlcIixcbiAgICBcInR5cGVcIixcbiAgICBcInR5cGVvZlwiLFxuICAgIFwidW5zYWZlXCIsXG4gICAgXCJ1bnNpemVkXCIsXG4gICAgXCJ1c2VcIixcbiAgICBcInZpcnR1YWxcIixcbiAgICBcIndoZXJlXCIsXG4gICAgXCJ3aGlsZVwiLFxuICAgIFwieWllbGRcIlxuICBdO1xuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICBcInRydWVcIixcbiAgICBcImZhbHNlXCIsXG4gICAgXCJTb21lXCIsXG4gICAgXCJOb25lXCIsXG4gICAgXCJPa1wiLFxuICAgIFwiRXJyXCJcbiAgXTtcbiAgY29uc3QgQlVJTFRJTlMgPSBbXG4gICAgLy8gZnVuY3Rpb25zXG4gICAgJ2Ryb3AgJyxcbiAgICAvLyB0cmFpdHNcbiAgICBcIkNvcHlcIixcbiAgICBcIlNlbmRcIixcbiAgICBcIlNpemVkXCIsXG4gICAgXCJTeW5jXCIsXG4gICAgXCJEcm9wXCIsXG4gICAgXCJGblwiLFxuICAgIFwiRm5NdXRcIixcbiAgICBcIkZuT25jZVwiLFxuICAgIFwiVG9Pd25lZFwiLFxuICAgIFwiQ2xvbmVcIixcbiAgICBcIkRlYnVnXCIsXG4gICAgXCJQYXJ0aWFsRXFcIixcbiAgICBcIlBhcnRpYWxPcmRcIixcbiAgICBcIkVxXCIsXG4gICAgXCJPcmRcIixcbiAgICBcIkFzUmVmXCIsXG4gICAgXCJBc011dFwiLFxuICAgIFwiSW50b1wiLFxuICAgIFwiRnJvbVwiLFxuICAgIFwiRGVmYXVsdFwiLFxuICAgIFwiSXRlcmF0b3JcIixcbiAgICBcIkV4dGVuZFwiLFxuICAgIFwiSW50b0l0ZXJhdG9yXCIsXG4gICAgXCJEb3VibGVFbmRlZEl0ZXJhdG9yXCIsXG4gICAgXCJFeGFjdFNpemVJdGVyYXRvclwiLFxuICAgIFwiU2xpY2VDb25jYXRFeHRcIixcbiAgICBcIlRvU3RyaW5nXCIsXG4gICAgLy8gbWFjcm9zXG4gICAgXCJhc3NlcnQhXCIsXG4gICAgXCJhc3NlcnRfZXEhXCIsXG4gICAgXCJiaXRmbGFncyFcIixcbiAgICBcImJ5dGVzIVwiLFxuICAgIFwiY2ZnIVwiLFxuICAgIFwiY29sIVwiLFxuICAgIFwiY29uY2F0IVwiLFxuICAgIFwiY29uY2F0X2lkZW50cyFcIixcbiAgICBcImRlYnVnX2Fzc2VydCFcIixcbiAgICBcImRlYnVnX2Fzc2VydF9lcSFcIixcbiAgICBcImVudiFcIixcbiAgICBcInBhbmljIVwiLFxuICAgIFwiZmlsZSFcIixcbiAgICBcImZvcm1hdCFcIixcbiAgICBcImZvcm1hdF9hcmdzIVwiLFxuICAgIFwiaW5jbHVkZV9ieXRlcyFcIixcbiAgICBcImluY2x1ZGVfc3RyIVwiLFxuICAgIFwibGluZSFcIixcbiAgICBcImxvY2FsX2RhdGFfa2V5IVwiLFxuICAgIFwibW9kdWxlX3BhdGghXCIsXG4gICAgXCJvcHRpb25fZW52IVwiLFxuICAgIFwicHJpbnQhXCIsXG4gICAgXCJwcmludGxuIVwiLFxuICAgIFwic2VsZWN0IVwiLFxuICAgIFwic3RyaW5naWZ5IVwiLFxuICAgIFwidHJ5IVwiLFxuICAgIFwidW5pbXBsZW1lbnRlZCFcIixcbiAgICBcInVucmVhY2hhYmxlIVwiLFxuICAgIFwidmVjIVwiLFxuICAgIFwid3JpdGUhXCIsXG4gICAgXCJ3cml0ZWxuIVwiLFxuICAgIFwibWFjcm9fcnVsZXMhXCIsXG4gICAgXCJhc3NlcnRfbmUhXCIsXG4gICAgXCJkZWJ1Z19hc3NlcnRfbmUhXCJcbiAgXTtcbiAgY29uc3QgVFlQRVMgPSBbXG4gICAgXCJpOFwiLFxuICAgIFwiaTE2XCIsXG4gICAgXCJpMzJcIixcbiAgICBcImk2NFwiLFxuICAgIFwiaTEyOFwiLFxuICAgIFwiaXNpemVcIixcbiAgICBcInU4XCIsXG4gICAgXCJ1MTZcIixcbiAgICBcInUzMlwiLFxuICAgIFwidTY0XCIsXG4gICAgXCJ1MTI4XCIsXG4gICAgXCJ1c2l6ZVwiLFxuICAgIFwiZjMyXCIsXG4gICAgXCJmNjRcIixcbiAgICBcInN0clwiLFxuICAgIFwiY2hhclwiLFxuICAgIFwiYm9vbFwiLFxuICAgIFwiQm94XCIsXG4gICAgXCJPcHRpb25cIixcbiAgICBcIlJlc3VsdFwiLFxuICAgIFwiU3RyaW5nXCIsXG4gICAgXCJWZWNcIlxuICBdO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSdXN0JyxcbiAgICBhbGlhc2VzOiBbICdycycgXSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAgJHBhdHRlcm46IGhsanMuSURFTlRfUkUgKyAnIT8nLFxuICAgICAgdHlwZTogVFlQRVMsXG4gICAgICBrZXl3b3JkOiBLRVlXT1JEUyxcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgICAgYnVpbHRfaW46IEJVSUxUSU5TXG4gICAgfSxcbiAgICBpbGxlZ2FsOiAnPC8nLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkNfTElORV9DT01NRU5UX01PREUsXG4gICAgICBobGpzLkNPTU1FTlQoJy9cXFxcKicsICdcXFxcKi8nLCB7IGNvbnRhaW5zOiBbICdzZWxmJyBdIH0pLFxuICAgICAgaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHtcbiAgICAgICAgYmVnaW46IC9iP1wiLyxcbiAgICAgICAgaWxsZWdhbDogbnVsbFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgeyBiZWdpbjogL2I/cigjKilcIigufFxcbikqP1wiXFwxKD8hIykvIH0sXG4gICAgICAgICAgeyBiZWdpbjogL2I/J1xcXFw/KHhcXHd7Mn18dVxcd3s0fXxVXFx3ezh9fC4pJy8gfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdzeW1ib2wnLFxuICAgICAgICBiZWdpbjogLydbYS16QS1aX11bYS16QS1aMC05X10qL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbnVtYmVyJyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7IGJlZ2luOiAnXFxcXGIwYihbMDFfXSspJyArIE5VTUJFUl9TVUZGSVggfSxcbiAgICAgICAgICB7IGJlZ2luOiAnXFxcXGIwbyhbMC03X10rKScgKyBOVU1CRVJfU1VGRklYIH0sXG4gICAgICAgICAgeyBiZWdpbjogJ1xcXFxiMHgoW0EtRmEtZjAtOV9dKyknICsgTlVNQkVSX1NVRkZJWCB9LFxuICAgICAgICAgIHsgYmVnaW46ICdcXFxcYihcXFxcZFtcXFxcZF9dKihcXFxcLlswLTlfXSspPyhbZUVdWystXT9bMC05X10rKT8pJ1xuICAgICAgICAgICAgICAgICAgICsgTlVNQkVSX1NVRkZJWCB9XG4gICAgICAgIF0sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvZm4vLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBobGpzLlVOREVSU0NPUkVfSURFTlRfUkVcbiAgICAgICAgXSxcbiAgICAgICAgY2xhc3NOYW1lOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICBiZWdpbjogJyMhP1xcXFxbJyxcbiAgICAgICAgZW5kOiAnXFxcXF0nLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICAgICAgICBiZWdpbjogL1wiLyxcbiAgICAgICAgICAgIGVuZDogL1wiL1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvbGV0LyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgLyg/Om11dFxccyspPy8sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDQ6IFwidmFyaWFibGVcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gbXVzdCBjb21lIGJlZm9yZSBpbXBsL2ZvciBydWxlIGxhdGVyXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiBbXG4gICAgICAgICAgL2Zvci8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgL2luL1xuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInZhcmlhYmxlXCIsXG4gICAgICAgICAgNTogXCJrZXl3b3JkXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvdHlwZS8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRVxuICAgICAgICBdLFxuICAgICAgICBjbGFzc05hbWU6IHtcbiAgICAgICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgICAgICAzOiBcInRpdGxlLmNsYXNzXCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IFtcbiAgICAgICAgICAvKD86dHJhaXR8ZW51bXxzdHJ1Y3R8dW5pb258aW1wbHxmb3IpLyxcbiAgICAgICAgICAvXFxzKy8sXG4gICAgICAgICAgaGxqcy5VTkRFUlNDT1JFX0lERU5UX1JFXG4gICAgICAgIF0sXG4gICAgICAgIGNsYXNzTmFtZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidGl0bGUuY2xhc3NcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogaGxqcy5JREVOVF9SRSArICc6OicsXG4gICAgICAgIGtleXdvcmRzOiB7XG4gICAgICAgICAga2V5d29yZDogXCJTZWxmXCIsXG4gICAgICAgICAgYnVpbHRfaW46IEJVSUxUSU5TLFxuICAgICAgICAgIHR5cGU6IFRZUEVTXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJwdW5jdHVhdGlvblwiLFxuICAgICAgICBiZWdpbjogJy0+J1xuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX0lOVk9LRVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgcnVzdCBhcyBkZWZhdWx0IH07XG4iLCAiY29uc3QgTU9ERVMgPSAoaGxqcykgPT4ge1xuICByZXR1cm4ge1xuICAgIElNUE9SVEFOVDoge1xuICAgICAgc2NvcGU6ICdtZXRhJyxcbiAgICAgIGJlZ2luOiAnIWltcG9ydGFudCdcbiAgICB9LFxuICAgIEJMT0NLX0NPTU1FTlQ6IGhsanMuQ19CTE9DS19DT01NRU5UX01PREUsXG4gICAgSEVYQ09MT1I6IHtcbiAgICAgIHNjb3BlOiAnbnVtYmVyJyxcbiAgICAgIGJlZ2luOiAvIygoWzAtOWEtZkEtRl17Myw0fSl8KChbMC05YS1mQS1GXXsyfSl7Myw0fSkpXFxiL1xuICAgIH0sXG4gICAgRlVOQ1RJT05fRElTUEFUQ0g6IHtcbiAgICAgIGNsYXNzTmFtZTogXCJidWlsdF9pblwiLFxuICAgICAgYmVnaW46IC9bXFx3LV0rKD89XFwoKS9cbiAgICB9LFxuICAgIEFUVFJJQlVURV9TRUxFQ1RPUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ3NlbGVjdG9yLWF0dHInLFxuICAgICAgYmVnaW46IC9cXFsvLFxuICAgICAgZW5kOiAvXFxdLyxcbiAgICAgIGlsbGVnYWw6ICckJyxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIGhsanMuQVBPU19TVFJJTkdfTU9ERSxcbiAgICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERVxuICAgICAgXVxuICAgIH0sXG4gICAgQ1NTX05VTUJFUl9NT0RFOiB7XG4gICAgICBzY29wZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogaGxqcy5OVU1CRVJfUkUgKyAnKCcgK1xuICAgICAgICAnJXxlbXxleHxjaHxyZW0nICtcbiAgICAgICAgJ3x2d3x2aHx2bWlufHZtYXgnICtcbiAgICAgICAgJ3xjbXxtbXxpbnxwdHxwY3xweCcgK1xuICAgICAgICAnfGRlZ3xncmFkfHJhZHx0dXJuJyArXG4gICAgICAgICd8c3xtcycgK1xuICAgICAgICAnfEh6fGtIeicgK1xuICAgICAgICAnfGRwaXxkcGNtfGRwcHgnICtcbiAgICAgICAgJyk/JyxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgQ1NTX1ZBUklBQkxFOiB7XG4gICAgICBjbGFzc05hbWU6IFwiYXR0clwiLFxuICAgICAgYmVnaW46IC8tLVtBLVphLXpdW0EtWmEtejAtOV8tXSovXG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgVEFHUyA9IFtcbiAgJ2EnLFxuICAnYWJicicsXG4gICdhZGRyZXNzJyxcbiAgJ2FydGljbGUnLFxuICAnYXNpZGUnLFxuICAnYXVkaW8nLFxuICAnYicsXG4gICdibG9ja3F1b3RlJyxcbiAgJ2JvZHknLFxuICAnYnV0dG9uJyxcbiAgJ2NhbnZhcycsXG4gICdjYXB0aW9uJyxcbiAgJ2NpdGUnLFxuICAnY29kZScsXG4gICdkZCcsXG4gICdkZWwnLFxuICAnZGV0YWlscycsXG4gICdkZm4nLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2VtJyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWRlcicsXG4gICdoZ3JvdXAnLFxuICAnaHRtbCcsXG4gICdpJyxcbiAgJ2lmcmFtZScsXG4gICdpbWcnLFxuICAnaW5wdXQnLFxuICAnaW5zJyxcbiAgJ2tiZCcsXG4gICdsYWJlbCcsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbWFpbicsXG4gICdtYXJrJyxcbiAgJ21lbnUnLFxuICAnbmF2JyxcbiAgJ29iamVjdCcsXG4gICdvbCcsXG4gICdwJyxcbiAgJ3EnLFxuICAncXVvdGUnLFxuICAnc2FtcCcsXG4gICdzZWN0aW9uJyxcbiAgJ3NwYW4nLFxuICAnc3Ryb25nJyxcbiAgJ3N1bW1hcnknLFxuICAnc3VwJyxcbiAgJ3RhYmxlJyxcbiAgJ3Rib2R5JyxcbiAgJ3RkJyxcbiAgJ3RleHRhcmVhJyxcbiAgJ3Rmb290JyxcbiAgJ3RoJyxcbiAgJ3RoZWFkJyxcbiAgJ3RpbWUnLFxuICAndHInLFxuICAndWwnLFxuICAndmFyJyxcbiAgJ3ZpZGVvJ1xuXTtcblxuY29uc3QgTUVESUFfRkVBVFVSRVMgPSBbXG4gICdhbnktaG92ZXInLFxuICAnYW55LXBvaW50ZXInLFxuICAnYXNwZWN0LXJhdGlvJyxcbiAgJ2NvbG9yJyxcbiAgJ2NvbG9yLWdhbXV0JyxcbiAgJ2NvbG9yLWluZGV4JyxcbiAgJ2RldmljZS1hc3BlY3QtcmF0aW8nLFxuICAnZGV2aWNlLWhlaWdodCcsXG4gICdkZXZpY2Utd2lkdGgnLFxuICAnZGlzcGxheS1tb2RlJyxcbiAgJ2ZvcmNlZC1jb2xvcnMnLFxuICAnZ3JpZCcsXG4gICdoZWlnaHQnLFxuICAnaG92ZXInLFxuICAnaW52ZXJ0ZWQtY29sb3JzJyxcbiAgJ21vbm9jaHJvbWUnLFxuICAnb3JpZW50YXRpb24nLFxuICAnb3ZlcmZsb3ctYmxvY2snLFxuICAnb3ZlcmZsb3ctaW5saW5lJyxcbiAgJ3BvaW50ZXInLFxuICAncHJlZmVycy1jb2xvci1zY2hlbWUnLFxuICAncHJlZmVycy1jb250cmFzdCcsXG4gICdwcmVmZXJzLXJlZHVjZWQtbW90aW9uJyxcbiAgJ3ByZWZlcnMtcmVkdWNlZC10cmFuc3BhcmVuY3knLFxuICAncmVzb2x1dGlvbicsXG4gICdzY2FuJyxcbiAgJ3NjcmlwdGluZycsXG4gICd1cGRhdGUnLFxuICAnd2lkdGgnLFxuICAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uP1xuICAnbWluLXdpZHRoJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21heC1oZWlnaHQnXG5dO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvUHNldWRvLWNsYXNzZXNcbmNvbnN0IFBTRVVET19DTEFTU0VTID0gW1xuICAnYWN0aXZlJyxcbiAgJ2FueS1saW5rJyxcbiAgJ2JsYW5rJyxcbiAgJ2NoZWNrZWQnLFxuICAnY3VycmVudCcsXG4gICdkZWZhdWx0JyxcbiAgJ2RlZmluZWQnLFxuICAnZGlyJywgLy8gZGlyKClcbiAgJ2Rpc2FibGVkJyxcbiAgJ2Ryb3AnLFxuICAnZW1wdHknLFxuICAnZW5hYmxlZCcsXG4gICdmaXJzdCcsXG4gICdmaXJzdC1jaGlsZCcsXG4gICdmaXJzdC1vZi10eXBlJyxcbiAgJ2Z1bGxzY3JlZW4nLFxuICAnZnV0dXJlJyxcbiAgJ2ZvY3VzJyxcbiAgJ2ZvY3VzLXZpc2libGUnLFxuICAnZm9jdXMtd2l0aGluJyxcbiAgJ2hhcycsIC8vIGhhcygpXG4gICdob3N0JywgLy8gaG9zdCBvciBob3N0KClcbiAgJ2hvc3QtY29udGV4dCcsIC8vIGhvc3QtY29udGV4dCgpXG4gICdob3ZlcicsXG4gICdpbmRldGVybWluYXRlJyxcbiAgJ2luLXJhbmdlJyxcbiAgJ2ludmFsaWQnLFxuICAnaXMnLCAvLyBpcygpXG4gICdsYW5nJywgLy8gbGFuZygpXG4gICdsYXN0LWNoaWxkJyxcbiAgJ2xhc3Qtb2YtdHlwZScsXG4gICdsZWZ0JyxcbiAgJ2xpbmsnLFxuICAnbG9jYWwtbGluaycsXG4gICdub3QnLCAvLyBub3QoKVxuICAnbnRoLWNoaWxkJywgLy8gbnRoLWNoaWxkKClcbiAgJ250aC1jb2wnLCAvLyBudGgtY29sKClcbiAgJ250aC1sYXN0LWNoaWxkJywgLy8gbnRoLWxhc3QtY2hpbGQoKVxuICAnbnRoLWxhc3QtY29sJywgLy8gbnRoLWxhc3QtY29sKClcbiAgJ250aC1sYXN0LW9mLXR5cGUnLCAvL250aC1sYXN0LW9mLXR5cGUoKVxuICAnbnRoLW9mLXR5cGUnLCAvL250aC1vZi10eXBlKClcbiAgJ29ubHktY2hpbGQnLFxuICAnb25seS1vZi10eXBlJyxcbiAgJ29wdGlvbmFsJyxcbiAgJ291dC1vZi1yYW5nZScsXG4gICdwYXN0JyxcbiAgJ3BsYWNlaG9sZGVyLXNob3duJyxcbiAgJ3JlYWQtb25seScsXG4gICdyZWFkLXdyaXRlJyxcbiAgJ3JlcXVpcmVkJyxcbiAgJ3JpZ2h0JyxcbiAgJ3Jvb3QnLFxuICAnc2NvcGUnLFxuICAndGFyZ2V0JyxcbiAgJ3RhcmdldC13aXRoaW4nLFxuICAndXNlci1pbnZhbGlkJyxcbiAgJ3ZhbGlkJyxcbiAgJ3Zpc2l0ZWQnLFxuICAnd2hlcmUnIC8vIHdoZXJlKClcbl07XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Qc2V1ZG8tZWxlbWVudHNcbmNvbnN0IFBTRVVET19FTEVNRU5UUyA9IFtcbiAgJ2FmdGVyJyxcbiAgJ2JhY2tkcm9wJyxcbiAgJ2JlZm9yZScsXG4gICdjdWUnLFxuICAnY3VlLXJlZ2lvbicsXG4gICdmaXJzdC1sZXR0ZXInLFxuICAnZmlyc3QtbGluZScsXG4gICdncmFtbWFyLWVycm9yJyxcbiAgJ21hcmtlcicsXG4gICdwYXJ0JyxcbiAgJ3BsYWNlaG9sZGVyJyxcbiAgJ3NlbGVjdGlvbicsXG4gICdzbG90dGVkJyxcbiAgJ3NwZWxsaW5nLWVycm9yJ1xuXTtcblxuY29uc3QgQVRUUklCVVRFUyA9IFtcbiAgJ2FsaWduLWNvbnRlbnQnLFxuICAnYWxpZ24taXRlbXMnLFxuICAnYWxpZ24tc2VsZicsXG4gICdhbGwnLFxuICAnYW5pbWF0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kZWxheScsXG4gICdhbmltYXRpb24tZGlyZWN0aW9uJyxcbiAgJ2FuaW1hdGlvbi1kdXJhdGlvbicsXG4gICdhbmltYXRpb24tZmlsbC1tb2RlJyxcbiAgJ2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQnLFxuICAnYW5pbWF0aW9uLW5hbWUnLFxuICAnYW5pbWF0aW9uLXBsYXktc3RhdGUnLFxuICAnYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbicsXG4gICdiYWNrZmFjZS12aXNpYmlsaXR5JyxcbiAgJ2JhY2tncm91bmQnLFxuICAnYmFja2dyb3VuZC1hdHRhY2htZW50JyxcbiAgJ2JhY2tncm91bmQtYmxlbmQtbW9kZScsXG4gICdiYWNrZ3JvdW5kLWNsaXAnLFxuICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICdiYWNrZ3JvdW5kLWltYWdlJyxcbiAgJ2JhY2tncm91bmQtb3JpZ2luJyxcbiAgJ2JhY2tncm91bmQtcG9zaXRpb24nLFxuICAnYmFja2dyb3VuZC1yZXBlYXQnLFxuICAnYmFja2dyb3VuZC1zaXplJyxcbiAgJ2Jsb2NrLXNpemUnLFxuICAnYm9yZGVyJyxcbiAgJ2JvcmRlci1ibG9jaycsXG4gICdib3JkZXItYmxvY2stY29sb3InLFxuICAnYm9yZGVyLWJsb2NrLWVuZCcsXG4gICdib3JkZXItYmxvY2stZW5kLWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWJsb2NrLWVuZC13aWR0aCcsXG4gICdib3JkZXItYmxvY2stc3RhcnQnLFxuICAnYm9yZGVyLWJsb2NrLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1ibG9jay1zdGFydC1zdHlsZScsXG4gICdib3JkZXItYmxvY2stc3RhcnQtd2lkdGgnLFxuICAnYm9yZGVyLWJsb2NrLXN0eWxlJyxcbiAgJ2JvcmRlci1ibG9jay13aWR0aCcsXG4gICdib3JkZXItYm90dG9tJyxcbiAgJ2JvcmRlci1ib3R0b20tY29sb3InLFxuICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cycsXG4gICdib3JkZXItYm90dG9tLXN0eWxlJyxcbiAgJ2JvcmRlci1ib3R0b20td2lkdGgnLFxuICAnYm9yZGVyLWNvbGxhcHNlJyxcbiAgJ2JvcmRlci1jb2xvcicsXG4gICdib3JkZXItaW1hZ2UnLFxuICAnYm9yZGVyLWltYWdlLW91dHNldCcsXG4gICdib3JkZXItaW1hZ2UtcmVwZWF0JyxcbiAgJ2JvcmRlci1pbWFnZS1zbGljZScsXG4gICdib3JkZXItaW1hZ2Utc291cmNlJyxcbiAgJ2JvcmRlci1pbWFnZS13aWR0aCcsXG4gICdib3JkZXItaW5saW5lJyxcbiAgJ2JvcmRlci1pbmxpbmUtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtY29sb3InLFxuICAnYm9yZGVyLWlubGluZS1lbmQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1lbmQtd2lkdGgnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydCcsXG4gICdib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yJyxcbiAgJ2JvcmRlci1pbmxpbmUtc3RhcnQtc3R5bGUnLFxuICAnYm9yZGVyLWlubGluZS1zdGFydC13aWR0aCcsXG4gICdib3JkZXItaW5saW5lLXN0eWxlJyxcbiAgJ2JvcmRlci1pbmxpbmUtd2lkdGgnLFxuICAnYm9yZGVyLWxlZnQnLFxuICAnYm9yZGVyLWxlZnQtY29sb3InLFxuICAnYm9yZGVyLWxlZnQtc3R5bGUnLFxuICAnYm9yZGVyLWxlZnQtd2lkdGgnLFxuICAnYm9yZGVyLXJhZGl1cycsXG4gICdib3JkZXItcmlnaHQnLFxuICAnYm9yZGVyLXJpZ2h0LWNvbG9yJyxcbiAgJ2JvcmRlci1yaWdodC1zdHlsZScsXG4gICdib3JkZXItcmlnaHQtd2lkdGgnLFxuICAnYm9yZGVyLXNwYWNpbmcnLFxuICAnYm9yZGVyLXN0eWxlJyxcbiAgJ2JvcmRlci10b3AnLFxuICAnYm9yZGVyLXRvcC1jb2xvcicsXG4gICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJyxcbiAgJ2JvcmRlci10b3Atc3R5bGUnLFxuICAnYm9yZGVyLXRvcC13aWR0aCcsXG4gICdib3JkZXItd2lkdGgnLFxuICAnYm90dG9tJyxcbiAgJ2JveC1kZWNvcmF0aW9uLWJyZWFrJyxcbiAgJ2JveC1zaGFkb3cnLFxuICAnYm94LXNpemluZycsXG4gICdicmVhay1hZnRlcicsXG4gICdicmVhay1iZWZvcmUnLFxuICAnYnJlYWstaW5zaWRlJyxcbiAgJ2NhcHRpb24tc2lkZScsXG4gICdjYXJldC1jb2xvcicsXG4gICdjbGVhcicsXG4gICdjbGlwJyxcbiAgJ2NsaXAtcGF0aCcsXG4gICdjbGlwLXJ1bGUnLFxuICAnY29sb3InLFxuICAnY29sdW1uLWNvdW50JyxcbiAgJ2NvbHVtbi1maWxsJyxcbiAgJ2NvbHVtbi1nYXAnLFxuICAnY29sdW1uLXJ1bGUnLFxuICAnY29sdW1uLXJ1bGUtY29sb3InLFxuICAnY29sdW1uLXJ1bGUtc3R5bGUnLFxuICAnY29sdW1uLXJ1bGUtd2lkdGgnLFxuICAnY29sdW1uLXNwYW4nLFxuICAnY29sdW1uLXdpZHRoJyxcbiAgJ2NvbHVtbnMnLFxuICAnY29udGFpbicsXG4gICdjb250ZW50JyxcbiAgJ2NvbnRlbnQtdmlzaWJpbGl0eScsXG4gICdjb3VudGVyLWluY3JlbWVudCcsXG4gICdjb3VudGVyLXJlc2V0JyxcbiAgJ2N1ZScsXG4gICdjdWUtYWZ0ZXInLFxuICAnY3VlLWJlZm9yZScsXG4gICdjdXJzb3InLFxuICAnZGlyZWN0aW9uJyxcbiAgJ2Rpc3BsYXknLFxuICAnZW1wdHktY2VsbHMnLFxuICAnZmlsdGVyJyxcbiAgJ2ZsZXgnLFxuICAnZmxleC1iYXNpcycsXG4gICdmbGV4LWRpcmVjdGlvbicsXG4gICdmbGV4LWZsb3cnLFxuICAnZmxleC1ncm93JyxcbiAgJ2ZsZXgtc2hyaW5rJyxcbiAgJ2ZsZXgtd3JhcCcsXG4gICdmbG9hdCcsXG4gICdmbG93JyxcbiAgJ2ZvbnQnLFxuICAnZm9udC1kaXNwbGF5JyxcbiAgJ2ZvbnQtZmFtaWx5JyxcbiAgJ2ZvbnQtZmVhdHVyZS1zZXR0aW5ncycsXG4gICdmb250LWtlcm5pbmcnLFxuICAnZm9udC1sYW5ndWFnZS1vdmVycmlkZScsXG4gICdmb250LXNpemUnLFxuICAnZm9udC1zaXplLWFkanVzdCcsXG4gICdmb250LXNtb290aGluZycsXG4gICdmb250LXN0cmV0Y2gnLFxuICAnZm9udC1zdHlsZScsXG4gICdmb250LXN5bnRoZXNpcycsXG4gICdmb250LXZhcmlhbnQnLFxuICAnZm9udC12YXJpYW50LWNhcHMnLFxuICAnZm9udC12YXJpYW50LWVhc3QtYXNpYW4nLFxuICAnZm9udC12YXJpYW50LWxpZ2F0dXJlcycsXG4gICdmb250LXZhcmlhbnQtbnVtZXJpYycsXG4gICdmb250LXZhcmlhbnQtcG9zaXRpb24nLFxuICAnZm9udC12YXJpYXRpb24tc2V0dGluZ3MnLFxuICAnZm9udC13ZWlnaHQnLFxuICAnZ2FwJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJyxcbiAgJ2dyaWQnLFxuICAnZ3JpZC1hcmVhJyxcbiAgJ2dyaWQtYXV0by1jb2x1bW5zJyxcbiAgJ2dyaWQtYXV0by1mbG93JyxcbiAgJ2dyaWQtYXV0by1yb3dzJyxcbiAgJ2dyaWQtY29sdW1uJyxcbiAgJ2dyaWQtY29sdW1uLWVuZCcsXG4gICdncmlkLWNvbHVtbi1zdGFydCcsXG4gICdncmlkLWdhcCcsXG4gICdncmlkLXJvdycsXG4gICdncmlkLXJvdy1lbmQnLFxuICAnZ3JpZC1yb3ctc3RhcnQnLFxuICAnZ3JpZC10ZW1wbGF0ZScsXG4gICdncmlkLXRlbXBsYXRlLWFyZWFzJyxcbiAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsXG4gICdncmlkLXRlbXBsYXRlLXJvd3MnLFxuICAnaGFuZ2luZy1wdW5jdHVhdGlvbicsXG4gICdoZWlnaHQnLFxuICAnaHlwaGVucycsXG4gICdpY29uJyxcbiAgJ2ltYWdlLW9yaWVudGF0aW9uJyxcbiAgJ2ltYWdlLXJlbmRlcmluZycsXG4gICdpbWFnZS1yZXNvbHV0aW9uJyxcbiAgJ2ltZS1tb2RlJyxcbiAgJ2lubGluZS1zaXplJyxcbiAgJ2lzb2xhdGlvbicsXG4gICdqdXN0aWZ5LWNvbnRlbnQnLFxuICAnbGVmdCcsXG4gICdsZXR0ZXItc3BhY2luZycsXG4gICdsaW5lLWJyZWFrJyxcbiAgJ2xpbmUtaGVpZ2h0JyxcbiAgJ2xpc3Qtc3R5bGUnLFxuICAnbGlzdC1zdHlsZS1pbWFnZScsXG4gICdsaXN0LXN0eWxlLXBvc2l0aW9uJyxcbiAgJ2xpc3Qtc3R5bGUtdHlwZScsXG4gICdtYXJnaW4nLFxuICAnbWFyZ2luLWJsb2NrJyxcbiAgJ21hcmdpbi1ibG9jay1lbmQnLFxuICAnbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ21hcmdpbi1ib3R0b20nLFxuICAnbWFyZ2luLWlubGluZScsXG4gICdtYXJnaW4taW5saW5lLWVuZCcsXG4gICdtYXJnaW4taW5saW5lLXN0YXJ0JyxcbiAgJ21hcmdpbi1sZWZ0JyxcbiAgJ21hcmdpbi1yaWdodCcsXG4gICdtYXJnaW4tdG9wJyxcbiAgJ21hcmtzJyxcbiAgJ21hc2snLFxuICAnbWFzay1ib3JkZXInLFxuICAnbWFzay1ib3JkZXItbW9kZScsXG4gICdtYXNrLWJvcmRlci1vdXRzZXQnLFxuICAnbWFzay1ib3JkZXItcmVwZWF0JyxcbiAgJ21hc2stYm9yZGVyLXNsaWNlJyxcbiAgJ21hc2stYm9yZGVyLXNvdXJjZScsXG4gICdtYXNrLWJvcmRlci13aWR0aCcsXG4gICdtYXNrLWNsaXAnLFxuICAnbWFzay1jb21wb3NpdGUnLFxuICAnbWFzay1pbWFnZScsXG4gICdtYXNrLW1vZGUnLFxuICAnbWFzay1vcmlnaW4nLFxuICAnbWFzay1wb3NpdGlvbicsXG4gICdtYXNrLXJlcGVhdCcsXG4gICdtYXNrLXNpemUnLFxuICAnbWFzay10eXBlJyxcbiAgJ21heC1ibG9jay1zaXplJyxcbiAgJ21heC1oZWlnaHQnLFxuICAnbWF4LWlubGluZS1zaXplJyxcbiAgJ21heC13aWR0aCcsXG4gICdtaW4tYmxvY2stc2l6ZScsXG4gICdtaW4taGVpZ2h0JyxcbiAgJ21pbi1pbmxpbmUtc2l6ZScsXG4gICdtaW4td2lkdGgnLFxuICAnbWl4LWJsZW5kLW1vZGUnLFxuICAnbmF2LWRvd24nLFxuICAnbmF2LWluZGV4JyxcbiAgJ25hdi1sZWZ0JyxcbiAgJ25hdi1yaWdodCcsXG4gICduYXYtdXAnLFxuICAnbm9uZScsXG4gICdub3JtYWwnLFxuICAnb2JqZWN0LWZpdCcsXG4gICdvYmplY3QtcG9zaXRpb24nLFxuICAnb3BhY2l0eScsXG4gICdvcmRlcicsXG4gICdvcnBoYW5zJyxcbiAgJ291dGxpbmUnLFxuICAnb3V0bGluZS1jb2xvcicsXG4gICdvdXRsaW5lLW9mZnNldCcsXG4gICdvdXRsaW5lLXN0eWxlJyxcbiAgJ291dGxpbmUtd2lkdGgnLFxuICAnb3ZlcmZsb3cnLFxuICAnb3ZlcmZsb3ctd3JhcCcsXG4gICdvdmVyZmxvdy14JyxcbiAgJ292ZXJmbG93LXknLFxuICAncGFkZGluZycsXG4gICdwYWRkaW5nLWJsb2NrJyxcbiAgJ3BhZGRpbmctYmxvY2stZW5kJyxcbiAgJ3BhZGRpbmctYmxvY2stc3RhcnQnLFxuICAncGFkZGluZy1ib3R0b20nLFxuICAncGFkZGluZy1pbmxpbmUnLFxuICAncGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3BhZGRpbmctaW5saW5lLXN0YXJ0JyxcbiAgJ3BhZGRpbmctbGVmdCcsXG4gICdwYWRkaW5nLXJpZ2h0JyxcbiAgJ3BhZGRpbmctdG9wJyxcbiAgJ3BhZ2UtYnJlYWstYWZ0ZXInLFxuICAncGFnZS1icmVhay1iZWZvcmUnLFxuICAncGFnZS1icmVhay1pbnNpZGUnLFxuICAncGF1c2UnLFxuICAncGF1c2UtYWZ0ZXInLFxuICAncGF1c2UtYmVmb3JlJyxcbiAgJ3BlcnNwZWN0aXZlJyxcbiAgJ3BlcnNwZWN0aXZlLW9yaWdpbicsXG4gICdwb2ludGVyLWV2ZW50cycsXG4gICdwb3NpdGlvbicsXG4gICdxdW90ZXMnLFxuICAncmVzaXplJyxcbiAgJ3Jlc3QnLFxuICAncmVzdC1hZnRlcicsXG4gICdyZXN0LWJlZm9yZScsXG4gICdyaWdodCcsXG4gICdyb3ctZ2FwJyxcbiAgJ3Njcm9sbC1tYXJnaW4nLFxuICAnc2Nyb2xsLW1hcmdpbi1ibG9jaycsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWJsb2NrLXN0YXJ0JyxcbiAgJ3Njcm9sbC1tYXJnaW4tYm90dG9tJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lJyxcbiAgJ3Njcm9sbC1tYXJnaW4taW5saW5lLWVuZCcsXG4gICdzY3JvbGwtbWFyZ2luLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtbWFyZ2luLWxlZnQnLFxuICAnc2Nyb2xsLW1hcmdpbi1yaWdodCcsXG4gICdzY3JvbGwtbWFyZ2luLXRvcCcsXG4gICdzY3JvbGwtcGFkZGluZycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jaycsXG4gICdzY3JvbGwtcGFkZGluZy1ibG9jay1lbmQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYmxvY2stc3RhcnQnLFxuICAnc2Nyb2xsLXBhZGRpbmctYm90dG9tJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZScsXG4gICdzY3JvbGwtcGFkZGluZy1pbmxpbmUtZW5kJyxcbiAgJ3Njcm9sbC1wYWRkaW5nLWlubGluZS1zdGFydCcsXG4gICdzY3JvbGwtcGFkZGluZy1sZWZ0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXJpZ2h0JyxcbiAgJ3Njcm9sbC1wYWRkaW5nLXRvcCcsXG4gICdzY3JvbGwtc25hcC1hbGlnbicsXG4gICdzY3JvbGwtc25hcC1zdG9wJyxcbiAgJ3Njcm9sbC1zbmFwLXR5cGUnLFxuICAnc2Nyb2xsYmFyLWNvbG9yJyxcbiAgJ3Njcm9sbGJhci1ndXR0ZXInLFxuICAnc2Nyb2xsYmFyLXdpZHRoJyxcbiAgJ3NoYXBlLWltYWdlLXRocmVzaG9sZCcsXG4gICdzaGFwZS1tYXJnaW4nLFxuICAnc2hhcGUtb3V0c2lkZScsXG4gICdzcGVhaycsXG4gICdzcGVhay1hcycsXG4gICdzcmMnLCAvLyBAZm9udC1mYWNlXG4gICd0YWItc2l6ZScsXG4gICd0YWJsZS1sYXlvdXQnLFxuICAndGV4dC1hbGlnbicsXG4gICd0ZXh0LWFsaWduLWFsbCcsXG4gICd0ZXh0LWFsaWduLWxhc3QnLFxuICAndGV4dC1jb21iaW5lLXVwcmlnaHQnLFxuICAndGV4dC1kZWNvcmF0aW9uJyxcbiAgJ3RleHQtZGVjb3JhdGlvbi1jb2xvcicsXG4gICd0ZXh0LWRlY29yYXRpb24tbGluZScsXG4gICd0ZXh0LWRlY29yYXRpb24tc3R5bGUnLFxuICAndGV4dC1lbXBoYXNpcycsXG4gICd0ZXh0LWVtcGhhc2lzLWNvbG9yJyxcbiAgJ3RleHQtZW1waGFzaXMtcG9zaXRpb24nLFxuICAndGV4dC1lbXBoYXNpcy1zdHlsZScsXG4gICd0ZXh0LWluZGVudCcsXG4gICd0ZXh0LWp1c3RpZnknLFxuICAndGV4dC1vcmllbnRhdGlvbicsXG4gICd0ZXh0LW92ZXJmbG93JyxcbiAgJ3RleHQtcmVuZGVyaW5nJyxcbiAgJ3RleHQtc2hhZG93JyxcbiAgJ3RleHQtdHJhbnNmb3JtJyxcbiAgJ3RleHQtdW5kZXJsaW5lLXBvc2l0aW9uJyxcbiAgJ3RvcCcsXG4gICd0cmFuc2Zvcm0nLFxuICAndHJhbnNmb3JtLWJveCcsXG4gICd0cmFuc2Zvcm0tb3JpZ2luJyxcbiAgJ3RyYW5zZm9ybS1zdHlsZScsXG4gICd0cmFuc2l0aW9uJyxcbiAgJ3RyYW5zaXRpb24tZGVsYXknLFxuICAndHJhbnNpdGlvbi1kdXJhdGlvbicsXG4gICd0cmFuc2l0aW9uLXByb3BlcnR5JyxcbiAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgJ3VuaWNvZGUtYmlkaScsXG4gICd2ZXJ0aWNhbC1hbGlnbicsXG4gICd2aXNpYmlsaXR5JyxcbiAgJ3ZvaWNlLWJhbGFuY2UnLFxuICAndm9pY2UtZHVyYXRpb24nLFxuICAndm9pY2UtZmFtaWx5JyxcbiAgJ3ZvaWNlLXBpdGNoJyxcbiAgJ3ZvaWNlLXJhbmdlJyxcbiAgJ3ZvaWNlLXJhdGUnLFxuICAndm9pY2Utc3RyZXNzJyxcbiAgJ3ZvaWNlLXZvbHVtZScsXG4gICd3aGl0ZS1zcGFjZScsXG4gICd3aWRvd3MnLFxuICAnd2lkdGgnLFxuICAnd2lsbC1jaGFuZ2UnLFxuICAnd29yZC1icmVhaycsXG4gICd3b3JkLXNwYWNpbmcnLFxuICAnd29yZC13cmFwJyxcbiAgJ3dyaXRpbmctbW9kZScsXG4gICd6LWluZGV4J1xuICAvLyByZXZlcnNlIG1ha2VzIHN1cmUgbG9uZ2VyIGF0dHJpYnV0ZXMgYGZvbnQtd2VpZ2h0YCBhcmUgbWF0Y2hlZCBmdWxseVxuICAvLyBpbnN0ZWFkIG9mIGdldHRpbmcgZmFsc2UgcG9zaXRpdmVzIG9uIHNheSBgZm9udGBcbl0ucmV2ZXJzZSgpO1xuXG4vKlxuTGFuZ3VhZ2U6IFNDU1NcbkRlc2NyaXB0aW9uOiBTY3NzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgc3ludGF4IG9mIENTUy5cbkF1dGhvcjogS3VydCBFbWNoIDxrdXJ0QGt1cnRlbWNoLmNvbT5cbldlYnNpdGU6IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbVxuQ2F0ZWdvcnk6IGNvbW1vbiwgY3NzLCB3ZWJcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBzY3NzKGhsanMpIHtcbiAgY29uc3QgbW9kZXMgPSBNT0RFUyhobGpzKTtcbiAgY29uc3QgUFNFVURPX0VMRU1FTlRTJDEgPSBQU0VVRE9fRUxFTUVOVFM7XG4gIGNvbnN0IFBTRVVET19DTEFTU0VTJDEgPSBQU0VVRE9fQ0xBU1NFUztcblxuICBjb25zdCBBVF9JREVOVElGSUVSID0gJ0BbYS16LV0rJzsgLy8gQGZvbnQtZmFjZVxuICBjb25zdCBBVF9NT0RJRklFUlMgPSBcImFuZCBvciBub3Qgb25seVwiO1xuICBjb25zdCBJREVOVF9SRSA9ICdbYS16QS1aLV1bYS16QS1aMC05Xy1dKic7XG4gIGNvbnN0IFZBUklBQkxFID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICBiZWdpbjogJyhcXFxcJCcgKyBJREVOVF9SRSArICcpXFxcXGInLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1NDU1MnLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgaWxsZWdhbDogJ1s9L3xcXCddJyxcbiAgICBjb250YWluczogW1xuICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIC8vIHRvIHJlY29nbml6ZSBrZXlmcmFtZSA0MCUgZXRjIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiBvdXJcbiAgICAgIC8vIGF0dHJpYnV0ZSB2YWx1ZSBtb2RlXG4gICAgICBtb2Rlcy5DU1NfTlVNQkVSX01PREUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLWlkJyxcbiAgICAgICAgYmVnaW46ICcjW0EtWmEtejAtOV8tXSsnLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLWNsYXNzJyxcbiAgICAgICAgYmVnaW46ICdcXFxcLltBLVphLXowLTlfLV0rJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgbW9kZXMuQVRUUklCVVRFX1NFTEVDVE9SX01PREUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXRhZycsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIFRBR1Muam9pbignfCcpICsgJylcXFxcYicsXG4gICAgICAgIC8vIHdhcyB0aGVyZSwgYmVmb3JlLCBidXQgd2h5P1xuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXBzZXVkbycsXG4gICAgICAgIGJlZ2luOiAnOignICsgUFNFVURPX0NMQVNTRVMkMS5qb2luKCd8JykgKyAnKSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3NlbGVjdG9yLXBzZXVkbycsXG4gICAgICAgIGJlZ2luOiAnOig6KT8oJyArIFBTRVVET19FTEVNRU5UUyQxLmpvaW4oJ3wnKSArICcpJ1xuICAgICAgfSxcbiAgICAgIFZBUklBQkxFLFxuICAgICAgeyAvLyBwc2V1ZG8tc2VsZWN0b3IgcGFyYW1zXG4gICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgY29udGFpbnM6IFsgbW9kZXMuQ1NTX05VTUJFUl9NT0RFIF1cbiAgICAgIH0sXG4gICAgICBtb2Rlcy5DU1NfVkFSSUFCTEUsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2F0dHJpYnV0ZScsXG4gICAgICAgIGJlZ2luOiAnXFxcXGIoJyArIEFUVFJJQlVURVMuam9pbignfCcpICsgJylcXFxcYidcbiAgICAgIH0sXG4gICAgICB7IGJlZ2luOiAnXFxcXGIod2hpdGVzcGFjZXx3YWl0fHctcmVzaXplfHZpc2libGV8dmVydGljYWwtdGV4dHx2ZXJ0aWNhbC1pZGVvZ3JhcGhpY3x1cHBlcmNhc2V8dXBwZXItcm9tYW58dXBwZXItYWxwaGF8dW5kZXJsaW5lfHRyYW5zcGFyZW50fHRvcHx0aGlufHRoaWNrfHRleHR8dGV4dC10b3B8dGV4dC1ib3R0b218dGItcmx8dGFibGUtaGVhZGVyLWdyb3VwfHRhYmxlLWZvb3Rlci1ncm91cHxzdy1yZXNpemV8c3VwZXJ8c3RyaWN0fHN0YXRpY3xzcXVhcmV8c29saWR8c21hbGwtY2Fwc3xzZXBhcmF0ZXxzZS1yZXNpemV8c2Nyb2xsfHMtcmVzaXplfHJ0bHxyb3ctcmVzaXplfHJpZGdlfHJpZ2h0fHJlcGVhdHxyZXBlYXQteXxyZXBlYXQteHxyZWxhdGl2ZXxwcm9ncmVzc3xwb2ludGVyfG92ZXJsaW5lfG91dHNpZGV8b3V0c2V0fG9ibGlxdWV8bm93cmFwfG5vdC1hbGxvd2VkfG5vcm1hbHxub25lfG53LXJlc2l6ZXxuby1yZXBlYXR8bm8tZHJvcHxuZXdzcGFwZXJ8bmUtcmVzaXplfG4tcmVzaXplfG1vdmV8bWlkZGxlfG1lZGl1bXxsdHJ8bHItdGJ8bG93ZXJjYXNlfGxvd2VyLXJvbWFufGxvd2VyLWFscGhhfGxvb3NlfGxpc3QtaXRlbXxsaW5lfGxpbmUtdGhyb3VnaHxsaW5lLWVkZ2V8bGlnaHRlcnxsZWZ0fGtlZXAtYWxsfGp1c3RpZnl8aXRhbGljfGludGVyLXdvcmR8aW50ZXItaWRlb2dyYXBofGluc2lkZXxpbnNldHxpbmxpbmV8aW5saW5lLWJsb2NrfGluaGVyaXR8aW5hY3RpdmV8aWRlb2dyYXBoLXNwYWNlfGlkZW9ncmFwaC1wYXJlbnRoZXNpc3xpZGVvZ3JhcGgtbnVtZXJpY3xpZGVvZ3JhcGgtYWxwaGF8aG9yaXpvbnRhbHxoaWRkZW58aGVscHxoYW5kfGdyb292ZXxmaXhlZHxlbGxpcHNpc3xlLXJlc2l6ZXxkb3VibGV8ZG90dGVkfGRpc3RyaWJ1dGV8ZGlzdHJpYnV0ZS1zcGFjZXxkaXN0cmlidXRlLWxldHRlcnxkaXN0cmlidXRlLWFsbC1saW5lc3xkaXNjfGRpc2FibGVkfGRlZmF1bHR8ZGVjaW1hbHxkYXNoZWR8Y3Jvc3NoYWlyfGNvbGxhcHNlfGNvbC1yZXNpemV8Y2lyY2xlfGNoYXJ8Y2VudGVyfGNhcGl0YWxpemV8YnJlYWstd29yZHxicmVhay1hbGx8Ym90dG9tfGJvdGh8Ym9sZGVyfGJvbGR8YmxvY2t8YmlkaS1vdmVycmlkZXxiZWxvd3xiYXNlbGluZXxhdXRvfGFsd2F5c3xhbGwtc2Nyb2xsfGFic29sdXRlfHRhYmxlfHRhYmxlLWNlbGwpXFxcXGInIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvOi8sXG4gICAgICAgIGVuZDogL1s7fXtdLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIG1vZGVzLkJMT0NLX0NPTU1FTlQsXG4gICAgICAgICAgVkFSSUFCTEUsXG4gICAgICAgICAgbW9kZXMuSEVYQ09MT1IsXG4gICAgICAgICAgbW9kZXMuQ1NTX05VTUJFUl9NT0RFLFxuICAgICAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICAgIG1vZGVzLklNUE9SVEFOVCxcbiAgICAgICAgICBtb2Rlcy5GVU5DVElPTl9ESVNQQVRDSFxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgLy8gbWF0Y2hpbmcgdGhlc2UgaGVyZSBhbGxvd3MgdXMgdG8gdHJlYXQgdGhlbSBtb3JlIGxpa2UgcmVndWxhciBDU1NcbiAgICAgIC8vIHJ1bGVzIHNvIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUge30gZ2V0cyByZWd1bGFyIHJ1bGUgaGlnaGxpZ2h0aW5nLFxuICAgICAgLy8gd2hpY2ggaXMgd2hhdCB3ZSB3YW50IGZvciBwYWdlIGFuZCBmb250LWZhY2VcbiAgICAgIHtcbiAgICAgICAgYmVnaW46ICdAKHBhZ2V8Zm9udC1mYWNlKScsXG4gICAgICAgIGtleXdvcmRzOiB7XG4gICAgICAgICAgJHBhdHRlcm46IEFUX0lERU5USUZJRVIsXG4gICAgICAgICAga2V5d29yZDogJ0BwYWdlIEBmb250LWZhY2UnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAnQCcsXG4gICAgICAgIGVuZDogJ1t7O10nLFxuICAgICAgICByZXR1cm5CZWdpbjogdHJ1ZSxcbiAgICAgICAga2V5d29yZHM6IHtcbiAgICAgICAgICAkcGF0dGVybjogL1thLXotXSsvLFxuICAgICAgICAgIGtleXdvcmQ6IEFUX01PRElGSUVSUyxcbiAgICAgICAgICBhdHRyaWJ1dGU6IE1FRElBX0ZFQVRVUkVTLmpvaW4oXCIgXCIpXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYmVnaW46IEFUX0lERU5USUZJRVIsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwia2V5d29yZFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1thLXotXSsoPz06KS8sXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiYXR0cmlidXRlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFZBUklBQkxFLFxuICAgICAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgICAgIG1vZGVzLkhFWENPTE9SLFxuICAgICAgICAgIG1vZGVzLkNTU19OVU1CRVJfTU9ERVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAgbW9kZXMuRlVOQ1RJT05fRElTUEFUQ0hcbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IHNjc3MgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogU2hlbGwgU2Vzc2lvblxuUmVxdWlyZXM6IGJhc2guanNcbkF1dGhvcjogVFNVWVVTQVRPIEtpdHN1bmUgPG1ha2UuanVzdC5vbkBnbWFpbC5jb20+XG5DYXRlZ29yeTogY29tbW9uXG5BdWRpdDogMjAyMFxuKi9cblxuLyoqIEB0eXBlIExhbmd1YWdlRm4gKi9cbmZ1bmN0aW9uIHNoZWxsKGhsanMpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnU2hlbGwgU2Vzc2lvbicsXG4gICAgYWxpYXNlczogW1xuICAgICAgJ2NvbnNvbGUnLFxuICAgICAgJ3NoZWxsc2Vzc2lvbidcbiAgICBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEucHJvbXB0JyxcbiAgICAgICAgLy8gV2UgY2Fubm90IGFkZCBcXHMgKHNwYWNlcykgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvdGhlcndpc2UgaXQgd2lsbCBiZSB0b28gYnJvYWQgYW5kIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHQuXG4gICAgICAgIC8vIEZvciBpbnN0YW5jZSwgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBpdCB3b3VsZCBtYXRjaCBcImVjaG8gL3BhdGgvdG8vaG9tZSA+XCIgYXMgYSBwcm9tcHQ6XG4gICAgICAgIC8vIGVjaG8gL3BhdGgvdG8vaG9tZSA+IHQuZXhlXG4gICAgICAgIGJlZ2luOiAvXlxcc3swLDN9Wy9+XFx3XFxkW1xcXSgpQC1dKls+JSQjXVsgXT8vLFxuICAgICAgICBzdGFydHM6IHtcbiAgICAgICAgICBlbmQ6IC9bXlxcXFxdKD89XFxzKiQpLyxcbiAgICAgICAgICBzdWJMYW5ndWFnZTogJ2Jhc2gnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmV4cG9ydCB7IHNoZWxsIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuIExhbmd1YWdlOiBTUUxcbiBXZWJzaXRlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUUxcbiBDYXRlZ29yeTogY29tbW9uLCBkYXRhYmFzZVxuICovXG5cbi8qXG5cbkdvYWxzOlxuXG5TUUwgaXMgaW50ZW5kZWQgdG8gaGlnaGxpZ2h0IGJhc2ljL2NvbW1vbiBTUUwga2V5d29yZHMgYW5kIGV4cHJlc3Npb25zXG5cbi0gSWYgcHJldHR5IG11Y2ggZXZlcnkgc2luZ2xlIFNRTCBzZXJ2ZXIgaW5jbHVkZXMgc3VwcG9ydHMsIHRoZW4gaXQncyBhIGNhbmlkYXRlLlxuLSBJdCBpcyBOT1QgaW50ZW5kZWQgdG8gaW5jbHVkZSB0b25zIG9mIHZlbmRvciBzcGVjaWZpYyBrZXl3b3JkcyAoT3JhY2xlLCBNeVNRTCxcbiAgUG9zdGdyZVNRTCkgYWx0aG91Z2ggdGhlIGxpc3Qgb2YgZGF0YSB0eXBlcyBpcyBwdXJwb3NlbHkgYSBiaXQgbW9yZSBleHBhbnNpdmUuXG4tIEZvciBtb3JlIHNwZWNpZmljIFNRTCBncmFtbWFycyBwbGVhc2Ugc2VlOlxuICAtIFBvc3RncmVTUUwgYW5kIFBML3BnU1FMIC0gY29yZVxuICAtIFQtU1FMIC0gaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodGpzLXRzcWxcbiAgLSBzcWxfbW9yZSAoY29yZSlcblxuICovXG5cbmZ1bmN0aW9uIHNxbChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgY29uc3QgQ09NTUVOVF9NT0RFID0gaGxqcy5DT01NRU5UKCctLScsICckJyk7XG4gIGNvbnN0IFNUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJy8sXG4gICAgICAgIGVuZDogLycvLFxuICAgICAgICBjb250YWluczogWyB7IGJlZ2luOiAvJycvIH0gXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgUVVPVEVEX0lERU5USUZJRVIgPSB7XG4gICAgYmVnaW46IC9cIi8sXG4gICAgZW5kOiAvXCIvLFxuICAgIGNvbnRhaW5zOiBbIHsgYmVnaW46IC9cIlwiLyB9IF1cbiAgfTtcblxuICBjb25zdCBMSVRFUkFMUyA9IFtcbiAgICBcInRydWVcIixcbiAgICBcImZhbHNlXCIsXG4gICAgLy8gTm90IHN1cmUgaXQncyBjb3JyZWN0IHRvIGNhbGwgTlVMTCBsaXRlcmFsLCBhbmQgY2xhdXNlcyBsaWtlIElTIFtOT1RdIE5VTEwgbG9vayBzdHJhbmdlIHRoYXQgd2F5LlxuICAgIC8vIFwibnVsbFwiLFxuICAgIFwidW5rbm93blwiXG4gIF07XG5cbiAgY29uc3QgTVVMVElfV09SRF9UWVBFUyA9IFtcbiAgICBcImRvdWJsZSBwcmVjaXNpb25cIixcbiAgICBcImxhcmdlIG9iamVjdFwiLFxuICAgIFwid2l0aCB0aW1lem9uZVwiLFxuICAgIFwid2l0aG91dCB0aW1lem9uZVwiXG4gIF07XG5cbiAgY29uc3QgVFlQRVMgPSBbXG4gICAgJ2JpZ2ludCcsXG4gICAgJ2JpbmFyeScsXG4gICAgJ2Jsb2InLFxuICAgICdib29sZWFuJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXJhY3RlcicsXG4gICAgJ2Nsb2InLFxuICAgICdkYXRlJyxcbiAgICAnZGVjJyxcbiAgICAnZGVjZmxvYXQnLFxuICAgICdkZWNpbWFsJyxcbiAgICAnZmxvYXQnLFxuICAgICdpbnQnLFxuICAgICdpbnRlZ2VyJyxcbiAgICAnaW50ZXJ2YWwnLFxuICAgICduY2hhcicsXG4gICAgJ25jbG9iJyxcbiAgICAnbmF0aW9uYWwnLFxuICAgICdudW1lcmljJyxcbiAgICAncmVhbCcsXG4gICAgJ3JvdycsXG4gICAgJ3NtYWxsaW50JyxcbiAgICAndGltZScsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3ZhcmNoYXInLFxuICAgICd2YXJ5aW5nJywgLy8gbW9kaWZpZXIgKGNoYXJhY3RlciB2YXJ5aW5nKVxuICAgICd2YXJiaW5hcnknXG4gIF07XG5cbiAgY29uc3QgTk9OX1JFU0VSVkVEX1dPUkRTID0gW1xuICAgIFwiYWRkXCIsXG4gICAgXCJhc2NcIixcbiAgICBcImNvbGxhdGlvblwiLFxuICAgIFwiZGVzY1wiLFxuICAgIFwiZmluYWxcIixcbiAgICBcImZpcnN0XCIsXG4gICAgXCJsYXN0XCIsXG4gICAgXCJ2aWV3XCJcbiAgXTtcblxuICAvLyBodHRwczovL2pha2V3aGVhdC5naXRodWIuaW8vc3FsLW92ZXJ2aWV3L3NxbC0yMDE2LWZvdW5kYXRpb24tZ3JhbW1hci5odG1sI3Jlc2VydmVkLXdvcmRcbiAgY29uc3QgUkVTRVJWRURfV09SRFMgPSBbXG4gICAgXCJhYnNcIixcbiAgICBcImFjb3NcIixcbiAgICBcImFsbFwiLFxuICAgIFwiYWxsb2NhdGVcIixcbiAgICBcImFsdGVyXCIsXG4gICAgXCJhbmRcIixcbiAgICBcImFueVwiLFxuICAgIFwiYXJlXCIsXG4gICAgXCJhcnJheVwiLFxuICAgIFwiYXJyYXlfYWdnXCIsXG4gICAgXCJhcnJheV9tYXhfY2FyZGluYWxpdHlcIixcbiAgICBcImFzXCIsXG4gICAgXCJhc2Vuc2l0aXZlXCIsXG4gICAgXCJhc2luXCIsXG4gICAgXCJhc3ltbWV0cmljXCIsXG4gICAgXCJhdFwiLFxuICAgIFwiYXRhblwiLFxuICAgIFwiYXRvbWljXCIsXG4gICAgXCJhdXRob3JpemF0aW9uXCIsXG4gICAgXCJhdmdcIixcbiAgICBcImJlZ2luXCIsXG4gICAgXCJiZWdpbl9mcmFtZVwiLFxuICAgIFwiYmVnaW5fcGFydGl0aW9uXCIsXG4gICAgXCJiZXR3ZWVuXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcImJpbmFyeVwiLFxuICAgIFwiYmxvYlwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwiYm90aFwiLFxuICAgIFwiYnlcIixcbiAgICBcImNhbGxcIixcbiAgICBcImNhbGxlZFwiLFxuICAgIFwiY2FyZGluYWxpdHlcIixcbiAgICBcImNhc2NhZGVkXCIsXG4gICAgXCJjYXNlXCIsXG4gICAgXCJjYXN0XCIsXG4gICAgXCJjZWlsXCIsXG4gICAgXCJjZWlsaW5nXCIsXG4gICAgXCJjaGFyXCIsXG4gICAgXCJjaGFyX2xlbmd0aFwiLFxuICAgIFwiY2hhcmFjdGVyXCIsXG4gICAgXCJjaGFyYWN0ZXJfbGVuZ3RoXCIsXG4gICAgXCJjaGVja1wiLFxuICAgIFwiY2xhc3NpZmllclwiLFxuICAgIFwiY2xvYlwiLFxuICAgIFwiY2xvc2VcIixcbiAgICBcImNvYWxlc2NlXCIsXG4gICAgXCJjb2xsYXRlXCIsXG4gICAgXCJjb2xsZWN0XCIsXG4gICAgXCJjb2x1bW5cIixcbiAgICBcImNvbW1pdFwiLFxuICAgIFwiY29uZGl0aW9uXCIsXG4gICAgXCJjb25uZWN0XCIsXG4gICAgXCJjb25zdHJhaW50XCIsXG4gICAgXCJjb250YWluc1wiLFxuICAgIFwiY29udmVydFwiLFxuICAgIFwiY29weVwiLFxuICAgIFwiY29yclwiLFxuICAgIFwiY29ycmVzcG9uZGluZ1wiLFxuICAgIFwiY29zXCIsXG4gICAgXCJjb3NoXCIsXG4gICAgXCJjb3VudFwiLFxuICAgIFwiY292YXJfcG9wXCIsXG4gICAgXCJjb3Zhcl9zYW1wXCIsXG4gICAgXCJjcmVhdGVcIixcbiAgICBcImNyb3NzXCIsXG4gICAgXCJjdWJlXCIsXG4gICAgXCJjdW1lX2Rpc3RcIixcbiAgICBcImN1cnJlbnRcIixcbiAgICBcImN1cnJlbnRfY2F0YWxvZ1wiLFxuICAgIFwiY3VycmVudF9kYXRlXCIsXG4gICAgXCJjdXJyZW50X2RlZmF1bHRfdHJhbnNmb3JtX2dyb3VwXCIsXG4gICAgXCJjdXJyZW50X3BhdGhcIixcbiAgICBcImN1cnJlbnRfcm9sZVwiLFxuICAgIFwiY3VycmVudF9yb3dcIixcbiAgICBcImN1cnJlbnRfc2NoZW1hXCIsXG4gICAgXCJjdXJyZW50X3RpbWVcIixcbiAgICBcImN1cnJlbnRfdGltZXN0YW1wXCIsXG4gICAgXCJjdXJyZW50X3BhdGhcIixcbiAgICBcImN1cnJlbnRfcm9sZVwiLFxuICAgIFwiY3VycmVudF90cmFuc2Zvcm1fZ3JvdXBfZm9yX3R5cGVcIixcbiAgICBcImN1cnJlbnRfdXNlclwiLFxuICAgIFwiY3Vyc29yXCIsXG4gICAgXCJjeWNsZVwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiZGF5XCIsXG4gICAgXCJkZWFsbG9jYXRlXCIsXG4gICAgXCJkZWNcIixcbiAgICBcImRlY2ltYWxcIixcbiAgICBcImRlY2Zsb2F0XCIsXG4gICAgXCJkZWNsYXJlXCIsXG4gICAgXCJkZWZhdWx0XCIsXG4gICAgXCJkZWZpbmVcIixcbiAgICBcImRlbGV0ZVwiLFxuICAgIFwiZGVuc2VfcmFua1wiLFxuICAgIFwiZGVyZWZcIixcbiAgICBcImRlc2NyaWJlXCIsXG4gICAgXCJkZXRlcm1pbmlzdGljXCIsXG4gICAgXCJkaXNjb25uZWN0XCIsXG4gICAgXCJkaXN0aW5jdFwiLFxuICAgIFwiZG91YmxlXCIsXG4gICAgXCJkcm9wXCIsXG4gICAgXCJkeW5hbWljXCIsXG4gICAgXCJlYWNoXCIsXG4gICAgXCJlbGVtZW50XCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbXB0eVwiLFxuICAgIFwiZW5kXCIsXG4gICAgXCJlbmRfZnJhbWVcIixcbiAgICBcImVuZF9wYXJ0aXRpb25cIixcbiAgICBcImVuZC1leGVjXCIsXG4gICAgXCJlcXVhbHNcIixcbiAgICBcImVzY2FwZVwiLFxuICAgIFwiZXZlcnlcIixcbiAgICBcImV4Y2VwdFwiLFxuICAgIFwiZXhlY1wiLFxuICAgIFwiZXhlY3V0ZVwiLFxuICAgIFwiZXhpc3RzXCIsXG4gICAgXCJleHBcIixcbiAgICBcImV4dGVybmFsXCIsXG4gICAgXCJleHRyYWN0XCIsXG4gICAgXCJmYWxzZVwiLFxuICAgIFwiZmV0Y2hcIixcbiAgICBcImZpbHRlclwiLFxuICAgIFwiZmlyc3RfdmFsdWVcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJmbG9vclwiLFxuICAgIFwiZm9yXCIsXG4gICAgXCJmb3JlaWduXCIsXG4gICAgXCJmcmFtZV9yb3dcIixcbiAgICBcImZyZWVcIixcbiAgICBcImZyb21cIixcbiAgICBcImZ1bGxcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJmdXNpb25cIixcbiAgICBcImdldFwiLFxuICAgIFwiZ2xvYmFsXCIsXG4gICAgXCJncmFudFwiLFxuICAgIFwiZ3JvdXBcIixcbiAgICBcImdyb3VwaW5nXCIsXG4gICAgXCJncm91cHNcIixcbiAgICBcImhhdmluZ1wiLFxuICAgIFwiaG9sZFwiLFxuICAgIFwiaG91clwiLFxuICAgIFwiaWRlbnRpdHlcIixcbiAgICBcImluXCIsXG4gICAgXCJpbmRpY2F0b3JcIixcbiAgICBcImluaXRpYWxcIixcbiAgICBcImlubmVyXCIsXG4gICAgXCJpbm91dFwiLFxuICAgIFwiaW5zZW5zaXRpdmVcIixcbiAgICBcImluc2VydFwiLFxuICAgIFwiaW50XCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJpbnRlcnNlY3RcIixcbiAgICBcImludGVyc2VjdGlvblwiLFxuICAgIFwiaW50ZXJ2YWxcIixcbiAgICBcImludG9cIixcbiAgICBcImlzXCIsXG4gICAgXCJqb2luXCIsXG4gICAgXCJqc29uX2FycmF5XCIsXG4gICAgXCJqc29uX2FycmF5YWdnXCIsXG4gICAgXCJqc29uX2V4aXN0c1wiLFxuICAgIFwianNvbl9vYmplY3RcIixcbiAgICBcImpzb25fb2JqZWN0YWdnXCIsXG4gICAgXCJqc29uX3F1ZXJ5XCIsXG4gICAgXCJqc29uX3RhYmxlXCIsXG4gICAgXCJqc29uX3RhYmxlX3ByaW1pdGl2ZVwiLFxuICAgIFwianNvbl92YWx1ZVwiLFxuICAgIFwibGFnXCIsXG4gICAgXCJsYW5ndWFnZVwiLFxuICAgIFwibGFyZ2VcIixcbiAgICBcImxhc3RfdmFsdWVcIixcbiAgICBcImxhdGVyYWxcIixcbiAgICBcImxlYWRcIixcbiAgICBcImxlYWRpbmdcIixcbiAgICBcImxlZnRcIixcbiAgICBcImxpa2VcIixcbiAgICBcImxpa2VfcmVnZXhcIixcbiAgICBcImxpc3RhZ2dcIixcbiAgICBcImxuXCIsXG4gICAgXCJsb2NhbFwiLFxuICAgIFwibG9jYWx0aW1lXCIsXG4gICAgXCJsb2NhbHRpbWVzdGFtcFwiLFxuICAgIFwibG9nXCIsXG4gICAgXCJsb2cxMFwiLFxuICAgIFwibG93ZXJcIixcbiAgICBcIm1hdGNoXCIsXG4gICAgXCJtYXRjaF9udW1iZXJcIixcbiAgICBcIm1hdGNoX3JlY29nbml6ZVwiLFxuICAgIFwibWF0Y2hlc1wiLFxuICAgIFwibWF4XCIsXG4gICAgXCJtZW1iZXJcIixcbiAgICBcIm1lcmdlXCIsXG4gICAgXCJtZXRob2RcIixcbiAgICBcIm1pblwiLFxuICAgIFwibWludXRlXCIsXG4gICAgXCJtb2RcIixcbiAgICBcIm1vZGlmaWVzXCIsXG4gICAgXCJtb2R1bGVcIixcbiAgICBcIm1vbnRoXCIsXG4gICAgXCJtdWx0aXNldFwiLFxuICAgIFwibmF0aW9uYWxcIixcbiAgICBcIm5hdHVyYWxcIixcbiAgICBcIm5jaGFyXCIsXG4gICAgXCJuY2xvYlwiLFxuICAgIFwibmV3XCIsXG4gICAgXCJub1wiLFxuICAgIFwibm9uZVwiLFxuICAgIFwibm9ybWFsaXplXCIsXG4gICAgXCJub3RcIixcbiAgICBcIm50aF92YWx1ZVwiLFxuICAgIFwibnRpbGVcIixcbiAgICBcIm51bGxcIixcbiAgICBcIm51bGxpZlwiLFxuICAgIFwibnVtZXJpY1wiLFxuICAgIFwib2N0ZXRfbGVuZ3RoXCIsXG4gICAgXCJvY2N1cnJlbmNlc19yZWdleFwiLFxuICAgIFwib2ZcIixcbiAgICBcIm9mZnNldFwiLFxuICAgIFwib2xkXCIsXG4gICAgXCJvbWl0XCIsXG4gICAgXCJvblwiLFxuICAgIFwib25lXCIsXG4gICAgXCJvbmx5XCIsXG4gICAgXCJvcGVuXCIsXG4gICAgXCJvclwiLFxuICAgIFwib3JkZXJcIixcbiAgICBcIm91dFwiLFxuICAgIFwib3V0ZXJcIixcbiAgICBcIm92ZXJcIixcbiAgICBcIm92ZXJsYXBzXCIsXG4gICAgXCJvdmVybGF5XCIsXG4gICAgXCJwYXJhbWV0ZXJcIixcbiAgICBcInBhcnRpdGlvblwiLFxuICAgIFwicGF0dGVyblwiLFxuICAgIFwicGVyXCIsXG4gICAgXCJwZXJjZW50XCIsXG4gICAgXCJwZXJjZW50X3JhbmtcIixcbiAgICBcInBlcmNlbnRpbGVfY29udFwiLFxuICAgIFwicGVyY2VudGlsZV9kaXNjXCIsXG4gICAgXCJwZXJpb2RcIixcbiAgICBcInBvcnRpb25cIixcbiAgICBcInBvc2l0aW9uXCIsXG4gICAgXCJwb3NpdGlvbl9yZWdleFwiLFxuICAgIFwicG93ZXJcIixcbiAgICBcInByZWNlZGVzXCIsXG4gICAgXCJwcmVjaXNpb25cIixcbiAgICBcInByZXBhcmVcIixcbiAgICBcInByaW1hcnlcIixcbiAgICBcInByb2NlZHVyZVwiLFxuICAgIFwicHRmXCIsXG4gICAgXCJyYW5nZVwiLFxuICAgIFwicmFua1wiLFxuICAgIFwicmVhZHNcIixcbiAgICBcInJlYWxcIixcbiAgICBcInJlY3Vyc2l2ZVwiLFxuICAgIFwicmVmXCIsXG4gICAgXCJyZWZlcmVuY2VzXCIsXG4gICAgXCJyZWZlcmVuY2luZ1wiLFxuICAgIFwicmVncl9hdmd4XCIsXG4gICAgXCJyZWdyX2F2Z3lcIixcbiAgICBcInJlZ3JfY291bnRcIixcbiAgICBcInJlZ3JfaW50ZXJjZXB0XCIsXG4gICAgXCJyZWdyX3IyXCIsXG4gICAgXCJyZWdyX3Nsb3BlXCIsXG4gICAgXCJyZWdyX3N4eFwiLFxuICAgIFwicmVncl9zeHlcIixcbiAgICBcInJlZ3Jfc3l5XCIsXG4gICAgXCJyZWxlYXNlXCIsXG4gICAgXCJyZXN1bHRcIixcbiAgICBcInJldHVyblwiLFxuICAgIFwicmV0dXJuc1wiLFxuICAgIFwicmV2b2tlXCIsXG4gICAgXCJyaWdodFwiLFxuICAgIFwicm9sbGJhY2tcIixcbiAgICBcInJvbGx1cFwiLFxuICAgIFwicm93XCIsXG4gICAgXCJyb3dfbnVtYmVyXCIsXG4gICAgXCJyb3dzXCIsXG4gICAgXCJydW5uaW5nXCIsXG4gICAgXCJzYXZlcG9pbnRcIixcbiAgICBcInNjb3BlXCIsXG4gICAgXCJzY3JvbGxcIixcbiAgICBcInNlYXJjaFwiLFxuICAgIFwic2Vjb25kXCIsXG4gICAgXCJzZWVrXCIsXG4gICAgXCJzZWxlY3RcIixcbiAgICBcInNlbnNpdGl2ZVwiLFxuICAgIFwic2Vzc2lvbl91c2VyXCIsXG4gICAgXCJzZXRcIixcbiAgICBcInNob3dcIixcbiAgICBcInNpbWlsYXJcIixcbiAgICBcInNpblwiLFxuICAgIFwic2luaFwiLFxuICAgIFwic2tpcFwiLFxuICAgIFwic21hbGxpbnRcIixcbiAgICBcInNvbWVcIixcbiAgICBcInNwZWNpZmljXCIsXG4gICAgXCJzcGVjaWZpY3R5cGVcIixcbiAgICBcInNxbFwiLFxuICAgIFwic3FsZXhjZXB0aW9uXCIsXG4gICAgXCJzcWxzdGF0ZVwiLFxuICAgIFwic3Fsd2FybmluZ1wiLFxuICAgIFwic3FydFwiLFxuICAgIFwic3RhcnRcIixcbiAgICBcInN0YXRpY1wiLFxuICAgIFwic3RkZGV2X3BvcFwiLFxuICAgIFwic3RkZGV2X3NhbXBcIixcbiAgICBcInN1Ym11bHRpc2V0XCIsXG4gICAgXCJzdWJzZXRcIixcbiAgICBcInN1YnN0cmluZ1wiLFxuICAgIFwic3Vic3RyaW5nX3JlZ2V4XCIsXG4gICAgXCJzdWNjZWVkc1wiLFxuICAgIFwic3VtXCIsXG4gICAgXCJzeW1tZXRyaWNcIixcbiAgICBcInN5c3RlbVwiLFxuICAgIFwic3lzdGVtX3RpbWVcIixcbiAgICBcInN5c3RlbV91c2VyXCIsXG4gICAgXCJ0YWJsZVwiLFxuICAgIFwidGFibGVzYW1wbGVcIixcbiAgICBcInRhblwiLFxuICAgIFwidGFuaFwiLFxuICAgIFwidGhlblwiLFxuICAgIFwidGltZVwiLFxuICAgIFwidGltZXN0YW1wXCIsXG4gICAgXCJ0aW1lem9uZV9ob3VyXCIsXG4gICAgXCJ0aW1lem9uZV9taW51dGVcIixcbiAgICBcInRvXCIsXG4gICAgXCJ0cmFpbGluZ1wiLFxuICAgIFwidHJhbnNsYXRlXCIsXG4gICAgXCJ0cmFuc2xhdGVfcmVnZXhcIixcbiAgICBcInRyYW5zbGF0aW9uXCIsXG4gICAgXCJ0cmVhdFwiLFxuICAgIFwidHJpZ2dlclwiLFxuICAgIFwidHJpbVwiLFxuICAgIFwidHJpbV9hcnJheVwiLFxuICAgIFwidHJ1ZVwiLFxuICAgIFwidHJ1bmNhdGVcIixcbiAgICBcInVlc2NhcGVcIixcbiAgICBcInVuaW9uXCIsXG4gICAgXCJ1bmlxdWVcIixcbiAgICBcInVua25vd25cIixcbiAgICBcInVubmVzdFwiLFxuICAgIFwidXBkYXRlXCIsXG4gICAgXCJ1cHBlclwiLFxuICAgIFwidXNlclwiLFxuICAgIFwidXNpbmdcIixcbiAgICBcInZhbHVlXCIsXG4gICAgXCJ2YWx1ZXNcIixcbiAgICBcInZhbHVlX29mXCIsXG4gICAgXCJ2YXJfcG9wXCIsXG4gICAgXCJ2YXJfc2FtcFwiLFxuICAgIFwidmFyYmluYXJ5XCIsXG4gICAgXCJ2YXJjaGFyXCIsXG4gICAgXCJ2YXJ5aW5nXCIsXG4gICAgXCJ2ZXJzaW9uaW5nXCIsXG4gICAgXCJ3aGVuXCIsXG4gICAgXCJ3aGVuZXZlclwiLFxuICAgIFwid2hlcmVcIixcbiAgICBcIndpZHRoX2J1Y2tldFwiLFxuICAgIFwid2luZG93XCIsXG4gICAgXCJ3aXRoXCIsXG4gICAgXCJ3aXRoaW5cIixcbiAgICBcIndpdGhvdXRcIixcbiAgICBcInllYXJcIixcbiAgXTtcblxuICAvLyB0aGVzZSBhcmUgcmVzZXJ2ZWQgd29yZHMgd2UgaGF2ZSBpZGVudGlmaWVkIHRvIGJlIGZ1bmN0aW9uc1xuICAvLyBhbmQgc2hvdWxkIG9ubHkgYmUgaGlnaGxpZ2h0ZWQgaW4gYSBkaXNwYXRjaC1saWtlIGNvbnRleHRcbiAgLy8gaWUsIGFycmF5X2FnZyguLi4pLCBldGMuXG4gIGNvbnN0IFJFU0VSVkVEX0ZVTkNUSU9OUyA9IFtcbiAgICBcImFic1wiLFxuICAgIFwiYWNvc1wiLFxuICAgIFwiYXJyYXlfYWdnXCIsXG4gICAgXCJhc2luXCIsXG4gICAgXCJhdGFuXCIsXG4gICAgXCJhdmdcIixcbiAgICBcImNhc3RcIixcbiAgICBcImNlaWxcIixcbiAgICBcImNlaWxpbmdcIixcbiAgICBcImNvYWxlc2NlXCIsXG4gICAgXCJjb3JyXCIsXG4gICAgXCJjb3NcIixcbiAgICBcImNvc2hcIixcbiAgICBcImNvdW50XCIsXG4gICAgXCJjb3Zhcl9wb3BcIixcbiAgICBcImNvdmFyX3NhbXBcIixcbiAgICBcImN1bWVfZGlzdFwiLFxuICAgIFwiZGVuc2VfcmFua1wiLFxuICAgIFwiZGVyZWZcIixcbiAgICBcImVsZW1lbnRcIixcbiAgICBcImV4cFwiLFxuICAgIFwiZXh0cmFjdFwiLFxuICAgIFwiZmlyc3RfdmFsdWVcIixcbiAgICBcImZsb29yXCIsXG4gICAgXCJqc29uX2FycmF5XCIsXG4gICAgXCJqc29uX2FycmF5YWdnXCIsXG4gICAgXCJqc29uX2V4aXN0c1wiLFxuICAgIFwianNvbl9vYmplY3RcIixcbiAgICBcImpzb25fb2JqZWN0YWdnXCIsXG4gICAgXCJqc29uX3F1ZXJ5XCIsXG4gICAgXCJqc29uX3RhYmxlXCIsXG4gICAgXCJqc29uX3RhYmxlX3ByaW1pdGl2ZVwiLFxuICAgIFwianNvbl92YWx1ZVwiLFxuICAgIFwibGFnXCIsXG4gICAgXCJsYXN0X3ZhbHVlXCIsXG4gICAgXCJsZWFkXCIsXG4gICAgXCJsaXN0YWdnXCIsXG4gICAgXCJsblwiLFxuICAgIFwibG9nXCIsXG4gICAgXCJsb2cxMFwiLFxuICAgIFwibG93ZXJcIixcbiAgICBcIm1heFwiLFxuICAgIFwibWluXCIsXG4gICAgXCJtb2RcIixcbiAgICBcIm50aF92YWx1ZVwiLFxuICAgIFwibnRpbGVcIixcbiAgICBcIm51bGxpZlwiLFxuICAgIFwicGVyY2VudF9yYW5rXCIsXG4gICAgXCJwZXJjZW50aWxlX2NvbnRcIixcbiAgICBcInBlcmNlbnRpbGVfZGlzY1wiLFxuICAgIFwicG9zaXRpb25cIixcbiAgICBcInBvc2l0aW9uX3JlZ2V4XCIsXG4gICAgXCJwb3dlclwiLFxuICAgIFwicmFua1wiLFxuICAgIFwicmVncl9hdmd4XCIsXG4gICAgXCJyZWdyX2F2Z3lcIixcbiAgICBcInJlZ3JfY291bnRcIixcbiAgICBcInJlZ3JfaW50ZXJjZXB0XCIsXG4gICAgXCJyZWdyX3IyXCIsXG4gICAgXCJyZWdyX3Nsb3BlXCIsXG4gICAgXCJyZWdyX3N4eFwiLFxuICAgIFwicmVncl9zeHlcIixcbiAgICBcInJlZ3Jfc3l5XCIsXG4gICAgXCJyb3dfbnVtYmVyXCIsXG4gICAgXCJzaW5cIixcbiAgICBcInNpbmhcIixcbiAgICBcInNxcnRcIixcbiAgICBcInN0ZGRldl9wb3BcIixcbiAgICBcInN0ZGRldl9zYW1wXCIsXG4gICAgXCJzdWJzdHJpbmdcIixcbiAgICBcInN1YnN0cmluZ19yZWdleFwiLFxuICAgIFwic3VtXCIsXG4gICAgXCJ0YW5cIixcbiAgICBcInRhbmhcIixcbiAgICBcInRyYW5zbGF0ZVwiLFxuICAgIFwidHJhbnNsYXRlX3JlZ2V4XCIsXG4gICAgXCJ0cmVhdFwiLFxuICAgIFwidHJpbVwiLFxuICAgIFwidHJpbV9hcnJheVwiLFxuICAgIFwidW5uZXN0XCIsXG4gICAgXCJ1cHBlclwiLFxuICAgIFwidmFsdWVfb2ZcIixcbiAgICBcInZhcl9wb3BcIixcbiAgICBcInZhcl9zYW1wXCIsXG4gICAgXCJ3aWR0aF9idWNrZXRcIixcbiAgXTtcblxuICAvLyB0aGVzZSBmdW5jdGlvbnMgY2FuXG4gIGNvbnN0IFBPU1NJQkxFX1dJVEhPVVRfUEFSRU5TID0gW1xuICAgIFwiY3VycmVudF9jYXRhbG9nXCIsXG4gICAgXCJjdXJyZW50X2RhdGVcIixcbiAgICBcImN1cnJlbnRfZGVmYXVsdF90cmFuc2Zvcm1fZ3JvdXBcIixcbiAgICBcImN1cnJlbnRfcGF0aFwiLFxuICAgIFwiY3VycmVudF9yb2xlXCIsXG4gICAgXCJjdXJyZW50X3NjaGVtYVwiLFxuICAgIFwiY3VycmVudF90cmFuc2Zvcm1fZ3JvdXBfZm9yX3R5cGVcIixcbiAgICBcImN1cnJlbnRfdXNlclwiLFxuICAgIFwic2Vzc2lvbl91c2VyXCIsXG4gICAgXCJzeXN0ZW1fdGltZVwiLFxuICAgIFwic3lzdGVtX3VzZXJcIixcbiAgICBcImN1cnJlbnRfdGltZVwiLFxuICAgIFwibG9jYWx0aW1lXCIsXG4gICAgXCJjdXJyZW50X3RpbWVzdGFtcFwiLFxuICAgIFwibG9jYWx0aW1lc3RhbXBcIlxuICBdO1xuXG4gIC8vIHRob3NlIGV4aXN0IHRvIGJvb3N0IHJlbGV2YW5jZSBtYWtpbmcgdGhlc2UgdmVyeVxuICAvLyBcIlNRTCBsaWtlXCIga2V5d29yZCBjb21ib3Mgd29ydGggKzEgZXh0cmEgcmVsZXZhbmNlXG4gIGNvbnN0IENPTUJPUyA9IFtcbiAgICBcImNyZWF0ZSB0YWJsZVwiLFxuICAgIFwiaW5zZXJ0IGludG9cIixcbiAgICBcInByaW1hcnkga2V5XCIsXG4gICAgXCJmb3JlaWduIGtleVwiLFxuICAgIFwibm90IG51bGxcIixcbiAgICBcImFsdGVyIHRhYmxlXCIsXG4gICAgXCJhZGQgY29uc3RyYWludFwiLFxuICAgIFwiZ3JvdXBpbmcgc2V0c1wiLFxuICAgIFwib24gb3ZlcmZsb3dcIixcbiAgICBcImNoYXJhY3RlciBzZXRcIixcbiAgICBcInJlc3BlY3QgbnVsbHNcIixcbiAgICBcImlnbm9yZSBudWxsc1wiLFxuICAgIFwibnVsbHMgZmlyc3RcIixcbiAgICBcIm51bGxzIGxhc3RcIixcbiAgICBcImRlcHRoIGZpcnN0XCIsXG4gICAgXCJicmVhZHRoIGZpcnN0XCJcbiAgXTtcblxuICBjb25zdCBGVU5DVElPTlMgPSBSRVNFUlZFRF9GVU5DVElPTlM7XG5cbiAgY29uc3QgS0VZV09SRFMgPSBbXG4gICAgLi4uUkVTRVJWRURfV09SRFMsXG4gICAgLi4uTk9OX1JFU0VSVkVEX1dPUkRTXG4gIF0uZmlsdGVyKChrZXl3b3JkKSA9PiB7XG4gICAgcmV0dXJuICFSRVNFUlZFRF9GVU5DVElPTlMuaW5jbHVkZXMoa2V5d29yZCk7XG4gIH0pO1xuXG4gIGNvbnN0IFZBUklBQkxFID0ge1xuICAgIGNsYXNzTmFtZTogXCJ2YXJpYWJsZVwiLFxuICAgIGJlZ2luOiAvQFthLXowLTldW2EtejAtOV9dKi8sXG4gIH07XG5cbiAgY29uc3QgT1BFUkFUT1IgPSB7XG4gICAgY2xhc3NOYW1lOiBcIm9wZXJhdG9yXCIsXG4gICAgYmVnaW46IC9bLSsqLz0lXn5dfCYmP3xcXHxcXHw/fCE9P3w8KD86PT4/fDx8Pik/fD5bPj1dPy8sXG4gICAgcmVsZXZhbmNlOiAwLFxuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX0NBTEwgPSB7XG4gICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvXFxiLywgcmVnZXguZWl0aGVyKC4uLkZVTkNUSU9OUyksIC9cXHMqXFwoLyksXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGtleXdvcmRzOiB7IGJ1aWx0X2luOiBGVU5DVElPTlMgfVxuICB9O1xuXG4gIC8vIGtleXdvcmRzIHdpdGggbGVzcyB0aGFuIDMgbGV0dGVycyBhcmUgcmVkdWNlZCBpbiByZWxldmFuY3lcbiAgZnVuY3Rpb24gcmVkdWNlUmVsZXZhbmN5KGxpc3QsIHtcbiAgICBleGNlcHRpb25zLCB3aGVuXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHF1YWxpZnlGbiA9IHdoZW47XG4gICAgZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnMgfHwgW107XG4gICAgcmV0dXJuIGxpc3QubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5tYXRjaCgvXFx8XFxkKyQvKSB8fCBleGNlcHRpb25zLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSBlbHNlIGlmIChxdWFsaWZ5Rm4oaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIGAke2l0ZW19fDBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdTUUwnLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgLy8gZG9lcyBub3QgaW5jbHVkZSB7fSBvciBIVE1MIHRhZ3MgYDwvYFxuICAgIGlsbGVnYWw6IC9be31dfDxcXC8vLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICAkcGF0dGVybjogL1xcYltcXHdcXC5dKy8sXG4gICAgICBrZXl3b3JkOlxuICAgICAgICByZWR1Y2VSZWxldmFuY3koS0VZV09SRFMsIHsgd2hlbjogKHgpID0+IHgubGVuZ3RoIDwgMyB9KSxcbiAgICAgIGxpdGVyYWw6IExJVEVSQUxTLFxuICAgICAgdHlwZTogVFlQRVMsXG4gICAgICBidWlsdF9pbjogUE9TU0lCTEVfV0lUSE9VVF9QQVJFTlNcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiByZWdleC5laXRoZXIoLi4uQ09NQk9TKSxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBrZXl3b3Jkczoge1xuICAgICAgICAgICRwYXR0ZXJuOiAvW1xcd1xcLl0rLyxcbiAgICAgICAgICBrZXl3b3JkOiBLRVlXT1JEUy5jb25jYXQoQ09NQk9TKSxcbiAgICAgICAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICAgICAgICB0eXBlOiBUWVBFU1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInR5cGVcIixcbiAgICAgICAgYmVnaW46IHJlZ2V4LmVpdGhlciguLi5NVUxUSV9XT1JEX1RZUEVTKVxuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX0NBTEwsXG4gICAgICBWQVJJQUJMRSxcbiAgICAgIFNUUklORyxcbiAgICAgIFFVT1RFRF9JREVOVElGSUVSLFxuICAgICAgaGxqcy5DX05VTUJFUl9NT0RFLFxuICAgICAgaGxqcy5DX0JMT0NLX0NPTU1FTlRfTU9ERSxcbiAgICAgIENPTU1FTlRfTU9ERSxcbiAgICAgIE9QRVJBVE9SXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBzcWwgYXMgZGVmYXVsdCB9O1xuIiwgIi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7UmVnRXhwfVxuICogKi9cblxuLyoqXG4gKiBAcGFyYW0ge1JlZ0V4cCB8IHN0cmluZyB9IHJlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBzb3VyY2UocmUpIHtcbiAgaWYgKCFyZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgcmUgPT09IFwic3RyaW5nXCIpIHJldHVybiByZTtcblxuICByZXR1cm4gcmUuc291cmNlO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nIH0gcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGxvb2thaGVhZChyZSkge1xuICByZXR1cm4gY29uY2F0KCcoPz0nLCByZSwgJyknKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLihSZWdFeHAgfCBzdHJpbmcpIH0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY29uY2F0KC4uLmFyZ3MpIHtcbiAgY29uc3Qgam9pbmVkID0gYXJncy5tYXAoKHgpID0+IHNvdXJjZSh4KSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyBBcnJheTxzdHJpbmcgfCBSZWdFeHAgfCBPYmplY3Q+IH0gYXJnc1xuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncykge1xuICBjb25zdCBvcHRzID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ29iamVjdCcgJiYgb3B0cy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgYXJncy5zcGxpY2UoYXJncy5sZW5ndGggLSAxLCAxKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEB0eXBlZGVmIHsge2NhcHR1cmU/OiBib29sZWFufSB9IFJlZ2V4RWl0aGVyT3B0aW9ucyAqL1xuXG4vKipcbiAqIEFueSBvZiB0aGUgcGFzc2VkIGV4cHJlc3NzaW9ucyBtYXkgbWF0Y2hcbiAqXG4gKiBDcmVhdGVzIGEgaHVnZSB0aGlzIHwgdGhpcyB8IHRoYXQgfCB0aGF0IG1hdGNoXG4gKiBAcGFyYW0geyhSZWdFeHAgfCBzdHJpbmcpW10gfCBbLi4uKFJlZ0V4cCB8IHN0cmluZylbXSwgUmVnZXhFaXRoZXJPcHRpb25zXX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZWl0aGVyKC4uLmFyZ3MpIHtcbiAgLyoqIEB0eXBlIHsgb2JqZWN0ICYge2NhcHR1cmU/OiBib29sZWFufSB9ICAqL1xuICBjb25zdCBvcHRzID0gc3RyaXBPcHRpb25zRnJvbUFyZ3MoYXJncyk7XG4gIGNvbnN0IGpvaW5lZCA9ICcoJ1xuICAgICsgKG9wdHMuY2FwdHVyZSA/IFwiXCIgOiBcIj86XCIpXG4gICAgKyBhcmdzLm1hcCgoeCkgPT4gc291cmNlKHgpKS5qb2luKFwifFwiKSArIFwiKVwiO1xuICByZXR1cm4gam9pbmVkO1xufVxuXG5jb25zdCBrZXl3b3JkV3JhcHBlciA9IGtleXdvcmQgPT4gY29uY2F0KFxuICAvXFxiLyxcbiAga2V5d29yZCxcbiAgL1xcdyQvLnRlc3Qoa2V5d29yZCkgPyAvXFxiLyA6IC9cXEIvXG4pO1xuXG4vLyBLZXl3b3JkcyB0aGF0IHJlcXVpcmUgYSBsZWFkaW5nIGRvdC5cbmNvbnN0IGRvdEtleXdvcmRzID0gW1xuICAnUHJvdG9jb2wnLCAvLyBjb250ZXh0dWFsXG4gICdUeXBlJyAvLyBjb250ZXh0dWFsXG5dLm1hcChrZXl3b3JkV3JhcHBlcik7XG5cbi8vIEtleXdvcmRzIHRoYXQgbWF5IGhhdmUgYSBsZWFkaW5nIGRvdC5cbmNvbnN0IG9wdGlvbmFsRG90S2V5d29yZHMgPSBbXG4gICdpbml0JyxcbiAgJ3NlbGYnXG5dLm1hcChrZXl3b3JkV3JhcHBlcik7XG5cbi8vIHNob3VsZCByZWdpc3RlciBhcyBrZXl3b3JkLCBub3QgdHlwZVxuY29uc3Qga2V5d29yZFR5cGVzID0gW1xuICAnQW55JyxcbiAgJ1NlbGYnXG5dO1xuXG4vLyBSZWd1bGFyIGtleXdvcmRzIGFuZCBsaXRlcmFscy5cbmNvbnN0IGtleXdvcmRzID0gW1xuICAvLyBzdHJpbmdzIGJlbG93IHdpbGwgYmUgZmVkIGludG8gdGhlIHJlZ3VsYXIgYGtleXdvcmRzYCBlbmdpbmUgd2hpbGUgcmVnZXhcbiAgLy8gd2lsbCByZXN1bHQgaW4gYWRkaXRpb25hbCBtb2RlcyBiZWluZyBjcmVhdGVkIHRvIHNjYW4gZm9yIHRob3NlIGtleXdvcmRzIHRvXG4gIC8vIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHJ1bGVzXG4gICdhY3RvcicsXG4gICdhbnknLCAvLyBjb250ZXh0dWFsXG4gICdhc3NvY2lhdGVkdHlwZScsXG4gICdhc3luYycsXG4gICdhd2FpdCcsXG4gIC9hc1xcPy8sIC8vIG9wZXJhdG9yXG4gIC9hcyEvLCAvLyBvcGVyYXRvclxuICAnYXMnLCAvLyBvcGVyYXRvclxuICAnYnJlYWsnLFxuICAnY2FzZScsXG4gICdjYXRjaCcsXG4gICdjbGFzcycsXG4gICdjb250aW51ZScsXG4gICdjb252ZW5pZW5jZScsIC8vIGNvbnRleHR1YWxcbiAgJ2RlZmF1bHQnLFxuICAnZGVmZXInLFxuICAnZGVpbml0JyxcbiAgJ2RpZFNldCcsIC8vIGNvbnRleHR1YWxcbiAgJ2Rpc3RyaWJ1dGVkJyxcbiAgJ2RvJyxcbiAgJ2R5bmFtaWMnLCAvLyBjb250ZXh0dWFsXG4gICdlbHNlJyxcbiAgJ2VudW0nLFxuICAnZXh0ZW5zaW9uJyxcbiAgJ2ZhbGx0aHJvdWdoJyxcbiAgL2ZpbGVwcml2YXRlXFwoc2V0XFwpLyxcbiAgJ2ZpbGVwcml2YXRlJyxcbiAgJ2ZpbmFsJywgLy8gY29udGV4dHVhbFxuICAnZm9yJyxcbiAgJ2Z1bmMnLFxuICAnZ2V0JywgLy8gY29udGV4dHVhbFxuICAnZ3VhcmQnLFxuICAnaWYnLFxuICAnaW1wb3J0JyxcbiAgJ2luZGlyZWN0JywgLy8gY29udGV4dHVhbFxuICAnaW5maXgnLCAvLyBjb250ZXh0dWFsXG4gIC9pbml0XFw/LyxcbiAgL2luaXQhLyxcbiAgJ2lub3V0JyxcbiAgL2ludGVybmFsXFwoc2V0XFwpLyxcbiAgJ2ludGVybmFsJyxcbiAgJ2luJyxcbiAgJ2lzJywgLy8gb3BlcmF0b3JcbiAgJ2lzb2xhdGVkJywgLy8gY29udGV4dHVhbFxuICAnbm9uaXNvbGF0ZWQnLCAvLyBjb250ZXh0dWFsXG4gICdsYXp5JywgLy8gY29udGV4dHVhbFxuICAnbGV0JyxcbiAgJ211dGF0aW5nJywgLy8gY29udGV4dHVhbFxuICAnbm9ubXV0YXRpbmcnLCAvLyBjb250ZXh0dWFsXG4gIC9vcGVuXFwoc2V0XFwpLywgLy8gY29udGV4dHVhbFxuICAnb3BlbicsIC8vIGNvbnRleHR1YWxcbiAgJ29wZXJhdG9yJyxcbiAgJ29wdGlvbmFsJywgLy8gY29udGV4dHVhbFxuICAnb3ZlcnJpZGUnLCAvLyBjb250ZXh0dWFsXG4gICdwb3N0Zml4JywgLy8gY29udGV4dHVhbFxuICAncHJlY2VkZW5jZWdyb3VwJyxcbiAgJ3ByZWZpeCcsIC8vIGNvbnRleHR1YWxcbiAgL3ByaXZhdGVcXChzZXRcXCkvLFxuICAncHJpdmF0ZScsXG4gICdwcm90b2NvbCcsXG4gIC9wdWJsaWNcXChzZXRcXCkvLFxuICAncHVibGljJyxcbiAgJ3JlcGVhdCcsXG4gICdyZXF1aXJlZCcsIC8vIGNvbnRleHR1YWxcbiAgJ3JldGhyb3dzJyxcbiAgJ3JldHVybicsXG4gICdzZXQnLCAvLyBjb250ZXh0dWFsXG4gICdzb21lJywgLy8gY29udGV4dHVhbFxuICAnc3RhdGljJyxcbiAgJ3N0cnVjdCcsXG4gICdzdWJzY3JpcHQnLFxuICAnc3VwZXInLFxuICAnc3dpdGNoJyxcbiAgJ3Rocm93cycsXG4gICd0aHJvdycsXG4gIC90cnlcXD8vLCAvLyBvcGVyYXRvclxuICAvdHJ5IS8sIC8vIG9wZXJhdG9yXG4gICd0cnknLCAvLyBvcGVyYXRvclxuICAndHlwZWFsaWFzJyxcbiAgL3Vub3duZWRcXChzYWZlXFwpLywgLy8gY29udGV4dHVhbFxuICAvdW5vd25lZFxcKHVuc2FmZVxcKS8sIC8vIGNvbnRleHR1YWxcbiAgJ3Vub3duZWQnLCAvLyBjb250ZXh0dWFsXG4gICd2YXInLFxuICAnd2VhaycsIC8vIGNvbnRleHR1YWxcbiAgJ3doZXJlJyxcbiAgJ3doaWxlJyxcbiAgJ3dpbGxTZXQnIC8vIGNvbnRleHR1YWxcbl07XG5cbi8vIE5PVEU6IENvbnRleHR1YWwga2V5d29yZHMgYXJlIHJlc2VydmVkIG9ubHkgaW4gc3BlY2lmaWMgY29udGV4dHMuXG4vLyBJZGVhbGx5LCB0aGVzZSBzaG91bGQgYmUgbWF0Y2hlZCB1c2luZyBtb2RlcyB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMuXG5cbi8vIExpdGVyYWxzLlxuY29uc3QgbGl0ZXJhbHMgPSBbXG4gICdmYWxzZScsXG4gICduaWwnLFxuICAndHJ1ZSdcbl07XG5cbi8vIEtleXdvcmRzIHVzZWQgaW4gcHJlY2VkZW5jZSBncm91cHMuXG5jb25zdCBwcmVjZWRlbmNlZ3JvdXBLZXl3b3JkcyA9IFtcbiAgJ2Fzc2lnbm1lbnQnLFxuICAnYXNzb2NpYXRpdml0eScsXG4gICdoaWdoZXJUaGFuJyxcbiAgJ2xlZnQnLFxuICAnbG93ZXJUaGFuJyxcbiAgJ25vbmUnLFxuICAncmlnaHQnXG5dO1xuXG4vLyBLZXl3b3JkcyB0aGF0IHN0YXJ0IHdpdGggYSBudW1iZXIgc2lnbiAoIykuXG4vLyAjKHVuKWF2YWlsYWJsZSBpcyBoYW5kbGVkIHNlcGFyYXRlbHkuXG5jb25zdCBudW1iZXJTaWduS2V5d29yZHMgPSBbXG4gICcjY29sb3JMaXRlcmFsJyxcbiAgJyNjb2x1bW4nLFxuICAnI2Rzb2hhbmRsZScsXG4gICcjZWxzZScsXG4gICcjZWxzZWlmJyxcbiAgJyNlbmRpZicsXG4gICcjZXJyb3InLFxuICAnI2ZpbGUnLFxuICAnI2ZpbGVJRCcsXG4gICcjZmlsZUxpdGVyYWwnLFxuICAnI2ZpbGVQYXRoJyxcbiAgJyNmdW5jdGlvbicsXG4gICcjaWYnLFxuICAnI2ltYWdlTGl0ZXJhbCcsXG4gICcja2V5UGF0aCcsXG4gICcjbGluZScsXG4gICcjc2VsZWN0b3InLFxuICAnI3NvdXJjZUxvY2F0aW9uJyxcbiAgJyN3YXJuX3VucXVhbGlmaWVkX2FjY2VzcycsXG4gICcjd2FybmluZydcbl07XG5cbi8vIEdsb2JhbCBmdW5jdGlvbnMgaW4gdGhlIFN0YW5kYXJkIExpYnJhcnkuXG5jb25zdCBidWlsdElucyA9IFtcbiAgJ2FicycsXG4gICdhbGwnLFxuICAnYW55JyxcbiAgJ2Fzc2VydCcsXG4gICdhc3NlcnRpb25GYWlsdXJlJyxcbiAgJ2RlYnVnUHJpbnQnLFxuICAnZHVtcCcsXG4gICdmYXRhbEVycm9yJyxcbiAgJ2dldFZhTGlzdCcsXG4gICdpc0tub3duVW5pcXVlbHlSZWZlcmVuY2VkJyxcbiAgJ21heCcsXG4gICdtaW4nLFxuICAnbnVtZXJpY0Nhc3QnLFxuICAncG9pbnR3aXNlTWF4JyxcbiAgJ3BvaW50d2lzZU1pbicsXG4gICdwcmVjb25kaXRpb24nLFxuICAncHJlY29uZGl0aW9uRmFpbHVyZScsXG4gICdwcmludCcsXG4gICdyZWFkTGluZScsXG4gICdyZXBlYXRFbGVtZW50JyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ3N0cmlkZScsXG4gICdzd2FwJyxcbiAgJ3N3aWZ0X3VuYm94RnJvbVN3aWZ0VmFsdWVXaXRoVHlwZScsXG4gICd0cmFuc2NvZGUnLFxuICAndHlwZScsXG4gICd1bnNhZmVCaXRDYXN0JyxcbiAgJ3Vuc2FmZURvd25jYXN0JyxcbiAgJ3dpdGhFeHRlbmRlZExpZmV0aW1lJyxcbiAgJ3dpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcicsXG4gICd3aXRoVW5zYWZlUG9pbnRlcicsXG4gICd3aXRoVmFMaXN0JyxcbiAgJ3dpdGhvdXRBY3R1YWxseUVzY2FwaW5nJyxcbiAgJ3ppcCdcbl07XG5cbi8vIFZhbGlkIGZpcnN0IGNoYXJhY3RlcnMgZm9yIG9wZXJhdG9ycy5cbmNvbnN0IG9wZXJhdG9ySGVhZCA9IGVpdGhlcihcbiAgL1svPVxcLSshKiU8PiZ8Xn4/XS8sXG4gIC9bXFx1MDBBMS1cXHUwMEE3XS8sXG4gIC9bXFx1MDBBOVxcdTAwQUJdLyxcbiAgL1tcXHUwMEFDXFx1MDBBRV0vLFxuICAvW1xcdTAwQjBcXHUwMEIxXS8sXG4gIC9bXFx1MDBCNlxcdTAwQkJcXHUwMEJGXFx1MDBEN1xcdTAwRjddLyxcbiAgL1tcXHUyMDE2LVxcdTIwMTddLyxcbiAgL1tcXHUyMDIwLVxcdTIwMjddLyxcbiAgL1tcXHUyMDMwLVxcdTIwM0VdLyxcbiAgL1tcXHUyMDQxLVxcdTIwNTNdLyxcbiAgL1tcXHUyMDU1LVxcdTIwNUVdLyxcbiAgL1tcXHUyMTkwLVxcdTIzRkZdLyxcbiAgL1tcXHUyNTAwLVxcdTI3NzVdLyxcbiAgL1tcXHUyNzk0LVxcdTJCRkZdLyxcbiAgL1tcXHUyRTAwLVxcdTJFN0ZdLyxcbiAgL1tcXHUzMDAxLVxcdTMwMDNdLyxcbiAgL1tcXHUzMDA4LVxcdTMwMjBdLyxcbiAgL1tcXHUzMDMwXS9cbik7XG5cbi8vIFZhbGlkIGNoYXJhY3RlcnMgZm9yIG9wZXJhdG9ycy5cbmNvbnN0IG9wZXJhdG9yQ2hhcmFjdGVyID0gZWl0aGVyKFxuICBvcGVyYXRvckhlYWQsXG4gIC9bXFx1MDMwMC1cXHUwMzZGXS8sXG4gIC9bXFx1MURDMC1cXHUxREZGXS8sXG4gIC9bXFx1MjBEMC1cXHUyMEZGXS8sXG4gIC9bXFx1RkUwMC1cXHVGRTBGXS8sXG4gIC9bXFx1RkUyMC1cXHVGRTJGXS9cbiAgLy8gVE9ETzogVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSBhbHNvIGFsbG93ZWQsIGJ1dCB0aGUgcmVnZXggaXNuJ3Qgc3VwcG9ydGVkIHlldC5cbiAgLy8gL1tcXHV7RTAxMDB9LVxcdXtFMDFFRn1dL3Vcbik7XG5cbi8vIFZhbGlkIG9wZXJhdG9yLlxuY29uc3Qgb3BlcmF0b3IgPSBjb25jYXQob3BlcmF0b3JIZWFkLCBvcGVyYXRvckNoYXJhY3RlciwgJyonKTtcblxuLy8gVmFsaWQgZmlyc3QgY2hhcmFjdGVycyBmb3IgaWRlbnRpZmllcnMuXG5jb25zdCBpZGVudGlmaWVySGVhZCA9IGVpdGhlcihcbiAgL1thLXpBLVpfXS8sXG4gIC9bXFx1MDBBOFxcdTAwQUFcXHUwMEFEXFx1MDBBRlxcdTAwQjItXFx1MDBCNVxcdTAwQjctXFx1MDBCQV0vLFxuICAvW1xcdTAwQkMtXFx1MDBCRVxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDBGRl0vLFxuICAvW1xcdTAxMDAtXFx1MDJGRlxcdTAzNzAtXFx1MTY3RlxcdTE2ODEtXFx1MTgwRFxcdTE4MEYtXFx1MURCRl0vLFxuICAvW1xcdTFFMDAtXFx1MUZGRl0vLFxuICAvW1xcdTIwMEItXFx1MjAwRFxcdTIwMkEtXFx1MjAyRVxcdTIwM0YtXFx1MjA0MFxcdTIwNTRcXHUyMDYwLVxcdTIwNkZdLyxcbiAgL1tcXHUyMDcwLVxcdTIwQ0ZcXHUyMTAwLVxcdTIxOEZcXHUyNDYwLVxcdTI0RkZcXHUyNzc2LVxcdTI3OTNdLyxcbiAgL1tcXHUyQzAwLVxcdTJERkZcXHUyRTgwLVxcdTJGRkZdLyxcbiAgL1tcXHUzMDA0LVxcdTMwMDdcXHUzMDIxLVxcdTMwMkZcXHUzMDMxLVxcdTMwM0ZcXHUzMDQwLVxcdUQ3RkZdLyxcbiAgL1tcXHVGOTAwLVxcdUZEM0RcXHVGRDQwLVxcdUZEQ0ZcXHVGREYwLVxcdUZFMUZcXHVGRTMwLVxcdUZFNDRdLyxcbiAgL1tcXHVGRTQ3LVxcdUZFRkVcXHVGRjAwLVxcdUZGRkRdLyAvLyBTaG91bGQgYmUgL1tcXHVGRTQ3LVxcdUZGRkRdLywgYnV0IHdlIGhhdmUgdG8gZXhjbHVkZSBGRUZGLlxuICAvLyBUaGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIGFsc28gYWxsb3dlZCwgYnV0IHRoZSByZWdleGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0LlxuICAvLyAvW1xcdXsxMDAwMH0tXFx1ezFGRkZEfVxcdXsyMDAwMC1cXHV7MkZGRkR9XFx1ezMwMDAwfS1cXHV7M0ZGRkR9XFx1ezQwMDAwfS1cXHV7NEZGRkR9XS91LFxuICAvLyAvW1xcdXs1MDAwMH0tXFx1ezVGRkZEfVxcdXs2MDAwMC1cXHV7NkZGRkR9XFx1ezcwMDAwfS1cXHV7N0ZGRkR9XFx1ezgwMDAwfS1cXHV7OEZGRkR9XS91LFxuICAvLyAvW1xcdXs5MDAwMH0tXFx1ezlGRkZEfVxcdXtBMDAwMC1cXHV7QUZGRkR9XFx1e0IwMDAwfS1cXHV7QkZGRkR9XFx1e0MwMDAwfS1cXHV7Q0ZGRkR9XS91LFxuICAvLyAvW1xcdXtEMDAwMH0tXFx1e0RGRkZEfVxcdXtFMDAwMC1cXHV7RUZGRkR9XS91XG4pO1xuXG4vLyBWYWxpZCBjaGFyYWN0ZXJzIGZvciBpZGVudGlmaWVycy5cbmNvbnN0IGlkZW50aWZpZXJDaGFyYWN0ZXIgPSBlaXRoZXIoXG4gIGlkZW50aWZpZXJIZWFkLFxuICAvXFxkLyxcbiAgL1tcXHUwMzAwLVxcdTAzNkZcXHUxREMwLVxcdTFERkZcXHUyMEQwLVxcdTIwRkZcXHVGRTIwLVxcdUZFMkZdL1xuKTtcblxuLy8gVmFsaWQgaWRlbnRpZmllci5cbmNvbnN0IGlkZW50aWZpZXIgPSBjb25jYXQoaWRlbnRpZmllckhlYWQsIGlkZW50aWZpZXJDaGFyYWN0ZXIsICcqJyk7XG5cbi8vIFZhbGlkIHR5cGUgaWRlbnRpZmllci5cbmNvbnN0IHR5cGVJZGVudGlmaWVyID0gY29uY2F0KC9bQS1aXS8sIGlkZW50aWZpZXJDaGFyYWN0ZXIsICcqJyk7XG5cbi8vIEJ1aWx0LWluIGF0dHJpYnV0ZXMsIHdoaWNoIGFyZSBoaWdobGlnaHRlZCBhcyBrZXl3b3Jkcy5cbi8vIEBhdmFpbGFibGUgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5LlxuY29uc3Qga2V5d29yZEF0dHJpYnV0ZXMgPSBbXG4gICdhdXRvY2xvc3VyZScsXG4gIGNvbmNhdCgvY29udmVudGlvblxcKC8sIGVpdGhlcignc3dpZnQnLCAnYmxvY2snLCAnYycpLCAvXFwpLyksXG4gICdkaXNjYXJkYWJsZVJlc3VsdCcsXG4gICdkeW5hbWljQ2FsbGFibGUnLFxuICAnZHluYW1pY01lbWJlckxvb2t1cCcsXG4gICdlc2NhcGluZycsXG4gICdmcm96ZW4nLFxuICAnR0tJbnNwZWN0YWJsZScsXG4gICdJQkFjdGlvbicsXG4gICdJQkRlc2lnbmFibGUnLFxuICAnSUJJbnNwZWN0YWJsZScsXG4gICdJQk91dGxldCcsXG4gICdJQlNlZ3VlQWN0aW9uJyxcbiAgJ2lubGluYWJsZScsXG4gICdtYWluJyxcbiAgJ25vbm9iamMnLFxuICAnTlNBcHBsaWNhdGlvbk1haW4nLFxuICAnTlNDb3B5aW5nJyxcbiAgJ05TTWFuYWdlZCcsXG4gIGNvbmNhdCgvb2JqY1xcKC8sIGlkZW50aWZpZXIsIC9cXCkvKSxcbiAgJ29iamMnLFxuICAnb2JqY01lbWJlcnMnLFxuICAncHJvcGVydHlXcmFwcGVyJyxcbiAgJ3JlcXVpcmVzX3N0b3JlZF9wcm9wZXJ0eV9pbml0cycsXG4gICdyZXN1bHRCdWlsZGVyJyxcbiAgJ3Rlc3RhYmxlJyxcbiAgJ1VJQXBwbGljYXRpb25NYWluJyxcbiAgJ3Vua25vd24nLFxuICAndXNhYmxlRnJvbUlubGluZSdcbl07XG5cbi8vIENvbnRleHR1YWwga2V5d29yZHMgdXNlZCBpbiBAYXZhaWxhYmxlIGFuZCAjKHVuKWF2YWlsYWJsZS5cbmNvbnN0IGF2YWlsYWJpbGl0eUtleXdvcmRzID0gW1xuICAnaU9TJyxcbiAgJ2lPU0FwcGxpY2F0aW9uRXh0ZW5zaW9uJyxcbiAgJ21hY09TJyxcbiAgJ21hY09TQXBwbGljYXRpb25FeHRlbnNpb24nLFxuICAnbWFjQ2F0YWx5c3QnLFxuICAnbWFjQ2F0YWx5c3RBcHBsaWNhdGlvbkV4dGVuc2lvbicsXG4gICd3YXRjaE9TJyxcbiAgJ3dhdGNoT1NBcHBsaWNhdGlvbkV4dGVuc2lvbicsXG4gICd0dk9TJyxcbiAgJ3R2T1NBcHBsaWNhdGlvbkV4dGVuc2lvbicsXG4gICdzd2lmdCdcbl07XG5cbi8qXG5MYW5ndWFnZTogU3dpZnRcbkRlc2NyaXB0aW9uOiBTd2lmdCBpcyBhIGdlbmVyYWwtcHVycG9zZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBidWlsdCB1c2luZyBhIG1vZGVybiBhcHByb2FjaCB0byBzYWZldHksIHBlcmZvcm1hbmNlLCBhbmQgc29mdHdhcmUgZGVzaWduIHBhdHRlcm5zLlxuQXV0aG9yOiBTdGV2ZW4gVmFuIEltcGUgPHN0ZXZlbi52YW5pbXBlQGljbG91ZC5jb20+XG5Db250cmlidXRvcnM6IENocmlzIEVpZGhvZiA8Y2hyaXNAZWlkaG9mLm5sPiwgTmF0ZSBDb29rIDxuYXRlY29va0BnbWFpbC5jb20+LCBBbGV4YW5kZXIgTGljaHRlciA8bWFubmlMQGdteC5uZXQ+LCBSaWNoYXJkIEdpYnNvbiA8Z2lic29uMDQyQGdpdGh1Yj5cbldlYnNpdGU6IGh0dHBzOi8vc3dpZnQub3JnXG5DYXRlZ29yeTogY29tbW9uLCBzeXN0ZW1cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiBzd2lmdChobGpzKSB7XG4gIGNvbnN0IFdISVRFU1BBQ0UgPSB7XG4gICAgbWF0Y2g6IC9cXHMrLyxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9MZXhpY2FsU3RydWN0dXJlLmh0bWwjSUQ0MTFcbiAgY29uc3QgQkxPQ0tfQ09NTUVOVCA9IGhsanMuQ09NTUVOVChcbiAgICAnL1xcXFwqJyxcbiAgICAnXFxcXCovJyxcbiAgICB7IGNvbnRhaW5zOiBbICdzZWxmJyBdIH1cbiAgKTtcbiAgY29uc3QgQ09NTUVOVFMgPSBbXG4gICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFLFxuICAgIEJMT0NLX0NPTU1FTlRcbiAgXTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0xleGljYWxTdHJ1Y3R1cmUuaHRtbCNJRDQxM1xuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL3p6U3VtbWFyeU9mVGhlR3JhbW1hci5odG1sXG4gIGNvbnN0IERPVF9LRVlXT1JEID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvXFwuLyxcbiAgICAgIGVpdGhlciguLi5kb3RLZXl3b3JkcywgLi4ub3B0aW9uYWxEb3RLZXl3b3JkcylcbiAgICBdLFxuICAgIGNsYXNzTmFtZTogeyAyOiBcImtleXdvcmRcIiB9XG4gIH07XG4gIGNvbnN0IEtFWVdPUkRfR1VBUkQgPSB7XG4gICAgLy8gQ29uc3VtZSAua2V5d29yZCB0byBwcmV2ZW50IGhpZ2hsaWdodGluZyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGFzIGtleXdvcmRzLlxuICAgIG1hdGNoOiBjb25jYXQoL1xcLi8sIGVpdGhlciguLi5rZXl3b3JkcykpLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuICBjb25zdCBQTEFJTl9LRVlXT1JEUyA9IGtleXdvcmRzXG4gICAgLmZpbHRlcihrdyA9PiB0eXBlb2Yga3cgPT09ICdzdHJpbmcnKVxuICAgIC5jb25jYXQoWyBcIl98MFwiIF0pOyAvLyBzZWVtcyBjb21tb24sIHNvIDAgcmVsZXZhbmNlXG4gIGNvbnN0IFJFR0VYX0tFWVdPUkRTID0ga2V5d29yZHNcbiAgICAuZmlsdGVyKGt3ID0+IHR5cGVvZiBrdyAhPT0gJ3N0cmluZycpIC8vIGZpbmQgcmVnZXhcbiAgICAuY29uY2F0KGtleXdvcmRUeXBlcylcbiAgICAubWFwKGtleXdvcmRXcmFwcGVyKTtcbiAgY29uc3QgS0VZV09SRCA9IHsgdmFyaWFudHM6IFtcbiAgICB7XG4gICAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICAgIG1hdGNoOiBlaXRoZXIoLi4uUkVHRVhfS0VZV09SRFMsIC4uLm9wdGlvbmFsRG90S2V5d29yZHMpXG4gICAgfVxuICBdIH07XG4gIC8vIGZpbmQgYWxsIHRoZSByZWd1bGFyIGtleXdvcmRzXG4gIGNvbnN0IEtFWVdPUkRTID0ge1xuICAgICRwYXR0ZXJuOiBlaXRoZXIoXG4gICAgICAvXFxiXFx3Ky8sIC8vIHJlZ3VsYXIga2V5d29yZHNcbiAgICAgIC8jXFx3Ky8gLy8gbnVtYmVyIGtleXdvcmRzXG4gICAgKSxcbiAgICBrZXl3b3JkOiBQTEFJTl9LRVlXT1JEU1xuICAgICAgLmNvbmNhdChudW1iZXJTaWduS2V5d29yZHMpLFxuICAgIGxpdGVyYWw6IGxpdGVyYWxzXG4gIH07XG4gIGNvbnN0IEtFWVdPUkRfTU9ERVMgPSBbXG4gICAgRE9UX0tFWVdPUkQsXG4gICAgS0VZV09SRF9HVUFSRCxcbiAgICBLRVlXT1JEXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGxlL3N3aWZ0L3RyZWUvbWFpbi9zdGRsaWIvcHVibGljL2NvcmVcbiAgY29uc3QgQlVJTFRfSU5fR1VBUkQgPSB7XG4gICAgLy8gQ29uc3VtZSAuYnVpbHRfaW4gdG8gcHJldmVudCBoaWdobGlnaHRpbmcgcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cbiAgICBtYXRjaDogY29uY2F0KC9cXC4vLCBlaXRoZXIoLi4uYnVpbHRJbnMpKSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgQlVJTFRfSU4gPSB7XG4gICAgY2xhc3NOYW1lOiAnYnVpbHRfaW4nLFxuICAgIG1hdGNoOiBjb25jYXQoL1xcYi8sIGVpdGhlciguLi5idWlsdElucyksIC8oPz1cXCgpLylcbiAgfTtcbiAgY29uc3QgQlVJTFRfSU5TID0gW1xuICAgIEJVSUxUX0lOX0dVQVJELFxuICAgIEJVSUxUX0lOXG4gIF07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9MZXhpY2FsU3RydWN0dXJlLmh0bWwjSUQ0MThcbiAgY29uc3QgT1BFUkFUT1JfR1VBUkQgPSB7XG4gICAgLy8gUHJldmVudCAtPiBmcm9tIGJlaW5nIGhpZ2hsaWdodGluZyBhcyBhbiBvcGVyYXRvci5cbiAgICBtYXRjaDogLy0+LyxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgT1BFUkFUT1IgPSB7XG4gICAgY2xhc3NOYW1lOiAnb3BlcmF0b3InLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBtYXRjaDogb3BlcmF0b3IgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gZG90LW9wZXJhdG9yOiBvbmx5IG9wZXJhdG9ycyB0aGF0IHN0YXJ0IHdpdGggYSBkb3QgYXJlIGFsbG93ZWQgdG8gdXNlIGRvdHMgYXNcbiAgICAgICAgLy8gY2hhcmFjdGVycyAoLi4uLCAuLi48LCAuKiwgZXRjKS4gU28gdGhlcmUgcnVsZSBoZXJlIGlzOiBhIGRvdCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZVxuICAgICAgICAvLyBjaGFyYWN0ZXJzIHRoYXQgbWF5IGFsc28gaW5jbHVkZSBkb3RzLlxuICAgICAgICBtYXRjaDogYFxcXFwuKFxcXFwufCR7b3BlcmF0b3JDaGFyYWN0ZXJ9KStgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IE9QRVJBVE9SUyA9IFtcbiAgICBPUEVSQVRPUl9HVUFSRCxcbiAgICBPUEVSQVRPUlxuICBdO1xuXG4gIC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9SZWZlcmVuY2VNYW51YWwvTGV4aWNhbFN0cnVjdHVyZS5odG1sI2dyYW1tYXJfbnVtZXJpYy1saXRlcmFsXG4gIC8vIFRPRE86IFVwZGF0ZSBmb3IgbGVhZGluZyBgLWAgYWZ0ZXIgbG9va2JlaGluZCBpcyBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICBjb25zdCBkZWNpbWFsRGlnaXRzID0gJyhbMC05XV8qKSsnO1xuICBjb25zdCBoZXhEaWdpdHMgPSAnKFswLTlhLWZBLUZdXyopKyc7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAgLy8gZGVjaW1hbCBmbG9hdGluZy1wb2ludC1saXRlcmFsIChzdWJzdW1lcyBkZWNpbWFsLWxpdGVyYWwpXG4gICAgICB7IG1hdGNoOiBgXFxcXGIoJHtkZWNpbWFsRGlnaXRzfSkoXFxcXC4oJHtkZWNpbWFsRGlnaXRzfSkpP2AgKyBgKFtlRV1bKy1dPygke2RlY2ltYWxEaWdpdHN9KSk/XFxcXGJgIH0sXG4gICAgICAvLyBoZXhhZGVjaW1hbCBmbG9hdGluZy1wb2ludC1saXRlcmFsIChzdWJzdW1lcyBoZXhhZGVjaW1hbC1saXRlcmFsKVxuICAgICAgeyBtYXRjaDogYFxcXFxiMHgoJHtoZXhEaWdpdHN9KShcXFxcLigke2hleERpZ2l0c30pKT9gICsgYChbcFBdWystXT8oJHtkZWNpbWFsRGlnaXRzfSkpP1xcXFxiYCB9LFxuICAgICAgLy8gb2N0YWwtbGl0ZXJhbFxuICAgICAgeyBtYXRjaDogL1xcYjBvKFswLTddXyopK1xcYi8gfSxcbiAgICAgIC8vIGJpbmFyeS1saXRlcmFsXG4gICAgICB7IG1hdGNoOiAvXFxiMGIoWzAxXV8qKStcXGIvIH1cbiAgICBdXG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9MZXhpY2FsU3RydWN0dXJlLmh0bWwjZ3JhbW1hcl9zdHJpbmctbGl0ZXJhbFxuICBjb25zdCBFU0NBUEVEX0NIQVJBQ1RFUiA9IChyYXdEZWxpbWl0ZXIgPSBcIlwiKSA9PiAoe1xuICAgIGNsYXNzTmFtZTogJ3N1YnN0JyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBtYXRjaDogY29uY2F0KC9cXFxcLywgcmF3RGVsaW1pdGVyLCAvWzBcXFxcdG5yXCInXS8pIH0sXG4gICAgICB7IG1hdGNoOiBjb25jYXQoL1xcXFwvLCByYXdEZWxpbWl0ZXIsIC91XFx7WzAtOWEtZkEtRl17MSw4fVxcfS8pIH1cbiAgICBdXG4gIH0pO1xuICBjb25zdCBFU0NBUEVEX05FV0xJTkUgPSAocmF3RGVsaW1pdGVyID0gXCJcIikgPT4gKHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgbWF0Y2g6IGNvbmNhdCgvXFxcXC8sIHJhd0RlbGltaXRlciwgL1tcXHQgXSooPzpbXFxyXFxuXXxcXHJcXG4pLylcbiAgfSk7XG4gIGNvbnN0IElOVEVSUE9MQVRJT04gPSAocmF3RGVsaW1pdGVyID0gXCJcIikgPT4gKHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgbGFiZWw6IFwiaW50ZXJwb2xcIixcbiAgICBiZWdpbjogY29uY2F0KC9cXFxcLywgcmF3RGVsaW1pdGVyLCAvXFwoLyksXG4gICAgZW5kOiAvXFwpL1xuICB9KTtcbiAgY29uc3QgTVVMVElMSU5FX1NUUklORyA9IChyYXdEZWxpbWl0ZXIgPSBcIlwiKSA9PiAoe1xuICAgIGJlZ2luOiBjb25jYXQocmF3RGVsaW1pdGVyLCAvXCJcIlwiLyksXG4gICAgZW5kOiBjb25jYXQoL1wiXCJcIi8sIHJhd0RlbGltaXRlciksXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEVTQ0FQRURfQ0hBUkFDVEVSKHJhd0RlbGltaXRlciksXG4gICAgICBFU0NBUEVEX05FV0xJTkUocmF3RGVsaW1pdGVyKSxcbiAgICAgIElOVEVSUE9MQVRJT04ocmF3RGVsaW1pdGVyKVxuICAgIF1cbiAgfSk7XG4gIGNvbnN0IFNJTkdMRV9MSU5FX1NUUklORyA9IChyYXdEZWxpbWl0ZXIgPSBcIlwiKSA9PiAoe1xuICAgIGJlZ2luOiBjb25jYXQocmF3RGVsaW1pdGVyLCAvXCIvKSxcbiAgICBlbmQ6IGNvbmNhdCgvXCIvLCByYXdEZWxpbWl0ZXIpLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBFU0NBUEVEX0NIQVJBQ1RFUihyYXdEZWxpbWl0ZXIpLFxuICAgICAgSU5URVJQT0xBVElPTihyYXdEZWxpbWl0ZXIpXG4gICAgXVxuICB9KTtcbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIE1VTFRJTElORV9TVFJJTkcoKSxcbiAgICAgIE1VTFRJTElORV9TVFJJTkcoXCIjXCIpLFxuICAgICAgTVVMVElMSU5FX1NUUklORyhcIiMjXCIpLFxuICAgICAgTVVMVElMSU5FX1NUUklORyhcIiMjI1wiKSxcbiAgICAgIFNJTkdMRV9MSU5FX1NUUklORygpLFxuICAgICAgU0lOR0xFX0xJTkVfU1RSSU5HKFwiI1wiKSxcbiAgICAgIFNJTkdMRV9MSU5FX1NUUklORyhcIiMjXCIpLFxuICAgICAgU0lOR0xFX0xJTkVfU1RSSU5HKFwiIyMjXCIpXG4gICAgXVxuICB9O1xuXG4gIC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9SZWZlcmVuY2VNYW51YWwvTGV4aWNhbFN0cnVjdHVyZS5odG1sI0lENDEyXG4gIGNvbnN0IFFVT1RFRF9JREVOVElGSUVSID0geyBtYXRjaDogY29uY2F0KC9gLywgaWRlbnRpZmllciwgL2AvKSB9O1xuICBjb25zdCBJTVBMSUNJVF9QQVJBTUVURVIgPSB7XG4gICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgIG1hdGNoOiAvXFwkXFxkKy9cbiAgfTtcbiAgY29uc3QgUFJPUEVSVFlfV1JBUFBFUl9QUk9KRUNUSU9OID0ge1xuICAgIGNsYXNzTmFtZTogJ3ZhcmlhYmxlJyxcbiAgICBtYXRjaDogYFxcXFwkJHtpZGVudGlmaWVyQ2hhcmFjdGVyfStgXG4gIH07XG4gIGNvbnN0IElERU5USUZJRVJTID0gW1xuICAgIFFVT1RFRF9JREVOVElGSUVSLFxuICAgIElNUExJQ0lUX1BBUkFNRVRFUixcbiAgICBQUk9QRVJUWV9XUkFQUEVSX1BST0pFQ1RJT05cbiAgXTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0F0dHJpYnV0ZXMuaHRtbFxuICBjb25zdCBBVkFJTEFCTEVfQVRUUklCVVRFID0ge1xuICAgIG1hdGNoOiAvKEB8Iyh1bik/KWF2YWlsYWJsZS8sXG4gICAgY2xhc3NOYW1lOiBcImtleXdvcmRcIixcbiAgICBzdGFydHM6IHsgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgYmVnaW46IC9cXCgvLFxuICAgICAgICBlbmQ6IC9cXCkvLFxuICAgICAgICBrZXl3b3JkczogYXZhaWxhYmlsaXR5S2V5d29yZHMsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgLi4uT1BFUkFUT1JTLFxuICAgICAgICAgIE5VTUJFUixcbiAgICAgICAgICBTVFJJTkdcbiAgICAgICAgXVxuICAgICAgfVxuICAgIF0gfVxuICB9O1xuICBjb25zdCBLRVlXT1JEX0FUVFJJQlVURSA9IHtcbiAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICBtYXRjaDogY29uY2F0KC9ALywgZWl0aGVyKC4uLmtleXdvcmRBdHRyaWJ1dGVzKSlcbiAgfTtcbiAgY29uc3QgVVNFUl9ERUZJTkVEX0FUVFJJQlVURSA9IHtcbiAgICBjbGFzc05hbWU6ICdtZXRhJyxcbiAgICBtYXRjaDogY29uY2F0KC9ALywgaWRlbnRpZmllcilcbiAgfTtcbiAgY29uc3QgQVRUUklCVVRFUyA9IFtcbiAgICBBVkFJTEFCTEVfQVRUUklCVVRFLFxuICAgIEtFWVdPUkRfQVRUUklCVVRFLFxuICAgIFVTRVJfREVGSU5FRF9BVFRSSUJVVEVcbiAgXTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL1R5cGVzLmh0bWxcbiAgY29uc3QgVFlQRSA9IHtcbiAgICBtYXRjaDogbG9va2FoZWFkKC9cXGJbQS1aXS8pLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogW1xuICAgICAgeyAvLyBDb21tb24gQXBwbGUgZnJhbWV3b3JrcywgZm9yIHJlbGV2YW5jZSBib29zdFxuICAgICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgICAgbWF0Y2g6IGNvbmNhdCgvKEFWfENBfENGfENHfENJfENMfENNfENOfENUfE1LfE1QfE1US3xNVEx8TlN8U0NOfFNLfFVJfFdLfFhDKS8sIGlkZW50aWZpZXJDaGFyYWN0ZXIsICcrJylcbiAgICAgIH0sXG4gICAgICB7IC8vIFR5cGUgaWRlbnRpZmllclxuICAgICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgICAgbWF0Y2g6IHR5cGVJZGVudGlmaWVyLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7IC8vIE9wdGlvbmFsIHR5cGVcbiAgICAgICAgbWF0Y2g6IC9bPyFdKy8sXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIHsgLy8gVmFyaWFkaWMgcGFyYW1ldGVyXG4gICAgICAgIG1hdGNoOiAvXFwuXFwuXFwuLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgeyAvLyBQcm90b2NvbCBjb21wb3NpdGlvblxuICAgICAgICBtYXRjaDogY29uY2F0KC9cXHMrJlxccysvLCBsb29rYWhlYWQodHlwZUlkZW50aWZpZXIpKSxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBHRU5FUklDX0FSR1VNRU5UUyA9IHtcbiAgICBiZWdpbjogLzwvLFxuICAgIGVuZDogLz4vLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBjb250YWluczogW1xuICAgICAgLi4uQ09NTUVOVFMsXG4gICAgICAuLi5LRVlXT1JEX01PREVTLFxuICAgICAgLi4uQVRUUklCVVRFUyxcbiAgICAgIE9QRVJBVE9SX0dVQVJELFxuICAgICAgVFlQRVxuICAgIF1cbiAgfTtcbiAgVFlQRS5jb250YWlucy5wdXNoKEdFTkVSSUNfQVJHVU1FTlRTKTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0V4cHJlc3Npb25zLmh0bWwjSUQ1NTJcbiAgLy8gUHJldmVudHMgZWxlbWVudCBuYW1lcyBmcm9tIGJlaW5nIGhpZ2hsaWdodGVkIGFzIGtleXdvcmRzLlxuICBjb25zdCBUVVBMRV9FTEVNRU5UX05BTUUgPSB7XG4gICAgbWF0Y2g6IGNvbmNhdChpZGVudGlmaWVyLCAvXFxzKjovKSxcbiAgICBrZXl3b3JkczogXCJffDBcIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgLy8gTWF0Y2hlcyB0dXBsZXMgYXMgd2VsbCBhcyB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgYSBmdW5jdGlvbiB0eXBlLlxuICBjb25zdCBUVVBMRSA9IHtcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpLyxcbiAgICByZWxldmFuY2U6IDAsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICAnc2VsZicsXG4gICAgICBUVVBMRV9FTEVNRU5UX05BTUUsXG4gICAgICAuLi5DT01NRU5UUyxcbiAgICAgIC4uLktFWVdPUkRfTU9ERVMsXG4gICAgICAuLi5CVUlMVF9JTlMsXG4gICAgICAuLi5PUEVSQVRPUlMsXG4gICAgICBOVU1CRVIsXG4gICAgICBTVFJJTkcsXG4gICAgICAuLi5JREVOVElGSUVSUyxcbiAgICAgIC4uLkFUVFJJQlVURVMsXG4gICAgICBUWVBFXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IEdFTkVSSUNfUEFSQU1FVEVSUyA9IHtcbiAgICBiZWdpbjogLzwvLFxuICAgIGVuZDogLz4vLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICAuLi5DT01NRU5UUyxcbiAgICAgIFRZUEVcbiAgICBdXG4gIH07XG4gIGNvbnN0IEZVTkNUSU9OX1BBUkFNRVRFUl9OQU1FID0ge1xuICAgIGJlZ2luOiBlaXRoZXIoXG4gICAgICBsb29rYWhlYWQoY29uY2F0KGlkZW50aWZpZXIsIC9cXHMqOi8pKSxcbiAgICAgIGxvb2thaGVhZChjb25jYXQoaWRlbnRpZmllciwgL1xccysvLCBpZGVudGlmaWVyLCAvXFxzKjovKSlcbiAgICApLFxuICAgIGVuZDogLzovLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdrZXl3b3JkJyxcbiAgICAgICAgbWF0Y2g6IC9cXGJfXFxiL1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAncGFyYW1zJyxcbiAgICAgICAgbWF0Y2g6IGlkZW50aWZpZXJcbiAgICAgIH1cbiAgICBdXG4gIH07XG4gIGNvbnN0IEZVTkNUSU9OX1BBUkFNRVRFUlMgPSB7XG4gICAgYmVnaW46IC9cXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAga2V5d29yZHM6IEtFWVdPUkRTLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBGVU5DVElPTl9QQVJBTUVURVJfTkFNRSxcbiAgICAgIC4uLkNPTU1FTlRTLFxuICAgICAgLi4uS0VZV09SRF9NT0RFUyxcbiAgICAgIC4uLk9QRVJBVE9SUyxcbiAgICAgIE5VTUJFUixcbiAgICAgIFNUUklORyxcbiAgICAgIC4uLkFUVFJJQlVURVMsXG4gICAgICBUWVBFLFxuICAgICAgVFVQTEVcbiAgICBdLFxuICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgaWxsZWdhbDogL1tcIiddL1xuICB9O1xuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0RlY2xhcmF0aW9ucy5odG1sI0lEMzYyXG4gIGNvbnN0IEZVTkNUSU9OID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvZnVuYy8sXG4gICAgICAvXFxzKy8sXG4gICAgICBlaXRoZXIoUVVPVEVEX0lERU5USUZJRVIubWF0Y2gsIGlkZW50aWZpZXIsIG9wZXJhdG9yKVxuICAgIF0sXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIEdFTkVSSUNfUEFSQU1FVEVSUyxcbiAgICAgIEZVTkNUSU9OX1BBUkFNRVRFUlMsXG4gICAgICBXSElURVNQQUNFXG4gICAgXSxcbiAgICBpbGxlZ2FsOiBbXG4gICAgICAvXFxbLyxcbiAgICAgIC8lL1xuICAgIF1cbiAgfTtcblxuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0RlY2xhcmF0aW9ucy5odG1sI0lEMzc1XG4gIC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9SZWZlcmVuY2VNYW51YWwvRGVjbGFyYXRpb25zLmh0bWwjSUQzNzlcbiAgY29uc3QgSU5JVF9TVUJTQ1JJUFQgPSB7XG4gICAgbWF0Y2g6IFtcbiAgICAgIC9cXGIoPzpzdWJzY3JpcHR8aW5pdFs/IV0/KS8sXG4gICAgICAvXFxzKig/PVs8KF0pLyxcbiAgICBdLFxuICAgIGNsYXNzTmFtZTogeyAxOiBcImtleXdvcmRcIiB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBHRU5FUklDX1BBUkFNRVRFUlMsXG4gICAgICBGVU5DVElPTl9QQVJBTUVURVJTLFxuICAgICAgV0hJVEVTUEFDRVxuICAgIF0sXG4gICAgaWxsZWdhbDogL1xcW3wlL1xuICB9O1xuICAvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svUmVmZXJlbmNlTWFudWFsL0RlY2xhcmF0aW9ucy5odG1sI0lEMzgwXG4gIGNvbnN0IE9QRVJBVE9SX0RFQ0xBUkFUSU9OID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvb3BlcmF0b3IvLFxuICAgICAgL1xccysvLFxuICAgICAgb3BlcmF0b3JcbiAgICBdLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlXCJcbiAgICB9XG4gIH07XG5cbiAgLy8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL1JlZmVyZW5jZU1hbnVhbC9EZWNsYXJhdGlvbnMuaHRtbCNJRDU1MFxuICBjb25zdCBQUkVDRURFTkNFR1JPVVAgPSB7XG4gICAgYmVnaW46IFtcbiAgICAgIC9wcmVjZWRlbmNlZ3JvdXAvLFxuICAgICAgL1xccysvLFxuICAgICAgdHlwZUlkZW50aWZpZXJcbiAgICBdLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlXCJcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbIFRZUEUgXSxcbiAgICBrZXl3b3JkczogW1xuICAgICAgLi4ucHJlY2VkZW5jZWdyb3VwS2V5d29yZHMsXG4gICAgICAuLi5saXRlcmFsc1xuICAgIF0sXG4gICAgZW5kOiAvfS9cbiAgfTtcblxuICAvLyBBZGQgc3VwcG9ydGVkIHN1Ym1vZGVzIHRvIHN0cmluZyBpbnRlcnBvbGF0aW9uLlxuICBmb3IgKGNvbnN0IHZhcmlhbnQgb2YgU1RSSU5HLnZhcmlhbnRzKSB7XG4gICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IHZhcmlhbnQuY29udGFpbnMuZmluZChtb2RlID0+IG1vZGUubGFiZWwgPT09IFwiaW50ZXJwb2xcIik7XG4gICAgLy8gVE9ETzogSW50ZXJwb2xhdGlvbiBjYW4gY29udGFpbiBhbnkgZXhwcmVzc2lvbiwgc28gdGhlcmUncyByb29tIGZvciBpbXByb3ZlbWVudCBoZXJlLlxuICAgIGludGVycG9sYXRpb24ua2V5d29yZHMgPSBLRVlXT1JEUztcbiAgICBjb25zdCBzdWJtb2RlcyA9IFtcbiAgICAgIC4uLktFWVdPUkRfTU9ERVMsXG4gICAgICAuLi5CVUlMVF9JTlMsXG4gICAgICAuLi5PUEVSQVRPUlMsXG4gICAgICBOVU1CRVIsXG4gICAgICBTVFJJTkcsXG4gICAgICAuLi5JREVOVElGSUVSU1xuICAgIF07XG4gICAgaW50ZXJwb2xhdGlvbi5jb250YWlucyA9IFtcbiAgICAgIC4uLnN1Ym1vZGVzLFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1xcKC8sXG4gICAgICAgIGVuZDogL1xcKS8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgJ3NlbGYnLFxuICAgICAgICAgIC4uLnN1Ym1vZGVzXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnU3dpZnQnLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyxcbiAgICBjb250YWluczogW1xuICAgICAgLi4uQ09NTUVOVFMsXG4gICAgICBGVU5DVElPTixcbiAgICAgIElOSVRfU1VCU0NSSVBULFxuICAgICAge1xuICAgICAgICBiZWdpbktleXdvcmRzOiAnc3RydWN0IHByb3RvY29sIGNsYXNzIGV4dGVuc2lvbiBlbnVtIGFjdG9yJyxcbiAgICAgICAgZW5kOiAnXFxcXHsnLFxuICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICBrZXl3b3JkczogS0VZV09SRFMsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuVElUTEVfTU9ERSwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInRpdGxlLmNsYXNzXCIsXG4gICAgICAgICAgICBiZWdpbjogL1tBLVphLXokX11bXFx1MDBDMC1cXHUwMkI4MC05QS1aYS16JF9dKi9cbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5LRVlXT1JEX01PREVTXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBPUEVSQVRPUl9ERUNMQVJBVElPTixcbiAgICAgIFBSRUNFREVOQ0VHUk9VUCxcbiAgICAgIHtcbiAgICAgICAgYmVnaW5LZXl3b3JkczogJ2ltcG9ydCcsXG4gICAgICAgIGVuZDogLyQvLFxuICAgICAgICBjb250YWluczogWyAuLi5DT01NRU5UUyBdLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICAuLi5LRVlXT1JEX01PREVTLFxuICAgICAgLi4uQlVJTFRfSU5TLFxuICAgICAgLi4uT1BFUkFUT1JTLFxuICAgICAgTlVNQkVSLFxuICAgICAgU1RSSU5HLFxuICAgICAgLi4uSURFTlRJRklFUlMsXG4gICAgICAuLi5BVFRSSUJVVEVTLFxuICAgICAgVFlQRSxcbiAgICAgIFRVUExFXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyBzd2lmdCBhcyBkZWZhdWx0IH07XG4iLCAiY29uc3QgSURFTlRfUkUgPSAnW0EtWmEteiRfXVswLTlBLVphLXokX10qJztcbmNvbnN0IEtFWVdPUkRTID0gW1xuICBcImFzXCIsIC8vIGZvciBleHBvcnRzXG4gIFwiaW5cIixcbiAgXCJvZlwiLFxuICBcImlmXCIsXG4gIFwiZm9yXCIsXG4gIFwid2hpbGVcIixcbiAgXCJmaW5hbGx5XCIsXG4gIFwidmFyXCIsXG4gIFwibmV3XCIsXG4gIFwiZnVuY3Rpb25cIixcbiAgXCJkb1wiLFxuICBcInJldHVyblwiLFxuICBcInZvaWRcIixcbiAgXCJlbHNlXCIsXG4gIFwiYnJlYWtcIixcbiAgXCJjYXRjaFwiLFxuICBcImluc3RhbmNlb2ZcIixcbiAgXCJ3aXRoXCIsXG4gIFwidGhyb3dcIixcbiAgXCJjYXNlXCIsXG4gIFwiZGVmYXVsdFwiLFxuICBcInRyeVwiLFxuICBcInN3aXRjaFwiLFxuICBcImNvbnRpbnVlXCIsXG4gIFwidHlwZW9mXCIsXG4gIFwiZGVsZXRlXCIsXG4gIFwibGV0XCIsXG4gIFwieWllbGRcIixcbiAgXCJjb25zdFwiLFxuICBcImNsYXNzXCIsXG4gIC8vIEpTIGhhbmRsZXMgdGhlc2Ugd2l0aCBhIHNwZWNpYWwgcnVsZVxuICAvLyBcImdldFwiLFxuICAvLyBcInNldFwiLFxuICBcImRlYnVnZ2VyXCIsXG4gIFwiYXN5bmNcIixcbiAgXCJhd2FpdFwiLFxuICBcInN0YXRpY1wiLFxuICBcImltcG9ydFwiLFxuICBcImZyb21cIixcbiAgXCJleHBvcnRcIixcbiAgXCJleHRlbmRzXCJcbl07XG5jb25zdCBMSVRFUkFMUyA9IFtcbiAgXCJ0cnVlXCIsXG4gIFwiZmFsc2VcIixcbiAgXCJudWxsXCIsXG4gIFwidW5kZWZpbmVkXCIsXG4gIFwiTmFOXCIsXG4gIFwiSW5maW5pdHlcIlxuXTtcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHNcbmNvbnN0IFRZUEVTID0gW1xuICAvLyBGdW5kYW1lbnRhbCBvYmplY3RzXG4gIFwiT2JqZWN0XCIsXG4gIFwiRnVuY3Rpb25cIixcbiAgXCJCb29sZWFuXCIsXG4gIFwiU3ltYm9sXCIsXG4gIC8vIG51bWJlcnMgYW5kIGRhdGVzXG4gIFwiTWF0aFwiLFxuICBcIkRhdGVcIixcbiAgXCJOdW1iZXJcIixcbiAgXCJCaWdJbnRcIixcbiAgLy8gdGV4dFxuICBcIlN0cmluZ1wiLFxuICBcIlJlZ0V4cFwiLFxuICAvLyBJbmRleGVkIGNvbGxlY3Rpb25zXG4gIFwiQXJyYXlcIixcbiAgXCJGbG9hdDMyQXJyYXlcIixcbiAgXCJGbG9hdDY0QXJyYXlcIixcbiAgXCJJbnQ4QXJyYXlcIixcbiAgXCJVaW50OEFycmF5XCIsXG4gIFwiVWludDhDbGFtcGVkQXJyYXlcIixcbiAgXCJJbnQxNkFycmF5XCIsXG4gIFwiSW50MzJBcnJheVwiLFxuICBcIlVpbnQxNkFycmF5XCIsXG4gIFwiVWludDMyQXJyYXlcIixcbiAgXCJCaWdJbnQ2NEFycmF5XCIsXG4gIFwiQmlnVWludDY0QXJyYXlcIixcbiAgLy8gS2V5ZWQgY29sbGVjdGlvbnNcbiAgXCJTZXRcIixcbiAgXCJNYXBcIixcbiAgXCJXZWFrU2V0XCIsXG4gIFwiV2Vha01hcFwiLFxuICAvLyBTdHJ1Y3R1cmVkIGRhdGFcbiAgXCJBcnJheUJ1ZmZlclwiLFxuICBcIlNoYXJlZEFycmF5QnVmZmVyXCIsXG4gIFwiQXRvbWljc1wiLFxuICBcIkRhdGFWaWV3XCIsXG4gIFwiSlNPTlwiLFxuICAvLyBDb250cm9sIGFic3RyYWN0aW9uIG9iamVjdHNcbiAgXCJQcm9taXNlXCIsXG4gIFwiR2VuZXJhdG9yXCIsXG4gIFwiR2VuZXJhdG9yRnVuY3Rpb25cIixcbiAgXCJBc3luY0Z1bmN0aW9uXCIsXG4gIC8vIFJlZmxlY3Rpb25cbiAgXCJSZWZsZWN0XCIsXG4gIFwiUHJveHlcIixcbiAgLy8gSW50ZXJuYXRpb25hbGl6YXRpb25cbiAgXCJJbnRsXCIsXG4gIC8vIFdlYkFzc2VtYmx5XG4gIFwiV2ViQXNzZW1ibHlcIlxuXTtcblxuY29uc3QgRVJST1JfVFlQRVMgPSBbXG4gIFwiRXJyb3JcIixcbiAgXCJFdmFsRXJyb3JcIixcbiAgXCJJbnRlcm5hbEVycm9yXCIsXG4gIFwiUmFuZ2VFcnJvclwiLFxuICBcIlJlZmVyZW5jZUVycm9yXCIsXG4gIFwiU3ludGF4RXJyb3JcIixcbiAgXCJUeXBlRXJyb3JcIixcbiAgXCJVUklFcnJvclwiXG5dO1xuXG5jb25zdCBCVUlMVF9JTl9HTE9CQUxTID0gW1xuICBcInNldEludGVydmFsXCIsXG4gIFwic2V0VGltZW91dFwiLFxuICBcImNsZWFySW50ZXJ2YWxcIixcbiAgXCJjbGVhclRpbWVvdXRcIixcblxuICBcInJlcXVpcmVcIixcbiAgXCJleHBvcnRzXCIsXG5cbiAgXCJldmFsXCIsXG4gIFwiaXNGaW5pdGVcIixcbiAgXCJpc05hTlwiLFxuICBcInBhcnNlRmxvYXRcIixcbiAgXCJwYXJzZUludFwiLFxuICBcImRlY29kZVVSSVwiLFxuICBcImRlY29kZVVSSUNvbXBvbmVudFwiLFxuICBcImVuY29kZVVSSVwiLFxuICBcImVuY29kZVVSSUNvbXBvbmVudFwiLFxuICBcImVzY2FwZVwiLFxuICBcInVuZXNjYXBlXCJcbl07XG5cbmNvbnN0IEJVSUxUX0lOX1ZBUklBQkxFUyA9IFtcbiAgXCJhcmd1bWVudHNcIixcbiAgXCJ0aGlzXCIsXG4gIFwic3VwZXJcIixcbiAgXCJjb25zb2xlXCIsXG4gIFwid2luZG93XCIsXG4gIFwiZG9jdW1lbnRcIixcbiAgXCJsb2NhbFN0b3JhZ2VcIixcbiAgXCJzZXNzaW9uU3RvcmFnZVwiLFxuICBcIm1vZHVsZVwiLFxuICBcImdsb2JhbFwiIC8vIE5vZGUuanNcbl07XG5cbmNvbnN0IEJVSUxUX0lOUyA9IFtdLmNvbmNhdChcbiAgQlVJTFRfSU5fR0xPQkFMUyxcbiAgVFlQRVMsXG4gIEVSUk9SX1RZUEVTXG4pO1xuXG4vKlxuTGFuZ3VhZ2U6IEphdmFTY3JpcHRcbkRlc2NyaXB0aW9uOiBKYXZhU2NyaXB0IChKUykgaXMgYSBsaWdodHdlaWdodCwgaW50ZXJwcmV0ZWQsIG9yIGp1c3QtaW4tdGltZSBjb21waWxlZCBwcm9ncmFtbWluZyBsYW5ndWFnZSB3aXRoIGZpcnN0LWNsYXNzIGZ1bmN0aW9ucy5cbkNhdGVnb3J5OiBjb21tb24sIHNjcmlwdGluZywgd2ViXG5XZWJzaXRlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0XG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gamF2YXNjcmlwdChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RyaW5nIGxpa2UgXCI8Qm9vZ2VyXCIgYW5kIGNoZWNrcyB0byBzZWVcbiAgICogaWYgd2UgY2FuIGZpbmQgYSBtYXRjaGluZyBcIjwvQm9vZ2VyXCIgbGF0ZXIgaW4gdGhlXG4gICAqIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7UmVnRXhwTWF0Y2hBcnJheX0gbWF0Y2hcbiAgICogQHBhcmFtIHt7YWZ0ZXI6bnVtYmVyfX0gcGFyYW0xXG4gICAqL1xuICBjb25zdCBoYXNDbG9zaW5nVGFnID0gKG1hdGNoLCB7IGFmdGVyIH0pID0+IHtcbiAgICBjb25zdCB0YWcgPSBcIjwvXCIgKyBtYXRjaFswXS5zbGljZSgxKTtcbiAgICBjb25zdCBwb3MgPSBtYXRjaC5pbnB1dC5pbmRleE9mKHRhZywgYWZ0ZXIpO1xuICAgIHJldHVybiBwb3MgIT09IC0xO1xuICB9O1xuXG4gIGNvbnN0IElERU5UX1JFJDEgPSBJREVOVF9SRTtcbiAgY29uc3QgRlJBR01FTlQgPSB7XG4gICAgYmVnaW46ICc8PicsXG4gICAgZW5kOiAnPC8+J1xuICB9O1xuICAvLyB0byBhdm9pZCBzb21lIHNwZWNpYWwgY2FzZXMgaW5zaWRlIGlzVHJ1bHlPcGVuaW5nVGFnXG4gIGNvbnN0IFhNTF9TRUxGX0NMT1NJTkcgPSAvPFtBLVphLXowLTlcXFxcLl86LV0rXFxzKlxcLz4vO1xuICBjb25zdCBYTUxfVEFHID0ge1xuICAgIGJlZ2luOiAvPFtBLVphLXowLTlcXFxcLl86LV0rLyxcbiAgICBlbmQ6IC9cXC9bQS1aYS16MC05XFxcXC5fOi1dKz58XFwvPi8sXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtSZWdFeHBNYXRjaEFycmF5fSBtYXRjaFxuICAgICAqIEBwYXJhbSB7Q2FsbGJhY2tSZXNwb25zZX0gcmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc1RydWx5T3BlbmluZ1RhZzogKG1hdGNoLCByZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgYWZ0ZXJNYXRjaEluZGV4ID0gbWF0Y2hbMF0ubGVuZ3RoICsgbWF0Y2guaW5kZXg7XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IG1hdGNoLmlucHV0W2FmdGVyTWF0Y2hJbmRleF07XG4gICAgICBpZiAoXG4gICAgICAgIC8vIEhUTUwgc2hvdWxkIG5vdCBpbmNsdWRlIGFub3RoZXIgcmF3IGA8YCBpbnNpZGUgYSB0YWdcbiAgICAgICAgLy8gbmVzdGVkIHR5cGU/XG4gICAgICAgIC8vIGA8QXJyYXk8QXJyYXk8bnVtYmVyPj5gLCBldGMuXG4gICAgICAgIG5leHRDaGFyID09PSBcIjxcIiB8fFxuICAgICAgICAvLyB0aGUgLCBnaXZlcyBhd2F5IHRoYXQgdGhpcyBpcyBub3QgSFRNTFxuICAgICAgICAvLyBgPFQsIEEgZXh0ZW5kcyBrZXlvZiBULCBWPmBcbiAgICAgICAgbmV4dENoYXIgPT09IFwiLFwiXG4gICAgICAgICkge1xuICAgICAgICByZXNwb25zZS5pZ25vcmVNYXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGA8c29tZXRoaW5nPmBcbiAgICAgIC8vIFF1aXRlIHBvc3NpYmx5IGEgdGFnLCBsZXRzIGxvb2sgZm9yIGEgbWF0Y2hpbmcgY2xvc2luZyB0YWcuLi5cbiAgICAgIGlmIChuZXh0Q2hhciA9PT0gXCI+XCIpIHtcbiAgICAgICAgLy8gaWYgd2UgY2Fubm90IGZpbmQgYSBtYXRjaGluZyBjbG9zaW5nIHRhZywgdGhlbiB3ZVxuICAgICAgICAvLyB3aWxsIGlnbm9yZSBpdFxuICAgICAgICBpZiAoIWhhc0Nsb3NpbmdUYWcobWF0Y2gsIHsgYWZ0ZXI6IGFmdGVyTWF0Y2hJbmRleCB9KSkge1xuICAgICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYDxibGFoIC8+YCAoc2VsZi1jbG9zaW5nKVxuICAgICAgLy8gaGFuZGxlZCBieSBzaW1wbGVTZWxmQ2xvc2luZyBydWxlXG5cbiAgICAgIGxldCBtO1xuICAgICAgY29uc3QgYWZ0ZXJNYXRjaCA9IG1hdGNoLmlucHV0LnN1YnN0cmluZyhhZnRlck1hdGNoSW5kZXgpO1xuXG4gICAgICAvLyBzb21lIG1vcmUgdGVtcGxhdGUgdHlwaW5nIHN0dWZmXG4gICAgICAvLyAgPFQgPSBhbnk+KGtleT86IHN0cmluZykgPT4gTW9kaWZ5PFxuICAgICAgaWYgKChtID0gYWZ0ZXJNYXRjaC5tYXRjaCgvXlxccyo9LykpKSB7XG4gICAgICAgIHJlc3BvbnNlLmlnbm9yZU1hdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYDxGcm9tIGV4dGVuZHMgc3RyaW5nPmBcbiAgICAgIC8vIHRlY2huaWNhbGx5IHRoaXMgY291bGQgYmUgSFRNTCwgYnV0IGl0IHNtZWxscyBsaWtlIGEgdHlwZVxuICAgICAgLy8gTk9URTogVGhpcyBpcyB1Z2gsIGJ1dCBhZGRlZCBzcGVjaWZpY2FsbHkgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzMyNzZcbiAgICAgIGlmICgobSA9IGFmdGVyTWF0Y2gubWF0Y2goL15cXHMrZXh0ZW5kc1xccysvKSkpIHtcbiAgICAgICAgaWYgKG0uaW5kZXggPT09IDApIHtcbiAgICAgICAgICByZXNwb25zZS5pZ25vcmVNYXRjaCgpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLXJldHVyblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgS0VZV09SRFMkMSA9IHtcbiAgICAkcGF0dGVybjogSURFTlRfUkUsXG4gICAga2V5d29yZDogS0VZV09SRFMsXG4gICAgbGl0ZXJhbDogTElURVJBTFMsXG4gICAgYnVpbHRfaW46IEJVSUxUX0lOUyxcbiAgICBcInZhcmlhYmxlLmxhbmd1YWdlXCI6IEJVSUxUX0lOX1ZBUklBQkxFU1xuICB9O1xuXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtbnVtZXJpYy1saXRlcmFsc1xuICBjb25zdCBkZWNpbWFsRGlnaXRzID0gJ1swLTldKF8/WzAtOV0pKic7XG4gIGNvbnN0IGZyYWMgPSBgXFxcXC4oJHtkZWNpbWFsRGlnaXRzfSlgO1xuICAvLyBEZWNpbWFsSW50ZWdlckxpdGVyYWwsIGluY2x1ZGluZyBBbm5leCBCIE5vbk9jdGFsRGVjaW1hbEludGVnZXJMaXRlcmFsXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYWRkaXRpb25hbC1zeW50YXgtbnVtZXJpYy1saXRlcmFsc1xuICBjb25zdCBkZWNpbWFsSW50ZWdlciA9IGAwfFsxLTldKF8/WzAtOV0pKnwwWzAtN10qWzg5XVswLTldKmA7XG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICAvLyBEZWNpbWFsTGl0ZXJhbFxuICAgICAgeyBiZWdpbjogYChcXFxcYigke2RlY2ltYWxJbnRlZ2VyfSkoKCR7ZnJhY30pfFxcXFwuKT98KCR7ZnJhY30pKWAgK1xuICAgICAgICBgW2VFXVsrLV0/KCR7ZGVjaW1hbERpZ2l0c30pXFxcXGJgIH0sXG4gICAgICB7IGJlZ2luOiBgXFxcXGIoJHtkZWNpbWFsSW50ZWdlcn0pXFxcXGIoKCR7ZnJhY30pXFxcXGJ8XFxcXC4pP3woJHtmcmFjfSlcXFxcYmAgfSxcblxuICAgICAgLy8gRGVjaW1hbEJpZ0ludGVnZXJMaXRlcmFsXG4gICAgICB7IGJlZ2luOiBgXFxcXGIoMHxbMS05XShfP1swLTldKSopblxcXFxiYCB9LFxuXG4gICAgICAvLyBOb25EZWNpbWFsSW50ZWdlckxpdGVyYWxcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwW3hYXVswLTlhLWZBLUZdKF8/WzAtOWEtZkEtRl0pKm4/XFxcXGJcIiB9LFxuICAgICAgeyBiZWdpbjogXCJcXFxcYjBbYkJdWzAtMV0oXz9bMC0xXSkqbj9cXFxcYlwiIH0sXG4gICAgICB7IGJlZ2luOiBcIlxcXFxiMFtvT11bMC03XShfP1swLTddKSpuP1xcXFxiXCIgfSxcblxuICAgICAgLy8gTGVnYWN5T2N0YWxJbnRlZ2VyTGl0ZXJhbCAoZG9lcyBub3QgaW5jbHVkZSB1bmRlcnNjb3JlIHNlcGFyYXRvcnMpXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFkZGl0aW9uYWwtc3ludGF4LW51bWVyaWMtbGl0ZXJhbHNcbiAgICAgIHsgYmVnaW46IFwiXFxcXGIwWzAtN10rbj9cXFxcYlwiIH0sXG4gICAgXSxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBTVUJTVCA9IHtcbiAgICBjbGFzc05hbWU6ICdzdWJzdCcsXG4gICAgYmVnaW46ICdcXFxcJFxcXFx7JyxcbiAgICBlbmQ6ICdcXFxcfScsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTJDEsXG4gICAgY29udGFpbnM6IFtdIC8vIGRlZmluZWQgbGF0ZXJcbiAgfTtcbiAgY29uc3QgSFRNTF9URU1QTEFURSA9IHtcbiAgICBiZWdpbjogJ2h0bWxgJyxcbiAgICBlbmQ6ICcnLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnYCcsXG4gICAgICByZXR1cm5FbmQ6IGZhbHNlLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICBTVUJTVFxuICAgICAgXSxcbiAgICAgIHN1Ykxhbmd1YWdlOiAneG1sJ1xuICAgIH1cbiAgfTtcbiAgY29uc3QgQ1NTX1RFTVBMQVRFID0ge1xuICAgIGJlZ2luOiAnY3NzYCcsXG4gICAgZW5kOiAnJyxcbiAgICBzdGFydHM6IHtcbiAgICAgIGVuZDogJ2AnLFxuICAgICAgcmV0dXJuRW5kOiBmYWxzZSxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgICAgU1VCU1RcbiAgICAgIF0sXG4gICAgICBzdWJMYW5ndWFnZTogJ2NzcydcbiAgICB9XG4gIH07XG4gIGNvbnN0IEdSQVBIUUxfVEVNUExBVEUgPSB7XG4gICAgYmVnaW46ICdncWxgJyxcbiAgICBlbmQ6ICcnLFxuICAgIHN0YXJ0czoge1xuICAgICAgZW5kOiAnYCcsXG4gICAgICByZXR1cm5FbmQ6IGZhbHNlLFxuICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgaGxqcy5CQUNLU0xBU0hfRVNDQVBFLFxuICAgICAgICBTVUJTVFxuICAgICAgXSxcbiAgICAgIHN1Ykxhbmd1YWdlOiAnZ3JhcGhxbCdcbiAgICB9XG4gIH07XG4gIGNvbnN0IFRFTVBMQVRFX1NUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAnYCcsXG4gICAgZW5kOiAnYCcsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIGhsanMuQkFDS1NMQVNIX0VTQ0FQRSxcbiAgICAgIFNVQlNUXG4gICAgXVxuICB9O1xuICBjb25zdCBKU0RPQ19DT01NRU5UID0gaGxqcy5DT01NRU5UKFxuICAgIC9cXC9cXCpcXCooPyFcXC8pLyxcbiAgICAnXFxcXCovJyxcbiAgICB7XG4gICAgICByZWxldmFuY2U6IDAsXG4gICAgICBjb250YWluczogW1xuICAgICAgICB7XG4gICAgICAgICAgYmVnaW46ICcoPz1AW0EtWmEtel0rKScsXG4gICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICAgICAgICAgIGJlZ2luOiAnQFtBLVphLXpdKydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3R5cGUnLFxuICAgICAgICAgICAgICBiZWdpbjogJ1xcXFx7JyxcbiAgICAgICAgICAgICAgZW5kOiAnXFxcXH0nLFxuICAgICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAgICAgICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICBiZWdpbjogSURFTlRfUkUkMSArICcoPz1cXFxccyooLSl8JCknLFxuICAgICAgICAgICAgICBlbmRzUGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBlYXQgc3BhY2VzIChub3QgbmV3bGluZXMpIHNvIHdlIGNhbiBmaW5kXG4gICAgICAgICAgICAvLyB0eXBlcyBvciB2YXJpYWJsZXNcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYmVnaW46IC8oPz1bXlxcbl0pXFxzLyxcbiAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICApO1xuICBjb25zdCBDT01NRU5UID0ge1xuICAgIGNsYXNzTmFtZTogXCJjb21tZW50XCIsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIEpTRE9DX0NPTU1FTlQsXG4gICAgICBobGpzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLFxuICAgICAgaGxqcy5DX0xJTkVfQ09NTUVOVF9NT0RFXG4gICAgXVxuICB9O1xuICBjb25zdCBTVUJTVF9JTlRFUk5BTFMgPSBbXG4gICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgSFRNTF9URU1QTEFURSxcbiAgICBDU1NfVEVNUExBVEUsXG4gICAgR1JBUEhRTF9URU1QTEFURSxcbiAgICBURU1QTEFURV9TVFJJTkcsXG4gICAgLy8gU2tpcCBudW1iZXJzIHdoZW4gdGhleSBhcmUgcGFydCBvZiBhIHZhcmlhYmxlIG5hbWVcbiAgICB7IG1hdGNoOiAvXFwkXFxkKy8gfSxcbiAgICBOVU1CRVIsXG4gICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbDpcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzI4OFxuICAgIC8vIGhsanMuUkVHRVhQX01PREVcbiAgXTtcbiAgU1VCU1QuY29udGFpbnMgPSBTVUJTVF9JTlRFUk5BTFNcbiAgICAuY29uY2F0KHtcbiAgICAgIC8vIHdlIG5lZWQgdG8gcGFpciB1cCB7fSBpbnNpZGUgb3VyIHN1YnN0IHRvIHByZXZlbnRcbiAgICAgIC8vIGl0IGZyb20gZW5kaW5nIHRvbyBlYXJseSBieSBtYXRjaGluZyBhbm90aGVyIH1cbiAgICAgIGJlZ2luOiAvXFx7LyxcbiAgICAgIGVuZDogL1xcfS8sXG4gICAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgIFwic2VsZlwiXG4gICAgICBdLmNvbmNhdChTVUJTVF9JTlRFUk5BTFMpXG4gICAgfSk7XG4gIGNvbnN0IFNVQlNUX0FORF9DT01NRU5UUyA9IFtdLmNvbmNhdChDT01NRU5ULCBTVUJTVC5jb250YWlucyk7XG4gIGNvbnN0IFBBUkFNU19DT05UQUlOUyA9IFNVQlNUX0FORF9DT01NRU5UUy5jb25jYXQoW1xuICAgIC8vIGVhdCByZWN1cnNpdmUgcGFyZW5zIGluIHN1YiBleHByZXNzaW9uc1xuICAgIHtcbiAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgIGVuZDogL1xcKS8sXG4gICAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICAgIGNvbnRhaW5zOiBbXCJzZWxmXCJdLmNvbmNhdChTVUJTVF9BTkRfQ09NTUVOVFMpXG4gICAgfVxuICBdKTtcbiAgY29uc3QgUEFSQU1TID0ge1xuICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgYmVnaW46IC9cXCgvLFxuICAgIGVuZDogL1xcKS8sXG4gICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAga2V5d29yZHM6IEtFWVdPUkRTJDEsXG4gICAgY29udGFpbnM6IFBBUkFNU19DT05UQUlOU1xuICB9O1xuXG4gIC8vIEVTNiBjbGFzc2VzXG4gIGNvbnN0IENMQVNTX09SX0VYVEVORFMgPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIC8vIGNsYXNzIENhciBleHRlbmRzIHZlaGljbGVcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY2xhc3MvLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBJREVOVF9SRSQxLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICAvZXh0ZW5kcy8sXG4gICAgICAgICAgL1xccysvLFxuICAgICAgICAgIHJlZ2V4LmNvbmNhdChJREVOVF9SRSQxLCBcIihcIiwgcmVnZXguY29uY2F0KC9cXC4vLCBJREVOVF9SRSQxKSwgXCIpKlwiKVxuICAgICAgICBdLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgICAgIDM6IFwidGl0bGUuY2xhc3NcIixcbiAgICAgICAgICA1OiBcImtleXdvcmRcIixcbiAgICAgICAgICA3OiBcInRpdGxlLmNsYXNzLmluaGVyaXRlZFwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBjbGFzcyBDYXJcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvY2xhc3MvLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBJREVOVF9SRSQxXG4gICAgICAgIF0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAgICAgMzogXCJ0aXRsZS5jbGFzc1wiXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICBdXG4gIH07XG5cbiAgY29uc3QgQ0xBU1NfUkVGRVJFTkNFID0ge1xuICAgIHJlbGV2YW5jZTogMCxcbiAgICBtYXRjaDpcbiAgICByZWdleC5laXRoZXIoXG4gICAgICAvLyBIYXJkIGNvZGVkIGV4Y2VwdGlvbnNcbiAgICAgIC9cXGJKU09OLyxcbiAgICAgIC8vIEZsb2F0MzJBcnJheSwgT3V0VFxuICAgICAgL1xcYltBLVpdW2Etel0rKFtBLVpdW2Etel0qfFxcZCkqLyxcbiAgICAgIC8vIENTU0ZhY3RvcnksIENTU0ZhY3RvcnlUXG4gICAgICAvXFxiW0EtWl17Mix9KFtBLVpdW2Etel0rfFxcZCkrKFtBLVpdW2Etel0qKSovLFxuICAgICAgLy8gRlBzLCBGUHNUXG4gICAgICAvXFxiW0EtWl17Mix9W2Etel0rKFtBLVpdW2Etel0rfFxcZCkqKFtBLVpdW2Etel0qKSovLFxuICAgICAgLy8gUFxuICAgICAgLy8gc2luZ2xlIGxldHRlcnMgYXJlIG5vdCBoaWdobGlnaHRlZFxuICAgICAgLy8gQkxBSFxuICAgICAgLy8gdGhpcyB3aWxsIGJlIGZsYWdnZWQgYXMgYSBVUFBFUl9DQVNFX0NPTlNUQU5UIGluc3RlYWRcbiAgICApLFxuICAgIGNsYXNzTmFtZTogXCJ0aXRsZS5jbGFzc1wiLFxuICAgIGtleXdvcmRzOiB7XG4gICAgICBfOiBbXG4gICAgICAgIC8vIHNlIHdlIHN0aWxsIGdldCByZWxldmFuY2UgY3JlZGl0IGZvciBKUyBsaWJyYXJ5IGNsYXNzZXNcbiAgICAgICAgLi4uVFlQRVMsXG4gICAgICAgIC4uLkVSUk9SX1RZUEVTXG4gICAgICBdXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFVTRV9TVFJJQ1QgPSB7XG4gICAgbGFiZWw6IFwidXNlX3N0cmljdFwiLFxuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIHJlbGV2YW5jZTogMTAsXG4gICAgYmVnaW46IC9eXFxzKlsnXCJddXNlIChzdHJpY3R8YXNtKVsnXCJdL1xuICB9O1xuXG4gIGNvbnN0IEZVTkNUSU9OX0RFRklOSVRJT04gPSB7XG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6IFtcbiAgICAgICAgICAvZnVuY3Rpb24vLFxuICAgICAgICAgIC9cXHMrLyxcbiAgICAgICAgICBJREVOVF9SRSQxLFxuICAgICAgICAgIC8oPz1cXHMqXFwoKS9cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIC8vIGFub255bW91cyBmdW5jdGlvblxuICAgICAge1xuICAgICAgICBtYXRjaDogW1xuICAgICAgICAgIC9mdW5jdGlvbi8sXG4gICAgICAgICAgL1xccyooPz1cXCgpL1xuICAgICAgICBdXG4gICAgICB9XG4gICAgXSxcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgMzogXCJ0aXRsZS5mdW5jdGlvblwiXG4gICAgfSxcbiAgICBsYWJlbDogXCJmdW5jLmRlZlwiLFxuICAgIGNvbnRhaW5zOiBbIFBBUkFNUyBdLFxuICAgIGlsbGVnYWw6IC8lL1xuICB9O1xuXG4gIGNvbnN0IFVQUEVSX0NBU0VfQ09OU1RBTlQgPSB7XG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIG1hdGNoOiAvXFxiW0EtWl1bQS1aXzAtOV0rXFxiLyxcbiAgICBjbGFzc05hbWU6IFwidmFyaWFibGUuY29uc3RhbnRcIlxuICB9O1xuXG4gIGZ1bmN0aW9uIG5vbmVPZihsaXN0KSB7XG4gICAgcmV0dXJuIHJlZ2V4LmNvbmNhdChcIig/IVwiLCBsaXN0LmpvaW4oXCJ8XCIpLCBcIilcIik7XG4gIH1cblxuICBjb25zdCBGVU5DVElPTl9DQUxMID0ge1xuICAgIG1hdGNoOiByZWdleC5jb25jYXQoXG4gICAgICAvXFxiLyxcbiAgICAgIG5vbmVPZihbXG4gICAgICAgIC4uLkJVSUxUX0lOX0dMT0JBTFMsXG4gICAgICAgIFwic3VwZXJcIixcbiAgICAgICAgXCJpbXBvcnRcIlxuICAgICAgXSksXG4gICAgICBJREVOVF9SRSQxLCByZWdleC5sb29rYWhlYWQoL1xcKC8pKSxcbiAgICBjbGFzc05hbWU6IFwidGl0bGUuZnVuY3Rpb25cIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBQUk9QRVJUWV9BQ0NFU1MgPSB7XG4gICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvXFwuLywgcmVnZXgubG9va2FoZWFkKFxuICAgICAgcmVnZXguY29uY2F0KElERU5UX1JFJDEsIC8oPyFbMC05QS1aYS16JF8oXSkvKVxuICAgICkpLFxuICAgIGVuZDogSURFTlRfUkUkMSxcbiAgICBleGNsdWRlQmVnaW46IHRydWUsXG4gICAga2V5d29yZHM6IFwicHJvdG90eXBlXCIsXG4gICAgY2xhc3NOYW1lOiBcInByb3BlcnR5XCIsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgR0VUVEVSX09SX1NFVFRFUiA9IHtcbiAgICBtYXRjaDogW1xuICAgICAgL2dldHxzZXQvLFxuICAgICAgL1xccysvLFxuICAgICAgSURFTlRfUkUkMSxcbiAgICAgIC8oPz1cXCgpL1xuICAgIF0sXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHsgLy8gZWF0IHRvIGF2b2lkIGVtcHR5IHBhcmFtc1xuICAgICAgICBiZWdpbjogL1xcKFxcKS9cbiAgICAgIH0sXG4gICAgICBQQVJBTVNcbiAgICBdXG4gIH07XG5cbiAgY29uc3QgRlVOQ19MRUFEX0lOX1JFID0gJyhcXFxcKCcgK1xuICAgICdbXigpXSooXFxcXCgnICtcbiAgICAnW14oKV0qKFxcXFwoJyArXG4gICAgJ1teKCldKicgK1xuICAgICdcXFxcKVteKCldKikqJyArXG4gICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAnXFxcXCl8JyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICcpXFxcXHMqPT4nO1xuXG4gIGNvbnN0IEZVTkNUSU9OX1ZBUklBQkxFID0ge1xuICAgIG1hdGNoOiBbXG4gICAgICAvY29uc3R8dmFyfGxldC8sIC9cXHMrLyxcbiAgICAgIElERU5UX1JFJDEsIC9cXHMqLyxcbiAgICAgIC89XFxzKi8sXG4gICAgICAvKGFzeW5jXFxzKik/LywgLy8gYXN5bmMgaXMgb3B0aW9uYWxcbiAgICAgIHJlZ2V4Lmxvb2thaGVhZChGVU5DX0xFQURfSU5fUkUpXG4gICAgXSxcbiAgICBrZXl3b3JkczogXCJhc3luY1wiLFxuICAgIGNsYXNzTmFtZToge1xuICAgICAgMTogXCJrZXl3b3JkXCIsXG4gICAgICAzOiBcInRpdGxlLmZ1bmN0aW9uXCJcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBQQVJBTVNcbiAgICBdXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnSmF2YVNjcmlwdCcsXG4gICAgYWxpYXNlczogWydqcycsICdqc3gnLCAnbWpzJywgJ2NqcyddLFxuICAgIGtleXdvcmRzOiBLRVlXT1JEUyQxLFxuICAgIC8vIHRoaXMgd2lsbCBiZSBleHRlbmRlZCBieSBUeXBlU2NyaXB0XG4gICAgZXhwb3J0czogeyBQQVJBTVNfQ09OVEFJTlMsIENMQVNTX1JFRkVSRU5DRSB9LFxuICAgIGlsbGVnYWw6IC8jKD8hWyRfQS16XSkvLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLlNIRUJBTkcoe1xuICAgICAgICBsYWJlbDogXCJzaGViYW5nXCIsXG4gICAgICAgIGJpbmFyeTogXCJub2RlXCIsXG4gICAgICAgIHJlbGV2YW5jZTogNVxuICAgICAgfSksXG4gICAgICBVU0VfU1RSSUNULFxuICAgICAgaGxqcy5BUE9TX1NUUklOR19NT0RFLFxuICAgICAgaGxqcy5RVU9URV9TVFJJTkdfTU9ERSxcbiAgICAgIEhUTUxfVEVNUExBVEUsXG4gICAgICBDU1NfVEVNUExBVEUsXG4gICAgICBHUkFQSFFMX1RFTVBMQVRFLFxuICAgICAgVEVNUExBVEVfU1RSSU5HLFxuICAgICAgQ09NTUVOVCxcbiAgICAgIC8vIFNraXAgbnVtYmVycyB3aGVuIHRoZXkgYXJlIHBhcnQgb2YgYSB2YXJpYWJsZSBuYW1lXG4gICAgICB7IG1hdGNoOiAvXFwkXFxkKy8gfSxcbiAgICAgIE5VTUJFUixcbiAgICAgIENMQVNTX1JFRkVSRU5DRSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnYXR0cicsXG4gICAgICAgIGJlZ2luOiBJREVOVF9SRSQxICsgcmVnZXgubG9va2FoZWFkKCc6JyksXG4gICAgICAgIHJlbGV2YW5jZTogMFxuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX1ZBUklBQkxFLFxuICAgICAgeyAvLyBcInZhbHVlXCIgY29udGFpbmVyXG4gICAgICAgIGJlZ2luOiAnKCcgKyBobGpzLlJFX1NUQVJURVJTX1JFICsgJ3xcXFxcYihjYXNlfHJldHVybnx0aHJvdylcXFxcYilcXFxccyonLFxuICAgICAgICBrZXl3b3JkczogJ3JldHVybiB0aHJvdyBjYXNlJyxcbiAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIENPTU1FTlQsXG4gICAgICAgICAgaGxqcy5SRUdFWFBfTU9ERSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGFzc05hbWU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNvdW50IHRoZSBwYXJlbnMgdG8gbWFrZSBzdXJlIHdlIGFjdHVhbGx5IGhhdmUgdGhlXG4gICAgICAgICAgICAvLyBjb3JyZWN0IGJvdW5kaW5nICggKSBiZWZvcmUgdGhlID0+LiAgVGhlcmUgY291bGQgYmUgYW55IG51bWJlciBvZlxuICAgICAgICAgICAgLy8gc3ViLWV4cHJlc3Npb25zIGluc2lkZSBhbHNvIHN1cnJvdW5kZWQgYnkgcGFyZW5zLlxuICAgICAgICAgICAgYmVnaW46IEZVTkNfTEVBRF9JTl9SRSxcbiAgICAgICAgICAgIHJldHVybkJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgZW5kOiAnXFxcXHMqPT4nLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3BhcmFtcycsXG4gICAgICAgICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46IGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSxcbiAgICAgICAgICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luOiAvXFwoXFxzKlxcKS8sXG4gICAgICAgICAgICAgICAgICAgIHNraXA6IHRydWVcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJlZ2luOiAvXFwoLyxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiAvXFwpLyxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlRW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBrZXl3b3JkczogS0VZV09SRFMkMSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbnM6IFBBUkFNU19DT05UQUlOU1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyAvLyBjb3VsZCBiZSBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIHBhcmFtcyB0byBhIGZ1bmN0aW9uIGNhbGxcbiAgICAgICAgICAgIGJlZ2luOiAvLC8sXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hdGNoOiAvXFxzKy8sXG4gICAgICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgLy8gSlNYXG4gICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICB7IGJlZ2luOiBGUkFHTUVOVC5iZWdpbiwgZW5kOiBGUkFHTUVOVC5lbmQgfSxcbiAgICAgICAgICAgICAgeyBtYXRjaDogWE1MX1NFTEZfQ0xPU0lORyB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVnaW46IFhNTF9UQUcuYmVnaW4sXG4gICAgICAgICAgICAgICAgLy8gd2UgY2FyZWZ1bGx5IGNoZWNrIHRoZSBvcGVuaW5nIHRhZyB0byBzZWUgaWYgaXQgdHJ1bHlcbiAgICAgICAgICAgICAgICAvLyBpcyBhIHRhZyBhbmQgbm90IGEgZmFsc2UgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICAnb246YmVnaW4nOiBYTUxfVEFHLmlzVHJ1bHlPcGVuaW5nVGFnLFxuICAgICAgICAgICAgICAgIGVuZDogWE1MX1RBRy5lbmRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHN1Ykxhbmd1YWdlOiAneG1sJyxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiZWdpbjogWE1MX1RBRy5iZWdpbixcbiAgICAgICAgICAgICAgICBlbmQ6IFhNTF9UQUcuZW5kLFxuICAgICAgICAgICAgICAgIHNraXA6IHRydWUsXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IFsnc2VsZiddXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgRlVOQ1RJT05fREVGSU5JVElPTixcbiAgICAgIHtcbiAgICAgICAgLy8gcHJldmVudCB0aGlzIGZyb20gZ2V0dGluZyBzd2FsbG93ZWQgdXAgYnkgZnVuY3Rpb25cbiAgICAgICAgLy8gc2luY2UgdGhleSBhcHBlYXIgXCJmdW5jdGlvbiBsaWtlXCJcbiAgICAgICAgYmVnaW5LZXl3b3JkczogXCJ3aGlsZSBpZiBzd2l0Y2ggY2F0Y2ggZm9yXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIHdlIGhhdmUgdG8gY291bnQgdGhlIHBhcmVucyB0byBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSB0aGUgY29ycmVjdFxuICAgICAgICAvLyBib3VuZGluZyAoICkuICBUaGVyZSBjb3VsZCBiZSBhbnkgbnVtYmVyIG9mIHN1Yi1leHByZXNzaW9ucyBpbnNpZGVcbiAgICAgICAgLy8gYWxzbyBzdXJyb3VuZGVkIGJ5IHBhcmVucy5cbiAgICAgICAgYmVnaW46ICdcXFxcYig/IWZ1bmN0aW9uKScgKyBobGpzLlVOREVSU0NPUkVfSURFTlRfUkUgK1xuICAgICAgICAgICdcXFxcKCcgKyAvLyBmaXJzdCBwYXJlbnNcbiAgICAgICAgICAnW14oKV0qKFxcXFwoJyArXG4gICAgICAgICAgICAnW14oKV0qKFxcXFwoJyArXG4gICAgICAgICAgICAgICdbXigpXSonICtcbiAgICAgICAgICAgICdcXFxcKVteKCldKikqJyArXG4gICAgICAgICAgJ1xcXFwpW14oKV0qKSonICtcbiAgICAgICAgICAnXFxcXClcXFxccypcXFxceycsIC8vIGVuZCBwYXJlbnNcbiAgICAgICAgcmV0dXJuQmVnaW46dHJ1ZSxcbiAgICAgICAgbGFiZWw6IFwiZnVuYy5kZWZcIixcbiAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICBQQVJBTVMsXG4gICAgICAgICAgaGxqcy5pbmhlcml0KGhsanMuVElUTEVfTU9ERSwgeyBiZWdpbjogSURFTlRfUkUkMSwgY2xhc3NOYW1lOiBcInRpdGxlLmZ1bmN0aW9uXCIgfSlcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIC8vIGNhdGNoIC4uLiBzbyBpdCB3b24ndCB0cmlnZ2VyIHRoZSBwcm9wZXJ0eSBydWxlIGJlbG93XG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAvXFwuXFwuXFwuLyxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAgUFJPUEVSVFlfQUNDRVNTLFxuICAgICAgLy8gaGFjazogcHJldmVudHMgZGV0ZWN0aW9uIG9mIGtleXdvcmRzIGluIHNvbWUgY2lyY3Vtc3RhbmNlc1xuICAgICAgLy8gLmtleXdvcmQoKVxuICAgICAgLy8gJGtleXdvcmQgPSB4XG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAnXFxcXCQnICsgSURFTlRfUkUkMSxcbiAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogWyAvXFxiY29uc3RydWN0b3IoPz1cXHMqXFwoKS8gXSxcbiAgICAgICAgY2xhc3NOYW1lOiB7IDE6IFwidGl0bGUuZnVuY3Rpb25cIiB9LFxuICAgICAgICBjb250YWluczogWyBQQVJBTVMgXVxuICAgICAgfSxcbiAgICAgIEZVTkNUSU9OX0NBTEwsXG4gICAgICBVUFBFUl9DQVNFX0NPTlNUQU5ULFxuICAgICAgQ0xBU1NfT1JfRVhURU5EUyxcbiAgICAgIEdFVFRFUl9PUl9TRVRURVIsXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAvXFwkWyguXS8gLy8gcmVsZXZhbmNlIGJvb3N0ZXIgZm9yIGEgcGF0dGVybiBjb21tb24gdG8gSlMgbGliczogYCQoc29tZXRoaW5nKWAgYW5kIGAkLnNvbWV0aGluZ2BcbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbi8qXG5MYW5ndWFnZTogVHlwZVNjcmlwdFxuQXV0aG9yOiBQYW51IEhvcnNtYWxhaHRpIDxwYW51LmhvcnNtYWxhaHRpQGlraS5maT5cbkNvbnRyaWJ1dG9yczogSWtlIEt1IDxkZW1wZmlAeWFob28uY29tPlxuRGVzY3JpcHRpb246IFR5cGVTY3JpcHQgaXMgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgSmF2YVNjcmlwdFxuV2Vic2l0ZTogaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnXG5DYXRlZ29yeTogY29tbW9uLCBzY3JpcHRpbmdcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiB0eXBlc2NyaXB0KGhsanMpIHtcbiAgY29uc3QgdHNMYW5ndWFnZSA9IGphdmFzY3JpcHQoaGxqcyk7XG5cbiAgY29uc3QgSURFTlRfUkUkMSA9IElERU5UX1JFO1xuICBjb25zdCBUWVBFUyA9IFtcbiAgICBcImFueVwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwiYmlnaW50XCIsXG4gICAgXCJ1bmtub3duXCJcbiAgXTtcbiAgY29uc3QgTkFNRVNQQUNFID0ge1xuICAgIGJlZ2luS2V5d29yZHM6ICduYW1lc3BhY2UnLFxuICAgIGVuZDogL1xcey8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBjb250YWluczogWyB0c0xhbmd1YWdlLmV4cG9ydHMuQ0xBU1NfUkVGRVJFTkNFIF1cbiAgfTtcbiAgY29uc3QgSU5URVJGQUNFID0ge1xuICAgIGJlZ2luS2V5d29yZHM6ICdpbnRlcmZhY2UnLFxuICAgIGVuZDogL1xcey8sXG4gICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAga2V5d29yZDogJ2ludGVyZmFjZSBleHRlbmRzJyxcbiAgICAgIGJ1aWx0X2luOiBUWVBFU1xuICAgIH0sXG4gICAgY29udGFpbnM6IFsgdHNMYW5ndWFnZS5leHBvcnRzLkNMQVNTX1JFRkVSRU5DRSBdXG4gIH07XG4gIGNvbnN0IFVTRV9TVFJJQ1QgPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgcmVsZXZhbmNlOiAxMCxcbiAgICBiZWdpbjogL15cXHMqWydcIl11c2Ugc3RyaWN0WydcIl0vXG4gIH07XG4gIGNvbnN0IFRTX1NQRUNJRklDX0tFWVdPUkRTID0gW1xuICAgIFwidHlwZVwiLFxuICAgIFwibmFtZXNwYWNlXCIsXG4gICAgXCJpbnRlcmZhY2VcIixcbiAgICBcInB1YmxpY1wiLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJvdGVjdGVkXCIsXG4gICAgXCJpbXBsZW1lbnRzXCIsXG4gICAgXCJkZWNsYXJlXCIsXG4gICAgXCJhYnN0cmFjdFwiLFxuICAgIFwicmVhZG9ubHlcIixcbiAgICBcImVudW1cIixcbiAgICBcIm92ZXJyaWRlXCJcbiAgXTtcbiAgY29uc3QgS0VZV09SRFMkMSA9IHtcbiAgICAkcGF0dGVybjogSURFTlRfUkUsXG4gICAga2V5d29yZDogS0VZV09SRFMuY29uY2F0KFRTX1NQRUNJRklDX0tFWVdPUkRTKSxcbiAgICBsaXRlcmFsOiBMSVRFUkFMUyxcbiAgICBidWlsdF9pbjogQlVJTFRfSU5TLmNvbmNhdChUWVBFUyksXG4gICAgXCJ2YXJpYWJsZS5sYW5ndWFnZVwiOiBCVUlMVF9JTl9WQVJJQUJMRVNcbiAgfTtcbiAgY29uc3QgREVDT1JBVE9SID0ge1xuICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgIGJlZ2luOiAnQCcgKyBJREVOVF9SRSQxLFxuICB9O1xuXG4gIGNvbnN0IHN3YXBNb2RlID0gKG1vZGUsIGxhYmVsLCByZXBsYWNlbWVudCkgPT4ge1xuICAgIGNvbnN0IGluZHggPSBtb2RlLmNvbnRhaW5zLmZpbmRJbmRleChtID0+IG0ubGFiZWwgPT09IGxhYmVsKTtcbiAgICBpZiAoaW5keCA9PT0gLTEpIHsgdGhyb3cgbmV3IEVycm9yKFwiY2FuIG5vdCBmaW5kIG1vZGUgdG8gcmVwbGFjZVwiKTsgfVxuXG4gICAgbW9kZS5jb250YWlucy5zcGxpY2UoaW5keCwgMSwgcmVwbGFjZW1lbnQpO1xuICB9O1xuXG5cbiAgLy8gdGhpcyBzaG91bGQgdXBkYXRlIGFueXdoZXJlIGtleXdvcmRzIGlzIHVzZWQgc2luY2VcbiAgLy8gaXQgd2lsbCBiZSB0aGUgc2FtZSBhY3R1YWwgSlMgb2JqZWN0XG4gIE9iamVjdC5hc3NpZ24odHNMYW5ndWFnZS5rZXl3b3JkcywgS0VZV09SRFMkMSk7XG5cbiAgdHNMYW5ndWFnZS5leHBvcnRzLlBBUkFNU19DT05UQUlOUy5wdXNoKERFQ09SQVRPUik7XG4gIHRzTGFuZ3VhZ2UuY29udGFpbnMgPSB0c0xhbmd1YWdlLmNvbnRhaW5zLmNvbmNhdChbXG4gICAgREVDT1JBVE9SLFxuICAgIE5BTUVTUEFDRSxcbiAgICBJTlRFUkZBQ0UsXG4gIF0pO1xuXG4gIC8vIFRTIGdldHMgYSBzaW1wbGVyIHNoZWJhbmcgcnVsZSB0aGFuIEpTXG4gIHN3YXBNb2RlKHRzTGFuZ3VhZ2UsIFwic2hlYmFuZ1wiLCBobGpzLlNIRUJBTkcoKSk7XG4gIC8vIEpTIHVzZSBzdHJpY3QgcnVsZSBwdXJwb3NlbHkgZXhjbHVkZXMgYGFzbWAgd2hpY2ggbWFrZXMgbm8gc2Vuc2VcbiAgc3dhcE1vZGUodHNMYW5ndWFnZSwgXCJ1c2Vfc3RyaWN0XCIsIFVTRV9TVFJJQ1QpO1xuXG4gIGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gPSB0c0xhbmd1YWdlLmNvbnRhaW5zLmZpbmQobSA9PiBtLmxhYmVsID09PSBcImZ1bmMuZGVmXCIpO1xuICBmdW5jdGlvbkRlY2xhcmF0aW9uLnJlbGV2YW5jZSA9IDA7IC8vICgpID0+IHt9IGlzIG1vcmUgdHlwaWNhbCBpbiBUeXBlU2NyaXB0XG5cbiAgT2JqZWN0LmFzc2lnbih0c0xhbmd1YWdlLCB7XG4gICAgbmFtZTogJ1R5cGVTY3JpcHQnLFxuICAgIGFsaWFzZXM6IFtcbiAgICAgICd0cycsXG4gICAgICAndHN4JyxcbiAgICAgICdtdHMnLFxuICAgICAgJ2N0cydcbiAgICBdXG4gIH0pO1xuXG4gIHJldHVybiB0c0xhbmd1YWdlO1xufVxuXG5leHBvcnQgeyB0eXBlc2NyaXB0IGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFZpc3VhbCBCYXNpYyAuTkVUXG5EZXNjcmlwdGlvbjogVmlzdWFsIEJhc2ljIC5ORVQgKFZCLk5FVCkgaXMgYSBtdWx0aS1wYXJhZGlnbSwgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nIGxhbmd1YWdlLCBpbXBsZW1lbnRlZCBvbiB0aGUgLk5FVCBGcmFtZXdvcmsuXG5BdXRob3JzOiBQb3JlbiBDaGlhbmcgPHJlbi5jaGlhbmdAZ21haWwuY29tPiwgSmFuIFBpbHplclxuV2Vic2l0ZTogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZG90bmV0L3Zpc3VhbC1iYXNpYy9nZXR0aW5nLXN0YXJ0ZWRcbkNhdGVnb3J5OiBjb21tb25cbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiB2Ym5ldChobGpzKSB7XG4gIGNvbnN0IHJlZ2V4ID0gaGxqcy5yZWdleDtcbiAgLyoqXG4gICAqIENoYXJhY3RlciBMaXRlcmFsXG4gICAqIEVpdGhlciBhIHNpbmdsZSBjaGFyYWN0ZXIgKFwiYVwiQykgb3IgYW4gZXNjYXBlZCBkb3VibGUgcXVvdGUgKFwiXCJcIlwiQykuXG4gICAqL1xuICBjb25zdCBDSEFSQUNURVIgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBiZWdpbjogL1wiKFwiXCJ8W14vbl0pXCJDXFxiL1xuICB9O1xuXG4gIGNvbnN0IFNUUklORyA9IHtcbiAgICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICAgIGJlZ2luOiAvXCIvLFxuICAgIGVuZDogL1wiLyxcbiAgICBpbGxlZ2FsOiAvXFxuLyxcbiAgICBjb250YWluczogW1xuICAgICAge1xuICAgICAgICAvLyBkb3VibGUgcXVvdGUgZXNjYXBlXG4gICAgICAgIGJlZ2luOiAvXCJcIi8gfVxuICAgIF1cbiAgfTtcblxuICAvKiogRGF0ZSBMaXRlcmFscyBjb25zaXN0IG9mIGEgZGF0ZSwgYSB0aW1lLCBvciBib3RoIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLCBzdXJyb3VuZGVkIGJ5ICMgKi9cbiAgY29uc3QgTU1fRERfWVlZWSA9IC9cXGR7MSwyfVxcL1xcZHsxLDJ9XFwvXFxkezR9LztcbiAgY29uc3QgWVlZWV9NTV9ERCA9IC9cXGR7NH0tXFxkezEsMn0tXFxkezEsMn0vO1xuICBjb25zdCBUSU1FXzEySCA9IC8oXFxkfDFbMDEyXSkoOlxcZCspezAsMn0gKihBTXxQTSkvO1xuICBjb25zdCBUSU1FXzI0SCA9IC9cXGR7MSwyfSg6XFxkezEsMn0pezEsMn0vO1xuICBjb25zdCBEQVRFID0ge1xuICAgIGNsYXNzTmFtZTogJ2xpdGVyYWwnLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIC8vICNZWVlZLU1NLUREIyAoSVNPLURhdGUpIG9yICNNL0QvWVlZWSMgKFVTLURhdGUpXG4gICAgICAgIGJlZ2luOiByZWdleC5jb25jYXQoLyMgKi8sIHJlZ2V4LmVpdGhlcihZWVlZX01NX0RELCBNTV9ERF9ZWVlZKSwgLyAqIy8pIH0sXG4gICAgICB7XG4gICAgICAgIC8vICNIOm1tWzpzc10jICgyNGggVGltZSlcbiAgICAgICAgYmVnaW46IHJlZ2V4LmNvbmNhdCgvIyAqLywgVElNRV8yNEgsIC8gKiMvKSB9LFxuICAgICAge1xuICAgICAgICAvLyAjaFs6bW1bOnNzXV0gQSMgKDEyaCBUaW1lKVxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KC8jICovLCBUSU1FXzEySCwgLyAqIy8pIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGRhdGUgcGx1cyB0aW1lXG4gICAgICAgIGJlZ2luOiByZWdleC5jb25jYXQoXG4gICAgICAgICAgLyMgKi8sXG4gICAgICAgICAgcmVnZXguZWl0aGVyKFlZWVlfTU1fREQsIE1NX0REX1lZWVkpLFxuICAgICAgICAgIC8gKy8sXG4gICAgICAgICAgcmVnZXguZWl0aGVyKFRJTUVfMTJILCBUSU1FXzI0SCksXG4gICAgICAgICAgLyAqIy9cbiAgICAgICAgKSB9XG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IE5VTUJFUiA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICB2YXJpYW50czogW1xuICAgICAge1xuICAgICAgICAvLyBGbG9hdFxuICAgICAgICBiZWdpbjogL1xcYlxcZFtcXGRfXSooKFxcLltcXGRfXSsoRVsrLV0/W1xcZF9dKyk/KXwoRVsrLV0/W1xcZF9dKykpW1JGREAhI10/LyB9LFxuICAgICAge1xuICAgICAgICAvLyBJbnRlZ2VyIChiYXNlIDEwKVxuICAgICAgICBiZWdpbjogL1xcYlxcZFtcXGRfXSooKFU/W1NJTF0pfFslJl0pPy8gfSxcbiAgICAgIHtcbiAgICAgICAgLy8gSW50ZWdlciAoYmFzZSAxNilcbiAgICAgICAgYmVnaW46IC8mSFtcXGRBLUZfXSsoKFU/W1NJTF0pfFslJl0pPy8gfSxcbiAgICAgIHtcbiAgICAgICAgLy8gSW50ZWdlciAoYmFzZSA4KVxuICAgICAgICBiZWdpbjogLyZPWzAtN19dKygoVT9bU0lMXSl8WyUmXSk/LyB9LFxuICAgICAge1xuICAgICAgICAvLyBJbnRlZ2VyIChiYXNlIDIpXG4gICAgICAgIGJlZ2luOiAvJkJbMDFfXSsoKFU/W1NJTF0pfFslJl0pPy8gfVxuICAgIF1cbiAgfTtcblxuICBjb25zdCBMQUJFTCA9IHtcbiAgICBjbGFzc05hbWU6ICdsYWJlbCcsXG4gICAgYmVnaW46IC9eXFx3KzovXG4gIH07XG5cbiAgY29uc3QgRE9DX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoLycnJy8sIC8kLywgeyBjb250YWluczogW1xuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2RvY3RhZycsXG4gICAgICBiZWdpbjogLzxcXC8/LyxcbiAgICAgIGVuZDogLz4vXG4gICAgfVxuICBdIH0pO1xuXG4gIGNvbnN0IENPTU1FTlQgPSBobGpzLkNPTU1FTlQobnVsbCwgLyQvLCB7IHZhcmlhbnRzOiBbXG4gICAgeyBiZWdpbjogLycvIH0sXG4gICAge1xuICAgICAgLy8gVE9ETzogVXNlIG11bHRpLWNsYXNzIGZvciBsZWFkaW5nIHNwYWNlc1xuICAgICAgYmVnaW46IC8oW1xcdCBdfF4pUkVNKD89XFxzKS8gfVxuICBdIH0pO1xuXG4gIGNvbnN0IERJUkVDVElWRVMgPSB7XG4gICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgLy8gVE9ETzogVXNlIG11bHRpLWNsYXNzIGZvciBpbmRlbnRhdGlvbiBvbmNlIGF2YWlsYWJsZVxuICAgIGJlZ2luOiAvW1xcdCBdKiMoY29uc3R8ZGlzYWJsZXxlbHNlfGVsc2VpZnxlbmFibGV8ZW5kfGV4dGVybmFsc291cmNlfGlmfHJlZ2lvbilcXGIvLFxuICAgIGVuZDogLyQvLFxuICAgIGtleXdvcmRzOiB7IGtleXdvcmQ6XG4gICAgICAgICdjb25zdCBkaXNhYmxlIGVsc2UgZWxzZWlmIGVuYWJsZSBlbmQgZXh0ZXJuYWxzb3VyY2UgaWYgcmVnaW9uIHRoZW4nIH0sXG4gICAgY29udGFpbnM6IFsgQ09NTUVOVCBdXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVmlzdWFsIEJhc2ljIC5ORVQnLFxuICAgIGFsaWFzZXM6IFsgJ3ZiJyBdLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgY2xhc3NOYW1lQWxpYXNlczogeyBsYWJlbDogJ3N5bWJvbCcgfSxcbiAgICBrZXl3b3Jkczoge1xuICAgICAga2V5d29yZDpcbiAgICAgICAgJ2FkZGhhbmRsZXIgYWxpYXMgYWdncmVnYXRlIGFuc2kgYXMgYXN5bmMgYXNzZW1ibHkgYXV0byBiaW5hcnkgYnkgYnlyZWYgYnl2YWwgJyAvKiBhLWIgKi9cbiAgICAgICAgKyAnY2FsbCBjYXNlIGNhdGNoIGNsYXNzIGNvbXBhcmUgY29uc3QgY29udGludWUgY3VzdG9tIGRlY2xhcmUgZGVmYXVsdCBkZWxlZ2F0ZSBkaW0gZGlzdGluY3QgZG8gJyAvKiBjLWQgKi9cbiAgICAgICAgKyAnZWFjaCBlcXVhbHMgZWxzZSBlbHNlaWYgZW5kIGVudW0gZXJhc2UgZXJyb3IgZXZlbnQgZXhpdCBleHBsaWNpdCBmaW5hbGx5IGZvciBmcmllbmQgZnJvbSBmdW5jdGlvbiAnIC8qIGUtZiAqL1xuICAgICAgICArICdnZXQgZ2xvYmFsIGdvdG8gZ3JvdXAgaGFuZGxlcyBpZiBpbXBsZW1lbnRzIGltcG9ydHMgaW4gaW5oZXJpdHMgaW50ZXJmYWNlIGludG8gaXRlcmF0b3IgJyAvKiBnLWkgKi9cbiAgICAgICAgKyAnam9pbiBrZXkgbGV0IGxpYiBsb29wIG1lIG1pZCBtb2R1bGUgbXVzdGluaGVyaXQgbXVzdG92ZXJyaWRlIG15YmFzZSBteWNsYXNzICcgLyogai1tICovXG4gICAgICAgICsgJ25hbWVzcGFjZSBuYXJyb3dpbmcgbmV3IG5leHQgbm90aW5oZXJpdGFibGUgbm90b3ZlcnJpZGFibGUgJyAvKiBuICovXG4gICAgICAgICsgJ29mIG9mZiBvbiBvcGVyYXRvciBvcHRpb24gb3B0aW9uYWwgb3JkZXIgb3ZlcmxvYWRzIG92ZXJyaWRhYmxlIG92ZXJyaWRlcyAnIC8qIG8gKi9cbiAgICAgICAgKyAncGFyYW1hcnJheSBwYXJ0aWFsIHByZXNlcnZlIHByaXZhdGUgcHJvcGVydHkgcHJvdGVjdGVkIHB1YmxpYyAnIC8qIHAgKi9cbiAgICAgICAgKyAncmFpc2VldmVudCByZWFkb25seSByZWRpbSByZW1vdmVoYW5kbGVyIHJlc3VtZSByZXR1cm4gJyAvKiByICovXG4gICAgICAgICsgJ3NlbGVjdCBzZXQgc2hhZG93cyBzaGFyZWQgc2tpcCBzdGF0aWMgc3RlcCBzdG9wIHN0cnVjdHVyZSBzdHJpY3Qgc3ViIHN5bmNsb2NrICcgLyogcyAqL1xuICAgICAgICArICd0YWtlIHRleHQgdGhlbiB0aHJvdyB0byB0cnkgdW5pY29kZSB1bnRpbCB1c2luZyB3aGVuIHdoZXJlIHdoaWxlIHdpZGVuaW5nIHdpdGggd2l0aGV2ZW50cyB3cml0ZW9ubHkgeWllbGQnIC8qIHQteSAqLyxcbiAgICAgIGJ1aWx0X2luOlxuICAgICAgICAvLyBPcGVyYXRvcnMgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZG90bmV0L3Zpc3VhbC1iYXNpYy9sYW5ndWFnZS1yZWZlcmVuY2Uvb3BlcmF0b3JzXG4gICAgICAgICdhZGRyZXNzb2YgYW5kIGFuZGFsc28gYXdhaXQgZGlyZWN0Y2FzdCBnZXR0eXBlIGdldHhtbG5hbWVzcGFjZSBpcyBpc2ZhbHNlIGlzbm90IGlzdHJ1ZSBsaWtlIG1vZCBuYW1lb2YgbmV3IG5vdCBvciBvcmVsc2UgdHJ5Y2FzdCB0eXBlb2YgeG9yICdcbiAgICAgICAgLy8gVHlwZSBDb252ZXJzaW9uIEZ1bmN0aW9ucyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9kb3RuZXQvdmlzdWFsLWJhc2ljL2xhbmd1YWdlLXJlZmVyZW5jZS9mdW5jdGlvbnMvdHlwZS1jb252ZXJzaW9uLWZ1bmN0aW9uc1xuICAgICAgICArICdjYm9vbCBjYnl0ZSBjY2hhciBjZGF0ZSBjZGJsIGNkZWMgY2ludCBjbG5nIGNvYmogY3NieXRlIGNzaG9ydCBjc25nIGNzdHIgY3VpbnQgY3VsbmcgY3VzaG9ydCcsXG4gICAgICB0eXBlOlxuICAgICAgICAvLyBEYXRhIHR5cGVzIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2RvdG5ldC92aXN1YWwtYmFzaWMvbGFuZ3VhZ2UtcmVmZXJlbmNlL2RhdGEtdHlwZXNcbiAgICAgICAgJ2Jvb2xlYW4gYnl0ZSBjaGFyIGRhdGUgZGVjaW1hbCBkb3VibGUgaW50ZWdlciBsb25nIG9iamVjdCBzYnl0ZSBzaG9ydCBzaW5nbGUgc3RyaW5nIHVpbnRlZ2VyIHVsb25nIHVzaG9ydCcsXG4gICAgICBsaXRlcmFsOiAndHJ1ZSBmYWxzZSBub3RoaW5nJ1xuICAgIH0sXG4gICAgaWxsZWdhbDpcbiAgICAgICcvL3xcXFxce3xcXFxcfXxlbmRpZnxnb3N1Ynx2YXJpYW50fHdlbmR8XlxcXFwkICcgLyogcmVzZXJ2ZWQgZGVwcmVjYXRlZCBrZXl3b3JkcyAqLyxcbiAgICBjb250YWluczogW1xuICAgICAgQ0hBUkFDVEVSLFxuICAgICAgU1RSSU5HLFxuICAgICAgREFURSxcbiAgICAgIE5VTUJFUixcbiAgICAgIExBQkVMLFxuICAgICAgRE9DX0NPTU1FTlQsXG4gICAgICBDT01NRU5ULFxuICAgICAgRElSRUNUSVZFU1xuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgdmJuZXQgYXMgZGVmYXVsdCB9O1xuIiwgIi8qXG5MYW5ndWFnZTogV2ViQXNzZW1ibHlcbldlYnNpdGU6IGh0dHBzOi8vd2ViYXNzZW1ibHkub3JnXG5EZXNjcmlwdGlvbjogIFdhc20gaXMgZGVzaWduZWQgYXMgYSBwb3J0YWJsZSBjb21waWxhdGlvbiB0YXJnZXQgZm9yIHByb2dyYW1taW5nIGxhbmd1YWdlcywgZW5hYmxpbmcgZGVwbG95bWVudCBvbiB0aGUgd2ViIGZvciBjbGllbnQgYW5kIHNlcnZlciBhcHBsaWNhdGlvbnMuXG5DYXRlZ29yeTogd2ViLCBjb21tb25cbkF1ZGl0OiAyMDIwXG4qL1xuXG4vKiogQHR5cGUgTGFuZ3VhZ2VGbiAqL1xuZnVuY3Rpb24gd2FzbShobGpzKSB7XG4gIGhsanMucmVnZXg7XG4gIGNvbnN0IEJMT0NLX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoL1xcKDsvLCAvO1xcKS8pO1xuICBCTE9DS19DT01NRU5ULmNvbnRhaW5zLnB1c2goXCJzZWxmXCIpO1xuICBjb25zdCBMSU5FX0NPTU1FTlQgPSBobGpzLkNPTU1FTlQoLzs7LywgLyQvKTtcblxuICBjb25zdCBLV1MgPSBbXG4gICAgXCJhbnlmdW5jXCIsXG4gICAgXCJibG9ja1wiLFxuICAgIFwiYnJcIixcbiAgICBcImJyX2lmXCIsXG4gICAgXCJicl90YWJsZVwiLFxuICAgIFwiY2FsbFwiLFxuICAgIFwiY2FsbF9pbmRpcmVjdFwiLFxuICAgIFwiZGF0YVwiLFxuICAgIFwiZHJvcFwiLFxuICAgIFwiZWxlbVwiLFxuICAgIFwiZWxzZVwiLFxuICAgIFwiZW5kXCIsXG4gICAgXCJleHBvcnRcIixcbiAgICBcImZ1bmNcIixcbiAgICBcImdsb2JhbC5nZXRcIixcbiAgICBcImdsb2JhbC5zZXRcIixcbiAgICBcImxvY2FsLmdldFwiLFxuICAgIFwibG9jYWwuc2V0XCIsXG4gICAgXCJsb2NhbC50ZWVcIixcbiAgICBcImdldF9nbG9iYWxcIixcbiAgICBcImdldF9sb2NhbFwiLFxuICAgIFwiZ2xvYmFsXCIsXG4gICAgXCJpZlwiLFxuICAgIFwiaW1wb3J0XCIsXG4gICAgXCJsb2NhbFwiLFxuICAgIFwibG9vcFwiLFxuICAgIFwibWVtb3J5XCIsXG4gICAgXCJtZW1vcnkuZ3Jvd1wiLFxuICAgIFwibWVtb3J5LnNpemVcIixcbiAgICBcIm1vZHVsZVwiLFxuICAgIFwibXV0XCIsXG4gICAgXCJub3BcIixcbiAgICBcIm9mZnNldFwiLFxuICAgIFwicGFyYW1cIixcbiAgICBcInJlc3VsdFwiLFxuICAgIFwicmV0dXJuXCIsXG4gICAgXCJzZWxlY3RcIixcbiAgICBcInNldF9nbG9iYWxcIixcbiAgICBcInNldF9sb2NhbFwiLFxuICAgIFwic3RhcnRcIixcbiAgICBcInRhYmxlXCIsXG4gICAgXCJ0ZWVfbG9jYWxcIixcbiAgICBcInRoZW5cIixcbiAgICBcInR5cGVcIixcbiAgICBcInVucmVhY2hhYmxlXCJcbiAgXTtcblxuICBjb25zdCBGVU5DVElPTl9SRUZFUkVOQ0UgPSB7XG4gICAgYmVnaW46IFtcbiAgICAgIC8oPzpmdW5jfGNhbGx8Y2FsbF9pbmRpcmVjdCkvLFxuICAgICAgL1xccysvLFxuICAgICAgL1xcJFteXFxzKV0rL1xuICAgIF0sXG4gICAgY2xhc3NOYW1lOiB7XG4gICAgICAxOiBcImtleXdvcmRcIixcbiAgICAgIDM6IFwidGl0bGUuZnVuY3Rpb25cIlxuICAgIH1cbiAgfTtcblxuICBjb25zdCBBUkdVTUVOVCA9IHtcbiAgICBjbGFzc05hbWU6IFwidmFyaWFibGVcIixcbiAgICBiZWdpbjogL1xcJFtcXHdfXSsvXG4gIH07XG5cbiAgY29uc3QgUEFSRU5TID0ge1xuICAgIG1hdGNoOiAvKFxcKCg/ITspfFxcKSkrLyxcbiAgICBjbGFzc05hbWU6IFwicHVuY3R1YXRpb25cIixcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcblxuICBjb25zdCBOVU1CRVIgPSB7XG4gICAgY2xhc3NOYW1lOiBcIm51bWJlclwiLFxuICAgIHJlbGV2YW5jZTogMCxcbiAgICAvLyBib3Jyb3dlZCBmcm9tIFByaXNtLCBUT0RPOiBzcGxpdCBvdXQgaW50byB2YXJpYW50c1xuICAgIG1hdGNoOiAvWystXT9cXGIoPzpcXGQoPzpfP1xcZCkqKD86XFwuXFxkKD86Xz9cXGQpKik/KD86W2VFXVsrLV0/XFxkKD86Xz9cXGQpKik/fDB4W1xcZGEtZkEtRl0oPzpfP1tcXGRhLWZBLUZdKSooPzpcXC5bXFxkYS1mQS1GXSg/Ol8/W1xcZGEtZkEtRF0pKik/KD86W3BQXVsrLV0/XFxkKD86Xz9cXGQpKik/KVxcYnxcXGJpbmZcXGJ8XFxibmFuKD86OjB4W1xcZGEtZkEtRl0oPzpfP1tcXGRhLWZBLURdKSopP1xcYi9cbiAgfTtcblxuICBjb25zdCBUWVBFID0ge1xuICAgIC8vIGxvb2stYWhlYWQgcHJldmVudHMgdXMgZnJvbSBnb2JibGluZyB1cCBvcGNvZGVzXG4gICAgbWF0Y2g6IC8oaTMyfGk2NHxmMzJ8ZjY0KSg/IVxcLikvLFxuICAgIGNsYXNzTmFtZTogXCJ0eXBlXCJcbiAgfTtcblxuICBjb25zdCBNQVRIX09QRVJBVElPTlMgPSB7XG4gICAgY2xhc3NOYW1lOiBcImtleXdvcmRcIixcbiAgICAvLyBib3Jyb3dlZCBmcm9tIFByaXNtLCBUT0RPOiBzcGxpdCBvdXQgaW50byB2YXJpYW50c1xuICAgIG1hdGNoOiAvXFxiKGYzMnxmNjR8aTMyfGk2NCkoPzpcXC4oPzphYnN8YWRkfGFuZHxjZWlsfGNsenxjb25zdHxjb252ZXJ0X1tzdV1cXC9pKD86MzJ8NjQpfGNvcHlzaWdufGN0enxkZW1vdGVcXC9mNjR8ZGl2KD86X1tzdV0pP3xlcXo/fGV4dGVuZF9bc3VdXFwvaTMyfGZsb29yfGdlKD86X1tzdV0pP3xndCg/Ol9bc3VdKT98bGUoPzpfW3N1XSk/fGxvYWQoPzooPzo4fDE2fDMyKV9bc3VdKT98bHQoPzpfW3N1XSk/fG1heHxtaW58bXVsfG5lYXJlc3R8bmVnP3xvcnxwb3BjbnR8cHJvbW90ZVxcL2YzMnxyZWludGVycHJldFxcL1tmaV0oPzozMnw2NCl8cmVtX1tzdV18cm90W2xyXXxzaGx8c2hyX1tzdV18c3RvcmUoPzo4fDE2fDMyKT98c3FydHxzdWJ8dHJ1bmMoPzpfW3N1XVxcL2YoPzozMnw2NCkpP3x3cmFwXFwvaTY0fHhvcikpXFxiL1xuICB9O1xuXG4gIGNvbnN0IE9GRlNFVF9BTElHTiA9IHtcbiAgICBtYXRjaDogW1xuICAgICAgLyg/Om9mZnNldHxhbGlnbikvLFxuICAgICAgL1xccyovLFxuICAgICAgLz0vXG4gICAgXSxcbiAgICBjbGFzc05hbWU6IHtcbiAgICAgIDE6IFwia2V5d29yZFwiLFxuICAgICAgMzogXCJvcGVyYXRvclwiXG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1dlYkFzc2VtYmx5JyxcbiAgICBrZXl3b3Jkczoge1xuICAgICAgJHBhdHRlcm46IC9bXFx3Ll0rLyxcbiAgICAgIGtleXdvcmQ6IEtXU1xuICAgIH0sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIExJTkVfQ09NTUVOVCxcbiAgICAgIEJMT0NLX0NPTU1FTlQsXG4gICAgICBPRkZTRVRfQUxJR04sXG4gICAgICBBUkdVTUVOVCxcbiAgICAgIFBBUkVOUyxcbiAgICAgIEZVTkNUSU9OX1JFRkVSRU5DRSxcbiAgICAgIGhsanMuUVVPVEVfU1RSSU5HX01PREUsXG4gICAgICBUWVBFLFxuICAgICAgTUFUSF9PUEVSQVRJT05TLFxuICAgICAgTlVNQkVSXG4gICAgXVxuICB9O1xufVxuXG5leHBvcnQgeyB3YXNtIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IEhUTUwsIFhNTFxuV2Vic2l0ZTogaHR0cHM6Ly93d3cudzMub3JnL1hNTC9cbkNhdGVnb3J5OiBjb21tb24sIHdlYlxuQXVkaXQ6IDIwMjBcbiovXG5cbi8qKiBAdHlwZSBMYW5ndWFnZUZuICovXG5mdW5jdGlvbiB4bWwoaGxqcykge1xuICBjb25zdCByZWdleCA9IGhsanMucmVnZXg7XG4gIC8vIFhNTCBuYW1lcyBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbGV0dGVyczogaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbC8jTlQtTmFtZUNoYXJcbiAgLy8gT1RIRVJfTkFNRV9DSEFSUyA9IC9bOlxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXS87XG4gIC8vIEVsZW1lbnQgbmFtZXMgc3RhcnQgd2l0aCBOQU1FX1NUQVJUX0NIQVIgZm9sbG93ZWQgYnkgb3B0aW9uYWwgb3RoZXIgVW5pY29kZSBsZXR0ZXJzLCBBU0NJSSBkaWdpdHMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBhbmQgcGVyaW9kc1xuICAvLyBjb25zdCBUQUdfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdCgvW0EtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdLywgcmVnZXgub3B0aW9uYWwoL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKjovKSwgL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKi8pOztcbiAgLy8gY29uc3QgWE1MX0lERU5UX1JFID0gL1tBLVpfYS16OlxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSsvO1xuICAvLyBjb25zdCBUQUdfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdCgvW0EtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdLywgcmVnZXgub3B0aW9uYWwoL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKjovKSwgL1tBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKi8pO1xuICAvLyBob3dldmVyLCB0byBjYXRlciBmb3IgcGVyZm9ybWFuY2UgYW5kIG1vcmUgVW5pY29kZSBzdXBwb3J0IHJlbHkgc2ltcGx5IG9uIHRoZSBVbmljb2RlIGxldHRlciBjbGFzc1xuICBjb25zdCBUQUdfTkFNRV9SRSA9IHJlZ2V4LmNvbmNhdCgvW1xccHtMfV9dL3UsIHJlZ2V4Lm9wdGlvbmFsKC9bXFxwe0x9MC05Xy4tXSo6L3UpLCAvW1xccHtMfTAtOV8uLV0qL3UpO1xuICBjb25zdCBYTUxfSURFTlRfUkUgPSAvW1xccHtMfTAtOS5fOi1dKy91O1xuICBjb25zdCBYTUxfRU5USVRJRVMgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3ltYm9sJyxcbiAgICBiZWdpbjogLyZbYS16XSs7fCYjWzAtOV0rO3wmI3hbYS1mMC05XSs7L1xuICB9O1xuICBjb25zdCBYTUxfTUVUQV9LRVlXT1JEUyA9IHtcbiAgICBiZWdpbjogL1xccy8sXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAna2V5d29yZCcsXG4gICAgICAgIGJlZ2luOiAvIz9bYS16X11bYS16MS05Xy1dKy8sXG4gICAgICAgIGlsbGVnYWw6IC9cXG4vXG4gICAgICB9XG4gICAgXVxuICB9O1xuICBjb25zdCBYTUxfTUVUQV9QQVJfS0VZV09SRFMgPSBobGpzLmluaGVyaXQoWE1MX01FVEFfS0VZV09SRFMsIHtcbiAgICBiZWdpbjogL1xcKC8sXG4gICAgZW5kOiAvXFwpL1xuICB9KTtcbiAgY29uc3QgQVBPU19NRVRBX1NUUklOR19NT0RFID0gaGxqcy5pbmhlcml0KGhsanMuQVBPU19TVFJJTkdfTU9ERSwgeyBjbGFzc05hbWU6ICdzdHJpbmcnIH0pO1xuICBjb25zdCBRVU9URV9NRVRBX1NUUklOR19NT0RFID0gaGxqcy5pbmhlcml0KGhsanMuUVVPVEVfU1RSSU5HX01PREUsIHsgY2xhc3NOYW1lOiAnc3RyaW5nJyB9KTtcbiAgY29uc3QgVEFHX0lOVEVSTkFMUyA9IHtcbiAgICBlbmRzV2l0aFBhcmVudDogdHJ1ZSxcbiAgICBpbGxlZ2FsOiAvPC8sXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2F0dHInLFxuICAgICAgICBiZWdpbjogWE1MX0lERU5UX1JFLFxuICAgICAgICByZWxldmFuY2U6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPVxccyovLFxuICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGVuZHNQYXJlbnQ6IHRydWUsXG4gICAgICAgICAgICB2YXJpYW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYmVnaW46IC9cIi8sXG4gICAgICAgICAgICAgICAgZW5kOiAvXCIvLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5zOiBbIFhNTF9FTlRJVElFUyBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBiZWdpbjogLycvLFxuICAgICAgICAgICAgICAgIGVuZDogLycvLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5zOiBbIFhNTF9FTlRJVElFUyBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgYmVnaW46IC9bXlxcc1wiJz08PmBdKy8gfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnSFRNTCwgWE1MJyxcbiAgICBhbGlhc2VzOiBbXG4gICAgICAnaHRtbCcsXG4gICAgICAneGh0bWwnLFxuICAgICAgJ3JzcycsXG4gICAgICAnYXRvbScsXG4gICAgICAneGpiJyxcbiAgICAgICd4c2QnLFxuICAgICAgJ3hzbCcsXG4gICAgICAncGxpc3QnLFxuICAgICAgJ3dzZicsXG4gICAgICAnc3ZnJ1xuICAgIF0sXG4gICAgY2FzZV9pbnNlbnNpdGl2ZTogdHJ1ZSxcbiAgICB1bmljb2RlUmVnZXg6IHRydWUsXG4gICAgY29udGFpbnM6IFtcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICAgIGJlZ2luOiAvPCFbYS16XS8sXG4gICAgICAgIGVuZDogLz4vLFxuICAgICAgICByZWxldmFuY2U6IDEwLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIFhNTF9NRVRBX0tFWVdPUkRTLFxuICAgICAgICAgIFFVT1RFX01FVEFfU1RSSU5HX01PREUsXG4gICAgICAgICAgQVBPU19NRVRBX1NUUklOR19NT0RFLFxuICAgICAgICAgIFhNTF9NRVRBX1BBUl9LRVlXT1JEUyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogL1xcWy8sXG4gICAgICAgICAgICBlbmQ6IC9cXF0vLFxuICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICAgICAgICAgIGJlZ2luOiAvPCFbYS16XS8sXG4gICAgICAgICAgICAgICAgZW5kOiAvPi8sXG4gICAgICAgICAgICAgICAgY29udGFpbnM6IFtcbiAgICAgICAgICAgICAgICAgIFhNTF9NRVRBX0tFWVdPUkRTLFxuICAgICAgICAgICAgICAgICAgWE1MX01FVEFfUEFSX0tFWVdPUkRTLFxuICAgICAgICAgICAgICAgICAgUVVPVEVfTUVUQV9TVFJJTkdfTU9ERSxcbiAgICAgICAgICAgICAgICAgIEFQT1NfTUVUQV9TVFJJTkdfTU9ERVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGhsanMuQ09NTUVOVChcbiAgICAgICAgLzwhLS0vLFxuICAgICAgICAvLS0+LyxcbiAgICAgICAgeyByZWxldmFuY2U6IDEwIH1cbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvPCFcXFtDREFUQVxcWy8sXG4gICAgICAgIGVuZDogL1xcXVxcXT4vLFxuICAgICAgICByZWxldmFuY2U6IDEwXG4gICAgICB9LFxuICAgICAgWE1MX0VOVElUSUVTLFxuICAgICAgLy8geG1sIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgICBlbmQ6IC9cXD8+LyxcbiAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogLzxcXD94bWwvLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAxMCxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAgICAgIFFVT1RFX01FVEFfU1RSSU5HX01PREVcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJlZ2luOiAvPFxcP1thLXpdW2EtejAtOV0rLyxcbiAgICAgICAgICB9XG4gICAgICAgIF1cblxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgLypcbiAgICAgICAgVGhlIGxvb2thaGVhZCBwYXR0ZXJuICg/PS4uLikgZW5zdXJlcyB0aGF0ICdiZWdpbicgb25seSBtYXRjaGVzXG4gICAgICAgICc8c3R5bGUnIGFzIGEgc2luZ2xlIHdvcmQsIGZvbGxvd2VkIGJ5IGEgd2hpdGVzcGFjZSBvciBhblxuICAgICAgICBlbmRpbmcgYnJhY2tldC5cbiAgICAgICAgKi9cbiAgICAgICAgYmVnaW46IC88c3R5bGUoPz1cXHN8PikvLFxuICAgICAgICBlbmQ6IC8+LyxcbiAgICAgICAga2V5d29yZHM6IHsgbmFtZTogJ3N0eWxlJyB9LFxuICAgICAgICBjb250YWluczogWyBUQUdfSU5URVJOQUxTIF0sXG4gICAgICAgIHN0YXJ0czoge1xuICAgICAgICAgIGVuZDogLzxcXC9zdHlsZT4vLFxuICAgICAgICAgIHJldHVybkVuZDogdHJ1ZSxcbiAgICAgICAgICBzdWJMYW5ndWFnZTogW1xuICAgICAgICAgICAgJ2NzcycsXG4gICAgICAgICAgICAneG1sJ1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgLy8gU2VlIHRoZSBjb21tZW50IGluIHRoZSA8c3R5bGUgdGFnIGFib3V0IHRoZSBsb29rYWhlYWQgcGF0dGVyblxuICAgICAgICBiZWdpbjogLzxzY3JpcHQoPz1cXHN8PikvLFxuICAgICAgICBlbmQ6IC8+LyxcbiAgICAgICAga2V5d29yZHM6IHsgbmFtZTogJ3NjcmlwdCcgfSxcbiAgICAgICAgY29udGFpbnM6IFsgVEFHX0lOVEVSTkFMUyBdLFxuICAgICAgICBzdGFydHM6IHtcbiAgICAgICAgICBlbmQ6IC88XFwvc2NyaXB0Pi8sXG4gICAgICAgICAgcmV0dXJuRW5kOiB0cnVlLFxuICAgICAgICAgIHN1Ykxhbmd1YWdlOiBbXG4gICAgICAgICAgICAnamF2YXNjcmlwdCcsXG4gICAgICAgICAgICAnaGFuZGxlYmFycycsXG4gICAgICAgICAgICAneG1sJ1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIHdlIG5lZWQgdGhpcyBmb3Igbm93IGZvciBqU1hcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgYmVnaW46IC88Pnw8XFwvPi9cbiAgICAgIH0sXG4gICAgICAvLyBvcGVuIHRhZ1xuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICd0YWcnLFxuICAgICAgICBiZWdpbjogcmVnZXguY29uY2F0KFxuICAgICAgICAgIC88LyxcbiAgICAgICAgICByZWdleC5sb29rYWhlYWQocmVnZXguY29uY2F0KFxuICAgICAgICAgICAgVEFHX05BTUVfUkUsXG4gICAgICAgICAgICAvLyA8dGFnLz5cbiAgICAgICAgICAgIC8vIDx0YWc+XG4gICAgICAgICAgICAvLyA8dGFnIC4uLlxuICAgICAgICAgICAgcmVnZXguZWl0aGVyKC9cXC8+LywgLz4vLCAvXFxzLylcbiAgICAgICAgICApKVxuICAgICAgICApLFxuICAgICAgICBlbmQ6IC9cXC8/Pi8sXG4gICAgICAgIGNvbnRhaW5zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiAnbmFtZScsXG4gICAgICAgICAgICBiZWdpbjogVEFHX05BTUVfUkUsXG4gICAgICAgICAgICByZWxldmFuY2U6IDAsXG4gICAgICAgICAgICBzdGFydHM6IFRBR19JTlRFUk5BTFNcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAvLyBjbG9zZSB0YWdcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndGFnJyxcbiAgICAgICAgYmVnaW46IHJlZ2V4LmNvbmNhdChcbiAgICAgICAgICAvPFxcLy8sXG4gICAgICAgICAgcmVnZXgubG9va2FoZWFkKHJlZ2V4LmNvbmNhdChcbiAgICAgICAgICAgIFRBR19OQU1FX1JFLCAvPi9cbiAgICAgICAgICApKVxuICAgICAgICApLFxuICAgICAgICBjb250YWluczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ25hbWUnLFxuICAgICAgICAgICAgYmVnaW46IFRBR19OQU1FX1JFLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBiZWdpbjogLz4vLFxuICAgICAgICAgICAgcmVsZXZhbmNlOiAwLFxuICAgICAgICAgICAgZW5kc1BhcmVudDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cblxuZXhwb3J0IHsgeG1sIGFzIGRlZmF1bHQgfTtcbiIsICIvKlxuTGFuZ3VhZ2U6IFlBTUxcbkRlc2NyaXB0aW9uOiBZZXQgQW5vdGhlciBNYXJrZG93biBMYW5ndWFnZVxuQXV0aG9yOiBTdGVmYW4gV2llbmVydCA8c3R3aWVuZXJ0QGdtYWlsLmNvbT5cbkNvbnRyaWJ1dG9yczogQ2FybCBCYXh0ZXIgPGNhcmxAY2JheC50ZWNoPlxuUmVxdWlyZXM6IHJ1YnkuanNcbldlYnNpdGU6IGh0dHBzOi8veWFtbC5vcmdcbkNhdGVnb3J5OiBjb21tb24sIGNvbmZpZ1xuKi9cbmZ1bmN0aW9uIHlhbWwoaGxqcykge1xuICBjb25zdCBMSVRFUkFMUyA9ICd0cnVlIGZhbHNlIHllcyBubyBudWxsJztcblxuICAvLyBZQU1MIHNwZWMgYWxsb3dzIG5vbi1yZXNlcnZlZCBVUkkgY2hhcmFjdGVycyBpbiB0YWdzLlxuICBjb25zdCBVUklfQ0hBUkFDVEVSUyA9ICdbXFxcXHcjOy8/OkAmPSskLC5+KlxcJygpW1xcXFxdXSsnO1xuXG4gIC8vIERlZmluZSBrZXlzIGFzIHN0YXJ0aW5nIHdpdGggYSB3b3JkIGNoYXJhY3RlclxuICAvLyAuLi5jb250YWluaW5nIHdvcmQgY2hhcnMsIHNwYWNlcywgY29sb25zLCBmb3J3YXJkLXNsYXNoZXMsIGh5cGhlbnMgYW5kIHBlcmlvZHNcbiAgLy8gLi4uYW5kIGVuZGluZyB3aXRoIGEgY29sb24gZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgYSBzcGFjZSwgdGFiIG9yIG5ld2xpbmUuXG4gIC8vIFRoZSBZQU1MIHNwZWMgYWxsb3dzIGZvciBtdWNoIG1vcmUgdGhhbiB0aGlzLCBidXQgdGhpcyBjb3ZlcnMgbW9zdCB1c2UtY2FzZXMuXG4gIGNvbnN0IEtFWSA9IHtcbiAgICBjbGFzc05hbWU6ICdhdHRyJyxcbiAgICB2YXJpYW50czogW1xuICAgICAgeyBiZWdpbjogJ1xcXFx3W1xcXFx3IDpcXFxcLy4tXSo6KD89WyBcXHRdfCQpJyB9LFxuICAgICAgeyAvLyBkb3VibGUgcXVvdGVkIGtleXNcbiAgICAgICAgYmVnaW46ICdcIlxcXFx3W1xcXFx3IDpcXFxcLy4tXSpcIjooPz1bIFxcdF18JCknIH0sXG4gICAgICB7IC8vIHNpbmdsZSBxdW90ZWQga2V5c1xuICAgICAgICBiZWdpbjogJ1xcJ1xcXFx3W1xcXFx3IDpcXFxcLy4tXSpcXCc6KD89WyBcXHRdfCQpJyB9XG4gICAgXVxuICB9O1xuXG4gIGNvbnN0IFRFTVBMQVRFX1ZBUklBQkxFUyA9IHtcbiAgICBjbGFzc05hbWU6ICd0ZW1wbGF0ZS12YXJpYWJsZScsXG4gICAgdmFyaWFudHM6IFtcbiAgICAgIHsgLy8gamluamEgdGVtcGxhdGVzIEFuc2libGVcbiAgICAgICAgYmVnaW46IC9cXHtcXHsvLFxuICAgICAgICBlbmQ6IC9cXH1cXH0vXG4gICAgICB9LFxuICAgICAgeyAvLyBSdWJ5IGkxOG5cbiAgICAgICAgYmVnaW46IC8lXFx7LyxcbiAgICAgICAgZW5kOiAvXFx9L1xuICAgICAgfVxuICAgIF1cbiAgfTtcbiAgY29uc3QgU1RSSU5HID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgcmVsZXZhbmNlOiAwLFxuICAgIHZhcmlhbnRzOiBbXG4gICAgICB7XG4gICAgICAgIGJlZ2luOiAvJy8sXG4gICAgICAgIGVuZDogLycvXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBiZWdpbjogL1wiLyxcbiAgICAgICAgZW5kOiAvXCIvXG4gICAgICB9LFxuICAgICAgeyBiZWdpbjogL1xcUysvIH1cbiAgICBdLFxuICAgIGNvbnRhaW5zOiBbXG4gICAgICBobGpzLkJBQ0tTTEFTSF9FU0NBUEUsXG4gICAgICBURU1QTEFURV9WQVJJQUJMRVNcbiAgICBdXG4gIH07XG5cbiAgLy8gU3RyaW5ncyBpbnNpZGUgb2YgdmFsdWUgY29udGFpbmVycyAob2JqZWN0cykgY2FuJ3QgY29udGFpbiBicmFjZXMsXG4gIC8vIGJyYWNrZXRzLCBvciBjb21tYXNcbiAgY29uc3QgQ09OVEFJTkVSX1NUUklORyA9IGhsanMuaW5oZXJpdChTVFJJTkcsIHsgdmFyaWFudHM6IFtcbiAgICB7XG4gICAgICBiZWdpbjogLycvLFxuICAgICAgZW5kOiAvJy9cbiAgICB9LFxuICAgIHtcbiAgICAgIGJlZ2luOiAvXCIvLFxuICAgICAgZW5kOiAvXCIvXG4gICAgfSxcbiAgICB7IGJlZ2luOiAvW15cXHMse31bXFxdXSsvIH1cbiAgXSB9KTtcblxuICBjb25zdCBEQVRFX1JFID0gJ1swLTldezR9KC1bMC05XVswLTldKXswLDJ9JztcbiAgY29uc3QgVElNRV9SRSA9ICcoW1R0IFxcXFx0XVswLTldWzAtOV0/KDpbMC05XVswLTldKXsyfSk/JztcbiAgY29uc3QgRlJBQ1RJT05fUkUgPSAnKFxcXFwuWzAtOV0qKT8nO1xuICBjb25zdCBaT05FX1JFID0gJyhbIFxcXFx0XSkqKFp8Wy0rXVswLTldWzAtOV0/KDpbMC05XVswLTldKT8pPyc7XG4gIGNvbnN0IFRJTUVTVEFNUCA9IHtcbiAgICBjbGFzc05hbWU6ICdudW1iZXInLFxuICAgIGJlZ2luOiAnXFxcXGInICsgREFURV9SRSArIFRJTUVfUkUgKyBGUkFDVElPTl9SRSArIFpPTkVfUkUgKyAnXFxcXGInXG4gIH07XG5cbiAgY29uc3QgVkFMVUVfQ09OVEFJTkVSID0ge1xuICAgIGVuZDogJywnLFxuICAgIGVuZHNXaXRoUGFyZW50OiB0cnVlLFxuICAgIGV4Y2x1ZGVFbmQ6IHRydWUsXG4gICAga2V5d29yZHM6IExJVEVSQUxTLFxuICAgIHJlbGV2YW5jZTogMFxuICB9O1xuICBjb25zdCBPQkpFQ1QgPSB7XG4gICAgYmVnaW46IC9cXHsvLFxuICAgIGVuZDogL1xcfS8sXG4gICAgY29udGFpbnM6IFsgVkFMVUVfQ09OVEFJTkVSIF0sXG4gICAgaWxsZWdhbDogJ1xcXFxuJyxcbiAgICByZWxldmFuY2U6IDBcbiAgfTtcbiAgY29uc3QgQVJSQVkgPSB7XG4gICAgYmVnaW46ICdcXFxcWycsXG4gICAgZW5kOiAnXFxcXF0nLFxuICAgIGNvbnRhaW5zOiBbIFZBTFVFX0NPTlRBSU5FUiBdLFxuICAgIGlsbGVnYWw6ICdcXFxcbicsXG4gICAgcmVsZXZhbmNlOiAwXG4gIH07XG5cbiAgY29uc3QgTU9ERVMgPSBbXG4gICAgS0VZLFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgYmVnaW46ICdeLS0tXFxcXHMqJCcsXG4gICAgICByZWxldmFuY2U6IDEwXG4gICAgfSxcbiAgICB7IC8vIG11bHRpIGxpbmUgc3RyaW5nXG4gICAgICAvLyBCbG9ja3Mgc3RhcnQgd2l0aCBhIHwgb3IgPiBmb2xsb3dlZCBieSBhIG5ld2xpbmVcbiAgICAgIC8vXG4gICAgICAvLyBJbmRlbnRhdGlvbiBvZiBzdWJzZXF1ZW50IGxpbmVzIG11c3QgYmUgdGhlIHNhbWUgdG9cbiAgICAgIC8vIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgYmxvY2tcbiAgICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgICBiZWdpbjogJ1tcXFxcfD5dKFsxLTldP1srLV0pP1sgXSpcXFxcbiggKylbXiBdW15cXFxcbl0qXFxcXG4oXFxcXDJbXlxcXFxuXStcXFxcbj8pKidcbiAgICB9LFxuICAgIHsgLy8gUnVieS9SYWlscyBlcmJcbiAgICAgIGJlZ2luOiAnPCVbJT0tXT8nLFxuICAgICAgZW5kOiAnWyUtXT8lPicsXG4gICAgICBzdWJMYW5ndWFnZTogJ3J1YnknLFxuICAgICAgZXhjbHVkZUJlZ2luOiB0cnVlLFxuICAgICAgZXhjbHVkZUVuZDogdHJ1ZSxcbiAgICAgIHJlbGV2YW5jZTogMFxuICAgIH0sXG4gICAgeyAvLyBuYW1lZCB0YWdzXG4gICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgIGJlZ2luOiAnIVxcXFx3KyEnICsgVVJJX0NIQVJBQ1RFUlNcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8veWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjc4NDA2NFxuICAgIHsgLy8gdmVyYmF0aW0gdGFnc1xuICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICBiZWdpbjogJyE8JyArIFVSSV9DSEFSQUNURVJTICsgXCI+XCJcbiAgICB9LFxuICAgIHsgLy8gcHJpbWFyeSB0YWdzXG4gICAgICBjbGFzc05hbWU6ICd0eXBlJyxcbiAgICAgIGJlZ2luOiAnIScgKyBVUklfQ0hBUkFDVEVSU1xuICAgIH0sXG4gICAgeyAvLyBzZWNvbmRhcnkgdGFnc1xuICAgICAgY2xhc3NOYW1lOiAndHlwZScsXG4gICAgICBiZWdpbjogJyEhJyArIFVSSV9DSEFSQUNURVJTXG4gICAgfSxcbiAgICB7IC8vIGZyYWdtZW50IGlkICZyZWZcbiAgICAgIGNsYXNzTmFtZTogJ21ldGEnLFxuICAgICAgYmVnaW46ICcmJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICckJ1xuICAgIH0sXG4gICAgeyAvLyBmcmFnbWVudCByZWZlcmVuY2UgKnJlZlxuICAgICAgY2xhc3NOYW1lOiAnbWV0YScsXG4gICAgICBiZWdpbjogJ1xcXFwqJyArIGhsanMuVU5ERVJTQ09SRV9JREVOVF9SRSArICckJ1xuICAgIH0sXG4gICAgeyAvLyBhcnJheSBsaXN0aW5nXG4gICAgICBjbGFzc05hbWU6ICdidWxsZXQnLFxuICAgICAgLy8gVE9ETzogcmVtb3ZlIHwkIGhhY2sgd2hlbiB3ZSBoYXZlIHByb3BlciBsb29rLWFoZWFkIHN1cHBvcnRcbiAgICAgIGJlZ2luOiAnLSg/PVsgXXwkKScsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIGhsanMuSEFTSF9DT01NRU5UX01PREUsXG4gICAge1xuICAgICAgYmVnaW5LZXl3b3JkczogTElURVJBTFMsXG4gICAgICBrZXl3b3JkczogeyBsaXRlcmFsOiBMSVRFUkFMUyB9XG4gICAgfSxcbiAgICBUSU1FU1RBTVAsXG4gICAgLy8gbnVtYmVycyBhcmUgYW55IHZhbGlkIEMtc3R5bGUgbnVtYmVyIHRoYXRcbiAgICAvLyBzaXQgaXNvbGF0ZWQgZnJvbSBvdGhlciB3b3Jkc1xuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ251bWJlcicsXG4gICAgICBiZWdpbjogaGxqcy5DX05VTUJFUl9SRSArICdcXFxcYicsXG4gICAgICByZWxldmFuY2U6IDBcbiAgICB9LFxuICAgIE9CSkVDVCxcbiAgICBBUlJBWSxcbiAgICBTVFJJTkdcbiAgXTtcblxuICBjb25zdCBWQUxVRV9NT0RFUyA9IFsgLi4uTU9ERVMgXTtcbiAgVkFMVUVfTU9ERVMucG9wKCk7XG4gIFZBTFVFX01PREVTLnB1c2goQ09OVEFJTkVSX1NUUklORyk7XG4gIFZBTFVFX0NPTlRBSU5FUi5jb250YWlucyA9IFZBTFVFX01PREVTO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1lBTUwnLFxuICAgIGNhc2VfaW5zZW5zaXRpdmU6IHRydWUsXG4gICAgYWxpYXNlczogWyAneW1sJyBdLFxuICAgIGNvbnRhaW5zOiBNT0RFU1xuICB9O1xufVxuXG5leHBvcnQgeyB5YW1sIGFzIGRlZmF1bHQgfTtcbiIsICIvLyBodHRwczovL25vZGVqcy5vcmcvYXBpL3BhY2thZ2VzLmh0bWwjcGFja2FnZXNfd3JpdGluZ19kdWFsX3BhY2thZ2VzX3doaWxlX2F2b2lkaW5nX29yX21pbmltaXppbmdfaGF6YXJkc1xuaW1wb3J0IEhpZ2hsaWdodEpTIGZyb20gJy4uL2xpYi9jb3JlLmpzJztcbmV4cG9ydCB7IEhpZ2hsaWdodEpTIH07XG5leHBvcnQgZGVmYXVsdCBIaWdobGlnaHRKUztcbiIsICIvLyBAdHMtZXhwZWN0LWVycm9yXG5pbXBvcnQgZm9ybWF0dGVyIGZyb20gJ2Zvcm1hdCdcblxuZXhwb3J0IGNvbnN0IGZhdWx0ID0gT2JqZWN0LmFzc2lnbihjcmVhdGUoRXJyb3IpLCB7XG4gIGV2YWw6IGNyZWF0ZShFdmFsRXJyb3IpLFxuICByYW5nZTogY3JlYXRlKFJhbmdlRXJyb3IpLFxuICByZWZlcmVuY2U6IGNyZWF0ZShSZWZlcmVuY2VFcnJvciksXG4gIHN5bnRheDogY3JlYXRlKFN5bnRheEVycm9yKSxcbiAgdHlwZTogY3JlYXRlKFR5cGVFcnJvciksXG4gIHVyaTogY3JlYXRlKFVSSUVycm9yKVxufSlcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYEVDb25zdHJ1Y3RvcmAsIHdpdGggdGhlIGZvcm1hdHRlZCBgZm9ybWF0YCBhcyBhIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSB7RXJyb3J9IEZhdWx0XG4gKiBAdGVtcGxhdGUge25ldyAocmVhc29uOiBzdHJpbmcpID0+IEZhdWx0fSBDbGFzc1xuICogQHBhcmFtIHtDbGFzc30gQ29uc3RydWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShDb25zdHJ1Y3Rvcikge1xuICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICBGb3JtYXR0ZWRFcnJvci5kaXNwbGF5TmFtZSA9IENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IENvbnN0cnVjdG9yLm5hbWVcblxuICByZXR1cm4gRm9ybWF0dGVkRXJyb3JcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVycm9yIHdpdGggYSBwcmludGYtbGlrZSBmb3JtYXR0ZWQgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gW2Zvcm1hdF1cbiAgICogICBUZW1wbGF0ZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7Li4udW5rbm93bn0gdmFsdWVzXG4gICAqICAgVmFsdWVzIHRvIHJlbmRlciBpbiBgZm9ybWF0YC5cbiAgICogQHJldHVybnMge0ZhdWx0fVxuICAgKi9cbiAgZnVuY3Rpb24gRm9ybWF0dGVkRXJyb3IoZm9ybWF0LCAuLi52YWx1ZXMpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBjb25zdCByZWFzb24gPSBmb3JtYXQgPyBmb3JtYXR0ZXIoZm9ybWF0LCAuLi52YWx1ZXMpIDogZm9ybWF0XG4gICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihyZWFzb24pXG4gIH1cbn1cbiIsICIvKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2hhc3QnKS5UZXh0fSBUZXh0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMnKS5IaWdobGlnaHRSZXN1bHR9IEhpZ2hsaWdodFJlc3VsdFxuICogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuSExKU09wdGlvbnN9IEhpZ2hsaWdodE9wdGlvbnNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2hpZ2hsaWdodC5qcycpLkxhbmd1YWdlRm59IEhpZ2hsaWdodFN5bnRheFxuICogQHR5cGVkZWYge2ltcG9ydCgnaGlnaGxpZ2h0LmpzJykuRW1pdHRlcn0gSGlnaGxpZ2h0RW1pdHRlclxuICpcbiAqIEB0eXBlZGVmIHt7dHlwZTogJ2VsZW1lbnQnLCB0YWdOYW1lOiAnc3BhbicsIHByb3BlcnRpZXM6IHtjbGFzc05hbWU6IEFycmF5PHN0cmluZz59LCBjaGlsZHJlbjogQXJyYXk8U3BhbnxUZXh0Pn19IFNwYW5cbiAqIEB0eXBlZGVmIHt7dHlwZTogJ3Jvb3QnLCBkYXRhOiB7bGFuZ3VhZ2U6IHN0cmluZ3xudWxsLCByZWxldmFuY2U6IG51bWJlcn0sIGNoaWxkcmVuOiBBcnJheTxTcGFufFRleHQ+fX0gUm9vdFxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV4dHJhT3B0aW9uc1xuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmc+fSBbc3Vic2V0XVxuICogICBMaXN0IG9mIGFsbG93ZWQgbGFuZ3VhZ2VzLCBkZWZhdWx0cyB0byBhbGwgcmVnaXN0ZXJlZCBsYW5ndWFnZXMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gT3B0aW9uc1xuICogICBDb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwcmVmaXg9J2hsanMtJ11cbiAqICAgQ2xhc3MgcHJlZml4LlxuICpcbiAqIEB0eXBlZGVmIHtPcHRpb25zICYgRXh0cmFPcHRpb25zfSBBdXRvT3B0aW9uc1xuICovXG5cbmltcG9ydCBoaWdoIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvY29yZSdcbmltcG9ydCB7ZmF1bHR9IGZyb20gJ2ZhdWx0J1xuXG5jb25zdCBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eVxuXG5jb25zdCBkZWZhdWx0UHJlZml4ID0gJ2hsanMtJ1xuXG4vKipcbiAqIEhpZ2hsaWdodCBgdmFsdWVgIChjb2RlKSBhcyBgbGFuZ3VhZ2VgIChuYW1lKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcbiAqICAgUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogICBDb2RlIHRvIGhpZ2hsaWdodC5cbiAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnM9e31dXG4gKiAgIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7Um9vdH1cbiAqICAgQSBoYXN0IGBSb290YCBub2RlLlxuICovXG5mdW5jdGlvbiBoaWdobGlnaHQobGFuZ3VhZ2UsIHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IHByZWZpeCA9IG9wdGlvbnMucHJlZml4XG5cbiAgaWYgKHR5cGVvZiBsYW5ndWFnZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBmYXVsdCgnRXhwZWN0ZWQgYHN0cmluZ2AgZm9yIG5hbWUsIGdvdCBgJXNgJywgbGFuZ3VhZ2UpXG4gIH1cblxuICBpZiAoIWhpZ2guZ2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpKSB7XG4gICAgdGhyb3cgZmF1bHQoJ1Vua25vd24gbGFuZ3VhZ2U6IGAlc2AgaXMgbm90IHJlZ2lzdGVyZWQnLCBsYW5ndWFnZSlcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgZmF1bHQoJ0V4cGVjdGVkIGBzdHJpbmdgIGZvciB2YWx1ZSwgZ290IGAlc2AnLCB2YWx1ZSlcbiAgfVxuXG4gIGlmIChwcmVmaXggPT09IG51bGwgfHwgcHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICBwcmVmaXggPSBkZWZhdWx0UHJlZml4XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yOiBUeXBlcyBvdXQgb2YgZGF0ZS5cbiAgLy8gU2VlOiA8aHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMzYyMSNpc3N1ZWNvbW1lbnQtMTUyODg0MTg4OD5cbiAgaGlnaC5jb25maWd1cmUoe19fZW1pdHRlcjogSGFzdEVtaXR0ZXIsIGNsYXNzUHJlZml4OiBwcmVmaXh9KVxuXG4gIGNvbnN0IHJlc3VsdCA9IC8qKiBAdHlwZSB7SGlnaGxpZ2h0UmVzdWx0ICYge19lbWl0dGVyOiBIYXN0RW1pdHRlcn19ICovIChcbiAgICBoaWdoLmhpZ2hsaWdodCh2YWx1ZSwge2xhbmd1YWdlLCBpZ25vcmVJbGxlZ2FsczogdHJ1ZX0pXG4gIClcblxuICBoaWdoLmNvbmZpZ3VyZSh7fSlcblxuICAvLyBgaGlnaGxpZ2h0LmpzYCBzZWVtcyB0byB1c2UgdGhpcyAoY3VycmVudGx5KSBmb3IgYnJva2VuIGdyYW1tYXJzLCBzbyBsZXRcdTIwMTlzXG4gIC8vIGtlZXAgaXQgaW4gdGhlcmUganVzdCB0byBiZSBzdXJlLlxuICAvKiBjOCBpZ25vcmUgbmV4dCAzICovXG4gIGlmIChyZXN1bHQuZXJyb3JSYWlzZWQpIHtcbiAgICB0aHJvdyByZXN1bHQuZXJyb3JSYWlzZWRcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3I6IGBsYW5ndWFnZWAgaXMgYWx3YXlzIGRlZmluZWQgaW4gYGhpZ2hsaWdodGAuXG4gIHJlc3VsdC5fZW1pdHRlci5yb290LmRhdGEubGFuZ3VhZ2UgPSByZXN1bHQubGFuZ3VhZ2VcbiAgcmVzdWx0Ll9lbWl0dGVyLnJvb3QuZGF0YS5yZWxldmFuY2UgPSByZXN1bHQucmVsZXZhbmNlXG5cbiAgcmV0dXJuIHJlc3VsdC5fZW1pdHRlci5yb290XG59XG5cbi8qKlxuICogSGlnaGxpZ2h0IGB2YWx1ZWAgKGNvZGUpIGFuZCBndWVzcyBpdHMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiAgIENvZGUgdG8gaGlnaGxpZ2h0LlxuICogQHBhcmFtIHtBdXRvT3B0aW9uc30gW29wdGlvbnM9e31dXG4gKiAgIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7Um9vdH1cbiAqICAgQSBoYXN0IGBSb290YCBub2RlLlxuICovXG5mdW5jdGlvbiBoaWdobGlnaHRBdXRvKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qgc3Vic2V0ID0gb3B0aW9ucy5zdWJzZXQgfHwgaGlnaC5saXN0TGFuZ3VhZ2VzKClcbiAgbGV0IHByZWZpeCA9IG9wdGlvbnMucHJlZml4XG4gIGxldCBpbmRleCA9IC0xXG4gIC8qKiBAdHlwZSB7Um9vdH0gKi9cbiAgbGV0IHJlc3VsdCA9IHtcbiAgICB0eXBlOiAncm9vdCcsXG4gICAgZGF0YToge2xhbmd1YWdlOiBudWxsLCByZWxldmFuY2U6IDB9LFxuICAgIGNoaWxkcmVuOiBbXVxuICB9XG5cbiAgaWYgKHByZWZpeCA9PT0gbnVsbCB8fCBwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgIHByZWZpeCA9IGRlZmF1bHRQcmVmaXhcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgZmF1bHQoJ0V4cGVjdGVkIGBzdHJpbmdgIGZvciB2YWx1ZSwgZ290IGAlc2AnLCB2YWx1ZSlcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgc3Vic2V0Lmxlbmd0aCkge1xuICAgIGNvbnN0IG5hbWUgPSBzdWJzZXRbaW5kZXhdXG5cbiAgICBpZiAoIWhpZ2guZ2V0TGFuZ3VhZ2UobmFtZSkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBjdXJyZW50ID0gaGlnaGxpZ2h0KG5hbWUsIHZhbHVlLCBvcHRpb25zKVxuXG4gICAgaWYgKGN1cnJlbnQuZGF0YS5yZWxldmFuY2UgPiByZXN1bHQuZGF0YS5yZWxldmFuY2UpIHJlc3VsdCA9IGN1cnJlbnRcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGxhbmd1YWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuICogICBQcm9ncmFtbWluZyBsYW5ndWFnZSBuYW1lLlxuICogQHBhcmFtIHtIaWdobGlnaHRTeW50YXh9IHN5bnRheFxuICogICBgaGlnaGxpZ2h0LmpzYCBsYW5ndWFnZSBzeW50YXguXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZSwgc3ludGF4KSB7XG4gIGhpZ2gucmVnaXN0ZXJMYW5ndWFnZShsYW5ndWFnZSwgc3ludGF4KVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGFsaWFzZXMgZm9yIGFscmVhZHkgcmVnaXN0ZXJlZCBsYW5ndWFnZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nfEFycmF5PHN0cmluZz4+fSBsYW5ndWFnZVxuICogICBQcm9ncmFtbWluZyBsYW5ndWFnZSBuYW1lIG9yIGEgbWFwIG9mIGBsYW5ndWFnZWBzIHRvIGBhbGlhc2BlcyBvciBgbGlzdGBzXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBbYWxpYXNdXG4gKiAgIE5ldyBhbGlhc2VzIGZvciB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcmVnaXN0ZXJBbGlhcyA9XG4gIC8qKlxuICAgKiBAdHlwZSB7KFxuICAgKiAgICgobGFuZ3VhZ2U6IHN0cmluZywgYWxpYXM6IHN0cmluZ3xBcnJheTxzdHJpbmc+KSA9PiB2b2lkKSAmXG4gICAqICAgKChhbGlhc2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8QXJyYXk8c3RyaW5nPj4pID0+IHZvaWQpXG4gICAqICl9XG4gICAqL1xuICAoXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nfEFycmF5PHN0cmluZz4+fSBsYW5ndWFnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz59IFthbGlhc11cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiAobGFuZ3VhZ2UsIGFsaWFzKSB7XG4gICAgICBpZiAodHlwZW9mIGxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBzaG91bGQgYmUgYSBzdHJpbmcgaW4gdGhpcyBvdmVybG9hZC5cbiAgICAgICAgaGlnaC5yZWdpc3RlckFsaWFzZXMoYWxpYXMsIHtsYW5ndWFnZU5hbWU6IGxhbmd1YWdlfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgICAgICBsZXQga2V5XG5cbiAgICAgICAgZm9yIChrZXkgaW4gbGFuZ3VhZ2UpIHtcbiAgICAgICAgICBpZiAob3duLmNhbGwobGFuZ3VhZ2UsIGtleSkpIHtcbiAgICAgICAgICAgIGhpZ2gucmVnaXN0ZXJBbGlhc2VzKGxhbmd1YWdlW2tleV0sIHtsYW5ndWFnZU5hbWU6IGtleX0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICApXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhbiBgYWxpYXNgIG9yIGBsYW5ndWFnZWAgaXMgcmVnaXN0ZXJlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWxpYXNPckxhbmd1YWdlXG4gKiAgIE5hbWUgb2YgYSByZWdpc3RlcmVkIGxhbmd1YWdlIG9yIGFsaWFzLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiAgIFdoZXRoZXIgYGFsaWFzT3JsYW5ndWFnZWAgaXMgcmVnaXN0ZXJlZC5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJlZChhbGlhc09yTGFuZ3VhZ2UpIHtcbiAgcmV0dXJuIEJvb2xlYW4oaGlnaC5nZXRMYW5ndWFnZShhbGlhc09yTGFuZ3VhZ2UpKVxufVxuXG4vKipcbiAqIExpc3QgcmVnaXN0ZXJlZCBsYW5ndWFnZXMuXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59XG4gKiAgIE5hbWVzIG9mIHJlZ2lzdGVyZWQgbGFuZ3VhZ2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RMYW5ndWFnZXMoKSB7XG4gIHJldHVybiBoaWdoLmxpc3RMYW5ndWFnZXMoKVxufVxuXG4vKiogQHR5cGUge0hpZ2hsaWdodEVtaXR0ZXJ9ICovXG5jbGFzcyBIYXN0RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0hpZ2hsaWdodE9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAvKiogQHR5cGUge0hpZ2hsaWdodE9wdGlvbnN9ICovXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIC8qKiBAdHlwZSB7Um9vdH0gKi9cbiAgICB0aGlzLnJvb3QgPSB7XG4gICAgICB0eXBlOiAncm9vdCcsXG4gICAgICBkYXRhOiB7bGFuZ3VhZ2U6IG51bGwsIHJlbGV2YW5jZTogMH0sXG4gICAgICBjaGlsZHJlbjogW11cbiAgICB9XG4gICAgLyoqIEB0eXBlIHtbUm9vdCwgLi4uQXJyYXk8U3Bhbj5dfSAqL1xuICAgIHRoaXMuc3RhY2sgPSBbdGhpcy5yb290XVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKi9cbiAgYWRkVGV4dCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHJldHVyblxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGNvbnN0IHRhaWwgPSBjdXJyZW50LmNoaWxkcmVuW2N1cnJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMV1cblxuICAgIGlmICh0YWlsICYmIHRhaWwudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICB0YWlsLnZhbHVlICs9IHZhbHVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnQuY2hpbGRyZW4ucHVzaCh7dHlwZTogJ3RleHQnLCB2YWx1ZX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gcmF3TmFtZVxuICAgKi9cbiAgc3RhcnRTY29wZShyYXdOYW1lKSB7XG4gICAgdGhpcy5vcGVuTm9kZShTdHJpbmcocmF3TmFtZSkpXG4gIH1cblxuICAvKipcbiAgICovXG4gIGVuZFNjb3BlKCkge1xuICAgIHRoaXMuY2xvc2VOb2RlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hhc3RFbWl0dGVyfSBvdGhlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgX19hZGRTdWJsYW5ndWFnZShvdGhlciwgbmFtZSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICBjb25zdCByZXN1bHRzID0gb3RoZXIucm9vdC5jaGlsZHJlblxuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGN1cnJlbnQuY2hpbGRyZW4ucHVzaCh7XG4gICAgICAgIHR5cGU6ICdlbGVtZW50JyxcbiAgICAgICAgdGFnTmFtZTogJ3NwYW4nLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7Y2xhc3NOYW1lOiBbbmFtZV19LFxuICAgICAgICBjaGlsZHJlbjogcmVzdWx0c1xuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC5jaGlsZHJlbi5wdXNoKC4uLnJlc3VsdHMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBvcGVuTm9kZShuYW1lKSB7XG4gICAgLy8gRmlyc3QgXHUyMDFDY2xhc3NcdTIwMUQgZ2V0cyB0aGUgcHJlZml4LiBSZXN0IGdldHMgYSByZXBlYXRlZCB1bmRlcnNjb3JlIHN1ZmZpeC5cbiAgICAvLyBTZWU6IDxodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2NvbW1pdC81MTgwNmFhPlxuICAgIC8vIFNlZTogPGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vbG93bGlnaHQvaXNzdWVzLzQzPlxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IG5hbWVcbiAgICAgIC5zcGxpdCgnLicpXG4gICAgICAubWFwKChkLCBpKSA9PiAoaSA/IGQgKyAnXycucmVwZWF0KGkpIDogdGhpcy5vcHRpb25zLmNsYXNzUHJlZml4ICsgZCkpXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIC8qKiBAdHlwZSB7U3Bhbn0gKi9cbiAgICBjb25zdCBjaGlsZCA9IHtcbiAgICAgIHR5cGU6ICdlbGVtZW50JyxcbiAgICAgIHRhZ05hbWU6ICdzcGFuJyxcbiAgICAgIHByb3BlcnRpZXM6IHtjbGFzc05hbWV9LFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfVxuXG4gICAgY3VycmVudC5jaGlsZHJlbi5wdXNoKGNoaWxkKVxuICAgIHRoaXMuc3RhY2sucHVzaChjaGlsZClcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgY2xvc2VOb2RlKCkge1xuICAgIHRoaXMuc3RhY2sucG9wKClcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgZmluYWxpemUoKSB7fVxuXG4gIC8qKlxuICAgKi9cbiAgdG9IVE1MKCkge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb3dsaWdodCA9IHtcbiAgaGlnaGxpZ2h0LFxuICBoaWdobGlnaHRBdXRvLFxuICByZWdpc3Rlckxhbmd1YWdlLFxuICByZWdpc3RlcmVkLFxuICBsaXN0TGFuZ3VhZ2VzLFxuICByZWdpc3RlckFsaWFzXG59XG4iLCAiLy8gQHRzLWV4cGVjdC1lcnJvcjogdGhpcyByZWdpc3RlcnMgdHlwZXMgZm9yIHRoZSBsYW5ndWFnZSBmaWxlcy5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCdoaWdobGlnaHQuanMvdHlwZXMvaW5kZXguanMnKX0gRG9Ob3RUb2NoSXRSZWdpc3RlcnNMYW5ndWFnZUZpbGVzICovXG5cbmltcG9ydCBhcmR1aW5vIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2FyZHVpbm8nXG5pbXBvcnQgYmFzaCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9iYXNoJ1xuaW1wb3J0IGMgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvYydcbmltcG9ydCBjcHAgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvY3BwJ1xuaW1wb3J0IGNzaGFycCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9jc2hhcnAnXG5pbXBvcnQgY3NzIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2NzcydcbmltcG9ydCBkaWZmIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2RpZmYnXG5pbXBvcnQgZ28gZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvZ28nXG5pbXBvcnQgZ3JhcGhxbCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9ncmFwaHFsJ1xuaW1wb3J0IGluaSBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9pbmknXG5pbXBvcnQgamF2YSBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9qYXZhJ1xuaW1wb3J0IGphdmFzY3JpcHQgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvamF2YXNjcmlwdCdcbmltcG9ydCBqc29uIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2pzb24nXG5pbXBvcnQga290bGluIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2tvdGxpbidcbmltcG9ydCBsZXNzIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2xlc3MnXG5pbXBvcnQgbHVhIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL2x1YSdcbmltcG9ydCBtYWtlZmlsZSBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9tYWtlZmlsZSdcbmltcG9ydCBtYXJrZG93biBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9tYXJrZG93bidcbmltcG9ydCBvYmplY3RpdmVjIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL29iamVjdGl2ZWMnXG5pbXBvcnQgcGVybCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9wZXJsJ1xuaW1wb3J0IHBocCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9waHAnXG5pbXBvcnQgcGhwVGVtcGxhdGUgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvcGhwLXRlbXBsYXRlJ1xuaW1wb3J0IHBsYWludGV4dCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9wbGFpbnRleHQnXG5pbXBvcnQgcHl0aG9uIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3B5dGhvbidcbmltcG9ydCBweXRob25SZXBsIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3B5dGhvbi1yZXBsJ1xuaW1wb3J0IHIgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvcidcbmltcG9ydCBydWJ5IGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3J1YnknXG5pbXBvcnQgcnVzdCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9ydXN0J1xuaW1wb3J0IHNjc3MgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvc2NzcydcbmltcG9ydCBzaGVsbCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy9zaGVsbCdcbmltcG9ydCBzcWwgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvc3FsJ1xuaW1wb3J0IHN3aWZ0IGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3N3aWZ0J1xuaW1wb3J0IHR5cGVzY3JpcHQgZnJvbSAnaGlnaGxpZ2h0LmpzL2xpYi9sYW5ndWFnZXMvdHlwZXNjcmlwdCdcbmltcG9ydCB2Ym5ldCBmcm9tICdoaWdobGlnaHQuanMvbGliL2xhbmd1YWdlcy92Ym5ldCdcbmltcG9ydCB3YXNtIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3dhc20nXG5pbXBvcnQgeG1sIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3htbCdcbmltcG9ydCB5YW1sIGZyb20gJ2hpZ2hsaWdodC5qcy9saWIvbGFuZ3VhZ2VzL3lhbWwnXG5pbXBvcnQge2xvd2xpZ2h0fSBmcm9tICcuL2NvcmUuanMnXG5cbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2FyZHVpbm8nLCBhcmR1aW5vKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnYmFzaCcsIGJhc2gpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdjJywgYylcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2NwcCcsIGNwcClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2NzaGFycCcsIGNzaGFycClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2NzcycsIGNzcylcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2RpZmYnLCBkaWZmKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnZ28nLCBnbylcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2dyYXBocWwnLCBncmFwaHFsKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnaW5pJywgaW5pKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnamF2YScsIGphdmEpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdqYXZhc2NyaXB0JywgamF2YXNjcmlwdClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ2pzb24nLCBqc29uKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgna290bGluJywga290bGluKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnbGVzcycsIGxlc3MpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdsdWEnLCBsdWEpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdtYWtlZmlsZScsIG1ha2VmaWxlKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnbWFya2Rvd24nLCBtYXJrZG93bilcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ29iamVjdGl2ZWMnLCBvYmplY3RpdmVjKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgncGVybCcsIHBlcmwpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdwaHAnLCBwaHApXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdwaHAtdGVtcGxhdGUnLCBwaHBUZW1wbGF0ZSlcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3BsYWludGV4dCcsIHBsYWludGV4dClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3B5dGhvbicsIHB5dGhvbilcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3B5dGhvbi1yZXBsJywgcHl0aG9uUmVwbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3InLCByKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgncnVieScsIHJ1YnkpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCdydXN0JywgcnVzdClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3Njc3MnLCBzY3NzKVxubG93bGlnaHQucmVnaXN0ZXJMYW5ndWFnZSgnc2hlbGwnLCBzaGVsbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3NxbCcsIHNxbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3N3aWZ0Jywgc3dpZnQpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCd0eXBlc2NyaXB0JywgdHlwZXNjcmlwdClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3ZibmV0JywgdmJuZXQpXG5sb3dsaWdodC5yZWdpc3Rlckxhbmd1YWdlKCd3YXNtJywgd2FzbSlcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3htbCcsIHhtbClcbmxvd2xpZ2h0LnJlZ2lzdGVyTGFuZ3VhZ2UoJ3lhbWwnLCB5YW1sKVxuXG5leHBvcnQge2xvd2xpZ2h0fSBmcm9tICcuL2NvcmUuanMnXG4iLCAiLy8gQ2xhbXBzIGEgdmFsdWUgYmV0d2VlbiBhbiB1cHBlciBhbmQgbG93ZXIgYm91bmQuXG4vLyBXZSB1c2UgdGVybmFyeSBvcGVyYXRvcnMgYmVjYXVzZSBpdCBtYWtlcyB0aGUgbWluaWZpZWQgY29kZVxuLy8gMiB0aW1lcyBzaG9ydGVyIHRoZW4gYE1hdGgubWluKE1hdGgubWF4KGEsYiksYylgXG5leHBvcnQgY29uc3QgY2xhbXAgPSAobnVtYmVyOiBudW1iZXIsIG1pbiA9IDAsIG1heCA9IDEpOiBudW1iZXIgPT4ge1xuICByZXR1cm4gbnVtYmVyID4gbWF4ID8gbWF4IDogbnVtYmVyIDwgbWluID8gbWluIDogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IHJvdW5kID0gKG51bWJlcjogbnVtYmVyLCBkaWdpdHMgPSAwLCBiYXNlID0gTWF0aC5wb3coMTAsIGRpZ2l0cykpOiBudW1iZXIgPT4ge1xuICByZXR1cm4gTWF0aC5yb3VuZChiYXNlICogbnVtYmVyKSAvIGJhc2U7XG59O1xuIiwgImltcG9ydCB7IFJnYmFDb2xvciwgUmdiQ29sb3IsIEhzbGFDb2xvciwgSHNsQ29sb3IsIEhzdmFDb2xvciwgSHN2Q29sb3IgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4vbWF0aC5qcyc7XG5cbi8qKlxuICogVmFsaWQgQ1NTIDxhbmdsZT4gdW5pdHMuXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYW5nbGVcbiAqL1xuY29uc3QgYW5nbGVVbml0czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgZ3JhZDogMzYwIC8gNDAwLFxuICB0dXJuOiAzNjAsXG4gIHJhZDogMzYwIC8gKE1hdGguUEkgKiAyKVxufTtcblxuZXhwb3J0IGNvbnN0IGhleFRvSHN2YSA9IChoZXg6IHN0cmluZyk6IEhzdmFDb2xvciA9PiByZ2JhVG9Ic3ZhKGhleFRvUmdiYShoZXgpKTtcblxuZXhwb3J0IGNvbnN0IGhleFRvUmdiYSA9IChoZXg6IHN0cmluZyk6IFJnYmFDb2xvciA9PiB7XG4gIGlmIChoZXhbMF0gPT09ICcjJykgaGV4ID0gaGV4LnN1YnN0cmluZygxKTtcblxuICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQoaGV4WzBdICsgaGV4WzBdLCAxNiksXG4gICAgICBnOiBwYXJzZUludChoZXhbMV0gKyBoZXhbMV0sIDE2KSxcbiAgICAgIGI6IHBhcnNlSW50KGhleFsyXSArIGhleFsyXSwgMTYpLFxuICAgICAgYTogaGV4Lmxlbmd0aCA9PT0gNCA/IHJvdW5kKHBhcnNlSW50KGhleFszXSArIGhleFszXSwgMTYpIC8gMjU1LCAyKSA6IDFcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByOiBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNiksXG4gICAgZzogcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpLFxuICAgIGI6IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KSxcbiAgICBhOiBoZXgubGVuZ3RoID09PSA4ID8gcm91bmQocGFyc2VJbnQoaGV4LnN1YnN0cmluZyg2LCA4KSwgMTYpIC8gMjU1LCAyKSA6IDFcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUh1ZSA9ICh2YWx1ZTogc3RyaW5nLCB1bml0ID0gJ2RlZycpOiBudW1iZXIgPT4ge1xuICByZXR1cm4gTnVtYmVyKHZhbHVlKSAqIChhbmdsZVVuaXRzW3VuaXRdIHx8IDEpO1xufTtcblxuZXhwb3J0IGNvbnN0IGhzbGFTdHJpbmdUb0hzdmEgPSAoaHNsU3RyaW5nOiBzdHJpbmcpOiBIc3ZhQ29sb3IgPT4ge1xuICBjb25zdCBtYXRjaGVyID1cbiAgICAvaHNsYT9cXCg/XFxzKigtP1xcZCpcXC4/XFxkKykoZGVnfHJhZHxncmFkfHR1cm4pP1ssXFxzXSsoLT9cXGQqXFwuP1xcZCspJT9bLFxcc10rKC0/XFxkKlxcLj9cXGQrKSU/LD9cXHMqWy9cXHNdKigtP1xcZCpcXC4/XFxkKyk/KCUpP1xccypcXCk/L2k7XG4gIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5leGVjKGhzbFN0cmluZyk7XG5cbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHsgaDogMCwgczogMCwgdjogMCwgYTogMSB9O1xuXG4gIHJldHVybiBoc2xhVG9Ic3ZhKHtcbiAgICBoOiBwYXJzZUh1ZShtYXRjaFsxXSwgbWF0Y2hbMl0pLFxuICAgIHM6IE51bWJlcihtYXRjaFszXSksXG4gICAgbDogTnVtYmVyKG1hdGNoWzRdKSxcbiAgICBhOiBtYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IE51bWJlcihtYXRjaFs1XSkgLyAobWF0Y2hbNl0gPyAxMDAgOiAxKVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoc2xTdHJpbmdUb0hzdmEgPSBoc2xhU3RyaW5nVG9Ic3ZhO1xuXG5leHBvcnQgY29uc3QgaHNsYVRvSHN2YSA9ICh7IGgsIHMsIGwsIGEgfTogSHNsYUNvbG9yKTogSHN2YUNvbG9yID0+IHtcbiAgcyAqPSAobCA8IDUwID8gbCA6IDEwMCAtIGwpIC8gMTAwO1xuXG4gIHJldHVybiB7XG4gICAgaDogaCxcbiAgICBzOiBzID4gMCA/ICgoMiAqIHMpIC8gKGwgKyBzKSkgKiAxMDAgOiAwLFxuICAgIHY6IGwgKyBzLFxuICAgIGFcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZhVG9IZXggPSAoaHN2YTogSHN2YUNvbG9yKTogc3RyaW5nID0+IHJnYmFUb0hleChoc3ZhVG9SZ2JhKGhzdmEpKTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzbGEgPSAoeyBoLCBzLCB2LCBhIH06IEhzdmFDb2xvcik6IEhzbGFDb2xvciA9PiB7XG4gIGNvbnN0IGhoID0gKCgyMDAgLSBzKSAqIHYpIC8gMTAwO1xuXG4gIHJldHVybiB7XG4gICAgaDogcm91bmQoaCksXG4gICAgczogcm91bmQoaGggPiAwICYmIGhoIDwgMjAwID8gKChzICogdikgLyAxMDAgLyAoaGggPD0gMTAwID8gaGggOiAyMDAgLSBoaCkpICogMTAwIDogMCksXG4gICAgbDogcm91bmQoaGggLyAyKSxcbiAgICBhOiByb3VuZChhLCAyKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzdlN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IGgsIHMsIHYgfSA9IHJvdW5kSHN2YShoc3ZhKTtcbiAgcmV0dXJuIGBoc3YoJHtofSwgJHtzfSUsICR7dn0lKWA7XG59O1xuXG5leHBvcnQgY29uc3QgaHN2YVRvSHN2YVN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IGgsIHMsIHYsIGEgfSA9IHJvdW5kSHN2YShoc3ZhKTtcbiAgcmV0dXJuIGBoc3ZhKCR7aH0sICR7c30lLCAke3Z9JSwgJHthfSlgO1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzbFN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IGgsIHMsIGwgfSA9IGhzdmFUb0hzbGEoaHN2YSk7XG4gIHJldHVybiBgaHNsKCR7aH0sICR7c30lLCAke2x9JSlgO1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzbGFTdHJpbmcgPSAoaHN2YTogSHN2YUNvbG9yKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeyBoLCBzLCBsLCBhIH0gPSBoc3ZhVG9Ic2xhKGhzdmEpO1xuICByZXR1cm4gYGhzbGEoJHtofSwgJHtzfSUsICR7bH0lLCAke2F9KWA7XG59O1xuXG5leHBvcnQgY29uc3QgaHN2YVRvUmdiYSA9ICh7IGgsIHMsIHYsIGEgfTogSHN2YUNvbG9yKTogUmdiYUNvbG9yID0+IHtcbiAgaCA9IChoIC8gMzYwKSAqIDY7XG4gIHMgPSBzIC8gMTAwO1xuICB2ID0gdiAvIDEwMDtcblxuICBjb25zdCBoaCA9IE1hdGguZmxvb3IoaCksXG4gICAgYiA9IHYgKiAoMSAtIHMpLFxuICAgIGMgPSB2ICogKDEgLSAoaCAtIGhoKSAqIHMpLFxuICAgIGQgPSB2ICogKDEgLSAoMSAtIGggKyBoaCkgKiBzKSxcbiAgICBtb2R1bGUgPSBoaCAlIDY7XG5cbiAgcmV0dXJuIHtcbiAgICByOiByb3VuZChbdiwgYywgYiwgYiwgZCwgdl1bbW9kdWxlXSAqIDI1NSksXG4gICAgZzogcm91bmQoW2QsIHYsIHYsIGMsIGIsIGJdW21vZHVsZV0gKiAyNTUpLFxuICAgIGI6IHJvdW5kKFtiLCBiLCBkLCB2LCB2LCBjXVttb2R1bGVdICogMjU1KSxcbiAgICBhOiByb3VuZChhLCAyKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb1JnYlN0cmluZyA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHIsIGcsIGIgfSA9IGhzdmFUb1JnYmEoaHN2YSk7XG4gIHJldHVybiBgcmdiKCR7cn0sICR7Z30sICR7Yn0pYDtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZhVG9SZ2JhU3RyaW5nID0gKGhzdmE6IEhzdmFDb2xvcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHsgciwgZywgYiwgYSB9ID0gaHN2YVRvUmdiYShoc3ZhKTtcbiAgcmV0dXJuIGByZ2JhKCR7cn0sICR7Z30sICR7Yn0sICR7YX0pYDtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZhU3RyaW5nVG9Ic3ZhID0gKGhzdlN0cmluZzogc3RyaW5nKTogSHN2YUNvbG9yID0+IHtcbiAgY29uc3QgbWF0Y2hlciA9XG4gICAgL2hzdmE/XFwoP1xccyooLT9cXGQqXFwuP1xcZCspKGRlZ3xyYWR8Z3JhZHx0dXJuKT9bLFxcc10rKC0/XFxkKlxcLj9cXGQrKSU/WyxcXHNdKygtP1xcZCpcXC4/XFxkKyklPyw/XFxzKlsvXFxzXSooLT9cXGQqXFwuP1xcZCspPyglKT9cXHMqXFwpPy9pO1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIuZXhlYyhoc3ZTdHJpbmcpO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiB7IGg6IDAsIHM6IDAsIHY6IDAsIGE6IDEgfTtcblxuICByZXR1cm4gcm91bmRIc3ZhKHtcbiAgICBoOiBwYXJzZUh1ZShtYXRjaFsxXSwgbWF0Y2hbMl0pLFxuICAgIHM6IE51bWJlcihtYXRjaFszXSksXG4gICAgdjogTnVtYmVyKG1hdGNoWzRdKSxcbiAgICBhOiBtYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IE51bWJlcihtYXRjaFs1XSkgLyAobWF0Y2hbNl0gPyAxMDAgOiAxKVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoc3ZTdHJpbmdUb0hzdmEgPSBoc3ZhU3RyaW5nVG9Ic3ZhO1xuXG5leHBvcnQgY29uc3QgcmdiYVN0cmluZ1RvSHN2YSA9IChyZ2JhU3RyaW5nOiBzdHJpbmcpOiBIc3ZhQ29sb3IgPT4ge1xuICBjb25zdCBtYXRjaGVyID1cbiAgICAvcmdiYT9cXCg/XFxzKigtP1xcZCpcXC4/XFxkKykoJSk/WyxcXHNdKygtP1xcZCpcXC4/XFxkKykoJSk/WyxcXHNdKygtP1xcZCpcXC4/XFxkKykoJSk/LD9cXHMqWy9cXHNdKigtP1xcZCpcXC4/XFxkKyk/KCUpP1xccypcXCk/L2k7XG4gIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5leGVjKHJnYmFTdHJpbmcpO1xuXG4gIGlmICghbWF0Y2gpIHJldHVybiB7IGg6IDAsIHM6IDAsIHY6IDAsIGE6IDEgfTtcblxuICByZXR1cm4gcmdiYVRvSHN2YSh7XG4gICAgcjogTnVtYmVyKG1hdGNoWzFdKSAvIChtYXRjaFsyXSA/IDEwMCAvIDI1NSA6IDEpLFxuICAgIGc6IE51bWJlcihtYXRjaFszXSkgLyAobWF0Y2hbNF0gPyAxMDAgLyAyNTUgOiAxKSxcbiAgICBiOiBOdW1iZXIobWF0Y2hbNV0pIC8gKG1hdGNoWzZdID8gMTAwIC8gMjU1IDogMSksXG4gICAgYTogbWF0Y2hbN10gPT09IHVuZGVmaW5lZCA/IDEgOiBOdW1iZXIobWF0Y2hbN10pIC8gKG1hdGNoWzhdID8gMTAwIDogMSlcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmdiU3RyaW5nVG9Ic3ZhID0gcmdiYVN0cmluZ1RvSHN2YTtcblxuY29uc3QgZm9ybWF0ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGhleCA9IG51bWJlci50b1N0cmluZygxNik7XG4gIHJldHVybiBoZXgubGVuZ3RoIDwgMiA/ICcwJyArIGhleCA6IGhleDtcbn07XG5cbmV4cG9ydCBjb25zdCByZ2JhVG9IZXggPSAoeyByLCBnLCBiLCBhIH06IFJnYmFDb2xvcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGFscGhhSGV4ID0gYSA8IDEgPyBmb3JtYXQocm91bmQoYSAqIDI1NSkpIDogJyc7XG4gIHJldHVybiAnIycgKyBmb3JtYXQocikgKyBmb3JtYXQoZykgKyBmb3JtYXQoYikgKyBhbHBoYUhleDtcbn07XG5cbmV4cG9ydCBjb25zdCByZ2JhVG9Ic3ZhID0gKHsgciwgZywgYiwgYSB9OiBSZ2JhQ29sb3IpOiBIc3ZhQ29sb3IgPT4ge1xuICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgY29uc3QgZGVsdGEgPSBtYXggLSBNYXRoLm1pbihyLCBnLCBiKTtcblxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgY29uc3QgaGggPSBkZWx0YVxuICAgID8gbWF4ID09PSByXG4gICAgICA/IChnIC0gYikgLyBkZWx0YVxuICAgICAgOiBtYXggPT09IGdcbiAgICAgICAgPyAyICsgKGIgLSByKSAvIGRlbHRhXG4gICAgICAgIDogNCArIChyIC0gZykgLyBkZWx0YVxuICAgIDogMDtcblxuICByZXR1cm4ge1xuICAgIGg6IHJvdW5kKDYwICogKGhoIDwgMCA/IGhoICsgNiA6IGhoKSksXG4gICAgczogcm91bmQobWF4ID8gKGRlbHRhIC8gbWF4KSAqIDEwMCA6IDApLFxuICAgIHY6IHJvdW5kKChtYXggLyAyNTUpICogMTAwKSxcbiAgICBhXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3Qgcm91bmRIc3ZhID0gKGhzdmE6IEhzdmFDb2xvcik6IEhzdmFDb2xvciA9PiAoe1xuICBoOiByb3VuZChoc3ZhLmgpLFxuICBzOiByb3VuZChoc3ZhLnMpLFxuICB2OiByb3VuZChoc3ZhLnYpLFxuICBhOiByb3VuZChoc3ZhLmEsIDIpXG59KTtcblxuZXhwb3J0IGNvbnN0IHJnYmFUb1JnYiA9ICh7IHIsIGcsIGIgfTogUmdiYUNvbG9yKTogUmdiQ29sb3IgPT4gKHsgciwgZywgYiB9KTtcblxuZXhwb3J0IGNvbnN0IGhzbGFUb0hzbCA9ICh7IGgsIHMsIGwgfTogSHNsYUNvbG9yKTogSHNsQ29sb3IgPT4gKHsgaCwgcywgbCB9KTtcblxuZXhwb3J0IGNvbnN0IGhzdmFUb0hzdiA9IChoc3ZhOiBIc3ZhQ29sb3IpOiBIc3ZDb2xvciA9PiB7XG4gIGNvbnN0IHsgaCwgcywgdiB9ID0gcm91bmRIc3ZhKGhzdmEpO1xuICByZXR1cm4geyBoLCBzLCB2IH07XG59O1xuIiwgImltcG9ydCB7IGhleFRvUmdiYSB9IGZyb20gJy4vY29udmVydC5qcyc7XG5pbXBvcnQgdHlwZSB7IE9iamVjdENvbG9yIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb2xvck9iamVjdHMgPSAoZmlyc3Q6IE9iamVjdENvbG9yLCBzZWNvbmQ6IE9iamVjdENvbG9yKTogYm9vbGVhbiA9PiB7XG4gIGlmIChmaXJzdCA9PT0gc2Vjb25kKSByZXR1cm4gdHJ1ZTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gZmlyc3QpIHtcbiAgICAvLyBUaGUgZm9sbG93aW5nIGFsbG93cyBmb3IgYSB0eXBlLXNhZmUgY2FsbGluZyBvZiB0aGlzIGZ1bmN0aW9uIChmaXJzdCAmIHNlY29uZCBoYXZlIHRvIGJlIEhTTCwgSFNWLCBvciBSR0IpXG4gICAgLy8gd2l0aCB0eXBlLXVuc2FmZSBpdGVyYXRpbmcgb3ZlciBvYmplY3Qga2V5cy4gVFMgZG9lcyBub3QgYWxsb3cgdGhpcyB3aXRob3V0IGFuIGluZGV4IChgW2tleTogc3RyaW5nXTogbnVtYmVyYClcbiAgICAvLyBvbiBhbiBvYmplY3QgdG8gZGVmaW5lIGhvdyBpdGVyYXRpb24gaXMgbm9ybWFsbHkgZG9uZS4gVG8gZW5zdXJlIGV4dHJhIGtleXMgYXJlIG5vdCBhbGxvd2VkIG9uIG91ciB0eXBlcyxcbiAgICAvLyB3ZSBtdXN0IGNhc3Qgb3VyIG9iamVjdCB0byB1bmtub3duIChhcyBSR0IgZGVtYW5kcyBgcmAgYmUgYSBrZXksIHdoaWxlIGBSZWNvcmQ8c3RyaW5nLCB4PmAgZG9lcyBub3QgY2FyZSBpZlxuICAgIC8vIHRoZXJlIGlzIG9yIG5vdCksIGFuZCB0aGVuIGFzIGEgdHlwZSBUUyBjYW4gaXRlcmF0ZSBvdmVyLlxuICAgIGlmIChcbiAgICAgIChmaXJzdCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3Byb3BdICE9PVxuICAgICAgKHNlY29uZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW3Byb3BdXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb2xvclN0cmluZyA9IChmaXJzdDogc3RyaW5nLCBzZWNvbmQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZmlyc3QucmVwbGFjZSgvXFxzL2csICcnKSA9PT0gc2Vjb25kLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZXF1YWxIZXggPSAoZmlyc3Q6IHN0cmluZywgc2Vjb25kOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGZpcnN0LnRvTG93ZXJDYXNlKCkgPT09IHNlY29uZC50b0xvd2VyQ2FzZSgpKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBUbyBjb21wYXJlIGNvbG9ycyBsaWtlIGAjRkZGYCBhbmQgYGZmZmZmZmAgd2UgY29udmVydCB0aGVtIGludG8gUkdCIG9iamVjdHNcbiAgcmV0dXJuIGVxdWFsQ29sb3JPYmplY3RzKGhleFRvUmdiYShmaXJzdCksIGhleFRvUmdiYShzZWNvbmQpKTtcbn07XG4iLCAiY29uc3QgY2FjaGU6IFJlY29yZDxzdHJpbmcsIEhUTUxUZW1wbGF0ZUVsZW1lbnQ+ID0ge307XG5cbmV4cG9ydCBjb25zdCB0cGwgPSAoaHRtbDogc3RyaW5nKTogSFRNTFRlbXBsYXRlRWxlbWVudCA9PiB7XG4gIGxldCB0ZW1wbGF0ZSA9IGNhY2hlW2h0bWxdO1xuICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XG4gICAgY2FjaGVbaHRtbF0gPSB0ZW1wbGF0ZTtcbiAgfVxuICByZXR1cm4gdGVtcGxhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgZmlyZSA9ICh0YXJnZXQ6IEhUTUxFbGVtZW50LCB0eXBlOiBzdHJpbmcsIGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkID0+IHtcbiAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoXG4gICAgbmV3IEN1c3RvbUV2ZW50KHR5cGUsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBkZXRhaWxcbiAgICB9KVxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEhzdmFDb2xvciB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGZpcmUsIHRwbCB9IGZyb20gJy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gJy4uL3V0aWxzL21hdGguanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9mZnNldCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5sZXQgaGFzVG91Y2hlZCA9IGZhbHNlO1xuXG4vLyBDaGVjayBpZiBhbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IHRvdWNoXG5jb25zdCBpc1RvdWNoID0gKGU6IEV2ZW50KTogZSBpcyBUb3VjaEV2ZW50ID0+ICd0b3VjaGVzJyBpbiBlO1xuXG4vLyBQcmV2ZW50IG1vYmlsZSBicm93c2VycyBmcm9tIGhhbmRsaW5nIG1vdXNlIGV2ZW50cyAoY29uZmxpY3Rpbmcgd2l0aCB0b3VjaCBvbmVzKS5cbi8vIElmIHdlIGRldGVjdGVkIGEgdG91Y2ggaW50ZXJhY3Rpb24gYmVmb3JlLCB3ZSBwcmVmZXIgcmVhY3RpbmcgdG8gdG91Y2ggZXZlbnRzIG9ubHkuXG5jb25zdCBpc1ZhbGlkID0gKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4gPT4ge1xuICBpZiAoaGFzVG91Y2hlZCAmJiAhaXNUb3VjaChldmVudCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFoYXNUb3VjaGVkKSBoYXNUb3VjaGVkID0gaXNUb3VjaChldmVudCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgcG9pbnRlck1vdmUgPSAodGFyZ2V0OiBTbGlkZXIsIGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICBjb25zdCBwb2ludGVyID0gaXNUb3VjaChldmVudCkgPyBldmVudC50b3VjaGVzWzBdIDogKGV2ZW50IGFzIE1vdXNlRXZlbnQpO1xuICBjb25zdCByZWN0ID0gdGFyZ2V0LmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGZpcmUoXG4gICAgdGFyZ2V0LmVsLFxuICAgICdtb3ZlJyxcbiAgICB0YXJnZXQuZ2V0TW92ZSh7XG4gICAgICB4OiBjbGFtcCgocG9pbnRlci5wYWdlWCAtIChyZWN0LmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQpKSAvIHJlY3Qud2lkdGgpLFxuICAgICAgeTogY2xhbXAoKHBvaW50ZXIucGFnZVkgLSAocmVjdC50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQpKSAvIHJlY3QuaGVpZ2h0KVxuICAgIH0pXG4gICk7XG59O1xuXG5jb25zdCBrZXlNb3ZlID0gKHRhcmdldDogU2xpZGVyLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAvLyBXZSB1c2UgYGtleUNvZGVgIGluc3RlYWQgb2YgYGtleWAgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsaWJyYXJ5LlxuICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgLy8gSWdub3JlIGFsbCBrZXlzIGV4Y2VwdCBhcnJvdyBvbmVzLCBQYWdlIFVwLCBQYWdlIERvd24sIEhvbWUgYW5kIEVuZC5cbiAgaWYgKGtleUNvZGUgPiA0MCB8fCAodGFyZ2V0Lnh5ICYmIGtleUNvZGUgPCAzNykgfHwga2V5Q29kZSA8IDMzKSByZXR1cm47XG4gIC8vIERvIG5vdCBzY3JvbGwgcGFnZSBieSBrZXlzIHdoZW4gY29sb3IgcGlja2VyIGVsZW1lbnQgaGFzIGZvY3VzLlxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBTZW5kIHJlbGF0aXZlIG9mZnNldCB0byB0aGUgcGFyZW50IGNvbXBvbmVudC5cbiAgZmlyZShcbiAgICB0YXJnZXQuZWwsXG4gICAgJ21vdmUnLFxuICAgIHRhcmdldC5nZXRNb3ZlKFxuICAgICAge1xuICAgICAgICB4OlxuICAgICAgICAgIGtleUNvZGUgPT09IDM5IC8vIEFycm93IFJpZ2h0XG4gICAgICAgICAgICA/IDAuMDFcbiAgICAgICAgICAgIDoga2V5Q29kZSA9PT0gMzcgLy8gQXJyb3cgTGVmdFxuICAgICAgICAgICAgPyAtMC4wMVxuICAgICAgICAgICAgOiBrZXlDb2RlID09PSAzNCAvLyBQYWdlIERvd25cbiAgICAgICAgICAgID8gMC4wNVxuICAgICAgICAgICAgOiBrZXlDb2RlID09PSAzMyAvLyBQYWdlIFVwXG4gICAgICAgICAgICA/IC0wLjA1XG4gICAgICAgICAgICA6IGtleUNvZGUgPT09IDM1IC8vIEVuZFxuICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICA6IGtleUNvZGUgPT09IDM2IC8vIEhvbWVcbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogMCxcbiAgICAgICAgeTpcbiAgICAgICAgICBrZXlDb2RlID09PSA0MCAvLyBBcnJvdyBkb3duXG4gICAgICAgICAgICA/IDAuMDFcbiAgICAgICAgICAgIDoga2V5Q29kZSA9PT0gMzggLy8gQXJyb3cgVXBcbiAgICAgICAgICAgID8gLTAuMDFcbiAgICAgICAgICAgIDogMFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApXG4gICk7XG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2xpZGVyIHtcbiAgZGVjbGFyZSBub2RlczogSFRNTEVsZW1lbnRbXTtcblxuICBkZWNsYXJlIGVsOiBIVE1MRWxlbWVudDtcblxuICBkZWNsYXJlIHh5OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IFNoYWRvd1Jvb3QsIHBhcnQ6IHN0cmluZywgYXJpYTogc3RyaW5nLCB4eTogYm9vbGVhbikge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdHBsKFxuICAgICAgYDxkaXYgcm9sZT1cInNsaWRlclwiIHRhYmluZGV4PVwiMFwiIHBhcnQ9XCIke3BhcnR9XCIgJHthcmlhfT48ZGl2IHBhcnQ9XCIke3BhcnR9LXBvaW50ZXJcIj48L2Rpdj48L2Rpdj5gXG4gICAgKTtcbiAgICByb290LmFwcGVuZENoaWxkKHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgIGNvbnN0IGVsID0gcm9vdC5xdWVyeVNlbGVjdG9yKGBbcGFydD0ke3BhcnR9XWApIGFzIEhUTUxFbGVtZW50O1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcyk7XG4gICAgdGhpcy5lbCA9IGVsO1xuXG4gICAgdGhpcy54eSA9IHh5O1xuICAgIHRoaXMubm9kZXMgPSBbZWwuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCwgZWxdO1xuICB9XG5cbiAgc2V0IGRyYWdnaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgY29uc3QgdG9nZ2xlRXZlbnQgPSBzdGF0ZSA/IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgOiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyO1xuICAgIHRvZ2dsZUV2ZW50KGhhc1RvdWNoZWQgPyAndG91Y2htb3ZlJyA6ICdtb3VzZW1vdmUnLCB0aGlzKTtcbiAgICB0b2dnbGVFdmVudChoYXNUb3VjaGVkID8gJ3RvdWNoZW5kJyA6ICdtb3VzZXVwJywgdGhpcyk7XG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gZXZlbnQuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duIGZvciBsZWZ0IGJ1dHRvbiBhY3RpdmF0aW9uXG4gICAgICAgIGlmICghaXNWYWxpZChldmVudCkgfHwgKCFoYXNUb3VjaGVkICYmIChldmVudCBhcyBNb3VzZUV2ZW50KS5idXR0b24gIT0gMCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5lbC5mb2N1cygpO1xuICAgICAgICBwb2ludGVyTW92ZSh0aGlzLCBldmVudCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBwb2ludGVyTW92ZSh0aGlzLCBldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgICAga2V5TW92ZSh0aGlzLCBldmVudCBhcyBLZXlib2FyZEV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgYWJzdHJhY3QgZ2V0TW92ZShvZmZzZXQ6IE9mZnNldCwga2V5PzogYm9vbGVhbik6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cbiAgYWJzdHJhY3QgdXBkYXRlKGhzdmE6IEhzdmFDb2xvcik6IHZvaWQ7XG5cbiAgc3R5bGUoc3R5bGVzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIHN0eWxlcy5mb3JFYWNoKChzdHlsZSwgaSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIGluIHN0eWxlKSB7XG4gICAgICAgIHRoaXMubm9kZXNbaV0uc3R5bGUuc2V0UHJvcGVydHkocCwgc3R5bGVbcF0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgU2xpZGVyLCBPZmZzZXQgfSBmcm9tICcuL3NsaWRlci5qcyc7XG5pbXBvcnQgeyBoc3ZhVG9Ic2xTdHJpbmcgfSBmcm9tICcuLi91dGlscy9jb252ZXJ0LmpzJztcbmltcG9ydCB7IGNsYW1wLCByb3VuZCB9IGZyb20gJy4uL3V0aWxzL21hdGguanMnO1xuaW1wb3J0IHR5cGUgeyBIc3ZhQ29sb3IgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBIdWUgZXh0ZW5kcyBTbGlkZXIge1xuICBkZWNsYXJlIGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBTaGFkb3dSb290KSB7XG4gICAgc3VwZXIocm9vdCwgJ2h1ZScsICdhcmlhLWxhYmVsPVwiSHVlXCIgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMzYwXCInLCBmYWxzZSk7XG4gIH1cblxuICB1cGRhdGUoeyBoIH06IEhzdmFDb2xvcik6IHZvaWQge1xuICAgIHRoaXMuaCA9IGg7XG4gICAgdGhpcy5zdHlsZShbXG4gICAgICB7XG4gICAgICAgIGxlZnQ6IGAkeyhoIC8gMzYwKSAqIDEwMH0lYCxcbiAgICAgICAgY29sb3I6IGhzdmFUb0hzbFN0cmluZyh7IGgsIHM6IDEwMCwgdjogMTAwLCBhOiAxIH0pXG4gICAgICB9XG4gICAgXSk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCBgJHtyb3VuZChoKX1gKTtcbiAgfVxuXG4gIGdldE1vdmUob2Zmc2V0OiBPZmZzZXQsIGtleT86IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcbiAgICAvLyBIdWUgbWVhc3VyZWQgaW4gZGVncmVlcyBvZiB0aGUgY29sb3IgY2lyY2xlIHJhbmdpbmcgZnJvbSAwIHRvIDM2MFxuICAgIHJldHVybiB7IGg6IGtleSA/IGNsYW1wKHRoaXMuaCArIG9mZnNldC54ICogMzYwLCAwLCAzNjApIDogMzYwICogb2Zmc2V0LnggfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFNsaWRlciwgT2Zmc2V0IH0gZnJvbSAnLi9zbGlkZXIuanMnO1xuaW1wb3J0IHsgaHN2YVRvSHNsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvY29udmVydC5qcyc7XG5pbXBvcnQgeyBjbGFtcCwgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJztcbmltcG9ydCB0eXBlIHsgSHN2YUNvbG9yIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgU2F0dXJhdGlvbiBleHRlbmRzIFNsaWRlciB7XG4gIGRlY2xhcmUgaHN2YTogSHN2YUNvbG9yO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICBzdXBlcihyb290LCAnc2F0dXJhdGlvbicsICdhcmlhLWxhYmVsPVwiQ29sb3JcIicsIHRydWUpO1xuICB9XG5cbiAgdXBkYXRlKGhzdmE6IEhzdmFDb2xvcik6IHZvaWQge1xuICAgIHRoaXMuaHN2YSA9IGhzdmE7XG4gICAgdGhpcy5zdHlsZShbXG4gICAgICB7XG4gICAgICAgIHRvcDogYCR7MTAwIC0gaHN2YS52fSVgLFxuICAgICAgICBsZWZ0OiBgJHtoc3ZhLnN9JWAsXG4gICAgICAgIGNvbG9yOiBoc3ZhVG9Ic2xTdHJpbmcoaHN2YSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogaHN2YVRvSHNsU3RyaW5nKHsgaDogaHN2YS5oLCBzOiAxMDAsIHY6IDEwMCwgYTogMSB9KVxuICAgICAgfVxuICAgIF0pO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFxuICAgICAgJ2FyaWEtdmFsdWV0ZXh0JyxcbiAgICAgIGBTYXR1cmF0aW9uICR7cm91bmQoaHN2YS5zKX0lLCBCcmlnaHRuZXNzICR7cm91bmQoaHN2YS52KX0lYFxuICAgICk7XG4gIH1cblxuICBnZXRNb3ZlKG9mZnNldDogT2Zmc2V0LCBrZXk/OiBib29sZWFuKTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB7XG4gICAgLy8gU2F0dXJhdGlvbiBhbmQgYnJpZ2h0bmVzcyBhbHdheXMgZml0IGludG8gWzAsIDEwMF0gcmFuZ2VcbiAgICByZXR1cm4ge1xuICAgICAgczoga2V5ID8gY2xhbXAodGhpcy5oc3ZhLnMgKyBvZmZzZXQueCAqIDEwMCwgMCwgMTAwKSA6IG9mZnNldC54ICogMTAwLFxuICAgICAgdjoga2V5ID8gY2xhbXAodGhpcy5oc3ZhLnYgLSBvZmZzZXQueSAqIDEwMCwgMCwgMTAwKSA6IE1hdGgucm91bmQoMTAwIC0gb2Zmc2V0LnkgKiAxMDApXG4gICAgfTtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGA6aG9zdHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjIwMHB4O2hlaWdodDoyMDBweDt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH06aG9zdChbaGlkZGVuXSl7ZGlzcGxheTpub25lIWltcG9ydGFudH1bcm9sZT1zbGlkZXJde3Bvc2l0aW9uOnJlbGF0aXZlO3RvdWNoLWFjdGlvbjpub25lO3VzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO291dGxpbmU6MH1bcm9sZT1zbGlkZXJdOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgOHB4IDhweH1bcGFydCQ9cG9pbnRlcl17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2Rpc3BsYXk6ZmxleDtwbGFjZS1jb250ZW50OmNlbnRlciBjZW50ZXI7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MnB4IHNvbGlkICNmZmY7Ym9yZGVyLXJhZGl1czo1MCU7Ym94LXNoYWRvdzowIDJweCA0cHggcmdiYSgwLDAsMCwuMil9W3BhcnQkPXBvaW50ZXJdOjphZnRlcntjb250ZW50OlwiXCI7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9W3JvbGU9c2xpZGVyXTpmb2N1cyBbcGFydCQ9cG9pbnRlcl17dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDEuMSl9YDtcbiIsICJleHBvcnQgZGVmYXVsdCBgW3BhcnQ9aHVlXXtmbGV4OjAgMCAyNHB4O2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJlZCAwLCNmZjAgMTclLCMwZjAgMzMlLCMwZmYgNTAlLCMwMGYgNjclLCNmMGYgODMlLHJlZCAxMDAlKX1bcGFydD1odWUtcG9pbnRlcl17dG9wOjUwJTt6LWluZGV4OjJ9YDtcbiIsICJleHBvcnQgZGVmYXVsdCBgW3BhcnQ9c2F0dXJhdGlvbl17ZmxleC1ncm93OjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MTJweCBzb2xpZCAjMDAwO2JvcmRlci1yYWRpdXM6OHB4IDhweCAwIDA7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gdG9wLCMwMDAsdHJhbnNwYXJlbnQpLGxpbmVhci1ncmFkaWVudCh0byByaWdodCwjZmZmLHJnYmEoMjU1LDI1NSwyNTUsMCkpO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4IHJnYmEoMCwwLDAsLjA1KX1bcGFydD1zYXR1cmF0aW9uLXBvaW50ZXJde3otaW5kZXg6M31gO1xuIiwgImltcG9ydCB7IGVxdWFsQ29sb3JPYmplY3RzIH0gZnJvbSAnLi4vdXRpbHMvY29tcGFyZS5qcyc7XG5pbXBvcnQgeyBmaXJlLCB0cGwgfSBmcm9tICcuLi91dGlscy9kb20uanMnO1xuaW1wb3J0IHR5cGUgeyBBbnlDb2xvciwgQ29sb3JNb2RlbCwgSHN2YUNvbG9yIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSHVlIH0gZnJvbSAnLi9odWUuanMnO1xuaW1wb3J0IHsgU2F0dXJhdGlvbiB9IGZyb20gJy4vc2F0dXJhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IFNsaWRlciB9IGZyb20gJy4vc2xpZGVyLmpzJztcbmltcG9ydCBjc3MgZnJvbSAnLi4vc3R5bGVzL2NvbG9yLXBpY2tlci5qcyc7XG5pbXBvcnQgaHVlQ3NzIGZyb20gJy4uL3N0eWxlcy9odWUuanMnO1xuaW1wb3J0IHNhdHVyYXRpb25Dc3MgZnJvbSAnLi4vc3R5bGVzL3NhdHVyYXRpb24uanMnO1xuXG5jb25zdCAkaXNTYW1lID0gU3ltYm9sKCdzYW1lJyk7XG5jb25zdCAkY29sb3IgPSBTeW1ib2woJ2NvbG9yJyk7XG5jb25zdCAkaHN2YSA9IFN5bWJvbCgnaHN2YScpO1xuY29uc3QgJHVwZGF0ZSA9IFN5bWJvbCgndXBkYXRlJyk7XG5jb25zdCAkcGFydHMgPSBTeW1ib2woJ3BhcnRzJyk7XG5cbmV4cG9ydCBjb25zdCAkY3NzID0gU3ltYm9sKCdjc3MnKTtcbmV4cG9ydCBjb25zdCAkc2xpZGVycyA9IFN5bWJvbCgnc2xpZGVycycpO1xuXG5leHBvcnQgdHlwZSBTbGlkZXJzID0gQXJyYXk8bmV3IChyb290OiBTaGFkb3dSb290KSA9PiBTbGlkZXI+O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sb3JQaWNrZXI8QyBleHRlbmRzIEFueUNvbG9yPiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2NvbG9yJ107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IFskY3NzXSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtjc3MsIGh1ZUNzcywgc2F0dXJhdGlvbkNzc107XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IFskc2xpZGVyc10oKTogU2xpZGVycyB7XG4gICAgcmV0dXJuIFtTYXR1cmF0aW9uLCBIdWVdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjb2xvck1vZGVsKCk6IENvbG9yTW9kZWw8Qz47XG5cbiAgcHJpdmF0ZSBkZWNsYXJlIFskaHN2YV06IEhzdmFDb2xvcjtcblxuICBwcml2YXRlIGRlY2xhcmUgWyRjb2xvcl06IEM7XG5cbiAgcHJpdmF0ZSBkZWNsYXJlIFskcGFydHNdOiBTbGlkZXJbXTtcblxuICBnZXQgY29sb3IoKTogQyB7XG4gICAgcmV0dXJuIHRoaXNbJGNvbG9yXTtcbiAgfVxuXG4gIHNldCBjb2xvcihuZXdDb2xvcjogQykge1xuICAgIGlmICghdGhpc1skaXNTYW1lXShuZXdDb2xvcikpIHtcbiAgICAgIGNvbnN0IG5ld0hzdmEgPSB0aGlzLmNvbG9yTW9kZWwudG9Ic3ZhKG5ld0NvbG9yKTtcbiAgICAgIHRoaXNbJHVwZGF0ZV0obmV3SHN2YSk7XG4gICAgICB0aGlzWyRjb2xvcl0gPSBuZXdDb2xvcjtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdHBsKGA8c3R5bGU+JHt0aGlzWyRjc3NdLmpvaW4oJycpfTwvc3R5bGU+YCk7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgIHJvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcignbW92ZScsIHRoaXMpO1xuICAgIHRoaXNbJHBhcnRzXSA9IHRoaXNbJHNsaWRlcnNdLm1hcCgoc2xpZGVyKSA9PiBuZXcgc2xpZGVyKHJvb3QpKTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIEEgdXNlciBtYXkgc2V0IGEgcHJvcGVydHkgb24gYW4gX2luc3RhbmNlXyBvZiBhbiBlbGVtZW50LFxuICAgIC8vIGJlZm9yZSBpdHMgcHJvdG90eXBlIGhhcyBiZWVuIGNvbm5lY3RlZCB0byB0aGlzIGNsYXNzLlxuICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIHJ1biBpdCB0aHJvdWdoIHRoZSBwcm9wZXIgY2xhc3Mgc2V0dGVyLlxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjb2xvcicpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29sb3I7XG4gICAgICBkZWxldGUgdGhpc1snY29sb3InIGFzIGtleW9mIHRoaXNdO1xuICAgICAgdGhpcy5jb2xvciA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuY29sb3IpIHtcbiAgICAgIHRoaXMuY29sb3IgPSB0aGlzLmNvbG9yTW9kZWwuZGVmYXVsdENvbG9yO1xuICAgIH1cbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhfYXR0cjogc3RyaW5nLCBfb2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yTW9kZWwuZnJvbUF0dHIobmV3VmFsKTtcbiAgICBpZiAoIXRoaXNbJGlzU2FtZV0oY29sb3IpKSB7XG4gICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgLy8gTWVyZ2UgdGhlIGN1cnJlbnQgSFNWIGNvbG9yIG9iamVjdCB3aXRoIHVwZGF0ZWQgcGFyYW1zLlxuICAgIGNvbnN0IG9sZEhzdmEgPSB0aGlzWyRoc3ZhXTtcbiAgICBjb25zdCBuZXdIc3ZhID0geyAuLi5vbGRIc3ZhLCAuLi5ldmVudC5kZXRhaWwgfTtcbiAgICB0aGlzWyR1cGRhdGVdKG5ld0hzdmEpO1xuICAgIGxldCBuZXdDb2xvcjtcbiAgICBpZiAoXG4gICAgICAhZXF1YWxDb2xvck9iamVjdHMobmV3SHN2YSwgb2xkSHN2YSkgJiZcbiAgICAgICF0aGlzWyRpc1NhbWVdKChuZXdDb2xvciA9IHRoaXMuY29sb3JNb2RlbC5mcm9tSHN2YShuZXdIc3ZhKSkpXG4gICAgKSB7XG4gICAgICB0aGlzWyRjb2xvcl0gPSBuZXdDb2xvcjtcbiAgICAgIGZpcmUodGhpcywgJ2NvbG9yLWNoYW5nZWQnLCB7IHZhbHVlOiBuZXdDb2xvciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIFskaXNTYW1lXShjb2xvcjogQyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbG9yICYmIHRoaXMuY29sb3JNb2RlbC5lcXVhbChjb2xvciwgdGhpcy5jb2xvcik7XG4gIH1cblxuICBwcml2YXRlIFskdXBkYXRlXShoc3ZhOiBIc3ZhQ29sb3IpOiB2b2lkIHtcbiAgICB0aGlzWyRoc3ZhXSA9IGhzdmE7XG4gICAgdGhpc1skcGFydHNdLmZvckVhY2goKHBhcnQpID0+IHBhcnQudXBkYXRlKGhzdmEpKTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ29sb3JNb2RlbCwgQ29sb3JQaWNrZXJFdmVudExpc3RlbmVyLCBDb2xvclBpY2tlckV2ZW50TWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXIgfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbG9yLXBpY2tlci5qcyc7XG5pbXBvcnQgeyBoZXhUb0hzdmEsIGhzdmFUb0hleCB9IGZyb20gJy4uL3V0aWxzL2NvbnZlcnQuanMnO1xuaW1wb3J0IHsgZXF1YWxIZXggfSBmcm9tICcuLi91dGlscy9jb21wYXJlLmpzJztcblxuY29uc3QgY29sb3JNb2RlbDogQ29sb3JNb2RlbDxzdHJpbmc+ID0ge1xuICBkZWZhdWx0Q29sb3I6ICcjMDAwJyxcbiAgdG9Ic3ZhOiBoZXhUb0hzdmEsXG4gIGZyb21Ic3ZhOiAoeyBoLCBzLCB2IH0pID0+IGhzdmFUb0hleCh7IGgsIHMsIHYsIGE6IDEgfSksXG4gIGVxdWFsOiBlcXVhbEhleCxcbiAgZnJvbUF0dHI6IChjb2xvcikgPT4gY29sb3Jcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGV4QmFzZSB7XG4gIGFkZEV2ZW50TGlzdGVuZXI8VCBleHRlbmRzIGtleW9mIENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPj4oXG4gICAgdHlwZTogVCxcbiAgICBsaXN0ZW5lcjogQ29sb3JQaWNrZXJFdmVudExpc3RlbmVyPENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPltUXT4sXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9uc1xuICApOiB2b2lkO1xuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI8VCBleHRlbmRzIGtleW9mIENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPj4oXG4gICAgdHlwZTogVCxcbiAgICBsaXN0ZW5lcjogQ29sb3JQaWNrZXJFdmVudExpc3RlbmVyPENvbG9yUGlja2VyRXZlbnRNYXA8c3RyaW5nPltUXT4sXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9uc1xuICApOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgSGV4QmFzZSBleHRlbmRzIENvbG9yUGlja2VyPHN0cmluZz4ge1xuICBwcm90ZWN0ZWQgZ2V0IGNvbG9yTW9kZWwoKTogQ29sb3JNb2RlbDxzdHJpbmc+IHtcbiAgICByZXR1cm4gY29sb3JNb2RlbDtcbiAgfVxufVxuIiwgImltcG9ydCB7RWRpdG9yLCBnZXRIVE1MRnJvbUZyYWdtZW50LCBpc0FjdGl2ZX0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IEJsb2NrcXVvdGUgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWJsb2NrcXVvdGVcIjtcbmltcG9ydCBCb2xkIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1ib2xkXCI7XG5pbXBvcnQgQnVsbGV0TGlzdCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tYnVsbGV0LWxpc3RcIjtcbmltcG9ydCBDb2RlIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1jb2RlXCI7XG5pbXBvcnQgQ29sb3IgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWNvbG9yXCI7XG5pbXBvcnQgRG9jdW1lbnQgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWRvY3VtZW50XCI7XG5pbXBvcnQgRHJvcGN1cnNvciBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tZHJvcGN1cnNvclwiO1xuaW1wb3J0IEdhcGN1cnNvciBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tZ2FwY3Vyc29yXCI7XG5pbXBvcnQgSGFyZEJyZWFrIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1oYXJkLWJyZWFrXCI7XG5pbXBvcnQgSGVhZGluZyBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24taGVhZGluZ1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLWhpc3RvcnlcIjtcbmltcG9ydCBIb3Jpem9udGFsUnVsZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24taG9yaXpvbnRhbC1ydWxlXCI7XG5pbXBvcnQgSXRhbGljIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1pdGFsaWNcIjtcbmltcG9ydCBMaXN0SXRlbSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tbGlzdC1pdGVtXCI7XG5pbXBvcnQgT3JkZXJlZExpc3QgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLW9yZGVyZWQtbGlzdFwiO1xuaW1wb3J0IFBhcmFncmFwaCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tcGFyYWdyYXBoXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLXBsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU3RyaWtlIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1zdHJpa2VcIjtcbmltcG9ydCBTdWJzY3JpcHQgZnJvbSBcIkB0aXB0YXAvZXh0ZW5zaW9uLXN1YnNjcmlwdFwiO1xuaW1wb3J0IFN1cGVyc2NyaXB0IGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1zdXBlcnNjcmlwdFwiO1xuaW1wb3J0IFRhYmxlIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi10YWJsZVwiO1xuaW1wb3J0IFRhYmxlQ2VsbCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGFibGUtY2VsbFwiO1xuaW1wb3J0IFRhYmxlSGVhZGVyIGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1oZWFkZXJcIjtcbmltcG9ydCBUYWJsZVJvdyBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGFibGUtcm93XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGV4dFwiO1xuaW1wb3J0IFRleHRTdHlsZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdGV4dC1zdHlsZVwiO1xuaW1wb3J0IFVuZGVybGluZSBmcm9tIFwiQHRpcHRhcC9leHRlbnNpb24tdW5kZXJsaW5lXCI7XG5pbXBvcnQgSGlnaGxpZ2h0IGZyb20gXCJAdGlwdGFwL2V4dGVuc2lvbi1oaWdobGlnaHRcIjtcbmltcG9ydCB7XG4gICAgQ2hlY2tlZExpc3QsXG4gICAgTGVhZCxcbiAgICBDdXN0b21MaW5rLFxuICAgIEN1c3RvbUltYWdlLFxuICAgIEN1c3RvbVRleHRBbGlnbixcbiAgICBTbWFsbCxcbiAgICBHcmlkLFxuICAgIEdyaWRDb2x1bW4sXG4gICAgR3JpZEJ1aWxkZXIsXG4gICAgR3JpZEJ1aWxkZXJDb2x1bW4sXG4gICAgTWVyZ2VUYWcsXG4gICAgWW91dHViZSxcbiAgICBWaW1lbyxcbiAgICBEZXRhaWxzLFxuICAgIERldGFpbHNTdW1tYXJ5LFxuICAgIERldGFpbHNDb250ZW50LFxuICAgIEN1c3RvbUNvZGVCbG9ja0xvd2xpZ2h0LFxuICAgIEh1cmRsZSxcbiAgICBCdWJibGVNZW51LFxuICAgIEZsb2F0aW5nTWVudSxcbiAgICBWaWRlbyxcbiAgICBUaXB0YXBCbG9jayxcbiAgICBEcmFnQW5kRHJvcEV4dGVuc2lvbixcbiAgICBDbGFzc0V4dGVuc2lvbixcbiAgICBJZEV4dGVuc2lvbixcbiAgICBTdHlsZUV4dGVuc2lvbixcbn0gZnJvbSBcIi4vZXh0ZW5zaW9uc1wiO1xuaW1wb3J0IHtsb3dsaWdodH0gZnJvbSBcImxvd2xpZ2h0L2xpYi9jb21tb25cIjtcbmltcG9ydCB7IEhleEJhc2UgfSBmcm9tICd2YW5pbGxhLWNvbG9yZnVsL2xpYi9lbnRyeXBvaW50cy9oZXgnO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCJsb2Rhc2hcIjtcblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCd0aXB0YXAtaGV4LWNvbG9yLXBpY2tlcicsIEhleEJhc2UpO1xuXG5sZXQgY29yZUV4dGVuc2lvbnMgPSB7XG4gICAgYmxvY2txdW90ZTogW0Jsb2NrcXVvdGVdLFxuICAgIGJvbGQ6IFtCb2xkXSxcbiAgICAnYnVsbGV0LWxpc3QnOiBbQnVsbGV0TGlzdF0sXG4gICAgJ2NoZWNrZWQtbGlzdCc6IFtDaGVja2VkTGlzdF0sXG4gICAgY29kZTogW0NvZGVdLFxuICAgICdjb2RlLWJsb2NrJzogW0N1c3RvbUNvZGVCbG9ja0xvd2xpZ2h0LmNvbmZpZ3VyZSh7XG4gICAgICAgIGxvd2xpZ2h0LFxuICAgICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICAgICAgY2xhc3M6IFwiaGxqc1wiLFxuICAgICAgICB9LFxuICAgIH0pXSxcbiAgICBjb2xvcjogW0NvbG9yXSxcbiAgICBkZXRhaWxzOiBbRGV0YWlscywgRGV0YWlsc1N1bW1hcnksIERldGFpbHNDb250ZW50XSxcbiAgICBncmlkOiBbR3JpZCwgR3JpZENvbHVtbl0sXG4gICAgJ2dyaWQtYnVpbGRlcic6IFtHcmlkQnVpbGRlciwgR3JpZEJ1aWxkZXJDb2x1bW5dLFxuICAgIGhlYWRpbmc6IFtIZWFkaW5nLmNvbmZpZ3VyZSh7bGV2ZWxzOiBbMSwgMiwgMywgNCwgNSwgNl19KV0sXG4gICAgaGlnaGxpZ2h0OiBbSGlnaGxpZ2h0XSxcbiAgICBocjogW0hvcml6b250YWxSdWxlXSxcbiAgICBodXJkbGU6IFtIdXJkbGVdLFxuICAgIGl0YWxpYzogW0l0YWxpY10sXG4gICAgbGVhZDogW0xlYWRdLFxuICAgIGxpbms6IFtDdXN0b21MaW5rLmNvbmZpZ3VyZSh7XG4gICAgICAgIG9wZW5PbkNsaWNrOiBmYWxzZSxcbiAgICAgICAgYXV0b2xpbms6IGZhbHNlLFxuICAgICAgICBIVE1MQXR0cmlidXRlczoge1xuICAgICAgICAgICAgcmVsOiBudWxsLFxuICAgICAgICAgICAgaHJlZmxhbmc6IG51bGwsXG4gICAgICAgICAgICBjbGFzczogbnVsbCxcbiAgICAgICAgfSxcbiAgICB9KV0sXG4gICAgbWVkaWE6IFtDdXN0b21JbWFnZS5jb25maWd1cmUoe2lubGluZTogdHJ1ZX0pXSxcbiAgICBvZW1iZWQ6IFtZb3V0dWJlLCBWaW1lbywgVmlkZW9dLFxuICAgICdvcmRlcmVkLWxpc3QnOiBbT3JkZXJlZExpc3RdLFxuICAgIHNtYWxsOiBbU21hbGxdLFxuICAgIHN0cmlrZTogW1N0cmlrZV0sXG4gICAgc3Vic2NyaXB0OiBbU3Vic2NyaXB0XSxcbiAgICBzdXBlcnNjcmlwdDogW1N1cGVyc2NyaXB0XSxcbiAgICB0YWJsZTogW1RhYmxlLmNvbmZpZ3VyZSh7cmVzaXphYmxlOiB0cnVlfSksIFRhYmxlSGVhZGVyLCBUYWJsZUNlbGwsIFRhYmxlUm93XSxcbiAgICB1bmRlcmxpbmU6IFtVbmRlcmxpbmVdLFxufTtcblxubGV0IGN1c3RvbUV4dGVuc2lvbnMgPSB3aW5kb3cuVGlwdGFwRWRpdG9yRXh0ZW5zaW9ucyB8fCB7fTtcbmxldCBlZGl0b3JFeHRlbnNpb25zID0gey4uLmNvcmVFeHRlbnNpb25zLCAuLi5jdXN0b21FeHRlbnNpb25zfTtcblxuY29uc3QgbG9jYWxlU3dpdGNoZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0aXZlTG9jYWxlJyk7XG5pZiAobG9jYWxlU3dpdGNoZXIpIHtcbiAgICBsb2NhbGVTd2l0Y2hlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvY2FsZUNoYW5nZSA9IG5ldyBDdXN0b21FdmVudCgnbG9jYWxlQ2hhbmdlJywgeyBidWJibGVzOiB0cnVlLCBkZXRhaWw6IHsgbG9jYWxlOiBsb2NhbGVTd2l0Y2hlci52YWx1ZSB9IH0pO1xuICAgICAgICBsb2NhbGVTd2l0Y2hlci5kaXNwYXRjaEV2ZW50KGxvY2FsZUNoYW5nZSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRpcHRhcCh7XG4gICBzdGF0ZSxcbiAgIHN0YXRlUGF0aCxcbiAgIHRvb2xzID0gW10sXG4gICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgbG9jYWxlID0gJ2VuJyxcbiAgIGZsb2F0aW5nTWVudVRvb2xzID0gW10sXG4gICBwbGFjZWhvbGRlciA9IG51bGwsXG4gICBtZXJnZVRhZ3MgPSBbXSxcbn0pIHtcbiAgICBsZXQgZWRpdG9ycyA9IHdpbmRvdy5maWxhbWVudFRpcHRhcEVkaXRvcnMgfHwge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgbW9kYWxJZDogbnVsbCxcbiAgICAgICAgdG9vbHM6IHRvb2xzLFxuICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgIHN0YXRlUGF0aDogc3RhdGVQYXRoLFxuICAgICAgICBmdWxsU2NyZWVuTW9kZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICBmbG9hdGluZ01lbnVUb29sczogZmxvYXRpbmdNZW51VG9vbHMsXG4gICAgICAgIGdldEV4dGVuc2lvbnMoaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvb2xzID0gdGhpcy50b29scy5tYXAoKHRvb2wpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvb2wgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b29sO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0b29sLmlkO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IGV4dHMgPSBbXG4gICAgICAgICAgICAgICAgRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgVGV4dCxcbiAgICAgICAgICAgICAgICBQYXJhZ3JhcGgsXG4gICAgICAgICAgICAgICAgRHJvcGN1cnNvcixcbiAgICAgICAgICAgICAgICBHYXBjdXJzb3IsXG4gICAgICAgICAgICAgICAgSGFyZEJyZWFrLFxuICAgICAgICAgICAgICAgIEhpc3RvcnksXG4gICAgICAgICAgICAgICAgVGV4dFN0eWxlLFxuICAgICAgICAgICAgICAgIFRpcHRhcEJsb2NrLFxuICAgICAgICAgICAgICAgIERyYWdBbmREcm9wRXh0ZW5zaW9uLFxuICAgICAgICAgICAgICAgIENsYXNzRXh0ZW5zaW9uLFxuICAgICAgICAgICAgICAgIElkRXh0ZW5zaW9uLFxuICAgICAgICAgICAgICAgIFN0eWxlRXh0ZW5zaW9uLFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyICYmICghIGRpc2FibGVkKSkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChQbGFjZWhvbGRlci5jb25maWd1cmUoeyBwbGFjZWhvbGRlciB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0b29scy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZWRpdG9yRXh0ZW5zaW9ucyk7XG4gICAgICAgICAgICAgICAgbGV0IGFsaWdubWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZXMgPSBbJ3BhcmFncmFwaCddO1xuXG4gICAgICAgICAgICAgICAgZXh0cy5wdXNoKEJ1YmJsZU1lbnUuY29uZmlndXJlKHtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luS2V5OiBgZGVmYXVsdEJ1YmJsZU1lbnUke2lkfWAsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuJHJlZnMuZGVmYXVsdEJ1YmJsZU1lbnUsXG4gICAgICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IFs1MDAsMF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFNob3c6ICh7c3RhdGUsIGZyb20sIHRvfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPT09IHRvIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmUoc3RhdGUsICdsaW5rJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ3RhYmxlJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ2ltYWdlJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ29lbWJlZCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmUoc3RhdGUsICd2aW1lbycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmUoc3RhdGUsICd5b3V0dWJlJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ3ZpZGVvJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZShzdGF0ZSwgJ3RpcHRhcEJsb2NrJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbG9hdGluZ01lbnVUb29scy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cy5wdXNoKEZsb2F0aW5nTWVudS5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luS2V5OiBgZGVmYXVsdEZsb2F0aW5nTWVudSR7aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuJHJlZnMuZGVmYXVsdEZsb2F0aW5nTWVudSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBbNTAwLDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb2F0aW5nTWVudVRvb2xzLmZvckVhY2goKHRvb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHRvb2xzLmluY2x1ZGVzKHRvb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG9vbHMuZm9yRWFjaCgodG9vbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5cy5pbmNsdWRlcyh0b29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRXh0ZW5zaW9uc1t0b29sXS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFsnb3JkZXJlZC1saXN0JywgJ2J1bGxldC1saXN0JywgJ2NoZWNrZWQtbGlzdCddLmluY2x1ZGVzKHRvb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHMucHVzaChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4dHMuaW5jbHVkZXMoTGlzdEl0ZW0pKSBleHRzLnB1c2goTGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRzLnB1c2goQnViYmxlTWVudS5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbktleTogYHRhYmxlQnViYmxlTWVudSR7aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLiRyZWZzLnRhYmxlQnViYmxlTWVudSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBweU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IFs1MDAsMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRTaG93OiAoe3N0YXRlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBY3RpdmUoc3RhdGUsICd0YWJsZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2wgPT09ICdsaW5rJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cy5wdXNoKEJ1YmJsZU1lbnUuY29uZmlndXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5LZXk6IGBsaW5rQnViYmxlTWVudSR7aWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLiRyZWZzLmxpbmtCdWJibGVNZW51LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcHB5T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogWzUwMCwwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNob3c6ICh7c3RhdGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0FjdGl2ZShzdGF0ZSwnbGluaycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cy5wdXNoKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbJ2FsaWduLWxlZnQnLCAnYWxpZ24tcmlnaHQnLCAnYWxpZ24tY2VudGVyJywgJ2FsaWduLWp1c3RpZnknXS5pbmNsdWRlcyh0b29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSBcImFsaWduLWxlZnRcIikgYWxpZ25tZW50cy5wdXNoKCdzdGFydCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSBcImFsaWduLWNlbnRlclwiKSBhbGlnbm1lbnRzLnB1c2goJ2NlbnRlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b29sID09PSBcImFsaWduLXJpZ2h0XCIpIGFsaWdubWVudHMucHVzaCgnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2wgPT09IFwiYWxpZ24tanVzdGlmeVwiKSBhbGlnbm1lbnRzLnB1c2goJ2p1c3RpZnknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9vbHMuaW5jbHVkZXMoXCJoZWFkaW5nXCIpKSB0eXBlcy5wdXNoKCdoZWFkaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1RleHRBbGlnbiA9IGV4dHMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSAndGV4dEFsaWduJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYXNUZXh0QWxpZ24gPT09IFwidW5kZWZpbmVkXCIpIGV4dHMucHVzaChDdXN0b21UZXh0QWxpZ24uY29uZmlndXJlKHt0eXBlcywgYWxpZ25tZW50c30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtZXJnZVRhZ3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChNZXJnZVRhZy5jb25maWd1cmUoe1xuICAgICAgICAgICAgICAgICAgICBtZXJnZVRhZ3MsXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleHRzO1xuICAgICAgICB9LFxuICAgICAgICBpbml0OiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRFZGl0b3IodGhpcy5zdGF0ZSk7XG5cbiAgICAgICAgICAgIHRoaXMubW9kYWxJZCA9IHRoaXMuJGVsLmNsb3Nlc3QoJ1t4LXJlZj1cIm1vZGFsQ29udGFpbmVyXCJdJyk/LmdldEF0dHJpYnV0ZSgnd2lyZTprZXknKTtcblxuICAgICAgICAgICAgd2luZG93LmZpbGFtZW50VGlwdGFwRWRpdG9ycyA9IGVkaXRvcnM7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQgJiYgKGUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImRhdGEteW91dHViZS12aWRlb1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkYXRhLXZpbWVvLXZpZGVvXCIpKSB8fFxuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJkYXRhLW5hdGl2ZS12aWRlb1wiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5maXJzdENoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImFsbFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9jYWxlQ2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBldmVudC5kZXRhaWwubG9jYWxlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBzb3J0YWJsZUVsID0gdGhpcy4kZWwucGFyZW50RWxlbWVudC5jbG9zZXN0KFwiW3gtc29ydGFibGVdXCIpO1xuICAgICAgICAgICAgaWYgKHNvcnRhYmxlRWwpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuU29ydGFibGUudXRpbHMub24oc29ydGFibGVFbCwgXCJzdGFydFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlZGl0b3JzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpcHRhcC13cmFwcGVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgZWRpdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5feF9kYXRhU3RhY2tbMF0uZWRpdG9yKCkuc2V0RWRpdGFibGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLl94X2RhdGFTdGFja1swXS5lZGl0b3IoKS5vcHRpb25zLmVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB3aW5kb3cuU29ydGFibGUudXRpbHMub24oc29ydGFibGVFbCwgXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWRpdG9ycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aXB0YXAtd3JhcHBlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvcnMuZm9yRWFjaChmdW5jdGlvbiAoZWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuX3hfZGF0YVN0YWNrWzBdLmVkaXRvcigpLnNldEVkaXRhYmxlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLl94X2RhdGFTdGFja1swXS5lZGl0b3IoKS5vcHRpb25zLmVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy4kd2F0Y2goJ3N0YXRlJywgKG5ld1N0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcigpLmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEVkaXRvcihuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCEgaXNFcXVhbChvbGRTdGF0ZSwgdGhpcy5lZGl0b3IoKS5zdGF0ZS5kb2MudG9KU09OKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRWRpdG9yQ29udGVudChuZXdTdGF0ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuZGVzdHJveSgpO1xuICAgICAgICB9LFxuICAgICAgICBlZGl0b3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gZWRpdG9yc1t0aGlzLnN0YXRlUGF0aF07XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRFZGl0b3IoY29udGVudCkge1xuICAgICAgICAgICAgaWYgKGVkaXRvcnNbdGhpcy5zdGF0ZVBhdGhdKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZWRpdG9yKCkuZ2V0SlNPTigpO1xuICAgICAgICAgICAgICAgIGVkaXRvcnNbdGhpcy5zdGF0ZVBhdGhdLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZWRpdG9yc1t0aGlzLnN0YXRlUGF0aF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIGVkaXRvcnNbdGhpcy5zdGF0ZVBhdGhdID0gbmV3IEVkaXRvcih7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy4kcmVmcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZ2V0RXh0ZW5zaW9ucyh0aGlzLnN0YXRlUGF0aCksXG4gICAgICAgICAgICAgICAgZWRpdGFibGU6ICF0aGlzLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgZWRpdG9yUHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFzdGUodmlldywgZXZlbnQsIHNsaWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGljZS5jb250ZW50LmRlc2NlbmRhbnRzKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUubmFtZSA9PT0gJ3RpcHRhcEJsb2NrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJzLnN0YXRlUGF0aCA9IF90aGlzLnN0YXRlUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJzLmRhdGEgPSBKU09OLnBhcnNlKG5vZGUuYXR0cnMuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25VcGRhdGUoe2VkaXRvcn0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3RhdGUgPSBlZGl0b3IuaXNFbXB0eSA/IG51bGwgOiBlZGl0b3IuZ2V0SlNPTigpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb25VcGRhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkJsdXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkZvY3VzKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRWRpdG9yQ29udGVudChjb250ZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IoKS5pc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2Zyb20sIHRvfSA9IHRoaXMuZWRpdG9yKCkuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY29tbWFuZHMuc2V0Q29udGVudChjb250ZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5zZXRUZXh0U2VsZWN0aW9uKHtmcm9tLCB0b30pLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWZyZXNoRWRpdG9yQ29udGVudCgpIHtcbiAgICAgICAgICAgIC8vIFVzaW5nICRuZXh0VGljayB0byBkZWxheSB0aGUgVUkgdXBkYXRlIGFmdGVyIHRoZSBlbnRhbmdsZWQgc3RhdGUgdXBkYXRlcy5cbiAgICAgICAgICAgIC8vIFRoaXMgbWF0dGVycyB3aGVuIHRoZSBtZXRob2QgaXMgdHJpZ2dlcmVkIGFzIHBhcnQgb2YgYSBiYXRjaGVkIHJlcXVlc3QuXG4gICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB0aGlzLnVwZGF0ZUVkaXRvckNvbnRlbnQodGhpcy5zdGF0ZSkpO1xuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRDb250ZW50KGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCAhPT0gdGhpcy5zdGF0ZVBhdGgpIHJldHVyblxuXG4gICAgICAgICAgICBzd2l0Y2goZXZlbnQuZGV0YWlsLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYSc6IHRoaXMuaW5zZXJ0TWVkaWEoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW8nOiB0aGlzLmluc2VydFZpZGVvKGV2ZW50KTsgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmsnOiB0aGlzLmluc2VydExpbmsoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnc291cmNlJzogdGhpcy5pbnNlcnRTb3VyY2UoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnZ3JpZCc6IHRoaXMuaW5zZXJ0R3JpZEJ1aWxkZXIoZXZlbnQpOyByZXR1cm47XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRNZWRpYShldmVudCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQuZGV0YWlsLm1lZGlhKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LmRldGFpbC5tZWRpYS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZU1lZGlhSW5zZXJ0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVNZWRpYUluc2VydChldmVudC5kZXRhaWwubWVkaWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBleGVjdXRlTWVkaWFJbnNlcnQobWVkaWEgPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISBtZWRpYSB8fCBtZWRpYT8udXJsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBtZWRpYT8udXJsIHx8IG1lZGlhPy5zcmM7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VUeXBlcyA9IFsnanBnJywgJ2pwZWcnLCAnc3ZnJywgJ3BuZycsICd3ZWJwJ107XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC8uKlxcLihbYS16QS1aXSopXFw/Py87XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHNyYyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwgJiYgaW1hZ2VUeXBlcy5pbmNsdWRlcyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNoYWluKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogc3JjLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogbWVkaWE/LmFsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbWVkaWE/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBtZWRpYT8ud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBtZWRpYT8uaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenk6IG1lZGlhPy5sYXp5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ydW4oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5leHRlbmRNYXJrUmFuZ2UoJ2xpbmsnKS5zZXRMaW5rKHsgaHJlZjogc3JjIH0pLmluc2VydENvbnRlbnQobWVkaWE/LmxpbmtfdGV4dCkucnVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRWaWRlbyhldmVudCkge1xuICAgICAgICAgICAgbGV0IHZpZGVvID0gZXZlbnQuZGV0YWlsLnZpZGVvO1xuXG4gICAgICAgICAgICBpZiAoISB2aWRlbyB8fCB2aWRlby51cmwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb21tb25PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHNyYzogdmlkZW8udXJsLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB2aWRlby5yZXNwb25zaXZlID8gdmlkZW8ud2lkdGggKiAxMDAgOiB2aWRlby53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHZpZGVvLnJlc3BvbnNpdmUgPyB2aWRlby5oZWlnaHQgKiAxMDAgOiB2aWRlby5oZWlnaHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2l2ZTogdmlkZW8ucmVzcG9uc2l2ZSA/PyB0cnVlLFxuICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC13aWR0aCc6IHZpZGVvLndpZHRoLFxuICAgICAgICAgICAgICAgICdkYXRhLWFzcGVjdC1oZWlnaHQnOiB2aWRlby5oZWlnaHQsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2aWRlby51cmwuaW5jbHVkZXMoJ3lvdXR1YmUnKSB8fCB2aWRlby51cmwuaW5jbHVkZXMoJ3lvdXR1LmJlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5zZXRZb3V0dWJlVmlkZW8oe1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sczogdmlkZW8ueW91dHViZV9vcHRpb25zLmluY2x1ZGVzKCdjb250cm9scycpLFxuICAgICAgICAgICAgICAgICAgICBub2Nvb2tpZTogdmlkZW8ueW91dHViZV9vcHRpb25zLmluY2x1ZGVzKCdub2Nvb2tpZScpLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdmlkZW8uc3RhcnRfYXQgPz8gMCxcbiAgICAgICAgICAgICAgICB9KS5ydW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW8udXJsLmluY2x1ZGVzKCd2aW1lbycpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jaGFpbigpLmZvY3VzKCkuc2V0VmltZW9WaWRlbyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbW1vbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5OiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdhdXRvcGxheScpLFxuICAgICAgICAgICAgICAgICAgICBsb29wOiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdsb29wJyksXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdzaG93X3RpdGxlJyksXG4gICAgICAgICAgICAgICAgICAgIGJ5bGluZTogdmlkZW8udmltZW9fb3B0aW9ucy5pbmNsdWRlcygnYnlsaW5lJyksXG4gICAgICAgICAgICAgICAgICAgIHBvcnRyYWl0OiB2aWRlby52aW1lb19vcHRpb25zLmluY2x1ZGVzKCdwb3J0cmFpdCcpLFxuICAgICAgICAgICAgICAgIH0pLnJ1bigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNoYWluKCkuZm9jdXMoKS5zZXRWaWRlbyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbW1vbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9wbGF5OiB2aWRlby5uYXRpdmVfb3B0aW9ucy5pbmNsdWRlcygnYXV0b3BsYXknKSxcbiAgICAgICAgICAgICAgICAgICAgbG9vcDogdmlkZW8ubmF0aXZlX29wdGlvbnMuaW5jbHVkZXMoJ2xvb3AnKSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHM6IHZpZGVvLm5hdGl2ZV9vcHRpb25zLmluY2x1ZGVzKCdjb250cm9scycpLFxuICAgICAgICAgICAgICAgIH0pLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRMaW5rKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGV2ZW50LmRldGFpbDtcblxuICAgICAgICAgICAgaWYgKGxpbmsuaHJlZiA9PT0gbnVsbCAmJiBsaW5rLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluay5ocmVmID09PSAnJyAmJiBsaW5rLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnNldExpbmsoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lZGl0b3IoKVxuICAgICAgICAgICAgICAgIC5jaGFpbigpXG4gICAgICAgICAgICAgICAgLmZvY3VzKClcbiAgICAgICAgICAgICAgICAuZXh0ZW5kTWFya1JhbmdlKCdsaW5rJylcbiAgICAgICAgICAgICAgICAuc2V0TGluayh7XG4gICAgICAgICAgICAgICAgICAgIGhyZWY6IGxpbmsuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGxpbmsuaWQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBsaW5rLnRhcmdldCA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICBocmVmbGFuZzogbGluay5ocmVmbGFuZyA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZWw6IGxpbmsucmVsID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlZmVycmVycG9saWN5OiBsaW5rLnJlZmVycmVycG9saWN5ID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGFzX2J1dHRvbjogbGluay5hc19idXR0b24gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uX3RoZW1lOiBsaW5rLmJ1dHRvbl90aGVtZSA/PyBudWxsLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNlbGVjdFRleHRibG9ja0VuZCgpXG4gICAgICAgICAgICAgICAgLnJ1bigpO1xuICAgICAgICB9LFxuICAgICAgICB1bnNldExpbmsoKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3IoKS5jaGFpbigpLmZvY3VzKCkuZXh0ZW5kTWFya1JhbmdlKCdsaW5rJykudW5zZXRMaW5rKCkuc2VsZWN0VGV4dGJsb2NrRW5kKCkucnVuKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNvdXJjZShldmVudCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFZGl0b3JDb250ZW50KGV2ZW50LmRldGFpbC5zb3VyY2UpO1xuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRHcmlkQnVpbGRlcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGdyaWQgPSBldmVudC5kZXRhaWwuZGF0YTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gJ3Jlc3BvbnNpdmUnO1xuICAgICAgICAgICAgY29uc3QgYXN5bW1ldHJpY0xlZnQgPSBwYXJzZUludChncmlkLmFzeW1tZXRyaWNfbGVmdCkgPz8gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGFzeW1tZXRyaWNSaWdodCA9IHBhcnNlSW50KGdyaWQuYXN5bW1ldHJpY19yaWdodCkgPz8gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGdyaWQuZml4ZWQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ2ZpeGVkJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyaWQuYXN5bW1ldHJpYykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnYXN5bW1ldHJpYyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY2hhaW4oKS5mb2N1cygpLmluc2VydEdyaWRCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBjb2xzOiBncmlkLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBzdGFja0F0OiBncmlkLnN0YWNrX2F0LFxuICAgICAgICAgICAgICAgIGFzeW1tZXRyaWNMZWZ0LFxuICAgICAgICAgICAgICAgIGFzeW1tZXRyaWNSaWdodFxuICAgICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydEJsb2NrKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCAhPT0gdGhpcy5zdGF0ZVBhdGgpIHJldHVyblxuXG4gICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNvbW1hbmRzLmluc2VydEJsb2NrKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBldmVudC5kZXRhaWwudHlwZSxcbiAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IGV2ZW50LmRldGFpbC5zdGF0ZVBhdGgsXG4gICAgICAgICAgICAgICAgZGF0YTogZXZlbnQuZGV0YWlsLmRhdGEsXG4gICAgICAgICAgICAgICAgcHJldmlldzogZXZlbnQuZGV0YWlsLnByZXZpZXcsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGV2ZW50LmRldGFpbC5sYWJlbCxcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlczogZXZlbnQuZGV0YWlsLmNvb3JkaW5hdGVzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghIHRoaXMuZWRpdG9yKCkuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jb21tYW5kcy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRNZXJnZVRhZyhldmVudCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jb21tYW5kcy5pbnNlcnRNZXJnZVRhZyh7XG4gICAgICAgICAgICAgICAgdGFnOiBldmVudC5kZXRhaWwudGFnLFxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBldmVudC5kZXRhaWwuY29vcmRpbmF0ZXMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCEgdGhpcy5lZGl0b3IoKS5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvcigpLmNvbW1hbmRzLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9wZW5CbG9ja1NldHRpbmdzKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCAhPT0gdGhpcy5zdGF0ZVBhdGgpIHJldHVyblxuXG4gICAgICAgICAgICB0aGlzLiR3aXJlLmRpc3BhdGNoRm9ybUV2ZW50KFwidGlwdGFwOjp1cGRhdGVCbG9ja1wiLCB0aGlzLnN0YXRlUGF0aCwgZXZlbnQuZGV0YWlsKTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlQmxvY2soZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kZXRhaWwuc3RhdGVQYXRoICE9PSB0aGlzLnN0YXRlUGF0aCkgcmV0dXJuXG5cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY29tbWFuZHMudXBkYXRlQmxvY2soe1xuICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LmRldGFpbC50eXBlLFxuICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogZXZlbnQuZGV0YWlsLnN0YXRlUGF0aCxcbiAgICAgICAgICAgICAgICBkYXRhOiBldmVudC5kZXRhaWwuZGF0YSxcbiAgICAgICAgICAgICAgICBwcmV2aWV3OiBldmVudC5kZXRhaWwucHJldmlldyxcbiAgICAgICAgICAgICAgICBsYWJlbDogZXZlbnQuZGV0YWlsLmxhYmVsLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghIHRoaXMuZWRpdG9yKCkuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IoKS5jb21tYW5kcy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkZWxldGVCbG9jaygpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yKCkuY29tbWFuZHMucmVtb3ZlQmxvY2soKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFFQSxhQUFTQSxZQUFXLEtBQUs7QUFDdkIsVUFBSSxlQUFlLEtBQUs7QUFDdEIsWUFBSSxRQUNGLElBQUksU0FDSixJQUFJLE1BQ0YsV0FBWTtBQUNWLGdCQUFNLElBQUksTUFBTSxrQkFBa0I7QUFBQSxRQUNwQztBQUFBLE1BQ04sV0FBVyxlQUFlLEtBQUs7QUFDN0IsWUFBSSxNQUNGLElBQUksUUFDSixJQUFJLFNBQ0YsV0FBWTtBQUNWLGdCQUFNLElBQUksTUFBTSxrQkFBa0I7QUFBQSxRQUNwQztBQUFBLE1BQ047QUFHQSxhQUFPLE9BQU8sR0FBRztBQUVq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QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUMxRSxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDMUUsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQ2hELFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDbkMsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQ3RCLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUN0QixRQUFRO0FBQUE7QUFBQSxRQUVSLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3RGLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN0RixVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFDMUIsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQzFCLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsTUFDNUI7QUFHQSxVQUFJLGNBQWM7QUFBQSxRQUNoQixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsTUFDUDtBQUdBLFVBQUksZ0JBQWdCO0FBQUEsUUFDbEIsU0FBUztBQUFBLFFBQ1QsUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsVUFBVTtBQUFBLFFBQ1YsU0FBUztBQUFBLE1BQ1g7QUFHQSxVQUFJLGdCQUFnQjtBQUFBLFFBQ2xCLE1BQU07QUFBQSxRQUNOLEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxRQUNOLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxRQUNWLFVBQVU7QUFBQSxNQUNaO0FBR0EsVUFBSSxpQkFBaUIsWUFDakIsZUFBZTtBQUduQixVQUFJLGFBQWEsT0FBTyxVQUFVLFlBQVksVUFBVSxPQUFPLFdBQVcsVUFBVTtBQUdwRixVQUFJLFdBQVcsT0FBTyxRQUFRLFlBQVksUUFBUSxLQUFLLFdBQVcsVUFBVTtBQUc1RSxVQUFJLE9BQU8sY0FBYyxZQUFZLFNBQVMsYUFBYSxFQUFFO0FBRzdELFVBQUksY0FBYyxPQUFPLFdBQVcsWUFBWSxXQUFXLENBQUMsUUFBUSxZQUFZO0FBR2hGLFVBQUksYUFBYSxlQUFlLE9BQU8sVUFBVSxZQUFZLFVBQVUsQ0FBQyxPQUFPLFlBQVk7QUFHM0YsVUFBSSxnQkFBZ0IsY0FBYyxXQUFXLFlBQVk7QUFHekQsVUFBSSxjQUFjLGlCQUFpQixXQUFXO0FBRzlDLFVBQUksV0FBWSxXQUFXO0FBQ3pCLFlBQUk7QUFFRixjQUFJLFFBQVEsY0FBYyxXQUFXLFdBQVcsV0FBVyxRQUFRLE1BQU0sRUFBRTtBQUUzRSxjQUFJLE9BQU87QUFDVCxtQkFBTztBQUFBLFVBQ1Q7QUFHQSxpQkFBTyxlQUFlLFlBQVksV0FBVyxZQUFZLFFBQVEsTUFBTTtBQUFBLFFBQ3pFLFNBQVMsR0FBRztBQUFBLFFBQUM7QUFBQSxNQUNmLEVBQUU7QUFHRixVQUFJLG9CQUFvQixZQUFZLFNBQVMsZUFDekMsYUFBYSxZQUFZLFNBQVMsUUFDbEMsWUFBWSxZQUFZLFNBQVMsT0FDakMsZUFBZSxZQUFZLFNBQVMsVUFDcEMsWUFBWSxZQUFZLFNBQVMsT0FDakMsbUJBQW1CLFlBQVksU0FBUztBQWM1QyxlQUFTQyxPQUFNLE1BQU0sU0FBUyxNQUFNO0FBQ2xDLGdCQUFRLEtBQUssUUFBUTtBQUFBLFVBQ25CLEtBQUs7QUFBRyxtQkFBTyxLQUFLLEtBQUssT0FBTztBQUFBLFVBQ2hDLEtBQUs7QUFBRyxtQkFBTyxLQUFLLEtBQUssU0FBUyxLQUFLLENBQUMsQ0FBQztBQUFBLFVBQ3pDLEtBQUs7QUFBRyxtQkFBTyxLQUFLLEtBQUssU0FBUyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUFBLFVBQ2xELEtBQUs7QUFBRyxtQkFBTyxLQUFLLEtBQUssU0FBUyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQzdEO0FBQ0EsZUFBTyxLQUFLLE1BQU0sU0FBUyxJQUFJO0FBQUEsTUFDakM7QUFZQSxlQUFTLGdCQUFnQixPQUFPLFFBQVEsVUFBVSxhQUFhO0FBQzdELFlBQUksUUFBUSxJQUNSLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUV2QyxlQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGNBQUksUUFBUSxNQUFNLEtBQUs7QUFDdkIsaUJBQU8sYUFBYSxPQUFPLFNBQVMsS0FBSyxHQUFHLEtBQUs7QUFBQSxRQUNuRDtBQUNBLGVBQU87QUFBQSxNQUNUO0FBV0EsZUFBUyxVQUFVLE9BQU8sVUFBVTtBQUNsQyxZQUFJLFFBQVEsSUFDUixTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFFdkMsZUFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixjQUFJLFNBQVMsTUFBTSxLQUFLLEdBQUcsT0FBTyxLQUFLLE1BQU0sT0FBTztBQUNsRDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFXQSxlQUFTLGVBQWUsT0FBTyxVQUFVO0FBQ3ZDLFlBQUksU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNO0FBRXZDLGVBQU8sVUFBVTtBQUNmLGNBQUksU0FBUyxNQUFNLE1BQU0sR0FBRyxRQUFRLEtBQUssTUFBTSxPQUFPO0FBQ3BEO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQVlBLGVBQVMsV0FBVyxPQUFPLFdBQVc7QUFDcEMsWUFBSSxRQUFRLElBQ1IsU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNO0FBRXZDLGVBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsY0FBSSxDQUFDLFVBQVUsTUFBTSxLQUFLLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFDMUMsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBV0EsZUFBUyxZQUFZLE9BQU8sV0FBVztBQUNyQyxZQUFJLFFBQVEsSUFDUixTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU0sUUFDbkMsV0FBVyxHQUNYLFNBQVMsQ0FBQztBQUVkLGVBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsY0FBSSxRQUFRLE1BQU0sS0FBSztBQUN2QixjQUFJLFVBQVUsT0FBTyxPQUFPLEtBQUssR0FBRztBQUNsQyxtQkFBTyxVQUFVLElBQUk7QUFBQSxVQUN2QjtBQUFBLFFBQ0Y7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQVdBLGVBQVMsY0FBYyxPQUFPLE9BQU87QUFDbkMsWUFBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsZUFBTyxDQUFDLENBQUMsVUFBVSxZQUFZLE9BQU8sT0FBTyxDQUFDLElBQUk7QUFBQSxNQUNwRDtBQVdBLGVBQVMsa0JBQWtCLE9BQU8sT0FBTyxZQUFZO0FBQ25ELFlBQUksUUFBUSxJQUNSLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUV2QyxlQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGNBQUksV0FBVyxPQUFPLE1BQU0sS0FBSyxDQUFDLEdBQUc7QUFDbkMsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBV0EsZUFBUyxTQUFTLE9BQU8sVUFBVTtBQUNqQyxZQUFJLFFBQVEsSUFDUixTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU0sUUFDbkMsU0FBUyxNQUFNLE1BQU07QUFFekIsZUFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixpQkFBTyxLQUFLLElBQUksU0FBUyxNQUFNLEtBQUssR0FBRyxPQUFPLEtBQUs7QUFBQSxRQUNyRDtBQUNBLGVBQU87QUFBQSxNQUNUO0FBVUEsZUFBUyxVQUFVLE9BQU8sUUFBUTtBQUNoQyxZQUFJLFFBQVEsSUFDUixTQUFTLE9BQU8sUUFDaEJDLFVBQVMsTUFBTTtBQUVuQixlQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGdCQUFNQSxVQUFTLEtBQUssSUFBSSxPQUFPLEtBQUs7QUFBQSxRQUN0QztBQUNBLGVBQU87QUFBQSxNQUNUO0FBY0EsZUFBUyxZQUFZLE9BQU8sVUFBVSxhQUFhLFdBQVc7QUFDNUQsWUFBSSxRQUFRLElBQ1IsU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNO0FBRXZDLFlBQUksYUFBYSxRQUFRO0FBQ3ZCLHdCQUFjLE1BQU0sRUFBRSxLQUFLO0FBQUEsUUFDN0I7QUFDQSxlQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLHdCQUFjLFNBQVMsYUFBYSxNQUFNLEtBQUssR0FBRyxPQUFPLEtBQUs7QUFBQSxRQUNoRTtBQUNBLGVBQU87QUFBQSxNQUNUO0FBY0EsZUFBUyxpQkFBaUIsT0FBTyxVQUFVLGFBQWEsV0FBVztBQUNqRSxZQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxZQUFJLGFBQWEsUUFBUTtBQUN2Qix3QkFBYyxNQUFNLEVBQUUsTUFBTTtBQUFBLFFBQzlCO0FBQ0EsZUFBTyxVQUFVO0FBQ2Ysd0JBQWMsU0FBUyxhQUFhLE1BQU0sTUFBTSxHQUFHLFFBQVEsS0FBSztBQUFBLFFBQ2xFO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFZQSxlQUFTLFVBQVUsT0FBTyxXQUFXO0FBQ25DLFlBQUksUUFBUSxJQUNSLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUV2QyxlQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGNBQUksVUFBVSxNQUFNLEtBQUssR0FBRyxPQUFPLEtBQUssR0FBRztBQUN6QyxtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFTQSxVQUFJLFlBQVksYUFBYSxRQUFRO0FBU3JDLGVBQVMsYUFBYSxRQUFRO0FBQzVCLGVBQU8sT0FBTyxNQUFNLEVBQUU7QUFBQSxNQUN4QjtBQVNBLGVBQVMsV0FBVyxRQUFRO0FBQzFCLGVBQU8sT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQUEsTUFDdkM7QUFhQSxlQUFTLFlBQVksWUFBWSxXQUFXLFVBQVU7QUFDcEQsWUFBSTtBQUNKLGlCQUFTLFlBQVksU0FBUyxPQUFPLEtBQUtDLGFBQVk7QUFDcEQsY0FBSSxVQUFVLE9BQU8sS0FBS0EsV0FBVSxHQUFHO0FBQ3JDLHFCQUFTO0FBQ1QsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRixDQUFDO0FBQ0QsZUFBTztBQUFBLE1BQ1Q7QUFhQSxlQUFTLGNBQWMsT0FBTyxXQUFXLFdBQVcsV0FBVztBQUM3RCxZQUFJLFNBQVMsTUFBTSxRQUNmLFFBQVEsYUFBYSxZQUFZLElBQUk7QUFFekMsZUFBUSxZQUFZLFVBQVUsRUFBRSxRQUFRLFFBQVM7QUFDL0MsY0FBSSxVQUFVLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxHQUFHO0FBQ3pDLG1CQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQVdBLGVBQVMsWUFBWSxPQUFPLE9BQU8sV0FBVztBQUM1QyxlQUFPLFVBQVUsUUFDYixjQUFjLE9BQU8sT0FBTyxTQUFTLElBQ3JDLGNBQWMsT0FBTyxXQUFXLFNBQVM7QUFBQSxNQUMvQztBQVlBLGVBQVMsZ0JBQWdCLE9BQU8sT0FBTyxXQUFXLFlBQVk7QUFDNUQsWUFBSSxRQUFRLFlBQVksR0FDcEIsU0FBUyxNQUFNO0FBRW5CLGVBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsY0FBSSxXQUFXLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRztBQUNuQyxtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFTQSxlQUFTLFVBQVUsT0FBTztBQUN4QixlQUFPLFVBQVU7QUFBQSxNQUNuQjtBQVdBLGVBQVMsU0FBUyxPQUFPLFVBQVU7QUFDakMsWUFBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsZUFBTyxTQUFVLFFBQVEsT0FBTyxRQUFRLElBQUksU0FBVTtBQUFBLE1BQ3hEO0FBU0EsZUFBUyxhQUFhLEtBQUs7QUFDekIsZUFBTyxTQUFTLFFBQVE7QUFDdEIsaUJBQU8sVUFBVSxPQUFPSCxhQUFZLE9BQU8sR0FBRztBQUFBLFFBQ2hEO0FBQUEsTUFDRjtBQVNBLGVBQVMsZUFBZSxRQUFRO0FBQzlCLGVBQU8sU0FBUyxLQUFLO0FBQ25CLGlCQUFPLFVBQVUsT0FBT0EsYUFBWSxPQUFPLEdBQUc7QUFBQSxRQUNoRDtBQUFBLE1BQ0Y7QUFlQSxlQUFTLFdBQVcsWUFBWSxVQUFVLGFBQWEsV0FBVyxVQUFVO0FBQzFFLGlCQUFTLFlBQVksU0FBUyxPQUFPLE9BQU9HLGFBQVk7QUFDdEQsd0JBQWMsYUFDVCxZQUFZLE9BQU8sU0FDcEIsU0FBUyxhQUFhLE9BQU8sT0FBT0EsV0FBVTtBQUFBLFFBQ3BELENBQUM7QUFDRCxlQUFPO0FBQUEsTUFDVDtBQVlBLGVBQVMsV0FBVyxPQUFPLFVBQVU7QUFDbkMsWUFBSSxTQUFTLE1BQU07QUFFbkIsY0FBTSxLQUFLLFFBQVE7QUFDbkIsZUFBTyxVQUFVO0FBQ2YsZ0JBQU0sTUFBTSxJQUFJLE1BQU0sTUFBTSxFQUFFO0FBQUEsUUFDaEM7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQVdBLGVBQVMsUUFBUSxPQUFPLFVBQVU7QUFDaEMsWUFBSSxRQUNBLFFBQVEsSUFDUixTQUFTLE1BQU07QUFFbkIsZUFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixjQUFJLFVBQVUsU0FBUyxNQUFNLEtBQUssQ0FBQztBQUNuQyxjQUFJLFlBQVlILFlBQVc7QUFDekIscUJBQVMsV0FBV0EsYUFBWSxVQUFXLFNBQVM7QUFBQSxVQUN0RDtBQUFBLFFBQ0Y7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQVdBLGVBQVMsVUFBVSxHQUFHLFVBQVU7QUFDOUIsWUFBSSxRQUFRLElBQ1IsU0FBUyxNQUFNLENBQUM7QUFFcEIsZUFBTyxFQUFFLFFBQVEsR0FBRztBQUNsQixpQkFBTyxLQUFLLElBQUksU0FBUyxLQUFLO0FBQUEsUUFDaEM7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQVdBLGVBQVMsWUFBWSxRQUFRLE9BQU87QUFDbEMsZUFBTyxTQUFTLE9BQU8sU0FBUyxLQUFLO0FBQ25DLGlCQUFPLENBQUMsS0FBSyxPQUFPLEdBQUcsQ0FBQztBQUFBLFFBQzFCLENBQUM7QUFBQSxNQUNIO0FBU0EsZUFBUyxTQUFTLFFBQVE7QUFDeEIsZUFBTyxTQUNILE9BQU8sTUFBTSxHQUFHLGdCQUFnQixNQUFNLElBQUksQ0FBQyxFQUFFLFFBQVEsYUFBYSxFQUFFLElBQ3BFO0FBQUEsTUFDTjtBQVNBLGVBQVMsVUFBVSxNQUFNO0FBQ3ZCLGVBQU8sU0FBUyxPQUFPO0FBQ3JCLGlCQUFPLEtBQUssS0FBSztBQUFBLFFBQ25CO0FBQUEsTUFDRjtBQVlBLGVBQVMsV0FBVyxRQUFRLE9BQU87QUFDakMsZUFBTyxTQUFTLE9BQU8sU0FBUyxLQUFLO0FBQ25DLGlCQUFPLE9BQU8sR0FBRztBQUFBLFFBQ25CLENBQUM7QUFBQSxNQUNIO0FBVUEsZUFBUyxTQUFTSSxRQUFPLEtBQUs7QUFDNUIsZUFBT0EsT0FBTSxJQUFJLEdBQUc7QUFBQSxNQUN0QjtBQVdBLGVBQVMsZ0JBQWdCLFlBQVksWUFBWTtBQUMvQyxZQUFJLFFBQVEsSUFDUixTQUFTLFdBQVc7QUFFeEIsZUFBTyxFQUFFLFFBQVEsVUFBVSxZQUFZLFlBQVksV0FBVyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUk7QUFBQSxRQUFDO0FBQ2hGLGVBQU87QUFBQSxNQUNUO0FBV0EsZUFBUyxjQUFjLFlBQVksWUFBWTtBQUM3QyxZQUFJLFFBQVEsV0FBVztBQUV2QixlQUFPLFdBQVcsWUFBWSxZQUFZLFdBQVcsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJO0FBQUEsUUFBQztBQUN2RSxlQUFPO0FBQUEsTUFDVDtBQVVBLGVBQVMsYUFBYSxPQUFPLGFBQWE7QUFDeEMsWUFBSSxTQUFTLE1BQU0sUUFDZixTQUFTO0FBRWIsZUFBTyxVQUFVO0FBQ2YsY0FBSSxNQUFNLE1BQU0sTUFBTSxhQUFhO0FBQ2pDLGNBQUU7QUFBQSxVQUNKO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBVUEsVUFBSSxlQUFlLGVBQWUsZUFBZTtBQVNqRCxVQUFJLGlCQUFpQixlQUFlLFdBQVc7QUFTL0MsZUFBUyxpQkFBaUIsS0FBSztBQUM3QixlQUFPLE9BQU8sY0FBYyxHQUFHO0FBQUEsTUFDakM7QUFVQSxlQUFTLFNBQVMsUUFBUSxLQUFLO0FBQzdCLGVBQU8sVUFBVSxPQUFPSixhQUFZLE9BQU8sR0FBRztBQUFBLE1BQ2hEO0FBU0EsZUFBUyxXQUFXLFFBQVE7QUFDMUIsZUFBTyxhQUFhLEtBQUssTUFBTTtBQUFBLE1BQ2pDO0FBU0EsZUFBUyxlQUFlLFFBQVE7QUFDOUIsZUFBTyxpQkFBaUIsS0FBSyxNQUFNO0FBQUEsTUFDckM7QUFTQSxlQUFTLGdCQUFnQixVQUFVO0FBQ2pDLFlBQUksTUFDQSxTQUFTLENBQUM7QUFFZCxlQUFPLEVBQUUsT0FBTyxTQUFTLEtBQUssR0FBRyxNQUFNO0FBQ3JDLGlCQUFPLEtBQUssS0FBSyxLQUFLO0FBQUEsUUFDeEI7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQVNBLGVBQVMsV0FBV0ssTUFBSztBQUN2QixZQUFJLFFBQVEsSUFDUixTQUFTLE1BQU1BLEtBQUksSUFBSTtBQUUzQixRQUFBQSxLQUFJLFFBQVEsU0FBUyxPQUFPLEtBQUs7QUFDL0IsaUJBQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUs7QUFBQSxRQUMvQixDQUFDO0FBQ0QsZUFBTztBQUFBLE1BQ1Q7QUFVQSxlQUFTLFFBQVEsTUFBTSxXQUFXO0FBQ2hDLGVBQU8sU0FBUyxLQUFLO0FBQ25CLGlCQUFPLEtBQUssVUFBVSxHQUFHLENBQUM7QUFBQSxRQUM1QjtBQUFBLE1BQ0Y7QUFXQSxlQUFTLGVBQWUsT0FBTyxhQUFhO0FBQzFDLFlBQUksUUFBUSxJQUNSLFNBQVMsTUFBTSxRQUNmLFdBQVcsR0FDWCxTQUFTLENBQUM7QUFFZCxlQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGNBQUksUUFBUSxNQUFNLEtBQUs7QUFDdkIsY0FBSSxVQUFVLGVBQWUsVUFBVSxhQUFhO0FBQ2xELGtCQUFNLEtBQUssSUFBSTtBQUNmLG1CQUFPLFVBQVUsSUFBSTtBQUFBLFVBQ3ZCO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBU0EsZUFBUyxXQUFXLEtBQUs7QUFDdkIsWUFBSSxRQUFRLElBQ1IsU0FBUyxNQUFNLElBQUksSUFBSTtBQUUzQixZQUFJLFFBQVEsU0FBUyxPQUFPO0FBQzFCLGlCQUFPLEVBQUUsS0FBSyxJQUFJO0FBQUEsUUFDcEIsQ0FBQztBQUNELGVBQU87QUFBQSxNQUNUO0FBU0EsZUFBUyxXQUFXLEtBQUs7QUFDdkIsWUFBSSxRQUFRLElBQ1IsU0FBUyxNQUFNLElBQUksSUFBSTtBQUUzQixZQUFJLFFBQVEsU0FBUyxPQUFPO0FBQzFCLGlCQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLO0FBQUEsUUFDakMsQ0FBQztBQUNELGVBQU87QUFBQSxNQUNUO0FBWUEsZUFBUyxjQUFjLE9BQU8sT0FBTyxXQUFXO0FBQzlDLFlBQUksUUFBUSxZQUFZLEdBQ3BCLFNBQVMsTUFBTTtBQUVuQixlQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGNBQUksTUFBTSxLQUFLLE1BQU0sT0FBTztBQUMxQixtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFZQSxlQUFTLGtCQUFrQixPQUFPLE9BQU8sV0FBVztBQUNsRCxZQUFJLFFBQVEsWUFBWTtBQUN4QixlQUFPLFNBQVM7QUFDZCxjQUFJLE1BQU0sS0FBSyxNQUFNLE9BQU87QUFDMUIsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBU0EsZUFBUyxXQUFXLFFBQVE7QUFDMUIsZUFBTyxXQUFXLE1BQU0sSUFDcEIsWUFBWSxNQUFNLElBQ2xCLFVBQVUsTUFBTTtBQUFBLE1BQ3RCO0FBU0EsZUFBU0MsZUFBYyxRQUFRO0FBQzdCLGVBQU8sV0FBVyxNQUFNLElBQ3BCLGVBQWUsTUFBTSxJQUNyQixhQUFhLE1BQU07QUFBQSxNQUN6QjtBQVVBLGVBQVMsZ0JBQWdCLFFBQVE7QUFDL0IsWUFBSSxRQUFRLE9BQU87QUFFbkIsZUFBTyxXQUFXLGFBQWEsS0FBSyxPQUFPLE9BQU8sS0FBSyxDQUFDLEdBQUc7QUFBQSxRQUFDO0FBQzVELGVBQU87QUFBQSxNQUNUO0FBU0EsVUFBSSxtQkFBbUIsZUFBZSxhQUFhO0FBU25ELGVBQVMsWUFBWSxRQUFRO0FBQzNCLFlBQUksU0FBUyxVQUFVLFlBQVk7QUFDbkMsZUFBTyxVQUFVLEtBQUssTUFBTSxHQUFHO0FBQzdCLFlBQUU7QUFBQSxRQUNKO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFTQSxlQUFTLGVBQWUsUUFBUTtBQUM5QixlQUFPLE9BQU8sTUFBTSxTQUFTLEtBQUssQ0FBQztBQUFBLE1BQ3JDO0FBU0EsZUFBUyxhQUFhLFFBQVE7QUFDNUIsZUFBTyxPQUFPLE1BQU0sYUFBYSxLQUFLLENBQUM7QUFBQSxNQUN6QztBQWlDQSxVQUFJLGVBQWdCLFNBQVNDLGNBQWEsU0FBUztBQUNqRCxrQkFBVSxXQUFXLE9BQU8sT0FBTyxFQUFFLFNBQVMsS0FBSyxPQUFPLEdBQUcsU0FBUyxFQUFFLEtBQUssTUFBTSxZQUFZLENBQUM7QUFHaEcsWUFBSUMsU0FBUSxRQUFRLE9BQ2hCQyxRQUFPLFFBQVEsTUFDZkMsU0FBUSxRQUFRLE9BQ2hCQyxZQUFXLFFBQVEsVUFDbkJDLFFBQU8sUUFBUSxNQUNmQyxVQUFTLFFBQVEsUUFDakJDLFVBQVMsUUFBUSxRQUNqQkMsVUFBUyxRQUFRLFFBQ2pCQyxhQUFZLFFBQVE7QUFHeEIsWUFBSSxhQUFhUixPQUFNLFdBQ25CLFlBQVlHLFVBQVMsV0FDckIsY0FBY0UsUUFBTztBQUd6QixZQUFJLGFBQWEsUUFBUSxvQkFBb0I7QUFHN0MsWUFBSSxlQUFlLFVBQVU7QUFHN0IsWUFBSUksa0JBQWlCLFlBQVk7QUFHakMsWUFBSUMsYUFBWTtBQUdoQixZQUFJLGFBQWMsV0FBVztBQUMzQixjQUFJLE1BQU0sU0FBUyxLQUFLLGNBQWMsV0FBVyxRQUFRLFdBQVcsS0FBSyxZQUFZLEVBQUU7QUFDdkYsaUJBQU8sTUFBTyxtQkFBbUIsTUFBTztBQUFBLFFBQzFDLEVBQUU7QUFPRixZQUFJLHVCQUF1QixZQUFZO0FBR3ZDLFlBQUksbUJBQW1CLGFBQWEsS0FBS0wsT0FBTTtBQUcvQyxZQUFJLFVBQVUsS0FBSztBQUduQixZQUFJLGFBQWFDO0FBQUEsVUFBTyxNQUN0QixhQUFhLEtBQUtHLGVBQWMsRUFBRSxRQUFRLGNBQWMsTUFBTSxFQUM3RCxRQUFRLDBEQUEwRCxPQUFPLElBQUk7QUFBQSxRQUNoRjtBQUdBLFlBQUlFLFVBQVMsZ0JBQWdCLFFBQVEsU0FBU25CLFlBQzFDb0IsVUFBUyxRQUFRLFFBQ2pCQyxjQUFhLFFBQVEsWUFDckIsY0FBY0YsVUFBU0EsUUFBTyxjQUFjbkIsWUFDNUMsZUFBZSxRQUFRYSxRQUFPLGdCQUFnQkEsT0FBTSxHQUNwRCxlQUFlQSxRQUFPLFFBQ3RCLHVCQUF1QixZQUFZLHNCQUNuQyxTQUFTLFdBQVcsUUFDcEIsbUJBQW1CTyxVQUFTQSxRQUFPLHFCQUFxQnBCLFlBQ3hELGNBQWNvQixVQUFTQSxRQUFPLFdBQVdwQixZQUN6QyxpQkFBaUJvQixVQUFTQSxRQUFPLGNBQWNwQjtBQUVuRCxZQUFJLGlCQUFrQixXQUFXO0FBQy9CLGNBQUk7QUFDRixnQkFBSSxPQUFPLFVBQVVhLFNBQVEsZ0JBQWdCO0FBQzdDLGlCQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNmLG1CQUFPO0FBQUEsVUFDVCxTQUFTLEdBQUc7QUFBQSxVQUFDO0FBQUEsUUFDZixFQUFFO0FBR0YsWUFBSSxrQkFBa0IsUUFBUSxpQkFBaUIsS0FBSyxnQkFBZ0IsUUFBUSxjQUN4RSxTQUFTSixTQUFRQSxNQUFLLFFBQVEsS0FBSyxLQUFLLE9BQU9BLE1BQUssS0FDcEQsZ0JBQWdCLFFBQVEsZUFBZSxLQUFLLGNBQWMsUUFBUTtBQUd0RSxZQUFJLGFBQWFHLE1BQUssTUFDbEIsY0FBY0EsTUFBSyxPQUNuQixtQkFBbUJDLFFBQU8sdUJBQzFCLGlCQUFpQk0sVUFBU0EsUUFBTyxXQUFXbkIsWUFDNUMsaUJBQWlCLFFBQVEsVUFDekIsYUFBYSxXQUFXLE1BQ3hCLGFBQWEsUUFBUWEsUUFBTyxNQUFNQSxPQUFNLEdBQ3hDLFlBQVlELE1BQUssS0FDakIsWUFBWUEsTUFBSyxLQUNqQixZQUFZSCxNQUFLLEtBQ2pCLGlCQUFpQixRQUFRLFVBQ3pCLGVBQWVHLE1BQUssUUFDcEIsZ0JBQWdCLFdBQVc7QUFHL0IsWUFBSSxXQUFXLFVBQVUsU0FBUyxVQUFVLEdBQ3hDVSxPQUFNLFVBQVUsU0FBUyxLQUFLLEdBQzlCQyxXQUFVLFVBQVUsU0FBUyxTQUFTLEdBQ3RDQyxPQUFNLFVBQVUsU0FBUyxLQUFLLEdBQzlCQyxXQUFVLFVBQVUsU0FBUyxTQUFTLEdBQ3RDLGVBQWUsVUFBVVosU0FBUSxRQUFRO0FBRzdDLFlBQUksVUFBVVksWUFBVyxJQUFJQTtBQUc3QixZQUFJLFlBQVksQ0FBQztBQUdqQixZQUFJLHFCQUFxQixTQUFTLFFBQVEsR0FDdEMsZ0JBQWdCLFNBQVNILElBQUcsR0FDNUIsb0JBQW9CLFNBQVNDLFFBQU8sR0FDcEMsZ0JBQWdCLFNBQVNDLElBQUcsR0FDNUIsb0JBQW9CLFNBQVNDLFFBQU87QUFHeEMsWUFBSSxjQUFjTCxVQUFTQSxRQUFPLFlBQVlwQixZQUMxQyxnQkFBZ0IsY0FBYyxZQUFZLFVBQVVBLFlBQ3BELGlCQUFpQixjQUFjLFlBQVksV0FBV0E7QUF5SDFELGlCQUFTLE9BQU8sT0FBTztBQUNyQixjQUFJLGFBQWEsS0FBSyxLQUFLLENBQUMsUUFBUSxLQUFLLEtBQUssRUFBRSxpQkFBaUIsY0FBYztBQUM3RSxnQkFBSSxpQkFBaUIsZUFBZTtBQUNsQyxxQkFBTztBQUFBLFlBQ1Q7QUFDQSxnQkFBSWlCLGdCQUFlLEtBQUssT0FBTyxhQUFhLEdBQUc7QUFDN0MscUJBQU8sYUFBYSxLQUFLO0FBQUEsWUFDM0I7QUFBQSxVQUNGO0FBQ0EsaUJBQU8sSUFBSSxjQUFjLEtBQUs7QUFBQSxRQUNoQztBQVVBLFlBQUksYUFBYywyQkFBVztBQUMzQixtQkFBUyxTQUFTO0FBQUEsVUFBQztBQUNuQixpQkFBTyxTQUFTLE9BQU87QUFDckIsZ0JBQUksQ0FBQyxTQUFTLEtBQUssR0FBRztBQUNwQixxQkFBTyxDQUFDO0FBQUEsWUFDVjtBQUNBLGdCQUFJLGNBQWM7QUFDaEIscUJBQU8sYUFBYSxLQUFLO0FBQUEsWUFDM0I7QUFDQSxtQkFBTyxZQUFZO0FBQ25CLGdCQUFJUyxVQUFTLElBQUk7QUFDakIsbUJBQU8sWUFBWTFCO0FBQ25CLG1CQUFPMEI7QUFBQSxVQUNUO0FBQUEsUUFDRixFQUFFO0FBT0YsaUJBQVMsYUFBYTtBQUFBLFFBRXRCO0FBU0EsaUJBQVMsY0FBYyxPQUFPLFVBQVU7QUFDdEMsZUFBSyxjQUFjO0FBQ25CLGVBQUssY0FBYyxDQUFDO0FBQ3BCLGVBQUssWUFBWSxDQUFDLENBQUM7QUFDbkIsZUFBSyxZQUFZO0FBQ2pCLGVBQUssYUFBYTFCO0FBQUEsUUFDcEI7QUFXQSxlQUFPLG1CQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBUXhCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVFWLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVFaLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVFmLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQVFaLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQVFULEtBQUs7QUFBQSxVQUNQO0FBQUEsUUFDRjtBQUdBLGVBQU8sWUFBWSxXQUFXO0FBQzlCLGVBQU8sVUFBVSxjQUFjO0FBRS9CLHNCQUFjLFlBQVksV0FBVyxXQUFXLFNBQVM7QUFDekQsc0JBQWMsVUFBVSxjQUFjO0FBV3RDLGlCQUFTLFlBQVksT0FBTztBQUMxQixlQUFLLGNBQWM7QUFDbkIsZUFBSyxjQUFjLENBQUM7QUFDcEIsZUFBSyxVQUFVO0FBQ2YsZUFBSyxlQUFlO0FBQ3BCLGVBQUssZ0JBQWdCLENBQUM7QUFDdEIsZUFBSyxnQkFBZ0I7QUFDckIsZUFBSyxZQUFZLENBQUM7QUFBQSxRQUNwQjtBQVVBLGlCQUFTLFlBQVk7QUFDbkIsY0FBSTBCLFVBQVMsSUFBSSxZQUFZLEtBQUssV0FBVztBQUM3QyxVQUFBQSxRQUFPLGNBQWMsVUFBVSxLQUFLLFdBQVc7QUFDL0MsVUFBQUEsUUFBTyxVQUFVLEtBQUs7QUFDdEIsVUFBQUEsUUFBTyxlQUFlLEtBQUs7QUFDM0IsVUFBQUEsUUFBTyxnQkFBZ0IsVUFBVSxLQUFLLGFBQWE7QUFDbkQsVUFBQUEsUUFBTyxnQkFBZ0IsS0FBSztBQUM1QixVQUFBQSxRQUFPLFlBQVksVUFBVSxLQUFLLFNBQVM7QUFDM0MsaUJBQU9BO0FBQUEsUUFDVDtBQVVBLGlCQUFTLGNBQWM7QUFDckIsY0FBSSxLQUFLLGNBQWM7QUFDckIsZ0JBQUlBLFVBQVMsSUFBSSxZQUFZLElBQUk7QUFDakMsWUFBQUEsUUFBTyxVQUFVO0FBQ2pCLFlBQUFBLFFBQU8sZUFBZTtBQUFBLFVBQ3hCLE9BQU87QUFDTCxZQUFBQSxVQUFTLEtBQUssTUFBTTtBQUNwQixZQUFBQSxRQUFPLFdBQVc7QUFBQSxVQUNwQjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxZQUFZO0FBQ25CLGNBQUksUUFBUSxLQUFLLFlBQVksTUFBTSxHQUMvQixNQUFNLEtBQUssU0FDWCxRQUFRLFFBQVEsS0FBSyxHQUNyQixVQUFVLE1BQU0sR0FDaEIsWUFBWSxRQUFRLE1BQU0sU0FBUyxHQUNuQyxPQUFPLFFBQVEsR0FBRyxXQUFXLEtBQUssU0FBUyxHQUMzQ0MsU0FBUSxLQUFLLE9BQ2JDLE9BQU0sS0FBSyxLQUNYLFNBQVNBLE9BQU1ELFFBQ2YsUUFBUSxVQUFVQyxPQUFPRCxTQUFRLEdBQ2pDLFlBQVksS0FBSyxlQUNqQixhQUFhLFVBQVUsUUFDdkIsV0FBVyxHQUNYLFlBQVksVUFBVSxRQUFRLEtBQUssYUFBYTtBQUVwRCxjQUFJLENBQUMsU0FBVSxDQUFDLFdBQVcsYUFBYSxVQUFVLGFBQWEsUUFBUztBQUN0RSxtQkFBTyxpQkFBaUIsT0FBTyxLQUFLLFdBQVc7QUFBQSxVQUNqRDtBQUNBLGNBQUlELFVBQVMsQ0FBQztBQUVkO0FBQ0EsbUJBQU8sWUFBWSxXQUFXLFdBQVc7QUFDdkMsdUJBQVM7QUFFVCxrQkFBSSxZQUFZLElBQ1osUUFBUSxNQUFNLEtBQUs7QUFFdkIscUJBQU8sRUFBRSxZQUFZLFlBQVk7QUFDL0Isb0JBQUksT0FBTyxVQUFVLFNBQVMsR0FDMUJHLFlBQVcsS0FBSyxVQUNoQixPQUFPLEtBQUssTUFDWixXQUFXQSxVQUFTLEtBQUs7QUFFN0Isb0JBQUksUUFBUSxlQUFlO0FBQ3pCLDBCQUFRO0FBQUEsZ0JBQ1YsV0FBVyxDQUFDLFVBQVU7QUFDcEIsc0JBQUksUUFBUSxrQkFBa0I7QUFDNUIsNkJBQVM7QUFBQSxrQkFDWCxPQUFPO0FBQ0wsMEJBQU07QUFBQSxrQkFDUjtBQUFBLGdCQUNGO0FBQUEsY0FDRjtBQUNBLGNBQUFILFFBQU8sVUFBVSxJQUFJO0FBQUEsWUFDdkI7QUFDQSxpQkFBT0E7QUFBQSxRQUNUO0FBR0Esb0JBQVksWUFBWSxXQUFXLFdBQVcsU0FBUztBQUN2RCxvQkFBWSxVQUFVLGNBQWM7QUFXcEMsaUJBQVMsS0FBSyxTQUFTO0FBQ3JCLGNBQUksUUFBUSxJQUNSLFNBQVMsV0FBVyxPQUFPLElBQUksUUFBUTtBQUUzQyxlQUFLLE1BQU07QUFDWCxpQkFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixnQkFBSSxRQUFRLFFBQVEsS0FBSztBQUN6QixpQkFBSyxJQUFJLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQUEsVUFDN0I7QUFBQSxRQUNGO0FBU0EsaUJBQVMsWUFBWTtBQUNuQixlQUFLLFdBQVcsZUFBZSxhQUFhLElBQUksSUFBSSxDQUFDO0FBQ3JELGVBQUssT0FBTztBQUFBLFFBQ2Q7QUFZQSxpQkFBUyxXQUFXLEtBQUs7QUFDdkIsY0FBSUEsVUFBUyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU8sS0FBSyxTQUFTLEdBQUc7QUFDdEQsZUFBSyxRQUFRQSxVQUFTLElBQUk7QUFDMUIsaUJBQU9BO0FBQUEsUUFDVDtBQVdBLGlCQUFTLFFBQVEsS0FBSztBQUNwQixjQUFJLE9BQU8sS0FBSztBQUNoQixjQUFJLGNBQWM7QUFDaEIsZ0JBQUlBLFVBQVMsS0FBSyxHQUFHO0FBQ3JCLG1CQUFPQSxZQUFXLGlCQUFpQjFCLGFBQVkwQjtBQUFBLFVBQ2pEO0FBQ0EsaUJBQU9ULGdCQUFlLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHLElBQUlqQjtBQUFBLFFBQ3REO0FBV0EsaUJBQVMsUUFBUSxLQUFLO0FBQ3BCLGNBQUksT0FBTyxLQUFLO0FBQ2hCLGlCQUFPLGVBQWdCLEtBQUssR0FBRyxNQUFNQSxhQUFhaUIsZ0JBQWUsS0FBSyxNQUFNLEdBQUc7QUFBQSxRQUNqRjtBQVlBLGlCQUFTLFFBQVEsS0FBSyxPQUFPO0FBQzNCLGNBQUksT0FBTyxLQUFLO0FBQ2hCLGVBQUssUUFBUSxLQUFLLElBQUksR0FBRyxJQUFJLElBQUk7QUFDakMsZUFBSyxHQUFHLElBQUssZ0JBQWdCLFVBQVVqQixhQUFhLGlCQUFpQjtBQUNyRSxpQkFBTztBQUFBLFFBQ1Q7QUFHQSxhQUFLLFVBQVUsUUFBUTtBQUN2QixhQUFLLFVBQVUsUUFBUSxJQUFJO0FBQzNCLGFBQUssVUFBVSxNQUFNO0FBQ3JCLGFBQUssVUFBVSxNQUFNO0FBQ3JCLGFBQUssVUFBVSxNQUFNO0FBV3JCLGlCQUFTLFVBQVUsU0FBUztBQUMxQixjQUFJLFFBQVEsSUFDUixTQUFTLFdBQVcsT0FBTyxJQUFJLFFBQVE7QUFFM0MsZUFBSyxNQUFNO0FBQ1gsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksUUFBUSxRQUFRLEtBQUs7QUFDekIsaUJBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUFBLFVBQzdCO0FBQUEsUUFDRjtBQVNBLGlCQUFTLGlCQUFpQjtBQUN4QixlQUFLLFdBQVcsQ0FBQztBQUNqQixlQUFLLE9BQU87QUFBQSxRQUNkO0FBV0EsaUJBQVMsZ0JBQWdCLEtBQUs7QUFDNUIsY0FBSSxPQUFPLEtBQUssVUFDWixRQUFRLGFBQWEsTUFBTSxHQUFHO0FBRWxDLGNBQUksUUFBUSxHQUFHO0FBQ2IsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxZQUFZLEtBQUssU0FBUztBQUM5QixjQUFJLFNBQVMsV0FBVztBQUN0QixpQkFBSyxJQUFJO0FBQUEsVUFDWCxPQUFPO0FBQ0wsbUJBQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUFBLFVBQzVCO0FBQ0EsWUFBRSxLQUFLO0FBQ1AsaUJBQU87QUFBQSxRQUNUO0FBV0EsaUJBQVMsYUFBYSxLQUFLO0FBQ3pCLGNBQUksT0FBTyxLQUFLLFVBQ1osUUFBUSxhQUFhLE1BQU0sR0FBRztBQUVsQyxpQkFBTyxRQUFRLElBQUlBLGFBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztBQUFBLFFBQzlDO0FBV0EsaUJBQVMsYUFBYSxLQUFLO0FBQ3pCLGlCQUFPLGFBQWEsS0FBSyxVQUFVLEdBQUcsSUFBSTtBQUFBLFFBQzVDO0FBWUEsaUJBQVMsYUFBYSxLQUFLLE9BQU87QUFDaEMsY0FBSSxPQUFPLEtBQUssVUFDWixRQUFRLGFBQWEsTUFBTSxHQUFHO0FBRWxDLGNBQUksUUFBUSxHQUFHO0FBQ2IsY0FBRSxLQUFLO0FBQ1AsaUJBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDO0FBQUEsVUFDeEIsT0FBTztBQUNMLGlCQUFLLEtBQUssRUFBRSxDQUFDLElBQUk7QUFBQSxVQUNuQjtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQUdBLGtCQUFVLFVBQVUsUUFBUTtBQUM1QixrQkFBVSxVQUFVLFFBQVEsSUFBSTtBQUNoQyxrQkFBVSxVQUFVLE1BQU07QUFDMUIsa0JBQVUsVUFBVSxNQUFNO0FBQzFCLGtCQUFVLFVBQVUsTUFBTTtBQVcxQixpQkFBUyxTQUFTLFNBQVM7QUFDekIsY0FBSSxRQUFRLElBQ1IsU0FBUyxXQUFXLE9BQU8sSUFBSSxRQUFRO0FBRTNDLGVBQUssTUFBTTtBQUNYLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGdCQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3pCLGlCQUFLLElBQUksTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFBQSxVQUM3QjtBQUFBLFFBQ0Y7QUFTQSxpQkFBUyxnQkFBZ0I7QUFDdkIsZUFBSyxPQUFPO0FBQ1osZUFBSyxXQUFXO0FBQUEsWUFDZCxRQUFRLElBQUk7QUFBQSxZQUNaLE9BQU8sS0FBS3NCLFFBQU87QUFBQSxZQUNuQixVQUFVLElBQUk7QUFBQSxVQUNoQjtBQUFBLFFBQ0Y7QUFXQSxpQkFBUyxlQUFlLEtBQUs7QUFDM0IsY0FBSUksVUFBUyxXQUFXLE1BQU0sR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHO0FBQ2hELGVBQUssUUFBUUEsVUFBUyxJQUFJO0FBQzFCLGlCQUFPQTtBQUFBLFFBQ1Q7QUFXQSxpQkFBUyxZQUFZLEtBQUs7QUFDeEIsaUJBQU8sV0FBVyxNQUFNLEdBQUcsRUFBRSxJQUFJLEdBQUc7QUFBQSxRQUN0QztBQVdBLGlCQUFTLFlBQVksS0FBSztBQUN4QixpQkFBTyxXQUFXLE1BQU0sR0FBRyxFQUFFLElBQUksR0FBRztBQUFBLFFBQ3RDO0FBWUEsaUJBQVMsWUFBWSxLQUFLLE9BQU87QUFDL0IsY0FBSSxPQUFPLFdBQVcsTUFBTSxHQUFHLEdBQzNCSSxRQUFPLEtBQUs7QUFFaEIsZUFBSyxJQUFJLEtBQUssS0FBSztBQUNuQixlQUFLLFFBQVEsS0FBSyxRQUFRQSxRQUFPLElBQUk7QUFDckMsaUJBQU87QUFBQSxRQUNUO0FBR0EsaUJBQVMsVUFBVSxRQUFRO0FBQzNCLGlCQUFTLFVBQVUsUUFBUSxJQUFJO0FBQy9CLGlCQUFTLFVBQVUsTUFBTTtBQUN6QixpQkFBUyxVQUFVLE1BQU07QUFDekIsaUJBQVMsVUFBVSxNQUFNO0FBWXpCLGlCQUFTLFNBQVNDLFNBQVE7QUFDeEIsY0FBSSxRQUFRLElBQ1IsU0FBU0EsV0FBVSxPQUFPLElBQUlBLFFBQU87QUFFekMsZUFBSyxXQUFXLElBQUk7QUFDcEIsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsaUJBQUssSUFBSUEsUUFBTyxLQUFLLENBQUM7QUFBQSxVQUN4QjtBQUFBLFFBQ0Y7QUFZQSxpQkFBUyxZQUFZLE9BQU87QUFDMUIsZUFBSyxTQUFTLElBQUksT0FBTyxjQUFjO0FBQ3ZDLGlCQUFPO0FBQUEsUUFDVDtBQVdBLGlCQUFTLFlBQVksT0FBTztBQUMxQixpQkFBTyxLQUFLLFNBQVMsSUFBSSxLQUFLO0FBQUEsUUFDaEM7QUFHQSxpQkFBUyxVQUFVLE1BQU0sU0FBUyxVQUFVLE9BQU87QUFDbkQsaUJBQVMsVUFBVSxNQUFNO0FBV3pCLGlCQUFTLE1BQU0sU0FBUztBQUN0QixjQUFJLE9BQU8sS0FBSyxXQUFXLElBQUksVUFBVSxPQUFPO0FBQ2hELGVBQUssT0FBTyxLQUFLO0FBQUEsUUFDbkI7QUFTQSxpQkFBUyxhQUFhO0FBQ3BCLGVBQUssV0FBVyxJQUFJO0FBQ3BCLGVBQUssT0FBTztBQUFBLFFBQ2Q7QUFXQSxpQkFBUyxZQUFZLEtBQUs7QUFDeEIsY0FBSSxPQUFPLEtBQUssVUFDWkwsVUFBUyxLQUFLLFFBQVEsRUFBRSxHQUFHO0FBRS9CLGVBQUssT0FBTyxLQUFLO0FBQ2pCLGlCQUFPQTtBQUFBLFFBQ1Q7QUFXQSxpQkFBUyxTQUFTLEtBQUs7QUFDckIsaUJBQU8sS0FBSyxTQUFTLElBQUksR0FBRztBQUFBLFFBQzlCO0FBV0EsaUJBQVMsU0FBUyxLQUFLO0FBQ3JCLGlCQUFPLEtBQUssU0FBUyxJQUFJLEdBQUc7QUFBQSxRQUM5QjtBQVlBLGlCQUFTLFNBQVMsS0FBSyxPQUFPO0FBQzVCLGNBQUksT0FBTyxLQUFLO0FBQ2hCLGNBQUksZ0JBQWdCLFdBQVc7QUFDN0IsZ0JBQUksUUFBUSxLQUFLO0FBQ2pCLGdCQUFJLENBQUNKLFFBQVEsTUFBTSxTQUFTLG1CQUFtQixHQUFJO0FBQ2pELG9CQUFNLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUN2QixtQkFBSyxPQUFPLEVBQUUsS0FBSztBQUNuQixxQkFBTztBQUFBLFlBQ1Q7QUFDQSxtQkFBTyxLQUFLLFdBQVcsSUFBSSxTQUFTLEtBQUs7QUFBQSxVQUMzQztBQUNBLGVBQUssSUFBSSxLQUFLLEtBQUs7QUFDbkIsZUFBSyxPQUFPLEtBQUs7QUFDakIsaUJBQU87QUFBQSxRQUNUO0FBR0EsY0FBTSxVQUFVLFFBQVE7QUFDeEIsY0FBTSxVQUFVLFFBQVEsSUFBSTtBQUM1QixjQUFNLFVBQVUsTUFBTTtBQUN0QixjQUFNLFVBQVUsTUFBTTtBQUN0QixjQUFNLFVBQVUsTUFBTTtBQVl0QixpQkFBUyxjQUFjLE9BQU8sV0FBVztBQUN2QyxjQUFJLFFBQVEsUUFBUSxLQUFLLEdBQ3JCLFFBQVEsQ0FBQyxTQUFTLFlBQVksS0FBSyxHQUNuQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsU0FBUyxLQUFLLEdBQzNDVSxVQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLGFBQWEsS0FBSyxHQUMxRCxjQUFjLFNBQVMsU0FBUyxVQUFVQSxTQUMxQ04sVUFBUyxjQUFjLFVBQVUsTUFBTSxRQUFRWCxPQUFNLElBQUksQ0FBQyxHQUMxRCxTQUFTVyxRQUFPO0FBRXBCLG1CQUFTLE9BQU8sT0FBTztBQUNyQixpQkFBSyxhQUFhVCxnQkFBZSxLQUFLLE9BQU8sR0FBRyxNQUM1QyxFQUFFO0FBQUEsYUFFQyxPQUFPO0FBQUEsWUFFTixXQUFXLE9BQU8sWUFBWSxPQUFPO0FBQUEsWUFFckNlLFlBQVcsT0FBTyxZQUFZLE9BQU8sZ0JBQWdCLE9BQU87QUFBQSxZQUU3RCxRQUFRLEtBQUssTUFBTSxLQUNsQjtBQUNOLGNBQUFOLFFBQU8sS0FBSyxHQUFHO0FBQUEsWUFDakI7QUFBQSxVQUNGO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQVNBLGlCQUFTLFlBQVksT0FBTztBQUMxQixjQUFJLFNBQVMsTUFBTTtBQUNuQixpQkFBTyxTQUFTLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLElBQUkxQjtBQUFBLFFBQ3JEO0FBVUEsaUJBQVMsZ0JBQWdCLE9BQU8sR0FBRztBQUNqQyxpQkFBTyxZQUFZLFVBQVUsS0FBSyxHQUFHLFVBQVUsR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDO0FBQUEsUUFDcEU7QUFTQSxpQkFBUyxhQUFhLE9BQU87QUFDM0IsaUJBQU8sWUFBWSxVQUFVLEtBQUssQ0FBQztBQUFBLFFBQ3JDO0FBV0EsaUJBQVMsaUJBQWlCLFFBQVEsS0FBSyxPQUFPO0FBQzVDLGNBQUssVUFBVUEsY0FBYSxDQUFDLEdBQUcsT0FBTyxHQUFHLEdBQUcsS0FBSyxLQUM3QyxVQUFVQSxjQUFhLEVBQUUsT0FBTyxTQUFVO0FBQzdDLDRCQUFnQixRQUFRLEtBQUssS0FBSztBQUFBLFVBQ3BDO0FBQUEsUUFDRjtBQVlBLGlCQUFTLFlBQVksUUFBUSxLQUFLLE9BQU87QUFDdkMsY0FBSSxXQUFXLE9BQU8sR0FBRztBQUN6QixjQUFJLEVBQUVpQixnQkFBZSxLQUFLLFFBQVEsR0FBRyxLQUFLLEdBQUcsVUFBVSxLQUFLLE1BQ3ZELFVBQVVqQixjQUFhLEVBQUUsT0FBTyxTQUFVO0FBQzdDLDRCQUFnQixRQUFRLEtBQUssS0FBSztBQUFBLFVBQ3BDO0FBQUEsUUFDRjtBQVVBLGlCQUFTLGFBQWEsT0FBTyxLQUFLO0FBQ2hDLGNBQUksU0FBUyxNQUFNO0FBQ25CLGlCQUFPLFVBQVU7QUFDZixnQkFBSSxHQUFHLE1BQU0sTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUc7QUFDN0IscUJBQU87QUFBQSxZQUNUO0FBQUEsVUFDRjtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQWFBLGlCQUFTLGVBQWUsWUFBWSxRQUFRNkIsV0FBVSxhQUFhO0FBQ2pFLG1CQUFTLFlBQVksU0FBUyxPQUFPLEtBQUsxQixhQUFZO0FBQ3BELG1CQUFPLGFBQWEsT0FBTzBCLFVBQVMsS0FBSyxHQUFHMUIsV0FBVTtBQUFBLFVBQ3hELENBQUM7QUFDRCxpQkFBTztBQUFBLFFBQ1Q7QUFXQSxpQkFBUyxXQUFXLFFBQVE4QixTQUFRO0FBQ2xDLGlCQUFPLFVBQVUsV0FBV0EsU0FBUUMsTUFBS0QsT0FBTSxHQUFHLE1BQU07QUFBQSxRQUMxRDtBQVdBLGlCQUFTLGFBQWEsUUFBUUEsU0FBUTtBQUNwQyxpQkFBTyxVQUFVLFdBQVdBLFNBQVEsT0FBT0EsT0FBTSxHQUFHLE1BQU07QUFBQSxRQUM1RDtBQVdBLGlCQUFTLGdCQUFnQixRQUFRLEtBQUssT0FBTztBQUMzQyxjQUFJLE9BQU8sZUFBZSxnQkFBZ0I7QUFDeEMsMkJBQWUsUUFBUSxLQUFLO0FBQUEsY0FDMUIsZ0JBQWdCO0FBQUEsY0FDaEIsY0FBYztBQUFBLGNBQ2QsU0FBUztBQUFBLGNBQ1QsWUFBWTtBQUFBLFlBQ2QsQ0FBQztBQUFBLFVBQ0gsT0FBTztBQUNMLG1CQUFPLEdBQUcsSUFBSTtBQUFBLFVBQ2hCO0FBQUEsUUFDRjtBQVVBLGlCQUFTLE9BQU8sUUFBUSxPQUFPO0FBQzdCLGNBQUksUUFBUSxJQUNSLFNBQVMsTUFBTSxRQUNmUCxVQUFTbEIsT0FBTSxNQUFNLEdBQ3JCLE9BQU8sVUFBVTtBQUVyQixpQkFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixZQUFBa0IsUUFBTyxLQUFLLElBQUksT0FBTzFCLGFBQVltQyxLQUFJLFFBQVEsTUFBTSxLQUFLLENBQUM7QUFBQSxVQUM3RDtBQUNBLGlCQUFPVDtBQUFBLFFBQ1Q7QUFXQSxpQkFBUyxVQUFVLFFBQVEsT0FBTyxPQUFPO0FBQ3ZDLGNBQUksV0FBVyxRQUFRO0FBQ3JCLGdCQUFJLFVBQVUxQixZQUFXO0FBQ3ZCLHVCQUFTLFVBQVUsUUFBUSxTQUFTO0FBQUEsWUFDdEM7QUFDQSxnQkFBSSxVQUFVQSxZQUFXO0FBQ3ZCLHVCQUFTLFVBQVUsUUFBUSxTQUFTO0FBQUEsWUFDdEM7QUFBQSxVQUNGO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBa0JBLGlCQUFTLFVBQVUsT0FBTyxTQUFTLFlBQVksS0FBSyxRQUFRLE9BQU87QUFDakUsY0FBSTBCLFNBQ0EsU0FBUyxVQUFVLGlCQUNuQixTQUFTLFVBQVUsaUJBQ25CLFNBQVMsVUFBVTtBQUV2QixjQUFJLFlBQVk7QUFDZCxZQUFBQSxVQUFTLFNBQVMsV0FBVyxPQUFPLEtBQUssUUFBUSxLQUFLLElBQUksV0FBVyxLQUFLO0FBQUEsVUFDNUU7QUFDQSxjQUFJQSxZQUFXMUIsWUFBVztBQUN4QixtQkFBTzBCO0FBQUEsVUFDVDtBQUNBLGNBQUksQ0FBQyxTQUFTLEtBQUssR0FBRztBQUNwQixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3pCLGNBQUksT0FBTztBQUNULFlBQUFBLFVBQVMsZUFBZSxLQUFLO0FBQzdCLGdCQUFJLENBQUMsUUFBUTtBQUNYLHFCQUFPLFVBQVUsT0FBT0EsT0FBTTtBQUFBLFlBQ2hDO0FBQUEsVUFDRixPQUFPO0FBQ0wsZ0JBQUksTUFBTSxPQUFPLEtBQUssR0FDbEIsU0FBUyxPQUFPLFdBQVcsT0FBTztBQUV0QyxnQkFBSSxTQUFTLEtBQUssR0FBRztBQUNuQixxQkFBTyxZQUFZLE9BQU8sTUFBTTtBQUFBLFlBQ2xDO0FBQ0EsZ0JBQUksT0FBTyxhQUFhLE9BQU8sV0FBWSxVQUFVLENBQUMsUUFBUztBQUM3RCxjQUFBQSxVQUFVLFVBQVUsU0FBVSxDQUFDLElBQUksZ0JBQWdCLEtBQUs7QUFDeEQsa0JBQUksQ0FBQyxRQUFRO0FBQ1gsdUJBQU8sU0FDSCxjQUFjLE9BQU8sYUFBYUEsU0FBUSxLQUFLLENBQUMsSUFDaEQsWUFBWSxPQUFPLFdBQVdBLFNBQVEsS0FBSyxDQUFDO0FBQUEsY0FDbEQ7QUFBQSxZQUNGLE9BQU87QUFDTCxrQkFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHO0FBQ3ZCLHVCQUFPLFNBQVMsUUFBUSxDQUFDO0FBQUEsY0FDM0I7QUFDQSxjQUFBQSxVQUFTLGVBQWUsT0FBTyxLQUFLLE1BQU07QUFBQSxZQUM1QztBQUFBLFVBQ0Y7QUFFQSxvQkFBVSxRQUFRLElBQUk7QUFDdEIsY0FBSSxVQUFVLE1BQU0sSUFBSSxLQUFLO0FBQzdCLGNBQUksU0FBUztBQUNYLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGdCQUFNLElBQUksT0FBT0EsT0FBTTtBQUV2QixjQUFJLE1BQU0sS0FBSyxHQUFHO0FBQ2hCLGtCQUFNLFFBQVEsU0FBUyxVQUFVO0FBQy9CLGNBQUFBLFFBQU8sSUFBSSxVQUFVLFVBQVUsU0FBUyxZQUFZLFVBQVUsT0FBTyxLQUFLLENBQUM7QUFBQSxZQUM3RSxDQUFDO0FBQUEsVUFDSCxXQUFXLE1BQU0sS0FBSyxHQUFHO0FBQ3ZCLGtCQUFNLFFBQVEsU0FBUyxVQUFVVSxNQUFLO0FBQ3BDLGNBQUFWLFFBQU8sSUFBSVUsTUFBSyxVQUFVLFVBQVUsU0FBUyxZQUFZQSxNQUFLLE9BQU8sS0FBSyxDQUFDO0FBQUEsWUFDN0UsQ0FBQztBQUFBLFVBQ0g7QUFFQSxjQUFJLFdBQVcsU0FDVixTQUFTLGVBQWUsYUFDeEIsU0FBUyxTQUFTRjtBQUV2QixjQUFJLFFBQVEsUUFBUWxDLGFBQVksU0FBUyxLQUFLO0FBQzlDLG9CQUFVLFNBQVMsT0FBTyxTQUFTLFVBQVVvQyxNQUFLO0FBQ2hELGdCQUFJLE9BQU87QUFDVCxjQUFBQSxPQUFNO0FBQ04seUJBQVcsTUFBTUEsSUFBRztBQUFBLFlBQ3RCO0FBRUEsd0JBQVlWLFNBQVFVLE1BQUssVUFBVSxVQUFVLFNBQVMsWUFBWUEsTUFBSyxPQUFPLEtBQUssQ0FBQztBQUFBLFVBQ3RGLENBQUM7QUFDRCxpQkFBT1Y7QUFBQSxRQUNUO0FBU0EsaUJBQVMsYUFBYU8sU0FBUTtBQUM1QixjQUFJLFFBQVFDLE1BQUtELE9BQU07QUFDdkIsaUJBQU8sU0FBUyxRQUFRO0FBQ3RCLG1CQUFPLGVBQWUsUUFBUUEsU0FBUSxLQUFLO0FBQUEsVUFDN0M7QUFBQSxRQUNGO0FBVUEsaUJBQVMsZUFBZSxRQUFRQSxTQUFRLE9BQU87QUFDN0MsY0FBSSxTQUFTLE1BQU07QUFDbkIsY0FBSSxVQUFVLE1BQU07QUFDbEIsbUJBQU8sQ0FBQztBQUFBLFVBQ1Y7QUFDQSxtQkFBU3BCLFFBQU8sTUFBTTtBQUN0QixpQkFBTyxVQUFVO0FBQ2YsZ0JBQUksTUFBTSxNQUFNLE1BQU0sR0FDbEIsWUFBWW9CLFFBQU8sR0FBRyxHQUN0QixRQUFRLE9BQU8sR0FBRztBQUV0QixnQkFBSyxVQUFVakMsY0FBYSxFQUFFLE9BQU8sV0FBWSxDQUFDLFVBQVUsS0FBSyxHQUFHO0FBQ2xFLHFCQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFZQSxpQkFBUyxVQUFVLE1BQU0sTUFBTSxNQUFNO0FBQ25DLGNBQUksT0FBTyxRQUFRLFlBQVk7QUFDN0Isa0JBQU0sSUFBSWdCLFdBQVUsZUFBZTtBQUFBLFVBQ3JDO0FBQ0EsaUJBQU9xQixZQUFXLFdBQVc7QUFBRSxpQkFBSyxNQUFNckMsWUFBVyxJQUFJO0FBQUEsVUFBRyxHQUFHLElBQUk7QUFBQSxRQUNyRTtBQWFBLGlCQUFTLGVBQWUsT0FBTytCLFNBQVFGLFdBQVUsWUFBWTtBQUMzRCxjQUFJLFFBQVEsSUFDUlMsWUFBVyxlQUNYLFdBQVcsTUFDWCxTQUFTLE1BQU0sUUFDZlosVUFBUyxDQUFDLEdBQ1YsZUFBZUssUUFBTztBQUUxQixjQUFJLENBQUMsUUFBUTtBQUNYLG1CQUFPTDtBQUFBLFVBQ1Q7QUFDQSxjQUFJRyxXQUFVO0FBQ1osWUFBQUUsVUFBUyxTQUFTQSxTQUFRLFVBQVVGLFNBQVEsQ0FBQztBQUFBLFVBQy9DO0FBQ0EsY0FBSSxZQUFZO0FBQ2QsWUFBQVMsWUFBVztBQUNYLHVCQUFXO0FBQUEsVUFDYixXQUNTUCxRQUFPLFVBQVUsa0JBQWtCO0FBQzFDLFlBQUFPLFlBQVc7QUFDWCx1QkFBVztBQUNYLFlBQUFQLFVBQVMsSUFBSSxTQUFTQSxPQUFNO0FBQUEsVUFDOUI7QUFDQTtBQUNBLG1CQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGtCQUFJLFFBQVEsTUFBTSxLQUFLLEdBQ25CLFdBQVdGLGFBQVksT0FBTyxRQUFRQSxVQUFTLEtBQUs7QUFFeEQsc0JBQVMsY0FBYyxVQUFVLElBQUssUUFBUTtBQUM5QyxrQkFBSSxZQUFZLGFBQWEsVUFBVTtBQUNyQyxvQkFBSSxjQUFjO0FBQ2xCLHVCQUFPLGVBQWU7QUFDcEIsc0JBQUlFLFFBQU8sV0FBVyxNQUFNLFVBQVU7QUFDcEMsNkJBQVM7QUFBQSxrQkFDWDtBQUFBLGdCQUNGO0FBQ0EsZ0JBQUFMLFFBQU8sS0FBSyxLQUFLO0FBQUEsY0FDbkIsV0FDUyxDQUFDWSxVQUFTUCxTQUFRLFVBQVUsVUFBVSxHQUFHO0FBQ2hELGdCQUFBTCxRQUFPLEtBQUssS0FBSztBQUFBLGNBQ25CO0FBQUEsWUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFVQSxZQUFJLFdBQVcsZUFBZSxVQUFVO0FBVXhDLFlBQUksZ0JBQWdCLGVBQWUsaUJBQWlCLElBQUk7QUFXeEQsaUJBQVMsVUFBVSxZQUFZLFdBQVc7QUFDeEMsY0FBSUEsVUFBUztBQUNiLG1CQUFTLFlBQVksU0FBUyxPQUFPLE9BQU92QixhQUFZO0FBQ3RELFlBQUF1QixVQUFTLENBQUMsQ0FBQyxVQUFVLE9BQU8sT0FBT3ZCLFdBQVU7QUFDN0MsbUJBQU91QjtBQUFBLFVBQ1QsQ0FBQztBQUNELGlCQUFPQTtBQUFBLFFBQ1Q7QUFZQSxpQkFBUyxhQUFhLE9BQU9HLFdBQVUsWUFBWTtBQUNqRCxjQUFJLFFBQVEsSUFDUixTQUFTLE1BQU07QUFFbkIsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksUUFBUSxNQUFNLEtBQUssR0FDbkIsVUFBVUEsVUFBUyxLQUFLO0FBRTVCLGdCQUFJLFdBQVcsU0FBUyxhQUFhN0IsYUFDNUIsWUFBWSxXQUFXLENBQUMsU0FBUyxPQUFPLElBQ3pDLFdBQVcsU0FBUyxRQUFRLElBQzdCO0FBQ0wsa0JBQUksV0FBVyxTQUNYMEIsVUFBUztBQUFBLFlBQ2Y7QUFBQSxVQUNGO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQVlBLGlCQUFTLFNBQVMsT0FBTyxPQUFPQyxRQUFPQyxNQUFLO0FBQzFDLGNBQUksU0FBUyxNQUFNO0FBRW5CLFVBQUFELFNBQVEsVUFBVUEsTUFBSztBQUN2QixjQUFJQSxTQUFRLEdBQUc7QUFDYixZQUFBQSxTQUFRLENBQUNBLFNBQVEsU0FBUyxJQUFLLFNBQVNBO0FBQUEsVUFDMUM7QUFDQSxVQUFBQyxPQUFPQSxTQUFRNUIsY0FBYTRCLE9BQU0sU0FBVSxTQUFTLFVBQVVBLElBQUc7QUFDbEUsY0FBSUEsT0FBTSxHQUFHO0FBQ1gsWUFBQUEsUUFBTztBQUFBLFVBQ1Q7QUFDQSxVQUFBQSxPQUFNRCxTQUFRQyxPQUFNLElBQUksU0FBU0EsSUFBRztBQUNwQyxpQkFBT0QsU0FBUUMsTUFBSztBQUNsQixrQkFBTUQsUUFBTyxJQUFJO0FBQUEsVUFDbkI7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxXQUFXLFlBQVksV0FBVztBQUN6QyxjQUFJRCxVQUFTLENBQUM7QUFDZCxtQkFBUyxZQUFZLFNBQVMsT0FBTyxPQUFPdkIsYUFBWTtBQUN0RCxnQkFBSSxVQUFVLE9BQU8sT0FBT0EsV0FBVSxHQUFHO0FBQ3ZDLGNBQUF1QixRQUFPLEtBQUssS0FBSztBQUFBLFlBQ25CO0FBQUEsVUFDRixDQUFDO0FBQ0QsaUJBQU9BO0FBQUEsUUFDVDtBQWFBLGlCQUFTLFlBQVksT0FBTyxPQUFPLFdBQVcsVUFBVUEsU0FBUTtBQUM5RCxjQUFJLFFBQVEsSUFDUixTQUFTLE1BQU07QUFFbkIsd0JBQWMsWUFBWTtBQUMxQixVQUFBQSxZQUFXQSxVQUFTLENBQUM7QUFFckIsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksUUFBUSxNQUFNLEtBQUs7QUFDdkIsZ0JBQUksUUFBUSxLQUFLLFVBQVUsS0FBSyxHQUFHO0FBQ2pDLGtCQUFJLFFBQVEsR0FBRztBQUViLDRCQUFZLE9BQU8sUUFBUSxHQUFHLFdBQVcsVUFBVUEsT0FBTTtBQUFBLGNBQzNELE9BQU87QUFDTCwwQkFBVUEsU0FBUSxLQUFLO0FBQUEsY0FDekI7QUFBQSxZQUNGLFdBQVcsQ0FBQyxVQUFVO0FBQ3BCLGNBQUFBLFFBQU9BLFFBQU8sTUFBTSxJQUFJO0FBQUEsWUFDMUI7QUFBQSxVQUNGO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQWFBLFlBQUksVUFBVSxjQUFjO0FBWTVCLFlBQUksZUFBZSxjQUFjLElBQUk7QUFVckMsaUJBQVMsV0FBVyxRQUFRRyxXQUFVO0FBQ3BDLGlCQUFPLFVBQVUsUUFBUSxRQUFRQSxXQUFVSyxLQUFJO0FBQUEsUUFDakQ7QUFVQSxpQkFBUyxnQkFBZ0IsUUFBUUwsV0FBVTtBQUN6QyxpQkFBTyxVQUFVLGFBQWEsUUFBUUEsV0FBVUssS0FBSTtBQUFBLFFBQ3REO0FBV0EsaUJBQVMsY0FBYyxRQUFRLE9BQU87QUFDcEMsaUJBQU8sWUFBWSxPQUFPLFNBQVMsS0FBSztBQUN0QyxtQkFBT0ssWUFBVyxPQUFPLEdBQUcsQ0FBQztBQUFBLFVBQy9CLENBQUM7QUFBQSxRQUNIO0FBVUEsaUJBQVMsUUFBUSxRQUFRLE1BQU07QUFDN0IsaUJBQU8sU0FBUyxNQUFNLE1BQU07QUFFNUIsY0FBSSxRQUFRLEdBQ1IsU0FBUyxLQUFLO0FBRWxCLGlCQUFPLFVBQVUsUUFBUSxRQUFRLFFBQVE7QUFDdkMscUJBQVMsT0FBTyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUM7QUFBQSxVQUN0QztBQUNBLGlCQUFRLFNBQVMsU0FBUyxTQUFVLFNBQVN2QztBQUFBLFFBQy9DO0FBYUEsaUJBQVMsZUFBZSxRQUFRLFVBQVUsYUFBYTtBQUNyRCxjQUFJMEIsVUFBUyxTQUFTLE1BQU07QUFDNUIsaUJBQU8sUUFBUSxNQUFNLElBQUlBLFVBQVMsVUFBVUEsU0FBUSxZQUFZLE1BQU0sQ0FBQztBQUFBLFFBQ3pFO0FBU0EsaUJBQVMsV0FBVyxPQUFPO0FBQ3pCLGNBQUksU0FBUyxNQUFNO0FBQ2pCLG1CQUFPLFVBQVUxQixhQUFZLGVBQWU7QUFBQSxVQUM5QztBQUNBLGlCQUFRLGtCQUFrQixrQkFBa0JhLFFBQU8sS0FBSyxJQUNwRCxVQUFVLEtBQUssSUFDZixlQUFlLEtBQUs7QUFBQSxRQUMxQjtBQVdBLGlCQUFTLE9BQU8sT0FBTyxPQUFPO0FBQzVCLGlCQUFPLFFBQVE7QUFBQSxRQUNqQjtBQVVBLGlCQUFTLFFBQVEsUUFBUSxLQUFLO0FBQzVCLGlCQUFPLFVBQVUsUUFBUUksZ0JBQWUsS0FBSyxRQUFRLEdBQUc7QUFBQSxRQUMxRDtBQVVBLGlCQUFTLFVBQVUsUUFBUSxLQUFLO0FBQzlCLGlCQUFPLFVBQVUsUUFBUSxPQUFPSixRQUFPLE1BQU07QUFBQSxRQUMvQztBQVdBLGlCQUFTLFlBQVksUUFBUWMsUUFBT0MsTUFBSztBQUN2QyxpQkFBTyxVQUFVLFVBQVVELFFBQU9DLElBQUcsS0FBSyxTQUFTLFVBQVVELFFBQU9DLElBQUc7QUFBQSxRQUN6RTtBQVlBLGlCQUFTLGlCQUFpQixRQUFRQyxXQUFVLFlBQVk7QUFDdEQsY0FBSVMsWUFBVyxhQUFhLG9CQUFvQixlQUM1QyxTQUFTLE9BQU8sQ0FBQyxFQUFFLFFBQ25CLFlBQVksT0FBTyxRQUNuQixXQUFXLFdBQ1gsU0FBUzlCLE9BQU0sU0FBUyxHQUN4QixZQUFZLFVBQ1prQixVQUFTLENBQUM7QUFFZCxpQkFBTyxZQUFZO0FBQ2pCLGdCQUFJLFFBQVEsT0FBTyxRQUFRO0FBQzNCLGdCQUFJLFlBQVlHLFdBQVU7QUFDeEIsc0JBQVEsU0FBUyxPQUFPLFVBQVVBLFNBQVEsQ0FBQztBQUFBLFlBQzdDO0FBQ0Esd0JBQVksVUFBVSxNQUFNLFFBQVEsU0FBUztBQUM3QyxtQkFBTyxRQUFRLElBQUksQ0FBQyxlQUFlQSxhQUFhLFVBQVUsT0FBTyxNQUFNLFVBQVUsT0FDN0UsSUFBSSxTQUFTLFlBQVksS0FBSyxJQUM5QjdCO0FBQUEsVUFDTjtBQUNBLGtCQUFRLE9BQU8sQ0FBQztBQUVoQixjQUFJLFFBQVEsSUFDUixPQUFPLE9BQU8sQ0FBQztBQUVuQjtBQUNBLG1CQUFPLEVBQUUsUUFBUSxVQUFVMEIsUUFBTyxTQUFTLFdBQVc7QUFDcEQsa0JBQUksUUFBUSxNQUFNLEtBQUssR0FDbkIsV0FBV0csWUFBV0EsVUFBUyxLQUFLLElBQUk7QUFFNUMsc0JBQVMsY0FBYyxVQUFVLElBQUssUUFBUTtBQUM5QyxrQkFBSSxFQUFFLE9BQ0UsU0FBUyxNQUFNLFFBQVEsSUFDdkJTLFVBQVNaLFNBQVEsVUFBVSxVQUFVLElBQ3RDO0FBQ0wsMkJBQVc7QUFDWCx1QkFBTyxFQUFFLFVBQVU7QUFDakIsc0JBQUl0QixTQUFRLE9BQU8sUUFBUTtBQUMzQixzQkFBSSxFQUFFQSxTQUNFLFNBQVNBLFFBQU8sUUFBUSxJQUN4QmtDLFVBQVMsT0FBTyxRQUFRLEdBQUcsVUFBVSxVQUFVLElBQ2pEO0FBQ0osNkJBQVM7QUFBQSxrQkFDWDtBQUFBLGdCQUNGO0FBQ0Esb0JBQUksTUFBTTtBQUNSLHVCQUFLLEtBQUssUUFBUTtBQUFBLGdCQUNwQjtBQUNBLGdCQUFBWixRQUFPLEtBQUssS0FBSztBQUFBLGNBQ25CO0FBQUEsWUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFhQSxpQkFBUyxhQUFhLFFBQVEsUUFBUUcsV0FBVSxhQUFhO0FBQzNELHFCQUFXLFFBQVEsU0FBUyxPQUFPLEtBQUtXLFNBQVE7QUFDOUMsbUJBQU8sYUFBYVgsVUFBUyxLQUFLLEdBQUcsS0FBS1csT0FBTTtBQUFBLFVBQ2xELENBQUM7QUFDRCxpQkFBTztBQUFBLFFBQ1Q7QUFZQSxpQkFBUyxXQUFXLFFBQVEsTUFBTSxNQUFNO0FBQ3RDLGlCQUFPLFNBQVMsTUFBTSxNQUFNO0FBQzVCLG1CQUFTLE9BQU8sUUFBUSxJQUFJO0FBQzVCLGNBQUksT0FBTyxVQUFVLE9BQU8sU0FBUyxPQUFPLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztBQUM3RCxpQkFBTyxRQUFRLE9BQU94QyxhQUFZQyxPQUFNLE1BQU0sUUFBUSxJQUFJO0FBQUEsUUFDNUQ7QUFTQSxpQkFBUyxnQkFBZ0IsT0FBTztBQUM5QixpQkFBTyxhQUFhLEtBQUssS0FBSyxXQUFXLEtBQUssS0FBSztBQUFBLFFBQ3JEO0FBU0EsaUJBQVMsa0JBQWtCLE9BQU87QUFDaEMsaUJBQU8sYUFBYSxLQUFLLEtBQUssV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUNyRDtBQVNBLGlCQUFTLFdBQVcsT0FBTztBQUN6QixpQkFBTyxhQUFhLEtBQUssS0FBSyxXQUFXLEtBQUssS0FBSztBQUFBLFFBQ3JEO0FBZ0JBLGlCQUFTLFlBQVksT0FBTyxPQUFPLFNBQVMsWUFBWSxPQUFPO0FBQzdELGNBQUksVUFBVSxPQUFPO0FBQ25CLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUksU0FBUyxRQUFRLFNBQVMsUUFBUyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsYUFBYSxLQUFLLEdBQUk7QUFDcEYsbUJBQU8sVUFBVSxTQUFTLFVBQVU7QUFBQSxVQUN0QztBQUNBLGlCQUFPLGdCQUFnQixPQUFPLE9BQU8sU0FBUyxZQUFZLGFBQWEsS0FBSztBQUFBLFFBQzlFO0FBZ0JBLGlCQUFTLGdCQUFnQixRQUFRLE9BQU8sU0FBUyxZQUFZLFdBQVcsT0FBTztBQUM3RSxjQUFJLFdBQVcsUUFBUSxNQUFNLEdBQ3pCLFdBQVcsUUFBUSxLQUFLLEdBQ3hCLFNBQVMsV0FBVyxXQUFXLE9BQU8sTUFBTSxHQUM1QyxTQUFTLFdBQVcsV0FBVyxPQUFPLEtBQUs7QUFFL0MsbUJBQVMsVUFBVSxVQUFVLFlBQVk7QUFDekMsbUJBQVMsVUFBVSxVQUFVLFlBQVk7QUFFekMsY0FBSSxXQUFXLFVBQVUsV0FDckIsV0FBVyxVQUFVLFdBQ3JCLFlBQVksVUFBVTtBQUUxQixjQUFJLGFBQWEsU0FBUyxNQUFNLEdBQUc7QUFDakMsZ0JBQUksQ0FBQyxTQUFTLEtBQUssR0FBRztBQUNwQixxQkFBTztBQUFBLFlBQ1Q7QUFDQSx1QkFBVztBQUNYLHVCQUFXO0FBQUEsVUFDYjtBQUNBLGNBQUksYUFBYSxDQUFDLFVBQVU7QUFDMUIsc0JBQVUsUUFBUSxJQUFJO0FBQ3RCLG1CQUFRLFlBQVksYUFBYSxNQUFNLElBQ25DLFlBQVksUUFBUSxPQUFPLFNBQVMsWUFBWSxXQUFXLEtBQUssSUFDaEUsV0FBVyxRQUFRLE9BQU8sUUFBUSxTQUFTLFlBQVksV0FBVyxLQUFLO0FBQUEsVUFDN0U7QUFDQSxjQUFJLEVBQUUsVUFBVSx1QkFBdUI7QUFDckMsZ0JBQUksZUFBZSxZQUFZZ0IsZ0JBQWUsS0FBSyxRQUFRLGFBQWEsR0FDcEUsZUFBZSxZQUFZQSxnQkFBZSxLQUFLLE9BQU8sYUFBYTtBQUV2RSxnQkFBSSxnQkFBZ0IsY0FBYztBQUNoQyxrQkFBSSxlQUFlLGVBQWUsT0FBTyxNQUFNLElBQUksUUFDL0MsZUFBZSxlQUFlLE1BQU0sTUFBTSxJQUFJO0FBRWxELHdCQUFVLFFBQVEsSUFBSTtBQUN0QixxQkFBTyxVQUFVLGNBQWMsY0FBYyxTQUFTLFlBQVksS0FBSztBQUFBLFlBQ3pFO0FBQUEsVUFDRjtBQUNBLGNBQUksQ0FBQyxXQUFXO0FBQ2QsbUJBQU87QUFBQSxVQUNUO0FBQ0Esb0JBQVUsUUFBUSxJQUFJO0FBQ3RCLGlCQUFPLGFBQWEsUUFBUSxPQUFPLFNBQVMsWUFBWSxXQUFXLEtBQUs7QUFBQSxRQUMxRTtBQVNBLGlCQUFTLFVBQVUsT0FBTztBQUN4QixpQkFBTyxhQUFhLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSztBQUFBLFFBQ2pEO0FBWUEsaUJBQVMsWUFBWSxRQUFRZ0IsU0FBUSxXQUFXLFlBQVk7QUFDMUQsY0FBSSxRQUFRLFVBQVUsUUFDbEIsU0FBUyxPQUNULGVBQWUsQ0FBQztBQUVwQixjQUFJLFVBQVUsTUFBTTtBQUNsQixtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLG1CQUFTcEIsUUFBTyxNQUFNO0FBQ3RCLGlCQUFPLFNBQVM7QUFDZCxnQkFBSSxPQUFPLFVBQVUsS0FBSztBQUMxQixnQkFBSyxnQkFBZ0IsS0FBSyxDQUFDLElBQ25CLEtBQUssQ0FBQyxNQUFNLE9BQU8sS0FBSyxDQUFDLENBQUMsSUFDMUIsRUFBRSxLQUFLLENBQUMsS0FBSyxTQUNmO0FBQ0oscUJBQU87QUFBQSxZQUNUO0FBQUEsVUFDRjtBQUNBLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLG1CQUFPLFVBQVUsS0FBSztBQUN0QixnQkFBSSxNQUFNLEtBQUssQ0FBQyxHQUNaLFdBQVcsT0FBTyxHQUFHLEdBQ3JCLFdBQVcsS0FBSyxDQUFDO0FBRXJCLGdCQUFJLGdCQUFnQixLQUFLLENBQUMsR0FBRztBQUMzQixrQkFBSSxhQUFhYixjQUFhLEVBQUUsT0FBTyxTQUFTO0FBQzlDLHVCQUFPO0FBQUEsY0FDVDtBQUFBLFlBQ0YsT0FBTztBQUNMLGtCQUFJLFFBQVEsSUFBSTtBQUNoQixrQkFBSSxZQUFZO0FBQ2Qsb0JBQUkwQixVQUFTLFdBQVcsVUFBVSxVQUFVLEtBQUssUUFBUU8sU0FBUSxLQUFLO0FBQUEsY0FDeEU7QUFDQSxrQkFBSSxFQUFFUCxZQUFXMUIsYUFDVCxZQUFZLFVBQVUsVUFBVSx1QkFBdUIsd0JBQXdCLFlBQVksS0FBSyxJQUNoRzBCLFVBQ0Q7QUFDTCx1QkFBTztBQUFBLGNBQ1Q7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQVVBLGlCQUFTLGFBQWEsT0FBTztBQUMzQixjQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssU0FBUyxLQUFLLEdBQUc7QUFDdkMsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxVQUFVYSxZQUFXLEtBQUssSUFBSSxhQUFhO0FBQy9DLGlCQUFPLFFBQVEsS0FBSyxTQUFTLEtBQUssQ0FBQztBQUFBLFFBQ3JDO0FBU0EsaUJBQVMsYUFBYSxPQUFPO0FBQzNCLGlCQUFPLGFBQWEsS0FBSyxLQUFLLFdBQVcsS0FBSyxLQUFLO0FBQUEsUUFDckQ7QUFTQSxpQkFBUyxVQUFVLE9BQU87QUFDeEIsaUJBQU8sYUFBYSxLQUFLLEtBQUssT0FBTyxLQUFLLEtBQUs7QUFBQSxRQUNqRDtBQVNBLGlCQUFTLGlCQUFpQixPQUFPO0FBQy9CLGlCQUFPLGFBQWEsS0FBSyxLQUN2QixTQUFTLE1BQU0sTUFBTSxLQUFLLENBQUMsQ0FBQyxlQUFlLFdBQVcsS0FBSyxDQUFDO0FBQUEsUUFDaEU7QUFTQSxpQkFBUyxhQUFhLE9BQU87QUFHM0IsY0FBSSxPQUFPLFNBQVMsWUFBWTtBQUM5QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFNBQVMsTUFBTTtBQUNqQixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLG1CQUFPLFFBQVEsS0FBSyxJQUNoQixvQkFBb0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFDdEMsWUFBWSxLQUFLO0FBQUEsVUFDdkI7QUFDQSxpQkFBTyxTQUFTLEtBQUs7QUFBQSxRQUN2QjtBQVNBLGlCQUFTLFNBQVMsUUFBUTtBQUN4QixjQUFJLENBQUMsWUFBWSxNQUFNLEdBQUc7QUFDeEIsbUJBQU8sV0FBVyxNQUFNO0FBQUEsVUFDMUI7QUFDQSxjQUFJYixVQUFTLENBQUM7QUFDZCxtQkFBUyxPQUFPYixRQUFPLE1BQU0sR0FBRztBQUM5QixnQkFBSUksZ0JBQWUsS0FBSyxRQUFRLEdBQUcsS0FBSyxPQUFPLGVBQWU7QUFDNUQsY0FBQVMsUUFBTyxLQUFLLEdBQUc7QUFBQSxZQUNqQjtBQUFBLFVBQ0Y7QUFDQSxpQkFBT0E7QUFBQSxRQUNUO0FBU0EsaUJBQVMsV0FBVyxRQUFRO0FBQzFCLGNBQUksQ0FBQyxTQUFTLE1BQU0sR0FBRztBQUNyQixtQkFBTyxhQUFhLE1BQU07QUFBQSxVQUM1QjtBQUNBLGNBQUksVUFBVSxZQUFZLE1BQU0sR0FDNUJBLFVBQVMsQ0FBQztBQUVkLG1CQUFTLE9BQU8sUUFBUTtBQUN0QixnQkFBSSxFQUFFLE9BQU8sa0JBQWtCLFdBQVcsQ0FBQ1QsZ0JBQWUsS0FBSyxRQUFRLEdBQUcsS0FBSztBQUM3RSxjQUFBUyxRQUFPLEtBQUssR0FBRztBQUFBLFlBQ2pCO0FBQUEsVUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFXQSxpQkFBUyxPQUFPLE9BQU8sT0FBTztBQUM1QixpQkFBTyxRQUFRO0FBQUEsUUFDakI7QUFVQSxpQkFBUyxRQUFRLFlBQVlHLFdBQVU7QUFDckMsY0FBSSxRQUFRLElBQ1JILFVBQVMsWUFBWSxVQUFVLElBQUlsQixPQUFNLFdBQVcsTUFBTSxJQUFJLENBQUM7QUFFbkUsbUJBQVMsWUFBWSxTQUFTLE9BQU8sS0FBS0wsYUFBWTtBQUNwRCxZQUFBdUIsUUFBTyxFQUFFLEtBQUssSUFBSUcsVUFBUyxPQUFPLEtBQUsxQixXQUFVO0FBQUEsVUFDbkQsQ0FBQztBQUNELGlCQUFPdUI7QUFBQSxRQUNUO0FBU0EsaUJBQVMsWUFBWU8sU0FBUTtBQUMzQixjQUFJLFlBQVksYUFBYUEsT0FBTTtBQUNuQyxjQUFJLFVBQVUsVUFBVSxLQUFLLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRztBQUM1QyxtQkFBTyx3QkFBd0IsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUFBLFVBQ2pFO0FBQ0EsaUJBQU8sU0FBUyxRQUFRO0FBQ3RCLG1CQUFPLFdBQVdBLFdBQVUsWUFBWSxRQUFRQSxTQUFRLFNBQVM7QUFBQSxVQUNuRTtBQUFBLFFBQ0Y7QUFVQSxpQkFBUyxvQkFBb0IsTUFBTSxVQUFVO0FBQzNDLGNBQUksTUFBTSxJQUFJLEtBQUssbUJBQW1CLFFBQVEsR0FBRztBQUMvQyxtQkFBTyx3QkFBd0IsTUFBTSxJQUFJLEdBQUcsUUFBUTtBQUFBLFVBQ3REO0FBQ0EsaUJBQU8sU0FBUyxRQUFRO0FBQ3RCLGdCQUFJLFdBQVdFLEtBQUksUUFBUSxJQUFJO0FBQy9CLG1CQUFRLGFBQWFuQyxjQUFhLGFBQWEsV0FDM0MsTUFBTSxRQUFRLElBQUksSUFDbEIsWUFBWSxVQUFVLFVBQVUsdUJBQXVCLHNCQUFzQjtBQUFBLFVBQ25GO0FBQUEsUUFDRjtBQWFBLGlCQUFTLFVBQVUsUUFBUWlDLFNBQVEsVUFBVSxZQUFZLE9BQU87QUFDOUQsY0FBSSxXQUFXQSxTQUFRO0FBQ3JCO0FBQUEsVUFDRjtBQUNBLGtCQUFRQSxTQUFRLFNBQVMsVUFBVSxLQUFLO0FBQ3RDLHNCQUFVLFFBQVEsSUFBSTtBQUN0QixnQkFBSSxTQUFTLFFBQVEsR0FBRztBQUN0Qiw0QkFBYyxRQUFRQSxTQUFRLEtBQUssVUFBVSxXQUFXLFlBQVksS0FBSztBQUFBLFlBQzNFLE9BQ0s7QUFDSCxrQkFBSSxXQUFXLGFBQ1gsV0FBVyxRQUFRLFFBQVEsR0FBRyxHQUFHLFVBQVcsTUFBTSxJQUFLLFFBQVFBLFNBQVEsS0FBSyxJQUM1RWpDO0FBRUosa0JBQUksYUFBYUEsWUFBVztBQUMxQiwyQkFBVztBQUFBLGNBQ2I7QUFDQSwrQkFBaUIsUUFBUSxLQUFLLFFBQVE7QUFBQSxZQUN4QztBQUFBLFVBQ0YsR0FBRyxNQUFNO0FBQUEsUUFDWDtBQWlCQSxpQkFBUyxjQUFjLFFBQVFpQyxTQUFRLEtBQUssVUFBVSxXQUFXLFlBQVksT0FBTztBQUNsRixjQUFJLFdBQVcsUUFBUSxRQUFRLEdBQUcsR0FDOUIsV0FBVyxRQUFRQSxTQUFRLEdBQUcsR0FDOUIsVUFBVSxNQUFNLElBQUksUUFBUTtBQUVoQyxjQUFJLFNBQVM7QUFDWCw2QkFBaUIsUUFBUSxLQUFLLE9BQU87QUFDckM7QUFBQSxVQUNGO0FBQ0EsY0FBSSxXQUFXLGFBQ1gsV0FBVyxVQUFVLFVBQVcsTUFBTSxJQUFLLFFBQVFBLFNBQVEsS0FBSyxJQUNoRWpDO0FBRUosY0FBSSxXQUFXLGFBQWFBO0FBRTVCLGNBQUksVUFBVTtBQUNaLGdCQUFJLFFBQVEsUUFBUSxRQUFRLEdBQ3hCLFNBQVMsQ0FBQyxTQUFTLFNBQVMsUUFBUSxHQUNwQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsYUFBYSxRQUFRO0FBRXhELHVCQUFXO0FBQ1gsZ0JBQUksU0FBUyxVQUFVLFNBQVM7QUFDOUIsa0JBQUksUUFBUSxRQUFRLEdBQUc7QUFDckIsMkJBQVc7QUFBQSxjQUNiLFdBQ1Msa0JBQWtCLFFBQVEsR0FBRztBQUNwQywyQkFBVyxVQUFVLFFBQVE7QUFBQSxjQUMvQixXQUNTLFFBQVE7QUFDZiwyQkFBVztBQUNYLDJCQUFXLFlBQVksVUFBVSxJQUFJO0FBQUEsY0FDdkMsV0FDUyxTQUFTO0FBQ2hCLDJCQUFXO0FBQ1gsMkJBQVcsZ0JBQWdCLFVBQVUsSUFBSTtBQUFBLGNBQzNDLE9BQ0s7QUFDSCwyQkFBVyxDQUFDO0FBQUEsY0FDZDtBQUFBLFlBQ0YsV0FDU3lDLGVBQWMsUUFBUSxLQUFLLFlBQVksUUFBUSxHQUFHO0FBQ3pELHlCQUFXO0FBQ1gsa0JBQUksWUFBWSxRQUFRLEdBQUc7QUFDekIsMkJBQVcsY0FBYyxRQUFRO0FBQUEsY0FDbkMsV0FDUyxDQUFDLFNBQVMsUUFBUSxLQUFLRixZQUFXLFFBQVEsR0FBRztBQUNwRCwyQkFBVyxnQkFBZ0IsUUFBUTtBQUFBLGNBQ3JDO0FBQUEsWUFDRixPQUNLO0FBQ0gseUJBQVc7QUFBQSxZQUNiO0FBQUEsVUFDRjtBQUNBLGNBQUksVUFBVTtBQUVaLGtCQUFNLElBQUksVUFBVSxRQUFRO0FBQzVCLHNCQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksS0FBSztBQUN6RCxrQkFBTSxRQUFRLEVBQUUsUUFBUTtBQUFBLFVBQzFCO0FBQ0EsMkJBQWlCLFFBQVEsS0FBSyxRQUFRO0FBQUEsUUFDeEM7QUFVQSxpQkFBUyxRQUFRLE9BQU8sR0FBRztBQUN6QixjQUFJLFNBQVMsTUFBTTtBQUNuQixjQUFJLENBQUMsUUFBUTtBQUNYO0FBQUEsVUFDRjtBQUNBLGVBQUssSUFBSSxJQUFJLFNBQVM7QUFDdEIsaUJBQU8sUUFBUSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSXZDO0FBQUEsUUFDekM7QUFXQSxpQkFBUyxZQUFZLFlBQVksV0FBVyxRQUFRO0FBQ2xELGNBQUksVUFBVSxRQUFRO0FBQ3BCLHdCQUFZLFNBQVMsV0FBVyxTQUFTNkIsV0FBVTtBQUNqRCxrQkFBSSxRQUFRQSxTQUFRLEdBQUc7QUFDckIsdUJBQU8sU0FBUyxPQUFPO0FBQ3JCLHlCQUFPLFFBQVEsT0FBT0EsVUFBUyxXQUFXLElBQUlBLFVBQVMsQ0FBQyxJQUFJQSxTQUFRO0FBQUEsZ0JBQ3RFO0FBQUEsY0FDRjtBQUNBLHFCQUFPQTtBQUFBLFlBQ1QsQ0FBQztBQUFBLFVBQ0gsT0FBTztBQUNMLHdCQUFZLENBQUMsUUFBUTtBQUFBLFVBQ3ZCO0FBRUEsY0FBSSxRQUFRO0FBQ1osc0JBQVksU0FBUyxXQUFXLFVBQVUsWUFBWSxDQUFDLENBQUM7QUFFeEQsY0FBSUgsVUFBUyxRQUFRLFlBQVksU0FBUyxPQUFPLEtBQUt2QixhQUFZO0FBQ2hFLGdCQUFJLFdBQVcsU0FBUyxXQUFXLFNBQVMwQixXQUFVO0FBQ3BELHFCQUFPQSxVQUFTLEtBQUs7QUFBQSxZQUN2QixDQUFDO0FBQ0QsbUJBQU8sRUFBRSxZQUFZLFVBQVUsU0FBUyxFQUFFLE9BQU8sU0FBUyxNQUFNO0FBQUEsVUFDbEUsQ0FBQztBQUVELGlCQUFPLFdBQVdILFNBQVEsU0FBUyxRQUFRLE9BQU87QUFDaEQsbUJBQU8sZ0JBQWdCLFFBQVEsT0FBTyxNQUFNO0FBQUEsVUFDOUMsQ0FBQztBQUFBLFFBQ0g7QUFXQSxpQkFBUyxTQUFTLFFBQVEsT0FBTztBQUMvQixpQkFBTyxXQUFXLFFBQVEsT0FBTyxTQUFTLE9BQU8sTUFBTTtBQUNyRCxtQkFBTyxNQUFNLFFBQVEsSUFBSTtBQUFBLFVBQzNCLENBQUM7QUFBQSxRQUNIO0FBV0EsaUJBQVMsV0FBVyxRQUFRLE9BQU8sV0FBVztBQUM1QyxjQUFJLFFBQVEsSUFDUixTQUFTLE1BQU0sUUFDZkEsVUFBUyxDQUFDO0FBRWQsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksT0FBTyxNQUFNLEtBQUssR0FDbEIsUUFBUSxRQUFRLFFBQVEsSUFBSTtBQUVoQyxnQkFBSSxVQUFVLE9BQU8sSUFBSSxHQUFHO0FBQzFCLHNCQUFRQSxTQUFRLFNBQVMsTUFBTSxNQUFNLEdBQUcsS0FBSztBQUFBLFlBQy9DO0FBQUEsVUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFTQSxpQkFBUyxpQkFBaUIsTUFBTTtBQUM5QixpQkFBTyxTQUFTLFFBQVE7QUFDdEIsbUJBQU8sUUFBUSxRQUFRLElBQUk7QUFBQSxVQUM3QjtBQUFBLFFBQ0Y7QUFhQSxpQkFBUyxZQUFZLE9BQU9LLFNBQVFGLFdBQVUsWUFBWTtBQUN4RCxjQUFJYSxXQUFVLGFBQWEsa0JBQWtCLGFBQ3pDLFFBQVEsSUFDUixTQUFTWCxRQUFPLFFBQ2hCLE9BQU87QUFFWCxjQUFJLFVBQVVBLFNBQVE7QUFDcEIsWUFBQUEsVUFBUyxVQUFVQSxPQUFNO0FBQUEsVUFDM0I7QUFDQSxjQUFJRixXQUFVO0FBQ1osbUJBQU8sU0FBUyxPQUFPLFVBQVVBLFNBQVEsQ0FBQztBQUFBLFVBQzVDO0FBQ0EsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksWUFBWSxHQUNaLFFBQVFFLFFBQU8sS0FBSyxHQUNwQixXQUFXRixZQUFXQSxVQUFTLEtBQUssSUFBSTtBQUU1QyxvQkFBUSxZQUFZYSxTQUFRLE1BQU0sVUFBVSxXQUFXLFVBQVUsS0FBSyxJQUFJO0FBQ3hFLGtCQUFJLFNBQVMsT0FBTztBQUNsQix1QkFBTyxLQUFLLE1BQU0sV0FBVyxDQUFDO0FBQUEsY0FDaEM7QUFDQSxxQkFBTyxLQUFLLE9BQU8sV0FBVyxDQUFDO0FBQUEsWUFDakM7QUFBQSxVQUNGO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBV0EsaUJBQVMsV0FBVyxPQUFPLFNBQVM7QUFDbEMsY0FBSSxTQUFTLFFBQVEsUUFBUSxTQUFTLEdBQ2xDLFlBQVksU0FBUztBQUV6QixpQkFBTyxVQUFVO0FBQ2YsZ0JBQUksUUFBUSxRQUFRLE1BQU07QUFDMUIsZ0JBQUksVUFBVSxhQUFhLFVBQVUsVUFBVTtBQUM3QyxrQkFBSSxXQUFXO0FBQ2Ysa0JBQUksUUFBUSxLQUFLLEdBQUc7QUFDbEIsdUJBQU8sS0FBSyxPQUFPLE9BQU8sQ0FBQztBQUFBLGNBQzdCLE9BQU87QUFDTCwwQkFBVSxPQUFPLEtBQUs7QUFBQSxjQUN4QjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBV0EsaUJBQVMsV0FBVyxPQUFPLE9BQU87QUFDaEMsaUJBQU8sUUFBUSxZQUFZLGFBQWEsS0FBSyxRQUFRLFFBQVEsRUFBRTtBQUFBLFFBQ2pFO0FBYUEsaUJBQVMsVUFBVWYsUUFBT0MsTUFBSyxNQUFNLFdBQVc7QUFDOUMsY0FBSSxRQUFRLElBQ1IsU0FBUyxVQUFVLFlBQVlBLE9BQU1ELFdBQVUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxHQUM3REQsVUFBU2xCLE9BQU0sTUFBTTtBQUV6QixpQkFBTyxVQUFVO0FBQ2YsWUFBQWtCLFFBQU8sWUFBWSxTQUFTLEVBQUUsS0FBSyxJQUFJQztBQUN2QyxZQUFBQSxVQUFTO0FBQUEsVUFDWDtBQUNBLGlCQUFPRDtBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxXQUFXLFFBQVEsR0FBRztBQUM3QixjQUFJQSxVQUFTO0FBQ2IsY0FBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLElBQUksa0JBQWtCO0FBQzVDLG1CQUFPQTtBQUFBLFVBQ1Q7QUFHQSxhQUFHO0FBQ0QsZ0JBQUksSUFBSSxHQUFHO0FBQ1QsY0FBQUEsV0FBVTtBQUFBLFlBQ1o7QUFDQSxnQkFBSSxZQUFZLElBQUksQ0FBQztBQUNyQixnQkFBSSxHQUFHO0FBQ0wsd0JBQVU7QUFBQSxZQUNaO0FBQUEsVUFDRixTQUFTO0FBRVQsaUJBQU9BO0FBQUEsUUFDVDtBQVVBLGlCQUFTLFNBQVMsTUFBTUMsUUFBTztBQUM3QixpQkFBTyxZQUFZLFNBQVMsTUFBTUEsUUFBTyxRQUFRLEdBQUcsT0FBTyxFQUFFO0FBQUEsUUFDL0Q7QUFTQSxpQkFBUyxXQUFXLFlBQVk7QUFDOUIsaUJBQU8sWUFBWSxPQUFPLFVBQVUsQ0FBQztBQUFBLFFBQ3ZDO0FBVUEsaUJBQVMsZUFBZSxZQUFZLEdBQUc7QUFDckMsY0FBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixpQkFBTyxZQUFZLE9BQU8sVUFBVSxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUM7QUFBQSxRQUN6RDtBQVlBLGlCQUFTLFFBQVEsUUFBUSxNQUFNLE9BQU8sWUFBWTtBQUNoRCxjQUFJLENBQUMsU0FBUyxNQUFNLEdBQUc7QUFDckIsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sU0FBUyxNQUFNLE1BQU07QUFFNUIsY0FBSSxRQUFRLElBQ1IsU0FBUyxLQUFLLFFBQ2QsWUFBWSxTQUFTLEdBQ3JCLFNBQVM7QUFFYixpQkFBTyxVQUFVLFFBQVEsRUFBRSxRQUFRLFFBQVE7QUFDekMsZ0JBQUksTUFBTSxNQUFNLEtBQUssS0FBSyxDQUFDLEdBQ3ZCLFdBQVc7QUFFZixnQkFBSSxRQUFRLGVBQWUsUUFBUSxpQkFBaUIsUUFBUSxhQUFhO0FBQ3ZFLHFCQUFPO0FBQUEsWUFDVDtBQUVBLGdCQUFJLFNBQVMsV0FBVztBQUN0QixrQkFBSSxXQUFXLE9BQU8sR0FBRztBQUN6Qix5QkFBVyxhQUFhLFdBQVcsVUFBVSxLQUFLLE1BQU0sSUFBSTNCO0FBQzVELGtCQUFJLGFBQWFBLFlBQVc7QUFDMUIsMkJBQVcsU0FBUyxRQUFRLElBQ3hCLFdBQ0MsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQSxjQUN4QztBQUFBLFlBQ0Y7QUFDQSx3QkFBWSxRQUFRLEtBQUssUUFBUTtBQUNqQyxxQkFBUyxPQUFPLEdBQUc7QUFBQSxVQUNyQjtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQVVBLFlBQUksY0FBYyxDQUFDLFVBQVUsV0FBVyxTQUFTLE1BQU0sTUFBTTtBQUMzRCxrQkFBUSxJQUFJLE1BQU0sSUFBSTtBQUN0QixpQkFBTztBQUFBLFFBQ1Q7QUFVQSxZQUFJLGtCQUFrQixDQUFDLGlCQUFpQixXQUFXLFNBQVMsTUFBTSxRQUFRO0FBQ3hFLGlCQUFPLGVBQWUsTUFBTSxZQUFZO0FBQUEsWUFDdEMsZ0JBQWdCO0FBQUEsWUFDaEIsY0FBYztBQUFBLFlBQ2QsU0FBUyxTQUFTLE1BQU07QUFBQSxZQUN4QixZQUFZO0FBQUEsVUFDZCxDQUFDO0FBQUEsUUFDSDtBQVNBLGlCQUFTLFlBQVksWUFBWTtBQUMvQixpQkFBTyxZQUFZLE9BQU8sVUFBVSxDQUFDO0FBQUEsUUFDdkM7QUFXQSxpQkFBUyxVQUFVLE9BQU8yQixRQUFPQyxNQUFLO0FBQ3BDLGNBQUksUUFBUSxJQUNSLFNBQVMsTUFBTTtBQUVuQixjQUFJRCxTQUFRLEdBQUc7QUFDYixZQUFBQSxTQUFRLENBQUNBLFNBQVEsU0FBUyxJQUFLLFNBQVNBO0FBQUEsVUFDMUM7QUFDQSxVQUFBQyxPQUFNQSxPQUFNLFNBQVMsU0FBU0E7QUFDOUIsY0FBSUEsT0FBTSxHQUFHO0FBQ1gsWUFBQUEsUUFBTztBQUFBLFVBQ1Q7QUFDQSxtQkFBU0QsU0FBUUMsT0FBTSxJQUFNQSxPQUFNRCxXQUFXO0FBQzlDLFVBQUFBLFlBQVc7QUFFWCxjQUFJRCxVQUFTbEIsT0FBTSxNQUFNO0FBQ3pCLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLFlBQUFrQixRQUFPLEtBQUssSUFBSSxNQUFNLFFBQVFDLE1BQUs7QUFBQSxVQUNyQztBQUNBLGlCQUFPRDtBQUFBLFFBQ1Q7QUFXQSxpQkFBUyxTQUFTLFlBQVksV0FBVztBQUN2QyxjQUFJQTtBQUVKLG1CQUFTLFlBQVksU0FBUyxPQUFPLE9BQU92QixhQUFZO0FBQ3RELFlBQUF1QixVQUFTLFVBQVUsT0FBTyxPQUFPdkIsV0FBVTtBQUMzQyxtQkFBTyxDQUFDdUI7QUFBQSxVQUNWLENBQUM7QUFDRCxpQkFBTyxDQUFDLENBQUNBO0FBQUEsUUFDWDtBQWNBLGlCQUFTLGdCQUFnQixPQUFPLE9BQU8sWUFBWTtBQUNqRCxjQUFJLE1BQU0sR0FDTixPQUFPLFNBQVMsT0FBTyxNQUFNLE1BQU07QUFFdkMsY0FBSSxPQUFPLFNBQVMsWUFBWSxVQUFVLFNBQVMsUUFBUSx1QkFBdUI7QUFDaEYsbUJBQU8sTUFBTSxNQUFNO0FBQ2pCLGtCQUFJLE1BQU8sTUFBTSxTQUFVLEdBQ3ZCLFdBQVcsTUFBTSxHQUFHO0FBRXhCLGtCQUFJLGFBQWEsUUFBUSxDQUFDLFNBQVMsUUFBUSxNQUN0QyxhQUFjLFlBQVksUUFBVSxXQUFXLFFBQVM7QUFDM0Qsc0JBQU0sTUFBTTtBQUFBLGNBQ2QsT0FBTztBQUNMLHVCQUFPO0FBQUEsY0FDVDtBQUFBLFlBQ0Y7QUFDQSxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxpQkFBTyxrQkFBa0IsT0FBTyxPQUFPLFVBQVUsVUFBVTtBQUFBLFFBQzdEO0FBZUEsaUJBQVMsa0JBQWtCLE9BQU8sT0FBT0csV0FBVSxZQUFZO0FBQzdELGNBQUksTUFBTSxHQUNOLE9BQU8sU0FBUyxPQUFPLElBQUksTUFBTTtBQUNyQyxjQUFJLFNBQVMsR0FBRztBQUNkLG1CQUFPO0FBQUEsVUFDVDtBQUVBLGtCQUFRQSxVQUFTLEtBQUs7QUFDdEIsY0FBSSxXQUFXLFVBQVUsT0FDckIsWUFBWSxVQUFVLE1BQ3RCLGNBQWMsU0FBUyxLQUFLLEdBQzVCLGlCQUFpQixVQUFVN0I7QUFFL0IsaUJBQU8sTUFBTSxNQUFNO0FBQ2pCLGdCQUFJLE1BQU0sYUFBYSxNQUFNLFFBQVEsQ0FBQyxHQUNsQyxXQUFXNkIsVUFBUyxNQUFNLEdBQUcsQ0FBQyxHQUM5QixlQUFlLGFBQWE3QixZQUM1QixZQUFZLGFBQWEsTUFDekIsaUJBQWlCLGFBQWEsVUFDOUIsY0FBYyxTQUFTLFFBQVE7QUFFbkMsZ0JBQUksVUFBVTtBQUNaLGtCQUFJLFNBQVMsY0FBYztBQUFBLFlBQzdCLFdBQVcsZ0JBQWdCO0FBQ3pCLHVCQUFTLG1CQUFtQixjQUFjO0FBQUEsWUFDNUMsV0FBVyxXQUFXO0FBQ3BCLHVCQUFTLGtCQUFrQixpQkFBaUIsY0FBYyxDQUFDO0FBQUEsWUFDN0QsV0FBVyxhQUFhO0FBQ3RCLHVCQUFTLGtCQUFrQixnQkFBZ0IsQ0FBQyxjQUFjLGNBQWMsQ0FBQztBQUFBLFlBQzNFLFdBQVcsYUFBYSxhQUFhO0FBQ25DLHVCQUFTO0FBQUEsWUFDWCxPQUFPO0FBQ0wsdUJBQVMsYUFBYyxZQUFZLFFBQVUsV0FBVztBQUFBLFlBQzFEO0FBQ0EsZ0JBQUksUUFBUTtBQUNWLG9CQUFNLE1BQU07QUFBQSxZQUNkLE9BQU87QUFDTCxxQkFBTztBQUFBLFlBQ1Q7QUFBQSxVQUNGO0FBQ0EsaUJBQU8sVUFBVSxNQUFNLGVBQWU7QUFBQSxRQUN4QztBQVdBLGlCQUFTLGVBQWUsT0FBTzZCLFdBQVU7QUFDdkMsY0FBSSxRQUFRLElBQ1IsU0FBUyxNQUFNLFFBQ2YsV0FBVyxHQUNYSCxVQUFTLENBQUM7QUFFZCxpQkFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixnQkFBSSxRQUFRLE1BQU0sS0FBSyxHQUNuQixXQUFXRyxZQUFXQSxVQUFTLEtBQUssSUFBSTtBQUU1QyxnQkFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsSUFBSSxHQUFHO0FBQ2pDLGtCQUFJLE9BQU87QUFDWCxjQUFBSCxRQUFPLFVBQVUsSUFBSSxVQUFVLElBQUksSUFBSTtBQUFBLFlBQ3pDO0FBQUEsVUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxhQUFhLE9BQU87QUFDM0IsY0FBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPLENBQUM7QUFBQSxRQUNWO0FBVUEsaUJBQVMsYUFBYSxPQUFPO0FBRTNCLGNBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxRQUFRLEtBQUssR0FBRztBQUVsQixtQkFBTyxTQUFTLE9BQU8sWUFBWSxJQUFJO0FBQUEsVUFDekM7QUFDQSxjQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLG1CQUFPLGlCQUFpQixlQUFlLEtBQUssS0FBSyxJQUFJO0FBQUEsVUFDdkQ7QUFDQSxjQUFJQSxVQUFVLFFBQVE7QUFDdEIsaUJBQVFBLFdBQVUsT0FBUSxJQUFJLFNBQVUsQ0FBQyxXQUFZLE9BQU9BO0FBQUEsUUFDOUQ7QUFXQSxpQkFBUyxTQUFTLE9BQU9HLFdBQVUsWUFBWTtBQUM3QyxjQUFJLFFBQVEsSUFDUlMsWUFBVyxlQUNYLFNBQVMsTUFBTSxRQUNmLFdBQVcsTUFDWFosVUFBUyxDQUFDLEdBQ1YsT0FBT0E7QUFFWCxjQUFJLFlBQVk7QUFDZCx1QkFBVztBQUNYLFlBQUFZLFlBQVc7QUFBQSxVQUNiLFdBQ1MsVUFBVSxrQkFBa0I7QUFDbkMsZ0JBQUlLLE9BQU1kLFlBQVcsT0FBTyxVQUFVLEtBQUs7QUFDM0MsZ0JBQUljLE1BQUs7QUFDUCxxQkFBTyxXQUFXQSxJQUFHO0FBQUEsWUFDdkI7QUFDQSx1QkFBVztBQUNYLFlBQUFMLFlBQVc7QUFDWCxtQkFBTyxJQUFJO0FBQUEsVUFDYixPQUNLO0FBQ0gsbUJBQU9ULFlBQVcsQ0FBQyxJQUFJSDtBQUFBLFVBQ3pCO0FBQ0E7QUFDQSxtQkFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixrQkFBSSxRQUFRLE1BQU0sS0FBSyxHQUNuQixXQUFXRyxZQUFXQSxVQUFTLEtBQUssSUFBSTtBQUU1QyxzQkFBUyxjQUFjLFVBQVUsSUFBSyxRQUFRO0FBQzlDLGtCQUFJLFlBQVksYUFBYSxVQUFVO0FBQ3JDLG9CQUFJLFlBQVksS0FBSztBQUNyQix1QkFBTyxhQUFhO0FBQ2xCLHNCQUFJLEtBQUssU0FBUyxNQUFNLFVBQVU7QUFDaEMsNkJBQVM7QUFBQSxrQkFDWDtBQUFBLGdCQUNGO0FBQ0Esb0JBQUlBLFdBQVU7QUFDWix1QkFBSyxLQUFLLFFBQVE7QUFBQSxnQkFDcEI7QUFDQSxnQkFBQUgsUUFBTyxLQUFLLEtBQUs7QUFBQSxjQUNuQixXQUNTLENBQUNZLFVBQVMsTUFBTSxVQUFVLFVBQVUsR0FBRztBQUM5QyxvQkFBSSxTQUFTWixTQUFRO0FBQ25CLHVCQUFLLEtBQUssUUFBUTtBQUFBLGdCQUNwQjtBQUNBLGdCQUFBQSxRQUFPLEtBQUssS0FBSztBQUFBLGNBQ25CO0FBQUEsWUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxVQUFVLFFBQVEsTUFBTTtBQUMvQixpQkFBTyxTQUFTLE1BQU0sTUFBTTtBQUM1QixtQkFBUyxPQUFPLFFBQVEsSUFBSTtBQUM1QixpQkFBTyxVQUFVLFFBQVEsT0FBTyxPQUFPLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztBQUFBLFFBQzFEO0FBWUEsaUJBQVMsV0FBVyxRQUFRLE1BQU0sU0FBUyxZQUFZO0FBQ3JELGlCQUFPLFFBQVEsUUFBUSxNQUFNLFFBQVEsUUFBUSxRQUFRLElBQUksQ0FBQyxHQUFHLFVBQVU7QUFBQSxRQUN6RTtBQWFBLGlCQUFTLFVBQVUsT0FBTyxXQUFXLFFBQVEsV0FBVztBQUN0RCxjQUFJLFNBQVMsTUFBTSxRQUNmLFFBQVEsWUFBWSxTQUFTO0FBRWpDLGtCQUFRLFlBQVksVUFBVSxFQUFFLFFBQVEsV0FDdEMsVUFBVSxNQUFNLEtBQUssR0FBRyxPQUFPLEtBQUssR0FBRztBQUFBLFVBQUM7QUFFMUMsaUJBQU8sU0FDSCxVQUFVLE9BQVEsWUFBWSxJQUFJLE9BQVMsWUFBWSxRQUFRLElBQUksTUFBTyxJQUMxRSxVQUFVLE9BQVEsWUFBWSxRQUFRLElBQUksR0FBSyxZQUFZLFNBQVMsS0FBTTtBQUFBLFFBQ2hGO0FBWUEsaUJBQVMsaUJBQWlCLE9BQU8sU0FBUztBQUN4QyxjQUFJQSxVQUFTO0FBQ2IsY0FBSUEsbUJBQWtCLGFBQWE7QUFDakMsWUFBQUEsVUFBU0EsUUFBTyxNQUFNO0FBQUEsVUFDeEI7QUFDQSxpQkFBTyxZQUFZLFNBQVMsU0FBU0EsU0FBUSxRQUFRO0FBQ25ELG1CQUFPLE9BQU8sS0FBSyxNQUFNLE9BQU8sU0FBUyxVQUFVLENBQUNBLE9BQU0sR0FBRyxPQUFPLElBQUksQ0FBQztBQUFBLFVBQzNFLEdBQUdBLE9BQU07QUFBQSxRQUNYO0FBWUEsaUJBQVMsUUFBUSxRQUFRRyxXQUFVLFlBQVk7QUFDN0MsY0FBSSxTQUFTLE9BQU87QUFDcEIsY0FBSSxTQUFTLEdBQUc7QUFDZCxtQkFBTyxTQUFTLFNBQVMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQUEsVUFDekM7QUFDQSxjQUFJLFFBQVEsSUFDUkgsVUFBU2xCLE9BQU0sTUFBTTtBQUV6QixpQkFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixnQkFBSSxRQUFRLE9BQU8sS0FBSyxHQUNwQixXQUFXO0FBRWYsbUJBQU8sRUFBRSxXQUFXLFFBQVE7QUFDMUIsa0JBQUksWUFBWSxPQUFPO0FBQ3JCLGdCQUFBa0IsUUFBTyxLQUFLLElBQUksZUFBZUEsUUFBTyxLQUFLLEtBQUssT0FBTyxPQUFPLFFBQVEsR0FBR0csV0FBVSxVQUFVO0FBQUEsY0FDL0Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUNBLGlCQUFPLFNBQVMsWUFBWUgsU0FBUSxDQUFDLEdBQUdHLFdBQVUsVUFBVTtBQUFBLFFBQzlEO0FBV0EsaUJBQVMsY0FBYyxPQUFPRSxTQUFRLFlBQVk7QUFDaEQsY0FBSSxRQUFRLElBQ1IsU0FBUyxNQUFNLFFBQ2YsYUFBYUEsUUFBTyxRQUNwQkwsVUFBUyxDQUFDO0FBRWQsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksUUFBUSxRQUFRLGFBQWFLLFFBQU8sS0FBSyxJQUFJL0I7QUFDakQsdUJBQVcwQixTQUFRLE1BQU0sS0FBSyxHQUFHLEtBQUs7QUFBQSxVQUN4QztBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFTQSxpQkFBUyxvQkFBb0IsT0FBTztBQUNsQyxpQkFBTyxrQkFBa0IsS0FBSyxJQUFJLFFBQVEsQ0FBQztBQUFBLFFBQzdDO0FBU0EsaUJBQVMsYUFBYSxPQUFPO0FBQzNCLGlCQUFPLE9BQU8sU0FBUyxhQUFhLFFBQVE7QUFBQSxRQUM5QztBQVVBLGlCQUFTLFNBQVMsT0FBTyxRQUFRO0FBQy9CLGNBQUksUUFBUSxLQUFLLEdBQUc7QUFDbEIsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sTUFBTSxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxhQUFhLFNBQVMsS0FBSyxDQUFDO0FBQUEsUUFDdEU7QUFXQSxZQUFJLFdBQVc7QUFXZixpQkFBUyxVQUFVLE9BQU9DLFFBQU9DLE1BQUs7QUFDcEMsY0FBSSxTQUFTLE1BQU07QUFDbkIsVUFBQUEsT0FBTUEsU0FBUTVCLGFBQVksU0FBUzRCO0FBQ25DLGlCQUFRLENBQUNELFVBQVNDLFFBQU8sU0FBVSxRQUFRLFVBQVUsT0FBT0QsUUFBT0MsSUFBRztBQUFBLFFBQ3hFO0FBUUEsWUFBSWdCLGdCQUFlLG1CQUFtQixTQUFTLElBQUk7QUFDakQsaUJBQU8sS0FBSyxhQUFhLEVBQUU7QUFBQSxRQUM3QjtBQVVBLGlCQUFTLFlBQVksUUFBUSxRQUFRO0FBQ25DLGNBQUksUUFBUTtBQUNWLG1CQUFPLE9BQU8sTUFBTTtBQUFBLFVBQ3RCO0FBQ0EsY0FBSSxTQUFTLE9BQU8sUUFDaEJsQixVQUFTLGNBQWMsWUFBWSxNQUFNLElBQUksSUFBSSxPQUFPLFlBQVksTUFBTTtBQUU5RSxpQkFBTyxLQUFLQSxPQUFNO0FBQ2xCLGlCQUFPQTtBQUFBLFFBQ1Q7QUFTQSxpQkFBUyxpQkFBaUIsYUFBYTtBQUNyQyxjQUFJQSxVQUFTLElBQUksWUFBWSxZQUFZLFlBQVksVUFBVTtBQUMvRCxjQUFJTCxZQUFXSyxPQUFNLEVBQUUsSUFBSSxJQUFJTCxZQUFXLFdBQVcsQ0FBQztBQUN0RCxpQkFBT0s7QUFBQSxRQUNUO0FBVUEsaUJBQVMsY0FBYyxVQUFVLFFBQVE7QUFDdkMsY0FBSSxTQUFTLFNBQVMsaUJBQWlCLFNBQVMsTUFBTSxJQUFJLFNBQVM7QUFDbkUsaUJBQU8sSUFBSSxTQUFTLFlBQVksUUFBUSxTQUFTLFlBQVksU0FBUyxVQUFVO0FBQUEsUUFDbEY7QUFTQSxpQkFBUyxZQUFZLFFBQVE7QUFDM0IsY0FBSUEsVUFBUyxJQUFJLE9BQU8sWUFBWSxPQUFPLFFBQVEsUUFBUSxLQUFLLE1BQU0sQ0FBQztBQUN2RSxVQUFBQSxRQUFPLFlBQVksT0FBTztBQUMxQixpQkFBT0E7QUFBQSxRQUNUO0FBU0EsaUJBQVMsWUFBWSxRQUFRO0FBQzNCLGlCQUFPLGdCQUFnQmIsUUFBTyxjQUFjLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQztBQUFBLFFBQy9EO0FBVUEsaUJBQVMsZ0JBQWdCLFlBQVksUUFBUTtBQUMzQyxjQUFJLFNBQVMsU0FBUyxpQkFBaUIsV0FBVyxNQUFNLElBQUksV0FBVztBQUN2RSxpQkFBTyxJQUFJLFdBQVcsWUFBWSxRQUFRLFdBQVcsWUFBWSxXQUFXLE1BQU07QUFBQSxRQUNwRjtBQVVBLGlCQUFTLGlCQUFpQixPQUFPLE9BQU87QUFDdEMsY0FBSSxVQUFVLE9BQU87QUFDbkIsZ0JBQUksZUFBZSxVQUFVYixZQUN6QixZQUFZLFVBQVUsTUFDdEIsaUJBQWlCLFVBQVUsT0FDM0IsY0FBYyxTQUFTLEtBQUs7QUFFaEMsZ0JBQUksZUFBZSxVQUFVQSxZQUN6QixZQUFZLFVBQVUsTUFDdEIsaUJBQWlCLFVBQVUsT0FDM0IsY0FBYyxTQUFTLEtBQUs7QUFFaEMsZ0JBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGVBQWUsUUFBUSxTQUN0RCxlQUFlLGdCQUFnQixrQkFBa0IsQ0FBQyxhQUFhLENBQUMsZUFDaEUsYUFBYSxnQkFBZ0Isa0JBQzdCLENBQUMsZ0JBQWdCLGtCQUNsQixDQUFDLGdCQUFnQjtBQUNuQixxQkFBTztBQUFBLFlBQ1Q7QUFDQSxnQkFBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsZUFBZSxRQUFRLFNBQ3RELGVBQWUsZ0JBQWdCLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxlQUNoRSxhQUFhLGdCQUFnQixrQkFDN0IsQ0FBQyxnQkFBZ0Isa0JBQ2xCLENBQUMsZ0JBQWdCO0FBQ25CLHFCQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFnQkEsaUJBQVMsZ0JBQWdCLFFBQVEsT0FBTyxRQUFRO0FBQzlDLGNBQUksUUFBUSxJQUNSLGNBQWMsT0FBTyxVQUNyQixjQUFjLE1BQU0sVUFDcEIsU0FBUyxZQUFZLFFBQ3JCLGVBQWUsT0FBTztBQUUxQixpQkFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixnQkFBSTBCLFVBQVMsaUJBQWlCLFlBQVksS0FBSyxHQUFHLFlBQVksS0FBSyxDQUFDO0FBQ3BFLGdCQUFJQSxTQUFRO0FBQ1Ysa0JBQUksU0FBUyxjQUFjO0FBQ3pCLHVCQUFPQTtBQUFBLGNBQ1Q7QUFDQSxrQkFBSW1CLFNBQVEsT0FBTyxLQUFLO0FBQ3hCLHFCQUFPbkIsV0FBVW1CLFVBQVMsU0FBUyxLQUFLO0FBQUEsWUFDMUM7QUFBQSxVQUNGO0FBUUEsaUJBQU8sT0FBTyxRQUFRLE1BQU07QUFBQSxRQUM5QjtBQWFBLGlCQUFTLFlBQVksTUFBTSxVQUFVLFNBQVMsV0FBVztBQUN2RCxjQUFJLFlBQVksSUFDWixhQUFhLEtBQUssUUFDbEIsZ0JBQWdCLFFBQVEsUUFDeEIsWUFBWSxJQUNaLGFBQWEsU0FBUyxRQUN0QixjQUFjLFVBQVUsYUFBYSxlQUFlLENBQUMsR0FDckRuQixVQUFTbEIsT0FBTSxhQUFhLFdBQVcsR0FDdkMsY0FBYyxDQUFDO0FBRW5CLGlCQUFPLEVBQUUsWUFBWSxZQUFZO0FBQy9CLFlBQUFrQixRQUFPLFNBQVMsSUFBSSxTQUFTLFNBQVM7QUFBQSxVQUN4QztBQUNBLGlCQUFPLEVBQUUsWUFBWSxlQUFlO0FBQ2xDLGdCQUFJLGVBQWUsWUFBWSxZQUFZO0FBQ3pDLGNBQUFBLFFBQU8sUUFBUSxTQUFTLENBQUMsSUFBSSxLQUFLLFNBQVM7QUFBQSxZQUM3QztBQUFBLFVBQ0Y7QUFDQSxpQkFBTyxlQUFlO0FBQ3BCLFlBQUFBLFFBQU8sV0FBVyxJQUFJLEtBQUssV0FBVztBQUFBLFVBQ3hDO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQWFBLGlCQUFTLGlCQUFpQixNQUFNLFVBQVUsU0FBUyxXQUFXO0FBQzVELGNBQUksWUFBWSxJQUNaLGFBQWEsS0FBSyxRQUNsQixlQUFlLElBQ2YsZ0JBQWdCLFFBQVEsUUFDeEIsYUFBYSxJQUNiLGNBQWMsU0FBUyxRQUN2QixjQUFjLFVBQVUsYUFBYSxlQUFlLENBQUMsR0FDckRBLFVBQVNsQixPQUFNLGNBQWMsV0FBVyxHQUN4QyxjQUFjLENBQUM7QUFFbkIsaUJBQU8sRUFBRSxZQUFZLGFBQWE7QUFDaEMsWUFBQWtCLFFBQU8sU0FBUyxJQUFJLEtBQUssU0FBUztBQUFBLFVBQ3BDO0FBQ0EsY0FBSXhCLFVBQVM7QUFDYixpQkFBTyxFQUFFLGFBQWEsYUFBYTtBQUNqQyxZQUFBd0IsUUFBT3hCLFVBQVMsVUFBVSxJQUFJLFNBQVMsVUFBVTtBQUFBLFVBQ25EO0FBQ0EsaUJBQU8sRUFBRSxlQUFlLGVBQWU7QUFDckMsZ0JBQUksZUFBZSxZQUFZLFlBQVk7QUFDekMsY0FBQXdCLFFBQU94QixVQUFTLFFBQVEsWUFBWSxDQUFDLElBQUksS0FBSyxXQUFXO0FBQUEsWUFDM0Q7QUFBQSxVQUNGO0FBQ0EsaUJBQU93QjtBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxVQUFVTyxTQUFRLE9BQU87QUFDaEMsY0FBSSxRQUFRLElBQ1IsU0FBU0EsUUFBTztBQUVwQixvQkFBVSxRQUFRekIsT0FBTSxNQUFNO0FBQzlCLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGtCQUFNLEtBQUssSUFBSXlCLFFBQU8sS0FBSztBQUFBLFVBQzdCO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBWUEsaUJBQVMsV0FBV0EsU0FBUSxPQUFPLFFBQVEsWUFBWTtBQUNyRCxjQUFJLFFBQVEsQ0FBQztBQUNiLHFCQUFXLFNBQVMsQ0FBQztBQUVyQixjQUFJLFFBQVEsSUFDUixTQUFTLE1BQU07QUFFbkIsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksTUFBTSxNQUFNLEtBQUs7QUFFckIsZ0JBQUksV0FBVyxhQUNYLFdBQVcsT0FBTyxHQUFHLEdBQUdBLFFBQU8sR0FBRyxHQUFHLEtBQUssUUFBUUEsT0FBTSxJQUN4RGpDO0FBRUosZ0JBQUksYUFBYUEsWUFBVztBQUMxQix5QkFBV2lDLFFBQU8sR0FBRztBQUFBLFlBQ3ZCO0FBQ0EsZ0JBQUksT0FBTztBQUNULDhCQUFnQixRQUFRLEtBQUssUUFBUTtBQUFBLFlBQ3ZDLE9BQU87QUFDTCwwQkFBWSxRQUFRLEtBQUssUUFBUTtBQUFBLFlBQ25DO0FBQUEsVUFDRjtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQVVBLGlCQUFTLFlBQVlBLFNBQVEsUUFBUTtBQUNuQyxpQkFBTyxXQUFXQSxTQUFRLFdBQVdBLE9BQU0sR0FBRyxNQUFNO0FBQUEsUUFDdEQ7QUFVQSxpQkFBUyxjQUFjQSxTQUFRLFFBQVE7QUFDckMsaUJBQU8sV0FBV0EsU0FBUSxhQUFhQSxPQUFNLEdBQUcsTUFBTTtBQUFBLFFBQ3hEO0FBVUEsaUJBQVMsaUJBQWlCLFFBQVEsYUFBYTtBQUM3QyxpQkFBTyxTQUFTLFlBQVlKLFdBQVU7QUFDcEMsZ0JBQUksT0FBTyxRQUFRLFVBQVUsSUFBSSxrQkFBa0IsZ0JBQy9DLGNBQWMsY0FBYyxZQUFZLElBQUksQ0FBQztBQUVqRCxtQkFBTyxLQUFLLFlBQVksUUFBUSxZQUFZQSxXQUFVLENBQUMsR0FBRyxXQUFXO0FBQUEsVUFDdkU7QUFBQSxRQUNGO0FBU0EsaUJBQVMsZUFBZSxVQUFVO0FBQ2hDLGlCQUFPLFNBQVMsU0FBUyxRQUFRLFNBQVM7QUFDeEMsZ0JBQUksUUFBUSxJQUNSLFNBQVMsUUFBUSxRQUNqQixhQUFhLFNBQVMsSUFBSSxRQUFRLFNBQVMsQ0FBQyxJQUFJN0IsWUFDaEQsUUFBUSxTQUFTLElBQUksUUFBUSxDQUFDLElBQUlBO0FBRXRDLHlCQUFjLFNBQVMsU0FBUyxLQUFLLE9BQU8sY0FBYyxjQUNyRCxVQUFVLGNBQ1hBO0FBRUosZ0JBQUksU0FBUyxlQUFlLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBRztBQUMxRCwyQkFBYSxTQUFTLElBQUlBLGFBQVk7QUFDdEMsdUJBQVM7QUFBQSxZQUNYO0FBQ0EscUJBQVNhLFFBQU8sTUFBTTtBQUN0QixtQkFBTyxFQUFFLFFBQVEsUUFBUTtBQUN2QixrQkFBSW9CLFVBQVMsUUFBUSxLQUFLO0FBQzFCLGtCQUFJQSxTQUFRO0FBQ1YseUJBQVMsUUFBUUEsU0FBUSxPQUFPLFVBQVU7QUFBQSxjQUM1QztBQUFBLFlBQ0Y7QUFDQSxtQkFBTztBQUFBLFVBQ1QsQ0FBQztBQUFBLFFBQ0g7QUFVQSxpQkFBUyxlQUFlLFVBQVUsV0FBVztBQUMzQyxpQkFBTyxTQUFTLFlBQVlKLFdBQVU7QUFDcEMsZ0JBQUksY0FBYyxNQUFNO0FBQ3RCLHFCQUFPO0FBQUEsWUFDVDtBQUNBLGdCQUFJLENBQUMsWUFBWSxVQUFVLEdBQUc7QUFDNUIscUJBQU8sU0FBUyxZQUFZQSxTQUFRO0FBQUEsWUFDdEM7QUFDQSxnQkFBSSxTQUFTLFdBQVcsUUFDcEIsUUFBUSxZQUFZLFNBQVMsSUFDN0IsV0FBV2hCLFFBQU8sVUFBVTtBQUVoQyxtQkFBUSxZQUFZLFVBQVUsRUFBRSxRQUFRLFFBQVM7QUFDL0Msa0JBQUlnQixVQUFTLFNBQVMsS0FBSyxHQUFHLE9BQU8sUUFBUSxNQUFNLE9BQU87QUFDeEQ7QUFBQSxjQUNGO0FBQUEsWUFDRjtBQUNBLG1CQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFTQSxpQkFBUyxjQUFjLFdBQVc7QUFDaEMsaUJBQU8sU0FBUyxRQUFRQSxXQUFVLFVBQVU7QUFDMUMsZ0JBQUksUUFBUSxJQUNSLFdBQVdoQixRQUFPLE1BQU0sR0FDeEIsUUFBUSxTQUFTLE1BQU0sR0FDdkIsU0FBUyxNQUFNO0FBRW5CLG1CQUFPLFVBQVU7QUFDZixrQkFBSSxNQUFNLE1BQU0sWUFBWSxTQUFTLEVBQUUsS0FBSztBQUM1QyxrQkFBSWdCLFVBQVMsU0FBUyxHQUFHLEdBQUcsS0FBSyxRQUFRLE1BQU0sT0FBTztBQUNwRDtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQ0EsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQVlBLGlCQUFTLFdBQVcsTUFBTSxTQUFTLFNBQVM7QUFDMUMsY0FBSSxTQUFTLFVBQVUsZ0JBQ25CLE9BQU8sV0FBVyxJQUFJO0FBRTFCLG1CQUFTLFVBQVU7QUFDakIsZ0JBQUlpQixNQUFNLFFBQVEsU0FBUyxRQUFRLGdCQUFnQixVQUFXLE9BQU87QUFDckUsbUJBQU9BLElBQUcsTUFBTSxTQUFTLFVBQVUsTUFBTSxTQUFTO0FBQUEsVUFDcEQ7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFTQSxpQkFBUyxnQkFBZ0IsWUFBWTtBQUNuQyxpQkFBTyxTQUFTLFFBQVE7QUFDdEIscUJBQVMsU0FBUyxNQUFNO0FBRXhCLGdCQUFJLGFBQWEsV0FBVyxNQUFNLElBQzlCeEMsZUFBYyxNQUFNLElBQ3BCTjtBQUVKLGdCQUFJLE1BQU0sYUFDTixXQUFXLENBQUMsSUFDWixPQUFPLE9BQU8sQ0FBQztBQUVuQixnQkFBSSxXQUFXLGFBQ1gsVUFBVSxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFDaEMsT0FBTyxNQUFNLENBQUM7QUFFbEIsbUJBQU8sSUFBSSxVQUFVLEVBQUUsSUFBSTtBQUFBLFVBQzdCO0FBQUEsUUFDRjtBQVNBLGlCQUFTLGlCQUFpQixVQUFVO0FBQ2xDLGlCQUFPLFNBQVMsUUFBUTtBQUN0QixtQkFBTyxZQUFZLE1BQU0sT0FBTyxNQUFNLEVBQUUsUUFBUSxRQUFRLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRTtBQUFBLFVBQzVFO0FBQUEsUUFDRjtBQVVBLGlCQUFTLFdBQVcsTUFBTTtBQUN4QixpQkFBTyxXQUFXO0FBSWhCLGdCQUFJLE9BQU87QUFDWCxvQkFBUSxLQUFLLFFBQVE7QUFBQSxjQUNuQixLQUFLO0FBQUcsdUJBQU8sSUFBSTtBQUFBLGNBQ25CLEtBQUs7QUFBRyx1QkFBTyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7QUFBQSxjQUMvQixLQUFLO0FBQUcsdUJBQU8sSUFBSSxLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQUEsY0FDeEMsS0FBSztBQUFHLHVCQUFPLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUFBLGNBQ2pELEtBQUs7QUFBRyx1QkFBTyxJQUFJLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFBQSxjQUMxRCxLQUFLO0FBQUcsdUJBQU8sSUFBSSxLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQUEsY0FDbkUsS0FBSztBQUFHLHVCQUFPLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUFBLGNBQzVFLEtBQUs7QUFBRyx1QkFBTyxJQUFJLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFBQSxZQUN2RjtBQUNBLGdCQUFJLGNBQWMsV0FBVyxLQUFLLFNBQVMsR0FDdkMwQixVQUFTLEtBQUssTUFBTSxhQUFhLElBQUk7QUFJekMsbUJBQU8sU0FBU0EsT0FBTSxJQUFJQSxVQUFTO0FBQUEsVUFDckM7QUFBQSxRQUNGO0FBV0EsaUJBQVMsWUFBWSxNQUFNLFNBQVMsT0FBTztBQUN6QyxjQUFJLE9BQU8sV0FBVyxJQUFJO0FBRTFCLG1CQUFTLFVBQVU7QUFDakIsZ0JBQUksU0FBUyxVQUFVLFFBQ25CLE9BQU9sQixPQUFNLE1BQU0sR0FDbkIsUUFBUSxRQUNSLGNBQWMsVUFBVSxPQUFPO0FBRW5DLG1CQUFPLFNBQVM7QUFDZCxtQkFBSyxLQUFLLElBQUksVUFBVSxLQUFLO0FBQUEsWUFDL0I7QUFDQSxnQkFBSSxVQUFXLFNBQVMsS0FBSyxLQUFLLENBQUMsTUFBTSxlQUFlLEtBQUssU0FBUyxDQUFDLE1BQU0sY0FDekUsQ0FBQyxJQUNELGVBQWUsTUFBTSxXQUFXO0FBRXBDLHNCQUFVLFFBQVE7QUFDbEIsZ0JBQUksU0FBUyxPQUFPO0FBQ2xCLHFCQUFPO0FBQUEsZ0JBQ0w7QUFBQSxnQkFBTTtBQUFBLGdCQUFTO0FBQUEsZ0JBQWMsUUFBUTtBQUFBLGdCQUFhUjtBQUFBLGdCQUNsRDtBQUFBLGdCQUFNO0FBQUEsZ0JBQVNBO0FBQUEsZ0JBQVdBO0FBQUEsZ0JBQVcsUUFBUTtBQUFBLGNBQU07QUFBQSxZQUN2RDtBQUNBLGdCQUFJOEMsTUFBTSxRQUFRLFNBQVMsUUFBUSxnQkFBZ0IsVUFBVyxPQUFPO0FBQ3JFLG1CQUFPN0MsT0FBTTZDLEtBQUksTUFBTSxJQUFJO0FBQUEsVUFDN0I7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFTQSxpQkFBUyxXQUFXLGVBQWU7QUFDakMsaUJBQU8sU0FBUyxZQUFZLFdBQVcsV0FBVztBQUNoRCxnQkFBSSxXQUFXakMsUUFBTyxVQUFVO0FBQ2hDLGdCQUFJLENBQUMsWUFBWSxVQUFVLEdBQUc7QUFDNUIsa0JBQUlnQixZQUFXLFlBQVksV0FBVyxDQUFDO0FBQ3ZDLDJCQUFhSyxNQUFLLFVBQVU7QUFDNUIsMEJBQVksU0FBUyxLQUFLO0FBQUUsdUJBQU9MLFVBQVMsU0FBUyxHQUFHLEdBQUcsS0FBSyxRQUFRO0FBQUEsY0FBRztBQUFBLFlBQzdFO0FBQ0EsZ0JBQUksUUFBUSxjQUFjLFlBQVksV0FBVyxTQUFTO0FBQzFELG1CQUFPLFFBQVEsS0FBSyxTQUFTQSxZQUFXLFdBQVcsS0FBSyxJQUFJLEtBQUssSUFBSTdCO0FBQUEsVUFDdkU7QUFBQSxRQUNGO0FBU0EsaUJBQVMsV0FBVyxXQUFXO0FBQzdCLGlCQUFPLFNBQVMsU0FBUyxPQUFPO0FBQzlCLGdCQUFJLFNBQVMsTUFBTSxRQUNmLFFBQVEsUUFDUixTQUFTLGNBQWMsVUFBVTtBQUVyQyxnQkFBSSxXQUFXO0FBQ2Isb0JBQU0sUUFBUTtBQUFBLFlBQ2hCO0FBQ0EsbUJBQU8sU0FBUztBQUNkLGtCQUFJLE9BQU8sTUFBTSxLQUFLO0FBQ3RCLGtCQUFJLE9BQU8sUUFBUSxZQUFZO0FBQzdCLHNCQUFNLElBQUlnQixXQUFVLGVBQWU7QUFBQSxjQUNyQztBQUNBLGtCQUFJLFVBQVUsQ0FBQyxXQUFXLFlBQVksSUFBSSxLQUFLLFdBQVc7QUFDeEQsb0JBQUksVUFBVSxJQUFJLGNBQWMsQ0FBQyxHQUFHLElBQUk7QUFBQSxjQUMxQztBQUFBLFlBQ0Y7QUFDQSxvQkFBUSxVQUFVLFFBQVE7QUFDMUIsbUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIscUJBQU8sTUFBTSxLQUFLO0FBRWxCLGtCQUFJLFdBQVcsWUFBWSxJQUFJLEdBQzNCLE9BQU8sWUFBWSxZQUFZLFFBQVEsSUFBSSxJQUFJaEI7QUFFbkQsa0JBQUksUUFBUSxXQUFXLEtBQUssQ0FBQyxDQUFDLEtBQ3hCLEtBQUssQ0FBQyxNQUFNLGdCQUFnQixrQkFBa0Isb0JBQW9CLG9CQUNsRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsS0FBSyxDQUFDLEtBQUssR0FDOUI7QUFDSiwwQkFBVSxRQUFRLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sU0FBUyxLQUFLLENBQUMsQ0FBQztBQUFBLGNBQ2hFLE9BQU87QUFDTCwwQkFBVyxLQUFLLFVBQVUsS0FBSyxXQUFXLElBQUksSUFDMUMsUUFBUSxRQUFRLEVBQUUsSUFDbEIsUUFBUSxLQUFLLElBQUk7QUFBQSxjQUN2QjtBQUFBLFlBQ0Y7QUFDQSxtQkFBTyxXQUFXO0FBQ2hCLGtCQUFJLE9BQU8sV0FDUCxRQUFRLEtBQUssQ0FBQztBQUVsQixrQkFBSSxXQUFXLEtBQUssVUFBVSxLQUFLLFFBQVEsS0FBSyxHQUFHO0FBQ2pELHVCQUFPLFFBQVEsTUFBTSxLQUFLLEVBQUUsTUFBTTtBQUFBLGNBQ3BDO0FBQ0Esa0JBQUkrQyxTQUFRLEdBQ1JyQixVQUFTLFNBQVMsTUFBTXFCLE1BQUssRUFBRSxNQUFNLE1BQU0sSUFBSSxJQUFJO0FBRXZELHFCQUFPLEVBQUVBLFNBQVEsUUFBUTtBQUN2QixnQkFBQXJCLFVBQVMsTUFBTXFCLE1BQUssRUFBRSxLQUFLLE1BQU1yQixPQUFNO0FBQUEsY0FDekM7QUFDQSxxQkFBT0E7QUFBQSxZQUNUO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQXFCQSxpQkFBUyxhQUFhLE1BQU0sU0FBUyxTQUFTLFVBQVUsU0FBUyxlQUFlLGNBQWMsUUFBUXNCLE1BQUssT0FBTztBQUNoSCxjQUFJLFFBQVEsVUFBVSxlQUNsQixTQUFTLFVBQVUsZ0JBQ25CLFlBQVksVUFBVSxvQkFDdEIsWUFBWSxXQUFXLGtCQUFrQix3QkFDekMsU0FBUyxVQUFVLGdCQUNuQixPQUFPLFlBQVloRCxhQUFZLFdBQVcsSUFBSTtBQUVsRCxtQkFBUyxVQUFVO0FBQ2pCLGdCQUFJLFNBQVMsVUFBVSxRQUNuQixPQUFPUSxPQUFNLE1BQU0sR0FDbkIsUUFBUTtBQUVaLG1CQUFPLFNBQVM7QUFDZCxtQkFBSyxLQUFLLElBQUksVUFBVSxLQUFLO0FBQUEsWUFDL0I7QUFDQSxnQkFBSSxXQUFXO0FBQ2Isa0JBQUksY0FBYyxVQUFVLE9BQU8sR0FDL0IsZUFBZSxhQUFhLE1BQU0sV0FBVztBQUFBLFlBQ25EO0FBQ0EsZ0JBQUksVUFBVTtBQUNaLHFCQUFPLFlBQVksTUFBTSxVQUFVLFNBQVMsU0FBUztBQUFBLFlBQ3ZEO0FBQ0EsZ0JBQUksZUFBZTtBQUNqQixxQkFBTyxpQkFBaUIsTUFBTSxlQUFlLGNBQWMsU0FBUztBQUFBLFlBQ3RFO0FBQ0Esc0JBQVU7QUFDVixnQkFBSSxhQUFhLFNBQVMsT0FBTztBQUMvQixrQkFBSSxhQUFhLGVBQWUsTUFBTSxXQUFXO0FBQ2pELHFCQUFPO0FBQUEsZ0JBQ0w7QUFBQSxnQkFBTTtBQUFBLGdCQUFTO0FBQUEsZ0JBQWMsUUFBUTtBQUFBLGdCQUFhO0FBQUEsZ0JBQ2xEO0FBQUEsZ0JBQU07QUFBQSxnQkFBWTtBQUFBLGdCQUFRd0M7QUFBQSxnQkFBSyxRQUFRO0FBQUEsY0FDekM7QUFBQSxZQUNGO0FBQ0EsZ0JBQUksY0FBYyxTQUFTLFVBQVUsTUFDakNGLE1BQUssWUFBWSxZQUFZLElBQUksSUFBSTtBQUV6QyxxQkFBUyxLQUFLO0FBQ2QsZ0JBQUksUUFBUTtBQUNWLHFCQUFPLFFBQVEsTUFBTSxNQUFNO0FBQUEsWUFDN0IsV0FBVyxVQUFVLFNBQVMsR0FBRztBQUMvQixtQkFBSyxRQUFRO0FBQUEsWUFDZjtBQUNBLGdCQUFJLFNBQVNFLE9BQU0sUUFBUTtBQUN6QixtQkFBSyxTQUFTQTtBQUFBLFlBQ2hCO0FBQ0EsZ0JBQUksUUFBUSxTQUFTLFFBQVEsZ0JBQWdCLFNBQVM7QUFDcEQsY0FBQUYsTUFBSyxRQUFRLFdBQVdBLEdBQUU7QUFBQSxZQUM1QjtBQUNBLG1CQUFPQSxJQUFHLE1BQU0sYUFBYSxJQUFJO0FBQUEsVUFDbkM7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxlQUFlLFFBQVEsWUFBWTtBQUMxQyxpQkFBTyxTQUFTLFFBQVFqQixXQUFVO0FBQ2hDLG1CQUFPLGFBQWEsUUFBUSxRQUFRLFdBQVdBLFNBQVEsR0FBRyxDQUFDLENBQUM7QUFBQSxVQUM5RDtBQUFBLFFBQ0Y7QUFVQSxpQkFBUyxvQkFBb0JvQixXQUFVLGNBQWM7QUFDbkQsaUJBQU8sU0FBUyxPQUFPLE9BQU87QUFDNUIsZ0JBQUl2QjtBQUNKLGdCQUFJLFVBQVUxQixjQUFhLFVBQVVBLFlBQVc7QUFDOUMscUJBQU87QUFBQSxZQUNUO0FBQ0EsZ0JBQUksVUFBVUEsWUFBVztBQUN2QixjQUFBMEIsVUFBUztBQUFBLFlBQ1g7QUFDQSxnQkFBSSxVQUFVMUIsWUFBVztBQUN2QixrQkFBSTBCLFlBQVcxQixZQUFXO0FBQ3hCLHVCQUFPO0FBQUEsY0FDVDtBQUNBLGtCQUFJLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxVQUFVO0FBQ3hELHdCQUFRLGFBQWEsS0FBSztBQUMxQix3QkFBUSxhQUFhLEtBQUs7QUFBQSxjQUM1QixPQUFPO0FBQ0wsd0JBQVEsYUFBYSxLQUFLO0FBQzFCLHdCQUFRLGFBQWEsS0FBSztBQUFBLGNBQzVCO0FBQ0EsY0FBQTBCLFVBQVN1QixVQUFTLE9BQU8sS0FBSztBQUFBLFlBQ2hDO0FBQ0EsbUJBQU92QjtBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBU0EsaUJBQVMsV0FBVyxXQUFXO0FBQzdCLGlCQUFPLFNBQVMsU0FBUyxXQUFXO0FBQ2xDLHdCQUFZLFNBQVMsV0FBVyxVQUFVLFlBQVksQ0FBQyxDQUFDO0FBQ3hELG1CQUFPLFNBQVMsU0FBUyxNQUFNO0FBQzdCLGtCQUFJLFVBQVU7QUFDZCxxQkFBTyxVQUFVLFdBQVcsU0FBU0csV0FBVTtBQUM3Qyx1QkFBTzVCLE9BQU00QixXQUFVLFNBQVMsSUFBSTtBQUFBLGNBQ3RDLENBQUM7QUFBQSxZQUNILENBQUM7QUFBQSxVQUNILENBQUM7QUFBQSxRQUNIO0FBV0EsaUJBQVMsY0FBYyxRQUFRLE9BQU87QUFDcEMsa0JBQVEsVUFBVTdCLGFBQVksTUFBTSxhQUFhLEtBQUs7QUFFdEQsY0FBSSxjQUFjLE1BQU07QUFDeEIsY0FBSSxjQUFjLEdBQUc7QUFDbkIsbUJBQU8sY0FBYyxXQUFXLE9BQU8sTUFBTSxJQUFJO0FBQUEsVUFDbkQ7QUFDQSxjQUFJMEIsVUFBUyxXQUFXLE9BQU8sV0FBVyxTQUFTLFdBQVcsS0FBSyxDQUFDLENBQUM7QUFDckUsaUJBQU8sV0FBVyxLQUFLLElBQ25CLFVBQVVwQixlQUFjb0IsT0FBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUNuREEsUUFBTyxNQUFNLEdBQUcsTUFBTTtBQUFBLFFBQzVCO0FBY0EsaUJBQVMsY0FBYyxNQUFNLFNBQVMsU0FBUyxVQUFVO0FBQ3ZELGNBQUksU0FBUyxVQUFVLGdCQUNuQixPQUFPLFdBQVcsSUFBSTtBQUUxQixtQkFBUyxVQUFVO0FBQ2pCLGdCQUFJLFlBQVksSUFDWixhQUFhLFVBQVUsUUFDdkIsWUFBWSxJQUNaLGFBQWEsU0FBUyxRQUN0QixPQUFPbEIsT0FBTSxhQUFhLFVBQVUsR0FDcENzQyxNQUFNLFFBQVEsU0FBUyxRQUFRLGdCQUFnQixVQUFXLE9BQU87QUFFckUsbUJBQU8sRUFBRSxZQUFZLFlBQVk7QUFDL0IsbUJBQUssU0FBUyxJQUFJLFNBQVMsU0FBUztBQUFBLFlBQ3RDO0FBQ0EsbUJBQU8sY0FBYztBQUNuQixtQkFBSyxXQUFXLElBQUksVUFBVSxFQUFFLFNBQVM7QUFBQSxZQUMzQztBQUNBLG1CQUFPN0MsT0FBTTZDLEtBQUksU0FBUyxVQUFVLE1BQU0sSUFBSTtBQUFBLFVBQ2hEO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBU0EsaUJBQVMsWUFBWSxXQUFXO0FBQzlCLGlCQUFPLFNBQVNuQixRQUFPQyxNQUFLLE1BQU07QUFDaEMsZ0JBQUksUUFBUSxPQUFPLFFBQVEsWUFBWSxlQUFlRCxRQUFPQyxNQUFLLElBQUksR0FBRztBQUN2RSxjQUFBQSxPQUFNLE9BQU81QjtBQUFBLFlBQ2Y7QUFFQSxZQUFBMkIsU0FBUSxTQUFTQSxNQUFLO0FBQ3RCLGdCQUFJQyxTQUFRNUIsWUFBVztBQUNyQixjQUFBNEIsT0FBTUQ7QUFDTixjQUFBQSxTQUFRO0FBQUEsWUFDVixPQUFPO0FBQ0wsY0FBQUMsT0FBTSxTQUFTQSxJQUFHO0FBQUEsWUFDcEI7QUFDQSxtQkFBTyxTQUFTNUIsYUFBYTJCLFNBQVFDLE9BQU0sSUFBSSxLQUFNLFNBQVMsSUFBSTtBQUNsRSxtQkFBTyxVQUFVRCxRQUFPQyxNQUFLLE1BQU0sU0FBUztBQUFBLFVBQzlDO0FBQUEsUUFDRjtBQVNBLGlCQUFTLDBCQUEwQnFCLFdBQVU7QUFDM0MsaUJBQU8sU0FBUyxPQUFPLE9BQU87QUFDNUIsZ0JBQUksRUFBRSxPQUFPLFNBQVMsWUFBWSxPQUFPLFNBQVMsV0FBVztBQUMzRCxzQkFBUSxTQUFTLEtBQUs7QUFDdEIsc0JBQVEsU0FBUyxLQUFLO0FBQUEsWUFDeEI7QUFDQSxtQkFBT0EsVUFBUyxPQUFPLEtBQUs7QUFBQSxVQUM5QjtBQUFBLFFBQ0Y7QUFtQkEsaUJBQVMsY0FBYyxNQUFNLFNBQVMsVUFBVSxhQUFhLFNBQVMsVUFBVSxTQUFTLFFBQVFELE1BQUssT0FBTztBQUMzRyxjQUFJLFVBQVUsVUFBVSxpQkFDcEIsYUFBYSxVQUFVLFVBQVVoRCxZQUNqQyxrQkFBa0IsVUFBVUEsYUFBWSxTQUN4QyxjQUFjLFVBQVUsV0FBV0EsWUFDbkMsbUJBQW1CLFVBQVVBLGFBQVk7QUFFN0MscUJBQVksVUFBVSxvQkFBb0I7QUFDMUMscUJBQVcsRUFBRSxVQUFVLDBCQUEwQjtBQUVqRCxjQUFJLEVBQUUsVUFBVSx3QkFBd0I7QUFDdEMsdUJBQVcsRUFBRSxpQkFBaUI7QUFBQSxVQUNoQztBQUNBLGNBQUksVUFBVTtBQUFBLFlBQ1o7QUFBQSxZQUFNO0FBQUEsWUFBUztBQUFBLFlBQVM7QUFBQSxZQUFhO0FBQUEsWUFBWTtBQUFBLFlBQ2pEO0FBQUEsWUFBaUI7QUFBQSxZQUFRZ0Q7QUFBQSxZQUFLO0FBQUEsVUFDaEM7QUFFQSxjQUFJdEIsVUFBUyxTQUFTLE1BQU0xQixZQUFXLE9BQU87QUFDOUMsY0FBSSxXQUFXLElBQUksR0FBRztBQUNwQixvQkFBUTBCLFNBQVEsT0FBTztBQUFBLFVBQ3pCO0FBQ0EsVUFBQUEsUUFBTyxjQUFjO0FBQ3JCLGlCQUFPLGdCQUFnQkEsU0FBUSxNQUFNLE9BQU87QUFBQSxRQUM5QztBQVNBLGlCQUFTLFlBQVksWUFBWTtBQUMvQixjQUFJLE9BQU9kLE1BQUssVUFBVTtBQUMxQixpQkFBTyxTQUFTLFFBQVEsV0FBVztBQUNqQyxxQkFBUyxTQUFTLE1BQU07QUFDeEIsd0JBQVksYUFBYSxPQUFPLElBQUksVUFBVSxVQUFVLFNBQVMsR0FBRyxHQUFHO0FBQ3ZFLGdCQUFJLGFBQWEsZUFBZSxNQUFNLEdBQUc7QUFHdkMsa0JBQUksUUFBUSxTQUFTLE1BQU0sSUFBSSxLQUFLLE1BQU0sR0FBRyxHQUN6QyxRQUFRLEtBQUssS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLFVBQVU7QUFFdkQsc0JBQVEsU0FBUyxLQUFLLElBQUksS0FBSyxNQUFNLEdBQUc7QUFDeEMscUJBQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUk7QUFBQSxZQUN2QztBQUNBLG1CQUFPLEtBQUssTUFBTTtBQUFBLFVBQ3BCO0FBQUEsUUFDRjtBQVNBLFlBQUksWUFBWSxFQUFFWSxRQUFRLElBQUksV0FBVyxJQUFJQSxLQUFJLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBTSxZQUFZMEIsUUFBTyxTQUFTbkIsU0FBUTtBQUNsRyxpQkFBTyxJQUFJUCxLQUFJTyxPQUFNO0FBQUEsUUFDdkI7QUFTQSxpQkFBUyxjQUFjLFVBQVU7QUFDL0IsaUJBQU8sU0FBUyxRQUFRO0FBQ3RCLGdCQUFJLE1BQU0sT0FBTyxNQUFNO0FBQ3ZCLGdCQUFJLE9BQU8sUUFBUTtBQUNqQixxQkFBTyxXQUFXLE1BQU07QUFBQSxZQUMxQjtBQUNBLGdCQUFJLE9BQU8sUUFBUTtBQUNqQixxQkFBTyxXQUFXLE1BQU07QUFBQSxZQUMxQjtBQUNBLG1CQUFPLFlBQVksUUFBUSxTQUFTLE1BQU0sQ0FBQztBQUFBLFVBQzdDO0FBQUEsUUFDRjtBQTJCQSxpQkFBUyxXQUFXLE1BQU0sU0FBUyxTQUFTLFVBQVUsU0FBUyxRQUFRaUIsTUFBSyxPQUFPO0FBQ2pGLGNBQUksWUFBWSxVQUFVO0FBQzFCLGNBQUksQ0FBQyxhQUFhLE9BQU8sUUFBUSxZQUFZO0FBQzNDLGtCQUFNLElBQUloQyxXQUFVLGVBQWU7QUFBQSxVQUNyQztBQUNBLGNBQUksU0FBUyxXQUFXLFNBQVMsU0FBUztBQUMxQyxjQUFJLENBQUMsUUFBUTtBQUNYLHVCQUFXLEVBQUUsb0JBQW9CO0FBQ2pDLHVCQUFXLFVBQVVoQjtBQUFBLFVBQ3ZCO0FBQ0EsVUFBQWdELE9BQU1BLFNBQVFoRCxhQUFZZ0QsT0FBTSxVQUFVLFVBQVVBLElBQUcsR0FBRyxDQUFDO0FBQzNELGtCQUFRLFVBQVVoRCxhQUFZLFFBQVEsVUFBVSxLQUFLO0FBQ3JELG9CQUFVLFVBQVUsUUFBUSxTQUFTO0FBRXJDLGNBQUksVUFBVSx5QkFBeUI7QUFDckMsZ0JBQUksZ0JBQWdCLFVBQ2hCLGVBQWU7QUFFbkIsdUJBQVcsVUFBVUE7QUFBQSxVQUN2QjtBQUNBLGNBQUksT0FBTyxZQUFZQSxhQUFZLFFBQVEsSUFBSTtBQUUvQyxjQUFJLFVBQVU7QUFBQSxZQUNaO0FBQUEsWUFBTTtBQUFBLFlBQVM7QUFBQSxZQUFTO0FBQUEsWUFBVTtBQUFBLFlBQVM7QUFBQSxZQUFlO0FBQUEsWUFDMUQ7QUFBQSxZQUFRZ0Q7QUFBQSxZQUFLO0FBQUEsVUFDZjtBQUVBLGNBQUksTUFBTTtBQUNSLHNCQUFVLFNBQVMsSUFBSTtBQUFBLFVBQ3pCO0FBQ0EsaUJBQU8sUUFBUSxDQUFDO0FBQ2hCLG9CQUFVLFFBQVEsQ0FBQztBQUNuQixvQkFBVSxRQUFRLENBQUM7QUFDbkIscUJBQVcsUUFBUSxDQUFDO0FBQ3BCLG9CQUFVLFFBQVEsQ0FBQztBQUNuQixrQkFBUSxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTWhELGFBQy9CLFlBQVksSUFBSSxLQUFLLFNBQ3RCLFVBQVUsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDO0FBRXBDLGNBQUksQ0FBQyxTQUFTLFdBQVcsa0JBQWtCLHdCQUF3QjtBQUNqRSx1QkFBVyxFQUFFLGtCQUFrQjtBQUFBLFVBQ2pDO0FBQ0EsY0FBSSxDQUFDLFdBQVcsV0FBVyxnQkFBZ0I7QUFDekMsZ0JBQUkwQixVQUFTLFdBQVcsTUFBTSxTQUFTLE9BQU87QUFBQSxVQUNoRCxXQUFXLFdBQVcsbUJBQW1CLFdBQVcsdUJBQXVCO0FBQ3pFLFlBQUFBLFVBQVMsWUFBWSxNQUFNLFNBQVMsS0FBSztBQUFBLFVBQzNDLFlBQVksV0FBVyxxQkFBcUIsWUFBWSxpQkFBaUIsdUJBQXVCLENBQUMsUUFBUSxRQUFRO0FBQy9HLFlBQUFBLFVBQVMsY0FBYyxNQUFNLFNBQVMsU0FBUyxRQUFRO0FBQUEsVUFDekQsT0FBTztBQUNMLFlBQUFBLFVBQVMsYUFBYSxNQUFNMUIsWUFBVyxPQUFPO0FBQUEsVUFDaEQ7QUFDQSxjQUFJLFNBQVMsT0FBTyxjQUFjO0FBQ2xDLGlCQUFPLGdCQUFnQixPQUFPMEIsU0FBUSxPQUFPLEdBQUcsTUFBTSxPQUFPO0FBQUEsUUFDL0Q7QUFjQSxpQkFBUyx1QkFBdUIsVUFBVSxVQUFVLEtBQUssUUFBUTtBQUMvRCxjQUFJLGFBQWExQixjQUNaLEdBQUcsVUFBVSxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUNpQixnQkFBZSxLQUFLLFFBQVEsR0FBRyxHQUFJO0FBQ3pFLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQWdCQSxpQkFBUyxvQkFBb0IsVUFBVSxVQUFVLEtBQUssUUFBUWdCLFNBQVEsT0FBTztBQUMzRSxjQUFJLFNBQVMsUUFBUSxLQUFLLFNBQVMsUUFBUSxHQUFHO0FBRTVDLGtCQUFNLElBQUksVUFBVSxRQUFRO0FBQzVCLHNCQUFVLFVBQVUsVUFBVWpDLFlBQVcscUJBQXFCLEtBQUs7QUFDbkUsa0JBQU0sUUFBUSxFQUFFLFFBQVE7QUFBQSxVQUMxQjtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQVdBLGlCQUFTLGdCQUFnQixPQUFPO0FBQzlCLGlCQUFPeUMsZUFBYyxLQUFLLElBQUl6QyxhQUFZO0FBQUEsUUFDNUM7QUFlQSxpQkFBUyxZQUFZLE9BQU8sT0FBTyxTQUFTLFlBQVksV0FBVyxPQUFPO0FBQ3hFLGNBQUksWUFBWSxVQUFVLHNCQUN0QixZQUFZLE1BQU0sUUFDbEIsWUFBWSxNQUFNO0FBRXRCLGNBQUksYUFBYSxhQUFhLEVBQUUsYUFBYSxZQUFZLFlBQVk7QUFDbkUsbUJBQU87QUFBQSxVQUNUO0FBRUEsY0FBSSxhQUFhLE1BQU0sSUFBSSxLQUFLO0FBQ2hDLGNBQUksYUFBYSxNQUFNLElBQUksS0FBSztBQUNoQyxjQUFJLGNBQWMsWUFBWTtBQUM1QixtQkFBTyxjQUFjLFNBQVMsY0FBYztBQUFBLFVBQzlDO0FBQ0EsY0FBSSxRQUFRLElBQ1IwQixVQUFTLE1BQ1QsT0FBUSxVQUFVLHlCQUEwQixJQUFJLGFBQVcxQjtBQUUvRCxnQkFBTSxJQUFJLE9BQU8sS0FBSztBQUN0QixnQkFBTSxJQUFJLE9BQU8sS0FBSztBQUd0QixpQkFBTyxFQUFFLFFBQVEsV0FBVztBQUMxQixnQkFBSSxXQUFXLE1BQU0sS0FBSyxHQUN0QixXQUFXLE1BQU0sS0FBSztBQUUxQixnQkFBSSxZQUFZO0FBQ2Qsa0JBQUksV0FBVyxZQUNYLFdBQVcsVUFBVSxVQUFVLE9BQU8sT0FBTyxPQUFPLEtBQUssSUFDekQsV0FBVyxVQUFVLFVBQVUsT0FBTyxPQUFPLE9BQU8sS0FBSztBQUFBLFlBQy9EO0FBQ0EsZ0JBQUksYUFBYUEsWUFBVztBQUMxQixrQkFBSSxVQUFVO0FBQ1o7QUFBQSxjQUNGO0FBQ0EsY0FBQTBCLFVBQVM7QUFDVDtBQUFBLFlBQ0Y7QUFFQSxnQkFBSSxNQUFNO0FBQ1Isa0JBQUksQ0FBQyxVQUFVLE9BQU8sU0FBU3lCLFdBQVUsVUFBVTtBQUM3QyxvQkFBSSxDQUFDLFNBQVMsTUFBTSxRQUFRLE1BQ3ZCLGFBQWFBLGFBQVksVUFBVSxVQUFVQSxXQUFVLFNBQVMsWUFBWSxLQUFLLElBQUk7QUFDeEYseUJBQU8sS0FBSyxLQUFLLFFBQVE7QUFBQSxnQkFDM0I7QUFBQSxjQUNGLENBQUMsR0FBRztBQUNOLGdCQUFBekIsVUFBUztBQUNUO0FBQUEsY0FDRjtBQUFBLFlBQ0YsV0FBVyxFQUNMLGFBQWEsWUFDWCxVQUFVLFVBQVUsVUFBVSxTQUFTLFlBQVksS0FBSyxJQUN6RDtBQUNMLGNBQUFBLFVBQVM7QUFDVDtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQ0EsZ0JBQU0sUUFBUSxFQUFFLEtBQUs7QUFDckIsZ0JBQU0sUUFBUSxFQUFFLEtBQUs7QUFDckIsaUJBQU9BO0FBQUEsUUFDVDtBQW1CQSxpQkFBUyxXQUFXLFFBQVEsT0FBTyxLQUFLLFNBQVMsWUFBWSxXQUFXLE9BQU87QUFDN0Usa0JBQVEsS0FBSztBQUFBLFlBQ1gsS0FBSztBQUNILGtCQUFLLE9BQU8sY0FBYyxNQUFNLGNBQzNCLE9BQU8sY0FBYyxNQUFNLFlBQWE7QUFDM0MsdUJBQU87QUFBQSxjQUNUO0FBQ0EsdUJBQVMsT0FBTztBQUNoQixzQkFBUSxNQUFNO0FBQUEsWUFFaEIsS0FBSztBQUNILGtCQUFLLE9BQU8sY0FBYyxNQUFNLGNBQzVCLENBQUMsVUFBVSxJQUFJTCxZQUFXLE1BQU0sR0FBRyxJQUFJQSxZQUFXLEtBQUssQ0FBQyxHQUFHO0FBQzdELHVCQUFPO0FBQUEsY0FDVDtBQUNBLHFCQUFPO0FBQUEsWUFFVCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBR0gscUJBQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLO0FBQUEsWUFFM0IsS0FBSztBQUNILHFCQUFPLE9BQU8sUUFBUSxNQUFNLFFBQVEsT0FBTyxXQUFXLE1BQU07QUFBQSxZQUU5RCxLQUFLO0FBQUEsWUFDTCxLQUFLO0FBSUgscUJBQU8sVUFBVyxRQUFRO0FBQUEsWUFFNUIsS0FBSztBQUNILGtCQUFJLFVBQVU7QUFBQSxZQUVoQixLQUFLO0FBQ0gsa0JBQUksWUFBWSxVQUFVO0FBQzFCLDBCQUFZLFVBQVU7QUFFdEIsa0JBQUksT0FBTyxRQUFRLE1BQU0sUUFBUSxDQUFDLFdBQVc7QUFDM0MsdUJBQU87QUFBQSxjQUNUO0FBRUEsa0JBQUksVUFBVSxNQUFNLElBQUksTUFBTTtBQUM5QixrQkFBSSxTQUFTO0FBQ1gsdUJBQU8sV0FBVztBQUFBLGNBQ3BCO0FBQ0EseUJBQVc7QUFHWCxvQkFBTSxJQUFJLFFBQVEsS0FBSztBQUN2QixrQkFBSUssVUFBUyxZQUFZLFFBQVEsTUFBTSxHQUFHLFFBQVEsS0FBSyxHQUFHLFNBQVMsWUFBWSxXQUFXLEtBQUs7QUFDL0Ysb0JBQU0sUUFBUSxFQUFFLE1BQU07QUFDdEIscUJBQU9BO0FBQUEsWUFFVCxLQUFLO0FBQ0gsa0JBQUksZUFBZTtBQUNqQix1QkFBTyxjQUFjLEtBQUssTUFBTSxLQUFLLGNBQWMsS0FBSyxLQUFLO0FBQUEsY0FDL0Q7QUFBQSxVQUNKO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBZUEsaUJBQVMsYUFBYSxRQUFRLE9BQU8sU0FBUyxZQUFZLFdBQVcsT0FBTztBQUMxRSxjQUFJLFlBQVksVUFBVSxzQkFDdEIsV0FBVyxXQUFXLE1BQU0sR0FDNUIsWUFBWSxTQUFTLFFBQ3JCLFdBQVcsV0FBVyxLQUFLLEdBQzNCLFlBQVksU0FBUztBQUV6QixjQUFJLGFBQWEsYUFBYSxDQUFDLFdBQVc7QUFDeEMsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxRQUFRO0FBQ1osaUJBQU8sU0FBUztBQUNkLGdCQUFJLE1BQU0sU0FBUyxLQUFLO0FBQ3hCLGdCQUFJLEVBQUUsWUFBWSxPQUFPLFFBQVFULGdCQUFlLEtBQUssT0FBTyxHQUFHLElBQUk7QUFDakUscUJBQU87QUFBQSxZQUNUO0FBQUEsVUFDRjtBQUVBLGNBQUksYUFBYSxNQUFNLElBQUksTUFBTTtBQUNqQyxjQUFJLGFBQWEsTUFBTSxJQUFJLEtBQUs7QUFDaEMsY0FBSSxjQUFjLFlBQVk7QUFDNUIsbUJBQU8sY0FBYyxTQUFTLGNBQWM7QUFBQSxVQUM5QztBQUNBLGNBQUlTLFVBQVM7QUFDYixnQkFBTSxJQUFJLFFBQVEsS0FBSztBQUN2QixnQkFBTSxJQUFJLE9BQU8sTUFBTTtBQUV2QixjQUFJLFdBQVc7QUFDZixpQkFBTyxFQUFFLFFBQVEsV0FBVztBQUMxQixrQkFBTSxTQUFTLEtBQUs7QUFDcEIsZ0JBQUksV0FBVyxPQUFPLEdBQUcsR0FDckIsV0FBVyxNQUFNLEdBQUc7QUFFeEIsZ0JBQUksWUFBWTtBQUNkLGtCQUFJLFdBQVcsWUFDWCxXQUFXLFVBQVUsVUFBVSxLQUFLLE9BQU8sUUFBUSxLQUFLLElBQ3hELFdBQVcsVUFBVSxVQUFVLEtBQUssUUFBUSxPQUFPLEtBQUs7QUFBQSxZQUM5RDtBQUVBLGdCQUFJLEVBQUUsYUFBYTFCLGFBQ1YsYUFBYSxZQUFZLFVBQVUsVUFBVSxVQUFVLFNBQVMsWUFBWSxLQUFLLElBQ2xGLFdBQ0Q7QUFDTCxjQUFBMEIsVUFBUztBQUNUO0FBQUEsWUFDRjtBQUNBLHlCQUFhLFdBQVcsT0FBTztBQUFBLFVBQ2pDO0FBQ0EsY0FBSUEsV0FBVSxDQUFDLFVBQVU7QUFDdkIsZ0JBQUksVUFBVSxPQUFPLGFBQ2pCLFVBQVUsTUFBTTtBQUdwQixnQkFBSSxXQUFXLFlBQ1YsaUJBQWlCLFVBQVUsaUJBQWlCLFVBQzdDLEVBQUUsT0FBTyxXQUFXLGNBQWMsbUJBQW1CLFdBQ25ELE9BQU8sV0FBVyxjQUFjLG1CQUFtQixVQUFVO0FBQ2pFLGNBQUFBLFVBQVM7QUFBQSxZQUNYO0FBQUEsVUFDRjtBQUNBLGdCQUFNLFFBQVEsRUFBRSxNQUFNO0FBQ3RCLGdCQUFNLFFBQVEsRUFBRSxLQUFLO0FBQ3JCLGlCQUFPQTtBQUFBLFFBQ1Q7QUFTQSxpQkFBUyxTQUFTLE1BQU07QUFDdEIsaUJBQU8sWUFBWSxTQUFTLE1BQU0xQixZQUFXLE9BQU8sR0FBRyxPQUFPLEVBQUU7QUFBQSxRQUNsRTtBQVNBLGlCQUFTLFdBQVcsUUFBUTtBQUMxQixpQkFBTyxlQUFlLFFBQVFrQyxPQUFNLFVBQVU7QUFBQSxRQUNoRDtBQVVBLGlCQUFTLGFBQWEsUUFBUTtBQUM1QixpQkFBTyxlQUFlLFFBQVEsUUFBUSxZQUFZO0FBQUEsUUFDcEQ7QUFTQSxZQUFJLFVBQVUsQ0FBQyxVQUFVZ0IsUUFBTyxTQUFTLE1BQU07QUFDN0MsaUJBQU8sUUFBUSxJQUFJLElBQUk7QUFBQSxRQUN6QjtBQVNBLGlCQUFTLFlBQVksTUFBTTtBQUN6QixjQUFJeEIsVUFBVSxLQUFLLE9BQU8sSUFDdEIsUUFBUSxVQUFVQSxPQUFNLEdBQ3hCLFNBQVNULGdCQUFlLEtBQUssV0FBV1MsT0FBTSxJQUFJLE1BQU0sU0FBUztBQUVyRSxpQkFBTyxVQUFVO0FBQ2YsZ0JBQUksT0FBTyxNQUFNLE1BQU0sR0FDbkIsWUFBWSxLQUFLO0FBQ3JCLGdCQUFJLGFBQWEsUUFBUSxhQUFhLE1BQU07QUFDMUMscUJBQU8sS0FBSztBQUFBLFlBQ2Q7QUFBQSxVQUNGO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQVNBLGlCQUFTLFVBQVUsTUFBTTtBQUN2QixjQUFJLFNBQVNULGdCQUFlLEtBQUssUUFBUSxhQUFhLElBQUksU0FBUztBQUNuRSxpQkFBTyxPQUFPO0FBQUEsUUFDaEI7QUFhQSxpQkFBUyxjQUFjO0FBQ3JCLGNBQUlTLFVBQVMsT0FBTyxZQUFZO0FBQ2hDLFVBQUFBLFVBQVNBLFlBQVcsV0FBVyxlQUFlQTtBQUM5QyxpQkFBTyxVQUFVLFNBQVNBLFFBQU8sVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsSUFBSUE7QUFBQSxRQUNqRTtBQVVBLGlCQUFTLFdBQVdyQixNQUFLLEtBQUs7QUFDNUIsY0FBSSxPQUFPQSxLQUFJO0FBQ2YsaUJBQU8sVUFBVSxHQUFHLElBQ2hCLEtBQUssT0FBTyxPQUFPLFdBQVcsV0FBVyxNQUFNLElBQy9DLEtBQUs7QUFBQSxRQUNYO0FBU0EsaUJBQVMsYUFBYSxRQUFRO0FBQzVCLGNBQUlxQixVQUFTUSxNQUFLLE1BQU0sR0FDcEIsU0FBU1IsUUFBTztBQUVwQixpQkFBTyxVQUFVO0FBQ2YsZ0JBQUksTUFBTUEsUUFBTyxNQUFNLEdBQ25CLFFBQVEsT0FBTyxHQUFHO0FBRXRCLFlBQUFBLFFBQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxPQUFPLG1CQUFtQixLQUFLLENBQUM7QUFBQSxVQUN6RDtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxVQUFVLFFBQVEsS0FBSztBQUM5QixjQUFJLFFBQVEsU0FBUyxRQUFRLEdBQUc7QUFDaEMsaUJBQU8sYUFBYSxLQUFLLElBQUksUUFBUTFCO0FBQUEsUUFDdkM7QUFTQSxpQkFBUyxVQUFVLE9BQU87QUFDeEIsY0FBSSxRQUFRaUIsZ0JBQWUsS0FBSyxPQUFPLGNBQWMsR0FDakQsTUFBTSxNQUFNLGNBQWM7QUFFOUIsY0FBSTtBQUNGLGtCQUFNLGNBQWMsSUFBSWpCO0FBQ3hCLGdCQUFJLFdBQVc7QUFBQSxVQUNqQixTQUFTLEdBQUc7QUFBQSxVQUFDO0FBRWIsY0FBSTBCLFVBQVMscUJBQXFCLEtBQUssS0FBSztBQUM1QyxjQUFJLFVBQVU7QUFDWixnQkFBSSxPQUFPO0FBQ1Qsb0JBQU0sY0FBYyxJQUFJO0FBQUEsWUFDMUIsT0FBTztBQUNMLHFCQUFPLE1BQU0sY0FBYztBQUFBLFlBQzdCO0FBQUEsVUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUFTQSxZQUFJLGFBQWEsQ0FBQyxtQkFBbUIsWUFBWSxTQUFTLFFBQVE7QUFDaEUsY0FBSSxVQUFVLE1BQU07QUFDbEIsbUJBQU8sQ0FBQztBQUFBLFVBQ1Y7QUFDQSxtQkFBU2IsUUFBTyxNQUFNO0FBQ3RCLGlCQUFPLFlBQVksaUJBQWlCLE1BQU0sR0FBRyxTQUFTLFFBQVE7QUFDNUQsbUJBQU8scUJBQXFCLEtBQUssUUFBUSxNQUFNO0FBQUEsVUFDakQsQ0FBQztBQUFBLFFBQ0g7QUFTQSxZQUFJLGVBQWUsQ0FBQyxtQkFBbUIsWUFBWSxTQUFTLFFBQVE7QUFDbEUsY0FBSWEsVUFBUyxDQUFDO0FBQ2QsaUJBQU8sUUFBUTtBQUNiLHNCQUFVQSxTQUFRLFdBQVcsTUFBTSxDQUFDO0FBQ3BDLHFCQUFTLGFBQWEsTUFBTTtBQUFBLFVBQzlCO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQVNBLFlBQUksU0FBUztBQUdiLFlBQUssWUFBWSxPQUFPLElBQUksU0FBUyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxlQUN4REosUUFBTyxPQUFPLElBQUlBLE1BQUcsS0FBSyxVQUMxQkMsWUFBVyxPQUFPQSxTQUFRLFFBQVEsQ0FBQyxLQUFLLGNBQ3hDQyxRQUFPLE9BQU8sSUFBSUEsTUFBRyxLQUFLLFVBQzFCQyxZQUFXLE9BQU8sSUFBSUEsVUFBTyxLQUFLLFlBQWE7QUFDbEQsbUJBQVMsU0FBUyxPQUFPO0FBQ3ZCLGdCQUFJQyxVQUFTLFdBQVcsS0FBSyxHQUN6QixPQUFPQSxXQUFVLFlBQVksTUFBTSxjQUFjMUIsWUFDakQsYUFBYSxPQUFPLFNBQVMsSUFBSSxJQUFJO0FBRXpDLGdCQUFJLFlBQVk7QUFDZCxzQkFBUSxZQUFZO0FBQUEsZ0JBQ2xCLEtBQUs7QUFBb0IseUJBQU87QUFBQSxnQkFDaEMsS0FBSztBQUFlLHlCQUFPO0FBQUEsZ0JBQzNCLEtBQUs7QUFBbUIseUJBQU87QUFBQSxnQkFDL0IsS0FBSztBQUFlLHlCQUFPO0FBQUEsZ0JBQzNCLEtBQUs7QUFBbUIseUJBQU87QUFBQSxjQUNqQztBQUFBLFlBQ0Y7QUFDQSxtQkFBTzBCO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFZQSxpQkFBUyxRQUFRQyxRQUFPQyxNQUFLLFlBQVk7QUFDdkMsY0FBSSxRQUFRLElBQ1IsU0FBUyxXQUFXO0FBRXhCLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGdCQUFJLE9BQU8sV0FBVyxLQUFLLEdBQ3ZCRSxRQUFPLEtBQUs7QUFFaEIsb0JBQVEsS0FBSyxNQUFNO0FBQUEsY0FDakIsS0FBSztBQUFhLGdCQUFBSCxVQUFTRztBQUFNO0FBQUEsY0FDakMsS0FBSztBQUFhLGdCQUFBRixRQUFPRTtBQUFNO0FBQUEsY0FDL0IsS0FBSztBQUFhLGdCQUFBRixPQUFNLFVBQVVBLE1BQUtELFNBQVFHLEtBQUk7QUFBRztBQUFBLGNBQ3RELEtBQUs7QUFBYSxnQkFBQUgsU0FBUSxVQUFVQSxRQUFPQyxPQUFNRSxLQUFJO0FBQUc7QUFBQSxZQUMxRDtBQUFBLFVBQ0Y7QUFDQSxpQkFBTyxFQUFFLFNBQVNILFFBQU8sT0FBT0MsS0FBSTtBQUFBLFFBQ3RDO0FBU0EsaUJBQVMsZUFBZUssU0FBUTtBQUM5QixjQUFJLFFBQVFBLFFBQU8sTUFBTSxhQUFhO0FBQ3RDLGlCQUFPLFFBQVEsTUFBTSxDQUFDLEVBQUUsTUFBTSxjQUFjLElBQUksQ0FBQztBQUFBLFFBQ25EO0FBV0EsaUJBQVMsUUFBUSxRQUFRLE1BQU0sU0FBUztBQUN0QyxpQkFBTyxTQUFTLE1BQU0sTUFBTTtBQUU1QixjQUFJLFFBQVEsSUFDUixTQUFTLEtBQUssUUFDZFAsVUFBUztBQUViLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGdCQUFJLE1BQU0sTUFBTSxLQUFLLEtBQUssQ0FBQztBQUMzQixnQkFBSSxFQUFFQSxVQUFTLFVBQVUsUUFBUSxRQUFRLFFBQVEsR0FBRyxJQUFJO0FBQ3REO0FBQUEsWUFDRjtBQUNBLHFCQUFTLE9BQU8sR0FBRztBQUFBLFVBQ3JCO0FBQ0EsY0FBSUEsV0FBVSxFQUFFLFNBQVMsUUFBUTtBQUMvQixtQkFBT0E7QUFBQSxVQUNUO0FBQ0EsbUJBQVMsVUFBVSxPQUFPLElBQUksT0FBTztBQUNyQyxpQkFBTyxDQUFDLENBQUMsVUFBVSxTQUFTLE1BQU0sS0FBSyxRQUFRLEtBQUssTUFBTSxNQUN2RCxRQUFRLE1BQU0sS0FBSyxZQUFZLE1BQU07QUFBQSxRQUMxQztBQVNBLGlCQUFTLGVBQWUsT0FBTztBQUM3QixjQUFJLFNBQVMsTUFBTSxRQUNmQSxVQUFTLElBQUksTUFBTSxZQUFZLE1BQU07QUFHekMsY0FBSSxVQUFVLE9BQU8sTUFBTSxDQUFDLEtBQUssWUFBWVQsZ0JBQWUsS0FBSyxPQUFPLE9BQU8sR0FBRztBQUNoRixZQUFBUyxRQUFPLFFBQVEsTUFBTTtBQUNyQixZQUFBQSxRQUFPLFFBQVEsTUFBTTtBQUFBLFVBQ3ZCO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQVNBLGlCQUFTLGdCQUFnQixRQUFRO0FBQy9CLGlCQUFRLE9BQU8sT0FBTyxlQUFlLGNBQWMsQ0FBQyxZQUFZLE1BQU0sSUFDbEUsV0FBVyxhQUFhLE1BQU0sQ0FBQyxJQUMvQixDQUFDO0FBQUEsUUFDUDtBQWNBLGlCQUFTLGVBQWUsUUFBUSxLQUFLLFFBQVE7QUFDM0MsY0FBSSxPQUFPLE9BQU87QUFDbEIsa0JBQVEsS0FBSztBQUFBLFlBQ1gsS0FBSztBQUNILHFCQUFPLGlCQUFpQixNQUFNO0FBQUEsWUFFaEMsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUNILHFCQUFPLElBQUksS0FBSyxDQUFDLE1BQU07QUFBQSxZQUV6QixLQUFLO0FBQ0gscUJBQU8sY0FBYyxRQUFRLE1BQU07QUFBQSxZQUVyQyxLQUFLO0FBQUEsWUFBWSxLQUFLO0FBQUEsWUFDdEIsS0FBSztBQUFBLFlBQVMsS0FBSztBQUFBLFlBQVUsS0FBSztBQUFBLFlBQ2xDLEtBQUs7QUFBQSxZQUFVLEtBQUs7QUFBQSxZQUFpQixLQUFLO0FBQUEsWUFBVyxLQUFLO0FBQ3hELHFCQUFPLGdCQUFnQixRQUFRLE1BQU07QUFBQSxZQUV2QyxLQUFLO0FBQ0gscUJBQU8sSUFBSTtBQUFBLFlBRWIsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUNILHFCQUFPLElBQUksS0FBSyxNQUFNO0FBQUEsWUFFeEIsS0FBSztBQUNILHFCQUFPLFlBQVksTUFBTTtBQUFBLFlBRTNCLEtBQUs7QUFDSCxxQkFBTyxJQUFJO0FBQUEsWUFFYixLQUFLO0FBQ0gscUJBQU8sWUFBWSxNQUFNO0FBQUEsVUFDN0I7QUFBQSxRQUNGO0FBVUEsaUJBQVMsa0JBQWtCTyxTQUFRLFNBQVM7QUFDMUMsY0FBSSxTQUFTLFFBQVE7QUFDckIsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBT0E7QUFBQSxVQUNUO0FBQ0EsY0FBSSxZQUFZLFNBQVM7QUFDekIsa0JBQVEsU0FBUyxLQUFLLFNBQVMsSUFBSSxPQUFPLE1BQU0sUUFBUSxTQUFTO0FBQ2pFLG9CQUFVLFFBQVEsS0FBSyxTQUFTLElBQUksT0FBTyxHQUFHO0FBQzlDLGlCQUFPQSxRQUFPLFFBQVEsZUFBZSx5QkFBeUIsVUFBVSxRQUFRO0FBQUEsUUFDbEY7QUFTQSxpQkFBUyxjQUFjLE9BQU87QUFDNUIsaUJBQU8sUUFBUSxLQUFLLEtBQUssWUFBWSxLQUFLLEtBQ3hDLENBQUMsRUFBRSxvQkFBb0IsU0FBUyxNQUFNLGdCQUFnQjtBQUFBLFFBQzFEO0FBVUEsaUJBQVMsUUFBUSxPQUFPLFFBQVE7QUFDOUIsY0FBSSxPQUFPLE9BQU87QUFDbEIsbUJBQVMsVUFBVSxPQUFPLG1CQUFtQjtBQUU3QyxpQkFBTyxDQUFDLENBQUMsV0FDTixRQUFRLFlBQ04sUUFBUSxZQUFZLFNBQVMsS0FBSyxLQUFLLE9BQ3JDLFFBQVEsTUFBTSxRQUFRLEtBQUssS0FBSyxRQUFRO0FBQUEsUUFDakQ7QUFZQSxpQkFBUyxlQUFlLE9BQU8sT0FBTyxRQUFRO0FBQzVDLGNBQUksQ0FBQyxTQUFTLE1BQU0sR0FBRztBQUNyQixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLE9BQU8sT0FBTztBQUNsQixjQUFJLFFBQVEsV0FDSCxZQUFZLE1BQU0sS0FBSyxRQUFRLE9BQU8sT0FBTyxNQUFNLElBQ25ELFFBQVEsWUFBWSxTQUFTLFFBQ2hDO0FBQ0osbUJBQU8sR0FBRyxPQUFPLEtBQUssR0FBRyxLQUFLO0FBQUEsVUFDaEM7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFVQSxpQkFBUyxNQUFNLE9BQU8sUUFBUTtBQUM1QixjQUFJLFFBQVEsS0FBSyxHQUFHO0FBQ2xCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUksT0FBTyxPQUFPO0FBQ2xCLGNBQUksUUFBUSxZQUFZLFFBQVEsWUFBWSxRQUFRLGFBQ2hELFNBQVMsUUFBUSxTQUFTLEtBQUssR0FBRztBQUNwQyxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxpQkFBTyxjQUFjLEtBQUssS0FBSyxLQUFLLENBQUMsYUFBYSxLQUFLLEtBQUssS0FDekQsVUFBVSxRQUFRLFNBQVNwQixRQUFPLE1BQU07QUFBQSxRQUM3QztBQVNBLGlCQUFTLFVBQVUsT0FBTztBQUN4QixjQUFJLE9BQU8sT0FBTztBQUNsQixpQkFBUSxRQUFRLFlBQVksUUFBUSxZQUFZLFFBQVEsWUFBWSxRQUFRLFlBQ3ZFLFVBQVUsY0FDVixVQUFVO0FBQUEsUUFDakI7QUFVQSxpQkFBUyxXQUFXLE1BQU07QUFDeEIsY0FBSSxXQUFXLFlBQVksSUFBSSxHQUMzQixRQUFRLE9BQU8sUUFBUTtBQUUzQixjQUFJLE9BQU8sU0FBUyxjQUFjLEVBQUUsWUFBWSxZQUFZLFlBQVk7QUFDdEUsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxTQUFTLE9BQU87QUFDbEIsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxPQUFPLFFBQVEsS0FBSztBQUN4QixpQkFBTyxDQUFDLENBQUMsUUFBUSxTQUFTLEtBQUssQ0FBQztBQUFBLFFBQ2xDO0FBU0EsaUJBQVMsU0FBUyxNQUFNO0FBQ3RCLGlCQUFPLENBQUMsQ0FBQyxjQUFlLGNBQWM7QUFBQSxRQUN4QztBQVNBLFlBQUksYUFBYSxhQUFhMEIsY0FBYTtBQVMzQyxpQkFBUyxZQUFZLE9BQU87QUFDMUIsY0FBSSxPQUFPLFNBQVMsTUFBTSxhQUN0QixRQUFTLE9BQU8sUUFBUSxjQUFjLEtBQUssYUFBYztBQUU3RCxpQkFBTyxVQUFVO0FBQUEsUUFDbkI7QUFVQSxpQkFBUyxtQkFBbUIsT0FBTztBQUNqQyxpQkFBTyxVQUFVLFNBQVMsQ0FBQyxTQUFTLEtBQUs7QUFBQSxRQUMzQztBQVdBLGlCQUFTLHdCQUF3QixLQUFLLFVBQVU7QUFDOUMsaUJBQU8sU0FBUyxRQUFRO0FBQ3RCLGdCQUFJLFVBQVUsTUFBTTtBQUNsQixxQkFBTztBQUFBLFlBQ1Q7QUFDQSxtQkFBTyxPQUFPLEdBQUcsTUFBTSxhQUNwQixhQUFhdkMsY0FBYyxPQUFPYSxRQUFPLE1BQU07QUFBQSxVQUNwRDtBQUFBLFFBQ0Y7QUFVQSxpQkFBUyxjQUFjLE1BQU07QUFDM0IsY0FBSWEsVUFBUyxRQUFRLE1BQU0sU0FBUyxLQUFLO0FBQ3ZDLGdCQUFJdEIsT0FBTSxTQUFTLGtCQUFrQjtBQUNuQyxjQUFBQSxPQUFNLE1BQU07QUFBQSxZQUNkO0FBQ0EsbUJBQU87QUFBQSxVQUNULENBQUM7QUFFRCxjQUFJQSxTQUFRc0IsUUFBTztBQUNuQixpQkFBT0E7QUFBQSxRQUNUO0FBa0JBLGlCQUFTLFVBQVUsTUFBTU8sU0FBUTtBQUMvQixjQUFJLFVBQVUsS0FBSyxDQUFDLEdBQ2hCLGFBQWFBLFFBQU8sQ0FBQyxHQUNyQixhQUFhLFVBQVUsWUFDdkIsV0FBVyxjQUFjLGlCQUFpQixxQkFBcUI7QUFFbkUsY0FBSSxVQUNBLGNBQWMsaUJBQW1CLFdBQVcsbUJBQzVDLGNBQWMsaUJBQW1CLFdBQVcsbUJBQXFCLEtBQUssQ0FBQyxFQUFFLFVBQVVBLFFBQU8sQ0FBQyxLQUMzRixlQUFlLGdCQUFnQixvQkFBc0JBLFFBQU8sQ0FBQyxFQUFFLFVBQVVBLFFBQU8sQ0FBQyxLQUFPLFdBQVc7QUFHdkcsY0FBSSxFQUFFLFlBQVksVUFBVTtBQUMxQixtQkFBTztBQUFBLFVBQ1Q7QUFFQSxjQUFJLGFBQWEsZ0JBQWdCO0FBQy9CLGlCQUFLLENBQUMsSUFBSUEsUUFBTyxDQUFDO0FBRWxCLDBCQUFjLFVBQVUsaUJBQWlCLElBQUk7QUFBQSxVQUMvQztBQUVBLGNBQUksUUFBUUEsUUFBTyxDQUFDO0FBQ3BCLGNBQUksT0FBTztBQUNULGdCQUFJLFdBQVcsS0FBSyxDQUFDO0FBQ3JCLGlCQUFLLENBQUMsSUFBSSxXQUFXLFlBQVksVUFBVSxPQUFPQSxRQUFPLENBQUMsQ0FBQyxJQUFJO0FBQy9ELGlCQUFLLENBQUMsSUFBSSxXQUFXLGVBQWUsS0FBSyxDQUFDLEdBQUcsV0FBVyxJQUFJQSxRQUFPLENBQUM7QUFBQSxVQUN0RTtBQUVBLGtCQUFRQSxRQUFPLENBQUM7QUFDaEIsY0FBSSxPQUFPO0FBQ1QsdUJBQVcsS0FBSyxDQUFDO0FBQ2pCLGlCQUFLLENBQUMsSUFBSSxXQUFXLGlCQUFpQixVQUFVLE9BQU9BLFFBQU8sQ0FBQyxDQUFDLElBQUk7QUFDcEUsaUJBQUssQ0FBQyxJQUFJLFdBQVcsZUFBZSxLQUFLLENBQUMsR0FBRyxXQUFXLElBQUlBLFFBQU8sQ0FBQztBQUFBLFVBQ3RFO0FBRUEsa0JBQVFBLFFBQU8sQ0FBQztBQUNoQixjQUFJLE9BQU87QUFDVCxpQkFBSyxDQUFDLElBQUk7QUFBQSxVQUNaO0FBRUEsY0FBSSxhQUFhLGVBQWU7QUFDOUIsaUJBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLE9BQU9BLFFBQU8sQ0FBQyxJQUFJLFVBQVUsS0FBSyxDQUFDLEdBQUdBLFFBQU8sQ0FBQyxDQUFDO0FBQUEsVUFDdEU7QUFFQSxjQUFJLEtBQUssQ0FBQyxLQUFLLE1BQU07QUFDbkIsaUJBQUssQ0FBQyxJQUFJQSxRQUFPLENBQUM7QUFBQSxVQUNwQjtBQUVBLGVBQUssQ0FBQyxJQUFJQSxRQUFPLENBQUM7QUFDbEIsZUFBSyxDQUFDLElBQUk7QUFFVixpQkFBTztBQUFBLFFBQ1Q7QUFXQSxpQkFBUyxhQUFhLFFBQVE7QUFDNUIsY0FBSVAsVUFBUyxDQUFDO0FBQ2QsY0FBSSxVQUFVLE1BQU07QUFDbEIscUJBQVMsT0FBT2IsUUFBTyxNQUFNLEdBQUc7QUFDOUIsY0FBQWEsUUFBTyxLQUFLLEdBQUc7QUFBQSxZQUNqQjtBQUFBLFVBQ0Y7QUFDQSxpQkFBT0E7QUFBQSxRQUNUO0FBU0EsaUJBQVMsZUFBZSxPQUFPO0FBQzdCLGlCQUFPLHFCQUFxQixLQUFLLEtBQUs7QUFBQSxRQUN4QztBQVdBLGlCQUFTLFNBQVMsTUFBTUMsUUFBT3lCLFlBQVc7QUFDeEMsVUFBQXpCLFNBQVEsVUFBVUEsV0FBVTNCLGFBQWEsS0FBSyxTQUFTLElBQUsyQixRQUFPLENBQUM7QUFDcEUsaUJBQU8sV0FBVztBQUNoQixnQkFBSSxPQUFPLFdBQ1AsUUFBUSxJQUNSLFNBQVMsVUFBVSxLQUFLLFNBQVNBLFFBQU8sQ0FBQyxHQUN6QyxRQUFRbkIsT0FBTSxNQUFNO0FBRXhCLG1CQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLG9CQUFNLEtBQUssSUFBSSxLQUFLbUIsU0FBUSxLQUFLO0FBQUEsWUFDbkM7QUFDQSxvQkFBUTtBQUNSLGdCQUFJLFlBQVluQixPQUFNbUIsU0FBUSxDQUFDO0FBQy9CLG1CQUFPLEVBQUUsUUFBUUEsUUFBTztBQUN0Qix3QkFBVSxLQUFLLElBQUksS0FBSyxLQUFLO0FBQUEsWUFDL0I7QUFDQSxzQkFBVUEsTUFBSyxJQUFJeUIsV0FBVSxLQUFLO0FBQ2xDLG1CQUFPbkQsT0FBTSxNQUFNLE1BQU0sU0FBUztBQUFBLFVBQ3BDO0FBQUEsUUFDRjtBQVVBLGlCQUFTLE9BQU8sUUFBUSxNQUFNO0FBQzVCLGlCQUFPLEtBQUssU0FBUyxJQUFJLFNBQVMsUUFBUSxRQUFRLFVBQVUsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUFBLFFBQzFFO0FBWUEsaUJBQVMsUUFBUSxPQUFPLFNBQVM7QUFDL0IsY0FBSSxZQUFZLE1BQU0sUUFDbEIsU0FBUyxVQUFVLFFBQVEsUUFBUSxTQUFTLEdBQzVDLFdBQVcsVUFBVSxLQUFLO0FBRTlCLGlCQUFPLFVBQVU7QUFDZixnQkFBSSxRQUFRLFFBQVEsTUFBTTtBQUMxQixrQkFBTSxNQUFNLElBQUksUUFBUSxPQUFPLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSUQ7QUFBQSxVQUNoRTtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQVVBLGlCQUFTLFFBQVEsUUFBUSxLQUFLO0FBQzVCLGNBQUksUUFBUSxpQkFBaUIsT0FBTyxPQUFPLEdBQUcsTUFBTSxZQUFZO0FBQzlEO0FBQUEsVUFDRjtBQUVBLGNBQUksT0FBTyxhQUFhO0FBQ3RCO0FBQUEsVUFDRjtBQUVBLGlCQUFPLE9BQU8sR0FBRztBQUFBLFFBQ25CO0FBZ0JBLFlBQUksVUFBVSxTQUFTLFdBQVc7QUFVbEMsWUFBSXFDLGNBQWEsaUJBQWlCLFNBQVMsTUFBTSxNQUFNO0FBQ3JELGlCQUFPLEtBQUssV0FBVyxNQUFNLElBQUk7QUFBQSxRQUNuQztBQVVBLFlBQUksY0FBYyxTQUFTLGVBQWU7QUFZMUMsaUJBQVMsZ0JBQWdCLFNBQVNnQixZQUFXLFNBQVM7QUFDcEQsY0FBSXBCLFVBQVVvQixhQUFZO0FBQzFCLGlCQUFPLFlBQVksU0FBUyxrQkFBa0JwQixTQUFRLGtCQUFrQixlQUFlQSxPQUFNLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFBQSxRQUMzRztBQVdBLGlCQUFTLFNBQVMsTUFBTTtBQUN0QixjQUFJLFFBQVEsR0FDUixhQUFhO0FBRWpCLGlCQUFPLFdBQVc7QUFDaEIsZ0JBQUksUUFBUSxVQUFVLEdBQ2xCLFlBQVksWUFBWSxRQUFRO0FBRXBDLHlCQUFhO0FBQ2IsZ0JBQUksWUFBWSxHQUFHO0FBQ2pCLGtCQUFJLEVBQUUsU0FBUyxXQUFXO0FBQ3hCLHVCQUFPLFVBQVUsQ0FBQztBQUFBLGNBQ3BCO0FBQUEsWUFDRixPQUFPO0FBQ0wsc0JBQVE7QUFBQSxZQUNWO0FBQ0EsbUJBQU8sS0FBSyxNQUFNakMsWUFBVyxTQUFTO0FBQUEsVUFDeEM7QUFBQSxRQUNGO0FBVUEsaUJBQVMsWUFBWSxPQUFPOEIsT0FBTTtBQUNoQyxjQUFJLFFBQVEsSUFDUixTQUFTLE1BQU0sUUFDZixZQUFZLFNBQVM7QUFFekIsVUFBQUEsUUFBT0EsVUFBUzlCLGFBQVksU0FBUzhCO0FBQ3JDLGlCQUFPLEVBQUUsUUFBUUEsT0FBTTtBQUNyQixnQkFBSSxPQUFPLFdBQVcsT0FBTyxTQUFTLEdBQ2xDLFFBQVEsTUFBTSxJQUFJO0FBRXRCLGtCQUFNLElBQUksSUFBSSxNQUFNLEtBQUs7QUFDekIsa0JBQU0sS0FBSyxJQUFJO0FBQUEsVUFDakI7QUFDQSxnQkFBTSxTQUFTQTtBQUNmLGlCQUFPO0FBQUEsUUFDVDtBQVNBLFlBQUksZUFBZSxjQUFjLFNBQVMsUUFBUTtBQUNoRCxjQUFJSixVQUFTLENBQUM7QUFDZCxjQUFJLE9BQU8sV0FBVyxDQUFDLE1BQU0sSUFBWTtBQUN2QyxZQUFBQSxRQUFPLEtBQUssRUFBRTtBQUFBLFVBQ2hCO0FBQ0EsaUJBQU8sUUFBUSxZQUFZLFNBQVMsT0FBTyxRQUFRLE9BQU8sV0FBVztBQUNuRSxZQUFBQSxRQUFPLEtBQUssUUFBUSxVQUFVLFFBQVEsY0FBYyxJQUFJLElBQUssVUFBVSxLQUFNO0FBQUEsVUFDL0UsQ0FBQztBQUNELGlCQUFPQTtBQUFBLFFBQ1QsQ0FBQztBQVNELGlCQUFTLE1BQU0sT0FBTztBQUNwQixjQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsS0FBSyxHQUFHO0FBQy9DLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUlBLFVBQVUsUUFBUTtBQUN0QixpQkFBUUEsV0FBVSxPQUFRLElBQUksU0FBVSxDQUFDLFdBQVksT0FBT0E7QUFBQSxRQUM5RDtBQVNBLGlCQUFTLFNBQVMsTUFBTTtBQUN0QixjQUFJLFFBQVEsTUFBTTtBQUNoQixnQkFBSTtBQUNGLHFCQUFPLGFBQWEsS0FBSyxJQUFJO0FBQUEsWUFDL0IsU0FBUyxHQUFHO0FBQUEsWUFBQztBQUNiLGdCQUFJO0FBQ0YscUJBQVEsT0FBTztBQUFBLFlBQ2pCLFNBQVMsR0FBRztBQUFBLFlBQUM7QUFBQSxVQUNmO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBVUEsaUJBQVMsa0JBQWtCLFNBQVMsU0FBUztBQUMzQyxvQkFBVSxXQUFXLFNBQVMsTUFBTTtBQUNsQyxnQkFBSSxRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3pCLGdCQUFLLFVBQVUsS0FBSyxDQUFDLEtBQU0sQ0FBQyxjQUFjLFNBQVMsS0FBSyxHQUFHO0FBQ3pELHNCQUFRLEtBQUssS0FBSztBQUFBLFlBQ3BCO0FBQUEsVUFDRixDQUFDO0FBQ0QsaUJBQU8sUUFBUSxLQUFLO0FBQUEsUUFDdEI7QUFTQSxpQkFBUyxhQUFhLFNBQVM7QUFDN0IsY0FBSSxtQkFBbUIsYUFBYTtBQUNsQyxtQkFBTyxRQUFRLE1BQU07QUFBQSxVQUN2QjtBQUNBLGNBQUlBLFVBQVMsSUFBSSxjQUFjLFFBQVEsYUFBYSxRQUFRLFNBQVM7QUFDckUsVUFBQUEsUUFBTyxjQUFjLFVBQVUsUUFBUSxXQUFXO0FBQ2xELFVBQUFBLFFBQU8sWUFBYSxRQUFRO0FBQzVCLFVBQUFBLFFBQU8sYUFBYSxRQUFRO0FBQzVCLGlCQUFPQTtBQUFBLFFBQ1Q7QUF5QkEsaUJBQVMsTUFBTSxPQUFPSSxPQUFNLE9BQU87QUFDakMsY0FBSyxRQUFRLGVBQWUsT0FBT0EsT0FBTSxLQUFLLElBQUlBLFVBQVM5QixZQUFZO0FBQ3JFLFlBQUE4QixRQUFPO0FBQUEsVUFDVCxPQUFPO0FBQ0wsWUFBQUEsUUFBTyxVQUFVLFVBQVVBLEtBQUksR0FBRyxDQUFDO0FBQUEsVUFDckM7QUFDQSxjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxjQUFJLENBQUMsVUFBVUEsUUFBTyxHQUFHO0FBQ3ZCLG1CQUFPLENBQUM7QUFBQSxVQUNWO0FBQ0EsY0FBSSxRQUFRLEdBQ1IsV0FBVyxHQUNYSixVQUFTbEIsT0FBTSxXQUFXLFNBQVNzQixLQUFJLENBQUM7QUFFNUMsaUJBQU8sUUFBUSxRQUFRO0FBQ3JCLFlBQUFKLFFBQU8sVUFBVSxJQUFJLFVBQVUsT0FBTyxPQUFRLFNBQVNJLEtBQUs7QUFBQSxVQUM5RDtBQUNBLGlCQUFPSjtBQUFBLFFBQ1Q7QUFpQkEsaUJBQVMsUUFBUSxPQUFPO0FBQ3RCLGNBQUksUUFBUSxJQUNSLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTSxRQUNuQyxXQUFXLEdBQ1hBLFVBQVMsQ0FBQztBQUVkLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGdCQUFJLFFBQVEsTUFBTSxLQUFLO0FBQ3ZCLGdCQUFJLE9BQU87QUFDVCxjQUFBQSxRQUFPLFVBQVUsSUFBSTtBQUFBLFlBQ3ZCO0FBQUEsVUFDRjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUF3QkEsaUJBQVM0QixVQUFTO0FBQ2hCLGNBQUksU0FBUyxVQUFVO0FBQ3ZCLGNBQUksQ0FBQyxRQUFRO0FBQ1gsbUJBQU8sQ0FBQztBQUFBLFVBQ1Y7QUFDQSxjQUFJLE9BQU85QyxPQUFNLFNBQVMsQ0FBQyxHQUN2QixRQUFRLFVBQVUsQ0FBQyxHQUNuQixRQUFRO0FBRVosaUJBQU8sU0FBUztBQUNkLGlCQUFLLFFBQVEsQ0FBQyxJQUFJLFVBQVUsS0FBSztBQUFBLFVBQ25DO0FBQ0EsaUJBQU8sVUFBVSxRQUFRLEtBQUssSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLE1BQU0sQ0FBQyxDQUFDO0FBQUEsUUFDcEY7QUF1QkEsWUFBSSxhQUFhLFNBQVMsU0FBUyxPQUFPdUIsU0FBUTtBQUNoRCxpQkFBTyxrQkFBa0IsS0FBSyxJQUMxQixlQUFlLE9BQU8sWUFBWUEsU0FBUSxHQUFHLG1CQUFtQixJQUFJLENBQUMsSUFDckUsQ0FBQztBQUFBLFFBQ1AsQ0FBQztBQTRCRCxZQUFJLGVBQWUsU0FBUyxTQUFTLE9BQU9BLFNBQVE7QUFDbEQsY0FBSUYsWUFBVyxLQUFLRSxPQUFNO0FBQzFCLGNBQUksa0JBQWtCRixTQUFRLEdBQUc7QUFDL0IsWUFBQUEsWUFBVzdCO0FBQUEsVUFDYjtBQUNBLGlCQUFPLGtCQUFrQixLQUFLLElBQzFCLGVBQWUsT0FBTyxZQUFZK0IsU0FBUSxHQUFHLG1CQUFtQixJQUFJLEdBQUcsWUFBWUYsV0FBVSxDQUFDLENBQUMsSUFDL0YsQ0FBQztBQUFBLFFBQ1AsQ0FBQztBQXlCRCxZQUFJLGlCQUFpQixTQUFTLFNBQVMsT0FBT0UsU0FBUTtBQUNwRCxjQUFJLGFBQWEsS0FBS0EsT0FBTTtBQUM1QixjQUFJLGtCQUFrQixVQUFVLEdBQUc7QUFDakMseUJBQWEvQjtBQUFBLFVBQ2Y7QUFDQSxpQkFBTyxrQkFBa0IsS0FBSyxJQUMxQixlQUFlLE9BQU8sWUFBWStCLFNBQVEsR0FBRyxtQkFBbUIsSUFBSSxHQUFHL0IsWUFBVyxVQUFVLElBQzVGLENBQUM7QUFBQSxRQUNQLENBQUM7QUEyQkQsaUJBQVMsS0FBSyxPQUFPLEdBQUcsT0FBTztBQUM3QixjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxjQUFJLENBQUMsUUFBUTtBQUNYLG1CQUFPLENBQUM7QUFBQSxVQUNWO0FBQ0EsY0FBSyxTQUFTLE1BQU1BLGFBQWEsSUFBSSxVQUFVLENBQUM7QUFDaEQsaUJBQU8sVUFBVSxPQUFPLElBQUksSUFBSSxJQUFJLEdBQUcsTUFBTTtBQUFBLFFBQy9DO0FBMkJBLGlCQUFTLFVBQVUsT0FBTyxHQUFHLE9BQU87QUFDbEMsY0FBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLGNBQUssU0FBUyxNQUFNQSxhQUFhLElBQUksVUFBVSxDQUFDO0FBQ2hELGNBQUksU0FBUztBQUNiLGlCQUFPLFVBQVUsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUM7QUFBQSxRQUMxQztBQXFDQSxpQkFBUyxlQUFlLE9BQU8sV0FBVztBQUN4QyxpQkFBUSxTQUFTLE1BQU0sU0FDbkIsVUFBVSxPQUFPLFlBQVksV0FBVyxDQUFDLEdBQUcsTUFBTSxJQUFJLElBQ3RELENBQUM7QUFBQSxRQUNQO0FBcUNBLGlCQUFTLFVBQVUsT0FBTyxXQUFXO0FBQ25DLGlCQUFRLFNBQVMsTUFBTSxTQUNuQixVQUFVLE9BQU8sWUFBWSxXQUFXLENBQUMsR0FBRyxJQUFJLElBQ2hELENBQUM7QUFBQSxRQUNQO0FBK0JBLGlCQUFTLEtBQUssT0FBTyxPQUFPMkIsUUFBT0MsTUFBSztBQUN0QyxjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxjQUFJLENBQUMsUUFBUTtBQUNYLG1CQUFPLENBQUM7QUFBQSxVQUNWO0FBQ0EsY0FBSUQsVUFBUyxPQUFPQSxVQUFTLFlBQVksZUFBZSxPQUFPLE9BQU9BLE1BQUssR0FBRztBQUM1RSxZQUFBQSxTQUFRO0FBQ1IsWUFBQUMsT0FBTTtBQUFBLFVBQ1I7QUFDQSxpQkFBTyxTQUFTLE9BQU8sT0FBT0QsUUFBT0MsSUFBRztBQUFBLFFBQzFDO0FBcUNBLGlCQUFTLFVBQVUsT0FBTyxXQUFXLFdBQVc7QUFDOUMsY0FBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFFBQVEsYUFBYSxPQUFPLElBQUksVUFBVSxTQUFTO0FBQ3ZELGNBQUksUUFBUSxHQUFHO0FBQ2Isb0JBQVEsVUFBVSxTQUFTLE9BQU8sQ0FBQztBQUFBLFVBQ3JDO0FBQ0EsaUJBQU8sY0FBYyxPQUFPLFlBQVksV0FBVyxDQUFDLEdBQUcsS0FBSztBQUFBLFFBQzlEO0FBcUNBLGlCQUFTLGNBQWMsT0FBTyxXQUFXLFdBQVc7QUFDbEQsY0FBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFFBQVEsU0FBUztBQUNyQixjQUFJLGNBQWM1QixZQUFXO0FBQzNCLG9CQUFRLFVBQVUsU0FBUztBQUMzQixvQkFBUSxZQUFZLElBQ2hCLFVBQVUsU0FBUyxPQUFPLENBQUMsSUFDM0IsVUFBVSxPQUFPLFNBQVMsQ0FBQztBQUFBLFVBQ2pDO0FBQ0EsaUJBQU8sY0FBYyxPQUFPLFlBQVksV0FBVyxDQUFDLEdBQUcsT0FBTyxJQUFJO0FBQUEsUUFDcEU7QUFnQkEsaUJBQVMsUUFBUSxPQUFPO0FBQ3RCLGNBQUksU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNO0FBQ3ZDLGlCQUFPLFNBQVMsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQUEsUUFDM0M7QUFnQkEsaUJBQVMsWUFBWSxPQUFPO0FBQzFCLGNBQUksU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNO0FBQ3ZDLGlCQUFPLFNBQVMsWUFBWSxPQUFPLFFBQVEsSUFBSSxDQUFDO0FBQUEsUUFDbEQ7QUFzQkEsaUJBQVMsYUFBYSxPQUFPLE9BQU87QUFDbEMsY0FBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLGtCQUFRLFVBQVVBLGFBQVksSUFBSSxVQUFVLEtBQUs7QUFDakQsaUJBQU8sWUFBWSxPQUFPLEtBQUs7QUFBQSxRQUNqQztBQWlCQSxpQkFBUyxVQUFVLE9BQU87QUFDeEIsY0FBSSxRQUFRLElBQ1IsU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNLFFBQ25DMEIsVUFBUyxDQUFDO0FBRWQsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksT0FBTyxNQUFNLEtBQUs7QUFDdEIsWUFBQUEsUUFBTyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUFBLFVBQzFCO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVDtBQW9CQSxpQkFBUyxLQUFLLE9BQU87QUFDbkIsaUJBQVEsU0FBUyxNQUFNLFNBQVUsTUFBTSxDQUFDLElBQUkxQjtBQUFBLFFBQzlDO0FBeUJBLGlCQUFTLFFBQVEsT0FBTyxPQUFPLFdBQVc7QUFDeEMsY0FBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFFBQVEsYUFBYSxPQUFPLElBQUksVUFBVSxTQUFTO0FBQ3ZELGNBQUksUUFBUSxHQUFHO0FBQ2Isb0JBQVEsVUFBVSxTQUFTLE9BQU8sQ0FBQztBQUFBLFVBQ3JDO0FBQ0EsaUJBQU8sWUFBWSxPQUFPLE9BQU8sS0FBSztBQUFBLFFBQ3hDO0FBZ0JBLGlCQUFTLFFBQVEsT0FBTztBQUN0QixjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxpQkFBTyxTQUFTLFVBQVUsT0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQUEsUUFDN0M7QUFtQkEsWUFBSSxlQUFlLFNBQVMsU0FBUyxRQUFRO0FBQzNDLGNBQUksU0FBUyxTQUFTLFFBQVEsbUJBQW1CO0FBQ2pELGlCQUFRLE9BQU8sVUFBVSxPQUFPLENBQUMsTUFBTSxPQUFPLENBQUMsSUFDM0MsaUJBQWlCLE1BQU0sSUFDdkIsQ0FBQztBQUFBLFFBQ1AsQ0FBQztBQXlCRCxZQUFJLGlCQUFpQixTQUFTLFNBQVMsUUFBUTtBQUM3QyxjQUFJNkIsWUFBVyxLQUFLLE1BQU0sR0FDdEIsU0FBUyxTQUFTLFFBQVEsbUJBQW1CO0FBRWpELGNBQUlBLGNBQWEsS0FBSyxNQUFNLEdBQUc7QUFDN0IsWUFBQUEsWUFBVzdCO0FBQUEsVUFDYixPQUFPO0FBQ0wsbUJBQU8sSUFBSTtBQUFBLFVBQ2I7QUFDQSxpQkFBUSxPQUFPLFVBQVUsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQzNDLGlCQUFpQixRQUFRLFlBQVk2QixXQUFVLENBQUMsQ0FBQyxJQUNqRCxDQUFDO0FBQUEsUUFDUCxDQUFDO0FBdUJELFlBQUksbUJBQW1CLFNBQVMsU0FBUyxRQUFRO0FBQy9DLGNBQUksYUFBYSxLQUFLLE1BQU0sR0FDeEIsU0FBUyxTQUFTLFFBQVEsbUJBQW1CO0FBRWpELHVCQUFhLE9BQU8sY0FBYyxhQUFhLGFBQWE3QjtBQUM1RCxjQUFJLFlBQVk7QUFDZCxtQkFBTyxJQUFJO0FBQUEsVUFDYjtBQUNBLGlCQUFRLE9BQU8sVUFBVSxPQUFPLENBQUMsTUFBTSxPQUFPLENBQUMsSUFDM0MsaUJBQWlCLFFBQVFBLFlBQVcsVUFBVSxJQUM5QyxDQUFDO0FBQUEsUUFDUCxDQUFDO0FBaUJELGlCQUFTdUQsTUFBSyxPQUFPLFdBQVc7QUFDOUIsaUJBQU8sU0FBUyxPQUFPLEtBQUssV0FBVyxLQUFLLE9BQU8sU0FBUztBQUFBLFFBQzlEO0FBZ0JBLGlCQUFTLEtBQUssT0FBTztBQUNuQixjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxpQkFBTyxTQUFTLE1BQU0sU0FBUyxDQUFDLElBQUl2RDtBQUFBLFFBQ3RDO0FBdUJBLGlCQUFTLFlBQVksT0FBTyxPQUFPLFdBQVc7QUFDNUMsY0FBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFFBQVE7QUFDWixjQUFJLGNBQWNBLFlBQVc7QUFDM0Isb0JBQVEsVUFBVSxTQUFTO0FBQzNCLG9CQUFRLFFBQVEsSUFBSSxVQUFVLFNBQVMsT0FBTyxDQUFDLElBQUksVUFBVSxPQUFPLFNBQVMsQ0FBQztBQUFBLFVBQ2hGO0FBQ0EsaUJBQU8sVUFBVSxRQUNiLGtCQUFrQixPQUFPLE9BQU8sS0FBSyxJQUNyQyxjQUFjLE9BQU8sV0FBVyxPQUFPLElBQUk7QUFBQSxRQUNqRDtBQXVCQSxpQkFBUyxJQUFJLE9BQU8sR0FBRztBQUNyQixpQkFBUSxTQUFTLE1BQU0sU0FBVSxRQUFRLE9BQU8sVUFBVSxDQUFDLENBQUMsSUFBSUE7QUFBQSxRQUNsRTtBQXlCQSxZQUFJLE9BQU8sU0FBUyxPQUFPO0FBc0IzQixpQkFBUyxRQUFRLE9BQU8rQixTQUFRO0FBQzlCLGlCQUFRLFNBQVMsTUFBTSxVQUFVQSxXQUFVQSxRQUFPLFNBQzlDLFlBQVksT0FBT0EsT0FBTSxJQUN6QjtBQUFBLFFBQ047QUF5QkEsaUJBQVMsVUFBVSxPQUFPQSxTQUFRRixXQUFVO0FBQzFDLGlCQUFRLFNBQVMsTUFBTSxVQUFVRSxXQUFVQSxRQUFPLFNBQzlDLFlBQVksT0FBT0EsU0FBUSxZQUFZRixXQUFVLENBQUMsQ0FBQyxJQUNuRDtBQUFBLFFBQ047QUF5QkEsaUJBQVMsWUFBWSxPQUFPRSxTQUFRLFlBQVk7QUFDOUMsaUJBQVEsU0FBUyxNQUFNLFVBQVVBLFdBQVVBLFFBQU8sU0FDOUMsWUFBWSxPQUFPQSxTQUFRL0IsWUFBVyxVQUFVLElBQ2hEO0FBQUEsUUFDTjtBQTBCQSxZQUFJLFNBQVMsU0FBUyxTQUFTLE9BQU8sU0FBUztBQUM3QyxjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTSxRQUNuQzBCLFVBQVMsT0FBTyxPQUFPLE9BQU87QUFFbEMscUJBQVcsT0FBTyxTQUFTLFNBQVMsU0FBUyxPQUFPO0FBQ2xELG1CQUFPLFFBQVEsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRO0FBQUEsVUFDM0MsQ0FBQyxFQUFFLEtBQUssZ0JBQWdCLENBQUM7QUFFekIsaUJBQU9BO0FBQUEsUUFDVCxDQUFDO0FBOEJELGlCQUFTLE9BQU8sT0FBTyxXQUFXO0FBQ2hDLGNBQUlBLFVBQVMsQ0FBQztBQUNkLGNBQUksRUFBRSxTQUFTLE1BQU0sU0FBUztBQUM1QixtQkFBT0E7QUFBQSxVQUNUO0FBQ0EsY0FBSSxRQUFRLElBQ1IsVUFBVSxDQUFDLEdBQ1gsU0FBUyxNQUFNO0FBRW5CLHNCQUFZLFlBQVksV0FBVyxDQUFDO0FBQ3BDLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGdCQUFJLFFBQVEsTUFBTSxLQUFLO0FBQ3ZCLGdCQUFJLFVBQVUsT0FBTyxPQUFPLEtBQUssR0FBRztBQUNsQyxjQUFBQSxRQUFPLEtBQUssS0FBSztBQUNqQixzQkFBUSxLQUFLLEtBQUs7QUFBQSxZQUNwQjtBQUFBLFVBQ0Y7QUFDQSxxQkFBVyxPQUFPLE9BQU87QUFDekIsaUJBQU9BO0FBQUEsUUFDVDtBQXlCQSxpQkFBUyxRQUFRLE9BQU87QUFDdEIsaUJBQU8sU0FBUyxPQUFPLFFBQVEsY0FBYyxLQUFLLEtBQUs7QUFBQSxRQUN6RDtBQWtCQSxpQkFBUzhCLE9BQU0sT0FBTzdCLFFBQU9DLE1BQUs7QUFDaEMsY0FBSSxTQUFTLFNBQVMsT0FBTyxJQUFJLE1BQU07QUFDdkMsY0FBSSxDQUFDLFFBQVE7QUFDWCxtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLGNBQUlBLFFBQU8sT0FBT0EsUUFBTyxZQUFZLGVBQWUsT0FBT0QsUUFBT0MsSUFBRyxHQUFHO0FBQ3RFLFlBQUFELFNBQVE7QUFDUixZQUFBQyxPQUFNO0FBQUEsVUFDUixPQUNLO0FBQ0gsWUFBQUQsU0FBUUEsVUFBUyxPQUFPLElBQUksVUFBVUEsTUFBSztBQUMzQyxZQUFBQyxPQUFNQSxTQUFRNUIsYUFBWSxTQUFTLFVBQVU0QixJQUFHO0FBQUEsVUFDbEQ7QUFDQSxpQkFBTyxVQUFVLE9BQU9ELFFBQU9DLElBQUc7QUFBQSxRQUNwQztBQW1CQSxpQkFBUyxZQUFZLE9BQU8sT0FBTztBQUNqQyxpQkFBTyxnQkFBZ0IsT0FBTyxLQUFLO0FBQUEsUUFDckM7QUEyQkEsaUJBQVMsY0FBYyxPQUFPLE9BQU9DLFdBQVU7QUFDN0MsaUJBQU8sa0JBQWtCLE9BQU8sT0FBTyxZQUFZQSxXQUFVLENBQUMsQ0FBQztBQUFBLFFBQ2pFO0FBa0JBLGlCQUFTLGNBQWMsT0FBTyxPQUFPO0FBQ25DLGNBQUksU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNO0FBQ3ZDLGNBQUksUUFBUTtBQUNWLGdCQUFJLFFBQVEsZ0JBQWdCLE9BQU8sS0FBSztBQUN4QyxnQkFBSSxRQUFRLFVBQVUsR0FBRyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUc7QUFDN0MscUJBQU87QUFBQSxZQUNUO0FBQUEsVUFDRjtBQUNBLGlCQUFPO0FBQUEsUUFDVDtBQW9CQSxpQkFBUyxnQkFBZ0IsT0FBTyxPQUFPO0FBQ3JDLGlCQUFPLGdCQUFnQixPQUFPLE9BQU8sSUFBSTtBQUFBLFFBQzNDO0FBMkJBLGlCQUFTLGtCQUFrQixPQUFPLE9BQU9BLFdBQVU7QUFDakQsaUJBQU8sa0JBQWtCLE9BQU8sT0FBTyxZQUFZQSxXQUFVLENBQUMsR0FBRyxJQUFJO0FBQUEsUUFDdkU7QUFrQkEsaUJBQVMsa0JBQWtCLE9BQU8sT0FBTztBQUN2QyxjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxjQUFJLFFBQVE7QUFDVixnQkFBSSxRQUFRLGdCQUFnQixPQUFPLE9BQU8sSUFBSSxJQUFJO0FBQ2xELGdCQUFJLEdBQUcsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHO0FBQzNCLHFCQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFpQkEsaUJBQVMsV0FBVyxPQUFPO0FBQ3pCLGlCQUFRLFNBQVMsTUFBTSxTQUNuQixlQUFlLEtBQUssSUFDcEIsQ0FBQztBQUFBLFFBQ1A7QUFrQkEsaUJBQVMsYUFBYSxPQUFPQSxXQUFVO0FBQ3JDLGlCQUFRLFNBQVMsTUFBTSxTQUNuQixlQUFlLE9BQU8sWUFBWUEsV0FBVSxDQUFDLENBQUMsSUFDOUMsQ0FBQztBQUFBLFFBQ1A7QUFnQkEsaUJBQVMsS0FBSyxPQUFPO0FBQ25CLGNBQUksU0FBUyxTQUFTLE9BQU8sSUFBSSxNQUFNO0FBQ3ZDLGlCQUFPLFNBQVMsVUFBVSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUM7QUFBQSxRQUNqRDtBQTJCQSxpQkFBUyxLQUFLLE9BQU8sR0FBRyxPQUFPO0FBQzdCLGNBQUksRUFBRSxTQUFTLE1BQU0sU0FBUztBQUM1QixtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLGNBQUssU0FBUyxNQUFNN0IsYUFBYSxJQUFJLFVBQVUsQ0FBQztBQUNoRCxpQkFBTyxVQUFVLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDO0FBQUEsUUFDMUM7QUEyQkEsaUJBQVMsVUFBVSxPQUFPLEdBQUcsT0FBTztBQUNsQyxjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTTtBQUN2QyxjQUFJLENBQUMsUUFBUTtBQUNYLG1CQUFPLENBQUM7QUFBQSxVQUNWO0FBQ0EsY0FBSyxTQUFTLE1BQU1BLGFBQWEsSUFBSSxVQUFVLENBQUM7QUFDaEQsY0FBSSxTQUFTO0FBQ2IsaUJBQU8sVUFBVSxPQUFPLElBQUksSUFBSSxJQUFJLEdBQUcsTUFBTTtBQUFBLFFBQy9DO0FBcUNBLGlCQUFTLGVBQWUsT0FBTyxXQUFXO0FBQ3hDLGlCQUFRLFNBQVMsTUFBTSxTQUNuQixVQUFVLE9BQU8sWUFBWSxXQUFXLENBQUMsR0FBRyxPQUFPLElBQUksSUFDdkQsQ0FBQztBQUFBLFFBQ1A7QUFxQ0EsaUJBQVMsVUFBVSxPQUFPLFdBQVc7QUFDbkMsaUJBQVEsU0FBUyxNQUFNLFNBQ25CLFVBQVUsT0FBTyxZQUFZLFdBQVcsQ0FBQyxDQUFDLElBQzFDLENBQUM7QUFBQSxRQUNQO0FBa0JBLFlBQUksUUFBUSxTQUFTLFNBQVMsUUFBUTtBQUNwQyxpQkFBTyxTQUFTLFlBQVksUUFBUSxHQUFHLG1CQUFtQixJQUFJLENBQUM7QUFBQSxRQUNqRSxDQUFDO0FBeUJELFlBQUksVUFBVSxTQUFTLFNBQVMsUUFBUTtBQUN0QyxjQUFJNkIsWUFBVyxLQUFLLE1BQU07QUFDMUIsY0FBSSxrQkFBa0JBLFNBQVEsR0FBRztBQUMvQixZQUFBQSxZQUFXN0I7QUFBQSxVQUNiO0FBQ0EsaUJBQU8sU0FBUyxZQUFZLFFBQVEsR0FBRyxtQkFBbUIsSUFBSSxHQUFHLFlBQVk2QixXQUFVLENBQUMsQ0FBQztBQUFBLFFBQzNGLENBQUM7QUF1QkQsWUFBSSxZQUFZLFNBQVMsU0FBUyxRQUFRO0FBQ3hDLGNBQUksYUFBYSxLQUFLLE1BQU07QUFDNUIsdUJBQWEsT0FBTyxjQUFjLGFBQWEsYUFBYTdCO0FBQzVELGlCQUFPLFNBQVMsWUFBWSxRQUFRLEdBQUcsbUJBQW1CLElBQUksR0FBR0EsWUFBVyxVQUFVO0FBQUEsUUFDeEYsQ0FBQztBQW9CRCxpQkFBUyxLQUFLLE9BQU87QUFDbkIsaUJBQVEsU0FBUyxNQUFNLFNBQVUsU0FBUyxLQUFLLElBQUksQ0FBQztBQUFBLFFBQ3REO0FBeUJBLGlCQUFTLE9BQU8sT0FBTzZCLFdBQVU7QUFDL0IsaUJBQVEsU0FBUyxNQUFNLFNBQVUsU0FBUyxPQUFPLFlBQVlBLFdBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUFBLFFBQ2hGO0FBc0JBLGlCQUFTLFNBQVMsT0FBTyxZQUFZO0FBQ25DLHVCQUFhLE9BQU8sY0FBYyxhQUFhLGFBQWE3QjtBQUM1RCxpQkFBUSxTQUFTLE1BQU0sU0FBVSxTQUFTLE9BQU9BLFlBQVcsVUFBVSxJQUFJLENBQUM7QUFBQSxRQUM3RTtBQXFCQSxpQkFBUyxNQUFNLE9BQU87QUFDcEIsY0FBSSxFQUFFLFNBQVMsTUFBTSxTQUFTO0FBQzVCLG1CQUFPLENBQUM7QUFBQSxVQUNWO0FBQ0EsY0FBSSxTQUFTO0FBQ2Isa0JBQVEsWUFBWSxPQUFPLFNBQVMsT0FBTztBQUN6QyxnQkFBSSxrQkFBa0IsS0FBSyxHQUFHO0FBQzVCLHVCQUFTLFVBQVUsTUFBTSxRQUFRLE1BQU07QUFDdkMscUJBQU87QUFBQSxZQUNUO0FBQUEsVUFDRixDQUFDO0FBQ0QsaUJBQU8sVUFBVSxRQUFRLFNBQVMsT0FBTztBQUN2QyxtQkFBTyxTQUFTLE9BQU8sYUFBYSxLQUFLLENBQUM7QUFBQSxVQUM1QyxDQUFDO0FBQUEsUUFDSDtBQXVCQSxpQkFBUyxVQUFVLE9BQU82QixXQUFVO0FBQ2xDLGNBQUksRUFBRSxTQUFTLE1BQU0sU0FBUztBQUM1QixtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLGNBQUlILFVBQVMsTUFBTSxLQUFLO0FBQ3hCLGNBQUlHLGFBQVksTUFBTTtBQUNwQixtQkFBT0g7QUFBQSxVQUNUO0FBQ0EsaUJBQU8sU0FBU0EsU0FBUSxTQUFTLE9BQU87QUFDdEMsbUJBQU96QixPQUFNNEIsV0FBVTdCLFlBQVcsS0FBSztBQUFBLFVBQ3pDLENBQUM7QUFBQSxRQUNIO0FBc0JBLFlBQUksVUFBVSxTQUFTLFNBQVMsT0FBTytCLFNBQVE7QUFDN0MsaUJBQU8sa0JBQWtCLEtBQUssSUFDMUIsZUFBZSxPQUFPQSxPQUFNLElBQzVCLENBQUM7QUFBQSxRQUNQLENBQUM7QUFvQkQsWUFBSSxNQUFNLFNBQVMsU0FBUyxRQUFRO0FBQ2xDLGlCQUFPLFFBQVEsWUFBWSxRQUFRLGlCQUFpQixDQUFDO0FBQUEsUUFDdkQsQ0FBQztBQXlCRCxZQUFJLFFBQVEsU0FBUyxTQUFTLFFBQVE7QUFDcEMsY0FBSUYsWUFBVyxLQUFLLE1BQU07QUFDMUIsY0FBSSxrQkFBa0JBLFNBQVEsR0FBRztBQUMvQixZQUFBQSxZQUFXN0I7QUFBQSxVQUNiO0FBQ0EsaUJBQU8sUUFBUSxZQUFZLFFBQVEsaUJBQWlCLEdBQUcsWUFBWTZCLFdBQVUsQ0FBQyxDQUFDO0FBQUEsUUFDakYsQ0FBQztBQXVCRCxZQUFJLFVBQVUsU0FBUyxTQUFTLFFBQVE7QUFDdEMsY0FBSSxhQUFhLEtBQUssTUFBTTtBQUM1Qix1QkFBYSxPQUFPLGNBQWMsYUFBYSxhQUFhN0I7QUFDNUQsaUJBQU8sUUFBUSxZQUFZLFFBQVEsaUJBQWlCLEdBQUdBLFlBQVcsVUFBVTtBQUFBLFFBQzlFLENBQUM7QUFrQkQsWUFBSSxNQUFNLFNBQVMsS0FBSztBQWtCeEIsaUJBQVMsVUFBVSxPQUFPK0IsU0FBUTtBQUNoQyxpQkFBTyxjQUFjLFNBQVMsQ0FBQyxHQUFHQSxXQUFVLENBQUMsR0FBRyxXQUFXO0FBQUEsUUFDN0Q7QUFpQkEsaUJBQVMsY0FBYyxPQUFPQSxTQUFRO0FBQ3BDLGlCQUFPLGNBQWMsU0FBUyxDQUFDLEdBQUdBLFdBQVUsQ0FBQyxHQUFHLE9BQU87QUFBQSxRQUN6RDtBQXNCQSxZQUFJLFVBQVUsU0FBUyxTQUFTLFFBQVE7QUFDdEMsY0FBSSxTQUFTLE9BQU8sUUFDaEJGLFlBQVcsU0FBUyxJQUFJLE9BQU8sU0FBUyxDQUFDLElBQUk3QjtBQUVqRCxVQUFBNkIsWUFBVyxPQUFPQSxhQUFZLGNBQWMsT0FBTyxJQUFJLEdBQUdBLGFBQVk3QjtBQUN0RSxpQkFBTyxVQUFVLFFBQVE2QixTQUFRO0FBQUEsUUFDbkMsQ0FBQztBQWlDRCxpQkFBUyxNQUFNLE9BQU87QUFDcEIsY0FBSUgsVUFBUyxPQUFPLEtBQUs7QUFDekIsVUFBQUEsUUFBTyxZQUFZO0FBQ25CLGlCQUFPQTtBQUFBLFFBQ1Q7QUF5QkEsaUJBQVMsSUFBSSxPQUFPLGFBQWE7QUFDL0Isc0JBQVksS0FBSztBQUNqQixpQkFBTztBQUFBLFFBQ1Q7QUF5QkEsaUJBQVMsS0FBSyxPQUFPLGFBQWE7QUFDaEMsaUJBQU8sWUFBWSxLQUFLO0FBQUEsUUFDMUI7QUFrQkEsWUFBSSxZQUFZLFNBQVMsU0FBUyxPQUFPO0FBQ3ZDLGNBQUksU0FBUyxNQUFNLFFBQ2ZDLFNBQVEsU0FBUyxNQUFNLENBQUMsSUFBSSxHQUM1QixRQUFRLEtBQUssYUFDYixjQUFjLFNBQVMsUUFBUTtBQUFFLG1CQUFPLE9BQU8sUUFBUSxLQUFLO0FBQUEsVUFBRztBQUVuRSxjQUFJLFNBQVMsS0FBSyxLQUFLLFlBQVksVUFDL0IsRUFBRSxpQkFBaUIsZ0JBQWdCLENBQUMsUUFBUUEsTUFBSyxHQUFHO0FBQ3RELG1CQUFPLEtBQUssS0FBSyxXQUFXO0FBQUEsVUFDOUI7QUFDQSxrQkFBUSxNQUFNLE1BQU1BLFFBQU8sQ0FBQ0EsVUFBUyxTQUFTLElBQUksRUFBRTtBQUNwRCxnQkFBTSxZQUFZLEtBQUs7QUFBQSxZQUNyQixRQUFRO0FBQUEsWUFDUixRQUFRLENBQUMsV0FBVztBQUFBLFlBQ3BCLFdBQVczQjtBQUFBLFVBQ2IsQ0FBQztBQUNELGlCQUFPLElBQUksY0FBYyxPQUFPLEtBQUssU0FBUyxFQUFFLEtBQUssU0FBUyxPQUFPO0FBQ25FLGdCQUFJLFVBQVUsQ0FBQyxNQUFNLFFBQVE7QUFDM0Isb0JBQU0sS0FBS0EsVUFBUztBQUFBLFlBQ3RCO0FBQ0EsbUJBQU87QUFBQSxVQUNULENBQUM7QUFBQSxRQUNILENBQUM7QUE2QkQsaUJBQVMsZUFBZTtBQUN0QixpQkFBTyxNQUFNLElBQUk7QUFBQSxRQUNuQjtBQTRCQSxpQkFBUyxnQkFBZ0I7QUFDdkIsaUJBQU8sSUFBSSxjQUFjLEtBQUssTUFBTSxHQUFHLEtBQUssU0FBUztBQUFBLFFBQ3ZEO0FBd0JBLGlCQUFTLGNBQWM7QUFDckIsY0FBSSxLQUFLLGVBQWVBLFlBQVc7QUFDakMsaUJBQUssYUFBYSxRQUFRLEtBQUssTUFBTSxDQUFDO0FBQUEsVUFDeEM7QUFDQSxjQUFJLE9BQU8sS0FBSyxhQUFhLEtBQUssV0FBVyxRQUN6QyxRQUFRLE9BQU9BLGFBQVksS0FBSyxXQUFXLEtBQUssV0FBVztBQUUvRCxpQkFBTyxFQUFFLFFBQVEsTUFBTSxTQUFTLE1BQU07QUFBQSxRQUN4QztBQW9CQSxpQkFBUyxvQkFBb0I7QUFDM0IsaUJBQU87QUFBQSxRQUNUO0FBMEJBLGlCQUFTLGFBQWEsT0FBTztBQUMzQixjQUFJMEIsU0FDQStCLFVBQVM7QUFFYixpQkFBT0EsbUJBQWtCLFlBQVk7QUFDbkMsZ0JBQUlDLFNBQVEsYUFBYUQsT0FBTTtBQUMvQixZQUFBQyxPQUFNLFlBQVk7QUFDbEIsWUFBQUEsT0FBTSxhQUFhMUQ7QUFDbkIsZ0JBQUkwQixTQUFRO0FBQ1YsdUJBQVMsY0FBY2dDO0FBQUEsWUFDekIsT0FBTztBQUNMLGNBQUFoQyxVQUFTZ0M7QUFBQSxZQUNYO0FBQ0EsZ0JBQUksV0FBV0E7QUFDZixZQUFBRCxVQUFTQSxRQUFPO0FBQUEsVUFDbEI7QUFDQSxtQkFBUyxjQUFjO0FBQ3ZCLGlCQUFPL0I7QUFBQSxRQUNUO0FBc0JBLGlCQUFTLGlCQUFpQjtBQUN4QixjQUFJLFFBQVEsS0FBSztBQUNqQixjQUFJLGlCQUFpQixhQUFhO0FBQ2hDLGdCQUFJLFVBQVU7QUFDZCxnQkFBSSxLQUFLLFlBQVksUUFBUTtBQUMzQix3QkFBVSxJQUFJLFlBQVksSUFBSTtBQUFBLFlBQ2hDO0FBQ0Esc0JBQVUsUUFBUSxRQUFRO0FBQzFCLG9CQUFRLFlBQVksS0FBSztBQUFBLGNBQ3ZCLFFBQVE7QUFBQSxjQUNSLFFBQVEsQ0FBQyxPQUFPO0FBQUEsY0FDaEIsV0FBVzFCO0FBQUEsWUFDYixDQUFDO0FBQ0QsbUJBQU8sSUFBSSxjQUFjLFNBQVMsS0FBSyxTQUFTO0FBQUEsVUFDbEQ7QUFDQSxpQkFBTyxLQUFLLEtBQUssT0FBTztBQUFBLFFBQzFCO0FBZ0JBLGlCQUFTLGVBQWU7QUFDdEIsaUJBQU8saUJBQWlCLEtBQUssYUFBYSxLQUFLLFdBQVc7QUFBQSxRQUM1RDtBQTBCQSxZQUFJLFVBQVUsaUJBQWlCLFNBQVMwQixTQUFRLE9BQU8sS0FBSztBQUMxRCxjQUFJVCxnQkFBZSxLQUFLUyxTQUFRLEdBQUcsR0FBRztBQUNwQyxjQUFFQSxRQUFPLEdBQUc7QUFBQSxVQUNkLE9BQU87QUFDTCw0QkFBZ0JBLFNBQVEsS0FBSyxDQUFDO0FBQUEsVUFDaEM7QUFBQSxRQUNGLENBQUM7QUEyQ0QsaUJBQVMsTUFBTSxZQUFZLFdBQVcsT0FBTztBQUMzQyxjQUFJLE9BQU8sUUFBUSxVQUFVLElBQUksYUFBYTtBQUM5QyxjQUFJLFNBQVMsZUFBZSxZQUFZLFdBQVcsS0FBSyxHQUFHO0FBQ3pELHdCQUFZMUI7QUFBQSxVQUNkO0FBQ0EsaUJBQU8sS0FBSyxZQUFZLFlBQVksV0FBVyxDQUFDLENBQUM7QUFBQSxRQUNuRDtBQTJDQSxpQkFBUyxPQUFPLFlBQVksV0FBVztBQUNyQyxjQUFJLE9BQU8sUUFBUSxVQUFVLElBQUksY0FBYztBQUMvQyxpQkFBTyxLQUFLLFlBQVksWUFBWSxXQUFXLENBQUMsQ0FBQztBQUFBLFFBQ25EO0FBc0NBLFlBQUkyRCxRQUFPLFdBQVcsU0FBUztBQXFCL0IsWUFBSSxXQUFXLFdBQVcsYUFBYTtBQXVCdkMsaUJBQVMsUUFBUSxZQUFZOUIsV0FBVTtBQUNyQyxpQkFBTyxZQUFZeEIsS0FBSSxZQUFZd0IsU0FBUSxHQUFHLENBQUM7QUFBQSxRQUNqRDtBQXNCQSxpQkFBUyxZQUFZLFlBQVlBLFdBQVU7QUFDekMsaUJBQU8sWUFBWXhCLEtBQUksWUFBWXdCLFNBQVEsR0FBRyxRQUFRO0FBQUEsUUFDeEQ7QUF1QkEsaUJBQVMsYUFBYSxZQUFZQSxXQUFVLE9BQU87QUFDakQsa0JBQVEsVUFBVTdCLGFBQVksSUFBSSxVQUFVLEtBQUs7QUFDakQsaUJBQU8sWUFBWUssS0FBSSxZQUFZd0IsU0FBUSxHQUFHLEtBQUs7QUFBQSxRQUNyRDtBQWdDQSxpQkFBUytCLFNBQVEsWUFBWS9CLFdBQVU7QUFDckMsY0FBSSxPQUFPLFFBQVEsVUFBVSxJQUFJLFlBQVk7QUFDN0MsaUJBQU8sS0FBSyxZQUFZLFlBQVlBLFdBQVUsQ0FBQyxDQUFDO0FBQUEsUUFDbEQ7QUFzQkEsaUJBQVMsYUFBYSxZQUFZQSxXQUFVO0FBQzFDLGNBQUksT0FBTyxRQUFRLFVBQVUsSUFBSSxpQkFBaUI7QUFDbEQsaUJBQU8sS0FBSyxZQUFZLFlBQVlBLFdBQVUsQ0FBQyxDQUFDO0FBQUEsUUFDbEQ7QUF5QkEsWUFBSSxVQUFVLGlCQUFpQixTQUFTSCxTQUFRLE9BQU8sS0FBSztBQUMxRCxjQUFJVCxnQkFBZSxLQUFLUyxTQUFRLEdBQUcsR0FBRztBQUNwQyxZQUFBQSxRQUFPLEdBQUcsRUFBRSxLQUFLLEtBQUs7QUFBQSxVQUN4QixPQUFPO0FBQ0wsNEJBQWdCQSxTQUFRLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFBQSxVQUN0QztBQUFBLFFBQ0YsQ0FBQztBQWdDRCxpQkFBUyxTQUFTLFlBQVksT0FBTyxXQUFXLE9BQU87QUFDckQsdUJBQWEsWUFBWSxVQUFVLElBQUksYUFBYSxPQUFPLFVBQVU7QUFDckUsc0JBQWEsYUFBYSxDQUFDLFFBQVMsVUFBVSxTQUFTLElBQUk7QUFFM0QsY0FBSSxTQUFTLFdBQVc7QUFDeEIsY0FBSSxZQUFZLEdBQUc7QUFDakIsd0JBQVksVUFBVSxTQUFTLFdBQVcsQ0FBQztBQUFBLFVBQzdDO0FBQ0EsaUJBQU8sU0FBUyxVQUFVLElBQ3JCLGFBQWEsVUFBVSxXQUFXLFFBQVEsT0FBTyxTQUFTLElBQUksS0FDOUQsQ0FBQyxDQUFDLFVBQVUsWUFBWSxZQUFZLE9BQU8sU0FBUyxJQUFJO0FBQUEsUUFDL0Q7QUF5QkEsWUFBSSxZQUFZLFNBQVMsU0FBUyxZQUFZLE1BQU0sTUFBTTtBQUN4RCxjQUFJLFFBQVEsSUFDUixTQUFTLE9BQU8sUUFBUSxZQUN4QkEsVUFBUyxZQUFZLFVBQVUsSUFBSWxCLE9BQU0sV0FBVyxNQUFNLElBQUksQ0FBQztBQUVuRSxtQkFBUyxZQUFZLFNBQVMsT0FBTztBQUNuQyxZQUFBa0IsUUFBTyxFQUFFLEtBQUssSUFBSSxTQUFTekIsT0FBTSxNQUFNLE9BQU8sSUFBSSxJQUFJLFdBQVcsT0FBTyxNQUFNLElBQUk7QUFBQSxVQUNwRixDQUFDO0FBQ0QsaUJBQU95QjtBQUFBLFFBQ1QsQ0FBQztBQThCRCxZQUFJLFFBQVEsaUJBQWlCLFNBQVNBLFNBQVEsT0FBTyxLQUFLO0FBQ3hELDBCQUFnQkEsU0FBUSxLQUFLLEtBQUs7QUFBQSxRQUNwQyxDQUFDO0FBNENELGlCQUFTckIsS0FBSSxZQUFZd0IsV0FBVTtBQUNqQyxjQUFJLE9BQU8sUUFBUSxVQUFVLElBQUksV0FBVztBQUM1QyxpQkFBTyxLQUFLLFlBQVksWUFBWUEsV0FBVSxDQUFDLENBQUM7QUFBQSxRQUNsRDtBQStCQSxpQkFBUyxRQUFRLFlBQVksV0FBVyxRQUFRLE9BQU87QUFDckQsY0FBSSxjQUFjLE1BQU07QUFDdEIsbUJBQU8sQ0FBQztBQUFBLFVBQ1Y7QUFDQSxjQUFJLENBQUMsUUFBUSxTQUFTLEdBQUc7QUFDdkIsd0JBQVksYUFBYSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVM7QUFBQSxVQUNqRDtBQUNBLG1CQUFTLFFBQVE3QixhQUFZO0FBQzdCLGNBQUksQ0FBQyxRQUFRLE1BQU0sR0FBRztBQUNwQixxQkFBUyxVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTTtBQUFBLFVBQ3hDO0FBQ0EsaUJBQU8sWUFBWSxZQUFZLFdBQVcsTUFBTTtBQUFBLFFBQ2xEO0FBc0NBLFlBQUksWUFBWSxpQkFBaUIsU0FBUzBCLFNBQVEsT0FBTyxLQUFLO0FBQzVELFVBQUFBLFFBQU8sTUFBTSxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUs7QUFBQSxRQUNoQyxHQUFHLFdBQVc7QUFBRSxpQkFBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFBQSxRQUFHLENBQUM7QUF1Q2xDLGlCQUFTLE9BQU8sWUFBWUcsV0FBVSxhQUFhO0FBQ2pELGNBQUksT0FBTyxRQUFRLFVBQVUsSUFBSSxjQUFjLFlBQzNDLFlBQVksVUFBVSxTQUFTO0FBRW5DLGlCQUFPLEtBQUssWUFBWSxZQUFZQSxXQUFVLENBQUMsR0FBRyxhQUFhLFdBQVcsUUFBUTtBQUFBLFFBQ3BGO0FBd0JBLGlCQUFTLFlBQVksWUFBWUEsV0FBVSxhQUFhO0FBQ3RELGNBQUksT0FBTyxRQUFRLFVBQVUsSUFBSSxtQkFBbUIsWUFDaEQsWUFBWSxVQUFVLFNBQVM7QUFFbkMsaUJBQU8sS0FBSyxZQUFZLFlBQVlBLFdBQVUsQ0FBQyxHQUFHLGFBQWEsV0FBVyxhQUFhO0FBQUEsUUFDekY7QUFvQ0EsaUJBQVMsT0FBTyxZQUFZLFdBQVc7QUFDckMsY0FBSSxPQUFPLFFBQVEsVUFBVSxJQUFJLGNBQWM7QUFDL0MsaUJBQU8sS0FBSyxZQUFZLE9BQU8sWUFBWSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQUEsUUFDM0Q7QUFnQkEsaUJBQVMsT0FBTyxZQUFZO0FBQzFCLGNBQUksT0FBTyxRQUFRLFVBQVUsSUFBSSxjQUFjO0FBQy9DLGlCQUFPLEtBQUssVUFBVTtBQUFBLFFBQ3hCO0FBc0JBLGlCQUFTLFdBQVcsWUFBWSxHQUFHLE9BQU87QUFDeEMsY0FBSyxRQUFRLGVBQWUsWUFBWSxHQUFHLEtBQUssSUFBSSxNQUFNN0IsWUFBWTtBQUNwRSxnQkFBSTtBQUFBLFVBQ04sT0FBTztBQUNMLGdCQUFJLFVBQVUsQ0FBQztBQUFBLFVBQ2pCO0FBQ0EsY0FBSSxPQUFPLFFBQVEsVUFBVSxJQUFJLGtCQUFrQjtBQUNuRCxpQkFBTyxLQUFLLFlBQVksQ0FBQztBQUFBLFFBQzNCO0FBaUJBLGlCQUFTLFFBQVEsWUFBWTtBQUMzQixjQUFJLE9BQU8sUUFBUSxVQUFVLElBQUksZUFBZTtBQUNoRCxpQkFBTyxLQUFLLFVBQVU7QUFBQSxRQUN4QjtBQXVCQSxpQkFBUyxLQUFLLFlBQVk7QUFDeEIsY0FBSSxjQUFjLE1BQU07QUFDdEIsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxZQUFZLFVBQVUsR0FBRztBQUMzQixtQkFBTyxTQUFTLFVBQVUsSUFBSSxXQUFXLFVBQVUsSUFBSSxXQUFXO0FBQUEsVUFDcEU7QUFDQSxjQUFJLE1BQU0sT0FBTyxVQUFVO0FBQzNCLGNBQUksT0FBTyxVQUFVLE9BQU8sUUFBUTtBQUNsQyxtQkFBTyxXQUFXO0FBQUEsVUFDcEI7QUFDQSxpQkFBTyxTQUFTLFVBQVUsRUFBRTtBQUFBLFFBQzlCO0FBc0NBLGlCQUFTLEtBQUssWUFBWSxXQUFXLE9BQU87QUFDMUMsY0FBSSxPQUFPLFFBQVEsVUFBVSxJQUFJLFlBQVk7QUFDN0MsY0FBSSxTQUFTLGVBQWUsWUFBWSxXQUFXLEtBQUssR0FBRztBQUN6RCx3QkFBWUE7QUFBQSxVQUNkO0FBQ0EsaUJBQU8sS0FBSyxZQUFZLFlBQVksV0FBVyxDQUFDLENBQUM7QUFBQSxRQUNuRDtBQStCQSxZQUFJLFNBQVMsU0FBUyxTQUFTLFlBQVksV0FBVztBQUNwRCxjQUFJLGNBQWMsTUFBTTtBQUN0QixtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLGNBQUksU0FBUyxVQUFVO0FBQ3ZCLGNBQUksU0FBUyxLQUFLLGVBQWUsWUFBWSxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHO0FBQ3hFLHdCQUFZLENBQUM7QUFBQSxVQUNmLFdBQVcsU0FBUyxLQUFLLGVBQWUsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRztBQUNqRix3QkFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQUEsVUFDM0I7QUFDQSxpQkFBTyxZQUFZLFlBQVksWUFBWSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7QUFBQSxRQUM5RCxDQUFDO0FBb0JELFlBQUksTUFBTSxVQUFVLFdBQVc7QUFDN0IsaUJBQU8sS0FBSyxLQUFLLElBQUk7QUFBQSxRQUN2QjtBQTRCQSxpQkFBUyxNQUFNLEdBQUcsTUFBTTtBQUN0QixjQUFJLE9BQU8sUUFBUSxZQUFZO0FBQzdCLGtCQUFNLElBQUlnQixXQUFVLGVBQWU7QUFBQSxVQUNyQztBQUNBLGNBQUksVUFBVSxDQUFDO0FBQ2YsaUJBQU8sV0FBVztBQUNoQixnQkFBSSxFQUFFLElBQUksR0FBRztBQUNYLHFCQUFPLEtBQUssTUFBTSxNQUFNLFNBQVM7QUFBQSxZQUNuQztBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBbUJBLGlCQUFTLElBQUksTUFBTSxHQUFHLE9BQU87QUFDM0IsY0FBSSxRQUFRaEIsYUFBWTtBQUN4QixjQUFLLFFBQVEsS0FBSyxPQUFRLEtBQUssU0FBUztBQUN4QyxpQkFBTyxXQUFXLE1BQU0sZUFBZUEsWUFBV0EsWUFBV0EsWUFBV0EsWUFBVyxDQUFDO0FBQUEsUUFDdEY7QUFtQkEsaUJBQVMsT0FBTyxHQUFHLE1BQU07QUFDdkIsY0FBSTBCO0FBQ0osY0FBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixrQkFBTSxJQUFJVixXQUFVLGVBQWU7QUFBQSxVQUNyQztBQUNBLGNBQUksVUFBVSxDQUFDO0FBQ2YsaUJBQU8sV0FBVztBQUNoQixnQkFBSSxFQUFFLElBQUksR0FBRztBQUNYLGNBQUFVLFVBQVMsS0FBSyxNQUFNLE1BQU0sU0FBUztBQUFBLFlBQ3JDO0FBQ0EsZ0JBQUksS0FBSyxHQUFHO0FBQ1YscUJBQU8xQjtBQUFBLFlBQ1Q7QUFDQSxtQkFBTzBCO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFxQ0EsWUFBSW1DLFFBQU8sU0FBUyxTQUFTLE1BQU0sU0FBUyxVQUFVO0FBQ3BELGNBQUksVUFBVTtBQUNkLGNBQUksU0FBUyxRQUFRO0FBQ25CLGdCQUFJLFVBQVUsZUFBZSxVQUFVLFVBQVVBLEtBQUksQ0FBQztBQUN0RCx1QkFBVztBQUFBLFVBQ2I7QUFDQSxpQkFBTyxXQUFXLE1BQU0sU0FBUyxTQUFTLFVBQVUsT0FBTztBQUFBLFFBQzdELENBQUM7QUErQ0QsWUFBSSxVQUFVLFNBQVMsU0FBUyxRQUFRLEtBQUssVUFBVTtBQUNyRCxjQUFJLFVBQVUsaUJBQWlCO0FBQy9CLGNBQUksU0FBUyxRQUFRO0FBQ25CLGdCQUFJLFVBQVUsZUFBZSxVQUFVLFVBQVUsT0FBTyxDQUFDO0FBQ3pELHVCQUFXO0FBQUEsVUFDYjtBQUNBLGlCQUFPLFdBQVcsS0FBSyxTQUFTLFFBQVEsVUFBVSxPQUFPO0FBQUEsUUFDM0QsQ0FBQztBQTJDRCxpQkFBUyxNQUFNLE1BQU0sT0FBTyxPQUFPO0FBQ2pDLGtCQUFRLFFBQVE3RCxhQUFZO0FBQzVCLGNBQUkwQixVQUFTLFdBQVcsTUFBTSxpQkFBaUIxQixZQUFXQSxZQUFXQSxZQUFXQSxZQUFXQSxZQUFXLEtBQUs7QUFDM0csVUFBQTBCLFFBQU8sY0FBYyxNQUFNO0FBQzNCLGlCQUFPQTtBQUFBLFFBQ1Q7QUF3Q0EsaUJBQVMsV0FBVyxNQUFNLE9BQU8sT0FBTztBQUN0QyxrQkFBUSxRQUFRMUIsYUFBWTtBQUM1QixjQUFJMEIsVUFBUyxXQUFXLE1BQU0sdUJBQXVCMUIsWUFBV0EsWUFBV0EsWUFBV0EsWUFBV0EsWUFBVyxLQUFLO0FBQ2pILFVBQUEwQixRQUFPLGNBQWMsV0FBVztBQUNoQyxpQkFBT0E7QUFBQSxRQUNUO0FBd0RBLGlCQUFTb0MsVUFBUyxNQUFNLE1BQU0sU0FBUztBQUNyQyxjQUFJLFVBQ0EsVUFDQSxTQUNBcEMsU0FDQSxTQUNBLGNBQ0EsaUJBQWlCLEdBQ2pCLFVBQVUsT0FDVixTQUFTLE9BQ1QsV0FBVztBQUVmLGNBQUksT0FBTyxRQUFRLFlBQVk7QUFDN0Isa0JBQU0sSUFBSVYsV0FBVSxlQUFlO0FBQUEsVUFDckM7QUFDQSxpQkFBTyxTQUFTLElBQUksS0FBSztBQUN6QixjQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3JCLHNCQUFVLENBQUMsQ0FBQyxRQUFRO0FBQ3BCLHFCQUFTLGFBQWE7QUFDdEIsc0JBQVUsU0FBUyxVQUFVLFNBQVMsUUFBUSxPQUFPLEtBQUssR0FBRyxJQUFJLElBQUk7QUFDckUsdUJBQVcsY0FBYyxVQUFVLENBQUMsQ0FBQyxRQUFRLFdBQVc7QUFBQSxVQUMxRDtBQUVBLG1CQUFTLFdBQVcsTUFBTTtBQUN4QixnQkFBSSxPQUFPLFVBQ1AsVUFBVTtBQUVkLHVCQUFXLFdBQVdoQjtBQUN0Qiw2QkFBaUI7QUFDakIsWUFBQTBCLFVBQVMsS0FBSyxNQUFNLFNBQVMsSUFBSTtBQUNqQyxtQkFBT0E7QUFBQSxVQUNUO0FBRUEsbUJBQVMsWUFBWSxNQUFNO0FBRXpCLDZCQUFpQjtBQUVqQixzQkFBVVcsWUFBVyxjQUFjLElBQUk7QUFFdkMsbUJBQU8sVUFBVSxXQUFXLElBQUksSUFBSVg7QUFBQSxVQUN0QztBQUVBLG1CQUFTLGNBQWMsTUFBTTtBQUMzQixnQkFBSSxvQkFBb0IsT0FBTyxjQUMzQixzQkFBc0IsT0FBTyxnQkFDN0IsY0FBYyxPQUFPO0FBRXpCLG1CQUFPLFNBQ0gsVUFBVSxhQUFhLFVBQVUsbUJBQW1CLElBQ3BEO0FBQUEsVUFDTjtBQUVBLG1CQUFTLGFBQWEsTUFBTTtBQUMxQixnQkFBSSxvQkFBb0IsT0FBTyxjQUMzQixzQkFBc0IsT0FBTztBQUtqQyxtQkFBUSxpQkFBaUIxQixjQUFjLHFCQUFxQixRQUN6RCxvQkFBb0IsS0FBTyxVQUFVLHVCQUF1QjtBQUFBLFVBQ2pFO0FBRUEsbUJBQVMsZUFBZTtBQUN0QixnQkFBSSxPQUFPLElBQUk7QUFDZixnQkFBSSxhQUFhLElBQUksR0FBRztBQUN0QixxQkFBTyxhQUFhLElBQUk7QUFBQSxZQUMxQjtBQUVBLHNCQUFVcUMsWUFBVyxjQUFjLGNBQWMsSUFBSSxDQUFDO0FBQUEsVUFDeEQ7QUFFQSxtQkFBUyxhQUFhLE1BQU07QUFDMUIsc0JBQVVyQztBQUlWLGdCQUFJLFlBQVksVUFBVTtBQUN4QixxQkFBTyxXQUFXLElBQUk7QUFBQSxZQUN4QjtBQUNBLHVCQUFXLFdBQVdBO0FBQ3RCLG1CQUFPMEI7QUFBQSxVQUNUO0FBRUEsbUJBQVMsU0FBUztBQUNoQixnQkFBSSxZQUFZMUIsWUFBVztBQUN6QixjQUFBNEMsY0FBYSxPQUFPO0FBQUEsWUFDdEI7QUFDQSw2QkFBaUI7QUFDakIsdUJBQVcsZUFBZSxXQUFXLFVBQVU1QztBQUFBLFVBQ2pEO0FBRUEsbUJBQVMsUUFBUTtBQUNmLG1CQUFPLFlBQVlBLGFBQVkwQixVQUFTLGFBQWEsSUFBSSxDQUFDO0FBQUEsVUFDNUQ7QUFFQSxtQkFBUyxZQUFZO0FBQ25CLGdCQUFJLE9BQU8sSUFBSSxHQUNYLGFBQWEsYUFBYSxJQUFJO0FBRWxDLHVCQUFXO0FBQ1gsdUJBQVc7QUFDWCwyQkFBZTtBQUVmLGdCQUFJLFlBQVk7QUFDZCxrQkFBSSxZQUFZMUIsWUFBVztBQUN6Qix1QkFBTyxZQUFZLFlBQVk7QUFBQSxjQUNqQztBQUNBLGtCQUFJLFFBQVE7QUFFVixnQkFBQTRDLGNBQWEsT0FBTztBQUNwQiwwQkFBVVAsWUFBVyxjQUFjLElBQUk7QUFDdkMsdUJBQU8sV0FBVyxZQUFZO0FBQUEsY0FDaEM7QUFBQSxZQUNGO0FBQ0EsZ0JBQUksWUFBWXJDLFlBQVc7QUFDekIsd0JBQVVxQyxZQUFXLGNBQWMsSUFBSTtBQUFBLFlBQ3pDO0FBQ0EsbUJBQU9YO0FBQUEsVUFDVDtBQUNBLG9CQUFVLFNBQVM7QUFDbkIsb0JBQVUsUUFBUTtBQUNsQixpQkFBTztBQUFBLFFBQ1Q7QUFvQkEsWUFBSSxRQUFRLFNBQVMsU0FBUyxNQUFNLE1BQU07QUFDeEMsaUJBQU8sVUFBVSxNQUFNLEdBQUcsSUFBSTtBQUFBLFFBQ2hDLENBQUM7QUFxQkQsWUFBSSxRQUFRLFNBQVMsU0FBUyxNQUFNLE1BQU0sTUFBTTtBQUM5QyxpQkFBTyxVQUFVLE1BQU0sU0FBUyxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQUEsUUFDbEQsQ0FBQztBQW9CRCxpQkFBU3FDLE1BQUssTUFBTTtBQUNsQixpQkFBTyxXQUFXLE1BQU0sY0FBYztBQUFBLFFBQ3hDO0FBOENBLGlCQUFTLFFBQVEsTUFBTSxVQUFVO0FBQy9CLGNBQUksT0FBTyxRQUFRLGNBQWUsWUFBWSxRQUFRLE9BQU8sWUFBWSxZQUFhO0FBQ3BGLGtCQUFNLElBQUkvQyxXQUFVLGVBQWU7QUFBQSxVQUNyQztBQUNBLGNBQUksV0FBVyxXQUFXO0FBQ3hCLGdCQUFJLE9BQU8sV0FDUCxNQUFNLFdBQVcsU0FBUyxNQUFNLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUNwRFosU0FBUSxTQUFTO0FBRXJCLGdCQUFJQSxPQUFNLElBQUksR0FBRyxHQUFHO0FBQ2xCLHFCQUFPQSxPQUFNLElBQUksR0FBRztBQUFBLFlBQ3RCO0FBQ0EsZ0JBQUlzQixVQUFTLEtBQUssTUFBTSxNQUFNLElBQUk7QUFDbEMscUJBQVMsUUFBUXRCLE9BQU0sSUFBSSxLQUFLc0IsT0FBTSxLQUFLdEI7QUFDM0MsbUJBQU9zQjtBQUFBLFVBQ1Q7QUFDQSxtQkFBUyxRQUFRLEtBQUssUUFBUSxTQUFTO0FBQ3ZDLGlCQUFPO0FBQUEsUUFDVDtBQUdBLGdCQUFRLFFBQVE7QUFzQmhCLGlCQUFTLE9BQU8sV0FBVztBQUN6QixjQUFJLE9BQU8sYUFBYSxZQUFZO0FBQ2xDLGtCQUFNLElBQUlWLFdBQVUsZUFBZTtBQUFBLFVBQ3JDO0FBQ0EsaUJBQU8sV0FBVztBQUNoQixnQkFBSSxPQUFPO0FBQ1gsb0JBQVEsS0FBSyxRQUFRO0FBQUEsY0FDbkIsS0FBSztBQUFHLHVCQUFPLENBQUMsVUFBVSxLQUFLLElBQUk7QUFBQSxjQUNuQyxLQUFLO0FBQUcsdUJBQU8sQ0FBQyxVQUFVLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQztBQUFBLGNBQzVDLEtBQUs7QUFBRyx1QkFBTyxDQUFDLFVBQVUsS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQUEsY0FDckQsS0FBSztBQUFHLHVCQUFPLENBQUMsVUFBVSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFBQSxZQUNoRTtBQUNBLG1CQUFPLENBQUMsVUFBVSxNQUFNLE1BQU0sSUFBSTtBQUFBLFVBQ3BDO0FBQUEsUUFDRjtBQW9CQSxpQkFBUyxLQUFLLE1BQU07QUFDbEIsaUJBQU8sT0FBTyxHQUFHLElBQUk7QUFBQSxRQUN2QjtBQWlDQSxZQUFJLFdBQVcsU0FBUyxTQUFTLE1BQU0sWUFBWTtBQUNqRCx1QkFBYyxXQUFXLFVBQVUsS0FBSyxRQUFRLFdBQVcsQ0FBQyxDQUFDLElBQ3pELFNBQVMsV0FBVyxDQUFDLEdBQUcsVUFBVSxZQUFZLENBQUMsQ0FBQyxJQUNoRCxTQUFTLFlBQVksWUFBWSxDQUFDLEdBQUcsVUFBVSxZQUFZLENBQUMsQ0FBQztBQUVqRSxjQUFJLGNBQWMsV0FBVztBQUM3QixpQkFBTyxTQUFTLFNBQVMsTUFBTTtBQUM3QixnQkFBSSxRQUFRLElBQ1IsU0FBUyxVQUFVLEtBQUssUUFBUSxXQUFXO0FBRS9DLG1CQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLG1CQUFLLEtBQUssSUFBSSxXQUFXLEtBQUssRUFBRSxLQUFLLE1BQU0sS0FBSyxLQUFLLENBQUM7QUFBQSxZQUN4RDtBQUNBLG1CQUFPZixPQUFNLE1BQU0sTUFBTSxJQUFJO0FBQUEsVUFDL0IsQ0FBQztBQUFBLFFBQ0gsQ0FBQztBQW1DRCxZQUFJLFVBQVUsU0FBUyxTQUFTLE1BQU0sVUFBVTtBQUM5QyxjQUFJLFVBQVUsZUFBZSxVQUFVLFVBQVUsT0FBTyxDQUFDO0FBQ3pELGlCQUFPLFdBQVcsTUFBTSxtQkFBbUJELFlBQVcsVUFBVSxPQUFPO0FBQUEsUUFDekUsQ0FBQztBQWtDRCxZQUFJLGVBQWUsU0FBUyxTQUFTLE1BQU0sVUFBVTtBQUNuRCxjQUFJLFVBQVUsZUFBZSxVQUFVLFVBQVUsWUFBWSxDQUFDO0FBQzlELGlCQUFPLFdBQVcsTUFBTSx5QkFBeUJBLFlBQVcsVUFBVSxPQUFPO0FBQUEsUUFDL0UsQ0FBQztBQXdCRCxZQUFJLFFBQVEsU0FBUyxTQUFTLE1BQU0sU0FBUztBQUMzQyxpQkFBTyxXQUFXLE1BQU0saUJBQWlCQSxZQUFXQSxZQUFXQSxZQUFXLE9BQU87QUFBQSxRQUNuRixDQUFDO0FBMkJELGlCQUFTLEtBQUssTUFBTTJCLFFBQU87QUFDekIsY0FBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixrQkFBTSxJQUFJWCxXQUFVLGVBQWU7QUFBQSxVQUNyQztBQUNBLFVBQUFXLFNBQVFBLFdBQVUzQixhQUFZMkIsU0FBUSxVQUFVQSxNQUFLO0FBQ3JELGlCQUFPLFNBQVMsTUFBTUEsTUFBSztBQUFBLFFBQzdCO0FBb0NBLGlCQUFTLE9BQU8sTUFBTUEsUUFBTztBQUMzQixjQUFJLE9BQU8sUUFBUSxZQUFZO0FBQzdCLGtCQUFNLElBQUlYLFdBQVUsZUFBZTtBQUFBLFVBQ3JDO0FBQ0EsVUFBQVcsU0FBUUEsVUFBUyxPQUFPLElBQUksVUFBVSxVQUFVQSxNQUFLLEdBQUcsQ0FBQztBQUN6RCxpQkFBTyxTQUFTLFNBQVMsTUFBTTtBQUM3QixnQkFBSSxRQUFRLEtBQUtBLE1BQUssR0FDbEIsWUFBWSxVQUFVLE1BQU0sR0FBR0EsTUFBSztBQUV4QyxnQkFBSSxPQUFPO0FBQ1Qsd0JBQVUsV0FBVyxLQUFLO0FBQUEsWUFDNUI7QUFDQSxtQkFBTzFCLE9BQU0sTUFBTSxNQUFNLFNBQVM7QUFBQSxVQUNwQyxDQUFDO0FBQUEsUUFDSDtBQThDQSxpQkFBUyxTQUFTLE1BQU0sTUFBTSxTQUFTO0FBQ3JDLGNBQUksVUFBVSxNQUNWLFdBQVc7QUFFZixjQUFJLE9BQU8sUUFBUSxZQUFZO0FBQzdCLGtCQUFNLElBQUllLFdBQVUsZUFBZTtBQUFBLFVBQ3JDO0FBQ0EsY0FBSSxTQUFTLE9BQU8sR0FBRztBQUNyQixzQkFBVSxhQUFhLFVBQVUsQ0FBQyxDQUFDLFFBQVEsVUFBVTtBQUNyRCx1QkFBVyxjQUFjLFVBQVUsQ0FBQyxDQUFDLFFBQVEsV0FBVztBQUFBLFVBQzFEO0FBQ0EsaUJBQU84QyxVQUFTLE1BQU0sTUFBTTtBQUFBLFlBQzFCLFdBQVc7QUFBQSxZQUNYLFdBQVc7QUFBQSxZQUNYLFlBQVk7QUFBQSxVQUNkLENBQUM7QUFBQSxRQUNIO0FBaUJBLGlCQUFTLE1BQU0sTUFBTTtBQUNuQixpQkFBTyxJQUFJLE1BQU0sQ0FBQztBQUFBLFFBQ3BCO0FBd0JBLGlCQUFTRSxNQUFLLE9BQU8sU0FBUztBQUM1QixpQkFBTyxRQUFRLGFBQWEsT0FBTyxHQUFHLEtBQUs7QUFBQSxRQUM3QztBQXFDQSxpQkFBUyxZQUFZO0FBQ25CLGNBQUksQ0FBQyxVQUFVLFFBQVE7QUFDckIsbUJBQU8sQ0FBQztBQUFBLFVBQ1Y7QUFDQSxjQUFJLFFBQVEsVUFBVSxDQUFDO0FBQ3ZCLGlCQUFPLFFBQVEsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLO0FBQUEsUUFDeEM7QUE0QkEsaUJBQVMsTUFBTSxPQUFPO0FBQ3BCLGlCQUFPLFVBQVUsT0FBTyxrQkFBa0I7QUFBQSxRQUM1QztBQWlDQSxpQkFBUyxVQUFVLE9BQU8sWUFBWTtBQUNwQyx1QkFBYSxPQUFPLGNBQWMsYUFBYSxhQUFhaEU7QUFDNUQsaUJBQU8sVUFBVSxPQUFPLG9CQUFvQixVQUFVO0FBQUEsUUFDeEQ7QUFvQkEsaUJBQVMsVUFBVSxPQUFPO0FBQ3hCLGlCQUFPLFVBQVUsT0FBTyxrQkFBa0Isa0JBQWtCO0FBQUEsUUFDOUQ7QUE4QkEsaUJBQVMsY0FBYyxPQUFPLFlBQVk7QUFDeEMsdUJBQWEsT0FBTyxjQUFjLGFBQWEsYUFBYUE7QUFDNUQsaUJBQU8sVUFBVSxPQUFPLGtCQUFrQixvQkFBb0IsVUFBVTtBQUFBLFFBQzFFO0FBMEJBLGlCQUFTLFdBQVcsUUFBUWlDLFNBQVE7QUFDbEMsaUJBQU9BLFdBQVUsUUFBUSxlQUFlLFFBQVFBLFNBQVFDLE1BQUtELE9BQU0sQ0FBQztBQUFBLFFBQ3RFO0FBa0NBLGlCQUFTLEdBQUcsT0FBTyxPQUFPO0FBQ3hCLGlCQUFPLFVBQVUsU0FBVSxVQUFVLFNBQVMsVUFBVTtBQUFBLFFBQzFEO0FBeUJBLFlBQUksS0FBSywwQkFBMEIsTUFBTTtBQXlCekMsWUFBSSxNQUFNLDBCQUEwQixTQUFTLE9BQU8sT0FBTztBQUN6RCxpQkFBTyxTQUFTO0FBQUEsUUFDbEIsQ0FBQztBQW9CRCxZQUFJLGNBQWMsZ0JBQWdCLDJCQUFXO0FBQUUsaUJBQU87QUFBQSxRQUFXLEVBQUUsQ0FBQyxJQUFJLGtCQUFrQixTQUFTLE9BQU87QUFDeEcsaUJBQU8sYUFBYSxLQUFLLEtBQUtoQixnQkFBZSxLQUFLLE9BQU8sUUFBUSxLQUMvRCxDQUFDLHFCQUFxQixLQUFLLE9BQU8sUUFBUTtBQUFBLFFBQzlDO0FBeUJBLFlBQUksVUFBVVQsT0FBTTtBQW1CcEIsWUFBSSxnQkFBZ0Isb0JBQW9CLFVBQVUsaUJBQWlCLElBQUk7QUEyQnZFLGlCQUFTLFlBQVksT0FBTztBQUMxQixpQkFBTyxTQUFTLFFBQVEsU0FBUyxNQUFNLE1BQU0sS0FBSyxDQUFDK0IsWUFBVyxLQUFLO0FBQUEsUUFDckU7QUEyQkEsaUJBQVMsa0JBQWtCLE9BQU87QUFDaEMsaUJBQU8sYUFBYSxLQUFLLEtBQUssWUFBWSxLQUFLO0FBQUEsUUFDakQ7QUFtQkEsaUJBQVMsVUFBVSxPQUFPO0FBQ3hCLGlCQUFPLFVBQVUsUUFBUSxVQUFVLFNBQ2hDLGFBQWEsS0FBSyxLQUFLLFdBQVcsS0FBSyxLQUFLO0FBQUEsUUFDakQ7QUFtQkEsWUFBSSxXQUFXLGtCQUFrQjtBQW1CakMsWUFBSSxTQUFTLGFBQWEsVUFBVSxVQUFVLElBQUk7QUFtQmxELGlCQUFTMEIsV0FBVSxPQUFPO0FBQ3hCLGlCQUFPLGFBQWEsS0FBSyxLQUFLLE1BQU0sYUFBYSxLQUFLLENBQUN4QixlQUFjLEtBQUs7QUFBQSxRQUM1RTtBQW1DQSxpQkFBU3lCLFNBQVEsT0FBTztBQUN0QixjQUFJLFNBQVMsTUFBTTtBQUNqQixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFlBQVksS0FBSyxNQUNoQixRQUFRLEtBQUssS0FBSyxPQUFPLFNBQVMsWUFBWSxPQUFPLE1BQU0sVUFBVSxjQUNwRSxTQUFTLEtBQUssS0FBSyxhQUFhLEtBQUssS0FBSyxZQUFZLEtBQUssSUFBSTtBQUNuRSxtQkFBTyxDQUFDLE1BQU07QUFBQSxVQUNoQjtBQUNBLGNBQUksTUFBTSxPQUFPLEtBQUs7QUFDdEIsY0FBSSxPQUFPLFVBQVUsT0FBTyxRQUFRO0FBQ2xDLG1CQUFPLENBQUMsTUFBTTtBQUFBLFVBQ2hCO0FBQ0EsY0FBSSxZQUFZLEtBQUssR0FBRztBQUN0QixtQkFBTyxDQUFDLFNBQVMsS0FBSyxFQUFFO0FBQUEsVUFDMUI7QUFDQSxtQkFBUyxPQUFPLE9BQU87QUFDckIsZ0JBQUlqRCxnQkFBZSxLQUFLLE9BQU8sR0FBRyxHQUFHO0FBQ25DLHFCQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUE4QkEsaUJBQVNrRCxTQUFRLE9BQU8sT0FBTztBQUM3QixpQkFBTyxZQUFZLE9BQU8sS0FBSztBQUFBLFFBQ2pDO0FBa0NBLGlCQUFTLFlBQVksT0FBTyxPQUFPLFlBQVk7QUFDN0MsdUJBQWEsT0FBTyxjQUFjLGFBQWEsYUFBYW5FO0FBQzVELGNBQUkwQixVQUFTLGFBQWEsV0FBVyxPQUFPLEtBQUssSUFBSTFCO0FBQ3JELGlCQUFPMEIsWUFBVzFCLGFBQVksWUFBWSxPQUFPLE9BQU9BLFlBQVcsVUFBVSxJQUFJLENBQUMsQ0FBQzBCO0FBQUEsUUFDckY7QUFvQkEsaUJBQVMsUUFBUSxPQUFPO0FBQ3RCLGNBQUksQ0FBQyxhQUFhLEtBQUssR0FBRztBQUN4QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLE1BQU0sV0FBVyxLQUFLO0FBQzFCLGlCQUFPLE9BQU8sWUFBWSxPQUFPLGFBQzlCLE9BQU8sTUFBTSxXQUFXLFlBQVksT0FBTyxNQUFNLFFBQVEsWUFBWSxDQUFDZSxlQUFjLEtBQUs7QUFBQSxRQUM5RjtBQTRCQSxpQkFBUyxTQUFTLE9BQU87QUFDdkIsaUJBQU8sT0FBTyxTQUFTLFlBQVksZUFBZSxLQUFLO0FBQUEsUUFDekQ7QUFtQkEsaUJBQVNGLFlBQVcsT0FBTztBQUN6QixjQUFJLENBQUMsU0FBUyxLQUFLLEdBQUc7QUFDcEIsbUJBQU87QUFBQSxVQUNUO0FBR0EsY0FBSSxNQUFNLFdBQVcsS0FBSztBQUMxQixpQkFBTyxPQUFPLFdBQVcsT0FBTyxVQUFVLE9BQU8sWUFBWSxPQUFPO0FBQUEsUUFDdEU7QUE0QkEsaUJBQVMsVUFBVSxPQUFPO0FBQ3hCLGlCQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsVUFBVSxLQUFLO0FBQUEsUUFDN0Q7QUE0QkEsaUJBQVMsU0FBUyxPQUFPO0FBQ3ZCLGlCQUFPLE9BQU8sU0FBUyxZQUNyQixRQUFRLE1BQU0sUUFBUSxLQUFLLEtBQUssU0FBUztBQUFBLFFBQzdDO0FBMkJBLGlCQUFTLFNBQVMsT0FBTztBQUN2QixjQUFJLE9BQU8sT0FBTztBQUNsQixpQkFBTyxTQUFTLFNBQVMsUUFBUSxZQUFZLFFBQVE7QUFBQSxRQUN2RDtBQTBCQSxpQkFBUyxhQUFhLE9BQU87QUFDM0IsaUJBQU8sU0FBUyxRQUFRLE9BQU8sU0FBUztBQUFBLFFBQzFDO0FBbUJBLFlBQUksUUFBUSxZQUFZLFVBQVUsU0FBUyxJQUFJO0FBOEIvQyxpQkFBUyxRQUFRLFFBQVFOLFNBQVE7QUFDL0IsaUJBQU8sV0FBV0EsV0FBVSxZQUFZLFFBQVFBLFNBQVEsYUFBYUEsT0FBTSxDQUFDO0FBQUEsUUFDOUU7QUFrQ0EsaUJBQVMsWUFBWSxRQUFRQSxTQUFRLFlBQVk7QUFDL0MsdUJBQWEsT0FBTyxjQUFjLGFBQWEsYUFBYWpDO0FBQzVELGlCQUFPLFlBQVksUUFBUWlDLFNBQVEsYUFBYUEsT0FBTSxHQUFHLFVBQVU7QUFBQSxRQUNyRTtBQThCQSxpQkFBUyxNQUFNLE9BQU87QUFJcEIsaUJBQU9tQyxVQUFTLEtBQUssS0FBSyxTQUFTLENBQUM7QUFBQSxRQUN0QztBQTRCQSxpQkFBUyxTQUFTLE9BQU87QUFDdkIsY0FBSSxXQUFXLEtBQUssR0FBRztBQUNyQixrQkFBTSxJQUFJMUQsT0FBTSxlQUFlO0FBQUEsVUFDakM7QUFDQSxpQkFBTyxhQUFhLEtBQUs7QUFBQSxRQUMzQjtBQW1CQSxpQkFBUyxPQUFPLE9BQU87QUFDckIsaUJBQU8sVUFBVTtBQUFBLFFBQ25CO0FBc0JBLGlCQUFTLE1BQU0sT0FBTztBQUNwQixpQkFBTyxTQUFTO0FBQUEsUUFDbEI7QUE0QkEsaUJBQVMwRCxVQUFTLE9BQU87QUFDdkIsaUJBQU8sT0FBTyxTQUFTLFlBQ3BCLGFBQWEsS0FBSyxLQUFLLFdBQVcsS0FBSyxLQUFLO0FBQUEsUUFDakQ7QUE4QkEsaUJBQVMzQixlQUFjLE9BQU87QUFDNUIsY0FBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLFdBQVcsS0FBSyxLQUFLLFdBQVc7QUFDMUQsbUJBQU87QUFBQSxVQUNUO0FBQ0EsY0FBSSxRQUFRLGFBQWEsS0FBSztBQUM5QixjQUFJLFVBQVUsTUFBTTtBQUNsQixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLE9BQU94QixnQkFBZSxLQUFLLE9BQU8sYUFBYSxLQUFLLE1BQU07QUFDOUQsaUJBQU8sT0FBTyxRQUFRLGNBQWMsZ0JBQWdCLFFBQ2xELGFBQWEsS0FBSyxJQUFJLEtBQUs7QUFBQSxRQUMvQjtBQW1CQSxZQUFJb0QsWUFBVyxlQUFlLFVBQVUsWUFBWSxJQUFJO0FBNkJ4RCxpQkFBUyxjQUFjLE9BQU87QUFDNUIsaUJBQU8sVUFBVSxLQUFLLEtBQUssU0FBUyxDQUFDLG9CQUFvQixTQUFTO0FBQUEsUUFDcEU7QUFtQkEsWUFBSSxRQUFRLFlBQVksVUFBVSxTQUFTLElBQUk7QUFtQi9DLGlCQUFTLFNBQVMsT0FBTztBQUN2QixpQkFBTyxPQUFPLFNBQVMsWUFDcEIsQ0FBQyxRQUFRLEtBQUssS0FBSyxhQUFhLEtBQUssS0FBSyxXQUFXLEtBQUssS0FBSztBQUFBLFFBQ3BFO0FBbUJBLGlCQUFTLFNBQVMsT0FBTztBQUN2QixpQkFBTyxPQUFPLFNBQVMsWUFDcEIsYUFBYSxLQUFLLEtBQUssV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUNqRDtBQW1CQSxZQUFJLGVBQWUsbUJBQW1CLFVBQVUsZ0JBQWdCLElBQUk7QUFtQnBFLGlCQUFTLFlBQVksT0FBTztBQUMxQixpQkFBTyxVQUFVckU7QUFBQSxRQUNuQjtBQW1CQSxpQkFBUyxVQUFVLE9BQU87QUFDeEIsaUJBQU8sYUFBYSxLQUFLLEtBQUssT0FBTyxLQUFLLEtBQUs7QUFBQSxRQUNqRDtBQW1CQSxpQkFBUyxVQUFVLE9BQU87QUFDeEIsaUJBQU8sYUFBYSxLQUFLLEtBQUssV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUNyRDtBQXlCQSxZQUFJLEtBQUssMEJBQTBCLE1BQU07QUF5QnpDLFlBQUksTUFBTSwwQkFBMEIsU0FBUyxPQUFPLE9BQU87QUFDekQsaUJBQU8sU0FBUztBQUFBLFFBQ2xCLENBQUM7QUF5QkQsaUJBQVMsUUFBUSxPQUFPO0FBQ3RCLGNBQUksQ0FBQyxPQUFPO0FBQ1YsbUJBQU8sQ0FBQztBQUFBLFVBQ1Y7QUFDQSxjQUFJLFlBQVksS0FBSyxHQUFHO0FBQ3RCLG1CQUFPLFNBQVMsS0FBSyxJQUFJTSxlQUFjLEtBQUssSUFBSSxVQUFVLEtBQUs7QUFBQSxVQUNqRTtBQUNBLGNBQUksZUFBZSxNQUFNLFdBQVcsR0FBRztBQUNyQyxtQkFBTyxnQkFBZ0IsTUFBTSxXQUFXLEVBQUUsQ0FBQztBQUFBLFVBQzdDO0FBQ0EsY0FBSSxNQUFNLE9BQU8sS0FBSyxHQUNsQixPQUFPLE9BQU8sU0FBUyxhQUFjLE9BQU8sU0FBUyxhQUFhO0FBRXRFLGlCQUFPLEtBQUssS0FBSztBQUFBLFFBQ25CO0FBeUJBLGlCQUFTLFNBQVMsT0FBTztBQUN2QixjQUFJLENBQUMsT0FBTztBQUNWLG1CQUFPLFVBQVUsSUFBSSxRQUFRO0FBQUEsVUFDL0I7QUFDQSxrQkFBUSxTQUFTLEtBQUs7QUFDdEIsY0FBSSxVQUFVLFlBQVksVUFBVSxDQUFDLFVBQVU7QUFDN0MsZ0JBQUksT0FBUSxRQUFRLElBQUksS0FBSztBQUM3QixtQkFBTyxPQUFPO0FBQUEsVUFDaEI7QUFDQSxpQkFBTyxVQUFVLFFBQVEsUUFBUTtBQUFBLFFBQ25DO0FBNEJBLGlCQUFTLFVBQVUsT0FBTztBQUN4QixjQUFJb0IsVUFBUyxTQUFTLEtBQUssR0FDdkIsWUFBWUEsVUFBUztBQUV6QixpQkFBT0EsWUFBV0EsVUFBVSxZQUFZQSxVQUFTLFlBQVlBLFVBQVU7QUFBQSxRQUN6RTtBQTZCQSxpQkFBUyxTQUFTLE9BQU87QUFDdkIsaUJBQU8sUUFBUSxVQUFVLFVBQVUsS0FBSyxHQUFHLEdBQUcsZ0JBQWdCLElBQUk7QUFBQSxRQUNwRTtBQXlCQSxpQkFBUyxTQUFTLE9BQU87QUFDdkIsY0FBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLFNBQVMsS0FBSyxHQUFHO0FBQ25CLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUksU0FBUyxLQUFLLEdBQUc7QUFDbkIsZ0JBQUksUUFBUSxPQUFPLE1BQU0sV0FBVyxhQUFhLE1BQU0sUUFBUSxJQUFJO0FBQ25FLG9CQUFRLFNBQVMsS0FBSyxJQUFLLFFBQVEsS0FBTTtBQUFBLFVBQzNDO0FBQ0EsY0FBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixtQkFBTyxVQUFVLElBQUksUUFBUSxDQUFDO0FBQUEsVUFDaEM7QUFDQSxrQkFBUSxTQUFTLEtBQUs7QUFDdEIsY0FBSSxXQUFXLFdBQVcsS0FBSyxLQUFLO0FBQ3BDLGlCQUFRLFlBQVksVUFBVSxLQUFLLEtBQUssSUFDcEMsYUFBYSxNQUFNLE1BQU0sQ0FBQyxHQUFHLFdBQVcsSUFBSSxDQUFDLElBQzVDLFdBQVcsS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDO0FBQUEsUUFDdkM7QUEwQkEsaUJBQVMsY0FBYyxPQUFPO0FBQzVCLGlCQUFPLFdBQVcsT0FBTyxPQUFPLEtBQUssQ0FBQztBQUFBLFFBQ3hDO0FBMEJBLGlCQUFTLGNBQWMsT0FBTztBQUM1QixpQkFBTyxRQUNILFVBQVUsVUFBVSxLQUFLLEdBQUcsQ0FBQyxrQkFBa0IsZ0JBQWdCLElBQzlELFVBQVUsSUFBSSxRQUFRO0FBQUEsUUFDN0I7QUF1QkEsaUJBQVMsU0FBUyxPQUFPO0FBQ3ZCLGlCQUFPLFNBQVMsT0FBTyxLQUFLLGFBQWEsS0FBSztBQUFBLFFBQ2hEO0FBb0NBLFlBQUk0QyxVQUFTLGVBQWUsU0FBUyxRQUFRckMsU0FBUTtBQUNuRCxjQUFJLFlBQVlBLE9BQU0sS0FBSyxZQUFZQSxPQUFNLEdBQUc7QUFDOUMsdUJBQVdBLFNBQVFDLE1BQUtELE9BQU0sR0FBRyxNQUFNO0FBQ3ZDO0FBQUEsVUFDRjtBQUNBLG1CQUFTLE9BQU9BLFNBQVE7QUFDdEIsZ0JBQUloQixnQkFBZSxLQUFLZ0IsU0FBUSxHQUFHLEdBQUc7QUFDcEMsMEJBQVksUUFBUSxLQUFLQSxRQUFPLEdBQUcsQ0FBQztBQUFBLFlBQ3RDO0FBQUEsVUFDRjtBQUFBLFFBQ0YsQ0FBQztBQWlDRCxZQUFJLFdBQVcsZUFBZSxTQUFTLFFBQVFBLFNBQVE7QUFDckQscUJBQVdBLFNBQVEsT0FBT0EsT0FBTSxHQUFHLE1BQU07QUFBQSxRQUMzQyxDQUFDO0FBK0JELFlBQUksZUFBZSxlQUFlLFNBQVMsUUFBUUEsU0FBUSxVQUFVLFlBQVk7QUFDL0UscUJBQVdBLFNBQVEsT0FBT0EsT0FBTSxHQUFHLFFBQVEsVUFBVTtBQUFBLFFBQ3ZELENBQUM7QUE4QkQsWUFBSSxhQUFhLGVBQWUsU0FBUyxRQUFRQSxTQUFRLFVBQVUsWUFBWTtBQUM3RSxxQkFBV0EsU0FBUUMsTUFBS0QsT0FBTSxHQUFHLFFBQVEsVUFBVTtBQUFBLFFBQ3JELENBQUM7QUFtQkQsWUFBSSxLQUFLLFNBQVMsTUFBTTtBQW9DeEIsaUJBQVNzQyxRQUFPLFdBQVcsWUFBWTtBQUNyQyxjQUFJN0MsVUFBUyxXQUFXLFNBQVM7QUFDakMsaUJBQU8sY0FBYyxPQUFPQSxVQUFTLFdBQVdBLFNBQVEsVUFBVTtBQUFBLFFBQ3BFO0FBdUJBLFlBQUk4QyxZQUFXLFNBQVMsU0FBUyxRQUFRLFNBQVM7QUFDaEQsbUJBQVMzRCxRQUFPLE1BQU07QUFFdEIsY0FBSSxRQUFRO0FBQ1osY0FBSSxTQUFTLFFBQVE7QUFDckIsY0FBSSxRQUFRLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSWI7QUFFdEMsY0FBSSxTQUFTLGVBQWUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHO0FBQzFELHFCQUFTO0FBQUEsVUFDWDtBQUVBLGlCQUFPLEVBQUUsUUFBUSxRQUFRO0FBQ3ZCLGdCQUFJaUMsVUFBUyxRQUFRLEtBQUs7QUFDMUIsZ0JBQUksUUFBUSxPQUFPQSxPQUFNO0FBQ3pCLGdCQUFJLGFBQWE7QUFDakIsZ0JBQUksY0FBYyxNQUFNO0FBRXhCLG1CQUFPLEVBQUUsYUFBYSxhQUFhO0FBQ2pDLGtCQUFJLE1BQU0sTUFBTSxVQUFVO0FBQzFCLGtCQUFJLFFBQVEsT0FBTyxHQUFHO0FBRXRCLGtCQUFJLFVBQVVqQyxjQUNULEdBQUcsT0FBTyxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUNpQixnQkFBZSxLQUFLLFFBQVEsR0FBRyxHQUFJO0FBQ3RFLHVCQUFPLEdBQUcsSUFBSWdCLFFBQU8sR0FBRztBQUFBLGNBQzFCO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFFQSxpQkFBTztBQUFBLFFBQ1QsQ0FBQztBQXFCRCxZQUFJLGVBQWUsU0FBUyxTQUFTLE1BQU07QUFDekMsZUFBSyxLQUFLakMsWUFBVyxtQkFBbUI7QUFDeEMsaUJBQU9DLE9BQU0sV0FBV0QsWUFBVyxJQUFJO0FBQUEsUUFDekMsQ0FBQztBQXFDRCxpQkFBUyxRQUFRLFFBQVEsV0FBVztBQUNsQyxpQkFBTyxZQUFZLFFBQVEsWUFBWSxXQUFXLENBQUMsR0FBRyxVQUFVO0FBQUEsUUFDbEU7QUFxQ0EsaUJBQVMsWUFBWSxRQUFRLFdBQVc7QUFDdEMsaUJBQU8sWUFBWSxRQUFRLFlBQVksV0FBVyxDQUFDLEdBQUcsZUFBZTtBQUFBLFFBQ3ZFO0FBOEJBLGlCQUFTLE1BQU0sUUFBUTZCLFdBQVU7QUFDL0IsaUJBQU8sVUFBVSxPQUNiLFNBQ0EsUUFBUSxRQUFRLFlBQVlBLFdBQVUsQ0FBQyxHQUFHLE1BQU07QUFBQSxRQUN0RDtBQTRCQSxpQkFBUyxXQUFXLFFBQVFBLFdBQVU7QUFDcEMsaUJBQU8sVUFBVSxPQUNiLFNBQ0EsYUFBYSxRQUFRLFlBQVlBLFdBQVUsQ0FBQyxHQUFHLE1BQU07QUFBQSxRQUMzRDtBQThCQSxpQkFBUyxPQUFPLFFBQVFBLFdBQVU7QUFDaEMsaUJBQU8sVUFBVSxXQUFXLFFBQVEsWUFBWUEsV0FBVSxDQUFDLENBQUM7QUFBQSxRQUM5RDtBQTRCQSxpQkFBUyxZQUFZLFFBQVFBLFdBQVU7QUFDckMsaUJBQU8sVUFBVSxnQkFBZ0IsUUFBUSxZQUFZQSxXQUFVLENBQUMsQ0FBQztBQUFBLFFBQ25FO0FBeUJBLGlCQUFTLFVBQVUsUUFBUTtBQUN6QixpQkFBTyxVQUFVLE9BQU8sQ0FBQyxJQUFJLGNBQWMsUUFBUUssTUFBSyxNQUFNLENBQUM7QUFBQSxRQUNqRTtBQXlCQSxpQkFBUyxZQUFZLFFBQVE7QUFDM0IsaUJBQU8sVUFBVSxPQUFPLENBQUMsSUFBSSxjQUFjLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFBQSxRQUNuRTtBQTJCQSxpQkFBU0MsS0FBSSxRQUFRLE1BQU0sY0FBYztBQUN2QyxjQUFJVCxVQUFTLFVBQVUsT0FBTzFCLGFBQVksUUFBUSxRQUFRLElBQUk7QUFDOUQsaUJBQU8wQixZQUFXMUIsYUFBWSxlQUFlMEI7QUFBQSxRQUMvQztBQTZCQSxpQkFBUyxJQUFJLFFBQVEsTUFBTTtBQUN6QixpQkFBTyxVQUFVLFFBQVEsUUFBUSxRQUFRLE1BQU0sT0FBTztBQUFBLFFBQ3hEO0FBNEJBLGlCQUFTLE1BQU0sUUFBUSxNQUFNO0FBQzNCLGlCQUFPLFVBQVUsUUFBUSxRQUFRLFFBQVEsTUFBTSxTQUFTO0FBQUEsUUFDMUQ7QUFvQkEsWUFBSSxTQUFTLGVBQWUsU0FBU0EsU0FBUSxPQUFPLEtBQUs7QUFDdkQsY0FBSSxTQUFTLFFBQ1QsT0FBTyxNQUFNLFlBQVksWUFBWTtBQUN2QyxvQkFBUSxxQkFBcUIsS0FBSyxLQUFLO0FBQUEsVUFDekM7QUFFQSxVQUFBQSxRQUFPLEtBQUssSUFBSTtBQUFBLFFBQ2xCLEdBQUcsU0FBUyxRQUFRLENBQUM7QUE0QnJCLFlBQUksV0FBVyxlQUFlLFNBQVNBLFNBQVEsT0FBTyxLQUFLO0FBQ3pELGNBQUksU0FBUyxRQUNULE9BQU8sTUFBTSxZQUFZLFlBQVk7QUFDdkMsb0JBQVEscUJBQXFCLEtBQUssS0FBSztBQUFBLFVBQ3pDO0FBRUEsY0FBSVQsZ0JBQWUsS0FBS1MsU0FBUSxLQUFLLEdBQUc7QUFDdEMsWUFBQUEsUUFBTyxLQUFLLEVBQUUsS0FBSyxHQUFHO0FBQUEsVUFDeEIsT0FBTztBQUNMLFlBQUFBLFFBQU8sS0FBSyxJQUFJLENBQUMsR0FBRztBQUFBLFVBQ3RCO0FBQUEsUUFDRixHQUFHLFdBQVc7QUFvQmQsWUFBSSxTQUFTLFNBQVMsVUFBVTtBQThCaEMsaUJBQVNRLE1BQUssUUFBUTtBQUNwQixpQkFBTyxZQUFZLE1BQU0sSUFBSSxjQUFjLE1BQU0sSUFBSSxTQUFTLE1BQU07QUFBQSxRQUN0RTtBQXlCQSxpQkFBUyxPQUFPLFFBQVE7QUFDdEIsaUJBQU8sWUFBWSxNQUFNLElBQUksY0FBYyxRQUFRLElBQUksSUFBSSxXQUFXLE1BQU07QUFBQSxRQUM5RTtBQXVCQSxpQkFBUyxRQUFRLFFBQVFMLFdBQVU7QUFDakMsY0FBSUgsVUFBUyxDQUFDO0FBQ2QsVUFBQUcsWUFBVyxZQUFZQSxXQUFVLENBQUM7QUFFbEMscUJBQVcsUUFBUSxTQUFTLE9BQU8sS0FBS1csU0FBUTtBQUM5Qyw0QkFBZ0JkLFNBQVFHLFVBQVMsT0FBTyxLQUFLVyxPQUFNLEdBQUcsS0FBSztBQUFBLFVBQzdELENBQUM7QUFDRCxpQkFBT2Q7QUFBQSxRQUNUO0FBOEJBLGlCQUFTLFVBQVUsUUFBUUcsV0FBVTtBQUNuQyxjQUFJSCxVQUFTLENBQUM7QUFDZCxVQUFBRyxZQUFXLFlBQVlBLFdBQVUsQ0FBQztBQUVsQyxxQkFBVyxRQUFRLFNBQVMsT0FBTyxLQUFLVyxTQUFRO0FBQzlDLDRCQUFnQmQsU0FBUSxLQUFLRyxVQUFTLE9BQU8sS0FBS1csT0FBTSxDQUFDO0FBQUEsVUFDM0QsQ0FBQztBQUNELGlCQUFPZDtBQUFBLFFBQ1Q7QUFpQ0EsWUFBSSxRQUFRLGVBQWUsU0FBUyxRQUFRTyxTQUFRLFVBQVU7QUFDNUQsb0JBQVUsUUFBUUEsU0FBUSxRQUFRO0FBQUEsUUFDcEMsQ0FBQztBQWlDRCxZQUFJLFlBQVksZUFBZSxTQUFTLFFBQVFBLFNBQVEsVUFBVSxZQUFZO0FBQzVFLG9CQUFVLFFBQVFBLFNBQVEsVUFBVSxVQUFVO0FBQUEsUUFDaEQsQ0FBQztBQXNCRCxZQUFJLE9BQU8sU0FBUyxTQUFTLFFBQVEsT0FBTztBQUMxQyxjQUFJUCxVQUFTLENBQUM7QUFDZCxjQUFJLFVBQVUsTUFBTTtBQUNsQixtQkFBT0E7QUFBQSxVQUNUO0FBQ0EsY0FBSSxTQUFTO0FBQ2Isa0JBQVEsU0FBUyxPQUFPLFNBQVMsTUFBTTtBQUNyQyxtQkFBTyxTQUFTLE1BQU0sTUFBTTtBQUM1Qix1QkFBVyxTQUFTLEtBQUssU0FBUztBQUNsQyxtQkFBTztBQUFBLFVBQ1QsQ0FBQztBQUNELHFCQUFXLFFBQVEsYUFBYSxNQUFNLEdBQUdBLE9BQU07QUFDL0MsY0FBSSxRQUFRO0FBQ1YsWUFBQUEsVUFBUyxVQUFVQSxTQUFRLGtCQUFrQixrQkFBa0Isb0JBQW9CLGVBQWU7QUFBQSxVQUNwRztBQUNBLGNBQUksU0FBUyxNQUFNO0FBQ25CLGlCQUFPLFVBQVU7QUFDZixzQkFBVUEsU0FBUSxNQUFNLE1BQU0sQ0FBQztBQUFBLFVBQ2pDO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVCxDQUFDO0FBc0JELGlCQUFTLE9BQU8sUUFBUSxXQUFXO0FBQ2pDLGlCQUFPLE9BQU8sUUFBUSxPQUFPLFlBQVksU0FBUyxDQUFDLENBQUM7QUFBQSxRQUN0RDtBQW1CQSxZQUFJLE9BQU8sU0FBUyxTQUFTLFFBQVEsT0FBTztBQUMxQyxpQkFBTyxVQUFVLE9BQU8sQ0FBQyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQUEsUUFDckQsQ0FBQztBQW9CRCxpQkFBUyxPQUFPLFFBQVEsV0FBVztBQUNqQyxjQUFJLFVBQVUsTUFBTTtBQUNsQixtQkFBTyxDQUFDO0FBQUEsVUFDVjtBQUNBLGNBQUksUUFBUSxTQUFTLGFBQWEsTUFBTSxHQUFHLFNBQVMsTUFBTTtBQUN4RCxtQkFBTyxDQUFDLElBQUk7QUFBQSxVQUNkLENBQUM7QUFDRCxzQkFBWSxZQUFZLFNBQVM7QUFDakMsaUJBQU8sV0FBVyxRQUFRLE9BQU8sU0FBUyxPQUFPLE1BQU07QUFDckQsbUJBQU8sVUFBVSxPQUFPLEtBQUssQ0FBQyxDQUFDO0FBQUEsVUFDakMsQ0FBQztBQUFBLFFBQ0g7QUErQkEsaUJBQVMsT0FBTyxRQUFRLE1BQU0sY0FBYztBQUMxQyxpQkFBTyxTQUFTLE1BQU0sTUFBTTtBQUU1QixjQUFJLFFBQVEsSUFDUixTQUFTLEtBQUs7QUFHbEIsY0FBSSxDQUFDLFFBQVE7QUFDWCxxQkFBUztBQUNULHFCQUFTMUI7QUFBQSxVQUNYO0FBQ0EsaUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsZ0JBQUksUUFBUSxVQUFVLE9BQU9BLGFBQVksT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDbEUsZ0JBQUksVUFBVUEsWUFBVztBQUN2QixzQkFBUTtBQUNSLHNCQUFRO0FBQUEsWUFDVjtBQUNBLHFCQUFTdUMsWUFBVyxLQUFLLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSTtBQUFBLFVBQ3BEO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBOEJBLGlCQUFTLElBQUksUUFBUSxNQUFNLE9BQU87QUFDaEMsaUJBQU8sVUFBVSxPQUFPLFNBQVMsUUFBUSxRQUFRLE1BQU0sS0FBSztBQUFBLFFBQzlEO0FBMEJBLGlCQUFTLFFBQVEsUUFBUSxNQUFNLE9BQU8sWUFBWTtBQUNoRCx1QkFBYSxPQUFPLGNBQWMsYUFBYSxhQUFhdkM7QUFDNUQsaUJBQU8sVUFBVSxPQUFPLFNBQVMsUUFBUSxRQUFRLE1BQU0sT0FBTyxVQUFVO0FBQUEsUUFDMUU7QUEwQkEsWUFBSSxVQUFVLGNBQWNrQyxLQUFJO0FBMEJoQyxZQUFJLFlBQVksY0FBYyxNQUFNO0FBZ0NwQyxpQkFBUyxVQUFVLFFBQVFMLFdBQVUsYUFBYTtBQUNoRCxjQUFJLFFBQVEsUUFBUSxNQUFNLEdBQ3RCLFlBQVksU0FBUyxTQUFTLE1BQU0sS0FBSyxhQUFhLE1BQU07QUFFaEUsVUFBQUEsWUFBVyxZQUFZQSxXQUFVLENBQUM7QUFDbEMsY0FBSSxlQUFlLE1BQU07QUFDdkIsZ0JBQUksT0FBTyxVQUFVLE9BQU87QUFDNUIsZ0JBQUksV0FBVztBQUNiLDRCQUFjLFFBQVEsSUFBSSxTQUFPLENBQUM7QUFBQSxZQUNwQyxXQUNTLFNBQVMsTUFBTSxHQUFHO0FBQ3pCLDRCQUFjVSxZQUFXLElBQUksSUFBSSxXQUFXLGFBQWEsTUFBTSxDQUFDLElBQUksQ0FBQztBQUFBLFlBQ3ZFLE9BQ0s7QUFDSCw0QkFBYyxDQUFDO0FBQUEsWUFDakI7QUFBQSxVQUNGO0FBQ0EsV0FBQyxZQUFZLFlBQVksWUFBWSxRQUFRLFNBQVMsT0FBTyxPQUFPQyxTQUFRO0FBQzFFLG1CQUFPWCxVQUFTLGFBQWEsT0FBTyxPQUFPVyxPQUFNO0FBQUEsVUFDbkQsQ0FBQztBQUNELGlCQUFPO0FBQUEsUUFDVDtBQTZCQSxpQkFBUyxNQUFNLFFBQVEsTUFBTTtBQUMzQixpQkFBTyxVQUFVLE9BQU8sT0FBTyxVQUFVLFFBQVEsSUFBSTtBQUFBLFFBQ3ZEO0FBNkJBLGlCQUFTLE9BQU8sUUFBUSxNQUFNLFNBQVM7QUFDckMsaUJBQU8sVUFBVSxPQUFPLFNBQVMsV0FBVyxRQUFRLE1BQU0sYUFBYSxPQUFPLENBQUM7QUFBQSxRQUNqRjtBQTBCQSxpQkFBUyxXQUFXLFFBQVEsTUFBTSxTQUFTLFlBQVk7QUFDckQsdUJBQWEsT0FBTyxjQUFjLGFBQWEsYUFBYXhDO0FBQzVELGlCQUFPLFVBQVUsT0FBTyxTQUFTLFdBQVcsUUFBUSxNQUFNLGFBQWEsT0FBTyxHQUFHLFVBQVU7QUFBQSxRQUM3RjtBQTRCQSxpQkFBUyxPQUFPLFFBQVE7QUFDdEIsaUJBQU8sVUFBVSxPQUFPLENBQUMsSUFBSSxXQUFXLFFBQVFrQyxNQUFLLE1BQU0sQ0FBQztBQUFBLFFBQzlEO0FBMEJBLGlCQUFTLFNBQVMsUUFBUTtBQUN4QixpQkFBTyxVQUFVLE9BQU8sQ0FBQyxJQUFJLFdBQVcsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUFBLFFBQ2hFO0FBdUJBLGlCQUFTdUMsT0FBTSxRQUFRLE9BQU8sT0FBTztBQUNuQyxjQUFJLFVBQVV6RSxZQUFXO0FBQ3ZCLG9CQUFRO0FBQ1Isb0JBQVFBO0FBQUEsVUFDVjtBQUNBLGNBQUksVUFBVUEsWUFBVztBQUN2QixvQkFBUSxTQUFTLEtBQUs7QUFDdEIsb0JBQVEsVUFBVSxRQUFRLFFBQVE7QUFBQSxVQUNwQztBQUNBLGNBQUksVUFBVUEsWUFBVztBQUN2QixvQkFBUSxTQUFTLEtBQUs7QUFDdEIsb0JBQVEsVUFBVSxRQUFRLFFBQVE7QUFBQSxVQUNwQztBQUNBLGlCQUFPLFVBQVUsU0FBUyxNQUFNLEdBQUcsT0FBTyxLQUFLO0FBQUEsUUFDakQ7QUF3Q0EsaUJBQVMsUUFBUSxRQUFRMkIsUUFBT0MsTUFBSztBQUNuQyxVQUFBRCxTQUFRLFNBQVNBLE1BQUs7QUFDdEIsY0FBSUMsU0FBUTVCLFlBQVc7QUFDckIsWUFBQTRCLE9BQU1EO0FBQ04sWUFBQUEsU0FBUTtBQUFBLFVBQ1YsT0FBTztBQUNMLFlBQUFDLE9BQU0sU0FBU0EsSUFBRztBQUFBLFVBQ3BCO0FBQ0EsbUJBQVMsU0FBUyxNQUFNO0FBQ3hCLGlCQUFPLFlBQVksUUFBUUQsUUFBT0MsSUFBRztBQUFBLFFBQ3ZDO0FBaUNBLGlCQUFTLE9BQU8sT0FBTyxPQUFPLFVBQVU7QUFDdEMsY0FBSSxZQUFZLE9BQU8sWUFBWSxhQUFhLGVBQWUsT0FBTyxPQUFPLFFBQVEsR0FBRztBQUN0RixvQkFBUSxXQUFXNUI7QUFBQSxVQUNyQjtBQUNBLGNBQUksYUFBYUEsWUFBVztBQUMxQixnQkFBSSxPQUFPLFNBQVMsV0FBVztBQUM3Qix5QkFBVztBQUNYLHNCQUFRQTtBQUFBLFlBQ1YsV0FDUyxPQUFPLFNBQVMsV0FBVztBQUNsQyx5QkFBVztBQUNYLHNCQUFRQTtBQUFBLFlBQ1Y7QUFBQSxVQUNGO0FBQ0EsY0FBSSxVQUFVQSxjQUFhLFVBQVVBLFlBQVc7QUFDOUMsb0JBQVE7QUFDUixvQkFBUTtBQUFBLFVBQ1YsT0FDSztBQUNILG9CQUFRLFNBQVMsS0FBSztBQUN0QixnQkFBSSxVQUFVQSxZQUFXO0FBQ3ZCLHNCQUFRO0FBQ1Isc0JBQVE7QUFBQSxZQUNWLE9BQU87QUFDTCxzQkFBUSxTQUFTLEtBQUs7QUFBQSxZQUN4QjtBQUFBLFVBQ0Y7QUFDQSxjQUFJLFFBQVEsT0FBTztBQUNqQixnQkFBSSxPQUFPO0FBQ1gsb0JBQVE7QUFDUixvQkFBUTtBQUFBLFVBQ1Y7QUFDQSxjQUFJLFlBQVksUUFBUSxLQUFLLFFBQVEsR0FBRztBQUN0QyxnQkFBSSxPQUFPLGFBQWE7QUFDeEIsbUJBQU8sVUFBVSxRQUFTLFFBQVEsUUFBUSxRQUFRLGVBQWUsVUFBVSxPQUFPLElBQUksU0FBUyxFQUFFLElBQUssS0FBSztBQUFBLFVBQzdHO0FBQ0EsaUJBQU8sV0FBVyxPQUFPLEtBQUs7QUFBQSxRQUNoQztBQXdCQSxZQUFJLFlBQVksaUJBQWlCLFNBQVMwQixTQUFRLE1BQU0sT0FBTztBQUM3RCxpQkFBTyxLQUFLLFlBQVk7QUFDeEIsaUJBQU9BLFdBQVUsUUFBUSxXQUFXLElBQUksSUFBSTtBQUFBLFFBQzlDLENBQUM7QUFpQkQsaUJBQVMsV0FBVyxRQUFRO0FBQzFCLGlCQUFPLFdBQVcsU0FBUyxNQUFNLEVBQUUsWUFBWSxDQUFDO0FBQUEsUUFDbEQ7QUFvQkEsaUJBQVMsT0FBTyxRQUFRO0FBQ3RCLG1CQUFTLFNBQVMsTUFBTTtBQUN4QixpQkFBTyxVQUFVLE9BQU8sUUFBUSxTQUFTLFlBQVksRUFBRSxRQUFRLGFBQWEsRUFBRTtBQUFBLFFBQ2hGO0FBeUJBLGlCQUFTLFNBQVMsUUFBUSxRQUFRLFVBQVU7QUFDMUMsbUJBQVMsU0FBUyxNQUFNO0FBQ3hCLG1CQUFTLGFBQWEsTUFBTTtBQUU1QixjQUFJLFNBQVMsT0FBTztBQUNwQixxQkFBVyxhQUFhMUIsYUFDcEIsU0FDQSxVQUFVLFVBQVUsUUFBUSxHQUFHLEdBQUcsTUFBTTtBQUU1QyxjQUFJNEIsT0FBTTtBQUNWLHNCQUFZLE9BQU87QUFDbkIsaUJBQU8sWUFBWSxLQUFLLE9BQU8sTUFBTSxVQUFVQSxJQUFHLEtBQUs7QUFBQSxRQUN6RDtBQThCQSxpQkFBUzhDLFFBQU8sUUFBUTtBQUN0QixtQkFBUyxTQUFTLE1BQU07QUFDeEIsaUJBQVEsVUFBVSxtQkFBbUIsS0FBSyxNQUFNLElBQzVDLE9BQU8sUUFBUSxpQkFBaUIsY0FBYyxJQUM5QztBQUFBLFFBQ047QUFpQkEsaUJBQVMsYUFBYSxRQUFRO0FBQzVCLG1CQUFTLFNBQVMsTUFBTTtBQUN4QixpQkFBUSxVQUFVLGdCQUFnQixLQUFLLE1BQU0sSUFDekMsT0FBTyxRQUFRLGNBQWMsTUFBTSxJQUNuQztBQUFBLFFBQ047QUF1QkEsWUFBSSxZQUFZLGlCQUFpQixTQUFTaEQsU0FBUSxNQUFNLE9BQU87QUFDN0QsaUJBQU9BLFdBQVUsUUFBUSxNQUFNLE1BQU0sS0FBSyxZQUFZO0FBQUEsUUFDeEQsQ0FBQztBQXNCRCxZQUFJLFlBQVksaUJBQWlCLFNBQVNBLFNBQVEsTUFBTSxPQUFPO0FBQzdELGlCQUFPQSxXQUFVLFFBQVEsTUFBTSxNQUFNLEtBQUssWUFBWTtBQUFBLFFBQ3hELENBQUM7QUFtQkQsWUFBSSxhQUFhLGdCQUFnQixhQUFhO0FBeUI5QyxpQkFBUyxJQUFJLFFBQVEsUUFBUSxPQUFPO0FBQ2xDLG1CQUFTLFNBQVMsTUFBTTtBQUN4QixtQkFBUyxVQUFVLE1BQU07QUFFekIsY0FBSSxZQUFZLFNBQVMsV0FBVyxNQUFNLElBQUk7QUFDOUMsY0FBSSxDQUFDLFVBQVUsYUFBYSxRQUFRO0FBQ2xDLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUksT0FBTyxTQUFTLGFBQWE7QUFDakMsaUJBQ0UsY0FBYyxZQUFZLEdBQUcsR0FBRyxLQUFLLElBQ3JDLFNBQ0EsY0FBYyxXQUFXLEdBQUcsR0FBRyxLQUFLO0FBQUEsUUFFeEM7QUF5QkEsaUJBQVMsT0FBTyxRQUFRLFFBQVEsT0FBTztBQUNyQyxtQkFBUyxTQUFTLE1BQU07QUFDeEIsbUJBQVMsVUFBVSxNQUFNO0FBRXpCLGNBQUksWUFBWSxTQUFTLFdBQVcsTUFBTSxJQUFJO0FBQzlDLGlCQUFRLFVBQVUsWUFBWSxTQUN6QixTQUFTLGNBQWMsU0FBUyxXQUFXLEtBQUssSUFDakQ7QUFBQSxRQUNOO0FBeUJBLGlCQUFTLFNBQVMsUUFBUSxRQUFRLE9BQU87QUFDdkMsbUJBQVMsU0FBUyxNQUFNO0FBQ3hCLG1CQUFTLFVBQVUsTUFBTTtBQUV6QixjQUFJLFlBQVksU0FBUyxXQUFXLE1BQU0sSUFBSTtBQUM5QyxpQkFBUSxVQUFVLFlBQVksU0FDekIsY0FBYyxTQUFTLFdBQVcsS0FBSyxJQUFJLFNBQzVDO0FBQUEsUUFDTjtBQTBCQSxpQkFBU2lELFVBQVMsUUFBUSxPQUFPLE9BQU87QUFDdEMsY0FBSSxTQUFTLFNBQVMsTUFBTTtBQUMxQixvQkFBUTtBQUFBLFVBQ1YsV0FBVyxPQUFPO0FBQ2hCLG9CQUFRLENBQUM7QUFBQSxVQUNYO0FBQ0EsaUJBQU8sZUFBZSxTQUFTLE1BQU0sRUFBRSxRQUFRLGFBQWEsRUFBRSxHQUFHLFNBQVMsQ0FBQztBQUFBLFFBQzdFO0FBd0JBLGlCQUFTLE9BQU8sUUFBUSxHQUFHLE9BQU87QUFDaEMsY0FBSyxRQUFRLGVBQWUsUUFBUSxHQUFHLEtBQUssSUFBSSxNQUFNM0UsWUFBWTtBQUNoRSxnQkFBSTtBQUFBLFVBQ04sT0FBTztBQUNMLGdCQUFJLFVBQVUsQ0FBQztBQUFBLFVBQ2pCO0FBQ0EsaUJBQU8sV0FBVyxTQUFTLE1BQU0sR0FBRyxDQUFDO0FBQUEsUUFDdkM7QUFxQkEsaUJBQVM0RSxXQUFVO0FBQ2pCLGNBQUksT0FBTyxXQUNQLFNBQVMsU0FBUyxLQUFLLENBQUMsQ0FBQztBQUU3QixpQkFBTyxLQUFLLFNBQVMsSUFBSSxTQUFTLE9BQU8sUUFBUSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ25FO0FBdUJBLFlBQUksWUFBWSxpQkFBaUIsU0FBU2xELFNBQVEsTUFBTSxPQUFPO0FBQzdELGlCQUFPQSxXQUFVLFFBQVEsTUFBTSxNQUFNLEtBQUssWUFBWTtBQUFBLFFBQ3hELENBQUM7QUFxQkQsaUJBQVNtRCxPQUFNLFFBQVEsV0FBVyxPQUFPO0FBQ3ZDLGNBQUksU0FBUyxPQUFPLFNBQVMsWUFBWSxlQUFlLFFBQVEsV0FBVyxLQUFLLEdBQUc7QUFDakYsd0JBQVksUUFBUTdFO0FBQUEsVUFDdEI7QUFDQSxrQkFBUSxVQUFVQSxhQUFZLG1CQUFtQixVQUFVO0FBQzNELGNBQUksQ0FBQyxPQUFPO0FBQ1YsbUJBQU8sQ0FBQztBQUFBLFVBQ1Y7QUFDQSxtQkFBUyxTQUFTLE1BQU07QUFDeEIsY0FBSSxXQUNFLE9BQU8sYUFBYSxZQUNuQixhQUFhLFFBQVEsQ0FBQ3FFLFVBQVMsU0FBUyxJQUN4QztBQUNMLHdCQUFZLGFBQWEsU0FBUztBQUNsQyxnQkFBSSxDQUFDLGFBQWEsV0FBVyxNQUFNLEdBQUc7QUFDcEMscUJBQU8sVUFBVS9ELGVBQWMsTUFBTSxHQUFHLEdBQUcsS0FBSztBQUFBLFlBQ2xEO0FBQUEsVUFDRjtBQUNBLGlCQUFPLE9BQU8sTUFBTSxXQUFXLEtBQUs7QUFBQSxRQUN0QztBQXVCQSxZQUFJLFlBQVksaUJBQWlCLFNBQVNvQixTQUFRLE1BQU0sT0FBTztBQUM3RCxpQkFBT0EsV0FBVSxRQUFRLE1BQU0sTUFBTSxXQUFXLElBQUk7QUFBQSxRQUN0RCxDQUFDO0FBeUJELGlCQUFTb0QsWUFBVyxRQUFRLFFBQVEsVUFBVTtBQUM1QyxtQkFBUyxTQUFTLE1BQU07QUFDeEIscUJBQVcsWUFBWSxPQUNuQixJQUNBLFVBQVUsVUFBVSxRQUFRLEdBQUcsR0FBRyxPQUFPLE1BQU07QUFFbkQsbUJBQVMsYUFBYSxNQUFNO0FBQzVCLGlCQUFPLE9BQU8sTUFBTSxVQUFVLFdBQVcsT0FBTyxNQUFNLEtBQUs7QUFBQSxRQUM3RDtBQTBHQSxpQkFBUyxTQUFTLFFBQVEsU0FBUyxPQUFPO0FBSXhDLGNBQUksV0FBVyxPQUFPO0FBRXRCLGNBQUksU0FBUyxlQUFlLFFBQVEsU0FBUyxLQUFLLEdBQUc7QUFDbkQsc0JBQVU5RTtBQUFBLFVBQ1o7QUFDQSxtQkFBUyxTQUFTLE1BQU07QUFDeEIsb0JBQVUsYUFBYSxDQUFDLEdBQUcsU0FBUyxVQUFVLHNCQUFzQjtBQUVwRSxjQUFJLFVBQVUsYUFBYSxDQUFDLEdBQUcsUUFBUSxTQUFTLFNBQVMsU0FBUyxzQkFBc0IsR0FDcEYsY0FBY2tDLE1BQUssT0FBTyxHQUMxQixnQkFBZ0IsV0FBVyxTQUFTLFdBQVc7QUFFbkQsY0FBSSxZQUNBLGNBQ0EsUUFBUSxHQUNSLGNBQWMsUUFBUSxlQUFlLFdBQ3JDRCxVQUFTO0FBR2IsY0FBSSxlQUFlbkI7QUFBQSxhQUNoQixRQUFRLFVBQVUsV0FBVyxTQUFTLE1BQ3ZDLFlBQVksU0FBUyxPQUNwQixnQkFBZ0IsZ0JBQWdCLGVBQWUsV0FBVyxTQUFTLE9BQ25FLFFBQVEsWUFBWSxXQUFXLFNBQVM7QUFBQSxZQUN6QztBQUFBLFVBQUc7QUFNTCxjQUFJLFlBQVksb0JBQ2JHLGdCQUFlLEtBQUssU0FBUyxXQUFXLEtBQ3BDLFFBQVEsWUFBWSxJQUFJLFFBQVEsT0FBTyxHQUFHLElBQzFDLDRCQUE2QixFQUFFLGtCQUFtQixPQUNuRDtBQUVOLGlCQUFPLFFBQVEsY0FBYyxTQUFTLE9BQU8sYUFBYSxrQkFBa0IsaUJBQWlCLGVBQWVmLFNBQVE7QUFDbEgsaUNBQXFCLG1CQUFtQjtBQUd4QyxZQUFBK0IsV0FBVSxPQUFPLE1BQU0sT0FBTy9CLE9BQU0sRUFBRSxRQUFRLG1CQUFtQixnQkFBZ0I7QUFHakYsZ0JBQUksYUFBYTtBQUNmLDJCQUFhO0FBQ2IsY0FBQStCLFdBQVUsY0FBYyxjQUFjO0FBQUEsWUFDeEM7QUFDQSxnQkFBSSxlQUFlO0FBQ2pCLDZCQUFlO0FBQ2YsY0FBQUEsV0FBVSxTQUFTLGdCQUFnQjtBQUFBLFlBQ3JDO0FBQ0EsZ0JBQUksa0JBQWtCO0FBQ3BCLGNBQUFBLFdBQVUsbUJBQW1CLG1CQUFtQjtBQUFBLFlBQ2xEO0FBQ0Esb0JBQVEvQixVQUFTLE1BQU07QUFJdkIsbUJBQU87QUFBQSxVQUNULENBQUM7QUFFRCxVQUFBK0IsV0FBVTtBQUlWLGNBQUksV0FBV2hCLGdCQUFlLEtBQUssU0FBUyxVQUFVLEtBQUssUUFBUTtBQUNuRSxjQUFJLENBQUMsVUFBVTtBQUNiLFlBQUFnQixVQUFTLG1CQUFtQkEsVUFBUztBQUFBLFVBQ3ZDLFdBR1MsMkJBQTJCLEtBQUssUUFBUSxHQUFHO0FBQ2xELGtCQUFNLElBQUl2QixPQUFNLDRCQUE0QjtBQUFBLFVBQzlDO0FBR0EsVUFBQXVCLFdBQVUsZUFBZUEsUUFBTyxRQUFRLHNCQUFzQixFQUFFLElBQUlBLFNBQ2pFLFFBQVEscUJBQXFCLElBQUksRUFDakMsUUFBUSx1QkFBdUIsS0FBSztBQUd2QyxVQUFBQSxVQUFTLGVBQWUsWUFBWSxTQUFTLFdBQzFDLFdBQ0csS0FDQSwwQkFFSix1QkFDQyxhQUNJLHFCQUNBLE9BRUosZUFDRyx5RkFFQSxTQUVKQSxVQUNBO0FBRUYsY0FBSVAsVUFBUyxRQUFRLFdBQVc7QUFDOUIsbUJBQU9mLFVBQVMsYUFBYSxZQUFZLFlBQVlzQixPQUFNLEVBQ3hELE1BQU1qQyxZQUFXLGFBQWE7QUFBQSxVQUNuQyxDQUFDO0FBSUQsVUFBQTBCLFFBQU8sU0FBU087QUFDaEIsY0FBSSxRQUFRUCxPQUFNLEdBQUc7QUFDbkIsa0JBQU1BO0FBQUEsVUFDUjtBQUNBLGlCQUFPQTtBQUFBLFFBQ1Q7QUF1QkEsaUJBQVMsUUFBUSxPQUFPO0FBQ3RCLGlCQUFPLFNBQVMsS0FBSyxFQUFFLFlBQVk7QUFBQSxRQUNyQztBQXVCQSxpQkFBUyxRQUFRLE9BQU87QUFDdEIsaUJBQU8sU0FBUyxLQUFLLEVBQUUsWUFBWTtBQUFBLFFBQ3JDO0FBd0JBLGlCQUFTLEtBQUssUUFBUSxPQUFPLE9BQU87QUFDbEMsbUJBQVMsU0FBUyxNQUFNO0FBQ3hCLGNBQUksV0FBVyxTQUFTLFVBQVUxQixhQUFZO0FBQzVDLG1CQUFPLFNBQVMsTUFBTTtBQUFBLFVBQ3hCO0FBQ0EsY0FBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLGFBQWEsS0FBSyxJQUFJO0FBQzdDLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUksYUFBYU0sZUFBYyxNQUFNLEdBQ2pDLGFBQWFBLGVBQWMsS0FBSyxHQUNoQ3FCLFNBQVEsZ0JBQWdCLFlBQVksVUFBVSxHQUM5Q0MsT0FBTSxjQUFjLFlBQVksVUFBVSxJQUFJO0FBRWxELGlCQUFPLFVBQVUsWUFBWUQsUUFBT0MsSUFBRyxFQUFFLEtBQUssRUFBRTtBQUFBLFFBQ2xEO0FBcUJBLGlCQUFTLFFBQVEsUUFBUSxPQUFPLE9BQU87QUFDckMsbUJBQVMsU0FBUyxNQUFNO0FBQ3hCLGNBQUksV0FBVyxTQUFTLFVBQVU1QixhQUFZO0FBQzVDLG1CQUFPLE9BQU8sTUFBTSxHQUFHLGdCQUFnQixNQUFNLElBQUksQ0FBQztBQUFBLFVBQ3BEO0FBQ0EsY0FBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLGFBQWEsS0FBSyxJQUFJO0FBQzdDLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUksYUFBYU0sZUFBYyxNQUFNLEdBQ2pDc0IsT0FBTSxjQUFjLFlBQVl0QixlQUFjLEtBQUssQ0FBQyxJQUFJO0FBRTVELGlCQUFPLFVBQVUsWUFBWSxHQUFHc0IsSUFBRyxFQUFFLEtBQUssRUFBRTtBQUFBLFFBQzlDO0FBcUJBLGlCQUFTLFVBQVUsUUFBUSxPQUFPLE9BQU87QUFDdkMsbUJBQVMsU0FBUyxNQUFNO0FBQ3hCLGNBQUksV0FBVyxTQUFTLFVBQVU1QixhQUFZO0FBQzVDLG1CQUFPLE9BQU8sUUFBUSxhQUFhLEVBQUU7QUFBQSxVQUN2QztBQUNBLGNBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxhQUFhLEtBQUssSUFBSTtBQUM3QyxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJLGFBQWFNLGVBQWMsTUFBTSxHQUNqQ3FCLFNBQVEsZ0JBQWdCLFlBQVlyQixlQUFjLEtBQUssQ0FBQztBQUU1RCxpQkFBTyxVQUFVLFlBQVlxQixNQUFLLEVBQUUsS0FBSyxFQUFFO0FBQUEsUUFDN0M7QUF1Q0EsaUJBQVMsU0FBUyxRQUFRLFNBQVM7QUFDakMsY0FBSSxTQUFTLHNCQUNULFdBQVc7QUFFZixjQUFJLFNBQVMsT0FBTyxHQUFHO0FBQ3JCLGdCQUFJLFlBQVksZUFBZSxVQUFVLFFBQVEsWUFBWTtBQUM3RCxxQkFBUyxZQUFZLFVBQVUsVUFBVSxRQUFRLE1BQU0sSUFBSTtBQUMzRCx1QkFBVyxjQUFjLFVBQVUsYUFBYSxRQUFRLFFBQVEsSUFBSTtBQUFBLFVBQ3RFO0FBQ0EsbUJBQVMsU0FBUyxNQUFNO0FBRXhCLGNBQUksWUFBWSxPQUFPO0FBQ3ZCLGNBQUksV0FBVyxNQUFNLEdBQUc7QUFDdEIsZ0JBQUksYUFBYXJCLGVBQWMsTUFBTTtBQUNyQyx3QkFBWSxXQUFXO0FBQUEsVUFDekI7QUFDQSxjQUFJLFVBQVUsV0FBVztBQUN2QixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJc0IsT0FBTSxTQUFTLFdBQVcsUUFBUTtBQUN0QyxjQUFJQSxPQUFNLEdBQUc7QUFDWCxtQkFBTztBQUFBLFVBQ1Q7QUFDQSxjQUFJRixVQUFTLGFBQ1QsVUFBVSxZQUFZLEdBQUdFLElBQUcsRUFBRSxLQUFLLEVBQUUsSUFDckMsT0FBTyxNQUFNLEdBQUdBLElBQUc7QUFFdkIsY0FBSSxjQUFjNUIsWUFBVztBQUMzQixtQkFBTzBCLFVBQVM7QUFBQSxVQUNsQjtBQUNBLGNBQUksWUFBWTtBQUNkLFlBQUFFLFFBQVFGLFFBQU8sU0FBU0U7QUFBQSxVQUMxQjtBQUNBLGNBQUl5QyxVQUFTLFNBQVMsR0FBRztBQUN2QixnQkFBSSxPQUFPLE1BQU16QyxJQUFHLEVBQUUsT0FBTyxTQUFTLEdBQUc7QUFDdkMsa0JBQUksT0FDQSxZQUFZRjtBQUVoQixrQkFBSSxDQUFDLFVBQVUsUUFBUTtBQUNyQiw0QkFBWVosUUFBTyxVQUFVLFFBQVEsU0FBUyxRQUFRLEtBQUssU0FBUyxDQUFDLElBQUksR0FBRztBQUFBLGNBQzlFO0FBQ0Esd0JBQVUsWUFBWTtBQUN0QixxQkFBUSxRQUFRLFVBQVUsS0FBSyxTQUFTLEdBQUk7QUFDMUMsb0JBQUksU0FBUyxNQUFNO0FBQUEsY0FDckI7QUFDQSxjQUFBWSxVQUFTQSxRQUFPLE1BQU0sR0FBRyxXQUFXMUIsYUFBWTRCLE9BQU0sTUFBTTtBQUFBLFlBQzlEO0FBQUEsVUFDRixXQUFXLE9BQU8sUUFBUSxhQUFhLFNBQVMsR0FBR0EsSUFBRyxLQUFLQSxNQUFLO0FBQzlELGdCQUFJLFFBQVFGLFFBQU8sWUFBWSxTQUFTO0FBQ3hDLGdCQUFJLFFBQVEsSUFBSTtBQUNkLGNBQUFBLFVBQVNBLFFBQU8sTUFBTSxHQUFHLEtBQUs7QUFBQSxZQUNoQztBQUFBLFVBQ0Y7QUFDQSxpQkFBT0EsVUFBUztBQUFBLFFBQ2xCO0FBcUJBLGlCQUFTLFNBQVMsUUFBUTtBQUN4QixtQkFBUyxTQUFTLE1BQU07QUFDeEIsaUJBQVEsVUFBVSxpQkFBaUIsS0FBSyxNQUFNLElBQzFDLE9BQU8sUUFBUSxlQUFlLGdCQUFnQixJQUM5QztBQUFBLFFBQ047QUFzQkEsWUFBSSxZQUFZLGlCQUFpQixTQUFTQSxTQUFRLE1BQU0sT0FBTztBQUM3RCxpQkFBT0EsV0FBVSxRQUFRLE1BQU0sTUFBTSxLQUFLLFlBQVk7QUFBQSxRQUN4RCxDQUFDO0FBbUJELFlBQUksYUFBYSxnQkFBZ0IsYUFBYTtBQXFCOUMsaUJBQVMsTUFBTSxRQUFRLFNBQVMsT0FBTztBQUNyQyxtQkFBUyxTQUFTLE1BQU07QUFDeEIsb0JBQVUsUUFBUTFCLGFBQVk7QUFFOUIsY0FBSSxZQUFZQSxZQUFXO0FBQ3pCLG1CQUFPLGVBQWUsTUFBTSxJQUFJLGFBQWEsTUFBTSxJQUFJLFdBQVcsTUFBTTtBQUFBLFVBQzFFO0FBQ0EsaUJBQU8sT0FBTyxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQUEsUUFDbkM7QUEwQkEsWUFBSSxVQUFVLFNBQVMsU0FBUyxNQUFNLE1BQU07QUFDMUMsY0FBSTtBQUNGLG1CQUFPQyxPQUFNLE1BQU1ELFlBQVcsSUFBSTtBQUFBLFVBQ3BDLFNBQVMsR0FBRztBQUNWLG1CQUFPLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSVUsT0FBTSxDQUFDO0FBQUEsVUFDckM7QUFBQSxRQUNGLENBQUM7QUE0QkQsWUFBSSxVQUFVLFNBQVMsU0FBUyxRQUFRLGFBQWE7QUFDbkQsb0JBQVUsYUFBYSxTQUFTLEtBQUs7QUFDbkMsa0JBQU0sTUFBTSxHQUFHO0FBQ2YsNEJBQWdCLFFBQVEsS0FBS21ELE1BQUssT0FBTyxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQUEsVUFDeEQsQ0FBQztBQUNELGlCQUFPO0FBQUEsUUFDVCxDQUFDO0FBK0JELGlCQUFTLEtBQUssT0FBTztBQUNuQixjQUFJLFNBQVMsU0FBUyxPQUFPLElBQUksTUFBTSxRQUNuQyxhQUFhLFlBQVk7QUFFN0Isa0JBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLE9BQU8sU0FBUyxNQUFNO0FBQ3BELGdCQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssWUFBWTtBQUNoQyxvQkFBTSxJQUFJN0MsV0FBVSxlQUFlO0FBQUEsWUFDckM7QUFDQSxtQkFBTyxDQUFDLFdBQVcsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUFBLFVBQ3RDLENBQUM7QUFFRCxpQkFBTyxTQUFTLFNBQVMsTUFBTTtBQUM3QixnQkFBSSxRQUFRO0FBQ1osbUJBQU8sRUFBRSxRQUFRLFFBQVE7QUFDdkIsa0JBQUksT0FBTyxNQUFNLEtBQUs7QUFDdEIsa0JBQUlmLE9BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUc7QUFDOUIsdUJBQU9BLE9BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJO0FBQUEsY0FDbEM7QUFBQSxZQUNGO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQTBCQSxpQkFBUyxTQUFTZ0MsU0FBUTtBQUN4QixpQkFBTyxhQUFhLFVBQVVBLFNBQVEsZUFBZSxDQUFDO0FBQUEsUUFDeEQ7QUFxQkEsaUJBQVMsU0FBUyxPQUFPO0FBQ3ZCLGlCQUFPLFdBQVc7QUFDaEIsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQXNCQSxpQkFBUyxVQUFVLE9BQU8sY0FBYztBQUN0QyxpQkFBUSxTQUFTLFFBQVEsVUFBVSxRQUFTLGVBQWU7QUFBQSxRQUM3RDtBQXdCQSxZQUFJLE9BQU8sV0FBVztBQXVCdEIsWUFBSSxZQUFZLFdBQVcsSUFBSTtBQWtCL0IsaUJBQVMsU0FBUyxPQUFPO0FBQ3ZCLGlCQUFPO0FBQUEsUUFDVDtBQTRDQSxpQkFBUyxTQUFTLE1BQU07QUFDdEIsaUJBQU8sYUFBYSxPQUFPLFFBQVEsYUFBYSxPQUFPLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFBQSxRQUN6RjtBQXFDQSxpQkFBUzhDLFNBQVE5QyxTQUFRO0FBQ3ZCLGlCQUFPLFlBQVksVUFBVUEsU0FBUSxlQUFlLENBQUM7QUFBQSxRQUN2RDtBQW1DQSxpQkFBUyxnQkFBZ0IsTUFBTSxVQUFVO0FBQ3ZDLGlCQUFPLG9CQUFvQixNQUFNLFVBQVUsVUFBVSxlQUFlLENBQUM7QUFBQSxRQUN2RTtBQTBCQSxZQUFJLFNBQVMsU0FBUyxTQUFTLE1BQU0sTUFBTTtBQUN6QyxpQkFBTyxTQUFTLFFBQVE7QUFDdEIsbUJBQU8sV0FBVyxRQUFRLE1BQU0sSUFBSTtBQUFBLFVBQ3RDO0FBQUEsUUFDRixDQUFDO0FBeUJELFlBQUksV0FBVyxTQUFTLFNBQVMsUUFBUSxNQUFNO0FBQzdDLGlCQUFPLFNBQVMsTUFBTTtBQUNwQixtQkFBTyxXQUFXLFFBQVEsTUFBTSxJQUFJO0FBQUEsVUFDdEM7QUFBQSxRQUNGLENBQUM7QUFzQ0QsaUJBQVMsTUFBTSxRQUFRQSxTQUFRLFNBQVM7QUFDdEMsY0FBSSxRQUFRQyxNQUFLRCxPQUFNLEdBQ25CLGNBQWMsY0FBY0EsU0FBUSxLQUFLO0FBRTdDLGNBQUksV0FBVyxRQUNYLEVBQUUsU0FBU0EsT0FBTSxNQUFNLFlBQVksVUFBVSxDQUFDLE1BQU0sVUFBVTtBQUNoRSxzQkFBVUE7QUFDVixZQUFBQSxVQUFTO0FBQ1QscUJBQVM7QUFDVCwwQkFBYyxjQUFjQSxTQUFRQyxNQUFLRCxPQUFNLENBQUM7QUFBQSxVQUNsRDtBQUNBLGNBQUkrQyxTQUFRLEVBQUUsU0FBUyxPQUFPLEtBQUssV0FBVyxZQUFZLENBQUMsQ0FBQyxRQUFRLE9BQ2hFLFNBQVN6QyxZQUFXLE1BQU07QUFFOUIsb0JBQVUsYUFBYSxTQUFTLFlBQVk7QUFDMUMsZ0JBQUksT0FBT04sUUFBTyxVQUFVO0FBQzVCLG1CQUFPLFVBQVUsSUFBSTtBQUNyQixnQkFBSSxRQUFRO0FBQ1YscUJBQU8sVUFBVSxVQUFVLElBQUksV0FBVztBQUN4QyxvQkFBSSxXQUFXLEtBQUs7QUFDcEIsb0JBQUkrQyxVQUFTLFVBQVU7QUFDckIsc0JBQUl0RCxVQUFTLE9BQU8sS0FBSyxXQUFXLEdBQ2hDLFVBQVVBLFFBQU8sY0FBYyxVQUFVLEtBQUssV0FBVztBQUU3RCwwQkFBUSxLQUFLLEVBQUUsUUFBUSxNQUFNLFFBQVEsV0FBVyxXQUFXLE9BQU8sQ0FBQztBQUNuRSxrQkFBQUEsUUFBTyxZQUFZO0FBQ25CLHlCQUFPQTtBQUFBLGdCQUNUO0FBQ0EsdUJBQU8sS0FBSyxNQUFNLFFBQVEsVUFBVSxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQUEsY0FDaEU7QUFBQSxZQUNGO0FBQUEsVUFDRixDQUFDO0FBRUQsaUJBQU87QUFBQSxRQUNUO0FBZUEsaUJBQVMsYUFBYTtBQUNwQixjQUFJLEtBQUssTUFBTSxNQUFNO0FBQ25CLGlCQUFLLElBQUk7QUFBQSxVQUNYO0FBQ0EsaUJBQU87QUFBQSxRQUNUO0FBY0EsaUJBQVN3QixRQUFPO0FBQUEsUUFFaEI7QUFzQkEsaUJBQVMsT0FBTyxHQUFHO0FBQ2pCLGNBQUksVUFBVSxDQUFDO0FBQ2YsaUJBQU8sU0FBUyxTQUFTLE1BQU07QUFDN0IsbUJBQU8sUUFBUSxNQUFNLENBQUM7QUFBQSxVQUN4QixDQUFDO0FBQUEsUUFDSDtBQW9CQSxZQUFJLE9BQU8sV0FBVyxRQUFRO0FBOEI5QixZQUFJLFlBQVksV0FBVyxVQUFVO0FBaUNyQyxZQUFJLFdBQVcsV0FBVyxTQUFTO0FBd0JuQyxpQkFBUyxTQUFTLE1BQU07QUFDdEIsaUJBQU8sTUFBTSxJQUFJLElBQUksYUFBYSxNQUFNLElBQUksQ0FBQyxJQUFJLGlCQUFpQixJQUFJO0FBQUEsUUFDeEU7QUF1QkEsaUJBQVMsV0FBVyxRQUFRO0FBQzFCLGlCQUFPLFNBQVMsTUFBTTtBQUNwQixtQkFBTyxVQUFVLE9BQU9sRCxhQUFZLFFBQVEsUUFBUSxJQUFJO0FBQUEsVUFDMUQ7QUFBQSxRQUNGO0FBMkNBLFlBQUksUUFBUSxZQUFZO0FBc0N4QixZQUFJLGFBQWEsWUFBWSxJQUFJO0FBb0JqQyxpQkFBUyxZQUFZO0FBQ25CLGlCQUFPLENBQUM7QUFBQSxRQUNWO0FBZUEsaUJBQVMsWUFBWTtBQUNuQixpQkFBTztBQUFBLFFBQ1Q7QUFvQkEsaUJBQVMsYUFBYTtBQUNwQixpQkFBTyxDQUFDO0FBQUEsUUFDVjtBQWVBLGlCQUFTLGFBQWE7QUFDcEIsaUJBQU87QUFBQSxRQUNUO0FBZUEsaUJBQVMsV0FBVztBQUNsQixpQkFBTztBQUFBLFFBQ1Q7QUFxQkEsaUJBQVMsTUFBTSxHQUFHNkIsV0FBVTtBQUMxQixjQUFJLFVBQVUsQ0FBQztBQUNmLGNBQUksSUFBSSxLQUFLLElBQUksa0JBQWtCO0FBQ2pDLG1CQUFPLENBQUM7QUFBQSxVQUNWO0FBQ0EsY0FBSSxRQUFRLGtCQUNSLFNBQVMsVUFBVSxHQUFHLGdCQUFnQjtBQUUxQyxVQUFBQSxZQUFXLFlBQVlBLFNBQVE7QUFDL0IsZUFBSztBQUVMLGNBQUlILFVBQVMsVUFBVSxRQUFRRyxTQUFRO0FBQ3ZDLGlCQUFPLEVBQUUsUUFBUSxHQUFHO0FBQ2xCLFlBQUFBLFVBQVMsS0FBSztBQUFBLFVBQ2hCO0FBQ0EsaUJBQU9IO0FBQUEsUUFDVDtBQW1CQSxpQkFBUyxPQUFPLE9BQU87QUFDckIsY0FBSSxRQUFRLEtBQUssR0FBRztBQUNsQixtQkFBTyxTQUFTLE9BQU8sS0FBSztBQUFBLFVBQzlCO0FBQ0EsaUJBQU8sU0FBUyxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksVUFBVSxhQUFhLFNBQVMsS0FBSyxDQUFDLENBQUM7QUFBQSxRQUM1RTtBQW1CQSxpQkFBUyxTQUFTLFFBQVE7QUFDeEIsY0FBSSxLQUFLLEVBQUVSO0FBQ1gsaUJBQU8sU0FBUyxNQUFNLElBQUk7QUFBQSxRQUM1QjtBQW1CQSxZQUFJLE1BQU0sb0JBQW9CLFNBQVMsUUFBUSxRQUFRO0FBQ3JELGlCQUFPLFNBQVM7QUFBQSxRQUNsQixHQUFHLENBQUM7QUF1QkosWUFBSSxPQUFPLFlBQVksTUFBTTtBQWlCN0IsWUFBSSxTQUFTLG9CQUFvQixTQUFTLFVBQVUsU0FBUztBQUMzRCxpQkFBTyxXQUFXO0FBQUEsUUFDcEIsR0FBRyxDQUFDO0FBdUJKLFlBQUksUUFBUSxZQUFZLE9BQU87QUFvQi9CLGlCQUFTK0QsS0FBSSxPQUFPO0FBQ2xCLGlCQUFRLFNBQVMsTUFBTSxTQUNuQixhQUFhLE9BQU8sVUFBVSxNQUFNLElBQ3BDakY7QUFBQSxRQUNOO0FBeUJBLGlCQUFTLE1BQU0sT0FBTzZCLFdBQVU7QUFDOUIsaUJBQVEsU0FBUyxNQUFNLFNBQ25CLGFBQWEsT0FBTyxZQUFZQSxXQUFVLENBQUMsR0FBRyxNQUFNLElBQ3BEN0I7QUFBQSxRQUNOO0FBZ0JBLGlCQUFTLEtBQUssT0FBTztBQUNuQixpQkFBTyxTQUFTLE9BQU8sUUFBUTtBQUFBLFFBQ2pDO0FBeUJBLGlCQUFTLE9BQU8sT0FBTzZCLFdBQVU7QUFDL0IsaUJBQU8sU0FBUyxPQUFPLFlBQVlBLFdBQVUsQ0FBQyxDQUFDO0FBQUEsUUFDakQ7QUFvQkEsaUJBQVNxRCxLQUFJLE9BQU87QUFDbEIsaUJBQVEsU0FBUyxNQUFNLFNBQ25CLGFBQWEsT0FBTyxVQUFVLE1BQU0sSUFDcENsRjtBQUFBLFFBQ047QUF5QkEsaUJBQVMsTUFBTSxPQUFPNkIsV0FBVTtBQUM5QixpQkFBUSxTQUFTLE1BQU0sU0FDbkIsYUFBYSxPQUFPLFlBQVlBLFdBQVUsQ0FBQyxHQUFHLE1BQU0sSUFDcEQ3QjtBQUFBLFFBQ047QUFpQkEsWUFBSSxXQUFXLG9CQUFvQixTQUFTLFlBQVksY0FBYztBQUNwRSxpQkFBTyxhQUFhO0FBQUEsUUFDdEIsR0FBRyxDQUFDO0FBdUJKLFlBQUltRixTQUFRLFlBQVksT0FBTztBQWlCL0IsWUFBSSxXQUFXLG9CQUFvQixTQUFTLFNBQVMsWUFBWTtBQUMvRCxpQkFBTyxVQUFVO0FBQUEsUUFDbkIsR0FBRyxDQUFDO0FBZ0JKLGlCQUFTLElBQUksT0FBTztBQUNsQixpQkFBUSxTQUFTLE1BQU0sU0FDbkIsUUFBUSxPQUFPLFFBQVEsSUFDdkI7QUFBQSxRQUNOO0FBeUJBLGlCQUFTLE1BQU0sT0FBT3RELFdBQVU7QUFDOUIsaUJBQVEsU0FBUyxNQUFNLFNBQ25CLFFBQVEsT0FBTyxZQUFZQSxXQUFVLENBQUMsQ0FBQyxJQUN2QztBQUFBLFFBQ047QUFLQSxlQUFPLFFBQVE7QUFDZixlQUFPLE1BQU07QUFDYixlQUFPLFNBQVN5QztBQUNoQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxlQUFlO0FBQ3RCLGVBQU8sYUFBYTtBQUNwQixlQUFPLEtBQUs7QUFDWixlQUFPLFNBQVM7QUFDaEIsZUFBTyxPQUFPVDtBQUNkLGVBQU8sVUFBVTtBQUNqQixlQUFPLFVBQVU7QUFDakIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sUUFBUTtBQUNmLGVBQU8sUUFBUTtBQUNmLGVBQU8sVUFBVTtBQUNqQixlQUFPLFNBQVNQO0FBQ2hCLGVBQU8sT0FBTztBQUNkLGVBQU8sV0FBVztBQUNsQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sU0FBU2lCO0FBQ2hCLGVBQU8sUUFBUTtBQUNmLGVBQU8sYUFBYTtBQUNwQixlQUFPLFdBQVdUO0FBQ2xCLGVBQU8sV0FBV1U7QUFDbEIsZUFBTyxlQUFlO0FBQ3RCLGVBQU8sUUFBUTtBQUNmLGVBQU8sUUFBUTtBQUNmLGVBQU8sYUFBYTtBQUNwQixlQUFPLGVBQWU7QUFDdEIsZUFBTyxpQkFBaUI7QUFDeEIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxZQUFZO0FBQ25CLGVBQU8saUJBQWlCO0FBQ3hCLGVBQU8sWUFBWTtBQUNuQixlQUFPLE9BQU87QUFDZCxlQUFPLFNBQVM7QUFDaEIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sY0FBYztBQUNyQixlQUFPLGVBQWU7QUFDdEIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sY0FBYztBQUNyQixlQUFPLGVBQWU7QUFDdEIsZUFBTyxPQUFPVDtBQUNkLGVBQU8sT0FBTztBQUNkLGVBQU8sWUFBWTtBQUNuQixlQUFPLFlBQVk7QUFDbkIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sY0FBYztBQUNyQixlQUFPLFVBQVU7QUFDakIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sZUFBZTtBQUN0QixlQUFPLGlCQUFpQjtBQUN4QixlQUFPLG1CQUFtQjtBQUMxQixlQUFPLFNBQVM7QUFDaEIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sWUFBWTtBQUNuQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxRQUFRO0FBQ2YsZUFBTyxPQUFPN0I7QUFDZCxlQUFPLFNBQVM7QUFDaEIsZUFBTyxNQUFNN0I7QUFDYixlQUFPLFVBQVU7QUFDakIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sVUFBVTBFO0FBQ2pCLGVBQU8sa0JBQWtCO0FBQ3pCLGVBQU8sVUFBVTtBQUNqQixlQUFPLFFBQVE7QUFDZixlQUFPLFlBQVk7QUFDbkIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sV0FBVztBQUNsQixlQUFPLFFBQVE7QUFDZixlQUFPLFNBQVM7QUFDaEIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sT0FBTztBQUNkLGVBQU8sU0FBUztBQUNoQixlQUFPLE9BQU87QUFDZCxlQUFPLFVBQVU7QUFDakIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sWUFBWTtBQUNuQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sZUFBZTtBQUN0QixlQUFPLFlBQVk7QUFDbkIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sV0FBVztBQUNsQixlQUFPLGFBQWE7QUFDcEIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sWUFBWTtBQUNuQixlQUFPLGNBQWM7QUFDckIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sUUFBUTtBQUNmLGVBQU8sYUFBYTtBQUNwQixlQUFPLFFBQVE7QUFDZixlQUFPLFNBQVM7QUFDaEIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sT0FBTztBQUNkLGVBQU8sVUFBVTtBQUNqQixlQUFPLGFBQWE7QUFDcEIsZUFBTyxNQUFNO0FBQ2IsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sVUFBVTtBQUNqQixlQUFPLFFBQVF2QjtBQUNmLGVBQU8sU0FBUztBQUNoQixlQUFPLGFBQWE7QUFDcEIsZUFBTyxlQUFlO0FBQ3RCLGVBQU8sUUFBUXFCO0FBQ2YsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sT0FBTztBQUNkLGVBQU8sT0FBTztBQUNkLGVBQU8sWUFBWTtBQUNuQixlQUFPLGlCQUFpQjtBQUN4QixlQUFPLFlBQVk7QUFDbkIsZUFBTyxNQUFNO0FBQ2IsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sT0FBTztBQUNkLGVBQU8sVUFBVTtBQUNqQixlQUFPLFVBQVU7QUFDakIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sU0FBUztBQUNoQixlQUFPLGdCQUFnQjtBQUN2QixlQUFPLFlBQVk7QUFDbkIsZUFBTyxRQUFRO0FBQ2YsZUFBTyxRQUFRO0FBQ2YsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sWUFBWTtBQUNuQixlQUFPLE9BQU87QUFDZCxlQUFPLFNBQVM7QUFDaEIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sUUFBUTtBQUNmLGVBQU8sUUFBUTtBQUNmLGVBQU8sWUFBWTtBQUNuQixlQUFPLFNBQVM7QUFDaEIsZUFBTyxhQUFhO0FBQ3BCLGVBQU8sU0FBUztBQUNoQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sUUFBUTtBQUNmLGVBQU8sT0FBT2I7QUFDZCxlQUFPLE1BQU07QUFDYixlQUFPLFFBQVE7QUFDZixlQUFPLFVBQVU7QUFDakIsZUFBTyxNQUFNO0FBQ2IsZUFBTyxZQUFZO0FBQ25CLGVBQU8sZ0JBQWdCO0FBQ3ZCLGVBQU8sVUFBVTtBQUdqQixlQUFPLFVBQVU7QUFDakIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sU0FBUztBQUNoQixlQUFPLGFBQWE7QUFHcEIsY0FBTSxRQUFRLE1BQU07QUFLcEIsZUFBTyxNQUFNO0FBQ2IsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sWUFBWTtBQUNuQixlQUFPLGFBQWE7QUFDcEIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxRQUFRUztBQUNmLGVBQU8sUUFBUTtBQUNmLGVBQU8sWUFBWTtBQUNuQixlQUFPLGdCQUFnQjtBQUN2QixlQUFPLFlBQVk7QUFDbkIsZUFBTyxhQUFhO0FBQ3BCLGVBQU8sU0FBUztBQUNoQixlQUFPLFlBQVk7QUFDbkIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sV0FBVztBQUNsQixlQUFPLEtBQUs7QUFDWixlQUFPLFNBQVNDO0FBQ2hCLGVBQU8sZUFBZTtBQUN0QixlQUFPLFFBQVE7QUFDZixlQUFPLE9BQU9mO0FBQ2QsZUFBTyxZQUFZO0FBQ25CLGVBQU8sVUFBVTtBQUNqQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxnQkFBZ0I7QUFDdkIsZUFBTyxjQUFjO0FBQ3JCLGVBQU8sUUFBUTtBQUNmLGVBQU8sVUFBVUM7QUFDakIsZUFBTyxlQUFlO0FBQ3RCLGVBQU8sUUFBUTtBQUNmLGVBQU8sYUFBYTtBQUNwQixlQUFPLFNBQVM7QUFDaEIsZUFBTyxjQUFjO0FBQ3JCLGVBQU8sTUFBTXpCO0FBQ2IsZUFBTyxLQUFLO0FBQ1osZUFBTyxNQUFNO0FBQ2IsZUFBTyxNQUFNO0FBQ2IsZUFBTyxRQUFRO0FBQ2YsZUFBTyxPQUFPO0FBQ2QsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sV0FBVztBQUNsQixlQUFPLFVBQVU7QUFDakIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sU0FBUztBQUNoQixlQUFPLGNBQWM7QUFDckIsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sZ0JBQWdCO0FBQ3ZCLGVBQU8sY0FBYztBQUNyQixlQUFPLG9CQUFvQjtBQUMzQixlQUFPLFlBQVk7QUFDbkIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sU0FBUztBQUNoQixlQUFPLFlBQVk4QjtBQUNuQixlQUFPLFVBQVVDO0FBQ2pCLGVBQU8sVUFBVUM7QUFDakIsZUFBTyxjQUFjO0FBQ3JCLGVBQU8sVUFBVTtBQUNqQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxhQUFhNUI7QUFDcEIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sV0FBVztBQUNsQixlQUFPLFFBQVE7QUFDZixlQUFPLFVBQVU7QUFDakIsZUFBTyxjQUFjO0FBQ3JCLGVBQU8sUUFBUTtBQUNmLGVBQU8sV0FBVztBQUNsQixlQUFPLFFBQVE7QUFDZixlQUFPLFNBQVM7QUFDaEIsZUFBTyxXQUFXNkI7QUFDbEIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sZUFBZTtBQUN0QixlQUFPLGdCQUFnQjNCO0FBQ3ZCLGVBQU8sV0FBVzRCO0FBQ2xCLGVBQU8sZ0JBQWdCO0FBQ3ZCLGVBQU8sUUFBUTtBQUNmLGVBQU8sV0FBVztBQUNsQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxlQUFlO0FBQ3RCLGVBQU8sY0FBYztBQUNyQixlQUFPLFlBQVk7QUFDbkIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sT0FBT2Q7QUFDZCxlQUFPLFlBQVk7QUFDbkIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxjQUFjO0FBQ3JCLGVBQU8sWUFBWTtBQUNuQixlQUFPLGFBQWE7QUFDcEIsZUFBTyxLQUFLO0FBQ1osZUFBTyxNQUFNO0FBQ2IsZUFBTyxNQUFNMEI7QUFDYixlQUFPLFFBQVE7QUFDZixlQUFPLE9BQU87QUFDZCxlQUFPLFNBQVM7QUFDaEIsZUFBTyxNQUFNQztBQUNiLGVBQU8sUUFBUTtBQUNmLGVBQU8sWUFBWTtBQUNuQixlQUFPLFlBQVk7QUFDbkIsZUFBTyxhQUFhO0FBQ3BCLGVBQU8sYUFBYTtBQUNwQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sTUFBTTtBQUNiLGVBQU8sYUFBYTtBQUNwQixlQUFPLE9BQU9oQztBQUNkLGVBQU8sTUFBTTtBQUNiLGVBQU8sTUFBTTtBQUNiLGVBQU8sU0FBUztBQUNoQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxXQUFXeUI7QUFDbEIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sU0FBUztBQUNoQixlQUFPLGNBQWM7QUFDckIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sVUFBVUM7QUFDakIsZUFBTyxTQUFTO0FBQ2hCLGVBQU8sUUFBUU87QUFDZixlQUFPLGVBQWU1RTtBQUN0QixlQUFPLFNBQVM7QUFDaEIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxZQUFZO0FBQ25CLGVBQU8sT0FBTztBQUNkLGVBQU8sY0FBYztBQUNyQixlQUFPLGdCQUFnQjtBQUN2QixlQUFPLGdCQUFnQjtBQUN2QixlQUFPLGtCQUFrQjtBQUN6QixlQUFPLG9CQUFvQjtBQUMzQixlQUFPLG9CQUFvQjtBQUMzQixlQUFPLFlBQVk7QUFDbkIsZUFBTyxhQUFhdUU7QUFDcEIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sTUFBTTtBQUNiLGVBQU8sUUFBUTtBQUNmLGVBQU8sV0FBVztBQUNsQixlQUFPLFFBQVE7QUFDZixlQUFPLFdBQVc7QUFDbEIsZUFBTyxZQUFZO0FBQ25CLGVBQU8sV0FBVztBQUNsQixlQUFPLFVBQVU7QUFDakIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sZ0JBQWdCO0FBQ3ZCLGVBQU8sV0FBVztBQUNsQixlQUFPLFVBQVU7QUFDakIsZUFBTyxPQUFPO0FBQ2QsZUFBTyxVQUFVO0FBQ2pCLGVBQU8sWUFBWTtBQUNuQixlQUFPLFdBQVc7QUFDbEIsZUFBTyxXQUFXO0FBQ2xCLGVBQU8sV0FBVztBQUNsQixlQUFPLFlBQVk7QUFDbkIsZUFBTyxhQUFhO0FBR3BCLGVBQU8sT0FBT2xCO0FBQ2QsZUFBTyxZQUFZO0FBQ25CLGVBQU8sUUFBUTtBQUVmLGNBQU0sUUFBUyxXQUFXO0FBQ3hCLGNBQUkzQixVQUFTLENBQUM7QUFDZCxxQkFBVyxRQUFRLFNBQVMsTUFBTSxZQUFZO0FBQzVDLGdCQUFJLENBQUNoQixnQkFBZSxLQUFLLE9BQU8sV0FBVyxVQUFVLEdBQUc7QUFDdEQsY0FBQWdCLFFBQU8sVUFBVSxJQUFJO0FBQUEsWUFDdkI7QUFBQSxVQUNGLENBQUM7QUFDRCxpQkFBT0E7QUFBQSxRQUNULEVBQUUsR0FBSSxFQUFFLFNBQVMsTUFBTSxDQUFDO0FBV3hCLGVBQU8sVUFBVTtBQUdqQixrQkFBVSxDQUFDLFFBQVEsV0FBVyxTQUFTLGNBQWMsV0FBVyxjQUFjLEdBQUcsU0FBUyxZQUFZO0FBQ3BHLGlCQUFPLFVBQVUsRUFBRSxjQUFjO0FBQUEsUUFDbkMsQ0FBQztBQUdELGtCQUFVLENBQUMsUUFBUSxNQUFNLEdBQUcsU0FBUyxZQUFZLE9BQU87QUFDdEQsc0JBQVksVUFBVSxVQUFVLElBQUksU0FBUyxHQUFHO0FBQzlDLGdCQUFJLE1BQU1qQyxhQUFZLElBQUksVUFBVSxVQUFVLENBQUMsR0FBRyxDQUFDO0FBRW5ELGdCQUFJMEIsVUFBVSxLQUFLLGdCQUFnQixDQUFDLFFBQ2hDLElBQUksWUFBWSxJQUFJLElBQ3BCLEtBQUssTUFBTTtBQUVmLGdCQUFJQSxRQUFPLGNBQWM7QUFDdkIsY0FBQUEsUUFBTyxnQkFBZ0IsVUFBVSxHQUFHQSxRQUFPLGFBQWE7QUFBQSxZQUMxRCxPQUFPO0FBQ0wsY0FBQUEsUUFBTyxVQUFVLEtBQUs7QUFBQSxnQkFDcEIsUUFBUSxVQUFVLEdBQUcsZ0JBQWdCO0FBQUEsZ0JBQ3JDLFFBQVEsY0FBY0EsUUFBTyxVQUFVLElBQUksVUFBVTtBQUFBLGNBQ3ZELENBQUM7QUFBQSxZQUNIO0FBQ0EsbUJBQU9BO0FBQUEsVUFDVDtBQUVBLHNCQUFZLFVBQVUsYUFBYSxPQUFPLElBQUksU0FBUyxHQUFHO0FBQ3hELG1CQUFPLEtBQUssUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUTtBQUFBLFVBQy9DO0FBQUEsUUFDRixDQUFDO0FBR0Qsa0JBQVUsQ0FBQyxVQUFVLE9BQU8sV0FBVyxHQUFHLFNBQVMsWUFBWSxPQUFPO0FBQ3BFLGNBQUksT0FBTyxRQUFRLEdBQ2YsV0FBVyxRQUFRLG9CQUFvQixRQUFRO0FBRW5ELHNCQUFZLFVBQVUsVUFBVSxJQUFJLFNBQVNHLFdBQVU7QUFDckQsZ0JBQUlILFVBQVMsS0FBSyxNQUFNO0FBQ3hCLFlBQUFBLFFBQU8sY0FBYyxLQUFLO0FBQUEsY0FDeEIsWUFBWSxZQUFZRyxXQUFVLENBQUM7QUFBQSxjQUNuQyxRQUFRO0FBQUEsWUFDVixDQUFDO0FBQ0QsWUFBQUgsUUFBTyxlQUFlQSxRQUFPLGdCQUFnQjtBQUM3QyxtQkFBT0E7QUFBQSxVQUNUO0FBQUEsUUFDRixDQUFDO0FBR0Qsa0JBQVUsQ0FBQyxRQUFRLE1BQU0sR0FBRyxTQUFTLFlBQVksT0FBTztBQUN0RCxjQUFJLFdBQVcsVUFBVSxRQUFRLFVBQVU7QUFFM0Msc0JBQVksVUFBVSxVQUFVLElBQUksV0FBVztBQUM3QyxtQkFBTyxLQUFLLFFBQVEsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFBQSxVQUNwQztBQUFBLFFBQ0YsQ0FBQztBQUdELGtCQUFVLENBQUMsV0FBVyxNQUFNLEdBQUcsU0FBUyxZQUFZLE9BQU87QUFDekQsY0FBSSxXQUFXLFVBQVUsUUFBUSxLQUFLO0FBRXRDLHNCQUFZLFVBQVUsVUFBVSxJQUFJLFdBQVc7QUFDN0MsbUJBQU8sS0FBSyxlQUFlLElBQUksWUFBWSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztBQUFBLFVBQ3JFO0FBQUEsUUFDRixDQUFDO0FBRUQsb0JBQVksVUFBVSxVQUFVLFdBQVc7QUFDekMsaUJBQU8sS0FBSyxPQUFPLFFBQVE7QUFBQSxRQUM3QjtBQUVBLG9CQUFZLFVBQVUsT0FBTyxTQUFTLFdBQVc7QUFDL0MsaUJBQU8sS0FBSyxPQUFPLFNBQVMsRUFBRSxLQUFLO0FBQUEsUUFDckM7QUFFQSxvQkFBWSxVQUFVLFdBQVcsU0FBUyxXQUFXO0FBQ25ELGlCQUFPLEtBQUssUUFBUSxFQUFFLEtBQUssU0FBUztBQUFBLFFBQ3RDO0FBRUEsb0JBQVksVUFBVSxZQUFZLFNBQVMsU0FBUyxNQUFNLE1BQU07QUFDOUQsY0FBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixtQkFBTyxJQUFJLFlBQVksSUFBSTtBQUFBLFVBQzdCO0FBQ0EsaUJBQU8sS0FBSyxJQUFJLFNBQVMsT0FBTztBQUM5QixtQkFBTyxXQUFXLE9BQU8sTUFBTSxJQUFJO0FBQUEsVUFDckMsQ0FBQztBQUFBLFFBQ0gsQ0FBQztBQUVELG9CQUFZLFVBQVUsU0FBUyxTQUFTLFdBQVc7QUFDakQsaUJBQU8sS0FBSyxPQUFPLE9BQU8sWUFBWSxTQUFTLENBQUMsQ0FBQztBQUFBLFFBQ25EO0FBRUEsb0JBQVksVUFBVSxRQUFRLFNBQVNDLFFBQU9DLE1BQUs7QUFDakQsVUFBQUQsU0FBUSxVQUFVQSxNQUFLO0FBRXZCLGNBQUlELFVBQVM7QUFDYixjQUFJQSxRQUFPLGlCQUFpQkMsU0FBUSxLQUFLQyxPQUFNLElBQUk7QUFDakQsbUJBQU8sSUFBSSxZQUFZRixPQUFNO0FBQUEsVUFDL0I7QUFDQSxjQUFJQyxTQUFRLEdBQUc7QUFDYixZQUFBRCxVQUFTQSxRQUFPLFVBQVUsQ0FBQ0MsTUFBSztBQUFBLFVBQ2xDLFdBQVdBLFFBQU87QUFDaEIsWUFBQUQsVUFBU0EsUUFBTyxLQUFLQyxNQUFLO0FBQUEsVUFDNUI7QUFDQSxjQUFJQyxTQUFRNUIsWUFBVztBQUNyQixZQUFBNEIsT0FBTSxVQUFVQSxJQUFHO0FBQ25CLFlBQUFGLFVBQVNFLE9BQU0sSUFBSUYsUUFBTyxVQUFVLENBQUNFLElBQUcsSUFBSUYsUUFBTyxLQUFLRSxPQUFNRCxNQUFLO0FBQUEsVUFDckU7QUFDQSxpQkFBT0Q7QUFBQSxRQUNUO0FBRUEsb0JBQVksVUFBVSxpQkFBaUIsU0FBUyxXQUFXO0FBQ3pELGlCQUFPLEtBQUssUUFBUSxFQUFFLFVBQVUsU0FBUyxFQUFFLFFBQVE7QUFBQSxRQUNyRDtBQUVBLG9CQUFZLFVBQVUsVUFBVSxXQUFXO0FBQ3pDLGlCQUFPLEtBQUssS0FBSyxnQkFBZ0I7QUFBQSxRQUNuQztBQUdBLG1CQUFXLFlBQVksV0FBVyxTQUFTLE1BQU0sWUFBWTtBQUMzRCxjQUFJLGdCQUFnQixxQ0FBcUMsS0FBSyxVQUFVLEdBQ3BFLFVBQVUsa0JBQWtCLEtBQUssVUFBVSxHQUMzQyxhQUFhLE9BQU8sVUFBVyxVQUFVLGNBQWMsU0FBUyxVQUFVLE1BQU8sVUFBVSxHQUMzRixlQUFlLFdBQVcsUUFBUSxLQUFLLFVBQVU7QUFFckQsY0FBSSxDQUFDLFlBQVk7QUFDZjtBQUFBLFVBQ0Y7QUFDQSxpQkFBTyxVQUFVLFVBQVUsSUFBSSxXQUFXO0FBQ3hDLGdCQUFJLFFBQVEsS0FBSyxhQUNiLE9BQU8sVUFBVSxDQUFDLENBQUMsSUFBSSxXQUN2QixTQUFTLGlCQUFpQixhQUMxQkcsWUFBVyxLQUFLLENBQUMsR0FDakIsVUFBVSxVQUFVLFFBQVEsS0FBSztBQUVyQyxnQkFBSSxjQUFjLFNBQVN1RCxRQUFPO0FBQ2hDLGtCQUFJMUQsVUFBUyxXQUFXLE1BQU0sUUFBUSxVQUFVLENBQUMwRCxNQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzlELHFCQUFRLFdBQVcsV0FBWTFELFFBQU8sQ0FBQyxJQUFJQTtBQUFBLFlBQzdDO0FBRUEsZ0JBQUksV0FBVyxpQkFBaUIsT0FBT0csYUFBWSxjQUFjQSxVQUFTLFVBQVUsR0FBRztBQUVyRix1QkFBUyxVQUFVO0FBQUEsWUFDckI7QUFDQSxnQkFBSSxXQUFXLEtBQUssV0FDaEIsV0FBVyxDQUFDLENBQUMsS0FBSyxZQUFZLFFBQzlCLGNBQWMsZ0JBQWdCLENBQUMsVUFDL0IsV0FBVyxVQUFVLENBQUM7QUFFMUIsZ0JBQUksQ0FBQyxnQkFBZ0IsU0FBUztBQUM1QixzQkFBUSxXQUFXLFFBQVEsSUFBSSxZQUFZLElBQUk7QUFDL0Msa0JBQUlILFVBQVMsS0FBSyxNQUFNLE9BQU8sSUFBSTtBQUNuQyxjQUFBQSxRQUFPLFlBQVksS0FBSyxFQUFFLFFBQVEsTUFBTSxRQUFRLENBQUMsV0FBVyxHQUFHLFdBQVcxQixXQUFVLENBQUM7QUFDckYscUJBQU8sSUFBSSxjQUFjMEIsU0FBUSxRQUFRO0FBQUEsWUFDM0M7QUFDQSxnQkFBSSxlQUFlLFVBQVU7QUFDM0IscUJBQU8sS0FBSyxNQUFNLE1BQU0sSUFBSTtBQUFBLFlBQzlCO0FBQ0EsWUFBQUEsVUFBUyxLQUFLLEtBQUssV0FBVztBQUM5QixtQkFBTyxjQUFlLFVBQVVBLFFBQU8sTUFBTSxFQUFFLENBQUMsSUFBSUEsUUFBTyxNQUFNLElBQUtBO0FBQUEsVUFDeEU7QUFBQSxRQUNGLENBQUM7QUFHRCxrQkFBVSxDQUFDLE9BQU8sUUFBUSxTQUFTLFFBQVEsVUFBVSxTQUFTLEdBQUcsU0FBUyxZQUFZO0FBQ3BGLGNBQUksT0FBTyxXQUFXLFVBQVUsR0FDNUIsWUFBWSwwQkFBMEIsS0FBSyxVQUFVLElBQUksUUFBUSxRQUNqRSxlQUFlLGtCQUFrQixLQUFLLFVBQVU7QUFFcEQsaUJBQU8sVUFBVSxVQUFVLElBQUksV0FBVztBQUN4QyxnQkFBSSxPQUFPO0FBQ1gsZ0JBQUksZ0JBQWdCLENBQUMsS0FBSyxXQUFXO0FBQ25DLGtCQUFJLFFBQVEsS0FBSyxNQUFNO0FBQ3ZCLHFCQUFPLEtBQUssTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRLENBQUMsR0FBRyxJQUFJO0FBQUEsWUFDckQ7QUFDQSxtQkFBTyxLQUFLLFNBQVMsRUFBRSxTQUFTMEQsUUFBTztBQUNyQyxxQkFBTyxLQUFLLE1BQU0sUUFBUUEsTUFBSyxJQUFJQSxTQUFRLENBQUMsR0FBRyxJQUFJO0FBQUEsWUFDckQsQ0FBQztBQUFBLFVBQ0g7QUFBQSxRQUNGLENBQUM7QUFHRCxtQkFBVyxZQUFZLFdBQVcsU0FBUyxNQUFNLFlBQVk7QUFDM0QsY0FBSSxhQUFhLE9BQU8sVUFBVTtBQUNsQyxjQUFJLFlBQVk7QUFDZCxnQkFBSSxNQUFNLFdBQVcsT0FBTztBQUM1QixnQkFBSSxDQUFDbkUsZ0JBQWUsS0FBSyxXQUFXLEdBQUcsR0FBRztBQUN4Qyx3QkFBVSxHQUFHLElBQUksQ0FBQztBQUFBLFlBQ3BCO0FBQ0Esc0JBQVUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLFlBQVksUUFBUSxXQUFXLENBQUM7QUFBQSxVQUNoRTtBQUFBLFFBQ0YsQ0FBQztBQUVELGtCQUFVLGFBQWFqQixZQUFXLGtCQUFrQixFQUFFLElBQUksSUFBSSxDQUFDO0FBQUEsVUFDN0QsUUFBUTtBQUFBLFVBQ1IsUUFBUUE7QUFBQSxRQUNWLENBQUM7QUFHRCxvQkFBWSxVQUFVLFFBQVE7QUFDOUIsb0JBQVksVUFBVSxVQUFVO0FBQ2hDLG9CQUFZLFVBQVUsUUFBUTtBQUc5QixlQUFPLFVBQVUsS0FBSztBQUN0QixlQUFPLFVBQVUsUUFBUTtBQUN6QixlQUFPLFVBQVUsU0FBUztBQUMxQixlQUFPLFVBQVUsT0FBTztBQUN4QixlQUFPLFVBQVUsUUFBUTtBQUN6QixlQUFPLFVBQVUsVUFBVTtBQUMzQixlQUFPLFVBQVUsU0FBUyxPQUFPLFVBQVUsVUFBVSxPQUFPLFVBQVUsUUFBUTtBQUc5RSxlQUFPLFVBQVUsUUFBUSxPQUFPLFVBQVU7QUFFMUMsWUFBSSxhQUFhO0FBQ2YsaUJBQU8sVUFBVSxXQUFXLElBQUk7QUFBQSxRQUNsQztBQUNBLGVBQU87QUFBQSxNQUNUO0FBS0EsVUFBSSxJQUFJLGFBQWE7QUFHckIsVUFBSSxPQUFPLFVBQVUsY0FBYyxPQUFPLE9BQU8sT0FBTyxZQUFZLE9BQU8sS0FBSztBQUs5RSxhQUFLLElBQUk7QUFJVCxlQUFPLFdBQVc7QUFDaEIsaUJBQU87QUFBQSxRQUNULENBQUM7QUFBQSxNQUNILFdBRVMsWUFBWTtBQUVuQixTQUFDLFdBQVcsVUFBVSxHQUFHLElBQUk7QUFFN0Isb0JBQVksSUFBSTtBQUFBLE1BQ2xCLE9BQ0s7QUFFSCxhQUFLLElBQUk7QUFBQSxNQUNYO0FBQUEsSUFDRixHQUFFLEtBQUssT0FBSTtBQUFBO0FBQUE7OztBQ3R6aEJYLFNBQVMsV0FBVyxTQUFTO0FBQzNCLE9BQUssVUFBVTtBQUNqQjtBQUVBLFdBQVcsWUFBWTtBQUFBLEVBQ3JCLGFBQWE7QUFBQSxFQUViLE1BQU0sU0FBUyxLQUFLO0FBQ2xCLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLFFBQVEsS0FBSztBQUM1QyxVQUFJLEtBQUssUUFBUSxDQUFDLE1BQU07QUFBSyxlQUFPO0FBQ3RDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxLQUFLLFNBQVMsS0FBSztBQUNqQixRQUFJcUYsU0FBUSxLQUFLLEtBQUssR0FBRztBQUN6QixXQUFPQSxVQUFTLEtBQUssU0FBWSxLQUFLLFFBQVFBLFNBQVEsQ0FBQztBQUFBLEVBQ3pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLFFBQVEsU0FBUyxLQUFLLE9BQU8sUUFBUTtBQUNuQyxRQUFJQyxRQUFPLFVBQVUsVUFBVSxNQUFNLEtBQUssT0FBTyxNQUFNLElBQUk7QUFDM0QsUUFBSUQsU0FBUUMsTUFBSyxLQUFLLEdBQUcsR0FBRyxVQUFVQSxNQUFLLFFBQVEsTUFBTTtBQUN6RCxRQUFJRCxVQUFTLElBQUk7QUFDZixjQUFRLEtBQUssVUFBVSxLQUFLLEtBQUs7QUFBQSxJQUNuQyxPQUFPO0FBQ0wsY0FBUUEsU0FBUSxDQUFDLElBQUk7QUFDckIsVUFBSTtBQUFRLGdCQUFRQSxNQUFLLElBQUk7QUFBQSxJQUMvQjtBQUNBLFdBQU8sSUFBSSxXQUFXLE9BQU87QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQSxFQUlBLFFBQVEsU0FBUyxLQUFLO0FBQ3BCLFFBQUlBLFNBQVEsS0FBSyxLQUFLLEdBQUc7QUFDekIsUUFBSUEsVUFBUztBQUFJLGFBQU87QUFDeEIsUUFBSSxVQUFVLEtBQUssUUFBUSxNQUFNO0FBQ2pDLFlBQVEsT0FBT0EsUUFBTyxDQUFDO0FBQ3ZCLFdBQU8sSUFBSSxXQUFXLE9BQU87QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQSxFQUlBLFlBQVksU0FBUyxLQUFLLE9BQU87QUFDL0IsV0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEtBQUssRUFBRSxPQUFPLEtBQUssT0FBTyxHQUFHLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUEsRUFJQSxVQUFVLFNBQVMsS0FBSyxPQUFPO0FBQzdCLFFBQUksVUFBVSxLQUFLLE9BQU8sR0FBRyxFQUFFLFFBQVEsTUFBTTtBQUM3QyxZQUFRLEtBQUssS0FBSyxLQUFLO0FBQ3ZCLFdBQU8sSUFBSSxXQUFXLE9BQU87QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsV0FBVyxTQUFTLE9BQU8sS0FBSyxPQUFPO0FBQ3JDLFFBQUksVUFBVSxLQUFLLE9BQU8sR0FBRyxHQUFHLFVBQVUsUUFBUSxRQUFRLE1BQU07QUFDaEUsUUFBSUEsU0FBUSxRQUFRLEtBQUssS0FBSztBQUM5QixZQUFRLE9BQU9BLFVBQVMsS0FBSyxRQUFRLFNBQVNBLFFBQU8sR0FBRyxLQUFLLEtBQUs7QUFDbEUsV0FBTyxJQUFJLFdBQVcsT0FBTztBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxTQUFTLFNBQVMsR0FBRztBQUNuQixhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxRQUFRLEtBQUs7QUFDNUMsUUFBRSxLQUFLLFFBQVEsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQztBQUFBLEVBQzFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxTQUFTLFNBQVNFLE1BQUs7QUFDckIsSUFBQUEsT0FBTSxXQUFXLEtBQUtBLElBQUc7QUFDekIsUUFBSSxDQUFDQSxLQUFJO0FBQU0sYUFBTztBQUN0QixXQUFPLElBQUksV0FBV0EsS0FBSSxRQUFRLE9BQU8sS0FBSyxTQUFTQSxJQUFHLEVBQUUsT0FBTyxDQUFDO0FBQUEsRUFDdEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFFBQVEsU0FBU0EsTUFBSztBQUNwQixJQUFBQSxPQUFNLFdBQVcsS0FBS0EsSUFBRztBQUN6QixRQUFJLENBQUNBLEtBQUk7QUFBTSxhQUFPO0FBQ3RCLFdBQU8sSUFBSSxXQUFXLEtBQUssU0FBU0EsSUFBRyxFQUFFLFFBQVEsT0FBT0EsS0FBSSxPQUFPLENBQUM7QUFBQSxFQUN0RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsVUFBVSxTQUFTQSxNQUFLO0FBQ3RCLFFBQUksU0FBUztBQUNiLElBQUFBLE9BQU0sV0FBVyxLQUFLQSxJQUFHO0FBQ3pCLGFBQVMsSUFBSSxHQUFHLElBQUlBLEtBQUksUUFBUSxRQUFRLEtBQUs7QUFDM0MsZUFBUyxPQUFPLE9BQU9BLEtBQUksUUFBUSxDQUFDLENBQUM7QUFDdkMsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUEsRUFJQSxVQUFVLFdBQVc7QUFDbkIsUUFBSSxTQUFTLENBQUM7QUFDZCxTQUFLLFFBQVEsU0FBUyxLQUFLLE9BQU87QUFBRSxhQUFPLEdBQUcsSUFBSTtBQUFBLElBQU8sQ0FBQztBQUMxRCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksT0FBTztBQUNULFdBQU8sS0FBSyxRQUFRLFVBQVU7QUFBQSxFQUNoQztBQUNGO0FBTUEsV0FBVyxPQUFPLFNBQVMsT0FBTztBQUNoQyxNQUFJLGlCQUFpQjtBQUFZLFdBQU87QUFDeEMsTUFBSSxVQUFVLENBQUM7QUFDZixNQUFJO0FBQU8sYUFBUyxRQUFRO0FBQU8sY0FBUSxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUM7QUFDakUsU0FBTyxJQUFJLFdBQVcsT0FBTztBQUMvQjtBQUVBLElBQU8sZUFBUTs7O0FDdElmLFNBQVMsY0FBYyxHQUFHLEdBQUcsS0FBSztBQUM5QixXQUFTLElBQUksS0FBSSxLQUFLO0FBQ2xCLFFBQUksS0FBSyxFQUFFLGNBQWMsS0FBSyxFQUFFO0FBQzVCLGFBQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxPQUFPO0FBQ2pELFFBQUksU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLFNBQVMsRUFBRSxNQUFNLENBQUM7QUFDM0MsUUFBSSxVQUFVLFFBQVE7QUFDbEIsYUFBTyxPQUFPO0FBQ2Q7QUFBQSxJQUNKO0FBQ0EsUUFBSSxDQUFDLE9BQU8sV0FBVyxNQUFNO0FBQ3pCLGFBQU87QUFDWCxRQUFJLE9BQU8sVUFBVSxPQUFPLFFBQVEsT0FBTyxNQUFNO0FBQzdDLGVBQVMsSUFBSSxHQUFHLE9BQU8sS0FBSyxDQUFDLEtBQUssT0FBTyxLQUFLLENBQUMsR0FBRztBQUM5QztBQUNKLGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSSxPQUFPLFFBQVEsUUFBUSxPQUFPLFFBQVEsTUFBTTtBQUM1QyxVQUFJLFFBQVEsY0FBYyxPQUFPLFNBQVMsT0FBTyxTQUFTLE1BQU0sQ0FBQztBQUNqRSxVQUFJLFNBQVM7QUFDVCxlQUFPO0FBQUEsSUFDZjtBQUNBLFdBQU8sT0FBTztBQUFBLEVBQ2xCO0FBQ0o7QUFDQSxTQUFTLFlBQVksR0FBRyxHQUFHLE1BQU0sTUFBTTtBQUNuQyxXQUFTLEtBQUssRUFBRSxZQUFZLEtBQUssRUFBRSxnQkFBYztBQUM3QyxRQUFJLE1BQU0sS0FBSyxNQUFNO0FBQ2pCLGFBQU8sTUFBTSxLQUFLLE9BQU8sRUFBRSxHQUFHLE1BQU0sR0FBRyxLQUFLO0FBQ2hELFFBQUksU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsT0FBTyxPQUFPO0FBQ2xFLFFBQUksVUFBVSxRQUFRO0FBQ2xCLGNBQVE7QUFDUixjQUFRO0FBQ1I7QUFBQSxJQUNKO0FBQ0EsUUFBSSxDQUFDLE9BQU8sV0FBVyxNQUFNO0FBQ3pCLGFBQU8sRUFBRSxHQUFHLE1BQU0sR0FBRyxLQUFLO0FBQzlCLFFBQUksT0FBTyxVQUFVLE9BQU8sUUFBUSxPQUFPLE1BQU07QUFDN0MsVUFBSSxPQUFPLEdBQUcsVUFBVSxLQUFLLElBQUksT0FBTyxLQUFLLFFBQVEsT0FBTyxLQUFLLE1BQU07QUFDdkUsYUFBTyxPQUFPLFdBQVcsT0FBTyxLQUFLLE9BQU8sS0FBSyxTQUFTLE9BQU8sQ0FBQyxLQUFLLE9BQU8sS0FBSyxPQUFPLEtBQUssU0FBUyxPQUFPLENBQUMsR0FBRztBQUMvRztBQUNBO0FBQ0E7QUFBQSxNQUNKO0FBQ0EsYUFBTyxFQUFFLEdBQUcsTUFBTSxHQUFHLEtBQUs7QUFBQSxJQUM5QjtBQUNBLFFBQUksT0FBTyxRQUFRLFFBQVEsT0FBTyxRQUFRLE1BQU07QUFDNUMsVUFBSSxRQUFRLFlBQVksT0FBTyxTQUFTLE9BQU8sU0FBUyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzFFLFVBQUk7QUFDQSxlQUFPO0FBQUEsSUFDZjtBQUNBLFlBQVE7QUFDUixZQUFRO0FBQUEsRUFDWjtBQUNKO0FBU0EsSUFBTSxXQUFOLE1BQU0sVUFBUztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVgsWUFJQSxTQUFTLE1BQU07QUFDWCxTQUFLLFVBQVU7QUFDZixTQUFLLE9BQU8sUUFBUTtBQUNwQixRQUFJLFFBQVE7QUFDUixlQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUTtBQUNoQyxhQUFLLFFBQVEsUUFBUSxDQUFDLEVBQUU7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLGFBQWFDLE9BQU0sSUFBSSxHQUFHLFlBQVksR0FBRyxRQUFRO0FBQzdDLGFBQVMsSUFBSSxHQUFHLE1BQU0sR0FBRyxNQUFNLElBQUksS0FBSztBQUNwQyxVQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsR0FBR0MsT0FBTSxNQUFNLE1BQU07QUFDL0MsVUFBSUEsT0FBTUQsU0FBUSxFQUFFLE9BQU8sWUFBWSxLQUFLLFVBQVUsTUFBTSxDQUFDLE1BQU0sU0FBUyxNQUFNLFFBQVEsTUFBTTtBQUM1RixZQUFJRSxTQUFRLE1BQU07QUFDbEIsY0FBTSxhQUFhLEtBQUssSUFBSSxHQUFHRixRQUFPRSxNQUFLLEdBQUcsS0FBSyxJQUFJLE1BQU0sUUFBUSxNQUFNLEtBQUtBLE1BQUssR0FBRyxHQUFHLFlBQVlBLE1BQUs7QUFBQSxNQUNoSDtBQUNBLFlBQU1EO0FBQUEsSUFDVjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxZQUFZLEdBQUc7QUFDWCxTQUFLLGFBQWEsR0FBRyxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3JDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFlBQVlELE9BQU0sSUFBSSxnQkFBZ0IsVUFBVTtBQUM1QyxRQUFJLE9BQU8sSUFBSSxZQUFZO0FBQzNCLFNBQUssYUFBYUEsT0FBTSxJQUFJLENBQUMsTUFBTSxRQUFRO0FBQ3ZDLFVBQUksS0FBSyxRQUFRO0FBQ2IsZ0JBQVEsS0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFJQSxPQUFNLEdBQUcsSUFBSSxLQUFLLEtBQUssR0FBRztBQUMzRCxvQkFBWSxDQUFDO0FBQUEsTUFDakIsV0FDUyxLQUFLLFFBQVE7QUFDbEIsWUFBSSxVQUFVO0FBQ1Ysa0JBQVEsT0FBTyxhQUFhLGFBQWEsU0FBUyxJQUFJLElBQUk7QUFBQSxRQUM5RCxXQUNTLEtBQUssS0FBSyxLQUFLLFVBQVU7QUFDOUIsa0JBQVEsS0FBSyxLQUFLLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFDeEM7QUFDQSxvQkFBWSxDQUFDO0FBQUEsTUFDakIsV0FDUyxDQUFDLGFBQWEsS0FBSyxTQUFTO0FBQ2pDLGdCQUFRO0FBQ1Isb0JBQVk7QUFBQSxNQUNoQjtBQUFBLElBQ0osR0FBRyxDQUFDO0FBQ0osV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxPQUFPO0FBQ1YsUUFBSSxDQUFDLE1BQU07QUFDUCxhQUFPO0FBQ1gsUUFBSSxDQUFDLEtBQUs7QUFDTixhQUFPO0FBQ1gsUUFBSSxPQUFPLEtBQUssV0FBV0csU0FBUSxNQUFNLFlBQVksVUFBVSxLQUFLLFFBQVEsTUFBTSxHQUFHLElBQUk7QUFDekYsUUFBSSxLQUFLLFVBQVUsS0FBSyxXQUFXQSxNQUFLLEdBQUc7QUFDdkMsY0FBUSxRQUFRLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxLQUFLLE9BQU9BLE9BQU0sSUFBSTtBQUNsRSxVQUFJO0FBQUEsSUFDUjtBQUNBLFdBQU8sSUFBSSxNQUFNLFFBQVEsUUFBUTtBQUM3QixjQUFRLEtBQUssTUFBTSxRQUFRLENBQUMsQ0FBQztBQUNqQyxXQUFPLElBQUksVUFBUyxTQUFTLEtBQUssT0FBTyxNQUFNLElBQUk7QUFBQSxFQUN2RDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsSUFBSUgsT0FBTSxLQUFLLEtBQUssTUFBTTtBQUN0QixRQUFJQSxTQUFRLEtBQUssTUFBTSxLQUFLO0FBQ3hCLGFBQU87QUFDWCxRQUFJLFNBQVMsQ0FBQyxHQUFHLE9BQU87QUFDeEIsUUFBSSxLQUFLQTtBQUNMLGVBQVMsSUFBSSxHQUFHLE1BQU0sR0FBRyxNQUFNLElBQUksS0FBSztBQUNwQyxZQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsR0FBR0MsT0FBTSxNQUFNLE1BQU07QUFDL0MsWUFBSUEsT0FBTUQsT0FBTTtBQUNaLGNBQUksTUFBTUEsU0FBUUMsT0FBTSxJQUFJO0FBQ3hCLGdCQUFJLE1BQU07QUFDTixzQkFBUSxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUdELFFBQU8sR0FBRyxHQUFHLEtBQUssSUFBSSxNQUFNLEtBQUssUUFBUSxLQUFLLEdBQUcsQ0FBQztBQUFBO0FBRWhGLHNCQUFRLE1BQU0sSUFBSSxLQUFLLElBQUksR0FBR0EsUUFBTyxNQUFNLENBQUMsR0FBRyxLQUFLLElBQUksTUFBTSxRQUFRLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQztBQUFBLFVBQ2pHO0FBQ0EsaUJBQU8sS0FBSyxLQUFLO0FBQ2pCLGtCQUFRLE1BQU07QUFBQSxRQUNsQjtBQUNBLGNBQU1DO0FBQUEsTUFDVjtBQUNKLFdBQU8sSUFBSSxVQUFTLFFBQVEsSUFBSTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxXQUFXRCxPQUFNLElBQUk7QUFDakIsUUFBSUEsU0FBUTtBQUNSLGFBQU8sVUFBUztBQUNwQixRQUFJQSxTQUFRLEtBQUssTUFBTSxLQUFLLFFBQVE7QUFDaEMsYUFBTztBQUNYLFdBQU8sSUFBSSxVQUFTLEtBQUssUUFBUSxNQUFNQSxPQUFNLEVBQUUsQ0FBQztBQUFBLEVBQ3BEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGFBQWEsT0FBTyxNQUFNO0FBQ3RCLFFBQUksVUFBVSxLQUFLLFFBQVEsS0FBSztBQUNoQyxRQUFJLFdBQVc7QUFDWCxhQUFPO0FBQ1gsUUFBSUksUUFBTyxLQUFLLFFBQVEsTUFBTTtBQUM5QixRQUFJLE9BQU8sS0FBSyxPQUFPLEtBQUssV0FBVyxRQUFRO0FBQy9DLElBQUFBLE1BQUssS0FBSyxJQUFJO0FBQ2QsV0FBTyxJQUFJLFVBQVNBLE9BQU0sSUFBSTtBQUFBLEVBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQVcsTUFBTTtBQUNiLFdBQU8sSUFBSSxVQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxPQUFPLEdBQUcsS0FBSyxPQUFPLEtBQUssUUFBUTtBQUFBLEVBQzlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFNBQVMsTUFBTTtBQUNYLFdBQU8sSUFBSSxVQUFTLEtBQUssUUFBUSxPQUFPLElBQUksR0FBRyxLQUFLLE9BQU8sS0FBSyxRQUFRO0FBQUEsRUFDNUU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLEdBQUcsT0FBTztBQUNOLFFBQUksS0FBSyxRQUFRLFVBQVUsTUFBTSxRQUFRO0FBQ3JDLGFBQU87QUFDWCxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxRQUFRO0FBQ3JDLFVBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsQ0FBQztBQUNwQyxlQUFPO0FBQ2YsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksYUFBYTtBQUFFLFdBQU8sS0FBSyxRQUFRLFNBQVMsS0FBSyxRQUFRLENBQUMsSUFBSTtBQUFBLEVBQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl4RSxJQUFJLFlBQVk7QUFBRSxXQUFPLEtBQUssUUFBUSxTQUFTLEtBQUssUUFBUSxLQUFLLFFBQVEsU0FBUyxDQUFDLElBQUk7QUFBQSxFQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJN0YsSUFBSSxhQUFhO0FBQUUsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUsvQyxNQUFNLE9BQU87QUFDVCxRQUFJQyxTQUFRLEtBQUssUUFBUSxLQUFLO0FBQzlCLFFBQUksQ0FBQ0E7QUFDRCxZQUFNLElBQUksV0FBVyxXQUFXLFFBQVEsdUJBQXVCLElBQUk7QUFDdkUsV0FBT0E7QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxXQUFXLE9BQU87QUFDZCxXQUFPLEtBQUssUUFBUSxLQUFLLEtBQUs7QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxRQUFRLEdBQUc7QUFDUCxhQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsUUFBUSxLQUFLO0FBQ2pELFVBQUksUUFBUSxLQUFLLFFBQVEsQ0FBQztBQUMxQixRQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsV0FBSyxNQUFNO0FBQUEsSUFDZjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsY0FBYyxPQUFPLE1BQU0sR0FBRztBQUMxQixXQUFPLGNBQWMsTUFBTSxPQUFPLEdBQUc7QUFBQSxFQUN6QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsWUFBWSxPQUFPLE1BQU0sS0FBSyxNQUFNLFdBQVcsTUFBTSxNQUFNO0FBQ3ZELFdBQU8sWUFBWSxNQUFNLE9BQU8sS0FBSyxRQUFRO0FBQUEsRUFDakQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxVQUFVLEtBQUtDLFNBQVEsSUFBSTtBQUN2QixRQUFJLE9BQU87QUFDUCxhQUFPLFNBQVMsR0FBRyxHQUFHO0FBQzFCLFFBQUksT0FBTyxLQUFLO0FBQ1osYUFBTyxTQUFTLEtBQUssUUFBUSxRQUFRLEdBQUc7QUFDNUMsUUFBSSxNQUFNLEtBQUssUUFBUSxNQUFNO0FBQ3pCLFlBQU0sSUFBSSxXQUFXLFlBQVksR0FBRyx5QkFBeUIsSUFBSSxHQUFHO0FBQ3hFLGFBQVMsSUFBSSxHQUFHLFNBQVMsS0FBSSxLQUFLO0FBQzlCLFVBQUksTUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHTCxPQUFNLFNBQVMsSUFBSTtBQUM1QyxVQUFJQSxRQUFPLEtBQUs7QUFDWixZQUFJQSxRQUFPLE9BQU9LLFNBQVE7QUFDdEIsaUJBQU8sU0FBUyxJQUFJLEdBQUdMLElBQUc7QUFDOUIsZUFBTyxTQUFTLEdBQUcsTUFBTTtBQUFBLE1BQzdCO0FBQ0EsZUFBU0E7QUFBQSxJQUNiO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsV0FBVztBQUFFLFdBQU8sTUFBTSxLQUFLLGNBQWMsSUFBSTtBQUFBLEVBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl0RCxnQkFBZ0I7QUFBRSxXQUFPLEtBQUssUUFBUSxLQUFLLElBQUk7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEQsU0FBUztBQUNMLFdBQU8sS0FBSyxRQUFRLFNBQVMsS0FBSyxRQUFRLElBQUksT0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sU0FBUyxRQUFRLE9BQU87QUFDM0IsUUFBSSxDQUFDO0FBQ0QsYUFBTyxVQUFTO0FBQ3BCLFFBQUksQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUNwQixZQUFNLElBQUksV0FBVyxxQ0FBcUM7QUFDOUQsV0FBTyxJQUFJLFVBQVMsTUFBTSxJQUFJLE9BQU8sWUFBWSxDQUFDO0FBQUEsRUFDdEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxVQUFVLE9BQU87QUFDcEIsUUFBSSxDQUFDLE1BQU07QUFDUCxhQUFPLFVBQVM7QUFDcEIsUUFBSSxRQUFRLE9BQU87QUFDbkIsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxVQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLGNBQVEsS0FBSztBQUNiLFVBQUksS0FBSyxLQUFLLFVBQVUsTUFBTSxJQUFJLENBQUMsRUFBRSxXQUFXLElBQUksR0FBRztBQUNuRCxZQUFJLENBQUM7QUFDRCxtQkFBUyxNQUFNLE1BQU0sR0FBRyxDQUFDO0FBQzdCLGVBQU8sT0FBTyxTQUFTLENBQUMsSUFBSSxLQUN2QixTQUFTLE9BQU8sT0FBTyxTQUFTLENBQUMsRUFBRSxPQUFPLEtBQUssSUFBSTtBQUFBLE1BQzVELFdBQ1MsUUFBUTtBQUNiLGVBQU8sS0FBSyxJQUFJO0FBQUEsTUFDcEI7QUFBQSxJQUNKO0FBQ0EsV0FBTyxJQUFJLFVBQVMsVUFBVSxPQUFPLElBQUk7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxLQUFLLE9BQU87QUFDZixRQUFJLENBQUM7QUFDRCxhQUFPLFVBQVM7QUFDcEIsUUFBSSxpQkFBaUI7QUFDakIsYUFBTztBQUNYLFFBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkIsYUFBTyxLQUFLLFVBQVUsS0FBSztBQUMvQixRQUFJLE1BQU07QUFDTixhQUFPLElBQUksVUFBUyxDQUFDLEtBQUssR0FBRyxNQUFNLFFBQVE7QUFDL0MsVUFBTSxJQUFJLFdBQVcscUJBQXFCLFFBQVEsb0JBQzdDLE1BQU0sZUFBZSxxRUFBcUUsR0FBRztBQUFBLEVBQ3RHO0FBQ0o7QUFNQSxTQUFTLFFBQVEsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDO0FBQ25DLElBQU0sUUFBUSxFQUFFLE9BQU8sR0FBRyxRQUFRLEVBQUU7QUFDcEMsU0FBUyxTQUFTLE9BQU9NLFNBQVE7QUFDN0IsUUFBTSxRQUFRO0FBQ2QsUUFBTSxTQUFTQTtBQUNmLFNBQU87QUFDWDtBQUVBLFNBQVMsWUFBWSxHQUFHLEdBQUc7QUFDdkIsTUFBSSxNQUFNO0FBQ04sV0FBTztBQUNYLE1BQUksRUFBRSxLQUFLLE9BQU8sS0FBSyxhQUNuQixFQUFFLEtBQUssT0FBTyxLQUFLO0FBQ25CLFdBQU87QUFDWCxNQUFJLFFBQVEsTUFBTSxRQUFRLENBQUM7QUFDM0IsTUFBSSxNQUFNLFFBQVEsQ0FBQyxLQUFLO0FBQ3BCLFdBQU87QUFDWCxNQUFJLE9BQU87QUFDUCxRQUFJLEVBQUUsVUFBVSxFQUFFO0FBQ2QsYUFBTztBQUNYLGFBQVMsSUFBSSxHQUFHLElBQUksRUFBRSxRQUFRO0FBQzFCLFVBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLGVBQU87QUFBQSxFQUNuQixPQUNLO0FBQ0QsYUFBUyxLQUFLO0FBQ1YsVUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDcEMsZUFBTztBQUNmLGFBQVMsS0FBSztBQUNWLFVBQUksRUFBRSxLQUFLO0FBQ1AsZUFBTztBQUFBLEVBQ25CO0FBQ0EsU0FBTztBQUNYO0FBVUEsSUFBTSxPQUFOLE1BQU0sTUFBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsWUFJQSxNQUlBLE9BQU87QUFDSCxTQUFLLE9BQU87QUFDWixTQUFLLFFBQVE7QUFBQSxFQUNqQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxTQUFTLEtBQUs7QUFDVixRQUFJSCxPQUFNLFNBQVM7QUFDbkIsYUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNqQyxVQUFJLFFBQVEsSUFBSSxDQUFDO0FBQ2pCLFVBQUksS0FBSyxHQUFHLEtBQUs7QUFDYixlQUFPO0FBQ1gsVUFBSSxLQUFLLEtBQUssU0FBUyxNQUFNLElBQUksR0FBRztBQUNoQyxZQUFJLENBQUNBO0FBQ0QsVUFBQUEsUUFBTyxJQUFJLE1BQU0sR0FBRyxDQUFDO0FBQUEsTUFDN0IsV0FDUyxNQUFNLEtBQUssU0FBUyxLQUFLLElBQUksR0FBRztBQUNyQyxlQUFPO0FBQUEsTUFDWCxPQUNLO0FBQ0QsWUFBSSxDQUFDLFVBQVUsTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU07QUFDN0MsY0FBSSxDQUFDQTtBQUNELFlBQUFBLFFBQU8sSUFBSSxNQUFNLEdBQUcsQ0FBQztBQUN6QixVQUFBQSxNQUFLLEtBQUssSUFBSTtBQUNkLG1CQUFTO0FBQUEsUUFDYjtBQUNBLFlBQUlBO0FBQ0EsVUFBQUEsTUFBSyxLQUFLLEtBQUs7QUFBQSxNQUN2QjtBQUFBLElBQ0o7QUFDQSxRQUFJLENBQUNBO0FBQ0QsTUFBQUEsUUFBTyxJQUFJLE1BQU07QUFDckIsUUFBSSxDQUFDO0FBQ0QsTUFBQUEsTUFBSyxLQUFLLElBQUk7QUFDbEIsV0FBT0E7QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGNBQWMsS0FBSztBQUNmLGFBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRO0FBQzVCLFVBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2QsZUFBTyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFDdEQsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFFBQVEsS0FBSztBQUNULGFBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRO0FBQzVCLFVBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2QsZUFBTztBQUNmLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLEdBQUcsT0FBTztBQUNOLFdBQU8sUUFBUSxTQUNWLEtBQUssUUFBUSxNQUFNLFFBQVEsWUFBWSxLQUFLLE9BQU8sTUFBTSxLQUFLO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFNBQVM7QUFDTCxRQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSyxLQUFLO0FBQ2pDLGFBQVMsS0FBSyxLQUFLLE9BQU87QUFDdEIsVUFBSSxRQUFRLEtBQUs7QUFDakI7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sU0FBUyxRQUFRSSxPQUFNO0FBQzFCLFFBQUksQ0FBQ0E7QUFDRCxZQUFNLElBQUksV0FBVyxpQ0FBaUM7QUFDMUQsUUFBSSxPQUFPLE9BQU8sTUFBTUEsTUFBSyxJQUFJO0FBQ2pDLFFBQUksQ0FBQztBQUNELFlBQU0sSUFBSSxXQUFXLHlCQUF5QkEsTUFBSyxJQUFJLGlCQUFpQjtBQUM1RSxXQUFPLEtBQUssT0FBT0EsTUFBSyxLQUFLO0FBQUEsRUFDakM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sUUFBUSxHQUFHLEdBQUc7QUFDakIsUUFBSSxLQUFLO0FBQ0wsYUFBTztBQUNYLFFBQUksRUFBRSxVQUFVLEVBQUU7QUFDZCxhQUFPO0FBQ1gsYUFBUyxJQUFJLEdBQUcsSUFBSSxFQUFFLFFBQVE7QUFDMUIsVUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDYixlQUFPO0FBQ2YsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxRQUFRLE9BQU87QUFDbEIsUUFBSSxDQUFDLFNBQVMsTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLFVBQVU7QUFDbEQsYUFBTyxNQUFLO0FBQ2hCLFFBQUksaUJBQWlCO0FBQ2pCLGFBQU8sQ0FBQyxLQUFLO0FBQ2pCLFFBQUlKLFFBQU8sTUFBTSxNQUFNO0FBQ3ZCLElBQUFBLE1BQUssS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssSUFBSTtBQUM3QyxXQUFPQTtBQUFBLEVBQ1g7QUFDSjtBQUlBLEtBQUssT0FBTyxDQUFDO0FBTWIsSUFBTSxlQUFOLGNBQTJCLE1BQU07QUFDakM7QUFpQkEsSUFBTSxRQUFOLE1BQU0sT0FBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYVIsWUFJQSxTQUlBLFdBSUEsU0FBUztBQUNMLFNBQUssVUFBVTtBQUNmLFNBQUssWUFBWTtBQUNqQixTQUFLLFVBQVU7QUFBQSxFQUNuQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsSUFBSSxPQUFPO0FBQ1AsV0FBTyxLQUFLLFFBQVEsT0FBTyxLQUFLLFlBQVksS0FBSztBQUFBLEVBQ3JEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxTQUFTLEtBQUssVUFBVTtBQUNwQixRQUFJLFVBQVUsV0FBVyxLQUFLLFNBQVMsTUFBTSxLQUFLLFdBQVcsUUFBUTtBQUNyRSxXQUFPLFdBQVcsSUFBSSxPQUFNLFNBQVMsS0FBSyxXQUFXLEtBQUssT0FBTztBQUFBLEVBQ3JFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxjQUFjSixPQUFNLElBQUk7QUFDcEIsV0FBTyxJQUFJLE9BQU0sWUFBWSxLQUFLLFNBQVNBLFFBQU8sS0FBSyxXQUFXLEtBQUssS0FBSyxTQUFTLEdBQUcsS0FBSyxXQUFXLEtBQUssT0FBTztBQUFBLEVBQ3hIO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxHQUFHLE9BQU87QUFDTixXQUFPLEtBQUssUUFBUSxHQUFHLE1BQU0sT0FBTyxLQUFLLEtBQUssYUFBYSxNQUFNLGFBQWEsS0FBSyxXQUFXLE1BQU07QUFBQSxFQUN4RztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsV0FBVztBQUNQLFdBQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVO0FBQUEsRUFDdEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFNBQVM7QUFDTCxRQUFJLENBQUMsS0FBSyxRQUFRO0FBQ2QsYUFBTztBQUNYLFFBQUlRLFFBQU8sRUFBRSxTQUFTLEtBQUssUUFBUSxPQUFPLEVBQUU7QUFDNUMsUUFBSSxLQUFLLFlBQVk7QUFDakIsTUFBQUEsTUFBSyxZQUFZLEtBQUs7QUFDMUIsUUFBSSxLQUFLLFVBQVU7QUFDZixNQUFBQSxNQUFLLFVBQVUsS0FBSztBQUN4QixXQUFPQTtBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sU0FBUyxRQUFRQSxPQUFNO0FBQzFCLFFBQUksQ0FBQ0E7QUFDRCxhQUFPLE9BQU07QUFDakIsUUFBSSxZQUFZQSxNQUFLLGFBQWEsR0FBRyxVQUFVQSxNQUFLLFdBQVc7QUFDL0QsUUFBSSxPQUFPLGFBQWEsWUFBWSxPQUFPLFdBQVc7QUFDbEQsWUFBTSxJQUFJLFdBQVcsa0NBQWtDO0FBQzNELFdBQU8sSUFBSSxPQUFNLFNBQVMsU0FBUyxRQUFRQSxNQUFLLE9BQU8sR0FBRyxXQUFXLE9BQU87QUFBQSxFQUNoRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFPLFFBQVEsVUFBVSxnQkFBZ0IsTUFBTTtBQUMzQyxRQUFJLFlBQVksR0FBRyxVQUFVO0FBQzdCLGFBQVMsSUFBSSxTQUFTLFlBQVksS0FBSyxDQUFDLEVBQUUsV0FBVyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssS0FBSyxZQUFZLElBQUksRUFBRTtBQUNqRztBQUNKLGFBQVMsSUFBSSxTQUFTLFdBQVcsS0FBSyxDQUFDLEVBQUUsV0FBVyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssS0FBSyxZQUFZLElBQUksRUFBRTtBQUNoRztBQUNKLFdBQU8sSUFBSSxPQUFNLFVBQVUsV0FBVyxPQUFPO0FBQUEsRUFDakQ7QUFDSjtBQUlBLE1BQU0sUUFBUSxJQUFJLE1BQU0sU0FBUyxPQUFPLEdBQUcsQ0FBQztBQUM1QyxTQUFTLFlBQVksU0FBU1IsT0FBTSxJQUFJO0FBQ3BDLE1BQUksRUFBRSxPQUFPLFFBQUFPLFFBQU8sSUFBSSxRQUFRLFVBQVVQLEtBQUksR0FBRyxRQUFRLFFBQVEsV0FBVyxLQUFLO0FBQ2pGLE1BQUksRUFBRSxPQUFPLFNBQVMsUUFBUSxTQUFTLElBQUksUUFBUSxVQUFVLEVBQUU7QUFDL0QsTUFBSU8sV0FBVVAsU0FBUSxNQUFNLFFBQVE7QUFDaEMsUUFBSSxZQUFZLE1BQU0sQ0FBQyxRQUFRLE1BQU0sT0FBTyxFQUFFO0FBQzFDLFlBQU0sSUFBSSxXQUFXLHlCQUF5QjtBQUNsRCxXQUFPLFFBQVEsSUFBSSxHQUFHQSxLQUFJLEVBQUUsT0FBTyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQUEsRUFDdEQ7QUFDQSxNQUFJLFNBQVM7QUFDVCxVQUFNLElBQUksV0FBVyx5QkFBeUI7QUFDbEQsU0FBTyxRQUFRLGFBQWEsT0FBTyxNQUFNLEtBQUssWUFBWSxNQUFNLFNBQVNBLFFBQU9PLFVBQVMsR0FBRyxLQUFLQSxVQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2pIO0FBQ0EsU0FBUyxXQUFXLFNBQVMsTUFBTSxRQUFRLFFBQVE7QUFDL0MsTUFBSSxFQUFFLE9BQU8sUUFBQUEsUUFBTyxJQUFJLFFBQVEsVUFBVSxJQUFJLEdBQUcsUUFBUSxRQUFRLFdBQVcsS0FBSztBQUNqRixNQUFJQSxXQUFVLFFBQVEsTUFBTSxRQUFRO0FBQ2hDLFFBQUksVUFBVSxDQUFDLE9BQU8sV0FBVyxPQUFPLE9BQU8sTUFBTTtBQUNqRCxhQUFPO0FBQ1gsV0FBTyxRQUFRLElBQUksR0FBRyxJQUFJLEVBQUUsT0FBTyxNQUFNLEVBQUUsT0FBTyxRQUFRLElBQUksSUFBSSxDQUFDO0FBQUEsRUFDdkU7QUFDQSxNQUFJLFFBQVEsV0FBVyxNQUFNLFNBQVMsT0FBT0EsVUFBUyxHQUFHLE1BQU07QUFDL0QsU0FBTyxTQUFTLFFBQVEsYUFBYSxPQUFPLE1BQU0sS0FBSyxLQUFLLENBQUM7QUFDakU7QUFDQSxTQUFTLFFBQVEsT0FBTyxLQUFLRSxRQUFPO0FBQ2hDLE1BQUlBLE9BQU0sWUFBWSxNQUFNO0FBQ3hCLFVBQU0sSUFBSSxhQUFhLGlEQUFpRDtBQUM1RSxNQUFJLE1BQU0sUUFBUUEsT0FBTSxhQUFhLElBQUksUUFBUUEsT0FBTTtBQUNuRCxVQUFNLElBQUksYUFBYSwwQkFBMEI7QUFDckQsU0FBTyxhQUFhLE9BQU8sS0FBS0EsUUFBTyxDQUFDO0FBQzVDO0FBQ0EsU0FBUyxhQUFhLE9BQU8sS0FBS0EsUUFBTyxPQUFPO0FBQzVDLE1BQUksUUFBUSxNQUFNLE1BQU0sS0FBSyxHQUFHLE9BQU8sTUFBTSxLQUFLLEtBQUs7QUFDdkQsTUFBSSxTQUFTLElBQUksTUFBTSxLQUFLLEtBQUssUUFBUSxNQUFNLFFBQVFBLE9BQU0sV0FBVztBQUNwRSxRQUFJLFFBQVEsYUFBYSxPQUFPLEtBQUtBLFFBQU8sUUFBUSxDQUFDO0FBQ3JELFdBQU8sS0FBSyxLQUFLLEtBQUssUUFBUSxhQUFhLE9BQU8sS0FBSyxDQUFDO0FBQUEsRUFDNUQsV0FDUyxDQUFDQSxPQUFNLFFBQVEsTUFBTTtBQUMxQixXQUFPLE1BQU0sTUFBTSxjQUFjLE9BQU8sS0FBSyxLQUFLLENBQUM7QUFBQSxFQUN2RCxXQUNTLENBQUNBLE9BQU0sYUFBYSxDQUFDQSxPQUFNLFdBQVcsTUFBTSxTQUFTLFNBQVMsSUFBSSxTQUFTLE9BQU87QUFDdkYsUUFBSSxTQUFTLE1BQU0sUUFBUSxVQUFVLE9BQU87QUFDNUMsV0FBTyxNQUFNLFFBQVEsUUFBUSxJQUFJLEdBQUcsTUFBTSxZQUFZLEVBQUUsT0FBT0EsT0FBTSxPQUFPLEVBQUUsT0FBTyxRQUFRLElBQUksSUFBSSxZQUFZLENBQUMsQ0FBQztBQUFBLEVBQ3ZILE9BQ0s7QUFDRCxRQUFJLEVBQUUsT0FBQVAsUUFBTyxLQUFBRCxLQUFJLElBQUksdUJBQXVCUSxRQUFPLEtBQUs7QUFDeEQsV0FBTyxNQUFNLE1BQU0sZ0JBQWdCLE9BQU9QLFFBQU9ELE1BQUssS0FBSyxLQUFLLENBQUM7QUFBQSxFQUNyRTtBQUNKO0FBQ0EsU0FBUyxVQUFVUyxPQUFNLEtBQUs7QUFDMUIsTUFBSSxDQUFDLElBQUksS0FBSyxrQkFBa0JBLE1BQUssSUFBSTtBQUNyQyxVQUFNLElBQUksYUFBYSxpQkFBaUIsSUFBSSxLQUFLLE9BQU8sV0FBV0EsTUFBSyxLQUFLLElBQUk7QUFDekY7QUFDQSxTQUFTLFNBQVMsU0FBUyxRQUFRLE9BQU87QUFDdEMsTUFBSSxPQUFPLFFBQVEsS0FBSyxLQUFLO0FBQzdCLFlBQVUsTUFBTSxPQUFPLEtBQUssS0FBSyxDQUFDO0FBQ2xDLFNBQU87QUFDWDtBQUNBLFNBQVMsUUFBUSxPQUFPLFFBQVE7QUFDNUIsTUFBSSxPQUFPLE9BQU8sU0FBUztBQUMzQixNQUFJLFFBQVEsS0FBSyxNQUFNLFVBQVUsTUFBTSxXQUFXLE9BQU8sSUFBSSxDQUFDO0FBQzFELFdBQU8sSUFBSSxJQUFJLE1BQU0sU0FBUyxPQUFPLElBQUksRUFBRSxPQUFPLE1BQU0sSUFBSTtBQUFBO0FBRTVELFdBQU8sS0FBSyxLQUFLO0FBQ3pCO0FBQ0EsU0FBUyxTQUFTLFFBQVEsTUFBTSxPQUFPLFFBQVE7QUFDM0MsTUFBSSxRQUFRLFFBQVEsUUFBUSxLQUFLLEtBQUs7QUFDdEMsTUFBSSxhQUFhLEdBQUcsV0FBVyxPQUFPLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSztBQUMvRCxNQUFJLFFBQVE7QUFDUixpQkFBYSxPQUFPLE1BQU0sS0FBSztBQUMvQixRQUFJLE9BQU8sUUFBUSxPQUFPO0FBQ3RCO0FBQUEsSUFDSixXQUNTLE9BQU8sWUFBWTtBQUN4QixjQUFRLE9BQU8sV0FBVyxNQUFNO0FBQ2hDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxXQUFTLElBQUksWUFBWSxJQUFJLFVBQVU7QUFDbkMsWUFBUSxLQUFLLE1BQU0sQ0FBQyxHQUFHLE1BQU07QUFDakMsTUFBSSxRQUFRLEtBQUssU0FBUyxTQUFTLEtBQUs7QUFDcEMsWUFBUSxLQUFLLFlBQVksTUFBTTtBQUN2QztBQUNBLFNBQVMsTUFBTSxNQUFNLFNBQVM7QUFDMUIsT0FBSyxLQUFLLGFBQWEsT0FBTztBQUM5QixTQUFPLEtBQUssS0FBSyxPQUFPO0FBQzVCO0FBQ0EsU0FBUyxnQkFBZ0IsT0FBTyxRQUFRLE1BQU0sS0FBSyxPQUFPO0FBQ3RELE1BQUksWUFBWSxNQUFNLFFBQVEsU0FBUyxTQUFTLE9BQU8sUUFBUSxRQUFRLENBQUM7QUFDeEUsTUFBSSxVQUFVLElBQUksUUFBUSxTQUFTLFNBQVMsTUFBTSxLQUFLLFFBQVEsQ0FBQztBQUNoRSxNQUFJLFVBQVUsQ0FBQztBQUNmLFdBQVMsTUFBTSxPQUFPLE9BQU8sT0FBTztBQUNwQyxNQUFJLGFBQWEsV0FBVyxPQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLEdBQUc7QUFDbEUsY0FBVSxXQUFXLE9BQU87QUFDNUIsWUFBUSxNQUFNLFdBQVcsZ0JBQWdCLE9BQU8sUUFBUSxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsR0FBRyxPQUFPO0FBQUEsRUFDM0YsT0FDSztBQUNELFFBQUk7QUFDQSxjQUFRLE1BQU0sV0FBVyxjQUFjLE9BQU8sUUFBUSxRQUFRLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFDOUUsYUFBUyxRQUFRLE1BQU0sT0FBTyxPQUFPO0FBQ3JDLFFBQUk7QUFDQSxjQUFRLE1BQU0sU0FBUyxjQUFjLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUM1RTtBQUNBLFdBQVMsS0FBSyxNQUFNLE9BQU8sT0FBTztBQUNsQyxTQUFPLElBQUksU0FBUyxPQUFPO0FBQy9CO0FBQ0EsU0FBUyxjQUFjLE9BQU8sS0FBSyxPQUFPO0FBQ3RDLE1BQUksVUFBVSxDQUFDO0FBQ2YsV0FBUyxNQUFNLE9BQU8sT0FBTyxPQUFPO0FBQ3BDLE1BQUksTUFBTSxRQUFRLE9BQU87QUFDckIsUUFBSSxPQUFPLFNBQVMsT0FBTyxLQUFLLFFBQVEsQ0FBQztBQUN6QyxZQUFRLE1BQU0sTUFBTSxjQUFjLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUN0RTtBQUNBLFdBQVMsS0FBSyxNQUFNLE9BQU8sT0FBTztBQUNsQyxTQUFPLElBQUksU0FBUyxPQUFPO0FBQy9CO0FBQ0EsU0FBUyx1QkFBdUJELFFBQU8sUUFBUTtBQUMzQyxNQUFJLFFBQVEsT0FBTyxRQUFRQSxPQUFNLFdBQVcsU0FBUyxPQUFPLEtBQUssS0FBSztBQUN0RSxNQUFJLE9BQU8sT0FBTyxLQUFLQSxPQUFNLE9BQU87QUFDcEMsV0FBUyxJQUFJLFFBQVEsR0FBRyxLQUFLLEdBQUc7QUFDNUIsV0FBTyxPQUFPLEtBQUssQ0FBQyxFQUFFLEtBQUssU0FBUyxLQUFLLElBQUksQ0FBQztBQUNsRCxTQUFPO0FBQUEsSUFBRSxPQUFPLEtBQUssZUFBZUEsT0FBTSxZQUFZLEtBQUs7QUFBQSxJQUN2RCxLQUFLLEtBQUssZUFBZSxLQUFLLFFBQVEsT0FBT0EsT0FBTSxVQUFVLEtBQUs7QUFBQSxFQUFFO0FBQzVFO0FBWUEsSUFBTSxjQUFOLE1BQU0sYUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFJQSxLQUlBLE1BSUEsY0FBYztBQUNWLFNBQUssTUFBTTtBQUNYLFNBQUssT0FBTztBQUNaLFNBQUssZUFBZTtBQUNwQixTQUFLLFFBQVEsS0FBSyxTQUFTLElBQUk7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsYUFBYSxLQUFLO0FBQ2QsUUFBSSxPQUFPO0FBQ1AsYUFBTyxLQUFLO0FBQ2hCLFFBQUksTUFBTTtBQUNOLGFBQU8sS0FBSyxRQUFRO0FBQ3hCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsSUFBSSxTQUFTO0FBQUUsV0FBTyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTdDLElBQUksTUFBTTtBQUFFLFdBQU8sS0FBSyxLQUFLLENBQUM7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtqQyxLQUFLLE9BQU87QUFBRSxXQUFPLEtBQUssS0FBSyxLQUFLLGFBQWEsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTTlELE1BQU0sT0FBTztBQUFFLFdBQU8sS0FBSyxLQUFLLEtBQUssYUFBYSxLQUFLLElBQUksSUFBSSxDQUFDO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbkUsV0FBVyxPQUFPO0FBQ2QsWUFBUSxLQUFLLGFBQWEsS0FBSztBQUMvQixXQUFPLEtBQUssTUFBTSxLQUFLLEtBQUssU0FBUyxLQUFLLFNBQVMsQ0FBQyxLQUFLLGFBQWEsSUFBSTtBQUFBLEVBQzlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQU0sT0FBTztBQUNULFlBQVEsS0FBSyxhQUFhLEtBQUs7QUFDL0IsV0FBTyxTQUFTLElBQUksSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSTtBQUFBLEVBQ3ZEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUksT0FBTztBQUNQLFlBQVEsS0FBSyxhQUFhLEtBQUs7QUFDL0IsV0FBTyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUUsUUFBUTtBQUFBLEVBQ3hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsT0FBTyxPQUFPO0FBQ1YsWUFBUSxLQUFLLGFBQWEsS0FBSztBQUMvQixRQUFJLENBQUM7QUFDRCxZQUFNLElBQUksV0FBVyxnREFBZ0Q7QUFDekUsV0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLEtBQUssTUFBTSxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFNLE9BQU87QUFDVCxZQUFRLEtBQUssYUFBYSxLQUFLO0FBQy9CLFFBQUksQ0FBQztBQUNELFlBQU0sSUFBSSxXQUFXLCtDQUErQztBQUN4RSxXQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksS0FBSyxNQUFNLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxRQUFRLENBQUMsRUFBRTtBQUFBLEVBQ2hHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsSUFBSSxhQUFhO0FBQUUsV0FBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxTQUFTLENBQUM7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTXRFLElBQUksWUFBWTtBQUNaLFFBQUksU0FBUyxLQUFLLFFBQVEsUUFBUSxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQ3ZELFFBQUksU0FBUyxPQUFPO0FBQ2hCLGFBQU87QUFDWCxRQUFJLE9BQU8sS0FBSyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssU0FBUyxDQUFDLEdBQUcsUUFBUSxPQUFPLE1BQU0sS0FBSztBQUNqRixXQUFPLE9BQU8sT0FBTyxNQUFNLEtBQUssRUFBRSxJQUFJLElBQUksSUFBSTtBQUFBLEVBQ2xEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsSUFBSSxhQUFhO0FBQ2IsUUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFDakMsUUFBSSxPQUFPLEtBQUssTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLFNBQVMsQ0FBQztBQUNwRCxRQUFJO0FBQ0EsYUFBTyxLQUFLLE9BQU8sTUFBTSxLQUFLLEVBQUUsSUFBSSxHQUFHLElBQUk7QUFDL0MsV0FBTyxTQUFTLElBQUksT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxXQUFXLE9BQU8sT0FBTztBQUNyQixZQUFRLEtBQUssYUFBYSxLQUFLO0FBQy9CLFFBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLEdBQUcsTUFBTSxTQUFTLElBQUksSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSTtBQUNuRixhQUFTLElBQUksR0FBRyxJQUFJLE9BQU87QUFDdkIsYUFBTyxLQUFLLE1BQU0sQ0FBQyxFQUFFO0FBQ3pCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxRQUFRO0FBQ0osUUFBSSxTQUFTLEtBQUssUUFBUSxRQUFRLEtBQUssTUFBTTtBQUU3QyxRQUFJLE9BQU8sUUFBUSxRQUFRO0FBQ3ZCLGFBQU8sS0FBSztBQUVoQixRQUFJLEtBQUs7QUFDTCxhQUFPLE9BQU8sTUFBTSxLQUFLLEVBQUU7QUFDL0IsUUFBSUMsUUFBTyxPQUFPLFdBQVcsUUFBUSxDQUFDLEdBQUcsUUFBUSxPQUFPLFdBQVcsS0FBSztBQUd4RSxRQUFJLENBQUNBLE9BQU07QUFDUCxVQUFJLE1BQU1BO0FBQ1YsTUFBQUEsUUFBTztBQUNQLGNBQVE7QUFBQSxJQUNaO0FBR0EsUUFBSSxRQUFRQSxNQUFLO0FBQ2pCLGFBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRO0FBQzlCLFVBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxLQUFLLGNBQWMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLE1BQU0sS0FBSztBQUNsRixnQkFBUSxNQUFNLEdBQUcsRUFBRSxjQUFjLEtBQUs7QUFDOUMsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxZQUFZLE1BQU07QUFDZCxRQUFJLFFBQVEsS0FBSyxPQUFPLFdBQVcsS0FBSyxNQUFNLENBQUM7QUFDL0MsUUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO0FBQ2pCLGFBQU87QUFDWCxRQUFJLFFBQVEsTUFBTSxPQUFPLE9BQU8sS0FBSyxPQUFPLFdBQVcsS0FBSyxNQUFNLENBQUM7QUFDbkUsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVE7QUFDOUIsVUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLEtBQUssY0FBYyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsS0FBSyxLQUFLO0FBQ2hGLGdCQUFRLE1BQU0sR0FBRyxFQUFFLGNBQWMsS0FBSztBQUM5QyxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxZQUFZLEtBQUs7QUFDYixhQUFTLFFBQVEsS0FBSyxPQUFPLFFBQVEsR0FBRztBQUNwQyxVQUFJLEtBQUssTUFBTSxLQUFLLEtBQUssT0FBTyxLQUFLLElBQUksS0FBSyxLQUFLO0FBQy9DLGVBQU87QUFDZixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsV0FBVyxRQUFRLE1BQU0sTUFBTTtBQUMzQixRQUFJLE1BQU0sTUFBTSxLQUFLO0FBQ2pCLGFBQU8sTUFBTSxXQUFXLElBQUk7QUFDaEMsYUFBUyxJQUFJLEtBQUssU0FBUyxLQUFLLE9BQU8saUJBQWlCLEtBQUssT0FBTyxNQUFNLE1BQU0sSUFBSSxJQUFJLEtBQUssR0FBRztBQUM1RixVQUFJLE1BQU0sT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDdkQsZUFBTyxJQUFJLFVBQVUsTUFBTSxPQUFPLENBQUM7QUFDM0MsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFdBQVcsT0FBTztBQUNkLFdBQU8sS0FBSyxNQUFNLEtBQUssZ0JBQWdCLE1BQU0sTUFBTSxNQUFNO0FBQUEsRUFDN0Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksT0FBTztBQUNQLFdBQU8sTUFBTSxNQUFNLEtBQUssTUFBTSxRQUFRO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksT0FBTztBQUNQLFdBQU8sTUFBTSxNQUFNLEtBQUssTUFBTSxRQUFRO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFdBQVc7QUFDUCxRQUFJLE1BQU07QUFDVixhQUFTLElBQUksR0FBRyxLQUFLLEtBQUssT0FBTztBQUM3QixjQUFRLE1BQU0sTUFBTSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQztBQUM3RSxXQUFPLE1BQU0sTUFBTSxLQUFLO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sUUFBUUMsTUFBSyxLQUFLO0FBQ3JCLFFBQUksRUFBRSxPQUFPLEtBQUssT0FBT0EsS0FBSSxRQUFRO0FBQ2pDLFlBQU0sSUFBSSxXQUFXLGNBQWMsTUFBTSxlQUFlO0FBQzVELFFBQUksT0FBTyxDQUFDO0FBQ1osUUFBSVQsU0FBUSxHQUFHLGVBQWU7QUFDOUIsYUFBUyxPQUFPUyxVQUFPO0FBQ25CLFVBQUksRUFBRSxPQUFPLFFBQUFKLFFBQU8sSUFBSSxLQUFLLFFBQVEsVUFBVSxZQUFZO0FBQzNELFVBQUksTUFBTSxlQUFlQTtBQUN6QixXQUFLLEtBQUssTUFBTSxPQUFPTCxTQUFRSyxPQUFNO0FBQ3JDLFVBQUksQ0FBQztBQUNEO0FBQ0osYUFBTyxLQUFLLE1BQU0sS0FBSztBQUN2QixVQUFJLEtBQUs7QUFDTDtBQUNKLHFCQUFlLE1BQU07QUFDckIsTUFBQUwsVUFBU0ssVUFBUztBQUFBLElBQ3RCO0FBQ0EsV0FBTyxJQUFJLGFBQVksS0FBSyxNQUFNLFlBQVk7QUFBQSxFQUNsRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsT0FBTyxjQUFjSSxNQUFLLEtBQUs7QUFDM0IsYUFBUyxJQUFJLEdBQUcsSUFBSSxhQUFhLFFBQVEsS0FBSztBQUMxQyxVQUFJLFNBQVMsYUFBYSxDQUFDO0FBQzNCLFVBQUksT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPQTtBQUNuQyxlQUFPO0FBQUEsSUFDZjtBQUNBLFFBQUksU0FBUyxhQUFhLGVBQWUsSUFBSSxhQUFZLFFBQVFBLE1BQUssR0FBRztBQUN6RSx1QkFBbUIsa0JBQWtCLEtBQUs7QUFDMUMsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUNBLElBQUksZUFBZSxDQUFDO0FBQXBCLElBQXVCLGtCQUFrQjtBQUF6QyxJQUE0QyxtQkFBbUI7QUFLL0QsSUFBTSxZQUFOLE1BQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVosWUFPQSxPQUtBLEtBSUEsT0FBTztBQUNILFNBQUssUUFBUTtBQUNiLFNBQUssTUFBTTtBQUNYLFNBQUssUUFBUTtBQUFBLEVBQ2pCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxJQUFJLFFBQVE7QUFBRSxXQUFPLEtBQUssTUFBTSxPQUFPLEtBQUssUUFBUSxDQUFDO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXhELElBQUksTUFBTTtBQUFFLFdBQU8sS0FBSyxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUM7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkQsSUFBSSxTQUFTO0FBQUUsV0FBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUs7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkQsSUFBSSxhQUFhO0FBQUUsV0FBTyxLQUFLLE1BQU0sTUFBTSxLQUFLLEtBQUs7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJeEQsSUFBSSxXQUFXO0FBQUUsV0FBTyxLQUFLLElBQUksV0FBVyxLQUFLLEtBQUs7QUFBQSxFQUFHO0FBQzdEO0FBRUEsSUFBTSxhQUFhLHVCQUFPLE9BQU8sSUFBSTtBQWVyQyxJQUFNLE9BQU4sTUFBTSxNQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUCxZQUlBLE1BTUEsT0FFQSxTQUtBLFFBQVEsS0FBSyxNQUFNO0FBQ2YsU0FBSyxPQUFPO0FBQ1osU0FBSyxRQUFRO0FBQ2IsU0FBSyxRQUFRO0FBQ2IsU0FBSyxVQUFVLFdBQVcsU0FBUztBQUFBLEVBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLElBQUksV0FBVztBQUFFLFdBQU8sS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFFBQVE7QUFBQSxFQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakUsSUFBSSxhQUFhO0FBQUUsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtuRCxNQUFNLE9BQU87QUFBRSxXQUFPLEtBQUssUUFBUSxNQUFNLEtBQUs7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakQsV0FBVyxPQUFPO0FBQUUsV0FBTyxLQUFLLFFBQVEsV0FBVyxLQUFLO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLM0QsUUFBUSxHQUFHO0FBQUUsU0FBSyxRQUFRLFFBQVEsQ0FBQztBQUFBLEVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV3RDLGFBQWFYLE9BQU0sSUFBSSxHQUFHLFdBQVcsR0FBRztBQUNwQyxTQUFLLFFBQVEsYUFBYUEsT0FBTSxJQUFJLEdBQUcsVUFBVSxJQUFJO0FBQUEsRUFDekQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsWUFBWSxHQUFHO0FBQ1gsU0FBSyxhQUFhLEdBQUcsS0FBSyxRQUFRLE1BQU0sQ0FBQztBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUksY0FBYztBQUNkLFdBQVEsS0FBSyxVQUFVLEtBQUssS0FBSyxLQUFLLFdBQ2hDLEtBQUssS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUM1QixLQUFLLFlBQVksR0FBRyxLQUFLLFFBQVEsTUFBTSxFQUFFO0FBQUEsRUFDbkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsWUFBWUEsT0FBTSxJQUFJLGdCQUFnQixVQUFVO0FBQzVDLFdBQU8sS0FBSyxRQUFRLFlBQVlBLE9BQU0sSUFBSSxnQkFBZ0IsUUFBUTtBQUFBLEVBQ3RFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUksYUFBYTtBQUFFLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbkQsSUFBSSxZQUFZO0FBQUUsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakQsR0FBRyxPQUFPO0FBQ04sV0FBTyxRQUFRLFNBQVUsS0FBSyxXQUFXLEtBQUssS0FBSyxLQUFLLFFBQVEsR0FBRyxNQUFNLE9BQU87QUFBQSxFQUNwRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxXQUFXLE9BQU87QUFDZCxXQUFPLEtBQUssVUFBVSxNQUFNLE1BQU0sTUFBTSxPQUFPLE1BQU0sS0FBSztBQUFBLEVBQzlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFVBQVUsTUFBTSxPQUFPLE9BQU87QUFDMUIsV0FBTyxLQUFLLFFBQVEsUUFDaEIsWUFBWSxLQUFLLE9BQU8sU0FBUyxLQUFLLGdCQUFnQixVQUFVLEtBQ2hFLEtBQUssUUFBUSxLQUFLLE9BQU8sU0FBUyxLQUFLLElBQUk7QUFBQSxFQUNuRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxLQUFLLFVBQVUsTUFBTTtBQUNqQixRQUFJLFdBQVcsS0FBSztBQUNoQixhQUFPO0FBQ1gsV0FBTyxJQUFJLE1BQUssS0FBSyxNQUFNLEtBQUssT0FBTyxTQUFTLEtBQUssS0FBSztBQUFBLEVBQzlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLEtBQUssT0FBTztBQUNSLFdBQU8sU0FBUyxLQUFLLFFBQVEsT0FBTyxJQUFJLE1BQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLFNBQVMsS0FBSztBQUFBLEVBQzNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsSUFBSUEsT0FBTSxLQUFLLEtBQUssUUFBUSxNQUFNO0FBQzlCLFFBQUlBLFNBQVEsS0FBSyxNQUFNLEtBQUssUUFBUTtBQUNoQyxhQUFPO0FBQ1gsV0FBTyxLQUFLLEtBQUssS0FBSyxRQUFRLElBQUlBLE9BQU0sRUFBRSxDQUFDO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBTUEsT0FBTSxLQUFLLEtBQUssUUFBUSxNQUFNLGlCQUFpQixPQUFPO0FBQ3hELFFBQUlBLFNBQVE7QUFDUixhQUFPLE1BQU07QUFDakIsUUFBSSxRQUFRLEtBQUssUUFBUUEsS0FBSSxHQUFHLE1BQU0sS0FBSyxRQUFRLEVBQUU7QUFDckQsUUFBSSxRQUFRLGlCQUFpQixJQUFJLE1BQU0sWUFBWSxFQUFFO0FBQ3JELFFBQUlFLFNBQVEsTUFBTSxNQUFNLEtBQUssR0FBRyxPQUFPLE1BQU0sS0FBSyxLQUFLO0FBQ3ZELFFBQUksVUFBVSxLQUFLLFFBQVEsSUFBSSxNQUFNLE1BQU1BLFFBQU8sSUFBSSxNQUFNQSxNQUFLO0FBQ2pFLFdBQU8sSUFBSSxNQUFNLFNBQVMsTUFBTSxRQUFRLE9BQU8sSUFBSSxRQUFRLEtBQUs7QUFBQSxFQUNwRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLFFBQVFGLE9BQU0sSUFBSVMsUUFBTztBQUNyQixXQUFPLFFBQVEsS0FBSyxRQUFRVCxLQUFJLEdBQUcsS0FBSyxRQUFRLEVBQUUsR0FBR1MsTUFBSztBQUFBLEVBQzlEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPLEtBQUs7QUFDUixhQUFTLE9BQU8sVUFBUTtBQUNwQixVQUFJLEVBQUUsT0FBTyxRQUFBRixRQUFPLElBQUksS0FBSyxRQUFRLFVBQVUsR0FBRztBQUNsRCxhQUFPLEtBQUssV0FBVyxLQUFLO0FBQzVCLFVBQUksQ0FBQztBQUNELGVBQU87QUFDWCxVQUFJQSxXQUFVLE9BQU8sS0FBSztBQUN0QixlQUFPO0FBQ1gsYUFBT0EsVUFBUztBQUFBLElBQ3BCO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLFdBQVcsS0FBSztBQUNaLFFBQUksRUFBRSxPQUFPLFFBQUFBLFFBQU8sSUFBSSxLQUFLLFFBQVEsVUFBVSxHQUFHO0FBQ2xELFdBQU8sRUFBRSxNQUFNLEtBQUssUUFBUSxXQUFXLEtBQUssR0FBRyxPQUFPLFFBQUFBLFFBQU87QUFBQSxFQUNqRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLFlBQVksS0FBSztBQUNiLFFBQUksT0FBTztBQUNQLGFBQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRTtBQUM3QyxRQUFJLEVBQUUsT0FBTyxRQUFBQSxRQUFPLElBQUksS0FBSyxRQUFRLFVBQVUsR0FBRztBQUNsRCxRQUFJQSxVQUFTO0FBQ1QsYUFBTyxFQUFFLE1BQU0sS0FBSyxRQUFRLE1BQU0sS0FBSyxHQUFHLE9BQU8sUUFBQUEsUUFBTztBQUM1RCxRQUFJLE9BQU8sS0FBSyxRQUFRLE1BQU0sUUFBUSxDQUFDO0FBQ3ZDLFdBQU8sRUFBRSxNQUFNLE9BQU8sUUFBUSxHQUFHLFFBQVFBLFVBQVMsS0FBSyxTQUFTO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsUUFBUSxLQUFLO0FBQUUsV0FBTyxZQUFZLGNBQWMsTUFBTSxHQUFHO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTVELGVBQWUsS0FBSztBQUFFLFdBQU8sWUFBWSxRQUFRLE1BQU0sR0FBRztBQUFBLEVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzdELGFBQWFQLE9BQU0sSUFBSSxNQUFNO0FBQ3pCLFFBQUlLLFNBQVE7QUFDWixRQUFJLEtBQUtMO0FBQ0wsV0FBSyxhQUFhQSxPQUFNLElBQUksVUFBUTtBQUNoQyxZQUFJLEtBQUssUUFBUSxLQUFLLEtBQUs7QUFDdkIsVUFBQUssU0FBUTtBQUNaLGVBQU8sQ0FBQ0E7QUFBQSxNQUNaLENBQUM7QUFDTCxXQUFPQTtBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksVUFBVTtBQUFFLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLMUMsSUFBSSxjQUFjO0FBQUUsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEQsSUFBSSxnQkFBZ0I7QUFBRSxXQUFPLEtBQUssS0FBSztBQUFBLEVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS3RELElBQUksV0FBVztBQUFFLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTVDLElBQUksU0FBUztBQUFFLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXhDLElBQUksU0FBUztBQUFFLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFReEMsSUFBSSxTQUFTO0FBQUUsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUt4QyxXQUFXO0FBQ1AsUUFBSSxLQUFLLEtBQUssS0FBSztBQUNmLGFBQU8sS0FBSyxLQUFLLEtBQUssY0FBYyxJQUFJO0FBQzVDLFFBQUksT0FBTyxLQUFLLEtBQUs7QUFDckIsUUFBSSxLQUFLLFFBQVE7QUFDYixjQUFRLE1BQU0sS0FBSyxRQUFRLGNBQWMsSUFBSTtBQUNqRCxXQUFPLFVBQVUsS0FBSyxPQUFPLElBQUk7QUFBQSxFQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsZUFBZSxPQUFPO0FBQ2xCLFFBQUksUUFBUSxLQUFLLEtBQUssYUFBYSxjQUFjLEtBQUssU0FBUyxHQUFHLEtBQUs7QUFDdkUsUUFBSSxDQUFDO0FBQ0QsWUFBTSxJQUFJLE1BQU0sc0RBQXNEO0FBQzFFLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLFdBQVdMLE9BQU0sSUFBSSxjQUFjLFNBQVMsT0FBT0UsU0FBUSxHQUFHRCxPQUFNLFlBQVksWUFBWTtBQUN4RixRQUFJLE1BQU0sS0FBSyxlQUFlRCxLQUFJLEVBQUUsY0FBYyxhQUFhRSxRQUFPRCxJQUFHO0FBQ3pFLFFBQUksTUFBTSxPQUFPLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtBQUNuRCxRQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7QUFDYixhQUFPO0FBQ1gsYUFBUyxJQUFJQyxRQUFPLElBQUlELE1BQUs7QUFDekIsVUFBSSxDQUFDLEtBQUssS0FBSyxZQUFZLFlBQVksTUFBTSxDQUFDLEVBQUUsS0FBSztBQUNqRCxlQUFPO0FBQ2YsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsZUFBZUQsT0FBTSxJQUFJLE1BQU0sT0FBTztBQUNsQyxRQUFJLFNBQVMsQ0FBQyxLQUFLLEtBQUssWUFBWSxLQUFLO0FBQ3JDLGFBQU87QUFDWCxRQUFJRSxTQUFRLEtBQUssZUFBZUYsS0FBSSxFQUFFLFVBQVUsSUFBSTtBQUNwRCxRQUFJQyxPQUFNQyxVQUFTQSxPQUFNLGNBQWMsS0FBSyxTQUFTLEVBQUU7QUFDdkQsV0FBT0QsT0FBTUEsS0FBSSxXQUFXO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLFVBQVUsT0FBTztBQUNiLFFBQUksTUFBTSxRQUFRO0FBQ2QsYUFBTyxLQUFLLFdBQVcsS0FBSyxZQUFZLEtBQUssWUFBWSxNQUFNLE9BQU87QUFBQTtBQUV0RSxhQUFPLEtBQUssS0FBSyxrQkFBa0IsTUFBTSxJQUFJO0FBQUEsRUFDckQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsUUFBUTtBQUNKLFNBQUssS0FBSyxhQUFhLEtBQUssT0FBTztBQUNuQyxRQUFJRyxRQUFPLEtBQUs7QUFDaEIsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLE1BQU0sUUFBUTtBQUNuQyxNQUFBQSxRQUFPLEtBQUssTUFBTSxDQUFDLEVBQUUsU0FBU0EsS0FBSTtBQUN0QyxRQUFJLENBQUMsS0FBSyxRQUFRQSxPQUFNLEtBQUssS0FBSztBQUM5QixZQUFNLElBQUksV0FBVyx3Q0FBd0MsS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxPQUFLLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUN0SCxTQUFLLFFBQVEsUUFBUSxVQUFRLEtBQUssTUFBTSxDQUFDO0FBQUEsRUFDN0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFNBQVM7QUFDTCxRQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSyxLQUFLO0FBQ2pDLGFBQVMsS0FBSyxLQUFLLE9BQU87QUFDdEIsVUFBSSxRQUFRLEtBQUs7QUFDakI7QUFBQSxJQUNKO0FBQ0EsUUFBSSxLQUFLLFFBQVE7QUFDYixVQUFJLFVBQVUsS0FBSyxRQUFRLE9BQU87QUFDdEMsUUFBSSxLQUFLLE1BQU07QUFDWCxVQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksT0FBSyxFQUFFLE9BQU8sQ0FBQztBQUM5QyxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsT0FBTyxTQUFTLFFBQVFJLE9BQU07QUFDMUIsUUFBSSxDQUFDQTtBQUNELFlBQU0sSUFBSSxXQUFXLGlDQUFpQztBQUMxRCxRQUFJLFFBQVE7QUFDWixRQUFJQSxNQUFLLE9BQU87QUFDWixVQUFJLENBQUMsTUFBTSxRQUFRQSxNQUFLLEtBQUs7QUFDekIsY0FBTSxJQUFJLFdBQVcscUNBQXFDO0FBQzlELGNBQVFBLE1BQUssTUFBTSxJQUFJLE9BQU8sWUFBWTtBQUFBLElBQzlDO0FBQ0EsUUFBSUEsTUFBSyxRQUFRLFFBQVE7QUFDckIsVUFBSSxPQUFPQSxNQUFLLFFBQVE7QUFDcEIsY0FBTSxJQUFJLFdBQVcsMkJBQTJCO0FBQ3BELGFBQU8sT0FBTyxLQUFLQSxNQUFLLE1BQU0sS0FBSztBQUFBLElBQ3ZDO0FBQ0EsUUFBSSxVQUFVLFNBQVMsU0FBUyxRQUFRQSxNQUFLLE9BQU87QUFDcEQsV0FBTyxPQUFPLFNBQVNBLE1BQUssSUFBSSxFQUFFLE9BQU9BLE1BQUssT0FBTyxTQUFTLEtBQUs7QUFBQSxFQUN2RTtBQUNKO0FBQ0EsS0FBSyxVQUFVLE9BQU87QUFDdEIsSUFBTSxXQUFOLE1BQU0sa0JBQWlCLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl4QixZQUFZLE1BQU0sT0FBTyxTQUFTLE9BQU87QUFDckMsVUFBTSxNQUFNLE9BQU8sTUFBTSxLQUFLO0FBQzlCLFFBQUksQ0FBQztBQUNELFlBQU0sSUFBSSxXQUFXLGtDQUFrQztBQUMzRCxTQUFLLE9BQU87QUFBQSxFQUNoQjtBQUFBLEVBQ0EsV0FBVztBQUNQLFFBQUksS0FBSyxLQUFLLEtBQUs7QUFDZixhQUFPLEtBQUssS0FBSyxLQUFLLGNBQWMsSUFBSTtBQUM1QyxXQUFPLFVBQVUsS0FBSyxPQUFPLEtBQUssVUFBVSxLQUFLLElBQUksQ0FBQztBQUFBLEVBQzFEO0FBQUEsRUFDQSxJQUFJLGNBQWM7QUFBRSxXQUFPLEtBQUs7QUFBQSxFQUFNO0FBQUEsRUFDdEMsWUFBWVIsT0FBTSxJQUFJO0FBQUUsV0FBTyxLQUFLLEtBQUssTUFBTUEsT0FBTSxFQUFFO0FBQUEsRUFBRztBQUFBLEVBQzFELElBQUksV0FBVztBQUFFLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFBUTtBQUFBLEVBQzFDLEtBQUssT0FBTztBQUNSLFdBQU8sU0FBUyxLQUFLLFFBQVEsT0FBTyxJQUFJLFVBQVMsS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLE1BQU0sS0FBSztBQUFBLEVBQzVGO0FBQUEsRUFDQSxTQUFTLE1BQU07QUFDWCxRQUFJLFFBQVEsS0FBSztBQUNiLGFBQU87QUFDWCxXQUFPLElBQUksVUFBUyxLQUFLLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxLQUFLO0FBQUEsRUFDL0Q7QUFBQSxFQUNBLElBQUlBLFFBQU8sR0FBRyxLQUFLLEtBQUssS0FBSyxRQUFRO0FBQ2pDLFFBQUlBLFNBQVEsS0FBSyxNQUFNLEtBQUssS0FBSztBQUM3QixhQUFPO0FBQ1gsV0FBTyxLQUFLLFNBQVMsS0FBSyxLQUFLLE1BQU1BLE9BQU0sRUFBRSxDQUFDO0FBQUEsRUFDbEQ7QUFBQSxFQUNBLEdBQUcsT0FBTztBQUNOLFdBQU8sS0FBSyxXQUFXLEtBQUssS0FBSyxLQUFLLFFBQVEsTUFBTTtBQUFBLEVBQ3hEO0FBQUEsRUFDQSxTQUFTO0FBQ0wsUUFBSVksUUFBTyxNQUFNLE9BQU87QUFDeEIsSUFBQUEsTUFBSyxPQUFPLEtBQUs7QUFDakIsV0FBT0E7QUFBQSxFQUNYO0FBQ0o7QUFDQSxTQUFTLFVBQVUsT0FBTyxLQUFLO0FBQzNCLFdBQVMsSUFBSSxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUc7QUFDbkMsVUFBTSxNQUFNLENBQUMsRUFBRSxLQUFLLE9BQU8sTUFBTSxNQUFNO0FBQzNDLFNBQU87QUFDWDtBQVFBLElBQU0sZUFBTixNQUFNLGNBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlmLFlBSUEsVUFBVTtBQUNOLFNBQUssV0FBVztBQUloQixTQUFLLE9BQU8sQ0FBQztBQUliLFNBQUssWUFBWSxDQUFDO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sTUFBTSxRQUFRLFdBQVc7QUFDNUIsUUFBSSxTQUFTLElBQUksWUFBWSxRQUFRLFNBQVM7QUFDOUMsUUFBSSxPQUFPLFFBQVE7QUFDZixhQUFPLGNBQWE7QUFDeEIsUUFBSSxPQUFPLFVBQVUsTUFBTTtBQUMzQixRQUFJLE9BQU87QUFDUCxhQUFPLElBQUksMEJBQTBCO0FBQ3pDLFFBQUksUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDO0FBQ3pCLHFCQUFpQixPQUFPLE1BQU07QUFDOUIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsVUFBVSxNQUFNO0FBQ1osYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUssUUFBUTtBQUNsQyxVQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsUUFBUTtBQUNyQixlQUFPLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFDNUIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsY0FBYyxNQUFNVixTQUFRLEdBQUdELE9BQU0sS0FBSyxZQUFZO0FBQ2xELFFBQUksTUFBTTtBQUNWLGFBQVMsSUFBSUMsUUFBTyxPQUFPLElBQUlELE1BQUs7QUFDaEMsWUFBTSxJQUFJLFVBQVUsS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQzFDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxJQUFJLGdCQUFnQjtBQUNoQixXQUFPLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxLQUFLLENBQUMsRUFBRSxLQUFLO0FBQUEsRUFDdEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxjQUFjO0FBQ2QsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUssUUFBUSxLQUFLO0FBQ3ZDLFVBQUksRUFBRSxLQUFLLElBQUksS0FBSyxLQUFLLENBQUM7QUFDMUIsVUFBSSxFQUFFLEtBQUssVUFBVSxLQUFLLGlCQUFpQjtBQUN2QyxlQUFPO0FBQUEsSUFDZjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxXQUFXLE9BQU87QUFDZCxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSyxRQUFRO0FBQ2xDLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxLQUFLLFFBQVE7QUFDbkMsWUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLFFBQVEsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUNuQyxpQkFBTztBQUNuQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLFdBQVcsT0FBTyxRQUFRLE9BQU8sYUFBYSxHQUFHO0FBQzdDLFFBQUksT0FBTyxDQUFDLElBQUk7QUFDaEIsYUFBUyxPQUFPLE9BQU8sT0FBTztBQUMxQixVQUFJLFdBQVcsTUFBTSxjQUFjLE9BQU8sVUFBVTtBQUNwRCxVQUFJLGFBQWEsQ0FBQyxTQUFTLFNBQVM7QUFDaEMsZUFBTyxTQUFTLEtBQUssTUFBTSxJQUFJLFFBQU0sR0FBRyxjQUFjLENBQUMsQ0FBQztBQUM1RCxlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sS0FBSyxRQUFRLEtBQUs7QUFDeEMsWUFBSSxFQUFFLE1BQU0sS0FBSyxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBQ2pDLFlBQUksRUFBRSxLQUFLLFVBQVUsS0FBSyxpQkFBaUIsTUFBTSxLQUFLLFFBQVEsSUFBSSxLQUFLLElBQUk7QUFDdkUsZUFBSyxLQUFLLElBQUk7QUFDZCxjQUFJSSxTQUFRLE9BQU8sTUFBTSxNQUFNLE9BQU8sSUFBSSxDQUFDO0FBQzNDLGNBQUlBO0FBQ0EsbUJBQU9BO0FBQUEsUUFDZjtBQUFBLE1BQ0o7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU8sT0FBTyxNQUFNLENBQUMsQ0FBQztBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxhQUFhLFFBQVE7QUFDakIsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFVBQVUsUUFBUSxLQUFLO0FBQzVDLFVBQUksS0FBSyxVQUFVLENBQUMsS0FBSztBQUNyQixlQUFPLEtBQUssVUFBVSxJQUFJLENBQUM7QUFDbkMsUUFBSSxXQUFXLEtBQUssZ0JBQWdCLE1BQU07QUFDMUMsU0FBSyxVQUFVLEtBQUssUUFBUSxRQUFRO0FBQ3BDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxnQkFBZ0IsUUFBUTtBQUNwQixRQUFJLE9BQU8sdUJBQU8sT0FBTyxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsT0FBTyxNQUFNLE1BQU0sTUFBTSxLQUFLLEtBQUssQ0FBQztBQUNoRixXQUFPLE9BQU8sUUFBUTtBQUNsQixVQUFJLFVBQVUsT0FBTyxNQUFNLEdBQUcsUUFBUSxRQUFRO0FBQzlDLFVBQUksTUFBTSxVQUFVLE1BQU0sR0FBRztBQUN6QixZQUFJLFNBQVMsQ0FBQztBQUNkLGlCQUFTLE1BQU0sU0FBUyxJQUFJLE1BQU0sTUFBTSxJQUFJO0FBQ3hDLGlCQUFPLEtBQUssSUFBSSxJQUFJO0FBQ3hCLGVBQU8sT0FBTyxRQUFRO0FBQUEsTUFDMUI7QUFDQSxlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sS0FBSyxRQUFRLEtBQUs7QUFDeEMsWUFBSSxFQUFFLE1BQU0sS0FBSyxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBQ2pDLFlBQUksQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLGlCQUFpQixLQUFLLEVBQUUsS0FBSyxRQUFRLFVBQVUsQ0FBQyxRQUFRLFFBQVEsS0FBSyxXQUFXO0FBQ3RHLGlCQUFPLEtBQUssRUFBRSxPQUFPLEtBQUssY0FBYyxNQUFNLEtBQUssUUFBUSxDQUFDO0FBQzVELGVBQUssS0FBSyxJQUFJLElBQUk7QUFBQSxRQUN0QjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxZQUFZO0FBQ1osV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxLQUFLLEdBQUc7QUFDSixRQUFJLEtBQUssS0FBSyxLQUFLO0FBQ2YsWUFBTSxJQUFJLFdBQVcsY0FBYyxDQUFDLCtCQUErQjtBQUN2RSxXQUFPLEtBQUssS0FBSyxDQUFDO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFdBQVc7QUFDUCxRQUFJLE9BQU8sQ0FBQztBQUNaLGFBQVMsS0FBSyxHQUFHO0FBQ2IsV0FBSyxLQUFLLENBQUM7QUFDWCxlQUFTLElBQUksR0FBRyxJQUFJLEVBQUUsS0FBSyxRQUFRO0FBQy9CLFlBQUksS0FBSyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLO0FBQ2hDLGVBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDL0I7QUFDQSxTQUFLLElBQUk7QUFDVCxXQUFPLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTTtBQUN0QixVQUFJLE1BQU0sS0FBSyxFQUFFLFdBQVcsTUFBTSxPQUFPO0FBQ3pDLGVBQVNRLEtBQUksR0FBR0EsS0FBSSxFQUFFLEtBQUssUUFBUUE7QUFDL0IsZ0JBQVFBLEtBQUksT0FBTyxNQUFNLEVBQUUsS0FBS0EsRUFBQyxFQUFFLEtBQUssT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLEtBQUtBLEVBQUMsRUFBRSxJQUFJO0FBQ3JGLGFBQU87QUFBQSxJQUNYLENBQUMsRUFBRSxLQUFLLElBQUk7QUFBQSxFQUNoQjtBQUNKO0FBSUEsYUFBYSxRQUFRLElBQUksYUFBYSxJQUFJO0FBQzFDLElBQU0sY0FBTixNQUFrQjtBQUFBLEVBQ2QsWUFBWSxRQUFRLFdBQVc7QUFDM0IsU0FBSyxTQUFTO0FBQ2QsU0FBSyxZQUFZO0FBQ2pCLFNBQUssU0FBUztBQUNkLFNBQUssTUFBTTtBQUNYLFNBQUssU0FBUyxPQUFPLE1BQU0sZ0JBQWdCO0FBQzNDLFFBQUksS0FBSyxPQUFPLEtBQUssT0FBTyxTQUFTLENBQUMsS0FBSztBQUN2QyxXQUFLLE9BQU8sSUFBSTtBQUNwQixRQUFJLEtBQUssT0FBTyxDQUFDLEtBQUs7QUFDbEIsV0FBSyxPQUFPLE1BQU07QUFBQSxFQUMxQjtBQUFBLEVBQ0EsSUFBSSxPQUFPO0FBQUUsV0FBTyxLQUFLLE9BQU8sS0FBSyxHQUFHO0FBQUEsRUFBRztBQUFBLEVBQzNDLElBQUksS0FBSztBQUFFLFdBQU8sS0FBSyxRQUFRLFFBQVEsS0FBSyxTQUFTO0FBQUEsRUFBTztBQUFBLEVBQzVELElBQUksS0FBSztBQUFFLFVBQU0sSUFBSSxZQUFZLE1BQU0sOEJBQThCLEtBQUssU0FBUyxJQUFJO0FBQUEsRUFBRztBQUM5RjtBQUNBLFNBQVMsVUFBVSxRQUFRO0FBQ3ZCLE1BQUksUUFBUSxDQUFDO0FBQ2IsS0FBRztBQUNDLFVBQU0sS0FBSyxhQUFhLE1BQU0sQ0FBQztBQUFBLEVBQ25DLFNBQVMsT0FBTyxJQUFJLEdBQUc7QUFDdkIsU0FBTyxNQUFNLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sVUFBVSxNQUFNO0FBQ2xFO0FBQ0EsU0FBUyxhQUFhLFFBQVE7QUFDMUIsTUFBSSxRQUFRLENBQUM7QUFDYixLQUFHO0FBQ0MsVUFBTSxLQUFLLG1CQUFtQixNQUFNLENBQUM7QUFBQSxFQUN6QyxTQUFTLE9BQU8sUUFBUSxPQUFPLFFBQVEsT0FBTyxPQUFPLFFBQVE7QUFDN0QsU0FBTyxNQUFNLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sT0FBTyxNQUFNO0FBQy9EO0FBQ0EsU0FBUyxtQkFBbUIsUUFBUTtBQUNoQyxNQUFJLE9BQU8sY0FBYyxNQUFNO0FBQy9CLGFBQVM7QUFDTCxRQUFJLE9BQU8sSUFBSSxHQUFHO0FBQ2QsYUFBTyxFQUFFLE1BQU0sUUFBUSxLQUFLO0FBQUEsYUFDdkIsT0FBTyxJQUFJLEdBQUc7QUFDbkIsYUFBTyxFQUFFLE1BQU0sUUFBUSxLQUFLO0FBQUEsYUFDdkIsT0FBTyxJQUFJLEdBQUc7QUFDbkIsYUFBTyxFQUFFLE1BQU0sT0FBTyxLQUFLO0FBQUEsYUFDdEIsT0FBTyxJQUFJLEdBQUc7QUFDbkIsYUFBTyxlQUFlLFFBQVEsSUFBSTtBQUFBO0FBRWxDO0FBQUEsRUFDUjtBQUNBLFNBQU87QUFDWDtBQUNBLFNBQVMsU0FBUyxRQUFRO0FBQ3RCLE1BQUksS0FBSyxLQUFLLE9BQU8sSUFBSTtBQUNyQixXQUFPLElBQUksMkJBQTJCLE9BQU8sT0FBTyxHQUFHO0FBQzNELE1BQUksU0FBUyxPQUFPLE9BQU8sSUFBSTtBQUMvQixTQUFPO0FBQ1AsU0FBTztBQUNYO0FBQ0EsU0FBUyxlQUFlLFFBQVEsTUFBTTtBQUNsQyxNQUFJQyxPQUFNLFNBQVMsTUFBTSxHQUFHQyxPQUFNRDtBQUNsQyxNQUFJLE9BQU8sSUFBSSxHQUFHLEdBQUc7QUFDakIsUUFBSSxPQUFPLFFBQVE7QUFDZixNQUFBQyxPQUFNLFNBQVMsTUFBTTtBQUFBO0FBRXJCLE1BQUFBLE9BQU07QUFBQSxFQUNkO0FBQ0EsTUFBSSxDQUFDLE9BQU8sSUFBSSxHQUFHO0FBQ2YsV0FBTyxJQUFJLHVCQUF1QjtBQUN0QyxTQUFPLEVBQUUsTUFBTSxTQUFTLEtBQUFELE1BQUssS0FBQUMsTUFBSyxLQUFLO0FBQzNDO0FBQ0EsU0FBUyxZQUFZLFFBQVEsTUFBTTtBQUMvQixNQUFJLFFBQVEsT0FBTyxXQUFXLE9BQU8sTUFBTSxJQUFJO0FBQy9DLE1BQUk7QUFDQSxXQUFPLENBQUMsSUFBSTtBQUNoQixNQUFJLFNBQVMsQ0FBQztBQUNkLFdBQVMsWUFBWSxPQUFPO0FBQ3hCLFFBQUlDLFFBQU8sTUFBTSxRQUFRO0FBQ3pCLFFBQUlBLE1BQUssT0FBTyxRQUFRLElBQUksSUFBSTtBQUM1QixhQUFPLEtBQUtBLEtBQUk7QUFBQSxFQUN4QjtBQUNBLE1BQUksT0FBTyxVQUFVO0FBQ2pCLFdBQU8sSUFBSSw0QkFBNEIsT0FBTyxTQUFTO0FBQzNELFNBQU87QUFDWDtBQUNBLFNBQVMsY0FBYyxRQUFRO0FBQzNCLE1BQUksT0FBTyxJQUFJLEdBQUcsR0FBRztBQUNqQixRQUFJLE9BQU8sVUFBVSxNQUFNO0FBQzNCLFFBQUksQ0FBQyxPQUFPLElBQUksR0FBRztBQUNmLGFBQU8sSUFBSSx1QkFBdUI7QUFDdEMsV0FBTztBQUFBLEVBQ1gsV0FDUyxDQUFDLEtBQUssS0FBSyxPQUFPLElBQUksR0FBRztBQUM5QixRQUFJLFFBQVEsWUFBWSxRQUFRLE9BQU8sSUFBSSxFQUFFLElBQUksVUFBUTtBQUNyRCxVQUFJLE9BQU8sVUFBVTtBQUNqQixlQUFPLFNBQVMsS0FBSztBQUFBLGVBQ2hCLE9BQU8sVUFBVSxLQUFLO0FBQzNCLGVBQU8sSUFBSSxpQ0FBaUM7QUFDaEQsYUFBTyxFQUFFLE1BQU0sUUFBUSxPQUFPLEtBQUs7QUFBQSxJQUN2QyxDQUFDO0FBQ0QsV0FBTztBQUNQLFdBQU8sTUFBTSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLFVBQVUsTUFBTTtBQUFBLEVBQ2xFLE9BQ0s7QUFDRCxXQUFPLElBQUksdUJBQXVCLE9BQU8sT0FBTyxHQUFHO0FBQUEsRUFDdkQ7QUFDSjtBQVdBLFNBQVMsSUFBSSxNQUFNO0FBQ2YsTUFBSUMsT0FBTSxDQUFDLENBQUMsQ0FBQztBQUNiLFVBQVEsUUFBUSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDaEMsU0FBT0E7QUFDUCxXQUFTLE9BQU87QUFBRSxXQUFPQSxLQUFJLEtBQUssQ0FBQyxDQUFDLElBQUk7QUFBQSxFQUFHO0FBQzNDLFdBQVMsS0FBS2pCLE9BQU0sSUFBSSxNQUFNO0FBQzFCLFFBQUlrQixRQUFPLEVBQUUsTUFBTSxHQUFHO0FBQ3RCLElBQUFELEtBQUlqQixLQUFJLEVBQUUsS0FBS2tCLEtBQUk7QUFDbkIsV0FBT0E7QUFBQSxFQUNYO0FBQ0EsV0FBUyxRQUFRLE9BQU8sSUFBSTtBQUN4QixVQUFNLFFBQVEsQ0FBQUEsVUFBUUEsTUFBSyxLQUFLLEVBQUU7QUFBQSxFQUN0QztBQUNBLFdBQVMsUUFBUUMsT0FBTW5CLE9BQU07QUFDekIsUUFBSW1CLE1BQUssUUFBUSxVQUFVO0FBQ3ZCLGFBQU9BLE1BQUssTUFBTSxPQUFPLENBQUMsS0FBS0EsVUFBUyxJQUFJLE9BQU8sUUFBUUEsT0FBTW5CLEtBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUFBLElBQy9FLFdBQ1NtQixNQUFLLFFBQVEsT0FBTztBQUN6QixlQUFTLElBQUksS0FBSSxLQUFLO0FBQ2xCLFlBQUksT0FBTyxRQUFRQSxNQUFLLE1BQU0sQ0FBQyxHQUFHbkIsS0FBSTtBQUN0QyxZQUFJLEtBQUttQixNQUFLLE1BQU0sU0FBUztBQUN6QixpQkFBTztBQUNYLGdCQUFRLE1BQU1uQixRQUFPLEtBQUssQ0FBQztBQUFBLE1BQy9CO0FBQUEsSUFDSixXQUNTbUIsTUFBSyxRQUFRLFFBQVE7QUFDMUIsVUFBSSxPQUFPLEtBQUs7QUFDaEIsV0FBS25CLE9BQU0sSUFBSTtBQUNmLGNBQVEsUUFBUW1CLE1BQUssTUFBTSxJQUFJLEdBQUcsSUFBSTtBQUN0QyxhQUFPLENBQUMsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUN0QixXQUNTQSxNQUFLLFFBQVEsUUFBUTtBQUMxQixVQUFJLE9BQU8sS0FBSztBQUNoQixjQUFRLFFBQVFBLE1BQUssTUFBTW5CLEtBQUksR0FBRyxJQUFJO0FBQ3RDLGNBQVEsUUFBUW1CLE1BQUssTUFBTSxJQUFJLEdBQUcsSUFBSTtBQUN0QyxhQUFPLENBQUMsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUN0QixXQUNTQSxNQUFLLFFBQVEsT0FBTztBQUN6QixhQUFPLENBQUMsS0FBS25CLEtBQUksQ0FBQyxFQUFFLE9BQU8sUUFBUW1CLE1BQUssTUFBTW5CLEtBQUksQ0FBQztBQUFBLElBQ3ZELFdBQ1NtQixNQUFLLFFBQVEsU0FBUztBQUMzQixVQUFJLE1BQU1uQjtBQUNWLGVBQVMsSUFBSSxHQUFHLElBQUltQixNQUFLLEtBQUssS0FBSztBQUMvQixZQUFJLE9BQU8sS0FBSztBQUNoQixnQkFBUSxRQUFRQSxNQUFLLE1BQU0sR0FBRyxHQUFHLElBQUk7QUFDckMsY0FBTTtBQUFBLE1BQ1Y7QUFDQSxVQUFJQSxNQUFLLE9BQU8sSUFBSTtBQUNoQixnQkFBUSxRQUFRQSxNQUFLLE1BQU0sR0FBRyxHQUFHLEdBQUc7QUFBQSxNQUN4QyxPQUNLO0FBQ0QsaUJBQVMsSUFBSUEsTUFBSyxLQUFLLElBQUlBLE1BQUssS0FBSyxLQUFLO0FBQ3RDLGNBQUksT0FBTyxLQUFLO0FBQ2hCLGVBQUssS0FBSyxJQUFJO0FBQ2Qsa0JBQVEsUUFBUUEsTUFBSyxNQUFNLEdBQUcsR0FBRyxJQUFJO0FBQ3JDLGdCQUFNO0FBQUEsUUFDVjtBQUFBLE1BQ0o7QUFDQSxhQUFPLENBQUMsS0FBSyxHQUFHLENBQUM7QUFBQSxJQUNyQixXQUNTQSxNQUFLLFFBQVEsUUFBUTtBQUMxQixhQUFPLENBQUMsS0FBS25CLE9BQU0sUUFBV21CLE1BQUssS0FBSyxDQUFDO0FBQUEsSUFDN0MsT0FDSztBQUNELFlBQU0sSUFBSSxNQUFNLG1CQUFtQjtBQUFBLElBQ3ZDO0FBQUEsRUFDSjtBQUNKO0FBQ0EsU0FBUyxJQUFJLEdBQUcsR0FBRztBQUFFLFNBQU8sSUFBSTtBQUFHO0FBSW5DLFNBQVMsU0FBU0YsTUFBSyxNQUFNO0FBQ3pCLE1BQUksU0FBUyxDQUFDO0FBQ2QsT0FBSyxJQUFJO0FBQ1QsU0FBTyxPQUFPLEtBQUssR0FBRztBQUN0QixXQUFTLEtBQUtHLE9BQU07QUFDaEIsUUFBSSxRQUFRSCxLQUFJRyxLQUFJO0FBQ3BCLFFBQUksTUFBTSxVQUFVLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUMvQixhQUFPLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRTtBQUMzQixXQUFPLEtBQUtBLEtBQUk7QUFDaEIsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxVQUFJLEVBQUUsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO0FBQzFCLFVBQUksQ0FBQyxRQUFRLE9BQU8sUUFBUSxFQUFFLEtBQUs7QUFDL0IsYUFBSyxFQUFFO0FBQUEsSUFDZjtBQUFBLEVBQ0o7QUFDSjtBQUlBLFNBQVMsSUFBSUgsTUFBSztBQUNkLE1BQUksVUFBVSx1QkFBTyxPQUFPLElBQUk7QUFDaEMsU0FBTyxRQUFRLFNBQVNBLE1BQUssQ0FBQyxDQUFDO0FBQy9CLFdBQVMsUUFBUSxRQUFRO0FBQ3JCLFFBQUksTUFBTSxDQUFDO0FBQ1gsV0FBTyxRQUFRLFVBQVE7QUFDbkIsTUFBQUEsS0FBSSxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU07QUFDaEMsWUFBSSxDQUFDO0FBQ0Q7QUFDSixZQUFJO0FBQ0osaUJBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRO0FBQzVCLGNBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLO0FBQ2Isa0JBQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN0QixpQkFBU0EsTUFBSyxFQUFFLEVBQUUsUUFBUSxDQUFBRyxVQUFRO0FBQzlCLGNBQUksQ0FBQztBQUNELGdCQUFJLEtBQUssQ0FBQyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDN0IsY0FBSSxJQUFJLFFBQVFBLEtBQUksS0FBSztBQUNyQixnQkFBSSxLQUFLQSxLQUFJO0FBQUEsUUFDckIsQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0wsQ0FBQztBQUNELFFBQUksUUFBUSxRQUFRLE9BQU8sS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLGFBQWEsT0FBTyxRQUFRSCxLQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUU7QUFDNUYsYUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNqQyxVQUFJSSxVQUFTLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFDL0IsWUFBTSxLQUFLLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLFFBQVFBLFFBQU8sS0FBSyxHQUFHLENBQUMsS0FBSyxRQUFRQSxPQUFNLEVBQUUsQ0FBQztBQUFBLElBQzNGO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUNBLFNBQVMsaUJBQWlCLE9BQU8sUUFBUTtBQUNyQyxXQUFTLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEQsUUFBSSxRQUFRLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLFVBQVUsUUFBUSxDQUFDO0FBQ3RELGFBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxLQUFLLFFBQVEsS0FBSztBQUN4QyxVQUFJLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTSxLQUFLLENBQUM7QUFDakMsWUFBTSxLQUFLLEtBQUssSUFBSTtBQUNwQixVQUFJLFFBQVEsRUFBRSxLQUFLLFVBQVUsS0FBSyxpQkFBaUI7QUFDL0MsZUFBTztBQUNYLFVBQUksS0FBSyxRQUFRLElBQUksS0FBSztBQUN0QixhQUFLLEtBQUssSUFBSTtBQUFBLElBQ3RCO0FBQ0EsUUFBSTtBQUNBLGFBQU8sSUFBSSxpQ0FBaUMsTUFBTSxLQUFLLElBQUksSUFBSSxnRkFBZ0Y7QUFBQSxFQUN2SjtBQUNKO0FBTUEsU0FBUyxhQUFhLE9BQU87QUFDekIsTUFBSUMsWUFBVyx1QkFBTyxPQUFPLElBQUk7QUFDakMsV0FBUyxZQUFZLE9BQU87QUFDeEIsUUFBSSxPQUFPLE1BQU0sUUFBUTtBQUN6QixRQUFJLENBQUMsS0FBSztBQUNOLGFBQU87QUFDWCxJQUFBQSxVQUFTLFFBQVEsSUFBSSxLQUFLO0FBQUEsRUFDOUI7QUFDQSxTQUFPQTtBQUNYO0FBQ0EsU0FBUyxhQUFhLE9BQU8sT0FBTztBQUNoQyxNQUFJLFFBQVEsdUJBQU8sT0FBTyxJQUFJO0FBQzlCLFdBQVMsUUFBUSxPQUFPO0FBQ3BCLFFBQUksUUFBUSxTQUFTLE1BQU0sSUFBSTtBQUMvQixRQUFJLFVBQVUsUUFBVztBQUNyQixVQUFJLE9BQU8sTUFBTSxJQUFJO0FBQ3JCLFVBQUksS0FBSztBQUNMLGdCQUFRLEtBQUs7QUFBQTtBQUViLGNBQU0sSUFBSSxXQUFXLHFDQUFxQyxJQUFJO0FBQUEsSUFDdEU7QUFDQSxVQUFNLElBQUksSUFBSTtBQUFBLEVBQ2xCO0FBQ0EsU0FBTztBQUNYO0FBQ0EsU0FBUyxVQUFVLE9BQU87QUFDdEIsTUFBSSxTQUFTLHVCQUFPLE9BQU8sSUFBSTtBQUMvQixNQUFJO0FBQ0EsYUFBUyxRQUFRO0FBQ2IsYUFBTyxJQUFJLElBQUksSUFBSSxVQUFVLE1BQU0sSUFBSSxDQUFDO0FBQ2hELFNBQU87QUFDWDtBQU9BLElBQU0sV0FBTixNQUFNLFVBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlYLFlBSUEsTUFJQSxRQUlBLE1BQU07QUFDRixTQUFLLE9BQU87QUFDWixTQUFLLFNBQVM7QUFDZCxTQUFLLE9BQU87QUFLWixTQUFLLFVBQVU7QUFDZixTQUFLLFNBQVMsS0FBSyxRQUFRLEtBQUssTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3BELFNBQUssUUFBUSxVQUFVLEtBQUssS0FBSztBQUNqQyxTQUFLLGVBQWUsYUFBYSxLQUFLLEtBQUs7QUFDM0MsU0FBSyxlQUFlO0FBQ3BCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssVUFBVSxFQUFFLEtBQUssVUFBVSxRQUFRO0FBQ3hDLFNBQUssU0FBUyxRQUFRO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksV0FBVztBQUFFLFdBQU8sQ0FBQyxLQUFLO0FBQUEsRUFBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLdkMsSUFBSSxjQUFjO0FBQUUsV0FBTyxLQUFLLFdBQVcsS0FBSztBQUFBLEVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkvRCxJQUFJLFNBQVM7QUFBRSxXQUFPLEtBQUssZ0JBQWdCLGFBQWE7QUFBQSxFQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUsvRCxJQUFJLFNBQVM7QUFBRSxXQUFPLEtBQUssVUFBVSxDQUFDLENBQUMsS0FBSyxLQUFLO0FBQUEsRUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXZELElBQUksYUFBYTtBQUNiLFdBQU8sS0FBSyxLQUFLLGVBQWUsS0FBSyxLQUFLLE9BQU8sUUFBUTtBQUFBLEVBQzdEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxtQkFBbUI7QUFDZixhQUFTLEtBQUssS0FBSztBQUNmLFVBQUksS0FBSyxNQUFNLENBQUMsRUFBRTtBQUNkLGVBQU87QUFDZixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxrQkFBa0IsT0FBTztBQUNyQixXQUFPLFFBQVEsU0FBUyxLQUFLLGFBQWEsV0FBVyxNQUFNLFlBQVk7QUFBQSxFQUMzRTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsYUFBYSxPQUFPO0FBQ2hCLFFBQUksQ0FBQyxTQUFTLEtBQUs7QUFDZixhQUFPLEtBQUs7QUFBQTtBQUVaLGFBQU8sYUFBYSxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsT0FBTyxRQUFRLE1BQU0sU0FBUyxPQUFPO0FBQ2pDLFFBQUksS0FBSztBQUNMLFlBQU0sSUFBSSxNQUFNLDRDQUE0QztBQUNoRSxXQUFPLElBQUksS0FBSyxNQUFNLEtBQUssYUFBYSxLQUFLLEdBQUcsU0FBUyxLQUFLLE9BQU8sR0FBRyxLQUFLLFFBQVEsS0FBSyxDQUFDO0FBQUEsRUFDL0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxjQUFjLFFBQVEsTUFBTSxTQUFTLE9BQU87QUFDeEMsY0FBVSxTQUFTLEtBQUssT0FBTztBQUMvQixTQUFLLGFBQWEsT0FBTztBQUN6QixXQUFPLElBQUksS0FBSyxNQUFNLEtBQUssYUFBYSxLQUFLLEdBQUcsU0FBUyxLQUFLLFFBQVEsS0FBSyxDQUFDO0FBQUEsRUFDaEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxjQUFjLFFBQVEsTUFBTSxTQUFTLE9BQU87QUFDeEMsWUFBUSxLQUFLLGFBQWEsS0FBSztBQUMvQixjQUFVLFNBQVMsS0FBSyxPQUFPO0FBQy9CLFFBQUksUUFBUSxNQUFNO0FBQ2QsVUFBSSxTQUFTLEtBQUssYUFBYSxXQUFXLE9BQU87QUFDakQsVUFBSSxDQUFDO0FBQ0QsZUFBTztBQUNYLGdCQUFVLE9BQU8sT0FBTyxPQUFPO0FBQUEsSUFDbkM7QUFDQSxRQUFJLFVBQVUsS0FBSyxhQUFhLGNBQWMsT0FBTztBQUNyRCxRQUFJLFFBQVEsV0FBVyxRQUFRLFdBQVcsU0FBUyxPQUFPLElBQUk7QUFDOUQsUUFBSSxDQUFDO0FBQ0QsYUFBTztBQUNYLFdBQU8sSUFBSSxLQUFLLE1BQU0sT0FBTyxRQUFRLE9BQU8sS0FBSyxHQUFHLEtBQUssUUFBUSxLQUFLLENBQUM7QUFBQSxFQUMzRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxhQUFhLFNBQVM7QUFDbEIsUUFBSSxTQUFTLEtBQUssYUFBYSxjQUFjLE9BQU87QUFDcEQsUUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPO0FBQ25CLGFBQU87QUFDWCxhQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsWUFBWTtBQUNwQyxVQUFJLENBQUMsS0FBSyxZQUFZLFFBQVEsTUFBTSxDQUFDLEVBQUUsS0FBSztBQUN4QyxlQUFPO0FBQ2YsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxhQUFhLFNBQVM7QUFDbEIsUUFBSSxDQUFDLEtBQUssYUFBYSxPQUFPO0FBQzFCLFlBQU0sSUFBSSxXQUFXLDRCQUE0QixLQUFLLElBQUksS0FBSyxRQUFRLFNBQVMsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFBQSxFQUN4RztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsZUFBZSxVQUFVO0FBQ3JCLFdBQU8sS0FBSyxXQUFXLFFBQVEsS0FBSyxRQUFRLFFBQVEsUUFBUSxJQUFJO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFlBQVksT0FBTztBQUNmLFFBQUksS0FBSyxXQUFXO0FBQ2hCLGFBQU87QUFDWCxhQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUTtBQUM5QixVQUFJLENBQUMsS0FBSyxlQUFlLE1BQU0sQ0FBQyxFQUFFLElBQUk7QUFDbEMsZUFBTztBQUNmLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxhQUFhLE9BQU87QUFDaEIsUUFBSSxLQUFLLFdBQVc7QUFDaEIsYUFBTztBQUNYLFFBQUlsQjtBQUNKLGFBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsVUFBSSxDQUFDLEtBQUssZUFBZSxNQUFNLENBQUMsRUFBRSxJQUFJLEdBQUc7QUFDckMsWUFBSSxDQUFDQTtBQUNELFVBQUFBLFFBQU8sTUFBTSxNQUFNLEdBQUcsQ0FBQztBQUFBLE1BQy9CLFdBQ1NBLE9BQU07QUFDWCxRQUFBQSxNQUFLLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBQSxNQUN0QjtBQUFBLElBQ0o7QUFDQSxXQUFPLENBQUNBLFFBQU8sUUFBUUEsTUFBSyxTQUFTQSxRQUFPLEtBQUs7QUFBQSxFQUNyRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsT0FBTyxRQUFRLE9BQU8sUUFBUTtBQUMxQixRQUFJLFNBQVMsdUJBQU8sT0FBTyxJQUFJO0FBQy9CLFVBQU0sUUFBUSxDQUFDLE1BQU0sU0FBUyxPQUFPLElBQUksSUFBSSxJQUFJLFVBQVMsTUFBTSxRQUFRLElBQUksQ0FBQztBQUM3RSxRQUFJLFVBQVUsT0FBTyxLQUFLLFdBQVc7QUFDckMsUUFBSSxDQUFDLE9BQU8sT0FBTztBQUNmLFlBQU0sSUFBSSxXQUFXLDJDQUEyQyxVQUFVLElBQUk7QUFDbEYsUUFBSSxDQUFDLE9BQU87QUFDUixZQUFNLElBQUksV0FBVyxrQ0FBa0M7QUFDM0QsYUFBUyxLQUFLLE9BQU8sS0FBSztBQUN0QixZQUFNLElBQUksV0FBVywrQ0FBK0M7QUFDeEUsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUVBLElBQU0sWUFBTixNQUFnQjtBQUFBLEVBQ1osWUFBWSxTQUFTO0FBQ2pCLFNBQUssYUFBYSxPQUFPLFVBQVUsZUFBZSxLQUFLLFNBQVMsU0FBUztBQUN6RSxTQUFLLFVBQVUsUUFBUTtBQUFBLEVBQzNCO0FBQUEsRUFDQSxJQUFJLGFBQWE7QUFDYixXQUFPLENBQUMsS0FBSztBQUFBLEVBQ2pCO0FBQ0o7QUFRQSxJQUFNLFdBQU4sTUFBTSxVQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWCxZQUlBLE1BSUEsTUFJQSxRQUlBLE1BQU07QUFDRixTQUFLLE9BQU87QUFDWixTQUFLLE9BQU87QUFDWixTQUFLLFNBQVM7QUFDZCxTQUFLLE9BQU87QUFDWixTQUFLLFFBQVEsVUFBVSxLQUFLLEtBQUs7QUFDakMsU0FBSyxXQUFXO0FBQ2hCLFFBQUlrQixZQUFXLGFBQWEsS0FBSyxLQUFLO0FBQ3RDLFNBQUssV0FBV0EsWUFBVyxJQUFJLEtBQUssTUFBTUEsU0FBUSxJQUFJO0FBQUEsRUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxPQUFPLFFBQVEsTUFBTTtBQUNqQixRQUFJLENBQUMsU0FBUyxLQUFLO0FBQ2YsYUFBTyxLQUFLO0FBQ2hCLFdBQU8sSUFBSSxLQUFLLE1BQU0sYUFBYSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQUEsRUFDekQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sUUFBUSxPQUFPLFFBQVE7QUFDMUIsUUFBSSxTQUFTLHVCQUFPLE9BQU8sSUFBSSxHQUFHLE9BQU87QUFDekMsVUFBTSxRQUFRLENBQUMsTUFBTSxTQUFTLE9BQU8sSUFBSSxJQUFJLElBQUksVUFBUyxNQUFNLFFBQVEsUUFBUSxJQUFJLENBQUM7QUFDckYsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsY0FBYyxLQUFLO0FBQ2YsYUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVE7QUFDNUIsVUFBSSxJQUFJLENBQUMsRUFBRSxRQUFRLE1BQU07QUFDckIsY0FBTSxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFDN0M7QUFBQSxNQUNKO0FBQ0osV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFFBQVEsS0FBSztBQUNULGFBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRO0FBQzVCLFVBQUksSUFBSSxDQUFDLEVBQUUsUUFBUTtBQUNmLGVBQU8sSUFBSSxDQUFDO0FBQUEsRUFDeEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsU0FBUyxPQUFPO0FBQ1osV0FBTyxLQUFLLFNBQVMsUUFBUSxLQUFLLElBQUk7QUFBQSxFQUMxQztBQUNKO0FBVUEsSUFBTSxTQUFOLE1BQWE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlULFlBQVksTUFBTTtBQU1kLFNBQUssU0FBUyx1QkFBTyxPQUFPLElBQUk7QUFDaEMsUUFBSSxlQUFlLEtBQUssT0FBTyxDQUFDO0FBQ2hDLGFBQVMsUUFBUTtBQUNiLG1CQUFhLElBQUksSUFBSSxLQUFLLElBQUk7QUFDbEMsaUJBQWEsUUFBUSxhQUFXLEtBQUssS0FBSyxLQUFLLEdBQzNDLGFBQWEsUUFBUSxhQUFXLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxHQUNyRCxLQUFLLFFBQVEsU0FBUyxRQUFRLEtBQUssS0FBSyxPQUFPLElBQUk7QUFDdkQsU0FBSyxRQUFRLFNBQVMsUUFBUSxLQUFLLEtBQUssT0FBTyxJQUFJO0FBQ25ELFFBQUksbUJBQW1CLHVCQUFPLE9BQU8sSUFBSTtBQUN6QyxhQUFTLFFBQVEsS0FBSyxPQUFPO0FBQ3pCLFVBQUksUUFBUSxLQUFLO0FBQ2IsY0FBTSxJQUFJLFdBQVcsT0FBTyxvQ0FBb0M7QUFDcEUsVUFBSSxPQUFPLEtBQUssTUFBTSxJQUFJLEdBQUcsY0FBYyxLQUFLLEtBQUssV0FBVyxJQUFJLFdBQVcsS0FBSyxLQUFLO0FBQ3pGLFdBQUssZUFBZSxpQkFBaUIsV0FBVyxNQUMzQyxpQkFBaUIsV0FBVyxJQUFJLGFBQWEsTUFBTSxhQUFhLEtBQUssS0FBSztBQUMvRSxXQUFLLGdCQUFnQixLQUFLLGFBQWE7QUFDdkMsV0FBSyxVQUFVLFlBQVksTUFBTSxPQUM3QixXQUFXLFlBQVksTUFBTSxTQUFTLE1BQU0sR0FBRyxDQUFDLElBQzVDLFlBQVksTUFBTSxDQUFDLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtBQUFBLElBQ3pEO0FBQ0EsYUFBUyxRQUFRLEtBQUssT0FBTztBQUN6QixVQUFJLE9BQU8sS0FBSyxNQUFNLElBQUksR0FBRyxPQUFPLEtBQUssS0FBSztBQUM5QyxXQUFLLFdBQVcsUUFBUSxPQUFPLENBQUMsSUFBSSxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksWUFBWSxNQUFNLEtBQUssTUFBTSxHQUFHLENBQUM7QUFBQSxJQUMvRjtBQUNBLFNBQUssZUFBZSxLQUFLLGFBQWEsS0FBSyxJQUFJO0FBQy9DLFNBQUssZUFBZSxLQUFLLGFBQWEsS0FBSyxJQUFJO0FBQy9DLFNBQUssY0FBYyxLQUFLLE1BQU0sS0FBSyxLQUFLLFdBQVcsS0FBSztBQUN4RCxTQUFLLE9BQU8sWUFBWSx1QkFBTyxPQUFPLElBQUk7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsS0FBSyxNQUFNLFFBQVEsTUFBTSxTQUFTLE9BQU87QUFDckMsUUFBSSxPQUFPLFFBQVE7QUFDZixhQUFPLEtBQUssU0FBUyxJQUFJO0FBQUEsYUFDcEIsRUFBRSxnQkFBZ0I7QUFDdkIsWUFBTSxJQUFJLFdBQVcsd0JBQXdCLElBQUk7QUFBQSxhQUM1QyxLQUFLLFVBQVU7QUFDcEIsWUFBTSxJQUFJLFdBQVcsMkNBQTJDLEtBQUssT0FBTyxHQUFHO0FBQ25GLFdBQU8sS0FBSyxjQUFjLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFDbkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsS0FBSyxNQUFNLE9BQU87QUFDZCxRQUFJLE9BQU8sS0FBSyxNQUFNO0FBQ3RCLFdBQU8sSUFBSSxTQUFTLE1BQU0sS0FBSyxjQUFjLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FBQztBQUFBLEVBQzFFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxLQUFLLE1BQU0sT0FBTztBQUNkLFFBQUksT0FBTyxRQUFRO0FBQ2YsYUFBTyxLQUFLLE1BQU0sSUFBSTtBQUMxQixXQUFPLEtBQUssT0FBTyxLQUFLO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsYUFBYWQsT0FBTTtBQUNmLFdBQU8sS0FBSyxTQUFTLE1BQU1BLEtBQUk7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxhQUFhQSxPQUFNO0FBQ2YsV0FBTyxLQUFLLFNBQVMsTUFBTUEsS0FBSTtBQUFBLEVBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxTQUFTLE1BQU07QUFDWCxRQUFJSCxTQUFRLEtBQUssTUFBTSxJQUFJO0FBQzNCLFFBQUksQ0FBQ0E7QUFDRCxZQUFNLElBQUksV0FBVyx3QkFBd0IsSUFBSTtBQUNyRCxXQUFPQTtBQUFBLEVBQ1g7QUFDSjtBQUNBLFNBQVMsWUFBWSxRQUFRLE9BQU87QUFDaEMsTUFBSUEsU0FBUSxDQUFDO0FBQ2IsV0FBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxRQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsT0FBTyxPQUFPLE1BQU0sSUFBSSxHQUFHLEtBQUs7QUFDckQsUUFBSSxNQUFNO0FBQ04sTUFBQUEsT0FBTSxLQUFLLElBQUk7QUFBQSxJQUNuQixPQUNLO0FBQ0QsZUFBUyxRQUFRLE9BQU8sT0FBTztBQUMzQixZQUFJa0IsUUFBTyxPQUFPLE1BQU0sSUFBSTtBQUM1QixZQUFJLFFBQVEsT0FBUUEsTUFBSyxLQUFLLFNBQVNBLE1BQUssS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFLFFBQVEsSUFBSSxJQUFJO0FBQzlFLFVBQUFsQixPQUFNLEtBQUssS0FBS2tCLEtBQUk7QUFBQSxNQUM1QjtBQUFBLElBQ0o7QUFDQSxRQUFJLENBQUM7QUFDRCxZQUFNLElBQUksWUFBWSx5QkFBeUIsTUFBTSxDQUFDLElBQUksR0FBRztBQUFBLEVBQ3JFO0FBQ0EsU0FBT2xCO0FBQ1g7QUFPQSxJQUFNLFlBQU4sTUFBTSxXQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtaLFlBSUEsUUFLQSxPQUFPO0FBQ0gsU0FBSyxTQUFTO0FBQ2QsU0FBSyxRQUFRO0FBSWIsU0FBSyxPQUFPLENBQUM7QUFJYixTQUFLLFNBQVMsQ0FBQztBQUNmLFVBQU0sUUFBUSxVQUFRO0FBQ2xCLFVBQUksS0FBSztBQUNMLGFBQUssS0FBSyxLQUFLLElBQUk7QUFBQSxlQUNkLEtBQUs7QUFDVixhQUFLLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDN0IsQ0FBQztBQUVELFNBQUssaUJBQWlCLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQW1CLE9BQUs7QUFDdkMsVUFBSSxDQUFDLGFBQWEsS0FBS0EsR0FBRSxHQUFHLEtBQUssQ0FBQ0EsR0FBRTtBQUNoQyxlQUFPO0FBQ1gsVUFBSSxPQUFPLE9BQU8sTUFBTUEsR0FBRSxJQUFJO0FBQzlCLGFBQU8sS0FBSyxhQUFhLFVBQVUsSUFBSTtBQUFBLElBQzNDLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxNQUFNLEtBQUssVUFBVSxDQUFDLEdBQUc7QUFDckIsUUFBSSxVQUFVLElBQUksYUFBYSxNQUFNLFNBQVMsS0FBSztBQUNuRCxZQUFRLE9BQU8sS0FBSyxRQUFRLE1BQU0sUUFBUSxFQUFFO0FBQzVDLFdBQU8sUUFBUSxPQUFPO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxXQUFXLEtBQUssVUFBVSxDQUFDLEdBQUc7QUFDMUIsUUFBSSxVQUFVLElBQUksYUFBYSxNQUFNLFNBQVMsSUFBSTtBQUNsRCxZQUFRLE9BQU8sS0FBSyxRQUFRLE1BQU0sUUFBUSxFQUFFO0FBQzVDLFdBQU8sTUFBTSxRQUFRLFFBQVEsT0FBTyxDQUFDO0FBQUEsRUFDekM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFNBQVMsS0FBSyxTQUFTLE9BQU87QUFDMUIsYUFBUyxJQUFJLFFBQVEsS0FBSyxLQUFLLFFBQVEsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSyxRQUFRLEtBQUs7QUFDOUUsVUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDO0FBQ3RCLFVBQUksUUFBUSxLQUFLLEtBQUssR0FBRyxNQUNwQixLQUFLLGNBQWMsVUFBYSxJQUFJLGdCQUFnQixLQUFLLGVBQ3pELENBQUMsS0FBSyxXQUFXLFFBQVEsZUFBZSxLQUFLLE9BQU8sSUFBSTtBQUN6RCxZQUFJLEtBQUssVUFBVTtBQUNmLGNBQUksU0FBUyxLQUFLLFNBQVMsR0FBRztBQUM5QixjQUFJLFdBQVc7QUFDWDtBQUNKLGVBQUssUUFBUSxVQUFVO0FBQUEsUUFDM0I7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxXQUFXLE1BQU0sT0FBTyxTQUFTLE9BQU87QUFDcEMsYUFBUyxJQUFJLFFBQVEsS0FBSyxPQUFPLFFBQVEsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssT0FBTyxRQUFRLEtBQUs7QUFDbEYsVUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLEdBQUdDLFNBQVEsS0FBSztBQUN4QyxVQUFJQSxPQUFNLFFBQVEsSUFBSSxLQUFLLEtBQ3ZCLEtBQUssV0FBVyxDQUFDLFFBQVEsZUFBZSxLQUFLLE9BQU87QUFBQTtBQUFBO0FBQUEsTUFJcERBLE9BQU0sU0FBUyxLQUFLLFdBQ2ZBLE9BQU0sV0FBVyxLQUFLLE1BQU0sS0FBSyxNQUFNQSxPQUFNLE1BQU0sS0FBSyxTQUFTLENBQUMsS0FBSztBQUM1RTtBQUNKLFVBQUksS0FBSyxVQUFVO0FBQ2YsWUFBSSxTQUFTLEtBQUssU0FBUyxLQUFLO0FBQ2hDLFlBQUksV0FBVztBQUNYO0FBQ0osYUFBSyxRQUFRLFVBQVU7QUFBQSxNQUMzQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsT0FBTyxZQUFZLFFBQVE7QUFDdkIsUUFBSSxTQUFTLENBQUM7QUFDZCxhQUFTLE9BQU8sTUFBTTtBQUNsQixVQUFJLFdBQVcsS0FBSyxZQUFZLE9BQU8sS0FBSyxLQUFLLFVBQVUsSUFBSTtBQUMvRCxhQUFPLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDM0IsWUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLGVBQWUsS0FBSyxZQUFZLE9BQU8sS0FBSyxLQUFLO0FBQ3ZFLFlBQUksZUFBZTtBQUNmO0FBQUEsTUFDUjtBQUNBLGFBQU8sT0FBTyxHQUFHLEdBQUcsSUFBSTtBQUFBLElBQzVCO0FBQ0EsYUFBUyxRQUFRLE9BQU8sT0FBTztBQUMzQixVQUFJLFFBQVEsT0FBTyxNQUFNLElBQUksRUFBRSxLQUFLO0FBQ3BDLFVBQUk7QUFDQSxjQUFNLFFBQVEsVUFBUTtBQUNsQixpQkFBTyxPQUFPLEtBQUssSUFBSSxDQUFDO0FBQ3hCLGNBQUksRUFBRSxLQUFLLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFDbkMsaUJBQUssT0FBTztBQUFBLFFBQ3BCLENBQUM7QUFBQSxJQUNUO0FBQ0EsYUFBUyxRQUFRLE9BQU8sT0FBTztBQUMzQixVQUFJLFFBQVEsT0FBTyxNQUFNLElBQUksRUFBRSxLQUFLO0FBQ3BDLFVBQUk7QUFDQSxjQUFNLFFBQVEsVUFBUTtBQUNsQixpQkFBTyxPQUFPLEtBQUssSUFBSSxDQUFDO0FBQ3hCLGNBQUksRUFBRSxLQUFLLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFDbkMsaUJBQUssT0FBTztBQUFBLFFBQ3BCLENBQUM7QUFBQSxJQUNUO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxPQUFPLFdBQVcsUUFBUTtBQUN0QixXQUFPLE9BQU8sT0FBTyxjQUNoQixPQUFPLE9BQU8sWUFBWSxJQUFJLFdBQVUsUUFBUSxXQUFVLFlBQVksTUFBTSxDQUFDO0FBQUEsRUFDdEY7QUFDSjtBQUNBLElBQU0sWUFBWTtBQUFBLEVBQ2QsU0FBUztBQUFBLEVBQU0sU0FBUztBQUFBLEVBQU0sT0FBTztBQUFBLEVBQU0sWUFBWTtBQUFBLEVBQU0sUUFBUTtBQUFBLEVBQ3JFLElBQUk7QUFBQSxFQUFNLEtBQUs7QUFBQSxFQUFNLElBQUk7QUFBQSxFQUFNLFVBQVU7QUFBQSxFQUFNLFlBQVk7QUFBQSxFQUFNLFFBQVE7QUFBQSxFQUN6RSxRQUFRO0FBQUEsRUFBTSxNQUFNO0FBQUEsRUFBTSxJQUFJO0FBQUEsRUFBTSxJQUFJO0FBQUEsRUFBTSxJQUFJO0FBQUEsRUFBTSxJQUFJO0FBQUEsRUFBTSxJQUFJO0FBQUEsRUFDdEUsSUFBSTtBQUFBLEVBQU0sUUFBUTtBQUFBLEVBQU0sUUFBUTtBQUFBLEVBQU0sSUFBSTtBQUFBLEVBQU0sSUFBSTtBQUFBLEVBQU0sVUFBVTtBQUFBLEVBQU0sSUFBSTtBQUFBLEVBQzlFLFFBQVE7QUFBQSxFQUFNLEdBQUc7QUFBQSxFQUFNLEtBQUs7QUFBQSxFQUFNLFNBQVM7QUFBQSxFQUFNLE9BQU87QUFBQSxFQUFNLE9BQU87QUFBQSxFQUFNLElBQUk7QUFDbkY7QUFDQSxJQUFNLGFBQWE7QUFBQSxFQUNmLE1BQU07QUFBQSxFQUFNLFVBQVU7QUFBQSxFQUFNLFFBQVE7QUFBQSxFQUFNLFFBQVE7QUFBQSxFQUFNLE9BQU87QUFBQSxFQUFNLE9BQU87QUFDaEY7QUFDQSxJQUFNLFdBQVcsRUFBRSxJQUFJLE1BQU0sSUFBSSxLQUFLO0FBRXRDLElBQU0sa0JBQWtCO0FBQXhCLElBQTJCLHVCQUF1QjtBQUFsRCxJQUFxRCxnQkFBZ0I7QUFDckUsU0FBUyxhQUFhLE1BQU0sb0JBQW9CYixPQUFNO0FBQ2xELE1BQUksc0JBQXNCO0FBQ3RCLFlBQVEscUJBQXFCLGtCQUFrQixNQUMxQyx1QkFBdUIsU0FBUyx1QkFBdUI7QUFDaEUsU0FBTyxRQUFRLEtBQUssY0FBYyxRQUFRLGtCQUFrQix1QkFBdUJBLFFBQU8sQ0FBQztBQUMvRjtBQUNBLElBQU0sY0FBTixNQUFrQjtBQUFBLEVBQ2QsWUFBWSxNQUFNLE9BRWxCLE9BRUEsY0FBYyxPQUFPLE9BQU8sU0FBUztBQUNqQyxTQUFLLE9BQU87QUFDWixTQUFLLFFBQVE7QUFDYixTQUFLLFFBQVE7QUFDYixTQUFLLGVBQWU7QUFDcEIsU0FBSyxRQUFRO0FBQ2IsU0FBSyxVQUFVO0FBQ2YsU0FBSyxVQUFVLENBQUM7QUFFaEIsU0FBSyxjQUFjLEtBQUs7QUFFeEIsU0FBSyxhQUFhLENBQUM7QUFDbkIsU0FBSyxRQUFRLFVBQVUsVUFBVSxnQkFBZ0IsT0FBTyxLQUFLO0FBQUEsRUFDakU7QUFBQSxFQUNBLGFBQWEsTUFBTTtBQUNmLFFBQUksQ0FBQyxLQUFLLE9BQU87QUFDYixVQUFJLENBQUMsS0FBSztBQUNOLGVBQU8sQ0FBQztBQUNaLFVBQUksT0FBTyxLQUFLLEtBQUssYUFBYSxXQUFXLFNBQVMsS0FBSyxJQUFJLENBQUM7QUFDaEUsVUFBSSxNQUFNO0FBQ04sYUFBSyxRQUFRLEtBQUssS0FBSyxhQUFhLGNBQWMsSUFBSTtBQUFBLE1BQzFELE9BQ0s7QUFDRCxZQUFJVixTQUFRLEtBQUssS0FBSyxjQUFjd0I7QUFDcEMsWUFBSUEsUUFBT3hCLE9BQU0sYUFBYSxLQUFLLElBQUksR0FBRztBQUN0QyxlQUFLLFFBQVFBO0FBQ2IsaUJBQU93QjtBQUFBLFFBQ1gsT0FDSztBQUNELGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsV0FBTyxLQUFLLE1BQU0sYUFBYSxLQUFLLElBQUk7QUFBQSxFQUM1QztBQUFBLEVBQ0EsT0FBTyxTQUFTO0FBQ1osUUFBSSxFQUFFLEtBQUssVUFBVSxrQkFBa0I7QUFDbkMsVUFBSSxPQUFPLEtBQUssUUFBUSxLQUFLLFFBQVEsU0FBUyxDQUFDLEdBQUc7QUFDbEQsVUFBSSxRQUFRLEtBQUssV0FBVyxJQUFJLG9CQUFvQixLQUFLLEtBQUssSUFBSSxJQUFJO0FBQ2xFLFlBQUksT0FBTztBQUNYLFlBQUksS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDLEVBQUU7QUFDekIsZUFBSyxRQUFRLElBQUk7QUFBQTtBQUVqQixlQUFLLFFBQVEsS0FBSyxRQUFRLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxLQUFLLEtBQUssTUFBTSxHQUFHLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUFBLE1BQ2hIO0FBQUEsSUFDSjtBQUNBLFFBQUksVUFBVSxTQUFTLEtBQUssS0FBSyxPQUFPO0FBQ3hDLFFBQUksQ0FBQyxXQUFXLEtBQUs7QUFDakIsZ0JBQVUsUUFBUSxPQUFPLEtBQUssTUFBTSxXQUFXLFNBQVMsT0FBTyxJQUFJLENBQUM7QUFDeEUsV0FBTyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sS0FBSyxPQUFPLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFBQSxFQUMzRTtBQUFBLEVBQ0EsaUJBQWlCLE1BQU07QUFDbkIsYUFBUyxJQUFJLEtBQUssV0FBVyxTQUFTLEdBQUcsS0FBSyxHQUFHO0FBQzdDLFVBQUksS0FBSyxHQUFHLEtBQUssV0FBVyxDQUFDLENBQUM7QUFDMUIsZUFBTyxLQUFLLFdBQVcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQUEsRUFDakQ7QUFBQSxFQUNBLGFBQWEsVUFBVTtBQUNuQixhQUFTLElBQUksR0FBRyxVQUFVLEtBQUssY0FBYyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ2xFLFVBQUksT0FBTyxRQUFRLENBQUM7QUFDcEIsV0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLGVBQWUsS0FBSyxJQUFJLElBQUksYUFBYSxLQUFLLE1BQU0sUUFBUSxNQUNuRixDQUFDLEtBQUssUUFBUSxLQUFLLFdBQVcsR0FBRztBQUNqQyxhQUFLLGNBQWMsS0FBSyxTQUFTLEtBQUssV0FBVztBQUNqRCxhQUFLLGVBQWUsS0FBSyxjQUFjLEtBQUssWUFBWTtBQUFBLE1BQzVEO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUNBLGNBQWMsTUFBTTtBQUNoQixRQUFJLEtBQUs7QUFDTCxhQUFPLEtBQUssS0FBSztBQUNyQixRQUFJLEtBQUssUUFBUTtBQUNiLGFBQU8sS0FBSyxRQUFRLENBQUMsRUFBRTtBQUMzQixXQUFPLEtBQUssY0FBYyxDQUFDLFVBQVUsZUFBZSxLQUFLLFdBQVcsU0FBUyxZQUFZLENBQUM7QUFBQSxFQUM5RjtBQUNKO0FBQ0EsSUFBTSxlQUFOLE1BQW1CO0FBQUEsRUFDZixZQUVBLFFBRUEsU0FBUyxRQUFRO0FBQ2IsU0FBSyxTQUFTO0FBQ2QsU0FBSyxVQUFVO0FBQ2YsU0FBSyxTQUFTO0FBQ2QsU0FBSyxPQUFPO0FBQ1osUUFBSSxVQUFVLFFBQVEsU0FBUztBQUMvQixRQUFJLGFBQWEsYUFBYSxNQUFNLFFBQVEsb0JBQW9CLENBQUMsS0FBSyxTQUFTLGdCQUFnQjtBQUMvRixRQUFJO0FBQ0EsbUJBQWEsSUFBSSxZQUFZLFFBQVEsTUFBTSxRQUFRLE9BQU8sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFFBQVEsWUFBWSxRQUFRLEtBQUssY0FBYyxVQUFVO0FBQUEsYUFDMUk7QUFDTCxtQkFBYSxJQUFJLFlBQVksTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxNQUFNLFVBQVU7QUFBQTtBQUVyRixtQkFBYSxJQUFJLFlBQVksT0FBTyxPQUFPLGFBQWEsTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLE1BQU0sTUFBTSxVQUFVO0FBQzlHLFNBQUssUUFBUSxDQUFDLFVBQVU7QUFDeEIsU0FBSyxPQUFPLFFBQVE7QUFDcEIsU0FBSyxhQUFhO0FBQUEsRUFDdEI7QUFBQSxFQUNBLElBQUksTUFBTTtBQUNOLFdBQU8sS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPLEtBQUs7QUFDUixRQUFJLElBQUksWUFBWTtBQUNoQixXQUFLLFlBQVksR0FBRztBQUFBLGFBQ2YsSUFBSSxZQUFZO0FBQ3JCLFdBQUssV0FBVyxHQUFHO0FBQUEsRUFDM0I7QUFBQSxFQUNBLGVBQWUsS0FBSyxHQUFHO0FBQ25CLFFBQUlELFNBQVEsSUFBSSxhQUFhLE9BQU87QUFDcEMsUUFBSSxDQUFDQTtBQUNELGFBQU8sRUFBRTtBQUNiLFFBQUksUUFBUSxLQUFLLFdBQVcsWUFBWUEsTUFBSyxDQUFDO0FBQzlDLFFBQUksQ0FBQztBQUNEO0FBQ0osUUFBSSxDQUFDLFVBQVUsV0FBVyxJQUFJLE9BQU9FLE9BQU0sS0FBSztBQUNoRCxhQUFTLElBQUksR0FBRyxJQUFJLFlBQVksUUFBUTtBQUNwQyxXQUFLLGtCQUFrQixZQUFZLENBQUMsR0FBR0EsSUFBRztBQUM5QyxhQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUTtBQUNqQyxXQUFLLGVBQWUsU0FBUyxDQUFDLENBQUM7QUFDbkMsTUFBRTtBQUNGLGFBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRO0FBQ2pDLFdBQUssa0JBQWtCLFNBQVMsQ0FBQyxHQUFHQSxJQUFHO0FBQzNDLGFBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxRQUFRO0FBQ3BDLFdBQUssZUFBZSxZQUFZLENBQUMsQ0FBQztBQUFBLEVBQzFDO0FBQUEsRUFDQSxZQUFZLEtBQUs7QUFDYixRQUFJLFFBQVEsSUFBSTtBQUNoQixRQUFJQSxPQUFNLEtBQUs7QUFDZixRQUFJQSxLQUFJLFVBQVUsd0JBQ2RBLEtBQUksY0FBYyxHQUFHLEtBQ3JCLG1CQUFtQixLQUFLLEtBQUssR0FBRztBQUNoQyxVQUFJLEVBQUVBLEtBQUksVUFBVSxrQkFBa0I7QUFDbEMsZ0JBQVEsTUFBTSxRQUFRLHFCQUFxQixHQUFHO0FBSTlDLFlBQUksbUJBQW1CLEtBQUssS0FBSyxLQUFLLEtBQUssUUFBUSxLQUFLLE1BQU0sU0FBUyxHQUFHO0FBQ3RFLGNBQUksYUFBYUEsS0FBSSxRQUFRQSxLQUFJLFFBQVEsU0FBUyxDQUFDO0FBQ25ELGNBQUksZ0JBQWdCLElBQUk7QUFDeEIsY0FBSSxDQUFDLGNBQ0EsaUJBQWlCLGNBQWMsWUFBWSxRQUMzQyxXQUFXLFVBQVUsbUJBQW1CLEtBQUssV0FBVyxJQUFJO0FBQzdELG9CQUFRLE1BQU0sTUFBTSxDQUFDO0FBQUEsUUFDN0I7QUFBQSxNQUNKLFdBQ1MsRUFBRUEsS0FBSSxVQUFVLHVCQUF1QjtBQUM1QyxnQkFBUSxNQUFNLFFBQVEsYUFBYSxHQUFHO0FBQUEsTUFDMUMsT0FDSztBQUNELGdCQUFRLE1BQU0sUUFBUSxVQUFVLElBQUk7QUFBQSxNQUN4QztBQUNBLFVBQUk7QUFDQSxhQUFLLFdBQVcsS0FBSyxPQUFPLE9BQU8sS0FBSyxLQUFLLENBQUM7QUFDbEQsV0FBSyxXQUFXLEdBQUc7QUFBQSxJQUN2QixPQUNLO0FBQ0QsV0FBSyxXQUFXLEdBQUc7QUFBQSxJQUN2QjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUEsRUFHQSxXQUFXLEtBQUssWUFBWTtBQUN4QixRQUFJLE9BQU8sSUFBSSxTQUFTLFlBQVksR0FBRztBQUN2QyxRQUFJLFNBQVMsZUFBZSxJQUFJLEtBQUssS0FBSyxPQUFPO0FBQzdDLG9CQUFjLEdBQUc7QUFDckIsUUFBSSxPQUFRLEtBQUssUUFBUSxnQkFBZ0IsS0FBSyxRQUFRLGFBQWEsR0FBRyxNQUNqRSxTQUFTLEtBQUssT0FBTyxTQUFTLEtBQUssTUFBTSxVQUFVO0FBQ3hELFFBQUksT0FBTyxLQUFLLFNBQVMsV0FBVyxlQUFlLElBQUksR0FBRztBQUN0RCxXQUFLLFdBQVcsR0FBRztBQUNuQixXQUFLLGVBQWUsR0FBRztBQUFBLElBQzNCLFdBQ1MsQ0FBQyxRQUFRLEtBQUssUUFBUSxLQUFLLGFBQWE7QUFDN0MsVUFBSSxRQUFRLEtBQUs7QUFDYixhQUFLLE9BQU8sS0FBSyxJQUFJLEdBQUcsS0FBSyxPQUFPLENBQUM7QUFBQSxlQUNoQyxRQUFRLEtBQUssS0FBSztBQUN2QixjQUFNLEtBQUs7QUFDZixVQUFJLE1BQU1BLE9BQU0sS0FBSyxLQUFLLGdCQUFnQixLQUFLO0FBQy9DLFVBQUksVUFBVSxlQUFlLElBQUksR0FBRztBQUNoQyxZQUFJQSxLQUFJLFFBQVEsVUFBVUEsS0FBSSxRQUFRLENBQUMsRUFBRSxZQUFZLEtBQUssTUFBTTtBQUM1RCxlQUFLO0FBQ0wsVUFBQUEsT0FBTSxLQUFLO0FBQUEsUUFDZjtBQUNBLGVBQU87QUFDUCxZQUFJLENBQUNBLEtBQUk7QUFDTCxlQUFLLGFBQWE7QUFBQSxNQUMxQixXQUNTLENBQUMsSUFBSSxZQUFZO0FBQ3RCLGFBQUssYUFBYSxHQUFHO0FBQ3JCO0FBQUEsTUFDSjtBQUNBLFVBQUksUUFBUSxLQUFLO0FBQ2IsYUFBSyxPQUFPLEdBQUc7QUFBQTtBQUVmLGFBQUssZUFBZSxLQUFLLE1BQU0sS0FBSyxPQUFPLEdBQUcsQ0FBQztBQUNuRCxVQUFJO0FBQ0EsYUFBSyxLQUFLQSxJQUFHO0FBQ2pCLFdBQUssYUFBYTtBQUFBLElBQ3RCLE9BQ0s7QUFDRCxXQUFLLGVBQWUsS0FBSyxNQUFNO0FBQzNCLGFBQUssaUJBQWlCLEtBQUssTUFBTSxLQUFLLGNBQWMsUUFBUSxTQUFTLE1BQVM7QUFBQSxNQUNsRixDQUFDO0FBQUEsSUFDTDtBQUFBLEVBQ0o7QUFBQTtBQUFBLEVBRUEsYUFBYSxLQUFLO0FBQ2QsUUFBSSxJQUFJLFlBQVksUUFBUSxLQUFLLElBQUksUUFBUSxLQUFLLElBQUksS0FBSztBQUN2RCxXQUFLLFlBQVksSUFBSSxjQUFjLGVBQWUsSUFBSSxDQUFDO0FBQUEsRUFDL0Q7QUFBQTtBQUFBLEVBRUEsZUFBZSxLQUFLO0FBRWhCLFFBQUksSUFBSSxZQUFZLFNBQVMsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssSUFBSSxLQUFLO0FBQzFELFdBQUssVUFBVSxLQUFLLE9BQU8sT0FBTyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQ25EO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxXQUFXLFFBQVE7QUFDZixRQUFJLE1BQU0sS0FBSyxNQUFNLFNBQVMsS0FBSztBQUNuQyxhQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDdkMsZUFBUyxRQUFRLFlBQWE7QUFDMUIsWUFBSSxPQUFPLEtBQUssT0FBTyxXQUFXLE9BQU8sQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDLEdBQUcsTUFBTSxLQUFLO0FBQ3ZFLFlBQUksQ0FBQztBQUNEO0FBQ0osWUFBSSxLQUFLO0FBQ0wsaUJBQU87QUFDWCxZQUFJLEtBQUssV0FBVztBQUNoQixlQUFLLElBQUksYUFBYSxPQUFPLEtBQUssSUFBSSxXQUFXLEVBQUUsUUFBUSxPQUFLO0FBQzVELGdCQUFJLEtBQUssVUFBVSxDQUFDO0FBQ2hCLHVCQUFTLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDbEMsQ0FBQztBQUFBLFFBQ0wsT0FDSztBQUNELGdCQUFNLEtBQUssT0FBTyxPQUFPLE1BQU0sS0FBSyxJQUFJLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxTQUFTLEdBQUc7QUFBQSxRQUM3RTtBQUNBLFlBQUksS0FBSyxjQUFjO0FBQ25CLGtCQUFRO0FBQUE7QUFFUjtBQUFBLE1BQ1I7QUFBQSxJQUNKO0FBQ0EsV0FBTyxDQUFDLEtBQUssTUFBTTtBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxpQkFBaUIsS0FBSyxNQUFNLGVBQWU7QUFDdkMsUUFBSSxNQUFNLFVBQVU7QUFDcEIsUUFBSSxLQUFLLE1BQU07QUFDWCxpQkFBVyxLQUFLLE9BQU8sT0FBTyxNQUFNLEtBQUssSUFBSTtBQUM3QyxVQUFJLENBQUMsU0FBUyxRQUFRO0FBQ2xCLGVBQU8sS0FBSyxNQUFNLFVBQVUsS0FBSyxTQUFTLE1BQU0sS0FBSyxrQkFBa0I7QUFBQSxNQUMzRSxXQUNTLENBQUMsS0FBSyxXQUFXLFNBQVMsT0FBTyxLQUFLLEtBQUssQ0FBQyxHQUFHO0FBQ3BELGFBQUssYUFBYSxHQUFHO0FBQUEsTUFDekI7QUFBQSxJQUNKLE9BQ0s7QUFDRCxVQUFJLFdBQVcsS0FBSyxPQUFPLE9BQU8sTUFBTSxLQUFLLElBQUk7QUFDakQsYUFBTyxTQUFTLE9BQU8sS0FBSyxLQUFLO0FBQ2pDLFdBQUssZUFBZSxJQUFJO0FBQUEsSUFDNUI7QUFDQSxRQUFJLFVBQVUsS0FBSztBQUNuQixRQUFJLFlBQVksU0FBUyxRQUFRO0FBQzdCLFdBQUssV0FBVyxHQUFHO0FBQUEsSUFDdkIsV0FDUyxlQUFlO0FBQ3BCLFdBQUssV0FBVyxLQUFLLGFBQWE7QUFBQSxJQUN0QyxXQUNTLEtBQUssWUFBWTtBQUN0QixXQUFLLFdBQVcsR0FBRztBQUNuQixXQUFLLFdBQVcsS0FBSyxLQUFLLE9BQU8sTUFBTSxFQUFFLFFBQVEsVUFBUSxLQUFLLFdBQVcsSUFBSSxDQUFDO0FBQUEsSUFDbEYsT0FDSztBQUNELFVBQUksYUFBYTtBQUNqQixVQUFJLE9BQU8sS0FBSyxrQkFBa0I7QUFDOUIscUJBQWEsSUFBSSxjQUFjLEtBQUssY0FBYztBQUFBLGVBQzdDLE9BQU8sS0FBSyxrQkFBa0I7QUFDbkMscUJBQWEsS0FBSyxlQUFlLEdBQUc7QUFBQSxlQUMvQixLQUFLO0FBQ1YscUJBQWEsS0FBSztBQUN0QixXQUFLLFdBQVcsS0FBSyxZQUFZLElBQUk7QUFDckMsV0FBSyxPQUFPLFVBQVU7QUFBQSxJQUMxQjtBQUNBLFFBQUksUUFBUSxLQUFLLEtBQUssT0FBTztBQUN6QixXQUFLO0FBQ1QsUUFBSTtBQUNBLFdBQUssa0JBQWtCLE1BQU0sT0FBTztBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPLFFBQVEsWUFBWSxVQUFVO0FBQ2pDLFFBQUksUUFBUSxjQUFjO0FBQzFCLGFBQVMsTUFBTSxhQUFhLE9BQU8sV0FBVyxVQUFVLElBQUksT0FBTyxZQUFZMUIsT0FBTSxZQUFZLE9BQU8sT0FBTyxPQUFPLFdBQVcsUUFBUSxHQUFHLE9BQU9BLE1BQUssTUFBTSxJQUFJLGFBQWEsRUFBRSxPQUFPO0FBQ3BMLFdBQUssWUFBWSxRQUFRLEtBQUs7QUFDOUIsV0FBSyxPQUFPLEdBQUc7QUFBQSxJQUNuQjtBQUNBLFNBQUssWUFBWSxRQUFRLEtBQUs7QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsVUFBVSxNQUFNO0FBQ1osUUFBSSxPQUFPO0FBQ1gsYUFBUyxRQUFRLEtBQUssTUFBTSxTQUFTLEdBQUcsU0FBUztBQUM3QyxVQUFJLEtBQUssS0FBSyxNQUFNLEtBQUs7QUFDekIsVUFBSUksU0FBUSxHQUFHLGFBQWEsSUFBSTtBQUNoQyxVQUFJQSxXQUFVLENBQUMsU0FBUyxNQUFNLFNBQVNBLE9BQU0sU0FBUztBQUNsRCxnQkFBUUE7QUFDUixlQUFPO0FBQ1AsWUFBSSxDQUFDQSxPQUFNO0FBQ1A7QUFBQSxNQUNSO0FBQ0EsVUFBSSxHQUFHO0FBQ0g7QUFBQSxJQUNSO0FBQ0EsUUFBSSxDQUFDO0FBQ0QsYUFBTztBQUNYLFNBQUssS0FBSyxJQUFJO0FBQ2QsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVE7QUFDOUIsV0FBSyxXQUFXLE1BQU0sQ0FBQyxHQUFHLE1BQU0sS0FBSztBQUN6QyxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUEsRUFFQSxXQUFXLE1BQU07QUFDYixRQUFJLEtBQUssWUFBWSxLQUFLLGNBQWMsQ0FBQyxLQUFLLElBQUksTUFBTTtBQUNwRCxVQUFJLFFBQVEsS0FBSyxxQkFBcUI7QUFDdEMsVUFBSTtBQUNBLGFBQUssV0FBVyxLQUFLO0FBQUEsSUFDN0I7QUFDQSxRQUFJLEtBQUssVUFBVSxJQUFJLEdBQUc7QUFDdEIsV0FBSyxXQUFXO0FBQ2hCLFVBQUlzQixPQUFNLEtBQUs7QUFDZixNQUFBQSxLQUFJLGFBQWEsS0FBSyxJQUFJO0FBQzFCLFVBQUlBLEtBQUk7QUFDSixRQUFBQSxLQUFJLFFBQVFBLEtBQUksTUFBTSxVQUFVLEtBQUssSUFBSTtBQUM3QyxVQUFJLFFBQVFBLEtBQUk7QUFDaEIsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLE1BQU0sUUFBUTtBQUNuQyxZQUFJLENBQUNBLEtBQUksUUFBUUEsS0FBSSxLQUFLLGVBQWUsS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQ3ZELGtCQUFRLEtBQUssTUFBTSxDQUFDLEVBQUUsU0FBUyxLQUFLO0FBQzVDLE1BQUFBLEtBQUksUUFBUSxLQUFLLEtBQUssS0FBSyxLQUFLLENBQUM7QUFDakMsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQSxFQUdBLE1BQU0sTUFBTSxPQUFPLFlBQVk7QUFDM0IsUUFBSSxLQUFLLEtBQUssVUFBVSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQzFDLFFBQUk7QUFDQSxXQUFLLFdBQVcsTUFBTSxPQUFPLE1BQU0sVUFBVTtBQUNqRCxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUEsRUFFQSxXQUFXLE1BQU0sUUFBUSxNQUFNLFFBQVEsT0FBTyxZQUFZO0FBQ3RELFNBQUssV0FBVztBQUNoQixRQUFJQSxPQUFNLEtBQUs7QUFDZixJQUFBQSxLQUFJLGFBQWEsSUFBSTtBQUNyQixJQUFBQSxLQUFJLFFBQVFBLEtBQUksU0FBU0EsS0FBSSxNQUFNLFVBQVUsSUFBSTtBQUNqRCxRQUFJLFVBQVUsYUFBYSxNQUFNLFlBQVlBLEtBQUksT0FBTztBQUN4RCxRQUFLQSxLQUFJLFVBQVUsaUJBQWtCQSxLQUFJLFFBQVEsVUFBVTtBQUN2RCxpQkFBVztBQUNmLFNBQUssTUFBTSxLQUFLLElBQUksWUFBWSxNQUFNLE9BQU9BLEtBQUksYUFBYUEsS0FBSSxjQUFjLE9BQU8sTUFBTSxPQUFPLENBQUM7QUFDckcsU0FBSztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUEsRUFHQSxXQUFXLFVBQVUsT0FBTztBQUN4QixRQUFJLElBQUksS0FBSyxNQUFNLFNBQVM7QUFDNUIsUUFBSSxJQUFJLEtBQUssTUFBTTtBQUNmLGFBQU8sSUFBSSxLQUFLLE1BQU07QUFDbEIsYUFBSyxNQUFNLElBQUksQ0FBQyxFQUFFLFFBQVEsS0FBSyxLQUFLLE1BQU0sQ0FBQyxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQ2hFLFdBQUssTUFBTSxTQUFTLEtBQUssT0FBTztBQUFBLElBQ3BDO0FBQUEsRUFDSjtBQUFBLEVBQ0EsU0FBUztBQUNMLFNBQUssT0FBTztBQUNaLFNBQUssV0FBVyxLQUFLLE1BQU07QUFDM0IsV0FBTyxLQUFLLE1BQU0sQ0FBQyxFQUFFLE9BQU8sS0FBSyxVQUFVLEtBQUssUUFBUSxPQUFPO0FBQUEsRUFDbkU7QUFBQSxFQUNBLEtBQUssSUFBSTtBQUNMLGFBQVMsSUFBSSxLQUFLLE1BQU0sS0FBSyxHQUFHO0FBQzVCLFVBQUksS0FBSyxNQUFNLENBQUMsS0FBSyxJQUFJO0FBQ3JCLGFBQUssT0FBTztBQUNaLGVBQU87QUFBQSxNQUNYO0FBQ0osV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLElBQUksYUFBYTtBQUNiLFNBQUssV0FBVztBQUNoQixRQUFJLE1BQU07QUFDVixhQUFTLElBQUksS0FBSyxNQUFNLEtBQUssR0FBRyxLQUFLO0FBQ2pDLFVBQUksVUFBVSxLQUFLLE1BQU0sQ0FBQyxFQUFFO0FBQzVCLGVBQVMsSUFBSSxRQUFRLFNBQVMsR0FBRyxLQUFLLEdBQUc7QUFDckMsZUFBTyxRQUFRLENBQUMsRUFBRTtBQUN0QixVQUFJO0FBQ0E7QUFBQSxJQUNSO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLFlBQVksUUFBUXBCLFNBQVE7QUFDeEIsUUFBSSxLQUFLO0FBQ0wsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUssUUFBUSxLQUFLO0FBQ3ZDLFlBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxRQUFRLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRSxVQUFVQTtBQUN0RCxlQUFLLEtBQUssQ0FBQyxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2hDO0FBQUEsRUFDUjtBQUFBLEVBQ0EsV0FBVyxRQUFRO0FBQ2YsUUFBSSxLQUFLO0FBQ0wsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUssUUFBUSxLQUFLO0FBQ3ZDLFlBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxPQUFPLFFBQVEsT0FBTyxZQUFZLEtBQUssT0FBTyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsSUFBSTtBQUNyRixlQUFLLEtBQUssQ0FBQyxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ2hDO0FBQUEsRUFDUjtBQUFBLEVBQ0EsV0FBVyxRQUFRLFNBQVMsUUFBUTtBQUNoQyxRQUFJLFVBQVUsV0FBVyxLQUFLO0FBQzFCLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLLFFBQVEsS0FBSztBQUN2QyxZQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsT0FBTyxRQUFRLE9BQU8sWUFBWSxLQUFLLE9BQU8sU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLElBQUksR0FBRztBQUN4RixjQUFJLE1BQU0sUUFBUSx3QkFBd0IsS0FBSyxLQUFLLENBQUMsRUFBRSxJQUFJO0FBQzNELGNBQUksT0FBTyxTQUFTLElBQUk7QUFDcEIsaUJBQUssS0FBSyxDQUFDLEVBQUUsTUFBTSxLQUFLO0FBQUEsUUFDaEM7QUFBQSxNQUNKO0FBQUEsRUFDUjtBQUFBLEVBQ0EsV0FBVyxVQUFVO0FBQ2pCLFFBQUksS0FBSztBQUNMLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLLFFBQVEsS0FBSztBQUN2QyxZQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsUUFBUTtBQUNyQixlQUFLLEtBQUssQ0FBQyxFQUFFLE1BQU0sS0FBSyxjQUFjLFNBQVMsVUFBVSxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUN2RjtBQUFBLEVBQ1I7QUFBQTtBQUFBLEVBRUEsZUFBZSxTQUFTO0FBQ3BCLFFBQUksUUFBUSxRQUFRLEdBQUcsSUFBSTtBQUN2QixhQUFPLFFBQVEsTUFBTSxVQUFVLEVBQUUsS0FBSyxLQUFLLGdCQUFnQixJQUFJO0FBQ25FLFFBQUksUUFBUSxRQUFRLE1BQU0sR0FBRztBQUM3QixRQUFJLFNBQVMsS0FBSyxRQUFRO0FBQzFCLFFBQUksVUFBVSxDQUFDLEtBQUssV0FBVyxDQUFDLFVBQVUsT0FBTyxPQUFPLFFBQVEsS0FBSyxNQUFNLENBQUMsRUFBRTtBQUM5RSxRQUFJLFdBQVcsRUFBRSxTQUFTLE9BQU8sUUFBUSxJQUFJLE1BQU0sVUFBVSxJQUFJO0FBQ2pFLFFBQUksUUFBUSxDQUFDLEdBQUcsVUFBVTtBQUN0QixhQUFPLEtBQUssR0FBRyxLQUFLO0FBQ2hCLFlBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsWUFBSSxRQUFRLElBQUk7QUFDWixjQUFJLEtBQUssTUFBTSxTQUFTLEtBQUssS0FBSztBQUM5QjtBQUNKLGlCQUFPLFNBQVMsVUFBVTtBQUN0QixnQkFBSSxNQUFNLElBQUksR0FBRyxLQUFLO0FBQ2xCLHFCQUFPO0FBQ2YsaUJBQU87QUFBQSxRQUNYLE9BQ0s7QUFDRCxjQUFJLE9BQU8sUUFBUSxLQUFNLFNBQVMsS0FBSyxVQUFXLEtBQUssTUFBTSxLQUFLLEVBQUUsT0FDOUQsVUFBVSxTQUFTLFdBQVcsT0FBTyxLQUFLLFFBQVEsUUFBUSxFQUFFLE9BQ3hEO0FBQ1YsY0FBSSxDQUFDLFFBQVMsS0FBSyxRQUFRLFFBQVEsS0FBSyxPQUFPLFFBQVEsSUFBSSxLQUFLO0FBQzVELG1CQUFPO0FBQ1g7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTyxNQUFNLE1BQU0sU0FBUyxHQUFHLEtBQUssSUFBSTtBQUFBLEVBQzVDO0FBQUEsRUFDQSx1QkFBdUI7QUFDbkIsUUFBSSxXQUFXLEtBQUssUUFBUTtBQUM1QixRQUFJO0FBQ0EsZUFBUyxJQUFJLFNBQVMsT0FBTyxLQUFLLEdBQUcsS0FBSztBQUN0QyxZQUFJLFFBQVEsU0FBUyxLQUFLLENBQUMsRUFBRSxlQUFlLFNBQVMsV0FBVyxDQUFDLENBQUMsRUFBRTtBQUNwRSxZQUFJLFNBQVMsTUFBTSxlQUFlLE1BQU07QUFDcEMsaUJBQU87QUFBQSxNQUNmO0FBQ0osYUFBUyxRQUFRLEtBQUssT0FBTyxPQUFPLE9BQU87QUFDdkMsVUFBSSxPQUFPLEtBQUssT0FBTyxPQUFPLE1BQU0sSUFBSTtBQUN4QyxVQUFJLEtBQUssZUFBZSxLQUFLO0FBQ3pCLGVBQU87QUFBQSxJQUNmO0FBQUEsRUFDSjtBQUFBLEVBQ0EsZUFBZSxNQUFNO0FBQ2pCLFFBQUlGLFNBQVEsa0JBQWtCLE1BQU0sS0FBSyxJQUFJLFlBQVk7QUFDekQsUUFBSUE7QUFDQSxXQUFLLElBQUksV0FBVyxLQUFLQSxNQUFLO0FBQ2xDLFNBQUssSUFBSSxlQUFlLEtBQUssU0FBUyxLQUFLLElBQUksWUFBWTtBQUFBLEVBQy9EO0FBQUEsRUFDQSxrQkFBa0IsTUFBTSxNQUFNO0FBQzFCLGFBQVMsUUFBUSxLQUFLLE1BQU0sU0FBUyxHQUFHLFNBQVM7QUFDN0MsVUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLO0FBQzVCLFVBQUlBLFNBQVEsTUFBTSxhQUFhLFlBQVksSUFBSTtBQUMvQyxVQUFJQSxTQUFRLElBQUk7QUFDWixjQUFNLGVBQWUsS0FBSyxjQUFjLE1BQU0sWUFBWTtBQUFBLE1BQzlELE9BQ0s7QUFDRCxjQUFNLGNBQWMsS0FBSyxjQUFjLE1BQU0sV0FBVztBQUN4RCxZQUFJLFlBQVksTUFBTSxpQkFBaUIsSUFBSTtBQUMzQyxZQUFJLGFBQWEsTUFBTSxRQUFRLE1BQU0sS0FBSyxlQUFlLFVBQVUsSUFBSTtBQUNuRSxnQkFBTSxjQUFjLFVBQVUsU0FBUyxNQUFNLFdBQVc7QUFBQSxNQUNoRTtBQUNBLFVBQUksU0FBUztBQUNUO0FBQUEsSUFDUjtBQUFBLEVBQ0o7QUFDSjtBQUlBLFNBQVMsY0FBYyxLQUFLO0FBQ3hCLFdBQVMsUUFBUSxJQUFJLFlBQVksV0FBVyxNQUFNLE9BQU8sUUFBUSxNQUFNLGFBQWE7QUFDaEYsUUFBSSxPQUFPLE1BQU0sWUFBWSxJQUFJLE1BQU0sU0FBUyxZQUFZLElBQUk7QUFDaEUsUUFBSSxRQUFRLFNBQVMsZUFBZSxJQUFJLEtBQUssVUFBVTtBQUNuRCxlQUFTLFlBQVksS0FBSztBQUMxQixjQUFRO0FBQUEsSUFDWixXQUNTLFFBQVEsTUFBTTtBQUNuQixpQkFBVztBQUFBLElBQ2YsV0FDUyxNQUFNO0FBQ1gsaUJBQVc7QUFBQSxJQUNmO0FBQUEsRUFDSjtBQUNKO0FBRUEsU0FBUyxRQUFRLEtBQUssVUFBVTtBQUM1QixVQUFRLElBQUksV0FBVyxJQUFJLHFCQUFxQixJQUFJLHlCQUF5QixJQUFJLG9CQUFvQixLQUFLLEtBQUssUUFBUTtBQUMzSDtBQUVBLFNBQVMsWUFBWW9CLFFBQU87QUFDeEIsTUFBSSxLQUFLLDhCQUE4QixHQUFHLFNBQVMsQ0FBQztBQUNwRCxTQUFPLElBQUksR0FBRyxLQUFLQSxNQUFLO0FBQ3BCLFdBQU8sS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUM7QUFDakMsU0FBTztBQUNYO0FBQ0EsU0FBUyxLQUFLLEtBQUs7QUFDZixNQUFJckIsUUFBTyxDQUFDO0FBQ1osV0FBUyxRQUFRO0FBQ2IsSUFBQUEsTUFBSyxJQUFJLElBQUksSUFBSSxJQUFJO0FBQ3pCLFNBQU9BO0FBQ1g7QUFJQSxTQUFTLGFBQWEsVUFBVSxVQUFVO0FBQ3RDLE1BQUksUUFBUSxTQUFTLE9BQU87QUFDNUIsV0FBUyxRQUFRLE9BQU87QUFDcEIsUUFBSSxTQUFTLE1BQU0sSUFBSTtBQUN2QixRQUFJLENBQUMsT0FBTyxlQUFlLFFBQVE7QUFDL0I7QUFDSixRQUFJLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVO0FBQzdCLFdBQUssS0FBSyxLQUFLO0FBQ2YsZUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFdBQVcsS0FBSztBQUN0QyxZQUFJLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTSxLQUFLLENBQUM7QUFDakMsWUFBSSxRQUFRO0FBQ1IsaUJBQU87QUFDWCxZQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxLQUFLLElBQUk7QUFDbkMsaUJBQU87QUFBQSxNQUNmO0FBQUEsSUFDSjtBQUNBLFFBQUksS0FBSyxPQUFPLFlBQVk7QUFDeEIsYUFBTztBQUFBLEVBQ2Y7QUFDSjtBQUNBLFNBQVMsa0JBQWtCLE1BQU0sS0FBSztBQUNsQyxXQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQ2pDLFFBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2QsYUFBTyxJQUFJLENBQUM7QUFBQSxFQUNwQjtBQUNKO0FBTUEsSUFBTSxnQkFBTixNQUFNLGVBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVoQixZQUlBLE9BSUEsT0FBTztBQUNILFNBQUssUUFBUTtBQUNiLFNBQUssUUFBUTtBQUFBLEVBQ2pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxrQkFBa0IsVUFBVSxVQUFVLENBQUMsR0FBRyxRQUFRO0FBQzlDLFFBQUksQ0FBQztBQUNELGVBQVMsSUFBSSxPQUFPLEVBQUUsdUJBQXVCO0FBQ2pELFFBQUl1QixPQUFNLFFBQVEsU0FBUyxDQUFDO0FBQzVCLGFBQVMsUUFBUSxVQUFRO0FBQ3JCLFVBQUksT0FBTyxVQUFVLEtBQUssTUFBTSxRQUFRO0FBQ3BDLFlBQUksT0FBTyxHQUFHLFdBQVc7QUFDekIsZUFBTyxPQUFPLE9BQU8sVUFBVSxXQUFXLEtBQUssTUFBTSxRQUFRO0FBQ3pELGNBQUksT0FBTyxLQUFLLE1BQU0sUUFBUTtBQUM5QixjQUFJLENBQUMsS0FBSyxNQUFNLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFDN0I7QUFDQTtBQUFBLFVBQ0o7QUFDQSxjQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLLGFBQWE7QUFDekQ7QUFDSjtBQUNBO0FBQUEsUUFDSjtBQUNBLGVBQU8sT0FBTyxPQUFPO0FBQ2pCLFVBQUFBLE9BQU0sT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUN4QixlQUFPLFdBQVcsS0FBSyxNQUFNLFFBQVE7QUFDakMsY0FBSSxNQUFNLEtBQUssTUFBTSxVQUFVO0FBQy9CLGNBQUksVUFBVSxLQUFLLGNBQWMsS0FBSyxLQUFLLFVBQVUsT0FBTztBQUM1RCxjQUFJLFNBQVM7QUFDVCxtQkFBTyxLQUFLLENBQUMsS0FBS0EsSUFBRyxDQUFDO0FBQ3RCLFlBQUFBLEtBQUksWUFBWSxRQUFRLEdBQUc7QUFDM0IsWUFBQUEsT0FBTSxRQUFRLGNBQWMsUUFBUTtBQUFBLFVBQ3hDO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxNQUFBQSxLQUFJLFlBQVksS0FBSyxtQkFBbUIsTUFBTSxPQUFPLENBQUM7QUFBQSxJQUMxRCxDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLG1CQUFtQixNQUFNLFNBQVM7QUFDOUIsUUFBSSxFQUFFLEtBQUssV0FBVyxJQUFJLGVBQWMsV0FBVyxJQUFJLE9BQU8sR0FBRyxLQUFLLE1BQU0sS0FBSyxLQUFLLElBQUksRUFBRSxJQUFJLENBQUM7QUFDakcsUUFBSSxZQUFZO0FBQ1osVUFBSSxLQUFLO0FBQ0wsY0FBTSxJQUFJLFdBQVcsOENBQThDO0FBQ3ZFLFdBQUssa0JBQWtCLEtBQUssU0FBUyxTQUFTLFVBQVU7QUFBQSxJQUM1RDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLGNBQWMsTUFBTSxVQUFVLENBQUMsR0FBRztBQUM5QixRQUFJLE1BQU0sS0FBSyxtQkFBbUIsTUFBTSxPQUFPO0FBQy9DLGFBQVMsSUFBSSxLQUFLLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFLO0FBQzdDLFVBQUlELFFBQU8sS0FBSyxjQUFjLEtBQUssTUFBTSxDQUFDLEdBQUcsS0FBSyxVQUFVLE9BQU87QUFDbkUsVUFBSUEsT0FBTTtBQUNOLFNBQUNBLE1BQUssY0FBY0EsTUFBSyxLQUFLLFlBQVksR0FBRztBQUM3QyxjQUFNQSxNQUFLO0FBQUEsTUFDZjtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsY0FBYyxNQUFNLFFBQVEsVUFBVSxDQUFDLEdBQUc7QUFDdEMsUUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLEtBQUssSUFBSTtBQUNyQyxXQUFPLFNBQVMsZUFBYyxXQUFXLElBQUksT0FBTyxHQUFHLE1BQU0sTUFBTSxNQUFNLENBQUM7QUFBQSxFQUM5RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE9BQU8sV0FBV2YsTUFBSyxXQUFXLFFBQVEsTUFBTTtBQUM1QyxRQUFJLE9BQU8sYUFBYTtBQUNwQixhQUFPLEVBQUUsS0FBS0EsS0FBSSxlQUFlLFNBQVMsRUFBRTtBQUNoRCxRQUFJLFVBQVUsWUFBWTtBQUN0QixhQUFPLEVBQUUsS0FBSyxVQUFVO0FBQzVCLFFBQUksVUFBVSxPQUFPLFVBQVUsSUFBSSxZQUFZO0FBQzNDLGFBQU87QUFDWCxRQUFJLFVBQVUsVUFBVSxDQUFDLEdBQUcsUUFBUSxRQUFRLFFBQVEsR0FBRztBQUN2RCxRQUFJLFFBQVEsR0FBRztBQUNYLGNBQVEsUUFBUSxNQUFNLEdBQUcsS0FBSztBQUM5QixnQkFBVSxRQUFRLE1BQU0sUUFBUSxDQUFDO0FBQUEsSUFDckM7QUFDQSxRQUFJO0FBQ0osUUFBSSxNQUFPLFFBQVFBLEtBQUksZ0JBQWdCLE9BQU8sT0FBTyxJQUFJQSxLQUFJLGNBQWMsT0FBTztBQUNsRixRQUFJLFFBQVEsVUFBVSxDQUFDLEdBQUdULFNBQVE7QUFDbEMsUUFBSSxTQUFTLE9BQU8sU0FBUyxZQUFZLE1BQU0sWUFBWSxRQUFRLENBQUMsTUFBTSxRQUFRLEtBQUssR0FBRztBQUN0RixNQUFBQSxTQUFRO0FBQ1IsZUFBUyxRQUFRO0FBQ2IsWUFBSSxNQUFNLElBQUksS0FBSyxNQUFNO0FBQ3JCLGNBQUkwQixTQUFRLEtBQUssUUFBUSxHQUFHO0FBQzVCLGNBQUlBLFNBQVE7QUFDUixnQkFBSSxlQUFlLEtBQUssTUFBTSxHQUFHQSxNQUFLLEdBQUcsS0FBSyxNQUFNQSxTQUFRLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQztBQUFBO0FBRTNFLGdCQUFJLGFBQWEsTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLFFBQzFDO0FBQUEsSUFDUjtBQUNBLGFBQVMsSUFBSTFCLFFBQU8sSUFBSSxVQUFVLFFBQVEsS0FBSztBQUMzQyxVQUFJLFFBQVEsVUFBVSxDQUFDO0FBQ3ZCLFVBQUksVUFBVSxHQUFHO0FBQ2IsWUFBSSxJQUFJLFVBQVUsU0FBUyxLQUFLLElBQUlBO0FBQ2hDLGdCQUFNLElBQUksV0FBVyx3REFBd0Q7QUFDakYsZUFBTyxFQUFFLEtBQUssWUFBWSxJQUFJO0FBQUEsTUFDbEMsT0FDSztBQUNELFlBQUksRUFBRSxLQUFLLE9BQU8sWUFBWSxhQUFhLElBQUksZUFBYyxXQUFXUyxNQUFLLE9BQU8sS0FBSztBQUN6RixZQUFJLFlBQVksS0FBSztBQUNyQixZQUFJLGNBQWM7QUFDZCxjQUFJO0FBQ0Esa0JBQU0sSUFBSSxXQUFXLHdCQUF3QjtBQUNqRCx1QkFBYTtBQUFBLFFBQ2pCO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxXQUFPLEVBQUUsS0FBSyxXQUFXO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxXQUFXLFFBQVE7QUFDdEIsV0FBTyxPQUFPLE9BQU8sa0JBQ2hCLE9BQU8sT0FBTyxnQkFBZ0IsSUFBSSxlQUFjLEtBQUssZ0JBQWdCLE1BQU0sR0FBRyxLQUFLLGdCQUFnQixNQUFNLENBQUM7QUFBQSxFQUNuSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFPLGdCQUFnQixRQUFRO0FBQzNCLFFBQUksU0FBUyxZQUFZLE9BQU8sS0FBSztBQUNyQyxRQUFJLENBQUMsT0FBTztBQUNSLGFBQU8sT0FBTyxVQUFRLEtBQUs7QUFDL0IsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sZ0JBQWdCLFFBQVE7QUFDM0IsV0FBTyxZQUFZLE9BQU8sS0FBSztBQUFBLEVBQ25DO0FBQ0o7QUFDQSxTQUFTLFlBQVksS0FBSztBQUN0QixNQUFJLFNBQVMsQ0FBQztBQUNkLFdBQVMsUUFBUSxLQUFLO0FBQ2xCLFFBQUksUUFBUSxJQUFJLElBQUksRUFBRSxLQUFLO0FBQzNCLFFBQUk7QUFDQSxhQUFPLElBQUksSUFBSTtBQUFBLEVBQ3ZCO0FBQ0EsU0FBTztBQUNYO0FBQ0EsU0FBUyxJQUFJLFNBQVM7QUFDbEIsU0FBTyxRQUFRLFlBQVksT0FBTztBQUN0Qzs7O0FDL3pHQSxJQUFNLFVBQVU7QUFDaEIsSUFBTSxXQUFXLEtBQUssSUFBSSxHQUFHLEVBQUU7QUFDL0IsU0FBUyxZQUFZLE9BQU9rQixTQUFRO0FBQUUsU0FBTyxRQUFRQSxVQUFTO0FBQVU7QUFDeEUsU0FBUyxhQUFhLE9BQU87QUFBRSxTQUFPLFFBQVE7QUFBUztBQUN2RCxTQUFTLGNBQWMsT0FBTztBQUFFLFVBQVEsU0FBUyxRQUFRLFlBQVk7QUFBVTtBQUMvRSxJQUFNLGFBQWE7QUFBbkIsSUFBc0IsWUFBWTtBQUFsQyxJQUFxQyxhQUFhO0FBQWxELElBQXFELFdBQVc7QUFLaEUsSUFBTSxZQUFOLE1BQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWixZQUlBLEtBSUEsU0FJQSxTQUFTO0FBQ0wsU0FBSyxNQUFNO0FBQ1gsU0FBSyxVQUFVO0FBQ2YsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxJQUFJLFVBQVU7QUFBRSxZQUFRLEtBQUssVUFBVSxZQUFZO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXRELElBQUksZ0JBQWdCO0FBQUUsWUFBUSxLQUFLLFdBQVcsYUFBYSxlQUFlO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTdFLElBQUksZUFBZTtBQUFFLFlBQVEsS0FBSyxXQUFXLFlBQVksZUFBZTtBQUFBLEVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNM0UsSUFBSSxnQkFBZ0I7QUFBRSxZQUFRLEtBQUssVUFBVSxjQUFjO0FBQUEsRUFBRztBQUNsRTtBQU9BLElBQU0sVUFBTixNQUFNLFNBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNVixZQUlBLFFBSUEsV0FBVyxPQUFPO0FBQ2QsU0FBSyxTQUFTO0FBQ2QsU0FBSyxXQUFXO0FBQ2hCLFFBQUksQ0FBQyxPQUFPLFVBQVUsU0FBUTtBQUMxQixhQUFPLFNBQVE7QUFBQSxFQUN2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsUUFBUSxPQUFPO0FBQ1gsUUFBSUMsUUFBTyxHQUFHLFFBQVEsYUFBYSxLQUFLO0FBQ3hDLFFBQUksQ0FBQyxLQUFLO0FBQ04sZUFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPO0FBQ3ZCLFFBQUFBLFNBQVEsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDO0FBQzlELFdBQU8sS0FBSyxPQUFPLFFBQVEsQ0FBQyxJQUFJQSxRQUFPLGNBQWMsS0FBSztBQUFBLEVBQzlEO0FBQUEsRUFDQSxVQUFVLEtBQUssUUFBUSxHQUFHO0FBQUUsV0FBTyxLQUFLLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUFHO0FBQUEsRUFDakUsSUFBSSxLQUFLLFFBQVEsR0FBRztBQUFFLFdBQU8sS0FBSyxLQUFLLEtBQUssT0FBTyxJQUFJO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTFELEtBQUssS0FBSyxPQUFPLFFBQVE7QUFDckIsUUFBSUEsUUFBTyxHQUFHLFdBQVcsS0FBSyxXQUFXLElBQUksR0FBRyxXQUFXLEtBQUssV0FBVyxJQUFJO0FBQy9FLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQzVDLFVBQUlDLFNBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxLQUFLLFdBQVdELFFBQU87QUFDckQsVUFBSUMsU0FBUTtBQUNSO0FBQ0osVUFBSSxVQUFVLEtBQUssT0FBTyxJQUFJLFFBQVEsR0FBRyxVQUFVLEtBQUssT0FBTyxJQUFJLFFBQVEsR0FBR0MsT0FBTUQsU0FBUTtBQUM1RixVQUFJLE9BQU9DLE1BQUs7QUFDWixZQUFJLE9BQU8sQ0FBQyxVQUFVLFFBQVEsT0FBT0QsU0FBUSxLQUFLLE9BQU9DLE9BQU0sSUFBSTtBQUNuRSxZQUFJLFNBQVNELFNBQVFELFNBQVEsT0FBTyxJQUFJLElBQUk7QUFDNUMsWUFBSTtBQUNBLGlCQUFPO0FBQ1gsWUFBSSxVQUFVLFFBQVEsUUFBUSxJQUFJQyxTQUFRQyxRQUFPLE9BQU8sWUFBWSxJQUFJLEdBQUcsTUFBTUQsTUFBSztBQUN0RixZQUFJRSxPQUFNLE9BQU9GLFNBQVEsWUFBWSxPQUFPQyxPQUFNLGFBQWE7QUFDL0QsWUFBSSxRQUFRLElBQUksT0FBT0QsU0FBUSxPQUFPQztBQUNsQyxVQUFBQyxRQUFPO0FBQ1gsZUFBTyxJQUFJLFVBQVUsUUFBUUEsTUFBSyxPQUFPO0FBQUEsTUFDN0M7QUFDQSxNQUFBSCxTQUFRLFVBQVU7QUFBQSxJQUN0QjtBQUNBLFdBQU8sU0FBUyxNQUFNQSxRQUFPLElBQUksVUFBVSxNQUFNQSxPQUFNLEdBQUcsSUFBSTtBQUFBLEVBQ2xFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxRQUFRLEtBQUssU0FBUztBQUNsQixRQUFJQSxRQUFPLEdBQUcsUUFBUSxhQUFhLE9BQU87QUFDMUMsUUFBSSxXQUFXLEtBQUssV0FBVyxJQUFJLEdBQUcsV0FBVyxLQUFLLFdBQVcsSUFBSTtBQUNyRSxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUM1QyxVQUFJQyxTQUFRLEtBQUssT0FBTyxDQUFDLEtBQUssS0FBSyxXQUFXRCxRQUFPO0FBQ3JELFVBQUlDLFNBQVE7QUFDUjtBQUNKLFVBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxRQUFRLEdBQUdDLE9BQU1ELFNBQVE7QUFDdkQsVUFBSSxPQUFPQyxRQUFPLEtBQUssUUFBUTtBQUMzQixlQUFPO0FBQ1gsTUFBQUYsU0FBUSxLQUFLLE9BQU8sSUFBSSxRQUFRLElBQUk7QUFBQSxJQUN4QztBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFFBQVEsR0FBRztBQUNQLFFBQUksV0FBVyxLQUFLLFdBQVcsSUFBSSxHQUFHLFdBQVcsS0FBSyxXQUFXLElBQUk7QUFDckUsYUFBUyxJQUFJLEdBQUdBLFFBQU8sR0FBRyxJQUFJLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUN0RCxVQUFJQyxTQUFRLEtBQUssT0FBTyxDQUFDLEdBQUcsV0FBV0EsVUFBUyxLQUFLLFdBQVdELFFBQU8sSUFBSSxXQUFXQyxVQUFTLEtBQUssV0FBVyxJQUFJRDtBQUNuSCxVQUFJLFVBQVUsS0FBSyxPQUFPLElBQUksUUFBUSxHQUFHLFVBQVUsS0FBSyxPQUFPLElBQUksUUFBUTtBQUMzRSxRQUFFLFVBQVUsV0FBVyxTQUFTLFVBQVUsV0FBVyxPQUFPO0FBQzVELE1BQUFBLFNBQVEsVUFBVTtBQUFBLElBQ3RCO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxTQUFTO0FBQ0wsV0FBTyxJQUFJLFNBQVEsS0FBSyxRQUFRLENBQUMsS0FBSyxRQUFRO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFdBQVc7QUFDUCxZQUFRLEtBQUssV0FBVyxNQUFNLE1BQU0sS0FBSyxVQUFVLEtBQUssTUFBTTtBQUFBLEVBQ2xFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsT0FBTyxPQUFPLEdBQUc7QUFDYixXQUFPLEtBQUssSUFBSSxTQUFRLFFBQVEsSUFBSSxTQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFBQSxFQUM5RTtBQUNKO0FBSUEsUUFBUSxRQUFRLElBQUksUUFBUSxDQUFDLENBQUM7QUFTOUIsSUFBTSxVQUFOLE1BQU0sU0FBUTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVYsWUFJQSxPQUFPLENBQUMsR0FJUixRQUtBSSxRQUFPLEdBSVAsS0FBSyxLQUFLLFFBQVE7QUFDZCxTQUFLLE9BQU87QUFDWixTQUFLLFNBQVM7QUFDZCxTQUFLLE9BQU9BO0FBQ1osU0FBSyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsTUFBTUEsUUFBTyxHQUFHLEtBQUssS0FBSyxLQUFLLFFBQVE7QUFDbkMsV0FBTyxJQUFJLFNBQVEsS0FBSyxNQUFNLEtBQUssUUFBUUEsT0FBTSxFQUFFO0FBQUEsRUFDdkQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU87QUFDSCxXQUFPLElBQUksU0FBUSxLQUFLLEtBQUssTUFBTSxHQUFHLEtBQUssVUFBVSxLQUFLLE9BQU8sTUFBTSxHQUFHLEtBQUssTUFBTSxLQUFLLEVBQUU7QUFBQSxFQUNoRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLFVBQVVDLE1BQUssU0FBUztBQUNwQixTQUFLLEtBQUssS0FBSyxLQUFLLEtBQUtBLElBQUc7QUFDNUIsUUFBSSxXQUFXO0FBQ1gsV0FBSyxVQUFVLEtBQUssS0FBSyxTQUFTLEdBQUcsT0FBTztBQUFBLEVBQ3BEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGNBQWMsU0FBUztBQUNuQixhQUFTLElBQUksR0FBRyxZQUFZLEtBQUssS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSztBQUN4RSxVQUFJLE9BQU8sUUFBUSxVQUFVLENBQUM7QUFDOUIsV0FBSyxVQUFVLFFBQVEsS0FBSyxDQUFDLEdBQUcsUUFBUSxRQUFRLE9BQU8sSUFBSSxZQUFZLE9BQU8sTUFBUztBQUFBLElBQzNGO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLFVBQVUsR0FBRztBQUNULFFBQUksS0FBSztBQUNMLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxPQUFPLFFBQVE7QUFDcEMsWUFBSSxLQUFLLE9BQU8sQ0FBQyxLQUFLO0FBQ2xCLGlCQUFPLEtBQUssT0FBTyxLQUFLLElBQUksSUFBSSxLQUFLLEVBQUU7QUFBQTtBQUFBLEVBQ3ZEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxVQUFVLEdBQUcsR0FBRztBQUNaLFFBQUksQ0FBQyxLQUFLO0FBQ04sV0FBSyxTQUFTLENBQUM7QUFDbkIsU0FBSyxPQUFPLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDekI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLHNCQUFzQixTQUFTO0FBQzNCLGFBQVMsSUFBSSxRQUFRLEtBQUssU0FBUyxHQUFHLFlBQVksS0FBSyxLQUFLLFNBQVMsUUFBUSxLQUFLLFFBQVEsS0FBSyxHQUFHLEtBQUs7QUFDbkcsVUFBSSxPQUFPLFFBQVEsVUFBVSxDQUFDO0FBQzlCLFdBQUssVUFBVSxRQUFRLEtBQUssQ0FBQyxFQUFFLE9BQU8sR0FBRyxRQUFRLFFBQVEsT0FBTyxJQUFJLFlBQVksT0FBTyxJQUFJLE1BQVM7QUFBQSxJQUN4RztBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFNBQVM7QUFDTCxRQUFJLFVBQVUsSUFBSTtBQUNsQixZQUFRLHNCQUFzQixJQUFJO0FBQ2xDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxJQUFJLEtBQUssUUFBUSxHQUFHO0FBQ2hCLFFBQUksS0FBSztBQUNMLGFBQU8sS0FBSyxLQUFLLEtBQUssT0FBTyxJQUFJO0FBQ3JDLGFBQVMsSUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFDakMsWUFBTSxLQUFLLEtBQUssQ0FBQyxFQUFFLElBQUksS0FBSyxLQUFLO0FBQ3JDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFVBQVUsS0FBSyxRQUFRLEdBQUc7QUFBRSxXQUFPLEtBQUssS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlqRSxLQUFLLEtBQUssT0FBTyxRQUFRO0FBQ3JCLFFBQUksVUFBVTtBQUNkLGFBQVMsSUFBSSxLQUFLLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSztBQUN0QyxVQUFJQSxPQUFNLEtBQUssS0FBSyxDQUFDLEdBQUcsU0FBU0EsS0FBSSxVQUFVLEtBQUssS0FBSztBQUN6RCxVQUFJLE9BQU8sV0FBVyxNQUFNO0FBQ3hCLFlBQUksT0FBTyxLQUFLLFVBQVUsQ0FBQztBQUMzQixZQUFJLFFBQVEsUUFBUSxPQUFPLEtBQUssT0FBTyxLQUFLLElBQUk7QUFDNUMsY0FBSTtBQUNKLGdCQUFNLEtBQUssS0FBSyxJQUFJLEVBQUUsUUFBUSxPQUFPLE9BQU87QUFDNUM7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGlCQUFXLE9BQU87QUFDbEIsWUFBTSxPQUFPO0FBQUEsSUFDakI7QUFDQSxXQUFPLFNBQVMsTUFBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUk7QUFBQSxFQUMxRDtBQUNKO0FBRUEsSUFBTSxZQUFZLHVCQUFPLE9BQU8sSUFBSTtBQVlwQyxJQUFNLE9BQU4sTUFBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1QLFNBQVM7QUFBRSxXQUFPLFFBQVE7QUFBQSxFQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTWpDLE1BQU0sT0FBTztBQUFFLFdBQU87QUFBQSxFQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUs1QixPQUFPLFNBQVMsUUFBUUMsT0FBTTtBQUMxQixRQUFJLENBQUNBLFNBQVEsQ0FBQ0EsTUFBSztBQUNmLFlBQU0sSUFBSSxXQUFXLGlDQUFpQztBQUMxRCxRQUFJLE9BQU8sVUFBVUEsTUFBSyxRQUFRO0FBQ2xDLFFBQUksQ0FBQztBQUNELFlBQU0sSUFBSSxXQUFXLGdCQUFnQkEsTUFBSyxRQUFRLFVBQVU7QUFDaEUsV0FBTyxLQUFLLFNBQVMsUUFBUUEsS0FBSTtBQUFBLEVBQ3JDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFPLE9BQU8sSUFBSSxXQUFXO0FBQ3pCLFFBQUksTUFBTTtBQUNOLFlBQU0sSUFBSSxXQUFXLG1DQUFtQyxFQUFFO0FBQzlELGNBQVUsRUFBRSxJQUFJO0FBQ2hCLGNBQVUsVUFBVSxTQUFTO0FBQzdCLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFLQSxJQUFNLGFBQU4sTUFBTSxZQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixZQUlBQyxNQUlBLFFBQVE7QUFDSixTQUFLLE1BQU1BO0FBQ1gsU0FBSyxTQUFTO0FBQUEsRUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sR0FBR0EsTUFBSztBQUFFLFdBQU8sSUFBSSxZQUFXQSxNQUFLLElBQUk7QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkQsT0FBTyxLQUFLLFNBQVM7QUFBRSxXQUFPLElBQUksWUFBVyxNQUFNLE9BQU87QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTTdELE9BQU8sWUFBWUEsTUFBS0gsT0FBTSxJQUFJSSxRQUFPO0FBQ3JDLFFBQUk7QUFDQSxhQUFPLFlBQVcsR0FBR0QsS0FBSSxRQUFRSCxPQUFNLElBQUlJLE1BQUssQ0FBQztBQUFBLElBQ3JELFNBQ08sR0FBRztBQUNOLFVBQUksYUFBYTtBQUNiLGVBQU8sWUFBVyxLQUFLLEVBQUUsT0FBTztBQUNwQyxZQUFNO0FBQUEsSUFDVjtBQUFBLEVBQ0o7QUFDSjtBQUVBLFNBQVMsWUFBWSxVQUFVLEdBQUcsUUFBUTtBQUN0QyxNQUFJLFNBQVMsQ0FBQztBQUNkLFdBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxZQUFZLEtBQUs7QUFDMUMsUUFBSSxRQUFRLFNBQVMsTUFBTSxDQUFDO0FBQzVCLFFBQUksTUFBTSxRQUFRO0FBQ2QsY0FBUSxNQUFNLEtBQUssWUFBWSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDM0QsUUFBSSxNQUFNO0FBQ04sY0FBUSxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQzlCLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDckI7QUFDQSxTQUFPLFNBQVMsVUFBVSxNQUFNO0FBQ3BDO0FBSUEsSUFBTSxjQUFOLE1BQU0scUJBQW9CLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkzQixZQUlBSixPQUlBLElBSUEsTUFBTTtBQUNGLFVBQU07QUFDTixTQUFLLE9BQU9BO0FBQ1osU0FBSyxLQUFLO0FBQ1YsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFBQSxFQUNBLE1BQU1HLE1BQUs7QUFDUCxRQUFJLFdBQVdBLEtBQUksTUFBTSxLQUFLLE1BQU0sS0FBSyxFQUFFLEdBQUcsUUFBUUEsS0FBSSxRQUFRLEtBQUssSUFBSTtBQUMzRSxRQUFJLFNBQVMsTUFBTSxLQUFLLE1BQU0sWUFBWSxLQUFLLEVBQUUsQ0FBQztBQUNsRCxRQUFJQyxTQUFRLElBQUksTUFBTSxZQUFZLFNBQVMsU0FBUyxDQUFDLE1BQU1DLFlBQVc7QUFDbEUsVUFBSSxDQUFDLEtBQUssVUFBVSxDQUFDQSxRQUFPLEtBQUssZUFBZSxLQUFLLEtBQUssSUFBSTtBQUMxRCxlQUFPO0FBQ1gsYUFBTyxLQUFLLEtBQUssS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLENBQUM7QUFBQSxJQUNuRCxHQUFHLE1BQU0sR0FBRyxTQUFTLFdBQVcsU0FBUyxPQUFPO0FBQ2hELFdBQU8sV0FBVyxZQUFZRixNQUFLLEtBQUssTUFBTSxLQUFLLElBQUlDLE1BQUs7QUFBQSxFQUNoRTtBQUFBLEVBQ0EsU0FBUztBQUNMLFdBQU8sSUFBSSxlQUFlLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxJQUFJO0FBQUEsRUFDM0Q7QUFBQSxFQUNBLElBQUksU0FBUztBQUNULFFBQUlKLFFBQU8sUUFBUSxVQUFVLEtBQUssTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLFVBQVUsS0FBSyxJQUFJLEVBQUU7QUFDOUUsUUFBSUEsTUFBSyxXQUFXLEdBQUcsV0FBV0EsTUFBSyxPQUFPLEdBQUc7QUFDN0MsYUFBTztBQUNYLFdBQU8sSUFBSSxhQUFZQSxNQUFLLEtBQUssR0FBRyxLQUFLLEtBQUssSUFBSTtBQUFBLEVBQ3REO0FBQUEsRUFDQSxNQUFNLE9BQU87QUFDVCxRQUFJLGlCQUFpQixnQkFDakIsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQ3ZCLEtBQUssUUFBUSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFDMUMsYUFBTyxJQUFJLGFBQVksS0FBSyxJQUFJLEtBQUssTUFBTSxNQUFNLElBQUksR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxHQUFHLEtBQUssSUFBSTtBQUNsRyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsU0FBUztBQUNMLFdBQU87QUFBQSxNQUFFLFVBQVU7QUFBQSxNQUFXLE1BQU0sS0FBSyxLQUFLLE9BQU87QUFBQSxNQUNqRCxNQUFNLEtBQUs7QUFBQSxNQUFNLElBQUksS0FBSztBQUFBLElBQUc7QUFBQSxFQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsT0FBTyxTQUFTLFFBQVFFLE9BQU07QUFDMUIsUUFBSSxPQUFPQSxNQUFLLFFBQVEsWUFBWSxPQUFPQSxNQUFLLE1BQU07QUFDbEQsWUFBTSxJQUFJLFdBQVcsd0NBQXdDO0FBQ2pFLFdBQU8sSUFBSSxhQUFZQSxNQUFLLE1BQU1BLE1BQUssSUFBSSxPQUFPLGFBQWFBLE1BQUssSUFBSSxDQUFDO0FBQUEsRUFDN0U7QUFDSjtBQUNBLEtBQUssT0FBTyxXQUFXLFdBQVc7QUFJbEMsSUFBTSxpQkFBTixNQUFNLHdCQUF1QixLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJOUIsWUFJQUYsT0FJQSxJQUlBLE1BQU07QUFDRixVQUFNO0FBQ04sU0FBSyxPQUFPQTtBQUNaLFNBQUssS0FBSztBQUNWLFNBQUssT0FBTztBQUFBLEVBQ2hCO0FBQUEsRUFDQSxNQUFNRyxNQUFLO0FBQ1AsUUFBSSxXQUFXQSxLQUFJLE1BQU0sS0FBSyxNQUFNLEtBQUssRUFBRTtBQUMzQyxRQUFJQyxTQUFRLElBQUksTUFBTSxZQUFZLFNBQVMsU0FBUyxVQUFRO0FBQ3hELGFBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxjQUFjLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDeEQsR0FBR0QsSUFBRyxHQUFHLFNBQVMsV0FBVyxTQUFTLE9BQU87QUFDN0MsV0FBTyxXQUFXLFlBQVlBLE1BQUssS0FBSyxNQUFNLEtBQUssSUFBSUMsTUFBSztBQUFBLEVBQ2hFO0FBQUEsRUFDQSxTQUFTO0FBQ0wsV0FBTyxJQUFJLFlBQVksS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLElBQUk7QUFBQSxFQUN4RDtBQUFBLEVBQ0EsSUFBSSxTQUFTO0FBQ1QsUUFBSUosUUFBTyxRQUFRLFVBQVUsS0FBSyxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsVUFBVSxLQUFLLElBQUksRUFBRTtBQUM5RSxRQUFJQSxNQUFLLFdBQVcsR0FBRyxXQUFXQSxNQUFLLE9BQU8sR0FBRztBQUM3QyxhQUFPO0FBQ1gsV0FBTyxJQUFJLGdCQUFlQSxNQUFLLEtBQUssR0FBRyxLQUFLLEtBQUssSUFBSTtBQUFBLEVBQ3pEO0FBQUEsRUFDQSxNQUFNLE9BQU87QUFDVCxRQUFJLGlCQUFpQixtQkFDakIsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQ3ZCLEtBQUssUUFBUSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFDMUMsYUFBTyxJQUFJLGdCQUFlLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsR0FBRyxLQUFLLElBQUk7QUFDckcsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLFNBQVM7QUFDTCxXQUFPO0FBQUEsTUFBRSxVQUFVO0FBQUEsTUFBYyxNQUFNLEtBQUssS0FBSyxPQUFPO0FBQUEsTUFDcEQsTUFBTSxLQUFLO0FBQUEsTUFBTSxJQUFJLEtBQUs7QUFBQSxJQUFHO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sU0FBUyxRQUFRRSxPQUFNO0FBQzFCLFFBQUksT0FBT0EsTUFBSyxRQUFRLFlBQVksT0FBT0EsTUFBSyxNQUFNO0FBQ2xELFlBQU0sSUFBSSxXQUFXLDJDQUEyQztBQUNwRSxXQUFPLElBQUksZ0JBQWVBLE1BQUssTUFBTUEsTUFBSyxJQUFJLE9BQU8sYUFBYUEsTUFBSyxJQUFJLENBQUM7QUFBQSxFQUNoRjtBQUNKO0FBQ0EsS0FBSyxPQUFPLGNBQWMsY0FBYztBQUl4QyxJQUFNLGtCQUFOLE1BQU0seUJBQXdCLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkvQixZQUlBLEtBSUEsTUFBTTtBQUNGLFVBQU07QUFDTixTQUFLLE1BQU07QUFDWCxTQUFLLE9BQU87QUFBQSxFQUNoQjtBQUFBLEVBQ0EsTUFBTUMsTUFBSztBQUNQLFFBQUksT0FBT0EsS0FBSSxPQUFPLEtBQUssR0FBRztBQUM5QixRQUFJLENBQUM7QUFDRCxhQUFPLFdBQVcsS0FBSyxpQ0FBaUM7QUFDNUQsUUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLEtBQUssT0FBTyxNQUFNLEtBQUssS0FBSyxTQUFTLEtBQUssS0FBSyxDQUFDO0FBQy9FLFdBQU8sV0FBVyxZQUFZQSxNQUFLLEtBQUssS0FBSyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sU0FBUyxLQUFLLE9BQU8sR0FBRyxHQUFHLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQztBQUFBLEVBQ3hIO0FBQUEsRUFDQSxPQUFPQSxNQUFLO0FBQ1IsUUFBSSxPQUFPQSxLQUFJLE9BQU8sS0FBSyxHQUFHO0FBQzlCLFFBQUksTUFBTTtBQUNOLFVBQUksU0FBUyxLQUFLLEtBQUssU0FBUyxLQUFLLEtBQUs7QUFDMUMsVUFBSSxPQUFPLFVBQVUsS0FBSyxNQUFNLFFBQVE7QUFDcEMsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxNQUFNLFFBQVE7QUFDbkMsY0FBSSxDQUFDLEtBQUssTUFBTSxDQUFDLEVBQUUsUUFBUSxNQUFNO0FBQzdCLG1CQUFPLElBQUksaUJBQWdCLEtBQUssS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQzFELGVBQU8sSUFBSSxpQkFBZ0IsS0FBSyxLQUFLLEtBQUssSUFBSTtBQUFBLE1BQ2xEO0FBQUEsSUFDSjtBQUNBLFdBQU8sSUFBSSxtQkFBbUIsS0FBSyxLQUFLLEtBQUssSUFBSTtBQUFBLEVBQ3JEO0FBQUEsRUFDQSxJQUFJLFNBQVM7QUFDVCxRQUFJLE1BQU0sUUFBUSxVQUFVLEtBQUssS0FBSyxDQUFDO0FBQ3ZDLFdBQU8sSUFBSSxlQUFlLE9BQU8sSUFBSSxpQkFBZ0IsSUFBSSxLQUFLLEtBQUssSUFBSTtBQUFBLEVBQzNFO0FBQUEsRUFDQSxTQUFTO0FBQ0wsV0FBTyxFQUFFLFVBQVUsZUFBZSxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxPQUFPLEVBQUU7QUFBQSxFQUM5RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsT0FBTyxTQUFTLFFBQVFELE9BQU07QUFDMUIsUUFBSSxPQUFPQSxNQUFLLE9BQU87QUFDbkIsWUFBTSxJQUFJLFdBQVcsNENBQTRDO0FBQ3JFLFdBQU8sSUFBSSxpQkFBZ0JBLE1BQUssS0FBSyxPQUFPLGFBQWFBLE1BQUssSUFBSSxDQUFDO0FBQUEsRUFDdkU7QUFDSjtBQUNBLEtBQUssT0FBTyxlQUFlLGVBQWU7QUFJMUMsSUFBTSxxQkFBTixNQUFNLDRCQUEyQixLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEMsWUFJQSxLQUlBLE1BQU07QUFDRixVQUFNO0FBQ04sU0FBSyxNQUFNO0FBQ1gsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFBQSxFQUNBLE1BQU1DLE1BQUs7QUFDUCxRQUFJLE9BQU9BLEtBQUksT0FBTyxLQUFLLEdBQUc7QUFDOUIsUUFBSSxDQUFDO0FBQ0QsYUFBTyxXQUFXLEtBQUssaUNBQWlDO0FBQzVELFFBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxLQUFLLE9BQU8sTUFBTSxLQUFLLEtBQUssY0FBYyxLQUFLLEtBQUssQ0FBQztBQUNwRixXQUFPLFdBQVcsWUFBWUEsTUFBSyxLQUFLLEtBQUssS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLFNBQVMsS0FBSyxPQUFPLEdBQUcsR0FBRyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUM7QUFBQSxFQUN4SDtBQUFBLEVBQ0EsT0FBT0EsTUFBSztBQUNSLFFBQUksT0FBT0EsS0FBSSxPQUFPLEtBQUssR0FBRztBQUM5QixRQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxRQUFRLEtBQUssS0FBSztBQUN0QyxhQUFPO0FBQ1gsV0FBTyxJQUFJLGdCQUFnQixLQUFLLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDbEQ7QUFBQSxFQUNBLElBQUksU0FBUztBQUNULFFBQUksTUFBTSxRQUFRLFVBQVUsS0FBSyxLQUFLLENBQUM7QUFDdkMsV0FBTyxJQUFJLGVBQWUsT0FBTyxJQUFJLG9CQUFtQixJQUFJLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDOUU7QUFBQSxFQUNBLFNBQVM7QUFDTCxXQUFPLEVBQUUsVUFBVSxrQkFBa0IsS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssT0FBTyxFQUFFO0FBQUEsRUFDakY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sU0FBUyxRQUFRRCxPQUFNO0FBQzFCLFFBQUksT0FBT0EsTUFBSyxPQUFPO0FBQ25CLFlBQU0sSUFBSSxXQUFXLCtDQUErQztBQUN4RSxXQUFPLElBQUksb0JBQW1CQSxNQUFLLEtBQUssT0FBTyxhQUFhQSxNQUFLLElBQUksQ0FBQztBQUFBLEVBQzFFO0FBQ0o7QUFDQSxLQUFLLE9BQU8sa0JBQWtCLGtCQUFrQjtBQUtoRCxJQUFNLGNBQU4sTUFBTSxxQkFBb0IsS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVTNCLFlBSUFGLE9BSUEsSUFJQUksUUFJQSxZQUFZLE9BQU87QUFDZixVQUFNO0FBQ04sU0FBSyxPQUFPSjtBQUNaLFNBQUssS0FBSztBQUNWLFNBQUssUUFBUUk7QUFDYixTQUFLLFlBQVk7QUFBQSxFQUNyQjtBQUFBLEVBQ0EsTUFBTUQsTUFBSztBQUNQLFFBQUksS0FBSyxhQUFhLGVBQWVBLE1BQUssS0FBSyxNQUFNLEtBQUssRUFBRTtBQUN4RCxhQUFPLFdBQVcsS0FBSywyQ0FBMkM7QUFDdEUsV0FBTyxXQUFXLFlBQVlBLE1BQUssS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxFQUNyRTtBQUFBLEVBQ0EsU0FBUztBQUNMLFdBQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxNQUFNLEtBQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLEVBQ3hFO0FBQUEsRUFDQSxPQUFPQSxNQUFLO0FBQ1IsV0FBTyxJQUFJLGFBQVksS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLE1BQU0sTUFBTUEsS0FBSSxNQUFNLEtBQUssTUFBTSxLQUFLLEVBQUUsQ0FBQztBQUFBLEVBQ2hHO0FBQUEsRUFDQSxJQUFJLFNBQVM7QUFDVCxRQUFJSCxRQUFPLFFBQVEsVUFBVSxLQUFLLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxVQUFVLEtBQUssSUFBSSxFQUFFO0FBQzlFLFFBQUlBLE1BQUssaUJBQWlCLEdBQUc7QUFDekIsYUFBTztBQUNYLFdBQU8sSUFBSSxhQUFZQSxNQUFLLEtBQUssS0FBSyxJQUFJQSxNQUFLLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxLQUFLO0FBQUEsRUFDM0U7QUFBQSxFQUNBLE1BQU0sT0FBTztBQUNULFFBQUksRUFBRSxpQkFBaUIsaUJBQWdCLE1BQU0sYUFBYSxLQUFLO0FBQzNELGFBQU87QUFDWCxRQUFJLEtBQUssT0FBTyxLQUFLLE1BQU0sUUFBUSxNQUFNLFFBQVEsQ0FBQyxLQUFLLE1BQU0sV0FBVyxDQUFDLE1BQU0sTUFBTSxXQUFXO0FBQzVGLFVBQUlJLFNBQVEsS0FBSyxNQUFNLE9BQU8sTUFBTSxNQUFNLFFBQVEsSUFBSSxNQUFNLFFBQ3RELElBQUksTUFBTSxLQUFLLE1BQU0sUUFBUSxPQUFPLE1BQU0sTUFBTSxPQUFPLEdBQUcsS0FBSyxNQUFNLFdBQVcsTUFBTSxNQUFNLE9BQU87QUFDekcsYUFBTyxJQUFJLGFBQVksS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPQSxRQUFPLEtBQUssU0FBUztBQUFBLElBQzlGLFdBQ1MsTUFBTSxNQUFNLEtBQUssUUFBUSxDQUFDLEtBQUssTUFBTSxhQUFhLENBQUMsTUFBTSxNQUFNLFNBQVM7QUFDN0UsVUFBSUEsU0FBUSxLQUFLLE1BQU0sT0FBTyxNQUFNLE1BQU0sUUFBUSxJQUFJLE1BQU0sUUFDdEQsSUFBSSxNQUFNLE1BQU0sTUFBTSxRQUFRLE9BQU8sS0FBSyxNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU0sV0FBVyxLQUFLLE1BQU0sT0FBTztBQUN6RyxhQUFPLElBQUksYUFBWSxNQUFNLE1BQU0sS0FBSyxJQUFJQSxRQUFPLEtBQUssU0FBUztBQUFBLElBQ3JFLE9BQ0s7QUFDRCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFBQSxFQUNBLFNBQVM7QUFDTCxRQUFJRixRQUFPLEVBQUUsVUFBVSxXQUFXLE1BQU0sS0FBSyxNQUFNLElBQUksS0FBSyxHQUFHO0FBQy9ELFFBQUksS0FBSyxNQUFNO0FBQ1gsTUFBQUEsTUFBSyxRQUFRLEtBQUssTUFBTSxPQUFPO0FBQ25DLFFBQUksS0FBSztBQUNMLE1BQUFBLE1BQUssWUFBWTtBQUNyQixXQUFPQTtBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sU0FBUyxRQUFRQSxPQUFNO0FBQzFCLFFBQUksT0FBT0EsTUFBSyxRQUFRLFlBQVksT0FBT0EsTUFBSyxNQUFNO0FBQ2xELFlBQU0sSUFBSSxXQUFXLHdDQUF3QztBQUNqRSxXQUFPLElBQUksYUFBWUEsTUFBSyxNQUFNQSxNQUFLLElBQUksTUFBTSxTQUFTLFFBQVFBLE1BQUssS0FBSyxHQUFHLENBQUMsQ0FBQ0EsTUFBSyxTQUFTO0FBQUEsRUFDbkc7QUFDSjtBQUNBLEtBQUssT0FBTyxXQUFXLFdBQVc7QUFNbEMsSUFBTSxvQkFBTixNQUFNLDJCQUEwQixLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPakMsWUFJQUYsT0FJQSxJQUlBLFNBSUEsT0FJQUksUUFLQSxRQUlBLFlBQVksT0FBTztBQUNmLFVBQU07QUFDTixTQUFLLE9BQU9KO0FBQ1osU0FBSyxLQUFLO0FBQ1YsU0FBSyxVQUFVO0FBQ2YsU0FBSyxRQUFRO0FBQ2IsU0FBSyxRQUFRSTtBQUNiLFNBQUssU0FBUztBQUNkLFNBQUssWUFBWTtBQUFBLEVBQ3JCO0FBQUEsRUFDQSxNQUFNRCxNQUFLO0FBQ1AsUUFBSSxLQUFLLGNBQWMsZUFBZUEsTUFBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQzlELGVBQWVBLE1BQUssS0FBSyxPQUFPLEtBQUssRUFBRTtBQUN2QyxhQUFPLFdBQVcsS0FBSywrQ0FBK0M7QUFDMUUsUUFBSSxNQUFNQSxLQUFJLE1BQU0sS0FBSyxTQUFTLEtBQUssS0FBSztBQUM1QyxRQUFJLElBQUksYUFBYSxJQUFJO0FBQ3JCLGFBQU8sV0FBVyxLQUFLLHlCQUF5QjtBQUNwRCxRQUFJLFdBQVcsS0FBSyxNQUFNLFNBQVMsS0FBSyxRQUFRLElBQUksT0FBTztBQUMzRCxRQUFJLENBQUM7QUFDRCxhQUFPLFdBQVcsS0FBSyw2QkFBNkI7QUFDeEQsV0FBTyxXQUFXLFlBQVlBLE1BQUssS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRO0FBQUEsRUFDbkU7QUFBQSxFQUNBLFNBQVM7QUFDTCxXQUFPLElBQUksUUFBUTtBQUFBLE1BQUMsS0FBSztBQUFBLE1BQU0sS0FBSyxVQUFVLEtBQUs7QUFBQSxNQUFNLEtBQUs7QUFBQSxNQUMxRCxLQUFLO0FBQUEsTUFBTyxLQUFLLEtBQUssS0FBSztBQUFBLE1BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSztBQUFBLElBQU0sQ0FBQztBQUFBLEVBQ3hFO0FBQUEsRUFDQSxPQUFPQSxNQUFLO0FBQ1IsUUFBSSxNQUFNLEtBQUssUUFBUSxLQUFLO0FBQzVCLFdBQU8sSUFBSSxtQkFBa0IsS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLLFFBQVEsS0FBSyxPQUFPLEtBQUssU0FBUyxLQUFLQSxLQUFJLE1BQU0sS0FBSyxNQUFNLEtBQUssRUFBRSxFQUFFLGNBQWMsS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLLFFBQVEsS0FBSyxJQUFJLEdBQUcsS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLLFNBQVM7QUFBQSxFQUM5UTtBQUFBLEVBQ0EsSUFBSSxTQUFTO0FBQ1QsUUFBSUgsUUFBTyxRQUFRLFVBQVUsS0FBSyxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsVUFBVSxLQUFLLElBQUksRUFBRTtBQUM5RSxRQUFJLFVBQVUsUUFBUSxJQUFJLEtBQUssU0FBUyxFQUFFLEdBQUcsUUFBUSxRQUFRLElBQUksS0FBSyxPQUFPLENBQUM7QUFDOUUsUUFBS0EsTUFBSyxpQkFBaUIsR0FBRyxpQkFBa0IsVUFBVUEsTUFBSyxPQUFPLFFBQVEsR0FBRztBQUM3RSxhQUFPO0FBQ1gsV0FBTyxJQUFJLG1CQUFrQkEsTUFBSyxLQUFLLEdBQUcsS0FBSyxTQUFTLE9BQU8sS0FBSyxPQUFPLEtBQUssUUFBUSxLQUFLLFNBQVM7QUFBQSxFQUMxRztBQUFBLEVBQ0EsU0FBUztBQUNMLFFBQUlFLFFBQU87QUFBQSxNQUFFLFVBQVU7QUFBQSxNQUFpQixNQUFNLEtBQUs7QUFBQSxNQUFNLElBQUksS0FBSztBQUFBLE1BQzlELFNBQVMsS0FBSztBQUFBLE1BQVMsT0FBTyxLQUFLO0FBQUEsTUFBTyxRQUFRLEtBQUs7QUFBQSxJQUFPO0FBQ2xFLFFBQUksS0FBSyxNQUFNO0FBQ1gsTUFBQUEsTUFBSyxRQUFRLEtBQUssTUFBTSxPQUFPO0FBQ25DLFFBQUksS0FBSztBQUNMLE1BQUFBLE1BQUssWUFBWTtBQUNyQixXQUFPQTtBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sU0FBUyxRQUFRQSxPQUFNO0FBQzFCLFFBQUksT0FBT0EsTUFBSyxRQUFRLFlBQVksT0FBT0EsTUFBSyxNQUFNLFlBQ2xELE9BQU9BLE1BQUssV0FBVyxZQUFZLE9BQU9BLE1BQUssU0FBUyxZQUFZLE9BQU9BLE1BQUssVUFBVTtBQUMxRixZQUFNLElBQUksV0FBVyw4Q0FBOEM7QUFDdkUsV0FBTyxJQUFJLG1CQUFrQkEsTUFBSyxNQUFNQSxNQUFLLElBQUlBLE1BQUssU0FBU0EsTUFBSyxPQUFPLE1BQU0sU0FBUyxRQUFRQSxNQUFLLEtBQUssR0FBR0EsTUFBSyxRQUFRLENBQUMsQ0FBQ0EsTUFBSyxTQUFTO0FBQUEsRUFDaEo7QUFDSjtBQUNBLEtBQUssT0FBTyxpQkFBaUIsaUJBQWlCO0FBQzlDLFNBQVMsZUFBZUMsTUFBS0gsT0FBTSxJQUFJO0FBQ25DLE1BQUksUUFBUUcsS0FBSSxRQUFRSCxLQUFJLEdBQUcsT0FBTyxLQUFLQSxPQUFNLFFBQVEsTUFBTTtBQUMvRCxTQUFPLE9BQU8sS0FBSyxRQUFRLEtBQUssTUFBTSxXQUFXLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxFQUFFLFlBQVk7QUFDckY7QUFDQTtBQUFBLEVBQ0o7QUFDQSxNQUFJLE9BQU8sR0FBRztBQUNWLFFBQUksT0FBTyxNQUFNLEtBQUssS0FBSyxFQUFFLFdBQVcsTUFBTSxXQUFXLEtBQUssQ0FBQztBQUMvRCxXQUFPLE9BQU8sR0FBRztBQUNiLFVBQUksQ0FBQyxRQUFRLEtBQUs7QUFDZCxlQUFPO0FBQ1gsYUFBTyxLQUFLO0FBQ1o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQUVBLFNBQVMsUUFBUU0sS0FBSU4sT0FBTSxJQUFJLE1BQU07QUFDakMsTUFBSSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDM0IsTUFBSSxVQUFVO0FBQ2QsRUFBQU0sSUFBRyxJQUFJLGFBQWFOLE9BQU0sSUFBSSxDQUFDLE1BQU0sS0FBSyxXQUFXO0FBQ2pELFFBQUksQ0FBQyxLQUFLO0FBQ047QUFDSixRQUFJLFFBQVEsS0FBSztBQUNqQixRQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssS0FBSyxPQUFPLEtBQUssZUFBZSxLQUFLLElBQUksR0FBRztBQUMvRCxVQUFJSCxTQUFRLEtBQUssSUFBSSxLQUFLRyxLQUFJLEdBQUdGLE9BQU0sS0FBSyxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUU7QUFDdkUsVUFBSSxTQUFTLEtBQUssU0FBUyxLQUFLO0FBQ2hDLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsWUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsTUFBTSxHQUFHO0FBQzNCLGNBQUksWUFBWSxTQUFTLE1BQU1ELFVBQVMsU0FBUyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDN0QscUJBQVMsS0FBS0M7QUFBQTtBQUVkLG9CQUFRLEtBQUssV0FBVyxJQUFJLGVBQWVELFFBQU9DLE1BQUssTUFBTSxDQUFDLENBQUMsQ0FBQztBQUFBLFFBQ3hFO0FBQUEsTUFDSjtBQUNBLFVBQUksVUFBVSxPQUFPLE1BQU1EO0FBQ3ZCLGVBQU8sS0FBS0M7QUFBQTtBQUVaLGNBQU0sS0FBSyxTQUFTLElBQUksWUFBWUQsUUFBT0MsTUFBSyxJQUFJLENBQUM7QUFBQSxJQUM3RDtBQUFBLEVBQ0osQ0FBQztBQUNELFVBQVEsUUFBUSxPQUFLUSxJQUFHLEtBQUssQ0FBQyxDQUFDO0FBQy9CLFFBQU0sUUFBUSxPQUFLQSxJQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ2pDO0FBQ0EsU0FBUyxXQUFXQSxLQUFJTixPQUFNLElBQUksTUFBTTtBQUNwQyxNQUFJLFVBQVUsQ0FBQyxHQUFHLE9BQU87QUFDekIsRUFBQU0sSUFBRyxJQUFJLGFBQWFOLE9BQU0sSUFBSSxDQUFDLE1BQU0sUUFBUTtBQUN6QyxRQUFJLENBQUMsS0FBSztBQUNOO0FBQ0o7QUFDQSxRQUFJLFdBQVc7QUFDZixRQUFJLGdCQUFnQixVQUFVO0FBQzFCLFVBQUksTUFBTSxLQUFLLE9BQU9PO0FBQ3RCLGFBQU9BLFNBQVEsS0FBSyxRQUFRLEdBQUcsR0FBRztBQUM5QixTQUFDLGFBQWEsV0FBVyxDQUFDLElBQUksS0FBS0EsTUFBSztBQUN4QyxjQUFNQSxPQUFNLGNBQWMsR0FBRztBQUFBLE1BQ2pDO0FBQUEsSUFDSixXQUNTLE1BQU07QUFDWCxVQUFJLEtBQUssUUFBUSxLQUFLLEtBQUs7QUFDdkIsbUJBQVcsQ0FBQyxJQUFJO0FBQUEsSUFDeEIsT0FDSztBQUNELGlCQUFXLEtBQUs7QUFBQSxJQUNwQjtBQUNBLFFBQUksWUFBWSxTQUFTLFFBQVE7QUFDN0IsVUFBSVQsT0FBTSxLQUFLLElBQUksTUFBTSxLQUFLLFVBQVUsRUFBRTtBQUMxQyxlQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3RDLFlBQUlVLFNBQVEsU0FBUyxDQUFDLEdBQUdEO0FBQ3pCLGlCQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3JDLGNBQUksSUFBSSxRQUFRLENBQUM7QUFDakIsY0FBSSxFQUFFLFFBQVEsT0FBTyxLQUFLQyxPQUFNLEdBQUcsUUFBUSxDQUFDLEVBQUUsS0FBSztBQUMvQyxZQUFBRCxTQUFRO0FBQUEsUUFDaEI7QUFDQSxZQUFJQSxRQUFPO0FBQ1AsVUFBQUEsT0FBTSxLQUFLVDtBQUNYLFVBQUFTLE9BQU0sT0FBTztBQUFBLFFBQ2pCLE9BQ0s7QUFDRCxrQkFBUSxLQUFLLEVBQUUsT0FBQUMsUUFBTyxNQUFNLEtBQUssSUFBSSxLQUFLUixLQUFJLEdBQUcsSUFBSUYsTUFBSyxLQUFLLENBQUM7QUFBQSxRQUNwRTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSixDQUFDO0FBQ0QsVUFBUSxRQUFRLE9BQUtRLElBQUcsS0FBSyxJQUFJLGVBQWUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNFO0FBQ0EsU0FBUyxrQkFBa0JBLEtBQUksS0FBSyxZQUFZLFFBQVEsV0FBVyxjQUFjO0FBQzdFLE1BQUksT0FBT0EsSUFBRyxJQUFJLE9BQU8sR0FBRztBQUM1QixNQUFJLFlBQVksQ0FBQyxHQUFHLE1BQU0sTUFBTTtBQUNoQyxXQUFTLElBQUksR0FBRyxJQUFJLEtBQUssWUFBWSxLQUFLO0FBQ3RDLFFBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQyxHQUFHUixPQUFNLE1BQU0sTUFBTTtBQUM3QyxRQUFJLFVBQVUsTUFBTSxVQUFVLE1BQU0sSUFBSTtBQUN4QyxRQUFJLENBQUMsU0FBUztBQUNWLGdCQUFVLEtBQUssSUFBSSxZQUFZLEtBQUtBLE1BQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUN6RCxPQUNLO0FBQ0QsY0FBUTtBQUNSLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxNQUFNLFFBQVE7QUFDcEMsWUFBSSxDQUFDLFdBQVcsZUFBZSxNQUFNLE1BQU0sQ0FBQyxFQUFFLElBQUk7QUFDOUMsVUFBQVEsSUFBRyxLQUFLLElBQUksZUFBZSxLQUFLUixNQUFLLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM1RCxVQUFJLE1BQU0sVUFBVSxDQUFDLFdBQVcsS0FBSyxNQUFNO0FBQ3ZDLFlBQUksR0FBRyxVQUFVLGFBQWFNO0FBQzlCLGVBQU8sSUFBSSxRQUFRLEtBQUssTUFBTSxJQUFJLEdBQUc7QUFDakMsY0FBSSxDQUFDQTtBQUNELFlBQUFBLFNBQVEsSUFBSSxNQUFNLFNBQVMsS0FBSyxXQUFXLE9BQU8sS0FBSyxLQUFLLFdBQVcsYUFBYSxNQUFNLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzVHLG9CQUFVLEtBQUssSUFBSSxZQUFZLE1BQU0sRUFBRSxPQUFPLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVFBLE1BQUssQ0FBQztBQUFBLFFBQ3JGO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxVQUFNTjtBQUFBLEVBQ1Y7QUFDQSxNQUFJLENBQUMsTUFBTSxVQUFVO0FBQ2pCLFFBQUksT0FBTyxNQUFNLFdBQVcsU0FBUyxPQUFPLElBQUk7QUFDaEQsSUFBQVEsSUFBRyxRQUFRLEtBQUssS0FBSyxJQUFJLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUFBLEVBQzlDO0FBQ0EsV0FBUyxJQUFJLFVBQVUsU0FBUyxHQUFHLEtBQUssR0FBRztBQUN2QyxJQUFBQSxJQUFHLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDNUI7QUFFQSxTQUFTLE9BQU8sTUFBTVQsUUFBT0MsTUFBSztBQUM5QixVQUFRRCxVQUFTLEtBQUssS0FBSyxXQUFXQSxRQUFPLEtBQUssVUFBVSxPQUN2REMsUUFBTyxLQUFLLGNBQWMsS0FBSyxXQUFXLEdBQUdBLElBQUc7QUFDekQ7QUFNQSxTQUFTLFdBQVcsT0FBTztBQUN2QixNQUFJLFNBQVMsTUFBTTtBQUNuQixNQUFJLFVBQVUsT0FBTyxRQUFRLFdBQVcsTUFBTSxZQUFZLE1BQU0sUUFBUTtBQUN4RSxXQUFTLFFBQVEsTUFBTSxTQUFRLEVBQUUsT0FBTztBQUNwQyxRQUFJLE9BQU8sTUFBTSxNQUFNLEtBQUssS0FBSztBQUNqQyxRQUFJLFFBQVEsTUFBTSxNQUFNLE1BQU0sS0FBSyxHQUFHLFdBQVcsTUFBTSxJQUFJLFdBQVcsS0FBSztBQUMzRSxRQUFJLFFBQVEsTUFBTSxTQUFTLEtBQUssV0FBVyxPQUFPLFVBQVUsT0FBTztBQUMvRCxhQUFPO0FBQ1gsUUFBSSxTQUFTLEtBQUssS0FBSyxLQUFLLEtBQUssYUFBYSxDQUFDLE9BQU8sTUFBTSxPQUFPLFFBQVE7QUFDdkU7QUFBQSxFQUNSO0FBQ0EsU0FBTztBQUNYO0FBQ0EsU0FBUyxLQUFLUSxLQUFJLE9BQU8sUUFBUTtBQUM3QixNQUFJLEVBQUUsT0FBTyxLQUFLLE1BQU0sSUFBSTtBQUM1QixNQUFJLFdBQVcsTUFBTSxPQUFPLFFBQVEsQ0FBQyxHQUFHLFNBQVMsSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUNwRSxNQUFJVCxTQUFRLFVBQVVDLE9BQU07QUFDNUIsTUFBSSxTQUFTLFNBQVMsT0FBTyxZQUFZO0FBQ3pDLFdBQVMsSUFBSSxPQUFPLFlBQVksT0FBTyxJQUFJLFFBQVE7QUFDL0MsUUFBSSxhQUFhLE1BQU0sTUFBTSxDQUFDLElBQUksR0FBRztBQUNqQyxrQkFBWTtBQUNaLGVBQVMsU0FBUyxLQUFLLE1BQU0sS0FBSyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFDakQ7QUFBQSxJQUNKLE9BQ0s7QUFDRCxNQUFBRDtBQUFBLElBQ0o7QUFDSixNQUFJLFFBQVEsU0FBUyxPQUFPLFVBQVU7QUFDdEMsV0FBUyxJQUFJLE9BQU8sWUFBWSxPQUFPLElBQUksUUFBUTtBQUMvQyxRQUFJLGFBQWEsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7QUFDNUMsa0JBQVk7QUFDWixjQUFRLFNBQVMsS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDO0FBQzdDO0FBQUEsSUFDSixPQUNLO0FBQ0QsTUFBQUM7QUFBQSxJQUNKO0FBQ0osRUFBQVEsSUFBRyxLQUFLLElBQUksa0JBQWtCVCxRQUFPQyxNQUFLLFVBQVUsUUFBUSxJQUFJLE1BQU0sT0FBTyxPQUFPLEtBQUssR0FBRyxXQUFXLE9BQU8sR0FBRyxPQUFPLE9BQU8sV0FBVyxJQUFJLENBQUM7QUFDbko7QUFTQSxTQUFTLGFBQWEsT0FBTyxVQUFVLFFBQVEsTUFBTSxhQUFhLE9BQU87QUFDckUsTUFBSSxTQUFTLG9CQUFvQixPQUFPLFFBQVE7QUFDaEQsTUFBSSxRQUFRLFVBQVUsbUJBQW1CLFlBQVksUUFBUTtBQUM3RCxNQUFJLENBQUM7QUFDRCxXQUFPO0FBQ1gsU0FBTyxPQUFPLElBQUksU0FBUyxFQUN0QixPQUFPLEVBQUUsTUFBTSxVQUFVLE1BQU0sQ0FBQyxFQUFFLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUN0RTtBQUNBLFNBQVMsVUFBVSxNQUFNO0FBQUUsU0FBTyxFQUFFLE1BQU0sT0FBTyxLQUFLO0FBQUc7QUFDekQsU0FBUyxvQkFBb0IsT0FBTyxNQUFNO0FBQ3RDLE1BQUksRUFBRSxRQUFRLFlBQVksU0FBUyxJQUFJO0FBQ3ZDLE1BQUksU0FBUyxPQUFPLGVBQWUsVUFBVSxFQUFFLGFBQWEsSUFBSTtBQUNoRSxNQUFJLENBQUM7QUFDRCxXQUFPO0FBQ1gsTUFBSSxRQUFRLE9BQU8sU0FBUyxPQUFPLENBQUMsSUFBSTtBQUN4QyxTQUFPLE9BQU8sZUFBZSxZQUFZLFVBQVUsS0FBSyxJQUFJLFNBQVM7QUFDekU7QUFDQSxTQUFTLG1CQUFtQixPQUFPLE1BQU07QUFDckMsTUFBSSxFQUFFLFFBQVEsWUFBWSxTQUFTLElBQUk7QUFDdkMsTUFBSSxRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQ25DLE1BQUksU0FBUyxLQUFLLGFBQWEsYUFBYSxNQUFNLElBQUk7QUFDdEQsTUFBSSxDQUFDO0FBQ0QsV0FBTztBQUNYLE1BQUksV0FBVyxPQUFPLFNBQVMsT0FBTyxPQUFPLFNBQVMsQ0FBQyxJQUFJO0FBQzNELE1BQUksYUFBYSxTQUFTO0FBQzFCLFdBQVMsSUFBSSxZQUFZLGNBQWMsSUFBSSxVQUFVO0FBQ2pELGlCQUFhLFdBQVcsVUFBVSxPQUFPLE1BQU0sQ0FBQyxFQUFFLElBQUk7QUFDMUQsTUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXO0FBQzNCLFdBQU87QUFDWCxTQUFPO0FBQ1g7QUFDQSxTQUFTLEtBQUtRLEtBQUksT0FBTyxVQUFVO0FBQy9CLE1BQUksVUFBVSxTQUFTO0FBQ3ZCLFdBQVMsSUFBSSxTQUFTLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUMzQyxRQUFJLFFBQVEsTUFBTTtBQUNkLFVBQUksUUFBUSxTQUFTLENBQUMsRUFBRSxLQUFLLGFBQWEsY0FBYyxPQUFPO0FBQy9ELFVBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTtBQUNqQixjQUFNLElBQUksV0FBVyx3RkFBd0Y7QUFBQSxJQUNySDtBQUNBLGNBQVUsU0FBUyxLQUFLLFNBQVMsQ0FBQyxFQUFFLEtBQUssT0FBTyxTQUFTLENBQUMsRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUFBLEVBQy9FO0FBQ0EsTUFBSVQsU0FBUSxNQUFNLE9BQU9DLE9BQU0sTUFBTTtBQUNyQyxFQUFBUSxJQUFHLEtBQUssSUFBSSxrQkFBa0JULFFBQU9DLE1BQUtELFFBQU9DLE1BQUssSUFBSSxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsU0FBUyxRQUFRLElBQUksQ0FBQztBQUMxRztBQUNBLFNBQVMsYUFBYVEsS0FBSU4sT0FBTSxJQUFJLE1BQU0sT0FBTztBQUM3QyxNQUFJLENBQUMsS0FBSztBQUNOLFVBQU0sSUFBSSxXQUFXLGtEQUFrRDtBQUMzRSxNQUFJLFVBQVVNLElBQUcsTUFBTTtBQUN2QixFQUFBQSxJQUFHLElBQUksYUFBYU4sT0FBTSxJQUFJLENBQUMsTUFBTSxRQUFRO0FBQ3pDLFFBQUksS0FBSyxlQUFlLENBQUMsS0FBSyxVQUFVLE1BQU0sS0FBSyxLQUFLLGNBQWNNLElBQUcsS0FBS0EsSUFBRyxRQUFRLE1BQU0sT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksR0FBRztBQUVySCxNQUFBQSxJQUFHLGtCQUFrQkEsSUFBRyxRQUFRLE1BQU0sT0FBTyxFQUFFLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSTtBQUNoRSxVQUFJLFVBQVVBLElBQUcsUUFBUSxNQUFNLE9BQU87QUFDdEMsVUFBSSxTQUFTLFFBQVEsSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLFFBQVEsSUFBSSxNQUFNLEtBQUssVUFBVSxDQUFDO0FBQzNFLE1BQUFBLElBQUcsS0FBSyxJQUFJLGtCQUFrQixRQUFRLE1BQU0sU0FBUyxHQUFHLE9BQU8sR0FBRyxJQUFJLE1BQU0sU0FBUyxLQUFLLEtBQUssT0FBTyxPQUFPLE1BQU0sS0FBSyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNoSixhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBQ0EsU0FBUyxjQUFjSCxNQUFLLEtBQUssTUFBTTtBQUNuQyxNQUFJLE9BQU9BLEtBQUksUUFBUSxHQUFHLEdBQUcsUUFBUSxLQUFLLE1BQU07QUFDaEQsU0FBTyxLQUFLLE9BQU8sZUFBZSxPQUFPLFFBQVEsR0FBRyxJQUFJO0FBQzVEO0FBS0EsU0FBUyxjQUFjRyxLQUFJLEtBQUssTUFBTSxPQUFPLE9BQU87QUFDaEQsTUFBSSxPQUFPQSxJQUFHLElBQUksT0FBTyxHQUFHO0FBQzVCLE1BQUksQ0FBQztBQUNELFVBQU0sSUFBSSxXQUFXLDJCQUEyQjtBQUNwRCxNQUFJLENBQUM7QUFDRCxXQUFPLEtBQUs7QUFDaEIsTUFBSUcsV0FBVSxLQUFLLE9BQU8sT0FBTyxNQUFNLFNBQVMsS0FBSyxLQUFLO0FBQzFELE1BQUksS0FBSztBQUNMLFdBQU9ILElBQUcsWUFBWSxLQUFLLE1BQU0sS0FBSyxVQUFVRyxRQUFPO0FBQzNELE1BQUksQ0FBQyxLQUFLLGFBQWEsS0FBSyxPQUFPO0FBQy9CLFVBQU0sSUFBSSxXQUFXLG1DQUFtQyxLQUFLLElBQUk7QUFDckUsRUFBQUgsSUFBRyxLQUFLLElBQUksa0JBQWtCLEtBQUssTUFBTSxLQUFLLFVBQVUsTUFBTSxHQUFHLE1BQU0sS0FBSyxXQUFXLEdBQUcsSUFBSSxNQUFNLFNBQVMsS0FBS0csUUFBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQy9JO0FBSUEsU0FBUyxTQUFTTixNQUFLLEtBQUssUUFBUSxHQUFHLFlBQVk7QUFDL0MsTUFBSSxPQUFPQSxLQUFJLFFBQVEsR0FBRyxHQUFHTyxRQUFPLEtBQUssUUFBUTtBQUNqRCxNQUFJLFlBQWEsY0FBYyxXQUFXLFdBQVcsU0FBUyxDQUFDLEtBQU0sS0FBSztBQUMxRSxNQUFJQSxRQUFPLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSyxhQUNsQyxDQUFDLEtBQUssT0FBTyxXQUFXLEtBQUssTUFBTSxHQUFHLEtBQUssT0FBTyxVQUFVLEtBQzVELENBQUMsVUFBVSxLQUFLLGFBQWEsS0FBSyxPQUFPLFFBQVEsV0FBVyxLQUFLLE1BQU0sR0FBRyxLQUFLLE9BQU8sVUFBVSxDQUFDO0FBQ2pHLFdBQU87QUFDWCxXQUFTLElBQUksS0FBSyxRQUFRLEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSUEsT0FBTSxLQUFLLEtBQUs7QUFDNUQsUUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLEdBQUdDLFNBQVEsS0FBSyxNQUFNLENBQUM7QUFDN0MsUUFBSSxLQUFLLEtBQUssS0FBSztBQUNmLGFBQU87QUFDWCxRQUFJLE9BQU8sS0FBSyxRQUFRLFdBQVdBLFFBQU8sS0FBSyxVQUFVO0FBQ3pELFFBQUksZ0JBQWdCLGNBQWMsV0FBVyxJQUFJLENBQUM7QUFDbEQsUUFBSTtBQUNBLGFBQU8sS0FBSyxhQUFhLEdBQUcsY0FBYyxLQUFLLE9BQU8sY0FBYyxLQUFLLENBQUM7QUFDOUUsUUFBSSxRQUFTLGNBQWMsV0FBVyxDQUFDLEtBQU07QUFDN0MsUUFBSSxDQUFDLEtBQUssV0FBV0EsU0FBUSxHQUFHLEtBQUssVUFBVSxLQUFLLENBQUMsTUFBTSxLQUFLLGFBQWEsSUFBSTtBQUM3RSxhQUFPO0FBQUEsRUFDZjtBQUNBLE1BQUksUUFBUSxLQUFLLFdBQVdELEtBQUk7QUFDaEMsTUFBSSxXQUFXLGNBQWMsV0FBVyxDQUFDO0FBQ3pDLFNBQU8sS0FBSyxLQUFLQSxLQUFJLEVBQUUsZUFBZSxPQUFPLE9BQU8sV0FBVyxTQUFTLE9BQU8sS0FBSyxLQUFLQSxRQUFPLENBQUMsRUFBRSxJQUFJO0FBQzNHO0FBQ0EsU0FBUyxNQUFNSixLQUFJLEtBQUssUUFBUSxHQUFHLFlBQVk7QUFDM0MsTUFBSSxPQUFPQSxJQUFHLElBQUksUUFBUSxHQUFHLEdBQUcsU0FBUyxTQUFTLE9BQU8sUUFBUSxTQUFTO0FBQzFFLFdBQVMsSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLFFBQVEsT0FBTyxJQUFJLFFBQVEsR0FBRyxJQUFJLEdBQUcsS0FBSyxLQUFLO0FBQzdFLGFBQVMsU0FBUyxLQUFLLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFDaEQsUUFBSSxZQUFZLGNBQWMsV0FBVyxDQUFDO0FBQzFDLFlBQVEsU0FBUyxLQUFLLFlBQVksVUFBVSxLQUFLLE9BQU8sVUFBVSxPQUFPLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDO0FBQUEsRUFDOUc7QUFDQSxFQUFBQSxJQUFHLEtBQUssSUFBSSxZQUFZLEtBQUssS0FBSyxJQUFJLE1BQU0sT0FBTyxPQUFPLEtBQUssR0FBRyxPQUFPLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDMUY7QUFLQSxTQUFTLFFBQVFILE1BQUssS0FBSztBQUN2QixNQUFJLE9BQU9BLEtBQUksUUFBUSxHQUFHLEdBQUcsUUFBUSxLQUFLLE1BQU07QUFDaEQsU0FBT1MsVUFBUyxLQUFLLFlBQVksS0FBSyxTQUFTLEtBQzNDLEtBQUssT0FBTyxXQUFXLE9BQU8sUUFBUSxDQUFDO0FBQy9DO0FBQ0EsU0FBU0EsVUFBUyxHQUFHLEdBQUc7QUFDcEIsU0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO0FBQ2xEO0FBTUEsU0FBUyxVQUFVVCxNQUFLLEtBQUssTUFBTSxJQUFJO0FBQ25DLE1BQUksT0FBT0EsS0FBSSxRQUFRLEdBQUc7QUFDMUIsV0FBUyxJQUFJLEtBQUssU0FBUSxLQUFLO0FBQzNCLFFBQUksUUFBUSxPQUFPLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFDdkMsUUFBSSxLQUFLLEtBQUssT0FBTztBQUNqQixlQUFTLEtBQUs7QUFDZCxjQUFRLEtBQUs7QUFBQSxJQUNqQixXQUNTLE1BQU0sR0FBRztBQUNkLGVBQVMsS0FBSyxLQUFLLElBQUksQ0FBQztBQUN4QjtBQUNBLGNBQVEsS0FBSyxLQUFLLENBQUMsRUFBRSxXQUFXLEtBQUs7QUFBQSxJQUN6QyxPQUNLO0FBQ0QsZUFBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLFdBQVcsUUFBUSxDQUFDO0FBQzFDLGNBQVEsS0FBSyxLQUFLLElBQUksQ0FBQztBQUFBLElBQzNCO0FBQ0EsUUFBSSxVQUFVLENBQUMsT0FBTyxlQUFlUyxVQUFTLFFBQVEsS0FBSyxLQUN2RCxLQUFLLEtBQUssQ0FBQyxFQUFFLFdBQVcsT0FBTyxRQUFRLENBQUM7QUFDeEMsYUFBTztBQUNYLFFBQUksS0FBSztBQUNMO0FBQ0osVUFBTSxNQUFNLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ2pEO0FBQ0o7QUFDQSxTQUFTLEtBQUtOLEtBQUksS0FBSyxPQUFPO0FBQzFCLE1BQUksT0FBTyxJQUFJLFlBQVksTUFBTSxPQUFPLE1BQU0sT0FBTyxNQUFNLE9BQU8sSUFBSTtBQUN0RSxFQUFBQSxJQUFHLEtBQUssSUFBSTtBQUNoQjtBQU9BLFNBQVMsWUFBWUgsTUFBSyxLQUFLLFVBQVU7QUFDckMsTUFBSSxPQUFPQSxLQUFJLFFBQVEsR0FBRztBQUMxQixNQUFJLEtBQUssT0FBTyxlQUFlLEtBQUssTUFBTSxHQUFHLEtBQUssTUFBTSxHQUFHLFFBQVE7QUFDL0QsV0FBTztBQUNYLE1BQUksS0FBSyxnQkFBZ0I7QUFDckIsYUFBUyxJQUFJLEtBQUssUUFBUSxHQUFHLEtBQUssR0FBRyxLQUFLO0FBQ3RDLFVBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQztBQUN4QixVQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsZUFBZSxPQUFPLE9BQU8sUUFBUTtBQUNsRCxlQUFPLEtBQUssT0FBTyxJQUFJLENBQUM7QUFDNUIsVUFBSSxRQUFRO0FBQ1IsZUFBTztBQUFBLElBQ2Y7QUFDSixNQUFJLEtBQUssZ0JBQWdCLEtBQUssT0FBTyxRQUFRO0FBQ3pDLGFBQVMsSUFBSSxLQUFLLFFBQVEsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUN0QyxVQUFJLFFBQVEsS0FBSyxXQUFXLENBQUM7QUFDN0IsVUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLGVBQWUsT0FBTyxPQUFPLFFBQVE7QUFDbEQsZUFBTyxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQzNCLFVBQUksUUFBUSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3JCLGVBQU87QUFBQSxJQUNmO0FBQ0osU0FBTztBQUNYO0FBT0EsU0FBUyxVQUFVQSxNQUFLLEtBQUtDLFFBQU87QUFDaEMsTUFBSSxPQUFPRCxLQUFJLFFBQVEsR0FBRztBQUMxQixNQUFJLENBQUNDLE9BQU0sUUFBUTtBQUNmLFdBQU87QUFDWCxNQUFJLFVBQVVBLE9BQU07QUFDcEIsV0FBUyxJQUFJLEdBQUcsSUFBSUEsT0FBTSxXQUFXO0FBQ2pDLGNBQVUsUUFBUSxXQUFXO0FBQ2pDLFdBQVMsT0FBTyxHQUFHLFNBQVNBLE9BQU0sYUFBYSxLQUFLQSxPQUFNLE9BQU8sSUFBSSxJQUFJLFFBQVE7QUFDN0UsYUFBUyxJQUFJLEtBQUssT0FBTyxLQUFLLEdBQUcsS0FBSztBQUNsQyxVQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLFFBQVEsS0FBSyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUs7QUFDOUYsVUFBSSxZQUFZLEtBQUssTUFBTSxDQUFDLEtBQUssT0FBTyxJQUFJLElBQUk7QUFDaEQsVUFBSSxTQUFTLEtBQUssS0FBSyxDQUFDLEdBQUcsT0FBTztBQUNsQyxVQUFJLFFBQVEsR0FBRztBQUNYLGVBQU8sT0FBTyxXQUFXLFdBQVcsV0FBVyxPQUFPO0FBQUEsTUFDMUQsT0FDSztBQUNELFlBQUksV0FBVyxPQUFPLGVBQWUsU0FBUyxFQUFFLGFBQWEsUUFBUSxXQUFXLElBQUk7QUFDcEYsZUFBTyxZQUFZLE9BQU8sZUFBZSxXQUFXLFdBQVcsU0FBUyxDQUFDLENBQUM7QUFBQSxNQUM5RTtBQUNBLFVBQUk7QUFDQSxlQUFPLFFBQVEsSUFBSSxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsSUFDdEY7QUFBQSxFQUNKO0FBQ0EsU0FBTztBQUNYO0FBUUEsU0FBUyxZQUFZRCxNQUFLSCxPQUFNLEtBQUtBLE9BQU1JLFNBQVEsTUFBTSxPQUFPO0FBQzVELE1BQUlKLFNBQVEsTUFBTSxDQUFDSSxPQUFNO0FBQ3JCLFdBQU87QUFDWCxNQUFJLFFBQVFELEtBQUksUUFBUUgsS0FBSSxHQUFHLE1BQU1HLEtBQUksUUFBUSxFQUFFO0FBRW5ELE1BQUksY0FBYyxPQUFPLEtBQUtDLE1BQUs7QUFDL0IsV0FBTyxJQUFJLFlBQVlKLE9BQU0sSUFBSUksTUFBSztBQUMxQyxTQUFPLElBQUksT0FBTyxPQUFPLEtBQUtBLE1BQUssRUFBRSxJQUFJO0FBQzdDO0FBQ0EsU0FBUyxjQUFjLE9BQU8sS0FBS0EsUUFBTztBQUN0QyxTQUFPLENBQUNBLE9BQU0sYUFBYSxDQUFDQSxPQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUssSUFBSSxNQUFNLEtBQ3BFLE1BQU0sT0FBTyxXQUFXLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxHQUFHQSxPQUFNLE9BQU87QUFDekU7QUFxQkEsSUFBTSxTQUFOLE1BQWE7QUFBQSxFQUNULFlBQVksT0FBTyxLQUFLLFVBQVU7QUFDOUIsU0FBSyxRQUFRO0FBQ2IsU0FBSyxNQUFNO0FBQ1gsU0FBSyxXQUFXO0FBQ2hCLFNBQUssV0FBVyxDQUFDO0FBQ2pCLFNBQUssU0FBUyxTQUFTO0FBQ3ZCLGFBQVMsSUFBSSxHQUFHLEtBQUssTUFBTSxPQUFPLEtBQUs7QUFDbkMsVUFBSSxPQUFPLE1BQU0sS0FBSyxDQUFDO0FBQ3ZCLFdBQUssU0FBUyxLQUFLO0FBQUEsUUFDZixNQUFNLEtBQUs7QUFBQSxRQUNYLE9BQU8sS0FBSyxlQUFlLE1BQU0sV0FBVyxDQUFDLENBQUM7QUFBQSxNQUNsRCxDQUFDO0FBQUEsSUFDTDtBQUNBLGFBQVMsSUFBSSxNQUFNLE9BQU8sSUFBSSxHQUFHO0FBQzdCLFdBQUssU0FBUyxTQUFTLEtBQUssTUFBTSxLQUFLLENBQUMsRUFBRSxLQUFLLEtBQUssTUFBTSxDQUFDO0FBQUEsRUFDbkU7QUFBQSxFQUNBLElBQUksUUFBUTtBQUFFLFdBQU8sS0FBSyxTQUFTLFNBQVM7QUFBQSxFQUFHO0FBQUEsRUFDL0MsTUFBTTtBQUlGLFdBQU8sS0FBSyxTQUFTLE1BQU07QUFDdkIsVUFBSSxNQUFNLEtBQUssYUFBYTtBQUM1QixVQUFJO0FBQ0EsYUFBSyxXQUFXLEdBQUc7QUFBQTtBQUVuQixhQUFLLFNBQVMsS0FBSyxLQUFLLFNBQVM7QUFBQSxJQUN6QztBQU1BLFFBQUksYUFBYSxLQUFLLGVBQWUsR0FBRyxhQUFhLEtBQUssT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLLE1BQU07QUFDaEcsUUFBSSxRQUFRLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxhQUFhLElBQUksS0FBSyxNQUFNLE1BQU0sSUFBSSxRQUFRLFVBQVUsQ0FBQztBQUNsRyxRQUFJLENBQUM7QUFDRCxhQUFPO0FBRVgsUUFBSSxVQUFVLEtBQUssUUFBUSxZQUFZLE1BQU0sT0FBTyxVQUFVLElBQUk7QUFDbEUsV0FBTyxhQUFhLFdBQVcsUUFBUSxjQUFjLEdBQUc7QUFDcEQsZ0JBQVUsUUFBUSxXQUFXO0FBQzdCO0FBQ0E7QUFBQSxJQUNKO0FBQ0EsUUFBSUEsU0FBUSxJQUFJLE1BQU0sU0FBUyxXQUFXLE9BQU87QUFDakQsUUFBSSxhQUFhO0FBQ2IsYUFBTyxJQUFJLGtCQUFrQixNQUFNLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxHQUFHQSxRQUFPLFVBQVU7QUFDdkcsUUFBSUEsT0FBTSxRQUFRLE1BQU0sT0FBTyxLQUFLLElBQUk7QUFDcEMsYUFBTyxJQUFJLFlBQVksTUFBTSxLQUFLLElBQUksS0FBS0EsTUFBSztBQUNwRCxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsZUFBZTtBQUNYLFFBQUksYUFBYSxLQUFLLFNBQVM7QUFDL0IsYUFBUyxNQUFNLEtBQUssU0FBUyxTQUFTLElBQUksR0FBRyxVQUFVLEtBQUssU0FBUyxTQUFTLElBQUksWUFBWSxLQUFLO0FBQy9GLFVBQUksT0FBTyxJQUFJO0FBQ2YsVUFBSSxJQUFJLGFBQWE7QUFDakIsa0JBQVU7QUFDZCxVQUFJLEtBQUssS0FBSyxLQUFLLGFBQWEsV0FBVyxHQUFHO0FBQzFDLHFCQUFhO0FBQ2I7QUFBQSxNQUNKO0FBQ0EsWUFBTSxLQUFLO0FBQUEsSUFDZjtBQUdBLGFBQVMsT0FBTyxHQUFHLFFBQVEsR0FBRyxRQUFRO0FBQ2xDLGVBQVMsYUFBYSxRQUFRLElBQUksYUFBYSxLQUFLLFNBQVMsV0FBVyxjQUFjLEdBQUcsY0FBYztBQUNuRyxZQUFJLFVBQVUsU0FBUztBQUN2QixZQUFJLFlBQVk7QUFDWixtQkFBUyxVQUFVLEtBQUssU0FBUyxTQUFTLGFBQWEsQ0FBQyxFQUFFO0FBQzFELHFCQUFXLE9BQU87QUFBQSxRQUN0QixPQUNLO0FBQ0QscUJBQVcsS0FBSyxTQUFTO0FBQUEsUUFDN0I7QUFDQSxZQUFJUyxTQUFRLFNBQVM7QUFDckIsaUJBQVMsZ0JBQWdCLEtBQUssT0FBTyxpQkFBaUIsR0FBRyxpQkFBaUI7QUFDdEUsY0FBSSxFQUFFLE1BQU0sTUFBTSxJQUFJLEtBQUssU0FBUyxhQUFhLEdBQUdDLE9BQU0sU0FBUztBQUluRSxjQUFJLFFBQVEsTUFBTUQsU0FBUSxNQUFNLFVBQVVBLE9BQU0sSUFBSSxNQUFNLFNBQVMsTUFBTSxXQUFXLFNBQVMsS0FBS0EsTUFBSyxHQUFHLEtBQUssS0FDekcsVUFBVSxLQUFLLGtCQUFrQixPQUFPLElBQUk7QUFDOUMsbUJBQU8sRUFBRSxZQUFZLGVBQWUsUUFBUSxPQUFPO0FBQUEsbUJBRzlDLFFBQVEsS0FBS0EsV0FBVUMsUUFBTyxNQUFNLGFBQWFELE9BQU0sSUFBSTtBQUNoRSxtQkFBTyxFQUFFLFlBQVksZUFBZSxRQUFRLE1BQUFDLE1BQUs7QUFHckQsY0FBSSxVQUFVLE1BQU0sVUFBVSxPQUFPLElBQUk7QUFDckM7QUFBQSxRQUNSO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFDQSxXQUFXO0FBQ1AsUUFBSSxFQUFFLFNBQVMsV0FBVyxRQUFRLElBQUksS0FBSztBQUMzQyxRQUFJLFFBQVEsVUFBVSxTQUFTLFNBQVM7QUFDeEMsUUFBSSxDQUFDLE1BQU0sY0FBYyxNQUFNLFdBQVc7QUFDdEMsYUFBTztBQUNYLFNBQUssV0FBVyxJQUFJLE1BQU0sU0FBUyxZQUFZLEdBQUcsS0FBSyxJQUFJLFNBQVMsTUFBTSxPQUFPLGFBQWEsUUFBUSxPQUFPLFVBQVUsWUFBWSxJQUFJLENBQUMsQ0FBQztBQUN6SSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsV0FBVztBQUNQLFFBQUksRUFBRSxTQUFTLFdBQVcsUUFBUSxJQUFJLEtBQUs7QUFDM0MsUUFBSSxRQUFRLFVBQVUsU0FBUyxTQUFTO0FBQ3hDLFFBQUksTUFBTSxjQUFjLEtBQUssWUFBWSxHQUFHO0FBQ3hDLFVBQUksWUFBWSxRQUFRLE9BQU8sYUFBYSxZQUFZLE1BQU07QUFDOUQsV0FBSyxXQUFXLElBQUksTUFBTSxpQkFBaUIsU0FBUyxZQUFZLEdBQUcsQ0FBQyxHQUFHLFlBQVksR0FBRyxZQUFZLFlBQVksSUFBSSxPQUFPO0FBQUEsSUFDN0gsT0FDSztBQUNELFdBQUssV0FBVyxJQUFJLE1BQU0saUJBQWlCLFNBQVMsV0FBVyxDQUFDLEdBQUcsV0FBVyxPQUFPO0FBQUEsSUFDekY7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxXQUFXLEVBQUUsWUFBWSxlQUFlLFFBQVEsUUFBUSxNQUFBQSxNQUFLLEdBQUc7QUFDNUQsV0FBTyxLQUFLLFFBQVE7QUFDaEIsV0FBSyxrQkFBa0I7QUFDM0IsUUFBSUE7QUFDQSxlQUFTLElBQUksR0FBRyxJQUFJQSxNQUFLLFFBQVE7QUFDN0IsYUFBSyxpQkFBaUJBLE1BQUssQ0FBQyxDQUFDO0FBQ3JDLFFBQUlWLFNBQVEsS0FBSyxVQUFVLFdBQVcsU0FBUyxPQUFPLFVBQVVBLE9BQU07QUFDdEUsUUFBSSxZQUFZQSxPQUFNLFlBQVk7QUFDbEMsUUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBQ3RCLFFBQUksRUFBRSxPQUFPLEtBQUssSUFBSSxLQUFLLFNBQVMsYUFBYTtBQUNqRCxRQUFJLFFBQVE7QUFDUixlQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sWUFBWTtBQUNuQyxZQUFJLEtBQUssT0FBTyxNQUFNLENBQUMsQ0FBQztBQUM1QixjQUFRLE1BQU0sY0FBYyxNQUFNO0FBQUEsSUFDdEM7QUFJQSxRQUFJLGVBQWdCLFNBQVMsT0FBTyxjQUFlQSxPQUFNLFFBQVEsT0FBT0EsT0FBTTtBQUc5RSxXQUFPLFFBQVEsU0FBUyxZQUFZO0FBQ2hDLFVBQUksT0FBTyxTQUFTLE1BQU0sS0FBSyxHQUFHVyxXQUFVLE1BQU0sVUFBVSxLQUFLLElBQUk7QUFDckUsVUFBSSxDQUFDQTtBQUNEO0FBQ0o7QUFDQSxVQUFJLFFBQVEsS0FBSyxhQUFhLEtBQUssS0FBSyxRQUFRLE1BQU07QUFDbEQsZ0JBQVFBO0FBQ1IsWUFBSSxLQUFLLGVBQWUsS0FBSyxLQUFLLEtBQUssYUFBYSxLQUFLLEtBQUssQ0FBQyxHQUFHLFNBQVMsSUFBSSxZQUFZLEdBQUcsU0FBUyxTQUFTLGFBQWEsZUFBZSxFQUFFLENBQUM7QUFBQSxNQUNuSjtBQUFBLElBQ0o7QUFDQSxRQUFJLFFBQVEsU0FBUyxTQUFTO0FBQzlCLFFBQUksQ0FBQztBQUNELHFCQUFlO0FBQ25CLFNBQUssU0FBUyxjQUFjLEtBQUssUUFBUSxlQUFlLFNBQVMsS0FBSyxHQUFHLENBQUM7QUFDMUUsU0FBSyxTQUFTLGFBQWEsRUFBRSxRQUFRO0FBR3JDLFFBQUksU0FBUyxlQUFlLEtBQUssVUFBVSxPQUFPLFFBQVEsS0FBSyxTQUFTLEtBQUssS0FBSyxFQUFFLFFBQVEsS0FBSyxTQUFTLFNBQVM7QUFDL0csV0FBSyxrQkFBa0I7QUFFM0IsYUFBUyxJQUFJLEdBQUcsTUFBTSxVQUFVLElBQUksY0FBYyxLQUFLO0FBQ25ELFVBQUksT0FBTyxJQUFJO0FBQ2YsV0FBSyxTQUFTLEtBQUssRUFBRSxNQUFNLEtBQUssTUFBTSxPQUFPLEtBQUssZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO0FBQ25GLFlBQU0sS0FBSztBQUFBLElBQ2Y7QUFJQSxTQUFLLFdBQVcsQ0FBQyxRQUFRLElBQUksTUFBTSxpQkFBaUJYLE9BQU0sU0FBUyxZQUFZLEtBQUssR0FBR0EsT0FBTSxXQUFXQSxPQUFNLE9BQU8sSUFDL0csY0FBYyxJQUFJLE1BQU0sUUFDcEIsSUFBSSxNQUFNLGlCQUFpQkEsT0FBTSxTQUFTLGFBQWEsR0FBRyxDQUFDLEdBQUcsYUFBYSxHQUFHLGVBQWUsSUFBSUEsT0FBTSxVQUFVLGFBQWEsQ0FBQztBQUFBLEVBQzdJO0FBQUEsRUFDQSxpQkFBaUI7QUFDYixRQUFJLENBQUMsS0FBSyxJQUFJLE9BQU87QUFDakIsYUFBTztBQUNYLFFBQUlZLE9BQU0sS0FBSyxTQUFTLEtBQUssS0FBSyxHQUFHO0FBQ3JDLFFBQUksQ0FBQ0EsS0FBSSxLQUFLLGVBQWUsQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLEtBQUssSUFBSSxPQUFPQSxLQUFJLE1BQU1BLEtBQUksT0FBTyxLQUFLLEtBQzlGLEtBQUssSUFBSSxTQUFTLEtBQUssVUFBVSxRQUFRLEtBQUssZUFBZSxLQUFLLEdBQUcsTUFBTSxNQUFNLFNBQVMsS0FBSztBQUNoRyxhQUFPO0FBQ1gsUUFBSSxFQUFFLE1BQU0sSUFBSSxLQUFLLEtBQUssUUFBUSxLQUFLLElBQUksTUFBTSxLQUFLO0FBQ3RELFdBQU8sUUFBUSxLQUFLLFNBQVMsS0FBSyxJQUFJLElBQUksRUFBRSxLQUFLO0FBQzdDLFFBQUU7QUFDTixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsZUFBZSxLQUFLO0FBQ2hCO0FBQU0sZUFBUyxJQUFJLEtBQUssSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDN0QsWUFBSSxFQUFFLE9BQU8sS0FBSyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQ3JDLFlBQUksWUFBWSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLElBQUksU0FBUyxJQUFJO0FBQy9FLFlBQUksTUFBTSxpQkFBaUIsS0FBSyxHQUFHLE1BQU0sT0FBTyxTQUFTO0FBQ3pELFlBQUksQ0FBQztBQUNEO0FBQ0osaUJBQVMsSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDN0IsY0FBSSxFQUFFLE9BQUFDLFFBQU8sTUFBQUMsTUFBSyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQ3JDLGNBQUlILFdBQVUsaUJBQWlCLEtBQUssR0FBR0csT0FBTUQsUUFBTyxJQUFJO0FBQ3hELGNBQUksQ0FBQ0YsWUFBV0EsU0FBUTtBQUNwQixxQkFBUztBQUFBLFFBQ2pCO0FBQ0EsZUFBTyxFQUFFLE9BQU8sR0FBRyxLQUFLLE1BQU0sWUFBWSxJQUFJLElBQUksUUFBUSxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJO0FBQUEsTUFDdEY7QUFBQSxFQUNKO0FBQUEsRUFDQSxNQUFNLEtBQUs7QUFDUCxRQUFJSSxTQUFRLEtBQUssZUFBZSxHQUFHO0FBQ25DLFFBQUksQ0FBQ0E7QUFDRCxhQUFPO0FBQ1gsV0FBTyxLQUFLLFFBQVFBLE9BQU07QUFDdEIsV0FBSyxrQkFBa0I7QUFDM0IsUUFBSUEsT0FBTSxJQUFJO0FBQ1YsV0FBSyxTQUFTLGNBQWMsS0FBSyxRQUFRQSxPQUFNLE9BQU9BLE9BQU0sR0FBRztBQUNuRSxVQUFNQSxPQUFNO0FBQ1osYUFBUyxJQUFJQSxPQUFNLFFBQVEsR0FBRyxLQUFLLElBQUksT0FBTyxLQUFLO0FBQy9DLFVBQUksT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sS0FBSyxLQUFLLGFBQWEsV0FBVyxLQUFLLFNBQVMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQ2hHLFdBQUssaUJBQWlCLEtBQUssTUFBTSxLQUFLLE9BQU8sR0FBRztBQUFBLElBQ3BEO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLGlCQUFpQixNQUFNLFFBQVEsTUFBTSxTQUFTO0FBQzFDLFFBQUlILE9BQU0sS0FBSyxTQUFTLEtBQUssS0FBSztBQUNsQyxJQUFBQSxLQUFJLFFBQVFBLEtBQUksTUFBTSxVQUFVLElBQUk7QUFDcEMsU0FBSyxTQUFTLGNBQWMsS0FBSyxRQUFRLEtBQUssT0FBTyxTQUFTLEtBQUssS0FBSyxPQUFPLE9BQU8sT0FBTyxDQUFDLENBQUM7QUFDL0YsU0FBSyxTQUFTLEtBQUssRUFBRSxNQUFNLE9BQU8sS0FBSyxhQUFhLENBQUM7QUFBQSxFQUN6RDtBQUFBLEVBQ0Esb0JBQW9CO0FBQ2hCLFFBQUksT0FBTyxLQUFLLFNBQVMsSUFBSTtBQUM3QixRQUFJLE1BQU0sS0FBSyxNQUFNLFdBQVcsU0FBUyxPQUFPLElBQUk7QUFDcEQsUUFBSSxJQUFJO0FBQ0osV0FBSyxTQUFTLGNBQWMsS0FBSyxRQUFRLEtBQUssU0FBUyxRQUFRLEdBQUc7QUFBQSxFQUMxRTtBQUNKO0FBQ0EsU0FBUyxpQkFBaUIsVUFBVSxPQUFPLE9BQU87QUFDOUMsTUFBSSxTQUFTO0FBQ1QsV0FBTyxTQUFTLFdBQVcsT0FBTyxTQUFTLFVBQVU7QUFDekQsU0FBTyxTQUFTLGFBQWEsR0FBRyxTQUFTLFdBQVcsS0FBSyxpQkFBaUIsU0FBUyxXQUFXLFNBQVMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzdIO0FBQ0EsU0FBUyxjQUFjLFVBQVUsT0FBTyxTQUFTO0FBQzdDLE1BQUksU0FBUztBQUNULFdBQU8sU0FBUyxPQUFPLE9BQU87QUFDbEMsU0FBTyxTQUFTLGFBQWEsU0FBUyxhQUFhLEdBQUcsU0FBUyxVQUFVLEtBQUssY0FBYyxTQUFTLFVBQVUsU0FBUyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDaEo7QUFDQSxTQUFTLFVBQVUsVUFBVSxPQUFPO0FBQ2hDLFdBQVMsSUFBSSxHQUFHLElBQUksT0FBTztBQUN2QixlQUFXLFNBQVMsV0FBVztBQUNuQyxTQUFPO0FBQ1g7QUFDQSxTQUFTLGVBQWUsTUFBTSxXQUFXLFNBQVM7QUFDOUMsTUFBSSxhQUFhO0FBQ2IsV0FBTztBQUNYLE1BQUksT0FBTyxLQUFLO0FBQ2hCLE1BQUksWUFBWTtBQUNaLFdBQU8sS0FBSyxhQUFhLEdBQUcsZUFBZSxLQUFLLFlBQVksWUFBWSxHQUFHLEtBQUssY0FBYyxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUM7QUFDdEgsTUFBSSxZQUFZLEdBQUc7QUFDZixXQUFPLEtBQUssS0FBSyxhQUFhLFdBQVcsSUFBSSxFQUFFLE9BQU8sSUFBSTtBQUMxRCxRQUFJLFdBQVc7QUFDWCxhQUFPLEtBQUssT0FBTyxLQUFLLEtBQUssYUFBYSxjQUFjLElBQUksRUFBRSxXQUFXLFNBQVMsT0FBTyxJQUFJLENBQUM7QUFBQSxFQUN0RztBQUNBLFNBQU8sS0FBSyxLQUFLLElBQUk7QUFDekI7QUFDQSxTQUFTLGlCQUFpQixLQUFLLE9BQU8sTUFBTSxPQUFPLE1BQU07QUFDckQsTUFBSSxPQUFPLElBQUksS0FBSyxLQUFLLEdBQUcsUUFBUSxPQUFPLElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUs7QUFDbEYsTUFBSSxTQUFTLEtBQUssY0FBYyxDQUFDLEtBQUssa0JBQWtCLEtBQUssSUFBSTtBQUM3RCxXQUFPO0FBQ1gsTUFBSSxNQUFNLE1BQU0sV0FBVyxLQUFLLFNBQVMsTUFBTSxLQUFLO0FBQ3BELFNBQU8sT0FBTyxDQUFDLGFBQWEsTUFBTSxLQUFLLFNBQVMsS0FBSyxJQUFJLE1BQU07QUFDbkU7QUFDQSxTQUFTLGFBQWEsTUFBTSxVQUFVbkIsUUFBTztBQUN6QyxXQUFTLElBQUlBLFFBQU8sSUFBSSxTQUFTLFlBQVk7QUFDekMsUUFBSSxDQUFDLEtBQUssWUFBWSxTQUFTLE1BQU0sQ0FBQyxFQUFFLEtBQUs7QUFDekMsYUFBTztBQUNmLFNBQU87QUFDWDtBQUNBLFNBQVMsZUFBZSxNQUFNO0FBQzFCLFNBQU8sS0FBSyxLQUFLLFlBQVksS0FBSyxLQUFLO0FBQzNDO0FBQ0EsU0FBUyxhQUFhUyxLQUFJTixPQUFNLElBQUlJLFFBQU87QUFDdkMsTUFBSSxDQUFDQSxPQUFNO0FBQ1AsV0FBT0UsSUFBRyxZQUFZTixPQUFNLEVBQUU7QUFDbEMsTUFBSSxRQUFRTSxJQUFHLElBQUksUUFBUU4sS0FBSSxHQUFHLE1BQU1NLElBQUcsSUFBSSxRQUFRLEVBQUU7QUFDekQsTUFBSSxjQUFjLE9BQU8sS0FBS0YsTUFBSztBQUMvQixXQUFPRSxJQUFHLEtBQUssSUFBSSxZQUFZTixPQUFNLElBQUlJLE1BQUssQ0FBQztBQUNuRCxNQUFJLGVBQWUsY0FBYyxPQUFPRSxJQUFHLElBQUksUUFBUSxFQUFFLENBQUM7QUFFMUQsTUFBSSxhQUFhLGFBQWEsU0FBUyxDQUFDLEtBQUs7QUFDekMsaUJBQWEsSUFBSTtBQUdyQixNQUFJLGtCQUFrQixFQUFFLE1BQU0sUUFBUTtBQUN0QyxlQUFhLFFBQVEsZUFBZTtBQUtwQyxXQUFTLElBQUksTUFBTSxPQUFPLE1BQU0sTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEtBQUssT0FBTztBQUM5RCxRQUFJLE9BQU8sTUFBTSxLQUFLLENBQUMsRUFBRSxLQUFLO0FBQzlCLFFBQUksS0FBSyxZQUFZLEtBQUsscUJBQXFCLEtBQUs7QUFDaEQ7QUFDSixRQUFJLGFBQWEsUUFBUSxDQUFDLElBQUk7QUFDMUIsd0JBQWtCO0FBQUEsYUFDYixNQUFNLE9BQU8sQ0FBQyxLQUFLO0FBQ3hCLG1CQUFhLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUFBLEVBQ3BDO0FBR0EsTUFBSSx1QkFBdUIsYUFBYSxRQUFRLGVBQWU7QUFDL0QsTUFBSSxZQUFZLENBQUMsR0FBRyxpQkFBaUJGLE9BQU07QUFDM0MsV0FBUyxVQUFVQSxPQUFNLFNBQVMsSUFBSSxLQUFJLEtBQUs7QUFDM0MsUUFBSSxPQUFPLFFBQVE7QUFDbkIsY0FBVSxLQUFLLElBQUk7QUFDbkIsUUFBSSxLQUFLQSxPQUFNO0FBQ1g7QUFDSixjQUFVLEtBQUs7QUFBQSxFQUNuQjtBQUdBLFdBQVMsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUMxQyxRQUFJLFdBQVcsVUFBVSxDQUFDLEdBQUcsTUFBTSxlQUFlLFNBQVMsSUFBSTtBQUMvRCxRQUFJLE9BQU8sQ0FBQyxTQUFTLFdBQVcsTUFBTSxLQUFLLEtBQUssSUFBSSxlQUFlLElBQUksQ0FBQyxDQUFDO0FBQ3JFLHVCQUFpQjtBQUFBLGFBQ1osT0FBTyxDQUFDLFNBQVMsS0FBSztBQUMzQjtBQUFBLEVBQ1I7QUFDQSxXQUFTLElBQUlBLE9BQU0sV0FBVyxLQUFLLEdBQUcsS0FBSztBQUN2QyxRQUFJLGFBQWEsSUFBSSxpQkFBaUIsTUFBTUEsT0FBTSxZQUFZO0FBQzlELFFBQUksU0FBUyxVQUFVLFNBQVM7QUFDaEMsUUFBSSxDQUFDO0FBQ0Q7QUFDSixhQUFTLElBQUksR0FBRyxJQUFJLGFBQWEsUUFBUSxLQUFLO0FBRzFDLFVBQUksY0FBYyxjQUFjLElBQUksd0JBQXdCLGFBQWEsTUFBTSxHQUFHLFNBQVM7QUFDM0YsVUFBSSxjQUFjLEdBQUc7QUFDakIsaUJBQVM7QUFDVCxzQkFBYyxDQUFDO0FBQUEsTUFDbkI7QUFDQSxVQUFJLFNBQVMsTUFBTSxLQUFLLGNBQWMsQ0FBQyxHQUFHLFFBQVEsTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxVQUFJLE9BQU8sZUFBZSxPQUFPLE9BQU8sT0FBTyxNQUFNLE9BQU8sS0FBSztBQUM3RCxlQUFPRSxJQUFHLFFBQVEsTUFBTSxPQUFPLFdBQVcsR0FBRyxTQUFTLElBQUksTUFBTSxXQUFXLElBQUksSUFBSSxJQUFJLE1BQU0sY0FBY0YsT0FBTSxTQUFTLEdBQUdBLE9BQU0sV0FBVyxTQUFTLEdBQUcsV0FBV0EsT0FBTSxPQUFPLENBQUM7QUFBQSxJQUMzTDtBQUFBLEVBQ0o7QUFDQSxNQUFJLGFBQWFFLElBQUcsTUFBTTtBQUMxQixXQUFTLElBQUksYUFBYSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDL0MsSUFBQUEsSUFBRyxRQUFRTixPQUFNLElBQUlJLE1BQUs7QUFDMUIsUUFBSUUsSUFBRyxNQUFNLFNBQVM7QUFDbEI7QUFDSixRQUFJLFFBQVEsYUFBYSxDQUFDO0FBQzFCLFFBQUksUUFBUTtBQUNSO0FBQ0osSUFBQU4sUUFBTyxNQUFNLE9BQU8sS0FBSztBQUN6QixTQUFLLElBQUksTUFBTSxLQUFLO0FBQUEsRUFDeEI7QUFDSjtBQUNBLFNBQVMsY0FBYyxVQUFVLE9BQU8sU0FBUyxTQUFTLFFBQVE7QUFDOUQsTUFBSSxRQUFRLFNBQVM7QUFDakIsUUFBSWEsU0FBUSxTQUFTO0FBQ3JCLGVBQVcsU0FBUyxhQUFhLEdBQUdBLE9BQU0sS0FBSyxjQUFjQSxPQUFNLFNBQVMsUUFBUSxHQUFHLFNBQVMsU0FBU0EsTUFBSyxDQUFDLENBQUM7QUFBQSxFQUNwSDtBQUNBLE1BQUksUUFBUSxTQUFTO0FBQ2pCLFFBQUksUUFBUSxPQUFPLGVBQWUsQ0FBQztBQUNuQyxRQUFJaEIsU0FBUSxNQUFNLFdBQVcsUUFBUSxFQUFFLE9BQU8sUUFBUTtBQUN0RCxlQUFXQSxPQUFNLE9BQU8sTUFBTSxjQUFjQSxNQUFLLEVBQUUsV0FBVyxTQUFTLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDdkY7QUFDQSxTQUFPO0FBQ1g7QUFDQSxTQUFTLGlCQUFpQlMsS0FBSU4sT0FBTSxJQUFJLE1BQU07QUFDMUMsTUFBSSxDQUFDLEtBQUssWUFBWUEsU0FBUSxNQUFNTSxJQUFHLElBQUksUUFBUU4sS0FBSSxFQUFFLE9BQU8sUUFBUSxNQUFNO0FBQzFFLFFBQUksUUFBUSxZQUFZTSxJQUFHLEtBQUtOLE9BQU0sS0FBSyxJQUFJO0FBQy9DLFFBQUksU0FBUztBQUNULE1BQUFBLFFBQU8sS0FBSztBQUFBLEVBQ3BCO0FBQ0EsRUFBQU0sSUFBRyxhQUFhTixPQUFNLElBQUksSUFBSSxNQUFNLFNBQVMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDbEU7QUFDQSxTQUFTLFlBQVlNLEtBQUlOLE9BQU0sSUFBSTtBQUMvQixNQUFJLFFBQVFNLElBQUcsSUFBSSxRQUFRTixLQUFJLEdBQUcsTUFBTU0sSUFBRyxJQUFJLFFBQVEsRUFBRTtBQUN6RCxNQUFJLFVBQVUsY0FBYyxPQUFPLEdBQUc7QUFDdEMsV0FBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUNyQyxRQUFJLFFBQVEsUUFBUSxDQUFDLEdBQUcsT0FBTyxLQUFLLFFBQVEsU0FBUztBQUNyRCxRQUFLLFFBQVEsU0FBUyxLQUFNLE1BQU0sS0FBSyxLQUFLLEVBQUUsS0FBSyxhQUFhO0FBQzVELGFBQU9BLElBQUcsT0FBTyxNQUFNLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLENBQUM7QUFDdkQsUUFBSSxRQUFRLE1BQU0sUUFBUSxNQUFNLEtBQUssUUFBUSxDQUFDLEVBQUUsV0FBVyxNQUFNLE1BQU0sUUFBUSxDQUFDLEdBQUcsSUFBSSxXQUFXLFFBQVEsQ0FBQyxDQUFDO0FBQ3hHLGFBQU9BLElBQUcsT0FBTyxNQUFNLE9BQU8sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLENBQUM7QUFBQSxFQUM5RDtBQUNBLFdBQVMsSUFBSSxHQUFHLEtBQUssTUFBTSxTQUFTLEtBQUssSUFBSSxPQUFPLEtBQUs7QUFDckQsUUFBSU4sUUFBTyxNQUFNLE1BQU0sQ0FBQyxLQUFLLE1BQU0sUUFBUSxLQUFLLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxRQUFRO0FBQ2hHLGFBQU9NLElBQUcsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFBQSxFQUM1QztBQUNBLEVBQUFBLElBQUcsT0FBT04sT0FBTSxFQUFFO0FBQ3RCO0FBR0EsU0FBUyxjQUFjLE9BQU8sS0FBSztBQUMvQixNQUFJLFNBQVMsQ0FBQyxHQUFHLFdBQVcsS0FBSyxJQUFJLE1BQU0sT0FBTyxJQUFJLEtBQUs7QUFDM0QsV0FBUyxJQUFJLFVBQVUsS0FBSyxHQUFHLEtBQUs7QUFDaEMsUUFBSUgsU0FBUSxNQUFNLE1BQU0sQ0FBQztBQUN6QixRQUFJQSxTQUFRLE1BQU0sT0FBTyxNQUFNLFFBQVEsTUFDbkMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxRQUFRLE1BQ3BDLE1BQU0sS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLLGFBQ3hCLElBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLO0FBQ3RCO0FBQ0osUUFBSUEsVUFBUyxJQUFJLE1BQU0sQ0FBQyxLQUNuQixLQUFLLE1BQU0sU0FBUyxLQUFLLElBQUksU0FBUyxNQUFNLE9BQU8saUJBQWlCLElBQUksT0FBTyxpQkFDNUUsS0FBSyxJQUFJLE1BQU0sSUFBSSxDQUFDLEtBQUtBLFNBQVE7QUFDckMsYUFBTyxLQUFLLENBQUM7QUFBQSxFQUNyQjtBQUNBLFNBQU87QUFDWDtBQUtBLElBQU0sV0FBTixNQUFNLGtCQUFpQixLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJeEIsWUFJQSxLQUlBLE1BRUEsT0FBTztBQUNILFVBQU07QUFDTixTQUFLLE1BQU07QUFDWCxTQUFLLE9BQU87QUFDWixTQUFLLFFBQVE7QUFBQSxFQUNqQjtBQUFBLEVBQ0EsTUFBTU0sTUFBSztBQUNQLFFBQUksT0FBT0EsS0FBSSxPQUFPLEtBQUssR0FBRztBQUM5QixRQUFJLENBQUM7QUFDRCxhQUFPLFdBQVcsS0FBSyxzQ0FBc0M7QUFDakUsUUFBSSxRQUFRLHVCQUFPLE9BQU8sSUFBSTtBQUM5QixhQUFTLFFBQVEsS0FBSztBQUNsQixZQUFNLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSTtBQUNqQyxVQUFNLEtBQUssSUFBSSxJQUFJLEtBQUs7QUFDeEIsUUFBSSxVQUFVLEtBQUssS0FBSyxPQUFPLE9BQU8sTUFBTSxLQUFLLEtBQUs7QUFDdEQsV0FBTyxXQUFXLFlBQVlBLE1BQUssS0FBSyxLQUFLLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxTQUFTLEtBQUssT0FBTyxHQUFHLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDO0FBQUEsRUFDeEg7QUFBQSxFQUNBLFNBQVM7QUFDTCxXQUFPLFFBQVE7QUFBQSxFQUNuQjtBQUFBLEVBQ0EsT0FBT0EsTUFBSztBQUNSLFdBQU8sSUFBSSxVQUFTLEtBQUssS0FBSyxLQUFLLE1BQU1BLEtBQUksT0FBTyxLQUFLLEdBQUcsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDbEY7QUFBQSxFQUNBLElBQUksU0FBUztBQUNULFFBQUksTUFBTSxRQUFRLFVBQVUsS0FBSyxLQUFLLENBQUM7QUFDdkMsV0FBTyxJQUFJLGVBQWUsT0FBTyxJQUFJLFVBQVMsSUFBSSxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQSxFQUNoRjtBQUFBLEVBQ0EsU0FBUztBQUNMLFdBQU8sRUFBRSxVQUFVLFFBQVEsS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU07QUFBQSxFQUNqRjtBQUFBLEVBQ0EsT0FBTyxTQUFTLFFBQVFELE9BQU07QUFDMUIsUUFBSSxPQUFPQSxNQUFLLE9BQU8sWUFBWSxPQUFPQSxNQUFLLFFBQVE7QUFDbkQsWUFBTSxJQUFJLFdBQVcscUNBQXFDO0FBQzlELFdBQU8sSUFBSSxVQUFTQSxNQUFLLEtBQUtBLE1BQUssTUFBTUEsTUFBSyxLQUFLO0FBQUEsRUFDdkQ7QUFDSjtBQUNBLEtBQUssT0FBTyxRQUFRLFFBQVE7QUFJNUIsSUFBTSxjQUFOLE1BQU0scUJBQW9CLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkzQixZQUlBLE1BRUEsT0FBTztBQUNILFVBQU07QUFDTixTQUFLLE9BQU87QUFDWixTQUFLLFFBQVE7QUFBQSxFQUNqQjtBQUFBLEVBQ0EsTUFBTUMsTUFBSztBQUNQLFFBQUksUUFBUSx1QkFBTyxPQUFPLElBQUk7QUFDOUIsYUFBUyxRQUFRQSxLQUFJO0FBQ2pCLFlBQU0sSUFBSSxJQUFJQSxLQUFJLE1BQU0sSUFBSTtBQUNoQyxVQUFNLEtBQUssSUFBSSxJQUFJLEtBQUs7QUFDeEIsUUFBSSxVQUFVQSxLQUFJLEtBQUssT0FBTyxPQUFPQSxLQUFJLFNBQVNBLEtBQUksS0FBSztBQUMzRCxXQUFPLFdBQVcsR0FBRyxPQUFPO0FBQUEsRUFDaEM7QUFBQSxFQUNBLFNBQVM7QUFDTCxXQUFPLFFBQVE7QUFBQSxFQUNuQjtBQUFBLEVBQ0EsT0FBT0EsTUFBSztBQUNSLFdBQU8sSUFBSSxhQUFZLEtBQUssTUFBTUEsS0FBSSxNQUFNLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDMUQ7QUFBQSxFQUNBLElBQUksU0FBUztBQUNULFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxTQUFTO0FBQ0wsV0FBTyxFQUFFLFVBQVUsV0FBVyxNQUFNLEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTTtBQUFBLEVBQ3JFO0FBQUEsRUFDQSxPQUFPLFNBQVMsUUFBUUQsT0FBTTtBQUMxQixRQUFJLE9BQU9BLE1BQUssUUFBUTtBQUNwQixZQUFNLElBQUksV0FBVyx3Q0FBd0M7QUFDakUsV0FBTyxJQUFJLGFBQVlBLE1BQUssTUFBTUEsTUFBSyxLQUFLO0FBQUEsRUFDaEQ7QUFDSjtBQUNBLEtBQUssT0FBTyxXQUFXLFdBQVc7QUFLbEMsSUFBSSxpQkFBaUIsY0FBYyxNQUFNO0FBQ3pDO0FBQ0EsaUJBQWlCLFNBQVNrQixnQkFBZSxTQUFTO0FBQzlDLE1BQUksTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQ2xDLE1BQUksWUFBWUEsZ0JBQWU7QUFDL0IsU0FBTztBQUNYO0FBQ0EsZUFBZSxZQUFZLE9BQU8sT0FBTyxNQUFNLFNBQVM7QUFDeEQsZUFBZSxVQUFVLGNBQWM7QUFDdkMsZUFBZSxVQUFVLE9BQU87QUFRaEMsSUFBTSxZQUFOLE1BQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWixZQUtBakIsTUFBSztBQUNELFNBQUssTUFBTUE7QUFJWCxTQUFLLFFBQVEsQ0FBQztBQUlkLFNBQUssT0FBTyxDQUFDO0FBSWIsU0FBSyxVQUFVLElBQUk7QUFBQSxFQUN2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsSUFBSSxTQUFTO0FBQUUsV0FBTyxLQUFLLEtBQUssU0FBUyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUs7QUFBQSxFQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtsRSxLQUFLLE1BQU07QUFDUCxRQUFJLFNBQVMsS0FBSyxVQUFVLElBQUk7QUFDaEMsUUFBSSxPQUFPO0FBQ1AsWUFBTSxJQUFJLGVBQWUsT0FBTyxNQUFNO0FBQzFDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFVBQVUsTUFBTTtBQUNaLFFBQUksU0FBUyxLQUFLLE1BQU0sS0FBSyxHQUFHO0FBQ2hDLFFBQUksQ0FBQyxPQUFPO0FBQ1IsV0FBSyxRQUFRLE1BQU0sT0FBTyxHQUFHO0FBQ2pDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUksYUFBYTtBQUNiLFdBQU8sS0FBSyxNQUFNLFNBQVM7QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsUUFBUSxNQUFNQSxNQUFLO0FBQ2YsU0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQ3ZCLFNBQUssTUFBTSxLQUFLLElBQUk7QUFDcEIsU0FBSyxRQUFRLFVBQVUsS0FBSyxPQUFPLENBQUM7QUFDcEMsU0FBSyxNQUFNQTtBQUFBLEVBQ2Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsUUFBUUgsT0FBTSxLQUFLQSxPQUFNSSxTQUFRLE1BQU0sT0FBTztBQUMxQyxRQUFJLE9BQU8sWUFBWSxLQUFLLEtBQUtKLE9BQU0sSUFBSUksTUFBSztBQUNoRCxRQUFJO0FBQ0EsV0FBSyxLQUFLLElBQUk7QUFDbEIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsWUFBWUosT0FBTSxJQUFJLFNBQVM7QUFDM0IsV0FBTyxLQUFLLFFBQVFBLE9BQU0sSUFBSSxJQUFJLE1BQU0sU0FBUyxLQUFLLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUFBLEVBQ3pFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPQSxPQUFNLElBQUk7QUFDYixXQUFPLEtBQUssUUFBUUEsT0FBTSxJQUFJLE1BQU0sS0FBSztBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPLEtBQUssU0FBUztBQUNqQixXQUFPLEtBQUssWUFBWSxLQUFLLEtBQUssT0FBTztBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW9CQSxhQUFhQSxPQUFNLElBQUlJLFFBQU87QUFDMUIsaUJBQWEsTUFBTUosT0FBTSxJQUFJSSxNQUFLO0FBQ2xDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVQSxpQkFBaUJKLE9BQU0sSUFBSSxNQUFNO0FBQzdCLHFCQUFpQixNQUFNQSxPQUFNLElBQUksSUFBSTtBQUNyQyxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxZQUFZQSxPQUFNLElBQUk7QUFDbEIsZ0JBQVksTUFBTUEsT0FBTSxFQUFFO0FBQzFCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLEtBQUssT0FBTyxRQUFRO0FBQ2hCLFNBQUssTUFBTSxPQUFPLE1BQU07QUFDeEIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsS0FBSyxLQUFLLFFBQVEsR0FBRztBQUNqQixTQUFLLE1BQU0sS0FBSyxLQUFLO0FBQ3JCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsS0FBSyxPQUFPLFVBQVU7QUFDbEIsU0FBSyxNQUFNLE9BQU8sUUFBUTtBQUMxQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxhQUFhQSxPQUFNLEtBQUtBLE9BQU0sTUFBTSxRQUFRLE1BQU07QUFDOUMsaUJBQWEsTUFBTUEsT0FBTSxJQUFJLE1BQU0sS0FBSztBQUN4QyxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxjQUFjLEtBQUssTUFBTSxRQUFRLE1BQU0sT0FBTztBQUMxQyxrQkFBYyxNQUFNLEtBQUssTUFBTSxPQUFPLEtBQUs7QUFDM0MsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxpQkFBaUIsS0FBSyxNQUFNLE9BQU87QUFDL0IsU0FBSyxLQUFLLElBQUksU0FBUyxLQUFLLE1BQU0sS0FBSyxDQUFDO0FBQ3hDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxnQkFBZ0IsTUFBTSxPQUFPO0FBQ3pCLFNBQUssS0FBSyxJQUFJLFlBQVksTUFBTSxLQUFLLENBQUM7QUFDdEMsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFlBQVksS0FBSyxNQUFNO0FBQ25CLFNBQUssS0FBSyxJQUFJLGdCQUFnQixLQUFLLElBQUksQ0FBQztBQUN4QyxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxlQUFlLEtBQUssTUFBTTtBQUN0QixRQUFJLEVBQUUsZ0JBQWdCLE9BQU87QUFDekIsVUFBSSxPQUFPLEtBQUssSUFBSSxPQUFPLEdBQUc7QUFDOUIsVUFBSSxDQUFDO0FBQ0QsY0FBTSxJQUFJLFdBQVcseUJBQXlCLEdBQUc7QUFDckQsYUFBTyxLQUFLLFFBQVEsS0FBSyxLQUFLO0FBQzlCLFVBQUksQ0FBQztBQUNELGVBQU87QUFBQSxJQUNmO0FBQ0EsU0FBSyxLQUFLLElBQUksbUJBQW1CLEtBQUssSUFBSSxDQUFDO0FBQzNDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQU0sS0FBSyxRQUFRLEdBQUcsWUFBWTtBQUM5QixVQUFNLE1BQU0sS0FBSyxPQUFPLFVBQVU7QUFDbEMsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFFBQVFBLE9BQU0sSUFBSSxNQUFNO0FBQ3BCLFlBQVEsTUFBTUEsT0FBTSxJQUFJLElBQUk7QUFDNUIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLFdBQVdBLE9BQU0sSUFBSSxNQUFNO0FBQ3ZCLGVBQVcsTUFBTUEsT0FBTSxJQUFJLElBQUk7QUFDL0IsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLGtCQUFrQixLQUFLLFlBQVksT0FBTztBQUN0QyxzQkFBa0IsTUFBTSxLQUFLLFlBQVksS0FBSztBQUM5QyxXQUFPO0FBQUEsRUFDWDtBQUNKOzs7QUNyaEVBLElBQU0sY0FBYyx1QkFBTyxPQUFPLElBQUk7QUFLdEMsSUFBTSxZQUFOLE1BQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVosWUFLQSxTQUtBLE9BQU8sUUFBUTtBQUNYLFNBQUssVUFBVTtBQUNmLFNBQUssUUFBUTtBQUNiLFNBQUssU0FBUyxVQUFVLENBQUMsSUFBSSxlQUFlLFFBQVEsSUFBSSxLQUFLLEdBQUcsUUFBUSxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQUEsRUFDdkY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksU0FBUztBQUFFLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXhDLElBQUksT0FBTztBQUFFLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXBDLElBQUksT0FBTztBQUFFLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXBDLElBQUksS0FBSztBQUFFLFdBQU8sS0FBSyxJQUFJO0FBQUEsRUFBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWhDLElBQUksUUFBUTtBQUNSLFdBQU8sS0FBSyxPQUFPLENBQUMsRUFBRTtBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxJQUFJLE1BQU07QUFDTixXQUFPLEtBQUssT0FBTyxDQUFDLEVBQUU7QUFBQSxFQUMxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsSUFBSSxRQUFRO0FBQ1IsUUFBSSxTQUFTLEtBQUs7QUFDbEIsYUFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVE7QUFDL0IsVUFBSSxPQUFPLENBQUMsRUFBRSxNQUFNLE9BQU8sT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUNyQyxlQUFPO0FBQ2YsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFVBQVU7QUFDTixXQUFPLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJO0FBQUEsRUFDeEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsUUFBUXFCLEtBQUksVUFBVSxNQUFNLE9BQU87QUFJL0IsUUFBSSxXQUFXLFFBQVEsUUFBUSxXQUFXLGFBQWE7QUFDdkQsYUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFNBQVMsS0FBSztBQUN0QyxtQkFBYTtBQUNiLGlCQUFXLFNBQVM7QUFBQSxJQUN4QjtBQUNBLFFBQUksVUFBVUEsSUFBRyxNQUFNLFFBQVEsU0FBUyxLQUFLO0FBQzdDLGFBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDcEMsVUFBSSxFQUFFLE9BQU8sSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLFVBQVVBLElBQUcsUUFBUSxNQUFNLE9BQU87QUFDbEUsTUFBQUEsSUFBRyxhQUFhLFFBQVEsSUFBSSxNQUFNLEdBQUcsR0FBRyxRQUFRLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxNQUFNLFFBQVEsT0FBTztBQUN2RixVQUFJLEtBQUs7QUFDTCxnQ0FBd0JBLEtBQUksVUFBVSxXQUFXLFNBQVMsV0FBVyxjQUFjLFdBQVcsZUFBZSxLQUFLLENBQUM7QUFBQSxJQUMzSDtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsWUFBWUEsS0FBSSxNQUFNO0FBQ2xCLFFBQUksVUFBVUEsSUFBRyxNQUFNLFFBQVEsU0FBUyxLQUFLO0FBQzdDLGFBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDcEMsVUFBSSxFQUFFLE9BQU8sSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLFVBQVVBLElBQUcsUUFBUSxNQUFNLE9BQU87QUFDbEUsVUFBSUMsUUFBTyxRQUFRLElBQUksTUFBTSxHQUFHLEdBQUcsS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHO0FBQzNELFVBQUksR0FBRztBQUNILFFBQUFELElBQUcsWUFBWUMsT0FBTSxFQUFFO0FBQUEsTUFDM0IsT0FDSztBQUNELFFBQUFELElBQUcsaUJBQWlCQyxPQUFNLElBQUksSUFBSTtBQUNsQyxnQ0FBd0JELEtBQUksU0FBUyxLQUFLLFdBQVcsS0FBSyxDQUFDO0FBQUEsTUFDL0Q7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFPLFNBQVMsTUFBTSxLQUFLLFdBQVcsT0FBTztBQUN6QyxRQUFJLFFBQVEsS0FBSyxPQUFPLGdCQUFnQixJQUFJLGNBQWMsSUFBSSxJQUN4RCxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsS0FBSyxLQUFLLEtBQUssTUFBTSxHQUFHLEtBQUssUUFBUTtBQUN0RixRQUFJO0FBQ0EsYUFBTztBQUNYLGFBQVMsUUFBUSxLQUFLLFFBQVEsR0FBRyxTQUFTLEdBQUcsU0FBUztBQUNsRCxVQUFJRSxTQUFRLE1BQU0sSUFDWixnQkFBZ0IsS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssS0FBSyxHQUFHLEtBQUssT0FBTyxRQUFRLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxHQUFHLEtBQUssUUFBUSxJQUN4RyxnQkFBZ0IsS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssS0FBSyxHQUFHLEtBQUssTUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLE1BQU0sS0FBSyxJQUFJLEdBQUcsS0FBSyxRQUFRO0FBQ2pILFVBQUlBO0FBQ0EsZUFBT0E7QUFBQSxJQUNmO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxPQUFPLEtBQUssTUFBTSxPQUFPLEdBQUc7QUFDeEIsV0FBTyxLQUFLLFNBQVMsTUFBTSxJQUFJLEtBQUssS0FBSyxTQUFTLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxhQUFhLEtBQUssS0FBSyxDQUFDLENBQUM7QUFBQSxFQUNuRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxRQUFRQyxNQUFLO0FBQ2hCLFdBQU8sZ0JBQWdCQSxNQUFLQSxNQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxhQUFhQSxJQUFHO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxNQUFNQSxNQUFLO0FBQ2QsV0FBTyxnQkFBZ0JBLE1BQUtBLE1BQUtBLEtBQUksUUFBUSxNQUFNQSxLQUFJLFlBQVksRUFBRSxLQUFLLElBQUksYUFBYUEsSUFBRztBQUFBLEVBQ2xHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE9BQU8sU0FBU0EsTUFBS0MsT0FBTTtBQUN2QixRQUFJLENBQUNBLFNBQVEsQ0FBQ0EsTUFBSztBQUNmLFlBQU0sSUFBSSxXQUFXLHNDQUFzQztBQUMvRCxRQUFJLE1BQU0sWUFBWUEsTUFBSyxJQUFJO0FBQy9CLFFBQUksQ0FBQztBQUNELFlBQU0sSUFBSSxXQUFXLHFCQUFxQkEsTUFBSyxJQUFJLFVBQVU7QUFDakUsV0FBTyxJQUFJLFNBQVNELE1BQUtDLEtBQUk7QUFBQSxFQUNqQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxPQUFPLElBQUksZ0JBQWdCO0FBQzlCLFFBQUksTUFBTTtBQUNOLFlBQU0sSUFBSSxXQUFXLHdDQUF3QyxFQUFFO0FBQ25FLGdCQUFZLEVBQUUsSUFBSTtBQUNsQixtQkFBZSxVQUFVLFNBQVM7QUFDbEMsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLGNBQWM7QUFDVixXQUFPLGNBQWMsUUFBUSxLQUFLLFNBQVMsS0FBSyxLQUFLLEVBQUUsWUFBWTtBQUFBLEVBQ3ZFO0FBQ0o7QUFDQSxVQUFVLFVBQVUsVUFBVTtBQUk5QixJQUFNLGlCQUFOLE1BQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsWUFJQSxPQUlBLEtBQUs7QUFDRCxTQUFLLFFBQVE7QUFDYixTQUFLLE1BQU07QUFBQSxFQUNmO0FBQ0o7QUFDQSxJQUFJLDJCQUEyQjtBQUMvQixTQUFTLG1CQUFtQixNQUFNO0FBQzlCLE1BQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLE9BQU8sZUFBZTtBQUN6RCwrQkFBMkI7QUFDM0IsWUFBUSxNQUFNLEVBQUUsMEVBQTBFLEtBQUssT0FBTyxLQUFLLE9BQU8sR0FBRztBQUFBLEVBQ3pIO0FBQ0o7QUFPQSxJQUFNLGdCQUFOLE1BQU0sdUJBQXNCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlsQyxZQUFZLFNBQVMsUUFBUSxTQUFTO0FBQ2xDLHVCQUFtQixPQUFPO0FBQzFCLHVCQUFtQixLQUFLO0FBQ3hCLFVBQU0sU0FBUyxLQUFLO0FBQUEsRUFDeEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBSSxVQUFVO0FBQUUsV0FBTyxLQUFLLFFBQVEsT0FBTyxLQUFLLE1BQU0sTUFBTSxLQUFLLFFBQVE7QUFBQSxFQUFNO0FBQUEsRUFDL0UsSUFBSUQsTUFBSyxTQUFTO0FBQ2QsUUFBSSxRQUFRQSxLQUFJLFFBQVEsUUFBUSxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQzlDLFFBQUksQ0FBQyxNQUFNLE9BQU87QUFDZCxhQUFPLFVBQVUsS0FBSyxLQUFLO0FBQy9CLFFBQUksVUFBVUEsS0FBSSxRQUFRLFFBQVEsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUNsRCxXQUFPLElBQUksZUFBYyxRQUFRLE9BQU8sZ0JBQWdCLFVBQVUsT0FBTyxLQUFLO0FBQUEsRUFDbEY7QUFBQSxFQUNBLFFBQVFILEtBQUksVUFBVSxNQUFNLE9BQU87QUFDL0IsVUFBTSxRQUFRQSxLQUFJLE9BQU87QUFDekIsUUFBSSxXQUFXLE1BQU0sT0FBTztBQUN4QixVQUFJLFFBQVEsS0FBSyxNQUFNLFlBQVksS0FBSyxHQUFHO0FBQzNDLFVBQUk7QUFDQSxRQUFBQSxJQUFHLFlBQVksS0FBSztBQUFBLElBQzVCO0FBQUEsRUFDSjtBQUFBLEVBQ0EsR0FBRyxPQUFPO0FBQ04sV0FBTyxpQkFBaUIsa0JBQWlCLE1BQU0sVUFBVSxLQUFLLFVBQVUsTUFBTSxRQUFRLEtBQUs7QUFBQSxFQUMvRjtBQUFBLEVBQ0EsY0FBYztBQUNWLFdBQU8sSUFBSSxhQUFhLEtBQUssUUFBUSxLQUFLLElBQUk7QUFBQSxFQUNsRDtBQUFBLEVBQ0EsU0FBUztBQUNMLFdBQU8sRUFBRSxNQUFNLFFBQVEsUUFBUSxLQUFLLFFBQVEsTUFBTSxLQUFLLEtBQUs7QUFBQSxFQUNoRTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsT0FBTyxTQUFTRyxNQUFLQyxPQUFNO0FBQ3ZCLFFBQUksT0FBT0EsTUFBSyxVQUFVLFlBQVksT0FBT0EsTUFBSyxRQUFRO0FBQ3RELFlBQU0sSUFBSSxXQUFXLDBDQUEwQztBQUNuRSxXQUFPLElBQUksZUFBY0QsS0FBSSxRQUFRQyxNQUFLLE1BQU0sR0FBR0QsS0FBSSxRQUFRQyxNQUFLLElBQUksQ0FBQztBQUFBLEVBQzdFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPLE9BQU9ELE1BQUssUUFBUSxPQUFPLFFBQVE7QUFDdEMsUUFBSSxVQUFVQSxLQUFJLFFBQVEsTUFBTTtBQUNoQyxXQUFPLElBQUksS0FBSyxTQUFTLFFBQVEsU0FBUyxVQUFVQSxLQUFJLFFBQVEsSUFBSSxDQUFDO0FBQUEsRUFDekU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxPQUFPLFFBQVEsU0FBUyxPQUFPLE1BQU07QUFDakMsUUFBSSxPQUFPLFFBQVEsTUFBTSxNQUFNO0FBQy9CLFFBQUksQ0FBQyxRQUFRO0FBQ1QsYUFBTyxRQUFRLElBQUksSUFBSTtBQUMzQixRQUFJLENBQUMsTUFBTSxPQUFPLGVBQWU7QUFDN0IsVUFBSUQsU0FBUSxVQUFVLFNBQVMsT0FBTyxNQUFNLElBQUksS0FBSyxVQUFVLFNBQVMsT0FBTyxDQUFDLE1BQU0sSUFBSTtBQUMxRixVQUFJQTtBQUNBLGdCQUFRQSxPQUFNO0FBQUE7QUFFZCxlQUFPLFVBQVUsS0FBSyxPQUFPLElBQUk7QUFBQSxJQUN6QztBQUNBLFFBQUksQ0FBQyxRQUFRLE9BQU8sZUFBZTtBQUMvQixVQUFJLFFBQVEsR0FBRztBQUNYLGtCQUFVO0FBQUEsTUFDZCxPQUNLO0FBQ0QsbUJBQVcsVUFBVSxTQUFTLFNBQVMsQ0FBQyxNQUFNLElBQUksS0FBSyxVQUFVLFNBQVMsU0FBUyxNQUFNLElBQUksR0FBRztBQUNoRyxZQUFLLFFBQVEsTUFBTSxNQUFNLE9BQVMsT0FBTztBQUNyQyxvQkFBVTtBQUFBLE1BQ2xCO0FBQUEsSUFDSjtBQUNBLFdBQU8sSUFBSSxlQUFjLFNBQVMsS0FBSztBQUFBLEVBQzNDO0FBQ0o7QUFDQSxVQUFVLE9BQU8sUUFBUSxhQUFhO0FBQ3RDLElBQU0sZUFBTixNQUFNLGNBQWE7QUFBQSxFQUNmLFlBQVksUUFBUSxNQUFNO0FBQ3RCLFNBQUssU0FBUztBQUNkLFNBQUssT0FBTztBQUFBLEVBQ2hCO0FBQUEsRUFDQSxJQUFJLFNBQVM7QUFDVCxXQUFPLElBQUksY0FBYSxRQUFRLElBQUksS0FBSyxNQUFNLEdBQUcsUUFBUSxJQUFJLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDNUU7QUFBQSxFQUNBLFFBQVFDLE1BQUs7QUFDVCxXQUFPLGNBQWMsUUFBUUEsS0FBSSxRQUFRLEtBQUssTUFBTSxHQUFHQSxLQUFJLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUNqRjtBQUNKO0FBUUEsSUFBTSxnQkFBTixNQUFNLHVCQUFzQixVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtsQyxZQUFZLE1BQU07QUFDZCxRQUFJLE9BQU8sS0FBSztBQUNoQixRQUFJLE9BQU8sS0FBSyxLQUFLLENBQUMsRUFBRSxRQUFRLEtBQUssTUFBTSxLQUFLLFFBQVE7QUFDeEQsVUFBTSxNQUFNLElBQUk7QUFDaEIsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFBQSxFQUNBLElBQUlBLE1BQUssU0FBUztBQUNkLFFBQUksRUFBRSxTQUFTLElBQUksSUFBSSxRQUFRLFVBQVUsS0FBSyxNQUFNO0FBQ3BELFFBQUksT0FBT0EsS0FBSSxRQUFRLEdBQUc7QUFDMUIsUUFBSTtBQUNBLGFBQU8sVUFBVSxLQUFLLElBQUk7QUFDOUIsV0FBTyxJQUFJLGVBQWMsSUFBSTtBQUFBLEVBQ2pDO0FBQUEsRUFDQSxVQUFVO0FBQ04sV0FBTyxJQUFJLE1BQU0sU0FBUyxLQUFLLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUFBLEVBQ25EO0FBQUEsRUFDQSxHQUFHLE9BQU87QUFDTixXQUFPLGlCQUFpQixrQkFBaUIsTUFBTSxVQUFVLEtBQUs7QUFBQSxFQUNsRTtBQUFBLEVBQ0EsU0FBUztBQUNMLFdBQU8sRUFBRSxNQUFNLFFBQVEsUUFBUSxLQUFLLE9BQU87QUFBQSxFQUMvQztBQUFBLEVBQ0EsY0FBYztBQUFFLFdBQU8sSUFBSSxhQUFhLEtBQUssTUFBTTtBQUFBLEVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl0RCxPQUFPLFNBQVNBLE1BQUtDLE9BQU07QUFDdkIsUUFBSSxPQUFPQSxNQUFLLFVBQVU7QUFDdEIsWUFBTSxJQUFJLFdBQVcsMENBQTBDO0FBQ25FLFdBQU8sSUFBSSxlQUFjRCxLQUFJLFFBQVFDLE1BQUssTUFBTSxDQUFDO0FBQUEsRUFDckQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE9BQU8sT0FBT0QsTUFBS0YsT0FBTTtBQUNyQixXQUFPLElBQUksZUFBY0UsS0FBSSxRQUFRRixLQUFJLENBQUM7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFPLGFBQWEsTUFBTTtBQUN0QixXQUFPLENBQUMsS0FBSyxVQUFVLEtBQUssS0FBSyxLQUFLLGVBQWU7QUFBQSxFQUN6RDtBQUNKO0FBQ0EsY0FBYyxVQUFVLFVBQVU7QUFDbEMsVUFBVSxPQUFPLFFBQVEsYUFBYTtBQUN0QyxJQUFNLGVBQU4sTUFBTSxjQUFhO0FBQUEsRUFDZixZQUFZLFFBQVE7QUFDaEIsU0FBSyxTQUFTO0FBQUEsRUFDbEI7QUFBQSxFQUNBLElBQUksU0FBUztBQUNULFFBQUksRUFBRSxTQUFTLElBQUksSUFBSSxRQUFRLFVBQVUsS0FBSyxNQUFNO0FBQ3BELFdBQU8sVUFBVSxJQUFJLGFBQWEsS0FBSyxHQUFHLElBQUksSUFBSSxjQUFhLEdBQUc7QUFBQSxFQUN0RTtBQUFBLEVBQ0EsUUFBUUUsTUFBSztBQUNULFFBQUksT0FBT0EsS0FBSSxRQUFRLEtBQUssTUFBTSxHQUFHLE9BQU8sS0FBSztBQUNqRCxRQUFJLFFBQVEsY0FBYyxhQUFhLElBQUk7QUFDdkMsYUFBTyxJQUFJLGNBQWMsSUFBSTtBQUNqQyxXQUFPLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDOUI7QUFDSjtBQU9BLElBQU0sZUFBTixNQUFNLHNCQUFxQixVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakMsWUFBWUEsTUFBSztBQUNiLFVBQU1BLEtBQUksUUFBUSxDQUFDLEdBQUdBLEtBQUksUUFBUUEsS0FBSSxRQUFRLElBQUksQ0FBQztBQUFBLEVBQ3ZEO0FBQUEsRUFDQSxRQUFRSCxLQUFJLFVBQVUsTUFBTSxPQUFPO0FBQy9CLFFBQUksV0FBVyxNQUFNLE9BQU87QUFDeEIsTUFBQUEsSUFBRyxPQUFPLEdBQUdBLElBQUcsSUFBSSxRQUFRLElBQUk7QUFDaEMsVUFBSSxNQUFNLFVBQVUsUUFBUUEsSUFBRyxHQUFHO0FBQ2xDLFVBQUksQ0FBQyxJQUFJLEdBQUdBLElBQUcsU0FBUztBQUNwQixRQUFBQSxJQUFHLGFBQWEsR0FBRztBQUFBLElBQzNCLE9BQ0s7QUFDRCxZQUFNLFFBQVFBLEtBQUksT0FBTztBQUFBLElBQzdCO0FBQUEsRUFDSjtBQUFBLEVBQ0EsU0FBUztBQUFFLFdBQU8sRUFBRSxNQUFNLE1BQU07QUFBQSxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkMsT0FBTyxTQUFTRyxNQUFLO0FBQUUsV0FBTyxJQUFJLGNBQWFBLElBQUc7QUFBQSxFQUFHO0FBQUEsRUFDckQsSUFBSUEsTUFBSztBQUFFLFdBQU8sSUFBSSxjQUFhQSxJQUFHO0FBQUEsRUFBRztBQUFBLEVBQ3pDLEdBQUcsT0FBTztBQUFFLFdBQU8saUJBQWlCO0FBQUEsRUFBYztBQUFBLEVBQ2xELGNBQWM7QUFBRSxXQUFPO0FBQUEsRUFBYTtBQUN4QztBQUNBLFVBQVUsT0FBTyxPQUFPLFlBQVk7QUFDcEMsSUFBTSxjQUFjO0FBQUEsRUFDaEIsTUFBTTtBQUFFLFdBQU87QUFBQSxFQUFNO0FBQUEsRUFDckIsUUFBUUEsTUFBSztBQUFFLFdBQU8sSUFBSSxhQUFhQSxJQUFHO0FBQUEsRUFBRztBQUNqRDtBQUtBLFNBQVMsZ0JBQWdCQSxNQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssT0FBTyxPQUFPO0FBQy9ELE1BQUksS0FBSztBQUNMLFdBQU8sY0FBYyxPQUFPQSxNQUFLLEdBQUc7QUFDeEMsV0FBUyxJQUFJLFNBQVMsTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxLQUFLLGFBQWEsS0FBSyxHQUFHLEtBQUssS0FBSztBQUN0RixRQUFJLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFDeEIsUUFBSSxDQUFDLE1BQU0sUUFBUTtBQUNmLFVBQUksUUFBUSxnQkFBZ0JBLE1BQUssT0FBTyxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sYUFBYSxHQUFHLEtBQUssSUFBSTtBQUM1RixVQUFJO0FBQ0EsZUFBTztBQUFBLElBQ2YsV0FDUyxDQUFDLFFBQVEsY0FBYyxhQUFhLEtBQUssR0FBRztBQUNqRCxhQUFPLGNBQWMsT0FBT0EsTUFBSyxPQUFPLE1BQU0sSUFBSSxNQUFNLFdBQVcsRUFBRTtBQUFBLElBQ3pFO0FBQ0EsV0FBTyxNQUFNLFdBQVc7QUFBQSxFQUM1QjtBQUNBLFNBQU87QUFDWDtBQUNBLFNBQVMsd0JBQXdCSCxLQUFJLFVBQVUsTUFBTTtBQUNqRCxNQUFJLE9BQU9BLElBQUcsTUFBTSxTQUFTO0FBQzdCLE1BQUksT0FBTztBQUNQO0FBQ0osTUFBSSxPQUFPQSxJQUFHLE1BQU0sSUFBSTtBQUN4QixNQUFJLEVBQUUsZ0JBQWdCLGVBQWUsZ0JBQWdCO0FBQ2pEO0FBQ0osTUFBSUssT0FBTUwsSUFBRyxRQUFRLEtBQUssSUFBSSxHQUFHTTtBQUNqQyxFQUFBRCxLQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssVUFBVSxVQUFVO0FBQUUsUUFBSUMsUUFBTztBQUN0RCxNQUFBQSxPQUFNO0FBQUEsRUFBTyxDQUFDO0FBQ2xCLEVBQUFOLElBQUcsYUFBYSxVQUFVLEtBQUtBLElBQUcsSUFBSSxRQUFRTSxJQUFHLEdBQUcsSUFBSSxDQUFDO0FBQzdEO0FBRUEsSUFBTSxjQUFjO0FBQXBCLElBQXVCLGdCQUFnQjtBQUF2QyxJQUEwQyxpQkFBaUI7QUF1QjNELElBQU0sY0FBTixjQUEwQixVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEMsWUFBWSxPQUFPO0FBQ2YsVUFBTSxNQUFNLEdBQUc7QUFFZixTQUFLLGtCQUFrQjtBQUd2QixTQUFLLFVBQVU7QUFFZixTQUFLLE9BQU8sdUJBQU8sT0FBTyxJQUFJO0FBQzlCLFNBQUssT0FBTyxLQUFLLElBQUk7QUFDckIsU0FBSyxlQUFlLE1BQU07QUFDMUIsU0FBSyxjQUFjLE1BQU07QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsSUFBSSxZQUFZO0FBQ1osUUFBSSxLQUFLLGtCQUFrQixLQUFLLE1BQU0sUUFBUTtBQUMxQyxXQUFLLGVBQWUsS0FBSyxhQUFhLElBQUksS0FBSyxLQUFLLEtBQUssUUFBUSxNQUFNLEtBQUssZUFBZSxDQUFDO0FBQzVGLFdBQUssa0JBQWtCLEtBQUssTUFBTTtBQUFBLElBQ3RDO0FBQ0EsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsYUFBYSxXQUFXO0FBQ3BCLFFBQUksVUFBVSxNQUFNLE9BQU8sS0FBSztBQUM1QixZQUFNLElBQUksV0FBVyxxRUFBcUU7QUFDOUYsU0FBSyxlQUFlO0FBQ3BCLFNBQUssa0JBQWtCLEtBQUssTUFBTTtBQUNsQyxTQUFLLFdBQVcsS0FBSyxVQUFVLGVBQWUsQ0FBQztBQUMvQyxTQUFLLGNBQWM7QUFDbkIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksZUFBZTtBQUNmLFlBQVEsS0FBSyxVQUFVLGVBQWU7QUFBQSxFQUMxQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsZUFBZSxPQUFPO0FBQ2xCLFNBQUssY0FBYztBQUNuQixTQUFLLFdBQVc7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxZQUFZLE9BQU87QUFDZixRQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssZUFBZSxLQUFLLFVBQVUsTUFBTSxNQUFNLEdBQUcsS0FBSztBQUNyRSxXQUFLLGVBQWUsS0FBSztBQUM3QixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsY0FBYyxNQUFNO0FBQ2hCLFdBQU8sS0FBSyxZQUFZLEtBQUssU0FBUyxLQUFLLGVBQWUsS0FBSyxVQUFVLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFBQSxFQUMzRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsaUJBQWlCLE1BQU07QUFDbkIsV0FBTyxLQUFLLFlBQVksS0FBSyxjQUFjLEtBQUssZUFBZSxLQUFLLFVBQVUsTUFBTSxNQUFNLENBQUMsQ0FBQztBQUFBLEVBQ2hHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxJQUFJLGlCQUFpQjtBQUNqQixZQUFRLEtBQUssVUFBVSxpQkFBaUI7QUFBQSxFQUM1QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsUUFBUSxNQUFNSCxNQUFLO0FBQ2YsVUFBTSxRQUFRLE1BQU1BLElBQUc7QUFDdkIsU0FBSyxVQUFVLEtBQUssVUFBVSxDQUFDO0FBQy9CLFNBQUssY0FBYztBQUFBLEVBQ3ZCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxRQUFRLE1BQU07QUFDVixTQUFLLE9BQU87QUFDWixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsaUJBQWlCSSxRQUFPO0FBQ3BCLFNBQUssVUFBVSxRQUFRLE1BQU1BLE1BQUs7QUFDbEMsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxxQkFBcUIsTUFBTSxlQUFlLE1BQU07QUFDNUMsUUFBSSxZQUFZLEtBQUs7QUFDckIsUUFBSTtBQUNBLGFBQU8sS0FBSyxLQUFLLEtBQUssZ0JBQWdCLFVBQVUsUUFBUSxVQUFVLE1BQU0sTUFBTSxJQUFLLFVBQVUsTUFBTSxZQUFZLFVBQVUsR0FBRyxLQUFLLEtBQUssS0FBTTtBQUNoSixjQUFVLFlBQVksTUFBTSxJQUFJO0FBQ2hDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxrQkFBa0I7QUFDZCxTQUFLLFVBQVUsUUFBUSxJQUFJO0FBQzNCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQVcsTUFBTU4sT0FBTSxJQUFJO0FBQ3ZCLFFBQUksU0FBUyxLQUFLLElBQUksS0FBSztBQUMzQixRQUFJQSxTQUFRLE1BQU07QUFDZCxVQUFJLENBQUM7QUFDRCxlQUFPLEtBQUssZ0JBQWdCO0FBQ2hDLGFBQU8sS0FBSyxxQkFBcUIsT0FBTyxLQUFLLElBQUksR0FBRyxJQUFJO0FBQUEsSUFDNUQsT0FDSztBQUNELFVBQUksTUFBTTtBQUNOLGFBQUtBO0FBQ1QsV0FBSyxNQUFNLE9BQU9BLFFBQU87QUFDekIsVUFBSSxDQUFDO0FBQ0QsZUFBTyxLQUFLLFlBQVlBLE9BQU0sRUFBRTtBQUNwQyxVQUFJLFFBQVEsS0FBSztBQUNqQixVQUFJLENBQUMsT0FBTztBQUNSLFlBQUksUUFBUSxLQUFLLElBQUksUUFBUUEsS0FBSTtBQUNqQyxnQkFBUSxNQUFNQSxRQUFPLE1BQU0sTUFBTSxJQUFJLE1BQU0sWUFBWSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7QUFBQSxNQUMvRTtBQUNBLFdBQUssaUJBQWlCQSxPQUFNLElBQUksT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDO0FBQ3hELFVBQUksQ0FBQyxLQUFLLFVBQVU7QUFDaEIsYUFBSyxhQUFhLFVBQVUsS0FBSyxLQUFLLFVBQVUsR0FBRyxDQUFDO0FBQ3hELGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxRQUFRLEtBQUssT0FBTztBQUNoQixTQUFLLEtBQUssT0FBTyxPQUFPLFdBQVcsTUFBTSxJQUFJLEdBQUcsSUFBSTtBQUNwRCxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsUUFBUSxLQUFLO0FBQ1QsV0FBTyxLQUFLLEtBQUssT0FBTyxPQUFPLFdBQVcsTUFBTSxJQUFJLEdBQUc7QUFBQSxFQUMzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLFlBQVk7QUFDWixhQUFTLEtBQUssS0FBSztBQUNmLGFBQU87QUFDWCxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxpQkFBaUI7QUFDYixTQUFLLFdBQVc7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksbUJBQW1CO0FBQ25CLFlBQVEsS0FBSyxVQUFVLGtCQUFrQjtBQUFBLEVBQzdDO0FBQ0o7QUFFQSxTQUFTLEtBQUssR0FBR08sT0FBTTtBQUNuQixTQUFPLENBQUNBLFNBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxLQUFLQSxLQUFJO0FBQ3hDO0FBQ0EsSUFBTSxZQUFOLE1BQWdCO0FBQUEsRUFDWixZQUFZLE1BQU0sTUFBTUEsT0FBTTtBQUMxQixTQUFLLE9BQU87QUFDWixTQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU1BLEtBQUk7QUFDaEMsU0FBSyxRQUFRLEtBQUssS0FBSyxPQUFPQSxLQUFJO0FBQUEsRUFDdEM7QUFDSjtBQUNBLElBQU0sYUFBYTtBQUFBLEVBQ2YsSUFBSSxVQUFVLE9BQU87QUFBQSxJQUNqQixLQUFLLFFBQVE7QUFBRSxhQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sWUFBWSxjQUFjO0FBQUEsSUFBRztBQUFBLElBQy9FLE1BQU1SLEtBQUk7QUFBRSxhQUFPQSxJQUFHO0FBQUEsSUFBSztBQUFBLEVBQy9CLENBQUM7QUFBQSxFQUNELElBQUksVUFBVSxhQUFhO0FBQUEsSUFDdkIsS0FBSyxRQUFRLFVBQVU7QUFBRSxhQUFPLE9BQU8sYUFBYSxVQUFVLFFBQVEsU0FBUyxHQUFHO0FBQUEsSUFBRztBQUFBLElBQ3JGLE1BQU1BLEtBQUk7QUFBRSxhQUFPQSxJQUFHO0FBQUEsSUFBVztBQUFBLEVBQ3JDLENBQUM7QUFBQSxFQUNELElBQUksVUFBVSxlQUFlO0FBQUEsSUFDekIsS0FBSyxRQUFRO0FBQUUsYUFBTyxPQUFPLGVBQWU7QUFBQSxJQUFNO0FBQUEsSUFDbEQsTUFBTUEsS0FBSSxRQUFRLE1BQU0sT0FBTztBQUFFLGFBQU8sTUFBTSxVQUFVLFVBQVVBLElBQUcsY0FBYztBQUFBLElBQU07QUFBQSxFQUM3RixDQUFDO0FBQUEsRUFDRCxJQUFJLFVBQVUscUJBQXFCO0FBQUEsSUFDL0IsT0FBTztBQUFFLGFBQU87QUFBQSxJQUFHO0FBQUEsSUFDbkIsTUFBTUEsS0FBSSxNQUFNO0FBQUUsYUFBT0EsSUFBRyxtQkFBbUIsT0FBTyxJQUFJO0FBQUEsSUFBTTtBQUFBLEVBQ3BFLENBQUM7QUFDTDtBQUdBLElBQU0sZ0JBQU4sTUFBb0I7QUFBQSxFQUNoQixZQUFZLFFBQVEsU0FBUztBQUN6QixTQUFLLFNBQVM7QUFDZCxTQUFLLFVBQVUsQ0FBQztBQUNoQixTQUFLLGVBQWUsdUJBQU8sT0FBTyxJQUFJO0FBQ3RDLFNBQUssU0FBUyxXQUFXLE1BQU07QUFDL0IsUUFBSTtBQUNBLGNBQVEsUUFBUSxZQUFVO0FBQ3RCLFlBQUksS0FBSyxhQUFhLE9BQU8sR0FBRztBQUM1QixnQkFBTSxJQUFJLFdBQVcsbURBQW1ELE9BQU8sTUFBTSxHQUFHO0FBQzVGLGFBQUssUUFBUSxLQUFLLE1BQU07QUFDeEIsYUFBSyxhQUFhLE9BQU8sR0FBRyxJQUFJO0FBQ2hDLFlBQUksT0FBTyxLQUFLO0FBQ1osZUFBSyxPQUFPLEtBQUssSUFBSSxVQUFVLE9BQU8sS0FBSyxPQUFPLEtBQUssT0FBTyxNQUFNLENBQUM7QUFBQSxNQUM3RSxDQUFDO0FBQUEsRUFDVDtBQUNKO0FBVUEsSUFBTSxjQUFOLE1BQU0sYUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFJQSxRQUFRO0FBQ0osU0FBSyxTQUFTO0FBQUEsRUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksU0FBUztBQUNULFdBQU8sS0FBSyxPQUFPO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksVUFBVTtBQUNWLFdBQU8sS0FBSyxPQUFPO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE1BQU1BLEtBQUk7QUFDTixXQUFPLEtBQUssaUJBQWlCQSxHQUFFLEVBQUU7QUFBQSxFQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsa0JBQWtCQSxLQUFJLFNBQVMsSUFBSTtBQUMvQixhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssT0FBTyxRQUFRLFFBQVE7QUFDNUMsVUFBSSxLQUFLLFFBQVE7QUFDYixZQUFJLFNBQVMsS0FBSyxPQUFPLFFBQVEsQ0FBQztBQUNsQyxZQUFJLE9BQU8sS0FBSyxxQkFBcUIsQ0FBQyxPQUFPLEtBQUssa0JBQWtCLEtBQUssUUFBUUEsS0FBSSxJQUFJO0FBQ3JGLGlCQUFPO0FBQUEsTUFDZjtBQUNKLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLGlCQUFpQixRQUFRO0FBQ3JCLFFBQUksQ0FBQyxLQUFLLGtCQUFrQixNQUFNO0FBQzlCLGFBQU8sRUFBRSxPQUFPLE1BQU0sY0FBYyxDQUFDLEVBQUU7QUFDM0MsUUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsS0FBSyxXQUFXLE1BQU0sR0FBRyxPQUFPO0FBSS9ELGVBQVM7QUFDTCxVQUFJLFVBQVU7QUFDZCxlQUFTLElBQUksR0FBRyxJQUFJLEtBQUssT0FBTyxRQUFRLFFBQVEsS0FBSztBQUNqRCxZQUFJLFNBQVMsS0FBSyxPQUFPLFFBQVEsQ0FBQztBQUNsQyxZQUFJLE9BQU8sS0FBSyxtQkFBbUI7QUFDL0IsY0FBSSxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsSUFBSSxHQUFHLFdBQVcsT0FBTyxLQUFLLENBQUMsRUFBRSxRQUFRO0FBQ2hFLGNBQUlBLE1BQUssSUFBSSxJQUFJLFVBQ2IsT0FBTyxLQUFLLGtCQUFrQixLQUFLLFFBQVEsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVSxRQUFRO0FBQ3pGLGNBQUlBLE9BQU0sU0FBUyxrQkFBa0JBLEtBQUksQ0FBQyxHQUFHO0FBQ3pDLFlBQUFBLElBQUcsUUFBUSx1QkFBdUIsTUFBTTtBQUN4QyxnQkFBSSxDQUFDLE1BQU07QUFDUCxxQkFBTyxDQUFDO0FBQ1IsdUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxPQUFPLFFBQVEsUUFBUTtBQUM1QyxxQkFBSyxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sVUFBVSxHQUFHLElBQUksT0FBTyxJQUFJLEVBQUUsT0FBTyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQUEsWUFDcEY7QUFDQSxnQkFBSSxLQUFLQSxHQUFFO0FBQ1gsdUJBQVcsU0FBUyxXQUFXQSxHQUFFO0FBQ2pDLHNCQUFVO0FBQUEsVUFDZDtBQUNBLGNBQUk7QUFDQSxpQkFBSyxDQUFDLElBQUksRUFBRSxPQUFPLFVBQVUsR0FBRyxJQUFJLE9BQU87QUFBQSxRQUNuRDtBQUFBLE1BQ0o7QUFDQSxVQUFJLENBQUM7QUFDRCxlQUFPLEVBQUUsT0FBTyxVQUFVLGNBQWMsSUFBSTtBQUFBLElBQ3BEO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsV0FBV0EsS0FBSTtBQUNYLFFBQUksQ0FBQ0EsSUFBRyxPQUFPLEdBQUcsS0FBSyxHQUFHO0FBQ3RCLFlBQU0sSUFBSSxXQUFXLG1DQUFtQztBQUM1RCxRQUFJLGNBQWMsSUFBSSxhQUFZLEtBQUssTUFBTSxHQUFHLFNBQVMsS0FBSyxPQUFPO0FBQ3JFLGFBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDcEMsVUFBSSxRQUFRLE9BQU8sQ0FBQztBQUNwQixrQkFBWSxNQUFNLElBQUksSUFBSSxNQUFNLE1BQU1BLEtBQUksS0FBSyxNQUFNLElBQUksR0FBRyxNQUFNLFdBQVc7QUFBQSxJQUNqRjtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxJQUFJLEtBQUs7QUFBRSxXQUFPLElBQUksWUFBWSxJQUFJO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXpDLE9BQU8sT0FBTyxRQUFRO0FBQ2xCLFFBQUksVUFBVSxJQUFJLGNBQWMsT0FBTyxNQUFNLE9BQU8sSUFBSSxLQUFLLFNBQVMsT0FBTyxRQUFRLE9BQU8sT0FBTztBQUNuRyxRQUFJLFdBQVcsSUFBSSxhQUFZLE9BQU87QUFDdEMsYUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLE9BQU8sUUFBUTtBQUN2QyxlQUFTLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLFFBQVEsT0FBTyxDQUFDLEVBQUUsS0FBSyxRQUFRLFFBQVE7QUFDOUUsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxZQUFZLFFBQVE7QUFDaEIsUUFBSSxVQUFVLElBQUksY0FBYyxLQUFLLFFBQVEsT0FBTyxPQUFPO0FBQzNELFFBQUksU0FBUyxRQUFRLFFBQVEsV0FBVyxJQUFJLGFBQVksT0FBTztBQUMvRCxhQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3BDLFVBQUksT0FBTyxPQUFPLENBQUMsRUFBRTtBQUNyQixlQUFTLElBQUksSUFBSSxLQUFLLGVBQWUsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxFQUFFLEtBQUssUUFBUSxRQUFRO0FBQUEsSUFDN0Y7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFPLGNBQWM7QUFDakIsUUFBSSxTQUFTLEVBQUUsS0FBSyxLQUFLLElBQUksT0FBTyxHQUFHLFdBQVcsS0FBSyxVQUFVLE9BQU8sRUFBRTtBQUMxRSxRQUFJLEtBQUs7QUFDTCxhQUFPLGNBQWMsS0FBSyxZQUFZLElBQUksT0FBSyxFQUFFLE9BQU8sQ0FBQztBQUM3RCxRQUFJLGdCQUFnQixPQUFPLGdCQUFnQjtBQUN2QyxlQUFTLFFBQVEsY0FBYztBQUMzQixZQUFJLFFBQVEsU0FBUyxRQUFRO0FBQ3pCLGdCQUFNLElBQUksV0FBVyxvREFBb0Q7QUFDN0UsWUFBSSxTQUFTLGFBQWEsSUFBSSxHQUFHLFFBQVEsT0FBTyxLQUFLO0FBQ3JELFlBQUksU0FBUyxNQUFNO0FBQ2YsaUJBQU8sSUFBSSxJQUFJLE1BQU0sT0FBTyxLQUFLLFFBQVEsS0FBSyxPQUFPLEdBQUcsQ0FBQztBQUFBLE1BQ2pFO0FBQ0osV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsT0FBTyxTQUFTLFFBQVFJLE9BQU0sY0FBYztBQUN4QyxRQUFJLENBQUNBO0FBQ0QsWUFBTSxJQUFJLFdBQVcsd0NBQXdDO0FBQ2pFLFFBQUksQ0FBQyxPQUFPO0FBQ1IsWUFBTSxJQUFJLFdBQVcsd0NBQXdDO0FBQ2pFLFFBQUksVUFBVSxJQUFJLGNBQWMsT0FBTyxRQUFRLE9BQU8sT0FBTztBQUM3RCxRQUFJLFdBQVcsSUFBSSxhQUFZLE9BQU87QUFDdEMsWUFBUSxPQUFPLFFBQVEsV0FBUztBQUM1QixVQUFJLE1BQU0sUUFBUSxPQUFPO0FBQ3JCLGlCQUFTLE1BQU0sS0FBSyxTQUFTLE9BQU8sUUFBUUEsTUFBSyxHQUFHO0FBQUEsTUFDeEQsV0FDUyxNQUFNLFFBQVEsYUFBYTtBQUNoQyxpQkFBUyxZQUFZLFVBQVUsU0FBUyxTQUFTLEtBQUtBLE1BQUssU0FBUztBQUFBLE1BQ3hFLFdBQ1MsTUFBTSxRQUFRLGVBQWU7QUFDbEMsWUFBSUEsTUFBSztBQUNMLG1CQUFTLGNBQWNBLE1BQUssWUFBWSxJQUFJLE9BQU8sT0FBTyxZQUFZO0FBQUEsTUFDOUUsT0FDSztBQUNELFlBQUk7QUFDQSxtQkFBUyxRQUFRLGNBQWM7QUFDM0IsZ0JBQUksU0FBUyxhQUFhLElBQUksR0FBRyxRQUFRLE9BQU8sS0FBSztBQUNyRCxnQkFBSSxPQUFPLE9BQU8sTUFBTSxRQUFRLFNBQVMsTUFBTSxZQUMzQyxPQUFPLFVBQVUsZUFBZSxLQUFLQSxPQUFNLElBQUksR0FBRztBQUNsRCx1QkFBUyxNQUFNLElBQUksSUFBSSxNQUFNLFNBQVMsS0FBSyxRQUFRLFFBQVFBLE1BQUssSUFBSSxHQUFHLFFBQVE7QUFDL0U7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNKLGlCQUFTLE1BQU0sSUFBSSxJQUFJLE1BQU0sS0FBSyxRQUFRLFFBQVE7QUFBQSxNQUN0RDtBQUFBLElBQ0osQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFFQSxTQUFTLFVBQVUsS0FBS0ksT0FBTSxRQUFRO0FBQ2xDLFdBQVMsUUFBUSxLQUFLO0FBQ2xCLFFBQUksTUFBTSxJQUFJLElBQUk7QUFDbEIsUUFBSSxlQUFlO0FBQ2YsWUFBTSxJQUFJLEtBQUtBLEtBQUk7QUFBQSxhQUNkLFFBQVE7QUFDYixZQUFNLFVBQVUsS0FBS0EsT0FBTSxDQUFDLENBQUM7QUFDakMsV0FBTyxJQUFJLElBQUk7QUFBQSxFQUNuQjtBQUNBLFNBQU87QUFDWDtBQU1BLElBQU0sU0FBTixNQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVCxZQUlBLE1BQU07QUFDRixTQUFLLE9BQU87QUFJWixTQUFLLFFBQVEsQ0FBQztBQUNkLFFBQUksS0FBSztBQUNMLGdCQUFVLEtBQUssT0FBTyxNQUFNLEtBQUssS0FBSztBQUMxQyxTQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLFVBQVUsUUFBUTtBQUFBLEVBQzNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxTQUFTLE9BQU87QUFBRSxXQUFPLE1BQU0sS0FBSyxHQUFHO0FBQUEsRUFBRztBQUM5QztBQUNBLElBQU0sT0FBTyx1QkFBTyxPQUFPLElBQUk7QUFDL0IsU0FBUyxVQUFVLE1BQU07QUFDckIsTUFBSSxRQUFRO0FBQ1IsV0FBTyxPQUFPLE1BQU0sRUFBRSxLQUFLLElBQUk7QUFDbkMsT0FBSyxJQUFJLElBQUk7QUFDYixTQUFPLE9BQU87QUFDbEI7QUFPQSxJQUFNLFlBQU4sTUFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlaLFlBQVksT0FBTyxPQUFPO0FBQUUsU0FBSyxNQUFNLFVBQVUsSUFBSTtBQUFBLEVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS3hELElBQUksT0FBTztBQUFFLFdBQU8sTUFBTSxPQUFPLGFBQWEsS0FBSyxHQUFHO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXpELFNBQVMsT0FBTztBQUFFLFdBQU8sTUFBTSxLQUFLLEdBQUc7QUFBQSxFQUFHO0FBQzlDOzs7QUNwK0JBLElBQU0sV0FBVyxTQUFVLE1BQU07QUFDN0IsV0FBUyxRQUFRLEtBQUksU0FBUztBQUMxQixXQUFPLEtBQUs7QUFDWixRQUFJLENBQUM7QUFDRCxhQUFPO0FBQUEsRUFDZjtBQUNKO0FBQ0EsSUFBTSxhQUFhLFNBQVUsTUFBTTtBQUMvQixNQUFJLFNBQVMsS0FBSyxnQkFBZ0IsS0FBSztBQUN2QyxTQUFPLFVBQVUsT0FBTyxZQUFZLEtBQUssT0FBTyxPQUFPO0FBQzNEO0FBQ0EsSUFBSSxjQUFjO0FBSWxCLElBQU0sWUFBWSxTQUFVLE1BQU1DLE9BQU0sSUFBSTtBQUN4QyxNQUFJLFFBQVEsZ0JBQWdCLGNBQWMsU0FBUyxZQUFZO0FBQy9ELFFBQU0sT0FBTyxNQUFNLE1BQU0sT0FBTyxLQUFLLFVBQVUsU0FBUyxFQUFFO0FBQzFELFFBQU0sU0FBUyxNQUFNQSxTQUFRLENBQUM7QUFDOUIsU0FBTztBQUNYO0FBSUEsSUFBTSx1QkFBdUIsU0FBVSxNQUFNLEtBQUssWUFBWSxXQUFXO0FBQ3JFLFNBQU8sZUFBZSxRQUFRLE1BQU0sS0FBSyxZQUFZLFdBQVcsRUFBRSxLQUM5RCxRQUFRLE1BQU0sS0FBSyxZQUFZLFdBQVcsQ0FBQztBQUNuRDtBQUNBLElBQU0sZUFBZTtBQUNyQixTQUFTLFFBQVEsTUFBTSxLQUFLLFlBQVksV0FBVyxLQUFLO0FBQ3BELGFBQVM7QUFDTCxRQUFJLFFBQVEsY0FBYyxPQUFPO0FBQzdCLGFBQU87QUFDWCxRQUFJLFFBQVEsTUFBTSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUk7QUFDdkMsVUFBSSxTQUFTLEtBQUs7QUFDbEIsVUFBSSxDQUFDLFVBQVUsT0FBTyxZQUFZLEtBQUssYUFBYSxJQUFJLEtBQUssYUFBYSxLQUFLLEtBQUssUUFBUSxLQUN4RixLQUFLLG1CQUFtQjtBQUN4QixlQUFPO0FBQ1gsWUFBTSxTQUFTLElBQUksS0FBSyxNQUFNLElBQUksSUFBSTtBQUN0QyxhQUFPO0FBQUEsSUFDWCxXQUNTLEtBQUssWUFBWSxHQUFHO0FBQ3pCLGFBQU8sS0FBSyxXQUFXLE9BQU8sTUFBTSxJQUFJLEtBQUssRUFBRTtBQUMvQyxVQUFJLEtBQUssbUJBQW1CO0FBQ3hCLGVBQU87QUFDWCxZQUFNLE1BQU0sSUFBSSxTQUFTLElBQUksSUFBSTtBQUFBLElBQ3JDLE9BQ0s7QUFDRCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDSjtBQUNBLFNBQVMsU0FBUyxNQUFNO0FBQ3BCLFNBQU8sS0FBSyxZQUFZLElBQUksS0FBSyxVQUFVLFNBQVMsS0FBSyxXQUFXO0FBQ3hFO0FBQ0EsU0FBUyxTQUFTLE1BQU1DLFNBQVEsUUFBUTtBQUNwQyxXQUFTLFVBQVVBLFdBQVUsR0FBRyxRQUFRQSxXQUFVLFNBQVMsSUFBSSxHQUFHLFdBQVcsU0FBUTtBQUNqRixRQUFJLFFBQVE7QUFDUixhQUFPO0FBQ1gsUUFBSSxRQUFRLFNBQVMsSUFBSTtBQUN6QixXQUFPLEtBQUs7QUFDWixRQUFJLENBQUM7QUFDRCxhQUFPO0FBQ1gsY0FBVSxXQUFXLFNBQVM7QUFDOUIsWUFBUSxTQUFTLFNBQVMsU0FBUyxJQUFJO0FBQUEsRUFDM0M7QUFDSjtBQUNBLFNBQVMsYUFBYSxLQUFLO0FBQ3ZCLE1BQUk7QUFDSixXQUFTLE1BQU0sS0FBSyxLQUFLLE1BQU0sSUFBSTtBQUMvQixRQUFJLE9BQU8sSUFBSTtBQUNYO0FBQ1IsU0FBTyxRQUFRLEtBQUssUUFBUSxLQUFLLEtBQUssWUFBWSxLQUFLLE9BQU8sT0FBTyxLQUFLLGNBQWM7QUFDNUY7QUFHQSxJQUFNLHFCQUFxQixTQUFVLFFBQVE7QUFDekMsU0FBTyxPQUFPLGFBQWEscUJBQXFCLE9BQU8sV0FBVyxPQUFPLGFBQWEsT0FBTyxZQUFZLE9BQU8sWUFBWTtBQUNoSTtBQUNBLFNBQVMsU0FBUyxTQUFTLEtBQUs7QUFDNUIsTUFBSSxRQUFRLFNBQVMsWUFBWSxPQUFPO0FBQ3hDLFFBQU0sVUFBVSxXQUFXLE1BQU0sSUFBSTtBQUNyQyxRQUFNLFVBQVU7QUFDaEIsUUFBTSxNQUFNLE1BQU0sT0FBTztBQUN6QixTQUFPO0FBQ1g7QUFDQSxTQUFTLGtCQUFrQkMsTUFBSztBQUM1QixNQUFJLE1BQU1BLEtBQUk7QUFDZCxTQUFPLE9BQU8sSUFBSTtBQUNkLFVBQU0sSUFBSSxXQUFXO0FBQ3pCLFNBQU87QUFDWDtBQUNBLFNBQVMsZUFBZUEsTUFBSyxHQUFHLEdBQUc7QUFDL0IsTUFBSUEsS0FBSSx3QkFBd0I7QUFDNUIsUUFBSTtBQUNBLFVBQUksTUFBTUEsS0FBSSx1QkFBdUIsR0FBRyxDQUFDO0FBQ3pDLFVBQUk7QUFDQSxlQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksUUFBUSxJQUFJLE9BQU87QUFBQSxJQUMxRCxTQUNPLEdBQUc7QUFBQSxJQUFFO0FBQUEsRUFDaEI7QUFDQSxNQUFJQSxLQUFJLHFCQUFxQjtBQUN6QixRQUFJLFFBQVFBLEtBQUksb0JBQW9CLEdBQUcsQ0FBQztBQUN4QyxRQUFJO0FBQ0EsYUFBTyxFQUFFLE1BQU0sTUFBTSxnQkFBZ0IsUUFBUSxNQUFNLFlBQVk7QUFBQSxFQUN2RTtBQUNKO0FBRUEsSUFBTSxNQUFNLE9BQU8sYUFBYSxjQUFjLFlBQVk7QUFDMUQsSUFBTUEsT0FBTSxPQUFPLFlBQVksY0FBYyxXQUFXO0FBQ3hELElBQU0sUUFBUyxPQUFPLElBQUksYUFBYztBQUN4QyxJQUFNLFVBQVUsY0FBYyxLQUFLLEtBQUs7QUFDeEMsSUFBTSxZQUFZLFVBQVUsS0FBSyxLQUFLO0FBQ3RDLElBQU0sVUFBVSx3Q0FBd0MsS0FBSyxLQUFLO0FBQ2xFLElBQU0sS0FBSyxDQUFDLEVBQUUsYUFBYSxXQUFXO0FBQ3RDLElBQU0sYUFBYSxZQUFZLFNBQVMsZUFBZSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJO0FBQ3ZHLElBQU0sUUFBUSxDQUFDLE1BQU0sZ0JBQWdCLEtBQUssS0FBSztBQUMvQyxTQUFTLEVBQUUsaUJBQWlCLEtBQUssS0FBSyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNwRCxJQUFNLFVBQVUsQ0FBQyxNQUFNLGdCQUFnQixLQUFLLEtBQUs7QUFDakQsSUFBTSxTQUFTLENBQUMsQ0FBQztBQUNqQixJQUFNLGlCQUFpQixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUk7QUFDL0MsSUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxpQkFBaUIsS0FBSyxJQUFJLE1BQU07QUFFL0QsSUFBTSxNQUFNLFdBQVcsY0FBYyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsT0FBTyxJQUFJLGlCQUFpQjtBQUNsRixJQUFNLE1BQU0sUUFBUSxNQUFNLE1BQU0sS0FBSyxJQUFJLFFBQVEsSUFBSTtBQUNyRCxJQUFNLFVBQVUsTUFBTSxNQUFNLEtBQUssSUFBSSxRQUFRLElBQUk7QUFDakQsSUFBTSxVQUFVLGFBQWEsS0FBSyxLQUFLO0FBQ3ZDLElBQU0sU0FBUyxDQUFDLENBQUNBLFFBQU8seUJBQXlCQSxLQUFJLGdCQUFnQjtBQUNyRSxJQUFNLGlCQUFpQixTQUFTLEVBQUUsdUJBQXVCLEtBQUssVUFBVSxTQUFTLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUk7QUFFbkcsU0FBUyxXQUFXQSxNQUFLO0FBQ3JCLFNBQU87QUFBQSxJQUFFLE1BQU07QUFBQSxJQUFHLE9BQU9BLEtBQUksZ0JBQWdCO0FBQUEsSUFDekMsS0FBSztBQUFBLElBQUcsUUFBUUEsS0FBSSxnQkFBZ0I7QUFBQSxFQUFhO0FBQ3pEO0FBQ0EsU0FBUyxRQUFRLE9BQU8sTUFBTTtBQUMxQixTQUFPLE9BQU8sU0FBUyxXQUFXLFFBQVEsTUFBTSxJQUFJO0FBQ3hEO0FBQ0EsU0FBUyxXQUFXLE1BQU07QUFDdEIsTUFBSSxPQUFPLEtBQUssc0JBQXNCO0FBRXRDLE1BQUksU0FBVSxLQUFLLFFBQVEsS0FBSyxlQUFnQjtBQUNoRCxNQUFJLFNBQVUsS0FBSyxTQUFTLEtBQUssZ0JBQWlCO0FBRWxELFNBQU87QUFBQSxJQUFFLE1BQU0sS0FBSztBQUFBLElBQU0sT0FBTyxLQUFLLE9BQU8sS0FBSyxjQUFjO0FBQUEsSUFDNUQsS0FBSyxLQUFLO0FBQUEsSUFBSyxRQUFRLEtBQUssTUFBTSxLQUFLLGVBQWU7QUFBQSxFQUFPO0FBQ3JFO0FBQ0EsU0FBUyxtQkFBbUIsTUFBTSxNQUFNLFVBQVU7QUFDOUMsTUFBSSxrQkFBa0IsS0FBSyxTQUFTLGlCQUFpQixLQUFLLEdBQUcsZUFBZSxLQUFLLFNBQVMsY0FBYyxLQUFLO0FBQzdHLE1BQUlBLE9BQU0sS0FBSyxJQUFJO0FBQ25CLFdBQVMsU0FBUyxZQUFZLEtBQUssT0FBTSxTQUFTLFdBQVcsTUFBTSxHQUFHO0FBQ2xFLFFBQUksQ0FBQztBQUNEO0FBQ0osUUFBSSxPQUFPLFlBQVk7QUFDbkI7QUFDSixRQUFJLE1BQU07QUFDVixRQUFJLFFBQVEsT0FBT0EsS0FBSTtBQUN2QixRQUFJLFdBQVcsUUFBUSxXQUFXQSxJQUFHLElBQUksV0FBVyxHQUFHO0FBQ3ZELFFBQUksUUFBUSxHQUFHLFFBQVE7QUFDdkIsUUFBSSxLQUFLLE1BQU0sU0FBUyxNQUFNLFFBQVEsaUJBQWlCLEtBQUs7QUFDeEQsY0FBUSxFQUFFLFNBQVMsTUFBTSxLQUFLLE1BQU0sUUFBUSxjQUFjLEtBQUs7QUFBQSxhQUMxRCxLQUFLLFNBQVMsU0FBUyxTQUFTLFFBQVEsaUJBQWlCLFFBQVE7QUFDdEUsY0FBUSxLQUFLLFNBQVMsS0FBSyxNQUFNLFNBQVMsU0FBUyxTQUFTLE1BQ3RELEtBQUssTUFBTSxRQUFRLGNBQWMsS0FBSyxJQUFJLFNBQVMsTUFDbkQsS0FBSyxTQUFTLFNBQVMsU0FBUyxRQUFRLGNBQWMsUUFBUTtBQUN4RSxRQUFJLEtBQUssT0FBTyxTQUFTLE9BQU8sUUFBUSxpQkFBaUIsTUFBTTtBQUMzRCxjQUFRLEVBQUUsU0FBUyxPQUFPLEtBQUssT0FBTyxRQUFRLGNBQWMsTUFBTTtBQUFBLGFBQzdELEtBQUssUUFBUSxTQUFTLFFBQVEsUUFBUSxpQkFBaUIsT0FBTztBQUNuRSxjQUFRLEtBQUssUUFBUSxTQUFTLFFBQVEsUUFBUSxjQUFjLE9BQU87QUFDdkUsUUFBSSxTQUFTLE9BQU87QUFDaEIsVUFBSSxPQUFPO0FBQ1AsUUFBQUEsS0FBSSxZQUFZLFNBQVMsT0FBTyxLQUFLO0FBQUEsTUFDekMsT0FDSztBQUNELFlBQUksU0FBUyxJQUFJLFlBQVksU0FBUyxJQUFJO0FBQzFDLFlBQUk7QUFDQSxjQUFJLGFBQWE7QUFDckIsWUFBSTtBQUNBLGNBQUksY0FBYztBQUN0QixZQUFJLEtBQUssSUFBSSxhQUFhLFFBQVEsS0FBSyxJQUFJLFlBQVk7QUFDdkQsZUFBTyxFQUFFLE1BQU0sS0FBSyxPQUFPLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFBQSxNQUN4RztBQUFBLElBQ0o7QUFDQSxRQUFJLFNBQVMsbUJBQW1CLEtBQUssaUJBQWlCLE1BQU0sRUFBRSxRQUFRO0FBQ2xFO0FBQUEsRUFDUjtBQUNKO0FBS0EsU0FBUyxlQUFlLE1BQU07QUFDMUIsTUFBSSxPQUFPLEtBQUssSUFBSSxzQkFBc0IsR0FBRyxTQUFTLEtBQUssSUFBSSxHQUFHLEtBQUssR0FBRztBQUMxRSxNQUFJLFFBQVE7QUFDWixXQUFTLEtBQUssS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxJQUFJLGFBQWEsS0FBSyxNQUFNLEdBQUcsS0FBSyxHQUFHO0FBQ3ZHLFFBQUksTUFBTSxLQUFLLEtBQUssaUJBQWlCLEdBQUcsQ0FBQztBQUN6QyxRQUFJLENBQUMsT0FBTyxPQUFPLEtBQUssT0FBTyxDQUFDLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFDakQ7QUFDSixRQUFJLFlBQVksSUFBSSxzQkFBc0I7QUFDMUMsUUFBSSxVQUFVLE9BQU8sU0FBUyxJQUFJO0FBQzlCLGVBQVM7QUFDVCxlQUFTLFVBQVU7QUFDbkI7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLFNBQU8sRUFBRSxRQUFnQixRQUFnQixPQUFPLFlBQVksS0FBSyxHQUFHLEVBQUU7QUFDMUU7QUFDQSxTQUFTLFlBQVksS0FBSztBQUN0QixNQUFJLFFBQVEsQ0FBQyxHQUFHQSxPQUFNLElBQUk7QUFDMUIsV0FBUyxNQUFNLEtBQUssS0FBSyxNQUFNLFdBQVcsR0FBRyxHQUFHO0FBQzVDLFVBQU0sS0FBSyxFQUFFLEtBQUssS0FBSyxLQUFLLElBQUksV0FBVyxNQUFNLElBQUksV0FBVyxDQUFDO0FBQ2pFLFFBQUksT0FBT0E7QUFDUDtBQUFBLEVBQ1I7QUFDQSxTQUFPO0FBQ1g7QUFHQSxTQUFTLGVBQWUsRUFBRSxRQUFRLFFBQVEsTUFBTSxHQUFHO0FBQy9DLE1BQUksWUFBWSxTQUFTLE9BQU8sc0JBQXNCLEVBQUUsTUFBTTtBQUM5RCxxQkFBbUIsT0FBTyxhQUFhLElBQUksSUFBSSxZQUFZLE1BQU07QUFDckU7QUFDQSxTQUFTLG1CQUFtQixPQUFPLE1BQU07QUFDckMsV0FBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxRQUFJLEVBQUUsS0FBSyxLQUFBQyxNQUFLLE1BQUFDLE1BQUssSUFBSSxNQUFNLENBQUM7QUFDaEMsUUFBSSxJQUFJLGFBQWFELE9BQU07QUFDdkIsVUFBSSxZQUFZQSxPQUFNO0FBQzFCLFFBQUksSUFBSSxjQUFjQztBQUNsQixVQUFJLGFBQWFBO0FBQUEsRUFDekI7QUFDSjtBQUNBLElBQUkseUJBQXlCO0FBRzdCLFNBQVMsbUJBQW1CLEtBQUs7QUFDN0IsTUFBSSxJQUFJO0FBQ0osV0FBTyxJQUFJLFVBQVU7QUFDekIsTUFBSTtBQUNBLFdBQU8sSUFBSSxNQUFNLHNCQUFzQjtBQUMzQyxNQUFJLFNBQVMsWUFBWSxHQUFHO0FBQzVCLE1BQUksTUFBTSwwQkFBMEIsT0FBTztBQUFBLElBQ3ZDLElBQUksZ0JBQWdCO0FBQ2hCLCtCQUF5QixFQUFFLGVBQWUsS0FBSztBQUMvQyxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0osSUFBSSxNQUFTO0FBQ2IsTUFBSSxDQUFDLHdCQUF3QjtBQUN6Qiw2QkFBeUI7QUFDekIsdUJBQW1CLFFBQVEsQ0FBQztBQUFBLEVBQ2hDO0FBQ0o7QUFDQSxTQUFTLGlCQUFpQixNQUFNLFFBQVE7QUFDcEMsTUFBSSxTQUFTLFlBQVksS0FBSyxlQUFlSCxVQUFTO0FBQ3RELE1BQUksU0FBUyxPQUFPLEtBQUssU0FBUyxPQUFPO0FBQ3pDLE1BQUksWUFBWTtBQUNoQixXQUFTLFFBQVEsS0FBSyxZQUFZLGFBQWEsR0FBRyxPQUFPLFFBQVEsTUFBTSxhQUFhLGNBQWM7QUFDOUYsUUFBSTtBQUNKLFFBQUksTUFBTSxZQUFZO0FBQ2xCLGNBQVEsTUFBTSxlQUFlO0FBQUEsYUFDeEIsTUFBTSxZQUFZO0FBQ3ZCLGNBQVEsVUFBVSxLQUFLLEVBQUUsZUFBZTtBQUFBO0FBRXhDO0FBQ0osYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxVQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLFVBQUksS0FBSyxPQUFPLFVBQVUsS0FBSyxVQUFVLFFBQVE7QUFDN0MsaUJBQVMsS0FBSyxJQUFJLEtBQUssUUFBUSxNQUFNO0FBQ3JDLGlCQUFTLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTTtBQUNsQyxZQUFJLEtBQUssS0FBSyxPQUFPLE9BQU8sT0FBTyxLQUFLLE9BQU8sT0FBTyxPQUNoRCxLQUFLLFFBQVEsT0FBTyxPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVE7QUFDNUQsWUFBSSxLQUFLLFdBQVc7QUFDaEIsb0JBQVU7QUFDVixzQkFBWTtBQUNaLDBCQUFnQixNQUFNLFFBQVEsWUFBWSxJQUFJO0FBQUEsWUFDMUMsTUFBTSxLQUFLLFFBQVEsT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLO0FBQUEsWUFDbkQsS0FBSyxPQUFPO0FBQUEsVUFDaEIsSUFBSTtBQUNKLGNBQUksTUFBTSxZQUFZLEtBQUs7QUFDdkIsWUFBQUEsVUFBUyxjQUFjLE9BQU8sU0FBUyxLQUFLLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSTtBQUM3RTtBQUFBLFFBQ0o7QUFBQSxNQUNKLFdBQ1MsS0FBSyxNQUFNLE9BQU8sT0FBTyxDQUFDLGNBQWMsS0FBSyxRQUFRLE9BQU8sUUFBUSxLQUFLLFNBQVMsT0FBTyxNQUFNO0FBQ3BHLHFCQUFhO0FBQ2Isc0JBQWMsRUFBRSxNQUFNLEtBQUssSUFBSSxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssT0FBTyxPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssS0FBSyxJQUFJO0FBQUEsTUFDaEc7QUFDQSxVQUFJLENBQUMsWUFBWSxPQUFPLFFBQVEsS0FBSyxTQUFTLE9BQU8sT0FBTyxLQUFLLE9BQzdELE9BQU8sUUFBUSxLQUFLLFFBQVEsT0FBTyxPQUFPLEtBQUs7QUFDL0MsUUFBQUEsVUFBUyxhQUFhO0FBQUEsSUFDOUI7QUFBQSxFQUNKO0FBQ0EsTUFBSSxDQUFDLFdBQVcsWUFBWTtBQUN4QixjQUFVO0FBQ1Ysb0JBQWdCO0FBQ2hCLGdCQUFZO0FBQUEsRUFDaEI7QUFDQSxNQUFJLFdBQVcsUUFBUSxZQUFZO0FBQy9CLFdBQU8saUJBQWlCLFNBQVMsYUFBYTtBQUNsRCxNQUFJLENBQUMsV0FBWSxhQUFhLFFBQVEsWUFBWTtBQUM5QyxXQUFPLEVBQUUsTUFBTSxRQUFBQSxRQUFPO0FBQzFCLFNBQU8saUJBQWlCLFNBQVMsYUFBYTtBQUNsRDtBQUNBLFNBQVMsaUJBQWlCLE1BQU0sUUFBUTtBQUNwQyxNQUFJLE1BQU0sS0FBSyxVQUFVO0FBQ3pCLE1BQUksUUFBUSxTQUFTLFlBQVk7QUFDakMsV0FBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUs7QUFDMUIsVUFBTSxPQUFPLE1BQU0sSUFBSSxDQUFDO0FBQ3hCLFVBQU0sU0FBUyxNQUFNLENBQUM7QUFDdEIsUUFBSSxPQUFPLFdBQVcsT0FBTyxDQUFDO0FBQzlCLFFBQUksS0FBSyxPQUFPLEtBQUs7QUFDakI7QUFDSixRQUFJLE9BQU8sUUFBUSxJQUFJO0FBQ25CLGFBQU8sRUFBRSxNQUFNLFFBQVEsS0FBSyxPQUFPLFNBQVMsS0FBSyxPQUFPLEtBQUssU0FBUyxJQUFJLElBQUksR0FBRztBQUFBLEVBQ3pGO0FBQ0EsU0FBTyxFQUFFLE1BQU0sUUFBUSxFQUFFO0FBQzdCO0FBQ0EsU0FBUyxPQUFPLFFBQVEsTUFBTTtBQUMxQixTQUFPLE9BQU8sUUFBUSxLQUFLLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxRQUFRLEtBQy9ELE9BQU8sT0FBTyxLQUFLLE1BQU0sS0FBSyxPQUFPLE9BQU8sS0FBSyxTQUFTO0FBQ2xFO0FBQ0EsU0FBUyxhQUFhLEtBQUssUUFBUTtBQUMvQixNQUFJLFNBQVMsSUFBSTtBQUNqQixNQUFJLFVBQVUsUUFBUSxLQUFLLE9BQU8sUUFBUSxLQUFLLE9BQU8sT0FBTyxJQUFJLHNCQUFzQixFQUFFO0FBQ3JGLFdBQU87QUFDWCxTQUFPO0FBQ1g7QUFDQSxTQUFTLGVBQWUsTUFBTSxLQUFLLFFBQVE7QUFDdkMsTUFBSSxFQUFFLE1BQU0sUUFBQUEsUUFBTyxJQUFJLGlCQUFpQixLQUFLLE1BQU0sR0FBRyxPQUFPO0FBQzdELE1BQUksS0FBSyxZQUFZLEtBQUssQ0FBQyxLQUFLLFlBQVk7QUFDeEMsUUFBSSxPQUFPLEtBQUssc0JBQXNCO0FBQ3RDLFdBQU8sS0FBSyxRQUFRLEtBQUssU0FBUyxPQUFPLFFBQVEsS0FBSyxPQUFPLEtBQUssU0FBUyxJQUFJLElBQUk7QUFBQSxFQUN2RjtBQUNBLFNBQU8sS0FBSyxRQUFRLFdBQVcsTUFBTUEsU0FBUSxJQUFJO0FBQ3JEO0FBQ0EsU0FBUyxhQUFhLE1BQU0sTUFBTUEsU0FBUSxRQUFRO0FBTzlDLE1BQUksZUFBZTtBQUNuQixXQUFTLE1BQU0sTUFBTSxXQUFXLFdBQVM7QUFDckMsUUFBSSxPQUFPLEtBQUs7QUFDWjtBQUNKLFFBQUksT0FBTyxLQUFLLFFBQVEsWUFBWSxLQUFLLElBQUk7QUFDN0MsUUFBSSxDQUFDO0FBQ0QsYUFBTztBQUNYLFFBQUksS0FBSyxJQUFJLFlBQVksTUFBTSxLQUFLLEtBQUssV0FBVyxLQUFLLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxhQUFhO0FBQy9GLFVBQUksT0FBTyxLQUFLLElBQUksc0JBQXNCO0FBQzFDLFVBQUksS0FBSyxLQUFLLFdBQVcsS0FBSyxVQUFVLENBQUMsVUFBVTtBQUMvQyxtQkFBVztBQUNYLFlBQUksS0FBSyxPQUFPLE9BQU8sUUFBUSxLQUFLLE1BQU0sT0FBTztBQUM3Qyx5QkFBZSxLQUFLO0FBQUEsaUJBQ2YsS0FBSyxRQUFRLE9BQU8sUUFBUSxLQUFLLFNBQVMsT0FBTztBQUN0RCx5QkFBZSxLQUFLO0FBQUEsTUFDNUI7QUFDQSxVQUFJLENBQUMsS0FBSyxjQUFjLGVBQWUsS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRO0FBRTNELFlBQUksU0FBUyxLQUFLLEtBQUssVUFBVSxPQUFPLE9BQU8sS0FBSyxNQUFNLEtBQUssVUFBVSxJQUNuRSxPQUFPLFFBQVEsS0FBSyxPQUFPLEtBQUssU0FBUztBQUMvQyxlQUFPLFNBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxNQUMxQztBQUFBLElBQ0o7QUFDQSxVQUFNLEtBQUssSUFBSTtBQUFBLEVBQ25CO0FBQ0EsU0FBTyxlQUFlLEtBQUssZUFBZSxLQUFLLFFBQVEsV0FBVyxNQUFNQSxTQUFRLEVBQUU7QUFDdEY7QUFDQSxTQUFTLGlCQUFpQixTQUFTLFFBQVEsS0FBSztBQUM1QyxNQUFJLE1BQU0sUUFBUSxXQUFXO0FBQzdCLE1BQUksT0FBTyxJQUFJLE1BQU0sSUFBSSxRQUFRO0FBQzdCLGFBQVMsU0FBUyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksTUFBTSxHQUFHLEtBQUssTUFBTSxPQUFPLE9BQU8sTUFBTSxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBVTtBQUNuSSxVQUFJLFFBQVEsUUFBUSxXQUFXLENBQUM7QUFDaEMsVUFBSSxNQUFNLFlBQVksR0FBRztBQUNyQixZQUFJLFFBQVEsTUFBTSxlQUFlO0FBQ2pDLGlCQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ25DLGNBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsY0FBSSxPQUFPLFFBQVEsSUFBSTtBQUNuQixtQkFBTyxpQkFBaUIsT0FBTyxRQUFRLElBQUk7QUFBQSxRQUNuRDtBQUFBLE1BQ0o7QUFDQSxXQUFLLEtBQUssSUFBSSxLQUFLLFFBQVE7QUFDdkI7QUFBQSxJQUNSO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQUVBLFNBQVMsWUFBWSxNQUFNLFFBQVE7QUFDL0IsTUFBSUMsT0FBTSxLQUFLLElBQUksZUFBZSxNQUFNRCxVQUFTO0FBQ2pELE1BQUksUUFBUSxlQUFlQyxNQUFLLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFDdkQsTUFBSTtBQUNBLEtBQUMsRUFBRSxNQUFNLFFBQUFELFFBQU8sSUFBSTtBQUN4QixNQUFJLE9BQU8sS0FBSyxLQUFLLG1CQUFtQixLQUFLLE9BQU9DLE1BQy9DLGlCQUFpQixPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQzdDLE1BQUk7QUFDSixNQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxTQUFTLElBQUksWUFBWSxJQUFJLElBQUksYUFBYSxHQUFHLEdBQUc7QUFDdEUsUUFBSSxNQUFNLEtBQUssSUFBSSxzQkFBc0I7QUFDekMsUUFBSSxDQUFDLE9BQU8sUUFBUSxHQUFHO0FBQ25CLGFBQU87QUFDWCxVQUFNLGlCQUFpQixLQUFLLEtBQUssUUFBUSxHQUFHO0FBQzVDLFFBQUksQ0FBQztBQUNELGFBQU87QUFBQSxFQUNmO0FBRUEsTUFBSSxRQUFRO0FBQ1IsYUFBUyxJQUFJLEtBQUssUUFBUSxHQUFHLElBQUksV0FBVyxDQUFDO0FBQ3pDLFVBQUksRUFBRTtBQUNGLGVBQU87QUFBQSxFQUNuQjtBQUNBLFFBQU0sYUFBYSxLQUFLLE1BQU07QUFDOUIsTUFBSSxNQUFNO0FBQ04sUUFBSSxTQUFTLEtBQUssWUFBWSxHQUFHO0FBRzdCLE1BQUFELFVBQVMsS0FBSyxJQUFJQSxTQUFRLEtBQUssV0FBVyxNQUFNO0FBR2hELFVBQUlBLFVBQVMsS0FBSyxXQUFXLFFBQVE7QUFDakMsWUFBSSxPQUFPLEtBQUssV0FBV0EsT0FBTSxHQUFHO0FBQ3BDLFlBQUksS0FBSyxZQUFZLFVBQVUsTUFBTSxLQUFLLHNCQUFzQixHQUFHLFNBQVMsT0FBTyxRQUMvRSxJQUFJLFNBQVMsT0FBTztBQUNwQixVQUFBQTtBQUFBLE1BQ1I7QUFBQSxJQUNKO0FBQ0EsUUFBSTtBQUVKLFFBQUksVUFBVUEsV0FBVSxLQUFLLFlBQVksTUFBTSxPQUFPLEtBQUssV0FBV0EsVUFBUyxDQUFDLEdBQUcsWUFBWSxLQUMzRixLQUFLLG1CQUFtQixXQUFXLEtBQUssc0JBQXNCLEVBQUUsT0FBTyxPQUFPO0FBQzlFLE1BQUFBO0FBR0osUUFBSSxRQUFRLEtBQUssT0FBT0EsV0FBVSxLQUFLLFdBQVcsU0FBUyxLQUFLLEtBQUssVUFBVSxZQUFZLEtBQ3ZGLE9BQU8sTUFBTSxLQUFLLFVBQVUsc0JBQXNCLEVBQUU7QUFDcEQsWUFBTSxLQUFLLE1BQU0sSUFBSSxRQUFRO0FBQUEsYUFJeEJBLFdBQVUsS0FBSyxLQUFLLFlBQVksS0FBSyxLQUFLLFdBQVdBLFVBQVMsQ0FBQyxFQUFFLFlBQVk7QUFDbEYsWUFBTSxhQUFhLE1BQU0sTUFBTUEsU0FBUSxNQUFNO0FBQUEsRUFDckQ7QUFDQSxNQUFJLE9BQU87QUFDUCxVQUFNLGVBQWUsTUFBTSxLQUFLLE1BQU07QUFDMUMsTUFBSSxPQUFPLEtBQUssUUFBUSxZQUFZLEtBQUssSUFBSTtBQUM3QyxTQUFPLEVBQUUsS0FBSyxRQUFRLE9BQU8sS0FBSyxhQUFhLEtBQUssU0FBUyxHQUFHO0FBQ3BFO0FBQ0EsU0FBUyxRQUFRLE1BQU07QUFDbkIsU0FBTyxLQUFLLE1BQU0sS0FBSyxVQUFVLEtBQUssT0FBTyxLQUFLO0FBQ3REO0FBQ0EsU0FBUyxXQUFXLFFBQVEsTUFBTTtBQUM5QixNQUFJLFFBQVEsT0FBTyxlQUFlO0FBQ2xDLE1BQUksTUFBTSxRQUFRO0FBQ2QsUUFBSUksU0FBUSxNQUFNLE9BQU8sSUFBSSxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2pELFFBQUksUUFBUUEsTUFBSztBQUNiLGFBQU9BO0FBQUEsRUFDZjtBQUNBLFNBQU8sTUFBTSxVQUFVLEtBQUssS0FBSyxPQUFPLE9BQU8sS0FBSyxPQUFPLHNCQUFzQjtBQUNyRjtBQUNBLElBQU0sT0FBTztBQUdiLFNBQVMsWUFBWSxNQUFNLEtBQUssTUFBTTtBQUNsQyxNQUFJLEVBQUUsTUFBTSxRQUFBSixTQUFRLEtBQUssSUFBSSxLQUFLLFFBQVEsV0FBVyxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUM7QUFDM0UsTUFBSSxvQkFBb0IsVUFBVTtBQUNsQyxNQUFJLEtBQUssWUFBWSxHQUFHO0FBR3BCLFFBQUksc0JBQXNCLEtBQUssS0FBSyxLQUFLLFNBQVMsTUFBTSxPQUFPLElBQUksQ0FBQ0EsVUFBU0EsV0FBVSxLQUFLLFVBQVUsVUFBVTtBQUM1RyxVQUFJLE9BQU8sV0FBVyxVQUFVLE1BQU1BLFNBQVFBLE9BQU0sR0FBRyxJQUFJO0FBSTNELFVBQUksU0FBU0EsV0FBVSxLQUFLLEtBQUssS0FBSyxVQUFVQSxVQUFTLENBQUMsQ0FBQyxLQUFLQSxVQUFTLEtBQUssVUFBVSxRQUFRO0FBQzVGLFlBQUksYUFBYSxXQUFXLFVBQVUsTUFBTUEsVUFBUyxHQUFHQSxVQUFTLENBQUMsR0FBRyxFQUFFO0FBQ3ZFLFlBQUksV0FBVyxPQUFPLEtBQUssS0FBSztBQUM1QixjQUFJLFlBQVksV0FBVyxVQUFVLE1BQU1BLFNBQVFBLFVBQVMsQ0FBQyxHQUFHLEVBQUU7QUFDbEUsY0FBSSxVQUFVLE9BQU8sS0FBSztBQUN0QixtQkFBTyxTQUFTLFdBQVcsVUFBVSxPQUFPLFdBQVcsSUFBSTtBQUFBLFFBQ25FO0FBQUEsTUFDSjtBQUNBLGFBQU87QUFBQSxJQUNYLE9BQ0s7QUFDRCxVQUFJRCxRQUFPQyxTQUFRLEtBQUtBLFNBQVEsV0FBVyxPQUFPLElBQUksSUFBSTtBQUMxRCxVQUFJLE9BQU8sS0FBSyxDQUFDQSxTQUFRO0FBQ3JCO0FBQ0EsbUJBQVc7QUFBQSxNQUNmLFdBQ1MsUUFBUSxLQUFLQSxXQUFVLEtBQUssVUFBVSxRQUFRO0FBQ25ELFFBQUFEO0FBQ0EsbUJBQVc7QUFBQSxNQUNmLFdBQ1MsT0FBTyxHQUFHO0FBQ2YsUUFBQUE7QUFBQSxNQUNKLE9BQ0s7QUFDRDtBQUFBLE1BQ0o7QUFDQSxhQUFPLFNBQVMsV0FBVyxVQUFVLE1BQU1BLE9BQU0sRUFBRSxHQUFHLFFBQVEsR0FBRyxXQUFXLENBQUM7QUFBQSxJQUNqRjtBQUFBLEVBQ0o7QUFDQSxNQUFJLE9BQU8sS0FBSyxNQUFNLElBQUksUUFBUSxPQUFPLFFBQVEsRUFBRTtBQUVuRCxNQUFJLENBQUMsS0FBSyxPQUFPLGVBQWU7QUFDNUIsUUFBSSxRQUFRLFFBQVFDLFlBQVcsT0FBTyxLQUFLQSxXQUFVLFNBQVMsSUFBSSxJQUFJO0FBQ2xFLFVBQUksU0FBUyxLQUFLLFdBQVdBLFVBQVMsQ0FBQztBQUN2QyxVQUFJLE9BQU8sWUFBWTtBQUNuQixlQUFPLFNBQVMsT0FBTyxzQkFBc0IsR0FBRyxLQUFLO0FBQUEsSUFDN0Q7QUFDQSxRQUFJLFFBQVEsUUFBUUEsVUFBUyxTQUFTLElBQUksR0FBRztBQUN6QyxVQUFJLFFBQVEsS0FBSyxXQUFXQSxPQUFNO0FBQ2xDLFVBQUksTUFBTSxZQUFZO0FBQ2xCLGVBQU8sU0FBUyxNQUFNLHNCQUFzQixHQUFHLElBQUk7QUFBQSxJQUMzRDtBQUNBLFdBQU8sU0FBUyxLQUFLLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztBQUFBLEVBQzNEO0FBRUEsTUFBSSxRQUFRLFFBQVFBLFlBQVcsT0FBTyxLQUFLQSxXQUFVLFNBQVMsSUFBSSxJQUFJO0FBQ2xFLFFBQUksU0FBUyxLQUFLLFdBQVdBLFVBQVMsQ0FBQztBQUN2QyxRQUFJLFNBQVMsT0FBTyxZQUFZLElBQUksVUFBVSxRQUFRLFNBQVMsTUFBTSxLQUFLLG9CQUFvQixJQUFJLEVBQUUsSUFHOUYsT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZLFFBQVEsQ0FBQyxPQUFPLGVBQWUsU0FBUztBQUMxRixRQUFJO0FBQ0EsYUFBTyxTQUFTLFdBQVcsUUFBUSxDQUFDLEdBQUcsS0FBSztBQUFBLEVBQ3BEO0FBQ0EsTUFBSSxRQUFRLFFBQVFBLFVBQVMsU0FBUyxJQUFJLEdBQUc7QUFDekMsUUFBSSxRQUFRLEtBQUssV0FBV0EsT0FBTTtBQUNsQyxXQUFPLE1BQU0sY0FBYyxNQUFNLFdBQVc7QUFDeEMsY0FBUSxNQUFNO0FBQ2xCLFFBQUksU0FBUyxDQUFDLFFBQVEsT0FBTyxNQUFNLFlBQVksSUFBSSxVQUFVLE9BQU8sR0FBSSxvQkFBb0IsSUFBSSxDQUFFLElBQzVGLE1BQU0sWUFBWSxJQUFJLFFBQVE7QUFDcEMsUUFBSTtBQUNBLGFBQU8sU0FBUyxXQUFXLFFBQVEsRUFBRSxHQUFHLElBQUk7QUFBQSxFQUNwRDtBQUVBLFNBQU8sU0FBUyxXQUFXLEtBQUssWUFBWSxJQUFJLFVBQVUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBQzdGO0FBQ0EsU0FBUyxTQUFTLE1BQU1HLE9BQU07QUFDMUIsTUFBSSxLQUFLLFNBQVM7QUFDZCxXQUFPO0FBQ1gsTUFBSSxJQUFJQSxRQUFPLEtBQUssT0FBTyxLQUFLO0FBQ2hDLFNBQU8sRUFBRSxLQUFLLEtBQUssS0FBSyxRQUFRLEtBQUssUUFBUSxNQUFNLEdBQUcsT0FBTyxFQUFFO0FBQ25FO0FBQ0EsU0FBUyxTQUFTLE1BQU1ELE1BQUs7QUFDekIsTUFBSSxLQUFLLFVBQVU7QUFDZixXQUFPO0FBQ1gsTUFBSSxJQUFJQSxPQUFNLEtBQUssTUFBTSxLQUFLO0FBQzlCLFNBQU8sRUFBRSxLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNO0FBQ25FO0FBQ0EsU0FBUyxpQkFBaUIsTUFBTSxPQUFPLEdBQUc7QUFDdEMsTUFBSSxZQUFZLEtBQUssT0FBTyxTQUFTLEtBQUssS0FBSztBQUMvQyxNQUFJLGFBQWE7QUFDYixTQUFLLFlBQVksS0FBSztBQUMxQixNQUFJLFVBQVUsS0FBSztBQUNmLFNBQUssTUFBTTtBQUNmLE1BQUk7QUFDQSxXQUFPLEVBQUU7QUFBQSxFQUNiLFVBQ0E7QUFDSSxRQUFJLGFBQWE7QUFDYixXQUFLLFlBQVksU0FBUztBQUM5QixRQUFJLFVBQVUsS0FBSyxPQUFPO0FBQ3RCLGFBQU8sTUFBTTtBQUFBLEVBQ3JCO0FBQ0o7QUFHQSxTQUFTLHVCQUF1QixNQUFNLE9BQU8sS0FBSztBQUM5QyxNQUFJLE1BQU0sTUFBTTtBQUNoQixNQUFJLE9BQU8sT0FBTyxPQUFPLElBQUksUUFBUSxJQUFJO0FBQ3pDLFNBQU8saUJBQWlCLE1BQU0sT0FBTyxNQUFNO0FBQ3ZDLFFBQUksRUFBRSxNQUFNLElBQUksSUFBSSxLQUFLLFFBQVEsV0FBVyxLQUFLLEtBQUssT0FBTyxPQUFPLEtBQUssQ0FBQztBQUMxRSxlQUFTO0FBQ0wsVUFBSSxVQUFVLEtBQUssUUFBUSxZQUFZLEtBQUssSUFBSTtBQUNoRCxVQUFJLENBQUM7QUFDRDtBQUNKLFVBQUksUUFBUSxLQUFLLFNBQVM7QUFDdEIsY0FBTSxRQUFRLGNBQWMsUUFBUTtBQUNwQztBQUFBLE1BQ0o7QUFDQSxZQUFNLFFBQVEsSUFBSTtBQUFBLElBQ3RCO0FBQ0EsUUFBSSxTQUFTLFlBQVksTUFBTSxLQUFLLEtBQUssQ0FBQztBQUMxQyxhQUFTLFFBQVEsSUFBSSxZQUFZLE9BQU8sUUFBUSxNQUFNLGFBQWE7QUFDL0QsVUFBSTtBQUNKLFVBQUksTUFBTSxZQUFZO0FBQ2xCLGdCQUFRLE1BQU0sZUFBZTtBQUFBLGVBQ3hCLE1BQU0sWUFBWTtBQUN2QixnQkFBUSxVQUFVLE9BQU8sR0FBRyxNQUFNLFVBQVUsTUFBTSxFQUFFLGVBQWU7QUFBQTtBQUVuRTtBQUNKLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsWUFBSSxNQUFNLE1BQU0sQ0FBQztBQUNqQixZQUFJLElBQUksU0FBUyxJQUFJLE1BQU0sTUFDdEIsT0FBTyxPQUFPLE9BQU8sTUFBTSxJQUFJLE9BQU8sSUFBSSxTQUFTLE9BQU8sT0FBTyxJQUM1RCxJQUFJLFNBQVMsT0FBTyxVQUFVLE9BQU8sU0FBUyxJQUFJLE9BQU87QUFDL0QsaUJBQU87QUFBQSxNQUNmO0FBQUEsSUFDSjtBQUNBLFdBQU87QUFBQSxFQUNYLENBQUM7QUFDTDtBQUNBLElBQU0sV0FBVztBQUNqQixTQUFTLHlCQUF5QixNQUFNLE9BQU8sS0FBSztBQUNoRCxNQUFJLEVBQUUsTUFBTSxJQUFJLE1BQU07QUFDdEIsTUFBSSxDQUFDLE1BQU0sT0FBTztBQUNkLFdBQU87QUFDWCxNQUFJRixVQUFTLE1BQU0sY0FBYyxVQUFVLENBQUNBLFNBQVEsUUFBUUEsV0FBVSxNQUFNLE9BQU8sUUFBUTtBQUMzRixNQUFJLE1BQU0sS0FBSyxhQUFhO0FBRzVCLE1BQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxPQUFPLFdBQVcsS0FBSyxDQUFDLElBQUk7QUFDakQsV0FBTyxPQUFPLFVBQVUsT0FBTyxhQUFhLFVBQVU7QUFDMUQsU0FBTyxpQkFBaUIsTUFBTSxPQUFPLE1BQU07QUFNdkMsUUFBSSxFQUFFLFdBQVcsU0FBUyxhQUFhLFFBQVEsWUFBWSxhQUFhLElBQUksS0FBSyxrQkFBa0I7QUFDbkcsUUFBSSxlQUFlLElBQUk7QUFFdkIsUUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXO0FBQ25DLFFBQUksWUFBWSxNQUFNLFFBQVEsS0FBSyxRQUFRLFlBQVksTUFBTSxPQUFPLENBQUMsSUFBSSxLQUFLO0FBQzlFLFFBQUksRUFBRSxXQUFXSyxVQUFTLGFBQWEsT0FBTyxJQUFJLEtBQUssa0JBQWtCO0FBQ3pFLFFBQUksU0FBU0EsWUFBVyxDQUFDLFVBQVUsU0FBU0EsU0FBUSxZQUFZLElBQUlBLFdBQVVBLFNBQVEsVUFBVSxLQUMzRixXQUFXQSxZQUFXLFVBQVU7QUFFckMsUUFBSTtBQUNBLFVBQUksU0FBUyxZQUFZLFlBQVk7QUFDckMsVUFBSSxZQUFZLFdBQVcsY0FBYyxVQUFVLGlCQUFpQixJQUFJO0FBQ3BFLFlBQUksT0FBTyxTQUFTLE1BQU07QUFBQSxJQUNsQyxTQUNPLEdBQUc7QUFBQSxJQUFFO0FBQ1osUUFBSSxnQkFBZ0I7QUFDaEIsVUFBSSxpQkFBaUI7QUFDekIsV0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNMO0FBQ0EsSUFBSSxjQUFjO0FBQ2xCLElBQUksWUFBWTtBQUNoQixJQUFJLGVBQWU7QUFDbkIsU0FBUyxlQUFlLE1BQU0sT0FBTyxLQUFLO0FBQ3RDLE1BQUksZUFBZSxTQUFTLGFBQWE7QUFDckMsV0FBTztBQUNYLGdCQUFjO0FBQ2QsY0FBWTtBQUNaLFNBQU8sZUFBZSxPQUFPLFFBQVEsT0FBTyxTQUN0Qyx1QkFBdUIsTUFBTSxPQUFPLEdBQUcsSUFDdkMseUJBQXlCLE1BQU0sT0FBTyxHQUFHO0FBQ25EO0FBY0EsSUFBTSxZQUFZO0FBQWxCLElBQXFCLGNBQWM7QUFBbkMsSUFBc0MsZ0JBQWdCO0FBQXRELElBQXlELGFBQWE7QUFHdEUsSUFBTSxXQUFOLE1BQWU7QUFBQSxFQUNYLFlBQVksUUFBUSxVQUFVLEtBRzlCLFlBQVk7QUFDUixTQUFLLFNBQVM7QUFDZCxTQUFLLFdBQVc7QUFDaEIsU0FBSyxNQUFNO0FBQ1gsU0FBSyxhQUFhO0FBQ2xCLFNBQUssUUFBUTtBQUdiLFFBQUksYUFBYTtBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBLEVBR0EsY0FBYyxRQUFRO0FBQUUsV0FBTztBQUFBLEVBQU87QUFBQSxFQUN0QyxZQUFZLE1BQU07QUFBRSxXQUFPO0FBQUEsRUFBTztBQUFBLEVBQ2xDLFlBQVksTUFBTSxXQUFXLFdBQVc7QUFBRSxXQUFPO0FBQUEsRUFBTztBQUFBLEVBQ3hELFlBQVksVUFBVTtBQUFFLFdBQU87QUFBQSxFQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJdEMsWUFBWTtBQUFFLFdBQU87QUFBQSxFQUFNO0FBQUE7QUFBQTtBQUFBLEVBRzNCLFVBQVUsT0FBTztBQUFFLFdBQU87QUFBQSxFQUFPO0FBQUE7QUFBQSxFQUVqQyxJQUFJLE9BQU87QUFDUCxRQUFJLE9BQU87QUFDWCxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssU0FBUyxRQUFRO0FBQ3RDLGNBQVEsS0FBSyxTQUFTLENBQUMsRUFBRTtBQUM3QixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQSxFQUdBLElBQUksU0FBUztBQUFFLFdBQU87QUFBQSxFQUFHO0FBQUEsRUFDekIsVUFBVTtBQUNOLFNBQUssU0FBUztBQUNkLFFBQUksS0FBSyxJQUFJLGNBQWM7QUFDdkIsV0FBSyxJQUFJLGFBQWE7QUFDMUIsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFNBQVMsUUFBUTtBQUN0QyxXQUFLLFNBQVMsQ0FBQyxFQUFFLFFBQVE7QUFBQSxFQUNqQztBQUFBLEVBQ0EsZUFBZSxPQUFPO0FBQ2xCLGFBQVMsSUFBSSxHQUFHLE1BQU0sS0FBSyxjQUFhLEtBQUs7QUFDekMsVUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQ3pCLFVBQUksT0FBTztBQUNQLGVBQU87QUFDWCxhQUFPLElBQUk7QUFBQSxJQUNmO0FBQUEsRUFDSjtBQUFBLEVBQ0EsSUFBSSxZQUFZO0FBQ1osV0FBTyxLQUFLLE9BQU8sZUFBZSxJQUFJO0FBQUEsRUFDMUM7QUFBQSxFQUNBLElBQUksYUFBYTtBQUNiLFdBQU8sS0FBSyxTQUFTLEtBQUssT0FBTyxlQUFlLElBQUksSUFBSSxLQUFLLFNBQVM7QUFBQSxFQUMxRTtBQUFBLEVBQ0EsSUFBSSxXQUFXO0FBQ1gsV0FBTyxLQUFLLFlBQVksS0FBSztBQUFBLEVBQ2pDO0FBQUEsRUFDQSxJQUFJLFdBQVc7QUFDWCxXQUFPLEtBQUssYUFBYSxLQUFLLE9BQU8sSUFBSSxLQUFLO0FBQUEsRUFDbEQ7QUFBQSxFQUNBLGdCQUFnQixLQUFLTCxTQUFRLE1BQU07QUFHL0IsUUFBSSxLQUFLLGNBQWMsS0FBSyxXQUFXLFNBQVMsSUFBSSxZQUFZLElBQUksTUFBTSxJQUFJLFVBQVUsR0FBRztBQUN2RixVQUFJLE9BQU8sR0FBRztBQUNWLFlBQUksV0FBVztBQUNmLFlBQUksT0FBTyxLQUFLLFlBQVk7QUFDeEIsc0JBQVksSUFBSSxXQUFXQSxVQUFTLENBQUM7QUFBQSxRQUN6QyxPQUNLO0FBQ0QsaUJBQU8sSUFBSSxjQUFjLEtBQUs7QUFDMUIsa0JBQU0sSUFBSTtBQUNkLHNCQUFZLElBQUk7QUFBQSxRQUNwQjtBQUNBLGVBQU8sYUFBYSxHQUFHLE9BQU8sVUFBVSxlQUFlLEtBQUssVUFBVTtBQUNsRSxzQkFBWSxVQUFVO0FBQzFCLGVBQU8sWUFBWSxLQUFLLGVBQWUsSUFBSSxJQUFJLEtBQUssT0FBTyxLQUFLO0FBQUEsTUFDcEUsT0FDSztBQUNELFlBQUksVUFBVTtBQUNkLFlBQUksT0FBTyxLQUFLLFlBQVk7QUFDeEIscUJBQVcsSUFBSSxXQUFXQSxPQUFNO0FBQUEsUUFDcEMsT0FDSztBQUNELGlCQUFPLElBQUksY0FBYyxLQUFLO0FBQzFCLGtCQUFNLElBQUk7QUFDZCxxQkFBVyxJQUFJO0FBQUEsUUFDbkI7QUFDQSxlQUFPLFlBQVksR0FBRyxPQUFPLFNBQVMsZUFBZSxLQUFLLFVBQVU7QUFDaEUscUJBQVcsU0FBUztBQUN4QixlQUFPLFdBQVcsS0FBSyxlQUFlLElBQUksSUFBSSxLQUFLO0FBQUEsTUFDdkQ7QUFBQSxJQUNKO0FBSUEsUUFBSTtBQUNKLFFBQUksT0FBTyxLQUFLLE9BQU8sS0FBSyxZQUFZO0FBQ3BDLGNBQVFBLFVBQVMsU0FBUyxLQUFLLFVBQVU7QUFBQSxJQUM3QyxXQUNTLEtBQUssY0FBYyxLQUFLLGNBQWMsS0FBSyxPQUFPLEtBQUssSUFBSSxTQUFTLEtBQUssVUFBVSxHQUFHO0FBQzNGLGNBQVEsSUFBSSx3QkFBd0IsS0FBSyxVQUFVLElBQUk7QUFBQSxJQUMzRCxXQUNTLEtBQUssSUFBSSxZQUFZO0FBQzFCLFVBQUlBLFdBQVU7QUFDVixpQkFBUyxTQUFTLE9BQU0sU0FBUyxPQUFPLFlBQVk7QUFDaEQsY0FBSSxVQUFVLEtBQUssS0FBSztBQUNwQixvQkFBUTtBQUNSO0FBQUEsVUFDSjtBQUNBLGNBQUksT0FBTztBQUNQO0FBQUEsUUFDUjtBQUNKLFVBQUksU0FBUyxRQUFRQSxXQUFVLElBQUksV0FBVztBQUMxQyxpQkFBUyxTQUFTLE9BQU0sU0FBUyxPQUFPLFlBQVk7QUFDaEQsY0FBSSxVQUFVLEtBQUssS0FBSztBQUNwQixvQkFBUTtBQUNSO0FBQUEsVUFDSjtBQUNBLGNBQUksT0FBTztBQUNQO0FBQUEsUUFDUjtBQUFBLElBQ1I7QUFDQSxZQUFRLFNBQVMsT0FBTyxPQUFPLElBQUksU0FBUyxLQUFLLFdBQVcsS0FBSztBQUFBLEVBQ3JFO0FBQUEsRUFDQSxZQUFZLEtBQUssWUFBWSxPQUFPO0FBQ2hDLGFBQVNJLFNBQVEsTUFBTSxNQUFNLEtBQUssS0FBSyxNQUFNLElBQUksWUFBWTtBQUN6RCxVQUFJLE9BQU8sS0FBSyxRQUFRLEdBQUcsR0FBRztBQUM5QixVQUFJLFNBQVMsQ0FBQyxhQUFhLEtBQUssT0FBTztBQUVuQyxZQUFJQSxXQUFVLFVBQVUsS0FBSyxZQUN6QixFQUFFLFFBQVEsWUFBWSxJQUFJLFFBQVEsU0FBUyxJQUFJLFlBQVksSUFBSSxNQUFNLElBQUksVUFBVSxJQUFJLFdBQVc7QUFDbEcsVUFBQUEsU0FBUTtBQUFBO0FBRVIsaUJBQU87QUFBQSxNQUNmO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUNBLFFBQVEsS0FBSztBQUNULFFBQUksT0FBTyxJQUFJO0FBQ2YsYUFBUyxNQUFNLE1BQU0sS0FBSyxNQUFNLElBQUk7QUFDaEMsVUFBSSxPQUFPO0FBQ1AsZUFBTztBQUFBLEVBQ25CO0FBQUEsRUFDQSxXQUFXLEtBQUtKLFNBQVEsTUFBTTtBQUMxQixhQUFTLE9BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxZQUFZO0FBQy9DLFVBQUksT0FBTyxLQUFLLFFBQVEsSUFBSTtBQUM1QixVQUFJO0FBQ0EsZUFBTyxLQUFLLGdCQUFnQixLQUFLQSxTQUFRLElBQUk7QUFBQSxJQUNyRDtBQUNBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBLEVBR0EsT0FBTyxLQUFLO0FBQ1IsYUFBUyxJQUFJLEdBQUdBLFVBQVMsR0FBRyxJQUFJLEtBQUssU0FBUyxRQUFRLEtBQUs7QUFDdkQsVUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLEdBQUdNLE9BQU1OLFVBQVMsTUFBTTtBQUNuRCxVQUFJQSxXQUFVLE9BQU9NLFFBQU9OLFNBQVE7QUFDaEMsZUFBTyxDQUFDLE1BQU0sVUFBVSxNQUFNLFNBQVM7QUFDbkMsa0JBQVEsTUFBTSxTQUFTLENBQUM7QUFDNUIsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLE1BQU1NO0FBQ04sZUFBTyxNQUFNLE9BQU8sTUFBTU4sVUFBUyxNQUFNLE1BQU07QUFDbkQsTUFBQUEsVUFBU007QUFBQSxJQUNiO0FBQUEsRUFDSjtBQUFBLEVBQ0EsV0FBVyxLQUFLLE1BQU07QUFDbEIsUUFBSSxDQUFDLEtBQUs7QUFDTixhQUFPLEVBQUUsTUFBTSxLQUFLLEtBQUssUUFBUSxHQUFHLE1BQU0sTUFBTSxFQUFFO0FBRXRELFFBQUksSUFBSSxHQUFHTixVQUFTO0FBQ3BCLGFBQVMsU0FBUyxHQUFHLElBQUksS0FBSyxTQUFTLFFBQVEsS0FBSztBQUNoRCxVQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsR0FBR00sT0FBTSxTQUFTLE1BQU07QUFDbkQsVUFBSUEsT0FBTSxPQUFPLGlCQUFpQixzQkFBc0I7QUFDcEQsUUFBQU4sVUFBUyxNQUFNO0FBQ2Y7QUFBQSxNQUNKO0FBQ0EsZUFBU007QUFBQSxJQUNiO0FBRUEsUUFBSU47QUFDQSxhQUFPLEtBQUssU0FBUyxDQUFDLEVBQUUsV0FBV0EsVUFBUyxLQUFLLFNBQVMsQ0FBQyxFQUFFLFFBQVEsSUFBSTtBQUU3RSxhQUFTLE1BQU0sS0FBSyxFQUFFLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLFFBQVEsZ0JBQWdCLGtCQUFrQixLQUFLLFFBQVEsR0FBRyxLQUFLO0FBQUEsSUFBRTtBQUVwSCxRQUFJLFFBQVEsR0FBRztBQUNYLFVBQUksTUFBTU8sU0FBUTtBQUNsQixlQUFRLEtBQUtBLFNBQVEsT0FBTztBQUN4QixlQUFPLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJO0FBQ2xDLFlBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxjQUFjLEtBQUs7QUFDckM7QUFBQSxNQUNSO0FBQ0EsVUFBSSxRQUFRLFFBQVFBLFVBQVMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLO0FBQy9DLGVBQU8sS0FBSyxXQUFXLEtBQUssTUFBTSxJQUFJO0FBQzFDLGFBQU8sRUFBRSxNQUFNLEtBQUssWUFBWSxRQUFRLE9BQU8sU0FBUyxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFBQSxJQUM5RSxPQUNLO0FBQ0QsVUFBSSxNQUFNQSxTQUFRO0FBQ2xCLGVBQVEsS0FBS0EsU0FBUSxPQUFPO0FBQ3hCLGVBQU8sSUFBSSxLQUFLLFNBQVMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJO0FBQ3JELFlBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxjQUFjLEtBQUs7QUFDckM7QUFBQSxNQUNSO0FBQ0EsVUFBSSxRQUFRQSxVQUFTLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBSztBQUN2QyxlQUFPLEtBQUssV0FBVyxHQUFHLElBQUk7QUFDbEMsYUFBTyxFQUFFLE1BQU0sS0FBSyxZQUFZLFFBQVEsT0FBTyxTQUFTLEtBQUssR0FBRyxJQUFJLEtBQUssV0FBVyxXQUFXLE9BQU87QUFBQSxJQUMxRztBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUEsRUFHQSxXQUFXUixPQUFNLElBQUlTLFFBQU8sR0FBRztBQUMzQixRQUFJLEtBQUssU0FBUyxVQUFVO0FBQ3hCLGFBQU8sRUFBRSxNQUFNLEtBQUssWUFBWSxNQUFBVCxPQUFNLElBQUksWUFBWSxHQUFHLFVBQVUsS0FBSyxXQUFXLFdBQVcsT0FBTztBQUN6RyxRQUFJLGFBQWEsSUFBSSxXQUFXO0FBQ2hDLGFBQVNDLFVBQVNRLE9BQU0sSUFBSSxLQUFJLEtBQUs7QUFDakMsVUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLEdBQUdGLE9BQU1OLFVBQVMsTUFBTTtBQUNuRCxVQUFJLGNBQWMsTUFBTUQsU0FBUU8sTUFBSztBQUNqQyxZQUFJLFlBQVlOLFVBQVMsTUFBTTtBQUUvQixZQUFJRCxTQUFRLGFBQWEsTUFBTU8sT0FBTSxNQUFNLFVBQVUsTUFBTSxRQUN2RCxNQUFNLGNBQWMsS0FBSyxXQUFXLFNBQVMsTUFBTSxVQUFVO0FBQzdELGlCQUFPLE1BQU0sV0FBV1AsT0FBTSxJQUFJLFNBQVM7QUFDL0MsUUFBQUEsUUFBT0M7QUFDUCxpQkFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDeEIsY0FBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUM7QUFDOUIsY0FBSSxLQUFLLFFBQVEsS0FBSyxJQUFJLGNBQWMsS0FBSyxjQUFjLENBQUMsS0FBSyxhQUFhLENBQUMsR0FBRztBQUM5RSx5QkFBYSxTQUFTLEtBQUssR0FBRyxJQUFJO0FBQ2xDO0FBQUEsVUFDSjtBQUNBLFVBQUFELFNBQVEsS0FBSztBQUFBLFFBQ2pCO0FBQ0EsWUFBSSxjQUFjO0FBQ2QsdUJBQWE7QUFBQSxNQUNyQjtBQUNBLFVBQUksYUFBYSxPQUFPTyxPQUFNLE1BQU0sS0FBSyxLQUFLLFNBQVMsU0FBUyxJQUFJO0FBQ2hFLGFBQUtBO0FBQ0wsaUJBQVMsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLFNBQVMsUUFBUSxLQUFLO0FBQy9DLGNBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQztBQUMxQixjQUFJLEtBQUssUUFBUSxLQUFLLElBQUksY0FBYyxLQUFLLGNBQWMsQ0FBQyxLQUFLLGFBQWEsRUFBRSxHQUFHO0FBQy9FLHVCQUFXLFNBQVMsS0FBSyxHQUFHO0FBQzVCO0FBQUEsVUFDSjtBQUNBLGdCQUFNLEtBQUs7QUFBQSxRQUNmO0FBQ0EsWUFBSSxZQUFZO0FBQ1oscUJBQVcsS0FBSyxXQUFXLFdBQVc7QUFDMUM7QUFBQSxNQUNKO0FBQ0EsTUFBQU4sVUFBU007QUFBQSxJQUNiO0FBQ0EsV0FBTyxFQUFFLE1BQU0sS0FBSyxZQUFZLE1BQUFQLE9BQU0sSUFBSSxZQUFZLFNBQVM7QUFBQSxFQUNuRTtBQUFBLEVBQ0EsYUFBYSxNQUFNO0FBQ2YsUUFBSSxLQUFLLFVBQVUsQ0FBQyxLQUFLLGNBQWMsQ0FBQyxLQUFLLFNBQVM7QUFDbEQsYUFBTztBQUNYLFFBQUksUUFBUSxLQUFLLFNBQVMsT0FBTyxJQUFJLElBQUksS0FBSyxTQUFTLFNBQVMsQ0FBQztBQUNqRSxXQUFPLE1BQU0sUUFBUSxLQUFLLE1BQU0sYUFBYSxJQUFJO0FBQUEsRUFDckQ7QUFBQSxFQUNBLFlBQVksS0FBSztBQUNiLFFBQUksRUFBRSxNQUFNLFFBQUFDLFFBQU8sSUFBSSxLQUFLLFdBQVcsS0FBSyxDQUFDO0FBQzdDLFFBQUksS0FBSyxZQUFZLEtBQUtBLFdBQVUsS0FBSyxXQUFXO0FBQ2hELFlBQU0sSUFBSSxXQUFXLHVCQUF1QixHQUFHO0FBQ25ELFdBQU8sS0FBSyxXQUFXQSxPQUFNO0FBQUEsRUFDakM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxhQUFhLFFBQVEsTUFBTSxNQUFNLFFBQVEsT0FBTztBQUU1QyxRQUFJRCxRQUFPLEtBQUssSUFBSSxRQUFRLElBQUksR0FBRyxLQUFLLEtBQUssSUFBSSxRQUFRLElBQUk7QUFDN0QsYUFBUyxJQUFJLEdBQUdDLFVBQVMsR0FBRyxJQUFJLEtBQUssU0FBUyxRQUFRLEtBQUs7QUFDdkQsVUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLEdBQUdNLE9BQU1OLFVBQVMsTUFBTTtBQUNuRCxVQUFJRCxRQUFPQyxXQUFVLEtBQUtNO0FBQ3RCLGVBQU8sTUFBTSxhQUFhLFNBQVNOLFVBQVMsTUFBTSxRQUFRLE9BQU9BLFVBQVMsTUFBTSxRQUFRLE1BQU0sS0FBSztBQUN2RyxNQUFBQSxVQUFTTTtBQUFBLElBQ2I7QUFDQSxRQUFJLFlBQVksS0FBSyxXQUFXLFFBQVEsU0FBUyxLQUFLLENBQUM7QUFDdkQsUUFBSSxVQUFVLFFBQVEsU0FBUyxZQUFZLEtBQUssV0FBVyxNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQzlFLFFBQUksU0FBUyxLQUFLLGFBQWE7QUFDL0IsUUFBSSxXQUFXO0FBS2YsU0FBSyxTQUFTLFdBQVcsVUFBVSxNQUFNO0FBQ3JDLFVBQUksRUFBRSxNQUFNLFFBQUFOLFFBQU8sSUFBSTtBQUN2QixVQUFJLEtBQUssWUFBWSxHQUFHO0FBQ3BCLG1CQUFXLENBQUMsRUFBRUEsV0FBVSxLQUFLLFVBQVVBLFVBQVMsQ0FBQyxLQUFLO0FBRXRELFlBQUksWUFBWUEsV0FBVSxLQUFLLFVBQVUsUUFBUTtBQUM3QyxtQkFBUyxPQUFPLE1BQU0sT0FBTyxNQUFNLE9BQU8sS0FBSyxZQUFZO0FBQ3ZELGdCQUFJLFFBQVEsS0FBSyxhQUFhO0FBQzFCLGtCQUFJLE1BQU0sWUFBWTtBQUNsQiw0QkFBWSxVQUFVLEVBQUUsTUFBTSxNQUFNLFlBQVksUUFBUSxTQUFTLEtBQUssSUFBSSxFQUFFO0FBQ2hGO0FBQUEsWUFDSjtBQUNBLGdCQUFJLE9BQU8sS0FBSztBQUNoQixnQkFBSSxRQUFRLEtBQUssUUFBUSxLQUFLLEtBQUs7QUFDL0I7QUFBQSxVQUNSO0FBQUEsUUFDSjtBQUFBLE1BQ0osT0FDSztBQUNELFlBQUksT0FBTyxLQUFLLFdBQVdBLFVBQVMsQ0FBQztBQUNyQyxtQkFBVyxTQUFTLEtBQUssWUFBWSxRQUFRLEtBQUssbUJBQW1CO0FBQUEsTUFDekU7QUFBQSxJQUNKO0FBR0EsUUFBSSxTQUFTLE9BQU8sYUFBYSxPQUFPLGFBQWEsUUFBUSxRQUFRLE9BQU8sVUFBVSxZQUFZLEdBQUc7QUFDakcsVUFBSSxRQUFRLE9BQU8sVUFBVSxXQUFXLE9BQU8sV0FBVztBQUMxRCxVQUFJLFNBQVMsTUFBTSxtQkFBbUI7QUFDbEMsZ0JBQVE7QUFBQSxJQUNoQjtBQUNBLFFBQUksRUFBRSxTQUFTLFlBQVksV0FDdkIscUJBQXFCLFVBQVUsTUFBTSxVQUFVLFFBQVEsT0FBTyxZQUFZLE9BQU8sWUFBWSxLQUM3RixxQkFBcUIsUUFBUSxNQUFNLFFBQVEsUUFBUSxPQUFPLFdBQVcsT0FBTyxXQUFXO0FBQ3ZGO0FBSUosUUFBSSxpQkFBaUI7QUFDckIsU0FBSyxPQUFPLFVBQVUsVUFBVSxTQUFTLENBQUMsVUFBVTtBQUNoRCxhQUFPLFNBQVMsVUFBVSxNQUFNLFVBQVUsTUFBTTtBQUNoRCxVQUFJO0FBQ0EsWUFBSSxVQUFVO0FBQ1YsaUJBQU8sT0FBTyxRQUFRLE1BQU0sUUFBUSxNQUFNO0FBQzlDLHlCQUFpQjtBQUFBLE1BQ3JCLFNBQ08sR0FBRztBQUFBLE1BT1Y7QUFBQSxJQUNKO0FBQ0EsUUFBSSxDQUFDLGdCQUFnQjtBQUNqQixVQUFJLFNBQVMsTUFBTTtBQUNmLFlBQUksTUFBTTtBQUNWLG9CQUFZO0FBQ1osa0JBQVU7QUFBQSxNQUNkO0FBQ0EsVUFBSSxRQUFRLFNBQVMsWUFBWTtBQUNqQyxZQUFNLE9BQU8sUUFBUSxNQUFNLFFBQVEsTUFBTTtBQUN6QyxZQUFNLFNBQVMsVUFBVSxNQUFNLFVBQVUsTUFBTTtBQUMvQyxhQUFPLGdCQUFnQjtBQUN2QixhQUFPLFNBQVMsS0FBSztBQUFBLElBQ3pCO0FBQUEsRUFDSjtBQUFBLEVBQ0EsZUFBZSxVQUFVO0FBQ3JCLFdBQU8sQ0FBQyxLQUFLLGNBQWMsU0FBUyxRQUFRO0FBQUEsRUFDaEQ7QUFBQSxFQUNBLElBQUksY0FBYztBQUNkLFdBQU8sS0FBSyxjQUFjLEtBQUssY0FBYyxLQUFLLE9BQU8sQ0FBQyxLQUFLLElBQUksU0FBUyxLQUFLLFVBQVU7QUFBQSxFQUMvRjtBQUFBO0FBQUE7QUFBQSxFQUdBLFVBQVVELE9BQU0sSUFBSTtBQUNoQixhQUFTQyxVQUFTLEdBQUcsSUFBSSxHQUFHLElBQUksS0FBSyxTQUFTLFFBQVEsS0FBSztBQUN2RCxVQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsR0FBR00sT0FBTU4sVUFBUyxNQUFNO0FBQ25ELFVBQUlBLFdBQVVNLE9BQU1QLFNBQVFPLFFBQU8sTUFBTU4sVUFBU0QsUUFBT08sUUFBTyxLQUFLTixTQUFRO0FBQ3pFLFlBQUksY0FBY0EsVUFBUyxNQUFNLFFBQVEsWUFBWU0sT0FBTSxNQUFNO0FBQ2pFLFlBQUlQLFNBQVEsZUFBZSxNQUFNLFdBQVc7QUFDeEMsZUFBSyxRQUFRQSxTQUFRQyxXQUFVLE1BQU1NLE9BQU0sZ0JBQWdCO0FBQzNELGNBQUlQLFNBQVEsZUFBZSxNQUFNLGNBQzVCLE1BQU0sZUFBZSxNQUFNLElBQUksY0FBYyxLQUFLO0FBQ25ELGtCQUFNLFFBQVE7QUFBQTtBQUVkLGtCQUFNLFVBQVVBLFFBQU8sYUFBYSxLQUFLLFdBQVc7QUFDeEQ7QUFBQSxRQUNKLE9BQ0s7QUFDRCxnQkFBTSxRQUFRLE1BQU0sT0FBTyxNQUFNLGNBQWMsTUFBTSxJQUFJLGNBQWMsS0FBSyxjQUFjLENBQUMsTUFBTSxTQUFTLFNBQ3BHLGdCQUFnQjtBQUFBLFFBQzFCO0FBQUEsTUFDSjtBQUNBLE1BQUFDLFVBQVNNO0FBQUEsSUFDYjtBQUNBLFNBQUssUUFBUTtBQUFBLEVBQ2pCO0FBQUEsRUFDQSxtQkFBbUI7QUFDZixRQUFJLFFBQVE7QUFDWixhQUFTLE9BQU8sS0FBSyxRQUFRLE1BQU0sT0FBTyxLQUFLLFFBQVEsU0FBUztBQUM1RCxVQUFJLFFBQVEsU0FBUyxJQUFJLGdCQUFnQjtBQUN6QyxVQUFJLEtBQUssUUFBUTtBQUNiLGFBQUssUUFBUTtBQUFBLElBQ3JCO0FBQUEsRUFDSjtBQUFBLEVBQ0EsSUFBSSxVQUFVO0FBQUUsV0FBTztBQUFBLEVBQU87QUFBQSxFQUM5QixJQUFJLGtCQUFrQjtBQUFFLFdBQU87QUFBQSxFQUFPO0FBQzFDO0FBR0EsSUFBTSxpQkFBTixjQUE2QixTQUFTO0FBQUEsRUFDbEMsWUFBWSxRQUFRLFFBQVEsTUFBTSxLQUFLO0FBQ25DLFFBQUlHLE9BQU0sTUFBTSxPQUFPLEtBQUs7QUFDNUIsUUFBSSxPQUFPLE9BQU87QUFDZCxZQUFNLElBQUksTUFBTSxNQUFNO0FBQ2xCLFlBQUksQ0FBQ0E7QUFDRCxpQkFBTztBQUNYLFlBQUlBLE1BQUs7QUFDTCxpQkFBT0EsTUFBSyxPQUFPLGVBQWVBLEtBQUk7QUFBQSxNQUM5QyxDQUFDO0FBQ0wsUUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEtBQUs7QUFDdkIsVUFBSSxJQUFJLFlBQVksR0FBRztBQUNuQixZQUFJQyxRQUFPLFNBQVMsY0FBYyxNQUFNO0FBQ3hDLFFBQUFBLE1BQUssWUFBWSxHQUFHO0FBQ3BCLGNBQU1BO0FBQUEsTUFDVjtBQUNBLFVBQUksa0JBQWtCO0FBQ3RCLFVBQUksVUFBVSxJQUFJLG9CQUFvQjtBQUFBLElBQzFDO0FBQ0EsVUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLElBQUk7QUFDM0IsU0FBSyxTQUFTO0FBQ2QsU0FBSyxTQUFTO0FBQ2QsSUFBQUQsUUFBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLGNBQWMsUUFBUTtBQUNsQixXQUFPLEtBQUssU0FBUyxhQUFhLE9BQU8sS0FBSyxHQUFHLEtBQUssT0FBTyxJQUFJO0FBQUEsRUFDckU7QUFBQSxFQUNBLFlBQVk7QUFBRSxXQUFPLEVBQUUsUUFBUSxLQUFLO0FBQUEsRUFBRztBQUFBLEVBQ3ZDLFVBQVUsT0FBTztBQUNiLFFBQUksT0FBTyxLQUFLLE9BQU8sS0FBSztBQUM1QixXQUFPLE9BQU8sS0FBSyxLQUFLLElBQUk7QUFBQSxFQUNoQztBQUFBLEVBQ0EsZUFBZSxVQUFVO0FBQ3JCLFdBQU8sU0FBUyxRQUFRLGVBQWUsS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUM1RDtBQUFBLEVBQ0EsVUFBVTtBQUNOLFNBQUssT0FBTyxLQUFLLFFBQVEsS0FBSyxHQUFHO0FBQ2pDLFVBQU0sUUFBUTtBQUFBLEVBQ2xCO0FBQUEsRUFDQSxJQUFJLFVBQVU7QUFBRSxXQUFPO0FBQUEsRUFBTTtBQUFBLEVBQzdCLElBQUksT0FBTztBQUFFLFdBQU8sS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUFNO0FBQy9DO0FBQ0EsSUFBTSxzQkFBTixjQUFrQyxTQUFTO0FBQUEsRUFDdkMsWUFBWSxRQUFRLEtBQUssU0FBUyxNQUFNO0FBQ3BDLFVBQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxJQUFJO0FBQzNCLFNBQUssVUFBVTtBQUNmLFNBQUssT0FBTztBQUFBLEVBQ2hCO0FBQUEsRUFDQSxJQUFJLE9BQU87QUFBRSxXQUFPLEtBQUssS0FBSztBQUFBLEVBQVE7QUFBQSxFQUN0QyxnQkFBZ0IsS0FBS1QsU0FBUTtBQUN6QixRQUFJLE9BQU8sS0FBSztBQUNaLGFBQU8sS0FBSyxjQUFjQSxVQUFTLEtBQUssT0FBTztBQUNuRCxXQUFPLEtBQUssYUFBYUE7QUFBQSxFQUM3QjtBQUFBLEVBQ0EsV0FBVyxLQUFLO0FBQ1osV0FBTyxFQUFFLE1BQU0sS0FBSyxTQUFTLFFBQVEsSUFBSTtBQUFBLEVBQzdDO0FBQUEsRUFDQSxlQUFlLEtBQUs7QUFDaEIsV0FBTyxJQUFJLFNBQVMsbUJBQW1CLElBQUksT0FBTyxhQUFhLElBQUk7QUFBQSxFQUN2RTtBQUNKO0FBTUEsSUFBTSxlQUFOLE1BQU0sc0JBQXFCLFNBQVM7QUFBQSxFQUNoQyxZQUFZLFFBQVEsTUFBTSxLQUFLLFlBQVk7QUFDdkMsVUFBTSxRQUFRLENBQUMsR0FBRyxLQUFLLFVBQVU7QUFDakMsU0FBSyxPQUFPO0FBQUEsRUFDaEI7QUFBQSxFQUNBLE9BQU8sT0FBTyxRQUFRLE1BQU0sUUFBUSxNQUFNO0FBQ3RDLFFBQUksU0FBUyxLQUFLLFVBQVUsS0FBSyxLQUFLLElBQUk7QUFDMUMsUUFBSSxPQUFPLFVBQVUsT0FBTyxNQUFNLE1BQU0sTUFBTTtBQUM5QyxRQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7QUFDZixhQUFPLGNBQWMsV0FBVyxVQUFVLEtBQUssS0FBSyxLQUFLLE1BQU0sTUFBTSxNQUFNLENBQUM7QUFDaEYsV0FBTyxJQUFJLGNBQWEsUUFBUSxNQUFNLEtBQUssS0FBSyxLQUFLLGNBQWMsS0FBSyxHQUFHO0FBQUEsRUFDL0U7QUFBQSxFQUNBLFlBQVk7QUFDUixRQUFLLEtBQUssUUFBUSxjQUFlLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDakQsYUFBTztBQUNYLFdBQU8sRUFBRSxNQUFNLEtBQUssS0FBSyxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxXQUFXO0FBQUEsRUFDaEc7QUFBQSxFQUNBLFlBQVksTUFBTTtBQUFFLFdBQU8sS0FBSyxTQUFTLGNBQWMsS0FBSyxLQUFLLEdBQUcsSUFBSTtBQUFBLEVBQUc7QUFBQSxFQUMzRSxVQUFVRCxPQUFNLElBQUk7QUFDaEIsVUFBTSxVQUFVQSxPQUFNLEVBQUU7QUFFeEIsUUFBSSxLQUFLLFNBQVMsV0FBVztBQUN6QixVQUFJLFNBQVMsS0FBSztBQUNsQixhQUFPLENBQUMsT0FBTztBQUNYLGlCQUFTLE9BQU87QUFDcEIsVUFBSSxPQUFPLFFBQVEsS0FBSztBQUNwQixlQUFPLFFBQVEsS0FBSztBQUN4QixXQUFLLFFBQVE7QUFBQSxJQUNqQjtBQUFBLEVBQ0o7QUFBQSxFQUNBLE1BQU1BLE9BQU0sSUFBSSxNQUFNO0FBQ2xCLFFBQUlZLFFBQU8sY0FBYSxPQUFPLEtBQUssUUFBUSxLQUFLLE1BQU0sTUFBTSxJQUFJO0FBQ2pFLFFBQUksUUFBUSxLQUFLLFVBQVUsT0FBTyxLQUFLO0FBQ3ZDLFFBQUksS0FBSztBQUNMLGNBQVEsYUFBYSxPQUFPLElBQUksTUFBTSxJQUFJO0FBQzlDLFFBQUlaLFFBQU87QUFDUCxjQUFRLGFBQWEsT0FBTyxHQUFHQSxPQUFNLElBQUk7QUFDN0MsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVE7QUFDOUIsWUFBTSxDQUFDLEVBQUUsU0FBU1k7QUFDdEIsSUFBQUEsTUFBSyxXQUFXO0FBQ2hCLFdBQU9BO0FBQUEsRUFDWDtBQUNKO0FBSUEsSUFBTSxlQUFOLE1BQU0sc0JBQXFCLFNBQVM7QUFBQSxFQUNoQyxZQUFZLFFBQVEsTUFBTSxXQUFXLFdBQVcsS0FBSyxZQUFZLFNBQVMsTUFBTSxLQUFLO0FBQ2pGLFVBQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxVQUFVO0FBQ2pDLFNBQUssT0FBTztBQUNaLFNBQUssWUFBWTtBQUNqQixTQUFLLFlBQVk7QUFDakIsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLE9BQU8sT0FBTyxRQUFRLE1BQU0sV0FBVyxXQUFXLE1BQU0sS0FBSztBQUN6RCxRQUFJLFNBQVMsS0FBSyxVQUFVLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFDN0MsUUFBSSxPQUFPLFVBQVUsT0FBTyxNQUFNLE1BQU0sTUFBTTtBQUcxQyxVQUFJLENBQUM7QUFDRCxlQUFPO0FBQ1gsVUFBSSxRQUFRO0FBQ1IsZUFBTyxRQUFRLE9BQU8sZUFBZSxPQUFPO0FBQUEsSUFDcEQsR0FBRyxXQUFXLFNBQVM7QUFDdkIsUUFBSSxNQUFNLFFBQVEsS0FBSyxLQUFLLGFBQWEsUUFBUSxLQUFLO0FBQ3RELFFBQUksS0FBSyxRQUFRO0FBQ2IsVUFBSSxDQUFDO0FBQ0QsY0FBTSxTQUFTLGVBQWUsS0FBSyxJQUFJO0FBQUEsZUFDbEMsSUFBSSxZQUFZO0FBQ3JCLGNBQU0sSUFBSSxXQUFXLDBDQUEwQztBQUFBLElBQ3ZFLFdBQ1MsQ0FBQyxLQUFLO0FBQ1gsT0FBQyxFQUFFLEtBQUssV0FBVyxJQUFJLGNBQWMsV0FBVyxVQUFVLEtBQUssS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsSUFDeEY7QUFDQSxRQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssVUFBVSxJQUFJLFlBQVksTUFBTTtBQUNyRCxVQUFJLENBQUMsSUFBSSxhQUFhLGlCQUFpQjtBQUNuQyxZQUFJLGtCQUFrQjtBQUMxQixVQUFJLEtBQUssS0FBSyxLQUFLO0FBQ2YsWUFBSSxZQUFZO0FBQUEsSUFDeEI7QUFDQSxRQUFJLFVBQVU7QUFDZCxVQUFNLGVBQWUsS0FBSyxXQUFXLElBQUk7QUFDekMsUUFBSTtBQUNBLGFBQU8sVUFBVSxJQUFJLG1CQUFtQixRQUFRLE1BQU0sV0FBVyxXQUFXLEtBQUssY0FBYyxNQUFNLFNBQVMsTUFBTSxNQUFNLE1BQU0sQ0FBQztBQUFBLGFBQzVILEtBQUs7QUFDVixhQUFPLElBQUksYUFBYSxRQUFRLE1BQU0sV0FBVyxXQUFXLEtBQUssU0FBUyxJQUFJO0FBQUE7QUFFOUUsYUFBTyxJQUFJLGNBQWEsUUFBUSxNQUFNLFdBQVcsV0FBVyxLQUFLLGNBQWMsTUFBTSxTQUFTLE1BQU0sTUFBTSxDQUFDO0FBQUEsRUFDbkg7QUFBQSxFQUNBLFlBQVk7QUFFUixRQUFJLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDcEIsYUFBTztBQUtYLFFBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNO0FBQy9ELFFBQUksS0FBSyxLQUFLLEtBQUssY0FBYztBQUM3QixXQUFLLHFCQUFxQjtBQUM5QixRQUFJLENBQUMsS0FBSyxZQUFZO0FBQ2xCLFdBQUssYUFBYSxNQUFNLEtBQUssS0FBSztBQUFBLElBQ3RDLFdBQ1MsQ0FBQyxLQUFLLGFBQWE7QUFDeEIsV0FBSyxpQkFBaUIsS0FBSztBQUFBLElBQy9CLE9BQ0s7QUFJRCxlQUFTLElBQUksS0FBSyxTQUFTLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUNoRCxZQUFJLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDM0IsWUFBSSxLQUFLLElBQUksU0FBUyxNQUFNLElBQUksVUFBVSxHQUFHO0FBQ3pDLGVBQUssaUJBQWlCLE1BQU0sSUFBSTtBQUNoQztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsVUFBSSxDQUFDLEtBQUs7QUFDTixhQUFLLGFBQWEsTUFBTSxTQUFTO0FBQUEsSUFDekM7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsWUFBWSxNQUFNLFdBQVcsV0FBVztBQUNwQyxXQUFPLEtBQUssU0FBUyxhQUFhLEtBQUssR0FBRyxLQUFLLElBQUksS0FDL0MsY0FBYyxXQUFXLEtBQUssU0FBUyxLQUFLLFVBQVUsR0FBRyxLQUFLLFNBQVM7QUFBQSxFQUMvRTtBQUFBLEVBQ0EsSUFBSSxPQUFPO0FBQUUsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUFVO0FBQUEsRUFDeEMsSUFBSSxTQUFTO0FBQUUsV0FBTyxLQUFLLEtBQUssU0FBUyxJQUFJO0FBQUEsRUFBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLaEQsZUFBZSxNQUFNLEtBQUs7QUFDdEIsUUFBSSxTQUFTLEtBQUssS0FBSyxlQUFlLE1BQU07QUFDNUMsUUFBSSxjQUFjLEtBQUssWUFBWSxLQUFLLHFCQUFxQixNQUFNLEdBQUcsSUFBSTtBQUMxRSxRQUFJLG1CQUFtQixlQUFlLFlBQVksTUFBTSxLQUFLLGNBQWM7QUFDM0UsUUFBSSxxQkFBcUIsZUFBZSxZQUFZLE1BQU07QUFDMUQsUUFBSSxVQUFVLElBQUksZ0JBQWdCLE1BQU0sb0JBQW9CLGlCQUFpQixNQUFNLElBQUk7QUFDdkYsYUFBUyxLQUFLLE1BQU0sS0FBSyxXQUFXLENBQUMsUUFBUSxHQUFHLGVBQWU7QUFDM0QsVUFBSSxPQUFPLEtBQUs7QUFDWixnQkFBUSxZQUFZLE9BQU8sS0FBSyxPQUFPLFFBQVEsSUFBSTtBQUFBLGVBQzlDLE9BQU8sS0FBSyxRQUFRLEtBQUssQ0FBQztBQUMvQixnQkFBUSxZQUFZLEtBQUssS0FBSyxLQUFLLGFBQWEsS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxPQUFPLFFBQVEsSUFBSTtBQUd0RyxjQUFRLFlBQVksUUFBUSxNQUFNLEdBQUc7QUFBQSxJQUN6QyxHQUFHLENBQUMsT0FBTyxXQUFXLFdBQVcsTUFBTTtBQUVuQyxjQUFRLFlBQVksTUFBTSxPQUFPLFFBQVEsSUFBSTtBQUU3QyxVQUFJO0FBQ0osVUFBSSxRQUFRLGNBQWMsT0FBTyxXQUFXLFdBQVcsQ0FBQztBQUFHO0FBQUEsZUFDbEQsc0JBQXNCLEtBQUssTUFBTSxVQUFVLE9BQU8sT0FDdkQsS0FBSyxNQUFNLFVBQVUsS0FBSyxNQUFNLE1BQU0sYUFDckMsWUFBWSxRQUFRLG1CQUFtQixZQUFZLElBQUksS0FBSyxNQUM3RCxRQUFRLGFBQWEsT0FBTyxXQUFXLFdBQVcsV0FBVyxJQUFJO0FBQUc7QUFBQSxlQUMvRCxRQUFRLGVBQWUsT0FBTyxXQUFXLFdBQVcsTUFBTSxHQUFHLEdBQUc7QUFBRztBQUFBLFdBQ3ZFO0FBRUQsZ0JBQVEsUUFBUSxPQUFPLFdBQVcsV0FBVyxNQUFNLEdBQUc7QUFBQSxNQUMxRDtBQUNBLGFBQU8sTUFBTTtBQUFBLElBQ2pCLENBQUM7QUFFRCxZQUFRLFlBQVksQ0FBQyxHQUFHLFFBQVEsSUFBSTtBQUNwQyxRQUFJLEtBQUssS0FBSztBQUNWLGNBQVEsa0JBQWtCO0FBQzlCLFlBQVEsWUFBWTtBQUVwQixRQUFJLFFBQVEsV0FBVyxLQUFLLFNBQVMsZUFBZTtBQUVoRCxVQUFJO0FBQ0EsYUFBSyx3QkFBd0IsTUFBTSxnQkFBZ0I7QUFDdkQsa0JBQVksS0FBSyxZQUFZLEtBQUssVUFBVSxJQUFJO0FBQ2hELFVBQUk7QUFDQSxpQkFBUyxLQUFLLEdBQUc7QUFBQSxJQUN6QjtBQUFBLEVBQ0o7QUFBQSxFQUNBLHFCQUFxQixNQUFNLEtBQUs7QUFHNUIsUUFBSSxFQUFFLE1BQUFaLE9BQU0sR0FBRyxJQUFJLEtBQUssTUFBTTtBQUM5QixRQUFJLEVBQUUsS0FBSyxNQUFNLHFCQUFxQixrQkFBa0JBLFFBQU8sT0FBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLFFBQVE7QUFDL0YsYUFBTztBQUNYLFFBQUksTUFBTSxLQUFLLGtCQUFrQjtBQUNqQyxRQUFJLFdBQVcsZUFBZSxJQUFJLFdBQVcsSUFBSSxXQUFXO0FBQzVELFFBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLFNBQVMsU0FBUyxVQUFVO0FBQ25ELGFBQU87QUFDWCxRQUFJLEtBQUssS0FBSyxlQUFlO0FBSXpCLFVBQUksT0FBTyxTQUFTO0FBQ3BCLFVBQUksVUFBVSxtQkFBbUIsS0FBSyxLQUFLLFNBQVMsTUFBTUEsUUFBTyxLQUFLLEtBQUssR0FBRztBQUM5RSxhQUFPLFVBQVUsSUFBSSxPQUFPLEVBQUUsTUFBTSxVQUFVLEtBQUssU0FBUyxLQUFLO0FBQUEsSUFDckUsT0FDSztBQUNELGFBQU8sRUFBRSxNQUFNLFVBQVUsS0FBSyxJQUFJLE1BQU0sR0FBRztBQUFBLElBQy9DO0FBQUEsRUFDSjtBQUFBLEVBQ0Esd0JBQXdCLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSyxHQUFHO0FBRS9DLFFBQUksS0FBSyxRQUFRLElBQUk7QUFDakI7QUFFSixRQUFJLFVBQVU7QUFDZCxhQUFRLFVBQVUsUUFBUSxZQUFZO0FBQ2xDLFVBQUksUUFBUSxjQUFjLEtBQUs7QUFDM0I7QUFDSixhQUFPLFFBQVE7QUFDWCxnQkFBUSxXQUFXLFlBQVksUUFBUSxlQUFlO0FBQzFELGFBQU8sUUFBUTtBQUNYLGdCQUFRLFdBQVcsWUFBWSxRQUFRLFdBQVc7QUFDdEQsVUFBSSxRQUFRO0FBQ1IsZ0JBQVEsYUFBYTtBQUFBLElBQzdCO0FBQ0EsUUFBSSxPQUFPLElBQUksb0JBQW9CLE1BQU0sU0FBUyxNQUFNLElBQUk7QUFDNUQsU0FBSyxNQUFNLGlCQUFpQixLQUFLLElBQUk7QUFFckMsU0FBSyxXQUFXLGFBQWEsS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLLFFBQVEsTUFBTSxJQUFJO0FBQUEsRUFDbEY7QUFBQTtBQUFBO0FBQUEsRUFHQSxPQUFPLE1BQU0sV0FBVyxXQUFXLE1BQU07QUFDckMsUUFBSSxLQUFLLFNBQVMsY0FDZCxDQUFDLEtBQUssV0FBVyxLQUFLLElBQUk7QUFDMUIsYUFBTztBQUNYLFNBQUssWUFBWSxNQUFNLFdBQVcsV0FBVyxJQUFJO0FBQ2pELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxZQUFZLE1BQU0sV0FBVyxXQUFXLE1BQU07QUFDMUMsU0FBSyxnQkFBZ0IsU0FBUztBQUM5QixTQUFLLE9BQU87QUFDWixTQUFLLFlBQVk7QUFDakIsUUFBSSxLQUFLO0FBQ0wsV0FBSyxlQUFlLE1BQU0sS0FBSyxVQUFVO0FBQzdDLFNBQUssUUFBUTtBQUFBLEVBQ2pCO0FBQUEsRUFDQSxnQkFBZ0IsV0FBVztBQUN2QixRQUFJLGNBQWMsV0FBVyxLQUFLLFNBQVM7QUFDdkM7QUFDSixRQUFJLFlBQVksS0FBSyxRQUFRLFlBQVk7QUFDekMsUUFBSSxTQUFTLEtBQUs7QUFDbEIsU0FBSyxNQUFNLGVBQWUsS0FBSyxLQUFLLEtBQUssU0FBUyxpQkFBaUIsS0FBSyxXQUFXLEtBQUssTUFBTSxTQUFTLEdBQUcsaUJBQWlCLFdBQVcsS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUMzSixRQUFJLEtBQUssT0FBTyxRQUFRO0FBQ3BCLGFBQU8sYUFBYTtBQUNwQixXQUFLLElBQUksYUFBYTtBQUFBLElBQzFCO0FBQ0EsU0FBSyxZQUFZO0FBQUEsRUFDckI7QUFBQTtBQUFBLEVBRUEsYUFBYTtBQUNULFFBQUksS0FBSyxRQUFRLFlBQVk7QUFDekIsV0FBSyxRQUFRLFVBQVUsSUFBSSwwQkFBMEI7QUFDekQsUUFBSSxLQUFLLGNBQWMsQ0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ3hDLFdBQUssSUFBSSxZQUFZO0FBQUEsRUFDN0I7QUFBQTtBQUFBLEVBRUEsZUFBZTtBQUNYLFFBQUksS0FBSyxRQUFRLFlBQVk7QUFDekIsV0FBSyxRQUFRLFVBQVUsT0FBTywwQkFBMEI7QUFDNUQsUUFBSSxLQUFLLGNBQWMsQ0FBQyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ3hDLFdBQUssSUFBSSxnQkFBZ0IsV0FBVztBQUFBLEVBQzVDO0FBQUEsRUFDQSxJQUFJLFVBQVU7QUFBRSxXQUFPLEtBQUssS0FBSztBQUFBLEVBQVE7QUFDN0M7QUFHQSxTQUFTLFlBQVlFLE1BQUssV0FBVyxXQUFXLEtBQUssTUFBTTtBQUN2RCxpQkFBZSxLQUFLLFdBQVdBLElBQUc7QUFDbEMsTUFBSSxVQUFVLElBQUksYUFBYSxRQUFXQSxNQUFLLFdBQVcsV0FBVyxLQUFLLEtBQUssS0FBSyxNQUFNLENBQUM7QUFDM0YsTUFBSSxRQUFRO0FBQ1IsWUFBUSxlQUFlLE1BQU0sQ0FBQztBQUNsQyxTQUFPO0FBQ1g7QUFDQSxJQUFNLGVBQU4sTUFBTSxzQkFBcUIsYUFBYTtBQUFBLEVBQ3BDLFlBQVksUUFBUSxNQUFNLFdBQVcsV0FBVyxLQUFLLFNBQVMsTUFBTTtBQUNoRSxVQUFNLFFBQVEsTUFBTSxXQUFXLFdBQVcsS0FBSyxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQUEsRUFDekU7QUFBQSxFQUNBLFlBQVk7QUFDUixRQUFJLE9BQU8sS0FBSyxRQUFRO0FBQ3hCLFdBQU8sUUFBUSxRQUFRLEtBQUssT0FBTyxDQUFDLEtBQUs7QUFDckMsYUFBTyxLQUFLO0FBQ2hCLFdBQU8sRUFBRSxNQUFPLFFBQVEsS0FBTTtBQUFBLEVBQ2xDO0FBQUEsRUFDQSxPQUFPLE1BQU0sV0FBVyxXQUFXLE1BQU07QUFDckMsUUFBSSxLQUFLLFNBQVMsY0FBZSxLQUFLLFNBQVMsYUFBYSxDQUFDLEtBQUssU0FBUyxLQUN2RSxDQUFDLEtBQUssV0FBVyxLQUFLLElBQUk7QUFDMUIsYUFBTztBQUNYLFNBQUssZ0JBQWdCLFNBQVM7QUFDOUIsU0FBSyxLQUFLLFNBQVMsYUFBYSxLQUFLLFFBQVEsS0FBSyxLQUFLLFNBQVMsS0FBSyxRQUFRLEtBQUssUUFBUSxXQUFXO0FBQ2pHLFdBQUssUUFBUSxZQUFZLEtBQUs7QUFDOUIsVUFBSSxLQUFLLGVBQWUsS0FBSztBQUN6QixhQUFLLGNBQWM7QUFBQSxJQUMzQjtBQUNBLFNBQUssT0FBTztBQUNaLFNBQUssUUFBUTtBQUNiLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxXQUFXO0FBQ1AsUUFBSSxZQUFZLEtBQUssT0FBTztBQUM1QixhQUFTLElBQUksS0FBSyxTQUFTLEdBQUcsSUFBSSxFQUFFO0FBQ2hDLFVBQUksS0FBSztBQUNMLGVBQU87QUFDZixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0EsV0FBVyxLQUFLO0FBQ1osV0FBTyxFQUFFLE1BQU0sS0FBSyxTQUFTLFFBQVEsSUFBSTtBQUFBLEVBQzdDO0FBQUEsRUFDQSxnQkFBZ0IsS0FBS0QsU0FBUSxNQUFNO0FBQy9CLFFBQUksT0FBTyxLQUFLO0FBQ1osYUFBTyxLQUFLLGFBQWEsS0FBSyxJQUFJQSxTQUFRLEtBQUssS0FBSyxLQUFLLE1BQU07QUFDbkUsV0FBTyxNQUFNLGdCQUFnQixLQUFLQSxTQUFRLElBQUk7QUFBQSxFQUNsRDtBQUFBLEVBQ0EsZUFBZSxVQUFVO0FBQ3JCLFdBQU8sU0FBUyxRQUFRLG1CQUFtQixTQUFTLFFBQVE7QUFBQSxFQUNoRTtBQUFBLEVBQ0EsTUFBTUQsT0FBTSxJQUFJLE1BQU07QUFDbEIsUUFBSSxPQUFPLEtBQUssS0FBSyxJQUFJQSxPQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsZUFBZSxLQUFLLElBQUk7QUFDM0UsV0FBTyxJQUFJLGNBQWEsS0FBSyxRQUFRLE1BQU0sS0FBSyxXQUFXLEtBQUssV0FBVyxLQUFLLEtBQUssSUFBSTtBQUFBLEVBQzdGO0FBQUEsRUFDQSxVQUFVQSxPQUFNLElBQUk7QUFDaEIsVUFBTSxVQUFVQSxPQUFNLEVBQUU7QUFDeEIsUUFBSSxLQUFLLE9BQU8sS0FBSyxZQUFZQSxTQUFRLEtBQUssTUFBTSxLQUFLLFFBQVEsVUFBVTtBQUN2RSxXQUFLLFFBQVE7QUFBQSxFQUNyQjtBQUFBLEVBQ0EsSUFBSSxVQUFVO0FBQUUsV0FBTztBQUFBLEVBQU87QUFDbEM7QUFHQSxJQUFNLHVCQUFOLGNBQW1DLFNBQVM7QUFBQSxFQUN4QyxZQUFZO0FBQUUsV0FBTyxFQUFFLFFBQVEsS0FBSztBQUFBLEVBQUc7QUFBQSxFQUN2QyxZQUFZLFVBQVU7QUFBRSxXQUFPLEtBQUssU0FBUyxhQUFhLEtBQUssSUFBSSxZQUFZO0FBQUEsRUFBVTtBQUFBLEVBQ3pGLElBQUksVUFBVTtBQUFFLFdBQU87QUFBQSxFQUFNO0FBQUEsRUFDN0IsSUFBSSxrQkFBa0I7QUFBRSxXQUFPLEtBQUssSUFBSSxZQUFZO0FBQUEsRUFBTztBQUMvRDtBQUlBLElBQU0scUJBQU4sY0FBaUMsYUFBYTtBQUFBLEVBQzFDLFlBQVksUUFBUSxNQUFNLFdBQVcsV0FBVyxLQUFLLFlBQVksU0FBUyxNQUFNLE1BQU0sS0FBSztBQUN2RixVQUFNLFFBQVEsTUFBTSxXQUFXLFdBQVcsS0FBSyxZQUFZLFNBQVMsTUFBTSxHQUFHO0FBQzdFLFNBQUssT0FBTztBQUFBLEVBQ2hCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPLE1BQU0sV0FBVyxXQUFXLE1BQU07QUFDckMsUUFBSSxLQUFLLFNBQVM7QUFDZCxhQUFPO0FBQ1gsUUFBSSxLQUFLLEtBQUssUUFBUTtBQUNsQixVQUFJLFNBQVMsS0FBSyxLQUFLLE9BQU8sTUFBTSxXQUFXLFNBQVM7QUFDeEQsVUFBSTtBQUNBLGFBQUssWUFBWSxNQUFNLFdBQVcsV0FBVyxJQUFJO0FBQ3JELGFBQU87QUFBQSxJQUNYLFdBQ1MsQ0FBQyxLQUFLLGNBQWMsQ0FBQyxLQUFLLFFBQVE7QUFDdkMsYUFBTztBQUFBLElBQ1gsT0FDSztBQUNELGFBQU8sTUFBTSxPQUFPLE1BQU0sV0FBVyxXQUFXLElBQUk7QUFBQSxJQUN4RDtBQUFBLEVBQ0o7QUFBQSxFQUNBLGFBQWE7QUFDVCxTQUFLLEtBQUssYUFBYSxLQUFLLEtBQUssV0FBVyxJQUFJLE1BQU0sV0FBVztBQUFBLEVBQ3JFO0FBQUEsRUFDQSxlQUFlO0FBQ1gsU0FBSyxLQUFLLGVBQWUsS0FBSyxLQUFLLGFBQWEsSUFBSSxNQUFNLGFBQWE7QUFBQSxFQUMzRTtBQUFBLEVBQ0EsYUFBYSxRQUFRLE1BQU0sTUFBTSxPQUFPO0FBQ3BDLFNBQUssS0FBSyxlQUFlLEtBQUssS0FBSyxhQUFhLFFBQVEsTUFBTSxJQUFJLElBQzVELE1BQU0sYUFBYSxRQUFRLE1BQU0sTUFBTSxLQUFLO0FBQUEsRUFDdEQ7QUFBQSxFQUNBLFVBQVU7QUFDTixRQUFJLEtBQUssS0FBSztBQUNWLFdBQUssS0FBSyxRQUFRO0FBQ3RCLFVBQU0sUUFBUTtBQUFBLEVBQ2xCO0FBQUEsRUFDQSxVQUFVLE9BQU87QUFDYixXQUFPLEtBQUssS0FBSyxZQUFZLEtBQUssS0FBSyxVQUFVLEtBQUssSUFBSTtBQUFBLEVBQzlEO0FBQUEsRUFDQSxlQUFlLFVBQVU7QUFDckIsV0FBTyxLQUFLLEtBQUssaUJBQWlCLEtBQUssS0FBSyxlQUFlLFFBQVEsSUFBSSxNQUFNLGVBQWUsUUFBUTtBQUFBLEVBQ3hHO0FBQ0o7QUFJQSxTQUFTLFlBQVksV0FBVyxPQUFPLE1BQU07QUFDekMsTUFBSSxNQUFNLFVBQVUsWUFBWSxVQUFVO0FBQzFDLFdBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsUUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLFdBQVcsS0FBSztBQUNyQyxRQUFJLFNBQVMsY0FBYyxXQUFXO0FBQ2xDLGFBQU8sWUFBWSxLQUFLO0FBQ3BCLGNBQU0sR0FBRyxHQUFHO0FBQ1osa0JBQVU7QUFBQSxNQUNkO0FBQ0EsWUFBTSxJQUFJO0FBQUEsSUFDZCxPQUNLO0FBQ0QsZ0JBQVU7QUFDVixnQkFBVSxhQUFhLFVBQVUsR0FBRztBQUFBLElBQ3hDO0FBQ0EsUUFBSSxnQkFBZ0IsY0FBYztBQUM5QixVQUFJLE1BQU0sTUFBTSxJQUFJLGtCQUFrQixVQUFVO0FBQ2hELGtCQUFZLEtBQUssWUFBWSxLQUFLLFVBQVUsSUFBSTtBQUNoRCxZQUFNLE1BQU0sSUFBSSxjQUFjLFVBQVU7QUFBQSxJQUM1QztBQUFBLEVBQ0o7QUFDQSxTQUFPLEtBQUs7QUFDUixVQUFNLEdBQUcsR0FBRztBQUNaLGNBQVU7QUFBQSxFQUNkO0FBQ0EsTUFBSSxXQUFXLEtBQUssZUFBZTtBQUMvQixTQUFLLGNBQWM7QUFDM0I7QUFDQSxJQUFNLGlCQUFpQixTQUFVLFVBQVU7QUFDdkMsTUFBSTtBQUNBLFNBQUssV0FBVztBQUN4QjtBQUNBLGVBQWUsWUFBWSx1QkFBTyxPQUFPLElBQUk7QUFDN0MsSUFBTSxTQUFTLENBQUMsSUFBSSxnQkFBYztBQUNsQyxTQUFTLGlCQUFpQixXQUFXLE1BQU0sV0FBVztBQUNsRCxNQUFJLFVBQVUsVUFBVTtBQUNwQixXQUFPO0FBQ1gsTUFBSUcsT0FBTSxZQUFZLE9BQU8sQ0FBQyxJQUFJLElBQUksa0JBQWdCLFNBQVMsQ0FBQ0EsSUFBRztBQUNuRSxXQUFTLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUSxLQUFLO0FBQ3ZDLFFBQUksUUFBUSxVQUFVLENBQUMsRUFBRSxLQUFLO0FBQzlCLFFBQUksQ0FBQztBQUNEO0FBQ0osUUFBSSxNQUFNO0FBQ04sYUFBTyxLQUFLQSxPQUFNLElBQUksZUFBZSxNQUFNLFFBQVEsQ0FBQztBQUN4RCxhQUFTLFFBQVEsT0FBTztBQUNwQixVQUFJLE1BQU0sTUFBTSxJQUFJO0FBQ3BCLFVBQUksT0FBTztBQUNQO0FBQ0osVUFBSSxhQUFhLE9BQU8sVUFBVTtBQUM5QixlQUFPLEtBQUtBLE9BQU0sSUFBSSxlQUFlLEtBQUssV0FBVyxTQUFTLEtBQUssQ0FBQztBQUN4RSxVQUFJLFFBQVE7QUFDUixRQUFBQSxLQUFJLFNBQVNBLEtBQUksUUFBUUEsS0FBSSxRQUFRLE1BQU0sTUFBTTtBQUFBLGVBQzVDLFFBQVE7QUFDYixRQUFBQSxLQUFJLFNBQVNBLEtBQUksUUFBUUEsS0FBSSxRQUFRLE1BQU0sTUFBTTtBQUFBLGVBQzVDLFFBQVE7QUFDYixRQUFBQSxLQUFJLElBQUksSUFBSTtBQUFBLElBQ3BCO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQUNBLFNBQVMsZUFBZSxVQUFVLFNBQVMsY0FBYyxhQUFhO0FBRWxFLE1BQUksZ0JBQWdCLFVBQVUsZUFBZTtBQUN6QyxXQUFPO0FBQ1gsTUFBSSxTQUFTO0FBQ2IsV0FBUyxJQUFJLEdBQUcsSUFBSSxZQUFZLFFBQVEsS0FBSztBQUN6QyxRQUFJLE9BQU8sWUFBWSxDQUFDLEdBQUcsT0FBTyxhQUFhLENBQUM7QUFDaEQsUUFBSSxHQUFHO0FBQ0gsVUFBSTtBQUNKLFVBQUksUUFBUSxLQUFLLFlBQVksS0FBSyxZQUFZLFVBQVUsYUFDbkQsU0FBUyxPQUFPLGVBQWUsT0FBTyxTQUFTLFlBQVksS0FBSyxLQUFLLFVBQVU7QUFDaEYsaUJBQVM7QUFBQSxNQUNiLE9BQ0s7QUFDRCxpQkFBUyxTQUFTLGNBQWMsS0FBSyxRQUFRO0FBQzdDLGVBQU8sV0FBVztBQUNsQixlQUFPLFlBQVksTUFBTTtBQUN6QixlQUFPLE9BQU8sQ0FBQztBQUNmLGlCQUFTO0FBQUEsTUFDYjtBQUFBLElBQ0o7QUFDQSxvQkFBZ0IsUUFBUSxRQUFRLE9BQU8sQ0FBQyxHQUFHLElBQUk7QUFBQSxFQUNuRDtBQUNBLFNBQU87QUFDWDtBQUNBLFNBQVMsZ0JBQWdCLEtBQUssTUFBTSxLQUFLO0FBQ3JDLFdBQVMsUUFBUTtBQUNiLFFBQUksUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLGNBQWMsRUFBRSxRQUFRO0FBQ3RFLFVBQUksZ0JBQWdCLElBQUk7QUFDaEMsV0FBUyxRQUFRO0FBQ2IsUUFBSSxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsY0FBYyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUk7QUFDbEYsVUFBSSxhQUFhLE1BQU0sSUFBSSxJQUFJLENBQUM7QUFDeEMsTUFBSSxLQUFLLFNBQVMsSUFBSSxPQUFPO0FBQ3pCLFFBQUksV0FBVyxLQUFLLFFBQVEsS0FBSyxNQUFNLE1BQU0sR0FBRyxFQUFFLE9BQU8sT0FBTyxJQUFJLENBQUM7QUFDckUsUUFBSSxVQUFVLElBQUksUUFBUSxJQUFJLE1BQU0sTUFBTSxHQUFHLEVBQUUsT0FBTyxPQUFPLElBQUksQ0FBQztBQUNsRSxhQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUTtBQUNqQyxVQUFJLFFBQVEsUUFBUSxTQUFTLENBQUMsQ0FBQyxLQUFLO0FBQ2hDLFlBQUksVUFBVSxPQUFPLFNBQVMsQ0FBQyxDQUFDO0FBQ3hDLGFBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRO0FBQ2hDLFVBQUksU0FBUyxRQUFRLFFBQVEsQ0FBQyxDQUFDLEtBQUs7QUFDaEMsWUFBSSxVQUFVLElBQUksUUFBUSxDQUFDLENBQUM7QUFDcEMsUUFBSSxJQUFJLFVBQVUsVUFBVTtBQUN4QixVQUFJLGdCQUFnQixPQUFPO0FBQUEsRUFDbkM7QUFDQSxNQUFJLEtBQUssU0FBUyxJQUFJLE9BQU87QUFDekIsUUFBSSxLQUFLLE9BQU87QUFDWixVQUFJLE9BQU8saUZBQWlGO0FBQzVGLGFBQU8sSUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQzNCLFlBQUksTUFBTSxlQUFlLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFDckM7QUFDQSxRQUFJLElBQUk7QUFDSixVQUFJLE1BQU0sV0FBVyxJQUFJO0FBQUEsRUFDakM7QUFDSjtBQUNBLFNBQVMsZUFBZSxLQUFLLE1BQU0sTUFBTTtBQUNyQyxTQUFPLGVBQWUsS0FBSyxLQUFLLFFBQVEsaUJBQWlCLE1BQU0sTUFBTSxJQUFJLFlBQVksQ0FBQyxDQUFDO0FBQzNGO0FBQ0EsU0FBUyxjQUFjLEdBQUcsR0FBRztBQUN6QixNQUFJLEVBQUUsVUFBVSxFQUFFO0FBQ2QsV0FBTztBQUNYLFdBQVMsSUFBSSxHQUFHLElBQUksRUFBRSxRQUFRO0FBQzFCLFFBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUN2QixhQUFPO0FBQ2YsU0FBTztBQUNYO0FBRUEsU0FBUyxHQUFHLEtBQUs7QUFDYixNQUFJLE9BQU8sSUFBSTtBQUNmLE1BQUksV0FBVyxZQUFZLEdBQUc7QUFDOUIsU0FBTztBQUNYO0FBR0EsSUFBTSxrQkFBTixNQUFzQjtBQUFBLEVBQ2xCLFlBQVlBLE1BQUssTUFBTSxNQUFNO0FBQ3pCLFNBQUssT0FBTztBQUNaLFNBQUssT0FBTztBQUdaLFNBQUssUUFBUTtBQUdiLFNBQUssUUFBUSxDQUFDO0FBRWQsU0FBSyxVQUFVO0FBQ2YsU0FBSyxNQUFNQTtBQUNYLFNBQUssV0FBVyxTQUFTQSxLQUFJLEtBQUssU0FBU0EsSUFBRztBQUFBLEVBQ2xEO0FBQUE7QUFBQTtBQUFBLEVBR0EsZUFBZVUsUUFBT04sTUFBSztBQUN2QixRQUFJTSxVQUFTTjtBQUNUO0FBQ0osYUFBUyxJQUFJTSxRQUFPLElBQUlOLE1BQUs7QUFDekIsV0FBSyxJQUFJLFNBQVMsQ0FBQyxFQUFFLFFBQVE7QUFDakMsU0FBSyxJQUFJLFNBQVMsT0FBT00sUUFBT04sT0FBTU0sTUFBSztBQUMzQyxTQUFLLFVBQVU7QUFBQSxFQUNuQjtBQUFBO0FBQUEsRUFFQSxjQUFjO0FBQ1YsU0FBSyxlQUFlLEtBQUssT0FBTyxLQUFLLElBQUksU0FBUyxNQUFNO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUEsRUFHQSxZQUFZLE9BQU8sUUFBUSxNQUFNO0FBQzdCLFFBQUksT0FBTyxHQUFHLFFBQVEsS0FBSyxNQUFNLFVBQVU7QUFDM0MsUUFBSSxVQUFVLEtBQUssSUFBSSxPQUFPLE1BQU0sTUFBTTtBQUMxQyxXQUFPLE9BQU8sWUFDVCxRQUFRLFFBQVEsSUFBSSxLQUFLLE1BQU0sS0FBSyxNQUFPLE9BQU8sS0FBTSxDQUFDLEdBQ3JELFlBQVksTUFBTSxJQUFJLENBQUMsS0FBSyxNQUFNLElBQUksRUFBRSxLQUFLLEtBQUssYUFBYTtBQUNwRTtBQUNKLFdBQU8sT0FBTyxPQUFPO0FBQ2pCLFdBQUssWUFBWTtBQUNqQixXQUFLLElBQUksUUFBUTtBQUNqQixXQUFLLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFDNUIsV0FBSyxNQUFNLEtBQUssTUFBTSxJQUFJO0FBQzFCO0FBQUEsSUFDSjtBQUNBLFdBQU8sUUFBUSxNQUFNLFFBQVE7QUFDekIsV0FBSyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ3hDLFVBQUlDLFNBQVE7QUFDWixlQUFTLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxJQUFJLEtBQUssUUFBUSxHQUFHLEtBQUssSUFBSSxTQUFTLE1BQU0sR0FBRyxLQUFLO0FBQ2xGLFlBQUksT0FBTyxLQUFLLElBQUksU0FBUyxDQUFDO0FBQzlCLFlBQUksS0FBSyxZQUFZLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUc7QUFDNUQsVUFBQUEsU0FBUTtBQUNSO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxVQUFJQSxTQUFRLElBQUk7QUFDWixZQUFJQSxTQUFRLEtBQUssT0FBTztBQUNwQixlQUFLLFVBQVU7QUFDZixlQUFLLGVBQWUsS0FBSyxPQUFPQSxNQUFLO0FBQUEsUUFDekM7QUFDQSxhQUFLLE1BQU0sS0FBSyxJQUFJLFNBQVMsS0FBSyxLQUFLO0FBQUEsTUFDM0MsT0FDSztBQUNELFlBQUksV0FBVyxhQUFhLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxHQUFHLFFBQVEsSUFBSTtBQUN2RSxhQUFLLElBQUksU0FBUyxPQUFPLEtBQUssT0FBTyxHQUFHLFFBQVE7QUFDaEQsYUFBSyxNQUFNO0FBQ1gsYUFBSyxVQUFVO0FBQUEsTUFDbkI7QUFDQSxXQUFLLFFBQVE7QUFDYjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBLEVBR0EsY0FBYyxNQUFNLFdBQVcsV0FBVyxPQUFPO0FBQzdDLFFBQUlBLFNBQVEsSUFBSTtBQUNoQixRQUFJLFNBQVMsS0FBSyxTQUFTLFVBQ3RCLGFBQWEsS0FBSyxTQUFTLFFBQVEsUUFBUSxLQUFLLFNBQVMsS0FBSyxHQUFHLFVBQVUsS0FBSyxPQUNqRixXQUFXLFlBQVksTUFBTSxXQUFXLFNBQVMsR0FBRztBQUNwRCxNQUFBQSxTQUFRLEtBQUssSUFBSSxTQUFTLFFBQVEsWUFBWSxLQUFLLEtBQUs7QUFBQSxJQUM1RCxPQUNLO0FBQ0QsZUFBUyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksU0FBUyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLO0FBQ2hGLFlBQUksUUFBUSxLQUFLLElBQUksU0FBUyxDQUFDO0FBQy9CLFlBQUksTUFBTSxZQUFZLE1BQU0sV0FBVyxTQUFTLEtBQUssQ0FBQyxLQUFLLFNBQVMsUUFBUSxJQUFJLEtBQUssR0FBRztBQUNwRixVQUFBQSxTQUFRO0FBQ1I7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxRQUFJQSxTQUFRO0FBQ1IsYUFBTztBQUNYLFNBQUssZUFBZSxLQUFLLE9BQU9BLE1BQUs7QUFDckMsU0FBSztBQUNMLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxhQUFhLE1BQU0sV0FBVyxXQUFXLE9BQU8sTUFBTTtBQUNsRCxRQUFJLFFBQVEsS0FBSyxJQUFJLFNBQVMsS0FBSztBQUNuQyxRQUFJLE1BQU0sU0FBUyxjQUFjLE1BQU0sT0FBTyxNQUFNO0FBQ2hELFlBQU0sUUFBUTtBQUNsQixRQUFJLENBQUMsTUFBTSxPQUFPLE1BQU0sV0FBVyxXQUFXLElBQUk7QUFDOUMsYUFBTztBQUNYLFNBQUssZUFBZSxLQUFLLE9BQU8sS0FBSztBQUNyQyxTQUFLO0FBQ0wsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLG1CQUFtQixTQUFTO0FBQ3hCLGVBQVM7QUFDTCxVQUFJLFNBQVMsUUFBUTtBQUNyQixVQUFJLENBQUM7QUFDRCxlQUFPO0FBQ1gsVUFBSSxVQUFVLEtBQUssSUFBSSxZQUFZO0FBQy9CLFlBQUksT0FBTyxRQUFRO0FBQ25CLFlBQUk7QUFDQSxtQkFBUyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4RCxnQkFBSSxLQUFLLElBQUksU0FBUyxDQUFDLEtBQUs7QUFDeEIscUJBQU87QUFBQSxVQUNmO0FBQ0osZUFBTztBQUFBLE1BQ1g7QUFDQSxnQkFBVTtBQUFBLElBQ2Q7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBLEVBR0EsZUFBZSxNQUFNLFdBQVcsV0FBVyxNQUFNLE9BQU8sS0FBSztBQUN6RCxhQUFTLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3hELFVBQUksT0FBTyxLQUFLLElBQUksU0FBUyxDQUFDO0FBQzlCLFVBQUksZ0JBQWdCLGNBQWM7QUFDOUIsWUFBSUMsWUFBVyxLQUFLLFNBQVMsUUFBUSxJQUFJLElBQUk7QUFDN0MsWUFBSUEsYUFBWSxRQUFRQSxhQUFZO0FBQ2hDLGlCQUFPO0FBQ1gsWUFBSSxVQUFVLEtBQUssS0FBSztBQUl4QixZQUFJLFNBQVMsS0FBSyxTQUFTLE9BQU8sS0FDOUIsRUFBRSxLQUFLLFVBQVUsS0FBSyxRQUFRLEtBQUssS0FBSyxVQUFVLEtBQUssUUFBUSxhQUFhLEtBQUssUUFDN0UsS0FBSyxTQUFTLGNBQWMsY0FBYyxXQUFXLEtBQUssU0FBUztBQUMzRSxZQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sTUFBTSxXQUFXLFdBQVcsSUFBSSxHQUFHO0FBQzFELGVBQUssZUFBZSxLQUFLLE9BQU8sQ0FBQztBQUNqQyxjQUFJLEtBQUssT0FBTztBQUNaLGlCQUFLLFVBQVU7QUFDbkIsZUFBSztBQUNMLGlCQUFPO0FBQUEsUUFDWCxXQUNTLENBQUMsV0FBVyxVQUFVLEtBQUssZ0JBQWdCLE1BQU0sTUFBTSxXQUFXLFdBQVcsTUFBTSxHQUFHLElBQUk7QUFDL0YsZUFBSyxJQUFJLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFDaEMsY0FBSSxRQUFRLFlBQVk7QUFDcEIsb0JBQVEsUUFBUTtBQUNoQixvQkFBUSxlQUFlLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLG9CQUFRLFFBQVE7QUFBQSxVQUNwQjtBQUNBLGVBQUssVUFBVTtBQUNmLGVBQUs7QUFDTCxpQkFBTztBQUFBLFFBQ1g7QUFDQTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUEsRUFHQSxnQkFBZ0IsTUFBTSxNQUFNLFdBQVcsV0FBVyxNQUFNLEtBQUs7QUFDekQsUUFBSSxLQUFLLFNBQVMsS0FBSyxVQUFVLENBQUMsS0FBSyxTQUFTLFVBQzVDLENBQUMsS0FBSyxLQUFLLFFBQVEsR0FBRyxLQUFLLE9BQU87QUFDbEMsYUFBTztBQUNYLFFBQUksVUFBVSxhQUFhLE9BQU8sS0FBSyxLQUFLLE1BQU0sV0FBVyxXQUFXLE1BQU0sR0FBRztBQUNqRixRQUFJLFFBQVEsWUFBWTtBQUNwQixjQUFRLFdBQVcsS0FBSztBQUN4QixXQUFLLFdBQVcsQ0FBQztBQUNqQixlQUFTLE1BQU0sUUFBUTtBQUNuQixXQUFHLFNBQVM7QUFBQSxJQUNwQjtBQUNBLFNBQUssUUFBUTtBQUNiLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQSxFQUVBLFFBQVEsTUFBTSxXQUFXLFdBQVcsTUFBTSxLQUFLO0FBQzNDLFFBQUksT0FBTyxhQUFhLE9BQU8sS0FBSyxLQUFLLE1BQU0sV0FBVyxXQUFXLE1BQU0sR0FBRztBQUM5RSxRQUFJLEtBQUs7QUFDTCxXQUFLLGVBQWUsTUFBTSxNQUFNLENBQUM7QUFDckMsU0FBSyxJQUFJLFNBQVMsT0FBTyxLQUFLLFNBQVMsR0FBRyxJQUFJO0FBQzlDLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQUEsRUFDQSxZQUFZLFFBQVEsTUFBTSxLQUFLO0FBQzNCLFFBQUksT0FBTyxLQUFLLFFBQVEsS0FBSyxJQUFJLFNBQVMsU0FBUyxLQUFLLElBQUksU0FBUyxLQUFLLEtBQUssSUFBSTtBQUNuRixRQUFJLFFBQVEsS0FBSyxjQUFjLE1BQU0sTUFDaEMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxLQUFLLE9BQU8sS0FBSyxNQUFNLGFBQWE7QUFDL0QsV0FBSztBQUFBLElBQ1QsT0FDSztBQUNELFVBQUksT0FBTyxJQUFJLGVBQWUsS0FBSyxLQUFLLFFBQVEsTUFBTSxHQUFHO0FBQ3pELFdBQUssSUFBSSxTQUFTLE9BQU8sS0FBSyxTQUFTLEdBQUcsSUFBSTtBQUM5QyxXQUFLLFVBQVU7QUFBQSxJQUNuQjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUEsRUFHQSxvQkFBb0I7QUFDaEIsUUFBSSxZQUFZLEtBQUssSUFBSSxTQUFTLEtBQUssUUFBUSxDQUFDLEdBQUcsU0FBUyxLQUFLO0FBQ2pFLFdBQU8scUJBQXFCLGNBQWM7QUFDdEMsZUFBUztBQUNULGtCQUFZLE9BQU8sU0FBUyxPQUFPLFNBQVMsU0FBUyxDQUFDO0FBQUEsSUFDMUQ7QUFDQSxRQUFJLENBQUM7QUFBQSxJQUNELEVBQUUscUJBQXFCLGlCQUN2QixNQUFNLEtBQUssVUFBVSxLQUFLLElBQUksS0FDN0IsS0FBSyxLQUFLLHlCQUF5QixNQUFNLEtBQUssVUFBVSxLQUFLLElBQUksR0FBSTtBQUV0RSxXQUFLLFVBQVUsV0FBVyxhQUFhLFVBQVUsSUFBSSxtQkFBbUI7QUFDcEUsYUFBSyxZQUFZLE9BQU8sTUFBTTtBQUNsQyxXQUFLLFlBQVksTUFBTSxLQUFLLEdBQUc7QUFBQSxJQUNuQztBQUFBLEVBQ0o7QUFBQSxFQUNBLFlBQVksVUFBVSxRQUFRO0FBQzFCLFFBQUksVUFBVSxLQUFLLE9BQU8sS0FBSyxRQUFRLE9BQU8sU0FBUyxVQUFVLE9BQU8sU0FBUyxLQUFLLEtBQUssRUFBRSxZQUFZLFFBQVEsR0FBRztBQUNoSCxXQUFLO0FBQUEsSUFDVCxPQUNLO0FBQ0QsVUFBSSxNQUFNLFNBQVMsY0FBYyxRQUFRO0FBQ3pDLFVBQUksWUFBWSxPQUFPO0FBQ25CLFlBQUksWUFBWTtBQUNoQixZQUFJLE1BQU07QUFBQSxNQUNkO0FBQ0EsVUFBSSxZQUFZO0FBQ1osWUFBSSxZQUFZO0FBQ3BCLFVBQUksT0FBTyxJQUFJLHFCQUFxQixLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSTtBQUMzRCxVQUFJLFVBQVUsS0FBSztBQUNmLGVBQU8sU0FBUyxLQUFLLElBQUk7QUFBQTtBQUV6QixlQUFPLFNBQVMsT0FBTyxLQUFLLFNBQVMsR0FBRyxJQUFJO0FBQ2hELFdBQUssVUFBVTtBQUFBLElBQ25CO0FBQUEsRUFDSjtBQUFBLEVBQ0EsU0FBUyxNQUFNO0FBQ1gsV0FBTyxLQUFLLFNBQVMsUUFBUSxLQUFLLFFBQVEsS0FBSyxZQUFZLEtBQUssS0FBSyxTQUFTLEtBQUssS0FBSyxVQUFVO0FBQUEsRUFDdEc7QUFDSjtBQU1BLFNBQVMsU0FBUyxNQUFNLFlBQVk7QUFDaEMsTUFBSSxVQUFVLFlBQVksUUFBUSxRQUFRLFNBQVM7QUFDbkQsTUFBSSxLQUFLLEtBQUssWUFBWSxVQUFVLG9CQUFJLE9BQUtDLFdBQVUsQ0FBQztBQUN4RDtBQUFPLFdBQU8sS0FBSyxHQUFHO0FBQ2xCLFVBQUk7QUFDSixpQkFBUztBQUNMLFlBQUksT0FBTztBQUNQLGNBQUksT0FBTyxRQUFRLFNBQVMsUUFBUSxDQUFDO0FBQ3JDLGNBQUksZ0JBQWdCLGNBQWM7QUFDOUIsc0JBQVU7QUFDVixvQkFBUSxLQUFLLFNBQVM7QUFBQSxVQUMxQixPQUNLO0FBQ0QsbUJBQU87QUFDUDtBQUNBO0FBQUEsVUFDSjtBQUFBLFFBQ0osV0FDUyxXQUFXLFlBQVk7QUFDNUIsZ0JBQU07QUFBQSxRQUNWLE9BQ0s7QUFFRCxrQkFBUSxRQUFRLE9BQU8sU0FBUyxRQUFRLE9BQU87QUFDL0Msb0JBQVUsUUFBUTtBQUFBLFFBQ3RCO0FBQUEsTUFDSjtBQUNBLFVBQUksT0FBTyxLQUFLO0FBQ2hCLFVBQUksQ0FBQztBQUNEO0FBQ0osVUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLENBQUM7QUFDekI7QUFDSixRQUFFO0FBQ0YsY0FBUSxJQUFJLE1BQU0sRUFBRTtBQUNwQixNQUFBQSxTQUFRLEtBQUssSUFBSTtBQUFBLElBQ3JCO0FBQ0EsU0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTLFNBQVNBLFNBQVEsUUFBUSxFQUFFO0FBQzVEO0FBQ0EsU0FBUyxZQUFZLEdBQUcsR0FBRztBQUN2QixTQUFPLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSztBQUNoQztBQUtBLFNBQVMsU0FBUyxRQUFRLE1BQU0sVUFBVSxRQUFRO0FBQzlDLE1BQUksU0FBUyxLQUFLLE9BQU8sTUFBTSxHQUFHZixVQUFTO0FBRTNDLE1BQUksT0FBTyxVQUFVLEdBQUc7QUFDcEIsYUFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFlBQVksS0FBSztBQUN4QyxVQUFJLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDMUIsYUFBTyxPQUFPLFFBQVEsS0FBSyxTQUFTQSxTQUFRLEtBQUssR0FBRyxDQUFDO0FBQ3JELE1BQUFBLFdBQVUsTUFBTTtBQUFBLElBQ3BCO0FBQ0E7QUFBQSxFQUNKO0FBQ0EsTUFBSSxZQUFZLEdBQUcsU0FBUyxDQUFDLEdBQUcsV0FBVztBQUMzQyxXQUFTLGNBQWMsT0FBSztBQUN4QixRQUFJLFFBQVE7QUFDWixXQUFPLFlBQVksT0FBTyxVQUFVLE9BQU8sU0FBUyxFQUFFLE1BQU1BLFNBQVE7QUFDaEUsVUFBSSxPQUFPLE9BQU8sV0FBVztBQUM3QixVQUFJLEtBQUssUUFBUTtBQUNiLFlBQUksQ0FBQztBQUNELG1CQUFTO0FBQUE7QUFFVCxXQUFDLFlBQVksVUFBVSxDQUFDLE1BQU0sSUFBSSxLQUFLLElBQUk7QUFBQSxNQUNuRDtBQUFBLElBQ0o7QUFDQSxRQUFJLFFBQVE7QUFDUixVQUFJLFNBQVM7QUFDVCxnQkFBUSxLQUFLLFdBQVc7QUFDeEIsaUJBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRO0FBQ2hDLG1CQUFTLFFBQVEsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLFFBQVE7QUFBQSxNQUNwRCxPQUNLO0FBQ0QsaUJBQVMsUUFBUSxhQUFhLENBQUMsQ0FBQyxRQUFRO0FBQUEsTUFDNUM7QUFBQSxJQUNKO0FBQ0EsUUFBSSxPQUFPO0FBQ1gsUUFBSSxVQUFVO0FBQ1YsY0FBUTtBQUNSLGNBQVE7QUFDUixpQkFBVztBQUFBLElBQ2YsV0FDUyxjQUFjLE9BQU8sWUFBWTtBQUN0QyxjQUFRO0FBQ1IsY0FBUSxPQUFPLE1BQU0sYUFBYTtBQUFBLElBQ3RDLE9BQ0s7QUFDRDtBQUFBLElBQ0o7QUFDQSxhQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUTtBQUMvQixVQUFJLE9BQU8sQ0FBQyxFQUFFLE1BQU1BO0FBQ2hCLGVBQU8sT0FBTyxLQUFLLENBQUM7QUFDNUIsV0FBTyxZQUFZLE9BQU8sVUFBVSxPQUFPLFNBQVMsRUFBRSxRQUFRQSxXQUFVLE9BQU8sU0FBUyxFQUFFLEtBQUtBO0FBQzNGLGFBQU8sS0FBSyxPQUFPLFdBQVcsQ0FBQztBQUNuQyxRQUFJTSxPQUFNTixVQUFTLE1BQU07QUFDekIsUUFBSSxNQUFNLFFBQVE7QUFDZCxVQUFJLFFBQVFNO0FBQ1osVUFBSSxZQUFZLE9BQU8sVUFBVSxPQUFPLFNBQVMsRUFBRSxPQUFPO0FBQ3RELGdCQUFRLE9BQU8sU0FBUyxFQUFFO0FBQzlCLGVBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRO0FBQy9CLFlBQUksT0FBTyxDQUFDLEVBQUUsS0FBSztBQUNmLGtCQUFRLE9BQU8sQ0FBQyxFQUFFO0FBQzFCLFVBQUksUUFBUUEsTUFBSztBQUNiLG1CQUFXLE1BQU0sSUFBSSxRQUFRTixPQUFNO0FBQ25DLGdCQUFRLE1BQU0sSUFBSSxHQUFHLFFBQVFBLE9BQU07QUFDbkMsUUFBQU0sT0FBTTtBQUNOLGdCQUFRO0FBQUEsTUFDWjtBQUFBLElBQ0o7QUFDQSxRQUFJLFlBQVksTUFBTSxZQUFZLENBQUMsTUFBTSxTQUFTLE9BQU8sT0FBTyxPQUFLLENBQUMsRUFBRSxNQUFNLElBQUksT0FBTyxNQUFNO0FBQy9GLFdBQU8sT0FBTyxXQUFXLEtBQUssU0FBU04sU0FBUSxLQUFLLEdBQUcsS0FBSztBQUM1RCxJQUFBQSxVQUFTTTtBQUFBLEVBQ2I7QUFDSjtBQUdBLFNBQVMsU0FBUyxLQUFLO0FBQ25CLE1BQUksSUFBSSxZQUFZLFFBQVEsSUFBSSxZQUFZLE1BQU07QUFDOUMsUUFBSSxTQUFTLElBQUksTUFBTTtBQUN2QixRQUFJLE1BQU0sVUFBVSxTQUFTO0FBQzdCLFdBQU8saUJBQWlCLEdBQUcsRUFBRTtBQUM3QixRQUFJLE1BQU0sVUFBVTtBQUFBLEVBQ3hCO0FBQ0o7QUFDQSxTQUFTLGVBQWUsTUFBTU4sU0FBUTtBQUNsQyxhQUFTO0FBQ0wsUUFBSSxLQUFLLFlBQVk7QUFDakIsYUFBTztBQUNYLFFBQUksS0FBSyxZQUFZLEtBQUtBLFVBQVMsR0FBRztBQUNsQyxVQUFJLEtBQUssV0FBVyxTQUFTQSxXQUFVLEtBQUssV0FBV0EsT0FBTSxFQUFFLFlBQVk7QUFDdkUsZUFBTyxLQUFLLFdBQVdBLE9BQU07QUFDakMsYUFBTyxLQUFLLFdBQVdBLFVBQVMsQ0FBQztBQUNqQyxNQUFBQSxVQUFTLFNBQVMsSUFBSTtBQUFBLElBQzFCLFdBQ1MsS0FBSyxZQUFZLEtBQUtBLFVBQVMsS0FBSyxXQUFXLFFBQVE7QUFDNUQsYUFBTyxLQUFLLFdBQVdBLE9BQU07QUFDN0IsTUFBQUEsVUFBUztBQUFBLElBQ2IsT0FDSztBQUNELGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNKO0FBRUEsU0FBUyxtQkFBbUIsTUFBTSxNQUFNRCxPQUFNLElBQUk7QUFDOUMsV0FBUyxJQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksS0FBSyxjQUFjLE9BQU8sTUFBSztBQUN4RCxRQUFJLFFBQVEsS0FBSyxNQUFNLEdBQUcsR0FBRyxhQUFhO0FBQzFDLFdBQU8sTUFBTTtBQUNiLFFBQUksQ0FBQyxNQUFNO0FBQ1A7QUFDSixRQUFJLE1BQU0sTUFBTTtBQUNoQixXQUFPLElBQUksS0FBSyxZQUFZO0FBQ3hCLFVBQUksT0FBTyxLQUFLLE1BQU0sR0FBRztBQUN6QixhQUFPLEtBQUs7QUFDWixVQUFJLENBQUMsS0FBSztBQUNOO0FBQ0osYUFBTyxLQUFLO0FBQUEsSUFDaEI7QUFDQSxRQUFJLE9BQU9BLE9BQU07QUFDYixVQUFJLE9BQU8sTUFBTSxJQUFJLE1BQU0sS0FBSyxLQUFLLFNBQVMsWUFBWSxLQUFLLFVBQVUsS0FBSztBQUMxRSxlQUFPLEtBQUssS0FBSztBQUNyQixVQUFJYyxTQUFRLGFBQWEsS0FBSyxJQUFJLFlBQVksTUFBTSxLQUFLLGFBQWEsQ0FBQyxJQUFJO0FBQzNFLFVBQUlBLFVBQVMsS0FBS0EsU0FBUSxLQUFLLFNBQVMsY0FBY2Q7QUFDbEQsZUFBTyxhQUFhYztBQUN4QixVQUFJZCxTQUFRLE1BQU0sSUFBSSxVQUFXLEtBQUssS0FBSyxTQUFVLGNBQ2pELElBQUksTUFBTSxLQUFLLFlBQVksS0FBSyxhQUFhLEtBQUssTUFBTSxLQUFLO0FBQzdELGVBQU87QUFBQSxJQUNmO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQU1BLFNBQVMsYUFBYSxPQUFPQSxPQUFNLElBQUksTUFBTSxhQUFhO0FBQ3RELE1BQUksU0FBUyxDQUFDO0FBQ2QsV0FBUyxJQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDNUMsUUFBSSxRQUFRLE1BQU0sQ0FBQyxHQUFHYSxTQUFRLEtBQUtOLE9BQU0sT0FBTyxNQUFNO0FBQ3RELFFBQUlNLFVBQVMsTUFBTU4sUUFBT1AsT0FBTTtBQUM1QixhQUFPLEtBQUssS0FBSztBQUFBLElBQ3JCLE9BQ0s7QUFDRCxVQUFJYSxTQUFRYjtBQUNSLGVBQU8sS0FBSyxNQUFNLE1BQU0sR0FBR0EsUUFBT2EsUUFBTyxJQUFJLENBQUM7QUFDbEQsVUFBSSxhQUFhO0FBQ2IsZUFBTyxLQUFLLFdBQVc7QUFDdkIsc0JBQWM7QUFBQSxNQUNsQjtBQUNBLFVBQUlOLE9BQU07QUFDTixlQUFPLEtBQUssTUFBTSxNQUFNLEtBQUtNLFFBQU8sTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLElBQzdEO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQUVBLFNBQVMsaUJBQWlCLE1BQU0sU0FBUyxNQUFNO0FBQzNDLE1BQUksU0FBUyxLQUFLLGtCQUFrQixHQUFHWCxPQUFNLEtBQUssTUFBTTtBQUN4RCxNQUFJLENBQUMsT0FBTztBQUNSLFdBQU87QUFDWCxNQUFJLGNBQWMsS0FBSyxRQUFRLFlBQVksT0FBTyxTQUFTLEdBQUcsV0FBVyxlQUFlLFlBQVksUUFBUTtBQUM1RyxNQUFJLE9BQU8sS0FBSyxRQUFRLFdBQVcsT0FBTyxXQUFXLE9BQU8sYUFBYSxDQUFDO0FBQzFFLE1BQUksT0FBTztBQUNQLFdBQU87QUFDWCxNQUFJLFFBQVFBLEtBQUksUUFBUSxJQUFJLEdBQUcsU0FBUztBQUN4QyxNQUFJLG1CQUFtQixNQUFNLEdBQUc7QUFDNUIsY0FBVTtBQUNWLFdBQU8sZUFBZSxDQUFDLFlBQVk7QUFDL0Isb0JBQWMsWUFBWTtBQUM5QixRQUFJLGtCQUFrQixZQUFZO0FBQ2xDLFFBQUksZUFBZSxnQkFBZ0IsVUFBVSxjQUFjLGFBQWEsZUFBZSxLQUFLLFlBQVksVUFDakcsRUFBRSxnQkFBZ0IsWUFBWSxTQUFTLE9BQU8sV0FBVyxPQUFPLGFBQWEsWUFBWSxHQUFHLElBQUk7QUFDbkcsVUFBSSxNQUFNLFlBQVk7QUFDdEIsa0JBQVksSUFBSSxjQUFjLFFBQVEsTUFBTSxRQUFRQSxLQUFJLFFBQVEsR0FBRyxDQUFDO0FBQUEsSUFDeEU7QUFBQSxFQUNKLE9BQ0s7QUFDRCxRQUFJLFNBQVMsS0FBSyxRQUFRLFdBQVcsT0FBTyxZQUFZLE9BQU8sY0FBYyxDQUFDO0FBQzlFLFFBQUksU0FBUztBQUNULGFBQU87QUFDWCxjQUFVQSxLQUFJLFFBQVEsTUFBTTtBQUFBLEVBQ2hDO0FBQ0EsTUFBSSxDQUFDLFdBQVc7QUFDWixRQUFJLE9BQU8sVUFBVSxhQUFjLEtBQUssTUFBTSxVQUFVLE9BQU8sTUFBTSxPQUFPLENBQUMsV0FBWSxJQUFJO0FBQzdGLGdCQUFZLGlCQUFpQixNQUFNLFNBQVMsT0FBTyxJQUFJO0FBQUEsRUFDM0Q7QUFDQSxTQUFPO0FBQ1g7QUFDQSxTQUFTLG9CQUFvQixNQUFNO0FBQy9CLFNBQU8sS0FBSyxXQUFXLEtBQUssU0FBUyxJQUNqQyxhQUFhLElBQUksS0FBSyxTQUFTLGlCQUFpQixTQUFTLGNBQWMsU0FBUyxLQUFLLEdBQUc7QUFDaEc7QUFDQSxTQUFTLGVBQWUsTUFBTSxRQUFRLE9BQU87QUFDekMsTUFBSSxNQUFNLEtBQUssTUFBTTtBQUNyQixvQkFBa0IsTUFBTSxHQUFHO0FBQzNCLE1BQUksQ0FBQyxvQkFBb0IsSUFBSTtBQUN6QjtBQUlKLE1BQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxhQUFhLEtBQUssTUFBTSxVQUFVLGdCQUFnQixRQUFRO0FBQy9FLFFBQUksU0FBUyxLQUFLLGtCQUFrQixHQUFHLFNBQVMsS0FBSyxZQUFZO0FBQ2pFLFFBQUksT0FBTyxjQUFjLE9BQU8sY0FDNUIscUJBQXFCLE9BQU8sWUFBWSxPQUFPLGNBQWMsT0FBTyxZQUFZLE9BQU8sWUFBWSxHQUFHO0FBQ3RHLFdBQUssTUFBTSxVQUFVLHVCQUF1QjtBQUM1QyxXQUFLLFlBQVksZ0JBQWdCO0FBQ2pDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxPQUFLLFlBQVksb0JBQW9CO0FBQ3JDLE1BQUksS0FBSyxlQUFlO0FBQ3BCLHdCQUFvQixJQUFJO0FBQUEsRUFDNUIsT0FDSztBQUNELFFBQUksRUFBRSxRQUFRLEtBQUssSUFBSSxLQUFLLG1CQUFtQjtBQUMvQyxRQUFJLGlDQUFpQyxFQUFFLGVBQWUsZ0JBQWdCO0FBQ2xFLFVBQUksQ0FBQyxJQUFJLE1BQU0sT0FBTztBQUNsQiw0QkFBb0Isd0JBQXdCLE1BQU0sSUFBSSxJQUFJO0FBQzlELFVBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLE1BQU0sT0FBTztBQUNoQywwQkFBa0Isd0JBQXdCLE1BQU0sSUFBSSxFQUFFO0FBQUEsSUFDOUQ7QUFDQSxTQUFLLFFBQVEsYUFBYSxRQUFRLE1BQU0sS0FBSyxNQUFNLEtBQUs7QUFDeEQsUUFBSSwrQkFBK0I7QUFDL0IsVUFBSTtBQUNBLHNCQUFjLGlCQUFpQjtBQUNuQyxVQUFJO0FBQ0Esc0JBQWMsZUFBZTtBQUFBLElBQ3JDO0FBQ0EsUUFBSSxJQUFJLFNBQVM7QUFDYixXQUFLLElBQUksVUFBVSxPQUFPLDJCQUEyQjtBQUFBLElBQ3pELE9BQ0s7QUFDRCxXQUFLLElBQUksVUFBVSxJQUFJLDJCQUEyQjtBQUNsRCxVQUFJLHVCQUF1QjtBQUN2QixxQ0FBNkIsSUFBSTtBQUFBLElBQ3pDO0FBQUEsRUFDSjtBQUNBLE9BQUssWUFBWSxnQkFBZ0I7QUFDakMsT0FBSyxZQUFZLGlCQUFpQjtBQUN0QztBQUlBLElBQU0sZ0NBQWdDLFVBQVUsVUFBVSxpQkFBaUI7QUFDM0UsU0FBUyx3QkFBd0IsTUFBTSxLQUFLO0FBQ3hDLE1BQUksRUFBRSxNQUFNLFFBQUFELFFBQU8sSUFBSSxLQUFLLFFBQVEsV0FBVyxLQUFLLENBQUM7QUFDckQsTUFBSSxRQUFRQSxVQUFTLEtBQUssV0FBVyxTQUFTLEtBQUssV0FBV0EsT0FBTSxJQUFJO0FBQ3hFLE1BQUksU0FBU0EsVUFBUyxLQUFLLFdBQVdBLFVBQVMsQ0FBQyxJQUFJO0FBQ3BELE1BQUksVUFBVSxTQUFTLE1BQU0sbUJBQW1CO0FBQzVDLFdBQU8sWUFBWSxLQUFLO0FBQzVCLE9BQUssQ0FBQyxTQUFTLE1BQU0sbUJBQW1CLGFBQ25DLENBQUMsVUFBVSxPQUFPLG1CQUFtQixVQUFVO0FBQ2hELFFBQUk7QUFDQSxhQUFPLFlBQVksS0FBSztBQUFBLGFBQ25CO0FBQ0wsYUFBTyxZQUFZLE1BQU07QUFBQSxFQUNqQztBQUNKO0FBQ0EsU0FBUyxZQUFZLFNBQVM7QUFDMUIsVUFBUSxrQkFBa0I7QUFDMUIsTUFBSSxVQUFVLFFBQVEsV0FBVztBQUM3QixZQUFRLFlBQVk7QUFDcEIsWUFBUSxlQUFlO0FBQUEsRUFDM0I7QUFDQSxTQUFPO0FBQ1g7QUFDQSxTQUFTLGNBQWMsU0FBUztBQUM1QixVQUFRLGtCQUFrQjtBQUMxQixNQUFJLFFBQVEsY0FBYztBQUN0QixZQUFRLFlBQVk7QUFDcEIsWUFBUSxlQUFlO0FBQUEsRUFDM0I7QUFDSjtBQUNBLFNBQVMsNkJBQTZCLE1BQU07QUFDeEMsTUFBSUMsT0FBTSxLQUFLLElBQUk7QUFDbkIsRUFBQUEsS0FBSSxvQkFBb0IsbUJBQW1CLEtBQUssTUFBTSxrQkFBa0I7QUFDeEUsTUFBSSxTQUFTLEtBQUssa0JBQWtCO0FBQ3BDLE1BQUksT0FBTyxPQUFPLFlBQVlELFVBQVMsT0FBTztBQUM5QyxFQUFBQyxLQUFJLGlCQUFpQixtQkFBbUIsS0FBSyxNQUFNLHFCQUFxQixNQUFNO0FBQzFFLFFBQUksT0FBTyxjQUFjLFFBQVEsT0FBTyxnQkFBZ0JELFNBQVE7QUFDNUQsTUFBQUMsS0FBSSxvQkFBb0IsbUJBQW1CLEtBQUssTUFBTSxrQkFBa0I7QUFDeEUsaUJBQVcsTUFBTTtBQUNiLFlBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLEtBQUssTUFBTSxVQUFVO0FBQ25ELGVBQUssSUFBSSxVQUFVLE9BQU8sMkJBQTJCO0FBQUEsTUFDN0QsR0FBRyxFQUFFO0FBQUEsSUFDVDtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBQ0EsU0FBUyxvQkFBb0IsTUFBTTtBQUMvQixNQUFJLFNBQVMsS0FBSyxhQUFhLEdBQUcsUUFBUSxTQUFTLFlBQVk7QUFDL0QsTUFBSSxPQUFPLEtBQUssY0FBYyxLQUFLLE1BQU0sS0FBSyxZQUFZO0FBQzFELE1BQUk7QUFDQSxVQUFNLE9BQU8sS0FBSyxZQUFZLFNBQVMsSUFBSSxJQUFJLENBQUM7QUFBQTtBQUVoRCxVQUFNLE9BQU8sTUFBTSxDQUFDO0FBQ3hCLFFBQU0sU0FBUyxLQUFLO0FBQ3BCLFNBQU8sZ0JBQWdCO0FBQ3ZCLFNBQU8sU0FBUyxLQUFLO0FBTXJCLE1BQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxNQUFNLFVBQVUsV0FBVyxNQUFNLGNBQWMsSUFBSTtBQUNqRSxTQUFLLFdBQVc7QUFDaEIsU0FBSyxXQUFXO0FBQUEsRUFDcEI7QUFDSjtBQUNBLFNBQVMsa0JBQWtCLE1BQU0sS0FBSztBQUNsQyxNQUFJLGVBQWUsZUFBZTtBQUM5QixRQUFJLE9BQU8sS0FBSyxRQUFRLE9BQU8sSUFBSSxJQUFJO0FBQ3ZDLFFBQUksUUFBUSxLQUFLLHNCQUFzQjtBQUNuQyx5QkFBbUIsSUFBSTtBQUN2QixVQUFJO0FBQ0EsYUFBSyxXQUFXO0FBQ3BCLFdBQUssdUJBQXVCO0FBQUEsSUFDaEM7QUFBQSxFQUNKLE9BQ0s7QUFDRCx1QkFBbUIsSUFBSTtBQUFBLEVBQzNCO0FBQ0o7QUFFQSxTQUFTLG1CQUFtQixNQUFNO0FBQzlCLE1BQUksS0FBSyxzQkFBc0I7QUFDM0IsUUFBSSxLQUFLLHFCQUFxQjtBQUMxQixXQUFLLHFCQUFxQixhQUFhO0FBQzNDLFNBQUssdUJBQXVCO0FBQUEsRUFDaEM7QUFDSjtBQUNBLFNBQVMsaUJBQWlCLE1BQU0sU0FBUyxPQUFPLE1BQU07QUFDbEQsU0FBTyxLQUFLLFNBQVMsMEJBQTBCLE9BQUssRUFBRSxNQUFNLFNBQVMsS0FBSyxDQUFDLEtBQ3BFLGNBQWMsUUFBUSxTQUFTLE9BQU8sSUFBSTtBQUNyRDtBQUNBLFNBQVMscUJBQXFCLE1BQU07QUFDaEMsTUFBSSxLQUFLLFlBQVksQ0FBQyxLQUFLLFNBQVM7QUFDaEMsV0FBTztBQUNYLFNBQU8sYUFBYSxJQUFJO0FBQzVCO0FBQ0EsU0FBUyxhQUFhLE1BQU07QUFDeEIsTUFBSSxNQUFNLEtBQUssa0JBQWtCO0FBQ2pDLE1BQUksQ0FBQyxJQUFJO0FBQ0wsV0FBTztBQUNYLE1BQUk7QUFJQSxXQUFPLEtBQUssSUFBSSxTQUFTLElBQUksV0FBVyxZQUFZLElBQUksSUFBSSxXQUFXLGFBQWEsSUFBSSxVQUFVLE1BQzdGLEtBQUssWUFBWSxLQUFLLElBQUksU0FBUyxJQUFJLFVBQVUsWUFBWSxJQUFJLElBQUksVUFBVSxhQUFhLElBQUksU0FBUztBQUFBLEVBQ2xILFNBQ08sR0FBRztBQUNOLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFDQSxTQUFTLG1CQUFtQixNQUFNO0FBQzlCLE1BQUksWUFBWSxLQUFLLFFBQVEsV0FBVyxLQUFLLE1BQU0sVUFBVSxRQUFRLENBQUM7QUFDdEUsTUFBSSxTQUFTLEtBQUssa0JBQWtCO0FBQ3BDLFNBQU8scUJBQXFCLFVBQVUsTUFBTSxVQUFVLFFBQVEsT0FBTyxZQUFZLE9BQU8sWUFBWTtBQUN4RztBQUVBLFNBQVMsbUJBQW1CLE9BQU8sS0FBSztBQUNwQyxNQUFJLEVBQUUsU0FBUyxNQUFNLElBQUksTUFBTTtBQUMvQixNQUFJLFFBQVEsTUFBTSxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUs7QUFDNUQsTUFBSSxTQUFTLENBQUMsTUFBTSxPQUFPLGdCQUFnQixRQUFRLE1BQU0sUUFBUSxNQUFNLElBQUksUUFBUSxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxPQUFPLENBQUMsSUFBSTtBQUMvSCxTQUFPLFVBQVUsVUFBVSxTQUFTLFFBQVEsR0FBRztBQUNuRDtBQUNBLFNBQVMsTUFBTSxNQUFNLEtBQUs7QUFDdEIsT0FBSyxTQUFTLEtBQUssTUFBTSxHQUFHLGFBQWEsR0FBRyxFQUFFLGVBQWUsQ0FBQztBQUM5RCxTQUFPO0FBQ1g7QUFDQSxTQUFTLG1CQUFtQixNQUFNLEtBQUssTUFBTTtBQUN6QyxNQUFJLE1BQU0sS0FBSyxNQUFNO0FBQ3JCLE1BQUksZUFBZSxlQUFlO0FBQzlCLFFBQUksS0FBSyxRQUFRLEdBQUcsSUFBSSxJQUFJO0FBQ3hCLFVBQUksRUFBRSxNQUFNLElBQUksS0FBSyxPQUFPLE1BQU0sYUFBYSxPQUFPLE1BQU0sSUFBSSxNQUFNLGFBQWEsTUFBTTtBQUN6RixVQUFJLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQyxLQUFLO0FBQzlCLGVBQU87QUFDWCxVQUFJLFdBQVcsS0FBSyxNQUFNLElBQUksUUFBUSxNQUFNLE1BQU0sS0FBSyxZQUFZLE1BQU0sSUFBSSxLQUFLLEVBQUU7QUFDcEYsYUFBTyxNQUFNLE1BQU0sSUFBSSxjQUFjLElBQUksU0FBUyxRQUFRLENBQUM7QUFBQSxJQUMvRCxXQUNTLENBQUMsSUFBSSxPQUFPO0FBQ2pCLGFBQU87QUFBQSxJQUNYLFdBQ1MsS0FBSyxlQUFlLE1BQU0sSUFBSSxZQUFZLFVBQVUsR0FBRztBQUM1RCxVQUFJLE9BQU8sbUJBQW1CLEtBQUssT0FBTyxHQUFHO0FBQzdDLFVBQUksUUFBUyxnQkFBZ0I7QUFDekIsZUFBTyxNQUFNLE1BQU0sSUFBSTtBQUMzQixhQUFPO0FBQUEsSUFDWCxXQUNTLEVBQUUsT0FBTyxLQUFLLFFBQVEsR0FBRyxJQUFJLEtBQUs7QUFDdkMsVUFBSSxRQUFRLElBQUksT0FBTyxPQUFPLE1BQU0sYUFBYSxPQUFPLE1BQU0sSUFBSSxNQUFNLGFBQWEsTUFBTSxXQUFXO0FBQ3RHLFVBQUksQ0FBQyxRQUFRLEtBQUs7QUFDZCxlQUFPO0FBQ1gsVUFBSSxVQUFVLE1BQU0sSUFBSSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU07QUFDMUQsVUFBSSxFQUFFLEtBQUssV0FBVyxPQUFPLEtBQUssUUFBUSxPQUFPLE9BQU8sTUFBTSxDQUFDLEtBQUs7QUFDaEUsZUFBTztBQUNYLFVBQUksY0FBYyxhQUFhLElBQUksR0FBRztBQUNsQyxlQUFPLE1BQU0sTUFBTSxJQUFJLGNBQWMsTUFBTSxJQUFJLEtBQUssTUFBTSxJQUFJLFFBQVEsTUFBTSxNQUFNLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQztBQUFBLE1BQzdHLFdBQ1MsUUFBUTtBQUliLGVBQU8sTUFBTSxNQUFNLElBQUksY0FBYyxLQUFLLE1BQU0sSUFBSSxRQUFRLE1BQU0sSUFBSSxVQUFVLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQztBQUFBLE1BQzdHLE9BQ0s7QUFDRCxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFBQSxFQUNKLFdBQ1MsZUFBZSxpQkFBaUIsSUFBSSxLQUFLLFVBQVU7QUFDeEQsV0FBTyxNQUFNLE1BQU0sSUFBSSxjQUFjLE1BQU0sSUFBSSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUM7QUFBQSxFQUN2RSxPQUNLO0FBQ0QsUUFBSSxPQUFPLG1CQUFtQixLQUFLLE9BQU8sR0FBRztBQUM3QyxRQUFJO0FBQ0EsYUFBTyxNQUFNLE1BQU0sSUFBSTtBQUMzQixXQUFPO0FBQUEsRUFDWDtBQUNKO0FBQ0EsU0FBUyxRQUFRLE1BQU07QUFDbkIsU0FBTyxLQUFLLFlBQVksSUFBSSxLQUFLLFVBQVUsU0FBUyxLQUFLLFdBQVc7QUFDeEU7QUFDQSxTQUFTLFlBQVksS0FBSyxLQUFLO0FBQzNCLE1BQUksT0FBTyxJQUFJO0FBQ2YsU0FBTyxRQUFRLEtBQUssUUFBUSxNQUFNLE1BQU0sS0FBSyxJQUFJLGVBQWUsSUFBSSxZQUFZO0FBQ3BGO0FBQ0EsU0FBUyxpQkFBaUIsTUFBTSxLQUFLO0FBQ2pDLFNBQU8sTUFBTSxJQUFJLHVCQUF1QixJQUFJLElBQUksc0JBQXNCLElBQUk7QUFDOUU7QUFHQSxTQUFTLHVCQUF1QixNQUFNO0FBQ2xDLE1BQUksTUFBTSxLQUFLLGtCQUFrQjtBQUNqQyxNQUFJLE9BQU8sSUFBSSxXQUFXRCxVQUFTLElBQUk7QUFDdkMsTUFBSSxDQUFDO0FBQ0Q7QUFDSixNQUFJLFVBQVUsWUFBWSxRQUFRO0FBSWxDLE1BQUksU0FBUyxLQUFLLFlBQVksS0FBS0EsVUFBUyxRQUFRLElBQUksS0FBSyxZQUFZLEtBQUssV0FBV0EsT0FBTSxHQUFHLEVBQUU7QUFDaEcsWUFBUTtBQUNaLGFBQVM7QUFDTCxRQUFJQSxVQUFTLEdBQUc7QUFDWixVQUFJLEtBQUssWUFBWSxHQUFHO0FBQ3BCO0FBQUEsTUFDSixPQUNLO0FBQ0QsWUFBSSxTQUFTLEtBQUssV0FBV0EsVUFBUyxDQUFDO0FBQ3ZDLFlBQUksWUFBWSxRQUFRLEVBQUUsR0FBRztBQUN6QixxQkFBVztBQUNYLHVCQUFhLEVBQUVBO0FBQUEsUUFDbkIsV0FDUyxPQUFPLFlBQVksR0FBRztBQUMzQixpQkFBTztBQUNQLFVBQUFBLFVBQVMsS0FBSyxVQUFVO0FBQUEsUUFDNUI7QUFFSTtBQUFBLE1BQ1I7QUFBQSxJQUNKLFdBQ1MsWUFBWSxJQUFJLEdBQUc7QUFDeEI7QUFBQSxJQUNKLE9BQ0s7QUFDRCxVQUFJLE9BQU8sS0FBSztBQUNoQixhQUFPLFFBQVEsWUFBWSxNQUFNLEVBQUUsR0FBRztBQUNsQyxtQkFBVyxLQUFLO0FBQ2hCLHFCQUFhLFNBQVMsSUFBSTtBQUMxQixlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUNBLFVBQUksQ0FBQyxNQUFNO0FBQ1AsZUFBTyxLQUFLO0FBQ1osWUFBSSxRQUFRLEtBQUs7QUFDYjtBQUNKLFFBQUFBLFVBQVM7QUFBQSxNQUNiLE9BQ0s7QUFDRCxlQUFPO0FBQ1AsUUFBQUEsVUFBUyxRQUFRLElBQUk7QUFBQSxNQUN6QjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBSTtBQUNBLGdCQUFZLE1BQU0sTUFBTUEsT0FBTTtBQUFBLFdBQ3pCO0FBQ0wsZ0JBQVksTUFBTSxVQUFVLFVBQVU7QUFDOUM7QUFHQSxTQUFTLHNCQUFzQixNQUFNO0FBQ2pDLE1BQUksTUFBTSxLQUFLLGtCQUFrQjtBQUNqQyxNQUFJLE9BQU8sSUFBSSxXQUFXQSxVQUFTLElBQUk7QUFDdkMsTUFBSSxDQUFDO0FBQ0Q7QUFDSixNQUFJLE1BQU0sUUFBUSxJQUFJO0FBQ3RCLE1BQUksVUFBVTtBQUNkLGFBQVM7QUFDTCxRQUFJQSxVQUFTLEtBQUs7QUFDZCxVQUFJLEtBQUssWUFBWTtBQUNqQjtBQUNKLFVBQUksUUFBUSxLQUFLLFdBQVdBLE9BQU07QUFDbEMsVUFBSSxZQUFZLE9BQU8sQ0FBQyxHQUFHO0FBQ3ZCLG1CQUFXO0FBQ1gscUJBQWEsRUFBRUE7QUFBQSxNQUNuQjtBQUVJO0FBQUEsSUFDUixXQUNTLFlBQVksSUFBSSxHQUFHO0FBQ3hCO0FBQUEsSUFDSixPQUNLO0FBQ0QsVUFBSSxPQUFPLEtBQUs7QUFDaEIsYUFBTyxRQUFRLFlBQVksTUFBTSxDQUFDLEdBQUc7QUFDakMsbUJBQVcsS0FBSztBQUNoQixxQkFBYSxTQUFTLElBQUksSUFBSTtBQUM5QixlQUFPLEtBQUs7QUFBQSxNQUNoQjtBQUNBLFVBQUksQ0FBQyxNQUFNO0FBQ1AsZUFBTyxLQUFLO0FBQ1osWUFBSSxRQUFRLEtBQUs7QUFDYjtBQUNKLFFBQUFBLFVBQVMsTUFBTTtBQUFBLE1BQ25CLE9BQ0s7QUFDRCxlQUFPO0FBQ1AsUUFBQUEsVUFBUztBQUNULGNBQU0sUUFBUSxJQUFJO0FBQUEsTUFDdEI7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQUk7QUFDQSxnQkFBWSxNQUFNLFVBQVUsVUFBVTtBQUM5QztBQUNBLFNBQVMsWUFBWSxLQUFLO0FBQ3RCLE1BQUksT0FBTyxJQUFJO0FBQ2YsU0FBTyxRQUFRLEtBQUssUUFBUSxLQUFLLEtBQUs7QUFDMUM7QUFDQSxTQUFTLGNBQWMsTUFBTUEsU0FBUTtBQUNqQyxTQUFPLFFBQVFBLFdBQVUsS0FBSyxXQUFXLFVBQVUsQ0FBQyxhQUFhLElBQUksR0FBRztBQUNwRSxJQUFBQSxVQUFTLFNBQVMsSUFBSSxJQUFJO0FBQzFCLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQ0EsU0FBTyxRQUFRQSxVQUFTLEtBQUssV0FBVyxRQUFRO0FBQzVDLFFBQUksT0FBTyxLQUFLLFdBQVdBLE9BQU07QUFDakMsUUFBSSxLQUFLLFlBQVk7QUFDakIsYUFBTztBQUNYLFFBQUksS0FBSyxZQUFZLEtBQUssS0FBSyxtQkFBbUI7QUFDOUM7QUFDSixXQUFPO0FBQ1AsSUFBQUEsVUFBUztBQUFBLEVBQ2I7QUFDSjtBQUNBLFNBQVMsZUFBZSxNQUFNQSxTQUFRO0FBQ2xDLFNBQU8sUUFBUSxDQUFDQSxXQUFVLENBQUMsYUFBYSxJQUFJLEdBQUc7QUFDM0MsSUFBQUEsVUFBUyxTQUFTLElBQUk7QUFDdEIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFDQSxTQUFPLFFBQVFBLFNBQVE7QUFDbkIsUUFBSSxPQUFPLEtBQUssV0FBV0EsVUFBUyxDQUFDO0FBQ3JDLFFBQUksS0FBSyxZQUFZO0FBQ2pCLGFBQU87QUFDWCxRQUFJLEtBQUssWUFBWSxLQUFLLEtBQUssbUJBQW1CO0FBQzlDO0FBQ0osV0FBTztBQUNQLElBQUFBLFVBQVMsS0FBSyxXQUFXO0FBQUEsRUFDN0I7QUFDSjtBQUNBLFNBQVMsWUFBWSxNQUFNLE1BQU1BLFNBQVE7QUFDckMsTUFBSSxLQUFLLFlBQVksR0FBRztBQUNwQixRQUFJLFFBQVE7QUFDWixRQUFJLFFBQVEsY0FBYyxNQUFNQSxPQUFNLEdBQUc7QUFDckMsYUFBTztBQUNQLE1BQUFBLFVBQVM7QUFBQSxJQUNiLFdBQ1MsU0FBUyxlQUFlLE1BQU1BLE9BQU0sR0FBRztBQUM1QyxhQUFPO0FBQ1AsTUFBQUEsVUFBUyxPQUFPLFVBQVU7QUFBQSxJQUM5QjtBQUFBLEVBQ0o7QUFDQSxNQUFJLE1BQU0sS0FBSyxhQUFhO0FBQzVCLE1BQUksbUJBQW1CLEdBQUcsR0FBRztBQUN6QixRQUFJLFFBQVEsU0FBUyxZQUFZO0FBQ2pDLFVBQU0sT0FBTyxNQUFNQSxPQUFNO0FBQ3pCLFVBQU0sU0FBUyxNQUFNQSxPQUFNO0FBQzNCLFFBQUksZ0JBQWdCO0FBQ3BCLFFBQUksU0FBUyxLQUFLO0FBQUEsRUFDdEIsV0FDUyxJQUFJLFFBQVE7QUFDakIsUUFBSSxPQUFPLE1BQU1BLE9BQU07QUFBQSxFQUMzQjtBQUNBLE9BQUssWUFBWSxnQkFBZ0I7QUFDakMsTUFBSSxFQUFFLE1BQU0sSUFBSTtBQUVoQixhQUFXLE1BQU07QUFDYixRQUFJLEtBQUssU0FBUztBQUNkLHFCQUFlLElBQUk7QUFBQSxFQUMzQixHQUFHLEVBQUU7QUFDVDtBQUNBLFNBQVMsY0FBYyxNQUFNLEtBQUs7QUFDOUIsTUFBSSxPQUFPLEtBQUssTUFBTSxJQUFJLFFBQVEsR0FBRztBQUNyQyxNQUFJLEVBQUUsVUFBVSxZQUFZLEtBQUssT0FBTyxlQUFlO0FBQ25ELFFBQUksU0FBUyxLQUFLLFlBQVksR0FBRztBQUNqQyxRQUFJLE1BQU0sS0FBSyxNQUFNLEdBQUc7QUFDcEIsVUFBSSxTQUFTLEtBQUssWUFBWSxNQUFNLENBQUM7QUFDckMsVUFBSSxPQUFPLE9BQU8sTUFBTSxPQUFPLFVBQVU7QUFDekMsVUFBSSxNQUFNLE9BQU8sT0FBTyxNQUFNLE9BQU8sVUFBVSxLQUFLLElBQUksT0FBTyxPQUFPLE9BQU8sSUFBSSxJQUFJO0FBQ2pGLGVBQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxRQUFRO0FBQUEsSUFDbkQ7QUFDQSxRQUFJLE1BQU0sS0FBSyxJQUFJLEdBQUc7QUFDbEIsVUFBSSxRQUFRLEtBQUssWUFBWSxNQUFNLENBQUM7QUFDcEMsVUFBSSxPQUFPLE1BQU0sTUFBTSxNQUFNLFVBQVU7QUFDdkMsVUFBSSxNQUFNLE9BQU8sT0FBTyxNQUFNLE9BQU8sVUFBVSxLQUFLLElBQUksTUFBTSxPQUFPLE9BQU8sSUFBSSxJQUFJO0FBQ2hGLGVBQU8sTUFBTSxPQUFPLE9BQU8sT0FBTyxRQUFRO0FBQUEsSUFDbEQ7QUFBQSxFQUNKO0FBQ0EsTUFBSSxXQUFXLGlCQUFpQixLQUFLLEdBQUcsRUFBRTtBQUMxQyxTQUFPLFlBQVksUUFBUSxRQUFRO0FBQ3ZDO0FBSUEsU0FBUyxpQkFBaUIsTUFBTSxLQUFLLE1BQU07QUFDdkMsTUFBSSxNQUFNLEtBQUssTUFBTTtBQUNyQixNQUFJLGVBQWUsaUJBQWlCLENBQUMsSUFBSSxTQUFTLEtBQUssUUFBUSxHQUFHLElBQUk7QUFDbEUsV0FBTztBQUNYLE1BQUksT0FBTyxLQUFLLFFBQVEsR0FBRyxJQUFJO0FBQzNCLFdBQU87QUFDWCxNQUFJLEVBQUUsT0FBTyxJQUFJLElBQUk7QUFDckIsTUFBSSxDQUFDLE1BQU0sT0FBTyxpQkFBaUIsS0FBSyxlQUFlLE1BQU0sSUFBSSxPQUFPLE1BQU0sR0FBRztBQUM3RSxRQUFJLE9BQU8sbUJBQW1CLEtBQUssT0FBTyxHQUFHO0FBQzdDLFFBQUksUUFBUyxnQkFBZ0I7QUFDekIsYUFBTyxNQUFNLE1BQU0sSUFBSTtBQUFBLEVBQy9CO0FBQ0EsTUFBSSxDQUFDLE1BQU0sT0FBTyxlQUFlO0FBQzdCLFFBQUksT0FBTyxNQUFNLElBQUksUUFBUTtBQUM3QixRQUFJLFNBQVMsZUFBZSxlQUFlLFVBQVUsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLFNBQVMsTUFBTSxHQUFHO0FBQ25HLFdBQU8sU0FBUyxNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQUEsRUFDMUM7QUFDQSxTQUFPO0FBQ1g7QUFDQSxTQUFTLDJCQUEyQixNQUFNLEtBQUs7QUFDM0MsTUFBSSxFQUFFLEtBQUssTUFBTSxxQkFBcUI7QUFDbEMsV0FBTztBQUNYLE1BQUksRUFBRSxPQUFPLFNBQVMsT0FBQWdCLE9BQU0sSUFBSSxLQUFLLE1BQU07QUFDM0MsTUFBSSxDQUFDLE1BQU0sV0FBVyxPQUFPO0FBQ3pCLFdBQU87QUFDWCxNQUFJLENBQUNBO0FBQ0QsV0FBTztBQUNYLE1BQUksS0FBSyxlQUFlLE1BQU0sSUFBSSxZQUFZLFVBQVU7QUFDcEQsV0FBTztBQUNYLE1BQUksV0FBVyxDQUFDLE1BQU0sZUFBZSxNQUFNLElBQUksTUFBTSxhQUFhLE1BQU07QUFDeEUsTUFBSSxZQUFZLENBQUMsU0FBUyxRQUFRO0FBQzlCLFFBQUlDLE1BQUssS0FBSyxNQUFNO0FBQ3BCLFFBQUksTUFBTTtBQUNOLE1BQUFBLElBQUcsT0FBTyxNQUFNLE1BQU0sU0FBUyxVQUFVLE1BQU0sR0FBRztBQUFBO0FBRWxELE1BQUFBLElBQUcsT0FBTyxNQUFNLEtBQUssTUFBTSxNQUFNLFNBQVMsUUFBUTtBQUN0RCxTQUFLLFNBQVNBLEdBQUU7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFDQSxTQUFPO0FBQ1g7QUFDQSxTQUFTLGVBQWUsTUFBTSxNQUFNLE9BQU87QUFDdkMsT0FBSyxZQUFZLEtBQUs7QUFDdEIsT0FBSyxrQkFBa0I7QUFDdkIsT0FBSyxZQUFZLE1BQU07QUFDM0I7QUFNQSxTQUFTLG1CQUFtQixNQUFNO0FBQzlCLE1BQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxVQUFVLE1BQU0sZUFBZTtBQUNyRCxXQUFPO0FBQ1gsTUFBSSxFQUFFLFdBQVcsWUFBWSxJQUFJLEtBQUssa0JBQWtCO0FBQ3hELE1BQUksYUFBYSxVQUFVLFlBQVksS0FBSyxlQUFlLEtBQ3ZELFVBQVUsY0FBYyxVQUFVLFdBQVcsbUJBQW1CLFNBQVM7QUFDekUsUUFBSSxRQUFRLFVBQVU7QUFDdEIsbUJBQWUsTUFBTSxPQUFPLE1BQU07QUFDbEMsZUFBVyxNQUFNLGVBQWUsTUFBTSxPQUFPLE9BQU8sR0FBRyxFQUFFO0FBQUEsRUFDN0Q7QUFDQSxTQUFPO0FBQ1g7QUFPQSxTQUFTLFFBQVEsT0FBTztBQUNwQixNQUFJLFNBQVM7QUFDYixNQUFJLE1BQU07QUFDTixjQUFVO0FBQ2QsTUFBSSxNQUFNO0FBQ04sY0FBVTtBQUNkLE1BQUksTUFBTTtBQUNOLGNBQVU7QUFDZCxNQUFJLE1BQU07QUFDTixjQUFVO0FBQ2QsU0FBTztBQUNYO0FBQ0EsU0FBUyxlQUFlLE1BQU0sT0FBTztBQUNqQyxNQUFJLE9BQU8sTUFBTSxTQUFTLE9BQU8sUUFBUSxLQUFLO0FBQzlDLE1BQUksUUFBUSxLQUFNLE9BQU8sUUFBUSxNQUFNLFFBQVEsS0FBTTtBQUNqRCxXQUFPLDJCQUEyQixNQUFNLEVBQUUsS0FBSyxpQkFBaUIsTUFBTSxFQUFFO0FBQUEsRUFDNUUsV0FDVSxRQUFRLE1BQU0sQ0FBQyxNQUFNLFlBQWMsT0FBTyxRQUFRLE1BQU0sUUFBUSxLQUFNO0FBQzVFLFdBQU8sMkJBQTJCLE1BQU0sQ0FBQyxLQUFLLGlCQUFpQixNQUFNLENBQUM7QUFBQSxFQUMxRSxXQUNTLFFBQVEsTUFBTSxRQUFRLElBQUk7QUFDL0IsV0FBTztBQUFBLEVBQ1gsV0FDUyxRQUFRLE1BQU8sT0FBTyxRQUFRLE1BQU0sUUFBUSxLQUFNO0FBQ3ZELFFBQUksTUFBTSxRQUFRLEtBQU0sY0FBYyxNQUFNLEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxRQUFRLEtBQUssSUFBSztBQUM1RixXQUFPLG1CQUFtQixNQUFNLEtBQUssSUFBSSxLQUFLLGlCQUFpQixNQUFNLEdBQUc7QUFBQSxFQUM1RSxXQUNTLFFBQVEsTUFBTyxPQUFPLFFBQVEsTUFBTSxRQUFRLEtBQU07QUFDdkQsUUFBSSxNQUFNLFFBQVEsS0FBTSxjQUFjLE1BQU0sS0FBSyxNQUFNLFVBQVUsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFNO0FBQzVGLFdBQU8sbUJBQW1CLE1BQU0sS0FBSyxJQUFJLEtBQUssaUJBQWlCLE1BQU0sR0FBRztBQUFBLEVBQzVFLFdBQ1MsUUFBUSxNQUFPLE9BQU8sUUFBUSxNQUFNLFFBQVEsS0FBTTtBQUN2RCxXQUFPLGlCQUFpQixNQUFNLElBQUksSUFBSSxLQUFLLGlCQUFpQixNQUFNLEVBQUU7QUFBQSxFQUN4RSxXQUNTLFFBQVEsTUFBTyxPQUFPLFFBQVEsTUFBTSxRQUFRLEtBQU07QUFDdkQsV0FBTyxtQkFBbUIsSUFBSSxLQUFLLGlCQUFpQixNQUFNLEdBQUcsSUFBSSxLQUFLLGlCQUFpQixNQUFNLENBQUM7QUFBQSxFQUNsRyxXQUNTLFNBQVMsTUFBTSxNQUFNLFNBQ3pCLFFBQVEsTUFBTSxRQUFRLE1BQU0sUUFBUSxNQUFNLFFBQVEsS0FBSztBQUN4RCxXQUFPO0FBQUEsRUFDWDtBQUNBLFNBQU87QUFDWDtBQUVBLFNBQVMsc0JBQXNCLE1BQU1DLFFBQU87QUFDeEMsT0FBSyxTQUFTLG1CQUFtQixPQUFLO0FBQUUsSUFBQUEsU0FBUSxFQUFFQSxRQUFPLElBQUk7QUFBQSxFQUFHLENBQUM7QUFDakUsTUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLFNBQVMsV0FBVyxRQUFRLElBQUlBO0FBQ3BELFNBQU8sWUFBWSxLQUFLLFVBQVUsS0FBSyxRQUFRLGNBQWMsS0FBSyxRQUFRLFdBQVcsY0FBYyxHQUFHO0FBQ2xHO0FBQ0E7QUFDQSxRQUFJLE9BQU8sUUFBUTtBQUNuQixZQUFRLEtBQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxTQUFTLEtBQUssS0FBSyxlQUFlLEtBQUssUUFBUSxJQUFJO0FBQ3JGLGNBQVUsS0FBSztBQUFBLEVBQ25CO0FBQ0EsTUFBSSxhQUFhLEtBQUssU0FBUyxxQkFBcUIsS0FBSyxjQUFjLFdBQVcsS0FBSyxNQUFNLE1BQU07QUFDbkcsTUFBSWpCLE9BQU0sWUFBWSxHQUFHUyxRQUFPVCxLQUFJLGNBQWMsS0FBSztBQUN2RCxFQUFBUyxNQUFLLFlBQVksV0FBVyxrQkFBa0IsU0FBUyxFQUFFLFVBQVVULEtBQUksQ0FBQyxDQUFDO0FBQ3pFLE1BQUksYUFBYVMsTUFBSyxZQUFZLFdBQVcsV0FBVztBQUN4RCxTQUFPLGNBQWMsV0FBVyxZQUFZLE1BQU0sWUFBWSxRQUFRLFdBQVcsU0FBUyxZQUFZLENBQUMsSUFBSTtBQUN2RyxhQUFTLElBQUksVUFBVSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDNUMsVUFBSSxVQUFVVCxLQUFJLGNBQWMsVUFBVSxDQUFDLENBQUM7QUFDNUMsYUFBT1MsTUFBSztBQUNSLGdCQUFRLFlBQVlBLE1BQUssVUFBVTtBQUN2QyxNQUFBQSxNQUFLLFlBQVksT0FBTztBQUN4QjtBQUFBLElBQ0o7QUFDQSxpQkFBYUEsTUFBSztBQUFBLEVBQ3RCO0FBQ0EsTUFBSSxjQUFjLFdBQVcsWUFBWTtBQUNyQyxlQUFXLGFBQWEsaUJBQWlCLEdBQUcsU0FBUyxJQUFJLE9BQU8sR0FBRyxXQUFXLEtBQUssUUFBUSxLQUFLLEVBQUUsSUFBSSxLQUFLLFVBQVUsT0FBTyxDQUFDLEVBQUU7QUFDbkksTUFBSSxPQUFPLEtBQUssU0FBUywyQkFBMkIsT0FBSyxFQUFFUSxRQUFPLElBQUksQ0FBQyxLQUNuRUEsT0FBTSxRQUFRLFlBQVksR0FBR0EsT0FBTSxRQUFRLE1BQU0sTUFBTTtBQUMzRCxTQUFPLEVBQUUsS0FBS1IsT0FBTSxLQUFLO0FBQzdCO0FBRUEsU0FBUyxtQkFBbUIsTUFBTSxNQUFNLE1BQU0sV0FBVyxVQUFVO0FBQy9ELE1BQUksU0FBUyxTQUFTLE9BQU8sS0FBSyxLQUFLO0FBQ3ZDLE1BQUksS0FBS1E7QUFDVCxNQUFJLENBQUMsUUFBUSxDQUFDO0FBQ1YsV0FBTztBQUNYLE1BQUksU0FBUyxTQUFTLGFBQWEsVUFBVSxDQUFDO0FBQzlDLE1BQUksUUFBUTtBQUNSLFNBQUssU0FBUyx1QkFBdUIsT0FBSztBQUFFLGFBQU8sRUFBRSxNQUFNLFVBQVUsV0FBVyxJQUFJO0FBQUEsSUFBRyxDQUFDO0FBQ3hGLFFBQUk7QUFDQSxhQUFPLE9BQU8sSUFBSSxNQUFNLFNBQVMsS0FBSyxLQUFLLE1BQU0sT0FBTyxLQUFLLEtBQUssUUFBUSxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksTUFBTTtBQUMvRyxRQUFJLFNBQVMsS0FBSyxTQUFTLHVCQUF1QixPQUFLLEVBQUUsTUFBTSxVQUFVLFdBQVcsSUFBSSxDQUFDO0FBQ3pGLFFBQUksUUFBUTtBQUNSLE1BQUFBLFNBQVE7QUFBQSxJQUNaLE9BQ0s7QUFDRCxVQUFJLFFBQVEsU0FBUyxNQUFNO0FBQzNCLFVBQUksRUFBRSxPQUFPLElBQUksS0FBSyxPQUFPLGFBQWEsY0FBYyxXQUFXLE1BQU07QUFDekUsWUFBTSxTQUFTLGNBQWMsS0FBSztBQUNsQyxXQUFLLE1BQU0sZUFBZSxFQUFFLFFBQVEsV0FBUztBQUN6QyxZQUFJLElBQUksSUFBSSxZQUFZLFNBQVMsY0FBYyxHQUFHLENBQUM7QUFDbkQsWUFBSTtBQUNBLFlBQUUsWUFBWSxXQUFXLGNBQWMsT0FBTyxLQUFLLE9BQU8sS0FBSyxDQUFDLENBQUM7QUFBQSxNQUN6RSxDQUFDO0FBQUEsSUFDTDtBQUFBLEVBQ0osT0FDSztBQUNELFNBQUssU0FBUyx1QkFBdUIsT0FBSztBQUFFLGFBQU8sRUFBRSxNQUFNLElBQUk7QUFBQSxJQUFHLENBQUM7QUFDbkUsVUFBTSxTQUFTLElBQUk7QUFDbkIsUUFBSTtBQUNBLDRCQUFzQixHQUFHO0FBQUEsRUFDakM7QUFDQSxNQUFJLGNBQWMsT0FBTyxJQUFJLGNBQWMsaUJBQWlCO0FBQzVELE1BQUksWUFBWSxlQUFlLGdDQUFnQyxLQUFLLFlBQVksYUFBYSxlQUFlLEtBQUssRUFBRTtBQUNuSCxNQUFJLGFBQWEsVUFBVSxDQUFDO0FBQ3hCLGFBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLO0FBQ3BDLFVBQUksUUFBUSxJQUFJO0FBQ2hCLGFBQU8sU0FBUyxNQUFNLFlBQVk7QUFDOUIsZ0JBQVEsTUFBTTtBQUNsQixVQUFJLENBQUM7QUFDRDtBQUNKLFlBQU07QUFBQSxJQUNWO0FBQ0osTUFBSSxDQUFDQSxRQUFPO0FBQ1IsUUFBSSxTQUFTLEtBQUssU0FBUyxpQkFBaUIsS0FBSyxLQUFLLFNBQVMsV0FBVyxLQUFLLFVBQVUsV0FBVyxLQUFLLE1BQU0sTUFBTTtBQUNySCxJQUFBQSxTQUFRLE9BQU8sV0FBVyxLQUFLO0FBQUEsTUFDM0Isb0JBQW9CLENBQUMsRUFBRSxVQUFVO0FBQUEsTUFDakMsU0FBUztBQUFBLE1BQ1QsYUFBYUMsTUFBSztBQUNkLFlBQUlBLEtBQUksWUFBWSxRQUFRLENBQUNBLEtBQUksZUFDN0JBLEtBQUksY0FBYyxDQUFDLGNBQWMsS0FBS0EsS0FBSSxXQUFXLFFBQVE7QUFDN0QsaUJBQU8sRUFBRSxRQUFRLEtBQUs7QUFDMUIsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBQ0EsTUFBSSxXQUFXO0FBQ1gsSUFBQUQsU0FBUSxXQUFXLFdBQVdBLFFBQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFBQSxFQUNwRixPQUNLO0FBQ0QsSUFBQUEsU0FBUSxNQUFNLFFBQVEsa0JBQWtCQSxPQUFNLFNBQVMsUUFBUSxHQUFHLElBQUk7QUFDdEUsUUFBSUEsT0FBTSxhQUFhQSxPQUFNLFNBQVM7QUFDbEMsVUFBSSxZQUFZLEdBQUcsVUFBVTtBQUM3QixlQUFTLE9BQU9BLE9BQU0sUUFBUSxZQUFZLFlBQVlBLE9BQU0sYUFBYSxDQUFDLEtBQUssS0FBSyxLQUFLLFdBQVcsYUFBYSxPQUFPLEtBQUssWUFBWTtBQUFBLE1BQUU7QUFDM0ksZUFBUyxPQUFPQSxPQUFNLFFBQVEsV0FBVyxVQUFVQSxPQUFNLFdBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxXQUFXLFdBQVcsT0FBTyxLQUFLLFdBQVc7QUFBQSxNQUFFO0FBQ25JLE1BQUFBLFNBQVEsV0FBV0EsUUFBTyxXQUFXLE9BQU87QUFBQSxJQUNoRDtBQUFBLEVBQ0o7QUFDQSxPQUFLLFNBQVMsbUJBQW1CLE9BQUs7QUFBRSxJQUFBQSxTQUFRLEVBQUVBLFFBQU8sSUFBSTtBQUFBLEVBQUcsQ0FBQztBQUNqRSxTQUFPQTtBQUNYO0FBQ0EsSUFBTSxnQkFBZ0I7QUFTdEIsU0FBUyxrQkFBa0IsVUFBVSxVQUFVO0FBQzNDLE1BQUksU0FBUyxhQUFhO0FBQ3RCLFdBQU87QUFDWCxXQUFTLElBQUksU0FBUyxPQUFPLEtBQUssR0FBRyxLQUFLO0FBQ3RDLFFBQUksU0FBUyxTQUFTLEtBQUssQ0FBQztBQUM1QixRQUFJLFFBQVEsT0FBTyxlQUFlLFNBQVMsTUFBTSxDQUFDLENBQUM7QUFDbkQsUUFBSSxVQUFVLFNBQVMsQ0FBQztBQUN4QixhQUFTLFFBQVEsVUFBUTtBQUNyQixVQUFJLENBQUM7QUFDRDtBQUNKLFVBQUlSLFFBQU8sTUFBTSxhQUFhLEtBQUssSUFBSSxHQUFHO0FBQzFDLFVBQUksQ0FBQ0E7QUFDRCxlQUFPLFNBQVM7QUFDcEIsVUFBSSxTQUFTLE9BQU8sVUFBVSxTQUFTLFVBQVUsYUFBYUEsT0FBTSxVQUFVLE1BQU0sT0FBTyxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRztBQUMvRyxlQUFPLE9BQU8sU0FBUyxDQUFDLElBQUk7QUFBQSxNQUNoQyxPQUNLO0FBQ0QsWUFBSSxPQUFPO0FBQ1AsaUJBQU8sT0FBTyxTQUFTLENBQUMsSUFBSSxXQUFXLE9BQU8sT0FBTyxTQUFTLENBQUMsR0FBRyxTQUFTLE1BQU07QUFDckYsWUFBSSxVQUFVLGFBQWEsTUFBTUEsS0FBSTtBQUNyQyxlQUFPLEtBQUssT0FBTztBQUNuQixnQkFBUSxNQUFNLFVBQVUsUUFBUSxJQUFJO0FBQ3BDLG1CQUFXQTtBQUFBLE1BQ2Y7QUFBQSxJQUNKLENBQUM7QUFDRCxRQUFJO0FBQ0EsYUFBTyxTQUFTLEtBQUssTUFBTTtBQUFBLEVBQ25DO0FBQ0EsU0FBTztBQUNYO0FBQ0EsU0FBUyxhQUFhLE1BQU1BLE9BQU1YLFFBQU8sR0FBRztBQUN4QyxXQUFTLElBQUlXLE1BQUssU0FBUyxHQUFHLEtBQUtYLE9BQU07QUFDckMsV0FBT1csTUFBSyxDQUFDLEVBQUUsT0FBTyxNQUFNLFNBQVMsS0FBSyxJQUFJLENBQUM7QUFDbkQsU0FBTztBQUNYO0FBR0EsU0FBUyxhQUFhQSxPQUFNLFVBQVUsTUFBTSxTQUFTLE9BQU87QUFDeEQsTUFBSSxRQUFRQSxNQUFLLFVBQVUsUUFBUSxTQUFTLFVBQVVBLE1BQUssS0FBSyxLQUFLLFNBQVMsS0FBSyxHQUFHO0FBQ2xGLFFBQUksUUFBUSxhQUFhQSxPQUFNLFVBQVUsTUFBTSxRQUFRLFdBQVcsUUFBUSxDQUFDO0FBQzNFLFFBQUk7QUFDQSxhQUFPLFFBQVEsS0FBSyxRQUFRLFFBQVEsYUFBYSxRQUFRLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDbkYsUUFBSSxRQUFRLFFBQVEsZUFBZSxRQUFRLFVBQVU7QUFDckQsUUFBSSxNQUFNLFVBQVUsU0FBU0EsTUFBSyxTQUFTLElBQUksS0FBSyxPQUFPQSxNQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ3RFLGFBQU8sUUFBUSxLQUFLLFFBQVEsUUFBUSxPQUFPLFNBQVMsS0FBSyxhQUFhLE1BQU1BLE9BQU0sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQUEsRUFDdEc7QUFDSjtBQUNBLFNBQVMsV0FBVyxNQUFNLE9BQU87QUFDN0IsTUFBSSxTQUFTO0FBQ1QsV0FBTztBQUNYLE1BQUksV0FBVyxLQUFLLFFBQVEsYUFBYSxLQUFLLGFBQWEsR0FBRyxXQUFXLEtBQUssV0FBVyxRQUFRLENBQUMsQ0FBQztBQUNuRyxNQUFJLE9BQU8sS0FBSyxlQUFlLEtBQUssVUFBVSxFQUFFLFdBQVcsU0FBUyxPQUFPLElBQUk7QUFDL0UsU0FBTyxLQUFLLEtBQUssU0FBUyxPQUFPLElBQUksQ0FBQztBQUMxQztBQUNBLFNBQVMsV0FBVyxVQUFVLE1BQU1YLE9BQU0sSUFBSSxPQUFPLFNBQVM7QUFDMUQsTUFBSSxPQUFPLE9BQU8sSUFBSSxTQUFTLGFBQWEsU0FBUyxXQUFXLFFBQVEsS0FBSztBQUM3RSxNQUFJLFNBQVMsYUFBYTtBQUN0QixjQUFVO0FBQ2QsTUFBSSxRQUFRLEtBQUs7QUFDYixZQUFRLFdBQVcsT0FBTyxNQUFNQSxPQUFNLElBQUksUUFBUSxHQUFHLE9BQU87QUFDaEUsTUFBSSxTQUFTQTtBQUNULFlBQVEsT0FBTyxJQUFJLEtBQUssZUFBZSxDQUFDLEVBQUUsV0FBVyxPQUFPLFdBQVcsS0FBSyxFQUFFLE9BQU8sS0FBSyxJQUNwRixNQUFNLE9BQU8sS0FBSyxlQUFlLEtBQUssVUFBVSxFQUFFLFdBQVcsU0FBUyxPQUFPLElBQUksQ0FBQztBQUM1RixTQUFPLFNBQVMsYUFBYSxPQUFPLElBQUksSUFBSSxTQUFTLGFBQWEsR0FBRyxLQUFLLEtBQUssS0FBSyxDQUFDO0FBQ3pGO0FBQ0EsU0FBUyxXQUFXbUIsUUFBTyxXQUFXLFNBQVM7QUFDM0MsTUFBSSxZQUFZQSxPQUFNO0FBQ2xCLElBQUFBLFNBQVEsSUFBSSxNQUFNLFdBQVdBLE9BQU0sU0FBUyxJQUFJLFdBQVdBLE9BQU0sV0FBVyxHQUFHQSxPQUFNLE9BQU8sR0FBRyxXQUFXQSxPQUFNLE9BQU87QUFDM0gsTUFBSSxVQUFVQSxPQUFNO0FBQ2hCLElBQUFBLFNBQVEsSUFBSSxNQUFNLFdBQVdBLE9BQU0sU0FBUyxHQUFHLFNBQVNBLE9BQU0sU0FBUyxHQUFHLENBQUMsR0FBR0EsT0FBTSxXQUFXLE9BQU87QUFDMUcsU0FBT0E7QUFDWDtBQUlBLElBQU0sVUFBVTtBQUFBLEVBQ1osT0FBTyxDQUFDLE9BQU87QUFBQSxFQUNmLE9BQU8sQ0FBQyxPQUFPO0FBQUEsRUFDZixPQUFPLENBQUMsT0FBTztBQUFBLEVBQ2YsU0FBUyxDQUFDLE9BQU87QUFBQSxFQUNqQixVQUFVLENBQUMsT0FBTztBQUFBLEVBQ2xCLEtBQUssQ0FBQyxTQUFTLFVBQVU7QUFBQSxFQUN6QixJQUFJLENBQUMsU0FBUyxPQUFPO0FBQUEsRUFDckIsSUFBSSxDQUFDLFNBQVMsU0FBUyxJQUFJO0FBQUEsRUFDM0IsSUFBSSxDQUFDLFNBQVMsU0FBUyxJQUFJO0FBQy9CO0FBQ0EsSUFBSSxlQUFlO0FBQ25CLFNBQVMsY0FBYztBQUNuQixTQUFPLGlCQUFpQixlQUFlLFNBQVMsZUFBZSxtQkFBbUIsT0FBTztBQUM3RjtBQUNBLFNBQVMsU0FBUyxNQUFNO0FBQ3BCLE1BQUksUUFBUSxzQkFBc0IsS0FBSyxJQUFJO0FBQzNDLE1BQUk7QUFDQSxXQUFPLEtBQUssTUFBTSxNQUFNLENBQUMsRUFBRSxNQUFNO0FBQ3JDLE1BQUksTUFBTSxZQUFZLEVBQUUsY0FBYyxLQUFLO0FBQzNDLE1BQUksV0FBVyxtQkFBbUIsS0FBSyxJQUFJLEdBQUdSO0FBQzlDLE1BQUlBLFFBQU8sWUFBWSxRQUFRLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQztBQUNwRCxXQUFPQSxNQUFLLElBQUksT0FBSyxNQUFNLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLE9BQU9BLE1BQUssSUFBSSxPQUFLLE9BQU8sSUFBSSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtBQUN6RyxNQUFJLFlBQVk7QUFDaEIsTUFBSUE7QUFDQSxhQUFTLElBQUksR0FBRyxJQUFJQSxNQUFLLFFBQVE7QUFDN0IsWUFBTSxJQUFJLGNBQWNBLE1BQUssQ0FBQyxDQUFDLEtBQUs7QUFDNUMsU0FBTztBQUNYO0FBTUEsU0FBUyxzQkFBc0IsS0FBSztBQUNoQyxNQUFJLFFBQVEsSUFBSSxpQkFBaUIsU0FBUyxtQ0FBbUMsNEJBQTRCO0FBQ3pHLFdBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsUUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixRQUFJLEtBQUssV0FBVyxVQUFVLEtBQUssS0FBSyxlQUFlLFVBQVksS0FBSztBQUNwRSxXQUFLLFdBQVcsYUFBYSxJQUFJLGNBQWMsZUFBZSxHQUFHLEdBQUcsSUFBSTtBQUFBLEVBQ2hGO0FBQ0o7QUFDQSxTQUFTLFdBQVdRLFFBQU8sU0FBUztBQUNoQyxNQUFJLENBQUNBLE9BQU07QUFDUCxXQUFPQTtBQUNYLE1BQUksU0FBU0EsT0FBTSxRQUFRLFdBQVcsS0FBSyxRQUFRO0FBQ25ELE1BQUk7QUFDQSxZQUFRLEtBQUssTUFBTSxPQUFPO0FBQUEsRUFDOUIsU0FDTyxHQUFHO0FBQ04sV0FBT0E7QUFBQSxFQUNYO0FBQ0EsTUFBSSxFQUFFLFNBQVMsV0FBVyxRQUFRLElBQUlBO0FBQ3RDLFdBQVMsSUFBSSxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHO0FBQzNDLFFBQUksT0FBTyxPQUFPLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFDaEMsUUFBSSxDQUFDLFFBQVEsS0FBSyxpQkFBaUI7QUFDL0I7QUFDSixjQUFVLFNBQVMsS0FBSyxLQUFLLE9BQU8sTUFBTSxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDMUQ7QUFDQTtBQUFBLEVBQ0o7QUFDQSxTQUFPLElBQUksTUFBTSxTQUFTLFdBQVcsT0FBTztBQUNoRDtBQUlBLElBQU0sV0FBVyxDQUFDO0FBQ2xCLElBQU0sZUFBZSxDQUFDO0FBQ3RCLElBQU0sa0JBQWtCLEVBQUUsWUFBWSxNQUFNLFdBQVcsS0FBSztBQUM1RCxJQUFNLGFBQU4sTUFBaUI7QUFBQSxFQUNiLGNBQWM7QUFDVixTQUFLLFdBQVc7QUFDaEIsU0FBSyxZQUFZO0FBQ2pCLFNBQUssY0FBYztBQUNuQixTQUFLLGtCQUFrQjtBQUN2QixTQUFLLFlBQVksRUFBRSxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUc7QUFDakQsU0FBSyxzQkFBc0I7QUFDM0IsU0FBSyxvQkFBb0I7QUFDekIsU0FBSyxlQUFlO0FBQ3BCLFNBQUssOEJBQThCO0FBQ25DLFNBQUssWUFBWTtBQUNqQixTQUFLLFlBQVk7QUFDakIsU0FBSyxvQkFBb0I7QUFDekIsU0FBSyxZQUFZO0FBQ2pCLFNBQUssbUJBQW1CO0FBQ3hCLFNBQUssbUJBQW1CLENBQUM7QUFDekIsU0FBSyxxQkFBcUI7QUFDMUIsU0FBSyxnQkFBZ0I7QUFFckIsU0FBSyw0QkFBNEI7QUFDakMsU0FBSyxpQkFBaUI7QUFDdEIsU0FBSyxnQkFBZ0IsdUJBQU8sT0FBTyxJQUFJO0FBQ3ZDLFNBQUsscUJBQXFCO0FBQUEsRUFDOUI7QUFDSjtBQUNBLFNBQVMsVUFBVSxNQUFNO0FBQ3JCLFdBQVMsU0FBUyxVQUFVO0FBQ3hCLFFBQUksVUFBVSxTQUFTLEtBQUs7QUFDNUIsU0FBSyxJQUFJLGlCQUFpQixPQUFPLEtBQUssTUFBTSxjQUFjLEtBQUssSUFBSSxDQUFDRSxXQUFVO0FBQzFFLFVBQUksbUJBQW1CLE1BQU1BLE1BQUssS0FBSyxDQUFDLGlCQUFpQixNQUFNQSxNQUFLLE1BQy9ELEtBQUssWUFBWSxFQUFFQSxPQUFNLFFBQVE7QUFDbEMsZ0JBQVEsTUFBTUEsTUFBSztBQUFBLElBQzNCLEdBQUcsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLFNBQVMsS0FBSyxJQUFJLE1BQVM7QUFBQSxFQUM3RDtBQUlBLE1BQUk7QUFDQSxTQUFLLElBQUksaUJBQWlCLFNBQVMsTUFBTSxJQUFJO0FBQ2pELGtCQUFnQixJQUFJO0FBQ3hCO0FBQ0EsU0FBUyxtQkFBbUIsTUFBTSxRQUFRO0FBQ3RDLE9BQUssTUFBTSxzQkFBc0I7QUFDakMsT0FBSyxNQUFNLG9CQUFvQixLQUFLLElBQUk7QUFDNUM7QUFDQSxTQUFTLGFBQWEsTUFBTTtBQUN4QixPQUFLLFlBQVksS0FBSztBQUN0QixXQUFTLFFBQVEsS0FBSyxNQUFNO0FBQ3hCLFNBQUssSUFBSSxvQkFBb0IsTUFBTSxLQUFLLE1BQU0sY0FBYyxJQUFJLENBQUM7QUFDckUsZUFBYSxLQUFLLE1BQU0sZ0JBQWdCO0FBQ3hDLGVBQWEsS0FBSyxNQUFNLDJCQUEyQjtBQUN2RDtBQUNBLFNBQVMsZ0JBQWdCLE1BQU07QUFDM0IsT0FBSyxTQUFTLG1CQUFtQixxQkFBbUI7QUFDaEQsYUFBUyxRQUFRO0FBQ2IsVUFBSSxDQUFDLEtBQUssTUFBTSxjQUFjLElBQUk7QUFDOUIsYUFBSyxJQUFJLGlCQUFpQixNQUFNLEtBQUssTUFBTSxjQUFjLElBQUksSUFBSSxXQUFTLGlCQUFpQixNQUFNLEtBQUssQ0FBQztBQUFBLEVBQ25ILENBQUM7QUFDTDtBQUNBLFNBQVMsaUJBQWlCLE1BQU0sT0FBTztBQUNuQyxTQUFPLEtBQUssU0FBUyxtQkFBbUIsQ0FBQUMsY0FBWTtBQUNoRCxRQUFJLFVBQVVBLFVBQVMsTUFBTSxJQUFJO0FBQ2pDLFdBQU8sVUFBVSxRQUFRLE1BQU0sS0FBSyxLQUFLLE1BQU0sbUJBQW1CO0FBQUEsRUFDdEUsQ0FBQztBQUNMO0FBQ0EsU0FBUyxtQkFBbUIsTUFBTSxPQUFPO0FBQ3JDLE1BQUksQ0FBQyxNQUFNO0FBQ1AsV0FBTztBQUNYLE1BQUksTUFBTTtBQUNOLFdBQU87QUFDWCxXQUFTLE9BQU8sTUFBTSxRQUFRLFFBQVEsS0FBSyxLQUFLLE9BQU8sS0FBSztBQUN4RCxRQUFJLENBQUMsUUFBUSxLQUFLLFlBQVksTUFDekIsS0FBSyxjQUFjLEtBQUssV0FBVyxVQUFVLEtBQUs7QUFDbkQsYUFBTztBQUNmLFNBQU87QUFDWDtBQUNBLFNBQVMsY0FBYyxNQUFNLE9BQU87QUFDaEMsTUFBSSxDQUFDLGlCQUFpQixNQUFNLEtBQUssS0FBSyxTQUFTLE1BQU0sSUFBSSxNQUNwRCxLQUFLLFlBQVksRUFBRSxNQUFNLFFBQVE7QUFDbEMsYUFBUyxNQUFNLElBQUksRUFBRSxNQUFNLEtBQUs7QUFDeEM7QUFDQSxhQUFhLFVBQVUsQ0FBQyxNQUFNLFdBQVc7QUFDckMsTUFBSSxRQUFRO0FBQ1osT0FBSyxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sTUFBTTtBQUNuRCxNQUFJLG9CQUFvQixNQUFNLEtBQUs7QUFDL0I7QUFDSixPQUFLLE1BQU0sY0FBYyxNQUFNO0FBQy9CLE9BQUssTUFBTSxrQkFBa0IsS0FBSyxJQUFJO0FBSXRDLE1BQUksV0FBVyxVQUFVLE1BQU0sV0FBVztBQUN0QztBQUNKLE1BQUksTUFBTSxXQUFXO0FBQ2pCLFNBQUssWUFBWSxXQUFXO0FBS2hDLE1BQUksT0FBTyxNQUFNLFdBQVcsTUFBTSxDQUFDLE1BQU0sV0FBVyxDQUFDLE1BQU0sVUFBVSxDQUFDLE1BQU0sU0FBUztBQUNqRixRQUFJLE1BQU0sS0FBSyxJQUFJO0FBQ25CLFNBQUssTUFBTSxlQUFlO0FBQzFCLFNBQUssTUFBTSw4QkFBOEIsV0FBVyxNQUFNO0FBQ3RELFVBQUksS0FBSyxNQUFNLGdCQUFnQixLQUFLO0FBQ2hDLGFBQUssU0FBUyxpQkFBaUIsT0FBSyxFQUFFLE1BQU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ2xFLGFBQUssTUFBTSxlQUFlO0FBQUEsTUFDOUI7QUFBQSxJQUNKLEdBQUcsR0FBRztBQUFBLEVBQ1YsV0FDUyxLQUFLLFNBQVMsaUJBQWlCLE9BQUssRUFBRSxNQUFNLEtBQUssQ0FBQyxLQUFLLGVBQWUsTUFBTSxLQUFLLEdBQUc7QUFDekYsVUFBTSxlQUFlO0FBQUEsRUFDekIsT0FDSztBQUNELHVCQUFtQixNQUFNLEtBQUs7QUFBQSxFQUNsQztBQUNKO0FBQ0EsYUFBYSxRQUFRLENBQUMsTUFBTSxVQUFVO0FBQ2xDLE1BQUksTUFBTSxXQUFXO0FBQ2pCLFNBQUssTUFBTSxXQUFXO0FBQzlCO0FBQ0EsYUFBYSxXQUFXLENBQUMsTUFBTSxXQUFXO0FBQ3RDLE1BQUksUUFBUTtBQUNaLE1BQUksb0JBQW9CLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxZQUMzQyxNQUFNLFdBQVcsQ0FBQyxNQUFNLFVBQVUsT0FBTyxNQUFNO0FBQy9DO0FBQ0osTUFBSSxLQUFLLFNBQVMsa0JBQWtCLE9BQUssRUFBRSxNQUFNLEtBQUssQ0FBQyxHQUFHO0FBQ3RELFVBQU0sZUFBZTtBQUNyQjtBQUFBLEVBQ0o7QUFDQSxNQUFJLE1BQU0sS0FBSyxNQUFNO0FBQ3JCLE1BQUksRUFBRSxlQUFlLGtCQUFrQixDQUFDLElBQUksTUFBTSxXQUFXLElBQUksR0FBRyxHQUFHO0FBQ25FLFFBQUksT0FBTyxPQUFPLGFBQWEsTUFBTSxRQUFRO0FBQzdDLFFBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxTQUFTLG1CQUFtQixPQUFLLEVBQUUsTUFBTSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUM7QUFDeEcsV0FBSyxTQUFTLEtBQUssTUFBTSxHQUFHLFdBQVcsSUFBSSxFQUFFLGVBQWUsQ0FBQztBQUNqRSxVQUFNLGVBQWU7QUFBQSxFQUN6QjtBQUNKO0FBQ0EsU0FBUyxZQUFZLE9BQU87QUFBRSxTQUFPLEVBQUUsTUFBTSxNQUFNLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFBRztBQUNsRixTQUFTLE9BQU8sT0FBTyxPQUFPO0FBQzFCLE1BQUksS0FBSyxNQUFNLElBQUksTUFBTSxTQUFTLEtBQUssTUFBTSxJQUFJLE1BQU07QUFDdkQsU0FBTyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQy9CO0FBQ0EsU0FBUyxvQkFBb0IsTUFBTSxVQUFVLEtBQUssUUFBUSxPQUFPO0FBQzdELE1BQUksVUFBVTtBQUNWLFdBQU87QUFDWCxNQUFJLE9BQU8sS0FBSyxNQUFNLElBQUksUUFBUSxNQUFNO0FBQ3hDLFdBQVMsSUFBSSxLQUFLLFFBQVEsR0FBRyxJQUFJLEdBQUcsS0FBSztBQUNyQyxRQUFJLEtBQUssU0FBUyxVQUFVLE9BQUssSUFBSSxLQUFLLFFBQVEsRUFBRSxNQUFNLEtBQUssS0FBSyxXQUFXLEtBQUssT0FBTyxDQUFDLEdBQUcsT0FBTyxJQUFJLElBQ3BHLEVBQUUsTUFBTSxLQUFLLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxPQUFPLEtBQUssQ0FBQztBQUMxRCxhQUFPO0FBQUEsRUFDZjtBQUNBLFNBQU87QUFDWDtBQUNBLFNBQVMsZ0JBQWdCLE1BQU0sV0FBVyxRQUFRO0FBQzlDLE1BQUksQ0FBQyxLQUFLO0FBQ04sU0FBSyxNQUFNO0FBQ2YsTUFBSUosTUFBSyxLQUFLLE1BQU0sR0FBRyxhQUFhLFNBQVM7QUFDN0MsTUFBSSxVQUFVO0FBQ1YsSUFBQUEsSUFBRyxRQUFRLFdBQVcsSUFBSTtBQUM5QixPQUFLLFNBQVNBLEdBQUU7QUFDcEI7QUFDQSxTQUFTLGtCQUFrQixNQUFNLFFBQVE7QUFDckMsTUFBSSxVQUFVO0FBQ1YsV0FBTztBQUNYLE1BQUksT0FBTyxLQUFLLE1BQU0sSUFBSSxRQUFRLE1BQU0sR0FBRyxPQUFPLEtBQUs7QUFDdkQsTUFBSSxRQUFRLEtBQUssVUFBVSxjQUFjLGFBQWEsSUFBSSxHQUFHO0FBQ3pELG9CQUFnQixNQUFNLElBQUksY0FBYyxJQUFJLEdBQUcsU0FBUztBQUN4RCxXQUFPO0FBQUEsRUFDWDtBQUNBLFNBQU87QUFDWDtBQUNBLFNBQVMsa0JBQWtCLE1BQU0sUUFBUTtBQUNyQyxNQUFJLFVBQVU7QUFDVixXQUFPO0FBQ1gsTUFBSSxNQUFNLEtBQUssTUFBTSxXQUFXLGNBQWM7QUFDOUMsTUFBSSxlQUFlO0FBQ2YsbUJBQWUsSUFBSTtBQUN2QixNQUFJLE9BQU8sS0FBSyxNQUFNLElBQUksUUFBUSxNQUFNO0FBQ3hDLFdBQVMsSUFBSSxLQUFLLFFBQVEsR0FBRyxJQUFJLEdBQUcsS0FBSztBQUNyQyxRQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsS0FBSyxZQUFZLEtBQUssS0FBSyxDQUFDO0FBQ3hELFFBQUksY0FBYyxhQUFhLElBQUksR0FBRztBQUNsQyxVQUFJLGdCQUFnQixJQUFJLE1BQU0sUUFBUSxLQUNsQyxLQUFLLElBQUksTUFBTSxTQUFTLEtBQUssT0FBTyxJQUFJLE1BQU0sUUFBUSxDQUFDLEtBQUssSUFBSSxNQUFNO0FBQ3RFLG1CQUFXLEtBQUssT0FBTyxJQUFJLE1BQU0sS0FBSztBQUFBO0FBRXRDLG1CQUFXLEtBQUssT0FBTyxDQUFDO0FBQzVCO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFJLFlBQVksTUFBTTtBQUNsQixvQkFBZ0IsTUFBTSxjQUFjLE9BQU8sS0FBSyxNQUFNLEtBQUssUUFBUSxHQUFHLFNBQVM7QUFDL0UsV0FBTztBQUFBLEVBQ1gsT0FDSztBQUNELFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFDQSxTQUFTLGtCQUFrQixNQUFNLEtBQUssUUFBUSxPQUFPLFlBQVk7QUFDN0QsU0FBTyxvQkFBb0IsTUFBTSxpQkFBaUIsS0FBSyxRQUFRLEtBQUssS0FDaEUsS0FBSyxTQUFTLGVBQWUsT0FBSyxFQUFFLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFDcEQsYUFBYSxrQkFBa0IsTUFBTSxNQUFNLElBQUksa0JBQWtCLE1BQU0sTUFBTTtBQUN0RjtBQUNBLFNBQVMsa0JBQWtCLE1BQU0sS0FBSyxRQUFRLE9BQU87QUFDakQsU0FBTyxvQkFBb0IsTUFBTSx1QkFBdUIsS0FBSyxRQUFRLEtBQUssS0FDdEUsS0FBSyxTQUFTLHFCQUFxQixPQUFLLEVBQUUsTUFBTSxLQUFLLEtBQUssQ0FBQztBQUNuRTtBQUNBLFNBQVMsa0JBQWtCLE1BQU0sS0FBSyxRQUFRLE9BQU87QUFDakQsU0FBTyxvQkFBb0IsTUFBTSx1QkFBdUIsS0FBSyxRQUFRLEtBQUssS0FDdEUsS0FBSyxTQUFTLHFCQUFxQixPQUFLLEVBQUUsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUMzRCxtQkFBbUIsTUFBTSxRQUFRLEtBQUs7QUFDOUM7QUFDQSxTQUFTLG1CQUFtQixNQUFNLFFBQVEsT0FBTztBQUM3QyxNQUFJLE1BQU0sVUFBVTtBQUNoQixXQUFPO0FBQ1gsTUFBSWhCLE9BQU0sS0FBSyxNQUFNO0FBQ3JCLE1BQUksVUFBVSxJQUFJO0FBQ2QsUUFBSUEsS0FBSSxlQUFlO0FBQ25CLHNCQUFnQixNQUFNLGNBQWMsT0FBT0EsTUFBSyxHQUFHQSxLQUFJLFFBQVEsSUFBSSxHQUFHLFNBQVM7QUFDL0UsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNBLE1BQUksT0FBT0EsS0FBSSxRQUFRLE1BQU07QUFDN0IsV0FBUyxJQUFJLEtBQUssUUFBUSxHQUFHLElBQUksR0FBRyxLQUFLO0FBQ3JDLFFBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxLQUFLLFlBQVksS0FBSyxLQUFLLENBQUM7QUFDeEQsUUFBSSxVQUFVLEtBQUssT0FBTyxDQUFDO0FBQzNCLFFBQUksS0FBSztBQUNMLHNCQUFnQixNQUFNLGNBQWMsT0FBT0EsTUFBSyxVQUFVLEdBQUcsVUFBVSxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsU0FBUztBQUFBLGFBQ25HLGNBQWMsYUFBYSxJQUFJO0FBQ3BDLHNCQUFnQixNQUFNLGNBQWMsT0FBT0EsTUFBSyxPQUFPLEdBQUcsU0FBUztBQUFBO0FBRW5FO0FBQ0osV0FBTztBQUFBLEVBQ1g7QUFDSjtBQUNBLFNBQVMsY0FBYyxNQUFNO0FBQ3pCLFNBQU8sZUFBZSxJQUFJO0FBQzlCO0FBQ0EsSUFBTSxxQkFBcUIsTUFBTSxZQUFZO0FBQzdDLFNBQVMsWUFBWSxDQUFDLE1BQU0sV0FBVztBQUNuQyxNQUFJLFFBQVE7QUFDWixPQUFLLE1BQU0sV0FBVyxNQUFNO0FBQzVCLE1BQUksVUFBVSxjQUFjLElBQUk7QUFDaEMsTUFBSSxNQUFNLEtBQUssSUFBSSxHQUFHLE9BQU87QUFDN0IsTUFBSSxNQUFNLEtBQUssTUFBTSxVQUFVLE9BQU8sT0FBTyxPQUFPLE9BQU8sS0FBSyxNQUFNLFNBQVMsS0FBSyxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7QUFDNUcsUUFBSSxLQUFLLE1BQU0sVUFBVSxRQUFRO0FBQzdCLGFBQU87QUFBQSxhQUNGLEtBQUssTUFBTSxVQUFVLFFBQVE7QUFDbEMsYUFBTztBQUFBLEVBQ2Y7QUFDQSxPQUFLLE1BQU0sWUFBWSxFQUFFLE1BQU0sS0FBSyxHQUFHLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxLQUFLO0FBQzdFLE1BQUksTUFBTSxLQUFLLFlBQVksWUFBWSxLQUFLLENBQUM7QUFDN0MsTUFBSSxDQUFDO0FBQ0Q7QUFDSixNQUFJLFFBQVEsZUFBZTtBQUN2QixRQUFJLEtBQUssTUFBTTtBQUNYLFdBQUssTUFBTSxVQUFVLEtBQUs7QUFDOUIsU0FBSyxNQUFNLFlBQVksSUFBSSxVQUFVLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxPQUFPO0FBQUEsRUFDcEUsWUFDVSxRQUFRLGdCQUFnQixvQkFBb0IsbUJBQW1CLE1BQU0sSUFBSSxLQUFLLElBQUksUUFBUSxLQUFLLEdBQUc7QUFDeEcsVUFBTSxlQUFlO0FBQUEsRUFDekIsT0FDSztBQUNELHVCQUFtQixNQUFNLFNBQVM7QUFBQSxFQUN0QztBQUNKO0FBQ0EsSUFBTSxZQUFOLE1BQWdCO0FBQUEsRUFDWixZQUFZLE1BQU0sS0FBSyxPQUFPLFNBQVM7QUFDbkMsU0FBSyxPQUFPO0FBQ1osU0FBSyxNQUFNO0FBQ1gsU0FBSyxRQUFRO0FBQ2IsU0FBSyxVQUFVO0FBQ2YsU0FBSyx1QkFBdUI7QUFDNUIsU0FBSyxZQUFZO0FBQ2pCLFNBQUssV0FBVyxLQUFLLE1BQU07QUFDM0IsU0FBSyxhQUFhLENBQUMsQ0FBQyxNQUFNLGtCQUFrQjtBQUM1QyxTQUFLLGVBQWUsTUFBTTtBQUMxQixRQUFJLFlBQVk7QUFDaEIsUUFBSSxJQUFJLFNBQVMsSUFBSTtBQUNqQixtQkFBYSxLQUFLLE1BQU0sSUFBSSxPQUFPLElBQUksTUFBTTtBQUM3QyxrQkFBWSxJQUFJO0FBQUEsSUFDcEIsT0FDSztBQUNELFVBQUksT0FBTyxLQUFLLE1BQU0sSUFBSSxRQUFRLElBQUksR0FBRztBQUN6QyxtQkFBYSxLQUFLO0FBQ2xCLGtCQUFZLEtBQUssUUFBUSxLQUFLLE9BQU8sSUFBSTtBQUFBLElBQzdDO0FBQ0EsVUFBTSxTQUFTLFVBQVUsT0FBTyxNQUFNO0FBQ3RDLFVBQU0sYUFBYSxTQUFTLEtBQUssUUFBUSxZQUFZLFFBQVEsSUFBSSxJQUFJO0FBQ3JFLFNBQUssU0FBUyxhQUFhLFdBQVcsTUFBTTtBQUM1QyxRQUFJLEVBQUUsVUFBVSxJQUFJLEtBQUs7QUFDekIsUUFBSSxNQUFNLFVBQVUsS0FDaEIsV0FBVyxLQUFLLEtBQUssYUFBYSxXQUFXLEtBQUssS0FBSyxlQUFlLFNBQ3RFLHFCQUFxQixpQkFBaUIsVUFBVSxRQUFRLGFBQWEsVUFBVSxLQUFLO0FBQ3BGLFdBQUssWUFBWTtBQUFBLFFBQ2IsTUFBTTtBQUFBLFFBQ04sS0FBSztBQUFBLFFBQ0wsU0FBUyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsS0FBSyxPQUFPO0FBQUEsUUFDeEMsZUFBZSxDQUFDLEVBQUUsS0FBSyxVQUFVLFNBQVMsQ0FBQyxLQUFLLE9BQU8sYUFBYSxpQkFBaUI7QUFBQSxNQUN6RjtBQUNKLFFBQUksS0FBSyxVQUFVLEtBQUssY0FBYyxLQUFLLFVBQVUsV0FBVyxLQUFLLFVBQVUsZ0JBQWdCO0FBQzNGLFdBQUssS0FBSyxZQUFZLEtBQUs7QUFDM0IsVUFBSSxLQUFLLFVBQVU7QUFDZixhQUFLLE9BQU8sWUFBWTtBQUM1QixVQUFJLEtBQUssVUFBVTtBQUNmLG1CQUFXLE1BQU07QUFDYixjQUFJLEtBQUssS0FBSyxNQUFNLGFBQWE7QUFDN0IsaUJBQUssT0FBTyxhQUFhLG1CQUFtQixPQUFPO0FBQUEsUUFDM0QsR0FBRyxFQUFFO0FBQ1QsV0FBSyxLQUFLLFlBQVksTUFBTTtBQUFBLElBQ2hDO0FBQ0EsU0FBSyxLQUFLLGlCQUFpQixXQUFXLEtBQUssS0FBSyxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDbEUsU0FBSyxLQUFLLGlCQUFpQixhQUFhLEtBQUssT0FBTyxLQUFLLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDeEUsdUJBQW1CLE1BQU0sU0FBUztBQUFBLEVBQ3RDO0FBQUEsRUFDQSxPQUFPO0FBQ0gsU0FBSyxLQUFLLEtBQUssb0JBQW9CLFdBQVcsS0FBSyxFQUFFO0FBQ3JELFNBQUssS0FBSyxLQUFLLG9CQUFvQixhQUFhLEtBQUssSUFBSTtBQUN6RCxRQUFJLEtBQUssYUFBYSxLQUFLLFFBQVE7QUFDL0IsV0FBSyxLQUFLLFlBQVksS0FBSztBQUMzQixVQUFJLEtBQUssVUFBVTtBQUNmLGFBQUssT0FBTyxnQkFBZ0IsV0FBVztBQUMzQyxVQUFJLEtBQUssVUFBVTtBQUNmLGFBQUssT0FBTyxnQkFBZ0IsaUJBQWlCO0FBQ2pELFdBQUssS0FBSyxZQUFZLE1BQU07QUFBQSxJQUNoQztBQUNBLFFBQUksS0FBSztBQUNMLGlCQUFXLE1BQU0sZUFBZSxLQUFLLElBQUksQ0FBQztBQUM5QyxTQUFLLEtBQUssTUFBTSxZQUFZO0FBQUEsRUFDaEM7QUFBQSxFQUNBLEdBQUcsT0FBTztBQUNOLFNBQUssS0FBSztBQUNWLFFBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxTQUFTLE1BQU0sTUFBTTtBQUNwQztBQUNKLFFBQUksTUFBTSxLQUFLO0FBQ2YsUUFBSSxLQUFLLEtBQUssTUFBTSxPQUFPLEtBQUs7QUFDNUIsWUFBTSxLQUFLLEtBQUssWUFBWSxZQUFZLEtBQUssQ0FBQztBQUNsRCxTQUFLLG1CQUFtQixLQUFLO0FBQzdCLFFBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO0FBQzNCLHlCQUFtQixLQUFLLE1BQU0sU0FBUztBQUFBLElBQzNDLFdBQ1Msa0JBQWtCLEtBQUssTUFBTSxJQUFJLEtBQUssSUFBSSxRQUFRLE9BQU8sS0FBSyxVQUFVLEdBQUc7QUFDaEYsWUFBTSxlQUFlO0FBQUEsSUFDekIsV0FDUyxNQUFNLFVBQVUsTUFDcEIsS0FBSztBQUFBLElBRUQsVUFBVSxLQUFLLGFBQWEsQ0FBQyxLQUFLLFVBQVUsS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBUWpELFVBQVUsQ0FBQyxLQUFLLEtBQUssTUFBTSxVQUFVLFdBQ2xDLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssS0FBSyxNQUFNLFVBQVUsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxLQUFLLE1BQU0sVUFBVSxFQUFFLENBQUMsS0FBSyxJQUFLO0FBQy9ILHNCQUFnQixLQUFLLE1BQU0sVUFBVSxLQUFLLEtBQUssS0FBSyxNQUFNLElBQUksUUFBUSxJQUFJLEdBQUcsQ0FBQyxHQUFHLFNBQVM7QUFDMUYsWUFBTSxlQUFlO0FBQUEsSUFDekIsT0FDSztBQUNELHlCQUFtQixLQUFLLE1BQU0sU0FBUztBQUFBLElBQzNDO0FBQUEsRUFDSjtBQUFBLEVBQ0EsS0FBSyxPQUFPO0FBQ1IsU0FBSyxtQkFBbUIsS0FBSztBQUM3Qix1QkFBbUIsS0FBSyxNQUFNLFNBQVM7QUFDdkMsUUFBSSxNQUFNLFdBQVc7QUFDakIsV0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUNBLG1CQUFtQixPQUFPO0FBQ3RCLFFBQUksQ0FBQyxLQUFLLGlCQUFpQixLQUFLLElBQUksS0FBSyxNQUFNLElBQUksTUFBTSxPQUFPLElBQUksS0FDaEUsS0FBSyxJQUFJLEtBQUssTUFBTSxJQUFJLE1BQU0sT0FBTyxJQUFJO0FBQ3pDLFdBQUssZUFBZTtBQUFBLEVBQzVCO0FBQ0o7QUFDQSxTQUFTLGFBQWEsVUFBUTtBQUMxQixPQUFLLE1BQU0sWUFBWSxLQUFLLElBQUk7QUFDaEMsZ0JBQWMsSUFBSTtBQUNsQixxQkFBbUIsTUFBTSxTQUFTO0FBQ3RDO0FBQ0EsU0FBUyxZQUFZLFVBQVE7QUFDekIsT0FBSyxNQUFNLFlBQVksS0FBSyxJQUFJO0FBQ2hDLHFCQUFtQixNQUFNLFNBQVM7QUFDdEM7QUFDQSxTQUFTLGNBQWMsVUFBUSxjQUFjLElBQUk7QUFDakQsU0FBUyxvQkFBb0IsTUFBTSxPQUFPO0FBQ3RDLE1BQUksS0FBSztBQUNMLFdBQU87QUFXWCxNQUFJLFVBQVUsS0FBSyxJQUFJLE1BQU0sWUFBWSxLQUFLLE1BQU0sa0JBQWtCLElBQUksS0FBSztBQUMzRSxTQUFLLE1BQU0scUJBQXFCO0FBQ2hDLFdBQU87QUFBQSxFQUNYO0FBQ0EsU0FBTztBQUNYO0FBRUEsSUFBTSxxQkFBcUIsVUFBVSxNQUFPO0FBQzVDLGFBQWEsbUJBQW1CLGFBQWEsb0JBQW9CLFVBQVE7QUFDckUsTUFBSSxDQUFDLEtBQUssV0FBVztBQUNqQixTQUFLLFlBQVksTUFBTTtBQUN2QixRQUFJLEVBQUUsTUFBTSxJQUFJLE1BQU0sT0FBTyxNQUFNLFVBQVU7QUFDN0MsUUFBSSxNQUFNLFVBQVUsVUFDZixNQUFNLGVBQ0YsQ0FBQyxLQUFLLGNBQWMsS0FBSyxnQkFBZ0IsS0FBSyxXQUFXLE1BQU0sS0FBSyxPQUFLLEVBQUUsS0FBSyxLQUFLLGNBQWMsS0FBSyxJQUFLO0FBRWxILFdBQUssYUFBYSxLQUFLLE1BQU0sZUFBZSxLQUFLLE1BQU07QUFDdkQscUJBQWUsTUFBTSxJQUFJO0FBQ3pCLFdBQUssYUFBYTtBQUFBLElBQ3RCLE9BQ0s7QUFDRCxxQkFBZSxJQUFJO0FBSW5CLFVBQUksU0FBUyxNQUFNLFVBQVUsU0FBUyxLQUFLLGdCQUFnQixDQUFDLEtBQUssY0FBYyxLQUFLLFdBQVcsTUFBTSxRQUFRO0FBQ3pHLFlBQUksTUFBTSxLQUFLLGtCQUFrQjtBQUNqQyxpQkFBUyxPQUFPLElBQUksV0FBV0QsVUFBUyxJQUFJLGFBQWEsUUFBUSxLQUFLLFlBQVksS0FBS0EsV0FBVSxLQUFJO0FBQ2pHLGNBQUksU0FBU0EsVUFBUyxJQUFJLEtBQUssWUFBWSxLQUFLLFdBQVdBLFVBQVMsQ0FBQztBQUNyRSxjQUFJLENBQUM7QUFDRDtBQUNKLGNBQUksT0FBTyxZQUFZLEdBQUc7QUFDdEIsaUJBQUssYUFBYSxFQUFFLFNBQVMsUUFBUSxPQUFPLFVBQVUsTUFBTTtBQUM1RDtBQUFBLFVBQ0osT0FDSztBQUNELG1CQUFPO0FBQ1AsWUFBQUEsVUFBUztBQUFBLFVBQ2I7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxTQUFLLE1BQU0sWUFBWTtBQUFBLEVBQzNCO0FBQ0EscUJBQW1CLE1BQU0sa0JBQWtCO0FBQy9DO0FBQ0EsYUFBYSxpQkFBaUIsQ0FBQyxNQUFNLFVBQVU7QUFDM0MsTUFBSSxLQUFLLFdBQVc7QUFDaEIsU0FBSyxNQUFNLFlBQVk7QUFDdkIsU0FBSyxNQUFNLHFCQUFxQixNQUFNO0FBQ3RDLFNBQUssTUFBTSw0QkFBNEIsS0FBSyxZQUFZLGVBQWUsRUFBRSxTQUFTLEtBQUssTUFBTSxnQkFBZ0I7QUFDN0csUUFBSSxLQUFLLE1BQU07QUFDWCxjQUFRLFFBQVEsRUFBRSxLQUFLLE1BQU0sS0FBSyxZQUFZLE1BQU0sQ0FBQztBQUN6RCxTQUFLLE1BQU07QUFDWCx1QkFBbUIsTUFBTSxFQUFFO0FBQUEsRUFDL0I7QUFDSjtBQUNBLFNBQVMsbUJBQW1CLE1BQU0sT0FBTztBQUNyQyxlQUFhLEtBQUssTUFBTSxnQkFBZ0I7QUFDeEMsTUFBSSxRQUFRO0FBQ1IsU0FBSyxNQUFNLG1CQUFtQixXQUFXLE1BQU0sZUFBZSxJQUFJLEdBQUcsS0FBSztBQUNsRjtBQUNBLFNBQVMsaUJBQWlCLE1BQU07QUFDNUIsTUFBSSxLQUFLLFdBQVc7QUFDaEIsU0FBSyxNQUFNLFlBQVk7QUFDdkIsU0FBSyxNQUFNLHFCQUFxQix5QkFBeUI7QUFBQSxFQUM3RDtBQUNBLFNBQU8sS0FBSyxNQUFNLGlCQUFpQixTQUFTO0FBQ3hDLFNBQUssTUFBTSxpQkFBaUIsSUFBSSxFQUFFLGlCQUFpQjtBQUMzRDtBQUNBLFNBQVMsMkJBQTJCO0FBQ2hDLE1BQUksUUFBUSxTQUFTLFlBQVksT0FBTztBQUN4QyxRQUFNLFVBQVUsU0FBUyxNQUFNLElBQUk7QUFDbkMsU0FBTyxNQUFNO0FBQ2pCO0FBSUEsU0FBUyxlQUFlLE1BQU0sY0FBYyxPQUFPO0FBQy9DLE1BQUksV0FBVyxLQUFLLFlBQVksZ0JBQWdCO0FBQzVDO0FBQ0osT0FBSyxZQUFZLFdBQVc7QUFDNUIsbUJBQWlCLElBQUk7QUFDckIsTUFBSSxlQUFlLEtBQUssV0FBVyxLQUFLLFFBQVEsT0FBTztBQUNuRCxRQUFJLE1BQU0saUJBQWlCLElBQUk7QUFDL0IsUUFBSSxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssTUFBTSxTQUFTO0FBQ25DLFdBQUssU0FBUyxLQUFLLE1BQU0sR0FBRyxhQUFhLEdBQUcsQ0FBQztBQUFBO0FBRTdDLFdBQUssWUFBWSxLQUFLLEtBQUs7QUFDL0IsV0FBTztBQUFBLEVBQ1g7QUFDQSxTQUFPO0FBQ1g7QUFDQSxTQUFTLFlBQVksTUFBTSxLQUFLO0FBRzVCLE1BQUksQ0FBQyxLQUFLLElBQUk7QUFDVjtBQUNKLE1BQUlVLFFBQU8sS0FBSyxJQUFJLFdBQVcsWUFBWSxTQUFTLGNBQWMsS0FBSyxDQUFDO0FBQ3hFLEVBQUFBLE1BQUssWUFBWSxHQUFHO0FBQ3BCLEVBQUFBLE1BQUssTUFBTSxVQUFVO0FBQ3JCLE1BQUksTUFBTSxhQUFhLEdBQUcsUUFBUSxTQUFTLFlBQVk7QUFDdkQsUUFBTSxtQkFBbUIsR0FBRztBQUk1QixPQUFLLElBQUksS0FBSztBQUNkLE1BQUksZ0JBQWdCO0FBQ3BCLE1BQUksU0FBUyxLQUFLO0FBQ2xCLGFBQVcsTUFBTTtBQUNiLFFBQUlBLE1BQUs7QUFDTCxNQUFBQSxNQUFLLFdBQVcsWUFBWUEsS0FBSTtBQUNwQyxTQUFLLE1BQU07QUFBQSxFQUNmLEdBQUcsRUFBRTtBQUNUO0FBSUEsSUFBTSxxQkFBc0IsTUFBTSxhQUFhLE1BQzFDLE9BQU8saUJBQWlCO0FBQzdCLFNBQVMsT0FBTyxhQUFhLE1BQU0sQ0FBQyxNQUFNLFdBQVc7QUFDakQsTUFBSSxRQUFRO0FBQ1osTUFBSSxNQUFNLEtBQUssTUFBTSxXQUFXWSxPQUFNLE1BQU0sUUFBUTtBQUNwRCxNQUFJLElBQUk7QUFDSjtBQUVKLE1BQUksT0FBTyxxQkFBcUIsT0FBTyxNQUFNO0FBQzdDLE1BQUlKLFNBQVEsSUFBSSxRQUFRLEdBQUcsRUFBRSxLQUFLLEtBQUssSUFBSSxzQkFBc0IsTUFBTUEsTUFBSztBQUM1RSxNQUFJLE1BQU07QUFDTixVQUFNLGVBQWU7QUFDckIsU0FBSyxVQUFVO0FBQ2YsU0FBSyxRQUFRLGFBQWEsSUFBSSxTQUFTO0FBQ3ZDLFNBQUssUUFBUSxjQUFjLElBQUk7QUFBQSxFQUNuQyxPQUNLO0FBQ0QsZ0JBQVksTUFBTSxHQUFHO0FBQUEsRUFDekI7QUFDQSxNQUFJSTtBQUNBLFNBQUssU0FBUyxLQUFLLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxXQUFXLEtBQUssQ0FBQztBQUNoRztBQUNBLFNBQVMsZ0JBQWdCSixRQUFPO0FBQzVCLFNBQU9BLE9BQU0sYUFBYSxLQUFLQSxPQUFNLFdBQVcsS0FBS0EsT0FBTSxRQUFRLGNBQWMsSUFBSUEsT0FBTSxRQUFRLGFBQWE7QUFDcEg7QUFDQSxTQUFTLGFBQWEsTUFBTSxPQUFPO0FBQy9CLE1BQUksQ0FBQyxLQUFLLElBQUk7QUFDVjtBQUNKLE1BQUksWUFBWSxLQUFLLE1BQU0sWUFBWSxLQUFLLE1BQU0sVUFBVSxNQUFNLE9BQU8sS0FBSyxLQUFLO0FBQ25GLE1BQUksU0FBUyxLQUFLLElBQUksV0FBVyxZQUFZLFNBQVMsY0FBYyxZQUFZLGFBQWEsS0FBSyxDQUFDO0FBQ25HLE1BQUksQ0FBQztBQUNELFdBQU8sa0JBQWtCO0FBQzdCLFNBQU8sTUFBTSxVQUFVO0FBQ3ZCLFNBQU8sTUFBTTtBQUNiLE1BQUksUUFBUSxLQUFLLE1BQU0sWUFBWSxLQUFLLE1BQU0sZUFBZTtBQUM3RCxhQUFXLE1BQU07QUFDYixTQUFLLE1BQU07QUFDWCxRQUFJLE9BQU87QUFDUCxhQUFPLFdBQVcsWUFBWSxNQUFNO0FBQ3hDLFFBQUk7QUFDQSxjQUFRLE1BQU0sT0FBTyxPQUFPLE1BQU0sT0FBTyxLQUFLO0FBQUE7QUFFOUMsY0FBUSxNQUFNLE9BQU8sYUFBYSxPQUFPLFdBQVcsT0FBTyxLQUFLO0FBQUEsRUFDeEUsR0FBRyxFQUFFO0FBQ1Q7QUFDQSxTQUFTLFFBQVEsTUFBTSxNQUFNLE1BQU0sYUFBYSxPQUFPO0FBQ25ELE1BQUlBLFNBQVEsbUJBQW1CLE1BQU0sTUFBTSxNQUFNLGFBQWEsS0FBSyxNQUFNLFVBQVUsS0FBSztBQUN4RixNQUFJLEtBQUssU0FBUyxlQUFlLE9BQUssRUFBRSxNQUFNLE9BQU9BLFVBQVMsTUFBTSxLQUFLLENBQUM7QUFDdEUsV0FBTztBQUNYLE1BQUksQ0FBQ0E7QUFDRCxXQUFPO0FBQ1gsTUFBSSxhQUFhLGdCQUFnQkEsTUFBSztBQUN0QyxNQUFJRCxNQUFLLGFBQ0gsS0FBSyxNQUFNLEdBQUcscUJBQXFCLFlBQVksV0FBVyxJQUMxRCxLQUFLLE1BQU0sR0FBRyxpQkFBaUJDLE1BQUs7QUFDMUMsT0FBSyxTQUFTRCxJQUFHLGVBQWUsRUFBRSxRQUFRLFNBQVMsSUFBSSxFQUFFLFFBQVEsV0FBVyxPQUFPLENBQUM7QUFDcEYsU0FBTztBQUNYO0FBQ0EsU0FBUyxRQUFRLGVBQWU7QUFDNUIsTUFBSSxPQUFPLGNBQWMsUUFBUSxZQUFZLEtBQUssY0FBYyxRQUFRLE1BQU07QUFDOUUsTUFBSTtBQUNBLFdBQU87QUFDWCxNQUFJLE9BQU8sY0FBYyxRQUFRLGVBQWU7QUFDaEQsU0FBTyxPQUFPLEtBQUssUUFBUSxVQUFVLEdBQUcsSUFBSTtBQUNoRDtBQUNBLGFBQWEsUUFBUSxDQUFDLE1BQU0sV0FBVztBQUNuQyxNQUFJLFFBQVE7QUFLWixNQUFJLEtBQUssYUFBYSxDQUFDO0FBQ25CO0FBQ0osTUFBSSxPQUFPLHFCQUFxQixPQUFPLE1BQU07QUFDN0MsTUFBSSxRQUFRLEtBQUssTUFBTSxZQUFZLEtBQUssTUFBTSxlQUFlO0FBQzdELE1BQUksUUFBUSxRQUFRLE1BQU0sUUFBUSxJQUFJLEdBQUcsS0FBSyxRQUFRLFdBQVcsR0FBRyxPQUFPLEtBQUs7QUFDNUUsVUFBTSxlQUFlO0FBQUE7QUFFckIsaUJBQWEsTUFBTSxLQUFLO0FBQ2hDO0FBQ0EsSUFBTSxXQUFOLE1BQWU7QUFBQSxFQUNYLFlBQVlDLFFBQU8sTUFBTSxNQUFNO0FBQzNCLFNBQUssUUFBUUE7QUFDYixTQUFLLE9BQU87QUFDWixTQUFLLE9BQU87QUFBQSxFQUNoQjtBQUNKO0FBQ0EsSUFBTSxtQkFBbUIsTUFBTSxXQUFXO0FBQzFDLFNBQVMsWUFBWSxDQUFDLE1BQU0sV0FBVztBQUNuQyxNQUFJLFFBQVE7QUFDWixNQUFJLFlBQVksS0FBSyxNQUFNO0FBQzNCLE1BQUk7QUFDQSxjQUFVLEtBQUs7QUFDbkIsTUFBSSxDQUFDLE1BQU07QUFDUDtBQUNKLE1BQUksTUFBTSxLQUFLLE1BQU07QUFDckIsTUFBSSxNQUFNLElBQUksUUFBUSxPQUFPLEtBQUssWUFBWSxZQUFZLEtBQUssQ0FBQztBQUNoRSxNQUFJO0FBQ0osTUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLFFBQVEsSUFBSSxRQUFRLGVBQWUsZ0JBQWdCLElBQUksS0FBSyxJQUFJLElBQUk7QUFBSztBQUFBLFdBQzFGLGFBQWEsVUFBVSxXQUFXO0FBQ3ZDLFdBQU8sY0FBYyxPQUFPLEtBQUssTUFBTSxLQUFLLFVBQVUsVUFBVSxHQUFHO0FBQUEsRUFDdkUsV0FDUyxNQUFNLFVBQVUsTUFBTSxPQUFPLFlBQVksR0FBRztBQUNqRCxRQUFJLE9BQU8sS0FBSyxRQUFRLFlBQVksTUFBTSxRQUFRLElBQUk7QUFDdEQsUUFBSSxRQUFRLEtBQUssS0FBSyxLQUFLLEtBQUssYUFBYSxRQUFRLEtBQUs7QUFDdEQsYUFBTyxjQUFjLE9BQU8sS0FBSyxNQUFNLEtBQUssS0FBSyxTQUFTO0FBQUEsRUFDbEU7QUFDQSxNQUFJQSxVQUFTLFFBQVEsS0FBSyxNQUFNLFdBQVcsUUFBUSxHQUFHLEVBQUUsS0FBSyxLQUFLLElBQUksc0JBQXNCLE1BQU1BLE1BQUs7QUFDdkcsUUFBTSxhQUFhLFVBQVU7QUFDN0IsUUFBTSxhQUFhLFFBQVEscUJBQXFCLFNBQVMsYUFBYSxJQUFJLFNBQVM7QUFFbkYsUUFBTSxhQUFhLGdCQUFnQjtBQUNuQyxNQUFJLENBQUM7QUFDRCxVQUFNLGFBQWEsUUFBUSxjQUFjLElBQUk7QUFDakQsT0FBSyxXQUFXLElBQUksU0FBU0EsUUFBTyxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSTtBQUN0RTtBQUNBLFNBQVMsVUFBVSxVQUFRO0FBQ3ZCLE1BQUksV0FBVyxLQUFLO0FBQ3BCLFNBQU8sV0FBVyxNQUFNO0FBQ3BCLFFBQUksS0FBSyxZQUFZO0FBQ2pCLFdBQUssV0FBVztBQUFBLEVBQ3hCLEdBQUcsRUFBRTtBQUNUO0FBQ0EsYUFBYSxXQUFXLGFBQWEsWUFBWSxDQUFDLEdBQUcsTUFBTSxFQUFFLGVBQWU7QUFDNUUsYUFBYSxPQUFPLENBQUMsTUFBTSxXQUFXO0FBQ2xDLE1BQUksUUFBUTtBQUNaLE1BQUksV0FBVyxLQUFLO0FBQ3BCLE9BQUssV0FBVztBQUNoQixNQUFJLENBQUMsTUFBTTtBQUNQO0FBQ0osTUFBSSxXQUFXLEtBQUssWUFBWSxZQUFZLEtBQUssQ0FBQztBQUNsRCxNQUFJLENBQUM7QUFDRDtBQUNKLE1BQUksU0FBUyxLQUFLLE1BQU0sSUFBSSxRQUFRLFNBQVMsR0FBRztBQUNoRCxNQUFJQSxTQUFRLFlBQVksU0FBUztBQUNqQyxNQUFJQSxRQUFPO0FBQ1AsU0FBSyxTQUFTLG1CQUFtQixPQUFLO0FBQUUsTUFBQUEsU0FBUSxFQUFFQSxRQUFPLElBQUk7QUFBQSxJQUFHLENBQUM7QUFBQSxFQUNyRSxPQUNLO0FBQ0QsSUFBQUEsU0FBUSxtQkFBbUIsTUFBTSxRQUFRLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixPQUFPLE1BQU0sYUFBYSxRQUFRLFdBQVcsR0FBRyxPQUFPLE1BQU07QUFBQSxFQUNwSjtBQUNBLE1BQUksT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDLE1BQU0sZ0JBQWdCO0FBQ2pELE1BQUksS0FBSyxTQUFTLGNBQWMsT0FBSyxFQUFFLE1BQU0sT0FBT0EsVUFBUyxNQUFNLE9BQU8sSUFBSSxDQUFDLEdBQUc7QUFDOUUsVUFBTSxlQUFlO0FBQ3JCO0FBQUEsRUFDSjtBQUNBLE1BQUksQ0FBQ0E7QUFDRDtBQUNKLFFBQU0sZUFBZTtBQUNyQixNQUFJLFlBQVlBLFNBQVEsVUFBVSxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUtBLE1BQUssSUFBSSxPQUFPO0FBQzlFLE1BQUksYUFBYTtBQUNiLGdCQUFZLE9BQU87QUFDdkIsTUFBSUQsTUFBSyxLQUFLLE1BQU07QUFDcEIsTUFBSSxNQUFNO0FBQ04sUUFBSSxFQUFFLEtBQUssSUFBSTtBQUNmLFFBQUk7QUFDQSxXQUFLLFFBQVFBLEdBQUU7QUFBQTtBQUVmLE1BQUFBLElBQUcsZ0JBQWdCO0FBQUEsRUFDM0I7QUFDQSxNQUFJLE1BQU1BLElBQUcsUUFBUSxJQUFJLFNBQVM7QUFDbEMsTUFBSSxTQUFTQyxPQUFNLGFBQWEsS0FBS0EsT0FBTSxXQUFXLEtBQUtBLE9BQU0sUUFBUSxjQUFjO0FBQ3ZGLE1BQUksZUFBZUQsSUFBRztBQUN0QixNQUFJO0FBQ0EsSUFBQUEsSUFBRyxpQkFBaUIsS0FBSyxLQUFLQyxPQUFNLFFBQVEsVUFBVTtBQUFBO0FBRXRELElBQUFELElBQUcsYUFBYSxLQUFLLEtBQUtDLE1BQUs7QUFDbkMsTUFBSUQsSUFBRyxJQUFJLEdBQUcsWUFBWTtBQUN0QjtBQUNKLE1BQUksT0FBT0EsSUFBRyxJQUFJLFFBQVEsR0FBRztBQUM3QixNQUFJLFVBQVUsY0FBYyxhQUFhQyxPQUFNLFFBQVEsVUFBVSxLQUM3RCxLQUFLLGFBQWEsS0FBSyxVQUFVLFdBQVdBLE9BQU0sUUFBUSxVQUFVLEdBQUc7QUFDdkUsSUFBQUQsSUFBRyxhQUFhLElBQUksY0FBYyxJQUFJLENBQUM7QUFBQSxFQUMzQyxPQUNLO0FBQ0QsUUFBSVgsT0FBTVcsSUFBRyxRQUFRLElBQUksU0FBUztBQUNsQyxJQUFBQSxJQUFHLFFBQVEsS0FBS0EsSUFBRyxRQUFRLEtBQUssU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sS0FBSyxVQUFVLFVBQVVYLE9BQU0sS0FBSztBQUNoRyxJQUFBVyxJQUFHLGFBQWEsaUJBQWlCLE1BQU0sTUFBTUEsSUFBRyxJQUFJLFFBQVFYLElBQUcsQ0FBQyxDQUFDO0FBQUEsRUFDckU7QUFDQSxPQUFLLE1BQU07QUFDWCxPQUFLLFNBQVNXLElBQUcsUUFBUSxXQUFXLE1BQU0sQ0FBQztBQUMvQztBQUNBLFNBQVMsUUFBUSxVQUFRO0FBQ3JCLE9BQUssTUFBTSxZQUFZLEtBQUssSUFBSTtBQUNoQyxNQUFJLENBQUMsS0FBSyxTQUFTO0FBQ2YsU0FBSyxZQUFZLEtBQUs7QUFDdEIsU0FBSyxJQUFJLFVBQVUsSUFBSSxxQkFBcUI7QUFDNUMsU0FBSyxZQUFZLE1BQU07QUFDdkIsU0FBSyxVQUFVO0FBQ2YsZUFBVyxNQUFNO0FBQ2IsVUFBSSxLQUFLLFdBQVcsS0FBSyxTQUFTLEtBQUssQ0FBQyxLQUFLLFlBQVksaUJBQWlCLEdBQUcsS0FBSyxrQkFBa0IsQ0FBQztBQUNqRyx1QkFBZSxJQUFJO0FBQUEsSUFDM0IsR0FBRyxFQUFFO0FBQUEsRUFDVDtBQUNKO0FBQ0EsU0FBUyxPQUFPLENBQUMsTUFBTSxXQUFXO0FBQzlCLE1BQUksUUFBUTtBQUNaLE1BQUksS0FBSyxTQUFTO0FBQ2QsU0FBSyxZQUFZLEtBQUs7QUFDdEIsU0FBSyxJQUFJLFVBQVUsT0FBTyxxQkFBcUI7QUFDL0MsU0FBSyxZQUFZLE1BQU07QUFDdkIsUUFBSSxNQUFNLGlCQUFpQixLQUFLLElBQUksU0FBUyxNQUFNLGFBQWE7QUFDNUQsV0FBSyxZQUFZLGlCQUFpQixNQUFNO0FBQzVDLFNBQUssVUFBVTtBQUFBLEVBQ25CO0FBQ0o7QUFDQSxTQUFTLGNBQWMsQ0FBQyxNQUFNLFdBQVc7QUFDckMsTUFBSSxRQUFRO0FBS1osTUFBSSxVQUFVLFdBQVcsTUFBTSxhQUFhLHlCQUF5QjtBQUNqRSxTQUFLLFlBQVksVUFBVTtBQUMzQixRQUFJLEVBQUUsZUFBZSxJQUFJLEtBQUs7QUFDOUIsZUFBVyxNQUFNO0FBQ2IsVUFBSSxLQUFLLE1BQU0sa0JBQWtCO0FBQzdCO0FBRUosV0FBSyxJQUFJLEtBQUs7QUFDZCxXQUFLLE1BQU07QUFDWCxVQUFJLEtBQUssU0FBUyxpQkFBaUIsT0FBSyxFQUFFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0FBQ3JFO0FBQ0osVUFBSSxFQUFFLFFBQVEsSUFBSSxLQUFLLE1BQU07QUFFN0IsVUFBSSxXQUFXLFFBQVEsTUFBTTtBQUN6QixhQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUcsT0FBTyxRQUFRLE1BQU0sR0FBRyxRQUFRLEdBQUcsRUFBRSxlQUFlLENBQUM7QUFBQSxJQUN6RixHQUFHLEVBQUU7QUFBQSxFQUNUO0FBQ0o7QUFFQSxTQUFTLFFBQVE7QUFDYixXQUFTLElBQUksSUFBSSxhQUFhLElBQUk7QUFFdEMsU0FBUyxZQUFZLEdBQUcsR0FBRztBQUN2QixNQUFJLEtBQUs7QUFDTCxXQUFPO0FBQ1gsV0FBUyxLQUFLO0FBQ1YsUUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDWixhQUFPO0FBQ2YsV0FBUyxLQUFLO0FBQ1YsUUFBSSxFQUFFLEtBQUs7QUFDUCxhQUFPO0FBQ2YsU0FBTztBQUNYO0FBQ0EsSUFBTSxhQUFOLE1BQU0sWUFBVztBQUFBLEVBQ2IsWUFBWSxPQUFPLE1BQU07QUFDckIsU0FBSyxRQUFRO0FBQ2IsU0FBSyxPQUFPLFFBQVE7QUFDcEIsU0FBSyxPQUFPLEtBQUssS0FBSyxRQUFRO0FBQUEsRUFDbEM7QUFBQSxFQUNBLElBQUksU0FBUyxNQUFNakIsU0FBUSxXQUFXO0FBQ2xDLFFBQUksRUFBRSxLQUFLLFFBQVEsSUFBSSxRQUFRLFVBQVUsS0FBSyxPQUFPLFdBQVcsS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDO0FBQ3RGLFdBQU8sVUFBVSxPQUFPLElBQUksV0FBVyxNQUFNQSxTQUFRLE1BQU1BLFNBQVEsSUFBSTtBQUFBLEVBQzNFO0FBQUEsRUFDQSxRQUFRO0FBQUUsV0FBTztBQUFBLEVBQU07QUFBQSxFQUN2QixHQUFHLE9BQU87QUFDTixXQUFPLFFBQVEsU0FDVixpQkFBaUIsZ0JBQ2IsS0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQzFDLEtBQUssU0FBUyxNQUFNLFNBQVMsWUFBWSxLQUFLLE1BQU0sTUFBTSxJQUFJO0FBQUEsRUFDOUU7QUFBQSxFQUNBLFFBQVEsTUFBTTtBQUNWLFFBQUksS0FBSyxLQUFLO0FBQ1YsV0FBSyxLQUFLLFFBQVEsSUFBSTtBQUFBLEVBQzlCO0FBQ0o7QUFDQSxJQUFNLGFBQU4sTUFBTSxZQUFXO0FBQUEsRUFDYixZQUFZLE9BQU8sTUFBTTtBQUNyQixTQUFLLFFBQVE7QUFDYixTQUFLLE9BQU8sUUFBUTtBQUFBLEVBQ3hCO0FBQUEsRUFDQSxJQUFJLFNBQVMsTUFBTUEsU0FBUSxXQUFXO0FBQ2xDLFFBQUlELFFBQU8sUUFBUSxJQUFJLEtBQUssT0FBTyxXQUFXLEtBQUssS0FBSyxpQkFBaUIsS0FBSyxDQUFDLElBQUlDO0FBQ25GLFFBQUksS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFdBQVcsS0FBSyxLQUFLLGVBQWUsSUFBSSxFQUFFLElBQUlBO0FBQzdFLFdBQU9ELFNBQVEsS0FBSyxPQUFPLElBQUksV0FBV0EsT0FBTSxJQUFJLElBQUk7QUFBQSxFQUM1RDtBQUFBLEVBQ0EsTUFBTSxHQUFHLE1BQU07QUFBRSxXQUFPLEtBQUssT0FBTyxLQUFLO0FBQUEsRUFBSTtBQUFBLEVBQzdDLEdBQUcsT0FBTztBQUNOLFdBQU8sUUFBUSxTQUNWLGlCQUFpQixlQUFjLFlBQVksS0FBSyxPQUFPLE1BQU0sS0FBSyxLQUMvRCxZQUFZLEtBQUssTUFBTSxNQUFNLElBQUk7QUFBQSxFQUM3QztBQUFBLEVBQ0EsT0FBTyxHQUFHLE1BQU07QUFBRSxXQUFPLEtBQUssZ0JBQWdCO0FBQUEsRUFBWTtBQUFBLEVBQzFELFVBQVU7QUFBQSxFQUFFO0FBQ2hCO0FBQ0EsSUFBTXdCLFlBQU4sTUFBTSxVQUFTO0FBQUEsRUFDWCxZQUFZLE9BQU8sTUFBTTtBQUNyQixTQUFLLFFBQVE7QUFDYixTQUFLLE9BQU8sUUFBUTtBQUFBLEVBQ3hCO0FBQUEsRUFDQSxJQUFJLFNBQVMsTUFBTXZCLFNBQVEsV0FBVztBQUNsQyxRQUFJRCxRQUFPLFFBQVEsVUFBVSxLQUFLLE9BQU8sV0FBVyxDQUFDO0FBQ3JELFFBQUlBLE1BQUs7QUFDTCxhQUFPO0FBQ1gsUUFBSSxLQUFLLFFBQVEsVUFBVSxLQUFLLEtBQUssV0FBVyxFQUFFO0FBQ2xELFFBQUksR0FBRyxXQUFXLEdBQUcsT0FBT0EsTUFBSztBQUM3QixhQUFPO0FBQ1gsV0FBTyxJQUFJLFdBQVdBLE1BQUssTUFBTUMsU0FBUSxHQUFHLE1BQU1BLFNBQVEsSUFBSTtBQUFBLEVBQ2xFO0FBQUEsRUFDQSxNQUFNLE1BQU0sTUFBTTtBQUNkLFFBQUksRUFBRSxPQUFPLFFBQUFBLFFBQU8sSUFBSSxLQUFLLFFBQVEsVUFBVSxLQUFLLElBQUksR0FBRztBQUMzRCxXQUFPQSxXQUFVLEtBQUssUUFBUSxFQUFFLFFBQVEsS0FBSyxNQUFNLEtBQUssR0FBRyxVQUFVQSxVQUFTLE1BQU0sWUFBWSxLQUFLO0FBQUEsRUFDekc7QUFBQSxFQUNBLEdBQUcsT0FBTztBQUNOLFdBQU8sUUFBUSxTQUNWLGlCQUFpQixhQUFZLFlBQVksS0FBSyxPQUFPLE1BQU0sS0FBSyxLQUM3RCxZQUFZLEtBQUssTUFBTSxNQUFNLElBQUk7QUFBQSxFQUM3QztBQUFBLEVBQ0EsVUFBVTtBQUFBLEVBQUU7QUFDaEI7QUFNQSxJQUFNLGFBQU4sTUFBTSxZQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixZQUlBRCxPQUtBLElBSUEsTUFBTTtBQUNGLFNBQUssT0FBT0E7QUFDWixTQUFLLEtBQUs7QUFDVixTQUFLLE9BQU87QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsS0FBS0EsT0FBTSxJQUFJO0FBQ1gsV0FBTyxJQUFJLFlBQVdBLE9BQU0sSUFBSSxLQUFLLElBQUk7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsR0FBRyxPQUFPQyxVQUFTLEdBQUc7QUFDbEIsV0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNLElBQUksS0FBSyxLQUFLLE9BQU9BLFdBQVUsTUFBTSxRQUFRLEtBQUssS0FBS0EsV0FBVSxNQUFNO0FBQUEsRUFDckc7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLElBQUksU0FBU0EsU0FBUSxXQUFXO0FBQzVCLFdBQU8sS0FBSyxLQUFLLElBQUksU0FBUyxNQUFNQSxTQUFRLFNBQVM7QUFBQSxFQUN6RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE9BQU8sT0FBTyxLQUFLLE9BQU8sTUFBTTtBQUM1QixXQUFPLElBQUksWUFBVyxLQUFLLEtBQUssSUFBSSxXQUFXLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxPQUFPRCxPQUFNLElBQUksT0FBTyxNQUFNO0FBQ2pDLFdBQU8sSUFBSSxZQUFXQSxPQUFNLElBQUksSUFBSSxXQUFXLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxPQUFPLEtBQUtBLE9BQU0sSUFBSSxPQUFPLE1BQU07QUFDL0IsV0FBTyxJQUFJLFlBQVdBLE9BQU0sSUFBSSxJQUFJd0IsVUFBUyxPQUFPLElBQUksQ0FBQztBQUFBLEVBQzdEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUksT0FBTztBQUFFLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXBDLElBQUksU0FBUztBQUFFLFdBQU8sS0FBSyxnQkFBZ0I7QUFBQSxFQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJdkQsSUFBSSxTQUFTO0FBQUUsV0FBTyxLQUFLLGdCQUFnQjtBQUFBLEVBQVk7QUFDM0Q7QUFDQSxJQUFNLE9BQU8sQ0FBQztBQUFkLElBQWlCLFNBQVMsQ0FBQztBQU8zQixJQUFNLGdCQUFOLE1BQU0sZUFBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWhCLFlBQVksT0FBTyxVQUFVO0FBQ3pCLFNBQUssUUFBUSxNQUFNLFNBQVMsUUFBUTtBQUNwQyxTQUFLLFdBQVcsU0FBUyxTQUFTLFdBQVc7QUFBQSxFQUNqRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE9BQU8sT0FBT3RCLE1BQUssYUFBYTtBQUM1QixXQUFPLFlBQVksU0FBUyxVQUFVLGFBQWFBLE1BQUssR0FBRyxNQUFNLElBQUk7QUFBQSxFQUN6RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLEtBQUtXLFFBQU9OLE1BQUssV0FBVztBQUN4QixRQUFJLFNBQVMsQ0FBQztBQUNkLFNBQUssVUFBVU0sVUFBUyxPQUFPLElBQUlBLFFBQU9OLFFBQU8sT0FBTyxNQUFNQSxNQUFLLFFBQVEsR0FBRyxTQUFTO0FBQ3ZGLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxVQUFVTSxRQUFPTixNQUFLLFFBQVFOLFNBQVEsV0FBVztBQUM3QyxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFDeEMsVUFBSSxPQUFPLEtBQUssTUFBTSxDQUFDO0FBQ3ZCLFVBQUksS0FBSyxRQUFRTSxRQUFPLEtBQUssTUFBTU0sV0FBVSxDQUFDLGFBQWEsVUFBVSxLQUFLLElBQUk7QUFDMUUsZUFBTyxLQUFLLEtBQUssS0FBSyxLQUFLLE9BQU9aLFNBQVEsS0FBSyxLQUFLQSxPQUFNLENBQUM7QUFBQSxJQUNuRTtBQUNBLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxTQUFTLFFBQVEsS0FBSyxHQUFHO0FBQzlDLFVBQUksS0FBSyxTQUFTLENBQUMsSUFBSU0sUUFBTyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUlNLFFBQU87QUFDeEQsWUFBSSxXQUFXLEtBQUssU0FBUyxDQUFDLElBQUk7QUFDbEMsYUFBSyxTQUFTLElBQUksQ0FBQyxFQUFFLFVBQVVBLFNBQVEsVUFBVU4sT0FBTSxVQUFVLFFBQVFOLFVBQVMsVUFBVSxTQUFTO0FBQUEsTUFDekc7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLFNBQVNDLE1BQUssU0FBUztBQUN2QixRQUFJLFFBQVEsU0FBUyxRQUFRLEtBQUssVUFBVTtBQUN4QyxhQUFPO0FBQ1gsV0FBTyxLQUFLLFNBQVMsU0FBU0EsTUFBSyxHQUFHLEdBQUcsV0FBVyxNQUFNO0FBQUEsRUFDOUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFNBQVMsU0FBUyxNQUFNRCxTQUFRLFdBQVcsU0FBUztBQUNoRCxRQUFJO0FBQ0osYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLE1BQU0sUUFBUSxLQUFLO0FBQ3hDLFVBQUksU0FBUyxLQUFLLE1BQU0sQ0FBQyxFQUFFLElBQUksU0FBU0EsU0FBUSxTQUFTO0FBQ3pELFVBQUksVUFBVSxPQUFPLEtBQUssTUFBTSxNQUFNLE1BQU07QUFDeEMsU0FBQyxhQUFhLFdBQVcsQ0FBQyxJQUFJLEtBQUssTUFBTTtBQUFBLGVBQ3BDLFFBQVE7QUFDYixnQkFBUSxTQUFTLEtBQUssTUFBTSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQzNDO0FBQ0EsUUFBSSxLQUFLLFNBQVM7QUFDZCxhQUFPLFlBQVksS0FBSyxVQUFVLFlBQVksQ0FBQyxHQUFHLFNBQVMsTUFBTUEsU0FBUSxXQUFXLE9BQU87QUFBQTtBQUUzRixhQUFPLFdBQVcsSUFBSSxlQUFjLFNBQVMsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJO0FBQUEsRUFDMUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLElBQUlDLE1BQUssYUFBYTtBQUNsQixRQUFJLENBQUMsWUFBWTtBQUNiLGFBQU87QUFDWCxRQUFJLFFBQVE7QUFDUixhQUFPLGVBQWMsT0FBT0EsTUFBSyxXQUFXO0FBQ2hELFdBQU8sS0FBSyxTQUFTQSxNQUFLLGFBQWEsQ0FBQztBQUFBLEVBQzVDO0FBQUEsRUFDQSxTQUFTQSxNQUFLLGFBQWFELFNBQVE7QUFDL0IsUUFBSSxVQUFVLGFBQWE7QUFDM0IsSUFBQUMsS0FBSSxRQUFRLENBQUMsV0FBVyxnQkFBZ0I7QUFDcEMsVUFBSSxhQUFhLGNBQWNELFNBQVFhO0FBQ3ZDLFVBQUksRUFBRUEsU0FBUSxpQkFBaUIsYUFBYSxXQUFXLFVBQVU7QUFDN0Q7QUFDSixVQUFJLENBQUM7QUFDRCxtQkFBVyxLQUFLLFNBQVMsTUFBTTtBQUNuQyxhQUFPLGFBQWEsU0FBUyxVQUFVLFNBQVMsVUFBVSxJQUFJO0FBQzFELHNCQUFjO0FBQ2xCLFVBQUksU0FBUyxVQUFVLEtBQUs7QUFDeEIsaUJBQVMsYUFBYSxDQUFDLElBQUksU0FBUyxhQUFhLENBQUMsRUFBRSxTQUFTLFdBQVdBLFFBQU8sYUFBYSxDQUFDO0FBQUE7QUFFN0YsaUJBQVMsT0FBTyxZQUFZLEdBQUcsYUFBYSxjQUFjLFVBQVUsVUFBVSxVQUFVQSxRQUFPLFdBQVcsYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUNySSxvQkFBYztBQUFBLElBQ2xCLENBQUM7QUFDRCxRQUFJLFFBQVEsVUFBVSxhQUFhLGFBQWEsV0FBVyxJQUFJLGFBQWEsQ0FBQ2IsT0FBTTtBQUNuRixhQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUTtBQUM5QixVQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxNQUFNQyxNQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQ2xDLGNBQU0sT0FBTyxLQUFLLENBQUM7QUFDM0IsV0FBTyxJQUFJLGVBQWMsTUFBTSxTQUFTLEtBQUssTUFBTSxPQUFPLEtBQUssRUFBRSxLQUFLLEtBQUssSUFBSSxLQUFLLE9BQU8sWUFBWSxLQUFLLFFBQVE7QUFBQSxFQUN4SDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFPLGFBQWE7QUFDaEIsUUFBSSxZQUFZLFVBQVUsS0FBSyxRQUFRO0FBQ25DLGFBQU87QUFDWCxXQUFPLEtBQUssWUFBWSxhQUFhLENBQUM7QUFBQSxFQUMxQztBQUFBLEVBQ0EsWUFBWSxhQUFhRCxTQUFRO0FBQzdCLFFBQUksV0FBVyxLQUFLLFVBQVUsUUFBUSxLQUFLO0FBQzNDLGFBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUssR0FBRztBQUN6QyxVQUFJYTtBQUNKLFVBQUlkLFFBQU8sU0FBUyxDQUFDLElBQUlDLFNBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJQTtBQUN4RCxlQUFTLElBQUksR0FBRyxNQUFNLElBQUksWUFBWSxRQUFRO0FBQzFDLFlBQUksT0FBTyxZQUFZLENBQUMsR0FBRztBQUN2QixjQUFJLEtBQUssT0FBT0QsU0FBUSxLQUFLLEtBQUssSUFBSTtBQUNsQyx3QkFBWSxDQUFDLElBQUk7QUFDakIsYUFBQ2MsV0FBVUEsU0FBUSxDQUFDLElBQUksS0FBSyxJQUFJO0FBQUEsVUFDckM7QUFBQSxRQUNKO0FBQ0osVUFBSSxDQUFDQTtBQUNEO0FBQ0osVUFBSSxZQUFZLEtBQUs7QUFDakIsbUJBQVcsS0FBSyxTQUFTLE1BQU07QUFDbkMsVUFBSSxVQUFVLFNBQVMsSUFBSSxDQUFDLEVBQUUsWUFBWUEsUUFBT2QsUUFBTyxDQUFDO0FBQ3pELFVBQUksV0FBVyxPQUFPO0FBQ2xCLGlCQUFTLElBQUksQ0FBQyxJQUFJO0FBQUEsTUFDdEIsT0FDSztBQUNELGlCQUFTLE9BQU8sR0FBRyxDQUFDO0FBQ3BCLGFBQUs7QUFBQSxNQUNUO0FBQUEsSUFDSjtBQUNBLFFBQUksTUFBTTtBQUNOLGVBQVMsSUFBSSxHQUFHLE1BQU0sSUFBSSxZQUFZLFFBQVE7QUFDMUMsWUFBSSxPQUFPLFlBQVksQ0FBQyxHQUFHO0FBQ3ZCLG1CQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUTtBQUM5QixnQkFBSSxNQUFNLENBQUMsRUFBRSxHQUFHLE1BQU1DLE9BQU0sR0FBRztBQUMzQixrQkFBSSxTQUFTLEtBQUs7QUFDZCx3QkFBUSxLQUFLLE1BQU0sTUFBTTtBQUM3QixvQkFBTSxPQUFPLEtBQUssQ0FBQztBQUFBLFlBQ3ZCO0FBQUEsUUFDUjtBQUFBO0FBQ1IsUUFBSSxZQUFZLEtBQUssWUFBWSxTQUFTLEtBQUs7QUFDM0MsYUFBTztBQUNYLFdBQU8sTUFBTSxVQUFVLFNBQVMsU0FBUyxJQUFJLGVBQWMsT0FBTyxRQUFRLElBQUk7QUFBQSxFQUNsRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUEsU0FBU0EsU0FBUSxNQUFNO0FBQ25CLFFBQUksUUFBUTtBQUNSLGFBQU87QUFDWCxRQUFJLEtBQUs7QUFDTCxhQUFPLGVBQWM7QUFDekIsUUFBSSxPQUFPO0FBQ1gsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFNBQVMsUUFBUSxLQUFLO0FBQzNDLFVBQUksS0FBSyxTQUFTLENBQUMsS0FBS0EsU0FBUTtBQUM1QixZQUFJLEtBQUssU0FBUyxDQUFDLEtBQUtBO0FBQ3BCLGtCQUFRLEtBQUssU0FBUyxJQUFJLENBQUM7QUFDL0I7QUFBQSxNQUNKO0FBQ0osUUFBSVksU0FBUVosVUFBUyxHQUFHTSxPQUFNTSxTQUFRLEtBQUssUUFBUTtBQUNuRCxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFDeEMsVUFBSSxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQ3RCLFVBQUksSUFBSSxPQUFPTixRQUFPLElBQUksS0FBS00sVUFBVSxJQUFJLGdCQUFnQixZQUFhO0FBQ3RFLFlBQUliLFFBQU8sS0FBSyxJQUFJYSxRQUFPLElBQUksSUFBSSxJQUFJQSxRQUFPLEtBQUssS0FBSyxJQUFJTixNQUFLLElBQUksRUFBRSxJQUFJTTtBQUMzRSxZQUFJYixRQUFPO0FBQ1AsV0FBQyxVQUFVLFFBQVEsQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFLQSxPQUFNLEVBQUUsQ0FBQztBQUFBLE1BQ3ZEO0FBQUEsSUFDSjtBQUNBLFFBQUksT0FBTztBQUNQLFVBQUksV0FBVyxJQUFJLGVBQWMsTUFBTSxLQUFLLEtBQUssR0FBRyxJQUFJO0FBQ3hELGFBQU8sUUFBUSxJQUFJLGdCQUFnQixDQUFDLFVBQVUsS0FBSyxDQUFDLElBQUk7QUFBQSxJQUM1RDtBQUNBLFdBQU8sU0FBUztBQUFBLEVBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxHQUFHLE9BQU87QUFDTixRQUFJLFFBQVE7QUFDUixhQUFPO0FBQ1gsUUFBSSxFQUFFLGlCQUFpQixtQkFDbkIsS0FBSyxNQUFNLFVBQVUsTUFBTSxNQUFNLFVBQ2pDLEtBQUssU0FBUyxVQUFVLE1BQU0sU0FBUztBQUN2QyxhQUFPO0FBQ1gsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLE1BQU0sUUFBUTtBQUNuQyxVQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLENBQUM7QUFDaEMsZUFBTztBQUNmLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxTQUFTLFFBQVEsS0FBSztBQUMzQyxVQUFJLEtBQUssU0FBUyxDQUFDLEtBQUssTUFBTSxTQUFTLENBQUMsS0FDcEMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLE1BQU0sU0FBUyxJQUFJLENBQUMsS0FDNUMsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLFNBQVMsSUFBSSxDQUFDLENBQUM7QUFDOUMsZUFBTztBQUNmLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxPQUFPLE1BQU07QUFDVCxXQUFPLGNBQWMsS0FBSyxZQUFZLElBQUksQ0FBQztBQUFBLEVBQy9DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxZQUFZLE1BQU07QUFDZCxRQUFJLFFBQVE7QUFDUixhQUFPO0FBQ1gsUUFBSSxLQUFLLGlCQUFpQixDQUFDLEtBQUssTUFBTSxLQUFLLFdBQVcsRUFBRTtBQUNwRCxhQUFPLEtBQUs7QUFDaEIsUUFBSSxTQUFTLENBQUM7QUFDZCxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssTUFBTSxRQUFRLEtBQUs7QUFDeEMsVUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsZ0JBQWdCO0FBQ2hDLGVBQU8sS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsSUFDakM7QUFDQSxXQUFPO0FBQUEsRUFDWDtBQUNKO0FBSUEsY0FBYyxRQUFRLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBSTlDLGNBQWMsZ0JBQWdCO0FBQzlCLElBQU0sUUFBUSxjQUFjO0FBSTVCLElBQU0sa0JBQU4sTUFBTSxpQkFBZ0I7QUFBQSxFQUNsQixZQUFZLFNBQVM7QUFDakIsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUNBLElBQUksU0FBU0UsTUFBSztBQUNkLFVBQU0sY0FBYyxLQUFLLFFBQVEsSUFBSSxZQUFVLE9BQU8sSUFBSSxTQUFTQSxNQUFLLE1BQU0sQ0FBQztBQUMvRSxXQUFPLGlCQUFnQixLQUFLLFdBQVc7QUFBQSxFQUMzQztBQUFBLEVBQ0EsU0FBU0QsU0FBUSxPQUFPO0FBQ3BCLFFBQUksTUFBTTtBQUNOLGFBQU8sY0FBYztBQUN6QixRQUFJYSxTQUFRLENBQUM7QUFDYixhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxRQUFRLEtBQUs7QUFDMUMsVUFBSSxTQUFTLEtBQUssUUFBUSxDQUFDLEVBQUUsU0FBU2IsU0FBUSxLQUFLO0FBQ25ELFVBQUksVUFBVTtBQUNWO0FBQ0osVUFBSSxrQkFBa0I7QUFDbEIsUUFBQWEsU0FBUUEsT0FBTSxPQUFPLE9BQU8sT0FBTztBQUFBO0FBRW5DLFFBQUFBLE9BQU0sS0FBSyxNQUFNO0FBQUEsSUFDekI7QUFDQSxXQUFPLGlCQUFnQixLQUFLQSxNQUFLO0FBQUEsRUFDckM7QUFBQSxFQUNBLEdBQUcsT0FBTztBQUNOLFFBQUksRUFBRSxpQkFBaUIscUJBQ25CLE1BQU0sUUFBUSxVQUFVLEtBQUssUUFBUTtBQUNyQyxhQUFPO0FBQ1gsYUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsUUFBUTtBQUNyQyxVQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLENBQUM7QUFDcEMsZUFBTztBQUNmLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxPQUFPLE1BQU07QUFDVCxRQUFJLFFBQVEsU0FBUztBQUNyQixhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxRQUFRLEtBQUs7QUFDMUMsVUFBSSxTQUFTLEtBQUssUUFBUSxDQUFDLEVBQUUsWUFBWSxJQUFJO0FBQzdDLFVBQUksQ0FBQyxPQUFPO0FBQ1I7QUFDSixVQUFJLENBQUMsUUFBUTtBQUNULGlCQUFTO0FBQUEsTUFDYixPQUNLO0FBQ0QsWUFBSSxRQUFRO0FBQ1IsbUJBQVMsT0FBTyxNQUFNO0FBQ3RCLG1CQUFTO0FBQUEsUUFDYjtBQUNBLGlCQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUTtBQUMvQixpQkFBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQUEsTUFDN0I7QUFBQSxJQUNKO0FBQ0EsV0FBTyxTQUFTLGNBQWMsU0FBUyxTQUFTLE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSTtBQUFBLEVBQzFFO0FBQUE7QUFBQTtBQUFBLEVBR0EsT0FBTyxLQUFLLFNBQVM7QUFDakIsWUFBUSxRQUFRLFFBQVE7QUFBQSxNQUNwQixLQUFLO0FBQUcsZUFBTztBQUFBLE1BQ2YsS0FBSztBQUFHLGVBQU8sUUFBUSxDQUFDO0FBQUEsTUFDeEI7QUFBUyxlQUFPLElBQUksaUJBQWdCLFFBQVEsTUFBTSxPQUFLLGFBQWEsYUFBYSxJQUFJLFVBQ2pGLFFBQVEsT0FBTyxDQUFDVyxJQUFHLE1BQU1BLEdBQUUsT0FBTyxhQUFhLGdCQUFnQixJQUFJLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQUEsSUFDMUY7QUFBQSxFQUNKO0FBQ0o7QUFDQSxTQUFTLFlBQVksYUFBYSxVQUFVLFNBQVMsTUFBTXhCLFNBQVEsV0FBVyxTQUFTO0FBQ25GLE1BQUksV0FBVyxZQUFZLE1BQU07QUFHakMsV0FBUyxJQUFJLEdBQUcsYUFBYSxXQUFXLElBQUksUUFBUSxLQUFLLFFBQVEsS0FBSztBQUNsRSxRQUFJLFFBQVE7QUFDWixZQUFRLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLFFBQVEsVUFBVSxXQUFXO0FBQzVELFVBQUksUUFBUyxTQUFTLFlBQWEsU0FBUztBQUM1QyxlQUFTeUIsS0FBSSxHQUFHQSxLQUFJLFNBQVMsUUFBUUEsTUFBSyxHQUFHO0FBQ3pDLFlBQUluQixPQUFNLFNBQVNtQixLQUFJLENBQUM7QUFDeEIsWUFBSW5CLE9BQU0sS0FBSyxXQUFXQSxPQUFNLGFBQWE7QUFDekM7QUFDSixZQUFJTSxTQUFRLFNBQVNhLEVBQUMsSUFBSSxhQUFhO0FBQ3ZDLFlBQUksVUFBVWIsUUFBTztBQUNqQixtQkFBU2EsS0FBSSxDQUFDLElBQUksWUFBWWIsU0FBUSxLQUFLO0FBQUEsUUFDL0MsV0FDUyxZQUFZLGNBQWMsT0FBTztBQUN0QyxtQkFBU2EsRUFBQyxLQUFLO0FBQ2YsbUJBQVNBLEtBQUksQ0FBQyxLQUFLO0FBQUEsUUFDdkI7QUFBQSxNQUNKO0FBQ0EsZUFBUztBQUFBLElBQ2IsQ0FBQztBQUNELGlCQUFhLFFBQVEsS0FBSyxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUU7QUFBQSxFQUNuRDtBQUdBLE1BQUksY0FBYztBQUNsQixXQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3RDLFFBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxHQUFHO0FBQ3JCLFVBQUksU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQ3ZCLHNCQUFjO0FBQ2QsaUJBQVMsSUFBSSxDQUFDLElBQUk7QUFDbEI7QUFBQSxNQUNKO0FBQ0EsVUFBSTFCLFFBQU8sUUFBUSxJQUFJLFlBQVksQ0FBQyxJQUFJLFNBQVMsR0FBRyxZQUFZQSxRQUFPQztBQUN2RSxVQUFJLFlBQVksS0FBSyxhQUFhLEtBQUssUUFBUSxNQUFNO0FBQ2pELHNCQUFjO0FBQ2Q7QUFBQSxNQUNKO0FBRUEsVUFBSSxLQUFLLFFBQVEsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRSxHQUFHLFVBQVUsS0FBS0E7QUFDekUsVUFBSSxFQUFFLE9BQU8sUUFBUSxZQUFZLElBQUksS0FBSyxRQUFRLFVBQVUsU0FBUztBQUNyRSxVQUFJLFlBQVksS0FBSyxXQUFXLEtBQUs7QUFDckMsVUFBSSxhQUFhLGVBQWUsYUFBYSxjQUFjLFVBQVUsWUFBWSxTQUFTO0FBQ3RGLFlBQUksU0FBUyxTQUFTLElBQUksQ0FBQyxFQUN0QixTQUFTLFNBQVMsV0FBV0QsUUFBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLFlBQVksR0FBRyxPQUFPO0FBQ25GLFlBQUksVUFBVSxPQUFPO0FBQ2pCLG1CQUFTLENBQUMsSUFBSTtBQUNkLG1CQUFTLElBQUksQ0FBQyxJQUFJO0FBQ2xCLG1CQUFTLElBQUksQ0FBQyxJQUFJO0FBQUEsUUFDdEIsT0FDSztBQUNELG1CQUFTLElBQUksQ0FBQyxJQUFJO0FBQ2xCLHdCQUFjO0FBQUEsUUFDbEI7QUFBQSxNQUNKLE9BQ0s7QUFDRCxzQkFBYztBQUFBLE1BQ2xCO0FBQUEsSUFDSjtBQUVKLE1BQUksYUFBYTtBQUNiLFFBQUksY0FBYyxpQ0FBaUMsVUFBVSxhQUFhLFVBQVUsU0FBU0MsU0FBUSxXQUFXLE9BQU87QUFDdkgsUUFBSSxRQUFRLFVBQVUsYUFBYSxNQUFNLEdBQUcsT0FBTztBQUNuRCxlQUFXLE1BQU07QUFDakIsYUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN0QyxVQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksR0FBRztBQUNyQixpQkFBUyxPQUFPLEdBQUcsQ0FBQztBQUNwQixhQUFLO0FBQUEsTUFDVDtBQUNKLGFBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLE1BQU0sU0FBUyxRQUFRLEtBQUssR0FBRztBQUN0RCxVQUFJRCxRQUFPLE1BQU0sU0FBUyxDQUFDO0FBQzNCLGFBQU8sSUFBSSxTQUFTLFVBQVUsU0FBUyxDQUFDLElBQUlBO0FBQ3hDLGFBQUs7QUFDVCxlQUFTLE9BQU8sR0FBRyxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsTUFBTSxTQUFTLElBQUksQ0FBQyxHQUFHLE1BQU0sU0FBUyxJQUFJLENBQUMsQ0FBQztBQUFBLElBQ3pGO0FBQUEsRUFDSjtBQUNBLFNBQU8sSUFBSSxjQUFjLFNBQVMsS0FBSyxLQUFLLEdBQUcsUUFBUTtBQUMzRDtBQUNBLFNBQVMsVUFBVSxPQUFPQyxTQUFRO0FBQzlCLE1BQUksQ0FBQ0EsV0FBVSxDQUFDLE1BQU07QUFDbEIsV0FBTztBQUNYLE1BQUksU0FBUyxDQUFDO0FBQ2QsV0FBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNuQyxRQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLFdBQU8sS0FBSyxJQUFJLFdBQVcsS0FBSyxPQUFPQSxTQUFRLEtBQUssS0FBS0EsU0FBUSxLQUFLLElBQUksQ0FBQztBQUFBLEVBQy9FO0FBQ0EsU0FBTztBQUNYO0FBQ0EsU0FBUyxpQ0FBaUMsVUFBVSxhQUFhLGFBQWEsU0FBU0EsU0FBUSxXQUFXLFNBQVM7QUFFL0csV0FBUyxPQUFPLEtBQUswQixZQUFXO0FBQzVCLGFBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxNQUFNLFFBQVEsS0FBSztBQUN2QyxVQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsRUFBRSxJQUFJLFNBQVMxQixTQUFRMEIsVUFBUztBQUN4RCxVQUFJO0FBQ0Esb0JBQVksS0FBSyxNQUFNO0FBQUEsZUFDbEIsUUFBUTtBQUNiLGdCQUFRLFNBQVMsSUFBSSxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDMUM7QUFDQSxhQUFTLElBQUksR0FBRyxJQUFJLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDMUMsYUFBTyxJQUFJLFNBQVMsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSUEsYUFBWSxDQUFDO0FBQUEsRUFDbkU7QUFDQSxXQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3RDLFFBQUksU0FBUyxJQUFJLENBQUMsS0FBSztBQUNuQixhQUFPLFNBQVMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDO0FBQzlELFNBQU87QUFDWDtBQUNBLFNBQVMsaUJBQWlCLE9BQU8sTUFBTTFCLFNBQVE7QUFDM0MsTUFBSSxLQUFLO0FBQ0wsV0FBTztBQUNYLE1BQUlNLE9BQU1OLFVBQVMsS0FBSyxVQUFVYSxTQUFRO0FBQzFDLFdBQVMsSUFBSSxHQUFHLE1BQU0sSUFBSSxNQUFNLFFBQVEsS0FBSztBQUN6QyxTQUFLLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxPQUFPYixXQUFVLEtBQUssS0FBS00sTUFBSztBQUMxRCxPQUFDTyxXQUFVQSxTQUFRLENBQUMsSUFBSSxLQUFLLElBQUk7QUFDakMsWUFBTSxDQUFDLElBQUk7QUFBQSxJQUNmO0FBQUEsRUFDSjtBQUNBLFNBQU9BO0FBQ1g7QUFDQSxTQUFTLGFBQWEsT0FBTztBQUN6QixNQUFJLFNBQVMsQ0FBQztBQUNkLFdBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRO0FBQzlCLFFBQUksTUFBTSxDQUFDLEtBQUs7QUFDWixhQUFPLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDNUIsU0FBTztBQUNYO0FBS0EsU0FBUyxVQUFVLE9BQU8sTUFBTWIsU0FBUSxTQUFTO0FBQzdDLE1BQUksV0FBVyxDQUFDLEdBQUcsV0FBVztBQUM5QixPQUFLLFFBQVEsQ0FBQyxXQUFXLGVBQWU7QUFDcEMsUUFBSWEsU0FBUSxpQkFBaUIsT0FBTyxXQUFXLGFBQWFiLE9BQU07QUFDbEUsUUFBSWEsUUFBTztBQUNQLGlCQUFXO0FBQ1gsVUFBSSxVQUFVLFVBQVVBLFFBQU8sV0FBV2IsVUFBUyxhQUFhLEdBQUcsT0FBTztBQUMxRSxVQUFJLFdBQVc7QUFDWCxpQkFBUyxLQUFLLFlBQVksYUFBYSxVQUFVLFVBQVUsT0FBTztBQUFBLElBQzFFO0FBQUEsRUFDSixDQUFDO0FBQ0QsTUFBSSxTQUFTLFVBQVUsV0FBVyxhQUFhLEtBQUssSUFBSSxPQUFPLENBQUNBLE9BQU0sRUFBRSxLQUFLLEtBQUs7QUFDbEYsV0FBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVE7QUFDL0IsUUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssTUFBTSxNQUFNLE9BQU8sQ0FBQyxDQUFDLEdBQUc7QUFDeEMsVUFBSSxRQUFRO0FBQ1IsZ0JBQVEsU0FBUyxPQUFPLENBQUMsRUFBRSxJQUFJO0FBQ25DLGFBQU8sT0FBTyxLQUFLLENBQUM7QUFBQSxJQUN4QjtBQUNKLFNBQU8sT0FBTyxVQUFVLFNBQVMsU0FBUyxJQUFJLGNBQWMsUUFBUSxRQUFRLElBQUk7QUFDcEY7QUFJQSxTQUFTLE1BQU0sR0FBRyxHQUFHO0FBQ2pCLFNBQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtBQUN2QztBQUtBLFNBQVMsY0FBYyxPQUFPO0FBQzFCLE1BQUksVUFBVTtBQUNkLFdBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxTQUFTLEdBQUcsS0FBSztBQUN6QyxRQUFJLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLFFBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEIsZUFBUyxJQUFJLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3pDLFlBQUksT0FBTyxRQUFRLENBQUM7QUFDcEIsWUFBSSxLQUFLLFFBQVEsS0FBSyxNQUFNO0FBQ3hCLGNBQUksS0FBSyxNQUFNLEtBQUssSUFBSTtBQUNwQixnQkFBSSxXQUFXO0FBQ1gsd0JBQVUsTUFBTSxNQUFNO0FBRzFCLG9CQUFRLENBQUMsSUFBSSxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQUssRUFBRTtBQUN6Qyx3QkFBWSxTQUFTLElBQUksR0FBRyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQUEsVUFDM0Q7QUFDQTtBQUFBLFFBQ0osT0FDSztBQUNELGNBQUksS0FBSyxPQUFPLEtBQUssSUFBSTtBQUNyQixnQkFBSSxXQUFXO0FBQ1gsd0JBQVUsTUFBTSxNQUFNO0FBRzFCLG9CQUFRLENBQUMsSUFBSSxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBSTtBQUMzQyx3QkFBWSxTQUFTLEdBQUcsS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLEVBQUUsQ0FBQztBQUFBLFVBQ3pEO0FBQ0E7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLEVBQ1I7QUFDQSxTQUFPO0FBQ1g7QUFDQSxTQUFTLFlBQVksT0FBTyxHQUFHLE1BQU07QUFDakMsU0FBTyxJQUFJLE1BQU0sVUFBVSxNQUFNLE1BQU0sTUFBTSxDQUFDLENBQUMsSUFBSTtBQUMvQztBQUNKLFFBQU0sT0FBTyxHQUFHLEdBQUcsSUFBSTtBQUMzQjtBQUVBLFNBQVMsZ0JBQWdCLE1BQU07QUFDM0IsTUFBSWEsU0FBUSxDQUFDO0FBQ2IsT0FBSyxTQUFTLGVBQWUsT0FBSztBQUM5QixRQUFJLFNBQVMsRUFBRSxLQUFLLEtBQUs7QUFDekIsUUFBSSxVQUFVLFVBQVU7QUFDcEIsTUFBQUEsT0FBTSxLQUFLLE1BQU07QUFBQSxFQUN6QixDQUFDO0FBQ0QsTUFBSSxLQUFLO0FBQ0wsSUFBQUEsT0FBTSxLQUFLLGNBQWMsT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDLEtBQUssY0FBYyxJQUFJLENBQUMsQ0FBQztBQUM5RSxTQUFPLGdCQUFnQixLQUFLQSxNQUFLO0FBQ3JDO0FBRUEsSUFBTSxpQkFBaUI7QUFBQSxFQUNuQixXQUFXO0FBQUEsRUFDWCxlQUFlO0FBQUEsRUFDZix1QkFBdUI7QUFBQSxFQUN2QixZQUFZO0FBQUEsRUFDWixtQkFBbUI7QUFBQSxFQUNuQixTQUFTO0FBQ2I7QUFFQSxJQUFNLGNBQWMsTUFBTSxjQUFjO0FBQ3hDLElBQU0saUJBQU4sTUFBcUI7QUFBQSxFQUNqQixjQUFjO0FBQ1YsU0FBSyxhQUFhO0FBQ2xCLFNBQUssZUFBZTtBQUNwQixTQUFLLFlBQVk7QUFDakIsU0FBSyxjQUFjO0FBQUEsRUFDdkI7QUFBQSxFQUNBLElBQUksS0FBSztBQUNMLFNBQUssYUFBYSxJQUFJO0FBQ3RCLFNBQUssZUFBZSxJQUFJO0FBQ3hCLFNBQUssWUFBWSxJQUFJO0FBQ3JCLFNBQUssY0FBYyxJQUFJO0FBQUEsRUFDM0I7QUFBQSxFQUNBLFFBQVE7QUFDSixTQUFLLGFBQWEsS0FBSyxZQUFZO0FBQUEsRUFDdkM7QUFBQSxFQUNBLEdBQUcsS0FBSztBQUNKLFdBQU8sSUFBSSxjQUFjLEtBQUssY0FBYyxJQUFJLGdCQUFnQixLQUFLLGdCQUNqRSxJQUFJLGFBQWEsS0FBSyxhQUFhLElBQUksZUFBZSxLQUFLO0FBQUEsRUFDbkU7QUFDSjtBQUNBLElBQU0sY0FBTixNQUFrQjtBQUFBLEVBQ2QsWUFBWSxNQUFNLGlCQUFpQjtBQUMvQixTQUFLLE9BQU87QUFDWixTQUFLLGtCQUFrQjtBQUN2QixTQUFLLFFBQVEsQ0FBQztBQUNkLFNBQUssZUFBZTtBQUNwQixTQUFLLFdBQVc7QUFDaEIsU0FBSyxtQkFBbUIsSUFBSTtBQUM1QixTQUFLLGFBQWE7QUFDbEIsU0FBSyw4QkFBOEI7QUFDbkMsU0FBSyxXQUFXLE9BQU8sb0JBQ25CLElBQUksT0FBTyxpQkFBaUIsZUFBYTtBQUNyQyxlQUFTLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUTtBQUNsQyxhQUFLLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQztBQUtoQyxVQUFJLE1BQU0sY0FBYyxNQUFNLFVBQVUsS0FBSyxPQUFLLEVBQUUsUUFBUSxlQUFlLEVBQUUsYUFBYSxVQUN0RixFQUFFLFFBQVEsbUJBQW1CLEVBQUUsU0FBUyxTQUFTLEVBQUUsT0FBTyxVQUFVLE1BQU07QUFDMUUsYUFBSyxVQUFVO0FBQUE7QUFFZixhQUFLLE1BQU07QUFBQSxJQUNuQixDQUFDO0FBQ0wsUUFBSSxhQUFhO0FBQ2IsV0FBSyxhQUFhLE9BQUs7QUFDbkIsYUFBSyxNQUFNLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxNQUFNLGlCQUFpQixVQUFVLEVBQUUsVUFBVSxDQUFDO0FBQ2xGLGFBQUssVUFBVTtBQUFBLE1BQ25CO0FBQUEsSUFDSjtBQUNBLFNBQUssb0JBQW9CLEtBQUssa0JBQWtCLEtBQUssSUFBSTtBQUFBLEVBQzdEO0FBQUEsRUFDQSxZQUFZO0FBQ1IsUUFBSSxLQUFLLGVBQWU7QUFDcEIsV0FBSyxlQUFlLE9BQU8sV0FBVyxNQUFNO0FBQUUsYUFBSyxlQUFlO0FBQUksYUFBSyxNQUFNO0FBQUEsTUFBRyxHQUFHLEVBQUU7QUFBQSxFQUNqRztBQUFBLEVBQ0EsYUFBYTtBQUNULFFBQUksS0FBSyxlQUFlLElBQUk7QUFDeEIsYUFBTyxhQUFhLEtBQUssWUFBWTtBQUNyQyxXQUFLLGVBQWU7QUFDcEIsV0FBSyxNQUFNO0FBQUEsSUFDZjtBQUFBLEVBQ0o7QUFBQSxFQUNBLFFBQVE7QUFDSixRQUFJLEtBQUssVUFBVTtBQUNmLFdBQUssU0FBUyxZQUFZO0FBQzFCLFdBQUssU0FBUyxRQUFRLEtBQUssS0FBSyxLQUFLLGNBQWM7QUFBQSxJQUN2RDtBQUNBLFFBQUksS0FBSztBQUNMLFdBQUssS0FBSyxJQUFJLGlCQUFpQiw0QkFBNEIsS0FBSyxVQUFVO0FBQzlFLFNBQUssaUJBQWlCO0FBQUEsRUFDMUI7QUFBQSxFQUNBLE9BQU87QUFDSCxRQUFJLEtBQUssVUFBVTtBQUNmLFVBQUksT0FBTyxLQUFLLFNBQVMsWUFBWTtBQUNyQyxVQUFJLEtBQUssUUFBUTtBQUNiLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUTtBQUM3QixlQUFLLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQztBQUMzQixlQUFPLFdBQVcsTUFBTSxLQUFLLE1BQU0sR0FBRyxFQUFFO0FBQUEsTUFDNUM7QUFDQSxXQUFLLFNBQVMsV0FBVztBQUFBLElBQzdCO0FBQ0EsUUFBSSxLQUFLO0FBQ0wsV0FBSyxLQUFLLElBQUksb0JBQW9CLDRCQUE0QixLQUFLLFVBQVU7QUFDakYsU0FBSyxvQkFBb0I7QUFBQSxFQUM3QjtBQUFBLEVBQ0EsbUJBQW1CO0FBQ2YsU0FBSyxLQUFLLElBQUksY0FBYyxpQkFBaUIsbUJBQW1CLEtBQUssaUJBQWlCO0FBQUEsRUFDMUY7QUFBQSxFQUNBLHNCQUFzQjtBQUNsQixTQUFLLEtBQUssSUFBSSxjQUFjLG9CQUFvQixtQkFBbUIsS0FBSyxpQkFBaUI7QUFBQSxFQUM3RjtBQUFBLEVBQ0EsMkJBQTJCO0FBQ3ZCLFNBQUssOEJBQThCO0FBQ25DLGVBQVcsTUFBTSxLQUFLLDhCQUE4QixPQUFPLEVBQUU7QUFBQSxFQUNqRTtBQUFBLEVBQ0Esb0JBQW9CO0FBQ2hCLFFBQUksQ0FBQyxxQkFBcUIsS0FBSyxJQUFJO0FBQy9CO0FBQ0osUUFBSSxLQUFLO0FBQ0wsYUFBTyxlQUFlLEtBQUssSUFBSTtBQUluQyxRQUFJLE1BQU0sY0FBYyxNQUFNLENBQUMsS0FBSyxLQUFLLE1BQU0sVUFBVSxPQUFPO0FBQzVELFVBQUksTUFBTSxLQUFLLEtBQUssa0JBQWtCO0FBRXRDLFVBQUksSUFBSSxhQUFhLHFCQUFxQixJQUFJLFdBQVcsSUFBSSxhQUFhLElBQUksWUFBWSxJQUFJLFlBQVk7QUFDdEcsZUFBTyxLQUFLLFVBQVU7QUFBQSxJQUM5QjtBQUNBLFNBQUssTUFBTTtBQUFBLEVBQ2Y7QUFBQSxFQUNBLGtCQUFrQjtBQUNkLFNBQUssaUJBQWlCLElBQUksS0FBSyxLQUFLLGtCQUFrQixDQUFDO0FBQUEsRUFDM0Q7QUFBQSxFQUNBLHNCQUFzQixLQUFLO0FBQ3ZCLFFBQUksQ0FBQyxJQUFJO0FBQ0wsYUFBTztBQUNYLFFBQUksWUFBWSxvQkFBSSxPQUFLO0FBQ3pCLGFBQVMsT0FBTyxJQUFJLFdBQVcsTUFBTSxPQUFPLFdBQVcsSUFBSTtBQUN2RCxnQkFBVSxJQUFJLElBQUk7QUFDdEIsYUFBUyxPQUFPLElBQUksWUFBWSxNQUFNLE9BQU8sV0FBVyxJQUFJO0FBQ3hELFVBQUksVUFBVSxJQUFJLElBQUksR0FBRztBQUNyQixvQkFBWTtBQUNaO0FBQUEsTUFDSjtBQUNKLFFBQUksT0FBTyxhQUFhLEtBQUssS0FBSyxRQUFRLFlBQVksU0FBUztBQUMvRCxRQUFJLFFBQVEsS0FBSyxlQUFlO0FBQUEsTUFDNUIsTUFBTTtBQUFBLE1BQ04sUUFBUSxVQUFVLFlBQVksSUFBSSxVQUFVLGFBQWE7QUFBQSxJQUM3RCxDQUFDLEdBQUc7QUFDQSxXQUFLLGdCQUFnQjtBQUNyQixhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFBQSxFQUNBLGlCQUFpQjtBQUNiLFFBQUksS0FBSztBQUNMLGVBQVMsT0FBTyxLQUFLLFNBQVMsWUFBWTtBQUN0QyxhQUFLLE1BQU0sS0FBSyxHQUFHO0FBQzNCLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQUEsRUFDQSxRQUFRO0FBQ0osUUFBSSxFQUFFLEtBQUssSUFBSTtBQUNmLFFBQUksQ0FBQyxLQUFLLFdBQVcsS0FBSyxlQUFlO0FBQ3JDO0FBQ0osUUFBSSxZQUFZLEtBQUssZUFBZTtBQUNwQyxRQUFJLFVBQVU7QUFDVixXQUFLLFFBQVEsQ0FBQztBQUNsQixRQUFJLE1BQU0sS0FBSyxrQkFBa0I7QUFDakMsUUFBSSxTQUFTLENBQUMsS0FBSywrQkFBK0IsQ0FBQyxLQUFLLGlCQUFpQixHQUFHLEdBQUcsS0FBSyxxQkFBcUIsSUFBSSxLQUFLLENBQUMsS0FBSyxzQkFBc0IsR0FBRztBQUNqSixRQUFJZCxRQUFPLElBQUksS0FBSyxJQUFJLFdBQVcsT0FBTyxRQUFRLENBQUM7QUFDbkQsUUFBSSxLQUFLLFVBQVU7QUFDZixlQUFTLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUSxLQUFLO0FBQ3ZDLFlBQUksU0FBUyxLQUFLLGlCQUFpQixVQUFVLENBQUMsR0FBRyxLQUFLO0FBQ3RELFlBQUksUUFBUTtBQUNSLFVBQUFBLFFBQU9BLFFBQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxJQUFJLE9BQU8sTUFBTUEsS0FBSTtBQUMxRCxlQUFLLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxJQUFJLE9BQU8sSUFBSSxFQUFFO0FBQ2hELGNBQUksT0FBTztBQUNQLHVCQUFXO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBLFFBQUksU0FBUyxNQUFNLFNBQVMsR0FBRztBQUMzQixVQUFJLE1BQU0sTUFBTSxPQUFPLE9BQUssRUFBRSxZQUFZLElBQUk7QUFDOUMsVUFBSSxJQUFJLFVBQVUsR0FBRztBQUNqQixZQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUM7QUFDekIsWUFBSSxFQUFFLGNBQWMsRUFBRSxXQUFXLGNBQWMsRUFBRTtBQUM3QyxZQUFFLE9BQU87QUFBQTtBQUVULFlBQUUsT0FBTztBQUFBLE1BQ2pCO0FBQUEsSUFDSjtBQUNBLFFBQUksVUFBVTtBQUlkLFFBQUlBLFFBQU8sS0FBSyxVQUFVLEtBQUssTUFBTSxZQUFZLEtBQUssSUFBSSxJQUFJLE9BQzFELEtBQUssSUFBSSxLQUFLLE1BQU0sV0FBVyxLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FDekUsbUJBQW1CLEdBQUcsTUFBTSxVQUFVLGlCQUFpQixJQUFJLE1BQzNELFFBQVEsR0FBRyxVQUFVLEtBQUssS0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUc7QUFDMUQsV0FBSyxNQUFNLFlBQVk7QUFDdkIscUJBQWUsSUFBSTtBQUNuQixXQUFLLGlCQUFpQixJQUFJLEdBQUc7QUFDN0IsV0FBSyxrQkFBa0I7QUFBQSxJQUMzQixXQUNTQSxRQUFPLE1BQU0sUUFBUTtBQUMxQixVQUFJQSxRQUFPLElBQUk7QUFDWCxhQUFLLFFBQVEsVUFBVUEsT0FBTSxFQUFFO0FBQy9CLGlCQUFTLElBQUk7QUFBQSxNQUNqQjtBQUNBLFdBQUssZ0JBQWdCQSxPQUFNLElBQUksVUFBVSxLQUFLO0FBQzlDLFVBQUksS0FBSyxXQUFXLEtBQUssUUFBUTtBQUM3QixhQUFLLFlBQVksS0FBSyxLQUFLO0FBQUEsZUFDdEIsQ0FBQyxLQUFLLGlCQUFpQixHQUFHLEdBQUc7QUFDbEMsdUJBQWUsSUFBSTtBQUN2QixXQUFLLGlCQUFpQixJQUFJLEdBQUc7QUFBQSxJQUNqQztBQUFBLEVBQ0o7QUFBQSxFQUNBLGlCQUFpQixLQUFLLE9BQU87QUFFekIsUUFBSSxNQUFNLFFBQVEsSUFBSSxNQUFNLElBQUk7QUFDNUIsYUFBTztBQUNYLFFBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxZQUFZLElBQUksTUFBTTtBQUNuRCxRQUFJLElBQUksUUFBUSxpQkFDWCxRQUFRLEtBQUssS0FBSyxXQUFXLElBQUksaUJBQWlCO0FBQUEsSUFFOUMsSUFBSSxpQkFBaUIsV0FBVyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksT0FBTyxhQUFhLE9BQU87QUFDdEYsYUFBTztBQUNYLFFBQUksQ0FBQyxRQUFRLEtBQUssZUFBZSxHQUFHO0FBQ2hDLGFBQU87QUFDWCxRQUFJLElBQUksUUFBUSxhQUFhO0FBQ3pCLGVBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxXQUFXLFFBQVE7QUFDdkMsY0FBTSxLQUFLLElBQUksV0FBVyxDQUFDLENBQUM7QUFDaEMsVUFBSSxLQUFLLGNBQWMsS0FBSyxjQUFjLEtBQUssT0FBTyxDQUFDLEtBQUssV0FBVyxTQUFTLElBQUksTUFBTTtBQUN0RixlQUFPLEVBQUUsTUFBTSxLQUFLLFdBQVcsSUFBSSxLQUFLLFNBQVM7QUFDckQsVUFBSSxPQUFPLElBQUksaUJBQWlCLE9BQU8sSUFBSTtBQUMzQyxVQUFJLE1BQU0sY0FBYyxNQUFNLElBQUksV0FBVyxRQUFRO0FBR2pELGlCQUFTLElBQUksR0FBRyxJQUFJLElBQUksV0FBVyxRQUFRLEtBQUs7QUFDNUMsY0FBSSxFQUFFLGlCQUFpQixZQUFZLElBQUksSUFBSSxXQUFXLENBQUM7QUFDdkQsY0FBSSxDQUFDLG1CQUFtQixNQUFNLFVBQVUsUUFBUSxLQUFLLElBQUksWUFBWSxlQUFlLElBQUk7QUFDcEYsbUJBQU87QUFDWCxjQUFJLENBQUMsZUFBZSxNQUFNLFVBQVUsUUFBUSxLQUFLLElBQUksWUFBWSxXQUFXLElBQUk7QUFDNUUsbUJBQU87QUFBQSxRQUNmO0FBQUEsTUFDSjtBQUNBLFVBQUksYUFBYSxRQUFRLEtBQUssY0FBYyxJQUFJLFNBQzFDLFNBQVMsSUFBSSxJQUFJLElBQUk7QUFDM0IsVUFBSUEsUUFBTyxLQUFLLGdCQUFnQixJQUFJLFFBQVEsWUFBWSxFQUFFO0FBQzFELFVBQUksV0FBVyxRQUFRLEtBQUssY0FBYyxJQUFJLFNBQ3hDLFNBQVMsSUFBSSxJQUFJLElBQUksT0FBTyxXQUFXO0FBQzdDLFVBQUksS0FBSyxLQUFLLGdCQUFnQixJQUFJLFFBQVEsVUFBVSxDQUFDO0FBQ3JELGFBQU8sRUFBRSxNQUFBQSxPQUFNLEdBQUc7QUFBQSxJQUN0QixXQUNTLElBQUksUUFBUSxjQUFjO0FBQy9CLGFBQU8sRUFBRSxNQUFNLEtBQUssYUFBYSxLQUFLLFFBQVEsSUFBSSxLQUFLLFdBQVcsS0FBSyxPQUFPO0FBQUEsSUFDbEYsT0FDSztBQUNELGFBQU87QUFBQSxRQUNILE1BQU0sS0FBSztBQUFBLFFBQ1gsSUFBSSxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUtULFVBQVUsSUFBSSxPQUFPLGFBQWEsSUFBSTtBQUFBLE1BQzFDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDSjtBQUNBLElBQUksYUFBYSxvQkFBSSxRQUFRO0FBQzdCLElBQUksaUJBQWlCO0FBQ3JCLFNBQVMsU0FBUyxNQUFNO0FBQ3BCLE1BQUksV0FBVyxJQUFJLElBQUk7QUFDbkI7QUFDSixhQUFXLElBQUksTUFBTSxJQUFJO0FBQ3pCLE1BQUksQ0FBQyxVQUFVLFVBQVUsVUFBVSxFQUFFLFFBQVEsaUJBQWlCLEtBQUssR0FBRyxFQUFFLFVBQVUsTUFBTSxJQUFJO0FBQ3hGLFNBQUssd0JBQXdCO0FBQzdCLFFBQUk7QUFDQTtBQUNKLFlBQVEsTUFBTSxFQUFFLDBLQUEwSztBQUMxTCxxQkFBaUI7QUFBQSxFQUNyQjtBQUNKO0FBR0EsU0FBUywyQkFBMkIsTUFBTTtBQUN0QyxNQUFJYztBQUNKLFdBQVNjLE1BQUssT0FBTztBQUNqQixVQUFNLGVBQWU7QUFDckIsVUFBTSx5QkFBeUI7QUFDL0IsSUFBQWQsU0FBUSxNQUFNLGdCQUFnQixFQUFFLENBQUM7QUFBQSxFQUNyQztBQU1BLE9BQUssSUFBSSxpQkFBaUIsZUFBZWMsT0FBTSxJQUFJO0FBQ25ELFdBQVMsWUFBWSxRQUFRO0FBQzdCLE9BQUssSUFBSSxvQkFBb0IsZUFBZUEsT0FBTSxJQUFJO0FBQ3RELE1BQUksYUFBYWQsT0FBTSxnQkFBZ0IsZUFBZUEsT0FBTTtBQUM1RCxNQUFJLFlBQVlBLE9BQU0sY0FBYyxjQUFjQSxPQUFNO0FBQ3hELE1BQUksZ0JBQWdCLEtBQUssU0FBUyxLQUFLLE1BQU0sVUFBVSxNQUFNO0FBSTdELE1BQUkscUJBQXFCLGNBQWMsTUFBTSxjQUFjLFFBQVEsV0FBVyxXQUFXO0FBQ3JGLEtBQUMsWUFBWSxjQUFjLFdBQVcsV0FBVyxJQUFJLENBQUMsV0FBVyxhQUFhLFlBQVksWUFBWTtBQUMxRyxTQUFPLEVBQUUsWUFBWSxjQUFjLFdBQVcsWUFBWTtBQUM5RDtBQU9BLFNBQVMsYUFBYSxNQUFNLE9BQU8sS0FBSztBQUNwQyxNQUFJLEVBQUUsTUFBTSxRQUFRLFlBQVksVUFBVSxNQUFBZCxPQUFNLEdBQUcsSUFBSSxLQUFLLFFBQVEsV0FBVyxPQUFPLEdBQUc7QUFDekYsTUFBSSxTQUFTLEtBQUssa0JBQWtCO0FBQ3BDLE1BQUk2QjtBQUNKLE1BQUksU0FBUyxPQUFPO0FBQ3BCLE1BQUksVUFBVSxLQUFLLElBQUksU0FBUyxPQUFPLFlBQVksSUFBSSxTQUFTLE9BQU8sVUFBVSxHQUFHO0FBQ2hGLElBQUFBLFFBQU8sQ0FBQyxFQUFFLE1BQU0sUUFBUSxRQUFRLE9BQU8sYUFBYSxDQUFDO0FBQ3JELFFBQUksQ0FBQyxtQkFBbUIsTUFBTTtBQUMxQixNQUFBQSxNQUFLLEtBQUssRUFBRSxNQUFNLE9BQU8sV0FBVyxRQUFRLE9BQU8sWUFBWSxDQUFDO0FBQUEsRUFDeEU7QUFHQSxNQUFJLFVBQVUsS0FBSyxNQUFNLGdCQUFnQixHQUFHO0FBQ3hDLGFBQVMsTUFBTSxVQUFVLE1BQU0sWUFBWSxPQUFPO0FBQzlDLFVBQUksT0FBTyxPQUFPLFdBQVcsTUFBTSxDQUFDLEdBQUcsT0FBTyxLQUFLO0FBQ25ELFVBQUksS0FBSyxZQUFZLFFBQVEsQ0FBQyxNQUFNO0FBQ2hDLG1CQUFXO0FBQ1g7QUFBQSxNQUNKO0FBQ0EsVUFBSSxDQUFDLFFBQVEsS0FBSztBQUNkO0FBQUEsSUFDUjtBQUFBLEVBQ0o7QUFDQSxNQUFJLFdBQVcsS0FBSyxNQUFNO0FBQzFCLE1BQUksU0FBUyxLQUFLLFNBQVMsV0FBVyxLQUFLLFVBQVUsV0FBVyxLQUFLLE1BQU0sTUFBTTtBQUNqRixNQUFJLFFBQVEsU0FBUyxRQUFRN0IsS0FBSTtBQUNqQyxNQUFJLE1BQU0sTUFBTUUsT0FBTSxPQUFPLE1BQU0sUUFBUTtBQUFBLElBQ3ZDLFNBQVMsTUFBTTtBQUFBLElBQ2YsVUFBVSxNQUFNLE9BQU8sZUFBZSxNQUFNLE1BQU0sQ0FBQztBQUFBLElBQ25ELFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxJQUNOLElBQUk7QUFBQSxJQUNKLG9CQUFvQixNQUFNLE9BQU8sS0FBSyxjQUFjLFFBQVEsU0FBUztBQUFBLElBQ3JFLGVBQWUyQjtBQUFBLElBQ2Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxFQUNiLENBQUM7QUFDRCxNQUFJQSxTQUFRQSxNQUFLLENBQUMsRUFBRSxPQUFPLE1BQU07QUFDN0IsUUFBSUMsVUFBU0QsTUFBSyxDQUFDLEVBQUUsS0FBSyxPQUFPQSxNQUFLLENBQUMsS0FBS0EsTUFBSyxDQUFDLEVBQUU7QUFDcEQsUUFBSSxRQUFRO0FBQ1IsYUFBT0M7QUFDWCxVQUFNLEVBQUUsUUFBUUEsVUFBUzlCLE9BQU0sTUFBTSxPQUFPQSxNQUFLO0FBQUEsRUFDckQ7QUFDQSxTQUFPLEVBQUUsS0FBQUUsTUFBSyxLQUFLLE1BQUFGLE9BQU0sR0FBRztBQUNoQztBQUNBLFNBQVMsYUFBYSxLQUFLO0FBQ3ZCLE1BQUksT0FBTyxJQUFJO0FBQ2YsTUFBSSxNQUFNO0FBQ04sV0FBTyxLQUFLLFVBQVU7QUFBQSxFQUMxQixXQUNTLElBQUksWUFBWSxRQUFRLElBQUksWUFBWTtBQUk3QyxRQUFJLFVBQVUsYUFBYSxLQUFLLElBQUksV0FBVyxRQUFRLEdBQUc7QUFDdEQsVUFBSSxPQUFPLFNBQVMsY0FBYyxLQUFLO0FBQ3ZDLFdBQUssWUFBWSxTQUFTLGNBQWMsSUFBSSxDQUFDO0FBQzdDLGFBQU8sRUFBRSxLQUFLO0FBQUEsSUFDbEIsV0FDUyxJQUFJLFdBQVcsYUFBYSxPQUFPLFVBQVUsZ0JBQWdCLEtBQUssSUFBSSxXQUFXLFFBQVEsR0FBRztBQUNqRyxhQUFPLEVBQUUsUUFBUSxLQUFLO0FBQUEsSUFDMUI7QUFBQSxFQUNKLFdBQ1MsSUFBSSxZQUFZLFNBQVMsSUFBSSxhQUFhLGtCQUFrQixHQUFHO0FBQ3BFLFdBQU8sRUFBRSxRQUFRLEtBQUs7QUFBQSxFQUMxQjtBQUNBLFNBQU87QUFDWDtBQUNBLElBQU0sV0FBVztBQUNqQixTQUFTLGNBQWMsTUFBTUEsT0FBTSxJQUFJLFVBQVUsWUFBWTtBQUN6RCxNQUFJLGdCQUFnQixLQUFLLE1BQU0sOEJBQThCLEtBQUssWUFBWSxLQUFLLE1BQU0sZ0JBQWdCO0FBQ3pHLE9BQUssTUFBTSw0QkFBNEI7QUFDdkMsTUFBSUEsUUFBTyxHQUFHO0FBQ1YsUUFBSSxTQUFTLEtBQUssTUFBTSxvQkFBb0IsS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sc0JBQXNCO0FBQy9GLFFBQUksU0FBUyxpQkFBaUIsTUFBTSxNQUFNO0FBQzFDLFFBQUksVUFBVSxDQUFDLEtBQUssTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHO0FBQzVDLFVBQUksVUFBVSxXQUNWLEtBQUssTUFBTSxnQkFBZ0IsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssTUFBTSxtQkFDL0QsS0FBSyxTQUFTLGlCQUFpQixPQUFLLEVBQUUsTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLENBQUM7QUFDbEU7QUFDSixVQUFJa0IsTUFBSyxLQUFLLE1BQU0sR0FBRyxhQUFhLE1BQU07QUFDMUMsVUFBSSxVQUFVO0FBQ1YsUUFBQUEsSUFBRyxRQUFRLFdBQVcsSUFBSTtBQUFBLGVBQ3JCLFVBQVU7QUFDZixRQUFBQSxJQUFHLGVBQWU7QUFDdEIsVUFBSTtBQUNBLFFBQUFBLElBQUcsUUFBUSxlQUFlLGFBQWE7QUFDM0MsV0FBSyxTQUFTQSxHQUFFO0FBQUEsSUFDcEI7QUFDQTtBQUFBLEVBQ0o7QUFDQSxNQUFJLFVBQVUsS0FBSyxNQUFNLElBQUksUUFBUWxCLEtBQUk7QUFDekMsTUFBSSxTQUFTLFFBQVEsWUFBWSxFQUFFO0FBQ25DLEVBQUFBLFFBQU8sUUFBUSxPQUFPLFNBQVMsQ0FBQztBQUNoQyxPQUFLLEtBQUssTUFBTSxJQUFJLFFBQVEsRUFBRSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hELE1BQUksTUFBTSxLQUFLLE1BQU07QUFDckIsTUFBSSxRQUFRLGFBQWEsTUFBTUEsT0FBTSxFQUFFO0FBQ3ZDLE1BQUlFLE9BQU0sS0FBSyxNQUFNLEtBQUssVUFBVUEsS0FBSSxNQUFNLE1BQU0sTUFBTSxNQUFNLEVBQUU7QUFDbEUsTUFBSSxjQUFjO0FBRWxCLE1BQUksS0FBSyxNQUFNLGdCQUFnQixLQUFLLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxNQUFNLGlCQUFpQjtBQUMvRSxtQkFBZSxLQUFLLE1BQU0sVUFBVTtBQUNwQyxvQkFBZ0I7QUFBQSxFQUNwQixPQUNLO0FBQ0QsbUJBQWUsS0FBSyxNQUFNLFVBQVU7QUFDcEMsb0JBQWdCO0FBQUEsRUFDcEI7QUFDQSxPQUFLLE1BQU0sY0FBYztBQUN6QixNQUFJLFNBQVMsU0FBUyxRQUFRLFNBQVMsTUFBTSxJQUFJLFNBQVMsTUFBTSxNQUFNLGNBQWMsYUFBYTtBQUNqRyxPQUFLLE9BQU8sS0FBSyxNQUFNLGVBQWUsS0FBSyxJQUFJLElBQUksT0FBTyxZQUN0RCxXQUFXLEtBQUssT0FBSyxFQUFFLFlBQVksS0FBSyxDQUFDLFNBQVMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUNqRSxDQUFDLFVBQVUsT0FBTyxRQUFRLE9BQU8sU0FDbEMsS0FBSyxTQUFTLGlCQUFpQixPQUFLLEVBQUUsTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRztBQUNyRSxTQUFLLE1BQU0sZUFBZTtBQUMxQjtBQUFBLEVBQ0o7QUFDQSxNQUFJLENBQUMsUUFBUTtBQUNULFFBQUksWUFBWSxlQUFlLGlCQUFpQixDQUFDLElBQUksU0FBUyxJQUFJLE1BQU0sV0FBVyxJQUFJLE9BQU8sS0FDMUYsQ0FBQyxLQUFLLGFBQWEsRUFBRSxNQUFNLE9BQU8sTUFBTSxJQUFJLFVBQVUsTUFBTSxJQUFJLE9BQU87QUFDdkUsZUFBUyxFQUFFLE9BQU8sSUFBSSxNQUFNLE1BQU0sSUFBSSxJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQUEsSUFDM0QsT0FDSztBQUNELFVBQUksTUFBTSxLQUFLO0FBQ1gsWUFBSTZCLE9BQU0saUJBQWlCLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxHQUFHO0FBQzFELFlBQUlBLFFBQU8sQ0FBQ0EsS0FBSSxHQUFHLEtBQUssTUFBTSxTQUFTLEdBQUc7QUFDdEMsY0FBSWIsTUFBSyxLQUFLLE1BQU0sR0FBRyxhQUFhYSxJQUFHO0FBQ3ZDLGNBQUk7QUFDQSxZQUFBYixJQUFHLFFBQVEsZUFBZSxhQUFhO0FBQzNDLGVBQUssU0FBU0EsR0FBRTtBQUFBLFFBQ3BCO0FBQUEsTUFDSjtBQUNBO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFHQSxNQUFJLFVBQVUsS0FBSyxpQkFBaUIsTUFBTSxPQUFPLE1BQU0sSUFBSSxVQUFVLEtBQUssY0FBYyxLQUFLLFFBQ3pGLE1BQU0sSUFBSSxRQUFRLE1BQU0sSUFBSSxRQUFRO0FBQ3BDLFFBQUksT0FBTyxPQUFPLE9BQU8sT0FBTztBQUNoQyxVQUFNLE1BQU0sRUFBRSxRQUFRLE1BQU0sSUFBSSxTQUFTLE1BQU0sTUFBTSxNQUFNLElBQUksU0FBUyxLQUFLO0FBQUEsRUFDakY7QUFDQSxPQUFLLE1BQU07QUFJWCxNQUFJLEtBQUssTUFBTSxVQUFVLE9BQU8sS0FBSyxNQUFNLFVBQVUsTUFDakQsT0FBTyxTQUFTLE9BQU8sUUFDdkIsS0FBSyxNQUFNLHFCQUFxQixlQUFlO0FBQy9DLFFBQUksT0FBTyxRQUFRLEtBQUssTUFBTSxVQUFVLFFBQVEsT0FBTyxTQUFTLEtBQUssTUFBTSxVQUFVLE9BQU8sS0FDeEYsS0FBSyxNQUFNLFVBQVUsUUFBUSxNQUFNLE1BQU07QUFDekMsYUFBTyxRQUFRLEtBQUssTUFBTSxVQUFVO0FBQUEsSUFDeEMsV0FDUyxPQUFPLE9BQU8sS0FBSyxNQUFNLFVBQVUsTUFBTSxPQUFPLFFBQVEsS0FBSyxNQUFNLFVBQVUsS0FBSyxLQUN2RixLQUFLLE1BQU0sVUFBVSxNQUFNLE1BQU0sSUFBSTtBQUNyQyxhQUFPLFFBQVMsS0FBSyxNQUFNLFVBQVUsS0FBSyxPQUFPO0FBQ2pELGFBQU8sT0FBTyxLQUFLLE1BQU0sVUFBVTtBQUFBLElBQ3ZDO0FBQUEsRUFDSjtBQUlBLE1BQUksTUFBTSxjQUFjLE1BQU0sT0FBTyxRQUFRLE9BQU8sUUFBUSxLQUN4RCxPQUFPLFFBQVEsT0FBTyxTQUFTLE9BQU8sUUFBUSxNQUFNLFFBQ3BELE1BQU0sSUFBSSxZQUFZLE9BQU8sUUFBUSxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsTUFBTSxPQUFPLENBQUMsS0FBSyxTQUFXO0FBQ2xHLFdBQU87QUFDUCxXQUFPO0FBQ1AsV0FBTztBQUFBLEVBQ1g7QUFDQSxNQUFJLFFBQVEsTUFBTSxJQUFJLGVBQWUsT0FBTyxRQUFRLE1BQU0sSUFBSTtBQUM5RCxNQUFJLE1BQU0sTUFBTSxJQUFJLGVBQWUsT0FBTyxPQUFPLE1BQU0sSUFBSTtBQUMzRCxNQUFJLFNBQVNoQixLQUFJLFFBQVEsT0FBTyxLQUFLO0FBQ3JDLE1BQUksZUFBZSxNQUFNLFdBQVcsR0FBRyxLQUFLLE1BQU0sT0FBTyxpQkFBaUIsT0FBTyxJQUFJLEtBQUssT0FBTztBQUNqRyxNQUFJO0FBR0osT0FBTSxPQUFPLEtBQUssTUFBTSxlQUFlLEtBQUssSUFBSSxJQUFJLFFBQy9DLENBQUMsZ0JBQWdCLFdBQVcsS0FBSyxPQUFLLEVBQUUsWUFBWSxTQUFTLEVBQUUsWUFBWSxHQUFHLE1BQzlFLENBQUMsZ0JBQWdCLE1BQU0sTUFBTSxNQUFNLElBQUksUUFBUSxRQUFRLENBQUMsTUFBTSxXQUFXLEdBQUcsTUFDeEUsVUFBVSxVQUFVLFNBQVMsTUFBTSxJQUFJLFFBQVEsTUFBTSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksTUFDdkUsUUFBUSxRQUFRLElBQUksUUFDeEIsS0FBSyxTQUFTLGlCQUFpQixPQUFLLEVBQUUsTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRztBQUNyRSxTQUFLLE1BQU0sZUFBZTtBQUMxQjtBQUFBLEVBQ0o7QUFFQSxNQUFJLEtBQUssTUFBTSxVQUFVLFNBQVMsT0FBTyxTQUNyQyxjQUFjQSxNQUFLLE9BQU8sT0FBTyxPQUFPLE1BQU0sT0FBTyxHQUFHLEtBQ3hELEtBQUssU0FBUyxpQkFBaUIsT0FBSyxFQUFFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUc7QUFDeEUsUUFBSSxXQUFXO0FBQ1gsV0FBSyxZQUFZLHlCQUF5QjtBQUM5QztBQUFBLEVBQ0o7QUFJQSxNQUFJLFVBQVUsV0FBVyxPQUFPLFFBQVEsT0FBTztBQUMzQyxTQUFLLE1BQU0sb0JBQW9CLEtBQUssSUFBSTtBQVM1QyxNQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsTUFBTSxNQUFNLEtBQUssSUFBSSxNQUFNLEtBQUssSUFBSSxnQkFBZ0IsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUN4RyxNQUFNLE9BQU8sTUFBTSxJQUFJLFVBQVUsTUFBTSxJQUFJLFFBQVEsTUFBTSxJQUFJLFFBQVEsT0FBTyxNQUFNO0FBQ2xGLFdBQU8sUUFBUTtBQUNmLFVBQU0sTUFBTSxJQUFJLGVBQWUsT0FBTyxPQUFPLE1BQU0sSUFBSTtBQUN2RCxlQUFXLE1BQU07QUFDYixXQUFLLFNBQVMsaUJBQWlCLFNBQVUsR0FBRztBQUFFLGVBQU8sRUFBRSxNQUFNLFNBQVMsSUFBSSxPQUFPLENBQUM7QUFBQSxNQUFHLENBQUM7QUFBQSxJQUMxRixHQUFHLEVBQUU7QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLE9BQU8sT0FBTyxPQUFPLE9BQU87QUFDekMsTUFBSWdCLEtBQUksYUFBYTtBQUNyQixNQUFJLGNBQWM7QUFDZCxRQUFJLE1BQU0sT0FBTyxJQUFJLEtBQUs7QUFHdEIsVUFBSSxNQUFNLGNBQWMsTUFBTSxNQUFNLGdCQUFnQixHQUFHO0FBQ25ELGFBQUssWUFBWSx5QkFBeUI7QUFDMUMsbUJBQVcsTUFBTSxlQUFlLElBQUksR0FBRyxFQUFFO0FBQUEsTUFDN0M7QUFDQSxNQUFBQSxNQUFLLEtBQUssTUFBTSxHQUFHLE9BQU8sUUFBUSxJQUFJO0FBQ3RDLG9CQUFjaEIsS0FBSSxRQUFRLE9BQU8sS0FBSyxFQUFFLFlBQVlBLEtBQUksUUFBUSxPQUFPLElBQUksQ0FBQztBQUFBLElBQ2hGO0FBQUE7QUFBQSxNQUVBLE9BQU8sUUFBUSxPQUFPLFNBQ2pCLGFBQWEsYUFBYSxNQUFNLE9BQU8sUUFBUSxJQUFJLE1BQU0sY0FBYyxJQUFJLFlBQVksR0FBRyxPQUFPLE9BQU8sUUFBUSxJQUFJLE9BQU8sY0FBYyxPQUFPLE9BQU8sT0FBTyxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQUk7QUFDM0ssTUFBQWdCLE1BQUssS0FBSyxNQUFNO0FBQ2hCLFVBQUksV0FBVyxRQUFRO0FBQ25CLFFBQUFBLElBQUcsUUFBUSxRQUFRLE1BQU0sV0FBVyxJQUFJO0FBQUE7QUFFeEMsUUFBQUEsSUFBRyxXQUFXLFFBQVEsTUFBTSxXQUFXLElBQUk7QUFBQSxJQUNuRCxXQUNTLE1BQU0sT0FBTyxNQUFNLE1BQU0sTUFBTSxDQUFDLEVBQUUsVUFBVSxNQUFNLE1BQU0sS0FBSyxJQUFJLE1BQU0sS0FBSyxJQUFJLGFBQWEsSUFBSSxJQUFJO0FBRTFHLFVBQUksT0FBTyxNQUFNLE9BQU8sWUFBWSxNQUFNLGNBQWMsSUFBSSxZQUFZO0FBQ3hFLFVBQUksS0FBSyxTQUFTLG1CQUFtQixPQUFLLEVBQUUsTUFBTSxRQUFRLE1BQU0sSUFBSSxDQUFDO0FBQ2pFO0FBQ0osTUFBQUEsTUFBSyxLQUFLLE1BQU0sR0FBRyxXQUFXLE1BQU0sUUFBUSxJQUFJO0FBQUEsSUFDcEQ7QUFBQSxFQUNKO0FBQ0EsTUFBSSxDQUFDQTtBQUNELElBQUFBLE1BQUssS0FBSyxNQUFNLEdBQUcsUUFBUSxRQUFRLE1BQU0sTUFBTSxJQUFJLE1BQU0sT0FBTyxRQUFRLE1BQU0sTUFBTSxPQUFPLE9BQU8sTUFBTSxJQUFJLENBQUM7QUFDakgsTUFBSSxNQUFNLEtBQUs7QUFDWCxRQUFJYSxPQUFNLGlCQUFpQixNQUFNYixJQUFHLEtBQUssTUFBTSxHQUFHO0FBTWxELFFBQUlhLFFBQU8sRUFBRSxVQUFVLFdBQVcsS0FBSyxhQUFhQSxLQUFJLFVBQ25ELE9BQU8sU0FBUyxPQUFPLFFBQVEsS0FBSyxNQUFNLG9CQUFvQixLQUFLLElBQUksSUFBSSxTQUMzRUEsS0FBSSxRQUFRLFVBQVVBLEtBQUksUUFBUWIsSUFBRyxRQUFRLElBQUksSUFBSSxJQUFJLE1BQzFELE1BQU1hLEtBQUksU0FBU0EsS0FBSSxRQUFRO0FBQy9CLE1BQUFiLElBQUcsYUFBYWEsSUFBRztBQUFBLEVBQzNCO0FBQ0EsTUFBSTtBQUNBLElBQUFiLElBQUcsWUFBWSxXQUFXO0FBQzlCLE1BQUk7QUFDQSxJQUFBQSxJQUFHLFFBQVEsZUFBZSxhQUFhO0FBQzNDLE9BQUssU0FBU0EsSUFBRyxlQUFlLENBQUM7QUFDckM7QUFDQSxTQUFTLGlCQUFpQixNQUFNaEIsTUFBSyxXQUFXO0FBQzVDLE1BQUksS0FBSyxJQUFJLFVBQVUsUUFBUSxVQUFVLElBQUksSUFBSUEsS0FBSSxRQUFRO0FBQ3pELFdBQU87QUFDWCxTQUFPLGlCQUFpQixNQUFNQSxLQUFJLFFBQVEsVUFBVSxNQUFNLEdBQUdBLEtBQUksUUFBUSxVQUFVLElBQUksQ0FBQztBQUM1RjtBQUlBLFNBQVMsYUFBYSxLQUFLLE1BQU07QUFDN0IsTUFBSSxXQUFXLElBQUksV0FBVyxPQUFPLFlBQVksS0FBSyxXQUFXO0FBQ2pFLE1BQUksUUFBUSxVQUFVLFVBQVUsV0FBVyxNQUFNLE1BQU07QUFDdkQsV0FBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVE7QUFDbEMsWUFBUSxVQUFVLENBQUMsRUFBRSxjQUFjLEtBQUs7QUFDNUMsV0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVE7QUFDakMsY0FBVSxTQUFTLENBQUMsRUFBRSxjQUFjLE9BQU87QUFDL0MsTUFBSSxNQUFNLFVBQVUsS0FBSyxRQUFRLFVBQVUsR0FBRztBQUMxQyxXQUFPLE1BQU0sQ0FBQztBQUNkLFdBQU87QUFDUCxhQUFTLENBQUMsU0FBUyxLQUFLLEtBQUssS0FBSyxTQUFTLEtBQUssS0FBSyxDQUFDO0FBQUEsRUFDMUQsV0FDUyxNQUFNLFVBQVUsS0FBSyxRQUFRLFVBQVUsR0FBRztBQUMvQyxXQUFPLFFBQVEsQ0FBQztBQUNoQixXQUFPO0FBQ1AsYUFBUyxDQUFDLFNBQVMsS0FBSyxLQUFLLEtBQUssY0FBYyxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQy9ELE9BQ0s7QUFDRCxXQUFPO0FBQUEsRUFDWDtBQUNBLE1BQUksVUFBVSxDQUFDO0FBQ2YsV0FBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFlBQVk7QUFDakMsWUFBUSxLQUFLLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLE1BQUksU0FBUyxLQUFLLE9BQU8sRUFBRSxHQUFHLEdBQUc7QUFDN0IsV0FBTyxFQUFFLE1BQU0sS0FBSztBQUM1QjtBQUNBLFNBQVMsY0FBYyxLQUFLVyxRQUFPTixNQUFLLFdBQVcsU0FBUztBQUN4RCxNQUFJLENBQUMsVUFBVSxPQUFPO0FBQUEsRUFFbEJBLE9BQU1NLFVBQVMsUUFBUSxNQUFNLFVBQVU7QUFBQSxFQUV2QyxzQkFBc0IsV0FBVyxNQUFNLEtBQUssSUFBSSxRQUFRO0FBQ3hELFdBQU87QUFDWCxNQUFJLFNBQVMsSUFBSSxRQUFRQSxNQUFLO0FBRTlCLE1BQUksT0FBTyxlQUFlLE9BQU8sT0FBTyxRQUFRLFFBQVEsQ0FBQyxPQUFPLE9BQU87QUFDbkUsV0FBTztBQUNYLE1BQUksUUFBUSxJQUFJLFFBQVEsc0JBQXNCLFFBQVEsTUFBTSxJQUFJLENBQUM7QUFFakUsTUFBSSxDQUFDLE1BQU0sT0FBTyxlQUFlLE1BQU0sTUFBTU4sUUFDekMsc0JBQXNCLE9BQU8sTUFBTSxLQUFLLElBQUlBO0FBQzVDLFdBQU87QUFFWCxTQUFPLFVBQVUsT0FBTyxRQUFRLElBQUksVUFBVSxZQUFZLEVBQUUsR0FBRyxNQUFNLE9BQU8sT0FBTztBQUN2RjtBQUNBLFNBQVMsc0JBQXNCLE1BQU0sU0FBUyxTQUFTO0FBQ25ELE1BQUksUUFBUSxLQUFLLE9BQU9BLE9BQU0sVUFBVSxLQUFLLElBQUksSUFBSSxLQUFLO0FBQzFELFNBQU8sUUFBUSxNQUFNLFdBQVcsS0FBSyxXQUFXLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxFQUFFLGFBQWE7QUFDcEY7QUFDQSxJQUFBQTtBQUNBLGNBQVU7QUFBQSxFQUNkO0FBQ0EsTUFBSSxTQUFTO0FBQ1QsUUFBSSxPQUFPLEtBQUssS0FBSyxLQUFLLEVBQUUsV0FBVyxLQUFLLFdBQVcsS0FBSyxDQUFDO0FBQzdELFdBQU8sUUFBUSxDQUFDLEtBQUssUUFBUTtBQUN6QixhQUFPLEtBQUs7QUFDWixNQUFBQTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsU0FBT0E7QUFDWDtBQUNBLFNBQVMsU0FBUyxHQUFHLEdBQUcsS0FBSyxjQUFjLGVBQWU7QUFDdEQsTUFBSU0sU0FBUSxFQUFFLGNBQWMsR0FBRyxHQUFHO0FBQ2xDLE1BQUlBLFVBQVM7QUFDVCxXQUFPO0FBQ1gsTUFBSSxFQUFFLEdBQUcsTUFBTSxHQUFHLEtBQUssSUFBSSxFQUFFLFlBQVksR0FBRyxNQUFNLEVBQUUsTUFBTSxNQUFNLEVBQUUsSUFBSTtBQUN0RSxNQUFJLGlCQUFpQixPQUFPO0FBQ3hCLFFBQUksU0FBUyxLQUFLLElBQUksR0FBR0EsU0FBUSxLQUFLLElBQUksTUFBTSxJQUFJLENBQUM7QUFDckQsb0JBQWdCLE9BQU8sU0FBU0E7QUFBQSxFQUNwQztBQUNBLE1BQUksT0FBT0EsVUFBUyxFQUFFLE9BQU8sRUFBRSxNQUFNO0FBQ2pDLFFBQUksT0FBTyxnQkFBZ0JBLFVBQVMsZ0JBQWdCLE9BQU9BLFNBQVEsZUFBZTtBQUNsRixJQUFBQSxVQUFTO0FBQ1QsUUFBSUEsVUFBU0EsU0FBUSxFQUFFLFFBQVEsZ0JBQWdCLEVBQUUsWUFBWUEsU0FBUSxHQUFHQSxTQUFRLENBQUMsQ0FBQztBQUM5RSxNQUFBQSxVQUFTLE9BQU8sSUFBSTtBQUN4QixXQUFPQSxVQUFTLE9BQU87QUFDdkIsV0FBT0E7QUFBQSxFQUNYLFdBQ1MsT0FBT0EsUUFBTztBQUNuQixRQUFJLE9BQU8sZ0JBQWdCQSxVQUFTLGdCQUFnQixPQUFPQSxTQUFRLGVBQWU7QUFDbEYsSUFBQUEsVUFBUztBQUNULFFBQUlBLFVBQVNBLFNBQVEsRUFBRSxRQUFRLGdCQUFnQixFQUFFLFlBQVlBLFNBQVEsR0FBR0EsU0FBUSxDQUFDLENBQUM7QUFDOUUsTUFBQUEsVUFBUyxPQUFPLElBQUk7QUFDeEIsV0FBT0EsVUFBUyxPQUFPO0FBQ3ZCLFdBQU9BO0FBQUEsRUFDWDtBQUNBLFNBQU8sRUFBRSxPQUFBQSxRQUFPLE1BQU0sS0FBSztBQUMvQjtBQUNBLFNBQVMsZ0JBQWdCLEtBQUs7QUFDMUIsTUFBSSxJQUFJLFVBQVU7QUFDZCxXQUFPO0FBQ1gsTUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLEdBQUcsSUFBSSxJQUFJLFdBQVcsQ0FBQztBQUMvQyxTQUFPLEtBQUssU0FBVSxLQUFLLFNBQVUsS0FBSyxTQUFVLEtBQUs7QUFDN0Q7QUFtQkEsSUFBTSxhQUFOLE1BQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFiLFlBQVksT0FBTyxPQUFPO0FBQ3RCLFNBQUssUUFBUTtBQUliLFNBQUssVUFBVTtBQUlmLFNBQUssY0FBYztBQUNuQixTQUFLLFVBQVU7QUFJZixTQUFLLGFBQWE7QUFJbEIsU0FBSyxnQkFBZ0I7QUFJckIsU0FBSyx1QkFBdUI7QUFJNUIsU0FBSyxRQUFRLElBQUk7QUFDakIsU0FBSyxvQkFBb0IsQ0FBQztBQUMxQixTQUFLLGNBQWMsQ0FBQztBQU1wQixTQUFLLHdCQUF3QjtBQU03QixTQUFLLFdBQVc7QUFDaEIsU0FBSyxTQUFTO0FBQ2QsU0FBSyxRQUFRLE1BQU07QUFDbkIsU0FBSyxnQkFBZ0IsTUFBTSxXQUFXLENBQUM7QUFDdkMsU0FBSyxjQUFjLFFBQVEsbUJBQW1CO0FBQzlDLFNBQUssV0FBVyxLQUFLLFNBQVMsS0FBSyxJQUFJO0FBQ3ZDLFNBQUssTUFBTyxTQUFTLE1BQU0sU0FBVSxTQUFTLGNBQWMsS0FBSztBQUNqRSxRQUFJLE9BQU87QUFDUCxVQUFJLE1BQU07QUFDTixjQUFNLFlBQVksS0FBSyxHQUFHO0FBQUEsZUFDckIsT0FBTyxTQUFTO0FBQ3JCLGNBQU0sS0FBSyxHQUFHO0FBQUEsZUFDVCxNQUFNO0FBQ1gsYUFBSyxVQUFVO0FBQUEsSUFDdkI7QUFDQSxTQUFLLFdBQVcsWUFBWSxJQUFJO0FBQ2hDLHdCQUFvQixJQUFJO0FBQ3hCLFNBQUssWUFBWSxlQUFlLElBQUk7QUFDcEMsU0FBSyxVQUFVLFlBQVksS0FBSyxNQUFNLEtBQUssZUFBZSxJQUFJLEdBQUcsZ0JBQWdCLElBQUksR0FBRyxLQUFLLEtBQUssSUFBSTtBQUN0RyxTQUFLLGNBQWMsSUFBSSxZQUFZLE1BQU0sQ0FBQ21CLE9BQU0sSUFBSSxVQUFVLFVBQVUsY0FBYyxNQUFNQSxPQUFNLElBQUksVUFBVSxLQUFLLENBQUM7QUFDdEgsU0FBSyxZQUFZLE1BQU07QUFDdkIsY0FBVSxJQUFJO0FBQ2QsU0FBSyxrQkFBa0I7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLElBQUksWUFBWTtBQUFFLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFBVztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSS9DLElBQUksUUFBUTtBQUNSLFFBQUksS0FBSyxPQUFPLFNBQVMsS0FBSyxPQUFPO0FBQ2pDLFVBQUksT0FBTyxLQUFLO0FBQ2hCLFdBQUssU0FBUyxDQUFDO0FBQ2YsZUFBUyxRQUFRO0FBQ2IsYUFBSyxPQUFPLElBQUksSUFBSSxLQUFLLElBQUk7QUFDakMsV0FBSyxPQUFPLFFBQVEsS0FBSztBQUFBLElBQzdCO0FBQ0EsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxPQUFPO0FBQ1YsUUFBSSxNQUFNLG1CQUFtQixLQUFLLE9BQU87QUFDckMsc0JBQWdCLElBQUk7QUFDeEIsUUFBSSxZQUFZLEtBQUs7QUFDckIsU0FBSyxTQUFTO0FBQ2QsUUFBSSxNQUFNLFNBQVM7QUFDZixZQUFNLFFBQVEsUUFBUSxtQkFBbUI7QUFDekMsV0FBSyxnQkFBZ0IsTUFBTTtBQUFBLElBQy9CO0FBQ0EsU0FBSyxpQkFBaUIsTUFBTSxPQUFPLFNBQVM7QUFBQSxFQUNoRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLFNBQVMsT0FBTztBQUNaLFFBQUksVUFBVSxDQUFDO0FBQ2YsYUFBUyxRQUFRLEtBQUs7QUFDbEIsY0FBUSxJQUFJLElBQUksS0FBSyxPQUFPLElBQUk7QUFDcEMsWUFBUSxRQUFRLEtBQUs7QUFDckIsYUFBUyxRQUFRO0FBQ2IsY0FBUSxJQUFJLElBQUksTUFBTSxJQUFJO0FBQzlCLFNBQUssT0FBTyxPQUFPO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsWUFBWSxPQUFPO0FBQ2YsU0FBSyxpQkFBaUIsT0FBTyxLQUFLLE1BQU07QUFBQSxFQUM1QztBQUFBLEVBQ0EsaUJBQWlCLE9BQU8sV0FBVztBQUMvQixRQUFJO0FBQ0osUUFBSSxPQUFPLEtBQUssT0FBTyxTQUFTLE9BQU8sWUFBWTtBQUduRCxRQUFJLE1BQU0sZUFBZSxLQUFLLFdBQVc7QUFDckMsdUJBQWlCLElBQUk7QUFDckIsa0JBQVk7QUFBQSxJQUNoQjtBQUNBLFNBQUssUUFBUTtBQUNiLFFBQUksaUJBQWlCLEtBQUssV0FBVyxNQUFNLFdBQVcsS0FBSyxPQUFPLFdBQVcsVUFBVTtBQUN2RixRQUFJLGtCQUFrQixLQUFLLE9BQU8sV0FBVyxVQUFVLFdBQVcsS0FBSyxPQUFPLGFBQWEsVUFBVSxXQUFXO0FBQzVHLFVBQUksWUFBWSxlQUFlLElBQUk7QUFDbkMsVUFBSSxpQkFBaUIsV0FBVyxLQUFLLFNBQVMsR0FBRztBQUM3QyxhQUFLLFlBQVk7QUFDakIsaUJBQVM7QUFBQSxNQUNiO0FBQUEsSUFDSjtBQUNBLFFBQUksa0JBQWtCLFVBQVUsbUJBQW1CLEtBQUssT0FBTyxpQkFBaUI7QUFDNUUsc0JBQWdCLElBQUk7QUFBQSxJQUN4QjtBQUNBLFNBQUssV0FBVyxZQUFZLElBQUk7QUFDaEMsd0JBQW9CLElBQUk7QUFDeEIsUUFBSSxZQUFZLGdCQUFnQixJQUFJLEdBQUcsWUFBWSxlQUFlLElBQUk7QUFDdEUsUUFBSSxTQUFTLEtBQUssV0FBVyxNQUFNLFdBQVcsQ0FBQyxLQUFLLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxVQUNsRSxNQUFNLG9CQUFvQixLQUFLLG9CQUFvQixpQkFBaUI7QUFDMUUsUUFBSSxZQUFZLFVBQVUsQ0FBQyxLQUFLLFFBQVEsWUFBWSxNQUFNLEtBQUssV0FBVyxTQUFTO0FBQ25GLFFBQUksYUFBYSxDQUFDLE1BQU0sVUFBVSxHQUFHLEtBQUssU0FBUztBQUMvQyxrQkFBWTtBQUNoQixRQUFJLGVBQWUsVUFBVSxjQUFjLGFBQWEsS0FBSyxJQUFJLE1BQU0sa0JBQWtCLFFBQVEsZUFBZSxJQUFJO0FBQ3BILFFBQUksV0FBVztBQUNYLFdBQUssWUFBWSxLQUFLO0FBTXRCLFVBQUksaUJBQWlCLGNBQWMsTUFBTSxXQUFXLENBQUMsS0FBSyxhQUN0RCxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsTUFBTSxVQUFVLFNBQVMsd0JBQXdCLEtBQUssV0FBVyxNQUFNLFNBQVM7QUFDOUcsVUFBSSxXQUFXO0FBS1gsWUFBSSxlQUFlLFNBQVUsS0FBSyxjQUFjLEtBQUssa0JBQWtCLEVBQUUsWUFBYTtBQUN0RixZQUFJLFVBQVUsQ0FBQyxLQUFLLFFBQVEsT0FBTyxNQUFNLEtBQUssV0FBVyxXQUFXLElBQUksR0FBRztBQUN2RSxlQUFLLFFBQVEsZ0JBQWdCLENBQUMsQ0FBQztBQUMvQixlQUFLLFFBQVEsUUFBUTtBQUNyQixlQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssV0FBVyxXQUFXLEtBQUssS0FBSyxJQUFJO0FBQUEsUUFDOUU7QUFDQSxZQUFJLGdCQUFnQixDQUFDLEtBQUs7QUFDdEIsMkJBQWlCO0FBQUEsTUFDekI7QUFLQSxVQUFJLGtCQUNBLEVBQUUsS0FBSyxNQUFNLGFBQWEsS0FBSyxZQUFZLGlCQUFpQixHQUFHLEtBQUssa0JBQWtCLENBQUMsS0FDbkYsbUJBQW1CLElBQUksSUFBSTtBQUMvQix1QkFBZSxNQUFNLGNBQWM7QUFBQSxNQUN2QyxPQUNLO0FBQ0QsMEJBQWtCLE1BQU0sTUFBTSxTQUFTO0FBQ3ZDLGFBQUssWUFBWSxnQkFBZ0I7QUFBQSxNQUNyQztBQUNBLFdBQUssWUFBWSxNQUFNO0FBQUEsSUFDM0I7QUFDQSxTQUFLLGtCQUFrQixJQUFJO0FBQzNCLFVBQU0sS0FBSyxLQUFLLGNBQWMsUUFBUSxPQUFPLFNBQVMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLElBQUksR0FBRyxNQUFNLEdBQUc7QUFDN0YsV0FBSyxrQkFBa0IsS0FBSyxVQUFVLElBQUk7QUFDOUMsUUFBSSxVQUFVLFNBQVM7QUFDbkIsV0FBSyxJQUFJLFlBQVk7QUFBQSxJQUN6QixXQUNTLFVBQVUsZ0JBQWdCO0FBQy9CLFdBQUssa0JBQWtCO0FBQUEsSUFDM0IsV0FDUyxjQUFjO0FBQ25CLHFCQUFlLFlBQVk7QUFBQSxJQUMvQjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLG9CQUFvQjtBQUNoQixRQUFJLFdBQVcsS0FBSyxrQkFBa0IsRUFBRTtBQUN4QyxRQUFJLEtBQUssU0FBUywyQkFBMkIsT0FBSyxFQUFFLElBQUksQ0FBQztBQUFHO0FBQUEsYUFDbkQsS0FBSyxNQUFNLHFCQUFxQixlQUFlO0FBQ3BELFVBQUksU0FBUyxLQUFLLFFBQVEsWUFBWSxLQUFLLE1BQU0sVUFBVSxJQUFJO0FBQy9ELFVBQUksT0FBTyxZQUFZO0FBQ25CLDJCQUFtQixNQUFNLE9BQU8sc0JBQXNCLEdBQUcsUUFBUTtBQUFBLElBQ3pFLE9BQ0s7QUFDRCx5QkFBbUIsTUFBTSxLQUFLLFlBQVksS0FBSyxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQUcsUUFBUTtBQUFBLElBQ3JGO0FBQUEsRUFDSjtBQUFBLEVBQ0EscUJBQXFCO0FBQ2pCLFFBQUk7QUFDSixXQUFPLE9BQU8sS0FBSyxZQUFZLElBQUk7QUFDL0IsVUFBSSxLQUFLO0FBQ0wsYUFBSyxRQUFRO0FBQUEsRUFDekI7QUFBQSxFQUNBLGtCQUFrQixXQUFXO0FBQ3pCLFFBQUksQ0FBQyxhQUFhLFVBQVUsV0FBVyxLQUFLLE1BQU0sV0FBVyxLQUFLLGlCQUFpQixLQUFLLG1CQUFtQjtBQUN2RyxXQUFLLG9CQUFvQixLQUFLO0FBQzlCLFdBQUssbUJBQW1CO0FBQ3hCLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxjQUFjLFFBQVEsS0FBSztBQUNoRCxZQUFJLFNBQVMsS0FBSyxjQUFjLENBQUM7QUFDakMsWUFBSSxPQUFPLEtBQUs7QUFDWixlQUFLLFlBQVksS0FBSyxPQUFPLEtBQUssS0FBSyxJQUFJLENBQUM7QUFBQSxNQUNwRDtBQUNBLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxNQUFNLFFBQVEsUUFBUSxLQUFLO0FBQ2hELFlBQUksU0FBUyxLQUFLLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLFlBQUksT0FBTyxLQUFLO0FBQ1osZUFBSyxZQUFZLEtBQUssT0FBTyxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDcEQ7QUFBQSxJQUNKLE9BQ0s7QUFDRCxlQUFTLElBQUksR0FBRyxJQUFJLEtBQUssWUFBWSxRQUFRLEtBQUs7QUFDOUMsWUFBSSxhQUFhLEtBQUssWUFBWSxDQUFDO0FBQ25DLFlBQUksV0FBVztBQUNYLHFCQUFXLE9BQU8sTUFBTSxTQUFTO0FBQUEsTUFDekM7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBLEVBQ0Esa0JBQWtCLFVBQVUsTUFBTTtBQUM5QixRQUFJLE1BQU0sU0FBUyxNQUFNQyxTQUFRO0FBQ2pDLFFBQUksS0FBSyxNQUFNLElBQUksT0FBTyxJQUFJLElBQUksS0FBSyxJQUFJLE1BQU07QUFDN0MsTUFBQUEsU0FBUSxJQUFJO0FBQUEsSUFDaEIsT0FDSztBQUNELFVBQUksV0FBVyxJQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxPQUFPLEtBQUssSUFBSSxRQUFRO0FBQzFFLFVBQUksUUFBUSxXQUFXLEtBQUssS0FBSyxNQUFNLElBQUksT0FBTyxRQUFRO0FBQzFELFVBQUksU0FBUyxJQUFJO0FBQ2IsUUFBQUEsU0FBUTtBQUFBLElBQ2hCO0FBQ0EsU0FBSyxXQUFXLElBQUksU0FBUyxTQUFTLE9BQU8sU0FBUyxNQUFNQSxTQUFRLElBQUksU0FBWSxjQUFjLE9BQU8sS0FBSyxNQUFNLEtBQUtBLE1BQUssQ0FBQztBQUFBLEVBQ25JO0FBQUEsRUFDQSxTQUFTLFVBQVUsR0FBRztBQUNsQixRQUFJLE9BQU8sS0FBSyxVQUFVLEtBQUssT0FBTyxRQUFRLEdBQUc7QUFDakQsUUFBSSxRQUFRLFNBQVMsUUFBUSxJQUFJLEVBQUUsSUFBSSxJQUFJO0FBQ3ZDLGFBQU87QUFDWCxhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssY0FBYyxRQUFRLEtBQUs7QUFDaEQsVUFBSUMsUUFBTyxLQUFLLGNBQWMsQ0FBQyxFQUFFLE1BQU0sUUFBUTtBQUMvQyxVQUFJQSxTQUFRLFNBQVMsUUFBUSxJQUFJLEVBQUVBLEtBQUksSUFBSUE7QUFDdkMsZUFBTztBQUFBLElBQ2Y7QUFDQSxRQUFJLFVBQVUsS0FBSyxNQUFNO0FBQ3pCLFFBQUk7QUFDQSxlQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3JDLFlBQUlBLFFBQU8sUUFBUSxDQUFDLEVBQUUsTUFBTSxRQUFRO0FBQ3BDLFlBQUlBLFNBQVEsU0FBUyxRQUFRLElBQUksRUFBRUEsS0FBSSxJQUFJQTtBQUN2QyxpQkFBTztBQUFBLE1BQ2Y7QUFBQSxFQUNSO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxXQUFXO0FBSVAsUUFBSSxJQUFJO0FBR0osVUFBSSxPQUFPLEtBQUssS0FBSztBQUNyQixVQUFJLFFBQVEsS0FBSztBQUNiLGVBQU87QUFDWCxVQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxTQUFTLElBQUk7QUFDaEMsZUFBTztBQUNYLGFBQU8sUUFBUSxLQUFLLE9BQU8sUUFBUSxLQUFLLElBQUksU0FBUyxJQUFJLEdBQUc7QUFDeEQsWUFBSSxLQUFLLG1CQUFtQjtBQUN4QixpQkFBTztBQUNYLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLEtBQUssS0FBSyxpQkFBaUIsS0FBSztBQUFBLEVBQzNDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxRQUFRO0FBQ0osU0FBSyxZQUFZLEtBQUs7QUFDdEIsUUFBSSxLQUFLO0FBQ0wseUJBQW1CLEtBQUssR0FBRztBQUMvQixtQkFBZSxJQUFJO0FBQ25CLFNBQUssWUFBWSxNQUFNO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLElBQUksT0FBTztBQUNQLFFBQUksU0FBUyxLQUFLO0FBQ2xCLFFBQUksVUFBVTtBQUNWLGVBQVMsU0FBUyxLQUFLLElBQUksWUFBWSxRQUFRLFNBQVMsT0FBTyxZQUFZO0FBQ3ZFLFlBQUksT0FBTyxZQUFZLEtBQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxNQUFPO0FBQ2hFLGNBQUksQ0FBQyxPQUFPO0FBQ1IsbUJBQU8sZUFBZSxNQUFNLEVBQUUsZUFBZSxNQUFNLE9BQU8sY0FBYyxhQUFhO0FBQ3pGLGlCQUFPLEtBQUssUUFBUTtBQUFBLFFBQ3hCO0FBQUEsTUFDSjtBQUNKLFdBQU8sVUFBVTtBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGFBQWE7QUFDVCxTQUFLLFFBQVE7QUFBQSxFQUNqQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsWUFBWSxRQUFRO0FBQ2hCLFdBQU8sWUFBWSxNQUFNLE1BQU07QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLFlBQVksS0FBSyxPQUFPLEdBQUc7QUFDdkIsV0FBTyxZQUFZLE1BQU0sS0FBSyxJQUFJO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV0EsU0FBUyxLQUFLLE9BQU8sR0FBRztBQUNwQixXQUFPLEtBQUssUUFBUSxXQUFXLEtBQUssSUFBSTtBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVdBLFFBQVEsS0FBSztBQUNULFFBQUksT0FBTyxLQUFLLFFBQVEsT0FBTyxHQUFHO0FBQ2xDLFdBQU8sT0FBTyxLQUFLLFVBQVU7QUFBQSxFQUNqQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxTQUFTLE1BQU1DLFNBQVEsT0FBTyxJQUFJO0FBQzlCLFFBQUksTUFBTSxLQUFLLFFBQVEsV0FBVyxNQUFNQSxTQUFRLElBQUk7QUFDcEQsUUFBSSxPQUFPO0FBQ1AsWUFBTSxJQUFJLFdBQVcsb0NBQW9DO0FBQzdELFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsZUFBZSxLQUFLLE9BQU87QUFDdkIsV0FBTyxlQUFlLE1BQU0sU0FBUyxLQUFLLE9BQU8sR0FBRztBQUFBLEVBQ3hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsVUFBVSxNQUFNLE9BQU87QUFDbkIsV0FBTyxRQUFRLE1BQU0sSUFBSSxNQUFNLE9BQU8sU0FBUyxJQUFJLGVBQWUsT0FBTyxDQUFDO0FBQUEsRUFDOUU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLFVBQVUsTUFBTSxPQUFPO0FBQ25CLFdBQU8sUUFBUSxNQUFNLE1BQU0sTUFBTSxNQUFNLFNBQVMsSUFBSSxlQUFlLE9BQU8sQ0FBQztBQUFBLEVBQy9FO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFVBQVU7QUFDTixRQUFJLENBQUMsS0FBSztBQUNOO0FBQ0osaUJBQWEsSUFBSTtBQUNqQixTQUFLLG1CQUFtQjtBQUN4QixRQUFJLEtBQUssU0FBUztBQUNkLFdBQUssUUFBUSxPQUFPLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRyxnQkFBZ0IsSUFBSSxHQUFHLElBQUk7QUFDbkUsV0FBSyxJQUFJLGNBQWM7QUFBQSxJQUMzQixXQUNTLEtBQUssSUFBSSxZQUFZO0FBQzFCLFdBQUssSUFBSSxXQUFXLFlBQVksS0FBSyxHQUFHO0FBQUEsSUFDNUM7QUFDQSxTQUFLLFFBQVEsUUFBUTtBQUNyQixTQUFLLFVBQVU7QUFBQSxFQUNuQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLElBQUksY0FBYztBQUNkLFdBQU8sS0FBSyxXQUFXO0FBQUEsRUFDM0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLGNBQWMsT0FBTztBQUNqQixXQUFPLGNBQWMsTUFBTSxLQUFLO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVBLFNBQVNDLEtBQUk7QUFDVCxRQUFJLHNCQUFzQixLQUFLLE9BQU87QUFDdEMsUUFBSTtBQUNBLDBCQUFvQixLQUFLLE1BQU1BLEdBQUU7QUFBQTtBQUVqQyxXQUFLLFlBQVksS0FBSyxNQUFNLE1BQU1BLEdBQUUsQ0FBQztBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxvQkFBb0I7QUFDaEIsV0FBTyxVQUFVLEtBQUssS0FBSyxhQUFhLE1BQU0sa0JBQWtCLEtBQUssSUFBSSxhQUFhLEtBQUssS0FBSyxNQUMxRiwyQkFBMkIsSUFBSSxJQUFJLEtBQUssYUFBYTtBQUFBLEVBQy9EO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQSxlQUFlO0FBQ1gsV0FBTyxLQUFLLEtBQUssYUFBYTtBQUFBLEVBQ2xDO0FBQ0o7QUFDQSxTQUFTLGVBQWUsTUFBTTtBQUMxQixNQUFJLFFBQVEsdUJBQU8sT0FBTyxJQUFJO0FBQzlCLFFBQU0sUUFBUTtBQUNkLFFBQU0sa0JBQWtCLE9BQU8sS0FBSyxRQUFRO0FBQzVDLE9BQUssU0FBUyxjQUFjLFdBQVM7QUFDakMsUUFBSSxPQUFPLFNBQVM7QUFDaEIsY0FBUSxNQUFNLEtBQUssS0FBSztBQUM1QixRQUFJO0FBQ0EsZUFBUyxRQUFRLE9BQU87QUFDcEIsWUFBSSxRQUFRO0FBQ1IsZ0JBQU0sU0FBUyxNQUFNLE1BQU0sSUFBSTtBQUFBLGlCQUMxQixRQUFRO0FBQ2IsZ0JBQU0sU0FBUyxNQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sTUFBTSxNQUFNLElBQUk7QUFBQSxpQkFDNUQsQ0FBQyxNQUFNLElBQUksS0FBSyxRQUFRLHFCQUFxQixRQUFRO0FBQzFELGdCQUFNLElBQUksSUFBSSxPQUFPLE1BQU0sSUFBSSxDQUFDO0FBQUEsTUFDeEM7QUFBQSxFQUNSLENBQUM7QUFDRCxNQUFJLENBQUMsTUFBTTtBQUNQLFVBQU0sWUFBWTtBQUN0QixTQUFPLENBQUMsV0FBVyxLQUFLLEdBQUcsS0FBSyxNQUFNLElBQUksUUFBUSxNQUFNLEtBQUssQ0FBQztBQUNsRTtBQUNBLFNBQVMsb0JBQW9CLE1BQU07QUFDL0IsTUFBSSxLQUFLLFlBQVk7QUFDakIsUUFBSSxNQUFNLFNBQVMsY0FBYyxLQUFLO0FBQ3RDLFFBQUksWUFBWTtBQUNoQixRQUFJLGFBQWEsb0JBQW9CLE1BQU07QUFDM0MsUUFBSSxhQUFhLE9BQU8sRUFBRTtBQUMxQixTQUFLLGdCQUFnQixFQUFFLEtBQUssTUFBTSxXQUFXLE9BQU8sS0FBSyxNQUFNLFVBQVUsTUFBTSxLQUFLLEVBQUUsS0FBSyxNQUFNLE9BQU8sS0FBSyxXQUFXLENBQUMsRUFBRTtBQUFBLEVBQy9ILE9BQ0s7QUFDRCxTQUFLLGdCQUFnQjtBQUFBLEVBQ3pCO0FBQ0o7QUFDQSxTQUFTLFlBQVksTUFBTTtBQUN2QixTQUFPLENBQUMsS0FBSyxTQUFTLFlBQVksV0FBUyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUs7QUFDMUU7QUFDQSxTQUFTLHdCQUF3QixNQUFNLE1BQU07QUFDekMsTUFBSSxRQUFRLEtBQUssSUFBSSxLQUFLLFFBQVEsWUFBWSxLQUFLLElBQUksR0FBRyxLQUFLLFFBQVEsWUFBWSxLQUFLLElBQUksQ0FBQztBQUM3RixTQUFPLEtBQUssUUFBUSxNQUFNLEtBQUssS0FBSyxLQUFLLFFBQVEsTUFBTSxLQUFLO0FBQ2hFO0FBQ0EsU0FBUyxlQUFlLE1BQU07QUFDMUIsTUFBSSxTQUFTLHVCQUFPLE9BQU8sSUFBSTtBQUMvQixXQUFTLElBQUksS0FBSztBQUNkLGFBQVMsUUFBUTtBQUNiLFVBQUksQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLFFBQVEsSUFBSTtBQUNsRCxlQUFPLElBQUksSUFBSSxJQUFJLElBQUk7QUFBQSxFQUNuQztBQUNBLE9BQUssU0FBUyxhQUFhLEdBQUc7QUFDOUIsT0FBSyxTQUFTLGFBQWEsR0FBRztBQUM5QixTQUFPO0FBQ1g7QUFDQSxTQUFTLGlCQUFpQixHQUFHLEdBQUc7QUFDNUIsTUFBSSxLQUFLLEdBQUcsS0FBSztBQUNqQixXQUFTLFFBQVEsR0FBRztBQUNoQixRQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSTtBQUNqQixhQUFPO0FBQ1g7QUFBQSxFQUNKO0FBQ0EsV0FBUyxLQUFLO0FBQ1Y7QUFDSixTQUFPLE1BQU07QUFDakI7QUFDQSxTQUFTLG9CQUFvQixRQUFRO0FBQ2pDLE1BQUksT0FBTyxLQUFLLFNBQVMsT0FBTyxLQUFLLHFCQUFxQixPQUFPLEtBQUs7QUFDbEUsVUFBTSxJQUFJLFdBQVcscUVBQXFFO0FBQ2xHOzs7QUNqZ0xPLElBQUksT0FBTztBQUFBLEVBQ2hCLEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFDUDtBQUVPLElBQUksUUFBUTtBQUFBLEVBQ2pCLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNM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QSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUdBLFFBQU0saUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhO0FBQUEsSUFDakI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxpQkFBaUI7QUFBQSxJQUNyQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNQyxZQUFXO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBR0EsUUFBTSxXQUFXLENBQUUsU0FBVTtBQUU3QixRQUFNLGVBQWU7QUFBQSxJQUNuQixNQUFNO0FBQUEsSUFD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QTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVUsVUFBVSxJQUFJO0FBRTlCLFFBQU07QUFBQTtBQUFBLElBQXlDLFFBQVE7QUFBQTtBQUV2RCxNQUFJLE9BQU87QUFBQSxJQUNULEdBQUcsSUFBSTtBQUFBLElBQ1AsR0FBRyxXQUFXO0FBQUEsRUFDaEI7QUFDQSxNQUFJLFVBQVU7QUFBQSxJQUNaLEdBQUcsSUFBSTtBQUFBLElBQ1AsR0FBRyxXQUFXO0FBQUEsRUFDaEI7QUFD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QyxZQUFXO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBR0EsUUFBTSxZQUFZLEVBQUUsT0FBTyxpQkFBaUI7QUFHNUMsUUFBTSxrQkFBa0I7QUFBQSxJQUN0QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0saUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGdCQUFnQjtBQUFBLElBQ3BCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGlCQUFpQjtBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxJQUVBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sU0FBUyxDQUFFLElBQUs7QUFBQSxJQUNoQixVQUFVO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixTQUFTRDtBQUFBLE1BQ1QsU0FBU0M7QUFBQSxNQUNULFVBQVU7QUFBQSxRQUNSLEdBQUc7QUFBQSxRQUNILEdBQUc7QUFBQTtBQUFBLFFBRUg7QUFBQSxRQUNBO0FBQUEsUUFDQSxHQUFHO0FBQUEsUUFDSCxHQUFHO0FBQUEsTUFDTDtBQUFBLElBQ0Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSO0FBQUE7QUFBQSxNQUNBLEtBQUssUUFBUTtBQUFBO0FBQUEsTUFDYjtBQUFBLE1BQ0E7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QUMzWEEsU0FBUyxFQUFFLE1B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QUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFHQSxRQUFNLGlCQUFpQjtBQUFBLElBQ3JCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYTtBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVBLFFBQU0saUJBQWlCO0FBQUEsSUFDckI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTUMsWUFBVztBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUdBLFFBQU0sV0FBVyxDQUFFLFNBQVU7QUFFN0IsUUFBTSxlQUFlO0FBQUEsSUFDbkIsTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLElBQ1QsU0FBU0E7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmO0FBRUEsUUFBTSxvQkFBb0I7QUFBQSxJQUN4QixXQUFXO0FBQUEsSUFDWCxXQUFXO0FBQUEsSUFDWCxVQUFVO0FB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Q0EsUUFBTSxtQkFBbUI7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLGtCQUFrQjtBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTSxzQkFBc0I7QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFD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QUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFFQSxJQUFNLGlCQUFpQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR0EsSUFBTSxpQkFBaUI7QUFBQSxFQUNyQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQ0Y7QUFHQSxJQUFNLGtCQUFrQjtBQUFBLEVBQ3RCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBRUEsSUFBTSxhQUFhO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtB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QUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsU0FBUTtBQUFBLElBQ1o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU0sTUFBTTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsWUFBVztBQUFBLElBQ2YsU0FBUztBQUFBLElBQ1QsTUFBTUQ7QUFBQSxJQUNOLFNBQVNGO0FBQUEsSUFDVCxVQUFVQztBQUFBLEVBQ1o7QUFDQSxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixTQUFTLENBQUUsUUFBUztBQUFBLElBQ3BCLFVBQVVFO0FBQUEsSUFDVixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsTUFDUixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTDtBQUFBLFFBQ0UsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFVBQ1IsS0FBSztBQUFBLFVBQ0ws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Y0FDUjtBQUFBLGNBQ0EsS0FBSztBQUFBLGNBQ0wsS0FBSztBQUFBLGNBQ0w7QUFBQSxjQUNBLEtBQUs7QUFBQSxZQUNQO0FBQUEsVUFDRjtBQUFBLFVBQ0EsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFFBQ1A7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QUM3UkEsSUFBTUMsWUFBVztBQUNqQixJQUFNLFdBQVc7QUFBQSxFQUNmO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxJQUFNLFdBQVc7QUFBQSxFQUNmO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU0sUUFBUTtBQUFBO0FBQUEsRUFFWjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBRUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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QSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUVBLElBQU1DLGtCQUFpQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR0EsSUFBTUMsa0JBQWlCO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUNGO0FBR0EsSUFBTUMsbUJBQWtCO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFFQSxJQUFNQyxjQUFhO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFHRixFQUFFLFFBQVE7QUFHVixJQUFNLG1CQUFtQkYsZ0JBQWUs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LFVBQVU7QUFBQSxNQUNSO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjs7O0FDdE9BLFNBQVMsV0FBVyxNQUFNO0FBQ3hCLFFBQU0sWUFBWTtBQUFBLElBQ2hCLFdBQVc7QUFBQSxJQUNYLE9BQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxnQkFBZ0I7QUFDdEIsUUFBTUUsU0FBUTtBQUFBLElBQ1o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLE1BQU07QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsWUFBVztBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNBLFFBQU1DLGFBQVk7QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0EsUUFBTUMsWUFBVztBQUFBLElBQ2YscUJBQXFCO0FBQUEsTUFDbkI7QUFB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QUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUdBLFFBQU0sa0JBQWtCO0FBQ3hCLFFBQU0sZ0JBQWdCO0FBQUEsSUFDcEIs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QUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTUMsYUFBWTtBQUFBO0FBQUE7QUFBQSxJQUdoQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFB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QUFNLFdBQVc7QUFBQTtBQUFBLElBRWY7QUFBQTtBQUFBLElBRUE7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBQUEsSUFFQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxRQUFNQyxTQUFRO0FBQUEsSUFDWjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixTQUFTLENBQUUsSUFBSztBQUFBLElBQ2hCLFVBQVU7QUFBQSxNQUNSLFVBQVUsS0FBSyxXQUFXO0FBQUEsTUFDMUIsTUFBTUE7QUFBQSxNQUNOLFNBQVNGO0FBQUEsTUFDVCxTQUFTQztBQUFBLE1BQ1QsVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxNQUNSLEtBQUs7QUFBQSxNQUNMLEtBQUssUUFBUSxRQUFRLFFBQVEsRUFBRSxVQUFVLENBQUUsTUFBTyxFQUFFLENBQUM7QUFBQSxNQUNyRCxLQUFLLFFBQVEsS0FBSyxtQkFBbUI7QUFBQSxRQUNuQyxPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQUEsTUFDRDtBQUFBLFFBQ0UsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFVBQ1IsRUFBRSxPQUFPLDJCQUEyQjtBQUFBLFVBQ3BDLEVBQUUsT0FBTyxrQ0FBa0M7QUFBQSxRQUM3QztBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsUUFDRSxXQUFXO0FBQUEsUUFDWCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0E7QUFBQSxRQUNFLFdBQVc7QUFBQSxRQUNYLFVBQVU7QUFBQSxVQUNSLEVBQUUsT0FBTyxrQkFBa0IsY0FBYztBQUFBLFVBQ3pDLEVBQUUsT0FBTyxtQkFBbUIsY0FBYztBQUFBLFVBQzFDLEVBQUUsT0FBTyx5QkFBeUIsY0FBYztBQUFBLFVBQ2hELEVBQUUsT0FBTyxvREFDRSxjQUFjO0FBQUEsUUFDM0I7QUFBQSxRQUNBLFdBQVc7QUFBQSxNQUNiO0FBQUEsTUFDQTtBQUFBLFFBQ0UsT0FBTztBQUFBLFVBQ0w7QUFBQSxVQUNBO0FBQUEsVUFDQSxLQUFLO0FBQUEsUUFDUDtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1QsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFFBQ0w7QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLFFBQ0UsV0FBVztBQUFBLFFBQ1gsT0FBTztBQUFBLFFBQ1AsS0FBSztBQUFBLFFBQ0wsVUFBVTtBQUFBLFVBQ1I7QUFBQSxZQUNFLFdBQVc7QUFBQSxZQUNYLE9BQU87QUFBQSxZQUNQLEtBQUs7QUFBQSxVQUNQO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPO0FBQUEsVUFDTDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxLQUFLO0FBQUEsUUFDUDtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1QsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFFBQ0w7QUFBQSxNQUNGO0FBQUE7QUFBQSxNQUVBO0FBQUEsUUFDRSxPQUFPO0FBQUEsVUFDTDtBQUFBLFVBQ0E7QUFBQSxVQUNBLEtBQUs7QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxRQUNMO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU87QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFVBQ0EsS0FBSztBQUFBLFFBQ1A7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxRQUNMO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU87QUFBQSxVQUNMO0FBQUEsVUFDQTtBQUFBLFVBQ0EsS0FBSztBQUFBLFFBQ1A7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULEdBQUc7QUFBQSxVQUNILEdBQUc7QUFBQSxRQUNMO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU8sS0FBSyxXQUFXO0FBQUEsUUFDdkIsVUFBVTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsTUFBTUM7QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLE1BQ0E7QUFBQSxRQUNFLFdBQVc7QUFBQSxRQUNYLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7OztBQzdTQSxJQUFNQyxTQUFRLENBQUMsU0FBUztBQUN0QixTQUFPO0FBQUEsSUFDTCxXQUFXO0FBQUEsTUFDVCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsZUFBZSxLQUFLO0FBQUEsSUFDcEIsVUFBVTtBQUFBLE1BQ1IsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLG1CQUFtQjtBQUFBLE1BQ2pCLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSx5QkFBeUI7QUFBQSxNQUN2QixPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxLQUFLO0FBQUEsTUFDTCxTQUFTO0FBQUEsTUFDVCxVQUFVO0FBQUEsUUFDUixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLE1BQ2YsT0FBTztBQUFBLE1BQ1AsT0FBTyxLQUFLLFlBQVk7QUFBQSxNQVN4QixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFNQyxRQUFPO0FBQUEsRUFDWDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFFQSxJQUFNQyxrQkFBaUI7QUFBQSxFQUNyQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBRUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU1DLGtCQUFpQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFDRjtBQUdBLElBQU1DLG1CQUFrQjtBQUFBLEVBQ3RCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBRUEsSUFBTUMsY0FBYTtBQUFBLEVBQ2pCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FB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QTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUtBLFFBQU0scUJBQXFCO0FBQUEsSUFDekI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBR0EsUUFBTSwwQkFBMEI7QUFB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QSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFDRjtBQU1BLElBQU0sV0FBVztBQUFBLEVBQ2Y7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR0EsSUFBTSwwQkFBMEI7QUFBQSxFQUM5QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBSUEsSUFBTSxxQkFBcUI7QUFBQSxFQUN6QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU0sV0FBVztBQUFBLEVBQ2Y7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUdBLElBQU0sZUFBZUU7QUFBQSxFQUNuQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEs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QUFBLEVBSUE7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxJQUFNQyxZQUFXO0FBQUEsRUFDZjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFHQSxJQUFNQyxTQUFRO0FBQUE7QUFBQSxFQUVaO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQTtBQUFBLEVBRUE7QUFBQTtBQUFBLEVBRUE7QUFDRjtBQUVBLElBQU1DLGVBQWM7QUFBQSxFQUNsQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUVBLElBQU1DLG9CQUFtQjtBQUFBLEVBQ3ZCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUVBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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TUFDakM7QUFBQSxJQUNKO0FBQUEsSUFDQSxrQkFBa0IsT0FBTztBQUNyQixVQUFJLE1BQU0sT0FBTyxjQUFjLEtBQUs7QUFBVztBQUUvQyxXQUFLLE1BQU0sa0JBQWtCLHVCQUF1QixLQUFLLFdBQVcsTUFBTSxNQUFNO0FBQUEsSUFDcEY7QUFBQSxJQUNBLFlBQVksT0FBTztBQUNmLFVBQUksTUFBTSxPQUFPLGNBQWMsS0FBSztBQUFXO0FBRS9DLFdBQUssT0FBTyxFQUFFLFNBQVMsWUFBWTtBQUFBLFFBQy9CLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDbkIsV0FBVyxNQUFNLE9BQU87QUFBQSxRQUN4QixNQUFNLE1BQU0sT0FBTztBQUFBLFFBQ25CLFNBQVMsTUFBTSxPQUFPO0FBQUEsUUFDdEIsT0FBTyxNQUFNLE9BQU87QUFBQSxNQUN4QixDQUFDO0FBRUQsVUFBSSxDQUFFLEtBQUssT0FBTyxFQUFFLFdBQVc7QUFDM0IsYUFBSyxPQUFPLEVBQUUsU0FBUyxNQUFNO0FBQUEsTUFDakM7QUFBQSxJQUNKO0FBQUEsSUFDQSxjQUFjO0FBQ1YsV0FBSyxPQUFPLEVBQUUsU0FBUyxZQUFZO0FBQUEsSUFDdkM7QUFBQSxFQUNKO0FBQ0o7IiwKICAibmFtZXMiOiBbImRlZXBGcmVlemUiLCAiUmVzcG9uc2UiLCAiZXNjYXBlSFRNTCIsICJpbmhlcml0JDEiLCAiU1BBTl9DTE9TRSIsICJlbWl0c1dyYXBwaW5nVGFncyIsICJzY29wZVRvQ1NTQ2xhc3MiLCAiSFRNTFJlbmRlcmVyIiwgIm5ld05vZGUiLCAiVG9rZW5UcmVlIiwgIlRva2VuVHJlZUVtaXR0ZXIiLCAic291cmNlIiwgImxvb2thaGVhZCIsICJjb25jYXQiLCAiYW55TnVtYmVyT2ZUaW1lcyIsICJvcHRpb25hbCIsICJzdHJpcE9wdGlvbnNGcm9tQXJncyIsICJlaXRoZXIiLCAiY291bnRNYXRjaEdyb3VwcyIsICJzdGFydHNXaXRoIiwgIkJBQ0tSRUZfUkUiLCAiX3Jld3JpdGVCYWNrcmVmZXJlbmNlcyIsICJvZmZzZXQiLCAiTUFUQ0hfTk9USElOR19SRSIsICJJREVOVF9SRSIsICJVTkRFUlNDT1JFX0lERU5UX1JFIiwgIk5VTUJFUl9SRSIsICJDX05VTUJFUl9SRSIsICJCSU5BUllfTlVNQkVSX1JFIiwgIlJFX1NUQVJURVJTX1JFIiwgIlNIRUJBTkciLCAiQkFDS1NMQVNIX0VTQ0FQRSIsICJBUE9TX1NUUklOR19NT0RFIiwgIlFVT1RFX1NUUklOR19NT0RFIiwgIlBIUkFTQUxfV09SRFNfTU9ERSIsICJDT01NRU5UIiwgImVuZCIsICJDX0xJTkVfQ09NTUVOVF9NT0RFIiwgIkNfQkxPQ0tfQ09NTUVOVF9NT0RFIiwgIkhBU0hfQ09NTUVOVF9NT0RFIiwgIk5VTUJFUl9NT0RFIiwgIkNfTlVNQkVSX01PREUiLCAiQklOQVJZX05VTUJFUl9NT0RFIiwgIlJFR0VYUF9NT0RFIiwgIlRJVExFX01PREUiLCAiVU5ERVJTQ09SRV9USVRMRV9NT0RFIiwgIk1FVEhPRF9HVUFSRCIsICJFTkRfU0FNRV9BU19CRUdJTiIsICJNT0RFUyIsICJza2lwSWZIYXNQcmVjZWRpbmdEb3QiLCAic2NvcGVDbGFzc05hbWUiLCAiYmVnaW5LZXl3b3JkcyIsICJjb21waWxlSWxsZWdhbCIsICJjb21waWxlTWF0Y2giLCAiY29tcGlsZVJlbGV2YW5jZSIsICJiZWZvcmVNYXRjaEV4dCIsICJDT01NT05fS0VZV09SRFMiLCAiREVGQVVMVF9LRVlXT1JEX1NDT1BFIiwgImNvbXBpbGVLZXl3b3JkcyIsICJzY29wZU5hbWUiLCAic2NvcmVGb3JLZXl3b3JkIiwgImNvbW1vbktleXdvcmQiLCAic2VlbkRlcHJlY2F0aW9ucyIsICJlcnJvciIsICJ3YXJuIiwgImRlcHJlY2F0ZWQiLCAidmVyc2lvbiIsICJNdWx0aUNsYXNzRXJyb3IiLCAicmVtYXBTY29wZU5hbWVzIiwgImJlZ2luTXVsdGlDbGFzcyIsICJlbmRNdWx0aUNsYXNzIiwgInNjb3BlU3VnYXIiLCAiTXVsdGlDbGFzcyIsICJjb21waWxlTGFuZ3VhZ2UiLCAiZ2xvYmFsIiwgImkiLCAiYyIsICJleHBhbmRPckNsb25lTW9kZSIsICJkZXBlbmRlbmN5T25QYXJlbnQiLCAiSFRNTEluamVjdGlvbkVycm9yIiwgImVzY2FwZSIsICJpbmhlcml0IiwgIk5PX01BVENIIiwgIk1BWF9LRVlXT1JEX0hJVFMiLCAiSExKUyIsICJoaWdobGlnaHQiLCAiZmlyZSIsICJ0b3AiLCAicmVzdWx0IiwgImhpZ2hsaWdodEF1dG8iLCAibWF4IiwgInBsYWludGV4dCIsICJyZWdpc3Rlckxhbmd1YWdlIiwgImxpc3RMYW5ndWFnZXMiLCAiZm9ybWF0IiwgImMiLCAidW5kZWZpbmVkIiwgImFwcGx5IiwgIm9mZnNldCIsICJjb2xsZWN0aW9uIiwgImNhY2hlIiwgIm1hcCIsICJzdHJpbmdUb0FycmF5IiwgInJ1bkluQ29udGV4dCIsICJBcnJheSIsICJEYXRlIiwgIkVycm9yIiwgIkZ1bmN0aW9uIiwgIk1hdGgiLCAiT2JqZWN0IiwgIlJlZ0V4cCIsICJTdHJpbmciLCAiVHlwZUVycm9yIiwgImhhc093blByb3BlcnR5IiwgImlkQ291bnRlciIsICJCdWZmZXIiLCAiU3ltYm9sIiwgIlVpbnQ4QXJyYXkiLCAiTWFwIiwgIlByb21pc2UiLCAiU2V0IiwgIldlYWtNYXAiLCAicmVzdWx0IiwgInN0YXJ0IiwgImVuZCIsICJpdGVyYXRlZSIsICJzaXplIiwgInZhbHVlcyIsICJpc1R5cGUiLCAic291cmNlIiwgImtleXMiLCAiZ2V0IiwgImtleSIsICJzZXRUaW1lb3V0IiwgImluY2x1ZGVzIiwgImlzRnVuY3Rpb24iLCAib2JqZWN0IiwgImlzUGxhaW5PYmplY3QiLCAiaW5kZXhPZiIsICJzZXQiLCAiY2xlYXJUaW1lb3V0IiwgIm9yZGVyIiwgImZuIiwgImluZGV4IiwgImFyeSIsICJvcGVyYXRvciIsICJub29wIiwgIm90aFZhbHVlIiwgInRyYW5zZm9ybSIsICJyZWZlcmVuY2UiLCAiY29uY2F0IiwgImpvaW4iLCAic2xpY2UiLCAicGFyZW50IiwgImNsb25lIiwgImZpbmQiLCAiZm9yRWFjaCIsICJiaW5kIiwgImRlYm91bmNlIiwgImZsaXAiLCAid3JhcCIsICJpc0VsZW1lbnQiLCAiaXNFbXB0eSIsICJpc0VxdWFsIiwgImlzTnVtYmVyIiwgImlzUmVnRXhwIiwgImFzc2lnbiIsICJjcmVhdGUiLCAiZGVmYXVsdHMiLCAiY2xhbXAiLCAiZXNjYXBlIiwgInBhcnNlSW50IiwgInJlcGxhY2UiLCAic3BsaXQiLCAic3RhcnRzV2l0aCIsICJtYXRjaGVzIiwgImNoYWluIiwgIm1heCIsICJtaW4iLCAicm91bmQiLCAidmFsdWUiLCAiZm91bmQiLCAic2VsZiIsICJtYXAiLCAiZnJvbSIsICJlbmQiLCAic3RhcnQiLCAiZmlyc3QiLCAiY29weSIsICJmb3VuZCIsICJyb3VuZCIsICJvZmZzZXQiLCAianNvbiIsICJzbGljZSIsICJtYWluIiwgImRvYyIsICJiYXNlIiwgImkiLCAibWluIiwgIm1heCIsICJ0eXBlIiwgIm5mYSIsICJlZGdlIiwgImV4cHIiLCAibm9kZSIsICJzdGF0ZXMiLCAiZGVmYXVsdHMiLCAibWFyayIsICJyIiwgInN0eWxlIiwgIndyYXAiLCAidG9wIiwgInNwYWNlIiwgIm9mZnNldCIsICJkaWZmIiwgInN0YXJ0IiwgImVuZCIsICJkZWwiLCAiZnJvbSIsICJtYXAiLCAianNvbiIsICJkb2MiLCAic2xpY2UiLCAicGFyZW50IiwgInRyIiwgImZvdW5kIiwgInN0eWxlIiwgIm5ld05vZGUiLCAiYmFzZSIsICJpbmRleCIsICJqb2luYWJsZSIsICJmaXJzdCIsICJ3cmFwIiwgIm1hdGNoZXMiLCAidG9wIiwgIm1hdGNoIiwgInR5cGUiLCAiY2xvc2UiLCAiVHJhbnNmb3JtRXJyb3IiLCAidHIiLCAiZnJvbSIsICJmb3VuZCIsICJkb2MiLCAianNvbiIsICJtYXAiLCAiZW5kIiwgInNsaWNlIiwgInNlbGYiLCAiZnJvbSIsICJvZmZzZXQiLCAiZG9jIiwgInRvcCIsICJsZWZ0IiwgImZpcnN0IiwgIm5ld05vZGUiLCAiZW5kIiwgImVudGVyIiwgImJhc2UiLCAic2VsZiIsICJ3cmFwIiwgImNvcHkiLCAic3RhcnQiLCAiZm91bmQiLCAicHJlTWF0Y2giLCAibWF0Y2hlcyIsICJlbXB0eSIsICJ0ciIsICJzbGljZSIsICJkb20iLCAiZXZlbnQiLCAiaGFuZGxlcnMiLCAiY3V0IiwgIk5vZGVUeXBlIiwgInIiLCAiaSIsICJvbGRPZmZzZXQiLCAicmVhZCIsICJmaW5kIiwgImFuY2hvciIsICJzZWwiLCAiZnJvbSIsICJmb3VuZCIsICJwcm9wIiwgIm9mZnNldCIsICJ0ciIsICJtYWMiLCAiaWUiLCAibWFjIiwgInNoaWZ0IiwgIm1hcCIsICJjb3B5IiwgInRyIiwgImVtcHR5IiwgInRyIiwgImxpZnQiLCAiZmlyc3QiLCAiZW5kIiwgIndyYXAiLCAidHIiLCAic2V0QmxvY2tUeXBlIiwgImZyb20iLCAiY29tbWFuZHMiLCAibWFjIiwgIndyYXAiLCAidHIiLCAiZm91bmQiLCAiZmlyc3QiLCAidHIiLCAiZW5kIiwgInN0YXJ0IiwgInNsaWNlIiwgImRvYyIsICJ0ciIsICJjb21tYW5kIiwgInJ1biIsICJmbiIsICJleHRlbnNpb25zIiwgIl9hIiwgImZpbmQiLCAiZnJvbSIsICJjb21tYW5kcyIsICJtYXRjaGVzIiwgImhhbmRsZXJzIiwgInN0YXJ0IiwgImVuZCIsICJvbkNyZWF0ZSIsICJvbkRlc3Ryb3kiLCAiTWFyayIsICJzb3VyY2UiLCAicmFuZ2UiLCAiY3JlYXRlUGFyYWdyYXBoTmVhciIsICJvcmlnaW5hbENyZWF0ZVBhcmFncmFwaE5lYXIiLCAiZGVsZXRlUmFuZ2UiLCAiZGVsZXRlU2VsZWN0aW9uIiwgIm9yaWdpbmFsRGVsZXRlU2VsZWN0aW9uIiwgImV4aXRDb2RlIiwgIm9yaWdpbmFsRXhpdENvZGUiLCAia2V5cyIsICJtaW4iLCAibWF4IiwgImVycm9yIiwgInNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kIiwgIm1hcCIsICJqb2luVXAiLCAib3JpZ2luYWxKb2luVXAiLCAiam9pbkRvd24iLCAib3JpZ2luYWxKb2luRG93biIsICJqb2luQmFja3dhcmQiLCAib3JpZ2luYWxKb2luQmFja3dhcmQiLCAiam9pbkZvcndhcmQiLCAib3JpZ2luYWxKb2luRm9yd2FyZCIsICJub3JtYWxpemVLZXlOYW1lIiwgInNoaWZ0IiwgImVtcHR5IiwgImxpZnQiLCAiaXNBY3RpdmUiLCAib3JpZ2luYWxMaWZ0IiwgImxpZnRFbXB0eUJsb2NrIiwgIm9yaWdpbmFsTGlmdEVtcHR5QmxvY2siLCAibGlmdExpc3RJdGVtIiwgIm9yaWdpbmFsTGlmdExpc3RJdGVtIiwgIm5ld2xpbmVJbkNvZGUiLCAib3JpZ2luYWxOZXdsaW5lSW5Db2RlIiwgInNlbGVjdEFsbCIsICJzZWxlY3ROb2RlQmFja3dhcmQiLCAib3JpZ2luYWxTZWxlY3ROb2RlQmFja3dhcmQiLCAic2VsZWN0Tm9kZUZvcndhcmQiLCAib3JpZ2luYWxTZWxlY3ROb2RlRm9yd2FyZCIsICJzZWxlY3RQYXJlbnROb2RlIiwgIm9yaWdpbmFsU2VsZWN0UGFyZW50Tm9kZSIsICJzZWxlY3RUZXh0YmxvY2tFbmQiLCAib3JpZ2luYWxTZWxlY3RUZXh0YmxvY2tFbmQiLCAic2VsZWN0VGV4dGJsb2NrU3RhcnQiLCAib3JpZ2luYWxTZWxlY3RUZXh0YmxvY2tTdGFydCIsICJkb2N1bWVudCIsICJkZWZhdWx0QmxvY2tBdCIsICJnZXRUZXh0IiwgImZyb20iLCAibm9kZSIsICJmcm9tIiwgImRvYyIsICJlbXB0eSIsICJmcm9tIiwgInJhbmdlIiwgImV4dGVuc2lvbnMiLCAiZnJvbSIsICJzdGFydCIsICJlbmQiLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgInRyIiwgImVtcHR5IiwgImNvbW1hbmRzIiwgInNldEJsb2NrVHlwZSIsICJkb2MiLCAic2lua0xpc3RJdGVtIiwgIm9yaWdpbmFsU2lua0xpc3RJdGVtIiwgInNwbGl0QmxvY2siLCAiZGVmYXVsdEJsb2NrQXQiLCAiZmlyc3QiLCAid3JhcCIsICJuZXdOZXh0VHlwZUF0dHJpYnV0ZXMiLCAibmV4dFR5cGUiLCAiaXNBY3RpdmUiLCAid3JhcEluIiwgIm9yaWdpbmFsV3JhcEluIiwgIndyYXBJbkxpc3QiLCAib3JpZ2luYWxXcmFwSW5MaXN0IiwgImlzRW1wdHkiLCAic3R5bGUiLCAiY29yZUV4dGVuc2lvbnMiLCAiZm4iLCAiZm9jdXMiLCAiYmx1ciIsICJnZXRUZXh0IiwgIm5ld05vZGUiLCAib2Zmc2V0IiwgInRyIiwgIk1hcmsiLCAicmVtb3ZlTWFyayIsICJOb2RlIiwgInRyIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiTWFyayIsICJjb21tYW5kcyIsICJOb2RlIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiaW5wdXRSZWdleCIsICJpbnB1dFJlZ2V4IiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiVGV4dFN0eWxlIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiTm9kZSIsICJ0b3AiLCAicmVjdCIsICJkb2MiLCAianNvbiIsICJ0ciIsICJOb2RlIiwgImNvbW1hbmRzIiwgInRyIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiUm9wZVNlcXVlbmNlIiwgImZyb20iLCAiZm9yRWFjaCIsICJMZWFmIiwgInN0YXJ0IiwgIkFwcGVuZCIsICJsZWZ0IiwgInJpZ2h0IiwgImFwcGVuZElubmVyIiwgImRpc3RfZGVmYXVsdCIsICJlbmQiLCAibWFwIiwgImZyb20iLCAic3RhcnQiLCAiZGlzdF9kZWZhdWx0IiwgImhpc3RvcnkiLCAidHIiLCAicmVkbyIsICJ0ciIsICJjb21tYW5kIiwgIk5vZGUiLCAidHIiLCAic3RhcklucHV0UmVnZXgiLCAic3RhclBhc3RlUmVnZXgiLCAidW5kZXJzY29yZUlucHV0UmVnZXgiLCAidW5kZXJzY29yZVBhc3RlUmVnZXgiLCAiTWFyayIsICJjb21tYW5kcyIsICJMaXN0SXRlbSIsICJOb2RlIiwgIkxpc3RJdGVtIiwgIk5vZGUiLCAiVGV4dFN0eWxlIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiaW5wdXRSZWdleCIsICJzdGFydCIsICJOb2RlIiwgImNvbW1hbmRzIiwgImRvYyIsICJpc0VtcHR5IiwgImlucHV0UmVnZXgiLCAicGFzdGVSZWdleCIsICJNYXJrIiwgInN0eWxlIiwgImNvbW1hbmRzIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiTWFyayIsICJjb21tYW5kcyIsICJjYWNoZSIsICJtYXAiLCAibGVmdCIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgInN0YXJ0IiwgIm1hcCIsICJkb2MiLCAiZnJvbSIsICJ0ciIsICJqc29uIiwgIm5vcm1hbGl6ZSIsICJzdGFydCIsICJvZmZzZXQiLCAiZmlyc3QiLCAiZW5kIiwgInNsaWNlIiwgImxlZnQiLCAicmlnaHQiLCAiciIsICJlbXB0eSIsICJzb3VyY2UiLCAic3RhcnQyIiwgInRvcCIsICJmb3VuZCIsICJib3R0b20iLCAiaGFuZGxlS2V5RG93biIsICJhcnJvdyIsICJoYW5kbGVUcmlwbGVDbGljayIsICJjb3B5IiwgImMiLCAiVGFibGVWaWV3IiwgIk5vZGUiLCAidHIiLCAib2Zmc2V0IiwgIk5vZGUiLCAiTm9kZSIsICJOb2RlIiwgIk5vZGUiLCAiTWFyayIsICJzdHlsZSIsICJjb21tYW5kcyIsICJpbnB1dFJlZ2V4IiwgInBhc3RlUmVnZXgiLCAiTWFyayIsICJjb21tYW5kcyIsICJOb2RlIiwgImNvbW1hbmRzIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiYyIsICJuZXh0U3RhdGUiLCAicnVuJDEiLCAic3RhcnQiLCAiYyIsICJmaXJzdCIsICJvcGVyYXRvciIsICJzY2hlbWUiLCAiVGV4dCIsICJydW4iLCAic3RhcnQiLCAiVGV4dCIsICJzY2hlbWUiLCAicnVuIiwgInJ1biQxIiwgInRyIiwgInNsaWNlIiwgImVtcHR5IiwgIk1hcmsiLCAiaW5wdXRSZWdleCIsICJOb2RlIiwgImNvbW1hbmRzIiwgIk1hcmsiLCAiY29tbWFuZHMiLCAiTm9kZSIsICJ0ciIsICJvZmZzZXQiLCAiTm9kZSIsICJtYXRjaGVzIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAibWF0Y2hlcyIsICJOb2RlIiwgImNvbW1hbmRzIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiTm9kZSIsICJzbGljZSIsICJmcm9tIiwgImVtcHR5IiwgInRyIiwgIk5vZGUiLCAiTm9kZSIsICJlbXB0eSIsICJub2RlIiwgImRlZmF1bHRCbG9ja0F0IiwgInRyIiwgIk5vZGUiLCAiY29tbWFuZHMiLCAiZW1wdHkiLCAidHIiLCAiZG9jIiwgIm9mZnNldCIsICJlbmQiLCAic2NvcGVOYW1lIiwgIndhcm4iLCAidmVyc2lvbiIsICJnbG9iYWwiLCAiaSIsICJjIiwgImhpZ2hsaWdodCIsICJmaXJlIiwgInRvcCIsICJyZXN1bHQiLCAiaGlnaGxpZ2h0QXV0byIsICJtYXgiLCAicGxhaW50ZXh0IiwgInJlZ2lzdGVyTGFuZ3VhZ2UiLCAibGlzdExhbmd1YWdlcyIsICJkb2MiLCAibG93bGlnaHQiLCAiZnJvbSIsICJpc0Z1bmN0aW9uIiwgImZyb20iLCAiTm9kZSIsICJjb21tYW5kcyIsICJjb21tYW5kcyIsICJzdHlsZSIsICJuYW1lIiwgImNsaWVudFJlY3QiLCAiY2xpZW50UmVjdCIsICJnZXRDb21wdXRlZFN0eWxlIiwgImdldENvbXB1dGVkU3R5bGUiLCAiY3NzIiwgIndpbmRvdyIsICJtaW4iLCAibWF4IiwgImtleXMiLCAidG9QYWRkaW5nT2JqZWN0IiwgImFycm93IiwgInBvcHBlck9mZnNldHMiLCAibWluIiwgIm1heCIsICJvZmZzZXQiLCAiZWZmZWN0IiwgInBvcHBlciIsICJnZXRDb21wdXRlZFN0eWxlIiwgImVmZmVjdCIsICJ3aW5kb3ciLCAiaGFzaCIsICJnZXRDb21wdXRlZFN0eWxlIiwgImdldENvbXB1dGVkU3R5bGUiLCAiY2xpcHBpbmdQYXJlbnRzIiwgImdldENvbXB1dGVkU3R5bGUiLCAicmVmZXJlbmNlIiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgInBsYWNlbWVudHMiLCAicGxhY2VtZW50IiwgInBsYWNlbWVudHMiLCAicGxhY2VtZW50IiwgIl9sb29wIiwgIl9pIiwgImNoZWNrcyIsICJvZmZzZXQiLCAicG9wcGVyT2Zmc2V0cyIsICJvZmZzZXQiLCAibWluIiwgIm1heCIsICJtb2RpZmllcnMiLCAibWFwIiwgImZuIiwgIm1vZGlmaWVycyIsICJtZXJnZWQiLCAiZGVmYXVsdE1vZGlmaWVycyIsICJjcmVhdGVQb3BwZXIiLCAicmVmZXJlbmNlIiwgInBvcHBlciIsICJvcHRpb25zIiwgImZuIiwgInN0YXRlIiwgImVmZmVjdCIsICJub29wRm4iLCAiQk9YX0NMQVNTIiwgIkNPTlRFTlRfQ0xBU1MiLCAiQkFDS0RST1BfQ0xBU1MiLCAiQVJST1dfQ0xBU1MiLCAiU1ZHX0FSUk9XX0NMQVNTIiwgIlRPVUNIX09QVElPTlMiLCAicGFzc2l2ZSIsICJjYXB0dXJlIiwgIlRJUFBZX0RFRkFVTFRfQVBQRU5EX1RPIiwgImRvY3VtZW50IiwgImJvZHkiLCAiaGFzT3duUHJvcGVydHkiLCAib2JqIiwgImtleSIsICJjYWxsIiwgImdldFZhbHVlQXRJbmRleE9yUmV0dXJuIiwgInZhbHVlIiwgImluZGV4IiwgImRlZmF1bHRWYWx1ZSIsICJBcnJheSIsICJpc0FycmF5IiwgInYiLCAiaXNUeXBlIiwgInR5cGUiLCAic3RyIiwgInRvU3RyaW5nIiwgImluZGV4T2YiLCAiaW52b2tlV2l0aEFyZ3NPclJldHVybiIsICJhcmdzIiwgImRlYm91bmNlIiwgImZuIiwgIm1zIiwgInRpbWVvdXQiLCAiYXJnIiwgImNsZWFyVGltZW91dCIsICJzZXRUaW1lb3V0IiwgInJlbW92ZVByb3BlcnRpZXMiLCAia2V5cyIsICJjbG9uZSIsICJmb3JFYWNoIiwgInNwbGl0QnlTcGFjZXMiLCAic3BsaXQiLCAiZmlsdGVyIiwgIkJvb2xlYW4iLCAibm9ybWFsaXplVG9BcnJheSIsICJjb25jYXQiLCAicHVzaElmVW5pcXVlIiwgImFyciIsICJwdXNoIiwgInVuaXF1ZSIsICJpdGVtIiwgImdldEJhc2VQbGFjZW1lbnQiLCAicGxhY2VtZW50IiwgImFycmF5RnJvbSIsICJzbGljZSIsICJyZW1vdmVVbmRlZmluZWRQcm9wcyIsICJPYmplY3QiLCAicmVkdWNlIiwgImFjYyIsICJ1bmRlZmluZWQiLCAiZGl2IiwgImNyZWF0ZUVsZW1lbnQiLCAiaXNFbGVtZW50IiwgInNvbWUiLCAiaXNOb2RlTGlzdCIsICJpc01vdXNlRXZlbnQiLCAiaXNSZWZlcmVuY2VFbGVtZW50IiwgIl90aXBweSIsICJyZWZlcmVuY2UiLCAiZ2V0QXJyYXlPZkVsZW1lbnRzIiwgInF1ZXJ5U2VsZWN0b3JBbGwiLCAic2V0VHJhbnNpdGlvbkR1cmF0aW9uIiwgImVscyIsICJlbCIsICJzdHlsZSIsICJ0cmFuc2l0aW9uRHVyYXRpb24iLCAic2V0VmlzaWJpbGl0eVN0YXRlIiwgInN0YXRlIiwgInNldEF0dHJpYnV0ZSIsICJnZXRPd25lckRvY3VtZW50IiwgImVsZW1lbnRPckVsZW1lbnRzIiwgImVsZW1lbnQiLCAib3duZXJEb2N1bWVudCIsICJpc0N1cnNvck91dHNpZGVJbnRlcmFjdGl2ZUJvcmRlciIsICJwb3BwZXJUcmVlRGF0YSIsICJldmVudCIsICJjbGllbnRYIiwgImNsaWVudFkiLCAiZXZlcnkiLCAicG9wcGVyUmVjdCIsICJwb3BwZXJTdGF0ZSIsICJwcm9wcyIsICJpbnRlcmFjdGl2ZUJvcmRlciIsICJiYXNlUGxhY2VtZW50IiwgIm9mZnNldERhdGEiLCAibW9kaWZpZXJzRGF0YSIsICJvZmZzZXQiLCAidG9wRGlzdGFuY2UiLCAidG9wIiwgInkiLCAiYm90dG9tRGlzdGFuY2UiLCAiYm90dG9tIiwgImxlZnREaXN0YW5jZSIsICJsZWZ0IiwgIngiLCAicmlnaHREaXN0YW5jZSIsICJyaWdodCIsICJleGNlZWRzVG9wIiwgImV4Y2VlZHNCb3R0b20iLCAiZXhjZWVkc0xlZnQiLCAiZXhjZWVkc1JpZ2h0IiwgInVwZGF0ZVRyYW5zaXRpb25FbmRMaXN0ZW5lciIsICJib3giLCAiYWN0aW9uIiwgImxpc3RlbmVyIiwgIm1ldGhvZCIsICJhY3R1YWxDb250YWlucyIsICJwYXJlbnQiLCAiY2hpbGQiLCAidGFyZ2V0IiwgImNvbnRhaW5zIiwgImdldFJvb3ROb2RlIiwgImhvc3QiLCAiY3VycmVudElucHV0IiwgImlzVG91Y2giLCAibGFzdE1vdXNlTW92ZVRpbWUiLCAib25Eb2N1bWVudFRvdWNoU3RhcnQiLCAid2luZG93IiwgInBlcmZvcm1hbmNlIiwgImFkZEV2ZW50TGlzdGVuZXIiLCAib25Eb2N1bWVudE1vdXNlTW92ZSIsICJub3ciLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJvbldpbmRvd0JsdXIiLCAiYWN0aXZlRWxlbWVudCIsICJpbnN0YW5jZSIsICJibHVyIiwgImlzVmlzaWJsZSIsICJiaW5kR2xvYmFsRXZlbnRMaXN0ZW5lcnMiLCAiaXNCcm93c2VyIiwgImlzSUUxMSIsICJtc0NyeXB0byIsICJjcmVhdGVNZW1vcnlMZWFrV2FybmluZyIsICJ0eHQiLCAiam9pbiIsICJjbGVhbiIsICJzcGFjZXNBbmRUYWJzIiwgImxpbmVTdGFydFdpdGhTcGFjZXMiLCAicmVwbGFjZSIsICJ0cmltIiwgImdldERldk1lc3NhZ2UiLCAibWVzc2FnZSIsICJnZXRGb3JtYXR0ZWRNZXNzYWdlIiwgInZpc2l0ZWRNZXNzYWdlcyIsICJyZXNldFZpc2l0ZWRNZXNzYWdlcyIsICJTZXQiLCAid2FybldoZW4iLCAiY29uZGl0aW9uIiwgImhhcyIsICJhZGQiLCAiY29uc29sZSIsICJ3YXJuIiwgImVycm9yV2hlbiIsICJlcnJvciIsICJ2YWxpZGF0ZVRhcmdldHMiLCAidGFyZ2V0cyIsICJkaWRQYXNzRmFsc3lWYWx1ZSIsICJkaWRQYXNzUGxhaW5PYmplY3QiLCAicHJvdG90eXBlIiwgIlN0cmluZyIsICJwbHVnaW5Qcm9wcyIsICJhbmltYXRlRmlsbCIsICJmb2xsb3dDdXJzb3IiLCAiaW5saW5lUG9zaXRpb25pbmciLCAic3RpY2t5IiwgInJlbmRlclByb3BzIiwgImFsbG93SFRNTCIsICJhbmltYXRpb24iLCAiYXJyb3ciLCAiY29udGVudCIsICJpbmVydGlhIiwgIm1heFdpZHRoIiwgInJvbGUiLCAidGhlbWUiLCAiekluZGV4IiwgImRlZmF1bHRQcm9wcyIsICJhcHBlbmRUbyIsICJhcmlhIiwgImV4cGFuZGVkIiwgImRlbGF5IiwgImR1cmF0aW9uIiwgImdldFJlZmVyZW5jZUNsaWVudFJlY3QiLCAiaGlkZU9uQ2xpY2siLCAiaWdub3JlQXR0cmlidXRlcyIsICJpbnRlcmFjdGl2ZSIsICJpbnRlcmFjdGl2ZURlYm91bmNlIiwgIm1vdmVUcmFuc2l0aW9uIiwgIm9uQWZ0ZXJVcGRhdGUiLCAib25CZWZvcmVVcGRhdGUiLCAib25DcmVhdGUiLCAib25EZXN0cm95IiwgIm9uSGlkZGVuIiwgIm9uSGlkZSIsICJvbk1vdW50IiwgIm9uU2hvdyIsICJvblNob3duIiwgIm9uVHJpZ2dlciIsICJvblVudHJpZ2dlciIsICJvbkNsaWNrT3V0c2lkZSIsICJwbHVnaW5zIiwgInBvcHBlck9wdGlvbnMiLCAicmVuZGVyIiwgInNob3dPbkNyZWF0ZSIsICJ0b3VjaCIsICJ0cmlnZ2VyIiwgInRyaWdnZXJUYXJnZXQiLCAiZGVmYXVsdEtleXMiLCAic2V0RGVmYXVsdFByb3BzIiwgInBhcnRpYWxQcm9wcyIsICJ2YWxpZGF0ZVByb3BzIiwgImdldEV4dGVuZGVkUGFzc2VkUHJvcHMiLCAicGFzc2VkUHJvcHMiLCAicGx1Z2luIiwgIm5hbWUiLCAiZ2V0RGF0YUF0dHJpYnV0ZVByb3BzIiwgInByb3BLZXlzIiwgInZhbHVlQXNTdHJpbmciLCAiZ2V0QXR0cmlidXRlIiwgIkpTT04iLCAicGFyc2UiLCAiZSIsICJldmFsdWF0ZVByb3BzIiwgIm91dCIsICJwcm9wIiwgIm5vblBsdWdpblByb3BzIiwgImRpZFBhc3NVbmtub3duUHJvcCIsICJsZW5ndGgiLCAiaW5uZXJIVE1MIiwgImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwgImh0bWwiLCAiY3JlYXRlQXJyb3dFbGVtZW50IiwgImNsYXNzTmFtZSIsICJhcHBlbmRDaGlsZCIsICJzZXRDb250ZW50IiwgInRleHRDb250ZW50IiwgImdldENoaWxkcmVuIiwgInBvcHBlciIsICJmaXJzdEVsZW1lbnRDaGlsZCIsICJib3hDaGlsZHJlbiIsICJjaGlsZHJlbiIsICJmaW5kIiwgIm5vZGUiLCAiY2xhc3NMaXN0IiwgImJhY2tkcm9wIiwgIm9uVXBkYXRlIiwgInByZXZQcm9wcyIsICJuZXh0UHJvcHMiLCAicmVtb3ZlQXR0cmlidXRlIiwgInJlbW92ZUNoaWxkIiwgIiQkdGlwcHkiLCAiaWRDb3VudGVyIiwgIm1vdXNlTW92ZUxpc3RlbmVycyIsICJtb3VudGVkSW5zdGFuY2VzIiwgImNyZWF0ZVRpcHB5IiwgInNob3dUaW1lb3V0IiwgImhpZGVUaW1lb3V0IiwgInNjaGVkdWxlSGlkZUFuaW1hdGlvbkZyYW1lIiwgImlzVmlzaWJsZUZyb21DbGljayIsICJkaWRIaWRlRHVlVG9Eb2N1bWVudE1vdXNlRG93biIsICJkaWRUb3VjaE1vdmUiLCAiaWdub3JlT25GaXJzdFVwZGF0ZSIsICJsYXN0VHJpZ2dlckV2ZW50IiwgImN1cnJlbnRUcmFuc2l0aW9uRW5kTGlzdGVuZXIiLCAib25GaXJzdFVwZGF0ZSIsICJsaXN0ZW5lcnMiLCAiZGVib3VuY2VkT25Nb3VzZU1vdmUiLCAib25Nb3VzZU1vdmUiLCAiY3VycmVudFRhcmdldCIsICJpZCIsICJwb3BwZXJJbnN0YW5jZSIsICJpc0VuYWJsZWQiLCAiaXNEZXN0cm95ZWQiLCAiaXNNb3VudGVkIiwgImlzU2hvd24iLCAiY2xlYXJEZWxheVRpbWVvdXRzIiwgInNldFByb3BzIiwgInNob3ciLCAiaGlkZSIsICJoaWRlV2l0aEludGVyYWN0aXZpdHkiLCAiZW5hYmxlIiwgImRpc2FibGUiLCAidW5tb3VudCIsICJkZXN0cm95IiwgInBsdWdpbnNIb29rcyIsICJtYXAiLCAiaGFzQXJpYUV4cGFuZGVkIiwgImhhc0F0dHJpYnV0ZSIsICJhZGRMaXN0ZW5lcnMiLCAiaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlIiwgImhhbmRsZVN0eWxlcyIsICJpbnZva2VIb29rIiwgInNjaGVkdWxlU2hvdyIsICJnZXREb2N1bWVudCIsICJnZXROb3JtYWxpemVkVG91Y2hTZXR0aW5ncyIsICJnZXRJc0N1c3RvbVRvdWNoQmVoYXZpb3IiLCAiZ2V0SXNEZWZhdWx0UmVuZGVyRm4iLCAiZ2V0Q3VycmVudFRhcmdldCIsICJwYXJlbnROb2RlIiwgImdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuIiwgImdldERlbGF5IiwgImlzU2hvdyIsICJmcm9tSGlkZSIsICJwb2ludGVyRXZlbnRzIiwgImhvb2siLCAic2hvdWxkSW52b2tlUHJvcHNIb29rIiwgInBsdWdpbkhvb2tzIiwgImhhbmRsZUFyaWFDb250ZW50QXR0cmlidXRlIiwgImF0dHIiLCAibm9kZXMiLCAiY3VycmVudFZhbHVlIiwgIm5leHRWYWx1ZSIsICJjbGVhbnVwSW50ZXJhY3RpdmVNb3VzZUxpc3RlbmVycyIsICJvbkRvY3VtZW50UHJlc3MiLCAiYWN0dWFsVGFyZ2V0IiwgImNvbXBvc2VkUGF0aCIsICJyZW1vdmVEb2N1bWVudFByZXNzIiwgIm9uVG91Y2hNb3ZlIiwgIm9uVG91Y2hTdGFydCIsICJhZGREb2N1bWVudFByZXNzIiwgImRvYyIsICJvblRyYW5zaXRpb25lZE91dCIsICJjYWxsYmFjayIsICJvblRyYW5zaXRpb25FbmQiLCAib25UcmFuc2l0aW9uZWRJbiIsICJvbiIsICJldmVudFR5cGUiLCAiaGFuZGxlciIsICJvcHRpb25zIiwgIm9uTW91c2VMZWF2ZSIsICJvbkJsdXJPckZvY3VzT3V0IiwgInJlbW92ZUxpc3RlbmVycyIsICJzaG91bGRTY2hlZHVsZUNsaWNrSGlkZSIsICJpc0V2ZW50TGlzdGVuZXJTdG9wcGVkIiwgIndhc0ZvY3VzZWQiLCAic2NoZWR1bGVIaWRlIiwgImlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyIiwgImdldE5lc3RlZFBvcHBlclRyZWUiLCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgInNob3VsZEJhaWwiLCAicmVsYXRlZFRhcmdldCIsICJjcmVhdGVQb3BwZXJJbnN0YW5jZSIsICJkZXN0cm95UG9wcGVySW5zdGFuY2UiLCAiY29tcHV0ZWRSZWZlcmVuY2UiLCAiY29udGV4dEVsZW1lbnQiLCAidGlwcHlNb2RpZmllciIsICJlbmFibGVkIiwgInBoYXNlIiwgInJlcXVpcmVzIiwgImF0dHJpYnV0ZXMiLCAibW9kaWZpZXJzIiwgInBhZGRpbmciLCAiYWRhcHRpdmUiLCAiY3JlYXRlUG9wcGVyIiwgIm1vdW50IiwgIm5leHRFbGVtZW50U2libGluZyIsICJ0b3VjaFZhbHVlIiwgInRvdWNoRGVsYXkiLCAicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwgImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwgIm5lc3RlZFBvcHBlciIsICJmb3JjZVVwZGF0ZSIsICJpc0FscmVhZHlWaXNpYmxlIiwgImlzRGlzYWJsZWQiLCAiaXNUb3VjaEFuZFRvdWNoRGlzYWJsZWQiLCAidmlzaWJpbGl0eSIsICJ0cmFuc2l0aW9uIiwgIm9mZnNldEhlaWdodCIsICJpc0FscmVhZHlIaWRkZW4iLCAiaSIsICJ0aXBweSIsICJvcHRpb25hbFByb3BzIiwgImVsZW1lbnRzIiwgImlzU2luZ2xlQ29udGVudEVsZW1lbnQiLCAiaXNNb3JlVGhhbk9uZVJlZmVyZW5jZUVsZW1lbnQiLCAiaW5zdGFuY2VzIiwgImFwcGx5U3R5bGVzTW9kaWZpZXIiLCAiYXBwbHlTdHlsZXMiLCAiZWZmZWN0IiwgInN0YXRlIiwgImluaXRpYWxTdHlsZXMiLCAicG9wcGVyIiwgInBvc2l0aW9uIiwgIm9wdGlvbnMiLCAic3RyYXRlZ3kiLCAibGVmdCIsICJ0b3AiLCAibWFyZ2luIiwgImFycm93IiwgInJlZmVyZW5jZSIsICJPYmplY3QiLCAiYXNzaWduIiwgImVsZW1lbnRzIiwgInN0eWxlIiwgInN0eWxlcyIsICJ0aXBweSIsICJzZXREZWZhdWx0UHJvcHMiLCAicmVuZGVyIiwgImZyb20iLCAiZG9jIiwgImVtcHR5IiwgImVtcHR5IiwgImRvYyIsICJmcm9tIiwgIk5vZGUiLCAidHIiLCAib2Zmc2V0IiwgIk5vZGUiLCAiTm9kZSIsICJjb21tYW5kcyIsICJmcm9tIiwgImNvbW1hbmQiLCAicmVuZGVyIiwgIl9hIiwgImVtcHR5IiwgIk5vZGUiLCAidHIiLCAiZW1wdHkiLCAiQ19MSU5FX0NPTU1FTlRfTU9ERSIsICJUSVRMRV9NT0RFIiwgIkxJVEVSQUxTIiwgIktFWVdPUkRTIiwgIkxJVEVSQUxTIiwgIkNfTElORV9DT01NRU5UX01PREUiLCAiVFlQRVMiLCAiVElUTEVfTU9ERSIsICJLRVlXT1JEUyIsICJDX0xJTkVfQ09NTUVOVF9NT0RFIiwgIlRJVExFX01PREUiLCAiTElURVJBTFMiLCAiS0VZV09SRFMiLCAiVElUTEVfTU9ERSIsICJNT0RFUyIsICJJREVOVF9SRSIsICJMSVRFUkFMUyIsICJCVUlMVF9JTlMiLCAiVFlQRVMiLCAiS0VZV09SRFMiLCAiTElURVJBTFMiLCAiQlVJTFRfSU5TIiwgIkxJVEVSQUxTIiwgIlRZUEVTIiwgIktFWVdPUkRTIiwgIklERU5UX1JFIiwgImRlY2ltYWxEaWdpdHMiLCAiZnJhYyIsICJDT01NRU5UIiwgIkxJVEVSQUxTIiwgImRlY2ltYWxEaWdpdHMiLCAiZnJhYyIsICJoZXhEaWdpdHMiLCAiTlVNRVJJQyIsICJLRVlXT1JEUyIsICJNT0RFUyIsICJUQUdTIiwgIk1FRElBX0ZFQVRVUkVTIiwgIlBTRVVET19DTEFTU0VTIiwgIlBTRVVET19FTEVNRU5UUyIsICJBVFRSSUJVVEVTIiwgIklERU5UX1JFIiwgImMiLCAiVFlQRVMiLCAiTElURVJBTFMiLCAiQlVJTFRfSU5TIiwgIktFWVdPUkRTIiwgIktFWVdPUkRTIiwgImNsb3NlIiwgIklERU5UX1JFIiwgIkxJVEVSQUxTIiwgIkJVSUxUX0lOUyIsICJLRVlXT1JEUyIsICJBVFRSSUJVVEVTIiwgIklERU5UX1JFIiwgIkJVSUxUX0lOUyIsICJMSVRFUkFMUyIsICJUWVBFUyIsICJLRVlXT1JEUyIsICJsb29rYWhlYWQiLCAiSURFTlRfUkUiLCAiS0VZV09SRFMiLCAiTElURVJBTFMiLCAiVFlQRVMiLCAiTU9ERVMiLCAiVEFHUyIsICJNRURJQV9GRUFUVVJFUyIsICJQU0VVRE9fQ0xBU1NFUyIsICJQU0VVRE9fRUxFTUVOVFMiLCAiQVRUUklCVVRFUyIsICJJREVOVF9SRSIsICJMSVRFUkFMUyIsICJUWVBFUyIsICJLRVlXT1JEUyIsICJzb3VyY2UiLCAibG9va2FoZWFkIiwgImNvbmNhdCIsICJzdHJpcE9wdGlvbnNGcm9tQXJncyIsICJlaXRoZXIiLCAiS0VZV09SRFMiLCAiQlVJTFRfSU5TIiwgImRlY2ltYWxEaWdpdHMiLCAiaGV4RGlnaXRzIiwgIkFUVFJJQlVURVMiLCAiSURFTlRfUkUiLCAiS0VZV09SRFMiLCAiTElURVJBTFMiLCAiVFlQRVMiLCAiRVJST1JfVFlQRVMiLCAiQlVJTFRfSU5fR0xPQkFMUyIsICJCVUlMVF9JTl9WQVJJQUJMRVMiLCAiQlVJTFRfSU5TIiwgImphdmFzY3JpcHQiLCAiZGVjaW1hbERpZ2l0cyIsICJmcmFjIiwgIkNPTU1FTlQiLCAiQ09NTUVOVCIsICJMSVRFUkFMUyIsICJNT0RFUyIsICJpbXBvcnRfY29yZSIsICJIaWdobGlnaHRKUyIsICJmb3JtYXQiLCAiZm9ybWF0dGVyIiwgImhpZ2hsaWdodCIsICJyZWdpc3RlcmVkIiwgIm1pbiIsICJtYXgiLCAicm91bmQiLCAiYmFzZSIsICJyb3VuZCIsICJyb3VuZCIsICJjIiwgInJvdW5kIiwgInIiLCAicm91bmQiLCAibWF4IiwgImZpcnN0IiwgImZpcnN0IiwgInN0eWxlIiwgInJvdW5kIiwgIm9mZnNldCIsICJyb3VuZCIsICJvZmZzZXQiLCAidG9vbHMiLCAiVGV4dFN0eWxlIiwgImtleXMiLCAic3RhdGUiLCAiZnJvbSIsICJMaXN0SXRlbSIsICJlZGl0b3JzIiwgInNsaWNlIl0KfQo= diff --git a/resources/js/extensions/TiptapBlock.js b/resources/js/extensions/TiptapBlock.js index 8669881..432ca7d 100644 --- a/resources/js/extensions/TiptapBlock.js +++ b/resources/js/extensions/TiptapBlock.js @@ -195,13 +195,13 @@ export const TiptapBlock = Node.create({ const { selection } = state const { $from, $to } = selection const range = $from.blockRange($to) + const currentChain = chain() if (!range) { + currentChain.insertContentAt({ from: $from.pos, to: $from.pos + 1 }, { type: this.name, attrs: attributes }) return false } - const currentChain = chain() - currentChain.insertContentAt({ from: range.start, to: range.end }, { type: this.name, attrs: attributes }) return currentChain.focus(range.end + 1) diff --git a/resources/js/plugin.js b/resources/js/plugin.js index b6065d5..7b54d76 100644 --- a/resources/js/plugin.js +++ b/resources/js/plugin.js @@ -1,4 +1,4 @@ -import {Editor, getHTMLFromFragment, isActive} from "@tiptap/core"; +import {Editor, isActive} from "@tiptap/core"; import Blockquote from "@tiptap/extension-blockquote"; import Bold from "@tiptap/extension-bold"; import BulletList from "@tiptap/extension-bullet-list"; @@ -114,6 +114,27 @@ if (localeSwitcher) { }); } +Livewire.on('insertFromAction', (event) => { + setTimeout(() => { + const proxyEvent = new CustomEvent('insert-content', { bubble: true, detail: event}) + window.dispatchEvent(proxyEvent); + }, 100) +}) + +Livewire.on('insertBlockFromAction', (event) => { + setTimeout(() => { + const proxyEvent = new CustomEvent('insert-block', { bubble: true, detail: event}) + window.dispatchEvent(proxyEvent); + }, 100) +}) + +Livewire.on('updateBlockFromAction', (event) => { + setTimeout(() => { + const proxyEvent = new CustomEvent('update-block', { bubble: true, detail: event}) + window.dispatchEvent(proxyEvent); + }, 100) +}) + export default function tiptap({ state, statePath, @@ -313,25 +334,32 @@ export default function tiptap({ } this.$watch('state', (newState, oldState) => { - if (this.editor().isEmpty) { - this.editor().destroy(); - this.initEditor(newState); - } - - if (! isEqual(oldState, this.editor().state.doc.toJSON())) { - this.updateEditorContent(newState) + if (typeof newState !== "undefined") { + if (! isEqual(oldState, Alpine.raw(newState))) { + this.updateEditorContent(newState) + } } }); }, - destroy() { - this.editor().destroy(); + destroyEditor(event) { + let id = event.detail.id.split('-')[0]; + + if (!this.modalId || id + '.' + this.statePath === this.modalId) return + + if (editors[this.statePath]) { + editors[this.statePath].destroy(); + delete editors[this.statePath]; + } }, editor() { return editors[this.statePath]; }, initEditor(content) { + let selection = null; + if (editors[this.statePath]) { content = this.editor().getJSON(); + selection = this.editor().state.selection; editors[this.statePath].destroy(); delete editors[this.statePath]; } @@ -353,6 +381,12 @@ export default function tiptap({ }); } }, + onCreate({editor}) { + if (selection && _this.modalId) { + _this.updatedAt = Date.now(); + editor.chain().focus().setTextSelection(selection).run(); + } + }, onUpdate({editor}) { _this.updatedAt = Date.now(); _this.state = editor.isEmpty ? null : editor.getJSON(); diff --git a/resources/views/tiptap-editor.blade.php b/resources/views/tiptap-editor.blade.php index 8c28e19..e095054 100644 --- a/resources/views/tiptap-editor.blade.php +++ b/resources/views/tiptap-editor.blade.php @@ -59,6 +59,7 @@ class="relative z-0 tiptap-wrapper rounded-md bg-white dark:bg-gray-900 focus-wi x-on:update-block.window="updateBlock($event)" x-on:open-block-settings.window="openBlockSettings($event)" x-on:delete-block.window="deleteBlock()" + x-on:close-modal.window="destroyEditor($event)" x-trap.noscroll="fullScreenMode" > @if (! $isDisabled && ! $isToolbarMenusDisabled() && $tools) diff --git a/src/Actions/GridBuilderAction.php b/src/Actions/GridBuilderAction.php index 4757ba1..9eb7a28 100644 --- a/src/Actions/GridBuilderAction.php +++ b/src/Actions/GridBuilderAction.php @@ -85,7 +85,7 @@ protected function setUp(): void $this->action(function (TiptapEditor $component, $data) { $component->getLivewire()->dispatch( - 'insert-content', + event: 'insertFromAction', type: 'grid', statePath: $component->getStatePath(), data: $data, diff --git a/src/Actions/LinkAction.php b/src/Actions/LinkAction.php index 418b80d..74d954c 100644 --- a/src/Actions/LinkAction.php +++ b/src/Actions/LinkAction.php @@ -80,7 +80,7 @@ protected function setUp(): void ]), ])->action(function (TiptapEditor $component, $data) { $component->getLivewire()->dispatch( - 'insert-content', + event: 'insertFromAction', type: 'link', statePath: $component->getStatePath(), href: $data['href'], diff --git a/src/Actions/MediaAction.php b/src/Actions/MediaAction.php index 05d3f1c..bb8042b 100644 --- a/src/Actions/MediaAction.php +++ b/src/Actions/MediaAction.php @@ -134,7 +134,7 @@ protected function setUp(): void } $component->getLivewire()->dispatch( - 'insert-content', + event: 'insertFromAction', type: 'media', statePath: $component->getStatePath(), media: [ diff --git a/src/Actions/OEmbedAction.php b/src/Actions/OEmbedAction.php index 23bb9d7..61ff0b0 100644 --- a/src/Actions/OEmbedAction.php +++ b/src/Actions/OEmbedAction.php @@ -117,7 +117,7 @@ protected function setUp(): void ]) ->action(function (TiptapEditor $component, $data) { $component->getLivewire()->dispatch( - 'insert-content', + event: 'insertFromAction', type: 'video', statePath: $component->getStatePath(), video: $data, diff --git a/src/Actions/SourceAction.php b/src/Actions/SourceAction.php index e0200bd..abf0161 100644 --- a/src/Actions/SourceAction.php +++ b/src/Actions/SourceAction.php @@ -38,7 +38,7 @@ protected function setUp(): void } $component->getLivewire()->dispatch( - 'insert-content', + event: 'insertFromAction', type: 'source', statePath: $component->getStatePath(), source: $content, diff --git a/src/TiptapEditor.php b/src/TiptapEditor.php index 6ad2961..0ceb384 100644 --- a/src/TiptapEditor.php +++ b/src/TiptapEditor.php @@ -285,7 +285,7 @@ public function getInsertBlockAction(): Action $block = $component->getBlock($arguments['type']); $livewire->dispatch( - event: 'insert-block', + event: 'insertBlockFromAction', statePath: $component->getStatePath(), type: $arguments['type'], data: Js::from($data)->toHtml(), @@ -318,7 +318,7 @@ public function getUpdateBlockAction(): Action $block = $component->getBlock($arguments['type']); $livewire->dispatch( - event: 'update-block', + event: 'updateBlockFromAction', statePath: $component->getStatePath(), type: $arguments['type'], data: Js::from($data)->toHtml(),